From 41e489b3ccc9b19316db12283cbcd4fb3a3e9ace Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm@redhat.com>
Date: Mon, 17 Feb 2020 18:12:24 -0500
Subject: [PATCH 11/31] FIXME: more WIP on reproducer for PR analyzer/93773

---
 gawk-5.0.1/ABOUT-NLS                          |  1379 +
 gawk-5.0.1/AUTHORS                            |    13 +
 gawk-5.0.1/COPYING                            |   674 +
 gawk-5.0.1/ChangeLog                          |    97 +
 gawk-5.0.1/ChangeLog.0                        |  9885 ++++
 gawk-5.0.1/ChangeLog.1                        |  8919 +++
 gawk-5.0.1/INSTALL                            |   370 +
 gawk-5.0.1/Makefile.am                        |   222 +
 gawk-5.0.1/Makefile.in                        |  1303 +
 gawk-5.0.1/NEWS                               |    72 +
 gawk-5.0.1/NEWS.0                             |  2542 +
 gawk-5.0.1/NEWS.1                             |   480 +
 gawk-5.0.1/POSIX.STD                          |    64 +
 gawk-5.0.1/README                             |   105 +
 gawk-5.0.1/README_d/ChangeLog                 |     9 +
 gawk-5.0.1/README_d/ChangeLog.0               |     8 +
 gawk-5.0.1/README_d/ChangeLog.1               |   187 +
 gawk-5.0.1/README_d/README.VMS                |   226 +
 gawk-5.0.1/README_d/README.aix                |     9 +
 gawk-5.0.1/README_d/README.alpine             |    20 +
 gawk-5.0.1/README_d/README.bootstrap          |    32 +
 gawk-5.0.1/README_d/README.cmake              |   100 +
 gawk-5.0.1/README_d/README.freebsd            |    17 +
 gawk-5.0.1/README_d/README.gcc-3              |    11 +
 gawk-5.0.1/README_d/README.hacking            |     9 +
 gawk-5.0.1/README_d/README.macosx             |    44 +
 gawk-5.0.1/README_d/README.mpfr               |    55 +
 gawk-5.0.1/README_d/README.multibyte          |    29 +
 gawk-5.0.1/README_d/README.os2                |    57 +
 gawk-5.0.1/README_d/README.pc                 |   141 +
 gawk-5.0.1/README_d/README.rpm                |    16 +
 gawk-5.0.1/README_d/README.solaris            |    14 +
 gawk-5.0.1/README_d/README.tests              |    45 +
 gawk-5.0.1/README_d/README.zLinux             |    16 +
 gawk-5.0.1/README_d/README.zos                |    45 +
 gawk-5.0.1/TODO                               |   152 +
 gawk-5.0.1/aclocal.m4                         |  1154 +
 gawk-5.0.1/array.c                            |  1370 +
 gawk-5.0.1/awk.h                              |  2077 +
 gawk-5.0.1/awkgram.c                          |  9365 +++
 gawk-5.0.1/awkgram.y                          |  6868 +++
 gawk-5.0.1/awklib/ChangeLog                   |    13 +
 gawk-5.0.1/awklib/ChangeLog.0                 |   180 +
 gawk-5.0.1/awklib/ChangeLog.1                 |   103 +
 gawk-5.0.1/awklib/Makefile.am                 |    94 +
 gawk-5.0.1/awklib/Makefile.in                 |   721 +
 gawk-5.0.1/awklib/eg/data/class_data1         |     3 +
 gawk-5.0.1/awklib/eg/data/class_data2         |     3 +
 gawk-5.0.1/awklib/eg/data/guide-mellow.po     |     8 +
 gawk-5.0.1/awklib/eg/data/guide.po            |     8 +
 gawk-5.0.1/awklib/eg/data/inventory-shipped   |    17 +
 gawk-5.0.1/awklib/eg/data/mail-list           |    11 +
 gawk-5.0.1/awklib/eg/lib/assert.awk           |    20 +
 gawk-5.0.1/awklib/eg/lib/bits2str.awk         |    16 +
 gawk-5.0.1/awklib/eg/lib/cliff_rand.awk       |    14 +
 gawk-5.0.1/awklib/eg/lib/ctime.awk            |    12 +
 gawk-5.0.1/awklib/eg/lib/ftrans.awk           |    15 +
 gawk-5.0.1/awklib/eg/lib/getopt.awk           |    79 +
 gawk-5.0.1/awklib/eg/lib/gettime.awk          |    62 +
 gawk-5.0.1/awklib/eg/lib/grcat.c              |    49 +
 gawk-5.0.1/awklib/eg/lib/groupawk.in          |    83 +
 gawk-5.0.1/awklib/eg/lib/have_mpfr.awk        |     9 +
 gawk-5.0.1/awklib/eg/lib/inplace.awk          |    61 +
 gawk-5.0.1/awklib/eg/lib/intdiv0.awk          |    23 +
 gawk-5.0.1/awklib/eg/lib/join.awk             |    16 +
 gawk-5.0.1/awklib/eg/lib/libintl.awk          |    14 +
 gawk-5.0.1/awklib/eg/lib/noassign.awk         |    17 +
 gawk-5.0.1/awklib/eg/lib/ns_passwd.awk        |    72 +
 gawk-5.0.1/awklib/eg/lib/ord.awk              |    44 +
 gawk-5.0.1/awklib/eg/lib/passwdawk.in         |    63 +
 gawk-5.0.1/awklib/eg/lib/processarray.awk     |    12 +
 gawk-5.0.1/awklib/eg/lib/pwcat.c              |    41 +
 gawk-5.0.1/awklib/eg/lib/quicksort.awk        |    35 +
 gawk-5.0.1/awklib/eg/lib/readable.awk         |    17 +
 gawk-5.0.1/awklib/eg/lib/readfile.awk         |    15 +
 gawk-5.0.1/awklib/eg/lib/rewind.awk           |    20 +
 gawk-5.0.1/awklib/eg/lib/round.awk            |    29 +
 gawk-5.0.1/awklib/eg/lib/shellquote.awk       |    22 +
 gawk-5.0.1/awklib/eg/lib/strtonum.awk         |    58 +
 gawk-5.0.1/awklib/eg/lib/walkarray.awk        |     9 +
 gawk-5.0.1/awklib/eg/lib/zerofile.awk         |    19 +
 gawk-5.0.1/awklib/eg/misc/addresses.csv       |     1 +
 gawk-5.0.1/awklib/eg/misc/arraymax.awk        |    10 +
 gawk-5.0.1/awklib/eg/misc/arraymax.data       |     5 +
 gawk-5.0.1/awklib/eg/misc/findpat.awk         |     9 +
 gawk-5.0.1/awklib/eg/misc/findpat.data        |     7 +
 gawk-5.0.1/awklib/eg/misc/simple-csv.awk      |    10 +
 gawk-5.0.1/awklib/eg/network/PostAgent.sh     |     9 +
 gawk-5.0.1/awklib/eg/network/coreserv.awk     |   113 +
 gawk-5.0.1/awklib/eg/network/eliza.awk        |   270 +
 gawk-5.0.1/awklib/eg/network/fingerclient.awk |     7 +
 gawk-5.0.1/awklib/eg/network/geturl.awk       |    24 +
 gawk-5.0.1/awklib/eg/network/hello-serv.awk   |    14 +
 gawk-5.0.1/awklib/eg/network/maze.awk         |    73 +
 gawk-5.0.1/awklib/eg/network/mobag.awk        |    72 +
 gawk-5.0.1/awklib/eg/network/panic.awk        |    18 +
 gawk-5.0.1/awklib/eg/network/protbase.awk     |    11 +
 gawk-5.0.1/awklib/eg/network/protbase.request |     7 +
 gawk-5.0.1/awklib/eg/network/protbase.result  |     9 +
 gawk-5.0.1/awklib/eg/network/remconf.awk      |    54 +
 gawk-5.0.1/awklib/eg/network/statist.awk      |    85 +
 gawk-5.0.1/awklib/eg/network/stoxdata.txt     |     4 +
 gawk-5.0.1/awklib/eg/network/stoxpred.awk     |   145 +
 gawk-5.0.1/awklib/eg/network/testserv.awk     |    12 +
 gawk-5.0.1/awklib/eg/network/urlchk.awk       |    28 +
 gawk-5.0.1/awklib/eg/network/webgrab.awk      |     6 +
 gawk-5.0.1/awklib/eg/prog/alarm.awk           |    90 +
 gawk-5.0.1/awklib/eg/prog/anagram.awk         |    50 +
 gawk-5.0.1/awklib/eg/prog/awksed.awk          |    31 +
 gawk-5.0.1/awklib/eg/prog/cut.awk             |   137 +
 gawk-5.0.1/awklib/eg/prog/dupword.awk         |    21 +
 gawk-5.0.1/awklib/eg/prog/egrep.awk           |    99 +
 gawk-5.0.1/awklib/eg/prog/extract.awk         |    73 +
 gawk-5.0.1/awklib/eg/prog/guide.awk           |     7 +
 gawk-5.0.1/awklib/eg/prog/histsort.awk        |    15 +
 gawk-5.0.1/awklib/eg/prog/id.awk              |    61 +
 gawk-5.0.1/awklib/eg/prog/igawk.sh            |   138 +
 gawk-5.0.1/awklib/eg/prog/indirectcall.awk    |    90 +
 gawk-5.0.1/awklib/eg/prog/labels.awk          |    53 +
 gawk-5.0.1/awklib/eg/prog/pi.awk              |    18 +
 gawk-5.0.1/awklib/eg/prog/split.awk           |    56 +
 gawk-5.0.1/awklib/eg/prog/tee.awk             |    40 +
 gawk-5.0.1/awklib/eg/prog/testbits.awk        |    27 +
 gawk-5.0.1/awklib/eg/prog/translate.awk       |    51 +
 gawk-5.0.1/awklib/eg/prog/uniq.awk            |   118 +
 gawk-5.0.1/awklib/eg/prog/wc.awk              |    69 +
 gawk-5.0.1/awklib/eg/prog/wordfreq.awk        |    16 +
 gawk-5.0.1/awklib/extract.awk                 |    90 +
 gawk-5.0.1/awklib/stamp-eg                    |     2 +
 gawk-5.0.1/builtin.c                          |  4256 ++
 gawk-5.0.1/cint_array.c                       |  1315 +
 gawk-5.0.1/cmd.h                              |   215 +
 gawk-5.0.1/command.c                          |  3494 ++
 gawk-5.0.1/command.y                          |  1734 +
 gawk-5.0.1/compile                            |   348 +
 gawk-5.0.1/config.guess                       |  1645 +
 gawk-5.0.1/config.rpath                       |   684 +
 gawk-5.0.1/config.sub                         |  1798 +
 gawk-5.0.1/configh.in                         |   508 +
 gawk-5.0.1/configure                          | 12818 ++++
 gawk-5.0.1/configure.ac                       |   486 +
 gawk-5.0.1/custom.h                           |    82 +
 gawk-5.0.1/debug.c                            |  5922 ++
 gawk-5.0.1/depcomp                            |   791 +
 gawk-5.0.1/doc/ChangeLog                      |    84 +
 gawk-5.0.1/doc/ChangeLog.0                    |  1032 +
 gawk-5.0.1/doc/ChangeLog.1                    |  2906 +
 gawk-5.0.1/doc/Makefile.am                    |   128 +
 gawk-5.0.1/doc/Makefile.in                    |   950 +
 gawk-5.0.1/doc/README.card                    |    19 +
 gawk-5.0.1/doc/ad.block                       |    49 +
 gawk-5.0.1/doc/api-figure1.eps                |   536 +
 gawk-5.0.1/doc/api-figure1.fig                |    40 +
 gawk-5.0.1/doc/api-figure1.pdf                |   Bin 0 -> 10707 bytes
 gawk-5.0.1/doc/api-figure1.png                |   Bin 0 -> 9183 bytes
 gawk-5.0.1/doc/api-figure1.txt                |    24 +
 gawk-5.0.1/doc/api-figure2.eps                |   517 +
 gawk-5.0.1/doc/api-figure2.fig                |    26 +
 gawk-5.0.1/doc/api-figure2.pdf                |   Bin 0 -> 12031 bytes
 gawk-5.0.1/doc/api-figure2.png                |   Bin 0 -> 8983 bytes
 gawk-5.0.1/doc/api-figure2.txt                |    12 +
 gawk-5.0.1/doc/api-figure3.eps                |   526 +
 gawk-5.0.1/doc/api-figure3.fig                |    29 +
 gawk-5.0.1/doc/api-figure3.pdf                |   Bin 0 -> 12345 bytes
 gawk-5.0.1/doc/api-figure3.png                |   Bin 0 -> 8860 bytes
 gawk-5.0.1/doc/api-figure3.txt                |    13 +
 gawk-5.0.1/doc/array-elements.eps             |   158 +
 gawk-5.0.1/doc/array-elements.fig             |    27 +
 gawk-5.0.1/doc/array-elements.pdf             |   Bin 0 -> 6796 bytes
 gawk-5.0.1/doc/array-elements.png             |   Bin 0 -> 6091 bytes
 gawk-5.0.1/doc/array-elements.txt             |     4 +
 gawk-5.0.1/doc/awkcard.in                     |  2053 +
 gawk-5.0.1/doc/awkforai.txt                   |    18 +
 gawk-5.0.1/doc/bc_notes                       |   323 +
 gawk-5.0.1/doc/cardfonts                      |    37 +
 gawk-5.0.1/doc/colors                         |    39 +
 gawk-5.0.1/doc/gawk.1                         |  4299 ++
 gawk-5.0.1/doc/gawk.texi                      | 45233 +++++++++++++++
 gawk-5.0.1/doc/gawkinet.texi                  |  4933 ++
 gawk-5.0.1/doc/gawktexi.in                    | 44206 ++++++++++++++
 gawk-5.0.1/doc/gawkworkflow.texi              |  2158 +
 gawk-5.0.1/doc/general-program.eps            |   153 +
 gawk-5.0.1/doc/general-program.fig            |    25 +
 gawk-5.0.1/doc/general-program.pdf            |   Bin 0 -> 5613 bytes
 gawk-5.0.1/doc/general-program.png            |   Bin 0 -> 6078 bytes
 gawk-5.0.1/doc/general-program.txt            |     4 +
 gawk-5.0.1/doc/it/ChangeLog                   |   145 +
 gawk-5.0.1/doc/it/api-figura1.eps             |   536 +
 gawk-5.0.1/doc/it/api-figura1.fig             |    40 +
 gawk-5.0.1/doc/it/api-figura1.pdf             |   Bin 0 -> 9120 bytes
 gawk-5.0.1/doc/it/api-figura1.png             |   Bin 0 -> 5747 bytes
 gawk-5.0.1/doc/it/api-figura1.txt             |    24 +
 gawk-5.0.1/doc/it/api-figura2.eps             |   517 +
 gawk-5.0.1/doc/it/api-figura2.fig             |    26 +
 gawk-5.0.1/doc/it/api-figura2.pdf             |   Bin 0 -> 11596 bytes
 gawk-5.0.1/doc/it/api-figura2.png             |   Bin 0 -> 5768 bytes
 gawk-5.0.1/doc/it/api-figura2.txt             |    12 +
 gawk-5.0.1/doc/it/api-figura3.eps             |   526 +
 gawk-5.0.1/doc/it/api-figura3.fig             |    29 +
 gawk-5.0.1/doc/it/api-figura3.pdf             |   Bin 0 -> 11914 bytes
 gawk-5.0.1/doc/it/api-figura3.png             |   Bin 0 -> 5734 bytes
 gawk-5.0.1/doc/it/api-figura3.txt             |    13 +
 gawk-5.0.1/doc/it/compila_originale.sh        |    16 +
 gawk-5.0.1/doc/it/compila_smallprint.sh       |    19 +
 gawk-5.0.1/doc/it/epsf.tex                    |   653 +
 gawk-5.0.1/doc/it/flusso-elaborazione.eps     |   420 +
 gawk-5.0.1/doc/it/flusso-elaborazione.fig     |    37 +
 gawk-5.0.1/doc/it/flusso-elaborazione.pdf     |   Bin 0 -> 9672 bytes
 gawk-5.0.1/doc/it/flusso-elaborazione.png     |   Bin 0 -> 6300 bytes
 gawk-5.0.1/doc/it/flusso-elaborazione.txt     |    11 +
 gawk-5.0.1/doc/it/gawk.1                      |  4271 ++
 gawk-5.0.1/doc/it/gawktexi.in                 | 48105 ++++++++++++++++
 gawk-5.0.1/doc/it/lflashlight-small.xpic      |    20 +
 gawk-5.0.1/doc/it/lflashlight.eps             |   135 +
 gawk-5.0.1/doc/it/lflashlight.pdf             |    56 +
 gawk-5.0.1/doc/it/margini.texi                |     7 +
 gawk-5.0.1/doc/it/programma-generico.eps      |   228 +
 gawk-5.0.1/doc/it/programma-generico.fig      |    25 +
 gawk-5.0.1/doc/it/programma-generico.pdf      |   Bin 0 -> 5313 bytes
 gawk-5.0.1/doc/it/programma-generico.png      |   Bin 0 -> 4151 bytes
 gawk-5.0.1/doc/it/programma-generico.txt      |     4 +
 gawk-5.0.1/doc/it/rflashlight-small.xpic      |    26 +
 gawk-5.0.1/doc/it/rflashlight.eps             |   141 +
 gawk-5.0.1/doc/it/rflashlight.pdf             |    57 +
 gawk-5.0.1/doc/it/sidebar.awk                 |    67 +
 gawk-5.0.1/doc/it/texinfo.tex                 | 11760 ++++
 gawk-5.0.1/doc/it/txi-it.tex                  |    84 +
 gawk-5.0.1/doc/it/vettore-elementi.eps        |   159 +
 gawk-5.0.1/doc/it/vettore-elementi.fig        |    27 +
 gawk-5.0.1/doc/it/vettore-elementi.pdf        |   Bin 0 -> 7009 bytes
 gawk-5.0.1/doc/it/vettore-elementi.png        |   Bin 0 -> 1032 bytes
 gawk-5.0.1/doc/it/vettore-elementi.txt        |     4 +
 gawk-5.0.1/doc/lflashlight-small.xpic         |    20 +
 gawk-5.0.1/doc/lflashlight.eps                |   135 +
 gawk-5.0.1/doc/lflashlight.pdf                |    56 +
 gawk-5.0.1/doc/macros                         |   211 +
 gawk-5.0.1/doc/no.colors                      |    31 +
 gawk-5.0.1/doc/process-flow.eps               |   191 +
 gawk-5.0.1/doc/process-flow.fig               |    37 +
 gawk-5.0.1/doc/process-flow.pdf               |   Bin 0 -> 6583 bytes
 gawk-5.0.1/doc/process-flow.png               |   Bin 0 -> 7856 bytes
 gawk-5.0.1/doc/process-flow.txt               |    11 +
 gawk-5.0.1/doc/rflashlight-small.xpic         |    26 +
 gawk-5.0.1/doc/rflashlight.eps                |   141 +
 gawk-5.0.1/doc/rflashlight.pdf                |    57 +
 gawk-5.0.1/doc/setter.outline                 |    77 +
 gawk-5.0.1/doc/sidebar.awk                    |    67 +
 gawk-5.0.1/doc/statist.eps                    |   557 +
 gawk-5.0.1/doc/statist.jpg                    |   Bin 0 -> 20400 bytes
 gawk-5.0.1/doc/statist.pdf                    |   Bin 0 -> 5313 bytes
 gawk-5.0.1/doc/texinfo.tex                    | 11689 ++++
 gawk-5.0.1/doc/wordlist                       |  2004 +
 gawk-5.0.1/doc/wordlist2                      |   186 +
 gawk-5.0.1/doc/wordlist3                      |   247 +
 gawk-5.0.1/eval.c                             |  1786 +
 gawk-5.0.1/ext.c                              |   268 +
 gawk-5.0.1/extension/ABOUT-NLS                |  1379 +
 gawk-5.0.1/extension/AUTHORS                  |    13 +
 gawk-5.0.1/extension/COPYING                  |   674 +
 gawk-5.0.1/extension/ChangeLog                |    13 +
 gawk-5.0.1/extension/ChangeLog.0              |    91 +
 gawk-5.0.1/extension/ChangeLog.1              |  1696 +
 gawk-5.0.1/extension/INSTALL                  |   370 +
 gawk-5.0.1/extension/Makefile.am              |   157 +
 gawk-5.0.1/extension/Makefile.in              |  1385 +
 gawk-5.0.1/extension/NEWS                     |     7 +
 gawk-5.0.1/extension/README                   |    10 +
 gawk-5.0.1/extension/README.fts               |    68 +
 gawk-5.0.1/extension/aclocal.m4               |  1214 +
 gawk-5.0.1/extension/build-aux/ChangeLog      |   218 +
 gawk-5.0.1/extension/build-aux/ar-lib         |   270 +
 gawk-5.0.1/extension/build-aux/compile        |   348 +
 gawk-5.0.1/extension/build-aux/config.guess   |  1645 +
 gawk-5.0.1/extension/build-aux/config.rpath   |   684 +
 gawk-5.0.1/extension/build-aux/config.sub     |  1798 +
 gawk-5.0.1/extension/build-aux/depcomp        |   791 +
 gawk-5.0.1/extension/build-aux/install-sh     |   518 +
 gawk-5.0.1/extension/build-aux/ltmain.sh      | 11156 ++++
 gawk-5.0.1/extension/build-aux/missing        |   215 +
 gawk-5.0.1/extension/configh.in               |   232 +
 gawk-5.0.1/extension/configure                | 17822 ++++++
 gawk-5.0.1/extension/configure.ac             |   130 +
 gawk-5.0.1/extension/ext_custom.h             |    37 +
 gawk-5.0.1/extension/filefuncs.3am            |   378 +
 gawk-5.0.1/extension/filefuncs.c              |   935 +
 gawk-5.0.1/extension/fnmatch.3am              |   126 +
 gawk-5.0.1/extension/fnmatch.c                |   209 +
 gawk-5.0.1/extension/fork.3am                 |    99 +
 gawk-5.0.1/extension/fork.c                   |   152 +
 gawk-5.0.1/extension/fts.3                    |   773 +
 gawk-5.0.1/extension/gawkdirfd.h              |    57 +
 gawk-5.0.1/extension/gawkfts.c                |  1262 +
 gawk-5.0.1/extension/gawkfts.h                |   153 +
 gawk-5.0.1/extension/inplace.3am              |    91 +
 gawk-5.0.1/extension/inplace.c                |   279 +
 gawk-5.0.1/extension/intdiv.c                 |   243 +
 gawk-5.0.1/extension/m4/ChangeLog             |    77 +
 gawk-5.0.1/extension/m4/codeset.m4            |    23 +
 gawk-5.0.1/extension/m4/dirfd.m4              |    84 +
 gawk-5.0.1/extension/m4/extern-inline.m4      |   101 +
 gawk-5.0.1/extension/m4/fcntl-o.m4            |   134 +
 gawk-5.0.1/extension/m4/gettext.m4            |   405 +
 gawk-5.0.1/extension/m4/glibc2.m4             |    31 +
 gawk-5.0.1/extension/m4/glibc21.m4            |    34 +
 gawk-5.0.1/extension/m4/iconv.m4              |   271 +
 gawk-5.0.1/extension/m4/intdiv0.m4            |    87 +
 gawk-5.0.1/extension/m4/intl.m4               |   304 +
 gawk-5.0.1/extension/m4/intldir.m4            |    19 +
 gawk-5.0.1/extension/m4/intlmacosx.m4         |    56 +
 gawk-5.0.1/extension/m4/intmax.m4             |    36 +
 gawk-5.0.1/extension/m4/inttypes-pri.m4       |    42 +
 gawk-5.0.1/extension/m4/inttypes_h.m4         |    29 +
 gawk-5.0.1/extension/m4/lcmessage.m4          |    35 +
 gawk-5.0.1/extension/m4/lib-ld.m4             |   119 +
 gawk-5.0.1/extension/m4/lib-link.m4           |   777 +
 gawk-5.0.1/extension/m4/lib-prefix.m4         |   224 +
 gawk-5.0.1/extension/m4/libtool.m4            |  8388 +++
 gawk-5.0.1/extension/m4/lock.m4               |    42 +
 gawk-5.0.1/extension/m4/longlong.m4           |   113 +
 gawk-5.0.1/extension/m4/ltoptions.m4          |   437 +
 gawk-5.0.1/extension/m4/ltsugar.m4            |   124 +
 gawk-5.0.1/extension/m4/ltversion.m4          |    23 +
 gawk-5.0.1/extension/m4/lt~obsolete.m4        |    99 +
 gawk-5.0.1/extension/m4/nls.m4                |    32 +
 gawk-5.0.1/extension/m4/po.m4                 |   453 +
 gawk-5.0.1/extension/m4/printf-posix.m4       |    48 +
 gawk-5.0.1/extension/m4/progtest.m4           |    91 +
 gawk-5.0.1/extension/m4/size_max.m4           |    79 +
 gawk-5.0.1/extension/m4/stdint_h.m4           |    27 +
 gawk-5.0.1/extension/m4/threadlib.m4          |   389 +
 gawk-5.0.1/extension/m4/uintmax_t.m4          |    30 +
 gawk-5.0.1/extension/m4/visibility.m4         |    77 +
 gawk-5.0.1/extension/m4/wchar_t.m4            |    24 +
 gawk-5.0.1/extension/m4/wint_t.m4             |    32 +
 gawk-5.0.1/extension/m4/xsize.m4              |    12 +
 gawk-5.0.1/extension/ordchr.3am               |    79 +
 gawk-5.0.1/extension/ordchr.c                 |   112 +
 gawk-5.0.1/extension/po/ChangeLog             |    29 +
 gawk-5.0.1/extension/po/Makefile.in.in        |   483 +
 gawk-5.0.1/extension/po/Makevars              |    78 +
 gawk-5.0.1/extension/po/POTFILES.in           |     1 +
 gawk-5.0.1/extension/po/Rules-quot            |    58 +
 gawk-5.0.1/extension/po/boldquot.sed          |    10 +
 gawk-5.0.1/extension/po/en@boldquot.header    |    25 +
 gawk-5.0.1/extension/po/en@quot.header        |    22 +
 gawk-5.0.1/extension/po/gawk-extensions.pot   |     1 +
 gawk-5.0.1/extension/po/insert-header.sin     |    23 +
 gawk-5.0.1/extension/po/quot.sed              |     6 +
 gawk-5.0.1/extension/po/remove-potcdate.sin   |    19 +
 gawk-5.0.1/extension/po/stamp-po              |     1 +
 gawk-5.0.1/extension/readdir.3am              |    96 +
 gawk-5.0.1/extension/readdir.c                |   326 +
 gawk-5.0.1/extension/readdir_test.c           |   343 +
 gawk-5.0.1/extension/readfile.3am             |    88 +
 gawk-5.0.1/extension/readfile.c               |   244 +
 gawk-5.0.1/extension/revoutput.3am            |    77 +
 gawk-5.0.1/extension/revoutput.c              |   142 +
 gawk-5.0.1/extension/revtwoway.3am            |    65 +
 gawk-5.0.1/extension/revtwoway.c              |   345 +
 gawk-5.0.1/extension/rwarray.3am              |   104 +
 gawk-5.0.1/extension/rwarray.c                |   514 +
 gawk-5.0.1/extension/rwarray0.c               |   470 +
 gawk-5.0.1/extension/stack.c                  |    90 +
 gawk-5.0.1/extension/stack.h                  |    31 +
 gawk-5.0.1/extension/testext.c                |  1126 +
 gawk-5.0.1/extension/time.3am                 |    90 +
 gawk-5.0.1/extension/time.c                   |   215 +
 gawk-5.0.1/extras/ChangeLog                   |    23 +
 gawk-5.0.1/extras/Makefile.am                 |    29 +
 gawk-5.0.1/extras/Makefile.in                 |   533 +
 gawk-5.0.1/extras/gawk.csh                    |    11 +
 gawk-5.0.1/extras/gawk.sh                     |    31 +
 gawk-5.0.1/field.c                            |  1674 +
 gawk-5.0.1/floatcomp.c                        |   114 +
 gawk-5.0.1/floatmagic.h                       |    54 +
 gawk-5.0.1/gawkapi.c                          |  1621 +
 gawk-5.0.1/gawkapi.h                          |  1183 +
 gawk-5.0.1/gawkmisc.c                         |    43 +
 gawk-5.0.1/gettext.h                          |   301 +
 gawk-5.0.1/install-sh                         |   518 +
 gawk-5.0.1/int_array.c                        |   869 +
 gawk-5.0.1/interpret.h                        |  1493 +
 gawk-5.0.1/io.c                               |  4457 ++
 gawk-5.0.1/m4/ChangeLog                       |     9 +
 gawk-5.0.1/m4/ChangeLog.0                     |   180 +
 gawk-5.0.1/m4/ChangeLog.1                     |   193 +
 gawk-5.0.1/m4/arch.m4                         |   122 +
 gawk-5.0.1/m4/codeset.m4                      |    23 +
 gawk-5.0.1/m4/extern-inline.m4                |   101 +
 gawk-5.0.1/m4/fcntl-o.m4                      |   134 +
 gawk-5.0.1/m4/gettext.m4                      |   420 +
 gawk-5.0.1/m4/glibc2.m4                       |    31 +
 gawk-5.0.1/m4/glibc21.m4                      |    34 +
 gawk-5.0.1/m4/iconv.m4                        |   271 +
 gawk-5.0.1/m4/intdiv0.m4                      |    87 +
 gawk-5.0.1/m4/intl.m4                         |   304 +
 gawk-5.0.1/m4/intldir.m4                      |    19 +
 gawk-5.0.1/m4/intlmacosx.m4                   |    56 +
 gawk-5.0.1/m4/intmax.m4                       |    36 +
 gawk-5.0.1/m4/intmax_t.m4                     |    40 +
 gawk-5.0.1/m4/inttypes-pri.m4                 |    42 +
 gawk-5.0.1/m4/inttypes.m4                     |    30 +
 gawk-5.0.1/m4/inttypes_h.m4                   |    29 +
 gawk-5.0.1/m4/lcmessage.m4                    |    35 +
 gawk-5.0.1/m4/lib-ld.m4                       |   119 +
 gawk-5.0.1/m4/lib-link.m4                     |   777 +
 gawk-5.0.1/m4/lib-prefix.m4                   |   224 +
 gawk-5.0.1/m4/libsigsegv.m4                   |    16 +
 gawk-5.0.1/m4/lock.m4                         |    42 +
 gawk-5.0.1/m4/longdouble.m4                   |    31 +
 gawk-5.0.1/m4/longlong.m4                     |   113 +
 gawk-5.0.1/m4/mpfr.m4                         |    62 +
 gawk-5.0.1/m4/nls.m4                          |    32 +
 gawk-5.0.1/m4/noreturn.m4                     |    38 +
 gawk-5.0.1/m4/po.m4                           |   453 +
 gawk-5.0.1/m4/printf-posix.m4                 |    48 +
 gawk-5.0.1/m4/progtest.m4                     |    91 +
 gawk-5.0.1/m4/readline.m4                     |   116 +
 gawk-5.0.1/m4/signed.m4                       |    17 +
 gawk-5.0.1/m4/size_max.m4                     |    79 +
 gawk-5.0.1/m4/socket.m4                       |    85 +
 gawk-5.0.1/m4/stdint_h.m4                     |    27 +
 gawk-5.0.1/m4/threadlib.m4                    |   389 +
 gawk-5.0.1/m4/uintmax_t.m4                    |    30 +
 gawk-5.0.1/m4/ulonglong.m4                    |    48 +
 gawk-5.0.1/m4/visibility.m4                   |    77 +
 gawk-5.0.1/m4/wchar_t.m4                      |    24 +
 gawk-5.0.1/m4/wint_t.m4                       |    32 +
 gawk-5.0.1/m4/xsize.m4                        |    12 +
 gawk-5.0.1/main.c                             |  1845 +
 gawk-5.0.1/mbsupport.h                        |    58 +
 gawk-5.0.1/missing                            |   215 +
 gawk-5.0.1/missing_d/COPYING.LIB              |   482 +
 gawk-5.0.1/missing_d/ChangeLog                |     9 +
 gawk-5.0.1/missing_d/ChangeLog.0              |   171 +
 gawk-5.0.1/missing_d/ChangeLog.1              |   134 +
 gawk-5.0.1/missing_d/README                   |    14 +
 gawk-5.0.1/missing_d/fnmatch.c                |   489 +
 gawk-5.0.1/missing_d/fnmatch.h                |    85 +
 gawk-5.0.1/missing_d/getaddrinfo.c            |   119 +
 gawk-5.0.1/missing_d/getaddrinfo.h            |    33 +
 gawk-5.0.1/missing_d/memcmp.c                 |    18 +
 gawk-5.0.1/missing_d/memcpy.c                 |    18 +
 gawk-5.0.1/missing_d/memmove.c                |   139 +
 gawk-5.0.1/missing_d/memset.c                 |    20 +
 gawk-5.0.1/missing_d/mktime-internal.h        |    53 +
 gawk-5.0.1/missing_d/mktime.c                 |   690 +
 gawk-5.0.1/missing_d/setenv.c                 |   190 +
 gawk-5.0.1/missing_d/snprintf.c               |   186 +
 gawk-5.0.1/missing_d/strchr.c                 |    47 +
 gawk-5.0.1/missing_d/strcoll.c                |     7 +
 gawk-5.0.1/missing_d/strerror.c               |    37 +
 gawk-5.0.1/missing_d/strftime.c               |  1475 +
 gawk-5.0.1/missing_d/strncasecmp.c            |    98 +
 gawk-5.0.1/missing_d/strtod.c                 |   134 +
 gawk-5.0.1/missing_d/strtoul.c                |   221 +
 gawk-5.0.1/missing_d/system.c                 |    27 +
 gawk-5.0.1/missing_d/timegm.c                 |    31 +
 gawk-5.0.1/missing_d/tzset.c                  |    39 +
 gawk-5.0.1/missing_d/usleep.c                 |    17 +
 gawk-5.0.1/missing_d/wcmisc.c                 |   100 +
 gawk-5.0.1/mkinstalldirs                      |   162 +
 gawk-5.0.1/mpfr.c                             |  1801 +
 gawk-5.0.1/msg.c                              |   198 +
 gawk-5.0.1/node.c                             |  1066 +
 gawk-5.0.1/nonposix.h                         |    99 +
 gawk-5.0.1/pc/ChangeLog                       |    14 +
 gawk-5.0.1/pc/ChangeLog.0                     |   680 +
 gawk-5.0.1/pc/ChangeLog.1                     |   946 +
 gawk-5.0.1/pc/GenMakefileTst.awk              |   158 +
 gawk-5.0.1/pc/Makefile                        |   439 +
 gawk-5.0.1/pc/Makefile.ext                    |    86 +
 gawk-5.0.1/pc/Makefile.tst                    |  3461 ++
 gawk-5.0.1/pc/Makefile.tst.prologue           |   138 +
 gawk-5.0.1/pc/awklib/igawk                    |    85 +
 gawk-5.0.1/pc/awklib/igawk.awk                |    51 +
 gawk-5.0.1/pc/awklib/igawk.bat                |     1 +
 gawk-5.0.1/pc/config.sed                      |   334 +
 gawk-5.0.1/pc/configpk.sed                    |     9 +
 gawk-5.0.1/pc/dlfcn.h                         |    12 +
 gawk-5.0.1/pc/gawk.def                        |     2 +
 gawk-5.0.1/pc/gawkmisc.pc                     |  1152 +
 gawk-5.0.1/pc/getid.c                         |    37 +
 gawk-5.0.1/pc/in.h                            |     1 +
 gawk-5.0.1/pc/install.awk                     |    62 +
 gawk-5.0.1/pc/langinfo.h                      |     9 +
 gawk-5.0.1/pc/make-config.bat                 |     6 +
 gawk-5.0.1/pc/mkinstal.sh                     |    33 +
 gawk-5.0.1/pc/popen.c                         |   305 +
 gawk-5.0.1/pc/popen.h                         |    20 +
 gawk-5.0.1/pc/socket.h                        |    45 +
 gawk-5.0.1/pc/testoutcmp.awk                  |    80 +
 gawk-5.0.1/po/ChangeLog                       |    14 +
 gawk-5.0.1/po/ChangeLog.0                     |   127 +
 gawk-5.0.1/po/ChangeLog.1                     |   171 +
 gawk-5.0.1/po/LINGUAS                         |    18 +
 gawk-5.0.1/po/Makefile.in.in                  |   483 +
 gawk-5.0.1/po/Makevars                        |    78 +
 gawk-5.0.1/po/POTFILES.in                     |    52 +
 gawk-5.0.1/po/README                          |    15 +
 gawk-5.0.1/po/Rules-quot                      |    58 +
 gawk-5.0.1/po/boldquot.sed                    |    10 +
 gawk-5.0.1/po/ca.po                           |  4165 ++
 gawk-5.0.1/po/da.po                           |  4078 ++
 gawk-5.0.1/po/de.po                           |  3978 ++
 gawk-5.0.1/po/en@boldquot.header              |    25 +
 gawk-5.0.1/po/en@quot.header                  |    22 +
 gawk-5.0.1/po/es.po                           |  4165 ++
 gawk-5.0.1/po/fi.po                           |  4279 ++
 gawk-5.0.1/po/fr.po                           |  3829 ++
 gawk-5.0.1/po/gawk.pot                        |  3572 ++
 gawk-5.0.1/po/id.po                           |  4045 ++
 gawk-5.0.1/po/insert-header.sin               |    23 +
 gawk-5.0.1/po/it.po                           |  3780 ++
 gawk-5.0.1/po/ja.po                           |  3982 ++
 gawk-5.0.1/po/ko.po                           |  3721 ++
 gawk-5.0.1/po/ms.po                           |  3582 ++
 gawk-5.0.1/po/nl.po                           |  4117 ++
 gawk-5.0.1/po/pl.po                           |  4161 ++
 gawk-5.0.1/po/pt.po                           |  3766 ++
 gawk-5.0.1/po/pt_BR.po                        |  4115 ++
 gawk-5.0.1/po/quot.sed                        |     6 +
 gawk-5.0.1/po/remove-potcdate.sin             |    19 +
 gawk-5.0.1/po/stamp-po                        |     1 +
 gawk-5.0.1/po/sv.po                           |  3741 ++
 gawk-5.0.1/po/vi.po                           |  4015 ++
 gawk-5.0.1/po/zh_CN.po                        |  3965 ++
 gawk-5.0.1/posix/ChangeLog                    |     9 +
 gawk-5.0.1/posix/ChangeLog.0                  |   174 +
 gawk-5.0.1/posix/ChangeLog.1                  |    95 +
 gawk-5.0.1/posix/gawkmisc.c                   |   311 +
 gawk-5.0.1/profile.c                          |  2101 +
 gawk-5.0.1/protos.h                           |   152 +
 gawk-5.0.1/re.c                               |   661 +
 gawk-5.0.1/replace.c                          |   120 +
 gawk-5.0.1/str_array.c                        |   835 +
 gawk-5.0.1/support/ChangeLog                  |    17 +
 gawk-5.0.1/support/Makefile.am                |    66 +
 gawk-5.0.1/support/Makefile.in                |   671 +
 gawk-5.0.1/support/cdefs.h                    |   514 +
 gawk-5.0.1/support/dfa.c                      |  4391 ++
 gawk-5.0.1/support/dfa.h                      |   122 +
 gawk-5.0.1/support/getopt.c                   |  1294 +
 gawk-5.0.1/support/getopt.h                   |   206 +
 gawk-5.0.1/support/getopt1.c                  |   195 +
 gawk-5.0.1/support/getopt_int.h               |   129 +
 gawk-5.0.1/support/intprops.h                 |   455 +
 gawk-5.0.1/support/libc-config.h              |   174 +
 gawk-5.0.1/support/localeinfo.c               |   117 +
 gawk-5.0.1/support/localeinfo.h               |    54 +
 gawk-5.0.1/support/random.c                   |   642 +
 gawk-5.0.1/support/random.h                   |    43 +
 gawk-5.0.1/support/regcomp.c                  |  3934 ++
 gawk-5.0.1/support/regex.c                    |    81 +
 gawk-5.0.1/support/regex.h                    |   658 +
 gawk-5.0.1/support/regex_internal.c           |  1746 +
 gawk-5.0.1/support/regex_internal.h           |   874 +
 gawk-5.0.1/support/regexec.c                  |  4336 ++
 gawk-5.0.1/support/verify.h                   |   285 +
 gawk-5.0.1/support/xalloc.h                   |   375 +
 gawk-5.0.1/symbol.c                           |   975 +
 gawk-5.0.1/test/ChangeLog                     |    40 +
 gawk-5.0.1/test/ChangeLog.0                   |  1785 +
 gawk-5.0.1/test/ChangeLog.1                   |  2423 +
 gawk-5.0.1/test/Gentests                      |   313 +
 gawk-5.0.1/test/Makefile.am                   |  2361 +
 gawk-5.0.1/test/Makefile.in                   |  5016 ++
 gawk-5.0.1/test/Maketests                     |  2208 +
 gawk-5.0.1/test/README                        |    24 +
 gawk-5.0.1/test/aadelete1.awk                 |    19 +
 gawk-5.0.1/test/aadelete1.ok                  |     6 +
 gawk-5.0.1/test/aadelete2.awk                 |    10 +
 gawk-5.0.1/test/aadelete2.ok                  |     2 +
 gawk-5.0.1/test/aarray1.awk                   |    28 +
 gawk-5.0.1/test/aarray1.ok                    |     6 +
 gawk-5.0.1/test/aasort.awk                    |    34 +
 gawk-5.0.1/test/aasort.ok                     |    26 +
 gawk-5.0.1/test/aasorti.awk                   |    35 +
 gawk-5.0.1/test/aasorti.ok                    |    20 +
 gawk-5.0.1/test/addcomma.awk                  |    15 +
 gawk-5.0.1/test/addcomma.in                   |     7 +
 gawk-5.0.1/test/addcomma.ok                   |     7 +
 gawk-5.0.1/test/anchgsub.awk                  |     1 +
 gawk-5.0.1/test/anchgsub.in                   |     1 +
 gawk-5.0.1/test/anchgsub.ok                   |     1 +
 gawk-5.0.1/test/anchor.awk                    |    33 +
 gawk-5.0.1/test/anchor.in                     |     3 +
 gawk-5.0.1/test/anchor.ok                     |     6 +
 gawk-5.0.1/test/apiterm.awk                   |     8 +
 gawk-5.0.1/test/apiterm.in                    |     1 +
 gawk-5.0.1/test/apiterm.ok                    |     3 +
 gawk-5.0.1/test/argarray.awk                  |    14 +
 gawk-5.0.1/test/argarray.in                   |     1 +
 gawk-5.0.1/test/argarray.ok                   |     9 +
 gawk-5.0.1/test/argtest.awk                   |     4 +
 gawk-5.0.1/test/argtest.ok                    |     4 +
 gawk-5.0.1/test/arrayind1.awk                 |   100 +
 gawk-5.0.1/test/arrayind1.in                  |     2 +
 gawk-5.0.1/test/arrayind1.ok                  |     4 +
 gawk-5.0.1/test/arrayind2.awk                 |     8 +
 gawk-5.0.1/test/arrayind2.ok                  |     2 +
 gawk-5.0.1/test/arrayind3.awk                 |    19 +
 gawk-5.0.1/test/arrayind3.ok                  |     2 +
 gawk-5.0.1/test/arrayparm.awk                 |    21 +
 gawk-5.0.1/test/arrayparm.ok                  |     2 +
 gawk-5.0.1/test/arrayprm2.awk                 |    67 +
 gawk-5.0.1/test/arrayprm2.ok                  |     0
 gawk-5.0.1/test/arrayprm3.awk                 |    56 +
 gawk-5.0.1/test/arrayprm3.ok                  |     1 +
 gawk-5.0.1/test/arrayref.awk                  |    13 +
 gawk-5.0.1/test/arrayref.ok                   |     2 +
 gawk-5.0.1/test/arraysort.awk                 |    90 +
 gawk-5.0.1/test/arraysort.ok                  |    83 +
 gawk-5.0.1/test/arraysort2.awk                |    34 +
 gawk-5.0.1/test/arraysort2.ok                 |    26 +
 gawk-5.0.1/test/arraytype.awk                 |    35 +
 gawk-5.0.1/test/arraytype.ok                  |    16 +
 gawk-5.0.1/test/arrdbg.awk                    |    17 +
 gawk-5.0.1/test/arrymem1.awk                  |    81 +
 gawk-5.0.1/test/arrymem1.ok                   |     2 +
 gawk-5.0.1/test/arryref2.awk                  |    18 +
 gawk-5.0.1/test/arryref2.ok                   |     3 +
 gawk-5.0.1/test/arryref3.awk                  |    18 +
 gawk-5.0.1/test/arryref3.ok                   |     2 +
 gawk-5.0.1/test/arryref4.awk                  |    17 +
 gawk-5.0.1/test/arryref4.ok                   |     2 +
 gawk-5.0.1/test/arryref5.awk                  |    17 +
 gawk-5.0.1/test/arryref5.ok                   |     2 +
 gawk-5.0.1/test/arynasty.awk                  |    16 +
 gawk-5.0.1/test/arynasty.ok                   |     1 +
 gawk-5.0.1/test/arynocls.awk                  |    95 +
 gawk-5.0.1/test/arynocls.in                   |    30 +
 gawk-5.0.1/test/arynocls.ok                   |     0
 gawk-5.0.1/test/aryprm1.awk                   |     9 +
 gawk-5.0.1/test/aryprm1.ok                    |     2 +
 gawk-5.0.1/test/aryprm2.awk                   |     8 +
 gawk-5.0.1/test/aryprm2.ok                    |     2 +
 gawk-5.0.1/test/aryprm3.awk                   |    10 +
 gawk-5.0.1/test/aryprm3.ok                    |     2 +
 gawk-5.0.1/test/aryprm4.awk                   |     7 +
 gawk-5.0.1/test/aryprm4.ok                    |     2 +
 gawk-5.0.1/test/aryprm5.awk                   |     6 +
 gawk-5.0.1/test/aryprm5.ok                    |     2 +
 gawk-5.0.1/test/aryprm6.awk                   |     7 +
 gawk-5.0.1/test/aryprm6.ok                    |     2 +
 gawk-5.0.1/test/aryprm7.awk                   |     6 +
 gawk-5.0.1/test/aryprm7.ok                    |     2 +
 gawk-5.0.1/test/aryprm8.awk                   |    22 +
 gawk-5.0.1/test/aryprm8.ok                    |     2 +
 gawk-5.0.1/test/aryprm9.awk                   |    16 +
 gawk-5.0.1/test/aryprm9.ok                    |     0
 gawk-5.0.1/test/arysubnm.awk                  |     1 +
 gawk-5.0.1/test/arysubnm.ok                   |     1 +
 gawk-5.0.1/test/aryunasgn.awk                 |    17 +
 gawk-5.0.1/test/aryunasgn.ok                  |     8 +
 gawk-5.0.1/test/asgext.awk                    |     1 +
 gawk-5.0.1/test/asgext.in                     |     3 +
 gawk-5.0.1/test/asgext.ok                     |     6 +
 gawk-5.0.1/test/asort.awk                     |    25 +
 gawk-5.0.1/test/asort.ok                      |    18 +
 gawk-5.0.1/test/asorti.awk                    |    27 +
 gawk-5.0.1/test/asorti.ok                     |    18 +
 gawk-5.0.1/test/assignnumfield.awk            |     1 +
 gawk-5.0.1/test/assignnumfield.in             |     5 +
 gawk-5.0.1/test/assignnumfield.ok             |     5 +
 gawk-5.0.1/test/assignnumfield2.awk           |     4 +
 gawk-5.0.1/test/assignnumfield2.ok            |     1 +
 gawk-5.0.1/test/awkpath.ok                    |     1 +
 gawk-5.0.1/test/back89.awk                    |     1 +
 gawk-5.0.1/test/back89.in                     |     2 +
 gawk-5.0.1/test/back89.ok                     |     2 +
 gawk-5.0.1/test/backbigs1.awk                 |     1 +
 gawk-5.0.1/test/backbigs1.in                  |     1 +
 gawk-5.0.1/test/backbigs1.ok                  |     0
 gawk-5.0.1/test/backgsub.awk                  |     4 +
 gawk-5.0.1/test/backgsub.in                   |     1 +
 gawk-5.0.1/test/backgsub.ok                   |     1 +
 gawk-5.0.1/test/backsmalls1.awk               |     1 +
 gawk-5.0.1/test/backsmalls1.in                |    36 +
 gawk-5.0.1/test/backsmalls1.ok                |    14 +
 gawk-5.0.1/test/backsmalls2.awk               |    10 +
 gawk-5.0.1/test/backsmalls2.ok                |     0
 gawk-5.0.1/test/backw.awk                     |     1 +
 gawk-5.0.1/test/backw.in                      |     3 +
 gawk-5.0.1/test/backw.ok                      |     3 +
 gawk-5.0.1/test/badargs.ok                    |    46 +
 gawk-5.0.1/test/badassign1.awk                |     1 +
 gawk-5.0.1/test/badassign1.ok                 |     3 +
 gawk-5.0.1/test/badbuild.awk                  |     6 +
 gawk-5.0.1/test/badbuild.in                   |     1 +
 gawk-5.0.1/test/badbuild.ok                   |     3 +
 gawk-5.0.1/test/beginfile1.awk                |    19 +
 gawk-5.0.1/test/beginfile1.ok                 |    14 +
 gawk-5.0.1/test/beginfile2.in                 |   242 +
 gawk-5.0.1/test/beginfile2.ok                 |    93 +
 gawk-5.0.1/test/beginfile2.sh                 |    82 +
 gawk-5.0.1/test/binmode1.ok                   |     1 +
 gawk-5.0.1/test/callparam.awk                 |     6 +
 gawk-5.0.1/test/callparam.ok                  |     2 +
 gawk-5.0.1/test/charasbytes.awk               |     1 +
 gawk-5.0.1/test/charasbytes.in                |     1 +
 gawk-5.0.1/test/charasbytes.ok                |     3 +
 gawk-5.0.1/test/checknegtime.awk              |    22 +
 gawk-5.0.1/test/childin.awk                   |     1 +
 gawk-5.0.1/test/childin.in                    |     1 +
 gawk-5.0.1/test/childin.ok                    |     1 +
 gawk-5.0.1/test/clobber.awk                   |    98 +
 gawk-5.0.1/test/clobber.ok                    |     1 +
 gawk-5.0.1/test/clos1way.awk                  |    21 +
 gawk-5.0.1/test/clos1way.ok                   |    26 +
 gawk-5.0.1/test/clos1way2.awk                 |     7 +
 gawk-5.0.1/test/clos1way2.in                  |     1 +
 gawk-5.0.1/test/clos1way2.ok                  |     4 +
 gawk-5.0.1/test/clos1way3.awk                 |     8 +
 gawk-5.0.1/test/clos1way3.ok                  |     3 +
 gawk-5.0.1/test/clos1way4.awk                 |     8 +
 gawk-5.0.1/test/clos1way4.ok                  |     3 +
 gawk-5.0.1/test/clos1way5.awk                 |    10 +
 gawk-5.0.1/test/clos1way5.ok                  |     3 +
 gawk-5.0.1/test/clos1way6.awk                 |     7 +
 gawk-5.0.1/test/clos1way6.ok                  |     3 +
 gawk-5.0.1/test/closebad.awk                  |     7 +
 gawk-5.0.1/test/closebad.ok                   |     3 +
 gawk-5.0.1/test/clsflnam.awk                  |    12 +
 gawk-5.0.1/test/clsflnam.in                   |     3 +
 gawk-5.0.1/test/clsflnam.ok                   |     1 +
 gawk-5.0.1/test/colonwarn.awk                 |     4 +
 gawk-5.0.1/test/colonwarn.in                  |     1 +
 gawk-5.0.1/test/colonwarn.ok                  |     3 +
 gawk-5.0.1/test/compare.awk                   |    13 +
 gawk-5.0.1/test/compare.in                    |     4 +
 gawk-5.0.1/test/compare.ok                    |     5 +
 gawk-5.0.1/test/compare2.awk                  |   165 +
 gawk-5.0.1/test/compare2.ok                   |     1 +
 gawk-5.0.1/test/concat1.awk                   |    78 +
 gawk-5.0.1/test/concat1.in                    |     4 +
 gawk-5.0.1/test/concat1.ok                    |     4 +
 gawk-5.0.1/test/concat2.awk                   |     8 +
 gawk-5.0.1/test/concat2.ok                    |    12 +
 gawk-5.0.1/test/concat3.awk                   |     1 +
 gawk-5.0.1/test/concat3.ok                    |     2 +
 gawk-5.0.1/test/concat4.awk                   |     9 +
 gawk-5.0.1/test/concat4.in                    |     2 +
 gawk-5.0.1/test/concat4.ok                    |     4 +
 gawk-5.0.1/test/concat5.awk                   |     7 +
 gawk-5.0.1/test/concat5.ok                    |     1 +
 gawk-5.0.1/test/convfmt.awk                   |    10 +
 gawk-5.0.1/test/convfmt.ok                    |     3 +
 gawk-5.0.1/test/crlf.awk                      |    11 +
 gawk-5.0.1/test/crlf.ok                       |     3 +
 gawk-5.0.1/test/datanonl.awk                  |     3 +
 gawk-5.0.1/test/datanonl.in                   |     1 +
 gawk-5.0.1/test/datanonl.ok                   |     1 +
 gawk-5.0.1/test/dbugeval.in                   |     2 +
 gawk-5.0.1/test/dbugeval.ok                   |     1 +
 gawk-5.0.1/test/dbugeval2.awk                 |     4 +
 gawk-5.0.1/test/dbugeval2.in                  |     3 +
 gawk-5.0.1/test/dbugeval2.ok                  |     7 +
 gawk-5.0.1/test/dbugeval3.awk                 |     4 +
 gawk-5.0.1/test/dbugeval3.in                  |     2 +
 gawk-5.0.1/test/dbugeval3.ok                  |     3 +
 gawk-5.0.1/test/dbugtypedre1.awk              |     1 +
 gawk-5.0.1/test/dbugtypedre1.in               |     4 +
 gawk-5.0.1/test/dbugtypedre1.ok               |    17 +
 gawk-5.0.1/test/dbugtypedre2.awk              |     1 +
 gawk-5.0.1/test/dbugtypedre2.in               |     4 +
 gawk-5.0.1/test/dbugtypedre2.ok               |    15 +
 gawk-5.0.1/test/defref.awk                    |     1 +
 gawk-5.0.1/test/defref.ok                     |     3 +
 gawk-5.0.1/test/delargv.awk                   |    12 +
 gawk-5.0.1/test/delargv.ok                    |     3 +
 gawk-5.0.1/test/delarpm2.awk                  |    95 +
 gawk-5.0.1/test/delarpm2.ok                   |     2 +
 gawk-5.0.1/test/delarprm.awk                  |    50 +
 gawk-5.0.1/test/delarprm.ok                   |     0
 gawk-5.0.1/test/delfunc.awk                   |     7 +
 gawk-5.0.1/test/delfunc.ok                    |     3 +
 gawk-5.0.1/test/delsub.awk                    |     2 +
 gawk-5.0.1/test/delsub.ok                     |     1 +
 gawk-5.0.1/test/devfd.in1                     |    20 +
 gawk-5.0.1/test/devfd.in2                     |    20 +
 gawk-5.0.1/test/devfd.in4                     |     1 +
 gawk-5.0.1/test/devfd.in5                     |     1 +
 gawk-5.0.1/test/devfd.ok                      |     2 +
 gawk-5.0.1/test/devfd1.awk                    |    11 +
 gawk-5.0.1/test/devfd1.ok                     |    40 +
 gawk-5.0.1/test/devfd2.ok                     |    40 +
 gawk-5.0.1/test/dfacheck1.awk                 |     1 +
 gawk-5.0.1/test/dfacheck1.in                  |     1 +
 gawk-5.0.1/test/dfacheck1.ok                  |     1 +
 gawk-5.0.1/test/dfamb1.awk                    |     4 +
 gawk-5.0.1/test/dfamb1.in                     |     1 +
 gawk-5.0.1/test/dfamb1.ok                     |     2 +
 gawk-5.0.1/test/dfastress.awk                 |     1 +
 gawk-5.0.1/test/dfastress.ok                  |     1 +
 gawk-5.0.1/test/double1.awk                   |     4 +
 gawk-5.0.1/test/double1.ok                    |     2 +
 gawk-5.0.1/test/double2.awk                   |    46 +
 gawk-5.0.1/test/double2.ok                    |     4 +
 gawk-5.0.1/test/dtdgport.awk                  |   325 +
 gawk-5.0.1/test/dumpvars.in                   |     3 +
 gawk-5.0.1/test/dumpvars.ok                   |    28 +
 gawk-5.0.1/test/dynlj.awk                     |     1 +
 gawk-5.0.1/test/dynlj.ok                      |     1 +
 gawk-5.0.1/test/eofsplit.awk                  |    68 +
 gawk-5.0.1/test/eofsplit.ok                   |     0
 gawk-5.0.1/test/eofsrc1.ok                    |     3 +
 gawk-5.0.1/test/eofsrc1a.awk                  |     2 +
 gawk-5.0.1/test/eofsrc1b.awk                  |     2 +
 gawk-5.0.1/test/errno.awk                     |    10 +
 gawk-5.0.1/test/errno.in                      |     3 +
 gawk-5.0.1/test/errno.ok                      |     3 +
 gawk-5.0.1/test/exit.ok                       |    25 +
 gawk-5.0.1/test/exit.sh                       |    57 +
 gawk-5.0.1/test/exit2.awk                     |     2 +
 gawk-5.0.1/test/exit2.ok                      |     0
 gawk-5.0.1/test/exitval1.awk                  |     3 +
 gawk-5.0.1/test/exitval1.ok                   |     1 +
 gawk-5.0.1/test/exitval2.awk                  |     3 +
 gawk-5.0.1/test/exitval2.ok                   |     1 +
 gawk-5.0.1/test/exitval2.w32                  |     3 +
 gawk-5.0.1/test/exitval3.awk                  |     2 +
 gawk-5.0.1/test/exitval3.ok                   |     1 +
 gawk-5.0.1/test/fcall_exit.awk                |    24 +
 gawk-5.0.1/test/fcall_exit.ok                 |     2 +
 gawk-5.0.1/test/fcall_exit2.awk               |    25 +
 gawk-5.0.1/test/fcall_exit2.in                |     1 +
 gawk-5.0.1/test/fcall_exit2.ok                |     2 +
 gawk-5.0.1/test/fflush.ok                     |    16 +
 gawk-5.0.1/test/fflush.sh                     |    16 +
 gawk-5.0.1/test/fieldwdth.awk                 |     2 +
 gawk-5.0.1/test/fieldwdth.in                  |     1 +
 gawk-5.0.1/test/fieldwdth.ok                  |     1 +
 gawk-5.0.1/test/filefuncs.awk                 |    25 +
 gawk-5.0.1/test/filefuncs.ok                  |     0
 gawk-5.0.1/test/fix-fmtspcl.awk               |    23 +
 gawk-5.0.1/test/fldchg.awk                    |     8 +
 gawk-5.0.1/test/fldchg.in                     |     1 +
 gawk-5.0.1/test/fldchg.ok                     |     3 +
 gawk-5.0.1/test/fldchgnf.awk                  |     1 +
 gawk-5.0.1/test/fldchgnf.in                   |     1 +
 gawk-5.0.1/test/fldchgnf.ok                   |     2 +
 gawk-5.0.1/test/fldterm.awk                   |    10 +
 gawk-5.0.1/test/fldterm.in                    |     1 +
 gawk-5.0.1/test/fldterm.ok                    |     2 +
 gawk-5.0.1/test/fmtspcl-mpfr.ok               |     0
 gawk-5.0.1/test/fmtspcl.awk                   |    48 +
 gawk-5.0.1/test/fmtspcl.tok                   |    42 +
 gawk-5.0.1/test/fmttest.awk                   |   164 +
 gawk-5.0.1/test/fmttest.ok                    |   120 +
 gawk-5.0.1/test/fnamedat.awk                  |     1 +
 gawk-5.0.1/test/fnamedat.in                   |     1 +
 gawk-5.0.1/test/fnamedat.ok                   |     3 +
 gawk-5.0.1/test/fnarray.awk                   |     7 +
 gawk-5.0.1/test/fnarray.ok                    |     3 +
 gawk-5.0.1/test/fnarray2.awk                  |     5 +
 gawk-5.0.1/test/fnarray2.in                   |     1 +
 gawk-5.0.1/test/fnarray2.ok                   |     3 +
 gawk-5.0.1/test/fnarydel-mpfr.ok              |    27 +
 gawk-5.0.1/test/fnarydel.awk                  |    60 +
 gawk-5.0.1/test/fnarydel.ok                   |    27 +
 gawk-5.0.1/test/fnaryscl.awk                  |    10 +
 gawk-5.0.1/test/fnaryscl.ok                   |     2 +
 gawk-5.0.1/test/fnasgnm.awk                   |    14 +
 gawk-5.0.1/test/fnasgnm.in                    |     1 +
 gawk-5.0.1/test/fnasgnm.ok                    |     3 +
 gawk-5.0.1/test/fnmatch.awk                   |    13 +
 gawk-5.0.1/test/fnmatch.ok                    |     8 +
 gawk-5.0.1/test/fnmisc.awk                    |    13 +
 gawk-5.0.1/test/fnmisc.ok                     |     3 +
 gawk-5.0.1/test/fnparydl-mpfr.ok              |    10 +
 gawk-5.0.1/test/fnparydl.awk                  |    31 +
 gawk-5.0.1/test/fnparydl.ok                   |    10 +
 gawk-5.0.1/test/forcenum.awk                  |    17 +
 gawk-5.0.1/test/forcenum.ok                   |     9 +
 gawk-5.0.1/test/fordel.awk                    |    65 +
 gawk-5.0.1/test/fordel.ok                     |     0
 gawk-5.0.1/test/fork.awk                      |    34 +
 gawk-5.0.1/test/fork.ok                       |     0
 gawk-5.0.1/test/fork2.awk                     |    36 +
 gawk-5.0.1/test/fork2.ok                      |     0
 gawk-5.0.1/test/forref.awk                    |    11 +
 gawk-5.0.1/test/forref.ok                     |     3 +
 gawk-5.0.1/test/forsimp.awk                   |     1 +
 gawk-5.0.1/test/forsimp.ok                    |     1 +
 gawk-5.0.1/test/fpat1.awk                     |    22 +
 gawk-5.0.1/test/fpat1.in                      |     2 +
 gawk-5.0.1/test/fpat1.ok                      |    25 +
 gawk-5.0.1/test/fpat2.awk                     |    11 +
 gawk-5.0.1/test/fpat2.ok                      |     3 +
 gawk-5.0.1/test/fpat3.awk                     |    10 +
 gawk-5.0.1/test/fpat3.in                      |     1 +
 gawk-5.0.1/test/fpat3.ok                      |     4 +
 gawk-5.0.1/test/fpat4.awk                     |   105 +
 gawk-5.0.1/test/fpat4.ok                      |    65 +
 gawk-5.0.1/test/fpat5.awk                     |     8 +
 gawk-5.0.1/test/fpat5.in                      |     1 +
 gawk-5.0.1/test/fpat5.ok                      |     1 +
 gawk-5.0.1/test/fpat6.awk                     |     8 +
 gawk-5.0.1/test/fpat6.in                      |    13 +
 gawk-5.0.1/test/fpat6.ok                      |    44 +
 gawk-5.0.1/test/fpatnull.awk                  |     2 +
 gawk-5.0.1/test/fpatnull.in                   |     1 +
 gawk-5.0.1/test/fpatnull.ok                   |     1 +
 .../test/fr/LC_MESSAGES/nlstringtest.mo       |   Bin 0 -> 304 bytes
 gawk-5.0.1/test/fsbs.awk                      |     2 +
 gawk-5.0.1/test/fsbs.in                       |     1 +
 gawk-5.0.1/test/fsbs.ok                       |     1 +
 gawk-5.0.1/test/fscaret.awk                   |     8 +
 gawk-5.0.1/test/fscaret.in                    |     1 +
 gawk-5.0.1/test/fscaret.ok                    |     1 +
 gawk-5.0.1/test/fsfwfs.awk                    |     1 +
 gawk-5.0.1/test/fsfwfs.in                     |    16 +
 gawk-5.0.1/test/fsfwfs.ok                     |    16 +
 gawk-5.0.1/test/fsnul1.awk                    |     2 +
 gawk-5.0.1/test/fsnul1.in                     |   Bin 0 -> 6 bytes
 gawk-5.0.1/test/fsnul1.ok                     |     1 +
 gawk-5.0.1/test/fsrs.awk                      |     8 +
 gawk-5.0.1/test/fsrs.in                       |     7 +
 gawk-5.0.1/test/fsrs.ok                       |     5 +
 gawk-5.0.1/test/fsspcoln.awk                  |    41 +
 gawk-5.0.1/test/fsspcoln.in                   |     1 +
 gawk-5.0.1/test/fsspcoln.ok                   |     1 +
 gawk-5.0.1/test/fstabplus.awk                 |     2 +
 gawk-5.0.1/test/fstabplus.in                  |     1 +
 gawk-5.0.1/test/fstabplus.ok                  |     1 +
 gawk-5.0.1/test/fts.awk                       |   156 +
 gawk-5.0.1/test/functab1.awk                  |     3 +
 gawk-5.0.1/test/functab1.ok                   |     2 +
 gawk-5.0.1/test/functab2.awk                  |     8 +
 gawk-5.0.1/test/functab2.ok                   |     2 +
 gawk-5.0.1/test/functab3.awk                  |    10 +
 gawk-5.0.1/test/functab3.ok                   |     2 +
 gawk-5.0.1/test/functab4.awk                  |    30 +
 gawk-5.0.1/test/functab4.ok                   |     4 +
 gawk-5.0.1/test/funlen.awk                    |    69 +
 gawk-5.0.1/test/funlen.in                     |     8 +
 gawk-5.0.1/test/funlen.ok                     |     2 +
 gawk-5.0.1/test/funsemnl.awk                  |     3 +
 gawk-5.0.1/test/funsemnl.ok                   |     1 +
 gawk-5.0.1/test/funsmnam.awk                  |     6 +
 gawk-5.0.1/test/funsmnam.ok                   |     2 +
 gawk-5.0.1/test/funstack.awk                  |   981 +
 gawk-5.0.1/test/funstack.in                   |   206 +
 gawk-5.0.1/test/funstack.ok                   |    10 +
 gawk-5.0.1/test/fwtest.awk                    |     2 +
 gawk-5.0.1/test/fwtest.in                     |     1 +
 gawk-5.0.1/test/fwtest.ok                     |     1 +
 gawk-5.0.1/test/fwtest2.awk                   |    59 +
 gawk-5.0.1/test/fwtest2.in                    |    12 +
 gawk-5.0.1/test/fwtest2.ok                    |    12 +
 gawk-5.0.1/test/fwtest3.awk                   |     6 +
 gawk-5.0.1/test/fwtest3.in                    |    12 +
 gawk-5.0.1/test/fwtest3.ok                    |    12 +
 gawk-5.0.1/test/fwtest4.awk                   |     1 +
 gawk-5.0.1/test/fwtest4.in                    |     1 +
 gawk-5.0.1/test/fwtest4.ok                    |     1 +
 gawk-5.0.1/test/fwtest5.awk                   |     2 +
 gawk-5.0.1/test/fwtest5.in                    |     4 +
 gawk-5.0.1/test/fwtest5.ok                    |     4 +
 gawk-5.0.1/test/fwtest6.awk                   |     4 +
 gawk-5.0.1/test/fwtest6.in                    |     1 +
 gawk-5.0.1/test/fwtest6.ok                    |     3 +
 gawk-5.0.1/test/fwtest7.awk                   |     2 +
 gawk-5.0.1/test/fwtest7.in                    |     1 +
 gawk-5.0.1/test/fwtest7.ok                    |     1 +
 gawk-5.0.1/test/fwtest8.awk                   |     2 +
 gawk-5.0.1/test/fwtest8.in                    |     1 +
 gawk-5.0.1/test/fwtest8.ok                    |     2 +
 gawk-5.0.1/test/genpot.awk                    |     1 +
 gawk-5.0.1/test/genpot.ok                     |     5 +
 gawk-5.0.1/test/gensub.awk                    |     7 +
 gawk-5.0.1/test/gensub.in                     |     2 +
 gawk-5.0.1/test/gensub.ok                     |     4 +
 gawk-5.0.1/test/gensub2.awk                   |     5 +
 gawk-5.0.1/test/gensub2.ok                    |     4 +
 gawk-5.0.1/test/gensub3.awk                   |     8 +
 gawk-5.0.1/test/gensub3.in                    |     2 +
 gawk-5.0.1/test/gensub3.ok                    |     1 +
 gawk-5.0.1/test/getfile.awk                   |    35 +
 gawk-5.0.1/test/getfile.ok                    |    17 +
 gawk-5.0.1/test/getline.awk                   |    33 +
 gawk-5.0.1/test/getline.in                    |     3 +
 gawk-5.0.1/test/getline.ok                    |     8 +
 gawk-5.0.1/test/getline2.awk                  |     1 +
 gawk-5.0.1/test/getline2.ok                   |     2 +
 gawk-5.0.1/test/getline3.awk                  |     7 +
 gawk-5.0.1/test/getline3.ok                   |     1 +
 gawk-5.0.1/test/getline4.awk                  |     1 +
 gawk-5.0.1/test/getline4.in                   |     1 +
 gawk-5.0.1/test/getline4.ok                   |     1 +
 gawk-5.0.1/test/getline5.awk                  |    35 +
 gawk-5.0.1/test/getline5.ok                   |     1 +
 gawk-5.0.1/test/getlnbuf.awk                  |    18 +
 gawk-5.0.1/test/getlnbuf.in                   |  1708 +
 gawk-5.0.1/test/getlnbuf.ok                   |  1708 +
 gawk-5.0.1/test/getlndir.awk                  |     7 +
 gawk-5.0.1/test/getlndir.ok                   |     1 +
 gawk-5.0.1/test/getlnhd.awk                   |    10 +
 gawk-5.0.1/test/getlnhd.ok                    |     2 +
 gawk-5.0.1/test/getnr2tb.awk                  |   111 +
 gawk-5.0.1/test/getnr2tb.in                   |     6 +
 gawk-5.0.1/test/getnr2tb.ok                   |     6 +
 gawk-5.0.1/test/getnr2tm.awk                  |    75 +
 gawk-5.0.1/test/getnr2tm.in                   |     1 +
 gawk-5.0.1/test/getnr2tm.ok                   |     1 +
 gawk-5.0.1/test/gnuops2.awk                   |    72 +
 gawk-5.0.1/test/gnuops2.ok                    |     7 +
 gawk-5.0.1/test/gnuops3.awk                   |    14 +
 gawk-5.0.1/test/gnuops3.ok                    |     5 +
 gawk-5.0.1/test/gnureops.awk                  |    45 +
 gawk-5.0.1/test/gnureops.ok                   |    17 +
 gawk-5.0.1/test/gsubasgn.awk                  |    13 +
 gawk-5.0.1/test/gsubasgn.ok                   |     5 +
 gawk-5.0.1/test/gsubind.awk                   |     9 +
 gawk-5.0.1/test/gsubind.ok                    |     3 +
 gawk-5.0.1/test/gsubtest.awk                  |     9 +
 gawk-5.0.1/test/gsubtest.ok                   |     7 +
 gawk-5.0.1/test/gsubtst2.awk                  |   241 +
 gawk-5.0.1/test/gsubtst2.ok                   |    25 +
 gawk-5.0.1/test/gsubtst3.awk                  |   291 +
 gawk-5.0.1/test/gsubtst3.in                   |    57 +
 gawk-5.0.1/test/gsubtst3.ok                   |    60 +
 gawk-5.0.1/test/gsubtst4.awk                  |   242 +
 gawk-5.0.1/test/gsubtst4.ok                   |    33 +
 gawk-5.0.1/test/gsubtst5.awk                  |    97 +
 gawk-5.0.1/test/gsubtst5.in                   |     1 +
 gawk-5.0.1/test/gsubtst5.ok                   |     5 +
 gawk-5.0.1/test/gsubtst6.awk                  |    24 +
 gawk-5.0.1/test/gsubtst6.ok                   |     1 +
 gawk-5.0.1/test/gsubtst7.awk                  |    92 +
 gawk-5.0.1/test/gsubtst7.in                   |     1 +
 gawk-5.0.1/test/gsubtst7.ok                   |     1 +
 gawk-5.0.1/test/gsubtst8.awk                  |     5 +
 gawk-5.0.1/test/gsubtst8.in                   |     2 +
 gawk-5.0.1/test/gsubtst8.ok                   |     2 +
 gawk-5.0.1/test/gtlnbufv.awk                  |     2 +
 gawk-5.0.1/test/hello.awk                     |     3 +
 gawk-5.0.1/test/hex.awk                       |    22 +
 gawk-5.0.1/test/hex.ok                        |     6 +
 gawk-5.0.1/test/hex2.awk                      |     1 +
 gawk-5.0.1/test/hex2.in                       |     2 +
 gawk-5.0.1/test/hex2.ok                       |     2 +
 gawk-5.0.1/test/hsprint.awk                   |    71 +
 gawk-5.0.1/test/hsprint.ok                    |    66 +
 gawk-5.0.1/test/icasefs.awk                   |    43 +
 gawk-5.0.1/test/icasefs.ok                    |     6 +
 gawk-5.0.1/test/icasers.awk                   |     2 +
 gawk-5.0.1/test/icasers.in                    |     1 +
 gawk-5.0.1/test/icasers.ok                    |     2 +
 gawk-5.0.1/test/id.awk                        |    12 +
 gawk-5.0.1/test/id.ok                         |    74 +
 gawk-5.0.1/test/igncdym.awk                   |    56 +
 gawk-5.0.1/test/igncdym.in                    |     2 +
 gawk-5.0.1/test/igncdym.ok                    |     4 +
 gawk-5.0.1/test/igncfs.awk                    |     8 +
 gawk-5.0.1/test/igncfs.in                     |     2 +
 gawk-5.0.1/test/igncfs.ok                     |     2 +
 gawk-5.0.1/test/ignrcas2.awk                  |    13 +
 gawk-5.0.1/test/ignrcas2.ok                   |     1 +
 gawk-5.0.1/test/ignrcas3.awk                  |    20 +
 gawk-5.0.1/test/ignrcas3.ok                   |    18 +
 gawk-5.0.1/test/ignrcas4.awk                  |     7 +
 gawk-5.0.1/test/ignrcas4.ok                   |     2 +
 gawk-5.0.1/test/ignrcase.awk                  |     2 +
 gawk-5.0.1/test/ignrcase.in                   |     1 +
 gawk-5.0.1/test/ignrcase.ok                   |     1 +
 gawk-5.0.1/test/incdupe.ok                    |     3 +
 gawk-5.0.1/test/incdupe2.ok                   |     2 +
 gawk-5.0.1/test/incdupe3.ok                   |     2 +
 gawk-5.0.1/test/incdupe4.ok                   |     2 +
 gawk-5.0.1/test/incdupe5.ok                   |     2 +
 gawk-5.0.1/test/incdupe6.ok                   |     3 +
 gawk-5.0.1/test/incdupe7.ok                   |     3 +
 gawk-5.0.1/test/inchello.awk                  |     1 +
 gawk-5.0.1/test/inclib.awk                    |     7 +
 gawk-5.0.1/test/include.awk                   |     5 +
 gawk-5.0.1/test/include.ok                    |     2 +
 gawk-5.0.1/test/include2.ok                   |     2 +
 gawk-5.0.1/test/indirectbuiltin.awk           |   377 +
 gawk-5.0.1/test/indirectbuiltin.ok            |    44 +
 gawk-5.0.1/test/indirectcall.awk              |   130 +
 gawk-5.0.1/test/indirectcall.in               |     3 +
 gawk-5.0.1/test/indirectcall.ok               |    18 +
 gawk-5.0.1/test/indirectcall2.awk             |    11 +
 gawk-5.0.1/test/indirectcall2.ok              |     4 +
 gawk-5.0.1/test/inftest.awk                   |     8 +
 gawk-5.0.1/test/inftest.ok                    |   105 +
 gawk-5.0.1/test/inplace.1.in                  |     2 +
 gawk-5.0.1/test/inplace.2.in                  |     2 +
 gawk-5.0.1/test/inplace.in                    |     3 +
 gawk-5.0.1/test/inplace1.1.ok                 |     2 +
 gawk-5.0.1/test/inplace1.2.ok                 |     2 +
 gawk-5.0.1/test/inplace1.ok                   |     6 +
 gawk-5.0.1/test/inplace2.1.bak.ok             |     2 +
 gawk-5.0.1/test/inplace2.1.ok                 |     2 +
 gawk-5.0.1/test/inplace2.2.bak.ok             |     2 +
 gawk-5.0.1/test/inplace2.2.ok                 |     2 +
 gawk-5.0.1/test/inplace2.ok                   |     6 +
 gawk-5.0.1/test/inplace3.1.bak.ok             |     2 +
 gawk-5.0.1/test/inplace3.1.ok                 |     2 +
 gawk-5.0.1/test/inplace3.2.bak.ok             |     2 +
 gawk-5.0.1/test/inplace3.2.ok                 |     2 +
 gawk-5.0.1/test/inplace3.ok                   |    12 +
 gawk-5.0.1/test/inpref.awk                    |     9 +
 gawk-5.0.1/test/inpref.in                     |     2 +
 gawk-5.0.1/test/inpref.ok                     |     2 +
 gawk-5.0.1/test/inputred.awk                  |     1 +
 gawk-5.0.1/test/inputred.ok                   |     1 +
 gawk-5.0.1/test/intarray.awk                  |    19 +
 gawk-5.0.1/test/intarray.ok                   |     0
 gawk-5.0.1/test/intest.awk                    |     4 +
 gawk-5.0.1/test/intest.ok                     |     1 +
 gawk-5.0.1/test/intformat.awk                 |    88 +
 gawk-5.0.1/test/intformat.ok                  |     2 +
 gawk-5.0.1/test/intprec.awk                   |     1 +
 gawk-5.0.1/test/intprec.ok                    |     1 +
 gawk-5.0.1/test/iobug1.awk                    |    53 +
 gawk-5.0.1/test/iobug1.ok                     |     0
 gawk-5.0.1/test/isarrayunset.awk              |     1 +
 gawk-5.0.1/test/isarrayunset.ok               |     1 +
 gawk-5.0.1/test/jarebug.awk                   |     1 +
 gawk-5.0.1/test/jarebug.in                    |     4 +
 gawk-5.0.1/test/jarebug.ok                    |     4 +
 gawk-5.0.1/test/jarebug.sh                    |    21 +
 gawk-5.0.1/test/lc_num1.awk                   |    19 +
 gawk-5.0.1/test/lc_num1.ok                    |     1 +
 gawk-5.0.1/test/leaddig.awk                   |    12 +
 gawk-5.0.1/test/leaddig.ok                    |     1 +
 gawk-5.0.1/test/leadnl.awk                    |    10 +
 gawk-5.0.1/test/leadnl.in                     |     9 +
 gawk-5.0.1/test/leadnl.ok                     |     8 +
 gawk-5.0.1/test/lib/awkpath.awk               |     1 +
 gawk-5.0.1/test/lint.awk                      |    14 +
 gawk-5.0.1/test/lint.ok                       |     5 +
 gawk-5.0.1/test/lintexp.awk                   |     9 +
 gawk-5.0.1/test/lintexp.ok                    |     2 +
 gawk-5.0.1/test/lintindex.awk                 |    10 +
 gawk-5.0.1/test/lintindex.ok                  |     4 +
 gawk-5.0.1/test/lintint.awk                   |     9 +
 gawk-5.0.1/test/lintint.ok                    |     2 +
 gawk-5.0.1/test/lintlength.awk                |     6 +
 gawk-5.0.1/test/lintlength.ok                 |     2 +
 gawk-5.0.1/test/lintold.awk                   |    21 +
 gawk-5.0.1/test/lintold.in                    |     1 +
 gawk-5.0.1/test/lintold.ok                    |    16 +
 gawk-5.0.1/test/lintset.awk                   |     5 +
 gawk-5.0.1/test/lintset.ok                    |     1 +
 gawk-5.0.1/test/lintwarn.awk                  |    43 +
 gawk-5.0.1/test/lintwarn.ok                   |    39 +
 gawk-5.0.1/test/litoct.awk                    |     1 +
 gawk-5.0.1/test/litoct.in                     |     1 +
 gawk-5.0.1/test/litoct.ok                     |     1 +
 gawk-5.0.1/test/localenl.ok                   |     4 +
 gawk-5.0.1/test/localenl.sh                   |    75 +
 gawk-5.0.1/test/longsub.awk                   |     1 +
 gawk-5.0.1/test/longsub.in                    |     1 +
 gawk-5.0.1/test/longsub.ok                    |     1 +
 gawk-5.0.1/test/longwrds.awk                  |    27 +
 gawk-5.0.1/test/longwrds.in                   |   200 +
 gawk-5.0.1/test/longwrds.ok                   |    21 +
 gawk-5.0.1/test/manglprm.awk                  |    41 +
 gawk-5.0.1/test/manglprm.in                   |     1 +
 gawk-5.0.1/test/manglprm.ok                   |     1 +
 gawk-5.0.1/test/manyfiles.awk                 |     1 +
 gawk-5.0.1/test/manyfiles.ok                  |     1 +
 gawk-5.0.1/test/match1.awk                    |     9 +
 gawk-5.0.1/test/match1.ok                     |     6 +
 gawk-5.0.1/test/match2.awk                    |     6 +
 gawk-5.0.1/test/match2.ok                     |     3 +
 gawk-5.0.1/test/match3.awk                    |    46 +
 gawk-5.0.1/test/match3.in                     |     4 +
 gawk-5.0.1/test/match3.ok                     |     4 +
 gawk-5.0.1/test/math.awk                      |    10 +
 gawk-5.0.1/test/math.ok                       |     6 +
 gawk-5.0.1/test/mbfw1.awk                     |    40 +
 gawk-5.0.1/test/mbfw1.in                      |     4 +
 gawk-5.0.1/test/mbfw1.ok                      |     4 +
 gawk-5.0.1/test/mbprintf1.awk                 |     1 +
 gawk-5.0.1/test/mbprintf1.in                  |     2 +
 gawk-5.0.1/test/mbprintf1.ok                  |     2 +
 gawk-5.0.1/test/mbprintf2.awk                 |     4 +
 gawk-5.0.1/test/mbprintf2.ok                  |     2 +
 gawk-5.0.1/test/mbprintf3.awk                 |     1 +
 gawk-5.0.1/test/mbprintf3.in                  |     1 +
 gawk-5.0.1/test/mbprintf3.ok                  |     2 +
 gawk-5.0.1/test/mbprintf4.awk                 |    35 +
 gawk-5.0.1/test/mbprintf4.in                  |     3 +
 gawk-5.0.1/test/mbprintf4.ok                  |    81 +
 gawk-5.0.1/test/mbprintf5.awk                 |     1 +
 gawk-5.0.1/test/mbprintf5.in                  |     3 +
 gawk-5.0.1/test/mbprintf5.ok                  |     3 +
 gawk-5.0.1/test/mbstr1.awk                    |     4 +
 gawk-5.0.1/test/mbstr1.ok                     |     3 +
 gawk-5.0.1/test/mbstr2.awk                    |     1 +
 gawk-5.0.1/test/mbstr2.in                     |     4 +
 gawk-5.0.1/test/mbstr2.ok                     |     5 +
 gawk-5.0.1/test/membug1.awk                   |     1 +
 gawk-5.0.1/test/membug1.in                    |     2 +
 gawk-5.0.1/test/membug1.ok                    |     0
 gawk-5.0.1/test/memleak.awk                   |    20 +
 gawk-5.0.1/test/memleak.ok                    |     1 +
 gawk-5.0.1/test/messages.awk                  |     9 +
 gawk-5.0.1/test/minusstr.awk                  |     1 +
 gawk-5.0.1/test/minusstr.ok                   |     1 +
 gawk-5.0.1/test/mixed1.ok                     |     3 +
 gawk-5.0.1/test/mktime.awk                    |     3 +
 gawk-5.0.1/test/mktime.in                     |     1 +
 gawk-5.0.1/test/mktime.ok                     |     1 +
 gawk-5.0.1/test/mmap8k.awk                    |     1 +
 gawk-5.0.1/test/mmap8k.in                     |   143 +
 gawk-5.0.1/test/mmap8k.ok                     |   143 +
 gawk-5.0.1/test/mpfrbigint.awk                |    11 +
 gawk-5.0.1/test/mpfrbigint.ok                 |     5 +
 gawk-5.0.1/test/mpfrbigint2.awk               |     3 +
 gawk-5.0.1/test/mpfrbigint2.in                |     1 +
 gawk-5.0.1/test/mpfrbigint2.ok                |     3 +
 gawk-5.0.1/test/mpfrexprange.awk              |     7 +
 gawk-5.0.1/test/mpfrexprange.ok               |     2 +
 gawk-5.0.1/test/mpfrfield.awk                 |    14 +
 gawk-5.0.1/test/mpfrfield.in                  |    10 +
 gawk-5.0.1/test/mpfrfield.ok                  |     1 +
 gawk-5.0.1/test/mpfrieee.awk                  |    13 +
 gawk-5.0.1/test/mpfrieee.ok                   |    12 +
 gawk-5.0.1/test/mpfrmemok1.awk                |     7 +
 gawk-5.0.1/test/mpfrmemok1.ok                 |     7 +
 gawk-5.0.1/test/mpfrnegzero.awk               |    15 +
 gawk-5.0.1/test/mpfrnegzero.ok                |     9 +
 gawk-5.0.1/test/mpfrnr.awk                    |    10 +
 gawk-5.0.1/test/mpfrnr.in                     |     3 +
 gawk-5.0.1/test/mpfrnr.ok                     |     1 +
 gawk-5.0.1/test/mpfrrem.awk                   |     6 +
 gawk-5.0.1/test/mpfrrem.ok                    |     4 +
 gawk-5.0.1/test/mpfrrnd.awk                   |    15 +
 gawk-5.0.1/test/mpfrrnd.ok                    |    10 +
 gawk-5.0.1/test/mpfrrndeval.awk               |    35 +
 gawk-5.0.1/test/mpfrrndeval.ok                |    18 +
 gawk-5.0.1/test/mpfrsort.awk                  |     8 +
 gawk-5.0.1/test/mpfrsort.ok                   |    11 +
 gawk-5.0.1/test/mpfrsqrt.awk                  |    84 +
 gawk-5.0.1/test/mpfrsqrt.ok                   |     2 +
 gawk-5.0.1/test/mpfrstrtonum.awk              |     5 +
 gawk-5.0.1/test/mpfrstrtonum.ok               |     2 +
 gawk-5.0.1/test/mpfruplus.ok                  |     3 +
 gawk-5.0.1/test/mpgforcenum.awk               |     5 +
 gawk-5.0.1/test/mpgforcenum.ok                |     1 +
 gawk-5.0.1/test/mtchi18n.awk                  |     1 +
 gawk-5.0.1/test/mtchi18n.in                   |     2 +
 gawk-5.0.1/test/mtchi18n.ok                   |     2 +
 gawk-5.0.1/test/muldimposix.awk               |     1 +
 gawk-5.0.1/test/muldimposix.ok                |     2 +
 gawk-5.0.1/test/nasty.awk                     |    92 +
 gawk-5.0.1/test/nasty.ok                      |     2 +
 gawk-5.0.1/test/nasty2.awk                    |    20 +
 gawk-5.0.1/test/nasty2.ok                     |     2 +
 gawk-5.0.1/test/nastyparm.awk                 |    41 +
 gawk-5.0.1/test/nastyparm.ok                  |    11 +
 gawk-5.0.1/test/negexp.awk                    |     1 +
 gawk-5.0.1/test/negexp.ok                     |     1 +
 gawk-5.0.1/test/negrange.awk                  |     7 +
 gawk-5.0.1/test/negrange.ok                   |     7 +
 gawk-5.0.1/test/negtime.awk                   |     4 +
 gawk-5.0.1/test/negtime.ok                    |     1 +
 gawk-5.0.1/test/nested.awk                    |   123 +
 gawk-5.0.1/test/nested.in                     |     1 +
 gawk-5.0.1/test/nested.ok                     |     2 +
 gawk-5.0.1/test/next.ok                       |     4 +
 gawk-5.0.1/test/next.sh                       |    20 +
 gawk-5.0.1/test/nfldstr.awk                   |    13 +
 gawk-5.0.1/test/nfldstr.in                    |     1 +
 gawk-5.0.1/test/nfldstr.ok                    |     0
 gawk-5.0.1/test/nfloop.awk                    |     8 +
 gawk-5.0.1/test/nfloop.ok                     |     1 +
 gawk-5.0.1/test/nfneg.awk                     |     1 +
 gawk-5.0.1/test/nfneg.ok                      |     2 +
 gawk-5.0.1/test/nfset.awk                     |     1 +
 gawk-5.0.1/test/nfset.in                      |     5 +
 gawk-5.0.1/test/nfset.ok                      |     5 +
 gawk-5.0.1/test/nlfldsep.awk                  |     2 +
 gawk-5.0.1/test/nlfldsep.in                   |     5 +
 gawk-5.0.1/test/nlfldsep.ok                   |    13 +
 gawk-5.0.1/test/nlinstr.awk                   |     8 +
 gawk-5.0.1/test/nlinstr.in                    |     2 +
 gawk-5.0.1/test/nlinstr.ok                    |     1 +
 gawk-5.0.1/test/nlstrina.awk                  |    77 +
 gawk-5.0.1/test/nlstrina.ok                   |     3 +
 gawk-5.0.1/test/nlstringtest-nogettext.ok     |     5 +
 gawk-5.0.1/test/nlstringtest.awk              |    12 +
 gawk-5.0.1/test/nlstringtest.ok               |     5 +
 gawk-5.0.1/test/nlstringtest.po               |    16 +
 gawk-5.0.1/test/noeffect.awk                  |    10 +
 gawk-5.0.1/test/noeffect.ok                   |     8 +
 gawk-5.0.1/test/nofile.ok                     |     2 +
 gawk-5.0.1/test/nofmtch.awk                   |     1 +
 gawk-5.0.1/test/nofmtch.ok                    |     2 +
 gawk-5.0.1/test/noloop1.awk                   |    70 +
 gawk-5.0.1/test/noloop1.in                    |     1 +
 gawk-5.0.1/test/noloop1.ok                    |     0
 gawk-5.0.1/test/noloop2.awk                   |    70 +
 gawk-5.0.1/test/noloop2.in                    |     1 +
 gawk-5.0.1/test/noloop2.ok                    |     0
 gawk-5.0.1/test/nondec.awk                    |     1 +
 gawk-5.0.1/test/nondec.ok                     |     1 +
 gawk-5.0.1/test/nondec2.awk                   |   108 +
 gawk-5.0.1/test/nondec2.ok                    |     1 +
 gawk-5.0.1/test/nonfatal1.awk                 |     6 +
 gawk-5.0.1/test/nonfatal1.ok                  |     2 +
 gawk-5.0.1/test/nonfatal2.awk                 |     5 +
 gawk-5.0.1/test/nonfatal2.ok                  |     1 +
 gawk-5.0.1/test/nonfatal3.awk                 |     6 +
 gawk-5.0.1/test/nonfatal3.ok                  |     1 +
 gawk-5.0.1/test/nonl.awk                      |     1 +
 gawk-5.0.1/test/nonl.in                       |     1 +
 gawk-5.0.1/test/nonl.ok                       |     1 +
 gawk-5.0.1/test/noparms.awk                   |     1 +
 gawk-5.0.1/test/noparms.ok                    |     5 +
 gawk-5.0.1/test/nors.in                       |     1 +
 gawk-5.0.1/test/nors.ok                       |     2 +
 gawk-5.0.1/test/nsbad.awk                     |    15 +
 gawk-5.0.1/test/nsbad.ok                      |    13 +
 gawk-5.0.1/test/nsbad_cmd.ok                  |     3 +
 gawk-5.0.1/test/nsforloop.awk                 |    20 +
 gawk-5.0.1/test/nsforloop.ok                  |     7 +
 gawk-5.0.1/test/nsfuncrecurse.awk             |    18 +
 gawk-5.0.1/test/nsfuncrecurse.ok              |     5 +
 gawk-5.0.1/test/nsindirect1.awk               |    13 +
 gawk-5.0.1/test/nsindirect1.ok                |     2 +
 gawk-5.0.1/test/nsindirect2.awk               |    44 +
 gawk-5.0.1/test/nsindirect2.ok                |     5 +
 gawk-5.0.1/test/nsprof1.awk                   |    16 +
 gawk-5.0.1/test/nsprof1.ok                    |    19 +
 gawk-5.0.1/test/nsprof2.awk                   |    74 +
 gawk-5.0.1/test/nsprof2.ok                    |    75 +
 gawk-5.0.1/test/nulinsrc.awk                  |   Bin 0 -> 3 bytes
 gawk-5.0.1/test/nulinsrc.ok                   |     2 +
 gawk-5.0.1/test/nulrsend.awk                  |   112 +
 gawk-5.0.1/test/nulrsend.in                   |     4 +
 gawk-5.0.1/test/nulrsend.ok                   |     2 +
 gawk-5.0.1/test/numindex.awk                  |    55 +
 gawk-5.0.1/test/numindex.in                   |     4 +
 gawk-5.0.1/test/numindex.ok                   |     1 +
 gawk-5.0.1/test/numrange.awk                  |     5 +
 gawk-5.0.1/test/numrange.ok                   |     2 +
 gawk-5.0.1/test/numstr1.awk                   |     7 +
 gawk-5.0.1/test/numstr1.ok                    |     2 +
 gawk-5.0.1/test/numsubstr.awk                 |     1 +
 gawk-5.0.1/test/numsubstr.in                  |     3 +
 gawk-5.0.1/test/numsubstr.ok                  |     3 +
 gawk-5.0.1/test/octsub.awk                    |     1 +
 gawk-5.0.1/test/octsub.ok                     |     1 +
 gawk-5.0.1/test/ofmt.awk                      |    53 +
 gawk-5.0.1/test/ofmt.in                       |   136 +
 gawk-5.0.1/test/ofmt.ok                       |     6 +
 gawk-5.0.1/test/ofmta.awk                     |    30 +
 gawk-5.0.1/test/ofmta.ok                      |     7 +
 gawk-5.0.1/test/ofmtbig.awk                   |   126 +
 gawk-5.0.1/test/ofmtbig.in                    |     3 +
 gawk-5.0.1/test/ofmtbig.ok                    |     2 +
 gawk-5.0.1/test/ofmtfidl.awk                  |    85 +
 gawk-5.0.1/test/ofmtfidl.in                   |    10 +
 gawk-5.0.1/test/ofmtfidl.ok                   |    10 +
 gawk-5.0.1/test/ofmts.awk                     |     2 +
 gawk-5.0.1/test/ofmts.in                      |     1 +
 gawk-5.0.1/test/ofmts.ok                      |     1 +
 gawk-5.0.1/test/ofmtstrnum.awk                |     7 +
 gawk-5.0.1/test/ofmtstrnum.ok                 |     2 +
 gawk-5.0.1/test/ofs1.awk                      |    23 +
 gawk-5.0.1/test/ofs1.in                       |     4 +
 gawk-5.0.1/test/ofs1.ok                       |     7 +
 gawk-5.0.1/test/onlynl.awk                    |     2 +
 gawk-5.0.1/test/onlynl.in                     |     4 +
 gawk-5.0.1/test/onlynl.ok                     |     0
 gawk-5.0.1/test/opasnidx.awk                  |     1 +
 gawk-5.0.1/test/opasnidx.ok                   |     1 +
 gawk-5.0.1/test/opasnslf.awk                  |     6 +
 gawk-5.0.1/test/opasnslf.ok                   |     3 +
 gawk-5.0.1/test/ordchr.awk                    |    10 +
 gawk-5.0.1/test/ordchr.ok                     |     5 +
 gawk-5.0.1/test/ordchr2.ok                    |     1 +
 gawk-5.0.1/test/out1.ok                       |     1 +
 gawk-5.0.1/test/out2.ok                       |     2 +
 gawk-5.0.1/test/out3.ok                       |     1 +
 gawk-5.0.1/test/paramasfunc1.awk              |     9 +
 gawk-5.0.1/test/paramasfunc1.ok               |     3 +
 gawk-5.0.1/test/paramasfunc2.awk              |    10 +
 gawk-5.0.1/test/paramasfunc2.ok               |     3 +
 gawk-5.0.1/test/paramdup.awk                  |     8 +
 gawk-5.0.1/test/paramdup.ok                   |     3 +
 gawk-5.0.1/test/paramres.awk                  |     6 +
 gawk-5.0.1/test/paramres.ok                   |     2 +
 gawk-5.0.1/test/paramtyp.awk                  |    20 +
 gawk-5.0.1/test/paramtyp.ok                   |     6 +
 gawk-5.0.1/test/paramuninitglobal.awk         |    15 +
 gawk-5.0.1/test/paramuninitglobal.ok          |     4 +
 gawk-5.0.1/test/parse1.awk                    |    35 +
 gawk-5.0.1/test/parse1.in                     |     1 +
 gawk-5.0.1/test/parse1.ok                     |     4 +
 gawk-5.0.1/test/parsefld.awk                  |     2 +
 gawk-5.0.1/test/parsefld.in                   |     1 +
 gawk-5.0.1/test/parsefld.ok                   |     2 +
 gawk-5.0.1/test/parseme.awk                   |     1 +
 gawk-5.0.1/test/parseme.ok                    |     5 +
 gawk-5.0.1/test/patsplit.awk                  |    26 +
 gawk-5.0.1/test/patsplit.ok                   |    59 +
 gawk-5.0.1/test/pcntplus.awk                  |     1 +
 gawk-5.0.1/test/pcntplus.ok                   |     1 +
 gawk-5.0.1/test/pid.awk                       |    49 +
 gawk-5.0.1/test/pid.ok                        |     3 +
 gawk-5.0.1/test/pid.sh                        |     3 +
 gawk-5.0.1/test/pipeio1.awk                   |    31 +
 gawk-5.0.1/test/pipeio1.ok                    |     2 +
 gawk-5.0.1/test/pipeio2.awk                   |    72 +
 gawk-5.0.1/test/pipeio2.in                    |     8 +
 gawk-5.0.1/test/pipeio2.ok                    |    14 +
 gawk-5.0.1/test/posix.awk                     |    69 +
 gawk-5.0.1/test/posix.in                      |     1 +
 gawk-5.0.1/test/posix.ok                      |    16 +
 gawk-5.0.1/test/posix2008sub.awk              |     7 +
 gawk-5.0.1/test/posix2008sub.ok               |     2 +
 gawk-5.0.1/test/poundbang.awk                 |     2 +
 gawk-5.0.1/test/prdupval.awk                  |     1 +
 gawk-5.0.1/test/prdupval.in                   |     1 +
 gawk-5.0.1/test/prdupval.ok                   |     1 +
 gawk-5.0.1/test/prec.awk                      |     7 +
 gawk-5.0.1/test/prec.ok                       |     1 +
 gawk-5.0.1/test/printf0.awk                   |     5 +
 gawk-5.0.1/test/printf0.ok                    |     1 +
 gawk-5.0.1/test/printf1.awk                   |    19 +
 gawk-5.0.1/test/printf1.ok                    |     7 +
 gawk-5.0.1/test/printfbad1.awk                |    65 +
 gawk-5.0.1/test/printfbad1.ok                 |     5 +
 gawk-5.0.1/test/printfbad2.awk                |     2 +
 gawk-5.0.1/test/printfbad2.in                 |     1 +
 gawk-5.0.1/test/printfbad2.ok                 |     3 +
 gawk-5.0.1/test/printfbad3.awk                |    22 +
 gawk-5.0.1/test/printfbad3.ok                 |     1 +
 gawk-5.0.1/test/printfbad4.awk                |     5 +
 gawk-5.0.1/test/printfbad4.ok                 |     2 +
 gawk-5.0.1/test/printfchar.awk                |     7 +
 gawk-5.0.1/test/printfchar.ok                 |     1 +
 gawk-5.0.1/test/printfloat.awk                |    62 +
 gawk-5.0.1/test/printhuge.awk                 |     3 +
 gawk-5.0.1/test/printhuge.ok                  |     1 +
 gawk-5.0.1/test/printlang.awk                 |     4 +
 gawk-5.0.1/test/prmarscl.awk                  |     6 +
 gawk-5.0.1/test/prmarscl.ok                   |     2 +
 gawk-5.0.1/test/prmreuse.awk                  |    14 +
 gawk-5.0.1/test/prmreuse.ok                   |     0
 gawk-5.0.1/test/procinfs.awk                  |     7 +
 gawk-5.0.1/test/procinfs.ok                   |     3 +
 gawk-5.0.1/test/profile0.awk                  |     1 +
 gawk-5.0.1/test/profile0.in                   |     2 +
 gawk-5.0.1/test/profile0.ok                   |     6 +
 gawk-5.0.1/test/profile10.awk                 |    42 +
 gawk-5.0.1/test/profile10.ok                  |    38 +
 gawk-5.0.1/test/profile11.awk                 |   321 +
 gawk-5.0.1/test/profile11.ok                  |   371 +
 gawk-5.0.1/test/profile12.awk                 |     3 +
 gawk-5.0.1/test/profile12.in                  |     4 +
 gawk-5.0.1/test/profile12.ok                  |     3 +
 gawk-5.0.1/test/profile2.ok                   |   144 +
 gawk-5.0.1/test/profile3.awk                  |     9 +
 gawk-5.0.1/test/profile3.ok                   |    14 +
 gawk-5.0.1/test/profile4.awk                  |     8 +
 gawk-5.0.1/test/profile4.ok                   |     9 +
 gawk-5.0.1/test/profile5.awk                  |  5179 ++
 gawk-5.0.1/test/profile5.ok                   |  8178 +++
 gawk-5.0.1/test/profile6.awk                  |     7 +
 gawk-5.0.1/test/profile6.ok                   |    10 +
 gawk-5.0.1/test/profile7.awk                  |    14 +
 gawk-5.0.1/test/profile7.ok                   |    17 +
 gawk-5.0.1/test/profile8.awk                  |     4 +
 gawk-5.0.1/test/profile8.ok                   |    21 +
 gawk-5.0.1/test/profile9.awk                  |     9 +
 gawk-5.0.1/test/profile9.ok                   |    14 +
 gawk-5.0.1/test/prt1eval.awk                  |     6 +
 gawk-5.0.1/test/prt1eval.ok                   |     1 +
 gawk-5.0.1/test/prtoeval.awk                  |     4 +
 gawk-5.0.1/test/prtoeval.ok                   |     2 +
 gawk-5.0.1/test/pty1.awk                      |    54 +
 gawk-5.0.1/test/pty1.ok                       |     2 +
 gawk-5.0.1/test/pty2.awk                      |     9 +
 gawk-5.0.1/test/pty2.ok                       |     2 +
 gawk-5.0.1/test/rand-mpfr.ok                  |     1 +
 gawk-5.0.1/test/rand.awk                      |     6 +
 gawk-5.0.1/test/rand.ok                       |     1 +
 gawk-5.0.1/test/randtest.ok                   |     0
 gawk-5.0.1/test/randtest.sh                   |   113 +
 gawk-5.0.1/test/range1.awk                    |     1 +
 gawk-5.0.1/test/range1.in                     |     2 +
 gawk-5.0.1/test/range1.ok                     |     1 +
 gawk-5.0.1/test/range2.awk                    |     1 +
 gawk-5.0.1/test/range2.ok                     |     1 +
 gawk-5.0.1/test/readbuf.awk                   |     2 +
 gawk-5.0.1/test/readbuf.ok                    |     3 +
 gawk-5.0.1/test/readdir.awk                   |     3 +
 gawk-5.0.1/test/readdir0.awk                  |    46 +
 gawk-5.0.1/test/readdir_retest.awk            |     7 +
 gawk-5.0.1/test/readfile2.awk                 |    12 +
 gawk-5.0.1/test/readfile2.ok                  |    21 +
 gawk-5.0.1/test/rebrackloc.awk                |    31 +
 gawk-5.0.1/test/rebrackloc.in                 |     3 +
 gawk-5.0.1/test/rebrackloc.ok                 |    17 +
 gawk-5.0.1/test/rebt8b1.awk                   |   138 +
 gawk-5.0.1/test/rebt8b1.ok                    |    16 +
 gawk-5.0.1/test/rebt8b2.awk                   |    88 +
 gawk-5.0.1/test/rebt8b2.ok                    |   511 +
 gawk-5.0.1/test/rebuf.awk                     |    73 +
 gawk-5.0.1/test/rebuf.in                      |  2350 +
 gawk-5.0.1/test/rebuf.ok                      |  1290 +
 gawk-5.0.1/test/rebuild.awk                   |     5 +
 gawk-5.0.1/test/rebuild.in                    |     1 +
 gawk-5.0.1/test/rebuild.ok                    |     2 +
 gawk-5.0.1/test/redfilnm.awk                  |    98 +
 gawk-5.0.1/test/redfilnm.in                   |     1 +
 gawk-5.0.1/test/redfilnm.ok                   |     9 +
 gawk-5.0.1/test/reg/Obsolete/exp.awk          |     1 +
 gawk-5.0.1/test/reg/Obsolete/exp.good         |     2 +
 gawk-5.0.1/test/reg/Obsolete/exp.in           |     0
 gawk-5.0.1/test/reg/Obsolete/log.awk          |     1 +
 gawk-5.0.1/test/reg/Obsolete/log.good         |     4 +
 gawk-5.0.1/test/reg/Obsolete/log.in           |     0
 gawk-5.0.1/test/reg/exp-eq.awk                |     1 +
 gawk-5.0.1/test/reg/exp-eq.good               |     3 +
 gawk-5.0.1/test/reg/exp-eq.in                 |     3 +
 gawk-5.0.1/test/reg/func.awk                  |     1 +
 gawk-5.0.1/test/reg/func.good                 |     1 +
 gawk-5.0.1/test/reg/func.in                   |     0
 gawk-5.0.1/test/reg/func2.awk                 |     2 +
 gawk-5.0.1/test/reg/func2.good                |     2 +
 gawk-5.0.1/test/reg/func2.in                  |     0
 gawk-5.0.1/test/regeq.awk                     |    29 +
 gawk-5.0.1/test/regeq.in                      |     2 +
 gawk-5.0.1/test/regeq.ok                      |     2 +
 gawk-5.0.1/test/regexpbrack.awk               |     2 +
 gawk-5.0.1/test/regexpbrack.in                |     0
 gawk-5.0.1/test/regexpbrack.ok                |     0
 gawk-5.0.1/test/regexpbrack2.awk              |     2 +
 gawk-5.0.1/test/regexpbrack2.in               |     2 +
 gawk-5.0.1/test/regexpbrack2.ok               |     2 +
 gawk-5.0.1/test/regexprange.awk               |    14 +
 gawk-5.0.1/test/regexprange.ok                |    52 +
 gawk-5.0.1/test/reginttrad.awk                |     6 +
 gawk-5.0.1/test/reginttrad.ok                 |     1 +
 gawk-5.0.1/test/regnul1.awk                   |    84 +
 gawk-5.0.1/test/regnul1.ok                    |     8 +
 gawk-5.0.1/test/regnul2.awk                   |   112 +
 gawk-5.0.1/test/regnul2.ok                    |    27 +
 gawk-5.0.1/test/regrange.awk                  |    30 +
 gawk-5.0.1/test/regrange.ok                   |     6 +
 gawk-5.0.1/test/regtest.sh                    |    18 +
 gawk-5.0.1/test/regx8bit.awk                  |    26 +
 gawk-5.0.1/test/regx8bit.ok                   |     7 +
 gawk-5.0.1/test/reindops.awk                  |     6 +
 gawk-5.0.1/test/reindops.in                   |     1 +
 gawk-5.0.1/test/reindops.ok                   |     1 +
 gawk-5.0.1/test/reint.awk                     |     1 +
 gawk-5.0.1/test/reint.in                      |     1 +
 gawk-5.0.1/test/reint.ok                      |     1 +
 gawk-5.0.1/test/reint2.awk                    |     1 +
 gawk-5.0.1/test/reint2.in                     |     1 +
 gawk-5.0.1/test/reint2.ok                     |     1 +
 gawk-5.0.1/test/reparse.awk                   |     7 +
 gawk-5.0.1/test/reparse.in                    |     1 +
 gawk-5.0.1/test/reparse.ok                    |     3 +
 gawk-5.0.1/test/resplit.awk                   |     1 +
 gawk-5.0.1/test/resplit.in                    |     1 +
 gawk-5.0.1/test/resplit.ok                    |     1 +
 gawk-5.0.1/test/revout.awk                    |     6 +
 gawk-5.0.1/test/revout.ok                     |     1 +
 gawk-5.0.1/test/revtwoway.awk                 |    11 +
 gawk-5.0.1/test/revtwoway.ok                  |     2 +
 gawk-5.0.1/test/rri1.awk                      |     1 +
 gawk-5.0.1/test/rri1.in                       |     1 +
 gawk-5.0.1/test/rri1.ok                       |     0
 gawk-5.0.1/test/rs.awk                        |     2 +
 gawk-5.0.1/test/rs.in                         |    15 +
 gawk-5.0.1/test/rs.ok                         |     3 +
 gawk-5.0.1/test/rscompat.awk                  |     2 +
 gawk-5.0.1/test/rscompat.in                   |     2 +
 gawk-5.0.1/test/rscompat.ok                   |     3 +
 gawk-5.0.1/test/rsgetline.awk                 |    23 +
 gawk-5.0.1/test/rsgetline.in                  |     1 +
 gawk-5.0.1/test/rsgetline.ok                  |     3 +
 gawk-5.0.1/test/rsglstdin.ok                  |     3 +
 gawk-5.0.1/test/rsnul1nl.awk                  |     2 +
 gawk-5.0.1/test/rsnul1nl.in                   |     3 +
 gawk-5.0.1/test/rsnul1nl.ok                   |     2 +
 gawk-5.0.1/test/rsnulbig.ok                   |     1 +
 gawk-5.0.1/test/rsnulbig2.ok                  |     1 +
 gawk-5.0.1/test/rsstart1.awk                  |    32 +
 gawk-5.0.1/test/rsstart1.in                   | 10000 ++++
 gawk-5.0.1/test/rsstart1.ok                   |     1 +
 gawk-5.0.1/test/rsstart2.awk                  |     2 +
 gawk-5.0.1/test/rsstart2.in                   | 10000 ++++
 gawk-5.0.1/test/rsstart2.ok                   |     1 +
 gawk-5.0.1/test/rsstart3.ok                   |     1 +
 gawk-5.0.1/test/rstest1.awk                   |     7 +
 gawk-5.0.1/test/rstest1.ok                    |     2 +
 gawk-5.0.1/test/rstest2.awk                   |     6 +
 gawk-5.0.1/test/rstest2.ok                    |     1 +
 gawk-5.0.1/test/rstest3.awk                   |    73 +
 gawk-5.0.1/test/rstest3.ok                    |     0
 gawk-5.0.1/test/rstest4.awk                   |    67 +
 gawk-5.0.1/test/rstest4.ok                    |     2 +
 gawk-5.0.1/test/rstest5.awk                   |    60 +
 gawk-5.0.1/test/rstest5.ok                    |     4 +
 gawk-5.0.1/test/rstest6.awk                   |     6 +
 gawk-5.0.1/test/rstest6.in                    |     1 +
 gawk-5.0.1/test/rstest6.ok                    |     1 +
 gawk-5.0.1/test/rswhite.awk                   |     2 +
 gawk-5.0.1/test/rswhite.in                    |     2 +
 gawk-5.0.1/test/rswhite.ok                    |     2 +
 gawk-5.0.1/test/rtlen.ok                      |     3 +
 gawk-5.0.1/test/rtlen.sh                      |     5 +
 gawk-5.0.1/test/rtlen01.ok                    |     3 +
 gawk-5.0.1/test/rtlen01.sh                    |     8 +
 gawk-5.0.1/test/rtlenmb.ok                    |     3 +
 gawk-5.0.1/test/rwarray.awk                   |    54 +
 gawk-5.0.1/test/rwarray.in                    |   780 +
 gawk-5.0.1/test/rwarray.ok                    |     3 +
 gawk-5.0.1/test/sandbox1.awk                  |     7 +
 gawk-5.0.1/test/sandbox1.ok                   |     2 +
 gawk-5.0.1/test/scalar.awk                    |     4 +
 gawk-5.0.1/test/scalar.ok                     |     2 +
 gawk-5.0.1/test/sclforin.awk                  |     1 +
 gawk-5.0.1/test/sclforin.ok                   |     2 +
 gawk-5.0.1/test/sclifin.awk                   |     7 +
 gawk-5.0.1/test/sclifin.ok                    |     2 +
 gawk-5.0.1/test/setrec0.awk                   |     8 +
 gawk-5.0.1/test/setrec0.in                    |     1 +
 gawk-5.0.1/test/setrec0.ok                    |     1 +
 gawk-5.0.1/test/setrec1.awk                   |     9 +
 gawk-5.0.1/test/setrec1.ok                    |     1 +
 gawk-5.0.1/test/shadow.awk                    |    21 +
 gawk-5.0.1/test/shadow.ok                     |     7 +
 gawk-5.0.1/test/shadowbuiltin.awk             |    10 +
 gawk-5.0.1/test/shadowbuiltin.ok              |     2 +
 gawk-5.0.1/test/sigpipe1.awk                  |    13 +
 gawk-5.0.1/test/sigpipe1.ok                   |     3 +
 gawk-5.0.1/test/sort1.awk                     |   127 +
 gawk-5.0.1/test/sort1.ok                      |   220 +
 gawk-5.0.1/test/sortempty.awk                 |     1 +
 gawk-5.0.1/test/sortempty.ok                  |     1 +
 gawk-5.0.1/test/sortfor.awk                   |     9 +
 gawk-5.0.1/test/sortfor.in                    |   289 +
 gawk-5.0.1/test/sortfor.ok                    |   578 +
 gawk-5.0.1/test/sortfor2.awk                  |    11 +
 gawk-5.0.1/test/sortfor2.in                   |     2 +
 gawk-5.0.1/test/sortfor2.ok                   |     2 +
 gawk-5.0.1/test/sortglos.awk                  |    51 +
 gawk-5.0.1/test/sortglos.in                   |    22 +
 gawk-5.0.1/test/sortglos.ok                   |    15 +
 gawk-5.0.1/test/sortu.awk                     |   118 +
 gawk-5.0.1/test/sortu.ok                      |    50 +
 gawk-5.0.1/test/sourcesplit.ok                |     3 +
 gawk-5.0.1/test/space.ok                      |     2 +
 gawk-5.0.1/test/spacere.awk                   |    22 +
 gawk-5.0.1/test/spacere.ok                    |    16 +
 gawk-5.0.1/test/split_after_fpat.awk          |    11 +
 gawk-5.0.1/test/split_after_fpat.in           |     1 +
 gawk-5.0.1/test/split_after_fpat.ok           |     4 +
 gawk-5.0.1/test/splitarg4.awk                 |   138 +
 gawk-5.0.1/test/splitarg4.in                  |    11 +
 gawk-5.0.1/test/splitarg4.ok                  |    92 +
 gawk-5.0.1/test/splitargv.awk                 |     7 +
 gawk-5.0.1/test/splitargv.in                  |     7 +
 gawk-5.0.1/test/splitargv.ok                  |     7 +
 gawk-5.0.1/test/splitarr.awk                  |     5 +
 gawk-5.0.1/test/splitarr.ok                   |     1 +
 gawk-5.0.1/test/splitdef.awk                  |     7 +
 gawk-5.0.1/test/splitdef.ok                   |     1 +
 gawk-5.0.1/test/splitvar.awk                  |     5 +
 gawk-5.0.1/test/splitvar.in                   |     1 +
 gawk-5.0.1/test/splitvar.ok                   |     1 +
 gawk-5.0.1/test/splitwht.awk                  |     7 +
 gawk-5.0.1/test/splitwht.ok                   |     2 +
 gawk-5.0.1/test/sprintfc.awk                  |     1 +
 gawk-5.0.1/test/sprintfc.in                   |     3 +
 gawk-5.0.1/test/sprintfc.ok                   |     3 +
 gawk-5.0.1/test/status-close.awk              |    14 +
 gawk-5.0.1/test/status-close.ok               |     6 +
 gawk-5.0.1/test/strcat1.awk                   |     6 +
 gawk-5.0.1/test/strcat1.ok                    |     1 +
 gawk-5.0.1/test/strftfld.awk                  |     3 +
 gawk-5.0.1/test/strftfld.in                   |     1 +
 gawk-5.0.1/test/strftfld.ok                   |     1 +
 gawk-5.0.1/test/strftime.awk                  |    35 +
 gawk-5.0.1/test/strftlng.awk                  |    11 +
 gawk-5.0.1/test/strftlng.ok                   |    58 +
 gawk-5.0.1/test/strnum1.awk                   |    35 +
 gawk-5.0.1/test/strnum1.ok                    |     2 +
 gawk-5.0.1/test/strnum2.awk                   |    18 +
 gawk-5.0.1/test/strnum2.ok                    |     4 +
 gawk-5.0.1/test/strtod.awk                    |     5 +
 gawk-5.0.1/test/strtod.in                     |     1 +
 gawk-5.0.1/test/strtod.ok                     |     2 +
 gawk-5.0.1/test/strtonum.awk                  |     6 +
 gawk-5.0.1/test/strtonum.ok                   |     4 +
 gawk-5.0.1/test/strtonum1.awk                 |     5 +
 gawk-5.0.1/test/strtonum1.ok                  |     2 +
 gawk-5.0.1/test/subamp.awk                    |     1 +
 gawk-5.0.1/test/subamp.in                     |     1 +
 gawk-5.0.1/test/subamp.ok                     |     1 +
 gawk-5.0.1/test/subback.awk                   |    16 +
 gawk-5.0.1/test/subback.in                    |     1 +
 gawk-5.0.1/test/subback.ok                    |    12 +
 gawk-5.0.1/test/subi18n.awk                   |    68 +
 gawk-5.0.1/test/subi18n.ok                    |     2 +
 gawk-5.0.1/test/subsepnm.awk                  |     1 +
 gawk-5.0.1/test/subsepnm.ok                   |     1 +
 gawk-5.0.1/test/subslash.awk                  |     6 +
 gawk-5.0.1/test/subslash.ok                   |     1 +
 gawk-5.0.1/test/substr.awk                    |    14 +
 gawk-5.0.1/test/substr.ok                     |    10 +
 gawk-5.0.1/test/swaplns.awk                   |     7 +
 gawk-5.0.1/test/swaplns.in                    |     9 +
 gawk-5.0.1/test/swaplns.ok                    |     9 +
 gawk-5.0.1/test/switch2.awk                   |    59 +
 gawk-5.0.1/test/switch2.ok                    |     0
 gawk-5.0.1/test/symtab1.awk                   |    21 +
 gawk-5.0.1/test/symtab1.ok                    |    31 +
 gawk-5.0.1/test/symtab10.awk                  |     1 +
 gawk-5.0.1/test/symtab10.in                   |     4 +
 gawk-5.0.1/test/symtab10.ok                   |    11 +
 gawk-5.0.1/test/symtab2.awk                   |     6 +
 gawk-5.0.1/test/symtab2.ok                    |     2 +
 gawk-5.0.1/test/symtab3.awk                   |     1 +
 gawk-5.0.1/test/symtab3.ok                    |     2 +
 gawk-5.0.1/test/symtab4.awk                   |     1 +
 gawk-5.0.1/test/symtab4.in                    |     2 +
 gawk-5.0.1/test/symtab4.ok                    |     2 +
 gawk-5.0.1/test/symtab5.awk                   |     1 +
 gawk-5.0.1/test/symtab5.in                    |     2 +
 gawk-5.0.1/test/symtab5.ok                    |     2 +
 gawk-5.0.1/test/symtab6.awk                   |     1 +
 gawk-5.0.1/test/symtab6.ok                    |     2 +
 gawk-5.0.1/test/symtab7.awk                   |     7 +
 gawk-5.0.1/test/symtab7.in                    |     3 +
 gawk-5.0.1/test/symtab7.ok                    |     2 +
 gawk-5.0.1/test/symtab8.awk                   |     5 +
 gawk-5.0.1/test/symtab8.in                    |     1 +
 gawk-5.0.1/test/symtab8.ok                    |    29 +
 gawk-5.0.1/test/symtab9.awk                   |    19 +
 gawk-5.0.1/test/symtab9.ok                    |     1 +
 gawk-5.0.1/test/synerr1.awk                   |     4 +
 gawk-5.0.1/test/synerr1.ok                    |     3 +
 gawk-5.0.1/test/synerr2.awk                   |    47 +
 gawk-5.0.1/test/synerr2.ok                    |     3 +
 gawk-5.0.1/test/synerr3.awk                   |     1 +
 gawk-5.0.1/test/synerr3.ok                    |     5 +
 gawk-5.0.1/test/tailrecurse.awk               |    15 +
 gawk-5.0.1/test/tailrecurse.ok                |     5 +
 gawk-5.0.1/test/testext.ok                    |    94 +
 gawk-5.0.1/test/time.awk                      |    22 +
 gawk-5.0.1/test/time.ok                       |     3 +
 gawk-5.0.1/test/timeout.awk                   |    26 +
 gawk-5.0.1/test/timeout.ok                    |    11 +
 gawk-5.0.1/test/tradanch.awk                  |     2 +
 gawk-5.0.1/test/tradanch.in                   |     2 +
 gawk-5.0.1/test/tradanch.ok                   |     0
 gawk-5.0.1/test/trailbs.awk                   |     1 +
 gawk-5.0.1/test/trailbs.in                    |     1 +
 gawk-5.0.1/test/trailbs.ok                    |     2 +
 gawk-5.0.1/test/tweakfld.awk                  |   296 +
 gawk-5.0.1/test/tweakfld.in                   |     3 +
 gawk-5.0.1/test/tweakfld.ok                   |     3 +
 gawk-5.0.1/test/typedregex1.awk               |   296 +
 gawk-5.0.1/test/typedregex1.ok                |    37 +
 gawk-5.0.1/test/typedregex2.awk               |    11 +
 gawk-5.0.1/test/typedregex2.ok                |     4 +
 gawk-5.0.1/test/typedregex3.awk               |    11 +
 gawk-5.0.1/test/typedregex3.ok                |     4 +
 gawk-5.0.1/test/typedregex4.awk               |     7 +
 gawk-5.0.1/test/typedregex4.ok                |     2 +
 gawk-5.0.1/test/typeof1.awk                   |     9 +
 gawk-5.0.1/test/typeof1.ok                    |     7 +
 gawk-5.0.1/test/typeof2.awk                   |    20 +
 gawk-5.0.1/test/typeof2.ok                    |     6 +
 gawk-5.0.1/test/typeof3.awk                   |    19 +
 gawk-5.0.1/test/typeof3.ok                    |     9 +
 gawk-5.0.1/test/typeof4.awk                   |    13 +
 gawk-5.0.1/test/typeof4.ok                    |     1 +
 gawk-5.0.1/test/typeof5.awk                   |    10 +
 gawk-5.0.1/test/typeof5.in                    |     1 +
 gawk-5.0.1/test/typeof5.ok                    |     4 +
 gawk-5.0.1/test/uninit2.awk                   |     2 +
 gawk-5.0.1/test/uninit2.ok                    |     4 +
 gawk-5.0.1/test/uninit3.awk                   |     7 +
 gawk-5.0.1/test/uninit3.ok                    |     3 +
 gawk-5.0.1/test/uninit4.awk                   |    13 +
 gawk-5.0.1/test/uninit4.ok                    |    10 +
 gawk-5.0.1/test/uninit5.awk                   |   111 +
 gawk-5.0.1/test/uninit5.ok                    |     9 +
 gawk-5.0.1/test/uninitialized.awk             |     3 +
 gawk-5.0.1/test/uninitialized.ok              |     1 +
 gawk-5.0.1/test/unterm.awk                    |     1 +
 gawk-5.0.1/test/unterm.ok                     |     5 +
 gawk-5.0.1/test/uparrfs.awk                   |     8 +
 gawk-5.0.1/test/uparrfs.in                    |     1 +
 gawk-5.0.1/test/uparrfs.ok                    |     4 +
 gawk-5.0.1/test/uplus.awk                     |     5 +
 gawk-5.0.1/test/uplus.ok                      |     3 +
 gawk-5.0.1/test/valgrind.awk                  |    43 +
 gawk-5.0.1/test/watchpoint1.awk               |    14 +
 gawk-5.0.1/test/watchpoint1.in                |     8 +
 gawk-5.0.1/test/watchpoint1.ok                |    65 +
 gawk-5.0.1/test/watchpoint1.script            |    14 +
 gawk-5.0.1/test/wideidx.awk                   |     7 +
 gawk-5.0.1/test/wideidx.in                    |     2 +
 gawk-5.0.1/test/wideidx.ok                    |     2 +
 gawk-5.0.1/test/wideidx2.awk                  |    89 +
 gawk-5.0.1/test/wideidx2.ok                   |     2 +
 gawk-5.0.1/test/widesub.awk                   |    12 +
 gawk-5.0.1/test/widesub.ok                    |     2 +
 gawk-5.0.1/test/widesub2.awk                  |     9 +
 gawk-5.0.1/test/widesub2.ok                   |     2 +
 gawk-5.0.1/test/widesub3.awk                  |     6 +
 gawk-5.0.1/test/widesub3.in                   |     2 +
 gawk-5.0.1/test/widesub3.ok                   |     4 +
 gawk-5.0.1/test/widesub4.awk                  |    54 +
 gawk-5.0.1/test/widesub4.ok                   |    10 +
 gawk-5.0.1/test/wjposer1.awk                  |    75 +
 gawk-5.0.1/test/wjposer1.in                   |  1527 +
 gawk-5.0.1/test/wjposer1.ok                   |  2068 +
 gawk-5.0.1/test/xref.awk                      |   139 +
 gawk-5.0.1/test/xref.original                 |   313 +
 gawk-5.0.1/test/zero2.awk                     |     5 +
 gawk-5.0.1/test/zero2.ok                      |     3 +
 gawk-5.0.1/test/zeroe0.awk                    |    40 +
 gawk-5.0.1/test/zeroe0.ok                     |     2 +
 gawk-5.0.1/test/zeroflag.awk                  |     1 +
 gawk-5.0.1/test/zeroflag.ok                   |     1 +
 gawk-5.0.1/version.c                          |     3 +
 gawk-5.0.1/vms/ChangeLog                      |     9 +
 gawk-5.0.1/vms/ChangeLog.0                    |   699 +
 gawk-5.0.1/vms/ChangeLog.1                    |   508 +
 gawk-5.0.1/vms/backup_gawk_src.com            |   113 +
 gawk-5.0.1/vms/build_gawk_pcsi_desc.com       |   435 +
 gawk-5.0.1/vms/build_gawk_pcsi_text.com       |   179 +
 gawk-5.0.1/vms/build_gawk_release_notes.com   |    67 +
 gawk-5.0.1/vms/compare_gawk_source.com        |   369 +
 gawk-5.0.1/vms/config_h.com                   |  1661 +
 gawk-5.0.1/vms/descrip.mms                    |   418 +
 gawk-5.0.1/vms/gawk.cld                       |    79 +
 gawk-5.0.1/vms/gawk.hlp                       |  1704 +
 gawk-5.0.1/vms/gawk_alias_setup.com           |   137 +
 gawk-5.0.1/vms/gawk_build_steps.txt           |   220 +
 gawk-5.0.1/vms/gawk_ident.com                 |    21 +
 gawk-5.0.1/vms/gawk_plugin.opt                |     5 +
 gawk-5.0.1/vms/gawk_release_note_start.txt    |   200 +
 gawk-5.0.1/vms/gawk_verb.com                  |    26 +
 gawk-5.0.1/vms/gawkmisc.vms                   |   662 +
 gawk-5.0.1/vms/generate_config_vms_h_gawk.com |   313 +
 gawk-5.0.1/vms/gnv_gawk_startup.com           |    75 +
 gawk-5.0.1/vms/make_pcsi_gawk_kit_name.com    |   189 +
 gawk-5.0.1/vms/pcsi_gawk_file_list.txt        |   120 +
 gawk-5.0.1/vms/pcsi_product_gawk.com          |   186 +
 gawk-5.0.1/vms/posix-cc.sh                    |    16 +
 gawk-5.0.1/vms/redirect.h                     |   133 +
 gawk-5.0.1/vms/remove_old_gawk.com            |   116 +
 gawk-5.0.1/vms/stage_gawk_install.com         |   300 +
 gawk-5.0.1/vms/unixlib.h                      |    27 +
 gawk-5.0.1/vms/varargs.h                      |    38 +
 gawk-5.0.1/vms/vax/ChangeLog                  |    39 +
 gawk-5.0.1/vms/vax/gawk_plugin_xfer.mar_exact |    13 +
 gawk-5.0.1/vms/vax/gawk_plugin_xfer.opt       |     5 +
 gawk-5.0.1/vms/vax/macro32_exactcase.com      |    16 +
 gawk-5.0.1/vms/vms.h                          |   119 +
 gawk-5.0.1/vms/vms_args.c                     |   442 +
 gawk-5.0.1/vms/vms_cli.c                      |   120 +
 gawk-5.0.1/vms/vms_crtl_init.c                |   470 +
 gawk-5.0.1/vms/vms_fwrite.c                   |   219 +
 gawk-5.0.1/vms/vms_gawk.c                     |   290 +
 gawk-5.0.1/vms/vms_misc.c                     |   376 +
 gawk-5.0.1/vms/vms_popen.c                    |   359 +
 gawk-5.0.1/vms/vms_sort.com                   |     4 +
 gawk-5.0.1/vms/vmsbuild.com                   |   145 +
 gawk-5.0.1/vms/vmstest.com                    |  4297 ++
 gawk-5.0.1/ylwrap                             |   247 +
 1880 files changed, 588976 insertions(+)
 create mode 100644 gawk-5.0.1/ABOUT-NLS
 create mode 100644 gawk-5.0.1/AUTHORS
 create mode 100644 gawk-5.0.1/COPYING
 create mode 100644 gawk-5.0.1/ChangeLog
 create mode 100644 gawk-5.0.1/ChangeLog.0
 create mode 100644 gawk-5.0.1/ChangeLog.1
 create mode 100644 gawk-5.0.1/INSTALL
 create mode 100644 gawk-5.0.1/Makefile.am
 create mode 100644 gawk-5.0.1/Makefile.in
 create mode 100644 gawk-5.0.1/NEWS
 create mode 100644 gawk-5.0.1/NEWS.0
 create mode 100644 gawk-5.0.1/NEWS.1
 create mode 100644 gawk-5.0.1/POSIX.STD
 create mode 100644 gawk-5.0.1/README
 create mode 100644 gawk-5.0.1/README_d/ChangeLog
 create mode 100644 gawk-5.0.1/README_d/ChangeLog.0
 create mode 100644 gawk-5.0.1/README_d/ChangeLog.1
 create mode 100644 gawk-5.0.1/README_d/README.VMS
 create mode 100644 gawk-5.0.1/README_d/README.aix
 create mode 100644 gawk-5.0.1/README_d/README.alpine
 create mode 100644 gawk-5.0.1/README_d/README.bootstrap
 create mode 100644 gawk-5.0.1/README_d/README.cmake
 create mode 100644 gawk-5.0.1/README_d/README.freebsd
 create mode 100644 gawk-5.0.1/README_d/README.gcc-3
 create mode 100644 gawk-5.0.1/README_d/README.hacking
 create mode 100644 gawk-5.0.1/README_d/README.macosx
 create mode 100644 gawk-5.0.1/README_d/README.mpfr
 create mode 100644 gawk-5.0.1/README_d/README.multibyte
 create mode 100644 gawk-5.0.1/README_d/README.os2
 create mode 100644 gawk-5.0.1/README_d/README.pc
 create mode 100644 gawk-5.0.1/README_d/README.rpm
 create mode 100644 gawk-5.0.1/README_d/README.solaris
 create mode 100644 gawk-5.0.1/README_d/README.tests
 create mode 100644 gawk-5.0.1/README_d/README.zLinux
 create mode 100644 gawk-5.0.1/README_d/README.zos
 create mode 100644 gawk-5.0.1/TODO
 create mode 100644 gawk-5.0.1/aclocal.m4
 create mode 100644 gawk-5.0.1/array.c
 create mode 100644 gawk-5.0.1/awk.h
 create mode 100644 gawk-5.0.1/awkgram.c
 create mode 100644 gawk-5.0.1/awkgram.y
 create mode 100644 gawk-5.0.1/awklib/ChangeLog
 create mode 100644 gawk-5.0.1/awklib/ChangeLog.0
 create mode 100644 gawk-5.0.1/awklib/ChangeLog.1
 create mode 100644 gawk-5.0.1/awklib/Makefile.am
 create mode 100644 gawk-5.0.1/awklib/Makefile.in
 create mode 100644 gawk-5.0.1/awklib/eg/data/class_data1
 create mode 100644 gawk-5.0.1/awklib/eg/data/class_data2
 create mode 100644 gawk-5.0.1/awklib/eg/data/guide-mellow.po
 create mode 100644 gawk-5.0.1/awklib/eg/data/guide.po
 create mode 100644 gawk-5.0.1/awklib/eg/data/inventory-shipped
 create mode 100644 gawk-5.0.1/awklib/eg/data/mail-list
 create mode 100644 gawk-5.0.1/awklib/eg/lib/assert.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/bits2str.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/cliff_rand.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/ctime.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/ftrans.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/getopt.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/gettime.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/grcat.c
 create mode 100644 gawk-5.0.1/awklib/eg/lib/groupawk.in
 create mode 100644 gawk-5.0.1/awklib/eg/lib/have_mpfr.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/inplace.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/intdiv0.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/join.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/libintl.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/noassign.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/ns_passwd.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/ord.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/passwdawk.in
 create mode 100644 gawk-5.0.1/awklib/eg/lib/processarray.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/pwcat.c
 create mode 100644 gawk-5.0.1/awklib/eg/lib/quicksort.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/readable.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/readfile.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/rewind.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/round.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/shellquote.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/strtonum.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/walkarray.awk
 create mode 100644 gawk-5.0.1/awklib/eg/lib/zerofile.awk
 create mode 100644 gawk-5.0.1/awklib/eg/misc/addresses.csv
 create mode 100644 gawk-5.0.1/awklib/eg/misc/arraymax.awk
 create mode 100644 gawk-5.0.1/awklib/eg/misc/arraymax.data
 create mode 100644 gawk-5.0.1/awklib/eg/misc/findpat.awk
 create mode 100644 gawk-5.0.1/awklib/eg/misc/findpat.data
 create mode 100644 gawk-5.0.1/awklib/eg/misc/simple-csv.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/PostAgent.sh
 create mode 100644 gawk-5.0.1/awklib/eg/network/coreserv.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/eliza.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/fingerclient.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/geturl.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/hello-serv.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/maze.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/mobag.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/panic.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/protbase.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/protbase.request
 create mode 100644 gawk-5.0.1/awklib/eg/network/protbase.result
 create mode 100644 gawk-5.0.1/awklib/eg/network/remconf.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/statist.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/stoxdata.txt
 create mode 100644 gawk-5.0.1/awklib/eg/network/stoxpred.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/testserv.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/urlchk.awk
 create mode 100644 gawk-5.0.1/awklib/eg/network/webgrab.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/alarm.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/anagram.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/awksed.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/cut.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/dupword.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/egrep.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/extract.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/guide.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/histsort.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/id.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/igawk.sh
 create mode 100644 gawk-5.0.1/awklib/eg/prog/indirectcall.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/labels.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/pi.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/split.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/tee.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/testbits.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/translate.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/uniq.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/wc.awk
 create mode 100644 gawk-5.0.1/awklib/eg/prog/wordfreq.awk
 create mode 100644 gawk-5.0.1/awklib/extract.awk
 create mode 100644 gawk-5.0.1/awklib/stamp-eg
 create mode 100644 gawk-5.0.1/builtin.c
 create mode 100644 gawk-5.0.1/cint_array.c
 create mode 100644 gawk-5.0.1/cmd.h
 create mode 100644 gawk-5.0.1/command.c
 create mode 100644 gawk-5.0.1/command.y
 create mode 100755 gawk-5.0.1/compile
 create mode 100755 gawk-5.0.1/config.guess
 create mode 100755 gawk-5.0.1/config.rpath
 create mode 100755 gawk-5.0.1/config.sub
 create mode 100644 gawk-5.0.1/configh.in
 create mode 100755 gawk-5.0.1/configure
 create mode 100644 gawk-5.0.1/configure.ac
 create mode 100644 gawk-5.0.1/custom.h
 create mode 100644 gawk-5.0.1/debug.c
 create mode 100755 gawk-5.0.1/depcomp
 create mode 100644 gawk-5.0.1/doc/ChangeLog
 create mode 100644 gawk-5.0.1/doc/ChangeLog.0
 create mode 100644 gawk-5.0.1/doc/ChangeLog.1
 create mode 100644 gawk-5.0.1/doc/Makefile.am
 create mode 100644 gawk-5.0.1/doc/Makefile.in
 create mode 100644 gawk-5.0.1/doc/README.card
 create mode 100644 gawk-5.0.1/doc/ad.block
 create mode 100644 gawk-5.0.1/doc/api-figure1.eps
 create mode 100644 gawk-5.0.1/doc/api-figure1.fig
 create mode 100644 gawk-5.0.1/doc/api-figure1.pdf
 create mode 100644 gawk-5.0.1/doc/api-figure1.png
 create mode 100644 gawk-5.0.1/doc/api-figure1.txt
 create mode 100644 gawk-5.0.1/doc/api-figure2.eps
 create mode 100644 gawk-5.0.1/doc/api-figure2.fig
 create mode 100644 gawk-5.0.1/doc/api-figure2.pdf
 create mode 100644 gawk-5.0.1/doc/api-figure2.png
 create mode 100644 gawk-5.0.1/doc/api-figure2.txt
 create mode 100644 gawk-5.0.1/doc/api-figure3.eps
 create mode 100644 gawk-5.0.1/doc/api-figure3.fig
 create mode 100644 gawk-5.0.1/doc/api-figure3.pdf
 create mode 100644 gawk-5.0.1/doc/api-figure3.png
 create mode 100644 gawk-5.0.1/doc/api-figure3.txt
 create mode 100644 gawk-5.0.1/doc/array-elements.eps
 create mode 100644 gawk-5.0.1/doc/array-elements.fig
 create mode 100644 gawk-5.0.1/doc/array-elements.pdf
 create mode 100644 gawk-5.0.1/doc/array-elements.png
 create mode 100644 gawk-5.0.1/doc/array-elements.txt
 create mode 100644 gawk-5.0.1/doc/awkcard.in
 create mode 100644 gawk-5.0.1/doc/awkforai.txt
 create mode 100644 gawk-5.0.1/doc/bc_notes
 create mode 100644 gawk-5.0.1/doc/cardfonts
 create mode 100644 gawk-5.0.1/doc/colors
 create mode 100644 gawk-5.0.1/doc/gawk.1
 create mode 100644 gawk-5.0.1/doc/gawk.texi
 create mode 100644 gawk-5.0.1/doc/gawkinet.texi
 create mode 100644 gawk-5.0.1/doc/gawktexi.in
 create mode 100644 gawk-5.0.1/doc/gawkworkflow.texi
 create mode 100644 gawk-5.0.1/doc/general-program.eps
 create mode 100644 gawk-5.0.1/doc/general-program.fig
 create mode 100644 gawk-5.0.1/doc/general-program.pdf
 create mode 100644 gawk-5.0.1/doc/general-program.png
 create mode 100644 gawk-5.0.1/doc/general-program.txt
 create mode 100644 gawk-5.0.1/doc/it/ChangeLog
 create mode 100644 gawk-5.0.1/doc/it/api-figura1.eps
 create mode 100644 gawk-5.0.1/doc/it/api-figura1.fig
 create mode 100644 gawk-5.0.1/doc/it/api-figura1.pdf
 create mode 100644 gawk-5.0.1/doc/it/api-figura1.png
 create mode 100644 gawk-5.0.1/doc/it/api-figura1.txt
 create mode 100644 gawk-5.0.1/doc/it/api-figura2.eps
 create mode 100644 gawk-5.0.1/doc/it/api-figura2.fig
 create mode 100644 gawk-5.0.1/doc/it/api-figura2.pdf
 create mode 100644 gawk-5.0.1/doc/it/api-figura2.png
 create mode 100644 gawk-5.0.1/doc/it/api-figura2.txt
 create mode 100644 gawk-5.0.1/doc/it/api-figura3.eps
 create mode 100644 gawk-5.0.1/doc/it/api-figura3.fig
 create mode 100644 gawk-5.0.1/doc/it/api-figura3.pdf
 create mode 100644 gawk-5.0.1/doc/it/api-figura3.png
 create mode 100644 gawk-5.0.1/doc/it/api-figura3.txt
 create mode 100755 gawk-5.0.1/doc/it/compila_originale.sh
 create mode 100755 gawk-5.0.1/doc/it/compila_smallprint.sh
 create mode 100644 gawk-5.0.1/doc/it/epsf.tex
 create mode 100644 gawk-5.0.1/doc/it/flusso-elaborazione.eps
 create mode 100644 gawk-5.0.1/doc/it/flusso-elaborazione.fig
 create mode 100644 gawk-5.0.1/doc/it/flusso-elaborazione.pdf
 create mode 100644 gawk-5.0.1/doc/it/flusso-elaborazione.png
 create mode 100644 gawk-5.0.1/doc/it/flusso-elaborazione.txt
 create mode 100644 gawk-5.0.1/doc/it/gawk.1
 create mode 100644 gawk-5.0.1/doc/it/gawktexi.in
 create mode 100644 gawk-5.0.1/doc/it/lflashlight-small.xpic
 create mode 100644 gawk-5.0.1/doc/it/lflashlight.eps
 create mode 100644 gawk-5.0.1/doc/it/lflashlight.pdf
 create mode 100644 gawk-5.0.1/doc/it/margini.texi
 create mode 100644 gawk-5.0.1/doc/it/programma-generico.eps
 create mode 100644 gawk-5.0.1/doc/it/programma-generico.fig
 create mode 100644 gawk-5.0.1/doc/it/programma-generico.pdf
 create mode 100644 gawk-5.0.1/doc/it/programma-generico.png
 create mode 100644 gawk-5.0.1/doc/it/programma-generico.txt
 create mode 100644 gawk-5.0.1/doc/it/rflashlight-small.xpic
 create mode 100644 gawk-5.0.1/doc/it/rflashlight.eps
 create mode 100644 gawk-5.0.1/doc/it/rflashlight.pdf
 create mode 100644 gawk-5.0.1/doc/it/sidebar.awk
 create mode 100644 gawk-5.0.1/doc/it/texinfo.tex
 create mode 100644 gawk-5.0.1/doc/it/txi-it.tex
 create mode 100644 gawk-5.0.1/doc/it/vettore-elementi.eps
 create mode 100644 gawk-5.0.1/doc/it/vettore-elementi.fig
 create mode 100644 gawk-5.0.1/doc/it/vettore-elementi.pdf
 create mode 100644 gawk-5.0.1/doc/it/vettore-elementi.png
 create mode 100644 gawk-5.0.1/doc/it/vettore-elementi.txt
 create mode 100644 gawk-5.0.1/doc/lflashlight-small.xpic
 create mode 100644 gawk-5.0.1/doc/lflashlight.eps
 create mode 100644 gawk-5.0.1/doc/lflashlight.pdf
 create mode 100644 gawk-5.0.1/doc/macros
 create mode 100644 gawk-5.0.1/doc/no.colors
 create mode 100644 gawk-5.0.1/doc/process-flow.eps
 create mode 100644 gawk-5.0.1/doc/process-flow.fig
 create mode 100644 gawk-5.0.1/doc/process-flow.pdf
 create mode 100644 gawk-5.0.1/doc/process-flow.png
 create mode 100644 gawk-5.0.1/doc/process-flow.txt
 create mode 100644 gawk-5.0.1/doc/rflashlight-small.xpic
 create mode 100644 gawk-5.0.1/doc/rflashlight.eps
 create mode 100644 gawk-5.0.1/doc/rflashlight.pdf
 create mode 100644 gawk-5.0.1/doc/setter.outline
 create mode 100644 gawk-5.0.1/doc/sidebar.awk
 create mode 100644 gawk-5.0.1/doc/statist.eps
 create mode 100644 gawk-5.0.1/doc/statist.jpg
 create mode 100644 gawk-5.0.1/doc/statist.pdf
 create mode 100644 gawk-5.0.1/doc/texinfo.tex
 create mode 100644 gawk-5.0.1/doc/wordlist
 create mode 100644 gawk-5.0.1/doc/wordlist2
 create mode 100644 gawk-5.0.1/doc/wordlist3
 create mode 100644 gawk-5.0.1/eval.c
 create mode 100644 gawk-5.0.1/ext.c
 create mode 100644 gawk-5.0.1/extension/ABOUT-NLS
 create mode 100644 gawk-5.0.1/extension/AUTHORS
 create mode 100644 gawk-5.0.1/extension/COPYING
 create mode 100644 gawk-5.0.1/extension/ChangeLog
 create mode 100644 gawk-5.0.1/extension/ChangeLog.0
 create mode 100644 gawk-5.0.1/extension/ChangeLog.1
 create mode 100644 gawk-5.0.1/extension/INSTALL
 create mode 100644 gawk-5.0.1/extension/Makefile.am
 create mode 100644 gawk-5.0.1/extension/Makefile.in
 create mode 100644 gawk-5.0.1/extension/NEWS
 create mode 100644 gawk-5.0.1/extension/README
 create mode 100644 gawk-5.0.1/extension/README.fts
 create mode 100644 gawk-5.0.1/extension/aclocal.m4
 create mode 100644 gawk-5.0.1/extension/build-aux/ChangeLog
 create mode 100755 gawk-5.0.1/extension/build-aux/ar-lib
 create mode 100755 gawk-5.0.1/extension/build-aux/compile
 create mode 100755 gawk-5.0.1/extension/build-aux/config.guess
 create mode 100755 gawk-5.0.1/extension/build-aux/config.rpath
 create mode 100755 gawk-5.0.1/extension/build-aux/config.sub
 create mode 100755 gawk-5.0.1/extension/build-aux/depcomp
 create mode 100755 gawk-5.0.1/extension/build-aux/install-sh
 create mode 100644 gawk-5.0.1/extension/build-aux/ltmain.sh
 create mode 100755 gawk-5.0.1/extension/build-aux/missing
 create mode 100644 gawk-5.0.1/extension/configh.in
 create mode 100755 gawk-5.0.1/extension/configure
 create mode 100644 gawk-5.0.1/extension/configure.ac
 create mode 100644 gawk-5.0.1/extension/ext_custom.h
 create mode 100644 gawk-5.0.1/extension/filefuncs.3am
 create mode 100644 gawk-5.0.1/extension/filefuncs.c
 create mode 100644 gawk-5.0.1/extension/fnmatch.3am
 create mode 100644 gawk-5.0.1/extension/fnmatch.c
 create mode 100644 gawk-5.0.1/extension/fork.3am
 create mode 100644 gawk-5.0.1/extension/fork.c
 create mode 100644 gawk-5.0.1/extension/fts.3
 create mode 100644 gawk-5.0.1/extension/gawkdirfd.h
 create mode 100644 gawk-5.0.1/extension/gawkfts.c
 create mode 100644 gawk-5.0.1/extension/gawkfts.h
 create mode 100644 gawk-5.0.1/extension/inplace.3am
 create mode 100644 gawk-5.0.1/extension/inplace.c
 create mode 100644 gawk-5.0.1/extension/intdiv.c
 create mode 100644 gawk-5.0.1/extension/m4/ChangeLog
 create mode 100644 gawk-5.0.1/extension/m4/codeset.m4
 create mode 100644 gawk-5.0.1/extension/m4/dirfd.m4
 create mode 100644 gawk-5.0.1/extension/m4/extern-inline.m4
 create mode 100644 gawk-5.0.1/extension/m4/fcntl-o.m4
 create mode 100644 gawk-5.0.1/extension/m4/gettext.m4
 create mode 100644 gawk-5.0.1/extension/m4/glibc2.m4
 create mode 100644 gawk-5.0.1/extension/m4/glibc21.m4
 create mode 100644 gawk-5.0.1/extension/m4/iconv.m4
 create mode 100644 gawk-5.0.1/extension/m4/intdiv0.m4
 create mode 100644 gawk-5.0.1/extension/m4/intl.m4
 create mode 100644 gawk-5.0.1/extension/m4/intldir.m4
 create mode 100644 gawk-5.0.1/extension/m4/intlmacosx.m4
 create mode 100644 gawk-5.0.1/extension/m4/intmax.m4
 create mode 100644 gawk-5.0.1/extension/m4/inttypes-pri.m4
 create mode 100644 gawk-5.0.1/extension/m4/inttypes_h.m4
 create mode 100644 gawk-5.0.1/extension/m4/lcmessage.m4
 create mode 100644 gawk-5.0.1/extension/m4/lib-ld.m4
 create mode 100644 gawk-5.0.1/extension/m4/lib-link.m4
 create mode 100644 gawk-5.0.1/extension/m4/lib-prefix.m4
 create mode 100644 gawk-5.0.1/extension/m4/libtool.m4
 create mode 100644 gawk-5.0.1/extension/m4/lock.m4
 create mode 100644 gawk-5.0.1/extension/m4/longlong.m4
 create mode 100644 gawk-5.0.1/extension/m4/ltoptions.m4
 create mode 100644 gawk-5.0.1/extension/m4/ltsugar.m4
 create mode 100644 gawk-5.0.1/extension/m4/ltversion.m4
 create mode 100644 gawk-5.0.1/extension/m4/lt~obsolete.m4
 create mode 100644 gawk-5.0.1/extension/m4/nls.m4
 create mode 100644 gawk-5.0.1/extension/m4/po.m4
 create mode 100644 gawk-5.0.1/extension/m4/printf-posix.m4
 create mode 100644 gawk-5.0.1/extension/m4/progtest.m4
 create mode 100644 gawk-5.0.1/extension/m4/size_max.m4
 create mode 100644 gawk-5.0.1/extension/m4/stdint_h.m4
 create mode 100644 gawk-5.0.1/extension/m4/threadlib.m4
 create mode 100644 gawk-5.0.1/extension/m4/uintmax_t.m4
 create mode 100644 gawk-5.0.1/extension/m4/visibility.m4
 create mode 100644 gawk-5.0.1/extension/m4/wchar_t.m4
 create mode 100644 gawk-5.0.1/extension/m4/wint_t.m4
 create mode 100644 gawk-5.0.1/extension/m4/xsize.m4
 create mode 100644 gawk-5.0.1/extension/ordchr.3am
 create mode 100644 gawk-5.0.1/extension/ordchr.c
 create mode 100644 gawk-5.0.1/extension/po/ChangeLog
 create mode 100644 gawk-5.0.1/extension/po/Makefile.in.in
 create mode 100644 gawk-5.0.1/extension/po/Makevars
 create mode 100644 gawk-5.0.1/extension/po/POTFILES.in
 create mode 100644 gawk-5.0.1/extension/po/Rules-quot
 create mode 100644 gawk-5.0.1/extension/po/boldquot.sed
 create mode 100644 gawk-5.0.1/extension/po/en@boldquot.header
 create mode 100644 gawk-5.0.1/extension/po/en@quot.header
 create mode 100644 gawk-5.0.1/extension/po/gawk-extensions.pot
 create mode 100644 gawk-5.0.1/extension/po/insert-header.sin
 create mode 100644 gawk-5.0.1/extension/po/quot.sed
 create mode 100644 gawk-5.0.1/extension/po/remove-potcdate.sin
 create mode 100644 gawk-5.0.1/extension/po/stamp-po
 create mode 100644 gawk-5.0.1/extension/readdir.3am
 create mode 100644 gawk-5.0.1/extension/readdir.c
 create mode 100644 gawk-5.0.1/extension/readdir_test.c
 create mode 100644 gawk-5.0.1/extension/readfile.3am
 create mode 100644 gawk-5.0.1/extension/readfile.c
 create mode 100644 gawk-5.0.1/extension/revoutput.3am
 create mode 100644 gawk-5.0.1/extension/revoutput.c
 create mode 100644 gawk-5.0.1/extension/revtwoway.3am
 create mode 100644 gawk-5.0.1/extension/revtwoway.c
 create mode 100644 gawk-5.0.1/extension/rwarray.3am
 create mode 100644 gawk-5.0.1/extension/rwarray.c
 create mode 100644 gawk-5.0.1/extension/rwarray0.c
 create mode 100644 gawk-5.0.1/extension/stack.c
 create mode 100644 gawk-5.0.1/extension/stack.h
 create mode 100644 gawk-5.0.1/extension/testext.c
 create mode 100644 gawk-5.0.1/extension/time.3am
 create mode 100644 gawk-5.0.1/extension/time.c
 create mode 100644 gawk-5.0.1/extras/ChangeLog
 create mode 100644 gawk-5.0.1/extras/Makefile.am
 create mode 100644 gawk-5.0.1/extras/Makefile.in
 create mode 100644 gawk-5.0.1/extras/gawk.csh
 create mode 100644 gawk-5.0.1/extras/gawk.sh
 create mode 100644 gawk-5.0.1/field.c
 create mode 100644 gawk-5.0.1/floatcomp.c
 create mode 100644 gawk-5.0.1/floatmagic.h
 create mode 100644 gawk-5.0.1/gawkapi.c
 create mode 100644 gawk-5.0.1/gawkapi.h
 create mode 100644 gawk-5.0.1/gawkmisc.c
 create mode 100644 gawk-5.0.1/gettext.h
 create mode 100755 gawk-5.0.1/install-sh
 create mode 100644 gawk-5.0.1/int_array.c
 create mode 100644 gawk-5.0.1/interpret.h
 create mode 100644 gawk-5.0.1/io.c
 create mode 100644 gawk-5.0.1/m4/ChangeLog
 create mode 100644 gawk-5.0.1/m4/ChangeLog.0
 create mode 100644 gawk-5.0.1/m4/ChangeLog.1
 create mode 100644 gawk-5.0.1/m4/arch.m4
 create mode 100644 gawk-5.0.1/m4/codeset.m4
 create mode 100644 gawk-5.0.1/m4/extern-inline.m4
 create mode 100644 gawk-5.0.1/m4/fcntl-o.m4
 create mode 100644 gawk-5.0.1/m4/gettext.m4
 create mode 100644 gawk-5.0.1/m4/glibc2.m4
 create mode 100644 gawk-5.0.1/m4/glibc21.m4
 create mode 100644 gawk-5.0.1/m4/iconv.m4
 create mode 100644 gawk-5.0.1/m4/intdiv0.m4
 create mode 100644 gawk-5.0.1/m4/intl.m4
 create mode 100644 gawk-5.0.1/m4/intldir.m4
 create mode 100644 gawk-5.0.1/m4/intlmacosx.m4
 create mode 100644 gawk-5.0.1/m4/intmax.m4
 create mode 100644 gawk-5.0.1/m4/intmax_t.m4
 create mode 100644 gawk-5.0.1/m4/inttypes-pri.m4
 create mode 100644 gawk-5.0.1/m4/inttypes.m4
 create mode 100644 gawk-5.0.1/m4/inttypes_h.m4
 create mode 100644 gawk-5.0.1/m4/lcmessage.m4
 create mode 100644 gawk-5.0.1/m4/lib-ld.m4
 create mode 100644 gawk-5.0.1/m4/lib-link.m4
 create mode 100644 gawk-5.0.1/m4/lib-prefix.m4
 create mode 100644 gawk-5.0.1/m4/libsigsegv.m4
 create mode 100644 gawk-5.0.1/m4/lock.m4
 create mode 100644 gawk-5.0.1/m4/longdouble.m4
 create mode 100644 gawk-5.0.1/m4/longlong.m4
 create mode 100644 gawk-5.0.1/m4/mpfr.m4
 create mode 100644 gawk-5.0.1/m4/nls.m4
 create mode 100644 gawk-5.0.1/m4/noreturn.m4
 create mode 100644 gawk-5.0.1/m4/po.m4
 create mode 100644 gawk-5.0.1/m4/printf-posix.m4
 create mode 100644 gawk-5.0.1/m4/progtest.m4
 create mode 100644 gawk-5.0.1/m4/readline.m4
 create mode 100644 gawk-5.0.1/m4/signed.m4
 create mode 100644 gawk-5.0.1/m4/size_max.m4
 create mode 100644 gawk-5.0.1/m4/socket.m4
 create mode 100644 gawk-5.0.1/m4/stdint_h.m4
 create mode 100644 gawk-5.0.1/m4/threadlib.m4
 create mode 100644 gawk-5.0.1/m4/uintmax_t.m4
 create mode 100644 gawk-5.0.1/m4/ulonglong.m4
 create mode 100644 gawk-5.0.1/m4/visibility.m4
 create mode 100644 gawk-5.0.1/m4/wchar_t.m4
 create mode 100644 gawk-5.0.1/m4/wint_t.m4
 create mode 100644 gawk-5.0.1/m4/xsize.m4
 create mode 100644 gawk-5.0.1/main.c
 create mode 100644 gawk-5.0.1/mbsupport.h
 create mode 100755 gawk-5.0.1/missing
 create mode 100644 gawk-5.0.1/missing_d/COPYING.LIB
 create mode 100644 gawk-5.0.1/missing_d/ChangeLog
 create mode 100644 gawk-5.0.1/missing_d/ChangeLog.0
 create mode 100644 gawk-5.0.1/missing_d/ChangeLog.1
 create mode 100644 gawk-5.0.1/missing_d/README
 create mode 100644 gawk-5.0.1/missing_d/fnmatch.c
 create mode 100644 gawk-5.0.1/missing_d/fnmatch.h
 create mode 100644 gawk-5.0.1/missing_d/getaddrinfo.c
 create mode 100644 gawk-5.0.1/missing_d/getaddrinfo.h
 create mode 100644 gawk-5.0.1/missing_d/memcmp.c
 create mode 100644 gawk-5.0.1/missing_d/memcpy.c
 create mode 100644 gawk-5.0.1/missing_d/memmove.c
 create mode 100644 gawk-5.0.1/missing_d/memset.c
 create mode 100644 gawk-5.0.1/missing_d/mktime-internal.h
 create mode 100644 gawk-5.0.1/missing_d/mktime.c
 create mode 100644 gawk-5.0.1/missing_d/setenv.c
 create mode 100644 gawk-5.0.1/missing_d/snprintf.c
 create mode 100644 gawk-5.0.1/missing_d/strchr.c
 create mode 100644 gawk-5.0.1/missing_d/strcoll.c
 create mode 100644 gawk-5.0.1/missing_d/strerror.c
 create mode 100644 gawk-5.0.1/missing_d/strftime.c
 create mode 100644 gawk-5.0.1/missing_d/strncasecmp.c
 create mode 100644 gawk-5.0.1/missing_d/strtod.c
 create mode 100644 gawk-5.0.1/missing_d/strtoul.c
 create mode 100644 gawk-5.0.1/missing_d/system.c
 create mode 100644 gawk-5.0.1/missing_d/timegm.c
 create mode 100644 gawk-5.0.1/missing_d/tzset.c
 create mode 100644 gawk-5.0.1/missing_d/usleep.c
 create mode 100644 gawk-5.0.1/missing_d/wcmisc.c
 create mode 100755 gawk-5.0.1/mkinstalldirs
 create mode 100644 gawk-5.0.1/mpfr.c
 create mode 100644 gawk-5.0.1/msg.c
 create mode 100644 gawk-5.0.1/node.c
 create mode 100644 gawk-5.0.1/nonposix.h
 create mode 100644 gawk-5.0.1/pc/ChangeLog
 create mode 100644 gawk-5.0.1/pc/ChangeLog.0
 create mode 100644 gawk-5.0.1/pc/ChangeLog.1
 create mode 100644 gawk-5.0.1/pc/GenMakefileTst.awk
 create mode 100644 gawk-5.0.1/pc/Makefile
 create mode 100644 gawk-5.0.1/pc/Makefile.ext
 create mode 100644 gawk-5.0.1/pc/Makefile.tst
 create mode 100644 gawk-5.0.1/pc/Makefile.tst.prologue
 create mode 100644 gawk-5.0.1/pc/awklib/igawk
 create mode 100644 gawk-5.0.1/pc/awklib/igawk.awk
 create mode 100644 gawk-5.0.1/pc/awklib/igawk.bat
 create mode 100644 gawk-5.0.1/pc/config.sed
 create mode 100644 gawk-5.0.1/pc/configpk.sed
 create mode 100644 gawk-5.0.1/pc/dlfcn.h
 create mode 100644 gawk-5.0.1/pc/gawk.def
 create mode 100644 gawk-5.0.1/pc/gawkmisc.pc
 create mode 100644 gawk-5.0.1/pc/getid.c
 create mode 100644 gawk-5.0.1/pc/in.h
 create mode 100644 gawk-5.0.1/pc/install.awk
 create mode 100644 gawk-5.0.1/pc/langinfo.h
 create mode 100755 gawk-5.0.1/pc/make-config.bat
 create mode 100644 gawk-5.0.1/pc/mkinstal.sh
 create mode 100644 gawk-5.0.1/pc/popen.c
 create mode 100644 gawk-5.0.1/pc/popen.h
 create mode 100644 gawk-5.0.1/pc/socket.h
 create mode 100644 gawk-5.0.1/pc/testoutcmp.awk
 create mode 100644 gawk-5.0.1/po/ChangeLog
 create mode 100644 gawk-5.0.1/po/ChangeLog.0
 create mode 100644 gawk-5.0.1/po/ChangeLog.1
 create mode 100644 gawk-5.0.1/po/LINGUAS
 create mode 100644 gawk-5.0.1/po/Makefile.in.in
 create mode 100644 gawk-5.0.1/po/Makevars
 create mode 100644 gawk-5.0.1/po/POTFILES.in
 create mode 100644 gawk-5.0.1/po/README
 create mode 100644 gawk-5.0.1/po/Rules-quot
 create mode 100644 gawk-5.0.1/po/boldquot.sed
 create mode 100644 gawk-5.0.1/po/ca.po
 create mode 100644 gawk-5.0.1/po/da.po
 create mode 100644 gawk-5.0.1/po/de.po
 create mode 100644 gawk-5.0.1/po/en@boldquot.header
 create mode 100644 gawk-5.0.1/po/en@quot.header
 create mode 100644 gawk-5.0.1/po/es.po
 create mode 100644 gawk-5.0.1/po/fi.po
 create mode 100644 gawk-5.0.1/po/fr.po
 create mode 100644 gawk-5.0.1/po/gawk.pot
 create mode 100644 gawk-5.0.1/po/id.po
 create mode 100644 gawk-5.0.1/po/insert-header.sin
 create mode 100644 gawk-5.0.1/po/it.po
 create mode 100644 gawk-5.0.1/po/ja.po
 create mode 100644 gawk-5.0.1/po/ko.po
 create mode 100644 gawk-5.0.1/po/ms.po
 create mode 100644 gawk-5.0.1/po/nl.po
 create mode 100644 gawk-5.0.1/po/pl.po
 create mode 100644 gawk-5.0.1/po/pt.po
 create mode 100644 gawk-5.0.1/po/pt_BR.po
 create mode 100644 gawk-5.0.1/po/quot.sed
 create mode 100644 gawk-5.0.1/po/remove-potcdate.sin
 create mode 100644 gawk-5.0.1/po/stamp-po
 create mode 100644 gawk-5.0.1/po/sv.po
 create mode 100644 gawk-5.0.1/po/vi.po
 create mode 100644 gawk-5.0.1/po/zh_CN.po
 create mode 100644 gawk-5.0.1/posix/ChangeLog
 create mode 100644 gawk-5.0.1/posix/ChangeLog.0
 create mode 100644 gawk-5.0.1/posix/ChangeLog.1
 create mode 100644 gawk-5.0.1/posix/gawkmisc.c
 create mode 100644 gawk-5.0.1/profile.c
 create mode 100644 gawk-5.0.1/protos.h
 create mode 100644 gawk-5.0.1/re.c
 create mode 100644 gawk-5.0.1/replace.c
 create mode 100644 gawk-5.0.1/str_array.c
 create mode 100644 gawk-5.0.1/support/ChangeLog
 create mode 100644 gawk-5.0.1/support/Makefile.am
 create mode 100644 gawk-5.0.1/support/Makefile.in
 create mode 100644 gawk-5.0.1/support/cdefs.h
 create mode 100644 gawk-5.0.1/support/dfa.c
 create mode 100644 gawk-5.0.1/support/dfa.h
 create mode 100644 gawk-5.0.1/support/getopt.c
 create mode 100644 gawk-5.0.1/support/getopt.h
 create mode 100644 gawk-5.0.1/support/getopt1.c
 create mode 100644 gawk-5.0.1/support/getopt_int.h
 create mode 100644 gawk-5.0.1/support/intprops.h
 create mode 100644 gawk-5.0.1/support/libc-config.h
 create mode 100644 gawk-5.0.1/support/localeinfo.c
 create mode 100644 gawk-5.0.1/support/localeinfo.h
 create mode 100644 gawk-5.0.1/support/random.c
 create mode 100644 gawk-5.0.1/support/random.h
 create mode 100644 gawk-5.0.1/support/regcomp.c
 create mode 100644 gawk-5.0.1/support/regex.c
 create mode 100644 gawk-5.0.1/support/regex.h
 create mode 100644 gawk-5.0.1/support/regex_internal.c
 create mode 100644 gawk-5.0.1/support/regex_internal.h
 create mode 100644 gawk-5.0.1/support/regexec.c
 create mode 100644 gawk-5.0.1/support/verify.h
 create mode 100644 gawk-5.0.1/support/xalloc.h
 create mode 100644 gawk-5.0.1/symbol.c
 create mode 100644 gawk-5.0.1/test/ChangeLog
 create mode 100644 gawk-5.0.1/test/ChangeLog.0
 create mode 100644 gawk-5.0.1/test/ChangeLog.1
 create mode 100755 gawk-5.0.1/test/Gentests
 create mode 100644 gawk-5.0.1/test/Makefile.am
 create mode 100644 gawk-5.0.1/test/Makefile.in
 create mode 100644 gawk-5.0.1/test/Maketests
 create mode 100644 gawk-5.0.1/test/README
 create mode 100644 gawk-5.0.1/test/aadelete1.awk
 create mode 100644 gawk-5.0.1/test/aadelete1.ok
 create mode 100644 gawk-5.0.1/test/aadelete2.awk
 create mode 100644 gawk-5.0.1/test/aadelete2.ok
 create mode 100644 gawk-5.0.1/test/aarray1.awk
 create mode 100644 gawk-5.0.1/test/aarray1.ok
 create mode 100644 gawk-5.0.1/test/aasort.awk
 create mode 100644 gawk-5.0.1/test/aasort.ok
 create mode 100644 gawk-5.0.1/test/aasorti.awk
 create mode 100644 gawk-5.0.1/test/aasorti.ok
 create mode 100644 gawk-5.0.1/test/addcomma.awk
 create mode 100644 gawk-5.0.1/test/addcomma.in
 create mode 100644 gawk-5.0.1/test/addcomma.ok
 create mode 100644 gawk-5.0.1/test/anchgsub.awk
 create mode 100644 gawk-5.0.1/test/anchgsub.in
 create mode 100644 gawk-5.0.1/test/anchgsub.ok
 create mode 100644 gawk-5.0.1/test/anchor.awk
 create mode 100644 gawk-5.0.1/test/anchor.in
 create mode 100644 gawk-5.0.1/test/anchor.ok
 create mode 100644 gawk-5.0.1/test/apiterm.awk
 create mode 100644 gawk-5.0.1/test/apiterm.in
 create mode 100644 gawk-5.0.1/test/apiterm.ok
 create mode 100644 gawk-5.0.1/test/argarray.awk
 create mode 100644 gawk-5.0.1/test/argarray.in
 create mode 100644 gawk-5.0.1/test/argarray.ok
 create mode 100644 gawk-5.0.1/test/argtest.awk
 create mode 100644 gawk-5.0.1/test/argtest.ok
 create mode 100644 gawk-5.0.1/test/arrayind1.awk
 create mode 100644 gawk-5.0.1/test/arrayind1.in
 create mode 100644 gawk-5.0.1/test/arrayind1.ok
 create mode 100644 gawk-5.0.1/test/arrayind2.awk
 create mode 100644 gawk-5.0.1/test/arrayind2.ok
 create mode 100644 gawk-5.0.1/test/arrayind3.awk
 create mode 100644 gawk-5.0.1/test/arrayind3.ok
 create mode 100644 gawk-5.0.1/test/arrayparm.awk
 create mode 100644 gawk-5.0.1/test/arrayparm.ok
 create mode 100644 gawk-5.0.1/test/arrayprm2.awk
 create mode 100644 gawk-5.0.1/test/arrayprm2.ok
 create mode 100644 gawk-5.0.1/test/arrayprm3.awk
 create mode 100644 gawk-5.0.1/test/arrayprm3.ok
 create mode 100644 gawk-5.0.1/test/arrayref.awk
 create mode 100644 gawk-5.0.1/test/arrayref.ok
 create mode 100644 gawk-5.0.1/test/arraysort.awk
 create mode 100644 gawk-5.0.1/test/arraysort.ok
 create mode 100644 gawk-5.0.1/test/arraysort2.awk
 create mode 100644 gawk-5.0.1/test/arraysort2.ok
 create mode 100644 gawk-5.0.1/test/arraytype.awk
 create mode 100644 gawk-5.0.1/test/arraytype.ok
 create mode 100644 gawk-5.0.1/test/arrdbg.awk
 create mode 100644 gawk-5.0.1/test/arrymem1.awk
 create mode 100644 gawk-5.0.1/test/arrymem1.ok
 create mode 100644 gawk-5.0.1/test/arryref2.awk
 create mode 100644 gawk-5.0.1/test/arryref2.ok
 create mode 100644 gawk-5.0.1/test/arryref3.awk
 create mode 100644 gawk-5.0.1/test/arryref3.ok
 create mode 100644 gawk-5.0.1/test/arryref4.awk
 create mode 100644 gawk-5.0.1/test/arryref4.ok
 create mode 100644 gawk-5.0.1/test/arryref5.awk
 create mode 100644 gawk-5.0.1/test/arryref5.ok
 create mode 100644 gawk-5.0.1/test/arynasty.awk
 create mode 100644 gawk-5.0.1/test/arynasty.ok
 create mode 100644 gawk-5.0.1/test/arynocls.awk
 create mode 100644 gawk-5.0.1/test/arynocls.in
 create mode 100644 gawk-5.0.1/test/arynocls.ok
 create mode 100644 gawk-5.0.1/test/aryprm1.awk
 create mode 100644 gawk-5.0.1/test/aryprm1.ok
 create mode 100644 gawk-5.0.1/test/aryprm2.awk
 create mode 100644 gawk-5.0.1/test/aryprm2.ok
 create mode 100644 gawk-5.0.1/test/aryprm3.awk
 create mode 100644 gawk-5.0.1/test/aryprm3.ok
 create mode 100644 gawk-5.0.1/test/aryprm4.awk
 create mode 100644 gawk-5.0.1/test/aryprm4.ok
 create mode 100644 gawk-5.0.1/test/aryprm5.awk
 create mode 100644 gawk-5.0.1/test/aryprm5.ok
 create mode 100644 gawk-5.0.1/test/aryprm6.awk
 create mode 100644 gawk-5.0.1/test/aryprm6.ok
 create mode 100644 gawk-5.0.1/test/aryprm7.awk
 create mode 100644 gawk-5.0.1/test/aryprm7.ok
 create mode 100644 gawk-5.0.1/test/aryprm8.awk
 create mode 100644 gawk-5.0.1/test/aryprm8.ok
 create mode 100644 gawk-5.0.1/test/aryprm9.awk
 create mode 100644 gawk-5.0.1/test/aryprm9.ok
 create mode 100644 gawk-5.0.1/test/arysubnm.awk
 create mode 100644 gawk-5.0.1/test/arysubnm.ok
 create mode 100644 gawk-5.0.1/test/aryunasgn.awk
 create mode 100644 gawk-5.0.1/test/aryunasgn.ok
 create mode 100644 gawk-5.0.1/test/asgext.awk
 create mode 100644 gawk-5.0.1/test/asgext.in
 create mode 100644 gawk-5.0.1/test/asgext.ok
 create mode 100644 gawk-5.0.1/test/asort.awk
 create mode 100644 gawk-5.0.1/test/asort.ok
 create mode 100644 gawk-5.0.1/test/asorti.awk
 create mode 100644 gawk-5.0.1/test/asorti.ok
 create mode 100644 gawk-5.0.1/test/assignnumfield.awk
 create mode 100644 gawk-5.0.1/test/assignnumfield.in
 create mode 100644 gawk-5.0.1/test/assignnumfield.ok
 create mode 100644 gawk-5.0.1/test/assignnumfield2.awk
 create mode 100644 gawk-5.0.1/test/assignnumfield2.ok
 create mode 100644 gawk-5.0.1/test/awkpath.ok
 create mode 100644 gawk-5.0.1/test/back89.awk
 create mode 100644 gawk-5.0.1/test/back89.in
 create mode 100644 gawk-5.0.1/test/back89.ok
 create mode 100644 gawk-5.0.1/test/backbigs1.awk
 create mode 100644 gawk-5.0.1/test/backbigs1.in
 create mode 100644 gawk-5.0.1/test/backbigs1.ok
 create mode 100644 gawk-5.0.1/test/backgsub.awk
 create mode 100644 gawk-5.0.1/test/backgsub.in
 create mode 100644 gawk-5.0.1/test/backgsub.ok
 create mode 100644 gawk-5.0.1/test/backsmalls1.awk
 create mode 100644 gawk-5.0.1/test/backsmalls1.in
 create mode 100644 gawk-5.0.1/test/backsmalls1.ok
 create mode 100644 gawk-5.0.1/test/backsmalls2.awk
 create mode 100644 gawk-5.0.1/test/backsmalls2.ok
 create mode 100644 gawk-5.0.1/test/backw.awk
 create mode 100644 gawk-5.0.1/test/backw.in
 create mode 100644 gawk-5.0.1/test/backw.ok
 create mode 100644 gawk-5.0.1/test/badargs.ok
 create mode 100644 gawk-5.0.1/test/badassign1.awk
 create mode 100644 gawk-5.0.1/test/badassign1.ok
 create mode 100644 gawk-5.0.1/test/badbuild.awk
 create mode 100644 gawk-5.0.1/test/badbuild.in
 create mode 100644 gawk-5.0.1/test/badbuild.ok
 create mode 100644 gawk-5.0.1/test/beginfile1.awk
 create mode 100644 gawk-5.0.1/test/beginfile1.ok
 create mode 100644 gawk-5.0.1/test/beginfile2.in
 create mode 100644 gawk-5.0.1/test/beginfile2.ok
 create mode 100755 gawk-5.0.1/test/beginfile2.sh
 create mode 100644 gawk-5.0.1/test/binmode1.ok
 create mode 100644 gawk-5.0.1/test/callparam.awk
 create mode 100644 gawk-5.0.1/test/callparam.ok
 create mode 100644 gawk-5.0.1/test/charasbytes.awk
 create mode 100644 gawk-5.0.1/test/charasbytes.in
 create mode 100644 gawk-5.0.1/test/charasbytes.ok
 create mode 100644 gawk-5.0.1/test/checknegtime.awk
 create mode 100644 gawk-5.0.1/test/childin.awk
 create mode 100644 gawk-5.0.1/test/childin.in
 create mode 100644 gawk-5.0.1/test/childin.ok
 create mode 100644 gawk-5.0.1/test/clobber.awk
 create mode 100644 gawk-5.0.1/test/clobber.ok
 create mode 100644 gawk-5.0.1/test/clos1way.awk
 create mode 100644 gawk-5.0.1/test/clos1way.ok
 create mode 100644 gawk-5.0.1/test/clos1way2.awk
 create mode 100644 gawk-5.0.1/test/clos1way2.in
 create mode 100644 gawk-5.0.1/test/clos1way2.ok
 create mode 100644 gawk-5.0.1/test/clos1way3.awk
 create mode 100644 gawk-5.0.1/test/clos1way3.ok
 create mode 100644 gawk-5.0.1/test/clos1way4.awk
 create mode 100644 gawk-5.0.1/test/clos1way4.ok
 create mode 100644 gawk-5.0.1/test/clos1way5.awk
 create mode 100644 gawk-5.0.1/test/clos1way5.ok
 create mode 100644 gawk-5.0.1/test/clos1way6.awk
 create mode 100644 gawk-5.0.1/test/clos1way6.ok
 create mode 100644 gawk-5.0.1/test/closebad.awk
 create mode 100644 gawk-5.0.1/test/closebad.ok
 create mode 100644 gawk-5.0.1/test/clsflnam.awk
 create mode 100644 gawk-5.0.1/test/clsflnam.in
 create mode 100644 gawk-5.0.1/test/clsflnam.ok
 create mode 100644 gawk-5.0.1/test/colonwarn.awk
 create mode 100644 gawk-5.0.1/test/colonwarn.in
 create mode 100644 gawk-5.0.1/test/colonwarn.ok
 create mode 100644 gawk-5.0.1/test/compare.awk
 create mode 100644 gawk-5.0.1/test/compare.in
 create mode 100644 gawk-5.0.1/test/compare.ok
 create mode 100644 gawk-5.0.1/test/compare2.awk
 create mode 100644 gawk-5.0.1/test/compare2.ok
 create mode 100644 gawk-5.0.1/test/concat1.awk
 create mode 100644 gawk-5.0.1/test/concat1.in
 create mode 100644 gawk-5.0.1/test/concat1.ok
 create mode 100644 gawk-5.0.1/test/concat2.awk
 create mode 100644 gawk-5.0.1/test/concat2.ok
 create mode 100644 gawk-5.0.1/test/concat3.awk
 create mode 100644 gawk-5.0.1/test/concat3.ok
 create mode 100644 gawk-5.0.1/test/concat4.awk
 create mode 100644 gawk-5.0.1/test/concat4.in
 create mode 100644 gawk-5.0.1/test/concat4.ok
 create mode 100644 gawk-5.0.1/test/concat5.awk
 create mode 100644 gawk-5.0.1/test/concat5.ok
 create mode 100644 gawk-5.0.1/test/convfmt.awk
 create mode 100644 gawk-5.0.1/test/convfmt.ok
 create mode 100644 gawk-5.0.1/test/crlf.awk
 create mode 100644 gawk-5.0.1/test/crlf.ok
 create mode 100644 gawk-5.0.1/test/datanonl.awk
 create mode 100644 gawk-5.0.1/test/datanonl.in
 create mode 100644 gawk-5.0.1/test/datanonl.ok
 create mode 100644 gawk-5.0.1/test/dbugeval.in
 create mode 100644 gawk-5.0.1/test/dbugeval.ok
 create mode 100644 gawk-5.0.1/test/dbugeval2.awk
 create mode 100644 gawk-5.0.1/test/dbugeval2.in
 create mode 100644 gawk-5.0.1/test/dbugeval2.ok
 create mode 100644 gawk-5.0.1/test/dbugeval3.awk
 create mode 100644 gawk-5.0.1/test/dbugeval3.in
 create mode 100644 gawk-5.0.1/test/dbugeval3.ok
 create mode 100644 gawk-5.0.1/test/dbugtypedre1.awk
 create mode 100644 gawk-5.0.1/test/dbugtypedre1.in
 create mode 100644 gawk-5.0.1/test/dbugtypedre1.ok
 create mode 100644 gawk-5.0.1/test/dbugtypedre2.awk
 create mode 100644 gawk-5.0.1/test/dbugtypedre2.in
 create mode 100644 gawk-5.0.1/test/dbugtypedre2.ok
 create mode 100644 gawk-5.0.1/test/defref.awk
 create mode 100644 gawk-5.0.1/test/defref.ok
 create mode 100644 gawk-5.0.1/test/delargv.awk
 create mode 100644 gawk-5.0.1/test/delargv.ok
 create mode 100644 gawk-5.0.1/test/delarpm2.awk
 create mode 100644 gawk-5.0.1/test/delarpm2.ok
 create mode 100644 gawk-5.0.1/test/delarprm.awk
 create mode 100644 gawk-5.0.1/test/delarprm.ok
 create mode 100644 gawk-5.0.1/test/delfunc.awk
 create mode 100644 gawk-5.0.1/test/delfunc.ok
 create mode 100644 gawk-5.0.1/test/delsub.awk
 create mode 100644 gawk-5.0.1/test/delsub.ok
 create mode 100644 gawk-5.0.1/test/devfd.in1
 create mode 100644 gawk-5.0.1/test/devfd.in2
 create mode 100644 gawk-5.0.1/test/devfd.in4
 create mode 100644 gawk-5.0.1/test/devfd.in5
 create mode 100644 gawk-5.0.1/test/devfd.ok
 create mode 100644 gawk-5.0.1/test/devfd1.awk
 create mode 100644 gawk-5.0.1/test/devfd1.ok
 create mode 100644 gawk-5.0.1/test/devfd2.ok
 create mode 100644 gawk-5.0.1/test/dfacheck1.awk
 create mode 100644 gawk-5.0.1/test/dfacheck1.in
 create mode 100644 gawk-5.0.1/test/dfacheck1.ok
 create mode 100644 gawk-5.0.1/test/dfamb1.awk
 create mode 100644 gawk-5.0.1/test/dfamb1.in
 create mode 100644 gawk-5.0.1/test/dfamb1.ok
 create mode 100644 gawk-5.0.1/test/dfastress.awk
 create mode 100644 gawk-5.0.1/test/dfastress.ok
 create mode 100644 gawk-5.0.1/test/double1.awk
 create mode 100644 gawk-5.0.1/test/double1.ok
 create mode 100644 gawk-5.0.1/test/double2.awk
 create mode 100644 gawk-5.0.1/test/double2.ok
 create mode 100644 gawk-5.0.1/test/dtdgport.awk
 create mode 100644 gawk-5.0.1/test/dumpvars.in
 create mode 100644 gawk-5.0.1/test/dumpvars.ok
 create mode 100644 gawk-5.0.1/test/dynlj.awk
 create mode 100644 gawk-5.0.1/test/dynlj.ok
 create mode 100644 gawk-5.0.1/test/eofsplit.awk
 create mode 100644 gawk-5.0.1/test/eofsplit.ok
 create mode 100644 gawk-5.0.1/test/eofsrc1.ok
 create mode 100644 gawk-5.0.1/test/eofsrc1a.awk
 create mode 100644 gawk-5.0.1/test/eofsrc1b.awk
 create mode 100644 gawk-5.0.1/test/errno.awk
 create mode 100644 gawk-5.0.1/test/errno.in
 create mode 100644 gawk-5.0.1/test/errno.ok
 create mode 100644 gawk-5.0.1/test/exit.ok
 create mode 100755 gawk-5.0.1/test/exit.sh
 create mode 100644 gawk-5.0.1/test/exit2.awk
 create mode 100644 gawk-5.0.1/test/exit2.ok
 create mode 100644 gawk-5.0.1/test/exitval1.awk
 create mode 100644 gawk-5.0.1/test/exitval1.ok
 create mode 100644 gawk-5.0.1/test/exitval2.awk
 create mode 100644 gawk-5.0.1/test/exitval2.ok
 create mode 100644 gawk-5.0.1/test/exitval2.w32
 create mode 100644 gawk-5.0.1/test/exitval3.awk
 create mode 100644 gawk-5.0.1/test/exitval3.ok
 create mode 100644 gawk-5.0.1/test/fcall_exit.awk
 create mode 100644 gawk-5.0.1/test/fcall_exit.ok
 create mode 100644 gawk-5.0.1/test/fcall_exit2.awk
 create mode 100644 gawk-5.0.1/test/fcall_exit2.in
 create mode 100644 gawk-5.0.1/test/fcall_exit2.ok
 create mode 100644 gawk-5.0.1/test/fflush.ok
 create mode 100755 gawk-5.0.1/test/fflush.sh
 create mode 100644 gawk-5.0.1/test/fieldwdth.awk
 create mode 100644 gawk-5.0.1/test/fieldwdth.in
 create mode 100644 gawk-5.0.1/test/fieldwdth.ok
 create mode 100644 gawk-5.0.1/test/filefuncs.awk
 create mode 100644 gawk-5.0.1/test/filefuncs.ok
 create mode 100644 gawk-5.0.1/test/fix-fmtspcl.awk
 create mode 100644 gawk-5.0.1/test/fldchg.awk
 create mode 100644 gawk-5.0.1/test/fldchg.in
 create mode 100644 gawk-5.0.1/test/fldchg.ok
 create mode 100644 gawk-5.0.1/test/fldchgnf.awk
 create mode 100644 gawk-5.0.1/test/fldchgnf.in
 create mode 100644 gawk-5.0.1/test/fldchgnf.ok
 create mode 100644 gawk-5.0.1/test/fldterm.awk
 create mode 100644 gawk-5.0.1/test/fldterm.in
 create mode 100644 gawk-5.0.1/test/fldterm.ok
 create mode 100644 gawk-5.0.1/test/fmtspcl-mpfr.ok
 create mode 100644 gawk-5.0.1/test/fmtspcl.awk
 create mode 100644 gawk-5.0.1/test/fmtspcl.tok
 create mode 100644 gawk-5.0.1/test/fmttest.awk
 create mode 100644 gawk-5.0.1/test/fmttest.ok
 create mode 100644 gawk-5.0.1/test/fnamedat.awk
 create mode 100644 gawk-5.0.1/test/fnamedat.in
 create mode 100644 gawk-5.0.1/test/fnamedat.ok
 create mode 100644 gawk-5.0.1/test/fnarray.awk
 create mode 100644 gawk-5.0.1/test/fnarray.ok
 create mode 100644 gawk-5.0.1/test/fnarray2.awk
 create mode 100644 gawk-5.0.1/test/fnarray2.in
 create mode 100644 gawk-5.0.1/test/fnarray2.ok
 create mode 100644 gawk-5.0.1/test/fnarydel-mpfr.ok
 create mode 100644 gawk-5.0.1/test/fnarydel.awk
 create mode 100644 gawk-5.0.1/test/fnarydel.ok
 create mode 100644 gawk-5.0.1/test/fnaryscl.awk
 create mode 100644 gawk-5.0.1/test/fnaryscl.ok
 create mode 100644 gawk-5.0.1/test/fnasgnm.awk
 create mode 100644 gawk-5.0.1/test/fnasgnm.in
 create mode 100644 gawk-5.0.1/test/fnasgnm.ok
 create mode 100644 gawk-5.0.1/test/fnmatch.awk
 create mode 100644 gawk-5.0.1/test/fnmatch.ok
 create mode 100644 gawk-5.0.1/test/fnmisc.awk
 create mode 100644 gawk-5.0.1/test/fnmisc.ok
 create mode 100644 gawk-5.0.1/test/fnparydl-mpfr.ok
 create mode 100644 gawk-5.0.1/test/fnparydl.awk
 create mode 100644 gawk-5.0.1/test/fnparydl.ok
 create mode 100644 gawk-5.0.1/test/forcenum.awk
 create mode 100644 gawk-5.0.1/test/forcenum.ok
 create mode 100644 gawk-5.0.1/test/fordel.awk
 create mode 100644 gawk-5.0.1/test/fordel.ok
 create mode 100644 gawk-5.0.1/test/fork.awk
 create mode 100644 gawk-5.0.1/test/fork.ok
 create mode 100644 gawk-5.0.1/test/fork2.awk
 create mode 100644 gawk-5.0.1/test/fork2.ok
 create mode 100644 gawk-5.0.1/test/forref.awk
 create mode 100644 gawk-5.0.1/test/forref.ok
 create mode 100644 gawk-5.0.1/test/forsimp.awk
 create mode 100644 gawk-5.0.1/test/forsimp.ok
 create mode 100644 gawk-5.0.1/test/fpat1.awk
 create mode 100644 gawk-5.0.1/test/fpat1.in
 create mode 100644 gawk-5.0.1/test/fpat1.ok
 create mode 100644 gawk-5.0.1/test/fpat2.awk
 create mode 100644 gawk-5.0.1/test/fpat2.ok
 create mode 100644 gawk-5.0.1/test/fpat3.awk
 create mode 100644 gawk-5.0.1/test/fpat3.in
 create mode 100644 gawk-5.0.1/test/fpat3.ok
 create mode 100644 gawk-5.0.1/test/fpat4.awk
 create mode 100644 gawk-5.0.1/test/fpat4.ok
 create mode 100644 gawk-5.0.1/test/fpat5.awk
 create mode 100644 gawk-5.0.1/test/fpat5.in
 create mode 100644 gawk-5.0.1/test/fpat5.ok
 create mode 100644 gawk-5.0.1/test/fpat6.awk
 create mode 100644 gawk-5.0.1/test/fpat6.in
 create mode 100644 gawk-5.0.1/test/fpat6.ok
 create mode 100644 gawk-5.0.1/test/fpatnull.awk
 create mode 100644 gawk-5.0.1/test/fpatnull.in
 create mode 100644 gawk-5.0.1/test/fpatnull.ok
 create mode 100644 gawk-5.0.1/test/fr/LC_MESSAGES/nlstringtest.mo
 create mode 100644 gawk-5.0.1/test/fsbs.awk
 create mode 100644 gawk-5.0.1/test/fsbs.in
 create mode 100644 gawk-5.0.1/test/fsbs.ok
 create mode 100644 gawk-5.0.1/test/fscaret.awk
 create mode 100644 gawk-5.0.1/test/fscaret.in
 create mode 100644 gawk-5.0.1/test/fscaret.ok
 create mode 100644 gawk-5.0.1/test/fsfwfs.awk
 create mode 100644 gawk-5.0.1/test/fsfwfs.in
 create mode 100644 gawk-5.0.1/test/fsfwfs.ok
 create mode 100644 gawk-5.0.1/test/fsnul1.awk
 create mode 100644 gawk-5.0.1/test/fsnul1.in
 create mode 100644 gawk-5.0.1/test/fsnul1.ok
 create mode 100644 gawk-5.0.1/test/fsrs.awk
 create mode 100644 gawk-5.0.1/test/fsrs.in
 create mode 100644 gawk-5.0.1/test/fsrs.ok
 create mode 100644 gawk-5.0.1/test/fsspcoln.awk
 create mode 100644 gawk-5.0.1/test/fsspcoln.in
 create mode 100644 gawk-5.0.1/test/fsspcoln.ok
 create mode 100644 gawk-5.0.1/test/fstabplus.awk
 create mode 100644 gawk-5.0.1/test/fstabplus.in
 create mode 100644 gawk-5.0.1/test/fstabplus.ok
 create mode 100644 gawk-5.0.1/test/fts.awk
 create mode 100644 gawk-5.0.1/test/functab1.awk
 create mode 100644 gawk-5.0.1/test/functab1.ok
 create mode 100644 gawk-5.0.1/test/functab2.awk
 create mode 100644 gawk-5.0.1/test/functab2.ok
 create mode 100644 gawk-5.0.1/test/functab3.awk
 create mode 100644 gawk-5.0.1/test/functab3.ok
 create mode 100644 gawk-5.0.1/test/functab4.awk
 create mode 100644 gawk-5.0.1/test/functab4.ok
 create mode 100644 gawk-5.0.1/test/funlen.awk
 create mode 100644 gawk-5.0.1/test/funlen.in
 create mode 100644 gawk-5.0.1/test/funlen.ok
 create mode 100644 gawk-5.0.1/test/funsemnl.awk
 create mode 100644 gawk-5.0.1/test/funsemnl.ok
 create mode 100644 gawk-5.0.1/test/funsmnam.awk
 create mode 100644 gawk-5.0.1/test/funsmnam.ok
 create mode 100644 gawk-5.0.1/test/funstack.awk
 create mode 100644 gawk-5.0.1/test/funstack.in
 create mode 100644 gawk-5.0.1/test/funstack.ok
 create mode 100644 gawk-5.0.1/test/fwtest.awk
 create mode 100644 gawk-5.0.1/test/fwtest.in
 create mode 100644 gawk-5.0.1/test/fwtest.ok
 create mode 100644 gawk-5.0.1/test/fwtest2.awk
 create mode 100644 gawk-5.0.1/test/fwtest2.in
 create mode 100644 gawk-5.0.1/test/fwtest2.ok
 create mode 100644 gawk-5.0.1/test/fwtest3.awk
 create mode 100644 gawk-5.0.1/test/fwtest3.in
 create mode 100644 gawk-5.0.1/test/fwtest3.ok
 create mode 100644 gawk-5.0.1/test/fwtest4.awk
 create mode 100644 gawk-5.0.1/test/fwtest4.in
 create mode 100644 gawk-5.0.1/test/fwtest4.ok
 create mode 100644 gawk-5.0.1/test/fwtest5.awk
 create mode 100644 gawk-5.0.1/test/fwtest5.in
 create mode 100644 gawk-5.0.1/test/fwtest5.ok
 create mode 100644 gawk-5.0.1/test/fwtest6.awk
 create mode 100644 gawk-5.0.1/test/fwtest6.in
 create mode 100644 gawk-5.0.1/test/fwtest6.ok
 create mode 100644 gawk-5.0.1/test/fwtest7.awk
 create mode 100644 gawk-5.0.1/test/fwtest7.in
 create mode 100644 gawk-5.0.1/test/fwtest7.ok
 create mode 100644 gawk-5.0.1/test/fwtest8.awk
 create mode 100644 gawk-5.0.1/test/fwtest8.in
 create mode 100644 gawk-5.0.1/test/fwtest8.ok
 create mode 100644 gawk-5.0.1/test/genpot.awk
 create mode 100644 gawk-5.0.1/test/genpot.ok
 create mode 100644 gawk-5.0.1/test/gensub.awk
 create mode 100644 gawk-5.0.1/test/gensub.in
 create mode 100644 gawk-5.0.1/test/gensub.ok
 create mode 100644 gawk-5.0.1/test/gensub2.awk
 create mode 100644 gawk-5.0.1/test/gensub2.ok
 create mode 100644 gawk-5.0.1/test/gensub3.awk
 create mode 100644 gawk-5.0.1/test/gensub3.in
 create mode 100644 gawk-5.0.1/test/gensub3.ok
 create mode 100644 gawk-5.0.1/test/getfile.awk
 create mode 100644 gawk-5.0.1/test/getfile.ok
 create mode 100644 gawk-5.0.1/test/getline.awk
 create mode 100644 gawk-5.0.1/test/getline.in
 create mode 100644 gawk-5.0.1/test/getline.ok
 create mode 100644 gawk-5.0.1/test/getline2.awk
 create mode 100644 gawk-5.0.1/test/getline2.ok
 create mode 100644 gawk-5.0.1/test/getline3.awk
 create mode 100644 gawk-5.0.1/test/getline3.ok
 create mode 100644 gawk-5.0.1/test/getline4.awk
 create mode 100644 gawk-5.0.1/test/getline4.in
 create mode 100644 gawk-5.0.1/test/getline4.ok
 create mode 100644 gawk-5.0.1/test/getline5.awk
 create mode 100644 gawk-5.0.1/test/getline5.ok
 create mode 100644 gawk-5.0.1/test/getlnbuf.awk
 create mode 100644 gawk-5.0.1/test/getlnbuf.in
 create mode 100644 gawk-5.0.1/test/getlnbuf.ok
 create mode 100644 gawk-5.0.1/test/getlndir.awk
 create mode 100644 gawk-5.0.1/test/getlndir.ok
 create mode 100644 gawk-5.0.1/test/getlnhd.awk
 create mode 100644 gawk-5.0.1/test/getlnhd.ok
 create mode 100644 gawk-5.0.1/test/getnr2tb.awk
 create mode 100644 gawk-5.0.1/test/getnr2tb.in
 create mode 100644 gawk-5.0.1/test/getnr2tb.ok
 create mode 100644 gawk-5.0.1/test/getnr2tm.awk
 create mode 100644 gawk-5.0.1/test/getnr2tm.in
 create mode 100644 gawk-5.0.1/test/getnr2tm.ok
 create mode 100644 gawk-5.0.1/test/gnuops2.awk
 create mode 100644 gawk-5.0.1/test/gnuops2.ok
 create mode 100644 gawk-5.0.1/test/gnuops3.awk
 create mode 100644 gawk-5.0.1/test/gnuops3.ok
 create mode 100644 gawk-5.0.1/test/gnureops.awk
 create mode 100644 gawk-5.0.1/test/gnureops.ok
 create mode 100644 gawk-5.0.1/test/gsubasgn.awk
 create mode 100644 gawk-5.0.1/test/gsubasgn.ok
 create mode 100644 gawk-5.0.1/test/gsubind.awk
 create mode 100644 gawk-5.0.1/test/gsubind.ok
 create mode 100644 gawk-5.0.1/test/gsubtest.awk
 create mode 100644 gawk-5.0.1/test/gsubtest.ok
 create mode 100644 gawk-5.0.1/test/gsubtst2.awk
 create mode 100644 gawk-5.0.1/test/gsubtst2.ok
 create mode 100644 gawk-5.0.1/test/gsubtst3.awk
 create mode 100644 gawk-5.0.1/test/gsubtst3.in
 create mode 100644 gawk-5.0.1/test/gsubtst3.ok
 create mode 100644 gawk-5.0.1/test/gsubtst4.awk
 create mode 100644 gawk-5.0.1/test/gsubtst4.ok
 create mode 100644 gawk-5.0.1/test/gsubtst5.awk
 create mode 100644 gawk-5.0.1/test/gsubtst5.in
 create mode 100644 gawk-5.0.1/test/gsubtst5.ok
 create mode 100644 gawk-5.0.1/test/gsubtst6.awk
 create mode 100644 gawk-5.0.1/test/gsubtst6.ok
 create mode 100644 gawk-5.0.1/test/gsubtst7.awk
 create mode 100644 gawk-5.0.1/test/gsubtst7.in
 create mode 100644 gawk-5.0.1/test/gsubtst7.ok
 create mode 100644 gawk-5.0.1/test/gsubtst8.awk
 create mode 100644 gawk-5.0.1/test/gsubtst8.in
 create mode 100644 gawk-5.0.1/test/gsubtst8.ok
 create mode 100644 gawk-5.0.1/test/gtlnbufv.awk
 create mode 100644 gawk-5.0.1/test/hello.awk
 create mode 100644 gawk-5.0.1/test/hex.awk
 create mode 100644 gawk-5.0.1/test/hex.ok
 create mode 100644 gawk-5.0.1/test/hex2.awk
 create mode 100644 gawk-5.0.1/test/hex2.in
 create mode 100644 gawk-5.0.1/test/hex2.ok
 create mode 100644 gawk-5.0.1/test/hsprint.awk
 create mode 100644 gawk-5.0.1/test/hsprint.ok
 create mode 100644 gawk-5.0.1/test/icasefs.awk
 create mode 100644 gawk-5.0.1/test/icasefs.ok
 create mode 100644 gawk-5.0.1/test/icasers.awk
 create mode 100644 gawk-5.0.1/test/icasers.in
 create mode 100644 gawk-5.0.1/test/icasers.ok
 create mode 100644 gawk-5.0.1/test/id.awk
 create mode 100644 gawk-5.0.1/test/id.ok
 create mode 100644 gawk-5.0.1/test/igncdym.awk
 create mode 100644 gawk-5.0.1/test/igncdym.in
 create mode 100644 gawk-5.0.1/test/igncdym.ok
 create mode 100644 gawk-5.0.1/test/igncfs.awk
 create mode 100644 gawk-5.0.1/test/igncfs.in
 create mode 100644 gawk-5.0.1/test/igncfs.ok
 create mode 100644 gawk-5.0.1/test/ignrcas2.awk
 create mode 100644 gawk-5.0.1/test/ignrcas2.ok
 create mode 100644 gawk-5.0.1/test/ignrcas3.awk
 create mode 100644 gawk-5.0.1/test/ignrcas3.ok
 create mode 100644 gawk-5.0.1/test/ignrcas4.awk
 create mode 100644 gawk-5.0.1/test/ignrcas4.ok
 create mode 100644 gawk-5.0.1/test/ignrcase.awk
 create mode 100644 gawk-5.0.1/test/ignrcase.in
 create mode 100644 gawk-5.0.1/test/ignrcase.ok
 create mode 100644 gawk-5.0.1/test/incdupe.ok
 create mode 100644 gawk-5.0.1/test/incdupe2.ok
 create mode 100644 gawk-5.0.1/test/incdupe3.ok
 create mode 100644 gawk-5.0.1/test/incdupe4.ok
 create mode 100644 gawk-5.0.1/test/incdupe5.ok
 create mode 100644 gawk-5.0.1/test/incdupe6.ok
 create mode 100644 gawk-5.0.1/test/incdupe7.ok
 create mode 100644 gawk-5.0.1/test/inchello.awk
 create mode 100644 gawk-5.0.1/test/inclib.awk
 create mode 100644 gawk-5.0.1/test/include.awk
 create mode 100644 gawk-5.0.1/test/include.ok
 create mode 100644 gawk-5.0.1/test/include2.ok
 create mode 100644 gawk-5.0.1/test/indirectbuiltin.awk
 create mode 100644 gawk-5.0.1/test/indirectbuiltin.ok
 create mode 100644 gawk-5.0.1/test/indirectcall.awk
 create mode 100644 gawk-5.0.1/test/indirectcall.in
 create mode 100644 gawk-5.0.1/test/indirectcall.ok
 create mode 100644 gawk-5.0.1/test/indirectcall2.awk
 create mode 100644 gawk-5.0.1/test/indirectcall2.ok
 create mode 100644 gawk-5.0.1/test/inftest.awk
 create mode 100644 gawk-5.0.1/test/inftest.ok
 create mode 100644 gawk-5.0.1/test/inplace.1.in
 create mode 100644 gawk-5.0.1/test/inplace.2.in
 create mode 100644 gawk-5.0.1/test/inplace.in
 create mode 100644 gawk-5.0.1/test/inplace1.1.ok
 create mode 100644 gawk-5.0.1/test/inplace1.2.ok
 create mode 100644 gawk-5.0.1/test/inplace1.ok
 create mode 100644 gawk-5.0.1/test/inplace2.1.bak.ok
 create mode 100644 gawk-5.0.1/test/inplace2.1.ok
 create mode 100644 gawk-5.0.1/test/inplace2.2.bak.ok
 create mode 100644 gawk-5.0.1/test/inplace2.2.ok
 create mode 100644 gawk-5.0.1/test/inplace2.ok
 create mode 100644 gawk-5.0.1/test/inplace3.1.bak.ok
 create mode 100644 gawk-5.0.1/test/inplace3.1.ok
 create mode 100644 gawk-5.0.1/test/inplace3.2.bak.ok
 create mode 100644 gawk-5.0.1/test/inplace3.2.ok
 create mode 100644 gawk-5.0.1/test/inplace3.ok
 create mode 100644 gawk-5.0.1/test/inpref.awk
 create mode 100644 gawk-5.0.1/test/inpref.in
 create mode 100644 gawk-5.0.1/test/inpref.ok
 create mode 100644 gawk-5.0.1/test/inputred.awk
 create mode 100644 gawk-5.0.1/test/inputred.ok
 create mode 100644 gawk-5.0.1/test/intarray.awk
 create mode 100644 gawk-5.0.1/test/intarray.ok
 create mode 100644 gawk-5.0.1/test/intest.awk
 create mode 100644 gawk-5.0.1/test/intest.ok
 create mode 100644 gawk-5.0.1/test/intformat.awk
 create mode 100644 gawk-5.0.1/test/intformat.ok
 create mode 100644 gawk-5.0.1/test/intprec.awk
 create mode 100644 gawk-5.0.1/test/intprec.ok
 create mode 100644 gawk-5.0.1/test/iobug1.awk
 create mode 100644 gawk-5.0.1/test/iobug1.ok
 create mode 100644 gawk-5.0.1/test/isarrayunset.awk
 create mode 100644 gawk-5.0.1/test/isarrayunset.ok
 create mode 100644 gawk-5.0.1/test/jarebug.awk
 create mode 100644 gawk-5.0.1/test/jarebug.in
 create mode 100644 gawk-5.0.1/test/jarebug.ok
 create mode 100755 gawk-5.0.1/test/jarebug.sh
 create mode 100644 gawk-5.0.1/test/lc_num1.awk
 create mode 100644 gawk-5.0.1/test/lc_num1.ok
 create mode 100644 gawk-5.0.1/test/leaddig.awk
 create mode 100644 gawk-5.0.1/test/leaddig.ok
 create mode 100644 gawk-5.0.1/test/leadnl.awk
 create mode 100644 gawk-5.0.1/test/leadnl.in
 create mode 100644 gawk-5.0.1/test/leadnl.ok
 create mode 100644 gawk-5.0.1/test/lib/awkpath.awk
 create mode 100644 gawk-5.0.1/test/lint.awk
 create mode 100644 gawk-5.0.1/test/lint.ok
 create mode 100644 gawk-5.0.1/test/lintexp.awk
 create mode 100644 gawk-5.0.1/test/lintexp.ok
 create mode 100644 gawk-5.0.1/test/lintindex.awk
 create mode 100644 gawk-5.0.1/test/lintindex.ok
 create mode 100644 gawk-5.0.1/test/lintint.awk
 create mode 100644 gawk-5.0.1/test/lintint.ok
 create mode 100644 gawk-5.0.1/test/lintlength.awk
 create mode 100644 gawk-5.0.1/test/lintlength.ok
 create mode 100644 gawk-5.0.1/test/lintold.awk
 create mode 100644 gawk-5.0.1/test/lintold.in
 create mode 100644 gawk-5.0.1/test/lintold.ok
 create mode 100644 gawk-5.0.1/test/lintset.awk
 create mode 100644 gawk-5.0.1/test/lintset.ok
 create mode 100644 gawk-5.0.1/test/lintwarn.awk
 create mode 100644 gawk-5.0.1/test/lintwarn.ok
 create mode 100644 gawk-5.0.1/test/litoct.awk
 create mode 100644 gawk-5.0.1/test/litoct.in
 create mode 100644 gawk-5.0.1/test/litoct.ok
 create mode 100644 gawk-5.0.1/test/localenl.ok
 create mode 100755 gawk-5.0.1/test/localenl.sh
 create mode 100644 gawk-5.0.1/test/longsub.awk
 create mode 100644 gawk-5.0.1/test/longsub.in
 create mode 100644 gawk-5.0.1/test/longsub.ok
 create mode 100644 gawk-5.0.1/test/longwrds.awk
 create mode 100644 gawk-5.0.1/test/longwrds.in
 create mode 100644 gawk-5.0.1/test/longwrds.ok
 create mode 100644 gawk-5.0.1/test/manglprm.awk
 create mode 100644 gawk-5.0.1/test/manglprm.in
 create mode 100644 gawk-5.0.1/test/manglprm.ok
 create mode 100644 gawk-5.0.1/test/manyfiles.awk
 create mode 100644 gawk-5.0.1/test/manyfiles.ok
 create mode 100644 gawk-5.0.1/test/match1.awk
 create mode 100644 gawk-5.0.1/test/match1.ok
 create mode 100644 gawk-5.0.1/test/match2.awk
 create mode 100644 gawk-5.0.1/test/match2.ok
 create mode 100644 gawk-5.0.1/test/match3.awk
 create mode 100644 gawk-5.0.1/test/match3.in
 create mode 100644 gawk-5.0.1/test/match3.ok
 create mode 100644 gawk-5.0.1/test/math.awk
 create mode 100644 gawk-5.0.1/test/math.ok
 create mode 100644 gawk-5.0.1/test/mbfw1.awk
 create mode 100644 gawk-5.0.1/test/mbfw1.in
 create mode 100644 gawk-5.0.1/test/mbfw1.ok
 create mode 100644 gawk-5.0.1/test/mbprintf1.awk
 create mode 100644 gawk-5.0.1/test/mbprintf1.in
 create mode 100644 gawk-5.0.1/test/mbprintf1.ok
 create mode 100644 gawk-5.0.1/test/mbprintf2.awk
 create mode 100644 gawk-5.0.1/test/mbprintf2.ok
 create mode 100644 gawk-5.0.1/test/mbprintf3.awk
 create mode 100644 gawk-5.0.1/test/mbprintf3.in
 create mode 100644 gawk-5.0.1/test/mbprintf3.ok
 create mode 100644 gawk-5.0.1/test/mbprintf4.awk
 create mode 100644 gawk-5.0.1/test/mbprintf4.in
 create mode 100644 gawk-5.0.1/test/mbprintf4.ok
 create mode 100644 gawk-5.0.1/test/mbprintf5.awk
 create mode 100644 gawk-5.0.1/test/mbprintf5.in
 create mode 100644 gawk-5.0.1/test/mbprintf5.ok
 create mode 100644 gawk-5.0.1/test/mbstr1.awk
 create mode 100644 gawk-5.0.1/test/mbstr1.ok
 create mode 100644 gawk-5.0.1/test/mbstr2.awk
 create mode 100644 gawk-5.0.1/test/mbstr2.in
 create mode 100644 gawk-5.0.1/test/mbstr2.ok
 create mode 100644 gawk-5.0.1/test/membug1.awk
 create mode 100644 gawk-5.0.1/test/membug1.in
 create mode 100644 gawk-5.0.1/test/membug1.ok
 create mode 100644 gawk-5.0.1/test/memleak.awk
 create mode 100644 gawk-5.0.1/test/memleak.ok
 create mode 100644 gawk-5.0.1/test/messages.awk
 create mode 100644 gawk-5.0.1/test/minusstr.awk
 create mode 100644 gawk-5.0.1/test/minusstr.ok
 create mode 100644 gawk-5.0.1/test/mixed1.ok
 create mode 100644 gawk-5.0.1/test/mktime.awk
 create mode 100644 gawk-5.0.1/test/mktime.in
 create mode 100644 gawk-5.0.1/test/mktime.ok
 create mode 100644 gawk-5.0.1/test/mmap8k.awk
 create mode 100644 gawk-5.0.1/test/mmap8k.in
 create mode 100644 gawk-5.0.1/test/mmap8k.ok
 create mode 100644 gawk-5.0.1/test/mpfrbigint.awk
 create mode 100644 gawk-5.0.1/test/mpfrbigint.ok
 create mode 100644 gawk-5.0.1/test/mpfrbigint2.awk
 create mode 100644 gawk-5.0.1/test/mpfrbigint2.in
 create mode 100644 gawk-5.0.1/test/mpfrbigint2.ok
 create mode 100644 gawk-5.0.1/test/mpfrexprange.awk
 create mode 100644 gawk-5.0.1/test/mpfrexprange.ok
 create mode 100644 gawk-5.0.1/test/mpfrfield.awk
 create mode 100644 gawk-5.0.1/test/mpfrfield.in
 create mode 100644 gawk-5.0.1/test/mpfrfield.ok
 create mode 100644 gawk-5.0.1/test/mpfrieee.awk
 create mode 100644 gawk-5.0.1/test/mpfrieee.ok
 create mode 100644 gawk-5.0.1/test/mpfrmemok1.awk
 create mode 100644 gawk-5.0.1/test/mpfrmemok1.ok
 create mode 100644 gawk-5.0.1/test/mpfrnegzero.awk
 create mode 100644 gawk-5.0.1/test/mpfrnegzero.ok
 create mode 100644 gawk-5.0.1/test/mpfrnr.awk
 create mode 100644 gawk-5.0.1/test/mpfrnr.in
 create mode 100644 gawk-5.0.1/test/mpfrnr.ok
 create mode 100644 gawk-5.0.1/test/mpfrrem.awk
 create mode 100644 gawk-5.0.1/test/mpfrrem.ok
 create mode 100644 gawk-5.0.1/test/mpfrrnd.awk
 create mode 100644 gawk-5.0.1/test/mpfrrnd.ok
 create mode 100644 gawk-5.0.1/test/mpfrrndeval.awk
 create mode 100644 gawk-5.0.1/test/mpfrrndeval.ok
 create mode 100644 gawk-5.0.1/test/mpfrsort.awk
 create mode 100644 gawk-5.0.1/test/mpfrsort.ok
 create mode 100644 gawk-5.0.1/test/mpfrsqrt.awk
 create mode 100644 gawk-5.0.1/test/mpfrsqrt.ok
 create mode 100644 gawk-5.0.1/test/mpfrstrtonum.awk
 create mode 100644 gawk-5.0.1/test/mpfrstrtonum.ok
 create mode 100644 gawk-5.0.1/test/mpfruplus.ok
 create mode 100644 gawk-5.0.1/test/mpgforcenum.awk
 create mode 100644 gawk-5.0.1/test/mpgforcenum.ok
 create mode 100644 gawk-5.0.1/test/mtchi18n.awk
 create mode 100644 gawk-5.0.1/test/mtchi18n.in
 create mode 100644 gawk-5.0.1/test/mtchi18n.ok
 create mode 100644 gawk-5.0.1/test/muldimposix.awk
 create mode 100644 gawk-5.0.1/test/muldimposix.ok
 create mode 100644 gawk-5.0.1/test/nasty.awk
 create mode 100644 gawk-5.0.1/test/nasty.ok
 create mode 100644 gawk-5.0.1/test/nasty2.awk
 create mode 100644 gawk-5.0.1/test/nasty2.ok
 create mode 100644 gawk-5.0.1/test/nastyparm.awk
 create mode 100644 gawk-5.0.1/test/nastyparm.ok
 create mode 100644 gawk-5.0.1/test/negexp.awk
 create mode 100644 gawk-5.0.1/test/negexp.ok
 create mode 100644 gawk-5.0.1/test/negrange.awk
 create mode 100644 gawk-5.0.1/test/negrange.ok
 create mode 100644 gawk-5.0.1/test/negtime.awk
 create mode 100644 gawk-5.0.1/test/negtime.ok
 create mode 100644 gawk-5.0.1/test/nested.awk
 create mode 100644 gawk-5.0.1/test/nested.in
 create mode 100644 gawk-5.0.1/test/nested.ok
 create mode 100644 gawk-5.0.1/test/next.ok
 create mode 100755 gawk-5.0.1/test/next.sh
 create mode 100644 gawk-5.0.1/test/nfldstr.awk
 create mode 100644 gawk-5.0.1/test/nfldstr.in
 create mode 100644 gawk-5.0.1/test/nfldstr.ok
 create mode 100644 gawk-5.0.1/test/nfloop.awk
 create mode 100644 gawk-5.0.1/test/nfloop.ok
 create mode 100644 gawk-5.0.1/test/nfneg.awk
 create mode 100644 gawk-5.0.1/test/nfneg.ok
 create mode 100644 gawk-5.0.1/test/nfset.awk
 create mode 100644 gawk-5.0.1/test/nfset.in
 create mode 100644 gawk-5.0.1/test/nfset.ok
 create mode 100644 gawk-5.0.1/test/nlfldsep.awk
 create mode 100644 gawk-5.0.1/test/nlfldsep.in
 create mode 100644 gawk-5.0.1/test/nlfldsep.ok
 create mode 100644 gawk-5.0.1/test/nlinstr.awk
 create mode 100644 gawk-5.0.1/test/nlinstr.in
 create mode 100644 gawk-5.0.1/test/nlinstr.ok
 create mode 100644 gawk-5.0.1/test/nlstrina.awk
 create mode 100644 gawk-5.0.1/test/nlstrina.ok
 create mode 100644 gawk-5.0.1/test/nlstringtest-nogettext.ok
 create mode 100644 gawk-5.0.1/test/nlstringtest.awk
 create mode 100644 gawk-5.0.1/test/nlstringtest.ok
 create mode 100644 gawk-5.0.1/test/nlstringtest.po
 create mode 100644 gawk-5.0.1/test/noeffect.awk
 create mode 100644 gawk-5.0.1/test/noeffect.ok
 create mode 100644 gawk-5.0.1/test/nofile.ok
 create mode 100644 gawk-5.0.1/test/nofmtch.awk
 create mode 100644 gawk-5.0.1/test/nofmtch.ok
 create mode 100644 gawk-5.0.1/test/noloop1.awk
 create mode 100644 gawk-5.0.1/test/noloop1.in
 create mode 100644 gawk-5.0.1/test/noloop1.ok
 create mode 100644 gawk-5.0.1/test/noloop2.awk
 create mode 100644 gawk-5.0.1/test/noloop2.in
 create mode 100644 gawk-5.0.1/test/noloop2.ok
 create mode 100644 gawk-5.0.1/test/nondec.awk
 create mode 100644 gawk-5.0.1/test/nondec.ok
 create mode 100644 gawk-5.0.1/test/nondec2.awk
 create mode 100644 gawk-5.0.1/test/nondec2.ok
 create mode 100644 gawk-5.0.1/test/nonfatal1.awk
 create mode 100644 gawk-5.0.1/test/nonfatal1.ok
 create mode 100644 gawk-5.0.1/test/nonfatal2.awk
 create mode 100644 gawk-5.0.1/test/nonfatal2.ok
 create mode 100644 gawk-5.0.1/test/nonfatal3.awk
 create mode 100644 gawk-5.0.1/test/nonfatal3.ok
 create mode 100644 gawk-5.0.1/test/nonl.awk
 create mode 100644 gawk-5.0.1/test/nonl.in
 create mode 100644 gawk-5.0.1/test/nonl.ok
 create mode 100644 gawk-5.0.1/test/noparms.awk
 create mode 100644 gawk-5.0.1/test/noparms.ok
 create mode 100644 gawk-5.0.1/test/nors.in
 create mode 100644 gawk-5.0.1/test/nors.ok
 create mode 100644 gawk-5.0.1/test/nsbad.awk
 create mode 100644 gawk-5.0.1/test/nsbad.ok
 create mode 100644 gawk-5.0.1/test/nsbad_cmd.ok
 create mode 100644 gawk-5.0.1/test/nsforloop.awk
 create mode 100644 gawk-5.0.1/test/nsforloop.ok
 create mode 100644 gawk-5.0.1/test/nsfuncrecurse.awk
 create mode 100644 gawk-5.0.1/test/nsfuncrecurse.ok
 create mode 100644 gawk-5.0.1/test/nsindirect1.awk
 create mode 100644 gawk-5.0.1/test/nsindirect1.ok
 create mode 100644 gawk-5.0.1/test/nsindirect2.awk
 create mode 100644 gawk-5.0.1/test/nsindirect2.ok
 create mode 100644 gawk-5.0.1/test/nsprof1.awk
 create mode 100644 gawk-5.0.1/test/nsprof1.ok
 create mode 100644 gawk-5.0.1/test/nsprof2.awk
 create mode 100644 gawk-5.0.1/test/nsprof2.ok
 create mode 100644 gawk-5.0.1/test/nulinsrc.awk
 create mode 100644 gawk-5.0.1/test/nulinsrc.ok
 create mode 100644 gawk-5.0.1/test/nulrsend.awk
 create mode 100644 gawk-5.0.1/test/nulrsend.in
 create mode 100644 gawk-5.0.1/test/nulrsend.ok
 create mode 100644 gawk-5.0.1/test/numindex.awk
 create mode 100644 gawk-5.0.1/test/numindex.in
 create mode 100644 gawk-5.0.1/test/numindex.ok
 create mode 100644 gawk-5.0.1/test/numrange.awk
 create mode 100644 gawk-5.0.1/test/numrange.ok
 create mode 100644 gawk-5.0.1/test/numstr1.awk
 create mode 100644 gawk-5.0.1/test/numstr1.ok
 create mode 100644 gawk-5.0.1/test/numsubstr.awk
 create mode 100644 gawk-5.0.1/test/numsubstr.in
 create mode 100644 gawk-5.0.1/test/numsubstr.ok
 create mode 100644 gawk-5.0.1/test/octsub.awk
 create mode 100644 gawk-5.0.1/test/octsub.ok
 create mode 100644 gawk-5.0.1/test/ofmt.awk
 create mode 100644 gawk-5.0.1/test/ofmt.in
 create mode 100644 gawk-5.0.1/test/ofmt.ok
 create mode 100644 gawk-5.0.1/test/ofmta.awk
 create mode 100644 gawk-5.0.1/test/ofmta.ok
 create mode 100644 gawk-5.0.1/test/ofmtbig.awk
 create mode 100644 gawk-5.0.1/test/ofmtbig.in
 create mode 100644 gawk-5.0.1/test/ofmtbig.ok
 create mode 100644 gawk-5.0.1/test/ofmtfidl.awk
 create mode 100644 gawk-5.0.1/test/ofmtfidl.in
 create mode 100644 gawk-5.0.1/test/ofmtfidl.ok
 create mode 100644 gawk-5.0.1/test/ofmts.awk
 create mode 100644 gawk-5.0.1/test/ofmts.in
 create mode 100644 gawk-5.0.1/test/ofmts.ok
 create mode 100644 gawk-5.0.1/test/ofmtstrnum.awk
 create mode 100644 gawk-5.0.1/test/ofmtstrnum.ok
 create mode 100644 gawk-5.0.1/test/ofs1.awk
 create mode 100644 gawk-5.0.1/test/ofs1.in
 create mode 100644 gawk-5.0.1/test/ofs1.ok
 create mode 100644 gawk-5.0.1/test/onlynl.awk
 create mode 100644 gawk-5.0.1/test/onlynl.in
 create mode 100644 gawk-5.0.1/test/onlynl.ok
 create mode 100644 gawk-5.0.1/test/opasnidx.awk
 create mode 100644 gawk-5.0.1/test/opasnidx.ok
 create mode 100644 gawk-5.0.1/test/opasnslf.awk
 create mode 100644 gawk-5.0.1/test/opasnslf.ok
 create mode 100644 gawk-5.0.1/test/ordchr.awk
 create mode 100644 gawk-5.0.1/test/ordchr.ok
 create mode 100644 gawk-5.0.1/test/ordchr2.ok
 create mode 100644 gawk-5.0.1/test/out1.ok
 create mode 100644 gawk-5.0.1/test/out2.ok
 create mode 100644 gawk-5.0.1/test/out3.ok
 create mode 100644 gawk-5.0.1/test/paramasfunc1.awk
 create mode 100644 gawk-5.0.1/test/paramasfunc1.ok
 create mode 100644 gawk-5.0.1/test/paramasfunc2.awk
 create mode 100644 gawk-5.0.1/test/paramasfunc2.ok
 create mode 100644 gawk-5.0.1/test/paramdup.awk
 create mode 100644 gawk-5.0.1/test/paramdup.ok
 create mode 100644 gawk-5.0.1/test/paramres.awk
 create mode 100644 gawk-5.0.1/test/paramres.ok
 create mode 100644 gawk-5.0.1/test/paramtyp.awk
 create mode 100644 gawk-5.0.1/test/paramtyp.ok
 create mode 100644 gawk-5.0.1/test/paramuninitglobal.awk
 create mode 100644 gawk-5.0.1/test/paramuninitglobal.ok
 create mode 100644 gawk-5.0.1/test/parse1.awk
 create mode 100644 gawk-5.0.1/test/parse1.in
 create mode 100644 gawk-5.0.1/test/parse1.ok
 create mode 100644 gawk-5.0.1/test/parsefld.awk
 create mode 100644 gawk-5.0.1/test/parsefld.in
 create mode 100644 gawk-5.0.1/test/parsefld.ok
 create mode 100644 gawk-5.0.1/test/parseme.awk
 create mode 100644 gawk-5.0.1/test/parseme.ok
 create mode 100644 gawk-5.0.1/test/patsplit.awk
 create mode 100644 gawk-5.0.1/test/patsplit.ok
 create mode 100644 gawk-5.0.1/test/pcntplus.awk
 create mode 100644 gawk-5.0.1/test/pcntplus.ok
 create mode 100644 gawk-5.0.1/test/pid.awk
 create mode 100644 gawk-5.0.1/test/pid.ok
 create mode 100755 gawk-5.0.1/test/pid.sh
 create mode 100644 gawk-5.0.1/test/pipeio1.awk
 create mode 100644 gawk-5.0.1/test/pipeio1.ok
 create mode 100644 gawk-5.0.1/test/pipeio2.awk
 create mode 100644 gawk-5.0.1/test/pipeio2.in
 create mode 100644 gawk-5.0.1/test/pipeio2.ok
 create mode 100644 gawk-5.0.1/test/posix.awk
 create mode 100644 gawk-5.0.1/test/posix.in
 create mode 100644 gawk-5.0.1/test/posix.ok
 create mode 100644 gawk-5.0.1/test/posix2008sub.awk
 create mode 100644 gawk-5.0.1/test/posix2008sub.ok
 create mode 100644 gawk-5.0.1/test/poundbang.awk
 create mode 100644 gawk-5.0.1/test/prdupval.awk
 create mode 100644 gawk-5.0.1/test/prdupval.in
 create mode 100644 gawk-5.0.1/test/prdupval.ok
 create mode 100644 gawk-5.0.1/test/prec.awk
 create mode 100644 gawk-5.0.1/test/prec.ok
 create mode 100644 gawk-5.0.1/test/printf0.awk
 create mode 100644 gawk-5.0.1/test/printf0.ok
 create mode 100644 gawk-5.0.1/test/printf1.awk
 create mode 100644 gawk-5.0.1/test/printf1.ok
 create mode 100644 gawk-5.0.1/test/printfbad1.awk
 create mode 100644 gawk-5.0.1/test/printfbad1.ok
 create mode 100644 gawk-5.0.1/test/printfbad2.awk
 create mode 100644 gawk-5.0.1/test/printfbad2.in
 create mode 100644 gawk-5.0.1/test/printfbad2.ok
 create mode 100644 gawk-5.0.1/test/printfbad3.awk
 create mode 100644 gawk-5.0.1/test/printfbad3.ok
 create mode 100644 gawk-5.0.1/test/printfbad4.awk
 create mode 100644 gawk-5.0.1/test/printfbad4.ok
 create mode 100644 gawk-5.0.1/test/printfchar.awk
 create mode 100644 gawk-5.0.1/test/printfchar.ok
 create mode 100644 gawk-5.0.1/test/printfloat.awk
 create mode 100644 gawk-5.0.1/test/printhuge.awk
 create mode 100644 gawk-5.0.1/test/printhuge.ok
 create mode 100644 gawk-5.0.1/test/printlang.awk
 create mode 100644 gawk-5.0.1/test/prmarscl.awk
 create mode 100644 gawk-5.0.1/test/prmarscl.ok
 create mode 100644 gawk-5.0.1/test/prmreuse.awk
 create mode 100644 gawk-5.0.1/test/prmreuse.ok
 create mode 100644 gawk-5.0.1/test/procinfs.awk
 create mode 100644 gawk-5.0.1/test/procinfs.ok
 create mode 100644 gawk-5.0.1/test/profile0.awk
 create mode 100644 gawk-5.0.1/test/profile0.in
 create mode 100644 gawk-5.0.1/test/profile0.ok
 create mode 100644 gawk-5.0.1/test/profile10.awk
 create mode 100644 gawk-5.0.1/test/profile10.ok
 create mode 100644 gawk-5.0.1/test/profile11.awk
 create mode 100644 gawk-5.0.1/test/profile11.ok
 create mode 100644 gawk-5.0.1/test/profile12.awk
 create mode 100644 gawk-5.0.1/test/profile12.in
 create mode 100644 gawk-5.0.1/test/profile12.ok
 create mode 100644 gawk-5.0.1/test/profile2.ok
 create mode 100644 gawk-5.0.1/test/profile3.awk
 create mode 100644 gawk-5.0.1/test/profile3.ok
 create mode 100644 gawk-5.0.1/test/profile4.awk
 create mode 100644 gawk-5.0.1/test/profile4.ok
 create mode 100644 gawk-5.0.1/test/profile5.awk
 create mode 100644 gawk-5.0.1/test/profile5.ok
 create mode 100644 gawk-5.0.1/test/profile6.awk
 create mode 100644 gawk-5.0.1/test/profile6.ok
 create mode 100644 gawk-5.0.1/test/profile7.awk
 create mode 100644 gawk-5.0.1/test/profile7.ok
 create mode 100644 gawk-5.0.1/test/profile8.awk
 create mode 100644 gawk-5.0.1/test/profile8.ok
 create mode 100644 gawk-5.0.1/test/profile9.awk
 create mode 100644 gawk-5.0.1/test/profile9.ok
 create mode 100644 gawk-5.0.1/test/prt1eval.awk
 create mode 100644 gawk-5.0.1/test/prt1eval.ok
 create mode 100644 gawk-5.0.1/test/prtoeval.awk
 create mode 100644 gawk-5.0.1/test/prtoeval.ok
 create mode 100644 gawk-5.0.1/test/pty1.awk
 create mode 100644 gawk-5.0.1/test/pty1.ok
 create mode 100644 gawk-5.0.1/test/pty2.awk
 create mode 100644 gawk-5.0.1/test/pty2.ok
 create mode 100644 gawk-5.0.1/test/rand-mpfr.ok
 create mode 100644 gawk-5.0.1/test/rand.awk
 create mode 100644 gawk-5.0.1/test/rand.ok
 create mode 100644 gawk-5.0.1/test/randtest.ok
 create mode 100755 gawk-5.0.1/test/randtest.sh
 create mode 100644 gawk-5.0.1/test/range1.awk
 create mode 100644 gawk-5.0.1/test/range1.in
 create mode 100644 gawk-5.0.1/test/range1.ok
 create mode 100644 gawk-5.0.1/test/range2.awk
 create mode 100644 gawk-5.0.1/test/range2.ok
 create mode 100644 gawk-5.0.1/test/readbuf.awk
 create mode 100644 gawk-5.0.1/test/readbuf.ok
 create mode 100644 gawk-5.0.1/test/readdir.awk
 create mode 100644 gawk-5.0.1/test/readdir0.awk
 create mode 100644 gawk-5.0.1/test/readdir_retest.awk
 create mode 100644 gawk-5.0.1/test/readfile2.awk
 create mode 100644 gawk-5.0.1/test/readfile2.ok
 create mode 100644 gawk-5.0.1/test/rebrackloc.awk
 create mode 100644 gawk-5.0.1/test/rebrackloc.in
 create mode 100644 gawk-5.0.1/test/rebrackloc.ok
 create mode 100644 gawk-5.0.1/test/rebt8b1.awk
 create mode 100644 gawk-5.0.1/test/rebt8b1.ok
 create mode 100644 gawk-5.0.1/test/rebt8b2.awk
 create mode 100644 gawk-5.0.1/test/rebt8b2.ok
 create mode 100644 gawk-5.0.1/test/rebuf.awk
 create mode 100644 gawk-5.0.1/test/rebuf.in
 create mode 100644 gawk-5.0.1/test/rebuf.ok
 create mode 100644 gawk-5.0.1/test/rebuild.awk
 create mode 100644 gawk-5.0.1/test/rebuild.in
 create mode 100644 gawk-5.0.1/test/rebuild.ok
 create mode 100644 gawk-5.0.1/test/redfilnm.awk
 create mode 100644 gawk-5.0.1/test/redfilnm.in
 create mode 100644 gawk-5.0.1/test/redfilnm.ok
 create mode 100644 gawk-5.0.1/test/reg/Obsolete/exp.awk
 create mode 100644 gawk-5.0.1/test/reg/Obsolete/exp.good
 create mode 100644 gawk-5.0.1/test/reg/Obsolete/exp.in
 create mode 100644 gawk-5.0.1/test/reg/Obsolete/log.awk
 create mode 100644 gawk-5.0.1/test/reg/Obsolete/log.good
 create mode 100644 gawk-5.0.1/test/reg/Obsolete/log.in
 create mode 100644 gawk-5.0.1/test/reg/exp-eq.awk
 create mode 100644 gawk-5.0.1/test/reg/exp-eq.good
 create mode 100644 gawk-5.0.1/test/reg/exp-eq.in
 create mode 100644 gawk-5.0.1/test/reg/func.awk
 create mode 100644 gawk-5.0.1/test/reg/func.good
 create mode 100644 gawk-5.0.1/test/reg/func.in
 create mode 100644 gawk-5.0.1/test/reg/func2.awk
 create mode 100644 gawk-5.0.1/test/reg/func2.good
 create mode 100644 gawk-5.0.1/test/reg/func2.in
 create mode 100644 gawk-5.0.1/test/regeq.awk
 create mode 100644 gawk-5.0.1/test/regeq.in
 create mode 100644 gawk-5.0.1/test/regeq.ok
 create mode 100644 gawk-5.0.1/test/regexpbrack.awk
 create mode 100644 gawk-5.0.1/test/regexpbrack.in
 create mode 100644 gawk-5.0.1/test/regexpbrack.ok
 create mode 100644 gawk-5.0.1/test/regexpbrack2.awk
 create mode 100644 gawk-5.0.1/test/regexpbrack2.in
 create mode 100644 gawk-5.0.1/test/regexpbrack2.ok
 create mode 100644 gawk-5.0.1/test/regexprange.awk
 create mode 100644 gawk-5.0.1/test/regexprange.ok
 create mode 100644 gawk-5.0.1/test/reginttrad.awk
 create mode 100644 gawk-5.0.1/test/reginttrad.ok
 create mode 100644 gawk-5.0.1/test/regnul1.awk
 create mode 100644 gawk-5.0.1/test/regnul1.ok
 create mode 100644 gawk-5.0.1/test/regnul2.awk
 create mode 100644 gawk-5.0.1/test/regnul2.ok
 create mode 100644 gawk-5.0.1/test/regrange.awk
 create mode 100644 gawk-5.0.1/test/regrange.ok
 create mode 100755 gawk-5.0.1/test/regtest.sh
 create mode 100644 gawk-5.0.1/test/regx8bit.awk
 create mode 100644 gawk-5.0.1/test/regx8bit.ok
 create mode 100644 gawk-5.0.1/test/reindops.awk
 create mode 100644 gawk-5.0.1/test/reindops.in
 create mode 100644 gawk-5.0.1/test/reindops.ok
 create mode 100644 gawk-5.0.1/test/reint.awk
 create mode 100644 gawk-5.0.1/test/reint.in
 create mode 100644 gawk-5.0.1/test/reint.ok
 create mode 100644 gawk-5.0.1/test/reint2.awk
 create mode 100644 gawk-5.0.1/test/reint2.in
 create mode 100644 gawk-5.0.1/test/reint2.ok
 create mode 100644 gawk-5.0.1/test/reparse.awk
 create mode 100644 gawk-5.0.1/test/reparse.in
 create mode 100644 gawk-5.0.1/test/reparse.ok
 create mode 100644 gawk-5.0.1/test/resplit.awk
 create mode 100644 gawk-5.0.1/test/resplit.in
 create mode 100644 gawk-5.0.1/test/resplit.ok
 create mode 100644 gawk-5.0.1/test/revout.awk
 create mode 100644 gawk-5.0.1/test/revout.ok
 create mode 100644 gawk-5.0.1/test/revtwoway.awk
 create mode 100644 gawk-5.0.1/test/revtwoway.ok
 create mode 100644 gawk-5.0.1/test/rri1.awk
 create mode 100644 gawk-5.0.1/test/rri1.in
 create mode 100644 gawk-5.0.1/test/rri1.ok
 create mode 100644 gawk-5.0.1/test/rs.awk
 create mode 100644 gawk-5.0.1/test/rs.in
 create mode 100644 gawk-5.0.1/test/rs.ok
 create mode 100644 gawk-5.0.1/test/rscompat.awk
 create mode 100644 gawk-5.0.1/test/rscompat.in
 create mode 100644 gawk-5.0.1/test/rscompat.ok
 create mode 100644 gawk-5.0.1/test/rsgetline.awk
 create mode 100644 gawk-5.0.1/test/rsgetline.in
 create mode 100644 gawk-5.0.1/test/rsgetline.ok
 create mode 100644 gawk-5.0.1/test/rsglstdin.ok
 create mode 100644 gawk-5.0.1/test/rsnul1nl.awk
 create mode 100644 gawk-5.0.1/test/rsnul1nl.in
 create mode 100644 gawk-5.0.1/test/rsnul1nl.ok
 create mode 100644 gawk-5.0.1/test/rsnulbig.ok
 create mode 100644 gawk-5.0.1/test/rsnulbig2.ok
 create mode 100644 gawk-5.0.1/test/rsstart1.awk
 create mode 100644 gawk-5.0.1/test/rsstart1.in
 create mode 100644 gawk-5.0.1/test/rsstart1.ok
 create mode 100644 gawk-5.0.1/test/rsstart2.awk
 create mode 100644 gawk-5.0.1/test/rsstart2.in
 create mode 100644 gawk-5.0.1/test/rsstart2.ok
 create mode 100644 gawk-5.0.1/test/rsstart3.ok
 create mode 100644 gawk-5.0.1/test/rstest1.awk
 create mode 100644 gawk-5.0.1/test/rstest1.ok
 create mode 100644 gawk-5.0.1/test/rstest2.awk
 create mode 100644 gawk-5.0.1/test/rstest2.ok
 create mode 100644 gawk-5.0.1/test/rstest3.awk
 create mode 100644 gawk-5.0.1/test/rstest3.ok
 create mode 100644 gawk-5.0.1/test/rstest4.awk
 create mode 100644 gawk-5.0.1/test/rstest4.ok
 create mode 100644 gawk-5.0.1/test/rstest5.awk
 create mode 100644 gawk-5.0.1/test/rstest5.ok
 create mode 100644 gawk-5.0.1/test/rstest6.awk
 create mode 100644 gawk-5.0.1/test/rstest6.in
 create mode 100644 gawk-5.0.1/test/rstest6.ok
 create mode 100644 gawk-5.0.1/test/rswhite.awk
 create mode 100644 gawk-5.0.1/test/rswhite.in
 create mode 100644 gawk-5.0.1/test/rswhite.ok
 create mode 100644 gawk-5.0.1/test/rtlen.ok
 create mode 100755 gawk-5.0.1/test/rtlen.sh
 create mode 100644 gawk-5.0.1/test/rtlen01.ok
 create mode 100755 gawk-5.0.1/test/rtlen01.sh
 create mode 100644 gawk-5.0.1/test/rtlenmb.ok
 create mode 100644 gawk-5.0.1/test/rwarray.awk
 create mode 100644 gawk-5.0.1/test/rwarray.in
 create mode 100644 gawk-5.0.1/test/rwarray.ok
 create mode 100644 gawk-5.0.1/test/sandbox1.awk
 create mode 100644 gawk-5.0.1/test/sandbox1.ok
 create mode 100644 gawk-5.0.1/test/scalar.awk
 create mode 100644 gawk-5.0.1/test/scalar.ok
 create mode 100644 gawk-5.0.1/test/sclforin.awk
 create mode 100644 gawk-5.0.1/test/sclforin.ok
 create mode 100644 gawk-5.0.1/test/sclifin.awk
 create mode 100644 gawk-5.0.1/test/sclifin.ok
 create mode 100644 gawk-5.0.1/test/setrec0.awk
 create mode 100644 gawk-5.0.1/test/setrec0.in
 create mode 100644 gawk-5.0.1/test/setrec0.ok
 create mode 100644 gawk-5.0.1/test/setrec1.awk
 create mode 100644 gawk-5.0.1/test/setrec1.ok
 create mode 100644 gawk-5.0.1/test/shadow.awk
 create mode 100644 gawk-5.0.1/test/shadow.ok
 create mode 100644 gawk-5.0.1/test/shadowbuiltin.awk
 create mode 100644 gawk-5.0.1/test/shadowbuiltin.ok
 create mode 100644 gawk-5.0.1/test/sigpipe1.awk
 create mode 100644 gawk-5.0.1/test/sigpipe1.ok
 create mode 100644 gawk-5.0.1/test/sort1.awk
 create mode 100644 gawk-5.0.1/test/sort1.ok
 create mode 100644 gawk-5.0.1/test/sortempty.awk
 create mode 100644 gawk-5.0.1/test/sortempty.ok
 create mode 100644 gawk-5.0.1/test/sortfor.awk
 create mode 100644 gawk-5.0.1/test/sortfor.in
 create mode 100644 gawk-5.0.1/test/sortfor.ok
 create mode 100644 gawk-5.0.1/test/sortfor2.awk
 create mode 100644 gawk-5.0.1/test/sortfor2.in
 create mode 100644 gawk-5.0.1/test/sortfor2.ok
 create mode 100644 gawk-5.0.1/test/sortglos.awk
 create mode 100644 gawk-5.0.1/test/sortglos.in
 create mode 100644 gawk-5.0.1/test/sortglos.ok
 create mode 100644 gawk-5.0.1/test/sortu.awk
 create mode 100644 gawk-5.0.1/test/sortu.ok
 create mode 100644 gawk-5.0.1/test/sourcesplit.ok
 create mode 100644 gawk-5.0.1/test/space.ok
 create mode 100644 gawk-5.0.1/test/spacere.awk
 create mode 100644 gawk-5.0.1/test/spacere.ok
 create mode 100644 gawk-5.0.1/test/split_after_fpat.awk
 create mode 100644 gawk-5.0.1/test/split_after_fpat.in
 create mode 100644 gawk-5.0.1/test/split_after_fpat.ok
 create mode 100644 gawk-5.0.1/test/splitarg4.awk
 create mode 100644 gawk-5.0.1/test/splitarg4.in
 create mode 100644 gawk-5.0.1/test/splitarg4.ok
 create mode 100644 gawk-5.0.1/test/splitargv.awk
 create mode 100644 gawk-5.0.1/test/splitargv.in
 create mode 100644 gawk-5.0.1/test/splitargv.ok
 create mode 100644 gawk-5.0.1/test/splitarr.awk
 create mode 100644 gawk-5.0.1/test/splitarr.ok
 create mode 100644 gawk-5.0.1/test/splitdef.awk
 create mode 100644 gawk-5.0.1/test/splitdef.ok
 create mode 100644 gawk-5.0.1/test/splitvar.awk
 create mode 100644 gawk-5.0.1/test/splitvar.in
 create mode 100644 gawk-5.0.1/test/splitvar.ok
 create mode 100644 gawk-5.0.1/test/splitwht.awk
 create mode 100644 gawk-5.0.1/test/splitwht.ok
 create mode 100644 gawk-5.0.1/test/sprintfc.awk
 create mode 100644 gawk-5.0.1/test/sprintfc.in
 create mode 100644 gawk-5.0.1/test/sprintfc.ok
 create mode 100644 gawk-5.0.1/test/status-close.awk
 create mode 100644 gawk-5.0.1/test/status-close.ok
 create mode 100644 gawk-5.0.1/test/strcat1.awk
 create mode 100644 gawk-5.0.1/test/strcat1.ok
 create mode 100644 gawk-5.0.1/test/strftfld.awk
 create mode 100644 gawk-5.0.1/test/strftfld.in
 create mode 100644 gawk-5.0.1/test/strftfld.ok
 create mode 100644 gawk-5.0.1/test/strftime.awk
 create mode 100644 gawk-5.0.1/test/strftlng.awk
 create mode 100644 gawk-5.0.1/test/strftlng.ok
 create mode 100644 gawk-5.0.1/test/strnum1.awk
 create mode 100644 gawk-5.0.1/test/strnum1.ok
 create mode 100644 gawk-5.0.1/test/strnum2.awk
 create mode 100644 gawk-5.0.1/test/strnum2.ok
 create mode 100644 gawk-5.0.1/test/strtod.awk
 create mode 100644 gawk-5.0.1/test/strtod.in
 create mode 100644 gawk-5.0.1/test/strtod.ok
 create mode 100644 gawk-5.0.1/test/strtonum.awk
 create mode 100644 gawk-5.0.1/test/strtonum.ok
 create mode 100644 gawk-5.0.1/test/strtonum1.awk
 create mode 100644 gawk-5.0.1/test/strtonum1.ok
 create mode 100644 gawk-5.0.1/test/subamp.awk
 create mode 100644 gawk-5.0.1/test/subamp.in
 create mode 100644 gawk-5.0.1/test/subamp.ok
 create mode 100644 gawk-5.0.1/test/subback.awk
 create mode 100644 gawk-5.0.1/test/subback.in
 create mode 100644 gawk-5.0.1/test/subback.ok
 create mode 100644 gawk-5.0.1/test/subi18n.awk
 create mode 100644 gawk-5.0.1/test/subi18n.ok
 create mode 100644 gawk-5.0.1/test/subsepnm.awk
 create mode 100644 gawk-5.0.1/test/subsepnm.ok
 create mode 100644 gawk-5.0.1/test/subslash.awk
 create mode 100644 gawk-5.0.1/test/subslash.ok
 create mode 100644 gawk-5.0.1/test/substr.awk
 create mode 100644 gawk-5.0.1/test/substr.ok
 create mode 100644 gawk-5.0.1/test/swaplns.awk
 create mode 100644 gawk-5.0.1/test/swaplns.in
 create mode 100644 gawk-5.0.1/test/swaplns.ok
 create mode 100644 gawk-5.0.1/test/switch2.awk
 create mode 100644 gawk-5.0.1/test/switch2.ok
 create mode 100644 gawk-5.0.1/test/symtab1.awk
 create mode 100644 gawk-5.0.1/test/symtab1.ok
 create mode 100644 gawk-5.0.1/test/symtab10.awk
 create mode 100644 gawk-5.0.1/test/symtab10.in
 create mode 100644 gawk-5.0.1/test/symtab10.ok
 create mode 100644 gawk-5.0.1/test/symtab2.awk
 create mode 100644 gawk-5.0.1/test/symtab2.ok
 create mode 100644 gawk-5.0.1/test/symtab3.awk
 create mode 100644 gawk-5.0.1/test/symtab3.ok
 create mode 100644 gawk-5.0.1/test/symtab4.awk
 create mode 100644 gawk-5.0.1/test/symtab4.in
 create mode 100644 gawk-5.0.1/test/symtab4.ok
 create mode 100644 gawk-5.0.1/test/symtab5.awk
 create mode 100644 gawk-5.0.1/test/symtab5.in
 create mode 100644 gawk-5.0.1/test/symtab5.ok
 create mode 100644 gawk-5.0.1/test/symtab6.awk
 create mode 100644 gawk-5.0.1/test/symtab6.ok
 create mode 100644 gawk-5.0.1/test/symtab7.awk
 create mode 100644 gawk-5.0.1/test/symtab7.in
 create mode 100644 gawk-5.0.1/test/symtab7.ok
 create mode 100644 gawk-5.0.1/test/symtab8.awk
 create mode 100644 gawk-5.0.1/test/symtab8.in
 create mode 100644 gawk-5.0.1/test/symtab8.ok
 create mode 100644 gawk-5.0.1/test/symtab9.awk
 create mode 100644 gawk-5.0.1/test/symtab9.ok
 create mode 100644 gawk-5.0.1/test/synerr1.awk
 create mode 100644 gawk-5.0.1/test/synerr1.ok
 create mode 100644 gawk-5.0.1/test/synerr2.awk
 create mode 100644 gawk-5.0.1/test/synerr2.ok
 create mode 100644 gawk-5.0.1/test/synerr3.awk
 create mode 100644 gawk-5.0.1/test/synerr3.ok
 create mode 100644 gawk-5.0.1/test/tailrecurse.awk
 create mode 100644 gawk-5.0.1/test/tailrecurse.ok
 create mode 100644 gawk-5.0.1/test/testext.ok
 create mode 100644 gawk-5.0.1/test/time.awk
 create mode 100644 gawk-5.0.1/test/time.ok
 create mode 100644 gawk-5.0.1/test/timeout.awk
 create mode 100644 gawk-5.0.1/test/timeout.ok
 create mode 100644 gawk-5.0.1/test/tradanch.awk
 create mode 100644 gawk-5.0.1/test/tradanch.in
 create mode 100644 gawk-5.0.1/test/tradanch.ok
 create mode 100644 gawk-5.0.1/test/trailbs.awk
 create mode 100644 gawk-5.0.1/test/trailbs.in
 create mode 100644 gawk-5.0.1/test/trailbs.ok
 create mode 100644 gawk-5.0.1/test/tweakfld.awk
 create mode 100644 gawk-5.0.1/test/tweakfld.in
 create mode 100644 gawk-5.0.1/test/tweakfld.ok
 create mode 100644 gawk-5.0.1/test/typedregex1.awk
 create mode 100644 gawk-5.0.1/test/typedregex1.ok
 create mode 100644 gawk-5.0.1/test/typedregex2.awk
 create mode 100644 gawk-5.0.1/test/typedregex2.ok
 create mode 100644 gawk-5.0.1/test/typedregex3.awk
 create mode 100644 gawk-5.0.1/test/typedregex3.ok
 create mode 100644 gawk-5.0.1/test/typedregex4.awk
 create mode 100644 gawk-5.0.1/test/typedregex4.ok
 create mode 100644 gawk-5.0.1/test/typeof1.awk
 create mode 100644 gawk-5.0.1/test/typeof1.ok
 create mode 100644 gawk-5.0.1/test/typeof2.awk
 create mode 100644 gawk-5.0.1/test/typeof2.ok
 create mode 100644 gawk-5.0.1/test/typeof3.awk
 create mode 100644 gawk-5.0.1/test/typeof3.ok
 create mode 100644 gawk-5.0.1/test/typeof4.awk
 create mode 100644 gawk-5.0.1/test/typeof4.ok
 create mode 100644 gawk-5.0.1/test/typeof5.awk
 create mode 100644 gawk-5.0.1/test/typeof5.in
 create mode 100644 gawk-5.0.1/test/typeof5.ok
 create mode 100644 gawk-5.0.1/test/uninit2.awk
 create mode 100644 gawk-5.0.1/test/uninit2.ok
 create mode 100644 gawk-5.0.1/test/uninit3.awk
 create mode 100644 gawk-5.0.1/test/uninit3.ok
 create mode 100644 gawk-5.0.1/test/uninit4.awk
 create mode 100644 gawk-5.0.1/test/uninit4.ok
 create mode 100644 gawk-5.0.1/test/uninit5.awk
 create mode 100644 gawk-5.0.1/test/uninit5.ok
 create mode 100644 gawk-5.0.1/test/uninitialized.awk
 create mode 100644 gawk-5.0.1/test/uninitialized.ok
 create mode 100644 gawk-5.0.1/test/unterm.awk
 create mode 100644 gawk-5.0.1/test/unterm.ok
 create mode 100644 gawk-5.0.1/test/uparrfs.awk
 create mode 100644 gawk-5.0.1/test/uparrfs.in
 create mode 100644 gawk-5.0.1/test/uparrfs.ok
 create mode 100644 gawk-5.0.1/test/uplus.awk
 create mode 100644 gawk-5.0.1/test/uplus.ok
 create mode 100644 gawk-5.0.1/test/valgrind.awk
 create mode 100644 gawk-5.0.1/test/watchpoint1.awk
 create mode 100644 gawk-5.0.1/test/watchpoint1.in
 create mode 100644 gawk-5.0.1/test/watchpoint1.ok
 create mode 100644 gawk-5.0.1/test/watchpoint1.script
 create mode 100644 gawk-5.0.1/test/wideidx.awk
 create mode 100644 gawk-5.0.1/test/wideidx.in
 create mode 100644 gawk-5.0.1/test/wideidx.ok
 create mode 100644 gawk-5.0.1/test/wideidx2.awk
 create mode 100644 gawk-5.0.1/test/wideidx2.ok
 create mode 100644 gawk-5.0.1/test/widesub.awk
 create mode 100644 gawk-5.0.1/test/widesub.ok
 create mode 100644 gawk-5.0.1/test/widesub2.awk
 create mode 100644 gawk-5.0.1/test/widesub2.ok
 create mode 100644 gawk-5.0.1/test/widesub3.awk
 create mode 100644 gawk-5.0.1/test/widesub3.in
 create mode 100644 gawk-5.0.1/test/widesub3.ok
 create mode 100644 gawk-5.0.1/test/widesub4.awk
 create mode 100644 gawk-5.0.1/test/widesub4.ok
 create mode 100644 gawk-5.0.1/test/wjposer1.awk
 create mode 100644 gawk-5.0.1/test/wjposer1.in
 create mode 100644 gawk-5.0.1/test/wjposer1.ok
 create mode 100644 gawk-5.0.1/test/xref.awk
 create mode 100644 gawk-5.0.1/test/xref.original
 create mode 100644 gawk-5.0.1/test/zero2.awk
 create mode 100644 gawk-5.0.1/test/zero2.ok
 create mode 100644 gawk-5.0.1/test/zeroe0.awk
 create mode 100644 gawk-5.0.1/test/zeroe0.ok
 create mode 100644 gawk-5.0.1/test/zeroflag.awk
 create mode 100644 gawk-5.0.1/test/zeroflag.ok
 create mode 100644 gawk-5.0.1/version.c
 create mode 100644 gawk-5.0.1/vms/ChangeLog
 create mode 100644 gawk-5.0.1/vms/ChangeLog.0
 create mode 100644 gawk-5.0.1/vms/ChangeLog.1
 create mode 100644 gawk-5.0.1/vms/backup_gawk_src.com
 create mode 100644 gawk-5.0.1/vms/build_gawk_pcsi_desc.com
 create mode 100644 gawk-5.0.1/vms/build_gawk_pcsi_text.com
 create mode 100644 gawk-5.0.1/vms/build_gawk_release_notes.com
 create mode 100644 gawk-5.0.1/vms/compare_gawk_source.com
 create mode 100644 gawk-5.0.1/vms/config_h.com
 create mode 100644 gawk-5.0.1/vms/descrip.mms
 create mode 100644 gawk-5.0.1/vms/gawk.cld
 create mode 100644 gawk-5.0.1/vms/gawk.hlp
 create mode 100644 gawk-5.0.1/vms/gawk_alias_setup.com
 create mode 100644 gawk-5.0.1/vms/gawk_build_steps.txt
 create mode 100644 gawk-5.0.1/vms/gawk_ident.com
 create mode 100644 gawk-5.0.1/vms/gawk_plugin.opt
 create mode 100644 gawk-5.0.1/vms/gawk_release_note_start.txt
 create mode 100644 gawk-5.0.1/vms/gawk_verb.com
 create mode 100644 gawk-5.0.1/vms/gawkmisc.vms
 create mode 100644 gawk-5.0.1/vms/generate_config_vms_h_gawk.com
 create mode 100644 gawk-5.0.1/vms/gnv_gawk_startup.com
 create mode 100644 gawk-5.0.1/vms/make_pcsi_gawk_kit_name.com
 create mode 100644 gawk-5.0.1/vms/pcsi_gawk_file_list.txt
 create mode 100644 gawk-5.0.1/vms/pcsi_product_gawk.com
 create mode 100755 gawk-5.0.1/vms/posix-cc.sh
 create mode 100644 gawk-5.0.1/vms/redirect.h
 create mode 100644 gawk-5.0.1/vms/remove_old_gawk.com
 create mode 100644 gawk-5.0.1/vms/stage_gawk_install.com
 create mode 100644 gawk-5.0.1/vms/unixlib.h
 create mode 100644 gawk-5.0.1/vms/varargs.h
 create mode 100644 gawk-5.0.1/vms/vax/ChangeLog
 create mode 100644 gawk-5.0.1/vms/vax/gawk_plugin_xfer.mar_exact
 create mode 100644 gawk-5.0.1/vms/vax/gawk_plugin_xfer.opt
 create mode 100644 gawk-5.0.1/vms/vax/macro32_exactcase.com
 create mode 100644 gawk-5.0.1/vms/vms.h
 create mode 100644 gawk-5.0.1/vms/vms_args.c
 create mode 100644 gawk-5.0.1/vms/vms_cli.c
 create mode 100644 gawk-5.0.1/vms/vms_crtl_init.c
 create mode 100644 gawk-5.0.1/vms/vms_fwrite.c
 create mode 100644 gawk-5.0.1/vms/vms_gawk.c
 create mode 100644 gawk-5.0.1/vms/vms_misc.c
 create mode 100644 gawk-5.0.1/vms/vms_popen.c
 create mode 100755 gawk-5.0.1/vms/vms_sort.com
 create mode 100644 gawk-5.0.1/vms/vmsbuild.com
 create mode 100644 gawk-5.0.1/vms/vmstest.com
 create mode 100755 gawk-5.0.1/ylwrap

diff --git a/gawk-5.0.1/ABOUT-NLS b/gawk-5.0.1/ABOUT-NLS
new file mode 100644
index 00000000000..3cc828658cb
--- /dev/null
+++ b/gawk-5.0.1/ABOUT-NLS
@@ -0,0 +1,1379 @@
+1 Notes on the Free Translation Project
+***************************************
+
+Free software is going international!  The Free Translation Project is a
+way to get maintainers of free software, translators, and users all
+together, so that free software will gradually become able to speak many
+languages.  A few packages already provide translations for their
+messages.
+
+   If you found this 'ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU 'gettext' internally,
+itself available at your nearest GNU archive site.  But you do _not_
+need to install GNU 'gettext' prior to configuring, installing or using
+this package with messages translated.
+
+   Installers will find here some useful hints.  These notes also
+explain how users should proceed for getting the programs to use the
+available translations.  They tell how people wanting to contribute and
+work on translations can contact the appropriate team.
+
+1.1 INSTALL Matters
+===================
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language.  Most such
+packages use GNU 'gettext'.  Other packages have their own ways to
+internationalization, predating GNU 'gettext'.
+
+   By default, this package will be installed to allow translation of
+messages.  It will automatically detect whether the system already
+provides the GNU 'gettext' functions.  Installers may use special
+options at configuration time for changing the default behaviour.  The
+command:
+
+     ./configure --disable-nls
+
+will _totally_ disable translation of messages.
+
+   When you already have GNU 'gettext' installed on your system and run
+configure without an option for your new package, 'configure' will
+probably detect the previously built and installed 'libintl' library and
+will decide to use it.  If not, you may have to to use the
+'--with-libintl-prefix' option to tell 'configure' where to look for it.
+
+   Internationalized packages usually have many 'po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language.  Unless
+translations have been forbidden at 'configure' time by using the
+'--disable-nls' switch, all available translations are installed
+together with the package.  However, the environment variable 'LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+'LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+1.2 Using This Package
+======================
+
+As a user, if your language has been installed for this package, you
+only have to set the 'LANG' environment variable to the appropriate
+'LL_CC' combination.  If you happen to have the 'LC_ALL' or some other
+'LC_xxx' environment variables set, you should unset them before setting
+'LANG', otherwise the setting of 'LANG' will not have the desired
+effect.  Here 'LL' is an ISO 639 two-letter language code, and 'CC' is
+an ISO 3166 two-letter country code.  For example, let's suppose that
+you speak German and live in Germany.  At the shell prompt, merely
+execute 'setenv LANG de_DE' (in 'csh'), 'export LANG; LANG=de_DE' (in
+'sh') or 'export LANG=de_DE' (in 'bash').  This can be done from your
+'.login' or '.profile' file, once and for all.
+
+   You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries.  For
+example, 'de_AT' is used for Austria, and 'pt_BR' for Brazil.  The
+country code serves to distinguish the dialects.
+
+   The locale naming convention of 'LL_CC', with 'LL' denoting the
+language and 'CC' denoting the country, is the one use on systems based
+on GNU libc.  On other systems, some variations of this scheme are used,
+such as 'LL' or 'LL_CC.ENCODING'.  You can get the list of locales
+supported by your system for your language by running the command
+'locale -a | grep '^LL''.
+
+   Not all programs have translations for all languages.  By default, an
+English message is shown in place of a nonexistent translation.  If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+'LANGUAGE'.  GNU 'gettext' gives preference to 'LANGUAGE' over 'LANG'
+for the purpose of message handling, but you still need to have 'LANG'
+set to the primary language; this is required by other parts of the
+system libraries.  For example, some Swedish users who would rather read
+translations in German than English for when Swedish is not available,
+set 'LANGUAGE' to 'sv:de' while leaving 'LANG' to 'sv_SE'.
+
+   Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from 'no' to 'nb' recently (in 2003).  During the
+transition period, while some message catalogs for this language are
+installed under 'nb' and some older ones under 'no', it's recommended
+for Norwegian users to set 'LANGUAGE' to 'nb:no' so that both newer and
+older translations are used.
+
+   In the 'LANGUAGE' environment variable, but not in the 'LANG'
+environment variable, 'LL_CC' combinations can be abbreviated as 'LL' to
+denote the language's main dialect.  For example, 'de' is equivalent to
+'de_DE' (German as spoken in Germany), and 'pt' to 'pt_PT' (Portuguese
+as spoken in Portugal) in this context.
+
+1.3 Translating Teams
+=====================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list.  The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+'http://translationproject.org/', in the "Teams" area.
+
+   If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+'-request' appended.  For example, speakers of Swedish can send a
+message to 'sv-request@li.org', having this message body:
+
+     subscribe
+
+   Keep in mind that team members are expected to participate _actively_
+in translations, or at solving translational difficulties, rather than
+merely lurking around.  If your team does not exist yet and you want to
+start one, or if you are unsure about what to do or how to get started,
+please write to 'coordinator@translationproject.org' to reach the
+coordinator for all translator teams.
+
+   The English team is special.  It works at improving and uniformizing
+the terminology in use.  Proven linguistic skills are praised more than
+programming skills, here.
+
+1.4 Available Packages
+======================
+
+Languages are not equally supported in all packages.  The following
+matrix shows the current state of internationalization, as of Jun 2014.
+The matrix shows, in regard of each package, for which languages PO
+files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+     Ready PO files       af am an ar as ast az be bg bn bn_IN bs ca crh cs
+                        +---------------------------------------------------+
+     a2ps               |                       []                []     [] |
+     aegis              |                                                   |
+     anubis             |                                                   |
+     aspell             |                []                       []     [] |
+     bash               |                          []             []     [] |
+     bfd                |                                                   |
+     binutils           |                                         []        |
+     bison              |                                                   |
+     bison-runtime      |                []                                 |
+     buzztrax           |                                                [] |
+     ccd2cue            |                                                   |
+     ccide              |                                                   |
+     cflow              |                                                   |
+     clisp              |                                                   |
+     coreutils          |                                         []     [] |
+     cpio               |                                                   |
+     cppi               |                                                   |
+     cpplib             |                                         []        |
+     cryptsetup         |                                                [] |
+     datamash           |                                                   |
+     denemo             |                                         []     [] |
+     dfarc              |                                         []        |
+     dialog             |       []                                []     [] |
+     dico               |                                                   |
+     diffutils          |                                                [] |
+     dink               |                                         []        |
+     direvent           |                                                   |
+     doodle             |                                                [] |
+     dos2unix           |                                                   |
+     dos2unix-man       |                                                   |
+     e2fsprogs          |                                         []     [] |
+     enscript           |                                         []        |
+     exif               |                                                [] |
+     fetchmail          |                                         []     [] |
+     findutils          |                                                [] |
+     flex               |                                         []        |
+     freedink           |                                         []     [] |
+     fusionforge        |                                                   |
+     gas                |                                                   |
+     gawk               |                                         []        |
+     gcal               |                                         []        |
+     gcc                |                                                   |
+     gdbm               |                                                   |
+     gettext-examples   | []             []        []             []     [] |
+     gettext-runtime    |                          []             []     [] |
+     gettext-tools      |                          []             []        |
+     gjay               |                                                   |
+     glunarclock        |                []        []                    [] |
+     gnubiff            |                                                [] |
+     gnubik             |          []                                       |
+     gnucash            |          ()              ()             []        |
+     gnuchess           |                                                   |
+     gnulib             |                                                [] |
+     gnunet             |                                                   |
+     gnunet-gtk         |                                                   |
+     gold               |                                                   |
+     gphoto2            |                                                [] |
+     gprof              |                          []                       |
+     gramadoir          |                                                   |
+     grep               |                          []             []     [] |
+     grub               |                                         []        |
+     gsasl              |                                                   |
+     gss                |                                                   |
+     gst-plugins-bad    |                          []                    [] |
+     gst-plugins-base   |                          []             []     [] |
+     gst-plugins-good   |                          []             []     [] |
+     gst-plugins-ugly   |                          []             []     [] |
+     gstreamer          |                []        []             []     [] |
+     gtick              |                                                [] |
+     gtkam              |                       []                       [] |
+     gtkspell           | []             []     []                []     [] |
+     guix               |                                                   |
+     guix-packages      |                                                   |
+     gutenprint         |                                         []        |
+     hello              |                                         []        |
+     help2man           |                                                   |
+     help2man-texi      |                                                   |
+     hylafax            |                                                   |
+     idutils            |                                                   |
+     iso_15924          |                                                [] |
+     iso_3166           | []          []        [] [] []  []   [] [] []  [] |
+     iso_3166_2         |                                                   |
+     iso_4217           |                                                [] |
+     iso_639            |             [] []     [] [] []  []      [] []  [] |
+     iso_639_3          |                []                          []     |
+     iso_639_5          |                                                   |
+     jwhois             |                                                   |
+     kbd                |                                                [] |
+     klavaro            |          []              [] []          []     [] |
+     ld                 |                          []                       |
+     leafpad            |                       [] []             []     [] |
+     libc               |                          []             []     [] |
+     libexif            |                       ()                          |
+     libextractor       |                                                   |
+     libgnutls          |                                                [] |
+     libgphoto2         |                                                [] |
+     libgphoto2_port    |                                                [] |
+     libgsasl           |                                                   |
+     libiconv           |                          []                    [] |
+     libidn             |                                                [] |
+     liferea            |          []    []                       []     [] |
+     lilypond           |                                         []     [] |
+     lordsawar          |                                         []        |
+     lprng              |                                                   |
+     lynx               |                                         []     [] |
+     m4                 |                                                [] |
+     mailfromd          |                                                   |
+     mailutils          |                                                   |
+     make               |                                                [] |
+     man-db             |                                         []     [] |
+     man-db-manpages    |                                                   |
+     midi-instruments   |          []                             []     [] |
+     minicom            |                                                [] |
+     mkisofs            |                                                [] |
+     myserver           |                                                [] |
+     nano               |                          []             []     [] |
+     opcodes            |                                                   |
+     parted             |                                                [] |
+     pies               |                                                   |
+     pnmixer            |                                                   |
+     popt               |                                                [] |
+     procps-ng          |                                                   |
+     procps-ng-man      |                                                   |
+     psmisc             |                                                [] |
+     pspp               |                                         []        |
+     pushover           |                                                [] |
+     pwdutils           |                                                   |
+     pyspread           |                                                   |
+     radius             |                                         []        |
+     recode             |                       []                []     [] |
+     recutils           |                                                   |
+     rpm                |                                                   |
+     rush               |                                                   |
+     sarg               |                                                   |
+     sed                |                []        []             []     [] |
+     sharutils          |                                                [] |
+     shishi             |                                                   |
+     skribilo           |                                                   |
+     solfege            |                                         []     [] |
+     solfege-manual     |                                                   |
+     spotmachine        |                                                   |
+     sudo               |                                         []     [] |
+     sudoers            |                                         []     [] |
+     sysstat            |                                                [] |
+     tar                |                          []             []     [] |
+     texinfo            |                                         []     [] |
+     texinfo_document   |                                         []     [] |
+     tigervnc           |                          []                       |
+     tin                |                                                   |
+     tin-man            |                                                   |
+     tracgoogleappsa... |                                                   |
+     trader             |                                                   |
+     util-linux         |                                                [] |
+     ve                 |                                                   |
+     vice               |                                                   |
+     vmm                |                                                   |
+     vorbis-tools       |                                                [] |
+     wastesedge         |                                                   |
+     wcd                |                                                   |
+     wcd-man            |                                                   |
+     wdiff              |                                         []     [] |
+     wget               |                                                [] |
+     wyslij-po          |                                                   |
+     xboard             |                                                   |
+     xdg-user-dirs      | []    []    [] []     [] []     []      [] []  [] |
+     xkeyboard-config   |                          []             []     [] |
+                        +---------------------------------------------------+
+                          af am an ar as ast az be bg bn bn_IN bs ca crh cs
+                           4  0  2  5  3 11   0  8 25  3   3    1 55  4  74
+
+                          da  de  el en en_GB en_ZA eo es et eu fa fi  fr 
+                        +--------------------------------------------------+
+     a2ps               | []  []  []     []         [] [] []       []  []  |
+     aegis              | []  []                       []              []  |
+     anubis             | []  []                       []          []  []  |
+     aspell             | []  []         []         [] []          []  []  |
+     bash               |                           [] []              []  |
+     bfd                | []                           []          []  []  |
+     binutils           |                              []          []  []  |
+     bison              | []  []  []                [] [] []       []  []  |
+     bison-runtime      | []  []  []                [] [] []       []  []  |
+     buzztrax           | []  []                                   []  []  |
+     ccd2cue            | []  []                    []                 []  |
+     ccide              | []  []                    [] []          []  []  |
+     cflow              | []  []                    []             []  []  |
+     clisp              | []  []     []                []              []  |
+     coreutils          | []  []                       [] []           []  |
+     cpio               | []  []                       []          []  []  |
+     cppi               | []  []                    []             []  []  |
+     cpplib             | []  []                    [] []          []  []  |
+     cryptsetup         | []  []                       []          []  []  |
+     datamash           | []  []                    []                 []  |
+     denemo             | []                                               |
+     dfarc              | []  []                    [] []          []  []  |
+     dialog             | []  []  []                [] []    [] [] []  []  |
+     dico               | []  []                                   []  []  |
+     diffutils          | []  []  []                [] []              []  |
+     dink               | []  []                    [] []          []  []  |
+     direvent           | []  []                    []                 []  |
+     doodle             | []  []                    []             []      |
+     dos2unix           | []  []                    [] []              []  |
+     dos2unix-man       |     []                       []              []  |
+     e2fsprogs          | []  []                    [] []              []  |
+     enscript           | []  []         []         []             []  []  |
+     exif               | []  []                    [] []          []  []  |
+     fetchmail          | []  ()  []     []         [] []              []  |
+     findutils          | []  []  []                [] [] []       []  []  |
+     flex               | []  []                    [] []          []  []  |
+     freedink           | []  []  []                [] []    []    []  []  |
+     fusionforge        |     []                       []              []  |
+     gas                |                              []          []  []  |
+     gawk               | []  []                       []          []  []  |
+     gcal               | []  []                       []              []  |
+     gcc                |     []                                           |
+     gdbm               | []  []                    []             []  []  |
+     gettext-examples   | []  []  []                [] []          []  []  |
+     gettext-runtime    | []  []                    [] []          []  []  |
+     gettext-tools      | []  []                       []          []  []  |
+     gjay               |     []                    []             []  []  |
+     glunarclock        | []  []                    []             []  []  |
+     gnubiff            |     ()                    []             []  ()  |
+     gnubik             | []  []                    []             []  []  |
+     gnucash            | []  ()  ()     ()            ()          ()  ()  |
+     gnuchess           |     []                    [] []              []  |
+     gnulib             | []  []                    [] [] []       []  []  |
+     gnunet             |                              []                  |
+     gnunet-gtk         |     []                                           |
+     gold               |                              []          []  []  |
+     gphoto2            | []  ()                    []                 []  |
+     gprof              | []  []                    [] []          []  []  |
+     gramadoir          | []  []                    []             []  []  |
+     grep               | []  []                    [] [] []       []  []  |
+     grub               | []  []                       []          []  []  |
+     gsasl              | []  []                    []             []  []  |
+     gss                | []  []                    []             []  []  |
+     gst-plugins-bad    | []  []                                       []  |
+     gst-plugins-base   | []  []  []                   []          []  []  |
+     gst-plugins-good   | []  []  []                   []    []    []  []  |
+     gst-plugins-ugly   | []  []  []                [] []    []    []  []  |
+     gstreamer          | []  []  []                   []    []    []  []  |
+     gtick              | []  ()                    []             []  []  |
+     gtkam              | []  ()                    [] []          []  []  |
+     gtkspell           | []  []  []                [] []    []    []  []  |
+     guix               | []                        []                     |
+     guix-packages      |                                                  |
+     gutenprint         | []  []                                   []  []  |
+     hello              | []  []  []                [] [] []       []  []  |
+     help2man           | []  []  []                [] []          []  []  |
+     help2man-texi      |     []                       []              []  |
+     hylafax            |     []                       []                  |
+     idutils            | []  []                    []             []  []  |
+     iso_15924          | []  ()                    [] []    ()    []  ()  |
+     iso_3166           | []  ()  []                [] [] [] ()    []  ()  |
+     iso_3166_2         | []  ()                             ()        ()  |
+     iso_4217           | []  ()  []                   [] [] ()    []  ()  |
+     iso_639            | []  ()                    [] []    ()    []  ()  |
+     iso_639_3          |     ()                             ()        ()  |
+     iso_639_5          |     ()                             ()        ()  |
+     jwhois             |     []                    [] []          []  []  |
+     kbd                | []  []  []                [] []              []  |
+     klavaro            | []  []  []                [] []    []        []  |
+     ld                 | []                           []          []  []  |
+     leafpad            | []  []  []                [] []    []    []  []  |
+     libc               | []  []                       []          []  []  |
+     libexif            | []  []         ()            []              []  |
+     libextractor       |     []                                           |
+     libgnutls          |     []                    []             []  []  |
+     libgphoto2         | []  ()                                       []  |
+     libgphoto2_port    | []  ()                       []    []    []  []  |
+     libgsasl           | []  []                    []             []  []  |
+     libiconv           | []  []                    [] [] []       []  []  |
+     libidn             | []  []                    []             []  []  |
+     liferea            | []  ()  []                   []    []    []  []  |
+     lilypond           | []  []  []                [] []              []  |
+     lordsawar          | []  []                                           |
+     lprng              |                                                  |
+     lynx               | []  []                    []    []       []  []  |
+     m4                 | []  []  []                []             []  []  |
+     mailfromd          |                                              []  |
+     mailutils          |     []                       []          []  []  |
+     make               | []  []                       []          []  []  |
+     man-db             | []  []                    []                 []  |
+     man-db-manpages    |     []                                       []  |
+     midi-instruments   | []  []  []                [] [] []    [] []  []  |
+     minicom            | []  []                       []          []  []  |
+     mkisofs            |                           []             []  []  |
+     myserver           |     []                    []             []  []  |
+     nano               | []  []                    [] []    []    []  []  |
+     opcodes            | []  []                       []          []  []  |
+     parted             | []  []                                       []  |
+     pies               |     []                                           |
+     pnmixer            |     []                                       []  |
+     popt               | []  []                    [] []          []  []  |
+     procps-ng          |     []                                       []  |
+     procps-ng-man      |     []                                       []  |
+     psmisc             | []  []  []                []       []    []  []  |
+     pspp               |     []                       []              []  |
+     pushover           |     ()                    [] []              []  |
+     pwdutils           | []  []                                       []  |
+     pyspread           | []  []                                       []  |
+     radius             |                              []              []  |
+     recode             | []  []  []                [] []          []  []  |
+     recutils           |     []                       []          []  []  |
+     rpm                | []  []                    []             []  []  |
+     rush               |     []                                   []  []  |
+     sarg               | []                                           []  |
+     sed                | []  []  []                [] [] []       []  []  |
+     sharutils          |     []                    []    []           []  |
+     shishi             |     []                                   []  []  |
+     skribilo           | []                           []              []  |
+     solfege            | []  []                    [] [] []    [] []  []  |
+     solfege-manual     |     []                    [] [] []           []  |
+     spotmachine        | []  []                    []             []  []  |
+     sudo               | []  []                    [] []          []  []  |
+     sudoers            | []  []  []                []             []  []  |
+     sysstat            | []  []                    [] []          []  []  |
+     tar                | []  []                    [] [] []       []  []  |
+     texinfo            | []  []                    [] []              []  |
+     texinfo_document   |     []                    [] []              []  |
+     tigervnc           | []  []  []                []             []  []  |
+     tin                | []  []                          []           []  |
+     tin-man            |                []                                |
+     tracgoogleappsa... | []  []                    []             []  []  |
+     trader             | []  []         []         []             []  []  |
+     util-linux         | []  []                       []              []  |
+     ve                 |     []                    [] []          []  []  |
+     vice               | ()  ()                                       ()  |
+     vmm                |     []                                   []      |
+     vorbis-tools       | []  []                    []                 []  |
+     wastesedge         | []                                               |
+     wcd                |     []                    [] []          []      |
+     wcd-man            |     []                                           |
+     wdiff              | []  []                    [] [] []       []  []  |
+     wget               |     []                    [] [] []       []  []  |
+     wyslij-po          |     []                    []             []  []  |
+     xboard             | []  []                       []              []  |
+     xdg-user-dirs      | []  []  []                [] [] [] [] [] []  []  |
+     xkeyboard-config   | []  []  []                [] []          []  []  |
+                        +--------------------------------------------------+
+                          da  de  el en en_GB en_ZA eo es et eu fa fi  fr 
+                          119 131 32  1   6     0   94 95 22 13  4 102 139
+
+                          ga gd gl gu he hi hr hu hy ia id is it ja ka kk
+                        +-------------------------------------------------+
+     a2ps               |                   []          []    [] []       |
+     aegis              |                                     []          |
+     anubis             |                   [] []       []    []          |
+     aspell             | []                []          []    [] []       |
+     bash               |                      []       []    [] []       |
+     bfd                |                               []       []       |
+     binutils           |                               []    [] []       |
+     bison              |                   []                            |
+     bison-runtime      | []    []          [] []    [] []    [] []       |
+     buzztrax           |                                                 |
+     ccd2cue            |                      []                         |
+     ccide              |                   [] []                         |
+     cflow              | []                []          []                |
+     clisp              |                                                 |
+     coreutils          |                      []                []       |
+     cpio               | []                [] []       []    [] []       |
+     cppi               |       []          [] []             [] []       |
+     cpplib             |                               []       []       |
+     cryptsetup         |                                     []          |
+     datamash           |                                                 |
+     denemo             |                                     []          |
+     dfarc              |                   [] []             []          |
+     dialog             | [] [] []          [] []    [] [] [] [] []       |
+     dico               |                                                 |
+     diffutils          |                      []       []    [] []       |
+     dink               |                      []                         |
+     direvent           |                      []                         |
+     doodle             | []                                  []          |
+     dos2unix           |                      []                []       |
+     dos2unix-man       |                                                 |
+     e2fsprogs          |                      []       []                |
+     enscript           | []                []          []                |
+     exif               |       []          []          [] [] [] []       |
+     fetchmail          |                               []    [] []       |
+     findutils          | []    []          [] []       []    [] []       |
+     flex               | []                                              |
+     freedink           |                   [] []       []    []          |
+     fusionforge        |                                                 |
+     gas                |                               []                |
+     gawk               |                               []    () []       |
+     gcal               |                                                 |
+     gcc                |                                                 |
+     gdbm               |                                                 |
+     gettext-examples   | []    []          [] []       []    [] []       |
+     gettext-runtime    | []    []          [] []       []    [] []       |
+     gettext-tools      |                               []    [] []       |
+     gjay               |       []                                        |
+     glunarclock        | []    []          [] []       []    []          |
+     gnubiff            |                      []       []    ()          |
+     gnubik             |       []          []                []          |
+     gnucash            |          () () ()    ()             ()          |
+     gnuchess           |                                                 |
+     gnulib             | []    []             []             [] []       |
+     gnunet             |                                                 |
+     gnunet-gtk         |                                                 |
+     gold               |                               []    []          |
+     gphoto2            |                      []       []    [] []       |
+     gprof              | []                   []       []    []          |
+     gramadoir          | []                   []       []                |
+     grep               | []    []          [] []       []    [] []       |
+     grub               |       []             []             []          |
+     gsasl              | []                [] []       []    []          |
+     gss                | []                [] []       []    []          |
+     gst-plugins-bad    |                   [] []       []                |
+     gst-plugins-base   |       []          [] []       []                |
+     gst-plugins-good   |       []          [] []       []    [] []       |
+     gst-plugins-ugly   |       []          [] []       []    [] []       |
+     gstreamer          |       []          [] []       []    []          |
+     gtick              | []    []             []       []    []          |
+     gtkam              |                      []       [] [] [] []       |
+     gtkspell           | []    []    []    [] [] []    [] [] [] []       |
+     guix               |                                                 |
+     guix-packages      |                                                 |
+     gutenprint         |       []             []             []          |
+     hello              | []    []          [] []       []                |
+     help2man           |                   []                [] []       |
+     help2man-texi      |                                                 |
+     hylafax            |                               []                |
+     idutils            |                      []       []                |
+     iso_15924          |       []             []    [] [] [] []          |
+     iso_3166           | []    [] [] [] [] [] []    [] [] [] [] []    [] |
+     iso_3166_2         |                               []    []          |
+     iso_4217           |                   [] []       [] [] [] []       |
+     iso_639            | []    [] []       [] []       [] [] [] []       |
+     iso_639_3          |       []                            []          |
+     iso_639_5          |                                                 |
+     jwhois             |       []             []       []    []          |
+     kbd                |                      []       []    []          |
+     klavaro            |       []          [] []             []       [] |
+     ld                 | []                            []    [] []       |
+     leafpad            | []    []    []    [] []       []    [] ()       |
+     libc               |       []          []          []    [] []       |
+     libexif            |                                     []          |
+     libextractor       |                                                 |
+     libgnutls          |                                     []          |
+     libgphoto2         |                                     [] []       |
+     libgphoto2_port    |                                     [] []       |
+     libgsasl           | []                   []       []    []          |
+     libiconv           | []    []          [] []       []    [] []       |
+     libidn             |                   [] []       []    []          |
+     liferea            |       []    []       []             [] []       |
+     lilypond           |                                     []          |
+     lordsawar          |                                                 |
+     lprng              |                               []                |
+     lynx               |                      []       []    [] []       |
+     m4                 | []    []          []          []       []       |
+     mailfromd          |                                                 |
+     mailutils          |                                                 |
+     make               |                   []          []    [] []       |
+     man-db             |                               []       []       |
+     man-db-manpages    |                               []       []       |
+     midi-instruments   |       []    []    [] [] []    [] [] [] []       |
+     minicom            |                      []       []       []       |
+     mkisofs            |                               []    []          |
+     myserver           |                                     []          |
+     nano               | []    []          [] []             [] []       |
+     opcodes            | []                            []    []          |
+     parted             |       []             []       []    [] []       |
+     pies               |                                                 |
+     pnmixer            |                   []                []          |
+     popt               | []    [] []       [] []    [] [] [] [] []       |
+     procps-ng          |                                                 |
+     procps-ng-man      |                                                 |
+     psmisc             |                   [] []       []    []          |
+     pspp               |       []                               []       |
+     pushover           |                                     []          |
+     pwdutils           |                               []                |
+     pyspread           |                                                 |
+     radius             |                               []                |
+     recode             | []    []    []    [] []       []    []          |
+     recutils           |                                                 |
+     rpm                |                               []                |
+     rush               |       []                                        |
+     sarg               |                                                 |
+     sed                | []    []          [] []       []    [] []       |
+     sharutils          |                                                 |
+     shishi             |                                                 |
+     skribilo           |                      []                         |
+     solfege            |       []                            []          |
+     solfege-manual     |                                                 |
+     spotmachine        |                                                 |
+     sudo               |       []          []                [] []       |
+     sudoers            |                   []                [] []       |
+     sysstat            |                   [] []       []       []       |
+     tar                | []                [] []       []    [] []       |
+     texinfo            |                   []          []    []          |
+     texinfo_document   |                   [] []             []          |
+     tigervnc           |                                                 |
+     tin                |                                                 |
+     tin-man            |                                                 |
+     tracgoogleappsa... |       []    []    [] []                         |
+     trader             |                   [] []                         |
+     util-linux         |                                        []       |
+     ve                 |                                     []          |
+     vice               |                      ()             ()          |
+     vmm                |                                                 |
+     vorbis-tools       |                   []          []                |
+     wastesedge         |                                     []          |
+     wcd                |                                                 |
+     wcd-man            |                                                 |
+     wdiff              |       []             []             []          |
+     wget               |                   [] []             [] []       |
+     wyslij-po          |       []          []          []                |
+     xboard             |                                                 |
+     xdg-user-dirs      | [] [] [] [] [] [] [] []    [] [] [] [] []    [] |
+     xkeyboard-config   |       []          [] []       []    [] []       |
+                        +-------------------------------------------------+
+                          ga gd gl gu he hi hr hu hy ia id is it ja ka kk
+                          35  2 47  4  8  2 60 71  2  6 81 11 87 57  0  3
+
+                          kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl 
+                        +--------------------------------------------------+
+     a2ps               |                                  []          []  |
+     aegis              |                                              []  |
+     anubis             |                                  []    []    []  |
+     aspell             |                            []                []  |
+     bash               |                                        []    []  |
+     bfd                |                                                  |
+     binutils           |                                                  |
+     bison              |                                              []  |
+     bison-runtime      |          []    [] []             []    []    []  |
+     buzztrax           |                                                  |
+     ccd2cue            |                                                  |
+     ccide              |                   []                         []  |
+     cflow              |                                              []  |
+     clisp              |                                              []  |
+     coreutils          |                                        []    []  |
+     cpio               |                                              []  |
+     cppi               |                                                  |
+     cpplib             |                                              []  |
+     cryptsetup         |                                              []  |
+     datamash           |                                        []    []  |
+     denemo             |                                                  |
+     dfarc              |                      []                      []  |
+     dialog             |       []       [] []             []    []    []  |
+     dico               |                                                  |
+     diffutils          |                   []                   []    []  |
+     dink               |                                              []  |
+     direvent           |                                              []  |
+     doodle             |                                              []  |
+     dos2unix           |                                        []    []  |
+     dos2unix-man       |                                              []  |
+     e2fsprogs          |                                              []  |
+     enscript           |                                              []  |
+     exif               |    []             []                         []  |
+     fetchmail          |                                              []  |
+     findutils          |                                        []    []  |
+     flex               |                                              []  |
+     freedink           |                                        []    []  |
+     fusionforge        |                                                  |
+     gas                |                                                  |
+     gawk               |                                              []  |
+     gcal               |                                                  |
+     gcc                |                                                  |
+     gdbm               |                                                  |
+     gettext-examples   |          []       []             [] [] []    []  |
+     gettext-runtime    |    []                                  []    []  |
+     gettext-tools      |    []                                            |
+     gjay               |                                                  |
+     glunarclock        |                   []                         []  |
+     gnubiff            |                                              []  |
+     gnubik             |                                        []    []  |
+     gnucash            | () ()          () ()          ()       () () []  |
+     gnuchess           |                                        []    []  |
+     gnulib             |                                              []  |
+     gnunet             |                                                  |
+     gnunet-gtk         |                                                  |
+     gold               |                                                  |
+     gphoto2            |                                              []  |
+     gprof              |                                  []          []  |
+     gramadoir          |                                              []  |
+     grep               |                                        []    []  |
+     grub               |                []                      []    []  |
+     gsasl              |                                              []  |
+     gss                |                                                  |
+     gst-plugins-bad    |                   []                   []    []  |
+     gst-plugins-base   |                   []                   []    []  |
+     gst-plugins-good   |                [] []                   []    []  |
+     gst-plugins-ugly   |                   []             [] [] []    []  |
+     gstreamer          |                []                      []    []  |
+     gtick              |                                              []  |
+     gtkam              |                                        []    []  |
+     gtkspell           |          []    [] []       []    []    []    []  |
+     guix               |                                                  |
+     guix-packages      |                                                  |
+     gutenprint         |                                              []  |
+     hello              |                   []                   []    []  |
+     help2man           |                                        []        |
+     help2man-texi      |                                                  |
+     hylafax            |                                              []  |
+     idutils            |                                              []  |
+     iso_15924          |                () []                         []  |
+     iso_3166           | [] [] []       () [] [] []    []       []    []  |
+     iso_3166_2         |                ()                            []  |
+     iso_4217           |                () []                   []    []  |
+     iso_639            | [] []          () []    []    []             []  |
+     iso_639_3          | []             ()             []                 |
+     iso_639_5          |                ()                                |
+     jwhois             |                   []                         []  |
+     kbd                |                                              []  |
+     klavaro            |                                        []    []  |
+     ld                 |                                                  |
+     leafpad            |    []    []    [] []                         []  |
+     libc               |    []                                        []  |
+     libexif            |                                              []  |
+     libextractor       |                                              []  |
+     libgnutls          |                                  []          []  |
+     libgphoto2         |                                              []  |
+     libgphoto2_port    |                                              []  |
+     libgsasl           |                                              []  |
+     libiconv           |                []                            []  |
+     libidn             |                                              []  |
+     liferea            |                [] []                         []  |
+     lilypond           |                                              []  |
+     lordsawar          |                                                  |
+     lprng              |                                                  |
+     lynx               |                                              []  |
+     m4                 |                                              []  |
+     mailfromd          |                                                  |
+     mailutils          |                                                  |
+     make               |    []                                        []  |
+     man-db             |                                              []  |
+     man-db-manpages    |                                              []  |
+     midi-instruments   |    [] []       []          []    []       [] []  |
+     minicom            |                                        []        |
+     mkisofs            |                                              []  |
+     myserver           |                                                  |
+     nano               |                                  []    []    []  |
+     opcodes            |                                              []  |
+     parted             |    []                                        []  |
+     pies               |                                                  |
+     pnmixer            |                                              []  |
+     popt               | [] []             []                   []    []  |
+     procps-ng          |                                                  |
+     procps-ng-man      |                                                  |
+     psmisc             |                                              []  |
+     pspp               |                []                            []  |
+     pushover           |                                                  |
+     pwdutils           |                                              []  |
+     pyspread           |                                                  |
+     radius             |                                              []  |
+     recode             |                                        []    []  |
+     recutils           |                                              []  |
+     rpm                |                                              []  |
+     rush               |                                              []  |
+     sarg               |                                                  |
+     sed                |                                        []    []  |
+     sharutils          |                                              []  |
+     shishi             |                                                  |
+     skribilo           |                                                  |
+     solfege            |                                        []    []  |
+     solfege-manual     |                                              []  |
+     spotmachine        |                                              []  |
+     sudo               |    []                                  []    []  |
+     sudoers            |    []                                  []    []  |
+     sysstat            |                                        []    []  |
+     tar                |          []                            []    []  |
+     texinfo            |                                              []  |
+     texinfo_document   |                                              []  |
+     tigervnc           |                                              []  |
+     tin                |                                                  |
+     tin-man            |                                                  |
+     tracgoogleappsa... |                   []                   []    []  |
+     trader             |                                        []        |
+     util-linux         |                                              []  |
+     ve                 |                                              []  |
+     vice               |                                              []  |
+     vmm                |                                              []  |
+     vorbis-tools       |                                              []  |
+     wastesedge         |                                              []  |
+     wcd                |                                              []  |
+     wcd-man            |                                              []  |
+     wdiff              |                                              []  |
+     wget               |                                        []    []  |
+     wyslij-po          |                                              []  |
+     xboard             |                                              []  |
+     xdg-user-dirs      | [] [] [] []    [] [] [] []    []       []    []  |
+     xkeyboard-config   |    []          []                            []  |
+                        +--------------------------------------------------+
+                          kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl 
+                           5 15  4  6  0 13 23  3  3  3  4 11  2 42  1 125
+
+                          nn or pa pl  ps pt pt_BR ro ru rw sk sl sq sr 
+                        +------------------------------------------------+
+     a2ps               |          []     []  []   [] []       []    []  |
+     aegis              |                     []      []                 |
+     anubis             |          []                 []             []  |
+     aspell             |          []         []   [] []    [] []    []  |
+     bash               |          []         []      []    [] []    []  |
+     bfd                |                             []             []  |
+     binutils           |                             []             []  |
+     bison              |          []         []                     []  |
+     bison-runtime      |          []     []  []   [] []       [] [] []  |
+     buzztrax           |                     []                         |
+     ccd2cue            |                     []                     []  |
+     ccide              |          []                 []             []  |
+     cflow              |          []         []                     []  |
+     clisp              |                             []                 |
+     coreutils          |          []                 []       []    []  |
+     cpio               |          []                 []             []  |
+     cppi               |          []         []                     []  |
+     cpplib             |                     []      []             []  |
+     cryptsetup         |          []         []                     []  |
+     datamash           |                     []                     []  |
+     denemo             |                                                |
+     dfarc              |          []         []                     []  |
+     dialog             |          []         []   [] []    [] []    []  |
+     dico               |          []                                    |
+     diffutils          |          []         []                     []  |
+     dink               |                                                |
+     direvent           |          []         []                     []  |
+     doodle             |                                         [] []  |
+     dos2unix           |          []         []      []             []  |
+     dos2unix-man       |          []         []                         |
+     e2fsprogs          |          []                                    |
+     enscript           |          []         []   [] []       []    []  |
+     exif               |          []         []   [] []    []       []  |
+     fetchmail          |          []                 []          []     |
+     findutils          |          []         []      []    [] []    []  |
+     flex               |          []         []   [] []             []  |
+     freedink           |          []         []      []       []    []  |
+     fusionforge        |                                                |
+     gas                |                                                |
+     gawk               |          []                                    |
+     gcal               |                                                |
+     gcc                |                                                |
+     gdbm               |          []         []                     []  |
+     gettext-examples   |          []     []  []   [] []    [] []    []  |
+     gettext-runtime    | []       []     []  []   [] []    [] []    []  |
+     gettext-tools      |          []         []   [] []    [] []    []  |
+     gjay               |                                            []  |
+     glunarclock        |          []         []   []       [] []    []  |
+     gnubiff            |                                            []  |
+     gnubik             |          []         []               []    []  |
+     gnucash            |          ()     ()  ()   () ()             []  |
+     gnuchess           |                     []                     []  |
+     gnulib             |          []         []      []       []    []  |
+     gnunet             |                                                |
+     gnunet-gtk         |                                                |
+     gold               |                                                |
+     gphoto2            |          []         []   [] []             []  |
+     gprof              |                     []   [] []             []  |
+     gramadoir          |                                   []       []  |
+     grep               |          []         []      []    [] []    []  |
+     grub               |          []         []      []       []    []  |
+     gsasl              |          []                       []       []  |
+     gss                |          []              []       []       []  |
+     gst-plugins-bad    |          []         []      []    []       []  |
+     gst-plugins-base   |          []         []      []    [] []    []  |
+     gst-plugins-good   |          []         []   [] []    [] []    []  |
+     gst-plugins-ugly   |          []         []   [] []    [] []    []  |
+     gstreamer          |          []         []   [] []    [] []    []  |
+     gtick              |          []         []      []    []       []  |
+     gtkam              |       [] []         []      []    []       []  |
+     gtkspell           |          []     []  []   [] []    [] [] [] []  |
+     guix               |                                                |
+     guix-packages      |                                                |
+     gutenprint         |                                   [] []        |
+     hello              |          []         []      []    [] []    []  |
+     help2man           |          []         []      []             []  |
+     help2man-texi      |          []                                    |
+     hylafax            |                                                |
+     idutils            |          []                 []             []  |
+     iso_15924          |          []     ()       [] []       []    []  |
+     iso_3166           | [] [] [] []     ()  []   [] [] [] [] [] [] []  |
+     iso_3166_2         |          []     ()                         []  |
+     iso_4217           | []       []     ()       [] [] []    []    []  |
+     iso_639            |    [] [] []     ()       [] [] [] [] []    []  |
+     iso_639_3          |       []        ()                             |
+     iso_639_5          |                 ()                         []  |
+     jwhois             |          []         []   []                []  |
+     kbd                |          []                 []                 |
+     klavaro            |       [] []         []      []       []        |
+     ld                 |                                                |
+     leafpad            | []       []     []  []      []    [] []    []  |
+     libc               |          []                 []    []           |
+     libexif            |          []         ()            []           |
+     libextractor       |          []                                    |
+     libgnutls          |          []                                    |
+     libgphoto2         |          []                                    |
+     libgphoto2_port    |          []         []      []    []       []  |
+     libgsasl           |          []              []       []       []  |
+     libiconv           |          []         []            [] []    []  |
+     libidn             |          []         []                     []  |
+     liferea            |          []     []  []   [] ()    []    []     |
+     lilypond           |                                                |
+     lordsawar          |                                                |
+     lprng              |          []                                    |
+     lynx               |                     []      []                 |
+     m4                 |          []         []   [] []             []  |
+     mailfromd          |          []                                    |
+     mailutils          |          []                                    |
+     make               |          []         []      []                 |
+     man-db             |          []                 []             []  |
+     man-db-manpages    |          []                 []             []  |
+     midi-instruments   |          []     []  []   [] []    [] []    []  |
+     minicom            |          []         []   [] []                 |
+     mkisofs            |          []                 []             []  |
+     myserver           |                                      []    []  |
+     nano               |          []         []   [] []       []    []  |
+     opcodes            |                                                |
+     parted             |          []         []      []    [] []    []  |
+     pies               |          []                                    |
+     pnmixer            |                             []                 |
+     popt               |          []     []  []      []       []    []  |
+     procps-ng          |          []                                    |
+     procps-ng-man      |          []                                    |
+     psmisc             |          []         []      []             []  |
+     pspp               |          []                 []                 |
+     pushover           |                                                |
+     pwdutils           |          []                                    |
+     pyspread           | []                  []                         |
+     radius             |          []                 []                 |
+     recode             |          []     []  []   [] []    [] []    []  |
+     recutils           |                     []                     []  |
+     rpm                |          []                                    |
+     rush               |          []         []                     []  |
+     sarg               |                     []      []                 |
+     sed                |          []     []  []   [] []    [] []    []  |
+     sharutils          |          []         []                     []  |
+     shishi             |          []                                []  |
+     skribilo           |                                            []  |
+     solfege            |          []         []      []                 |
+     solfege-manual     |          []         []                         |
+     spotmachine        |                     []                     []  |
+     sudo               |          []         []      []    [] []    []  |
+     sudoers            |          []         []               []    []  |
+     sysstat            |          []         []      []    []       []  |
+     tar                |          []         []      []       []    []  |
+     texinfo            |          []         []      []                 |
+     texinfo_document   |          []         []                         |
+     tigervnc           |                     []      []             []  |
+     tin                |                             []                 |
+     tin-man            |                                                |
+     tracgoogleappsa... |          []         []      []             []  |
+     trader             |                             []             []  |
+     util-linux         |          []         []                         |
+     ve                 |          []         []                     []  |
+     vice               |                                                |
+     vmm                |                                                |
+     vorbis-tools       |          []                          []    []  |
+     wastesedge         |                                                |
+     wcd                |                                                |
+     wcd-man            |                                                |
+     wdiff              |          []         []      []       []    []  |
+     wget               |          []         []      []    []       []  |
+     wyslij-po          | []       []         []                     []  |
+     xboard             |          []                 []             []  |
+     xdg-user-dirs      | [] [] [] []  [] []  []   [] []    [] [] [] []  |
+     xkeyboard-config   |          []         []      []       []        |
+                        +------------------------------------------------+
+                          nn or pa pl  ps pt pt_BR ro ru rw sk sl sq sr 
+                           7  3  6 114  1 12  88   32 82  3 40 45  7 101
+
+                          sv  sw ta te tg th tr uk  ur vi  wa wo zh_CN
+                        +----------------------------------------------+
+     a2ps               | []              [] [] []     []              |
+     aegis              |                              []              |
+     anubis             | []                 [] []     []              |
+     aspell             | []                    []     []  []     []   |
+     bash               | []                    []     []         []   |
+     bfd                | []                    []     []              |
+     binutils           | []                    []     []              |
+     bison              | []                    []     []         []   |
+     bison-runtime      | []              [] [] []     []         []   |
+     buzztrax           | []                           []         []   |
+     ccd2cue            |                       []     []         []   |
+     ccide              | []                    []     []         []   |
+     cflow              | []                    []     []         []   |
+     clisp              |                                              |
+     coreutils          | []                    []     []              |
+     cpio               | []                 [] []     []         []   |
+     cppi               | []                    []     []         []   |
+     cpplib             | []                 [] []     []         []   |
+     cryptsetup         |                       []     []         []   |
+     datamash           | []                    []     []              |
+     denemo             |                                         []   |
+     dfarc              | []                           []              |
+     dialog             | []  []          []           []  []     []   |
+     dico               |                       []                     |
+     diffutils          | []                 [] []     []         []   |
+     dink               | []                                           |
+     direvent           |                       []     []              |
+     doodle             | []                           []              |
+     dos2unix           | []                    []     []         []   |
+     dos2unix-man       | []                    []                []   |
+     e2fsprogs          | []                    []     []         []   |
+     enscript           | []                 [] []     []              |
+     exif               | []                 [] []     []         []   |
+     fetchmail          | []                 []        []         []   |
+     findutils          | []                 [] []     []         []   |
+     flex               | []                 []        []         []   |
+     freedink           | []              []           []              |
+     fusionforge        |                                              |
+     gas                |                       []                     |
+     gawk               | []                           []         []   |
+     gcal               | []                 []                   []   |
+     gcc                | []                                           |
+     gdbm               |                       []     []              |
+     gettext-examples   | []                 [] []     []         []   |
+     gettext-runtime    | []                 [] []     []         []   |
+     gettext-tools      | []                 [] []     []         []   |
+     gjay               |                 []           []         []   |
+     glunarclock        | []                           []  []     []   |
+     gnubiff            | []                           []              |
+     gnubik             | []                    []     []         []   |
+     gnucash            |        () ()              () ()         []   |
+     gnuchess           |                       []     []         []   |
+     gnulib             | []                    []     []         []   |
+     gnunet             |                                              |
+     gnunet-gtk         |                                              |
+     gold               |                       []     []              |
+     gphoto2            | []                    []     []         []   |
+     gprof              | []                 [] []     []              |
+     gramadoir          | []                           []         []   |
+     grep               | []              []    []     []         []   |
+     grub               | []                 [] []     []              |
+     gsasl              | []                    []     []         []   |
+     gss                | []                           []         []   |
+     gst-plugins-bad    | []                 [] []     []         []   |
+     gst-plugins-base   | []                 [] []     []         []   |
+     gst-plugins-good   | []                 [] []     []         []   |
+     gst-plugins-ugly   | []                 [] []     []         []   |
+     gstreamer          | []                 [] []     []         []   |
+     gtick              |                       []     []         []   |
+     gtkam              | []                    []     []         []   |
+     gtkspell           | []              [] [] []     []  []     []   |
+     guix               |                                              |
+     guix-packages      |                                              |
+     gutenprint         |                    [] []     []         []   |
+     hello              | []              [] [] []     []         []   |
+     help2man           |                       []     []         []   |
+     help2man-texi      |                       []                     |
+     hylafax            |                              []              |
+     idutils            |                       []     []         []   |
+     iso_15924          | []              () [] []     ()         []   |
+     iso_3166           | []        []    () [] []     ()  []     []   |
+     iso_3166_2         |                 () [] []     ()         []   |
+     iso_4217           | []              () [] []     ()         []   |
+     iso_639            | []     [] []    () [] []     ()  []     []   |
+     iso_639_3          |        []       () [] []     ()              |
+     iso_639_5          |                 ()    []     ()              |
+     jwhois             | []                 []        []         []   |
+     kbd                | []                    []     []         []   |
+     klavaro            | []                    []  [] []     []  []   |
+     ld                 | []                 [] []     []         []   |
+     leafpad            | []              [] [] []     []         []   |
+     libc               | []                 [] []     []         []   |
+     libexif            | []                           []         ()   |
+     libextractor       |                       []     []              |
+     libgnutls          | []                    []     []         []   |
+     libgphoto2         | []                    []     []              |
+     libgphoto2_port    | []                    []     []         []   |
+     libgsasl           | []                    []     []         []   |
+     libiconv           | []                    []     []  []     []   |
+     libidn             | ()                    []     []         []   |
+     liferea            | []                 [] []     []         []   |
+     lilypond           |                              []              |
+     lordsawar          |                                              |
+     lprng              |                              []              |
+     lynx               | []                 [] []     []              |
+     m4                 | []                           []         []   |
+     mailfromd          |                       []     []              |
+     mailutils          |                              []              |
+     make               | []                    []     []         []   |
+     man-db             | []                           []         []   |
+     man-db-manpages    | []                                      []   |
+     midi-instruments   | []              [] [] []     []         []   |
+     minicom            | []                           []              |
+     mkisofs            |                       []     []         []   |
+     myserver           |                              []              |
+     nano               | []                    []     []         []   |
+     opcodes            |                       []     []         []   |
+     parted             | []                 [] []     []         []   |
+     pies               |                       []     []              |
+     pnmixer            |                       []     []         []   |
+     popt               | []     []       [] [] []     []         []   |
+     procps-ng          |                       []     []              |
+     procps-ng-man      |                       []                     |
+     psmisc             | []                    []     []         []   |
+     pspp               |                    [] []                []   |
+     pushover           | []                                           |
+     pwdutils           | []                           []              |
+     pyspread           |                       []                     |
+     radius             |                       []     []              |
+     recode             | []                 []        []         []   |
+     recutils           | []                    []     []              |
+     rpm                | []                    []     []         []   |
+     rush               |                       []     []              |
+     sarg               |                                              |
+     sed                | []                 [] []     []         []   |
+     sharutils          | []                    []     []         []   |
+     shishi             |                              []         []   |
+     skribilo           | []                    []                     |
+     solfege            | []                 []        []         []   |
+     solfege-manual     |                    []                        |
+     spotmachine        | []                    []     []              |
+     sudo               | []                 [] []     []         []   |
+     sudoers            | []                    []     []         []   |
+     sysstat            | []                 [] []     []         []   |
+     tar                | []                 [] []     []         []   |
+     texinfo            |                    [] []     []              |
+     texinfo_document   |                       []                     |
+     tigervnc           | []                    []                []   |
+     tin                |                                         []   |
+     tin-man            |                                              |
+     tracgoogleappsa... | []              []    []     []         []   |
+     trader             | []                                           |
+     util-linux         | []                    []     []         []   |
+     ve                 | []                    []     []         []   |
+     vice               | ()                 ()                        |
+     vmm                |                                              |
+     vorbis-tools       | []                           []              |
+     wastesedge         |                                              |
+     wcd                |                       []     []         []   |
+     wcd-man            |                       []                     |
+     wdiff              | []                    []     []         []   |
+     wget               |                       []     []         []   |
+     wyslij-po          |                       []     []              |
+     xboard             |                       []                []   |
+     xdg-user-dirs      | []     [] []    [] [] []     []         []   |
+     xkeyboard-config   | []                 [] []     []              |
+                        +----------------------------------------------+
+                          sv  sw ta te tg th tr uk  ur vi  wa wo zh_CN
+                          106  1  4  3  0 13 51 115  1 125  7  1  100 
+
+                          zh_HK zh_TW
+                        +-------------+
+     a2ps               |             | 30
+     aegis              |             |  9
+     anubis             |             | 19
+     aspell             |             | 29
+     bash               |        []   | 23
+     bfd                |             | 11
+     binutils           |             | 12
+     bison              |        []   | 18
+     bison-runtime      |        []   | 38
+     buzztrax           |             |  9
+     ccd2cue            |             | 10
+     ccide              |             | 17
+     cflow              |             | 16
+     clisp              |             | 10
+     coreutils          |             | 18
+     cpio               |             | 20
+     cppi               |             | 17
+     cpplib             |        []   | 19
+     cryptsetup         |             | 14
+     datamash           |             | 11
+     denemo             |             |  5
+     dfarc              |             | 17
+     dialog             |        []   | 42
+     dico               |             |  6
+     diffutils          |             | 22
+     dink               |             | 10
+     direvent           |             | 11
+     doodle             |             | 12
+     dos2unix           |        []   | 18
+     dos2unix-man       |             |  9
+     e2fsprogs          |             | 15
+     enscript           |             | 21
+     exif               |             | 27
+     fetchmail          |             | 19
+     findutils          |             | 29
+     flex               |        []   | 19
+     freedink           |             | 24
+     fusionforge        |             |  3
+     gas                |             |  5
+     gawk               |             | 13
+     gcal               |             |  8
+     gcc                |             |  2
+     gdbm               |             | 10
+     gettext-examples   |  []    []   | 40
+     gettext-runtime    |  []    []   | 35
+     gettext-tools      |        []   | 24
+     gjay               |             |  9
+     glunarclock        |        []   | 27
+     gnubiff            |             |  9
+     gnubik             |             | 19
+     gnucash            |        ()   |  6
+     gnuchess           |             | 11
+     gnulib             |             | 23
+     gnunet             |             |  1
+     gnunet-gtk         |             |  1
+     gold               |             |  7
+     gphoto2            |        []   | 19
+     gprof              |             | 21
+     gramadoir          |             | 14
+     grep               |        []   | 31
+     grub               |             | 21
+     gsasl              |        []   | 19
+     gss                |             | 17
+     gst-plugins-bad    |             | 21
+     gst-plugins-base   |             | 27
+     gst-plugins-good   |             | 32
+     gst-plugins-ugly   |             | 34
+     gstreamer          |        []   | 32
+     gtick              |             | 19
+     gtkam              |             | 24
+     gtkspell           |  []    []   | 48
+     guix               |             |  2
+     guix-packages      |             |  0
+     gutenprint         |             | 15
+     hello              |        []   | 30
+     help2man           |             | 18
+     help2man-texi      |             |  5
+     hylafax            |             |  5
+     idutils            |             | 14
+     iso_15924          |        []   | 23
+     iso_3166           |  []    []   | 58
+     iso_3166_2         |             |  9
+     iso_4217           |  []    []   | 28
+     iso_639            |  []    []   | 46
+     iso_639_3          |             | 10
+     iso_639_5          |             |  2
+     jwhois             |        []   | 20
+     kbd                |             | 17
+     klavaro            |             | 30
+     ld                 |        []   | 15
+     leafpad            |        []   | 39
+     libc               |        []   | 24
+     libexif            |             | 10
+     libextractor       |             |  5
+     libgnutls          |             | 13
+     libgphoto2         |             | 10
+     libgphoto2_port    |        []   | 19
+     libgsasl           |             | 18
+     libiconv           |        []   | 29
+     libidn             |             | 17
+     liferea            |             | 29
+     lilypond           |             | 11
+     lordsawar          |             |  3
+     lprng              |             |  3
+     lynx               |             | 19
+     m4                 |        []   | 22
+     mailfromd          |             |  4
+     mailutils          |             |  6
+     make               |             | 19
+     man-db             |             | 15
+     man-db-manpages    |             | 10
+     midi-instruments   |        []   | 43
+     minicom            |        []   | 17
+     mkisofs            |             | 13
+     myserver           |             |  9
+     nano               |        []   | 30
+     opcodes            |             | 12
+     parted             |        []   | 23
+     pies               |             |  4
+     pnmixer            |             |  9
+     popt               |        []   | 36
+     procps-ng          |             |  5
+     procps-ng-man      |             |  4
+     psmisc             |        []   | 22
+     pspp               |             | 13
+     pushover           |             |  6
+     pwdutils           |             |  8
+     pyspread           |             |  6
+     radius             |             |  9
+     recode             |             | 31
+     recutils           |             | 10
+     rpm                |        []   | 13
+     rush               |             | 10
+     sarg               |             |  4
+     sed                |        []   | 35
+     sharutils          |             | 13
+     shishi             |             |  7
+     skribilo           |             |  7
+     solfege            |             | 21
+     solfege-manual     |             |  9
+     spotmachine        |             | 11
+     sudo               |             | 26
+     sudoers            |             | 22
+     sysstat            |             | 23
+     tar                |        []   | 30
+     texinfo            |             | 17
+     texinfo_document   |             | 13
+     tigervnc           |             | 14
+     tin                |        []   |  7
+     tin-man            |             |  1
+     tracgoogleappsa... |        []   | 22
+     trader             |             | 12
+     util-linux         |             | 13
+     ve                 |             | 14
+     vice               |             |  1
+     vmm                |             |  3
+     vorbis-tools       |             | 13
+     wastesedge         |             |  3
+     wcd                |             |  8
+     wcd-man            |             |  3
+     wdiff              |        []   | 23
+     wget               |             | 21
+     wyslij-po          |             | 14
+     xboard             |             | 10
+     xdg-user-dirs      |  []    []   | 68
+     xkeyboard-config   |        []   | 28
+                        +-------------+
+       89 teams           zh_HK zh_TW
+      166 domains           7    42    2809
+
+   Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect.  This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+   For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and distributed
+as such by its maintainer.  There might be an observable lag between the
+mere existence a PO file and its wide availability in a distribution.
+
+   If Jun 2014 seems to be old, you may fetch a more recent copy of this
+'ABOUT-NLS' file on most GNU archive sites.  The most up-to-date matrix
+with full percentage details can be found at
+'http://translationproject.org/extra/matrix.html'.
+
+1.5 Using 'gettext' in new packages
+===================================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU 'gettext' in your
+package.  Of course you have to respect the GNU Lesser General Public
+License which covers the use of the GNU 'gettext' library.  This means
+in particular that even non-free programs can use 'libintl' as a shared
+library, whereas only free software can use 'libintl' as a static
+library or use modified versions of 'libintl'.
+
+   Once the sources are changed appropriately and the setup can handle
+the use of 'gettext' the only thing missing are the translations.  The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project.  Therefore the information given above
+applies also for every other Free Software Project.  Contact
+'coordinator@translationproject.org' to make the '.pot' files available
+to the translation teams.
diff --git a/gawk-5.0.1/AUTHORS b/gawk-5.0.1/AUTHORS
new file mode 100644
index 00000000000..fa9e7fe1f29
--- /dev/null
+++ b/gawk-5.0.1/AUTHORS
@@ -0,0 +1,13 @@
+  Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+  
+  Copying and distribution of this file, with or without modification,
+  are permitted in any medium without royalty provided the copyright
+  notice and this notice are preserved.
+
+Gawk was written by Paul Rubin, and finished by Paul Finlason and
+Richard Stallman.
+
+David Trueman and Arnold Robbins took it over, with David doing most
+of the work to make it compatible with new awk.
+
+Circa 1994, Arnold Robbins took over maintenance.
diff --git a/gawk-5.0.1/COPYING b/gawk-5.0.1/COPYING
new file mode 100644
index 00000000000..94a9ed024d3
--- /dev/null
+++ b/gawk-5.0.1/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/gawk-5.0.1/ChangeLog b/gawk-5.0.1/ChangeLog
new file mode 100644
index 00000000000..e3aa1cac931
--- /dev/null
+++ b/gawk-5.0.1/ChangeLog
@@ -0,0 +1,97 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-06-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (usage): Update comment for translators.
+
+2019-06-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.c, command.c: Update to Bison 3.4.
+	* NEWS: Updated.
+
+2019-05-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add --lint=no-ext. Suggest by Mark Krauze <daburashka@ya.ru>.
+
+	* NEWS: Updated.
+	* awk.h (DO_LINT_EXTENSIONS): New enum.
+	(do_lint_extensions): New macro.
+	* awkgram.y (yylex, snode): Use do_lint_extensions instead of
+	do_lint where appropriate.
+	* builtin.c (do_length): Ditto.
+	* eval.c (set_IGNORECASE, set_BINMODE): Ditto.
+	(set_LINT): Revise logic.
+	* field.c (do_split, set_FIELDWIDTHS, chose_fs_function, set_FPAT):
+	Ditto.
+	* io.c (set_RS): Ditto.
+	* main.c (usage): Updated.
+	(parse_args): Revise the code to handle --lint=no-ext.
+
+2019-05-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Updated.
+
+2019-05-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	In sandbox mode, disallow assigning filenames that weren't
+	there initially. Thanks to Nolan Woods <nolan_w@sfu.ca> for
+	pointing out the gap.
+
+	* awk.h (init_argv_array): Add declaration.
+	* cint_array.c (argv_store): New vtable for ARGV.
+	(argv_shadow_array): New file static variable
+	(argv_store, init_argv_array): New functions.
+	* main.c (init_args): If in sandbox mode, build shadow array of
+	initial argv values. Call init_argv_array.
+
+2019-05-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ext.c (load_ext): Fix the message in the version for when
+	extensions are not available.
+
+2019-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* msg.c (msg): Use %ld for the line number value. Thanks to
+	Michal Jaegermann for the report.
+
+2019-04-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2019-02-21         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* interpert.h (Op_store_field): Move call to force_string to
+	here from unfield.  Speeds up work with fields that are numeric
+	only. Thanks to Tom Gray <tom_gray@keysight.com> for the report.
+
+2019-04-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* POSIX.STD: Updated.
+	* field.c (get_field): If NF == -1, check parse high water to
+	set in_middle correctly. Thanks to <oguzismailuysal@gmail.com>
+	for the report.
+
+2019-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* msg.c (msg): Add an undocumented feature. "Use the Source, Luke."
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.1 to the list. Ooops.
+	* CheckList: Updated.
+
+	Fix core dump reported by Steve Kemp <steve@steve.org.uk>:
+
+	* awk.h (errcount): Declare.
+	* awkgram.y (errcount): No longer static.
+	* command.y (dbg_errcount): Renamed from errcount.j
+	* main.c (catchsig, catchsegv): If errcount > 0, just exit,
+	don't abort.  
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Update version to 5.0.0.
+	* configure: Regenerated.
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* README: Bump version to 5.0.0.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/ChangeLog.0 b/gawk-5.0.1/ChangeLog.0
new file mode 100644
index 00000000000..d8a13ce59a2
--- /dev/null
+++ b/gawk-5.0.1/ChangeLog.0
@@ -0,0 +1,9885 @@
+Mon Jun 20 20:33:26 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (dfaanalyze): Allocate the right number of leaves to
+	avoid crashes. Thanks to Jim Meyering.
+
+Mon Jun 20 20:22:35 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (setbit_c, setbit_case_fold_c): Compare btowc result against
+	WEOF. Thanks to Eli Zaretskii for pointing out the problem.
+
+Mon Jun 20 20:22:26 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* dfa.c (addtok_wc): enclose prototype within #if MBS_SUPPORT.
+
+Fri Jun 17 11:09:22 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.86: Final beta test tar ball for 4.0.
+
+Fri Jun 17 10:55:27 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Implement Rational Range Interpretation (RRI) directly in code.
+
+	* regex.h [RE_RANGES_IGNORE_LOCALES]: Remove macro and its use.
+	* dfa.c (parse_bracket_exp): Remove use of RE_RANGES_IGNORE_LOCALES
+	and just do it in code.
+	(hard-locale.h): Remove include.
+	(hard_LC_COLLATE): Remove variable and its uses.
+	* re.c (resetup): Remove use of RE_RANGES_IGNORE_LOCALES.
+	* regcomp.c (build_range_exp): Remove use of RE_RANGES_IGNORE_LOCALES
+	and just do it in code. Remove cmp_buf array; it's no longer needed.
+	* Makefile.am (base_sources): Remove hard_locale.h and hard_locale.c.
+	* hard_locale.h, hard_locale.c: Removed from dist.
+
+Sun Jun 12 23:43:06 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (resetup): Always turn on RE_RANGES_IGNORE_LOCALES.
+	Add justifying comment with URLs for the relevant portions of
+	POSIX. Thanks to Paul Eggert for pointing out the happy change
+	to the rules and supplying the URLs.
+
+Wed Jun  8 22:41:30 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c (build_range_exp): Add check for RE_NO_EMPTY_RANGES
+	from GNULIB regcomp.c, courtesy of GNU grep.
+
+Wed Jun  8 22:10:03 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+Sun Jun  5 21:49:30 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.85: Fourth beta test tar ball for 4.0.
+
+Sun Jun  5 21:39:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (fpat_parse_field): Bug fix.  Thanks to
+	"Radoulov, Dimitre" <cichomitiko@gmail.com> for pointing
+	out the problem.
+
+Fri Jun  3 10:39:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c (build_range_exp): Make syntax the first argument,
+	for compatibility with gnulib version of the file.
+
+Wed Jun  1 06:29:27 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* re.c (check_bracket_exp): Fix typo.
+
+Tue May 31 23:01:00 2011  John Haque      <j.eh@mchsi.com>
+
+	* re.c (check_bracket_exp): Use mem* routines instead of str*
+	for searching.
+	* main.c (arg_assign): Disallow builtin or user-defined function
+	as the name of a variable.
+	* awkgram.y (check_special): Rework so can be called from
+	arg_assign.
+
+Tue May 31 22:23:41 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	In order to attain the goal of having ranges act like they are
+	always in the C locale, bit the bullet and did the work in
+	the regex and dfa engines. The pre-processing routine was not
+	handling too many cases that a full regexp parser would catch.
+
+	* regex.h [RE_RANGES_IGNORE_LOCALES]: New syntax bit.
+	(RE_SYNTAX_GNU_AWK): Use it.
+	* dfa.c (parse_bracket_exp): If the RE_RANGES_IGNORE_LOCALES
+	is set, ignore locales when building a range.
+	* re.c (expand_range): Remove function and declaration.
+	(add_char): Remove function and declaration.
+	(make_regexp): Remove use of expand_range.
+	(resetup): Add RE_RANGES_IGNORE_LOCALES if --traditional.
+	* regcomp.c (build_range_exp): Add syntax variable as last argument.
+	Add code to check for RE_RANGES_IGNORE_LOCALES and do the right thing.
+	Adjust all calls.
+
+Sun May 29 22:48:41 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (expand_range): Handle cases where expanded range
+	includes '\\' (and ']'). Thanks to Juergen Daubert <jue@jue.li>.
+	Fatal error if end point is below start point ([z-a]),
+	thanks to John Haque.  Don't repeat the last character in
+	the expansion. Thanks to Arnold Robbins.
+
+Fri May 27 10:01:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.84: Third beta test tar ball for 4.0.
+
+Thu May 26 22:10:08 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (get_field): Enhance logic for setting NF if we're
+	using FPAT to parse fields. Can end up with weird cases. Thanks
+	to Pat Rankin for pointing them out.
+
+Mon May 23 22:06:13 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y: Allow newline after comma in range patterns,
+	per POSIX.  Thanks to discussion in comp.lang.awk. (!!!)
+
+Mon May 23 22:02:46 2011  John Haque      <j.eh@mchsi.com>
+
+	* ext.c (get_actual_argument): Change argument type from
+	Node_var_new to Node_var when used as a scalar.
+
+Sun May 22 11:56:40 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (varinit): Give FPAT a reasonable default value.
+	* field (get_field): Adjust test for at end of record to >=;
+	fpat_parse_field can go beyond when matching null regexps.
+	Thanks to Pat Rankin.
+
+Fri May 20 11:00:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex_internal.h (__attribute_warn_unused_result__): Always
+	ifdef out. Bleah.
+
+Thu May 19 17:13:18 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.83: Second beta test tar ball for 4.0.
+
+Thu May 19 16:47:19 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (dump_vars): Fix warning message. Thanks to Pat Rankin.
+	* main.c (usage): No space allowed after -d and -p. Also thanks
+	to Pat Rankin.
+
+Thu May 19 16:34:04 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* regex_internal.h (__attribute_warn_unused_result__): Define with
+	empty expansion for !__GNUC__ configuration.
+
+Wed May 18 22:13:18 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.82: Beta test tar ball for 4.0, we hope!
+
+Wed May 18 21:47:54 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (PIPES_SIMULATED): Simplify the case where PIPES_SIMULATED
+	is true but using temporary files - that code not needed anymore.
+	* regcomp.c, regex.h, regex_internal.c, regex_internal.h,
+	regexec.c: Sync with GLIBC. Why not.
+
+Mon May 16 17:55:25 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.c: Regenerated using bison 2.5.
+
+Sat May 14 22:25:50 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (nextfile): Use `in_array' in main loop to see if element
+	of ARGV exists, instead of using `assoc_lookup'.  The latter creates
+	the element!  A day one bug!
+	* dfa.c (parse_bracket_exp): For z/OS init pattern manually.
+
+Mon May  9 16:30:49 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (sort_up_value_type): Remove unused variable ret.
+	(do_delete): Initialize local variables to silence warnings.
+	Thanks to Michal Jaegermann.
+
+Mon May  9 15:07:29 2011  Corinna Vinschen  <vinschen@redhat.com>
+
+	* awk.h: Remove cygwin code for libsigsegv.
+
+Sun May  8 20:38:03 2011  John Haque      <j.eh@mchsi.com>
+
+	* eval.c (r_interpret): In case Op_sub_array, store only the
+	subarray index as 'vname'.
+	* array.c (make_aname): Redone for dynamic computation of
+	a subarray actual 'vname'.
+	(array_vname): Use make_aname() for (sub)array name.
+	(asort_actual): Performance optimization for asort(a).
+
+Sun May  8 20:29:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* debug.c (print_array): Sort in order of string indices, per
+	request from John Haque.
+	* array.c (sort_up_value_number): Use string value to provide
+	ordering when numeric values are equal. Ensures that tests come
+	out OK on different systems.
+
+Sun May  8 20:27:27 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+	* regex.h: Sync with GLIBC in preparation for submitting updates
+	back.
+
+Thu May  5 21:22:44 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (r_interpret): PROCINFO sorting only takes effect
+	if not do_posix.
+
+Wed May  4 23:31:14 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Move array sorting to using predefined strings, add value sorting
+	by type of assignment.
+
+	* array.c (sort_up_value_type, sort_down_value_type): New routines.
+	(asort_actual): Pass string value to assoc_list, not NODE *.
+	Make sure indices of new arrays have numeric value set also.
+	(sort_up_value_number): Don't break the tie based on string value.
+	(sort_selection): Removed.
+	(assoc_list): Third arg is string constant. Add name to table of
+	functions. Linear search it.
+	* awk.h (assoc_list): Fix declaration.
+	* debug.c (print_array): And use of assoc_list.
+	* eval.c (r_interpret): Ditto.
+
+Wed May  4 23:06:17 2011  John Haque      <j.eh@mchsi.com>
+
+	* eval.c (setup_frame): Handle a Node_var in stack. Fixes
+	a problem when a Node_var_new as param becomes Node_var during
+	expresssion evaluation for a subsequent param.
+
+Wed May  4 23:04:06 2011  John Haque      <j.eh@mchsi.com>
+
+	Fix the problem (crash) with disappearing array argument when
+	it is a subarray of another deleted array argument.
+
+	* awk.h (struct exp_node): Nuke unused field sub.nodep.number.
+	New field sub.nodep.rn.
+	(parent_array): New definition for sub.nodep.rn to keep track
+	of the parent of a subarray.
+	* awkgram.y (mk_symbol): Initialize parent_array to NULL.
+	* eval.c (r_interpret): In the case Op_sub_array, assign
+	parent_array.
+	* array.c (get_array): Initialize parent_array to NULL when
+	a Node_var_new becomes a Node_var_array.
+	(assoc_find): Add a fourth argument for the previous node
+	of the returned bucket.
+	(in_array, assoc_lookup): Adjust calls to assoc_find().
+	(adjust_fcall_stack): New routine to change a soon-to-be deleted
+	subarray parameter in the function call stack to a local array.
+	(do_delete): Simplify code, remove recursive usage. Call
+	adjust_fcall_stack() where appropriate.
+	(do_delete_loop): Call adjust_fcall_stack() before clearing the
+	array.
+	(asort_actual): Don't accept an array and its subarray as
+	arguments for asort() or asorti().
+	(asort_actual, dup_table): For asort(), appropriately assign
+	parent_array when creating the result array.
+	* field.c (do_split, do_patsplit): An array and its subarray not
+	accepted for the second and the fourth arguments. Remove
+	unnecessary dupnode of the field seperator node.
+
+	Unrelated:
+	* awkgram.y (LEX_DELETE, simple_variable): Change type argument
+	from Node_var_array to Node_var_new for calls to variable().
+	* io.c (devopen): Fix parsing GAWK_MSEC_SLEEP env variable.
+
+Mon May  2 23:44:34 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (parse_bracket_exp): Sync with GNU grep, since we
+	now require C 90, go ahead and put non-constant values into
+	the array initializers.
+
+Mon May  2 23:37:09 2011  Corinna Vinschen  <vinschen@redhat.com>
+
+	* awk.h (small): Undef after include of <sigsegv.h> to compile
+	builtin.c on Cygwin.
+
+Fri Apr 29 12:29:56 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep, mainly typos in comments.
+
+Fri Apr 29 12:13:32 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (inetfile): Change ifdef to ifndef for have getaddrinfo.
+	Ooops.
+
+Fri Apr 29 11:49:38 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Per Pat Rankin, remove code related to GFMT_WORKAROUND and VAXCRTL.
+
+	* builtin.c (sgfmt): Nuked.
+	(format_tree): Removed code related to GFMT_WORKAROUND and VAXCRTL.
+	* node.c (format_val): Revise comment.
+
+Fri Apr 29 11:33:08 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (NUMIND): New flag, indicates numeric value of an
+	array index is current.
+	* array.c (awk_hash): Remove code for VAXC, it's no longer
+	needed. Per Pat Rankin.
+	(assoc_lookup): Only assign the numeric value if it's available.
+	(do_delete): Add comment about free_subs calling force_string.
+	(sort_force_index): Use NUMIND.
+
+Fri Apr 29 10:15:24 2011  John Haque      <j.eh@mchsi.com>
+
+	* builtin.c: Relocate all codes from awkprintf.h. Restore
+	format_tree.
+	* debug.c (do_print_f): Adjust appropriately. Install fatal trap
+	for format_tree.
+	* Makefile.am (base_sources): Remove awkprintf.h.
+
+	* array.c (assoc_list): Avoid possible crash; Remove unneeded
+	initialization of pre_func.
+
+Wed Apr 27 22:31:23 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (ahash_dupnode): Merged into dupnode in node.c, change uses.
+	* array.c (ahash_unref): Merged into unref in node.c, change all uses.
+	* node.c (dupnode): Revised to support Node_ahash.
+	(unref): Ditto.
+
+	Lots of code clean up in array.c:
+
+	* array.c (AVG_CHAIN_MAX): Made unsigned.
+	(array_init): Use strtoul to convert value instead of doing it
+	manually.
+	(array_vname): Nuke code that could limit length of name. It
+	was never used.
+	(concat_exp): Make len unsigned, clean up the calculation.
+	(assoc_lookup): Set ahname_num in the index at time of element
+	creation.
+	(dup_table): Copy ahname_num also.
+	Other minor cleanups after code review.
+
+Sun Apr 24 15:39:19 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* NEWS.0: Moved all pre-4.0 news to here.
+	* NEWS: Shortened.
+	* Makefile.am (EXTRA_DIST): Add NEWS.0.
+
+Sun Apr 24 12:43:49 2011  John Haque      <j.eh@mchsi.com>
+
+	* array.c (sort_user_func): Fix return value to match the
+	documentaion.
+	(sort_selection): Make user-specified comparison function with
+	the same name override default "unsorted" specification.
+
+Fri Apr 22 16:05:27 2011  John Haque      <j.eh@mchsi.com>
+
+	* array.c (sort_user_func): New routine to handle user-defined
+	quicksort comparison function.
+	(assoc_list): Adjust for user-defined comparison function.
+
+Fri Apr 22 09:18:16 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (awk_hash): Force results into 32 bits for consistency
+	across platforms. Keeps the test suite happy. This may turn out
+	to be a bad idea in the long run.
+
+Mon Apr 18 10:18:26 2011  John Haque      <j.eh@mchsi.com>
+
+	* array.c (assoc_list): New function to construct, and optionally
+	sort, a list of array elements.
+	(asort_actual): Use the new function to sort array elements.
+	(assoc_sort_inplace, assoc_from_list, merge_sort, merge): Nuked.
+	(sort_selection): Simplify handling of error and warning messages.
+	(sorted_in, sort_match): Nuked, related code in sort_selection() and
+	assoc_list().
+	(sort_ignorecase, sort_up_index_ignrcase, sort_down_index_ignrcase,
+	sort_maybe_numeric_index, sort_cmp_nodes, cmp_func, sort_up_value,
+	sort_down_value): Nuked. Ignorecase handling done in the corresponding
+	non-ignorecase versions.
+	(cmp_string): New routine for string comparisons.
+	(sort_up_value_string, sort_down_value_string, sort_up_value_number,
+	sort_down_value_number,	sort_force_index_number,
+	sort_force_value_number, sort_force_value_string): New routines.
+	* awk.h (struct exp_node): New field sub.hash.num to store the
+	numeric value of an array index.
+	(ahname_num): New define.
+	(SORT_CTXT): New typedef.
+	* awkgram.y (tokentab): Accept three args for asort() and asorti().
+	(snode): Adjust for the extra args.
+	* eval.c (r_interpret): In case Op_arrayfor_init, call assoc_list()
+	for a list of array elements.
+	* debug.c (print_array): Call assoc_list() for a sorted list of array
+	elements.
+
+Wed Apr 13 10:17:37 2011  John Haque      <j.eh@mchsi.com>
+
+	* builtin.c (do_strftime): Make the third argument to strftime
+	really work.
+	* io.c (redirect): Do not free `rp' after failure to open socket
+	in redirect_twoway. Fixes a double-free memory error.
+
+Thu Apr  7 21:38:08 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (merge): Use sort_cmp_nodes for asort/asorti.
+	See test/arraysort.awk test 1.
+
+Thu Apr  7 10:48:21 2011  Pat Rankin  <rankin@patechdata.com>
+
+	* array.c (sort_cmp_nodes): New routine. Unlike cmp_nodes, numbers
+	are less than strings instead of being formatted and then compared.
+	(sort_up_value): Use it.
+
+Sun Apr  3 22:18:26 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* README, FUTURE: Minor edits.
+
+Fri Apr  1 11:53:54 2011  Pat Rankin  <rankin@patechdata.com>
+
+	* array.c (sort_up_index_number): Fix the NODE arguments passed to
+	sort_up_index_string() when a tie breaker is needed.
+
+Fri Apr  1 11:49:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Change ISATTY macro to os_isatty function.
+
+	* awk.h (ISATTY): Remove definition.
+	(os_isatty): Add declaration.
+	* debug.c, io.c, main.c: Change all calls.
+
+Thu Mar 31 22:57:36 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Checklist: Updated. This is a git-only file.
+	* POSIX.STD: Revised some.
+
+Tue Mar 29 20:52:38 2011  John Haque      <j.eh@mchsi.com>
+
+	* awkgram.y (LEXT_NEXT): Don't issue an error message if the next
+	statement is in a function (rule = 0).
+
+	Always resolve the jump target for an exit statement at run-time.
+	This fixes a bug when the statement occurs in a function.
+
+	* awk.h: New defines target_atexit and target_end.
+	* awkgram.y (LEX_EXIT): Initilize the jump targets.
+	* eval.c (r_interpret): Use current rule to choose the jump target
+	for Op_K_exit.
+	* debug.c (print_instruction): Adjust case Op_K_exit.
+
+Tue Mar 29 20:45:49 2011  Pat Rankin  <rankin@patechdata.com>
+
+	Move the code to support sorting `for (index in array)' from
+	eval.c to array.c, and implement several additional orderings.
+
+	* array.c (comp_func, sorted_in, sort_ignorecase,
+	sort_up_index_ignrcase, sort_down_index_ignrcase): Move from eval.c.
+	(sort_up_index_string, sort_down_index_string): Move from eval.c
+	and rename from *_str to *_string.
+	(sort_selection, sort_match, sort_maybe_numeric_index,
+	sort_up_index_number, sort_down_index_number,
+	sort_up_value, sort_down_value): New routines.
+	* eval.c (sort_&c): Move to array.c.
+	(r_interpret: case Op_arrayfor_init): Call sort_maybe_numeric_index
+	before and after qsort.
+	* awk.h (qsort_compfunc): New typedef.
+	(sorted_in, sort_maybe_numeric_index): Declare.
+
+Fri Mar 25 13:15:36 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h: Move libsigsegv portability checks to here from main.c.
+	* eval.c (fcall_list, fcall_count): Move definitions to here
+	from main.c.
+	* io.c (do_find_source): Check against NULL in for loop.
+	* main.c: Lots of cleanup. Move some things out to other files,
+	add comments to some variable definitions.
+	(enum asgntype): To assign_type
+	(main): Remove decls of getopt variables, clean up comments.
+	Use emalloc and efree for libsigsegv stack. Remove check for SCCS
+	leading magic characters.
+	(add_preassign): Change allocassigns to alloc_assigns.
+	(init_locale): Change strdup calls to estrdup.
+	(save_argv): Make the routine static.
+	* version.in (version_string): Remove leading 4 SCCS magic characters.
+
+Wed Mar  2 08:15:02 2011  John Haque      <j.eh@mchsi.com>
+
+	* array.c (asort_actual): Handle the case when the same array
+	is used as the source and destination.
+	* field.c (do_split): Make it fatal if attempting to use the same
+	array for both second and fourth arguments. 
+	(do_patsplit): Ditto.
+
+Sun Feb 27 08:01:04 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Update copryright in all relevant files.
+
+Sat Feb 26 21:54:07 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (sorted_in): Revise text of lint warning.
+
+Fri Feb 25 17:34:14 2011  Pat Rankin  <rankin@patechdata.com>
+
+	* eval.c (sorted_in): Remove incorrect unref() call.
+
+Wed Feb 23 21:48:20 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (main): Free extra_stack, to make valgrind happier.
+
+Tue Feb 22 12:04:09 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (UPDATE_YEAR): Move to 2011. Fix copyright.
+
+Tue Feb 15 17:11:26 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* eval.c (sorted_in, sort_up_index_str, sort_down_index_str,
+	sort_up_index_ignrcase, sort_down_index_ignrcase, sort_ignorecase):
+	New functions to sort arrays for `for (index in array)' statements.
+	(r_interpret: case Op_arrayfor_init): Call sorted_in().
+
+Wed Feb 16 07:12:50 2011  John Haque  <j.eh@mchsi.com>
+
+	Fix line numbers in the lint, warning and error messages issued
+	by the parser.
+
+	* awkgram.y (lintwarn_ln, warning_ln, error_ln): New local versions,
+	each accepts an additional line number argument.
+	(print_included_from): New function to seperate 'Included from ..'
+	message from yyerror. Use it in yyerror, and in the new functions.
+	(grammar): Use the local versions for messages.
+	(add_srcfile, include_source, dup_parms, func_install, param_sanity,
+	mk_binary, add_lint): Ditto.
+	(dup_params, include_source): Adjust arguments to pass line number.
+	* awk.h: New definition ATTRIBUTE_PRINTF_2.
+
+	* awkgram.y (yylex): New variable warntab. Use it to issue only one
+	warning for the same non-standard special token in source.
+	(parse_program): Avoid spurious warnings. Don't call check_funcs if
+	yyparse aborts prematurely.
+
+Mon Feb 14 08:03:41 2011  John Haque  <j.eh@mchsi.com>
+
+	* awkgram.y (regexp): Don't use tokstart in lint warning, it isn't
+	`\0' terminated.
+	(grammar): Copy update and assign routines from relevant variables into
+	instructions to avoid extra pointer dereferencing at run-time.
+	* awk.h (update_var, assign_var): new definitions.
+	* eval.c (r_interpret): Adjust cases Op_var_assign and Op_var_update.
+
+Sun Feb 13 20:22:47 2011  Eli Zaretskii  <eliz@gnu.org>
+
+	* awkgram.y (add_srcfile):
+	* debug.c (source_find): Pass `path' and `src' to files_are_same.
+	* gawkmisc.c [__DJGPP__ || __MINGW32__]: Include pc/gawkmisc.pc,
+	for consistency with __EMX__ and pc/Makefile.
+	* debug.c (interpret, initialize_pager, prompt_continue)
+	(set_gawk_output): Use ISATTY instead of isatty.
+	* io.c (redirect, iop_alloc): Same.
+	* main.c (main): Same.
+	* awk.h (ISATTY): Trivial definition, if not defined elsewhere.
+
+Sun Feb 13 20:16:04 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (check_funcs): Update warning about never called to say
+	"never called directly" since it could be called indirectly.
+
+Sun Feb 13 07:12:50 2011  John Haque  <j.eh@mchsi.com>
+
+	* profile.c (pprint): In case Op_indirect_func_call, pop off
+	indirect var after function parameters.
+	Thanks to Hermann Peifer <peifer@gmx.eu> for the bug report.
+	* array.c (do_delete): Always free an empty sub-array name and node.
+	* ChangeLog: Fix typos. 
+
+Fri Feb 11 10:26:25 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (remad_std_file): Close oldfd first, in case we've
+	run out of fd and do dup2 if the newfd isn't what we were
+	looking for.  Thanks to Hermann Peifer <peifer@gmx.eu> for
+	the bug report.
+
+Thu Feb 10 21:31:36 2011  Andreas Buening    <andreas.buening@nexgo.de>
+
+	* main.c (load_procinfo): Fix warning about unsed variables if we
+	don't have multiple groups.
+	* protos.h: Move decls for many standard functions here if
+	they aren't in the header files (OS/2) and bracket inside
+	#ifndef STDC_HEADERS.
+	* io.c (devopen): Remove decl of strtoul.
+	* field.c (set_FIELDWIDTHS): Same.
+	* awk.h: Always include protos.h.
+
+Tue Feb  8 22:46:22 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c, builtin.c, eval.c: Equalize message strings and
+	fix a typo. Thanks to Benno Schulenberg <bensberg@justemail.net>.
+
+Mon Feb  7 11:23:33 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (next_sourcefile): Comment out assertion that
+	lexeof is true; causes core dump on user typos of bad
+	characters which previous versions did not do. Thanks to
+	Pat Rankin for the report.
+
+	* re.c (expand_range): Allow for ^ as first character
+	inside range. Thanks for Nelson Beebe for the bug report.
+
+Fri Feb  4 10:28:19 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* README.cvs: Udpated.
+	* Checklist: New file for storage in the git repository.
+
+Wed Feb  2 20:34:41 2011  Corinna Vinschen  <vinschen@redhat.com>
+
+	* awkgram.y (free_bc_internal): Remove unused variable.
+
+Tue Feb  1 23:13:10 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* bootstrap.sh: No need to find aclocal.m4, just touch it.
+
+Tue Feb  1 23:05:51 2011  Corinna Vinschen  <vinschen@redhat.com>
+
+	Make values of ctype macros into unsigned char to fix
+	warnings found on Cygwin / Newlib.
+
+	* array.c (array_init): Add cast.
+	* awkgram.y: Ditto.
+	* awkprintf.h: Ditto.
+	* builtin.c (sub_common, nondec2awknum): Ditto.
+	* command.y: Ditto.
+	* eval.c (fmt_ok): Ditto.
+	* ext.c (make_builtin): Ditto.
+	* main.c (main, arg_assign): Ditto.
+	* re.c (check_bracket_exp): Ditto.
+	* node.c (r_force_number, parse_escape): Ditto.
+	(dump_wstr): Add unused attribute (unrelated).
+
+Tue Feb  1 23:01:40 2011  John Haque  <j.eh@mchsi.com>
+
+	Fix switch debugging.
+
+	* awkgram.y (LEX_SWITCH, case_statements, case_statement,
+	case_value): Linearize instructions to facilitate debugging.
+	(switch_body): Removed.
+	(yylex): Add LEX_CASE in special token processing.
+	(free_bc_internal): Remove case Op_K_switch.
+	* awk.h (OPCODE): Remove opcode Op_case_list.
+	* eval.c (r_interpret): Remove Op_K_switch. Add case
+	Op_K_case to handle switch.
+	Add cases Op_K_do, Op_K_while, Op_K_for, Op_K_arrayfor, Op_K_switch
+	and Op_K_default as no-ops, needed for pgawk.
+	* debug.c (print_instruction): Remove case Op_K_switch,
+	add case Op_K_case instead.
+
+	Unrelated:
+	* awkgram.y (case_statements): As case values, "abc" and /abc/
+	no longer considered as duplicates.
+
+	Cleanup grammar and run-time code for switch and loops.
+	Jump targets for break and continue are now fixed, and known
+	at parse time. See ChangeLog entry dated Oct 21, 2010.
+
+	* awk.h (OPCODE): Remove Op_push_loop and Op_pop_loop.
+	(loop_count): Remove definition.
+	* awkgram.y (fix_break_continue): Change calling parameters to
+	instruction list, break and continue targets. Adjust code.
+	(LEX_DO, LEX_WHILE, LEX_SWITCH, LEX_FOR): Simplify grammar. Use
+	Op_no_op as target for break. Adjust call to fix_break_continue.
+	(mk_for_loop): Ditto.
+	* eval.c (r_interpret): Nuke cases Op_push_loop and Op_pop_loop.
+	Simplify Op_K_break and Op_K_continue. Remove declaration of in_loop
+	and all loop detection code thereof.
+	* debug.c (pre_execute, post_execute): Adjust declarations and code.
+	(print_instruction): Nuke cases Op_push_loop and Op_pop_loop.
+	* eval.c (r_interpret): Adjust calls to pre_execute and post_execute. 
+	* profile.c (pprint): Adjust cases Op_K_for, Op_K_do, Op_K_while,
+	Op_K_switch and Op_K_arrayfor. Add cases Op_K_case and Op_K_default.
+	Remove Op_push_loop and Op_pop_loop.
+
+	Unrelated cleanup:
+	* awkgram.y (mk_condition): Don't include Op_K_if, Op_K_else and
+	Op_cond_exp if not profiling.
+
+Tue Feb  1 10:20:02 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (r_interpret): Change magic string for array sorting.
+
+Sun Jan 30 21:49:53 2011  John Haque  <j.eh@mchsi.com>
+
+	Add `isarray' built-in function.
+
+	* awk.h (enum opcodeval): Op_push_arg: new opcode.
+	(do_isarray): Add declaration.
+	* awkgram.y (tokentab): Add new entry for `isarray' function.
+	(snode): Add handling for it.
+	* builtin.c (do_isarray): New function.
+	(do_length): Die if posix and get an array argument.
+	* debug.c (print_instruction): Handle Op_push_arg.
+	* profile.c (pprint): Likewise.
+	* eval.c (optypes, r_interpret): Likewise.
+
+Sun Jan 30 21:13:01 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* hard-locale.h: Synced to GNU grep.
+	* hard-locale.c: New file, brought in from GNU grep.
+	* Makefile.am (base_sources): Add hard-locale.c.
+	* dfa.h: Sync as much as possible to GNU grep.
+	* dfa.c: Sync as much as possible to GNU grep.
+	* builtin.c (do_strftime): Remove unneeded variable.
+
+Thu Jan 27 22:52:54 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (comp_func): Add declaration.
+	* debug.c (comp_func): Make not static, and move to ...
+	* eval.c (comp_func): ... here.
+	(r_interpret): Add array sorting if magic index is
+	set in PROCINFO.
+
+Thu Jan 27 22:12:00 2011  Corinna Vinschen  <vinschen@redhat.com>
+
+	* Makefile.am: Remove $(EXEEXT) from 'awk' symlink.
+
+Thu Jan 27 21:21:13 2011  John Haque  <j.eh@mchsi.com>
+
+	* eval.c (r_interpret): When in BEGINFILE or ENDFILE, add check for
+	`getline var < file' in cases Op_K_getline_redir and Op_K_getline.
+
+	* awkgram.y (constant_fold): Code cleanups. Fix bug in the code for
+	string concatenation.
+
+	* configure.ac: Remove unneeded extra call to AC_LANG.
+
+Thu Jan 27 15:00:42 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c: Fix up some comments.
+	* io.c (remap_std_file): New function.
+	(iop_close): Use it.
+
+Mon Jan 24 22:14:21 2011  Andreas Buening    <andreas.buening@nexgo.de>
+
+	* debug.c: Bracket variables used with readline in #ifdef.
+	* dfa.c (add_utf8_anychar): Move inside ifdef.
+
+Mon Jan 24 22:05:26 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (make_regexp): Add separate variable for dfa syntax.
+	General formatting cleanup.
+	(research): General formatting cleanup.
+	(refree): Remove out of date comment.
+	(re_update): Comment the routine.
+	(check_bracket_exp): Improve check for range to not get [^-/]
+	kinds of things. Thanks to Nelson Beebe for pointing out the bug.
+
+Wed Jan 19 20:31:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (is_valid_character): Add `& 0XFF' and remove casts to
+	unsigned chars in other files. Remove definition of this macro
+	in not MBS_SUPPORT case, since it wasn't being used.
+	(btowc_cache): New macro to index into the array and use the
+	same trick. Relies on ANSI C preprocessor semantics.
+	Fix all uses.
+	* builtin.c, node.c, io.c: Fix uses of these macros.
+
+Wed Jan 19 20:19:29 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (wstr2str): New function.
+	* awk.h: Declare it.
+	* builtin.c (is_wupper, is_wlower, to_wupper, to_wlower,
+	wide_change_case, wide_tolower, wide_toupper): New functions to
+	simplify wide character case conversions.
+	(do_tolower, do_toupper): Use wide_tolower, wide_toupper in multibyte
+	case.
+	(do_substr): Simplify code a little bit.
+
+Mon Jan 17 22:48:48 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_bindtextdomain): Change type of `the_result'
+	to const char* to kill compiler warnings.
+	* debug.c (source_find): Improve error message when file not
+	found.
+	* awkgram.y (get_src_buf): Add cast to value of `read' to
+	turn off compiler warnings on different systems.
+
+Mon Jan 10 21:40:05 2011  Andreas Buening    <andreas.buening@nexgo.de>
+
+	* io.c (devopen): Handle opening of directories for OS/2.
+
+Mon Jan 10 21:37:49 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h: Rearrange includes of <fcntl.h> so it won't be
+	included for VMS, move definition of O_BINARY down.
+
+Sat Jan  8 23:00:37 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h: Include <fcntl.h> here.
+	* main.c, io.c: Remove includes of <fcntl.h>.
+
+2011-01-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* io.c (PIPES_SIMULATED) [__DJGPP__ || __MINGW32__]: Define.
+	(binmode): Define for __DJGPP__ and __MINGW32__ as well.
+	(gawk_popen) [!PIPES_SIMULATED]: Define for __DJGPP__ and
+	__MINGW32__ as well.
+
+Wed Jan  5 20:35:30 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Move call to AC_LANG([C]) into here from
+	m4/readline.m4.
+
+Tue Jan  4 11:21:18 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Clean up some compiler warnings:
+
+	* array.c (do_delete): Cast for printf.
+	* builtin.c (do_bindtextdomain): Casts for const char *.
+	* io.c (rs1scan): Cast for indexing of array.
+	* re.c (add_char): Remove unused variables.
+
+Fri Dec 31 11:05:11 2010  Michal Jaegermann  <michal@harddata.com>
+
+	* awk.h (strncasecmpmbs): Change parameters to const char *.
+	* builtin.c (strncasecmpmbs): Change parameters to const char *.
+	Add casts as appropriate in calls to other functions.
+	* eval.c (cmp_nodes): Add casts in calls to strncasecmpmbs.
+	* node.c (str2wstr): Ditto.
+
+Tue Dec 28 21:13:31 2010  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.c: Restore inclusion of pc/gawkmisc.pc.
+
+Tue Dec 28 21:00:36 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ext.c (make_builtin): Make first parameter const char *.
+	Adjust code inside to fit.
+	* awk.h (make_builtin): Adjust declaration.
+
+Mon Dec 27 19:55:10 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c [AF_UNSPEC, AF_INET, AF_INET6]: Add definitions for systems
+	that don't define them.
+	(inetfile): Make IPv6 a fatal error if using the fake getaddrinfo,
+	since chances are good that IPv6 really isn't available.
+
+Sat Dec 25 19:36:27 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Fixes for z/OS.
+
+	* awkgram.y (tokcompare): Change argument types to const void *.
+	(check_special): Add cast to void * in call to qsort.
+	* builtin.c (do_bindtextdomain): Change `directory' and `domain'
+	to const char *.
+	* custom.h (ZOS_USS): Undef HAVE_SYS_PARAM_H and HAVE_MCHECK_H.
+	Beats me why configure thinks it has those things.
+
+Fri Dec 24 12:56:46 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* custom.h: Remove defs for MIPS RiscOS.
+	* configure.ac, aclocal.m4: Updated to Autoconf 2.68.
+
+Wed Dec 22 21:21:28 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gettext.h: Synchronized with gettext 0.18.1.
+
+2010-12-22  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.18.1.
+	* ABOUT-NLS, config.rpath: Updated from gettext 0.18.1.
+
+Sun Dec 19 16:43:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (update_PROCINFO_str, update_PROCINFO_num, make_str_node):
+	Change `char *' parameters to `const char *' to avoid some
+	compiler warnings.
+	* ext.c (do_ext): Remove cast in call to make_string.
+	* field.c (update_PROCINFO_str, update_PROCINFO_num): Adjust. 
+	* main.c (init_args): Remove casts in calls to make_string.
+	* node.c (r_make_str_node): Add cast in assignment if ALREADY_MALLOCED.
+
+Sat Dec 18 20:12:59 2010  Eli Zaretskii  <eliz@gnu.org>
+
+	* array.c, gawkmisc.c, io.c, main.c, regex_internal.h,
+	awkgram.y, awk.h, array.c: Remove OS2 and _MSC_VER defines.
+
+Sat Dec 18 19:56:17 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c, eval.c, floatcomp.c, io.c: Remove all the crufty
+	old code for #ifdef CRAY.
+
+Thu Dec 16 11:06:50 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Put strftime() default format into PROCINFO["strftime"].
+
+	* awk.h (def_strftime_format): Declare const char[] array.
+	* main.c (def_strftime_format): Define it.
+	(load_procinfo): Load it into PROCINFO.
+	* builtin.c (do_strftime): Use value in PROCINFO for format
+	string if it's there. Remove old def_format static array.
+
+Mon Dec 13 17:12:44 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	If not POSIX, turn [d-h] into [defgh].
+
+	* re.c (check_bracket_exp): Make warning about ranges under
+	lint control.
+	(expand_range): New routine to expand ranges.
+	(make_regexp): Check if might have range and call expand_range.
+	(add_char): New helper function for expand_range.
+
+Thu Dec  9 22:12:48 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c: Restored changes of 1 July 2010 to allow /inet4 and /inet6;
+	they got lost amongst the merges. Fixed checking of do_sandbox.
+	Also, removed the option for raw IP sockets since it was never
+	implemented and wasn't going to be.
+
+Tue Dec  7 11:59:00 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Remove test for return type of sprintf. Another
+	renegade from the late 1980's bites the dust!
+	* protos.h (sprintf): Remove declaration.
+
+Sun Dec  5 15:01:35 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (grow_stack): Change env var to GAWK_STACKSIZE.
+	* awk.h, main.c, eval.c, profile.c: Removed features added
+	for those who are Strong In The Ways of the Source.
+	* debug.c (comp_func): Moved to here from eval.c, where it's
+	no longer needed.
+
+Sat Dec  4 21:44:38 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (init_btowc_cache): New function.
+	(btowc_cache): New array.
+	(str2wstr): Use is_valid_character in test instead of several isXXX
+	calls.
+	* awk.h [is_valid_character]: Macro to use btowc_cache.
+	* main.c (main): Call init_btowc_cache().
+	* io.c (rs1scan): Add call to is_valid_character when processing
+	characters byte by byte.
+
+Wed Dec  1 08:10:21 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h, awkgram.y, debug.c: Change CONTEXT to AWK_CONTEXT
+	everywhere to avoid problems with libsigsegv on cygwin.
+
+Tue Nov 30 13:48:34 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (MRL): Removed variable, not used since Tandem code nuked.
+	(main): Fix argument parsing for -m.
+	(usage): Make -m undocumented (already is the doc/* files).
+	* io.c (MRL): Remove declaration.
+
+Mon Nov 29 21:59:21 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (check_bracket_exp): Add check and warning for ranges.
+	I may live to regret this.
+
+Mon Nov 29 20:09:18 2010  Eli Zaretskii  <eliz@gnu.org>
+
+	* replace.c [!HAVE_STRFTIME]: For __MINGW32__, define
+	HAVE_STRFTIME while compiling missing_d/strftime.c.
+
+Thu Nov 25 20:12:28 2010  John Haque          <j.eh@mchsi.com>
+
+	* awkgram.y (grammar): Bug fix in delete for loop efficiency hack.
+	* debug.c (do_info): Don't sort functions to avoid potential memory leak
+	in case A_FUNCTIONS.
+
+	Plug more potential leaks in the debugger eval/condition commands:
+	* builtin.c (POP_TWO_SCALARS): New macro to free first scalar in case
+	of a fatal error in the next.
+	(do_index, do_atan2, do_lshift, do_rshift, do_and, do_or, do_xor):  Use it
+	instead of two consecutive POP_SCALARs.
+
+	Execution context related code cleanups. Also, added descriptive
+	comments for functions.
+	* awkgram.y (get_context): Nuked. 
+	(push_context, pop_context, in_main_context): New functions.
+	(mk_program, parse_program, yylex): Updated.
+	* debug.c (condition_triggered, do_eval, parse_condition): Updated.
+	* eval.c (unwind_stack): Updated.
+	* main.c (main): Updated.
+	* awk.h (struct context): Removed member level, not needed.
+
+	* eval.c (op_assign): Initialize r to NULL, and declare x only
+	if HAVE_FMOD not defined to remove GCC warnings.
+
+Thu Nov 25 08:32:31 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (posix_compare): Do string comparison with strcoll() /
+	wcscoll().
+	(cmp_nodes): Call it if do_posix.  This may be a bad idea,
+	but what the heck.  Standards compatibility uber alles!
+
+Wed Nov 24 20:09:23 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ext.c (do_ext): Require definition of `plugin_is_GPL_compatible'
+	per GNU Coding standards.
+
+Sun Nov 21 14:23:58 2010  John Haque          <j.eh@mchsi.com>
+
+	Debugger: Fix memory leak when quitting pager.
+	* awk.h (PUSH_BINDING, POP_BINDING): Generalize macro definitions.
+	* debug.c (print_array): save and restore bindings for pager.
+	free list in case of an	early exit in the pager.
+	(do_dump_instructions): Don't sort functions to avoid potential
+	memory leak.
+	(execute_code): Adjust PUSH_BINDING and POP_BINDING macro invocations.
+
+	* awkgram.y (func_call): Avoid reading freed memory for indirect var
+	name; do the special variable check before the call to 'variable'.
+
+	* eval.c (r_interpret): Fixes and cleanups. Change TOP to TOP_SCALAR
+	in the case Op_store_field.
+	(assign_common, assign, compare): Nuked macros.
+	(cmp_scalar, op_assign): New functions as replacements for the macros.
+
+Fri Nov 19 11:57:28 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* bootstrap.sh, Makefile.am: Remove treatment of CVS.
+	* README.cvs: Updated further.
+
+Thu Nov 18 23:28:23 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Remove `--enable-portals' option. I don't think
+	anyone ever used it.
+	* io.c (two_way_open): Remove the code for portals.
+	* README.cvs, README.git, bootstrap.sh: New files for storage
+	in the Git repository.
+
+Tue Nov 16 11:56:31 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* version.in: Removed descriptive comments. New features and
+	so on are documented in the documentation and in NEWS.
+
+Mon Nov 15 19:19:25 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (LEX_LENGTH): Removed warning about length with
+	no argument being deprecated.
+	* awkprintf.h: Remove code for sun386. Fix %c to print multibyte
+	character instead of first byte.
+	* builtin.c (sub_common): Update commentary about POSIX.
+	* io.c (nextfile): Add MAYBE_NUM to FILENAME.
+
+Fri Nov 12 11:53:15 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (update_global_values): New routine, needed for correct
+	operation of --dump-variables.
+	* awk.h: Declared it.
+	* awkgram.y (get_varlist): Call it.
+	Thanks to Hermann Peifer <peifer@gmx.eu> for the bug report.
+
+	* debug.c (find_subscript): Initialize `r' to NULL, per
+	Michal Jaegermann.
+
+Thu Nov 11 16:31:49 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h: Restore decls of strcasecmp, strncasecmp.
+	* builtin.c: Lots of general cleanups.
+	(sub_common): Actually enable POSIX rules! (Wasn't done right
+	earlier.)
+
+Thu Nov  4 14:08:29 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c, awkgram.y, awkprintf.h, builtin.c, debug.c, eval.c,
+	field.c, io.c, main.c, node.c, profile.c, re.c: Remove register
+	keyword everywhere.
+	* node.c: Minor code cleanups.
+
+Wed Nov  3 08:29:15 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (free_wstr): If argument is null string or null field,
+	return. Thanks to Vojtech Vitek <vvitek@redhat.com>
+
+Tue Nov  2 16:45:06 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Straighten out options more.  --lint --> -L, --lint-old --> -t
+
+	* main.c (optlist, optab, main, usage): Adjusted approrpiately.
+
+	Other:
+	* awk.h: Lots more general cleanup.
+	* builtin.c (strncasecmpmbs): Move mbstate vars into the routine.
+	* awk.h (strncasecmpmbs): Adjust declaration.
+	* eval.c (cmp_nodes): Adjust call.
+	* awkgram.y, command.y: Remove unused variables.
+
+Mon Nov  1 21:55:26 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (optlist, optab, main): Renamed -l option to -t
+	so can eventually merge in xgawk's -l option.
+	(usage): Adjusted approrpiately.
+
+Mon Nov  1 16:23:52 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c, awk.h, custom.h, eval.c, gawkmisc.c, io.c, main.c,
+	protos.h, replace.c: Remove code related to: __amigaos__,
+	atarist, BeOS, _MSC_VER, MSDOS, TANDOM, WIN32, and anything
+	not for __STDC__.
+
+Sun Oct 31 21:49:22 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h: Start on cleaning up. Remove stuff for DOS, WIN32,
+	TANDEM, atarist, NeXT even!
+
+Sun Oct 31 05:56:23 2010  John Haque          <j.eh@mchsi.com>
+
+	Add array of arrays.
+
+	* awk.h (Op_sub_array): New opcode.
+	(POP_SCALAR, TOP_SCALAR): New macros. If the item is not a scalar,
+	make it a fatal error.
+	(POP_STRING, TOP_STRING): Use POP_SCALAR and TOP_SCALAR instead
+	of POP and TOP.
+	(force_string, force_number): Unrelated: simplify (remove) macros
+	for older gcc and non-gcc compilers.
+	* awkgram.y (grammar): New non-terminals for array subscripts.
+	delete array subscripts are handled differently than array subscripts
+	used as a variable.
+	(SUBSCRIPT): New terminal symbol to indicate end of subscripts. 
+	(yylex): Return SUBSCRIPT after all the subscripts has been read.
+	(rules variable, LEX_DELETE and LEX_FOR): Adapt to these changes.
+	(sub_counter): New global to count the number of subscripts in a
+	delete statement.
+	(optimize_assignment): Adjust code for assignment to an array element.  
+	* array.c (make_aname): New function to construct a sub-array name.
+	(get_array): Handle Node_val in the default case.
+	(concat_exp): Issue fatal error message if each expression is not a
+	scalar.
+	(assoc_clear): Recursively clear sub-arrays.
+	(do_delete, assoc_dump, assoc_sort_inplace, dup_table):
+	Handle array of arrays.
+	* builtin.c: Replace POP with POP_SCALAR as appropriate.
+	* eval.c (optypes): Add entry for Op_sub_array.
+	(r_interpret): Handle Op_sub_array. For case Op_subscript, increment
+	reference count only if the result is a scalar. If type is not a
+	scalar in Op_subscript_lhs, make it fatal. Adjust stack pointer
+	after a call to do_delete in Op_K_delete. Change POP(TOP)
+	to POP_SCALAR(TOP_SCALAR) as needed.
+	* profile.c (pprint): Add case for Op_sub_array.
+	* command.y (grammar): New non-terminals and rules to handle
+	array of arrays.
+	* debug.c (struct list_item): Redesigned. Field subs is NODE ** now,
+	new fields num_subs and sname. New flags OLD_IS_ARRAY and CUR_IS_ARRAY;
+	removed flag ARRAY_WATCH. Renamed macro IS_ARRAY() to WATCHING_ARRAY.
+	(do_info): Adapt to the structural changes in cases A_WATCH and
+	A_DISPLAY.
+	(print_array): New function to print contents of an array.
+	(print_subscript): New function to print an element of an array.
+	(do_print_var): Use the new functions to print an array element 
+	and contents.
+	(do_set_var): Adapt to the structural changes in list_item for
+	an array element.
+	(delete_item, do_add_item, display): Ditto.
+	(add_item): Ditto. Use field symbol, not subs to store field number and
+	adjust accordingly everywhere.
+	Unrelated: handle function parameter correctly, watch and display now
+	prints the param name instead of the actual array name.
+	(find_subscript): New function.
+	(initialize_watch_item): Use the new function find_subscript
+	to locate an array element NODE.
+	(watchpoint_triggered): Redone.
+	(cmp_val): Redone.
+	(print_watch_code): Adjust code for printing subscript.
+	(print_instruction): Add case for Op_sub_array.
+	(serialize_subscript): New function.
+	(serialize): Use the new function to serialize watch and display
+	subscripts.
+	(unserialize_list_item): Adapt to the structural changes. Also,
+	simplify code.
+	(do_print_f): Redo code for printting array element.
+	(pre_execute_code, execute_code): Change POP to POP_SCALAR.
+
+	Unrelated:
+
+	* debug.c (unserialize_commands): New function for common code in
+	unserialize_breakpoint and unserialize_list_item.
+	(unserialize_breakpoint and unserialize_list_item): Use the new
+	function.
+
+	* awkgram.y (grammar): Do not terminate parser if seen an empty(NULL)
+	subscript. Install null string as subscript and continue parsing.
+	(variable): Do not terminate parser if type is Node_func, change it
+	to Node_var_new temporarily. Simplifies grammar and allows parser to
+	continue.
+
+	* command.y (yylex): Add history entry when blank line repeats
+	previous command.
+
+	* debug.c (pp_args): Removed. Pretty-printing SUBSEP
+	seperated indexes can not be made to work reasonably in all cases. 
+	(struct list_item): Removed field pp_subs.
+	(concat_args): Move to file command.y.
+	* command.y (grammar): Concatenate SUPSEP seperated	indexes.
+
+Thu Oct 28 16:25:08 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Remove use of varargs.h everywhere:
+
+	* awkgram.y (yyerror): Fixed.
+	* awk.h [CAN_USE_STADARG_H]: Removed, #error added if not available.
+	(snprintf, Func_print, msg, error, warning): Fix declarations.
+	* cmd.h (gprintf, d_error): Fix declaration.
+	* command.y (yyerror): Fixed.
+	* debug.c (d_error, gprintf): Fixed code.
+	* main.c (lintfunc): Fix declaration.
+	* msg.c (msg, warnning, error, r_fatal): Fixed code.
+
+Wed Oct 27 16:45:29 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h [P]: Finally, nuked the `P' macro. Removed definitions
+	and uses.
+	[HAVE_DOPRNT]: Removed check for this, now require vfprintf.
+	[BELL]: Nuked; require a compiler that supports '\a'.
+	* array.c, awkgram.y, awkprintf.h, builtin.c, cmd.h, command.y,
+	debug.c, eval.c, ext.c, field.c, io.c, main.c, protos.h [P]:
+	Remove all uses.
+	* node.c (r_force_number): Change check with strtod to `ptr == cpend',
+	SunOS 3.5 compatibility no longer concerns us. Removed the comment.
+	[P]: Removed all uses.
+	(parse_escape): Change from BELL to '\a'.
+	* profile.c (pp_string): Change from BELL to '\a'.
+	[P]: Removed all uses.
+
+Tue Oct 26 20:11:37 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (fix_break_continue): New routine to make break and
+	continue instructions point to where they should jump to. Adjusted
+	grammar to call it for switch and loops.
+	* eval.c (r_interpret): For Op_K_break and Op_K_continue, jump
+	to pc->target_jmp.
+	* command.y (cmdtab, do_help): Translate the help messages.
+	* debug.c (option_list, option_help): Translate the help messages.
+	Elsewhere, clean up / add calls to gettext.
+
+Fri Oct 22 11:18:29 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ChangeLog: Merged with ChangeLog.BYTECODE.
+	* Makefile.am (EXTRA_DIST): Removed ChangeLog.BYTECODE.
+	* ChangeLog.BYTECODE: Removed the file.
+
+Thu Oct 21 12:16:35 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Make break and continue outside a loop not allowed at all,
+	even with --traditional, as BWK awk no longer allows this.
+
+	* eval.c (r_interpret): For Op_K_break and Op_K_continue, make
+	them fatal errors if not in a loop.
+	* awkgram.y (break_allowed, continue_allowed): New variables.
+	[BREAK, CONTINUE]: New flags for tokentab.
+	(yylex): If set, increment the corresponding variable.
+	(Grammar): Test variables when break/continue seen, decrement them
+	at the end of productions for loops and switch.
+
+Tue Oct 19 20:03:29 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (optab, usage): Remove --compat, --copyleft, and --usage extra
+	option aliases.
+
+Tue Oct 19 08:25:02 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkprintf.h (r_format_arg): Undouble "%" characters in
+	error messages. Thanks to Scott Deifik for catching the problem.
+
+Sat Oct 16 22:08:54 2010    Arnold Robbins      <arnold@skeeve.com>
+
+	Apply changes from John Haque:
+
+	* awk.h [ASSIGNED]: Remove unused flag.
+	(Op_cond_pair_left): Remove.
+	* debug.c (print_instruction): Remove Op_cond_pair_left.
+	(do_trace_instruction): Fix print for Op_newfile.
+	(parse_condition): Improve code.
+	* eval.c (optypes): Add space to string for "!".
+	(r_interpret): Remove Op_cond_pair_left and Node_instruction cases.
+	Revise Op_cond_pair to handle left and right sides correctly.
+	Simple code fixes in some other cases.
+	* profile.c (pprint): Remove Op_cond_pair_left. Simplify Op_not.
+
+Fri Oct 15 14:17:09 2010    Arnold Robbins      <arnold@skeeve.com>
+
+	* awk.h (Op_cond_pair_left): New op for left side of condition pair.
+	* debug.c (print_instruction): Support it.
+	* profile.c (pprint): Ditto.
+	* eval.c (r_interpret): Split Op_cond_pair into two cases; they have
+	to be handled differently.
+
+Wed Oct 13 19:17:03 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex.h [RE_SYNTAX_AWK]: Add RE_CHAR_CLASSES, for compatibility
+	with modern Unix awk.
+
+Sun Oct 10 15:31:01 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (dfawarn): Do nothing in body, since gawk does it's
+	own checking.
+
+Sun Oct 10 15:30:34 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	MERGE with bytecode version!  Many many files changed / added.
+
+Sun Oct  3 08:41:25 2010    John Haque          <j.eh@mchsi.com>
+
+	* Lots of files: Indirect function call, FPAT, BEGINFILE/ENDFILE
+	from gawk-devel.
+
+	* awk.h (defrule): New enum for rule types.
+	(ruletab): Converts rule types to string constants.
+	* awkgram.y: Use rule types to simplify code in grammar.
+	* eval.c, debug.c, profile.c, awkgram.y routines: Update to use ruletab.
+
+	* Lots of files: New debugger command eval for evaluation of
+	arbitrary (g)awk expression(s).
+			eval "awk statement(s)"
+				OR
+			eval p1, p2
+			> awk statement
+			> more awk statement(s)
+			> end
+	p1, p2 are eval locals.
+	Conditional break/watch point:
+		break 1 "condition expression"
+			OR
+		break 1
+		condition "condition expression"
+
+	* command.y: grammar clean-ups.
+	(find_command): Redo to fix bugs in abbreviation/partial-string
+	search.
+
+	* debug.c (command_source): New structure. Used to manage
+	sources for debugger commands. 'source file' command can now
+	include additional source commands.
+	
+	* awk.h: new enum type redirval for I/O redirection types;
+	remove redirection types from OPCODE.
+	* awkgram.y: Adjust grammar for redirection type changes.
+	(yylex, mk_getline): Update for redirection type changes.
+	* io.c (redirect, do_getline): Ditto.
+	* profile.c (redir2str): New function to convert redirection types
+	to string constants.
+	(pprint): Use new function redir2str.
+	* debug.c (print_instruction): Ditto.
+	* eval.c (optypes): Remove redirection types from table.
+
+	* main.c (main): initialize do_optimize to 1, default optimizations.
+	do_optimize > 1 for -O (--optimize) command line option.
+	do_optimize = 0 turns off all optimizations, and is	for debugging
+	purposes.
+	* awkgram.y: Updated.
+
+	Lots of other cleanups and improvements.
+
+Thu Sep 16 09:44:47 2010    John Haque          <j.eh@mchsi.com>
+
+	Lots of bug fixes & improvements, including work on
+	profiling.
+
+Wed Aug 18 22:15:06 2010    Arnold Robbins      <arnold@skeeve.com>
+
+	Lots of files: Sync fully with gawk-stable version, in particular
+	documentation edits and all ChangeLog files.
+
+Mon Aug  9 07:17:54 2010    John Haque          <j.eh@mchsi.com>
+
+	Fix the case when runtime stack can have a INSTRUCTION pointer
+	while popping stack items (a next/nextfile statement inside a loop).
+
+	* awk.h: new NODETYPE Node_instruction. Remove instruction pointer
+	from STACK_ITEM union, and all related macros.
+	* eval.c (r_interpret): wrap code (INSTRUCTION) pointer inside
+	a NODE for Op_push_loop. Change Op_pop_loop, Op_K_break
+	and Op_K_continue accordingly.
+	(unwind_stack): free Node_instruction.
+	(nodetypes): add new entry for Node_instruction.
+
+Thu Aug  5 15:05:22 2010    Arnold Robbins      <arnold@skeeve.com>
+
+	* awk.h: Remove redundant declaration of struct lconv loc;
+	* awkprintf.h: Move ifdef for HAVE_LOCALE_H inside case '\''.
+	* custom.h: Add macros for setenv and unsetenv for Z/OS.
+	* main.c (main): Remove three argument version for Tiny CC after
+	applying patches to local copy that fix the issue with environ.
+
+Mon Jul 26 07:23:01 2010    John Haque          <j.eh@mchsi.com>
+
+	Started Byte Code version ChangeLog.
+
+	* awk.h, eval.c, debug.c, profile.c: Renamed opcode Op_exit to
+	Op_atexit. Simplify exit value handling; use existing global
+	exit_val from main.c.
+	New opcode Op_stop.
+
+	* msg.c: New variables fatal_tag_valid, fatal_tag.
+	(r_fatal): Use these new variables.
+	(err): Change myname from dgawk to gawk when debugging;
+	reflects the correct source of error messages.
+
+	* builtin.c, msg.c: Change stdout to output_fp.
+	(do_fflush): Also flush output_fp if not stdout.
+
+	* command.y (yylex, yyparse): (Much) improved error recovery.
+
+	* awkgram.y (yylex): Add 'goto out' in 'check_special'
+	for do_traditional or do_posix check, lost somewhere
+	between 3.1.3 to 3.1.8.
+	(pop_var): New name remove_symbol to go with mk_symbol.
+	(install): New name install_symbol.
+
+	* debug.c:(set_gawk_output): Improved handling of /dev files
+	including /dev/ttyN, /dev/pts/N.
+	(pre_execute): Renamed execute, a pre_hook in r_interpret.
+	(post_execute): New function, a post_hook in r_interpret;
+	used to detect non-local jumps (next, nextfile, exit)
+	with commands 'until' and 'finish', and to print the
+	returned value for finish.
+	(print_instruction): Redo function params initialization
+	when trace is on. Hopefully, correct this time around.
+	(close_all): New function to close all known files
+	during quit and restart.
+
+	* eval.c(r_interpret): Redefine macro JUMPTO to include
+	post_hook from above, and use it exclusively to move to
+	the next instruction for execution.
+
+	* debug.c (do_run): Trap gawk fatal errors.
+Sun Sep  5 12:44:24 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (check_bracket_exp): Add `warned' flag to table and adjust
+	code to only warn once about each candidate.
+	(make_regexp): Always call check_bracket_exp, per discussion
+	on comp.lang.awk.
+
+Fri Aug  6 16:29:55 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (check_bracket_exp): Improved the code, again.
+
+Thu Aug  5 18:41:27 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (check_bracket_exp): Improved the code.
+
+Tue Aug  3 11:35:11 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (check_bracket_exp): New function.
+	(make_regexp): Call it if do_lint.
+
+Thu Jul  1 19:22:33 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Add support for /inet4/... and /inet6/... files.
+
+	* io.c (socketopen): New parameter `family' for address family.
+	(inetfile): New function. Changed everywhere to use it and
+	the values it sets.
+
+Fri Jun 25 01:01:39 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (main): Added short option letters for all long options
+	that didn't have them so that they can be used in #!. This
+	reinstates -r, FWIW.
+	(usage): Revised message to list standard options first, then
+	options for extensions, sorted by short letter.
+
+Mon Jun 21 23:05:20 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	New FPAT variable and patsplit built-in function.
+
+	* awk.h (NODETYPE): Add Node_FPAT.
+	(FPAT_node, do_patsplit, set_FPAT): Declare.
+	(set_FPAT, update_PROCINFO_str, update_PROCINFO_num,
+	current_field_sep): New functions.
+	* awkgram.y (tokentab): Add patsplit.
+	(snode): Add code for do_patsplit to default third arg to FPAT.
+	(isnoeffect, isassignable): Add cases for Node_FPAT.
+	* eval.c (nodetypes): Add FPAT.
+	(r_tree_eval, r_get_lhs): Add cases for Node_FPAT.
+	* field.c (fpat_parse_field, update_PROCINFO_num, set_FPAT,
+	do_patsplit): New functions.
+	(update_PROCINFO): Renamed to update_PROCINFO_str.
+	(FPAT_re_yes_case, FPAT_re_no_case, FPAT_regexp): New variables.
+	(using_FIELDWIDTHS): Replaced with current_field_sep and all calls.
+	* io.c (set_RS): Call current_field_sep insead of using_fieldwidths.
+	* main.c (main): Use update_PROCINFO_str and update_PROCINFO_num
+	instead of manually updating the array.
+	(varinit): Add FPAT.
+	* profile.c (tree_eval, pp_lhs, is_scalar, pp_var): Add case for
+	Node_FPAT.
+
+Fri Jun 12 13:25:32 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Make command line arguments that are directories a warning.
+	They remain a fatal error if --posix or --traditional.
+
+	* configure.ac: Remove the --disable-directories-fatal option.
+	* io.c (nextfile): Rationalize the code that handles directories,
+	including setting ERRNO correctly.
+
+Thu Feb 26 20:57:52 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Changes from August 2008 through February 2009 to add
+	BEGINFILE and ENDFILE, originally against 3.1.6, merged into
+	development version.
+
+	* awk.h (in_beginfile_rule, in_endfile_rule): Add declarations.
+	* awkgram.y (beginfile_block, endfile_block): Add declarations.
+	(beginfile_or_endfile_rule, parsing_endfile_rule): New variables.
+	(LEX_BEGINFILE, LEX_ENDFILE): New tokens, new rules for those tokens.
+	(tokentab): Add new entries for BEGINFILE, ENDFILE.
+	(LEX_NEXTFILE): Allow nextfile in BEGINFILE rule.
+	(LEX_GETLINE): Allow only `getline var < file' inside BEGINFILE or
+	ENDFILE.
+	* eval.c (interpret): Check in_beginfile_rule and in_endfile_rule for
+	errors for next and nextfile.
+	(update_ERRNO_saved): When errno == 0, set to ERRNO to
+	null string.
+	(interpret): Allow nextfile in BEGINFILE rule.
+	(update_ERRNO_saved): Check errcode paramater, not global errno.
+	* io.c (beginfile_block, endfile_block, in_beginfile_rule,
+	in_endfile_rule): New variables.
+	(do_input): Set them.  Update ERRNO only if not do_traditional.
+	Propogate error code down to fatal message.
+	(run_beginfile_rule, run_endfile_rule): New functions.
+	(iop_alloc): Use it instead of inline code.  Add fourth argument
+	indicating that the open hooks should run. Adjust calls.  Point is
+	to not call open hooks twice inside `nextfile'.
+	(do_nextfile): Check it and also in_beginfile_rule and only longjump
+	when both filebuf valid and not in a BEGINFILE rule.
+	(nextfile): Call run_beginfile_rule and run_endfile_rule as
+	appropriate.  Reorder the logic to set ERRNO and allow BEGINFILE
+	to call nextfile to skip a bad data file.  Adjust calls to
+	iop_open and find_open_hook.
+	(nextfile): Call iop_alloc if there's a BEGINFILE block in case
+	the hooks changed.
+	(find_open_hook): New function.
+	(get_a_record): On read error, just set *errcode and return. Let
+	higher level logic decide if it's fatal.
+	(inrec): Have error be fatal if traditional or if there isn't
+	an ENDFILE rule.
+	* profile.c (dump_prog): Add code for BEGINFILE / ENDFILE.
+	* awk.h (dump_prog): Adjust declaration.
+	* main.c (main): Adjust call to `dump_prog'.  Check beginfile_block and
+	endfile_block also to be not NULL in order to call do_input. Thanks to
+	Steffen Schuler for pointing out the bug.
+
+Thu Feb 26 07:54:51 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Per advice from BWK and my own feelings, nuke additions from 2001
+	of seek and tell functions. They were never documented anyway.
+
+	* awk.h (do_seek, do_tell): Remove declarations.
+	(IOBUF): Remove save_start and rec_size members.
+	* awkgram.y (tokentab): Remove "seek" and "tell" entries.
+	* io.c (do_getline): Remove code setting save_start and rec_size.
+	(iop_alloc): Remove code initializing save_start and rec_size.
+	(do_seek, do_tell): Removed.
+	* configure.ac: Remove --enable-seektell option.
+
+Mon Feb 16 21:54:13 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (tokentab): Enable switch / case by default.
+	* configure.ac: Remove test for --enable-switch.
+
+Thu Feb 12 22:06:17 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (optab): --gen-po becomes --gen-pot. -r goes away since it's
+	now on by default.
+	(usage): Similar changes.
+	* regex.h [RE_SYNTAX_GNU_AWK, RE_SYNTAX_POSIX_AWK]: Adjust to support
+	interval expressions.
+	[RE_DEBUG]: Nuke: it is no longer used.
+	* re.c (resetup): Adjust comment for do_intervals.
+	(reflags2str): Remove RE_DEBUG.
+
+Sat Jan 17 20:41:54 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (WSTRCUR): Always define, no real need for ifdef.
+	* eval.c (flags2str): Similar.
+	* field.c (rebuild_record): Similar.
+
+Sat Jan 17 19:59:39 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Add indirect function calls. They require a special
+	syntax, which is an `@' in front of a function call.
+
+	* awk.h (NODETYPE): New Node_indirect_function_call value.
+	(ASSIGNED): New flag value.
+	* eval.c (nodetype2str): Add new node type.
+	(flags2str): Add ASSIGNED.
+	(func_call): Test the node type to determine
+	what kind of call.  Cache the function body if a real function
+	is called indirectly. Also get scoping right if called from a function.
+	LOTS of work here to get this code right!
+	(op_assign): Add ASSIGNED to flags.
+	* awkgram.y (function_call, direct_function_call): New productions for
+	creating indirect function calls. Only call func_use for direct call.
+	(yylex): Add case for '@'. Only return it if not posix or traditional.
+	* profile.c (tree_eval): Add case for Node_indirect_func_call.
+	(pp_func_call): Check type and print '@' for indirect call.
+
+Tue Dec 30 22:25:04 2008  Assaf Gordon       <gordon@cshl.edu>
+
+	* awk.h (do_sandbox): New variable declaration.
+	* main.c (do_sandbox): Variable definition.
+	(opttab): Add new option --sandbox.
+	(usage): Add to usage message.
+	* builtin.c (do_system): Disallow if sandboxed.
+	* io.c (redirect): Disallow redirections if sandboxed.
+
+Tue Dec 30 22:22:04 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (usage): Change --binary to --characters-as-bytes,
+	per Karl Berry.
+
+Thu Dec 18 05:29:46 2008  Steffen Schuler    <schuler.steffen@googlemail.com>
+
+	* field.c (*_parse_field): Add `sep_arr' argument and fill it.
+	* field.c (do_split): Add handling of fourth argument of awk 
+	builtin	`split'.
+	* field.c (get_field): Extend parse_field by default argument.
+	* awkgram.y (tokentab): Extend `split' entry with fourth argument.
+
+Wed Dec 17 09:54:00 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (do_binary): New variable for new option -b which
+	makes gawk not mess with multibyte strings.
+	(opttab): Add option entry for -b / --binary.
+	(main): If do_binary, set gawk_mb_cur_max to 1.
+
+Sat Oct 27 22:43:50 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (resetup): Add RE_INVALID_INTERVAL_ORD to syntax bits if
+	doing interval expressions.
+
+Thu Oct 25 23:11:10 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (devopen): Add `isdir' pointer argument.
+	* io.c (devopen): Ditto. Adjust logic that checks for directory.
+	Adjust all calls.
+	* main.c (main): Adjust call to devopen.
+
+Sun Oct  3 23:18:44 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (lex): Enabled \s and \S escape sequences.
+	* regcomp.c (peek_token): Ditto.
+
+Tue Aug  3 13:29:53 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (sub_common): Make POSIX 2001 behavior the
+	default for `sub' and `gsub'.
+
+Wed Aug 21 13:39:08 2002  Dean Wakerly  <dean@wakerly.com>
+
+	* main.c (main): Add short option letter 'r' for --re-interval.
+	Mainly for use in #! scripts.
+
+Wed Dec 26 22:03:48 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Nuke /dev/pid etc. special files!
+
+	* awk.h (IOP_IS_INTERNAL, IOP_NO_FREE): Removed. Other defines
+	renumbered.
+	* io.c (iop_open, spec_setup, specfdopen, pidopen, useropen): Removed.
+	(do_input, redirect): Change uses of iop_open() to devopen() +
+	iop_alloc().
+	(iop_close, get_a_record): Remove special handling for IOP_INTERNAL,
+	IOP_NO_FREE.
+	(devopen): Remove comment relating to iop_open.
+	Add fstat check for valid fd for /dev/fd/N.
+
+Sun Nov  4 10:27:58 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h, builtin.c, awkgram.y: Renamed mark/reset to tell/seek.
+	* acconfig.h: Add `#undef SEEK_TELL'.
+	* configure.in: Add `--enable-seektell' configure-time option.
+	* io.c (do_seek, do_tell): renamed from do_reset, do_mark.
+
+Thu Aug 16 12:21:28 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	New feature, undocumented for now, use #define MARK_RESET to
+	to turn it on.  New function  val = mark("/some/file")  to
+	save start position of current record.  Use
+	reset("/some/file", pos) to go back to it.  ONLY works
+	with getline.
+
+	* awk.h (IOBUF): New members save_start and rec_size.
+	(do_mark, do_reset): Add declarations.
+	* awkgram.y (tokentab): Add entries for mark and reset.
+	* io.c (specsetup): Initialize save_start and rec_size.
+	(iop_alloc): Ditto.
+	(do_getline): Update them as appropriate.
+	(do_mark, do_reset): New functions.
+
+Fri Sep 17 12:42:42 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c (btowc): Changed to use mbrtowc.
+
+Wed Sep 15 08:26:55 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Further sync with GNU grep.
+
+Tue Sep 14 09:53:55 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (str2wstr): Per advice from Ulrich Drepper, when converting,
+	if the current byte is isprint, isgraph, iscntrl or zero, then it
+	can't start a multibyte character. This can save many calls to
+	`mbrtowcs', and speed up the conversion considerably.
+
+Mon Sep 13 11:19:21 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Sync with GNU grep.
+	* re.c (dfawarn): New routine for use by dfa.
+
+Sun Sep 12 22:17:02 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (tree_eval): Fix comment on for ... delete array loop.
+	(pp_string_fp): Get escapes right on regex constant.
+
+Sun Sep  5 20:38:42 2010  John E. Haque <j.eh@mchsi.com>
+
+	* re.c (str2wstr): Decrement src_count when skipping bad bytes.
+
+Fri Aug 27 13:51:13 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Sync with current GNU grep - minor edits only.
+
+Fri Aug 20 16:26:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (tree_eval): Always parenthesize Node_cond_exp.
+	May add a few extra parens but guarantees the right semantics.
+	Thanks to Hermann Peifer <peifer@gmx.eu> for the bug report.
+
+Thu Aug 19 21:35:13 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex_internal.c (re_string_reconstruct): Move ifdef out to cover
+	variable declarations, to avoid "unused variable" warnings.
+	* regexec.c (check_arrival_add_next_nodes): Bracket declaration of
+	`err' with ifdef for the same reason.
+
+	Thanks to avarab@gmail.com for the suggestions.
+
+Wed Aug 18 22:13:30 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (AUTOMAKE_OPTIONS): Added. Other minor cleanups.
+
+Tue Aug 17 23:27:43 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (pp_string_fp): Use different sets of escape characters
+	if printing a string or a regex, based on delimiter. Thanks to
+	Hermann Peifer <peifer@gmx.eu> for the bug report.
+
+Sun Aug  8 23:05:09 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (make_regexp): Don't allocate rp->dfareg unless
+	we're using dfa; causes a memory leak otherwise. Thanks to
+	Antonio Columbo for reporting the bug.
+
+Wed Jul 14 23:04:30 2010  Eli Zaretskii      <eliz@gnu.org>
+
+	* dfa.c: Include langinfo.h only if HAVE_LANGINFO_CODESET is
+	defined.
+
+Wed Jul 14 23:00:19 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Allow a backslash before CR-LF to also
+	work for line continuation, for MS-DOS style source files.
+	Thanks to (Vincent Belaiche) for pointing this out.
+
+Wed Jul 14 22:31:53 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (str2wstr): Keep going if get a bad multibyte sequence.
+	Allows match to give correct answers for RSTART, RLENGTH.
+	Add a lint warning. Correctly set the length of the string
+	based on pointer subtraction.
+
+Wed Jun 16 21:52:09 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (exec_count): Moved into NODE structure as standalone
+	element since count on `/pat/ { ... }' was wrong. Thanks to
+	Hermann Peifer <peifer@gmx.eu> for the bug report.
+
+	Note to self: DO NOT propogate this to the byte-code version.
+
+	Unrelated:
+
+	* awkgram.y (matchop): Made left associative to match behavior
+	of other awks.
+	(print_expression_list): Simplified so that something like
+	`print ("a", "b") in B in A' will work. Again, to match what
+	other awks do.
+
+Fri Jun  4 15:56:59 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Further merges with GNU grep.
+
+Thu May 20 22:20:32 2010  Stepan Kasal       <skasal@redhat.com>
+
+	* Makefile.am [AUTOMAKE_OPTIONS]: Removed, contents now in ...
+	* configure.ac [AM_INIT_AUTOMAKE]: ... here.
+	Added dist-xz while I'm at it, per Karl Berry.
+
+Tue May 18 14:52:04 2010  Marcin Szewczyk    <Marcin.Szewczyk@wodny.org>
+
+	* builtin.c (format_tree): Simplify code in pr_tail when multibyte
+	and %s or %d.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Fri Apr 30 11:37:54 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Remove check for libsnprintf.
+
+Tue Apr 27 22:23:26 2010  Andreas Schwab  <schwab@linux-m68k.org>
+
+	* builtin.c (do_mktime): Make lint check more sane.
+	Fix overflow check.  Removes GCC warning that Arnold
+	incorrectly didn't like.
+
+Mon Apr 26 20:16:07 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ltmain.sh: Removed.
+	* builtin.c (do_mktime): Restored old code to match the
+	documentation. We now have a warning that we just have to
+	live with. Sigh. Stupid GCC. Added a lint warning though.
+	(format_tree): More code so that %'d acts like %d on systems
+	without <locale.h>.
+	* main.c (main): Add `&& #if defined(HAVE_LOCALE_H)' for
+	call to setlocale.
+
+Wed Apr 21 23:35:43 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: Change quoting of -Dargs so that even tcsh
+	users will be happy.
+	* regex_internal.c (MAX): Add `#undef MAX', just in case.
+	* configure.ac: Don't look for libsigsegv on OSF/1, gives
+	us severe headaches.
+
+Tue Apr 20 12:01:01 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Sync with GNU grep. The long-standing x{0} bug
+	is now gone.  Matching UTF-8 with "." is now much faster.
+	* re.c (avoid_dfa): Remove call to dfabroken() which is now gone.
+	* builtin.c (do_mktime): Simplify check of values passed in to be
+	more readable and to avoid a weird compiler warning from GCC.
+
+Fri Apr 16 15:02:26 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (assoc_lookup): Add cast in error message to turn
+	off compiler warning.
+	* dfa.c (is_blank): New function. Use it everywhere instead of
+	ctype.h `isblank' macro which isn't available universally.
+
+Tue Apr 13 22:36:31 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c, awkgram.y, builtin.c, dfa.c, eval.c, ext.c, main.c,
+	node.c, re.c: Remove old ISxxx and TOxxx macros in favor of
+	standard versions.  ``We're two wild and crazy guys!''
+
+Tue Apr 13 22:07:18 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getopt.c, getopt.h, getopt1.c, getopt_int.h, regcomp.c, regex.c,
+	regex.h, regex_internal.c, regex_internal.h, regexec.c: Sync with
+	glibc. What the heck.
+
+Thu Apr  8 21:33:09 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: All leading indentation is now spaces only. Yet
+	another sync with grep.
+
+Thu Apr  8 20:45:25 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Move dfa internals into dfa.c and sync with grep. Avoids VMS and
+	z/OS compile problems in order to avoid cygwin issue when used
+	with ligsigsegv.  ("Portability?  We don't need no stinkin'
+	portability!")
+
+	* dfa.h: Move all the internals into dfa.c.
+	(dfaalloc, dfamusts, dfabroken): Add declarations.
+	* dfa.c: Accept all the internals.
+	(dfaalloc, dfamusts, dfabroken): New functions.
+	* awk.h (Regexp): Use a `struct dfa *'.
+	* re.c (make_regexp): Call dfaalloc. Adjust uses of dfareg
+	in other routines.
+	(refree): Free the dfa struct too.
+
+Tue Apr  6 23:06:55 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Further sync with GNU grep for enum change
+	and other misc changes.
+
+Tue Apr  6 20:13:45 2010  Michal Jaegermann  <michal@harddata.com>
+
+	* main.c: Wrap declarations and bodies of `catchsegv' and
+	`catchstackoverflow' in #ifdef HAVE_LIBSIGSEGV to avoid
+	"not used" warnings.
+
+Tue Apr  6 20:11:47 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.h: Move definition of token enum to dfa.c to avoid conflict
+	with Windows WCHAR introduced by libsigsegv. Thanks to Corinna
+	Vinschen.
+	* dfa.c: Enum body here.
+	(in_coll_range): z/OS fix: Initialize array to all zeros and assign
+	values instead of putting them into the initializer. Thanks to Dave
+	Pitts for reporting the problem.
+
+Fri Apr  2 12:32:40 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Sync with grep 2.6.3.
+
+Wed Mar 31 15:50:34 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (dfaexec): Move decl of `saved_end' up to top of function.
+	Fixes compilation on C89 compilers.
+
+Mon Mar 29 08:40:29 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Remove local copy of libsigsegv. Use an external copy if available.
+
+	* Makefile.am: Remove SEGVSUBDIR and SEGVINCLUDE.
+	* configure.ac: Remove previous code that handled the library and use
+	gl_LIBSIGSEGV library.
+	* custom.h: Remove code for HAVE_SIGSEGV_H.
+	* main.c: Move to HAVE_LIBSIGSEGV.
+	* libsigegv/ : Removed.
+
+Mon Mar 29 05:41:35 2010  Corinna Vinschen  <vinschen@redhat.com>
+
+	* dfa.c: Include hard-locale.h after xalloc.h because it needs
+	xmalloc.
+	* hard-locale.h (xmalloc): Remove declaration.
+	(hard_locale): Cast xmalloc to correct target type.
+
+Mon Mar 29 05:38:47 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c: (two_way_open): In counting down retries, test for > 0
+	instead of >= 0 since retries is unsigned. Thanks to Pat Rankin
+	for noticing.
+	* configure.ac: Remove use of -export-dynamic on cygwin.
+
+Thu Mar 25 21:48:13 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Sync to grep 2.6.1.  That's probably enough for now.
+
+Wed Mar 24 19:48:01 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: More sync with grep.
+
+Tue Mar 23 19:42:48 2010  Jeff Chua	     <jeff.chua.linux@gmail.com>
+
+	* io.c (two_way_open):  Bug fix in management of timeout value.
+
+Tue Mar 23 19:40:04 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Synced with released grep 2.6.  Oh Frabjous Day!
+	Callou! Callay!
+
+Mon Mar 22 22:49:44 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.c: Regenerated using bison 2.4.2.
+
+Fri Mar 19 10:19:20 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Minor edits for compat with grep.
+
+Fri Mar 19 09:19:56 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (two_way_open): Cleanup new code for socket opens.
+	* replace.c: Include missing_d/usleep.c based HAVE_USLEEP.
+	* configure.ac: Add usleep to list of functions to look for.
+
+Thu Mar 18 23:30:33 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Imported from GNU grep and merged. Passes "make test".
+	* xalloc.h: New file, needed by dfa.c.
+	* Makefile.am (base_sources ): Added xalloc.h.
+
+Thu Mar 18 07:29:45 2010  Jeff Chua	     <jeff.chua.linux@gmail.com>
+
+	* io.c (two_way_open):  Make failure to open a socket a non-fatal error.
+	Allow the amount of time to sleep during socket retries to come from an
+	undocumented env variable giving time in milliseconds.
+
+Mon Mar  8 20:58:05 2010  Paolo Bonzini      <bonzini@gnu.org>
+
+	More fixes from GNU grep.
+
+	* dfa.c (dfaexec): Remove register keywords.
+	(FETCH): Use do..while(0) idiom.
+	(parse_bracket_exp_mb): Return MBCSET.
+	(in_coll_range): New.
+	(lex): Assign return value of parse_bracket_exp_mb to lasttok,
+	return it.  Use in_coll_range instead of regcomp/regexec.
+
+Mon Mar  8 20:36:35 2010  Jim Meyering       <jim@meyering.net>
+
+	Fixes from GNU grep development version:
+
+	build: avoid shadowing warnings
+	* dfa.c (match_mb_charset): Rename parameter: s/index/idx/.
+	(check_matching_with_multibyte_ops, match_anychar): Likewise.
+
+	build: avoid shadowing warning for unused "rs"
+	* dfa.c (transit_state): Remove dead stores;
+	Ignore transit_state_consume_1char return value.
+
+	syntax: remove trailing blanks
+	* dfa.c: Remove trailing blanks, to ease synchronization with grep.
+
+	clean-up: limit visibility of an internal function
+	* dfa.c (match_mb_charset): Declare static.
+
+	build: rename local to avoid shadowing global, dfa
+	* dfa.c (dfamust): Rename parameter: s/dfa/d/.
+
+Thu Feb 18 22:44:01 2010  Arnold D. Robbins  <arnold@skeeve.com>0
+
+	* eval.c (push_args): Clear the stack to NULL pointers after mallocing
+	it. Fixes yesterday's problem when called from a rule.
+	See test/fcall_exit2.awk.  Thanks to Seb <sbb@tuxfamily.org>.
+
+Wed Feb 17 23:19:32 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (pop_fcall): Check that argument on stack is not NULL before
+	attempting to clear it; add comment explaining it.
+	(push_args): Set nodes to zero for argument to make sure that values
+	are NULL for testing later in pop_fcall. See test/fcall_exit.awk.
+	Thanks to Seb <sbb@tuxfamily.org>.
+
+Sun Jan 31 22:46:49 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (prec_level): Add Node_regex to the switch so that
+	`! /xxx/' works.  Thanks to Hermann Peifer <peifer@gmx.eu> for
+	reporting the bug.
+
+Thu Jan 28 17:40:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure, Makefile.am: Updated to Autoconf 2.65 and Automake 1.11.1,
+	libsigsegv 2.8.
+
+Thu Jan 21 23:24:56 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (pprint): Separate out code for Node_switch_body and only
+	print the lnode; avoids printing the default case twice. Thanks to
+	Hermann Peifer <peifer@gmx.eu> for reporting the bug.
+
+Sun Jan  3 21:03:01 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Added casts as needed to silence warnings about
+	signedness of pointers from GCC 4.x.
+
+Fri Jan  1 11:41:50 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): At pr_tail, remember to take the precision
+	into account when determining how many characters to copy out.
+	Thanks to tczy <cy@wre.ath.cx> for the bug report.
+
+Tue Dec  8 12:29:30 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac, awk.h: Remove use of <signum.h> header file.
+
+Mon Dec  7 15:25:02 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (format_val):  Use <= and >= in the comparisons with
+	LONG_xxx instead of < and > so that things work correctly on systems
+	with 64 bit integers.  Thanks to Stephen Davies for pointing out
+	the problem.
+
+Sat Nov 21 23:14:59 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): If there is not an actual thousands
+	separator character, don't let `quote_flag' have an effect. Fixes
+	test failure on Solaris 10, which bizarrely says to use the
+	thousands separator character every three digits, but then doesn't
+	actually supply one. Thanks to Nelson Beebe for the initial
+	report.
+
+Mon Nov 16 22:27:44 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (getnode): If MPROF wrap body in parentheses; remove
+	incorrect trailing semicolon.
+	* bisonfix.awk: Convert "y.tab.c" to "awkgram.c" for those rare
+	instances where we need to use a debugger on the parser so
+	that gdb will find the right source file.
+
+2009-10-26  Andreas Schwab  <schwab@linux-m68k.org>
+
+	* io.c (iop_open): Set errno when rejecting a directory.
+
+Tue Oct 20 22:48:14 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (constant_fold): Fix check for two strings to look
+	at `right->flags'. Fix division code to check for division by
+	zero first. Thanks to Stephen Davies <scldad@sdc.com.au>
+	for both.
+
+Fri Oct 16 08:41:29 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (redirect): Do the close-on-exec setting before
+	attempt to get a FILE *. Thanks to Andreas Schwab.
+
+Wed Oct 14 23:25:47 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (redirect): When opening a file, set the close-on-exec flag.
+	Thanks to Chris Pearson <kermit4@gmail.com> for the bug report.
+
+Tue Oct  6 21:07:23 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (main): When an option requires an argument and we print a
+	message, call `usage' and exit.
+
+	Fix all calls to `usage' to use EXIT_FAILURE and EXIT_SUCCESS
+	instead of 1 and 0.
+
+Sun Oct  4 21:46:11 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (main): Don't reset argv[0] to myname. In call
+	to `init_args', pass argv[0] if do_posix. Based on
+	Fedora bug report.
+
+Sun Oct  4 18:45:06 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (assoc_lookup): In lint warning, don't clobber
+	the character at the end of the subscript; instead use the
+	length to limit the number of characters printed. Thanks to
+	Nick Hobson <nick.hobson@yahoo.com>.
+
+Sun Aug 30 22:40:12 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_length): Handle the case where Node_var_new
+	was passed in as a parameter via a function call parameter.
+	Thanks to Greg Johnson <gregfjohnson@yahoo.com> for reporting
+	the bug.
+
+Tue Aug 11 19:23:51 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (parenthesize_expr): New function.
+	(tree_eval): Use it for Node_and and Node_or. Thanks to
+	Hermann Peifer <peifer@gmx.eu> for reporting the bug.
+
+Tue Aug  4 06:04:23 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): zero_flag does not apply to
+	%c and %s conversions. Thanks to Mike Brennan and Thomas Dickey
+	for the bug report.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Fri Jul 17 08:35:10 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.c: Rebuilt with current Bison (2.4.1).
+
+Thu Jul  9 22:55:17 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* (NEWS README array.c awk.h awkgram.y builtin.c configure 
+	configure.ac custom.h dfa.c ext.c field.c floatcomp.c io.c
+	main.c node.c profile.c re.c replace.c): Update copyrights
+	and other prep for a release.
+
+Thu Jul  9 22:20:04 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (init_locale): New function to make a deep copy of the
+	struct lconv. Thanks to KIMURA Koichi <kimura.koichi@canon.co.jp>
+	for the info.
+	* eval.c (r_tree_eval): Further improve Node_assign_concat code to
+	temporarily to keep reference counts correct and to get the
+	desired behavior.
+
+Mon Jul  6 20:29:12 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* floatmagic.h: Remove @ signs copied from Texinfo.
+	It would help if I were more awake.
+
+Sat Jul  4 21:55:18 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (base_sources): Add floatmagic.h so it'll
+	go into the tar ball.
+
+Fri Jul  3 13:47:36 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (is_scalar): Add Node_func_call to list.
+	(pp_concat): Make logic smarter for tree created by Node_assign_concat.
+
+Fri Jul  3 13:01:49 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (optimize_concat): New function that applies
+	Node_assign_concat more generally.
+	* eval.c (r_tree_eval): Improve Node_assign_concat code to temporarily
+	increase the stref on `l' to avoid side effects during evaluation of
+	`r'. This makes test/nasty.awk work. Ouch.
+
+Tue Jun 30 22:10:37 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* floatmagic.h: New file.
+	* builtin.c (format_tree): Use functions defined in floatmagic.h.
+
+Tue Jun 30 21:57:47 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac, Makefile.am: Add new --disable-libsigsegv command line
+	option to configure.
+	(LIBSIGSEGV, SEGVINCLUDE, SEGVSUBDIR): New variables that will be empty
+	if libsigsegv is disabled so nothing will happen, and that will have the
+	right values otherwise. They are then substituted into the Makefile.
+
+Wed Jun 24 23:00:10 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* bootstrap.sh: Revised. Now works again. We think. (CVS-only file)
+
+Wed Jun 24 21:57:30 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* custom.h: Move z/OS EXIT_FAILURE definition from here to ...
+	* awk.h: Here. Define at end after regular definition.
+
+Thu Jun 18 06:17:38 2009  Scott Deifik  <scottd@amgen.com>
+
+	* awk.h: Don't define HAVE_SIGSEGV_H for DJGPP.
+
+Thu Jun 18 05:38:42 2009  Dave Pitts         <dpitts@cozx.com>
+
+	* custom.h: Changes needed for z/OS.
+
+Wed Jun 10 08:22:53 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (parse_escape): Add a lint warning if \x.. has more than two
+	hex digits.
+
+2009-06-08  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.17.
+
+Mon Jun  8 22:13:49 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Update to Autoconf 2.63, Automake 1.11, Libtool 2.2.6a
+
+	* ltmain.sh: New file.
+	* configure.ac: Changes to keep infrastructure tools happy.
+	* alocal.m4, configure: Regenerated.
+	* Makefile.in, */Makefile.in: Regenerated.
+
+Mon Jun  8 07:43:25 2009  John DuBois        <spcecdt@armory.com>
+
+	* builtin.c (mbc_byte_count, mbc_char_count): Make sure all declarations
+	come before executable code, for older compilers.
+	* dfa.c (insert): Ditto.
+	* io.c (devoopen): Ditto.
+
+Thu May 21 21:11:44 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Add simple constant folding.
+
+	* awk.h (do_optimize): New declaration.
+	(calc_exp): Add declaration.
+	* eval.c (calc_exp): Make non-static.
+	* main.c (do_optimize): New variable.
+	(opttab): Add new entry for --optimize.
+	(main): Add 'O' to optlist and code for argument parsing.
+	(usage): Update for new option.
+	* awkgram.y (Node_concat, Node_exp, Node_times, Node_quotient, Node_mod,
+	Node_plus, Node_minus): Call `constant_fold' to create the node in
+	the tree.
+	(constant_fold): New function.
+
+Fri May 15 16:02:01 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (getnode): For MPROF: Fix a typo.
+
+Fri May 15 14:10:44 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Function arguments cannot be reserved variable names, per POSIX.
+
+	* main.c (struct varinit): Add flags member.
+	(varinit): Add values for flags member (one or both of NON_STANDARD
+	or NO_INSTALL). Add entries for the rest of the gawk variables and
+	sort them, so that the table can be searched by ...
+	(is_std_var): New routine to see if a name is a standard variable.
+	* awk.h (is_std_var): Add declaration.
+	* awkgram.y (func_install): Use new routine and issue error.
+
+Wed Apr 22 07:42:05 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (sub_common): In code for handling \<dig> replacements,
+	first make sure that <dig> is within the range of parentheses sets
+	given, and then make sure that the subpattern start is not -1, meaning
+	that something actually matched. Thanks to  Martin Olsson
+	<mnemo@minimum.se> for the bug report.
+	(do_length): Add a lint warning if `length' is passed an untyped
+	argument.
+
+Thu Apr 16 22:59:32 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (func_call): Save nloops_active; if after function returns
+	the actual nloops_active is greater than the saved value, it means
+	there was a return inside the loop body, so pop off the necessary
+	number of loops.  Bug reported by Aleksey Cheusov <a.cheusov@gmail.com>.
+	Gawk was not leaking memory - that is, things were still pointed
+	to, but memory use could keep on growing.
+
+Fri Mar 27 10:59:11 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): Add lint warnings for fieldwidth and/or
+	precision in %%, and add lint warning for unknown format specifier
+	(e.g. %b). Thanks to "joanes.polus" <joanes.polus@laposte.net> for
+	the report.
+
+Wed Mar 18 18:15:41 2009	Pat Rankin	<rankin@pactechdata.com>
+
+	* awk.h (EXIT_SUCCESS, EXIT_FAILURE): Move VMS-specific values
+	to vms/vms-conf.h.
+	(EXIT_FATAL): Define here instead of in msg.c.
+	* msg.c (EXIT_FATAL): Move definition to awk.h.
+
+Mon Mar 16 18:58:09 2009	Pat Rankin	<rankin@pactechdata.com>
+
+	* main.c [#if HAVE_SIGSEGV_H]: For the #else case (VMS),
+	(stackoverflow_context_t): Dummy typedef for use in prototypes;
+	(stackoverflow_install_handler): Make macro expand to 0 rather
+	than nothing so that (void) cast on invocation of it works.
+
+	* main.c (catchstackoverflow): Don't return 0 from void function.
+
+Wed Feb 25 21:34:14 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (tokentab): Have only one copy of BEGIN / END.
+	(tokcompare): New function.
+	(check_special): Sort tokentab for EBCDIC systems.
+
+Sun Feb 15 22:39:30 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (pp_delete): Print tree->exec_count to actually get
+	the value printed. Thanks to Hermann Peifer <peifer@gmx.eu>
+	for reporting the bug.
+
+Thu Feb 12 21:54:34 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y: Change to use EXIT_FAILURE.
+	* msg.c [EXIT_FATAL]: New macro.
+	* msg.c (r_fatal): Change to use EXIT_FATAL.
+	Thanks to Pat Rankin for pointing these out.
+	* re.c (reflags2str): Account for RE_SYNTAX_EMACS.
+	* awk.h: If not VMS, define HAVE_SIGSEGV_H.
+	* main.c: Check HAVE_SIGSEGV_H before including <sigsegv.h>. If not
+	there, define dummy macros.
+	(catchsegv, catchstackoverflow): Remove unneeded comment. Add return 0
+	for compilers that care.
+
+Mon Feb  9 05:24:52 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h [CONST]: Renamed CONSTANT to avoid conflict with libsigsegv
+	on Windows.
+	* awkgram.y, field.c, re.c: Update all uses.
+
+Tue Feb  3 22:46:59 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (do_close): Wrap updating of ERRNO in check for not
+	do_traditional.
+
+Sat Jan 31 23:14:00 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): For '%s', don't count the multibyte
+	characters if we are just copying all the characters. Gives
+	big speedup. Thanks to Hirofumi Saito <hi_saito@yk.rim.or.jp>
+	for reporting the problem.
+
+Thu Jan 29 21:14:30 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (parse_field, re_parse_field, def_parse_field,
+	posix_def_parse_field, null_parse_field, sc_parse_field,
+	fw_parse_field): Add new last arg `in_middle'.  Ignored by all
+	except re_parse_field.
+	(re_parse_field): Enhance logic to only allow ^ in a regex to match
+	if indeed at the beginning of a record.
+	(getfield): Adjust call to parse_field.
+
+Tue Jan 27 21:42:47 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Changes suggested by Toni Schilling <Schilling@equicon.de>,
+	as modified by feedback from Pat Rankin, and some help
+	from me.
+
+	* awk.h [WEXITSTATUS]: Improve definition for MSC and VMS.
+	[EXIT_SUCCESS, EXIT_FAILURE]: Define if they aren't.
+	* io.c, main.c, profile.c: Switch to using EXIT_xxx instead of
+	0 and 1.
+	(main): Use constants instead of 0/1 for exit_val variable.
+	* eval.c (interpret): Map exit value from `exit' statement into
+	success / fail constants for VMS for exit_val variable.
+
+Tue Jan 20 07:35:34 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex.h: Define __USE_GNU if not _LIBC; needed for non-GLIBC
+	systems such as, oh say, Mac OS X.
+
+Tue Jan 13 09:23:40 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex.c, regex_internal.h: Remove some changes that are no
+	longer needed after sync with GLIBC.
+
+Mon Jan 12 22:27:10 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Bi-annual sync with GLIBC.
+
+	* regexec.c, regex.h, regex_internal.c, regcomp.c, regex_internal.h,
+	regex.c: Reapply any portability patches specific to gawk.
+	* getopt.c: Sync with GLIBC.
+
+	Base versions:
+		getopt.c		1.57	Thu Jan  8 20:02:05 2009		
+		getopt.h		1.21	Fri Mar 19 00:19:32 2004		
+		getopt1.c		1.10	Tue Mar  9 10:35:37 2004		
+		getopt_int.h		1.1	Tue Mar  9 10:31:19 2004		
+		regex.c			1.129	Tue Sep  6 20:49:44 2005		
+		regexec.c		1.99	Thu Jan  8 20:02:06 2009		
+		regexec.c		1.99	Thu Jan  8 20:02:06 2009		
+		regex.h			1.43	Wed Jan 16 10:09:47 2008		
+		regex_internal.c	1.69	Thu Jan  8 20:02:06 2009		
+		regex_internal.h	1.76	Thu Jan  8 20:02:06 2009		
+		regcomp.c		1.120	Thu Jan  8 20:02:06 2009		
+
+Mon Jan  5 23:07:58 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (devopen): Add a retry to calls to socketopen. Tunable
+	via undocumented GAWK_SOCK_RETRIES environment variable. Based
+	on code from Juergen Kahrs <Juergen.Kahrs@vr-web.de> after a
+	suggestion from Hermann Peifer <peifer@gmx.eu>.
+
+Mon Jan  5 22:48:39 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (redirect): A getline from a directory is no longer
+	fatal; instead it returns -1. Thanks to Paolo <oopla@users.sf.net>
+	for the report.
+
+Mon Dec 29 22:04:57 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): Case for 's', improve logic for setting
+	the number of characters to copy, also at pr_tail. Based on
+	bug report by Hermann Peifer <peifer@gmx.net>.
+
+Thu Dec 11 21:23:50 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_length): If the wide string has zero length
+	but the bytes are more than zero, use the number of bytes.
+	(do_index): Similar also: fall back to byte count if the
+	bytes don't make a wide-character string.
+	Bug reported by "Carlos G." <charlie.brown.uy@gmail.com>
+
+	(do_substr): If defaulting to length of rest of the string,
+	do it based on the wide char string if it's valid.
+
+Fri Dec  5 11:12:11 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (free_rp): New function.
+	(redirect): Improved logic for yesterday's change, including
+	use of free_rp.
+	(close_redir): Use free_rp.
+
+Thu Dec  4 22:35:05 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (redirect): Only put the new struct redirect into
+	the list if the file or pipe could actually be opened. Fixes
+	a bug with the wrong return value of close, noticed by
+	Seb <sbb@tuxfamily.org>.
+	* dfa.c (parse_bracket_exp_mb): Don't zero out work_mbc->chars
+	after we malloc'ed it. Fixes a leak found by valgrind when
+	using UTF-8.  (Hmmm. This got fixed in January 2007; It seems
+	to have crept back into the code in the August 2007 merge with
+	GNU grep. Sigh.)
+
+Mon Oct 20 11:47:59 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Add -g3 and -gdwarf-2 to CFLAGS if compiling with
+	GCC and doing development. Should have done this ages ago.
+
+Sun Aug 31 22:03:55 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (set_BINMODE): Tighten up the code even more so
+	that it matches the documentation.
+
+Mon Aug 25 22:41:47 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (set_BINMODE): Tighten up the code to only allow
+	certain reasonable values when setting BINMODE.
+
+Fri Aug 22 14:43:49 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (nextfile): Users Strong In The Ways Of The Source can use
+	non-existant files on the command line without it being a fatal error.
+
+Wed Jul 30 23:10:51 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (research): Don't ever use DFA if need_start. It can
+	break on some weird cases.  Reported by
+	"T. X. G." <leopardie333@yahoo.com>.
+
+Wed Jul 30 22:27:20 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_match): Add MAYBE_NUM flag to elements of array
+	created by `match' since data could come from user. Similar
+	semantics to `split'. Thanks to Dr. Dirk Zimoch <dirk.zimoch@psi.ch>
+	for reporting the bug.
+
+Tue Jun 24 07:44:06 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (insert): Reworked for significant speed improvement
+	by Johan Walles <johan.walles@gmail.com>. Imported from grep
+	bug list.
+	* profile.c (tree_eval): Do a return after all the built-in
+	variables instead of a break. Thanks again to Hermann Peifer
+	<peifer@gmx.eu> for finding the problem.
+
+Sun Jun 22 23:08:14 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (format_val): Restore old code to use %ld when the value
+	is within the range of a long; improves performance noticably for
+	applications that convert integers to strings.  Use %.0f only for
+	integral values that are outside the range of a long. Thanks to
+	Hermann Peifer <peifer@gmx.eu> for pointing out the existence
+	of a problem.
+
+Fri May 23 12:08:24 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (epsclosure): Change type of `visited' from int to char for
+	potential speedup. Based on bug report to bug-grep list from
+	Johan Walles <johan.walles@gmail.com>.
+
+Wed May 14 05:55:48 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): For `%c' case, add a lint warning
+	if the value is greater than 255.
+	(mbc_byte_count, mbc_char_count): Remove unused variable `i'.
+
+Thu Apr 24 20:31:03 2008  Bruno Haible       <bruno@clisp.org>
+
+	* main.c (main): Move call to catch SIGBUS to before installation of
+	libsigsegv handler, since on some systems libsigsegv installs its
+	own handler for SIGBUS.
+	[STACK_SIZE]: Add a constant instead of inline. ADR.
+
+Wed Apr 23 22:30:27 2008  Duncan Moore       <duncan.m00re@btinternet.com>
+
+	* builtin.c (state): Do as an integer array for systems that need it.
+	(do_rand, init_rand): Modify call to `initstate' as needed.
+
+Wed Apr 23 22:22:06 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (prednames): Add an extra zero to final initializer to
+	silence a compiler warning. Reported by Duncan Moore
+	<duncan.m00re@btinternet.com>.
+
+Wed Apr 23 21:36:06 2008  Steffen Schuler    <schuler.steffen@googlemail.com>
+
+	* field.c (fw_parse_field): Add code for multibyte case.
+
+Sat Mar 15 22:17:21 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_length): Handle the case of the parameter being
+	an array that was a function parameter.
+
+Tue Mar 11 22:49:11 2008  Kimura Koichi      <kimura.koichi@canon.co.jp>
+
+	* builtin.c (format_tree): Fix call to mbc_byte_count to pass the
+	right number of characters based on the format type.
+
+Tue Mar 11 22:31:58 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* libsigsegv: Incorporated into the dist.
+	* Makefile.am (SUBDIRS): Added. Make it first so that the library
+	is built before gawk is.
+	(LDADD): Add the library.
+	(AM_CPPFLAGS): Add -I option to find <sigsegv.h> header.
+	* configure.ac: Add call to AC_CONFIG_SUBDIRS for libsigsegv.
+	* main.c (catchsegv, catchstackoverflow): New functions.
+	(main): Call into sigsegv library with them.
+
+Tue Mar  4 21:02:25 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (mbc_char_count, mbc_byte_count): New functions to return
+	the number of m.b. chars there are and the number of bytes needed to
+	copy them.
+	(format_tree): Use them for %s and %c cases to adjust precision and
+	for copying characters at pr_tail label.
+
+Thu Feb 14 14:05:01 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (init_args): Adjust type of third arg to remove warning from
+	GCC 4.2, add cast in call to make_string.  Bleah.
+
+Fri Jan 25 12:13:39 2008  Dave Pitts         <dpitts@cozx.com>
+
+	* README_d/README.zos: New file.
+	* Makefile.am: Add sed on y.tab.c to convert older Bison "parse error"
+	messages to "syntax error" messages.
+	* configure.ac: Added ZOS_USS changes.
+	* m4/arch.m4: Added ZOS_USS changes.
+	* m4/inttypes_h.m4: Added ZOS_USS changes.
+	* m4/inttypes.m4: Added ZOS_USS changes.
+	* m4/stdint_h.m4: Added ZOS_USS changes.
+	* awkgram.y: Added USE_EBCDIC changes for EBCDIC collating sequence.
+	* awk.h: Added ZOS_USS compile changes.
+	* eval.c: Added EBCDIC casetable and ZOS_USS changes.
+	* regcomp.c: Added btowc function for ZOS_USS.
+	* regex.h: Changed __string to __cstring to avoid ZOS_USS header usage.
+	* regex_internal.h: Added ZOS_USS changes and type defines.
+
+Sun Jan 13 08:16:38 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (epsclosure): Replace MALLOC + zero-out-loop with CALLOC for
+	large potential speedup, based on bug report to bug-grep list from
+	Johan Walles <johan.walles@gmail.com>.
+	(dfaanalyze): Made a similar change.
+
+Fri Dec 21 11:22:16 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (pprint): Add a missing `#ifdef PROFILING'.
+
+Thu Dec 13 22:19:19 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (parenthesize): Remove "!" from output string.
+	(tree_eval): Fix quotes for delete array case.
+	(pp_var): New function, call it as appropriate everywhere else.
+
+Fri Nov 30 11:11:52 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (socketopen): Use NULL as first argument to `getaddrinfo'
+	if any_remote_host is true. Should help on Non-GLIBC systems.
+
+Thu Nov 15 22:01:36 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (two_way_open): Case for ptys. Change search for letters
+	to avoid ASCII / EBCDIC problems.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Sun Oct 14 23:19:12 2007  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* Makefile.am: Avoid GNU make-specific `make -C'.
+
+Sun Oct 14 19:37:01 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Add check for `atexit', needed by replacement
+	version of `snprintf'.
+
+Sun Sep 30 21:50:59 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Rationalize locale's influence on %'g, strtonum, and input.
+
+	* awk.h (use_lc_numeric): Add declaration.
+	* builtin.c (format_tree): Add check for quote_flag and set
+	LC_NUMERIC so that The Right Thing gets done, then reset it.
+	(do_strtonum): Pass use_lc_numeric as second arg to isnondecimal.
+	* main.c (main): Have do_posix set use_lc_numeric also.
+
+Thu Sep 27 21:36:23 2007  Stepan Kasal       <skasal@redhat.com>
+
+	* configure.ac: Do not instantiate version.c; remove the hack
+	to keep version.c from being removed upon `make distclean'.
+	* Makefile.am (version.c): New rule.
+	(.c.i, SUFFIXES): Remove, `.i' is unused.
+	(MAINTAINERCLEANFILES): Remove awkgram.c; Automake takes care of that.
+
+Wed Sep 26 14:40:13 2007  Eli Zaretskii      <eliz@gnu.org>
+
+	* builtin.c (format_tree): Handle non-standard snprintf that
+	returns a negative value when the buffer is too small.
+
+Tue Sep 25 23:27:41 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ChangeLog: Removed all leading spaces. Fixed up formatting of
+	entries to have capital letter after the colon. Fixed a number of
+	entries to have the '*' in the right place. ASCII instead of ascii.
+	Capitalize Linux. (Is this anal-retentive or what? Sheesh.)
+
+Tue Sep 25 08:24:11 2007  KIMURA Koichi      <kimura.koichi@canon.co.jp>
+
+	* awk.h: Add include of <io.h> for Visual Studio.
+	* regex_internal.h: Do the right thing for replacing alloca.
+
+Sat Sep 22 23:26:27 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (set_FIELDWIDTHS): Restore behavior of 3.1.4 that allowed
+	FIELDWIDTHS to be "" without crashing, and such a value has NF = 0.
+	Yet Another Dark Corner. Thanks to Glenn Zazulia <gnu@t1.zazu.com>
+	for pointing out the problem.
+
+	Unrelated:
+
+	* builtin.c (format_free): Make `quote_flag' not sticky. Thanks to
+	Ulrich Drepper for pointing this out.
+	* main.c (main): Adjust calls to `setlocale' and `localeconv' so that
+	the %'d flag will work even if not using the locale's decimal point.
+
+Thu Sep 20 21:02:41 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (hash, awk_hash, gst_hash_string): Add fourth argument
+	pointer to retrieve code. Only assign a value if not NULL.
+	Fix most places to pass NULL for fourth argument.
+	(assoc_lookup): Save the code in the node for use in growing the
+	array later.
+	(grow_table): Use the saved code instead of recomputing each time.
+	* awk.h (NODE hash): Add `code' member and `ahcode' macro.
+	(hash): Revise declaration.
+	* awkgram.y: Revise calls to `hash'.
+
+Tue Aug 21 17:47:07 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (copyleft): Cite version 3 of the license.
+	* dfa.c: Minor edits to sync with grep 2.5.3.
+
+Sat Aug 11 22:48:11 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* COPYING: Replaced with GPL 3.
+	* All other relevent files: Upgraded to GPL 3.
+
+Fri Aug  3 15:01:38 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* builtin.c (format_tree): Free `obuf' before call to `fatal'
+	to keep valgrind happy.
+
+Mon Jun  4 01:12:21 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* All relevant files: Updated copyright year to 2007.
+
+Mon May 28 08:06:15 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (use_lc_numeric): New variable, true for new
+	option `--use-lc-numeric'.
+	(optab): Add option "use-lc-numeric".
+	(usage): Add to usage message.
+	(main): Allow the --use-lc-numeric option to also use the
+	local decimal point.
+
+Fri May 18 16:26:00 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (_TANDME_SOURCE): Add test for ! _SCO_DS for
+	SCO systems.  Thanks to John DuBois <spcecdt@armory.com>
+
+Tue May 15 13:14:04 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	General capability suggested by Michael May <mmlpz@t-online.de>.
+
+	* configure.ac: New option --disable-directories-fatal. Makes gawk
+	silently skip directories on the command line.
+	* io.c (iop_open): Add fourth parameter, pointer to flag which is set
+	to true if the file is a directory. In this case, close the fd and
+	return NULL.
+	(nextfile): Modify call to iop_open. Add logic to check for directory
+	and skip if --disable-directories-fatal was used. If the configure flag
+	was not used, then if do_traditional also skip.
+	(redirect): Modify call to iop_open and call fatal if isdir is true.
+
+Mon May  7 14:51:54 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* POSIX.STD: Updated.
+
+Wed May  2 19:29:56 2007  Stepan Kasal  <kasal@ucw.cz>
+
+	Revert precedence of concatenation and | getline.
+	From mail dated 2005-10-31.
+
+	* awkgram.y (common_exp): Move the two rules for naked regexp and
+	the rule for "(...) in arr" to ...
+	(non_post_simp_exp): ... here ...
+	(simp_exp): ... and here, respectively. Fixes test/parsefld.awk/.
+	(simp_exp_nc): New nonterminal, needed to fix the
+	precedence of concatenation over "|getline".
+	(common_exp): Can also start with simp_exp_nc.
+
+Tue May  1 19:53:11 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Work around problem with /ab{0}c/.
+	* dfa.h (struct dfa): Add member `broken'.
+	* dfa.c (dfainit): Initialize it to false.
+	(lex): Set it if `minrep == maxrep && minrep == 0'.
+	* re.c (avoid_dfa): Check flag and return TRUE if set.
+
+Tue May  1 05:34:53 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Add calls to AM_LANGINFO_CODESET, and gt_LC_MESSAGES.
+	Thanks to Matthew Burgess <matthew@linuxfromscratch.org>.
+
+Sun Apr 29 22:55:12 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c (utf8_sb_map): Remove const if not __GNUC__ >= 3.
+	* regex_internal.h (re_dfa_t): Bracket bizarre macro call with
+	check for _LIBC.
+	Thanks to Nelson Beebe for finding both problems.
+
+Sun Apr 29 13:10:31 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_strftime): Add optional third argument to strftime()
+	which if non-zero or non-null means to use UTC.
+	* awkgram.y (tokentab): Allow three arguments to strftime.
+
+Fri Apr 27 11:44:27 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* README.cvs, bootstrap.sh: Added to CVS archive, not for
+	inclusion in tarballs.
+
+Fri Apr 20 16:48:30 2007        Pat Rankin      <rankin@pactechdata.com>
+
+	* awk.h: Move inclusion of redirect.h before HAVE_func blocks.
+
+Tue Apr 24 21:55:36 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (research): In the multibyte case, fall back to the full
+	matcher if need_start, since there are bugs in the dfa matcher
+	in some obscure cases.  Sigh.
+	* builtin.c (format_tree): When using %.0f instead of %d, assert
+	that we're not malloc-ing zero.
+
+Tue Apr 17 21:51:40 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Portability fixes for lsbcc from Nelson Beebe.
+
+	* configure.ac: Check for stddef.h header.
+	* regex.h: Use check and include header to get size_t definition.
+	* main.c: Update UPDATE_YEAR, add #ifdef for HAVE_MTRACE.
+
+Tue Apr 17 13:49:13 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Add test for struct sockaddr_storage.
+	* io.c: Add macro to redefine sockaddr_storage as sockaddr.
+
+Tue Apr 17 05:45:19 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (get_a_record): Make it static, to match declaration at the
+	top of the file.  (Thank you GCC for not reporting this. Grr.)
+
+Fri Apr 13 00:29:24 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* replace.c: Only include missing/getaddrinfo.c if HAVE_SOCKETS
+	is defined. Avoids problems on VMS. Thanks to Pat Rankin.
+
+Tue Apr 10 18:53:04 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y, builtin.c, eval.c, ext.c, field.c, io.c,
+	node.c: Added some sanity to the lint warnings, to only
+	print them once if they are syntactic or of the type where
+	they don't need to be repeated. Switch to `short' instead
+	of `int', and in general use a variable named `warned', for
+	consistency.
+
+Sun Apr  8 16:49:28 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y: Add guard code to ifdef out "signed" for VMS. Thanks for
+	the heads-up to Pat Rankin.
+	* regcomp.c (utf8_sb_map, init_dfa): Move non-GCC code to initialize
+	this array into code, to preserve word-size independance.
+	* configure.ac: Add check for <arpa/inet.h>.
+	* io.c: Include <arpa/inet.h> if we have it, instead of keyed off
+	Tandem, needed on some Unix systems.
+	* awk.h, main.c, msg.c, awkgram.y: Move to use of CAN_USE_STDARG_H
+	instead of continuously repeating check for header and defined STDC
+	and STDC. Thanks to Pat Rankin.
+
+Fri Apr  6 15:28:09 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_length): Only print `length(array)' lint warning once.
+	* node.c (dump_wstr): Restore from being ifdef'ed out. Useful in case
+	it needs to be called from a debugger.
+	* regcomp.c (utf8_sb_map): Fix gcc-specific code.
+	* awk.h (snprintf): Add declaration in case not available on the system.
+	(Ceil, Floor): Add macros changing the name for VMS, in an attempt to
+	fix linkage problems.
+	* io.c: Simplify includes for internet headers and for getaddrinfo
+	defines.
+
+Wed Apr  4 23:38:24 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c [AI_ADDRCONFIG]: Add a definition in case it's not available.
+	* main.c (usage): Add comment for translators to add translation
+	bug report address.
+
+Wed Apr  4 18:26:45 2007        Pat Rankin      <rankin@pactechdata.com>
+
+	* regexec.c (build_trtrable): Add missing #if HAVE_ALLOCA.
+
+Thu Mar 29 19:30:20 2007        Pat Rankin      <rankin@pactechdata.com>
+
+	* re.c (make_regexp): Cast casetable to RE_TRANSLATE_TYPE.
+
+Mon Mar 19 12:35:00 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Finish removing references to STRTOD_NOT_C89.
+
+	* awk.h (gawk_strtod): Use now if there is no strtod.
+	* replace.c (strtod.c): Include if there is no strtod.
+	* configure.ac [GAWK_AC_FUNC_STRTOD_C89]: Removed.
+
+Mon Mar 19 12:17:16 2007  Kimura Koichi    <kimura.koichi@canon.co.jp>
+
+	* dfa.c (dfaexec): Add check for half-width katakana characters in
+	character classes in ShiftJIS locale.
+	From mail originally sent Mon, 01 Aug 2005 09:07:55 +0900
+
+Fri Mar  9 11:53:25 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (rebuild_record): Assert that wide string is off when
+	creating new fields. Inspired by Karel Zak.
+
+Fri Mar  9 11:26:01 2007  Matthew Woehlke   <mwoehlke@tibco.com>
+
+	* io.c (get_a_record): Limit the max amount read to SSIZE_MAX. Needed
+	on Tandem systems where this amount is incredibly small.
+
+Tue Mar  6 08:17:49 2007  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* node.c (is_ieee_magic_val): Don't rely on strncasecmp; it mishandles
+	ASCII bytes in some locales.
+	(get_ieee_magic_val): Use strtod if it works, relying on our handbuilt
+	code only if it doesn't work.  This is more likely to do the right
+	thing with strings like "-nan".
+
+Tue Feb 27 20:51:29 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac (AM_PROG_CC_STDC): Removed, per email suggestion
+	from Stepan Kasal some time ago.
+
+Tue Feb 27 20:44:07 2007  Aleksey Cheusov    <vle@gmx.net>
+
+	* awk.h: Revise checks for MEMCPY_ULONG and MEMSET_ULONG
+	for MS Interix using MSVC.
+	* configure.ac (AC_CHECK_FUNCS): Add checks for memcopy_ulong
+	and memset_ulong.
+	From mail dated Tue Aug 30 12:38:39 2005.
+
+Mon Feb 26 12:47:10 2007  Tony Leneis        <tleneis@cvrreg.com>
+
+	* dfa.c (dfacomp): Check that regexp is non-zero in length
+	also. Avoids problems with empty regex and IGNORECASE on
+	systems where `malloc(0)' returns a non-NULL pointer.
+	From mail dated Wed, 26 Oct 2005 15:42:07 -0700.
+
+Wed Feb 21 10:23:12 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* floatcomp.c (Floor, Ceil): Restore correct expression for Cray.
+	Then ifdef out the whole business, since it's likely to be obsolete.
+	Thanks to Paul Eggert.
+
+Mon Feb 19 12:28:47 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (format_val): Simplify code: always format the value
+	ourselves. Use %.0f if the value is integral.
+	* floatcomp.c (dval_out_of_range): Remove function, not needed.
+	(awknum_fraction_bits): Removed.
+	(adjust_uint): New function, defined IFF have uintmax_t.
+	* builtin.c (tmp_integer): Use adjust_uint.
+	Move include of <inttypes.h> and <stdint.h> ...
+	* awk.h: to here.
+	(awknum_fraction_bits): Removed.
+	(adjust_uint): Declare, or define as do-nothing macro.
+
+Sun Feb 18 17:43:33 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c, floatcomp.c: Add include of <math.h> to get
+	correct declarations of math functions.
+	* configure.ac: If doing development, add -DYYDEBUG and also
+	-fno-builtin for GCC.
+
+Wed Feb 14 19:42:08 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Add support for special infinity and NaN values in non-POSIX
+	mode, and in POSIX mode, just call system `strtod'.
+
+	* configure.ac [GAWK_AC_FUNC_STRTOD_C89]: Comment out.
+	* node.c (is_ieee_magic_val, get_ieee_magic_val): New functions.
+	(r_force_number): Adapt logic and use new functions.
+
+Tue Feb 13 13:02:32 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Move Paul's numeric stuff to a separate file to make code cleaner.
+
+	* floatcomp.c (awknum_fraction_bits): New variable.
+	(Floor, Ceil): Functions, moved here from macros in builtin.c.
+	(dval_out_of_range): New function for checking if double is in range
+	of long.
+	(FLT_RADIX, FLT_MANT_DIG, DBL_MANT_DIG, AWKSMALL_MANT_DIG,
+	AWKNUM_MANT_DIG, AWKNUM_FRACTION_BITS): Moved here from awk.h.
+	* awk.h: Add decls of stuff now in floatcomp.c.
+	* Makefile.am[base_sources]: Add floatcomp.c.
+	* builtin.c (tmp_integer): Refer to `awknum_fraction_bits'
+	instead of AWKNUM_FRACTION_BITS.
+	* node.c (format_val): Call `dval_out_of_range' instead of
+	inline coding the test.
+
+2007-02-06  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* node.c (format_val): Fix bug when handling numbers close to
+	LONG_MIN and LONG_MAX.
+	* awk.h (FLT_RADIX, FLT_MANT_DIG, DBL_MANT_DIG, AWKSMALL_MANT_DIG,
+	AWKNUM_MANT_DIG, AWKNUM_FRACTION_BITS): Moved here from builtin.c.
+	* builtin.c: Move those macros to awk.h.
+	* awk.h (DBL_FRACTION_BITS): New macro.
+
+Fri Feb  9 13:40:10 2007  Matthew Woehlke    <mw_triad@users.sourceforge.net>
+
+	More Tandem fixes.
+
+	* configure.ac: Check in Tandem's zrldsrl library for dlopen.
+	* regex_internal.h: Move <alloca.h> include into ifdef.
+	* regexec.c: Bracket alloca uses. Fix GCC use of `?:'.
+
+Fri Feb  9 13:30:15 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* replace.c: Add include of snprintf.c. Ooops!
+	* configure.ac: Add check for mkstemp and tmpfile for replacement
+	snprintf.c.
+
+Tue Feb  6 14:33:51 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (format_val): Restructure a bit to remove need for and
+	use of goto.
+
+Sun Feb  4 16:35:21 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (field_spec, opt_incdec): New terminals.
+	(variable): Change definition of field reference to use field_spec.
+	See test/parse1.awk.
+
+Thu Feb  1 17:38:38 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c: Allow YYDEBUG to enable the `-D' option, not just
+	GAWKDEBUG.
+
+Wed Jan 31 19:30:26 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (format_val): Restore my test for numeric values
+	being representable, as it includes more conditions than
+	Andrew's, pending a thorough review of undealt-with emails on
+	the topic.
+	* regexec.c (proceed_next_node): Move check for NULL to after
+	variable declarations inside initial `if'.
+
+Wed Jan 31 19:25:21 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* configure.ac (getaddrinfo): Improve test, since this function
+	can be in libsocket on some systems.
+
+Mon Jan 29 15:33:10 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* Makefile.am (valgrind): Also call new valgrind-scan target.
+
+Mon Jan 29 12:44:54 2007  Andreas Schwab  <schwab@suse.de>
+
+	* dfa.c (copytoks): Adjust index into multibyte csets when
+	copying an MBCSET token.
+
+Fri Jan 26 20:01:38 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* node.c (format_val): Test whether a numeric value is integral
+	simply by converting it to long and then back again, and checking
+	if the value matches.  That's more robust than trying to test
+	whether the floating-point value is representable as a long.
+	* builtin.c (format_tree): Fix buffer overflow bug, off-by-one errors
+	in checking snprintf return codes, and use "%.0f" to implement "%d"
+	formatting.  For octal or hex formatting, test whether the value
+	is integral by trying to convert back to floating point and seeing
+	if the value matches.  This is more robust than trying to test
+	whether the floating-point value is representable as an integer.
+
+Tue Jan 23 17:49:28 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (socketopen): Initialize socketfd to avoid "may be used
+	uninitialized" warning.
+	* regexec.c (regexec, re_search_stub): Removed unused variable `dfa'.
+	* builtin.c (wide_tolower_toupper): Fix signedness of pointer in
+	allocation calls and in call to make_str_node.
+
+Mon Jan 22 12:57:19 2007  Kimura Koichi    <kimura.koichi@canon.co.jp>
+
+	Deal with halfwidth katakana in SJIS locale inside character ranges.
+	Based on http://sources.redhat.com/bugzilla/show_bug.cgi?id=1149.
+	Changes affect non-__LIBC code only.
+
+	* regcomp.c (re_compile_fastmap_iter): Handle half-size characters.
+	* regexec.c (check_node_accept_bytes): Same.
+
+Thu Jan 18 22:19:01 2007  Karel Zak          <kzak@redhat.com>
+
+	* node.c (free_wstr): Assert that type is Node_val.
+
+Thu Jan 18 12:18:47 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c (re_compile_fastmap_iter): Declare `dfa' to be
+	be volatile. Fixes valgrind problem with the ignrcase test.
+	Sheesh.  Gawk should now be valgrind-clean. We hope.
+
+Mon Jan 15 14:28:04 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Use getaddrinfo instead of gethostbyname, to handle IPV6
+	format addresses. Based on patch submitted by
+	Jan Pazdziora <jpazdziora@redhat.com>.
+
+	* configure.ac: Add getaddrinfo to list of checked functions.
+	* configh.in, configure: Regenerated.
+	* io.c: Rework includes based on HAVE_GETADDRINFO.
+	(socketopen): Reworked for getaddrinfo.
+	(devopen): Modified for new socketopen.
+	* replace.c: Include getaddrinfo.c if necessary.
+
+Sun Jan 14 12:19:53 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y: For bad name in array subscripting, build a
+	valid node anyway to avoid invalid reads reported by valgrind.
+	* dfa.c (parse_bracket_exp_mb): Remove assignment of NULL
+	to work_mbc->chars, was losing data malloc'ed earlier. Thanks
+	to valgrind.
+	(state_index): Alway initialize d->states[i].mbps elements to zero.
+	(dfafree): Free allocated d->states[i].mbps.elems if needed.
+	* regex.c: Try harder to undef alloca.
+	* regex_internal.h (__mempcpy): Undef before redefinining for
+	more recent versions of GLIBC.
+
+Sat Jan 13 22:10:43 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (str2wstr): For count of zero from mbrtowc, set count to 1
+	and fall through to code that copies. Originally from Paul Eggert.
+
+	Unrelated:
+	* configure.ac: Add call to AC_USE_SYSTEM_EXTENSIONS, should help
+	on Tandem. This lets us remove AC_AIX and AC_MINIX.
+
+	From Matthew Woehlke <mwoehlke@tibco.com> for Tandem:
+
+	* awk.h (_TANDEM_SOURCE): Also define _XOPEN_SOURCE_EXTENDED.
+	* io.c (_TANDEM_SOURCE): Include more headers.
+
+Sat Jan 13 21:53:48 2007  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* field.c (set_FIELDWIDTHS): Avoid writing one past the end of
+	the array.
+	* node.c (r_force_number): Avoid reading uninitialized variable.
+
+Sat Jan 13 21:37:15 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (valgrind): New target based on idea from
+	Ralf Wildenhues for running valgrind on test suite.
+
+Sat Jan 13 21:24:54 2007  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de> 
+
+	Enable more `--lint-old' warnings.
+	* awkgram.y: Warning about multiple BEGIN or END rules,
+	`index in array' outside of for loops, multidimensional arrays.
+	* field.c (set_FS): Warn about regex FS.
+	* node.c (parse_escape): Warn about `\b', `\f', `\r'. 
+
+Sat Jan 13 20:56:56 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (wcasestrstr): Revert use of continue, reinstate goto.
+	Thanks to Andrew Schorr.
+	(free_wstr): Move zeroing of wsptr and wslen and clearing of flag
+	back outside the if.
+	* field.c (rebuild_record): In loop that copies fields to new record,
+	add call to `free_wstr'. This ensures that flag values are correct
+	and avoids double free later. Thanks to Karel Zak for pointing out
+	the problem.
+
+Fri Jan 12 14:01:51 2007  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* builtin.c (do_match): In addition to "gawk_mb_cur_max > 1" check,
+	check for positive string length.
+
+Fri Jan 12 13:57:20 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Sync with GLIBC. Bi-annual this time.
+
+	* regexec.c, regex.h, regex_internal.c, regcomp.c:
+	Reapply any portability patches specific to gawk.
+	* regex_internal.h (build_wcs_upper_buffer): Fix return type
+	in declaration. Reapply any portability patches specific to gawk.
+	* regex.c: Add definitions for `bool', `true' and `false'.
+	Define `alloca' to something invalid to keep it from linking
+	in case a usage of `alloca' slipped through. Reapply any portability
+	patches specific to gawk.
+
+	Base versions:
+		getopt1.c	1.10	Tue Mar  9 10:35:37 2004
+		getopt.c	1.55	Fri Mar 24 10:59:56 2006
+		getopt.h	1.21	Fri Mar 19 00:19:32 2004
+		getopt_int.h	1.1	Tue Mar  9 10:31:19 2004
+		regex.c		1.129	Fri Mar 24 10:59:57 2006
+		regexec.c	1.97	Fri Mar 24 10:59:57 2006
+		regex.h		1.40	Mon Sep 25 20:03:05 2006
+		regex_internal.c	1.67	Mon Sep 25 20:03:05 2006
+		regex_internal.h	1.73	Fri Mar 24 10:59:57 2006
+		regcomp.c	1.112	Fri Mar 24 10:59:57 2006
+
+Fri Jan 12 12:28:51 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ABOUT-NLS, INSTALL, Makefile.in, aclocal.m4, config.guess,
+	config.rpath, config.sub, configh.in, configure, configure.ac,
+	depcomp, gettext.h, install-sh, missing, mkinstalldirs, ylwrap:
+	Updated to current autotools, Autoconf 2.61, Automake 1.10,
+	gettext 0.16.1.
+
+Thu Jan  4 18:23:50 2007  Dmitry V. Levin    <ldv@altlinux.org>
+
+	* node.c (free_wstr): Zero wstptr and wstlen only if WSTRCUR
+	flag is set.
+	(str2wstr): Replace invalid `free' call with `free_wstr' call.
+
+Thu Jan  4 16:49:21 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_match): Move freeing of wc_indices to outside if.
+	Thanks to Sven Wegener <swegener@gentoo.org> for the report.
+
+Thu Dec 21 14:32:13 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (arg_assign): Reassign the '=' only if not initing.
+	* profile.c (varname): Deleted.
+	(pp_concat): New function to print concatenations.
+	(tree_eval): Don't use `varname' anymore. Use `pp_concat'.
+
+Mon Dec 11 12:43:04 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (sub_common): Clear numeric flags on result
+	unconditionally.
+	* node.c (wcasestr): Replace `goto' with `continue'.
+
+Thu Nov 30 15:54:07 2006  Bruno Haible       <bruno@clisp.org>.
+
+	* builtin.c: Change use of HAVE_LC_MESSAGES to defined(LC_MESSAGES).
+	Bruno suggested only for dcngettext, I did it everywhere (ADR).
+
+Wed Sep  6 02:04:32 2006  Andrew J. Schorr   <aschorr@telemetry-investments.com>
+
+	* awkgram.y (get_src_buf): Adjust `source' and `sourceline' to
+	correctly handle mixed -f and --source options.
+
+Mon Aug 28 21:17:20 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* AUTHORS, FUTURES, LIMITATIONS, NEWS, POSIX.STD, PROBLEMS, README:
+	Added FSF copyright for no other reason than to satisfy the flunkies
+	running Savannah.
+	* Makefile.am: Removed `ansi2knr' from AUTOMAKE_OPTIONS also.
+
+Fri Aug 11 15:07:45 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (set_field, rebuild_record, set_record): Remove calls to
+	`free_wstr' since they're not needed.
+
+Sat Aug  5 22:04:24 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (unref): Call `free_wstr' for fields also. Thanks to
+	Andrew Schorr.
+
+Tue Jul  4 22:43:05 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (interpret): Node_assign_concat case: Turn off NUMBER and
+	NUMCUR flags in result.  Sheesh. Thanks to
+	<Heiner.Marxen@DrB.Insel.DE> for finding the problem.
+
+Mon Jul  3 22:49:44 2006        Pat Rankin      <rankin@pactechdata.com>
+
+	* main.c (load_environ): When AWKPATH is missing from ENVIRON[],
+	try to find it with getenv("AWKPATH") before resorting to DEFPATH.
+	Suggested by Galen Tackett.
+
+Mon Jul  3 00:27:59 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (INTERNAL_HANDLE): New constant for use by `iop_alloc'
+	when allocating an internal IOBUF.
+	(pidopen, useropen): Use it.
+	(iop_alloc): Add check for it and just return iop.
+
+Fri Jun 23 15:48:34 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (subn): At end for `do_sprintf' check, verify
+	that lnode is not NULL before using it to assign through.
+
+Sun Jun 18 22:27:25 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Repair internal names like /dev/user, /dev/pid, as well as /dev/fd/N,
+	which have been broken for a long time but noone noticed.
+
+	* io.c (is_internal): New macro to check for internal file like
+	`/dev/user'.
+	(spec_setup): Reduce to two parameters, allocate logic is always true.
+	Add IOP_NO_FREE to flag.
+	(pidopen, useropen): Return `IOBUF *' instead of int. Fix
+	logic to test if `iop' parameter is NULL and if so to allocate it.
+	(specfdopen,): Return `IOBUF *' instead of int. Fix
+	logic to test if `iop' parameter is NULL and if so to allocate it.
+	Don't set IOP_NO_FREE in flag.
+	(iop_open): Remove `IOBUF iob' field from `struct internal' and its use
+	and the use of `spec_setup' from the code here. Change the check in the
+	call to the open function to look for NULL.
+	(get_a_record): Use `is_internal' in initial check for filling the
+	buffer to not try to call `read' on internal files. If true, set
+	the IOP_AT_EOF in the flag and return EOF.
+
+Fri Mar 24 13:05:56 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (get_src_buf): Remove function argument types from
+	declaration of `readfunc' to avoid bugaboos with VMS declaration
+	of `read' system call.
+
+Fri Mar 10 06:28:23 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (free_wstr): New declaration if MBS_SUPPORT, empty macro
+	otherwise.
+	* node.c (free_wstr): New function, inside MBS_SUPPORT. Frees the wide
+	string part of a node. Provided so that it can be used consistently
+	everywhere.
+	(format_val, r_dupnode, mk_number, make_str_node, unref): Use it.
+	* builtin.c (sub_common): Call `free_wstr' instead of doing it manually.
+	* eval.c (r_tree_eval): Same in Node_assign_concat case.
+	* field.c (set_field, rebuild_record, set_record): Add calls to
+	`free_wstr'.
+
+Mon Feb 13 22:45:34 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (r_tree_eval): Node_assign_concat. Release any
+	wide string value and reset the WSTRCUR flag. Based on
+	bug report by Karel Zak.
+
+2006-01-03  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* Makefile.am (awkgram.c): Use $(AWK), not awk, so that the rule
+	works on Solaris too (e.g., Solaris 10).  Problem reported by
+	Andrew J. Schorr.
+
+Mon Dec 19 05:39:46 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (format_val): Account for overlow of conversion
+	from double to long. Shows up worse on 64-bit systems.
+
+Wed Dec 14 18:57:34 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (set_BINMODE): Fix logic of test for no numeric value.
+	Makes `gawk -v BINMODE=1 ...' work again. Thanks to Eli Zaretskii
+	<eliz@gnu.org> for pointing out the problem.
+
+Wed Oct 19 10:58:27 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (main, arg_init): Only use the locale's decimal
+	point if do_posix is set. Too many people the world over
+	have complained about this.
+
+Fri Oct  7 13:54:09 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Enhancement to fix from 23 Sept 2005, suggested by Pat Rankin.
+
+	* awkgram.y (one_line_close): New function, closes open FILE * used
+	by `read_one_line'.
+	(fp): Static FILE * used by `read_one_line' and `one_line_close'.
+	* awkgram.y (read_one_line): Simplify check for call to `fdopen'.
+	(get_src_buf): New variable `closefunc' which is a pointer to a
+	function implementing the `close' system call interface.
+
+Fri Oct  7 13:23:29 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (set_FIELDWIDTHS): Fix off-by-one error in assignment
+	of sentinel value at end of FIELDWIDTHS array.
+
+Fri Sep 23 16:05:13 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (read_one_line): New function, mainly for debugging,
+	that reads one line of data at a time to pass back as a buffer.
+	Emulates the variable-length record filesystem of VMS, where
+	we first saw the problem fixed here.
+	(get_src_buf): New variable `readfunc' which is a pointer to a
+	function implementing the `read' system call interface. Based on
+	an environment variable, use `read_one_line' instead of `read'
+	for testing.   Make the test for expanding the buffer smarter,
+	so that it doesn't grow unnecessarily.
+
+	Thanks to Galen Tackett (tackett_galen@bah.com) for reporting
+	the problem and to Anders Wallin and Pat Rankin for help
+	tracing and reproducing the problem and testing the fix.
+
+Fri Sep  9 15:06:07 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* hard-locale.h (xmalloc): Move declaration to file scope
+	for non-glibc systems and gcc 4. Thanks to Kito Danya Dietrich
+	<kito@gentoo.org>.
+
+Thu Aug 25 22:40:40 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c (build_range_exp): Avoid `btowc' for single-byte
+	characters. Fedora Core 2, maybe others, have a broken version
+	that can't handle values > 127.
+
+Fri Aug 19 16:13:28 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regexec.c (proceed_next_node): Added a band-aid check at the
+	top of the first `if' to make sure that `mctx->state_log[*pidx]'
+	isn't NULL.
+
+Fri Aug 12 13:10:33 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (iop_alloc): Only free `iop' if it was malloc'ed in
+	the first place.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Tue Jul 26 21:44:54 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Copyright dates on all relevant files updated to 2005.
+
+Wed Jul  6 17:09:02 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Minor cleanups:
+
+	* io.c (do_index): Remove unused variables `mbclen', `mbs1' and `mbs2'.
+	* node.c (wstrstr): Remove unsed variable `j'.
+	(dump_wstr): `#ifdef' out, not currently needed.
+	* eval.c (op_assign): Move decl of `t1' and `t2' into a separate block
+	for the `! HAVE_FMOD' case. Keeps the compiler quiet. Similar for
+	`ltemp'.
+
+Wed Jul  6 16:51:31 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (close_io): Now takes pointer to boolean parameter indicating
+	if there was a problem closing standard output or standard error.
+	Update it in the right places.
+	* awk.h (close_io): Update the declaration.
+	* main.c (main): New variable `stdio_problem'. Pass it to `close_io'.
+	Check the result and exit non-zero if there was a problem.
+	(usage, version): Print warning message if problems with stdout.
+
+	Unrelated:
+
+	* main.c (main): For call to `setlocale' for LC_MESSAGES, just use
+	`#ifdef LC_MESSAGES'.  Per Bruno Haible <bruno@clisp.org>.
+
+Wed Jul  6 16:44:58 2005  Jim Meyering  <jim@meyering.net>
+
+	* main.c (init_fds): If any of the STDIN_FILENO, STDOUT_FILENO,
+	STDERR_FILENO are initially closed, reopen them with permissions
+	contrary to common usage so that any reasonable attempt to use
+	them will evoke the same sort of error as reading or writing to
+	a closed file descriptor would.
+
+Mon Jul  4 09:38:29 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	More multibyte fixes from Kimura Koichi, <kimura.koichi@canon.co.jp>.
+
+	* node.c (format_val, r_dupnode): Spell `wstptr' correctly.
+	* regex_internal.c (build_wcs_upper_buffer): Label `offsets_needed'
+	should not be inside `#ifdef _LIBC'.
+	* regcomp.c (build_charclass): Fix declaration of `class_name' in
+	prototype to not be unsigned.
+
+Thu Jun 30 11:52:34 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (tree_eval): Node_not: Remember to print the exclamation
+	point!  Thanks to Dan Nielsen <Dan.Nielsen@corporate.ge.com>
+	for the bug report.
+	* mbsupport.h: Fix spelling of HAVE_ISWUPPER. Thanks to
+	Kimura Koichi, <kimura.koichi@canon.co.jp>.
+
+Sun Jun 26 16:37:59 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Unrelated changes:
+
+	* builtin.c (do_length): Allow array argument to length().
+	Returns number of elements in array.
+
+	* awkgram.y (yylex): Ignore carriage returns in source code. Sigh.
+
+Wed Jun 15 22:12:15 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* node.c (isnondecimal): Check loc.decimal_point before using it.
+	Avoids problems with command line assignment when locale info may
+	not be set up all the way yet.
+
+Wed Jun 15 21:59:54 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* node.c (make_str_node): If working with multibyte characters, while
+	parsing string constants, keep multibyte characters together. This
+	avoids problems in cases where one of the bytes is backslash. Initial
+	patch supplied by Kimura Koichi, <kimura.koichi@canon.co.jp>.
+
+Tue Jun 14 21:50:37 2005  Andrew J. Schorr     <ajschorr@users.sourceforge.net>
+
+	Use Exponentiation By Squaring for integer powers for ^ and ^=.
+
+	* eval.c (calc_exp, cal_exp_posint): New functions.
+	(r_tree_eval): Use them.
+
+Fri Jun  3 12:15:54 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* configure.ac: Further change the hack at the end so that
+	it works on Mac OS X `sed'. Sigh.
+
+Thu Jun  2 22:44:01 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* configure.ac (TYPE_SOCKLEN_T): Use `int' as default type if can't
+	figure one out.
+	* awkgram.y: Warn that `//' is not a C++ comment. (:-)
+
+Thu Jun  2 20:55:27 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	From: Benno Schulenberg <benno@nietvergeten.nl>
+
+	* eval.c (func_call): Take message out of gettext call since it's for
+	debugging.
+	* ext.c (get_actual_argument): Fix formatting of message.
+
+Wed May 25 09:19:37 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* configure.ac: Change hack at end that fixes Makefile to keep
+	version.c to use `sed' and not `ed'. More portable to OS/2, probably
+	other systems.
+
+Mon May 23 09:01:26 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	Portability help from Jim Meyering.
+
+	* io.c: Rework ifdefs for <inttypes.h> and <stdint.h>. Test them
+	individually.
+	* configure.ac: Add AC_C_RESTRICT and code for socklen_t from rsync.
+	Check for isascii and btowc for regex.
+
+Sat May 14 22:49:54 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* wait_any (errno): Remove decl.
+	* gawk_popen: The pipe-simulated but not VMS or DOS version. Remove
+	decl/use of `strdup' in favor of `emalloc' and `strcpy'.
+
+Wed May 11 18:33:30 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	All files: Updated address of FSF to:
+
+	51 Franklin Street, Fifth Floor
+	Cambridge, MA  02110-1301
+
+Wed May 11 18:19:03 2005  Jim Meyering  <jim@meyering.net>
+
+	* configure.ac: Use AM_GNU_GETTEXT([external]).
+	Reflect upgrade to gettext-0.14.4.
+	Reflect renaming of `jm_'-prefixed macros.
+	(AC_CONFIG_FILES): Remove intl/Makefile.
+
+	* Makefile.am (SUBDIRS): Remove intl.
+	(AM_CPPFLAGS): Remove -Iintl.
+
+Wed May 11 11:42:06 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	Straighten out mess with `isblank' which is C99 <ctype.h> function.
+
+	* configure.ac: Remove check for `isblank' in call to AC_CHECK_FUNCS.
+	* regex_internal.h: #ifdef out definition of `isblank' and provide
+	`is_blank' function a la dfa.c.
+	* field.c: Ditto.
+	* regcomp.c: #ifdef use of `isblank' and add `is_blank' use instead.
+
+Mon May  9 08:29:37 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* configure.ac: Add type check for `socklen_t', fixes compile
+	warning on AMD/64 Linux.
+	* io.c (socketopen): Change type of socket length variables
+	to `socklen_t' from `size_t'.
+
+Thu May  5 22:00:03 2005  John E. Haque <j.eh@mchsi.com>
+
+	* io.c (iop_alloc): Let an input processor hook installed via
+	`register_open_hooks' open its own fd in case gawk does not know
+	how to open it.
+	(iop_open): Call `os_close_on_exec' after `iop_alloc'.
+	ADR: If `iop_alloc' returns NULL but the fd is valid, close
+	the fd to avoid an fd leak.
+
+Mon May  2 08:05:59 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* eval.c (update_ERRNO): Don't use `return' in a `void' function.
+	* awk.h (AWKNUM): Back out use of `long double' based on LDBL_MANT_DIG.
+	* builtin.c (tmp_integer): Back out extra ifdefs.
+
+Fri Apr 29 13:01:05 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* configure.ac: Look for `isblank' function.
+	* field.c: Add define for `isblank' if we don't have it.
+
+Fri Apr 29 12:01:33 2005  Julian Foad  <julianfoad@btopenworld.com>
+
+	From grep.  Doesn't seem to affect awk.
+
+	* dfa.c (lex): Fix bug #9519: "echo do^re | grep do^re" was
+	failing to find a match. [Towards end, set `lasttok' before
+	returning `c'.]
+
+Fri Apr 29 00:28:46 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* configure.ac: Jump through an amazingly convoluted hoop to get
+	config.status to keep version.c upon `make distclean'. Seems to
+	work though.
+
+Thu Apr 28 23:40:02 2005  Stepan Kasal  <kasal@ucw.cz>
+
+	* configure.ac (PRINTF_HAS_F_FORMAT): Some cosmetic changes.
+	(custom.h): Don't cat custom.h at the end of config.h; instead, use
+	AH_BOTTOM([#include "custom.h"])
+	* awklib/Makefile.am (AM_CPPFLAGS): Add $(top_srcdir) so that
+	custom.h can be found.
+
+Thu Apr 28 23:21:22 2005  Jim Meyering  <jim@meyering.net>
+
+	* field.c (set_FIELDWIDTHS): Tighten up the code to accept FIELDWIDTHS
+	values in [1..INT_MAX], e.g., detect overflow and invalid strings,
+	and reject strings starting with `-'.
+
+Thu Apr 28 23:05:33 2005  Stepan Kasal  <kasal@ucw.cz>
+
+	* dfa.c (parse_bracket_exp_mb): Shorten one part of the code, to get
+	closer to grep's copy.
+
+Thu Apr 28 23:00:58 2005  Pat Rankin    <rankin@pactechdata.com>
+
+	* builtin.c (format_tree) [#if VAXCRTL]:  For floating point
+	formatting, reject zero_flag if using old VAXCRTL run-time
+	library to avoid getting erroneous results which appear as if
+	numerically incorrect (due to an embedded space in some cases,
+	extra trailing zeroes in others) rather than just misformatted.
+	`hsprint' test still fails, but not as badly.
+
+Thu Apr 28 19:12:03 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* re.c (reflags2str): Add three new RE_ flags from current regex.h
+	to bring the table up to date.
+
+	* builtin.c (format_tree): Save 2 spare bytes instead of one. Suggested
+	by Stepan Kasal.
+
+Thu Apr 28 18:16:09 2005  Andrew J. Schorr     <ajschorr@users.sourceforge.net>
+
+	* awk.h (IOBUF): Add new fields `opaque', `get_record', and
+	*close_func', to support insertion of an alternate input processor.
+	This is used by the XML extension.
+	(register_deferred_variable, register_open_hook, update_ERRNO_saved):
+	Declare new functions.
+	(load_environ, load_procinfo): Remove declarations -- these functions
+	are no longer global, since we use register_deferred_variable instead.
+	* awkgram.y (register_deferred_variable): New function to allow
+	calling code to register special variable names that trigger a callback
+	upon the first reference.  This is now used to implement ENVIRON
+	and PROCINFO.
+	(variable): Search the list of deferred variables instead of hardcoded
+	tests for ENVIRON and PROCINFO.
+	* eval.c (set_BINMODE): Fix spelling of "arbitrary" in warning message.
+	(update_ERRNO_saved): New function that allows the caller to specify
+	the errno value instead of using the current value.
+	(update_ERRNO): Implement by calling update_ERRNO_saved(errno).
+	* io.c (iop_close): Call `iop->close_func' if non-NULL.
+	(close_redir): Should save `errno' value, otherwise `lintwarn' messages
+	might update it.  Then use `update_ERRNO_saved' to set ERRNO.
+	(do_getline): Call `update_ERRNO_saved' to set ERRNO based on the
+	error code returned by the redirect function (instead of the current
+	value of errno).  Similarly, use `update_ERRNO_saved' to set ERRNO
+	based on the value returned by `get_a_record'.  But add a special
+	check to avoid updating ERRNO if `get_a_record' returns an error
+	code value of -1 (this is used by the XML extension which already
+	sets ERRNO before returning).
+	(register_open_hook): New function to register a function to be
+	called whenever a new data file is opened.  This can be used to
+	install a special input processor (as in the XML extension).
+	(iop_alloc): Call registered open hook.
+	(get_a_record): If a `get_record' method has been set, call that instead.
+	* main.c (init_vars): Use `register_deferred_variable' to implement
+	ENVIRON and PROCINFO.
+	(load_environ, load_procinfo): Now static instead of global.
+	* doc/gawk.texi: Document new internal functions `update_ERRNO_saved',
+	`register_deferred_variable', and `register_open_hook'.
+
+Thu Apr 28 10:50:10 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	* array.c (assoc_find, do_delete): Change incorrect uses of STREQN
+	to memcmp.
+	* builtin.c (do_index): Same.
+	* field.c (set_FS): Same.
+	* io.c (redirect, getredirect, do_close, set_RS): Same.
+	* re.c (reisstring): Same.
+
+Wed Apr 27 21:35:57 2005  Arnold D. Robbins    <arnold@skeeve.com>
+
+	Allow for long double. Initial changes from  Jean-Marc Saffroy
+	<jean-marc.saffroy@ext.bull.net>.
+
+	* awk.h (AWKNUM): If have long doubles (LDBL_MANT_DIG), define AWKNUM
+	as long double, otherwise just use double.
+	* builtin.c (format_tree): Change type of tmpval to double.
+	(do_strtonum): Same for `d' and types used in casts.
+	(tmp_integer): Don't do bit shifting if have long doubles.
+
+	Unrelated, from Andrew J. Schorr:
+
+	* io.c (close_one): Check for RED_FILE|RED_WRITE, not just RED_FILE.
+
+Mon Apr 25 12:23:18 2005   Andrew J. Schorr	<aschorr@telemetry-investments.com>
+
+	* eval.c (r_tree_eval): In Node_assign_concat case, when copying string
+	constants, include the terminating zero byte.
+
+Fri Apr  1 06:26:31 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Update to Automake 1.9.5.
+
+	* INSTALL, aclocal.m4, depcomp, install-sh, missing,
+	mkinstalldirs, ylwrap: Updated.
+
+	Unrelated:
+
+	* builtin.c (do_tolower, do_toupper): Remove old code
+	based on 8-bit character table.
+
+Wed Feb 23 08:23:22 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* bisonfix.awk: New file, fixes continued #ifdef for dumb compilers.
+	* Makefile.am (awkgram.c): Fix rule to use it.
+	(EXTRA_DIST): Include bisonfix.awk.
+
+Tue Feb 22 21:18:50 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* random.h: Remove include of config.h and move it to ...
+	* random.c: Here.  Move include of random.h back to where it was.
+
+	* regcomp.c, regex.c, regexec.c: NUKED all use of alloca not inside
+	`_LIBC' ifdef. Hooray!
+
+Sat Feb 19 20:13:28 2005   Pat Rankin    <rankin@pactechdata.com>
+
+	Workarounds for bugs and missing C89 features in old VAX C compiler.
+
+	* regex_internal.h "mbsupport.h": Suppress inclusion if NO_MBSUPPORT
+	is defined.
+	[MB_CUR_MAX]: Define as 1 if mbsupport.h hasn't defined it.
+	[ER_ERRMSG, ERRMSG_TYPE, ERRMSG_OFFSET, ERRMSG_SEPARATOR]: New macros
+	conditionalized upon gawk's NO_TOKEN_PASTING macro.
+	* regcomp.c: Use them.
+	(parse_dup_op): Use alternate initialization of start_token if
+	RE_TOKEN_INIT_BUG is defined.
+	* regexec.c (proceed_next_node): Compare push_fail_stack() result
+	explicitly against REG_NOERROR rather than implicitly against 0.
+
+Sat Feb 19 20:05:50 2005   Pat Rankin    <rankin@pactechdata.com>
+
+	* dfa.c "mbsupport.h": Suppress inclusion if NO_MBSUPPORT is defined.
+
+Wed Feb 16 20:43:07 2005   Pat Rankin    <rankin@pactechdata.com>
+
+	* awk.h "mbsupport.h": Suppress inclusion if NO_MBSUPPORT is defined.
+	* regex.h <sys/types.h>: Guard inclusion with HAVE_SYS_TYPES_H.
+	* regex.c <sys/types.h>: Likewise.
+	* random.c "random.h": Include this first to get config.h setup.
+	<fcntl.h>: Guard inclusion with HAVE_FCNTL_H.
+	<unistd.h>: Guard inclusion with HAVE_UNISTD_H.
+	* io.c [#if defined(MSDOS) ||... defined(__CYGWIN__)]: Splice the
+	backslash continuation back into one long line.
+
+Wed Feb 16 10:11:21 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* node.c (unref, format_val): Add assertions checking that both
+	`tmp->wstptr != NULL' and `(tmp->flags & WSTRCUR) != 0' before
+	freeing `tmp->wstptr'. Thanks to kimura.koichi@canon.co.jp.
+
+	* random.c (HAVE_UNISTD_H): Conditionalize include of <unistd.h>.
+	Thanks to Scott Deifik <scottd@amgen.com>.
+
+Sun Feb 13 18:24:50 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* io.c (socketopen): Move `#ifdef MSG_PEEK' up to above
+	declarations too.  Thanks to Michal Jaegermann.
+
+	* config.guess, config.sub: Updated from Savannah.
+
+Thu Feb 10 15:48:48 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* regex_internal.c (re_dfa_add_node): Remove variable `type'
+	and just use `token.type' directly in RE_ENABLE_I18N code below.
+	Saves a compiler warning, and a good compiler will handle it anyway.
+	* regexec.c (check_arrival_add_next_nodes): Move decl of `err'
+	inside #ifdef RE_ENABLE_I18N code where it's used.
+	* awkgram.y (yylex): Add casts to int before use of `strlen' results
+	for printf-style precision. Avoid a compiler warning.
+	* io.c (redirect, do_close): Same for use of tmp->stlen.
+
+	Thanks to Michal Jaegermann <michal@harddata.com>.
+
+Wed Feb  9 10:19:15 2005   Stepan Kasal  <kasal@ucw.cz>
+
+	* Makefile.am (datadir, libexecdir): Removed.
+	(awkdatadir): Renamed to pkgdatadir.
+	(pkgdatadir, LDADD): Use the make syntax to refer to other variables,
+	not @...@.
+
+Wed Feb  9 10:05:46 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* node.c (r_dupnode): Assign NULL to r->wstr after `getnode'.
+	Fix count of bytes to copy in call to `memcpy'.
+	Thanks to Kimura Koichi, <kimura.koichi@canon.co.jp>.
+
+Tue Feb  8 19:26:22 2005   Pat Rankin  <rankin@pactechdata.com>
+
+	* regcomp.c (init_dfa): Avoid strcasecmp() since regex.c doesn't
+	use awk.h and none of the assorted other included header files
+	are guaranteed to declare it.
+	(parse_expression): Modify casts for the string arguments passed to
+	build_charclass_op() to fix char * vs unsigned char * mismatch.
+	(parse_bracket_exp): Likewise add cast for the string argument
+	passed to build_charclass().
+
+Mon Feb  7 15:04:09 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* eval.c (make_scalar): Don't use P() macro in definition.
+	Thanks to Juergen Kahrs <Juergen.Kahrs@barco.com>.
+
+Wed Feb  2 16:36:19 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* main.c (main):  Call `close_io', without its result affecting
+	the exit status.  Super small, super dark corner.
+
+	See test/exitval2.awk.
+
+Tue Feb  1 11:58:29 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* regex.h (__APPLE_CC__): Removed test and definition of __restrict.
+	Not needed for current MacOS X compiler.
+
+Sun Jan 30 13:56:37 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Fresh merge with CVS regex routines. Fixes handling of \B.
+	See tests/gnureop3.awk and also
+	http://sources.redhat.com/bugzilla/show_bug.cgi?id=693.
+
+	CVS base versions:
+
+	* regcomp.c: Version 1.92, Thu Jan 27 19:05:20 2005.
+	* regexec.c: Version 1.77, Thu Jan 27 19:06:34 2005.
+	* regex_internal.c: Version 1.49, Thu Jan 27 19:07:15 2005.
+	* regex_internal.h: Version 1.60, Wed Jan 26 22:40:50 2005.
+	* regexec.c: Version 1.77, Thu Jan 27 19:06:34 2005.
+
+Sat Jan 22 22:30:40 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Reinstate patch of 18 Nov 2001, for VMS, at least:
+
+	* random.c (srandomdev): ifdef-out.  Lots of compile time
+	problems on multiple platforms, and gawk doesn't even
+	use the routine.  The heck with fine-grained solutions.
+
+Thu Jan 20 14:15:32 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* awkgram.y (LEX_FOR): Free NAME tokens in transformation of
+	`for (iggy in foo) delete foo[iggy]' into `delete foo'.
+	Thanks and a tip of the hatlo to Valgrind.
+
+	* dfa.c (_): Clean up stuff here by just including "gettext.h".
+	Per Bruno Haible.
+
+Wed Jan 19 18:29:23 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Improve parsing of numeric constants
+	and hex values, via a push from Paul Eggert. See test/hex.awk.
+
+	* regex_internal.c (re_node_set_alloc): If `size' is 0, just
+	zero out the structure. From valgrind.
+
+Tue Jan 18 17:23:25 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Make gawk multibyte aware.  This means that index(), length(),
+	substr() and match() all work in terms of characters, not bytes.
+
+	* awk.h (NODE): Add `wsp' and `wslen' elements to value for wide
+	string.
+	(WSTRCUR, wstptr, wstlen, force_wstring): New macros.
+	(str2wstr, wstrstr, wcasestrstr): New declarations.
+	* builtin.c (do_index, do_length, do_substr, do_match): Handle wide
+	strings.
+	* eval.c (flags2str): Add WSTRCUR.
+	* node.c (format_val, r_dupnode, mk_number, make_str_node, unref):
+	Add code to deal with wide strings.
+	(str2wstr, dump_wstr, wstrstr, wcasestrstr): New functions.
+
+Sun Jan 16 15:10:35 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* random.h (int32_t): Define this type.
+
+Thu Jan 13 14:38:13 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Cause `configure --disable-nls' to still allow locale-correct
+	formating of numeric values.
+
+	* builtin.c (format_tree): Change #ifdefs to only test HAVE_LOCALE_H.
+	Improve code for ' flag so that extraneous separator is not included if
+	number of digits is multiple of locale separater count (3, 6, 9, etc.)
+	* dfa.c (dfaparse): Change ifdef to only test #ifdef LC_COLLATE.
+	* eval.c (fmt_ok): Remove ENABLE_NLS from #ifdef test.
+	* gettext.h: Include <locale.h> on both sides of test. Should really
+	be factored out.
+	* main.c (loc): Remove ENABLE_NLS from #ifdef test.
+	(main): Same in call to localeconv().
+	* node.c (isnondecimal): Remove ENABLE_NLS from #ifdef test.
+
+	Unrelated:
+
+	* regcomp.c (init_dfa): Change `codeset' to `codeset_name' in two
+	places.
+
+Mon Jan 10 11:49:56 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Annual sync with glibc.
+
+	* getopt_int.h: New file.
+	* Makefile.am (base_sources): Add it.
+	* getopt.h, getopt.c, getopt1.c: Updated.
+	* regcomp.c, regex.c, regex.h, regex_internal.c, regex_internal.h,
+	regexec.c: Updated.
+
+	Original versions:
+
+	getopt_int.h, 1.1, Tue Mar 9 10:31:19 2004
+	getopt1.c, 1.10, Tue Mar 9 10:35:37 2004
+	getopt.h, 1.21, Fri Mar 19 00:19:32 2004
+	getopt.c, 1.53, Wed Mar 10 23:13:26 2004
+	regcomp.c, 1.87, Mon Dec 6 02:56:42 2004
+	regex.c, 1.126, Fri Jan 30 05:19:58 2004
+	regex.h, 1.33, Thu Nov 18 23:50:57 2004
+	regex_internal.c, 1.46, Thu Jan 6 20:59:49 2005
+	regex_internal.h, 1.57, Mon Dec 27 16:29:05 2004
+	regexec.c, 1.75, Mon Dec 27 16:29:52 2004
+
+	* regex.h: Add check for __APPLE_CC__ and definition of __restrict.
+	* regex.c: Add check for _MSC_VER and include <stdio.h>.
+	* regex_internal.h (_RE_ENABLE_I18N): Change test.
+	(re_realloc): Add check/fix for SunOS 4.1.x.
+	* regex_internal.c (build_wcs_upper_buffer): ifdef label
+	`offsets_needed', add cast in call to `wcrtomb'.
+	* regcomp.c (build_charclass, build_charclass_op): Remove `unsigned'
+	from declarations of `char *' params.
+	(regerror): Remove use of mempcpy.
+	(peek_token): Disallow \s and \S for gawk.
+	(build_charclass): Change decl of `class_name' and use it directly.
+	Nuke variable `name'.
+	(build_charclass_op): Change decl of `class_name' and `extra'.
+
+Thu Jan  6 16:44:32 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Improve autoconfiscation stuff for wide character use.
+
+	* builtin.c (do_tolower, do_toupper): Conditionally compile
+	call to `wide_tolower_toupper'.
+	(wide_tolower_toupper): Conditionally compile typedefs and function.
+	* mbsupport.h: Add check for having `wint_t', and `iswlower',
+	`iswupper', `towlower' and `towupper'.
+	* configure.ac (HAVE_WINT_T): Add test.
+	(AC_CHECK_FUNCS): Add `wint_t', `iswlower', `iswupper', `towlower'
+	and `towupper'.
+
+	Unrelated change:
+
+	* hard-locale.h (hard_locale): Add decl of `xmalloc' to prevent
+	redeclaration problems on some compilers.
+
+Wed Jan  5 10:20:17 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Update to Bison 2.0.
+
+	* bisonfix.sed: Removed, no longer needed.
+	* Makefile.am (EXTRA_DIST): Removed bisonfix.sed.
+	(awkgram.c): Fix build rule.
+	* awkgram.c: Regenerated.
+
+Tue Jan  4 18:47:56 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Update to Automake 1.9.4.
+
+	* alocal.m4, config.guess, config.sub, install-sh: Updated.
+
+Mon Jan  3 14:08:27 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Update to Automake 1.9.3.
+
+	* INSTALL, alocal.m4, config.guess, config.sub, depcomp,
+	install-sh, missing, ylwrap: Updated.
+
+Mon Jan  3 11:23:36 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Fix obscure issue. ^ in RS should only match at the very
+	beginning of the input.  Essentially, the file is one long
+	string.  To do this, use the `not_bol' flag in the `struct
+	pattern_buffer'.  Thanks to Stepan Kasal for pointing out the
+	problem and to Andreas Schwab for pointing out the mechanism
+	for a solution.
+
+	* awk.h (RE_NEED_START, RE_NO_BOL): New flags for `research'.
+	(IOP_AT_START): New flag for IOBUF.
+	(research): Last parameter is now `flags'.
+	* builtin.c (do_match, sub_common): Change calls to `research'.
+	* eval.c (interpret, match_op): Same.
+	* field.c (re_parse_field): Same.
+	* io.c (spec_setup): Add IOP_AT_START flag.
+	(iop_alloc): Same.
+	(rsrescan): Modify logic to check IOP_AT_START and if not on to
+	add RE_NO_BOL to flags value in call to `research'.
+	(get_a_record): Clear IOP_AT_START upon return from `*matchrec'.
+	(iopflags2str): Add IOP_AT_START to table.  Also IOP_CLOSED,
+	which was missing. (Ooops.)
+	* re.c (research): Last paramater is now flags.  Modify logic to
+	handle RE_NO_BOL case by setting the right bit initially. Clean
+	up control flow so that it's cleared before returning.  If RE_NO_BOL,
+	don't bother with the dfa matcher, as it doesn't have an analogous
+	capability.
+
+Wed Dec 22 12:33:48 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	For --exec, don't allow x=y assignments where filenames would be.
+	Do allow -v.  This is because we assume --exec is used mainly for
+	CGI stuff and we don't want var assigns to affect the code.
+
+	Suggested by Stepan Kasal; motivated by reading about web security.
+
+	* main.c (disallow_var_assigns): New variable.
+	(main): Set the var for --exec.
+	(arg_assign): Check it appropriately.
+
+Sun Dec 19 17:27:09 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* builtin.c (do_gensub): Make `global' flag smarter, such that
+	a string numeric constant (e.g., "3") acts like a numeric
+	constant.
+	* node.c (r_force_number): Not really related: Only set NUMCUR
+	if we actually convert some digits.
+
+Sun Dec 19 16:08:50 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Synchronize with what's happening in GNU grep
+	development.  Effectively only minor whitespace changes and some
+	slight code motion of ifdefs and includes.
+	* hard-locale.h: New file, extracted from old dfa.c.
+	* Makefile.am (base_sources): Add hard-locale.h.
+
+Sun Dec 19 11:13:45 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* io.c (socketopen): Change type of `readle' and `namelen'
+	variables to size_t.  For QNX, but a good idea anyway. Thanks
+	to `Anthony' (rz1a@mail.ru).
+
+Mon Dec  6 11:11:22 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Undid change of Mar 9 2004, to add gofast patch.  It gets things
+	wrong for gawk.  This removes the bandaid of ifdef-ing out the
+	main check.  Eventually this'll all get straightened out in the
+	GNU grep code.
+
+	* dfa.c (buf_offset): Removed.
+	(SKIP_REMAINS_MB_IF_INITIAL_STATE): Removed use of buf_offset, do
+	free `mblen_buf', `inputwcs'.
+	(match_anychar, match_mb_charset, transit_state_consume_1char,
+	transit_state): Remove use of buf_offset in mblen_buf.
+	(dfaexec): Use `free' and `malloc', not `realloc'.
+
+Mon Dec  6 10:55:37 2004   Fumitoshi UKAI       <ukai@debian.or.jp>
+
+	Forwarded from james@nocrew.org, the Debian contact.
+
+	* dfa.c (parse_bracket_exp_mb): 
+	1. Build range correctly when IGNORECASE for [a-a] to also get 'A'.
+	2. For [:lower:] and [:upper:], if ignoring case, set type string
+	to "alpha".  This parallels code in the regex routines.
+	3. Reset wc1 to EOF when parsing bracket expressions.
+
+Mon Nov 29 18:36:25 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* io.c (redirect): When allocating a new struct redirect, set
+	rp->pid to -1, not 0, so that code checking for EOF on an
+	input pipe works correctly.
+
+Thu Nov 25 14:22:41 2004  Stepan Kasal  <kasal@ucw.cz>
+
+	* Makefile.am (MAINTAINERCLEANFILES): Add.
+	* version.in (version_string): Use PACKAGE_STRING.
+
+Tue Nov 23 17:27:38 2004  Stepan Kasal  <kasal@ucw.cz>
+
+	* re.c: Fix a typo in a comment.
+
+Mon Nov 22 16:47:00 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Add lint check for tawk style modifiers on
+	regexes, /.../i and /.../s.  Not that it'll help anyone.
+
+Wed Oct 27 14:25:18 2004  Stepan Kasal  <kasal@ucw.cz>
+
+	* builtin.c (do_tolower, do_toupper): Fix the wide char handling,
+	especially when the lowercased char doesn't ocuppy the same
+	number of bytes as its uppercase equivalent.  Make use of ...
+	(wide_tolower_toupper): ... this new static function.
+
+Mon Oct 25 11:51:14 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* builtin.c (bchunk, bchunk_one, cksize): Change type of `olen'
+	to size_t from long.  It is the 21st century now, after all...
+	Thanks to Stepan Kasal.
+
+Mon Oct 11 10:49:09 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Improve lint warnings for non-decimal constants.
+	* node.c (isnondecimal): Made a little smarter, thanks to Stepan Kasal.
+
+Thu Oct  7 21:59:38 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* dfa.c (dfamust): Redo fix of 22 Sep to match code from
+	current GNU grep.
+
+Sun Oct  3 23:06:00 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* node.c (isnondecimal): Made smarter, so that 0xEE does
+	register as non-decimal. Added parameter to indicate use of
+	locale's decimal point and changed declaration and callers.
+
+Tue Sep 28 18:38:17 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* node.c (isnondecimal): New function, now smarter.
+	* awk.h (isnondecimal): Changed from macro to function.
+
+Wed Sep 22 11:24:46 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* dfa.c (dfamust): At end, check results of `malloc'.
+	Based on bug report from Sorav Bansal <sbansal@stanford.edu>
+	for grep.
+
+Mon Sep 20 13:18:18 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	New --exec option.  Needed for gawk CGI scripts to prevent
+	arbitrary options and/or source getting passed in from the web.
+
+	* main.c (optab): New long option, --exec.
+	(main): Catch it.  Like -f but end option processing.
+	(usage): Add it to the usage message.
+
+	Thanks to John DuBois and Don Stokes for their input.
+
+	Unrelated:
+
+	* dfa.c (dfaexec): Disabled caching into buffer that bypasses
+	multibyte initialization, since it can get things wrong. Thanks
+	to Andreas Schwab <schwab@suse.de>.
+
+Mon Sep 20 12:59:42 2004   Andreas Schwab  <schwab@suse.de>
+
+	* awkgram.y (nextc): Check for end of lexer buffer before
+	advancing ring buffer index.
+
+Wed Sep  8 09:54:53 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* main.c (main): Force LC_NUMERIC locale to "C" before parsing
+	the program, since a variable assignment with -v can leave the 
+	locale set incorrectly.
+
+	Thanks to Sirix <sirix@poczta.onet.pl> for reporting the problem.
+
+Wed Aug 25 18:55:30 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* main.c (UPDATE_YEAR): New constant at top of file, where we
+	won't miss it.
+	(copyleft): Use it.
+
+Sun Aug 22 17:26:39 2004   Stepan Kasal  <kasal@ucw.cz>
+
+	Define gawk_mb_cur_max even if there is no mbs support, as
+	``const int'' and assign 1 to it.
+	This fixes a bug in re.c where #ifdef MBS_SUPPORT was missing.
+
+	* awk.h (gawk_mb_cur_max): Declare.
+	* main.c (gawk_mb_cur_max): Define.
+	* awkgram.y (nextc_is_1stbyte): Without mbs support, define to 1.
+	* builtin.c (index_multibyte_buffer): Define a dummy function
+	when there is no mbs support.
+	* awkgram.y, builtin.c, re.c: Remove some `#ifdef MBS_SUPPORT'.
+
+Sun Aug 15 22:08:04 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	Import current FreeBSD random.c.  Make it work for gawk.
+	Needed for cases where long is more than 32 bits.
+
+	* random.c: Imported from FreeBSD. Header includes tweaked.
+	* random.h: Typdef gawk_uint32_t appropriately and #define uint32_t
+	to it.
+	* configure.ac: Add calls to AC_CHECK_SIZEOF for unsigned int
+	and unsigned long.
+
+	Started with
+	http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdlib/random.c
+	Thanks to Andreas Schwab <schwab@suse.de> for the pointer.
+
+Thu Aug 12 13:09:53 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* main.c (copyleft): Fix copyright year.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+Mon Aug  2 12:17:40 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* configure.ac: Fix the hack. Do the sed on `Makefile',
+	not `Makefile.in'.  Sigh.
+
+Sun Aug  1 14:48:30 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* configure.ac: MAJOR HACK: At end, remove version.c from Makefile.in
+	variable `CONFIG_CLEAN_FILES' so that `make distclean' doesn't
+	remove version.c.
+
+Mon Jul 19 17:07:27 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from Savannah CVS.
+
+Fri Jul 16 10:59:07 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* re.c (make_regexp): Bracket code using `gawk_mb_cur_max'
+	inside `#ifdef MBS_SUPPORT'.
+
+Thu Jul 15 12:36:25 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* dfa.c (parse_bracket_exp_mb):  If doing case folding,
+	include the other case for regular characters inside [...].
+
+	* re.c (make_regexp): Smarten up handling of IGNORECASE,
+	particularly for multibyte character sets. Sigh.
+
+Wed Jul 14 16:25:23 2004  John Haque  <mary1john8@earthlink.net>
+
+	* eval.c (interpret): For `Node_K_return', use `copynode'
+	and not `dupnode' for non-PERM, non-TEMP values.
+	(func_call): Don't add TEMP flag to returned value.
+
+	These two fix a problem uncovered by the July 8 change in
+	`assoc_lookup'.
+
+Wed Jul 14 16:14:09 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (node_common): Add check `lexeme >= lexptr_begin',
+	from valgrind run.
+
+Wed Jul 14 16:00:51 2004  John Haque  <mary1john8@earthlink.net>
+
+	* io.c (rsrescan): Fix off by one error at end of record.
+
+Thu Jul  8 16:59:51 2004  Stepan Kasal  <kasal@ucw.cz>
+
+	* awkgram.y (output_redir): Make sure not to dereference NULL
+	pointer.  The bug was triggered by the following code:
+
+		gawk 'BEGIN{print "date" |& getline}'
+
+	No test case created, beacuse of the following:
+	Correct interpretation involves executing "1" or "0" -- as the user
+	may have defined this, we would have to override this in the test
+	script.  It's not worth the hassle.
+
+Thu Jul  8 12:59:49 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (load_casetable): Name changed from `load_ignorecase'.
+	* eval.c (load_casetable): Name changed from `load_ignorecase'.
+	Fix all uses.
+
+Thu Jul  8 12:32:13 2004  John Haque  <mary1john8@earthlink.net>
+
+	* awkgram.y (get_src_buf): Fix off-by-one error to avoid "does not end
+	in newline" messages.
+	* array.c (assoc_lookup): Small performance hack: for TEMP subs nodes,
+	use its string memory for ahname.
+	* ext.c (get_actual_argument): Minor code cleanup.
+	* builtin.c (do_lshift, do_rshift, do_and, do_or, do_xor, do_compl):
+	fixed to issue "non-numeric argument" lint warnings before using
+	`force_number'.
+
+Mon Jun 21 16:53:35 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	More changes from John Haque to rationalize extension functions.
+
+	* awk.h (get_curfunc_arg_count): Name changed from
+	`get_curfunc_parm_count'.
+	* eval.c (get_curfunc_arg_count): Ditto, body redone to count actual
+	args passed at call time.
+	* ext.c (get_argument): Update range check.
+	(get_actual_argument): Simplify the code.
+
+Mon Jun 14 14:01:16 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Changes from John Haque and ADR to rationalize extension functions.
+
+	* awk.h (check_special, get_curfunc_parm_count, get_actual_argument):
+	new function declarations.
+	(get_scalar_argument, get_array_argument): New macros.
+	* awkgram.y (check_special): New function.
+	(yylex): Use `check_special' to search `tokentab'.
+	(dump_funcs): Always count functions, in order to get dynamic ones.
+	Removed bogus use of `static' on `tab' variable.
+	* eval.c (struct fcall): Change type of `count' to `size_t'.
+	(get_curfunc_parm_count): New function.
+	(push_args): Set `r->rnode' to NULL for local variable.
+	* ext.c (make_builtin): Add sanity checking for presence and
+	name of new function, and that it's not a redefinition.
+	(get_argument): Check that requested arg is within range of actual
+	number of parameters.  Also clean up logic for Node_var_new,
+	Node_var_array, Node_array_ref.
+	(get_actual_argument): New function.
+	* profile.c (pp_builtin): Better handling of dynamic extension function.
+
+Sun Jun 13 14:32:22 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (redirect): Conditionalize checking for process recovery
+	on `#ifdef PIPES_SIMULATED'.  Needed for MS-DOS and VMS.
+	* builtin.c (tmp_integer): Change bracketing of magic test to
+	`#ifdef HAVE_UINTMAX_T' which is more general and more correct.
+
+Wed Jun  9 21:36:01 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (make_regexp): Add dfa matching into IGNORECASE handling.
+
+Tue Jun  8 15:38:56 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (casetable): Remove `const'.
+	* eval.c (casetable): Remove `const'.
+	(load_ignorecase): New function.  Loads locale-correct values in
+	upper 128 bytes.
+	(set_IGNORECASE): Call `load_ignorecase'.
+
+Tue Jun  8 14:04:19 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (get_src_buf): Make sure that value from
+	`optimal_bufsize' is reasonable.  Increase it if not.
+
+Tue Jun  8 13:54:28 2004  John E. Haque      <mary1john8@earthlink.net>
+
+	* awkgram.y (statement:LEX_FOR): Fix bug in loop to `delete a'
+	optimization.
+	* io.c (format_tree): Check for out of range values for
+	positional specifiers.
+
+Mon Jun  7 17:02:48 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (tmp_integer): Bracket the magic test inside
+	`#ifndef VMS'.
+
+	* awk.h (child_catcher): Remove declaration.
+	* main.c (main): Remove `signal' calls for SIGCLD, SIGCHLD.
+	* io.c (child_died, child_signo, child_catcher): Removed.
+	(get_a_record): Remove code checking for death of child.
+	(redirect): If `rp' matches and is at EOF and type is input
+	pipe, and `rp->pid' is not -1, call `wait_any' to reap the
+	child.  This is a heuristic, but it works pretty well.
+
+Sun Jun  6 18:35:17 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (get_a_record): Restore use of `memmove' instead of
+	memcpy. Otherwise some tests break on some systems. We think.
+	(child_died): Don't reset signal handler; breaks on some S5 systems.
+	(get_a_record): Reset handler if child_died. Still flaky on Solaris.
+	* configure.ac (version.c): Made from version.in again, for
+	non-Unix systems.
+	* Makefile.am (base_sources): Add version.c back.
+	* version.in: Include config.h for definition of const.
+	* main.c (version_string): Add back declaration, don't
+	include "version.i".
+	(main): Don't install child_catcher on Sun. (HACK)
+
+Thu Jun  3 14:06:06 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (version_string): Removed declaration, since
+	version.i is included directly.
+	* version.in: Removed test for definition of const.
+
+Tue Jun  1 19:23:53 2004  Stepan Kasal  <kasal@ucw.cz>
+
+	* Makefile.am (base_sources): Don't mention version.c, so that
+	it doesn't get distributed.
+	* po/POTFILES.in: Remove version.c
+	* configure.ac: Create version.i from version.in.
+	* main.c: Include version.i.
+
+Tue Jun  1 18:33:32 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Fix problem reported by Stephen Marchant <Stephen.Marchant@Cognex.com>
+	on Thu, 30 Oct 2003 13:11:42 -0500.
+
+	* regex_internal.h (re_realloc): Allow for SunOS pre-Standard C
+	`realloc' which doesn't accept NULL pointers.
+	* awk.h (erealloc): Same.
+
+	Unrelated. Change suggested by Peter Sobisch <petersob@gmx.net>, have
+	PROCINFO["version"] be the version of gawk:
+
+	* main.c (load_procinfo): Add in version.
+
+	Unrelated: Avoid warning:
+
+	* main.c (main): Cast calls to `bindtextdomain' and `textdomain' to
+	void.  Avoids diagnostic with `configure --disable-nls'.
+	* dfa.c (check_matching_with_multibyte_ops): Remove unneeded nested
+	#ifdef, per Scott Deifik (scottd@amgen.com).  Also fix some spelling
+	errors in comments.
+
+Tue Jun  1 18:26:45 2004  Paul Eggert  <eggert@twinsun.com>
+
+	Fix a bug reported by Mike Romaniw <msr@micromonumental.com>
+	to bug-gnu-utils on 2003-09-27: compl(compl(0xf0f)) returned 0xfff
+	on hosts with 64-bit uintmax_t and 64-bit IEEE-764 double, due to
+	rounding errors.
+
+	* doc/gawk.texi (Bitwise Functions): Leading nonzero bits are
+	removed in order to fit the result into a C 'double' without rounding
+	error.
+	* builtin.c: Include <float.h> if available.
+	(FLT_RADIX, FLT_MANT_DIG, DBL_MANT_DIG): Define if not already defined.
+	(AWKSMALL_MANT_DIG, AWKNUM_MANT_DIG, AWKNUM_FRACTION_BITS): New macros.
+	(tmp_integer): New function.
+	(do_lshift, do_rshift, do_and, do_or, do_xor, do_compl): Use them.
+
+Tue Jun  1 17:40:47 2004  Stepan Kasal  <kasal@ucw.cz>
+
+	* eval.c (push_args): Set var_value to Nnull_string for
+	local variables.
+
+Mon May 31 11:49:20 2004  Stepan Kasal  <kasal@ucw.cz>
+
+	* replace.c: #undef DEBUG before including mktime.c, it has
+	different meaning there.
+
+Mon May 31 08:25:30 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (get_actual): Add extra error message for `delete f'
+	inside body of function `f'.
+
+Mon May  3 09:53:34 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in, */Makefile.in: Updated to automake 1.8.4.
+	* config.guess, config.sub: Same.
+	* aclocal.m4, depcomp, install-sh: Same.
+
+Mon May  3 09:24:45 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Look for missing `strtoul'.
+	* replace.c: Include missing_d/stroul.c if not HAVE_STRTOUL.
+	* io.c (devopen): Use `strtoul' instead of `strtod' for
+	extracting fd number from "/dev/fd/N".  (Thanks to Jim Meyering.)
+	* field.c (set_FIELDWIDTHS): Use `strtoul' instead of `strtod'
+	when parsing FIELDWIDTHS values.  (Thanks to Jim Meyering.)
+
+Mon Apr 19 20:12:57 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in, */Makefile.in: Updated to automake 1.8.3.
+	* config.guess, config.sub: Same.
+
+2004-03-18  Stepan Kasal  <kasal@ucw.cz>
+
+	* eval.c (make_scalar): Comment clarification.
+
+	* array.c (get_actual): Remove the condition ``canfatal''
+	before ``cant_happen()''; if the data are consistent, we
+	simply cannot get there with a non-func Node_param_list,
+	no matter whether we are called via get_array or not.
+
+	* awkgram.y (variable): Make one longer message, to help translators.
+
+Tue Mar  9 17:34:10 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Adapted `gofast' patch from Redhat Enterprise version of grep
+	to current dfa.c.
+
+	* dfa.c (buf_offset): New variable.
+	(SKIP_REMAINS_MB_IF_INITIAL_STATE): Modified to use it, don't
+	free `mblen_buf', `inputwcs'.
+	(match_anychar, match_mb_charset, transit_state_consume_1char,
+	transit_state): Use buf_offset in mblen_buf.
+	(dfaexec): Realloc things instead of free and malloc.
+
+Thu Mar  4 16:46:55 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac (AC_FUNC_MBRTOWC): Added.
+	(AC_CHECK_FUNCS): Removed `mbrtwoc'.
+	(REGEX_MALLOC): Removed. Not needed for new regex* routines.
+
+	* re.c (research): Removed comment and check for return of -2
+	since that was for old regex using alloca or REGEX_MALLOC.
+
+Wed Mar  3 17:10:16 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (close_one): Don't close stdout or stderr; can happen if
+	/dev/stdout or /dev/stderr are used in redirection and all the
+	open files get used.
+
+Sun Feb 29 12:17:37 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c (build_charclass, build_charclass_op): Change type of
+	`class_name' parameter to `const char *' from `const unsigned char *'
+	and adjust callers.
+
+Thu Feb 26 15:20:22 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (get_src_buf): Rewritten to better manage input and
+	supplying newlines on command line programs.  Fixes problems reading
+	source files on Cygwin.
+
+	Unrelated fixes from mary1john8@earthlink.net:
+
+	* node.c (format_val): For no malloc case, free s->stptr if necessary.
+	* io.c (nextfile): Add missing call to `unref(FILENAME_node->var_value)'
+	for no files case.
+	(close_redir): Remove file from redirection list even if fp is
+	stdout or stderr.
+
+Tue Feb 24 12:11:34 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex_internal.c (build_wcs_upper_buffer): Enclose `offsets_needed'
+	label in `#ifdef _LIBC' to silence `unused label' compiler warning.
+
+Tue Feb 24 11:57:18 2004  Nelson H.F. Beebe  <beebe@math.utah.edu>
+
+	* regcomp.c (parse_expression): Add cast to (unsigned char *) in calls
+	to `build_charclass_op'.
+	* regex_internal.c (build_wcs_buffer): Add cast to char* in call to
+	`wcrtomb'.
+	* regex_internal.h (bitset_not, bitset_merge, bitset_not_merge,
+	bitset_mask, re_string_char_size_a, re_string_wchar_at,
+	re_string_elem_size_at): Change to use prototypes.
+	(re_string_char_size_at, re_string_wchar_at, re_string_elem_size_at):
+	Declare as `internal_function'.
+
+	* Makefile.am: Add rule to make .i files.  This assists in debugging.
+	* awk.h (m_tree_eval): Add casts to NULL.  (Some compilers are just
+	dumb. ADR)
+
+Mon Feb 23 15:58:39 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Clean up occupied process slots of children that have died:
+
+	* awk.h (child_catcher): New function, declare it.
+	* main.c (main): Catch SIGCHLD/SIGCLD with `child_catcher'.
+	* io.c (child_died): New static variable.
+	(child_catcher): New function, sets `child_died', reinstalls self
+	as signal handler.
+	(close_rp): New function: isolates actual fp/iop closing logic.
+	(close_redir): Call `close_rp'.
+	(get_a_record): Check `child_died' and call `wait_any(0)' if so.
+	Add descriptive comment.
+
+	Unrelated clean up:
+
+	* eval.c (fcalls): Renamed from `fcall_list'. All uses changed.
+	(pop_fcall, push_args, dump_fcall_stack): Adjusted to use indexing
+	on `fcalls' instead of a pointer into it. Avoids hassles if `fcalls'
+	is realloc-ed during recursive tree_evals. Thanks to BWK.
+
+	* config.guess, config.sub: Updated from Savannah.
+
+2004-02-19  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.14.1.
+
+Wed Feb 18 12:40:09 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (rule): Use `msg' not `warning' for `must have an
+	an action part' message.  `warning' is wrong, since it's a real error.
+
+Mon Feb 16 12:17:39 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c, eval.c, builtin.c: Change test for `#ifdef HAVE_LOCALE_H'
+	to `#if ENABLE_NLS && defined(HAVE_LOCALE_H)' so that builds with
+	`configure --disable-nls' will actually work on non-glibc systems.
+
+Thu Feb 12 02:05:34 2004  Stepan Kasal  <kasal@ucw.cz>
+
+	Lots of misc changes from Stepan Kasal integrated.
+
+	* array.c: Various variables and parameters of static functions
+	changed from int to long, in order to prevent overflow.
+
+	* eval.c (make_scalar): New function; takes care of everything
+	that has to be done when a node of type Node_var_new or
+	Node_array_ref changes to a scalar variable.
+	(tree_eval, get_lhs): Call it.
+	(tree_eval): From now on, tree_eval(NULL) doesn't work;
+	it reports an internal error.
+	* awk.h (m_tree_eval): Likewise for the two macro versions.
+	* awkgram.y (statement): Make sure the Node_K_return's lnode is
+	always the return value, never NULL.
+
+	* Makefile.am (install-exec-hook, uninstall-links): Make use of
+	$(VERSION).
+	(INCLUDES): Renamed to AM_CPPFLAGS.
+	(AM_CPPFLAGS): The file libintl.h is generated in the
+	build subdirectory intl, not in the directory $(srcdir)/intl.
+	(diffout): New target is an alias for ``make -C test diffout.''
+	* awklib/Makefile.am (INCLUDES): Renamed to AM_CPPFLAGS.
+
+	* README_d/README.hpux: Change the whitespace in the appended patch,
+	so that it applies to the current source.
+	* posix/gawkmisc.c: Change a tab to a space (needed for the above).
+
+	Make version control more in the style of current autotools:
+
+	* configure.ac: Remove obsolete versions of macros:
+	AM_INIT_AUTOMAKE doesn't need any parameters.
+	AC_OUTPUT shouldn't have any parameters either.
+	Its parameters go to a new macro: AC_CONFIG_FILES.
+	AC_CONFIG_HEADERS moved near the end of the file.
+	* configure.ac: Add [version.c:version.in] to AC_CONFIG_FILES
+	* version.in: Modify for autoconf substitutions.
+	* version.c: Remove, it's generated at configure time now.
+	* fixvers, patchlev.h, unsupported/tandem/ptchlvl.h: Nuke and ...
+	* Makefile.am, main.c: ... forget them.
+
+Mon Feb  9 12:57:00 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h builtin.c eval.c field.c (HUGE): Changed to `UNLIMITED'.
+	Avoids possible conflict with constant in svid-mode math.h. Thanks to
+	Roman.Putanowicz@iecn.u-nancy.fr for pointing out the problem.
+
+Fri Feb  6 12:09:55 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Check for `wctype', `wcscoll' and `iswctype'.
+	* mbsupport.h: New file. Merges and centralizes testing for MBS support.
+	* Makefile.am (base_sources): Add mbsupport.h to list.
+	* dfa.c, dfa.h, awk.h (MBS_SUPPORT): Include "mbsupport.h" and use the
+	test there.
+	* regex_internal (RE_ENABLE_I18N): Same.
+
+	* Makefile.am (CLEANFILES): Added.
+
+Thu Feb  5 18:05:12 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac (HAVE_WCTYPE_T): New test code added.
+	* dfa.h (wctype_t): Define if system doesn't. Needed here too
+	for other files that include dfa.h.
+	* dfa.c (wctype_t): Define if system doesn't.
+	(lex): Manually fill in arrays used for char class range testing
+	so will work on c89 and older compilers.
+	(parse_bracket_exp_mb): Split up an assignment to avoid type complaints.
+
+	* main.c (main): When checking for `close_io' failure, only set
+	`exit_val' to 1 if not already exiting.
+
+	* regcomp.c (regerror): Remove use of mempcpy.  Generates too
+	many compiler warnings.
+	* configure.ac (AC_CHECK_FUNCS): Don't bother checking for it.
+
+Wed Feb  4 17:34:47 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getopt.h (__THROW): Only define it if C++. The __GNU_PREREQ
+	macro is a major headache.
+
+2004-02-02  Paolo Bonzini  <bonzini@gnu.org>
+
+	* regexec.c (check_matching): Add P_MATCH_FIRST parameter.
+	(re_search_internal): Pass new parameter to check_matching.
+	(check_matching): Unless a parenthesized group is found at the
+	beginning of the regexp, advance P_MATCH_FIRST until we entered
+	a state different from the initial state.
+
+Mon Feb  2 15:52:37 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (research): Change last param to re_search to pass
+	NULL if `need_start' is false.  May give us a marginal speed gain.
+
+Thu Jan 29 17:04:51 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (sub_common): Fix logic for `&' in replacement for
+	multibyte case.  Simplify code a bit.
+
+Tue Jan 20 10:41:45 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Add check for `memmove'.
+	* replace.c: Include missing_d/memmove.c if don't have `memmove'.
+
+Sun Jan 18 12:01:29 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (sub_common): Add comment and support for 2001 POSIX
+	behavior when --posix in effect.  The masses have been
+	clamoring for this one.
+
+2004-01-16  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.13.1.
+	* intl/*: Updated to 0.13.1.
+
+Fri Jan 16 08:16:38 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getopt.h, getopt.c, getopt1.c: Synced to GLIBC version:
+	getopt.c:	1.51
+	getopt.h:	1.18
+	getopt1.c:	1.9
+
+Thu Jan 15 15:28:48 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Here we go again:
+
+	* regcomp.c, regex.h, regex.c, regex_internal.h, regex_internal.c,
+	regexec.c: Sync to GLIBC version, but with bug fixes.  GLIBC
+	CVS versions:
+
+	regcomp.c: 1.76
+	regexec.c: 1.55
+	regex.c: 1.125
+	regex.h: 1.30
+	regex_internal.c: 1.39
+	regex_internal.h: 1.45
+	regexec.c: 1.55
+
+	* acinclude.m4: Removed, not needed for automake 1.8.x.
+	* configure.ac: Updated to autoconf 2.59.
+
+	Everything else updated to automake 1.8x and autoconf 2.59.
+
+Wed Jan 14 14:26:36 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c, dfa.h: Updated manually with most of the changes in
+	grep 2.5.1.  That version lost the ability to match newlines
+	in the data, so the merge had to be done by hand.  Sigh.
+
+2004-01-12  Paolo Bonzini  <bonzini@gnu.org>
+
+	ALLOCA patch from
+	http://sources.redhat.com/ml/libc-alpha/2004-01/msg00099.html
+	added.
+
+	* regcomp.c [_LIBC && !RE_ENABLE_I18N]:
+	Drop code to support this, it is never true.
+	(build_range_exp) [!_LIBC]: Do not create a range
+	in MBCSET for a single-byte character set.
+	(build_range_exp) [_LIBC]: Do not create a range
+	in MBCSET for a single-byte character set without
+	collation elements.
+	(init_dfa): Do not conditionalize on _LIBC, it
+	just makes the code less clear.
+	(parse_bracket_exp): Use NON_MATCH variable in
+	addition to "mbcset->non_match", not as an
+	alternative.
+	(build_charclass_op): Rename NOT parameter to
+	NON_MATCH, use it instead of declaring a variable. 
+	(parse_bracket_exp) [!_LIBC]: Pass NULL for MBCSET
+	if the character set is single-byte.
+
+Wed Jan  7 15:23:04 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (mk_rexp): Set n->re_cnt to 1. Makes reinstated
+	dfa code actually take effect!  Don't know how I missed this.
+
+	Unrelated: sync regex code to glibc.
+
+	* regcomp.c, regex.h, regex.c, regex_internal.h, regex_internal.c,
+	regexec.c: Sync to GLIBC version, but with bug fixes.  GLIBC
+	CVS versions:
+
+	regcomp.c: 1.74
+	regex.c: 1.124
+	regex.h: 1.30
+	regex_internal.c: 1.39
+	regex_internal.h: 1.43
+	regexec.c: 1.55
+
+	* regcomp.c (peek_token): Temporarily, we hope, disable \s and \S
+	operators.  Too much trouble to document right now.
+	* dfa.c (lex): Add code for \s and \S but disable it until
+	next release.
+
+Wed Dec 24 15:28:57 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (r_tree_eval): For Node_assign_concat, add
+	call `free_temp(r)'. Thanks to mary1john8@earthlink.net.
+
+Mon Dec  1 10:25:52 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	CONSTVAL not needed if we test PERM instead. Thanks to
+	mary1john8@earthlink.net. See test/concat3.awk.
+
+	* awk.h [CONSTVAL]: Removed.
+	* eval.c (flag2str): Removed CONSTVAL from table.
+	(r_tree_eval): For Node_assign_concat, it's enough to check
+	if l->flags has PERM clear.
+	* awkgram.y (yylex): Removed use of CONSTVAL for YSTRING and YNUMBER.
+
+Mon Nov  3 16:33:26 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (get_src_buf): Replace `memmove' with `memcpy' for
+	marginal portability gain to older systems.
+	* io.c (get_a_record): Ditto.
+
+Sun Nov  2 15:59:27 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h [CONSTVAL]: Renamed from `STRCONST'.
+	* eval.c (flags2str): Fix in table.
+	(r_tree_eval): For Node_assign_concat, check for the flag for
+	both left and right hand sides.  Also add a `force_string' call
+	for the right hand side and the left hand side.
+	* awkgram.y (yylex): Change flag value for YSTRING and add use
+	of flag for YNUMBER.
+
+Wed Oct 29 14:23:29 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h [STRCONST]: New flag value.
+	* eval.c (flags2str): Add it to table.
+	(r_tree_eval): For Node_assign_concat, check for the flag so that
+	we don't clobber string constants given:
+		s = ""
+		s = s something
+	* awkgram.y (yylex): For YSTRING, set STRCONST flag.
+
+Tue Oct 28 18:00:00 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Force SUBSEP to always have a string value. Per bug report
+	from mary1john8@earthlink.net.
+
+	* awk.h (NODETYPE): New type, Node_SUBSEP.
+	(set_SUBSEP): Add declaration.
+	* awkgram.y (isnoeffect, isassignable): Add Node_SUBSPEP case.
+	* array.c (set_SUBSEP): New function.
+	* eval.c (nodetypes): Add Node_SUBSEP.
+	(r_tree_eval, r_get_lhs): Add code for Node_SUBSEP.
+	* main.c (varinit): Use Node_SUBSEP as type for SUBSEP.
+	* profile.c (tree_eval, pp_lhs, is_scalar, prec_level): Handle
+	Node_SUBSEP.
+
+Tue Oct  7 09:26:33 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (NODETYPE): New member `Node_assign_concat'.
+	* awkgram.y (exp): Look for case of `x = x y' and if so, create a
+	Node_assign_concat.
+	* eval.c (interpret): Add case for Node_assign_concat.
+	* profile.c (prec_level): Ditto.
+	(tree_eval): Ditto.  For variables, call new function `vname' to
+	print name; handles varname field for -v variables, which end up
+	including the value.
+	(vname): New function.
+
+Wed Sep 24 17:32:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Speed up `avoid_dfa' kludge, at least a little:
+
+	* awk.h (struct Regexp): Add `has_anchor' member.  Make it and
+	`dfa' member shorts; keeps space the same.
+	* re.c (make_regexp): Set `has_anchor' member correctly.
+	(avoid_dfa): Test for `has_anchor' member instead of searching
+	for it each time.
+
+Sun Sep 21 18:34:32 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (state): Only needs to be 256 bytes, initstate() can't
+	use any more than that.  Well whadayaknow.
+	(do_rand, do_srand): Call `setstate' after calling `initstate'.
+
+Tue Sep 16 15:44:29 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (interpret): For Node_K_switch, add kludge_need_start stuff
+	as used in `match_op'.  Sigh.
+	* re.c (make_regexp): Add `no_dfa' variable, which is true if
+	GAWK_NO_DFA exists in the environment.  This enables run time
+	testing of things with/without the dfa matcher.
+
+Mon Sep 15 18:36:38 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	After much soul searching, reinstated old dfa code. The performance
+	of the new regex is just disastrous.  Sigh.
+
+	* awk.h (re_cnt): Reinstated old definition.
+	(struct Regexp): Added `dfareg' and `dfa' members.
+	(make_regexp): New last parameter in function, changed decl.
+	(avoid_dfa): Added declaration.
+	* awkgram.y (regexp, mk_rexp): Added use of `re_cnt'.  Fixed call
+	to `make_regexp'.
+	* Makefile.am: Add dfa.h and dfa.c.
+	* eval.c (match_op): Complexified: added call to `avoid_dfa' and
+	`kludge_need_start' variable where used to pass FALSE as last parameter
+	of research().
+	* field.c (set_FS): Fixed call to `make_regexp'.
+	* io.c (get_a_record, set_RS): Fixed calls to `make_regexp'.
+	* re.c (make_regexp): Added last paramter (`dfa') to function.
+	Complexified the code.
+	(re_update): Fixed call to `make_regexp'.
+	(research): Complexified the code, added calls to dfa stuff.
+	(dfaerror): New function.
+	(re_update): Fixed call to `make_regexp'.
+	(avoid_dfa): New function.
+
+Tue Sep  9 15:57:38 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (get_src_buf): Fix calculation of `offset' when shifting
+	source lines around.  In general, improve handling of things when
+	moving the source code line around.  What a mess this code is.
+
+Mon Sep  8 19:08:55 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (fmt_ok): Make provision for %F format and printf %'f flag
+	here too.
+
+2003-07-23  Christophe Bisiere  <bisiere@univ-tlse1.fr>  (tiny change)
+
+	* posix/regex.h (RE_TRANSLATE_TYPE): Define it to "unsigned char,"
+	to avoid problems at hosts with signed char.
+	* posix/regexec.c (re_search_internal): Don't say
+	"unsigned RE_TRANSLATE_TYPE."
+
+Thu Aug 28 11:09:41 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (nextfile): Change use of variable `files' to make it
+	clearer that it's a boolean flag.
+
+Tue Aug 26 22:58:15 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (useropen): Add `defined (HAVE_GETGROUPS)' as first test
+	in `#ifdef'.  Brings things in sync with same test in main.c and awk.h.
+
+Tue Aug 26 22:49:37 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dbug.h: New file.
+
+	* array.c, awkgram.y, builtin.c, eval.c, ext.c, field.c, io.c,
+	main.c, msg.c, node.c, profile.c, re.c: Converted to use
+	Fred Fish's `dbug' library.  By default compiled out, thus
+	not affecting speed.
+
+	For the nonce, the `dbug' library itself is not shipped with
+	gawk, since I expect no-one else but me to be using it.
+
+Thu Aug 21 23:15:36 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (numfiles): Change extern decl to long, to match what's
+	in main.c.  Keeps things working on 64-bit systems.  Thanks to bug
+	report from Jan Oravec <jan.oravec@6com.sk>.
+
+Wed Aug 20 14:53:47 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (genflags2str): Move test for out-of-space inside test
+	for is the bit set.
+
+Mon Aug 11 11:26:51 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c (parse_bracket_exp): If `build_charclass' fails, just pass
+	its value on as the return value.
+
+Sun Aug 10 16:59:14 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c (build_range_exp): Make sure we don't
+	get WEOF on range characters.
+
+Tue Aug  5 21:49:32 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (get_actual): In `case Node_param_list' add test for
+	`&& (symbol->flags & FUNC) == 0' to the if.
+
+Sun Jul 13 18:28:38 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Further bug fix:
+
+	* awkgram.y (variable): Give the new variable an lnode
+	of Nnull_string if it's not an array, even if it is
+	a Node_var_new.
+
+Fri Jul 11 09:32:21 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Bug fix:
+
+	* eval.c (r_tree_eval): For Node_array_ref, set
+	tree->orig_array->var_value to Nnull_string too.
+
+	Unrelated i18n and POSIX change:
+
+	* configure.ac: Add check for local printf supporting %F format.
+	* awk.h (loc): New variable declaration.
+	* main.c (loc): Defined.
+	(main): Call `localeconv' to set loc.
+	* io.c (format_tree): Add support for printf quote flag, %'d for
+	decimal formats (not %e, %E), adds thousand separator into value.
+
+2003-07-10  Paul Eggert  <eggert@twinsun.com>
+
+	* io.c (two_way_open): If /bin/sh cannot be executed, exit
+	with status 126 consistently.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+Mon Jul  7 09:55:49 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (copyleft, usage): Make sure to fflush output fp. Per Jim
+	Meyering, if error, exit non-zero.
+	* ext.c (get_argument): Fix array paramater handling.
+
+2003-07-06  Paul Eggert  <eggert@twinsun.com>
+
+	* builtin.c (do_substr): Issue better diagnostics when
+	d_substr and d_length are NaN, or when 0 < d_length < 1.
+	Be careful when comparing double to SIZE_MAX, as
+	the comparison might return the "wrong" answer when
+	`(double) SIZE_MAX' is a number that is not equal to
+	SIZE_MAX.
+	(do_gensub): Watch out for HOW values that are out of range
+	or are NaN.
+	(do_dcngettext): dcngettext wants an argument of type
+	unsigned long, not long, so use a value of that type.
+
+Fri Jul  4 10:58:02 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (main): Make option letter 'D' fall through into default
+	unknown case if not debugging. Let's us have just one version of
+	`optlist'.
+
+Thu Jun 26 15:25:57 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (get_actual): Undo Stepan Kasal change of 2003-06-17.
+	See test/match2.awk.
+
+Wed Jun 25 15:26:08 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_rand): Change calculation so that result
+	obeys constraint:  0 <= N < 1.  This is per history and POSIX.
+	Thanks to Nelson Beebe (beebe@math.utah.edu) for reporting
+	this issue.
+
+Mon Jun 23 15:13:39 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (rs1scan): Per advice from Bruno Haible, it's safe
+	to skip the multibyte checking code if RS is '\n'. See
+	the comment in the code.  Big performance improvement for
+	multibyte locales.
+
+2003-06-20  Stepan Kasal  <kasal@ucw.cz>
+
+	* eval.c (comp_func): If memcmp returns 0, we have to compare
+	the lengths.
+
+2003-06-19  Stepan Kasal  <kasal@ucw.cz>
+
+	* eval.c (interpret) <Node_K_arrayfor>: Use NULL, not 0, to
+	initialize the variable list.
+	(comp_func): Array indices no longer are string values,
+	you have to use ahname_str, ahname_len.
+
+Tue Jun 17 11:53:46 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (get_actual): Make check for isparam
+	smarter: also check for FUNC flag.
+
+2003-06-17  Stepan Kasal  <kasal@ucw.cz>
+
+	* array.c (get_actual): Even if canfatal is FALSE, don't
+	tolerate existence of things which can't happen.
+
+Mon Jun 16 16:21:44 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Removed m4/Makefile.
+	* m4/Makefile.am: Removed.
+
+2003-06-16  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* configure.ac (AC_OUTPUT): Add m4/Makefile.
+	(AM_GNU_GETTEXT_VERSION): Bump to 0.12.1.
+
+Sun Jun 15 20:45:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (get_a_record): Enhance logic to fill buffers to include
+	`|| no_data_left(iop)'.
+	(rs1scan): Fix logic for setting recm fields for multibyte
+	character case.
+
+2003-06-10  Stepan Kasal  <kasal@ucw.cz>
+
+	* awkgram.y (release_all_vars): Do not try to release a value of
+	Node_var_new; after get_lhs, use the lhs directly, do not try
+	to do (*lhs)->var_value; the Node_var case doesn't need
+	special treatment.
+	* builtin.c (do_match): `get_param' is successful iff it returns
+	Node_var_array---if the variable was new, get_param has already
+	changed the type.
+	* field.c (do_split): Likewise.
+
+Sun Jun 15 19:36:35 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (r_dupnode): Typo fix in hash tables: stptr -> ahname_str.
+	Thanks to mary1john8@earthlink.net.
+	* array.c (get_actual): Add `if (canfatal)' before call to
+	`cant_happen'.
+
+Sun Jun 15 19:25:49 2003  Patrick T.J. McPhee   <ptjm@interlog.com>
+
+	* awk.h (memcpy_ulong): Add ! WIN32 to ifdefs.
+
+Mon Jun  9 18:38:20 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* custom.h (hpux): Added stuff to (hopefully) get `tzset'
+	declared on HP/UX 10 and up.
+
+Mon Jun  9 17:12:24 2003  Patrick T.J. McPhee   <ptjm@interlog.com>
+
+	* awk.h (ATTRIBUTE_EXPORTED): New macro for dynamic libs on Windows32.
+	* CONVMFTidx, stack_ptr, do_lint, lintfunc: Now have this attribute.
+
+Mon Jun  9 13:11:33 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Clean up of Stepan's patches.
+
+	* array.c (get_actual): Renamed from r_get_array. Added second
+	param canfatal if routine should print fatal message when not an array.
+	(get_actual): Renamed 'prm' to `isparam'.
+	(array_vname): Add static msglen var; only realloc string if it grows.
+	Don't use `s += sprintf(...)'. No good on old systems where sprintf
+	returns char *.  Minor formatting cleanups.
+	(do_adump): Restored separate `a' and `r' variables; helps for debugging.
+
+	* awk.h (SCALAR, UNINITIALIZED): Removed entirely, renumbered other flags.
+	(get_array, get_param): New macros, calls get_actual.
+	(get_actual): Declaration changed from that of r_get_array.
+
+	* awkgram.y (release_all_vars): Restored previous version of code; new
+	version isn't right for Node_xx variables.
+	(variable): Minor code cleanup for readability.
+
+	* builtin.c (do_match): Use get_param and print our own message when
+	third parameter is not an array.
+
+	* eval.c: Added a few comments here and there, removed some no longer
+	needed comments.
+
+	* field.c (do_split): Use get_param and print our own message when
+	second parameter is not an array.
+
+Mon Jun  9 11:46:21 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (do_delete): Initialize hash1 and last to keep gcc -Wall happy.
+	* io.c (rsnullscan): Comment out label skip_leading for same reason.
+
+Wed May 28 08:31:23 CEST 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* eval.c (forloops_active, in_function): Nuked.
+	(pop_all_forloops, pop_fcall_stack): Are now inline.
+
+Wed May 28 07:58:35 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* field.c, awk.h (Null_field): No longer static.
+	* field.c (init_fields): Initial value of $0 can be Nnull_string,
+	no need to copy it.
+	* eval.c (r_get_lhs) <Node_field_spec>: Test for uninitialized field,
+	which is Nnull_string for $0 and Null_field for $(>0).
+	* builtin.c (do_print_rec): Test for uninitialized $0.
+
+Tue May 27 17:03:02 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* awk.h (Node_var_new): New node type for variables which can be
+	either scalar or array.  From now on, Node_var is always scalar.
+	(Node_gvar_ref): Nuked, its role can be taken by Node_array_ref.
+	(orig_var): Removed, orig_array is enough.
+	(SCALAR, UNINITIALIZED): Flags nuked.
+	(var_uninitialized): New macro to distinguish uninitialized vars;
+	used in several other macros.
+	* array.c (r_get_array, array_vname, do_adump): Adapt to the
+	above changes.
+	* awkgram.y, eval.c, field.c, main.c, node.c, profile.c: Ditto.
+
+Tue May 27 14:27:50 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* array.c (r_get_array): New function, which goes all the way
+	through Node_param_list to actual Node_var_array; if it encounters
+	non scalar Node_var, it changes it to Node_var_array.
+	(in_array, do_delete, do_delete_loop, do_adump, assoc_sort_inplace):
+		Use get_array.
+	(assoc_lookup): The parameter must be a Node_var_array.
+	* awk.h (get_array, r_get_array): Declare the new function and define
+	a macro to speed it up.
+	* builtin.c (do_match): Use get_array.
+	* eval.c (interpret) <Node_K_arrayfor>: Ditto.
+	(r_get_lhs) <Node_K_arrayfor>: Ditto.
+	* field.c (do_split): Ditto.
+
+Tue May 27 08:23:51 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	Changed node->vname meaning for type Node_array_ref and Node_gvar_ref.
+	It contains only the reference name; one has to (recursively) follow
+	node->prev_array to find out the call history for the array.
+
+	* array.c (array_vname): New function to print the array name.
+	(assoc_lookup, do_delete): Use array_vname.
+	* eval.c (interpret, r_tree_eval, r_get_lhs): Use array_vname.
+	(push_args, pop_fcall): Things have simplified.
+	* awk.h (array_vname): Declare.
+	(prev_array): Define.
+
+Sun Jun  8 11:25:36 2003  Stepan Kasal  <kasal@ucw.cz>
+
+	* awkgram.y (append_right): When using savetail, remember that it
+	is not necessarily the tail of the list---it's just a pointer to
+	the last chunk appended.
+
+Thu Jun  5 12:01:41 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_strtonum): Make `strtonum(13)' work.
+
+Wed Jun  4 17:07:06 2003  Corinna Vinschen  <vinschen@redhat.com>
+
+	* io.c (binmode): Include function for __CYGWIN__ too.
+
+Tue Jun  3 12:40:50 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (interpret): Node_K_switch.  For regex case, don't
+	call `free_temp' on the result of `force_string' if it's equal to
+	switch_value. Thanks to John DuBois <spcecdt@armory.com>
+	for finding the problem.
+
+Sun Jun  1 13:08:22 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): For %c, force precision to 1.
+
+Wed May 28 11:55:48 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (isnoeffect, isassignable): Add Node_TEXTDOMAIN to
+	switches in both functions.
+
+Wed May 28 11:38:59 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* awkgram.y (switch_body): Remove rule ``switch_body:/*empty/''
+	as ``switch_body:case_statements'' covers it---this disambiguation
+	fixes a reduce/reduce conflict.
+
+Sun May 25 16:23:43 2003  Corinna Vinschen  <vinschen@redhat.com>
+
+	* configure.ac: Remove linking against /usr/lib/automode.o.
+	* configure: Regenerate.
+
+Sun May 25 15:19:19 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* awk.h (get_lhs): For an initialized Node_var, you may return
+	the address of var_value pointer, no matter whether reference
+	bit was set or not.  We were silly slowing down most of the
+	assignements.
+
+	* (get_a_record): After grow_iop_buffer, move recm.rt_start even
+	if recm.len == 0.
+
+Mon May 19 16:55:59 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Code for C-style switch statements. Initial version contributed by
+	Michael Benzinger <Michael.Benzinger@sabre-holdings.com>.
+
+	Disabled by default, use `configure --enable-switch' to turn it on.
+
+	* configure.ac: New AC_ARG_ENABLE for switch statements.
+	* awk.h (NODETYPE): New types for switch, case, default keywords
+	and respective lists.
+	* awkgram.y: New productions for switch statement. Does checking to
+	avoid duplicate cases.
+	* eval.c (nodetypes): New entries for new NODETYPEs.
+	(interpret): New code to do switch execution.
+	* profile.c (pprint): New code to print switch statements.
+
+Mon May 19 15:05:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.ac: Renamed from configure.in.
+	* fixvers: Now looks in configure.ac.
+	* Makefile.am: Now cites configure.ac.
+
+	* Misc other: Updated to Automake 1.7.5.
+
+Sun May 18 12:03:56 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (do_delete_loop): Fix bracing of logic for
+	tests.
+
+Wed May 14 09:01:16 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	Misc patches:
+
+	* builtin.c (do_match): If third parameter to `match' is supplied,
+	store all subexpressions which are applicable, even though there
+	are some unused between them.
+
+	* awkgram.y (yylex): When returning from unterminated REGEXP
+	(which is /* kludge */), take care to fake a yylval, to
+	prevent ``internal error'' later.
+
+Sun May 11 15:51:00 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* io.c (rsnullscan, get_a_record): Boundary condition bug fixes.
+
+Sun May 11 15:15:20 2003  Scott Deifik  <scottd@amgen.com>
+
+	* awk.h: Add decls for `memcpy_ulong', `memset_ulong', and
+	MSC defines.
+	* regex.c: Include <stdio.h> if MSC for size_t.
+
+Mon May  5 15:11:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (get_a_record): Only tweak RT's value in place if the current
+	RS scanner is the same as the last one. Bug report submitted by
+	John DuBois (<spcecdt@armory.com>).
+
+Fri May  2 14:39:48 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (get_a_record): Add logic at end to be smart about setting
+	RT.  Saves considerable time, esp for default case where RS = "\n".
+
+Wed Apr 30 11:44:38 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (do_split): Add check and code for Node_gvar_ref.
+	* array.c (in_array, do_delete, asort_actual): Same.
+	* builtin.c (do_split): Same for 3rd arg array parameter.
+	* eval.c (interpret): Same for Node_K_array_for.
+	(push_args): Same for evaluating extra args.
+
+Tue Apr 29 15:54:28 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Record reading code redone/simplified considerably.
+
+	* awk.h (IOBUF): Removed total field, no longer used.
+	* io.c (at_eof, has_data, no_data_left): New macros.
+	(RECVALUE, SCANSTATE): New enumerated types.
+	(rs1get_a_record, rsnull_get_a_record, rsre_get_a_record): Removed.
+	(get_a_record): Rewritten, again. Now contains just buffer and
+	record code; searching code moved into these functions:
+	(rs1scan, rsnullscan, rsrescan): New functions to scan a buffer
+	for record contents and terminator. Fill in values in:
+	(struct recmatch): Holds found record and terminator.
+	(spec_setup): Set iop->dataend to indicate data is already in buffer.
+	(nextfile, inrec): Use new macros instead of flag and pointer tests.
+	(set_RS): Set scanning function instead of record function.
+
+	FWIW, it all passes `make test'.
+
+Sun Apr 27 21:02:39 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (do_close): At end, if do_posix return 0. See comment in code.
+
+Tue Apr 15 09:56:03 2003  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* configure.in: Check existence of wcrtomb, and wcscoll.
+	* configh.in: Likewise.
+	* configure: Re-generate.
+	Thanks to Kimura Koichi <kimura.koichi@canon.co.jp> for reporting.
+
+Sun Apr 13 16:02:10 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (main): Add call to `setlocale' for LC_NUMERIC after program is
+	parsed.
+	(arg_assign): Switch back to "C" locale for LC_NUMERIC for command
+	line assignments; this is per POSIX that period is decimal point for
+	program and command line assignments and the locale's separator
+	applies for input, output, and string to number conversion.
+
+2003-03-26  Paul Eggert  <eggert@twinsun.com>
+
+	* builtin.c [HAVE_INTTYPES_H]: Include <inttypes.h>.
+	[!HAVE_INTTYPES_H && HAVE_STDINT_H]: Include <stdint.h>.
+	(CHAR_BIT, INTMAX_MIN, UINTMAX_MAX): Define if the system does not.
+	(TYPE_SIGNED, TYPE_MINIMUM, TYPE_MAXIMUM): New macros, taken from
+	coreutils and many other GNU utilities.
+	(format_tree): When formatting, use widest possible integers
+	rather than settling with 'long'.
+	(do_lshift, do_rshift, do_and, do_or, do_xor, do_compl): Likewise,
+	when doing bitwise operations.
+	* configure.in (jm_AC_TYPE_LONG_LONG, jm_AC_TYPE_UNSIGNED_LONG_LONG,
+	jm_AC_TYPE_INTMAX_T, jm_AC_TYPE_UINTMAX_T): Add, since the mainline
+	code now needs this.
+	* doc/gawk.texi (Control Letters, Bitwise Functions): Document this.
+	* m4/intmax_t.m4: New file, taken from coreutils (but renamed to
+	avoid collision with our m4/inttypes.m4).
+	* m4/longlong.m4: New file, taken from coreutils.
+	* m4/uintmax_t.m4, m4/ulonglong.m4: Remove; superseded by the above
+	new m4 files.
+
+	* builtin.c (BITS_PER_BYTE): Remove; use CHAR_BIT instead, since
+	it's the standard name.
+	(do_lshift, do_rshift): Complain if the shift width is exactly equal
+	to the word size, too.
+
+Thu Mar 27 10:44:11 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (rs1_get_a_record, rsnull_get_a_record, rsre_get_a_record):
+	Enhance check for no data left in file to be only if file has
+	non-zero size.  Linux files such as /proc/filesystems stat as a
+	regular file of size 0, but actually have contents. Ugh.
+	Thanks to Martin Schlemmer <azarah@gentoo.org> for the bug report.
+
+Wed Mar 26 12:19:32 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): Add a lint warning at label `out_of_range'.
+
+Tue Mar 25 12:24:38 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (variable): For array subscript, if NAME is in the
+	symbol table, but not a variable, array, or parameter, generate
+	a syntax error.
+	(isarray): New function, tests if a symbol can be an array.
+
+	* custom.h: Add check for HP/UX, needed for GCC.
+
+Mon Mar 17 09:21:09 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Allow simultaneous manipulation of a global array directly
+	and when passed as a parameter.
+
+	* awk.h (Node_gvar_ref): New nodetype.
+	[orig_var]: New macro.
+	* array.c (do_delete_loop, do_delete): Add logic to handle
+	seeing Node_gvar_ref.
+	* eval.c (nodetypes): Add Node_gvar_ref.
+	(r_tree_eval, r_get_lhs): Add Node_gvar_ref case.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Wed Mar 19 14:08:11 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y: Production `program --> program error'. Add a return so
+	that we don't produce an infinite stream of error messages.
+	Thanks to Michael Mauch <michael.mauch@gmx.de> for pointing this out.
+
+Wed Mar 19 13:45:50 2003  Corinna Vinschen  <vinschen@redhat.com>
+
+	* regex.c [RE_ENBABLE_I18N]: Remove definition; the one in
+	regex_internal.h is better and makes things work with Cygwin.
+
+Tue Mar 11 11:54:20 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex_internal.h: Don't include <limits.h> after <regex.h> was
+	included in regex.c, since it could redefine RE_DUP_MAX to a lower
+	value.
+	(bitset_set, bitset_clear, bitset_contain): Use 1UL instead of 1 in
+	left shift operations.
+	* regex.c: Include <limits.h> before <regex.h>
+	* regcomp.c (re_compile_fastmap_iter, init_word_char, parse_expression):
+	Use 1UL instead of 1 in left shift operations.
+
+Mon Mar 10 15:45:37 2003  Corinna Vinschen  <vinschen@redhat.com>
+
+	* configure.in: Update CYGWIN case to add /usr/lib/automode.o.
+
+Thu Mar  6 11:07:36 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Updated to automake 1.7.3.
+
+	* config.guess, config.sub: Updated from prep.
+	* Makefile.am (AUTOMAKE_OPTIONS): Add dist-bzip2 to get .bz2 files.
+
+Tue Mar  4 10:40:46 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* version.in: Added goop for K&R compilers; forgot that I have to fix
+	this file which then is used to create version.c.
+
+Mon Mar  3 17:00:44 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: New option --disable-lint.
+	* awk.h (do_lint, do_lint_old): Conditionally declare based on NO_LINT.
+	* eval.c (set_LINT): Ifdef out body if NO_LINT.
+	* main.c (do_lint, do_lint_old): Conditionally compile properly.
+	(main): Handle --lint argument code.
+
+Fri Feb 28 10:43:07 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (main): Add LC_TIME to the things that get set with
+	setlocale().
+	* builtin.c (format_tree): Change test of `n0-- <= 0' to ==, avoids
+	VMS diagnostic.
+
+Thu Feb 27 17:48:29 2003  Pat Rankin  <rankin@pactechdata.com>
+
+	* regexec.c (proceed_next_node): Cast re_string_get_buffer to char *.
+	(get_subexp): Likewise.
+
+Tue Feb 25 12:33:41 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex_internal.h, regex_internal.c, regcomp.c, regexec.c:
+	Make MB_CUR_MAX into thread local variable re_mb_cur_max.
+
+	Unrelated, from Scott Deifik:
+
+	* io.c (grow_iop_buffer): Add checks for overflow of new buffer size.
+
+Mon Feb 24 13:30:59 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (gawk_mb_cur_max): Declared:
+	* main.c (gawk_mb_cur_max): Defined, init to 1.
+	(main): Initialize gawk_mb_cur_max.
+	* awkgram.y, builtin.c, eval.c, field.c, io.c, re.c (mb_cur_max):
+	Replaces all instances of MB_CUR_MAX, which is a function call (!)
+	in glibc.  Big speed up, especially for -Fx case, where x is a
+	single character.
+
+	Unrelated:
+
+	* awkgram.y (rule): For non-existent action, use a Node_K_print_rec
+	node.
+
+Sun Feb 23 15:45:20 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Speed up plain `print' and `print $0':
+
+	* awk.h (Node_K_print_rec): New node type.
+	(do_print_rec): Declare function.
+	* awkgram.y (simple_stmt): Create humongous test for plain `print'
+	or `print $0', and if so, use a Node_K_print_rec for it.  Modify
+	test for lint message.
+	* builtin.c (redirect_to_fp): New function for common code to get fp
+	and rp for do_print{,f,_rec} functions.
+	(do_print): Use redirect_to_fp().
+	(do_printf): Use redirect_to_fp().
+	(do_print_rec): New function to just print $0 from field_arr[0]
+	directly; will rebuild the record first if necessary.
+	* eval.c (nodetypes): Add Node_K_print_rec.
+	(interpret): Add Node_K_print_rec case.
+	* profile.c (pprint): Add Node_K_print_rec case.
+	(pp_print_stmt): If null lnode, print "$0" else print the lnode.
+
+	Unrelated:
+
+	* regex_internal.h: Add ENABLE_NLS to the condition for using
+	gettext so that --disable-nls really disables it.
+
+Sat Feb 23 22:46:00 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (rs1_get_a_record, rsnull_get_a_record, rsre_get_a_record):
+	Modify buffer-filling algorithm to always read one or more multiples
+	of the blocksize (iop->readsize).
+	(grow_iop_buffer): Make sure there's room for the current partially
+	read record and one disk block buffer.
+
+Thu Feb 20 22:02:00 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (research): Fix typo in cast of precision value to int.
+	* regex.h, regex.c, re_internal.h, re_internal.c, regcomp.c, regexec.c:
+	synced to GLIBC source, maintaining K&R portability changes, and bug
+	fixes, although losing ability to compile each file separately.
+	* Makefile.am (SOURCES): Moved placement of regex source files from here ...
+	(EXTRA_DIST): ... to here.
+
+Tue Feb 18 14:17:33 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (research): Cast precision value to int.
+	* builtin.c (format_tree): For toofew, cast field width value to int.
+	* io.c (rsre_get_a_record): Initialize restart and reend. Add a variable
+	to make sure they're set before used at end of function.
+	(iopflags2str): Removed decl at top and made not static so that GCC
+	stops complaining that it's defined but not used. Bleah.
+
+Mon Feb 17 11:02:34 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from prep.
+
+Sun Feb 16 15:47:15 2003  Scott Deifik  <scottd@amgen.com>
+
+	* awk.h (format_tree, make_str_node): Changed decls to match how
+	they are called.
+	* builtin.c (format_tree, sub_common): Same.
+	* node.c (make_str_node): Same.
+
+Wed Feb  5 14:18:01 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h: Removed duplicate decl of set_prof_file(). Removed
+	undef of const for non-ANSI C; config.h should handle it.
+	* msg.c (set_loc): Use srcfile and srcline in regular code to shut up
+	stupid SGI compiler.
+
+Tue Feb  4 14:28:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	All relevant files: Copyright year updated to 2003.
+
+Tue Feb  4 13:40:41 2003  Martin C. Brown  <mc@whoever.com>
+
+	* intl/libgnuintl.h: Preprocessor fixes for MacOS X.
+	* regex.h: Ditto.
+
+Tue Feb  4 13:39:37 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (builtin_func): New string for use in rationalizing
+	function parsing and installation code.
+
+Sun Feb  2 16:00:55 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Cache function body code pointer so that only have to find it the
+	first time a function is called.  This potential for optimization
+	brought to my attention by Stepan Kasal.
+
+	* awk.h [funcbody]: New macro.
+	* awkgram.y (FUNC_CALL): Set $$->funcbody to NULL.
+	* eval.c (func_call): Changed to take top-level Node_func_call as the
+	single parameter.  Do the lookup and caching.
+	(r_tree_eval): Change how func_call() is called in switch.
+	* profile.c (pp_func_call): Similar changes.
+	(tree_eval): Ditto.
+
+Sun Feb  2 15:32:42 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	ADR: More grammar rationalization/repair from Stepan.
+
+	* awkgram.y (common_exp, simp_exp): The rule from getline (without
+	pipe) has been moved from common_exp to simp_exp.
+
+	The redirection of print statements reworked.  The idea comes from
+	mawk-1.3.3; much thanks to Michael Brennan!
+
+	* awkgram.y (IO_OUT, IO_IN): New tokens.
+	(APPEND_OP, TWOWAYIO): Swallowed by the above ones.
+	(in_print, in_parens): New static variables, to trace whether
+	IO_OUT is expected.
+	(yylex): Emit the new tokens, update in_parens on '(' and ')'.
+	(exp): The print command(s) reworked.
+	(oputput_redir): Reworked.
+	(print_expression_list): New non-terminal.
+	(rexp, rexpression_list opt_rexpression_list): Nuked.
+	(exp, simp_exp): ``cmd|getline'' rule changed to
+	``cmd IO_IN getline'' and moved from exp to simp_exp.
+
+	Unrelated:
+
+	* awkgram.y (variable): Don't return Node_func, issue a fatal
+	error instead.
+	* eval.c (r_tree_eval, r_get_lhs): Omit special checks for Node_func,
+	nodes of this type cannot get into the program tree.
+	* profile.c (tree_eval, pp_lhs): Likewise.
+
+Thu Jan 30 17:42:05 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	ADR: Applied lots of patches from Stepan.
+
+	* array.c (do_delete_loop): Call after_assign for the loop index.
+	* field.c (do_split): The third argument to split(), sep, has to be
+	evaluated and the result dupnoded before assoc_clear is called,
+	similarily as src.  And we needn't to evaluate the third argument
+	if it's CONSTant regex and the first parameter is null string.
+	* awk.h (dupnode): Changed to macro, function renamed to r_dupnode.
+	* node.c (dupnode, r_dupnode): Rename.
+	* awkgram.y (parms_shadow): Return bool value, ...
+	(shadow_funcs): ... which will enable us to end the program if
+	lintfunc is fatal.
+	(program): Cleanup of the rules defining the ``program'' non-terminal.
+	(start, program, rule): No value associated,
+	expression_value is now treated similarily as begin_block and end_block.
+	(pattern, rule): Bison actions for non-terminal `pattern' now
+	add a new rule to the appropriate Node_rule_list, action for
+	non-terminal `rule' now only adds the associated code block
+	to the rnode of Node_rule_node.
+	(io_allowed): Renamed to !begin_or_end_rule.
+	(append_pattern): New function, adds new Node_rule_node to a rule_list.
+	(mkrangenode): Deleted, this tiny function was called only once.
+	(function_body): Non-terminal replaced by `action'.
+	(statements, action, statement): `statements' can now be empty;
+	both callers had to accomodate to this.
+	(statements): Don't call isnoeffect($2->type) if
+	$2 happens to be NULL.
+
+Mon Jan 27 14:12:19 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (iop_close): Based on report by Stepan Kasal and because of
+	his changes, don't call reset_record() when saving a copy of contents
+	of $0.
+	* awkgram.y: Improved function parsing error messages for case where
+	user uses a builtin name as a function name.  Based on error report
+	by Stepan Kasal.
+	* ext.c (make_builtin): Set FUNC flag for new function.  Based on error
+	report by Stepan Kasal.
+
+Mon Jan 27 14:06:20 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* field.c (reset_record): No longer call set_record(), the code is
+	moved to the function body.  Do not set MAYBE_NUM.
+	(set_record): Call reset_record() to perform the common tasks.
+	The prototype has changed, change awk.h and all callers.
+
+Mon Jan 27 10:50:03 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (NODE): `proc' renamed to `builtin,' to fix a conflict
+	on some systems.  Replaced on all spots where it was used.
+
+Sun Jan 26 11:52:01 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h [NUMSUBPATS]: New macro.
+	* builtin.c (do_match): Use it in loop that fills in subpattern info.
+	* eval.c (r_tree_eval): For Node_assign, don't call free_temp(),
+	as assign_val() contains dupnode(), which would clear the TEMP
+	flag. From Stepan Kasal <kasal@math.cas.cz>.
+	* config.sub: Updated from prep.
+
+Sun Jan 19 22:34:01 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (do_asorti): Add declaration.
+	* awkgram.y (tokentab): Add asorti() function to table.
+	* array.c (ASORT_TYPE): New enumerated type for VALUE or INDEX array
+	sorting.
+	(assoc_sort_inplace): New second arg of type ASORT_TYPE. Additional code
+	to rearrange array so rest of merge-sorting works; basically values are
+	tossed and index moved into value spot.
+	(asort_actual): Renamed from do_asort(). Takes new ASORT_TYPE argument.
+	(do_asort): Calls asort_actual(tree, VALUE).
+	(do_asorti): Calls asort_actual(tree, INDEX).
+
+	* main.c (load_procinfo): Free groupset array when done with it.
+
+Thu Jan 16 18:30:50 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_match): Revised to provide start and length
+	indices in array 3rd parameter.
+	* config.guess, config.sub: Updated from prep.
+
+Thu Jan  2 11:09:12 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Updated to bison 1.875.
+
+Tue Dec 31 17:14:45 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Updated things to automake 1.7.2 and autoconf 2.57.
+
+Tue Dec 31 16:54:44 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h [IOP_CLOSED]: New flag.
+	* io.c (iop_close): Set IOP_CLOSED flag.
+	(inrec): Check for IOP_CLOSED; if set return EOF.
+	(rs1_get_a_record, rsnull_get_a_record): Check for EOF before
+	refilling buffers.
+	(rsre_get_a_record): Ditto. Also, set RT before updating pointers in IOP.
+	* Makefile.am (efence): New target to compile with Electric Fence.
+
+2002-12-23  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* awk.h (catchsig): Delete prototype.
+	* main.c (catchsig): Make static and remove excess argument.
+	(main): Delete unnecessary casts.
+	* io.c (rs1_get_a_record, rsnull_get_a_record): Mark parameter
+	with ATTRIBUTE_UNUSED.
+
+Mon Dec 23 11:54:07 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex_internal.h, regex_internal.c, regcomp.c, regexec.c, version.c:
+	Fixed to compile, once again, under K&R compilers.
+	* io.c (grow_iop_buffer): Fix calculation of new size to
+	first subtract 2, double, then add 2 back in.
+
+Fri Dec 20 11:48:42 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	get_a_record split into three routines.
+
+	* awk.h (IOBUF): Structure reworked for new code.
+	* io.c (get_a_record): Now a pointer to different functions.
+	(rs1_get_a_record, rsnull_get_a_record, rsre_get_a_record): New functions.
+	(iop_alloc, iop_close): Reworked for new structure.
+	(do_getline, inrec): Modifiend for new EOF condition.
+	(iopflags2str): New routine.
+
+Fri Dec 20 11:05:50 2002  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regex.c, regex_internal.c, regex_internal.h: Changes to allow separate
+	compilation of the reg*c files.
+	* regcomp.c: Fix bug in using translation tables with [[:upper:]] etc.
+	* Makefile.am: Move regex files into sources from EXTRA_DIST. (ADR)
+
+Mon Dec  9 14:20:42 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	* main.c (main): When processing option '-f' don't ignore spaces
+	if optarg points at the beginning of the current argument
+	(like ``gawk -f " " file'').
+
+2002-11-30  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* awkgram.y (stopme): Mark parameter with ATTRIBUTE_UNUSED.
+	(yyerror): Add ATTRIBUTE_PRINTF_1.
+	* builtin.c (do_systime, do_rand): Likewise.
+	* field.c (set_field, re_parse_field, def_parse_field,
+	posix_def_parse_field, null_parse_field, sc_parse_field,
+	fw_parse_field): Likewise.
+	* io.c (pidopen, useropen): Likewise.
+	* main.c (catchsig): Likewise.
+	* profile.c (init_profiling): Likewise.
+	* awk.h (err): Add ATTRIBUTE_PRINTF.
+	* msg.c (err): Delete redundant prototype.  Fix format specifier.
+
+Wed Nov 27 06:04:20 2002  Pat Rankin  <rankin@pactechdata.com>
+
+	* ext.c [#if !DYNAMIC] (do_ext): Cast string value for error node.
+
+Sun Nov 24 18:23:29 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	From Paul Eggert, with some edits by me.
+
+	* builtin.c (do_substr): Consistently use floating point
+	values for lint messages, so they should be printed pretty
+	much as the user saw them.  Check for overflow before
+	converting floating point to integer.  Do the right thing with
+	NaNs.
+
+	Check for index out-of-range before checking for length
+	out-of-range, to avoid some nasty effects if address
+	arithmetic overflows (e.g., indx + length < index).
+
+	Allow zero-length substrings when checking for lint if
+	do_lint == LINT_INVALID.
+
+Sun Nov 24 18:21:06 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (LINT_ALL, LINT_INVALID): New constants.
+	* main.c (main): Allow --lint=invalid which restricts warning to
+	things that aren't valid.
+	* eval.c (set_LINT): Update setting logic.
+
+Wed Nov 20 13:14:58 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (lintfunc): Improve ifdef for attribute to only
+	work for GCC 3.2 and later.
+	* io.c (PIPES_SIMULATED): Don't define if on AIX, which
+	does define TANDEM in one of its header files. Ugh.
+
+Tue Nov 19 15:33:55 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_substr): Use %lu in warnings instead of %d.
+
+Mon Nov 18 14:42:53 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* config.guess: Synced from ftp.gnu.org.
+	* config.sub: Ditto.
+
+Sun Nov 17 21:32:49 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Updated things to automake 1.7.1.
+
+Sun Nov  3 14:33:30 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (r_get_lhs): For variables, always clear UNINITIALIZED,
+	since the variable is about to be assigned to. From Stepan Kasal.
+
+Fri Nov  1 11:19:01 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (lintfunc): Can only supply attributes for a function
+	pointer if GCC >= 3.  Added ifdefs.  Bah, humbug.
+
+2002-10-30  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* array.c (array_init, concat_exp, assoc_find, do_delete):
+	Const-ify.
+	* awk.h (redirect, set_record, pp_func, pp_string_fp, format_val,
+	parse_escape, make_regexp, research, reisstring, remaybelong):
+	Likewise.
+	* awkgram.y (dumpintlstr, dumpintlstr2, func_use, dup_parms,
+	var_comp, finfo, fcompare, func_use, dumpintlstr, dumpintlstr2):
+	Likewise.
+	* builtin.c (stdfile, do_fflush, do_index, category_table):
+	Likewise.
+	* eval.c (push_forloop, push_args, PUSH_BINDING, RESTORE_BINDING,
+	cmp_nodes, op_assign, loop_info, fcall, fmt_ok, set_LINT,
+	comp_func): Likewise.
+	* ext.c (do_ext): Likewise.
+	* field.c (set_record): Likewise.
+	* io.c (gawk_popen, two_way_open, binmode, redirect, getredirect,
+	fatal): Likewise. 
+	* node.c (values, format_val, make_str_node, parse_escape): Likewise.
+	* profile.c (pp_string, pp_match_op, pp_func, pp_string,
+	pp_string_fp): Likewise.
+	* re.c (make_regexp, research, reisstring, remaybelong): Likewise.
+
+2002-10-30  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* awk.h (__attribute__, ATTRIBUTE_UNUSED, ATTRIBUTE_NORETURN,
+	ATTRIBUTE_PRINTF, ATTRIBUTE_PRINTF_1, __extension__): Define.
+	(emalloc, erealloc): Fix format specifier warnings.
+	(do_nextfile):Mark with ATTRIBUTE_NORETURN.
+	(getredirect): Const-ify.
+	(msg, error, warning, r_fatal, lintfunc): Mark with
+	ATTRIBUTE_PRINTF_1.
+	(r_fatal): Mark with ATTRIBUTE_NORETURN.
+	* builtin.c (format_tree): Fix format specifier warning.
+	* eval.c (interpret): Likewise.
+	* main.c (usage, copyleft, catchsig, nostalgia, version): Mark
+	with ATTRIBUTE_NORETURN.
+	* profile.c (dump_and_exit): Likewise.
+
+2002-10-29  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* array.c (array_init): Use ISDIGIT, not isdigit.
+	* awk.h (m_tree_eval, force_number, force_string): Use
+	__extension__ in statement expressions.
+	* main.c (lintfunc): Fix !__SDTC__ case.
+	* regex_internal.c (calc_state_hash): Fix inline declaration.
+	* regexec.c (proceed_next_node): Cast assignment to correct type.
+
+2002-10-29  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* awk.h (exp_node, Func_ptr): Add prototype arguments.
+	* awkgram.y (yystype, token, getfname, nextc, pushback,
+	allow_newline, yylex): Likewise.
+	* io.c (wait_any): Likewise.
+	* profile.c (indent_in, indent_out): Likewise.
+	* random.h (random): Likewise.
+
+2002-10-29  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* array.c (grow_table): Const-ify.
+	* awk.h (RE_TRANSLATE_TYPE): Define.
+	(flagtab, casetable): Const-ify.
+	(getfname, shadow_funcs, redflags2str): Prototype.
+	(flags2str, genflags2str, nodetype2str, redflags2str, set_loc,
+	msg, error, warning, r_fatal): Const-ify.
+	* awkgram.y (tokentab, snode): Likewise.
+	* builtin.c (format_tree, do_strftime,
+	localecategory_from_argument): Likewise.
+	* eval.c (casetable, nodetypes, nodetype2str, flags2str,
+	genflags2str): Likewise.
+	* io.c (redflags2str, socketopen): Likewise.
+	* main.c (varfile, version_string, lintfunc, optab, copyleft,
+	varinit, init_vars): Likewise.
+	* msg.c (srcfile, msg, warning, error, set_loc, r_fatal):
+	Likewise.
+	* profile.c (pp_op_assign, pp_match_op, pp_redir): Likewise.
+	* random.c (sccsid): Likewise.
+	* version.c, version.in (version_string): Likewise.
+
+Tue Oct 29 10:50:52 2002  Arnold D. Robbins   <arnold@skeeve.com>
+
+	* configure.in: Update version in AC_INIT and AM_INIT_AUTOMAKE
+	* fixvers: Make grep for pattern a little smarter.
+
+Mon Oct 28 16:35:39 2002  Arnold D. Robbins   <arnold@skeeve.com>
+
+	* awk.h (hash): Now a function pointer.
+	* array.c (gst_hash_string, scramble): New functions.
+	(awk_hash): Renamed from hash.
+	(hash): Now a function pointer.
+	(array_init): Change hash function based on environment for
+	experimentation.
+
+Mon Oct 28 13:21:20 2002  Arnold D. Robbins   <arnold@skeeve.com>
+
+	Applied lots of patches from Stepan Kasal, tweaked as needed
+	for current code base.
+
+	* node.c (dupnode): When n->stref overfows, flag the node as PERM.
+	Same for n->ahname_ref.
+	(unref): Remove the check for n->stref == LONG_MAX and
+	n->ahname_ref == LONG_MAX.
+	* awk.h (make_string): The third argument to make_str_node changed
+	from FALSE to 0, it's not Boolean.
+	(free_temp): Evaluate the argument only once, so that we
+	can call free_temp(tree_eval(n)) for achieving side effects.
+	(load_environ, load_procinfo): Changed return type to NODE *.
+	* main.c (load_environ): The ENVIRON_node should be created with type
+	Node_var_array and lnode set to NULL.  Return pointer to the created node
+	and create an empty hash even on TANDEM.
+	(load_procinfo): Same mods for PROCINFO_node.
+	(init_args): ARGV_node should also have lnode set to NULL.
+	* eval.c (r_tree_eval): case Node_assign moved just above the other
+	assignment cases.
+	(op_assign): ++ and -- cases merged with += and -=, respectively.
+	(push_args): Evaluate all args, even in cases where more args are
+	supplied then required.
+	(interpret): In case Node_K_forarray, flag the variable
+	num_elems also as volatile, so that it survives longjmp() and
+	can be trusted when linting code.
+	(r_get_lhs): Case Node_param_list was unreachable (unless
+	something breaks really badly), remove it;
+	(r_tree_eval): Case Node_var_array removed from the last switch,
+	it was caught in the first switch above.
+	* profile.c (tree_eval): Again, case Node_var_array was caught above.
+	* awkgram.y (variable): Code simplified, making use of the above
+	changes.
+	* field.c (sc_parse_field): IGNORECASE only applies to regex based
+	field-splitting, so remove code that pays attention to it.
+	(do_split): Don't use parse_field if RS_is_null.
+	(set_FS): Beware of FS == "\\" even if RS_is_null.
+
+	Code changes to make things work better:
+	* field.c (set_FS): Don't use cmp_nodes() to compare old and new
+	value of FS, that uses IGNORECASE, which is a bad idea. Improve
+	logic for choosing sc_parse_field.  Ensure that when RS_is_null
+	but using a single character, that we do pay attention to
+	case when doing regex splitting.
+	* io.c (set_RS): Don't use cmp_nodes() to compare old and new
+	value of RS, that uses IGNORECASE, which is a bad idea.
+
+Mon Oct 28 09:43:14 2002  Arnold D. Robbins   <arnold@skeeve.com>
+
+	* recomp.c (parse_expression): Change return statement into
+	two so it'll compile for SGI cc.
+
+	* awk.h (STR, CUR): Changed to STRCUR and NUMCUR respectively,
+	to avoid conflict with STR on some System V systems.  Changed
+	in all source files.
+
+Thu Oct 24 16:14:34 2002  Arnold D. Robbins   <arnold@skeeve.com>
+
+	* array.c (AVG_CHAIN_MAX): Now a variable, to allow easy experimentation.
+	(array_init): Pulls a new value from env var AVG_CHAIN_MAX if it
+	exists and sets the variable.
+	* awk.h: Add declaration for array_init().
+	* main.c (main): Call array_init().
+
+Tue Oct 22 11:23:56 2002  Arnold D. Robbins   <arnold@skeeve.com>
+
+	* bisonfix.sed: Updated for current bison. Death to alloca!
+
+2002-10-21  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* builtin.c (tolower, toupper): Add casts to char* to fix some
+	compiler warnings.
+	* eval.c (cmp_nodes): Ditto.
+	* regcomp.c (peek_token_bracket): Skip the byte already read.
+
+Wed Oct 16 15:02:09 2002  Arnold D. Robbins   <arnold@skeeve.com>
+
+	* io.c (set_RS): Make sure to always call set_FS().
+
+2002-10-11  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regcomp.c (re_compile_fastmap_iter): Remove the handling
+	OP_CONTEXT_NODE.
+	(regfree): Likewise.
+	(create_initial_state): Likewise.
+	(analyze): Remove the substitutions which became useless.
+	(calc_first): Likewise.
+	(calc_epsdest): Use edests of OP_BACK_REF in case that it has
+	epsilon destination.
+	(duplicate_node_closure): New function.
+	(duplicate_node): Remove the handling OP_CONTEXT_NODE.
+	(calc_inveclosure): Likewise.
+	(calc_eclosure): Likewise.
+	(calc_eclosure_iter): Invoke duplicate_node_closure instead of
+	direct invocation of duplicate_node.
+	(parse): Don't use comma operator in the return to avoid compiler
+	warning.
+	(parse_reg_exp): Likewise.
+	(parse_branch): Likewise.
+	(parse_expression): Likewise.
+	(parse_sub_exp): Likewise.
+	(parse_dup_op): Likewise.
+	* regex_internal.c (re_dfa_add_node): Remove the substitutions
+	which became useless.
+	(create_ci_newstate): Remove the handling OP_CONTEXT_NODE.
+	(create_cd_newstate): Likewise.
+	* posix/regex_internal.h (re_token_type_t): Remove the obsolete type.
+	(re_token_t): Likewise.
+	(re_dfa_t): Likewise.
+	(re_node_set_remove): New macro.
+	* regexec.c (check_matching): Remove the handling
+	OP_CONTEXT_NODE.
+	(check_halt_node_context): Likewise.
+	(proceed_next_node): Likewise.
+	(pop_fail_stack): Fix the memory leak.
+	(set_regs): Likewise.
+	(free_fail_stack_return): New function.
+	(sift_states_backward): Fix the memory leak.  Remove the handling
+	OP_CONTEXT_NODE.
+	(update_cur_sifted_state): Append some if clause to avoid redundant
+	call.
+	(sub_epsilon_src_nodes): Use IS_EPSILON_NODE since it might be a
+	back reference.
+	(check_dst_limits): Remove the handling OP_CONTEXT_NODE.
+	(check_subexp_limits): Likewise.
+	(search_subexp): Likewise.
+	(sift_states_bkref): Likewise.
+	(transit_state_mb): Likewise.
+	(transit_state_bkref_loop): Likewise.
+	(transit_state_bkref_loop): Likewise.
+	(group_nodes_into_DFAstates): Likewise.
+	(check_node_accept): Likewise.
+	(sift_ctx_init): Add initializing.
+
+Tue Oct 15 14:18:53 2002  Arnold D. Robbins   <arnold@skeeve.com>
+
+	* eval.c (set_IGNORECASE): Call set_RS() instead of
+	set_FS_if_not_FIELDWIDTHS().  The former calls the latter
+	for us, and also makes IGNORECASE affect RS like it's supposed to.
+	* field.c (FS_re_yes_case, FS_re_no_case): New variables.
+	(set_FS): Smarten up routine to not recompile FS_regexp if all
+	that's changed is IGNORECASE or if switching back to FS from
+	FIELDWIDTHS.  Significant speed-up for cases where IGNORECASE
+	is assigned to for every record.
+	* io.c (RS_re_yes_case, RS_re_no_case): New variables.
+	(set_RS): Similar changes as to set_FS().  In particular,
+	IGNORECASE changing now affects record splitting too.
+	* re.c (refree): Set rp->pat.tranaslate to NULL. It comes
+	from casetable and shouldn't be freed. (Strictly necessary
+	only for old regex, but a good idea anyway).
+	Also, call regfree(& rp->pat) instead of manually free()ing
+	things, since there's dynamically allocated stuff hiding in
+	the buffer. Avoids a memory leak.
+
+Mon Oct 14 12:02:39 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Major space reduction in array management.  Overhead reduced
+	to two NODE's per element from three.
+
+	* awk.h (ahash): Union is gone.
+	(hash.ref): New union member.
+	(ahnext): New definition into hash union.
+	(ahvalue): New definition into hash union.
+	(ahname_str): New member, points into hash union.
+	(ahname_len): New member, points into hash union.
+	(ahname_ref): New member, points into hash union.
+	* array.c: Replaces uses of ahname member with string and
+	length.  Set the reference count correctly to 1 on new nodes.
+	* eval.c (interpret): Case for Node_K_arrayfor.  dupnode() the
+	array indices, and set loop variable to new value made via
+	make_string().
+	* node.c (unref, dupnode): Node_ahash nodes are now also
+	reference counted, a la strings.  Similar code is used to
+	increment/decrement the counts, and/or copy nodes as
+	needed.
+
+	Unrelated:
+	* awk.h (forsub): Removed. Not used.
+
+Sun Oct 13 16:58:27 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	* profile.c (pprint): #undef the temporary defines at the end
+	of the case.
+	* eval.c (interpret): Likewise.
+	(assign_val): We can unref() before doing dupnode().
+	Also, move the check for NF < 0 from here ...
+	* field.c (set_NF): ... to here.
+	* main.c (varinit): No need to call set_NF().
+	* awkgram.y (statements): Don't be so generous when concatenating
+	`statements' with a `statement'.
+
+
+2002-10-13  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regcomp.c: Synced with development sources.
+	* regex_internal.c: Synced with development sources.
+	* regex_internal.h: Synced with development sources.
+	* regexec.c: Synced with development sources.
+
+Sun Oct 13 21:35:35 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (NODE): Reflags is now unsigned long for:
+	(exec_count): Defined to be sub.nodep.reflags.  Using `number'
+	broke pgawk.
+	* profile.c (Node_K_delete_loop): Print out as a for loop
+	with a comment that it's internally the same as `delete array'.
+	* eval.c (Node_K_delete_loop): Increment the exec_count. Ooops.
+	* configure.in (AM_GNU_GETTEXT_VERSION): New macro call.
+	* custom.h: Updated description of the file at the top.
+
+Thu Oct 10 16:39:51 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (vname, exec_count): Now macros into different
+	parts of the NODE structure that can be safely used for them.
+	Saves 16 bytes per NODE.
+	* eval.c: Changed use of `vname' to `varname' to avoid new
+	macro.
+	* main.c (lintfunc): Made ifdefed decls match awk.h.
+	* eval.c (comp_func): Use memcmp instead of strcmp.
+	* configure.in (AC_CONFIG_HEADER): Physically append custom.h
+	to config.h to avoid subdir compiliation problems.
+
+Sun Oct  6 17:36:15 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Updated to automake 1.7 and bison 1.50.
+
+	* INSTALL: Replaced with current version from automake 1.7.
+	* config.guess: Replaced with current version from automake 1.7.
+	* config.sub: Replaced with current version from automake 1.7.
+	* depcomp: Replaced with current version from automake 1.7.
+	* doc/texinfo.tex: Replaced with current version from automake 1.7.
+	* install-sh: Replaced with current version from automake 1.7.
+	* missing: Replaced with current version from automake 1.7.
+	* mkinstalldirs: Replaced with current version from automake 1.7.
+	* ylwrap: Replaced with current version from automake 1.7.
+
+	* configure.in (DYNAMIC):  Updated AC_DEFINE(DYNAMIC) to
+	three-argument form for autoheader.
+	* acinclude.m4: Removed includes of jm-mktime.m4 and
+	largefile.m4, which are now standard parts of Autoconf.
+
+	* Makefile.in: Regenerated.
+	* aclocal.m4: Regenerated.
+	* awkgram.c: Regenerated.
+	* awklib/Makefile.in: Regenerated.
+	* configure: Regenerated.
+	* doc/Makefile.in: Regenerated.
+	* test/Makefile.in: Regenerated.
+
+Sun Sep 29 16:47:49 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* custom.h (__WIN32__): Added from gnuwin32 project, via
+	Stepan Kasal.
+
+	* awkgram.y: For tawk compatibility, added `delete(array)'.
+	To remain undocumented, since it's WAY non-standard.
+
+Sun Sep 22 22:23:50 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (re_cnt): Removed, not needed since no dfa code.
+	* awkgram.y (regexp, a_regexp): Removed use of re_cnt.
+	* re.c (re_update): Ditto.
+
+Thu Sep 19 10:55:37 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (binmode): Create function if defined(WIN32) also.
+
+	Updated to gettext 0.11.5, autoconf 2.54 and automake 1.6.3.
+
+	* aclocal.m4: Regenerated.
+	* m4/codeset.m4: Updated.
+	* m4/gettext.m4: Updated.
+	* m4/glibc21.m4: Updated.
+	* m4/iconv.m4: Updated.
+	* m4/lcmessage.m4: Updated.
+	* m4/lib-ld.m4: Updated.
+	* m4/lib-link.m4: Updated.
+	* m4/lib-prefix.m4: Updated.
+	* m4/progtest.m4: Updated.
+	* po/Makefile.in.in: Updated.
+	* po/Rules-quot: Updated.
+	* po/boldquot.sed: Updated.
+	* po/en@boldquot.header: Updated.
+	* po/en@quot.header: Updated.
+	* po/insert-header.sin: Updated.
+	* po/quot.sed: Updated.
+	* po/remove-potcdate.sin: Updated.
+
+Tue Sep 17 23:46:01 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: Moved override of INSTALL to just after
+	AC_INIT so that it takes effect. Necessary for Autoconf 2.5x.
+
+Mon Sep 16 16:40:57 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	* awkgram.y (want_assign): Removed.
+	(SLASH_BEFORE_EQUAL, ASSIGN): New terminals; ``/='' is now
+	formed from these two.
+	(a_slash): New non-terminal, representing either '/' or
+	SLASH_BEFORE_EQUAL.
+	(assign_operator): New non-terminal, replaces ASSIGNOP.
+	(REGEXP): yylex now eats the terminating '/' before
+	returning REGEXP token.
+	(exp): The check for C-like comments moved from here
+	(regexp): ... to here.
+	(common_exp): New non-terminal; contains common parts of exp
+	and rexp.  (a_relop, relop_or_less): New non-terminals.
+	(rexp): Some rules updated to be analogous to exp.
+	(output_redir): Can contain only common_exp, not exp in general.
+
+Mon Sep 16 22:51:51 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (two_way_open): Move label use_pipes outsidef of ifdef,
+	just in case.
+
+Thu Sep 12 15:11:28 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (getfname): Return NULL if not found, remove
+	fatal error.  Could be an extension function.
+	(dump_funcs): Walk symbol table counting functions before
+	mallocing table, since there could be extension functions,
+	func_count could be too small.
+	* profile.c (pp_builtin): Handle NULL return from getfname().
+	Print it as "extension_function()" if so.
+
+Tue Sep 10 17:33:48 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Minor code simplification.
+
+	* awk.h (in_array): Change return type to NODE*.
+	(assoc_exists): Remove declaration.
+	* array.c (in_array): Change return type to NODE *.
+	Return value is pointer to element value or NULL.
+	(assoc_exists): Removed function.
+	* eval.c (r_tree_eval): Case Node_in_array, change value
+	to test return of in_array() against NULL.
+	* io.c (pty_vs_pipes): Change test to make a tmp_string()
+	of the index and call in_array().  Add free_temp() of
+	subscript and free() of full_index (oops).
+
+2002-09-10  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* posix/regcomp.c: Wrap #include wchar.h and wctype.h in #if.
+	(build_range_exp): Add castings to strlen invocations.
+	(build_collating_symbol): Restore the type of characters from "char"
+	to "unsigned char", and supplement castings.
+	(build_collating_symbol): Likewise.
+	(build_equiv_class): Likewise.
+	(build_charclass): Likewise.
+	(seek_collating_symbol_entry): Likewise.
+	(parse_bracket_exp): Likewise.
+	(build_word_op): Supplement a casting.
+	* posix/regex_internal.c: Wrap #include wchar.h and wctype.h in #if.
+	(re_string_allocate): Fix castings.
+	(re_string_construct): Likewise.
+	(re_string_construct_common): Likewise.
+	(re_string_realloc_buffers): Likewise.
+	(build_wcs_buffer): Likewise.
+	(build_wcs_upper_buffer): Likewise.
+	(re_string_skip_chars): Likewise.
+	(re_string_reconstruct): Likewise.
+	* posix/regex_internal.h: Restore the type of characters in
+	re_string_t and bracket_elem_t from "char" to "unsigned char".
+	(re_string_elem_size_at): Fix castings.
+	* posix/regexec.c: Wrap #include wchar.h and wctype.h in #if.
+	(transit_state_bkref_loop): Restore the type of characters from
+	"char" to "unsigned char", and append a cast to "char*" pointer in
+	array subscript.
+	(check_node_accept_bytes): Likewise.
+	(find_collation_sequence_value): Likewise.
+
+Thu Sep  5 13:15:09 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (remaybelong): New routine.
+	(reisstring): Simplified the code a bit.
+	* awk.h (remaybelong): Declaration added.
+	* io.c (get_a_record): Change fourth grungy special case to
+	use remaybelong() instead of strchr() on last character.
+
+Wed Sep  4 13:20:26 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (do_input): Recode guts of main loop to be easier
+	to trace with a debugger.
+	(get_a_record): Fourth grungy special case for RE-based
+	record splitting added.  See explanatory comments there
+	and test/rebuf.awk.
+
+2002-09-03  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* posix/regcomp.c (regcomp): Append "__restrict" modifier to avoid
+	warnings of some compilers.
+	(build_collating_symbol): Change the type of characters from
+	"unsigned char" to "char", and append a cast to "char*" pointer in
+	array subscript.
+	(build_collating_symbol): Likewise.
+	(build_equiv_class): Likewise.
+	(build_charclass): Likewise.
+	(re_compile_pattern): Remove incorrect cast.
+	(re_compile_fastmap_iter): Change the type of characters from
+	"unsigned char" to "char", and append a cast to "char*" pointer
+	in array subscript.
+	(parse_bracket_exp): Likewise.
+	* posix/regex_internal.c (re_string_construct_common): Likewise.
+	(re_string_allocate): Likewise.
+	(re_string_construct): Likewise.
+	(re_string_realloc_buffers): Likewise.
+	(build_wcs_buffer): Likewise.
+	(re_string_reconstruct): Likewise.
+	* posix/regex_internal.h: Change the type of characters in
+	re_string_t and bracket_elem_t from "unsigned char" to "char".
+	* posix/regexec.c (regexec): Append "__restrict" modifier to avoid
+	warnings of some compilers.
+	(transit_state_bkref_loop): Change the type of characters from
+	"unsigned char" to "char", and append a cast to "char*" pointer in
+	array subscript.
+	(check_node_accept_bytes): Likewise.
+	(find_collation_sequence_value): Likewise.
+
+Wed Aug 21 15:40:36 2002  Corinna Vinschen  <vinschen@redhat.com>
+
+	* configure.in: Define --without-libintl-prefix and
+	--without-libiconv-prefix for Cygwin by default.
+	* Makefile.am: Call fixvers from $(srcdir).
+	* awk.h: Don't define O_BINARY on Cygwin.
+
+Wed Aug 21 15:31:57 2002  Andreas Buening  <andreas.buening@nexgo.de>
+
+	* configure.in (AC_OBJEXT, AC_EXEEXT): Added. Removed OS/2 goo.
+	* Makefile.am (check-local): Add $(EXEEXT) suffixes, remove OS/2 goo.
+	* regcomp.c, regex_internal.c, regexec.c: Conditionalize include of
+	<wchar.h> and <wctype.h> on RE_ENABLE_I18N.
+
+Wed Aug 21 14:43:57 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gettext.h (ENABLE_NLS): Add include of locale.h so that things
+	compile even without optimization. Sheesh.
+	* io.c (two_way_open, pty_vs_pipes): Conditionalize pty code on
+	HAVE_TERMIOS_H.
+
+Thu Aug  8 22:16:10 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (main): Force LC_NUMERIC locale to "C", esp. for
+	M$ systems. Ugh.
+
+Wed Aug  7 13:42:01 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (get_a_record): Improve test for newlines at beginning of
+	record but with nothing following it. See test/nulrsend.
+
+Mon Aug  5 10:12:39 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Add option to use ptys instead of pipes for |&.
+	Basic plumbing originally from Paolo Bonzini <bonzini@gnu.org>.
+
+	* awk.h (RED_PTY): New flag.
+	(assoc_exists): Add declaration.
+	* array.c (in_array): Use FALSE not zero for return value.
+	(assoc_exists): New routine to find and return value for an index
+	in an array.
+	* configure.in: Test for termios.h and stropts.h, and grantpt function.
+	* io.c: Include termios.h and stropts.h if available.
+	(redflags2str): Add RED_PTY to table.
+	(redirect): Add RED_PTY to flags turned off when searching.
+	(close_redir): Close write channel for two-way pipes
+	that use ptys by sending an EOF.
+	(two_way_open): If pty_vs_pipe(), use pty's to open two-way pipes as
+	they are line-buffered by default --> alleviates deadlock problems.
+	If fails, fall back to using pipes.
+	(pty_vs_pipe): New function.
+	* main.c (arg_assign): Clean up English in some of the error messages.
+
+Sun Aug  4 00:37:38 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	* re.c (make_regexp): Don't pass the error message returned by
+	re_compile_pattern() to gettext(); it's already gettextized.
+	(make_regexp): Minor reformat of code.
+
+Wed Jul 31 23:50:31 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Removed dfa code from gawk since not really needed with new regex.
+
+	* Makefile.am: Removed dfa.h and dfa.c.
+	* awk.h (struct Regexp): Removed `dfareg' and `dfa' members.
+	(make_regexp): Last parameter in function went away, changed decl.
+	(avoid_dfa): Removed declaration.
+	* awkgram.y: Fixed call to make_regexp().
+	* eval.c (match_op): Simplified: removed call to avoid_dfa() and
+	`kludge_need_start' variable. Instead, pass FALSE as last parameter
+	of research().
+	* field.c (set_FS): Fixed call to make_regexp().
+	* io.c (get_a_record, set_RS): Fixed calls to make_regexp().
+	* re.c (make_regexp): Removed last paramter (`dfa') from function.
+	Simplified the code.
+	(research): Simplified the code, removed calls to dfa stuff.
+	(dfaerror): Removed function.
+	(re_update): Fixed call to make_regexp().
+	(avoid_dfa): Removed function.
+
+Thu Jul 25 21:55:45 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regcomp.c, regex_internal.c, regex_internal.h, regexec.c: Bug
+	fixes from Isamu Hasegawa  <isamu@yamato.ibm.com> and Stepan Kasal
+	<kasal@math.cas.cz> applied.
+
+Sat Jul  6 23:28:37 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (yyerror): Change text of unexpected newline message to
+	include end of string.
+
+Mon Jun 17 17:58:55 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (do_split): Per Michal Jaegermann, move free_temp(fs)
+	above label `out'.
+
+Tue Jun 11 23:26:09 2002  Paul Eggert  <eggert@twinsun.com>
+
+	Update to autoconf 2.53 and automake 1.6.1.
+
+	* acconfig.h: Removed.
+	* m4/isc-posix.m4: Removed.
+	* m4/jm-mktime.m4: Removed.
+	* m4/largefile.m4: Removed.
+	* m4/ssize_t.m4: Removed.
+	* ansi2knr.c: Updated.
+	* depcomp: Updated.
+	* install-sh: Updated.
+	* missing: Updated.
+	* mkinstalldirs: Updated.
+	* ylwrap: Updated.
+
+	* configure.in: Improved quoting.
+	* acinclude.m4: Use `m4_sinclude', not antiquated `sinclude'.
+
+Tue Jun 11 23:08:40 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: Add `getgrent' to list of functions checked
+	so that awklib/grcat is compiled correctly.
+
+Tue Jun 11 22:18:42 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	Improve argument parsing and -v assignment.
+
+	* awk.h (struct src): Add additional enum values.
+	(arg_assign): Return type and arg list changes.
+	* io.c (nextfile): Add extra arg in call to `arg_assign'.
+	* main.c (pre_assign): Nuked.
+	(allocfiles): New variable.
+	(srcfiles_add, preassigns_add): New macros.
+	(main): Logic cleaned up.
+	(add_src): New function.
+
+	Use `size_t' for optimal_bufsize function.
+
+	* awkgram.y (yylex): `len' is now size_t.
+	* pc/gawkmisc.pc (optimal_bufsize): Change return type to size_t.
+	* posix/gawkmisc.c (optimal_bufsize): Change return type to size_t.
+	* unsupported/atari/gawkmisc.atr (optimal_bufsize): Change return type
+	to size_t.
+	* unsupported/tandem/tmisc.c (optimal_bufsize): Change return type to size_t.
+	* vms/gawkmisc.vms (optimal_bufsize): Change return type to size_t.
+	* README_d/README.hpux: New file.
+
+Fri May 24 12:23:01 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (init_profiling): Remove default initialization
+	of `prof_fp' to stderr. Per Stepan Kasal <kasal@math.cas.cz>.
+
+Wed May 15 15:39:17 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Work through builtin operations to make sure that
+	anything that might have side effects gets dealt with.
+
+	* array.c (do_delete): Evaluate subscript first before
+	checking if something is or isn't an array.
+	* builtin.c (sub_common): Evaluate replacement text, and
+	free it if no match of regex in source text.
+
+Wed May 15 15:30:34 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Switch to new version of regex from IBM Japan.
+
+	* regcomp.c: New file.
+	* regex.c: Replaced with new version.
+	* regex.h: Replaced with new version.
+	* regex_internal.c: New file.
+	* regex_internal.h: New file.
+	* regexec.c: New file.
+	* Makefile.am (EXTRA_SOURCES): New files added.
+
+Tue May 14 17:04:05 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (<locale.h>): Move check and include into gettext.h.
+	* gettext.h (<locale.h>): Add check and include per patch from
+	Bruno Haible.
+
+	* field.c (do_split):  When checking for split of null string,
+	evaluate seperator if it's not FS, since could have side effects.
+	At end, free_temp(fs), not free_temp(sep).
+	Both of these thanks to Stepan Kasal <kasal@math.cas.cz>.
+
+Mon May 13 00:41:31 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* custom.h (ultrix): Add define GETGROUPS_NOT_STANDARD.
+	* main.c (init_groupset): For GETGROUPS_NOT_STANDARD, use old way
+	to set `ngroups'.
+
+2002-05-10  Andreas Schwab  <schwab@suse.de>
+
+	* dfa.c (parse_bracket_exp_mb): Fix warning.
+
+Thu May  9 22:28:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (sub_common): Fix logic for match of null strings to
+	get correct semantics.  See test/gsubtst2.*.
+	* field.c (do_split): Minor code cleanup; the third arg to split()
+	is set to be FS by the grammar, so don't need to check it for NULL.
+	Thanks to Stepan Kasal <kasal@math.cas.cz>.
+	* awk.h (locale.h): Move include before that of "gettext.h" for systems
+	that define functions that gettext.h would use when NLS is disabled.
+	Per bug report from Ayamura Kikuchi <ayamura@ayamura.org>.
+
+Tue May  7 17:31:01 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Miscellanious patches courtesy of Stepan Kasal <kasal@math.cas.cz>.
+
+	* field.c, main.c: Tidy up some comments.
+	* field.c (set_FIELDWIDTHS): Init fw_alloc to 4 so it isn't
+	immediately realloced.
+	* main.c (load_procinfo): Check value of FS/FIELDWIDTHS for
+	value of PROCINFO["FS"].
+	* awk.h (set_FS_if_not_FIELDWIDTHS): Removed decl.
+	* field.c (set_FS_if_not_FIELDWIDTHS): Removed function.
+	* eval.c (set_IGNORECASE): Use inline code checking `using_fieldwidths()'.
+	* io.c (set_IGNORECASE): Ditto.
+
+Sun May  5 14:28:34 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Fix a memory leak in array for loops if the body contains a
+	`next' or `nextfile' statement.  The changes maintain a stack
+	of active for loops that is pushed and popped for each loop,
+	and popped entirely for `next', `nextfile', etc.
+
+	* eval.c (forloops_active, pop_forloop, pop_all_forloops, push_forloop):
+	new functions.
+	(interpret): Case Node_K_arrayfor, call push and pop functions.
+	Case Node_rule_list: Pop loops and pop fcalls after longjmp.
+	Cases Node_K_next, Node_K_nextfile, Node_K_break and
+	Node_K_continue, removed check before longjmp.
+	Case Node_K_exit: Add loop check.
+	(loop_stack, nloops, nloops_active): New variables that implement
+	the stack.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+Wed May  1 16:07:49 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getopt.c: Installed latest version from glibc.
+
+Sun Apr 28 17:19:07 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* fixvers: Changed patterns to allow test versions of the
+	form `gawk-3.1.1a'.
+	* patchlev.h: Patchlevel is now a string constant.
+	* main.c (version): Print patchlevel using %s, not %d.
+	* Makefile.am: Rework DEFPATH stuff and datadir stuff yet again.
+
+	* config.sub: Updated with current version from ftp.gnu.org.
+	* config.guess: Ditto.
+
+	Upgrade to gettext-0.11.2:
+
+	* ABOUT-NLS: Replaced with version from gettext 0.11.2.
+	* config.rpath: Replaced with version from gettext 0.11.2.
+	* intl/*: Replaced with version from gettext 0.11.2.
+	* po/Makefile.in.in: Replaced with version from gettext 0.11.2.
+	* po/Makevars.template: Replaced with version from gettext 0.11.2.
+	* po/Rules-quot: Replaced with version from gettext 0.11.2.
+	* po/boldquot.sed: Replaced with version from gettext 0.11.2.
+	* po/en@boldquot.header: Replaced with version from gettext 0.11.2.
+	* po/en@quot.header: Replaced with version from gettext 0.11.2.
+	* po/insert-header.sin: Replaced with version from gettext 0.11.2.
+	* po/quot.sed: Replaced with version from gettext 0.11.2.
+	* po/remove-potcdate.sin: Replaced with version from gettext 0.11.2.
+	* m4/codeset.m4: Replaced with version from gettext 0.11.2.
+	* m4/gettext.m4: Replaced with version from gettext 0.11.2.
+	* m4/glibc21.m4: Replaced with version from gettext 0.11.2.
+	* m4/iconv.m4: Replaced with version from gettext 0.11.2.
+	* m4/isc-posix.m4: Replaced with version from gettext 0.11.2.
+	* m4/lcmessage.m4: Replaced with version from gettext 0.11.2.
+	* m4/lib-ld.m4: Replaced with version from gettext 0.11.2.
+	* m4/lib-link.m4: Replaced with version from gettext 0.11.2.
+	* m4/lib-prefix.m4: Replaced with version from gettext 0.11.2.
+	* m4/progtest.m4: Replaced with version from gettext 0.11.2.
+
+Wed Apr 17 15:09:45 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex.c (PREFIX): Change test for token concatenation ability
+	to `#ifdef HAVE_STRINGIZE'. If a cpp has one, it ought to have
+	the other.
+
+Tue Apr 16 12:26:06 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (tree_eval): Make unary minus case smarter,
+	use is_scalar test and if false parenthesize expression.
+	Add Node_TEXTDOMAIN case.
+	(pp_lhs, is_scalar, prec_level): Add Node_TEXTDOMAIN cases.
+
+Thu Apr 11 21:28:33 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (do_adump): Spelling fix in output message.
+	* builtin.c: Ditto, in multiple routines.
+	(do_toupper, do_tolower): Add cast to size_t in assigment to mbclen
+	for some compilers.
+	* re.c (research): Fix way returning is done to silence some
+	compiler diagnostics.
+
+Wed Apr 10 19:30:51 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (datadir): Set directly to have `/awk'.
+	(DEFPATH): Go back to using $(datadir) for path.
+
+Tue Apr  9 17:34:09 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Upgraded to gettext 0.11.1.
+
+	* Makefile.am (LDADD): Use @LIBINTL@ instead of @INTLLIBS@.
+	* ABOUT-NLS: Version from 0.11.1.
+	* config.rpath: Version from 0.11.1.
+	* aclocal.m4: Regenerated based on new files.
+	* intl/*: Replaced with version from 0.11.1.
+	* m4/ChangeLog: New file.
+	* m4/codeset.m4: New file.
+	* m4/gettext.m4: Version from 0.11.1.
+	* po/ChangeLog: New file.
+	* po/Makefile.in.in: Version from 0.11.1.
+	* po/remove-potcdate.sin: New file.
+
+Mon Apr  8 22:22:58 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (libexecdir): Set directly to have `/awk'.
+	(DEFPATH): Use $(pkgdatadir) for path.
+	(install-exec-hook): Add version link for pgawk.
+	(uninstall-links): Remove pgawk version link.
+
+Wed Mar 20 13:44:21 2002  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regex.c (__alignof__): Definition for non-GCC compilers.
+
+Sun Mar 17 17:41:55 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (do_pathopen): Malloc buffers to hold constructed
+	filenames: No Arbitrary Limits!  Thanks to keoki@techie.com
+	for the bug report.
+
+Sun Mar 10 16:59:06 2002  Scott Deifik       <scottd@amgen.com>
+
+	* awk.h (LOCALEDIR): Provide a definition in case not using
+	i18n stuff.
+
+Wed Mar  6 18:14:44 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (usage): Add some explanatory text and examples at end.
+
+Sun Mar  3 16:42:50 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getopt.h, getopt.c, getopt1.c: Update to current version
+	from glibc CVS.
+
+Fri Feb 22 15:53:38 2002  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* dfa.c (fetch_wc): Fix type from wchar_t to wint_t.
+	(parse_bracket_exp_mb): Likewise.
+	* regex.c (extract_number): Retrieve the sign information from
+	byte-code in case of AIX.
+
+Thu Feb 21 16:44:24 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (resetup): Moved setting re_max_failures into regex.c.
+	* regex.c (re_max_failures): Set to really big if REGEX_MALLOC
+	defined.  Do this in both places that define re_max_failures.
+
+Thu Feb 21 19:02:22 2002  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* builtin.c (sub_common): Avoid index_multibyte_buffer invocation
+	in single byte character environments.
+
+Thu Feb 21 10:08:56 2002  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* dfa.c (parse_bracket_exp_mb): For ':', use wctype_t in MALLOC,
+	not wchar_t.
+
+Thu Feb 21 09:52:16 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Upgraded to automake 1.5 and gettext-0.11.
+	Also bug fix to multibyte code.
+
+	* ABOUT-NLS: Upgraded.
+	* config.guess, config.sub, config.rpath, gettext.h, ylwrap: New files.
+	* Makefile.am: Added above to appropriate places.
+	* awk.h: Replace libintl.h and macros with include of gettext.h.
+	(emalloc, erealloc): Add num bytes to error message, put string inside _().
+	(index_multibyte_buffer): Removed decl.
+	* awklib/Makefile.am: Use $(EXEEXT) for grcat and pwcat targets.
+	* builtin.c (index_multibyte_buffer): Made static to this file.
+	(sub_common): Add checks that replacement string is length > 0 so
+	that we don't try to malloc(0): this fails on some systems.
+	* configure.in (AM_GNU_GETTEXT): Update macro for gettext 0.11.
+	(ALL_LINGUAS): Removed.
+	* m4/codeset.m4: New file.
+	* m4/gettext.m4: Updated.
+	* m4/glibc21.m4: New file.
+	* m4/iconv.m4: New file.
+	* m4/isc-posix.m4: New file.
+	* m4/lcmessage.m4: Updated.
+	* m4/lib-ld.m4: New file.
+	* m4/lib-link.m4: New file.
+	* m4/lib-prefix.m4: New file.
+	* m4/progtest.m4: Updated.
+	* intl/*: Replaced with version from gettext 0.11.
+	* po/*: Revised for gettext 0.11.
+
+Mon Feb 18 14:42:39 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (nondec2awknum): Change assert to runtime check
+	in case user passed in bad data.
+
+2002-02-17  Paul Eggert  <eggert@twinsun.com>
+
+	* re.c (resetup): Try to avoid silly limitation of regex.c by
+	setting re_max_failures to the largest reasonable value.
+
+Sun Feb 17 14:57:43 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (research): If re_search() returns -2, the
+	match failed since regex couldn't allocate enough memory
+	for what it needed.  Fail with a fatal message instead.
+	This is a workaround, not a fix, but I don't mess with
+	regex.[ch].
+
+Fri Feb  8 16:01:11 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (LEX_FOR): Fix case of array loop with body of single
+	delete statement to actually check the right things to make the
+	optimization.
+	* profile.c (tree_eval): Add case for Node_K_delete_loop.
+	(prec_level): Ditto.
+
+Mon Feb  4 10:38:00 2002  Bruno Haible  <bruno@clisp.org>
+
+	* awk.h (dcngettext): New macro.
+	(do_dcngettext): New declaration.
+	* awkgram.y (tokentab): Add dcngettext.
+	(snode): Add a warning for incorrect use of dcngettext.
+	(dumpintlstr): fflush at the end, not in the middle.
+	(dumpintlstr2): New function.
+	* builtin.c (localecategory_from_argument): New function, extracted
+	from do_dcgettext.
+	(do_dcgettext): Call it.
+	(do_dcngettext): New function.
+
+Sun Feb  3 17:56:20 2002  Bruno Haible  <bruno@clisp.org>
+
+	* builtin.c (do_bindtextdomain): Don't free the same variable twice.
+	* main.c (main): Call setlocale for LC_MESSAGE, to make dcgettext
+	function work on glibc systems.
+
+Wed Jan 23 15:03:36 2002  Andreas Buening    <andreas.buening@nexgo.de>
+
+	* configure.in (PATH_SEPARATOR): Code added for OS/2.
+	Makefile.am (PATH_SEPARATOR): Added.
+	(DEFPATH): Make use of PATH_SEPARATOR.
+
+Wed Jan 23 14:46:04 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Add test for lasttok != '$' when looking
+	at _"...".  See comments in code.
+
+Wed Aug 15 07:43:10 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regex.c : Implements the codes for exactn_bin to work correctly
+	in multibyte environments, in case of invalid multibyte sequence.
+
+Wed Aug 15 07:36:56 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regex.c : Implements the codes for charset/charset_not to
+	work in multibyte environments.
+
+Wed Aug 15 05:04:34 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regex.c : Add some comments.
+
+Wed Aug 15 05:04:15 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regex.c (count_mbs_length): New function, check the mutibyte
+	strings and count how many wchar_t the substring occupy.
+	(CHAR_T): New macro, character type depending on
+	environments(singlebyte/multibyte).
+	(UCHAR_T): New macro, unsigned character type.
+	(COMPILED_BUFFER_VAR): New macro, the buffer containing
+	the compiled buffer.
+	Adapt singlebyte/multibyte environments with CHAR_T, UCHAR_T,
+	and COMPILED_BUFFER_VAR.
+
+Mon Jun 25 09:00:41 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regex.c : Reorganize code to build code twice.  byte_* are
+	for single byte, wcs_* are for multibyte character sets.
+	Chose functions according to current locale dynamically.
+	* regex.c (convert_mbs_to_wcs): New function, convert multibyte
+	strings to wide character strings for multibyte environments.
+
+Fri Jun 22 05:43:50 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* regex.c (MBS_SUPPORT): New macro, defined if the environment
+	can handle multibyte characters.
+	(OFFSET_ADDRESS_SIZE): Offset address size in the
+	compiled buffer.
+	Rewrite offset addresses with OFFSET_ADDRESS_SIZE.
+
+Thu Apr 26 08:03:17 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* builtin.c (index_multibyte_buffer): Inspect the buffer and write
+	the index.
+	(sub_common): In multibyte environment, skip multibyte characters
+	when we check special characters.
+	* awk.h (index_multibyte_buffer): Add prototype.
+	* eval.c (cmp_nodes): In multibyte environment, compare per character.
+	* field.c (re_parse_field): In multibyte environment, avoid to
+	call research() on invalid boundary.
+	(sc_parse_field): In multibyte environment, avoid to compare on
+	invalid boundary.
+	(null_parse_field): In multibyte environment, split per
+	character, not per byte.
+	* io.c (get_a_record): In multibyte environment, avoid to compare
+	on invalid boundary.
+
+Wed Apr 25 08:29:47 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* awk.h (strncasecmpmbs): Add prototype.
+	* builtin.c (strncasecmpmbs): New function like strncasecmp but for
+	multibyte strings.
+	(do_index): In multibyte environment, compare per character.
+	* builtin.c (do_tolower): In multibyte environment, user towlower
+	instead of TOLOWER.
+	(do_toupper): In multibyte environment, user towupper instead
+	of TOUPPER.
+
+Tue Apr 24 10:38:06 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	In multibyte environments, handle multibyte characters as single
+	characters in bracket expressions.
+
+	* dfa.h (mb_char_classes): New structure.
+	(mbcsets): New variable.
+	(nmbcsets): New variable.
+	(mbcsets_alloc): New variable.
+	* dfa.c (prtok): Handle MBCSET.
+	(fetch_wc): New function to fetch a wide character.
+	(parse_bracket_exp_mb): New function to handle multibyte character
+	in lex().
+	(lex): Invoke parse_bracket_exp_mb() for multibyte bracket expression.
+	(atom): Handle MBCSET.
+	(epsclosure): Likewise.
+	(dfaanalyze): Likewise.
+	(dfastate): Likewise.
+	(match_mb_charset): New function to judge whether a bracket match
+	with a multibyte character.
+	(check_matching_with_multibyte_ops): Handle MBCSET.
+	(dfainit): Initialize new variables.
+	(dfafree): Free new variables.
+
+Mon Apr 23 01:40:09 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	Implement the mechanism to match with multibyte characters,
+	and use it for `period' in multibyte environments.
+
+	* dfa.h (mbps): New variable.
+	* dfa.c (prtok): Handle ANYCHAR.
+	(lex): Use ANYCHAR for `period' in multibyte environments.
+	(atom): Handle ANYCHAR.
+	(state_index): Initialize mbps in multibyte environments.
+	(epsclosure): Handle ANYCHAR.
+	(dfaanalyze): Handle ANYCHAR.
+	(dfastate): Handle ANYCHAR.
+	(realloc_trans_if_necessary): New function.
+	(transit_state_singlebyte): New function.
+	(match_anychar): New function.
+	(check_matching_with_multibyte_ops): New function.
+	(transit_state_consume_1char): New function.
+	(transit_state): New function.
+	(dfaexec): Invoke transit_state if expression can match with
+	a multibyte character in multibyte environments.
+	(dfamust): Handle ANYCHAR.
+
+Fri Apr 20 11:31:24 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	Avoid incorrect state transition in multibyte environments.
+
+	* dfa.h (nmultibyte_prop): New variable.
+	(multibyte_prop): New variable.
+	* dfa.c (addtok): Set inputwcs.
+	(dfastate): Avoid incorrect state transition in multibyte
+	environments.
+	(dfaexec): Likewise.
+	(dfainit): Init multibyte_prop.
+	(dfafree): Free multibyte_prop.
+	(inputwcs): New variable.
+	(mblen_buf): New variable contains the amount of remain byte
+	of corresponding multibyte character in the input string.
+
+Fri Apr 20 06:28:59 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	Handle a multibyte character followed by '*', '+', and '{n,m}'
+	correctly.
+
+	* dfa.c (update_mb_len_index): New function.
+	Support for multibyte string.
+	(FETCH): Call update_mb_len_index.
+	(lex): Check cur_mb_index not to misunderstand multibyte characters.
+	(atom): Make a tree from a multibyte character.
+	(dfaparse): Initialize new variables.
+	(mbs): New variable.
+	(cur_mb_len): New variable.
+	(cur_mb_index): New variable.
+
+Thu Apr 19 09:32:47 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* awkgram.y (cur_mbstate): New varialble containing means current
+	shift state.
+	(cur_char_ring): New varialbe reffering the buffer which contains
+	last some character from the buffer.
+	(cur_ring_idx): New variable containing the current index on
+	cur_char_ring.
+	(nextc_is_1stbyte): New macro, means that last nextc() return a
+	singlebyte character or 1st byte of a multibyte character.
+	(nextc): Check the buffer and update cur_ring_char in multibyte
+	environments.
+	(pushback): Adjust cur_ring_idx in multibyte environments.
+	(yylex): Add check whether nextc() returned 1st-byte in multibyte
+	environments.
+	* re.c (make_regexp): In multibyte environment, skip multibyte
+	characters when we check special characters.
+
+Wed Apr 18 07:58:20 2001  Isamu Hasegawa  <isamu@yamato.ibm.com>
+
+	* awk.h (MBS_SUPPORT): New flag, means supporting multibyte strings.
+	* configure.in : Add check for wchar.h, wctype.h, mbrtowc, and mbrlen.
+
+Wed Jan 16 16:32:40 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_strtonum): Simplified.  Check first if the
+	value matches a non-decimal number, and if so convert it.
+	Otherwise do a regular force_number.
+
+Mon Jan  7 22:12:15 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (statement): Moved delete, print, and expressions into
+	new non-terminal `simple_stmt'.  Allow opt_simple_stmt in the
+	first and third part of a for loop, per latest POSIX, which documents
+	an otherwise undocumented historical oddity in Unix awk.  This has
+	the pleasant side effect of making line numbers more accurate for
+	messages involving delete statements.
+	(opt_simple_stmt, simple_stmt): New non-terminals.
+
+	Based on bug report from drj@pobox.com.
+
+Mon Dec 24 14:04:02 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: Changes for VMS with new strftime:
+	(AC_HEADER_TIME): Added.
+	(AC_CHECK_HEADERS): Check for sys/time.h.
+	(TIME_T_IN_SYS_TYPES_H): Add header check.
+	* acconfig.h (TIME_T_IN_SYS_TYPES_H): Added.
+
+Wed Dec 19 16:01:58 2001  Peter J. Farley III  <pjfarley@dorsai.org>
+
+	* configure.in: Add MS-DOS to getpgrp special case.
+	* dfa.c, getopt.c, regex.c: Fix code to work with --disable-nls.
+
+Wed Dec 19 15:59:25 2001  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* profile.c (init_profiling_signals) [__DJGPP__]: Use SIGINT
+	instead of SIGHUP and SIGQUIT instead of SIGUSR1.
+
+Tue Dec 18 20:56:07 2001  Andreas Buening    <andreas.buening@nexgo.de>
+
+	More OS/2 stuff.
+
+	* awk.h (O_BINARY): Don't redefine for EMX.
+	* io.c (gawk_popen): Add __EMX__ in case compiling DOS executable.
+	* configure.in: Add OS/2 to case for manual GETPGRP_VOID.
+
+Tue Dec  4 17:54:30 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	New configure time option, --with-whiny-user-strftime.
+
+	* configure.in (AC_ARG_WITH): Add appropriate code for autoconf.
+	* accondig.h (USE_INCLUDED_STRFTIME): Add #undef for it.
+	* custom.h (USE_INCLUDED_STRFTIME): Set things up right.
+
+Tue Dec  4 16:44:07 2001  Andreas Buening    <andreas.buening@nexgo.de>
+
+	Mongo patch for updated OS/2 support.
+
+	* awk.h (TOUPPER, TOLOWER): Define only if not already defined.
+	* awkgram.y (extproc feature): Add ifdef for __EMX__.
+	* gawkmisc.c (__EMX__): Include pc/gawkmisc.c directly.
+	* io.c (__EMX__): Added for a number of places in addition to OS2 def.
+	(two_way_open): Added OS/2 specific code added that uses spawn.
+	(gawk_popen): Ditto.
+
+Mon Dec  3 14:07:56 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Fix use of getgroups to use dynamic memory, solves
+	problem of systems where NGROUPS_MAX lies.
+
+	* awk.h (groupset, ngroups): New extern variables.
+	* configure.in (AC_CHECK_FUNCS): Add getgroups to list.
+	* io.c (user_open): Use global ngroups and groupset variables,
+	don't call getgroups here.
+	* main.c (init_groupset): New function to init global
+	vars using malloc.  Declare it at top.
+	(main): Call init_groupset().
+	(load_procinfo): Use global ngroups and groupset variables.
+
+Sun Nov 18 11:56:01 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* random.c (srandomdev): ifdef-out.  Lots of compile time
+	problems on multiple platforms, and gawk doesn't even
+	use the routine.  The heck with fine-grained solutions.
+
+Wed Nov 14 16:12:40 2001  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* builtin.c (bchunk_one): Use `ofre < 1' instead of `ofre <= 0'
+	to avoid compiler complaint about suspicious comparison for
+	unsigned variable.  (`ofre == 0' ought to suffice...)
+
+Tue Nov 13 17:27:52 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (yyerror): Fix the code to behave like it
+	used to.  Keep "no arbitrary limits" by mallocing the
+	buffer and freeing it.
+
+Wed Nov  7 16:46:20 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (yyerror): Remove dependency upon buf[] to
+	hold prepended space and `^' pointer.  Avoids core dumps
+	for long source lines.
+
+Sat Nov  3 22:27:21 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* m4/strtod.m4: Add missing `#endif'. Oops.
+
+Mon Oct 29 14:53:57 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y: Add semicolons in calls to count_args().
+	Apparently bisoon adds a semicolon to each body
+	automatically and byacc doesn't.
+
+Sun Oct 28 16:53:18 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): Fix off-by-one error in "ran out
+	for this one" diagnostic.  Also fix lint check for too many
+	arguments vs. count in format string.
+
+Wed Oct 10 11:01:47 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* fixvers: Check that files exist before doing `cmp', in
+	case they're in a source code system and aren't there.
+	Fix from Grant Erickson (gerickson@brocade.com).
+
+Thu Oct  4 18:20:36 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (r_tree_eval): For comparison, dupnode() results of
+	evaluation so that we can hang on to them and avoid memory
+	corruption.  Change calls to free_temp() to unref().
+
+Tue Sep 25 15:19:53 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (iop_open): Only call os_close_on_exec() for
+	fd > fileno(stderr).
+
+2001-09-07  Paul Eggert  <eggert@twinsun.com>
+
+	* io.c (redirect): When deciding to use the fdopen bug hack,
+	use "__sun" rather than "solaris".  No compilers predefine
+	"solaris", but both GCC and Sun C predefine "__sun".
+
+Thu Aug 30 15:17:12 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (copyleft): Use a printf %d for last year of update
+	to avoid translation strings changing when the file
+	is updated from now on.  Suggestion from Ulrich Drepper.
+
+Thu Aug 23 14:01:14 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (unary minus production): Add check that value
+	isn't a string. Based on bug report from drj@pobox.com.
+	* profile.c (tree_eval): For node_val, only test NUMBER
+	to see if value is numeric, not NUM|NUMBER.
+
+Thu Aug 16 12:21:28 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in (ALL_LINGUAS): Added `fr' and `tr'.
+	* po/fr.po, po/tr.fo: New files.
+
+2001-08-13  Paul Eggert  <eggert@twinsun.com>
+
+	This patch fixes a bug that causes gawk to rewind standard
+	input incorrectly.  It also removes all instances of fseek,
+	from the gawk source proper, which should make gawk a bit
+	more portable.
+
+	(The original patch removed off_t & lseek too, but I need
+	that for something else. ADR.)
+
+	* posix/gawkmisc.c (optimal_bufsize):
+	Don't use lseek on the input, because that might change
+	its state.  Instead, just check whether it is a regular file.
+	This obviates the need to invoke isatty.
+	(Also, fix a spelling error in the first line of the source.)
+	* pc/gawkmisc.pc, unsupported/atari/gawkmisc.atr: Likewise.
+
+	* awk.h (S_ISREG): Move this macro here ...
+	* io.c (S_ISREG): from here.
+
+	* protos.h (fseek): Remove prototype; no longer used.
+
+Fri Aug  3 13:38:54 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (assoc_lookup): Change assert test on type to real test
+	to protect against FS[1] = "x" kinds of things.  It'd be better
+	to do this in the grammar, but this is easier and just as
+	effective.
+
+	Undid BECAMEARRAY changes of 25 June 2001 in favor of correct code:
+	* eval.c (pop_fcall): Change test and comment for freeing n->vname.
+	(flags2str): Removed BECAMEARRAY entry.
+	* awk.h (BECAMEARRAY): Removed define.
+	* array.c (assoc_lookup): Removed setting of BECAMEARRAY flag.
+
+Mon Jul 23 17:33:13 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (get_a_record): Handle case where RS = "" and input file
+	is only newlines.  See test/onlynl.   Bug report by
+	Michel Jouvin <jouvin@lal.in2p3.fr>.
+
+Wed Jul  4 18:34:19 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (assign_val): Don't allow negative values for NF.
+	* field.c (set_NF): Robustify field-freeing code to make sure
+	values are always positive.
+
+Sun Jul  1 19:15:01 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_index): If second string is "", return 1.
+
+Mon Jun 25 19:34:24 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Further rationalization of treatment of dynamic regexes,
+	so that profiling code works correctly.
+
+	* awk.h (NODETYPE): New type, Node_dynregex.
+	* awkgram.y (mk_rexp): Use Node_dynregex.
+	* eval.c (nodetypes): Add Node_dynregex.
+	(r_tree_eval): Add Node_dynregex to case for match_op().
+	* profile.c (tree_eval): Add Node_dynregex to case for pp_match_op().
+	(pp_match_op): Handle Node_dynregex, simplify cases for ~ and !~.
+	* re.c (re_update): Add assertion that type is Node_regex when flags
+	indicate CONST.
+
+	New lint warning.
+
+	* awkgram.y (yylex): Added lint warning that constant with leading
+	zero is treated as octal or hex.
+
+	Generalized code for those who are Strong In The Ways of the Source.
+
+	* awk.h: New boolean variable.
+	* main.c (main): Set it.
+	* eval.c (interpret): For arrays, check it. Remove variable 'first',
+	not needed anymore.
+	* profile.c (pp_string_fp): Enable printing of non-ASCII characters
+	verbatim if variable set.
+
+	Fix memory corruption on SCO for array vars as params changed globally.
+
+	* awk.h (BECAMEARRAY): New flag.
+	* array.c (assoc_lookup): Set the flag as appropriate.
+	* eval.c (flags2str): Add the flag.
+	(pop_fcall): Check the flag, don't free memory if set.
+
+Wed Jun 13 18:07:06 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (fmt_index): Actually call erealloc() to grow fmt_list
+	if that's really necessary.  Bug report from David Jones,
+	djones@zoonami.com.
+
+Sun Jun 10 14:24:48 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (pp_match_op): Rationalized the code.
+
+Thu Jun  7 11:54:36 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (O_BINARY): Don't define if already defined
+	(as is true for cygwin/gcc --- oops).
+
+Sun Jun  3 13:04:44 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.0: Release tar file made.  And there was
+	rejoicing.
+
+Wed Apr 25 11:44:07 2001  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (AM_MAKEFLAGS): Add definition per advice from
+	Nelson Beebe.
+
+Tue Apr 24 14:28:00 2001  Arnold Robbins  <arnold@skeeve.com>
+
+	* io.c (devopen): Patch from Jeurgen to robustify pulling
+	out hostname, port numbers, etc, to avoid any buffer overrun
+	problems.
+
+Mon Apr 23 10:26:38 2001  Arnold Robbins  <arnold@skeeve.com>
+
+	* awkgram.y: Fix grammar so that `print ... |& ".." |& getline'
+	dies with a parse-time error message.
+
+Sun Apr 22 16:46:48 2001  Arnold Robbins  <arnold@skeeve.com>
+
+	* io.c (socketopen): Fix from Juergen in recursive call.
+
+Thu Apr 19 18:39:20 2001  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* awk.h: Really fix logic around include of <sys/types.h>.
+
+	* awk.h (callresult): New name for `result' macro.
+	* eval.c (r_get_lhs, case Node_builtin): Use it.
+
+Thu Apr 19 16:31:09 2001  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* io.c: Move code around to allow compilation with DEC C.
+
+Thu Apr 19 16:21:56 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* random.h: Move decl of random() here.
+	* random.c: Remove decl of random().
+
+Mon Apr  9 11:41:58 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c (dfainit): Initialize more members in the structure,
+	based on bug report in bug.gnu.utils by aaronl@vitelus.com
+	(Aaron Lehmann).
+	* awk.h: Fix logic around include of <sys/types.h>.
+
+Thu Apr  5 20:12:05 2001  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* dfa.c: For VMS, #include <stddef.h> instead of <sys/types.h>.
+	* missing_d/mktime.c: Likewise.
+
+	* random.c: Reorder include directives to get gawk config info
+	from random.h sooner.
+	[fcntl.h]: Guard #include with HAVE_FCNTL_H test.
+	[unistd.h]: Guard #include with HAVE_UNISTD_H test.
+
+	* random.c (srandomdev): Skip /dev/urandom usage if O_RDONLY
+	is not defined.
+
+Tue Mar 20 11:07:11 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (function_body): Add opt_nls to end of production.
+
+Tue Mar 20 09:30:32 2001  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* awk.h (BROKEN_STRNCASECMP): Add decl of strcasecmp.
+	* io.c (two_way_open): Add `return FALSE;' for fussy compilers.
+
+Sun Mar 18 15:10:56 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (gawk_pclose): Set the exit value for close correctly
+	if the pipe died with a signal.
+
+Wed Mar  7 11:28:52 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (get_a_record): Correctly handle the case of a leading
+	single newline at the front of the file when RS = "".
+
+2001-02-26  Paul Eggert  <eggert@twinsun.com>
+
+	* COPYING: Incorporate latest version from FSF, which fixes a Y2k bug.
+
+	* builtin.c (do_mktime): Allow the user to specify the
+	tm_isdst member as an optional trailing integer, and to
+	specify "out-of-range" members.  Check for overflow when
+	subtracting 1 from month or 1900 from year.  Allow years just
+	past INT_MAX, as they work on some hosts when INT_MAX - 1900
+	is representable as an int.
+
+	* doc/gawk.1, doc/gawk.texi: Document the above changes.
+	Also, document that the origin-zero Gregorian calendar is used.
+	Fix confusing wording about "midnight" by replacing it with 00:00
+	("midnight" is also 24:00, the end of the day).
+	Mention the typical range for time stamps.
+	Do not assume that years are nonnegative and are less than 10,000.
+	Suggest TZ=UTC0 instead of TZ=GMT0, as that's how recent versions
+	of GNU date behave.
+	GMT is not always the time of day in Greenwich these days.
+	Fix typos: "Emporer/Era", "1980's", "1970's".
+
+	* m4/largefile.m4: Synchronized with latest version.
+
+Tue Feb 27 12:10:11 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (pp_in_array): Change test to tree->type == Node_expression_list.
+
+Wed Feb  7 14:46:50 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (LEX_FOR): Allow newline after `;' in for loops.
+	Per bug report from Brian Kernighan, bwk@research.bell-labs.com.
+
+Tue Feb  6 18:35:27 2001  Martin C. Brown    <mc@whoever.com>
+
+	* io.c (socket_open): Conditionalize various options based on
+	ifdef. Needed for BeOS port.
+
+Tue Feb  6 18:17:13 2001  Michal Jaegermann  <michal@ellpspace.math.ualberta.ca>
+
+	* regex.c (re_match_2_internal): Case maybe_pop_jump, for
+	charset and not_charset: Change cast from (unsigned char)
+	to (unsigned).  Catches last 8 chars with high bit set
+	if backtracking. See test/rebt8b1.awk, test/rebt8b2.awk.
+
+Tue Feb  6 11:20:21 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Have `for (iggy in foo)' save the elements and loop over them.
+	Make sorted for loops a dynamic test instead of a compile time test.
+	Still requires being Strong In The Ways Of The Source.
+
+	* awk.h: (struct search): Removed.
+	(assoc_scan, assoc_next): Removed declarations.
+	* array.c (assoc_scan, assoc_next): Removed functions.
+	* eval.c (interpret): Remove Node_K_array_sorted_for. Change code
+	at Node_K_arrayfor.
+	(nodetypes): Remove Node_K_array_sorted_for.
+	* configure.in: Removed array sorting test.
+	* awkgram.y: Removed sorted_in keyword and associated code.
+
+Sun Feb  4 14:57:49 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (interpret): Use tree->rnode->exec_count to hold count of
+	times if was true.
+	profile.c (interpret): Ditto.
+	* main.c (pre_assign): Gross hack. malloc fresh copy of assign so can
+	clear the '=', otherwise screws up profiling print out.
+
+Sun Jan 28 16:16:02 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Per request from Nelson Beebe, SIGHUP to pgawk dumps profile
+	and function call stack and exits, SIGUSR1 dumps and continues
+	running.
+
+	* eval.c (dump_fcall_stack): New function, dumps awk function call
+	stack.
+	* awk.h (dump_fcall_stack): Add declaration.
+	(init_profiling_signals): Ditto.
+	* main.c (main): Call init_profiling_signals.
+	* profile.c (init_profiling_signals, dump_and_exit, just_dump): New
+	functions.
+
+Sun Jan 28 15:50:02 2001  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* io.c (gawk_popen): Restore the mode of stdin before running the
+	child process and switch it back if BINMODE is in effect after the
+	child returns.
+	(redirect): Restore the mode of stdin before running the child
+	process.
+	(close_redir): Switch mode of stdin back to binary if BINMODE is
+	in effect, after the child returns.
+
+	* builtin.c (do_system): Restore the mode of stdin before running
+	the child process and switch it back if BINMODE is in effect after
+	the child returns.
+
+	* awk.h (os_restore_mode): Add prototype.
+
+Thu Jan 18 14:03:06 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* custom.h, README_d/README.ultrix: Fixes for Ultrix
+	from Juergen Kahrs.
+
+Wed Jan 17 11:03:40 2001  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* io.c (redirect) [F_GETFL && O_APPEND]: Use binmode in the call
+	to fdopen.
+
+Mon Jan 15 16:29:52 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (prec_level): Made Node_K_getline higher than <
+	but lower than others.  Allows use of getline with redirection
+	inside an if.
+
+Wed Jan 10 15:35:06 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (set_BINMODE): Rationalized string assignment.
+
+Sun Jan  7 15:26:16 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getopt.h: Removed names in prototypes for getopt_long
+	and getopt_long_only, fixes problems on MINGW32.
+
+Thu Jan  4 10:13:46 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: Add check for mcheck.h
+	* main.c: Include mcheck.h if have it.
+	(main):  If TIDYMEM turned on in environment, also call mtrace().
+
+Wed Jan  3 16:41:33 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Fixed minor memory leaks.
+	* re.c (re_update): When IGNORECASE changed, unref(t->re_text).
+	* eval.c (pop_fcall): Fix the logic to correctly free the vname
+	when copying array args back to their underlying source.
+
+	Fixed massive memory leaks.
+	* node.c (dupnode): If PERM is set, do nothing.
+	(unref): Fix logic. Always turn off TEMP.  Check just for MALLOC
+	when incrementing the stref.
+	* array.c (assoc_lookup): Turn off PERM also when saving subscript.
+	* builtin.c (sub_common): Turn off PERM also when making private copy
+	of string.
+
+	Add a minor memory cleanup facility (undocumented):
+	* awk.h (do_tidy_mem, release_all_vars): Add declarations.
+	* main.c (do_tidy_mem): Add declaration.
+	(main): If $TIDYMEM exists, do_tidy_mem is true, and call mtrace().
+	* awkgram.y (release_all_vars): New function.
+
+Sun Dec 31 10:47:37 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (in_end_rule): Renamed `parsing_end_rule' to avoid
+	conflict with global var of same name.
+
+Sun Dec 24 10:36:54 2000  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* awkgram.y (snode): Reword the error message about the number of
+	arguments for a builtin, so as not to use the English `s' as a
+	plural suffix.
+
+Tue Dec 12 08:38:03 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ext.c (do_ext): ifdef out use of `dummy'. Duh.
+	* regex.c (re_error_msgid): Revert to array of `char *' so that can
+	compile on K&R compilers.  Fix all uses appropriately.
+	(re_error_msgid_idx): Removed.
+
+Fri Dec  8 11:47:26 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ext.c (dummy): Make gcc specific via ifdef.
+	* builtin.c (do_dcgettext): Make conditional compilation smarter.
+	* msg.c (warning, error, r_fatal): Finish switching back to
+	multi-version function header.
+
+Wed Dec  6 13:28:58 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* random.h: Include <config.h> to get ssize_t definition.
+	* awkgram.y (yyerror): Restore multi-version function header,
+	it seems that what ansi2knr produces doesn't quite do the
+	job on old compilers.
+	msg.c (msg): Ditto.
+
+Tue Dec  5 15:05:35 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in (AC_C_INLINE): Added macro call.
+	* Makefile.am (LN): Define it for install hooks.
+
+Sun Dec  3 17:28:53 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (os_setbinmode): Declare new function.
+	(setmode): Remove definition: conflicts with MacOS X.
+	* main.c (main): Change call of setmode to os_setbindmode.
+
+	* builtin.c (do_dcgettext): Improve ifdef for code, fixes MacOS X.
+	* custom.h (__APPLE__): Force definition of HAVE_MKTIME, won't
+	link otherwise.  Harumph.
+
+Sun Nov 26 11:58:52 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_dcgettext, do_bindtextdomain): Add calls to
+	free_temp the various arguments.  Sigh.
+	* io.c (yylex): Nuked bstart variable, put all uses of mend variable
+	into TANDEM ifdef.
+	* main.c (load_environ): Removed cp variable, value never used.
+	* random.c: Remvoed uses of `inline' keyword.
+	* Makefile.am (install-exec-hook, uninstall-local): New targets.
+	Adds creation of gawk-X.Y.Z and awk links, as in 3.0.x.
+	* configure.in (GAWK_AC_TYPE_SSIZE_T): Added.
+	m4/ssize_t.m4: New file.
+
+Wed Nov 22 14:47:18 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	After consultation with Brian Kernighan and Michael Brennan,
+	nuked the abort keyword.
+
+	* awk.h (Node_K_abort): Removed.
+	* eval.c (aborting): Removed decl.
+	(interpret): Removed Node_K_abort case.
+	* io.c (do_input): Removed checks for aborting.
+	* main.c (aborting): Removed.
+	(main): Removed checks for aborting.
+	* profile.c (pprint): Removed Node_K_abort case.
+	* awk.y (LEX_ABORT): All stuff removed.
+
+Wed Nov 22 10:45:57 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ext.c (dummy): Move inside #ifdef DYNAMIC. Helps on
+	PCs and other platforms that don't do dynamic loading.
+	* awk.h (RED_TCP): New flag, means use shutdown.
+	io.c (redflags2str): Add RED_TCP.
+	(SHUT_RD, SHUT_WR, SHUT_RDWR): Add conditional defines.
+	(redirect): Add RED_TCP to tflag if appropriate.  Add more
+	#ifdef HAVE_SOCKETS as needed.
+	(close_redir): If RED_TCP set, shutdown(2) on each end of the socket.
+
+Tue Nov 21 16:25:41 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.y: for (iggy in foo) loops: Add test that index
+	in delete statement is a simple variable.
+
+Tue Nov 14 16:11:39 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h: Add appropriate conditional versions of the gettext
+	functions if we don't have <libintl.h> or if ENABLE_NLS
+	is not defined or zero.
+	* configure.in: Add check for libintl.h header.
+
+	From Scott Deifik for PCs.
+	* awk.h (lintwarn): Call set_loc unconditionally, makes
+	compilation work on PCs.
+	* builtin.c (do_dcgettext): Compile out cat_tab and code
+	if not ENABLE_NLS.
+	* ext.c: For MSC, no long long variable.
+	* random.c: Use clock() instead of gettimeofday().
+	* builtin.c: Fixed prototypes for new random functions (ADR).
+
+Sun Nov 12 17:45:44 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (parse_next_arg): Fix call to >= num_args so
+	running out of args check is correct, instead of core dumping.
+	(format_tree): Save and restore `the_args' and `args_size'
+	if a nested call is in progress, see explanatory comment.
+	See also tests/addcomma.
+	* Makefile.am: Fix things so that gawk/pgawk built first,
+	even if `make check' called before make.  Add some
+	commentary.
+
+Wed Nov  8 14:39:20 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: Only add -rdynamic for Linux.
+	* dfa.h, dfa.c: Upgraded to versions in grep 2.4.2.
+
+Tue Nov  7 18:17:17 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* All: Switched to ANSI function headers and added
+	`ansi2knr' automake option.  Really cool.
+
+Tue Nov  7 16:57:49 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (redirect): Check for O_APPEND in flags when doing
+	fdopen() of /dev/fd/N.  Thanks to bug report from
+	"John H. DuBois III" <spcecdt@armory.com>.
+
+Tue Nov  7 14:09:14 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (os_is_setuid): Declare function.
+	* main.c (main): Call it if do_lint and warn if true.
+	* awkgram.y (tokentab):
+	- Made sure all extensions are actually marked as such.  Ouch.
+	- Changed "sort" to "asort".  Potential to break too much old code.
+	* getopt.h, getopt.c, getopt1.c: Replaced with current versions
+	from glibc CVS archive.
+
+Mon Nov  6 18:14:33 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* random.c: Replaced with recent version from FreeBSD.
+
+Mon Nov  6 15:37:12 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Major simplification of automake machinery.
+
+	* configure.in:
+	- INSTALL is forced only if not provided in environment
+	- lots of Makefile.in files removed since move to automake 1.4a
+	* Makefile.am, */Makefile.am: Moved directories that don't need
+	the automake machinery into EXTRA_DIST as appropriate and
+	removed the Makefile{,.am,.in} files as needed.
+	* eval_p.c, profile_p.c: New files to make it easier with automake
+	to compile pgawk.
+
+Tue Oct 24 12:20:18 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (valinfo, var_comp, dump_vars): New functions to dump
+	the list of global variables.
+	* awk.h: Declare dump_vars.
+	* main.c (optab): New option "dump-variables".
+	(main): Code to handle it, set the output file and then call
+	dump_vars() at the end.
+	(usage): New option added to usage message.
+
+Sat Oct 21 22:59:59 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (parms_shadow): For a function, check if any
+	parameters shadow global variables and print a warning.
+	(shadow_funcs): Go through all functions and call parms_shadow().
+	(isnoeffect, isassignable): Add Node_LINT and NODE_BINMODE.
+	* main.c (main): If do_lint, call shadow_funcs().
+	* awk.h: Add declaration of shadow_funcs().
+	* configure.in: Added m4/Makefile and awklib/eg/network/Makefile
+	to list of generated makefiles.
+
+Tue Oct 17 10:47:35 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (assoc_lookup): Reverted change that did dupnode of
+	array indices.  Creates significant problems if index is
+	numeric value and CONVFMT changes.  Added fix to set
+	bucket->ahname->stfmt to -1 so that force_string never recalculates
+	the string value, and also turned off NUM and turned on STR.
+	See test/arynasty.awk.
+
+Mon Oct 16 12:21:26 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* All: Cleaned up various lint warnings for consistent phrasing.
+	* awk.y (in_end_rule): New variable for warning about unredirected
+	getline. It's ok in a BEGIN, but not in an END.
+
+Sun Oct 15 14:14:05 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (set_FS): Add lint warning for FS = "".
+	(do_split): Ditto for 3rd arg = "".
+
+Fri Oct 13 09:17:04 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (close_redir): Clear rp->fp on all closes.  Remove
+	rp from list if either closing both ends or both ends
+	have been closed separately. Add exitwarn message for
+	co-process.
+	(flush_io): Add warning message if fflush of co-process
+	fails.  Rationalize return value to either 0 or -1.
+	* builtin.c (do_gensub): 3rd arg of zero generates a
+	warning.
+	(do_fflush): Rationalize return value: -1 for unopen or read-only
+	redirection, status of fflush otherwise.
+
+Wed Oct 11 22:11:19 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.y (for loop): Check that there is a body as
+	part of the `is it a delete statement' check.
+
+Thu Oct  5 11:56:42 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h, awkgram.y, configure.in, eval.c: Enabled
+	`for (i in_sorted array)' loops for those who
+	are Strong In The Way Of The Source.  So there.
+
+Mon Oct  2 10:09:32 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (do_close): Make close(x) for non-open x return -1
+	and update ERRNO.  close(FILENAME) no longer does anything
+	magic; this is all for better consistency with other awks
+	and is more logical, anyway.
+
+Thu Sep 28 17:27:16 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (close_one): Added a lint warning if it becomes
+	necessary to start multiplexing fd's, per ancient suggestion
+	from Scott Deifik, <scottd@amgen.com>.
+
+Tue Sep 26 14:41:41 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c: Move enum for redirection placement to top
+	of file, and make the value a parameter to pp_redir.
+	Fix all the calls.  This gets `|&' right everywhere.
+
+Sun Sep 24 16:38:04 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (freenode): Set the flags straight to UNINITIALIZED.
+	* node.c (unref): Fix test for MALLOC|TEMP to test the
+	actual flags, not zero.
+	* builtin.c (format_tree): ala print and concat, dupnode
+	the temp nodes from tree_evaling the arguments.  See
+	test/nasty2.awk.
+
+Mon Sep 18 10:16:58 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (snode): Make match 3rd arg and close 2nd arg fatal
+	errors if --tradtional.
+
+Thu Sep 14 12:22:42 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (update_ERRNO): Call gettext on result of strerror.
+	i18n rules.
+
+Wed Sep 13 14:56:11 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (r_tree_eval): Case for Node_concat. Dupnode the
+	strings ala do_print to get more consistent results.
+	Compare gawk 3.0.6 to nawk/mawk on test/nasty.awk.
+	Thanks to Andrew Sumner (andrewsumner@yahoo.com) for
+	pointing this one out.
+
+Wed Sep 13 10:06:47 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (two_way_close_type): New enumerated type.
+	(close_redir): New third param of type two_way_close_type.
+	Add smarts to two-way case for different close types.
+	Only remove it from the redir list if closing is for both ends.
+	(gawk_pclose): Check that rp->iop != NULL before closing,
+	all three versions.
+	* awkgram.y (tokentab): Allow 2nd argument to close.
+	(snode): Add lint warning.
+
+Sun Sep 10 14:16:10 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (set_FIELDWIDTHS): Generate a fatal error upon
+	encountering a negative width.
+
+Sun Sep 10 10:37:35 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkgram.y (snode): If first argument to dcgettext is a
+	string constant and --gen-po, dump the string constant to
+	the .po file too.
+	* main.c (nostalgia): Add call to fflush(stderr).
+	* eval.c (r_tree_eval): Add entries for Node_LINT and for
+	NODE_TEXTDOMAIN.
+
+Thu Sep  7 10:46:20 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_dcgettext): Per suggestion from Ulrich Drepper,
+	make the awk interface:
+
+		str = dcgettext(string [, domain [, category]])
+
+Wed Sep  6 16:28:12 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Bring gettext features out to the awk level!
+
+	* awk.h: Add declarations of new functions `do_dcgettext'
+	`do_bindtextdomain', `set_TEXTDOMAIN' and variables
+	`TEXTDOMAIN', `TEXTDOMAIN_node'.  New NODETYPE enum
+	`Node_TEXTDOMAIN'.
+	* eval.c (nodetypes): Add Node_TEXTDOMAIN at end.
+	(set_TEXTDOMAIN): New function.
+	(r_get_lhs): Add case for Node_TEXTDOMAIN.
+	* main.c (varinit): Add entry for TEXTDOMAIN.
+	* node.c (format_val): If INTLSTR use dcgettext of string
+	and TEXTDOMAIN.
+	* awkgram.y (tokentab): Add entries for "dcgettext" and
+	"bindtextdomain".
+	* builtin.c (do_dcgettext, do_bindtextdomain): New functions.
+
+Tue Sep  5 17:01:34 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* profile.c (pp_string_fp): Use lower case versions of
+	isascii and isprint to avoid printing high-bit-set
+	characters.  Make it smarter to break strings at 70
+	chars or after embedded newline, for --gen-po.
+	Fix the calls to it everywhere for new boolean option
+	to yes/no break lines.
+	* m4/strtod.m4: New file, defines GAWK_AC_FUNC_STRTOD_C89.
+	* configure.in: GAWK_AC_FUNC_STRTOD_C89 call added
+	* acinclude.m4: Include strtod.m4.
+	* acconfig.h: Add entry for STRTOD_NOT_C89.
+	Remove entries for BITOPS and NON_DEC_DATA.
+	* missing/missing.c: Add check for STRTOD_NOT_C89, use ours
+	if set.
+	* missing/strtod.c: Make smarter for input like 0x345.
+	* awk.h: [STRTOD_NOT_C89]: Define strtod gawk_strtod to get
+	our version.  Avoids linker weirdness.
+
+Mon Sep  4 09:16:43 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (set_record): Fix from Utz-Uwe Haus
+	<haus@saturn.Math.Uni-Magdeburg.DE> to make sure there's
+	always enough room in the record.
+	* builtin.c (nondec2awknum): Fix octal conversions to exit
+	when hitting a non-digit, and not go to decimal.  Make
+	check for non-octal better.  Based on bug report from
+	Morris_Lee@tvratings.com.
+
+Sun Sep  3 13:52:11 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): Allow positional parameters for
+	%*.* kinds of things.
+
+	Made octal/hex constants and strtonum on by default. Made
+	--enable-non-decimal-data a runtime switch `--non-decimal-data'.
+
+	* configure.in: Removed AC_ARG_ENABLE for --enable-bitops and
+	--enable-non-decimal-data.
+	In .developing check, remove the AC_DEFINEs.
+	* awk.h: Decls for bitwise functions now there by default.
+	Add decl of `do_non_decimal_data'.
+	* main.c (do_non_decimal_data): New variable
+	(optlist): Add new entry for `--non-decimal-data'.
+	(main): Turn off `do_non_decimal_data' if `do_traditional'.
+	(usage): Add the new option.
+	* node.c (r_force_number): Make check for non-decimal data a
+	runtime check based on do_non_decimal_data.
+	* awkgram.y (yylex): Make non-decimal constants a runtime check.
+	* builtin.c: Remove the ifdefs around the bit functions and
+	nondec2awknum.
+
+Tue Aug 29 18:45:56 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: Go back to ARRAYDEBUG if .developing set.
+	* awkgram.y: Use ARRAYDEBUG for adump(), use multiple tests
+	for stopme().
+
+Mon Aug 28 17:09:06 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (do_split): Add check for first arg is null string,
+	if so, skip the work and return zero.
+
+Mon Aug 14 23:01:55 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Add %COUNT$... handling to printf.
+
+	* awk.h (printf_count): New define in NODE structure.
+	(format_tree): Added decl.
+	* awkgram.y (count_args): New function to set printf_count in
+		a node.
+	[print productions]: Call the function.
+	* (snode): For do_sprintf, call count_args, set the count
+		in the lnode.
+	* builtin.c (format_tree): New fourth arg is argument count.
+	Add smarts to handle the `$' in a format.
+	* (do_sprintf): Use new argument to format_tree.
+	node.c (format_val): Ditto.
+
+Sun Aug 13 11:10:41 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Changes from Alan J. Broder (ajb@woti.com):
+	- Array third arg to match puts subtexts into the array:
+
+	* awk.y (tokentab): "match" gets third arg, and lint warning
+	* builtin.c (do_match): If third arg there, fill it with subtexts
+
+	- New builtin sort function:
+
+	* awk.h (do_sort): Declared.
+	* array.c (do_sort, dup_table, merge, merge_sort, assoc_from_list,
+	assoc_sort_inplace): New functions.
+
+	* eval.c (tree_eval): In debug code, make uninitialized var
+	a warning, not a fatal error.  Breaks too many things.
+
+Wed Aug  9 10:51:41 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (func_call): Increment the exec_count on the
+	function's node; this allows printing a call count for
+	functions.
+	profile.c (pp_func): Print the count for functions.
+	* ALL: Changed DEBUG to GAWKDEBUG in all gawk files, so that
+	I don't get regex/dfa debugging.  In some cases, changed
+	memory-related stuff to MEMDEBUG.  Still have work to do.
+	* awk.h, node.c, profile.c: Removed exec_count_init variable;
+	code has been cleaned up to not need different values for
+	profiling/not profiling.
+
+Thu Jul  5 21:10:59 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (casetable): Removed the USE_PURE_ASCII stuff; it
+	was never documented.  Latin 1 forever.
+	* main.c (main): Only call `init_profiling' after arg parsing
+	if `do_profiling' is still false.  Avoids resetting `prof_fp'
+	back to stderr.
+
+2000-02-17  Akim Demaille  <akim@epita.fr>
+
+	* m4: New directory.
+	* acinclude.m4: Removed, replaced by m4/*.m4.
+	* Makefile.am: Adjusted.
+	Added ACLOCAL_AMFLAGS.
+	* configure.in Adjusted.
+	Use AC_SYS_LARGEFILE not GAWK_AC_SYS_LARGEFILE, jm_FUNC_MKTIME,
+	not GAWK_FUNC_MKTIME.
+	* acconfig.h: Removed _FILE_OFFSET_BITS, _LARGEFILE_SOURCE and
+	_LARGE_FILES now templated by m4/largefile.m4.
+
+2000-02-15  Arnold Robbins  <arnold@skeeve.com>
+
+	* MOVED TO AUTOMAKE AND GETTEXT.
+	Just about every file touched.  Work done by Arno Peters.
+
+Sun Jan  2 14:48:23 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	First edit of the new millenium!
+	* awk.y (yylex): If lint checking, be obnoxious about gotos.
+
+Mon Oct 25 19:12:02 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h: Remove C_ALLOCA ifdef.
+	* main.c (main): Remove C_ALLOCA code.
+	* io.c (do_input): Ditto.
+
+Mon Aug  9 17:36:24 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* bisonfix.sed: Unconditionally #undef YYSTACK_USE_ALLOCA.
+	* configure.in: Remove all alloca and ALLOCA related stuff.
+	* Makefile.in: Ditto.
+
+Thu Jul 29 18:32:05 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (NODE): exec_count now in #ifndef NO_PROFILING.
+	* Makefile.in: Changes to only recompile eval.c and profile.c to a
+	special version for profiling.
+	* custom.h [MSC_VER]: Turn on NO_PROFILING to omit the exec_count
+	and save space.
+	* node.c (more_nodes): Move setting of exec_count to
+	#ifndef NO_PROFILING.
+
+Thu Jul  1 12:12:05 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in (AC_PREREQ): Update to 2.13.
+	GAWK_AC_C_STRINGIZE: convert to AC_C_STRINGIZE.
+	* aclocal.m4 (GAWK_AC_C_STRINGIZE): Remove definition, now
+	part of autoconf.
+	* acconfig.h (HAVE_STRINGIZE): Ditto.
+
+Wed Apr 28 11:08:05 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (assoc_lookup): Fix call to free_temp(subs) to after
+	last use of subs.
+
+Sun Apr 25 16:48:06 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (redirect): Add lint warning when same file is used for
+	> and >>.
+
+Thu Apr 22 15:05:30 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (assoc_lookup): Fix call to fatal to lintwarn instead.
+	* node.c (r_force_number): Use `0 &&' to disable warnings about
+	conversions: they're overzealous, methinks.
+
+Thu Apr  8 14:27:58 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	New features for profiling:
+
+	* awk.h (NODE): Add `exec_count' member.
+	(freenode): Clear `exec_count' upon free.
+	* awk.y (func_count): New variable, counts total number of functions.
+	(func_install): Increment func_count.
+	(struct finfo): Information for use in sorting functions when
+	pretty printing.
+	(fcompare): Compare two finfo structures.
+	(dump_funcs): Print the functions in sorted order for profiling.
+	(getfname): Return the name of a builtin function.
+	* eval.c (INCREMENT): New macro for counting execution of nodes.
+	(interpret): Call INCREMENT() appropriately.
+	* main.c (do_profiling): New flag if doing profiling.
+	`--profiling': New option added to getopt_long machinery.
+	(main): For profiled version, set do_profile and output file.
+	Call `dump_prog' and `dump_funcs' if do_profiling at end.
+	(usage): Add new argument.
+	* node.c (more_nodes, freenode): Set exec_count to zero.
+	* profile.c: New file, does pretty printing and prints counts.
+	* Makefile.in: Update to create two versions of gawk, regular
+	and `pgawk' which does profiling.
+
+Wed Mar 10 21:38:14 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (close_redir): Use update_ERRNO() instead of manually
+	doing it.
+
+Mon Dec 21 15:58:21 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: Add BeOS to list of cases where we hardwire
+	GETPGRP_VOID.
+	custom.h: Remove the #define from __be_os case. Cleaner to
+	do it all in configure. Based on email from Martin C. Brown,
+	mc@whoever.com.
+
+Mon Nov 30 20:52:52 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (update_ERRNO): New function, mainly for use by
+	extension functions.
+	* awk.h: Add decl.
+
+Tue Nov 24 18:13:29 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Changes based on submission from Christos Zoulas at D.E. Shaw
+	that adds the following features:
+	- checking for use of uninitialized variables
+	- checking if a string that's not a number converts to 0
+	- ability to load a dynamic library to add built-ins
+	- VERSION variable (may or may not stay)
+	Additional change:
+	- --lint=fatal makes lint errors become fatal
+	- LINT="fatal" has the same effect, any other positive
+	value makes lint errors be just warnings
+	* Makefile.in (includedir): New variable for gawk header files
+	(ext.c, ext.o): New source and object files
+	(OTHERS, extension): New directory for macro with example extension
+	(install): Install header files
+	* acconfig.h (DYNAMIC): New macro, true if can do dynamic loading
+	* array.c (assoc_lookup): New parameter `reference' is true if we
+	want to do reference  checking. Add appropriate reference checking
+	code.
+	* awk.h (UNITITIALIZED): New flag
+	(lintfunc): Function pointer for correct function to use
+	(lintwarn): New macro to produce warnings
+	(result): New macro for func call result, used in commented out
+	code in eval.c.
+	(getnode, freenode): Revised to set UNINITIALIZED.
+	(get_lhs): Third arg for reference checking, change all calls
+	-- Add appropriate decls of new/changed functions
+	* awk.y (tokentab): New builtin "extension" for adding extensions
+	(node_common): Set flags to UNINITIALIZED for Node_var.
+	* configure.in (dynamic linking): New check. Probably should
+	be a separate macro.
+	* eval.c (flag2str): Add UNINITIALIZED to the table.
+	(r_tree_eval): Add checks for UNINITIALIZED.
+	(push_args): Appropriate changes for UNINITIALIZED to work.
+	(r_get_lhs): New third argument for reference checking.
+	(set_LINT): Add code to handle setting `lintfunc' appropriately.
+	* ext.c: New file, for doing dynamic library extensions.
+	* extension/*: New directory with simple example code.
+	* main.c (VERSION_node, EXTENSION_node): New nodes for new vars.
+	(optab): Change for "lint" to allow optional argument.
+	(lintfunc): Definition.
+	(main): Add case in option processing for --lint.
+	(varinit): Add entries for VERSION and EXTENSION.
+	* node.c (r_force_number): Checks that string really is a number.
+	(morenodes): Set UNITIALIZED in the flags.
+	* re.c (all): Change `result' to `res' globally to avoid conflict
+	with new macro.
+	* GLOBAL: Change lint calls to warning() to  lintwarn().
+	* GLOBAL: Change all calls to get_lhs() to have 3rd arg.
+	* GLOBAL: Change all calls to assoc_lookup() to have 3rd arg.
+
+Sun Nov 22 17:07:39 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* patchlev.h: Renamed from patchlevel.h to make life
+	easier for the PC guys.
+	(main.c): Changed to include patchlev.h.
+	(Makefile.in): Changed to ref patchlev.h where needed.
+
+Sat Nov  7 21:29:52 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (r_get_lhs): case Node_field_spec.  Fix the lint
+	warnings for field reference of null string or non-numeric value.
+	When turned on, $0 generated a warning!  Oops.
+
+Thu Nov  5 16:58:38 1998 Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (init_fds): New function to pre-open 0, 1, and 2 on
+	/dev/null if they're not open. Robustness, more or less.
+	(main): Call init_fds.
+	* io.c (str2mode): Add smarts for two-letter strings
+	such as "rw", "r+", "wr", "w+" and "a+".
+
+Mon Nov  2 16:55:46 1998 Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_*): Added lint checks for non-numeric
+	and/or non-string arguments, as appropriate. This should
+	have been done long ago.
+
+Tue Oct 20 21:56:06 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (LINT_node): New variable for LINT special var
+	(Node_LINT): New node type.
+	(set_LINT): Declare function.
+	* main.c (varinit): Add LINT variable.
+	(usage): Print an emphatic pointer to the manual for bug reports.
+	* eval.c (nodetypes): New entry for Node_LINT.
+	(r_get_lhs): Case added for Node_LINT.
+	(set_LINT): Set do_lint from LINT variable.
+
+Mon Oct 19 22:35:46 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: For GCC, add -Wall to get warnings for development.
+	* Makefile.in (awktab.c): Move sed stuff to separate script.
+	* bisonfix.sed: New script, with old fix and Solaris x86 fix.
+	* awk.h (nodetype2str): Add declaration.
+	(load_procinfo): Add declaration.
+
+Tue Oct 13 22:28:56 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Changes to make PROCINFO["FS"] reflect the use of FIELDWIDTHS or FS.
+
+	* eval.c (assign_val): New function that does the mechanics of
+		 assignment
+	* main.c (load_procinfo): Add setting of PROCINFO["FS"] to "FS".
+	* field.c (update_PROCINFO): New function to update the array.
+	(set_FS): Call update_PROCINFO.
+	(set_FIELDWIDTHS): Ditto.
+
+Sun Sep 27 10:18:05 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (reisstring): New prototype.
+	* re.c (reisstring): New function, returns true if the re did
+	a simple string match. This is rather simplistic in its logic.
+	* io.c (get_a_record): In the case that RS is a regexp, AND
+	the re matched at the exact end of the buffer, add a call to
+	`reisstring' in case it's a simple string match. If so, we
+	don't need to read more into the buffer because we don't
+	have a regex like `x.*y' that might extend longer.
+	This should be very helpful for interactive /inet clients
+	where something like `RS = "\r\n"' happens.
+
+Thu Aug 13 22:07:40 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (socketopen): Fixes from Juergen Kahrs to socket
+	opening code for "any host".
+
+Tue Jul 14 19:02:33 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* aclocal.m4 (GAWK_AC_LIB_SOCKETS): Removed the caching;
+	configure gave different results the second time it was run!
+
+Fri Jul 10 09:11:06 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (interpret): Minor cleanups: add variable name to
+	fatal error Node_K_array_for and other minor changes.
+
+Mon Jun 22 16:53:34 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (tags, TAGS): Add $(LIBSRC).
+
+Tue Jun  2 15:23:05 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (devopen): Relax previous change, don't require "any",
+	just that a port be there. The user can put 0 if they
+	don't care.
+
+Wed May 27 21:33:45 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (devopen): For /inet, require that local and remote
+	ports and the remote hostname be there, and that `any'
+	be used for a port if they don't care.
+
+Thu May 21 14:13:46 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (parse_escape): Add warning that is always on
+	for \q for any unknown q inside string or regex constant.
+	I got bit by this myself once too often. Or else I'm
+	just getting old and senile.
+
+Mon May  4 12:42:49 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (NODETYPE): Sorted the Node_xxx entries for the
+	builtin variables. Gotta look nice, don't we?
+	* eval.c (nodetypes): Ditto.
+	(genflags2str): Added code to check that we don't
+	overflow the static buffer. This is just a debugging
+	routine, not worth the hassle of dynamic allocation.
+
+Mon Mar  2 16:06:16 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (dist): Remove any embedded copied RCS or CVS
+	directories.
+
+Mon Feb 23 00:09:52 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (genflags2str): Add declaration.
+	* eval.c (genflags2str): New function.
+	(flags2str): Use new general purpose function.
+	* io.c (redflags2str): Same.
+
+Sun Feb 22 23:57:29 1998  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Significant changes to add two-way i/o and sockets!!!
+
+	* Makefile.in: Add @SOCKET_LIBS@ to LIBS variable.
+	* acconfig.h: Add HAVE_SOCKETS and HAVE_PORTALS defs.
+	* aclocal.m4: New macro GAWK_AC_LIB_SOCKETS.
+	* awk.h: New node type, Node_redirect_twoway, and new redirection
+	flags: RED_TWOWAY, and RED_SOCKET.
+	* awk.y (parser): Add TWOWAYIO token and appropriate productions.
+	(yylex): Recognize `|&' token if not traditional.
+	* builtin.c (do_print, do_printf): Flush buffer if TWOWAYIO.
+	* configure.in: Add header checks for networking header files,
+	add --enable-portals switch, call GAWK_AC_LIB_SOCKETS
+	* eval.c (nodetypes): Add string constant for Node_redirect_twoway.
+	* io.c (redflags2str): New function.
+	(redirect): Better error message in default case, add code for
+	Node_redirect_twoway.
+	(socketopen): New function.
+	(iop_open, devopen): Add recognition of `/inet/...'.
+	(two_way_open): New function.
+
+Sat Dec 13 21:15:07 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (struct node): New member, `param_list' in union `x', becomes
+	`node->parmlist' in the code.
+	* awk.y (func_install): Rearranged a bit, to build up a list of
+	the function parameter names and to save it in the `parmlist' field.
+	* eval.c (push_args): New parameter, `varnames', which is the list
+	of variable names.  Use this to set the vname field of each
+	parameter's value as it's created. Special case arrays to include
+	where they came from, mainly for array vs. scalar diagnostics.
+	(r_tree_eval): Don't set the `vname' field for parameters.
+	(pop_fcall): Free the `vname' field if it's an array.
+	(func_call): Pass in the `parmlist' field to call of push_args().
+	(r_get_lhs): For Node_subscript, change error message to use
+	the `vname' field.
+	(stopme): New do-nothing function for use with debugging code
+	and setting breakpoints.
+
+Thu Dec  4 15:18:17 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.y: Fixed several lint checks and moved some into
+	test for do_lint_old.
+	* eval.c (fmt_index): Add value of bad format spec to
+	error message.
+
+Tue Nov 18 22:19:02 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (install): Strip the installed binary.
+	From Anatoly A. Orehovsky (tolik@mpeks.tomsk.su).
+
+Sun Nov 16 22:12:39 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (in_array, assoc_lookup): Add symbol->vname to
+	fatal calls for scalar in array context.
+
+Wed Nov 12 22:18:33 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h [ISASCII]: On all IS* macros, add cast to unsigned char.
+	[TOUPPER, TOLOWER]: New macros using unsigned char.
+	* awk.y: Change to use of IS* vs. is* macros.
+	* builtin.c (nondec2awknum): Change to use of IS* vs. is* macros,
+	change casts for casetable[] from int to unsigned char.
+	use new TOLOWER, TOUPPER macros
+	* dfa.c [ISASCII]: On all IS* macros, add cast to unsigned char.
+	(lex): Change isdigit to ISDIGIT.
+	[TOUPPER, TOLOWER]: New macros using unsigned char, now used.
+	* eval.c (fmt_ok): Change to use of IS* vs. is* macros.
+	* field.c (sc_parse_field): Change to use of IS* vs. is* macros,
+	change casts for casetable[] from int to unsigned char.
+	(set_FS): Change to use of IS* vs. is* macros.
+	* io.c (get_a_record): Change to use of IS* vs. is* macros,
+	change casts for casetable[] from int to unsigned char.
+	* main.c (main): Change to use of IS* vs. is* macros.
+	* node.c (r_force_number, parse_escape): Change to use of IS* vs.
+	is* macros.
+	* re.c (make_regexp): Change to use of IS* vs. is* macros.
+	* regex.c [ISASCII]: On all IS* macros, add cast to unsigned char.
+
+Sun Oct 19 12:36:47 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ALL: Change email address to arnold@gnu.org in all relevant places.
+
+Wed Oct 15 03:38:12 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.y (yylex): Don't allow newlines after ? or : if do_posix.
+
+Thu Oct  9 19:28:39 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* custom.h [SEQUENT]: Removed; not needed any more since the
+	mmap code was ripped out.
+
+Wed Oct  8 17:22:03 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in: Remove check for madvise; don't need it any more
+	after nuking use of mmap.
+
+Tue Oct  7 11:14:21 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (flags2str): Made the code table driven. Shortened a lot.
+
+Tue Sep 30 20:59:17 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (r_get_lhs): case Node_field_spec.  Add lint warnings
+	for field reference of null string or non-numeric value.
+	Based on patch submitted by Alan Broder, ajb@dtmr.com.
+
+Wed Sep 24 20:47:59 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* custom.h [TANDEM]: New changes. Finishes up Tandem
+	integration.
+
+Mon Sep 22 00:42:34 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* custom.h [__be_os]: Remove BROKEN_TOKEN definition.
+	* dfa.c, dfa.h: Change `token' to `dfa_token' to avoid BeOS
+	compile problems.
+
+Thu Aug  7 22:35:17 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Changes for BeOS from mc@whoever.com
+
+	* awk.h (strncasecmp): Bracket prototype.
+	custom.h [__be_os]: New stuff.
+	dfa.h, dfa.c [BROKEN_TOK]: New ifdefs to use dfa_token, not token.
+
+Fri Aug  1 13:32:49 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Tandem changes:
+
+	* awk.h [TANDEM]: Misc additions, as needed.
+	* io.c (get_a_record): Changes for fixed length records; not used
+	on other systems.
+	* main.c (MRL): New variable, TANDEM specific.
+	(main): Update handling -mr option for TANDEM.
+	(load_environ): Comment out whole routine if TANDEM.
+	missing.c [TANDEM]: New includes.
+	gawkmisc.c [TANDEM]: Include `tmiscc'.
+
+Wed Jul 30 19:53:52 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Close-on-exec changes:
+
+	* awk.h: (os_close_on_exec, os_isdir): New functions.
+	* gawkmisc.c: Add include fcntl.h.
+	* configure.in [AC_CHECK_HEADERS]: Add fcntl.h.
+	* io.c (devopen, iop_open): Change to use os_isdir(), not S_IFDIR().
+	(redirect, devopen, iop_open, gawk_popen): Change all calls to
+	fcntl() to os_close_on_exec().
+
+Tue Jul 29 11:09:45 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (set_BINMODE): Fixed check for digits to use isdigit()
+	instead of looping over digits and using strchr(). Duh.
+
+Sat Jul 26 22:52:08 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (set_BINMODE): Fix so that `-v BINMODE=w' works.
+	* node.c (r_force_number): Add decl of strtod(); makes things
+	work on MIPS.
+	* Makefile.in (install-strip): New target.
+
+Fri Jul 18 13:28:05 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (redirect, devopen, iop_open, gawk_popen): Set the
+	close-on-exec flag on all files and pipes opened for I/O.
+	Keeps children run via system() or other pipes from running out
+	of file descriptors.
+
+	(Reported by Kenny McCormack, gazelle@yin.interaccess.com.)
+
+Tue Jul  8 22:18:00 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.y [LEX_NEXT]: Removed support for `next file' as two words.
+
+Tue Jul  8 06:46:32 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfa.c: Changes from pjr@jet.UK (Paul J Rippin) from an old
+	bug report against 2.14.0 that speed up initialization and
+	rewrite the inner loop into readable code.
+
+Thu Jul  3 11:44:50 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Atari support moved into new `unsupported' directory.
+	awk.h, Makefile.in, gawkmisc.c, and missing.c modified.
+
+Sun Jun 29 14:17:37 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.y (exp): Fixed warning about `x = /foo/'.
+
+Wed Jun 25 09:07:57 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* PORTS: Removed from distribution.
+	* Makefile.in (MISC): Removed PORTS.
+
+Sun Jun 22 11:52:57 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	BINMODE changes.
+
+	* awk.h (Node_BINMODE): Added.
+	(struct redirect): Added mode field to save for io.c:close_one().
+	(BINMODE, BINMODE_node, set_BINMODE): Add declarations.
+	* awk.y (isnoeffect): Add Node_BINMODE.
+	* eval.c (nodetypes): Add Node_BINMODE string.
+	(r_tree_eval, r_get_lhs): Add cases for Node_BINMODE.
+	(set_BINMODE): New function.
+	* io.c (binmode): New function.
+	(nextfile, redirect, gawk_popen): Add calls to binmode().
+	* main.c (BINMODE, BINMODE_node): Add decls.
+	(main): Add call to setmode() if BINMODE is set.
+	(varinit): Add entry for BINMODE.
+
+Wed Jun  4 21:52:25 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* configure.in [AC_FUNC_MMAP]: Removed call.
+	* awk.h [struct iobuf]: Removed IOP_MMAPED flag and `getrec' member.
+	* io.c: Removed all mmap related code.
+
+Sun Apr 27 16:23:56 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* aclocal.m4 [GAWK_AC_FUNC_MKTIME]: New macro.
+	* configure.in (GAWK_AC_FUNC_MKTIME): Call it.
+
+Thu Apr 24 23:25:06 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (devopen): Remove stat test for /dev/foo files. Finally.
+
+Fri Jul 26 09:23:15 1996  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Changes to add an abort statement, a la tawk.
+
+	* awk.h (Node_K_abort): New enum value for NODETYPE.
+	* main.c (aborting): New flag variable.
+	(main): Add logic to handle aborting.
+	* eval.c (interpret): Add case for Node_K_abort.
+	* io.c (do_input): If aborting, break loop.
+	* awk.y (tokentab): Add entry for "abort" keyword
+	(PRODUCTIONS): Add production for LEX_ABORT.
+
+Wed Jul 24 12:49:52 1996  Arnold D. Robbins  <arnold@skeeve.com>
+
+	First cut at changes for i18n.
+
+	* awk.h (do_intl): Declare new flag variable.
+	[INTLSTR]: New flag def.
+	(m_tree_eval): Fix definitions for INTLSTR.
+	(force_string): Fix definitions for INTLSTR.
+	* awk.y (yylex): Add _"..." for international strings.
+	(dumpintlstr): New function.
+	* main.c (do_intl): Define new flag variable.
+	(optab): Add "gen-po" entry.
+	(main): If do_intl, exit, don't run the program.
+	(gawkoption): Add "gen-po" entry.
+	* node.c (r_force_string): Call gettext if flags indicate INTLSTR.
+
+Thu Mar 14 06:29:42 1996  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (do_mktime): Added declaration of new function.
+	* builtin.c (do_mktime): New function.
+	* awk.y (tokentab): Added "mktime" to list of gawk extensions.
+	* missing.c [HAVE_MKTIME]: Added include of mktime.c if needed.
+
+Mon Feb 26 22:32:19 1996  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (pidopen, useropen): Added warnings to use PROCINFO[],
+	not special files.
+	* main.c (load_procinfo): New function.
+	* awk.y (variable): Added call to load_procinfo() function.
+
+Mon Aug  7 15:23:00 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.6: Release tar file made.
+
+Thu Aug  3 17:47:53 2000  Greg McGary  <greg@mcgary.org>
+
+	* regex.c: Patches for gcc bounded pointer handling.
+
+Thu Aug  3 13:09:09 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (in_array, do_delete): Fix tests for index equality
+	when searching through the array to work correctly when
+	index is "".
+
+Fri Jul 14 21:40:17 2000  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* builtin.c (format_tree): Workaround a DEC C V5.7 bug by
+	splitting `strcpy() + 3' into two expressions (the builtin
+	inline strcpy evidently has erroneous return type of void *
+	instead of char *; reputedly fixed in V6.1).
+
+	* eval.c (C): New macro.
+	[casetable]: Use it to add explicit casts for the character
+	values outside the range of 0 to 127.
+	* missing/strncasecmp.c [C, charmap]: Likewise.
+
+	* io.c (redirect): Add EIO check on failed open for VMS.
+
+Fri Jul 14 11:57:23 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Efficiency hack: turn `for (iggy in foo) delete foo[iggy]'
+	into moral equivalent of `delete foo'.
+
+	* array.c (do_delete_loop): New routine.
+	* awk.h [NODETYPE]: New Node_K_delete_loop value.
+	Add declaration of do_delete_loop.
+	* awk.y [LEX_FOR]: Fix code to recognize special case.
+	* eval.c (nodetypes): New entry for Node_K_delete_loop.
+	(interpret): Add case for Node_K_delete_loop, add more
+	diagnostic info in default (cant_happen) case.
+
+Tue Jul 11 22:15:10 2000  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* awk.y (nextc): Recast unsigned char values back to int to
+	prevent VAX C from truncating EOF to 255.
+
+Tue Jul 11 14:08:23 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (do_delete): Switch to string comparison, not
+	cmp_nodes.
+	(assoc_find): Add call to force_string on subscript.
+	* eval.c (interpret): Case Node_K_arrayfor: check for
+	Node_array_ref and fetch original_array. Yowser.
+
+Fri Jun 30 21:57:00 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (assoc_lookup): Don't force the subscript
+	to be a string.  Not a good idea after the change
+	to using dupnode.
+
+Sun Jun 25 15:08:19 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.5: Release tar file made.
+
+Wed Jun 14 13:03:45 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* field.c (set_record): Manage a private buffer for $0.
+	Keeps things safe in case `getline var' rearranges the
+	IOBUF's contents that $0 is still pointing into.
+
+Tue Jun 13 16:27:55 2000  Paul Eggert  <eggert@twinsun.com>
+
+	Upgrade to latest and greatest version of largefile code.
+
+	* configure.in (AC_CANONICAL_HOST): Remove.
+	(GAWK_AC_SYS_LARGEFILE): Defer until after AC_MINIX,
+	to avoid autoconf warnings.
+
+	Rewrite largefile configuration so that we don't need to run
+	getconf and don't need AC_CANONICAL_HOST.
+	* config.guess, config.sub: Remove these files.    
+	* Makefile.in (MISC): Remove config.guess, config.sub.
+	* m4/largefile.m4 (GAWK_AC_SYS_LARGEFILE_FLAGS,
+	GAWK_AC_SYS_LARGEFILE_SPACE_APPEND): Remove.
+	(GAWK_AC_SYS_LARGEFILE_TEST_INCLUDES): New macro.
+	(GAWK_AC_SYS_LARGEFILE_MACRO_VALUE): Change arguments from
+	CODE-TO-SET-DEFAULT to VALUE, INCLUDES, FUNCTION-BODY.
+	All uses changed.
+	Instead of inspecting the output of getconf, try to compile the
+	test program without and with the macro definition.
+	(GAWK_AC_SYS_LARGEFILE): Do not require AC_CANONICAL_HOST or check
+	for getconf.  Instead, check for the needed flags by compiling
+	test programs.
+
+	(GAWK_AC_SYS_LARGEFILE): Define _XOPEN_SOURCE to be 500 to
+	work around glibc 2.1.3 bug.
+
+	(GAWK_AC_SYS_LARGEFILE_FLAGS): Don't use -n32 on IRIX if the
+	installer said otherwise.
+
+	(GAWK_AC_SYS_LARGEFILE_FLAGS): Work around a bug in the QNX shell,
+	which doesn't propagate exit status of failed commands inside
+	shell assignments.
+
+Wed Jun  7 13:23:09 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Updated copyright dates in appropriate files.
+
+Mon May 22 17:29:43 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (clean): Get `*/core' too.
+
+Sun May  7 16:33:05 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (concat_exp): Change ref to `lnode->stlen' and
+	`lnode->stptr' for SUBSEP to use `var_value->...'.
+
+Tue May  2 09:54:29 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Fix referencing freed memory as shown by test/arynocls.* tests.
+	* awk.h [Node_array_ref]: New node type.
+	[orig_array]: New macro element in NODE structure.
+	* field.c (do_split): Handle case for Node_array_ref, fetch
+	the original array.
+	* array.c (in_array, do_delete): Ditto.
+	* eval.c (nodetypes[]): Add Node_array_ref string.
+	(r_tree_eval): Handle case for Node_array_ref.
+	(push_args): Push arrays as Node_array_ref, and pass them on.
+	(pop_fcall): Don't unref lnode if it's an array when releasing
+	local arguments.  Check for both Node_array and Node_array_ref.
+	(r_get_lhs): Choke on Node_array_ref as for Node_array.
+	For Node_subscript, handle Node_array_ref.
+
+Tue May  2 09:52:12 2000  Bruno Haible  <haible@clisp.cons.org>
+
+	* io.c (redirect): After reopening a `struct redirect', move it to
+	the head of the list.
+
+Sun Apr  2 17:51:40 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* re.c (re_update): Check if IGNORECASE has changed, and
+	if so recompute the re.  See test/igncdym.awk.
+
+Mon Mar 20 16:18:34 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* io.c (set_RS): Added a lint warning about multicharacter RS,
+	per suggestion from Akim DeMaille (akim@epita.fr).
+
+Sun Feb 13 14:40:32 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (push_args): Fix from Nide Naoyuki <nide@ics.nara-wu.ac.jp>,
+	re-assign `f' in case tree_eval moved fcall_list around.
+
+Sun Feb  6 11:39:33 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (op_assign):  Fix it right.  For ++ and --, get the lhs
+	in the operations, do the op, and then return.  For += etc,
+	get the rhs FIRST, since the lhs can move around as a result,
+	*then* get the lhs and do the operation. See test/opasnidx.awk.
+
+Tue Feb  1 18:41:40 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (op_assign): Reget the rval after regetting
+	the left hand side.  See test/opasnslf.awk for why.
+
+Thu Jan 27 18:06:31 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.y (yylex): Made ']' not one of the characters
+	that sets `want_assign' to false.  `a[i] /= 2' was
+	broken.  Per bug report from Kristofer T. Karas
+	<ktk@ktk.bidmc.harvard.edu>.
+
+Wed Dec 22 15:06:37 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.y: Removed declarations of functions before
+	definition of `tokentab[]'.  They're redundant with
+	what's in awk.h.
+
+Thu Dec  9 17:01:07 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (parse_escape): Add lint warning for unrecognized
+	escape sequences.
+
+Mon Dec  6 15:17:34 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (usage): Changed bug reporting email addresses to
+	be a reference to `Bugs' node in the online and printed
+	doc, instead.
+
+Thu Dec  2 13:08:18 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (do_compl): Test `d' for negative inside the do_lint
+	test, not uval.  Ooops.
+
+Fri Nov 26 10:58:36 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (assoc_find):  ALWAYS compare indexes as strings,
+	don't use cmp_nodes in case they are numeric.  Oh my.
+	Talk about a Day 1 bug!
+
+Tue Nov 23 11:58:53 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex.c (SYNTAX): Cast argument to `unsigned char' instead of
+	&-ing with 0xFF.  Hopefully somewhat more portable, ala 21 Nov 99
+	changes to awk.y.
+
+Sun Nov 21 22:25:27 1999  Paul Eggert  <eggert@twinsun.com>
+
+	* aclocal.m4 (AC_SYS_LARGEFILE_FLAGS): Work around a
+	problem with the QNX 4.25 shell, which doesn't propagate exit
+	status of failed commands inside shell assignments.
+
+Sun Nov 21 20:33:35 1999 Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h (nextc): Remove declaration, don't need it here.
+	awk.y (nextc): Cast values to unsigned char so that latin-1
+	characters in strings don't turn themselves into EOF.
+	Most notably y-umlaut, which is decimal 255.
+
+Mon Nov  1 20:00:25 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regex.c (init_syntax_once): Move below definition of
+	ISALNUM etc., then use ISALNUM to init the table, so that
+	the word ops will work if i18n'ed.
+	(SYNTAX): And subscript with 0xFF for Latin-1 characters.
+
+Mon Oct 25 18:37:13 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.h, main.c, io.c: Undo previous changes (22 Oct 1999).
+	* main.c (main): Move call to `init_fields()' to before
+	arg parsing.  This allows `-v NF=blah' to work ok.
+
+Fri Oct 22 17:43:40 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (arg_assign): Add new arg, `initing' for icky special
+	casing of -v of special variables.  Use it to check for NF.
+	May need to add other cases later.
+	(pre_assign): Change call arg_assign, passing initing=TRUE;
+	io.c (nextfile): Change call arg_assign, passing initing=FALSE;
+	awk.h: Change prototype for arg_assign.
+
+Tue Oct 19 16:06:48 1999  Paul Eggert  <eggert@twinsun.com>
+
+	* io.c (close_redir): Don't munge errno between setting it and
+	using it.
+
+Wed Oct  6 17:47:47 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* main.c (arg_assign): Return NULL on bad variable.  Allows
+	things like `./3x=stuff' to work as a filename.
+
+Thu Sep 23 21:35:46 1999  Paul Eggert  <eggert@twinsun.com>
+
+	* aclocal.m4 (GAWK_AC_SYS_LARGEFILE_FLAGS): Work around GCC
+	2.95.1 bug in HP-UX 10.20 or later. (Had to fix the fix. ADR. :-)
+
+Tue Sep 21 13:31:36 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* builtin.c (format_tree): For '0', only set zero_flag if we
+	haven't seen the field width or precision yet.
+
+Mon Aug  9 13:06:01 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* array.c (assoc_lookup): Removed code that gave each array
+	a private copy of each index.  Balloons memory usage for
+	no good reason that I can see.  Just use dupnode in all
+	cases.
+	* configure.in: Check for $srcdir/.developing adds extra
+	defines for my testing/debugging use.  Yes, hack alert.
+
+Sun Aug  1 11:02:02 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* node.c (dupnode): Turn off FIELD when copying nodes.
+	* array.c (do_adump, assoc_dump): New functions for array debugging.
+	* awk.y (tokentab): Conditionally add "adump" function for debugging.
+	* awk.h: Delcare new functions.
+
+Thu Jul 29 23:26:40 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	From wsanchez@apple.com:
+	* Makefile.in (install-strip): New target, coding stds. compatibility.
+	* config.guess, config.sub: Add MacOS X recognition.
+
+Thu Jul 29 19:09:19 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awk.y (func_install): Make `function foo(foo)' a fatal error.
+	eval.c (r_tree_eval): Diagnose use of a function name as a
+	variable inside the function.
+
+Sun Jul  4 16:53:14 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* eval.c (eval_condition): Add extra braces to avoid
+	gcc warning.  I'm not going to bother for the library
+	code like dfa and regex.
+
+Wed Jun 30 16:14:36 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Release 3.0.4: Release tar file made.  This time for sure.
+
+Wed Jun 30 16:10:11 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* awk.h: Add include of <assert.h>, and comment about config.h
+	having to be included before any system headers.  Otherwise,
+	with egcs-2.91.66 and later on Linux systems, and possibly
+	others, things break badly, due to the LFS macros.
+	* awk.y, builtin.c, eval.c, field.c, io.c: Removed include
+	of assert.h
+
+Wed Jun  9 11:39:19 1999  Paul Eggert  <eggert@twinsun.com>
+
+	Port the large-file code to AIX, HP-UX, and IRIX.
+	Add cross-compilation support for large files.
+
+	* config.guess, config.sub: New files.
+
+	* configure.in (AC_CANONICAL_HOST):
+	Add; GAWK_AC_SYS_LARGEFILE needs this.
+	(GAWK_AC_SYS_LARGEFILE): Renamed from GAWK_AC_LARGE_FILES.
+
+	* aclocal.m4 (GAWK_AC_SYS_LARGEFILE): Renamed from GAWK_AC_LARGE_FILES.
+	Add support for AIX and HP-UX.
+	(GAWK_AC_SYS_LARGEFILE_FLAGS, GAWK_AC_SYS_LARGEFILE_SPACE_APPEND,
+	GAWK_AC_SYS_LARGEFILE_MACRO_VALUE): New macros.
+
+	* acconfig.h (_FILE_OFFSET_BITS, _LARGEFILE_SOURCE, _LARGE_FILES):
+	New macros.
+
+	* Makefile.in (MISC): Add config.guess and config.sub so they get
+	included in the distribution.
+
+Wed Jun  9 11:29:29 1999  Paul Eggert  <eggert@twinsun.com>
+
+	* io.c (iop_alloc): Don't mmap files whose sizes don't fit in `int'.
+	[ This isn't really needed, as HAVE_MMAP is #undef'ed at the top,
+	but it's there in case people want to take their life in their hands. ]
+
+Sun Jun  6 11:28:07 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* BETA Release 3.0.46: Release tar file made.
+
+Wed Jun  2 14:36:24 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* PORTS: Updated with a more recent list of systems
+	that gawk compiles and tests ok on.
+
+Tue Jun  1 14:24:59 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* BETA Release 3.0.45: Release tar file made.
+
+Tue May 25 16:32:37 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* builtin.c (format_tree): More smarts for weird cases, such as
+	zero precisions and zero values used with the `#' flag.
+	Thanks to Andreas Schwab (schwab@gnu.org) for pointing these out.
+
+Wed May 19 14:02:54 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* io.c (do_close): Move test for `close(FILENAME)' to after
+	loop through all open redirections. Fixes problems in obscure
+	cases with redirections in END rules.
+
+Sun May 16 14:08:39 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* awk.y (yylex): Fix group of characters including ',' to
+	set want_assign = FALSE.  Fixes bizarre parsing problems in
+	function call lists, for example.
+	* io.c (get_a_record): Repair logic for single-leading-newline
+	case.
+
+Tue May 11 16:48:11 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* aclocal.m4 (GAWK_AC_AIX_TWEAK): New macro.
+	* configure.in: Call it
+	* Makefile.in: (awklib/all): Pass CFLAGS on to sub-make so
+	that password programs will get AIX magic defines. Avoids
+	having to tweak program code for those in doc/gawk.texi.
+
+Mon May  3 16:56:23 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* array.c (do_delete): Don't free_temp(subs) until after all
+	references to it are finished.
+
+Mon May  3 13:41:16 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* BETA Release 3.0.44: Release tar file made.
+
+Sun May  2 18:25:43 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* io.c (get_a_record): Do a really good job of stripping newlines
+	from the front of records when RS = "" and there's only one
+	newline at the front of the file, which the regex didn't catch.
+
+Wed Apr 28 12:27:49 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* configure.in: More HP stuff: fix the manual alloca code so that
+	gawk will compile and link on HP systems. See the comments.
+
+Sun Apr 25 13:39:16 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (gawk): Add $(CFLAGS) to linking step.
+	* configure.in: Correctly do AC_FUNC_GETPGRP on HP systems too.
+
+Tue Apr 13 20:21:00 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* BETA Release 3.0.43: Release tar file made.
+
+Tue Apr 13 19:02:20 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* io.c (useropen, pidopen): Add casts to int on arguments to
+	silence gcc warnings.
+	* regex.c (regcomp,regexec,regfree): Add ifdef for APPLE.
+
+Thu Feb  4 10:38:02 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* custom.h: Hacks for BeOS. Not documented in the manual right now.
+	* configure.in: Hacks for BeOS.  Check for HP-UX and define C_ALLOCA
+	if not using gcc.  I wish they'd just fix bison already.
+
+Sun Dec 20 16:57:38 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* BETA Release 3.0.42: Release tar file made.
+
+Sun Nov 15 21:05:39 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* io.c (gawk_popen): Add WIN32 to list of systems that use
+	the non-real-pipe version. From the PC gawk guys.
+
+Wed Nov  4 11:32:24 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* BETA Release 3.0.41: Release tar file made.
+
+Tue Nov  3 16:24:35 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* eval.c (r_get_lhs): Fix the cases for the special variables,
+	don't unref their current value if it's the same as the internal
+	copy; perhaps the current one is used in a concatenation or some
+	other expression somewhere higher up in the call chain.  Ouch.
+	See test/getnr2tm.awk.
+
+Sun Nov  1 15:24:52 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* builtin.c (format_tree): Improve handling of zero-fill
+	when a precision is present. See test/zeroflag.awk.
+
+Wed Oct 28 20:40:17 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* eval.c (r_tree_eval): Case for Node_concat. Get lengths
+	separately, in case one expression has a side effect that
+	that changes another. Ugly, but it keeps gawk from core
+	dumping. See test/nasty.awk.
+
+Sun Oct 18 21:27:24 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* awk.y (append_right): Bug fix, if `list' or `new' are NULL,
+	return `list', so that things don't break too badly.
+	* regex.c (re_compile_fastmap): Remove unused variable `num_regs'.
+
+Thu Oct  8 19:36:57 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* BETA Release 3.0.40: Release tar file made.
+
+Mon Jul 27 10:14:33 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* node.c (parse_escape): Remove assignment with side effects
+	from ISXDIGIT test. Thanks to "Mihai T. LAZARESCU"
+	<mihai@ccmserv.polito.it> for pointing this out.
+
+Mon Apr 27 11:31:32 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* main.c (usage): Fix the email address for the bug list.
+	(copyleft): Update the copyright year.
+
+Mon Mar 23 21:22:32 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* eval.c (r_get_lhs): Make sure that values of type
+	Node_param_list don't have the FUNC flag set. This means
+	we don't allow the use of a function name as a variable or
+	array from within the function.
+
+Sun Mar 22 19:12:32 1998  Paul Eggert  <eggert@twinsun.com>
+
+	* aclocal.m4 (GAWK_AC_LARGE_FILES): New macro that checks for
+	large file support, and updates CPPFLAGS, LDFLAGS, LIBS as
+	needed.
+	* configure.in: Call GAWK_AC_LARGE_FILES.
+	* Makefile.in (CPPFLAGS, LDFLAGS): Let autoconf configure.
+	(COMPFLAGS): Add $(CPPFLAGS).
+
+Mon Mar 16 14:06:41 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* field.c (using_FIELDWIDTHS): New macro.
+	(using_fieldwidths): Use new macro.
+	(do_split): In case for FS_DFLT, also check that
+	we're not using FIELDWIDTHS. Otherwise, split() would use
+	FIELDWIDTHS, not current value of FS. Oops.
+
+Sun Nov 16 20:08:59 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* builtin.c (sub_common): Fix for count of matches in gsub
+	from Geert.Debyser@esat.kuleuven.ac.be.
+
+Wed Oct 15 03:38:12 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* field.c (set_FS): Use `sc_parsefield' if the value of FS is not
+	alphabetic OR if not ignoring case. Bug fix if IGNORECASE
+	is true and FS happens to be '^'. Sheesh, talk about obscure.
+	(rebuild_record): Add more smarts to the code that sets up the
+	fields. Thanks to Alan J. Broder (ajb@dtmr.com).
+
+Sun Oct  5 11:56:52 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* configure.in: If ISC add -D_SYSV3 to CFLAGS, per email from
+	Mario Vanoni (vanonim@dial.eunet.ch).
+
+Fri Sep 26 00:57:49 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* awk.y (append_right): Return if either list is NULL. Prevents
+	syntax errors from causing core dumps.
+
+Wed Sep 17 15:34:15 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* field.c (rebuild_record): Set things up so that all fields point
+	into the new record and release any changed fields without
+	causing memory leaks.  Avoids problems when fields are extended
+	with the value of $0 or other fields and then $0 is assigned to.
+
+Mon Sep 15 16:12:55 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* builtin.c (do_print): When testing for NUMBER, make sure
+	it's not a string too. Thanks to Michael Brennan for
+	clarifying the semantics.
+
+Sun Sep 14 19:55:12 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* node.c (format_val): Always format values ourselves: avoids
+	problems if OFMT is bizarre, like %s.
+
+Sun Sep 14 00:08:53 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* io.c (get_a_record): Replace all occurrences of the test
+	`grRS == FALSE' with `RS_is_null' which makes ` RS = "\0" '
+	actually work, is clearer code, and actually makes use of
+	the `RS_is_null' variable!
+
+Sun Aug 17 07:15:12 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* field.c (set_FS): Change logic to always set parse_field, even
+	if FS hasn't changed. Thanks to Igor Sheyn for catching this.
+
+Wed Aug  6 21:04:37 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* io.c (VMS et al gawk_popen): Use pclose, not fclose, if
+	iop_alloc fails.
+
+Wed Jul 30 19:53:52 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* awk.y [variable]: Fix case for subscript if $3 == NULL.
+
+Sun Jul 27 22:47:30 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* awk.y (get_src_buf): Don't close file if it's stdin.
+
+Sun Jul 27 22:47:15 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* io.c (#if VMS: vmsrtl_fileno): New routine.
+	(#if VMS: fileno): New macro substituted for stdio one.
+
+Thu Jul 17 20:05:59 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* builtin.c (do_print): When OFMT != CONVFMT, create a new
+	temporary node with just the numeric value valid and format it,
+	and use that for printing. Avoids memory corruption.
+
+Wed Jul 16 10:01:16 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* regex.c: When SYNTAX_TABLE is defined, but not emacs, then
+	CHAR_SET_SIZE is not defined, though used in regcomp.  It should
+	be taken out of #ifdef SYNTAX_TABLE. Fix from bug group, from
+	Akim Demaille, demaille@inf.enst.fr.
+	* awk.h (isnondecimal): Make test a little smarter.
+	* builtin.c (nondec2awknum): Add bailout for decimal numbers, e.g.
+	`00.1'. Fix from Larry Schwimmer <rosebud@cyclone.Stanford.EDU>.
+
+Thu Jun 19 19:00:40 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* eval.c (interpret): case Node_K_next, Node_K_nextfile: fatal
+	error if called from BEGIN or END.
+	(Fixed completely Mon May  3 13:31:42 1999.)
+
+Mon Jun  9 22:40:04 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* builtin.c (nondec2awknum): Allow `f' and `F' in hexadecimal numbers.
+	Gotta get more sleep...
+	* array.c (assoc_lookup): Fix from Tom Karzes (karzes@equator.com)
+	for memory leak when forcing type to Node_var_array.
+
+Thu May 15 12:49:08 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.3: Release tar file made.
+
+Wed May 14 08:06:08 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (do_close): Add lint warning if closing something that
+	isn't open.
+
+Tue May 13 12:14:12 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* random.c, builtin.c: Remove __GLIBC__ tests, since it breaks
+	`make test'. I prefer consistency across platforms.
+	* Makefile.in (gawk): Undid April 25 changes and added comment.
+	Putting COMPLAGS in breaks with -g on VMS POSIX.
+
+Sun May 11 14:48:04 1997  Darrell Hankerson  <hankedr@mail.auburn.edu>
+
+	* io.c [MSC_VER]: Add cases for WIN32.
+	* regex.c [MSC_VER]: Add cases for WIN32.
+
+Sun May 11 07:04:01 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (do_print): In the loop that evaluates each expression
+	to be printed, do a dupnode to avoid bizarre output. Thanks to
+	Michal for finding this problem.
+	* awk.y (yylex): Fix scanning of hexadecimal constants.
+
+Wed May  7 15:09:25 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (get_a_record): Fix casetable indexing with cast to int.
+	Keeps Michal happy.
+
+Tue May  6 16:40:19 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* eval.c (func_call): Removed unneeded variables.
+
+Mon May  5 21:17:37 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* missing/strftime.c [case 'v', VMS_EXT]: For VMS date format, two
+	digit day of month should not be zero padded on the 1st through
+	the 9th.
+
+Mon May  5 06:33:47 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* regex.h, regex.c: Merge with current GLIBC version.
+
+Mon May  5 06:33:47 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* io.c (nextfile): Move the check for null return from iop_open
+	in the normal case and add one for the "no args" case.
+
+Fri Apr 25 16:52:33 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* array.c (grow_table): Add a bunch more large primes so arrays
+	can get really big. Thanks to christos@deshaw.com.
+	* all files: Remove ifdef'ed out code and update copyrights.
+	* Makefile.in (gawk): Add $(COMPFLAGS) to command line.
+	* eval.c (flags2str): Added case for FIELD.
+
+Thu Apr 24 22:39:23 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* COPYING: Changed to current official version from FSF.
+	* regex.c: Merge with GLIBC version.
+	* awk.h [_GNU_SOURCE]: Bracket definition inside ifdef.
+	(NODE.source_line): Move name member out of `x' union and
+	into `nodep'; avoids problems doing diagnostics.
+	(nondec2num): Put decl into #if BITOPS || NONDECDATA
+	* posix/gawkmisc.c, missing/system.c, missing/strtod.c,
+	missing/strerror.c: Move to generic GPL statement at top.
+	* builtin.c (nondec2num): Put into #if BITOPS || NONDECDATA
+
+Wed Apr 23 22:14:14 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* dfa.c: Misc changes for really pedantic SGI compilers.
+	* builtin.c: Bracket defs of random() etc for GLIBC.
+	* random.c: Bracket whole file for GLIBC.
+	* configure.in: Extra goop for GETPGRP test for VMS POSIX.
+	* custom.h [VMS]: Remove hard definition of GETPGRP_VOID.
+
+Fri Apr 18 07:55:47 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* BETA Release 3.0.34: Release tar file made.
+
+Tue Apr 15 21:35:45 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	NEW UNDOCUMENTED FEATURE. USE THE SOURCE LUKE!
+	* acconfig.h [NONDECDATA]: New macro.
+	* awk.h: Add decl of do_strtonum.
+	* awk.y (tokentab): Add entry for strtonum function.
+	* builtin.c (do_strtonum): New function.
+	* configure.in (non-decimal-data): New --enable-* option.
+	* node.c (r_force_number): Change to allow non-decimal data inside
+	ifdef NONDECDATA.
+
+Tue Apr 15 06:32:50 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* missing/strftime.c (malloc, realloc, getenv, strchr): Only
+	declare these when STDC_HEADERS is not defined.
+	<stdlib.h, string.h>: Include these when STDC_HEADERS is defined.
+	* awk.h (freenode, tree_eval, m_tree_eval): Reorganize definitions.
+	* alloca.c (malloc): If malloc is already defined as a macro,
+	presumeably by config.h, don't define or declare it.
+
+Wed Apr  9 22:45:27 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in [COMPFLAGS]: Per suggestion from Karl Berry, put
+	$(CFLAGS) last.
+
+Tue Apr  8 23:54:46 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* eval.c (interpret): For Node_K_break and Node_K_continue, if
+	treating them like `next', also check the function call stack
+	and pop it if necessary.
+
+Mon Apr  7 18:22:37 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.h: Add decls of new routines do_compl() and set_loc().
+	* awk.y (tokentab): Add entry for "compl" function.
+	* builtin.c (do_compl): New function to do ones complement.
+	(do_substr): Rationalized yet again, now notices negative start
+	and length parameters.
+	* eval.c (push_args): Fix if call_list gets realloc'ed in the
+	middle of things. Avoids crash for deeply nested function calls.
+	* main.c (catch_sig): Add call to set_loc().
+	* msg.c (set_loc, srcfile, srcline): New function and private
+	variables to help out in tracing down source of error messages.
+
+Fri Mar 28 08:42:27 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (iop_alloc, iop_close): Undo changes of Feb 11, apparently
+	other cleanups in io.c made mmap stuff start working again.
+	BAH! It's a mess, the test suite still fails. I'm leaving the
+	mmap stuff undefined for now. It'll probably get ripped out in 3.1.
+
+Thu Mar 27 08:48:57 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* custom.h [_SEQUENT_]: Undef HAVE_MMAP.
+
+Wed Mar 26 09:08:16 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (iop_alloc): Fix definition to make it static.
+
+Mon Mar 24 23:09:07 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* field.c (init_fields, etc..): More clean up use of Null_field
+	and the various flags.
+	* node.c (unref): If a field, free the node itself. Fixes
+	memory leak problems.
+
+Sun Mar 23 22:51:09 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.h [FIELD]: New flag for node->flags field.
+	* builtin.c (sub_common): If FIELD is set, dup the string.
+	* field.c (init_fields): Set up a new Null_field global var.
+	(init_fields, set_field, set_record) use the FIELD flag.
+	(getfield): Use Null_field instead of private variable.
+	* io.c (wait_any): Comment out calls to pclose and iop_close,
+	caused weird race conditions. See test/pipeio1.awk. Thanks
+	to Darrell Hankerson for tracing this one down.
+
+Tue Mar 18 20:57:18 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* dfa.c (inboth): Free templist; plugs memory leak.
+	* field.c (init_fields, grow_fields_arr, set_field, rebuild_record,
+	set_record): Remove PERM flag from entries in fields_arr[]. Fixes
+	nasty memory leak.
+
+Tue Mar 18 06:33:00 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.y (dup_parms): Robustified against parameter errors.
+
+Sun Mar 16 21:31:40 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	NEW UNDOCUMENTED FEATURE. USE THE SOURCE LUKE!
+	* acconfig.h [BITOPS]: New macro. If set, do octal & hex and bit ops.
+	* awk.h [isnondecimal]: New macro, and decl of new functions.
+	* awk.y (yylex): Add recognition of octal and hex constants.
+	* builtin.c (do_and, do_or, do_xor, do_lshift, do_rshift): New
+	functions that do bit operations.
+	(nondec2awknum): New function to convert octal or hex to double.
+	* configure.in: Add AC_ARG_ENABLE for bit operations.
+	* node.c (r_force_number): Add octal and hex conversion.
+
+Sun Mar 16 21:28:56 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.h [IOP_NOFREE_OBJ]: New macro.
+	* io.c (iop_open, iop_alloc): Add new third parameter, which is
+	either NULL, meaning allocate a new IOP, or the address of one
+	already allocated.  Have a static one in the `nextfile'
+	routine, and use the IOP_NOFREE_OBJ flag for it.  All of this
+	keeps us from reading freed memory. The `swaplns' test fails
+	otherwise.
+	(iop_close): If IOP_NOFREE_OBJ is set, don't free the IOBUF.
+
+Wed Feb 26 06:21:02 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* eval.c (in_function, pop_fcall_stack, pop_fcall, push_args):
+	New functions. These manage "frames" of awk function call arguments.
+	The problem is that a `next' or a `nextfile' from a function
+	leaks memory. These changes allow us to free up that memory.
+	(interpret): for Node_K_next and Node_K_nextfile, check if in
+	a function call and free all function call frames.
+
+Fri Feb 21 06:23:19 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	Misc changes from Katsuyuki Okabe <HGC02147@niftyserve.or.jp>:
+
+	* builtin.c (do_substr): Change a %d to %ld in warning message.
+	* eval.c (op_assign): Fix format string for warning about %=.
+
+Wed Feb 19 23:29:02 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* main.c (main): Add do_intervals to condition that causes
+	resetup() to be called again. Makes the --re-interval option
+	actually work. What a concept.
+
+Fri Feb 14 09:47:31 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c [#include "awk.h"]: Undef HAVE_MMAP to just use the old code.
+	Something is causing a file descriptor leak, and this is getting to
+	be just too much hair. I reserve the right to rip out the mmap
+	code entirely at a future date.
+
+Tue Feb 11 06:28:29 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (iop_alloc): For an mmap'ed file, close the file descriptor,
+	and then touch each page to get a private copy. Fixes nasty case
+	of truncating our input file.
+	(iop_close): Don't call close on mmap'ed file.
+
+Wed Feb  5 17:59:04 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* eval.c (interpret): For Node_K_delete, just call do_delete; let
+	it handle the case of `delete array'.
+	* array.c (do_delete): Changed to handle case of `delete array',
+	and made smarter if the array is actually an uninitialized
+	parameter.
+
+Sun Jan 26 22:58:29 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* getopt.h, getopt.c, getopt1.c: Replaced with new versions from
+	GLIBC 2.
+
+Sun Jan 19 23:37:03 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* eval.c (nodetype2str): Not static, for debugging.
+	(flags2str): New function for debugging.
+	* field.c (get_field): Add new var that is like Nnull_string but
+	does not have numeric attributes, so that new fields are strings.
+	(set_record): Turn off PERM flag before unrefing fields and field 0.
+	* array.c (in_array): Always evaluate subscript, could have
+	side effects.
+	* builtin.c (do_strftime): Way increase size of buffer to make sure
+	we don't have overflow problem. Keeps Paul Eggert happy.
+	* custom.h [__amigaos__]: Define fork to vfork. From Fred Fish.
+	* dfa.c: Move include of config.h to top, for RSXNT. From Kai
+	Uwe Rommel.
+	(ISALPHA, etc): Change from Jacob Engelbrecht (jaen@novo.dk)
+	to better handle non-ASCII environments.
+	* gawkmisc.c: Remove amigados case, posix should now work fine.
+	* amiga/*: Nuked per previous entry.
+	* Makefile.in: Removed all references to amiga
+	* io.c [HAVE_SYS_PARAM_H]: Add #undef RE_DUP_MAX to avoid
+	spurious conflict with regex.h.
+	(flush_io): Remove amiga ifdefs, not needed anymore.
+	(spec_setup): Set getrec field for special files. Fix from
+	Mark Gray (markgray@pdt.net).
+	* node.c (more_nodes): Fix to get the last entry in the array.
+
+Wed Jan  8 17:42:37 1997  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* io.c (mmap_get_record): Fix return value if file ends without
+	record separator.
+
+Fri Jan  3 19:57:16 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* awk.y (get_src_buf):  Test for an empty source file by detecting
+	an initial read of 0 bytes rather than by relying on info from
+	stat().
+
+Wed Dec 25 11:25:22 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.2: Release tar file made.
+
+Wed Dec 25 11:17:32 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (install, uninstall): Use $(srcdir)/patchlevel.h.
+	Thanks to Richard Levitte, LeViMS@stacken.kth.se.
+	(install): Remove chmod command; let $(INSTALL_PROGRAM) use -m.
+
+Mon Dec 23 20:36:59 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* custom.h (#if VMS_POSIX):  Define GETPGRP_VOID.
+
+Fri Dec 20 08:59:55 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* getopt.c, getopt1.c: Comment out the `#if defined (_LIBC) ||
+	!defined (__GNU_LIBRARY__)' and `#endif' to force use of this
+	getopt, even on systems like Linux.  This will be handled
+	better in 3.1 / glibc 2.
+
+Thu Dec 19 22:52:39 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.y (yylex): In several places, after yyerror(), add call to
+	exit(). Otherwise, infinite messages. This should probably
+	be handled better.
+
+Wed Dec 18 22:42:10 1996  Darrel Hankerson  <hankedr@mail.auburn.edu>
+
+	* getopt.c (_getopt_internal): If 'W' and ';', if optind == argc,
+	return c, don't fall through.
+
+Wed Dec 18 10:09:44 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* configure.in [AC_PREREQ]: Update to 2.12 in order to switch to
+	autoconf 2.12. Lots of other files will be rebuilt automatically.
+	[AM_SANITY_CHECK_CC]: Removed, autoconf does it now.
+	* aclocal.m4 [AM_SANITY_CHECK_CC]: Removed, autoconf does it now.
+
+Tue Dec 17 22:23:16 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (do_strftime): Fix case if format string is "".
+	Also fix it if format is not "" but result of strftime is "".
+	See comments in code.
+
+Tue Dec 10 23:09:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.1: Release tar file made.
+
+Tue Dec 10 22:39:41 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (dist): Add dependency on `info'. Remove line that
+	does makeinfo.
+	(install): Use $(LN) not $(LN_S) to link gawk gawk-version.
+
+Sun Dec  8 07:53:44 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (gawk): Took COMPFLAGS out of link line for help
+	on VMS posix. Shouldn't (I hope) affect anything else.
+
+Thu Nov 28 11:52:24 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* configure.in (AC_PROG_INSTALL): Set INSTALL to install-sh.
+
+Tue Nov 26 22:42:00 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* PORTS: Updated list of systems.
+	* Makefile.in (install): Fix some typos and add some improvements
+	for Ultrix.
+
+Sun Nov 24 22:16:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (do_printf): If no args, fatal error. Return silently
+	if --traditional.
+
+Thu Nov  7 20:54:43 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (inrec): Make sure EOF hasn't already happened before
+	trying to read; prevents accessing freed buffer. Thanks to
+	Michal Jaegermann.
+	* Makefile.in [AWKSRC]: Add random.h.
+	* random.h: New file, redefines names of the `random' functions.
+	* random.c, builtin.c: Add include of random.h.
+
+Thu Nov  7 09:06:21 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.y (snode): Undo 4 Oct change, put do_split code back.
+	* field.c (do_split): Restore old code; add test for CONST, so
+	that re_parse_field is used if third arg to split is a regexp
+	constant.
+
+Mon Nov  4 12:57:11 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* main.c (main): Research -m[fr] options don't need literal '='
+	characters. Brian's documentation was confusing.  Fixed, not
+	that anyone actually uses these options with gawk.
+
+Sun Nov  3 11:23:21 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* field.c (def_parse_field): Add \n to list of acceptable white space.
+	(posix_def_parse_field): New routine, just like def_parse_field(),
+	but only allows space and tab as separators.
+	(do_split, set_FS): Make appropriate choice between the two
+	*def_parse_field() routines.
+
+Fri Oct 25 10:13:06 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* configure.in: Remove test for random.
+	* Makefile.in: Add random.c to list of files always compiled.
+	* missing.c: Remove HAVE_RANDOM test.
+	* builtin.c: Remove ifdef's for HAVE_RANDOM.
+	[GAWK_RAND_MAX]: Use constant we know works with our random().
+	* random.c: New file - moved from missing/ directory.
+
+Wed Oct 23 19:46:01 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* builtin.c (do_tolower, do_toupper): Add `unsigned char *' casts.
+
+Tue Oct 22 21:27:52 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c [GAWK_RANDOM_MAX]: Try to make definition a bit
+	smarter; don't use RAND_MAX if it's equal to SHRT_MAX, blows
+	things up.
+
+Tue Oct 22 08:49:20 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* main.c (copyleft): Update copyright date to 1996.
+	* Too many files to list: Update copyright date to 1996.
+
+Sun Oct 20 12:21:09 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.y, dfa.c, eval.c, io.c, re.c: Added various FIXME comments.
+
+Sat Oct 19 22:06:42 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* eval.c (nodetype2str): Make static, add prototype.
+	* field.c (sc_parse_field): Cast array subscripts to int to
+	shut up gcc warnings.
+	* gawkmisc.c: Add prototype for xmalloc.
+	* awk.h: Add prototype for getredirect.
+	* builtin.c (do_fflush): Remove extern decl of getredirect.
+	* io.c (get_a_record, mmap_get_record): Change decl of rs to int,
+	to shut up gcc warnings.
+	* awk.y (isassignable): Add a default to switch to quiet gcc.
+	* getopt.c (_getopt_internal): Give default value to `indfound'.
+
+Fri Oct 18 09:00:49 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* regex.h [RE_SYNTAX_AWK]: Add RE_CONTEXT_INDEP_ANCHORS.
+
+Thu Oct 17 22:32:55 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* aclocal.m4 [AM_SANITY_CHECK_CC]: Added.
+	* configure.in: Use it.
+
+Thu Oct 17 21:43:25 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* configure.in: Add checks for locale.h and setlocale().
+	* awk.h: Include locale.h and define out setlocale() if not available.
+	* main.c (main): Call setlocale().
+	* builtin.c (do_tolower, do_toupper): Use unsigned char pointers,
+	to get other charsets right in different locales.
+
+Wed Oct 16 21:32:53 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (format_tree): Change initial buffer size to 512
+	and use a constant. Allows large values of %f per bug report
+	from sheyn@cs.bu.edu.
+
+Wed Oct 16 21:22:08 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in [MISC]: Removed TAGS and tags.
+	(local-distclean): Added TAGS and tags.
+	(maintainer-clean): Removed TAGS and tags.
+
+Wed Oct 16 12:28:43 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* main.c (version): Add call to copyleft(), per new standards.
+	version.c: Fix text of version string to match new standards.
+
+Sun Oct  6 22:19:45 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* regex.c: Updated to Emacs 19.34b base.
+
+Sun Oct  6 21:57:34 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* re.c (make_regexp): Fixed to handle \8 and \9 in the middle
+	of a regexp.
+
+Fri Oct  4 10:26:16 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.y (snode): Remove case for do_split; always making the
+	third arg a Node_regex is wrong.
+	* field.c (do_split): Rationalized to distinguish `/ /' from `" "'.
+	Generally fixed up.
+	* node.c (parse_escape): Allow single digit \x escapes.
+
+1996-10-02  Paul Eggert  <eggert@twinsun.com>
+
+	* builtin.c (format_tree): Fix bug in %d and %i format: NaNs, and
+	values in the range LONG_MAX+1 .. ULONG_MAX, were mishandled.
+	Don't assume that double values <= -1 are converted to unsigned
+	long in the expected way; the C Standard doesn't guarantee this.
+
+1996-10-02  Paul Eggert  <eggert@twinsun.com>
+
+	* awk.h (INT_MAX): Remove unused symbol.
+
+Mon Sep 30 22:19:11 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* getopt.c (_getopt_internal): If 'W' is in the optstring followed
+	by a ';' then search through the long opts table. This makes
+	`-W foo=bar' same as `--foo=bar'.
+	* main.c (main): 'W' now prints an error message.
+	(gawk_option): Deleted the routine.
+
+Sun Sep 29 23:04:54 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (sub_common): Fix several bugs with gsub when
+	matching null strings. See test/gsubtest.awk.
+
+Fri Sep 20 17:35:54 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* alloca.c (NULL): Don't define if <config.h> has already done so.
+
+Fri Sep 20 11:54:31 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (do_print): Evaluate all the expressions first and
+	then print them. Avoids surprising behavior. See test/prtoeval.awk
+	for an example.
+
+Tue Sep 10 06:21:40 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.h [FUNC]: New flag, marks a Node_parameter_list as really
+	being the function name; allows more checking in awk.y.
+	* awk.y (isassignable): Now takes a NODE * instead of a type, to
+	check if a function parameter is marked FUNC, then it's the function
+	name, which is not assignable. Fix call from snode().
+	(function_prologue): Mark function name as FUNC.
+	(yyerror): Don't call exit() anymore; gawk will now report
+	all syntax errors.
+
+Sun Sep  1 19:36:30 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* field.c (rebuild_record): After building new field 0, go through
+	all old fields, and if they used to point into the old one,
+	have them point into the new one.  Then turn off PERM flag before
+	unref-ing field 0.
+
+Wed Aug 28 19:13:34 1996  Arnold D. Robbins  <arnold@math.utah.edu>
+
+	* eval.c (set_IGNORECASE): Correctly parenthesize bit operations
+	in test and fix logic for string value.
+
+Wed Aug 28 22:06:33 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* main.c (usage): Add email addresses for bug reporting, per
+	change in GNU Coding Standards from RMS.
+
+Sun Aug 11 23:13:22 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (install): Correct use of $(INSTALL_PROGRAM).
+
+Thu Aug  8 23:29:43 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* parse.y (isassignable): New function, checks in type can
+	be assigned to.
+	(snode): Changed checking for 3rd arg of gsub to be more
+	general, supersedes earlier change.
+
+Thu Aug  8 13:58:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* parse.y (snode): If third arg to sub or gsub is builtin
+	function, complain, since can't substitute into result.
+	* eval.c (r_get_lhs): Diagnose Node_builtin as an error, instead
+	of falling through into default case and using cant_happen().
+
+Thu Aug  1 07:13:14 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* regex.h [RE_DEBUG]: New macro.
+	[RE_SYNTAX_GNU_AWK]: Add RE_DEBUG.
+	[RE_SYNTAX_POSIX_AWK]: Add RE_INTERVALS.
+	* regex.c (re_set_syntax): Add #ifdef DEBUG code to turn on `debug'
+	flag if RE_DEBUG set, and turn off debug if not set and debug
+	was on.
+	* main.c (main): Remove `do_intervals = TRUE' from `if (do_posix)',
+	it's now handled in the definition of RE_SYNTAX_POSIX_AWK.
+
+Mon Jul 29 17:49:07 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* io.c (O_ACCMODE): Define it if <fcntl.h> doesn't.
+
+Mon Jul 29 12:02:48 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* eval.c (set_IGNORECASE): Made somewhat smarter. gawk -v IGNORECASE=0
+	was acting the same as -v IGNORECASE=1. Thanks to Darrell Hankerson
+	for the bug report.
+
+Fri Jul 26 12:04:43 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.h (format_val): Add declaration of new routine.
+	* node.c (format_val): New routine, abstracts old guts of
+	r_forcestring; accepts format string and index as additional params.
+	(r_force_string): Changed to call format_val.
+	* builtin.c (do_print):  Don't tree_eval the tree twice in case
+	OFMTidx != CONVFMTidx; doing so could cause side effects
+	(from bug report by Tobias Rettstadt, xassp@ipds.uni-kiel.de).
+	Instead, call format_val.
+
+Mon Jul 22 21:59:15 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (iop_close): Change check for "is $0 in the input buffer"
+	to use `< (iop->buf + iop->secsiz + iop->size)' instead of
+	`< iop->end'. The latter is bogus if EOF has been hit on the
+	file.  Fix from Darrel Hankerson based on bug report by
+	Charles Howes (howes@grid.direct.ca).  See test/eofsplit.awk.
+
+Thu Jul 18 19:43:20 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (sub_common): Backed out change of Feb 14 in favor of:
+	(do_gensub): Changed to use make_string and then to |= TEMP
+	flag, based on bug report and patch from Katsuyuki Okabe,
+	hgc02147@niftyserve.or.jp.
+
+Thu Jul 18 19:23:53 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* custom.h: Added ifdef for QNX, based on bug report from
+	Michael Hunter, mphunter@qnx.com.
+
+Mon Jul 15 09:31:01 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (redirect): When finding the rp pointer, if it's not
+	NULL, set str = rp->value. This gets the '\0' terminated
+	version. Motivated by bug report from John Hawkinson
+	(jhawk@bbnplanet.com).
+
+Sun Jul 14 18:40:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* configure.in: Added call to AC_CHECK_LIB(m, fmod), since
+	apparently some systems have fmod in the math library.
+	Portability: The Holy Grail.  Sigh.
+
+Sun Jul 14 18:08:01 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.h: Add Jim Meyerings ISASCII etc hacks for ctype macros.
+	* builtin.c (do_toupper, do_tolower, sub_common): Changed to use
+	upper-case versions of ctype macros.
+	* main.c (main): Ditto.
+	* node.c (r_force_number, parse_escape): Ditto.
+
+Sun Jul 14 06:34:18 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* field.c (set_record): Made it always do the PERM flag.
+	Fixes cases where $0 is assigned to, e.g. by gsub, keeps
+	the fields valid.
+	(get_field): Removed the call to reset_record in
+	case where ! field0_valid. We want to leave the fields alone
+	if they've been changed.
+
+Thu Jul 11 23:04:20 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (devopen): Change tests of (flag & O_fooONLY) to
+	(flag & O_ACCMODE) == O_fooONLY. Per (long standing) bug
+	report from Chapman Flack.
+	(close_redir): Change final conditional to just (status != 0)
+	so that ERRNO always set; the warning had its own `if (do_lint)'
+	anyway.
+	* eval.c (do_split): Force type of array to be Node_var_array
+	instead of Node_var.  Per (long standing) bug report from
+	Chapman Flack.
+
+Thu Jul 11 22:17:14 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (install): Added symlink of gawk to awk if
+	no awk in $(bindir).
+	(LN_S): New variable for symlinking.
+	(uninstall): Remove awk if it's the same gawk.
+	* Configure.in: Added call to AC_PROG_LN_S for Makefile.in.
+
+Sun Jul  7 15:47:13 1996  Arnold D. Robbins  <arnold@infographix.com>
+
+	* main.c (main): Made `--posix' turn on interval expressions.
+	Gawk now matches its documentation. (What a concept!)
+
+Wed Jul  3 15:02:48 1996  Arnold D. Robbins  <arnold@infographix.com>
+
+	* regex.h, regex.c: Upgraded to changes from Emacs 19.31.
+
+Fri May 17 08:46:07 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (get_a_record): Added `continued' flag. Fix from
+	Darrell Hankerson for when RS = "\n|something".
+
+Wed May 15 02:34:55 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (awklib/all): Now depends on gawk, fixes problem
+	with parallel make.
+
+Tue May 14 15:02:52 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (format_tree): Fix handling of '*' to deal with
+	negative value for fieldwidth -- make positive and turn on
+	left justify. Per bug report from Michael Brennan.
+
+Sun May 12 20:42:06 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* eval.c (r_get_lhs): case Node_subscript. Check if array name
+	is actually a function, fatal error if so.
+
+Sun May  5 10:11:52 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (redirect): Call flush_io() before creating a new output pipe,
+	per bug report from Brian Kernighan (bwk@research.bell-labs.com).
+
+Fri Mar 15 06:38:33 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (install): Use $(INSTALL_PROGRAM), not $(INSTALL).
+	(local-distclean): Add `*~' to list of files to be removed.
+	(CFLAGS): Now contains just @CFLAGS@.
+	(COMPFLAGS): Replaces use of CFLAGS, has CFLAGS plus all the
+	other stuff.
+
+Wed Mar 13 14:19:38 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (mmap_get_record): Fixed to not place sentinel at end
+	of mmap'ed object. Won't work if file is exact multiple of
+	disk block size. See comments in code for more info.
+	Thanks to Rick Adams (rick@uunet.uu.net) for help in testing.
+
+Sun Mar 10 22:50:23 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* io.c (do_close): Notice if we were called as `close(FILENAME)'
+	and arrange to close the current input file. This turns out
+	to be easy to do, just call `nextfile(TRUE)'. Based on bug report
+	from Pascal A. Dupuis, <dupuis@lei.ucl.ac.be>.
+
+Thu Mar  7 08:08:51 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* field.c (init_fields, grow_fields, set_field, rebuild_record):
+	Nuke the `nodes' array everywhere.  Anytime a field is unref'ed,
+	allocate a new node that is a copy of Nnull_string. This avoids
+	subtle memory management problems when doing a lot of assignment
+	to fields, and tweaking of NF. Make sure that fields_arr[0] always
+	has a type of Node_val!
+	* field.c (set_NF): If NF is decremented, clear fields between
+	NF and parse_high_water, otherwise if NF incremented, clear
+	fields between parse_high_water and NF.
+	* eval.c (nodetype2str): New function, used for diagnostics.
+	(interpret): Use nodetype2str when finding invalid node.
+
+Mon Mar  4 09:02:28 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (do_toupper, do_tolower): Use isascii along with
+	isupper/islower before changing case, in case characters have
+	the high bit set. This is a hack.
+
+Mon Feb 26 22:24:44 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (sub_common): If no match, and called from gensub,
+	don't free the temporary string, since the tmp_number then
+	writes over it.
+
+Sun Feb 25 23:13:01 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (format_tree): Fixed %c to treat user input as
+	numeric also by adding test for MAYBE_NUM.
+
+Tue Feb 20 12:25:50 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* configure.in: Added AC_FUNC_MMAP call and add madvise to
+	list of functions to look for.
+	* awk.h [IOP_ISMAPPED]: New flag value for mmap support and new
+	`getrec' structure member in struct iobuf.
+	* io.c (iop_alloc, iop_close): Changed to map/unmap input file
+	into memory if possible.
+	(mmap_get_record): New function to actually retrieve the
+	record from mmaped file.
+
+Thu Feb  1 08:56:46 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (do_substr): Fixed lint message to use indx+1 when
+	start position is past end of string.
+
+Sun Jan 28 07:00:56 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (do_substr): Rationalized handling of missing length
+	argument, as well as various accompanying lint warnings. Previous
+	code was slightly bogus. Talk about your Day 1 bugs.
+
+Thu Jan 25 14:09:11 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* builtin.c (do_substr): If length exceeds length of actual
+	string, do computation of needed substring length *after*
+	the lint warning.
+
+Wed Jan 24 10:06:16 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (gawk): Add $(CFLAGS) to link line.
+	(Makefile): Target depends on the Makefile.in files.
+	(OTHERS): Added TAGS and tags to the distribution.
+	(local-distclean): New rule.
+	(distclean): Use it.
+	(maintainer-clean): Don't `make distclean' before running submakes,
+	since that removes makefiles needed for the submakes.
+	* builtin.c (do_strftime): Remove hard coded limit on length of result.
+	Based on code from Paul Eggert (eggert@twinsun.com).
+
+Mon Jan 22 13:16:37 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* main.c (usage): Takes new fp parameter which is either
+	stdout for `--help' (per the GNU Coding Standards) or stderr
+	if an error occurs. Fix all calls.
+	(version): Prints to stdout per the coding stds.
+	(copyleft): Prints to stdout now, not stderr, and exits.
+
+Fri Jan 19 08:10:29 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* regex.h [RE_GNU_AWK]: Added RE_CONTEXT_INDEP_OPS to set of
+	bits we turn off for regular operation. Breaks things like
+	/^+[0-9]+/ to match a literal `+' at the beginning of, say,
+	a phone number.
+
+Wed Jan 10 23:19:36 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* 3.0.0 polished up and release tar file made.
+
+Wed Dec 27 11:46:16 1995  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* 2.94.0 released to porting group (no, I haven't been good
+	about this file; I'll do better once 3.0 is released).
+
+Mon Aug 28 23:04:30 1995  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* awk.h updated for NeXT - bracket TRUE/FALSE
+	* io.c (get_a_record): Removed shadowing of 'start' in
+	* Makefile.in and doc/Makefile.in: Fixed to use gawk.1 and gawk.texi,
+	instead of gawk.1.in and gawk.texi.in.
+
+Mon Aug 25 11:04:30 1995  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* 2.90.0 released to porting group.
+
+Fri Aug 18 12:43:31 1995  Arnold D. Robbins  <arnold@puny.ssc.com>
+
+	* ChangeLog created.
diff --git a/gawk-5.0.1/ChangeLog.1 b/gawk-5.0.1/ChangeLog.1
new file mode 100644
index 00000000000..aa8226e7a72
--- /dev/null
+++ b/gawk-5.0.1/ChangeLog.1
@@ -0,0 +1,8919 @@
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README: Updated in preparation for a release.
+
+2019-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2019-04-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* eval.c (load_casetable): Always use the locale's settings.
+	(set_IGNORECASE): Don't call load_casetable.
+	* main.c (main): Call load_casetable if in a single-byte locale.
+
+2019-03-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2019-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Fix test for ZOS_FAIL.
+
+2019-03-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pc/Makefile.tst): Yet another fix for out-
+	of-tree builds. Thanks to `make distcheck'.
+	* configure.ac: Update version for next tar ball.
+
+2019-03-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (usage): Fix help message.
+
+2019-03-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pc/Makefile.tst): Make sure pc/ directory exists
+	first. Needed for `make distcheck'. Not sure what changed such
+	that this is only showing up now.
+	* configure.ac: Update version for next test tarball.
+
+2019-02-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.cvs: Removed. Six years is long enough.
+
+2019-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2019-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Updated.
+
+2019-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Small profiling improvements. Suggested by mukti
+	<ferida.cicatriz@gmail.com>.
+
+	* main.c (parse_args): Add warnings that --profile overrides
+	--pretty-print.
+	(main): Move setuid warning to after all the warnings for conflicting
+	arguments.
+	* profile.c (pprint): Don't print extra trailing space after return
+	and exit if no value associated with the statement.
+
+2019-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Set ZOS_FAIL if on ZOS to improve test suite on that
+	platform.
+	* awk.h (is_valid_identifier): Move declaration outside ifdef DYNAMIC.
+	* command.y: Fix test for EBCDIC to use USE_EBCDIC.
+	* custom.h: Remove definitions of __builtin_expect.
+	* eval.c (update_ERRNO_string): Add untested and disabled code for z/OS
+	to remove leading IBM error codes.  This might one day make more of the
+	tests pass on z/OS.
+
+2019-02-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (is_valid_identifier): Move declaration outside of
+	`#if DYNAMIC'.  Thanks to Daniel Richard G.
+	* custom.h (builtin_expect): Remove definitions, now
+	handled by support/cdefs.h.
+
+2019-02-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix debugger eval command so that return from a called
+	user-defined function works. Thanks to Lothar Langer
+	<lotharla@gmail.com> for the report.
+
+	* awk.h (Op_K_return_from_eval): New opcode.
+	(parse_program): Add boolean second parameter, `from_eval'.
+	* awkgram.y (called_from_eval): New variable
+	(Grammar): Check it for return statements. If true, change the
+	opcode to Op_K_return_from_eval.
+	(parse_program): Set called_from_eval to value of from_eval parameter.
+	* debug.c (pre_execute_code): Change test for Op_K_return to test
+	for Op_K_return_from_eval.
+	(do_eval): Call parse_program with second parameter true.
+	* eval.c (optypetab): Add entry for Op_K_return_from_eval.
+	* interpret.h (r_interpret): Ditto: can't-happen error.
+	* main.c (main): Call parse_program with second parameter false.
+	* NEWS: Updated.
+
+2019-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: If profiling, correctly turn `print' into `print $0'.
+	Thanks to Hermann Peifer for the bug report.
+	* TODO: Updated.
+
+2019-02-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Update version for next test tarball.
+
+2019-02-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Updated.
+	* config.guess, config.rpath, config.sub: Updated from GNULIB.
+
+2019-02-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add NEWS.1.
+
+2019-02-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS.1: Rotated in from NEWS.
+	* NEWS: Shortened to start over again with 5.0 changes.
+	* ext.c (is_valid_identifier): Move outside of ifdefs so that
+	DJGPP (and other code) can find it.
+
+2019-02-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (snode): Disallow @/.../ as second param of index, also.
+	* TODO: Updated.
+
+2019-02-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.c, command.c: Regenerated with Bison 3.3.
+	* NEWS: Updated.
+
+2019-02-02  Eli Zaretskii  <eliz@gnu.org>
+
+	* debug.c (execvp) [__MINGW32__]: Redirect to w32_execvp.
+	(restart): No need for MinGW-specific code anymore.
+
+	* nonposix.h: If setlocale is already a defined macro, #undef it
+	before redefining.  This avoids compilation warnings if someone
+	tries to compile Gawk with Gettext's libintl.h, which redirects
+	setlocale to its own function.
+	Reported by Budi <budikusasi@gmail.com>.
+
+	* debug.c [__MINGW32__]: Prototype for w32_execvp.
+	(restart) [__MINGW32__]: Call w32_execvp instead of execvp.  Don't
+	type-cast d_argv anymore.
+
+2019-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (qualify_name): Return duplicated strings.
+	(yylex): Qualify names before returning either NAME or FUNC_CALL.
+	(Grammar): Replace qualified_name non-token with NAME, remove
+	`qualified_name' production.
+
+2019-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am, NEWS, awkgram.y, cint_array.c, custom.h, debug.c,
+	eval.c, ext.c, gawkapi.c, int_array.c, interpret.h, nonposix.h,
+	profile.c, re.c, replace.c, str_array.c, symbol.c: Update
+	copyright year.
+
+2019-01-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pc/Makefile.tst): Fix to work for out of tree builds.
+
+2019-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (UPDATE_YEAR): Bump to 2019.
+	(usage): Revise help message a little bit.
+	* configure.ac: Bump version to start a release spiral.
+	* NEWS: Updated.
+
+2019-01-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (Grammar): Add new production `qualified_name' which
+	is NAME + qualification call. Use it everywhere that NAME was
+	used, except for function parameters.
+
+2019-01-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (adjust_namespace): Check for all upper case
+	identifiers so we don't get things like awk::NF.
+
+2019-01-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symtab.c (lookup): Remove second `do_qualify' parameter.
+	Remove calls to `fix_up_namespace'.  If name starts with
+	"awk::" just lookup the compnent name.
+	Adjust all calls to `lookup' in other files.
+	(install): Don't use `fix_up_namespace'.
+	(fix_up_namespace): Remove function.
+	* awk.h (lookup): Adjust declaration.
+
+2019-01-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (qualify_name): Don't qualify a name if it's
+	a parameter.
+
+2019-01-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (Grammar): Use qualify_name for array subscript
+	expressions. Fixes the last leak in the test suite.
+	* awk.h (is_all_upper): Declare.
+	* symbol.c (is_all_upper): Remove static.
+	* awkgram.y (is_all_upper): Remove.
+	(Grammar): Clean up `#if 0' code.
+
+2019-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Restore functionality.
+
+	* awkgram.y (qualify_name): Remove `is_var' param, always check
+	for all upper case. Adjust all calls.
+	(Grammar): Do qualify_name for function calls also.
+
+2019-01-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Continue fixing memory leaks.
+
+	* awk.h (set_current_namespace): Declare function.
+	* awkgram.y: Change all assignments of current_namespace to calls
+	to set_current_namespace.
+	(is_all_upper, qualify_name): New functions.
+	(in_function): Change type to bool, and fix usages.
+	(Grammar): Use qualify_name on variables and function names.
+	* main.c: Change all assignments of current_namespace to calls
+	to set_current_namespace.
+	(set_current_namespace): New function.
+	* profile.c (pp_namespace): Don't free old current_namespace. Add
+	comment explaining why.
+
+2019-01-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Start fixing memory leaks related to namespaces.
+
+	* awkgram.y (Grammar): At simple_variable -> NAME, qualify names
+	before lookup/install.
+	(next_sourcefile): Check if need to free current_namespace before
+	assigning to it.
+	(yylex): Fix length of string to be dup'ed before returning
+	NAME or FUNC_CALL.
+	(set_namespace): Always free ns->lextok, adjust memory allocations
+	appropriately.
+	* main.c (main): Check if need to free current_namespace before
+	assigning to it.
+	* profile.c (pp_namespace): Ditto. (This may not be necessary.)
+
+2019-01-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (do_set_var): Add comments before calls to assoc_set.
+	* interpret.h (r_interpret): For Op_sub_array, deref the subscript
+	appropriately. Thanks to Andy Schorr for the catch.
+
+2019-01-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* array.c (asort_actual): Use assoc_set in 2 places.
+	* awk.h (assoc_set): Improve leading comment.
+	* debug.c (do_set_var): Use assoc_set in 2 places.
+	* field.c (set_element, update_PROCINFO_str, update_PROCINFO_num):
+	Use assoc_set in each.
+	* gawkapi.c (api_set_array_element): Use assoc_set.
+	* interpret.h (r_interpret): Use assoc_set.
+	* main.c (init_args, load_environ, load_procinfo_argv):
+	Use assoc_set in each.
+	* mpfr.c (do_mpfr_intdiv): Use assoc_set in 2 places.
+	* str_array.c (str_lookup): Fix leading comment.
+	* symbol.c (install): Use assoc_set.
+
+2019-01-15         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* builtin.c (do_match, do_intdiv): Remove unused `sub' and `lhs'
+	variables, since assoc_set is now doing all of the work.
+
+2019-01-15         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* awk.h (assoc_set): Move the definition lower down because it
+	needs to be after unref is declared.
+	* builtin.c (do_match): Use assoc_set in 3 places.
+	(do_intdiv): Use assoc_set in 2 places.
+	(do_typeof): Use assoc_set in 2 places.
+
+2019-01-14         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* awk.h (assoc_set): Add new inline function to set an array element
+	to eliminate code duplication and reduce the chance of memory leaks.
+
+2019-01-14         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* builtin.c (do_typeof): Fix memory leak when populating the
+	optional array, and make sure to call the astore method.
+
+2019-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_intdiv): Add unref of subscripts.
+	* mpfr.c (do_mpfr_intdiv): Ditto.
+	Thanks to Andy Schorr for noticing.
+
+2019-01-09         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* awkgram.y (tokentab): Indicate that typeof may take 2 arguments.
+	(snode): Add support for typeof's optional 2nd array argument.
+	* builtin.c (do_typeof): Add support for optional 2nd array arg,
+	returning flag info for scalars and backend array type for arrays.
+
+2019-01-09         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* awk.h: For non GCC, have __attribute__ definition match
+	support/regex_internal.h exactly.
+
+2019-01-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* interpret.h (r_interpret): For a translatable string, only copy
+	the gettext return value if it's different from the original.
+	Otherwise, use the original.
+
+2019-01-07         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	Use a struct instead of an array to contain the array methods
+	for improved code clarity and flexibility.
+
+	* awk.h (array_funcs_t): Define new struct to contain the array
+	methods.
+	(NODE): Change type of array_funcs (sub.nodep.l.lp) from `afunc_t *'
+	to `const array_funcs_t *' (from a pointer to an array of function
+	methods to a pointer to a struct containing the methods).
+	(a*_ind): Remove obsolete method array index defines.
+	(a*): Redefine array methods to use struct members instead of 
+	array elements.
+	(str_array_func, cint_array_func, int_array_func): Change type
+	from array of afunc_t to 'const array_funcs_t'.
+	(register_array_func): Remove global declaration, since this function
+	is called only inside array.c.
+	* array.c (null_array_func): Change from array of methods to a struct.
+	(array_types): Now an array of pointers to array_funcs_t.
+	(AFUNC): Remove obsolete macro.
+	(register_array_func): Change scope to static, and change argument
+	to a pointer to array_funcs_t instead of a pointer to an array of
+	methods.
+	(array_init): Modify calls to register_array_func to pass the address
+	of the new array method structs.
+	(make_array): Set array_funcs to & null_array_func.
+	(null_lookup): Modify to use new array method structs.
+	(assoc_list): Update cint check to use & cint_array_func.
+	* str_array.c (str_array_func, env_array_func): Change from array of
+	methods to an array_funcs_t struct.
+	(env_clear, init_env_array): Set array_funcs to & env_array_func.
+	* int_array.c (int_array_func): Change from array of methods to an
+	array_funcs_t struct.
+	* cint_array.c (cint_array_func): Ditto.
+	(cint_lookup): When setting xn->array_funcs, must now use &.
+	(cint_dump): Compare xn->array_funcs to & int_array_func.
+
+2019-01-06         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* array.c (do_delete): If the array is now empty, reset it to the
+	null implementation to avoid being locked into the backend
+	optimization previously selected.
+
+2019-01-06         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	Remove pointless alength macro/method that uses a needless
+	function call indirection to access the table_size value.
+
+	* awk.h (alength, alength_ind): Remove these defines, and also renumber
+	the array_funcs items after that, and use the <blah>_ind define to
+	define <blah> instead of repeating the hardcoded numeric value.
+	(NUM_AFUNCS): Remove unused define.
+	(assoc_length): Redefine to access table_size directly.
+	(null_length): Remove prototype.
+	* array.c (null_array_func): Remove null_length entry.
+	(null_length): Remove obsolete function.
+	* cint_array.c (cint_array_func): Remove null_length entry.
+	* int_array.c (int_array_func): Remove null_length entry.
+	* str_array.c (str_array_func, env_array_func): Remove null_length
+	entry.
+	* gawkapi.c (api_flatten_array_typed): Use the assoc_empty macro to
+	check for an empty array instead of comparing table_size to 0.
+	* symbol.c (lookup, check_param_names): Ditto.
+
+2018-12-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Clean up namespace handling for the profiler.
+
+	* awkgram.y (make_pp_namespace): Remove function, not needed.
+	(set_namespace): Use estrdup to save the current namespace.
+	* main.c (main): Before dumping the program, set current_namespace
+	to awk_namespace.
+	* profile.c (pprint): Use "awk" for comparison, not "awk::".
+	(pp_namespace): Just print the name in the @namespace line.
+	(adjust_namespace): Adjust for the fact that namespaces no longer
+	have the trailing "::".
+
+2018-12-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (check_qualified_name): Remove declaration.
+	* awkgram.y (check_qualified_special): Renamed from
+	check_qualified_name and made static.
+	* profile.c (pprint): Improve comment on namespace list.
+
+2018-12-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Remove -O only if .developing has 'debug' in it.
+
+2018-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (distclean-local): Remove .deps directory.
+
+2018-12-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2018-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* TODO: Updated.
+
+2018-12-12         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* configure.ac (AC_CHECK_FUNCS): Check for timegm.
+	* builtin.c (mktime_tz): Remove function; we will use timegm instead.
+	(do_mktime): Replace 'mktime_tz(& then, "UTC+0")' with 'timegm(& then)'.
+	* protos.h (timegm): Add timegm proto on systems lacking it.
+	* replace.c (timegm): Include missing_d/timegm.c if needed.
+
+2018-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Updated some.
+
+2018-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h: Add new Op_K_namespace opcode for pretty printing.
+	* awkgram.y (namespace_chain): New variable, list of successive
+	@namespace directives seen, for the pretty printer.
+	(namespace_comment): Removed.
+	(set_namespace): Takes comment as second argument, builds the chain.
+	(mk_function, append_rule): Adjust to store the chain.
+	* debug.c (print_ns_list): New function.
+	(print_instruction): Adjust Op_rule and Op_func to use print_ns_list.
+	Add case for Op_K_namespace.
+	* eval.c (optable): Add entry for Op_K_namespace.
+	(opcode2str, op2str): Edit / add leading comments, respectively.
+	* profile.c (pp_namespace_list): New function.
+	(pprint): Adjust code to call pp_namespace_list.
+
+2018-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add -ggdb3 to CFLAGS if developing and remove
+	-O2 from Makefile, extension/Makefile, and support/Makefile.
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (namespace_comment): New variable.
+	(Grammar): Handle comments after @namespace statements.
+	(mk_function): Add any comment onto the saved namespace.
+	(append_rule): Ditto.
+	* profile.c (pp_namespace): Add second argument for a comment.
+	Adjust all calls.
+
+2018-12-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (mk_program): Add in leading and trailing comments
+	when program block is empty.
+
+2018-11-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (first_rule, func_first): Remove unused variables.
+	(Grammar): Simplify rule for range pattern.
+
+2018-11-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (debug_print_comment): New macro and function.
+	(load_library): Rework to not try to open the file if pretty printing.
+	(append_rule): Adjust handling of interblock_comment.
+
+2018-11-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (Grammar): In rule for function, set interblock_comment.
+	(mk_function): Hook interblock_comment onto fi->comment, merge it
+	with the existing one first, if any. Append trailing_comment.
+
+2018-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (platform_name): Add os390. Treat Cygwin and Mac OS X
+	as POSIX, per discussion with the dev team.
+
+	Unrelated:
+
+	* profile.c (print_comment): Indent for chained comment.
+	* awkgram.y (load_library): Return early if just pretty printing.
+	(yylex): Fix handling of ?: and allow_newline etc.
+
+2018-11-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (platform_name): New function returning platform name.
+	(load_procinfo): Use `platform_name()' to add "platform" element.
+	Thanks to Eli Zaretskii for the suggestion.
+	* NEWS: Updated with info about PROCINFO["platform"].
+
+2018-11-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2018-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (interblock_comment, pending_comment): New variables.
+	(Grammar, mk_program, add_rule): Adjust to use them. Changes
+	handle comments at the outermost level, between blocks and functions.
+
+2018-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (arg_assign): Allow assigning strongly typed regexp
+	constants to variables on the command line and with -v.
+	Thanks to Peng Yu <pengyu.ut@gmail.com> for the report.
+
+2018-11-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.c, command.c: Updated to Bison 3.2.1.
+	* NEWS: Updated.
+	* Makefile.am (pc/Makefile.tst): Make it work for out-of-tree
+	builds.  Thanks to `make distcheck' for the report.
+
+2018-11-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2018-11-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (usage): Improve output for -Z in the help.
+2018-11-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (outer_comment): New variable.
+	(Grammar): More changes. We now get the simple case of leading
+	and trailing comments, but not all the cases.
+
+2018-11-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (trailing_comment): New variable.
+	(Grammar): For `action', append both trailing comments. This may
+	change. For `statements', append the value of `trailing_comment'
+	if set. At `statement := l_brace statements rbrace' save
+	trailing_comment from r_brace.
+	(make_braced_statements): Don't append the comment from r_brace
+	to the statement list.
+
+2018-10-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (NODE): New field: sub.nodep.x.cmnt, holds comment for
+	expressions being pretty-printed.
+	* awkgram.y (Grammar): For expression lists, save any comment
+	that came after a comma in the list.
+	* profile.c (pp_push): Accept a fourth argument which is any
+	comment associated with the expression. Either it's there or
+	it's NULL. Save it in the pp_comment field of the node being pushed.
+	(tabs, tabs_len, check_indent_level): Made into static globals.
+	(pprint): Adjust all calls to pp_push(). Fix parenthesization
+	for casts in string lengthes when indenting.
+	(pp_list): If a popped item has a comment, include it and the
+	following indentation in the formatted result.
+
+2018-10-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (include_source): Add second parameter to return
+	SRCFILE pointer.
+	(Grammar): For @include, save the comment for later dumping
+	along with the list of include files.
+	(make_include_comment): Removed. No longer used.
+	* profile.c: Update copyright year.
+	(print_include_list): New function.
+	(dump_prog): Call it.
+
+2018-10-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (usage): Improve output for -Y and add -Z in the help.
+
+2018-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2018-10-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (SRCFILE): Add comment field for comments on @load statements.
+	* awkgram.y (include_source): Type change to boolean.
+	(load_library): Type change to boolean, additiona parameter to
+	bring the SRCFILE struct up to where we can add the comment into it.
+	(make_include_comment): New function. Not used yet.
+	(Grammar): Add comment for @load statements. Start on preserving
+	@include statements and their comments for eventual inclusion
+	into the pretty-printed code.
+	* profile.c (print_lib_list): Made a little smarter about printing
+	the header and indentation. Print the comment if there is one.
+
+2018-10-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (commenttype): Add FOR_COMMENT.
+	* awkgram.y (Grammar): Handle all the opt_nls cases in
+	regular for statements.
+	* debug.c (print_instruction): Print the comments in Op_K_for.
+	* profile.c (pprint): Handle printing comments.
+
+2018-10-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Updated.
+	* awkgram.y (Grammar): Distinguish `print' and `print $0' in
+	what gets profiled / pretty-printed.
+	* profile.c (pprint): For case and default, add final newline
+	if there is no comment to print.
+
+2018-10-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (Grammar): Improve comment handling for many plain
+	statements. Improve handling for case and default.
+	Handle comments in `for (iggy in foo)' loops.
+	(yylex): After a colon, only allow newline if was part of ?:.
+	(merge_comments): Improve coding so we don't get two newlines
+	at the end of a merged comment.
+	* debug.c (print_instruction): Handle comments for case and default.
+	Simplify printing of comments.
+	* profile.c (pprint): Handle comments for case and default.
+	Remove compiler warning in Op_and/Op_or handling.
+
+2018-10-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (Grammar): Add comment handling for do...while.
+	Regularize comments about `else ...'.
+	* debug.c (print_instruction): Improve handling of comments for
+	do-while and switch, and in general.
+	* profile.c (pprint): Revise for do...while.
+
+2018-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (make_braced_statements): New function.
+	(Grammar): Use it in the right places instead of inline code.
+	* debug.c (print_instruction): For Op_comment, fix type string.
+	* profile.c (pprint): Move tabs and tabs_len to top of function.
+	For Op_and and Op_or, handle comments.  Use new check_indent_level
+	for Op_and, Op_or and Op_cond_exp.
+
+2018-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (print_instruction): For Op_comment, use print_func
+	instead of fprintf to print the comment type.
+
+2018-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (Grammar): For statement -> { statements }, fix comment
+	handling.  For `if' statement add comment support.
+	* profile.c (pp_print): Print comments associated with `if' and `else'.
+
+2018-10-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (Grammar): Fix handling of empty statement (just a semi-
+	colon).
+	(merge_comments): If no chained comment and no second comment,
+	just return early.
+
+2018-10-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (enum commenttype): New enum.
+	(NODE): Add it to sub.val.
+	(EOL_COMMENT, FULL_COMMENT): Replaced with above enum values.
+	* awkgram.y (Grammar): Finish up handling comments in function headers
+	and bodies. Get trailing comments at end of program
+	(get_comment): When doing comments, if we got EOF, push it back so that
+	multiple comments get merged together.
+	(merge_comments): Allow second parameter to be NULL.
+	* profile.c (pp_print): Change to use above enum everywhere. For
+	Op_K_print_rec produce plain `print' instead of `print $0'. Handle
+	comments in ?:. Handle printing function comments.
+	(print_comment): Simplify `after_newline' assignment.  Add assertion
+	that chaining is only two deep.
+
+2018-10-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (action): Improve handling of comments attached
+	to braces. Helps with function bodies.
+
+2018-10-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (merge_comments): Change return type to void. Adjust calls.
+	(Grammar): For action, pull comments out of braces and stick
+	into the list. For function_prologue, get comments from parameters
+	and ending newline, merge, and save.  Wherever nls and opt_nls
+	are used, be sure to pass their values up via $$. For various
+	cases that can be empty, explicitly set $$ = NULL.
+	* profile.c (pprint): Get switch working.  Get ?: working.
+	(print_comment): Print any chained comment.
+	(pp_func): Start revising.
+
+2018-10-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: Range expressions, enable comment stuff.
+	Switch statement: start on comment handling.
+
+2018-10-01         Nelson H.F. Beebe     <beebe@math.utah.edu>
+
+	* custom.h (__builtin_expect): Define for non-GNU compilers.
+
+2018-09-27         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* mpfr.c (force_mpnum): Check that base is 10 also before
+	computing MPG integer.  Found based on bug report from
+	Luu Vinh Phuc <phuclv90@gmail.com>.
+
+2018-09-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add more lint checks.
+
+	* awk.h (POP_ARRAY): Add boolean parameter to check for untyped
+	value and include lint warning.
+	* interpret.h (r_interpret): Adjust all calls to POP_ARRAY.
+	* field.c (do_split): Improve lint warning text for empty
+	third argument.
+	* re.c (make_regexp): Add lint check for '\0' in contents of
+	regexp to be matched (dynamic or otherwise).
+
+2018-09-23         Steven Packard        <spackard1@bloomberg.net>
+
+	* awk.h: Add `#if !defined(__SUNPRO_C)' around check for non-ANSI
+	compilers.  Needed for some Solaris systems.
+
+2018-09-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (INSTRUCTION): Add comment field to carry
+	comment around during parsing.
+	* awkgram.y (merge_comments): New function.
+	(split_comment, check_comment, comment, prior_comment,
+	comment_to_save, program_comment, function_comment,
+	block_comment): Removed.
+	(grammar): Remove old code and start passing the comment
+	up via yylval and the newlines in the grammar.
+
+2018-09-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: Undo change of 2016-11-28 to make switch
+	head a separate production, in preparation for revamping
+	comment handling.
+
+2018-09-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* re.c (make_regexp): Handle backslash at end of
+	input string. Thanks to Anatoly Trosinenko
+	<anatoly.trosinenko@gmail.com> for the report.
+	Also, improve the error message when compilation of
+	the regexp fails.
+
+2018-09-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (fork_and_open_slave_pty): Move an errant close brace
+	inside the #endif so that gawk will compile on AIX. Thanks to
+	Fredrik Laurin <fredrik_laurin@yahoo.se> for the report.
+
+2018-09-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Fix typo in gettext version.
+
+	Unrelated:
+
+	* field.c (get_field): Move lint check for field access in an
+	END rule to top level, make wording more general.
+	* builtin.c (do_print_rec): Restore check before calling get_field()
+	and add do_lint to the condition.
+
+	Unrelated:
+
+	* field.c (set_NF): Add lint warning if decrementing NF, which
+	doesn't work on older Unix awks.
+
+	Unrelated:
+
+	* config.rpath: Sync to GNULIB.
+
+2018-09-16  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.19.8.
+	* ABOUT-NLS, config.rpath: Updated by gettext 0.19.8.1.
+
+2018-09-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* field.c (get_field): Add lint check if accessing $0 inside
+	an END rule, print a "may not be portable" warning.
+	* builtin.c (do_print_rec): Call get_field() unconditionally
+	in order to do lint check.
+
+	Unrelated:
+
+	* awkgram.c, command.c: Updated to Bison 3.1.
+	* NEWS: Updated.
+
+	Unrelated:
+
+	* Makefile.in, aclocal.m4, configure: Regenerated, using
+	Automake 1.16.1.
+
+	Unrelated:
+
+	* gettext.h: Synced with that from Gettext 0.19.8.1.
+
+2018-09-14         Adrian Bunk           <bunk@debian.org>
+
+	* awk.h (init_debug, debug_prog): Move prototypes to here from ...
+	* main.c: ... here.
+	Thanks to Michael Tautschnig for noticing the type mismatch.
+
+2018-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y, debug.c, ext.c, gawkapi.c, gawkapi.h,
+	io.c: Remove unneeded \n in calls to warning(), fatal(),
+	and lintwarn().
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Updated w.r.t. GNULIB regex routines.
+	* config.sub: Updated from GNULIB.
+
+2018-08-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2018-08-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-08-05         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* custom.h: Define macros needed for building with gnu regex.
+
+2018-08-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Add lint warning upon encountering escaped
+	physical newlines in a string.
+	* node.c (make_str_node): Ditto.
+
+2018-08-01         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* custom.h: Include fp.h on OpenVMS.
+	Workaround for bug in math.h missing some declarations.
+
+2018-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* interpret.h (unfield): Add a call to force_string() on
+	new value. See test/assignnumfield.awk. Thanks to
+	Ralph Corderoy <ralph@inputplus.co.uk> for the bug report.
+
+2018-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Handle newlines in -v and fix \-<newline>. Thanks to
+	Samy Mahmoudi <samy.mahmoudi@gmail.com> for the report.
+
+	* awk.h [ELIDE_BACK_NL]: New constant.
+	* awkgram.y (yylex): Disallow any physical newlines in a string
+	even if escaped, in POSIX mode.
+	* main.c (arg_assign): In POSIX mode disallow physical newline
+	in a -v value.  Otherwise call make_str_node() with ELIDE_BACK_NL.
+	* node.c (make_str_node): Handle ELIDE_BACK_NL.
+
+2018-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* array.c (cmp_strings): Preserve value of lmin so it can be passed
+	to memcmp() if IGNORECASE comparison failed. Thanks to
+	M. Rashid Zamani <rashid.z@gmail.com> for the report.
+
+2018-07-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* re.c (make_regexp): Add warnings for unknown escape sequences,
+	similar to what we already do for strings.
+	* awkgram.y: Add lint warning about concatenation as target
+	of `>' redirection.  Always use Op_parens so that
+	print "foo" > ("foo" 1) does not warn.
+
+2018-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (_GNU_SOURCE): Don't define it here, it's already
+	done in config.h.
+
+2018-07-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (format_nan_inf): New function to generate +nan, -nan,
+	+inf, -inf, so that gawk output for NaN and INF always has a sign.
+	Handles regular and MPFR.
+	(out_of_range): New function to check if a value is out of range,
+	both regular and MPFR.
+	(format_tree): Use them in out of range calculation.  Check for out
+	of range in floating point formats also. Allow new *undocumented*
+	'P' flag to not do out of range formantting. Used mainly for
+	the test program.
+	* awk.h (out_of_range, format_nan_inf): Declare functions.
+	* mpfr.c (mpg_format_val): Check for out of range and format the
+	the result appropriately if so.
+	* node.c (r_format_val): Ditto.
+
+2018-06-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-06-22         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* node.c (r_force_number): If strtod returns ERANGE, accept the
+	value as being numeric instead of forcing it to zero. The impact
+	is that huge string values that overflow IEEE 754 limits will now
+	be converted to inf or -inf instead of 0. Thanks to Daniel
+	Pettet for reporting this issue.
+
+2018-06-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix a corner case with EPIPE to stdout/stderr.
+	Thanks to Peng Yu for the report.
+
+	* io.c (close_io): Add new parameter for indicating EPIPE happened,
+	update the code to set it if so.
+	* awk.h (close_io): Revise declaration.
+	* debug.c (close_all): Change call to close_io().
+	* interpret.h (interpret): For Op_atexit, if got an EPIPE, call
+	die_via_sigpipe().
+
+2018-05-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (add_lint): For no-effect case, also check for
+	Op_push_i.  Makes statements consisting of a single constant
+	trigger the warning.
+
+2018-05-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-05-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Minor edits.
+
+2018-05-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Update from GNULIB.
+
+2018-05-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pc/Makefile.tst): New target.
+	(dist-hook): Now depends upon pc/Makefile.tst.
+
+2018-04-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h [dl_load_func]: Minor improvement in version mismatch
+	message as suggested by Manuel Collado
+	<m-collado@users.sourceforge.net>.
+
+2018-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2018-04-14         Manuel Collado       <m-collado@users.sourceforge.net>
+
+	* field.c (reset_record): Disable fieldwidth from API
+	get_record() if $0 is explicitly assigned a new value.
+
+2018-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub, install-sh: Updated from GNULIB.
+
+2018-04-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix a nasty MPFR bug in r_dupnode. If the value being copied
+	is MPFN / MPFR, copy those bits over too. Thanks to
+	Noah Dean <N.Dean@gaminglabs.com> for the report.
+
+	* node.c (r_dupnode): Check for MPFN / MPFR and copy the bits
+	over as needed.
+
+	Unrelated:
+
+	* interpret.h (UNFIELD): Turn into an inline function and
+	let UNFIELD macro call it, allows stepping in with a debugger.
+	(unfield): Function holding former body of UNFIELD macro.
+
+2018-03-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove the tail recursion optimization. It's fundamentally
+	broken, in the case where a local var becomes a parameter.
+	Thanks to Denis Shirokov <cosmogen@gmail.com> for the report.
+	See test/tailrecurse.awk.
+
+	* awk.h [num_tail_calls, tail_call]: Remove definitions.
+	* awkgram.y (grammar, mk_function): Remove code related to
+	the tail recursion optimization.
+	* eval.c (dump_fcall_stack): Adjust dumping code since no longer
+	looping through tail call recursion.
+	(setup_frame): Remove code related to the tail recursion optimization.
+	(init_interpret): Ditto.
+
+2018-03-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Check for %a support in system printf.
+	* builtin.c (format_tree): Add support for %a and %A, including
+	a lint warning.
+	* NEWS: Add a note about %a support.
+
+2018-03-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c, nonposix.h: Update copyright year.
+
+2018-03-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* compile, config.guess, config.sub, configure.ac, depcomp,
+	install-sh, mkinstalldirs: Updated.
+
+2018-03-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h [PUSH_BINDING, POP_BINDING]: Moved to ...
+	* debug.c: here.
+	* awkgram.y (yylex): Make do_etoa_init into a boolean.
+	* io.c (rs1scan): Make found into a boolean.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated.
+
+2018-02-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Restore checking for PPC Macintosh before
+	checking for MPFR. See README_d/README.macosx for info.
+
+2018-02-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Remove checking for PPC Macintosh before
+	checking for MPFR. Installing a newer compiler on that
+	system allows things to work.
+
+2018-02-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h, io.c, msg.c: Update copyright year.
+
+2018-02-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c, msg.c: Add a call to fflush(NULL) before each call
+	to abort(), since GLIBC 2.27 doesn't necessarily flush before
+	aborting.  Thanks to Nelson H.F. Beebe for the report.
+
+2018-02-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (socketopen): Rearrange assigning the flags to use
+	AI_ADDRCONFIG only if family is AF_UNSPEC. Thanks to
+	Houder <houder@xs4all.nl> for the report and initial
+	code suggestion.
+
+2018-02-07         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	Print +"01" should print "1", not "01".
+	* interpret.h (Op_unary_plus): Need to make a new number node that does
+	not contain the original string representation. The logic is copied
+	from Op_unary_minus.
+	* mpfr.c (mpg_interpret): Add new case for Op_unary_plus based on
+	the Op_unary_minus logic. We need a fresh number node that does not
+	contain the string.
+
+2018-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated.
+
+2018-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (main): Add explanatory comment about O_APPEND stuff.
+	* NEWS: Updated.
+
+2018-01-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix the inplace tests on *BSD systems.
+
+	* main.c (main): Add O_APPEND flag to fileno(stderr).
+
+2018-01-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_isarray): Check that tmp is Node_var
+	before calling DEREF. Thanks to Denis Shirokov
+	<cosmogen@gmail.com> for the report.
+
+2018-01-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Small typo fix.
+	* config.sub: Updated.
+	* io.c (fork_and_open_slave_pty): Rationalize down to one
+	function with two bodies.
+	(set_slave_pty_attributes, push_pty_line_disciplines): Move
+	into #ifdef for TERMIOS_H. Helps out with VMS compiling.
+
+2018-01-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Remove extraneous '*' on parameters of
+	type awk_ext_id. Thanks to Andrew Schorr for the report.
+
+2018-01-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* compile, config.guess, config.rpath, config.sub,
+	depcomp: Updated from GNULIB.
+
+2018-01-08         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* io.c (set_slave_pty_attributes): Currently no termios on VMS.
+	(set_slave_pty_attributes): No fork on VMS.
+
+2018-01-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Refactor handling of slave pty. On AIX and HP-UX open
+	slave in the child. Otherwise open slave in the parent
+	before forking (restoring code mostly from 4.1.3). Thanks
+	to Andrew Schorr for the bug report.
+
+	* io.c (fork_and_open_slave_pty): New routine. Two versions.
+	(set_slave_pty_attributes): New routine. Common code used by
+	both versions of fork_and_open_slave_pty.
+	(push_pty_line_disciplines): New routine. Common code used by
+	both versions of fork_and_open_slave_pty.
+	(two_way_open): Call fork_and_open_slave_pty instead of
+	doing it inline.
+
+2018-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (UPDATE_YEAR): Move to 2018. Revise copyright year.
+	* NEWS: Bring up to date.
+
+2018-01-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	If ROUNDMODE changes, cause cached string conversions
+	to become invalid. Thanks to Nethox <nethox@gmail.com>
+	for the report. Day 1 bug from 4.1.0 release.
+
+	In all the below files, bump copyright year, too.
+
+	* array.c (value_info): Include strndmode in the output.
+	* awk.h (NODE): New member, strndmode.
+	(MPFR_round_mode): Add extern declaration.
+	(force_string_fmt): Check s->strnmode against MPFR_round_mode.
+	* awkgram.y (set_profile_text): Set n->strndmode to MPFR_round_mode.
+	* builtin.c (do_print): Remove tests and just call force_string_fmt.
+	* field.c (set_record): Set n->strndmode to MPFR_round_mode.
+	* gawkapi.c (api_sym_update_scalar): Set r->strndmode to
+	MPFR_round_mode.
+	* interpret.h (r_interpret): For Op_assign_concat, set t1->strndmode
+	to MPFR_round_mode.
+	* mpfr.c (MPFR_round_mode): Define and initialize.
+	(mpfr_format_val): Set s->strndmode to MPFR_round_mode.
+	(set_ROUNDMODE): Update MPFR_round_mode when ROUNDMODE changes
+	successfully.
+	* node.c (r_format_val): Set s->strndmode to MPFR_round_mode.
+	(make_str_node): Set r->strndmode to MPFR_round_mode.
+	* str_array.c (str_kilobytes): Update a comment.
+	* symbol.c (check_param_names): Set n.strndmode to MPFR_round_mode.
+
+2017-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Avoid some compiler warnings. Thanks to Michal Jaegermann
+	<michal.jnn@gmail.com> for the report.
+
+	* builtin.c (do_strftime): Initialize save.
+	(do_dcgetttext): Initialize save and save2.
+	(do_dcngettext): Ditto.
+	(do_bindtextdomain): Initialize save and save1.
+
+	Unrelated:
+
+	* main.c (optlist): Make 'L' option's argument optional, to
+	match --lint. Thanks to Manuel Collado <mcollado2011@gmail.com>
+	for the report.
+
+2017-12-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub, depcomp, install-sh: Updated
+	from GNULIB.
+
+2017-12-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add --enable-versioned-dir option for a
+	directory with API version in it to hold extensions.
+
+2017-12-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Remove x's from `test "x$something" = "xyes"
+	kinds of things. With correct quoting, the x isn't needed.
+	(DYNAMIC): Remove use of -Wl,-export-dynamic on Linux
+	and FreeBSD. It was needed for old-style extensions, which are
+	no longer supported.
+
+2017-12-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: For '!' optimization on a string constant, don't
+	apply the optimization if it's a translatable string. Thanks
+	to Jeremy Feusi <jeremy@feusi.co> for the report.
+
+2017-11-25         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* debug.c (do_set_var): As in interpret.h (Op_store_field), we should
+	call the assign function before unref to give it a chance to copy
+	any non-malloced $n string values before freeing $0.
+
+2017-11-14         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* mpfr.c (get_rnd_mode): Fix MPFR_RNDA comment.
+
+2017-11-14         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	Fix corruption when $0 is reassigned while other NODEs have open
+	references to $n. Thanks to Eric Pruitt <eric.pruitt@gmail.com> for
+	the bug report.
+
+	* field.c (purge_record): For each $n field variable, if valref > 1
+	and it has not already been malloced, make a copy of the string, since
+	$0 is about to be reset.
+	* interpret.h (Op_store_field): We must call the assign function
+	before unref, since we must copy any non-malloced $n string values
+	before freeing $0.
+
+2017-11-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (usage): Add a note to not post bugs in comp.lang.awk.
+	So there.
+
+2017-11-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h (AWK_NUMBER_TYPE): Move this enum out to the
+	top level so that it works correctly with C++.
+
+2017-10-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Updated with info about OS/2.
+
+2017-10-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: For string concatenation, don't fold constants
+	if one or the other is translatable. Thanks to Harald van Dijk
+	<harald@gigawatt.nl> for the report.
+
+2017-10-21  KO Myung-Hun <komh78@gmail.com>
+
+	* nonposix.h [__KLIBC__]: Include dlfcn.h, declare os2_dlsym, and
+	redirect dlsym to os2_dlsym. Declare os2_fixdllname.  Declare
+	os2_dlopen and redirect dlopen to os2_dlopen.
+	* io.h (find_source) [__EMX__]: Truncate extension file basename
+	to 8 characters.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-10-17         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* NEWS: Actually, isarray is not deprecated in this release.
+	* builtin.c (do_isarray): Remove lint warning deprecating isarray.
+
+2017-10-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* field.c (do_split): Simplify the lint warnings.
+	Based on suggested code by Eric Pruitt <eric.pruitt@gmail.com>.
+
+	Unrelated:
+
+	* awkgram.y (check_funcs): Remove the REALLYMEAN ifdef and
+	simplify the lint checking code for function defined but not
+	called or called but not defined.
+
+2017-10-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Assume a more C99 environment:
+
+	* awk.h: Assume we have limits.h, stdarg.h and stdbool.h.
+	* configure.ac: Remove checks for limits.h and stdarg.h.
+
+2017-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Remove --with-whiny-user-strftime option.
+	* NEWS: Updated.
+	* ChangeLog.0: Fix a typo. :-)
+
+2017-10-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* command.y: Fix the FSF's address.
+
+2017-10-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Rationalized with respect to stuff on the API.
+	Also rationalized with respect to the pretty printer changes.
+
+2017-10-04         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* README: Fix grammar by removing a stray word.
+
+2017-10-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Add a note about OS/2 not working.
+
+2017-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Undo change of 2014-09-07:
+
+	* configure.ac: Remove the undocumented option to enable locale
+	letters in identifiers.
+	* awkgram.y (is_alpha): Remove related code.
+
+2017-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated.
+
+2017-09-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (devopen): Move declaration of `cp' to where it's first used.
+
+2017-09-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README: Update required version of texinfo.tex.
+	* compile, config.guess, config.sub, depcomp: Updated.
+
+2017-09-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Small changes to make it usable with C++.
+
+2017-09-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (command.c): Don't need the dependency on awkgram.c
+	anymore.
+	* bisonfix.awk: Removed.
+	* README: Revised to describe use of Bison exclusively.
+
+2017-09-13         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* Makefile.am (awkgram.c): Use -o option to bison. Get rid of
+	messing with y.tab.h, that was obsolete.
+	(EXTRA_DIST): Don't need bisonfix.awk anymore.
+
+2017-09-12         Petr Ovtchenkov       <ptr@void-ptr.info>
+		   Andrew J. Schorr      <aschorr@telemetry-investments.com>
+
+	* Makefile.am (command.c): Make dependant on awkgram.c so
+	that bison is run serially with make -j.  Use -o option so
+	that we no longer need bisonfix.awk in this rule.
+
+2017-08-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* interpret.h (r_interpret): Add some casts to avoid warning
+	messages in printf statements.
+
+	Unrelated:
+
+	* configure.ac: Add check for gai_strerror.
+	* io.c (socketopen): Use gai_strerror to add more information
+	if getaddrinfo fails.
+
+2017-08-25         Pat Rankin            <r.pat.rankin@gmail.com>
+
+	* builtin.c (TYPE_MINIMUM): Use type uintmax_t for the calculation,
+	deferring the cast to the target type until the final result.
+
+2017-08-27         Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* mbsupport.h [__DJGPP_]: Provide multi-byte specific declarations
+	and definitions for DJGPP.
+
+2017-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.git: Minor edits to make build steps clearer.
+
+2017-08-21         Daniel Richard G.     <skunk@iSKUNK.ORG>
+
+	* awk.h (c_func): Renamed to c_function to avoid conflict.
+	with z/OS headers.
+	* ext.c, interpret.h: Ditto.
+	* configure: Regenerated after update to m4/arch.m4.
+
+2017-08-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (do_set_var): Fix typos in error messages.
+	Thanks to Jean-Philippe Guerard
+	<jean-philippe.guerard@xn--tigreray-i1a.org> for the report.
+
+2017-08-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* field.c (rebuild_record): Set new fields valref to 1 if
+	original field's valref was > 1. Update the comment. Found
+	by running chem.
+	* mpfr.c (do_mpfr_compl): Fix typo in warning message.
+	Thanks to Jean-Philippe Guerard
+	<jean-philippe.guerard@xn--tigreray-i1a.org> for the report.
+	* NEWS: Mention the Italian translation of the manual.
+
+2017-08-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.c (assign_number): Clean up the code a bit.
+	(api_get_mpfr, api_get_mpz): Add return NULL in non-MPFR case
+	to avoid compiler warnings.
+
+2017-08-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Update from GNULIB.
+	* NEWS, README: Updated in preparation for release.
+
+2017-08-16         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (assign_number): Add 'ifdef HAVE_MPFR' tests to get this
+	to build in the absence of MPFR.
+
+2017-08-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h (gawk_api_major_version): Reset to 2 after merging
+	in feature/api-mpfr branch.
+	* NEWS: `intdiv' is not built-in; remove the entry for up and update
+	numbering. Add note about API supporting GMP and MPFR values.
+
+2017-08-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h (check_mpfr_versions): Define differently based on if
+	MPFR version macro is defined. Enhance body to use do/while(0).
+	(dl_load): Call check_mpfr_versions unconditionally.
+
+2017-08-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (usage): Add URL for Bug reporting info to the help message.
+
+	Unrelated:
+
+	* str_array.c (str_lookup): Make a copy of the string if it
+	came from Nnull_string or a null field.  Thanks to
+	Daniel Pettet for the report.
+
+2017-08-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* array.c, awk.h, awkgram.y, builtin.c, cint_array.c,
+	cmd.h, debug.c, eval.c, ext.c, field.c, gawkapi.c, gawkmisc.c,
+	gettext.h, int_array.c, main.c, mpfr.c, msg.c, node.c, profile.c,
+	re.c, str_array.c, symbol.c: Update copyright years.
+
+2017-08-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, mkinstalldirs: Updated from GNULIB.
+
+2017-08-01         Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	Bring DJGPP support up to speed.
+
+	* awk.h: Add DJGPP in #if for include of nonposix.h
+	* nonposix.h (btowc, putwc): Add declarations for DJGPP.
+
+2017-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (validate_qualified_name): Return type back to bool.
+	* awkgram.y (validate_qualified_name): Return type back to bool.
+	(lookup_builtin): Make allowances for `awk::' prefix on name.
+	* interpret.h (r_interpret): For indirect call, always pass true
+	for do_qualify argument of lookup.
+	* main.c (main): Make note of errors in -v values, use this
+	to exit failure if any happen.  Only change current_namespace
+	to 'awk::' if doing pretty printing.
+	(arg_assign): If validate_qualified name returns false, error out.
+
+2017-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (set_namespace): Change return type void, adjust
+	all return statements.
+	[@namespace]: Don't YYABORT on bad namespace so that we can check
+	the rest of the program.
+	(validate_qualified_name): Check traditional / posix first. Return
+	after printing an error message; we don't want to print multiple
+	messages for the same identifer.
+	* interpret.h (r_interpret): For indirect call, set do_qualify
+	parameter of lookup based on presence of a colon.
+
+2017-07-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Make qualified names work with -v and command-line assignments.
+
+	* awk.h (validate_qualified_name, check_qualified_name): Declare.
+	* awkgram.y (validate_qualified_name): No longer static.
+	(check_qualified_name): Ditto.
+	* main.c (arg_assign): Allow colons in identifiers. If not a
+	bad identifier, call validate_qualified_name and instead of
+	check_special use check_qualified_name.
+
+2017-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Allow identifiers that are gawk extensions to be used as plain
+	identifiers outside the "awk" namespace. Make the real
+	builtins available via awk::builtin_name(). Standard awk reserved
+	words and builtin functions remain reserved.
+
+	* awk.h (getfname): Add boolean parameter to prepend namespace
+	or not.
+	* awkgram.y (check_qualified_name): New function. Enforces that
+	standard awk reserved words and functions aren't allowed, and
+	allows awk::gawk_extension from non-"awk" namespace.
+	[direct_func_call]: Always convert name to fully qualified.
+	(getfname): Add boolean parameter to prepend namespace
+	or not. Adjust code.
+	(yylex): Separate out validation code from code building the
+	NAME token.  Use check_qualified_name to decide if token is
+	special instead of check_special.
+	(validate_qualified_name): Just checks the form of the fully
+	qualified name.
+	* debug.c (print_instruction): Update call to getfname.
+	* profile.c (pprint): Update call to getfname.
+
+2017-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y [direct_func_call]: Save full variable name for
+	indirect calls too.
+
+2017-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y [non_post_simp_exp]: Merge LEX_BUILTIN and
+	LEX_LENGTH expansions.
+	(lookup_builtin): Move MPFR test to after test for sub builtin.
+
+	* awkgram.y [non_post_simp_exp]: Unmerge LEX_BUILTIN and
+	LEX_LENGTH expansions. This introduced a reduce/reduce
+	conflict, and those are bad.  I don't know why I didn't
+	notice this earlier. Sigh.
+
+2017-07-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Revert change of 2016-07-24 that always runs the dfa
+	matcher. Based on a bug report from Alexandre Oliva
+	<lxoliva@fsfla.org>, DFA can cause gawk to hang, even
+	in the C locale.
+
+	* re.c (research): Don't use dfa if need_start is true.
+
+2017-07-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	More rationalization of the namespace code.
+
+	* awk.h (is_valid_identifier): Declare.
+	* awkgram.y (grammar: direct_func_call): Store the fully qualified
+	name in the op code.
+	(yylex): Disallow reserved words and functions as namespace name.
+	(check_params): Small code edit
+	(validate_qualified_name): Use is_lsetter.
+	(set_namespace): Check for NULL pointer first! Use is_valid_identifier
+	instead of inline code.  Disallow using reserved words as namespace
+	names.
+	* ext.c (is_valid_identifier): No longer static.
+	(make_builtin): Check name and namespace against reserved words and
+	fatal error if found.
+	* gawkapi.c (ns_lookup): New function to look for variables
+	in namespaces.
+	(api_sym_lookup): Check namespace for validity and use ns_lookup.
+	(api_sym_update): Ditto.
+	* profile.c (pp_print): Correctly print full function name
+	in a function call.
+
+2017-07-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Continue adding namespace support to the extension API.
+
+	* awk.h (make_builtin): Add leading name_space parameter.
+	* ext.c (make_builtin): Add leading name_space parameter.
+	Do the appropriate checking and building of a name before
+	installing in the symbol table.
+	* gawkapi.c (add_ext_func): Use name_space, not namespace.
+	Check that the parameter isn't NULL.
+	(api_sym_lookup, api_sym_update): Use name_space, not namespace.
+	* gawkapi.h: Use name_space, not namespace, everywhere.
+
+2017-07-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (is_letter): Add declaration.
+	* ext.c (is_valid_identifier): New function.
+	(make_builtin): Use is_valid_identifier instead of inline code.
+	(is_letter): Moved from here ...
+	* awkgram.y (is_letter): ... to here.
+	(yylex): Use is_letter instead of a test.
+	* command.y (yylex): Ditto.
+	* main.c (arg_assign): Ditto.
+
+2017-07-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove warnings from GCC 7.1 compilation.
+
+	* awk.h (fatal_tag_valid): Change type to int.
+	* awkgram.y (yylex): Set did_newline to true instead of using ++.
+	* builtin.c (format_tree): Set lj to true instead of using ++.
+	* cmd.h (pager_quit_tag_valid): Change type to int.
+	* debug.c (pager_quit_tag_valid): Change type to int.
+	(do_clear): Make bp_found an int, change uses.
+	(do_run): Treat fatal_tag_valid as an int.
+	* msg.c (fatal_tag_valid): Change type to int.
+
+2017-07-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yyerror): Produce better diagnostics for source
+	files that are not whole syntactic units.
+
+	* gawkapi.c (api_sym_lookup, api_sym_update): Add namespace parameter.
+	Currently unused.
+	* gawkapi.h (api_sym_lookup, api_sym_update): Add namespace parameter.
+	(api_sym_lookup_ns, api_sym_update_ns): New macros.
+	(api_sym_lookup, api_sym_update): Adjust macro bodies.
+
+2017-07-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawapi.h: Bring descriptive comments up to date, minor edits.
+	* io.c: Add some initial comments to functions where they were missing.
+
+2017-07-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h, gawkapi.c: Typo fixes in comments.
+
+2017-07-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symbol.c (install): Don't call fix_up_namespace if
+	installing parameters.
+	* profile.c (remove_namespace): Renamed to
+	(adjust_namespace): Make smarter and add boolean parameter for
+	if return was mallc'ed. Adjust calls.
+
+2017-06-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add namespace info into Op_Rule and Op_Func.
+	Fix memory management problem.
+	The changes temporarily break the test suite.
+
+	* awk.h (MAX_INSTRUCTION_ALLOC): Increase to 4.
+	(Op_K_namespace): Remove, not needed.
+	* eval.c (optypetab): Remove Op_K_namespace.
+	* awkgram.y (make_pp_namespace): New function.
+	(yylex): For BEGIN etc, allocate 4 in the instruction.
+	(install_func): Save namespace name for Op_rule.
+	(append_rule): Save namespace name for Op_rule.
+	* debug.c (print_instruction): Print namespace for Op_rule, Op_func.
+	Remove Op_K_namespace.
+	* profile.c (pp_namespace, remove_namespace): New functions.
+	(pprint): Call `pp_namespace'. Use `remove_namespace' on variable
+	names.
+	(pp_func): Ditto on both.
+	* symbol.c (lookup): Initialize `malloced' to false.
+	(install): Ditto.
+
+	Unbreak the test suite:
+
+	* awk.h (namespace_changed): Declare new boolean variable.
+	* awkgram.y (namespace_changed): Define new boolean variable.
+	(set_namespace): Set it to true when the namespace is changed.
+	* main.c (main): Set current_namespace to "awk::" for the pretty
+	printer.
+	* profile.c (pp_namespace): If namespace_changed is false, return.
+
+2017-06-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h [ns_name]: Add macro in preparation for use.
+	* debug.c (print_instruction): Add case for Op_K_namespace.
+	Not really used yet.
+	* symbol.c (fix_up_namespace): Bug fix to always allocate
+	memory for a full name. Add boolean parameter to indicate
+	if memory was malloc'ed or not.
+	(lookup): Adjust call to fix_up_namespace and use make_str_node
+	if the string was malloced.
+	(install): Ditto.
+
+2017-06-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Turn a tab into a space in AC_DEFINE(SUPPLY_INTDIV).
+
+2017-06-25         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkmisc.c (xmalloc): Remove function now in support/xalloc.h.
+
+2017-06-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Make pretty-printing include parentheses that were explicitly
+	in the source code. Thanks to Hermann Peifer for the bug report.
+
+	* awk.h (OPCODE): Add Op_parens.
+	* awkgram.y [Grammar]: If pretty-printing, add Op_parens ot end of
+	list for parenthesized expression.
+	* eval.c (optypetab): Add Op_parens.
+	* interpret.h (r_interpret): Ditto.
+	* profile.c (pprint): Ditto.  For ?:, don't parenthesize it.
+	(pp_parenthesize): If string starts with left paren, return early.
+	(parenthesize): Don't call div_on_left_mul_on_right.
+	(div_on_left_mul_on_right): Remove function.
+	(pp_concat): Don't add parentheses if expressions already have them.
+	* NEWS: Updated.
+
+2017-06-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Replace malloc/memset combinations with calloc by using the new ezalloc
+	macro.
+	* awkgram.y (yyerror, do_add_srcfile, funcuse): Replace emalloc+memset
+	with ezalloc.
+	* cint_array.c (cint_lookup, cint_copy, tree_lookup, tree_copy,
+	leaf_lookup, leaf_copy): Ditto.
+	* command.y (mk_cmdarg): Ditto.
+	* debug.c (add_item): Ditto.
+	* eval.c (setup_frame): Ditto.
+	* field.c (set_record): Ditto.
+	* gawkapi.c (api_flatten_array_typed): Ditto.
+	* int_array.c (int_copy, grow_int_table): Ditto.
+	* io.c (init_awkpath, iop_alloc): Ditto.
+	* node.c (str2wstr): Ditto.
+	* re.c (make_regexp): Ditto.
+	* str_array.c (str_copy, grow_table): Ditto.
+	* symbol.c (make_params, new_context): Ditto.
+
+2017-06-19         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (ezalloc): Add new macro to allocate memory initialized to zero.
+	(ezalloc_real): New inline function to call calloc.
+	* gawkapi.h (ezalloc): Add new API macro to allocate memory initialized
+	to zero.
+
+2017-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (mbc_char_count): Fix code to correctly traverse
+	the string. Thanks to Hermann Peifer for the bug report.
+	* config.guess, config.sub: Update to latest from GNULIB.
+	* gettext.h: Pull in a few nice changes from GNULIB version.
+
+2017-06-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (lookup): Add second parameter.
+	* array.c (assoc_list): Adjust call to lookup.
+	* awkgram.y (grammar, parms_shadow, install_function, variable):
+	Ditto.
+	* command.y [Grammar]: Ditto.
+	* debug.c (find_symbol): Ditto.
+	* ext.c (make_builtin): Ditto.
+	* gawkapi.c (api_sym_lookup, api_sym_update): Ditto.
+	* interpret.h (r_interpret): Ditto.
+	* main.c (arg_assign): Ditto.
+	(main): Reset current_namespace after parsing.
+	* symbol.c (lookup): New second parameter, do_qualify. Use it
+	to qualify names or not.
+	(install): Call fix_up_namespace.
+	(is_all_upper): New helper routine.
+	(fix_up_namespace): New function.
+
+2017-06-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (awk_namespace, current_namespace): Move to const char.
+	(SRCFILE): Add namespace element.
+	* awkgram.y (awk_namespace, current_namespace): Move to const char.
+	(set_namespace): New function.
+	[Grammer]: Call it.
+	(tokentab): Add "namespace" entry.
+	(include_source): Push the current namespace.
+	(next_sourcefile): Pop the current namespace.
+	(yylex): Add lint warning if a reserved word is used as a namespace
+	name.
+	(validate_qualified_name): Make it an error to use a reserved
+	word as the second part of a fully qualified name.
+
+2017-06-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (awk_namespace, current_namespace): Declare.
+	(opcodeval): Add Op_K_namespace.
+	* awkgram.y (awk_namespace, current_namespace): Define.
+	(LEX_NAMESPACE): Add lexing and parsing of `@namespace directive'.
+	(tokentab): Add "namespace" entry.
+	(yylex): Check if first part of qualified identifier is
+	a reserved word or function.
+	* eval.c (optypetab): Add Op_K_namespace.
+
+2017-06-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Allow :: in identifiers (the "NAME" token).
+	Use validate_qualified_name to check it.
+	(validate_qualified_name): New function.
+
+2017-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (nextc): Force -e chunks to be syntactic units.
+	Needed for namespaces to work correctly.
+
+2017-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Mention PROCINFO["argv"].
+
+2017-05-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* field.c (set_FIELDWIDTHS): Add check to protect against blank
+	characters after a `:' skip separator. 
+	Fix field number in error message, thanks to a bug report
+	from Michal Jaegermann.
+
+2017-05-23         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* field.c (set_FIELDWIDTHS): Simplify the logic and consistentify
+	use of UINT_MAX.  Make sure that negative value after : is caught.
+
+2017-05-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* field.c (fw_parse_field): Stop upon hitting the end of the
+	record; this enables correct counting of the number of fields.
+	(set_FIELDWIDTHS): Add `*' at end as meaning ``all the rest
+	of the data on the line.'' Allow skip:* as well.
+	* NEWS: Update information about FIELDWIDTHS.
+
+2017-05-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (add_lint): Make ``no effect'' check smarter about
+	reporting line numbers.
+
+2017-05-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (nextc): Fix to change of 2017-04-24 such that
+	@include works in multibyte locales. Thanks to Hermann
+	Peifer for the bug report.
+
+2017-04-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkgram.y (make_regnode): Fix bug -- we should not set valref to 1
+	when creating a node of type Node_regex, since valref is appropriate
+	only for Node_val nodes. This fixes a bug introduced in commit
+	687e6594. Also, add an assert to make it clear that this function
+	supports only Node_regex and Node_dynregex.
+	* awk.h (NODE): Restore sref to the `val' subportion, since it is not
+	really needed for Node_regex, now that the bug in make_regnode has
+	been fixed.
+	(valref): Restore macro definition.
+
+2017-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (NODE): Additional cleanups. Removed `aq' and `param_list'
+	elements from various unions and removed 'nextp' and
+	`a_opaque' defines. None of these were in use.
+	Rework the comment for valref, per suggestion from
+	Andrew Schorr.
+
+2017-04-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (nextc): Adjust so that 3.1.x behavior is restored
+	whereby --source arguments are concatenated. Thanks to
+	"Neil R. Ormos" <ormos-gnulists17@ormos.org> for the report.
+
+2017-04-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (NODE): Put the `val' subportion back the way it
+	was and move valref (formerly sref) out of the unions
+	entirely. This was the real problem. Rework the corresponding
+	commentary.
+	[valref]: Removed the macro definition.
+
+2017-04-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Make letter case usage in the various
+	AC_ARG_ENABLE messages consistent with the rest of configure
+	output.
+	(--disable-mpfr): Add this option to make it easier
+	to check compiles without MPFR. Motivated by:
+	* awk.h (NODE): Rearrange the layout of the 'val' subportion
+	of the union to fix alignment problems when compiling without
+	MPFR.  The problem only happened on 64-bit compiles, not
+	32-bit compiles.
+
+2017-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Rename intdiv it intdiv0 and require enabling at configure time.
+
+	* awkgram.y (tokentab): Bracket intdiv0 in #ifdef SUPPLY_INTDIV.
+	(snode): Similar.
+	* builtin.c (do_intdiv): Bracket in #ifdef SUPPLY_INTDIV.
+	* mpfr.c (do_mpfr_intdiv): Bracket in #ifdef SUPPLY_INTDIV.
+	* configure.ac: Add --enable-builtin-intdiv0 option. If enabled,
+	also revise doc/gawktexi.in.
+
+2017-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_intdiv): Use DEREF on the arguments.
+	Thanks to Andrew Schorr for finding the problem.
+	* mpfr.c (do_mpfr_intdiv): Return -1 if numerator or denominator
+	are not valid numbers.  Unref various bits first.
+
+2017-04-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (make_number_node): Simplify.
+	* mpfr.c (mpg_node): Change parameter name to `flags'.
+
+2017-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* mpfr.c (mpg_format_val): Set STRCUR flag when we're done.
+	Fixes a memory leak. Thanks to valgrind for the report.
+
+	* builtin.c (do_dcgettext): Move declaration of reslen to
+	outside the ifdefs. Thanks to Hermann Peifer for the report.
+
+	* gawkapi.c (awk_value_to_node): Initialize ext_ret_val to NULL
+	to avoid compiler warnings.
+
+2017-04-12         Manuel Collado        <m-collado@users.sourceforge.net>
+
+	Fix the FPAT bug reported by Ed Morton in the gawk-bug mailing list.
+
+	* awk.h (Regexp): Remove the non_empty flag.
+	* field.c (fpat_parse_field): Restructure the code to reduce complexity
+	and document the new structure.
+
+	* field.c (fpat_parse_field): Further restructuring to avoid
+	invalid reads as reported by valgrind.
+
+2017-04-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (enum opcodeval): For the avoidance of doubt, specify that
+	Op_illegal must equal zero.
+	* symbol.c (bcfree): Improve clarity by setting opcode to Op_illegal
+	instead of 0.
+	(free_bc_mempool): Improve clarity by comparing opcode to Op_illegal
+	instead of to 0.
+
+	* field.c (set_FIELDWIDTHS): Set use_chars to awk_true, since its
+	type is awk_bool_t.
+
+2017-04-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symbol.c (free_bc_mempool): Change `first' from int to bool.
+
+2017-04-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* field.c (fw_parse_field): Edit comment about resetting shift state.
+	* gawkapi.h (awk_fieldwidth_info_t): Make white space more uniform.
+
+2017-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* main.c (usage, copyleft) [__MINGW32__]:
+	* io.c (non_fatal_flush_std_file, close_io) [__MINGW32__]: Call
+	w32_maybe_set_errno to correctly set errno to EPIPE when appropriate.
+
+	* awk.h (die_via_sigpipe) [__MINGW32__]: MinGW-specific definition.
+
+2017-04-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (INSTRUCTION_POOL): Redefine as an array of structures so we
+	can track allocated blocks.
+	* symbol.c (pools): Make it a pointer to avoid copying.
+	(struct instruction_block): Define structure to hold a block of
+	allocated instructions.
+	(bcfree): Update to use new INSTRUCTION_POOL definition.
+	(bcalloc): Allocate an instruction by searching first on the free
+	list, second for free space in the current block, or third by
+	allocating a new block.
+	(set_context): Update to reflect that pools is now a pointer.
+	(free_bc_mempool): New helper function to free a pool of a certain size.
+	(fre_bcpool): Call free_bc_mempool for each pool.
+
+2017-04-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (INSTRUCTION): Add pool_size member.
+	[MAX_INSTRUCTION_ALLOC]: New macro.
+	(INSTRUCTION_POOL): New type.
+	(struct context): Use INSTRUCTION_POOL.
+	* array.c (assoc_list): Reorg the code a bit to make sure
+	to always free the INSTRUCTIONs allocated for calling a
+	user-supplied sorting function. Based on code by
+	Andrew Schorr.
+	* symbol.c (free_bcpool): Rework to use an INSTRUCTION_POOL.
+	(bcfree, bcalloc): Rework to use separate chains in
+	the instruction pool.
+	(set_context): Update appropriately.
+
+2017-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* field.c (parse_field_func_t): New typedef. Used as needed.
+	(fw_parse_field): Edit comment about resetting shift state.
+	(set_parser): Fix leading comment's style and type of argument.
+	(set_FIELDWIDTHS): Improve the fatal error message.
+	* gawkapi.h: Minor edits in some comments.
+
+2017-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Cause EPIPE errors to stdout to generate a real SIGPIPE.
+
+	* awk.h (die_via_sigpipe): New macro.
+	* builtin.c (efwrite): Use it.
+	* io.c (non_fatal_flush_std_file): Ditto.
+	* main.c (usage): Ditto.
+
+2017-03-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (flush_io): Use r_fatal and r_warning for messagefunc
+	in the loop.
+
+2017-03-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (efwrite): Exit successfully upon EPIPE, as SIGPIPE
+	done. Improve error messages upon failure to write.
+	(do_fflush): Update ERRNO for non-fatal flush failures.
+	* io.c (non_fatal_flush_std_file): Update ERRNO when flush is
+	non-fatal.
+	(flush_io): If a redirect is marked non-fatal, only warning,
+	not fatal message.
+
+2017-03-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated again.
+
+2017-03-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* NEWS: Document new PROCINFO["FS"] value of "API".
+
+2017-03-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* NEWS: Document new FIELDWIDTHS skip capability and API input parser
+	field parsing enhancement.
+
+2017-03-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (awk_input_buf_t): Update get_record comment regarding the
+	new field_width argument.
+
+2017-03-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (awk_fieldwidth_info_t): Define new structure to contain
+	API field parsing info, replacing the previous awk_input_field_info_t
+	array.
+	(awk_fieldwidth_info_size): Define macro to calculate size of the
+	variable-length awk_fieldwidth_info_t structure.
+	(awk_input_buf_t): Update get_record prototype to update the type
+	of the final field_width argument from 'const awk_input_field_info_t **'
+	to 'const awk_fieldwidth_info_t **'.
+	* awk.h (set_record): Change 3rd argument from
+	'const awk_input_field_info_t *' to 'const awk_fieldwidth_info_t *'.
+	* io.c (inrec, do_getline_redir, do_getline): Change field_width type
+	from 'const awk_input_field_info_t *' to
+	'const awk_fieldwidth_info_t *'.
+	(get_a_record): Change field_width argument type from
+	'const awk_input_field_info_t **' to 'const awk_fieldwidth_info_t **'.
+	* field.c (api_parser_override): Define new boolean to track whether
+	API parsing is currently overriding default parsing behavior.
+	(api_fw): Change type from 'const awk_input_field_info_t *'
+	to 'const awk_fieldwidth_info_t *'.
+	(FIELDWIDTHS): Change type from 'int *' to 'awk_fieldwidth_info_t *'.
+	(set_record): Use new boolean api_parser_override to track whether
+	API parsing override is in effect, since we can no longer discern
+	this from the value of parse_field -- FIELDWIDTHS parsing uses the
+	same function.
+	(calc_mbslen): New function to calculate the length of a multi-byte 
+	string.
+	(fw_parse_field): Enhance to support the awk_fieldwidth_info_t 
+	structure instead of simply using an array of integer field widths.
+	(api_parse_field): Remove function no longer needed since fw_parse_field
+	now supports both FIELDWIDTHS and API parsing.
+	(set_parser): Use api_parser_override instead of comparing parse_field
+	to api_parse_field.
+	(set_FIELDWIDTHS): Enhance to use new awk_fieldwidth_info_t structure
+	and parse new skip prefix for each field.
+	(current_field_sep): Use api_parser_override flag instead of comparing
+	to api_parse_field.
+	(current_field_sep_str): Ditto.
+
+2017-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Improve handling of EPIPE. Problems reported by
+	Alexandre Ferrieux <alexandre.ferrieux@orange.com>
+	and David Kerns <david.t.kerns@gmail.com>.
+
+	* awk.h (ignore_sigpipe, set_sigpipe_to_default,
+	non_fatal_flush_std): Declare new functions.
+	(ignore_sigpipe, set_sigpipe_to_default,
+	non_fatal_flush_std): New macros.
+	* builtin.c (do_fflush): When nonfatal not in force, flush
+	of stdout/stderr and EPIPE exits, simulating SIGPIPE, as
+	in nawk/mawk. Flush of other redirections with EPIPE now
+	also fatals.
+	(do_system): Use ignore_sipipe and set_sigpipe_to_default
+	instead of uglier inline ifdefed code.
+	* main.c (main): Ditto.
+	* io.c (redirect_string, two_way_open, gawk_popen): Ditto.
+	(flush_io): Use non_fatal_flush_std for stdout and stderr.
+
+	Unrelated:
+
+	* config.guess, config.rpath, config.sub, install-sh:
+	Sync with GNULIB.
+
+2017-03-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Some cleanups.
+
+2017-03-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (awk_input_field_info_t): Define new structure to contain
+	API field parsing info.
+	(awk_input_buf_t): Update get_record prototype to use an array of
+	awk_input_field_info_t instead of integers.
+	* awk.h (set_record): Change 3rd argument from 'const int *' to
+	'const awk_input_field_info_t *'.
+	* field.c (api_fw): Now points to an array of awk_input_field_info_t
+	instead of integers.
+	(set_record): Change 3rd argument to point to an array of
+	awk_input_field_info_t.
+	(api_parse_field): Update parsing logic to use awk_input_field_info_t
+	structures instead of an array of integers.
+	* io.c (inrec, do_getline_redir, do_getline): Change field_width type
+	from 'const int *' to 'const awk_input_field_info_t *'.
+	(get_a_record): Change field_width argument type from 'const int **'
+	to 'const awk_input_field_info_t **'.
+
+2017-03-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* field.c: Minor style edits.
+
+2017-03-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* field.c (normal_parse_field): Renamed from save_parse_field to reflect
+	better its purpose. Added a comment to explain more clearly what's
+	going on.
+	(set_record, set_parser): Rename save_parse_field to normal_parse_field.
+
+2017-03-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (awk_input_buf_t): Remove field_width array and instead
+	add it as a 6th argument to the get_record function. This should
+	not break existing code, since it's fine to ignore the additional
+	argument. Document the behavior of the field_width argument.
+	* io.c (inrec): Pass pointer to field_width array to get_a_record,
+	and then hand it off to set_record.
+	(do_getline_redir): If not reading into a variable, pass pointer to
+	field_width array to get_a_record and then hand it off to set_record.
+	(do_getline): Ditto.
+	(get_a_record): Add a 4th field_width argument to pass through to
+	the API get_record method.
+
+2017-03-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (set_record): Add a new argument containing a field-width
+	array returned by an API parser.
+	(field_sep_type): Add new enum value Using_API.
+	(current_field_sep_str): Declare new function.
+	* field.c (save_parse_field): New static variable to save the
+	parse_field value in cases where it's overridden by API parsing.
+	(api_fw): New static variable to hold pointer to API parser fieldwidth
+	array.
+	(set_record): Add new field-width array argument. If present, API
+	parsing will override the default parsing mechanism.
+	(api_parse_field): New field parser using field widths supplied by the
+	API. This is very similar to the existing fw_parse_field function.
+	(get_field): Fix typo in comment.
+	(set_parser): New function to set default parser and check whether
+	there's an API parser override in effect. Update PROCINFO["FS"] if
+	something has changed.
+	(set_FIELDWIDTHS): Use set_parser and stop updating PROCINFO["FS"].
+	(set_FS): Ditto.
+	(set_FPAT): Ditto.
+	(current_field_sep): Return Using_API when using the API field parsing
+	widths.
+	(current_field_sep_str): New function to return the proper string
+	value for PROCINFO["FS"].
+	* gawkapi.h (awk_input_buf_t): Add field_width array to enable the
+	parser get_record function to supply field widths to override the
+	default gawk field parsing mechanism.
+	* io.c (inrec): Pass iop->public.field_width to set_record as the
+	3rd argument to enable API field parsing overrides.
+	(do_getline_redir, do_getline): Ditto.
+	* main.c (load_procinfo): Use new current_field_sep_str function
+	instead of switching on the return value from current_field_sep.
+
+2017-02-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (boolval): Return bool instead of int.
+	* eval.c (eval_condition): Same.
+	* io.c (pty_vs_pipe): Same
+	Thanks to Andrew Schorr for pointing these out.
+
+2017-02-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* NEWS: Document that mktime now takes an optional utc-flag argument.
+	* awkgram.y (tokentab): Modify mktime entry to indicate that it may
+	accept two arguments.
+	* builtin.c (mktime_tz): New function to run mktime in an arbitrary
+	time zone. Code was copied from the Linux timegm man page.
+	(do_mktime): Add support for new optional 2nd argument utc-flag by
+	using the new mktime_tz function.
+	(do_strftime): Change do_gmt type from int to bool.
+
+2017-02-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_typeof): Handle arguments that have
+	the NULL_FIELD flag set.
+
+2017-02-03         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkgram.y (set_profile_text): Improve code clarity by using emalloc
+	to allocate the string instead of abusing estrdup.
+
+2017-02-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (set_profile_next): Allocate an extra byte at the
+	end for the NUL in case we add a sign. Thanks to Andrew Schorr
+	for making me look at this code.
+
+	And later in the same day:
+
+	* awkgram.y (set_profile_next): Undo previous change, since estrdup
+	handles it, but updated the comments.
+
+2017-02-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (mbc_char_count): Remove spurious multiplies by
+	gawk_mb_cur_max. Thanks to Andrew Schorr for making me look
+	at this code.
+
+	Unrelated:
+
+	* awkgram.y (make_profile_number): Renamed to ...
+	(set_profile_next): New function. All calls adjusted. Also improved
+	use at MPFR number case.
+
+2017-01-28         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (inetfile): Replace strncmp with memcmp in a few places, now
+	that we are checking string length beforehand.
+
+2017-01-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (redirect_string): Check explen positive before accessing *str.
+	In lintwarn message, use explen string length. Pass length to inetfile.
+	(devopen): Pass name length to inetfile.
+	Stop assuming that remoteport is NUL-terminated.
+	(two_way_open): Pass name length to inetfile.
+	(inetfile): Stop assuming NUL string termination; add checks to avoid 
+	string overrun.
+
+2017-01-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (str_terminate_f): New helper function for terminating a string
+	NODE.
+	(str_terminate): Macro wrapper to call str_terminate_f.
+	(str_restore): New macro to restore the string.
+	* builtin.c (do_strftime): Use str_terminate and str_restore.
+	(do_dcgettext): Ditto, and remove saved_end flag since equivalent
+	to testing (t2 != NULL). Fix overrun bug in calculating result
+	length when !ENABLE_NLS.
+	(do_dcngettext, do_bindtextdomain): Use str_terminate and str_restore.
+	* interpret.h (Op_arrayfor_init, Op_indirect_func_call): Ditto.
+	* str_array.c (env_remove): Ditto.
+
+2017-01-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* interpret.h [UNFIELD]: Fix condition for assignment from
+	value with valref == 1. Fixes problems introduced at gawk 4.1.2.
+
+2017-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* interpret.h: Update copyright year.
+	* debug.c (do_run): Rework error message to ease translation.
+	Thanks to Rafael Fontenelle <rafaelff@gnome.org> and to
+	Eli Zaretskii <eliz@gnu.org>.
+
+2017-01-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* builtin.c (do_dcgettext): First argument also needs protection
+	from string overrun.
+	(do_dcngettext): Need to terminate string1 and string2 also,
+	and replace strlen(the_result), which could overrun.
+	(do_bindtextdomain): Terminate both string args, and eliminate
+	saved_end boolean which is redundant with (t2 != NULL).
+
+2017-01-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* interpret.h (Op_arrayfor_init): Protect against string overrun
+	on sorting method.
+	(Op_indirect_func_call): Terminate function name.
+
+2017-01-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* str_array.c (env_remove): Terminate string before calling unsetenv.
+
+2017-01-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* node.c (is_hex): Add a new argument pointing to the end of the string
+	so we can check for string overrun.
+	(r_force_number): Pass string end to is_hex.
+
+2017-01-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (get_numbase): Add string length argument so we can operate
+	on unterminated strings.
+	* awkgram.y: Call get_numbase with string length, and fix off-by-one
+	error in length passed to nondec2awknum: should be strlen(tokstart)-1
+	based on surrounding code.
+	* builtin.c (do_strtonum): Pass string length to get_numbase.
+	(nondec2awknum): Check string length before accessing characters.
+	* mpfr.c (force_mpnum): Pass string length to get_numbase.
+	* node.c (r_force_number): Pass string length to get_numbase.
+	(get_numbase): Add string length argument and honor it.
+
+2017-01-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* builtin.c (do_strftime): If format argument is passed, we need
+	to terminate it in case it's a field variable.
+
+2017-01-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* node.c (r_format_val): Before we free s->stptr, make sure that it
+	was malloced.
+	(wstr2str): Add comment explaining why it's safe to free n->stptr
+	without doing any checks.
+	* mpfr.c (mpg_format_val): Ditto. And no need to reset the STRCUR flag
+	that we just checked.
+
+2017-01-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (enum block_id): Remove BLOCK_INVALID, since it serves no
+	useful purpose and seems to slow things down a bit.
+	* node.c (nextfree): Remove first invalid entry.
+
+2017-01-25         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (BLOCK): Remove typedef. BLOCK was used for 2 different
+	purposes: to contain a block allocation list header, and to hold
+	each individual allocated item. This was confusing, because the "size"
+	field was set only in the header, but not in each element.
+	(struct block_header): The block header contains a pointer to the first
+	element and the element size.
+	(struct block_item): Represent a single allocated item. This contains
+	only a pointer to the next element. This reduces the minimum allocated
+	item size from 2 pointers to 1 (16 bytes to 8 bytes on x86_64).
+	(nextfree): Change array item type from BLOCK to struct block_header.
+	(getblock, freeblock): Change cast from 'BLOCK' to 'struct block_item'.
+	* node.c (nextfree): Now an array of 'struct block_header' instead of
+	BLOCK. Switch the ordering to put the next pointer before the size.
+	(more_blocks): Replace 'BLOCK' with 'struct block_item', and add
+	an assert to ensure that the allocation size is at least as large
+	as 'struct block_item', i.e. 1 pointer.
+
+2017-01-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (numtype_choose): New backend macro used to implement
+	various macros whose calculations depend on how a number is
+	actually represented. This improves readability and should give
+	a small performance improvement when not using extended precision.
+	(get_number_ui, get_number_si, get_number_d, get_number_uj, iszero):
+	Rewrite using new numtype_choose macro.
+
+2017-01-04         Arnold Robbins        <arnold@skeeve.com>
+
+	Trade space for time for programs that toggle IGNORECASE a lot.
+	Brings 25% to 39% speedup.  NODE does not actually grow in size.
+
+	* awk.h (NODE::preg): Now an array of size two.
+	[CASE]: Flag no longer needed, so removed.
+	(IGNORECASE): Change type from int to bool.
+	* awkgram.y (make_regnode): Build two copies of the compiled regexp,
+	one without ignorecase, and one with.
+	* io.c (RS_re): Array replacing RS_re_yes_case and RS_re_no_case.
+	(set_RS): Use RS_re[IGNORECASE] as appropriate. Free and recompute
+	as needed.
+	* main.c (IGNORECASE): Change type from int to bool.
+	* re.c (re_update): Simplify the code. No need to check CASE flag
+	any longer. Recompute only if text of regexp changed.
+	* symbol.c (free_bc_internal): Adjust to free both elements of
+	m_re_reg.
+
+2017-01-18         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* interpret.h (r_interpret): Increase robustness of the optimization
+	logic in Op_assign_concat -- check that the node has MALLOC set,
+	and make sure to wipe all flags other than MALLOC, STRING, STRCUR,
+	and possibly WSTRCUR. Use STFMT_UNUSED define.
+
+2017-01-15         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* interpret.h (r_interpret): Fix bug in Op_assign_concat reported
+	on Cygwin mailing list. The string concatenation optimization was
+	not updating the node correctly by setting STRING and STRCUR flags
+	and setting stfmt.
+
+2017-01-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Enhance API to support extended-precision arithmetic.
+	* awk.h (enum block_id): Add new values BLOCK_MPFR and BLOCK_MPZ.
+	(make_number_node): New inline function to reduce code duplication
+	for creating numeric nodes.
+	* gawkapi.h (gawk_api_major_version): Bump to 3.
+	(awk_number_t): New typedef to represent numbers with varying internal
+	representations.
+	(awk_value_t): For numbers, replace double with awk_number_t.
+	(num_value): Redefine.
+	(num_type, num_ptr): New defines for awk_number_t union members.
+	(gawk_api_t): Add constants for version checking: gmp_major_version,
+	gmp_minor_version, mpfr_major_version, and mpfr_minor_version.
+	Add functions api_get_mpfr and api_get_mpz to allocate memory for
+	extended-precision numbers to hand to gawk.
+	(get_mpfr_ptr, get_mpz_ptr): Helper macros to wrap api_get_mpfr and
+	api_get_mpz.
+	(make_number): Modify to populate awk_number_t correctly.
+	(make_number_mpz, make_number_mpfr): New helper functions to create
+	extended-precision numeric nodes.
+	(check_mpfr_version): New macro to check GMP/MPFR version compatibility
+	in extensions that want to support extended-precision math.
+	* gawkapi.c (getmpfr, freempfr, getmpz, freempz): New macros to
+	allocate and free memory blocks for extended-precision math.
+	(awk_value_to_node): For AWK_NUMBER values, support three different
+	kinds of internal numbers: double, mpz_t, and mpfr_t.
+	(assign_number): New helper function to convert a numeric node to
+	an awk_value_t.
+	(node_to_awk_value): Use assign_number to pass numbers properly.
+	(api_get_mpfr): Implement new api_get_mpfr hook.
+	(api_get_mpfz): Implement new api_get_mpz hook.
+	(api_impl): Add GMP & MPFR versions, api_get_mpfr, and api_get_mpz.
+	* node.c (r_make_number): Use new make_number_node inline function
+	to reduce code duplication.
+	(nextfree): Add block allocators for mpfr_t and mpz_t.
+	(more_blocks): Add an assert to protect against cases where the block
+	size is too small to hold our structure.
+	* mpfr.c (mpg_node): Use new make_number_node inline function
+	to reduce code duplication.
+
+2017-01-04         Arnold Robbins        <arnold@skeeve.com>
+
+	* config.guess, config.sub, compile, depcomp: Sync from latest
+	in GNULIB.
+
+2016-12-27         Juergen Kahrs         <Juergen.Kahrs@googlemail.com>
+
+	* CMakeLists.txt: Updated after adding support library.
+
+2016-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (GNUPG_CHECK_MPFR): Don't call on PowerPC
+	Macintosh.  C99 and the last version of MPFR that works on
+	that platform don't get along. Sigh.
+
+2016-12-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNULIB.
+	* intprops.h: New file.
+	* Makefile.am (base_sources): Add intprops.h.
+
+	Unrelated.  Import GNULIB fix for regex: fix integer-overflow
+	bug in never-used code.
+	Problem reported by Clément Pit–Claudel in:
+	http://lists.gnu.org/archive/html/emacs-devel/2016-12/msg00654.html
+	Fix by Paul Eggert  <eggert@cs.ucla.edu>:
+
+	* regex_internal.h: Include intprops.h.
+	* regexec.c (re_search_2_stub): Use it to avoid undefined
+	behavior on integer overflow.
+
+	Unrelated. Set up a support directory for externally obtained
+	support files.
+
+	* Makefile.am (base_sources, EXTRA_DIST): Edit lists.
+	(SUBDIRS): Get ordering right.
+	(LDADD): Add support/libsupport.a.
+	(DEFS): Add -I for support directory.
+	* dfa.c, dfa.h, getopt.c, getopt.h, getopt1.c, getopt_int.h,
+	intprops.h, localeinfo.c, localeinfo.h, random.c, random.h,
+	regcomp.c, regex.c, regex.h, regex_internal.c, regex_internal.h,
+	regexec.c, verify.h, xalloc.h: Moved to support.
+
+	Unrelated: Totally break binary compatibility in the API
+	after merging in API min/max changes and REGEX and STRNUM
+	support in the API:
+
+	* gawkapi.c (valtype2str): New function.
+	(node_to_awk_value): Minor simplification in a switch.
+	(api_flatten_array): Removed.
+	(api_flatten_array_typed): Use valtype2str in error message.
+	(api_impl): Reorder functions to group related ones together again.
+	* gawkapi.h (awk_valtype_t): Reorder enum values.
+	(struct gawk_api): Remove api_flatten_array field.  Reorder
+	functions to group related ones together again.
+
+2016-12-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h (api_add_ext_func): Add comment about point to
+	awk_ext_func_t not being const but gawk doesn't use it.
+	* * interpret.h (Op_ext_builtin): Simplify code, check only
+	if do_lint and ! f->suppress_lint and num_args > max_expected.
+
+2016-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h (awk_ext_func_t): Put max back before min. Restores
+	source compatibility, although there will be compile warnings
+	because of the 3rd argument for the C function being missing.
+	* interpret.h (Op_ext_builtin): Used size_t instead of int for
+	the various variables. Add a check that max expected > 0.
+
+2016-12-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	MAJOR BREAKING API CHANGE.
+
+	* awk.h (INSTRUCTION): Update extension function pointer to
+	take 3rd argument of pointer to struct awk_ext_func.
+	* gawkapi.c (api_add_ext_func): Update third arg to not be const.
+	* gawkapi.h (awk_ext_func_t): Put min before max. Add suppress_lint
+	and data pointer.
+	[gawk_api_major_version]: Update to 2.
+	[gawk_api_minor_version]: Reset to 0.
+	(api_add_ext_func): Update third arg to not be const.
+	* interpret.h (Op_ext_symbol): Revise lint check.
+
+2016-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (INSTRUCTION): Replace min_required and max_expected
+	with a pointer to the extension functions awk_ext_func_t struct.
+	* ext.c (make_builtin): Store a pointer to the extension function
+	struct into the INSTRUCTION instead of the min and max.
+	* gawkapi.h (awk_ext_func): Use size_t instead of unsigned short.
+	Put min second, which preserves source code compatibility.
+	* interpret.h (Op_ext_builtin): Use the pointer for the info
+	directly. If lint and max_expected > 0 and args > max_expected
+	print a message and set max_expected to zero so we only print once
+	per function. Remove special case of both min and max being zero.
+	(Op_ext_func): Adjust creation of the data structures.
+
+2016-12-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNULIB.
+
+2016-12-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Add API support for strnum values.
+	* gawkapi.c (awk_value_to_node): Add AWK_STRNUM.
+	(assign_string): Add a type argument so we can use this for AWK_STRING
+	or AWK_STRNUM.
+	(node_to_awk_value): When AWK_NUMBER is requested, a regex value
+	should return false, as per the header file documentation.
+	Add support for AWK_STRNUM requests. When AWK_REGEX is requested,
+	implement the cases properly instead of always returning true.
+	Fix AWK_SCALAR logic. For AWK_UNDEFINED, rewrite using a switch
+	and support AWK_STRNUM.
+	(api_sym_update): Add AWK_STRNUM.
+	(api_sym_update_scalar): Add optimized support for updating AWK_STRNUM.
+	(valid_subscript_type): Add AWK_STRNUM.
+	(api_create_value): Add AWK_STRNUM.
+	* gawkapi.h (awk_valtype_t): Add AWK_STRNUM.
+	(strnum_value): New macro.
+	(Value fetching table): Updated.
+
+2016-12-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (assign_regex): Do not call assign_string, since we
+	know that a REGEX value is not an unterminated field string.
+	* gawkapi.h (make_regex): Delete macro.
+	(make_const_regex, make_malloced_regex): Add new macros to replace
+	make_regex with necessary memory management support.
+
+2016-12-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (fixtype): Remove conditional checking if the node type
+	is Node_val. This is already covered by the assert, and if it's not
+	true, we have serious bugs.
+	* builtin.c (do_typeof): Do not treat Node_var the same way as
+	Node_val, since they are different beasts. In reality, the argument
+	to this function will never have type Node_var.
+
+2016-12-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (awk_element_t): Remove obsolete comment claiming that
+	the index will always be a string.
+	(gawk_api_t): Add new api_flatten_array_typed function and indicate
+	that api_flatten_array has been superseded.
+	(flatten_array_typed): New macro to call api_flatten_array_typed.
+	(flatten_array): Redefine using the new flatten_array_typed macro.
+	* gawkapi.c (api_flatten_array_typed): New function renamed from
+	api_flatten_array to flatten an array with the types requested by the
+	caller. Also update the comments and error messages.
+	(api_flatten_array): Now a wrapper around api_flatten_array_typed.
+	(api_impl): Add new api_flatten_array_typed hook.
+
+2016-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add minimum required and maximum expected number of arguments
+	to the API.
+
+	* awk.h (INSTRUCTION): Add new members min_required and max_expected.
+	* ext.c (make_builtin): Store values from extension function struct
+	into the INSTRUCTION.
+	* gawkapi.h (awk_ext_func): Add min_required args. Make both it and
+	max_expected_args into unsigned short to match type in INSTRUCTION.
+	* interpret.h (Op_ext_builtin): Store min_required and max_expected
+	in instructions. Add checking code and lint checks.
+	(Op_ext_func): Copy min_required and max_expected from function info.
+
+
+2016-12-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (r_make_string_type): New inline function to create strings
+	of any type, currently AWK_STRING or AWK_REGEX.
+	(r_make_string): Now a wrapper around r_make_string_type.
+	(make_regex): Convert from an inline function to a macro that
+	calls r_make_string_type.
+
+2016-11-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with fixes in GNULIB.
+
+	Unrelated:
+
+	* gawkapi.h (make_regex): New function.
+
+2016-11-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add support for typed regex variables to the API.
+
+	* awk.h (make_typed_regex): Declare function.
+	* awkgram.y (typed_regexp): Call make_typed_regex instead of
+	using inline code.
+	* gawkapi.h (AWK_REGEX): New value type.
+	(regex_value): New macro.
+	(Value fetching table): Updated.
+	* gawkapi.c (awk_value_to_node, node_to_awk_value, api_sym_update,
+	api_sym_update_scalar, valid_subscript_type, api_create_value):
+	Add support for AWK_REGEX.
+	(assign_regex): New function.
+	(api_flatten_array): Adjust comment.
+	* node.c (make_typed_regex): New function; moved code from grammar.
+
+2016-11-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove redundant flag from dfa:
+
+	* dfa.c (dfasyntax): Use RE_ICASE instead of DFA_CASE_FOLD.
+	* dfa.h (DFA_CASE_FOLD): Removed.
+	* re.c (make_regexp): Use RE_ICASE for regex and dfa. Yay!
+
+	Unrelated: Don't have to recompute syntax stuff every time
+	we compile a regexp.
+
+	* dfa.c (dfacopysyntax): New function.
+	(dfaalloc): Zero out the newly allocated memory.
+	* dfa.h (dfacopysyntax): Declare it.
+	* re.c (make_regexp): Declare two static dfaregs, one for
+	with and without ignorecase. Compute the syntax once for each,
+	then use dfacopysyntax to copy the settings when compiling
+	a regexp.
+
+2016-11-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Make gawk compile on HP-UX 11.33.
+
+	* debug.c (serialize_list): Renamed from `serialize'.
+	(unserialize_list): Renamed from `unserialize', for consistency.
+
+	Unrelated:
+
+	* dfa.c: Sync with GNULIB. Twice in one day.
+
+	Unrelated: Start improving profiling comments for switch/case.
+
+	* awkgram.y (switch_head): New production.
+
+2016-11-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNULIB.
+
+2016-11-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	General cleanup for zero termination of strings.
+
+	* array.c (do_delete): Use %.*s.
+	(value_info): Get length and use %.*s.
+	(asort_actual): Save and restore character after end.
+	* awkgram.y (split_comment): Use make_string, not make_str_node.
+	* builtin.c (do_fflush): Use %.*s.
+	(locale_category_from_argument, do_dcgettext, do_dcngettext,
+	do_bindtextdomain): Save and restore character after end.
+	* debug.c (do_info, print_array, print_subscript, do_print_var,
+	do_set_var, display, do_watch, print_watch_item, serialize_subscript,
+	do_print_f): Use %.*s.
+	* eval.c (cmp_nodes, fmt_index): Save and restore character after end.
+	* interpret.h (r_interpret): Fix computation for concatenation of
+	wide strings.
+	* io.c (is_non_fatal_redirect): Add length parameter; save and
+	restore character after last. Adjust all other declarations and calls.
+	(do_close): Save and restore character after end.
+	* mpfr.c (ieee_fmts): Adjust table indentation.
+	(do_mpfr_strtonum): Clear wide string members of the union.
+	* msg.c (err): Use %.*s.
+
+2016-11-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h [USER_INPUT]: Renamed from MAYBE_NUM.
+	* builtin.c, eval.c, field.c, int_array.c, io.c, main.c,
+	mpfr.c, node.c: Change all uses.
+
+2016-11-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Finish reworking typed regexes.
+
+	* awk.h (typed_re): Replaces tre_reg.
+	* awkgram.y (typed_regexp production): Node_val points to a regular
+	Node_regex and also has string value and length.
+	(make_regnode): Simplified back to its original form.
+	* builtin.c (call_sub, call_match, call_split_func): For REGEX,
+	get n->typed_re.
+	* field.c (do_split, do_patsplit): Ditto, for separator regexp.
+	* profile.c (pprint): Op_match_rec, handle REGEX correctly.
+	* re.c (re_update): If REGEX, get t->typed_re->re_reg.
+
+2016-11-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Start reworking typed regexes.
+
+	* awk.h (Node_typedregex): Nuked.
+	[REGEX]: New flag.
+	(tre_reg): New member in val part of NODE union.
+	(force_string, force_number, fixtype): Remove use of Node_typedregex.
+	* awkgram.y (grammar): Use REGEX flag instead of node type.
+	(valinfo); Ditto.
+	(make_regnode): Adjust creation based on node type.
+	* builtin.c (do_length, do_print, call_sub, call_match,
+	call_split_func, do_typeof): Adjust code.
+	* debug.c (watchpoint_triggered, initialize_watch_item,
+	print_memory): Adjust code.
+	* eval.c (nodetypes): Remove Node_typedregex.
+	(flags2str): Add REGEX.
+	(setup_frame): Adjust code after removal of Node_typedregex.
+	* interpret.h (r_interpret): Adjust code after removal
+	of Node_typedregex.
+	* profile.c (pp_typed_regex): Renamed from pp_strong_regex.
+	(pp_string_or_strong_regex): Renamed from pp_string_or_strong_regex.
+	(pprint): Adjust code after removal of Node_typedregex.
+	* re.c (re_update): Adjust code after removal of Node_typedregex.
+
+2016-11-04  Eli Zaretskii  <eliz@gnu.org>
+
+	* builtin.c (efwrite) [__MINGW32__]: Call w32_maybe_set_errno if
+	errno is not set or set to EINVAL.
+
+	* nonposix.h (w32_maybe_set_errno) [__MINGW32__]: Add prototype.
+
+2016-11-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* eval.c (flags2str): Add NO_EXT_SET and NUMCONSTSTR.
+
+2016-10-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix valgrind issues.
+
+	* io.c (init_awkpath): Need to allocate max_path+3 pointers.
+	* awkgram.y (make_profile_number): Need to add STRCUR flag and
+	set n->stfmt to STFMT_UNUSED. See the comment in the code.
+
+2016-10-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (init_awkpath): Set max path len for leading separator.
+
+2016-10-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (init_awkpath): Restore documented behavior whereby
+	null elements represent the current directory. Sheesh.
+	Bug reported by "Jun T." <takimoto-j@kba.biglobe.ne.jp>.
+
+	Disallow negative arguments to the bitwise functions.
+
+	* NEWS: Document this.
+	* builtin.c (do_lshift, do_rshift, do_and, do_or, do_xor, do_compl):
+	Make negative arguments a fatal error.
+	* mpfr.c (do_mpfr_compl, get_intval): Ditto.
+
+2016-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* General: Remove trailing whitespace from all relevant files.
+	* mpfr.c: Replace Unicode sequences with ASCII.
+	* cint_array.c: Ditto.
+
+2016-10-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: Typo fix in call to add_sign_to_num.
+
+2016-10-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (enum opcodeval): Add Op_unary_plus.
+	* awkgram.y (add_sign_to_num): New routine to put in a sign on
+	profiling constants.  Call it as necessary.
+	In unary plus production, use new opcode, or set up a
+	constant as for unary minus.
+	(negate_num): Call add_sign_to_num instead of doing it directly.
+	* eval.c (optypetab): Add entry for Op_unary_plus.
+	* interpret.h (r_interpret): Add case for Op_unary_plus.
+	* profile.c (pprint, prec_level, is_scalar): Ditto.
+
+2016-10-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNULIB.
+
+2016-10-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (make_profile_number): Allocate an extra byte for the
+	string, so there's room for a minus if necessary. Store '\0'
+	in the right place.
+	(negate_num): Use memmove to shift the string up and then
+	insert a minus, instead of doing a fresh alloc + copy + free.
+
+2016-10-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (NUMCONSTSTR): New flag value.
+	* awkgram.y (make_profile_number): New function. Use it
+	wherever we make a number.  This calls make_number and then, if
+	pretty printing, save the original string value and sets NUMCONSTSTR.
+	(negate_num): If NUNCONSTSTR set, update the saved string value.
+	* profile.c (pp_number): Assert NUMCONSSTR set, use that value.
+	Remove previous code.
+
+2016-09-24  Eli Zaretskii  <eliz@gnu.org>
+
+	* debug.c (restart) [__MINGW32__]: Cast 2nd argument of execvp to
+	avoid compiler warnings about prototype mismatch.  Reported by
+	Marc de Bourget <marcdebourget@gmail.com>.
+
+2016-09-09         Norihiro Tanaka      <noritnk@kcn.ne.jp>
+
+	* awk.h (struct Regexp): Remove member has_anchor.  All uses removed.
+	* re.c (make_regexp, research): Use dfa matcher for regex with anchor.
+
+2016-09-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with grep.
+
+2016-09-08  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* dfa.c, dfa.h: Sync with grep.
+	* re.c (make_regexp): Adjust to DFA API changes.
+
+2016-09-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* command.y: Update license text to version 3. Oops.
+
+2016-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* cmd.h, debug.c: Update license text to version citing
+	GPLv3+ and with correct FSF address. Thanks to
+	David Kaspar <dkaspar@redhat.com> for pointing out the need.
+
+2016-09-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with grep.
+
+2016-09-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Merge grep's now thread-safe dfa. Wheee.
+
+	* dfa.h, dfa.c: Sync with grep.
+	* localeinfo.h, localeinfo.c, verify.h: New files.
+	* Makefile.am (base_sources): Adjust.
+	* awk.h (using_utf8): Declare new function.
+	* node.c (str2wstr): Use using_utf8 instead of now-gone dfa function.
+	* re.c: Include "localeinfo.h".
+	(localeinfo): New static variable.
+	(make_regexp): Adjust call to dfa_syntax.
+	(resetup): Call init_localeinfo on localeinfo. Remove call to
+	now-gone function dfa_init.
+	(using_utf8): New function.
+
+2016-08-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (fwrite_unlocked): Check for it.
+	* awk.h (fwrite): Define to fwrite_unlocked if we have it.
+	* NEWS: Make note of speed improvement.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	POSIX now says use strcmp for == and !=. Thanks to Chet Ramey
+	for pointing me at the change.  Make it so:
+
+	* awk.h (cmp_nodes): New 3rd param indicating strcmp, not strcoll.
+	* debug.c (cmp_val): Update call to cmp_nodes.
+	* eval.c (cmp_nodes): New 3rd param indicating strcmp, not strcoll.
+	Adjust code and all callers.
+	(scalar_cmp_t): New enum type. Used in ...
+	(cmp_scalars): ... in order to call cmp_nodes correctly.
+	* interpret.h: Use the enum type in calls to cmp_scalars.
+	* re.c (re_update): Adjust call to cmp_nodes.
+
+2016-08-25         Norihiro Tanaka      <noritnk@kcn.ne.jp>
+
+	* awk.h (struct Regexp): Remove dfa.  Now dfareg instead of it.  All
+	referers changed.
+	* re.c (research): Arrange caller of dfaexec and research.
+	* (avoid_dfa): Removed.  All callers changed.
+	* awk.h (avoid_dfa): Removed.
+
+	Other changes by Arnold Robbins:
+
+	* awk.h (struct Regexp): Change various boolean members to bool.
+	(RE_NO_FLAGS): New #define.
+	* interpret.h: Use RE_NO_FLAGS instead of zero.
+	* re.c (research): Prettify the logic a little bit.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with grep.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.h: Sync with grep. API changes.
+	* dfa.c: Sync with grep.
+	* re.c (make_regexp): Adjust for API changes, move call to dfasyntax
+	into stanza that compiles the regex.
+	(resetup): Call dfa_init.
+	* node.c (str2wstr): using_utf8 is now called dfa_using_utf8.
+
+	Unrelated:
+
+	* Makefile.am: Quote all uses of $(srcdir) and $(distdir).
+	(spell): New target.
+
+2016-08-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with grep.
+
+2016-08-15         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* int_array.c (is_integer): Fix merge of stable changes to remove
+	obsolete string formatting check that has been superseded by
+	the new standard_integer_string check.
+
+2016-08-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* re.c (make_regexp): Only call dfasyntax if actually using
+	dfa. Gives a 14% speedup on this test: https://raw.githubusercontent.com/chadbrewbaker/awka/master/benchmark/regexp.awk.
+	From blathering in comp.lang.awk.
+
+2016-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+	Unrelated:
+
+	* int_array.c: Minor text and formatting edits.
+
+2016-08-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h: Add a comment explaining the NUMINT flag in more detail.
+	* int_array.c (standard_integer_string): New function to test whether
+	a string matches what would be produced by sprintf("%ld", <value>).
+	(is_integer): Fix bug -- if NUMBER was set, then the function was
+	accepting strnum values with nonstandard string representations. We
+	now call standard_integer_string to check that the string looks OK.
+	Also added ifdef'ed code to simplify the function by relying upon
+	force_number to parse the string, but this is disabled due to possible
+	negative performance impact.
+
+2016-08-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove typed regexes until they can be done properly.
+
+	* NEWS: Updated.
+	* awk.h (enum nodevals): Remove Node_typedregex.
+	(force_string, force_number): Remove check for Node_typedregex.
+	* awkgram.y (TYPED_REGEXP): Remove token.
+	(grammar): Remove productions related to typed regexps. 
+	(yylex): Don't find a typed regex or return it.
+	(valinfo): Remove code for Node_typedregex.
+	* builtin.c (do_length, do_print, call_sub, call_match,
+	call_split_func, do_typeof): Remove code for Node_typedregex.
+	* debug.c (watchpoint_triggered, print_memory): Remove code
+	for Node_typedregex.
+	* eval.c (nodetypes, setup_frame): Remove code for Node_typedregex.
+	* interpret.h (r_interpret): Remove code for Node_typedregex.
+	* profile.c (pprint): Remove code for Node_typedregex.
+	(pp_strong_regex): Removed.
+	(pp_string_or_strong_regex): Remove code for Node_typedregex.
+	* re.c (re_update): Remove code for Node_typedregex.
+
+2016-08-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README, NEWS: Mark DJGPP port as unsupported.
+
+2016-08-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* mpfr.c (mpg_tofloat): Always set precision to avoid hysteresis effects
+	from previous calculations using the same temporary mpfr variables.
+
+2016-08-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* mpfr.c (default_prec): Add new static variable to show current PREC
+	setting in effect.
+	(init_mpfr, set_PREC): Save mpfr_set_default_prec argument in
+	default_prec.
+	(do_mpfr_func): If the argument's precision exceeds the default
+	precision, boost the result's precision to match it. This fixes a
+	bug where we used to copy the argument's precision, regardless of
+	whether it was higher or lower than the PREC setting.
+
+2016-07-24         Norihiro Tanaka      <noritnk@kcn.ne.jp>
+
+	* re.c (research): Now that the dfa matcher correctly runs even
+	in multibyte locales, try it if even if need_start is true.
+	However, if start > 0, avoid dfa matcher, since it can't handle
+	the case where the search starts in the middle of a string.
+
+	Unrelated:
+
+	* eval.c (load_casetable): Reset casetable[i] to `i' if i
+	should not be mapped to upper case. Fixes inconsistencies between
+	dfa and regex in some single bytes locales; notably el_GR.iso88597.
+
+2016-07-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Make result of close on a pipe match result of system.
+	Thanks to Mike Brennan for the encouragement.
+
+	* awk.h (sanitize_exit_status): Declare routine.
+	* builtin.c (sanitize_exit_status): New routine.
+	(do_system): Use it.
+	* io.c (close_rp): Use it on pclose result.
+	(gawk_pclose): Use it.
+
+2016-07-23         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* builtin.c (do_print): Improve logic for formatting
+	numeric values.
+
+2016-07-19         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* eval.c (set_LINT): Simplify the code considerably.
+
+2016-07-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (shadow_funcs): Change test at end to be
+	`lintfunc == r_fatal' instead of `lintfunc != warning'.
+	Thank to Andrew Schorr for the suggestion.
+
+2016-07-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (locale_dir): New variable, init to LOCALEDIR (set by
+	configure).
+	(set_locale_stuff): Move calls to bindtextdomain and
+	textdomain to here; they must be done after calling setlocale.
+	Use locale_dir instead of LOCALEDIR.
+	(main): Move call to set_locale_stuff() to before parsing arguments.
+	Check for GAWK_LOCALE_DIR env var and use it if there. If doing
+	locale debugging, call set_locale_stuff again if arg parsing changed
+	the locale.
+
+	Unrelated:
+
+	* dfa.c: Sync with GNU grep.
+
+	Unrelated:
+
+	* config.sub: Updated from GNULIB.
+
+2016-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* eval.c (set_LINT): Reset lintfunc to `warning' for LINT="invalid".
+	Thanks to Andy Schorr for the report.
+
+2016-07-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h: Restore previous comment about unterminated strings, since
+	I am removing the string termination patches from field.c
+	(free_api_string_copies): Declare new gawkapi function.
+	* builtin.c (do_mktime, do_system): Restore temporary string
+	termination to protect against unterminated field values.
+	(nondec2awknum): Remove comment about unnecessary termination.
+	* eval.c (posix_compare): Restore temporary string termination.
+	* field.c (databuf): Remove struct, no longer needed.
+	(set_field): Remove memcpy for string termination, since we will support
+	unterminated field string values.
+	(rebuild_record): Ditto. Also no need to allocate space for terminated
+	string copies.
+	(allocate_databuf): Remove function, since memory management can again
+	be done inside set_record.
+	(set_record): Restore inline buffer management logic.
+	(reset_record): Remove calls to allocate_databuf, since we no longer
+	need space for making terminated copies of field strings.
+	* gawkapi.c (free_api_string_copies): New function to free strings
+	that we made to provide terminated copies to API functions.
+	(assign_string): New function to convert a string to an awk_value,
+	making sure to copy it if we need to terminate it.
+	(node_to_awk_value): Use assign_string to return string values with
+	NUL termination protection.
+	* int_array.c (is_integer): Restore temporary string termination.
+	* interpret.h (Op_push_i): Ditto.
+	(Op_ext_builtin): After external function returns, call
+	free_api_string_copies to free temporary string copies.
+	* mpfr.c (force_mpnum): Restore temporary string termination.
+	* node.c (r_force_number, get_ieee_magic_val): Ditto.
+
+2016-07-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+	Unrelated:
+
+	* builtin.c (do_print): Coding style change.  (This change obsoleted
+	by earlier changes in the fixtype branch.)
+
+2016-07-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h: Modify comments to indicate that MAYBE_NUM will now be
+	left enabled to indicate strnum values by the NUMBER|MAYBE_NUM
+	combination, whereas STRING|MAYBE_NUM indicates a potential strnum.
+	(fixtype): Modify MAYBE_NUM test to avoid calling force_number if
+	NUMCUR is already set.
+	* builtin.c (do_typeof): Call fixtype to resolve argument type.
+	This forces parsing of numeric strings, so there's a performance
+	penalty, but we must do this to give a correct result. The meaning
+	of "strnum" changes from "potential strnum" to "actual strnum".
+	* eval.c (set_TEXTDOMAIN): Remove some dead code left over from last
+	patch.
+	* int_array.c (is_integer): When a MAYBE_NUM is converted successfully
+	to a NUMBER, leave the MAYBE_NUM flag enabled.
+	* mpfr.c (mpg_force_number): Ditto.
+	* node.c (r_force_number): Ditto.
+
+2016-07-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h: Modify stptr comment to indicate that all strings are now
+	NUL-terminated.
+	* builtin.c (do_mktime): Remove unnecessary logic to terminate
+	the string with '\0' temporarily.
+	(do_system) Ditto.
+	(nondec2awknum): Add a comment about termination.
+	* eval.c (posix_compare): Remove logic to terminate strings temporarily.
+	(set_ORS): No need to terminate ORS, since the string node is already
+	terminated. What gave us the right to modify that node anyway?
+	(fmt_index): Remove code to terminate string. This seems to have been
+	invalid anyway, since we don't own that memory.
+	(set_TEXTDOMAIN): Do not terminate TEXTDOMAIN string, since the node
+	is already terminated. We didn't have the right to modify that node
+	anyway.
+	* gawkapi.c (node_to_awk_value): Add assert checks to confirm that the
+	string is NUL-terminated.
+	* gawkapi.h: Modify awk_string comment to indicate that strings are
+	always terminated with '\0'.
+	* int_array.c (isinteger): Remove unnecessary logic to terminate string
+	with '\0' temporarily.
+	* interpret.h (Op_push_i): Ditto.
+	* io.c (nextfile): Remove string termination. We didn't own that memory
+	anyway.
+	* mpfr.c (force_mpnum): Remove unnecessary logic to terminate the
+	string with '\0' temporarily.
+	* node.c (r_force_number): Remove NUL termination around strtod call,
+	since we already know that there is either a white space or '\0'
+	character there. Either one will stop strtod.
+	(get_ieee_magic_val): Ditto.
+	* profile.c (pp_number): No need to terminate string returned by
+	r_format_val.
+
+2016-07-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* interpret.h (Op_field_spec): Now that all $n field values are
+	NUL-terminated, there is no reason to call dupnode for $n where n > 0.
+	This saves malloc and copying overhead, thereby more than offsetting the
+	performance hit of the additional copying and NUL-termination in the
+	last patch to field.c. It also eliminates repeated parsing in cases
+	where $n, for n > 1, was accessed more than once in a numeric context,
+	so the new approach should be a performance win.
+
+2016-07-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Make sure that all field values, and therefore all strings inside gawk,
+	are terminated with a '\0' character!
+
+	* field.c (databuf): New static struct to hold info about our buffer to
+	contain the field string values.
+	(allocate_databuf): New function to make sure the databuf is large
+	enough to hold $0 and copies of $1 through $NF.
+	(set_field): Copy $n into free space previously allocated in databuf
+	and add a '\0' at the end.
+	(rebuild_record): Call allocate_databuf to ensure sufficient space
+	for copying non-malloced field values. When copying field values,
+	use databuf to create a NUL-terminated copy.
+	(purge_record): New function extracted from reset_record to initialize
+	$1 through $NF to null values.
+	(set_record): Buffer management moved to new allocate_databuf function.
+	Call purge_record instead of reset_record, since reset_record contains
+	some extra logic not needed in this case.
+	(reset_record): Call purge_record to do most of the work, and call
+	allocate_databuf to make sure we have a big enough buffer to contain
+	copies of the $1 through $NF.
+
+2016-07-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h: Renumber flags to remove gap created when FIELD was removed.
+
+2016-07-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* field.c (rebuild_record): Need to set MALLOC flag if we allocate
+	memory for a residual field node with valref > 1.
+
+2016-07-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* field.c (rebuild_record): Do not bother to create new field nodes
+	to replace malloc'ed nodes when rebuilding $0.
+
+2016-07-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (FIELD): Remove unnecessary flag.
+	(MALLOC): Move definition to join the others, and improve the comment.
+	* array.c (value_info): Replace FIELD test with MALLOC test.
+	* eval.c (flags2str): Remove FIELD flag.
+	* field.c (init_fields): Remove FIELD bit from Null_field->flags.
+	(set_field): Remove FIELD bit from flags.
+	(rebuild_record): Test against MALLOC instead of FIELD. If a field
+	node has valref > 1, we should make a copy, although I don't think
+	it is valid for this to happen.
+	(set_record): Remove FIELD bit from flags.
+	* interpret.h (UNFIELD): Add comment, and test MALLOC flag instead of
+	FIELD. Remove probably buggy code to disable the FIELD flag when
+	valref is 1; that would have created a node where neither the FIELD
+	nor MALLOC flag was set, which seems invalid.
+	* node.c (r_dupnode): Remove code disabling FIELD flag.
+
+2016-07-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (force_string_fmt): New inline function to get the string
+	representation in a requested format.
+	(force_string): Reimplement as a macro using force_string_fmt function.
+	(force_string_ofmt): New macro to get a value's OFMT representation.
+	* builtin.c (do_print): Use new force_string_ofmt macro instead of
+	duplicating the logic inline.
+
+2016-07-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* str_array.c (str_lookup): There is no need to worry about the
+	MAYBE_NUM flag, since the code has been patched to make sure to
+	preserve the string value of strnum values, and the integer array
+	code should no longer mistakenly claim a strnum integer with a
+	nonstandard string representation.
+
+2016-07-03         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* field.c (rebuild_record): Revert warning message regarding flags,
+	since I'm not yet totally confident that it is invalid to have FIELD
+	and MALLOC set at the same time.
+
+2016-07-03         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* field.c (rebuild_record): Do not turn off the STRING flag when
+	copying a FIELD node, and issue a warning if MALLOC is enabled.
+
+2016-07-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* array.c (value_info): Print something reasonable when stfmt
+	is -1.
+	* mpfr.c (mpg_format_val): Don't cast index to char.
+	* node.c (r_format_val): Ditto.
+	Thanks to Andrew Schorr for pointing these out.
+
+	Unrelated:
+
+	* gawkapi.c (api_warning): Fix the comment header.
+	(api_lintwarn): Factor out the call to va_end to after the if.
+
+	Unrelated:
+
+	* symbol.c (get_symbols): Add FUNCTAB and SYMTAB to the list
+	for the -d option.
+	* awkgram.y (dump_vars): Allow "-" to mean print to stdout.
+	Thanks to Hermann Peifer for the reports.
+
+2016-06-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* node.c (r_force_number): Coding style change.
+
+2016-06-30         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (STFMT_UNUSED): New define indicating that the string
+	representation does not depend on CONVFMT or OFMT.
+	(force_string): Use STFMT_UNUSED to improve code clarity.
+	* array.c (value_info): Fix stfmt logic.
+	* builtin.c (do_print): Use STFMT_UNUSED to improve code clarity.
+	* field.c (set_record): Ditto.
+	* gawkapi.c (api_sym_update_scalar): Ditto.
+	* int_array.c (is_integer): Check stfmt equals STFMT_UNUSED before
+	bothering to inspect the string.
+	* mpfr.c (mpg_format_val): Use STFMT_UNUSED to improve code clarity.
+	Remove buggy cast to char in stfmt assignment.
+	* node.c (r_format_val): Ditto.
+	* str_array.c (str_lookup): Use STFMT_UNUSED to improve code clarity.
+	* symbol.c (check_param_names): Ditto.
+
+2016-06-29         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* node.c (r_force_number): Optimize by trimming leading and trailing
+	white space before we inspect the string contents.
+	(get_ieee_magic_val): Must terminate the string with '\0' before
+	calling strtod.
+
+2016-06-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (awk_string): Add comment about the potential lack of
+	NUL-termination.
+
+2016-06-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h: Add a comment regarding the potential lack of NUL-termination
+	for Node_val strings.
+
+2016-06-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* node.c (r_format_val): Do not free stptr unless STRCUR is set.
+	This is safer than testing for non-NULL stptr, since, for example,
+	pp_number copies a node and calls r_format_val, but does not bother
+	to set stptr to NULL beforehand.
+
+2016-06-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* node.c (r_force_number): When checking for trailing spaces, protect
+	against running off the end of the string.
+	* mpfr.c (force_mpnum): Ditto.
+
+2016-06-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* builtin.c (do_print): There's actually no reason to test whether a
+	value is a number, since the STRCUR flag and stfmt value contain all
+	the necessary info, as in awk.h:force_string.
+
+2016-06-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* builtin.c (do_print): Do not use OFMT to print strnum values. We
+	accomplish this by calling format_val for a NUMBER only
+	if there is no string currently available, or if stfmt equals
+	neither -1 nor OFMTidx.
+
+2016-06-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h: Edit some comments. Add others. Minor coding style changes.
+	* builtin.c (format_tree): Restore a comment.
+	(do_mktime): Restore saving/restoring of byte after format string.
+	(do_sub): Coding style. Use %.*s in warning message.
+	(nondec2awknum): Restore saving/restoring of byte after string value
+	being converted.
+	* eval.c: Minor coding style edits.
+	* int_array.c (is_integer): Fix order of checks for not
+	updating string value: check length == 0 before testing values.
+	Coding style edits.
+	* mpfr.c (do_mpfr_strtonum): Coding style edits.
+	* node.c (r_force_number): Restore saving/restoring of byte after
+	string value being converted. Edit comments some.
+
+2016-06-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Repair change of 2015-08-25 to handling of MAYBE_NUM.
+	* mpfr.c (mpg_force_number): Just clear MAYBE_NUM.
+	* node.c (r_force_number): Clear STRING separately after
+	setting NUMBER.
+
+	Thanks to Andrew Schorr for reporting the problem.
+	A test case will eventually be merged into master.
+
+	Only in stable and master.
+
+2016-06-20         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* builtin.c (do_strftime): Call fixtype before checking flags for
+	STRING type.
+	(do_print): Call fixtype before checking whether argument is a NUMBER.
+	* eval.c (set_BINMODE): Call fixtype before checking value type.
+	No need to call force_number if the flags say it's a number.
+	(r_get_field): Fix lint check for non-numeric argument.
+	* io.c (redirect): Call fixtype before checking whether it's a string.
+
+2016-06-18         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* node.c (r_force_number): Fix typo in comment.
+
+2016-06-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h: Add comment headers for several functions.
+	* builtin.c (nondec2awknum): Actually set a '\0' before
+	calling to strtod() so that the save and restore do something.
+
+2016-06-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Update from GNULIB.
+
+2016-06-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (boolval): New inline function to standardize testing whether
+	a node's value is true.
+	* builtin.c (do_strftime): Use boolval to handle 3rd argument.
+	* eval.c (set_IGNORECASE, eval_condition): Use new boolval function.
+	* io.c (pty_vs_pipe): Use new boolval function.
+
+2016-06-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* builtin.c (do_strftime): Fix handling of 3rd argument to work
+	as a standard boolean: non-null or non-zero.
+
+2016-06-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (node_to_awk_value): When caller requests AWK_SCALAR
+	or AWK_UNDEFINED, we need to call fixtype before we check the type.
+
+2016-06-13         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkgram.y: Eliminate STRCUR tests. Must use STRING to test whether
+	a scalar is a string.
+
+2016-06-12         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+	
+	* awk.h: Improve comment about STRING and NUMBER type assignment.
+	(nondec2awknum): Add endptr argument.
+	(fixtype): New inline function to clarify a scalar's type.
+	* array.c (sort_up_value_type): Call fixtype before checking the value
+	types.
+	* awkgram.y (yylex): Pass NULL endptr argument to nondec2awknum.
+	(valinfo): Remove dead tests: either STRING or NUMBER or both
+	must be set, so there's no reason to continue with checks for NUMCUR or
+	STRCUR.
+	* builtin.c (do_exp, do_int, do_log, do_sqrt, do_sin, do_cos, do_srand):
+	Fix lint check for non-numeric argument.
+	(do_string): Fix lint check for 1st and 2nd args being strings.
+	(do_length): Fix assert to allow for Node_typedregex.
+	Fix lint check for non-string argument.
+	(format_tree): Fix type detection for '%c' arguments.
+	(do_strftime): Fix lint check for non-numeric 2nd argument and
+	lint check for non-string 1st argument.
+	(do_mktime): Fix lint check for non-string argument. Eliminate useless
+	logic to save and restore terminating NUL.
+	(do_system, do_tolower, do_toupper): Fix lint check for non-string
+	argument.
+	(do_atan2, do_lshift, do_rshift, do_and, do_or, do_xor, do_compl,
+	do_intdiv): Fix lint checks for non-numeric args.
+	(do_sub): Attempt to clean up treatment of 3rd argument to gensub
+	despite vague documentation of expected behavior.
+	(do_strnum): Fix bug in number detection logic, and pass new endptr
+	arg to nondec2awknum.
+	(nondec2awknum): Add endptr argument so caller can detect how much
+	of the string was consumed. Eliminate unnecessary logic to save
+	and restore terminating NUL char.
+	(do_typeof): Use a switch to specify which cases are supported, and
+	issue a warning message when a corrupt type is detected.
+	* debug.c (print_memory): At least one of NUMBER and STRING should
+	be set, so no need to check for NUMCUR or STRCUR in addition.
+	* eval.c (cmp_nodes): Use fixtype function to fix arg types.
+	(set_IGNORECASE): Fix logic for acting on value type. Note that
+	setting IGNORECASE to a string value of "0" with NUMCUR set now enables
+	ignorecase, so that's a subtle change in behavior that seems to match
+	the docs.
+	(set_LINT): Try to clean up configuration logic based on type.
+	* ext.c (get_argument): Remove unused variable pcount.
+	* gawkapi.c (node_to_awk_value): Remove pointless test for NUMCUR
+	after calling force_number. Similarly, no need to test for STRCUR
+	after calling force_string.
+	* int_array.c (is_integer): Reject cases where a string value is
+	present that will not be correctly regenerated from the integer;
+	in particular, this could happen where blank space padding is present,
+	leading zeroes are present, or for hex or octal values.
+	Also fix some bugs where a strnum was converted to a NUMBER without
+	turning off the STRING bit.
+	* io.c (redirect_string): Make lint warning message more accurate.
+	(redirect): Change not_string test to use STRING bit, not STRCUR.
+	(pty_vs_pipe): Use fixtype to correct logic for detecting whether a
+	value is anumber.
+	* mpfr.c (mpg_force_number): If NUMCUR is set, there's no need to
+	test is_mpg_number. If it's not, the NODE is corrupt and we've got
+	bigger problems. Fix flag manipulation logic. Always set NUMCUR and
+	clear MAYBE_NUM, 
+	(set_PREC): Fix logic using fixtype function.
+	(do_mpfr_atan2, do_mpfr_intdiv): Fix lint check for non-numeric
+	arguments.
+	(do_mpfr_func, do_mpfr_int, do_mpfr_compl, get_intval, do_mpfr_srand):
+	Fix lint check for non-numeric argument.
+	(do_mpfr_strtonum): Use fixtype and stop testing for NUMCUR bit.
+	* node.c (r_force_number): Eliminate pointless save and restore of
+	terminating NUL char. Always set NUMCUR and clear MAYBE_NUM, and
+	convert STRING to NUMBER if appropriate, fixing bugs in flag
+	manipulations. For non-decimal data, need to consider whether there
+	is trailing non-numeric data in deciding whether a MAYBE_NUM should
+	be converted to a NUMBER, so take advantage of new endptr arg
+	to nondec2awknum.
+
+2016-06-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_sub): Fix sub for long runs of backslashes.
+	Thanks to Mike Brennan for the report.
+	
+	Unrelated:
+	* ext.c (get_argument): Remove unused variable pcount.
+
+2016-06-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Get latest from Gnulib master.
+	* main.c (UPDATE_YEAR): Bump to 2016.
+
+2016-06-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+	Unrelated:
+
+	* configure.ac: Move AM_CONDITIONAL[ENABLE_EXTENSIONS] outside
+	the enclosing if. Thanks to Assaf Gordon <assafgordon@gmail.com>
+	for the report.
+
+2016-06-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symbol.c (lookup): If got Node_val, it's a non-variable
+	in SYMTAB, return NULL. Can affect watchpoints in the debugger,
+	maybe other places. Thanks to Hermann Peifer for the
+	test case and report.
+
+2016-06-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2016-06-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nonposix.h (getpgrp): Wrap declaration in ifdef so it doesn't
+	mess things up on POSIX systems (like Solaris). Thanks to
+	Nelson Beebe for the report.
+	* node.c (is_hex): New function to check for 0x preceded by
+	optional sign.
+	(r_force_number): Use it. Thanks to Mike Brennan for the report.
+
+2016-05-30         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (awk_ext_func_t): Rename num_expected_args to
+	max_expected_args, and explain in the comment that it doesn't really
+	matter.
+	* ext.c (make_builtin): Replace num_expected_args with
+	max_expected_args.
+	(get_argument): Do not check whether the argument number exceeds
+	the maximum expected by the function.
+
+2016-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (arg_assign): Fully bracket ifdefs around call
+	to force_number. Thanks to Andrew Schorr for pointing out
+	that force_number was called only if LC_NUMERIC was defined.
+	
+	Lots of files: Update copyright date.
+
+	* field.c (set_FS): Handle FS = "\0" if RS = "". Thanks to
+	Janis Papanagnou for the report.
+
+	* getopt.c, getopt.h, getopt1.c, getopt_int.h: Sync with GLIBC.
+
+2016-05-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (get_actual_argument): Remove unused "optional" argument.
+	(get_scalar_argument, get_array_argument): Change macro definition to
+	remove 3rd "optional" argument.
+	* ext.c (get_actual_argument): Remove unused "optional" argument.
+	* gawkapi.c (api_get_argument, api_set_argument): Remove unused final
+	argument to get_array_argument and get_scalar_argument.
+
+2016-05-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h [fatal]: Make parentheses and use of indirection
+	consistent with warning and lintwarn. Thanks to Andrew Schorr
+	for pointing this out.
+	* str_array.c (str_lookup): Move test for MAYBE_NUM to where
+	we duplicate the subscript. Removing it across the board is
+	wrong if there are multiple references to the value. Thanks
+	to Andrew Schorr for discussion and test case.
+
+2016-05-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (get_actual_argument): Add an initial argument containing 
+	the (NODE *) previously returned by get_argument. This allows us to
+	eliminate a call to get_argument from inside get_actual_argument.
+	(get_scalar_argument, get_array_argument): Change macro definition to
+	add an initial node argument to pass through to get_actual_argument.
+	* ext.c (get_actual_argument): Add initial (NODE *) argument to contain
+	the value previously returned by get_argument. This allows us to
+	avoid repeating the call to get_argument. We can also eliminate the
+	check for a NULL value, since the caller did that already.
+	* gawkapi.c (api_get_argument): Pass (NODE *) returned by get_argument
+	to get_array_argument and get_scalar_argument.
+	(api_set_argument): Pass (NODE *) returned by get_argument to
+	get_array_argument.
+
+2016-05-25         Manuel Collado        <mcollado2011@gmail.com>.
+
+	* gawkapi.c (api_nonfatal): New function.
+	(api_impl): Include it.
+	* gawkapi.h (struct gawk_api): Add api_nonfatal member.
+	(nonfatal): New macro.
+
+2016-05-12         Arnold Robbins       <arnold@skeeve.com>
+
+	* str_array.c (str_lookup): Remove MAYBE_NUM from subscript flags.
+	Bug reported by Andres Legarra <Andres.Legarra@toulouse.inra.fr>.
+
+	Unrelated: Fix issues with SIGPIPE. Reported by
+	Ian Jackson <ijackson@chiark.greenend.org.uk>.
+
+	* builtin.c (do_system): Reset/restore SIGPIPE to/from default around
+	call to system.
+	* io.c (redirect, gawk_popen [PIPES_SIMULATED]): Same.
+
+2016-05-12  Eli Zaretskii  <eliz@gnu.org>
+
+	* nonposix.h: Add prototypes for POSIX functions emulated in pc/*
+	files.
+
+2016-05-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* interpret.h (r_interpret): Op_ext_builtin. No need to test whether
+	op == Op_ext_builtin, since we wouldn't be here otherwise.
+
+2016-05-03         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* builtin.c (format_tree): Do not waste a byte at the end of a string.
+
+2016-05-03         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* builtin.c (format_tree): After the string has been rendered, use
+	realloc to shrink the buffer to the needed size. Otherwise, the minimum
+	buffer size of 512 bytes can result in lots of wasted memory if many
+	sprintf results are stored in an array.
+
+2016-05-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (gawk_api_major_version, gawk_api_minor_version): Add
+	CPP #define values to support conditional compilation.
+
+2016-05-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Sync with grep.
+	* re.c (research): Adjust type of try_backref.
+
+2016-05-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (success_node): Declare.
+	* array.c (success_node): Define.
+	* cint_array.c, int_array.c, str_array.c: Use `& success_node'
+	instead of `(NODE **) ! NULL' to indicate success throughout.
+	Thanks to Pat Rankin for the cleanup suggestion.
+
+2016-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (set_RS): Use rs1scan if do_traditional, even if length
+	of RS is > 1.  Bug reported by Glauco Ciullini
+	<glauco.ciullini6245@gmail.com>.
+
+2016-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2016-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regex_internal.c: Replace _GL_ATTRIBUTE_PURE with
+	__attribute__.
+
+2016-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regexec.c: Stamp out last remaining use of __attribute.
+	* regcomp.c: Undo change of 2016-01-24 when parsing single-byte
+	ranges. Go back to treating them as bytes and not as characters.
+	The change broke things on Windows in non-UTF-8 character sets.
+	* mbsupport.h (mbstate_t): Define to int.
+	Update copyright.
+
+2016-04-10         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* regex_internal.c: Use _GL_ATTRIBUTE_PURE macro
+
+2016-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (two_way_close_type): Move here from io.c.
+	(close_rp): Add declaration.
+	* builtin.c (do_printf): Call close_rp before fatal message when
+	attempting to write the closed write end of a two way pipe.
+	(do_print): Ditto.
+	(do_print_rec): Ditto.
+	* io.c (do_getline_redir): Same, for reading closed read end.
+	(close_rp): Make not static.
+
+2016-04-07  Eli Zaretskii  <eliz@gnu.org>
+
+	* nonposix.h (WEXITSTATUS, WIFEXITED, WIFSIGNALED, WTERMSIG)
+	(WIFSTOPPED, WSTOPSIG) [__MINGW32__]: New macros to replace the
+	missing header sys/wait.h.
+	(w32_status_to_termsig): Add prototype.
+
+	* builtin.c (do_system) [__MINGW32__]: Compute the exit status of
+	'system' differently under --traditional, as the low 8 bits are
+	the most interesting.
+
+2016-04-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_printf): Allow a write to the closed write-end of
+	a two-way pipe to be nonfatal if NONFATAL is set for it.
+	(do_print): Ditto.
+	(do_print_rec): Ditto.
+	* io.c (do_getline_redir): Same thing for reading from a closed
+	read end of a two-way pipe. Fatal error.
+
+2016-04-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_fflush): Add warning for flush to two-way
+	pipe where write end was closed.
+	* io.c (flush_io): Add some braces for the for loop.
+
+2016-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_printf): If the redirection is two way but the
+	fp is NULL, it means we're writing to the closed write-end of
+	a two-way pipe. Issue a fatal error message.
+	(do_print): Ditto.
+	(do_print_rec): Ditto.
+	* io.c (do_getline_redir): Same thing for reading from a closed
+	read end of a two-way pipe. Fatal error.
+	* NEWS: Updated.
+
+2016-03-27         Stephen Davies        <sdavies@sdc.com.au>
+
+	* awkgram.y (get_comment): Strip CRs from comment. Strip
+	off trailing newlines.
+
+2016-03-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pprint): Improve handling of comment after
+	and if statement without an else.
+
+2016-03-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Considerable improvements to handling of comments when pretty
+	printing, particularly for end-of-line comments.
+
+	* awkgram.y (prior_comment, comment_to_save): New variables.
+	(add_pending_comment): New function.
+	(grammar): Jump through lots more hoops to capture comments.
+	Due to shift-reduce parsing, there can be up to two comments
+	captured and waiting to be saved; be sure to get them both and
+	at the right times.  This is difficult since comments have no
+	real syntactic existence. Call add_pending_comment on most of
+	the simple statements.
+	(get_comment): Save a pre-existing comment in prior_comment.
+	(split_comment): Use comment_to_save instead of `comment'.
+	* profile.c (end_line): Change to return the instruction after
+	the comment that gets printed; adjust return type.
+	(pprint): Add skip_comment static variable. Adjust logic for
+	skipping an end-of-line comment; only do it if skip_comment is
+	true. This is set to true in places where we can't use the
+	return value from end_line().  Call end_line() in many more places.
+	(pp_func): Handle end-of-line comments after a function header.
+
+2016-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (print_instruction): For Op_comment, improve notation as
+	to whether it's a full comment or an end of line comment.
+
+2016-03-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (socketopen): For SOCK_DGRAM, set read_len to sizeof
+	remote_addr. Makes UDP more or less work again.
+	Thanks to Juergen Kahrs for the fix.
+
+2016-03-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (print_instruction): Normalize printing of comment dump.
+
+2016-03-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_system): Further improvements. Catch core dump
+	flag.
+
+2016-03-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_system): Improve return values of system().
+
+2016-03-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (print_instruction): Fix duplicate case not caught
+	by TinyCC. Grrr.
+
+2016-03-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (print_instruction): Further improvements in
+	instruction dump, especially for when pretty-printing.
+	* builtin.c (do_system): Augment the logic for the return
+	value so that death-by-signal info is available too.
+
+2016-03-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pp_list): Unconditionally compute delimlen. Avoids
+	compiler warning.
+
+2016-03-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (print_instruction): Improvements in instruction dump
+	for if and else.
+
+2016-03-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (print_instruction): For Op_comment, add notation as
+	to whether it's a full comment or an end of line comment.
+
+2016-02-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pp_list): Handle the case of nargs equal to zero.
+	Thanks to Hermann Peifer for the report.
+
+2016-02-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pprint): Fix copy-paste error in else handling.
+	Thanks to Michal Jaegermann for the report.
+
+2016-02-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.rpath, config.sub: Update to latest
+	from GNULIB.
+
+2016-02-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Update full list of infrastructure tools.
+
+2016-02-22        gettextize             <bug-gnu-gettext@gnu.org>
+
+	* configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.19.7.
+
+2016-02-21         Nelson H.F. Beebe     <beebe@math.utah.edu>
+
+	* random.c [SHUFFLE_BITS, SHUFFLE_MAX, SHUFFLE_MASK]: New macros.
+	(shuffle_init, shuffle_buffer): New static variables.
+	(random_old): Renamed from random.
+	(random): New function wrapping random_old and providing a
+	shuffle buffer to increase the period. See the literature citations
+	and other notes in the code.
+
+2016-02-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regexec.c (prune_impossible_nodes): Remove attribute that
+	keeps it from compiling with 32 bit GCC. Who the heck knows
+	why or how. Sigh. Double sigh.
+
+2016-02-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c, regex.c, regex.h, regex_internal.c, regex_internal.h,
+	regexec.c: Sync with GLIBC, mostly prototype changes.
+
+2016-02-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix profile / pretty-printing to chain else-ifs.
+
+	* profile.c (pprint): Change third argument into a set of flags
+	for in the for header or in an else if. Adjust case Op_K_else to
+	make the right checks and format the code properly. In Op_K_if
+	clear the flag so that any following else gets indented properly.
+	Adjust all calls.
+
+2016-02-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README, NEWS: Updated to reflect use of Texinfo 6.1.
+
+	Unrelated:
+
+	* configure.ac: Switch to AC_PROG_CC_C99 to enable C99
+	compilation and features.
+	* dfa.c: Sync with GNU grep, go back to C99 style declarations
+	at point of use.
+
+2016-02-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Make optimization (constant folding and tail call recursion)
+	be on by default.
+
+	* awkgram.y (common_exp): Only do concatenation of two strings(!)
+	* main.c (do_optimize): Init to true.
+	(optab): Add new -s/--no-optimize option.
+	(usage): Update message to include it.
+	(parse_args): Parse it. Set do_optimize to false if pretty
+	printing or profiling.
+	* NEWS: Updated.
+
+2016-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (SUBDIRS): Include extras. Otherwise dist does
+	doesn't work.
+
+2016-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (GAWK_AC_AIX_TWEAK): Remove call.
+	* configure: Regenerated.
+	* io.c (GAWK_AIX): Check _AIX instead.
+	* custom.h (_AIX): Add define of _XOPEN_SOURCE_EXTENDED.
+
+	Unrelated:
+
+	* configure.ac: Remove old stuff for ISC Unix, no longer needed.
+	* configure: Regenerated.
+
+2016-01-25         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* io.c (redirect): Need to call close_one more than once after
+	  running out of file handles.
+
+2016-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* NEWS: Document VMS support updated.
+
+2016-01-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Regex: treat [x] as x if x is a unibyte encoding error.
+	This change removes an ifdef GAWK.
+
+	* regcomp.c (parse_byte) [ !_LIBC && RE_ENABLE_I18N]: New function.
+	(build_range_exp) [ !_LIBC && RE_ENABLE_I18N]: Use it.
+	From Paul Eggert  <eggert@cs.ucla.edu>.
+
+2016-01-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regexec.c (prune_impossible_nodes): Remove all attributes, on
+	both declaration and definition.  Fixes a Linux Mint 17 compilation
+	braino reported by Antonio Colombo.
+	* regex_internal.h (test_malloc): Add cast to silence a warning
+	on the same system.
+	(test_realloc): Ditto.
+
+2016-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regex_internal.h [attribute_hidden]: Remove definition.
+	* regcomp.c [attribute_hidden]: Remove uses. Not needed since
+	the variables are static. Thanks to Paul Eggert for pointing
+	this out.
+
+2016-01-18         Paul Eggert  <eggert@cs.ucla.edu>
+
+	Diagnose ERE '()|\1'
+	Problem reported by Hanno Boeck in: http://bugs.gnu.org/21513
+
+	* lib/regcomp.c (parse_reg_exp): While parsing alternatives, keep
+	track of the set of previously-completed subexpressions available
+	before the first alternative, and restore this set just before
+	parsing each subsequent alternative.  This lets us diagnose the
+	invalid back-reference in the ERE '()|\1'.
+
+	Unrelated:  General minor cleanups (spelling, code) from Gnulib:
+
+	* regex.h, regex_internal.c, regex_internal.h, regexec.c: Minor
+	cleanups.
+
+2016-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* eval.c (r_get_lhs): If original array was Node_var_new,
+	assign value that is dupnode of Nnull_string and not
+	Nnull_string directly. Fixes core dump reported by
+	ruyk <Lonely.ruyk@mail.ru>.
+
+	Unrelated:
+
+	* ChangeLog: Cleanup spurious extra whitespace.
+
+2016-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (GAWK_AC_LINUX_ALPHA): Remove call.
+	* configure: Regenerated.
+	* NEWS: Document removal of support for GNU/Linux on Alpha.
+
+2016-01-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (add_utf8_anychar): Minor change in declaration of
+	utf8_classes to keep Tiny CC happy.  Also syncs with grep.
+	* dfa.h: Sync with grep (update copyright year).
+
+2015-12-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (mk_condition): Revise to correctly handle
+	empty else part for pretty printing. Bug report by
+	ziyunfei <446240525@qq.com>.
+
+2015-12-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (nonfatal): New static constant string.
+	* is_non_fatal, is_non_fatal_redirect: Use it.
+
+2015-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (two_way_open): Remove unneeded close of slave in the
+	parent.
+
+2015-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pp_number): Move count into ifdef for MPFR. Avoids
+	an unused variable warning if not compiling for MPFR.
+
+	Unrelated:
+
+	* io.c (two_way_open): If using a pty instead of pipes, open the
+	slave in the child. Fixes AIX and doesn't seem to break GNU/Linux.
+
+2015-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* command.y (cmdtab): Add "exit" as synonym for "quit".
+	Suggested by Joep van Delft <joepvandelft@xs4all.nl>.
+	* NEWS: Document this.
+
+2015-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (debug_pre_execute): Fix to check watchpoints before
+	checking breakpoints. Gives more natural behavior for the user.
+	* NEWS: Document this.
+	Issue reported by Joep van Delft <joepvandelft@xs4all.nl>.
+
+2015-10-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (nextc): Don't allow '\0' even if check_for_bad
+	is false. Fixes a problem reported by Hanno Boeck <hanno@hboeck.de>.
+
+	Unrelated:
+
+	* dfa.c: Sync with GNU grep.
+
+2015-10-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Fix invalid write problems.
+	Reported by Hanno Boeck <hanno@hboeck.de>.
+	Only appeared in master. Harumph.
+
+2015-10-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (SUBDIRS): Fix ordering so that
+	make check directly after configure works properly.
+	Thanks to Michal Jaegermann <michal.jnn@gmail.com>
+	for the report.
+
+	Unrelated:
+
+	* dfa.c: Sync with GNU grep.
+
+2015-10-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Fix invalid read problems.
+	Reported by Hanno Boeck <hanno@hboeck.de>.
+
+2015-10-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Bump version to 4.1.3a.
+
+2015-09-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Diagnose multidimensional arrays for
+	traditional/posix (fatal) or lint. Thanks to Ed Morton
+	for the bug report.
+
+2015-09-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub, config.rpath: Updated.
+
+2015-09-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* field.c (fpat_parse_field): Always use rp->non_empty instead
+	of only if in_middle. The latter can be true even if we've
+	already parsed part of the record. Thanks to Ed Morton
+	for the bug report.
+
+2015-09-11	Daniel Richard G.	<skunk@iSKUNK.ORG>
+
+	* regcomp.c: Include strings.h, wrapped in ifdef. Revise
+	defines for BTOWC.
+	* regex_internal.h: Remove ZOS_USS bracketing ifdefs.
+
+2015-09-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pp_num): Use format_val to print integral values
+	as integers. Thanks to Hermann Peifer for the report.
+
+2015-08-28	Daniel Richard G.	<skunk@iSKUNK.ORG>
+
+	* Makefile.am, configure.ac: Use an Automake conditional to
+	enable/disable the "extensions" subdirectory instead of
+	producing a stub Makefile therein from the configure script.
+	* awk.h, custom.h, regex_internal.h: Removed z/OS-specific code
+	that is no longer needed due to improvements in Gawk's general
+	Autotools support.
+	* awk.h: Allow <strings.h> to be #included together with
+	<string.h> as this is required on some systems (z/OS).
+	* io.c, configure.ac: <sys/select.h> is needed for select()
+	and related bits on z/OS.
+	* awk.h: Handle the redefinition of EXIT_FAILURE on z/OS in a
+	more elegant/general way.
+	* awkgram.y, command.y, configure.ac, eval.c,
+	helpers/testdfa.c: Define and use the USE_EBCDIC cpp symbol
+	instead of checking the value of 'a' whenever we want to know
+	if we're on an EBCDIC system. Also, don't assume that z/OS
+	necessarily means EBCDIC, as the compiler does have an ASCII
+	mode (-qascii).
+	* awkgram.y, command.y, configure.ac: On EBCDIC systems,
+	convert singleton EBCDIC characters in the input stream to
+	ASCII on the fly so that the generated awkgram.c/command.c in
+	the distributed sources can be used, i.e. we don't have to
+	require the user to build Bison and re-generate those files
+	themselves. This implementation uses a z/OS-specific function
+	(__etoa_l()) to do the conversion, but support for other
+	systems can be added in the future as necessary.
+	* io.c: No need to protect this block of "#if
+	defined(HAVE_TERMIOS_H)" code from z/OS; it works just fine
+	there.
+	* configure.ac: Check for the "struct passwd.pw_passwd" and
+	"struct group.gr_passwd" fields and conditionalize their use,
+	as they don't exist on z/OS.  Needed for doc/gawktexi.in.
+
+2015-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* node.c (str2wstr): Upon finding an invalid character, if
+	using UTF-8, use the replacement character instead of skipping
+	it. Helps match() and other functions work better in the face
+	of unexpected data.  Make the lint warning an unconditional
+	warning.
+
+	Unrelated:
+
+	* awk.h: Add explanatory comment on the flags related to
+	types and values.
+	* mpfr.c (mpg_force_number): If setting NUMBER, clear STRING also
+	when clearing MAYBE_NUM.
+	(set_PREC): Check STRCUR instead of STRING.
+	* node.c (r_force_number): If setting NUMBER, clear STRING also
+	when clearing MAYBE_NUM.
+
+2015-08-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (dfamust): Restore c90 compat by moving some
+	variable declarations to the top of the routine.
+
+2015-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep. Yet again, again.
+
+2015-08-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep. Yet again.
+
+2015-07-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2015-07-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2015-07-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Sync with GNU grep.
+
+2015-06-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): If gawk extension function is found as
+	a function in a user-defined function body, treat it normally.
+	Makes eval "print and(a, 1)" work in the debugger again.
+	Thanks, yet again, to Hermann Peifer.
+	* interpret.h (r_interpret): Op_subscript. UPREF if the
+	element value is a typed regexp.  Thanks to Hermann Peifer.
+
+2015-06-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Improve memory tracking of typed regexps.
+
+	* awkgram.y (make_regnode): Set valref to 1.
+	* interpret.h (r_interpret): Have Op_push_re upref typed regexp.
+	* builtin.c (do_typeof): OK to deref typed regex.
+	* awk.h (force_string): Do dupnode on the regexp text.
+
+2015-06-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove support for old-style extensions.
+
+	* awk.h (Node_old_ext_func, Op_old_ext_func): Removed.
+	Remove all uses throughout the code.
+	(load_old_ext, make_old_builtin): Remove declarations.
+	* ext.c (load_old_ext, make_old_builtin): Removed.
+	* awkgram.y (tokentab): Remove "extension" entry.
+	* eval.c (Node_old_ext_funci, Op_old_ext_func): Remove from tables.
+	* interpret.h (interpret): Remove stuff for old extensions.
+
+	Unrelated:
+
+	* builtin.c (do_typeof): Add support for strnum, distinguish
+	untyped from unassigned, use "string" and "number". Thanks to
+	Hermann Peifer for suggesting inclusion of strnum.
+
+2015-06-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Further work straightening out memory management for typeof.
+
+	* awk.h (DEREF): Add an assert.
+	* builtin.c (do_typeof): Add comments, cases where not to deref.
+	* debug.c (print_instruction): Add Op_push_arg_untyped.
+	* interpret.h (r_interpret): Additional comments / tweaks for
+	Op_push_arg_untyped.
+
+	Unrelated. Make `x = @/foo/ ; print x' print something.
+
+	* builtin.c (do_print): Check for Node_typedregex and handle it.
+	Needed for adding test code.
+
+	Unrelated. Typo fix.
+
+	* debug.c (initialize_watch_item): Dupnode the right thing.
+
+2015-06-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (snode): Make isarray not scalarize untyped parameters
+	also.
+	* profile.c (pprint): Add Op_push_arg_untyped.
+
+	Improve debugger support for typed regexps.
+	Thanks to Hermann Peifer for the bug report.
+
+	* awkgram.y (valinfo): Add support for Node_typedregex.
+	* debug.c (watchpoint_triggered): Handle Node_typedregex.
+	(initialize_watch_item): Ditto.
+	(print_memory): Ditto.
+
+	Fix typeof to work on subarrays.  Thanks, yet again, to
+	Hermann Peifer for the bug report.
+
+	* builtin.c (do_typeof): Don't deref Node_var_array.
+
+2015-06-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fixes for typeof - Don't let typeof change an untyped variable
+	into a scalar.
+
+	* awk.h (opcodeval): Add Op_push_arg_untyped.
+	* awkgram.y (snode): Separate out case for do_typeof, use
+	Op_push_arg_untyped.
+	* builtin.c (do_typeof): Arg will be equal to Nnull_string
+	if it's untyped.
+	* eval.c (optypes): Add Op_push_arg_untyped.
+	* interpret.h (r_interpret): Add Op_push_arg_untyped handling.
+
+2015-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_isarray): Minor edit to lint warning.
+	* TODO: Updated.
+
+2015-06-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c, regex_internal.h, regexec.c: Sync with GLIBC.
+
+	Unrelated:
+
+	* regex_internal.c, regexec.c: __attribute --> __attribute__.
+
+	Related:
+
+	* regex_internal.h: Clean up defines for non-GCC for attribute;
+	essentially sync it with GLIBC.
+
+2015-06-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: Finish converting "hard" regex to "typed" regex.
+
+2015-05-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* field.c (posix_def_parse_field): Removed. It's no longer
+	needed after updates to the POSIX standard. Thanks to
+	Michael Klement <michael.klement@usa.net> for pointing this out.
+
+2015-05-26  Paul Eggert  <eggert@Penguin.CS.UCLA.EDU>
+
+	* floatcomp.c (count_trailing_zeros): New function.
+	This compiles to a single TZCNT instruction on the x86-64.
+	(adjust_uint): Use it to keep more high-order bits when
+	some of the lowest-order bits are zero.  This implements
+	the documented behavior: "If the result cannot be represented
+	exactly as a C 'double', leading nonzero bits are removed one by
+	one until it can be represented exactly."
+
+2015-05-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c: Fix offsets so error messages come out correct
+	once again.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-05-15         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* symbol.c (load_symbols): Plug minor memory leak by calling unref(tmp)
+	on "identifiers" string after assoc_lookup is done with it.
+
+2015-05-15         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* main.c (load_procinfo_argv): New function to save argv array values
+	in PROCINFO["argv"][0..argc-1].
+	(load_procinfo): Call load_procinfo_argv.
+
+2015-05-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h, awkgram.y, builtin.c, eval.c profile.c, re.c:
+	Change Node_hardregex to Node_typedregex everywhere.
+
+2015-05-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Yet Another Fix for parsing bracket
+	expressions. Thanks yet again to Andrew Schorr. Maybe it's
+	even finally nailed down now.
+
+	Unrelated:
+
+	* config.guess, config.sub: Get latest versions.
+
+	Make profiling for hard regexes work.
+
+	* profile.c (pp_string_or_hard_regex): Renamed from pp_string.
+	Add bool param for hard regex and add @ if so.
+	(pp_string): New function, calls pp_string_or_hard_regex.
+	(pp_hard_regex): New function, calls pp_string_or_hard_regex.
+	(pprint): Adjust to print a hard regex correctly.
+
+2015-05-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: Make sure values are not null in param list.
+	Avoids core dump for `function f(func, a) {}'. Thanks to
+	Tibor Palinkas <libmawk@igor2.repo.hu>.
+
+2015-04-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Take --program-prefix into account when
+	installing/uninstalling the symlinks, especially 'awk'.
+	Thanks to Steffen Nurpmeso <sdaoden@yandex.com> for
+	the report.
+
+	Unrelated:
+
+	* awkgram.y (yylex): Yet Another Fix for parsing bracket
+	expressions. Thanks again to Andrew Schorr.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-04-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (isarray): Add lint warning that isarray()
+	is deprecated.
+
+2015-04-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Rework the bracket handling from zero.
+	Thanks to Michal Jaegermann for yet another test case.
+
+	Unrelated:
+
+	* eval.c (setup_frame): Restore call-by-value for $0. This was
+	necessitated by the changes on 2014-11-11 for conserving
+	memory use. Thanks to Andrew Schorr for the report and isolating
+	the cause of the problem.
+
+2015-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Make change of Jan 7 for parsing regexps
+	work better. Thanks to Nelson Beebe.
+
+2015-04-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with grep.
+
+2015-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_strftime): For bad time_t values, return "".
+
+2015-04-16         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* node.c (r_force_number): If strtod sets errno, then force the
+	numeric value in node->numbr to zero. For subnormal values, strtod
+	sets errno but does not return zero, and we don't want to retain
+	those subnormal values.
+
+2015-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Let parameter names shadow the names of gawk additional built-ins.
+	Make it actually work.
+
+	* awkgram.y (want_param_names): Now an enum, there are three states.
+	(grammar): Set states properly.
+	(yylex): Improve checking logic.
+
+2015-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Updated by autoupdate.
+	* configure, aclocal.m4: Regenerated.
+	* io.c, main.c, profile.c: Removed use of RETSIGTYPE.
+
+2015-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_strftime): Use a double for the timestamp and
+	check that the value is within range for a time_t.
+
+	Unrelated:
+
+	* regex_internal.h (test_malloc, test_realloc): Use %lu in printf
+	format for error messages. Thanks to Michal Jaegermann for
+	pointing this out.
+
+	Unrelated:
+
+	* NEWS: Updated.
+
+2015-04-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Let parameter names shadow the names of gawk additional built-ins.
+
+	* awkgram.y (want_param_names): New variable.
+	(yylex): Check it before returning a built-in token.
+	(grammar): Set and clear it in the right places.
+
+2015-04-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_strftime): Restore checking for negative result and
+	add check that time_t is > 0 --- means we're assigning a negative value
+	to an unsigned time_t. Thanks again to Glaudiston Gomes da Silva
+	<glaudistong@gmail.com>.
+
+	If localtime() or gmtime() return NULL, return a null string.
+	Thanks to Andrew Schorr.
+
+	Unrelated:
+	* builtin.c (call_sub): Fix for indirect gensub, 3 args now works.
+
+	Unrelated:
+
+	* builtin.c (do_sub): Improve some variable names for readability
+	and add / expand some comments.
+
+	Unrelated:
+
+	* builtin.c (call_sub, call_match, call_split_func): Allow for
+	regex to be Node_hardregex.
+
+2015-04-14         Andrew J. Schorr      <aschorr@telemetry-investments.com>
+		   Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_sub): Make computations smarter; initial len
+	to malloc, test for final amount after all matches done and
+	need to copy in the final part of the original string.
+
+2015-04-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c (analyze): Prevent malloc(0).
+	* regex_internal.h (test_malloc, test_realloc): New functions
+	that check for zero count.
+	(re_malloc, re_realloc): Adjust to call the new functions for gawk.
+	* regexec.c (build_trtable, match_ctx_clean): Replace malloc/free
+	with re_malloc/re_free.
+
+	Unrelated:
+
+	* builtin.c (do_strftime): Disable checking timestamp value for less
+	than zero. Allows times before the epoch to work with strftime.
+	Thanks to Glaudiston Gomes da Silva <glaudistong@gmail.com>
+	for raising the issue.
+
+2015-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (efence): Make this link again.
+	Thanks to Michal Jaegermann for pointing out the problem.
+
+2015-04-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkgram.y (yyerror): Rationalize buffer size computations. Remove
+	old valgrind workarounds.
+	* debug.c (gprintf): Rationalize buffer size computations.
+	(serialize_subscript): Ditto.
+	* io.c (iop_finish): Rationalize buffer size computations.
+	* profile.c (pp_string): Correct space allocation computation.
+
+2015-04-08        John E. Malmberg       <wb8tyw@qsl.net>
+
+	* custom.h: VMS shares some code paths with ZOS_USS in
+	building gawkfts extension.
+
+2015-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Factor out opening of /dev/XXX files from /inet.
+	Enable interpretation of special filenames for profiling output.
+
+	* awk.h (devopen_simple): Add declaration.
+	* io.c (devopen_simple): New routine.
+	(devopen): Call devopen_simple as appropriate.
+	* profile.c (set_prof_file): Call devopen_simple as appropriate,
+	some additional logic to handle fd to fp conversion.
+
+	Unrelated:
+
+	* main.c (usage): Add a comment for translators.
+
+2015-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* profile.c (set_prof_file): Interpret a file name of "-" to mean
+	standard output.
+
+2015-04-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (force_number): Add `!= 0' check to bitwise operation.
+	* awkgram.y: Same, many places.
+	(check_special): Simplify code for checking extension flags.
+
+2015-04-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (install_builtins): If do_traditional is true, do not
+	install gawk extensions flagged with GAWKX.  Similarly, if do_posix
+	is true, do not install functions flagged with NOT_POSIX.
+	This fixes a problem with spurious lint complaints about shadowing
+	a global variable that is not valid in traditional or posix mode.
+	Thanks to Andrew Schorr for finding the problem and supplying
+	initial code; I did it slightly differently.
+
+2015-04-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (force_string): If hard_regex, return string text of the regex.
+	(force_string, force_number): If hard_regex, return Nnull_string.
+	* awkgram.y: Fix ~ and !~ with @/.../.
+	* eval.c (setup_frame): Handle a hard regex.
+	* re.c (avoid_dfa): Ditto.
+
+2015-04-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* NEWS: Rename div to intdiv.
+
+2015-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Rename div() to intdiv().
+
+	* builtin.c (do_intdiv): Renamed from do_div.
+	* mfpr.c (do_mpfr_intdiv): Renamed from do_mpfr_div.
+	* awk.h: Update declarations.
+	* awkgram.y (tokentab, snode): Revise accordingly.
+
+2015-03-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (call_sub): Renamed from call_sub_func.
+	(call_match, call_split_func): Declare.
+	* builtin.c (call_sub): Renamed from call_sub_func.
+	(call_match, call_split_func): New functions.
+	* interpret.h (r_interpret): Call new functions as appropriate.
+	* node.c (r_unref): Revert change to handle Node_regex, not needed.
+
+2015-03-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (r_get_field): Declare.
+	* builtin.c (call_sub_func): Rearrange the stack to be what
+	the buitin function expects.
+	* eval.c (r_get_field): Make extern.
+
+2015-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (redirect): Change not_string from int to bool.
+	* gawkapi.c (api_get_file): Minor stylistic improvements.
+	* NEWS: Updated for retryable I/O and new API function.
+
+2015-03-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (make_regnode): Make extern.
+	* awk.h (make_regnode): Declare.
+	* builtin.c (call_sub_func): Start on reworking the stack to
+	be what do_sub() expects. Still needs work.
+	* interpret.h (r_interpret): Add a cast in comparison with do_sub().
+	* node.c (r_unref): Handle Node_regex nodes.
+
+2015-03-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* interpret.h (r_interpret): When Op_K_exit has an argument of
+	Nnull_string, do not update exit_val, since no value was supplied.
+
+2015-03-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h, gawkapi.c, io.c: Minor code reformatting.
+
+2015-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Start on fixing indirect calls of builtins.
+
+	* awk.h (call_sub_func): Add declaration.
+	* awkgram.y (lookup_builtin): Handle length, sub functions.
+	(install_builtin): Handle length function.
+	* builtin.c (call_sub_func): New function.
+	* interpret.h (r_interpret): If calling do_sub, do it through
+	call_sub_func().
+
+2015-03-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* re.c (re_update): Handle hard regex - for sub/gsub/gensub.
+	* awkgram.y (grammar): Add support for hard_regex with ~ and !~;
+	allowed only on the right hand side.
+	(mk_rexp): Handle a hard regex.
+
+2015-03-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_typeof): Be smarter about checking for uninitialized
+	values; can now detect and return "untyped" for such values.
+	* awkgram.y (yylex): Collect @/.../ entirely in the lexer and return
+	a new terminal (HARD_REGEX).
+	(regexp): Reverted to just a regular awk regexp constant.
+	(hard_regexp): New nonterminal, can be used only in direct
+	assignment and as an argument in function call. New set of nonterminals
+	for function call expression lists.  More work still to do.
+
+2015-03-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated, from libtool 2.4.6.
+
+2015-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pp_number): Allocate enough room to print the number
+	in all cases. Was a problem mixing -M with profiling with a really
+	big number. Thanks to Hermann Peifer for the bug report.
+
+2015-03-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* re.c (regexflags2str): Removed. It was redundant.
+
+	* io.c (devopen): Change the logic such that if nonfatal is true
+	for the socket, don't do retries.  Also clean up the formatting
+	some.  At strictopen, check if errno is ENOENT and if so, propagate
+	the error from getaddrinfo() up to the caller. Add explanatory
+	comments.
+
+2015-02-28         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (pty_vs_pipe): Remove check for NULL PROCINFO_node, since
+	this is now checked inside in_PROCINFO.
+
+2015-02-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (socketopen): New parameter hard_error; set it if
+	getaddrinfo() fails. Change fatals to warnings.
+	(devopen): Pass in address of boolean hard_error variable
+	and stop trying to open the file if hard_error is true.
+	Save and restore errno around call to socketopen() and
+	use restored errno if open() fails at strictopen.
+
+2015-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symbol.c (check_param_names): Fix argument order in memset() call.
+	* configure.ac: Use AC_SEARCH_LIBS instead of AC_CHECK_LIB. This fixes
+	a long-standing problem where `-lm' was used twice in the final
+	compilation line.
+
+2015-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Start on making regexp a real type.
+
+	* awk.h (Node_hardregex): New node type.
+	(do_typeof): Add declaration.
+	* awkgram.y: Make @/.../ a hard regex.
+	(tokentab): New entry for typeof() function.
+	(snode): Try to handle typeof().
+	(make_regnode): Handle Node_hardregex.
+	* builtin.c (do_typeof): New function.
+	* eval.c (nodetypes): Add Node_hardregex.
+	* re.c (re_update): Check for hardregex too in assert.
+
+2015-02-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* POSIX.STD: Update copyright year.
+	* awkgram.y (yylex): Allow \r after \\ line continuation everywhere.
+	Thanks to Scott Rush <scott.rush@honeywell.com> for the report.
+
+2015-02-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Be more careful about passing true to
+	nextc() when collecting a regexp.  Some systems' iscntrl()
+	are not as forgiving as GLIBC's. E.g., Solaris.
+	Thanks to Dagobert Michelsen <dam@baltic-online.de> for
+	the bug report and access to systems to check the fix.
+
+2015-02-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* POSIX.STD: Update with info about function parameters.
+	* configure.ac: Remove test for / use of dbug library.
+
+2015-02-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Fix spelling error in comment.
+
+2015-02-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pprint): Restore printing of count for rules.
+	Bug report by Hermann Peifer.
+
+2015-02-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c: Make it "NONFATAL" everywhere.
+
+2015-02-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (RED_NON_FATAL): Removed.
+	(redirect): Add new failure_fatal parameter.
+	(is_non_fatal_redirect): Add declaration.
+	* builtin.c (efwrite): Rework check for non-fatal.
+	(do_printf): Adjust calls to redirect.
+	(do_print_rec): Ditto. Move check for redirection error up.
+	* io.c (redflags2str): Remove RED_NON_FATAL.
+	(redirect): Add new failure_fatal parameter. Simplify the code.
+	(is_non_fatal_redirect): New function.
+	(do_getline_redir): Adjust calls to redirect.
+
+2014-12-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (is_non_fatal_std): Declare new function.
+	* io.c (is_non_fatal_std): New function.
+	* builtin.c (efwrite): Call it.
+
+2015-02-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c, regex.c, regex.h, regex_internal.c, regex_internal.h,
+	regexec.c: Sync with GLIBC. Mostly copyright date updates.
+
+2015-02-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* eval.c (set_IGNORECASE): If IGNORECASE has a numeric value, try
+	using that before treating it as a string.  This fixes a problem
+	where setting -v IGNORECASE=0 on the command line was not working
+	properly.
+
+2015-02-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Move POSIX requirement for disallowing parameter names with the
+	same name as a function into --posix.
+
+	* NEWS: Document it.
+	* awkgram.y (parse_program): Check do_posix before calling
+	check_param_names().
+	* symbol.c (check_param_names): Set up a fake node and call
+	in_array() for function parameter names instead of linear
+	searching the function list a second time. Thanks to Andrew
+	Schorr for the motivation.
+
+2015-01-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Don't allow function parameter names to be the same as function
+	names - required by POSIX. Bug first reported in comp.lang.awk.
+
+	In addition, don't allow use of a parameter as a function name
+	in a call (but it's ok in indirect calls).
+
+	* NEWS: Updated.
+	* awk.h (check_param_names): Add declaration.
+	* awkgram.y (at_seen): New variable. Communicates between
+	yylex() and the parser.
+	(FUNC_CALL production): Check at_seen and check that the identifier
+	is a function name.
+	(parse_program): Call check_param_names() and set errcount.
+	(yylex): Set at_seen after seeing an at-sign.
+	* symbol.c (check_param_names): New function.
+
+2015-01-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Infrastructure updates.
+
+	Bison 3.0.4. Automake 1.15. Gettext 0.19.4.
+
+2015-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.c (api_set_array_element): Remove useless call to
+	make_aname.
+	* symbol.c (load_symbols): Ditto.
+	Thanks to Andrew Schorr for pointing out the problem.
+
+2015-01-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.c: Update to bison 3.0.3.
+	* command.c: Ditto.
+	* NEWS: Note same.
+
+2015-01-16         Stephen Davies        <sdavies@sdc.com.au>
+
+	* awkgram.y (rule): Set first_rule to false. Catches more cases
+	for gathering comments. Thanks to Hermann Peifer for the test case.
+
+2015-01-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Sync with grep. Mainly copyright updates.
+	* getopt.c, getopt.h, getopt1.c getopt_int.h: Sync with GLIBC.
+	Mainly copyright updates, one minor code fix.
+
+2015-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove deferred variables.
+
+	* awk.h (register_deferred_variable): Remove declaration.
+	* awkgram.y (is_deferred_variable, process_deferred,
+	symtab_used, extensions_used, deferred_variables,
+	process_deferred): Remove declarations, bodies, and uses.
+	* builtin.c (do_length): Update comment.
+	* main.c (init_vars): Just call load_procinfo() and `load_environ()'.
+
+2015-01-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Revert changes to API deferred variable creation -- these variables
+	should be created when lookup is called, not when update is called.
+	* awk.h (variable_create): Remove function declaration.
+	* awkgram.y (variable_create): Remove function.
+	(variable): Restore variable_create functionality inline.
+	* gawkapi.c (api_sym_update): Revert to using install_symbol, since the
+	deferred variable check should be done when lookup is called, not here.
+
+2015-01-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (api_set_array_element): Remove stray call to
+	make_aname.  I cannot see what purpose this served.  Maybe I am
+	missing something.
+
+2015-01-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Update debug flags if developing.
+	* awkgram.y (yylex): Regex parsing bug fix for bracket expressions.
+	Thanks to Mike Brennan for the report.
+	* builtin.c (format_tree): Catch non-use of count$ for dynamic
+	field width or precision.
+
+	Unrelated:
+
+	Load deferred variables if extensions are used; they might
+	want to access PROCINFO and/or ENVIRON. Thanks to Andrew Schorr
+	for pointing out the issue.
+
+	* awkgram.y (extensions_used): New variable. Set it on @load.
+	(do_add_scrfile): Set it on -l.
+	(process_deferred): Check it also.
+
+2015-01-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (api_sym_update): If copying a subarray, must update
+	the parent_array pointer.  Also, call the astore hook if non-NULL.
+	(api_set_array_element): Call the astore hook if non-NULL.
+
+2015-01-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (variable_create): Now takes a 3rd argument to tell caller
+	whether this is a deferred variable.
+	* awkgram.y (variable_create): Return indicator of whether this is
+	a deferred variable in a newly added 3rd arg.
+	(variable): Pass 3rd arg to variable_create.
+	* gawkapi.c (api_sym_update): If we triggered the creation of a deferred
+	variable, we must merge the extension's array elements into the deferred
+	array, not the other way around.  The ENVIRON array has special funcs
+	to call setenv and unsetenv.
+
+2015-01-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (variable_create): Declare new function.
+	* awkgram.y (variable_create): New function to create a variable
+	taking the deferred variable list into consideration.
+	(variable): Call new function variable_create if the variable is
+	not found.
+	* gawkapi.c (api_sym_update): If an array is being created, then
+	call new function variable_create instead of install_symbol.  If this
+	is the first reference to a deferred variable, than the new array
+	may contain elements that must be merged into the array provided by
+	the extension.
+
+2015-01-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (wait_any): If the `interesting' argument is non-zero, then we
+	must not return until that child process has exited, since the caller
+	gawk_pclose depends on our returning its exit status.  So in that case,
+	do not pass WNOHANG to waitpid.
+
+2015-01-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h: Fix another comment typo.
+
+2015-01-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h: Fix typo in comment.
+
+2015-01-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (gawk_api): Modify api_get_file to remove the typelen
+	argument.
+	(get_file): Remove typelen argument from the macro.
+	* gawkapi.c (api_get_file): Remove typelen argument.
+
+2014-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pprint): Be sure to set ip2 in all paths
+	through the code. Thanks to GCC 4.9 for the warning.
+
+2014-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_sub): Do not waste a byte at the end of a string.
+
+2014-12-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yyerror): Do not waste a byte at the end of a string.
+	* builtin.c (do_match): Ditto.
+	* command.y (append_statement): Ditto.
+	* debug.c (gprintf, serialize): Ditto.
+	* field.c (set_FIELDWIDTHS): Ditto.
+	* io.c.c (grow_iop_buffer): Ditto.
+	* profile.c (pp_string, pp_group3): Ditto.
+
+2014-12-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* array.c (concat_exp): Do not waste a byte at the end of a string.
+	* awkgram.y (common_exp): Ditto.
+	* builtin.c (do_substr): Ditto.
+	* eval.c (set_OFS): Ditto.
+	* field.c (rebuild_record): Ditto.
+	* gawkapi.h (r_make_string): Ditto.
+	* interpret.h (r_interpret): Ditto for Op_assign_concat.
+	* node.c (r_format_val, r_dupnode, make_str_node, str2wstr, wstr2str):
+	Ditto.
+	* re.c (make_regexp): Ditto.
+
+2014-12-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Enable non-fatal output on per-file or global basis,
+	via PROCINFO.
+
+	* awk.h (RED_NON_FATAL): New redirection flag.
+	* builtin.c (efwrite): If RED_NON_FATAL set, just set ERRNO and return.
+	(do_printf): Check errflg and if set, set ERRNO and return.
+	(do_print): Ditto.
+	(do_print_rec): Ditto.
+	* io.c (redflags2str): Update table.
+	(redirect): Check for global PROCINFO["nonfatal"] or for
+	PROCINFO[file, "nonfatal"] and don't fail on open if set.
+	Add RED_NON_FATAL to flags.
+	(in_PROCINFO): Make smarter and more general.
+
+2014-12-12        Stephen Davies         <sdavies@sdc.com.au>
+
+	Improve comment handling in pretty printing.
+
+	* awk.h (comment_type): New field in the node.
+	(EOL_COMMENT, FULL_COMMENT): New defines.
+	* awkgram.y (block_comment): New variable.
+	(check_comment): New function.
+	(grammar): Add code to handle comments as needed.
+	(get_comment): Now takes a flag indicating kind of comment.
+	(yylex): Collect comments appropriately.
+	(append_rule): Ditto.
+	* profile.c (pprint): Smarten up comment handling.
+	Have printing \n take comments into account.
+	(end_line): New function.
+	(pp_func): Better handling of function comments.
+
+2014-12-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2014-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_sub): Improve wording of gensub warnings.
+
+2014-11-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_sub): For gensub, add more warnings for invalid
+	third argument.
+
+2014-11-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h: Move all inline functions to the bottom of the file.
+	Keeps modern GCC happier.
+
+2014-11-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (emalloc, realloc): Redefine in terms of ...
+	(emalloc_real, erealloc_real): New static inline functions.
+	(fatal): Move definition up.
+	* gawkmisc.c (xmalloc): If count is zero, make it one for older
+	mallocs that require size > 0 (such as z/OS).
+
+2014-11-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c: Remove a debugging // comment.
+	* NOTES: Removed.
+
+	Unrelated:
+
+	Revert changes of 2014-11-20 from Paul Eggert. Causes failures
+	on z/OS.
+
+	Unrelated: Avoid unnecessary copying of $0.
+
+	* interpret.h (UNFIELD): New macro.
+	(r_interpret): Use it where *lhs is assigned to.
+
+2014-11-20  Paul Eggert  <eggert@cs.ucla.edu>
+
+	Port to systems where malloc (0) and/or realloc(P, 0) returns NULL.
+	* gawkmisc.c (xmalloc):
+	* xalloc.h (realloc):
+	Do not fail if malloc(0) or realloc(P, 0) returns NULL.
+	Fail only when the allocator returns null when attempting to
+	allocate a nonzero number of bytes.
+
+2014-11-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Infrastructure upgrades:
+
+	* Automake 1.14.1, Gettext 0.19.3, Libtool 2.4.3.
+	* compile, extension/build-aux/compile: New files.
+
+2014-11-19  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.19.3.
+
+2014-11-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* interpret.h: Revert change of 2014-11-11 since it breaks
+	certain uses.
+
+	Unrelated:
+
+	* dfa.c: Sync with GNU grep.
+
+2014-11-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* array.c, awk.h, awkgram.y, builtin.c, dfa.c, eval.c, field.c,
+	interpret.h, io.c, main.c, mpfr.c, node.c, re.c, regex_internal.h,
+	replace.c: Remove all uses of MBS_SUPPORT.
+	* regex_internal.h: Disable wide characters on DJGPP.
+	* mbsupport.h: Rework to be needed only for DJGPP.
+
+2014-11-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Don't let memory used increase linearly in the size of
+	the input.  Problem reported by dragan legic
+	<dragan.legic@yandex.ru>.
+
+	* field.c (set_record): NUL-terminate the buffer.
+	* interpret.h (r_interpret): Op_field_spec: if it's $0, increment
+	the valref.  Op_store_var: if we got $0, handle it appropriately.
+
+2014-11-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Reorder main.c activities so that we can set a locale on the
+	command line with the new, for now undocumented, -Z option.
+
+	* main.c (parse_args, set_locale_stuff): New functions.
+	(stopped_early): Made file level static.
+	(optlist, optab): Add new argument.
+	(main): Adjust ordering and move inline code into new functions.
+
+2014-11-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (node_to_awk_value): When the type wanted is AWK_UNDEFINED
+	and a it's a Node_val set to Nnull_string, return AWK_UNDEFINED instead
+	of AWK_NUMBER 0.
+
+2014-11-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (redirect_string): First argument should be const.  Add a new
+	extfd argument to enable extensions to create files with pre-opened
+	file descriptors.
+	(after_beginfile): Declare function used in both eval.c and gawkapi.c.
+	* eval.c (after_beginfile): Remove extern declaration now in awk.h.
+	* gawkapi.c (api_get_file): Implement API changes to return
+	awk_input_buf_t and/or awk_output_buf_t info, as well as accept an
+	fd for inserting an opened file into the table.
+	* gawkapi.h (gawk_api): Modify the api_get_file declaration to
+	return awk_bool_t and add 3 new arguments -- a file descriptor
+	for inserting an already opened file, and awk_input_buf_t and
+	awk_output_buf_t to return info about both input and output.
+	(get_file): Add new arguments to the macro.
+	* io.c (redirect_string): First arg should be const, and add a new
+	extfd arg so extensions can pass in a file that has already been
+	opened by the extension.  Use the passed-in fd when appropriate,
+	and pass it into two_way_open.
+	(redirect): Pass new fd -1 arg to redirect_string.
+	(two_way_open): Accept new extension fd parameter and open it
+	as a socket.
+
+2014-11-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (retryable): New function to indicate whether I/O can be
+	retried for this file instead of throwing a hard error.
+	(get_a_record) Check whether this file is configured for retryable
+	I/O before returning nonstandard -2.
+
+2014-11-03         Norihiro Tanaka       <noritnk@kcn.ne.jp>
+
+	* re.c (research): Use dfa superset to improve matching speed.
+
+2014-11-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (div_on_left_mul_on_right): New function.
+	(parenthesize): Call it.
+
+2014-10-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure: Regenerated after fix to m4/readline.m4.
+
+	Unrelated; fixes to profiling. Thanks to Hermann Peifer and
+	Manuel Collado for pointing out problems:
+
+	* profile.c (pprint): For Op_unary_minus, parenthesize -(-x)
+	correctly.
+	(prec_level): Get the levels right (checked the grammar).
+	(is_unary_minus): New function.
+	(pp_concat): Add checks for unary minus; needs to be parenthesized.
+
+2014-10-30         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* NEWS: Mention installation of /etc/profile.d/gawk.{csh,sh}.
+
+2014-10-29         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac (AC_CONFIG_FILES): Add extras/Makefile.
+	* Makefile.am (SUBDIRS): Add extras.
+	* extras: Add new subdirectory.
+
+2014-10-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep. Again, again.
+
+2014-10-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep. Again.
+
+2014-10-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2014-10-17         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* ext.c (close_extensions): Test for null pointer since
+	since this can be called by signal handler before the
+	pointers are initialized.
+
+2014-10-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Make sane the handling of AWKPATH and AWKLIBPATH:
+
+	1. Don't explicitly search "."; it must be in the path either
+	physically or as null element a la the shell's $PATH
+	2. If environment's value was empty, use built-in default value.
+	3. Set ENVIRON["AWK*PATH"] to the path used.
+
+	* io.c (path_info): Remove try_cwd member.
+	(get_cwd): Removed, not needed anymore.
+	(do_find_source): Don't do explicit check in current directory.
+	It must come from the AWKPATH or AWKLIBPATH variable.
+	* main.c (path_environ): If value from environment was empty,
+	set it to the default.  This is how gawk has behaved since 2.10.
+
+2014-10-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c (__re_error_msgid): Make error message for REG_EBRACK
+	more helpful - also used for unmatched [:, [., [=.
+	Thanks to Davide Brini for raising the issue.
+
+2014-10-12         KO Myung-Hun          <komh78@gmail.com>
+
+	Fixes for OS/2:
+
+	* Makefile.am (install-exec-hook, uninstall-links): Use $(EXEEXT).
+	* getopt.h: Redefinitions if using KLIBC.
+	* io.c (_S_IFDIR, _S_IRWXU): Define if the more standard versions
+	are available.
+
+2014-10-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README: Remove Pat Rankin from VMS duties, per his request.
+
+2014-10-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2014-10-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pprint): Fix typo in header. Sheesh.
+
+	Unrelated:
+
+	* awkgram.y (mk_program): Add a comment that we don't need to
+	clear the comment* variables.
+
+2014-10-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pp_string_fp): Fix breaklines case to actually
+	output the current letter. This broke at gawk 4.0.0. Sigh.
+	Thanks to Bert Bos (bert@w3.org) for the report.
+
+2014-10-03	Stephen Davies		<sdavies@sdc.com.au>
+
+	* awkgram.y (program_comment): Renamed from comment0.
+	(function_comment): Renamed from commentf.
+
+2014-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y, profile.c: Minor white space cleanups.
+
+2014-10-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix a few compile warnings:
+
+	* awkgram.y (split_comment): Make static.
+	General: Remove some unused variables, clean up some whitepace nits.
+
+	* profile.c (indent): Add some braces to turn off compiler warnings.
+
+2014-09-29         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* main.c (main): In optlist, it should say "h", not "h:", since there
+	is no argument for the help option.  Thanks to Joep van Delft for
+	the bug report.
+
+2014-09-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Minor edits to sync with documentation. Does not
+	influence the behavior of the API.
+
+2014-09-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* command.y (cmdtab): Add "where" as an alias for "backtrace".
+	Finally!
+
+	Unrelated:
+
+	* dfa.c: Sync with GNU grep.
+
+2014-09-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (check_for_bad): Bitwise-and the bad character with 0xFF
+	to avoid sign extension into a large integer.
+
+	Unrelated:
+
+	* configure.ac: Add an option to enable locale letters in identifiers.
+	Undocumented and subject to being rescinded at any time in the future.
+	* awkgram.y (is_alpha): Actual code is here.
+	* NEWS: Mention to look at configure --help.
+
+	Unrelated:
+
+	* profile.c (pprint): Use "rule(s)" instead of "block(s)" in the
+	header.
+
+2014-09-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (yylex): Don't check for junk characters inside
+	quoted strings.  Caused issues on DJGPP and Solaris.
+
+	Unrelated:
+
+	* io.c (devopen): Straighten things out with respect to
+	compatibility with BWK awk.
+
+2014-09-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: Further commentary as to the treacherousness
+	of isalnum and isalpha.
+
+2014-09-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Finish removing use of isalpha and isalnum.
+
+	* awk.h (is_alpha, is_alnum, is_identchar): Add declarations.
+	* awkgram.y (yylex): Use is_alpha.
+	(is_alpha, is_alnum): New functions.
+	(is_identchar): Use is_alnum.
+	* builtin.c (r_format_tree): Use is_alpha, is_alnum.
+	* command.y (yylex): Use is_alpha, is_identchar.
+	* ext.c (is_letter): Use is_alpha.
+	(is_identifier_char): Removed; replaced uses with is_identchar.
+	* main.c (arg_assign): Use is_alpha, is_alnum.
+	* node.c (r_force_number): Use is_alpha.
+
+2014-09-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (is_identchar): Change from simple macro to function
+	since use of isalnum() let non-ASCII letters slip through into
+	identifiers.
+
+2014-09-13	Stephen Davies		<sdavies@sdc.com.au>
+
+	When doing pretty-printing (but not profiling), include the original
+	comments in the output.
+
+	General rules:
+
+	Pretty printing:
+		- Do NOT indent by a tab
+		- Do NOT print the header comments ("# BEGIN rules", etc.)
+		- DO print the comments that are in the program
+
+	Profiling:
+		- DO indent by a tab
+		- DO print the header comments
+		- Do NOT print the program's original comments
+
+	* awkgram.y (comment0, commentf): New variables that are  pointers to
+	program and function comments.
+	(get_comment): New function that retrieves consecutive comment lines
+	and empty lines as a unit).
+	(split_comment): New function: iff first block in the program is a
+	function and it is preceded by comments, take the last non-blank
+	line as function comment and any preceding lines as program comment.)
+
+	Following token rules were changed to handle comments:
+
+	* awkgram.y (pattern, LEX_BEGIN, LEX_END, LEX_BEGINFILE, LEX_ENDFILE,
+	action, function_prologue, statements): Update to handle comments.
+				
+	Following functions were changed to handle comments:
+
+	* awkgram.y (mk_program, mk_function, allow_newline and yylex): Update
+	to handle comments. (Also fixed typo in case '\\'.)
+
+	* profile.c (print_comment): New function to format comment printing.
+	(indent, pprint, dump_prog, pp_func): Changed to handle comments and
+	the revised indentation rules.
+
+2014-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h: Move libsigsegv stuff to ...
+	* main.c: here. Thanks to Yehezkel Bernat for motivating
+	the cleanup.
+	* symbol.c (make_symbol, install, install_symbol): Add const to
+	first parameter. Adjust decls and fix up uses.
+
+2014-09-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add builtin functions to FUNCTAB for consistency.
+
+	* awk.h (Node_builtin_func): New node type.
+	(install_builtins): Declare new function.
+	* awkgram.y [DEBUG_USE]: New flag value for debug functions; they
+	don't go into FUNCTAB.
+	(install_builtins): New function.
+	* eval.c (nodetypes): Add Node_builtin_func.
+	* interpret.h (r_interpret): Rework indirect calls of built-ins
+	since they're now in the symbol table.
+	* main.c (main): Call `install_builtins'.
+	* symbol.c (install): Adjust for Node_builtin_func.
+	(load_symbols): Ditto.
+
+2014-09-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pprint): Case Op_K_for: Improve printing of
+	empty for loop header.
+
+	Unrelated: Make indirect function calls work for built-in and
+	extension functions.
+
+	* awkgram.y (lookup_builtin): New function.
+	* awk.h (builtin_func_t): New typedef.
+	(lookup_builtin): Declare it.
+	* interpret.h (r_interpret): For indirect calls, add code to
+	find and call builtin functions, and call extension functions.
+
+2014-09-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_substr): Return "" instead of null string in case
+	result is passed to length() with --lint. Based on discussions in
+	comp.lang.awk.
+
+	Unrelated:
+
+	* interpret.h (r_interpret): For indirect function call, separate
+	error message if lookup returned NULL. Otherwise got a core dump.
+	Thanks to "Kenny McKormack" for the report in comp.lang.awk.
+
+2014-08-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add test for strcasecmp.
+	* regcomp.c: Remove special case code around use of strcasecmp().
+	* replace.c: Include missing/strncasecmp.c if either strcasecmp()
+	or strncasecmp() aren't available.
+
+2014-08-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c, regex_internal.c: Sync with GBLIC. Why not.
+
+	Unrelated:
+
+	Remove support for MirBSD. It uglified the code too much
+	for no discernible gain.
+
+	* configure.ac: Remove check for MirBSD and define of
+	LIBC_IS_BORKED.
+	* dfa.c: Remove code depending on LIBC_IS_BORKED.
+	* main.c: Ditto.
+	* regcomp.c: Ditto.
+	* NEWS: Updated.
+
+2014-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regex.h: Remove underscores in names of parameters in function
+	declarations. Tweak names as needed.
+
+2014-08-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* node.c (parse_escape): Max of 2 digits after \x.
+
+2014-08-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symbol.c: General formatting cleanup.
+
+2014-08-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (usage): Adjust whitespace for -L and add "invalid"
+	as a possible value for it.  Report from Robert P. J. Day
+	<rpjday@crashcourse.ca>.
+
+2014-08-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (SUBDIRS): Put awklib after doc so that examples
+	get extracted when the doc changes.
+
+2014-08-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_sub): Move initial allocation of the replacement
+	string down towards code to do the replacement, with a (we hope)
+	better guesstimate of how much to initially allocate. The idea
+	is to avoid unnecessary realloc() calls by making a better guess
+	at how much to allocate.  This came up in an email discussion
+	with Tom Dickey about mawk's gsub().
+
+2014-08-12         Juergen Kahrs <jkahrs@users.sourceforge.net>
+
+	* cmake/configure.cmake:
+	* cmake/package.cmake: Copyright update.
+	* README.cmake:
+	* README_d/README.cmake: Moved file.
+
+2014-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	OFS being set should rebuild $0 using previous OFS if $0
+	needs to be rebuilt. Thanks to Mike Brennan for pointing this out.
+
+	* awk.h (rebuild_record): Declare.
+	* eval.c (set_OFS): If not being called from var_init(), check
+	if $0 needs rebuilding. If so, parse the record fully and rebuild it.
+	Make OFS point to a separate copy of the new OFS for next time, since
+	OFS_node->var_value->stptr was already updated at this point.
+	* field.c (rebuild_record): Is now extern instead of static.
+	Use OFS and OFSlen instead of the value of OFS_node.
+
+	Unrelated:
+
+	* Makefile.am (RM): Define for makes that don't have it,
+	such as on OpenBSD.  Thanks to Jeremie Courreges-Anglas
+	<jca@wxcvbn.org> for the report.
+
+2014-08-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Bug fix: For MPFR sqrt(), need to set precision of result to be
+	the same as that of the argument. Doesn't hurt other functions.
+	See test/mpfrsqrt.awk. Thank to Katie Wasserman <katie@wass.net>
+	for the bug report.
+
+	* mpfr.c (do_mpfr_func): New function. Runs code for MPFR functions
+	while still enabling debugging. Add call here to mpfr_set_prec().
+	Original code from SPEC_MATH macro.
+	(SPEC_MATH): Change macro to call do_mpfr_func().
+
+	Next MPFR bug fix: The % operator gave strange results for negative
+	numerator. Thanks again to Katie Wasserman for the bug report.
+
+	* mpfr.c (mpg_mod): Use mpz_tdiv_qr() instead of mpz_mod(). From
+	the GMP doc, mpz_mod() should have worked; it's not clear why
+	it doesn't.
+
+2014-08-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (format_tree): Don't need to check return value of
+	wctombr for -2. Thanks to Eli Zaretskii for pointing this out.
+
+	Unrelated:
+
+	* gawkapi.h: Fix doc for API get_record - errcode needs to
+	be greater than zero.
+	* interpret.h (r_interpret): Move setting of ERRNO to here, from ...
+	* io.c (inrec): ... here. Makes the code cleaner.
+
+2014-08-03         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkgram.y (getfname): Match on either ptr or ptr2 so --profile
+	will work in -M (MPFR bignum) mode.
+
+2014-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (format_tree): Make %c handling more sane on Windows.
+	Rework the lint messages.
+
+	Unrelated:
+
+	* dfa.c: Sync with GNU grep. Mainly white space differences.
+
+	Unrelated:
+
+	* mpfr.c (cleanup_mpfr): New function to deallocate _mpf_t1
+	and _mpf_t2; removes some valgrind warnings.
+	* awk.h (cleanup_mpfr): Add declaration.
+	* main.c (main): Add call to `cleanup_mpfr'.
+
+	Fix memory leak:
+
+	* mpfr.c (do_mpfr_div): Add unref to denominator and numerator
+	to not leak memory. Thanks to Katie Wasserman <katie@wass.net>
+	for isolating the problem to that routine.
+
+2014-07-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (main): Add a warning message if -M is used and gawk was
+	compiled without MPFR/GMP.
+
+2014-07-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (usage): Put text for `-n' *after* text for `-m'.
+	Report from Robert P. J. Day <rpjday@crashcourse.ca>.
+
+	Fix problems with I/O errors reported by Assaf Gordon
+	<assafgordon@gmail.com>:
+
+	* io.c (inrec): Change type to bool to make calling easier. Add
+	check in non-EOF case for error, and if so, return false.
+	Update ERRNO in case there is an ENDFILE block.
+	* awk.h (inrec): Change type in declaration.
+	* interpret.h (r_interpret): Change call of inrec() to boolean
+	notation.
+
+2014-07-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	New `div()' function to do integer division and remainder;
+	mainly useful for use with GMP integers. Thanks to
+	Katie Wasserman <katie@wass.net> for the suggestion.
+
+	* awk.h (do_div, do_mpfr_div): Declare new functions.
+	* builtin.c (do_div): New function.
+	* mpfr.c (do_mpfr_div): New function.
+	* awkgram.y (tokentab): New entry.
+	(snode): Add check for do_div/do_mpfr_div to make 3rd arg
+	be an array.
+	* NEWS: Updated.
+	* TODO: Updated.
+
+2014-07-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (check_for_bad): New routine to do the fatal message,
+	with smarter checking.
+	(nextc): Call it as appropriate.
+
+	* builtin.c (format_tree): Add check for bad returns from mbrlen
+	to avoid trying to malloc (size_t) -1 bytes. Thanks to
+	mail.green.fox@gmail.com for the bug report.
+
+2014-07-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (nextc): Add bool check_for_bad parameter to check
+	for bad characters in the source program.
+	(yylex): Adjust calls.
+
+2014-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (main): The --pretty-print option no longer runs the
+	program.  This removes the need for the GAWK_NO_PP_RUN environment var.
+	* NEWS: Updated.
+	* TODO: Updated.
+
+2014-06-22         Paul Eggert          <eggert@penguin.cs.ucla.edu>
+
+	Bring in from GNULIB:
+
+	regex: fix memory leak in compiler
+	Fix by Andreas Schwab in:
+	https://sourceware.org/ml/libc-alpha/2014-06/msg00462.html
+	* lib/regcomp.c (parse_expression): Deallocate partially
+	constructed tree before returning error.
+
+2014-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_sub): Add more info to leading comment.
+	Add some whitespace in the code.
+
+2014-06-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2014-06-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (mbs_to_wchar): Define a macro if not MBS.
+
+2014-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2014-05-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (inetfile): Change return type to bool.  Wrap code
+	with ifdef HAVE_SOCKETS so that it'll compile on DJGPP.
+
+2014-05-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Allow any redirected getline inside BEGINFILE/ENDFILE.
+
+	* awkgram.y (LEX_GETLINE): Only require a redirection and not also
+	a variable if getline is in a BEGINFILE or ENDFILE rule.
+	* interpret.h (Op_K_getline_redir): Remove check and fatal error.
+
+2014-05-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (dfaexec): Minor sync with GNU grep.
+
+2014-05-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* custom.h (_GL_PURE): Move definition to here. Sigh.
+	* dfa.h, dfa.c: Sync with GNU grep. Sigh.
+
+	Unrelated:
+
+	* custom.h: Remove stuff for Ultrix 4.3. No one has such
+	systems anymore; this just got missed earlier.
+
+2014-05-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (do_eval): Repair fix of 2014-05-09 and use
+	assoc_remove to take @eval out of the function table.
+	* symbol.c: Fix a comment.  This file needs some work.
+
+2014-05-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (get_a_record): Finish TERMNEAREND handling in case
+	we don't have a regular file but aren't going to get more data.
+	Added some additional comments.
+
+2014-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (do_eval): Don't free `f' which points into the context
+	that was previously freed. Bug reported by Jan Chaloupka
+	<jchaloup@redhat.com>.  Apparently introduced with move to
+	SYMTAB and FUNCTAB, but only showed up on Fedora 20 and Ubuntu 14.04,
+	which have a newer glibc.
+	(do_eval): Fix a memory leak seen by valgrind on Fedora 20 and
+	Ubuntu 14.04: the new SRCFILE that is added wasn't released.
+
+	Unrelated:
+
+	* io.c (get_a_record): Handle return of TERMNEAREND when the
+	entire file has been read into the buffer and we're using a
+	regex for RS. Bug report by Grail Dane <grail69@hotmail.com>.
+
+2014-05-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (debug_prog): Change check for GAWK_RESTART so that it
+	actually works. Bug fix: run command in debugger would start
+	over again but not actually start running the program.
+
+2014-04-25         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (two_way_open): In forked child, reset SIGPIPE to SIG_DFL.
+	Fixes problems with "broken pipe" errors from child processes,
+	restoring 4.1.0 and earlier behavior. Thanks to Daryl F
+	<wyatt@prairieturtle.ca> for the report.
+	(gawk_popen): Ditto.
+
+2014-04-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Merge with GNU grep; lots of forward motion.
+
+2014-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Update xalloc.h for pending merge with dfa.
+
+	* xalloc.h (xstrdup): Implement this.
+	(x2nrealloc): Incorporate changed logic from GNULIB.
+
+2014-04-20         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (struct inet_socket_info): Define new structure
+	for use in parsing special socket filenames.
+	(inetfile): Parse all components of the special socket filename
+	into the struct inet_socket_info.  Returns true only if it is a
+	valid socket fliename, unlike the previous version which checked
+	for the '/inet[46]?/' prefix only.
+	(redirect): Patch to use updated inetfile() function.
+	(devopen): Remove logic to parse socket filenames, since this has
+	been moved into the inetfile() function.
+	(two_way_open): Update args to inetfile().
+
+2014-04-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_rand): Make calls to random() in predictable
+	order to avoid order of evaluation differences amongst compilers.
+	Thanks to Anders Magnusson <ragge@ludd.ltu.se> (of the PCC team)
+	for the suggestion.
+
+2014-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Change adding of -export-dynamic for GCC to be
+	-Wl,-export-dynamic, which then works for PCC also.
+
+2014-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (closemaybesocket): Define if not defined, e.g. building
+	without socket code. Thanks to dave.gma@googlemail.com (Dave Sines)
+	for the report.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README: Update.
+	* configure.ac: Bump version.
+
+2014-04-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c (parse_bracket_exp): Move a call to `re_free' inside
+	an ifdef. Makes the code marginally cleaner.
+
+2014-03-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2014-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Remove duplicate AC_HEADER_TIME and rearrange
+	order of macros some. May help on older systems.
+
+2014-03-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Move include of dfa.h around for correct building
+	on Irix. Thanks to Nelson H.F. Beebe for the report.
+
+	Unrelated:
+
+	* .gitignore: Simplify .dSYM pattern for Mac OS X.
+
+2014-03-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (using_simple_locale): Add ifdefs in case there is no
+	locale support at all. Thanks to Scott Deifik for the report.
+
+	Unrelated:
+
+	* main.c (UPDATE_YEAR): Set to 2014.
+
+2014-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* .gitignore: Add .dSYM directories for Mac OS X.
+	Thanks to Hermann Peifer for the suggestion.
+
+2014-03-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Sync with grep. Yet again.
+	* regex_internal.c (built_wcs_upper_buffer, build_upper_buffer):
+	Fixes from GNULIB for mixed case matching on Mac OS X.
+
+	Unrelated:
+
+	* builtin.c (format_tree): Smarten handling of %' flag. Always
+	pass it in for floating point formats. Then only add the
+	thousands_sep if there is one. Also, allow for thousands_sep
+	to be a string, not just one character.  Thanks to Michal Jaegermann
+	for the report.
+
+2014-03-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (api_impl): Add memory allocation function pointers.
+	* gawkapi.h (GAWK_API_MINOR_VERSION): Bump.
+	(gawk_api_t): Add memory allocation function pointers api_malloc,
+	api_calloc, api_realloc, and api_free.
+	(gawk_malloc, gawk_calloc, gawk_realloc, gawk_free): New macros.
+	(emalloc): Replace malloc with gawk_malloc.
+	(erealloc): Replace erealloc with gawk_erealloc.
+
+2014-03-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Straighten out enumerated types some more.
+
+	* awk.h (add_srcfile): Fix type of first parameter.
+	* awkgram.y (add_srcfile, do_add_srcfile): Ditto.
+	* cmd.h (A_NONE): New enum nametypeval.
+	* command.y (argtab): Use it in final value.
+	* ext.c (make_builtin): Use awk_false, awk_true.
+	* io.c (init_output_wrapper): Use awk_false.
+
+	Unrelated:
+
+	* debug.c (do_commands): Initialize num to silence warnings.
+	Thanks to Michal Jaegermann.
+
+	Unrelated:
+
+	* builtin.c (do_mktime): Change lint warning for minutes to
+	check against 59, not 60.  Thanks to Hermann Peifer for the report.
+
+2014-03-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with grep. Yet again.
+
+2014-02-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with grep. Looks like good improvement with
+	respect to bracket expressions.
+
+2014-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fixes for enum/int mismatches as warned by some compilers.
+
+	* awk.h (ANONE): New enum for array sorting.
+	* array.c (assoc_list): Use it.
+	* builtin.c (format_tree): New MP_NONE value.
+	* gawkapi.c: Use awk_false and awk_true everywhere instead of
+	false and true.
+
+2014-02-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Set up do-nothing extension/Makefile on
+	MirBSD also.
+
+2014-02-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.h, dfa.c (parse_bracket_exp): Sync with grep.
+
+2014-02-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regex.h, regex.c, regex_internal.c, regex_internal.h: Sync
+	with GLIBC. Mainly copyright updates.
+	* getopt.c, getopt.h, getopt1.c, getopt_int.h: Ditto.
+	* dfa.c (parse_bracket_exp): Sync with grep, where they restored
+	the buggy code.  Sigh.
+
+	Unrelated:
+
+	* NEWS: Typo fix.
+	* interpret.h (r_interpret): Init a variable for BEGINFILE to avoid
+	compiler warnings. Thanks to Michal Jaegermann.
+
+2014-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.c, command.c: Regenerated - Bison 3.0.2.
+
+2014-02-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (to_uchar): Make use of this. Syncs with GNU grep.
+
+2014-02-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (negate_num): Bracket `tval' in #ifdef MPFR since it's
+	only used in that code.
+
+2014-01-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dist-hook): Improve creation of pc/config.h. We
+	have to jump through a lot of hoops for 'make distcheck' to
+	actually work.
+
+2014-01-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dist-hook): Improve creation of pc/config.h to copy
+	the new file into the distribution directory being created.
+	Also, put the temporary files into /tmp.
+
+2014-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (negate_num): If just a double, return. Fixes a bug
+	that showed up on 32-bit systems with MPFR. Thanks to Eli Zaretskii
+	and Corinna Vinschen for the report.  Also, free the MPZ integer.
+	Thanks to valgrind for the report.
+
+	Unrelated:
+
+	* dfa.c: Sync with GNU grep - removed some special cased code
+	for grep.
+
+2014-01-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac, field.c: Update copyright year.
+
+2014-01-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (negate_num): Handle the case of -0 for MPFR; the sign
+	was getting lost. Thanks to Hermann Peifer for the report.
+
+2014-01-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (parse_bracket_exp): Sync with GNU grep, which now uses
+	gawk's code for RRI in single-byte locales!  Hurray.
+
+2014-01-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: For z/OS, restore creation of do-nothing
+	Makefile in extension directory.
+
+2014-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* field.c (do_split): Make sure split() gets FS value if no
+	third arg even after FPAT was set. Thanks to Janis Papanagnou
+	for the report.
+
+2014-01-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README: Fix John Malmberg's email address.
+
+2014-01-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y:  Update copyright year.
+	(func_use): Simplify code.
+	* command.y:  Update copyright year.
+	* ext.c:  Update copyright year.
+	(make_builtin): Small simplification.
+	(make_old_builtin): Make code consistent with make_builtin(), add
+	call to track_ext_func().
+	* bootstrap.sh: Update copyright year. Remove touch of version.c
+	since that file is no longer autogenerated.
+
+2014-01-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* command.y (next_word): Move into ifdef for HAVE_LIBREADLINE,
+	since it's only used by that code.
+	* ext.c (load_old_ext): Minor improvements.
+
+2014-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.rpath, config.sub, depcomp,
+	install-sh: Updated.
+	* dfa.h, dfa.c: Sync with GNU grep; comment fix and copyright year.
+	* NEWS: Updated some, including copyright year.
+
+2013-12-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README: Add John Malmberg for VMS.
+
+2013-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* getopt.h: Add `defined(__sun)' to list of system that do get to
+	include stdlib.h.  Needed for Illumos. Thanks to
+	Richard Palo <richard.palo@free.fr> for the report.
+
+2013-12-21         Mike Frysinger        <vapier@gentoo.org>
+
+	* configure.ac: Add --disable-extensions flag to control
+	compiling extensions.  Better for cross-compiling.
+	(AC_CANONICAL_HOST): Added. Changed case statements appropriately.
+	* Makefile.am (check-for-shared-lib-support): Removed.
+	(check-recursive, all-recursive): Removed.
+
+2013-12-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated.
+	* configure, aclocal.m4: Updated based on automake 1.13.4.
+
+2013-12-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regexec.c (re_search_internal): Make sure `dfa' pointer is
+	not NULL before trying to dereference it.
+
+2013-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (AC_FUNC_VPRINTF): Remove. Not needed on current
+	systems.
+	* awk.h (HAVE_VPRINTF): Remove check.
+
+2013-12-12         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* io.c (redirect): Add additional VMS error codes.
+	(nextfile): Retry open after closing some files.
+
+2013-12-10         Scott Deifik          <scottd.mail@sbcglobal.net>
+
+	* io.c (closemaybesocket): Add definition for DJGPP.
+
+2013-12-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (Floor, Ceil): Remove declarations and VMS redefinitions.
+	* floatcomp.c (Floor, Ceil): Removed, not needed. Move bracketing
+	ifdef to the top of the file.
+	* builtin.c (double_to_int): Use floor() and ceil().
+
+2013-12-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regex_internal.h (__attribute__): Define to empty if not GCC.
+	* custom.h (__attribute__): Remove the definition from here; the
+	right place was regex_internal.h.
+
+2013-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	No need to generate version.c from version.in.
+	Thanks to John E. Malmberg <wb8tyw@qsl.net> for the suggestion.
+
+	* version.in: Removed.
+	* version.c: Use PACKAGE_STRING directly.
+	* Makefile.am (EXTRA_DIST): Remove version.in.
+	(distcleancheck_listfiles): Remove this rule.
+	(MAINTAINERCLEANFILES): Remove this definition.
+	(version.c): Remove the rule to create it.
+
+2013-12-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fixes for Z/OS.
+
+	* custom.h (__attribute__): Define to empty.
+	* dfa.c (parse_bracket_exp): Add a cast to quiet a warning.
+	* regex.c: Correctly bracket include of <sys/param.h>.
+
+	Unrelated:
+
+	* debug.c (find_rule): Add a FIXME comment.
+
+2013-12-03         John E. Malmberg	<wb8tyw@qsl.net>
+
+	* io.c (redirect): Add additional VMS error code to check.
+	(do_find_source): Append "/" if not a VMS filename.
+
+2013-12-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* main.c (optab): Sort by long option name.
+
+2013-11-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* main.c (optab): Add entry for --include.
+
+2013-11-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Merge from grep; minor fixes in how bit twiddling
+	is done.
+
+2013-11-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (lex): Reset laststart so that stuff like \s* works.
+	Fix from grep.
+
+2013-10-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (efwrite): If write error to stdout is EPIPE,
+	die silently.  Thanks to Hermann Peifer for helping find this.
+
+2013-10-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Revise error messages when writing to standard output or standard
+	error to ignore EPIPE.  Add the ability based on an environment
+	variable to get the source file and line number.
+
+	* awk.h (r_warning): Renamed from warning.
+	(warning): New macro to set location and call warning.
+	* io.c (flush_io): Print errors only if not EPIPE.
+	(close_io): Ditto.
+	* main.c (lintfunc): Init to r_warning.
+	(main): Enhance explanatory comment.
+	(usage): Print errors only if not EPIPE.
+	(copyleft): Ditto.
+	* msg.c (err): Make printing srcfile and srcline depend upon
+	GAWK_MSG_SRC environment variable.
+	(r_warning): Renamed from warning.
+
+2013-10-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (main): Ignore SIGPIPE. See the comment in the code.
+	Thanks to Alan Broder for reporting the issue.
+
+	Unrelated:
+
+	* rand.c (do_rand): Fix computation and loop checking against
+	1.0 to use do..while.
+
+2013-10-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Make -O work again.  Turns out that C99 bool variables
+	are clamped to zero or one.
+
+	* main.c (do_optimize): Init to false.
+	(main): Set do_optimize to true on -O.
+	* eval.c (setup_frame): Change all uses of do_optimize to be
+	a boolean check instead of a test > 1.
+	* awkgram.y: Ditto.
+	(optimize_assignment): Remove check against do_optimize since
+	it was inited to true anyway.
+
+	Unrelated:
+
+	* re.c (resetup): Add a comment about the joy of syntax bits.
+
+	Unrelated:
+
+	* builtin.c (do_rand): If result is exactly 1.0, keep trying.
+	Thanks to Nelson Beebe.
+
+2013-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (lex): Sync with GNU grep. Handle multibyte \s and \S.
+
+	Unrelated:
+
+	* awk.h [ARRAY_MAXED]: Fix value of this and subsequent flags
+	after addition of NULL_FIELD.
+	* eval.c (flags2str): Add NULL_FIELD. Duh.
+
+2013-10-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (mk_assignment): Rework switch to handle Op_assign,
+	and to provide a better error message upon unknown opcode.
+
+2013-09-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2013-09-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_rand): Make the result more random by calling
+	random() twice. See the comment in the code. Thanks to
+	Bob Jewett <jewett@bill.scs.agilent.com> for the report and
+	the fix.
+
+2013-09-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (find_rule): Handle case where lineno is zero. Can happen
+	if break is given without a line number on a current line. Thanks
+	to Ray Song <i@maskray.me> for the report.
+
+2013-09-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (parse_bracket_exp): Use code from grep to keep things within
+	range (updates change of 2013-09-08). Fix whitespace in one of the
+	gawk-only additions.
+
+2013-09-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix use of NF after it's extended, e.g. see test/nfloop.awk.
+
+	* awk.h (NULL_FIELD): New flag
+	* builtin.c (do_print_rec): Check f0->flags instead of if
+	equal to Nnull_string.
+	* eval.c (r_get_field): Check (*lhs)->flags instead of if
+	equal to Nnull_string or Null_field.
+	* field.c (init_fields): Init field zero and Null_field with
+	NULL_FIELD flag.
+	(set_NF): Set parse_high_water = NF in case NF extended past the
+	end. This is the actual bug fix.
+
+2013-09-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fixes based on reports from a static code checker. Thanks to
+	Anders Wallin for sending in the list.
+
+	* array.c (asort_actual): Free list if it's not NULL.
+	* builtin.c (do_sub): Set buf to NULL and assert on it before using
+	it.
+	* cint_array.c (cint_array_init): Clamp any value of NHAT from the
+	environment such that it won't overflow power_two_table when used as
+	an index.
+	* dfa.c (parse_bracket_exp): Check that len is in range before using it
+	to index buf.
+	* getopt.c (_getopt_internal_r): Change call to alloca to use malloc.
+	* io.c (socket_open): Init read_len to zero.
+	(two_way_open): Upon failure to fork, close the slave fd also.
+	* re.c (research): Init try_backref to false.
+	* regcomp.c (build_range_exp): Free any items that were allocated in
+	the case where not all items were.
+	(build_charclass_op): Same. Init br_token to zero with memset.
+	(create_tree): Init token t to zero with memset.
+	* regex_internal.c (re_dfa_add_node): Free any items that were
+	allocated in the case where not all items were.
+	* symbol.c (destroy_symbol): On default, break, to fall into releasing
+	of resources.
+
+2013-08-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (HAVE_HISTORY_LIST): Move checks and defines to the top.
+	(do_save, serialize): Adjust #if checks to depend on having both
+	readline and the history functions. Needed for Mac OS X whose
+	native readline is a very old version. Sigh.
+	* configh.in, configure: Regenerated due to change in m4/readline.m4.
+	Issue reported by Hermann Peifer and Larry Baker.
+
+	Unrelated:
+
+	* getopt.c: Sync with GLIBC, changes are minor.
+
+	Unrelated:
+
+	* dfa.c: Sync with version in grep. Primarily whitespace / comment
+	wording changes.
+
+2013-08-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c (parse_dup_op): Remove RE_TOKEN_INIT_BUG code (change of
+	Feb 19 2005) since it's no longer needed.
+
+	* regcomp.c (re_fastmap_iter): Undo addition of volatile from
+	Jan 18 2007; no longer needed and is one less change to have to
+	maintain against the upstream.
+
+	* regcomp.c, regex.h, regex_internal.h: Sync with GLIBC.
+
+2013-08-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* str_array.c (env_store): If the new value being stored is NULL,
+	pass in "" instead. Avoids core dump on Mac OS X.
+	Thanks to Hermann Peifer for the bug report.
+
+2013-08-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nonposix.h: New file. Contains FAKE_FD_VALUE.
+	* awk.h: Include it if MinGW or EMX.
+	* Makefile.am (base_sources): Add nonposix.h.
+
+2013-08-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Reflect updates to ENVIRON into the real environment.
+
+	* awk.h (init_env_array): Add declaration.
+	* main.c (load_environ): Call init_env_array.
+	* str_array.c (env_remove, env_store, env_clear, init_env_array):
+	New functions.
+	(env_array_func): New array vtable.
+
+2013-08-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* array.c (force_array): Set symbol->xarray to NULL before
+	initing the array if it was Node_var_new.
+	(null_array): Restore assert, undoing change of 2013-05-27.
+
+2013-08-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (print_memory): Fix whitespace / indentation.
+
+2013-08-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (append_rule): Add attempt to insert any comment
+	before a rule. Commented out at the moment.
+
+2013-07-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (enum opcodeval): Add Op_comment.
+	* awkgram.y (comment): New variable to hold comment text.
+	(statement): Add saved comments to lists being built.
+	(allow_newline): Save comment text if necessary. Append if have
+	existing text.
+	(yylex): Ditto.
+	* debug.c (print_instruction): Handle Op_comment.
+	* eval.c (optypes): Add entry for Op_comment.
+	* interpret.h (r_interpret): Ditto.
+	* profile.c (pprint): For Op_comment, print the comment text.
+
+2013-07-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (FAKE_FD_VALUE): Move definition from here ...
+	* awk.h (FAKE_FD_VALUE): ... to here. Fixes compilation on MinGW.
+
+2013-07-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (get_a_record): Change `min' to `MIN' for consistency with
+	other files and general practice.
+
+2013-07-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac (AC_CHECK_FUNCS): Check for sigprocmask.
+	* io.c (wait_any): If sigprocmask is available, block signals instead
+	of ignoring them temporarily.
+
+2013-07-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (gawk_api): Document that the api_get_file function will not
+	access the file type and length arguments if the file name is empty.
+
+2013-07-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac (AC_CHECK_FUNCS): Add a check for waitpid.
+	* io.c (wait_any): Enhance comment to explain why we loop reaping all
+	exited children when the argument is zero.  When available, use waitpid
+	with WNOHANG to avoid blocking.  Remove my previous incorrect patch to
+	exit after reaping the first child.  The function is intended to
+	wait for all children, since we are not careful about reaping children
+	as soon as they die.
+
+2013-07-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (gawk_api): Remove unused api_lookup_file hook.
+	(lookup_file): Remove associated macro.
+	* gawkapi.c (api_lookup_file): Remove unused function.
+	(api_impl):  Remove unused api_lookup_file hook.
+
+2013-07-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkgram.y (main_beginfile): Declare new global INSTRUCTION *.
+	(parse_program): Set main_beginfile to point to the BEGINFILE
+	instruction block.
+	* gawkapi.c (api_get_file): After nextfile starts a new file,
+	we need to run the BEGINFILE actions.  We retrieve the
+	instruction pointer from main_beginfile and execute it until
+	we reach the Op_after_beginfile opcode.  We then run after_beginfile
+	manually and restore the value of currule and source.
+
+2013-07-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (awk_element_t): Add comment indicating that the array
+	element index will always be a string!
+	* gawkapi.c (api_flatten_array): When converting the index to an awk
+	value, request a string conversion, since we want the indices to
+	appear as strings to the extensions.  This makes the call to
+	force_string redundant, since node_to_awk_value does that internally
+	when we request a string.
+
+2013-07-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* eval.c (update_ERRNO_string): Set PROCINFO["errno"] to 0.
+	* io.c (inrec): Since get_a_record may now return -2, be sure
+	to throw an error in that case as well.
+	(wait_any): Fix what appears to be a bug.  The old logic repeatedly
+	called wait until it failed.  When a process has multiple children,
+	this causes it to stall until all of them have exited.  Instead,
+	we now exit the function after the first successful wait call.
+	(do_getline_redir, do_getline): Handle case where get_a_record
+	returns -2.
+	(errno_io_retry): New function to decide whether an I/O operation should
+	be retried.
+	(get_a_record): When read returns an error, call errno_io_retry to
+	decide whether the operation should be retried.  If so, return -2
+	instead of setting the IOP_AT_EOF flag.
+
+2013-07-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* eval.c (update_ERRNO_int, unset_ERRNO): Update PROCINFO["errno"].
+
+2013-06-30         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (redirect_string): Declare new function that provides API access
+	to the redirection mechanism.
+	* gawkapi.h (GAWK_API_MINOR_VERSION): Bump from 0 to 1 since 2 new
+	hooks were added to the api.
+	(gawk_api_t): Add 2 new functions api_lookup_file and api_get_file.
+	(lookup_file, get_file): New macros to wrap the new API functions.
+	* gawkapi.c (curfile): Declare this extern, since it is needed
+	by lookup_file and get_flie.
+	(api_lookup_file): Find an open file using curfile or getredirect().
+	(api_get_file): Find or open a file using curfile or redirect_string().
+	(api_impl): Add api_lookup_file and api_get_file.
+	* io.c (redirect_string): Renamed from redirect and changed arguments
+	to take a string instead of a 'NODE *'.  This allows it to be called
+	through the API's new get_file hook.
+	(redirect): Now implemented by calling redirect_string backend function.
+
+2013-07-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (format_tree): Fixes for %c with multibyte characters
+	and field width > 1. Bugs reported by Nethox <nethox@gmail.com>.
+
+2013-07-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pp_string): Add a call to chksize and fix another.
+	Avoids valgrind errors on profile5 test. Thanks to Andrew
+	Schorr for the report.
+
+2013-06-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y: Minor whitespace cleanup, remove redundant ifdef.
+
+2013-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (copytoks): Rewrite to call addtok_mb() directly. Avoids
+	problems with multibyte characters inside character sets.
+	Thanks to Steven Daniels <stevendaniels88@gmail.com> for reporting
+	the problem.  Much thanks to Mike Haertel <mike@ducky.net> for the
+	analysis and fix.
+
+2013-06-24  Eli Zaretskii  <eliz@gnu.org>
+
+	* io.c: Move #include "popen.h" out of the HAVE_SOCKETS condition,
+	as this is needed for non-sockets builds as well.  See
+	http://lists.gnu.org/archive/html/bug-gawk/2013-06/msg00014.html
+	for the details of the problem this caused.
+
+2013-06-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c: Add ifdefs for VMS so that it will compile again.
+	Thanks to Anders Wallin.
+
+2013-06-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (print_lines): Move setting of binary mode to after all
+	the messing with the fd. Simplifies code some.
+	* io.c (srcopen): Rearrange so that can add call to setbinmode
+	here too. This fixes the debugger and makes reading source
+	files a little faster. Thanks again to Corinna Vinschen.
+
+2013-06-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (print_lines): Set binary mode so that calculation of the
+	byte offsets will be right. Thanks to Corinna Vinschen for the
+	direction.
+
+2013-06-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* re.c (check_bracket_exp): Remove warning about ranges being
+	locale dependent, since they aren't anymore.
+
+2013-06-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (iop_finish): Change fstat call to fcntl/F_GETFL per
+	Eli Z., for Windows.
+
+2013-06-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* eval.c (unwind_stack): If exiting, don't worry about strange stuff
+	on the stack.
+
+	Unrelated:
+
+	* awk.h (init_sockets): Declare.
+	* io.c (init_io): Remove ifdef around call.
+
+2013-06-01  Eli Zaretskii  <eliz@gnu.org>
+
+	* io.c (SHUT_RD) [SD_RECEIVE]: Define to SD_RECEIVE.
+	(SHUT_WR) [SD_SEND]: Define to SD_SEND.
+	(SHUT_RDWR) [SD_BOTH]: Define to SD_BOTH.
+	(FD_TO_SOCKET, closemaybesocket) [!FD_TO_SOCKET]: New macros.
+	(SOCKET_TO_FD, SOCKET) [!SOCKET_TO_FD]: New macros.
+	(PIPES_SIMULATED): Define only for DJGPP.
+	(pipe) [__MINGW32__]: Define to call _pipe, unless PIPES_SIMULATED
+	is defined.
+	(init_io) [HAVE_SOCKETS]: Call init_sockets.
+	(iop_close, socketopen): Call closemaybesocket instead of close.
+	(redirect) [__MINGW32__]: Call wait_any with a non-zero argument.
+	(devopen) [__EMX__ || __MINGW32__]: Don't call stat on network
+	pseudo-filenames.
+	(two_way_open) [HAVE_SOCKETS]: Switch input and output to binary
+	mode if appropriate.
+	(two_way_open) [!PIPES_SIMULATED]: Use the __EMX__ code for MinGW
+	as well.
+	[__MINGW32__] Call spawnl to invoke $ComSpec and pass it a
+	suitably quoted command line.
+	(two_way_open) [__MINGW32__]: Wait only for a specified process
+	ID.  If successful, update the exit status of the exited process.
+	Don't use signals that are undefined on MinGW.
+	(two_way_open) [!PIPES_SIMULATED]: Use the __EMX__ code for MinGW
+	as well.
+	(min): Define only if not already defined.
+	(read_with_timeout) [__MINGW32__]: Allow reading from sockets with
+	timeout.
+	(gawk_fclose) [__MINGW32__]: Close the underlying socket as well.
+
+	* getopt.c: Include stdlib.h for MinGW as well.
+
+2013-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	More profiling fixes:
+
+	* profile.c (pprint): For Op_in_array, parenthesize subscript if
+	the precedence is lower. E.g.:  (c = tolower(foo)) in ARRAY.
+	(prec_level): Merge cases for precedence of 5.
+	(parenthesize): Simplify, as in 3.1.8. Avoids stuff like
+	`(x == 1 && (z ==2 && (q == 4 && w == 7)))'.
+
+	Unrelated:
+
+	* io.c (iop_finish): fstat the fd before closing it to avoid
+	errors on some operating systems. Thanks to Eli Zaretskii
+	for the report.
+
+2013-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (pp_group3): Renamed from pp_concat. Change all calls.
+	(is_binary): Change return type to bool.
+	(is_scalar): New function.
+	(pp_concat): New function to handle concatenation operator better.
+	(pprint): Call it at case Op_concat. Fix Op_K_delete if multiple
+	indexes to separate with "][".
+	General: Add leading comments as needed.
+
+2013-05-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (main): Add minor hack to not run code if pretty printing
+	and undocumented env var GAWK_NO_PP_RUN exists.
+	* profile.c (pp_string): Explicitly print NUL chars as \000.
+
+2013-05-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (AM_INIT_AUTOMAKE): Add dist-lzip to quiet
+	outside maintainer warnings.
+
+	Unrelated:
+
+	* configure.ac (AC_STRUCT_ST_BLKSIZE): Replaced with call to
+	AC_CHECK_MEMBERS.
+
+	Unrelated:
+
+	* array.c (null_array): Remove the assert and just clear
+	symbol->xarray.
+
+2013-05-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* getopt.c: For Mac OS X, also include <stdlib.h> to avoid
+	some compiler warnings.
+
+2013-05-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h [FAKE_FD_VALUE]: Moved from here to ...
+	* io.c [FAKE_FD_VALUE]: here.
+
+2013-05-14  Eli Zaretskii  <eliz@gnu.org>
+
+	* io.c (devopen) [__EMX__ || __MINGW32__]: Produce EISDIR on MinGW
+	when an attempt to open() a directory fails.
+	(two_way_open) [__EMX__ || __MINGW32__]: When trying to open() a
+	directory fails with EISDIR, assign FAKE_FD_VALUE to the file
+	descriptor and attributes of a directory to its mode bits.  This
+	is needed to support the readdir extension.
+
+	* gawkapi.h (FAKE_FD_VALUE): New macro, used in io.h and in
+	extension/gawkdirfd.h.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (snode): Make it a fatal error to use a regexp constant
+	as the second argument of index(). Thanks to Christopher Durant
+	<christopher.durant@marquesa.net> and Brian Kernighan for the report
+	and the advice.
+
+2013-04-28  Eli Zaretskii  <eliz@gnu.org>
+
+	* io.c (redirect): Remove the HACK that called close_one when
+	errno was zero in the MinGW build.  This prevents failure in
+	several tests in the test suite, e.g., closebad.
+
+2013-04-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* bootstrap.sh: Fix a comment.
+
+2013-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (do_getline_redir): Fix the leading comment.
+
+2013-04-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (load_procinfo): Add PROCINFO entries for API major
+	and minor versions.
+
+2013-04-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* missing: Update from Automake 1.13.1.
+
+2013-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Fix a typo.
+
+2013-04-17         Corinna Vinschen      <vinschen@redhat.com>
+
+	* configure.ac: Remove special casing for cygwin for libiconv
+	and libintl.
+
+2013-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* bootstrap.sh: Touch gawk.texi too. Update copyright.
+
+2013-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.c: Regenerated from bison 2.7.1.
+	* command.c: Ditto.
+	* dfa.h, dfa.c: Minor edits to sync with GNU grep.
+	* gettext.h: Sync with gettext 0.18.2.1.
+	* random.h: Remove obsolete __P macro and use. Update copyright year.
+	* Makefile.am, array.c, builtin.c, cint_array.c, cmd.h, debug.c,
+	eval.c, ext.c, field.c, gawkapi.c, gawkapi.h, gettext.h, int_array.c,
+	interpret.h, msg.c, node.c, profile.c, re.c, replace.c, str_array.c,
+	symbol.c: Update copyright year.
+
+	Update to automake 1.13.1:
+
+	* configure.ac (AM_INIT_AUTOMAKE): Update version.
+	* configure, Makefile.in, aclocal.m4, awklib/Makefile.in,
+	doc/Makefile.in, test/Makefile.in: Regenerated.
+
+	* getopt.c, getopt.h, getopt1.c, getopt_int.h: Sync with GLIBC.
+
+2013-04-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (check_funcs): Fix logic of test for called but
+	not defined warning. Thanks to Scott Deifik for the bug report.
+
+2013-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.c (print_lib_list): Send final newline to prof_fp
+	instead of stdout.  Thanks to Hermann Peifer for the bug report.
+
+2013-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (SUBDIRS): Move extension back into the middle of
+	the list so that `make check' without a prior `make' works.
+
+	Unrelated:
+
+	* main.c (main): Move env_lc into ifdef for LIBC_IS_BORKED.
+
+2013-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	For systems where libc is borked (MirBSD, maybe others).
+
+	* dfa.c: Force use of gawk_mb_cur_max instead of MB_CUR_MAX and make
+	mbrtowc a macro that always fails.
+	(using_utf8): Force utf8 to be 0 if libc borked and gawk_mb_cur_max
+	is one.
+	* main.c (main): If libc is borked and LC_ALL or LANG exist in the
+	environment and are set to "C" or "c", force gawk_mb_cur_max to one.
+
+2013-03-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* re.c (check_bracket_exp): Make handling of embedded ] in
+	regexp smarter. Thanks to Ed Morton <mortoneccc@comcast.net>
+	for reporting the bug.
+
+2013-03-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Don't build extensions if API isn't supported:
+
+	* Makefile.am (SUBDIRS): Move extension directory to last in case
+	building the extensions is not supported.
+	* configure.ac: Add check for MirBSD and don't even try to run the
+	checks for DYNAMIC if so.
+
+	Check for systems (MirBSD) where libc doesn't understand not
+	to use UTF-8 for LC_ALL=C.
+
+	* configure.ac (LIBC_IS_BORKED): AC_DEFINE if needed.
+	* regcomp.c (init_dfa): Change logic as needed if LIBC_IS_BORKED.
+
+2013-02-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Cause profiling / pretty printing to include a list of
+	loaded extensions. Thanks to Hermann Peifer for the bug report.
+
+	* awk.h (srcfiles): Add declaration.
+	* profile.c (print_lib_list): New function.
+	(dump_prog): Call it.
+
+2013-02-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (expression_list): In case of error return the list
+	instead of NULL so that snode gets something it can count.
+
+2013-02-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* bisonfix.awk: Comment out code for fixing continued #if
+	statements. It is likely not needed anymore. Leave it there in
+	case I'm wrong.
+
+2013-02-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (printf_common): Move nargs > 0 check into assert.
+	(do_sprintf): Add nargs check and fatal message to here.
+
+2013-02-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (main): Remove undocumented -m option which was for
+	compatibility with BWK awk. His awk dropped it back in 2007.
+
+2013-02-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add Automake test for cross compiling.
+
+2013-01-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c, regex.c, regex_internal.c, regexec.c: Update
+	copyright years to sync with GLIBC.
+
+	From: http://www.sourceware.org/ml/libc-alpha/2013-01/msg00967.html,
+	by Andreas Schwab <schwab@suse.de>:
+
+	* regexec.c (extend_buffers): Add parameter min_len.
+	(check_matching): Pass minimum needed length.
+	(clean_state_log_if_needed): Likewise.
+	(get_subexp): Likewise.`
+
+2013-01-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Include "dfa.h" which includes regex.h after limits.h
+	so that RE_DUP_MAX gets the correct value. Especially needed on
+	OpenVMS. Thanks to Anders Wallin.
+
+	* main.c (version): Print out API version numbers if DYNAMIC.
+	Helpful also for knowing if to run the shlib tests.
+
+	* configure: Regenerated after change in m4/readline.m4.
+
+2013-01-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* PROBLEMS: Removed. It is no longer needed.
+	* Makefile.am (EXTRA_DIST): Remove PROBLEMS from list.
+
+2013-01-31         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac: Remove TEST_MPFR conditional added in last patch.
+	We will instead test for MPFR capability by looking at the output
+	from gawk --version.
+
+2013-01-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac: Add MPFR test for use in test/Makefile.am.
+
+2013-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (parms_shadow): Change int param to bool.
+	* cmd.h (output_is_tty): Sync type with rest of code (is bool).
+	* dfa.c (MALLOC): Undef first, for Irix.
+	* Makefile.am (LDADD): Use LIBREADLINE and LIBMPFR instead of
+	automake substitutions.
+	* configure.ac (AC_INIT): Version bump.
+	(GAWK_CHECK_READLINE): Renamed from GNUPG_CHECK_READLINE.
+
+2013-01-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (list_functions): Change parameter to bool.
+	* symbol.c (list_functions): Ditto.
+	(get_symbols): Change sort parameter to bool. Additional
+	code cleanup.
+
+2013-01-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symbol.c (get_symbols): Reset count after each loop to only
+	sort the actual items retrieved. Thanks to Hermann Peifer (by
+	way of Andrew Schorr) for reporting the bug.  Also add some
+	commentary and fix function name in emalloc calls.
+
+2013-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* re.c (regexflags2str): New routine.
+	(resetup): If do_intervals, also turn on RE_NO_BK_BRACES.
+	Thanks to Yan Lei <yanl.fnst@cn.fujitsu.com> for the
+	bug report.
+
+2013-01-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix a problem with include ordering to get ptrdiff_t definition,
+	showed up on Debian Lenny. Reported by Manuel Collado.
+	Fix brought over from grep.
+
+	* dfa.h: Include regex.h and stddef.h directly.
+	* dfa.c: Adjust includes.
+
+2013-01-11         John Haque            <j.eh@mchsi.com>
+
+	* awk.h (do_mpfr_rshift): Renamed from do_mpfr_rhift.
+	* awkgram.y (do_mpfr_rshift): Renamed from do_mpfr_rhift.
+	* mpfr.c (_tz1, _tz2, _mpz1, _mpz2, mpz1, mpz2, get_bit_ops,
+	free_bit_ops): Removed.
+	(init_mpfr): Remove calls to mpz_init.
+	(get_intval, free_intval): New functions.
+	(do_mpfr_rshift, do_mpfr_lshift): Rework code.
+	(do_mpfr_and, do_mpfr_or, do_mpfr_xor): Accept two or more arguments
+	to match regular functions.
+
+2013-01-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* bisonfix.awk: Adjust ARGV / ARGC to force reading of standard
+	input; apparently needed for Mac OS X. Thanks to Akim Demaille
+	for the report.
+
+2013-01-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (redirect, two_way_open): Set the name field in the
+	awk_input_buf_t and awk_output_buf_t structures, as needed.
+	Thanks to Manuel Collado for the report.
+
+2013-01-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regex_internal.h (struct re_dfa_t): Restore ifdefs around
+	__libc_lock_define, they really were needed. Bleah.
+
+2013-01-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Sync with GLIBC regex files.
+
+	* regex_internal.h (struct re_dfa_t): Remove ifdefs around
+	__libc_lock_define since it's already defined to empty in non-LIBC
+	case.
+	* regexec.c (check_node_accept_bytes): Restore decl with use from
+	GLIBC code since this is LIBC case.
+
+2012-12-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_print, do_printf): Use output_fp as default
+	output for print/printf only if running under the debugger.
+	Otherwise use stdout as Brian, Peter, and Al intended.
+
+2012-12-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove sym-constant from API after discussions with John
+	Haque and Andrew Schorr.
+
+	* gawkapi.h (api_sym_constant): Removed field in API struct.
+	(sym_constant): Remove macro.
+	* gawkapi.c (set_constant, api_sym_update, api_sym_constant): Removed.
+	(sym_update_real): Renamed to api_sym_update(). is_const parameter
+	removed and code adjusted.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-12-23         John Haque      <j.eh@mchsi.com>
+
+	* eval.c (r_get_lhs): Node_array_ref. If original is Node_var,
+	don't assign null-string as value.
+	* ext.c (get_argument): Node_array_ref. Check if already a scalar.
+
+2011-12-23         John Haque      <j.eh@mchsi.com>
+
+	* awkgram.y (is_deferred_variable): New function.
+	(func_install): Call it.
+	* eval.c (r_interpret): Op_push_arg. Check for uninitialized scalar.
+
+2012-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (tokentab): Whitespace fix for "include".
+	* builtin.c (printf_common): Do a fatal error if no args to printf()
+	or sprintf().
+
+2012-12-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* bootstrap.sh: Touch extension/aclocal.m4 also.
+
+	Unrelated: Extend input parser API:
+
+	* awk.h (IOBUF): Remove read_func pointer.
+	* gawkapi.h (awk_input_buf_t): Move it to here.
+	* io.c (iop_alloc, get_a_record, get_read_timeout): Adjust code.
+
+	Unrelated: Make sure that variables like NF, NR, FNR are
+	accessable correctly both through SYMTAB and through API.
+
+	* gawkapi.c (api_sym_lookup): Call update_global_values().
+	(api_sym_lookup_scalar): Ditto.
+	* interpret.h (Op_subscript, Op_subscript_lhs): Ditto.
+	* main.c (update_global_values): Adjust comment.
+
+	Unrelated: Fix --disable-lint so that everything compiles.
+
+	* main.c (main): Move case label inside ifdef.
+	* awkgram.y (isnoeffect): Add ifdefs around declaration, use,
+	and function body.
+
+	Unrelated: Restore building with tcc.
+
+	* awk.h (AFUNC): Move to array.c which is the only place its used.
+	(ainit_ind, atypeof_ind, etc.): New macros for use in array.c
+	* array.c (AFUNC): Change to use F##_ind. Works with tcc and other
+	compilers.
+	* configure.ac: Only add -export-dynamic flag if compiling with gcc.
+
+2012-12-18         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (sym_update_real): If setting a scalar variable that exists
+	already in an undefined state with type set to Node_var_new, we must
+	update the type to Node_var if the new value is not undefined.
+
+2012-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (tokentab): "extension" needs to be inside ifdef DYNAMIC.
+	Thanks to Anders Wallin for finding this.
+
+2012-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* debug.c (do_set_var): Fix last remaining `*assoc_lookup() = x'.
+
+2012-12-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Infrastructure Updates:
+
+	* awkgram.c, command.c: Regenerated with bison 2.7.
+	* config.guess, config.sub, depcomp: Updated from automake 1.12.6.
+
+2012-12-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Clean up BINMODE to use symbolic values.
+
+	* awk.h (enum binmode_values): New enum.
+	* eval.c (set_BINMODE): Use them.
+	* io.c (binmode, close_rp, gawk_popen): Ditto.
+	* main.c (main): Ditto.
+	* builtin.c (do_system): Ditto.
+
+	Unrelated:
+
+	* configure.ac: Look for posix_openpt
+	* io.c (two_way_open): Use posix_openpt if it's available.
+	Thanks to Christian Weisgerber <naddy@mips.inka.de> for
+	the changes.
+
+	Also unrelated:
+
+	* regex.c: Don't include <sys/param.h> on VMS. Thanks to
+	Anders Wallin.
+
+	Also unrelated:
+
+	* ext.c (is_letter, is_identifier_char): New functions. Don't use
+	<ctype.h> functions since those could rely on the locale.
+	(make_builtin): Adjust test for valid name to call the new
+	functions and return false instead of throwing a fatal error.
+	(make_old_builtin): Adjust test for valid name to call the new
+	function.
+	* awk.h (is_identchar): Move from here, ...
+	* awkgram.y (is_identchar): ... to here. This is safe, since
+	the locale is C during parsing the program.
+
+	Also unrelated: Make all checks for bitflags being set consistent
+	in case we should wish to switch them to macro calls:
+
+	* awkgram.y, builtin.c, cint_array.c, debug.c, eval.c, gawkapi.c,
+	int_array.c, io.c, mpfr.c, node.c, profile.c, str_array.c: Fix
+	as needed.
+
+2012-12-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (tokentab): `fflush()' is now in POSIX, remove the
+	RESX flag. This was the last use, so delete the flag.
+	(yylex): Don't check RESX.
+
+	Thanks to Nathan Weeks <weeks@iastate.edu> for helping make this
+	happen.
+
+2012-12-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* interpret.h: For op_assign_concat, if both strings
+	have WSTRCUR, then do the realloc() and append for the
+	wide string too.  Thanks to Janis Papanagnou
+	<janis_papanagnou@hotmail.com> for the discussion in
+	comp.lang.awk.
+
+2012-11-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c, regex.c, regex_internal.h, regexec.c: Sync
+	with GLIBC.  Why not.
+
+	* gawkapi.c (awk_bool_t): Change into an enum with awk_false and
+	awk_true values.
+
+2012-01-30         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Further cleanups of macros in awk.h
+
+	* awk.h (_r, _t): Remove declarations.
+	(unref, m_force_string): Remove macros.
+	(r_unref): Move declaration.
+	(r_force_string): Remove declaration.
+	(DEREF, force_string, force_number, unref): Now inline functions.
+	(POP_STRING, TOP_STRING): Back to macros.
+	* eval.c (_t): Remove definition.
+	* main.c (_r): Remove definition.
+	* node.c (r_force_string): Remove.
+
+2012-11-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_fflush): Make fflush() and fflush("") both
+	flush everything. See the comment in the code.
+
+2012-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (Node_old_ext_func, Op_old_ext_func): New enum values.
+	* configure.ac: Use -export-dynamic if supported for old extension
+	mechanism.
+	* eval.c (nodeytpes): Add Node_old_ext_func.
+	(optypetab): Add Op_old_ext_func.
+	* ext.c (make_old_ext_builtin): "New" function.
+	* interpret.h: Special case Op_old_ext_builtin. Add checks for
+	Node_old_ext_func.
+	* msg.c: Adjust placement of a comment.
+
+2012-05-02         John Haque      <j.eh@mchsi.com>
+
+	* str_array.c (str_copy): Initialize next pointer in the linked list
+	to avoid memory corruption.
+	* int_array.c (int_copy): Ditto.
+
+2012-04-21         John Haque      <j.eh@mchsi.com>
+
+	Shutdown routine for a dynamic extension.
+
+	* awk.h (SRCFILE): New field fini_func.
+	* ext.c (load_ext): Takes an additional argument to look up and
+	save the clean up routine in SRCFILE struct.
+	(INIT_FUNC, FINI_FUNC): Defines for default init and fini routine
+	names.
+	(do_ext): Use default for the name of the init or fini routine if
+	one is not supplied. Adjust call to load_ext().
+	(close_extensions): Execute fini routines.
+	* interpret.h (Op_at_exit): Call close_extensions().
+	* msg.c (gawk_exit): Ditto.
+	* debug.c (close_all): Ditto.
+	* main.c (main): Adjust call to load_ext().
+	* awkgram.y (tokentab): Specify 2nd and 3rd optional arguments
+	for the extension() built-in.
+
+	Unrelated:
+
+	* interpret.h (Op_arrayfor_init): Use assoc_length for array size.
+
+2012-04-19         John Haque      <j.eh@mchsi.com>
+
+	Enhanced array interface to support transparent implementation
+	using external storage and ...
+
+	* awk.h (astore): Optional post-assignment store routine for
+	array subscripts.
+	(Op_subscript_assign): New opcode to support the store routine.
+	(alength): New array interface routine for array length.
+	(assoc_length): New macro.
+	(assoc_empty): Renamed from array_empty.
+	* awkgram.y (snode): Append Op_subscript_assign opcode if
+	(g)sub variable is an array element.
+	(mk_getline): Same for getline variable.
+	(mk_assignment): Same if assigning to an array element.
+	* field.c (set_element): Call store routine if needed.
+	* builtin.c (do_match): Ditto.
+	(do_length): Use length routine for array size.
+	* symbol.c (print_vars): Ditto.
+	* array.c (null_length): Default function for array length interface.
+	(asort_actual):	Call store routine if defined.
+	(asort_actual, assoc_list): Use length routine for array size.
+	(null_array_func): Add length and store routine entries.
+	* str_array.c (str_array_func): Same.
+	* cint_array.c (cint_array_func): Same.
+	* int_array.c (int_array_func): Same.
+	* eval.c (optypetab): Add Op_subscript_assign.
+	* profile.c (pprint): Add case Op_subscript_assign.
+	* interpret.h (set_array, set_idx): New variables to keep track
+	of an array element with store routine.
+	(Op_sub_array, Op_subscript_lhs, Op_store_sub, Op_subscript_assign):
+	Add code to handle array store routine.
+	* debug.c (print_symbol, print_array, cmp_val, watchpoint_triggered,
+	initialize_watch_item): Use length routine for array size.
+
+	* awk.h (assoc_kind_t): New typedef for enum assoc_list_flags.
+	(sort_context_t): Renamed from SORT_CONTEXT.
+	* array.c (asort_actual, assoc_sort): Adjust.
+	* cint_array.c (cint_list, tree_list, leaf_list): Adjust.
+	* int_array.c (int_list): Adjust.
+	* str_array.c (str_list): Adjust.
+
+2012-04-18         John Haque      <j.eh@mchsi.com>
+
+	* awk.h (atypeof, AFUNC): New macros.
+	(afunc_t): Renamed typedef from array_ptr.
+	* array.c (register_array_func, null_lookup): Use AFUNC macro
+	instead of hard-coded index for array functions.
+	(asort_actual): Unref null array elements before overwriting.
+	(force_array): Renamed from get_array.
+	(null_array): Renamed from init_array. Also initialize flags to 0.
+	(array_types): Renamed from atypes.
+	(num_array_types): Renamed from num_atypes.
+	* interpret.h (r_interpret): In case Op_sub_array, unref null array element.
+	* str_array.c (str_array_init): Reworked for (re)initialization of array.
+	* int_array.c (int_array_init): Ditto.
+	* cint_array.c (cint_array_init): Ditto.
+
+2012-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Directory cleanup.
+
+	* TODO.xgawk, FUTURES: Merged into TODO.
+	* TODO: More stuff added.
+	* Makefile.am (EXTRA_DIST): Updated.
+
+2012-11-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Cleanup of awk.h.
+
+	* array.c (r_in_array): Removed.
+	* awk.h (MALLOC_ARG_T): Replaced with size_t everywhere.
+	(S_ISREG, setsid): Moved to io.c.
+	(__extension__): Removed.
+	(INT32_BIT): Moved to cint_array.c.
+	(_t): Always declare.
+	(DO_LINT_INVALID, et al): Moved into an enum.
+	(POP_ARRAY, POP_PARAM, POP_SCALAR, TOP_SCALAR, dupnode, in_array):
+	Moved into inline functions.
+	(force_number, force_string): Simplified.
+	(ZOS_USS): Remove undef of DYNAMIC, it's handled in configure.ac.
+	* io.c (S_ISREG, setsid): Moved to here.
+	* cint_array.c (INT32_BIT): Moved to here.
+	* eval.c (_t): Always define.
+	* protos.h: Use size_t directly instead of MALLOC_ARG_T.
+
+	Unrelated:
+
+	* gawkapi.h: Add `awk_' prefix to structure tags where they
+	were missing.  Document the full list of include files needed.
+
+2012-11-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (do_find_source): On VMS, don't add the `/' separator.
+	Thanks to Anders Wallin.
+
+	MPFR minor cleanup:
+
+	* awk.h (mpfr_unset): Declare new function.
+	* mpfr.c (mpfr_unset): New function.
+	* node.c (r_unref): Call it instead of inline code.
+	* gawk_api.c (api_sym_update_scalar): Call it instead of inline code.
+
+2012-11-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symbol.c (get_symbols): Check type, not vname. Keeps
+	valgrind happy. Thanks to Andrew Schorr for noticing the problem.
+
+2012-11-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Update to bison 2.6.5. Various files regenerated.
+	* io.c (find_source): Add a default value for SHLIBEXT.
+	(read_with_timeout): For VMS also, just use read().
+
+2012-11-10         John Haque      <j.eh@mchsi.com>
+
+	* int_array.c (int_copy): Initialize next pointer of newchain to null.
+	* eval.c (eval_condition): Force string context for an integer used
+	as array index.
+
+2012-11-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.c (api_add_ext_func, api_awk_atexit, api_clear_array,
+	api_create_array, api_create_value, api_register_ext_version,
+	api_release_value, api_update_ERRNO_string, node_to_awk_value,
+	remove_element, run_ext_exit_handlers): Add null pointer checks.
+	Everywhere: Add / fixup leading comments.
+
+	* interpret.h (Op_store_sub): If assigning to an uninitialized variable
+	through SYMTAB, change it to Node_var. Add explanatory comments.
+	* symbol.c (get_symbol): Rationalized. Skip non-variables in SYMTAB.
+
+2012-11-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Minor documentation edit.
+
+2012-10-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (want_regexp): Use as a bool, not as an int.
+	* field.c: Fix a comment.
+	* gawkapi.h: Add comment to include <errno.h>.
+	* symbol.c (load_symbols): ``No automatic aggregate initialization.''
+	Here too. Sigh again.
+
+	* gawkapi.h: Minor documentation edits.
+
+2012-11-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_fflush): Make fflush() and fflush("") both
+	flush everything. See the comment in the code.
+
+2012-10-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Update to bison 2.6.4. Various files regenerated.
+
+2012-10-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Continuing the minor formatting / doc cleanups.
+
+2012-10-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Continuing the minor formatting / doc cleanups.
+
+2012-10-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Still more minor formatting / doc cleanups.
+
+2012-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: More minor formatting / doc cleanups.
+
+2012-10-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fixes for z/OS from Dave Pitts.
+
+	* awk.h (assoc_list_flags): No trailing comma on last enum value.
+	* gawkapi.h (awk_valtype_t): Ditto.
+	* symbol.c (lookup): ``No automatic aggregate initialization.'' Sigh.
+
+	Unrelated:
+
+	* gawkapi.h: Minor formatting / doc cleanups.
+
+2012-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	If SYMTAB is used, make sure ENVIRON and PROCINFO get loaded too.
+
+	* awkgram.y (process_deferred): New function. Call it when program
+	is completely parsed.
+	(symtab_used): New variable.
+	(variable): Set it to true if SYMTAB is looked up.
+	* main.c (load_environ, load_procinfo): Make sure the routines are
+	only called once.
+
+	Unrelated fixes:
+
+	* awkgram.y (yylex): Check continue_allowed and break_allowed as
+	soon as they are seen in the scanner; the rules that check them
+	can not be reduced until after a token that allows them is seen,
+	leading to errors at execution time.
+	* interpret.h (Op_K_break, Op_K_continue, Op_jmp): Add assertion
+	that pc->target_jmp is not NULL.
+
+	* symbol.c (lookup): Correct a comment.
+
+2012-10-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h (IOBUF_PUBLIC): Renamed awk_input_buf_t.
+	(struct iobuf_public): Renamed struct awk_input.
+	* awk.h: Adjust.
+
+2012-10-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Update to Automake 1.12.4. Various files regenerated.
+
+2012-10-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (dup_ent): New member for Node_param_list.
+	* symbol.c (install): For parameters, if this is a duplicate, chain
+	it off the original using the dup_ent pointer.
+	(remove_params): If there's a duplicate, remove it from the list.
+
+	* awk.h: Fix flags to have unique numeric values. Oops.
+
+2012-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Add considerably more documentation. Rearrange order
+	of functions in the struct to make more sense, grouping related
+	functions together in a more logical order.
+	* gawkapi.c: Adjust as needed.
+	* ext.c (make_builtin): Adjust for name change in struct member.
+
+2012-10-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* mbsupport.h: Add a bunch of undefs for z/OS.
+
+2012-10-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* TODO.xgawk: Update.
+	* awk.h (make_str_node): Removed macro.
+	(make_string): Modified to call make_str_node.
+	(r_make_str_node): Renamed to make_str_node.
+	* gawkapi.c: Changed r_make_str_node to make_str_node everywhere.
+	* node.c (make_str_node): Renamed from make_str_node.
+
+	Update to automake 1.12.4.
+
+	* Makefile.in, aclocal.m4, awklib/Makefile.in, doc/Makefile.in,
+	extension/Makefile.in, extension/aclocal.m4, test/Makefile.in:
+	Regenerated.
+
+	* interpret.h (Op_Subscript): Added lint warnings for FUNCTAB
+	and SYMTAB.
+
+2012-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (func_table): Declare.
+	* awkgram.y: If do_posix or do_traditional, then check for
+	delete on SYMTAB. Add check for delete on FUNCTAB, also.
+	* interpret.h (Op_Subscript): For FUNCTAB, return the element name
+	as its value too.  Avoids lots of weirdness and allows indirect calls
+	after assignment from FUNCTAB["foo"] to work.
+	(Op_store_sub): Disallow assignment to elements of FUNCTAB.
+	(Op_indirect_func_all): Turn assert into check and fatal error.
+	* symbol.c (func_table): No longer static.
+	(lookup): If do_posix or do_traditional, skip the global table.
+	(release_all_vars): Clear func_table too.
+
+2012-09-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	First cut at SYMTAB and FUNCTAB. This does the following:
+	- Change symbol table handling to use gawk arrays.
+	- Store symbols in SYMTAB array and allow indirect access
+	  through SYMTAB to variables, both getting and setting.
+	- List function names in FUNCTAB indexes; Values cannot be
+	  used at the moment.
+	- No documentation yet.
+
+	* awk.h (Node_hashnode, hnext, hname, hlength, hcode, hvalue):
+	Removed, not needed any more.
+	(init_symbol_table, symbol_table): Add declarations.
+	* awkgram.y: Disallow delete on SYMTAB, fix warning for tawk
+	extension if traditional.
+	* eval.c (nodetypes): Remove Node_hashnode element.
+	* interpret.h (Op_subscript, Op_store_sub): Handle SYMTAB and go
+	through to the actual value.
+	* main.c (main): Init Nnull_string earlier. Add call to
+	init_symbol_table().
+	* profile.c (pp_str, pp_len): Change definitions.
+	(pp_next): New macro.
+	(pp_push, pp_pop): Adjust uses.
+	* symbol.c (variables): Removed.
+	(global_table, param_table, func_table, symbol_table,
+	installing_specials): New variables.
+	(lookup, make_params, install_params, remove_params, remove_symbol,
+	make_symbol, install, get_symbols, release_all_vars, append_symbol,
+	release_symbols, load_symbols): Rework logic considerably.
+	(init_symbol_table): New function.
+
+2012-09-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	`delete array' and `nextfile' are now in POSIX.
+	Thanks to Nathan Weeks <weeks@iastate.edu> for the
+	initiative and letting us know about it.
+
+	* awkgram.y: Make the right code changes for `delete array'
+	and `nextfile'.
+	(tokentab): Set flags to zero for nextfile.
+
+2012-09-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symbol.c (load_symbols): Zero out the new node. Prevents assertion
+	failure on PPC Mac OS X.
+
+2012-09-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Allow read-only access to built-in variables from extensions.
+
+	* awk.h (NO_EXT_SET): New flag.
+	* gawkapi.c (api_sym_lookup, api_sym_update_real): Set flag if off
+	limits variable instead of failing. Adjust logic.
+	(api_sym_update_scalar, api_set_array_element, api_del_array_element,
+	api_release_flattened_array): Adjust logic.
+	* gawkapi.h: Adjust documentation.
+
+	Provide PROCINFO["identifiers"]. Undocumented for now.
+
+	* awk.h (load_symbols): Add declaration.
+	* awkgram.y (variable): Adjust comment formatting.
+	* main.c (main): Call load_symbols().
+	* symbol.c (load_symbols): New function.
+
+2012-09-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Determination of DYNAMIC adjusted. Hopefully is
+	smarter for z/OS.
+
+2012-09-13         Dave Pitts            <dpitts@cozx.com>
+
+	* awk.h: Add defines for z/OS for newer types.
+
+2012-08-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.c: Wrap various bits in #ifdef DYNAMIC so that
+	gawk will compile on systems without dynamic loading.
+
+2012-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add version facility to API. Thanks to Manuel Collado
+	for the idea.
+
+	* awk.h (print_ext_versions): Declare.
+	Rearrange includes and decls to make more sense.
+	* gawkapi.h (register_ext_version): New API.
+	(dl_load_func): Add code for ext_version.
+	* gawkapi.c (api_register_ext_version, print_ext_versions):
+	New functions.
+	* main.c (do_version): New variable.
+	(optab): Set it for -v / --version.
+	(main): Set it in arg parsing switch. Call version() after the
+	extensions have been loaded.
+
+2012-08-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add output wrapper and two-way processor to extension API.
+
+	* awk.h (struct redirect): Replace output FILE * with awk_output_buf_t.
+	(register_output_wrapper, register_two_way_processor): Declare.
+	* builtin.c (efwrite): Adjust logic to use rp->output data and
+	functions if rp is not NULL. Remove redundant declaration of function.
+	(do_fflush, do_printf, do_print, do_print_rec): Same adjustment.
+	* ext.c (make_builtin): Adjust error messages.
+	* gawkapi.c (api_register_output_wrapper,
+	api_register_two_way_processor): New functions.
+	(sym_update_real): Adjust code formatting.
+	* gawkapi.h (awk_input_parser_t): Make next pointer awk_const.
+	(awk_output_buf_t, awk_two_way_processor_t): New structs.
+	(api_register_output_wrapper, api_register_two_way_processor): New APIs.
+	(dl_load_func): Allow for empty function table (NULL elements).
+	* io.c (find_output_wrapper, init_output_wrapper, find_two_processor,
+	gawk_fwrite, gawk_ferror, gawk_fflush, gawk_fclose): New functions.
+	(redirect): Call init_output_wrapper, find_output_wrapper as needed.
+	Adjust use of rp->fp to rp->output.fp and also function calls.
+	(close_rp, close_redir, flush_io): Same adjustment.
+	(two_way_open): Same adjustment. Call find_two_way_processor, and
+	find_output_wrapper, as needed.
+
+2012-08-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Update infrastructure: Automake 1.12.3 and bison 2.6.2.
+
+2012-08-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync w/GNU grep.
+
+2012-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Make the versions enum constants instead of defines.
+
+2012-08-11         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkgram.y (add_srcfile): It is now a fatal error to load the
+	same file with -f and -i (or @include).
+	* TODO.xgawk: Update to reflect this change.
+
+2012-08-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* FUTURES, TODO.xgawk: Updates.
+
+2012-08-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add -DNDEBUG to remove asserts if not developing.
+
+	* gawkapi.h: Document how to build up arrays.
+	* gawkapi.c (api_sym_update): For an array, pass the new cookie
+	back out to the extension.
+
+	* awk.h (IOBUF): Move struct stat into IOBUF_PUBLIC.
+	(os_isreadable): Change to take an IOBUF_PUBLIC.
+	* gawkapi.h (IOBUF_PUBLIC): Received struct stat.
+	(INVALID_HANDLE): Moves to here.
+	* io.c (iop_alloc): Stat the fd and fill in stat buf.
+	(iop_finish): Use passed in stat info.
+
+2012-08-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.git: More stuff added.
+
+2012-08-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (iop_finish): New function.
+	(iop_alloc): Add errno_val parameter. Move code into iop_finish.
+	Add large explanatory leading comment.
+	(after_beginfile): Rework logic. Check for input parser first, then
+	check for invalid iop.
+	(nextfile): Organize code better. Call iop_alloc then iop_finish.
+	(redirect): Call iop_alloc, find_input_parser, iop_finish.
+	(two_way_open): Call iop_alloc, find_input_parser, iop_finish.
+	(gawk_popen): Call iop_alloc, find_input_parser, iop_finish.
+	(find_input_parser): Set iop->valid if input parser takes control.
+	(get_a_record): Rework setting RT to use macros.
+
+2012-07-29         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awk.h (set_RT_to_null, set_RT): Removed.
+	* gawkapi.h (api_set_RT): Removed.
+	(get_record): Signature changed in input parser struct.
+	* gawkapi.c (api_set_RT): Removed.
+	* io.c (set_RT_to_null, set_RT): Removed.
+	(get_a_record): Adjustments for new API for input parser.
+
+2012-07-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (os_isreadable): Adjust declaration.
+	(struct iobuf): Add new member `valid'.
+	* io.c (iop_alloc): Remove do_input_parsers parameter, it's
+	always true. Adjust logic to set things to invalid if could not
+	find an input parser.
+	(after_beginfile): Use valid member to check if iobuf is valid.
+	Don't clear iop->errcode.
+	(nextfile): Adjust logic to clear errcode if valid is true and
+	also to update ERRNO.
+	(redirect): Check iop->valid and cleanup as necessary, including
+	setting ERRNO.
+	(two_way_open): Ditto.
+	(gawk_popen): Ditto.
+	(devopen): Remove check for directory.
+
+2012-07-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (find_input_parser): Issue a warning if take_control_of fails.
+
+2012-07-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (set_RT): Change to take a NODE * parameter.
+	* io.c (set_RT): Change to take a NODE * parameter.
+	* gawkapi.h: Change open hook to input parser in comment.
+	* gawkapi.c (api_set_RT): Adjust call to set_RT.
+
+2012-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h (set_RT_to_null, set_RT): Declare functions.
+	(os_isreadable): Declare function.
+	* io.c (set_RT_to_null, set_RT): New functions.
+	(iop_close): Init ret to zero.
+	* gawkapi.c (api_register_input_parser): Check for null pointer.
+	(api_set_RT): New function.
+	* gawkapi.h (api_set_RT): New function.
+
+2012-07-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (IOBUF_PUBLIC): Document the get_record and close_func
+	API.
+	(awk_input_parser_t) Change can_take_file argument to const, and
+	document the API.
+	* io.c (get_a_record): Document that the caller initializes *errcode
+	to 0, and remote the test for non-NULL errcode.
+
+2012-07-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (api_sym_update_scalar): Fix some minor bugs.  Was
+	not updating AWK_NUMBER when valref != 1.  And strings were not
+	freeing MPFR values.
+
+2012-07-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Start refactoring of IOBUF handling and turn "open hooks"
+	into "input parsers".
+
+	* awk.h (IOP_NOFREE_OBJ): Flag removed.
+	(register_input_parser): Renamed from register_open_hook.
+	* ext.c (load_ext): Make sure lib_name is not NULL.
+	* gawk_api.c (api_register_input_parser): Renamed from
+	api_register_open_hook.
+	* gawk_api.h (api_register_input_parser): Renamed from
+	api_register_open_hook.  Rework structure to have "do you want it"
+	and "take control of it" functions.
+	* io.c (iop_alloc): Remove third argument which is IOBUF pointer.
+	Always malloc it. Remove use of IOP_NOFREE_OBJ everywhere.
+	(find_input_parser): Renamed from find_open_hook.
+	(nextfile): Don't use static IOBUF.
+	(iop_close): Call close_func first. Then close fd or remap it
+	if it's still not INVALID_HANDLE.
+	(register_input_parser): Renamed from register_open_hook.
+	Use a FIFO list and check if more than one parser will accept the
+	file. If so, fatal error.
+
+2012-07-25         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac: Instead of using acl_shlibext for the shared library
+	extension, define our own variable GAWKLIBEXT with a hack to work
+	correctly on Mac OS X.
+	* Makefile.am (SHLIBEXT): Use the value of GAWKLIBEXT instead of
+	acl_shlibext.
+
+2012-07-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add crude but small hack to make plug-ins work
+	on Mac OS X.
+
+2012-07-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Rework table to not take up so much space.
+	* gawkapi.c (api_sym_update_scalar): Rework optimization code
+	to clean up the function.
+
+2012-07-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h: Add comments explaining new api_create_value and
+	api_release_value functions.
+	* gawkapi.c (sym_update_real): Allow updates with AWK_SCALAR and
+	AWK_VALUE_COOKIE types.  After creating a regular variable,
+	remove the call to unref(node->var_value), since this is not
+	done elsewhere in the code (see, for example, main.c:init_vars).
+	If the update is for an existing variable, allow any val_type
+	except AWK_ARRAY (was previously disallowing AWK_SCALAR and
+	AWK_VALUE_COOKIE for no apparent reason).
+	(api_sym_update_scalar): The switch should return false for an
+	invalid val_type value, so change the AWK_ARRAY case to default.
+	(valid_subscript_type): Any scalar value is good, so accept any valid
+	type except AWK_ARRAY.
+	(api_create_value): Accept only AWK_NUMBER and AWK_STRING values.
+	Anything else should fail.
+
+2012-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Speedup:
+
+	* awk.h (r_free_wstr): Renamed from free_wstr.
+	(free_wstr): Macro to test the WSTRCUR flag first.
+	* node.c (r_free_wstr): Renamed from free_wstr.
+
+	Support value cookies:
+
+	* gawkapi.h (awk_val_type_t): Add AWK_VALUE_COOKIE.
+	(awk_value_cookie_t): New type.
+	(awk_value_t): Support AWK_VALUE_COOKIE.
+	(api_create_value, api_release_value): New function pointers.
+	* gawkapi.c (awk_value_to_node, api_sym_update_scalar,
+	valid_subscript_type): Handle AWK_VALUE_COOKIE.
+	(api_create_value, api_release_value): New functions.
+
+2012-07-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.c (awk_value_to_node): Support AWK_SCALAR.
+	(api_sym_update_scalar): Performance improvements.
+
+2012-07-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Allow creation of constants. Thanks to John Haque for the
+	implementation concept.
+
+	* gawk_api.h (api_sym_constant): Create a constant.
+	* gawk_api.h (api_sym_update_real): Renamed from api_sym_update.
+	Add is_const parameter and do the right thing if true.
+	(api_sym_update, api_sym_constant): Call api_sym_update_real
+	in the correct way.
+	(set_constant): New function.
+
+2012-07-11         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h: Fix typo in comment.
+	(awk_value_t): Type for scalar_cookie should be awk_scalar_t,
+	not awk_array_t.
+	(gawk_api): Add new api_sym_lookup_scalar function.
+	(sym_lookup_scalar): New wrapper macro for api_sym_lookup_scalar hook.
+	* gawkapi.c (api_sym_lookup_scalar): New function for faster scalar
+	lookup.
+	(api_impl): Add entry for api_sym_lookup_scalar.
+
+2012-07-11         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (awk_value_to_node): Change to a switch statement
+	so AWK_SCALAR or other invalid type is handled properly.
+	(valid_subscript_type): Test whether a value type is acceptable
+	for use as an array subscript (any scalar value will do).
+	(api_get_array_element, api_set_array_element, api_del_array_element):
+	Use new valid_subscript_type instead of restricting to string values.
+
+2012-07-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Lots of API work.
+
+	* gawkapi.h: Function pointer members renamed api_XXX and
+	macros adjusted. More documentation.
+	(awk_valtype_t): New AWK_SCALAR enum for scalar cookies.
+	(awk_scalar_t): New type.
+	(awk_value_t): New member scalar_cookie.
+	(api_sym_update_scalar): New API function.
+	(erealloc): New macro.
+	(make_const_string): New macro, renamed from dup_string.
+	(make_malloced_string): New macro, renamed from make_string.
+	(make_null_string): New inline function.
+	(dl_load_func): Add call to init routine through pointer if
+	not NULL.
+
+	* gawkapi.c (awk_value_to_node): Assume that string values came
+	from malloc.
+	(node_to_awk_value): Handle AWK_SCALAR.
+	(api_sym_update): Ditto.
+	(api_sym_update_scalar): New routine.
+	(api_get_array_element): Return false if the element doesn't exist.
+	Always unref the subscript.
+	(remove_element): New helper routine.
+	(api_del_array_element): Use it.
+	(api_release_flattened_array): Ditto.
+	(api_impl): Add the new routine.
+
+2012-07-11         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (api_sym_update): Allow val_type to be AWK_UNDEFINED
+	for setting a variable to "", i.e. dupnode(Nnull_string).
+
+2012-07-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkgram.y (add_srcfile): Lint warning message for a previously loaded
+	shared library should say "already loaded shared library" instead
+	of "already included source file".
+
+2012-07-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h (set_array_element): Use index + value instead
+	of element structure. Matches get_array_element.
+	(set_array_element_by_elem): New macro to use an element.
+	* gawkapi.c (api_set_array_element): Make the necessary adjustments.
+
+2012-07-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkgram.y (tokentab): Remove limit on number of arguments
+	for "and", "or", and "xor".
+	* builtin.c (do_and, do_or, do_xor): Modify code to perform the
+	respective operation on any number of arguments. There must be
+	at least two.
+
+2012-06-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h: Improve the documentation of the return values
+	per Andrew Schorr.
+
+2012-06-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* TODO.xgawk: Updated.
+	* awk.h (track_ext_func): Declared.
+	* awkgram.y (enum defref): Add option for extension function.
+	(struct fdesc): Add member for extension function.
+	(func_use): Handle extension function, mark as extension and defined.
+	(track_ext_func): New function.
+	(check_funcs): Update logic for extension functions.
+	* ext.c (make_builtin): Call track_ext_func.
+
+2012-06-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* TODO.xgawk: Most of IOBUF has been hidden.
+	* gawkapi.h (IOBUF): Remove declaration (now back in awk.h).
+	(IOBUF_PUBLIC): Declare new structure defining subset of IOBUF fields
+	that should be exposed to extensions.
+	(gawk_api): Update register_open_hook argument from IOBUF to
+	IOBUF_PUBLIC.
+	* awk.h (IOBUF): Restore declaration with 5 fields moved to new
+	IOBUF_PUBLIC structure.
+	(register_open_hook): Update open_func argument from IOBUF to
+	IOBUF_PUBLIC.
+	* gawkapi.c (api_register_open_hook): Ditto.
+	* io.c (after_beginfile, nextfile, iop_close, gawk_pclose): Some fields
+	such as fd and name are now inside the IOBUF public structure.
+	(struct open_hook): Update open_func argument from IOBUF to
+	(register_open_hook): Ditto.
+	(find_open_hook): opaque now inside IOBUF_PUBLIC.
+	(iop_alloc): fd and name now in IOBUF_PUBLIC.
+	(get_a_record): If the get_record hook returns EOF, set the IOP_AT_EOF
+	flag.  Access fd inside IOBUF_PUBLIC.
+	(get_read_timeout): File name now inside IOBUF_PUBLIC.
+	* interpret.h (r_interpret): File name now inside IOBUF_PUBLIC.
+	* ext.c (load_ext): No need to call return at the end of a void
+	function.
+
+2012-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ext.c (load_ext): Don't return a value from a void function.
+	* gawkapi.c (api_set_array_element): Set up vname and parent_array.
+
+2012-06-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	More API and cleanup:
+
+	* awk.h (stopme): Make signature match other built-ins.
+	* awkgram.y (stopme): Make signature match other built-ins.
+	(regexp): Minor edit.
+	* gawkapi.c (api_set_argument): Remove unused variable.
+	Set parent_array field of array value.
+	* TODO.xgawk: Update some.
+
+	Remove extension() builtin.
+
+	* awk.h (do_ext): Removed.
+	(load_ext): Signature changed.
+	* awkgram.y (tokentab): Remove do_ext.
+	Change calls to do_ext.
+	* ext.c (load_ext): Make init function a constant.
+	* main.c (main): Change calls to do_ext.
+
+2012-06-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Restore lost debugging function:
+
+	* awkgram.y (stopme): Restore long lost debugging function.
+	* awk.h (stopme): Add declaration.
+
+	API work:
+
+	* ext.c (get_argument): Make extern.
+	* awk.h (get_argument): Declare it.
+	* gawkapi.c (api_set_argument): Call it. Finish off the logic.
+	(api_get_argument): Refine logic to use get_argument.
+	* gawkapi.h (set_argument): New API.
+
+2012-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove code duplication in gawkapi.c from msg.c:
+
+	* awk.h (err): Add `isfatal' first parameter.
+	* awkgram.y (err): Adjust all calls.
+	* msg.c (err): Adjust all calls. Move fatal code to here ...
+	(r_fatal): From here.
+	* gawkapi.c: Remove code duplication and adjust calls to `err'.
+
+	Handle deleting elements of flattened array:
+
+	* awk.h (get_argument): Remove declaration.
+	* ext.c (get_argument): Make static.
+	* gawkapi.h (awk_flat_array_t): Make opaque fields const. Add
+	more descriptive comments.
+	* gawkapi.c (release_flattened_array): Delete elements flagged
+	for deletion. Free the flattened array also.
+
+	Add additional debugging when developing:
+
+	* configure.ac: Add additional debugging flags.
+	* configure: Regenerated.
+
+2012-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.h (get_array_element): Restore `wanted' parameter.
+	(awk_element_t): Use awk_value_t for index. Add awk_flat_array_t.
+	(flatten_array): Change signature to use awk_flat_array_t;
+	(release_flattened_array): Change signature to use awk_flat_array_t;
+	* gawkapi.c (api_sym_update): Handle case where variable exists already.
+	(api_get_array_element): Restore `wanted' parameter and pass it
+	on to node_to_awk_value.
+	(api_set_array_element): Revisse to match changed element type.
+	(api_flatten_array): Revise signature, implement.
+	(api_release_flattened_array): Revise signature, implement.
+
+2012-06-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	API Work:
+
+	* gawkapi.h (get_array_element): Remove `wanted' parameter.
+	(r_make_string): Comment the need for `api' and `ext_id' parameters.
+	* gawkapi.c (api_sym_update): Move checks to front.
+	Initial code for handling arrays. Still needs work.
+	(api_get_array_element): Implemented.
+	(api_set_array_element): Additional checking code.
+	(api_del_array_element): Implemented.
+	(api_create_array): Implemented.
+	(init_ext_api): Force do_xxx values to be 1 or 0.
+	(update_ext_api): Ditto.
+
+2012-06-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	API Work:
+
+	* gawkapi.h (awk_value_t): Restore union.
+	(get_curfunc_param): Renamed to get_argument. Return type changed
+	to awk_bool_t. Semantics better thought out and documented.
+	(awk_atexit, get_array_element): Return type now void.
+	(sym_lookup): Return type now void. Argument order rationalized.
+	* gawkapi.c (node_to_awk_value): Return type is now awk_bool_t.
+	Semantics now match table in gawkawpi.h.
+	(api_awk_atexit): Return type now void.
+	(api_sym_lookup): Return type is now awk_bool_t. Change parameter
+	order.
+	(api_get_array_element): Return type is now awk_bool_t.
+
+	Further API implementations and fixes for extension/testext.c:
+
+	* awk.h (final_exit): Add declaration.
+	* ext.c (load_ext): Change `func' to install_func.
+	* gawkapi.c: Add casts to void for id param in all functions.
+	(api_sym_update): Finish implementation.
+	(api_get_array_element): Start implementation.
+	(api_set_array_element): Add error checking.
+	(api_get_element_count): Add error checking, return the right value.
+	* main.c (main): Call final_exit instead of exit.
+	(arg_assign): Ditto.
+	* msg.c (final_exit): New routine to run the exit handlers and exit.
+	(gawk_exit): Call it.
+	* profile.c (dump_and_exit): Ditto.
+
+2012-06-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* TODO.xgawk: Addition of time extension moved to "done" section.
+
+2012-06-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.c (api_update_ERRNO_string): Treat boolean true as a request
+	for TRANSLATE, and false as DONT_TRANSLATE.
+
+2012-06-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* cint_array.c (tree_print, leaf_print): Add additional casts
+	for printf warnings.
+
+	* awk.h (update_ext_api): Add declaration.
+	* gawkapi.c (update_ext_api): New function.
+	* eval.c (set_LINT): Call update_ext_api() at the end.
+	* gawkapi.h: Document that do_XXX could change on the fly.
+
+	* awk.h (run_ext_exit_handlers): Add declaration.
+	* msg.c (gawk_exit): Call it.
+
+2012-06-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ext.c (load_ext): Remove use of RTLD_GLOBAL. Not needed in new
+	scheme. Clean up error messages.
+
+2012-06-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Remove use of -export-dynamic for GCC.
+	* configure: Regenerated.
+
+2012-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (is_off_limits_var): Minor coding style edit.
+	* gawkapi.c (awk_value_to_node): More cleanup.
+	(node_to_awk_value): Use `wanted' for decision making.
+	(api_sym_update): Start implementation. Needs more work.
+	General: More cleanup, comments.
+	* gawkapi.h (api_sym_update): Add additional comments.
+
+2012-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkapi.c (node_to_awk_value): Add third parameter indicating type
+	of value desired. Based on that, do force_string or force_number
+	to get the "other" type.
+	(awk_value_to_node): Clean up the code a bit.
+	(get_curfunc_param): Move forcing of values into node_to_awk_value.
+	(api_sym_lookup): Add third parameter indicating type of value wanted.
+	(api_get_array_element): Ditto.
+	* gawk_api.h: Additional comments and clarifications. Revise APIs
+	to take third 'wanted' argument as above.
+	(awk_value_t): No longer a union so that both values may be accessed.
+	All macros: Parenthesized the bodies.
+	* bootstrap.sh: Rationalize a bit.
+
+2012-05-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (include_HEADERS): Add so gawkapi.h will be installed.
+	(base_sources): Add gawkapi.h so that it is in dist tarball.
+	* TODO.xgawk: Update.
+	* main.c (is_off_limits_var): Stop returning true for everything
+	except PROCINFO.
+
+2012-05-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (is_off_limits_var): New function to check if a variable
+	is one that an extension function may not change.
+	* awk.h (is_off_limits_var): Declare it.
+	* gawkapi.c (api_sym_lookup): Use it.
+
+	* bootstrap.sh: Touch various files in the extension directory also.
+
+2012-05-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkapi.h (awk_param_type_t): Remove (use awk_valtype_t instead).
+	(awk_ext_func_t): Pass a result argument, and return an awk_value_t *.
+	(gawk_api.get_curfunc_param): Add a result argument.
+	(gawk_api.set_return_value): Remove obsolete function.
+	(gawk_api.sym_lookup, gawk_api.get_array_element): Add a result
+	argument.
+	(gawk_api.api_make_string, gawk_api.api_make_number): Remove hooks,
+	since access to gawk internal state is not required to do this.
+	(set_return_value): Remove obsolete macro.
+	(get_curfunc_param, sym_lookup, get_array_element): Add result argument.
+	(r_make_string, make_number): New static inline functions.
+	(make_string, dup_string): Revise macro definitions.
+	(dl_load_func): Remove global_api_p and global_ext_id args,
+	and fix SEGV by setting api prior to checking its version members.
+	(GAWK): Expand ifdef to include more stuff.
+	* gawkapi.c (node_to_awk_value): Add result argument.
+	(api_get_curfunc_param): Add result argument, and use awk_valtype_t.
+	(api_set_return_value): Remove obsolete function.
+	(awk_value_to_node): New global function to convert back into internal
+	format.
+	(api_add_ext_func): Simply call make_builtin.
+	(node_to_awk_value): Add result argument, and handle Node_val case.
+	(api_sym_lookup, api_get_array_element): Add result argument.
+	(api_set_array_element): Implement.
+	(api_make_string, api_make_number): Remove functions that belong on
+	client side.
+	(api_impl): Remove 3 obsolete entries.
+	* TODO.xgawk: Update to reflect progress.
+	* Makefile.am (base_sources): Add gawkapi.c.
+	* awk.h: Include gawkapi.h earlier.
+	(api_impl, init_ext_api, awk_value_to_node): Add declarations
+	so we can hook in new API.
+	(INSTRUCTION): Add new union type efptr for external functions.
+	(extfunc): New define for d.efptr.
+	(load_ext): Remove 3rd obj argument that was never used for anything.
+	(make_builtin): Change signature for new API.
+	* awkgram.y (load_library): Change 2nd argument to load_ext
+	from dlload to dl_load, and remove pointless 3rd argument.
+	* main.c (main): Call init_ext_api() before loading shared libraries.
+	Change 2nd argument to load_ext from dlload to dl_load, and remove
+	pointless 3rd argument.
+	* ext.c (do_ext): Remove pointless 3rd argument to load_ext.
+	(load_ext): Remove 3rd argument.  Port to new API (change initialization
+	function signature).  If initialization function fails, issue a warning
+	and return -1, else return 0.
+	(make_builtin): Port to new API.
+	* interpret.h (r_interpret): For Op_ext_builtin, call external functions
+	with an awk_value_t result buffer, and convert the returned value
+	to a NODE *.  For Node_ext_func, code now in extfunc instead of builtin.
+
+2012-05-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac: Remove libtool, and call configure in the
+	extension subdirectory.  Change pkgextensiondir to remove the
+	version number, since the new API has builtin version checks.
+	* TODO.xgawk: Update.
+	* ltmain.sh: Removed, since libtool no longer used here.
+
+2012-05-19         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* TODO.xgawk: Update to reflect progress and new issues.
+	* main.c (main): Add -i (--include) option.
+	(usage): Ditto.
+	* awkgram.y (add_srcfile): Eliminate duplicates only for SRC_INC
+	and SRC_EXTLIB sources (i.e. -f duplicates should not be removed).
+	* io.c (find_source): Set DEFAULT_FILETYPE to ".awk" if not defined
+	elsewhere.
+
+2012-05-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h: Include "gawkapi.h" to get IOBUF.
+	* gawkapi.h: Considerable updates.
+	* gawkapi.c: New file. Start at implementing the APIs.
+
+2012-05-13         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* TODO.xgawk: Update to reflect recent discussions and deletion of
+	extension/xreadlink.[ch].
+
+2012-05-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Sweeping change: Use `bool', `true', and `false' everywhere.
+
+2012-04-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* eval.c (unset_ERRNO): Fix memory management bug -- need to use
+	dupnode with Nnull_string.
+
+2012-04-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (valgrind): Define VALGRIND instead of redefining AWK.
+	This allows test/Makefile.am to set up the command environment as
+	desired.
+	(valgrind-noleak): Ditto, plus set --leak-check=no instead of the
+	default summary setting.
+
+2012-04-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* TODO.xgawk: Update to reflect progress.
+
+2012-04-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* TODO.xgawk: Move valgrind-noleak item into "done" section.
+	* Makefile.am (valgrind-noleak): Add new valgrind rule that omits
+	the "--leak-check=full" option to help spot more serious problems.
+
+2012-04-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* TODO.xgawk: Move ERRNO item into "done" section.
+	* awk.h (update_ERRNO, update_ERRNO_saved): Remove declarations.
+	(update_ERRNO_int, enum errno_translate, update_ERRNO_string,
+	unset_ERRNO): Add new declarations.
+	* eval.c (update_ERRNO_saved): Renamed to update_ERRNO_int.
+	(update_ERRNO_string, unset_ERRNO): New functions.
+	* ext.c (do_ext): Use new update_ERRNO_string function.
+	* io.c (ERRNO_node): Remove redundant extern declaration (in awk.h).
+	(after_beginfile, nextfile): Replace update_ERRNO() with
+	update_ERRNO_int(errno).
+	(inrec): Replace update_ERRNO_saved with update_ERRNO_int.
+	(do_close): Use new function update_ERRNO_string.
+	(close_redir, do_getline_redir, do_getline): Replace update_ERRNO_saved
+	with update_ERRNO_int.
+
+2012-03-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* TODO.xgawk: Update to reflect debate about how to support Cygwin
+	and other platforms that cannot link shared libraries with unresolved
+	references.
+	* awkgram.y (add_srcfile): Minor bug fix: reverse sense of test
+	added by Arnold in last patch.
+	* configure.ac: AC_DISABLE_STATIC must come before AC_PROG_LIBTOOL.
+
+2012-03-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Some cleanups.
+
+	* awkgram.y (add_srcfile): Use whole messages, better for
+	translations.
+	* io.c (init_awkpath): Small style tweak.
+	* main.c (path_environ): Straighten out initial comment, fix
+	compiler warning by making `val' const char *.
+
+2012-03-25         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac (AC_DISABLE_STATIC): Add this to avoid building useless
+	static extension libraries.
+
+2012-03-25         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* TODO.xgawk: New file listing completed and pending xgawk enhancements.
+
+2012-03-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* io.c (path_info): Fix white space.
+	(pi_awkpath, pi_awklibpath): Avoid structure initializers.
+	(do_find_source): Eliminate pointless parentheses.
+	(find_source): Leave a space after "&".
+	* main.c (load_environ): Fix typo in comment.
+
+2012-03-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkgram.y (LEX_LOAD): New token to support @load.
+	(grammar): Add rules to support @load.
+	(tokentab): Add "load".
+	(add_srcfile): Improve error message to distinguish between source files
+	and shared libraries.
+	(load_library): New function to load libraries specified with @load.
+	(yylex): Add support for LEX_LOAD (treated the same way as LEX_INCLUDE).
+
+2012-03-20         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Remove extension.
+	(SUBDIRS): Add extension so libraries will be built.
+	(DEFS): Define DEFLIBPATH and SHLIBEXT so we can find shared libraries.
+	* awk.h (deflibpath): New extern declaration.
+	* configure.ac: Add support for building shared libraries by adding
+	AC_PROG_LIBTOOL and AC_SUBST for acl_shlibext and pkgextensiondir.
+	(AC_CONFIG_FILES): Add extension/Makefile.
+	* io.c (pi_awkpath, pi_awklibpath): New static structures to contain
+	path information.
+	(awkpath, max_pathlen): Remove static variables now inside pi_awkpath.
+	(init_awkpath): Operate on path_info structure to support both
+	AWKPATH and AWKLIBPATH.  No need for max_path to be static, since
+	this should be called only once for each environment variable.
+	(do_find_source): Add a path_info arg to specify which path to search.
+	Check the try_cwd parameter to decide whether to search the current
+	directory (not desirable for AWKLIBPATH).
+	(find_source): Choose appropriate path_info structure based on value
+	of the is_extlib argument.  Set EXTLIB_SUFFIX using SHLIBEXT define
+	instead of hardcoding ".so".
+	* main.c (path_environ): New function to add AWKPATH or AWKLIBPATH
+	to the ENVIRON array.
+	(load_environ): Call path_environ for AWKPATH and AWKLIBPATH.
+
+2012-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (main): Do setlocale to "C" if --characters-as-bytes.
+	Thanks to "SP" for the bug report.
+
+2012-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Added AC_HEADER_STDBOOL
+	* awk.h, dfa.c, regex.c: Reworked to use results
+	of test and include missing_d/gawkbool.h.
+
+2012-05-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* array.c (prnode): Add casts to void* for %p format.
+	* debug.c (print_instruction): Ditto.
+	* builtin.c: Fix %lf format to be %f everywhere.
+
+	Unrelated:
+
+	* replace.c: Don't include "config.h", awk.h gets it for us.
+
+2012-05-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* getopt.c [DJGPP]: Change to __DJGPP__.
+	* mbsupport.h [DJGPP]: Change to __DJGPP__.
+
+	Unrelated:
+
+	* awk.h: Workarounds for _TANDEM_SOURCE.
+
+2012-05-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep. RRI code now there, needed additional
+	change for gawk.
+	* configure.ac: Add check for stdbool.h.
+	* regex.c: Add check for if not have stdbool.h, then define the
+	bool stuff.
+
+2012-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+	* xalloc.h (xmemdup): Added, from grep, for dfa.c. Sigh.
+
+2012-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Update to autoconf 2.69, automake 1.12.
+
+	* INSTALL, aclocal.m4, configh.in, depcomp, install-sh, missing,
+	mkinstalldirs, ylwrap: Updated.
+	* configure.ac (AC_TYPE_LONG_LONG_INT, AC_TYPE_UNSIGNED_LONG_LONG_INT,
+	AC_TYPE_INTMAX_T, AC_TYPE_UINTMAX_T): Renamed from gl_* versions.
+	* configure: Regenerated.
+
+2012-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* cmd.h (dPrompt, commands_Prompt, eval_Prompt, dgawk_Prompt): Changed
+	to dbg_prompt, commands_prompt, eval_prompt, dgawk_prompt.
+	* debug.c: Ditto.
+	* command.y: Ditto.  Some minor whitespace and comments cleanup.
+
+2012-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	io.c cleanup and some speedup for RS as regexp parsing.
+
+	* awk.h (Regexp): New members has_meta and maybe_long.
+	(enum redirval): Add redirect_none as value 0.
+	(remaybelong): Remove function declaration.
+	* awkgram.y: Use redirect_none instead of 0 for no redirect cases.
+	* io.c (go_getline_redir): Second arg now of type enum redirval.
+	Changed intovar into into_variable.
+	(comments and whitespace): Lots of general cleanup.
+	(socket_open): readle changed to read_len.
+	(two_way_open): Add additional calls to os_close_on_exec.
+	(rsrescan): Simplify code a bit and use RS->maybe_long.
+	* re.c (make_regexp): Set up new members in Regexp struct.
+	(remaybelong): Remove function.
+	(reisstring): Simplified code.
+
+2012-04-16  Eli Zaretskii  <eliz@gnu.org>
+
+	* io.c (read_with_timeout) [__MINGW32__]: Just call the blocking
+	'read', as 'select' is only available for sockets.
+	* mpfr.c (set_ROUNDMODE) [!HAVE_MPFR]: Renamed from set_RNDMODE.
+	* main.c (load_procinfo): Declare name[] also when HAVE_MPFR is
+	defined even though HAVE_GETGROUPS etc. are not.
+
+2012-04-12         John Haque      <j.eh@mchsi.com>
+
+	* array.c, awk.h, awkgram.y, builtin.c, command.y, debug.c,
+	field.c, mpfr.c, profile.c: Change RND_MODE to ROUND_MODE.
+
+2012-04-11         John Haque      <j.eh@mchsi.com>
+
+	* main.c (varinit): Change RNDMODE to ROUNDMODE.
+
+2012-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c: Change --arbitrary-precision to --bignum.
+
+2012-04-02         John Haque      <j.eh@mchsi.com>
+
+	Add support for arbitrary-precision arithmetic.
+
+	* mpfr.c: New file.
+	* awk.h (struct exp_node): Add union to handle different number types.
+	(MPFN, MPZN): New flag values.
+	(DO_MPFR, do_mpfr): New defines.
+	(PREC_node, RNDMODE_node): Add declarations.
+	(PRECISION, RND_MODE, MNR, MFNR, mpzval, do_ieee_fmt): Add declarations.
+	(make_number, str2number, format_val, cmp_numbers): Ditto.
+	(force_number): Change definition.
+	(Func_pre_exec, Func_post_exec): New typedefs.
+	(POP_NUMBER, TOP_NUMBER): Change definitions.
+	(get_number_ui, get_number_si, get_number_d, get_number_uj,
+	iszero, IEEE_FMT, mpg_float, mpg_integer, mpg_float,
+	mpg_integer): New defines.
+	* awkgram.y (tokentab):	Add alternate function entries for MPFR/GMP.
+	(snode): Choose the appropriate function.
+	(negate_num): New function to negate a number.
+	(grammar): Use it.
+	(yylex): Adjust number handling code.
+	* array.c (value_info, asort_actual, sort_user_func): Adjust for
+	MPFR/GMP numbers.
+	(do_adump, indent): Minor changes.
+	(sort_up_index_number, sort_up_value_number, sort_up_value_type): Use
+	cmp_numbers() for numeric comparisons.
+	* builtin.c (mpz2mpfr): New function.
+	(format_tree): Adjust to handle MPFR and GMP numbers.
+	* eval.c (register_exec_hook): New function to manage interpreter hooks.
+	(num_exec_hook, pre_execute, post_execute): New and adjusted definitions.
+	(h_interpret): Renamed from debug_interpret.
+	(init_interpret): Changed to use the new name.
+	(flags2str): New entries for MPFN and MPZN.
+	(cmp_nodes): Reworked to use separate routine for numeric comparisons.
+	(set_IGNORECASE, set_BINMODE, set_LINT, update_NR, update_FNR,
+	update_NF): Adjust code and some cleanup.
+	* field.c (rebuild_record): Field copying code reworked to handle
+	MPFR/GMP numbers.
+	(set_NF): Minor adjustment.
+	* io.c (INCREMENT_REC): New macro.
+	(inrec, do_getline): Use the new macro.
+	(nextfile, set_NR, set_FNR, get_read_timeout, pty_vs_pipe): Adjust code
+	to handle MPFR/GMP numbers.
+	* interpret.h (r_interpret): Adjust TOP_NUMBER/POP_NUMBER usage.
+	(EXEC_HOOK): New macro and definition.
+	(DEBUGGING): Removed.
+	* main.c (DEFAULT_PREC, DEFAULT_RNDMODE): New defines.
+	(opttab): New entry for option arbitrary-precision.
+	(main): Handle the new option.
+	(usage): Add to usage message.
+	(varinit): Add PREC and RNDMODE.
+	(load_procinfo): Install MPFR and GMP related items.
+	(version): Append MPFR and GMP versions to message.
+	* msg.c (err) : Adjust FNR handling with MPFR/GMP.
+	* node.c (r_format_val): Renamed from format_val.
+	(r_force_number): Return NODE * instead of AWKNUM.
+	(make_number, str2number, format_val, cmp_numpers: Defined and initialized.
+	(r_unref): Free MPFR/MPZ numbers.
+	(get_numbase): Renamed from isnondecimal and return the base.
+	(cmp_awknums): New function to compare two AWKNUMs.
+	* command.y (yylex): Adjust number handling code.
+	(grammar): Minor adjustments to handle negative numbers.
+	* debug.c (init_debug): New function.
+	(do_info, do_set_var, watchpoint_triggered, serialize,
+	initialize_watch_item, do_watch, print_watch_item): Minor adjustments.
+	(debug_pre_execute): Adjusted to handle MPFR and GMP numbers.
+
+2012-04-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* INSTALL, config.guess, config.sub, depcomp, install-sh,
+	missing, mkinstalldirs, ylwrap: Update to latest from automake 1.11.4.
+
+2012-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Update various files to automake 1.11.4.
+
+2012-03-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (GAWK_AC_NORETURN): Do as macro instead of inline.
+
+2012-03-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.h, dfa.c: Sync with grep. Major cleanups and some changes
+	there.
+	* re.c (research): Pass size_t* to dfaexec to match type change.
+	* configure.ac (AH_VERBATIM[_Noreturn]): Added from Paul Eggert to
+	ease compiling.
+	(AC_INIT): Bump version.
+	* configure, configh.in, version.c: Regenerated.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* getopt.c: Add DJGPP to list of platforms where it's ok
+	to include <stdlib.h>.
+	* awkgram.y, builtin.c, ext.c, mbsupport.h, re.c: Update
+	copyright year.
+
+2012-03-21         Corinna Vinschen      <vinschen@redhat.com>
+
+	* getopt.c: Add Cygwin to list of platforms where it's ok
+	to include <stdlib.h>.
+
+2012-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Get new getopt to work on Linux and C90 compilers:
+
+	* getopt.c: Undef ELIDE_CODE for gawk.
+	(_getopt_internal_r): Init first.needs_free to 0. In test for -W
+	move executable code to after declarations for C90 compilers.
+	* getopt1.c: Undef ELIDE_CODE for gawk.
+
+	Minor bug fix with printf, thanks to John Haque:
+
+	* builtin.c (format_tree): Initialize base to zero at the top
+	of the while loop.
+
+	Getting next tar ball ready:
+
+	* configure.ac: Remove duplicate check for wcscoll. Thanks
+	to Stepan Kasal.
+
+2012-03-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* getopt.c, getopt.h, getopt1.c, getopt_int.h, regcomp.c,
+	regex.c, regex.h, regex_internal.c, regex_internal.h,
+	regexec.c: Sync with GLIBC, what the heck.
+
+2012-03-14         Eli Zaretskii  <eliz@gnu.org>
+
+	* mbsupport.h (btowc): Change for non-DJGPP.
+	* re.c (dfaerror): Add call to exit for DJGPP.
+
+2012-03-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regex_internal.c (re_string_skip_chars): Fix calculation of
+	remain_len with m.b. chars. Thanks to Stanislav Brabec
+	<sbrabec@suse.cz>.
+
+2012-02-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (init_groupset): Make `getgroups' failing a non-fatal
+	error.  After all, what's the big deal?  Should help on Plan 9.
+
+2012-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (parse_bracket_exp): Revert changes 2012-02-15 to stay
+	in sync with grep.
+	* dfa.h (dfarerror): Add __attribute__ from grep.
+
+2012-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix warnings from GCC 4.6.2 -Wall option.
+
+	* awkgram.y (newline_eof): New function to replace body of
+	NEWLINE_EOF macro.
+	(yylex): Replace body of NEWLINE_EOF macro.
+	* dfa.c (parse_bracket_exp): Init variables to zero.
+	* ext.c (dummy, junk): Remove.
+	* regex_internal.c (re_string_reconstruct): Remove buf array. It was
+	set but not used.
+
+2012-02-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2012-02-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (main): Move init of `output_fp' to before parsing of
+	program so that error messages from msg.c don't dump core.
+	Thanks to Michael Haardt <michael@moria.de>.
+
+2012-01-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c [is_valid_unibtye_character]: Fix from GNU grep to
+	bug reported by me from Scott Deifik for DJGPP.
+
+2012-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2012-01-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (Read_can_timeout, Read_timeout, Read_default_timeout):
+	Renamed to use lower case.
+	Other minor stylistic edits.
+
+2012-01-01         John Haque      <j.eh@mchsi.com>
+
+	* awk.h (struct iobuf): New entry read_func.
+	* io.c (Read_can_timeout, Read_timeout, Read_default_timeout):
+	New variables.
+	(init_io): New routine to initialize the variables.
+	(in_PROCINFO): New "clever" routine to parse elements with indices
+	separated by a SUPSEP.
+	(get_read_timeout): New routine to read timeout value for an IOBUF.
+	(read_with_timeout): New routine to read from a fd with a timeout.
+	(pty_vs_pipe): Use in_PROCINFO().
+	(get_a_record): Set the timeout value and the read routine as necessary.
+	* main.c (main): Call init_io().
+
+2011-12-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile_p.c: Remove the file.
+	* msg.c (err): Remove check for name being dgawk.
+
+2011-12-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h [STREQ, STREQN]: Remove macros.
+	* awkgram.y, builtin.c, command.y, debug.c, eval.c,
+	io.c, msg.c: Change all uses to call strcmp, strncmp.
+
+2011-12-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* int_array.c, str_array.c: Fix some compiler warnings 32/64
+	bit system differences.
+
+2011-12-26         John Haque      <j.eh@mchsi.com>
+
+	Merge gawk, pgawk and dgawk into a single executable gawk.
+
+	* awk.h (DO_PRETTY_PRINT, DO_PROFILE, DO_DEBUG,
+	do_pretty_print, do_debug): New defines.
+	(interpret): New variable, a pointer to an interpreter routine.
+	(enum exe_mode): Nuked.
+	* main.c (opttab): New options --pretty-print and --debug;
+	Remove option --command.
+	(usage): Update usage messages.
+	* interpret.h: New file.
+	* eval.c (r_interpret): Move to the new file.
+	(debug_interpret): New interpreter routine when debugging.
+	(init_interpret): New routine to initialize interpreter related
+	variables.
+	* eval_d.c, eval_p.c: Delete files.
+	* debug.c (interpret): Renamed to debug_prog.
+	(DEFAULT_PROMPT, DEFAULT_HISTFILE, DEFAULT_OPTFILE): Remove prefix 'd'.
+	* profile.c (init_profiling): Nuked.
+	* Makefile.am: Adjusted.
+
+	Add command line option --load for loading extensions.
+
+	* awk.h (srctype): Add new source type SRC_EXTLIB.
+	* ext.c(load_ext): New routine to load extension.
+	(do_ext): Adjust to use load_ext().
+	* main.c (opttab): Add new option --load.
+	(main): Call load_ext() to load extensions.
+	(usage): Add usage message for the new option.
+	* io.c (get_cwd): New routine.
+	(do_find_source): Use the new routine.
+	(find_source): Handle new type SRC_EXTLIB.
+	* awkgram.y (parse_program, next_sourcefile): Skip type SRC_EXTLIB.
+	(add_srcfile): Adjust call to find_source.
+	* debug.c (source_find): Same.
+
+	Unrelated:
+
+	* ext.c (get_argument): Fixed argument parsing.
+	* array.c (null_array_func): Reworked array routines for an empty array.
+	* str_array.c, int_array.c: Make GCC happy, use %u instead of %lu
+	printf formats.
+	* eval.c (node_Boolean): New array for TRUE and FALSE nodes.
+	(init_interpret): Create the new nodes.
+	(eval_condition): Add test for the new nodes.
+	(setup_frame): Disable tail-recursion optimization when profiling.
+	* interpret.h (r_interpret): Use the boolean nodes instead of making
+	new ones when needed.
+
+2011-12-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Finish Rational Range Interpretation (!)
+
+	* dfa.c (match_mb_charset): Compare wide characters directly
+	instead of using wcscoll().
+	* regexec.c (check_node_accept_byte): Ditto.
+
+	Thanks to Paolo Bonzini for pointing these out.
+
+2011-12-06         John Haque      <j.eh@mchsi.com>
+
+	* debug.c (source_find): Fix misplaced call to efree.
+	* profile.c (redir2str): Add a missing comma in the redirtab array.
+	* eval.c (r_interpret): Disallow call to exit if currule is undefined.
+	This avoids the possibility of running END blocks more than once when
+	used in a user-defined sorted-in comparison function.
+	* array.c (sort_user_func): Adjust appropriately.
+
+2011-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h, mbsupport.h: Changes for MBS support on DJGPP
+	and z/OS.
+	* io.c: Disable pty support on z/OS.
+
+2011-11-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+	* dfa.h: Add _GL_ATTRIBUTE_PURE macro. Bleah.
+
+2011-11-14         John Haque      <j.eh@mchsi.com>
+
+	* debug.c (set_breakpoint_at): Fix problem with setting
+	breakpoints in a switch statement. Thanks to Giorgio Palandri
+	<giorgio.palandri@gmail.com> for the bug report.
+
+2011-11-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* mbsupport.h: Add check for HAVE_BTOWC, per Pat Rankin.
+
+2011-11-12         Eli Zaretskii  <eliz@gnu.org>
+
+	* mbsupport.h: Additional glop for dfa.c in Windows environment.
+
+2011-11-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Move glop for ! MBS_SUPPORT to ...
+	* mbsupport.h: ... here.
+	* replace.c: Include missing_d/wcmisc.c if ! MBS_SUPPORT.
+	* regex_internal.h: Move include of mbsupport.h up and add
+	additional checks to avoid inclusion of wctype.h and wchar.h.
+
+2011-10-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_strftime): Per Pat Rankin, instead of casting
+	fclock, use a long variable and check for negative or overflow.
+
+2011-10-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Merge with gawk_performance branch done. Additionally:
+
+	* cint_array.c, int_array.c, str_array.c: Fix compiler complaints
+	about printf formats (signed / unsigned vs. %d / %u).
+	* eval.c (setup_frame): Add a missing return value.
+
+2011-10-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dist-hook): Use `cd $(srcdir)/pc' so that
+	`make distcheck' works completely.
+	* builtin.c (do_strftime): Add cast to long int in check
+	for fclock < 0 for systems where time_t is unsigned (e.g., VMS).
+
+2011-10-25  Stefano Lattarini  <stefano.lattarini@gmail.com>
+
+	dist: generated file `version.c' is not removed by "make distclean"
+
+	* Makefile.am (distcleancheck_listfiles): Define to ignore the
+	generated `version.c' file.
+
+2011-10-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c (wcscoll): Create for VMS.
+	* Makefile.am (dist-hook): Run sed scripts to make pc/config.h.
+
+2011-10-24  Eli Zaretskii  <eliz@gnu.org>
+
+	* builtin.c [HAVE_POPEN_H]: Include "popen.h".
+	* README.git: Update for pc/ systems.
+
+2011-10-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (distcleancheck_listfiles): Added, per advice from
+	Stefano Lattarini <stefano.lattarini@gmail.com>.
+	* dfa.c: Additional faking of mbsupport for systems without it;
+	mainly VMS.
+
+2011-10-21  Stefano Lattarini  <stefano.lattarini@gmail.com>
+
+	* configure.ac (AM_C_PROTOTYPES): Remove call to this macro.
+	The comments in configure.ac said that the call to AM_C_PROTOTYPES
+	was needed for dfa.h, synced from GNU grep; but this statement is
+	not true anymore in grep since commit v2.5.4-24-g9b5e7d4 "replace
+	AC_CHECK_* with gnulib modules", dating back to 2009-11-26.  Also,
+	the support for automatic de-ANSI-fication has been deprecated in
+	automake 1.11.2, and will be removed altogether in automake 1.12.
+	* vms/vms-conf.h (PROTOTYPES, __PROTOTYPES): Remove these #define,
+	they are not used anymore.
+	* pc/config.h (PROTOTYPES): Likewise.
+
+2011-10-18         Dave Pitts            <dpitts@cozx.com>
+
+	* dfa.c: Move some decls to the top of their functions for
+	C90 compilers.
+
+2011-10-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_strftime): Add check for negative / overflowed
+	time_t value with fatal error. Thanks to Hermann Peifer
+	<peifer@gmx.eu> for the bug report.
+	* dfa.c (setbit_wc): Non-MBS version. Add a return false
+	since VMS compiler doesn't understand that abort doesn't return.
+
+2011-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_sub): Init textlen to zero to avoid "may be
+	used uninitialized" warning. Thanks to Corinna Vinschen for
+	pointing this out.
+	* eval.c (unwind_stack): Add parentheses around condition in while
+	to avoid overzealous warning from GCC.
+
+2011-09-30  Eli Zaretskii  <eliz@gnu.org>
+
+	* io.c (remap_std_file): Fix non-portable code that caused
+	redirected "print" to fail if a previous read from standard input
+	returned EOF.  Reported by David Millis <tvtronix@yahoo.com>.
+	(remap_std_file): Per Eli's suggestion, removed the leading close
+	of oldfd and will let dup2 do the close for us.
+
+2011-10-11         John Haque     <j.eh@mchsi.com>
+
+	* symbol.c: Add licence notice.
+	* array.c (PREC_NUM, PREC_STR): Define as macros.
+
+2011-10-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2011-10-07         John Haque     <j.eh@mchsi.com>
+
+	Tail recursion optimization.
+	* awkgram.y (grammar, mk_function): Recognize tail-recursive
+	calls.
+	* awk.h (tail_call, num_tail_calls): New defines.
+	* eval.c (setup_frame): Reuse function call stack for
+	tail-recursive calls.
+	(dump_fcall_stack): Reworked.
+
+2011-10-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h, main.c (gawk_mb_cur_max): Make it a constant 1 when
+	MBS_SUPPORT isn't available to allow GCC dead code constant
+	expression computation and dead code elimination to help out.
+
+2011-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* io.c (rsnullscan, get_a_record): Fix the cases where terminators
+	are incomplete when RS == "". Also fix the case where the new value
+	is shorter than the old one.  Based on patch from Rogier
+	<rogier777@gmail.com> as submitted by Jeroen Schot
+	<schot@A-Eskwadraat.nl>.
+
+2011-09-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* eval.c, io.c, re.c: Fix some spelling errors. Thanks to
+	Jeroen Schot <schot@A-Eskwadraat.nl>.
+
+2011-09-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c, mbsupport.h: Sync with GNU grep. Large amount of changes
+	that remove many ifdefs, moving many conditions for multibyte
+	support into regular C code and relying GCC's dead code optimization
+	to eliminate code that won't be needed.
+	* dfa.c: For gawk, add a number of additional defines so that things
+	will compile if MBS_SUPPORT is 0.
+	* array.c, awk.h, awkgram.y, builtin.c, eval.c, field.c, main.c,
+	node.c, re.c: Change `#ifdef MBS_SUPPORT' to `#if MBS_SUPPORT'.
+	* awk.h, regex_internal.h: Move NO_MBSUPPORT handling to ...
+	* mbsupport.h: ...here.
+
+2011-09-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2011-09-08         John Haque     <j.eh@mchsi.com>
+
+	Optimization for compound assignment, increment and
+	decrement operators; Avoid unref and make_number calls
+	when there is no extra references to the value NODE.
+
+2011-09-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dfa.c: Sync with GNU grep.
+
+2011-08-31         John Haque     <j.eh@mchsi.com>
+
+	Grammar related changes: Simplify grammar for user-defined
+	functions and general cleanups.
+
+	* symbol.c: New file.
+	* awkgram.y: Move symbol table related routines to the
+	new file.
+	(rule, func_name, function_prologue, param_list): Reworked.
+	(install_function, check_params): Do all error checks
+	for the function name and parameters before installing in
+	the symbol table.
+	(mk_function): Finalize function definition.
+	(func_install, append_param, dup_params): Nuked.
+	* symbol.c (make_params): allocate function parameter nodes
+	for the symbol table. Use the hash node as Node_param_list;
+	Saves a NODE for each parameter.
+	(install_params): Install function parameters into the symbol
+	table.
+	(remove_params): Remove parameters out of the symbol table.
+	* awk.h (parmlist, FUNC): Nuked.
+	(fparms): New define.
+
+	Dynamically loaded function parameters are now handled like
+	those for a builtin.
+
+	* awk.h (Node_ext_func, Op_ext_builtin): New types.
+	(Op_ext_func): Nuked.
+	* ext.c (make_builtin): Simplified.
+	(get_curfunc_arg_count): Nuked; Use the argument 'nargs' of
+	the extension function instead.
+	(get_argument, get_actual_argument): Adjust.
+	* eval.c (r_interpret): Update case Op_func_call for a dynamic
+	extension function. Handle the new opcode Op_ext_builtin.
+	* pprint (profile.c): Adjust.
+
+	Use a single variable to process gawk options.
+
+	* awk.h (do_flags): New variable.
+	(DO_LINT_INVALID, DO_LINT_ALL, DO_LINT_OLD, DO_TRADITIONAL,
+	DO_POSIX, DO_INTL, DO_NON_DEC_DATA, DO_INTERVALS,
+	DO_PROFILING, DO_DUMP_VARS, DO_TIDY_MEM,
+	DO_SANDBOX): New defines.
+	(do_traditional, do_posix, do_intervals, do_intl,
+	do_non_decimal_data, do_profiling, do_dump_vars,
+	do_tidy_mem, do_sandbox, do_lint,
+	do_lint_old): Defined as macros.
+	* main.c: Remove definitions of the do_XX variables. Add
+	do_flags definition.
+	* debug.c (execute_code, do_eval, parse_condition): Save
+	do_flags before executing/parsing and restore afterwards.
+
+	Nuke PERM flag. Always increment/decrement the reference
+	count for a Node_val. Simplifies macros and avoids
+	occasional memory leaks, specially in the debugger.
+
+	* awk.h (UPREF, DEREF, dupnode, unref): Simplified.
+	(mk_number): Nuked.
+	* (*.c): Increment the reference count of Nnull_string before
+	assigning as a value.
+
+	Revamped array handling mechanism for more speed and
+	less memory consumption.
+
+	* awk.h (union bucket_item, BUCKET): New definitions. Used as
+	bucket elements for the hash table implementations of arrays;
+	40% space saving in 32 bit x86.
+	(buckets, nodes, array_funcs, array_base, array_capacity,
+	xarray, alookup, aexists, aclear, aremove, alist,
+	acopy, adump, NUM_AFUNCS): New defines.
+	(array_empty): New macro to test for an empty array.
+	(assoc_lookup, in_array): Defined as macros.
+	(enum assoc_list_flags): New declaration.
+	(Node_ahash, NUMIND): Nuked.
+	* eval.c (r_interpret): Adjust cases Op_subscript,
+	Op_subscript_lhs, Op_store_var and Op_arrayfor_incr.
+	* node.c (dupnode, unref): Removed code related to Node_ahash.
+	* str_array.c: New file to handle array with string indices.
+	* int_array.c: New file to handle array with integer indices.
+	* cint_array.c: New file. Special handling of arrays with
+	(mostly) consecutive integer indices.
+
+	Memory pool management reworked to handle NODE and BUCKET.
+
+	* awk.h (struct block_item, BLOCK, block_id): New definitions.
+	(getblock, freeblock): New macros.
+	(getbucket, freebucket): New macros to allocate and deallocate
+	a BUCKET.
+	(getnode, freenode): Adjusted.
+	* node.c (more_nodes): Nuked.
+	(more_blocks): New routine to allocate blocks of memory.
+
+2011-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix pty co-process communication on Ubuntu GNU/Linux.
+
+	* io.c: Add include of <sys/ioctl.h> to get definition of TIOCSCTTY.
+	(two_way_open): Move call for this ioctl to after setsid() call.
+
+2011-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regex_internal.c (re_string_fetch_byte_case): Remove
+	__attribute((pure)) since it causes failures with gcc -O2
+	-fno-inline. Thanks to Neil Cahill <ncahill_alt@yahoo.com>
+	for reporting the bug.
+
+2011-08-10         John Haque      <j.eh@mchsi.com>
+
+	BEGINFILE/ENDFILE related code redone.
+
+	* awk.h (prev_frame_size, has_endfile, target_get_record,
+	target_newfile): New defines.
+	* awkgram.y (mk_program): Initialize has_endfile appropriately for
+	Op_get_record.
+	(parse_program): Initialize new jump targets for
+	Op_get_record and Op_newfile.
+	* eval.c (unwind_stack): Change argument to number of
+	items to be left in the stack. Adjust code.
+	(pop_fcall, pop_stack): New defines.
+	(setup_frame): Initialize prev_frame_size.
+	(exec_state, EXEC_STATE): New structure and typedef.
+	(exec_state_stack): New variable.
+	(push_exec_state, pop_exec_state): New functions to save and
+	later retrieve an execution state.
+	(r_interpret): Use the new functions and the defines in
+	cases Op_K_getline, Op_after_beginfile, Op_after_endfile,
+	Op_newfile and Op_K_exit.
+	* io.c (after_beginfile): When skipping a file using nextfile,
+	return zero in case there was an error opening the file.
+	(has_endfile): Nuke global variable.
+	(inrec): Add a second argument to pass errno to the calling
+	routine.
+	* debug.c (print_instruction): Update cases.
+
+2011-08-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix (apparently long-standing) problem with FIELDWIDTHS.
+	Thanks to Johannes Meixner <jsmeix@suse.de>.
+
+	* field.c (set_FIELDWIDTHS): Adjust calculations.
+
+	Fix problem with FPAT, reported by "T. X. G." <leopardie333@yahoo.com>
+
+	* awk.h (Regexp): Add new member 'non_empty'.
+	* field.c (fpat_parse_field): Save/restore local variable non_empty
+	from member in Regexp struct.
+
+2011-08-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix pty issue reported by "T. X. G." <leopardie333@yahoo.com>
+
+	* configure.ac: Check for setsid.
+	* awk.h: If not HAVE_SETSID define it as an empty macro.
+	* io.c (two_way_open): Call setsid if using pty's.
+
+2011-07-29  Eli Zaretskii  <eliz@gnu.org>
+
+	* builtin.c (format_tree): Rename small -> small_flag,
+	big -> big_flag, bigbig -> bigbig_flag.  Solves compilation errors
+	when building Gawk with libsigsegv on MS-Windows, see
+	https://lists.gnu.org/archive/html/bug-gawk/2011-07/msg00029.html.
+
+2011-07-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* builtin.c (do_sub): Revert to gawk 3.1 behavior for backslash
+	handling. It was stupid to think I could break compatibility.
+	Thanks to John Ellson <ellson@research.att.com> for raising
+	the issue.
+
+2011-07-26         John Haque      <j.eh@mchsi.com>
+
+	* eval.c (r_interpret): In cases Op_var_assign and Op_field_assign,
+	include Op_K_getline_redir in the test for skipping the routine.
+
+2011-07-26         John Haque      <j.eh@mchsi.com>
+
+	Fix handling of assign routines for 'getline var'.
+	Rework the previous fix for (g)sub.
+
+	* awk.h: New define assign_ctxt for use in Op_var_assign
+	and Op_field_assign opcodes. Remove define AFTER_ASSIGN.
+	* awkgram.y (snode, mk_getline): Initialize assign_ctxt.
+	* builtin.c (do_sub): Adjust to take only the first two
+	arguments.
+	* eval.c (r_interpret): In cases Op_var_assign and Op_field_assign,
+	skip the routine as appropriate. Adjust case Op_sub_builtin.
+	* main.c (get_spec_varname): New function.
+	* debug.c (print_instruction): Use the new function to get
+	special variable name.
+
+2011-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* main.c (varinit): Mark FPAT as NON_STANDARD. Thanks to
+	Wolfgang Seeberg <wolfgang.seeberg@yahoo.com> for the report.
+	* Makefile.am (EXTRA_DIST): Add po/README, per advice from
+	Bruno Haible.
+	* dfa.c: Sync with GNU grep.
+	* xalloc.h (xzalloc): New function, from GNU grep, for dfa.c.
+	* README: Note that bug list is really a real mailing list.
+
+2011-07-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (AUTOMAKE_OPTIONS): Removed.
+	* configure.ac (AM_INIT_AUTOMAKE): Removed dist-bzip2 option, on
+	advice from Karl Berry.
+
+2011-07-15         John Haque      <j.eh@mchsi.com>
+
+	* awk.h (Op_sub_builtin): New opcode.
+	(GSUB, GENSUB, AFTER_ASSIGN, LITERAL): New flags for
+	Op_sub_builtin.
+	* awkgram.y (struct tokentab): Change opcode to	Op_sub_builtin
+	for sub, gsub and gensub.
+	(snode): Update processing of sub, gsub and gensub.
+	* builtin.c (do_sub, do_gsub, do_gensub): Nuke.
+	(sub_common): Renamed to do_sub. Relocate gensub argument
+	handling code from do_gensub to here; Simplify the code a
+	little bit.
+	* eval.c (r_interpret): Handle Op_sub_builtin. Avoid field
+	re-splitting or $0 rebuilding if (g)sub target string is
+	a field and no substitutions were done.
+	* pprint (profile.c): Add case for the new opcode.
+	* print_instruction (debug.c): Ditto.
+
+	Take out translation for errno strings; extensions will
+	need to use their own domain.
+
+	* awk.h (enum errno_translate): Removed.
+	(update_ERRNO_string): Remove second translate parameter.
+	* eval.c (update_ERRNO_string): Remove second translate parameter
+	and code that used it.
+	* gawkapi.h (api_update_ERRNO_string): Remove third translate
+	parameter.
+	* gawkapi.c (api_update_ERRNO_string): Remove third translate
+	parameter and change call to update_ERRNO_string.
+	* io.c (do_close): Fix call to update_ERRNO_string.
+
+2011-07-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awk.h: Typo fix: "loner" --> longer. Thanks to Nelson Beebe.
+	* builtin.c (efwrite): Fix flushing test back to what it was
+	in 3.1.8. Thanks to Strefil <strefil@yandex.ru> for the problem
+	report.
+	* configure.ac: Bump version to 4.0.0a for stable branch.
+
+2011-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.0.
+	* 4.0.0: Remake the tar ball.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Update version to 4.0.0.
+	* configure: Regenerated.
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* README: Bump version to 4.0.0.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/INSTALL b/gawk-5.0.1/INSTALL
new file mode 100644
index 00000000000..2099840756e
--- /dev/null
+++ b/gawk-5.0.1/INSTALL
@@ -0,0 +1,370 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
+Inc.
+
+   Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.  This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+   Briefly, the shell command `./configure && make && make install'
+should configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.  Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below.  The lack of an optional feature in a given package is not
+necessarily a bug.  More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+   The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package, generally using the just-built uninstalled binaries.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.  When installing into a prefix owned by root, it is
+     recommended that the package be configured and built as a regular
+     user, and only the `make install' phase executed with root
+     privileges.
+
+  5. Optionally, type `make installcheck' to repeat any self-tests, but
+     this time using the binaries in their final installed location.
+     This target does not install anything.  Running this target as a
+     regular user, particularly if the prior `make install' required
+     root privileges, verifies that the installation completed
+     correctly.
+
+  6. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  7. Often, you can also type `make uninstall' to remove the installed
+     files again.  In practice, not all packages have tested that
+     uninstallation works correctly, even though it is required by the
+     GNU Coding Standards.
+
+  8. Some packages, particularly those that use Automake, provide `make
+     distcheck', which can by used by developers to test that all other
+     targets like `make install' and `make uninstall' work correctly.
+     This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.  This
+is known as a "VPATH" build.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.  In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+   The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+   The first method involves providing an override variable for each
+affected directory.  For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'.  Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated.  The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the `DESTDIR' variable.  For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names.  The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters.  On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+   Some packages offer the ability to configure how verbose the
+execution of `make' will be.  For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved.  Use GNU `make'
+instead.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+   On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS
+     KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf limitation.  Until the limitation is lifted, you can use
+this workaround:
+
+     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
diff --git a/gawk-5.0.1/Makefile.am b/gawk-5.0.1/Makefile.am
new file mode 100644
index 00000000000..3b55ff3bc3b
--- /dev/null
+++ b/gawk-5.0.1/Makefile.am
@@ -0,0 +1,222 @@
+#
+# Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 2000-2019 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+## process this file with automake to produce Makefile.in
+
+# This variable insures that aclocal runs
+# correctly after changing configure.ac
+ACLOCAL_AMFLAGS = -I m4
+
+# This insures that make flags get passed down to child makes.
+AM_MAKEFLAGS = 'CFLAGS=$(CFLAGS)' 'LDFLAGS=$(LDFLAGS)'
+
+# Stuff to include in the dist that doesn't need it's own
+# Makefile.am files
+EXTRA_DIST = \
+	ChangeLog.0 \
+	ChangeLog.1 \
+	COPYING \
+	INSTALL \
+	NEWS \
+	NEWS.0 \
+	NEWS.1 \
+	POSIX.STD \
+	README_d \
+	config.guess \
+	config.rpath  \
+	config.sub \
+	depcomp \
+	m4 \
+	missing \
+	missing_d \
+	po/README \
+	pc \
+	posix \
+	vms \
+	ylwrap
+
+# The order to do things in.
+#
+# Build in support first, since we need the support library.
+#
+# Build explicitly in "." in order to build gawk first, so
+# that `make check' without a prior `make' works.
+SUBDIRS = support .
+
+# Build in extension before test so that
+# 	./configure && make check
+# works properly too.
+if ENABLE_EXTENSIONS
+SUBDIRS += extension
+endif
+
+# Build in awklib after in doc, since we want to extract
+# sample files if doc/gawk.texi changed.
+SUBDIRS += extras doc awklib po test
+
+# what to make and install
+bin_PROGRAMS = gawk
+include_HEADERS = gawkapi.h
+
+# sources for both gawk and dgawk
+base_sources = \
+	array.c \
+	awk.h \
+	awkgram.y \
+	builtin.c \
+	cint_array.c \
+	cmd.h \
+	command.y \
+	custom.h \
+	debug.c \
+	eval.c \
+	ext.c \
+	field.c \
+	floatcomp.c \
+	floatmagic.h \
+	gawkapi.c \
+	gawkapi.h \
+	gawkmisc.c \
+	gettext.h \
+	int_array.c \
+	interpret.h \
+	io.c \
+	mbsupport.h \
+	main.c \
+	mpfr.c \
+	msg.c \
+	node.c \
+	nonposix.h \
+	profile.c \
+	protos.h \
+	re.c \
+	replace.c \
+	str_array.c \
+	symbol.c \
+	version.c
+
+gawk_SOURCES = $(base_sources)
+
+# Get extra libs as needed, Automake will supply LIBINTL and SOCKET_LIBS.
+LDADD = support/libsupport.a \
+	$(LIBSIGSEGV) $(LIBINTL) $(SOCKET_LIBS) $(LIBREADLINE) $(LIBMPFR)
+
+# Directory for gawk's data files. Automake supplies datadir.
+pkgdatadir = $(datadir)/awk
+
+# stuff for compiling gawk/pgawk
+DEFPATH='".$(PATH_SEPARATOR)$(pkgdatadir)"'
+
+# shared library support:
+SHLIBEXT = "\"$(GAWKLIBEXT)"\"
+DEFLIBPATH="\"$(pkgextensiondir)\""
+
+DEFS= -DDEFPATH=$(DEFPATH) -DDEFLIBPATH=$(DEFLIBPATH) -DSHLIBEXT=$(SHLIBEXT) -DHAVE_CONFIG_H -DGAWK -DLOCALEDIR='"$(datadir)/locale"' -I"$(srcdir)/support"
+
+# Get rid of core files when cleaning
+CLEANFILES = core core.*
+
+# We want hard links for install-exec-hook, below
+LN= ln
+
+# For some make's, e.g. OpenBSD, that don't define this
+RM = rm -f
+
+# First, add a link from gawk to gawk-X.Y.Z.
+#
+# For GNU systems where gawk is awk, add a link to awk.
+# (This is done universally, which may not always be right, but
+# there's no easy way to distinguish GNU from non-GNU systems.)
+#
+# Use the transform, in case --program-prefix=XXX
+install-exec-hook:
+	(cd $(DESTDIR)$(bindir); \
+	name=`echo gawk | sed '$(transform)'` ; \
+	$(LN) $${name}$(EXEEXT) gawk-$(VERSION)$(EXEEXT) 2>/dev/null ; \
+	if [ ! -f awk$(EXEEXT) ]; \
+	then	$(LN_S) $${name}$(EXEEXT) awk$(EXEEXT); \
+	fi; exit 0)
+
+# Undo the above when uninstalling
+uninstall-links:
+	(cd $(DESTDIR)$(bindir); \
+	name=`echo gawk | sed '$(transform)'` ; \
+	if [ -f awk$(EXEEXT) ] && cmp awk$(EXEEXT) $${name}$(EXEEXT) > /dev/null; then rm -f awk$(EXEEXT); fi ; \
+	rm -f gawk-$(VERSION)$(EXEEXT); exit 0)
+
+uninstall-recursive: uninstall-links
+
+# force there to be a gawk executable before running tests
+check-local: gawk$(EXEEXT)
+
+# A little extra clean up when making distributions.
+# And additional set up for the pc directory.
+dist-hook: pc/Makefile.tst
+	cd "$(distdir)"/extension ; rm -f *.o *.so
+	cd "$(srcdir)"/pc ; \
+	chmod u+w config.h ; \
+	sed -n -f configpk.sed < ../configure.ac > /tmp/tmp.sed ; \
+	sed -f config.sed < ../configh.in > /tmp/config.tmp ; \
+	sed -f /tmp/tmp.sed < /tmp/config.tmp > config.h ; \
+	$(RM) /tmp/tmp.sed /tmp/config.tmp
+	pwd
+	chmod u+w "$(distdir)"/pc/config.h
+	cp "$(srcdir)"/pc/config.h "$(distdir)"/pc/config.h
+
+# Special rules for individual files
+
+awkgram.c: awkgram.y
+	$(YACC) -o $@ $(AM_YFLAGS) $(YFLAGS) $<
+	sed 's/parse error/syntax error/g' < $@ > $@.tmp && mv $@.tmp $@
+
+command.c: command.y
+	$(YACC) -o $@ -p zz $<
+	sed 's/parse error/syntax error/g' < $@ > $@.tmp && mv $@.tmp $@
+
+pc/Makefile.tst: test/Makefile.in
+	test -d pc || mkdir pc
+	cat "$(top_srcdir)"/pc/Makefile.tst.prologue > pc/Makefile.tst
+	awk -f "$(top_srcdir)"/pc/GenMakefileTst.awk "$(top_srcdir)"/test/Makefile.in >> pc/Makefile.tst
+
+# This is for my development & testing.
+efence: gawk
+	$(CC) $(LDFLAGS) -o gawk $$(ls *.o | grep -v '_p.o$$') $(LDADD) $(LIBS) -lefence
+
+diffout valgrind-scan:
+	@cd test && $(MAKE) $(AM_MAKEFLAGS) $@
+
+valgrind:
+	cd test; rm -f log.[0-9]*; \
+	make check VALGRIND="valgrind --leak-check=full --log-file=log.%p"; \
+	make valgrind-scan
+
+valgrind-noleak:
+	cd test; rm -f log.[0-9]*; \
+	make check VALGRIND="valgrind --leak-check=no --log-file=log.%p"; \
+	make valgrind-scan
+
+spell:
+	cd "$(srcdir)"/doc ; $(MAKE) spell
+
+distclean-local:
+	rm -fr .deps
diff --git a/gawk-5.0.1/Makefile.in b/gawk-5.0.1/Makefile.in
new file mode 100644
index 00000000000..61f37a2d866
--- /dev/null
+++ b/gawk-5.0.1/Makefile.in
@@ -0,0 +1,1303 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 2000-2019 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+
+# Build in extension before test so that
+# 	./configure && make check
+# works properly too.
+@ENABLE_EXTENSIONS_TRUE@am__append_1 = extension
+bin_PROGRAMS = gawk$(EXEEXT)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \
+	$(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libsigsegv.m4 $(top_srcdir)/m4/longlong.m4 \
+	$(top_srcdir)/m4/mpfr.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/noreturn.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/readline.m4 \
+	$(top_srcdir)/m4/socket.m4 $(top_srcdir)/m4/ulonglong.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(include_HEADERS) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"
+PROGRAMS = $(bin_PROGRAMS)
+am__objects_1 = array.$(OBJEXT) awkgram.$(OBJEXT) builtin.$(OBJEXT) \
+	cint_array.$(OBJEXT) command.$(OBJEXT) debug.$(OBJEXT) \
+	eval.$(OBJEXT) ext.$(OBJEXT) field.$(OBJEXT) \
+	floatcomp.$(OBJEXT) gawkapi.$(OBJEXT) gawkmisc.$(OBJEXT) \
+	int_array.$(OBJEXT) io.$(OBJEXT) main.$(OBJEXT) mpfr.$(OBJEXT) \
+	msg.$(OBJEXT) node.$(OBJEXT) profile.$(OBJEXT) re.$(OBJEXT) \
+	replace.$(OBJEXT) str_array.$(OBJEXT) symbol.$(OBJEXT) \
+	version.$(OBJEXT)
+am_gawk_OBJECTS = $(am__objects_1)
+gawk_OBJECTS = $(am_gawk_OBJECTS)
+gawk_LDADD = $(LDADD)
+am__DEPENDENCIES_1 =
+gawk_DEPENDENCIES = support/libsupport.a $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/array.Po ./$(DEPDIR)/awkgram.Po \
+	./$(DEPDIR)/builtin.Po ./$(DEPDIR)/cint_array.Po \
+	./$(DEPDIR)/command.Po ./$(DEPDIR)/debug.Po \
+	./$(DEPDIR)/eval.Po ./$(DEPDIR)/ext.Po ./$(DEPDIR)/field.Po \
+	./$(DEPDIR)/floatcomp.Po ./$(DEPDIR)/gawkapi.Po \
+	./$(DEPDIR)/gawkmisc.Po ./$(DEPDIR)/int_array.Po \
+	./$(DEPDIR)/io.Po ./$(DEPDIR)/main.Po ./$(DEPDIR)/mpfr.Po \
+	./$(DEPDIR)/msg.Po ./$(DEPDIR)/node.Po ./$(DEPDIR)/profile.Po \
+	./$(DEPDIR)/re.Po ./$(DEPDIR)/replace.Po \
+	./$(DEPDIR)/str_array.Po ./$(DEPDIR)/symbol.Po \
+	./$(DEPDIR)/version.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \
+		   -e s/c++$$/h++/ -e s/c$$/h/
+YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS)
+AM_V_YACC = $(am__v_YACC_@AM_V@)
+am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@)
+am__v_YACC_0 = @echo "  YACC    " $@;
+am__v_YACC_1 = 
+YLWRAP = $(top_srcdir)/ylwrap
+SOURCES = $(gawk_SOURCES)
+DIST_SOURCES = $(gawk_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+HEADERS = $(include_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	cscope distdir distdir-am dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)configh.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+DIST_SUBDIRS = support . extension extras doc awklib po test
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/configh.in ABOUT-NLS \
+	AUTHORS COPYING ChangeLog INSTALL NEWS README TODO awkgram.c \
+	command.c compile config.guess config.rpath config.sub depcomp \
+	install-sh missing mkinstalldirs ylwrap
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.lz $(distdir).tar.xz
+GZIP_ENV = --best
+DIST_TARGETS = dist-lzip dist-xz dist-gzip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+
+# Directory for gawk's data files. Automake supplies datadir.
+pkgdatadir = $(datadir)/awk
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = -DDEFPATH=$(DEFPATH) -DDEFLIBPATH=$(DEFLIBPATH) -DSHLIBEXT=$(SHLIBEXT) -DHAVE_CONFIG_H -DGAWK -DLOCALEDIR='"$(datadir)/locale"' -I"$(srcdir)/support"
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GAWKLIBEXT = @GAWKLIBEXT@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_LIBSIGSEGV = @HAVE_LIBSIGSEGV@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMPFR = @LIBMPFR@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBSIGSEGV = @LIBSIGSEGV@
+LIBSIGSEGV_PREFIX = @LIBSIGSEGV_PREFIX@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSIGSEGV = @LTLIBSIGSEGV@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+ZOS_FAIL = @ZOS_FAIL@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+acl_shlibext = @acl_shlibext@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgextensiondir = @pkgextensiondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# This variable insures that aclocal runs
+# correctly after changing configure.ac
+ACLOCAL_AMFLAGS = -I m4
+
+# This insures that make flags get passed down to child makes.
+AM_MAKEFLAGS = 'CFLAGS=$(CFLAGS)' 'LDFLAGS=$(LDFLAGS)'
+
+# Stuff to include in the dist that doesn't need it's own
+# Makefile.am files
+EXTRA_DIST = \
+	ChangeLog.0 \
+	ChangeLog.1 \
+	COPYING \
+	INSTALL \
+	NEWS \
+	NEWS.0 \
+	NEWS.1 \
+	POSIX.STD \
+	README_d \
+	config.guess \
+	config.rpath  \
+	config.sub \
+	depcomp \
+	m4 \
+	missing \
+	missing_d \
+	po/README \
+	pc \
+	posix \
+	vms \
+	ylwrap
+
+
+# The order to do things in.
+#
+# Build in support first, since we need the support library.
+#
+# Build explicitly in "." in order to build gawk first, so
+# that `make check' without a prior `make' works.
+
+# Build in awklib after in doc, since we want to extract
+# sample files if doc/gawk.texi changed.
+SUBDIRS = support . $(am__append_1) extras doc awklib po test
+include_HEADERS = gawkapi.h
+
+# sources for both gawk and dgawk
+base_sources = \
+	array.c \
+	awk.h \
+	awkgram.y \
+	builtin.c \
+	cint_array.c \
+	cmd.h \
+	command.y \
+	custom.h \
+	debug.c \
+	eval.c \
+	ext.c \
+	field.c \
+	floatcomp.c \
+	floatmagic.h \
+	gawkapi.c \
+	gawkapi.h \
+	gawkmisc.c \
+	gettext.h \
+	int_array.c \
+	interpret.h \
+	io.c \
+	mbsupport.h \
+	main.c \
+	mpfr.c \
+	msg.c \
+	node.c \
+	nonposix.h \
+	profile.c \
+	protos.h \
+	re.c \
+	replace.c \
+	str_array.c \
+	symbol.c \
+	version.c
+
+gawk_SOURCES = $(base_sources)
+
+# Get extra libs as needed, Automake will supply LIBINTL and SOCKET_LIBS.
+LDADD = support/libsupport.a \
+	$(LIBSIGSEGV) $(LIBINTL) $(SOCKET_LIBS) $(LIBREADLINE) $(LIBMPFR)
+
+
+# stuff for compiling gawk/pgawk
+DEFPATH = '".$(PATH_SEPARATOR)$(pkgdatadir)"'
+
+# shared library support:
+SHLIBEXT = "\"$(GAWKLIBEXT)"\"
+DEFLIBPATH = "\"$(pkgextensiondir)\""
+
+# Get rid of core files when cleaning
+CLEANFILES = core core.*
+
+# We want hard links for install-exec-hook, below
+LN = ln
+
+# For some make's, e.g. OpenBSD, that don't define this
+RM = rm -f
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj .y
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@test -f $@ || rm -f stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/configh.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/configh.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	      echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+gawk$(EXEEXT): $(gawk_OBJECTS) $(gawk_DEPENDENCIES) $(EXTRA_gawk_DEPENDENCIES) 
+	@rm -f gawk$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gawk_OBJECTS) $(gawk_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/awkgram.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/builtin.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cint_array.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/command.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eval.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ext.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/field.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/floatcomp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gawkapi.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gawkmisc.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/int_array.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpfr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msg.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/node.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/profile.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/re.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/replace.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/str_array.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symbol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.y.c:
+	$(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE)
+install-includeHEADERS: $(include_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
+	done
+
+uninstall-includeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-hook
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) check-local
+check: check-recursive
+all-am: Makefile $(PROGRAMS) $(HEADERS) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+	-rm -f awkgram.c
+	-rm -f command.c
+clean: clean-recursive
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+		-rm -f ./$(DEPDIR)/array.Po
+	-rm -f ./$(DEPDIR)/awkgram.Po
+	-rm -f ./$(DEPDIR)/builtin.Po
+	-rm -f ./$(DEPDIR)/cint_array.Po
+	-rm -f ./$(DEPDIR)/command.Po
+	-rm -f ./$(DEPDIR)/debug.Po
+	-rm -f ./$(DEPDIR)/eval.Po
+	-rm -f ./$(DEPDIR)/ext.Po
+	-rm -f ./$(DEPDIR)/field.Po
+	-rm -f ./$(DEPDIR)/floatcomp.Po
+	-rm -f ./$(DEPDIR)/gawkapi.Po
+	-rm -f ./$(DEPDIR)/gawkmisc.Po
+	-rm -f ./$(DEPDIR)/int_array.Po
+	-rm -f ./$(DEPDIR)/io.Po
+	-rm -f ./$(DEPDIR)/main.Po
+	-rm -f ./$(DEPDIR)/mpfr.Po
+	-rm -f ./$(DEPDIR)/msg.Po
+	-rm -f ./$(DEPDIR)/node.Po
+	-rm -f ./$(DEPDIR)/profile.Po
+	-rm -f ./$(DEPDIR)/re.Po
+	-rm -f ./$(DEPDIR)/replace.Po
+	-rm -f ./$(DEPDIR)/str_array.Po
+	-rm -f ./$(DEPDIR)/symbol.Po
+	-rm -f ./$(DEPDIR)/version.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-local distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+		-rm -f ./$(DEPDIR)/array.Po
+	-rm -f ./$(DEPDIR)/awkgram.Po
+	-rm -f ./$(DEPDIR)/builtin.Po
+	-rm -f ./$(DEPDIR)/cint_array.Po
+	-rm -f ./$(DEPDIR)/command.Po
+	-rm -f ./$(DEPDIR)/debug.Po
+	-rm -f ./$(DEPDIR)/eval.Po
+	-rm -f ./$(DEPDIR)/ext.Po
+	-rm -f ./$(DEPDIR)/field.Po
+	-rm -f ./$(DEPDIR)/floatcomp.Po
+	-rm -f ./$(DEPDIR)/gawkapi.Po
+	-rm -f ./$(DEPDIR)/gawkmisc.Po
+	-rm -f ./$(DEPDIR)/int_array.Po
+	-rm -f ./$(DEPDIR)/io.Po
+	-rm -f ./$(DEPDIR)/main.Po
+	-rm -f ./$(DEPDIR)/mpfr.Po
+	-rm -f ./$(DEPDIR)/msg.Po
+	-rm -f ./$(DEPDIR)/node.Po
+	-rm -f ./$(DEPDIR)/profile.Po
+	-rm -f ./$(DEPDIR)/re.Po
+	-rm -f ./$(DEPDIR)/replace.Po
+	-rm -f ./$(DEPDIR)/str_array.Po
+	-rm -f ./$(DEPDIR)/symbol.Po
+	-rm -f ./$(DEPDIR)/version.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS
+
+.MAKE: $(am__recursive_targets) all check-am install-am \
+	install-exec-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--depfiles am--refresh check check-am check-local clean \
+	clean-binPROGRAMS clean-cscope clean-generic cscope \
+	cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+	dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \
+	dist-zip distcheck distclean distclean-compile \
+	distclean-generic distclean-hdr distclean-local distclean-tags \
+	distcleancheck distdir distuninstallcheck dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-exec-hook install-html \
+	install-html-am install-includeHEADERS install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-includeHEADERS
+
+.PRECIOUS: Makefile
+
+
+# First, add a link from gawk to gawk-X.Y.Z.
+#
+# For GNU systems where gawk is awk, add a link to awk.
+# (This is done universally, which may not always be right, but
+# there's no easy way to distinguish GNU from non-GNU systems.)
+#
+# Use the transform, in case --program-prefix=XXX
+install-exec-hook:
+	(cd $(DESTDIR)$(bindir); \
+	name=`echo gawk | sed '$(transform)'` ; \
+	$(LN) $${name}$(EXEEXT) gawk-$(VERSION)$(EXEEXT) 2>/dev/null ; \
+	if [ ! -f awk$(EXEEXT) ]; \
+	then	$(LN_S) $${name}$(EXEEXT) awk$(EXEEXT); \
+	fi; exit 0)
+
+# Undo the above when uninstalling
+uninstall-links:
+	(cd $(DESTDIR)$(bindir); \
+	name=`echo gawk | sed '$(transform)'` ; \
+	if [ -f awk$(EXEEXT) ] && cmp awk$(EXEEXT) $${name}$(EXEEXT) > /dev/null; then rm -f awk$(EXEEXT); fi ; \
+	rm -f gawk-$(VERSION)$(EXEEXT); exit 0)
+
+uninstall-recursive: uninstall-links
+
+# force there to be a gawk executable before running tests
+check-local: gawk$(EXEEXT)
+
+# A little extra clean up when making distributions.
+# And additional set up for the pc directory.
+dist-hook: pc/Makefile.tst
+	cd "$(distdir)"/extension ; rm -f *.o *.so
+	cd "$(srcdir)"/pc ; \
+	chmod u+w config.h ; \
+	sed -n -f configpk.sed < ../configure.ac > /tmp/tmp.sed ; \
+	sed -f config.sed < ../configh.in > /tmp/config.tmp ; \
+	sed -f /tmp/tmp.sed < /tmp/config.tmp > config.h ; \
+	$(RM) /tmp/tmp.sed /tmp/config.tmp
+	pwd
+	chmod u+w "$(distdir)"/pc/config.h
+	cp "$(srcdir)"/pc/config.h "$(distdir)"/pc/config.h
+
+# Special rules for individual files
+
+awkgram.c: awkgram.y
+	$(YACC) -o $@ $(AM_YFLAGS) $(YFLAGS) $<
+	sed 's/parse error/syntax error/g' < $@ > $@.tmp && mv $@.tmp $@
+
+command.c: command.y
+	$(YACC) -o $@ -p zz $<
+	sed 's/parse error/syntax error/g' < $@ > $@.tmp && mv $@.tmp $@
+
+pc/Makefile.tst: test/Makefile.in
+	test -d pc || mkdir pc
+	cat "$(top_srcdir)"/pc/Makefile.tst.prologue > pc/Makefile.tst
+	awk -f "$(top_srcdir)"/pc/GenMakefileTst.awk "$(top_srcdir)"/test/Makefile.in >> pc/Makefile.tst
+
+# This is for my development & testing.
+efence: gawk
+	$(CC) $(LDFLAGS) -o gawk $$(ls *.o | grep -v '_p.o$$') $(LDADD) $(LIBS) -lefence
+
+diffout valgrind-scan:
+	@cd test && $(MAKE) $(AM_MAKEFLAGS) $@
+
+valgrind:
+	cd test; rm -f log.[0-9]*; \
+	make check VALGRIND="valgrind --leak-check=full --log-file=log.%p"; \
+	make valgrind-scan
+
+valgrind-noleak:
+	cd test; rm -f log.[0-9]*; \
+	make check VALGRIND="valgrind --leak-check=no --log-file=log.%p"; \
+	make valgrind-scan
+
+spell:
+	cd "$(srcdir)"/doc ; $(MAKE) spell
+
+distclean-local:
+	rm -fr .deps
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/NEWS b/gawk-5.0.1/NEWS
new file mode 100644
index 00000000000..9846fe113ad
--- /dev/null
+++ b/gawk-5.0.1/NEWS
@@ -0,0 +1,72 @@
+   Copyright (C) 2019, Free Software Foundation, Inc.
+   
+   Copying and distribution of this file, with or without modification,
+   are permitted in any medium without royalty provided the copyright
+   notice and this notice are preserved.
+
+Changes from 5.0.0 to 5.0.1
+---------------------------
+
+1. A number of ChangeLog.1 files that were left out of the distribution
+   have been restored.
+
+2. Multiple syntax errors should no longer be able to cause a core dump.
+
+3. Sandbox mode now disallows assigning new filename values in ARGV that
+   were not there when gawk was invoked.
+
+4. There are many small documentation improvements in the manual.
+
+5. The new argument "no-ext" to --lint disables ``XXX is a gawk extension''
+   lint warnings.
+
+6. Infrastructure upgrades: Bison 3.4.
+
+N. A number of bugs, some of them quite significant, have been fixed.
+   See the ChangeLog for details.
+
+Changes from 4.2.1 to 5.0.0
+---------------------------
+
+1. Support for the POSIX standard %a and %A printf formats has been added.
+
+2. The test infrastructure has been greatly improved, simplifying the
+   contents of test/Makefile.am and making it possible to generate
+   pc/Makefile.tst from test/Makefile.in.
+
+3. The regex routines have been replaced with those from GNULIB, allowing
+   me to stop carrying forward decades of changes against the original
+   ones from GLIBC.
+
+4. Infrastructure upgrades: Bison 3.3, Automake 1.16.1, Gettext 0.19.8.1,
+   makeinfo 6.5.
+
+5. The undocumented configure option and code that enabled the use of
+   non-English "letters" in identifiers is now gone.
+
+6. The `--with-whiny-user-strftime' configuration option is now gone.
+
+7. The code now makes some stronger assumptions about a C99 environment.
+
+8. PROCINFO["platform"] yields a string indicating the platform for
+   which gawk was compiled.
+
+9. Writing to elements of SYMTAB that are not variable names now
+   causes a fatal error. THIS CHANGES BEHAVIOR.
+
+10. Comment handling in the pretty-printer has been reworked almost completely
+    from scratch. As a result, comments in many corner cases that were
+    previously lost are now included in the formatted output.
+
+11. Namespaces have been implemented! See the manual.  One consequence of this
+    is that files included with -i, read with -f, and command line program
+    segments must all be self-contained syntactic units. E.g., you can no
+    longer do something like this:
+
+   	gawk -e 'BEGIN {' -e 'print "hello" }'
+
+12. Gawk now uses the locale settings for ignoring case in single byte
+    locales, instead of hardwiring in Latin-1.
+
+13. A number of bugs, some of them quite significant, have been fixed.
+    See the ChangeLog for details.
diff --git a/gawk-5.0.1/NEWS.0 b/gawk-5.0.1/NEWS.0
new file mode 100644
index 00000000000..54e4dc027ec
--- /dev/null
+++ b/gawk-5.0.1/NEWS.0
@@ -0,0 +1,2542 @@
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+   2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+   
+   Copying and distribution of this file, with or without modification,
+   are permitted in any medium without royalty provided the copyright
+   notice and this notice are preserved.
+ 
+Changes from 3.1.7 to 3.1.8
+---------------------------
+1. The zero flag no longer applies to %c and %s; apparently the standards
+   changed at some point.
+
+2. Updated to latest infrastructure: Autoconf 2.65, Automake 1.11.1,
+   libtool 2.2.6b, Bison 2.4.2.
+
+3. Failure to open a socket is no longer a fatal error.
+
+4. dfa.h and dfa.c are now more-or-less in sync with GNU grep, for the first
+   time in many years.
+
+5. Gawk no longer includes its own copy of libsigsegv but it will use it if
+   installed on the build system. The --disable-libsigsegv configure option
+   is now gone.
+
+6. The ' flag (%'d) is now just ignored on systems that can't support it.
+
+7. Lots of bug fixes, see the ChangeLog.
+
+Changes from 3.1.6 to 3.1.7
+---------------------------
+1. Gawk now has support for z/OS (IBM S/390 architecture).
+
+2. Gawk now handles multibyte strings better in [s]printf with field
+   widths and such.
+
+3. Gawk now uses libsigsegv to print a message before core dumping. This
+   handles infinite recursion of an awk function a little better.
+   Use of the library can be disabled at configure time with the
+   --disable-libsigsegv option for unusual systems.
+
+4. The handling of BINMODE is now somewhat more sane.
+
+5. A getline from a directory is no longer fatal; instead it returns -1.
+
+6. Per POSIX, special variable names (like FS) cannot be used as function
+   parameter names.
+
+7. The new -O / --optimize option enables simple constant folding on
+   the parse tree during parsing.  We hope that with time the number
+   of optimizations will increase.
+
+8. Updated to the latest autotools: Autoconf 2.63, Automake 1.11,
+   Libtool 2.2.6a, and Gettext 0.17. Also latest Bison: 2.4.1.
+
+9. Some improvement in testing for isinf / isnan in builtin.c.
+
+10. Improved the handling of `a = a b c' to be more general.
+
+11. Locale handling for %'d should now work on certain non-Unix /
+    non-Linux systems.
+
+12. Lots of bugs fixed, see the ChangeLog for the details.
+ 
+Changes from 3.1.5 to 3.1.6
+---------------------------
+
+1. `gawk 'program' /non/existant/file' no longer core dumps.
+
+2. Too many people the world over have complained about gawk's use of the
+   locale's decimal point for parsing input data instead of the traditional
+   period.  So, even though gawk was being nicely standards-compliant, in
+   a Triumph For The Users, gawk now only uses the locale's decimal point
+   if --posix is supplied or if POSIXLY_CORRECT is set.  It is the sincere
+   hope that this change will eliminate this FAQ from being asked.
+
+3. `gawk -v BINMODE=1 ...' works again.
+
+4. Internal file names like `/dev/user' now work again. (Note that these
+   file names are obsolete and will go away eventually.)
+
+5. Problems with wide strings in non "C" locales have been straightened
+   out everywhere.  (At least, we think so.)
+
+6. Use of `ansi2knr' is no longer supported. Please use an ANSI C compiler.
+
+7. Updated to Autoconf 2.61, Automake 1.10, and Gettext 0.16.1.
+
+8. The getopt* and regex* files were synchronized with current GLIBC CVS.
+   See the ChangeLog for the versions and minor edits made.
+
+9. There are additional --lint-old warnings.
+
+10. Gawk now uses getaddrinfo(3) to look up names and IP addresses. This
+    allows the use of an IPv6 format address and paves the way for
+    eventual addition of `/inet6/...' and `/inet4/...' hostnames.
+
+11. We believe gawk to now be valgrind clean. At least when run against
+    the test suite.
+
+12. A number of issues dealing with the formatting and printing of very
+    large numbers in integer formats have been dealt with and fixed.
+
+13. Gawk now converts "+inf", "-inf", "+nan" and "-nan" into the corresponding
+    magic IEEE floating point values. Only those strings (case independent)
+    work.  With --posix, gawk calls the system strtod directly. You asked
+    for it, you got it, you deal with it.
+
+14. Defining YYDEBUG enables the -D command line option.
+
+15. Gawk should now work out of the box on Tandem NSK/OSS systems.
+
+16. Lint messages rationalized: many more of the messages are now printed
+    only once, instead of every time they are encountered.
+
+17. The strftime() function now accepts an optional third argument, which
+    if non-zero or non-null, indicates that the time should be formatted
+    as UTC instead of as local time.
+
+18. The precedence of concatenation and `| getline' (in something like
+    "echo " "date" | getline stuff) has been reverted to the earlier
+    behavior and now once again matches Unix awk.
+
+19. New configure time flag --disable-directories-fatal which causes
+    gawk to silently skip directories on the command line.  This behavior
+    is also enabled for --traditional, since it's what Unix awk does.
+
+20. A new option, --use-lc-numeric, forces use of the locale's decimal
+    point without the rest of the draconian restrictions imposed by
+    --posix. This softens somewhat the stance taken in item #2.
+
+21. Everything relevant has been updated to the GPL 3.
+
+22. Array growth should be faster now, at no cost in space.
+
+23. Lots more tests.
+
+24. One new translation.
+
+25. Various bugs fixed, see the ChangeLog for details.
+
+Changes from 3.1.4 to 3.1.5
+---------------------------
+
+1. The random() suite has been updated to a current FreeBSD version, which
+   works on systems with > 32-bit ints.
+
+2. A new option, `--exec' has been added. It's like -f but ends option
+   processing.  It also disables `x=y' variable assignments, but not -v.
+   It's needed mainly for CGI scripts, so that source code can't be
+   passed in as part of the URL.
+
+3. dfa.[ch] have been synced with GNU grep development.  This also fixes
+   multiple regex matching problems in multibyte locales.
+
+4. Updated to Automake 1.9.5.
+
+5. Updated to Bison 2.0.
+
+6. The getopt* and regex* files were synchronized with current GLIBC CVS.
+   See the ChangeLog for the versions and minor edits made.
+
+7. `configure --disable-nls' now disables just gawk's own translations.
+   Gawk continues to work with the locale's numeric formatting.  This
+   includes a bug fix in handling the printf ' flag (e.g., %'d).
+
+8. Gawk is now multibyte aware.  This means that index(), length(),
+   substr() and match() all work in terms of characters, not bytes.
+
+9. Gawk is now smarter about parsing numeric constants in corner cases.
+
+11. Not closing open redirections no longer causes gawk to exit non-zero.
+
+10. The VMS port has been updated.
+
+11. Changes from Andrew Schorr at the xmlgawk project to provide for
+    open hooks from extensions are now included.  This will let the
+    xmlgawk extension work in the standard gawk.
+
+12. Updated to gettext 0.14.4. Gawk no longer includes its own copy
+    of the gettext `intl' library, following current GNU practice to
+    rely on there being an external version thereof.
+
+13. A regexp of the form `//' will now generate a warning that it
+    is not a C++ comment from --lint (awk.y).
+
+14. The ^ and ^= operators with an integer exponent now use Exponentiation
+    by Squaring. This simultaneously fixes a problem with ^= and a negative
+    integer exponent.
+
+15. length(array) now returns the number of elements in the array.  This is
+    is a non-standard extension that will fail in POSIX mode.
+
+16. Carriage return characters are now ignored in program source code.
+
+17. Four new translations added.
+
+18. Various minor bugs fixed. See the ChangeLog for the details.
+
+Changes from 3.1.3 to 3.1.4
+---------------------------
+
+1. Gawk now supports the POSIX %F format, falling back to %f if the local
+   system printf doesn't handle it.
+
+2. Gawk now supports the ' flag in printf. E.g., %'d in a locale with thousands
+   separators includes the thousands separator in the value, e.g. 12,345.
+
+   This has one problem; the ' flag is next to impossible to use on the
+   command line, without major quoting games.  Oh well, TANSTAAFL.
+
+3. The dfa code has been reinstated; the performance degradation was
+   just too awful.  Sigh.  (For fun, use `export GAWK_NO_DFA=1' to
+   see the difference.)
+
+4. The special case `x = x y' is now recognized in the grammar, and gawk
+   now uses `realloc' to append the new value to the end of the existing
+   one.  This can speed up the common case of appending onto a string.
+
+5. The dfa code was upgraded with most of the fixes from grep 2.5.1, and
+   the regex code was upgraded with GLIBC as mid-January 2004.  The regex
+   code is faster than it was, but still not as fast as the dfa code, so
+   the dfa code stays in.  The getopt code was also synced to current GLIBC.
+
+6. Support code upgraded to Automake 1.8.5, Autoconf 2.59, and gettext 0.14.1.
+
+7. When --posix is in effect, sub/gsub now follow the 2001 POSIX behavior.
+   Yippee.  This is even documented in the manual.
+
+8. Gawk will now recover children that have died (input pipelines, two-way
+   pipes), upon detecting EOF from them, thus avoiding filling
+   up the process table.  Open file descriptors are not recovered
+   (unfortunately), since that could break awk semantics.  See the
+   ChangeLog and the source code for the details.
+
+9. Handling of numbers like `0,1' in non-American locales ought to
+   work correctly now.
+
+10. IGNORECASE is now locale-aware for characters with values above 128.
+    The dfa matcher is now used for IGNORECASE matches too.
+
+11. Dynamic function loading is better. The documentation has been improved
+    and some new APIs for use by dynamic functions have been added.
+
+12. Gawk now has a fighting chance of working on older systems,
+    a la SunOS 4.1.x.
+
+13. Issues with multibyte support on HP-UX are now resolved. `configure' now
+    disables such support there, since it's not up to what gawk needs.
+
+14. There are now even more tests in the test suite.
+
+15. Various bugs fixed; see ChangeLog for the details.
+
+Changes from 3.1.2 to 3.1.3
+---------------------------
+
+1. Gawk now follows POSIX in handling of local numeric formats for
+   input, output and number/string conversions.
+
+2. Multibyte detection improved.  See README_d/README.multibyte for more
+   info about multibyte locales.
+
+3. Handling of `close' made more POSIX-compliant for POSIXLY_CORRECT,
+   see the documentation.
+
+4. The record reading code was redone, again.  This time it's much
+   better. Really!
+
+5. For RS = "\n" and RS = "", gawk now only sets RT when it has changed.
+   This provides considerable performance improvement.
+
+6. `match' now sets all the subscripts in the third argument array
+   correctly, even if not all subexpressions matched.
+
+7. Updated to Automake 1.7.5.  configure.in renamed configure.ac.
+
+8. C-style switch statements are available, but must be enabled at
+   compile time via `configure --enable-switch'.  For 3.2 they'll be
+   enabled by default. Thanks to Michael Benzinger for the initial
+   code.
+
+9. %c now always prints no more than one character, whatever
+   precision is provided.
+
+10. strtonum(<number>) now works again.
+
+11. Gawk is now much better about scalar/array typing of global
+    uninitiailzed variables passed as parameters. Once the parameter
+    is then used one way or the other, the global var's type is
+    adjusted accordingly.  Thanks to Stepan Kasal for the original
+    (considerable) changes.
+
+12. Dynamic function loading under Windows32 should now be possible. See
+    README_d/README.pcdynamic. Thanks to Patrick T.J. McPhee for the changes.
+
+13. Updated to gettext 0.12.1.
+
+14. Gawk now follows historical practice and POSIX for the return
+    value of `rand': It's now  0 <= N < 1.
+
+Changes from 3.1.1 to 3.1.2
+---------------------------
+
+1. Loops of the form:
+
+	for (iggy in foo)
+		next
+
+   no longer leak memory.
+
+2. gawk -v FIELDWIDTHS="..." now sets PROCINFO["FS"] correctly.
+
+3. All builtin operations and functions should now fully evaluate their
+   arguments so that side effects take place correctly.
+
+4. Fixed a logic bug in gsub/gensub for matches to null strings that occurred
+   later in the string after a nonnull match.
+
+5. getgroups code now works on Ultrix again.
+
+6. Completely new version of the full GNU regex engine now in place.
+
+7. Argument parsing and variable assignment has been cleaned up.
+
+8. An I/O bug on HP-UX has been documented and worked around. See
+   README_d/README.hpux.
+
+9. awklib/grcat should now compile correctly.
+
+10. Updated to automake 1.7.3, autoconf 2.57 and gettext 0.11.5 ; thanks to
+    Paul Eggert for the initial automake and autoconf work.
+
+11. As a result of #6, removed the use of the dfa code from GNU grep.
+
+12. It is now possible to use ptys for |& two-way pipes instead of
+    pipes.  The basic plumbing for this was provided by Paolo Bonzini.
+    To make this happen:
+
+    	command = "unix command etc"
+	PROCINFO[command, "pty"] = 1
+
+	print ... |& command
+	command |& getline stuff
+
+    In other words, set the element in PROCINFO *before* opening the
+    two-way pipe, and then gawk will use ptys instead of pipes.
+
+    On systems without ptys or where all the ptys are in use, gawk
+    will fall back to using plain pipes.
+
+13. Fixed a regex matching across buffer boundaries bug, with a
+    heuristic.  See io.c:rsre_get_a_record.
+
+14. Profiling no longer dumps core if there are extension functions in place.
+
+15. Grammar and scanner cleaned up, courtesy of Stepen Kasal, to hopefully
+    once and for all fix the `/=' operator vs. `/=.../' regex ambiguity.
+    Lots of other grammar simplifications applied, as well.
+
+16. BINMODE should work now on more Windows ports.
+
+17. Updated to bison 1.875.  Includes fix to bisonfix.sed script.
+
+18. The NODE structure is now 20% (8 bytes) smaller (on x86, anyway), which
+    should help conserve memory.
+
+19. Builds not in the source directory should work again.
+
+20. Arrays now use 2 NODE's per element instead of three. Combined with
+    #18, (on the x86) this reduces the overhead from 120 bytes per element
+    to just 64 bytes: almost a 50% improvement.
+
+21. Programs that make heavy use of changing IGNORECASE should now be
+    much faster, particularly if using a regular expression for FS or RS.
+    IGNORECASE now correctly affects RS regex record splitting, as well.
+
+22. IGNORECASE no longer affects single-character field splitting (FS = "c"),
+    or single-character record splitting (RS = "c").
+
+    This cleans up some weird behavior, and makes gawk better match the
+    documentation, which says it only affects regex-based field splitting
+    and record splitting.
+
+    The documentation on this was improved, too.
+
+23. The framework in test/ has been simplified, making it much easier to
+    add new tests while keeping the size of Makefile.am reasonable. Thanks
+    for this to Stepan Kasal.
+
+24. --lint=invalid causes lint warnings only about stuff that's actually
+    invalid.  This needs additional work.
+
+25. More translations.
+
+26. The `get_a_record' routine has been revamped (currently by splitting it
+    into three variants).  This should improve long-term maintainability.
+
+27. `match' now adds more entries to 3rd array arg:
+	match("the big dog", /([a-z]+) ([a-z]+) ([a-z]+)/, data)
+    fills in variables:
+    	data[1, "start"], data[1, "length"], and so on.
+
+28. New `asorti' function with same interface as `asort', but sorts indices
+    instead of values.  
+
+29. Documentation updated to FDL 1.2.
+
+30. New `configure' option --disable-lint at compile time disables lint
+    checking.  With GCC dead-code-elimination, cuts almost 200K off the
+    executable size on GNU/Linux x86.  Presumably speeds up runtime.
+
+    Using this will cause some of the tests in the test suite to fail.
+    This option may be removed at a later date.
+
+31. Various minor cleanups, see the ChangeLog for details.
+
+Changes from 3.1.0 to 3.1.1
+---------------------------
+
+1. Six new translations.
+
+2. Having more than 4 different values for OFMT and/or CONVFMT now works.
+
+3. The handling of dynamic regexes is now more more sane, esp. w.r.t.
+   the profiling code.  The profiling code has been fixed in several
+   places.
+
+4. The return value of index("", "") is now 1.
+
+5. Gawk should no longer close fd 0 in child processes.
+
+6. Fixed test for strtod semantics and regenerated configure.
+
+7. Gawk can now be built with byacc; an accidental bison dependency was
+   removed.
+
+8. `yyerror' will no longer dump core on long source lines.
+
+9. Gawk now correctly queries getgroups(2) to figure out how many groups
+   the process has.
+
+10. New configure option to force use of included strftime, e.g. on
+    Solaris systems. See `./configure --help' for the details. Replaced
+    the included strftime.c with the one from textutils.
+
+11. OS/2 port has been updated.
+
+12. Multi-byte character support has been added, courtesy of IBM Japan.
+
+13. The `for (iggy in foo) delete foo[iggy]' -> `delete foo' optimisation
+    now works.
+
+14. Upgraded to gettext 0.11.2 and automake 1.5.
+
+15. Full gettext compatibility (new dcngettext function).
+
+16. The O'Reilly copyedits and indexing changes for the documentation have
+    been folded into the texinfo version of the manuals.
+
+17. A humongously long value for the AWKPATH environment variable will no
+    longer dump core.
+
+18. Configuration / Installation issues have been straightened out in
+    Makefile.am.
+
+Changes from 3.0.6 to 3.1.0
+---------------------------
+
+1. A new PROCINFO array provides info about the process. The non-I/O /dev/xxx
+   files are now obsolete, and their use always generates a warning.
+
+2. A new `mktime' builtin function was added for creating time stamps. The
+   `mktime' function written in awk was removed from the user's guide.
+
+3. New `--gen-po' option creates GNU gettext .po files for strings marked
+   with a leading underscore.
+
+4. Gawk now completely interprets special file names internally, ignoring the
+   existence of real /dev/stdin, /dev/stdout files, etc.
+
+5. The mmap code was removed. It was a worthwhile experiment that just
+   didn't work out.
+
+6. The BINMODE variable is new; on non-UNIX systems it affects how gawk
+   opens files for text vs. binary.
+
+7. The atari port is now unsupported.
+
+8. Gawk no longer supports `next file' as two words.
+
+9. On systems that support it, gawk now sets the `close on exec' flag on all
+   files and pipes it opens. This makes sure that child processes run via
+   `system' or pipes have plenty of file descriptors available.
+
+10. New ports: Tandem and BeOS.  The Tandem port is unsupported.
+
+11. If `--posix' is in effect, newlines are not allowed after ?:.
+
+12. Weird OFMT/CONVFMT formats no longer cause fatal errors.
+
+13. Diagnostics about array parameters now include the parameter's name,
+    not just its number.
+
+14. configure should now automatically add -D_SYSV3 for ISC Unix.
+    (This seems to have made it into the gawk 3.0.x line long ago.)
+
+15. It is now possible to open a two-way pipe via the `|&' operator.
+    See the discussion in the manual about putting `sort' into such a pipeline,
+    though.  (NOTE!  This is borrowed from ksh: it is not the same as
+    the same operator in csh!)
+
+16. The `close' function now takes an optional second string argument
+    that allows closing one or the other end of the two-way pipe to
+    a co-process.  This is needed to use `sort' in a co-process, see
+    the doc.
+
+17. If TCP/IP is available, special file names beginning with `/inet'
+    can be used with `|&' for IPC. Thanks to Juergen Kahrs for the initial
+    code.
+
+18. With `--enable-portals' on the configure command line, gawk will also
+    treat file names that start with `/p/' as a 4.4 BSD type portal file,
+    i.e., a two-way pipe for `|&'.
+
+19. Unrecognized escapes, such as "\q" now always generate a warning.
+
+20. The LINT variable is new; it provides dynamic control over the --lint
+    option.
+
+21. Lint warnings can be made fatal by using --lint=fatal or `LINT = "fatal"'.
+    Use this if you're really serious about portable code.
+
+22. Due to an enhanced sed script, there is no longer any need to worry
+    about finding or using alloca.  alloca.c is thus now gone.
+
+23. A number of lint warnings have been added.  Most notably, gawk will
+    detect if a variable is used before assigned to.  Warnings for
+    when a string that isn't a number gets converted to a number are
+    in the code but disabled; they seem to be too picky in practice.
+
+    Also, gawk will now warn about function parameter names that shadow
+    global variable names.
+
+24. It is now possible to dynamically add builtin functions on systems
+    that support dlopen. This facility is not (yet) as portable or well
+    integrated as it might be.  *** WARNING *** THIS FEATURE WILL EVOLVE!
+
+25. There are *many* new tests in the test suite.
+
+26. Profiling has been added!  A separate version of gawk, named pgawk, is
+    built and generates a run-time execution profile.  The --profile option
+    can be used to change the default output file.   In regular gawk, this
+    option pretty-prints the parse tree.
+
+27. Gawk has been internationalized, using GNU gettext.  Translations for
+    future distributions are most welcome.  Simultaneously, gawk was switched
+    over to using automake.  You need Automake 1.4a (from the CVS archive)
+    if you want to muck with the Makefile.am files.
+
+28. New `asort' function for sorting arrays.  See the doc for details.
+
+29. The match function takes an optional array third argument to hold
+    the text matched by parenthesized sub-expressions.
+
+30. The bit op functions and octal and hex source code constants are on by
+    default, no longer a configure-time option.  Recognition of non-decimal
+    data is now enabled at runtime with --non-decimal-data command line option.
+
+31. Internationalization features available at the awk level: new TEXTDOMAIN
+    variable and `bindtextdomain' and `dcgettext' functions. printf formats
+    may contain the "%2$3.5d" kind of notation for use in translations.  See
+    the texinfo manual for details.
+
+32. The return value from `close' has been rationalized.  Most notably,
+    closing something that wasn't open returns -1 but remains non-fatal.
+
+33. The array effeciency change from 3.0.5 was reverted; the semantics were
+    not right.  Additionally, index values of previously stored elements
+    can no longer change dynamically.
+
+34. The new option --dump-variables dumps a list of all global variables and
+    their final types and values to a file you give, or to `awkvars.out'.
+
+35. Gawk now uses a recent version of random.c courtesy of the FreeBSD
+    project.
+
+36. The gawk source code now uses ANSI C function definitions (new style),
+    with ansi2knr to translate code for old compilers.
+
+37. `for (iggy in foo)' loops should be more robust now in the face of
+    adding/deleting elements in the middle; they loop over just the elements
+    that are present in the array when the loop starts.
+
+Changes from 3.0.5 to 3.0.6
+---------------------------
+
+This is a bug fix release only, pending further development on 3.1.0.
+
+Bugs fixed and changes made:
+
+1. Subscripting an array with a variable that is just a number no
+   longer magically converts the variable into a string.
+
+2. Similarly, running a `for (iggy in foo)' loop where `foo' is a
+   function parameter now works correctly.
+
+3. Similarly, `i = ""; v[i] = a; if (i in v) ...' now works again.
+
+4. Gawk now special cases `for (iggy in foo) delete foo[iggy]' and
+   treats it as the moral equivalent of `delete foo'.  This should be
+   a major efficiency win when portably deleting large arrays.
+
+5. VMS port brought up to date.
+
+Changes from 3.0.4 to 3.0.5
+---------------------------
+
+This is a bug fix release only, pending further development on 3.1.0.
+
+Bugs Fixed:
+
+ 1. `function foo(foo)' is now a fatal error.
+
+ 2. Array indexing is now much more efficient: where possible, only one
+    copy of an index string is kept, even if used in multiple arrays.
+
+ 3. Support was added for MacOS X and an `install-strip' target.
+
+ 4. [s]printf formatting for `0' flag and floating point formats now
+    works correctly.
+
+ 5. HP-UX large file support with GCC 2.95.1 now works.
+
+ 6. Arguments that contain `=' but that aren't syntactically valid are
+    now treated as filenames, instead of as fatal errors.
+
+ 7. `-v NF=foo' now works.
+
+ 8. Non-ascii alphanumeric characters are now treated as such in the
+    right locales by regex.c.  Similarly, a Latin-1 y-umlaut (decimal
+    value 255) in the program text no longer acts like EOF.
+
+ 9. Array indexes are always compared as strings; fixes an obscure bug
+    when user input gets used for the `x in array' test.
+
+10. The usage message now points users to the documentation for how
+    to report bugs.
+
+11. `/=' now works after an array.
+
+12. `b += b += 1' now works correctly.
+
+13. IGNORECASE changing with calls `match' now works better. (Fix for
+    semi-obscure bug.)
+
+14. Multicharacter values for RS now generate a lint warning.
+
+15. The gawk open file caching is now much more efficient.
+
+16. Global arrays passed to functions are now managed better.  In particular,
+    test/arynocls.awk won't crash referencing freed memory.
+
+17. In obscure cases, `getline var' can no longer clobber $0.
+
+Changes from 3.0.3 to 3.0.4
+---------------------------
+
+This is a bug fix release only, pending further development on 3.1.0.
+
+Bugs Fixed:
+
+ 1. A memory leak when turning a function parameter into an array was
+    fixed.
+
+ 2. The non-decimal data option now works correctly.
+
+ 3. Using an empty pair of brackets as an array subscript no longer causes
+    a core dump during parsing.  In general, syntax errors should not
+    cause core dumps any more.
+ 
+ 4. Standard input is no longer closed if it provides program source,
+    avoiding strange I/O problems.
+
+ 5. Memory corruption during printing with `print' has been fixed.
+
+ 6. The gsub function now correctly counts the number of matches.
+
+ 7. A typo in doc/Makefile.in has been fixed, making installation work.
+
+ 8. Calling `next' or `nextfile' from a BEGIN or END rule is now fatal.
+
+ 9. Subtle problems in rebuilding $0 when fields were changed have been
+    fixed.
+
+10. `FS = FS' now correctly turns off the use of FIELDWIDTHS.
+
+11. Gawk now parses fields correctly when FS is a single character.
+
+12. It is now possible for RS to be the NUL character ("\0").
+
+13. Weird problems with number conversions on MIPS and other systems
+    have been fixed.
+
+14. When parsing using FIELDWIDTHS is in effect, `split' with no third
+    argument will still use the value of FS.
+
+15. Large File Support for Solaris, HP-UX, AIX, and IRIX is now enabled at
+    compile time, thanks to Paul Eggert.
+
+16. Attempting to use the name of a function as a variable or array
+    from within the function is now caught as a fatal error, instead
+    of as a core dump.
+
+17. A bug in parsing hex escapes was fixed.
+
+18. A weird bug with concatenation where one expression has side effects
+    that changes another was fixed.
+
+19. printf/sprintf now behave much better for uses of the '0' and '#' flags
+    and with precisions and field widths.
+
+20. Further strangenesses with concatenation and multiple accesses of some
+    of the special variables was fixed.
+
+21. The Atari port is marked as no longer supported.
+
+22. Build problems on HP-UX have been fixed.
+
+23. Minor fixes and additional explanations added to the documentation.
+
+24. For RS = "", even a single leading newline is now correctly stripped.
+
+25. Obscure parsing problems for regex constants like /=.../ fixed, so
+    that a regex constant is recognized, and not the /= operator.
+
+26. Fixed a bug when closing a redirection that matched the current
+    or last FILENAME.
+
+27. Build problems on AIX fixed.
+
+Changes from 3.0.2 to 3.0.3
+---------------------------
+
+The horrendous per-record memory leak introduced in 3.0.1 is gone, finally.
+
+The `amiga' directory is now gone; Amiga support is now entirely handled
+by the POSIX support.
+
+Windows32 support has been added in the `pc' directory. See `README_d/README.pc'
+for more info.
+
+The mmap changes are disabled in io.c, and will be removed entirely
+in the next big release.  They were an interesting experiment that just
+really didn't work in practice.
+
+A minor memory leak that occurred when using `next' from within a
+function has also been fixed.
+
+Problems with I/O from sub-processes via a pipe are now gone.
+
+Using "/dev/pid" and the other special /dev files no longer causes a core dump.
+
+The files regex.h, regex.c, getopt.h, getopt.c, and getopt1.c have been
+merged with the versions in GNU libc. Thanks to Ulrich Drepper for his help.
+
+Some new undocumented features have been added. Use the source, Luke!
+It is not clear yet whether these will ever be fully supported.
+
+Array performance should be much better for very very large arrays. "Virtual
+memory required, real memory helpful."
+
+builtin.c:do_substr rationalized, again.
+
+The --re-interval option now works as advertised.
+
+The license text on some of the missing/* files is now generic.
+
+Lots more new test cases.
+
+Lots of other small bugs fixed, see the ChangeLog files for details.
+
+Changes from 3.0.1 to 3.0.2
+---------------------------
+
+Gawk now uses autoconf 2.12.
+
+strftime now behaves correctly if passed an empty format string or if
+the string formats to an empty result string.
+
+Several minor compilation and installation problems have been fixed.
+
+Minor page break issues in the user's guide have been fixed.
+
+Lexical errors no longer repeat ad infinitum.
+
+Changes from 3.0.0 to 3.0.1
+---------------------------
+
+Troff source for a handy-dandy five color reference card is now provided.
+Thanks to SSC for their macros.
+
+Gawk now behaves like Unix awk and mawk, in that newline acts as white
+space for separating fields and for `split', by default.  In posix mode,
+only space and tab separate fields. The documentation has been updated to
+reflect this.
+
+Tons and tons of small bugs fixed and new tests added, see the ChangeLogs.
+
+Lots fewer compile time warnings from gcc -Wall. Remaining ones aren't
+worth fixing.
+
+Gawk now pays some attention to the locale settings.
+
+Fixes to gsub to catch several corner cases.
+
+The `print' statement now evaluates all expressions first, and then
+prints them. This leads to less suprising behaviour if any expression has
+output side effects.
+
+Miscellanious improvements in regex.h and regex.c.
+
+Gawk will now install itself as gawk-M.N.P in $(bindir), and link
+`gawk' to it. This makes it easy to have multiple versions of gawk
+simultaneously. It will also now install itself as `awk' in $(bindir)
+if there is no `awk' there. This is in addition to installing itself as
+`gawk'. This change benefits the Hurd, and possibly other systems.  One
+day, gawk will drop the `g', but not yet.
+
+`--posix' turns on interval expressions. Gawk now matches its documentation.
+
+`close(FILENAME)' now does something meaningful.
+
+Field management code in field.c majorly overhauled, several times.
+
+The gensub code has been fixed, several bugs are now gone.
+
+Gawk will use mmap for data file input if it is available.
+
+The printf/sprintf code has been improved.
+
+Minor issues in Makefile setup worked on and improved.
+
+builtin.c:do_substr rationalized.
+
+Regex matching fixed so that /+[0-9]/ now matches the leading +.
+
+For building on vms, the default compiler is now DEC C rather than VAX C.
+
+Changes from 2.15.6 to 3.0.0
+----------------------------
+
+Fixed spelling of `Programming' in the copyright notice in all the files.
+
+New --re-interval option to turn on interval expressions. They're off
+by default, except for --posix, to avoid breaking old programs.
+
+Passing regexp constants as parameters to user defined functions now
+generates a lint warning.
+
+Several obscure regexp bugs fixed; alas, a small number remain.
+
+The manual has been thoroughly revised. It's now almost 50% bigger than
+it used to be.
+
+The `+' modifier in printf is now reset correctly for each item.
+
+The do_unix variable is now named do_traditional.
+
+Handling of \ in sub and gsub rationalized (somewhat, see the manual for
+the gory [and I do mean gory] details).
+
+IGNORECASE now uses ISO 8859-1 Latin-1 instead of straight ASCII. See the
+source for how to revert to pure ASCII.
+
+--lint will now warn if an assignment occurs in a conditional context.
+This may become obnoxious enough to need turning off in the future, but
+"it seemed like a good idea at the time."
+
+%hf and %Lf are now diagnosed as invalid in printf, just like %lf.
+
+Gawk no longer incorrectly closes stdin in child processes used in
+input pipelines.
+
+For integer formats, gawk now correctly treats the precision as the
+number of digits to print, not the number of characters.
+
+gawk is now much better at catching the use of scalar values when
+arrays are needed, both in function calls and the `x in y' constructs.
+
+New gensub function added. See the manual.
+
+If do_tradtional is true, octal and hex escapes in regexp constants are
+treated literally.  This matches historical behavior.
+
+yylex/nextc fixed so that even null characters can be included
+in the source code.
+
+do_format now handles cases where a format specifier doesn't end in
+a control letter. --lint reports an error.
+
+strftime() now uses a default time format equivalent to that of the
+Unix date command, thus it can be called with no arguments.
+
+Gawk now catches functions that are used but not defined at parse time
+instead of at run time. (This is a lint error, making it fatal could break
+old code.)
+
+Arrays that max out are now handled correctly.
+
+Integer formats outside the range of an unsigned long are now detected
+correctly using the SunOS 4.x cc compiler.
+
+--traditional option added as new preferred name for --compat, in keeping
+with GCC.
+
+--lint-old option added, so that warnings about things not in old awk
+are only given if explicitly asked for.
+
+`next file' has changed to one word, `nextfile'. `next file' is still
+accepted but generates a lint warning. `next file' will go away eventually.
+
+Gawk with --lint will now notice empty source files and empty data files.
+
+Amiga support using the Unix emulation added. Thanks to fnf@ninemoons.com.
+
+test/Makefile is now "parallel-make safe".
+
+Gawk now uses POSIX regexps + GNU regex ops by default. --posix goes to
+pure posix regexps, and --compat goes to traditional Unix regexps. However,
+interval expressions, even though specified by POSIX, are turned off by
+default, to avoid breaking old code.
+
+IGNORECASE now applies to string comparison as well as regexp operations.
+
+The AT&T Bell Labs Research awk fflush builtin function is now supported.
+fflush is extended to flush stdout if no arg and everything if given
+the null string as an argument.
+
+If RS is more than one character, it is treated as a regular expression
+and records are delimited accordingly.  The variable RT is set to the record
+terminator string. This is disabled in compatibility mode.
+
+If FS is set to the null string (or the third arg. of split() is the null
+string), splitting is done at every single character. This is disabled in
+compatibility mode.
+
+Gawk now uses the Autoconf generated configure script, doing away with all
+the config/* files and the machinery that went with them.  The Makefile.in
+has also changed accordingly, complete with all the standard GNU Makefile
+targets.  (Non-unix systems may still have their own config.h and Makefile;
+see the appropriate README_d/README.* and/or subdirectory.)
+
+The source code has been cleaned up somewhat and the formatting improved.
+
+Changes from 2.15.5 to 2.15.6
+-----------------------------
+
+Copyrights updated on all changed files.
+
+test directory enhanced with four new tests.
+
+Gawk now generates a warning for \x without following hexadecimal digits.
+In this case, it returns 'x', not \0.
+
+Several fixes in main.c related to variable initialization:
+	CONVFMT has a default value
+	resetup is called before initializing variables
+	the varinit table fixed up a bit (see the comments)
+
+gawk.1 updated with new BUG REPORTS section.
+
+A plain `print' inside a BEGIN or END now generates a lint warning (awk.y).
+
+Small fix in iop.c:get_a_record to avoid reading uninitialized memory.
+
+awk.y:yylex now does a better job of handling things if the source file
+does not end in a newline. Probably there is more work to be done.
+
+Memory leaks fixed in awk.y, particularly in cases of duplicate function
+parameters. Also, calling a function doesn't leak memory during parsing.
+
+Empty function bodies are now allowed (awk.y).
+
+Gawk now detects duplicate parameter names in functions (awk.y).
+
+New function `error' in msg.c added for use from awk.y.
+
+eval.c:r_get_lhs now checks if its argument is a parameter on the stack,
+and pulls down the real variable. This catches more 'using an array as
+a scalar' kinds of errors.
+
+main.c recovers C alloca space after parsing, this is important for
+bison-based parsers. re.c recovers C alloca space after doing an research.
+[Changes from Pat Rankin]
+
+builtin.c now declares the random() related functions based on
+RANDOM_MISSING from config.h. [Suggested by Pat Rankin]
+
+awk.h now handles alloca correctly for HP-UX. [Kaveh Ghazi]
+
+regex.h and config/cray60 updated for Unicos 8.0. [Hal Peterson]
+
+Fixed re.c and dfa.c so that gawk no longer leaks memory when using
+lots of dynamic regexps.
+
+Removed dependency on signed chars from `idx' variable in awk.h. Gawk
+now passes its test suite if compiled with `gcc -fno-signed-char'.
+
+Fixed warning on close in io.c to go under lint control. Too many people
+have complained about the spurious message, particularly when closing a
+child pipeline early.
+
+Gawk now correctly handles RS = "" when input is from a terminal
+(iop.c:get_a_record).
+
+Config file added for GNU.
+
+gawk 'BEGIN { exit 1 } ; END { exit }' now exits 1, as it should
+(eval.c:interpret).
+
+sub and gsub now follow posix, \ escapes both & and \. Each \ must
+be doubled initially in the program to get it into the string.
+Thanks to Mike Brennan for pointing this out (builtin.c:sub_common).
+
+If FS is "", gawk behaves like mawk and nawk, making the whole record be $1.
+Yet Another Dark Corner. Sigh (field.c:def_parse_field).
+
+Gawk now correctly recomputes string values for numbers if CONVFMT has
+changed (awk.h:force_string, node.c:r_force_string).
+
+A regexp of the form `/* this looks like a comment but is not */' will
+now generate a warning from --lint (awk.y).
+
+Gawk will no longer core dump if given an empty input file (awk.y:get_src_buf,
+iop.c:optimal_bufsize).
+
+A printf format of the form %lf is handled correctly. The `l' generates
+a lint warning (builtin.c:format_tree) [Thanks to Mark Moraes].
+
+Lynxos config file added.
+
+`continue' outside a loop treated as `next' only in compatibility mode,
+instead of by default; recent att nawk chokes on this now.  `break'
+outside a loop now treated as `next' in compatibility mode (eval.c).
+
+Bug fix in string concatenation, an arbitrary number of expressions
+are allowed (eval.c).
+
+$1 += $2 now works correctly (eval.c).
+
+Changing IGNORECASE no longer resets field-splitting to FS if it was
+using FIELDWIDTHS (eval.c, field.c).
+
+Major enhancement: $0 and NF for last record read are now preserved
+into the END rule (io.c).
+
+Regexp fixes:
+	/./ now matches a newline (regex.h)
+	^ and $ match beginning and end of string only, not any embedded
+		newlines (re.c)
+	regex.c should compile and work ok on 64-bit mips/sgi machines
+
+Changes from 2.15.4 to 2.15.5
+-----------------------------
+
+FUTURES file updated and re-arranged some with more rational schedule.
+
+Many prototypes handled better for ANSI C in protos.h.
+
+getopt.c updated somewhat.
+
+test/Makefile now removes junk directory, `bardargtest' renamed `badargs.'
+
+Bug fix in iop.c for RS = "". Eat trailing newlines off of record separator.
+
+Bug fix in Makefile.bsd44, use leading tab in actions.
+
+Fix in field.c:set_FS for FS == "\\" and IGNORECASE != 0.
+
+Config files updated or added:
+	cray60, DEC OSF/1 2.0, Utek, sgi405, next21, next30, atari/config.h,
+	sco.
+
+Fix in io.c for ENFILE as well as EMFILE, update decl of groupset to
+include OSF/1.
+
+Rationalized printing as integers if numbers are outside the range of a long.
+Changes to node.c:force_string and builtin.c.
+
+Made internal NF, NR, and FNR variables longs instead of ints.
+
+Add LIMITS_H_MISSING stuff to config.in and awk.h, and default defs for
+INT_MAX and LONG_MAX, if no limits.h file. Add a standard decl of
+the time() function for __STDC__. From ghazi@noc.rutgers.edu.
+
+Fix tree_eval in awk.h and r_tree_eval in eval.c to deal better with
+function parameters, particularly ones that are arrays.
+
+Fix eval.c to print out array names of arrays used in scalar contexts.
+
+Fix eval.c in interpret to zero out source and sourceline initially. This
+does a better job of providing source file and line number information.
+
+Fix to re_parse_field in field.c to not use isspace when RS = "", but rather
+to explicitly look for blank and tab.
+
+Fix to sc_parse_field in field.c to catch the case of the FS character at the
+end of a record.
+
+Lots of miscellanious bug fixes for memory leaks, courtesy Mark Moraes,
+also fixes for arrays.
+
+io.c fixed to warn about lack of explicit closes if --lint.
+
+Updated missing/strftime.c to match posted strftime 6.2.
+
+Bug fix in builtin.c, in case of non-match in sub_common.
+
+Updated constant used for division in builtin.c:do_rand for DEC Alpha
+and CRAY Y-MP.
+
+POSIXLY_CORRECT in the environment turns on --posix (fixed in main.c).
+
+Updated srandom prototype and calls in builtin.c.
+
+Fix awk.y to enforce posix semantics of unary +: result is numeric.
+
+Fix array.c to not rearrange the hash chain upon finding an index in
+the array.  This messed things up in cases like:
+	for (index1 in array) {
+		blah
+		if (index2 in array)	# blew away the for
+			stuff
+	}
+
+Fixed spelling errors in the man page.
+
+Fixes in awk.y so that
+	gawk '' /path/to/file
+will work without core dumping or finding parse errors.
+
+Fix main.c so that --lint will fuss about an empty program.
+Yet another fix for argument parsing in the case of unrecognized options.
+
+Bug fix in dfa.c to not attempt to free null pointers.
+
+Bug fix in builtin.c to only use DEFAULT_G_PRECISION for %g or %G.
+
+Bug fix in field.c to achieve call by value semantics for split.
+
+Changes from 2.15.3 to 2.15.4
+-----------------------------
+
+Lots of lint fixes, and do_sprintf made mostly ANSI C compatible.
+
+Man page updated and edited.
+
+Copyrights updated.
+
+Arrays now grow dynamically, initially scaling up by an order of magnitude
+  and then doubling, up to ~ 64K.  This should keep gawk's performance
+  graceful under heavy load.
+
+New `delete array' feature added.  Only documented in the man page.
+
+Switched to dfa and regex suites from grep-2.0. These offer the ability to
+  move to POSIX regexps in the next release.
+
+Disabled GNU regex ops.
+
+Research awk -m option now recognized. It does nothing in gawk, since gawk
+  has no static limits.  Only documented in the man page.
+
+New bionic (faster, better, stronger than before) hashing function.
+
+Bug fix in argument handling. `gawk -X' now notices there was no program.
+  Additional bug fixes to make --compat and --lint work again.
+
+Many changes for systems where sizeof(int) != sizeof(void *).
+
+Add explicit alloca(0) in io.c to recover space from C alloca.
+
+Fixed file descriptor leak in io.c.
+
+The --version option now follows the GNU coding standards and exits.
+
+Fixed several prototypes in protos.h.
+
+Several tests updated. On Solaris, warn that the out? tests will fail.
+
+Configuration files for SunOS with cc and Solaris 2.x added.
+
+Improved error messages in awk.y on gawk extensions if do_unix or do_compat.
+
+INSTALL file added.
+
+Fixed Atari Makefile and several VMS specific changes.
+
+Better conversion of numbers to strings on systems with broken sprintfs.
+
+Changes from 2.15.2 to 2.15.3
+-----------------------------
+
+Increased HASHSIZE to a decent number, 127 was way too small.
+
+FILENAME is now the null string in a BEGIN rule.
+
+Argument processing fixed for invalid options and missing arguments.
+
+This version will build on VMS.  This included a fix to close all files
+   and pipes opened with redirections before closing stdout and stderr.
+
+More getpgrp() defines.
+
+Changes for BSD44:  <sys/param.h> in io.c and Makefile.bsd44.
+
+All directories in the distribution are now writable.
+
+Separated LDFLAGS and CFLAGS in Makefile.  CFLAGS can now be overridden by
+  user.
+
+Make dist now builds compressed archives ending in .gz and runs doschk.
+
+Amiga port.
+
+New getopt.c fixes Alpha OSF/1 problem.
+
+Make clean now removes possible test output.
+
+Improved algorithm for multiple adjacent string concatenations leads to
+  performance improvements.
+
+Fix nasty bug whereby command-line assignments, both with -v and at run time,
+   could create variables with syntactically illegal names.
+
+Fix obscure bug in printf with %0 flag and filling.
+
+Add a lint check for substr if provided length exceeds remaining characters
+   in string.
+
+Update atari support.
+
+PC support enhanced to include support for both DOS and OS/2. (Lots more
+   #ifdefs. Sigh.)
+
+Config files for Hitachi Unix and OSF/1, courtesy of Yoko Morishita
+   (morisita@sra.co.jp)
+
+Changes from 2.15.1 to 2.15.2
+-----------------------------
+
+Additions to the FUTURES file.
+
+Document undefined order of output when using both standard output
+  and /dev/stdout or any of the /dev output files that gawk emulates in
+  the absence of OS support.
+
+Clean up the distribution generation in Makefile.in:  the info files are
+  now included, the distributed files are marked read-only and patched
+  distributions are now unpacked in a directory named with the patch level.
+
+Changes from 2.15 to 2.15.1
+---------------------------
+
+Close stdout and stderr before all redirections on program exit.  This allows
+  detection of write errors and also fixes the messages test on Solaris 2.x.
+
+Removed YYMAXDEPTH define in awk.y which was limiting the parser stack depth.
+
+Changes to config/bsd44, Makefile.bsd44 and configure to bring it into line
+  with the BSD4.4 release.
+
+Changed Makefile to use prefix, exec_prefix, bindir etc.
+
+make install now installs info files.
+
+make install now sets permissions on installed files.
+
+Make targets added:  uninstall, distclean, mostlyclean and realclean.
+
+Added config.h to cleaner and clobber make targets.
+
+Changes to config/{hpux8x,sysv3,sysv4,ultrix41} to deal with alloca().
+
+Change to getopt.h for portability.
+
+Added more special cases to the getpgrp() call.
+
+Added README.ibmrt-aos and config/ibmrt-aos.
+
+Changes from 2.14 to 2.15
+---------------------------
+
+Command-line source can now be mixed with library functions.
+
+ARGIND variable tracks index in ARGV of FILENAME.
+
+GNU style long options in addition to short options.
+
+Plan 9 style special files interpreted by gawk:
+        /dev/pid
+        /dev/ppid
+        /dev/pgrpid
+        /dev/user
+                $1 = getuid
+                $2 = geteuid
+                $3 = getgid
+                $4 = getegid
+                $5 ... $NF = getgroups if supported
+
+ERRNO variable contains error string if getline or close fails.
+
+Very old options -a and -e have gone away.
+
+Inftest has been removed from the default target in test/Makefile -- the
+  results were too machine specific and resulted in too many false alarms.
+
+A README.amiga has been added.
+
+The "too many arguments supplied for format string" warning message is only
+  in effect under the lint option.
+
+Code improvements in dfa.c.
+
+Fixed all reported bugs:
+
+	Writes are checked for failure (such as full filesystem).
+
+	Stopped (at least some) runaway error messages.
+
+	gsub(/^/, "x") does the right thing for $0 of 0, 1, or more length.
+
+	close() on a command being piped to a getline now works properly.
+
+	The input record will no longer be freed upon an explicit close()
+	of the input file.
+
+	A NUL character in FS now works.
+
+	In a substitute, \\& now means a literal backslash followed by what
+	was matched.
+
+	Integer overflow of substring length in substr() is caught.
+
+	An input record without a newline termination is handled properly.
+
+	In io.c, check is against only EMFILE so that system file table
+	  is not filled.
+
+	Renamed all files with names longer than 14 characters.
+
+	Escaped characters in regular expressions were being lost when 
+	  IGNORECASE was used.
+
+	Long source lines were not being handled properly.
+
+	Sourcefiles that ended in a tab but no newline were bombing.
+
+	Patterns that could match zero characters in split() were not working
+	  properly.
+
+	The parsedebug option was not working.
+
+	The grammar was being a bit too lenient, allowing some very dubious
+	  programs to pass.
+
+	Compilation with DEBUG defined now works.
+
+	A variable read in with getline was not being treated as a potential
+	  number.
+
+	Array subscripts were not always of string type.
+
+
+Changes from 2.13.2 to 2.14
+---------------------------
+
+Updated manual!
+
+Added "next file" to skip efficiently to the next input file.
+
+Fixed potential of overflowing buffer in do_sprintf().
+
+Plugged small memory leak in sub_common().
+
+EOF on a redirect is now "sticky" -- it can only be cleared by close()ing
+  the pipe or file.
+
+Now works if used via a #! /bin/gawk line at the top of an executable file
+  when that line ends with whitespace.
+
+Added some checks to the grammar to catch redefinition of builtin functions.
+  This could eventually be the basis for an extension to allow redefining
+  functions, but in the mean time it's a good error catching facility.
+
+Negative integer exponents now work.
+
+Modified do_system() to make sure it had a non-null string to be passed
+  to system(3). Thus, system("") will flush any pending output but not go
+  through the overhead of forking an un-needed shell.
+
+A fix to floating point comparisons so that NaNs compare right on IEEE systems.
+
+Added code to make sure we're not opening directories for reading and such.
+
+Added code to do better diagnoses of weird or null file names.
+
+Allow continue outside of a loop, unless in strict posix mode.  Lint option
+  will issue warning.
+
+New missing/strftime.c.  There has been one change that affects gawk.  Posix
+  now defines a %V conversion so the vms conversion has been changed to %v.
+  If this version is used with gawk -Wlint and they use %V in a call to
+  strftime, they'll get a warning.
+
+Error messages now conform to GNU standard (I hope).
+
+Changed comparisons to conform to the  description found in the file POSIX.
+  This is inconsistent with the current POSIX draft, but that is broken.
+  Hopefully the final POSIX standard will conform to this version.
+  (Alas, this will have to wait for 1003.2b, which will be a revision to
+  the 1003.2 standard.  That standard has been frozen with the broken
+  comparison rules.)
+
+The length of a string was a short and now is a size_t.
+
+Updated VMS help.
+
+Added quite a few new tests to the test suite and deleted many due to lack of
+  written releases.  Test output is only removed if it is identical to the
+  "good" output.
+
+Fixed a couple of bugs for reference to $0 when $0 is "" -- particularly in
+  a BEGIN block.
+
+Fixed premature freeing in construct "$0 = $0".
+
+Removed the call to wait_any() in gawk_popen(), since on at least some systems,
+  if gawk's input was from a pipe, the predecessor process in the pipe was a
+  child of gawk and this caused a deadlock.
+
+Regexp can (once again) match a newline, if given explicitly.
+
+nextopen() makes sure file name is null terminated.
+
+Fixed VMS pipe simulation.  Improved VMS I/O performance.
+
+Catch . used in variable names.
+
+Fixed bug in getline without redirect from a file -- it was quitting after the
+  first EOF, rather than trying the next file.
+
+Fixed bug in treatment of backslash at the end of a string -- it was bombing
+  rather than doing something sensible.  It is not clear what this should mean,
+  but for now I issue a warning and take it as a literal backslash.
+
+Moved setting of regexp syntax to before the option parsing in main(), to
+  handle things like -v FS='[.,;]'
+
+Fixed bug when NF is set by user -- fields_arr must be expanded if necessary
+  and "new" fields must be initialized.
+
+Fixed several bugs in [g]sub() for no match found or the match is 0-length.
+
+Fixed bug where in gsub() a pattern anchored at the beginning would still
+  substitute throughout the string.
+
+make test does not assume that . is in PATH.
+
+Fixed bug when a field beyond the end of the record was requested after
+  $0 was altered (directly or indirectly).
+
+Fixed bug for assignment to field beyond end of record -- the assigned value
+  was not found on subsequent reference to that field.
+
+Fixed bug for FS a regexp and it matches at the end of a record.
+
+Fixed memory leak for an array local to a function.
+
+Fixed hanging of pipe redirection to getline
+
+Fixed coredump on access to $0 inside BEGIN block.
+
+Fixed treatment of RS = "".  It now parses the fields correctly and strips
+  leading whitespace from a record if FS is a space.
+
+Fixed faking of /dev/stdin.
+
+Fixed problem with x += x
+
+Use of scalar as array and vice versa is now detected.
+
+IGNORECASE now obeyed for FS (even if FS is a single alphabetic character).
+
+Switch to GPL version 2.
+
+Renamed awk.tab.c to awktab.c for MSDOS and VMS tar programs.
+
+Renamed this file (CHANGES) to NEWS.
+
+Use fmod() instead of modf() and provide FMOD_MISSING #define to undo
+  this change.
+
+Correct the volatile declarations in eval.c.
+
+Avoid errant closing of the file descriptors for stdin, stdout and stderr.
+
+Be more flexible about where semi-colons can occur in programs.
+
+Check for write errors on all output, not just on close().
+
+Eliminate the need for missing/{strtol.c,vprintf.c}.
+
+Use GNU getopt and eliminate missing/getopt.c.
+
+More "lint" checking.
+
+
+Changes from 2.13.1 to 2.13.2
+-----------------------------
+
+Toward conformity with GNU standards, configure is a link to mkconf, the latter
+  to disappear in the next major release.
+
+Update to config/bsd43.
+
+Added config/apollo, config/msc60, config/cray2-50, config/interactive2.2
+
+sgi33.cc added for compilation using cc rather than gcc.
+
+Ultrix41 now propagates to config.h properly -- as part of a general
+  mechanism in configure for kludges -- #define anything from a config file
+  just gets tacked onto the end of config.h -- to be used sparingly.
+
+Got rid of an unnecessary and troublesome declaration of vprintf().
+
+Small improvement in locality of error messages.
+
+Try to diagnose use of array as scalar and vice versa -- to be improved in
+  the future.
+
+Fix for last bug fix for Cray division code--sigh.
+
+More changes to test suite to explicitly use sh.  Also get rid of 
+  a few generated files.
+
+Fixed off-by-one bug in string concatenation code.
+
+Fix for use of array that is passed in from a previous function parameter.
+  Addition to test suite for above.
+
+A number of changes associated with changing NF and access to fields
+  beyond the end of the current record.
+
+Change to missing/memcmp.c to avoid seg. fault on zero length input.
+
+Updates to test suite (including some inadvertently left out of the last patch)
+  to invoke sh explicitly (rather than rely on #!/bin/sh) and remove some
+  junk files.  test/chem/good updated to correspond to bug fixes.
+
+Changes from 2.13.0 to 2.13.1
+-----------------------------
+
+More configs and PORTS.
+
+Fixed bug wherein a simple division produced an erroneous FPE, caused by
+  the Cray division workaround -- that code is now #ifdef'd only for
+  Cray *and* fixed.
+
+Fixed bug in modulus implementation -- it was very close to the above
+  code, so I noticed it.
+
+Fixed portability problem with limits.h in missing.c
+
+Fixed portability problem with tzname and daylight -- define TZNAME_MISSING
+  if strftime() is missing and tzname is also.
+
+Better support for Latin-1 character set.
+
+Fixed portability problem in test Makefile.
+
+Updated PROBLEMS file.
+
+=============================== gawk-2.13 released =========================
+Changes from 2.12.42 to 2.12.43
+-------------------------------
+
+Typo in awk.y
+
+Fixed up strftime.3 and added doc. for %V.
+
+Changes from 2.12.41 to 2.12.42
+-------------------------------
+
+Fixed bug in devopen() -- if you had write permission in /dev,
+  it would just create /dev/stdout etc.!!
+
+Final (?) VMS update.
+
+Make NeXT use GFMT_WORKAROUND
+
+Fixed bug in sub_common() for substitute on zero-length match.  Improved the
+  code a bit while I was at it.
+
+Fixed grammar so that $i++ parses as ($i)++
+
+Put support/* back in the distribution (didn't I already do this?!)
+
+Changes from 2.12.40 to 2.12.41
+-------------------------------
+
+VMS workaround for broken %g format.
+
+Changes from 2.12.39 to 2.12.40
+-------------------------------
+
+Minor man page update.
+
+Fixed latent bug in redirect().
+
+Changes from 2.12.38 to 2.12.39
+-------------------------------
+
+Updates to test suite -- remove dependence on changing gawk.1 man page.
+
+Changes from 2.12.37 to 2.12.38
+-------------------------------
+
+Fixed bug in use of *= without whitespace following.
+
+VMS update.
+
+Updates to man page.
+
+Option handling updates in main.c
+
+test/manyfiles redone and added to bigtest.
+
+Fixed latent (on Sun) bug in handling of save_fs.
+
+Changes from 2.12.36 to 2.12.37
+-------------------------------
+
+Update REL in Makefile-dist.  Incorporate test suite into main distribution.
+
+Minor fix in regtest.
+
+Changes from 2.12.35 to 2.12.36
+-------------------------------
+
+Release takes on dual personality -- 2.12.36 and 2.13.0 -- any further
+  patches before public release won't count for 2.13, although they will for
+  2.12 -- be careful to avoid confusion!  patchlevel.h will be the last thing
+  to change.
+
+Cray updates to deal with arithmetic problems.
+
+Minor test suite updates.
+
+Fixed latent bug in parser (freeing memory).
+
+Changes from 2.12.34 to 2.12.35
+-------------------------------
+
+VMS updates.
+
+Flush stdout at top of err() and stderr at bottom.
+
+Fixed bug in eval_condition() -- it wasn't testing for MAYBE_NUM and
+  doing the force_number().
+
+Included the missing manyfiles.awk and a new test to catch the above bug which
+  I am amazed wasn't already caught by the test suite -- it's pretty basic.
+
+Changes from 2.12.33 to 2.12.34
+-------------------------------
+
+Atari updates -- including bug fix.
+
+More VMS updates -- also nuke vms/version.com.
+
+Fixed bug in handling of large numbers of redirections -- it was probably never
+  tested before (blush!).
+
+Minor rearrangement of code in r_force_number().
+
+Made chem and regtest tests a bit more portable (Ultrix again).
+
+Added another test -- manyfiles -- not invoked under any other test -- very Unix
+  specific.
+
+Rough beginning of LIMITATIONS file -- need my AWK book to complete it.
+
+Changes from 2.12.32 to 2.12.33
+-------------------------------
+
+Expunge debug.? from various files.
+
+Remove vestiges of Floor and Ceil kludge.
+
+Special case integer division -- mainly for Cray, but maybe someone else
+  will benefit.
+
+Workaround for iop_close closing an output pipe descriptor on Cray --
+  not conditional since I think it may fix a bug on SGI as well and I don't
+  think it can hurt elsewhere.
+
+Fixed memory leak in assoc_lookup().
+
+Small cleanup in test suite.
+
+Changes from 2.12.31 to 2.12.32
+-------------------------------
+
+Nuked debug.c and debugging flag -- there are better ways.
+
+Nuked version.sh and version.c in subdirectories.
+
+Fixed bug in handling of IGNORECASE.
+
+Fixed bug when FIELDWIDTHS was set via -v option.
+
+Fixed (obscure) bug when $0 is assigned a numerical value.
+
+Fixed so that escape sequences in command-line assignments work (as it already
+  said in the comment).
+
+Added a few cases to test suite.
+
+Moved support/* back into distribution.
+
+VMS updates.
+
+Changes from 2.12.30 to 2.12.31
+-------------------------------
+
+Cosmetic manual page changes.
+
+Updated sunos3 config.
+
+Small changes in test suite including renaming files over 14 chars. in length.
+
+Changes from 2.12.29 to 2.12.30
+-------------------------------
+
+Bug fix for many string concatenations in a row.
+
+Changes from 2.12.28 to 2.12.29
+-------------------------------
+
+Minor cleanup in awk.y
+
+Minor VMS update.
+ 
+Minor atari update.
+
+Changes from 2.12.27 to 2.12.28
+-------------------------------
+
+Got rid of the debugging goop in eval.c -- there are better ways.
+
+Sequent port.
+
+VMS changes left out of the last patch -- sigh!  config/vms.h renamed
+  to config/vms-conf.h.
+
+Fixed missing/tzset.c
+
+Removed use of gcvt() and GCVT_MISSING -- turns out it was no faster than
+  sprintf("%g") and caused all sorts of portability headaches.
+
+Tuned get_field() -- it was unnecessarily parsing the whole record on reference
+  to $0.
+
+Tuned interpret() a bit in the rule_node loop.
+
+In r_force_number(), worked around bug in Uglix strtod() and got rid of 
+  ugly do{}while(0) at Michal's urging.
+
+Replaced do_deref() and deref with unref(node) -- much cleaner and a bit faster.
+
+Got rid of assign_number() -- contrary to comment, it was no faster than
+  just making a new node and freeing the old one.
+
+Replaced make_number() and tmp_number() with macros that call mk_number().
+
+Changed freenode() and newnode() into macros -- the latter is getnode()
+  which calls more_nodes() as necessary.
+
+Changes from 2.12.26 to 2.12.27
+-------------------------------
+
+Completion of Cray 2 port (includes a kludge for floor() and ceil()
+  that may go or be changed -- I think that it may just be working around
+  a bug in chem that is being tweaked on the Cray).
+
+More VMS updates.
+
+Moved kludge over yacc's insertion of malloc and realloc declarations
+  from protos.h to the Makefile.
+
+Added a lisp interpreter in awk to the test suite.  (Invoked under
+  bigtest.)
+
+Cleanup in r_force_number() -- I had never gotten around to a thorough
+  profile of the cache code and it turns out to be not worth it.
+
+Performance boost -- do lazy force_number()'ing for fields etc. i.e.
+  flag them (MAYBE_NUM) and call force_number only as necessary.
+
+Changes from 2.12.25 to 2.12.26
+-------------------------------
+
+Rework of regexp stuff so that dynamic regexps have reasonable
+  performance -- string used for compiled regexp is stored and
+  compared to new string -- if same, no recompilation is necessary.
+  Also, very dynamic regexps cause dfa-based searching to be turned
+  off.
+
+Code in dev_open() is back to returning fileno(std*) rather than
+  dup()ing it.  This will be documented.  Sorry for the run-around
+  on this.
+
+Minor atari updates.
+
+Minor vms update.
+
+Missing file from MSDOS port.
+
+Added warning (under lint) if third arg. of [g]sub is a constant and
+  handle it properly in the code (i.e. return how many matches).
+
+Changes from 2.12.24 to 2.12.25
+-------------------------------
+
+MSDOS port.
+
+Non-consequential changes to regexp variables in preparation for
+  a more serious change to fix a serious performance problem.
+
+Changes from 2.12.23 to 2.12.24
+-------------------------------
+
+Fixed bug in output flushing introduced a few patches back.  This caused
+  serious performance losses.
+
+Changes from 2.12.22 to 2.12.23
+-------------------------------
+
+Accidentally left config/cray2-60 out of last patch.
+
+Added some missing dependencies to Makefile.
+
+Cleaned up mkconf a bit; made yacc the default parser (no alloca needed,
+  right?); added rs6000 hook for signed characters.
+
+Made regex.c with NO_ALLOCA undefined work.
+
+Fixed bug in dfa.c for systems where free(NULL) bombs.
+
+Deleted a few cant_happen()'s that *really* can't hapen.
+
+Changes from 2.12.21 to 2.12.22
+-------------------------------
+
+Added to config stuff the ability to choose YACC rather than bison.
+
+Fixed CHAR_UNSIGNED in config.h-dist.
+
+Second arg. of strtod() is char ** rather than const char **. 
+
+stackb is now initially malloc()'ed since it may be realloc()'ed.
+
+VMS updates.
+
+Added SIZE_T_MISSING to config stuff and a default typedef to awk.h.
+  (Maybe it is not needed on any current systems??)
+
+re_compile_pattern()'s size is now size_t unconditionally.
+
+Changes from 2.12.20 to 2.12.21
+-------------------------------
+
+Corrected missing/gcvt.c.
+
+Got rid of use of dup2() and thus DUP_MISSING.
+
+Updated config/sgi33.
+
+Turned on (and fixed) in cmp_nodes() the behaviour that I *hope* will be in
+  POSIX 1003.2 for relational comparisons.
+
+Small updates to test suite.
+
+Changes from 2.12.19 to 2.12.20
+-------------------------------
+
+Sloppy, sloppy, sloppy!!  I didn't even try to compile the last two
+  patches.  This one fixes goofs in regex.c.
+
+Changes from 2.12.18 to 2.12.19
+-------------------------------
+
+Cleanup of last patch.
+
+Changes from 2.12.17 to 2.12.18
+-------------------------------
+
+Makefile renamed to Makefile-dist.
+
+Added alloca() configuration to mkconf.  (A bit kludgey.)  Just
+  add a single line containing ALLOCA_PW, ALLOCA_S or ALLOCA_C
+  to the appropriate config file to have Makefile-dist edited
+  accordingly.
+
+Reorganized output flushing to correspond with new semantics of
+  devopen() on "/dev/std*" etc.
+
+Fixed rest of last goof!!
+
+Save and restore errno in do_pathopen().
+
+Miscellaneous atari updates.
+
+Get rid of the trailing comma in the NODETYPE definition (Cray
+  compiler won't take it).
+
+Try  to make the use of `const' consistent since Cray compiler is
+  fussy about that.  See the changes to `basename' and `myname'.
+
+It turns out that, according to section 3.8.3 (Macro Replacement)
+  of the ANSI Standard:  ``If there are sequences of preprocessing
+  tokens within the list of arguments that would otherwise act as
+  preprocessing directives, the behavior is undefined.''  That means
+  that you cannot count on the behavior of the declaration of
+  re_compile_pattern in awk.h, and indeed the Cray compiler chokes on it.
+
+Replaced alloca with malloc/realloc/free in regex.c.  It was much simpler
+  than expected.  (Inside NO_ALLOCA for now -- by default no alloca.)
+
+Added a configuration file, config/cray60, for Unicos-6.0.
+
+Changes from 2.12.16 to 2.12.17
+-------------------------------
+
+Ooops.  Goofed signal use in last patch.
+
+Changes from 2.12.15 to 2.12.16
+-------------------------------
+
+RENAMED *_dir to just * (e.g. missing_dir).
+
+Numerous VMS changes.
+
+Proper inclusion of atari and vms files.
+
+Added experimental (ifdef'd out) RELAXED_CONTINUATION and DEFAULT_FILETYPE
+ -- please comment on these!
+
+Moved pathopen() to io.c (sigh).
+
+Put local directory ahead in default AWKPATH.
+
+Added facility in mkconf to echo comments on stdout:  lines beginning
+  with "#echo " will have the remainder of the line echoed when mkconf is run.
+  Any lines starting with "#" will otherwise be treated as comments.  The
+  intent is to be able to say:
+  "#echo Make sure you uncomment alloca.c in the Makefile"
+  or the like.
+
+Prototype fix for V.4
+
+Fixed version_string to not print leading @(#).
+
+Fixed FIELDWIDTHS to work with strict (turned out to be easy).
+
+Fixed conf for V.2.
+
+Changed semantics of /dev/fd/n to be like on real /dev/fd.
+
+Several configuration and updates in the makefile.
+
+Updated manpage.
+
+Include tzset.c and system.c from missing_dir that were accidently left out of
+  the last patch.
+
+Fixed bug in cmdline variable assignment -- arg was getting freed(!) in
+  call to variable.
+
+Backed out of parse-time constant folding for now, until I can figure out
+  how to do it right.
+
+Fixed devopen() so that getline <"-" works.
+
+Changes from 2.12.14 to 2.12.15
+-------------------------------
+
+Changed config/* to a condensed form that can be used with mkconf to generate
+  a config.h from config.h-dist -- much easier to maintain.  Please check
+  carefully against what you had before for a particular system and report
+  any problems.  vms.h remains separate since the stuff at the bottom
+  didn't quite fit the mkconf model -- hopefully cleared up later.
+
+Fixed bug in grammar -- didn't allow function definition to be separated from 
+  other rules by a semi-colon.
+
+VMS fix to #includes in missing.c -- should we just be including awk.h?
+
+Updated README for texinfo.tex version.
+
+Updating of copyright in all .[chy] files.
+
+Added but commented out Michal's fix to strftime.
+
+Added tzset() emulation based on Rick Adams' code.  Added TZSET_MISSING to
+	config.h-dist.
+
+Added strftime.3 man page for missing_dir
+
+More posix:	func, **, **= don't work in -W posix
+
+More lint:	^, ^= not in old awk
+
+gawk.1:		removed ref to -DNO_DEV_FD, other minor updating.
+
+Style change:  pushbak becomes pushback() in yylex().
+
+Changes from 2.12.13 to 2.12.14
+-------------------------------
+
+Better (?) organization of awk.h -- attempt to keep all system dependencies
+  near the top and move some of the non-general things out of the config.h
+  files.
+
+Change to handling of SYSTEM_MISSING.
+
+Small change to ultrix config.
+
+Do "/dev/fd/*" etc. checking at runtime.
+
+First pass at VMS port.
+
+Improvements to error handling (when lexeme spans buffers).
+
+Fixed backslash handling -- why didn't I notice this sooner?
+
+Added programs from book to test suite and new target "bigtest" to Makefile.
+
+Changes from 2.12.12 to 2.12.13
+-------------------------------
+
+Recognize OFS and ORS specially so that OFS = 9 works without efficiency hit.
+  Took advantage of opportunity to tune do_print*() for about 10% win on a
+  print with 5 args (i.e. small but significant).
+
+Somewhat pervasive changes to reconcile CONVFMT vs. OFMT.
+
+Better initialization of builtin vars.
+
+Make config/* consistent wrt STRTOL_MISSING.
+
+Small portability improvement to alloca.s
+
+Improvements to lint code in awk.y
+
+Replaced strtol() with a better one by Chris Torek.
+
+Changes from 2.12.11 to 2.12.12
+-------------------------------
+
+Added PORTS file to record successful ports.
+
+Added #define const to nothing if not STDC and added const to strtod() header.
+
+Added * to printf capabilities and partially implemented ' ' and '+' (has an
+  effect for %d only, silently ignored for other formats).  I'm afraid that's
+  as far as I want to go before I look at a complete replacement for
+  do_sprintf().
+
+Added warning for /regexp/ on LHS of MATCHOP.
+
+Changes from 2.12.10 to 2.12.11
+-------------------------------
+
+Small Makefile improvements.
+
+Some remaining nits from the NeXT port.
+
+Got rid of bcopy() define in awk.h -- not needed anymore (??)
+
+Changed private in builtin.c -- it is special on Sequent.
+
+Added subset implementation of strtol() and STRTOL_MISSING.
+
+A little bit of cleanup in debug.c, dfa.c.
+
+Changes from 2.12.9 to 2.12.10
+------------------------------
+
+Redid compatability checking and checking for # of args.
+
+Removed all references to variables[] from outside awk.y, in preparation
+  for a more abstract interface to the symbol table.
+
+Got rid of a remaining use of bcopy() in regex.c.
+
+Changes from 2.12.8 to 2.12.9
+-----------------------------
+
+Portability improvements for atari, next and decstation.
+
+Bug fix in substr() -- wasn't handling 3rd arg. of -1 properly.
+
+Manpage updates.
+
+Moved support from src release to doc release.
+
+Updated FUTURES file.
+
+Added some "lint" warnings.
+
+Changes from 2.12.7 to 2.12.8
+-----------------------------
+
+Changed time() to systime().
+
+Changed warning() in snode() to fatal().
+
+strftime() now defaults second arg. to current time.
+
+Changes from 2.12.6 to 2.12.7
+-----------------------------
+
+Fixed bug in sub_common() involving inadequate allocation of a buffer.
+
+Added some missing files to the Makefile.
+
+Changes from 2.12.5 to 2.12.6
+-----------------------------
+
+Fixed bug wherein non-redirected getline could call iop_close() just
+  prior to a call from do_input().
+
+Fixed bug in handling of /dev/stdout and /dev/stderr.
+
+Changes from 2.12.4 to 2.12.5
+-----------------------------
+
+Updated README and support directory.
+
+Changes from 2.12.3 to 2.12.4
+-----------------------------
+
+Updated CHANGES and TODO (should have been done in previous 2 patches).
+
+Changes from 2.12.2 to 2.12.3
+-----------------------------
+
+Brought regex.c and alloca.s into line with current FSF versions.
+
+Changes from 2.12.1 to 2.12.2
+-----------------------------
+
+Portability improvements; mostly moving system prototypes out of awk.h
+
+Introduction of strftime.
+
+Use of CONVFMT.
+
+Changes from 2.12 to 2.12.1
+-----------------------------
+
+Consolidated treatment of command-line assignments (thus correcting the
+-v treatment).
+
+Rationalized builtin-variable handling into a table-driven process, thus
+simplifying variable() and eliminating spc_var().
+
+Fixed bug in handling of command-line source that ended in a newline.
+
+Simplified install() and lookup().
+
+Did away with double-mallocing of identifiers and now free second and later
+instances of a name, after the first gets installed into the symbol table.
+
+Treat IGNORECASE specially, simplifying a lot of code, and allowing
+checking against strict conformance only on setting it, rather than on each
+pattern match.
+
+Fixed regexp matching when IGNORECASE is non-zero (broken when dfa.c was 
+added).
+
+Fixed bug where $0 was not being marked as valid, even after it was rebuilt.
+This caused mangling of $0.
+
+
+Changes from 2.11.1 to 2.12
+-----------------------------
+
+Makefile:
+
+Portability improvements in Makefile.
+Move configuration stuff into config.h
+
+FSF files:
+
+Synchronized alloca.[cs] and regex.[ch] with FSF.
+
+array.c:
+
+Rationalized hash routines into one with a different algorithm.
+delete() now works if the array is a local variable.
+Changed interface of assoc_next() and avoided dereferencing past the end of the
+  array.
+
+awk.h:
+
+Merged non-prototype and prototype declarations in awk.h.
+Expanded tree_eval #define to short-circuit more calls of r_tree_eval().
+
+awk.y:
+
+Delinted some of the code in the grammar.
+Fixed and improved some of the error message printing.
+Changed to accomodate unlimited length source lines.
+Line continuation now works as advertised.
+Source lines can be arbitrarily long.
+Refined grammar hacks so that /= assignment works.  Regular expressions
+  starting with /= are recognized at the beginning of a line, after && or ||
+  and after ~ or !~.  More contexts can be added if necessary.
+Fixed IGNORECASE (multiple scans for backslash).
+Condensed expression_lists in array references.
+Detect and warn for correct # args in builtin functions -- call most of them
+  with a fixed number (i.e. fill in defaults at parse-time rather than at
+  run-time).
+Load ENVIRON only if it is referenced (detected at parse-time).
+Treat NF, FS, RS, NR, FNR specially at parse time, to improve run time.
+Fold constant expressions at parse time.
+Do make_regexp() on third arg. of split() at parse tiem if it is a constant.
+
+builtin.c:
+
+srand() returns 0 the first time called.
+Replaced alloca() with malloc() in do_sprintf().
+Fixed setting of RSTART and RLENGTH in do_match().
+Got rid of get_{one,two,three} and allowance for variable # of args. at
+  run-time -- this is now done at parse-time.
+Fixed latent bug in [g]sub whereby changes to $0 would never get made.
+Rewrote much of sub_common() for simplicity and performance.
+Added ctime() and time() builtin functions (unless -DSTRICT).  ctime() returns
+  a time string like the C function, given the number of seconds since the epoch
+  and time() returns the current time in seconds.
+do_sprintf() now checks for mismatch between format string and number of
+  arguments supplied.
+
+dfa.c
+
+This is borrowed (almost unmodified) from GNU grep to provide faster searches.
+
+eval.c
+
+Node_var, Node_var_array and Node_param_list handled from macro rather
+  than in r_tree_eval().
+Changed cmp_nodes() to not do a force_number() -- this, combined with a 
+    force_number() on ARGV[] and ENVIRON[] brings it into line with other awks
+Greatly simplified cmp_nodes().
+Separated out Node_NF, Node_FS, Node_RS, Node_NR and Node_FNR in get_lhs().
+All adjacent string concatenations now done at once.
+
+field.c
+
+Added support for FIELDWIDTHS.
+Fixed bug in get_field() whereby changes to a field were not always
+  properly reflected in $0.
+Reordered tests in parse_field() so that reference off the end of the buffer
+  doesn't happen.
+set_FS() now sets *parse_field i.e. routine to call depending on type of FS.
+It also does make_regexp() for FS if needed.  get_field() passes FS_regexp
+  to re_parse_field(), as does do_split().
+Changes to set_field() and set_record() to avoid malloc'ing and free'ing the
+  field nodes repeatedly.  The fields now just point into $0 unless they are
+  assigned to another variable or changed.  force_number() on the field is
+  *only* done when the field is needed.
+
+gawk.1
+
+Fixed troff formatting problem on .TP lines.
+
+io.c
+
+Moved some code out into iop.c.
+Output from pipes and system() calls is properly synchronized.
+Status from pipe close properly returned.
+Bug in getline with no redirect fixed.
+
+iop.c
+
+This file contains a totally revamped get_a_record and associated code.
+
+main.c
+
+Command line programs no longer use a temporary file.
+Therefore, tmpnam() no longer required.
+Deprecated -a and -e options -- they will go away in the next release,
+  but for now they cause a warning.
+Moved -C, -V, -c options to -W ala posix.
+Added -W posix option: throw out \x
+Added -W lint option.
+
+
+node.c
+
+force_number() now allows pure numerics to have leading whitespace.
+Added make_string facility to optimize case of adding an already malloc'd
+  string.
+Cleaned up and simplified do_deref().
+Fixed bug in handling of stref==255 in do_deref().
+
+re.c
+
+contains the interface to regexp code
+
+Changes from 2.11.1 to FSF version of same
+------------------------------------------
+Thu Jan  4 14:19:30 1990  Jim Kingdon  (kingdon at albert)
+
+	* Makefile (YACC): Add -y to bison part.
+
+	* missing.c: Add #include <stdio.h>.
+
+Sun Dec 24 16:16:05 1989  David J. MacKenzie  (djm at hobbes.ai.mit.edu)
+
+	* Makefile: Add (commented out) default defines for Sony News.
+
+	* awk.h: Move declaration of vprintf so it will compile when
+	-DVPRINTF_MISSING is defined.
+
+Mon Nov 13 18:54:08 1989  Robert J. Chassell  (bob at apple-gunkies.ai.mit.edu)
+
+        * gawk.texinfo: changed @-commands that are not part of the
+          standard, currently released texinfmt.el to those that are.
+          Otherwise, only people with the as-yet unreleased makeinfo.c can
+          format this file.
+
+Changes from 2.11beta to 2.11.1 (production)
+--------------------------------------------
+
+Went from "beta" to production status!!!
+
+Now flushes stdout before closing pipes or redirected files to
+synchronize output.
+
+MS-DOS changes added in.
+
+Signal handler return type parameterized in Makefile and awk.h and
+some lint removed.  debug.c cleaned up.
+
+Fixed FS splitting to never match null strings, per book.
+
+Correction to the manual's description of FS.
+
+Some compilers break on char *foo = "string" + 4 so fixed version.sh and
+main.c.
+
+Changes from 2.10beta to 2.11beta
+---------------------------------
+
+This release fixes all reported bugs that we could reproduce.  Probably
+some of the changes are not documented here.
+
+The next release will probably not be a beta release!
+
+The most important change is the addition of the -nostalgia option. :-)
+
+The documentation has been improved and brought up-to-date.
+
+There has been a lot of general cleaning up of the code that is not otherwise
+documented here.  There has been a movement toward using standard-conforming
+library routines and providing them (in missing.d) for systems lacking them.
+Improved (hopefully) configuration through Makfile modifications and missing.c.
+In particular, straightened out confusion over vprintf #defines, declarations
+etc.
+
+Deleted RCS log comments from source, to reduce source size by about one third.
+Most of them were horribly out-of-date, anyway.
+
+Renamed source files to reflect (for the most part) their contents.
+
+More and improved error messages.  Cleanup and fixes to yyerror().
+String constants are not altered in input buffer, so error messages come out 
+better.  Fixed usage message.  Make use of ANSI C strerror() function
+(provided).
+
+Plugged many more memory leaks.  The memory consumption is now quite
+reasonable over a wide range of programs.
+
+Uses volatile declaration if STDC > 0 to avoid problems due to longjmp.
+
+New -a and -e options to use awk or egrep style regexps, respectively,
+since POSIX says awk should use egrep regexps.  Default is -a.
+
+Added -v option for setting variables before the first file is encountered.
+Version information now uses -V and copyleft uses -C.
+
+Added a patchlevel.h file and its use for -V and -C.
+
+Append_right() optimized for major improvement to programs with a *lot*
+of statements.
+
+Operator precedence has been corrected to match draft Posix.
+
+Tightened up grammar for builtin functions so that only length
+may be called without arguments or parentheses.
+
+/regex/ is now a normal expression that can appear in any expression
+context.
+
+Allow /= to begin a regexp.  Allow ..[../..].. in a regexp.
+
+Allow empty compound statements ({}).
+
+Made return and next illegal outside a function and in BEGIN/END respectively.
+
+Division by zero is now illegal and causes a fatal error.
+
+Fixed exponentiation so that x ^ 0 and x ^= 0 both return 1.
+
+Fixed do_sqrt, do_log, and do_exp to do argument/return checking and
+print an error message, per the manual.
+
+Fixed main to catch SIGSEGV to get source and data file line numbers.
+
+Fixed yyerror to print the ^ at the beginning of the bad token, not the end.
+
+Fix to substr() builtin:  it was failing if the arguments
+weren't already strings.
+
+Added new node value flag NUMERIC to indicate that a variable is
+purely a number as opposed to type NUM which indicates that
+the node's numeric value is valid.  This is set in make_number(),
+tmp_number and r_force_number() when appropriate and used in
+cmp_nodes().  This fixed a bug in comparison of variables that had
+numeric prefixes.  The new code uses strtod() and eliminates is_a_number().
+A simple strtod() is provided for systems lacking one.  It does no
+overflow checking, so could be improved.
+
+Simplification and efficiency improvement in force_string.
+
+Added performance tweak in r_force_number().
+
+Fixed a bug with nested loops and break/continue in functions.
+
+Fixed inconsistency in handling of empty fields when $0 has to be rebuilt.
+Happens to simplify rebuild_record().
+
+Cleaned up the code associated with opening a pipe for reading.  Gawk
+now has its own popen routine (gawk_popen) that allocates an IOBUF
+and keeps track of the pid of the child process.  gawk_pclose
+marks the appropriate child as defunct in the right struct redirect.
+
+Cleaned up and fixed close_redir().
+
+Fixed an obscure bug to do with redirection.  Intermingled ">" and ">>"
+redirects did not output in a predictable order.
+
+Improved handling of output buffering:  now all print[f]s redirected to a tty
+or pipe are flushed immediately and non-redirected output to a tty is flushed
+before the next input record is read.
+
+Fixed a bug in get_a_record() where bcopy() could have copied over
+a random pointer.
+
+Fixed a bug when RS="" and records separated by multiple blank lines.
+
+Got rid of SLOWIO code which was out-of-date anyway.
+
+Fix in get_field() for case where $0 is changed and then $(n) are
+changed and then $0 is used.
+
+Fixed infinite loop on failure to open file for reading from getline.
+Now handles redirect file open failures properly.
+
+Filenames such as /dev/stdin now allowed on the command line as well as
+in redirects.
+
+Fixed so that gawk '$1' where $1 is a zero tests false.
+
+Fixed parsing so that `RLENGTH -1' parses the same as `RLENGTH - 1',
+for example.
+
+The return from a user-defined function now defaults to the Null node.
+This fixes a core-dump-causing bug when the return value  of a function
+is used and that function returns no value.
+
+Now catches floating point exceptions to avoid core dumps.
+
+Bug fix for deleting elements of an array -- under some conditions, it was
+deleting more than one element at a time.
+
+Fix in AWKPATH code for running off the end of the string.
+
+Fixed handling of precision in *printf calls.  %0.2d now works properly,
+as does %c.  [s]printf now recognizes %i and %X.
+
+Fixed a bug in printing of very large (>240) strings.
+
+Cleaned up erroneous behaviour for RS == "".
+
+Added IGNORECASE support to index().
+
+Simplified and fixed newnode/freenode.
+
+Fixed reference to $(anything) in a BEGIN block.
+
+Eliminated use of USG rand48().
+
+Bug fix in force_string for machines with 16-bit ints.
+
+Replaced use of mktemp() with tmpnam() and provided a partial implementation of
+the latter for systems that don't have it.
+
+Added a portability check for includes in io.c.
+
+Minor portability fix in alloc.c plus addition of xmalloc().
+
+Portability fix:  on UMAX4.2, st_blksize is zero for a pipe, thus breaking
+iop_alloc() -- fixed.
+
+Workaround for compiler bug on Sun386i in do_sprintf.
+
+More and improved prototypes in awk.h.
+
+Consolidated C escape parsing code into one place.
+
+strict flag is now turned on only when invoked with compatability option.
+It now applies to fewer things.
+
+Changed cast of f._ptr in vprintf.c from (unsigned char *) to (char *).
+Hopefully this is right for the systems that use this code (I don't).
+
+Support for pipes under MSDOS added.
diff --git a/gawk-5.0.1/NEWS.1 b/gawk-5.0.1/NEWS.1
new file mode 100644
index 00000000000..6a1ff443130
--- /dev/null
+++ b/gawk-5.0.1/NEWS.1
@@ -0,0 +1,480 @@
+   Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018
+   Free Software Foundation, Inc.
+   
+   Copying and distribution of this file, with or without modification,
+   are permitted in any medium without royalty provided the copyright
+   notice and this notice are preserved.
+
+Changes from 4.2.0 to 4.2.1
+---------------------------
+
+1. Support for OS/2 has been brought up to date.  This support was
+   accidentally omitted from the initial 4.2 release, for which
+   we apologize.
+
+2. The manual received a number of updates to make it format better
+   for PDF.
+
+3. A new configure option, --enable-versioned-dir, causes the directory
+   holding extensions to include the API version in its name.
+
+4. extension/configure.ac has been improved considerably.
+
+5. In MPFR mode, When ROUNDMODE changes, string values for numerically
+   typed values will be redone.
+
+6. The various 'inplace' tests now pass on modern BSD systems.
+
+7. A number of bugs, some of them quite significant, have been fixed.
+   See the ChangeLog for details.
+
+Changes from 4.1.4 to 4.2.0
+---------------------------
+
+1. If not in POSIX mode, changes to ENVIRON are reflected into
+   gawk's environment, affecting any programs run by system()
+   or for piped redirections. This can also affect built-in routines, such
+   as mktime(), which is typically influenced by the TZ environment variable.
+
+2. The series of numbers returned by rand() should now be "more
+   random" than previously.  Gawk's rand() remains repeatable; you will
+   get the same series of numbers each time you call rand() repeatedly,
+   but this will be a different series than previously.
+
+3. Multiple changes related to the pretty printer:
+
+   * The --pretty-print option no longer runs the program too.
+
+   * Pretty printing now preserves comments and places them into the
+     pretty-printed file.
+
+   * Pretty-printing now uses the original text of constant numeric values
+     for pretty-printing and profiling.
+
+   * Pretty-printing now preserves parenthesized expressions as they
+     were in the source file. This solves several niggling corner cases
+     with such things.
+
+4. The igawk script and igawk.1 man page are no longer installed by
+   `make install'.  They have been obsolete since gawk 4.0.0.
+
+5. Gawk can now be built with CMake.  This is an alternative build
+   system for those who may want it; gawk is not going to switch off
+   use of the autotools anytime soon, if ever.
+
+6. Gawk now processes a maximum of two hexadecimal digits in \x
+   escape sequences inside strings.
+
+7. Setting PROCINFO["redirection", "NONFATAL"] to true makes I/O
+   errors for "redirection" not fatal, setting ERRNO. Setting
+   PROCINFO["NONFATAL"] makes all I/O nonfatal. See the manual.
+
+8. MirBSD is no longer supported.
+
+9. `make install' now installs shell startup files
+   $sysconfdir/profile.d/gawk.{csh,sh} containing shell functions to
+   manipulate the AWKPATH and AWKLIBPATH environment variables.  On a Fedora
+   system, these files belong in /etc/profile.d, but the appropriate location
+   may be different on other platforms.
+
+10. Gawk now supports retryable I/O via PROCINFO[input-file, "RETRY"]; see
+    the manual.
+
+11. The C API has undergone changes that break binary compatibility with
+    the previous version. Thus the API version is now at 2.0.  YOU WILL
+    NEED TO RECOMPILE YOUR EXTENSIONS to work with this version of gawk.
+    Source code compatibility remains intact, although you will get
+    compiler warnings if you do not revise your extensions. We strongly
+    recommend that you do so.  Fortunately, the changes are fairly minor
+    and straightforward.
+
+    See the manual for the new features.
+
+12. Revisions in the POSIX standard remove the special case for POSIX
+    mode when FS = " " where newline was not a field separator. The code
+    and doc have been updated.
+
+13. Gawk now supports strongly typed regexp constants. Such constants
+    look like @/.../.  You can assign them to variables, pass them to
+    functions, use them in ~, !~ and the case part of a switch statement.
+    More details are provided in the manual.
+
+14. The new typeof() function can be used to indicate if a variable or
+    array element is an array, regexp, string or number.
+
+15. As promised when 4.1 was released, the old extension mechanism,
+    using the `extension' function, is now gone.
+
+16. Support for GNU/Linux on Alpha systems has been removed.
+
+17. Optimizations are now enabled by default. Use the new -s/--no-optimize
+    option(s) to disable them.  Pretty-printing and profiling automatically
+    disable optimizations so that the output program is the same as the
+    original input program.
+
+18. Gawk now uses fwrite_unlocked if it's available. This yields a 7% - 18%
+    improvement in raw output speed (gawk '{ print }' on a large file).
+
+19. Passing negative operands to any of the bitwise functions now
+    produces a fatal error.
+
+20. Programs that toggle IGNORECASE a lot should now be noticeably faster.
+
+21. The mktime() function now accepts an optional second argument. If this
+    argument is present and is non-zero or non-null, the time will be converted
+    from UTC instead of from the local timezone.
+
+22. The FIELDWIDTHS parsing syntax has been enhanced to allow specifying
+    how many characters to skip before a field starts. It also allows
+    specifying '*' as the last character to mean "the rest of the record".
+    Field splitting with FIELDWIDTHS now sets NF correctly.  The documentation
+    for FIELDWIDTHS in the manual has been considerably reorganized and
+    improved as well.
+
+23. The PROCINFO["argv"] array records all of gawk's command line arguments
+    as gawk received them (the values of the C level argv array).
+
+24. The DJGPP port has been revived and now has an official maintainer.
+
+25. The manual has been translated into Italian!  The translation is
+    included in the distribution.
+
+Changes from 4.1.3 to 4.1.4
+---------------------------
+
+1. Updated to GNU autoconf 2.69, automake 1.15, gettext 0.19.7,
+   texinfo 6.1, texinfo.tex 2016-02-05.07, libtool 2.4.6.
+
+2. z/OS support updated.
+
+3. At the beginning of each statement, the debugger now checks and
+   reports watchpoints that have fired before checking for breakpoints.
+   This gives more natural behavior to the user.
+
+4. The "exit" command has been added to the debugger as an alias
+   for "quit".
+
+5. AIX 7.1 should pass the test suite now.  Similar for Minix.
+
+6. VMS support has been updated.
+
+7. The profiler / pretty-printer now chains else-if statements instead
+   of causing cascading elses.
+
+8. The return value of system() has been enhanced to convey more information.
+   See the doc.
+
+9. Attempting to write to the "to" end of a two-way pipe that has been
+   closed is now a fatal error. Similarly, so is reading from the "from"
+   end that has been closed.
+
+10. MinGW support has been updated.
+
+11. The -d option now allows -d- to print to standard output.
+
+12. Error messages for --help and in other instances should now get
+    translated correctly.
+
+13. A new environment variable GAWK_LOCALE_DIR may be set to locate the .mo
+    file for gawk itself.
+
+14. The DJGPP port is now officially deprecated.
+
+15. A number of bugs have been fixed. See the ChangeLog.
+
+Changes from 4.1.2 to 4.1.3
+---------------------------
+
+1. Regexp parsing with extra brackets should now be working again. There
+   are several new tests to keep this stuff on track.
+
+2. Updated to latest config.guess and config.sub.
+
+3. A (small) number of bugs have been fixed. See the ChangeLog.
+
+Changes from 4.1.1 to 4.1.2
+---------------------------
+
+1. The manual has been considerably improved.
+	- Thoroughly reviewed and updated.
+	- Out-of-date examples replaced.
+	- Chapter 15 on MPFR reworked.
+	- Summary sections added to all chapters.
+	- Exercises added in several chapters.
+	- Heavily proof-read and copyedited.
+
+2. The debugger's "restart" command now works again.
+
+3. Redirected getline is now allowed inside BEGINFILE/ENDFILE.
+
+4. A number of bugs have been fixed in the MPFR code.
+
+5. Indirect function calls now work for both built-in and extension functions.
+
+6. Built-in functions are now included in FUNCTAB.
+
+7. POSIX and historical practice require the exclusive use of the English
+   alphabet in identifiers.  In non-English locales, it was accidentally
+   possible to use "letters" beside those of the English alphabet.  This
+   has been fixed. (isalpha and isalnum are NOT our friends.)
+
+   If you feel that you must have this misfeature, use `configure --help'
+   to see what option to use when configuring gawk to reenable it.
+
+8. The "where" command has been added to the debugger as an alias
+   for "backtrace". This will make life easier for long-time GDB users.
+
+9. Gawk no longer explicitly checks the current directory after doing
+   a path search of AWKPATH.  The default value continues to have "." at
+   the front, so most people should not be affected.  If you have your own
+   AWKPATH setting, be sure to put "." in it somewhere. The documentation
+   has been updated and clarified.
+
+10. Infrastructure upgrades: Automake 1.15, Gettext 0.19.4, Libtool 2.4.6,
+    Bison 3.0.4.
+
+11. If a user-defined function has a parameter with the same name as another
+    user-defined function, it is no longer possible to call the second
+    function from inside the first.
+
+12. POSIX requires that the names of function parameters not be the
+    same as any of the special built-in variables and also not conflict
+    with the names of any functions. Gawk has checked for the former
+    since 3.1.7. With --posix, it now also checks for the latter.
+
+13. The test suite should check for necessary locales and skip the tests
+    where it matters if support isn't what it should be.
+
+14. Gawk now expects to be compiled on a system with multibyte character
+    support.  Systems without such support, at least at the C language
+    level, are so obsolete as to not be worth supporting anymore.
+
+15. A number of bugs have been fixed. See the ChangeLog.
+
+Changes from 4.1.0 to 4.1.1
+---------------------------
+
+1. The "stat" extension now includes a "devbsize" element which indicates
+   the units for the "nblocks" element.
+
+2. The extension facility now works on MinGW. Many of the extensions can be
+   built and used directly.
+
+3. A number of bugs in the pretty-printing / profiling code have been fixed.
+
+4. Sockets and two-way pipes now work under MinGW.
+
+5. The debugger now lists source code correctly under Cygwin.
+
+6. Configuration and building with the Mac OS X libreadline should work now.
+
+7. The -O option now works again.
+
+8. The --include option, documented since 4.0, now actually works.
+
+9. Infrastructure updated to automake 1.13.4, bison 3.0.2, and
+   libtool 2.4.2.418.
+
+10. The configure script now accepts a --disable-extensions option,
+    which disables checking for and building the extensions.
+
+11. The VMS port has been considerably improved. In particular config.h
+    is now generated by a DCL script. Also, the extension facility works
+    and several of the extensions can be built and used. Currently, the
+    extension facility only works on Alpha and Itanium.
+
+12. The API now provides functions pointers for malloc(), calloc(),
+    realloc() and free(), to insure that the same memory allocation
+    functions are always used. This bumps the minor version by one.
+
+13. The printf quote flag now works correctly in locales with a different
+    decimal point character but without a thousands separator character.
+    If the thousands separator is a string, it will be correctly added
+    to decimal numbers.
+
+14. The readfile extension now has an input parser that will read whole
+    files as a single record.
+
+15. A number of bugs have been fixed. See the ChangeLog.
+
+Changes from 4.0.2 to 4.1.0
+---------------------------
+
+1. The three executables gawk, pgawk, and dgawk, have been merged into
+   one, named just gawk.  As a result:
+   	* The -R option is gone
+	* Use -D to run the debugger. An optional file argument is a
+	  list of commands to run first.
+	* Use -o to do pretty-printing only.
+	* Use -p to do profiling.
+   This considerably reduces gawk's "footprint" and eases the documentation
+   burden as well.
+
+2. Gawk now supports high precision arithmetic with MPFR.  The default is
+   still double precision, but setting PREC changes things, or using
+   the -M / --bignum options.  This support is not compiled in if the MPFR
+   library is not available.
+
+3. The new -i option (from xgawk) is used for loading awk library files.
+   This differs from -f in that the first non-option argument is treated
+   as a script.
+
+4. The new -l option (from xgawk) is used for loading dynamic extensions.
+
+5. The dynamic extension interface has been completely redone!  There is
+   now a defined API for C extensions to use.  A C extension acts like
+   a function written in awk, except that it cannot do everything that awk
+   code can. However, this allows interfacing to any facility that is
+   available from C.  This is a major development, see the doc, which has
+   a nice shiny new chapter describing everything.
+
+   This support is not compiled in if dynamic loading of shared libraries
+   is not supported.
+
+   The old extension mechanism is still supported for compatiblity, but
+   it will most definitely be removed at the next major release.
+
+6. The "inplace" extension, built using the new facility, can be used to
+   simulate the GNU "sed -i" feature.
+
+7. The and(), or() and xor() functions now take any number of arguments,
+   with a minimum of two.
+
+8. New arrays: SYMTAB, FUNCTAB, and PROCINFO["identifiers"]. SYMTAB allows
+   indirect access to any defined variable or array; it is possible to
+   "walk" the symbol table, if that should be necessary.
+
+9. Support for building gawk with a cross compiler has been improved.
+
+10. Infrastructure upgrades: bison 2.7.1, gettext 0.18.2.1, automake 1.13.1,
+    libtool 2.4.2 for the extensions.
+
+Changes from 4.0.1 to 4.0.2
+---------------------------
+
+1. Infrastructure upgrades: Autoconf 2.69, Automake 1.12.6, bison 2.7.
+
+2. `fflush()', `nextfile', and `delete array' are all now part of POSIX.
+
+3. fflush() behavior changed to match BWK awk and for POSIX - now both
+   fflush() and fflush("") flush all open output redirections.
+
+4. Various minor bug fixes and documentation updates.
+ 
+Changes from 4.0.0 to 4.0.1
+---------------------------
+
+1. The default handling of backslash in sub() and gsub() has been reverted to
+   the behavior of 3.1. It was silly to think I could break compatibility that
+   way, even for standards compliance.
+
+2. Completed the implementation of Rational Range Interpretation.
+
+3. Failure to get the group set is no longer a fatal error.
+
+4. Lots of minor bugs fixed and portability clean-ups along the way. See
+   the ChangeLog for details.
+
+Changes from 3.1.8 to 4.0.0
+---------------------------
+
+1. The special files /dev/pid, /dev/ppid, /dev/pgrpid and /dev/user are
+   now completely gone. Use PROCINFO instead.
+
+2. The POSIX 2008 behavior for `sub' and `gsub' are now the default.
+   THIS CHANGES BEHAVIOR!!!!
+
+3. The \s and \S escape sequences are now recognized in regular expressions.
+
+4. The split() function accepts an optional fourth argument which is an array
+   to hold the values of the separators.
+
+5. The new -b / --characters-as-bytes option means "hands off my data"; gawk
+   won't try to treat input as a multibyte string.
+
+6. There is a new --sandbox option; see the doc.
+
+7. Indirect function calls are now available.
+
+8. Interval expressions are now part of default regular expressions for
+   GNU Awk syntax.
+
+9. --gen-po is now correctly named --gen-pot.
+
+10. switch / case is now enabled by default. There's no longer a need
+    for a configure-time option.
+
+11. Gawk now supports BEGINFILE and ENDFILE. See the doc for details.
+
+12. Directories named on the command line now produce a warning, not
+    a fatal error, unless --posix or --traditional.
+
+13. The new FPAT variable allows you to specify a regexp that matches
+    the fields, instead of matching the field separator. The new patsplit()
+    function gives the same capability for splitting.
+
+14. All long options now have short options, for use in `#!' scripts.
+
+15. Support for IPv6 is added via the /inet6/... special file. /inet4/...
+    forces IPv4 and /inet chooses the system default (probably IPv4).
+
+16. Added a warning for /[:space:]/ that should be /[[:space:]]/.
+
+17. Merged with John Haque's byte code internals. Adds dgawk debugger and
+    possibly improved performance.
+
+18. `break' and `continue' are no longer valid outside a loop, even with
+    --traditional.
+
+19. POSIX character classes work with --traditional (BWK awk supports them).
+
+20. Nuked redundant --compat, --copyleft, and --usage long options.
+
+21. Arrays of arrays added. See the doc.
+
+22. Per the GNU Coding Standards, dynamic extensions must now define
+    a global symbol indicating that they are GPL-compatible. See
+    the documentation and example extensions.
+    THIS CHANGES BEHAVIOR!!!!
+
+23. In POSIX mode, string comparisons use strcoll/wcscoll.
+    THIS CHANGES BEHAVIOR!!!!
+
+24. The option for raw sockets was removed, since it was never implemented.
+
+25. Gawk now treats ranges of the form [d-h] as if they were in the C
+    locale, no matter what kind of regexp is being used, and even if
+    --posix.  The latest POSIX standard allows this, and the documentation
+    has been updated.  Maybe this will stop all the questions about
+    [a-z] matching uppercase letters.
+    THIS CHANGES BEHAVIOR!!!!
+
+26. PROCINFO["strftime"] now holds the default format for strftime().
+
+27. Updated to latest infrastructure: Autoconf 2.68, Automake 1.11.1,
+    Gettext 0.18.1, Bison 2.5.
+
+28. Many code cleanups. Removed code for many old, unsupported systems:
+	- Atari
+	- Amiga
+	- BeOS
+	- Cray
+	- MIPS RiscOS
+	- MS-DOS with Microsoft Compiler
+	- MS-Windows with Microsoft Compiler
+	- NeXT
+	- SunOS 3.x, Sun 386 (Road Runner)
+	- Tandem (non-POSIX)
+	- Prestandard VAX C compiler for VAX/VMS
+	- Probably others that I've forgotten
+
+29. If PROCINFO["sorted_in"] exists, for(iggy in foo) loops sort the
+    indices before looping over them.  The value of this element
+    provides control over how the indices are sorted before the loop
+    traversal starts. See the manual.
+
+30. A new isarray() function exists to distinguish if an item is an array
+    or not, to make it possible to traverse multidimensional arrays.
+
+31. asort() and asorti() take a third argument specifying how to sort.
+    See the doc.
diff --git a/gawk-5.0.1/POSIX.STD b/gawk-5.0.1/POSIX.STD
new file mode 100644
index 00000000000..d40433ff908
--- /dev/null
+++ b/gawk-5.0.1/POSIX.STD
@@ -0,0 +1,64 @@
+  Copyright (C) 1992, 1995, 1998, 2001, 2006, 2007, 2010, 2011, 2015, 2019
+  Free Software Foundation, Inc.
+  
+  Copying and distribution of this file, with or without modification,
+  are permitted in any medium without royalty provided the copyright
+  notice and this notice are preserved.
+--------------------------------------------------------------------------
+Sun Apr 21 14:27:19 IDT 2019
+============================
+This file documents several things related to the 2008 POSIX standard
+that I noted after reviewing it.
+
+1. POSIX leaves undefined what happens for something like
+
+	awk '{ print ; exit }' if=42 /etc/passwd
+
+   Mawk diagnoses this.  Gawk and BWK awk do not. This doesn't seem to be
+   worth the effort to add the code, but at least I'm aware of it.
+
+2. The 2001-2004 standards accidentally required support for hexadecimal
+   floating point constants and for Infinity and Not-A-Number (NaN) values.
+
+   The 2008 standard now explicitly allows, but does not require, such
+   support.
+
+   More discussion is provided in the node `POSIX Floating Point Problems'
+   in gawk.texi.
+
+3. String comparison with <, <= etc is supposed to take the locale's collating
+   sequence into account.  By default gawk doesn't do this. Rather, gawk
+   will do this only if --posix is in effect.
+
+4. According to POSIX, the function parameters of one function may not have
+   the same name as another function, making this invalid:
+
+	function foo() { ... }
+	function bar(foo) { ...}
+
+   Or even:
+
+	function bar(foo) { ...}
+	function foo() { ... }
+
+   Gawk enforces this only with --posix.
+
+5. According to POSIX (following the A, K, & W book), when RS = "", then
+   newline is also a separator, "no matter what the value of FS is", implying
+   that this is true even if FS is a regexp.
+
+   In fact, UNIX awk has never behaved that, way; it adds \n to the list
+   for FS = " " or any other single character, and gawk does too. This is
+   essentially a bug in POSIX.
+
+The following things aren't described by POSIX but ought to be:
+
+1. The value of $0 in an END rule
+
+2. The return value of a function that either does return with no value
+   or that falls off the end of the function body.
+
+3. What happens with substr() if start is <= 0, or greater than the length
+   of the string, or if length is <= 0.
+
+4. Whether "next" can be invoked from a function body.
diff --git a/gawk-5.0.1/README b/gawk-5.0.1/README
new file mode 100644
index 00000000000..6d50b7d3be5
--- /dev/null
+++ b/gawk-5.0.1/README
@@ -0,0 +1,105 @@
+  Copyright (C) 2005, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015,
+  2016, 2017, 2018, 2019 Free Software Foundation, Inc.
+  
+  Copying and distribution of this file, with or without modification,
+  are permitted in any medium without royalty provided the copyright
+  notice and this notice are preserved.
+
+README:
+
+This is GNU Awk 5.0.1. It is upwardly compatible with Brian Kernighan's
+version of Unix awk.  It is almost completely compliant with the
+2018 POSIX 1003.1 standard for awk. (See the note below about POSIX.)
+
+This is a bug-fix release. See NEWS and ChangeLog for details.
+
+Work to be done is described briefly in the TODO file, which is available
+only in the 'master' branch in the Git repo.
+
+Changes in this version are summarized in the NEWS file.
+
+Read the file POSIX.STD for a discussion of issues where the standard
+says one thing but gawk does something different.
+
+To format the documentation with TeX, use at least version 2017-09.16
+of texinfo.tex. There is a usable copy of texinfo.tex in the doc directory.
+You should also use at least version 6.5 of texindex and of makeinfo
+from the texinfo-6.5 distribution.
+
+INSTALLATION:
+
+Check whether there is a system-specific README file for your system under
+the `README_d' directory.  If there's something there that you should
+have read and didn't, and you bug me about it, I'm going to yell at you.
+
+See the file INSTALL for installation instructions.
+
+If you don't have Bison, use the awkgram.c file here.  It was
+generated with Bison, and has no proprietary code in it.  (Note that
+modifying awkgram.y without Bison will be difficult, at best.  You might
+want to get a copy of Bison from the FSF too.)
+
+The build mechanics depend upon Bison. Also, gawk doesn't work correctly
+with some versions of yacc, so just use Bison.
+
+If you have an MS-DOS, MS-Windows, or OS/2 system, use the stuff in the `pc'
+directory.  Similarly, there is a separate directory for VMS.
+
+Appendix B of ``GAWK: Effective Awk Programming'' discusses configuration
+in detail. The configuration process is based on GNU Autoconf and
+Automake.
+
+After successful compilation, do `make check' to run the test suite.
+There should be no output from the `cmp' invocations except in the
+cases where there are small differences in floating point values, and
+possibly in the case of strftime.  There may be differences based on
+installed (or not installed) locales and the quality of multibyte
+character support on your system.
+
+Several of the tests ignore errors on purpose; those are not a problem.
+If there are other differences, please investigate and report the problem.
+
+PRINTING THE MANUAL
+
+The `doc' directory contains a recent version of texinfo.tex, which will
+be necessary for printing the manual.  Use `make dvi' to get a DVI file
+from the manual. In the `doc' directory, use `make postscript' to get
+PostScript versions of the manual, the man page, and the reference card.
+Use `make pdf' to get PDF versions of the manuals, the man page and
+the reference card.
+
+BUG REPORTS AND FIXES (Un*x systems):
+
+Please coordinate changes through Arnold Robbins. In particular, see
+the section in the manual on reporting bugs. Note that comp.lang.awk
+is about the worst place to post a gawk bug report. So too is use of
+a web forum such as Stack Overflow. Please, use the mechanisms outlined
+in the manual.
+
+Email should be sent to bug-gawk@gnu.org.  This is a separate mailing
+list at GNU Central.  The advantage to using this address is that bug
+reports are archived at GNU Central.
+
+Arnold Robbins
+
+BUG REPORTS AND FIXES, non-Unix systems:
+
+MS-DOS with DJGPP:
+	Juan Manuel Guerrero
+	juan.guerrero@gmx.de
+
+MS-Windows with MinGW:
+	Eli Zaretskii
+	eliz@gnu.org
+
+OS/2:
+	Andreas Buening
+	andreas.buening@nexgo.de
+
+VMS:
+	John Malmberg
+	wb8tyw@qsl.net
+
+z/OS (OS/390) Contact:
+	Daniel Richard G.
+	skunk@iSKUNK.ORG
diff --git a/gawk-5.0.1/README_d/ChangeLog b/gawk-5.0.1/README_d/ChangeLog
new file mode 100644
index 00000000000..6df93c56d1e
--- /dev/null
+++ b/gawk-5.0.1/README_d/ChangeLog
@@ -0,0 +1,9 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/README_d/ChangeLog.0 b/gawk-5.0.1/README_d/ChangeLog.0
new file mode 100644
index 00000000000..8cea0656710
--- /dev/null
+++ b/gawk-5.0.1/README_d/ChangeLog.0
@@ -0,0 +1,8 @@
+2010-12-18  Eli Zaretskii  <eliz@gnu.org>
+
+	* README.pc: Update and simplify.  Remove lots of
+	outdated stuff for systems and configurations no longer supported.
+
+2010-12-18  Arnold Robbins  <arnold@skeeve.com>
+
+	* ChangeLog: Created.
diff --git a/gawk-5.0.1/README_d/ChangeLog.1 b/gawk-5.0.1/README_d/ChangeLog.1
new file mode 100644
index 00000000000..6e233b0a9a4
--- /dev/null
+++ b/gawk-5.0.1/README_d/ChangeLog.1
@@ -0,0 +1,187 @@
+2018-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.alpine: Updated with info about diff.
+
+2018-05-12  Eli Zaretskii  <eliz@gnu.org>
+
+	* README.pc: Update with information regarding testing on Windows
+	and in particular the number of tests expected to fail.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-02-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.macosx: Updated.
+
+2018-02-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.macosx: Updated.
+
+2018-02-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.macosx: Updated.
+
+2018-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.macosx: Updated.
+
+2017-11-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.mpfr: Make separate sections for different ports and
+	update some of the info.
+
+2017-11-13  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* README.mpfr: Add info that DJGPP port compiles with MPFR support.
+
+2017-10-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.os2: Updated with email from Andreas.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.rpm: New file.
+
+2017-09-04  Eli Zaretskii  <eliz@gnu.org>
+
+	* README.pc: Update instructions for building the extensions
+	without libmpfr.
+
+2017-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.pc: Updated to point to Juan Guerrero for DJGPP.
+	Thanks to Scott Deifik for the report.
+
+2017-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.alpine: New file.
+
+2017-08-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.freebsd: New file.
+
+2016-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.macosx: Updated.
+
+2016-10-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.aix: New file.
+	* README.zLinux: Typo fix.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.macosx: Updated.
+
+2016-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.zLinux: New file.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-04-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.macosx: Updated.
+
+2015-04-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.macosx: New file.
+
+2014-08-12         Juergen Kahrs <jkahrs@users.sourceforge.net>
+
+	* README.cmake: Moved file from top-level to here.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.gcc-3: New file.
+
+2014-01-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.solaris: Updated.
+
+2014-01-12         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* README.VMS: document that the gawk.cld needs a fix.
+
+2013-12-23         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* README.VMS: Add documentation about building dynamic
+	extensions.
+
+2013-12-23         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* README.VMS: Document decoding Gawk VMS exit codes.
+
+2013-12-16         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* README.VMS: Further updates.
+
+2013-12-05         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* README.VMS: updated with current build information.
+
+2013-07-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.pc: Update that |& also now works on MinGW.
+
+2013-05-14  Eli Zaretskii  <eliz@gnu.org>
+
+	* README.pc: Update the pc build and test instructions.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.hacking, README.mpfr, README.pc: Updated.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-04-11         John Haque      <j.eh@mchsi.com>
+
+	* README.hacking: New file.
+
+2012-04-01         John Haque      <j.eh@mchsi.com>
+
+	* README.mpfr: New file.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2011-07-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.pc: Add download location info for DJGPP version.
+
+2011-07-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* README.solaris: Info added on using the Solaris C compiler.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/README_d/README.VMS b/gawk-5.0.1/README_d/README.VMS
new file mode 100644
index 00000000000..0faabbc221f
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.VMS
@@ -0,0 +1,226 @@
+
+Compiling GAWK on VMS:
+
+     There's a DCL command procedure that will issue all the necessary
+CC and LINK commands, and there's also a Makefile for use with the MMS
+utility.  From the source directory, use either
+ |$ @[.VMS]VMSBUILD.COM
+or
+ |$ MMS/DESCRIPTION=[.VMS]DESCRIP.MMS gawk
+or
+ |$ MMK/DESCRIPTION=[.VMS]DESCRIP.MMS gawk
+
+Note that on IA64 and Alpha the case of the target may be important.
+MMS has had problems on ODS-5 volumes.  MMK does not have these issues.
+MMK is available free from https://github.com/endlesssoftware/mmk.
+The most recent builds of gawk on VMS used MMK.
+
+Support of the vmsbuild.com may get dropped in a future release.
+
+DEC C  -- use either vmsbuild.com or descrip.mms as is.
+       DEC C is also known as Compaq C and HP C.
+
+VAX C  -- use `@vmsbuild VAXC' or `MMS/MACRO=("VAXC")'.  On a system
+        with both VAX C and DEC C installed where DEC C is the default,
+        use `MMS/MACRO=("VAXC","CC=CC/VAXC")' for the MMS variant; for
+        the vmsbuild.com variant, any need for `/VAXC' will be detected
+        automatically.
+        * IMPORTANT NOTE * VAX C should not be used on VAX/VMS 5.5-2 and
+        later.  Use DEC C instead.
+
+GNU C  -- use `@vmsbuild GNUC' or `MMS/MACRO=("GNUC")'.  On a system
+        where the GCC command is not already defined, use either
+        `@vmsbuild GNUC DO_GNUC_SETUP' or
+        `MMS/MACRO=("GNUC","DO_GNUC_SETUP")'.
+
+Most recent builds are using:
+    OpenVMS VAX 7.3 using DEC C 6.4
+    OpenVMS Alpha 8.3 using HP C V 7.3
+    OpenVMS Alpha 8.4 using HP C V 7.3
+    OpenVMS IA64 8.4 using HP C V 7.3
+
+GAWK was originally ported for VMS V4.6 and up.  It has not been tested
+with a release that old for some time.
+
+Compiling dynamic extensions on VMS:
+
+GAWK comes with some dynamic extensions.  The extensions that have been
+ported to VMS can be built using one of the following commands.
+
+ |$ MMS/DESCRIPTION=[.VMS]DESCRIP.MMS extensions
+or
+ |$ MMK/DESCRIPTION=[.VMS]DESCRIP.MMS extensions
+
+GAWK uses AWKLIBPATH as either an environment variable or a logical name
+to find the dynamic extensions.
+
+Dynamic extensions need to be compiled with the same compiler options for
+floating point, pointer size, and symbol name handling as gawk.
+Alpha and Itanium should use IEEE floating point.  The pointer size is 32 bits,
+and the symbol name handling is to be exact case with CRC shortening for
+symbols longer than 32 bits.
+
+Currently dynamic extensions have only been tested to work on VMS 8.3 and later
+on both Alpha and Itanium.  Dynamic extensions are not currently working on
+VAX/VMS 7.3.
+
+Compile time are macros needed to be defined before the first VMS supplied
+header file is included.  Usually this will be done with a config.h file.
+
+#if (__CRTL_VER >= 70200000) && !defined (__VAX)
+#define _LARGEFILE 1
+#endif
+
+#ifndef __VAX
+#ifdef __CRTL_VER
+#if __CRTL_VER >= 80200000
+#define _USE_STD_STAT 1
+#endif
+#endif
+#endif
+
+Alpha and Itanium:
+
+/name=(as_is,short)
+/float=ieee/ieee_mode=denorm_results
+
+VAX:
+
+/name=(as_is,short)
+
+The linker option files are [.vms]gawk_plugin.opt for Alpha and Itanium.
+
+As the VAX dynamic plug-in feature is not yet working, the files potentially
+needed for a future VAX plugin are in [.vms.vax] directory of the source.
+
+
+Testing GAWK on VMS:
+
+After you build gawk, you can test it with the [.vms]vmstest.com procedure.
+The procedure takes a parameter that is either for a list of tests or
+a specific test.  The parameter clean cleans up files left over from running
+the tests.
+
+  $ set def [.test]
+  $ @[-.vms]vmstest.com bigtest
+  $ @[-.vms]vmstest.com clean
+  $ set def [-]
+
+To test the dynamic extensions on VMS 8.3 and later, use:
+
+  $ set def [.test]
+  $ @[-.vms]vmstest.com extension
+  $ @[-.vms]vmstest.com clean
+  $ set def [-]
+
+
+Installing GAWK on VMS:
+
+     All that's needed is a 'foreign' command, which is a DCL symbol
+whose value begins with a dollar sign.
+ |$ GAWK :== $device:[directory]GAWK
+(Substitute the actual location of gawk.exe for 'device:[directory]'.)
+That symbol should be placed in the user's login.com or in the system-
+wide sylogin.com procedure so that it will be defined every time the
+user logs on.
+
+If your gawk was installed by a PCSI kit into the GNV$GNU: directory tree,
+the program will be known as GNV$GNU:[bin]gnv$gawk.exe and the help file
+will be GNV$GNU:[vms_help]gawk.hlp.  The GNV$GNU:[vms_bin]gawk_verb.cld can be
+used to add GAWK and the alias AWK to a DCL command table.
+
+     Optionally, the help entry can be loaded into a VMS help library.
+ |$ LIBRARY/HELP SYS$HELP:HELPLIB [.VMS]GAWK.HLP
+(You may want to substitute a site-specific help library rather than
+the standard VMS library 'HELPLIB'.)  After loading the help text,
+ |$ HELP GAWK
+will provide information about both the gawk implementation and the
+awk programming language.
+
+     The logical name AWK_LIBRARY can designate a default location
+for awk program files.  For the '-f' option, if the specified filename
+has no device or directory path information in it, Gawk will look in
+the current directory first, then in the directory specified by the
+translation of AWK_LIBRARY if it the file wasn't found.  If the file
+still isn't found, then ".awk" will be appended and the file access
+will be re-tried.  If AWK_LIBRARY is not defined, that portion of the
+file search will fail benignly.
+
+
+Running GAWK on VMS:
+
+     Command line parsing and quoting conventions are significantly
+different on VMS, so examples in _The_GAWK_Manual_ or the awk book
+often need minor changes.  They *are* minor though, and all the awk
+programs should run correctly.
+
+     Here are a couple of trivial tests:
+ |$ gawk -- "BEGIN {print ""Hello, World!""}"
+ |$ gawk -"W" version     !could also be -"W version" or "-W version"
+Note that upper- and mixed-case text must be quoted.
+
+     The VMS port of Gawk includes a DCL-style interface in addition
+to the original shell-style interface.  See the help entry for details.
+One side-effect of dual command line parsing is that if there's only a
+single parameter (as in the quoted string program above), the command
+becomes ambiguous.  To work-around this, the normally optional "--"
+flag is required to force shell rather than DCL parsing.  If any other
+dash-type options (or multiple parameters such as data files to be
+processed) are present, there is no ambiguity and "--" can be omitted.
+
+     The logical name AWKPATH can be used to override the default
+search path of "SYS$DISK:[],AWK_LIBRARY:" when looking for awk program
+files specified by the '-f' option.  The format of AWKPATH is a comma-
+separated list of directory specifications.  When defining it, the
+value should be quoted so that it retains a single translation, not a
+multi-translation RMS searchlist.
+
+     The exit status from Gawk is encoded in the the VMS $status exit
+value so that the severity bits are set as expected and the original
+Gawk exit value can be extracted.
+
+To extract the actual gawk exit code from the VMS status use:
+     unix_status = (vms_status .and. &x7f8) / 8
+
+The exit value is encoded to comply with VMS coding standards and
+will have the C_FACILITY_NO of 0x350000 with the constant 0xA000
+added to the number shifted over by 3 bits to make room for the
+severity codes.
+
+The Gawk exit value of 1 will result in the VMS status having the
+ERROR severity status set.  The Gawk exit value of 2 will result in
+the FATAL severity status set.  All other Gawk exit values will have
+the Success severity status set.
+
+This change was needed to provide all Gawk exit values to VMS programs and
+for compatibilty with programs written in C and the GNV environment.
+
+Older versions of Gawk incorrectly mostly passed through the Gawk
+status values instead of encoding them.  DCL scripts that were checking
+the severity values will probably not need changing.  DCL scripts that
+were checking the exact exit status will need an update.
+
+VAX/VMS floating point uses unbiased rounding.  This is generaly incompatible
+with the expected behavior.  The ofmta test in the test directory will
+fail on VAX.
+
+Gawk needs the SYS$TIMEZONE_RULE or TZ logical name to be defined or it
+will output times in GMT.
+
+The vmstest.com script needs SYS$TIMEZONE_NAME to be defined to match
+the SYS$TIMEZONE_RULE.  Older versions of VMS do not define these logical
+names.
+
+TO DO Items (not in order of priority)
+
+1. Implement dynamic plug-ins on VAX.
+
+2. With the system() function, the status for DCL commands are not being
+   returned.
+
+3. Need gawk to accept logical names GNV$AWKPATH, GNV$AWKLIB, and
+   GNV$AWK_LIBARARY in addtion to the unprefixed names.  This will allow
+   system wide default values to be set by an installation kit.
+
+4. Need to fix the gawk.cld file to not require a parameter for the options
+   that do not use the parameter.
diff --git a/gawk-5.0.1/README_d/README.aix b/gawk-5.0.1/README_d/README.aix
new file mode 100644
index 00000000000..eb686fe63d5
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.aix
@@ -0,0 +1,9 @@
+Mon Oct 31 21:54:05 IST 2016
+============================
+
+To compile gawk 4.1.4 correctly with IBM's xlc compiler, you need to
+use the -qalias=noansi command line option. Otherwise the compiler
+makes incorrect optimizations and the resulting binary core dumps
+on many tests.
+
+Thanks to Tony Reix (tony.reix@atos.net) for the info.
diff --git a/gawk-5.0.1/README_d/README.alpine b/gawk-5.0.1/README_d/README.alpine
new file mode 100644
index 00000000000..17f4214c2f1
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.alpine
@@ -0,0 +1,20 @@
+Fri Sep  7 10:34:54 IDT 2018
+============================
+
+I have a report that Alpine Linux uses BusyBox for its utilities. In
+particular, the BusyBox ls does not have a -f option. This option is
+needed in at least one of the tests.
+
+Install coreutils on your Alpine Linux system:
+
+	apk add coreutils
+
+in order to get a fully POSIX-compliant ls.
+
+Similarly, 'make diffout' fails because BusyBox diff doesn't accept
+the -c option.  To get a working diff, use:
+
+	apk add diffutils
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/README_d/README.bootstrap b/gawk-5.0.1/README_d/README.bootstrap
new file mode 100644
index 00000000000..152bbefaa3a
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.bootstrap
@@ -0,0 +1,32 @@
+Tue Dec  6 21:33:19 IST 2011
+============================
+
+As documented in the mail below, if you are using a system without any
+version of awk installed, you will have bootstrapping problems (i.e., running
+configure).  The solution is to install mawk or Brian Kernighan's awk
+first.
+
+Arnold Robbins
+------------------------------------
+From: Simon Josefsson <simon@josefsson.org>
+To: bug-gawk@gnu.org
+Date: Sat, 19 Nov 2011 15:24:22 +0100
+Message-ID: <87r514faw9.fsf@latte.josefsson.org>
+Subject: [bug-gawk] building gawk requires an awk?
+
+Hello,
+
+I was not able to build gawk 4.0.0 on a GNU/Hurd machine that didn't
+have any awk, the ./configure script failed at the end:
+
+config.status: creating Makefile
+./config.status: line 1169: awk: command not found
+config.status: error: could not create Makefile
+
+Is this a known bootstrapping issue?  Same happened for 3.1.8.  I looked
+in README but didn't find anything obvious.
+
+Btw, building 'mawk' first and then gawk 4.0.0 works.  Running self
+checks didn't work because there is no 'cmp' on the system either...
+
+/Simon
diff --git a/gawk-5.0.1/README_d/README.cmake b/gawk-5.0.1/README_d/README.cmake
new file mode 100644
index 00000000000..7a61aed4bf9
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.cmake
@@ -0,0 +1,100 @@
+CMake is a build automation system
+  http://en.wikipedia.org/wiki/Cmake
+
+We try to use it as a replacement for the established GNU build system.
+This attempt is currently only experimental. If you wonder why anyone
+should do this, read
+
+  Why the KDE project switched to CMake -- and how 
+  http://lwn.net/Articles/188693/
+  Escape from GNU Autohell!
+  http://www.shlomifish.org/open-source/anti/autohell
+
+- How can I get GNU Awk compiled with CMake as fast as possible ?
+  git clone git://git.savannah.gnu.org/gawk.git
+  cd gawk
+  git checkout cmake
+  mkdir build
+  cd build
+  cmake ..
+  make
+  ./gawk --version
+  make test
+Notice that this git-checkout allows you to read the source code,
+track the cmake branch and get updates. You will not be able to
+commit anything.
+
+- How can I use git to contribute source code ?
+You need an account at Savannah. Read this to understand the first steps:
+  http://savannah.gnu.org/maintenance/UsingGit
+  README.git
+Use your account there to register your public ssh key at Savannah.
+Then you are ready to checkout. Remember that (when cloning) you are
+setting up your own local repository and make sure you configure it
+properly.
+  git clone ssh://my_account_name@git.sv.gnu.org/srv/git/gawk.git
+  git config --global user.name "first-name last-name"
+  git config --global user.email First.Last@email.com
+  git config --global color.ui auto
+
+- What is the current status of the cmake branch ?
+It has just begun, pre-alpha, unclear if it will ever be taken up
+by the maintainer. We want to study if using CMake with such a
+basic tool like gawk is feasible and if it easier to use than
+the GNU build system.
+
+- Where can I find a tutorial on CMake basics ?
+Use the "official tutorial":
+  http://www.cmake.org/cmake/help/cmake_tutorial.html
+
+- Where is the reference of all commands and variables ?
+Depending on the CMake version you use, select one of these:
+  http://www.cmake.org/cmake/help/v2.8.10/cmake.html
+
+- How can I cross-compile ?
+Proceed in the same way as explained above for native compilation,
+but use a different build directory. When using CMake, do this:
+  cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain_mingw32.cmake ..
+Write a new Toolchain file for your cross-compiler and use it.
+
+- How can I build an installable file ?
+By default, installable files will not be generated.
+But if you instruct CMake about the kind of installable file you want,
+then some kinds of files can be generated.
+The exact kind of installable file depends on your operating system.
+Possible kinds are TGZ (.tar.gz file), RPM (.rpm file), and DEB (.deb file).
+   cmake -DCPACK_GENERATOR=DEB ..
+   make package
+
+- Can I build an executable that runs on any Win32 platform ?
+Yes, there are two ways of doing this.
+In both cases you need a MinGW compiler and the NSIS package builder
+installed on the host that shall do the build.
+  http://sourceforge.net/projects/mingw
+  http://sourceforge.net/projects/nsis
+When installed properly, the NSIS tool can even build an installer file
+(a single .exe file that unpacks, registers and installs the gawk executable
+and several other files).
+1. way: native build on a Win32 platform 
+   http://www.cmake.org/cmake/help/runningcmake.html
+   After clicking "Configure" select the MinGW option with the default native compiler
+   In the build directory, the command "mingw32-make" will build the gawk.exe
+   The command "mingw32-make package" will build installer file
+2. way: build with cross-compiler on a Linux platform like Ubuntu 12.04 LTS
+   Proceed as describe above for cross-compilers.
+   The command "make ; make package" will build gawk.exe and the installer file
+
+- How can I run test cases ?
+You can run all the test cases that are defined in test/Makefile.am.
+These test case scripts were not changed, but the way they are invoked has
+been adapted to CMake habits.
+See http://cmake.org/Wiki/CMake/Testing_With_CTest#Simple_Testing
+  cmake ..
+  make
+  make test          # run all test cases
+  ctest -N           # list all test cases but don't run them
+  ctest -R BASIC     # run all test cases belonging to group BASIC
+  ctest -R MPFR      # run all test cases belonging to group MPFR
+  ctest -E SHLIB.filefunc # run all tests, except the SHLIB.filefunc test case
+Remember that running test cases is possible only after a native build.
+
diff --git a/gawk-5.0.1/README_d/README.freebsd b/gawk-5.0.1/README_d/README.freebsd
new file mode 100644
index 00000000000..650d07ab3f5
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.freebsd
@@ -0,0 +1,17 @@
+Sun Aug 13 21:23:00 IDT 2017
+============================
+
+According to a report from Eric Pruitt <eric.pruitt@gmail.com>:
+
+| When running ./configure for GAWK 4.1.4, the mktime(3) function is not
+| detected on FreeBSD 11 when using -static with CFLAGS and LDFLAGS. This
+| causes the build to fail.
+
+Paul Eggert says that using:
+
+	./configure ac_cv_func_working_mktime=yes
+
+will cause gawk to use the FreeBSD mktime.
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/README_d/README.gcc-3 b/gawk-5.0.1/README_d/README.gcc-3
new file mode 100644
index 00000000000..c76a9af7e10
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.gcc-3
@@ -0,0 +1,11 @@
+Wed Apr  2 21:29:17 IDT 2014
+============================
+
+I have had a report that on a GNU/Linux system using gcc 3.3.6 (32 bit)
+that the aasort test fails.  Compiling without -O builds a gawk that
+does pass all tests.
+
+Caveat Emptor.
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/README_d/README.hacking b/gawk-5.0.1/README_d/README.hacking
new file mode 100644
index 00000000000..d179488c155
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.hacking
@@ -0,0 +1,9 @@
+* Use one of the following macros to access the value of a numeric NODE:
+	Macro                   Returned C type
+	---------------------------------------
+	get_number_ui(n)        unsigned long
+	get_number_si(n)        long
+	get_number_d(n)		double	
+	get_number_uj(n)	uintmax_t
+
+* Use iszero(n) to test if a numeric NODE is zero.
diff --git a/gawk-5.0.1/README_d/README.macosx b/gawk-5.0.1/README_d/README.macosx
new file mode 100644
index 00000000000..b46f01281a7
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.macosx
@@ -0,0 +1,44 @@
+Fri Feb 23 10:38:05 IST 2018
+============================
+
+On PowerPC Macintosh, things are just weird.
+
+* Using the stock compiler, you can't build gawk (c99 mode) against MPFR;
+there is an issue with duplicate inline functions from GMP.  By default,
+I have disabled this compilation.
+
+* If you build GCC 4.2.4 and use that version of GCC, you can compile gawk
+with MPFR and the C99 settings.  But then the two readfile tests fail.
+The call to read(2) simply returns zero. I have no idea why.
+
+Since nobody but me has one of these left, I'm not going to mess
+with it anymore right now.
+
+Thu Jan 25 20:07:56 IST 2018
+============================
+
+You may need to explicitly tell configure where to find the GNU gettext
+header file and library with --with-libintl-prefix=...'. Otherwise,
+the nlstringtest test will fail.
+
+Mon Apr 13 09:49:40 IDT 2015
+============================
+
+I have reports of success on this compiler:
+
+$ gcc --version
+Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr 
+--with-gxx-include-dir=/usr/include/c++/4.2.1
+Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn)
+Target: x86_64-apple-darwin14.1.0
+Thread model: posix
+
+Thu Apr  9 10:39:26 IDT 2015
+============================
+
+There are reports of compilation issues on Mac OS X 10.10 (Yosemite).
+The only compiler reported to have produced a complete pass of
+"make check" is the MacPorts compiler, /opt/local/bin/clang-mp-3.5.
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/README_d/README.mpfr b/gawk-5.0.1/README_d/README.mpfr
new file mode 100644
index 00000000000..e16828d03d2
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.mpfr
@@ -0,0 +1,55 @@
+-------------------------- DJGPP -----------------------------------
+
+2017-11-13
+==========
+The DJGPP port of Gawk has been compiled and tested using the
+following combinations of MPFR and GMP versions on FreeDOS and
+other versions of the DOS operating system:
+GNU MPFR 3.1.6, GNU MP 6.1.2
+
+Precompiled binaries of GMP and MPFR for DJGPP are available
+from DJ Delorie's ftp server and mirrors:
+
+    http://www.delorie.com/pub/djgpp/current/v2gnu/gmp612b.zip
+    http://www.delorie.com/pub/djgpp/current/v2gnu/mpfr316b.zip
+
+No previous versions of these libraries are supported.
+Newer versions should work.
+
+------------------------- Mac OS X on PPC -------------------------------
+
+Sat Mar 17 07:32:01 CDT 2012
+=============================
+
+The MPFR and GMP versions known to work for Mac OS X on PPC:
+GNU MPFR 3.1.0, GNU MP 4.3.1
+
+Wed Nov 15 21:57:29 IST 2017
+============================
+
+As of gawk 4.2, MPFR is no longer supported on Mac OS X on PPC.
+Gawk switched to C99, and the last PPC version doesn't play well
+with C99.
+
+------------------------ Windows MinGW ----------------------------
+
+Precompiled binaries for GMP and MPFR in Windows may be available
+from here:
+
+    http://sourceforge.net/projects/ezwinports/files/
+
+or here:
+
+    http://sourceforge.net/projects/mingw/files/MinGW/Base/mpfr/
+    http://sourceforge.net/projects/mingw/files/MinGW/Base/gmp/
+
+You should try to use libraries downloaded from the same site
+to avoid possible incompatibilities.
+
+------------------------- GNU/Linux --------------------------------
+
+Gawk has been compiled and tested using the following combinations
+of MPFR and GMP versions on GNU/Linux:
+GNU MPFR 2.4.2, GNU MP 4.3.2
+GNU MPFR 3.1.0, GNU MP 5.0.2, 5.0.3
+GNU MPFR 3.1.4, GNU MP 6.1.0
diff --git a/gawk-5.0.1/README_d/README.multibyte b/gawk-5.0.1/README_d/README.multibyte
new file mode 100644
index 00000000000..135ba86fe1d
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.multibyte
@@ -0,0 +1,29 @@
+Fri Jun  3 12:20:17 IDT 2005
+============================
+
+As noted in the NEWS file, as of 3.1.5, gawk uses character values instead
+of byte values for `index', `length', `substr' and `match'.  This works
+in multibyte and unicode locales.
+
+Wed Jun 18 16:47:31 IDT 2003
+============================
+
+Multibyte locales can cause occasional weirdness, in particular with
+ranges inside brackets: /[....]/.  Something that works great for ASCII
+will choke for, e.g., en_US.UTF-8.  One such program is test/gsubtst5.awk.
+
+By default, the test suite runs with LC_ALL=C and LANG=C. You
+can change this by doing (from a Bourne-style shell):
+
+	$ GAWKLOCALE=some_locale make check
+
+Then the test suite will set LC_ALL and LANG to the given locale.
+
+As of this writing, this works for en_US.UTF-8, and all tests
+pass except gsubtst5.
+
+For the normal case of RS = "\n", the locale is largely irrelevant.
+For other single byte record separators, using LC_ALL=C will give you
+much better performance when reading records.  Otherwise, gawk has to
+make several function calls, *per input character* to find the record
+terminator.  You have been warned.
diff --git a/gawk-5.0.1/README_d/README.os2 b/gawk-5.0.1/README_d/README.os2
new file mode 100644
index 00000000000..c12f82dbf5a
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.os2
@@ -0,0 +1,57 @@
+From andreas.buening@nexgo.de  Thu Oct 19 15:34:16 2017
+Date: Thu, 19 Oct 2017 23:34:09 +0200 (CEST)
+From: =?UTF-8?Q?Andreas_B=C3=BCning?= <andreas.buening@nexgo.de>
+To: arnold@skeeve.com
+Message-ID: <1433289104.12656.1508448849820@mail.vodafone.de>
+Subject: Re: gawk for OS/2 - any updates?
+
+Hello Arnold,
+
+I'd like to inform you about the current state of compiling gawk on
+OS/2:
+
+1. Compilation
+
+Running ./configure does work but
+
+- I tried only running with --disable-nls, so with NLS I didn't test.
+- Depending on the gcc version you use you may get linker errors. In
+  that case add 'CFLAGS=-O2 -g -fgnu89-inline' to the configure options
+  (-O2 -g already is the default).
+
+
+2. Tests
+
+It is possible to run the built-in checks but many test results depend
+on the shell being used. I recommend to use 'make -i check' to run
+the tests because some failures might cause a immediate termination
+of the make run.
+
+- If your shell uses \r\n linebreaks (in that case all tests fail)
+  then you have to run 'make -i check CMP=diff' to ignore the linebreak
+  differences at the test result comparison.
+- Depending on the shell some tests might just hang forever. Press
+  Ctrl+C and/or Ctrl+Break until the tests continue.
+- OS/2 can only load DLLs with filenames up to 8+3 bytes but gawk
+  creates three internal DLLs with longer names (e.g. filefuncs.dll,
+  revoutput.dll, revtwoway.dll). Thus, all tests trying to load
+  filefuncs.dll or the other two DLLs will fail. This is not a bug
+  of gawk. If you change e.g. the '@load filefuncs' directive to
+  '@load filefunc' in the according *.awk file then the tests will
+  succeed.
+- The number of failling tests is currently around 50, less if your
+  shell uses \r\n linebreaks, more otherwise.
+
+Best wishes,
+
+Andreas Buening
+======================================================
+
+Sat Oct 21 21:01:49 IDT 2017
+============================
+
+Fixes for loading extension libraries have since been included
+in the git repo and will be part of 4.2.1.
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/README_d/README.pc b/gawk-5.0.1/README_d/README.pc
new file mode 100644
index 00000000000..eb9e8fe1efa
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.pc
@@ -0,0 +1,141 @@
+This is the README for GNU awk 4 under Windows32, OS/2, and DOS.
+
+    Gawk has been compiled and tested under OS/2, DOS, and Windows32 using
+the GNU development tools from DJ Delorie (DJGPP; DOS with special
+support for long filenames on Windows), Eberhard Mattes (EMX; OS/2,
+DOS, and Windows32 with rsxnt), and Jan-Jaap van der Heijden and Mumit Khan
+(Mingw32; Windows32).
+
+    The Cygwin environment (http://cygwin.com) may also be used
+to compile and run gawk under Windows.  For Cygwin, building and
+installation is the same as under Unix:
+
+	tar -xvpzf gawk-4.2.x.tar.gz
+	cd gawk-4.2.x
+	./configure && make
+
+The `configure' step takes a long time, but works otherwise.
+
+******************************** N O T E *******************************
+* The `|&' operator only works when gawk is compiled for Cygwin or for *
+* MinGW.  Neither socket support nor two-way pipes work in any other   *
+* Windows environment!                                                 *
+************************************************************************
+
+Building gawk
+-------------
+
+Copy the files in the `pc' directory (EXCEPT for `ChangeLog') to the
+directory with the rest of the gawk sources.  (The subdirectories of 
+`pc' need not be copied.)  The Makefile contains a configuration 
+section with comments, and may need to be edited in order to work
+with your make utility.  If you are building with MinGW, copy the
+file Makefile.ext to extension/Makefile.
+
+The "prefix" line in the Makefile is used during the install of gawk
+(and in building igawk.bat and igawk.cmd). Since the libraries for
+gawk will be installed under $(prefix)/lib/awk (e.g., /gnu/lib/awk),
+it is convenient to have this directory in DEFPATH of config.h. 
+
+The makefile contains a number of targets for building various DOS and
+OS/2 versions.  A list of targets will be printed if the make command is
+given without a target.  As an example, to build gawk using the djgpp
+tools, enter "make djgpp".
+
+For the MinGW build, after you build in the top-level directory, chdir
+to the extension subdirectory and say "make" there to build the
+extensions.  If you built gawk without libmpfr, say this instead to
+build the extensions:
+
+  make MPFR= MPFR_LIBS=
+
+
+Testing and installing gawk
+---------------------------
+
+The command "make test" (and possibly "make install") requires several 
+Unix-like tools, including an sh-like shell, sed, cp, and cmp.  Only 
+dmake and GNU make are known to work on "make test".
+
+There are two methods for the install: Method 1 uses a typical Unix-like 
+approach and requires cat, cp, mkdir, sed, and sh; method 2 uses gawk 
+and batch files. See the configuration section of the makefile.
+
+The file test/Makefile may need some editing (especially for DOS). A
+sample makefile with comments appears in pc/Makefile.tst, and can be
+used to modify test/Makefile for your platform.  For starters, just
+copy pc/Makefile.tst to test/Makefile, then walk through the variables
+defined at the beginning and change them as appropriate for your
+setup.  In addition, some files in the test directory may need to have
+their end-of-line markers converted, as described in Makefile.tst.
+One change you will have to make for testing the MinGW port using the
+MSYS Bash is to set SLASH to //.
+
+On MinGW, testing Gawk built with MPFR support should report 26 tests
+failed, and if your ls.exe doesn't produce inode numbers consistent
+with the readdir extension, you should see 29 failures.  If you see
+more failures, you should investigate the reasons.
+
+As with building gawk, the OS, shell, and long filename issues come into
+play when testing, too.  If you are testing gawk on a LFN aware system with
+some LFN aware tools, you may have problems if the shell that you specify in
+test/Makefile is not LFN aware.  This problem will apply whether or not
+you are building a LFN aware gawk.  See the comments in pc/Makefile.tst
+for more information on this.
+
+It is routine to install by hand, but note that the install target also
+builds igawk.bat and igawk.cmd, which are used to add an include
+facility to gawk (and which require sh).
+
+
+Gawk thanks
+-----------
+
+The DOS maintainers wish to express their thanks to Eli Zaretskii
+<eliz@gnu.org> for his work and for the many conversations concerning
+gawk, make, and djgpp.  His FAQ for djgpp is essential reading, and he
+was always willing to answer our questions (even when we didn't read
+the relevant portions of the FAQ :).
+
+We are indebted to Juan Grigera <juan@biophnet.unlp.edu.ar> for
+additional help on changes for Windows32.
+
+
+----
+If you have any problems with the DOS or OS/2 versions of Gawk, 
+please send bug reports (along with the version and compiler used) to 
+
+   Juan Manuel Guerrero, juan.guerrero@gmx.de (DJGPP)
+
+or
+
+   andreas.buening@nexgo.de (OS/2 version)
+
+Support for Windows32 started in gawk-3.0.3.
+
+----
+From: Eric Pement <eric.pement@gmail.com>
+Newsgroups: comp.lang.awk
+Subject: djgpp Gawk ver. 4.0 available
+Date: Tue, 26 Jul 2011 06:42:00 -0700 (PDT)
+MS Windows users:
+
+The DJGPP compilation of GNU awk v4.0.0 is now available here:
+
+   ftp://ftp.delorie.com/pub/djgpp/current/v2gnu/gwk400b.zip
+
+For those who don't know the difference between the DGJPP compile and
+other versions compiled for Windows, the most noticeable to me is that
+it supports Unix-style use of 'single' and "double" quoting. Example:
+
+ [c:\tmp]> :: normal Windows awk requires complex quoting
+ [c:\tmp]> gawk "BEGIN{ print \"hello, world\" }"
+ hello, world
+ [c:\tmp]> :: DJGPP compile of awk permits Unix quoting in CMD
+ [c:\tmp]> djgawk 'BEGIN{ print "hello, world" }'
+ hello, world
+
+Syntactic sugar? Sure. But it makes life easier in a Windows
+environment, and without installing Cygwin ...
+
+Eric P.
diff --git a/gawk-5.0.1/README_d/README.rpm b/gawk-5.0.1/README_d/README.rpm
new file mode 100644
index 00000000000..4b2831fd6a1
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.rpm
@@ -0,0 +1,16 @@
+Tue Oct 10 20:58:29 IDT 2017
+============================
+
+If you're interested in the RPM .spec file for gawk from the
+Fedora project, you can find it at:
+
+	https://src.fedoraproject.org/rpms/gawk/blob/master/f/gawk.spec
+
+This is very Fedora-specific; it would need work before it could
+used in a more generic fashion, but it might be useful as a
+starting point.
+
+Thanks to David Kaspar [Dee'Kej] <dkaspar@redhat.com> for the pointer.
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/README_d/README.solaris b/gawk-5.0.1/README_d/README.solaris
new file mode 100644
index 00000000000..91e0c70110c
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.solaris
@@ -0,0 +1,14 @@
+Wed Jan 22 21:51:59 IST 2014
+============================
+
+On Solaris 10 x86, Solaris 11 x86, Solaris 10 sparc and Solaris 11 sparc,
+with the Sun compiler (Solaris Studio 12.3) you need to use
+
+	c99 -Xc -D_XPG6
+
+to correctly compile gawk and the extensions.
+
+Various tests can fail if the necessary locales aren't installed.
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/README_d/README.tests b/gawk-5.0.1/README_d/README.tests
new file mode 100644
index 00000000000..4b3d74b4275
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.tests
@@ -0,0 +1,45 @@
+Date: Sat, 22 Apr 2000 06:07:06 -0600 (MDT)
+From: "Nelson H. F. Beebe" <beebe@math.utah.edu>
+Cc: beebe@math.utah.edu, sysstaff@math.utah.edu, othmer@math.utah.edu
+Subject: gawk-3.0.4 and a GNU/Linux gotcha
+
+Yesterday, I was assisting a colleague install some software on his
+GNU/Linux machine for which uname -r reports 2.2.14.
+
+A (mis)feature of this system, which I've never encountered before,
+broke the build of one of my programs, and also of gawk-3.0.4.
+
+Namely, the kernel will not execute anything that resides in /tmp,
+though it will if the same script is in /usr/tmp!
+
+% cat /tmp/foo.sh
+#! /bin/sh
+echo hello
+
+ls -l /tmp/foo.sh
+-rwxr-xr-x   1 othmer   math           22 Apr 21 10:34 /tmp/foo.sh*
+
+% /tmp/foo.sh
+bash: /tmp/foo.sh: Permission denied
+
+% cp /tmp/foo.sh /usr/tmp
+
+% /usr/tmp/foo.sh
+hello
+
+Thus, programs that do a temporary install in /tmp, as some of mine do
+in order to run the validation suite, will fail.
+
+gawk-3.0.4, and likely other gawk versions, hits this problem too. It
+fails because test/poundbang starts with
+
+#! /tmp/gawk -f
+
+I tracked down where it comes from:
+
+% grep /tmp /etc/fstab
+/dev/hda3 /tmp ext2 rw,nosuid,noexec,nouser,auto,async,nodev 1 1
+                              !!!!!!
+
+Since this is done via a mount command, potentially ANY directory tree
+could be mounted with noexec.
diff --git a/gawk-5.0.1/README_d/README.zLinux b/gawk-5.0.1/README_d/README.zLinux
new file mode 100644
index 00000000000..e9dbcb60aa7
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.zLinux
@@ -0,0 +1,16 @@
+Mon Jan 25 18:45:06 IST 2016
+============================
+
+For z/Linux (CentOS 4, at least), you must fix the optimization level
+before compiling:
+
+1. Run configure.
+2. Edit the top-level Makefile and extension/Makefile and change -O2 to -O1.
+3. Run `make && make check' as usual.
+
+If you don't change the optimization level, the testext test will fail.
+
+In any case, expect the fmtspcl test to fail.
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/README_d/README.zos b/gawk-5.0.1/README_d/README.zos
new file mode 100644
index 00000000000..361a8ae6d51
--- /dev/null
+++ b/gawk-5.0.1/README_d/README.zos
@@ -0,0 +1,45 @@
+Fri Dec 24 10:58:16 2010
+Dave Pitts <dpitts@cozx.com>
+----------------------------
+
+GAWK on z/OS
+
+1. To unpack the tarball:
+
+   $ gunzip -c gawk-4.0.0.tar.gz | pax -rv from=ISO8859-1,to=IBM-1047
+
+   This will extract the files and convert them from ASCII to EBCDIC.
+
+   If you do not have the gunzip program on your system you can perform
+   the operation on another system and copy the tar file to z/OS. Then
+   unpack as follows:
+
+   $ pax -rv from=ISO8859-1,to=IBM-1047 -f gawk-4.0.0.tar
+
+
+2. To Build
+
+   $ ./configure CC=c89
+   $ make
+
+   You will get compilation warnings of the form:
+
+   WARNING CBC3343 ./dfa.c:332   Redeclaration of dfasyntax differs from
+   previous declaration on line 404 of "./dfa.h".
+
+   Because the IBM compiler complains when a function is decalared using
+   prototypes in the header and is defined without prototypes in the code
+   these warnings can be ignored.
+
+
+3. To Install:
+
+   $ make install
+
+
+4. To Test (optional):
+
+   $ make check
+
+   NOTE: Since the test suite was defined for an ASCII and IEEE floating point
+   environment several of the tests will fail under z/OS.
diff --git a/gawk-5.0.1/TODO b/gawk-5.0.1/TODO
new file mode 100644
index 00000000000..cf414170a60
--- /dev/null
+++ b/gawk-5.0.1/TODO
@@ -0,0 +1,152 @@
+Sun Feb 17 21:33:46 IST 2019
+============================
+
+There were too many files tracking different thoughts and ideas for
+things to do, or consider doing.  This file merges them into one. As
+tasks are completed, they should be removed.
+
+This file should exist only in the master branch or branches based off
+of it for development, but not in the stable branch. This may require some
+careful work with Git.
+
+TODO
+====
+
+Minor Cleanups and Code Improvements
+------------------------------------
+
+	API:
+		??? #if !defined(GAWK) && !defined(GAWK_OMIT_CONVENIENCE_MACROS)
+
+	?? Add debugger commands to reference card
+
+	Look at function order within files.
+
+	Consider removing use of and/or need for the protos.h file.
+
+	Fully synchronize whitespace tests (for \s, \S in Unicode
+	environment) with those of GNU grep.
+
+	See if something like  b = a "" can be optimized to not do
+	a concatenation, but instead just set STRCUR on a.
+
+	Review all conditional warnings to see if they should be made
+	into calls to lintwarn. The advantage is that that --lint=fatal
+	would then make such warnings exit gawk, along with regular
+	lint warnings.
+
+Minor New Features
+------------------
+
+	Enable command line source text in the debugger.
+
+	Enhance extension/fork.c waitpid to allow the caller to specify
+	the options.  And add an optional array argument to wait and
+	waitpid in which to return exit status information.
+
+	Consider relaxing the strictness of --posix.
+
+	Enhance --lint=invalid to apply in more places.
+
+	? Add an optional base to strtonum, allowing 2-36.
+
+	? Optional third argument for index indicating where to start the
+	search.
+
+Major New Features
+------------------
+
+	Think about how to generalize indirect access. Manuel Collado
+	suggests things like
+
+		foo = 5
+		@"foo" += 4
+
+	Also needed:
+
+		Indirect through array elements, not just scalar variables
+
+	Add ability to do decimal arithmetic.
+
+	Rework management of array index storage. (Partially DONE.)
+
+	Consider using an atom table for all string array indices.
+
+	DBM storage of awk arrays. Try to allow multiple dbm packages.
+
+	?? A RECLEN variable for fixed-length record input. PROCINFO["RS"]
+	would be "RS" or "RECLEN" depending upon what's in use.
+	*** Could this be done as an extension?
+
+	?? Use a new or improved dfa and/or regex library.
+
+	Rewrite in C++.
+
+Things To Think About That May Never Happen
+-------------------------------------------
+
+	Consider making shadowed variables a warning and not
+	a fatal warning when --lint=fatal.
+
+	Similar for extra parameters in a function call.
+
+	Look at code coverage tools, like S2E: https://s2e.epfl.ch/
+	
+	Try running with diehard. See http://www.diehard-software.org,
+	https://github.com/emeryberger/DieHard
+
+	Include a sample rpm spec file in a new packaging subdirectory.
+	(Really needed?)
+
+	Patch lexer for @include and @load to make quotes optional.
+	(Really needed?)
+
+	Add a lint check if the return value of a function is used but
+	the function did not supply a value.
+
+	Consider making gawk output +nan for NaN values so that it
+	will accept its own output as input.
+		NOTE: Investigated this.  GLIBC formats NaN as '-nan'
+		and -NaN as 'nan'.  Dealing with this is not simple.
+
+	Review the bash source script for working with shared libraries in
+	order to nuke the use of libtool. [ Partially started in the
+	dead-branches/nolibtool branch. ]
+
+Things That We Decided We Will Never Do
+=======================================
+
+	Consider moving var_value info into Node_var itself to reduce
+	memory usage. This would break all uses of get_lhs in the
+	code. It's too sweeping a change.
+
+	Add macros for working with flags instead of using & and |
+	directly.
+
+	FIX regular field splitting to use FPAT algorithm.
+		Note: Looked at this. Not sure it's with the trouble:
+		If it ain't broke...
+
+	Scope IDs for IPv6 addresses
+
+	Gnulib
+
+	Make FIELDWIDTHS be an array?
+
+	"Do an optimization pass over parse tree?"
+	This isn't relevant now that we are using a byte code engine.
+
+	"Consider integrating Fred Fish's DBUG library into gawk."
+	I did this once as an experiment. But I don't see a lot of value
+	to this at this stage of the development. Stepping through things
+	in a debugger is generally enough. Also, I would have to try to
+	track down the latest version of this.
+
+	"Make 	awk '/foo/' files...	run at egrep speeds" (How?)
+	This has been on the list since the early days (gawk 1.x or early
+	2.x).  But I am not sure how to really do this, nor have I done
+	timings, nor does there seem to be any real demand for this.
+
+	Change from dlopen to using the libltdl library (i.e. lt_dlopen).
+	This may support more platforms.  If we move off of libtool
+	then this is the wrong direction.
diff --git a/gawk-5.0.1/aclocal.m4 b/gawk-5.0.1/aclocal.m4
new file mode 100644
index 00000000000..f5474e4d90c
--- /dev/null
+++ b/gawk-5.0.1/aclocal.m4
@@ -0,0 +1,1154 @@
+# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.16.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  AS_CASE([$CONFIG_FILES],
+          [*\'*], [eval set x "$CONFIG_FILES"],
+          [*], [set x $CONFIG_FILES])
+  shift
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
+  do
+    # Strip MF so we end up with the name of the file.
+    am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`AS_DIRNAME(["$am_mf"])`
+    am_filepart=`AS_BASENAME(["$am_mf"])`
+    AM_RUN_LOG([cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles]) || am_rc=$?
+  done
+  if test $am_rc -ne 0; then
+    AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).])
+  fi
+  AS_UNSET([am_dirpart])
+  AS_UNSET([am_filepart])
+  AS_UNSET([am_mf])
+  AS_UNSET([am_rc])
+  rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES([CC])],
+		  [m4_define([AC_PROG_CC],
+			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES([CXX])],
+		  [m4_define([AC_PROG_CXX],
+			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES([OBJC])],
+		  [m4_define([AC_PROG_OBJC],
+			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+		  [_AM_DEPENDENCIES([OBJCXX])],
+		  [m4_define([AC_PROG_OBJCXX],
+			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+	@echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+  AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+      ['0:this is the am__doit target'],
+      [AS_CASE([$s],
+          [BSD], [am__include='.include' am__quote='"'],
+          [am__include='include' am__quote=''])])
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/arch.m4])
+m4_include([m4/codeset.m4])
+m4_include([m4/gettext.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/intlmacosx.m4])
+m4_include([m4/lcmessage.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/libsigsegv.m4])
+m4_include([m4/longlong.m4])
+m4_include([m4/mpfr.m4])
+m4_include([m4/nls.m4])
+m4_include([m4/noreturn.m4])
+m4_include([m4/po.m4])
+m4_include([m4/progtest.m4])
+m4_include([m4/readline.m4])
+m4_include([m4/socket.m4])
+m4_include([m4/ulonglong.m4])
diff --git a/gawk-5.0.1/array.c b/gawk-5.0.1/array.c
new file mode 100644
index 00000000000..43f84717c5d
--- /dev/null
+++ b/gawk-5.0.1/array.c
@@ -0,0 +1,1370 @@
+/*
+ * array.c - routines for awk arrays.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2014, 2016, 2018, 2019,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+extern FILE *output_fp;
+extern NODE **fmt_list;          /* declared in eval.c */
+
+NODE *success_node;
+
+static size_t SUBSEPlen;
+static char *SUBSEP;
+static char indent_char[] = "    ";
+
+static NODE **null_lookup(NODE *symbol, NODE *subs);
+static NODE **null_dump(NODE *symbol, NODE *subs);
+static const array_funcs_t null_array_func = {
+	"null",
+	(afunc_t) 0,
+	(afunc_t) 0,
+	null_lookup,
+	null_afunc,
+	null_afunc,
+	null_afunc,
+	null_afunc,
+	null_afunc,
+	null_dump,
+	(afunc_t) 0,
+};
+
+#define MAX_ATYPE 10
+
+static const array_funcs_t *array_types[MAX_ATYPE];
+static int num_array_types = 0;
+
+/* register_array_func --- add routines to handle arrays */
+
+static int
+register_array_func(const array_funcs_t *afunc)
+{
+	if (afunc && num_array_types < MAX_ATYPE) {
+		if (afunc != & str_array_func && afunc->type_of == NULL)
+			return false;
+		array_types[num_array_types++] = afunc;
+		if (afunc->init)	/* execute init routine if any */
+			(void) (*afunc->init)(NULL, NULL);
+		return true;
+	}
+	return false;
+}
+
+
+/* array_init --- register all builtin array types */
+
+void
+array_init()
+{
+	(void) register_array_func(& str_array_func);	/* the default */
+	if (! do_mpfr) {
+		(void) register_array_func(& int_array_func);
+		(void) register_array_func(& cint_array_func);
+	}
+}
+
+
+/* make_array --- create an array node */
+
+NODE *
+make_array()
+{
+	NODE *array;
+	getnode(array);
+	memset(array, '\0', sizeof(NODE));
+	array->type = Node_var_array;
+	array->array_funcs = & null_array_func;
+	/* vname, flags, and parent_array not set here */
+
+	return array;
+}
+
+
+/* null_array --- force symbol to be an empty typeless array */
+
+void
+null_array(NODE *symbol)
+{
+	symbol->type = Node_var_array;
+	symbol->array_funcs = & null_array_func;
+	symbol->buckets = NULL;
+	symbol->table_size = symbol->array_size = 0;
+	symbol->array_capacity = 0;
+	symbol->flags = 0;
+
+	assert(symbol->xarray == NULL);
+
+	/* vname, parent_array not (re)initialized */
+}
+
+
+/* null_lookup --- assign type to an empty array. */
+
+static NODE **
+null_lookup(NODE *symbol, NODE *subs)
+{
+	int i;
+	const array_funcs_t *afunc = NULL;
+
+	assert(symbol->table_size == 0);
+
+	/*
+	 * Check which array type wants to accept this sub; traverse
+	 * array type list in reverse order.
+	 */
+	for (i = num_array_types - 1; i >= 1; i--) {
+		afunc = array_types[i];
+		if (afunc->type_of(symbol, subs) != NULL)
+			break;
+	}
+	if (i == 0 || afunc == NULL)
+		afunc = array_types[0];	/* default is str_array_func */
+	symbol->array_funcs = afunc;
+
+	/* We have the right type of array; install the subscript */
+	return symbol->alookup(symbol, subs);
+}
+
+
+/* null_afunc --- default function for array interface */
+
+NODE **
+null_afunc(NODE *symbol ATTRIBUTE_UNUSED, NODE *subs ATTRIBUTE_UNUSED)
+{
+	return NULL;
+}
+
+/* null_dump --- dump function for an empty array */
+
+static NODE **
+null_dump(NODE *symbol, NODE *subs ATTRIBUTE_UNUSED)
+{
+	fprintf(output_fp, "array `%s' is empty\n", array_vname(symbol));
+	return NULL;
+}
+
+
+/* assoc_copy --- duplicate input array "symbol" */
+
+NODE *
+assoc_copy(NODE *symbol, NODE *newsymb)
+{
+	assert(newsymb->vname != NULL);
+
+	assoc_clear(newsymb);
+	(void) symbol->acopy(symbol, newsymb);
+	newsymb->array_funcs = symbol->array_funcs;
+	newsymb->flags = symbol->flags;
+	return newsymb;
+}
+
+
+/* assoc_dump --- dump array */
+
+void
+assoc_dump(NODE *symbol, NODE *ndump)
+{
+	if (symbol->adump)
+		(void) symbol->adump(symbol, ndump);
+}
+
+
+/* make_aname --- construct a 'vname' for a (sub)array */
+
+const char *
+make_aname(const NODE *symbol)
+{
+	static char *aname = NULL;
+	static size_t alen;
+	static size_t max_alen;
+#define SLEN 256
+
+	if (symbol->parent_array != NULL) {
+		size_t slen;
+
+		(void) make_aname(symbol->parent_array);
+		slen = strlen(symbol->vname);	/* subscript in parent array */
+		if (alen + slen + 4 > max_alen) {		/* sizeof("[\"\"]") = 4 */
+			max_alen = alen + slen + 4 + SLEN;
+			erealloc(aname, char *, (max_alen + 1) * sizeof(char *), "make_aname");
+		}
+		alen += sprintf(aname + alen, "[\"%s\"]", symbol->vname);
+	} else {
+		alen = strlen(symbol->vname);
+		if (aname == NULL) {
+			max_alen = alen + SLEN;
+			emalloc(aname, char *, (max_alen + 1) * sizeof(char *), "make_aname");
+		} else if (alen > max_alen) {
+			max_alen = alen + SLEN;
+			erealloc(aname, char *, (max_alen + 1) * sizeof(char *), "make_aname");
+		}
+		memcpy(aname, symbol->vname, alen + 1);
+	}
+	return aname;
+}
+#undef SLEN
+
+
+/*
+ * array_vname --- print the name of the array
+ *
+ * Returns a pointer to a statically maintained dynamically allocated string.
+ * It's appropriate for printing the name once; if the caller wants
+ * to save it, they have to make a copy.
+ */
+
+const char *
+array_vname(const NODE *symbol)
+{
+	static char *message = NULL;
+	static size_t msglen = 0;
+	char *s;
+	size_t len;
+	int n;
+	const NODE *save_symbol = symbol;
+	const char *from = _("from %s");
+	const char *aname;
+
+	if (symbol->type != Node_array_ref
+			|| symbol->orig_array->type != Node_var_array
+	) {
+		if (symbol->type != Node_var_array || symbol->parent_array == NULL)
+			return symbol->vname;
+		return make_aname(symbol);
+	}
+
+	/* First, we have to compute the length of the string: */
+
+	len = 2; /* " (" */
+	n = 0;
+	while (symbol->type == Node_array_ref) {
+		len += strlen(symbol->vname);
+		n++;
+		symbol = symbol->prev_array;
+	}
+
+	/* Get the (sub)array name */
+	if (symbol->parent_array == NULL)
+		aname = symbol->vname;
+	else
+		aname = make_aname(symbol);
+	len += strlen(aname);
+	/*
+	 * Each node contributes by strlen(from) minus the length
+	 * of "%s" in the translation (which is at least 2)
+	 * plus 2 for ", " or ")\0"; this adds up to strlen(from).
+	 */
+	len += n * strlen(from);
+
+	/* (Re)allocate memory: */
+	if (message == NULL) {
+		emalloc(message, char *, len, "array_vname");
+		msglen = len;
+	} else if (len > msglen) {
+		erealloc(message, char *, len, "array_vname");
+		msglen = len;
+	} /* else
+		current buffer can hold new name */
+
+	/* We're ready to print: */
+	symbol = save_symbol;
+	s = message;
+	/*
+	 * Ancient systems have sprintf() returning char *, not int.
+	 * If you have one of those, use sprintf(..); s += strlen(s) instead.
+	 */
+
+	s += sprintf(s, "%s (", symbol->vname);
+	for (;;) {
+		symbol = symbol->prev_array;
+		if (symbol->type != Node_array_ref)
+			break;
+		s += sprintf(s, from, symbol->vname);
+		s += sprintf(s, ", ");
+	}
+	s += sprintf(s, from, aname);
+	strcpy(s, ")");
+
+	return message;
+}
+
+
+/*
+ *  force_array --- proceed to the actual Node_var_array,
+ *	change Node_var_new to an array.
+ *	If canfatal and type isn't good, die fatally,
+ *	otherwise return the final actual value.
+ */
+
+NODE *
+force_array(NODE *symbol, bool canfatal)
+{
+	NODE *save_symbol = symbol;
+	bool isparam = false;
+
+	if (symbol->type == Node_param_list) {
+		save_symbol = symbol = GET_PARAM(symbol->param_cnt);
+		isparam = true;
+		if (symbol->type == Node_array_ref)
+			symbol = symbol->orig_array;
+	}
+
+	switch (symbol->type) {
+	case Node_var_new:
+		symbol->xarray = NULL;	/* make sure union is as it should be */
+		null_array(symbol);
+		symbol->parent_array = NULL;	/* main array has no parent */
+		/* fall through */
+	case Node_var_array:
+		break;
+
+	case Node_array_ref:
+	default:
+		/* notably Node_var but catches also e.g. a[1] = "x"; a[1][1] = "y" */
+		if (canfatal) {
+			if (symbol->type == Node_val)
+				fatal(_("attempt to use a scalar value as array"));
+			if (isparam)
+				fatal(_("attempt to use scalar parameter `%s' as an array"),
+					save_symbol->vname);
+			else
+				fatal(_("attempt to use scalar `%s' as an array"),
+					save_symbol->vname);
+		} else
+			break;
+	}
+
+	return symbol;
+}
+
+
+/* set_SUBSEP --- update SUBSEP related variables when SUBSEP assigned to */
+
+void
+set_SUBSEP()
+{
+	SUBSEP_node->var_value = force_string(SUBSEP_node->var_value);
+	SUBSEP = SUBSEP_node->var_value->stptr;
+	SUBSEPlen = SUBSEP_node->var_value->stlen;
+}
+
+
+/* concat_exp --- concatenate expression list into a single string */
+
+NODE *
+concat_exp(int nargs, bool do_subsep)
+{
+	/* do_subsep is false for Op_concat */
+	NODE *r;
+	char *str;
+	char *s;
+	size_t len;
+	size_t subseplen = 0;
+	int i;
+	extern NODE **args_array;
+
+	if (nargs == 1)
+		return POP_STRING();
+
+	if (do_subsep)
+		subseplen = SUBSEPlen;
+
+	len = 0;
+	for (i = 1; i <= nargs; i++) {
+		r = TOP();
+		if (r->type == Node_var_array) {
+			while (--i > 0)
+				DEREF(args_array[i]);	/* avoid memory leak */
+			fatal(_("attempt to use array `%s' in a scalar context"), array_vname(r));
+		}
+		r = POP_STRING();
+		args_array[i] = r;
+		len += r->stlen;
+	}
+	len += (nargs - 1) * subseplen;
+
+	emalloc(str, char *, len + 1, "concat_exp");
+
+	r = args_array[nargs];
+	memcpy(str, r->stptr, r->stlen);
+	s = str + r->stlen;
+	DEREF(r);
+	for (i = nargs - 1; i > 0; i--) {
+		if (subseplen == 1)
+			*s++ = *SUBSEP;
+		else if (subseplen > 0) {
+			memcpy(s, SUBSEP, subseplen);
+			s += subseplen;
+		}
+		r = args_array[i];
+		memcpy(s, r->stptr, r->stlen);
+		s += r->stlen;
+		DEREF(r);
+	}
+
+	return make_str_node(str, len, ALREADY_MALLOCED);
+}
+
+
+/*
+ * adjust_fcall_stack: remove subarray(s) of symbol[] from
+ *	function call stack.
+ */
+
+static void
+adjust_fcall_stack(NODE *symbol, int nsubs)
+{
+	NODE *func, *r, *n;
+	NODE **sp;
+	int pcount;
+
+	/*
+	 * Solve the nasty problem of disappearing subarray arguments:
+	 *
+	 *  function f(c, d) { delete c; .. use non-existent array d .. }
+	 *  BEGIN { a[0][0] = 1; f(a, a[0]); .. }
+	 *
+	 * The fix is to convert 'd' to a local empty array; This has
+	 * to be done before clearing the parent array to avoid referring to
+	 * already free-ed memory.
+	 *
+	 * Similar situations exist for builtins accepting more than
+	 * one array argument: split, patsplit, asort and asorti. For example:
+	 *
+	 *  BEGIN { a[0][0] = 1; split("abc", a, "", a[0]) }
+	 *
+	 * These cases do not involve the function call stack, and are
+	 * handled individually in their respective routines.
+	 */
+
+	func = frame_ptr->func_node;
+	if (func == NULL)	/* in main */
+		return;
+	pcount = func->param_cnt;
+	sp = frame_ptr->stack;
+
+	for (; pcount > 0; pcount--) {
+		r = *sp++;
+		if (r->type != Node_array_ref
+				|| r->orig_array->type != Node_var_array)
+			continue;
+		n = r->orig_array;
+
+		/* Case 1 */
+		if (n == symbol
+			&& symbol->parent_array != NULL
+			&& nsubs > 0
+		) {
+			/*
+			 * 'symbol' is a subarray, and 'r' is the same subarray:
+			 *
+			 *   function f(c, d) { delete c[0]; .. }
+			 *   BEGIN { a[0][0] = 1; f(a, a[0]); .. }
+			 *
+			 * But excludes cases like (nsubs = 0):
+			 *
+			 *   function f(c, d) { delete c; ..}
+			 *   BEGIN { a[0][0] = 1; f(a[0], a[0]); ...}
+			 */
+
+			null_array(r);
+			r->parent_array = NULL;
+			continue;
+		}
+
+		/* Case 2 */
+		for (n = n->parent_array; n != NULL; n = n->parent_array) {
+			assert(n->type == Node_var_array);
+			if (n == symbol) {
+				/*
+				 * 'r' is a subarray of 'symbol':
+				 *
+				 *    function f(c, d) { delete c; .. use d as array .. }
+				 *    BEGIN { a[0][0] = 1; f(a, a[0]); .. }
+				 *	OR
+				 *    BEGIN { a[0][0][0][0] = 1; f(a[0], a[0][0][0]); .. }
+				 *
+				 */
+				null_array(r);
+				r->parent_array = NULL;
+				break;
+			}
+		}
+	}
+}
+
+
+/* do_delete --- perform `delete array[s]' */
+
+/*
+ * `symbol' is array
+ * `nsubs' is no of subscripts
+ */
+
+void
+do_delete(NODE *symbol, int nsubs)
+{
+	NODE *val, *subs;
+	int i;
+
+	assert(symbol->type == Node_var_array);
+	subs = val = NULL;	/* silence the compiler */
+
+	/*
+	 * The force_string() call is needed to make sure that
+	 * the string subscript is reasonable.  For example, with it:
+	 *
+	 * $ ./gawk --posix 'BEGIN { CONVFMT="%ld"; delete a[1.233]}'
+	 * gawk: cmd. line:1: fatal: `%l' is not permitted in POSIX awk formats
+	 *
+	 * Without it, the code does not fail.
+	 */
+
+#define free_subs(n)    do {                                    \
+    NODE *s = PEEK(n - 1);                                      \
+    if (s->type == Node_val) {                                  \
+        (void) force_string(s);	/* may have side effects. */    \
+        DEREF(s);                                               \
+    }                                                           \
+} while (--n > 0)
+
+	if (nsubs == 0) {
+		/* delete array */
+
+		adjust_fcall_stack(symbol, 0);	/* fix function call stack; See above. */
+		assoc_clear(symbol);
+		return;
+	}
+
+	/* NB: subscripts are in reverse order on stack */
+
+	for (i = nsubs; i > 0; i--) {
+		subs = PEEK(i - 1);
+		if (subs->type != Node_val) {
+			free_subs(i);
+			fatal(_("attempt to use array `%s' in a scalar context"), array_vname(subs));
+		}
+
+		val = in_array(symbol, subs);
+		if (val == NULL) {
+			if (do_lint) {
+				subs = force_string(subs);
+				lintwarn(_("delete: index `%.*s' not in array `%s'"),
+					(int) subs->stlen, subs->stptr, array_vname(symbol));
+			}
+			/* avoid memory leak, free all subs */
+			free_subs(i);
+			return;
+		}
+
+		if (i > 1) {
+			if (val->type != Node_var_array) {
+				/* e.g.: a[1] = 1; delete a[1][1] */
+
+				free_subs(i);
+				subs = force_string(subs);
+				fatal(_("attempt to use scalar `%s[\"%.*s\"]' as an array"),
+					array_vname(symbol),
+					(int) subs->stlen,
+					subs->stptr);
+			}
+			symbol = val;
+			DEREF(subs);
+		}
+	}
+
+	if (val->type == Node_var_array) {
+		adjust_fcall_stack(val, nsubs);  /* fix function call stack; See above. */
+		assoc_clear(val);
+		/* cleared a sub-array, free Node_var_array */
+		efree(val->vname);
+		freenode(val);
+	} else
+		unref(val);
+
+	(void) assoc_remove(symbol, subs);
+	DEREF(subs);
+	if (assoc_empty(symbol))
+		/* last element was removed, so reset array type to null */
+		null_array(symbol);
+
+#undef free_subs
+}
+
+
+/* do_delete_loop --- simulate ``for (iggy in foo) delete foo[iggy]'' */
+
+/*
+ * The primary hassle here is that `iggy' needs to have some arbitrary
+ * array index put in it before we can clear the array, we can't
+ * just replace the loop with `delete foo'.
+ */
+
+void
+do_delete_loop(NODE *symbol, NODE **lhs)
+{
+	NODE **list;
+	NODE akind;
+
+	akind.flags = AINDEX|ADELETE;	/* need a single index */
+	list = symbol->alist(symbol, & akind);
+
+	if (assoc_empty(symbol))
+		return;
+
+	unref(*lhs);
+	*lhs = list[0];
+	efree(list);
+
+	/* blast the array in one shot */
+	adjust_fcall_stack(symbol, 0);
+	assoc_clear(symbol);
+}
+
+
+/* value_info --- print scalar node info */
+
+static void
+value_info(NODE *n)
+{
+
+#define PREC_NUM -1
+
+	if (n == Nnull_string || n == Null_field) {
+		fprintf(output_fp, "<(null)>");
+		return;
+	}
+
+	if ((n->flags & (STRING|STRCUR)) != 0) {
+		fprintf(output_fp, "<");
+		fprintf(output_fp, "\"%.*s\"", (int) n->stlen, n->stptr);
+		if ((n->flags & (NUMBER|NUMCUR)) != 0) {
+#ifdef HAVE_MPFR
+			if (is_mpg_float(n))
+				fprintf(output_fp, ":%s",
+					mpg_fmt("%.*R*g", PREC_NUM, ROUND_MODE, n->mpg_numbr));
+			else if (is_mpg_integer(n))
+				fprintf(output_fp, ":%s", mpg_fmt("%Zd", n->mpg_i));
+			else
+#endif
+			fprintf(output_fp, ":%.*g", PREC_NUM, n->numbr);
+		}
+		fprintf(output_fp, ">");
+	} else {
+#ifdef HAVE_MPFR
+		if (is_mpg_float(n))
+			fprintf(output_fp, "<%s>",
+				mpg_fmt("%.*R*g", PREC_NUM, ROUND_MODE, n->mpg_numbr));
+		else if (is_mpg_integer(n))
+			fprintf(output_fp, "<%s>", mpg_fmt("%Zd", n->mpg_i));
+		else
+#endif
+		fprintf(output_fp, "<%.*g>", PREC_NUM, n->numbr);
+	}
+
+	fprintf(output_fp, ":%s", flags2str(n->flags));
+
+	if ((n->flags & MALLOC) != 0)
+		fprintf(output_fp, ":%ld", n->valref);
+	else
+		fprintf(output_fp, ":");
+
+	if ((n->flags & (STRING|STRCUR)) == STRCUR) {
+		size_t len;
+
+		fprintf(output_fp, "][");
+		fprintf(output_fp, "stfmt=%d, ", n->stfmt);
+		/*
+		 * If not STFMT_UNUSED, could be CONVFMT or OFMT if last
+		 * used in a print statement. If immutable, could be that it
+		 * was originally set as a string, or it's a number that has
+		 * an integer value.
+		 */
+		len = fmt_list[n->stfmt]->stlen;
+		fmt_list[n->stfmt]->stptr[len] = '\0';
+		fprintf(output_fp, "FMT=\"%s\"",
+					n->stfmt == STFMT_UNUSED ? "<unused>"
+					: fmt_list[n->stfmt]->stptr);
+#ifdef HAVE_MPFR
+		fprintf(output_fp, ", RNDMODE=\"%c\"", n->strndmode);
+#endif
+	}
+
+#undef PREC_NUM
+}
+
+
+void
+indent(int indent_level)
+{
+	int i;
+	for (i = 0; i < indent_level; i++)
+		fprintf(output_fp, "%s", indent_char);
+}
+
+/* assoc_info --- print index, value info */
+
+void
+assoc_info(NODE *subs, NODE *val, NODE *ndump, const char *aname)
+{
+	int indent_level = ndump->alevel;
+
+	indent_level++;
+	indent(indent_level);
+	fprintf(output_fp, "I: [%s:", aname);
+	if ((subs->flags & (MPFN|MPZN|INTIND)) == INTIND)
+		fprintf(output_fp, "<%ld>", (long) subs->numbr);
+	else
+		value_info(subs);
+	fprintf(output_fp, "]\n");
+
+	indent(indent_level);
+	if (val->type == Node_val) {
+		fprintf(output_fp, "V: [scalar: ");
+		value_info(val);
+	} else {
+		fprintf(output_fp, "V: [");
+		ndump->alevel++;
+		ndump->adepth--;
+		assoc_dump(val, ndump);
+		ndump->adepth++;
+		ndump->alevel--;
+		indent(indent_level);
+	}
+	fprintf(output_fp, "]\n");
+}
+
+
+/* do_adump --- dump an array: interface to assoc_dump */
+
+NODE *
+do_adump(int nargs)
+{
+	NODE *symbol, *tmp;
+	static NODE ndump;
+	long depth = 0;
+
+	/*
+	 * depth < 0, no index and value info.
+	 *       = 0, main array index and value info; does not descend into sub-arrays.
+	 *       > 0, descends into 'depth' sub-arrays, and prints index and value info.
+	 */
+
+	if (nargs == 2) {
+		tmp = POP_NUMBER();
+		depth = get_number_si(tmp);
+		DEREF(tmp);
+	}
+	symbol = POP_PARAM();
+	if (symbol->type != Node_var_array)
+		fatal(_("adump: first argument not an array"));
+
+	ndump.type = Node_dump_array;
+	ndump.adepth = depth;
+	ndump.alevel = 0;
+	assoc_dump(symbol, & ndump);
+	return make_number((AWKNUM) 0);
+}
+
+
+/* asort_actual --- do the actual work to sort the input array */
+
+static NODE *
+asort_actual(int nargs, sort_context_t ctxt)
+{
+	NODE *array, *dest = NULL, *result;
+	NODE *r, *subs, *s;
+	NODE **list = NULL, **ptr;
+	unsigned long num_elems, i;
+	const char *sort_str;
+	char save;
+
+	if (nargs == 3)  /* 3rd optional arg */
+		s = POP_STRING();
+	else
+		s = dupnode(Nnull_string);	/* "" => default sorting */
+
+	s = force_string(s);
+	sort_str = s->stptr;
+	save = s->stptr[s->stlen];
+	s->stptr[s->stlen] = '\0';
+	if (s->stlen == 0) {		/* default sorting */
+		if (ctxt == ASORT)
+			sort_str = "@val_type_asc";
+		else
+			sort_str = "@ind_str_asc";
+	}
+
+	if (nargs >= 2) {  /* 2nd optional arg */
+		dest = POP_PARAM();
+		if (dest->type != Node_var_array) {
+			fatal(ctxt == ASORT ?
+				_("asort: second argument not an array") :
+				_("asorti: second argument not an array"));
+		}
+	}
+
+	array = POP_PARAM();
+	if (array->type != Node_var_array) {
+		fatal(ctxt == ASORT ?
+			_("asort: first argument not an array") :
+			_("asorti: first argument not an array"));
+	}
+
+	if (dest != NULL) {
+		for (r = dest->parent_array; r != NULL; r = r->parent_array) {
+			if (r == array)
+				fatal(ctxt == ASORT ?
+					_("asort: cannot use a subarray of first arg for second arg") :
+					_("asorti: cannot use a subarray of first arg for second arg"));
+		}
+		for (r = array->parent_array; r != NULL; r = r->parent_array) {
+			if (r == dest)
+				fatal(ctxt == ASORT ?
+					_("asort: cannot use a subarray of second arg for first arg") :
+					_("asorti: cannot use a subarray of second arg for first arg"));
+		}
+	}
+
+	/* sorting happens inside assoc_list */
+	list = assoc_list(array, sort_str, ctxt);
+	s->stptr[s->stlen] = save;
+	DEREF(s);
+
+	num_elems = assoc_length(array);
+	if (num_elems == 0 || list == NULL) {
+ 		/* source array is empty */
+ 		if (dest != NULL && dest != array)
+ 			assoc_clear(dest);
+		if (list != NULL)
+			efree(list);
+ 		return make_number((AWKNUM) 0);
+ 	}
+
+	/*
+	 * Must not assoc_clear() the source array before constructing
+	 * the output array. assoc_list() does not duplicate array values
+	 * which are needed for asort().
+	 */
+
+	if (dest != NULL && dest != array) {
+		assoc_clear(dest);
+		result = dest;
+	} else {
+		/* use 'result' as a temporary destination array */
+		result = make_array();
+		result->vname = array->vname;
+		result->parent_array = array->parent_array;
+	}
+
+	if (ctxt == ASORTI) {
+		/* We want the indices of the source array. */
+
+		for (i = 1, ptr = list; i <= num_elems; i++, ptr += 2) {
+			subs = make_number(i);
+			assoc_set(result, subs, *ptr);
+		}
+	} else {
+		/* We want the values of the source array. */
+
+		for (i = 1, ptr = list; i <= num_elems; i++) {
+			subs = make_number(i);
+
+			/* free index node */
+			r = *ptr++;
+			unref(r);
+
+			/* value node */
+			r = *ptr++;
+
+			NODE *value;
+
+			if (r->type == Node_val)
+				value = dupnode(r);
+			else {
+				NODE *arr;
+				arr = make_array();
+				subs = force_string(subs);
+				arr->vname = subs->stptr;
+				arr->vname[subs->stlen] = '\0';
+				subs->stptr = NULL;
+				subs->flags &= ~STRCUR;
+				arr->parent_array = array; /* actual parent, not the temporary one. */
+
+				value = assoc_copy(r, arr);
+			}
+			assoc_set(result, subs, value);
+		}
+	}
+
+	efree(list);
+
+	if (result != dest) {
+		/* dest == NULL or dest == array */
+		assoc_clear(array);
+		*array = *result;	/* copy result into array */
+		freenode(result);
+	} /* else
+		result == dest
+		dest != NULL and dest != array */
+
+	return make_number((AWKNUM) num_elems);
+}
+
+/* do_asort --- sort array by value */
+
+NODE *
+do_asort(int nargs)
+{
+	return asort_actual(nargs, ASORT);
+}
+
+/* do_asorti --- sort array by index */
+
+NODE *
+do_asorti(int nargs)
+{
+	return asort_actual(nargs, ASORTI);
+}
+
+
+/*
+ * cmp_strings --- compare two strings; logic similar to cmp_nodes() in eval.c
+ *	except the extra case-sensitive comparison when the case-insensitive
+ *	result is a match.
+ */
+
+static int
+cmp_strings(const NODE *n1, const NODE *n2)
+{
+	char *s1, *s2;
+	size_t len1, len2;
+	int ret;
+
+	s1 = n1->stptr;
+	len1 = n1->stlen;
+	s2 =  n2->stptr;
+	len2 = n2->stlen;
+
+	if (len1 == 0)
+		return len2 == 0 ? 0 : -1;
+	if (len2 == 0)
+		return 1;
+
+	/* len1 > 0 && len2 > 0 */
+	// make const to ensure it doesn't change if we
+	// need to call memcmp(), below
+	const size_t lmin = len1 < len2 ? len1 : len2;
+
+	if (IGNORECASE) {
+		const unsigned char *cp1 = (const unsigned char *) s1;
+		const unsigned char *cp2 = (const unsigned char *) s2;
+
+		if (gawk_mb_cur_max > 1) {
+			ret = strncasecmpmbs((const unsigned char *) cp1,
+					     (const unsigned char *) cp2, lmin);
+		} else {
+			size_t count = lmin;
+
+			for (ret = 0; count-- > 0 && ret == 0; cp1++, cp2++)
+				ret = casetable[*cp1] - casetable[*cp2];
+		}
+		if (ret != 0)
+			return ret;
+		/*
+		 * If case insensitive result is "they're the same",
+		 * use case sensitive comparison to force distinct order.
+		 */
+	}
+
+	ret = memcmp(s1, s2, lmin);
+	if (ret != 0 || len1 == len2)
+		return ret;
+	return (len1 < len2) ? -1 : 1;
+}
+
+/* sort_up_index_string --- qsort comparison function; ascending index strings. */
+
+static int
+sort_up_index_string(const void *p1, const void *p2)
+{
+	const NODE *t1, *t2;
+
+	/* Array indices are strings */
+	t1 = *((const NODE *const *) p1);
+	t2 = *((const NODE *const *) p2);
+	return cmp_strings(t1, t2);
+}
+
+
+/* sort_down_index_str --- qsort comparison function; descending index strings. */
+
+static int
+sort_down_index_string(const void *p1, const void *p2)
+{
+	/*
+	 * Negation versus transposed arguments:  when all keys are
+	 * distinct, as with array indices here, either method will
+	 * transform an ascending sort into a descending one.  But if
+	 * there are equal keys--such as when IGNORECASE is honored--
+	 * that get disambiguated into a determisitc order, negation
+	 * will reverse those but transposed arguments would retain
+	 * their relative order within the rest of the reversed sort.
+	 */
+	return -sort_up_index_string(p1, p2);
+}
+
+
+/* sort_up_index_number --- qsort comparison function; ascending index numbers. */
+
+static int
+sort_up_index_number(const void *p1, const void *p2)
+{
+	const NODE *t1, *t2;
+	int ret;
+
+	t1 = *((const NODE *const *) p1);
+	t2 = *((const NODE *const *) p2);
+
+	ret = cmp_numbers(t1, t2);
+	if (ret != 0)
+		return ret;
+
+	/* break a tie with the index string itself */
+	t1 = force_string((NODE *) t1);
+	t2 = force_string((NODE *) t2);
+	return cmp_strings(t1, t2);
+}
+
+/* sort_down_index_number --- qsort comparison function; descending index numbers */
+
+static int
+sort_down_index_number(const void *p1, const void *p2)
+{
+	return -sort_up_index_number(p1, p2);
+}
+
+
+/* sort_up_value_string --- qsort comparison function; ascending value string */
+
+static int
+sort_up_value_string(const void *p1, const void *p2)
+{
+	const NODE *t1, *t2;
+
+	t1 = *((const NODE *const *) p1 + 1);
+	t2 = *((const NODE *const *) p2 + 1);
+
+	if (t1->type == Node_var_array) {
+		/* return 0 if t2 is a sub-array too, else return 1 */
+		return (t2->type != Node_var_array);
+	}
+	if (t2->type == Node_var_array)
+		return -1;		/* t1 (scalar) < t2 (sub-array) */
+
+	/* t1 and t2 both have string values */
+	return cmp_strings(t1, t2);
+}
+
+
+/* sort_down_value_string --- qsort comparison function; descending value string */
+
+static int
+sort_down_value_string(const void *p1, const void *p2)
+{
+	return -sort_up_value_string(p1, p2);
+}
+
+
+/* sort_up_value_number --- qsort comparison function; ascending value number */
+
+static int
+sort_up_value_number(const void *p1, const void *p2)
+{
+	NODE *t1, *t2;
+	int ret;
+
+	t1 = *((NODE *const *) p1 + 1);
+	t2 = *((NODE *const *) p2 + 1);
+
+	if (t1->type == Node_var_array) {
+		/* return 0 if t2 is a sub-array too, else return 1 */
+		return (t2->type != Node_var_array);
+	}
+	if (t2->type == Node_var_array)
+		return -1;		/* t1 (scalar) < t2 (sub-array) */
+
+	ret = cmp_numbers(t1, t2);
+	if (ret != 0)
+		return ret;
+
+	/*
+	 * Use string value to guarantee same sort order on all
+	 * versions of qsort().
+	 */
+	t1 = force_string(t1);
+	t2 = force_string(t2);
+	return cmp_strings(t1, t2);
+}
+
+
+/* sort_down_value_number --- qsort comparison function; descending value number */
+
+static int
+sort_down_value_number(const void *p1, const void *p2)
+{
+	return -sort_up_value_number(p1, p2);
+}
+
+
+/* sort_up_value_type --- qsort comparison function; ascending value type */
+
+static int
+sort_up_value_type(const void *p1, const void *p2)
+{
+	NODE *n1, *n2;
+
+	/* we want to compare the element values */
+	n1 = *((NODE *const *) p1 + 1);
+	n2 = *((NODE *const *) p2 + 1);
+
+	/* 1. Arrays vs. scalar, scalar is less than array */
+	if (n1->type == Node_var_array) {
+		/* return 0 if n2 is a sub-array too, else return 1 */
+		return (n2->type != Node_var_array);
+	}
+	if (n2->type == Node_var_array) {
+		return -1;		/* n1 (scalar) < n2 (sub-array) */
+	}
+
+	/* two scalars */
+	(void) fixtype(n1);
+	(void) fixtype(n2);
+
+	if ((n1->flags & NUMBER) != 0 && (n2->flags & NUMBER) != 0) {
+		return cmp_numbers(n1, n2);
+	}
+
+	/* 3. All numbers are less than all strings. This is aribitrary. */
+	if ((n1->flags & NUMBER) != 0 && (n2->flags & STRING) != 0) {
+		return -1;
+	} else if ((n1->flags & STRING) != 0 && (n2->flags & NUMBER) != 0) {
+		return 1;
+	}
+
+	/* 4. Two strings */
+	return cmp_strings(n1, n2);
+}
+
+/* sort_down_value_type --- qsort comparison function; descending value type */
+
+static int
+sort_down_value_type(const void *p1, const void *p2)
+{
+	return -sort_up_value_type(p1, p2);
+}
+
+/* sort_user_func --- user defined qsort comparison function */
+
+static int
+sort_user_func(const void *p1, const void *p2)
+{
+	NODE *idx1, *idx2, *val1, *val2, *r;
+	int ret;
+	INSTRUCTION *code;
+
+	idx1 = *((NODE *const *) p1);
+	idx2 = *((NODE *const *) p2);
+	val1 = *((NODE *const *) p1 + 1);
+	val2 = *((NODE *const *) p2 + 1);
+
+	code = TOP()->code_ptr;	/* comparison function call instructions */
+
+	/* setup 4 arguments to comp_func() */
+	UPREF(idx1);
+	PUSH(idx1);
+	if (val1->type == Node_val)
+		UPREF(val1);
+	PUSH(val1);
+
+	UPREF(idx2);
+	PUSH(idx2);
+	if (val2->type == Node_val)
+		UPREF(val2);
+	PUSH(val2);
+
+	/* execute the comparison function */
+	(void) (*interpret)(code);
+
+	/* return value of the comparison function */
+	r = POP_NUMBER();
+#ifdef HAVE_MPFR
+	/*
+	 * mpfr_sgn(mpz_sgn): Returns a positive value if op > 0,
+	 * zero if op = 0, and a negative value if op < 0.
+	 */
+	if (is_mpg_float(r))
+		ret = mpfr_sgn(r->mpg_numbr);
+	else if (is_mpg_integer(r))
+		ret = mpz_sgn(r->mpg_i);
+	else
+#endif
+		ret = (r->numbr < 0.0) ? -1 : (r->numbr > 0.0);
+	DEREF(r);
+	return ret;
+}
+
+
+/* assoc_list -- construct, and optionally sort, a list of array elements */
+
+NODE **
+assoc_list(NODE *symbol, const char *sort_str, sort_context_t sort_ctxt)
+{
+	typedef int (*qsort_compfunc)(const void *, const void *);
+
+	static const struct qsort_funcs {
+		const char *name;
+		qsort_compfunc comp_func;
+		assoc_kind_t kind;
+	} sort_funcs[] = {
+{ "@ind_str_asc",	sort_up_index_string,	AINDEX|AISTR|AASC },
+{ "@ind_num_asc",	sort_up_index_number,	AINDEX|AINUM|AASC },
+{ "@val_str_asc",	sort_up_value_string,	AVALUE|AVSTR|AASC },
+{ "@val_num_asc",	sort_up_value_number,	AVALUE|AVNUM|AASC },
+{ "@ind_str_desc",	sort_down_index_string,	AINDEX|AISTR|ADESC },
+{ "@ind_num_desc",	sort_down_index_number,	AINDEX|AINUM|ADESC },
+{ "@val_str_desc",	sort_down_value_string,	AVALUE|AVSTR|ADESC },
+{ "@val_num_desc",	sort_down_value_number,	AVALUE|AVNUM|ADESC },
+{ "@val_type_asc",	sort_up_value_type,	AVALUE|AASC },
+{ "@val_type_desc",	sort_down_value_type,	AVALUE|ADESC },
+{ "@unsorted",		0,			AINDEX },
+};
+
+	/*
+	 * N.B.: AASC and ADESC are hints to the specific array types.
+	 *	See cint_list() in cint_array.c.
+	 */
+
+	NODE **list;
+	NODE akind;
+	unsigned long num_elems, j;
+	int elem_size, qi;
+	qsort_compfunc cmp_func = 0;
+	INSTRUCTION *code = NULL;
+	extern int currule;
+	int save_rule = 0;
+	assoc_kind_t assoc_kind = ANONE;
+
+	elem_size = 1;
+
+	for (qi = 0, j = sizeof(sort_funcs)/sizeof(sort_funcs[0]); qi < j; qi++) {
+		if (strcmp(sort_funcs[qi].name, sort_str) == 0)
+			break;
+	}
+
+	if (qi < j) {
+		cmp_func = sort_funcs[qi].comp_func;
+		assoc_kind = sort_funcs[qi].kind;
+
+		if (symbol->array_funcs != & cint_array_func)
+			assoc_kind &= ~(AASC|ADESC);
+
+		if (sort_ctxt != SORTED_IN || (assoc_kind & AVALUE) != 0) {
+			/* need index and value pair in the list */
+
+			assoc_kind |= (AINDEX|AVALUE);
+			elem_size = 2;
+		}
+
+	} else {	/* unrecognized */
+		NODE *f;
+		const char *sp;
+
+		for (sp = sort_str; *sp != '\0' && ! isspace((unsigned char) *sp); sp++)
+			continue;
+
+		/* empty string or string with space(s) not valid as function name */
+		if (sp == sort_str || *sp != '\0')
+			fatal(_("`%s' is invalid as a function name"), sort_str);
+
+		f = lookup(sort_str);
+		if (f == NULL || f->type != Node_func)
+			fatal(_("sort comparison function `%s' is not defined"), sort_str);
+
+		cmp_func = sort_user_func;
+
+		/* need index and value pair in the list */
+		assoc_kind |= (AVALUE|AINDEX);
+		elem_size = 2;
+
+		/* make function call instructions */
+		code = bcalloc(Op_func_call, 2, 0);
+		code->func_body = f;
+		code->func_name = NULL;		/* not needed, func_body already assigned */
+		(code + 1)->expr_count = 4;	/* function takes 4 arguments */
+		code->nexti = bcalloc(Op_stop, 1, 0);
+
+		/*
+		 * make non-redirected getline, exit, `next' and `nextfile' fatal in
+		 * callback function by setting currule in interpret()
+		 * to undefined (0).
+		 */
+
+		save_rule = currule;	/* save current rule */
+		currule = 0;
+
+		PUSH_CODE(code);
+	}
+
+	akind.flags = (unsigned int) assoc_kind;	/* kludge */
+	list = symbol->alist(symbol, & akind);
+	assoc_kind = (assoc_kind_t) akind.flags;	/* symbol->alist can modify it */
+
+	/* check for empty list or unsorted, or list already sorted */
+	if (list != NULL && cmp_func != NULL && (assoc_kind & (AASC|ADESC)) == 0) {
+		num_elems = assoc_length(symbol);
+
+		qsort(list, num_elems, elem_size * sizeof(NODE *), cmp_func); /* shazzam! */
+
+		if (sort_ctxt == SORTED_IN && (assoc_kind & (AINDEX|AVALUE)) == (AINDEX|AVALUE)) {
+			/* relocate all index nodes to the first half of the list. */
+			for (j = 1; j < num_elems; j++)
+				list[j] = list[2 * j];
+
+			/* give back extra memory */
+
+			erealloc(list, NODE **, num_elems * sizeof(NODE *), "assoc_list");
+		}
+	}
+
+	if (cmp_func == sort_user_func) {
+		code = POP_CODE();
+		currule = save_rule;            /* restore current rule */
+		bcfree(code->nexti);            /* Op_stop */
+		bcfree(code);                   /* Op_func_call */
+	}
+
+	return list;
+}
diff --git a/gawk-5.0.1/awk.h b/gawk-5.0.1/awk.h
new file mode 100644
index 00000000000..363e4403f3e
--- /dev/null
+++ b/gawk-5.0.1/awk.h
@@ -0,0 +1,2077 @@
+/*
+ * awk.h -- Definitions for gawk.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2019 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/* ------------------------------ Includes ------------------------------ */
+
+/*
+ * config.h absolutely, positively, *M*U*S*T* be included before
+ * any system headers.  Otherwise, extreme death, destruction
+ * and loss of life results.
+ */
+#if defined(_TANDEM_SOURCE)
+/*
+ * config.h forces this even on non-tandem systems but it
+ * causes problems elsewhere if used in the check below.
+ * so workaround it. bleah.
+ */
+#define tandem_for_real	1
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined(tandem_for_real) && ! defined(_SCO_DS)
+#define _XOPEN_SOURCE_EXTENDED 1
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <limits.h>
+#include <ctype.h>
+#include <setjmp.h>
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#if ! (defined(HAVE_LIBINTL_H) && defined(ENABLE_NLS) && ENABLE_NLS > 0)
+#ifndef LOCALEDIR
+#define LOCALEDIR NULL
+#endif /* LOCALEDIR */
+#endif
+
+#if !defined(__SUNPRO_C)
+#if !defined(__STDC__) || __STDC__ < 1
+#error "gawk no longer supports non-C89 environments (no __STDC__ or __STDC__ < 1)"
+#endif
+#endif
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <signal.h>
+#include <time.h>
+#include <errno.h>
+#if ! defined(errno)
+extern int errno;
+#endif
+
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#endif	/* not STDC_HEADERS */
+
+
+/* We can handle multibyte strings.  */
+#include <wchar.h>
+#include <wctype.h>
+
+#include "mbsupport.h" /* defines stuff for DJGPP to fake MBS */
+
+#ifdef STDC_HEADERS
+#include <float.h>
+#endif
+
+#undef CHARBITS
+#undef INTBITS
+
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+/* ----------------- System dependencies (with more includes) -----------*/
+
+/* This section is the messiest one in the file, not a lot that can be done */
+
+#ifndef VMS
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+#else	/* VMS */
+#include <stddef.h>
+#include <stat.h>
+#include <file.h>	/* avoid <fcntl.h> in io.c */
+/* debug.c needs this; when _DECC_V4_SOURCE is defined (as it is
+   in our config.h [vms/vms-conf.h]), off_t won't get declared */
+# if !defined(__OFF_T) && !defined(_OFF_T)
+#  if defined(____OFF_T) || defined(___OFF_T)
+typedef __off_t off_t;	/* __off_t is either int or __int64 */
+#  else
+typedef int off_t;
+#  endif
+# endif
+#endif	/* VMS */
+
+#include "protos.h"
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#ifdef NEED_MEMORY_H
+#include <memory.h>
+#endif	/* NEED_MEMORY_H */
+#endif /* HAVE_STRING_H */
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif	/* HAVE_STRINGS_H */
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif	/* HAVE_UNISTD_H */
+
+#ifdef VMS
+#include <unixlib.h>
+#include "vms/redirect.h"
+#endif  /*VMS*/
+
+#ifndef O_BINARY
+#define O_BINARY	0
+#endif
+
+#ifndef HAVE_SETLOCALE
+#define setlocale(locale, val)	/* nothing */
+#endif /* HAVE_SETLOCALE */
+
+#if HAVE_MEMCPY_ULONG
+extern char *memcpy_ulong(char *dest, const char *src, unsigned long l);
+#define memcpy memcpy_ulong
+#endif
+#if HAVE_MEMSET_ULONG
+extern void *memset_ulong(void *dest, int val, unsigned long l);
+#define memset memset_ulong
+#endif
+
+#ifdef HAVE_FWRITE_UNLOCKED
+#define fwrite	fwrite_unlocked
+#endif /* HAVE_FWRITE_UNLOCKED */
+
+#if defined(__DJGPP__) || defined(__EMX__) || defined(__MINGW32__)
+#include "nonposix.h"
+#endif /* defined(__DJGPP__) || defined(__EMX__) || defined(__MINGW32__) */
+
+/* use this as lintwarn("...")
+   this is a hack but it gives us the right semantics */
+#define lintwarn (*(set_loc(__FILE__, __LINE__),lintfunc))
+/* same thing for warning */
+#define warning (*(set_loc(__FILE__, __LINE__),r_warning))
+
+#ifdef HAVE_MPFR
+#include <gmp.h>
+#include <mpfr.h>
+#ifndef MPFR_RNDN
+/* for compatibility with MPFR 2.X */
+#define MPFR_RNDN GMP_RNDN
+#define MPFR_RNDZ GMP_RNDZ
+#define MPFR_RNDU GMP_RNDU
+#define MPFR_RNDD GMP_RNDD
+#endif
+#endif
+
+#include "regex.h"
+#include "dfa.h"
+typedef struct Regexp {
+	struct re_pattern_buffer pat;
+	struct re_registers regs;
+	struct dfa *dfareg;
+	bool has_meta;		/* re has meta chars so (probably) isn't simple string */
+	bool maybe_long;	/* re has meta chars that can match long text */
+} Regexp;
+#define	RESTART(rp,s)	(rp)->regs.start[0]
+#define	REEND(rp,s)	(rp)->regs.end[0]
+#define	SUBPATSTART(rp,s,n)	(rp)->regs.start[n]
+#define	SUBPATEND(rp,s,n)	(rp)->regs.end[n]
+#define	NUMSUBPATS(rp,s)	(rp)->regs.num_regs
+
+/* regexp matching flags: */
+#define RE_NO_FLAGS	0	/* empty flags */
+#define RE_NEED_START	1	/* need to know start/end of match */
+#define RE_NO_BOL	2	/* not allowed to match ^ in regexp */
+
+#include "gawkapi.h"
+
+/* Stuff for losing systems. */
+#if !defined(HAVE_STRTOD)
+extern double gawk_strtod();
+#define strtod gawk_strtod
+#endif
+
+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(arg)
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+#define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif /* ATTRIBUTE_UNUSED */
+
+#ifndef ATTRIBUTE_NORETURN
+#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+#endif /* ATTRIBUTE_NORETURN */
+
+#ifndef ATTRIBUTE_PRINTF
+#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n)))
+#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2)
+#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3)
+#endif /* ATTRIBUTE_PRINTF */
+
+/* ------------------ Constants, Structures, Typedefs  ------------------ */
+
+#define AWKNUM	double
+
+enum defrule { BEGIN = 1, Rule, END, BEGINFILE, ENDFILE,
+	MAXRULE /* sentinel, not legal */ };
+extern const char *const ruletab[];
+
+
+typedef enum nodevals {
+	/* illegal entry == 0 */
+	Node_illegal,
+
+	Node_val,		/* node is a value - type in flags */
+	Node_regex,		/* a regexp, text, compiled, flags, etc */
+	Node_dynregex,		/* a dynamic regexp */
+
+	/* symbol table values */
+	Node_var,		/* scalar variable, lnode is value */
+	Node_var_array,		/* array is ptr to elements, table_size num of eles */
+	Node_var_new,		/* newly created variable, may become an array */
+	Node_param_list,	/* lnode is a variable, rnode is more list */
+	Node_func,		/* lnode is param. list, rnode is body */
+	Node_ext_func,		/* extension function, code_ptr is builtin code */
+	Node_builtin_func,	/* built-in function, main use is for FUNCTAB */
+
+	Node_array_ref,		/* array passed by ref as parameter */
+	Node_array_tree,	/* Hashed array tree (HAT) */
+	Node_array_leaf,	/* Linear 1-D array */
+	Node_dump_array,	/* array info */
+
+	/* program execution -- stack item types */
+	Node_arrayfor,
+	Node_frame,
+	Node_instruction,
+
+	Node_final		/* sentry value, not legal */
+} NODETYPE;
+
+struct exp_node;
+
+typedef union bucket_item {
+	struct {
+		union bucket_item *next;
+		char *str;
+		size_t len;
+		size_t code;
+		struct exp_node *name;
+		struct exp_node *val;
+	} hs;
+	struct {
+		union bucket_item *next;
+		long li[2];
+		struct exp_node *val[2];
+		size_t cnt;
+	} hi;
+} BUCKET;
+
+enum commenttype {
+	EOL_COMMENT = 1,
+	BLOCK_COMMENT,
+	FOR_COMMENT	// special case
+};
+
+/* string hash table */
+#define ahnext		hs.next
+#define	ahname		hs.name	/* a string index node */
+#define	ahname_str	hs.str	/* shallow copy; = ahname->stptr */
+#define	ahname_len	hs.len	/* = ahname->stlen */
+#define	ahvalue		hs.val
+#define	ahcode		hs.code
+
+/* integer hash table */
+#define	ainext		hi.next
+#define ainum		hi.li	/* integer indices */
+#define aivalue		hi.val
+#define aicount		hi.cnt
+
+struct exp_instruction;
+
+typedef int (*Func_print)(FILE *, const char *, ...);
+typedef struct exp_node **(*afunc_t)(struct exp_node *, struct exp_node *);
+typedef struct {
+	const char *name;
+	afunc_t init;
+	afunc_t type_of;	/* avoid reserved word typeof */
+	afunc_t lookup;
+	afunc_t exists;
+	afunc_t clear;
+	afunc_t remove;
+	afunc_t list;
+	afunc_t copy;
+	afunc_t dump;
+	afunc_t store;
+} array_funcs_t;
+
+/*
+ * NOTE - this struct is a rather kludgey -- it is packed to minimize
+ * space usage, at the expense of cleanliness.  Alter at own risk.
+ */
+typedef struct exp_node {
+	union {
+		struct {
+			union {
+				struct exp_node *lptr;
+				struct exp_instruction *li;
+				long ll;
+				const array_funcs_t *lp;
+			} l;
+			union {
+				struct exp_node *rptr;
+				Regexp *preg[2];
+				struct exp_node **av;
+				BUCKET **bv;
+				void (*uptr)(void);
+				struct exp_instruction *iptr;
+			} r;
+			union {
+				struct exp_node *extra;
+				void (*aptr)(void);
+				long xl;
+				void *cmnt;	// used by pretty printer
+			} x;
+			char *name;
+			size_t reserved;
+			struct exp_node *rn;
+			unsigned long cnt;
+			unsigned long reflags;
+#				define	CONSTANT	1
+#				define	FS_DFLT		2
+		} nodep;
+
+		struct {
+#ifdef HAVE_MPFR
+			union {
+				AWKNUM fltnum;
+				mpfr_t mpnum;
+				mpz_t mpi;
+			} nm;
+			int rndmode;
+#else
+			AWKNUM fltnum;
+#endif
+			char *sp;
+			size_t slen;
+			long sref;
+			int idx;
+			wchar_t *wsp;
+			size_t wslen;
+			struct exp_node *typre;
+			enum commenttype comtype;
+		} val;
+	} sub;
+	NODETYPE type;
+	unsigned int flags;
+
+/* type = Node_val */
+	/*
+	 * STRING and NUMBER are mutually exclusive, except for the special
+	 * case of an uninitialized value, represented internally by
+	 * Nnull_string. They represent the type of a value as assigned.
+	 * Nnull_string has both STRING and NUMBER attributes, but all other
+	 * scalar values should have precisely one of these bits set.
+	 *
+	 * STRCUR and NUMCUR are not mutually exclusive. They represent that
+	 * the particular type of value is up to date.  For example,
+	 *
+	 * 	a = 5		# NUMBER | NUMCUR
+	 * 	b = a ""	# Adds STRCUR to a, since a string value
+	 * 			# is now available. But the type hasn't changed!
+	 *
+	 * 	a = "42"	# STRING | STRCUR
+	 * 	b = a + 0	# Adds NUMCUR to a, since numeric value
+	 * 			# is now available. But the type hasn't changed!
+	 *
+	 * USER_INPUT is the joker.  When STRING|USER_INPUT is set, it means
+	 * "this is string data, but the user may have really wanted it to be a
+	 * number. If we have to guess, like in a comparison, turn it into a
+	 * number if the string is indeed numeric."
+	 * For example,    gawk -v a=42 ....
+	 * Here, `a' gets STRING|STRCUR|USER_INPUT and then when used where
+	 * a number is needed, it gets turned into a NUMBER and STRING
+	 * is cleared. In that case, we leave the USER_INPUT in place, so
+	 * the combination NUMBER|USER_INPUT means it is a strnum a.k.a. a
+	 * "numeric string".
+	 *
+	 * WSTRCUR is for efficiency. If in a multibyte locale, and we
+	 * need to do something character based (substr, length, etc.)
+	 * we create the corresponding wide character string and store it,
+	 * and add WSTRCUR to the flags so that we don't have to do the
+	 * conversion more than once.
+	 *
+	 * The NUMINT flag may be used with a value of any type -- NUMBER,
+	 * STRING, or STRNUM. It indicates that the string representation
+	 * equals the result of sprintf("%ld", <numeric value>). So, for
+	 * example, NUMINT should NOT be set if it's a strnum or string value
+	 * where the string is " 1" or "01" or "+1" or "1.0" or "0.1E1". This
+	 * is a hint to indicate that an integer array optimization may be
+	 * used when this value appears as a subscript.
+	 *
+	 * We hope that the rest of the flags are self-explanatory. :-)
+	 */
+#		define	MALLOC	0x0001       /* stptr can be free'd, i.e. not a field node pointing into a shared buffer */
+#		define	STRING	0x0002       /* assigned as string */
+#		define	STRCUR	0x0004       /* string value is current */
+#		define	NUMCUR	0x0008       /* numeric value is current */
+#		define	NUMBER	0x0010       /* assigned as number */
+#		define	USER_INPUT 0x0020    /* user input: if NUMERIC then
+		                              * a NUMBER */
+#		define	INTLSTR	0x0040       /* use localized version */
+#		define	NUMINT	0x0080       /* numeric value is an integer */
+#		define	INTIND	0x0100	     /* integral value is array index;
+		                              * lazy conversion to string.
+		                              */
+#		define	WSTRCUR	0x0200       /* wide str value is current */
+#		define	MPFN	0x0400       /* arbitrary-precision floating-point number */
+#		define	MPZN	0x0800       /* arbitrary-precision integer */
+#		define	NO_EXT_SET 0x1000    /* extension cannot set a value for this variable */
+#		define	NULL_FIELD 0x2000    /* this is the null field */
+
+/* type = Node_var_array */
+#		define	ARRAYMAXED	0x4000       /* array is at max size */
+#		define	HALFHAT		0x8000       /* half-capacity Hashed Array Tree;
+		                                      * See cint_array.c */
+#		define	XARRAY		0x10000
+#		define	NUMCONSTSTR	0x20000	/* have string value for numeric constant */
+#		define  REGEX           0x40000 /* this is a typed regex */
+} NODE;
+
+#define vname sub.nodep.name
+
+#define lnode	sub.nodep.l.lptr
+#define rnode	sub.nodep.r.rptr
+
+/* Node_param_list */
+#define param      vname
+#define dup_ent    sub.nodep.r.rptr
+
+/* Node_param_list, Node_func */
+#define param_cnt  sub.nodep.l.ll
+
+/* Node_func */
+#define fparms		sub.nodep.rn
+#define code_ptr    sub.nodep.r.iptr
+
+/* Node_regex, Node_dynregex */
+#define re_reg	sub.nodep.r.preg
+#define re_flags sub.nodep.reflags
+#define re_text lnode
+#define re_exp	sub.nodep.x.extra
+#define re_cnt	flags
+
+/* Node_val */
+/*
+ * Note that the string in stptr may not be NUL-terminated, but it is
+ * guaranteed to have at least one extra byte that may be temporarily set
+ * to '\0'. This is helpful when calling functions such as strtod that require
+ * a NUL-terminated argument. In particular, field values $n for n > 0 and
+ * n < NF will not have a NUL terminator, since they point into the $0 buffer.
+ * All other strings are NUL-terminated.
+ */
+#define stptr	sub.val.sp
+#define stlen	sub.val.slen
+#define valref	sub.val.sref
+#define stfmt	sub.val.idx
+#define strndmode sub.val.rndmode
+#define wstptr	sub.val.wsp
+#define wstlen	sub.val.wslen
+#ifdef HAVE_MPFR
+#define mpg_numbr	sub.val.nm.mpnum
+#define mpg_i		sub.val.nm.mpi
+#define numbr		sub.val.nm.fltnum
+#else
+#define numbr		sub.val.fltnum
+#endif
+#define typed_re	sub.val.typre
+
+/*
+ * If stfmt is set to STFMT_UNUSED, it means that the string representation
+ * stored in stptr is not a function of the value of CONVFMT or OFMT. That
+ * indicates that either the string value was explicitly assigned, or it
+ * was converted from a NUMBER that has an integer value. When stfmt is not
+ * set to STFMT_UNUSED, it is an offset into the fmt_list array of distinct
+ * CONVFMT and OFMT node pointers.
+ */
+#define STFMT_UNUSED	-1
+
+/* Node_arrayfor */
+#define for_list	sub.nodep.r.av
+#define for_list_size	sub.nodep.reflags
+#define cur_idx		sub.nodep.l.ll
+#define for_array 	sub.nodep.rn
+
+/* Node_frame: */
+#define stack        sub.nodep.r.av
+#define func_node    sub.nodep.x.extra
+#define prev_frame_size	sub.nodep.reflags
+#define reti         sub.nodep.l.li
+
+/* Node_var: */
+#define var_value    lnode
+#define var_update   sub.nodep.r.uptr
+#define var_assign   sub.nodep.x.aptr
+
+/* Node_var_array: */
+#define buckets		sub.nodep.r.bv
+#define nodes		sub.nodep.r.av
+#define array_funcs	sub.nodep.l.lp
+#define array_base	sub.nodep.l.ll
+#define table_size	sub.nodep.reflags
+#define array_size	sub.nodep.cnt
+#define array_capacity	sub.nodep.reserved
+#define xarray		sub.nodep.rn
+#define parent_array	sub.nodep.x.extra
+
+#define ainit		array_funcs->init
+#define atypeof		array_funcs->type_of
+#define alookup 	array_funcs->lookup
+#define aexists 	array_funcs->exists
+#define aclear		array_funcs->clear
+#define aremove		array_funcs->remove
+#define alist		array_funcs->list
+#define acopy		array_funcs->copy
+#define adump		array_funcs->dump
+#define astore		array_funcs->store
+
+/* Node_array_ref: */
+#define orig_array lnode
+#define prev_array rnode
+
+/* Node_array_print */
+#define adepth     sub.nodep.l.ll
+#define alevel     sub.nodep.x.xl
+
+/* Op_comment	*/
+#define comment_type	sub.val.comtype
+
+/* --------------------------------lint warning types----------------------------*/
+typedef enum lintvals {
+	LINT_illegal,
+	LINT_assign_in_cond,
+	LINT_no_effect
+} LINTTYPE;
+
+/* --------------------------------Instruction ---------------------------------- */
+
+typedef enum opcodeval {
+	Op_illegal = 0,		/* illegal entry */
+
+	/* binary operators */
+	Op_times,
+	Op_times_i,
+	Op_quotient,
+	Op_quotient_i,
+	Op_mod,
+	Op_mod_i,
+	Op_plus,
+	Op_plus_i,
+	Op_minus,
+	Op_minus_i,
+	Op_exp,
+	Op_exp_i,
+	Op_concat,
+
+	/* line range instruction pair */
+	Op_line_range,		/* flags for Op_cond_pair */
+	Op_cond_pair,		/* conditional pair */
+
+	Op_subscript,
+	Op_sub_array,
+
+	/* unary operators */
+	Op_preincrement,
+	Op_predecrement,
+	Op_postincrement,
+	Op_postdecrement,
+	Op_unary_minus,
+	Op_unary_plus,
+	Op_field_spec,
+
+	/* unary relationals */
+	Op_not,
+
+	/* assignments */
+	Op_assign,
+	Op_store_var,		/* simple variable assignment optimization */
+	Op_store_sub,		/* array[subscript] assignment optimization */
+	Op_store_field,  	/* $n assignment optimization */
+	Op_assign_times,
+	Op_assign_quotient,
+	Op_assign_mod,
+	Op_assign_plus,
+	Op_assign_minus,
+	Op_assign_exp,
+	Op_assign_concat,
+
+	/* boolean binaries */
+	Op_and,			/* a left subexpression in && */
+	Op_and_final,		/* right subexpression of && */
+	Op_or,
+	Op_or_final,
+
+	/* binary relationals */
+	Op_equal,
+	Op_notequal,
+	Op_less,
+	Op_greater,
+	Op_leq,
+	Op_geq,
+	Op_match,
+	Op_match_rec,		/* match $0 */
+	Op_nomatch,
+
+	Op_rule,
+
+	/* keywords */
+	Op_K_case,
+	Op_K_default,
+	Op_K_break,
+	Op_K_continue,
+	Op_K_print,
+	Op_K_print_rec,
+	Op_K_printf,
+	Op_K_next,
+	Op_K_exit,
+	Op_K_return,
+	Op_K_return_from_eval,
+	Op_K_delete,
+	Op_K_delete_loop,
+	Op_K_getline_redir,
+	Op_K_getline,
+	Op_K_nextfile,
+	Op_K_namespace,
+
+	Op_builtin,
+	Op_sub_builtin,		/* sub, gsub and gensub */
+	Op_ext_builtin,
+	Op_in_array,		/* boolean test of membership in array */
+
+	/* function call instruction */
+	Op_func_call,
+	Op_indirect_func_call,
+
+	Op_push,		/* scalar variable */
+	Op_push_arg,		/* variable type (scalar or array) argument to built-in */
+	Op_push_arg_untyped,	/* like Op_push_arg, but for typeof */
+	Op_push_i,		/* number, string */
+	Op_push_re,		/* regex */
+	Op_push_array,
+	Op_push_param,
+	Op_push_lhs,
+	Op_subscript_lhs,
+	Op_field_spec_lhs,
+	Op_no_op,		/* jump target */
+	Op_pop,			/* pop an item from the runtime stack */
+	Op_jmp,
+	Op_jmp_true,
+	Op_jmp_false,
+	Op_get_record,
+	Op_newfile,
+	Op_arrayfor_init,
+	Op_arrayfor_incr,
+	Op_arrayfor_final,
+
+	Op_var_update,		/* update value of NR, NF or FNR */
+	Op_var_assign,
+	Op_field_assign,
+	Op_subscript_assign,
+	Op_after_beginfile,
+	Op_after_endfile,
+
+	Op_func,
+
+	Op_comment,		/* for pretty printing */
+	Op_exec_count,
+	Op_breakpoint,
+	Op_lint,
+	Op_atexit,
+	Op_stop,
+
+	/* parsing (yylex and yyparse), should never appear in valid compiled code */
+	Op_token,
+	Op_symbol,
+	Op_list,
+
+	/* program structures -- for use in the profiler/pretty printer */
+	Op_K_do,
+	Op_K_for,
+	Op_K_arrayfor,
+	Op_K_while,
+	Op_K_switch,
+	Op_K_if,
+	Op_K_else,
+	Op_K_function,
+	Op_cond_exp,
+	Op_parens,
+	Op_final			/* sentry value, not legal */
+} OPCODE;
+
+enum redirval {
+	/* I/O redirections */
+	redirect_none = 0,
+	redirect_output,
+	redirect_append,
+	redirect_pipe,
+	redirect_pipein,
+	redirect_input,
+	redirect_twoway
+};
+
+struct break_point;
+
+typedef struct exp_instruction {
+	struct exp_instruction *nexti;
+	union {
+		NODE *dn;
+		struct exp_instruction *di;
+		NODE *(*fptr)(int);
+		awk_value_t *(*efptr)(int num_actual_args,
+					awk_value_t *result,
+					struct awk_ext_func *finfo);
+		long dl;
+		char *name;
+	} d;
+
+	union {
+		long  xl;
+		NODE *xn;
+		void (*aptr)(void);
+		struct exp_instruction *xi;
+		struct break_point *bpt;
+		awk_ext_func_t *exf;
+	} x;
+
+	struct exp_instruction *comment;
+	short source_line;
+	short pool_size;	// memory management in symbol.c
+	OPCODE opcode;
+} INSTRUCTION;
+
+#define func_name       d.name
+
+#define memory          d.dn
+#define builtin         d.fptr
+#define extfunc         d.efptr
+#define builtin_idx     d.dl
+
+#define expr_count      x.xl
+
+#define c_function	x.exf
+
+#define target_continue d.di
+#define target_jmp      d.di
+#define target_break    x.xi
+
+/* Op_sub_builtin */
+#define sub_flags       d.dl
+#define GSUB            0x01	/* builtin is gsub */
+#define GENSUB          0x02	/* builtin is gensub */
+#define LITERAL         0x04	/* target is a literal string */
+
+
+/* Op_K_exit */
+#define target_end      d.di
+#define target_atexit   x.xi
+
+/* Op_newfile, Op_K_getline, Op_nextfile */
+#define target_endfile	x.xi
+
+/* Op_newfile */
+#define target_get_record	x.xi
+
+/* Op_get_record, Op_K_nextfile */
+#define target_newfile	d.di
+
+/* Op_K_getline */
+#define target_beginfile	d.di
+
+/* Op_get_record */
+#define has_endfile		x.xl
+
+/* Op_token */
+#define lextok          d.name
+#define param_count     x.xl
+
+/* Op_rule */
+#define in_rule         x.xl
+#define source_file     d.name
+
+ /* Op_K_case, Op_K_default */
+#define case_stmt       x.xi
+#define case_exp        d.di
+#define stmt_start      case_exp
+#define stmt_end        case_stmt
+#define match_exp       x.xl
+
+#define target_stmt     x.xi
+
+/* Op_K_switch */
+#define switch_end      x.xi
+#define switch_start    d.di
+
+/* Op_K_getline, Op_K_getline_redir */
+#define into_var        x.xl
+
+/* Op_K_getline_redir, Op_K_print, Op_K_print_rec, Op_K_printf */
+#define redir_type      d.dl
+
+/* Op_arrayfor_incr	*/
+#define array_var       x.xn
+
+/* Op_line_range */
+#define triggered       x.xl
+
+/* Op_cond_pair */
+#define line_range      x.xi
+
+/* Op_func_call, Op_func */
+#define func_body       x.xn
+
+/* Op_subscript */
+#define sub_count       d.dl
+
+/* Op_push_lhs, Op_subscript_lhs, Op_field_spec_lhs */
+#define do_reference    x.xl
+
+/* Op_list, Op_rule, Op_func */
+#define lasti           d.di
+#define firsti          x.xi
+
+/* Op_rule, Op_func */
+#define last_line       x.xl
+#define first_line      source_line
+
+/* Op_lint */
+#define lint_type       d.dl
+
+/* Op_field_spec_lhs */
+#define target_assign	d.di
+
+/* Op_var_assign */
+#define assign_var	x.aptr
+
+/* Op_var_update */
+#define update_var	x.aptr
+
+/* Op_field_assign */
+#define field_assign    x.aptr
+
+/* Op_field_assign, Op_var_assign */
+#define assign_ctxt	d.dl
+
+/* Op_concat */
+#define concat_flag     d.dl
+#define CSUBSEP		1
+#define CSVAR		2
+
+/* Op_breakpoint */
+#define break_pt        x.bpt
+
+/*------------------ pretty printing/profiling --------*/
+/* Op_exec_count */
+#define exec_count      d.dl
+
+/* Op_K_while */
+#define while_body      d.di
+
+/* Op_K_do */
+#define doloop_cond     d.di
+
+/* Op_K_for */
+#define forloop_cond    d.di
+#define forloop_body    x.xi
+
+/* Op_K_if */
+#define branch_if       d.di
+#define branch_else     x.xi
+
+/* Op_K_else */
+#define branch_end      x.xi
+
+/* Op_line_range */
+#define condpair_left   d.di
+#define condpair_right  x.xi
+
+/* Op_Rule, Op_Func */
+#define ns_name		d.name
+
+/* Op_store_var */
+#define initval         x.xn
+
+typedef struct iobuf {
+	awk_input_buf_t public;	/* exposed to extensions */
+	char *buf;              /* start data buffer */
+	char *off;              /* start of current record in buffer */
+	char *dataend;          /* first byte in buffer to hold new data,
+				   NULL if not read yet */
+	char *end;              /* end of buffer */
+	size_t readsize;        /* set from fstat call */
+	size_t size;            /* buffer size */
+	ssize_t count;          /* amount read last time */
+	size_t scanoff;         /* where we were in the buffer when we had
+				   to regrow/refill */
+	bool valid;
+	int errcode;
+
+	int flag;
+#		define	IOP_IS_TTY	1
+#		define  IOP_AT_EOF      2
+#		define  IOP_CLOSED      4
+#		define  IOP_AT_START    8
+} IOBUF;
+
+typedef void (*Func_ptr)(void);
+
+/* structure used to dynamically maintain a linked-list of open files/pipes */
+struct redirect {
+	unsigned int flag;
+#		define	RED_FILE	1
+#		define	RED_PIPE	2
+#		define	RED_READ	4
+#		define	RED_WRITE	8
+#		define	RED_APPEND	16
+#		define	RED_NOBUF	32
+#		define	RED_USED	64	/* closed temporarily to reuse fd */
+#		define	RED_EOF		128
+#		define	RED_TWOWAY	256
+#		define	RED_PTY		512
+#		define	RED_SOCKET	1024
+#		define	RED_TCP		2048
+	char *value;
+	FILE *ifp;	/* input fp, needed for PIPES_SIMULATED */
+	IOBUF *iop;
+	int pid;
+	int status;
+	struct redirect *prev;
+	struct redirect *next;
+	const char *mode;
+	awk_output_buf_t output;
+};
+
+/* values for BINMODE, used as bit flags */
+
+enum binmode_values {
+	TEXT_TRANSLATE = 0,	/* usual \r\n ---> \n translation */
+	BINMODE_INPUT = 1,	/* no translation for input files */
+	BINMODE_OUTPUT = 2,	/* no translation for output files */
+	BINMODE_BOTH = 3	/* no translation for either */
+};
+
+/*
+ * structure for our source, either a command line string or a source file.
+ */
+
+typedef struct srcfile {
+	struct srcfile *next;
+	struct srcfile *prev;
+
+	enum srctype {
+		SRC_CMDLINE = 1,
+		SRC_STDIN,
+		SRC_FILE,
+		SRC_INC,
+		SRC_EXTLIB
+	} stype;
+	char *src;	/* name on command line or include statement */
+	char *fullpath;	/* full path after AWKPATH search */
+	time_t mtime;
+	struct stat sbuf;
+	int srclines;	/* no of lines in source */
+	size_t bufsize;
+	char *buf;
+	int *line_offset;	/* offset to the beginning of each line */
+	int fd;
+	int maxlen;	/* size of the longest line */
+
+	void (*fini_func)();	/* dynamic extension of type SRC_EXTLIB */
+
+	char *lexptr;
+	char *lexend;
+	char *lexeme;
+	char *lexptr_begin;
+	int lasttok;
+	INSTRUCTION *comment;	/* comment on @load line */
+	const char *namespace;
+} SRCFILE;
+
+// structure for INSTRUCTION pool, needed mainly for debugger
+typedef struct instruction_pool {
+#define MAX_INSTRUCTION_ALLOC	4	// we don't call bcalloc with more than this
+	struct instruction_mem_pool {
+		struct instruction_block *block_list;
+		INSTRUCTION *free_space;	// free location in active block
+		INSTRUCTION *free_list;
+	} pool[MAX_INSTRUCTION_ALLOC];
+} INSTRUCTION_POOL;
+
+/* structure for execution context */
+typedef struct context {
+	INSTRUCTION_POOL pools;
+	NODE symbols;
+	INSTRUCTION rule_list;
+	SRCFILE srcfiles;
+	int sourceline;
+	char *source;
+	void (*install_func)(NODE *);
+	struct context *prev;
+} AWK_CONTEXT;
+
+/* for debugging purposes */
+struct flagtab {
+	int val;
+	const char *name;
+};
+
+
+struct block_item {
+	struct block_item *freep;
+};
+
+struct block_header {
+	struct block_item *freep;
+	size_t size;
+};
+
+enum block_id {
+	BLOCK_NODE = 0,
+	BLOCK_BUCKET,
+	BLOCK_MPFR,
+	BLOCK_MPZ,
+	BLOCK_MAX	/* count */
+};
+
+typedef int (*Func_pre_exec)(INSTRUCTION **);
+typedef void (*Func_post_exec)(INSTRUCTION *);
+
+#ifndef LONG_MAX
+#define LONG_MAX ((long)(~(1L << (sizeof (long) * 8 - 1))))
+#endif
+#ifndef ULONG_MAX
+#define ULONG_MAX (~(unsigned long)0)
+#endif
+#ifndef LONG_MIN
+#define LONG_MIN ((long)(-LONG_MAX - 1L))
+#endif
+#define UNLIMITED    LONG_MAX
+
+/* -------------------------- External variables -------------------------- */
+/* gawk builtin variables */
+extern long NF;
+extern long NR;
+extern long FNR;
+extern int BINMODE;
+extern bool IGNORECASE;
+extern bool RS_is_null;
+extern char *OFS;
+extern int OFSlen;
+extern char *ORS;
+extern int ORSlen;
+extern char *OFMT;
+extern char *CONVFMT;
+extern int CONVFMTidx;
+extern int OFMTidx;
+#ifdef HAVE_MPFR
+extern int MPFR_round_mode;
+#endif
+extern char *TEXTDOMAIN;
+extern NODE *BINMODE_node, *CONVFMT_node, *FIELDWIDTHS_node, *FILENAME_node;
+extern NODE *FNR_node, *FS_node, *IGNORECASE_node, *NF_node;
+extern NODE *NR_node, *OFMT_node, *OFS_node, *ORS_node, *RLENGTH_node;
+extern NODE *RSTART_node, *RS_node, *RT_node, *SUBSEP_node, *PROCINFO_node;
+extern NODE *LINT_node, *ERRNO_node, *TEXTDOMAIN_node, *FPAT_node;
+extern NODE *PREC_node, *ROUNDMODE_node;
+extern NODE *Nnull_string;
+extern NODE *Null_field;
+extern NODE **fields_arr;
+extern int sourceline;
+extern char *source;
+extern int errcount;
+extern int (*interpret)(INSTRUCTION *);	/* interpreter routine */
+extern NODE *(*make_number)(double);	/* double instead of AWKNUM on purpose */
+extern NODE *(*str2number)(NODE *);
+extern NODE *(*format_val)(const char *, int, NODE *);
+extern int (*cmp_numbers)(const NODE *, const NODE *);
+
+/* built-in array types */
+extern const array_funcs_t str_array_func;
+extern const array_funcs_t cint_array_func;
+extern const array_funcs_t int_array_func;
+
+/* special node used to indicate success in array routines (not NULL) */
+extern NODE *success_node;
+
+extern struct block_header nextfree[];
+extern bool field0_valid;
+
+extern int do_flags;
+
+extern SRCFILE *srcfiles; /* source files */
+
+enum do_flag_values {
+	DO_LINT_INVALID	   = 0x00001,	/* only warn about invalid */
+	DO_LINT_EXTENSIONS = 0x00002,	/* warn about gawk extensions */
+	DO_LINT_ALL	   = 0x00004,	/* warn about all things */
+	DO_LINT_OLD	   = 0x00008,	/* warn about stuff not in V7 awk */
+	DO_TRADITIONAL	   = 0x00010,	/* no gnu extensions, add traditional weirdnesses */
+	DO_POSIX	   = 0x00020,	/* turn off gnu and unix extensions */
+	DO_INTL		   = 0x00040,	/* dump locale-izable strings to stdout */
+	DO_NON_DEC_DATA	   = 0x00080,	/* allow octal/hex C style DATA. Use with caution! */
+	DO_INTERVALS	   = 0x00100,	/* allow {...,...} in regexps, see resetup() */
+	DO_PRETTY_PRINT	   = 0x00200,	/* pretty print the program */
+	DO_DUMP_VARS	   = 0x00400,	/* dump all global variables at end */
+	DO_TIDY_MEM	   = 0x00800,	/* release vars when done */
+	DO_SANDBOX	   = 0x01000,	/* sandbox mode - disable 'system' function & redirections */
+	DO_PROFILE	   = 0x02000,	/* profile the program */
+	DO_DEBUG	   = 0x04000,	/* debug the program */
+	DO_MPFR		   = 0x08000	/* arbitrary-precision floating-point math */
+};
+
+#define do_traditional      (do_flags & DO_TRADITIONAL)
+#define do_posix            (do_flags & DO_POSIX)
+#define do_intl             (do_flags & DO_INTL)
+#define do_non_decimal_data (do_flags & DO_NON_DEC_DATA)
+#define do_intervals        (do_flags & DO_INTERVALS)
+#define do_pretty_print     (do_flags & DO_PRETTY_PRINT)
+#define do_profile          (do_flags & DO_PROFILE)
+#define do_dump_vars        (do_flags & DO_DUMP_VARS)
+#define do_tidy_mem         (do_flags & DO_TIDY_MEM)
+#define do_sandbox          (do_flags & DO_SANDBOX)
+#define do_debug            (do_flags & DO_DEBUG)
+#define do_mpfr             (do_flags & DO_MPFR)
+
+extern bool do_optimize;
+extern int use_lc_numeric;
+extern int exit_val;
+
+#ifdef NO_LINT
+#define do_lint 0
+#define do_lint_old 0
+#else
+#define do_lint             (do_flags & (DO_LINT_INVALID|DO_LINT_ALL))
+#define do_lint_old         (do_flags & DO_LINT_OLD)
+#define do_lint_extensions  (do_flags & DO_LINT_EXTENSIONS)
+#endif
+extern int gawk_mb_cur_max;
+
+#if defined (HAVE_GETGROUPS) && defined(NGROUPS_MAX) && NGROUPS_MAX > 0
+extern GETGROUPS_T *groupset;
+extern int ngroups;
+#endif
+
+#ifdef HAVE_LOCALE_H
+extern struct lconv loc;
+#endif /* HAVE_LOCALE_H */
+
+#ifdef HAVE_MPFR
+extern mpfr_prec_t PRECISION;
+extern mpfr_rnd_t ROUND_MODE;
+extern mpz_t MNR;
+extern mpz_t MFNR;
+extern mpz_t mpzval;
+extern bool do_ieee_fmt;	/* emulate IEEE 754 floating-point format */
+#endif
+
+
+extern const char *myname;
+extern const char def_strftime_format[];
+
+extern char quote;
+extern char *defpath;
+extern char *deflibpath;
+extern char envsep;
+
+extern char casetable[];	/* for case-independent regexp matching */
+
+extern const char awk_namespace[];	/* "awk" */
+extern const char *current_namespace;
+extern bool namespace_changed;
+
+/* ------------------------- Runtime stack -------------------------------- */
+
+typedef union stack_item {
+	NODE *rptr;	/* variable etc. */
+	NODE **lptr;	/* address of a variable etc. */
+} STACK_ITEM;
+
+extern STACK_ITEM *stack_ptr;
+extern NODE *frame_ptr;
+extern STACK_ITEM *stack_bottom;
+extern STACK_ITEM *stack_top;
+
+#define decr_sp()		(stack_ptr--)
+#define incr_sp()		((stack_ptr < stack_top) ? ++stack_ptr : grow_stack())
+#define stack_adj(n)		(stack_ptr += (n))
+#define stack_empty()		(stack_ptr < stack_bottom)
+
+#define POP()			(decr_sp()->rptr)
+#define POP_ADDRESS()		(decr_sp()->lptr)
+#define PEEK(n)			((stack_ptr - (n))->rptr)
+#define TOP()			(stack_ptr->rptr)		/* same as PEEK(0) */
+#define TOP_ADDRESS()		(stack_ptr->lptr)
+#define PUSH(r)			(void) (incr_sp()->rptr = (r))
+#define PUSH_ADDRESS(l)		(void) (incr_sp()->lptr = (l))
+#define REPLACE(r)		(void) (stack_ptr->rptr = (r))
+#define REPLACE_ADDRESS(l)	(void) (stack_ptr->lptr = (l))
+
+/* function param */
+#define GET_PARAM(n)	frame_ptr->stack[n]
+
+/*
+ * UPREF --- simplified versions of dupnode, does not handle FIELD node.
+ * Most appropriate use is for elements on the runtime stack.
+ * When in doubt, use dupnode.
+ */
+
+#define UPREF(r)	(void) ((r)->valref++)
+
+extern void r_unref(NODE *tmp);
+
+static inline void
+DEREF(NODE *r)
+{
+	assert(r->valref > 0);
+	if (--r->valref == 0)
+		r_unref(r);
+}
+
+#define POP_NUMBER() force_number(POP_SCALAR())
+#define TOP_NUMBER() force_number(TOP_SCALAR())
+
+/* ------------------------- Pseudo-functions ------------------------- */
+#ifdef HAVE_MPFR
+
+#if 0
+
+/*
+ * In principle, there is no need to have both the MPFN and MPZN flags,
+ * since we are using 2 bits to encode 1 bit of information. But
+ * there may be some minor performance advantages from testing only the
+ * node flag bits without needing also to access the global do_mpfr flag bit.
+ */
+#define numtype_choose(n, mpfrval, mpzval, dblval)	\
+ (!do_mpfr ? (dblval) : (((n)->flags & MPFN) ? (mpfrval) : (mpzval)))
+
+#endif
+
+/* N.B. This implementation seems to give the fastest results. */
+#define numtype_choose(n, mpfrval, mpzval, dblval)	\
+ (!((n)->flags & (MPFN|MPZN)) ? (dblval) : (((n)->flags & MPFN) ? (mpfrval) : (mpzval)))
+
+/* conversion to C types */
+#define get_number_ui(n)	numtype_choose((n), mpfr_get_ui((n)->mpg_numbr, ROUND_MODE), mpz_get_ui((n)->mpg_i), (unsigned long) (n)->numbr)
+
+#define get_number_si(n)	numtype_choose((n), mpfr_get_si((n)->mpg_numbr, ROUND_MODE), mpz_get_si((n)->mpg_i), (long) (n)->numbr)
+
+#define get_number_d(n)		numtype_choose((n), mpfr_get_d((n)->mpg_numbr, ROUND_MODE), mpz_get_d((n)->mpg_i), (double) (n)->numbr)
+
+#define get_number_uj(n)	numtype_choose((n), mpfr_get_uj((n)->mpg_numbr, ROUND_MODE), (uintmax_t) mpz_get_d((n)->mpg_i), (uintmax_t) (n)->numbr)
+
+#define iszero(n)		numtype_choose((n), mpfr_zero_p((n)->mpg_numbr), (mpz_sgn((n)->mpg_i) == 0), ((n)->numbr == 0.0))
+
+#define IEEE_FMT(r, t)		(void) (do_ieee_fmt && format_ieee(r, t))
+
+#define mpg_float()		mpg_node(MPFN)
+#define mpg_integer()		mpg_node(MPZN)
+#define is_mpg_float(n)		(((n)->flags & MPFN) != 0)
+#define is_mpg_integer(n)	(((n)->flags & MPZN) != 0)
+#define is_mpg_number(n)	(((n)->flags & (MPZN|MPFN)) != 0)
+#else
+#define get_number_ui(n)	(unsigned long) (n)->numbr
+#define get_number_si(n)	(long) (n)->numbr
+#define get_number_d(n)		(double) (n)->numbr
+#define get_number_uj(n)	(uintmax_t) (n)->numbr
+
+#define is_mpg_number(n)	0
+#define is_mpg_float(n)		0
+#define is_mpg_integer(n)	0
+#define iszero(n)		((n)->numbr == 0.0)
+#endif
+
+#define var_uninitialized(n)	((n)->var_value == Nnull_string)
+
+#define get_lhs(n, r)	 (n)->type == Node_var && ! var_uninitialized(n) ? \
+				&((n)->var_value) : r_get_lhs((n), (r))
+
+#define getblock(p, id, ty)  (void) ((p = (ty) nextfree[id].freep) ? \
+			(ty) (nextfree[id].freep = ((struct block_item *) p)->freep) \
+			: (p = (ty) more_blocks(id)))
+#define freeblock(p, id)	 (void) (((struct block_item *) p)->freep = nextfree[id].freep, \
+					nextfree[id].freep = (struct block_item *) p)
+
+#define getnode(n)	getblock(n, BLOCK_NODE, NODE *)
+#define freenode(n)	freeblock(n, BLOCK_NODE)
+
+#define getbucket(b) 	getblock(b, BLOCK_BUCKET, BUCKET *)
+#define freebucket(b)	freeblock(b, BLOCK_BUCKET)
+
+#define	make_string(s, l)	make_str_node((s), (l), 0)
+
+// Flags for making string nodes
+#define		SCAN			1
+#define		ALREADY_MALLOCED	2
+#define		ELIDE_BACK_NL		4
+
+#define	cant_happen()	r_fatal("internal error line %d, file: %s", \
+				__LINE__, __FILE__)
+
+#define	emalloc(var,ty,x,str)	(void) (var = (ty) emalloc_real((size_t)(x), str, #var, __FILE__, __LINE__))
+#define	ezalloc(var,ty,x,str)	(void) (var = (ty) ezalloc_real((size_t)(x), str, #var, __FILE__, __LINE__))
+#define	erealloc(var,ty,x,str)	(void) (var = (ty) erealloc_real((void *) var, (size_t)(x), str, #var, __FILE__, __LINE__))
+
+#define efree(p)	free(p)
+
+#define fatal		(*(set_loc(__FILE__, __LINE__), r_fatal))
+
+extern jmp_buf fatal_tag;
+extern int fatal_tag_valid;
+
+#define assoc_length(a)	((a)->table_size)
+#define assoc_empty(a)	(assoc_length(a) == 0)
+#define assoc_lookup(a, s)	((a)->alookup(a, s))
+
+/* assoc_clear --- flush all the values in symbol[] */
+#define assoc_clear(a)	(void) ((a)->aclear(a, NULL))
+
+/* assoc_remove --- remove an index from symbol[] */
+#define assoc_remove(a, s) ((a)->aremove(a, s) != NULL)
+
+
+/* ------------- Function prototypes or defs (as appropriate) ------------- */
+/* array.c */
+typedef enum { SORTED_IN = 1, ASORT, ASORTI } sort_context_t;
+typedef enum {
+	ANONE   = 0x00,		/* "unused" value */
+	AINDEX	= 0x001,	/* list of indices */
+	AVALUE	= 0x002,	/* list of values */
+	AINUM	= 0x004,	/* numeric index */
+	AISTR	= 0x008,	/* string index */
+	AVNUM	= 0x010,	/* numeric scalar value */
+	AVSTR	= 0x020,	/* string scalar value */
+	AASC	= 0x040,	/* ascending order */
+	ADESC	= 0x080,	/* descending order */
+	ADELETE = 0x100		/* need a single index; for use in do_delete_loop */
+} assoc_kind_t;
+
+extern NODE *make_array(void);
+extern void null_array(NODE *symbol);
+extern NODE *force_array(NODE *symbol, bool canfatal);
+extern const char *make_aname(const NODE *symbol);
+extern const char *array_vname(const NODE *symbol);
+extern void array_init(void);
+extern NODE **null_afunc(NODE *symbol, NODE *subs);
+extern void set_SUBSEP(void);
+extern NODE *concat_exp(int nargs, bool do_subsep);
+extern NODE *assoc_copy(NODE *symbol, NODE *newsymb);
+extern void assoc_dump(NODE *symbol, NODE *p);
+extern NODE **assoc_list(NODE *symbol, const char *sort_str, sort_context_t sort_ctxt);
+extern void assoc_info(NODE *subs, NODE *val, NODE *p, const char *aname);
+extern void do_delete(NODE *symbol, int nsubs);
+extern void do_delete_loop(NODE *symbol, NODE **lhs);
+extern NODE *do_adump(int nargs);
+extern NODE *do_aoption(int nargs);
+extern NODE *do_asort(int nargs);
+extern NODE *do_asorti(int nargs);
+extern unsigned long (*hash)(const char *s, size_t len, unsigned long hsize, size_t *code);
+extern void init_env_array(NODE *env_node);
+extern void init_argv_array(NODE *argv_node, NODE *shadow_node);
+/* awkgram.c */
+extern NODE *variable(int location, char *name, NODETYPE type);
+extern int parse_program(INSTRUCTION **pcode, bool from_eval);
+extern void track_ext_func(const char *name);
+extern void dump_funcs(void);
+extern void dump_vars(const char *fname);
+extern const char *getfname(NODE *(*)(int), bool prepend_awk);
+extern NODE *stopme(int nargs);
+extern void shadow_funcs(void);
+extern int check_special(const char *name);
+extern SRCFILE *add_srcfile(enum srctype stype, char *src, SRCFILE *curr, bool *already_included, int *errcode);
+extern void free_srcfile(SRCFILE *thisfile);
+extern int files_are_same(char *path, SRCFILE *src);
+extern void valinfo(NODE *n, Func_print print_func, FILE *fp);
+extern void negate_num(NODE *n);
+typedef NODE *(*builtin_func_t)(int);	/* function that implements a built-in */
+extern builtin_func_t lookup_builtin(const char *name);
+extern void install_builtins(void);
+extern bool is_alpha(int c);
+extern bool is_alnum(int c);
+extern bool is_letter(int c);
+extern bool is_identchar(int c);
+extern NODE *make_regnode(int type, NODE *exp);
+extern bool validate_qualified_name(char *token);
+/* builtin.c */
+extern double double_to_int(double d);
+extern NODE *do_exp(int nargs);
+extern NODE *do_fflush(int nargs);
+extern NODE *do_index(int nargs);
+extern NODE *do_int(int nargs);
+extern NODE *do_isarray(int nargs);
+extern NODE *do_length(int nargs);
+extern NODE *do_log(int nargs);
+extern NODE *do_mktime(int nargs);
+extern NODE *do_sprintf(int nargs);
+extern void do_printf(int nargs, int redirtype);
+extern void print_simple(NODE *tree, FILE *fp);
+extern NODE *do_sqrt(int nargs);
+extern NODE *do_substr(int nargs);
+extern NODE *do_strftime(int nargs);
+extern NODE *do_systime(int nargs);
+extern NODE *do_system(int nargs);
+extern void do_print(int nargs, int redirtype);
+extern void do_print_rec(int args, int redirtype);
+extern NODE *do_tolower(int nargs);
+extern NODE *do_toupper(int nargs);
+extern NODE *do_atan2(int nargs);
+extern NODE *do_sin(int nargs);
+extern NODE *do_cos(int nargs);
+extern NODE *do_rand(int nargs);
+extern NODE *do_srand(int nargs);
+extern NODE *do_match(int nargs);
+extern NODE *do_sub(int nargs, unsigned int flags);
+extern NODE *call_sub(const char *name, int nargs);
+extern NODE *call_match(int nargs);
+extern NODE *call_split_func(const char *name, int nargs);
+extern NODE *format_tree(const char *, size_t, NODE **, long);
+extern NODE *do_lshift(int nargs);
+extern NODE *do_rshift(int nargs);
+extern NODE *do_and(int nargs);
+extern NODE *do_or(int nargs);
+extern NODE *do_xor(int nargs);
+extern NODE *do_compl(int nargs);
+extern NODE *do_strtonum(int nargs);
+extern AWKNUM nondec2awknum(char *str, size_t len, char **endptr);
+extern NODE *do_dcgettext(int nargs);
+extern NODE *do_dcngettext(int nargs);
+extern NODE *do_bindtextdomain(int nargs);
+extern NODE *do_intdiv(int nargs);
+extern NODE *do_typeof(int nargs);
+extern int strncasecmpmbs(const unsigned char *,
+			  const unsigned char *, size_t);
+extern int sanitize_exit_status(int status);
+/* debug.c */
+extern void init_debug(void);
+extern int debug_prog(INSTRUCTION *pc);
+/* eval.c */
+extern void PUSH_CODE(INSTRUCTION *cp);
+extern INSTRUCTION *POP_CODE(void);
+extern void init_interpret(void);
+extern int cmp_nodes(NODE *t1, NODE *t2, bool use_strcmp);
+extern int cmp_awknums(const NODE *t1, const NODE *t2);
+extern void set_IGNORECASE(void);
+extern void set_OFS(void);
+extern void set_ORS(void);
+extern void set_OFMT(void);
+extern void set_CONVFMT(void);
+extern void set_BINMODE(void);
+extern void set_LINT(void);
+extern void set_TEXTDOMAIN(void);
+extern void update_ERRNO_int(int);
+extern void update_ERRNO_string(const char *string);
+extern void unset_ERRNO(void);
+extern void update_NR(void);
+extern void update_NF(void);
+extern void update_FNR(void);
+extern const char *redflags2str(int);
+extern const char *flags2str(int);
+extern const char *genflags2str(int flagval, const struct flagtab *tab);
+extern const char *nodetype2str(NODETYPE type);
+extern void load_casetable(void);
+extern AWKNUM calc_exp(AWKNUM x1, AWKNUM x2);
+extern const char *opcode2str(OPCODE type);
+extern const char *op2str(OPCODE type);
+extern NODE **r_get_lhs(NODE *n, bool reference);
+extern STACK_ITEM *grow_stack(void);
+extern void dump_fcall_stack(FILE *fp);
+extern int register_exec_hook(Func_pre_exec preh, Func_post_exec posth);
+extern NODE **r_get_field(NODE *n, Func_ptr *assign, bool reference);
+/* ext.c */
+extern NODE *do_ext(int nargs);
+void load_ext(const char *lib_name);	/* temporary */
+extern void close_extensions(void);
+extern bool is_valid_identifier(const char *name);
+#ifdef DYNAMIC
+extern awk_bool_t make_builtin(const char *name_space, const awk_ext_func_t *);
+extern NODE *get_argument(int);
+extern NODE *get_actual_argument(NODE *, int, bool);
+#define get_scalar_argument(n, i)  get_actual_argument((n), (i), false)
+#define get_array_argument(n, i)   get_actual_argument((n), (i), true)
+#endif
+/* field.c */
+extern void init_fields(void);
+extern void set_record(const char *buf, int cnt, const awk_fieldwidth_info_t *);
+extern void reset_record(void);
+extern void rebuild_record(void);
+extern void set_NF(void);
+extern NODE **get_field(long num, Func_ptr *assign);
+extern NODE *do_split(int nargs);
+extern NODE *do_patsplit(int nargs);
+extern void set_FS(void);
+extern void set_RS(void);
+extern void set_FIELDWIDTHS(void);
+extern void set_FPAT(void);
+extern void update_PROCINFO_str(const char *subscript, const char *str);
+extern void update_PROCINFO_num(const char *subscript, AWKNUM val);
+
+typedef enum {
+	Using_FS,
+	Using_FIELDWIDTHS,
+	Using_FPAT,
+	Using_API
+} field_sep_type;
+extern field_sep_type current_field_sep(void);
+extern const char *current_field_sep_str(void);
+
+/* gawkapi.c: */
+extern gawk_api_t api_impl;
+extern void init_ext_api(void);
+extern void update_ext_api(void);
+extern NODE *awk_value_to_node(const awk_value_t *);
+extern void run_ext_exit_handlers(int exitval);
+extern void print_ext_versions(void);
+extern void free_api_string_copies(void);
+
+/* gawkmisc.c */
+extern char *gawk_name(const char *filespec);
+extern void os_arg_fixup(int *argcp, char ***argvp);
+extern int os_devopen(const char *name, int flag);
+extern void os_close_on_exec(int fd, const char *name, const char *what, const char *dir);
+extern int os_isatty(int fd);
+extern int os_isdir(int fd);
+extern int os_isreadable(const awk_input_buf_t *iobuf, bool *isdir);
+extern int os_is_setuid(void);
+extern int os_setbinmode(int fd, int mode);
+extern void os_restore_mode(int fd);
+extern size_t optimal_bufsize(int fd, struct stat *sbuf);
+extern int ispath(const char *file);
+extern int isdirpunct(int c);
+
+/* io.c */
+extern void init_sockets(void);
+extern void init_io(void);
+extern void register_input_parser(awk_input_parser_t *input_parser);
+extern void register_output_wrapper(awk_output_wrapper_t *wrapper);
+extern void register_two_way_processor(awk_two_way_processor_t *processor);
+extern void set_FNR(void);
+extern void set_NR(void);
+
+extern struct redirect *redirect(NODE *redir_exp, int redirtype, int *errflg, bool failure_fatal);
+extern struct redirect *redirect_string(const char *redir_exp_str,
+		size_t redir_exp_len, bool not_string_flag, int redirtype,
+		int *errflg, int extfd, bool failure_fatal);
+extern NODE *do_close(int nargs);
+extern int flush_io(void);
+extern int close_io(bool *stdio_problem, bool *got_EPIPE);
+typedef enum { CLOSE_ALL, CLOSE_TO, CLOSE_FROM } two_way_close_type;
+extern int close_rp(struct redirect *rp, two_way_close_type how);
+extern int devopen_simple(const char *name, const char *mode, bool try_real_open);
+extern int devopen(const char *name, const char *mode);
+extern int srcopen(SRCFILE *s);
+extern char *find_source(const char *src, struct stat *stb, int *errcode, int is_extlib);
+extern NODE *do_getline_redir(int intovar, enum redirval redirtype);
+extern NODE *do_getline(int intovar, IOBUF *iop);
+extern struct redirect *getredirect(const char *str, int len);
+extern bool inrec(IOBUF *iop, int *errcode);
+extern int nextfile(IOBUF **curfile, bool skipping);
+extern bool is_non_fatal_std(FILE *fp);
+extern bool is_non_fatal_redirect(const char *str, size_t len);
+extern void ignore_sigpipe(void);
+extern void set_sigpipe_to_default(void);
+extern bool non_fatal_flush_std_file(FILE *fp);
+
+/* main.c */
+extern int arg_assign(char *arg, bool initing);
+extern int is_std_var(const char *var);
+extern int is_off_limits_var(const char *var);
+extern char *estrdup(const char *str, size_t len);
+extern void update_global_values();
+extern long getenv_long(const char *name);
+extern void after_beginfile(IOBUF **curfile);
+extern void set_current_namespace(const char *new_namespace);
+
+/* mpfr.c */
+extern void set_PREC(void);
+extern void set_ROUNDMODE(void);
+extern void mpfr_unset(NODE *n);
+#ifdef HAVE_MPFR
+extern int mpg_cmp(const NODE *, const NODE *);
+extern int format_ieee(mpfr_ptr, int);
+extern NODE *mpg_update_var(NODE *);
+extern long mpg_set_var(NODE *);
+extern NODE *do_mpfr_and(int);
+extern NODE *do_mpfr_atan2(int);
+extern NODE *do_mpfr_compl(int);
+extern NODE *do_mpfr_cos(int);
+extern NODE *do_mpfr_exp(int);
+extern NODE *do_mpfr_int(int);
+extern NODE *do_mpfr_intdiv(int);
+extern NODE *do_mpfr_log(int);
+extern NODE *do_mpfr_lshift(int);
+extern NODE *do_mpfr_or(int);
+extern NODE *do_mpfr_rand(int);
+extern NODE *do_mpfr_rshift(int);
+extern NODE *do_mpfr_sin(int);
+extern NODE *do_mpfr_sqrt(int);
+extern NODE *do_mpfr_srand(int);
+extern NODE *do_mpfr_strtonum(int);
+extern NODE *do_mpfr_xor(int);
+extern void init_mpfr(mpfr_prec_t, const char *);
+extern void cleanup_mpfr(void);
+extern NODE *mpg_node(unsigned int);
+extern const char *mpg_fmt(const char *, ...);
+extern int mpg_strtoui(mpz_ptr, char *, size_t, char **, int);
+#endif
+/* msg.c */
+extern void gawk_exit(int status);
+extern void final_exit(int status) ATTRIBUTE_NORETURN;
+extern void err(bool isfatal, const char *s, const char *emsg, va_list argp) ATTRIBUTE_PRINTF(3, 0);
+extern void msg (const char *mesg, ...) ATTRIBUTE_PRINTF_1;
+extern void error (const char *mesg, ...) ATTRIBUTE_PRINTF_1;
+extern void r_warning (const char *mesg, ...) ATTRIBUTE_PRINTF_1;
+extern void set_loc (const char *file, int line);
+extern void r_fatal (const char *mesg, ...) ATTRIBUTE_PRINTF_1;
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
+extern void (*lintfunc)(const char *mesg, ...) ATTRIBUTE_PRINTF_1;
+#else
+extern void (*lintfunc)(const char *mesg, ...);
+#endif
+/* profile.c */
+extern void init_profiling_signals(void);
+extern void set_prof_file(const char *filename);
+extern void dump_prog(INSTRUCTION *code);
+extern char *pp_number(NODE *n);
+extern char *pp_string(const char *in_str, size_t len, int delim);
+extern char *pp_node(NODE *n);
+extern int pp_func(INSTRUCTION *pc, void *);
+extern void pp_string_fp(Func_print print_func, FILE *fp, const char *str,
+		size_t namelen, int delim, bool breaklines);
+/* node.c */
+extern NODE *r_force_number(NODE *n);
+extern NODE *r_format_val(const char *format, int index, NODE *s);
+extern NODE *r_dupnode(NODE *n);
+extern NODE *make_str_node(const char *s, size_t len, int flags);
+extern NODE *make_typed_regex(const char *re, size_t len);
+extern void *more_blocks(int id);
+extern int parse_escape(const char **string_ptr);
+extern NODE *str2wstr(NODE *n, size_t **ptr);
+extern NODE *wstr2str(NODE *n);
+#define force_wstring(n)	str2wstr(n, NULL)
+extern const wchar_t *wstrstr(const wchar_t *haystack, size_t hs_len,
+		const wchar_t *needle, size_t needle_len);
+extern const wchar_t *wcasestrstr(const wchar_t *haystack, size_t hs_len,
+		const wchar_t *needle, size_t needle_len);
+extern void r_free_wstr(NODE *n);
+#define free_wstr(n)	do { if ((n)->flags & WSTRCUR) r_free_wstr(n); } while(0)
+extern wint_t btowc_cache[];
+#define btowc_cache(x) btowc_cache[(x)&0xFF]
+extern void init_btowc_cache();
+#define is_valid_character(b)	(btowc_cache[(b)&0xFF] != WEOF)
+extern bool out_of_range(NODE *n);
+extern char *format_nan_inf(NODE *n, char format);
+/* re.c */
+extern Regexp *make_regexp(const char *s, size_t len, bool ignorecase, bool dfa, bool canfatal);
+extern int research(Regexp *rp, char *str, int start, size_t len, int flags);
+extern void refree(Regexp *rp);
+extern void reg_error(const char *s);
+extern Regexp *re_update(NODE *t);
+extern void resyntax(int syntax);
+extern void resetup(void);
+extern int reisstring(const char *text, size_t len, Regexp *re, const char *buf);
+extern int get_numbase(const char *str, size_t len, bool use_locale);
+extern bool using_utf8(void);
+
+/* symbol.c */
+extern void load_symbols();
+extern void init_symbol_table();
+extern NODE *symbol_table;
+extern NODE *func_table;
+extern NODE *install_symbol(const char *name, NODETYPE type);
+extern NODE *remove_symbol(NODE *r);
+extern void destroy_symbol(NODE *r);
+extern void release_symbols(NODE *symlist, int keep_globals);
+extern void append_symbol(NODE *r);
+extern NODE *lookup(const char *name);
+extern NODE *make_params(char **pnames, int pcount);
+extern void install_params(NODE *func);
+extern void remove_params(NODE *func);
+extern void release_all_vars(void);
+extern int foreach_func(NODE **table, int (*)(INSTRUCTION *, void *), void *);
+extern INSTRUCTION *bcalloc(OPCODE op, int size, int srcline);
+extern void bcfree(INSTRUCTION *);
+extern AWK_CONTEXT *new_context(void);
+extern void push_context(AWK_CONTEXT *ctxt);
+extern void pop_context();
+extern int in_main_context();
+extern void free_context(AWK_CONTEXT *ctxt, bool keep_globals);
+extern NODE **variable_list();
+extern NODE **function_list(bool sort);
+extern void print_vars(NODE **table, Func_print print_func, FILE *fp);
+extern bool check_param_names(void);
+extern bool is_all_upper(const char *name);
+
+/* floatcomp.c */
+#ifdef HAVE_UINTMAX_T
+extern uintmax_t adjust_uint(uintmax_t n);
+#else
+#define adjust_uint(n) (n)
+#endif
+
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+#ifndef WEXITSTATUS
+#if defined(VMS)
+#define WEXITSTATUS(stat_val) (stat_val)
+#else /* ! defined(VMS) */
+#define WEXITSTATUS(stat_val) ((((unsigned) (stat_val)) >> 8) & 0xFF)
+#endif /* ! defined(VMS)) */
+#endif /* WEXITSTATUS */
+
+/* For z/OS, from Dave Pitts. EXIT_FAILURE is normally 8, make it 1. */
+#if defined(EXIT_FAILURE) && EXIT_FAILURE == 8
+# undef EXIT_FAILURE
+#endif
+
+/* EXIT_SUCCESS and EXIT_FAILURE normally come from <stdlib.h> */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+/* EXIT_FATAL is specific to gawk, not part of Standard C */
+#ifndef EXIT_FATAL
+# define EXIT_FATAL   2
+#endif
+
+/* ------------------ Inline Functions ------------------ */
+
+/*
+ * These must come last to get all the function declarations and
+ * macro definitions before their bodies.
+ *
+ * This is wasteful if the compiler doesn't support inline. We won't
+ * worry about it until someone complains.
+ */
+
+/* POP_ARRAY --- get the array at the top of the stack */
+
+static inline NODE *
+POP_ARRAY(bool check_for_untyped)
+{
+	NODE *t = POP();
+	static bool warned = false;
+
+	if (do_lint && ! warned && check_for_untyped && t->type == Node_var_new) {
+		warned = true;
+		lintwarn(_("behavior of `for' loop on untyped variable is not defined by POSIX"));
+	}
+
+	return (t->type == Node_var_array) ? t : force_array(t, true);
+}
+
+/* POP_PARAM --- get the top parameter, array or scalar */
+
+static inline NODE *
+POP_PARAM()
+{
+	NODE *t = POP();
+
+	return (t->type == Node_var_array) ? t : force_array(t, false);
+}
+
+/* POP_SCALAR --- pop the scalar at the top of the stack */
+
+static inline NODE *
+POP_SCALAR()
+{
+	NODE *t = POP();
+
+	if (t->type == Node_var_array)
+		fatal(_("attempt to use array `%s' in a scalar context"), array_vname(t));
+
+	return t;
+}
+
+/* TOP_SCALAR --- get the scalar at the top of the stack */
+
+static inline NODE *
+TOP_SCALAR()
+{
+	NODE *t = TOP();
+
+	if (t->type == Node_var_array)
+		fatal(_("attempt to use array `%s' in a scalar context"), array_vname(t));
+
+	return t;
+}
+
+/* POP_STRING --- pop the string at the top of the stack */
+#define POP_STRING()	force_string(POP_SCALAR())
+
+/* TOP_STRING --- get the string at the top of the stack */
+#define TOP_STRING()	force_string(TOP_SCALAR())
+
+/* in_array --- return pointer to element in array if there */
+
+static inline NODE *
+in_array(NODE *a, NODE *s)
+{
+	NODE **ret;
+
+	ret = a->aexists(a, s);
+
+	return ret ? *ret : NULL;
+}
+
+#ifdef GAWKDEBUG
+#define dupnode	r_dupnode
+#else
+/* dupnode --- up the reference on a node */
+
+static inline NODE *
+dupnode(NODE *n)
+{
+	if ((n->flags & MALLOC) != 0) {
+		n->valref++;
+		return n;
+	}
+	return r_dupnode(n);
+}
+#endif
+
+/*
+ * force_string_fmt --- force a node to have a string value in a given format.
+ * The string representation of a number may change due to whether it was most
+ * recently rendered with CONVFMT or OFMT, or due to changes in the CONVFMT
+ * and OFMT values. But if the value entered gawk as a string or strnum, then
+ * stfmt should be set to STFMT_UNUSED, and the string representation should
+ * not change.
+ *
+ * Additional twist: If ROUNDMODE changed at some point we have to
+ * recompute also.
+ */
+
+static inline NODE *
+force_string_fmt(NODE *s, const char *fmtstr, int fmtidx)
+{
+	if ((s->flags & STRCUR) != 0
+		&& (s->stfmt == STFMT_UNUSED || (s->stfmt == fmtidx
+#ifdef HAVE_MPFR
+						&& s->strndmode == MPFR_round_mode
+#endif
+				)))
+		return s;
+	return format_val(fmtstr, fmtidx, s);
+}
+
+/* conceptually should be force_string_convfmt, but this is the typical case */
+#define force_string(s)		force_string_fmt((s), CONVFMT, CONVFMTidx)
+
+#define force_string_ofmt(s)	force_string_fmt((s), OFMT, OFMTidx)
+
+#ifdef GAWKDEBUG
+#define unref	r_unref
+#define	force_number	str2number
+#else /* not GAWKDEBUG */
+
+/* unref --- decrease the reference count and/or free a node */
+
+static inline void
+unref(NODE *r)
+{
+	if (r != NULL && --r->valref <= 0)
+		r_unref(r);
+}
+
+/* force_number --- force a  node to have a numeric value */
+
+static inline NODE *
+force_number(NODE *n)
+{
+	return (n->flags & NUMCUR) != 0 ? n : str2number(n);
+}
+
+#endif /* GAWKDEBUG */
+
+
+/* fixtype --- make a node decide if it's a number or a string */
+
+/*
+ * In certain contexts, the true type of a scalar value matters, and we
+ * must ascertain whether it is a NUMBER or a STRING. In such situations,
+ * please use this function to resolve the type.
+ *
+ * It is safe to assume that the return value will be the same NODE,
+ * since force_number on a USER_INPUT should always return the same NODE,
+ * and force_string on an INTIND should as well.
+ */
+
+static inline NODE *
+fixtype(NODE *n)
+{
+	assert(n->type == Node_val);
+	if ((n->flags & (NUMCUR|USER_INPUT)) == USER_INPUT)
+		return force_number(n);
+	if ((n->flags & INTIND) != 0)
+		return force_string(n);
+	return n;
+}
+
+/* boolval --- return true/false based on awk's criteria */
+
+/*
+ * In awk, a value is considered to be true if it is nonzero _or_
+ * non-null. Otherwise, the value is false.
+ */
+
+static inline bool
+boolval(NODE *t)
+{
+	(void) fixtype(t);
+	if ((t->flags & NUMBER) != 0)
+		return ! iszero(t);
+	return (t->stlen > 0);
+}
+
+/* emalloc_real --- malloc with error checking */
+
+static inline void *
+emalloc_real(size_t count, const char *where, const char *var, const char *file, int line)
+{
+	void *ret;
+
+	if (count == 0)
+		fatal("%s:%d: emalloc called with zero bytes", file, line);
+
+	ret = (void *) malloc(count);
+	if (ret == NULL)
+		fatal(_("%s:%d:%s: %s: can't allocate %ld bytes of memory (%s)"),
+			file, line, where, var, (long) count, strerror(errno));
+
+	return ret;
+}
+
+/* ezalloc_real --- malloc zero-filled bytes with error checking */
+
+static inline void *
+ezalloc_real(size_t count, const char *where, const char *var, const char *file, int line)
+{
+	void *ret;
+
+	if (count == 0)
+		fatal("%s:%d: ezalloc called with zero bytes", file, line);
+
+	ret = (void *) calloc(1, count);
+	if (ret == NULL)
+		fatal(_("%s:%d:%s: %s: can't allocate %ld bytes of memory (%s)"),
+			file, line, where, var, (long) count, strerror(errno));
+
+	return ret;
+}
+
+/* erealloc_real --- realloc with error checking */
+
+static inline void *
+erealloc_real(void *ptr, size_t count, const char *where, const char *var, const char *file, int line)
+{
+	void *ret;
+
+	if (count == 0)
+		fatal("%s:%d: erealloc called with zero bytes", file, line);
+
+	ret = (void *) realloc(ptr, count);
+	if (ret == NULL)
+		fatal(_("%s:%d:%s: %s: can't reallocate %ld bytes of memory (%s)"),
+			file, line, where, var, (long) count, strerror(errno));
+
+	return ret;
+}
+
+/* make_number_node --- make node with the given flags */
+
+static inline NODE *
+make_number_node(unsigned int flags)
+{
+	NODE *r;
+	getnode(r);
+	memset(r, 0, sizeof(*r));
+	r->type = Node_val;
+	r->valref = 1;
+	r->flags = (flags|MALLOC|NUMBER|NUMCUR);
+	return r;
+}
+
+/* assoc_set -- set an element in an array. Does unref(sub)! */
+
+static inline void
+assoc_set(NODE *array, NODE *sub, NODE *value)
+{
+
+	NODE **lhs = assoc_lookup(array, sub);
+	unref(*lhs);
+	*lhs = value;
+	if (array->astore != NULL)
+		(*array->astore)(array, sub);
+	unref(sub);
+}
+
+/*
+ * str_terminate_f, str_terminate, str_restore: function and macros to
+ * reduce chances of typos when terminating and restoring strings.
+ * This also helps to enforce that the NODE must be in scope when we restore.
+ */
+
+static inline void
+str_terminate_f(NODE *n, char *savep)
+{
+	*savep = n->stptr[n->stlen];
+	n->stptr[n->stlen] = '\0';
+}
+
+#define str_terminate(n, save) str_terminate_f((n), &save)
+#define str_restore(n, save) (n)->stptr[(n)->stlen] = save
+
+#ifdef SIGPIPE
+#define ignore_sigpipe() signal(SIGPIPE, SIG_IGN)
+#define set_sigpipe_to_default() signal(SIGPIPE, SIG_DFL)
+#define die_via_sigpipe() (signal(SIGPIPE, SIG_DFL), kill(getpid(), SIGPIPE))
+#else
+#define ignore_sigpipe()
+#define set_sigpipe_to_default()
+#ifdef __MINGW32__
+/* 0xC0000008 is EXCEPTION_INVALID_HANDLE, somewhat appropriate for EPIPE */
+#define die_via_sigpipe() exit(0xC0000008)
+#else  /* !__MINGW32__ */
+#define die_via_sigpipe() exit(EXIT_FATAL)
+#endif	/* !__MINGW32__ */
+#endif
diff --git a/gawk-5.0.1/awkgram.c b/gawk-5.0.1/awkgram.c
new file mode 100644
index 00000000000..68cee61abd8
--- /dev/null
+++ b/gawk-5.0.1/awkgram.c
@@ -0,0 +1,9365 @@
+/* A Bison parser, made by GNU Bison 3.4.  */
+
+/* Bison implementation for Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
+   Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Undocumented macros, especially those whose name start with YY_,
+   are private implementation details.  Do not rely on them.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "3.4"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Push parsers.  */
+#define YYPUSH 0
+
+/* Pull parsers.  */
+#define YYPULL 1
+
+
+
+
+/* First part of user prologue.  */
+#line 26 "awkgram.y"
+
+#ifdef GAWKDEBUG
+#define YYDEBUG 12
+#endif
+
+#include "awk.h"
+
+#if defined(__STDC__) && __STDC__ < 1	/* VMS weirdness, maybe elsewhere */
+#define signed /**/
+#endif
+
+static void yyerror(const char *m, ...) ATTRIBUTE_PRINTF_1;
+static void error_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
+static void lintwarn_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
+static void warning_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
+static char *get_src_buf(void);
+static int yylex(void);
+int	yyparse(void);
+static INSTRUCTION *snode(INSTRUCTION *subn, INSTRUCTION *op);
+static char **check_params(char *fname, int pcount, INSTRUCTION *list);
+static int install_function(char *fname, INSTRUCTION *fi, INSTRUCTION *plist);
+static NODE *mk_rexp(INSTRUCTION *exp);
+static void param_sanity(INSTRUCTION *arglist);
+static int parms_shadow(INSTRUCTION *pc, bool *shadow);
+#ifndef NO_LINT
+static int isnoeffect(OPCODE type);
+#endif
+static INSTRUCTION *make_assignable(INSTRUCTION *ip);
+static void dumpintlstr(const char *str, size_t len);
+static void dumpintlstr2(const char *str1, size_t len1, const char *str2, size_t len2);
+static bool include_source(INSTRUCTION *file, void **srcfile_p);
+static bool load_library(INSTRUCTION *file, void **srcfile_p);
+static void set_namespace(INSTRUCTION *ns, INSTRUCTION *comment);
+static void next_sourcefile(void);
+static char *tokexpand(void);
+static NODE *set_profile_text(NODE *n, const char *str, size_t len);
+static int check_qualified_special(char *token);
+static char *qualify_name(const char *name, size_t len);
+static INSTRUCTION *trailing_comment;
+static INSTRUCTION *outer_comment;
+static INSTRUCTION *interblock_comment;
+static INSTRUCTION *pending_comment;
+static INSTRUCTION *namespace_chain;
+
+#ifdef DEBUG_COMMENTS
+static void
+debug_print_comment_s(const char *name, INSTRUCTION *comment, int line)
+{
+	if (comment != NULL)
+		fprintf(stderr, "%d: %s: <%.*s>\n", line, name,
+				(int) (comment->memory->stlen - 1),
+				comment->memory->stptr);
+}
+#define debug_print_comment(comment) \
+	 debug_print_comment_s(# comment, comment, __LINE__)
+#endif
+
+#define instruction(t)	bcalloc(t, 1, 0)
+
+static INSTRUCTION *mk_program(void);
+static INSTRUCTION *append_rule(INSTRUCTION *pattern, INSTRUCTION *action);
+static INSTRUCTION *mk_function(INSTRUCTION *fi, INSTRUCTION *def);
+static INSTRUCTION *mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, INSTRUCTION *true_branch,
+		INSTRUCTION *elsep,	INSTRUCTION *false_branch);
+static INSTRUCTION *mk_expression_list(INSTRUCTION *list, INSTRUCTION *s1);
+static INSTRUCTION *mk_for_loop(INSTRUCTION *forp, INSTRUCTION *init, INSTRUCTION *cond,
+		INSTRUCTION *incr, INSTRUCTION *body);
+static void fix_break_continue(INSTRUCTION *list, INSTRUCTION *b_target, INSTRUCTION *c_target);
+static INSTRUCTION *mk_binary(INSTRUCTION *s1, INSTRUCTION *s2, INSTRUCTION *op);
+static INSTRUCTION *mk_boolean(INSTRUCTION *left, INSTRUCTION *right, INSTRUCTION *op);
+static INSTRUCTION *mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, INSTRUCTION *op);
+static INSTRUCTION *mk_getline(INSTRUCTION *op, INSTRUCTION *opt_var, INSTRUCTION *redir, int redirtype);
+static int count_expressions(INSTRUCTION **list, bool isarg);
+static INSTRUCTION *optimize_assignment(INSTRUCTION *exp);
+static void add_lint(INSTRUCTION *list, LINTTYPE linttype);
+
+enum defref { FUNC_DEFINE, FUNC_USE, FUNC_EXT };
+static void func_use(const char *name, enum defref how);
+static void check_funcs(void);
+
+static ssize_t read_one_line(int fd, void *buffer, size_t count);
+static int one_line_close(int fd);
+static void merge_comments(INSTRUCTION *c1, INSTRUCTION *c2);
+static INSTRUCTION *make_braced_statements(INSTRUCTION *lbrace, INSTRUCTION *stmts, INSTRUCTION *rbrace);
+static void add_sign_to_num(NODE *n, char sign);
+
+static bool at_seen = false;
+static bool want_source = false;
+static bool want_regexp = false;	/* lexical scanning kludge */
+static enum {
+	FUNC_HEADER,
+	FUNC_BODY,
+	DONT_CHECK
+} want_param_names = DONT_CHECK;	/* ditto */
+static bool in_function;		/* parsing kludge */
+static int rule = 0;
+
+const char *const ruletab[] = {
+	"?",
+	"BEGIN",
+	"Rule",
+	"END",
+	"BEGINFILE",
+	"ENDFILE",
+};
+
+static bool in_print = false;	/* lexical scanning kludge for print */
+static int in_parens = 0;	/* lexical scanning kludge for print */
+static int sub_counter = 0;	/* array dimension counter for use in delete */
+static char *lexptr;		/* pointer to next char during parsing */
+static char *lexend;		/* end of buffer */
+static char *lexptr_begin;	/* keep track of where we were for error msgs */
+static char *lexeme;		/* beginning of lexeme for debugging */
+static bool lexeof;		/* seen EOF for current source? */
+static char *thisline = NULL;
+static int in_braces = 0;	/* count braces for firstline, lastline in an 'action' */
+static int lastline = 0;
+static int firstline = 0;
+static SRCFILE *sourcefile = NULL;	/* current program source */
+static int lasttok = 0;
+static bool eof_warned = false;	/* GLOBAL: want warning for each file */
+static int break_allowed;	/* kludge for break */
+static int continue_allowed;	/* kludge for continue */
+
+#define END_FILE	-1000
+#define END_SRC  	-2000
+
+#define YYDEBUG_LEXER_TEXT (lexeme)
+static char *tokstart = NULL;
+static char *tok = NULL;
+static char *tokend;
+int errcount = 0;
+
+extern char *source;
+extern int sourceline;
+extern SRCFILE *srcfiles;
+extern INSTRUCTION *rule_list;
+extern int max_args;
+extern NODE **args_array;
+
+const char awk_namespace[] = "awk";
+const char *current_namespace = awk_namespace;
+bool namespace_changed = false;
+
+static INSTRUCTION *rule_block[sizeof(ruletab)];
+
+static INSTRUCTION *ip_rec;
+static INSTRUCTION *ip_newfile;
+static INSTRUCTION *ip_atexit = NULL;
+static INSTRUCTION *ip_end;
+static INSTRUCTION *ip_endfile;
+static INSTRUCTION *ip_beginfile;
+INSTRUCTION *main_beginfile;
+static bool called_from_eval = false;
+
+static inline INSTRUCTION *list_create(INSTRUCTION *x);
+static inline INSTRUCTION *list_append(INSTRUCTION *l, INSTRUCTION *x);
+static inline INSTRUCTION *list_prepend(INSTRUCTION *l, INSTRUCTION *x);
+static inline INSTRUCTION *list_merge(INSTRUCTION *l1, INSTRUCTION *l2);
+
+extern double fmod(double x, double y);
+
+#define YYSTYPE INSTRUCTION *
+
+#line 235 "awkgram.c"
+
+# ifndef YY_NULLPTR
+#  if defined __cplusplus
+#   if 201103L <= __cplusplus
+#    define YY_NULLPTR nullptr
+#   else
+#    define YY_NULLPTR 0
+#   endif
+#  else
+#   define YY_NULLPTR ((void*)0)
+#  endif
+# endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+
+/* Debug traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token type.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+  enum yytokentype
+  {
+    FUNC_CALL = 258,
+    NAME = 259,
+    REGEXP = 260,
+    FILENAME = 261,
+    YNUMBER = 262,
+    YSTRING = 263,
+    TYPED_REGEXP = 264,
+    RELOP = 265,
+    IO_OUT = 266,
+    IO_IN = 267,
+    ASSIGNOP = 268,
+    ASSIGN = 269,
+    MATCHOP = 270,
+    CONCAT_OP = 271,
+    SUBSCRIPT = 272,
+    LEX_BEGIN = 273,
+    LEX_END = 274,
+    LEX_IF = 275,
+    LEX_ELSE = 276,
+    LEX_RETURN = 277,
+    LEX_DELETE = 278,
+    LEX_SWITCH = 279,
+    LEX_CASE = 280,
+    LEX_DEFAULT = 281,
+    LEX_WHILE = 282,
+    LEX_DO = 283,
+    LEX_FOR = 284,
+    LEX_BREAK = 285,
+    LEX_CONTINUE = 286,
+    LEX_PRINT = 287,
+    LEX_PRINTF = 288,
+    LEX_NEXT = 289,
+    LEX_EXIT = 290,
+    LEX_FUNCTION = 291,
+    LEX_BEGINFILE = 292,
+    LEX_ENDFILE = 293,
+    LEX_GETLINE = 294,
+    LEX_NEXTFILE = 295,
+    LEX_IN = 296,
+    LEX_AND = 297,
+    LEX_OR = 298,
+    INCREMENT = 299,
+    DECREMENT = 300,
+    LEX_BUILTIN = 301,
+    LEX_LENGTH = 302,
+    LEX_EOF = 303,
+    LEX_INCLUDE = 304,
+    LEX_EVAL = 305,
+    LEX_LOAD = 306,
+    LEX_NAMESPACE = 307,
+    NEWLINE = 308,
+    SLASH_BEFORE_EQUAL = 309,
+    UNARY = 310
+  };
+#endif
+/* Tokens.  */
+#define FUNC_CALL 258
+#define NAME 259
+#define REGEXP 260
+#define FILENAME 261
+#define YNUMBER 262
+#define YSTRING 263
+#define TYPED_REGEXP 264
+#define RELOP 265
+#define IO_OUT 266
+#define IO_IN 267
+#define ASSIGNOP 268
+#define ASSIGN 269
+#define MATCHOP 270
+#define CONCAT_OP 271
+#define SUBSCRIPT 272
+#define LEX_BEGIN 273
+#define LEX_END 274
+#define LEX_IF 275
+#define LEX_ELSE 276
+#define LEX_RETURN 277
+#define LEX_DELETE 278
+#define LEX_SWITCH 279
+#define LEX_CASE 280
+#define LEX_DEFAULT 281
+#define LEX_WHILE 282
+#define LEX_DO 283
+#define LEX_FOR 284
+#define LEX_BREAK 285
+#define LEX_CONTINUE 286
+#define LEX_PRINT 287
+#define LEX_PRINTF 288
+#define LEX_NEXT 289
+#define LEX_EXIT 290
+#define LEX_FUNCTION 291
+#define LEX_BEGINFILE 292
+#define LEX_ENDFILE 293
+#define LEX_GETLINE 294
+#define LEX_NEXTFILE 295
+#define LEX_IN 296
+#define LEX_AND 297
+#define LEX_OR 298
+#define INCREMENT 299
+#define DECREMENT 300
+#define LEX_BUILTIN 301
+#define LEX_LENGTH 302
+#define LEX_EOF 303
+#define LEX_INCLUDE 304
+#define LEX_EVAL 305
+#define LEX_LOAD 306
+#define LEX_NAMESPACE 307
+#define NEWLINE 308
+#define SLASH_BEFORE_EQUAL 309
+#define UNARY 310
+
+/* Value type.  */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef int YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE yylval;
+
+int yyparse (void);
+
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(Msgid) Msgid
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE
+# if (defined __GNUC__                                               \
+      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
+     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
+#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
+# else
+#  define YY_ATTRIBUTE(Spec) /* empty */
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_PURE
+# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(E) ((void) (E))
+#else
+# define YYUSE(E) /* empty */
+#endif
+
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+    _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
+#     ifndef EXIT_SUCCESS
+#      define EXIT_SUCCESS 0
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's 'empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined EXIT_SUCCESS \
+       && ! ((defined YYMALLOC || defined malloc) \
+             && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef EXIT_SUCCESS
+#    define EXIT_SUCCESS 0
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+         || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
+    do                                                                  \
+      {                                                                 \
+        YYSIZE_T yynewbytes;                                            \
+        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
+        Stack = &yyptr->Stack_alloc;                                    \
+        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+        yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                 \
+    while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(Dst, Src, Count) \
+      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
+#  else
+#   define YYCOPY(Dst, Src, Count)              \
+      do                                        \
+        {                                       \
+          YYSIZE_T yyi;                         \
+          for (yyi = 0; yyi < (Count); yyi++)   \
+            (Dst)[yyi] = (Src)[yyi];            \
+        }                                       \
+      while (0)
+#  endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  2
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   1191
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  77
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  71
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  207
+/* YYNSTATES -- Number of states.  */
+#define YYNSTATES  355
+
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   310
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex, with out-of-bounds checking.  */
+#define YYTRANSLATE(YYX)                                                \
+  ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    65,     2,     2,    68,    64,     2,     2,
+      69,    70,    62,    60,    57,    61,     2,    63,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    56,    76,
+      58,     2,    59,    55,    71,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,    72,     2,    73,    67,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    74,     2,    75,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      66
+};
+
+#if YYDEBUG
+  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
+static const yytype_uint16 yyrline[] =
+{
+       0,   232,   232,   233,   238,   248,   252,   264,   272,   286,
+     297,   307,   317,   330,   340,   342,   347,   357,   359,   364,
+     366,   368,   374,   378,   383,   413,   425,   437,   443,   452,
+     470,   471,   482,   488,   496,   497,   501,   501,   535,   534,
+     568,   583,   585,   590,   591,   611,   616,   617,   621,   632,
+     637,   644,   752,   803,   853,   979,  1000,  1021,  1031,  1041,
+    1051,  1062,  1075,  1093,  1092,  1109,  1127,  1127,  1229,  1229,
+    1262,  1292,  1300,  1301,  1307,  1308,  1315,  1320,  1333,  1348,
+    1350,  1358,  1365,  1367,  1375,  1384,  1386,  1395,  1396,  1404,
+    1409,  1409,  1422,  1428,  1440,  1444,  1466,  1467,  1473,  1474,
+    1483,  1484,  1489,  1494,  1511,  1513,  1515,  1522,  1523,  1529,
+    1530,  1535,  1537,  1544,  1546,  1554,  1559,  1570,  1571,  1576,
+    1578,  1585,  1587,  1595,  1600,  1610,  1611,  1616,  1623,  1627,
+    1629,  1631,  1644,  1661,  1671,  1678,  1680,  1685,  1687,  1689,
+    1697,  1699,  1704,  1706,  1711,  1713,  1715,  1772,  1774,  1776,
+    1778,  1780,  1782,  1784,  1786,  1800,  1805,  1810,  1835,  1841,
+    1843,  1845,  1847,  1849,  1851,  1856,  1860,  1892,  1900,  1906,
+    1912,  1925,  1926,  1927,  1932,  1937,  1941,  1945,  1960,  1981,
+    1986,  2023,  2060,  2061,  2067,  2068,  2073,  2075,  2082,  2099,
+    2116,  2118,  2125,  2130,  2136,  2147,  2159,  2168,  2172,  2177,
+    2181,  2185,  2189,  2194,  2195,  2199,  2203,  2207
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || 0
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "FUNC_CALL", "NAME", "REGEXP",
+  "FILENAME", "YNUMBER", "YSTRING", "TYPED_REGEXP", "RELOP", "IO_OUT",
+  "IO_IN", "ASSIGNOP", "ASSIGN", "MATCHOP", "CONCAT_OP", "SUBSCRIPT",
+  "LEX_BEGIN", "LEX_END", "LEX_IF", "LEX_ELSE", "LEX_RETURN", "LEX_DELETE",
+  "LEX_SWITCH", "LEX_CASE", "LEX_DEFAULT", "LEX_WHILE", "LEX_DO",
+  "LEX_FOR", "LEX_BREAK", "LEX_CONTINUE", "LEX_PRINT", "LEX_PRINTF",
+  "LEX_NEXT", "LEX_EXIT", "LEX_FUNCTION", "LEX_BEGINFILE", "LEX_ENDFILE",
+  "LEX_GETLINE", "LEX_NEXTFILE", "LEX_IN", "LEX_AND", "LEX_OR",
+  "INCREMENT", "DECREMENT", "LEX_BUILTIN", "LEX_LENGTH", "LEX_EOF",
+  "LEX_INCLUDE", "LEX_EVAL", "LEX_LOAD", "LEX_NAMESPACE", "NEWLINE",
+  "SLASH_BEFORE_EQUAL", "'?'", "':'", "','", "'<'", "'>'", "'+'", "'-'",
+  "'*'", "'/'", "'%'", "'!'", "UNARY", "'^'", "'$'", "'('", "')'", "'@'",
+  "'['", "']'", "'{'", "'}'", "';'", "$accept", "program", "rule",
+  "source", "library", "namespace", "pattern", "action", "func_name",
+  "lex_builtin", "function_prologue", "$@1", "regexp", "$@2",
+  "typed_regexp", "a_slash", "statements", "statement_term", "statement",
+  "non_compound_stmt", "$@3", "simple_stmt", "$@4", "$@5",
+  "opt_simple_stmt", "case_statements", "case_statement", "case_value",
+  "print", "print_expression_list", "output_redir", "$@6", "if_statement",
+  "nls", "opt_nls", "input_redir", "opt_param_list", "param_list",
+  "opt_exp", "opt_expression_list", "expression_list",
+  "opt_fcall_expression_list", "fcall_expression_list", "fcall_exp", "exp",
+  "assign_operator", "relop_or_less", "a_relop", "common_exp", "simp_exp",
+  "simp_exp_nc", "non_post_simp_exp", "func_call", "direct_func_call",
+  "opt_variable", "delete_subscript_list", "delete_subscript",
+  "delete_exp_list", "bracketed_exp_list", "subscript", "subscript_list",
+  "simple_variable", "variable", "opt_incdec", "l_brace", "r_brace",
+  "r_paren", "opt_semi", "semi", "colon", "comma", YY_NULLPTR
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+   (internal) symbol number NUM (which must be that of a token).  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
+     305,   306,   307,   308,   309,    63,    58,    44,    60,    62,
+      43,    45,    42,    47,    37,    33,   310,    94,    36,    40,
+      41,    64,    91,    93,   123,   125,    59
+};
+# endif
+
+#define YYPACT_NINF -283
+
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-283)))
+
+#define YYTABLE_NINF -119
+
+#define yytable_value_is_error(Yytable_value) \
+  (!!((Yytable_value) == (-119)))
+
+  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+     STATE-NUM.  */
+static const yytype_int16 yypact[] =
+{
+    -283,   316,  -283,  -283,   -45,   -28,  -283,  -283,  -283,  -283,
+     160,  -283,  -283,    23,    23,    23,   -39,   -18,  -283,  -283,
+    -283,  1047,  1047,  -283,  1047,  1075,   818,   257,  -283,    99,
+     -20,  -283,  -283,    11,  1017,   974,   378,   415,  -283,  -283,
+    -283,  -283,   329,   742,   818,  -283,     0,  -283,  -283,  -283,
+    -283,  -283,    25,     9,  -283,    22,  -283,  -283,  -283,   742,
+     742,    79,    46,    18,    46,    46,  1047,   114,  -283,  -283,
+      13,   286,    44,    47,    60,  -283,    94,  -283,  -283,  -283,
+      11,  -283,    94,  -283,   151,  -283,  -283,  1002,   162,  1047,
+    1047,  1047,    94,  -283,  -283,  -283,  1047,  1047,   132,   378,
+    1047,  1047,  1047,  1047,  1047,  1047,  1047,  1047,  1047,  1047,
+    1047,  1047,  -283,   170,  -283,  -283,   168,  1047,  -283,  -283,
+    -283,   116,    14,  -283,  1132,    76,  1132,  -283,  -283,  -283,
+    -283,  1047,  -283,   116,   116,   286,  -283,  -283,  -283,  1047,
+    -283,   144,   846,  -283,  -283,    34,    91,  -283,    39,    91,
+    -283,    59,    91,    11,  -283,   542,  -283,  -283,  -283,   145,
+    -283,   135,   580,  1113,  -283,   189,  1132,    23,   230,   230,
+      46,    46,    46,    46,   230,   230,    46,    46,    46,    46,
+    -283,  -283,  1132,  -283,  1002,   770,  -283,    27,   378,  -283,
+    -283,  1132,   162,  -283,  1132,  -283,  -283,  -283,  -283,  -283,
+    -283,  -283,   119,  -283,    12,   123,   126,    94,   128,    91,
+      91,  -283,  -283,    91,  1047,    91,    94,  -283,  -283,    91,
+    -283,  -283,  1132,  -283,   122,    94,  1047,  -283,  -283,  -283,
+    -283,  -283,  -283,   116,    73,  -283,  1047,  1047,  -283,   198,
+    1047,  1047,   660,   895,  -283,  -283,  -283,    91,  1132,  -283,
+    -283,  -283,   590,   542,    94,  -283,  -283,  1132,    94,  -283,
+      28,   286,    91,   -28,   141,   286,   286,   190,   -23,  -283,
+     122,  -283,   818,   205,  -283,   325,  -283,  -283,  -283,  -283,
+    -283,    94,  -283,  -283,   115,  -283,  -283,  -283,    94,    94,
+     153,   162,    94,    13,  -283,  -283,   660,  -283,  -283,   -20,
+     660,  1047,   116,   694,   144,  1047,   209,  -283,  -283,   286,
+      94,  1090,    94,   974,    94,   152,    94,   660,    94,   929,
+     660,  -283,   342,   176,  -283,   158,  -283,  -283,   929,   116,
+    -283,  -283,  -283,   236,   243,  -283,  -283,   176,  -283,    94,
+    -283,   116,    94,  -283,  -283,    94,  -283,    94,   660,  -283,
+     390,   660,  -283,   466,  -283
+};
+
+  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+     Performed when YYTABLE does not specify something else to do.  Zero
+     means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+       2,     0,     1,     6,     0,   193,   175,   176,    25,    26,
+       0,    27,    28,   182,     0,     0,     0,   170,     5,    94,
+      42,     0,     0,    41,     0,     0,     0,     0,     3,     0,
+       0,   165,    38,     4,    23,   136,   144,   145,   147,   171,
+     179,   195,   172,     0,     0,   190,     0,   194,    31,    30,
+      34,    35,     0,     0,    32,    98,   183,   173,   174,     0,
+       0,     0,   178,   172,   177,   166,     0,   199,   172,   113,
+       0,   111,     0,     0,     0,   180,    96,   205,     7,     8,
+      46,    43,    96,     9,     0,    95,   140,     0,     0,     0,
+       0,     0,    96,   141,   143,   142,     0,     0,     0,   146,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   138,   137,   155,   156,     0,     0,   121,    40,
+     126,     0,     0,   119,   125,     0,   111,   192,   191,    33,
+      36,     0,   154,     0,     0,     0,   197,   198,   196,   114,
+     202,     0,     0,   167,    15,     0,     0,    18,     0,     0,
+      21,     0,     0,    97,   200,     0,    47,    39,   131,   132,
+     133,   129,   130,     0,   207,   134,    24,   182,   152,   153,
+     149,   150,   151,   148,   163,   164,   160,   161,   162,   159,
+     128,   139,   127,   181,   122,     0,   189,     0,    99,   168,
+     169,   115,     0,   116,   112,    14,    10,    17,    11,    20,
+      12,    45,     0,    63,     0,     0,     0,    96,     0,     0,
+       0,    85,    86,     0,   107,     0,    96,    44,    57,     0,
+      66,    50,    71,    43,   203,    96,     0,   158,   123,   124,
+     120,   104,   102,     0,     0,   157,     0,   107,    68,     0,
+       0,     0,     0,    72,    58,    59,    60,     0,   108,    61,
+     201,    65,     0,     0,    96,   204,    48,   135,    96,   105,
+       0,     0,     0,   184,     0,     0,     0,     0,   193,    73,
+       0,    62,     0,    89,    87,     0,    49,    29,    37,   106,
+     103,    96,    64,    69,     0,   186,   188,    70,    96,    96,
+       0,     0,    96,     0,    90,    67,     0,   185,   187,     0,
+       0,     0,     0,     0,    88,     0,    92,    74,    52,     0,
+      96,     0,    96,    91,    96,     0,    96,     0,    96,    72,
+       0,    76,     0,     0,    75,     0,    53,    54,    72,     0,
+      93,    79,    82,     0,     0,    83,    84,     0,   206,    96,
+      51,     0,    96,    81,    80,    96,    43,    96,     0,    43,
+       0,     0,    56,     0,    55
+};
+
+  /* YYPGOTO[NTERM-NUM].  */
+static const yytype_int16 yypgoto[] =
+{
+    -283,  -283,  -283,  -283,  -283,  -283,  -283,   226,  -283,  -283,
+    -283,  -283,   -63,  -283,   -77,  -283,  -215,   -73,   -30,  -283,
+    -283,  -234,  -283,  -283,  -282,  -283,  -283,  -283,  -283,  -283,
+    -283,  -283,  -283,     5,   -35,  -283,  -283,  -283,    24,  -283,
+     -43,   101,  -283,   -15,    -1,  -283,  -283,  -283,   -40,    17,
+    -283,   237,  -283,    -6,    96,  -283,  -283,   -16,   -42,  -283,
+    -283,   -81,    -2,  -283,   -27,  -186,   -65,  -283,   -62,   -68,
+      -8
+};
+
+  /* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
+{
+      -1,     1,    28,   146,   149,   152,    29,    78,    53,    54,
+      30,   187,    31,    84,   120,    32,   155,    79,   217,   218,
+     237,   219,   252,   263,   270,   315,   324,   337,   220,   273,
+     295,   305,   221,   153,   154,   132,   233,   234,   247,   274,
+      70,   121,   122,   123,   222,   117,    95,    96,    35,    36,
+      37,    38,    39,    40,    55,   283,   284,   285,    45,    46,
+      47,    41,    42,   138,   223,   224,   143,   254,    82,   339,
+     142
+};
+
+  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
+     positive, shift that token.  If negative, reduce the rule whose
+     number is the opposite.  If YYTABLE_NINF, syntax error.  */
+static const yytype_int16 yytable[] =
+{
+      34,   125,    81,    81,   128,   141,    33,   160,   253,   269,
+     158,    56,    57,    58,   139,   184,   238,   127,   291,    63,
+      63,    75,    63,    68,    43,    71,    97,     5,   231,   279,
+      59,   232,   280,    63,    80,   195,   180,   329,    62,    64,
+     197,    65,   124,   126,    44,   144,   341,   156,   147,    44,
+     145,    60,    99,   148,    76,    75,   183,   164,   124,   124,
+     199,   150,   114,   115,    85,   135,   151,   276,   189,   190,
+      92,    92,    44,   196,   259,   129,   198,   139,   130,   200,
+     131,   239,     4,   140,  -118,   269,   159,   -13,   161,   162,
+     163,    25,   -16,   225,   269,   165,   166,  -100,    63,    63,
+      63,    63,    63,    63,    63,    63,    63,    63,    63,    63,
+     -13,   235,   -19,   105,   185,   -16,   182,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,   179,    63,
+      92,   350,   297,    92,   353,   -19,   244,   245,   191,   340,
+     246,   194,   249,  -101,    19,    86,   251,    19,   188,   186,
+      87,    80,    19,   321,    80,    86,   157,    80,   136,   137,
+     133,   134,   255,    48,    49,    56,     5,    77,   258,   228,
+     230,   167,   242,    76,   271,    77,    88,   322,   323,   119,
+     225,   250,   181,   124,   124,   192,   140,    44,   236,   282,
+     256,   225,   240,    93,    94,   241,   281,   243,    77,  -119,
+     288,   289,   264,    93,    94,    19,    50,    51,   292,   275,
+     302,   287,   267,   248,    80,    80,   294,   290,    80,   277,
+      80,   286,   301,   278,    80,   257,   260,   -96,   304,   293,
+     314,    52,   338,   216,   225,   261,   248,   310,   225,   265,
+     266,   312,   286,   343,   316,   336,   296,  -119,  -119,   318,
+     344,   126,    80,   299,   300,   225,    83,   303,   225,   335,
+       4,   262,    67,   227,   342,   313,   306,    80,   298,   345,
+     308,    71,   307,     0,     0,   317,   347,   319,     0,   320,
+     325,   326,     0,   328,     0,     0,   225,   327,   225,   225,
+     330,   225,   102,   103,   104,     0,    86,   105,     0,     0,
+     309,    87,   311,    63,   346,     0,    72,   348,    73,    74,
+     349,    63,   351,     0,     0,     0,     2,     3,   352,     4,
+       5,   354,     0,     6,     7,     0,   139,    88,    89,    90,
+      99,     0,     0,     0,     8,     9,  -110,     0,     0,     0,
+       0,    91,   112,   113,    93,    94,     0,     0,     0,   331,
+     332,   119,    10,    11,    12,    13,   140,     0,     0,     0,
+      14,    15,    16,    17,    18,     0,     0,     0,     0,    19,
+      20,     0,     0,   114,   115,     0,    21,    22,  -110,    23,
+       0,    24,    92,   116,    25,    26,     0,    27,     0,     0,
+     -22,   201,   -22,     4,     5,  -110,    20,     6,     7,     0,
+       0,  -110,   333,   334,     0,    23,     0,     0,     0,     0,
+     202,     0,   203,   204,   205,   -78,   -78,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,     0,     0,     0,    13,
+     215,     0,     0,     0,    14,    15,    16,    17,   100,   101,
+     102,   103,   104,   -78,    20,   105,     0,     0,     0,     0,
+      21,    22,     0,    23,     0,    24,     0,     0,    25,    26,
+       0,    61,     0,     0,    76,   -78,    77,   201,     0,     4,
+       5,     0,     0,     6,     7,   106,   107,   108,   109,   110,
+       0,     0,   111,     0,     0,     0,   202,     0,   203,   204,
+     205,   -77,   -77,   206,   207,   208,   209,   210,   211,   212,
+     213,   214,     0,     0,     0,    13,   215,     0,     0,     0,
+      14,    15,    16,    17,     0,     0,     0,     0,     0,   -77,
+      20,     0,     0,     0,     0,     0,    21,    22,     0,    23,
+       0,    24,     0,     0,    25,    26,     0,    61,     0,     0,
+      76,   -77,    77,   201,     0,     4,     5,     0,     0,     6,
+       7,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   202,     0,   203,   204,   205,     0,     0,   206,
+     207,   208,   209,   210,   211,   212,   213,   214,     0,     0,
+       0,    13,   215,     0,     0,     0,    14,    15,    16,    17,
+      86,    69,     0,     4,     5,    87,    20,     6,     7,     0,
+       0,  -109,    21,    22,     0,    23,     0,    24,     0,     0,
+      25,    26,     0,    61,     0,     0,    76,   216,    77,     0,
+       0,    88,    89,     0,     0,     0,     0,     0,     0,    13,
+       0,     0,     0,     0,    14,    15,    16,    17,    93,    94,
+       0,     0,     0,  -109,    20,     0,     0,     0,     0,     0,
+      21,    22,     0,    23,     0,    24,     0,     0,    25,   272,
+    -109,    61,     0,     4,     5,     0,  -109,     6,     7,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     202,     0,   203,   204,   205,     0,     0,   206,   207,   208,
+     209,   210,   211,   212,   213,   214,     0,     4,     5,    13,
+     215,     6,     7,     0,    14,    15,    16,    17,     0,     0,
+       0,     0,     0,     0,    20,     0,     0,     0,     0,     0,
+      21,    22,     0,    23,     0,    24,     0,     0,    25,    26,
+       0,    61,     0,    13,    76,     0,    77,     0,    14,    15,
+      16,    17,     0,   118,     0,     4,     5,     0,    20,     6,
+       7,   119,     0,     0,    21,    22,     0,    23,     0,    24,
+       0,     0,    25,    26,     0,    61,     0,     0,     0,     0,
+      77,   229,     0,     4,     5,     0,     0,     6,     7,   119,
+       0,    13,     0,     0,     0,     0,    14,    15,    16,    17,
+       0,     0,     0,     0,     0,     0,    20,     0,     0,     0,
+       0,     0,    21,    22,     0,    23,     0,    24,     0,    13,
+      25,    26,  -117,    61,    14,    15,    16,    17,     0,    69,
+       0,     4,     5,     0,    20,     6,     7,     0,     0,     0,
+      21,    22,     0,    23,     0,    24,     0,     0,    25,    26,
+       0,    61,     0,     0,     0,     0,     0,   193,     0,     4,
+       5,     0,     0,     6,     7,     0,     0,    13,     0,     0,
+       0,     0,    14,    15,    16,    17,     0,     0,     0,     0,
+       0,     0,    20,     0,     0,     0,     0,     0,    21,    22,
+       0,    23,     0,    24,     0,    13,    25,    26,     0,    61,
+      14,    15,    16,    17,     0,     0,     0,     0,     4,   268,
+      20,     0,     6,     7,     0,     0,    21,    22,     0,    23,
+       0,    24,     0,     0,    25,    26,     0,    61,   204,     0,
+       0,     0,     0,     0,     0,     0,     0,   211,   212,     0,
+       0,     0,     4,     5,    13,     0,     6,     7,     0,    14,
+      15,    16,    17,     0,     0,     0,     0,     0,     0,    20,
+       0,     0,   204,     0,     0,    21,    22,     0,    23,     0,
+      24,   211,   212,    25,    26,     0,    61,     0,    13,     0,
+       0,     0,     0,    14,    15,    16,    17,     4,     5,     0,
+       0,     6,     7,    20,     0,     0,    98,     0,     0,    21,
+      22,     0,    23,     0,    24,     0,     0,    25,    26,     0,
+      61,     0,     0,     0,     0,     4,     5,     0,     0,     6,
+       7,   119,     0,    13,     0,     0,     0,     0,    14,    15,
+      16,    17,     0,     0,     0,     0,     0,    86,    20,     0,
+       0,     0,    87,     0,    21,    22,     0,    23,     0,    24,
+       0,    13,    25,    26,     0,    61,    14,    15,    16,    17,
+       4,     5,     0,     0,     6,     7,    20,     0,    88,    89,
+      90,     0,    21,    22,     0,    23,     0,    24,     0,     0,
+      25,    26,    91,    61,    92,    93,    94,     0,     4,     5,
+       0,     0,     6,     7,     0,     0,    13,     0,     0,     0,
+       0,    14,    15,    16,    17,     0,     0,     0,     0,     0,
+      86,    20,     0,     0,     0,    87,     0,    21,    22,     0,
+      23,     0,    24,     0,     0,    25,    26,     0,    61,    14,
+      15,    16,    17,    86,     0,     0,     0,     0,    87,    20,
+       0,    88,    89,    90,     0,    21,    22,     0,    23,     0,
+      24,     0,    86,    25,    66,    91,    61,    87,    93,    94,
+       0,     0,     0,     0,    88,    89,    90,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    77,     0,    91,   226,
+       0,    93,    94,    88,    89,    90,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    91,     0,     0,
+      93,    94
+};
+
+static const yytype_int16 yycheck[] =
+{
+       1,    44,    29,    30,    46,    70,     1,    88,   223,   243,
+      87,    13,    14,    15,     1,     1,     4,    17,    41,    21,
+      22,    27,    24,    25,    69,    26,    34,     4,     1,     1,
+      69,     4,     4,    35,    29,     1,   113,   319,    21,    22,
+       1,    24,    43,    44,    72,     1,   328,    82,     1,    72,
+       6,    69,    35,     6,    74,    61,   121,    92,    59,    60,
+       1,     1,    44,    45,    53,    66,     6,   253,   133,   134,
+      57,    57,    72,   146,     1,    50,   149,     1,    69,   152,
+      58,    69,     3,    70,    70,   319,    87,    53,    89,    90,
+      91,    68,    53,   155,   328,    96,    97,    70,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
+      76,   192,    53,    67,   122,    76,   117,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   131,
+      57,   346,    17,    57,   349,    76,   209,   210,   139,   325,
+     213,   142,   215,    70,    53,    10,   219,    53,   131,    73,
+      15,   146,    53,     1,   149,    10,     5,   152,    44,    45,
+      59,    60,   224,     3,     4,   167,     4,    76,   233,   184,
+     185,    39,   207,    74,   247,    76,    41,    25,    26,     9,
+     242,   216,    14,   184,   185,    41,    70,    72,    69,   262,
+     225,   253,    69,    58,    59,    69,   261,    69,    76,    10,
+     265,   266,     4,    58,    59,    53,    46,    47,   270,   252,
+     291,    70,   242,   214,   209,   210,    11,    27,   213,   254,
+     215,   263,    69,   258,   219,   226,   234,    75,   293,   272,
+      21,    71,    56,    75,   296,   236,   237,   302,   300,   240,
+     241,   303,   284,     7,   309,   322,   281,    58,    59,   311,
+       7,   252,   247,   288,   289,   317,    30,   292,   320,   322,
+       3,   237,    25,   167,   329,   305,   296,   262,   284,   337,
+     300,   272,   299,    -1,    -1,   310,   341,   312,    -1,   314,
+     315,   316,    -1,   318,    -1,    -1,   348,   317,   350,   351,
+     320,   353,    62,    63,    64,    -1,    10,    67,    -1,    -1,
+     301,    15,   303,   305,   339,    -1,    49,   342,    51,    52,
+     345,   313,   347,    -1,    -1,    -1,     0,     1,   348,     3,
+       4,   351,    -1,     7,     8,    -1,     1,    41,    42,    43,
+     313,    -1,    -1,    -1,    18,    19,    11,    -1,    -1,    -1,
+      -1,    55,    13,    14,    58,    59,    -1,    -1,    -1,     7,
+       8,     9,    36,    37,    38,    39,    70,    -1,    -1,    -1,
+      44,    45,    46,    47,    48,    -1,    -1,    -1,    -1,    53,
+      54,    -1,    -1,    44,    45,    -1,    60,    61,    53,    63,
+      -1,    65,    57,    54,    68,    69,    -1,    71,    -1,    -1,
+      74,     1,    76,     3,     4,    70,    54,     7,     8,    -1,
+      -1,    76,    60,    61,    -1,    63,    -1,    -1,    -1,    -1,
+      20,    -1,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    -1,    -1,    -1,    39,
+      40,    -1,    -1,    -1,    44,    45,    46,    47,    60,    61,
+      62,    63,    64,    53,    54,    67,    -1,    -1,    -1,    -1,
+      60,    61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,
+      -1,    71,    -1,    -1,    74,    75,    76,     1,    -1,     3,
+       4,    -1,    -1,     7,     8,    60,    61,    62,    63,    64,
+      -1,    -1,    67,    -1,    -1,    -1,    20,    -1,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    -1,    -1,    -1,    39,    40,    -1,    -1,    -1,
+      44,    45,    46,    47,    -1,    -1,    -1,    -1,    -1,    53,
+      54,    -1,    -1,    -1,    -1,    -1,    60,    61,    -1,    63,
+      -1,    65,    -1,    -1,    68,    69,    -1,    71,    -1,    -1,
+      74,    75,    76,     1,    -1,     3,     4,    -1,    -1,     7,
+       8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    20,    -1,    22,    23,    24,    -1,    -1,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    -1,    -1,
+      -1,    39,    40,    -1,    -1,    -1,    44,    45,    46,    47,
+      10,     1,    -1,     3,     4,    15,    54,     7,     8,    -1,
+      -1,    11,    60,    61,    -1,    63,    -1,    65,    -1,    -1,
+      68,    69,    -1,    71,    -1,    -1,    74,    75,    76,    -1,
+      -1,    41,    42,    -1,    -1,    -1,    -1,    -1,    -1,    39,
+      -1,    -1,    -1,    -1,    44,    45,    46,    47,    58,    59,
+      -1,    -1,    -1,    53,    54,    -1,    -1,    -1,    -1,    -1,
+      60,    61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,
+      70,    71,    -1,     3,     4,    -1,    76,     7,     8,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      20,    -1,    22,    23,    24,    -1,    -1,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    -1,     3,     4,    39,
+      40,     7,     8,    -1,    44,    45,    46,    47,    -1,    -1,
+      -1,    -1,    -1,    -1,    54,    -1,    -1,    -1,    -1,    -1,
+      60,    61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,
+      -1,    71,    -1,    39,    74,    -1,    76,    -1,    44,    45,
+      46,    47,    -1,     1,    -1,     3,     4,    -1,    54,     7,
+       8,     9,    -1,    -1,    60,    61,    -1,    63,    -1,    65,
+      -1,    -1,    68,    69,    -1,    71,    -1,    -1,    -1,    -1,
+      76,     1,    -1,     3,     4,    -1,    -1,     7,     8,     9,
+      -1,    39,    -1,    -1,    -1,    -1,    44,    45,    46,    47,
+      -1,    -1,    -1,    -1,    -1,    -1,    54,    -1,    -1,    -1,
+      -1,    -1,    60,    61,    -1,    63,    -1,    65,    -1,    39,
+      68,    69,    70,    71,    44,    45,    46,    47,    -1,     1,
+      -1,     3,     4,    -1,    54,     7,     8,    -1,    -1,    -1,
+      60,    61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,
+      -1,    71,    -1,    -1,    -1,    -1,    -1,     1,    -1,     3,
+       4,    -1,    -1,     7,     8,    -1,    -1,    39,    -1,    -1,
+      -1,    -1,    44,    45,    46,    47,    -1,    -1,    -1,    -1,
+      -1,    -1,    54,    -1,    -1,    -1,    -1,    -1,    60,    61,
+      -1,    63,    -1,    65,    -1,    39,    68,    69,    -1,    71,
+      44,    45,    46,    47,    -1,    -1,    -1,    -1,     3,     4,
+      54,    -1,     7,     8,    -1,    -1,    60,    61,    -1,    63,
+      -1,    65,    -1,    -1,    68,    69,    -1,    71,    23,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    32,    33,    -1,
+      -1,    -1,     3,     4,    39,    -1,     7,     8,    -1,    44,
+      45,    46,    47,    -1,    -1,    -1,    -1,    -1,    -1,    54,
+      -1,    -1,    23,    -1,    -1,    60,    61,    -1,    63,    -1,
+      65,    32,    33,    68,    69,    -1,    71,    -1,    39,    -1,
+      -1,    -1,    -1,    44,    45,    46,    47,     3,     4,    -1,
+      -1,     7,     8,    54,    -1,    -1,    12,    -1,    -1,    60,
+      61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,    -1,
+      71,    -1,    -1,    -1,    -1,     3,     4,    -1,    -1,     7,
+       8,     9,    -1,    39,    -1,    -1,    -1,    -1,    44,    45,
+      46,    47,    -1,    -1,    -1,    -1,    -1,    10,    54,    -1,
+      -1,    -1,    15,    -1,    60,    61,    -1,    63,    -1,    65,
+      -1,    39,    68,    69,    -1,    71,    44,    45,    46,    47,
+       3,     4,    -1,    -1,     7,     8,    54,    -1,    41,    42,
+      43,    -1,    60,    61,    -1,    63,    -1,    65,    -1,    -1,
+      68,    69,    55,    71,    57,    58,    59,    -1,     3,     4,
+      -1,    -1,     7,     8,    -1,    -1,    39,    -1,    -1,    -1,
+      -1,    44,    45,    46,    47,    -1,    -1,    -1,    -1,    -1,
+      10,    54,    -1,    -1,    -1,    15,    -1,    60,    61,    -1,
+      63,    -1,    65,    -1,    -1,    68,    69,    -1,    71,    44,
+      45,    46,    47,    10,    -1,    -1,    -1,    -1,    15,    54,
+      -1,    41,    42,    43,    -1,    60,    61,    -1,    63,    -1,
+      65,    -1,    10,    68,    69,    55,    71,    15,    58,    59,
+      -1,    -1,    -1,    -1,    41,    42,    43,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    76,    -1,    55,    56,
+      -1,    58,    59,    41,    42,    43,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    55,    -1,    -1,
+      58,    59
+};
+
+  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+     symbol of state STATE-NUM.  */
+static const yytype_uint8 yystos[] =
+{
+       0,    78,     0,     1,     3,     4,     7,     8,    18,    19,
+      36,    37,    38,    39,    44,    45,    46,    47,    48,    53,
+      54,    60,    61,    63,    65,    68,    69,    71,    79,    83,
+      87,    89,    92,   110,   121,   125,   126,   127,   128,   129,
+     130,   138,   139,    69,    72,   135,   136,   137,     3,     4,
+      46,    47,    71,    85,    86,   131,   139,   139,   139,    69,
+      69,    71,   126,   139,   126,   126,    69,   128,   139,     1,
+     117,   121,    49,    51,    52,   130,    74,    76,    84,    94,
+     110,   141,   145,    84,    90,    53,    10,    15,    41,    42,
+      43,    55,    57,    58,    59,   123,   124,   147,    12,   126,
+      60,    61,    62,    63,    64,    67,    60,    61,    62,    63,
+      64,    67,    13,    14,    44,    45,    54,   122,     1,     9,
+      91,   118,   119,   120,   121,   117,   121,    17,   135,    50,
+      69,    58,   112,   118,   118,   121,    44,    45,   140,     1,
+      70,   143,   147,   143,     1,     6,    80,     1,     6,    81,
+       1,     6,    82,   110,   111,    93,   111,     5,    91,   121,
+     138,   121,   121,   121,   111,   121,   121,    39,   126,   126,
+     126,   126,   126,   126,   126,   126,   126,   126,   126,   126,
+      91,    14,   121,   143,     1,   147,    73,    88,   126,   143,
+     143,   121,    41,     1,   121,     1,    94,     1,    94,     1,
+      94,     1,    20,    22,    23,    24,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    40,    75,    95,    96,    98,
+     105,   109,   121,   141,   142,   145,    56,   131,   120,     1,
+     120,     1,     4,   113,   114,   138,    69,    97,     4,    69,
+      69,    69,   111,    69,    94,    94,    94,   115,   121,    94,
+     111,    94,    99,    93,   144,   145,   111,   121,   143,     1,
+     147,   121,   115,   100,     4,   121,   121,    95,     4,    98,
+     101,    94,    69,   106,   116,   117,   142,   111,   111,     1,
+       4,   143,    94,   132,   133,   134,   135,    70,   143,   143,
+      27,    41,   145,   117,    11,   107,   111,    17,   134,   111,
+     111,    69,   138,   111,   143,   108,    95,   141,    95,   121,
+     143,   121,   145,   125,    21,   102,   143,   111,   145,   111,
+     111,     1,    25,    26,   103,   111,   111,    95,   111,   101,
+      95,     7,     8,    60,    61,    89,    91,   104,    56,   146,
+     142,   101,   143,     7,     7,   146,   111,   143,   111,   111,
+      93,   111,    95,    93,    95
+};
+
+  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    77,    78,    78,    78,    78,    78,    79,    79,    79,
+      79,    79,    79,    80,    80,    80,    81,    81,    81,    82,
+      82,    82,    83,    83,    83,    83,    83,    83,    83,    84,
+      85,    85,    85,    85,    86,    86,    88,    87,    90,    89,
+      91,    92,    92,    93,    93,    93,    94,    94,    95,    95,
+      95,    95,    95,    95,    95,    95,    95,    95,    96,    96,
+      96,    96,    96,    97,    96,    96,    99,    98,   100,    98,
+      98,    98,   101,   101,   102,   102,   102,   103,   103,   104,
+     104,   104,   104,   104,   104,   105,   105,   106,   106,   107,
+     108,   107,   109,   109,   110,   110,   111,   111,   112,   112,
+     113,   113,   114,   114,   114,   114,   114,   115,   115,   116,
+     116,   117,   117,   117,   117,   117,   117,   118,   118,   119,
+     119,   119,   119,   119,   119,   120,   120,   121,   121,   121,
+     121,   121,   121,   121,   121,   121,   121,   122,   122,   122,
+     123,   123,   124,   124,   125,   125,   125,   126,   126,   126,
+     126,   126,   126,   126,   126,   126,   126,   126,   127,   127,
+     127,   127,   127,   127,   127,   128,   128,   128,   128,   128,
+     128,   128,   128,   128,   128,   128,   128,   128,   128,   129,
+     129,   130,   131,   131,   132,   132,   133,   133,   134,   135,
+     136,   136,   137,   138,   138,   139,   139,   140,   140,   140,
+     141,   142,   143,   144,   144,   145,   146,   147
+};
+
+  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     0,     2,     2,     2,     2,     2,     2,     2,
+       4,     4,     4,     1,     2,     1,     1,     2,     1,     1,
+       2,     1,     0,     1,     3,     1,     1,     1,     1,     5,
+       1,     1,     1,     2,     1,     1,     0,     7,     0,     3,
+       1,     1,     1,     0,     2,     2,     1,     2,     2,     3,
+       1,     9,     6,     8,     8,    12,    11,     1,     2,     2,
+       2,     2,     3,     0,     4,     2,     0,     4,     0,     4,
+       4,     1,     0,     1,     0,     2,     2,     5,     4,     1,
+       2,     2,     1,     1,     1,     1,     1,     1,     3,     0,
+       0,     3,     6,     9,     1,     2,     0,     1,     0,     2,
+       0,     1,     1,     3,     1,     2,     3,     0,     1,     0,
+       1,     1,     3,     1,     2,     3,     3,     0,     1,     1,
+       3,     1,     2,     3,     3,     1,     1,     3,     3,     3,
+       3,     3,     3,     3,     3,     5,     1,     1,     1,     2,
+       1,     1,     1,     1,     1,     1,     2,     1,     3,     3,
+       3,     3,     3,     3,     3,     2,     2,     5,     4,     3,
+       3,     3,     3,     3,     3,     1,     2,     3,     4,     4,
+       1,     1,     1,     2,     2,     1,     1,     2,     2,     1,
+       2,     4,     0,     1,     0,     2,     1,     2,     1,     3,
+       1,     2,     2,     1,     2,     1,     3,     1,     1,     0,
+       2,     2,     1,     0,     1,     1,     1,     2
+};
+
+
+#define yyerrok         (yyerrstatus = 0)
+#define yyclearin       (yychar = YYEMPTY)
+#define YYEMPTY         (-2)
+#define YYEOF           0
+
+#define YYACCEPT        goto yyacceptlab
+#define YYABORT         goto yyabortlab
+#define YYERROR         goto yyerrorlab
+
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                    \
+  do                                                              \
+    if (yychar == YYEMPTY)                                        \
+      {                                                           \
+        yychar = (Token);                                         \
+        yylval = (Value);                                         \
+        YYPOPSTACK (yylen);                                       \
+        yystate = *yyssp;                                         \
+        goto yybackup;                                            \
+      }                                                           \
+    else                                                          \
+      {                                                           \
+        yyerror (YY_("syntax error: cannot back up")); \
+        YYERROR;                                                  \
+      }                                                           \
+  while (0)
+
+/* Error token number */
+#define YYTERROR        1
+#define YYERRCODE       256
+
+
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                        \
+do {                                            \
+  if (yydebug)                                  \
+    YYFPRINTF Args;                             \
+} while (0)
+
+/* This macro is provided for backward compatibility. */
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
+
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
+do {                                                                      \
+  if (yydebug)                                                            \
+    {                                                                     \
+      YYFPRINTF (stderr, "%s ", Title);                                   \
+      yy_symbol_print (stderr,                                            \
+                  Type, Value); \
+      YYFPRINTF (stderr, "\n");                                           \
+    }                                                                     \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO.  |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep)
+{
+  FILE *yyoutput = yyo;
+  YYUSE (yyoutput);
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyo, yytoknum[yytype], *yyvaluep);
+# endif
+  YYUSE (yytype);
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO.  |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep)
+{
+  YYFPRINTF (yyo, "%s %s (",
+             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+
+  yy_symbol_value_print (yyo, yytype, yyvaluep);
+  YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)                            \
+do {                                                            \
+  if (yydebug)                                                  \
+    yy_stack_print ((Bottom), (Top));                           \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
+{
+  unsigned long yylno = yyrline[yyrule];
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+             yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr,
+                       yystos[yyssp[yyi + 1 - yynrhs]],
+                       &yyvsp[(yyi + 1) - (yynrhs)]
+                                              );
+      YYFPRINTF (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)          \
+do {                                    \
+  if (yydebug)                          \
+    yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+yystrlen (const char *yystr)
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+        switch (*++yyp)
+          {
+          case '\'':
+          case ',':
+            goto do_not_strip_quotes;
+
+          case '\\':
+            if (*++yyp != '\\')
+              goto do_not_strip_quotes;
+            else
+              goto append;
+
+          append:
+          default:
+            if (yyres)
+              yyres[yyn] = *yyp;
+            yyn++;
+            break;
+
+          case '"':
+            if (yyres)
+              yyres[yyn] = '\0';
+            return yyn;
+          }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return (YYSIZE_T) (yystpcpy (yyres, yystr) - yyres);
+}
+# endif
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+   about the unexpected token YYTOKEN for the state stack whose top is
+   YYSSP.
+
+   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
+   not large enough to hold the message.  In that case, also set
+   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
+   required number of bytes is too large to store.  */
+static int
+yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+                yytype_int16 *yyssp, int yytoken)
+{
+  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
+  YYSIZE_T yysize = yysize0;
+  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+  /* Internationalized format string. */
+  const char *yyformat = YY_NULLPTR;
+  /* Arguments of yyformat. */
+  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+  /* Number of reported tokens (one for the "unexpected", one per
+     "expected"). */
+  int yycount = 0;
+
+  /* There are many possibilities here to consider:
+     - If this state is a consistent state with a default action, then
+       the only way this function was invoked is if the default action
+       is an error action.  In that case, don't check for expected
+       tokens because there are none.
+     - The only way there can be no lookahead present (in yychar) is if
+       this state is a consistent state with a default action.  Thus,
+       detecting the absence of a lookahead is sufficient to determine
+       that there is no unexpected or expected token to report.  In that
+       case, just report a simple "syntax error".
+     - Don't assume there isn't a lookahead just because this state is a
+       consistent state with a default action.  There might have been a
+       previous inconsistent state, consistent state with a non-default
+       action, or user semantic action that manipulated yychar.
+     - Of course, the expected token list depends on states to have
+       correct lookahead information, and it depends on the parser not
+       to perform extra reductions after fetching a lookahead from the
+       scanner and before detecting a syntax error.  Thus, state merging
+       (from LALR or IELR) and default reductions corrupt the expected
+       token list.  However, the list is correct for canonical LR with
+       one exception: it will still contain any token that will not be
+       accepted due to an error action in a later state.
+  */
+  if (yytoken != YYEMPTY)
+    {
+      int yyn = yypact[*yyssp];
+      yyarg[yycount++] = yytname[yytoken];
+      if (!yypact_value_is_default (yyn))
+        {
+          /* Start YYX at -YYN if negative to avoid negative indexes in
+             YYCHECK.  In other words, skip the first -YYN actions for
+             this state because they are default actions.  */
+          int yyxbegin = yyn < 0 ? -yyn : 0;
+          /* Stay within bounds of both yycheck and yytname.  */
+          int yychecklim = YYLAST - yyn + 1;
+          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+          int yyx;
+
+          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
+                && !yytable_value_is_error (yytable[yyx + yyn]))
+              {
+                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+                  {
+                    yycount = 1;
+                    yysize = yysize0;
+                    break;
+                  }
+                yyarg[yycount++] = yytname[yyx];
+                {
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
+                  if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+                    yysize = yysize1;
+                  else
+                    return 2;
+                }
+              }
+        }
+    }
+
+  switch (yycount)
+    {
+# define YYCASE_(N, S)                      \
+      case N:                               \
+        yyformat = S;                       \
+      break
+    default: /* Avoid compiler warnings. */
+      YYCASE_(0, YY_("syntax error"));
+      YYCASE_(1, YY_("syntax error, unexpected %s"));
+      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+# undef YYCASE_
+    }
+
+  {
+    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
+    if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+      yysize = yysize1;
+    else
+      return 2;
+  }
+
+  if (*yymsg_alloc < yysize)
+    {
+      *yymsg_alloc = 2 * yysize;
+      if (! (yysize <= *yymsg_alloc
+             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+      return 1;
+    }
+
+  /* Avoid sprintf, as that infringes on the user's name space.
+     Don't have undefined behavior even if the translation
+     produced a string with the wrong number of "%s"s.  */
+  {
+    char *yyp = *yymsg;
+    int yyi = 0;
+    while ((*yyp = *yyformat) != '\0')
+      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+        {
+          yyp += yytnamerr (yyp, yyarg[yyi++]);
+          yyformat += 2;
+        }
+      else
+        {
+          yyp++;
+          yyformat++;
+        }
+  }
+  return 0;
+}
+#endif /* YYERROR_VERBOSE */
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+{
+  YYUSE (yyvaluep);
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  YYUSE (yytype);
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+int
+yyparse (void)
+{
+    int yystate;
+    /* Number of tokens to shift before error messages enabled.  */
+    int yyerrstatus;
+
+    /* The stacks and their tools:
+       'yyss': related to states.
+       'yyvs': related to semantic values.
+
+       Refer to the stacks through separate pointers, to allow yyoverflow
+       to reallocate them elsewhere.  */
+
+    /* The state stack.  */
+    yytype_int16 yyssa[YYINITDEPTH];
+    yytype_int16 *yyss;
+    yytype_int16 *yyssp;
+
+    /* The semantic value stack.  */
+    YYSTYPE yyvsa[YYINITDEPTH];
+    YYSTYPE *yyvs;
+    YYSTYPE *yyvsp;
+
+    YYSIZE_T yystacksize;
+
+  int yyn;
+  int yyresult;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  yyssp = yyss = yyssa;
+  yyvsp = yyvs = yyvsa;
+  yystacksize = YYINITDEPTH;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY; /* Cause a token to be read.  */
+  goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yynewstate -- set current state (the top of the stack) to yystate.  |
+`--------------------------------------------------------------------*/
+yysetstate:
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+  YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+  *yyssp = (yytype_int16) yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+    goto yyexhaustedlab;
+#else
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = (YYSIZE_T) (yyssp - yyss + 1);
+
+# if defined yyoverflow
+      {
+        /* Give user a chance to reallocate the stack.  Use copies of
+           these so that the &'s don't force the real ones into
+           memory.  */
+        YYSTYPE *yyvs1 = yyvs;
+        yytype_int16 *yyss1 = yyss;
+
+        /* Each stack pointer address is followed by the size of the
+           data in use in that stack, in bytes.  This used to be a
+           conditional around just the two extra args, but that might
+           be undefined if yyoverflow is a macro.  */
+        yyoverflow (YY_("memory exhausted"),
+                    &yyss1, yysize * sizeof (*yyssp),
+                    &yyvs1, yysize * sizeof (*yyvsp),
+                    &yystacksize);
+        yyss = yyss1;
+        yyvs = yyvs1;
+      }
+# else /* defined YYSTACK_RELOCATE */
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+        goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+        yystacksize = YYMAXDEPTH;
+
+      {
+        yytype_int16 *yyss1 = yyss;
+        union yyalloc *yyptr =
+          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+        if (! yyptr)
+          goto yyexhaustedlab;
+        YYSTACK_RELOCATE (yyss_alloc, yyss);
+        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+        if (yyss1 != yyssa)
+          YYSTACK_FREE (yyss1);
+      }
+# endif
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                  (unsigned long) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+        YYABORT;
+    }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
+  goto yybackup;
+
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+  /* Do appropriate processing given the current state.  Read a
+     lookahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+  yyn = yypact[yystate];
+  if (yypact_value_is_default (yyn))
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = yylex ();
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yytable_value_is_error (yyn))
+        goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the lookahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
+
+  yystate = yyn;
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     '$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+  case 2:
+#line 232 "awkgram.y"
+    { yyval = NULL; }
+#line 1917 "awkgram.c"
+    break;
+
+  case 3:
+#line 234 "awkgram.y"
+    {
+		rule = 0;
+		yyerrok;
+	  }
+#line 1926 "awkgram.c"
+    break;
+
+  case 4:
+#line 239 "awkgram.y"
+    {
+		if (yyvsp[0] != NULL) {
+			if (yyvsp[-1] == NULL)
+				outer_comment = yyvsp[0];
+			else
+				interblock_comment = yyvsp[0];
+		}
+		yyval = yyvsp[-1];
+	  }
+#line 1940 "awkgram.c"
+    break;
+
+  case 5:
+#line 249 "awkgram.y"
+    {
+		next_sourcefile();
+	  }
+#line 1948 "awkgram.c"
+    break;
+
+  case 6:
+#line 253 "awkgram.y"
+    {
+		rule = 0;
+		/*
+		 * If errors, give up, don't produce an infinite
+		 * stream of syntax error messages.
+		 */
+  		/* yyerrok; */
+	  }
+#line 1961 "awkgram.c"
+    break;
+
+  case 7:
+#line 265 "awkgram.y"
+    {
+		(void) append_rule(yyvsp[-1], yyvsp[0]);
+		if (pending_comment != NULL) {
+			interblock_comment = pending_comment;
+			pending_comment = NULL;
+		}
+	  }
+#line 1973 "awkgram.c"
+    break;
+
+  case 8:
+#line 273 "awkgram.y"
+    {
+		if (rule != Rule) {
+			msg(_("%s blocks must have an action part"), ruletab[rule]);
+			errcount++;
+		} else if (yyvsp[-1] == NULL) {
+			msg(_("each rule must have a pattern or an action part"));
+			errcount++;
+		} else {	/* pattern rule with non-empty pattern */
+			if (yyvsp[0] != NULL)
+				list_append(yyvsp[-1], yyvsp[0]);
+			(void) append_rule(yyvsp[-1], NULL);
+		}
+	  }
+#line 1991 "awkgram.c"
+    break;
+
+  case 9:
+#line 287 "awkgram.y"
+    {
+		in_function = false;
+		(void) mk_function(yyvsp[-1], yyvsp[0]);
+		want_param_names = DONT_CHECK;
+		if (pending_comment != NULL) {
+			interblock_comment = pending_comment;
+			pending_comment = NULL;
+		}
+		yyerrok;
+	  }
+#line 2006 "awkgram.c"
+    break;
+
+  case 10:
+#line 298 "awkgram.y"
+    {
+		want_source = false;
+		at_seen = false;
+		if (yyvsp[-1] != NULL && yyvsp[0] != NULL) {
+			SRCFILE *s = (SRCFILE *) yyvsp[-1];
+			s->comment = yyvsp[0];
+		}
+		yyerrok;
+	  }
+#line 2020 "awkgram.c"
+    break;
+
+  case 11:
+#line 308 "awkgram.y"
+    {
+		want_source = false;
+		at_seen = false;
+		if (yyvsp[-1] != NULL && yyvsp[0] != NULL) {
+			SRCFILE *s = (SRCFILE *) yyvsp[-1];
+			s->comment = yyvsp[0];
+		}
+		yyerrok;
+	  }
+#line 2034 "awkgram.c"
+    break;
+
+  case 12:
+#line 318 "awkgram.y"
+    {
+		want_source = false;
+		at_seen = false;
+
+		// this frees $3 storage in all cases
+		set_namespace(yyvsp[-1], yyvsp[0]);
+
+		yyerrok;
+	  }
+#line 2048 "awkgram.c"
+    break;
+
+  case 13:
+#line 331 "awkgram.y"
+    {
+		void *srcfile = NULL;
+
+		if (! include_source(yyvsp[0], & srcfile))
+			YYABORT;
+		efree(yyvsp[0]->lextok);
+		bcfree(yyvsp[0]);
+		yyval = (INSTRUCTION *) srcfile;
+	  }
+#line 2062 "awkgram.c"
+    break;
+
+  case 14:
+#line 341 "awkgram.y"
+    { yyval = NULL; }
+#line 2068 "awkgram.c"
+    break;
+
+  case 15:
+#line 343 "awkgram.y"
+    { yyval = NULL; }
+#line 2074 "awkgram.c"
+    break;
+
+  case 16:
+#line 348 "awkgram.y"
+    {
+		void *srcfile;
+
+		if (! load_library(yyvsp[0], & srcfile))
+			YYABORT;
+		efree(yyvsp[0]->lextok);
+		bcfree(yyvsp[0]);
+		yyval = (INSTRUCTION *) srcfile;
+	  }
+#line 2088 "awkgram.c"
+    break;
+
+  case 17:
+#line 358 "awkgram.y"
+    { yyval = NULL; }
+#line 2094 "awkgram.c"
+    break;
+
+  case 18:
+#line 360 "awkgram.y"
+    { yyval = NULL; }
+#line 2100 "awkgram.c"
+    break;
+
+  case 19:
+#line 365 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 2106 "awkgram.c"
+    break;
+
+  case 20:
+#line 367 "awkgram.y"
+    { yyval = NULL; }
+#line 2112 "awkgram.c"
+    break;
+
+  case 21:
+#line 369 "awkgram.y"
+    { yyval = NULL; }
+#line 2118 "awkgram.c"
+    break;
+
+  case 22:
+#line 374 "awkgram.y"
+    {
+		rule = Rule;
+		yyval = NULL;
+	  }
+#line 2127 "awkgram.c"
+    break;
+
+  case 23:
+#line 379 "awkgram.y"
+    {
+		rule = Rule;
+	  }
+#line 2135 "awkgram.c"
+    break;
+
+  case 24:
+#line 384 "awkgram.y"
+    {
+		INSTRUCTION *tp;
+
+		add_lint(yyvsp[-2], LINT_assign_in_cond);
+		add_lint(yyvsp[0], LINT_assign_in_cond);
+
+		tp = instruction(Op_no_op);
+		list_prepend(yyvsp[-2], bcalloc(Op_line_range, !!do_pretty_print + 1, 0));
+		yyvsp[-2]->nexti->triggered = false;
+		yyvsp[-2]->nexti->target_jmp = yyvsp[0]->nexti;
+
+		list_append(yyvsp[-2], instruction(Op_cond_pair));
+		yyvsp[-2]->lasti->line_range = yyvsp[-2]->nexti;
+		yyvsp[-2]->lasti->target_jmp = tp;
+
+		list_append(yyvsp[0], instruction(Op_cond_pair));
+		yyvsp[0]->lasti->line_range = yyvsp[-2]->nexti;
+		yyvsp[0]->lasti->target_jmp = tp;
+		if (do_pretty_print) {
+			(yyvsp[-2]->nexti + 1)->condpair_left = yyvsp[-2]->lasti;
+			(yyvsp[-2]->nexti + 1)->condpair_right = yyvsp[0]->lasti;
+		}
+		/* Put any comments in front of the range expression */
+		if (yyvsp[-1] != NULL)
+			yyval = list_append(list_merge(list_prepend(yyvsp[-2], yyvsp[-1]), yyvsp[0]), tp);
+		else
+			yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), tp);
+		rule = Rule;
+	  }
+#line 2169 "awkgram.c"
+    break;
+
+  case 25:
+#line 414 "awkgram.y"
+    {
+		static int begin_seen = 0;
+
+		if (do_lint_old && ++begin_seen == 2)
+			warning_ln(yyvsp[0]->source_line,
+				_("old awk does not support multiple `BEGIN' or `END' rules"));
+
+		yyvsp[0]->in_rule = rule = BEGIN;
+		yyvsp[0]->source_file = source;
+		yyval = yyvsp[0];
+	  }
+#line 2185 "awkgram.c"
+    break;
+
+  case 26:
+#line 426 "awkgram.y"
+    {
+		static int end_seen = 0;
+
+		if (do_lint_old && ++end_seen == 2)
+			warning_ln(yyvsp[0]->source_line,
+				_("old awk does not support multiple `BEGIN' or `END' rules"));
+
+		yyvsp[0]->in_rule = rule = END;
+		yyvsp[0]->source_file = source;
+		yyval = yyvsp[0];
+	  }
+#line 2201 "awkgram.c"
+    break;
+
+  case 27:
+#line 438 "awkgram.y"
+    {
+		yyvsp[0]->in_rule = rule = BEGINFILE;
+		yyvsp[0]->source_file = source;
+		yyval = yyvsp[0];
+	  }
+#line 2211 "awkgram.c"
+    break;
+
+  case 28:
+#line 444 "awkgram.y"
+    {
+		yyvsp[0]->in_rule = rule = ENDFILE;
+		yyvsp[0]->source_file = source;
+		yyval = yyvsp[0];
+	  }
+#line 2221 "awkgram.c"
+    break;
+
+  case 29:
+#line 453 "awkgram.y"
+    {
+		INSTRUCTION *ip = make_braced_statements(yyvsp[-4], yyvsp[-3], yyvsp[-2]);
+
+		if (yyvsp[-2] != NULL && yyvsp[0] != NULL) {
+			merge_comments(yyvsp[-2], yyvsp[0]);
+			pending_comment = yyvsp[-2];
+		} else if (yyvsp[-2] != NULL) {
+			pending_comment = yyvsp[-2];
+		} else if (yyvsp[0] != NULL) {
+			pending_comment = yyvsp[0];
+		}
+
+		yyval = ip;
+	  }
+#line 2240 "awkgram.c"
+    break;
+
+  case 31:
+#line 472 "awkgram.y"
+    {
+		const char *name = yyvsp[0]->lextok;
+		char *qname = qualify_name(name, strlen(name));
+
+		if (qname != name) {
+			efree((void *)name);
+			yyvsp[0]->lextok = qname;
+		}
+		yyval = yyvsp[0];
+	  }
+#line 2255 "awkgram.c"
+    break;
+
+  case 32:
+#line 483 "awkgram.y"
+    {
+		yyerror(_("`%s' is a built-in function, it cannot be redefined"),
+					tokstart);
+		YYABORT;
+	  }
+#line 2265 "awkgram.c"
+    break;
+
+  case 33:
+#line 489 "awkgram.y"
+    {
+		yyval = yyvsp[0];
+		at_seen = false;
+	  }
+#line 2274 "awkgram.c"
+    break;
+
+  case 36:
+#line 501 "awkgram.y"
+    { want_param_names = FUNC_HEADER; }
+#line 2280 "awkgram.c"
+    break;
+
+  case 37:
+#line 502 "awkgram.y"
+    {
+		INSTRUCTION *func_comment = NULL;
+		// Merge any comments found in the parameter list with those
+		// following the function header, associate the whole shebang
+		// with the function as one block comment.
+		if (yyvsp[-2] != NULL && yyvsp[-2]->comment != NULL) {
+			if (yyvsp[0] != NULL) {
+				merge_comments(yyvsp[-2]->comment, yyvsp[0]);
+			}
+			func_comment = yyvsp[-2]->comment;
+		} else if (yyvsp[0] != NULL) {
+			func_comment = yyvsp[0];
+		}
+
+		yyvsp[-6]->source_file = source;
+		yyvsp[-6]->comment = func_comment;
+		if (install_function(yyvsp[-5]->lextok, yyvsp[-6], yyvsp[-2]) < 0)
+			YYABORT;
+		in_function = true;
+		yyvsp[-5]->lextok = NULL;
+		bcfree(yyvsp[-5]);
+		/* $5 already free'd in install_function */
+		yyval = yyvsp[-6];
+		want_param_names = FUNC_BODY;
+	  }
+#line 2310 "awkgram.c"
+    break;
+
+  case 38:
+#line 535 "awkgram.y"
+    { want_regexp = true; }
+#line 2316 "awkgram.c"
+    break;
+
+  case 39:
+#line 537 "awkgram.y"
+    {
+		  NODE *n, *exp;
+		  char *re;
+		  size_t len;
+
+		  re = yyvsp[0]->lextok;
+		  yyvsp[0]->lextok = NULL;
+		  len = strlen(re);
+		  if (do_lint) {
+			if (len == 0)
+				lintwarn_ln(yyvsp[0]->source_line,
+					_("regexp constant `//' looks like a C++ comment, but is not"));
+			else if (re[0] == '*' && re[len-1] == '*')
+				/* possible C comment */
+				lintwarn_ln(yyvsp[0]->source_line,
+					_("regexp constant `/%s/' looks like a C comment, but is not"), re);
+		  }
+
+		  exp = make_str_node(re, len, ALREADY_MALLOCED);
+		  n = make_regnode(Node_regex, exp);
+		  if (n == NULL) {
+			unref(exp);
+			YYABORT;
+		  }
+		  yyval = yyvsp[0];
+		  yyval->opcode = Op_match_rec;
+		  yyval->memory = n;
+		}
+#line 2349 "awkgram.c"
+    break;
+
+  case 40:
+#line 569 "awkgram.y"
+    {
+		  char *re;
+		  size_t len;
+
+		  re = yyvsp[0]->lextok;
+		  yyvsp[0]->lextok = NULL;
+		  len = strlen(re);
+
+		  yyval = yyvsp[0];
+		  yyval->opcode = Op_push_re;
+		  yyval->memory = make_typed_regex(re, len);
+		}
+#line 2366 "awkgram.c"
+    break;
+
+  case 41:
+#line 584 "awkgram.y"
+    { bcfree(yyvsp[0]); }
+#line 2372 "awkgram.c"
+    break;
+
+  case 43:
+#line 590 "awkgram.y"
+    { yyval = NULL; }
+#line 2378 "awkgram.c"
+    break;
+
+  case 44:
+#line 592 "awkgram.y"
+    {
+		if (yyvsp[0] == NULL) {
+			yyval = yyvsp[-1];
+		} else {
+			add_lint(yyvsp[0], LINT_no_effect);
+			if (yyvsp[-1] == NULL) {
+				yyval = yyvsp[0];
+			} else {
+				yyval = list_merge(yyvsp[-1], yyvsp[0]);
+			}
+		}
+
+		if (trailing_comment != NULL) {
+			yyval = list_append(yyval, trailing_comment);
+			trailing_comment = NULL;
+		}
+
+		yyerrok;
+	  }
+#line 2402 "awkgram.c"
+    break;
+
+  case 45:
+#line 612 "awkgram.y"
+    {	yyval = NULL; }
+#line 2408 "awkgram.c"
+    break;
+
+  case 46:
+#line 616 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 2414 "awkgram.c"
+    break;
+
+  case 47:
+#line 617 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 2420 "awkgram.c"
+    break;
+
+  case 48:
+#line 622 "awkgram.y"
+    {
+		if (yyvsp[0] != NULL) {
+			INSTRUCTION *ip;
+
+			merge_comments(yyvsp[0], NULL);
+			ip = list_create(instruction(Op_no_op));
+			yyval = list_append(ip, yyvsp[0]); 
+		} else
+			yyval = NULL;
+	  }
+#line 2435 "awkgram.c"
+    break;
+
+  case 49:
+#line 633 "awkgram.y"
+    {
+		trailing_comment = yyvsp[0];	// NULL or comment
+		yyval = make_braced_statements(yyvsp[-2], yyvsp[-1], yyvsp[0]);
+	  }
+#line 2444 "awkgram.c"
+    break;
+
+  case 50:
+#line 638 "awkgram.y"
+    {
+		if (do_pretty_print)
+			yyval = list_prepend(yyvsp[0], instruction(Op_exec_count));
+		else
+			yyval = yyvsp[0];
+ 	  }
+#line 2455 "awkgram.c"
+    break;
+
+  case 51:
+#line 645 "awkgram.y"
+    {
+		INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
+		INSTRUCTION *ip, *nextc, *tbreak;
+		const char **case_values = NULL;
+		int maxcount = 128;
+		int case_count = 0;
+		int i;
+
+		tbreak = instruction(Op_no_op);
+		cstmt = list_create(tbreak);
+		cexp = list_create(instruction(Op_pop));
+		dflt = instruction(Op_jmp);
+		dflt->target_jmp = tbreak;	/* if no case match and no explicit default */
+
+		if (yyvsp[-2] != NULL) {
+			curr = yyvsp[-2]->nexti;
+			bcfree(yyvsp[-2]);	/* Op_list */
+		}
+		/*  else
+			curr = NULL; */
+
+		for (; curr != NULL; curr = nextc) {
+			INSTRUCTION *caseexp = curr->case_exp;
+			INSTRUCTION *casestmt = curr->case_stmt;
+
+			nextc = curr->nexti;
+			if (curr->opcode == Op_K_case) {
+				if (caseexp->opcode == Op_push_i) {
+					/* a constant scalar */
+					char *caseval;
+					caseval = force_string(caseexp->memory)->stptr;
+					for (i = 0; i < case_count; i++) {
+						if (strcmp(caseval, case_values[i]) == 0)
+							error_ln(curr->source_line,
+								_("duplicate case values in switch body: %s"), caseval);
+					}
+
+					if (case_values == NULL)
+						emalloc(case_values, const char **, sizeof(char *) * maxcount, "statement");
+					else if (case_count >= maxcount) {
+						maxcount += 128;
+						erealloc(case_values, const char **, sizeof(char*) * maxcount, "statement");
+					}
+					case_values[case_count++] = caseval;
+				} else {
+					/* match a constant regex against switch expression. */
+					(curr + 1)->match_exp = true;
+				}
+				curr->stmt_start = casestmt->nexti;
+				curr->stmt_end	= casestmt->lasti;
+				(void) list_prepend(cexp, curr);
+				(void) list_prepend(cexp, caseexp);
+			} else {
+				if (dflt->target_jmp != tbreak)
+					error_ln(curr->source_line,
+						_("duplicate `default' detected in switch body"));
+				else
+					dflt->target_jmp = casestmt->nexti;
+
+				if (do_pretty_print) {
+					curr->stmt_start = casestmt->nexti;
+					curr->stmt_end = casestmt->lasti;
+					(void) list_prepend(cexp, curr);
+				} else
+					bcfree(curr);
+			}
+
+			cstmt = list_merge(casestmt, cstmt);
+		}
+
+		if (case_values != NULL)
+			efree(case_values);
+
+		ip = yyvsp[-6];
+		if (do_pretty_print) {
+			// first merge comments
+			INSTRUCTION *head_comment = NULL;
+
+			if (yyvsp[-4] != NULL && yyvsp[-3] != NULL) {
+				merge_comments(yyvsp[-4], yyvsp[-3]);
+				head_comment = yyvsp[-4];
+			} else if (yyvsp[-4] != NULL)
+				head_comment = yyvsp[-4];
+			else
+				head_comment = yyvsp[-3];
+
+			yyvsp[-8]->comment = head_comment;
+
+			(void) list_prepend(ip, yyvsp[-8]);
+			(void) list_prepend(ip, instruction(Op_exec_count));
+			yyvsp[-8]->target_break = tbreak;
+			(yyvsp[-8] + 1)->switch_start = cexp->nexti;
+			(yyvsp[-8] + 1)->switch_end = cexp->lasti;
+			(yyvsp[-8] + 1)->switch_end->comment = yyvsp[0];
+		}
+		/* else
+			$1 is NULL */
+
+		(void) list_append(cexp, dflt);
+		(void) list_merge(ip, cexp);
+		if (yyvsp[-1] != NULL)
+			(void) list_append(cstmt, yyvsp[-1]);
+		yyval = list_merge(ip, cstmt);
+
+		break_allowed--;
+		fix_break_continue(ip, tbreak, NULL);
+	  }
+#line 2567 "awkgram.c"
+    break;
+
+  case 52:
+#line 753 "awkgram.y"
+    {
+		/*
+		 *    -----------------
+		 * tc:
+		 *         cond
+		 *    -----------------
+		 *    [Op_jmp_false tb   ]
+		 *    -----------------
+		 *         body
+		 *    -----------------
+		 *    [Op_jmp      tc    ]
+		 * tb:[Op_no_op          ]
+		 */
+
+		INSTRUCTION *ip, *tbreak, *tcont;
+
+		tbreak = instruction(Op_no_op);
+		add_lint(yyvsp[-3], LINT_assign_in_cond);
+		tcont = yyvsp[-3]->nexti;
+		ip = list_append(yyvsp[-3], instruction(Op_jmp_false));
+		ip->lasti->target_jmp = tbreak;
+
+		if (do_pretty_print) {
+			(void) list_append(ip, instruction(Op_exec_count));
+			yyvsp[-5]->target_break = tbreak;
+			yyvsp[-5]->target_continue = tcont;
+			(yyvsp[-5] + 1)->while_body = ip->lasti;
+			(void) list_prepend(ip, yyvsp[-5]);
+		}
+		/* else
+			$1 is NULL */
+
+		if (yyvsp[-1] != NULL) {
+			if (yyvsp[0] == NULL)
+				yyvsp[0] = list_create(instruction(Op_no_op));
+
+			yyvsp[-1]->memory->comment_type = BLOCK_COMMENT;
+			yyvsp[0] = list_prepend(yyvsp[0], yyvsp[-1]);
+		}
+
+		if (yyvsp[0] != NULL)
+			(void) list_merge(ip, yyvsp[0]);
+		(void) list_append(ip, instruction(Op_jmp));
+		ip->lasti->target_jmp = tcont;
+		yyval = list_append(ip, tbreak);
+
+		break_allowed--;
+		continue_allowed--;
+		fix_break_continue(ip, tbreak, tcont);
+	  }
+#line 2622 "awkgram.c"
+    break;
+
+  case 53:
+#line 804 "awkgram.y"
+    {
+		/*
+		 *    -----------------
+		 * z:
+		 *         body
+		 *    -----------------
+		 * tc:
+		 *         cond
+		 *    -----------------
+		 *    [Op_jmp_true | z  ]
+		 * tb:[Op_no_op         ]
+		 */
+
+		INSTRUCTION *ip, *tbreak, *tcont;
+
+		tbreak = instruction(Op_no_op);
+		tcont = yyvsp[-2]->nexti;
+		add_lint(yyvsp[-2], LINT_assign_in_cond);
+		if (yyvsp[-5] != NULL)
+			ip = list_merge(yyvsp[-5], yyvsp[-2]);
+		else
+			ip = list_prepend(yyvsp[-2], instruction(Op_no_op));
+
+		if (yyvsp[-6] != NULL)
+			(void) list_prepend(ip, yyvsp[-6]);
+
+		if (do_pretty_print)
+			(void) list_prepend(ip, instruction(Op_exec_count));
+
+		(void) list_append(ip, instruction(Op_jmp_true));
+		ip->lasti->target_jmp = ip->nexti;
+		yyval = list_append(ip, tbreak);
+
+		break_allowed--;
+		continue_allowed--;
+		fix_break_continue(ip, tbreak, tcont);
+
+		if (do_pretty_print) {
+			yyvsp[-7]->target_break = tbreak;
+			yyvsp[-7]->target_continue = tcont;
+			(yyvsp[-7] + 1)->doloop_cond = tcont;
+			yyval = list_prepend(ip, yyvsp[-7]);
+			bcfree(yyvsp[-4]);
+			if (yyvsp[0] != NULL)
+				yyvsp[-7]->comment = yyvsp[0];
+		}
+		/* else
+			$1 and $4 are NULLs */
+	  }
+#line 2676 "awkgram.c"
+    break;
+
+  case 54:
+#line 854 "awkgram.y"
+    {
+		INSTRUCTION *ip;
+		char *var_name = yyvsp[-5]->lextok;
+
+		if (yyvsp[0] != NULL
+				&& yyvsp[0]->lasti->opcode == Op_K_delete
+				&& yyvsp[0]->lasti->expr_count == 1
+				&& yyvsp[0]->nexti->opcode == Op_push
+				&& (yyvsp[0]->nexti->memory->type != Node_var || !(yyvsp[0]->nexti->memory->var_update))
+				&& strcmp(yyvsp[0]->nexti->memory->vname, var_name) == 0
+		) {
+
+		/*
+		 * Efficiency hack.  Recognize the special case of
+		 *
+		 * 	for (iggy in foo)
+		 * 		delete foo[iggy]
+		 *
+		 * and treat it as if it were
+		 *
+		 * 	delete foo
+		 *
+		 * Check that the body is a `delete a[i]' statement,
+		 * and that both the loop var and array names match.
+		 */
+			NODE *arr = NULL;
+
+			ip = yyvsp[0]->nexti->nexti;
+			if (yyvsp[-3]->nexti->opcode == Op_push && yyvsp[-3]->lasti == yyvsp[-3]->nexti)
+				arr = yyvsp[-3]->nexti->memory;
+			if (arr != NULL
+					&& ip->opcode == Op_no_op
+					&& ip->nexti->opcode == Op_push_array
+					&& strcmp(ip->nexti->memory->vname, arr->vname) == 0
+					&& ip->nexti->nexti == yyvsp[0]->lasti
+			) {
+				(void) make_assignable(yyvsp[0]->nexti);
+				yyvsp[0]->lasti->opcode = Op_K_delete_loop;
+				yyvsp[0]->lasti->expr_count = 0;
+				if (yyvsp[-7] != NULL)
+					bcfree(yyvsp[-7]);
+				efree(var_name);
+				bcfree(yyvsp[-5]);
+				bcfree(yyvsp[-4]);
+				bcfree(yyvsp[-3]);
+				if (yyvsp[-1] != NULL) {
+					merge_comments(yyvsp[-1], NULL);
+					yyvsp[0] = list_prepend(yyvsp[0], yyvsp[-1]);
+				}
+				yyval = yyvsp[0];
+			} else
+				goto regular_loop;
+		} else {
+			INSTRUCTION *tbreak, *tcont;
+
+			/*    [ Op_push_array a       ]
+			 *    [ Op_arrayfor_init | ib ]
+			 * ic:[ Op_arrayfor_incr | ib ]
+			 *    [ Op_var_assign if any  ]
+			 *
+			 *              body
+			 *
+			 *    [Op_jmp | ic            ]
+			 * ib:[Op_arrayfor_final      ]
+			 */
+regular_loop:
+			ip = yyvsp[-3];
+			ip->nexti->opcode = Op_push_array;
+
+			tbreak = instruction(Op_arrayfor_final);
+			yyvsp[-4]->opcode = Op_arrayfor_incr;
+			yyvsp[-4]->array_var = variable(yyvsp[-5]->source_line, var_name, Node_var);
+			yyvsp[-4]->target_jmp = tbreak;
+			tcont = yyvsp[-4];
+			yyvsp[-5]->opcode = Op_arrayfor_init;
+			yyvsp[-5]->target_jmp = tbreak;
+			(void) list_append(ip, yyvsp[-5]);
+
+			if (do_pretty_print) {
+				yyvsp[-7]->opcode = Op_K_arrayfor;
+				yyvsp[-7]->target_continue = tcont;
+				yyvsp[-7]->target_break = tbreak;
+				(void) list_append(ip, yyvsp[-7]);
+			}
+			/* else
+				$1 is NULL */
+
+			/* add update_FOO instruction if necessary */
+			if (yyvsp[-4]->array_var->type == Node_var && yyvsp[-4]->array_var->var_update) {
+				(void) list_append(ip, instruction(Op_var_update));
+				ip->lasti->update_var = yyvsp[-4]->array_var->var_update;
+			}
+			(void) list_append(ip, yyvsp[-4]);
+
+			/* add set_FOO instruction if necessary */
+			if (yyvsp[-4]->array_var->type == Node_var && yyvsp[-4]->array_var->var_assign) {
+				(void) list_append(ip, instruction(Op_var_assign));
+				ip->lasti->assign_var = yyvsp[-4]->array_var->var_assign;
+			}
+
+			if (do_pretty_print) {
+				(void) list_append(ip, instruction(Op_exec_count));
+				(yyvsp[-7] + 1)->forloop_cond = yyvsp[-4];
+				(yyvsp[-7] + 1)->forloop_body = ip->lasti;
+			}
+
+			if (yyvsp[-1] != NULL)
+				merge_comments(yyvsp[-1], NULL);
+
+			if (yyvsp[0] != NULL) {
+				if (yyvsp[-1] != NULL)
+					yyvsp[0] = list_prepend(yyvsp[0], yyvsp[-1]);
+				(void) list_merge(ip, yyvsp[0]);
+			} else if (yyvsp[-1] != NULL)
+				(void) list_append(ip, yyvsp[-1]);
+
+			(void) list_append(ip, instruction(Op_jmp));
+			ip->lasti->target_jmp = yyvsp[-4];
+			yyval = list_append(ip, tbreak);
+			fix_break_continue(ip, tbreak, tcont);
+		}
+
+		break_allowed--;
+		continue_allowed--;
+	  }
+#line 2806 "awkgram.c"
+    break;
+
+  case 55:
+#line 980 "awkgram.y"
+    {
+		if (yyvsp[-7] != NULL) {
+			merge_comments(yyvsp[-7], NULL);
+			yyvsp[-11]->comment = yyvsp[-7];
+		}
+		if (yyvsp[-4] != NULL) {
+			merge_comments(yyvsp[-4], NULL);
+			if (yyvsp[-11]->comment == NULL) {
+				yyvsp[-4]->memory->comment_type = FOR_COMMENT;
+				yyvsp[-11]->comment = yyvsp[-4];
+			} else
+				yyvsp[-11]->comment->comment = yyvsp[-4];
+		}
+		if (yyvsp[-1] != NULL)
+			yyvsp[0] = list_prepend(yyvsp[0], yyvsp[-1]);
+		yyval = mk_for_loop(yyvsp[-11], yyvsp[-9], yyvsp[-6], yyvsp[-3], yyvsp[0]);
+
+		break_allowed--;
+		continue_allowed--;
+	  }
+#line 2831 "awkgram.c"
+    break;
+
+  case 56:
+#line 1001 "awkgram.y"
+    {
+		if (yyvsp[-6] != NULL) {
+			merge_comments(yyvsp[-6], NULL);
+			yyvsp[-10]->comment = yyvsp[-6];
+		}
+		if (yyvsp[-4] != NULL) {
+			merge_comments(yyvsp[-4], NULL);
+			if (yyvsp[-10]->comment == NULL) {
+				yyvsp[-4]->memory->comment_type = FOR_COMMENT;
+				yyvsp[-10]->comment = yyvsp[-4];
+			} else
+				yyvsp[-10]->comment->comment = yyvsp[-4];
+		}
+		if (yyvsp[-1] != NULL)
+			yyvsp[0] = list_prepend(yyvsp[0], yyvsp[-1]);
+		yyval = mk_for_loop(yyvsp[-10], yyvsp[-8], (INSTRUCTION *) NULL, yyvsp[-3], yyvsp[0]);
+
+		break_allowed--;
+		continue_allowed--;
+	  }
+#line 2856 "awkgram.c"
+    break;
+
+  case 57:
+#line 1022 "awkgram.y"
+    {
+		if (do_pretty_print)
+			yyval = list_prepend(yyvsp[0], instruction(Op_exec_count));
+		else
+			yyval = yyvsp[0];
+	  }
+#line 2867 "awkgram.c"
+    break;
+
+  case 58:
+#line 1032 "awkgram.y"
+    {
+		if (! break_allowed)
+			error_ln(yyvsp[-1]->source_line,
+				_("`break' is not allowed outside a loop or switch"));
+		yyvsp[-1]->target_jmp = NULL;
+		yyval = list_create(yyvsp[-1]);
+		if (yyvsp[0] != NULL)
+			yyval = list_append(yyval, yyvsp[0]);
+	  }
+#line 2881 "awkgram.c"
+    break;
+
+  case 59:
+#line 1042 "awkgram.y"
+    {
+		if (! continue_allowed)
+			error_ln(yyvsp[-1]->source_line,
+				_("`continue' is not allowed outside a loop"));
+		yyvsp[-1]->target_jmp = NULL;
+		yyval = list_create(yyvsp[-1]);
+		if (yyvsp[0] != NULL)
+			yyval = list_append(yyval, yyvsp[0]);
+	  }
+#line 2895 "awkgram.c"
+    break;
+
+  case 60:
+#line 1052 "awkgram.y"
+    {
+		/* if inside function (rule = 0), resolve context at run-time */
+		if (rule && rule != Rule)
+			error_ln(yyvsp[-1]->source_line,
+				_("`next' used in %s action"), ruletab[rule]);
+		yyvsp[-1]->target_jmp = ip_rec;
+		yyval = list_create(yyvsp[-1]);
+		if (yyvsp[0] != NULL)
+			yyval = list_append(yyval, yyvsp[0]);
+	  }
+#line 2910 "awkgram.c"
+    break;
+
+  case 61:
+#line 1063 "awkgram.y"
+    {
+		/* if inside function (rule = 0), resolve context at run-time */
+		if (rule == BEGIN || rule == END || rule == ENDFILE)
+			error_ln(yyvsp[-1]->source_line,
+				_("`nextfile' used in %s action"), ruletab[rule]);
+
+		yyvsp[-1]->target_newfile = ip_newfile;
+		yyvsp[-1]->target_endfile = ip_endfile;
+		yyval = list_create(yyvsp[-1]);
+		if (yyvsp[0] != NULL)
+			yyval = list_append(yyval, yyvsp[0]);
+	  }
+#line 2927 "awkgram.c"
+    break;
+
+  case 62:
+#line 1076 "awkgram.y"
+    {
+		/* Initialize the two possible jump targets, the actual target
+		 * is resolved at run-time.
+		 */
+		yyvsp[-2]->target_end = ip_end;	/* first instruction in end_block */
+		yyvsp[-2]->target_atexit = ip_atexit;	/* cleanup and go home */
+
+		if (yyvsp[-1] == NULL) {
+			yyval = list_create(yyvsp[-2]);
+			(void) list_prepend(yyval, instruction(Op_push_i));
+			yyval->nexti->memory = dupnode(Nnull_string);
+		} else
+			yyval = list_append(yyvsp[-1], yyvsp[-2]);
+		if (yyvsp[0] != NULL)
+			yyval = list_append(yyval, yyvsp[0]);
+	  }
+#line 2948 "awkgram.c"
+    break;
+
+  case 63:
+#line 1093 "awkgram.y"
+    {
+		if (! in_function)
+			yyerror(_("`return' used outside function context"));
+	  }
+#line 2957 "awkgram.c"
+    break;
+
+  case 64:
+#line 1096 "awkgram.y"
+    {
+		if (called_from_eval)
+			yyvsp[-3]->opcode = Op_K_return_from_eval;
+
+		if (yyvsp[-1] == NULL) {
+			yyval = list_create(yyvsp[-3]);
+			(void) list_prepend(yyval, instruction(Op_push_i));
+			yyval->nexti->memory = dupnode(Nnull_string);
+		} else
+			yyval = list_append(yyvsp[-1], yyvsp[-3]);
+		if (yyvsp[0] != NULL)
+			yyval = list_append(yyval, yyvsp[0]);
+	  }
+#line 2975 "awkgram.c"
+    break;
+
+  case 65:
+#line 1110 "awkgram.y"
+    {
+		if (yyvsp[0] != NULL)
+			yyval = list_append(yyvsp[-1], yyvsp[0]);
+		else
+			yyval = yyvsp[-1];
+	  }
+#line 2986 "awkgram.c"
+    break;
+
+  case 66:
+#line 1127 "awkgram.y"
+    { in_print = true; in_parens = 0; }
+#line 2992 "awkgram.c"
+    break;
+
+  case 67:
+#line 1128 "awkgram.y"
+    {
+		/*
+		 * Optimization: plain `print' has no expression list, so $3 is null.
+		 * If $3 is NULL or is a bytecode list for $0 use Op_K_print_rec,
+		 * which is faster for these two cases.
+		 */
+
+		if (do_optimize && yyvsp[-3]->opcode == Op_K_print &&
+			(yyvsp[-1] == NULL
+				|| (yyvsp[-1]->lasti->opcode == Op_field_spec
+					&& yyvsp[-1]->nexti->nexti->nexti == yyvsp[-1]->lasti
+					&& yyvsp[-1]->nexti->nexti->opcode == Op_push_i
+					&& yyvsp[-1]->nexti->nexti->memory->type == Node_val)
+			)
+		) {
+			static bool warned = false;
+			/*   -----------------
+			 *      output_redir
+			 *    [ redirect exp ]
+			 *   -----------------
+			 *     expression_list
+			 *   ------------------
+			 *    [Op_K_print_rec | NULL | redir_type | expr_count]
+			 */
+
+			if (yyvsp[-1] != NULL) {
+				NODE *n = yyvsp[-1]->nexti->nexti->memory;
+
+				if (! iszero(n))
+					goto regular_print;
+
+				bcfree(yyvsp[-1]->lasti);			/* Op_field_spec */
+				unref(n);				/* Node_val */
+				bcfree(yyvsp[-1]->nexti->nexti);		/* Op_push_i */
+				bcfree(yyvsp[-1]->nexti);			/* Op_list */
+				bcfree(yyvsp[-1]);				/* Op_list */
+			} else {
+				if (do_lint && (rule == BEGIN || rule == END) && ! warned) {
+					warned = true;
+					lintwarn_ln(yyvsp[-3]->source_line,
+		_("plain `print' in BEGIN or END rule should probably be `print \"\"'"));
+				}
+			}
+
+			yyvsp[-3]->expr_count = 0;
+			yyvsp[-3]->opcode = Op_K_print_rec;
+			if (yyvsp[0] == NULL) {    /* no redircetion */
+				yyvsp[-3]->redir_type = redirect_none;
+				yyval = list_create(yyvsp[-3]);
+			} else {
+				INSTRUCTION *ip;
+				ip = yyvsp[0]->nexti;
+				yyvsp[-3]->redir_type = ip->redir_type;
+				yyvsp[0]->nexti = ip->nexti;
+				bcfree(ip);
+				yyval = list_append(yyvsp[0], yyvsp[-3]);
+			}
+		} else {
+			/*   -----------------
+			 *    [ output_redir    ]
+			 *    [ redirect exp    ]
+			 *   -----------------
+			 *    [ expression_list ]
+			 *   ------------------
+			 *    [$1 | NULL | redir_type | expr_count]
+			 *
+			 */
+regular_print:
+			if (yyvsp[0] == NULL) {		/* no redirection */
+				if (yyvsp[-1] == NULL)	{	/* print/printf without arg */
+					yyvsp[-3]->expr_count = 0;
+					if (yyvsp[-3]->opcode == Op_K_print)
+						yyvsp[-3]->opcode = Op_K_print_rec;
+					yyvsp[-3]->redir_type = redirect_none;
+					yyval = list_create(yyvsp[-3]);
+				} else {
+					INSTRUCTION *t = yyvsp[-1];
+					yyvsp[-3]->expr_count = count_expressions(&t, false);
+					yyvsp[-3]->redir_type = redirect_none;
+					yyval = list_append(t, yyvsp[-3]);
+				}
+			} else {
+				INSTRUCTION *ip;
+				ip = yyvsp[0]->nexti;
+				yyvsp[-3]->redir_type = ip->redir_type;
+				yyvsp[0]->nexti = ip->nexti;
+				bcfree(ip);
+				if (yyvsp[-1] == NULL) {
+					yyvsp[-3]->expr_count = 0;
+					if (yyvsp[-3]->opcode == Op_K_print)
+						yyvsp[-3]->opcode = Op_K_print_rec;
+					yyval = list_append(yyvsp[0], yyvsp[-3]);
+				} else {
+					INSTRUCTION *t = yyvsp[-1];
+					yyvsp[-3]->expr_count = count_expressions(&t, false);
+					yyval = list_append(list_merge(yyvsp[0], t), yyvsp[-3]);
+				}
+			}
+		}
+	  }
+#line 3097 "awkgram.c"
+    break;
+
+  case 68:
+#line 1229 "awkgram.y"
+    { sub_counter = 0; }
+#line 3103 "awkgram.c"
+    break;
+
+  case 69:
+#line 1230 "awkgram.y"
+    {
+		char *arr = yyvsp[-2]->lextok;
+
+		yyvsp[-2]->opcode = Op_push_array;
+		yyvsp[-2]->memory = variable(yyvsp[-2]->source_line, arr, Node_var_new);
+
+		if (! do_posix && ! do_traditional) {
+			if (yyvsp[-2]->memory == symbol_table)
+				fatal(_("`delete' is not allowed with SYMTAB"));
+			else if (yyvsp[-2]->memory == func_table)
+				fatal(_("`delete' is not allowed with FUNCTAB"));
+		}
+
+		if (yyvsp[0] == NULL) {
+			/*
+			 * As of September 2012, POSIX has added support
+			 * for `delete array'. See:
+			 * http://austingroupbugs.net/view.php?id=544
+			 *
+			 * Thanks to Nathan Weeks for the initiative.
+			 *
+			 * Thus we no longer warn or check do_posix.
+			 * Also, since BWK awk supports it, we don't have to
+			 * check do_traditional either.
+			 */
+			yyvsp[-3]->expr_count = 0;
+			yyval = list_append(list_create(yyvsp[-2]), yyvsp[-3]);
+		} else {
+			yyvsp[-3]->expr_count = sub_counter;
+			yyval = list_append(list_append(yyvsp[0], yyvsp[-2]), yyvsp[-3]);
+		}
+	  }
+#line 3140 "awkgram.c"
+    break;
+
+  case 70:
+#line 1267 "awkgram.y"
+    {
+		static bool warned = false;
+		char *arr = yyvsp[-1]->lextok;
+
+		if (do_lint && ! warned) {
+			warned = true;
+			lintwarn_ln(yyvsp[-3]->source_line,
+				_("`delete(array)' is a non-portable tawk extension"));
+		}
+		if (do_traditional) {
+			error_ln(yyvsp[-3]->source_line,
+				_("`delete(array)' is a non-portable tawk extension"));
+		}
+		yyvsp[-1]->memory = variable(yyvsp[-1]->source_line, arr, Node_var_new);
+		yyvsp[-1]->opcode = Op_push_array;
+		yyvsp[-3]->expr_count = 0;
+		yyval = list_append(list_create(yyvsp[-1]), yyvsp[-3]);
+
+		if (! do_posix && ! do_traditional) {
+			if (yyvsp[-1]->memory == symbol_table)
+				fatal(_("`delete' is not allowed with SYMTAB"));
+			else if (yyvsp[-1]->memory == func_table)
+				fatal(_("`delete' is not allowed with FUNCTAB"));
+		}
+	  }
+#line 3170 "awkgram.c"
+    break;
+
+  case 71:
+#line 1293 "awkgram.y"
+    {
+		yyval = optimize_assignment(yyvsp[0]);
+	  }
+#line 3178 "awkgram.c"
+    break;
+
+  case 72:
+#line 1300 "awkgram.y"
+    { yyval = NULL; }
+#line 3184 "awkgram.c"
+    break;
+
+  case 73:
+#line 1302 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3190 "awkgram.c"
+    break;
+
+  case 74:
+#line 1307 "awkgram.y"
+    { yyval = NULL; }
+#line 3196 "awkgram.c"
+    break;
+
+  case 75:
+#line 1309 "awkgram.y"
+    {
+		if (yyvsp[-1] == NULL)
+			yyval = list_create(yyvsp[0]);
+		else
+			yyval = list_prepend(yyvsp[-1], yyvsp[0]);
+	  }
+#line 3207 "awkgram.c"
+    break;
+
+  case 76:
+#line 1316 "awkgram.y"
+    { yyval = NULL; }
+#line 3213 "awkgram.c"
+    break;
+
+  case 77:
+#line 1321 "awkgram.y"
+    {
+		INSTRUCTION *casestmt = yyvsp[0];
+		if (yyvsp[0] == NULL)
+			casestmt = list_create(instruction(Op_no_op));
+		if (do_pretty_print)
+			(void) list_prepend(casestmt, instruction(Op_exec_count));
+		yyvsp[-4]->case_exp = yyvsp[-3];
+		yyvsp[-4]->case_stmt = casestmt;
+		yyvsp[-4]->comment = yyvsp[-1];
+		bcfree(yyvsp[-2]);
+		yyval = yyvsp[-4];
+	  }
+#line 3230 "awkgram.c"
+    break;
+
+  case 78:
+#line 1334 "awkgram.y"
+    {
+		INSTRUCTION *casestmt = yyvsp[0];
+		if (yyvsp[0] == NULL)
+			casestmt = list_create(instruction(Op_no_op));
+		if (do_pretty_print)
+			(void) list_prepend(casestmt, instruction(Op_exec_count));
+		bcfree(yyvsp[-2]);
+		yyvsp[-3]->case_stmt = casestmt;
+		yyvsp[-3]->comment = yyvsp[-1];
+		yyval = yyvsp[-3];
+	  }
+#line 3246 "awkgram.c"
+    break;
+
+  case 79:
+#line 1349 "awkgram.y"
+    {	yyval = yyvsp[0]; }
+#line 3252 "awkgram.c"
+    break;
+
+  case 80:
+#line 1351 "awkgram.y"
+    {
+		NODE *n = yyvsp[0]->memory;
+		(void) force_number(n);
+		negate_num(n);
+		bcfree(yyvsp[-1]);
+		yyval = yyvsp[0];
+	  }
+#line 3264 "awkgram.c"
+    break;
+
+  case 81:
+#line 1359 "awkgram.y"
+    {
+		NODE *n = yyvsp[0]->lasti->memory;
+		bcfree(yyvsp[-1]);
+		add_sign_to_num(n, '+');
+		yyval = yyvsp[0];
+	  }
+#line 3275 "awkgram.c"
+    break;
+
+  case 82:
+#line 1366 "awkgram.y"
+    {	yyval = yyvsp[0]; }
+#line 3281 "awkgram.c"
+    break;
+
+  case 83:
+#line 1368 "awkgram.y"
+    {
+		if (yyvsp[0]->memory->type == Node_regex)
+			yyvsp[0]->opcode = Op_push_re;
+		else
+			yyvsp[0]->opcode = Op_push;
+		yyval = yyvsp[0];
+	  }
+#line 3293 "awkgram.c"
+    break;
+
+  case 84:
+#line 1376 "awkgram.y"
+    {
+		assert((yyvsp[0]->memory->flags & REGEX) == REGEX);
+		yyvsp[0]->opcode = Op_push_re;
+		yyval = yyvsp[0];
+	  }
+#line 3303 "awkgram.c"
+    break;
+
+  case 85:
+#line 1385 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3309 "awkgram.c"
+    break;
+
+  case 86:
+#line 1387 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3315 "awkgram.c"
+    break;
+
+  case 88:
+#line 1397 "awkgram.y"
+    {
+		yyval = yyvsp[-1];
+	  }
+#line 3323 "awkgram.c"
+    break;
+
+  case 89:
+#line 1404 "awkgram.y"
+    {
+		in_print = false;
+		in_parens = 0;
+		yyval = NULL;
+	  }
+#line 3333 "awkgram.c"
+    break;
+
+  case 90:
+#line 1409 "awkgram.y"
+    { in_print = false; in_parens = 0; }
+#line 3339 "awkgram.c"
+    break;
+
+  case 91:
+#line 1410 "awkgram.y"
+    {
+		if (yyvsp[-2]->redir_type == redirect_twoway
+		    	&& yyvsp[0]->lasti->opcode == Op_K_getline_redir
+		   	 	&& yyvsp[0]->lasti->redir_type == redirect_twoway)
+			yyerror(_("multistage two-way pipelines don't work"));
+		if (do_lint && yyvsp[-2]->redir_type == redirect_output && yyvsp[0]->lasti->opcode == Op_concat)
+			lintwarn(_("concatenation as I/O `>' redirection target is ambiguous"));
+		yyval = list_prepend(yyvsp[0], yyvsp[-2]);
+	  }
+#line 3353 "awkgram.c"
+    break;
+
+  case 92:
+#line 1423 "awkgram.y"
+    {
+		if (yyvsp[-1] != NULL)
+			yyvsp[-5]->comment = yyvsp[-1];
+		yyval = mk_condition(yyvsp[-3], yyvsp[-5], yyvsp[0], NULL, NULL);
+	  }
+#line 3363 "awkgram.c"
+    break;
+
+  case 93:
+#line 1430 "awkgram.y"
+    {
+		if (yyvsp[-4] != NULL)
+			yyvsp[-8]->comment = yyvsp[-4];
+		if (yyvsp[-1] != NULL)
+			yyvsp[-2]->comment = yyvsp[-1];
+		yyval = mk_condition(yyvsp[-6], yyvsp[-8], yyvsp[-3], yyvsp[-2], yyvsp[0]);
+	  }
+#line 3375 "awkgram.c"
+    break;
+
+  case 94:
+#line 1441 "awkgram.y"
+    {
+		yyval = yyvsp[0];
+	  }
+#line 3383 "awkgram.c"
+    break;
+
+  case 95:
+#line 1445 "awkgram.y"
+    {
+		if (yyvsp[-1] != NULL && yyvsp[0] != NULL) {
+			if (yyvsp[-1]->memory->comment_type == EOL_COMMENT) {
+				assert(yyvsp[0]->memory->comment_type == BLOCK_COMMENT);
+				yyvsp[-1]->comment = yyvsp[0];	// chain them
+			} else {
+				merge_comments(yyvsp[-1], yyvsp[0]);
+			}
+
+			yyval = yyvsp[-1];
+		} else if (yyvsp[-1] != NULL) {
+			yyval = yyvsp[-1];
+		} else if (yyvsp[0] != NULL) {
+			yyval = yyvsp[0];
+		} else
+			yyval = NULL;
+	  }
+#line 3405 "awkgram.c"
+    break;
+
+  case 96:
+#line 1466 "awkgram.y"
+    { yyval = NULL; }
+#line 3411 "awkgram.c"
+    break;
+
+  case 97:
+#line 1468 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3417 "awkgram.c"
+    break;
+
+  case 98:
+#line 1473 "awkgram.y"
+    { yyval = NULL; }
+#line 3423 "awkgram.c"
+    break;
+
+  case 99:
+#line 1475 "awkgram.y"
+    {
+		bcfree(yyvsp[-1]);
+		yyval = yyvsp[0];
+	  }
+#line 3432 "awkgram.c"
+    break;
+
+  case 100:
+#line 1483 "awkgram.y"
+    { yyval = NULL; }
+#line 3438 "awkgram.c"
+    break;
+
+  case 101:
+#line 1485 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3444 "awkgram.c"
+    break;
+
+  case 102:
+#line 1490 "awkgram.y"
+    {
+		yyvsp[0]->param_count = 0;
+		yyval = list_create(yyvsp[0]);
+	  }
+#line 3453 "awkgram.c"
+    break;
+
+  case 103:
+#line 1495 "awkgram.y"
+    {
+		if (yyvsp[-2] != NULL && yyvsp[0] != NULL) {
+			yyvsp[0]->param_count = yyvsp[-2]->lasti->param_count + 1;
+			yyval = list_append(yyvsp[-2], yyvsp[0]);
+			yyerrok;
+
+			// newlines are allowed after commas, catch any comments
+			if (yyvsp[-1] != NULL) {
+				if (yyvsp[-2]->comment != NULL)
+					merge_comments(yyvsp[-2]->comment, yyvsp[-1]);
+				else
+					yyvsp[-2]->comment = yyvsp[-1];
+			}
+		} else
+			yyval = NULL;
+	  }
+#line 3474 "awkgram.c"
+    break;
+
+  case 104:
+#line 1512 "awkgram.y"
+    { yyval = NULL; }
+#line 3480 "awkgram.c"
+    break;
+
+  case 105:
+#line 1514 "awkgram.y"
+    { yyval = yyvsp[-1]; }
+#line 3486 "awkgram.c"
+    break;
+
+  case 106:
+#line 1516 "awkgram.y"
+    { yyval = yyvsp[-2]; }
+#line 3492 "awkgram.c"
+    break;
+
+  case 107:
+#line 1522 "awkgram.y"
+    { yyval = NULL; }
+#line 3498 "awkgram.c"
+    break;
+
+  case 108:
+#line 1524 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3504 "awkgram.c"
+    break;
+
+  case 109:
+#line 1529 "awkgram.y"
+    { yyval = NULL; }
+#line 3510 "awkgram.c"
+    break;
+
+  case 110:
+#line 1531 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3516 "awkgram.c"
+    break;
+
+  case 111:
+#line 1536 "awkgram.y"
+    {	yyval = mk_expression_list(NULL, yyvsp[0]); }
+#line 3522 "awkgram.c"
+    break;
+
+  case 112:
+#line 1538 "awkgram.y"
+    {
+		if (yyvsp[-1] != NULL)
+			yyvsp[-2]->lasti->comment = yyvsp[-1];
+		yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
+		yyerrok;
+	  }
+#line 3533 "awkgram.c"
+    break;
+
+  case 113:
+#line 1545 "awkgram.y"
+    { yyval = NULL; }
+#line 3539 "awkgram.c"
+    break;
+
+  case 114:
+#line 1547 "awkgram.y"
+    {
+		/*
+		 * Returning the expression list instead of NULL lets
+		 * snode get a list of arguments that it can count.
+		 */
+		yyval = yyvsp[-1];
+	  }
+#line 3551 "awkgram.c"
+    break;
+
+  case 115:
+#line 1555 "awkgram.y"
+    {
+		/* Ditto */
+		yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
+	  }
+#line 3560 "awkgram.c"
+    break;
+
+  case 116:
+#line 1560 "awkgram.y"
+    {
+		/* Ditto */
+		if (yyvsp[-1] != NULL)
+			yyvsp[-2]->lasti->comment = yyvsp[-1];
+		yyval = yyvsp[-2];
+	  }
+#line 3571 "awkgram.c"
+    break;
+
+  case 117:
+#line 1570 "awkgram.y"
+    { yyval = NULL; }
+#line 3577 "awkgram.c"
+    break;
+
+  case 118:
+#line 1572 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3583 "awkgram.c"
+    break;
+
+  case 119:
+#line 1577 "awkgram.y"
+    {	yyval = mk_expression_list(NULL, yyvsp[0]); }
+#line 3589 "awkgram.c"
+    break;
+
+  case 120:
+#line 1579 "awkgram.y"
+    {
+		if (yyvsp[-1] != NULL)
+			yyvsp[-2]->lasti->comment = yyvsp[-1];
+		yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
+		yyerrok;
+	  }
+#line 3600 "awkgram.c"
+    break;
+
+  case 121:
+#line 1586 "awkgram.y"
+    { yyval = NULL; }
+#line 3606 "awkgram.c"
+    break;
+
+  case 122:
+#line 1588 "awkgram.y"
+    {
+		/*
+		 * Returning the expression list instead of NULL lets
+		 * snode get a list of arguments that it can count.
+		 */
+		yyval = yyvsp[-1];
+	  }
+#line 3618 "awkgram.c"
+    break;
+
+  case 123:
+#line 1596 "awkgram.y"
+    {
+		/* Ditto */
+		yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
+	  }
+#line 3627 "awkgram.c"
+    break;
+
+  case 124:
+#line 1601 "awkgram.y"
+    {
+		/* Ditto */
+		if (yyvsp[-1] != NULL)
+			yyvsp[-2]->comment = yyvsp[-1];
+		yyval = yyvsp[-2];
+	  }
+#line 3638 "awkgram.c"
+    break;
+
+  case 125:
+#line 1610 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3644 "awkgram.c"
+    break;
+
+  case 126:
+#line 1611 "awkgram.y"
+    { yyval = list_create(yyvsp[0]); }
+#line 3650 "awkgram.c"
+    break;
+
+  case 127:
+#line 1617 "awkgram.y"
+    {
+		if (do_lint && yyvsp[0]->lasti->opcode == Op_match_rec)
+			lintwarn_ln(yyvsp[-1]->source_line,
+				_("regular expression on right of assignment"));
+		yyval = mk_assignment(yyvsp[-2], yyvsp[0], yyvsp[-1]);
+	  }
+#line 3661 "awkgram.c"
+    break;
+
+  case 128:
+#line 1624 "awkgram.y"
+    {
+		yyval = mk_assignment(yyvsp[-2], list_create(yyvsp[0]), yyvsp[-1]);
+	  }
+#line 3669 "awkgram.c"
+    break;
+
+  case 129:
+#line 1628 "awkgram.y"
+    {	yyval = mk_boolean(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3675 "awkgram.c"
+    break;
+
+  case 130:
+#line 1630 "awkgram.y"
+    {	yyval = mk_boolean(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3681 "awkgram.c"
+    break;
+
+  case 131:
+#line 1632 "awkgram.y"
+    {
+		if (yyvsp[-2]->lasti->opcode == Op_match_rec)
+			warning_ln(yyvsp[-1]->source_line,
+				_("regular expression on left of `~' or `!~' operator"));
+
+		assert(yyvsp[0]->opcode == Op_push_re
+			&& (yyvsp[0]->memory->flags & REGEX) != 0);
+		/* RHS is @/.../ */
+		yyvsp[-1]->memory = yyvsp[0]->memory;
+		bcfree(yyvsp[0]);
+		yyval = list_append(yyvsp[-2], yyvsp[-1]);
+	  }
+#line 3698 "awkgram.c"
+    break;
+
+  case 132:
+#line 1645 "awkgram.y"
+    {
+		if (yyvsp[-2]->lasti->opcode == Op_match_rec)
+			warning_ln(yyvsp[-1]->source_line,
+				_("regular expression on left of `~' or `!~' operator"));
+
+		if (yyvsp[0]->lasti == yyvsp[0]->nexti && yyvsp[0]->nexti->opcode == Op_match_rec) {
+			/* RHS is /.../ */
+			yyvsp[-1]->memory = yyvsp[0]->nexti->memory;
+			bcfree(yyvsp[0]->nexti);	/* Op_match_rec */
+			bcfree(yyvsp[0]);			/* Op_list */
+			yyval = list_append(yyvsp[-2], yyvsp[-1]);
+		} else {
+			yyvsp[-1]->memory = make_regnode(Node_dynregex, NULL);
+			yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
+		}
+	  }
+#line 3719 "awkgram.c"
+    break;
+
+  case 133:
+#line 1662 "awkgram.y"
+    {
+		if (do_lint_old)
+			warning_ln(yyvsp[-1]->source_line,
+				_("old awk does not support the keyword `in' except after `for'"));
+		yyvsp[0]->nexti->opcode = Op_push_array;
+		yyvsp[-1]->opcode = Op_in_array;
+		yyvsp[-1]->expr_count = 1;
+		yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
+	  }
+#line 3733 "awkgram.c"
+    break;
+
+  case 134:
+#line 1672 "awkgram.y"
+    {
+		if (do_lint && yyvsp[0]->lasti->opcode == Op_match_rec)
+			lintwarn_ln(yyvsp[-1]->source_line,
+				_("regular expression on right of comparison"));
+		yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
+	  }
+#line 3744 "awkgram.c"
+    break;
+
+  case 135:
+#line 1679 "awkgram.y"
+    { yyval = mk_condition(yyvsp[-4], yyvsp[-3], yyvsp[-2], yyvsp[-1], yyvsp[0]); }
+#line 3750 "awkgram.c"
+    break;
+
+  case 136:
+#line 1681 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3756 "awkgram.c"
+    break;
+
+  case 137:
+#line 1686 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3762 "awkgram.c"
+    break;
+
+  case 138:
+#line 1688 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3768 "awkgram.c"
+    break;
+
+  case 139:
+#line 1690 "awkgram.y"
+    {
+		yyvsp[0]->opcode = Op_assign_quotient;
+		yyval = yyvsp[0];
+	  }
+#line 3777 "awkgram.c"
+    break;
+
+  case 140:
+#line 1698 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3783 "awkgram.c"
+    break;
+
+  case 141:
+#line 1700 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3789 "awkgram.c"
+    break;
+
+  case 142:
+#line 1705 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3795 "awkgram.c"
+    break;
+
+  case 143:
+#line 1707 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3801 "awkgram.c"
+    break;
+
+  case 144:
+#line 1712 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3807 "awkgram.c"
+    break;
+
+  case 145:
+#line 1714 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 3813 "awkgram.c"
+    break;
+
+  case 146:
+#line 1716 "awkgram.y"
+    {
+		int count = 2;
+		bool is_simple_var = false;
+
+		if (yyvsp[-1]->lasti->opcode == Op_concat) {
+			/* multiple (> 2) adjacent strings optimization */
+			is_simple_var = (yyvsp[-1]->lasti->concat_flag & CSVAR) != 0;
+			count = yyvsp[-1]->lasti->expr_count + 1;
+			yyvsp[-1]->lasti->opcode = Op_no_op;
+		} else {
+			is_simple_var = (yyvsp[-1]->nexti->opcode == Op_push
+					&& yyvsp[-1]->lasti == yyvsp[-1]->nexti); /* first exp. is a simple
+					                             * variable?; kludge for use
+					                             * in Op_assign_concat.
+		 			                             */
+		}
+
+		if (do_optimize
+			&& yyvsp[-1]->nexti == yyvsp[-1]->lasti && yyvsp[-1]->nexti->opcode == Op_push_i
+			&& yyvsp[0]->nexti == yyvsp[0]->lasti && yyvsp[0]->nexti->opcode == Op_push_i
+		) {
+			NODE *n1 = yyvsp[-1]->nexti->memory;
+			NODE *n2 = yyvsp[0]->nexti->memory;
+			size_t nlen;
+
+			// 1.5 ""   # can't fold this if program mucks with CONVFMT.
+			// See test #12 in test/posix.awk.
+			// Also can't fold if one or the other is translatable.
+			if ((n1->flags & (NUMBER|NUMINT|INTLSTR)) != 0 || (n2->flags & (NUMBER|NUMINT|INTLSTR)) != 0)
+				goto plain_concat;
+
+			n1 = force_string(n1);
+			n2 = force_string(n2);
+			nlen = n1->stlen + n2->stlen;
+			erealloc(n1->stptr, char *, nlen + 1, "constant fold");
+			memcpy(n1->stptr + n1->stlen, n2->stptr, n2->stlen);
+			n1->stlen = nlen;
+			n1->stptr[nlen] = '\0';
+			n1->flags &= ~(NUMCUR|NUMBER|NUMINT);
+			n1->flags |= (STRING|STRCUR);
+			unref(n2);
+			bcfree(yyvsp[0]->nexti);
+			bcfree(yyvsp[0]);
+			yyval = yyvsp[-1];
+		} else {
+	plain_concat:
+			yyval = list_append(list_merge(yyvsp[-1], yyvsp[0]), instruction(Op_concat));
+			yyval->lasti->concat_flag = (is_simple_var ? CSVAR : 0);
+			yyval->lasti->expr_count = count;
+			if (count > max_args)
+				max_args = count;
+		}
+	  }
+#line 3871 "awkgram.c"
+    break;
+
+  case 148:
+#line 1775 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3877 "awkgram.c"
+    break;
+
+  case 149:
+#line 1777 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3883 "awkgram.c"
+    break;
+
+  case 150:
+#line 1779 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3889 "awkgram.c"
+    break;
+
+  case 151:
+#line 1781 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3895 "awkgram.c"
+    break;
+
+  case 152:
+#line 1783 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3901 "awkgram.c"
+    break;
+
+  case 153:
+#line 1785 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3907 "awkgram.c"
+    break;
+
+  case 154:
+#line 1787 "awkgram.y"
+    {
+		/*
+		 * In BEGINFILE/ENDFILE, allow `getline [var] < file'
+		 */
+
+		if ((rule == BEGINFILE || rule == ENDFILE) && yyvsp[0] == NULL)
+			error_ln(yyvsp[-2]->source_line,
+				 _("non-redirected `getline' invalid inside `%s' rule"), ruletab[rule]);
+		if (do_lint && rule == END && yyvsp[0] == NULL)
+			lintwarn_ln(yyvsp[-2]->source_line,
+				_("non-redirected `getline' undefined inside END action"));
+		yyval = mk_getline(yyvsp[-2], yyvsp[-1], yyvsp[0], redirect_input);
+	  }
+#line 3925 "awkgram.c"
+    break;
+
+  case 155:
+#line 1801 "awkgram.y"
+    {
+		yyvsp[0]->opcode = Op_postincrement;
+		yyval = mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
+	  }
+#line 3934 "awkgram.c"
+    break;
+
+  case 156:
+#line 1806 "awkgram.y"
+    {
+		yyvsp[0]->opcode = Op_postdecrement;
+		yyval = mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
+	  }
+#line 3943 "awkgram.c"
+    break;
+
+  case 157:
+#line 1811 "awkgram.y"
+    {
+		if (do_lint_old) {
+		    warning_ln(yyvsp[-1]->source_line,
+				_("old awk does not support the keyword `in' except after `for'"));
+		    warning_ln(yyvsp[-1]->source_line,
+				_("old awk does not support multidimensional arrays"));
+		}
+		yyvsp[0]->nexti->opcode = Op_push_array;
+		yyvsp[-1]->opcode = Op_in_array;
+		if (yyvsp[-3] == NULL) {	/* error */
+			errcount++;
+			yyvsp[-1]->expr_count = 0;
+			yyval = list_merge(yyvsp[0], yyvsp[-1]);
+		} else {
+			INSTRUCTION *t = yyvsp[-3];
+			yyvsp[-1]->expr_count = count_expressions(&t, false);
+			yyval = list_append(list_merge(t, yyvsp[0]), yyvsp[-1]);
+		}
+	  }
+#line 3967 "awkgram.c"
+    break;
+
+  case 158:
+#line 1836 "awkgram.y"
+    {
+		  yyval = mk_getline(yyvsp[-1], yyvsp[0], yyvsp[-3], yyvsp[-2]->redir_type);
+		  bcfree(yyvsp[-2]);
+		}
+#line 3976 "awkgram.c"
+    break;
+
+  case 159:
+#line 1842 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3982 "awkgram.c"
+    break;
+
+  case 160:
+#line 1844 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3988 "awkgram.c"
+    break;
+
+  case 161:
+#line 1846 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 3994 "awkgram.c"
+    break;
+
+  case 162:
+#line 1848 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 4000 "awkgram.c"
+    break;
+
+  case 163:
+#line 1850 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 4006 "awkgram.c"
+    break;
+
+  case 164:
+#line 1852 "awkgram.y"
+    { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
+#line 4012 "awkgram.c"
+    break;
+
+  case 165:
+#line 1857 "awkgram.y"
+    {
+		yyval = list_create(yyvsp[0]);
+	  }
+#line 4020 "awkgram.c"
+    break;
+
+  case 166:
+#line 1861 "awkgram.y"
+    {
+		if (yyvsp[0]->opcode == Op_match_rec) {
+			yyvsp[0]->opcode = Op_nomatch;
+			yyvsp[-1]->opcode = Op_push_i;
+			yyvsp[-1]->memory = set_profile_text(make_number(0.0), "0", 1);
+			yyval = list_append(list_append(list_create(yyvsp[-1]),
+						instruction(Op_field_spec)), yyvsp[0]);
+		} else {
+			if (do_optimize && yyvsp[0]->nexti == yyvsp[0]->lasti
+					&& yyvsp[0]->nexti->opcode == Op_push_i
+					&& (yyvsp[0]->nexti->memory->flags & (MPFN|MPZN|INTLSTR)) == 0
+			) {
+				NODE *n = yyvsp[0]->nexti->memory;
+				if ((n->flags & STRING) != 0) {
+					n->numbr = (AWKNUM) (n->stlen == 0);
+					n->flags &= ~(STRCUR|STRING);
+					n->flags |= (NUMCUR|NUMBER);
+					efree(n->stptr);
+					n->stptr = NULL;
+					n->stlen = 0;
+				} else
+					n->numbr = (AWKNUM) (n->numbr == 0.0);
+				bcfree(yyvsp[-1]);
+				yyval = yyvsp[0];
+			} else {
+				yyvsp[-1]->opcode = Op_not;
+				add_lint(yyvsp[0], LINT_assign_in_cond);
+				yyval = list_append(yyvsp[0], yyvsp[-1]);
+			}
+		}
+	   }
+#line 4056 "awkgram.c"
+    break;
+
+  case 167:
+#line 1893 "awkgram.y"
+    {
+		// Always include. Allows us to lint warn on
+		// print "foo" > "bar" 1
+		// but not warn on
+		// print "foo" > ("bar" 1)
+		yyval = list_append(yyvsp[-1], bcalloc(Op_parens, 1, sourceline));
+	  }
+#line 4068 "awkgram.c"
+    break;
+
+  case 168:
+#line 1901 "awkgram.y"
+    {
+		yyval = snode(yyvsp[-1], yyvsp[-3]);
+		if (yyval == NULL)
+			YYABORT;
+	  }
+#line 4078 "awkgram.c"
+    break;
+
+  case 169:
+#line 1907 "awkgram.y"
+    {
+		yyval = snode(yyvsp[-1], yyvsp[-3]);
+		if (yyval == NULL)
+			YYABORT;
+	  }
+#line 4088 "awkgram.c"
+    break;
+
+  case 170:
+#line 1913 "awkgram.y"
+    {
+		static bool warned = false;
+
+		if (do_lint && ! warned) {
+			warned = true;
+			lintwarn_ln(yyvsp[0]->source_line,
+				_("call of `length' without parentheses is not portable"));
+		}
+		yyval = snode(NULL, yyvsp[0]);
+		if (yyval == NULL)
+			YYABORT;
+	  }
+#line 4105 "awkgram.c"
+    break;
+
+  case 173:
+#line 1928 "awkgram.y"
+    {
+		yyvsp[-1]->opcode = Op_preincrement;
+		yyval = mk_assignment(yyvsp[0], NULL, yyvsp[-1]);
+	  }
+#line 4114 "awkgram.c"
+    break;
+
+  case 174:
+#line 1933 "awkgram.y"
+    {
+		yyvsp[-1]->opcode = Op_predecrement;
+		yyval = mk_assignment(yyvsp[0], NULL, yyvsp[-1]);
+	  }
+#line 4123 "awkgram.c"
+    break;
+
+  case 175:
+#line 1938 "awkgram.y"
+    {
+		yyval = list_create(yyvsp[0]);
+	  }
+#line 4131 "awkgram.c"
+    break;
+
+  case 176:
+#line 1942 "awkgram.y"
+    {
+		yyval = list_create(yyvsp[0]);
+	  }
+#line 4139 "awkgram.c"
+    break;
+
+  case 177:
+#line 1946 "awkgram.y"
+    {
+		if (yyvsp[0]->lasti->opcode == Op_push_i
+			&& (yyvsp[0]->lasti->memory->flags & STRING) == 0
+		) {
+			NODE *n = yyvsp[0]->lasti->memory;
+			(void) force_number(n);
+			negate_num(n);
+			yyval = yyvsp[0];
+			bcfree(yyvsp[-1]);
+		} else {
+			yyvsp[-1]->opcode = Op_unary_minus;
+			yyval = list_append(yyvsp[0], yyvsp[-1]);
+		}
+	  }
+#line 4158 "awkgram.c"
+    break;
+
+  case 178:
+#line 1961 "awkgram.y"
+    {
+		if (yyvsp[0]->lasti->opcode == Op_push_i
+			&& (yyvsp[0]->lasti->memory->flags & STRING) == 0
+			&& (yyvsp[0]->lasti->memory->flags & NUMCONSTSTR) != 0) {
+			NODE *n = yyvsp[0]->lasti->memory;
+			add_sign_to_num(n, '+');
+			yyval = yyvsp[0];
+			bcfree(yyvsp[-1]);
+		} else {
+			/*
+			 * was: $$ = $2
+			 * POSIX semantics: force a conversion to numeric type
+			 */
+			yyvsp[-1]->opcode = Op_unary_plus;
+			yyval = list_append(yyvsp[0], yyvsp[-1]);
+		}
+	  }
+#line 4180 "awkgram.c"
+    break;
+
+  case 179:
+#line 1982 "awkgram.y"
+    {
+		func_use(yyvsp[0]->lasti->func_name, FUNC_USE);
+		yyval = yyvsp[0];
+	  }
+#line 4189 "awkgram.c"
+    break;
+
+  case 180:
+#line 1987 "awkgram.y"
+    {
+		/* indirect function call */
+		INSTRUCTION *f, *t;
+		char *name;
+		NODE *indirect_var;
+		static bool warned = false;
+		const char *msg = _("indirect function calls are a gawk extension");
+
+		if (do_traditional || do_posix)
+			yyerror("%s", msg);
+		else if (do_lint && ! warned) {
+			warned = true;
+			lintwarn("%s", msg);
+		}
+
+		f = yyvsp[0]->lasti;
+		f->opcode = Op_indirect_func_call;
+		name = estrdup(f->func_name, strlen(f->func_name));
+		if (is_std_var(name))
+			yyerror(_("can not use special variable `%s' for indirect function call"), name);
+		indirect_var = variable(f->source_line, name, Node_var_new);
+		t = instruction(Op_push);
+		t->memory = indirect_var;
+
+		/* prepend indirect var instead of appending to arguments (opt_expression_list),
+		 * and pop it off in setup_frame (eval.c) (left to right evaluation order); Test case:
+		 *		f = "fun"
+		 *		@f(f="real_fun")
+		 */
+
+		yyval = list_prepend(yyvsp[0], t);
+		at_seen = false;
+	  }
+#line 4227 "awkgram.c"
+    break;
+
+  case 181:
+#line 2024 "awkgram.y"
+    {
+		NODE *n;
+		char *name = yyvsp[-3]->func_name;
+		char *qname = qualify_name(name, strlen(name));
+
+		if (qname != name) {
+			efree((char *) name);
+			yyvsp[-3]->func_name = qname;
+		}
+
+		if (! at_seen) {
+			n = lookup(yyvsp[-3]->func_name);
+			if (n != NULL && n->type != Node_func
+			    && n->type != Node_ext_func) {
+				error_ln(yyvsp[-3]->source_line,
+					_("attempt to use non-function `%s' in function call"),
+						yyvsp[-3]->func_name);
+			}
+		}
+
+		param_sanity(yyvsp[-1]);
+		yyvsp[-3]->opcode = Op_func_call;
+		yyvsp[-3]->func_body = NULL;
+		if (yyvsp[-1] == NULL) {	/* no argument or error */
+			(yyvsp[-3] + 1)->expr_count = 0;
+			yyval = list_create(yyvsp[-3]);
+		} else {
+			INSTRUCTION *t = yyvsp[-1];
+			(yyvsp[-3] + 1)->expr_count = count_expressions(&t, true);
+			yyval = list_append(t, yyvsp[-3]);
+		}
+	  }
+#line 4264 "awkgram.c"
+    break;
+
+  case 182:
+#line 2060 "awkgram.y"
+    { yyval = NULL; }
+#line 4270 "awkgram.c"
+    break;
+
+  case 183:
+#line 2062 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 4276 "awkgram.c"
+    break;
+
+  case 184:
+#line 2067 "awkgram.y"
+    { yyval = NULL; }
+#line 4282 "awkgram.c"
+    break;
+
+  case 185:
+#line 2069 "awkgram.y"
+    { yyval = yyvsp[-1]; }
+#line 4288 "awkgram.c"
+    break;
+
+  case 186:
+#line 2074 "awkgram.y"
+    {	yyval = yyvsp[0]; }
+#line 4294 "awkgram.c"
+    break;
+
+  case 187:
+#line 2076 "awkgram.y"
+    {
+		yyval = list_merge(yyvsp[-1], yyvsp[0]);
+	  }
+#line 4302 "awkgram.c"
+    break;
+
+  case 188:
+#line 2083 "awkgram.y"
+    {
+		INSTRUCTION *ip = yyvsp[0]->lasti;
+		int count = ip->sub_count;	/* # of SUBSEP-seperated expressions */
+		if (count > 1) {
+			/* change Op_subscript or Op_sub_array to Op_concat */
+			ip->opcode = Op_concat;
+			ip->concat_flag = CSUBSEP;
+			ip->expr_count = count;
+		} else
+			ip->opcode = Op_no_op;
+		sub_counter++;	/* count # of dimensions */
+		yyval = yyvsp[0];
+	  }
+#line 4320 "awkgram.c"
+    break;
+
+  case 189:
+#line 2100 "awkgram.y"
+    {
+		INSTRUCTION *t = yyvsp[-1];
+		if (yyvsp[-1] == NULL) {
+			error_ln(yyvsp[0]->source_line,
+				_("invalid subscript expression"));
+			/* install Null string as subscript. */
+			t = list_create(instruction(Op_push_i));
+			t->nexti->memory = dupnode(Nnull_string);
+			yyvsp[0]->sub_count = 1;
+		} else
+			yyvsp[0]->sub_count = count_expressions(&t, false);
+		yyval = list_append(t, yyvsp[0]);
+	  }
+#line 4338 "awkgram.c"
+    break;
+
+  case 190:
+#line 2117 "awkgram.y"
+    {	yyval = yyvsp[0]; }
+#line 4344 "awkgram.c"
+    break;
+
+  case 191:
+#line 2119 "awkgram.y"
+    {
+		yyval = list_merge(yyvsp[-1], yyvsp[0]);
+	  }
+#line 4352 "awkgram.c"
+    break;
+
+  case 192:
+#line 2126 "awkgram.y"
+    { yyval = yyvsp[-1]; }
+#line 4358 "awkgram.c"
+    break;
+
+  case 193:
+#line 2131 "awkgram.y"
+    {
+		yyvsp[0]->opcode = Op_push;
+		yyvsp[0]->memory = variable(yyvsp[0]->source_line, yyvsp[0]->lextok, Node_var_new);
+		yyval = list_create(yyvsp[0]);
+	  }
+#line 4368 "awkgram.c"
+    break;
+
+  case 194:
+#line 2137 "awkgram.y"
+    {
+		char *arr = yyvsp[-1]->lextok;
+
+		yyvsp[-1]->memory = variable(yyvsp[-1]->source_line, arr, Node_var_new);
+		yyvsp[-1]->opcode = Op_push_array;
+		yyval = list_prepend(yyvsp[0], yyvsp[-1]);
+	  }
+#line 4380 "awkgram.c"
+    break;
+
+  case 195:
+#line 2148 "awkgram.y"
+    {
+		INSTRUCTION *ip = yyvsp[0]->nexti;
+		if (ip->opcode == Op_push
+			&& ip->memory->type == Node_var
+			&& ip->memory->var_update
+		) {
+			yyval = list_prepend(yyvsp[0], instruction(Op_var_update));
+			yyval->nexti->update_var = ip->memory->var_update;
+		} else
+			yyval = yyvsp[0];
+	  }
+#line 4396 "awkgram.c"
+    break;
+
+  case 196:
+#line 2160 "awkgram.y"
+    {
+		yyval = list_append(yyvsp[-1], yyvsp[-2]);
+		if (yyvsp[0] != NULL)
+			mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
+	  }
+#line 4406 "awkgram.c"
+    break;
+
+  case 197:
+#line 2169 "awkgram.y"
+    {
+		yyvsp[0]->opcode = Op_postincrement;
+	  }
+#line 4414 "awkgram.c"
+    break;
+
+  case 198:
+#line 2173 "awkgram.y"
+    {
+		yyvsp[0]->opcode = Op_postdecrement;
+	  }
+#line 4422 "awkgram.c"
+    break;
+
+  case 199:
+#line 2177 "awkgram.y"
+    { yyval = NULL; }
+#line 4428 "awkgram.c"
+    break;
+
+  case 200:
+#line 2181 "awkgram.y"
+    { yyval = yyvsp[0]; }
+#line 4434 "awkgram.c"
+    break;
+
+  case 201:
+#line 2185 "awkgram.y"
+    { yyval = yyvsp[0]; yyerrok; }
+#line 4440 "awkgram.c"
+    break;
+
+  case 202:
+#line 2189 "awkgram.y"
+    { yyerrok; }
+#line 4446 "awkgram.c"
+    break;
+
+  case 203:
+#line 2194 "awkgram.y"
+    { yyval = NULL; }
+#line 4452 "awkgram.c"
+    break;
+
+  case 205:
+#line 2199 "awkgram.y"
+    { yyerrok; }
+#line 4458 "awkgram.c"
+    break;
+
+  case 206:
+#line 2203 "awkgram.y"
+    { yyval = yyvsp[0]; yyerrok; }
+#line 4464 "awkgram.c"
+    break;
+
+  case 207:
+#line 2207 "awkgram.y"
+    { yyval = yyvsp[0]; yyerrok; }
+#line 4470 "awkgram.c"
+    break;
+
+
+#line 4474 "awkgram.c"
+
+      default: break;
+    }
+  /* User semantic actions sometimes alter yychar, and that requires
+     that yytoken be updated with the new translation.  We take the
+     approach of translating immediately before every use of yytoken.
+     One alternative is translating here after every semantic action,
+     but that translation would be missed if the semantic action invokes
+     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
+     incorrect destructor might then be invoked immediately.  In the
+     case of YYERROR or YYBACKUP, subsequent parser actions might lead
+     to an incorrect destructor call or verbose syntax error message
+     before the lookahead is translated.  */
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+  /* Now 'shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+  {
+    const int yylhs = yyr1[yyn] - YYNTOKENS;
+    const int yyi = yypgoto[yylhs] + *yyssp;
+    yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+               ? yytable[yyi]
+               : yydefgoto[yylhs]);
+  }
+
+  goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error.  |
+`--------------------------------------*/
+yyerrlab:
+  /* Make sure we have latest lookahead translation.  See comments at
+     user semantic actions for why this is necessary.  */
+  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
+                                        yyssp, yytoken)
+      {
+        char const *yymsgp = YY_("syntax error");
+        int yysyntax_error_status;
+        yysyntax_error_status = YYSYNTAX_ERROR;
+        if (yysyntax_error_status == 0)
+          yymsgp = yymsg;
+        else if (yysyntax_error_status == 1)
+          {
+            if (yymsg != yymsgbuf)
+              YYSTACK_FREE (yymsg);
+            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
+            if (!yymsg)
+              {
+                yymsg = yymsgbuf;
+                yymsg_alloc = sizeof yymsgbuf;
+                yysyntax_error_status = 2;
+              }
+            else
+              {
+                yysyntax_error_status = YYSYNTAX_ERROR;
+                yymsgp = yymsg;
+              }
+          }
+        yyerror (yymsgp);
+        if (yysyntax_error_status == 2)
+          goto yyexhaustedlab;
+      }
+# undef YYSYNTAX_ERROR
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+         error, discard it.  */
+
+      if (yychar <= YYEOF)
+        {
+          /* Return failure if at end of input.  */
+          if (yychar == YYEOF)
+            YYABORT;
+        }
+      else
+        {
+          yydestruct ("Error: discarding",
+                      yytoken, &yylval);
+          yychar = YYEMPTY;
+        }
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+  /* Pacify compilers when the user code never invokes YYERROR and the
+     label yyerrorlab therefore never appears in user code.  */
+  if (0)
+    YYERROR;
+
+  /* Do not reclaim the symbols of the rule whose action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (!yypact_value_is_default (yyn))
+        {
+          yyn += YYTERROR;
+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+            {
+              yyn = yytable[yyn];
+              if (0 < yyn)
+                break;
+            }
+        }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+        YYABORT;
+
+
+      yydestruct ("Error: popping",
+                  yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+
+#if !defined yyoverflow || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+
+/*-----------------------------------------------------.
+| yyreturn -- parsing is finished, return the result.  |
+`-----------------------------------------------------*/
+yyreturn:
+  if (yychar != YYEMPTY)
+    {
+      /* Make sure we have latest lookahead translation.  See comments at
+         user semantic actions for why this is necessary.  */
+      yytoken = YYTRANSLATE (yychar);
+      yydestruct ("Cleanup: discarding lookahead",
+                  yytoken, &yylval);
+    }
+  /* Do not reclaim the symbols of the rule whose action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+                  yystos[*yyssp], yyvsp);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  return yyresult;
+}
+#line 2209 "awkgram.y"
+
+
+struct token {
+	const char *operator;	/* text to match */
+	OPCODE value;			/*  type */
+	int class;				/* lexical class */
+	unsigned flags;			/* # of args. allowed and compatability */
+#	define	ARGS	0xFF	/* 0, 1, 2, 3 args allowed (any combination */
+#	define	A(n)	(1<<(n))
+#	define	VERSION_MASK	0xFF00	/* old awk is zero */
+#	define	NOT_OLD		0x0100	/* feature not in old awk */
+#	define	NOT_POSIX	0x0200	/* feature not in POSIX */
+#	define	GAWKX		0x0400	/* gawk extension */
+#	define	BREAK		0x0800	/* break allowed inside */
+#	define	CONTINUE	0x1000	/* continue allowed inside */
+#	define	DEBUG_USE	0x2000	/* for use by developers */
+
+	NODE *(*ptr)(int);	/* function that implements this keyword */
+	NODE *(*ptr2)(int);	/* alternate arbitrary-precision function */
+};
+
+#ifdef USE_EBCDIC
+/* tokcompare --- lexicographically compare token names for sorting */
+
+static int
+tokcompare(const void *l, const void *r)
+{
+	struct token *lhs, *rhs;
+
+	lhs = (struct token *) l;
+	rhs = (struct token *) r;
+
+	return strcmp(lhs->operator, rhs->operator);
+}
+#endif
+
+/*
+ * Tokentab is sorted ASCII ascending order, so it can be binary searched.
+ * See check_special(), which sorts the table on EBCDIC systems.
+ * Function pointers come from declarations in awk.h.
+ */
+
+#ifdef HAVE_MPFR
+#define MPF(F) do_mpfr_##F
+#else
+#define MPF(F) 0
+#endif
+
+static const struct token tokentab[] = {
+{"BEGIN",	Op_rule,	 LEX_BEGIN,	0,		0,	0},
+{"BEGINFILE",	Op_rule,	 LEX_BEGINFILE,	GAWKX,		0,	0},
+{"END",		Op_rule,	 LEX_END,	0,		0,	0},
+{"ENDFILE",	Op_rule,	 LEX_ENDFILE,	GAWKX,		0,	0},
+#ifdef ARRAYDEBUG
+{"adump",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(1)|A(2)|DEBUG_USE,	do_adump,	0},
+#endif
+{"and",		Op_builtin,    LEX_BUILTIN,	GAWKX,		do_and,	MPF(and)},
+{"asort",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2)|A(3),	do_asort,	0},
+{"asorti",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2)|A(3),	do_asorti,	0},
+{"atan2",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(2),	do_atan2,	MPF(atan2)},
+{"bindtextdomain",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2),	do_bindtextdomain,	0},
+{"break",	Op_K_break,	 LEX_BREAK,	0,		0,	0},
+{"case",	Op_K_case,	 LEX_CASE,	GAWKX,		0,	0},
+{"close",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1)|A(2),	do_close,	0},
+{"compl",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(1),	do_compl,	MPF(compl)},
+{"continue",	Op_K_continue, LEX_CONTINUE,	0,		0,	0},
+{"cos",		Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_cos,	MPF(cos)},
+{"dcgettext",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2)|A(3),	do_dcgettext,	0},
+{"dcngettext",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2)|A(3)|A(4)|A(5),	do_dcngettext,	0},
+{"default",	Op_K_default,	 LEX_DEFAULT,	GAWKX,		0,	0},
+{"delete",	Op_K_delete,	 LEX_DELETE,	NOT_OLD,	0,	0},
+{"do",		Op_K_do,	 LEX_DO,	NOT_OLD|BREAK|CONTINUE,	0,	0},
+{"else",	Op_K_else,	 LEX_ELSE,	0,		0,	0},
+{"eval",	Op_symbol,	 LEX_EVAL,	0,		0,	0},
+{"exit",	Op_K_exit,	 LEX_EXIT,	0,		0,	0},
+{"exp",		Op_builtin,	 LEX_BUILTIN,	A(1),		do_exp,	MPF(exp)},
+{"fflush",	Op_builtin,	 LEX_BUILTIN,	A(0)|A(1), do_fflush,	0},
+{"for",		Op_K_for,	 LEX_FOR,	BREAK|CONTINUE,	0,	0},
+{"func",	Op_func, 	LEX_FUNCTION,	NOT_POSIX|NOT_OLD,	0,	0},
+{"function",	Op_func, 	LEX_FUNCTION,	NOT_OLD,	0,	0},
+{"gensub",	Op_sub_builtin,	 LEX_BUILTIN,	GAWKX|A(3)|A(4), 0,	0},
+{"getline",	Op_K_getline_redir,	 LEX_GETLINE,	NOT_OLD,	0,	0},
+{"gsub",	Op_sub_builtin,	 LEX_BUILTIN,	NOT_OLD|A(2)|A(3), 0,	0},
+{"if",		Op_K_if,	 LEX_IF,	0,		0,	0},
+{"in",		Op_symbol,	 LEX_IN,	0,		0,	0},
+{"include",	Op_symbol,	 LEX_INCLUDE,	GAWKX,	0,	0},
+{"index",	Op_builtin,	 LEX_BUILTIN,	A(2),		do_index,	0},
+{"int",		Op_builtin,	 LEX_BUILTIN,	A(1),		do_int,	MPF(int)},
+#ifdef SUPPLY_INTDIV
+{"intdiv0",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(3),	do_intdiv,	MPF(intdiv)},
+#endif
+{"isarray",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1),	do_isarray,	0},
+{"length",	Op_builtin,	 LEX_LENGTH,	A(0)|A(1),	do_length,	0},
+{"load",  	Op_symbol,	 LEX_LOAD,	GAWKX,		0,	0},
+{"log",		Op_builtin,	 LEX_BUILTIN,	A(1),		do_log,	MPF(log)},
+{"lshift",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(2),	do_lshift,	MPF(lshift)},
+{"match",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(2)|A(3), do_match,	0},
+{"mktime",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2), do_mktime, 0},
+{"namespace",  	Op_symbol,	 LEX_NAMESPACE,	GAWKX,		0,	0},
+{"next",	Op_K_next,	 LEX_NEXT,	0,		0,	0},
+{"nextfile",	Op_K_nextfile, LEX_NEXTFILE,	0,		0,	0},
+{"or",		Op_builtin,    LEX_BUILTIN,	GAWKX,		do_or,	MPF(or)},
+{"patsplit",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(2)|A(3)|A(4), do_patsplit,	0},
+{"print",	Op_K_print,	 LEX_PRINT,	0,		0,	0},
+{"printf",	Op_K_printf,	 LEX_PRINTF,	0,		0,	0},
+{"rand",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(0),	do_rand,	MPF(rand)},
+{"return",	Op_K_return,	 LEX_RETURN,	NOT_OLD,	0,	0},
+{"rshift",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(2),	do_rshift,	MPF(rshift)},
+{"sin",		Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_sin,	MPF(sin)},
+{"split",	Op_builtin,	 LEX_BUILTIN,	A(2)|A(3)|A(4),	do_split,	0},
+{"sprintf",	Op_builtin,	 LEX_BUILTIN,	0,		do_sprintf,	0},
+{"sqrt",	Op_builtin,	 LEX_BUILTIN,	A(1),		do_sqrt,	MPF(sqrt)},
+{"srand",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(0)|A(1), do_srand,	MPF(srand)},
+#if defined(GAWKDEBUG) || defined(ARRAYDEBUG) /* || ... */
+{"stopme",	Op_builtin,	LEX_BUILTIN,	GAWKX|A(0)|DEBUG_USE,	stopme,		0},
+#endif
+{"strftime",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(0)|A(1)|A(2)|A(3), do_strftime,	0},
+{"strtonum",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(1),	do_strtonum, MPF(strtonum)},
+{"sub",		Op_sub_builtin,	 LEX_BUILTIN,	NOT_OLD|A(2)|A(3), 0,	0},
+{"substr",	Op_builtin,	 LEX_BUILTIN,	A(2)|A(3),	do_substr,	0},
+{"switch",	Op_K_switch,	 LEX_SWITCH,	GAWKX|BREAK,	0,	0},
+{"system",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_system,	0},
+{"systime",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(0),	do_systime,	0},
+{"tolower",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_tolower,	0},
+{"toupper",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_toupper,	0},
+{"typeof",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2), do_typeof,	0},
+{"while",	Op_K_while,	 LEX_WHILE,	BREAK|CONTINUE,	0,	0},
+{"xor",		Op_builtin,    LEX_BUILTIN,	GAWKX,		do_xor,	MPF(xor)},
+};
+
+/* Variable containing the current shift state.  */
+static mbstate_t cur_mbstate;
+/* Ring buffer containing current characters.  */
+#define MAX_CHAR_IN_RING_BUFFER 8
+#define RING_BUFFER_SIZE (MAX_CHAR_IN_RING_BUFFER * MB_LEN_MAX)
+static char cur_char_ring[RING_BUFFER_SIZE];
+/* Index for ring buffers.  */
+static int cur_ring_idx;
+/* This macro means that last nextc() return a singlebyte character
+   or 1st byte of a multibyte character.  */
+#define nextc_is_1stbyte (cur_char_ring[cur_ring_idx] == 1)
+
+/* getfname --- return name of a builtin function (for pretty printing) */
+
+const char *
+getfname(NODE *(*fptr)(int), bool prepend_awk)
+{
+	int i, j;
+	static char buf[100];
+
+	j = sizeof(tokentab) / sizeof(tokentab[0]);
+	/* linear search, no other way to do it */
+	for (i = 0; i < j; i++) {
+		if (tokentab[i].ptr == fptr || tokentab[i].ptr2 == fptr) {
+			if (prepend_awk && (tokentab[i].flags & GAWKX) != 0) {
+				sprintf(buf, "awk::%s", tokentab[i].operator);
+				return buf;
+			}
+			return tokentab[i].operator;
+		}
+	}
+
+	return NULL;
+}
+
+/* negate_num --- negate a number in NODE */
+
+void
+negate_num(NODE *n)
+{
+#ifdef HAVE_MPFR
+	int tval = 0;
+#endif
+
+	add_sign_to_num(n, '-');
+
+	if (! is_mpg_number(n)) {
+		n->numbr = -n->numbr;
+		return;
+	}
+
+#ifdef HAVE_MPFR
+	if (is_mpg_integer(n)) {
+		if (! iszero(n)) {
+			mpz_neg(n->mpg_i, n->mpg_i);
+			return;
+		}
+
+		/*
+		 * 0 --> -0 conversion. Requires turning the MPG integer
+		 * into an MPFR float.
+		 */
+
+		mpz_clear(n->mpg_i);	/* release the integer storage */
+
+		/* Convert and fall through. */
+		tval = mpfr_set_d(n->mpg_numbr, 0.0, ROUND_MODE);
+		IEEE_FMT(n->mpg_numbr, tval);
+		n->flags &= ~MPZN;
+		n->flags |= MPFN;
+	}
+
+	/* mpfr float case */
+	tval = mpfr_neg(n->mpg_numbr, n->mpg_numbr, ROUND_MODE);
+	IEEE_FMT(n->mpg_numbr, tval);
+#endif
+}
+
+/* add_sign_to_num --- make a constant unary plus or minus for profiling */
+
+static void
+add_sign_to_num(NODE *n, char sign)
+{
+	if ((n->flags & NUMCONSTSTR) != 0) {
+		char *s;
+
+		s = n->stptr;
+		memmove(& s[1], & s[0], n->stlen + 1);
+		s[0] = sign;
+		n->stlen++;
+	}
+}
+
+/* print_included_from --- print `Included from ..' file names and locations */
+
+static void
+print_included_from()
+{
+	int saveline, line;
+	SRCFILE *s;
+
+	/* suppress current file name, line # from `.. included from ..' msgs */
+	saveline = sourceline;
+	sourceline = 0;
+
+	for (s = sourcefile; s != NULL && s->stype == SRC_INC; ) {
+		s = s->next;
+		if (s == NULL || s->fd <= INVALID_HANDLE)
+			continue;
+		line = s->srclines;
+
+		/* if last token is NEWLINE, line number is off by 1. */
+		if (s->lasttok == NEWLINE)
+			line--;
+		msg("%s %s:%d%c",
+			s->prev == sourcefile ? "In file included from"
+					  : "                 from",
+			(s->stype == SRC_INC ||
+				 s->stype == SRC_FILE) ? s->src : "cmd. line",
+			line,
+			s->stype == SRC_INC ? ',' : ':'
+		);
+	}
+	sourceline = saveline;
+}
+
+/* warning_ln --- print a warning message with location */
+
+static void
+warning_ln(int line, const char *mesg, ...)
+{
+	va_list args;
+	int saveline;
+
+	saveline = sourceline;
+	sourceline = line;
+	print_included_from();
+	va_start(args, mesg);
+	err(false, _("warning: "), mesg, args);
+	va_end(args);
+	sourceline = saveline;
+}
+
+/* lintwarn_ln --- print a lint warning and location */
+
+static void
+lintwarn_ln(int line, const char *mesg, ...)
+{
+	va_list args;
+	int saveline;
+
+	saveline = sourceline;
+	sourceline = line;
+	print_included_from();
+	va_start(args, mesg);
+	if (lintfunc == r_fatal)
+		err(true, _("fatal: "), mesg, args);
+	else
+		err(false, _("warning: "), mesg, args);
+	va_end(args);
+	sourceline = saveline;
+	if (lintfunc == r_fatal)
+		gawk_exit(EXIT_FATAL);
+}
+
+/* error_ln --- print an error message and location */
+
+static void
+error_ln(int line, const char *m, ...)
+{
+	va_list args;
+	int saveline;
+
+	saveline = sourceline;
+	sourceline = line;
+	print_included_from();
+	errcount++;
+	va_start(args, m);
+	err(false, "error: ", m, args);
+	va_end(args);
+	sourceline = saveline;
+}
+
+/* yyerror --- print a syntax error message, show where */
+
+static void
+yyerror(const char *m, ...)
+{
+	va_list args;
+	const char *mesg = NULL;
+	char *bp, *cp;
+	char *scan;
+	char *buf;
+	int count;
+	static char end_of_file_line[] = "(END OF FILE)";
+	static char syntax_error[] = "syntax error";
+	static size_t syn_err_len = sizeof(syntax_error) - 1;
+	bool generic_error = (strncmp(m, syntax_error, syn_err_len) == 0);
+
+	print_included_from();
+
+	errcount++;
+	/* Find the current line in the input file */
+	if (lexptr && lexeme) {
+		if (thisline == NULL) {
+			cp = lexeme;
+			if (*cp == '\n') {
+				if (cp > lexptr_begin)
+					cp--;
+				mesg = _("unexpected newline or end of string");
+			}
+			for (; cp != lexptr_begin && *cp != '\n'; --cp)
+				continue;
+			if (*cp == '\n')
+				cp++;
+			thisline = cp;
+		}
+		/* NL isn't guaranteed */
+		bp = lexeme;
+		if (bp < thisline)
+			bp = thisline + 1;
+		while (bp < lexend && *bp && *bp != '\n')
+			bp++;
+	} else {
+		thisline = end_of_file_line;
+		bp = thisline + strlen(thisline);
+	}
+
+	if (lexeof && mesg == NULL && generic_error) {
+		msg("%s", end_of_file_line);
+		mesg = _("source files / command-line arguments must contain complete functions or rules");
+	} else
+		msg("%.*s", (int) (bp - thisline), thisline);
+
+	va_start(args, m);
+	if (mesg == NULL)
+		mesg = m;
+
+	count = strlen(mesg) + 1;
+	if (lexptr != NULL)
+		count += (lexeme - thisline) + 2;
+	ezalloc(buf, char *, count+1, "yyerror");
+
+	bp = buf;
+
+	if (lexptr != NULL) {
+		scan = thisline;
+		while (scan < lexeme)
+			if (*scan++ == '\t')
+				*bp++ = '\t';
+			else
+				*bp++ = ' ';
+		*bp++ = '^';
+		*bp++ = ' ';
+	}
+	strcpy(bp, mesg);
+	err(false, "", buf, args);
+	va_end(args);
+	efree(buf);
+}
+
+/* mk_program --- create a single list of instructions */
+
+static INSTRUCTION *
+mk_program()
+{
+	INSTRUCTION *cp, *tmp;
+
+#define begin_block         rule_block[BEGIN]
+#define end_block           rule_block[END]
+#define prog_block          rule_block[Rule]
+#define beginfile_block     rule_block[BEGINFILE]
+#define endfile_block       rule_block[ENDFILE]
+
+	if (end_block == NULL)
+		end_block = list_create(ip_end);
+	else
+		(void) list_prepend(end_block, ip_end);
+
+	if (! in_main_context()) {
+		if (begin_block != NULL && prog_block != NULL)
+			cp = list_merge(begin_block, prog_block);
+		else
+			cp = (begin_block != NULL) ? begin_block : prog_block;
+
+		if (cp != NULL)
+			(void) list_merge(cp, end_block);
+		else
+			cp = end_block;
+
+		(void) list_append(cp, instruction(Op_stop));
+		goto out;
+	}
+
+	if (endfile_block == NULL)
+		endfile_block = list_create(ip_endfile);
+	else {
+		ip_rec->has_endfile = true;
+		(void) list_prepend(endfile_block, ip_endfile);
+	}
+
+	if (beginfile_block == NULL)
+		beginfile_block = list_create(ip_beginfile);
+	else
+		(void) list_prepend(beginfile_block, ip_beginfile);
+
+	if (prog_block == NULL) {
+		if (end_block->nexti == end_block->lasti
+				&& beginfile_block->nexti == beginfile_block->lasti
+				&& endfile_block->nexti == endfile_block->lasti
+		) {
+			/* no pattern-action and (real) end, beginfile or endfile blocks */
+			bcfree(ip_rec);
+			bcfree(ip_newfile);
+			ip_rec = ip_newfile = NULL;
+
+			list_append(beginfile_block, instruction(Op_after_beginfile));
+			(void) list_append(endfile_block, instruction(Op_after_endfile));
+
+			if (begin_block == NULL)     /* no program at all */
+				cp = end_block;
+			else
+				cp = list_merge(begin_block, end_block);
+
+			if (interblock_comment != NULL) {
+				(void) list_append(cp, interblock_comment);
+				interblock_comment = NULL;
+			}
+
+			(void) list_append(cp, ip_atexit);
+			(void) list_append(cp, instruction(Op_stop));
+
+			/* append beginfile_block and endfile_block for sole use
+			 * in getline without redirection (Op_K_getline).
+			 */
+
+			(void) list_merge(cp, beginfile_block);
+			(void) list_merge(cp, endfile_block);
+
+			if (outer_comment != NULL) {
+				cp = list_merge(list_create(outer_comment), cp);
+				outer_comment = NULL;
+			}
+
+			if (interblock_comment != NULL) {
+				(void) list_append(cp, interblock_comment);
+				interblock_comment = NULL;
+			}
+
+			goto out;
+
+		} else {
+			/* install a do-nothing prog block */
+			prog_block = list_create(instruction(Op_no_op));
+		}
+	}
+
+	(void) list_append(endfile_block, instruction(Op_after_endfile));
+	(void) list_prepend(prog_block, ip_rec);
+	(void) list_append(prog_block, instruction(Op_jmp));
+	prog_block->lasti->target_jmp = ip_rec;
+
+	list_append(beginfile_block, instruction(Op_after_beginfile));
+
+	cp = list_merge(beginfile_block, prog_block);
+	(void) list_prepend(cp, ip_newfile);
+	(void) list_merge(cp, endfile_block);
+	(void) list_merge(cp, end_block);
+	if (begin_block != NULL)
+		cp = list_merge(begin_block, cp);
+
+	if (outer_comment != NULL) {
+		cp = list_merge(list_create(outer_comment), cp);
+		outer_comment = NULL;
+	}
+
+	if (interblock_comment != NULL) {
+		(void) list_append(cp, interblock_comment);
+		interblock_comment = NULL;
+	}
+
+	(void) list_append(cp, ip_atexit);
+	(void) list_append(cp, instruction(Op_stop));
+
+out:
+	/* delete the Op_list, not needed */
+	tmp = cp->nexti;
+	bcfree(cp);
+	return tmp;
+
+#undef begin_block
+#undef end_block
+#undef prog_block
+#undef beginfile_block
+#undef endfile_block
+}
+
+/* parse_program --- read in the program and convert into a list of instructions */
+
+int
+parse_program(INSTRUCTION **pcode, bool from_eval)
+{
+	int ret;
+
+	called_from_eval = from_eval;
+
+	/* pre-create non-local jump targets
+	 * ip_end (Op_no_op) -- used as jump target for `exit'
+	 * outside an END block.
+	 */
+	ip_end = instruction(Op_no_op);
+
+	if (! in_main_context())
+		ip_newfile = ip_rec = ip_atexit = ip_beginfile = ip_endfile = NULL;
+	else {
+		ip_endfile = instruction(Op_no_op);
+		main_beginfile = ip_beginfile = instruction(Op_no_op);
+		ip_rec = instruction(Op_get_record); /* target for `next', also ip_newfile */
+		ip_newfile = bcalloc(Op_newfile, 2, 0); /* target for `nextfile' */
+		ip_newfile->target_jmp = ip_end;
+		ip_newfile->target_endfile = ip_endfile;
+		(ip_newfile + 1)->target_get_record = ip_rec;
+		ip_rec->target_newfile = ip_newfile;
+		ip_atexit = instruction(Op_atexit);	/* target for `exit' in END block */
+	}
+
+	for (sourcefile = srcfiles->next; sourcefile->stype == SRC_EXTLIB;
+			sourcefile = sourcefile->next)
+		;
+
+	lexeof = false;
+	lexptr = NULL;
+	lasttok = 0;
+	memset(rule_block, 0, sizeof(ruletab) * sizeof(INSTRUCTION *));
+	errcount = 0;
+	tok = tokstart != NULL ? tokstart : tokexpand();
+
+	ret = yyparse();
+	*pcode = mk_program();
+
+	/* avoid false source indications */
+	source = NULL;
+	sourceline = 0;
+	if (ret == 0)	/* avoid spurious warning if parser aborted with YYABORT */
+		check_funcs();
+
+	if (do_posix && ! check_param_names())
+		errcount++;
+
+	if (args_array == NULL)
+		emalloc(args_array, NODE **, (max_args + 2) * sizeof(NODE *), "parse_program");
+	else
+		erealloc(args_array, NODE **, (max_args + 2) * sizeof(NODE *), "parse_program");
+
+	return (ret || errcount);
+}
+
+/* free_srcfile --- free a SRCFILE struct */
+
+void
+free_srcfile(SRCFILE *thisfile)
+{
+	efree(thisfile->src);
+	efree(thisfile);
+}
+
+/* do_add_srcfile --- add one item to srcfiles */
+
+static SRCFILE *
+do_add_srcfile(enum srctype stype, char *src, char *path, SRCFILE *thisfile)
+{
+	SRCFILE *s;
+
+	ezalloc(s, SRCFILE *, sizeof(SRCFILE), "do_add_srcfile");
+	s->src = estrdup(src, strlen(src));
+	s->fullpath = path;
+	s->stype = stype;
+	s->fd = INVALID_HANDLE;
+	s->next = thisfile;
+	s->prev = thisfile->prev;
+	thisfile->prev->next = s;
+	thisfile->prev = s;
+	return s;
+}
+
+/* add_srcfile --- add one item to srcfiles after checking if
+ *				a source file exists and not already in list.
+ */
+
+SRCFILE *
+add_srcfile(enum srctype stype, char *src, SRCFILE *thisfile, bool *already_included, int *errcode)
+{
+	SRCFILE *s;
+	struct stat sbuf;
+	char *path;
+	int errno_val = 0;
+
+	if (already_included)
+		*already_included = false;
+	if (errcode)
+		*errcode = 0;
+	if (stype == SRC_CMDLINE || stype == SRC_STDIN)
+		return do_add_srcfile(stype, src, NULL, thisfile);
+
+	path = find_source(src, & sbuf, & errno_val, stype == SRC_EXTLIB);
+	if (path == NULL) {
+		if (errcode) {
+			*errcode = errno_val;
+			return NULL;
+		}
+		/* use full messages to ease translation */
+		fatal(stype != SRC_EXTLIB
+			? _("can't open source file `%s' for reading (%s)")
+			: _("can't open shared library `%s' for reading (%s)"),
+				src,
+				errno_val ? strerror(errno_val) : _("reason unknown"));
+	}
+
+	/* N.B. We do not eliminate duplicate SRC_FILE (-f) programs. */
+	for (s = srcfiles->next; s != srcfiles; s = s->next) {
+		if ((s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == SRC_EXTLIB) && files_are_same(path, s)) {
+			if (stype == SRC_INC || stype == SRC_EXTLIB) {
+				/* eliminate duplicates */
+				if ((stype == SRC_INC) && (s->stype == SRC_FILE))
+					fatal(_("can't include `%s' and use it as a program file"), src);
+
+				if (do_lint) {
+					int line = sourceline;
+					/* Kludge: the line number may be off for `@include file'.
+					 * Since, this function is also used for '-f file' in main.c,
+					 * sourceline > 1 check ensures that the call is at
+					 * parse time.
+					 */
+					if (sourceline > 1 && lasttok == NEWLINE)
+						line--;
+					lintwarn_ln(line,
+						    stype != SRC_EXTLIB
+						      ? _("already included source file `%s'")
+						      : _("already loaded shared library `%s'"),
+						    src);
+				}
+				efree(path);
+				if (already_included)
+					*already_included = true;
+				return NULL;
+			} else {
+				/* duplicates are allowed for -f */
+				if (s->stype == SRC_INC)
+					fatal(_("can't include `%s' and use it as a program file"), src);
+				/* no need to scan for further matches, since
+				 * they must be of homogeneous type */
+				break;
+			}
+		}
+	}
+
+	s = do_add_srcfile(stype, src, path, thisfile);
+	s->sbuf = sbuf;
+	s->mtime = sbuf.st_mtime;
+	return s;
+}
+
+/* include_source --- read program from source included using `@include' */
+
+static bool
+include_source(INSTRUCTION *file, void **srcfile_p)
+{
+	SRCFILE *s;
+	char *src = file->lextok;
+	int errcode;
+	bool already_included;
+
+	*srcfile_p = NULL;
+
+	if (do_traditional || do_posix) {
+		error_ln(file->source_line, _("@include is a gawk extension"));
+		return false;
+	}
+
+	if (strlen(src) == 0) {
+		if (do_lint)
+			lintwarn_ln(file->source_line, _("empty filename after @include"));
+		return true;
+	}
+
+	s = add_srcfile(SRC_INC, src, sourcefile, &already_included, &errcode);
+	if (s == NULL) {
+		if (already_included)
+			return true;
+		error_ln(file->source_line,
+			_("can't open source file `%s' for reading (%s)"),
+			src, errcode ? strerror(errcode) : _("reason unknown"));
+		return false;
+	}
+
+	/* save scanner state for the current sourcefile */
+	sourcefile->srclines = sourceline;
+	sourcefile->lexptr = lexptr;
+	sourcefile->lexend = lexend;
+	sourcefile->lexptr_begin = lexptr_begin;
+	sourcefile->lexeme = lexeme;
+	sourcefile->lasttok = lasttok;
+	sourcefile->namespace = current_namespace;
+
+	/* included file becomes the current source */
+	sourcefile = s;
+	lexptr = NULL;
+	sourceline = 0;
+	source = NULL;
+	lasttok = 0;
+	lexeof = false;
+	eof_warned = false;
+	current_namespace = awk_namespace;
+	*srcfile_p = (void *) s;
+	return true;
+}
+
+/* load_library --- load a shared library */
+
+static bool
+load_library(INSTRUCTION *file, void **srcfile_p)
+{
+	SRCFILE *s;
+	char *src = file->lextok;
+	int errcode;
+	bool already_included;
+
+	*srcfile_p = NULL;
+
+	if (do_traditional || do_posix) {
+		error_ln(file->source_line, _("@load is a gawk extension"));
+		return false;
+	}
+
+
+	if (strlen(src) == 0) {
+		if (do_lint)
+			lintwarn_ln(file->source_line, _("empty filename after @load"));
+		return true;
+	}
+
+	if (do_pretty_print && ! do_profile) {
+		// create a fake one, don't try to open the file
+		s = do_add_srcfile(SRC_EXTLIB, src, src, sourcefile);
+	} else {
+		s = add_srcfile(SRC_EXTLIB, src, sourcefile, &already_included, &errcode);
+		if (s == NULL) {
+			if (already_included)
+				return true;
+			error_ln(file->source_line,
+				_("can't open shared library `%s' for reading (%s)"),
+				src, errcode ? strerror(errcode) : _("reason unknown"));
+			return false;
+		}
+
+		load_ext(s->fullpath);
+	}
+
+	*srcfile_p = (void *) s;
+	return true;
+}
+
+/* next_sourcefile --- read program from the next source in srcfiles */
+
+static void
+next_sourcefile()
+{
+	static int (*closefunc)(int fd) = NULL;
+
+	if (closefunc == NULL) {
+		char *cp = getenv("AWKREADFUNC");
+
+		/* If necessary, one day, test value for different functions.  */
+		if (cp == NULL)
+			closefunc = close;
+		else
+			closefunc = one_line_close;
+	}
+
+	/*
+	 * This won't be true if there's an invalid character in
+	 * the source file or source string (e.g., user typo).
+	 * Previous versions of gawk did not core dump in such a
+	 * case.
+	 *
+	 * assert(lexeof == true);
+	 */
+
+	lexeof = false;
+	eof_warned = false;
+	sourcefile->srclines = sourceline;	/* total no of lines in current file */
+	if (sourcefile->fd > INVALID_HANDLE) {
+		if (sourcefile->fd != fileno(stdin))  /* safety */
+			(*closefunc)(sourcefile->fd);
+		sourcefile->fd = INVALID_HANDLE;
+	}
+	if (sourcefile->buf != NULL) {
+		efree(sourcefile->buf);
+		sourcefile->buf = NULL;
+		sourcefile->lexptr_begin = NULL;
+	}
+
+	while ((sourcefile = sourcefile->next) != NULL) {
+		if (sourcefile == srcfiles)
+			return;
+		if (sourcefile->stype != SRC_EXTLIB)
+			break;
+	}
+
+	if (sourcefile->lexptr_begin != NULL) {
+		/* resume reading from already opened file (postponed to process '@include') */
+		lexptr = sourcefile->lexptr;
+		lexend = sourcefile->lexend;
+		lasttok = sourcefile->lasttok;
+		lexptr_begin = sourcefile->lexptr_begin;
+		lexeme = sourcefile->lexeme;
+		sourceline = sourcefile->srclines;
+		source = sourcefile->src;
+		set_current_namespace(sourcefile->namespace);
+	} else {
+		lexptr = NULL;
+		sourceline = 0;
+		source = NULL;
+		lasttok = 0;
+		set_current_namespace(awk_namespace);
+	}
+}
+
+/* get_src_buf --- read the next buffer of source program */
+
+static char *
+get_src_buf()
+{
+	int n;
+	char *scan;
+	bool newfile;
+	int savelen;
+	struct stat sbuf;
+
+	/*
+	 * No argument prototype on readfunc on purpose,
+	 * avoids problems with some ancient systems where
+	 * the types of arguments to read() aren't up to date.
+	 */
+	static ssize_t (*readfunc)() = 0;
+
+	if (readfunc == NULL) {
+		char *cp = getenv("AWKREADFUNC");
+
+		/* If necessary, one day, test value for different functions.  */
+		if (cp == NULL)
+			/*
+			 * cast is to remove warnings on systems with
+			 * different return types for read.
+			 */
+			readfunc = ( ssize_t(*)() ) read;
+		else
+			readfunc = read_one_line;
+	}
+
+	newfile = false;
+	if (sourcefile == srcfiles)
+		return NULL;
+
+	if (sourcefile->stype == SRC_CMDLINE) {
+		if (sourcefile->bufsize == 0) {
+			sourcefile->bufsize = strlen(sourcefile->src);
+			lexptr = lexptr_begin = lexeme = sourcefile->src;
+			lexend = lexptr + sourcefile->bufsize;
+			sourceline = 1;
+			if (sourcefile->bufsize == 0) {
+				/*
+				 * Yet Another Special case:
+				 *	gawk '' /path/name
+				 * Sigh.
+				 */
+				static bool warned = false;
+
+				if (do_lint && ! warned) {
+					warned = true;
+					lintwarn(_("empty program text on command line"));
+				}
+				lexeof = true;
+			}
+		} else if (sourcefile->buf == NULL  && *(lexptr-1) != '\n') {
+			/*
+			 * The following goop is to ensure that the source
+			 * ends with a newline and that the entire current
+			 * line is available for error messages.
+			 */
+			int offset;
+			char *buf;
+
+			offset = lexptr - lexeme;
+			for (scan = lexeme; scan > lexptr_begin; scan--)
+				if (*scan == '\n') {
+					scan++;
+					break;
+				}
+			savelen = lexptr - scan;
+			emalloc(buf, char *, savelen + 1, "get_src_buf");
+			memcpy(buf, scan, savelen);
+			thisline = buf;
+			lexptr = buf + savelen;
+			*lexptr = '\n';
+			lexeme = lexptr - offset;
+			lexptr_begin = buf;
+			lexend = lexptr + 1;
+			sourcefile->buf = buf;
+		} else
+			lexeof = true;
+		return lexptr;
+	}
+
+	if (sourcefile->fd <= INVALID_HANDLE) {
+		int fd;
+		int l;
+
+		source = sourcefile->src;
+		if (source == NULL)
+			return NULL;
+		fd = srcopen(sourcefile);
+		if (fd <= INVALID_HANDLE) {
+			char *in;
+
+			/* suppress file name and line no. in error mesg */
+			in = source;
+			source = NULL;
+			error(_("can't open source file `%s' for reading (%s)"),
+				in, strerror(errno));
+			errcount++;
+			lexeof = true;
+			return sourcefile->src;
+		}
+
+		sourcefile->fd = fd;
+		l = optimal_bufsize(fd, &sbuf);
+		/*
+		 * Make sure that something silly like
+		 * 	AWKBUFSIZE=8 make check
+		 * works ok.
+		 */
+#define A_DECENT_BUFFER_SIZE	128
+		if (l < A_DECENT_BUFFER_SIZE)
+			l = A_DECENT_BUFFER_SIZE;
+#undef A_DECENT_BUFFER_SIZE
+		sourcefile->bufsize = l;
+		newfile = true;
+		emalloc(sourcefile->buf, char *, sourcefile->bufsize, "get_src_buf");
+		lexptr = lexptr_begin = lexeme = sourcefile->buf;
+		savelen = 0;
+		sourceline = 1;
+		thisline = NULL;
+	} else {
+		/*
+		 * Here, we retain the current source line in the beginning of the buffer.
+		 */
+		int offset;
+		for (scan = lexeme; scan > lexptr_begin; scan--)
+			if (*scan == '\n') {
+				scan++;
+				break;
+			}
+
+		savelen = lexptr - scan;
+		offset = lexptr - lexeme;
+
+		if (savelen > 0) {
+			/*
+			 * Need to make sure we have room left for reading new text;
+			 * grow the buffer (by doubling, an arbitrary choice), if the retained line
+			 * takes up more than a certain percentage (50%, again an arbitrary figure)
+			 * of the available space.
+			 */
+
+			if (savelen > sourcefile->bufsize / 2) { /* long line or token  */
+				sourcefile->bufsize *= 2;
+				erealloc(sourcefile->buf, char *, sourcefile->bufsize, "get_src_buf");
+				scan = sourcefile->buf + (scan - lexptr_begin);
+				lexptr_begin = sourcefile->buf;
+			}
+
+			thisline = lexptr_begin;
+			memmove(thisline, scan, savelen);
+			lexptr = thisline + savelen;
+			lexeme = lexptr - offset;
+		} else {
+			savelen = 0;
+			lexptr = lexeme = lexptr_begin;
+			thisline = NULL;
+		}
+	}
+
+	n = (*readfunc)(sourcefile->fd, lexptr, sourcefile->bufsize - savelen);
+	if (n == -1) {
+		error(_("can't read sourcefile `%s' (%s)"),
+				source, strerror(errno));
+		errcount++;
+		lexeof = true;
+	} else {
+		lexend = lexptr + n;
+		if (n == 0) {
+			static bool warned = false;
+			if (do_lint && newfile && ! warned) {
+				warned = true;
+				sourceline = 0;
+				lintwarn(_("source file `%s' is empty"), source);
+			}
+			lexeof = true;
+		}
+	}
+	return sourcefile->buf;
+}
+
+/* tokadd --- add a character to the token buffer */
+
+#define	tokadd(x) (*tok++ = (x), tok == tokend ? tokexpand() : tok)
+
+/* tokexpand --- grow the token buffer */
+
+static char *
+tokexpand()
+{
+	static int toksize;
+	int tokoffset;
+
+	if (tokstart != NULL) {
+		tokoffset = tok - tokstart;
+		toksize *= 2;
+		erealloc(tokstart, char *, toksize, "tokexpand");
+		tok = tokstart + tokoffset;
+	} else {
+		toksize = 60;
+		emalloc(tokstart, char *, toksize, "tokexpand");
+		tok = tokstart;
+	}
+	tokend = tokstart + toksize;
+	return tok;
+}
+
+/* check_bad_char --- fatal if c isn't allowed in gawk source code */
+
+/*
+ * The error message was inspired by someone who decided to put
+ * a physical \0 byte into the source code to see what would
+ * happen and then filed a bug report about it.  Sigh.
+ */
+
+static void
+check_bad_char(int c)
+{
+	/* allow escapes. needed for autoconf. bleah. */
+	switch (c) {
+	case '\a':
+	case '\b':
+	case '\f':
+	case '\n':
+	case '\r':
+	case '\t':
+		return;
+	default:
+		break;
+	}
+
+	if (iscntrl(c) && ! isspace(c))
+		fatal(_("PEBKAC error: invalid character '\\%03o' in source code"), c & 0xFF);
+}
+
+/* nextc --- get the next input character */
+
+// For namespaces, -e chunks must be syntactic units.
+#define NO_CONTINUE_SOURCE_STRINGS	1
+
+static int
+nextc(bool check_for_bad)
+{
+	if (gawk_mb_cur_max > 1) {
+again:
+#ifdef NO_CONTINUE_SOURCE_STRINGS
+		if (lexeof)
+			return END_FILE;
+#else
+		if (lexeof) {
+			if (sourcefile->next == srcfiles)
+				return END_FILE;
+			else
+				next_sourcefile();
+		}
+#endif
+		if (lexptr == NULL || lexptr >= lexend) {
+			if (get_src_buf())
+				goto again;
+			return END_SRC;
+		}
+
+		/* Update the buffer index.  */
+		cur_ring_idx = (cur_ring_idx == RING_BUFFER_SIZE - 1)? 0 :
+			cur_ring_idx + 1;
+
+		/* Did we already check the current character?  */
+		if (cur_char_ring[cur_ring_idx] == 0) {
+			/* No, we need to check the next character on the buffer.  */
+			int idx, work_ring_idx = cur_ring_idx;
+			mbstate_t tmp_state;
+			size_t mbclen;
+
+			for (idx = 0; lexptr + idx < lexend; idx++) {
+				tmp_state = cur_mbstate;
+				mbclen = mbrlen(lexptr, idx + 1, &tmp_state);
+
+				if (mbclen == 1 || mbclen == (size_t)-1 || mbclen == 0) {
+					/* It is a singlebyte character, non-complete multibyte
+					   character or EOF.  We treat it as a singlebyte
+					   character.  */
+					cur_char_ring[work_ring_idx] = 1;
+					break;
+				} else if (mbclen == (size_t)-2) {
+					/* It is not a complete multibyte character.  */
+					cur_char_ring[work_ring_idx] = idx + 1;
+				} else {
+					/* mbclen > 1 */
+					cur_char_ring[work_ring_idx] = mbclen;
+					break;
+				}
+				work_ring_idx = (work_ring_idx == RING_BUFFER_SIZE - 1)?
+					0 : work_ring_idx + 1;
+			}
+			cur_mbstate = tmp_state;
+
+			/* Put a mark on the position on which we write next character.  */
+			work_ring_idx = (work_ring_idx == RING_BUFFER_SIZE - 1)?
+				0 : work_ring_idx + 1;
+			cur_char_ring[work_ring_idx] = 0;
+		}
+		if (check_for_bad || *lexptr == '\0')
+			check_bad_char(*lexptr);
+
+		return (int) (unsigned char) *lexptr++;
+	} else {
+		do {
+#ifdef NO_CONTINUE_SOURCE_STRINGS
+			if (lexeof)
+				return END_FILE;
+#else
+			if (lexeof) {
+				if (sourcefile->next == srcfiles)
+					return END_FILE;
+				else
+					next_sourcefile();
+			}
+#endif
+			if (lexptr && lexptr < lexend) {
+				if (check_for_bad || *lexptr == '\0')
+					check_bad_char(*lexptr);
+				return ((int) (unsigned char) *lexptr++);
+			}
+		} while (get_src_buf());
+		return END_SRC;
+	}
+}
+#undef NO_CONTINUE_SOURCE_STRINGS
+
+/* pushback --- push a character back on the input */
+
+static inline void
+pushback(void)
+{
+	if (gawk_mb_cur_max > 1)
+		cur_ring_idx = (cur_ring_idx == 0)? RING_BUFFER_SIZE - 1 :
+			cur_ring_idx - 1;
+	(! lexeof && lexptr && lexptr > lexptr_begin ? lexptr-- : lexptr);
+}
+
+/*
+ * get_comment --- collect comment text.
+ * 	Flag = EOL_COMMENT for end-of-line comments.
+ * 	Flag = BLOCK_COMMENT for self-contained comments.
+ */
+
+static int
+get_comment(enum commenttype flag, INSTRUCTION **comment_instruction)
+{
+	int c;
+	int sl;
+	char *p1;
+	char *p2;
+
+	tok = tokstart;
+	tokadd('#');
+	sl = sourceline;
+
+	while (true) {
+		while ((c = nextc(false)) != '\n' && c != END_FILE) {
+			/* ignore \r characters */
+			if (c != '\r')
+				tokadd(c);
+		}
+		if (flag == EOL_COMMENT) {
+			/* comment at end of line.  */
+			if (c == '\n')
+				tokadd(c);
+			break;
+		}
+		if (c == '\n') {
+			tokadd(c);
+			sourceline++;
+			do {
+				c = nextc(false);
+				if (c == '\n') {
+					sourceline++;
+					tokadd(c);
+				}
+			} while (isspace(c) && c != END_FILE);
+			if (c == END_FILE)
+				break;
+			else if (c != '#') {
+				pushback();
+				sourceline--;
+				break;
+			} else
+				tokadd(c);
+		} else
+			break;
+	}
+
+	/* remove any trailing blank lines (consecutive \n) from comment */
+	p1 = tok - 1;
+	p2 = tok - 2;
+	while (*p1 == '\n' && *p2 == '\n') {
+		p1--;
+		p2--;
+		tok--;
+	}
+
+	(*comment_instruction) = bcalloc(Op_comment, 1, sl);
+	(*comment_instruction)->source_file = source;
+	(*comment_instruction)->memory = make_str_node(tokstart, tok - tokstart, 0);
+	(*comment_instruction)->memory->comment_type = flag;
+
+	return c;
+}
+
+/* allow_newline --- allow newline after &&, ||, ? and : */
+
+static void
+allow_newline(INSTRUCTION **new_comment)
+{
+	int c;
+
+	for (;;) {
+		c = nextc(true);
+		if (c == END_FILE) {
+			pushback();
+			break;
+		}
+		if (c == '#') {
+			if (do_pretty_print && ! do_profile) {
+				/* collect comment byte code iff doing pretty print but not profiling.  */
+				c = get_comment(EOL_COMMENT, new_comment);
+			} else {
+				while ((c = nextc(false)) != '\n' && c != END_FILE)
+					continue;
+			}
+			if (c == END_FILE) {
+				pushback();
+				break;
+			}
+		}
+		if (c == '\n')
+			sourceline++;
+		if (! isspace(c)) {
+			pushback();
+			break;
+		}
+	}
+}
+
+/* newline_eof --- return newline or EOF as needed and adjust variables */
+
+/*
+ * This routine used to be a macro, however GCC 4.6.2 warned about
+ * the result of a computation not being used.  Converting to a function
+ * removes the warnings.
+ */
+
+static int
+newline_eof()
+{
+	/* NB: a newline at end does not start a source line. */
+	if (lasttok != NEWLINE) {
+                pushback();
+		if (do_lint && ! eof_warned) {
+        		lintwarn(_("source file does not end in newline"));
+			eof_warned = true;
+		}
+		sourceline++;
+		return NEWLINE;
+	}
+
+	sourceline--;
+	eof_warned = false;
+	return LEX_EOF;
+}
+
+/* yylex --- Read the input and turn it into tokens. */
+
+static int
+#ifdef USE_EBCDIC
+yylex_ebcdic(void)
+#else
+yylex(void)
+#endif
+{
+	int c;
+	bool seen_e = false;		/* These are for numbers */
+	bool seen_point = false;
+	bool esc_seen;		/* for literal strings */
+	int mid;
+	int base;
+	static bool did_newline = false;
+	char *tokkey;
+	bool inhex = false;
+	bool intlstr = false;
+	AWKNUM d;
+	bool collecting_typed_regexp = false;
+	static int qm_col_count = 0;
+
+#define GET_INSTRUCTION(op) bcalloc(op, 1, sourceline)
+
+#define NEWLINE_EOF newline_eof()
+
+	yylval = (INSTRUCTION *) NULL;
+	if (lasttok == SUBSCRIPT) {
+		lasttok = 0;
+		return SUBSCRIPT;
+	}
+
+	if (lasttok == LEX_EOF)		/* error earlier in current source, must give up !! */
+		return 0;
+
+	c = nextc(! want_regexp);
+	if (c == END_SRC)
+		return 0;
+	if (c == END_FILE)
+		return lasttok = NEWLINE_EOF;
+	pushback();
+
+#if defined __EMX__
+	/*
+	 * added for OS/2's extproc feature of cmd.exe
+	 * (like #! in BSD sh)
+	 */
+	if (strncasecmp(lexptr, "extproc ", 8) == 0) {
+		while (*lexptr && *lexptr != '\n')
+			lexptr++;
+	}
+#endif
+
+	lexeme = lexptr;
+	thisline = NULL;
+
+collect_regexp:
+	if (want_regexp) {
+		int in_brack = 0;	/* count brackets, [[:alnum:]] allowed */
+		int b_index = -1;
+		int cur_index = 0;
+
+		/*
+		 * Here is what's ok with brackets:
+		 *
+		 * [..[..] []] [^]] [.../...]
+		 * [...\[...] [...\]...] [...\/...]
+		 *
+		 * (Remember that all of the above are inside /.../)
+		 *
+		 * The code for \ handles \[, \] and \/.
+		 *
+		 * Otherwise, track the first open [ position, and if
+		 * an embedded ] occurs, allow it to pass through
+		 * if it's right after the first [ or after [^.
+		 *
+		 * Whew!
+		 */
+
+		want_regexp = false;
+		tok = tokstart;
+		for (;;) {
+			c = nextc(false);
+
+			cur_index = tok - tokstart;
+			if (gawk_mb_cur_max == 1 || nextc_is_1stbyte) switch (c) {
+			case '[':
+				if (nextc(false) == ':' || in_brack == 0) {
+					in_brack++;
+					if (in_brack == 1)
+						b_index = tok - tokstart;
+				}
+				pushback();
+				break;
+			case ']':
+				if (in_brack > 0
+				    && (cur_index == b_index + 1
+					|| (cur_index == b_index + 2 && tok[-1] == '^')))
+					; /* do nothing */
+				else {
+					in_brack--;
+					if (in_brack == 0)
+						b_index = -1;
+				}
+				break;
+			case '\\':
+				if ((c = nextc(false)) == END_FILE) {
+					pushback();
+					yyerror(_("unterminated regexp ends with `\\' at end of file"));
+					goto end_regexp; /* kludge */
+				}
+				if (c == '\r')	/* allow MS-DOS files. bleah */
+					c = nextc(true);
+				if (c == '\n') {
+					sourceline++;
+					continue;
+				} else {
+					tokadd('\\');
+					tokadd(c);
+					continue;
+				}
+				break;
+			case '/':	/* end of the regexp */
+				if (in_brack > 0)
+					break;
+end_regexp:
+				yylval = GET_INSTRUCTION(Op_token);
+				yylval->lextok = estrdup(tokstart, tok - tokstart);
+				if (do_lint) {
+					int peek = nextc(true);
+
+					pushback();
+					if (peek == 'i' || peek == 's') {
+						if (source)
+							lintwarn(
+						_("%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"),
+								source, sourceline, peek);
+						else
+							lintwarn(
+						_("tawk regex modifier `/.../%c' doesn't work in gawk"),
+								peek);
+					}
+				}
+				if (collecting_typed_regexp) {
+					collecting_typed_regexp = false;
+					lasttok = TYPED_REGEXP;
+				} else
+					lasttok = REGEXP;
+
+				return lasttok;
+			case '\n':
+				pushback();
+				yyerror(_("unterminated regexp"));
+				goto end_regexp;	/* kludge */
+			case END_FILE:
+				pushback();
+				yyerror(_("unterminated regexp at end of file"));
+				goto end_regexp;	/* kludge */
+			}
+			tokadd(c);
+		}
+	}
+retry:
+
+	/* skipping \r is a hack, but windows is just too pervasive. sigh. */
+	while ((c = nextc(true)) == ' ' || c == '\t' || c == '\r')
+		continue;
+
+	lexeme = lexptr ? lexptr - 1 : lexptr;
+	thisline = NULL;
+	tok = tokstart;
+
+	if (gawk_mb_cur_max == 1 || nextc_is_1stbyte)
+	switch (c) {
+	case END_SRC:
+		return 0;
+
+	case END_FILE:
+		return lasttok = NEWLINE_EOF;
+
+	case '\n':
+		sourceline++;
+		return lasttok = NEWLINE;
+
+	case '#':		/* it's a comment */
+		yylval = NULL;
+		if (do_pretty_print && ! do_profile) {
+			/*
+			 * Collect comment byte code iff doing pretty print
+			 * but not profiling.
+			 */
+			INSTRUCTION *new_comment;
+
+			if (lasttok == NEWLINE || lasttok == 0)
+				c = get_comment(BLOCK_COMMENT, & new_comment);
+			else
+				c = get_comment(EOL_COMMENT, & new_comment);
+
+			yylval = new_comment;
+
+			if (c == END_FILE) {
+				pushback();
+				return lasttok = NEWLINE;
+			}
+		} else {
+			while ((c = nextc(false)) != '\n') {
+				if (c == END_FILE)
+					return lasttok = NEWLINE_EOF;
+			}
+		}
+		sourceline++;
+		return lasttok = NEWLINE;
+
+	case '@':
+		c = nextc(true);
+		if (c == '/') {
+			want_regexp = true;
+			collecting_typed_regexp = true;
+			goto collect_regexp;
+		}
+		pushback();
+		at_seen = true;
+		return lasttok = '@';
+
+	case '\\':
+#ifdef RELAXED_CONTINUATION
+		/*
+		 * This code purports to allow comments and/or whitespace
+		 * after the `\' at the end of a line used for continuation.
+		 * Use it at your own risk. We think it's a bad idea, which
+		 * is why it's not on by default.
+		 */
+		yylval = NULL;
+		if (! do_traditional) {
+			INSTRUCTION *new_comment;
+
+			/* strip trailing white-space and/or comment */
+			while ((c = nextc(true)) == ' ' || c == '\t' || c == '\r')
+				continue;
+			if (c == '#') {
+				static bool warned = false;
+
+				if (do_lint && ! warned) {
+					warned = true;
+					lintwarn(
+		_("use of `\\ #...' line continuation is not portable"));
+				}
+				if (do_pretty_print && ! do_profile) {
+					c = get_comment(EOL_COMMENT, & new_comment);
+					yylval = new_comment;
+					return lasttok = c;
+				} else {
+					while ((c = nextc(false)) != '\n')
+						if (c == END_FILE)
+							break;
+				}
+			}
+			pushback();
+		}
+#endif /* RELAXED_CONTINUATION */
+		c = nextc(true);
+		if (c == '\r')	/* allow MS-DOS files. bleah */
+			c = nextc(true);
+		if (c == '\n') {
+			sourceline++;
+			goto retry;
+		} else {
+			yyerror(_("backslash not last character on line"));
+			return lasttok = LEX_EOF;
+		}
+		break;
+
+	case '?':
+		qm_col_count++;
+		// fall through
+	case ':':
+		yylval = GET_INSTRUCTION(Op_cond_exp);
+		if (qm_col_count > 0) {
+			if (! do_posix) {
+				INSTRUCTION *new_comment = NULL;
+				allow_newline(& new_comment);
+				yylval->comment = new_comment;
+			}
+			if (c == ':')
+				qm_col_count--;
+		}
+		return lasttok = c;
+
+		/*
+		 * in_parens is undefined unless we are parsing a print
+		 * statement (in_print), but why bother with a check?
+		 */
+	case ')':
+		in_parens--;
+		return lasttok = c;
+
+	case '(':
+		in_parens++;
+		return lasttok = c;
+	case '$':
+		yylval = GET_INSTRUCTION(Op_field_spec);
+		return lasttok = c;
+	case '{':
+		if (++in_braces == 1)
+			firstline = sourceline;
+	case ';':
+	case ',':
+	case '[':
+			return lasttok = c;
+	case ']':
+		c = nextc(true);
+		pushback();
+		if (c == '[') {
+			if (do_traditional)
+				fatal(_("multidimensional arrays are a gawk extension"));
+			if (do_lint)
+				lintwarn(_("multidimensional arrays are a gawk extension"));
+			yylval = GET_INSTRUCTION(Op_sub_array);
+			lasttok = ']';
+		} else {
+			yylval = GET_INSTRUCTION(Op_subscript);
+			lasttok = SUBSCRIPT;	/* end of subscripts */
+		}
+		return ']';
+
+	case '*':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_assign_times);
+			return lasttok = ASSIGNOP;
+		} else if (do_posix) {
+			pushback();
+			yylval = GET_INSTRUCTION(Op_times);
+			return lasttok = '*';
+		} else if (c == '*') {
+			/* make ** and **= aliases for ^ and ^= */
+			static bool did_warn_op = false, did_warn_assgn = false;
+
+			if (nextc(true) == '=') {
+				if (! did_warn_assgn) {
+					did_warn_assgn = true;
+					if (do_lint)
+						lintwarn(_("POSIX does not allow operator `**='"));
+					if (do_lint_old)
+						warning(_("old awk does not support operator `**='"));
+				}
+				yylval = GET_INSTRUCTION(Op_assign_exp);
+				return ASSIGNOP;
+			} else {
+				pushback();
+				if (! did_warn_op) {
+					did_warn_op = true;
+					if (do_lint)
+						lintwarn(_("POSIX does not allow operator `**'"));
+					if (do_lint_old)
+						warning(_("old awk does not support operator `**'"));
+				}
+				yylval = GET_INSTRUCTION(Op_exp);
+				return lasttok = '^';
+			}
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_times);
+		return lasttok = '*';
+
+	case '/':
+		if (nextc(false) == '=') {
+			pushback();
+			return lasttok = SLASH_BEFORE_EQUAL;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_quotient);
+		return lasttok = '/';
+
+	case '%':
+		if (nextc(true) == '=') {
+			yylval = GET_INSTRUCTION(Op_assign_mod);
+			return lasttok = ASSIGNOP;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_mod);
+		return lasttok = '%';
+
+	case '^':
+	{
+		static bool did_warn_op = false, did_warn_assgn = false;
+
+		if (nextc(true) == '=') {
+			if (do_lint_old && ! did_warn_assgn) {
+				did_warn_assgn = true;
+				warning(_("operator `^=' is not supported in old awk"));
+			}
+			yylval = GET_INSTRUCTION(Op_assign_exp);
+			return lasttok = ASSIGNOP;
+		}
+		pushback();
+		if (do_lint_old && ! did_warn_op) {
+			did_warn_op = true;
+			warning(_("operator `^' is not supported in old awk"));
+		}
+		yylval = GET_INSTRUCTION(Op_exp);
+		return lasttok = '^';
+	}
+
+	case '+':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_assign_plus);
+			return lasttok = ASSIGNOP;
+		}
+		if (c == '+') {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			return lasttok = INCREMENT;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_plus);
+		return lasttok = '+';
+
+	case '!':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_notequal);
+			return lasttok = RELOP;
+		}
+		if (c == '~') {
+			yylval = GET_INSTRUCTION(Op_nomatch);
+			return lasttok = MATCHOP;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_symbol);
+		return lasttok = '!';
+
+	case '<':
+		if (nextc(true) == '=') {
+			yylval = GET_INSTRUCTION(Op_leq);
+			return lasttok = RELOP;
+		}
+		yylval = GET_INSTRUCTION(Op_less);
+		pushback();
+		return lasttok = '<';
+
+	case '=':
+		if (nextc(true) == '=') {
+			yylval = GET_INSTRUCTION(Op_equal);
+			return lasttok = RELOP;
+		}
+		yylval = GET_INSTRUCTION(Op_assign);
+		pushback();
+		return lasttok = ASSIGN;
+
+	case '>':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_geq);
+			return lasttok = RELOP;
+		} else if (c == '>') {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_append;
+			return lasttok = IO_OUT;
+		}
+		pushback();
+		if (in_print && in_parens == 0) {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_output;
+			return lasttok = IO_OUT;
+		}
+		yylval = GET_INSTRUCTION(Op_greater);
+		return lasttok = '>';
+
+	case '~':
+		yylval = GET_INSTRUCTION(Op_match);
+		return lasttok = MATCHOP;
+
+	case '}':
+		/*
+		 * Added did newline stuff.  Easier than
+		 * hacking the grammar.
+		 */
+		if (did_newline) {
+			did_newline = false;
+			if (--in_braces == 0)
+				lastline = sourceline;
+			return lasttok = c;
+		}
+		did_newline = true;
+		--lexptr;	/* pick up } next time */
+		return lasttok = NEWLINE;
+
+	case '"':
+	string:
+		esc_seen = false;
+		/*
+		 * Allow any kind of junk in quoted string,
+		 * so pass false to nextc().
+		 */
+		while ((c = nextc(false)) != '"') {
+			if (c == '\n') {
+				pushback();
+				yyerror(_("unterminated string"));
+				return lasttok = LEX_EOF;
+			}
+			if ((gawk_mb_cur_max == 1 || nextc_is_1stbyte) &&
+			    c == '\\') {
+				c = nextc(true);
+				if (c == '\r')	/* allow MS-DOS files. bleah */
+					c = nextc(true);
+				if (c == '\n') {
+					if (do_posix)
+						fatal(_("POSIX does not allow physical newlines in string values"));
+					else if (do_lint)
+						lintwarn(_("backslash string continuation is not portable"));
+					sourceline++;
+					continue;
+				}
+				esc_seen = true;
+				if (! want_source || c != '"')
+					tokadd('\\');
+			}
+			if (c == END_FILE) {
+				pushback();
+				yyerror(_("unterminated string"));
+				return lasttok = LEX_EOF;
+			}
+			tokadd(c);
+		}
+		yylval = GET_INSTRUCTION(Op_token);
+		if (want_source) {
+			yylval->lextok = estrdup(tokstart, tok - tokstart);
+			return lasttok = FILENAME;
+		}
+
+		yylval->opcode = Op_push_i;
+		yylval->memory = make_str_node(tokstart,
+					tok - tokstart, esc_seen ? SCAN : 0);
+		if (intlstr) {
+			yylval->memory->flags |= INTLSTR;
+			intlstr = false;
+			if (do_intl)
+				dumpintlstr(yylval->memory->stptr, yylval->memory->stlen);
+		}
+		return lasttok = YSTRING;
+
+	case '-':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_assign_minus);
+			return lasttok = ASSIGNOP;
+		}
+		if (c == '-') {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			return lasttok = DECREMENT;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_minus);
+		return lasttok = '-';
+
+	case '.':
+		c = nextc(true);
+		pushback();
+		if (! isdigit(c))
+			return lasttok = '.';
+		else
+			c = '.';
+		/* FALL THROUGH */
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+		/* It's a number */
+		for (;;) {
+			bool gotnumber = false;
+
+			tokadd(c);
+			switch (c) {
+			case 'x':
+			case 'X':
+				if (do_traditional)
+					goto done;
+				if (tok == tokstart + 2) {
+					int peek = nextc(true);
+
+					if (isxdigit(peek)) {
+						inhex = true;
+						pushback();	/* following digit */
+					} else {
+						pushback();	/* x or X */
+						goto done;
+					}
+				}
+				break;
+			case '.':
+				/* period ends exponent part of floating point number */
+				if (seen_point || seen_e) {
+					gotnumber = true;
+					break;
+				}
+				seen_point = true;
+				break;
+			case 'e':
+			case 'E':
+				if (inhex)
+					break;
+				if (seen_e) {
+					gotnumber = true;
+					break;
+				}
+				seen_e = true;
+				if ((c = nextc(true)) == '-' || c == '+') {
+					int c2 = nextc(true);
+
+					if (isdigit(c2)) {
+						tokadd(c);
+						tokadd(c2);
+					} else {
+						pushback();	/* non-digit after + or - */
+						pushback();	/* + or - */
+						pushback();	/* e or E */
+					}
+				} else if (! isdigit(c)) {
+					pushback();	/* character after e or E */
+					pushback();	/* e or E */
+				} else {
+					pushback();	/* digit */
+				}
+				break;
+			case 'a':
+			case 'A':
+			case 'b':
+			case 'B':
+			case 'c':
+			case 'C':
+			case 'D':
+			case 'd':
+			case 'f':
+			case 'F':
+				if (do_traditional || ! inhex)
+					goto done;
+				/* fall through */
+			case '0':
+			case '1':
+			case '2':
+			case '3':
+			case '4':
+			case '5':
+			case '6':
+			case '7':
+			case '8':
+			case '9':
+				break;
+			default:
+			done:
+				gotnumber = true;
+			}
+			if (gotnumber)
+				break;
+			c = nextc(true);
+		}
+		pushback();
+
+		tokadd('\0');
+		yylval = GET_INSTRUCTION(Op_push_i);
+
+		base = 10;
+		if (! do_traditional) {
+			base = get_numbase(tokstart, strlen(tokstart)-1, false);
+			if (do_lint) {
+				if (base == 8)
+					lintwarn("numeric constant `%.*s' treated as octal",
+						(int) strlen(tokstart)-1, tokstart);
+				else if (base == 16)
+					lintwarn("numeric constant `%.*s' treated as hexadecimal",
+						(int) strlen(tokstart)-1, tokstart);
+			}
+		}
+
+#ifdef HAVE_MPFR
+		if (do_mpfr) {
+			NODE *r;
+
+			if (! seen_point && ! seen_e) {
+				r = mpg_integer();
+				mpg_strtoui(r->mpg_i, tokstart, strlen(tokstart), NULL, base);
+				errno = 0;
+			} else {
+				int tval;
+				r = mpg_float();
+				tval = mpfr_strtofr(r->mpg_numbr, tokstart, NULL, base, ROUND_MODE);
+				errno = 0;
+				IEEE_FMT(r->mpg_numbr, tval);
+			}
+			yylval->memory = set_profile_text(r, tokstart, strlen(tokstart)-1);
+			return lasttok = YNUMBER;
+		}
+#endif
+		if (base != 10)
+			d = nondec2awknum(tokstart, strlen(tokstart)-1, NULL);
+		else
+			d = atof(tokstart);
+		yylval->memory = set_profile_text(make_number(d), tokstart, strlen(tokstart) - 1);
+		if (d <= INT32_MAX && d >= INT32_MIN && d == (int32_t) d)
+			yylval->memory->flags |= NUMINT;
+		return lasttok = YNUMBER;
+
+	case '&':
+		if ((c = nextc(true)) == '&') {
+			yylval = GET_INSTRUCTION(Op_and);
+			INSTRUCTION *new_comment = NULL;
+			allow_newline(& new_comment);
+			yylval->comment = new_comment;
+
+			return lasttok = LEX_AND;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_symbol);
+		return lasttok = '&';
+
+	case '|':
+		if ((c = nextc(true)) == '|') {
+			yylval = GET_INSTRUCTION(Op_or);
+			INSTRUCTION *new_comment = NULL;
+			allow_newline(& new_comment);
+			yylval->comment = new_comment;
+
+			return lasttok = LEX_OR;
+		} else if (! do_traditional && c == '&') {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_twoway;
+
+			return lasttok = (in_print && in_parens == 0 ? IO_OUT : IO_IN);
+		}
+		pushback();
+		if (in_print && in_parens == 0) {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_pipe;
+			return lasttok = IO_OUT;
+		} else {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_pipein;
+			return lasttok = IO_IN;
+		}
+	}
+
+	if (! is_letter(c)) {
+		yyerror(_("invalid char '%c' in expression"), c);
+		return lasttok = LEX_EOF;
+	}
+
+	/*
+	 * Lots of fog here.  Consider:
+	 *
+	 * print "xyzzy"$_"foo"
+	 *
+	 * Without the check for ` lasttok != '$' ', this is parsed as
+	 *
+	 * print "xxyzz" $(_"foo")
+	 *
+	 * With the check, it is "correctly" parsed as three
+	 * string concatenations.  Sigh.  This seems to be
+	 * "more correct", but this is definitely one of those
+	 * occasions where the interactions are funny.
+	 */
+	if (! do_traditional && c == '_' && lasttok != '$') {
+		if ((c = nextc(true)) == '"') {
+			intlstr = true;
+			goto string;
+		}
+		pushback();
+		c = '_';
+	}
+
+	/* it's some type of name-type-thing.  Find its length. */
+	tok = tokstart;
+	while (c != END_FILE && is_identchar(c)) {
+		tokadd(c);
+		c = nextc(true);
+
+		if (! do_traditional && c == ':') {
+			int peek = nextc(true);
+
+			if (peek == ':') {	// saw identifier::
+				tokadd(c);
+				tokadd(c);
+				c = nextc(true);
+			} else
+				pushback();
+				// then continue around the loop, c == ':'
+		}
+	}
+	tokadd('\0');
+	pushback();
+
+	(void) validate_qualified_name(tokstart);
+
+	/* See if it is a special token. */
+	if ((mid = check_qualified_special(tokstart)) >= 0) {
+		static int warntab[sizeof(tokentab) / sizeof(tokentab[0])];
+		int class = tokentab[mid].class;
+
+		switch (class) {
+		case LEX_EVAL:
+		case LEX_INCLUDE:
+		case LEX_LOAD:
+		case LEX_NAMESPACE:
+			if (lasttok != '@')
+				goto out;
+		default:
+			break;
+		}
+
+		/* allow parameter names to shadow the names of gawk extension built-ins */
+		if ((tokentab[mid].flags & GAWKX) != 0) {
+			NODE *f;
+
+			switch (want_param_names) {
+			case FUNC_HEADER:
+				/* in header, defining parameter names */
+				goto out;
+			case FUNC_BODY:
+				/* in body, name must be in symbol table for it to be a parameter */
+				if ((f = lookup(tokstart)) != NULL) {
+					if (f->type == Node_builtin_func)
+						break;
+					else
+						goto out;
+				}
+				/* else
+					fall through */
+			case DONT_CHECK:
+				/* regular code */
+				break;
+			default:
+				cant_happen();
+				break;
+			}
+		}
+
+		if (do_lint) {
+			if (do_lint_extensions && (tokentab[mid].flags & GAWKX) != 0 && (warntab[mid] & GAWKX) == 0) {
+				lintwarn(_("`%s' is a gawk extension"),
+					tokentab[mid].operator);
+				warntab[mid] |= GAWKX;
+			}
+			if ((tokentab[mid].flags & NOT_POSIX) != 0 && (warntab[mid] & NOT_POSIX) == 0) {
+				lintwarn(_("POSIX does not allow `%s'"),
+					tokentab[mid].operator);
+				warntab[mid] |= NOT_POSIX;
+			}
+		}
+		if (do_lint_old && (tokentab[mid].flags & NOT_OLD) != 0
+				 && (warntab[mid] & NOT_OLD) == 0
+		) {
+			warning(_("`%s' is not supported in old awk"),
+					tokentab[mid].operator);
+			warntab[mid] |= NOT_OLD;
+		}
+
+		if ((tokentab[mid].flags & BREAK) != 0)
+			break_allowed++;
+		if ((tokentab[mid].flags & CONTINUE) != 0)
+			continue_allowed++;
+
+		switch (class) {
+		case LEX_NAMESPACE:
+		case LEX_INCLUDE:
+		case LEX_LOAD:
+			want_source = true;
+			break;
+		case LEX_EVAL:
+			if (in_main_context())
+				goto out;
+			emalloc(tokkey, char *, tok - tokstart + 1, "yylex");
+			tokkey[0] = '@';
+			memcpy(tokkey + 1, tokstart, tok - tokstart);
+			yylval = GET_INSTRUCTION(Op_token);
+			yylval->lextok = tokkey;
+			break;
+
+		case LEX_FUNCTION:
+		case LEX_BEGIN:
+		case LEX_END:
+		case LEX_BEGINFILE:
+		case LEX_ENDFILE:
+			yylval = bcalloc(tokentab[mid].value, 4, sourceline);
+			break;
+
+		case LEX_FOR:
+		case LEX_WHILE:
+		case LEX_DO:
+		case LEX_SWITCH:
+			if (! do_pretty_print)
+				return lasttok = class;
+			/* fall through */
+		case LEX_CASE:
+			yylval = bcalloc(tokentab[mid].value, 2, sourceline);
+			break;
+
+		/*
+		 * These must be checked here, due to the LALR nature of the parser,
+		 * the rules for continue and break may not be reduced until after
+		 * a token that increments the xxx_allowed varibles is seen. Bleah.
+		 */
+		case LEX_CONTINUE:
+			if (! continue_allowed) {
+				error_ln(sourceline,
+					_("`continue' is not allowed outside a loop"));
+				errcount++;
+			}
+			goto make_instruction;
+
+		case LEX_BREAK:
+			if (! break_allowed) {
+				error_ln(sourceline,
+					_("`break' is not allowed outside a loop or switch"));
+				errcount++;
+			}
+			goto make_instruction;
+
+		default:
+make_instruction:
+			yylval = GET_INSTRUCTION(tokentab[mid].value);
+			if (class == LEX_BUILTIN || class == LEX_LENGTH)
+				yylval->builtin_idx = mid;
+			break;
+		}
+		return lasttok = class;
+	}
+out:
+	if (want_param_names == FUNC_HEADER)
+		tokkey = estrdup(tokstart, tok - tokstart - 1);
+	else
+		tokkey = qualify_name(tokstart, tok - tokstart - 1);
+
+	if (*lexptr == '(') {
+		yylval = bcalloc(Op_token, 2, sourceline);
+		yylval->lextok = tokkey;
+		return lasttok = FUNC_CALL;
+	} else {
+		static bool goto_warned = false;
+
+		yylval = GET_INSTRUCTION(Op_token);
+		yylval->lextok = tokkey;
+
+#define SMART_ALECK	1
+		if (SMART_ALECK
+		    && do_lint
+		    && ! goto_warned
+		    && tolower(tokkey[0]) == 'g'
+		    && strcasecmp(tokkey, "goto") == 0) {
+			goto_warned = true;
+			lintwarn(_("`goto' considered harmful!"));
+		}
+		return lasttok = NAME;
+	}
+
+#undef GET_INSTRUCTION
+#undef NEWLINE_EOF
+}
+
+/* It's EBCDIC in a Bison grammar, run for the hills!
+
+   Or, convert single-character tokens coming out of yylex() from EBCDIC to
+   ASCII values on-the-fly so that the parse tables need not be regenerated
+   for EBCDIC systems.  */
+#ifdef USE_EBCDIC
+static int
+yylex(void)
+{
+	static char etoa_xlate[256];
+	static bool do_etoa_init = true;
+	int tok;
+
+	if (do_etoa_init)
+	{
+		for (tok = 0; tok < 256; tok++)
+			etoa_xlate[tok] = (char) tok;
+#ifdef HAVE___ETOA_L
+		/* IBM helpfully provides this function.  */
+		__etoa_l(etoa_xlate, sizeof(etoa_xlate));
+#else
+# error "An EBCDIC-to-ASCII translation function is needed for this system"
+#endif
+		do_etoa_init = false;
+	}
+
+	tok = yylex_ebcdic();
+
+	if (tok >= 0 && tok <= 0xFF)
+		tok = etoa_xlate[tok];
+
+	return tok;
+}
+#endif /* USE_EBCDIC */
+
+/* snode --- instructions for builtin functions. Checks for arg. count
+             and supplies defaults where possible. */
+
+static INSTRUCTION *
+snode(INSTRUCTION *subn, INSTRUCTION *r)
+{
+	INSTRUCTION *arg;
+	INSTRUCTION *ip;
+	NODE *n;
+	int nexp = 0;
+	int args_allowed;
+	int idx = r->builtin_idx;
+
+	if (subn != NULL) {
+		INSTRUCTION *tp;
+		for (tp = subn->nexti; tp; tp = tp->nexti) {
+			tp = tp->lasti;
+			nexp++;
+		}
+		assert(nexp > 0);
+	}
+
+	/* check against how many args. are allowed for this builtin */
+	args_allowed = tokentab[idx].flags & ARGS;
+	if (args_allowed && (args_allowed & A(nexp)) == 0) {
+		yyerror(_("%d is invalid as number of arguments for %s"),
+				nexp, tokentab[idx].operator);
+		return NULL;
+	}
+
+	/* special processing for sub, gsub and gensub */
+
+	if (tokentab[idx].value == Op_sub_builtin) {
+		const char *operator = tokentab[idx].operator;
+
+		r->sub_flags = 0;
+
+		arg = subn->nexti;		/* first arg list */
+		(void) mk_rexp(arg);
+
+		if (strcmp(operator, "gensub") != 0) {
+			/* sub and gsub */
+
+			if (strcmp(operator, "gsub") == 0)
+				r->sub_flags |= GSUB;
+
+			arg = arg->lasti->nexti;	/* 2nd arg list */
+			if (nexp == 2) {
+				INSTRUCTION *expr;
+
+				expr = list_create(instruction(Op_push_i));
+				expr->nexti->memory = set_profile_text(make_number(0.0), "0", 1);
+				(void) mk_expression_list(subn,
+						list_append(expr, instruction(Op_field_spec)));
+			}
+
+			arg = arg->lasti->nexti; 	/* third arg list */
+			ip = arg->lasti;
+			if (ip->opcode == Op_push_i) {
+				if (do_lint)
+					lintwarn(_("%s: string literal as last arg of substitute has no effect"),
+						operator);
+				r->sub_flags |=	LITERAL;
+			} else {
+				if (make_assignable(ip) == NULL)
+					yyerror(_("%s third parameter is not a changeable object"),
+						operator);
+				else
+					ip->do_reference = true;
+			}
+
+			r->expr_count = count_expressions(&subn, false);
+			ip = subn->lasti;
+
+			(void) list_append(subn, r);
+
+			/* add after_assign code */
+			if (ip->opcode == Op_push_lhs && ip->memory->type == Node_var && ip->memory->var_assign) {
+				(void) list_append(subn, instruction(Op_var_assign));
+				subn->lasti->assign_ctxt = Op_sub_builtin;
+				subn->lasti->assign_var = ip->memory->var_assign;
+			} else if (ip->opcode == Op_field_spec_lhs) {
+				(void) list_append(subn, instruction(Op_field_assign));
+				subn->lasti->assign_ctxt = Op_sub_builtin;
+				subn->lasti->field_assign = (Func_ptr) 0;
+				ip->target_assign = subn->lasti;
+			} else if (ip->opcode == Op_subscript_lhs) {
+				(void) list_append(subn, instruction(Op_subscript_assign));
+				subn->lasti->assign_ctxt = Op_sub_builtin;
+			}
+
+			return subn;
+
+		} else {
+			/* gensub */
+
+			r->sub_flags |= GENSUB;
+			if (nexp == 3) {
+				ip = instruction(Op_push_i);
+				ip->memory = set_profile_text(make_number(0.0), "0", 1);
+				(void) mk_expression_list(subn,
+						list_append(list_create(ip), instruction(Op_field_spec)));
+			}
+
+			r->expr_count = count_expressions(&subn, false);
+			return list_append(subn, r);
+		}
+	}
+
+#ifdef HAVE_MPFR
+	/* N.B.: If necessary, add special processing for alternate builtin, below */
+	if (do_mpfr && tokentab[idx].ptr2)
+		r->builtin =  tokentab[idx].ptr2;
+	else
+#endif
+		r->builtin = tokentab[idx].ptr;
+
+	/* special case processing for a few builtins */
+
+	if (r->builtin == do_length) {
+		if (nexp == 0) {
+		    /* no args. Use $0 */
+
+			INSTRUCTION *list;
+			r->expr_count = 1;
+			list = list_create(r);
+			(void) list_prepend(list, instruction(Op_field_spec));
+			(void) list_prepend(list, instruction(Op_push_i));
+			list->nexti->memory = set_profile_text(make_number(0.0), "0", 1);
+			return list;
+		} else {
+			arg = subn->nexti;
+			if (arg->nexti == arg->lasti && arg->nexti->opcode == Op_push)
+				arg->nexti->opcode = Op_push_arg;	/* argument may be array */
+ 		}
+	} else if (r->builtin == do_isarray) {
+		arg = subn->nexti;
+		if (arg->nexti == arg->lasti && arg->nexti->opcode == Op_push)
+			arg->nexti->opcode = Op_push_arg_untyped;	/* argument may be untyped */
+	} else if (r->builtin == do_typeof) {
+		arg = subn->nexti;
+		if (arg->nexti == arg->lasti && arg->nexti->opcode == Op_push)
+			arg->nexti->opcode = Op_push_arg_untyped;	/* argument may be untyped */
+		if (nexp == 2) {	/* 2nd argument there */
+			arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+			ip = arg->lasti;
+			if (ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+#ifdef SUPPLY_INTDIV
+	} else if (r->builtin == do_intdiv
+#ifdef HAVE_MPFR
+		   || r->builtin == MPF(intdiv)
+#endif
+			) {
+		arg = subn->nexti->lasti->nexti->lasti->nexti;	/* 3rd arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+#endif /* SUPPLY_INTDIV */
+	} else if (r->builtin == do_match) {
+		static bool warned = false;
+
+		arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+		(void) mk_rexp(arg);
+
+		if (nexp == 3) {	/* 3rd argument there */
+			if (do_lint_extensions && ! warned) {
+				warned = true;
+				lintwarn(_("match: third argument is a gawk extension"));
+			}
+			if (do_traditional) {
+				yyerror(_("match: third argument is a gawk extension"));
+				return NULL;
+			}
+
+			arg = arg->lasti->nexti; 	/* third arg list */
+			ip = arg->lasti;
+			if (/*ip == arg->nexti  && */ ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+	} else if (r->builtin == do_split) {
+		arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+		if (nexp == 2) {
+			INSTRUCTION *expr;
+			expr = list_create(instruction(Op_push));
+			expr->nexti->memory = FS_node;
+			(void) mk_expression_list(subn, expr);
+		}
+		arg = arg->lasti->nexti;
+		n = mk_rexp(arg);
+		if (nexp == 2)
+			n->re_flags |= FS_DFLT;
+		if (nexp == 4) {
+			arg = arg->lasti->nexti;
+			ip = arg->lasti;
+			if (ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+	} else if (r->builtin == do_patsplit) {
+		arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+		if (nexp == 2) {
+			INSTRUCTION *expr;
+			expr = list_create(instruction(Op_push));
+			expr->nexti->memory = FPAT_node;
+			(void) mk_expression_list(subn, expr);
+		}
+		arg = arg->lasti->nexti;
+		n = mk_rexp(arg);
+		if (nexp == 4) {
+			arg = arg->lasti->nexti;
+			ip = arg->lasti;
+			if (ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+	} else if (r->builtin == do_close) {
+		static bool warned = false;
+		if (nexp == 2) {
+			if (do_lint_extensions && ! warned) {
+				warned = true;
+				lintwarn(_("close: second argument is a gawk extension"));
+			}
+			if (do_traditional) {
+				yyerror(_("close: second argument is a gawk extension"));
+				return NULL;
+			}
+		}
+	} else if (do_intl					/* --gen-po */
+			&& r->builtin == do_dcgettext		/* dcgettext(...) */
+			&& subn->nexti->lasti->opcode == Op_push_i	/* 1st arg is constant */
+			&& (subn->nexti->lasti->memory->flags & STRING) != 0) {	/* it's a string constant */
+		/* ala xgettext, dcgettext("some string" ...) dumps the string */
+		NODE *str = subn->nexti->lasti->memory;
+
+		if ((str->flags & INTLSTR) != 0)
+			warning(_("use of dcgettext(_\"...\") is incorrect: remove leading underscore"));
+			/* don't dump it, the lexer already did */
+		else
+			dumpintlstr(str->stptr, str->stlen);
+	} else if (do_intl					/* --gen-po */
+			&& r->builtin == do_dcngettext		/* dcngettext(...) */
+			&& subn->nexti->lasti->opcode == Op_push_i	/* 1st arg is constant */
+			&& (subn->nexti->lasti->memory->flags & STRING) != 0	/* it's a string constant */
+			&& subn->nexti->lasti->nexti->lasti->opcode == Op_push_i	/* 2nd arg is constant too */
+			&& (subn->nexti->lasti->nexti->lasti->memory->flags & STRING) != 0) {	/* it's a string constant */
+		/* ala xgettext, dcngettext("some string", "some plural" ...) dumps the string */
+		NODE *str1 = subn->nexti->lasti->memory;
+		NODE *str2 = subn->nexti->lasti->nexti->lasti->memory;
+
+		if (((str1->flags | str2->flags) & INTLSTR) != 0)
+			warning(_("use of dcngettext(_\"...\") is incorrect: remove leading underscore"));
+		else
+			dumpintlstr2(str1->stptr, str1->stlen, str2->stptr, str2->stlen);
+	} else if (r->builtin == do_asort || r->builtin == do_asorti) {
+		arg = subn->nexti;	/* 1st arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+		if (nexp >= 2) {
+			arg = ip->nexti;
+			ip = arg->lasti;
+			if (ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+	}
+	else if (r->builtin == do_index) {
+		arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_match_rec || ip->opcode == Op_push_re)
+			fatal(_("index: regexp constant as second argument is not allowed"));
+	}
+#ifdef ARRAYDEBUG
+	else if (r->builtin == do_adump) {
+		ip = subn->nexti->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+	}
+#endif
+
+	if (subn != NULL) {
+		r->expr_count = count_expressions(&subn, false);
+		return list_append(subn, r);
+	}
+
+	r->expr_count = 0;
+	return list_create(r);
+}
+
+
+/* parms_shadow --- check if parameters shadow globals */
+
+static int
+parms_shadow(INSTRUCTION *pc, bool *shadow)
+{
+	int pcount, i;
+	bool ret = false;
+	NODE *func, *fp;
+	char *fname;
+
+	func = pc->func_body;
+	fname = func->vname;
+	fp = func->fparms;
+
+#if 0	/* can't happen, already exited if error ? */
+	if (fname == NULL || func == NULL)	/* error earlier */
+		return false;
+#endif
+
+	pcount = func->param_cnt;
+
+	if (pcount == 0)		/* no args, no problem */
+		return 0;
+
+	source = pc->source_file;
+	sourceline = pc->source_line;
+	/*
+	 * Use warning() and not lintwarn() so that can warn
+	 * about all shadowed parameters.
+	 */
+	for (i = 0; i < pcount; i++) {
+		if (lookup(fp[i].param) != NULL) {
+			warning(
+	_("function `%s': parameter `%s' shadows global variable"),
+					fname, fp[i].param);
+			ret = true;
+		}
+	}
+
+	*shadow |= ret;
+	return 0;
+}
+
+/* valinfo --- dump var info */
+
+void
+valinfo(NODE *n, Func_print print_func, FILE *fp)
+{
+	if (n == Nnull_string)
+		print_func(fp, "uninitialized scalar\n");
+	else if ((n->flags & REGEX) != 0)
+		print_func(fp, "@/%.*s/\n", n->stlen, n->stptr);
+	else if ((n->flags & STRING) != 0) {
+		pp_string_fp(print_func, fp, n->stptr, n->stlen, '"', false);
+		print_func(fp, "\n");
+	} else if ((n->flags & NUMBER) != 0) {
+#ifdef HAVE_MPFR
+		if (is_mpg_float(n))
+			print_func(fp, "%s\n", mpg_fmt("%.17R*g", ROUND_MODE, n->mpg_numbr));
+		else if (is_mpg_integer(n))
+			print_func(fp, "%s\n", mpg_fmt("%Zd", n->mpg_i));
+		else
+#endif
+		print_func(fp, "%.17g\n", n->numbr);
+	} else
+		print_func(fp, "?? flags %s\n", flags2str(n->flags));
+}
+
+
+/* dump_vars --- dump the symbol table */
+
+void
+dump_vars(const char *fname)
+{
+	FILE *fp;
+	NODE **vars;
+
+	if (fname == NULL)
+		fp = stderr;
+	else if (strcmp(fname, "-") == 0)
+		fp = stdout;
+	else if ((fp = fopen(fname, "w")) == NULL) {
+		warning(_("could not open `%s' for writing (%s)"), fname, strerror(errno));
+		warning(_("sending variable list to standard error"));
+		fp = stderr;
+	}
+
+	vars = variable_list();
+	print_vars(vars, fprintf, fp);
+	efree(vars);
+	if (fp != stdout && fp != stderr && fclose(fp) != 0)
+		warning(_("%s: close failed (%s)"), fname, strerror(errno));
+}
+
+/* dump_funcs --- print all functions */
+
+void
+dump_funcs()
+{
+	NODE **funcs;
+	funcs = function_list(true);
+	(void) foreach_func(funcs, (int (*)(INSTRUCTION *, void *)) pp_func, (void *) 0);
+	efree(funcs);
+}
+
+
+/* shadow_funcs --- check all functions for parameters that shadow globals */
+
+void
+shadow_funcs()
+{
+	static int calls = 0;
+	bool shadow = false;
+	NODE **funcs;
+
+	if (calls++ != 0)
+		fatal(_("shadow_funcs() called twice!"));
+
+	funcs = function_list(true);
+	(void) foreach_func(funcs, (int (*)(INSTRUCTION *, void *)) parms_shadow, & shadow);
+	efree(funcs);
+
+	/* End with fatal if the user requested it.  */
+	if (shadow && lintfunc == r_fatal)
+		lintwarn(_("there were shadowed variables."));
+}
+
+
+/* mk_function --- finalize function definition node; remove parameters
+ *	out of the symbol table.
+ */
+
+static INSTRUCTION *
+mk_function(INSTRUCTION *fi, INSTRUCTION *def)
+{
+	NODE *thisfunc;
+
+	thisfunc = fi->func_body;
+	assert(thisfunc != NULL);
+
+	/* add any pre-function comment to start of action for profile.c  */
+
+	if (interblock_comment != NULL) {
+		interblock_comment->source_line = 0;
+		merge_comments(interblock_comment, fi->comment);
+		fi->comment = interblock_comment;
+		interblock_comment = NULL;
+	}
+
+	/*
+	 * Add an implicit return at end;
+	 * also used by 'return' command in debugger
+	 */
+
+	(void) list_append(def, instruction(Op_push_i));
+	def->lasti->memory = dupnode(Nnull_string);
+	(void) list_append(def, instruction(Op_K_return));
+
+	if (trailing_comment != NULL) {
+		(void) list_append(def, trailing_comment);
+		trailing_comment = NULL;
+	}
+
+	if (do_pretty_print) {
+		fi[3].nexti = namespace_chain;
+		namespace_chain = NULL;
+		(void) list_prepend(def, instruction(Op_exec_count));
+	}
+
+	/* fi->opcode = Op_func */
+	(fi + 1)->firsti = def->nexti;
+	(fi + 1)->lasti = def->lasti;
+	(fi + 2)->first_line = fi->source_line;
+	(fi + 2)->last_line = lastline;
+	fi->nexti = def->nexti;
+	bcfree(def);
+
+	(void) list_append(rule_list, fi + 1);	/* debugging */
+
+	/* update lint table info */
+	func_use(thisfunc->vname, FUNC_DEFINE);
+
+	/* remove params from symbol table */
+	remove_params(thisfunc);
+	return fi;
+}
+
+/*
+ * install_function:
+ * install function name in the symbol table.
+ * Extra work, build up and install a list of the parameter names.
+ */
+
+static int
+install_function(char *fname, INSTRUCTION *fi, INSTRUCTION *plist)
+{
+	NODE *r, *f;
+	int pcount = 0;
+
+	r = lookup(fname);
+	if (r != NULL) {
+		error_ln(fi->source_line, _("function name `%s' previously defined"), fname);
+		return -1;
+	}
+
+	if (plist != NULL)
+		pcount = plist->lasti->param_count + 1;
+	f = install_symbol(fname, Node_func);
+	if (f->vname != fname) {
+		// DON'T free fname, it's done later
+		fname = f->vname;
+	}
+
+	fi->func_body = f;
+	f->param_cnt = pcount;
+	f->code_ptr = fi;
+	f->fparms = NULL;
+	if (pcount > 0) {
+		char **pnames;
+		pnames = check_params(fname, pcount, plist);	/* frees plist */
+		f->fparms = make_params(pnames, pcount);
+		efree(pnames);
+		install_params(f);
+	}
+	return 0;
+}
+
+
+/* check_params --- build a list of function parameter names after
+ *	making sure that the names are valid and there are no duplicates.
+ */
+
+static char **
+check_params(char *fname, int pcount, INSTRUCTION *list)
+{
+	INSTRUCTION *p, *np;
+	int i, j;
+	char *name;
+	char **pnames;
+
+	assert(pcount > 0);
+
+	emalloc(pnames, char **, pcount * sizeof(char *), "check_params");
+
+	for (i = 0, p = list->nexti; p != NULL; i++, p = np) {
+		np = p->nexti;
+		name = p->lextok;
+		p->lextok = NULL;
+
+		if (strcmp(name, fname) == 0) {
+			/* check for function foo(foo) { ... }.  bleah. */
+			error_ln(p->source_line,
+				_("function `%s': can't use function name as parameter name"), fname);
+		} else if (is_std_var(name)) {
+			error_ln(p->source_line,
+				_("function `%s': can't use special variable `%s' as a function parameter"),
+					fname, name);
+		} else if (strchr(name, ':') != NULL)
+			error_ln(p->source_line,
+				_("function `%s': parameter `%s' cannot contain a namespace"),
+					fname, name);
+
+		/* check for duplicate parameters */
+		for (j = 0; j < i; j++) {
+			if (strcmp(name, pnames[j]) == 0) {
+				error_ln(p->source_line,
+					_("function `%s': parameter #%d, `%s', duplicates parameter #%d"),
+					fname, i + 1, name, j + 1);
+			}
+		}
+
+		pnames[i] = name;
+		bcfree(p);
+	}
+	bcfree(list);
+
+	return pnames;
+}
+
+
+#ifdef HASHSIZE
+undef HASHSIZE
+#endif
+#define HASHSIZE 1021
+
+static struct fdesc {
+	char *name;
+	short used;
+	short defined;
+	short extension;
+	struct fdesc *next;
+} *ftable[HASHSIZE];
+
+/* func_use --- track uses and definitions of functions */
+
+static void
+func_use(const char *name, enum defref how)
+{
+	struct fdesc *fp;
+	int len;
+	int ind;
+
+	len = strlen(name);
+	ind = hash(name, len, HASHSIZE, NULL);
+
+	for (fp = ftable[ind]; fp != NULL; fp = fp->next)
+		if (strcmp(fp->name, name) == 0)
+			goto update_value;
+
+	/* not in the table, fall through to allocate a new one */
+
+	ezalloc(fp, struct fdesc *, sizeof(struct fdesc), "func_use");
+	emalloc(fp->name, char *, len + 1, "func_use");
+	strcpy(fp->name, name);
+	fp->next = ftable[ind];
+	ftable[ind] = fp;
+
+update_value:
+	if (how == FUNC_DEFINE)
+		fp->defined++;
+	else if (how == FUNC_EXT) {
+		fp->defined++;
+		fp->extension++;
+	} else
+		fp->used++;
+}
+
+/* track_ext_func --- add an extension function to the table */
+
+void
+track_ext_func(const char *name)
+{
+	func_use(name, FUNC_EXT);
+}
+
+/* check_funcs --- verify functions that are called but not defined */
+
+static void
+check_funcs()
+{
+	struct fdesc *fp, *next;
+	int i;
+
+	if (! in_main_context())
+		goto free_mem;
+
+	for (i = 0; i < HASHSIZE; i++) {
+		for (fp = ftable[i]; fp != NULL; fp = fp->next) {
+			if (do_lint && ! fp->extension) {
+				/*
+				 * Making this not a lint check and
+				 * incrementing * errcount breaks old code.
+				 * Sigh.
+				 */
+				if (fp->defined == 0)
+					lintwarn(_("function `%s' called but never defined"),
+						fp->name);
+
+				if (fp->used == 0)
+					lintwarn(_("function `%s' defined but never called directly"),
+						fp->name);
+			}
+		}
+	}
+
+free_mem:
+	/* now let's free all the memory */
+	for (i = 0; i < HASHSIZE; i++) {
+		for (fp = ftable[i]; fp != NULL; fp = next) {
+			next = fp->next;
+			efree(fp->name);
+			efree(fp);
+		}
+		ftable[i] = NULL;
+	}
+}
+
+/* param_sanity --- look for parameters that are regexp constants */
+
+static void
+param_sanity(INSTRUCTION *arglist)
+{
+	INSTRUCTION *argl, *arg;
+	int i = 1;
+
+	if (arglist == NULL)
+		return;
+	for (argl = arglist->nexti; argl; ) {
+		arg = argl->lasti;
+		if (arg->opcode == Op_match_rec)
+			warning_ln(arg->source_line,
+				_("regexp constant for parameter #%d yields boolean value"), i);
+		argl = arg->nexti;
+		i++;
+	}
+}
+
+/* variable --- make sure NAME is in the symbol table */
+
+NODE *
+variable(int location, char *name, NODETYPE type)
+{
+	NODE *r;
+
+	if ((r = lookup(name)) != NULL) {
+		if (r->type == Node_func || r->type == Node_ext_func )
+			error_ln(location, _("function `%s' called with space between name and `(',\nor used as a variable or an array"),
+				r->vname);
+	} else {
+		/* not found */
+		return install_symbol(name, type);
+	}
+	efree(name);
+	return r;
+}
+
+/* make_regnode --- make a regular expression node */
+
+NODE *
+make_regnode(int type, NODE *exp)
+{
+	NODE *n;
+
+	assert(type == Node_regex || type == Node_dynregex);
+	getnode(n);
+	memset(n, 0, sizeof(NODE));
+	n->type = type;
+	n->re_cnt = 1;
+
+	if (type == Node_regex) {
+		n->re_reg[0] = make_regexp(exp->stptr, exp->stlen, false, true, false);
+		if (n->re_reg[0] == NULL) {
+			freenode(n);
+			return NULL;
+		}
+		n->re_reg[1] = make_regexp(exp->stptr, exp->stlen, true, true, false);
+		if (n->re_reg[1] == NULL) {
+			refree(n->re_reg[0]);
+			freenode(n);
+			return NULL;
+		}
+		n->re_exp = exp;
+		n->re_flags = CONSTANT;
+	}
+	return n;
+}
+
+
+/* mk_rexp --- make a regular expression constant */
+
+static NODE *
+mk_rexp(INSTRUCTION *list)
+{
+	INSTRUCTION *ip;
+
+	ip = list->nexti;
+	if (ip == list->lasti && ip->opcode == Op_match_rec)
+		ip->opcode = Op_push_re;
+	else if (ip == list->lasti && ip->opcode == Op_push_re)
+		; /* do nothing --- @/.../ */
+	else {
+		ip = instruction(Op_push_re);
+		ip->memory = make_regnode(Node_dynregex, NULL);
+		ip->nexti = list->lasti->nexti;
+		list->lasti->nexti = ip;
+		list->lasti = ip;
+	}
+	return ip->memory;
+}
+
+#ifndef NO_LINT
+/* isnoeffect --- when used as a statement, has no side effects */
+
+static int
+isnoeffect(OPCODE type)
+{
+	switch (type) {
+	case Op_times:
+	case Op_times_i:
+	case Op_quotient:
+	case Op_quotient_i:
+	case Op_mod:
+	case Op_mod_i:
+	case Op_plus:
+	case Op_plus_i:
+	case Op_minus:
+	case Op_minus_i:
+	case Op_subscript:
+	case Op_concat:
+	case Op_exp:
+	case Op_exp_i:
+	case Op_unary_minus:
+	case Op_field_spec:
+	case Op_and_final:
+	case Op_or_final:
+	case Op_equal:
+	case Op_notequal:
+	case Op_less:
+	case Op_greater:
+	case Op_leq:
+	case Op_geq:
+	case Op_match:
+	case Op_nomatch:
+	case Op_match_rec:
+	case Op_not:
+	case Op_in_array:
+		return true;
+	default:
+		break;	/* keeps gcc -Wall happy */
+	}
+
+	return false;
+}
+#endif /* NO_LINT */
+
+
+/* make_assignable --- make this operand an assignable one if posiible */
+
+static INSTRUCTION *
+make_assignable(INSTRUCTION *ip)
+{
+	switch (ip->opcode) {
+	case Op_push:
+		ip->opcode = Op_push_lhs;
+		return ip;
+	case Op_field_spec:
+		ip->opcode = Op_field_spec_lhs;
+		return ip;
+	case Op_subscript:
+		ip->opcode = Op_subscript_lhs;
+		return ip;
+	default:
+		break;	/* keeps gcc -Wall happy */
+	}
+	return NULL;
+}
+
+/* stopme --- for debugging */
+
+NODE *
+stopme(int nargs ATTRIBUTE_UNUSED)
+{
+	return make_number(0.0);
+}
+
+/* dumpintlstr --- write out an initial .po file entry for the string */
+
+static void
+dumpintlstr(const char *str, size_t len)
+{
+	char *cp;
+
+	/* See the GNU gettext distribution for details on the file format */
+
+	if (source != NULL) {
+		/* ala the gettext sources, remove leading `./'s */
+		for (cp = source; cp[0] == '.' && cp[1] == '/'; cp += 2)
+			continue;
+		printf("#: %s:%d\n", cp, sourceline);
+	}
+
+	printf("msgid ");
+	pp_string_fp(fprintf, stdout, str, len, '"', true);
+	putchar('\n');
+	printf("msgstr \"\"\n\n");
+	fflush(stdout);
+}
+
+/* dumpintlstr2 --- write out an initial .po file entry for the string and its plural */
+
+static void
+dumpintlstr2(const char *str1, size_t len1, const char *str2, size_t len2)
+{
+	char *cp;
+
+	/* See the GNU gettext distribution for details on the file format */
+
+	if (source != NULL) {
+		/* ala the gettext sources, remove leading `./'s */
+		for (cp = source; cp[0] == '.' && cp[1] == '/'; cp += 2)
+			continue;
+		printf("#: %s:%d\n", cp, sourceline);
+	}
+
+	printf("msgid ");
+	pp_string_fp(fprintf, stdout, str1, len1, '"', true);
+	putchar('\n');
+	printf("msgid_plural ");
+	pp_string_fp(fprintf, stdout, str2, len2, '"', true);
+	putchar('\n');
+	printf("msgstr[0] \"\"\nmsgstr[1] \"\"\n\n");
+	fflush(stdout);
+}
+
+/* mk_binary --- instructions for binary operators */
+
+static INSTRUCTION *
+mk_binary(INSTRUCTION *s1, INSTRUCTION *s2, INSTRUCTION *op)
+{
+	INSTRUCTION *ip1,*ip2;
+	AWKNUM res;
+
+	ip2 = s2->nexti;
+	if (s2->lasti == ip2 && ip2->opcode == Op_push_i) {
+	/* do any numeric constant folding */
+		ip1 = s1->nexti;
+		if (do_optimize
+				&& ip1 == s1->lasti && ip1->opcode == Op_push_i
+				&& (ip1->memory->flags & (MPFN|MPZN|STRCUR|STRING)) == 0
+				&& (ip2->memory->flags & (MPFN|MPZN|STRCUR|STRING)) == 0
+		) {
+			NODE *n1 = ip1->memory, *n2 = ip2->memory;
+			res = force_number(n1)->numbr;
+			(void) force_number(n2);
+			switch (op->opcode) {
+			case Op_times:
+				res *= n2->numbr;
+				break;
+			case Op_quotient:
+				if (n2->numbr == 0.0) {
+					/* don't fatalize, allow parsing rest of the input */
+					error_ln(op->source_line, _("division by zero attempted"));
+					goto regular;
+				}
+
+				res /= n2->numbr;
+				break;
+			case Op_mod:
+				if (n2->numbr == 0.0) {
+					/* don't fatalize, allow parsing rest of the input */
+					error_ln(op->source_line, _("division by zero attempted in `%%'"));
+					goto regular;
+				}
+#ifdef HAVE_FMOD
+				res = fmod(res, n2->numbr);
+#else	/* ! HAVE_FMOD */
+				(void) modf(res / n2->numbr, &res);
+				res = n1->numbr - res * n2->numbr;
+#endif	/* ! HAVE_FMOD */
+				break;
+			case Op_plus:
+				res += n2->numbr;
+				break;
+			case Op_minus:
+				res -= n2->numbr;
+				break;
+			case Op_exp:
+				res = calc_exp(res, n2->numbr);
+				break;
+			default:
+				goto regular;
+			}
+
+			op->opcode = Op_push_i;
+			// We don't need to call set_profile_text() here since
+			// optimizing is disabled when doing pretty printing.
+			op->memory = make_number(res);
+			unref(n1);
+			unref(n2);
+			bcfree(ip1);
+			bcfree(ip2);
+			bcfree(s1);
+			bcfree(s2);
+			return list_create(op);
+		} else {
+		/* do basic arithmetic optimisation */
+		/* convert (Op_push_i Node_val) + (Op_plus) to (Op_plus_i Node_val) */
+			switch (op->opcode) {
+			case Op_times:
+				op->opcode = Op_times_i;
+				break;
+			case Op_quotient:
+				op->opcode = Op_quotient_i;
+				break;
+			case Op_mod:
+				op->opcode = Op_mod_i;
+				break;
+			case Op_plus:
+				op->opcode = Op_plus_i;
+				break;
+			case Op_minus:
+				op->opcode = Op_minus_i;
+				break;
+			case Op_exp:
+				op->opcode = Op_exp_i;
+				break;
+			default:
+				goto regular;
+			}
+
+			op->memory = ip2->memory;
+			bcfree(ip2);
+			bcfree(s2);	/* Op_list */
+			return list_append(s1, op);
+		}
+	}
+
+regular:
+	/* append lists s1, s2 and add `op' bytecode */
+	(void) list_merge(s1, s2);
+	return list_append(s1, op);
+}
+
+/* mk_boolean --- instructions for boolean and, or */
+
+static INSTRUCTION *
+mk_boolean(INSTRUCTION *left, INSTRUCTION *right, INSTRUCTION *op)
+{
+	INSTRUCTION *tp;
+	OPCODE opc, final_opc;
+
+	opc = op->opcode;		/* Op_and or Op_or */
+	final_opc = (opc == Op_or) ? Op_or_final : Op_and_final;
+
+	add_lint(right, LINT_assign_in_cond);
+
+	tp = left->lasti;
+
+	if (tp->opcode != final_opc) {	/* x || y */
+		list_append(right, instruction(final_opc));
+		add_lint(left, LINT_assign_in_cond);
+		(void) list_append(left, op);
+		left->lasti->target_jmp = right->lasti;
+
+		/* NB: target_stmt points to previous Op_and(Op_or) in a chain;
+		 *     target_stmt only used in the parser (see below).
+		 */
+
+		left->lasti->target_stmt = left->lasti;
+		right->lasti->target_stmt = left->lasti;
+	} else {		/* optimization for x || y || z || ... */
+		INSTRUCTION *ip;
+
+		op->opcode = final_opc;
+		(void) list_append(right, op);
+		op->target_stmt = tp;
+		tp->opcode = opc;
+		tp->target_jmp = op;
+
+		/* update jump targets */
+		for (ip = tp->target_stmt; ; ip = ip->target_stmt) {
+			assert(ip->opcode == opc);
+			assert(ip->target_jmp == tp);
+			/* if (ip->opcode == opc &&  ip->target_jmp == tp) */
+			ip->target_jmp = op;
+			if (ip->target_stmt == ip)
+				break;
+		}
+	}
+
+	return list_merge(left, right);
+}
+
+/* mk_condition --- if-else and conditional */
+
+static INSTRUCTION *
+mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, INSTRUCTION *true_branch,
+		INSTRUCTION *elsep, INSTRUCTION *false_branch)
+{
+	/*
+	 *    ----------------
+	 *       cond
+	 *    ----------------
+	 * t: [Op_jmp_false f ]
+	 *    ----------------
+	 *       true_branch
+	 *
+	 *    ----------------
+	 *    [Op_jmp y]
+	 *    ----------------
+	 * f:
+	 *      false_branch
+	 *    ----------------
+	 * y: [Op_no_op]
+	 *    ----------------
+	 */
+
+	INSTRUCTION *ip;
+	bool setup_else_part = true;
+
+	if (false_branch == NULL) {
+		false_branch = list_create(instruction(Op_no_op));
+		if (elsep == NULL) {		/* else { } */
+			setup_else_part = false;
+		}
+	} else {
+		/* assert(elsep != NULL); */
+
+		/* avoid a series of no_op's: if .. else if .. else if .. */
+		if (false_branch->lasti->opcode != Op_no_op)
+			(void) list_append(false_branch, instruction(Op_no_op));
+	}
+
+	if (setup_else_part) {
+		if (do_pretty_print) {
+			(void) list_prepend(false_branch, elsep);
+			false_branch->nexti->branch_end = false_branch->lasti;
+			(void) list_prepend(false_branch, instruction(Op_exec_count));
+		} else
+			bcfree(elsep);
+	}
+
+	(void) list_prepend(false_branch, instruction(Op_jmp));
+	false_branch->nexti->target_jmp = false_branch->lasti;
+
+	add_lint(cond, LINT_assign_in_cond);
+	ip = list_append(cond, instruction(Op_jmp_false));
+	ip->lasti->target_jmp = false_branch->nexti->nexti;
+
+	if (do_pretty_print) {
+		(void) list_prepend(ip, ifp);
+		(void) list_append(ip, instruction(Op_exec_count));
+		ip->nexti->branch_if = ip->lasti;
+		ip->nexti->branch_else = false_branch->nexti;
+	} else
+		bcfree(ifp);
+
+	if (true_branch != NULL)
+		list_merge(ip, true_branch);
+	return list_merge(ip, false_branch);
+}
+
+enum defline { FIRST_LINE, LAST_LINE };
+
+/* find_line -- find the first(last) line in a list of (pattern) instructions */
+
+static int
+find_line(INSTRUCTION *pattern, enum defline what)
+{
+	INSTRUCTION *ip;
+	int lineno = 0;
+
+	for (ip = pattern->nexti; ip; ip = ip->nexti) {
+		if (what == LAST_LINE) {
+			if (ip->source_line > lineno)
+				lineno = ip->source_line;
+		} else {	/* FIRST_LINE */
+			if (ip->source_line > 0
+					&& (lineno == 0 || ip->source_line < lineno))
+				lineno = ip->source_line;
+		}
+		if (ip == pattern->lasti)
+			break;
+	}
+	assert(lineno > 0);
+	return lineno;
+}
+
+/* append_rule --- pattern-action instructions */
+
+static INSTRUCTION *
+append_rule(INSTRUCTION *pattern, INSTRUCTION *action)
+{
+	/*
+	 *    ----------------
+	 *       pattern
+	 *    ----------------
+	 *    [Op_jmp_false f ]
+	 *    ----------------
+	 *       action
+	 *    ----------------
+	 * f: [Op_no_op       ]
+	 *    ----------------
+	 */
+
+	INSTRUCTION *rp;
+	INSTRUCTION *tp;
+	INSTRUCTION *ip;
+
+	if (rule != Rule) {
+		rp = pattern;
+		if (do_pretty_print) {
+			rp[3].nexti = namespace_chain;
+			namespace_chain = NULL;
+			(void) list_append(action, instruction(Op_no_op));
+		}
+		(rp + 1)->firsti = action->nexti;
+		(rp + 1)->lasti = action->lasti;
+		(rp + 2)->first_line = pattern->source_line;
+		(rp + 2)->last_line = lastline;
+		ip = list_prepend(action, rp);
+		if (interblock_comment != NULL) {
+			ip = list_prepend(ip, interblock_comment);
+			interblock_comment = NULL;
+		}
+	} else {
+		rp = bcalloc(Op_rule, 4, 0);
+		rp->in_rule = Rule;
+		rp->source_file = source;
+		tp = instruction(Op_no_op);
+
+		if (do_pretty_print) {
+			rp[3].nexti = namespace_chain;
+			namespace_chain = NULL;
+		}
+
+		if (pattern == NULL) {
+			/* assert(action != NULL); */
+			if (do_pretty_print)
+				(void) list_prepend(action, instruction(Op_exec_count));
+			(rp + 1)->firsti = action->nexti;
+			(rp + 1)->lasti = tp;
+			(rp + 2)->first_line = firstline;
+			(rp + 2)->last_line = lastline;
+			rp->source_line = firstline;
+			ip = list_prepend(list_append(action, tp), rp);
+		} else {
+			(void) list_append(pattern, instruction(Op_jmp_false));
+			pattern->lasti->target_jmp = tp;
+			(rp + 2)->first_line = find_line(pattern, FIRST_LINE);
+			rp->source_line = (rp + 2)->first_line;
+			if (action == NULL) {
+				(rp + 2)->last_line = find_line(pattern, LAST_LINE);
+				action = list_create(instruction(Op_K_print_rec));
+				if (do_pretty_print)
+					action = list_prepend(action, instruction(Op_exec_count));
+			} else
+				(rp + 2)->last_line = lastline;
+
+			if (interblock_comment != NULL) {	// was after previous action
+				pattern = list_prepend(pattern, interblock_comment);
+				interblock_comment = NULL;
+			}
+
+			if (do_pretty_print) {
+				pattern = list_prepend(pattern, instruction(Op_exec_count));
+				action = list_prepend(action, instruction(Op_exec_count));
+			}
+
+ 			(rp + 1)->firsti = action->nexti;
+			(rp + 1)->lasti = tp;
+			ip = list_append(
+					list_merge(list_prepend(pattern, rp),
+						action),
+					tp);
+		}
+	}
+
+	list_append(rule_list, rp + 1);
+
+	if (rule_block[rule] == NULL)
+		rule_block[rule] = ip;
+	else
+		(void) list_merge(rule_block[rule], ip);
+
+	return rule_block[rule];
+}
+
+/* mk_assignment --- assignment bytecodes */
+
+static INSTRUCTION *
+mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, INSTRUCTION *op)
+{
+	INSTRUCTION *tp;
+	INSTRUCTION *ip;
+
+	tp = lhs->lasti;
+	switch (tp->opcode) {
+	case Op_field_spec:
+		tp->opcode = Op_field_spec_lhs;
+		break;
+	case Op_subscript:
+		tp->opcode = Op_subscript_lhs;
+		break;
+	case Op_push:
+	case Op_push_array:
+		tp->opcode = Op_push_lhs;
+		break;
+	case Op_field_assign:
+		yyerror(_("cannot assign a value to the result of a field post-increment expression"));
+		break;
+	default:
+		yyerror(_("invalid target of assignment (opcode %s)"),
+				opcode2str(tp->opcode));
+		break;
+	}
+
+	tp->do_reference = (op->opcode != Op_assign);	/* check for uninitialized reference */
+
+	if (rhs != NULL)
+		ip = list_merge(rhs, lhs);
+	else
+		ip = lhs;
+
+	(void) list_append(ip, op);
+
+	if (tp->opcode == Op_push_lhs
+			&& tp->memory->type == Node_var
+			&& tp->memory->var_assign
+	) {
+		tp->do_reference = false; /* no uninitialized reference checking
+		                           * for a special variable.
+		                           */
+		(void) list_append(ip, instruction(Op_var_assign));
+		ip->lasti->assign_var = tp->memory->var_assign;
+	} else if (tp->opcode == Op_field_spec_lhs) {
+		(void) list_append(ip, instruction(Op_field_assign));
+		ip->lasti->field_assign = (Func_ptr) 0;
+		tp->target_assign = ip->lasti;
+	} else if (tp->opcode == Op_subscript_lhs) {
+		(void) list_append(ip, instruction(Op_subscript_assign));
+	}
+
+	return ip;
+}
+
+/* optimize_assignment --- peephole optimization for assignment */
+
+static INSTRUCTION *
+optimize_assignment(INSTRUCTION *exp)
+{
+	INSTRUCTION *i1, *i2, *i3;
+
+	/*
+	 * Optimize assignment statements array[subs] = x; var = x; $n = x;
+	 * string concatenation of the form s = s t.
+	 *
+	 * 1) Array element assignment array[subs] = x:
+	 *   Replaces Op_push_array + Op_subscript_lhs + Op_assign + Op_pop
+	 *   with single instruction Op_store_sub.
+	 *	 Limitation: 1 dimension and sub is simple var/value.
+	 *
+	 * 2) Simple variable assignment var = x:
+	 *   Replaces Op_push_lhs + Op_assign + Op_pop with Op_store_var.
+	 *
+	 * 3) Field assignment $n = x:
+	 *   Replaces Op_field_spec_lhs + Op_assign + Op_field_assign + Op_pop
+	 *   with Op_store_field.
+	 *
+	 * 4) Optimization for string concatenation:
+	 *   For cases like x = x y, uses realloc to include y in x;
+	 *   also eliminates instructions Op_push_lhs and Op_pop.
+	 */
+
+	/*
+	 * N.B.: do not append Op_pop instruction to the returned
+	 * instruction list if optimized. None of these
+	 * optimized instructions pushes the r-value of assignment
+	 * onto the runtime stack.
+	 */
+
+	i2 = NULL;
+	i1 = exp->lasti;
+
+	if (   i1->opcode != Op_assign
+	    && i1->opcode != Op_field_assign)
+		return list_append(exp, instruction(Op_pop));
+
+	for (i2 = exp->nexti; i2 != i1; i2 = i2->nexti) {
+		switch (i2->opcode) {
+		case Op_concat:
+			if (i2->nexti->opcode == Op_push_lhs    /* l.h.s is a simple variable */
+				&& (i2->concat_flag & CSVAR) != 0   /* 1st exp in r.h.s is a simple variable;
+				                                     * see Op_concat in the grammer above.
+				                                     */
+				&& i2->nexti->memory == exp->nexti->memory	 /* and the same as in l.h.s */
+				&& i2->nexti->nexti == i1
+				&& i1->opcode == Op_assign
+			) {
+				/* s = s ... optimization */
+
+				/* avoid stuff like x = x (x = y) or x = x gsub(/./, "b", x);
+				 * check for l-value reference to this variable in the r.h.s.
+				 * Also, avoid function calls in general to guard against
+				 * global variable assignment.
+				 */
+
+				for (i3 = exp->nexti->nexti; i3 != i2; i3 = i3->nexti) {
+					if ((i3->opcode == Op_push_lhs && i3->memory == i2->nexti->memory)
+							|| i3->opcode == Op_func_call)
+						return list_append(exp, instruction(Op_pop)); /* no optimization */
+				}
+
+				/* remove the variable from r.h.s */
+				i3 = exp->nexti;
+				exp->nexti = i3->nexti;
+				bcfree(i3);
+
+				if (--i2->expr_count == 1)	/* one less expression in Op_concat */
+					i2->opcode = Op_no_op;
+
+				i3 = i2->nexti;
+				assert(i3->opcode == Op_push_lhs);
+				i3->opcode = Op_assign_concat;	/* change Op_push_lhs to Op_assign_concat */
+				i3->nexti = NULL;
+				bcfree(i1);          /* Op_assign */
+				exp->lasti = i3;     /* update Op_list */
+				return exp;
+			}
+			break;
+
+		case Op_field_spec_lhs:
+			if (i2->nexti->opcode == Op_assign
+					&& i2->nexti->nexti == i1
+					&& i1->opcode == Op_field_assign
+			) {
+				/* $n = .. */
+				i2->opcode = Op_store_field;
+				bcfree(i2->nexti);  /* Op_assign */
+				i2->nexti = NULL;
+				bcfree(i1);          /* Op_field_assign */
+				exp->lasti = i2;    /* update Op_list */
+				return exp;
+			}
+			break;
+
+		case Op_push_array:
+			if (i2->nexti->nexti->opcode == Op_subscript_lhs) {
+				i3 = i2->nexti->nexti;
+				if (i3->sub_count == 1
+						&& i3->nexti == i1
+						&& i1->opcode == Op_assign
+				) {
+					/* array[sub] = .. */
+					i3->opcode = Op_store_sub;
+					i3->memory = i2->memory;
+					i3->expr_count = 1;  /* sub_count shadows memory,
+                                          * so use expr_count instead.
+				                          */
+					i3->nexti = NULL;
+					i2->opcode = Op_no_op;
+					bcfree(i1);          /* Op_assign */
+					exp->lasti = i3;     /* update Op_list */
+					return exp;
+				}
+			}
+			break;
+
+		case Op_push_lhs:
+			if (i2->nexti == i1
+					&& i1->opcode == Op_assign
+			) {
+				/* var = .. */
+				i2->opcode = Op_store_var;
+				i2->nexti = NULL;
+				bcfree(i1);          /* Op_assign */
+				exp->lasti = i2;     /* update Op_list */
+
+				i3 = exp->nexti;
+				if (i3->opcode == Op_push_i
+					&& (i3->memory->flags & INTLSTR) == 0
+					&& i3->nexti == i2
+				) {
+					/* constant initializer */
+					i2->initval = i3->memory;
+					bcfree(i3);
+					exp->nexti = i2;
+				} else
+					i2->initval = NULL;
+
+				return exp;
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	/* no optimization  */
+	return list_append(exp, instruction(Op_pop));
+}
+
+
+/* mk_getline --- make instructions for getline */
+
+static INSTRUCTION *
+mk_getline(INSTRUCTION *op, INSTRUCTION *var, INSTRUCTION *redir, int redirtype)
+{
+	INSTRUCTION *ip;
+	INSTRUCTION *tp;
+	INSTRUCTION *asgn = NULL;
+
+	/*
+	 *  getline [var] < [file]
+	 *
+	 *  [ file (simp_exp)]
+	 *  [ [ var ] ]
+	 *  [ Op_K_getline_redir|NULL|redir_type|into_var]
+	 *  [ [var_assign] ]
+	 *
+	 */
+
+	if (redir == NULL) {
+		int sline = op->source_line;
+		bcfree(op);
+		op = bcalloc(Op_K_getline, 2, sline);
+		(op + 1)->target_endfile = ip_endfile;
+		(op + 1)->target_beginfile = ip_beginfile;
+	}
+
+	if (var != NULL) {
+		tp = make_assignable(var->lasti);
+		assert(tp != NULL);
+
+		/* check if we need after_assign bytecode */
+		if (tp->opcode == Op_push_lhs
+				&& tp->memory->type == Node_var
+				&& tp->memory->var_assign
+		) {
+			asgn = instruction(Op_var_assign);
+			asgn->assign_ctxt = op->opcode;
+			asgn->assign_var = tp->memory->var_assign;
+		} else if (tp->opcode == Op_field_spec_lhs) {
+			asgn = instruction(Op_field_assign);
+			asgn->assign_ctxt = op->opcode;
+			asgn->field_assign = (Func_ptr) 0;   /* determined at run time */
+			tp->target_assign = asgn;
+		} else if (tp->opcode == Op_subscript_lhs) {
+			asgn = instruction(Op_subscript_assign);
+			asgn->assign_ctxt = op->opcode;
+		}
+
+		if (redir != NULL) {
+			ip = list_merge(redir, var);
+			(void) list_append(ip, op);
+		} else
+			ip = list_append(var, op);
+	} else if (redir != NULL)
+		ip = list_append(redir, op);
+	else
+		ip = list_create(op);
+	op->into_var = (var != NULL);
+	op->redir_type = (redir != NULL) ? redirtype : redirect_none;
+
+	return (asgn == NULL ? ip : list_append(ip, asgn));
+}
+
+
+/* mk_for_loop --- for loop bytecodes */
+
+static INSTRUCTION *
+mk_for_loop(INSTRUCTION *forp, INSTRUCTION *init, INSTRUCTION *cond,
+				INSTRUCTION *incr, INSTRUCTION *body)
+{
+	/*
+	 *   ------------------------
+	 *        init                 (may be NULL)
+	 *   ------------------------
+	 * x:
+	 *        cond                 (Op_no_op if NULL)
+	 *   ------------------------
+	 *    [ Op_jmp_false tb      ]
+	 *   ------------------------
+	 *        body                 (may be NULL)
+	 *   ------------------------
+	 * tc:
+	 *    incr                      (may be NULL)
+	 *    [ Op_jmp x             ]
+	 *   ------------------------
+	 * tb:[ Op_no_op             ]
+	 */
+
+	INSTRUCTION *ip, *tbreak, *tcont;
+	INSTRUCTION *jmp;
+	INSTRUCTION *pp_cond;
+	INSTRUCTION *ret;
+
+	tbreak = instruction(Op_no_op);
+
+	if (cond != NULL) {
+		add_lint(cond, LINT_assign_in_cond);
+		pp_cond = cond->nexti;
+		ip = cond;
+		(void) list_append(ip, instruction(Op_jmp_false));
+		ip->lasti->target_jmp = tbreak;
+	} else {
+		pp_cond = instruction(Op_no_op);
+		ip = list_create(pp_cond);
+	}
+
+	if (init != NULL)
+		ip = list_merge(init, ip);
+
+	if (do_pretty_print) {
+		(void) list_append(ip, instruction(Op_exec_count));
+		(forp + 1)->forloop_cond = pp_cond;
+		(forp + 1)->forloop_body = ip->lasti;
+	}
+
+	if (body != NULL)
+		(void) list_merge(ip, body);
+
+	jmp = instruction(Op_jmp);
+	jmp->target_jmp = pp_cond;
+	if (incr == NULL)
+		tcont = jmp;
+	else {
+		tcont = incr->nexti;
+		(void) list_merge(ip, incr);
+	}
+
+	(void) list_append(ip, jmp);
+	ret = list_append(ip, tbreak);
+	fix_break_continue(ret, tbreak, tcont);
+
+	if (do_pretty_print) {
+		forp->target_break = tbreak;
+		forp->target_continue = tcont;
+		ret = list_prepend(ret, forp);
+	}
+	/* else
+		forp is NULL */
+
+	return ret;
+}
+
+/* add_lint --- add lint warning bytecode if needed */
+
+static void
+add_lint(INSTRUCTION *list, LINTTYPE linttype)
+{
+#ifndef NO_LINT
+	INSTRUCTION *ip;
+
+	switch (linttype) {
+	case LINT_assign_in_cond:
+		ip = list->lasti;
+		if (ip->opcode == Op_var_assign || ip->opcode == Op_field_assign) {
+			assert(ip != list->nexti);
+			for (ip = list->nexti; ip->nexti != list->lasti; ip = ip->nexti)
+				;
+		}
+
+		if (ip->opcode == Op_assign || ip->opcode == Op_assign_concat) {
+			list_append(list, instruction(Op_lint));
+			list->lasti->lint_type = linttype;
+		}
+		break;
+
+	case LINT_no_effect:
+		if (list->lasti->opcode == Op_pop && list->nexti != list->lasti) {
+			int line = 0;
+
+			// Get down to the last instruction (FIXME: why?)
+			for (ip = list->nexti; ip->nexti != list->lasti; ip = ip->nexti) {
+				// along the way track line numbers, we will use the line
+				// closest to the opcode if that opcode doesn't have one
+				if (ip->source_line != 0)
+					line = ip->source_line;
+			}
+
+			if (do_lint) {		/* compile-time warning */
+				if (isnoeffect(ip->opcode)) {
+					if (ip->source_line != 0)
+						line = ip->source_line;
+					lintwarn_ln(line, ("statement may have no effect"));
+				}
+			}
+
+			if (ip->opcode == Op_push || ip->opcode == Op_push_i) {		/* run-time warning */
+				list_append(list, instruction(Op_lint));
+				list->lasti->lint_type = linttype;
+			}
+		}
+		break;
+
+	default:
+		break;
+	}
+#endif
+}
+
+/* mk_expression_list --- list of bytecode lists */
+
+static INSTRUCTION *
+mk_expression_list(INSTRUCTION *list, INSTRUCTION *s1)
+{
+	INSTRUCTION *r;
+
+	/* we can't just combine all bytecodes, since we need to
+	 * process individual expressions for a few builtins in snode() (-:
+	 */
+
+	/* -- list of lists     */
+	/* [Op_list| ... ]------
+	 *                       |
+	 * [Op_list| ... ]   --  |
+	 *  ...               |  |
+	 *  ...       <-------   |
+	 * [Op_list| ... ]   --  |
+	 *  ...               |  |
+	 *  ...               |  |
+	 *  ...       <------- --
+	 */
+
+	assert(s1 != NULL && s1->opcode == Op_list);
+	if (list == NULL) {
+		list = instruction(Op_list);
+		list->nexti = s1;
+		list->lasti = s1->lasti;
+		return list;
+	}
+
+	/* append expression to the end of the list */
+
+	r = list->lasti;
+	r->nexti = s1;
+	list->lasti = s1->lasti;
+	return list;
+}
+
+/* count_expressions --- fixup expression_list from mk_expression_list.
+ *                       returns no of expressions in list. isarg is true
+ *                       for function arguments.
+ */
+
+static int
+count_expressions(INSTRUCTION **list, bool isarg)
+{
+	INSTRUCTION *expr;
+	INSTRUCTION *r = NULL;
+	int count = 0;
+
+	if (*list == NULL)	/* error earlier */
+		return 0;
+
+	for (expr = (*list)->nexti; expr; ) {
+		INSTRUCTION *t1, *t2;
+		t1 = expr->nexti;
+		t2 = expr->lasti;
+		if (isarg && t1 == t2 && t1->opcode == Op_push)
+			t1->opcode = Op_push_param;
+		if (++count == 1)
+			r = expr;
+		else
+			(void) list_merge(r, expr);
+		expr = t2->nexti;
+	}
+
+	assert(count > 0);
+	if (! isarg && count > max_args)
+		max_args = count;
+	bcfree(*list);
+	*list = r;
+	return count;
+}
+
+/* fix_break_continue --- fix up break & continue codes in loop bodies */
+
+static void
+fix_break_continue(INSTRUCTION *list, INSTRUCTION *b_target, INSTRUCTION *c_target)
+{
+	INSTRUCTION *ip;
+
+	list->lasti->nexti = NULL;	/* just to make sure */
+
+	for (ip = list->nexti; ip != NULL; ip = ip->nexti) {
+		switch (ip->opcode) {
+		case Op_K_break:
+			if (ip->target_jmp == NULL)
+				ip->target_jmp = b_target;
+			break;
+
+		case Op_K_continue:
+			if (ip->target_jmp == NULL)
+				ip->target_jmp = c_target;
+			break;
+
+		default:
+			/* this is to keep the compiler happy. sheesh. */
+			break;
+		}
+	}
+}
+
+static inline INSTRUCTION *
+list_create(INSTRUCTION *x)
+{
+	INSTRUCTION *l;
+
+	l = instruction(Op_list);
+	l->nexti = x;
+	l->lasti = x;
+	return l;
+}
+
+static inline INSTRUCTION *
+list_append(INSTRUCTION *l, INSTRUCTION *x)
+{
+#ifdef GAWKDEBUG
+	if (l->opcode != Op_list)
+		cant_happen();
+#endif
+	l->lasti->nexti = x;
+	l->lasti = x;
+	return l;
+}
+
+static inline INSTRUCTION *
+list_prepend(INSTRUCTION *l, INSTRUCTION *x)
+{
+#ifdef GAWKDEBUG
+	if (l->opcode != Op_list)
+		cant_happen();
+#endif
+	x->nexti = l->nexti;
+	l->nexti = x;
+	return l;
+}
+
+static inline INSTRUCTION *
+list_merge(INSTRUCTION *l1, INSTRUCTION *l2)
+{
+#ifdef GAWKDEBUG
+	if (l1->opcode != Op_list)
+		cant_happen();
+	if (l2->opcode != Op_list)
+		cant_happen();
+#endif
+	l1->lasti->nexti = l2->nexti;
+	l1->lasti = l2->lasti;
+	bcfree(l2);
+	return l1;
+}
+
+/* See if name is a special token. */
+
+int
+check_special(const char *name)
+{
+	int low, high, mid;
+	int i;
+	int non_standard_flags = 0;
+#ifdef USE_EBCDIC
+	static bool did_sort = false;
+
+	if (! did_sort) {
+		qsort((void *) tokentab,
+				sizeof(tokentab) / sizeof(tokentab[0]),
+				sizeof(tokentab[0]), tokcompare);
+		did_sort = true;
+	}
+#endif
+
+	if (do_traditional)
+		non_standard_flags |= GAWKX;
+	if (do_posix)
+		non_standard_flags |= NOT_POSIX;
+
+	low = 0;
+	high = (sizeof(tokentab) / sizeof(tokentab[0])) - 1;
+	while (low <= high) {
+		mid = (low + high) / 2;
+		i = *name - tokentab[mid].operator[0];
+		if (i == 0)
+			i = strcmp(name, tokentab[mid].operator);
+
+		if (i < 0)		/* token < mid */
+			high = mid - 1;
+		else if (i > 0)		/* token > mid */
+			low = mid + 1;
+		else {
+			if ((tokentab[mid].flags & non_standard_flags) != 0)
+				return -1;
+			return mid;
+		}
+	}
+	return -1;
+}
+
+/*
+ * This provides a private version of functions that act like VMS's
+ * variable-length record filesystem, where there was a bug on
+ * certain source files.
+ */
+
+static FILE *fp = NULL;
+
+/* read_one_line --- return one input line at a time. mainly for debugging. */
+
+static ssize_t
+read_one_line(int fd, void *buffer, size_t count)
+{
+	char buf[BUFSIZ];
+
+	/* Minor potential memory leak here. Too bad. */
+	if (fp == NULL) {
+		fp = fdopen(fd, "r");
+		if (fp == NULL) {
+			fprintf(stderr, "ugh. fdopen: %s\n", strerror(errno));
+			gawk_exit(EXIT_FAILURE);
+		}
+	}
+
+	if (fgets(buf, sizeof buf, fp) == NULL)
+		return 0;
+
+	memcpy(buffer, buf, strlen(buf));
+	return strlen(buf);
+}
+
+/* one_line_close --- close the open file being read with read_one_line() */
+
+static int
+one_line_close(int fd)
+{
+	int ret;
+
+	if (fp == NULL || fd != fileno(fp))
+		fatal("debugging read/close screwed up!");
+
+	ret = fclose(fp);
+	fp = NULL;
+	return ret;
+}
+
+
+/* lookup_builtin --- find a builtin function or return NULL */
+
+builtin_func_t
+lookup_builtin(const char *name)
+{
+	if (strncmp(name, "awk::", 5) == 0)
+		name += 5;
+
+	int mid = check_special(name);
+
+	if (mid == -1)
+		return NULL;
+
+	switch (tokentab[mid].class) {
+	case LEX_BUILTIN:
+	case LEX_LENGTH:
+		break;
+	default:
+		return NULL;
+	}
+
+	/* And another special case... */
+	if (tokentab[mid].value == Op_sub_builtin)
+		return (builtin_func_t) do_sub;
+
+#ifdef HAVE_MPFR
+	if (do_mpfr)
+		return tokentab[mid].ptr2;
+#endif
+
+	return tokentab[mid].ptr;
+}
+
+/* install_builtins --- add built-in functions to FUNCTAB */
+
+void
+install_builtins(void)
+{
+	int i, j;
+	int flags_that_must_be_clear = DEBUG_USE;
+
+	if (do_traditional)
+		flags_that_must_be_clear |= GAWKX;
+
+	if (do_posix)
+		flags_that_must_be_clear |= NOT_POSIX;
+
+
+	j = sizeof(tokentab) / sizeof(tokentab[0]);
+	for (i = 0; i < j; i++) {
+		if (   (tokentab[i].class == LEX_BUILTIN
+		        || tokentab[i].class == LEX_LENGTH)
+		    && (tokentab[i].flags & flags_that_must_be_clear) == 0) {
+			(void) install_symbol(tokentab[i].operator, Node_builtin_func);
+		}
+	}
+}
+
+/*
+ * 9/2014: Gawk cannot use <ctype.h> isalpha or isalnum when
+ * parsing the program since that can let through non-English
+ * letters.  So, we supply our own. !@#$%^&*()-ing locales!
+ */
+
+/* is_alpha --- return true if c is an English letter */
+
+/*
+ * The scene of the murder was grisly to look upon.  When the inspector
+ * arrived, the sergeant turned to him and said, "Another programmer stabbed
+ * in the back. He never knew what happened."
+ *
+ * The inspector replied, "Looks like the MO of isalpha, and his even meaner
+ * big brother, isalnum. The Locale brothers."  The sergeant merely
+ * shuddered in horror.
+ */
+
+bool
+is_alpha(int c)
+{
+	switch (c) {
+	case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+	case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+	case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+	case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+	case 'y': case 'z':
+	case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+	case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+	case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+	case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+	case 'Y': case 'Z':
+		return true;
+	}
+	return false;
+}
+
+/* is_alnum --- return true for alphanumeric, English only letters */
+
+bool
+is_alnum(int c)
+{
+	/* digit test is good for EBCDIC too. so there. */
+	return (is_alpha(c) || ('0' <= c && c <= '9'));
+}
+
+
+/*
+ * is_letter --- function to check letters
+ *	isalpha() isn't good enough since it can look at the locale.
+ * Underscore counts as a letter in awk identifiers
+ */
+
+bool
+is_letter(int c)
+{
+	return (is_alpha(c) || c == '_');
+}
+
+/* is_identchar --- return true if c can be in an identifier */
+
+bool
+is_identchar(int c)
+{
+	return (is_alnum(c) || c == '_');
+}
+
+/* set_profile_text --- make a number that can be printed when profiling */
+
+static NODE *
+set_profile_text(NODE *n, const char *str, size_t len)
+{
+	if (do_pretty_print) {
+		// two extra bytes: one for NUL termination, and another in
+		// case we need to add a leading minus sign in add_sign_to_num
+		emalloc(n->stptr, char *, len + 2, "set_profile_text");
+		memcpy(n->stptr, str, len);
+		n->stptr[len] = '\0';
+		n->stlen = len;
+		// Set STRCUR and n->stfmt for use when profiling
+		// (i.e., actually running the program) so that
+		// force_string() on this item will work ok.
+		// Thanks and a tip of the hatlo to valgrind.
+		n->flags |= (NUMCONSTSTR|STRCUR);
+		n->stfmt = STFMT_UNUSED;
+#ifdef HAVE_MPFR
+		n->strndmode = MPFR_round_mode;
+#endif
+	}
+
+	return n;
+}
+
+/*
+ * merge_comments --- merge c2 into c1 and free c2 if successful.
+ *	Allow c2 to be NULL, in which case just merged chained
+ *	comments in c1.
+ */
+
+static void
+merge_comments(INSTRUCTION *c1, INSTRUCTION *c2)
+{
+	assert(c1->opcode == Op_comment);
+
+	if (c1->comment == NULL && c2 == NULL)	// nothing to do
+		return;
+
+	size_t total = c1->memory->stlen;
+	if (c1->comment != NULL)
+		total += 1 /* \n */ + c1->comment->memory->stlen;
+
+	if (c2 != NULL) {
+		assert(c2->opcode == Op_comment);
+		total += 1 /* \n */ + c2->memory->stlen;
+		if (c2->comment != NULL)
+			total += c2->comment->memory->stlen + 1;
+	}
+
+	char *buffer;
+	emalloc(buffer, char *, total + 1, "merge_comments");
+
+	strcpy(buffer, c1->memory->stptr);
+	if (c1->comment != NULL) {
+		strcat(buffer, "\n");
+		strcat(buffer, c1->comment->memory->stptr);
+	}
+
+	if (c2 != NULL) {
+		strcat(buffer, "\n");
+		strcat(buffer, c2->memory->stptr);
+		if (c2->comment != NULL) {
+			strcat(buffer, "\n");
+			strcat(buffer, c2->comment->memory->stptr);
+		}
+
+		unref(c2->memory);
+		if (c2->comment != NULL) {
+			unref(c2->comment->memory);
+			bcfree(c2->comment);
+			c2->comment = NULL;
+		}
+		bcfree(c2);
+	}
+
+	c1->memory->comment_type = BLOCK_COMMENT;
+	free(c1->memory->stptr);
+	c1->memory->stptr = buffer;
+	c1->memory->stlen = strlen(buffer);
+
+	// now free everything else
+	if (c1->comment != NULL) {
+		unref(c1->comment->memory);
+		bcfree(c1->comment);
+		c1->comment = NULL;
+	}
+}
+
+/* make_braced_statements --- handle `l_brace statements r_brace' with comments */
+
+static INSTRUCTION *
+make_braced_statements(INSTRUCTION *lbrace, INSTRUCTION *stmts, INSTRUCTION *rbrace)
+{
+	INSTRUCTION *ip;
+
+	if (stmts == NULL)
+		ip = list_create(instruction(Op_no_op));
+	else
+		ip = stmts;
+
+	if (lbrace != NULL) {
+		INSTRUCTION *comment2 = lbrace->comment;
+		if (comment2 != NULL) {
+			ip = list_prepend(ip, comment2);
+			lbrace->comment = NULL;
+		}
+		ip = list_prepend(ip, lbrace);
+	}
+
+	return ip;
+}
+
+/* validate_qualified_name --- make sure that a qualified name is built correctly */
+
+/*
+ * This routine returns upon first error, no need to produce multiple, possibly
+ * conflicting / confusing error messages.
+ */
+
+bool
+validate_qualified_name(char *token)
+{
+	char *cp, *cp2;
+
+	// no colon, by definition it's well formed
+	if ((cp = strchr(token, ':')) == NULL)
+		return true;
+
+	if (do_traditional || do_posix) {
+		error_ln(sourceline, _("identifier %s: qualified names not allowed in traditional / POSIX mode"), token);
+		return false;
+	}
+
+	if (cp[1] != ':') {	// could happen from command line
+		error_ln(sourceline, _("identifier %s: namespace separator is two colons, not one"), token);
+		return false;
+	}
+
+	if (! is_letter(cp[2])) {
+		error_ln(sourceline,
+				_("qualified identifier `%s' is badly formed"),
+				token);
+		return false;
+	}
+
+	if ((cp2 = strchr(cp+2, ':')) != NULL) {
+		error_ln(sourceline,
+			_("identifier `%s': namespace separator can only appear once in a qualified name"),
+			token);
+		return false;
+	}
+
+	return true;
+}
+
+/* check_qualified_special --- decide if a name is special or not */
+
+static int
+check_qualified_special(char *token)
+{
+	char *cp;
+
+	if ((cp = strchr(token, ':')) == NULL && current_namespace == awk_namespace)
+		return check_special(token);
+
+	/*
+	 * Now it's more complicated.  Here are the rules.
+	 *
+	 * 1. Namespace name cannot be a standard awk reserved word or function.
+	 * 2. Subordinate part of the name cannot be standard awk reserved word or function.
+	 * 3. If namespace part is explicitly "awk", return result of check_special().
+	 * 4. Else return -1 (gawk extensions allowed, we check standard awk in step 2).
+	 */
+
+	const struct token *tok;
+	int i;
+	if (cp == NULL) {	// namespace not awk, but a simple identifier
+		i = check_special(token);
+		if (i < 0)
+			return i;
+
+		tok = & tokentab[i];
+		if ((tok->flags & GAWKX) != 0 && tok->class == LEX_BUILTIN)
+			return -1;
+		else
+			return i;
+	}
+
+	char *ns, *end, *subname;
+	ns = token;
+	*(end = cp) = '\0';	// temporarily turn it into standalone string
+	subname = end + 2;
+
+	// First check the namespace part
+	i = check_special(ns);
+	if (i >= 0 && (tokentab[i].flags & GAWKX) == 0) {
+		error_ln(sourceline, _("using reserved identifier `%s' as a namespace is not allowed"), ns);
+		goto done;
+	}
+
+	// Now check the subordinate part
+	i = check_special(subname);
+	if (i >= 0 && (tokentab[i].flags & GAWKX) == 0 && strcmp(ns, "awk") != 0) {
+		error_ln(sourceline, _("using reserved identifier `%s' as second component of a qualified name is not allowed"), subname);
+		goto done;
+	}
+
+	if (strcmp(ns, "awk") == 0) {
+		i = check_special(subname);
+		if (i >= 0) {
+			if ((tokentab[i].flags & GAWKX) != 0 && tokentab[i].class == LEX_BUILTIN)
+				;	// gawk additional builtin function, is ok
+			else
+				error_ln(sourceline, _("using reserved identifier `%s' as second component of a qualified name is not allowed"), subname);
+		}
+	} else
+		i = -1;
+done:
+	*end = ':';
+	return i;
+}
+
+/* set_namespace --- change the current namespace */
+
+static void
+set_namespace(INSTRUCTION *ns, INSTRUCTION *comment)
+{
+	if (ns == NULL)
+		return;
+
+	if (do_traditional || do_posix) {
+		error_ln(ns->source_line, _("@namespace is a gawk extension"));
+		efree(ns->lextok);
+		bcfree(ns);
+		return;
+	}
+
+	if (! is_valid_identifier(ns->lextok)) {
+		error_ln(ns->source_line, _("namespace name `%s' must meet identifier naming rules"), ns->lextok);
+		efree(ns->lextok);
+		bcfree(ns);
+		return;
+	}
+
+	int mid = check_special(ns->lextok);
+
+	if (mid >= 0) {
+		error_ln(ns->source_line, _("using reserved identifier `%s' as a namespace is not allowed"), ns->lextok);
+		efree(ns->lextok);
+		bcfree(ns);
+		return;
+	}
+
+	if (strcmp(ns->lextok, current_namespace) == 0)
+		;	// nothing to do
+	else if (strcmp(ns->lextok, awk_namespace) == 0) {
+		set_current_namespace(awk_namespace);
+	} else {
+		set_current_namespace(estrdup(ns->lextok, strlen(ns->lextok)));
+	}
+	efree(ns->lextok);
+
+	// save info and push on front of list of namespaces seen
+	INSTRUCTION *new_ns = instruction(Op_K_namespace);
+	new_ns->comment = comment;
+	new_ns->ns_name = estrdup(current_namespace, strlen(current_namespace));
+	new_ns->nexti = namespace_chain;
+	namespace_chain = new_ns;
+
+	ns->lextok = NULL;
+	bcfree(ns);
+
+	namespace_changed = true;
+
+	return;
+}
+
+/* qualify_name --- put name into namespace */
+
+static char *
+qualify_name(const char *name, size_t len)
+{
+	if (strchr(name, ':') != NULL)	// already qualified
+		return estrdup(name, len);
+
+	NODE *p = lookup(name);
+	if (p != NULL && p->type == Node_param_list)
+		return estrdup(name, len);
+
+	if (current_namespace != awk_namespace && ! is_all_upper(name)) {
+		size_t length = strlen(current_namespace) + 2 + len + 1;
+		char *buf;
+
+		emalloc(buf, char *, length, "qualify_name");
+		sprintf(buf, "%s::%s", current_namespace, name);
+
+		return buf;
+	}
+
+	return estrdup(name, len);
+}
diff --git a/gawk-5.0.1/awkgram.y b/gawk-5.0.1/awkgram.y
new file mode 100644
index 00000000000..3cbcfd31dc5
--- /dev/null
+++ b/gawk-5.0.1/awkgram.y
@@ -0,0 +1,6868 @@
+/*
+ * awkgram.y --- yacc/bison parser
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2019 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+%{
+#ifdef GAWKDEBUG
+#define YYDEBUG 12
+#endif
+
+#include "awk.h"
+
+#if defined(__STDC__) && __STDC__ < 1	/* VMS weirdness, maybe elsewhere */
+#define signed /**/
+#endif
+
+static void yyerror(const char *m, ...) ATTRIBUTE_PRINTF_1;
+static void error_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
+static void lintwarn_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
+static void warning_ln(int line, const char *m, ...) ATTRIBUTE_PRINTF_2;
+static char *get_src_buf(void);
+static int yylex(void);
+int	yyparse(void);
+static INSTRUCTION *snode(INSTRUCTION *subn, INSTRUCTION *op);
+static char **check_params(char *fname, int pcount, INSTRUCTION *list);
+static int install_function(char *fname, INSTRUCTION *fi, INSTRUCTION *plist);
+static NODE *mk_rexp(INSTRUCTION *exp);
+static void param_sanity(INSTRUCTION *arglist);
+static int parms_shadow(INSTRUCTION *pc, bool *shadow);
+#ifndef NO_LINT
+static int isnoeffect(OPCODE type);
+#endif
+static INSTRUCTION *make_assignable(INSTRUCTION *ip);
+static void dumpintlstr(const char *str, size_t len);
+static void dumpintlstr2(const char *str1, size_t len1, const char *str2, size_t len2);
+static bool include_source(INSTRUCTION *file, void **srcfile_p);
+static bool load_library(INSTRUCTION *file, void **srcfile_p);
+static void set_namespace(INSTRUCTION *ns, INSTRUCTION *comment);
+static void next_sourcefile(void);
+static char *tokexpand(void);
+static NODE *set_profile_text(NODE *n, const char *str, size_t len);
+static int check_qualified_special(char *token);
+static char *qualify_name(const char *name, size_t len);
+static INSTRUCTION *trailing_comment;
+static INSTRUCTION *outer_comment;
+static INSTRUCTION *interblock_comment;
+static INSTRUCTION *pending_comment;
+static INSTRUCTION *namespace_chain;
+
+#ifdef DEBUG_COMMENTS
+static void
+debug_print_comment_s(const char *name, INSTRUCTION *comment, int line)
+{
+	if (comment != NULL)
+		fprintf(stderr, "%d: %s: <%.*s>\n", line, name,
+				(int) (comment->memory->stlen - 1),
+				comment->memory->stptr);
+}
+#define debug_print_comment(comment) \
+	 debug_print_comment_s(# comment, comment, __LINE__)
+#endif
+
+#define instruction(t)	bcalloc(t, 1, 0)
+
+static INSTRUCTION *mk_program(void);
+static INSTRUCTION *append_rule(INSTRUCTION *pattern, INSTRUCTION *action);
+static INSTRUCTION *mk_function(INSTRUCTION *fi, INSTRUCTION *def);
+static INSTRUCTION *mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, INSTRUCTION *true_branch,
+		INSTRUCTION *elsep,	INSTRUCTION *false_branch);
+static INSTRUCTION *mk_expression_list(INSTRUCTION *list, INSTRUCTION *s1);
+static INSTRUCTION *mk_for_loop(INSTRUCTION *forp, INSTRUCTION *init, INSTRUCTION *cond,
+		INSTRUCTION *incr, INSTRUCTION *body);
+static void fix_break_continue(INSTRUCTION *list, INSTRUCTION *b_target, INSTRUCTION *c_target);
+static INSTRUCTION *mk_binary(INSTRUCTION *s1, INSTRUCTION *s2, INSTRUCTION *op);
+static INSTRUCTION *mk_boolean(INSTRUCTION *left, INSTRUCTION *right, INSTRUCTION *op);
+static INSTRUCTION *mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, INSTRUCTION *op);
+static INSTRUCTION *mk_getline(INSTRUCTION *op, INSTRUCTION *opt_var, INSTRUCTION *redir, int redirtype);
+static int count_expressions(INSTRUCTION **list, bool isarg);
+static INSTRUCTION *optimize_assignment(INSTRUCTION *exp);
+static void add_lint(INSTRUCTION *list, LINTTYPE linttype);
+
+enum defref { FUNC_DEFINE, FUNC_USE, FUNC_EXT };
+static void func_use(const char *name, enum defref how);
+static void check_funcs(void);
+
+static ssize_t read_one_line(int fd, void *buffer, size_t count);
+static int one_line_close(int fd);
+static void merge_comments(INSTRUCTION *c1, INSTRUCTION *c2);
+static INSTRUCTION *make_braced_statements(INSTRUCTION *lbrace, INSTRUCTION *stmts, INSTRUCTION *rbrace);
+static void add_sign_to_num(NODE *n, char sign);
+
+static bool at_seen = false;
+static bool want_source = false;
+static bool want_regexp = false;	/* lexical scanning kludge */
+static enum {
+	FUNC_HEADER,
+	FUNC_BODY,
+	DONT_CHECK
+} want_param_names = DONT_CHECK;	/* ditto */
+static bool in_function;		/* parsing kludge */
+static int rule = 0;
+
+const char *const ruletab[] = {
+	"?",
+	"BEGIN",
+	"Rule",
+	"END",
+	"BEGINFILE",
+	"ENDFILE",
+};
+
+static bool in_print = false;	/* lexical scanning kludge for print */
+static int in_parens = 0;	/* lexical scanning kludge for print */
+static int sub_counter = 0;	/* array dimension counter for use in delete */
+static char *lexptr;		/* pointer to next char during parsing */
+static char *lexend;		/* end of buffer */
+static char *lexptr_begin;	/* keep track of where we were for error msgs */
+static char *lexeme;		/* beginning of lexeme for debugging */
+static bool lexeof;		/* seen EOF for current source? */
+static char *thisline = NULL;
+static int in_braces = 0;	/* count braces for firstline, lastline in an 'action' */
+static int lastline = 0;
+static int firstline = 0;
+static SRCFILE *sourcefile = NULL;	/* current program source */
+static int lasttok = 0;
+static bool eof_warned = false;	/* GLOBAL: want warning for each file */
+static int break_allowed;	/* kludge for break */
+static int continue_allowed;	/* kludge for continue */
+
+#define END_FILE	-1000
+#define END_SRC  	-2000
+
+#define YYDEBUG_LEXER_TEXT (lexeme)
+static char *tokstart = NULL;
+static char *tok = NULL;
+static char *tokend;
+int errcount = 0;
+
+extern char *source;
+extern int sourceline;
+extern SRCFILE *srcfiles;
+extern INSTRUCTION *rule_list;
+extern int max_args;
+extern NODE **args_array;
+
+const char awk_namespace[] = "awk";
+const char *current_namespace = awk_namespace;
+bool namespace_changed = false;
+
+static INSTRUCTION *rule_block[sizeof(ruletab)];
+
+static INSTRUCTION *ip_rec;
+static INSTRUCTION *ip_newfile;
+static INSTRUCTION *ip_atexit = NULL;
+static INSTRUCTION *ip_end;
+static INSTRUCTION *ip_endfile;
+static INSTRUCTION *ip_beginfile;
+INSTRUCTION *main_beginfile;
+static bool called_from_eval = false;
+
+static inline INSTRUCTION *list_create(INSTRUCTION *x);
+static inline INSTRUCTION *list_append(INSTRUCTION *l, INSTRUCTION *x);
+static inline INSTRUCTION *list_prepend(INSTRUCTION *l, INSTRUCTION *x);
+static inline INSTRUCTION *list_merge(INSTRUCTION *l1, INSTRUCTION *l2);
+
+extern double fmod(double x, double y);
+
+#define YYSTYPE INSTRUCTION *
+%}
+
+%token FUNC_CALL NAME REGEXP FILENAME
+%token YNUMBER YSTRING TYPED_REGEXP
+%token RELOP IO_OUT IO_IN
+%token ASSIGNOP ASSIGN MATCHOP CONCAT_OP
+%token SUBSCRIPT
+%token LEX_BEGIN LEX_END LEX_IF LEX_ELSE LEX_RETURN LEX_DELETE
+%token LEX_SWITCH LEX_CASE LEX_DEFAULT LEX_WHILE LEX_DO LEX_FOR LEX_BREAK LEX_CONTINUE
+%token LEX_PRINT LEX_PRINTF LEX_NEXT LEX_EXIT LEX_FUNCTION
+%token LEX_BEGINFILE LEX_ENDFILE
+%token LEX_GETLINE LEX_NEXTFILE
+%token LEX_IN
+%token LEX_AND LEX_OR INCREMENT DECREMENT
+%token LEX_BUILTIN LEX_LENGTH
+%token LEX_EOF
+%token LEX_INCLUDE LEX_EVAL LEX_LOAD LEX_NAMESPACE
+%token NEWLINE
+
+/* Lowest to highest */
+%right ASSIGNOP ASSIGN SLASH_BEFORE_EQUAL
+%right '?' ':'
+%left LEX_OR
+%left LEX_AND
+%left LEX_GETLINE
+%nonassoc LEX_IN
+%left FUNC_CALL LEX_BUILTIN LEX_LENGTH
+%nonassoc ','
+%left MATCHOP
+%nonassoc RELOP '<' '>' IO_IN IO_OUT
+%left CONCAT_OP
+%left YSTRING YNUMBER TYPED_REGEXP
+%left '+' '-'
+%left '*' '/' '%'
+%right '!' UNARY
+%right '^'
+%left INCREMENT DECREMENT
+%left '$'
+%left '(' ')'
+%%
+
+program
+	: /* empty */
+	  { $$ = NULL; }
+	| program rule
+	  {
+		rule = 0;
+		yyerrok;
+	  }
+	| program nls
+	  {
+		if ($2 != NULL) {
+			if ($1 == NULL)
+				outer_comment = $2;
+			else
+				interblock_comment = $2;
+		}
+		$$ = $1;
+	  }
+	| program LEX_EOF
+	  {
+		next_sourcefile();
+	  }
+	| program error
+	  {
+		rule = 0;
+		/*
+		 * If errors, give up, don't produce an infinite
+		 * stream of syntax error messages.
+		 */
+  		/* yyerrok; */
+	  }
+	;
+
+rule
+	: pattern action
+	  {
+		(void) append_rule($1, $2);
+		if (pending_comment != NULL) {
+			interblock_comment = pending_comment;
+			pending_comment = NULL;
+		}
+	  }
+	| pattern statement_term
+	  {
+		if (rule != Rule) {
+			msg(_("%s blocks must have an action part"), ruletab[rule]);
+			errcount++;
+		} else if ($1 == NULL) {
+			msg(_("each rule must have a pattern or an action part"));
+			errcount++;
+		} else {	/* pattern rule with non-empty pattern */
+			if ($2 != NULL)
+				list_append($1, $2);
+			(void) append_rule($1, NULL);
+		}
+	  }
+	| function_prologue action
+	  {
+		in_function = false;
+		(void) mk_function($1, $2);
+		want_param_names = DONT_CHECK;
+		if (pending_comment != NULL) {
+			interblock_comment = pending_comment;
+			pending_comment = NULL;
+		}
+		yyerrok;
+	  }
+	| '@' LEX_INCLUDE source statement_term
+	  {
+		want_source = false;
+		at_seen = false;
+		if ($3 != NULL && $4 != NULL) {
+			SRCFILE *s = (SRCFILE *) $3;
+			s->comment = $4;
+		}
+		yyerrok;
+	  }
+	| '@' LEX_LOAD library statement_term
+	  {
+		want_source = false;
+		at_seen = false;
+		if ($3 != NULL && $4 != NULL) {
+			SRCFILE *s = (SRCFILE *) $3;
+			s->comment = $4;
+		}
+		yyerrok;
+	  }
+	| '@' LEX_NAMESPACE namespace statement_term
+	  {
+		want_source = false;
+		at_seen = false;
+
+		// this frees $3 storage in all cases
+		set_namespace($3, $4);
+
+		yyerrok;
+	  }
+	;
+
+source
+	: FILENAME
+	  {
+		void *srcfile = NULL;
+
+		if (! include_source($1, & srcfile))
+			YYABORT;
+		efree($1->lextok);
+		bcfree($1);
+		$$ = (INSTRUCTION *) srcfile;
+	  }
+	| FILENAME error
+	  { $$ = NULL; }
+	| error
+	  { $$ = NULL; }
+	;
+
+library
+	: FILENAME
+	  {
+		void *srcfile;
+
+		if (! load_library($1, & srcfile))
+			YYABORT;
+		efree($1->lextok);
+		bcfree($1);
+		$$ = (INSTRUCTION *) srcfile;
+	  }
+	| FILENAME error
+	  { $$ = NULL; }
+	| error
+	  { $$ = NULL; }
+	;
+
+namespace
+	: FILENAME
+	  { $$ = $1; }
+	| FILENAME error
+	  { $$ = NULL; }
+	| error
+	  { $$ = NULL; }
+	;
+
+pattern
+	: /* empty */
+	  {
+		rule = Rule;
+		$$ = NULL;
+	  }
+	| exp
+	  {
+		rule = Rule;
+	  }
+
+	| exp comma exp
+	  {
+		INSTRUCTION *tp;
+
+		add_lint($1, LINT_assign_in_cond);
+		add_lint($3, LINT_assign_in_cond);
+
+		tp = instruction(Op_no_op);
+		list_prepend($1, bcalloc(Op_line_range, !!do_pretty_print + 1, 0));
+		$1->nexti->triggered = false;
+		$1->nexti->target_jmp = $3->nexti;
+
+		list_append($1, instruction(Op_cond_pair));
+		$1->lasti->line_range = $1->nexti;
+		$1->lasti->target_jmp = tp;
+
+		list_append($3, instruction(Op_cond_pair));
+		$3->lasti->line_range = $1->nexti;
+		$3->lasti->target_jmp = tp;
+		if (do_pretty_print) {
+			($1->nexti + 1)->condpair_left = $1->lasti;
+			($1->nexti + 1)->condpair_right = $3->lasti;
+		}
+		/* Put any comments in front of the range expression */
+		if ($2 != NULL)
+			$$ = list_append(list_merge(list_prepend($1, $2), $3), tp);
+		else
+			$$ = list_append(list_merge($1, $3), tp);
+		rule = Rule;
+	  }
+	| LEX_BEGIN
+	  {
+		static int begin_seen = 0;
+
+		if (do_lint_old && ++begin_seen == 2)
+			warning_ln($1->source_line,
+				_("old awk does not support multiple `BEGIN' or `END' rules"));
+
+		$1->in_rule = rule = BEGIN;
+		$1->source_file = source;
+		$$ = $1;
+	  }
+	| LEX_END
+	  {
+		static int end_seen = 0;
+
+		if (do_lint_old && ++end_seen == 2)
+			warning_ln($1->source_line,
+				_("old awk does not support multiple `BEGIN' or `END' rules"));
+
+		$1->in_rule = rule = END;
+		$1->source_file = source;
+		$$ = $1;
+	  }
+	| LEX_BEGINFILE
+	  {
+		$1->in_rule = rule = BEGINFILE;
+		$1->source_file = source;
+		$$ = $1;
+	  }
+	| LEX_ENDFILE
+	  {
+		$1->in_rule = rule = ENDFILE;
+		$1->source_file = source;
+		$$ = $1;
+	  }
+	;
+
+action
+	: l_brace statements r_brace opt_semi opt_nls
+	  {
+		INSTRUCTION *ip = make_braced_statements($1, $2, $3);
+
+		if ($3 != NULL && $5 != NULL) {
+			merge_comments($3, $5);
+			pending_comment = $3;
+		} else if ($3 != NULL) {
+			pending_comment = $3;
+		} else if ($5 != NULL) {
+			pending_comment = $5;
+		}
+
+		$$ = ip;
+	  }
+	;
+
+func_name
+	: NAME
+	| FUNC_CALL
+	  {
+		const char *name = $1->lextok;
+		char *qname = qualify_name(name, strlen(name));
+
+		if (qname != name) {
+			efree((void *)name);
+			$1->lextok = qname;
+		}
+		$$ = $1;
+	  }
+	| lex_builtin
+	  {
+		yyerror(_("`%s' is a built-in function, it cannot be redefined"),
+					tokstart);
+		YYABORT;
+	  }
+	| '@' LEX_EVAL
+	  {
+		$$ = $2;
+		at_seen = false;
+	  }
+	;
+
+lex_builtin
+	: LEX_BUILTIN
+	| LEX_LENGTH
+	;
+
+function_prologue
+	: LEX_FUNCTION func_name '(' { want_param_names = FUNC_HEADER; } opt_param_list r_paren opt_nls
+	  {
+		INSTRUCTION *func_comment = NULL;
+		// Merge any comments found in the parameter list with those
+		// following the function header, associate the whole shebang
+		// with the function as one block comment.
+		if ($5 != NULL && $5->comment != NULL) {
+			if ($7 != NULL) {
+				merge_comments($5->comment, $7);
+			}
+			func_comment = $5->comment;
+		} else if ($7 != NULL) {
+			func_comment = $7;
+		}
+
+		$1->source_file = source;
+		$1->comment = func_comment;
+		if (install_function($2->lextok, $1, $5) < 0)
+			YYABORT;
+		in_function = true;
+		$2->lextok = NULL;
+		bcfree($2);
+		/* $5 already free'd in install_function */
+		$$ = $1;
+		want_param_names = FUNC_BODY;
+	  }
+	;
+
+regexp
+	/*
+	 * In this rule, want_regexp tells yylex that the next thing
+	 * is a regexp so it should read up to the closing slash.
+	 */
+	: a_slash
+		{ want_regexp = true; }
+	  REGEXP	/* The terminating '/' is consumed by yylex(). */
+		{
+		  NODE *n, *exp;
+		  char *re;
+		  size_t len;
+
+		  re = $3->lextok;
+		  $3->lextok = NULL;
+		  len = strlen(re);
+		  if (do_lint) {
+			if (len == 0)
+				lintwarn_ln($3->source_line,
+					_("regexp constant `//' looks like a C++ comment, but is not"));
+			else if (re[0] == '*' && re[len-1] == '*')
+				/* possible C comment */
+				lintwarn_ln($3->source_line,
+					_("regexp constant `/%s/' looks like a C comment, but is not"), re);
+		  }
+
+		  exp = make_str_node(re, len, ALREADY_MALLOCED);
+		  n = make_regnode(Node_regex, exp);
+		  if (n == NULL) {
+			unref(exp);
+			YYABORT;
+		  }
+		  $$ = $3;
+		  $$->opcode = Op_match_rec;
+		  $$->memory = n;
+		}
+	;
+
+typed_regexp
+	: TYPED_REGEXP
+		{
+		  char *re;
+		  size_t len;
+
+		  re = $1->lextok;
+		  $1->lextok = NULL;
+		  len = strlen(re);
+
+		  $$ = $1;
+		  $$->opcode = Op_push_re;
+		  $$->memory = make_typed_regex(re, len);
+		}
+
+a_slash
+	: '/'
+	  { bcfree($1); }
+	| SLASH_BEFORE_EQUAL
+	;
+
+statements
+	: /* empty */
+	  { $$ = NULL; }
+	| statements statement
+	  {
+		if ($2 == NULL) {
+			$$ = $1;
+		} else {
+			add_lint($2, LINT_no_effect);
+			if ($1 == NULL) {
+				$$ = $2;
+			} else {
+				$$ = list_merge($1, $2);
+			}
+		}
+
+		if (trailing_comment != NULL) {
+			$$ = list_append($$, trailing_comment);
+			trailing_comment = NULL;
+		}
+
+		yyerrok;
+	  }
+	| statements error
+	  {	$$ = NULL; }
+	;
+
+statement_term
+	: nls		{ $$ = $1; }
+	| semi opt_nls	{ $$ = $2; }
+	;
+
+statement
+	: semi opt_nls
+	  {
+		if ($2 != NULL) {
+			INSTRUCTION *ip;
+
+			merge_comments($2, NULL);
+			ip = list_create(instruction(Op_no_op));
+			$$ = list_append(ip, $2); 
+		} else
+			$$ = NULL;
+	  }
+	| l_brace statements r_brace
+	  {
+		trailing_comment = $3;	// NULL or comment
+		$$ = make_braced_statements($1, $2, $3);
+	  }
+	| if_statement
+	  {
+		if (do_pretty_print)
+			$$ = list_prepend($1, instruction(Op_exec_count));
+		else
+			$$ = $1;
+ 	  }
+	| LEX_SWITCH '(' exp r_paren opt_nls l_brace case_statements opt_nls r_brace
+	  {
+		INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
+		INSTRUCTION *ip, *nextc, *tbreak;
+		const char **case_values = NULL;
+		int maxcount = 128;
+		int case_count = 0;
+		int i;
+
+		tbreak = instruction(Op_no_op);
+		cstmt = list_create(tbreak);
+		cexp = list_create(instruction(Op_pop));
+		dflt = instruction(Op_jmp);
+		dflt->target_jmp = tbreak;	/* if no case match and no explicit default */
+
+		if ($7 != NULL) {
+			curr = $7->nexti;
+			bcfree($7);	/* Op_list */
+		}
+		/*  else
+			curr = NULL; */
+
+		for (; curr != NULL; curr = nextc) {
+			INSTRUCTION *caseexp = curr->case_exp;
+			INSTRUCTION *casestmt = curr->case_stmt;
+
+			nextc = curr->nexti;
+			if (curr->opcode == Op_K_case) {
+				if (caseexp->opcode == Op_push_i) {
+					/* a constant scalar */
+					char *caseval;
+					caseval = force_string(caseexp->memory)->stptr;
+					for (i = 0; i < case_count; i++) {
+						if (strcmp(caseval, case_values[i]) == 0)
+							error_ln(curr->source_line,
+								_("duplicate case values in switch body: %s"), caseval);
+					}
+
+					if (case_values == NULL)
+						emalloc(case_values, const char **, sizeof(char *) * maxcount, "statement");
+					else if (case_count >= maxcount) {
+						maxcount += 128;
+						erealloc(case_values, const char **, sizeof(char*) * maxcount, "statement");
+					}
+					case_values[case_count++] = caseval;
+				} else {
+					/* match a constant regex against switch expression. */
+					(curr + 1)->match_exp = true;
+				}
+				curr->stmt_start = casestmt->nexti;
+				curr->stmt_end	= casestmt->lasti;
+				(void) list_prepend(cexp, curr);
+				(void) list_prepend(cexp, caseexp);
+			} else {
+				if (dflt->target_jmp != tbreak)
+					error_ln(curr->source_line,
+						_("duplicate `default' detected in switch body"));
+				else
+					dflt->target_jmp = casestmt->nexti;
+
+				if (do_pretty_print) {
+					curr->stmt_start = casestmt->nexti;
+					curr->stmt_end = casestmt->lasti;
+					(void) list_prepend(cexp, curr);
+				} else
+					bcfree(curr);
+			}
+
+			cstmt = list_merge(casestmt, cstmt);
+		}
+
+		if (case_values != NULL)
+			efree(case_values);
+
+		ip = $3;
+		if (do_pretty_print) {
+			// first merge comments
+			INSTRUCTION *head_comment = NULL;
+
+			if ($5 != NULL && $6 != NULL) {
+				merge_comments($5, $6);
+				head_comment = $5;
+			} else if ($5 != NULL)
+				head_comment = $5;
+			else
+				head_comment = $6;
+
+			$1->comment = head_comment;
+
+			(void) list_prepend(ip, $1);
+			(void) list_prepend(ip, instruction(Op_exec_count));
+			$1->target_break = tbreak;
+			($1 + 1)->switch_start = cexp->nexti;
+			($1 + 1)->switch_end = cexp->lasti;
+			($1 + 1)->switch_end->comment = $9;
+		}
+		/* else
+			$1 is NULL */
+
+		(void) list_append(cexp, dflt);
+		(void) list_merge(ip, cexp);
+		if ($8 != NULL)
+			(void) list_append(cstmt, $8);
+		$$ = list_merge(ip, cstmt);
+
+		break_allowed--;
+		fix_break_continue(ip, tbreak, NULL);
+	  }
+	| LEX_WHILE '(' exp r_paren opt_nls statement
+	  {
+		/*
+		 *    -----------------
+		 * tc:
+		 *         cond
+		 *    -----------------
+		 *    [Op_jmp_false tb   ]
+		 *    -----------------
+		 *         body
+		 *    -----------------
+		 *    [Op_jmp      tc    ]
+		 * tb:[Op_no_op          ]
+		 */
+
+		INSTRUCTION *ip, *tbreak, *tcont;
+
+		tbreak = instruction(Op_no_op);
+		add_lint($3, LINT_assign_in_cond);
+		tcont = $3->nexti;
+		ip = list_append($3, instruction(Op_jmp_false));
+		ip->lasti->target_jmp = tbreak;
+
+		if (do_pretty_print) {
+			(void) list_append(ip, instruction(Op_exec_count));
+			$1->target_break = tbreak;
+			$1->target_continue = tcont;
+			($1 + 1)->while_body = ip->lasti;
+			(void) list_prepend(ip, $1);
+		}
+		/* else
+			$1 is NULL */
+
+		if ($5 != NULL) {
+			if ($6 == NULL)
+				$6 = list_create(instruction(Op_no_op));
+
+			$5->memory->comment_type = BLOCK_COMMENT;
+			$6 = list_prepend($6, $5);
+		}
+
+		if ($6 != NULL)
+			(void) list_merge(ip, $6);
+		(void) list_append(ip, instruction(Op_jmp));
+		ip->lasti->target_jmp = tcont;
+		$$ = list_append(ip, tbreak);
+
+		break_allowed--;
+		continue_allowed--;
+		fix_break_continue(ip, tbreak, tcont);
+	  }
+	| LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls
+	  {
+		/*
+		 *    -----------------
+		 * z:
+		 *         body
+		 *    -----------------
+		 * tc:
+		 *         cond
+		 *    -----------------
+		 *    [Op_jmp_true | z  ]
+		 * tb:[Op_no_op         ]
+		 */
+
+		INSTRUCTION *ip, *tbreak, *tcont;
+
+		tbreak = instruction(Op_no_op);
+		tcont = $6->nexti;
+		add_lint($6, LINT_assign_in_cond);
+		if ($3 != NULL)
+			ip = list_merge($3, $6);
+		else
+			ip = list_prepend($6, instruction(Op_no_op));
+
+		if ($2 != NULL)
+			(void) list_prepend(ip, $2);
+
+		if (do_pretty_print)
+			(void) list_prepend(ip, instruction(Op_exec_count));
+
+		(void) list_append(ip, instruction(Op_jmp_true));
+		ip->lasti->target_jmp = ip->nexti;
+		$$ = list_append(ip, tbreak);
+
+		break_allowed--;
+		continue_allowed--;
+		fix_break_continue(ip, tbreak, tcont);
+
+		if (do_pretty_print) {
+			$1->target_break = tbreak;
+			$1->target_continue = tcont;
+			($1 + 1)->doloop_cond = tcont;
+			$$ = list_prepend(ip, $1);
+			bcfree($4);
+			if ($8 != NULL)
+				$1->comment = $8;
+		}
+		/* else
+			$1 and $4 are NULLs */
+	  }
+	| LEX_FOR '(' NAME LEX_IN simple_variable r_paren opt_nls statement
+	  {
+		INSTRUCTION *ip;
+		char *var_name = $3->lextok;
+
+		if ($8 != NULL
+				&& $8->lasti->opcode == Op_K_delete
+				&& $8->lasti->expr_count == 1
+				&& $8->nexti->opcode == Op_push
+				&& ($8->nexti->memory->type != Node_var || !($8->nexti->memory->var_update))
+				&& strcmp($8->nexti->memory->vname, var_name) == 0
+		) {
+
+		/*
+		 * Efficiency hack.  Recognize the special case of
+		 *
+		 * 	for (iggy in foo)
+		 * 		delete foo[iggy]
+		 *
+		 * and treat it as if it were
+		 *
+		 * 	delete foo
+		 *
+		 * Check that the body is a `delete a[i]' statement,
+		 * and that both the loop var and array names match.
+		 */
+			NODE *arr = NULL;
+
+			ip = $8->nexti->nexti;
+			if ($5->nexti->opcode == Op_push && $5->lasti == $5->nexti)
+				arr = $5->nexti->memory;
+			if (arr != NULL
+					&& ip->opcode == Op_no_op
+					&& ip->nexti->opcode == Op_push_array
+					&& strcmp(ip->nexti->memory->vname, arr->vname) == 0
+					&& ip->nexti->nexti == $8->lasti
+			) {
+				(void) make_assignable($8->nexti);
+				$8->lasti->opcode = Op_K_delete_loop;
+				$8->lasti->expr_count = 0;
+				if ($1 != NULL)
+					bcfree($1);
+				efree(var_name);
+				bcfree($3);
+				bcfree($4);
+				bcfree($5);
+				if ($7 != NULL) {
+					merge_comments($7, NULL);
+					$8 = list_prepend($8, $7);
+				}
+				$$ = $8;
+			} else
+				goto regular_loop;
+		} else {
+			INSTRUCTION *tbreak, *tcont;
+
+			/*    [ Op_push_array a       ]
+			 *    [ Op_arrayfor_init | ib ]
+			 * ic:[ Op_arrayfor_incr | ib ]
+			 *    [ Op_var_assign if any  ]
+			 *
+			 *              body
+			 *
+			 *    [Op_jmp | ic            ]
+			 * ib:[Op_arrayfor_final      ]
+			 */
+regular_loop:
+			ip = $5;
+			ip->nexti->opcode = Op_push_array;
+
+			tbreak = instruction(Op_arrayfor_final);
+			$4->opcode = Op_arrayfor_incr;
+			$4->array_var = variable($3->source_line, var_name, Node_var);
+			$4->target_jmp = tbreak;
+			tcont = $4;
+			$3->opcode = Op_arrayfor_init;
+			$3->target_jmp = tbreak;
+			(void) list_append(ip, $3);
+
+			if (do_pretty_print) {
+				$1->opcode = Op_K_arrayfor;
+				$1->target_continue = tcont;
+				$1->target_break = tbreak;
+				(void) list_append(ip, $1);
+			}
+			/* else
+				$1 is NULL */
+
+			/* add update_FOO instruction if necessary */
+			if ($4->array_var->type == Node_var && $4->array_var->var_update) {
+				(void) list_append(ip, instruction(Op_var_update));
+				ip->lasti->update_var = $4->array_var->var_update;
+			}
+			(void) list_append(ip, $4);
+
+			/* add set_FOO instruction if necessary */
+			if ($4->array_var->type == Node_var && $4->array_var->var_assign) {
+				(void) list_append(ip, instruction(Op_var_assign));
+				ip->lasti->assign_var = $4->array_var->var_assign;
+			}
+
+			if (do_pretty_print) {
+				(void) list_append(ip, instruction(Op_exec_count));
+				($1 + 1)->forloop_cond = $4;
+				($1 + 1)->forloop_body = ip->lasti;
+			}
+
+			if ($7 != NULL)
+				merge_comments($7, NULL);
+
+			if ($8 != NULL) {
+				if ($7 != NULL)
+					$8 = list_prepend($8, $7);
+				(void) list_merge(ip, $8);
+			} else if ($7 != NULL)
+				(void) list_append(ip, $7);
+
+			(void) list_append(ip, instruction(Op_jmp));
+			ip->lasti->target_jmp = $4;
+			$$ = list_append(ip, tbreak);
+			fix_break_continue(ip, tbreak, tcont);
+		}
+
+		break_allowed--;
+		continue_allowed--;
+	  }
+	| LEX_FOR '(' opt_simple_stmt semi opt_nls exp semi opt_nls opt_simple_stmt r_paren opt_nls statement
+	  {
+		if ($5 != NULL) {
+			merge_comments($5, NULL);
+			$1->comment = $5;
+		}
+		if ($8 != NULL) {
+			merge_comments($8, NULL);
+			if ($1->comment == NULL) {
+				$8->memory->comment_type = FOR_COMMENT;
+				$1->comment = $8;
+			} else
+				$1->comment->comment = $8;
+		}
+		if ($11 != NULL)
+			$12 = list_prepend($12, $11);
+		$$ = mk_for_loop($1, $3, $6, $9, $12);
+
+		break_allowed--;
+		continue_allowed--;
+	  }
+	| LEX_FOR '(' opt_simple_stmt semi opt_nls semi opt_nls opt_simple_stmt r_paren opt_nls statement
+	  {
+		if ($5 != NULL) {
+			merge_comments($5, NULL);
+			$1->comment = $5;
+		}
+		if ($7 != NULL) {
+			merge_comments($7, NULL);
+			if ($1->comment == NULL) {
+				$7->memory->comment_type = FOR_COMMENT;
+				$1->comment = $7;
+			} else
+				$1->comment->comment = $7;
+		}
+		if ($10 != NULL)
+			$11 = list_prepend($11, $10);
+		$$ = mk_for_loop($1, $3, (INSTRUCTION *) NULL, $8, $11);
+
+		break_allowed--;
+		continue_allowed--;
+	  }
+	| non_compound_stmt
+	  {
+		if (do_pretty_print)
+			$$ = list_prepend($1, instruction(Op_exec_count));
+		else
+			$$ = $1;
+	  }
+	;
+
+non_compound_stmt
+	: LEX_BREAK statement_term
+	  {
+		if (! break_allowed)
+			error_ln($1->source_line,
+				_("`break' is not allowed outside a loop or switch"));
+		$1->target_jmp = NULL;
+		$$ = list_create($1);
+		if ($2 != NULL)
+			$$ = list_append($$, $2);
+	  }
+	| LEX_CONTINUE statement_term
+	  {
+		if (! continue_allowed)
+			error_ln($1->source_line,
+				_("`continue' is not allowed outside a loop"));
+		$1->target_jmp = NULL;
+		$$ = list_create($1);
+		if ($2 != NULL)
+			$$ = list_append($$, $2);
+	  }
+	| LEX_NEXT statement_term
+	  {
+		/* if inside function (rule = 0), resolve context at run-time */
+		if (rule && rule != Rule)
+			error_ln($1->source_line,
+				_("`next' used in %s action"), ruletab[rule]);
+		$1->target_jmp = ip_rec;
+		$$ = list_create($1);
+		if ($2 != NULL)
+			$$ = list_append($$, $2);
+	  }
+	| LEX_NEXTFILE statement_term
+	  {
+		/* if inside function (rule = 0), resolve context at run-time */
+		if (rule == BEGIN || rule == END || rule == ENDFILE)
+			error_ln($1->source_line,
+				_("`nextfile' used in %s action"), ruletab[rule]);
+
+		$1->target_newfile = ip_newfile;
+		$1->target_endfile = ip_endfile;
+		$$ = list_create($1);
+		if ($2 != NULL)
+			$$ = list_append($$, $2);
+	  }
+	| LEX_EXIT opt_exp statement_term
+	  {
+		/* Initialize the two possible jump targets, the actual target
+		 * is resolved at run-time.
+		 */
+		$1->target_end = ip_end;	/* first instruction in end_block */
+		$1->target_atexit = ip_atexit;	/* cleanup and go home */
+
+		if ($2 == NULL) {
+			$$ = list_create($1);
+			(void) list_prepend($$, instruction(Op_push_i));
+			$$->nexti->memory = dupnode(Nnull_string);
+		} else
+			$$ = list_append($2, $1);
+		if ($3 != NULL)
+			$$ = list_append($$, $3);
+	  }
+	| LEX_RETURN
+	  {
+		if (! in_function)
+			yyerror(_("`return' used outside function context"));
+	  } opt_exp statement_term {
+		if (called_from_eval)
+			$1->opcode = Op_K_return_from_eval;
+
+		if ($3 == NULL) {
+			$$ = list_create($1);
+			(void) list_prepend($$, instruction(Op_push_i));
+			$$->nexti->memory = dupnode(Nnull_string);
+		} else
+			$$ = list_append($3, $1);
+		if ($4 != NULL)
+			$$ = list_append($$, $4);
+	  }
+	| simple_stmt statement_term
+	  {
+		if ($2 != NULL)
+			$$ = list_append($1, $2);
+		else
+			$$ = $1;
+	  }
+	;
+
+	/*
+	 * A simple_stmt exists to satisfy a constraint in the POSIX
+	 * grammar allowing them to occur as the 1st and 3rd parts
+	 * in a `for (...;...;...)' loop.  This is a historical oddity
+	 * inherited from Unix awk, not at all documented in the AK&W
+	 * awk book.  We support it, as this was reported as a bug.
+	 * We don't bother to document it though. So there.
+	 */
+simple_stmt
+	: print { in_print = true; in_parens = 0; } print_expression_list output_redir
+	  {
+		/*
+		 * Optimization: plain `print' has no expression list, so $3 is null.
+		 * If $3 is NULL or is a bytecode list for $0 use Op_K_print_rec,
+		 * which is faster for these two cases.
+		 */
+
+		if (do_optimize && $1->opcode == Op_K_print &&
+			($3 == NULL
+				|| ($3->lasti->opcode == Op_field_spec
+					&& $3->nexti->nexti->nexti == $3->lasti
+					&& $3->nexti->nexti->opcode == Op_push_i
+					&& $3->nexti->nexti->memory->type == Node_val)
+			)
+		) {
+			static bool warned = false;
+			/*   -----------------
+			 *      output_redir
+			 *    [ redirect exp ]
+			 *   -----------------
+			 *     expression_list
+			 *   ------------------
+			 *    [Op_K_print_rec | NULL | redir_type | expr_count]
+			 */
+
+			if ($3 != NULL) {
+				NODE *n = $3->nexti->nexti->memory;
+
+				if (! iszero(n))
+					goto regular_print;
+
+				bcfree($3->lasti);			/* Op_field_spec */
+				unref(n);				/* Node_val */
+				bcfree($3->nexti->nexti);		/* Op_push_i */
+				bcfree($3->nexti);			/* Op_list */
+				bcfree($3);				/* Op_list */
+			} else {
+				if (do_lint && (rule == BEGIN || rule == END) && ! warned) {
+					warned = true;
+					lintwarn_ln($1->source_line,
+		_("plain `print' in BEGIN or END rule should probably be `print \"\"'"));
+				}
+			}
+
+			$1->expr_count = 0;
+			$1->opcode = Op_K_print_rec;
+			if ($4 == NULL) {    /* no redircetion */
+				$1->redir_type = redirect_none;
+				$$ = list_create($1);
+			} else {
+				INSTRUCTION *ip;
+				ip = $4->nexti;
+				$1->redir_type = ip->redir_type;
+				$4->nexti = ip->nexti;
+				bcfree(ip);
+				$$ = list_append($4, $1);
+			}
+		} else {
+			/*   -----------------
+			 *    [ output_redir    ]
+			 *    [ redirect exp    ]
+			 *   -----------------
+			 *    [ expression_list ]
+			 *   ------------------
+			 *    [$1 | NULL | redir_type | expr_count]
+			 *
+			 */
+regular_print:
+			if ($4 == NULL) {		/* no redirection */
+				if ($3 == NULL)	{	/* print/printf without arg */
+					$1->expr_count = 0;
+					if ($1->opcode == Op_K_print)
+						$1->opcode = Op_K_print_rec;
+					$1->redir_type = redirect_none;
+					$$ = list_create($1);
+				} else {
+					INSTRUCTION *t = $3;
+					$1->expr_count = count_expressions(&t, false);
+					$1->redir_type = redirect_none;
+					$$ = list_append(t, $1);
+				}
+			} else {
+				INSTRUCTION *ip;
+				ip = $4->nexti;
+				$1->redir_type = ip->redir_type;
+				$4->nexti = ip->nexti;
+				bcfree(ip);
+				if ($3 == NULL) {
+					$1->expr_count = 0;
+					if ($1->opcode == Op_K_print)
+						$1->opcode = Op_K_print_rec;
+					$$ = list_append($4, $1);
+				} else {
+					INSTRUCTION *t = $3;
+					$1->expr_count = count_expressions(&t, false);
+					$$ = list_append(list_merge($4, t), $1);
+				}
+			}
+		}
+	  }
+
+	| LEX_DELETE NAME { sub_counter = 0; } delete_subscript_list
+	  {
+		char *arr = $2->lextok;
+
+		$2->opcode = Op_push_array;
+		$2->memory = variable($2->source_line, arr, Node_var_new);
+
+		if (! do_posix && ! do_traditional) {
+			if ($2->memory == symbol_table)
+				fatal(_("`delete' is not allowed with SYMTAB"));
+			else if ($2->memory == func_table)
+				fatal(_("`delete' is not allowed with FUNCTAB"));
+		}
+
+		if ($4 == NULL) {
+			/*
+			 * As of September 2012, POSIX has added support
+			 * for `delete array'. See:
+			 * http://austingroupbugs.net/view.php?id=544
+			 *
+			 * Thanks to Nathan Weeks for the initiative.
+			 *
+			 * Thus we no longer warn or check do_posix.
+			 * Also, since BWK awk supports it, we don't have to
+			 * check do_traditional either.
+			 */
+			$1->expr_count = 0;
+			$$ = list_append(list_create($2), $1);
+		} else {
+			$1->expr_count = sub_counter;
+			$$ = list_append(list_append($4, $2), $1);
+		}
+	  }
+	| LEX_DELETE '(' NAME ')'
+		  /*
+		   * this is for tawk compatibility. maybe the warnings
+		   * should always be done.
+		   */
+	  {
+		static bool warned = false;
+		char *arr = $3->lextok;
+
+		if (do_lint && ! warned) {
+			warned = true;
+			lintwarn_ln($1->source_line,
+				_("`delete(array)' is a non-portable tawk extension"));
+		}
+		if (do_traditional) {
+			error_ln($1->source_line,
+				_("`delete(array)' is a non-portable tawk extension"));
+		}
+		$3->memory = variable($3->source_line, arr, Node_var_new);
+		$3->opcode = Op_push_array;
+		$1->expr_count = 0;
+		$$ = list_append(list_create($3), $1);
+
+		if (! do_posix && ! do_traditional) {
+			if ($3->memory == symbol_table)
+				fatal(_("`delete' is not allowed with SYMTAB"));
+			else if ($3->memory == func_table)
+				fatal(_("`delete' is not allowed with FUNCTAB"));
+		}
+	  }
+	| exp
+	  {
+		$$ = optimize_assignment($1);
+	  }
+	;
+
+opt_simple_stmt
+	: /* empty */
+	  { $$ = NULL; }
+	| simple_stmt
+	  { $$ = $1; }
+	;
+
+case_statements
+	: /* empty */
+	  { $$ = NULL; }
+	| case_statements case_statement
+	  {
+		if ($1 == NULL)
+			$$ = list_create($2);
+		else
+			$$ = list_prepend($1, $2);
+	  }
+	| case_statements error
+	  { $$ = NULL; }
+	;
+
+case_statement
+	: LEX_CASE case_value colon opt_nls statements
+	  {
+		INSTRUCTION *casestmt = $5;
+		if ($5 == NULL)
+			casestmt = list_create(instruction(Op_no_op));
+		if (do_pretty_print)
+			(void) list_prepend(casestmt, instruction(Op_exec_count));
+		$1->case_exp = $2;
+		$1->case_stmt = casestmt;
+		$1->comment = $4;
+		bcfree($3);
+		$$ = $1;
+	  }
+	| LEX_DEFAULT colon opt_nls statements
+	  {
+		INSTRUCTION *casestmt = $4;
+		if ($4 == NULL)
+			casestmt = list_create(instruction(Op_no_op));
+		if (do_pretty_print)
+			(void) list_prepend(casestmt, instruction(Op_exec_count));
+		bcfree($2);
+		$1->case_stmt = casestmt;
+		$1->comment = $3;
+		$$ = $1;
+	  }
+	;
+
+case_value
+	: YNUMBER
+	  {	$$ = $1; }
+	| '-' YNUMBER    %prec UNARY
+	  {
+		NODE *n = $2->memory;
+		(void) force_number(n);
+		negate_num(n);
+		bcfree($1);
+		$$ = $2;
+	  }
+	| '+' YNUMBER    %prec UNARY
+	  {
+		NODE *n = $2->lasti->memory;
+		bcfree($1);
+		add_sign_to_num(n, '+');
+		$$ = $2;
+	  }
+	| YSTRING
+	  {	$$ = $1; }
+	| regexp
+	  {
+		if ($1->memory->type == Node_regex)
+			$1->opcode = Op_push_re;
+		else
+			$1->opcode = Op_push;
+		$$ = $1;
+	  }
+	| typed_regexp
+	  {
+		assert(($1->memory->flags & REGEX) == REGEX);
+		$1->opcode = Op_push_re;
+		$$ = $1;
+	  }
+	;
+
+print
+	: LEX_PRINT
+	  { $$ = $1; }
+	| LEX_PRINTF
+	  { $$ = $1; }
+	;
+
+	/*
+	 * Note: ``print(x)'' is already parsed by the first rule,
+	 * so there is no good in covering it by the second one too.
+	 */
+print_expression_list
+	: opt_expression_list
+	| '(' expression_list r_paren
+	  {
+		$$ = $2;
+	  }
+	;
+
+output_redir
+	: /* empty */
+	  {
+		in_print = false;
+		in_parens = 0;
+		$$ = NULL;
+	  }
+	| IO_OUT { in_print = false; in_parens = 0; } common_exp
+	  {
+		if ($1->redir_type == redirect_twoway
+		    	&& $3->lasti->opcode == Op_K_getline_redir
+		   	 	&& $3->lasti->redir_type == redirect_twoway)
+			yyerror(_("multistage two-way pipelines don't work"));
+		if (do_lint && $1->redir_type == redirect_output && $3->lasti->opcode == Op_concat)
+			lintwarn(_("concatenation as I/O `>' redirection target is ambiguous"));
+		$$ = list_prepend($3, $1);
+	  }
+	;
+
+if_statement
+	: LEX_IF '(' exp r_paren opt_nls statement
+	  {
+		if ($5 != NULL)
+			$1->comment = $5;
+		$$ = mk_condition($3, $1, $6, NULL, NULL);
+	  }
+	| LEX_IF '(' exp r_paren opt_nls statement
+	     LEX_ELSE opt_nls statement
+	  {
+		if ($5 != NULL)
+			$1->comment = $5;
+		if ($8 != NULL)
+			$7->comment = $8;
+		$$ = mk_condition($3, $1, $6, $7, $9);
+	  }
+	;
+
+nls
+	: NEWLINE
+	  {
+		$$ = $1;
+	  }
+	| nls NEWLINE
+	  {
+		if ($1 != NULL && $2 != NULL) {
+			if ($1->memory->comment_type == EOL_COMMENT) {
+				assert($2->memory->comment_type == BLOCK_COMMENT);
+				$1->comment = $2;	// chain them
+			} else {
+				merge_comments($1, $2);
+			}
+
+			$$ = $1;
+		} else if ($1 != NULL) {
+			$$ = $1;
+		} else if ($2 != NULL) {
+			$$ = $2;
+		} else
+			$$ = NULL;
+	  }
+	;
+
+opt_nls
+	: /* empty */
+	  { $$ = NULL; }
+	| nls
+	  { $$ = $1; }
+	;
+
+input_redir
+	: /* empty */
+	  { $$ = NULL; }
+	| '<' simp_exp
+	  {
+		bcfree($1);
+		$$ = $2;
+	  }
+	;
+
+opt_param_list
+	: /* empty */
+	  { $$ = NULL; }
+	| param_list
+	  { $$ = $1; }
+	;
+
+param_list
+	: NAME
+	  {
+		$1->param_count = 0;
+		$$ = list_create($1);
+	  }
+	| param_list comma NAME
+	  {
+		if ($1 != NULL && $3 != NULL) {
+			$3->param_count = $1->lasti->param_count + 1;
+			$$ = list_append($1, $3);
+			yyerrok;
+
+			// newlines are allowed after commas, catch any comments
+			if ($2 != NULL) {
+				if ($1->comment != NULL)
+					merge_comments($1->comment, $2);
+				else
+					$1->comment = $2;
+			}
+		} else
+			$$ = NULL;
+	  }
+	| error
+	  { $$ = NULL; }
+	| param_list error
+	  { $$ = $1; }
+	| param_list comma error
+	  { $$ = $1; }
+	;
+
+/* optional expression, as in for loop */
+opt_exp
+	: /* empty */
+	  { $$ = NULL; }
+	| exp
+	  { $$ = $1; }
+	;
+
+opt_expression_list
+	: /* empty */
+	  { $$ = NULL; }
+	| expression_list
+	  { $$ = $1; }
+	;
+
+expression_list
+	: exp
+	  {	$$ = mk_expression_list(NULL, $1); }
+	| expression_list comma exp
+	  {
+		if ($2 != NULL)
+			$1->lasti->comment = $2;
+		$$ = mk_expression_list($1, $3);
+		yyerrok;
+	  }
+	| error
+	  { $$ = NULL; }
+	| expression_list error
+	  {
+		/*
+		 * Returning the expression list instead of NULL lets
+		 * snode get a list of arguments that it can count.
+		 */
+		$$ = $1;
+	  }
+	| expression_list error exp
+	  {
+		/* Ditto */
+		$$ = mk_expression_list($1, $3);
+	  }
+	| expression_list comma error
+	  {
+		/* Ditto */
+		if ($2 != NULL)
+			$1->lasti->comment = $2;
+		$$ = $1;
+	  }
+	;
+
+opt_fcall_expression_list
+	: /* empty */
+	  { $$ = NULL; }
+	| fcall_expression_list
+	  { $$ = $1; }
+	;
+
+fcall_expression_list
+	: fcall_exp
+	  {	$$ = mk_expression_list(NULL, $1); }
+	| fcall_expression_list comma fcall_exp
+	  {
+		if ($2 != NULL)
+			$1->lasti->comment = $2;
+		$$ = mk_expression_list($1, $3);
+		yyerrok;
+	  }
+	| error
+	  { $$ = NULL; }
+	| fcall_expression_list error
+	  {
+		/*
+		 * Returning the expression list instead of NULL lets
+		 * snode get a list of arguments that it can count.
+		 */
+		$$ = $1;
+	  }
+	| fcall_expression_list error fcall_exp
+	  {
+		/* Ditto */
+		$$ = mk_expression_list($1, $3);
+	  }
+	| fcall_expression_list comma error
+	  {
+		/* Ditto */
+		if ($2 != NULL)
+			$1->comment = $2;
+		$$ = $1;
+	  }
+	;
+
+fcall_exp
+	: exp { $$ = $1; }
+	| typed_regexp { $$ = list_create($1); }
+	;
+
+/* Expressions, not including the comma operator.  */
+exp
+	: variable assign_operator exp %prec ASSIGNOP
+	  {
+		if (do_lint && $3->lasti->opcode == Op_match_rec)
+			lintwarn_ln($2->source_line,
+				_("regular expression on right of assignment"));
+		$$ = mk_assignment($1, $3, $2);
+	  }
+	| variable ASSIGN typed_regexp %prec ASSIGNOP
+	  {
+		$$ = mk_assignment($1, list_create($3), $2);
+	  }
+	| exp LEX_AND exp
+	  {	$$ = mk_boolean($1, $3, $2); }
+	| exp LEX_OR exp
+	  {	$$ = mk_boolean($1, $3, $2); }
+	| exp MATCHOP typed_regexp
+	  {
+		if ($1->lasti->opcode == Op_match_rec)
+			warning_ln($2->source_line,
+				_("regular expression on left of `~' or `!~' operator"));
+
+		assert($3->opcode == Op_push_re
+			&& ($3->memory->flags & REGEX) != 0);
+		/* RHS is @/.../ */
+		$2->memory = $3->memory;
+		bcfree($3);
+		$$ = list_append($1, $2);
+	  }
+	| exp MATCHOP exp
+	  {
+		if ($1->lasti->opcode == Op_match_rec)
+			warning_ln($2->source_line,
+				_("regular expression on left of `~' or `!~' operator"));
+
+		if ($3->lasti == $3->nexti && $3->nexti->opcode == Op_match_rec) {
+			/* RHS is /.../ */
+			$2->memory = $3->nexti->memory;
+			bcfree($3->nexti);	/* Op_match_rec */
+			bcfree($3);			/* Op_list */
+			$$ = list_append($1, $2);
+		} else {
+			$2->memory = make_regnode(Node_dynregex, NULL);
+			$$ = list_append(list_merge($1, $3), $2);
+		}
+	  }
+	| exp LEX_IN simple_variable
+	  {
+		if (do_lint_old)
+			warning_ln($2->source_line,
+				_("old awk does not support the keyword `in' except after `for'"));
+		$3->nexti->opcode = Op_push_array;
+		$2->opcode = Op_in_array;
+		$2->expr_count = 1;
+		$$ = list_append(list_merge($1, $3), $2);
+	  }
+	| exp a_relop exp %prec RELOP
+	  {
+		if (do_lint && $3->lasti->opcode == Op_match_rec)
+			lintwarn_ln($2->source_line,
+				_("regular expression on right of comparison"));
+		$$ = list_append(list_merge($1, $3), $2);
+	  }
+	| exp '?' exp ':' exp
+	  { $$ = mk_condition($1, $2, $3, $4, $5); }
+	| common_exp
+	  { $$ = $1; }
+	;
+
+assign_operator
+	: ASSIGN
+	  { $$ = $1; }
+	| ASSIGNOP
+	  { $$ = $1; }
+	| SLASH_BEFORE_EQUAL ASSIGN   /* `/=' */
+	  {
+		$2->opcode = Op_assign_quotient;
+		$$ = $2;
+	  }
+	;
+
+relop_or_less
+	: RELOP
+	  { $$ = $1; }
+	| '<'
+	  { $$ = $1; }
+	;
+
+a_relop
+	: relop_or_less
+	  { $$ = $1; }
+	| '>'
+	  { $$ = $1; }
+	;
+
+common_exp
+	: simp_exp
+	  { $$ = $1; }
+	| simp_exp_nc
+	  { $$ = $1; }
+	| common_exp simp_exp %prec CONCAT_OP
+	  {
+		int count = 2;
+		bool is_simple_var = false;
+
+		if ($1->lasti->opcode == Op_concat) {
+			/* multiple (> 2) adjacent strings optimization */
+			is_simple_var = ($1->lasti->concat_flag & CSVAR) != 0;
+			count = $1->lasti->expr_count + 1;
+			$1->lasti->opcode = Op_no_op;
+		} else {
+			is_simple_var = ($1->nexti->opcode == Op_push
+					&& $1->lasti == $1->nexti); /* first exp. is a simple
+					                             * variable?; kludge for use
+					                             * in Op_assign_concat.
+		 			                             */
+		}
+
+		if (do_optimize
+			&& $1->nexti == $1->lasti && $1->nexti->opcode == Op_push_i
+			&& $2->nexti == $2->lasti && $2->nexti->opcode == Op_push_i
+		) {
+			NODE *n1 = $1->nexti->memory;
+			NODE *n2 = $2->nexti->memory;
+			size_t nlen;
+
+			// 1.5 ""   # can't fold this if program mucks with CONVFMT.
+			// See test #12 in test/posix.awk.
+			// Also can't fold if one or the other is translatable.
+			if ((n1->flags & (NUMBER|NUMINT|INTLSTR)) != 0 || (n2->flags & (NUMBER|NUMINT|INTLSTR)) != 0)
+				goto plain_concat;
+
+			n1 = force_string(n1);
+			n2 = force_string(n2);
+			nlen = n1->stlen + n2->stlen;
+			erealloc(n1->stptr, char *, nlen + 1, "constant fold");
+			memcpy(n1->stptr + n1->stlen, n2->stptr, n2->stlen);
+			n1->stlen = nlen;
+			n1->stptr[nlen] = '\0';
+			n1->flags &= ~(NUMCUR|NUMBER|NUMINT);
+			n1->flags |= (STRING|STRCUR);
+			unref(n2);
+			bcfree($2->nexti);
+			bcfree($2);
+			$$ = $1;
+		} else {
+	plain_concat:
+			$$ = list_append(list_merge($1, $2), instruction(Op_concat));
+			$$->lasti->concat_flag = (is_simple_var ? CSVAR : 0);
+			$$->lasti->expr_count = count;
+			if (count > max_args)
+				max_args = count;
+		}
+	  }
+	;
+
+simp_exp
+	: non_post_simp_exp
+	/* Binary operators in order of decreasing precedence.  */
+	| simp_exp '^' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp '*' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp '/' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp '%' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp '+' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp '-' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| LEX_GETLINE opt_variable input_redir
+	  {
+		/*
+		 * In BEGINFILE/ENDFILE, allow `getline [var] < file'
+		 */
+
+		if ((rule == BEGINFILE || rule == ENDFILE) && $3 == NULL)
+			error_ln($1->source_line,
+				 _("non-redirected `getline' invalid inside `%s' rule"), ruletab[rule]);
+		if (do_lint && rule == END && $3 == NULL)
+			lintwarn_ln($1->source_line,
+				_("non-redirected `getline' undefined inside END action"));
+		$$ = mk_getline($1, $2, $3, redirect_input);
+	  }
+	| variable INCREMENT
+	  {
+		$2->opcode = Op_postincrement;
+		$$ = mk_assignment($1, NULL, $2);
+	  }
+	| variable DECREMENT
+	  {
+		$2->opcode = Op_postdecrement;
+		$$ = mk_assignment($1, NULL, $2);
+	  }
+	| '(' expression_list r_paren LEX_IN simple_variable
+	  {
+		if (do_lint_old) {
+		    warning_ln($4->source_line,
+				_("old awk does not support the keyword `in' except after `for'"));
+		    warning_ln($4->source_line,
+				_("old awk does not support multidimensional arrays"));
+		}
+		$5->nexti->opcode = Op_push_array;
+		$4->opcode = Op_in_array;
+		if ($2 == NULL) {	/* error */
+			errcount++;
+			$4->expr_count = 0;
+			$$ = list_merge($5, $4);
+		} else {
+			INSTRUCTION *t = $2;
+			$4->expr_count = count_expressions(&t, false);
+			$$ = list_append(list_merge(t, $5), $4);
+		}
+	  }
+	;
+
+/* Expressions containing "| getline" lose the ability to be on the
+   right-hand side of a concatenation. */
+simp_exp_nc
+	: common_exp IO_IN LEX_GETLINE opt_variable
+		{
+		  $$ = mk_getline($3, $4, $1, $2->redir_type);
+		  bcfree($2);
+		}
+	/* Binary operators in order of decreasing precedence.  */
+	| simp_exp_nc '^' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp_nc '*' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp_nc '/' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp_nc '%' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp_nc '+' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	| simp_exp_nc '-' simp_exp
+	  { $$ = mk_binary($1, $3, $2); }
+	;
+
+non_post_simp_exp
+	: regexp
+	  {
+		$$ = list_create($1);
+	  }
+	| '!' simp_exp %prec UNARY
+	  {
+		if ($2->opcode == Op_match_rec) {
+			$2->opcode = Op_nomatch;
+			$1->opcode = Op_push_i;
+			$1->memory = set_profile_text(make_number(0.0), "0", 1);
+			$$ = list_append(list_append(list_create($1),
+						instruction(Op_field_spec)), $2);
+		} else {
+			if (do_optimize && $2->nexti == $2->lasti
+					&& $2->nexti->opcode == Op_push_i
+					&& ($2->nexti->memory->flags & (MPFN|MPZN|INTLSTR)) == 0
+			) {
+				NODE *n = $2->nexti->memory;
+				if ((n->flags & STRING) != 0) {
+					n->numbr = (AWKNUM) (n->stlen == 0);
+					n->flags &= ~(STRCUR|STRING);
+					n->flags |= (NUMCUR|NUMBER);
+					efree(n->stptr);
+					n->stptr = NULL;
+					n->stlen = 0;
+				} else
+					n->numbr = (AWKNUM) (n->numbr == 0.0);
+				bcfree($1);
+				$$ = $2;
+			} else {
+				$1->opcode = Op_not;
+				add_lint($2, LINT_assign_in_cond);
+				$$ = list_append($2, $1);
+			}
+		}
+	   }
+	| '(' exp r_paren
+	  {
+		// Always include. Allows us to lint warn on
+		// print "foo" > "bar" 1
+		// but not warn on
+		// print "foo" > ("bar" 1)
+		$$ = list_append($2, bcalloc(Op_parens, 1, sourceline));
+	  }
+	| LEX_BUILTIN '(' opt_fcall_expression_list r_paren
+	  {
+		$$ = snode($3, $1);
+		if ($$ == NULL)
+			YYABORT;
+	  }
+	| LEX_LENGTH '(' opt_fcall_expression_list r_paren
+	  {
+		$$ = snode($3, $1);
+		if ($$ == NULL)
+			YYABORT;
+	  }
+	| LEX_LENGTH
+	  {
+		static bool warned = false;
+
+		if (do_lint && ! warned) {
+			warned = true;
+			lintwarn_ln($1->source_line,
+				_("call of `length' without parentheses is not portable"));
+		}
+		$$ = snode(NULL, $1);
+		if ($$ == NULL)
+			YYABORT;
+	  }
+	| func_call
+	| variable
+	| INCREMENT variable
+	  {
+		$1->opcode = Op_preincrement;
+		$$ = mk_assignment($2, NULL, $1);
+	  }
+	| DECREMENT variable
+	  {
+		$1->opcode = Op_predecrement;
+		$$ = mk_assignment($2, NULL, $1);
+	  }
+	| YNUMBER
+	  {
+		$$ = list_create($1);
+	  }
+	| YSTRING
+	  {
+		$$ = list_create($1);
+	  }
+	| '-' simp_exp    %prec UNARY
+	  {
+		if ($2->lasti->opcode == Op_push_i
+			&& ($2->lasti->memory->flags & STRING) == 0
+		) {
+			NODE *n = $2->lasti->memory;
+			(void) force_number(n);
+			negate_num(n);
+			$$ = $2;
+			bcfree($1);
+		} else {
+			$1->opcode = Op_unary_minus;
+			$$ = list_append($2, $1);
+		}
+	  }
+	| '+' simp_exp    %prec UNARY
+	  {
+		if ($2->lasti->opcode == Op_push_i
+			&& ($2->lasti->memory->flags & STRING) == 0
+			&& ($2->lasti->memory->flags & NUMCONSTSTR) != 0) {
+			NODE *n = $2->lasti->memory;
+			add_sign_to_num(n, '+');
+			$$ = $2;
+			bcfree($1);
+		} else {
+			/*
+			 * was: $$ = $2
+			 * POSIX semantics: force a conversion to numeric type
+			 */
+			$1->opcode = Op_unary_plus;
+			$$ = list_append($2, $1);
+		}
+	  }
+	;
+
+func_call
+	: direct_func_call
+	  {
+		func_use($1->lasti->func_name, FUNC_USE);
+		$$ = $1;
+	  }
+	| '@' direct_func_call
+	  {
+		/* indirect function call */
+		INSTRUCTION *f, *t;
+		char *name;
+		NODE *indirect_var;
+		static bool warned = false;
+		const char *msg = _("indirect function calls are a gawk extension");
+
+		if (do_traditional || do_posix)
+			yyerror("%s", msg);
+		else if (do_lint && ! warned) {
+			warned = true;
+			lintwarn("%s", msg);
+		}
+
+		f = $2->lasti;
+		f->opcode = Op_indirect_func_call;
+		name = estrdup(f->func_name, strlen(f->func_name));
+		if (is_std_var(name))
+			yyerror(_("can not use special variable `%s' for indirect function call"), name);
+		indirect_var = variable(f->source_line, name, Node_var_new);
+		t = instruction(Op_push);
+		t->memory = indirect_var;
+
+		/* prepend indirect var instead of appending to arguments (opt_expression_list),
+		 * and pop it off in setup_frame (eval.c) (left to right evaluation order); Test case:
+		 *		f = "fun"
+		 *		@f(f="real_fun")
+		 */
+
+		$$ = list_prepend($2, t);
+		at_seen = false;
+	  }
+	;
+
+direct_func_call
+	: FUNC_CALL '(' opt_fcall_expression_list r_paren
+	  {
+		NODE *n;
+		char *name = $1->func_name;
+		char *qname = qualify_name(name, strlen(name));
+
+		if (qname != name) {
+			efree((char *) name);
+			$1->func_name = qname;
+		}
+
+		if (! at_seen) {
+			n = lookup($1->func_name);
+			if (n != NULL && n->type != Node_func
+			    && n->type != Node_ext_func) {
+				error_ln($1->source_line,
+					_("attempt to use non-function `%s' in function call"),
+						$1->func_name);
+			}
+		}
+
+		param_sanity($3);
+		$1->opcode = Op_func_call;
+		$1->func_body = NULL;
+		if ($3 == NULL) {	/* no argument or error */
+			($1 + 1)->expr_count = 0;
+			$$ = list_create($1);
+		} else {
+			INSTRUCTION *t = $3;
+			($1 + 1)->expr_count = count_expressions(&t, true);
+			$$ = list_append(t, $1);
+		}
+	  }
+	;
+
+opt_variable
+	: /* empty */
+	  { $$ = NULL; }
+	| variable
+	  { $$ = $1; }
+	;
+
+delete_subscript_list
+	: /* empty */
+	  { $$ = NULL; }
+	| delete_subscript SUBSCRIPT
+	  { $$ = $1; }
+	;
+
+delete_subscript
+	: delete_exp_list
+	  {	$$ = $1; }
+	| delete_subscript delete_exp_list
+	  {
+		$$ = list_merge($1, $2);
+	  }
+	;
+
+delete_exp_list
+	: bracketed_exp_list
+	  {
+		INSTRUCTION *ip = $1->lasti;
+		int count = ip->sub_count;	/* # of SUBSEP-seperated expressions */
+		if (count > 1) {
+			/* change Op_subscript or Op_sub_array to Op_concat */
+			ip->opcode = Op_concat;
+			ip->concat_flag = CSUBSEP;
+			ip->expr_count = count;
+		} else
+			ip->opcode = Op_no_op;
+		sub_counter++;	/* count # of dimensions */
+		$$ = $1;
+	  }
+	;
+
+bracketed_exp_list
+	: '[' expression_list ']'
+  	  {
+		INSTRUCTION *t = $2;
+		if ($2 == NULL) {
+			error_ln($3->source_line,
+				_("invalid subscript expression"));
+			/* install Null string as subscript. */
+			t = list_create(instruction(Op_push_i));
+			t->nexti->memory = dupnode(Nnull_string);
+			$3->sub_count = 1;
+		} else
+			$3->sub_count = count_expressions(&t, false);
+		$$ = list_append(t, $3);
+	  }
+	;
+
+subscript
+	: bracketed_exp_list
+	  {	$$ = $1; }
+	| subscript bracketed_exp_list
+	  {
+		$$ = list_merge($1, $2);
+	  }
+	;
+
+subscript_list
+	: subscript SUBSCRIPT
+	  { $$ = $1; }
+	;
+
+simple_variable
+	: NAME
+	  {
+		$1->opcode = Op_push;
+		$1->memory = variable($1->source_line, $1->lextok, Node_var_new);
+		$$ = list_create($1);
+	  }
+	| NAME subscript_list
+	  {
+		char *arr = $1->lextok;
+
+		$1->memory = variable($1->source_line, arr, Node_var_new);
+		$1->opcode = Op_push_array;
+		$$ = list_prepend($2, $1);
+	  }
+	;
+
+variable
+	: simple_variable
+	  {
+		INSTRUCTION *ip = $1->nexti;
+		if (ip->opcode == Op_push
+			&& ip->memory->type == Node_var
+			&& ip->memory->var_update
+		) {
+			$$ = list_prepend($1, instruction(Op_var_update));
+			$$->nexti->update_var = ip->memory->var_update;
+		} else
+			$$ = $1;
+	  }
+	| '$' non_post_simp_exp opt_incdec
+	  {
+		$$ = list_append($2, $1);
+		if ($3 != NULL)
+			mk_assignment($2, NULL, $3);
+	  }
+	;
+
+opt_incdec
+	: INCREMENT
+	  {
+		$1->opcode = Op_postincrement;
+	  }
+	| DECREMENT
+	  {
+		$1->opcode = Op_postdecrement;
+	  }
+	| /* empty */
+	  { $$ = NULL; }
+	;
+
+l_brace
+	: '{' opt_nls { $$ = $2; }
+	;
+
+r_brace
+	: '}' opt_nls	{ $$ = $2; yyerrok; }
+	;
+
+r_paren
+	: ')' { yyerrok; }
+	;
+
+opt_semi
+	: /* empty */
+	  { $$ = NULL; }
+	| semi
+	;
+
+semi
+	: ';'	{ yyerrok; }
+	;
+
+colon
+	: ':'	{ $$ = $1; yyerrok; }
+	;
+
+comma
+	: ',' opt_nls	{ $$ = $2; yyerrok; }
+	;
+%%
+
+struct token {
+	const char *operator;	/* text to match */
+	OPCODE value;			/*  type */
+	int class;				/* lexical class */
+	unsigned flags;			/* # of args. allowed and compatability */
+#	define	ARGS	0xFF	/* 0, 1, 2, 3 args allowed (any combination */
+#	define	A(n)	(1<<(n))
+#	define	VERSION_MASK	0xFF00	/* old awk is zero */
+#	define	NOT_OLD		0x0100	/* feature not in old awk */
+#	define	NOT_POSIX	0x0200	/* feature not in POSIX */
+#	define	GAWKX		0x0400	/* gawk extension */
+#	define	BREAK		0x0800	/* break allowed inside */
+#	define	CONTINUE	0x1000	/* continue allowed inside */
+#	define	DEBUG_USE	0x2000	/* for use by developers */
+
+	NODE *(*ptr)(int);	/* function that implements this keyword */
+	NODE *(*ptr2)(int);	/* alternate arbitrary-precision function */
+};
+
+#ifdef USE_EBCDIC
+/* tokcompare --- lexicographically compare token names for sorting */
+
+static int
+tokcompare(const void *l, const void *r)
+{
+	struct token *lhs, *rhs;
+
+	lhs = (struct token *) l;
+	rhs = (struct token *) r;
+
+	return strcmp(lhs->operator, rhs->operator);
+}
+#endif
+
+/*
+ * Tokentab is sorted ASCII ascending order, so it can be binary searched.
+ * See check_special(), which sorts the table on EBCDIC systems.
+ * Function pointers come from declarations in awk.h.
+ */
+
+#ifdef HAVE_MPFR
+#define MPF(F) do_mpfr_##F
+#else
+#define MPF(F) 0
+#endif
+
+static const struct token tokentab[] = {
+{"BEGIN",	Op_rule,	 LEX_BEGIN,	0,		0,	0},
+{"BEGINFILE",	Op_rule,	 LEX_BEGINFILE,	GAWKX,		0,	0},
+{"END",		Op_rule,	 LEX_END,	0,		0,	0},
+{"ENDFILE",	Op_rule,	 LEX_ENDFILE,	GAWKX,		0,	0},
+#ifdef ARRAYDEBUG
+{"adump",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(1)|A(2)|DEBUG_USE,	do_adump,	0},
+#endif
+{"and",		Op_builtin,    LEX_BUILTIN,	GAWKX,		do_and,	MPF(and)},
+{"asort",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2)|A(3),	do_asort,	0},
+{"asorti",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2)|A(3),	do_asorti,	0},
+{"atan2",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(2),	do_atan2,	MPF(atan2)},
+{"bindtextdomain",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2),	do_bindtextdomain,	0},
+{"break",	Op_K_break,	 LEX_BREAK,	0,		0,	0},
+{"case",	Op_K_case,	 LEX_CASE,	GAWKX,		0,	0},
+{"close",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1)|A(2),	do_close,	0},
+{"compl",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(1),	do_compl,	MPF(compl)},
+{"continue",	Op_K_continue, LEX_CONTINUE,	0,		0,	0},
+{"cos",		Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_cos,	MPF(cos)},
+{"dcgettext",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2)|A(3),	do_dcgettext,	0},
+{"dcngettext",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2)|A(3)|A(4)|A(5),	do_dcngettext,	0},
+{"default",	Op_K_default,	 LEX_DEFAULT,	GAWKX,		0,	0},
+{"delete",	Op_K_delete,	 LEX_DELETE,	NOT_OLD,	0,	0},
+{"do",		Op_K_do,	 LEX_DO,	NOT_OLD|BREAK|CONTINUE,	0,	0},
+{"else",	Op_K_else,	 LEX_ELSE,	0,		0,	0},
+{"eval",	Op_symbol,	 LEX_EVAL,	0,		0,	0},
+{"exit",	Op_K_exit,	 LEX_EXIT,	0,		0,	0},
+{"exp",		Op_builtin,	 LEX_BUILTIN,	A(1),		do_exp,	MPF(exp)},
+{"fflush",	Op_builtin,	 LEX_BUILTIN,	A(0)|A(1), do_fflush,	0},
+{"for",		Op_K_for,	 LEX_FOR,	BREAK|CONTINUE,	0,	0},
+{"func",	Op_func, 	LEX_FUNCTION,	NOT_POSIX|NOT_OLD,	0,	0},
+{"function",	Op_func, 	LEX_FUNCTION,	NOT_OLD,	0,	0},
+{"gensub",	Op_sub_builtin,	 LEX_BUILTIN,	GAWKX|A(3)|A(4), 0,	0},
+{"getline",	Op_K_getline_redir,	 LEX_GETLINE,	NOT_OLD,	0,	0},
+{"gsub",	Op_sub_builtin,	 LEX_BUILTIN,	NOT_OLD|A(2)|A(3), 0,	0},
+{"if",		Op_K_if,	 LEX_IF,	0,		0,	0},
+{"in",		Op_symbol,	 LEX_IN,	0,		0,	0},
+{"include",	Op_symbol,	 LEX_INCLUDE,	GAWKX,	0,	0},
+{"index",	Op_builtin,	 LEX_BUILTIN,	A(2),		do_index,	0},
+{"int",		Op_builtin,	 LEX_BUILTIN,	A(1),		do_int,	MPF(int)},
+#ifdef SUPPLY_INTDIV
+{"intdiv0",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(3),	do_intdiv,	MPF(intdiv)},
+#endif
+{"isarray",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1),	do_isarray,	0},
+{"length",	Op_builtin,	 LEX_LENGTH,	A(0)|A(1),	do_length,	0},
+{"load",  	Op_symbol,	 LEX_LOAD,	GAWKX,		0,	0},
+{"log",		Op_builtin,	 LEX_BUILTIN,	A(1),		do_log,	MPF(log)},
+{"lshift",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(2),	do_lshift,	MPF(lshift)},
+{"match",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(2)|A(3), do_match,	0},
+{"mktime",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2), do_mktime, 0},
+{"namespace",  	Op_symbol,	 LEX_NAMESPACE,	GAWKX,		0,	0},
+{"next",	Op_K_next,	 LEX_NEXT,	0,		0,	0},
+{"nextfile",	Op_K_nextfile, LEX_NEXTFILE,	0,		0,	0},
+{"or",		Op_builtin,    LEX_BUILTIN,	GAWKX,		do_or,	MPF(or)},
+{"patsplit",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(2)|A(3)|A(4), do_patsplit,	0},
+{"print",	Op_K_print,	 LEX_PRINT,	0,		0,	0},
+{"printf",	Op_K_printf,	 LEX_PRINTF,	0,		0,	0},
+{"rand",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(0),	do_rand,	MPF(rand)},
+{"return",	Op_K_return,	 LEX_RETURN,	NOT_OLD,	0,	0},
+{"rshift",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(2),	do_rshift,	MPF(rshift)},
+{"sin",		Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_sin,	MPF(sin)},
+{"split",	Op_builtin,	 LEX_BUILTIN,	A(2)|A(3)|A(4),	do_split,	0},
+{"sprintf",	Op_builtin,	 LEX_BUILTIN,	0,		do_sprintf,	0},
+{"sqrt",	Op_builtin,	 LEX_BUILTIN,	A(1),		do_sqrt,	MPF(sqrt)},
+{"srand",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(0)|A(1), do_srand,	MPF(srand)},
+#if defined(GAWKDEBUG) || defined(ARRAYDEBUG) /* || ... */
+{"stopme",	Op_builtin,	LEX_BUILTIN,	GAWKX|A(0)|DEBUG_USE,	stopme,		0},
+#endif
+{"strftime",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(0)|A(1)|A(2)|A(3), do_strftime,	0},
+{"strtonum",	Op_builtin,    LEX_BUILTIN,	GAWKX|A(1),	do_strtonum, MPF(strtonum)},
+{"sub",		Op_sub_builtin,	 LEX_BUILTIN,	NOT_OLD|A(2)|A(3), 0,	0},
+{"substr",	Op_builtin,	 LEX_BUILTIN,	A(2)|A(3),	do_substr,	0},
+{"switch",	Op_K_switch,	 LEX_SWITCH,	GAWKX|BREAK,	0,	0},
+{"system",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_system,	0},
+{"systime",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(0),	do_systime,	0},
+{"tolower",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_tolower,	0},
+{"toupper",	Op_builtin,	 LEX_BUILTIN,	NOT_OLD|A(1),	do_toupper,	0},
+{"typeof",	Op_builtin,	 LEX_BUILTIN,	GAWKX|A(1)|A(2), do_typeof,	0},
+{"while",	Op_K_while,	 LEX_WHILE,	BREAK|CONTINUE,	0,	0},
+{"xor",		Op_builtin,    LEX_BUILTIN,	GAWKX,		do_xor,	MPF(xor)},
+};
+
+/* Variable containing the current shift state.  */
+static mbstate_t cur_mbstate;
+/* Ring buffer containing current characters.  */
+#define MAX_CHAR_IN_RING_BUFFER 8
+#define RING_BUFFER_SIZE (MAX_CHAR_IN_RING_BUFFER * MB_LEN_MAX)
+static char cur_char_ring[RING_BUFFER_SIZE];
+/* Index for ring buffers.  */
+static int cur_ring_idx;
+/* This macro means that last nextc() return a singlebyte character
+   or 1st byte of a multibyte character.  */
+#define nextc_is_1stbyte (cur_char_ring[cur_ring_idx] == 1)
+
+/* getfname --- return name of a builtin function (for pretty printing) */
+
+const char *
+getfname(NODE *(*fptr)(int), bool prepend_awk)
+{
+	int i, j;
+	static char buf[100];
+
+	j = sizeof(tokentab) / sizeof(tokentab[0]);
+	/* linear search, no other way to do it */
+	for (i = 0; i < j; i++) {
+		if (tokentab[i].ptr == fptr || tokentab[i].ptr2 == fptr) {
+			if (prepend_awk && (tokentab[i].flags & GAWKX) != 0) {
+				sprintf(buf, "awk::%s", tokentab[i].operator);
+				return buf;
+			}
+			return tokentab[i].operator;
+		}
+	}
+
+	return NULL;
+}
+
+/* negate_num --- negate a number in NODE */
+
+void
+negate_num(NODE *n)
+{
+#ifdef HAVE_MPFR
+	int tval = 0;
+#endif
+
+	add_sign_to_num(n, '-');
+
+	if (! is_mpg_number(n)) {
+		n->numbr = -n->numbr;
+		return;
+	}
+
+#ifdef HAVE_MPFR
+	if (is_mpg_integer(n)) {
+		if (! iszero(n)) {
+			mpz_neg(n->mpg_i, n->mpg_i);
+			return;
+		}
+
+		/*
+		 * 0 --> -0 conversion. Requires turning the MPG integer
+		 * into an MPFR float.
+		 */
+
+		mpz_clear(n->mpg_i);	/* release the integer storage */
+
+		/* Convert and fall through. */
+		tval = mpfr_set_d(n->mpg_numbr, 0.0, ROUND_MODE);
+		IEEE_FMT(n->mpg_numbr, tval);
+		n->flags &= ~MPZN;
+		n->flags |= MPFN;
+	}
+
+	/* mpfr float case */
+	tval = mpfr_neg(n->mpg_numbr, n->mpg_numbr, ROUND_MODE);
+	IEEE_FMT(n->mpg_numbr, tval);
+#endif
+}
+
+/* add_sign_to_num --- make a constant unary plus or minus for profiling */
+
+static void
+add_sign_to_num(NODE *n, char sign)
+{
+	if ((n->flags & NUMCONSTSTR) != 0) {
+		char *s;
+
+		s = n->stptr;
+		memmove(& s[1], & s[0], n->stlen + 1);
+		s[0] = sign;
+		n->stlen++;
+	}
+}
+
+/* print_included_from --- print `Included from ..' file names and locations */
+
+static void
+print_included_from()
+{
+	int saveline, line;
+	SRCFILE *s;
+
+	/* suppress current file name, line # from `.. included from ..' msgs */
+	saveline = sourceline;
+	sourceline = 0;
+
+	for (s = sourcefile; s != NULL && s->stype == SRC_INC; ) {
+		s = s->next;
+		if (s == NULL || s->fd <= INVALID_HANDLE)
+			continue;
+		line = s->srclines;
+
+		/* if last token is NEWLINE, line number is off by 1. */
+		if (s->lasttok == NEWLINE)
+			line--;
+		msg("%s %s:%d%c",
+			s->prev == sourcefile ? "In file included from"
+					  : "                 from",
+			(s->stype == SRC_INC ||
+				 s->stype == SRC_FILE) ? s->src : "cmd. line",
+			line,
+			s->stype == SRC_INC ? ',' : ':'
+		);
+	}
+	sourceline = saveline;
+}
+
+/* warning_ln --- print a warning message with location */
+
+static void
+warning_ln(int line, const char *mesg, ...)
+{
+	va_list args;
+	int saveline;
+
+	saveline = sourceline;
+	sourceline = line;
+	print_included_from();
+	va_start(args, mesg);
+	err(false, _("warning: "), mesg, args);
+	va_end(args);
+	sourceline = saveline;
+}
+
+/* lintwarn_ln --- print a lint warning and location */
+
+static void
+lintwarn_ln(int line, const char *mesg, ...)
+{
+	va_list args;
+	int saveline;
+
+	saveline = sourceline;
+	sourceline = line;
+	print_included_from();
+	va_start(args, mesg);
+	if (lintfunc == r_fatal)
+		err(true, _("fatal: "), mesg, args);
+	else
+		err(false, _("warning: "), mesg, args);
+	va_end(args);
+	sourceline = saveline;
+	if (lintfunc == r_fatal)
+		gawk_exit(EXIT_FATAL);
+}
+
+/* error_ln --- print an error message and location */
+
+static void
+error_ln(int line, const char *m, ...)
+{
+	va_list args;
+	int saveline;
+
+	saveline = sourceline;
+	sourceline = line;
+	print_included_from();
+	errcount++;
+	va_start(args, m);
+	err(false, "error: ", m, args);
+	va_end(args);
+	sourceline = saveline;
+}
+
+/* yyerror --- print a syntax error message, show where */
+
+static void
+yyerror(const char *m, ...)
+{
+	va_list args;
+	const char *mesg = NULL;
+	char *bp, *cp;
+	char *scan;
+	char *buf;
+	int count;
+	static char end_of_file_line[] = "(END OF FILE)";
+	static char syntax_error[] = "syntax error";
+	static size_t syn_err_len = sizeof(syntax_error) - 1;
+	bool generic_error = (strncmp(m, syntax_error, syn_err_len) == 0);
+
+	print_included_from();
+
+	errcount++;
+	/* Find the current line in the input file */
+	if (lexptr && lexeme) {
+		if (thisline == NULL) {
+			cp = lexeme;
+			if (*cp == '\n') {
+				if (cp > lexptr_begin)
+					cp--;
+				mesg = _("unexpected newline or end of string");
+			}
+			for (; cp != lexptr_begin && *cp != '\n'; --cp)
+				continue;
+			if (*cp == '\n')
+				cp++;
+			thisline = cp;
+		}
+		/* NL isn't guaranteed */
+		bp = lexeme;
+		if (bp < thisline)
+			bp = thisline + 1;
+		while (bp < lexend && *bp && *bp != '\n')
+			bp++;
+	} else {
+		thisline = end_of_file_line;
+		bp = thisline + strlen(thisline);
+	}
+
+	if (lexeof && mesg == NULL && generic_error) {
+		msg("%s", end_of_file_line);
+		mesg = _("source files / command-line arguments must contain complete functions or rules");
+	} else
+		msg("%.*s", (int) (bp - thisline), thisline);
+
+	va_start(args, m);
+	if (mesg == NULL)
+		mesg = m;
+
+	count = strlen(mesg) + 1;
+	if (lexptr != NULL)
+		count += (lexeme - thisline) + 2;
+	ezalloc(buf, char *, count+1, "yyerror");
+
+	bp = buf;
+
+	if (lexptr != NULL) {
+		scan = thisline;
+		while (scan < lexeme)
+			if (*scan++ == '\t')
+				*bp++ = '\t';
+			else
+				*bp++ = ' ';
+		*bp++ = '^';
+		*bp++ = ' ';
+	}
+	strcpy(bp, mesg);
+	err(false, "", buf, args);
+	va_end(args);
+	efree(buf);
+}
+
+/* mk_program --- create a single list of instructions */
+
+static INSTRUCTION *
+mk_program()
+{
+	INSTRUCTION *cp, *tmp;
+
+#define begin_block         rule_block[BEGIN]
+#define end_block           rule_block[END]
+#define prog_block          rule_block[Rule]
+#define beginfile_block     rule_block[BEGINFILE]
+#define endfile_block       rule_block[ENDFILE]
+
+	if (end_block == NULL)
+		end_block = list_create(ip_end);
+	else
+		(void) list_prepend(end_block, ip_end);
+
+	if (! in_main_context()) {
+		if (begin_block != NULL && prog_block != NULL)
+			cp = list_merge(begin_block, prog_block);
+		else
+			cp = (begin_block != NULL) ? begin_block : prog_block;
+
+		if (cp != NULL)
+			(void) list_merge(cp, end_block);
+		else
+			cp = end_block;
+
+		(void) list_append(cp, instruction(Op_stop));
+		goto out;
+	}
+
+	if (endfile_block == NULL)
+		endfile_block = list_create(ip_endfile);
+	else {
+		ip_rec->has_endfile = true;
+		(void) list_prepend(endfile_block, ip_endfile);
+	}
+
+	if (beginfile_block == NULL)
+		beginfile_block = list_create(ip_beginfile);
+	else
+		(void) list_prepend(beginfile_block, ip_beginfile);
+
+	if (prog_block == NULL) {
+		if (end_block->nexti == end_block->lasti
+				&& beginfile_block->nexti == beginfile_block->lasti
+				&& endfile_block->nexti == endfile_block->lasti
+		) {
+			/* no pattern-action and (real) end, beginfile or endfile blocks */
+			bcfree(ip_rec);
+			bcfree(ip_newfile);
+			ip_rec = ip_newfile = NULL;
+
+			list_append(beginfile_block, instruction(Op_after_beginfile));
+			(void) list_append(endfile_block, instruction(Op_after_endfile));
+
+			if (begin_block == NULL)     /* no program at all */
+				cp = end_block;
+			else
+				cp = list_merge(begin_block, end_block);
+
+			if (interblock_comment != NULL) {
+				(void) list_append(cp, interblock_comment);
+				interblock_comment = NULL;
+			}
+
+			(void) list_append(cp, ip_atexit);
+			(void) list_append(cp, instruction(Op_stop));
+
+			/* append beginfile_block and endfile_block for sole use
+			 * in getline without redirection (Op_K_getline).
+			 */
+
+			(void) list_merge(cp, beginfile_block);
+			(void) list_merge(cp, endfile_block);
+
+			if (outer_comment != NULL) {
+				cp = list_merge(list_create(outer_comment), cp);
+				outer_comment = NULL;
+			}
+
+			if (interblock_comment != NULL) {
+				(void) list_append(cp, interblock_comment);
+				interblock_comment = NULL;
+			}
+
+			goto out;
+
+		} else {
+			/* install a do-nothing prog block */
+			prog_block = list_create(instruction(Op_no_op));
+		}
+	}
+
+	(void) list_append(endfile_block, instruction(Op_after_endfile));
+	(void) list_prepend(prog_block, ip_rec);
+	(void) list_append(prog_block, instruction(Op_jmp));
+	prog_block->lasti->target_jmp = ip_rec;
+
+	list_append(beginfile_block, instruction(Op_after_beginfile));
+
+	cp = list_merge(beginfile_block, prog_block);
+	(void) list_prepend(cp, ip_newfile);
+	(void) list_merge(cp, endfile_block);
+	(void) list_merge(cp, end_block);
+	if (begin_block != NULL)
+		cp = list_merge(begin_block, cp);
+
+	if (outer_comment != NULL) {
+		cp = list_merge(list_create(outer_comment), cp);
+		outer_comment = NULL;
+	}
+
+	if (interblock_comment != NULL) {
+		(void) list_append(cp, interblock_comment);
+		interblock_comment = NULL;
+	}
+
+	(void) list_append(cp, ip_atexit);
+	(void) list_append(cp, instruction(Op_stop));
+
+out:
+	/* delete the Op_list, not needed */
+	tmp = cp->nexti;
+	bcfree(cp);
+	return tmp;
+
+#undef begin_block
+#undef end_block
+#undef prog_block
+#undef beginfile_block
+#undef endfile_block
+}
+
+/* parse_program --- read in the program and convert into a list of instructions */
+
+int
+parse_program(INSTRUCTION **pcode, bool from_eval)
+{
+	int ret;
+
+	called_from_eval = from_eval;
+
+	/* pre-create non-local jump targets
+	 * ip_end (Op_no_op) -- used as jump target for `exit'
+	 * outside an END block.
+	 */
+	ip_end = instruction(Op_no_op);
+
+	if (! in_main_context())
+		ip_newfile = ip_rec = ip_atexit = ip_beginfile = ip_endfile = NULL;
+	else {
+		ip_endfile = instruction(Op_no_op);
+		main_beginfile = ip_beginfile = instruction(Op_no_op);
+		ip_rec = instruction(Op_get_record); /* target for `next', also ip_newfile */
+		ip_newfile = bcalloc(Op_newfile, 2, 0); /* target for `nextfile' */
+		ip_newfile->target_jmp = ip_end;
+		ip_newfile->target_endfile = ip_endfile;
+		(ip_newfile + 1)->target_get_record = ip_rec;
+		ip_rec->target_newfile = ip_newfile;
+		ip_atexit = instruction(Op_atexit);	/* target for `exit' in END block */
+	}
+
+	for (sourcefile = srcfiles->next; sourcefile->stype == SRC_EXTLIB;
+			sourcefile = sourcefile->next)
+		;
+
+	lexeof = false;
+	lexptr = NULL;
+	lasttok = 0;
+	memset(rule_block, 0, sizeof(ruletab) * sizeof(INSTRUCTION *));
+	errcount = 0;
+	tok = tokstart != NULL ? tokstart : tokexpand();
+
+	ret = yyparse();
+	*pcode = mk_program();
+
+	/* avoid false source indications */
+	source = NULL;
+	sourceline = 0;
+	if (ret == 0)	/* avoid spurious warning if parser aborted with YYABORT */
+		check_funcs();
+
+	if (do_posix && ! check_param_names())
+		errcount++;
+
+	if (args_array == NULL)
+		emalloc(args_array, NODE **, (max_args + 2) * sizeof(NODE *), "parse_program");
+	else
+		erealloc(args_array, NODE **, (max_args + 2) * sizeof(NODE *), "parse_program");
+
+	return (ret || errcount);
+}
+
+/* free_srcfile --- free a SRCFILE struct */
+
+void
+free_srcfile(SRCFILE *thisfile)
+{
+	efree(thisfile->src);
+	efree(thisfile);
+}
+
+/* do_add_srcfile --- add one item to srcfiles */
+
+static SRCFILE *
+do_add_srcfile(enum srctype stype, char *src, char *path, SRCFILE *thisfile)
+{
+	SRCFILE *s;
+
+	ezalloc(s, SRCFILE *, sizeof(SRCFILE), "do_add_srcfile");
+	s->src = estrdup(src, strlen(src));
+	s->fullpath = path;
+	s->stype = stype;
+	s->fd = INVALID_HANDLE;
+	s->next = thisfile;
+	s->prev = thisfile->prev;
+	thisfile->prev->next = s;
+	thisfile->prev = s;
+	return s;
+}
+
+/* add_srcfile --- add one item to srcfiles after checking if
+ *				a source file exists and not already in list.
+ */
+
+SRCFILE *
+add_srcfile(enum srctype stype, char *src, SRCFILE *thisfile, bool *already_included, int *errcode)
+{
+	SRCFILE *s;
+	struct stat sbuf;
+	char *path;
+	int errno_val = 0;
+
+	if (already_included)
+		*already_included = false;
+	if (errcode)
+		*errcode = 0;
+	if (stype == SRC_CMDLINE || stype == SRC_STDIN)
+		return do_add_srcfile(stype, src, NULL, thisfile);
+
+	path = find_source(src, & sbuf, & errno_val, stype == SRC_EXTLIB);
+	if (path == NULL) {
+		if (errcode) {
+			*errcode = errno_val;
+			return NULL;
+		}
+		/* use full messages to ease translation */
+		fatal(stype != SRC_EXTLIB
+			? _("can't open source file `%s' for reading (%s)")
+			: _("can't open shared library `%s' for reading (%s)"),
+				src,
+				errno_val ? strerror(errno_val) : _("reason unknown"));
+	}
+
+	/* N.B. We do not eliminate duplicate SRC_FILE (-f) programs. */
+	for (s = srcfiles->next; s != srcfiles; s = s->next) {
+		if ((s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == SRC_EXTLIB) && files_are_same(path, s)) {
+			if (stype == SRC_INC || stype == SRC_EXTLIB) {
+				/* eliminate duplicates */
+				if ((stype == SRC_INC) && (s->stype == SRC_FILE))
+					fatal(_("can't include `%s' and use it as a program file"), src);
+
+				if (do_lint) {
+					int line = sourceline;
+					/* Kludge: the line number may be off for `@include file'.
+					 * Since, this function is also used for '-f file' in main.c,
+					 * sourceline > 1 check ensures that the call is at
+					 * parse time.
+					 */
+					if (sourceline > 1 && lasttok == NEWLINE)
+						line--;
+					lintwarn_ln(line,
+						    stype != SRC_EXTLIB
+						      ? _("already included source file `%s'")
+						      : _("already loaded shared library `%s'"),
+						    src);
+				}
+				efree(path);
+				if (already_included)
+					*already_included = true;
+				return NULL;
+			} else {
+				/* duplicates are allowed for -f */
+				if (s->stype == SRC_INC)
+					fatal(_("can't include `%s' and use it as a program file"), src);
+				/* no need to scan for further matches, since
+				 * they must be of homogeneous type */
+				break;
+			}
+		}
+	}
+
+	s = do_add_srcfile(stype, src, path, thisfile);
+	s->sbuf = sbuf;
+	s->mtime = sbuf.st_mtime;
+	return s;
+}
+
+/* include_source --- read program from source included using `@include' */
+
+static bool
+include_source(INSTRUCTION *file, void **srcfile_p)
+{
+	SRCFILE *s;
+	char *src = file->lextok;
+	int errcode;
+	bool already_included;
+
+	*srcfile_p = NULL;
+
+	if (do_traditional || do_posix) {
+		error_ln(file->source_line, _("@include is a gawk extension"));
+		return false;
+	}
+
+	if (strlen(src) == 0) {
+		if (do_lint)
+			lintwarn_ln(file->source_line, _("empty filename after @include"));
+		return true;
+	}
+
+	s = add_srcfile(SRC_INC, src, sourcefile, &already_included, &errcode);
+	if (s == NULL) {
+		if (already_included)
+			return true;
+		error_ln(file->source_line,
+			_("can't open source file `%s' for reading (%s)"),
+			src, errcode ? strerror(errcode) : _("reason unknown"));
+		return false;
+	}
+
+	/* save scanner state for the current sourcefile */
+	sourcefile->srclines = sourceline;
+	sourcefile->lexptr = lexptr;
+	sourcefile->lexend = lexend;
+	sourcefile->lexptr_begin = lexptr_begin;
+	sourcefile->lexeme = lexeme;
+	sourcefile->lasttok = lasttok;
+	sourcefile->namespace = current_namespace;
+
+	/* included file becomes the current source */
+	sourcefile = s;
+	lexptr = NULL;
+	sourceline = 0;
+	source = NULL;
+	lasttok = 0;
+	lexeof = false;
+	eof_warned = false;
+	current_namespace = awk_namespace;
+	*srcfile_p = (void *) s;
+	return true;
+}
+
+/* load_library --- load a shared library */
+
+static bool
+load_library(INSTRUCTION *file, void **srcfile_p)
+{
+	SRCFILE *s;
+	char *src = file->lextok;
+	int errcode;
+	bool already_included;
+
+	*srcfile_p = NULL;
+
+	if (do_traditional || do_posix) {
+		error_ln(file->source_line, _("@load is a gawk extension"));
+		return false;
+	}
+
+
+	if (strlen(src) == 0) {
+		if (do_lint)
+			lintwarn_ln(file->source_line, _("empty filename after @load"));
+		return true;
+	}
+
+	if (do_pretty_print && ! do_profile) {
+		// create a fake one, don't try to open the file
+		s = do_add_srcfile(SRC_EXTLIB, src, src, sourcefile);
+	} else {
+		s = add_srcfile(SRC_EXTLIB, src, sourcefile, &already_included, &errcode);
+		if (s == NULL) {
+			if (already_included)
+				return true;
+			error_ln(file->source_line,
+				_("can't open shared library `%s' for reading (%s)"),
+				src, errcode ? strerror(errcode) : _("reason unknown"));
+			return false;
+		}
+
+		load_ext(s->fullpath);
+	}
+
+	*srcfile_p = (void *) s;
+	return true;
+}
+
+/* next_sourcefile --- read program from the next source in srcfiles */
+
+static void
+next_sourcefile()
+{
+	static int (*closefunc)(int fd) = NULL;
+
+	if (closefunc == NULL) {
+		char *cp = getenv("AWKREADFUNC");
+
+		/* If necessary, one day, test value for different functions.  */
+		if (cp == NULL)
+			closefunc = close;
+		else
+			closefunc = one_line_close;
+	}
+
+	/*
+	 * This won't be true if there's an invalid character in
+	 * the source file or source string (e.g., user typo).
+	 * Previous versions of gawk did not core dump in such a
+	 * case.
+	 *
+	 * assert(lexeof == true);
+	 */
+
+	lexeof = false;
+	eof_warned = false;
+	sourcefile->srclines = sourceline;	/* total no of lines in current file */
+	if (sourcefile->fd > INVALID_HANDLE) {
+		if (sourcefile->fd != fileno(stdin))  /* safety */
+			(*closefunc)(sourcefile->fd);
+		sourcefile->fd = INVALID_HANDLE;
+	}
+	if (sourcefile->buf != NULL) {
+		efree(sourcefile->buf);
+		sourcefile->buf = NULL;
+		sourcefile->lexptr_begin = NULL;
+	}
+
+	while ((sourcefile = sourcefile->next) != NULL) {
+		if (sourcefile == srcfiles)
+			return;
+		if (sourcefile->stype != SRC_EXTLIB)
+			break;
+	}
+
+	if (sourcefile->lexptr_begin != NULL) {
+		/* resume reading from already opened file (postponed to process '@include') */
+		lexptr = sourcefile->lexptr;
+		lexend = sourcefile->lexend;
+		lasttok = sourcefile->lasttok;
+		lexptr_begin = sourcefile->lexptr_begin;
+		lexeme = sourcefile->lexeme;
+		sourceline = sourcefile->srclines;
+		source = sourcefile->src;
+		set_current_namespace(sourcefile->namespace);
+	} else {
+		lexptr = NULL;
+		sourceline = 0;
+		source = NULL;
+		lasttok = 0;
+		set_current_namespace(awk_namespace);
+	}
+}
+
+/* get_src_buf --- read the next buffer of source program */
+
+static char *
+get_src_buf()
+{
+	int n;
+	char *scan;
+	bool newfile;
+	int savelen;
+	struct stat sbuf;
+
+	/*
+	 * No argument prototype on readfunc on purpose,
+	 * avoids problems with some ancient systems where
+	 * the types of arguments to read() aren't up to date.
+	 */
+	static ssize_t (*readfunc)() = 0;
+
+	if (readfunc == NULL) {
+		char *cp = getenv("AWKREADFUNC");
+
+		/* If necessary, one day, test value for different functions.  */
+		if (cp == NULL)
+			/*
+			 * cast is to remove warnings on systems with
+			 * different return types for read.
+			 */
+			readfunc = ( ssize_t(*)() ) read;
+		else
+			readfunc = read_one_line;
+	}
+
+	newfile = false;
+	if (sourcefile == srcfiles)
+		return NULL;
+
+	if (sourcefile->stype == SRC_CMDLINE) {
+		if (sourcefile->bufsize == 0) {
+			sourcefile->bufsize = strlen(sourcefile->src);
+			lexptr = lexptr_begin = lexeme = sourcefile->src;
+			lexend = lexptr + sourcefile->bufsize;
+			sourceline = 1;
+			if (sourcefile->bufsize == 0) {
+				/*
+				 * Yet Another Special case:
+				 *	gawk '' /path/name
+				 * Sigh.
+				 */
+				static bool warned = false;
+
+				if (do_lint && ! warned) {
+					warned = true;
+					lintwarn(_("empty program text on command line"));
+				}
+				lexeof = true;
+			}
+		} else if (sourcefile->buf == NULL  && *(lexptr-1) != '\n') {
+			/*
+			 * The following goop is to ensure that the source
+			 * ends with a newline and that the entire current
+			 * line is available for error messages.
+			 */
+			int offset;
+			char *buf;
+
+			offset = lexptr - lexeme;
+			for (scan = lexeme; scan > lexptr_begin; scan--)
+				if (*scan == '\n') {
+					scan++;
+					break;
+				}
+			savelen = lexptr - scan;
+			emalloc(buf, char *, savelen + 1, "get_src_buf");
+			memcpy(buf, scan, savelen);
+			thisline = buf;
+			lexptr = buf + savelen;
+			*lexptr = '\n';
+			lexeme = lexptr - offset;
+			lexptr_begin = buf;
+			lexend = lexptr + 1;
+			sourcefile->buf = buf;
+		} else
+			lexeof = true;
+		return lexptr;
+	}
+
+	if (sourcefile->fd <= INVALID_HANDLE) {
+		int fd;
+		int l;
+
+		source = sourcefile->src;
+		if (source == NULL)
+			return NULL;
+		fd = srcopen(sourcefile);
+		if (fd <= INVALID_HANDLE) {
+			char *in;
+
+			/* suppress file name and line no. in error mesg */
+			in = source;
+			source = NULL;
+			error(_("can't open source file `%s' for reading (%s)"),
+				in, strerror(errno));
+			errcount++;
+			lexeof = true;
+			return sourcefile->src;
+		}
+
+		sourcefile->fd = fd;
+		l = optimal_bufsize(fd, &sbuf);
+		/*
+		 * Make sure that something silly like
+		 * 	AWKBUFSIZE=8 make check
+		 * works ok.
+		 */
+#define A_DECENT_BUFFER_SIZE	128
+		if (l < A_DECENT_BUFFER_SIZE)
+			l = A_DECENT_BUFFER_SIZE;
+#undef A_DECENT_BUFFER_SIZE
+		sourcefile->bufsize = l;
+		newfile = true;
+		emalloc(sourcefile->buf, char *, sourcefile->bufsize, "get_src_buf");
+		lexptr = lexptr_begin = lexeme = sourcefile->buf;
+		savelen = 0;
+		sourceline = 1;
+		thisline = NULL;
+	} else {
+		/*
+		 * Here, we retain the current source line in the beginning of the buffer.
+		 */
+		int offset;
+		for (scan = lexeme; scan > lexptr_begin; scan--)
+			if (*scan == '\n') {
+				scan++;
+				break;
+			}
+
+		savelen = lexptr - scan;
+		offset = lexptr - lexeme;
+
+		if (savelen > 0) {
+			/*
+			 * Need to make sure we have room left for reading new text;
+			 * grow the buffer (by doubling, an arbitrary choice), if the retained line
+			 * takes up more than a certain percentage (50%, again an arbitrary figure)
+			 * of the available space.
+			 */
+
+			if (savelen > sourcefile->bufsize / 2) { /* long line or token  */
+				sourcefile->bufsize *= 2;
+				erealloc(sourcefile->buf, char *, sourcefile->bufsize, "get_src_buf");
+				scan = sourcefile->buf + (scan - lexptr_begin);
+				lexptr_begin = sourcefile->buf;
+			}
+
+			thisline = lexptr_begin;
+			memmove(thisline, scan, savelen);
+			lexptr = thisline + savelen;
+			lexeme = lexptr - offset;
+		} else {
+			savelen = 0;
+			lexptr = lexeme = lexptr_begin;
+			thisline = NULL;
+		}
+	}
+
+	n = (*readfunc)(sourcefile->fd, lexptr, sourcefile->bufsize - savelen);
+	if (n == -1) {
+		error(_("can't read sourcefile `%s' (%s)"),
+				source, strerror(errno));
+		errcount++;
+		lexeof = true;
+	} else {
+		lexend = lexptr + n;
+		if (n == 0) {
+			static bool warned = false;
+			if (do_lint && newfile && ! warned) {
+				warned = true;
+				sourceline = 0;
+				lintwarn(_("source file `%s' is empty"), source);
+			}
+			lexeof = true;
+		}
+	}
+	return sourcefile->buf;
+}
+
+/* tokadd --- add a character to the token buffer */
+
+#define	tokadd(x) (*tok++ = (x), tok == tokend ? tokexpand() : tok)
+
+/* tokexpand --- grow the token buffer */
+
+static char *
+tokexpand()
+{
+	static int toksize;
+	int tokoffset;
+
+	if (tokstart != NULL) {
+		tokoffset = tok - tokstart;
+		toksize *= 2;
+		erealloc(tokstart, char *, toksize, "tokexpand");
+		tok = tokstart + tokoffset;
+	} else {
+		toksize = 60;
+		emalloc(tokstart, char *, toksize, "tokexpand");
+		tok = tokstart;
+	}
+	tokend = tokstart + toksize;
+	return tok;
+}
+
+/* check_bad_char --- fatal if c isn't allowed in gawk source code */
+
+/*
+ * The error message was inspired by someone who decided to put
+ * a physical \0 byte into the source code to see what would
+ * happen and then filed a bug report about it.  Sigh.
+ */
+
+static void
+check_bad_char(int c)
+{
+	/* allow escapes. needed for autoconf. bleah. */
+	switch (c) {
+	case '\a':
+	case '\b':
+	case '\f':
+	case '\n':
+	case '\r':
+	case '\t':
+		return;
+	default:
+		break;
+	}
+
+	if (iscntrl(c) && ! isspace(c))
+		fatal(_("PEBKAC error: invalid character '\\%03o' in source code"), c & 0xFF);
+}
+
+/* nextc --- get the next input character */
+
+// For namespaces, -e chunks must be syntactic units.
+#define NO_CONTINUE_SOURCE_STRINGS	1
+
+static int
+nextc(bool check_for_bad)
+{
+	if (gawk_mb_cur_max > 1) {
+again:
+#ifdef NO_CONTINUE_SOURCE_STRINGS
+		if (lexeof)
+			return END_FILE;
+#else
+		if (lexeof) {
+			if (sourcefile->next == srcfiles)
+				return END_FILE;
+			else
+				next_sourcefile();
+		}
+#endif
+		if (lexptr == NULL || lexptr >= lexend) {
+			if (get_src_buf())
+				goto again;
+			return END_SRC;
+		}
+
+		/* Update the buffer index.  */
+		cur_ring_idx = (cur_ring_idx == RING_BUFFER_SIZE - 1)? 0 :
+			cur_ring_idx + 1;
+
+		/* Did we already check the current character?  */
+		if (cur_char_ring[cur_ring_idx] == 0) {
+			/* No, we need to check the next character on the buffer.  */
+			int idx, work_ring_idx = cur_ring_idx;
+			mbstate_t tmp_state;
+			size_t mbclen;
+
+			for (idx = 0; lexptr + idx < lexend; idx++) {
+				tmp_state = cur_mbstate;
+				mbclen = mbrlen(lexptr, idx + 1, &tmp_state);
+
+				if (mbclen == 1 || mbclen == (size_t)-1 || mbclen == 0) {
+					/* It is a singlebyte character, non-complete multibyte
+					   character or EOF.  We treat it as a singlebyte
+					   character.  */
+					cur_char_ring[work_ring_idx] = 1;
+					break;
+				} else if (mbclen == (size_t)-2) {
+					/* It is not a complete multibyte character.  */
+					cur_char_ring[work_ring_idx] = idx + 1;
+				} else {
+					/* mbclen > 1 */
+					cur_char_ring[work_ring_idx] = mbclen;
+					break;
+				}
+				work_ring_idx = (work_ring_idx == RING_BUFFER_SIZE - 1)?
+					0 : work_ring_idx + 1;
+			}
+			cur_mbstate = tmp_state;
+
+			/* Put a mark on the position on which we write next character.  */
+			work_ring_idx = (work_ring_idx == RING_BUFFER_SIZE - 1)?
+				0 : work_ring_idx + 1;
+			cur_char_ring[work_ring_idx] = 0;
+		}
+		if (check_for_bad || *lexptr == '\0')
+			check_bad_char(*lexptr);
+
+		return (int) (unsigned char) *lexptr++;
+	} else {
+		do {
+#ifdef NO_CONTINUE_SOURCE_STRINGS
+			if (lexeof)
+				return END_FILE;
+#else
+			if (lexeof) {
+				if (sourcefile->next == srcfiles)
+					return END_FILE;
+				else
+					next_sourcefile();
+			}
+#endif
+			if (lexptr && lexptr < lexend) {
+				if (check_for_bad || *lexptr == '\0')
+					check_bad_char(*lexptr);
+				return ((int) (unsigned char) *lexptr++);
+			}
+		} while (get_src_buf());
+		return END_SRC;
+	}
+}
+#undef NO_CONTINUE_SOURCE_STRINGS
+
+/* pushback --- push a character back on the input */
+
+static inline void
+pushback(void)
+{
+	if (gawk_mb_cur_max > 1)
+		cur_ring_idx = (cur_ring_idx == 0)? RING_BUFFER_SIZE - 1 :
+			cur_ring_idx - 1;
+	(! lexeof && lexptr && lexptr > lexptr_begin ? lexptr-- : lexptr);
+}
+
+/*
+ * get_comment --- collect comment text.
+ * 	Flag = EOL_COMMENT for end-of-line comments.
+ * 	Flag = BLOCK_COMMENT for self-contained comments.
+ */
+
+static int
+get_comment(enum commenttype flag, INSTRUCTION **comment_instruction)
+{
+	int c;
+	int sl;
+	char *p1;
+	char *p2;
+
+	tok = tokstart;
+	tokadd('#');
+	sl = sourceline;
+
+	while (true) {
+		while ((c = nextc(false)) != '\n' && c != END_FILE) {
+			/* ignore \r characters */
+			if (c != '\r')
+				tokadd(c);
+		}
+		if (flag == EOL_COMMENT) {
+			/* comment at end of line.  */
+			if (c == '\n')
+				tokadd(c);
+			break;
+		}
+		if (c == '\n') {
+			tokadd(c);
+			sourceline++;
+			do {
+				c = nextc(false);
+				if (c == '\n') {
+					sourceline++;
+					tokadd(c);
+				}
+			} while (isspace(c) && c != END_FILE);
+			if (c == END_FILE)
+				break;
+			else if (c != '#') {
+				pushback();
+				sourceline--;
+				break;
+			} else
+				tokadd(c);
+		} else
+			break;
+	}
+
+	/* remove any trailing blank lines (consecutive \n) from comment */
+	p1 = tok - 1;
+	p2 = tok - 2;
+	while (*p1 == '\n' && *p2 == '\n') {
+		p1--;
+		p2--;
+		tok--;
+	}
+
+	(*comment_instruction) = bcalloc(Op_comment, 1, sl);
+	(*comment_instruction)->source_file = source;
+	(*comment_instruction)->memory = make_str_node(tokstart, tok - tokstart, 0);
+	(*comment_instruction)->memory->comment_type = flag;
+
+	return c;
+}
+
+/* allow_newline --- allow newline after &&, ||, ? and : */
+
+static void
+allow_newline(INSTRUCTION **new_comment)
+{
+	int c;
+
+	for (;;) {
+		c = nextc(true);
+		if (c == END_FILE) {
+			pushback();
+			break;
+		}
+		if (c == '#') {
+			if (do_pretty_print && ! do_profile) {
+				/* collect comment byte code iff doing pretty print but not profiling.  */
+				c = get_comment(EOL_COMMENT, new_comment);
+			} else {
+				while ((c = nextc(false)) != '\n' && c != END_FILE)
+					continue;
+			}
+			if (c == END_FILE) {
+				pushback();
+				break;
+			}
+		}
+		if (c == '\n')
+			sourceline++;
+		if (! isspace(c)) {
+			pushback();
+			break;
+		}
+	}
+}
+
+/* newline_eof --- return newline or EOF as needed and adjust variables */
+
+/*
+ * This routine used to be a macro, however GCC 4.6.2 warned about
+ * the result of a computation not being used.  Converting to a function
+ * removes the warnings.
+ */
+
+static int
+newline_eof()
+{
+	/* NB: a newline at end does not start a source line. */
+	if (lasttok != NEWLINE) {
+                pushback();
+		if (do_lint && ! eof_warned) {
+        		lintwarn(_("source file does not end in newline"));
+			eof_warned = true;
+		}
+		sourceline++;
+		return NEWLINE;
+	}
+
+	sourceline--;
+	eof_warned = false;
+	return LEX_EOF;
+}
+
+/* yylex --- Read the input and turn it into tokens. */
+
+static int
+#ifdef USE_EBCDIC
+yylex_ebcdic(void)
+#else
+yylex(void)
+#endif
+{
+	int c;
+	bool seen_e = false;		/* These are for numbers */
+	bool seen_point = false;
+	bool esc_seen;		/* for literal strings */
+	int mid;
+	int base;
+	static bool did_newline = false;
+	char *tokkey;
+	bool inhex = false;
+	bool intlstr = false;
+	AWKNUM d;
+	bool collecting_typed_regexp = false;
+	static int qm_col_count = 0;
+
+#define GET_INSTRUCTION(op) bcalloc(op, 1, sourceline)
+
+#define NEWLINE_EOF newline_eof()
+
+	yylval = (INSTRUCTION *) NULL;
+	if (lasttok == SUBSCRIPT) {
+		lasttok = 0;
+		return SUBSCRIPT;
+	}
+
+	if (lasttok == LEX_EOF)		/* error earlier in current source, must give up !! */
+		return 0;
+
+	c = nextc(! want_regexp);
+	if (c == END_SRC)
+		return 0;
+	if (c == END_FILE)
+		return lasttok = NEWLINE_EOF;
+	pushback();
+
+#if defined __EMX__
+	/*
+	 * added for OS/2's extproc feature of cmd.exe
+	 * (like #! in BSD sh)
+	 */
+	if (strncasecmp(lexptr, "extproc ", 8) == 0) {
+		while (*lexptr && *lexptr != '\n')
+			lexptr++;
+	}
+#endif
+
+	lexeme = lexptr;
+	thisline = NULL;
+
+collect_regexp:
+	if (want_regexp) {
+		int in_brack = 0;	/* count brackets, [[:alnum:]] allowed */
+		int b_index = -1;
+		int cur_index = 0;
+
+		/*
+		 * Here is what's ok with brackets:
+		 *
+		 * [..[..] []] [^]] [.../...]
+		 * [...\[...] [...\]...] [...\/...]
+		 *
+		 * (Remember that all of the above are inside /.../)
+		 *
+		 * The code for \ handles \[, \] and \/.
+		 *
+		 * Otherwise, track the first open [ position, and if
+		 * an embedded ] occurs, allow it to pass through
+		 * if it's right after the first [ or after [^.
+		 *
+		 * Whew!
+		 */
+
+		want_regexp = false;
+		tok = tokstart;
+		for (;;) {
+			c = nextc(false);
+
+			cur_index = tok - tokstart;
+			if (gawk_mb_cur_max == 1 || nextc_is_1stbyte) switch (c) {
+			case '[':
+				if (nextc(false) == ':' || in_brack == 0) {
+					in_brack++;
+					if (in_brack == 1)
+						b_index = tok - tokstart;
+				}
+				pushback();
+				break;
+			case ']':
+				if (in_brack > 0
+				    && (cur_index == b_index + 1
+					|| (cur_index == b_index + 2 && tok[-1] == '^')))
+					; /* do nothing */
+				else {
+					in_brack--;
+					if (in_brack == 0)
+						b_index = -1;
+				}
+				break;
+			case '\\':
+				if ((c = nextc(false)) == END_FILE) {
+					pushback();
+					yyerror(_("unterminated regexp ends with `\\' at end of file"));
+					goto end_regexp; /* kludge */
+				}
+				if (c == '\r')	/* allow MS-DOS files. bleah */
+					c = nextc(true);
+				if (c == '\n') {
+					sourceline++;
+					continue;
+				} else {
+					tokadd('\\');
+					tokadd(c);
+					continue;
+				}
+				break;
+			case '/':	/* end of the regexp */
+				if (in_brack > 0)
+					break;
+end_regexp:
+				yylval = GET_INSTRUCTION(Op_token);
+				yylval->lextok = estrdup(tokstart, tok - tokstart);
+				if (do_lint) {
+					int peek = nextc(true);
+
+					pushback();
+					if (peek == 'i' || peek == 's') {
+						if (source)
+							lintwarn(
+						_("%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"),
+								source, sourceline, peek);
+						else
+							lintwarn(
+						_("tawk regex modifier `/.../%c' doesn't work in gawk"),
+								peek);
+					}
+				}
+				if (collecting_typed_regexp) {
+					collecting_typed_regexp = false;
+					lasttok = TYPED_REGEXP;
+				} else
+					lasttok = REGEXP;
+
+				return lasttok;
+			case '\n':
+				pushback();
+				yyerror(_("unterminated regexp"));
+				goto end_regexp;	/* kludge */
+			case END_FILE:
+				pushback();
+				yyerror(_("unterminated regexp at end of file"));
+				goto end_regexp;	/* kludge */
+			}
+			tokadd(c);
+		}
+	}
+retry:
+
+	/* skipping \r is a hack, but windows is just too pervasive. sigh. */
+	while ((c = nextc(true)) == ' ' || c == '\t' || c == '\r')
+		continue;
+
+	lexeme = lexptr ? lexptr - 1 : lexptr;
+	thisline = NULL;
+	tok = tokstart;
+
+	if (gawk_mb_cur_max == 1 || nextc_is_1stbyte)
+	switch (c) {
+	case END_SRC:
+		return 0;
+
+	case END_FILE:
+		return lasttok = NEWLINE_EOF;
+
+	case '\n':
+		sourceline++;
+		return lasttok = NEWLINE;
+
+	case '#':		/* it's a comment */
+		yylval = NULL;
+		if (do_pretty_print && ! do_profile) {
+			/*
+			 * Collect comment byte code iff doing pretty print
+			 * but not profiling.
+			 */
+			INSTRUCTION *new_comment;
+
+			if (lasttok == NEWLINE || lasttok == 0)
+				c = get_comment(BLOCK_COMMENT, & new_comment);
+			else
+				c = get_comment(EOL_COMMENT, & new_comment);
+
+			yylval = new_comment;
+
+			if (c == END_FILE) {
+				pushback();
+				return lasttok = NEWLINE;
+			}
+		} else {
+			while ((c = nextc(false)) != '\n') {
+				if (c == END_FILE)
+					return lasttok = NEWLINE_EOF;
+			}
+		}
+		sourceline++;
+		return lasttok = NEWLINE;
+
+	case '@':
+		c = nextc(true);
+		if (c == '/') {
+			want_regexp = true;
+			collecting_typed_regexp = true;
+			goto collect_regexp;
+		}
+		pushback();
+		at_seen = true;
+		return lasttok = '@';
+
+	case '\\':
+#ifdef RELAXED_CONTINUATION
+		/*
+		 * This code purports to allow comments and/or whitespace
+		 * after the `\' at the end of a line used for continuation.
+		 * Use it at your own risk. We think it's a bad idea, which
+		 * is why it's not on by default.
+		 */
+		yylval = NULL;
+		if (! do_traditional) {
+			INSTRUCTION *new_comment;
+
+			/* strip trailing white-space and/or comment */
+			while ((c = nextc(true)) == ' ' || c == '\t' || c == '\r')
+				continue;
+			if (c == '#') {
+				static bool warned = false;
+
+				if (do_lint && ! warned) {
+					warned = true;
+					lintwarn(
+		_("use of `\\ #...' line continuation is not portable"));
+				}
+				if (do_pretty_print && ! do_profile) {
+					c = get_comment(EOL_COMMENT, & new_comment);
+					yylval = new_comment;
+					return lasttok = c;
+				} else {
+					while ((c = nextc(false)) != '\n')
+						if (c == END_FILE)
+							break;
+				}
+			}
+			pushback();
+		}
+#endif /* RELAXED_CONTINUATION */
+		c = nextc(true);
+		if (c == '\r')	/* allow MS-DOS files. bleah */
+			c = nextc(true);
+		if (c == '\n') {
+			sourceline++;
+			goto retry;
+		} else {
+			yyerror(_("backslash not last character on line"));
+			return lasttok = LEX_EOF;
+		}
+		break;
+
+	case '?':
+		qm_col_count++;
+		// fall through
+	case ':':
+		yylval = GET_INSTRUCTION(Op_cond_exp);
+		if (qm_col_count > 0) {
+			if (! do_posix) {
+				INSTRUCTION *new_comment = NULL;
+				allow_newline(& new_comment);
+				yylval->comment = new_comment;
+			}
+			if (c == ':')
+				qm_col_count--;
+		}
+		return lasttok = c;
+
+		/*
+		 * in_parens is undefined unless we are parsing a print
+		 * statement (in_print), but why bother with a check?
+		 */
+	case ')':
+		in_parens--;
+		return lasttok = c;
+
+	case '(':
+		in_parens++;
+		return lasttok = c;
+	case '$':
+		yylval = GET_INSTRUCTION(Op_field_spec);
+		return lasttok = c;
+	case '{':
+		if (++in_braces == 1)
+			firstline = sourceline;
+	case ';':
+	case ',':
+	case '[':
+			return lasttok = c;
+	case ']':
+		c = nextc(true);
+		pushback();
+		if (c == '[') {
+			if (do_traditional)
+				fatal(_("multidimensional arrays are a gawk extension"));
+			if (do_lint)
+				lintwarn(_("multidimensional arrays are a gawk extension"));
+			yylval = GET_INSTRUCTION(Op_sub_array);
+			lasttok = ']';
+		} else {
+			yylval = GET_INSTRUCTION(Op_subscript);
+			lasttok = SUBSCRIPT;	/* end of subscripts */
+		}
+		return ']';
+
+	case '*':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_assign_times);
+			return lasttok = ASSIGNOP;
+		} else if (do_posix) {
+			pushback();
+			yylval = GET_INSTRUCTION(Op_times);
+			return lasttok = '*';
+		} else if (c == '*') {
+			/* make ** and **= aliases for ^ and ^= */
+			static bool did_warn_op = false, did_warn_assgn = false;
+
+			if (nextc(true) == '=') {
+				if (! did_warn_assgn) {
+					did_warn_assgn = true;
+					if (do_lint)
+						lintwarn(_("POSIX does not allow operator `**='"));
+					if (do_lint_old)
+						warning(_("old awk does not support operator `**='"));
+				}
+				yylval = GET_INSTRUCTION(Op_assign_exp);
+				return ASSIGNOP;
+			} else {
+				pushback();
+				if (! did_warn_op) {
+					did_warn_op = true;
+					if (do_lint)
+						lintwarn(_("POSIX does not allow operator `**'"));
+					if (do_lint_old)
+						warning(_("old awk does not support operator `**'"));
+				}
+				yylval = GET_INSTRUCTION(Op_exp);
+				return lasttok = '^';
+			}
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_times);
+		return lasttok = '*';
+
+	case '/':
+		if (nextc(false) == '=') {
+			pushback();
+			return lasttok = SLASH_BEFORE_EQUAL;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_quotient);
+		return lasttok = '/';
+
+	case '%':
+		if (nextc(true) == '=') {
+			yylval = GET_INSTRUCTION(Op_assign_mod);
+			return lasttok = ASSIGNOP;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_mod);
+		return lasttok = '%';
+
+	case '^':
+	{
+		static bool did_warn_op = false, did_warn_assgn = false;
+
+		if (nextc(true) == '=') {
+			if (do_lint_old && ! did_warn_assgn) {
+				did_warn_assgn = true;
+				warning(_("operator `^=' is not supported in old awk"));
+			}
+			yylval = GET_INSTRUCTION(Op_assign_exp);
+			return lasttok = ASSIGNOP;
+		}
+		pushback();
+		if (do_lint_old && ! did_warn_op) {
+			did_warn_op = true;
+			warning(_("operator `^' is not supported in old awk"));
+		}
+		yylval = GET_INSTRUCTION(Op_exp);
+		return lasttok = '^';
+	}
+
+	case '+':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_assign_plus);
+			return lasttok = ASSIGNOP;
+		}
+		if (c == '+') {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			return lasttok = INCREMENT;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_plus);
+		return lasttok = '+';
+
+	case '!':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_notequal);
+			return lasttok = RELOP;
+		}
+		if (c == '~') {
+			yylval = GET_INSTRUCTION(Op_nomatch);
+			return lasttok = MATCHOP;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_symbol);
+		return lasttok = '!';
+
+	case '<':
+		if (nextc(true) == '=') {
+			yylval = GET_INSTRUCTION(Op_leq);
+			return lasttok = RELOP;
+		}
+		yylval = GET_INSTRUCTION(Op_less);
+		pushback();
+		return lasttok = '<';
+
+	case '=':
+		if (nextc(true) == '=') {
+			yylval = GET_INSTRUCTION(Op_equal);
+			return lasttok = RELOP;
+		}
+		yylval = GET_INSTRUCTION(Op_assign);
+		pushback();
+		return lasttok = ASSIGN;
+
+	case '>':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_geq);
+			return lasttok = RELOP;
+		} else if (c == '>') {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_append;
+			return lasttok = IO_OUT;
+		}
+		pushback();
+		if (in_print && in_parens == 0) {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_output;
+			return lasttok = IO_OUT;
+		}
+		yylval = GET_INSTRUCTION(Op_greater);
+		return lasttok = '>';
+
+	case '~':
+		yylval = GET_INSTRUCTION(Op_match);
+		return lasttok = MATCHOP;
+
+	case '}':
+		/*
+		 * Added did newline stuff.  Easier than
+		 * hacking the grammar.
+		 */
+		if (did_newline) {
+			did_newline = false;
+			if (--in_braces == 0)
+				lastline = sourceline;
+			return lasttok = c;
+		}
+		did_newline = true;
+		--lexptr;	/* pick up } next time */
+		return lasttok = NEWLINE;
+
+	case '"':
+	string:
+		esc_seen = false;
+		/*
+		 * Allow any kind of junk in quoted string,
+		 * so pass false to nextc().
+		 */
+		while ((c = nextc(false)) != '"') {
+			if (c == '\n') {
+				pushback();
+				yyerror(_("unterminated string"));
+				return lasttok = LEX_EOF;
+			}
+			if ((gawk_mb_cur_max == 1 || nextc_is_1stbyte) &&
+			    c == '\\') {
+				c = nextc(true);
+				if (c == '\r')	/* allow MS-DOS files. bleah */
+					c = nextc(true);
+				if (c == '\n') {
+					if (do_posix)
+						fatal(_("POSIX does not allow physical newlines in string values"));
+					else if (do_lint)
+						lintwarn(_("backslash string continuation is not portable"));
+					sourceline++;
+					continue;
+				}
+				esc_seen = true;
+				if (! want_source || c != '"')
+					tokadd('\\');
+			}
+			if (c == END_FILE) {
+				pushback();
+				yyerror(_("unterminated string"));
+				return lasttok = LEX_EOF;
+			}
+			tokadd(c);
+		}
+		yylval = GET_INSTRUCTION(Op_token);
+		if (want_source) {
+			yylval->lextok = estrdup(tokstart, tok - tokstart);
+			return lasttok = FILENAME;
+		}
+
+		yylval->opcode = Op_push_i;
+		yylval->memory = make_str_node(tokstart,
+					tok - tokstart, esc_seen ? SCAN : 0);
+		if (intlstr) {
+			yylval->memory->flags |= INTLSTR;
+			intlstr = false;
+			if (do_intl)
+				dumpintlstr(yylval->memory->stptr, yylval->memory->stlen);
+		}
+		return lasttok = YSTRING;
+
+	case '-':
+		if ((c = nextc(true)) == '=') {
+			yylval = GET_INSTRUCTION(Op_assign_minus);
+			return lasttok = ASSIGNOP;
+		}
+		if (c == '-') {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			return lasttok = DECREMENT;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_minus);
+		return lasttok = '-';
+
+	case '.':
+		c = nextc(true);
+		pushback();
+		if (! isdigit(c))
+			return lasttok = '.';
+		else
+			c = '.';
+		/* FALL THROUGH */
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+		/* It's a number */
+		for (;;) {
+			bool gotnumber = false;
+
+			tokadd(c);
+			switch (c) {
+			case 'x':
+			case 'X':
+				if (do_traditional)
+					goto done;
+				if (tok == tokstart + 2) {
+					int peek = nextc(true);
+
+					if (isxdigit(peek)) {
+						inhex = true;
+						pushback();	/* following digit */
+					} else {
+						pushback();	/* x or X */
+						goto done;
+					}
+				}
+				break;
+			case '.':
+				/* period ends exponent part of floating point number */
+				if (seen_point || seen_e) {
+					gotnumber = true;
+					break;
+				}
+				seen_point = true;
+				break;
+			case 'e':
+			case 'E':
+				if (inhex)
+					break;
+				if (seen_e) {
+					gotnumber = true;
+					break;
+				}
+				seen_e = true;
+				if ((c = nextc(true)) == '-' || c == '+') {
+					int c2 = nextc(true);
+
+					if (isdigit(c2)) {
+						tokadd(c);
+						tokadd(c2);
+					} else {
+						pushback();	/* non-digit after + or - */
+						pushback();	/* + or - */
+						pushback();	/* e or E */
+					}
+				} else if (! isdigit(c)) {
+					pushback();	/* character after e or E */
+					pushback();	/* e or E */
+				} else {
+					pushback();	/* digit */
+				}
+				break;
+			case 'a':
+			case 'A':
+			case 'b':
+			case 'B':
+			case 'c':
+			case 'C':
+			case 'D':
+			case 'd':
+			case 'f':
+			case 'F':
+				if (do_traditional || ! inhex)
+					goto done;
+				/* fall through */
+			case '0':
+			case '1':
+			case '2':
+			case '3':
+			case '4':
+			case '5':
+			case '6':
+			case '7':
+			case '8':
+			case '9':
+				break;
+			default:
+			done:
+				gotnumber = true;
+			}
+			if (gotnumber)
+				break;
+			c = nextc(true);
+		}
+		pushback();
+
+		tokadd('\0');
+		yylval = GET_INSTRUCTION(Op_push_i);
+
+		base = 10;
+		if (! do_traditional) {
+			base = get_numbase(tokstart, strlen(tokstart)-1, false);
+			if (do_lint) {
+				if (base == 8)
+					lintwarn("numeric constant `%.*s' treated as octal",
+						(int) strlen(tokstart)-1, tokstart);
+				else if (base == 16)
+					lintwarn("numeric constant `%.*s' treated as hexadecimal",
+						(int) strlen(tokstart)-1, tokstart);
+			}
+		}
+
+#ifdef HAVE_MPFR
+		if (do_mpfr) {
+			NODE *r;
+
+			if (! seen_point && ! seen_e) {
+				r = mpg_integer();
+				mpg_strtoui(r->mpg_i, tokstart, strlen(tokstart), NULL, base);
+				errno = 0;
+			} else {
+				int tval;
+				r = mpg_float();
+				tval = mpfr_strtofr(r->mpg_numbr, tokstart, NULL, base, ROUND_MODE);
+				errno = 0;
+				IEEE_FMT(r->mpg_numbr, tval);
+			}
+			yylval->memory = set_profile_text(r, tokstart, strlen(tokstart)-1);
+			return lasttok = YNUMBER;
+		}
+#endif
+		if (base != 10)
+			d = nondec2awknum(tokstart, strlen(tokstart)-1, NULL);
+		else
+			d = atof(tokstart);
+		yylval->memory = set_profile_text(make_number(d), tokstart, strlen(tokstart) - 1);
+		if (d <= INT32_MAX && d >= INT32_MIN && d == (int32_t) d)
+			yylval->memory->flags |= NUMINT;
+		return lasttok = YNUMBER;
+
+	case '&':
+		if ((c = nextc(true)) == '&') {
+			yylval = GET_INSTRUCTION(Op_and);
+			INSTRUCTION *new_comment = NULL;
+			allow_newline(& new_comment);
+			yylval->comment = new_comment;
+
+			return lasttok = LEX_AND;
+		}
+		pushback();
+		yylval = GET_INSTRUCTION(Op_symbol);
+		return lasttok = '&';
+
+	case '|':
+		if ((c = nextc(true)) == '|') {
+			yylval = GET_INSTRUCTION(Op_or);
+			INSTRUCTION *new_comment = NULL;
+			allow_newline(& new_comment);
+			yylval->comment = new_comment;
+
+			return lasttok = LEX_OR;
+		} else if (! do_traditional && c == '&') {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_twoway;
+
+			return lasttok = (in_print && in_parens == 0 ? IO_OUT : IO_IN);
+		}
+		pushback();
+		if (in_print && in_parens == 0) {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_pipe;
+			return lasttok = IO_OUT;
+		} else {
+			yylval = GET_INSTRUCTION(Op_symbol);
+			yylval->redir_type = redirect_pipein;
+			return lasttok = IO_IN;
+		}
+	}
+
+	if (! is_letter(c)) {
+		yyerror(_("invalid char '%c' in expression"), c);
+		return lasttok = LEX_EOF;
+	}
+
+	/*
+	 * Lots of fog here.  Consider:
+	 *
+	 * print "xyzzy"$_"foo"
+	 *
+	 * Without the check for ` lasttok != '$' ', this is parsed as
+	 *
+	 * print "xxyzz" $(_"foo")
+	 *
+	 * With the check, it is "correctly" parsed as three
+	 * string concatenations.  Sigh.  This seems to be
+	 * "more correct", but this is definitely one of those
+	 * occasions where the interactions are funny.
+	 */
+	if (! do_traditional && c == '_' && lasttok != '$') {
+		if ((c = nextc(true)) == '"') {
+			intlstr = true;
+			goto string;
+		}
+		pushback();
+		c = '_';
+	}
+
+	/* it's some type of name-type-thing.  Find its length. */
+	tok = tokstart;
+	while (c != END_FILE && is_identchar(c)) {
+		tokadd(c);
+		c = nextc(true);
+
+		if (! do_traditional && c == ':') {
+			int peek = nextc(true);
+
+			if (peek == ':') {	// saw identifier::
+				tokadd(c);
+				tokadd(c);
+				c = nextc(true);
+			} else
+				pushback();
+				// then continue around the loop, c == ':'
+		}
+	}
+	tokadd('\0');
+	pushback();
+
+	(void) validate_qualified_name(tokstart);
+
+	/* See if it is a special token. */
+	if ((mid = check_qualified_special(tokstart)) >= 0) {
+		static int warntab[sizeof(tokentab) / sizeof(tokentab[0])];
+		int class = tokentab[mid].class;
+
+		switch (class) {
+		case LEX_EVAL:
+		case LEX_INCLUDE:
+		case LEX_LOAD:
+		case LEX_NAMESPACE:
+			if (lasttok != '@')
+				goto out;
+		default:
+			break;
+		}
+
+		/* allow parameter names to shadow the names of gawk extension built-ins */
+		if ((tokentab[mid].flags & GAWKX) != 0) {
+			NODE *f;
+
+			switch (want_param_names) {
+			case FUNC_HEADER:
+				/* in header, defining parameter names */
+				goto out;
+			case FUNC_BODY:
+				/* in body, name must be in symbol table for it to be a parameter */
+				if ((f = lookup(tokstart)) != NULL) {
+					if (f->type == Node_builtin_func)
+						break;
+					else
+						goto out;
+				}
+				/* else
+					fall through */
+			case DONT_CHECK:
+				/* regular code */
+				break;
+			default:
+				cant_happen();
+				break;
+			}
+		}
+
+		if (do_lint) {
+			if (do_lint_extensions && (tokentab[mid].flags & GAWKX) != 0 && (warntab[mid] & GAWKX) == 0) {
+				lintwarn(_("`%s' is a gawk extension"),
+					tokentab[mid].operator);
+				warntab[mid] |= GAWKX;
+			}
+			if ((tokentab[mid].flags & NOT_POSIX) != 0 && (warntab[mid] & NOT_POSIX) == 0) {
+				lintwarn(_("POSIX does not allow `%s'"),
+					tokentab[mid].operator);
+				warntab[mid] |= NOT_POSIX;
+			}
+		}
+		if (do_lint_old && (tokentab[mid].flags & NOT_OLD) != 0
+				 && (warntab[mid] & NOT_OLD) == 0
+		) {
+			warning(_("`%s' is not supported in old awk"),
+					tokentab[mid].operator);
+			warntab[mid] |= NOT_OLD;
+		}
+
+		if ((tokentab[mid].flags & BREAK) != 0)
+			break_allowed++;
+		if ((tokentab[mid].flags & CONTINUE) != 0)
+			continue_allowed++;
+
+		switch (class) {
+		case LEX_NAMESPACE:
+		case LEX_INCLUDE:
+		case LEX_LOAD:
+			want_source = true;
+			break;
+		case LEX_EVAL:
+			if (in_main_context())
+				goto out;
+			emalloc(tokkey, char *, tok - tokstart + 1, "yylex");
+			tokkey[0] = '@';
+			memcpy(tokkey + 1, tokstart, tok - tokstart);
+			yylval = GET_INSTRUCTION(Op_token);
+			yylval->lextok = tokkey;
+			break;
+
+		case LEX_FUNCTION:
+		case LEX_BEGIN:
+		case LEX_END:
+		case LEX_BEGINFILE:
+		case LEX_ENDFILE:
+			yylval = bcalloc(tokentab[mid].value, 4, sourceline);
+			break;
+
+		case LEX_FOR:
+		case LEX_WHILE:
+		case LEX_DO:
+		case LEX_SWITCH:
+			if (! do_pretty_print)
+				return lasttok = class;
+			/* fall through */
+		case LEX_CASE:
+			yylval = bcalloc(tokentab[mid].value, 2, sourceline);
+			break;
+
+		/*
+		 * These must be checked here, due to the LALR nature of the parser,
+		 * the rules for continue and break may not be reduced until after
+		 * a token that increments the xxx_allowed varibles is seen. Bleah.
+		 */
+		case LEX_CONTINUE:
+			if (! continue_allowed) {
+				error_ln(sourceline,
+					_("`continue' is not allowed outside a loop"));
+				errcount++;
+			}
+			goto make_instruction;
+
+		case LEX_BREAK:
+			if (! break_allowed) {
+				error_ln(sourceline,
+					_("`break' is not allowed outside a loop or switch"));
+				errcount++;
+			}
+			goto make_instruction;
+
+		default:
+make_instruction:
+			yylval = GET_INSTRUCTION(tokentab[mid].value);
+			if (class == LEX_BUILTIN || class == LEX_LENGTH)
+				yylval->builtin_idx = mid;
+			break;
+		}
+		return lasttok = class;
+	}
+out:
+	if (want_param_names == FUNC_HEADER)
+		tokkey = estrdup(tokstart, tok - tokstart - 1);
+	else
+		tokkey = qualify_name(tokstart, tok - tokstart - 1);
+
+	if (*lexptr == '(') {
+		yylval = bcalloc(Op_token, 2, sourceline);
+		yylval->lextok = tokkey;
+		return lasttok = FUNC_CALL;
+	} else {
+		static bool goto_warned = false;
+
+		yylval = GET_INSTRUCTION(Op_token);
+		yylval->lextok = tokkey;
+
+#define SMART_ALECK	1
+		if (SMART_ALECK
+		    && do_lint
+		    && ! goto_warned
+		    && tolower(tokkey[0]) == 'g'
+		    && strcasecmp(tokkey, "goto") == 0) {
+			goto_warned = true;
+			lintwarn(_("`goto' considered harmful!"));
+		}
+		return lasttok = NAME;
+	}
+
+#undef GET_INSTRUCTION
+#undef NEWLINE_EOF
+}
+
+/* It's EBCDIC in a Bison grammar, run for the hills!
+
+   Or, convert single-character tokens coming out of yylex() from EBCDIC to
+   ASCII values on-the-fly so that the parse tables need not be regenerated
+   for EBCDIC systems.  */
+#ifdef USE_EBCDIC
+static int
+yylex(void)
+{
+	static char etoa_xlate[256];
+	static bool do_etoa_init = true;
+	int tok;
+
+	if (do_etoa_init)
+	{
+		for (tok = 0; tok < 256; tok++)
+			etoa_xlate[tok] = (char) tok;
+#ifdef HAVE___ETOA_L
+		/* IBM helpfully provides this function.  */
+		__etoa_l(etoa_xlate, sizeof(etoa_xlate));
+#else
+# error "An EBCDIC-to-ASCII translation function is needed for this system"
+#endif
+		do_etoa_init = false;
+	}
+
+	tok = yylex_ebcdic();
+
+	if (tok >= 0 && tok <= 0xFF)
+		tok = etoa_xlate[tok];
+
+	return tok;
+}
+#endif /* USE_EBCDIC */
+
+/* snode --- instructions for builtin functions. Checks for arg. count
+             and supplies defaults where possible. */
+
+static INSTRUCTION *
+snode(INSTRUCTION *subn, INSTRUCTION *r)
+{
+	INSTRUCTION *arg;
+	INSTRUCTION *ip;
+	NODE *n;
+	int nexp = 0;
+	int args_allowed;
+	int idx = r->builtin_idx;
+
+	if (subn != NULL) {
+		INSTRUCTION *tp;
+		for (tp = subn->nexti; tp; tp = tp->nexti) {
+			tp = tp->lasti;
+			nexp++;
+		}
+		assert(nexp > 0);
+	}
+
+	/* check against how many args. are allowed for this builtin */
+	args_allowed = tokentab[idx].flags & ARGS;
+	if (args_allowed && (args_allowed & A(nexp)) == 0) {
+		yyerror(_("%d is invalid as number of arguments for %s"),
+				nexp, tokentab[idx].operator);
+		return NULL;
+	}
+
+	/* special processing for sub, gsub and gensub */
+
+	if (tokentab[idx].value == Op_sub_builtin) {
+		const char *operator = tokentab[idx].operator;
+
+		r->sub_flags = 0;
+
+		arg = subn->nexti;		/* first arg list */
+		(void) mk_rexp(arg);
+
+		if (strcmp(operator, "gensub") != 0) {
+			/* sub and gsub */
+
+			if (strcmp(operator, "gsub") == 0)
+				r->sub_flags |= GSUB;
+
+			arg = arg->lasti->nexti;	/* 2nd arg list */
+			if (nexp == 2) {
+				INSTRUCTION *expr;
+
+				expr = list_create(instruction(Op_push_i));
+				expr->nexti->memory = set_profile_text(make_number(0.0), "0", 1);
+				(void) mk_expression_list(subn,
+						list_append(expr, instruction(Op_field_spec)));
+			}
+
+			arg = arg->lasti->nexti; 	/* third arg list */
+			ip = arg->lasti;
+			if (ip->opcode == Op_push_i) {
+				if (do_lint)
+					lintwarn(_("%s: string literal as last arg of substitute has no effect"),
+						operator);
+				r->sub_flags |=	LITERAL;
+			} else {
+				if (make_assignable(ip) == NULL)
+					yyerror(_("%s third parameter is not a changeable object"),
+						operator);
+				else
+					ip->do_reference = true;
+			}
+
+			r->expr_count = count_expressions(&subn, false);
+			ip = subn->lasti;
+
+			(void) list_append(subn, r);
+
+			/* add after_assign code */
+			if (ip->opcode == Op_push_lhs && ip->memory->type == Node_var && ip->memory->var_assign) {
+				(void) list_append(subn, instruction(Op_var_assign));
+				subn->lasti->assign_ctxt = Op_sub_builtin;
+				subn->lasti->assign_var = ip->memory->var_assign;
+			} else if (ip->opcode == Op_field_spec_lhs) {
+				(void) list_append(subn, instruction(Op_field_assign));
+				subn->lasti->assign_ctxt = Op_sub_builtin;
+				subn->lasti->field_assign = (Func_ptr) 0;
+				ip->target_assign = subn->lasti;
+			} else if (ip->opcode == Op_subscript_lhs) {
+				(void) list_append(subn, instruction(Op_subscript_assign));
+				subn->lasti->assign_ctxt = Op_sub_builtin;
+			}
+
+			return subn;
+
+		} else {
+			/* gensub */
+
+			r->sub_flags |= GENSUB;
+			if (nexp == 3) {
+				ip = instruction(Op_push_i);
+				ip->memory = set_profile_text(make_number(0.0), "0", 1);
+				(void) mk_expression_list(subn,
+						list_append(list_create(ip), instruction(Op_field_spec)));
+			}
+
+			r->expr_count = count_expressions(&subn, false);
+			return list_append(subn, r);
+		}
+	}
+
+#ifdef HAVE_MPFR
+	/* N.B.: If necessary, add special processing for alternate builtin, below */
+	if (do_mpfr && tokentab[idx].ptr2)
+		r->builtin =  tokentab[idx].ptr2;
+	else
+#endif
+		r->builtin = tokentab[idx].ptr;
+
+	/* special case processing for a few builtins */
+
+	if (r->builtin == do_length) {
+		if (nexp == 0) {
+		    /* no args. Use $0 */
+
+			INSTRUCTION *list;
+			r->expr_count = 1;
+			list = list_create(r);
+			(void) list_prepend(list, instruction(Op_field_spec));
+			(void) list_prepend(list, instruction(Op_push_i));
+			list->nexti->memory = set_profile_text(make_number(0.0), "0", 1);
+			return list;
+		} else {
+			arg = subn->nexti;
+			if (arg->nexti == arg->lasti && arg->nexti->opcode == Op_push)
+				arg->nexti->opcode = Op_push_arg;	/* argument may be array */
+ 		}
+	} else if (r->builtin == do_isarray) {
+		arg = subn->nexti;
+		if (arg->nexti == arg->lasti && arg->nexti->opcode == Op_push)
+			arg->nexti->opcode = Op_push_arg_untyped;	/* argument may be untyped */
+	} else if (r->builtin == do_typeof) {
+		arg = subn->nexti;
+		if (arg->nexti == arg->lasti && arg->nexti->opcode == Op_push)
+			arg->nexti->opcode = Op_push_arg_untyped;	/* argument may be untyped */
+		if (nexp == 2) {	/* 2nd argument there */
+			arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+			ip = arg->lasti;
+			if (ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+#ifdef SUPPLY_INTDIV
+	} else if (r->builtin == do_intdiv
+#ifdef HAVE_MPFR
+		   || r->builtin == MPF(intdiv)
+#endif
+			) {
+		arg = subn->nexti->lasti->nexti->lasti->nexti;	/* 3rd arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+#endif /* SUPPLY_INTDIV */
+	} else if (r->builtin == do_match) {
+		static bool warned = false;
+
+		arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+		(void) mk_rexp(arg);
+
+		if (nexp == 3) {	/* 3rd argument there */
+			if (do_lint_extensions && ! warned) {
+				warned = true;
+				lintwarn(_("match: third argument is a gawk extension"));
+			}
+			if (do_traditional) {
+				yyerror(_("match: third argument is a gawk extension"));
+				return NULL;
+			}
+
+			arg = arg->lasti->nexti; 	/* third arg list */
+			ip = arg->lasti;
+			if (/*ip == arg->nexti  && */ ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+	} else if (r->builtin == do_split) {
+		arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+		if (nexp == 2) {
+			INSTRUCTION *expr;
+			expr = list_create(instruction(Op_push));
+			expr->nexti->memory = FS_node;
+			(void) mk_expression_list(subn, expr);
+		}
+		arg = arg->lasti->nexti;
+		n = mk_rexp(arg);
+		if (nexp == 2)
+			n->re_flags |= FS_DFLT;
+		if (nexp == 4) {
+			arg = arg->lasti->nexti;
+			ip = arg->lasti;
+			if (ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+	} else if (r->builtin == do_patsplit) {
+		arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+		if (nexp == 2) {
+			INSTRUCTION *expr;
+			expr = list_create(instruction(Op_push));
+			expr->nexti->memory = FPAT_node;
+			(void) mk_expression_list(subn, expr);
+		}
+		arg = arg->lasti->nexti;
+		n = mk_rexp(arg);
+		if (nexp == 4) {
+			arg = arg->lasti->nexti;
+			ip = arg->lasti;
+			if (ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+	} else if (r->builtin == do_close) {
+		static bool warned = false;
+		if (nexp == 2) {
+			if (do_lint_extensions && ! warned) {
+				warned = true;
+				lintwarn(_("close: second argument is a gawk extension"));
+			}
+			if (do_traditional) {
+				yyerror(_("close: second argument is a gawk extension"));
+				return NULL;
+			}
+		}
+	} else if (do_intl					/* --gen-po */
+			&& r->builtin == do_dcgettext		/* dcgettext(...) */
+			&& subn->nexti->lasti->opcode == Op_push_i	/* 1st arg is constant */
+			&& (subn->nexti->lasti->memory->flags & STRING) != 0) {	/* it's a string constant */
+		/* ala xgettext, dcgettext("some string" ...) dumps the string */
+		NODE *str = subn->nexti->lasti->memory;
+
+		if ((str->flags & INTLSTR) != 0)
+			warning(_("use of dcgettext(_\"...\") is incorrect: remove leading underscore"));
+			/* don't dump it, the lexer already did */
+		else
+			dumpintlstr(str->stptr, str->stlen);
+	} else if (do_intl					/* --gen-po */
+			&& r->builtin == do_dcngettext		/* dcngettext(...) */
+			&& subn->nexti->lasti->opcode == Op_push_i	/* 1st arg is constant */
+			&& (subn->nexti->lasti->memory->flags & STRING) != 0	/* it's a string constant */
+			&& subn->nexti->lasti->nexti->lasti->opcode == Op_push_i	/* 2nd arg is constant too */
+			&& (subn->nexti->lasti->nexti->lasti->memory->flags & STRING) != 0) {	/* it's a string constant */
+		/* ala xgettext, dcngettext("some string", "some plural" ...) dumps the string */
+		NODE *str1 = subn->nexti->lasti->memory;
+		NODE *str2 = subn->nexti->lasti->nexti->lasti->memory;
+
+		if (((str1->flags | str2->flags) & INTLSTR) != 0)
+			warning(_("use of dcngettext(_\"...\") is incorrect: remove leading underscore"));
+		else
+			dumpintlstr2(str1->stptr, str1->stlen, str2->stptr, str2->stlen);
+	} else if (r->builtin == do_asort || r->builtin == do_asorti) {
+		arg = subn->nexti;	/* 1st arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+		if (nexp >= 2) {
+			arg = ip->nexti;
+			ip = arg->lasti;
+			if (ip->opcode == Op_push)
+				ip->opcode = Op_push_array;
+		}
+	}
+	else if (r->builtin == do_index) {
+		arg = subn->nexti->lasti->nexti;	/* 2nd arg list */
+		ip = arg->lasti;
+		if (ip->opcode == Op_match_rec || ip->opcode == Op_push_re)
+			fatal(_("index: regexp constant as second argument is not allowed"));
+	}
+#ifdef ARRAYDEBUG
+	else if (r->builtin == do_adump) {
+		ip = subn->nexti->lasti;
+		if (ip->opcode == Op_push)
+			ip->opcode = Op_push_array;
+	}
+#endif
+
+	if (subn != NULL) {
+		r->expr_count = count_expressions(&subn, false);
+		return list_append(subn, r);
+	}
+
+	r->expr_count = 0;
+	return list_create(r);
+}
+
+
+/* parms_shadow --- check if parameters shadow globals */
+
+static int
+parms_shadow(INSTRUCTION *pc, bool *shadow)
+{
+	int pcount, i;
+	bool ret = false;
+	NODE *func, *fp;
+	char *fname;
+
+	func = pc->func_body;
+	fname = func->vname;
+	fp = func->fparms;
+
+#if 0	/* can't happen, already exited if error ? */
+	if (fname == NULL || func == NULL)	/* error earlier */
+		return false;
+#endif
+
+	pcount = func->param_cnt;
+
+	if (pcount == 0)		/* no args, no problem */
+		return 0;
+
+	source = pc->source_file;
+	sourceline = pc->source_line;
+	/*
+	 * Use warning() and not lintwarn() so that can warn
+	 * about all shadowed parameters.
+	 */
+	for (i = 0; i < pcount; i++) {
+		if (lookup(fp[i].param) != NULL) {
+			warning(
+	_("function `%s': parameter `%s' shadows global variable"),
+					fname, fp[i].param);
+			ret = true;
+		}
+	}
+
+	*shadow |= ret;
+	return 0;
+}
+
+/* valinfo --- dump var info */
+
+void
+valinfo(NODE *n, Func_print print_func, FILE *fp)
+{
+	if (n == Nnull_string)
+		print_func(fp, "uninitialized scalar\n");
+	else if ((n->flags & REGEX) != 0)
+		print_func(fp, "@/%.*s/\n", n->stlen, n->stptr);
+	else if ((n->flags & STRING) != 0) {
+		pp_string_fp(print_func, fp, n->stptr, n->stlen, '"', false);
+		print_func(fp, "\n");
+	} else if ((n->flags & NUMBER) != 0) {
+#ifdef HAVE_MPFR
+		if (is_mpg_float(n))
+			print_func(fp, "%s\n", mpg_fmt("%.17R*g", ROUND_MODE, n->mpg_numbr));
+		else if (is_mpg_integer(n))
+			print_func(fp, "%s\n", mpg_fmt("%Zd", n->mpg_i));
+		else
+#endif
+		print_func(fp, "%.17g\n", n->numbr);
+	} else
+		print_func(fp, "?? flags %s\n", flags2str(n->flags));
+}
+
+
+/* dump_vars --- dump the symbol table */
+
+void
+dump_vars(const char *fname)
+{
+	FILE *fp;
+	NODE **vars;
+
+	if (fname == NULL)
+		fp = stderr;
+	else if (strcmp(fname, "-") == 0)
+		fp = stdout;
+	else if ((fp = fopen(fname, "w")) == NULL) {
+		warning(_("could not open `%s' for writing (%s)"), fname, strerror(errno));
+		warning(_("sending variable list to standard error"));
+		fp = stderr;
+	}
+
+	vars = variable_list();
+	print_vars(vars, fprintf, fp);
+	efree(vars);
+	if (fp != stdout && fp != stderr && fclose(fp) != 0)
+		warning(_("%s: close failed (%s)"), fname, strerror(errno));
+}
+
+/* dump_funcs --- print all functions */
+
+void
+dump_funcs()
+{
+	NODE **funcs;
+	funcs = function_list(true);
+	(void) foreach_func(funcs, (int (*)(INSTRUCTION *, void *)) pp_func, (void *) 0);
+	efree(funcs);
+}
+
+
+/* shadow_funcs --- check all functions for parameters that shadow globals */
+
+void
+shadow_funcs()
+{
+	static int calls = 0;
+	bool shadow = false;
+	NODE **funcs;
+
+	if (calls++ != 0)
+		fatal(_("shadow_funcs() called twice!"));
+
+	funcs = function_list(true);
+	(void) foreach_func(funcs, (int (*)(INSTRUCTION *, void *)) parms_shadow, & shadow);
+	efree(funcs);
+
+	/* End with fatal if the user requested it.  */
+	if (shadow && lintfunc == r_fatal)
+		lintwarn(_("there were shadowed variables."));
+}
+
+
+/* mk_function --- finalize function definition node; remove parameters
+ *	out of the symbol table.
+ */
+
+static INSTRUCTION *
+mk_function(INSTRUCTION *fi, INSTRUCTION *def)
+{
+	NODE *thisfunc;
+
+	thisfunc = fi->func_body;
+	assert(thisfunc != NULL);
+
+	/* add any pre-function comment to start of action for profile.c  */
+
+	if (interblock_comment != NULL) {
+		interblock_comment->source_line = 0;
+		merge_comments(interblock_comment, fi->comment);
+		fi->comment = interblock_comment;
+		interblock_comment = NULL;
+	}
+
+	/*
+	 * Add an implicit return at end;
+	 * also used by 'return' command in debugger
+	 */
+
+	(void) list_append(def, instruction(Op_push_i));
+	def->lasti->memory = dupnode(Nnull_string);
+	(void) list_append(def, instruction(Op_K_return));
+
+	if (trailing_comment != NULL) {
+		(void) list_append(def, trailing_comment);
+		trailing_comment = NULL;
+	}
+
+	if (do_pretty_print) {
+		fi[3].nexti = namespace_chain;
+		namespace_chain = NULL;
+		(void) list_prepend(def, instruction(Op_exec_count));
+	}
+
+	/* fi->opcode = Op_func */
+	(fi + 1)->firsti = def->nexti;
+	(fi + 1)->lasti = def->lasti;
+	(fi + 2)->first_line = fi->source_line;
+	(fi + 2)->last_line = lastline;
+	fi->nexti = def->nexti;
+	bcfree(def);
+
+	(void) list_append(rule_list, fi + 1);	/* debugging */
+
+	/* update lint table info */
+	func_use(thisfunc->vname, FUNC_DEFINE);
+
+	/* remove params from symbol table */
+	remove_params(thisfunc);
+	return fi;
+}
+
+/*
+ * install_function:
+ * install function name in the symbol table.
+ * Extra work, build up and install a list of the parameter names.
+ */
+
+static int
+install_function(char *fname, INSTRUCTION *fi, INSTRUCTION *plist)
+{
+	NODE *r, *f;
+	int pcount = 0;
+
+	r = lookup(fname);
+	if (r != NULL) {
+		error_ln(fi->source_line, _("function name `%s' previously defined"), fname);
+		return -1;
+	}
+
+	if (plist != NULL)
+		pcount = plist->lasti->param_count + 1;
+	f = install_symbol(fname, Node_func);
+	if (f->vname != fname) {
+		// DON'T free fname, it's done later
+		fname = f->vname;
+	}
+
+	fi->func_body = f;
+	f->param_cnt = pcount;
+	f->code_ptr = fi;
+	f->fparms = NULL;
+	if (pcount > 0) {
+		char **pnames;
+		pnames = check_params(fname, pcount, plist);	/* frees plist */
+		f->fparms = make_params(pnames, pcount);
+		efree(pnames);
+		install_params(f);
+	}
+	return 0;
+}
+
+
+/* check_params --- build a list of function parameter names after
+ *	making sure that the names are valid and there are no duplicates.
+ */
+
+static char **
+check_params(char *fname, int pcount, INSTRUCTION *list)
+{
+	INSTRUCTION *p, *np;
+	int i, j;
+	char *name;
+	char **pnames;
+
+	assert(pcount > 0);
+
+	emalloc(pnames, char **, pcount * sizeof(char *), "check_params");
+
+	for (i = 0, p = list->nexti; p != NULL; i++, p = np) {
+		np = p->nexti;
+		name = p->lextok;
+		p->lextok = NULL;
+
+		if (strcmp(name, fname) == 0) {
+			/* check for function foo(foo) { ... }.  bleah. */
+			error_ln(p->source_line,
+				_("function `%s': can't use function name as parameter name"), fname);
+		} else if (is_std_var(name)) {
+			error_ln(p->source_line,
+				_("function `%s': can't use special variable `%s' as a function parameter"),
+					fname, name);
+		} else if (strchr(name, ':') != NULL)
+			error_ln(p->source_line,
+				_("function `%s': parameter `%s' cannot contain a namespace"),
+					fname, name);
+
+		/* check for duplicate parameters */
+		for (j = 0; j < i; j++) {
+			if (strcmp(name, pnames[j]) == 0) {
+				error_ln(p->source_line,
+					_("function `%s': parameter #%d, `%s', duplicates parameter #%d"),
+					fname, i + 1, name, j + 1);
+			}
+		}
+
+		pnames[i] = name;
+		bcfree(p);
+	}
+	bcfree(list);
+
+	return pnames;
+}
+
+
+#ifdef HASHSIZE
+undef HASHSIZE
+#endif
+#define HASHSIZE 1021
+
+static struct fdesc {
+	char *name;
+	short used;
+	short defined;
+	short extension;
+	struct fdesc *next;
+} *ftable[HASHSIZE];
+
+/* func_use --- track uses and definitions of functions */
+
+static void
+func_use(const char *name, enum defref how)
+{
+	struct fdesc *fp;
+	int len;
+	int ind;
+
+	len = strlen(name);
+	ind = hash(name, len, HASHSIZE, NULL);
+
+	for (fp = ftable[ind]; fp != NULL; fp = fp->next)
+		if (strcmp(fp->name, name) == 0)
+			goto update_value;
+
+	/* not in the table, fall through to allocate a new one */
+
+	ezalloc(fp, struct fdesc *, sizeof(struct fdesc), "func_use");
+	emalloc(fp->name, char *, len + 1, "func_use");
+	strcpy(fp->name, name);
+	fp->next = ftable[ind];
+	ftable[ind] = fp;
+
+update_value:
+	if (how == FUNC_DEFINE)
+		fp->defined++;
+	else if (how == FUNC_EXT) {
+		fp->defined++;
+		fp->extension++;
+	} else
+		fp->used++;
+}
+
+/* track_ext_func --- add an extension function to the table */
+
+void
+track_ext_func(const char *name)
+{
+	func_use(name, FUNC_EXT);
+}
+
+/* check_funcs --- verify functions that are called but not defined */
+
+static void
+check_funcs()
+{
+	struct fdesc *fp, *next;
+	int i;
+
+	if (! in_main_context())
+		goto free_mem;
+
+	for (i = 0; i < HASHSIZE; i++) {
+		for (fp = ftable[i]; fp != NULL; fp = fp->next) {
+			if (do_lint && ! fp->extension) {
+				/*
+				 * Making this not a lint check and
+				 * incrementing * errcount breaks old code.
+				 * Sigh.
+				 */
+				if (fp->defined == 0)
+					lintwarn(_("function `%s' called but never defined"),
+						fp->name);
+
+				if (fp->used == 0)
+					lintwarn(_("function `%s' defined but never called directly"),
+						fp->name);
+			}
+		}
+	}
+
+free_mem:
+	/* now let's free all the memory */
+	for (i = 0; i < HASHSIZE; i++) {
+		for (fp = ftable[i]; fp != NULL; fp = next) {
+			next = fp->next;
+			efree(fp->name);
+			efree(fp);
+		}
+		ftable[i] = NULL;
+	}
+}
+
+/* param_sanity --- look for parameters that are regexp constants */
+
+static void
+param_sanity(INSTRUCTION *arglist)
+{
+	INSTRUCTION *argl, *arg;
+	int i = 1;
+
+	if (arglist == NULL)
+		return;
+	for (argl = arglist->nexti; argl; ) {
+		arg = argl->lasti;
+		if (arg->opcode == Op_match_rec)
+			warning_ln(arg->source_line,
+				_("regexp constant for parameter #%d yields boolean value"), i);
+		argl = arg->nexti;
+		i++;
+	}
+}
+
+/* variable --- make sure NAME is in the symbol table */
+
+NODE *
+variable(int location, char *name, NODETYPE type)
+{
+	NODE *r;
+
+	if ((r = lookup(name)) != NULL) {
+		if (r->type == Node_func || r->type == Node_ext_func )
+			error_ln(location, _("function `%s' called with space between name and `(',\nor used as a variable or an array"),
+				r->vname);
+	} else {
+		/* not found */
+		return install_symbol(name, type);
+	}
+	efree(name);
+	return r;
+}
+
+/* make_regnode --- make a regular expression node */
+
+NODE *
+make_regnode(int type, NODE *exp)
+{
+	NODE *n;
+
+	assert(type == Node_regex || type == Node_dynregex);
+	getnode(n);
+	memset(n, 0, sizeof(NODE));
+	n->type = type;
+	n->re_cnt = 1;
+
+	if (type == Node_regex) {
+		n->re_reg[0] = make_regexp(exp->stptr, exp->stlen, false, true, false);
+		if (n->re_reg[0] == NULL) {
+			freenode(n);
+			return NULL;
+		}
+		n->re_reg[1] = make_regexp(exp->stptr, exp->stlen, true, true, false);
+		if (n->re_reg[1] == NULL) {
+			refree(n->re_reg[0]);
+			freenode(n);
+			return NULL;
+		}
+		n->re_exp = exp;
+		n->re_flags = CONSTANT;
+	}
+	return n;
+}
+
+
+/* mk_rexp --- make a regular expression constant */
+
+static NODE *
+mk_rexp(INSTRUCTION *list)
+{
+	INSTRUCTION *ip;
+
+	ip = list->nexti;
+	if (ip == list->lasti && ip->opcode == Op_match_rec)
+		ip->opcode = Op_push_re;
+	else if (ip == list->lasti && ip->opcode == Op_push_re)
+		; /* do nothing --- @/.../ */
+	else {
+		ip = instruction(Op_push_re);
+		ip->memory = make_regnode(Node_dynregex, NULL);
+		ip->nexti = list->lasti->nexti;
+		list->lasti->nexti = ip;
+		list->lasti = ip;
+	}
+	return ip->memory;
+}
+
+#ifndef NO_LINT
+/* isnoeffect --- when used as a statement, has no side effects */
+
+static int
+isnoeffect(OPCODE type)
+{
+	switch (type) {
+	case Op_times:
+	case Op_times_i:
+	case Op_quotient:
+	case Op_quotient_i:
+	case Op_mod:
+	case Op_mod_i:
+	case Op_plus:
+	case Op_plus_i:
+	case Op_minus:
+	case Op_minus_i:
+	case Op_subscript:
+	case Op_concat:
+	case Op_exp:
+	case Op_exp_i:
+	case Op_unary_minus:
+	case Op_field_spec:
+	case Op_and_final:
+	case Op_or_final:
+	case Op_equal:
+	case Op_notequal:
+	case Op_less:
+	case Op_greater:
+	case Op_leq:
+	case Op_geq:
+	case Op_match:
+	case Op_nomatch:
+	case Op_match_rec:
+	case Op_not:
+	case Op_in_array:
+		return true;
+	default:
+		break;	/* keeps gcc -Wall happy */
+	}
+
+	return false;
+}
+#endif /* NO_LINT */
+
+
+/* make_assignable --- make this operand an assignable one if posiible */
+
+static INSTRUCTION *
+make_assignable(INSTRUCTION *ip)
+{
+	switch (ip->opcode) {
+	case Op_push:
+		ip->opcode = Op_push_lhs;
+		return ip;
+	case Op_field_spec:
+		ip->opcode = Op_field_spec_lhs;
+		return ip;
+	case Op_subscript:
+		ip->opcode = Op_subscript_lhs;
+		return ip;
+	default:
+		break;	/* keeps gcc -Wall happy */
+	}
+	return NULL;
+}
+
+/* stopme --- for debugging */
+
+NODE *
+stopme(int nargs ATTRIBUTE_UNUSED)
+{
+	return make_number(0.0);
+}
+
+/* dumpintlstr --- write out an initial .po file entry for the string */
+
+static void
+dumpintlstr(const char *str, size_t len)
+{
+	char *cp;
+
+	/* See the GNU gettext distribution for details on the file format */
+
+	if (source != NULL) {
+		/* ala the gettext sources, remove leading `./'s */
+		for (cp = source; cp[0] == '.' && cp[1] == '/'; cp += 2)
+			continue;
+		printf("#: %s:%d\n", cp, sourceline);
+	}
+
+	printf("msgid ");
+	pp_string_fp(fprintf, stdout, str, len, '"', true);
+	putchar('\n');
+	printf("msgstr \"\"\n\n");
+	fflush(stdout);
+}
+
+/* dumpintlstr2 --- write out an initial .po file entry for the string and its plural */
+
+static void
+dumpintlstr2(const char *str1, size_t len1, const char *str2, size_t len2)
+{
+	char *cp;
+
+	/* See the GNU gettext distribution for details on the file format */
+
+	if (source != NULL) {
+		/* ala the gettext sources, remove leading `./'s */
+		for (cp = source; cp[0] == '.' && cp[1] == '/'; cp += 2)
+			continue;
+		printf("#: %s:%d\n", cp, sourceline);
+	}
+
+	printf("msgid ");
+	pp_string_fp(fprintf, stdout, str1, len1, '"', true);
+	putchar('\n');
+	printf("msgid_plural ");
+	pp_string_fp(fprintf, stdout, str2, len2, '"', true);
+	putchar('\n');
+	printf("msgstr[0] \"\"\nmsgstr[1] \"\"\n\n");
+	fflush(stdout);
+}
+
+/* mk_binary --- instructions for binary operators */
+
+static INSTRUCTION *
+mk_binary(INSTRUCTION *s1, INSTRUCTION *s2, INSTRUCTION *op)
+{
+	INSTRUCTION *ip1,*ip2;
+	AWKNUM res;
+
+	ip2 = s2->nexti;
+	if (s2->lasti == ip2 && ip2->opcode == Op_push_i) {
+	/* do any numeric constant folding */
+		ip1 = s1->nexti;
+		if (do_optimize
+				&& ip1 == s1->lasti && ip1->opcode == Op_push_i
+				&& (ip1->memory->flags & (MPFN|MPZN|STRCUR|STRING)) == 0
+				&& (ip2->memory->flags & (MPFN|MPZN|STRCUR|STRING)) == 0
+		) {
+			NODE *n1 = ip1->memory, *n2 = ip2->memory;
+			res = force_number(n1)->numbr;
+			(void) force_number(n2);
+			switch (op->opcode) {
+			case Op_times:
+				res *= n2->numbr;
+				break;
+			case Op_quotient:
+				if (n2->numbr == 0.0) {
+					/* don't fatalize, allow parsing rest of the input */
+					error_ln(op->source_line, _("division by zero attempted"));
+					goto regular;
+				}
+
+				res /= n2->numbr;
+				break;
+			case Op_mod:
+				if (n2->numbr == 0.0) {
+					/* don't fatalize, allow parsing rest of the input */
+					error_ln(op->source_line, _("division by zero attempted in `%%'"));
+					goto regular;
+				}
+#ifdef HAVE_FMOD
+				res = fmod(res, n2->numbr);
+#else	/* ! HAVE_FMOD */
+				(void) modf(res / n2->numbr, &res);
+				res = n1->numbr - res * n2->numbr;
+#endif	/* ! HAVE_FMOD */
+				break;
+			case Op_plus:
+				res += n2->numbr;
+				break;
+			case Op_minus:
+				res -= n2->numbr;
+				break;
+			case Op_exp:
+				res = calc_exp(res, n2->numbr);
+				break;
+			default:
+				goto regular;
+			}
+
+			op->opcode = Op_push_i;
+			// We don't need to call set_profile_text() here since
+			// optimizing is disabled when doing pretty printing.
+			op->memory = make_number(res);
+			unref(n1);
+			unref(n2);
+			bcfree(ip1);
+			bcfree(ip2);
+			bcfree(s1);
+			bcfree(s2);
+			return list_create(op);
+		} else {
+		/* do basic arithmetic optimisation */
+		/* convert (Op_push_i Node_val) + (Op_plus) to (Op_plus_i Node_val) */
+			switch (op->opcode) {
+			case Op_times:
+				op->opcode = Op_times_i;
+				break;
+			case Op_quotient:
+				op->opcode = Op_quotient_i;
+				break;
+			case Op_mod:
+				op->opcode = Op_mod_i;
+				break;
+			case Op_plus:
+				op->opcode = Op_plus_i;
+				break;
+			case Op_minus:
+				op->opcode = Op_minus_i;
+				break;
+			case Op_exp:
+				op->opcode = Op_exp_i;
+				break;
+			default:
+				goto regular;
+			}
+
+			op->memory = ip2->memory;
+			bcfree(ip2);
+			bcfree(s2);	/* Op_list */
+			return list_append(s1, op);
+		}
+	}
+
+regular:
+	/* append lists s1, s2 and add `op' bytecode */
+	(void) list_merge(s1, s2);
+	return list_append(s1, op);
+}
+
+/* mk_boolean --- instructions for boolean and, or */
+
+static INSTRUCTION *
+mk_boolean(INSTRUCTION *left, INSTRUCTION *right, INSTRUCTION *op)
+{
+	INSTRUCTION *tp;
+	OPCODE opc, final_opc;
+
+	opc = op->opcode;		/* Op_and or Op_or */
+	final_opc = (opc == Op_or) ? Op_or_final : Op_and_final;
+
+	add_lint(right, LINT_assign_in_cond);
+
+	tp = left->lasti;
+
+	if (tp->opcode != final_opc) {	/* x || y */
+		list_append(right, instruction(final_opc));
+		add_lint(left, LINT_assign_in_cond);
+		(void) list_append(left, op);
+		left->lasti->target_jmp = right->lasti;
+
+		/* NB: target_stmt points to previous Op_and(Op_or) in a chain;
+		 *     target_stmt only used in the parser (see below).
+		 */
+
+		left->lasti->target_stmt = left->lasti;
+		right->lasti->target_stmt = left->lasti;
+	} else {		/* optimization for x || y || z || ... */
+		INSTRUCTION *ip;
+
+		op->opcode = final_opc;
+		(void) list_append(right, op);
+		op->target_stmt = tp;
+		tp->opcode = opc;
+		tp->target_jmp = op;
+
+		/* update jump targets */
+		for (ip = tp->target_stmt; ; ip = ip->target_stmt) {
+			assert(ip->opcode == opc);
+			assert(ip->target_jmp == tp);
+			/* if (ip->opcode == opc &&  ip->target_jmp == tp) */
+			ip->target_jmp = op;
+			if (ip->target_stmt == ip)
+				break;
+		}
+	}
+
+	return list_merge(left, right);
+}
+
+/* mk_condition --- if-else and conditional */
+
+static INSTRUCTION *
+mk_condition(INSTRUCTION *cond, INSTRUCTION *ifp, INSTRUCTION *true_branch,
+		INSTRUCTION *elsep, INSTRUCTION *false_branch)
+{
+	/*
+	 *    ----------------
+	 *       cond
+	 *    ----------------
+	 * t: [Op_jmp_false f ]
+	 *    ----------------
+	 *       true_branch
+	 *
+	 *    ----------------
+	 *    [Op_jmp y]
+	 *    ----------------
+	 * f:
+	 *      false_branch
+	 *    ----------------
+	 * y: [Op_no_op]
+	 *    ----------------
+	 */
+
+	INSTRUCTION *ip;
+	bool setup_else_part = true;
+
+	if (false_branch == NULL) {
+		false_branch = list_create(instruction(Op_no_op));
+		if (elsep == NULL) {		/* else { } */
+			setup_else_part = false;
+		}
+	} else {
+		/* assert(elsep != NULL); */
+
+		/* avoid a series of no_op's: if .. else if .. else if .. */
+		if (false_branch->lasti->opcode != Op_no_op)
+			(void) list_append(false_branch, instruction(Op_no_op));
+	}
+
+	if (setup_else_part) {
+		if (do_pretty_print) {
+			(void) list_prepend(false_branch, elsep);
+			false_branch->nexti->branch_end = false_branch->lasti;
+			(void) list_prepend(false_branch, instruction(Op_exec_count));
+		} else
+			bcfree(elsep);
+	}
+
+	(void) list_prepend(false_branch, instruction(Op_jmp));
+	false_branch->nexti->target_jmp = false_branch->lasti;
+
+	add_lint(cond, LINT_assign_in_cond);
+	ip = list_append(cond, instruction(Op_jmp_false));
+	ip->lasti->target_jmp = false_branch->nexti->nexti;
+
+	if (do_pretty_print) {
+		(void) list_prepend(ip, ifp);
+		(void) list_append(ip, instruction(Op_exec_count));
+		ip->nexti->branch_if = ip->lasti;
+		ip->nexti->branch_else = false_branch->nexti;
+	} else
+		bcfree(ifp);
+
+	if (true_branch != NULL)
+		list_merge(ip, true_branch);
+	return list_merge(ip, false_branch);
+}
+
+enum defline { FIRST_LINE, LAST_LINE };
+
+/* find_line -- find the first(last) line in a list of (pattern) instructions */
+
+static int
+find_line(INSTRUCTION *pattern, enum defline what)
+{
+	INSTRUCTION *ip;
+	int lineno = 0;
+
+	for (ip = pattern->nexti; ip; ip = ip->nexti) {
+		if (what == LAST_LINE) {
+			if (ip->source_line > lineno)
+				lineno = ip->source_line;
+		} else {	/* FIRST_LINE */
+			if (ip->source_line > 0
+					&& (lineno == 0 || ip->source_line < lineno))
+				lineno = ip->source_line;
+		}
+		if (ip == pattern->lasti)
+			break;
+	}
+	assert(lineno > 0);
+	return lineno;
+}
+
+/* append_rule --- pattern-action instructions */
+
+static INSTRUCTION *
+append_rule(INSTRUCTION *pattern, INSTRUCTION *action)
+{
+	/*
+	 *    ----------------
+	 *       pattern
+	 *    ----------------
+	 *    [Op_jmp_false f ]
+	 *    ----------------
+	 *       action
+	 *    ----------------
+	 * f: [Op_no_op       ]
+	 *    ----------------
+	 */
+
+	INSTRUCTION *rp;
+	INSTRUCTION *tp;
+	INSTRUCTION *ip;
+
+	if (rule != Rule) {
+		rp = pattern;
+		if (do_pretty_print) {
+			rp[3].nexti = namespace_chain;
+			namespace_chain = NULL;
+			(void) list_append(action, instruction(Op_no_op));
+		}
+		(rp + 1)->firsti = action->nexti;
+		(rp + 1)->lasti = action->lasti;
+		(rp + 2)->first_line = pattern->source_line;
+		(rp + 2)->last_line = lastline;
+		ip = list_prepend(action, rp);
+		if (interblock_comment != NULL) {
+			ip = list_prepend(ip, interblock_comment);
+			interblock_comment = NULL;
+		}
+	} else {
+		rp = bcalloc(Op_rule, 4, 0);
+		rp->in_rule = Rule;
+		rp->source_file = source;
+		tp = instruction(Op_no_op);
+
+		if (do_pretty_print) {
+			rp[3].nexti = namespace_chain;
+			namespace_chain = NULL;
+		}
+
+		if (pattern == NULL) {
+			/* assert(action != NULL); */
+			if (do_pretty_print)
+				(void) list_prepend(action, instruction(Op_exec_count));
+			(rp + 1)->firsti = action->nexti;
+			(rp + 1)->lasti = tp;
+			(rp + 2)->first_line = firstline;
+			(rp + 2)->last_line = lastline;
+			rp->source_line = firstline;
+			ip = list_prepend(list_append(action, tp), rp);
+		} else {
+			(void) list_append(pattern, instruction(Op_jmp_false));
+			pattern->lasti->target_jmp = tp;
+			(rp + 2)->first_line = find_line(pattern, FIRST_LINE);
+			rp->source_line = (rp + 2)->first_line;
+			if (action == NULL) {
+				(rp + 2)->last_line = find_line(pattern, LAST_LINE);
+				action = list_create(instruction(Op_K_print_rec));
+				if (do_pretty_print)
+					action = list_prepend(action, instruction(Op_exec_count));
+			} else
+				(rp + 2)->last_line = lastline;
+
+			if (interblock_comment != NULL) {	// was after previous action
+				pattern = list_prepend(pattern, interblock_comment);
+				interblock_comment = NULL;
+			}
+
+			if (do_pretty_print) {
+				pattern = list_prepend(pattern, instruction(Op_exec_count));
+				action = list_prepend(action, instruction(Op_exec_count));
+			}
+
+ 			(rp + 1)->firsti = action->nexti;
+			(rp + 1)->lasti = tp;
+			ip = list_append(
+					list_merge(list_prepend(pattern, rp),
+						action),
+					tp);
+		}
+	}
+
+	list_append(rule_list, rp + 1);
+
+	if (rule_block[rule] == NULL)
+		rule_block[rule] = ip;
+	else
+		(void) list_merge(rule_block[rule], ip);
+
+	return rule_block[rule];
+}
+
+/* mk_assignment --- assignment bytecodes */
+
+static INSTRUCTION *
+mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, INSTRUCTION *op)
+{
+	INSTRUCTION *tp;
+	INSTRUCTION *ip;
+
+	tp = lhs->lasti;
+	switch (tp->opcode) {
+	case Op_field_spec:
+		tp->opcode = Op_field_spec_lhs;
+		break;
+	case Op_subscript:
+		tp->opcode = Op_subscript_lhs;
+		break;
+	case Op_push:
+	case Op_push_array:
+		tp->opcode = Op_push_lhs;
+		break;
+	case Op_field_assign:
+		yyerror(_("cannot assign a value to the result of a field post-increment expression"));
+		break;
+	default:
+		yyerror(_("invalid target of assignment (opcode %s)"),
+				opcode2str(tp->opcode));
+		break;
+	}
+
+	tp->do_reference = (op->opcode != Op_assign);	/* check for uninitialized reference */
+
+	if (rhs != NULL)
+		ip = list_merge(rhs, lhs);
+	else
+		ip = lhs;
+
+	(void) list_append(ip, op);
+
+	if (tp->opcode == Op_push_lhs
+			&& tp->memory->type == Node_var
+			&& tp->memory->var_assign
+	) {
+		tp->do_reference = false; /* no uninitialized reference checking
+		                           * for a special variable.
+		                           */
+		(void) list_append(ip, instruction(Op_var_assign));
+		ip->lasti->assign_var = tp->memory->var_assign;
+	} else if (tp->opcode == Op_field_spec_lhs) {
+		(void) list_append(ip, instruction(Op_field_assign));
+		ip->lasti->field_assign = (Func_ptr) 0;
+		tp->target_assign = ip->lasti;
+	} else if (tp->opcode == Op_subscript_lhs) {
+		(void) list_append(ip, instruction(Op_subscript_assign));
+	}
+
+	return ip;
+}
+
+/* optimize_assignment --- peephole optimization for assignment */
+
+static INSTRUCTION *
+optimize_assignment(INSTRUCTION *exp)
+{
+	INSTRUCTION *i1, *i2, *i3;
+
+	/*
+	 * Optimize assignment statements array[subs] = x; var = x; $n = x;
+	 * string concatenation of the form s = s t.
+	 *
+	 * 1) Array element assignment array[subs] = x:
+	 *   Replaces Op_push_array + Op_subscript_lhs + Op_assign + Op_pop
+	 *   with single instruction Op_store_sub.
+	 *	 Limitation: 1 dimension and sub is simple var/value.
+	 *
+	 * 2) Simple variable assignment var = x:
+	 *   Replaces Op_push_lhs + Op_assign + Op_pop with Op_store_var.
+	 *
+	 * 3) Field assignment $n = x:
+	 *   Replaces Op_field_spec_lhs + Op_assign + Op_field_assign + Op_pop
+	 *   with Op_store_field.
+	 *
+	 * 4) Optimization for string concatenation:
+	 *   For cases like x = x y, uses realloc to include y in x;
+	 *   also eliminates instructions Op_push_lhs and Op_pop.
+	 */
+
+	/*
+	 * N.B.: do not append Op_pop instruction to the returned
+	 * instruction list if optimized. None of these
+	 * optimized instructions pushes the r-value of assignment
+	 * onto the runtime stack.
+	 */
+
+	i2 = NULL;
+	i1 = exp->lasti;
+
+	if (   i1->opcode != Op_assign
+	    && i1->opcode != Op_field_assign)
+		return list_append(exp, instruction(Op_pop));
+
+	for (i2 = exp->nexti; i2 != i1; i2 = i2->nexti) {
+		switch (i2->opcode) {
+		case Op_concat:
+			if (i2->nexti->opcode == Op_push_lhs    /* l.h.s is a simple variable */
+				&& (i2->concat_flag & CSVAR) != 0   /* 1st exp in r.h.s is a simple variable;
+				                                     * see Op_concat in the grammer above.
+				                                     */
+				&& i2->nexti->memory == exp->nexti->memory	 /* and the same as in l.h.s */
+				&& i2->nexti->nexti == i1
+				&& i1->opcode == Op_assign
+			) {
+				/* s = s ... optimization */
+
+				/* avoid stuff like x = x (x = y) or x = x gsub(/./, "b", x);
+				 * check for l-value reference to this variable in the r.h.s.
+				 * Also, avoid function calls in general to guard against
+				 * global variable assignment.
+				 */
+
+				for (i3 = exp->nexti->nexti; i3 != i2; i3 = i3->nexti) {
+					if ((i3->opcode == Op_push_lhs && i3->memory == i2->nexti->memory)
+							|| i3->opcode == Op_func_call)
+						return list_append(exp, instruction(Op_pop)); /* no optimization */
+				}
+
+				/* remove the variable from r.h.s */
+				i3 = exp->nexti;
+				exp->nexti = i3->nexti;
+				bcfree(i3);
+
+				if (--i2->expr_count == 1)	/* one less expression in Op_concat */
+					i2->opcode = Op_no_op;
+
+				i3 = i2->nexti;
+				assert(i3->opcode == Op_push_lhs);
+				i3->opcode = Op_assign_concat;	/* change Op_push_lhs to Op_assign_concat */
+				i3->nexti = NULL;
+				bcfree(i1);          /* Op_assign */
+				exp->lasti = i3;     /* update Op_list */
+				return exp;
+			}
+			break;
+
+		case Op_field_spec_lhs:
+			if (i2->nexti->opcode == Op_assign
+					&& i2->nexti->nexti == i1
+					&& i1->opcode == Op_field_assign
+			) {
+				/* $n = .. */
+				i2->opcode = Op_store_field;
+				bcfree(i2->nexti);  /* Op_assign */
+				i2->nexti = NULL;
+				bcfree(i1);          /* Op_field_assign */
+				exp->lasti = i2;    /* update Op_list */
+				return exp;
+			}
+			break;
+
+		case Op_push_array:
+			if (i2->nexti->nexti->opcode == Op_subscript_lhs) {
+				i3 = i2->nexti->nexti;
+				if (i3->sub_count == 1
+						&& i3->nexti == i1
+						&& i1->opcode == Op_assign
+				) {
+					/* array[sub] = .. */
+					i3->opcode = Op_store_sub;
+					i3->memory = i2->memory;
+					i3->expr_count = 1;  /* sub_count shadows memory,
+                                          * so use expr_count instead.
+				                          */
+					i3->nexti = NULL;
+					i2->opcode = Op_no_op;
+					bcfree(i1);          /* Op_assign */
+					exp->lasti = i3;     /* update Op_list */
+					return exp;
+				}
+			}
+			break;
+
+		case Op_push_lhs:
+			if (i2->nexti == i1
+					&& i1->opcode == Op_assign
+			) {
+				/* var = .. */
+				i2->opcode = Op_store_var;
+				i2->nexti = NULL;
+				bcfree(i1);          /* Op_assign */
+				exp->lasti = i2;     /* update Op_list */
+
+				i3 = exp->nexti;
+				if (i3->opcode == Op_push_i
+					&& (i3->memory->flags & INTLSTR) == 0
+					&& i3->nexti == i2
+				) {
+					/* constant initializer */
+					i2->initval = i3->memory;
+					bcfree(i3);
+					exp->nexti = i2;
+				} else
+					i2->initval = NULL;
+
+				return exp;
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	/* no optimization  */
+	return list_append(exp, instruction(Op_pop));
+}
+
+
+/* mk_getline --- make instructions for getline */
+
+static INSTRUCTION *
+mk_getline(INSTRUCTION *op, INSTRUCTION *var, INSTRUCTION *redir, int redirtype)
+{
+	INSTRUCTION *ip;
+	INSTRUCTION *tp;
+	INSTRUCTION *asgn = NULL;
+
+	/*
+	 *  getline [var] < [file]
+	 *
+	 *  [ file (simp_exp)]
+	 *  [ [ var ] ]
+	 *  [ Op_K_getline_redir|NULL|redir_type|into_var]
+	 *  [ [var_assign] ]
+	 *
+	 */
+
+	if (redir == NULL) {
+		int sline = op->source_line;
+		bcfree(op);
+		op = bcalloc(Op_K_getline, 2, sline);
+		(op + 1)->target_endfile = ip_endfile;
+		(op + 1)->target_beginfile = ip_beginfile;
+	}
+
+	if (var != NULL) {
+		tp = make_assignable(var->lasti);
+		assert(tp != NULL);
+
+		/* check if we need after_assign bytecode */
+		if (tp->opcode == Op_push_lhs
+				&& tp->memory->type == Node_var
+				&& tp->memory->var_assign
+		) {
+			asgn = instruction(Op_var_assign);
+			asgn->assign_ctxt = op->opcode;
+			asgn->assign_var = tp->memory->var_assign;
+		} else if (tp->opcode == Op_field_spec_lhs) {
+			asgn = instruction(Op_field_assign);
+			asgn->assign_ctxt = op->opcode;
+			asgn->field_assign = (Func_ptr) 0;   /* determined at run time */
+			tp->target_assign = asgn;
+		} else if (tp->opcode == Op_subscript_lhs) {
+			asgn = instruction(Op_subscript_assign);
+			asgn->assign_ctxt = op->opcode;
+		}
+
+		if (redir != NULL) {
+			ip = list_merge(redir, var);
+			(void) list_append(ip, op);
+		} else
+			ip = list_append(var, op);
+	} else if (redir != NULL)
+		ip = list_append(redir, op);
+	else
+		ip = list_create(op);
+	op->into_var = (var != NULL);
+	op->redir_type = (redir != NULL) ? redirtype : redirect_none;
+
+	return (asgn == NULL ? ip : list_append(ip, asgn));
+}
+
+
+/* mk_for_loop --- for loop bytecodes */
+
+static INSTRUCTION *
+mk_for_loop(INSTRUCTION *forp, INSTRUCTION *init, INSTRUCTION *cond,
+				INSTRUCTION *incr, INSTRUCTION *body)
+{
+	/*
+	 *   ------------------------
+	 *        init                 (may be NULL)
+	 *   ------------------------
+	 * x:
+	 *        cond                 (Op_no_op if NULL)
+	 *   ------------------------
+	 *    [ Op_jmp_false tb      ]
+	 *   ------------------------
+	 *        body                 (may be NULL)
+	 *   ------------------------
+	 * tc:
+	 *    incr                      (may be NULL)
+	 *    [ Op_jmp x             ]
+	 *   ------------------------
+	 * tb:[ Op_no_op             ]
+	 */
+
+	INSTRUCTION *ip, *tbreak, *tcont;
+	INSTRUCTION *jmp;
+	INSTRUCTION *pp_cond;
+	INSTRUCTION *ret;
+
+	tbreak = instruction(Op_no_op);
+
+	if (cond != NULL) {
+		add_lint(cond, LINT_assign_in_cond);
+		pp_cond = cond->nexti;
+		ip = cond;
+		(void) list_append(ip, instruction(Op_jmp_false));
+		ip->lasti->target_jmp = tbreak;
+	} else {
+		pp_cond = instruction(Op_no_op);
+		ip = list_create(pp_cond);
+	}
+
+	if (init != NULL)
+		ip = list_merge(init, ip);
+
+	if (do_pretty_print) {
+		(void) list_append(ip, instruction(Op_exec_count));
+		(forp + 1)->forloop_cond = pp_cond;
+		(forp + 1)->forloop_body = ip->lasti;
+	}
+
+	if (body != NULL)
+		(void) list_merge(ip, body);
+
+	jmp = instruction(Op_jmp);
+	jmp->target_jmp = pp_cond;
+	if (incr == NULL)
+		tcont = jmp;
+	else {
+		tcont = incr->nexti;
+		(void) list_merge(ip, incr);
+	}
+
+	(void) list_append(ip, jmp);
+	ret = list_append(ip, tbreak);
+	fix_break_continue(ret, tbreak, tcont);
+
+	if (do_pretty_print) {
+		forp->target_break = tbreak;
+		forp->target_continue = tcont;
+		ret = list_prepend(ret, forp);
+	}
+	/* else
+		forp is NULL */
+
+	return ret;
+}
+
+/* add_lint --- add lint warning bytecode if needed */
+
+static void
+add_lint(INSTRUCTION *list, LINTTYPE linttype)
+{
+#ifndef NO_LINT
+	INSTRUCTION *ip;
+
+	switch (linttype) {
+	case LINT_assign_in_cond:
+		ip = list->lasti;
+		if (ip->opcode == Op_var_assign || ip->opcode == Op_field_assign) {
+			assert(ip != list->nexti);
+			for (ip = list->nexti; ip->nexti != list->lasti; ip = ip->nexti)
+				;
+		}
+
+		if (ip->opcode == Op_assign || ip->opcode == Op_assign_concat) {
+			list_append(list, instruction(Op_lint));
+			list->lasti->lint_type = linttype;
+		}
+		break;
+
+	case LINT_no_effect:
+		if (list->lasti->opcode == Op_pop && list->nexti != list->lasti) {
+			int line = 0;
+
+			// Get down to the last instruction (FIXME: why?)
+			for (ip = list->nexti; ip->nexti != list->lasti; ip = ip->nexti) {
+				// along the way track line numbers, we will use the line
+				// closest to the opcode if that opcode doesn't have one
+				if (ip->source_line != 0)
+					line = ip->source_line;
+			}
+
+			if (do_lint) {		/* compile-time warning */
+				if (isnoeffect(ip->opcode)) {
+					if (ip->source_line != 0)
+						line = ip->source_line;
+					lintwarn_ln(line, ("statement may have no effect"));
+				}
+			}
+
+			if (ip->opcode == Op_push || ip->opcode == Op_push_i) {		/* run-time warning */
+				list_append(list, instruction(Op_lint));
+				list->lasti->lint_type = linttype;
+			}
+		}
+		break;
+
+	default:
+		break;
+	}
+#endif
+}
+
+/* mk_expression_list --- list of bytecode lists */
+
+static INSTRUCTION *
+mk_expression_list(INSTRUCTION *list, INSTRUCTION *s1)
+{
+	INSTRUCTION *r;
+
+	/* we can't just combine all bytecodes, since we need to
+	 * process individual expressions for a few builtins in snode() (-:
+	 */
+
+	/* -- list of lists     */
+	/* [Op_list| ... ]------
+	 *                       |
+	 * [Op_list| ... ]   --  |
+	 *  ...               |  |
+	 *  ...       <-------   |
+	 * [Op_list| ... ]   --  |
+	 *  ...               |  |
+	 *  ...               |  |
+	 *  ...       <------- --
+	 */
+
+	assert(s1 != NULL && s1->opcode == Op_list);
+	if (list == NULL) {
+		list = instruction(Op_list);
+		list->nexti = s1;
+		list->lasti = s1->lasti;
+		return list;
+	}
+
+	/* append expression to the end of the list */
+
+	r = list->lasti;
+	r->nexti = s1;
+	list->lasti = s1->lasti;
+	return list;
+}
+
+/* count_expressions --- fixup expression_list from mk_expression_list.
+ *                       returns no of expressions in list. isarg is true
+ *                       for function arguments.
+ */
+
+static int
+count_expressions(INSTRUCTION **list, bool isarg)
+{
+	INSTRUCTION *expr;
+	INSTRUCTION *r = NULL;
+	int count = 0;
+
+	if (*list == NULL)	/* error earlier */
+		return 0;
+
+	for (expr = (*list)->nexti; expr; ) {
+		INSTRUCTION *t1, *t2;
+		t1 = expr->nexti;
+		t2 = expr->lasti;
+		if (isarg && t1 == t2 && t1->opcode == Op_push)
+			t1->opcode = Op_push_param;
+		if (++count == 1)
+			r = expr;
+		else
+			(void) list_merge(r, expr);
+		expr = t2->nexti;
+	}
+
+	assert(count > 0);
+	if (! isarg && count > max_args)
+		max_args = count;
+	bcfree(*list);
+	*list = r;
+	return count;
+}
+
+/* fix_break_continue --- fix up break & continue codes in loop bodies */
+
+static void
+fix_break_continue(INSTRUCTION *list, INSTRUCTION *b_target, INSTRUCTION *c_target)
+{
+	INSTRUCTION *ip;
+
+	list->lasti->nexti = NULL;	/* just to make sure */
+
+	for (ip = list->nexti; ip != NULL; ip = ip->nexti) {
+		switch (ip->opcode) {
+		case Op_K_break:
+			if (ip->target_jmp == NULL)
+				ip->target_jmp = b_target;
+			break;
+
+		case Op_K_continue:
+			if (ip->target_jmp == NULL)
+				ip->target_jmp = c_target;
+			break;
+
+		default:
+			/* this is to keep the compiler happy. sheesh. */
+			break;
+		}
+	}
+}
+
+static inline INSTRUCTION *
+list_create(INSTRUCTION *x)
+{
+	INSTRUCTION *l;
+
+	l = instruction(Op_list);
+	l->nexti = x;
+	l->lasti = x;
+	return l;
+}
+
+static inline INSTRUCTION *
+list_append(INSTRUCTION *l, INSTRUCTION *x)
+{
+#ifdef GAWKDEBUG
+	if (l->opcode != Op_list)
+		cant_happen();
+#endif
+	l->lasti->nexti = x;
+	l->lasti = x;
+	return l;
+}
+
+static inline INSTRUCTION *
+list_prepend(INSTRUCTION *l, INSTRUCTION *x)
+{
+#ifdef GAWKDEBUG
+	if (l->opcode != Op_list)
+		cant_happen();
+#endif
+	x->nexti = l->nexti;
+	l->nexti = x;
+	return l;
+}
+
+static inline INSTRUCTION *
+list_merge(INSTRUCTION *l1, INSTRUCTION *l2)
+{
+#ifdef GAWKDEBUG
+	if (l1->opcode != Op_list)
+		cant_happen();
+	if (l2->opcode != Op_list)
+		cant_happen();
+#endif
+	l1->lasti->nexti = l2->nexti;
+	l1->lasti = l2->lasti;
+	bcfree(l2);
+	return l1;
+}
+
+/* See if name is a special token. */
+
+int
+check_special(const char *name)
+{
+	int low, high, mid;
+	int i;
+	int non_standard_flags = 0;
+#ifdef USE_EBCDIC
+	static bool did_sort = false;
+
+	if (! did_sort) {
+		qsort((void *) tokentab,
+				sizeof(tokentab) / sizeof(tokentab[0]),
+				sizeof(tokentab[0]), tokcompare);
+		did_sort = true;
+	}
+#endif
+
+	if (do_traditional)
+		non_standard_flags |= GAWKX;
+	if (do_posix)
+		non_standard_flags |= NOT_POSIX;
+
+	low = 0;
+	high = (sizeof(tokentab) / sizeof(tokentab[0])) - 1;
+	while (low <= high) {
+		mid = (low + high) / 2;
+		i = *name - tokentab[mid].operator[0];
+		if (i == 0)
+			i = strcmp(name, tokentab[mid].operator);
+
+		if (i < 0)		/* token < mid */
+			high = mid - 1;
+		else if (i > 0)		/* token > mid */
+			low = mid + 1;
+		else {
+			if ((tokentab[mid].flags & non_standard_flags) != 0)
+				return -1;
+			return mid;
+		}
+	}
+	return -1;
+}
+
+/*
+ * This provides a private version of functions that act like VMS's
+ * variable-length record filesystem, where there was a bug on
+ * certain source files.
+ */
+
+static FILE *fp = NULL;
+
+/* read_one_line --- return one input line at a time. mainly for debugging. */
+
+static ssize_t
+read_one_line(int fd, void *buffer, size_t count)
+{
+	char buf[BUFSIZ];
+
+	/* Minor potential memory leak here. Too bad. */
+	if (fp == NULL) {
+		fp = fdopen(fd, "r");
+		if (fp == NULL) {
+			fprintf(stderr, "ugh. fdopen: %s\n", strerror(errno));
+			gawk_exit(EXIT_FAILURE);
+		}
+	}
+
+	if (fgets(buf, sizeof buf, fp) == NULL)
+		return 0;
+
+	memcpy(buffer, buf, strlen(buf));
+	return strlen(buf);
+}
+
+/* one_line_close --- close the open file being read with read_one_line() */
+
+static int
+one_line_close(int fd)
+{
+	int ret;
+
+	if (fp == NULL || fd != fileno(fp))
+		fatal("debugging read/close screwed up!");
+
+	ret = fclose(fp);
+	fp = NULL;
+	return ret;
+}
+
+
+/* lookup_builtin --- find a builtin function or return NULL */
+
+builtin_func_t
+lookup_builtin(const char *name)
+{
+	if (strncmp(name, "awk::", 5) == 0)
+		name += 5;
+
+	int mid = check_special(name);
+
+	if (mid == -1)
+		return NULL;
+
+	switch (tokentab[mid].class) {
+	case LEX_BUILTIN:
+	case LEX_LENGTH:
+		break;
+	default:
+		return NULL;
+	}
+
+	/* And another special case... */
+	if (tokentab[mid].value == Op_sub_builtin)
+		return (builtin_func_t) do_sub;
+
+#ifdef HAVE_MPFR
+	if (do_mpfr)
+		return tokentab[mid].ptr2;
+#endif
+
+	return tokentab[mid].ptr;
+}
+
+/* install_builtins --- add built-in functions to FUNCTAB */
+
+void
+install_builtins(void)
+{
+	int i, j;
+	int flags_that_must_be_clear = DEBUG_USE;
+
+	if (do_traditional)
+		flags_that_must_be_clear |= GAWKX;
+
+	if (do_posix)
+		flags_that_must_be_clear |= NOT_POSIX;
+
+
+	j = sizeof(tokentab) / sizeof(tokentab[0]);
+	for (i = 0; i < j; i++) {
+		if (   (tokentab[i].class == LEX_BUILTIN
+		        || tokentab[i].class == LEX_LENGTH)
+		    && (tokentab[i].flags & flags_that_must_be_clear) == 0) {
+			(void) install_symbol(tokentab[i].operator, Node_builtin_func);
+		}
+	}
+}
+
+/*
+ * 9/2014: Gawk cannot use <ctype.h> isalpha or isalnum when
+ * parsing the program since that can let through non-English
+ * letters.  So, we supply our own. !@#$%^&*()-ing locales!
+ */
+
+/* is_alpha --- return true if c is an English letter */
+
+/*
+ * The scene of the murder was grisly to look upon.  When the inspector
+ * arrived, the sergeant turned to him and said, "Another programmer stabbed
+ * in the back. He never knew what happened."
+ *
+ * The inspector replied, "Looks like the MO of isalpha, and his even meaner
+ * big brother, isalnum. The Locale brothers."  The sergeant merely
+ * shuddered in horror.
+ */
+
+bool
+is_alpha(int c)
+{
+	switch (c) {
+	case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+	case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+	case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+	case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+	case 'y': case 'z':
+	case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+	case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+	case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+	case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+	case 'Y': case 'Z':
+		return true;
+	}
+	return false;
+}
+
+/* is_alnum --- return true for alphanumeric, English only letters */
+
+bool
+is_alnum(int c)
+{
+	/* digit test is good for EBCDIC too. so there. */
+	return (is_alpha(c) || ('0' <= c && c <= '9'));
+}
+
+
+/*
+ * is_letter --- function to check letters
+ *	isalpha() isn't good enough since it can look at the locale.
+ * Underscore counts as a letter in awk identifiers
+ */
+
+bool
+is_letter(int c)
+{
+	return (is_alpha(c) || c == '_');
+}
+
+/* is_identchar --- return true if c can be in an identifier */
+
+bool
+is_identchar(int c)
+{
+	return (is_alnum(c) || c == '_');
+}
+
+/* set_profile_text --- make a number that can be printed when profiling */
+
+static NODE *
+set_profile_text(NODE *n, const char *str, size_t len)
+{
+	if (do_pretty_print) {
+		// two extra bytes: one for NUL termination, and another in
+		// case we need to add a leading minus sign in add_sign_to_num
+		emalloc(n->stptr, char *, len + 2, "set_profile_text");
+		memcpy(n->stptr, str, len);
+		n->stptr[len] = '\0';
+		n->stlen = len;
+		// Set STRCUR and n->stfmt for use when profiling
+		// (i.e., actually running the program) so that
+		// force_string() on this item will work ok.
+		// Thanks and a tip of the hatlo to valgrind.
+		n->flags |= (NUMCONSTSTR|STRCUR);
+		n->stfmt = STFMT_UNUSED;
+#ifdef HAVE_MPFR
+		n->strndmode = MPFR_round_mode;
+#endif
+	}
+
+	return n;
+}
+
+/*
+ * merge_comments --- merge c2 into c1 and free c2 if successful.
+ *	Allow c2 to be NULL, in which case just merged chained
+ *	comments in c1.
+ */
+
+static void
+merge_comments(INSTRUCTION *c1, INSTRUCTION *c2)
+{
+	assert(c1->opcode == Op_comment);
+
+	if (c1->comment == NULL && c2 == NULL)	// nothing to do
+		return;
+
+	size_t total = c1->memory->stlen;
+	if (c1->comment != NULL)
+		total += 1 /* \n */ + c1->comment->memory->stlen;
+
+	if (c2 != NULL) {
+		assert(c2->opcode == Op_comment);
+		total += 1 /* \n */ + c2->memory->stlen;
+		if (c2->comment != NULL)
+			total += c2->comment->memory->stlen + 1;
+	}
+
+	char *buffer;
+	emalloc(buffer, char *, total + 1, "merge_comments");
+
+	strcpy(buffer, c1->memory->stptr);
+	if (c1->comment != NULL) {
+		strcat(buffer, "\n");
+		strcat(buffer, c1->comment->memory->stptr);
+	}
+
+	if (c2 != NULL) {
+		strcat(buffer, "\n");
+		strcat(buffer, c2->memory->stptr);
+		if (c2->comment != NULL) {
+			strcat(buffer, "\n");
+			strcat(buffer, c2->comment->memory->stptr);
+		}
+
+		unref(c2->memory);
+		if (c2->comment != NULL) {
+			unref(c2->comment->memory);
+			bcfree(c2->comment);
+			c2->comment = NULL;
+		}
+		bcfree(c2);
+	}
+
+	c1->memory->comment_type = BLOCK_COMMENT;
+	free(c1->memory->stptr);
+	c1->memory->stptr = buffer;
+	c1->memory->stlen = strlen(buffer);
+
+	// now free everything else
+	if (c1->comment != NULL) {
+		unref(c1->comment->memory);
+		bcfree(c1->comment);
+		c1->comment = NULL;
+	}
+}
+
+/* make_braced_statements --- handle `l_brace statements r_brace' with comments */
+
+static INSTRUCTION *
+make_braced_statements(INSTRUCTION *lbrace, INSTRUCTION *stmts, INSTRUCTION *rbrace)
+{
+	INSTRUCTION *ip;
+
+	if (stmts == NULL)
+		ip = list_create(instruction(Op_no_op));
+	else
+		ip = stmts;
+
+	if (lbrace != NULL) {
+		INSTRUCTION *comment2 = lbrace->comment;
+		if (comment2 != NULL) {
+			ip = list_prepend(ip, comment2);
+			lbrace->comment = NULL;
+		}
+		ip = list_prepend(ip, lbrace);
+	}
+
+	return ip;
+}
+
+/* validate_qualified_name --- make sure that a qualified name is built correctly */
+
+/*
+ * This routine returns upon first error, no need to produce multiple, possibly
+ * conflicting / confusing error messages.
+ */
+
+bool
+validate_qualified_name(char *token)
+{
+	char *cp, *cp2;
+
+	// no colon, by definition it's well formed
+	if ((cp = strchr(token, ':')) == NULL)
+		return true;
+
+	if (do_traditional || do_posix) {
+		error_ln(sourceline, _("identifier %s: qualified names not allowed in traditional / POSIX mode"), token);
+		return false;
+	}
+
+	if (cp[1] != ':') {	// could happen from command line
+		error_ln(sourceline, _("identifier %s: namespace separator is two colons, not one"), token);
+		return false;
+	}
+
+	if (! is_letter(cp[2])) {
+		error_ln(sourceline,
+				_("qualified identifier `%s' is badly formed"),
+				token);
+		return false;
+	}
+
+	if ((cp2 = strchr(cp+2, ':')) != NULL) {
+		error_ln(sourceline,
+			_("identifier `%s': namespace separator can only appear once in a qualified name"),
+			token);
+		return false;
+	}
+
+	return true;
+}
+
+/* check_qualified_special --- decide if a name is special or not */
+
+static int
+check_qualified_special(char *token)
+{
+	char *cp;
+
+	if ((cp = strchr(token, ':')) == NULL && current_namespace == awk_namespace)
+		return check_special(token);
+
+	/*
+	 * Now it's more complicated.  Here are the rules.
+	 *
+	 * 1. Namespace name cannot be a standard awk reserved word or function.
+	 * 2. Subordinate part of the name cannot be standard awk reserved word or function.
+	 * 3. If namespace part is explicitly "awk", return result of check_special().
+	 * 4. Else return -1 (gawk extensions allowed, we check standard awk in step 2).
+	 */
+
+	const struct token *tok;
+	int i;
+	if (cp == NULL) {	// namespace not awk, but a simple identifier
+		i = check_special(token);
+		if (i < 0)
+			return i;
+
+		tok = & tokentab[i];
+		if ((tok->flags & GAWKX) != 0 && tok->class == LEX_BUILTIN)
+			return -1;
+		else
+			return i;
+	}
+
+	char *ns, *end, *subname;
+	ns = token;
+	*(end = cp) = '\0';	// temporarily turn it into standalone string
+	subname = end + 2;
+
+	// First check the namespace part
+	i = check_special(ns);
+	if (i >= 0 && (tokentab[i].flags & GAWKX) == 0) {
+		error_ln(sourceline, _("using reserved identifier `%s' as a namespace is not allowed"), ns);
+		goto done;
+	}
+
+	// Now check the subordinate part
+	i = check_special(subname);
+	if (i >= 0 && (tokentab[i].flags & GAWKX) == 0 && strcmp(ns, "awk") != 0) {
+		error_ln(sourceline, _("using reserved identifier `%s' as second component of a qualified name is not allowed"), subname);
+		goto done;
+	}
+
+	if (strcmp(ns, "awk") == 0) {
+		i = check_special(subname);
+		if (i >= 0) {
+			if ((tokentab[i].flags & GAWKX) != 0 && tokentab[i].class == LEX_BUILTIN)
+				;	// gawk additional builtin function, is ok
+			else
+				error_ln(sourceline, _("using reserved identifier `%s' as second component of a qualified name is not allowed"), subname);
+		}
+	} else
+		i = -1;
+done:
+	*end = ':';
+	return i;
+}
+
+/* set_namespace --- change the current namespace */
+
+static void
+set_namespace(INSTRUCTION *ns, INSTRUCTION *comment)
+{
+	if (ns == NULL)
+		return;
+
+	if (do_traditional || do_posix) {
+		error_ln(ns->source_line, _("@namespace is a gawk extension"));
+		efree(ns->lextok);
+		bcfree(ns);
+		return;
+	}
+
+	if (! is_valid_identifier(ns->lextok)) {
+		error_ln(ns->source_line, _("namespace name `%s' must meet identifier naming rules"), ns->lextok);
+		efree(ns->lextok);
+		bcfree(ns);
+		return;
+	}
+
+	int mid = check_special(ns->lextok);
+
+	if (mid >= 0) {
+		error_ln(ns->source_line, _("using reserved identifier `%s' as a namespace is not allowed"), ns->lextok);
+		efree(ns->lextok);
+		bcfree(ns);
+		return;
+	}
+
+	if (strcmp(ns->lextok, current_namespace) == 0)
+		;	// nothing to do
+	else if (strcmp(ns->lextok, awk_namespace) == 0) {
+		set_current_namespace(awk_namespace);
+	} else {
+		set_current_namespace(estrdup(ns->lextok, strlen(ns->lextok)));
+	}
+	efree(ns->lextok);
+
+	// save info and push on front of list of namespaces seen
+	INSTRUCTION *new_ns = instruction(Op_K_namespace);
+	new_ns->comment = comment;
+	new_ns->ns_name = estrdup(current_namespace, strlen(current_namespace));
+	new_ns->nexti = namespace_chain;
+	namespace_chain = new_ns;
+
+	ns->lextok = NULL;
+	bcfree(ns);
+
+	namespace_changed = true;
+
+	return;
+}
+
+/* qualify_name --- put name into namespace */
+
+static char *
+qualify_name(const char *name, size_t len)
+{
+	if (strchr(name, ':') != NULL)	// already qualified
+		return estrdup(name, len);
+
+	NODE *p = lookup(name);
+	if (p != NULL && p->type == Node_param_list)
+		return estrdup(name, len);
+
+	if (current_namespace != awk_namespace && ! is_all_upper(name)) {
+		size_t length = strlen(current_namespace) + 2 + len + 1;
+		char *buf;
+
+		emalloc(buf, char *, length, "qualify_name");
+		sprintf(buf, "%s::%s", current_namespace, name);
+
+		return buf;
+	}
+
+	return estrdup(name, len);
+}
diff --git a/gawk-5.0.1/awklib/ChangeLog b/gawk-5.0.1/awklib/ChangeLog
new file mode 100644
index 00000000000..3d83f77e06c
--- /dev/null
+++ b/gawk-5.0.1/awklib/ChangeLog
@@ -0,0 +1,13 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.1 to the list. Ooops.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/awklib/ChangeLog.0 b/gawk-5.0.1/awklib/ChangeLog.0
new file mode 100644
index 00000000000..7df2d178da6
--- /dev/null
+++ b/gawk-5.0.1/awklib/ChangeLog.0
@@ -0,0 +1,180 @@
+Mon Jan 10 21:40:05 2011  Andreas Buening    <andreas.buening@nexgo.de>
+
+	* Makefile.am (AWKPROG): Get correct path to gawk executable.
+
+Fri Nov 19 11:53:16 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: Remove special handling of CVS directories.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+2007-05-25  Andreas Schwab  <schwab@suse.de>
+
+	* Makefile.am: Add missing dependencies on stamp-eg.
+
+Wed Mar 14 13:22:52 2007  Andrew J. Schorr  <ajschorr@users.sourceforge.net>
+
+	* Makefile.am (AWKPROG): New macro to set locale sanely.
+	(stamp-eg): Use it instead of $AWK to do the extractions.
+
+Wed Mar 14 13:16:28 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (clean-local): Remove `eg.old' also.
+
+Sat Jan 13 21:17:33 2007  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* Makefile.am (stamp-eg): Allow rebuilding from a VPATH build.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Mon Jun 20 23:20:22 2005   Andreas Schwab       <schwab@suse.de>
+
+	* Makefile.am: Install pwcat and grcat in pkglibexecdir instead of
+	libexecdir.
+
+Wed Feb  9 10:13:27 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Makefile.am (pkgdatadir, pkglibexecdir): Use $(datadir) and
+	$(libexecdir) instead of @datadir@ and @libexecdir@ for coolest
+	GNU Coding Standards compatibility and functionality. Per Stepan
+	Kasal.
+
+Tue Feb  8 18:57:08 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Makefile.am (pkgdatadir, pkglibexecdir): New variables for compatibility
+	with current GNU Coding Standards.  Fixed uses. Thanks to Stepan Kasal
+	and the discussion in bug-gnu-utils.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+Thu Mar 18 17:43:59 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (INCLUDES): Renamed to AM_CPPFLAGS. Per
+	Stepan Kasal.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Thu Oct 10 13:24:09 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (INCLUDES): Added to get .. for build dir
+	which will have config.h in it.
+	(grcat,pwcat): Use $(COMPILE) instead of $(CC) to get
+	$(INCLUDES) included.
+
+Tue Jun 11 23:43:36 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (grcat): Add def for config.h and -I flag.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+Wed Apr 17 15:20:27 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (clean): Add *.exe to list of files to be cleaned.
+
+2002-01-27  Bruno Haible  <bruno@clisp.org>
+
+	* eg/lib/libintl.awk (dcngettext): New function.
+
+Sun Jun  3 13:04:44 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.0: Release tar file made.  And there was
+	rejoicing.
+
+2001-02-26  Paul Eggert  <eggert@twinsun.com>
+
+	* Makefile.am (stamp-eg): Use $(AWK), not awk, as the
+	native awk might not work.
+
+2001-02-26  Andreas Schwab  <schwab@suse.de>
+
+	* Makefile.am: Install igawk as script.
+
+Mon Nov  6 15:29:08 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: Fixed to have all functionality from before
+	the switch to automake.
+	* extract.awk: Updated to match version in the doc.
+
+Sat Jul 26 23:08:29 1997  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (install-strip): new target.
+
+Mon Aug  7 15:23:00 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.6: Release tar file made.
+
+Sun Jun 25 15:08:19 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.5: Release tar file made.
+
+Wed Jun 30 16:14:36 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Release 3.0.4: Release tar file made.  This time for sure.
+
+Thu May 15 12:49:08 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.3: Release tar file made.
+
+Fri Apr 18 07:55:47 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* BETA Release 3.0.34: Release tar file made.
+
+Sun Apr 13 15:40:55 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (install): fix second for loop to use $$i. Sigh.
+
+Wed Dec 25 11:25:22 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.2: Release tar file made.
+
+Wed Dec 25 11:17:32 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (install): remove chmod command; let
+	$(INSTALL_PROGRAM) use -m.
+
+Tue Dec 17 22:29:49 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (install): fix installation of files in eg/lib.
+
+Tue Dec 10 23:09:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.1: Release tar file made.
+
+Sun Oct 20 12:30:41 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (install): minor tweaks for portability.
+
+Fri Mar 15 06:33:38 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (pwcat, grcat): Add $(LDFLAGS).
+	(clean): add `*~' to list of files to be removed.
+
+Wed Jan 24 10:06:16 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (clean): Remove $(AUXAWK).
+	(maintainer-clean): Depend on distclean, not the other way around.
diff --git a/gawk-5.0.1/awklib/ChangeLog.1 b/gawk-5.0.1/awklib/ChangeLog.1
new file mode 100644
index 00000000000..adeb2dd3827
--- /dev/null
+++ b/gawk-5.0.1/awklib/ChangeLog.1
@@ -0,0 +1,103 @@
+2018-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (distclean-local): Remove .deps directory.
+
+2018-09-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.in: Regenerated, using Automake 1.16.1.
+
+2018-05-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* extract.awk: Updated after changes.
+
+2018-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* .gitignore: Add pwcat.c and grcat.c. Remove igawk. Sort the list.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2015-08-28	Daniel Richard G.	<skunk@iSKUNK.ORG>
+
+	* Makefile.am: Build pwcat.c and grcat.c with (copied)
+	source in the current directory, so that (1) we can use
+	Automake-generated build rules instead of rolling our own, and
+	(2) Automake doesn't then admonish us to enable subdir-objects
+	due to the source files being in another directory.
+	* Makefile.am: Make the $(srcdir)/stamp-eg rule depend
+	on gawktexi.in instead of the gawk.texi file that is generated
+	from same, so that the build doesn't break if the latter is
+	missing.
+
+2015-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* extract.awk: Sync with current version in the doc. Thanks to
+	Antonio Columbo for pointing this out.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2014-11-05         Juergen Kahrs       <juergen.kahrs@googlemail.com>
+
+	* Makefile.am (AWKPROG): Add quotes around the name in case the
+	build dir has spaces in it.
+
+2014-10-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (stamp-eg): Use explicit ./extract.awk to avoid
+	assumptions about AWKPATH in the environment.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (clean-local): Clean up .dSYM directories for Mac OS X.
+	Thanks to Hermann Piefer for the suggestion.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-02-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (AWKPROG): Add definition and conditional for
+	cross compiling. Thanks to Juergen Kahrs.
+
+2013-01-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* eg/lib/inplace.awk: Add new file generated from doc/gawk.texi.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2011-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.0.
+	* 4.0.0: Remake the tar ball.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/awklib/Makefile.am b/gawk-5.0.1/awklib/Makefile.am
new file mode 100644
index 00000000000..20e9edba70c
--- /dev/null
+++ b/gawk-5.0.1/awklib/Makefile.am
@@ -0,0 +1,94 @@
+#
+# awklib/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 1995-2006 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+## process this file with automake to produce Makefile.in
+
+EXTRA_DIST = ChangeLog ChangeLog.0 ChangeLog.1 \
+		extract.awk eg $(srcdir)/stamp-eg
+# With some locales, the script extract.awk fails.
+# So we fix the locale to some sensible value.
+
+if TEST_CROSS_COMPILE
+AWKPROG = LC_ALL=C LANG=C awk$(EXEEXT)
+else
+AWKPROG = LC_ALL=C LANG=C "$(abs_top_builddir)/gawk$(EXEEXT)"
+endif
+
+# Get config.h from the build directory and custom.h from the source directory.
+AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)
+
+pkgdatadir = $(datadir)/awk
+pkglibexecdir = $(libexecdir)/awk
+
+pkglibexec_PROGRAMS = pwcat grcat
+AUXAWK = passwd.awk group.awk
+nodist_grcat_SOURCES = grcat.c
+nodist_pwcat_SOURCES = pwcat.c
+
+CLEANFILES = $(nodist_grcat_SOURCES) $(nodist_pwcat_SOURCES)
+
+all: $(srcdir)/stamp-eg $(AUXPROGS) $(AUXAWK)
+
+install-exec-hook: $(AUXAWK)
+	$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+	for i in $(AUXAWK) $(srcdir)/eg/lib/*.awk ; do \
+		progname=`echo $$i | sed 's;.*/;;'` ; \
+		$(INSTALL_DATA) $$i $(DESTDIR)$(pkgdatadir)/$$progname ; \
+	done
+
+# pkglibexecdir and pkgdatadir are removed in the top level Makefile's uninstall
+uninstall-local:
+	rm -fr $(DESTDIR)$(pkglibexecdir)/* $(DESTDIR)$(pkgdatadir)/*
+
+clean-local:
+	rm -f $(AUXAWK) *.exe
+	rm -fr eg.old
+	rm -fr grcat.dSYM pwcat.dSYM
+
+$(srcdir)/stamp-eg: $(srcdir)/../doc/gawktexi.in $(srcdir)/../doc/gawkinet.texi
+	cd $(srcdir) && \
+	rm -fr eg && \
+	rm -fr stamp-eg && \
+	$(AWKPROG) -f ./extract.awk ../doc/gawktexi.in ../doc/gawkinet.texi
+	@echo 'some makes are stupid and will not check a directory' > $(srcdir)/stamp-eg
+	@echo 'against a file, so this file is a place holder. gack.' >> $(srcdir)/stamp-eg
+
+pwcat.c: $(srcdir)/eg/lib/pwcat.c
+	rm -f $@
+	$(LN_S) $(srcdir)/eg/lib/pwcat.c .
+
+grcat.c: $(srcdir)/eg/lib/grcat.c
+	rm -f $@
+	$(LN_S) $(srcdir)/eg/lib/grcat.c .
+
+$(srcdir)/eg/lib/pwcat.c $(srcdir)/eg/lib/grcat.c $(srcdir)/eg/prog/igawk.sh \
+$(srcdir)/eg/lib/passwdawk.in $(srcdir)/eg/lib/groupawk.in: stamp-eg; @:
+
+passwd.awk: $(srcdir)/eg/lib/passwdawk.in
+	sed 's;/usr/local/libexec/awk;$(pkglibexecdir);' < $(srcdir)/eg/lib/passwdawk.in > passwd.awk
+
+group.awk: $(srcdir)/eg/lib/groupawk.in
+	sed 's;/usr/local/libexec/awk;$(pkglibexecdir);' < $(srcdir)/eg/lib/groupawk.in > group.awk
+
+distclean-local:
+	rm -fr .deps
diff --git a/gawk-5.0.1/awklib/Makefile.in b/gawk-5.0.1/awklib/Makefile.in
new file mode 100644
index 00000000000..449a5bf7fe6
--- /dev/null
+++ b/gawk-5.0.1/awklib/Makefile.in
@@ -0,0 +1,721 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# awklib/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 1995-2006 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+pkglibexec_PROGRAMS = pwcat$(EXEEXT) grcat$(EXEEXT)
+subdir = awklib
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \
+	$(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libsigsegv.m4 $(top_srcdir)/m4/longlong.m4 \
+	$(top_srcdir)/m4/mpfr.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/noreturn.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/readline.m4 \
+	$(top_srcdir)/m4/socket.m4 $(top_srcdir)/m4/ulonglong.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(pkglibexecdir)"
+PROGRAMS = $(pkglibexec_PROGRAMS)
+nodist_grcat_OBJECTS = grcat.$(OBJEXT)
+grcat_OBJECTS = $(nodist_grcat_OBJECTS)
+grcat_LDADD = $(LDADD)
+nodist_pwcat_OBJECTS = pwcat.$(OBJEXT)
+pwcat_OBJECTS = $(nodist_pwcat_OBJECTS)
+pwcat_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/grcat.Po ./$(DEPDIR)/pwcat.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(nodist_grcat_SOURCES) $(nodist_pwcat_SOURCES)
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+	$(top_srcdir)/mkinstalldirs ChangeLog
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+pkgdatadir = $(datadir)/awk
+pkglibexecdir = $(libexecdir)/awk
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GAWKLIBEXT = @GAWKLIBEXT@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_LIBSIGSEGV = @HAVE_LIBSIGSEGV@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMPFR = @LIBMPFR@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBSIGSEGV = @LIBSIGSEGV@
+LIBSIGSEGV_PREFIX = @LIBSIGSEGV_PREFIX@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSIGSEGV = @LTLIBSIGSEGV@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+ZOS_FAIL = @ZOS_FAIL@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+acl_shlibext = @acl_shlibext@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgextensiondir = @pkgextensiondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = ChangeLog ChangeLog.0 ChangeLog.1 \
+		extract.awk eg $(srcdir)/stamp-eg
+
+@TEST_CROSS_COMPILE_FALSE@AWKPROG = LC_ALL=C LANG=C "$(abs_top_builddir)/gawk$(EXEEXT)"
+# With some locales, the script extract.awk fails.
+# So we fix the locale to some sensible value.
+@TEST_CROSS_COMPILE_TRUE@AWKPROG = LC_ALL=C LANG=C awk$(EXEEXT)
+
+# Get config.h from the build directory and custom.h from the source directory.
+AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)
+AUXAWK = passwd.awk group.awk
+nodist_grcat_SOURCES = grcat.c
+nodist_pwcat_SOURCES = pwcat.c
+CLEANFILES = $(nodist_grcat_SOURCES) $(nodist_pwcat_SOURCES)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu awklib/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu awklib/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-pkglibexecPROGRAMS: $(pkglibexec_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(pkglibexec_PROGRAMS)'; test -n "$(pkglibexecdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkglibexecdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkglibexecdir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	      echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(pkglibexecdir)$$dir'"; \
+	      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(pkglibexecdir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-pkglibexecPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkglibexec_PROGRAMS)'; test -n "$(pkglibexecdir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(pkglibexecdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(pkglibexecdir)" && rm -f $$files
+
+clean-pkglibexecPROGRAMS:
+	-test -z "$(pkglibexec_PROGRAMS)" || rm -f $(pkglibexec_PROGRAMS)
+
+grcat$(EXEEXT): $(grcat_OBJECTS) $(grcat_DEPENDENCIES) $(EXTRA_grcat_DEPENDENCIES) 
+	@rm -f grcat$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(grcat_OBJECTS) $(grcat_LDADD) $(LIBS)
+
+pwcat$(EXEEXT): $(pwcat_OBJECTS) $(pwcat_DEPENDENCIES) $(EXTRA_pwcat_DEPENDENCIES) 
+	@rm -f pwcat$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(pwcat_OBJECTS) $(pwcat_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grcat.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pwcat.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+	for dir in "$(DESTDIR)$(pkglibexecdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local clean-pkglibexecPROGRAMS \
+	mostlyclean-am
+
+distclean: distclean-am
+		-rm -f ./$(DEPDIR)/grcat.Po
+	-rm -f ./$(DEPDIR)/pwcat.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-pkglibexecPROGRAMS
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f ./$(DEPDIR)/grcat.Po
+	-rm -f ./$(DEPDIR)/pwcat.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-local uninstall-pkglibexecPROGRAMS
+
+.MAKE: install-am install-exec-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+	clean-generic clean-local clean-pkglibexecPROGRAMS \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-local distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-exec-hook install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-pkglibexecPROGRAMS \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am uninstall-local uninstall-pkglibexecPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+all: $(srcdir)/stamp-eg $(AUXPROGS) $(AUXAWK)
+
+install-exec-hook: $(AUXAWK)
+	$(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+	for i in $(AUXAWK) $(srcdir)/eg/lib/*.awk ; do \
+		progname=`echo $$i | sed 's;.*/;;'` ; \
+		$(INSTALL_DATA) $$i $(DESTDIR)$(pkgdatadir)/$$progname ; \
+	done
+
+# pkglibexecdir and pkgdatadir are removed in the top level Makefile's uninstall
+uninstall-local:
+	rm -fr $(DESTDIR)$(pkglibexecdir)/* $(DESTDIR)$(pkgdatadir)/*
+
+clean-local:
+	rm -f $(AUXAWK) *.exe
+	rm -fr eg.old
+	rm -fr grcat.dSYM pwcat.dSYM
+
+$(srcdir)/stamp-eg: $(srcdir)/../doc/gawktexi.in $(srcdir)/../doc/gawkinet.texi
+	cd $(srcdir) && \
+	rm -fr eg && \
+	rm -fr stamp-eg && \
+	$(AWKPROG) -f ./extract.awk ../doc/gawktexi.in ../doc/gawkinet.texi
+	@echo 'some makes are stupid and will not check a directory' > $(srcdir)/stamp-eg
+	@echo 'against a file, so this file is a place holder. gack.' >> $(srcdir)/stamp-eg
+
+pwcat.c: $(srcdir)/eg/lib/pwcat.c
+	rm -f $@
+	$(LN_S) $(srcdir)/eg/lib/pwcat.c .
+
+grcat.c: $(srcdir)/eg/lib/grcat.c
+	rm -f $@
+	$(LN_S) $(srcdir)/eg/lib/grcat.c .
+
+$(srcdir)/eg/lib/pwcat.c $(srcdir)/eg/lib/grcat.c $(srcdir)/eg/prog/igawk.sh \
+$(srcdir)/eg/lib/passwdawk.in $(srcdir)/eg/lib/groupawk.in: stamp-eg; @:
+
+passwd.awk: $(srcdir)/eg/lib/passwdawk.in
+	sed 's;/usr/local/libexec/awk;$(pkglibexecdir);' < $(srcdir)/eg/lib/passwdawk.in > passwd.awk
+
+group.awk: $(srcdir)/eg/lib/groupawk.in
+	sed 's;/usr/local/libexec/awk;$(pkglibexecdir);' < $(srcdir)/eg/lib/groupawk.in > group.awk
+
+distclean-local:
+	rm -fr .deps
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/awklib/eg/data/class_data1 b/gawk-5.0.1/awklib/eg/data/class_data1
new file mode 100644
index 00000000000..864c2842710
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/data/class_data1
@@ -0,0 +1,3 @@
+Biology_101 sum average data: 87.0 92.4 78.5 94.9
+Chemistry_305 sum average data: 75.2 98.3 94.7 88.2
+English_401 sum average data: 100.0 95.6 87.1 93.4
diff --git a/gawk-5.0.1/awklib/eg/data/class_data2 b/gawk-5.0.1/awklib/eg/data/class_data2
new file mode 100644
index 00000000000..f5de0e29049
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/data/class_data2
@@ -0,0 +1,3 @@
+Biology_101 sum average sort rsort data: 87.0 92.4 78.5 94.9
+Chemistry_305 sum average sort rsort data: 75.2 98.3 94.7 88.2
+English_401 sum average sort rsort data: 100.0 95.6 87.1 93.4
diff --git a/gawk-5.0.1/awklib/eg/data/guide-mellow.po b/gawk-5.0.1/awklib/eg/data/guide-mellow.po
new file mode 100644
index 00000000000..98c388d8698
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/data/guide-mellow.po
@@ -0,0 +1,8 @@
+#: guide.awk:4
+msgid "Don't Panic"
+msgstr "Hey man, relax!"
+
+#: guide.awk:5
+msgid "The Answer Is"
+msgstr "Like, the scoop is"
+
diff --git a/gawk-5.0.1/awklib/eg/data/guide.po b/gawk-5.0.1/awklib/eg/data/guide.po
new file mode 100644
index 00000000000..de21218a52b
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/data/guide.po
@@ -0,0 +1,8 @@
+#: guide.awk:4
+msgid "Don't Panic"
+msgstr ""
+
+#: guide.awk:5
+msgid "The Answer Is"
+msgstr ""
+
diff --git a/gawk-5.0.1/awklib/eg/data/inventory-shipped b/gawk-5.0.1/awklib/eg/data/inventory-shipped
new file mode 100644
index 00000000000..6788a0ef37a
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/data/inventory-shipped
@@ -0,0 +1,17 @@
+Jan  13  25  15 115
+Feb  15  32  24 226
+Mar  15  24  34 228
+Apr  31  52  63 420
+May  16  34  29 208
+Jun  31  42  75 492
+Jul  24  34  67 436
+Aug  15  34  47 316
+Sep  13  55  37 277
+Oct  29  54  68 525
+Nov  20  87  82 577
+Dec  17  35  61 401
+
+Jan  21  36  64 620
+Feb  26  58  80 652
+Mar  24  75  70 495
+Apr  21  70  74 514
diff --git a/gawk-5.0.1/awklib/eg/data/mail-list b/gawk-5.0.1/awklib/eg/data/mail-list
new file mode 100644
index 00000000000..37ff350acb1
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/data/mail-list
@@ -0,0 +1,11 @@
+Amelia       555-5553     amelia.zodiacusque@gmail.com    F
+Anthony      555-3412     anthony.asserturo@hotmail.com   A
+Becky        555-7685     becky.algebrarum@gmail.com      A
+Bill         555-1675     bill.drowning@hotmail.com       A
+Broderick    555-0542     broderick.aliquotiens@yahoo.com R
+Camilla      555-2912     camilla.infusarum@skynet.be     R
+Fabius       555-1234     fabius.undevicesimus@ucb.edu    F
+Julie        555-6699     julie.perscrutabor@skeeve.com   F
+Martin       555-6480     martin.codicibus@hotmail.com    A
+Samuel       555-3430     samuel.lanceolis@shu.edu        A
+Jean-Paul    555-2127     jeanpaul.campanorum@nyu.edu     R
diff --git a/gawk-5.0.1/awklib/eg/lib/assert.awk b/gawk-5.0.1/awklib/eg/lib/assert.awk
new file mode 100644
index 00000000000..c8e13490f44
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/assert.awk
@@ -0,0 +1,20 @@
+# assert --- assert that a condition is true. Otherwise, exit.
+
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May, 1993
+
+function assert(condition, string)
+{
+    if (! condition) {
+        printf("%s:%d: assertion failed: %s\n",
+            FILENAME, FNR, string) > "/dev/stderr"
+        _assert_exit = 1
+        exit 1
+    }
+}
+
+END {
+    if (_assert_exit)
+        exit 1
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/bits2str.awk b/gawk-5.0.1/awklib/eg/lib/bits2str.awk
new file mode 100644
index 00000000000..5dddc1cedd8
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/bits2str.awk
@@ -0,0 +1,16 @@
+# bits2str --- turn an integer into readable ones and zeros
+
+function bits2str(bits,        data, mask)
+{
+    if (bits == 0)
+        return "0"
+
+    mask = 1
+    for (; bits != 0; bits = rshift(bits, 1))
+        data = (and(bits, mask) ? "1" : "0") data
+
+    while ((length(data) % 8) != 0)
+        data = "0" data
+
+    return data
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/cliff_rand.awk b/gawk-5.0.1/awklib/eg/lib/cliff_rand.awk
new file mode 100644
index 00000000000..e6a793aa483
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/cliff_rand.awk
@@ -0,0 +1,14 @@
+# cliff_rand.awk --- generate Cliff random numbers
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# December 2000
+
+BEGIN { _cliff_seed = 0.1 }
+
+function cliff_rand()
+{
+    _cliff_seed = (100 * log(_cliff_seed)) % 1
+    if (_cliff_seed < 0)
+        _cliff_seed = - _cliff_seed
+    return _cliff_seed
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/ctime.awk b/gawk-5.0.1/awklib/eg/lib/ctime.awk
new file mode 100644
index 00000000000..cea25b7a292
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/ctime.awk
@@ -0,0 +1,12 @@
+# ctime.awk
+#
+# awk version of C ctime(3) function
+
+function ctime(ts,    format)
+{
+    format = "%a %b %e %H:%M:%S %Z %Y"
+
+    if (ts == 0)
+        ts = systime()       # use current time as default
+    return strftime(format, ts)
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/ftrans.awk b/gawk-5.0.1/awklib/eg/lib/ftrans.awk
new file mode 100644
index 00000000000..6461efff36b
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/ftrans.awk
@@ -0,0 +1,15 @@
+# ftrans.awk --- handle datafile transitions
+#
+# user supplies beginfile() and endfile() functions
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# November 1992
+
+FNR == 1 {
+    if (_filename_ != "")
+        endfile(_filename_)
+    _filename_ = FILENAME
+    beginfile(FILENAME)
+}
+
+END { endfile(_filename_) }
diff --git a/gawk-5.0.1/awklib/eg/lib/getopt.awk b/gawk-5.0.1/awklib/eg/lib/getopt.awk
new file mode 100644
index 00000000000..6b1f4c5078f
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/getopt.awk
@@ -0,0 +1,79 @@
+# getopt.awk --- Do C library getopt(3) function in awk
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+#
+# Initial version: March, 1991
+# Revised: May, 1993
+
+# External variables:
+#    Optind -- index in ARGV of first nonoption argument
+#    Optarg -- string value of argument to current option
+#    Opterr -- if nonzero, print our own diagnostic
+#    Optopt -- current option letter
+
+# Returns:
+#    -1     at end of options
+#    "?"    for unrecognized option
+#    <c>    a character representing the current option
+
+# Private Data:
+#    _opti  -- index in multiflag option, e.g., -abc
+function getopt(argc, argv, options,    thisopt, i)
+{
+    if (length(options) == 0)    # no options given
+        return -1
+
+    if (argv[Optind] == "--") {  # all done
+        Optind++
+        _opti = 0
+        return -1
+    } else if (argv[Optind] !~ /^-[^:[:space:]]/) {
+        _opti = 0
+        return -1
+    }
+    if (_opti == 0)
+        _opti = 2
+    thisopt = substr(argv[Optind], _opti, 1)
+    Optopt = thisopt
+    i = index(options, thisopt)
+    if (i == 0) {
+        if (Opterr)
+            printf("%c -- invalid option\n", thisopt) > "/dev/stderr"
+        if (_opti >= length(argv[Optind])) {
+            Optind++
+            _opti = 0
+        } else
+            _opti++
+        return "?"
+    }
+    if (substr(options, i + 1, 1) == ":") {
+        # get option argument
+        if (length(substr(argv[Optind], _opti + 1)) > 0)
+            Optarg = substr(argv[Optind], _opti + 1)
+        else
+            Optarg = argv[++Optind]
+        _opti = 0
+    } else
+        Optarg = ""
+    if (_opti == 0 || _opti >= length(argv[Optind])) {
+        Optind++
+        _opti = 0
+    } else
+        _opti++
+    return thisopt
+}
+BEGIN {
+    Opterr = 1    # default is to diagnose
+    Optind = 1    # skip ARGV[0]
+
+    # test program
+    if (_getopt_test) {
+        while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
+            printf("c = <%c>, Optarg = <%s>\n",
+                                       _go_c, Optarg)
+        printf("non-option arguments:\n")
+        for (; Optind < ARGC; Optind++)
+            printf("\tARGV[%d] = <%s>\n",
+                                    Optind, ARGV[Optind])
+    }
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/gettime.awk b/gawk-5.0.1/awklib/eg/lib/gettime.awk
new file mode 100644
index 00000000000..4cb56330653
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/gettime.awk
@@ -0,0 +1,62 @@
+# getlocaltime.awk --- get the time of day in a usable format
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain, May 1993
+#
+
+# Returns a string in the format of output of date(1)
+# Populates the array argument time with individual values:
+#    time["second"]       -- seconds (0 - 59)
+#    time["minute"]       -- minutes (0 - 59)
+#    time["hour"]         -- hours (0 - 23)
+#    time["althour"]      -- hours (0 - 12)
+#    time["monthday"]     -- day of month (1 - 31)
+#    time["month"]        -- month of year (1 - 12)
+#    time["monthname"]    -- name of the month
+#    time["shortmonth"]   -- short name of the month
+#    time["year"]         -- year modulo 100 (0 - 99)
+#    time["fullyear"]     -- full year
+#    time["weekday"]      -- day of week (Sunday = 0)
+#    time["altweekday"]   -- day of week (Monday = 0)
+#    time["dayname"]      -- name of weekday
+#    time["shortdayname"] -- short name of weekday
+#    time["yearday"]      -- day of year (0 - 365)
+#    time["timezone"]     -- abbreviation of timezone name
+#    time["ampm"]         -- AM or PM designation
+#    time["weeknum"]      -- week number, Sunday first day
+#    time["altweeknum"]   -- week number, Monday first day
+
+function getlocaltime(time,    ret, now, i)
+{
+    # get time once, avoids unnecessary system calls
+    now = systime()
+
+    # return date(1)-style output
+    ret = strftime("%a %b %e %H:%M:%S %Z %Y", now)
+
+    # clear out target array
+    delete time
+
+    # fill in values, force numeric values to be
+    # numeric by adding 0
+    time["second"]       = strftime("%S", now) + 0
+    time["minute"]       = strftime("%M", now) + 0
+    time["hour"]         = strftime("%H", now) + 0
+    time["althour"]      = strftime("%I", now) + 0
+    time["monthday"]     = strftime("%d", now) + 0
+    time["month"]        = strftime("%m", now) + 0
+    time["monthname"]    = strftime("%B", now)
+    time["shortmonth"]   = strftime("%b", now)
+    time["year"]         = strftime("%y", now) + 0
+    time["fullyear"]     = strftime("%Y", now) + 0
+    time["weekday"]      = strftime("%w", now) + 0
+    time["altweekday"]   = strftime("%u", now) + 0
+    time["dayname"]      = strftime("%A", now)
+    time["shortdayname"] = strftime("%a", now)
+    time["yearday"]      = strftime("%j", now) + 0
+    time["timezone"]     = strftime("%Z", now)
+    time["ampm"]         = strftime("%p", now)
+    time["weeknum"]      = strftime("%U", now) + 0
+    time["altweeknum"]   = strftime("%W", now) + 0
+
+    return ret
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/grcat.c b/gawk-5.0.1/awklib/eg/lib/grcat.c
new file mode 100644
index 00000000000..30e81cca76e
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/grcat.c
@@ -0,0 +1,49 @@
+/*
+ * grcat.c
+ *
+ * Generate a printable version of the group database.
+ */
+/*
+ * Arnold Robbins, arnold@skeeve.com, May 1993
+ * Public Domain
+ * December 2010, move to ANSI C definition for main().
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined (STDC_HEADERS)
+#include <stdlib.h>
+#endif
+
+#ifndef HAVE_GETGRENT
+int main() { return 0; }
+#else
+#include <stdio.h>
+#include <grp.h>
+
+int
+main(int argc, char **argv)
+{
+    struct group *g;
+    int i;
+
+    while ((g = getgrent()) != NULL) {
+#ifdef HAVE_STRUCT_GROUP_GR_PASSWD
+        printf("%s:%s:%ld:", g->gr_name, g->gr_passwd,
+                                     (long) g->gr_gid);
+#else
+        printf("%s:*:%ld:", g->gr_name, (long) g->gr_gid);
+#endif
+        for (i = 0; g->gr_mem[i] != NULL; i++) {
+            printf("%s", g->gr_mem[i]);
+            if (g->gr_mem[i+1] != NULL)
+                putchar(',');
+        }
+        putchar('\n');
+    }
+    endgrent();
+    return 0;
+}
+#endif /* HAVE_GETGRENT */
diff --git a/gawk-5.0.1/awklib/eg/lib/groupawk.in b/gawk-5.0.1/awklib/eg/lib/groupawk.in
new file mode 100644
index 00000000000..f9e1e203c7a
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/groupawk.in
@@ -0,0 +1,83 @@
+# group.awk --- functions for dealing with the group file
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+
+BEGIN {
+    # Change to suit your system
+    _gr_awklib = "/usr/local/libexec/awk/"
+}
+
+function _gr_init(    oldfs, oldrs, olddol0, grcat,
+                             using_fw, using_fpat, n, a, i)
+{
+    if (_gr_inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    grcat = _gr_awklib "grcat"
+    while ((grcat | getline) > 0) {
+        if ($1 in _gr_byname)
+            _gr_byname[$1] = _gr_byname[$1] "," $4
+        else
+            _gr_byname[$1] = $0
+        if ($3 in _gr_bygid)
+            _gr_bygid[$3] = _gr_bygid[$3] "," $4
+        else
+            _gr_bygid[$3] = $0
+
+        n = split($4, a, "[ \t]*,[ \t]*")
+        for (i = 1; i <= n; i++)
+            if (a[i] in _gr_groupsbyuser)
+                _gr_groupsbyuser[a[i]] = _gr_groupsbyuser[a[i]] " " $1
+            else
+                _gr_groupsbyuser[a[i]] = $1
+
+        _gr_bycount[++_gr_count] = $0
+    }
+    close(grcat)
+    _gr_count = 0
+    _gr_inited++
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+}
+function getgrnam(group)
+{
+    _gr_init()
+    return _gr_byname[group]
+}
+function getgrgid(gid)
+{
+    _gr_init()
+    return _gr_bygid[gid]
+}
+function getgruser(user)
+{
+    _gr_init()
+    return _gr_groupsbyuser[user]
+}
+function getgrent()
+{
+    _gr_init()
+    if (++_gr_count in _gr_bycount)
+        return _gr_bycount[_gr_count]
+    return ""
+}
+function endgrent()
+{
+    _gr_count = 0
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/have_mpfr.awk b/gawk-5.0.1/awklib/eg/lib/have_mpfr.awk
new file mode 100644
index 00000000000..90bd523b53a
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/have_mpfr.awk
@@ -0,0 +1,9 @@
+# adequate_math_precision --- return true if we have enough bits
+#
+# Andrew Schorr, aschorr@telemetry-investments.com, Public Domain
+# May 2017
+
+function adequate_math_precision(n)
+{
+    return (1 != (1+(1/(2^(n-1)))))
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/inplace.awk b/gawk-5.0.1/awklib/eg/lib/inplace.awk
new file mode 100644
index 00000000000..68dad92efed
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/inplace.awk
@@ -0,0 +1,61 @@
+# inplace --- load and invoke the inplace extension.
+# 
+# Copyright (C) 2013, 2017 the Free Software Foundation, Inc.
+# 
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+# 
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# Andrew J. Schorr, aschorr@telemetry-investments.com
+# January 2013
+#
+# Revised for namespaces
+# Arnold Robbins, arnold@skeeve.com
+# July 2017
+
+@load "inplace"
+
+# Please set inplace::suffix to make a backup copy.  For example, you may
+# want to set inplace::suffix to .bak on the command line or in a BEGIN rule.
+
+# By default, each filename on the command line will be edited inplace.
+# But you can selectively disable this by adding an inplace=0 argument
+# prior to files that you do not want to process this way.  You can then
+# reenable it later on the commandline by putting inplace=1 before files
+# that you wish to be subject to inplace editing.
+
+# N.B. We call inplace::end() in the BEGINFILE and END rules so that any
+# actions in an ENDFILE rule will be redirected as expected.
+
+@namespace "inplace"
+
+BEGIN {
+    enable = 1         # enabled by default
+}
+
+BEGINFILE {
+    if (filename != "")
+        end(filename, suffix)
+    if (enable)
+        begin(filename = FILENAME, suffix)
+    else
+        filename = ""
+}
+
+END {
+    if (filename != "")
+        end(filename, suffix)
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/intdiv0.awk b/gawk-5.0.1/awklib/eg/lib/intdiv0.awk
new file mode 100644
index 00000000000..9de5978e874
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/intdiv0.awk
@@ -0,0 +1,23 @@
+# intdiv0 --- do integer division
+
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# July, 2014
+#
+# Name changed from div() to intdiv()
+# April, 2015
+#
+# Changed to intdiv0()
+# April, 2016
+
+function intdiv0(numerator, denominator, result)
+{
+    split("", result)
+
+    numerator = int(numerator)
+    denominator = int(denominator)
+    result["quotient"] = int(numerator / denominator)
+    result["remainder"] = int(numerator % denominator)
+
+    return 0.0
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/join.awk b/gawk-5.0.1/awklib/eg/lib/join.awk
new file mode 100644
index 00000000000..4a4ac927f52
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/join.awk
@@ -0,0 +1,16 @@
+# join.awk --- join an array into a string
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+
+function join(array, start, end, sep,    result, i)
+{
+    if (sep == "")
+       sep = " "
+    else if (sep == SUBSEP) # magic value
+       sep = ""
+    result = array[start]
+    for (i = start + 1; i <= end; i++)
+        result = result sep array[i]
+    return result
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/libintl.awk b/gawk-5.0.1/awklib/eg/lib/libintl.awk
new file mode 100644
index 00000000000..7efd2b47cad
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/libintl.awk
@@ -0,0 +1,14 @@
+function bindtextdomain(dir, domain)
+{
+    return dir
+}
+
+function dcgettext(string, domain, category)
+{
+    return string
+}
+
+function dcngettext(string1, string2, number, domain, category)
+{
+    return (number == 1 ? string1 : string2)
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/noassign.awk b/gawk-5.0.1/awklib/eg/lib/noassign.awk
new file mode 100644
index 00000000000..99227b37de3
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/noassign.awk
@@ -0,0 +1,17 @@
+# noassign.awk --- library file to avoid the need for a
+# special option that disables command-line assignments
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# October 1999
+
+function disable_assigns(argc, argv,    i)
+{
+    for (i = 1; i < argc; i++)
+        if (argv[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/)
+            argv[i] = ("./" argv[i])
+}
+
+BEGIN {
+    if (No_command_assign)
+        disable_assigns(ARGC, ARGV)
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/ns_passwd.awk b/gawk-5.0.1/awklib/eg/lib/ns_passwd.awk
new file mode 100644
index 00000000000..b9b6bce570f
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/ns_passwd.awk
@@ -0,0 +1,72 @@
+# ns_passwd.awk --- access password file information
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+#
+# Reworked for namespaces June 2017, with help from
+# Andrew J.: Schorr, aschorr@telemetry-investments.com
+
+@namespace "passwd"
+
+BEGIN {
+    # tailor this to suit your system
+    Awklib = "/usr/local/libexec/awk/"
+}
+
+function Init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+{
+    if (Inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    pwcat = Awklib "pwcat"
+    while ((pwcat | getline) > 0) {
+        Byname[$1] = $0
+        Byuid[$3] = $0
+        Bycount[++Total] = $0
+    }
+    close(pwcat)
+    Count = 0
+    Inited = 1
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+}
+
+function awk::getpwnam(name)
+{
+    Init()
+    return Byname[name]
+}
+
+function awk::getpwuid(uid)
+{
+    Init()
+    return Byuid[uid]
+}
+
+function awk::getpwent()
+{
+    Init()
+    if (Count < Total)
+        return Bycount[++Count]
+    return ""
+}
+
+function awk::endpwent()
+{
+    Count = 0
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/ord.awk b/gawk-5.0.1/awklib/eg/lib/ord.awk
new file mode 100644
index 00000000000..be47e15de13
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/ord.awk
@@ -0,0 +1,44 @@
+# ord.awk --- do ord and chr
+
+# Global identifiers:
+#    _ord_:        numerical values indexed by characters
+#    _ord_init:    function to initialize _ord_
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# 16 January, 1992
+# 20 July, 1992, revised
+
+BEGIN    { _ord_init() }
+
+function _ord_init(    low, high, i, t)
+{
+    low = sprintf("%c", 7) # BEL is ascii 7
+    if (low == "\a") {    # regular ascii
+        low = 0
+        high = 127
+    } else if (sprintf("%c", 128 + 7) == "\a") {
+        # ascii, mark parity
+        low = 128
+        high = 255
+    } else {        # ebcdic(!)
+        low = 0
+        high = 255
+    }
+
+    for (i = low; i <= high; i++) {
+        t = sprintf("%c", i)
+        _ord_[t] = i
+    }
+}
+function ord(str,    c)
+{
+    # only first character is of interest
+    c = substr(str, 1, 1)
+    return _ord_[c]
+}
+
+function chr(c)
+{
+    # force c to be numeric by adding 0
+    return sprintf("%c", c + 0)
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/passwdawk.in b/gawk-5.0.1/awklib/eg/lib/passwdawk.in
new file mode 100644
index 00000000000..d2442adb4dd
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/passwdawk.in
@@ -0,0 +1,63 @@
+# passwd.awk --- access password file information
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+
+BEGIN {
+    # tailor this to suit your system
+    _pw_awklib = "/usr/local/libexec/awk/"
+}
+
+function _pw_init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+{
+    if (_pw_inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    pwcat = _pw_awklib "pwcat"
+    while ((pwcat | getline) > 0) {
+        _pw_byname[$1] = $0
+        _pw_byuid[$3] = $0
+        _pw_bycount[++_pw_total] = $0
+    }
+    close(pwcat)
+    _pw_count = 0
+    _pw_inited = 1
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+}
+function getpwnam(name)
+{
+    _pw_init()
+    return _pw_byname[name]
+}
+function getpwuid(uid)
+{
+    _pw_init()
+    return _pw_byuid[uid]
+}
+function getpwent()
+{
+    _pw_init()
+    if (_pw_count < _pw_total)
+        return _pw_bycount[++_pw_count]
+    return ""
+}
+function endpwent()
+{
+    _pw_count = 0
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/processarray.awk b/gawk-5.0.1/awklib/eg/lib/processarray.awk
new file mode 100644
index 00000000000..79a86d1f2db
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/processarray.awk
@@ -0,0 +1,12 @@
+function process_array(arr, name, process, do_arrays,   i, new_name)
+{
+    for (i in arr) {
+        new_name = (name "[" i "]")
+        if (isarray(arr[i])) {
+            if (do_arrays)
+                @process(new_name, arr[i])
+            process_array(arr[i], new_name, process, do_arrays)
+        } else
+            @process(new_name, arr[i])
+    }
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/pwcat.c b/gawk-5.0.1/awklib/eg/lib/pwcat.c
new file mode 100644
index 00000000000..cfe250c36f5
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/pwcat.c
@@ -0,0 +1,41 @@
+/*
+ * pwcat.c
+ *
+ * Generate a printable version of the password database.
+ */
+/*
+ * Arnold Robbins, arnold@skeeve.com, May 1993
+ * Public Domain
+ * December 2010, move to ANSI C definition for main().
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <pwd.h>
+
+#if defined (STDC_HEADERS)
+#include <stdlib.h>
+#endif
+
+int
+main(int argc, char **argv)
+{
+    struct passwd *p;
+
+    while ((p = getpwent()) != NULL)
+#ifdef HAVE_STRUCT_PASSWD_PW_PASSWD
+        printf("%s:%s:%ld:%ld:%s:%s:%s\n",
+            p->pw_name, p->pw_passwd, (long) p->pw_uid,
+            (long) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell);
+#else
+        printf("%s:*:%ld:%ld:%s:%s\n",
+            p->pw_name, (long) p->pw_uid,
+            (long) p->pw_gid, p->pw_dir, p->pw_shell);
+#endif
+
+    endpwent();
+    return 0;
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/quicksort.awk b/gawk-5.0.1/awklib/eg/lib/quicksort.awk
new file mode 100644
index 00000000000..e0ed8bc770f
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/quicksort.awk
@@ -0,0 +1,35 @@
+# quicksort.awk --- Quicksort algorithm, with user-supplied
+#                   comparison function
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# January 2009
+
+
+# quicksort --- C.A.R. Hoare's quicksort algorithm. See Wikipedia
+#               or almost any algorithms or computer science text.
+#
+# Adapted from K&R-II, page 110
+
+function quicksort(data, left, right, less_than,    i, last)
+{
+    if (left >= right)  # do nothing if array contains fewer
+        return          # than two elements
+
+    quicksort_swap(data, left, int((left + right) / 2))
+    last = left
+    for (i = left + 1; i <= right; i++)
+        if (@less_than(data[i], data[left]))
+            quicksort_swap(data, ++last, i)
+    quicksort_swap(data, left, last)
+    quicksort(data, left, last - 1, less_than)
+    quicksort(data, last + 1, right, less_than)
+}
+
+# quicksort_swap --- helper function for quicksort, should really be inline
+
+function quicksort_swap(data, i, j,      temp)
+{
+    temp = data[i]
+    data[i] = data[j]
+    data[j] = temp
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/readable.awk b/gawk-5.0.1/awklib/eg/lib/readable.awk
new file mode 100644
index 00000000000..37970a824e3
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/readable.awk
@@ -0,0 +1,17 @@
+# readable.awk --- library file to skip over unreadable files
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# October 2000
+# December 2010
+
+BEGIN {
+    for (i = 1; i < ARGC; i++) {
+        if (ARGV[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/ \
+            || ARGV[i] == "-" || ARGV[i] == "/dev/stdin")
+            continue    # assignment or standard input
+        else if ((getline junk < ARGV[i]) < 0) # unreadable
+            delete ARGV[i]
+        else
+            close(ARGV[i])
+    }
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/readfile.awk b/gawk-5.0.1/awklib/eg/lib/readfile.awk
new file mode 100644
index 00000000000..9137b26d42a
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/readfile.awk
@@ -0,0 +1,15 @@
+# readfile.awk --- read an entire file at once
+#
+# Original idea by Denis Shirokov, cosmogen@gmail.com, April 2013
+#
+
+function readfile(file,     tmp, save_rs)
+{
+    save_rs = RS
+    RS = "^$"
+    getline tmp < file
+    close(file)
+    RS = save_rs
+
+    return tmp
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/rewind.awk b/gawk-5.0.1/awklib/eg/lib/rewind.awk
new file mode 100644
index 00000000000..a646eac2d37
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/rewind.awk
@@ -0,0 +1,20 @@
+# rewind.awk --- rewind the current file and start over
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# September 2000
+
+function rewind(    i)
+{
+    # shift remaining arguments up
+    for (i = ARGC; i > ARGIND; i--)
+        ARGV[i] = ARGV[i-1]
+
+    # make sure gawk knows to keep going
+    ARGC++
+
+    # make current file next to get done
+    ARGV[ARGIND+1] = FILENAME
+
+    # do it
+    nextfile
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/round.awk b/gawk-5.0.1/awklib/eg/lib/round.awk
new file mode 100644
index 00000000000..899645f1371
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/round.awk
@@ -0,0 +1,29 @@
+# round.awk --- do normal rounding
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# August, 1996
+
+function round(x,   ival, aval, fraction)
+{
+   ival = int(x)    # integer part, int() truncates
+
+   # see if fractional part
+   if (ival == x)   # no fraction
+      return ival   # ensure no decimals
+
+   if (x < 0) {
+      aval = -x     # absolute value
+      ival = int(aval)
+      fraction = aval - ival
+      if (fraction >= .5)
+         return int(x) - 1   # -2.5 --> -3
+      else
+         return int(x)       # -2.3 --> -2
+   } else {
+      fraction = x - ival
+      if (fraction >= .5)
+         return ival + 1
+      else
+         return ival
+   }
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/shellquote.awk b/gawk-5.0.1/awklib/eg/lib/shellquote.awk
new file mode 100644
index 00000000000..cd943dc757c
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/shellquote.awk
@@ -0,0 +1,22 @@
+# shell_quote --- quote an argument for passing to the shell
+#
+# Michael Brennan
+# brennan@madronabluff.com
+# September 2014
+
+function shell_quote(s,             # parameter
+    SINGLE, QSINGLE, i, X, n, ret)  # locals
+{
+    if (s == "")
+        return "\"\""
+
+    SINGLE = "\x27"  # single quote
+    QSINGLE = "\"\x27\""
+    n = split(s, X, SINGLE)
+
+    ret = SINGLE X[1] SINGLE
+    for (i = 2; i <= n; i++)
+        ret = ret QSINGLE SINGLE X[i] SINGLE
+
+    return ret
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/strtonum.awk b/gawk-5.0.1/awklib/eg/lib/strtonum.awk
new file mode 100644
index 00000000000..783496e4a95
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/strtonum.awk
@@ -0,0 +1,58 @@
+# mystrtonum --- convert string to number
+
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# February, 2004
+# Revised June, 2014
+
+function mystrtonum(str,        ret, n, i, k, c)
+{
+    if (str ~ /^0[0-7]*$/) {
+        # octal
+        n = length(str)
+        ret = 0
+        for (i = 1; i <= n; i++) {
+            c = substr(str, i, 1)
+            # index() returns 0 if c not in string,
+            # includes c == "0"
+            k = index("1234567", c)
+
+            ret = ret * 8 + k
+        }
+    } else if (str ~ /^0[xX][[:xdigit:]]+$/) {
+        # hexadecimal
+        str = substr(str, 3)    # lop off leading 0x
+        n = length(str)
+        ret = 0
+        for (i = 1; i <= n; i++) {
+            c = substr(str, i, 1)
+            c = tolower(c)
+            # index() returns 0 if c not in string,
+            # includes c == "0"
+            k = index("123456789abcdef", c)
+
+            ret = ret * 16 + k
+        }
+    } else if (str ~ \
+  /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) {
+        # decimal number, possibly floating point
+        ret = str + 0
+    } else
+        ret = "NOT-A-NUMBER"
+
+    return ret
+}
+
+# BEGIN {     # gawk test harness
+#     a[1] = "25"
+#     a[2] = ".31"
+#     a[3] = "0123"
+#     a[4] = "0xdeadBEEF"
+#     a[5] = "123.45"
+#     a[6] = "1.e3"
+#     a[7] = "1.32"
+#     a[8] = "1.32E2"
+#
+#     for (i = 1; i in a; i++)
+#         print a[i], strtonum(a[i]), mystrtonum(a[i])
+# }
diff --git a/gawk-5.0.1/awklib/eg/lib/walkarray.awk b/gawk-5.0.1/awklib/eg/lib/walkarray.awk
new file mode 100644
index 00000000000..5e36f46f5bb
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/walkarray.awk
@@ -0,0 +1,9 @@
+function walk_array(arr, name,      i)
+{
+    for (i in arr) {
+        if (isarray(arr[i]))
+            walk_array(arr[i], (name "[" i "]"))
+        else
+            printf("%s[%s] = %s\n", name, i, arr[i])
+    }
+}
diff --git a/gawk-5.0.1/awklib/eg/lib/zerofile.awk b/gawk-5.0.1/awklib/eg/lib/zerofile.awk
new file mode 100644
index 00000000000..8ea549ca8aa
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/lib/zerofile.awk
@@ -0,0 +1,19 @@
+# zerofile.awk --- library file to process empty input files
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# June 2003
+
+BEGIN { Argind = 0 }
+
+ARGIND > Argind + 1 {
+    for (Argind++; Argind < ARGIND; Argind++)
+        zerofile(ARGV[Argind], Argind)
+}
+
+ARGIND != Argind { Argind = ARGIND }
+
+END {
+    if (ARGIND > Argind)
+        for (Argind++; Argind <= ARGIND; Argind++)
+            zerofile(ARGV[Argind], Argind)
+}
diff --git a/gawk-5.0.1/awklib/eg/misc/addresses.csv b/gawk-5.0.1/awklib/eg/misc/addresses.csv
new file mode 100644
index 00000000000..a9eee0b2f43
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/misc/addresses.csv
@@ -0,0 +1 @@
+Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA
diff --git a/gawk-5.0.1/awklib/eg/misc/arraymax.awk b/gawk-5.0.1/awklib/eg/misc/arraymax.awk
new file mode 100644
index 00000000000..64197f564f3
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/misc/arraymax.awk
@@ -0,0 +1,10 @@
+{
+    if ($1 > max)
+        max = $1
+    arr[$1] = $0
+}
+
+END {
+    for (x = 1; x <= max; x++)
+        print arr[x]
+}
diff --git a/gawk-5.0.1/awklib/eg/misc/arraymax.data b/gawk-5.0.1/awklib/eg/misc/arraymax.data
new file mode 100644
index 00000000000..dbee328c6ea
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/misc/arraymax.data
@@ -0,0 +1,5 @@
+5  I am the Five man
+2  Who are you?  The new number two!
+4  . . . And four on the floor
+1  Who is number one?
+3  I three you.
diff --git a/gawk-5.0.1/awklib/eg/misc/findpat.awk b/gawk-5.0.1/awklib/eg/misc/findpat.awk
new file mode 100644
index 00000000000..9d799434510
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/misc/findpat.awk
@@ -0,0 +1,9 @@
+{
+    if ($1 == "FIND")
+        regex = $2
+    else {
+        where = match($0, regex)
+        if (where != 0)
+            print "Match of", regex, "found at", where, "in", $0
+       }
+}
diff --git a/gawk-5.0.1/awklib/eg/misc/findpat.data b/gawk-5.0.1/awklib/eg/misc/findpat.data
new file mode 100644
index 00000000000..9f72969e0c6
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/misc/findpat.data
@@ -0,0 +1,7 @@
+FIND ru+n
+My program runs
+but not very quickly
+FIND Melvin
+JF+KM
+This line is property of Reality Engineering Co.
+Melvin was here.
diff --git a/gawk-5.0.1/awklib/eg/misc/simple-csv.awk b/gawk-5.0.1/awklib/eg/misc/simple-csv.awk
new file mode 100644
index 00000000000..36cb4a6ecfa
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/misc/simple-csv.awk
@@ -0,0 +1,10 @@
+BEGIN {
+    FPAT = "([^,]+)|(\"[^\"]+\")"
+}
+
+{
+    print "NF = ", NF
+    for (i = 1; i <= NF; i++) {
+        printf("$%d = <%s>\n", i, $i)
+    }
+}
diff --git a/gawk-5.0.1/awklib/eg/network/PostAgent.sh b/gawk-5.0.1/awklib/eg/network/PostAgent.sh
new file mode 100644
index 00000000000..ccf9a6874b4
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/PostAgent.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+MobAg=/tmp/MobileAgent.$$
+# direct script to mobile agent file
+cat > $MobAg
+# execute agent concurrently
+gawk -f $MobAg $MobAg > /dev/null &
+# HTTP header, terminator and body
+gawk 'BEGIN { print "\r\nAgent started" }'
+rm $MobAg      # delete script file of agent
diff --git a/gawk-5.0.1/awklib/eg/network/coreserv.awk b/gawk-5.0.1/awklib/eg/network/coreserv.awk
new file mode 100644
index 00000000000..a5c8b1ed1be
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/coreserv.awk
@@ -0,0 +1,113 @@
+# CGI Library and core of a web server
+#
+# Juergen Kahrs, Juergen.Kahrs@vr-web.de
+# with Arnold Robbins, arnold@skeeve.com
+# September 2000
+
+# Global arrays
+#   GETARG --- arguments to CGI GET command
+#   MENU   --- menu items (path names)
+#   PARAM  --- parameters of form x=y
+
+# Optional variable MyHost contains host address
+# Optional variable MyPort contains port number
+# Needs TopHeader, TopDoc, TopFooter
+# Sets MyPrefix, HttpService, Status, Reason
+
+BEGIN {
+  if (MyHost == "") {
+     "uname -n" | getline MyHost
+     close("uname -n")
+  }
+  if (MyPort ==  0) MyPort = 8080
+  HttpService = "/inet/tcp/" MyPort "/0/0"
+  MyPrefix    = "http://" MyHost ":" MyPort
+  SetUpServer()
+  while ("awk" != "complex") {
+    # header lines are terminated this way
+    RS = ORS    = "\r\n"
+    Status      = 200             # this means OK
+    Reason      = "OK"
+    Header      = TopHeader
+    Document    = TopDoc
+    Footer      = TopFooter
+    if        (GETARG["Method"] == "GET") {
+        HandleGET()
+    } else if (GETARG["Method"] == "HEAD") {
+        # not yet implemented
+    } else if (GETARG["Method"] != "") {
+        print "bad method", GETARG["Method"]
+    }
+    Prompt = Header Document Footer
+    print "HTTP/1.0", Status, Reason     |& HttpService
+    print "Connection: Close"            |& HttpService
+    print "Pragma: no-cache"             |& HttpService
+    len = length(Prompt) + length(ORS)
+    print "Content-length:", len         |& HttpService
+    print ORS Prompt                     |& HttpService
+    # ignore all the header lines
+    while ((HttpService |& getline) > 0)
+        continue
+    # stop talking to this client
+    close(HttpService)
+    # wait for new client request
+    HttpService |& getline
+    # do some logging
+    print systime(), strftime(), $0
+    CGI_setup($1, $2, $3)
+  }
+}
+
+function CGI_setup(   method, uri, version, i)
+{
+    delete GETARG
+    delete MENU
+    delete PARAM
+    GETARG["Method"] = method
+    GETARG["URI"] = uri
+    GETARG["Version"] = version
+
+    i = index(uri, "?")
+    if (i > 0) {  # is there a "?" indicating a CGI request?
+        split(substr(uri, 1, i-1), MENU, "[/:]")
+        split(substr(uri, i+1), PARAM, "&")
+        for (i in PARAM) {
+            PARAM[i] = _CGI_decode(PARAM[i])
+            j = index(PARAM[i], "=")
+            GETARG[substr(PARAM[i], 1, j-1)] = \
+                                         substr(PARAM[i], j+1)
+        }
+    } else { # there is no "?", no need for splitting PARAMs
+        split(uri, MENU, "[/:]")
+    }
+    for (i in MENU)     # decode characters in path
+        if (i > 4)      # but not those in host name
+            MENU[i] = _CGI_decode(MENU[i])
+}
+function _CGI_decode(str,   hexdigs, i, pre, code1, code2,
+                            val, result)
+{
+   hexdigs = "123456789abcdef"
+
+   i = index(str, "%")
+   if (i == 0) # no work to do
+      return str
+
+   do {
+      pre = substr(str, 1, i-1)   # part before %xx
+      code1 = substr(str, i+1, 1) # first hex digit
+      code2 = substr(str, i+2, 1) # second hex digit
+      str = substr(str, i+3)      # rest of string
+
+      code1 = tolower(code1)
+      code2 = tolower(code2)
+      val = index(hexdigs, code1) * 16 \
+            + index(hexdigs, code2)
+
+      result = result pre sprintf("%c", val)
+      i = index(str, "%")
+   } while (i != 0)
+   if (length(str) > 0)
+      result = result str
+   return result
+}
diff --git a/gawk-5.0.1/awklib/eg/network/eliza.awk b/gawk-5.0.1/awklib/eg/network/eliza.awk
new file mode 100644
index 00000000000..9b85ca95739
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/eliza.awk
@@ -0,0 +1,270 @@
+function SetUpServer() {
+  SetUpEliza()
+  TopHeader = \
+    "<HTML><title>An HTTP-based System with GAWK</title>\
+    <HEAD><META HTTP-EQUIV=\"Content-Type\"\
+    CONTENT=\"text/html; charset=iso-8859-1\"></HEAD>\
+    <BODY BGCOLOR=\"#ffffff\" TEXT=\"#000000\"\
+    LINK=\"#0000ff\" VLINK=\"#0000ff\"\
+    ALINK=\"#0000ff\"> <A NAME=\"top\">"
+  TopDoc    = "\
+   <h2>Please choose one of the following actions:</h2>\
+   <UL>\
+   <LI>\
+   <A HREF=" MyPrefix "/AboutServer>About this server</A>\
+   </LI><LI>\
+   <A HREF=" MyPrefix "/AboutELIZA>About Eliza</A></LI>\
+   <LI>\
+   <A HREF=" MyPrefix \
+      "/StartELIZA>Start talking to Eliza</A></LI></UL>"
+  TopFooter = "</BODY></HTML>"
+}
+function HandleGET() {
+  # A real HTTP server would treat some parts of the URI as a file name.
+  # We take parts of the URI as menu choices and go on accordingly.
+  if (MENU[2] == "AboutServer") {
+    Document    = "This is not a CGI script.\
+      This is an httpd, an HTML file, and a CGI script all \
+      in one GAWK script. It needs no separate www-server, \
+      no installation, and no root privileges.\
+      <p>To run it, do this:</p><ul>\
+      <li> start this script with \"gawk -f httpserver.awk\",</li>\
+      <li> and on the same host let your www browser open location\
+           \"http://localhost:8080\"</li>\
+      </ul>\<p>\ Details of HTTP come from:</p><ul>\
+            <li>Hethmon:  Illustrated Guide to HTTP</p>\
+            <li>RFC 2068</li></ul><p>JK 14.9.1997</p>"
+  } else if (MENU[2] == "AboutELIZA") {
+    Document    = "This is an implementation of the famous ELIZA\
+        program by Joseph Weizenbaum. It is written in GAWK and\
+        uses an HTML GUI."
+  } else if (MENU[2] == "StartELIZA") {
+    gsub(/\+/, " ", GETARG["YouSay"])
+    # Here we also have to substitute coded special characters
+    Document    = "<form method=GET>" \
+      "<h3>" ElizaSays(GETARG["YouSay"]) "</h3>\
+      <p><input type=text name=YouSay value=\"\" size=60>\
+      <br><input type=submit value=\"Tell her about it\"></p></form>"
+  }
+}
+function ElizaSays(YouSay) {
+  if (YouSay == "") {
+    cost = 0
+    answer = "HI, IM ELIZA, TELL ME YOUR PROBLEM"
+  } else {
+    q = toupper(YouSay)
+    gsub("'", "", q)
+    if (q == qold) {
+      answer = "PLEASE DONT REPEAT YOURSELF !"
+    } else {
+      if (index(q, "SHUT UP") > 0) {
+        answer = "WELL, PLEASE PAY YOUR BILL. ITS EXACTLY ... $"\
+                 int(100*rand()+30+cost/100)
+      } else {
+        qold = q
+        w = "-"                 # no keyword recognized yet
+        for (i in k) {          # search for keywords
+          if (index(q, i) > 0) {
+            w = i
+            break
+          }
+        }
+        if (w == "-") {         # no keyword, take old subject
+          w    = wold
+          subj = subjold
+        } else {                # find subject
+          subj = substr(q, index(q, w) + length(w)+1)
+          wold = w
+          subjold = subj        #  remember keyword and subject
+        }
+        for (i in conj)
+           gsub(i, conj[i], q)   # conjugation
+        # from all answers to this keyword, select one randomly
+        answer = r[indices[int(split(k[w], indices) * rand()) + 1]]
+        # insert subject into answer
+        gsub("_", subj, answer)
+      }
+    }
+  }
+  cost += length(answer) # for later payment : 1 cent per character
+  return answer
+}
+function SetUpEliza() {
+  srand()
+  wold = "-"
+  subjold = " "
+
+  # table for conjugation
+  conj[" ARE "     ] = " AM "
+  conj["WERE "     ] = "WAS "
+  conj[" YOU "     ] = " I "
+  conj["YOUR "     ] = "MY "
+  conj[" IVE "     ] =\
+  conj[" I HAVE "  ] = " YOU HAVE "
+  conj[" YOUVE "   ] =\
+  conj[" YOU HAVE "] = " I HAVE "
+  conj[" IM "      ] =\
+  conj[" I AM "    ] = " YOU ARE "
+  conj[" YOURE "   ] =\
+  conj[" YOU ARE " ] = " I AM "
+
+  # table of all answers
+  r[1]   = "DONT YOU BELIEVE THAT I CAN  _"
+  r[2]   = "PERHAPS YOU WOULD LIKE TO BE ABLE TO _ ?"
+  r[3]   = "YOU WANT ME TO BE ABLE TO _ ?"
+  r[4]   = "PERHAPS YOU DONT WANT TO _ "
+  r[5]   = "DO YOU WANT TO BE ABLE TO _ ?"
+  r[6]   = "WHAT MAKES YOU THINK I AM _ ?"
+  r[7]   = "DOES IT PLEASE YOU TO BELIEVE I AM _ ?"
+  r[8]   = "PERHAPS YOU WOULD LIKE TO BE _ ?"
+  r[9]   = "DO YOU SOMETIMES WISH YOU WERE _ ?"
+  r[10]  = "DONT YOU REALLY _ ?"
+  r[11]  = "WHY DONT YOU _ ?"
+  r[12]  = "DO YOU WISH TO BE ABLE TO _ ?"
+  r[13]  = "DOES THAT TROUBLE YOU ?"
+  r[14]  = "TELL ME MORE ABOUT SUCH FEELINGS"
+  r[15]  = "DO YOU OFTEN FEEL _ ?"
+  r[16]  = "DO YOU ENJOY FEELING _ ?"
+  r[17]  = "DO YOU REALLY BELIEVE I DONT _ ?"
+  r[18]  = "PERHAPS IN GOOD TIME I WILL _ "
+  r[19]  = "DO YOU WANT ME TO _ ?"
+  r[20]  = "DO YOU THINK YOU SHOULD BE ABLE TO _ ?"
+  r[21]  = "WHY CANT YOU _ ?"
+  r[22]  = "WHY ARE YOU INTERESTED IN WHETHER OR NOT I AM _ ?"
+  r[23]  = "WOULD YOU PREFER IF I WERE NOT _ ?"
+  r[24]  = "PERHAPS IN YOUR FANTASIES I AM _ "
+  r[25]  = "HOW DO YOU KNOW YOU CANT _ ?"
+  r[26]  = "HAVE YOU TRIED ?"
+  r[27]  = "PERHAPS YOU CAN NOW _ "
+  r[28]  = "DID YOU COME TO ME BECAUSE YOU ARE _ ?"
+  r[29]  = "HOW LONG HAVE YOU BEEN _ ?"
+  r[30]  = "DO YOU BELIEVE ITS NORMAL TO BE _ ?"
+  r[31]  = "DO YOU ENJOY BEING _ ?"
+  r[32]  = "WE WERE DISCUSSING YOU -- NOT ME"
+  r[33]  = "Oh, I _"
+  r[34]  = "YOU'RE NOT REALLY TALKING ABOUT ME, ARE YOU ?"
+  r[35]  = "WHAT WOULD IT MEAN TO YOU, IF YOU GOT _ ?"
+  r[36]  = "WHY DO YOU WANT _ ?"
+  r[37]  = "SUPPOSE YOU SOON GOT _"
+  r[38]  = "WHAT IF YOU NEVER GOT _ ?"
+  r[39]  = "I SOMETIMES ALSO WANT _"
+  r[40]  = "WHY DO YOU ASK ?"
+  r[41]  = "DOES THAT QUESTION INTEREST YOU ?"
+  r[42]  = "WHAT ANSWER WOULD PLEASE YOU THE MOST ?"
+  r[43]  = "WHAT DO YOU THINK ?"
+  r[44]  = "ARE SUCH QUESTIONS IN YOUR MIND OFTEN ?"
+  r[45]  = "WHAT IS IT THAT YOU REALLY WANT TO KNOW ?"
+  r[46]  = "HAVE YOU ASKED ANYONE ELSE ?"
+  r[47]  = "HAVE YOU ASKED SUCH QUESTIONS BEFORE ?"
+  r[48]  = "WHAT ELSE COMES TO MIND WHEN YOU ASK THAT ?"
+  r[49]  = "NAMES DON'T INTEREST ME"
+  r[50]  = "I DONT CARE ABOUT NAMES -- PLEASE GO ON"
+  r[51]  = "IS THAT THE REAL REASON ?"
+  r[52]  = "DONT ANY OTHER REASONS COME TO MIND ?"
+  r[53]  = "DOES THAT REASON EXPLAIN ANYTHING ELSE ?"
+  r[54]  = "WHAT OTHER REASONS MIGHT THERE BE ?"
+  r[55]  = "PLEASE DON'T APOLOGIZE !"
+  r[56]  = "APOLOGIES ARE NOT NECESSARY"
+  r[57]  = "WHAT FEELINGS DO YOU HAVE WHEN YOU APOLOGIZE ?"
+  r[58]  = "DON'T BE SO DEFENSIVE"
+  r[59]  = "WHAT DOES THAT DREAM SUGGEST TO YOU ?"
+  r[60]  = "DO YOU DREAM OFTEN ?"
+  r[61]  = "WHAT PERSONS APPEAR IN YOUR DREAMS ?"
+  r[62]  = "ARE YOU DISTURBED BY YOUR DREAMS ?"
+  r[63]  = "HOW DO YOU DO ... PLEASE STATE YOUR PROBLEM"
+  r[64]  = "YOU DON'T SEEM QUITE CERTAIN"
+  r[65]  = "WHY THE UNCERTAIN TONE ?"
+  r[66]  = "CAN'T YOU BE MORE POSITIVE ?"
+  r[67]  = "YOU AREN'T SURE ?"
+  r[68]  = "DON'T YOU KNOW ?"
+  r[69]  = "WHY NO _ ?"
+  r[70]  = "DON'T SAY NO, IT'S ALWAYS SO NEGATIVE"
+  r[71]  = "WHY NOT ?"
+  r[72]  = "ARE YOU SURE ?"
+  r[73]  = "WHY NO ?"
+  r[74]  = "WHY ARE YOU CONCERNED ABOUT MY _ ?"
+  r[75]  = "WHAT ABOUT YOUR OWN _ ?"
+  r[76]  = "CAN'T YOU THINK ABOUT A SPECIFIC EXAMPLE ?"
+  r[77]  = "WHEN ?"
+  r[78]  = "WHAT ARE YOU THINKING OF ?"
+  r[79]  = "REALLY, ALWAYS ?"
+  r[80]  = "DO YOU REALLY THINK SO ?"
+  r[81]  = "BUT YOU ARE NOT SURE YOU _ "
+  r[82]  = "DO YOU DOUBT YOU _ ?"
+  r[83]  = "IN WHAT WAY ?"
+  r[84]  = "WHAT RESEMBLANCE DO YOU SEE ?"
+  r[85]  = "WHAT DOES THE SIMILARITY SUGGEST TO YOU ?"
+  r[86]  = "WHAT OTHER CONNECTION DO YOU SEE ?"
+  r[87]  = "COULD THERE REALLY BE SOME CONNECTIONS ?"
+  r[88]  = "HOW ?"
+  r[89]  = "YOU SEEM QUITE POSITIVE"
+  r[90]  = "ARE YOU SURE ?"
+  r[91]  = "I SEE"
+  r[92]  = "I UNDERSTAND"
+  r[93]  = "WHY DO YOU BRING UP THE TOPIC OF FRIENDS ?"
+  r[94]  = "DO YOUR FRIENDS WORRY YOU ?"
+  r[95]  = "DO YOUR FRIENDS PICK ON YOU ?"
+  r[96]  = "ARE YOU SURE YOU HAVE ANY FRIENDS ?"
+  r[97]  = "DO YOU IMPOSE ON YOUR FRIENDS ?"
+  r[98]  = "PERHAPS YOUR LOVE FOR FRIENDS WORRIES YOU"
+  r[99]  = "DO COMPUTERS WORRY YOU ?"
+  r[100] = "ARE YOU TALKING ABOUT ME IN PARTICULAR ?"
+  r[101] = "ARE YOU FRIGHTENED BY MACHINES ?"
+  r[102] = "WHY DO YOU MENTION COMPUTERS ?"
+  r[103] = "WHAT DO YOU THINK MACHINES HAVE TO DO WITH YOUR PROBLEMS ?"
+  r[104] = "DON'T YOU THINK COMPUTERS CAN HELP PEOPLE ?"
+  r[105] = "WHAT IS IT ABOUT MACHINES THAT WORRIES YOU ?"
+  r[106] = "SAY, DO YOU HAVE ANY PSYCHOLOGICAL PROBLEMS ?"
+  r[107] = "WHAT DOES THAT SUGGEST TO YOU ?"
+  r[108] = "I SEE"
+  r[109] = "IM NOT SURE I UNDERSTAND YOU FULLY"
+  r[110] = "COME COME ELUCIDATE YOUR THOUGHTS"
+  r[111] = "CAN YOU ELABORATE ON THAT ?"
+  r[112] = "THAT IS QUITE INTERESTING"
+  r[113] = "WHY DO YOU HAVE PROBLEMS WITH MONEY ?"
+  r[114] = "DO YOU THINK MONEY IS EVERYTHING ?"
+  r[115] = "ARE YOU SURE THAT MONEY IS THE PROBLEM ?"
+  r[116] = "I THINK WE WANT TO TALK ABOUT YOU, NOT ABOUT ME"
+  r[117] = "WHAT'S ABOUT ME ?"
+  r[118] = "WHY DO YOU ALWAYS BRING UP MY NAME ?"
+  # table for looking up answers that
+  # fit to a certain keyword
+  k["CAN YOU"]      = "1 2 3"
+  k["CAN I"]        = "4 5"
+  k["YOU ARE"]      =\
+  k["YOURE"]        = "6 7 8 9"
+  k["I DONT"]       = "10 11 12 13"
+  k["I FEEL"]       = "14 15 16"
+  k["WHY DONT YOU"] = "17 18 19"
+  k["WHY CANT I"]   = "20 21"
+  k["ARE YOU"]      = "22 23 24"
+  k["I CANT"]       = "25 26 27"
+  k["I AM"]         =\
+  k["IM "]          = "28 29 30 31"
+  k["YOU "]         = "32 33 34"
+  k["I WANT"]       = "35 36 37 38 39"
+  k["WHAT"]         =\
+  k["HOW"]          =\
+  k["WHO"]          =\
+  k["WHERE"]        =\
+  k["WHEN"]         =\
+  k["WHY"]          = "40 41 42 43 44 45 46 47 48"
+  k["NAME"]         = "49 50"
+  k["CAUSE"]        = "51 52 53 54"
+  k["SORRY"]        = "55 56 57 58"
+  k["DREAM"]        = "59 60 61 62"
+  k["HELLO"]        =\
+  k["HI "]          = "63"
+  k["MAYBE"]        = "64 65 66 67 68"
+  k[" NO "]         = "69 70 71 72 73"
+  k["YOUR"]         = "74 75"
+  k["ALWAYS"]       = "76 77 78 79"
+  k["THINK"]        = "80 81 82"
+  k["LIKE"]         = "83 84 85 86 87 88 89"
+  k["YES"]          = "90 91 92"
+  k["FRIEND"]       = "93 94 95 96 97 98"
+  k["COMPUTER"]     = "99 100 101 102 103 104 105"
+  k["-"]            = "106 107 108 109 110 111 112"
+  k["MONEY"]        = "113 114 115"
+  k["ELIZA"]        = "116 117 118"
+}
diff --git a/gawk-5.0.1/awklib/eg/network/fingerclient.awk b/gawk-5.0.1/awklib/eg/network/fingerclient.awk
new file mode 100644
index 00000000000..bcc2c94cfa5
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/fingerclient.awk
@@ -0,0 +1,7 @@
+BEGIN {
+  NetService = "/inet/tcp/0/localhost/finger"
+  print "var{name}" |& NetService
+  while ((NetService |& getline) > 0)
+    print $0
+  close(NetService)
+}
diff --git a/gawk-5.0.1/awklib/eg/network/geturl.awk b/gawk-5.0.1/awklib/eg/network/geturl.awk
new file mode 100644
index 00000000000..53853e50283
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/geturl.awk
@@ -0,0 +1,24 @@
+BEGIN {
+  if (ARGC != 2) {
+    print "GETURL - retrieve Web page via HTTP 1.0"
+    print "IN:\n    the URL as a command-line parameter"
+    print "PARAM(S):\n    -v Proxy=MyProxy"
+    print "OUT:\n    the page content on stdout"
+    print "    the page header on stderr"
+    print "JK 16.05.1997"
+    print "ADR 13.08.2000"
+    exit
+  }
+  URL = ARGV[1]; ARGV[1] = ""
+  if (Proxy     == "")  Proxy     = "127.0.0.1"
+  if (ProxyPort ==  0)  ProxyPort = 80
+  if (Method    == "")  Method    = "GET"
+  HttpService = "/inet/tcp/0/" Proxy "/" ProxyPort
+  ORS = RS = "\r\n\r\n"
+  print Method " " URL " HTTP/1.0" |& HttpService
+  HttpService                      |& getline Header
+  print Header > "/dev/stderr"
+  while ((HttpService |& getline) > 0)
+    printf "%s", $0
+  close(HttpService)
+}
diff --git a/gawk-5.0.1/awklib/eg/network/hello-serv.awk b/gawk-5.0.1/awklib/eg/network/hello-serv.awk
new file mode 100644
index 00000000000..003ee088ac4
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/hello-serv.awk
@@ -0,0 +1,14 @@
+BEGIN {
+  RS = ORS = "\r\n"
+  HttpService = "/inet/tcp/8080/0/0"
+  Hello = "<HTML><HEAD>" \
+          "<TITLE>A Famous Greeting</TITLE></HEAD>" \
+          "<BODY><H1>Hello, world</H1></BODY></HTML>"
+  Len = length(Hello) + length(ORS)
+  print "HTTP/1.0 200 OK"          |& HttpService
+  print "Content-Length: " Len ORS |& HttpService
+  print Hello                      |& HttpService
+  while ((HttpService |& getline) > 0)
+     continue;
+  close(HttpService)
+}
diff --git a/gawk-5.0.1/awklib/eg/network/maze.awk b/gawk-5.0.1/awklib/eg/network/maze.awk
new file mode 100644
index 00000000000..97c535f7450
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/maze.awk
@@ -0,0 +1,73 @@
+function SetUpServer() {
+  TopHeader = "<HTML><title>Walk through a maze</title>"
+  TopDoc = "\
+    <h2>Please choose one of the following actions:</h2>\
+    <UL>\
+      <LI><A HREF=" MyPrefix "/AboutServer>About this server</A>\
+      <LI><A HREF=" MyPrefix "/VRMLtest>Watch a simple VRML scene</A>\
+    </UL>"
+  TopFooter  = "</HTML>"
+  srand()
+}
+function HandleGET() {
+  if (MENU[2] == "AboutServer") {
+    Document  = "If your browser has a VRML 2 plugin,\
+      this server shows you a simple VRML scene."
+  } else if (MENU[2] == "VRMLtest") {
+    XSIZE = YSIZE = 11              # initially, everything is wall
+    for (y = 0; y < YSIZE; y++)
+       for (x = 0; x < XSIZE; x++)
+          Maze[x, y] = "#"
+    delete Maze[0, 1]              # entry is not wall
+    delete Maze[XSIZE-1, YSIZE-2]  # exit  is not wall
+    MakeMaze(1, 1)
+    Document = "\
+#VRML V2.0 utf8\n\
+Group {\n\
+  children [\n\
+    PointLight {\n\
+      ambientIntensity 0.2\n\
+      color 0.7 0.7 0.7\n\
+      location 0.0 8.0 10.0\n\
+    }\n\
+    DEF B1 Background {\n\
+      skyColor [0 0 0, 1.0 1.0 1.0 ]\n\
+      skyAngle 1.6\n\
+      groundColor [1 1 1, 0.8 0.8 0.8, 0.2 0.2 0.2 ]\n\
+      groundAngle [ 1.2 1.57 ]\n\
+    }\n\
+    DEF Wall Shape {\n\
+      geometry Box {size 1 1 1}\n\
+      appearance Appearance { material Material { diffuseColor 0 0 1 } }\n\
+    }\n\
+    DEF Entry Viewpoint {\n\
+      position 0.5 1.0 5.0\n\
+      orientation 0.0 0.0 -1.0 0.52\n\
+    }\n"
+    for (i in Maze) {
+      split(i, t, SUBSEP)
+      Document = Document "    Transform { translation "
+      Document = Document t[1] " 0 -" t[2] " children USE Wall }\n"
+    }
+    Document = Document "  ] # end of group for world\n}"
+    Reason = "OK" ORS "Content-type: model/vrml"
+    Header = Footer = ""
+  }
+}
+function MakeMaze(x, y) {
+  delete Maze[x, y]     # here we are, we have no wall here
+  p = 0                 # count unvisited fields in all directions
+  if (x-2 SUBSEP y   in Maze) d[p++] = "-x"
+  if (x   SUBSEP y-2 in Maze) d[p++] = "-y"
+  if (x+2 SUBSEP y   in Maze) d[p++] = "+x"
+  if (x   SUBSEP y+2 in Maze) d[p++] = "+y"
+  if (p>0) {            # if there are unvisited fields, go there
+    p = int(p*rand())   # choose one unvisited field at random
+    if        (d[p] == "-x") { delete Maze[x - 1, y]; MakeMaze(x - 2, y)
+    } else if (d[p] == "-y") { delete Maze[x, y - 1]; MakeMaze(x, y - 2)
+    } else if (d[p] == "+x") { delete Maze[x + 1, y]; MakeMaze(x + 2, y)
+    } else if (d[p] == "+y") { delete Maze[x, y + 1]; MakeMaze(x, y + 2)
+    }                   # we are back from recursion
+    MakeMaze(x, y);     # try again while there are unvisited fields
+  }
+}
diff --git a/gawk-5.0.1/awklib/eg/network/mobag.awk b/gawk-5.0.1/awklib/eg/network/mobag.awk
new file mode 100644
index 00000000000..a8c55008b78
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/mobag.awk
@@ -0,0 +1,72 @@
+BEGIN {
+  if (ARGC != 2) {
+    print "MOBAG - a simple mobile agent"
+    print "CALL:\n    gawk -f mobag.awk mobag.awk"
+    print "IN:\n    the name of this script as a command-line parameter"
+    print "PARAM:\n    -v MyOrigin=myhost.com"
+    print "OUT:\n    the result on stdout"
+    print "JK 29.03.1998 01.04.1998"
+    exit
+  }
+  if (MyOrigin == "") {
+     "uname -n" | getline MyOrigin
+     close("uname -n")
+  }
+}
+#ReadMySelf
+/^function /                     { FUNC = $2 }
+/^END/ || /^#ReadMySelf/         { FUNC = $1 }
+FUNC != ""                       { MOBFUN[FUNC] = MOBFUN[FUNC] RS $0 }
+(FUNC != "") && (/^}/ || /^#EndOfMySelf/) \
+                                 { FUNC = "" }
+#EndOfMySelf
+function migrate(Destination, MobCode, Label) {
+  MOBVAR["Label"] = Label
+  MOBVAR["Destination"] = Destination
+  RS = ORS = "\r\n"
+  HttpService = "/inet/tcp/0/" Destination
+  for (i in MOBFUN)
+     MobCode = (MobCode "\n" MOBFUN[i])
+  MobCode = MobCode  "\n\nBEGIN {"
+  for (i in MOBVAR)
+     MobCode = (MobCode "\n  MOBVAR[\"" i "\"] = \"" MOBVAR[i] "\"")
+  MobCode = MobCode "\n}\n"
+  print "POST /cgi-bin/PostAgent.sh HTTP/1.0"  |& HttpService
+  print "Content-length:", length(MobCode) ORS |& HttpService
+  printf "%s", MobCode                         |& HttpService
+  while ((HttpService |& getline) > 0)
+     print $0
+  close(HttpService)
+}
+END {
+  if (ARGC != 2) exit    # stop when called with wrong parameters
+  if (MyOrigin != "")    # is this the originating host?
+    MyInit()             # if so, initialize the application
+  else                   # we are on a host with migrated data
+    MyJob()              # so we do our job
+}
+function MyInit() {
+  MOBVAR["MyOrigin"] = MyOrigin
+  MOBVAR["Machines"] = "localhost/80 max/80 moritz/80 castor/80"
+  split(MOBVAR["Machines"], Machines)           # which host is the first?
+  migrate(Machines[1], "", "")                  # go to the first host
+  while (("/inet/tcp/8080/0/0" |& getline) > 0) # wait for result
+    print $0                                    # print result
+  close("/inet/tcp/8080/0/0")
+}
+function MyJob() {
+  # forget this host
+  sub(MOBVAR["Destination"], "", MOBVAR["Machines"])
+  MOBVAR["Result"]=MOBVAR["Result"] SUBSEP SUBSEP MOBVAR["Destination"] ":"
+  while (("who" | getline) > 0)               # who is logged in?
+    MOBVAR["Result"] = MOBVAR["Result"] SUBSEP $0
+  close("who")
+  if (index(MOBVAR["Machines"], "/") > 0) {   # any more machines to visit?
+    split(MOBVAR["Machines"], Machines)       # which host is next?
+    migrate(Machines[1], "", "")              # go there
+  } else {                                    # no more machines
+    gsub(SUBSEP, "\n", MOBVAR["Result"])      # send result to origin
+    print MOBVAR["Result"] |& "/inet/tcp/0/" MOBVAR["MyOrigin"] "/8080"
+    close("/inet/tcp/0/" MOBVAR["MyOrigin"] "/8080")
+  }
+}
diff --git a/gawk-5.0.1/awklib/eg/network/panic.awk b/gawk-5.0.1/awklib/eg/network/panic.awk
new file mode 100644
index 00000000000..6db8c46d4b0
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/panic.awk
@@ -0,0 +1,18 @@
+BEGIN {
+  RS = ORS = "\r\n"
+  if (MyPort ==  0) MyPort = 8080
+  HttpService = "/inet/tcp/" MyPort "/0/0"
+  Hello = "<HTML><HEAD><TITLE>Out Of Service</TITLE>" \
+     "</HEAD><BODY><H1>" \
+     "This site is temporarily out of service." \
+     "</H1></BODY></HTML>"
+  Len = length(Hello) + length(ORS)
+  while ("awk" != "complex") {
+    print "HTTP/1.0 200 OK"          |& HttpService
+    print "Content-Length: " Len ORS |& HttpService
+    print Hello                      |& HttpService
+    while ((HttpService |& getline) > 0)
+       continue;
+    close(HttpService)
+  }
+}
diff --git a/gawk-5.0.1/awklib/eg/network/protbase.awk b/gawk-5.0.1/awklib/eg/network/protbase.awk
new file mode 100644
index 00000000000..f4a911c9f59
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/protbase.awk
@@ -0,0 +1,11 @@
+{ request = request "\n" $0 }
+
+END {
+  BLASTService     = "/inet/tcp/0/www.ncbi.nlm.nih.gov/80"
+  printf "POST /cgi-bin/BLAST/nph-blast_report HTTP/1.0\n" |& BLASTService
+  printf "Content-Length: " length(request) "\n\n"         |& BLASTService
+  printf request                                           |& BLASTService
+  while ((BLASTService |& getline) > 0)
+      print $0
+  close(BLASTService)
+}
diff --git a/gawk-5.0.1/awklib/eg/network/protbase.request b/gawk-5.0.1/awklib/eg/network/protbase.request
new file mode 100644
index 00000000000..4c5c3d2c1d2
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/protbase.request
@@ -0,0 +1,7 @@
+PROGRAM blastn
+DATALIB month
+EXPECT 0.75
+BEGIN
+>GAWK310 the gawking gene GNU AWK
+tgcttggctgaggagccataggacgagagcttcctggtgaagtgtgtttcttgaaatcat
+caccaccatggacagcaaa
diff --git a/gawk-5.0.1/awklib/eg/network/protbase.result b/gawk-5.0.1/awklib/eg/network/protbase.result
new file mode 100644
index 00000000000..a087af43fef
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/protbase.result
@@ -0,0 +1,9 @@
+Sequences producing significant alignments:                        (bits)  Value
+
+gb|AC021182.14|AC021182 Homo sapiens chromosome 7 clone RP11-733...    38  0.20
+gb|AC021056.12|AC021056 Homo sapiens chromosome 3 clone RP11-115...    38  0.20
+emb|AL160278.10|AL160278 Homo sapiens chromosome 9 clone RP11-57...    38  0.20
+emb|AL391139.11|AL391139 Homo sapiens chromosome X clone RP11-35...    38  0.20
+emb|AL365192.6|AL365192 Homo sapiens chromosome 6 clone RP3-421H...    38  0.20
+emb|AL138812.9|AL138812 Homo sapiens chromosome 11 clone RP1-276...    38  0.20
+gb|AC073881.3|AC073881 Homo sapiens chromosome 15 clone CTD-2169...    38  0.20
diff --git a/gawk-5.0.1/awklib/eg/network/remconf.awk b/gawk-5.0.1/awklib/eg/network/remconf.awk
new file mode 100644
index 00000000000..56f271422a2
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/remconf.awk
@@ -0,0 +1,54 @@
+function SetUpServer() {
+  TopHeader = "<HTML><title>Remote Configuration</title>"
+  TopDoc = "<BODY>\
+    <h2>Please choose one of the following actions:</h2>\
+    <UL>\
+      <LI><A HREF=" MyPrefix "/AboutServer>About this server</A></LI>\
+      <LI><A HREF=" MyPrefix "/ReadConfig>Read Configuration</A></LI>\
+      <LI><A HREF=" MyPrefix "/CheckConfig>Check Configuration</A></LI>\
+      <LI><A HREF=" MyPrefix "/ChangeConfig>Change Configuration</A></LI>\
+      <LI><A HREF=" MyPrefix "/SaveConfig>Save Configuration</A></LI>\
+    </UL>"
+  TopFooter  = "</BODY></HTML>"
+  if (ConfigFile == "") ConfigFile = "config.asc"
+}
+function HandleGET() {
+  if (MENU[2] == "AboutServer") {
+    Document  = "This is a GUI for remote configuration of an\
+      embedded system. It is is implemented as one GAWK script."
+  } else if (MENU[2] == "ReadConfig") {
+    RS = "\n"
+    while ((getline < ConfigFile) > 0)
+       config[$1] = $2;
+    close(ConfigFile)
+    RS = "\r\n"
+    Document = "Configuration has been read."
+  } else if (MENU[2] == "CheckConfig") {
+    Document = "<TABLE BORDER=1 CELLPADDING=5>"
+    for (i in config)
+      Document = Document "<TR><TD>" i "</TD>" \
+        "<TD>" config[i] "</TD></TR>"
+    Document = Document "</TABLE>"
+  } else if (MENU[2] == "ChangeConfig") {
+    if ("Param" in GETARG) {            # any parameter to set?
+      if (GETARG["Param"] in config) {  # is  parameter valid?
+        config[GETARG["Param"]] = GETARG["Value"]
+        Document = (GETARG["Param"] " = " GETARG["Value"] ".")
+      } else {
+        Document = "Parameter <b>" GETARG["Param"] "</b> is invalid."
+      }
+    } else {
+      Document = "<FORM method=GET><h4>Change one parameter</h4>\
+        <TABLE BORDER CELLPADDING=5>\
+        <TR><TD>Parameter</TD><TD>Value</TD></TR>\
+        <TR><TD><input type=text name=Param value=\"\" size=20></TD>\
+            <TD><input type=text name=Value value=\"\" size=40></TD>\
+        </TR></TABLE><input type=submit value=\"Set\"></FORM>"
+    }
+  } else if (MENU[2] == "SaveConfig") {
+    for (i in config)
+      printf("%s %s\n", i, config[i]) > ConfigFile
+    close(ConfigFile)
+    Document = "Configuration has been saved."
+  }
+}
diff --git a/gawk-5.0.1/awklib/eg/network/statist.awk b/gawk-5.0.1/awklib/eg/network/statist.awk
new file mode 100644
index 00000000000..d0a172cf227
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/statist.awk
@@ -0,0 +1,85 @@
+function SetUpServer() {
+  TopHeader = "<HTML><title>Statistics with GAWK</title>"
+  TopDoc = "<BODY>\
+   <h2>Please choose one of the following actions:</h2>\
+   <UL>\
+    <LI><A HREF=" MyPrefix "/AboutServer>About this server</A></LI>\
+    <LI><A HREF=" MyPrefix "/EnterParameters>Enter Parameters</A></LI>\
+   </UL>"
+  TopFooter  = "</BODY></HTML>"
+  GnuPlot    = "gnuplot 2>&1"
+  m1=m2=0;    v1=v2=1;    n1=n2=10
+}
+function HandleGET() {
+  if (MENU[2] == "AboutServer") {
+    Document  = "This is a GUI for a statistical computation.\
+      It compares means and variances of two distributions.\
+      It is implemented as one GAWK script and uses GNUPLOT."
+  } else if (MENU[2] == "EnterParameters") {
+    Document = ""
+    if ("m1" in GETARG) {     # are there parameters to compare?
+      Document = Document "<SCRIPT LANGUAGE=\"JavaScript\">\
+        setTimeout(\"window.open(\\\"" MyPrefix "/Image" systime()\
+         "\\\",\\\"dist\\\", \\\"status=no\\\");\", 1000); </SCRIPT>"
+      m1 = GETARG["m1"]; v1 = GETARG["v1"]; n1 = GETARG["n1"]
+      m2 = GETARG["m2"]; v2 = GETARG["v2"]; n2 = GETARG["n2"]
+      t = (m1-m2)/sqrt(v1/n1+v2/n2)
+      df = (v1/n1+v2/n2)*(v1/n1+v2/n2)/((v1/n1)*(v1/n1)/(n1-1) \
+           + (v2/n2)*(v2/n2) /(n2-1))
+      if (v1>v2) {
+          f = v1/v2
+          df1 = n1 - 1
+          df2 = n2 - 1
+      } else {
+          f = v2/v1
+          df1 = n2 - 1
+          df2 = n1 - 1
+      }
+      print "pt=ibeta(" df/2 ",0.5," df/(df+t*t) ")"  |& GnuPlot
+      print "pF=2.0*ibeta(" df2/2 "," df1/2 "," \
+            df2/(df2+df1*f) ")"                    |& GnuPlot
+      print "print pt, pF"                         |& GnuPlot
+      RS="\n"; GnuPlot |& getline; RS="\r\n"    # $1 is pt, $2 is pF
+      print "invsqrt2pi=1.0/sqrt(2.0*pi)"          |& GnuPlot
+      print "nd(x)=invsqrt2pi/sd*exp(-0.5*((x-mu)/sd)**2)" |& GnuPlot
+      print "set term png small color"             |& GnuPlot
+      #print "set term postscript color"           |& GnuPlot
+      #print "set term gif medium size 320,240"    |& GnuPlot
+      print "set yrange[-0.3:]"                    |& GnuPlot
+      print "set label 'p(m1=m2) =" $1 "' at 0,-0.1 left"  |& GnuPlot
+      print "set label 'p(v1=v2) =" $2 "' at 0,-0.2 left"  |& GnuPlot
+      print "plot mu=" m1 ",sd=" sqrt(v1) ", nd(x) title 'sample 1',\
+        mu=" m2 ",sd=" sqrt(v2) ", nd(x) title 'sample 2'" |& GnuPlot
+      print "quit"                                         |& GnuPlot
+      GnuPlot |& getline Image
+      while ((GnuPlot |& getline) > 0)
+          Image = Image RS $0
+      close(GnuPlot)
+    }
+    Document = Document "\
+    <h3>Do these samples have the same Gaussian distribution?</h3>\
+    <FORM METHOD=GET> <TABLE BORDER CELLPADDING=5>\
+    <TR>\
+    <TD>1. Mean    </TD>
+    <TD><input type=text name=m1 value=" m1 " size=8></TD>\
+    <TD>1. Variance</TD>
+    <TD><input type=text name=v1 value=" v1 " size=8></TD>\
+    <TD>1. Count   </TD>
+    <TD><input type=text name=n1 value=" n1 " size=8></TD>\
+    </TR><TR>\
+    <TD>2. Mean    </TD>
+    <TD><input type=text name=m2 value=" m2 " size=8></TD>\
+    <TD>2. Variance</TD>
+    <TD><input type=text name=v2 value=" v2 " size=8></TD>\
+    <TD>2. Count   </TD>
+    <TD><input type=text name=n2 value=" n2 " size=8></TD>\
+    </TR>                   <input type=submit value=\"Compute\">\
+    </TABLE></FORM><BR>"
+  } else if (MENU[2] ~ "Image") {
+    Reason = "OK" ORS "Content-type: image/png"
+    #Reason = "OK" ORS "Content-type: application/x-postscript"
+    #Reason = "OK" ORS "Content-type: image/gif"
+    Header = Footer = ""
+    Document = Image
+  }
+}
diff --git a/gawk-5.0.1/awklib/eg/network/stoxdata.txt b/gawk-5.0.1/awklib/eg/network/stoxdata.txt
new file mode 100644
index 00000000000..1b6d015eef1
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/stoxdata.txt
@@ -0,0 +1,4 @@
+Date,Open,High,Low,Close,Volume
+9-Oct-00,22.75,22.75,21.375,22.375,7888500
+6-Oct-00,23.8125,24.9375,21.5625,22,10701100
+5-Oct-00,24.4375,24.625,23.125,23.50,5810300
diff --git a/gawk-5.0.1/awklib/eg/network/stoxpred.awk b/gawk-5.0.1/awklib/eg/network/stoxpred.awk
new file mode 100644
index 00000000000..aa1fbe9ff31
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/stoxpred.awk
@@ -0,0 +1,145 @@
+BEGIN {
+  Init()
+  ReadQuotes()
+  CleanUp()
+  Prediction()
+  Report()
+  SendMail()
+}
+function Init() {
+  if (ARGC != 1) {
+    print "STOXPRED - daily stock share prediction"
+    print "IN:\n    no parameters, nothing on stdin"
+    print "PARAM:\n    -v Proxy=MyProxy -v ProxyPort=80"
+    print "OUT:\n    commented predictions as email"
+    print "JK 09.10.2000"
+    exit
+  }
+  # Remember ticker symbols from Dow Jones Industrial Index
+  StockCount = split("AA GE JNJ MSFT AXP GM JPM PG BA HD KO \
+    SBC C HON MCD T CAT HWP MMM UTX DD IBM MO WMT DIS INTC \
+    MRK XOM EK IP", name);
+  # Remember the current date as the end of the time series
+  day   = strftime("%d")
+  month = strftime("%m")
+  year  = strftime("%Y")
+  if (Proxy     == "")  Proxy     = "chart.yahoo.com"
+  if (ProxyPort ==  0)  ProxyPort = 80
+  YahooData = "/inet/tcp/0/" Proxy "/" ProxyPort
+}
+function ReadQuotes() {
+  # Retrieve historical data for each ticker symbol
+  FS = ","
+  for (stock = 1; stock <= StockCount; stock++) {
+    URL = "http://chart.yahoo.com/table.csv?s=" name[stock] \
+          "&a=" month "&b=" day   "&c=" year-1 \
+          "&d=" month "&e=" day   "&f=" year \
+          "g=d&q=q&y=0&z=" name[stock] "&x=.csv"
+    printf("GET " URL " HTTP/1.0\r\n\r\n") |& YahooData
+    while ((YahooData |& getline) > 0) {
+      if (NF == 6 && $1 ~ /Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/) {
+        if (stock == 1)
+          days[++daycount] = $1;
+        quote[$1, stock] = $5
+      }
+    }
+    close(YahooData)
+  }
+  FS = " "
+}
+function CleanUp() {
+  # clean up time series; eliminate incomplete data sets
+  for (d = 1; d <= daycount; d++) {
+    for (stock = 1; stock <= StockCount; stock++)
+      if (! ((days[d], stock) in quote))
+          stock = StockCount + 10
+    if (stock > StockCount + 1)
+        continue
+    datacount++
+    for (stock = 1; stock <= StockCount; stock++)
+      data[datacount, stock] = int(0.5 + quote[days[d], stock])
+  }
+  delete quote
+  delete days
+}
+function Prediction() {
+  # Predict each ticker symbol by prolonging yesterday's trend
+  for (stock = 1; stock <= StockCount; stock++) {
+    if         (data[1, stock] > data[2, stock]) {
+      predict[stock] = "up"
+    } else if  (data[1, stock] < data[2, stock]) {
+      predict[stock] = "down"
+    } else {
+      predict[stock] = "neutral"
+    }
+    if ((data[1, stock] > data[2, stock]) && (data[2, stock] > data[3, stock]))
+      hot[stock] = 1
+    if ((data[1, stock] < data[2, stock]) && (data[2, stock] < data[3, stock]))
+      avoid[stock] = 1
+  }
+  # Do a plausibility check: how many predictions proved correct?
+  for (s = 1; s <= StockCount; s++) {
+    for (d = 1; d <= datacount-2; d++) {
+      if         (data[d+1, s] > data[d+2, s]) {
+        UpCount++
+      } else if  (data[d+1, s] < data[d+2, s]) {
+        DownCount++
+      } else {
+        NeutralCount++
+      }
+      if (((data[d, s]  > data[d+1, s]) && (data[d+1, s]  > data[d+2, s])) ||
+          ((data[d, s]  < data[d+1, s]) && (data[d+1, s]  < data[d+2, s])) ||
+          ((data[d, s] == data[d+1, s]) && (data[d+1, s] == data[d+2, s])))
+        CorrectCount++
+    }
+  }
+}
+function Report() {
+  # Generate report
+  report =        "\nThis is your daily "
+  report = report "stock market report for "strftime("%A, %B %d, %Y")".\n"
+  report = report "Here are the predictions for today:\n\n"
+  for (stock = 1; stock <= StockCount; stock++)
+    report = report "\t" name[stock] "\t" predict[stock] "\n"
+  for (stock in hot) {
+    if (HotCount++ == 0)
+      report = report "\nThe most promising shares for today are these:\n\n"
+    report = report "\t" name[stock] "\t\thttp://biz.yahoo.com/n/" \
+      tolower(substr(name[stock], 1, 1)) "/" tolower(name[stock]) ".html\n"
+  }
+  for (stock in avoid) {
+    if (AvoidCount++ == 0)
+      report = report "\nThe stock shares to avoid today are these:\n\n"
+    report = report "\t" name[stock] "\t\thttp://biz.yahoo.com/n/" \
+      tolower(substr(name[stock], 1, 1)) "/" tolower(name[stock]) ".html\n"
+  }
+  report = report "\nThis sums up to " HotCount+0 " winners and " AvoidCount+0
+  report = report " losers. When using this kind\nof prediction scheme for"
+  report = report " the 12 months which lie behind us,\nwe get " UpCount
+  report = report " 'ups' and " DownCount " 'downs' and " NeutralCount
+  report = report " 'neutrals'. Of all\nthese " UpCount+DownCount+NeutralCount
+  report = report " predictions " CorrectCount " proved correct next day.\n"
+  report = report "A success rate of "\
+             int(100*CorrectCount/(UpCount+DownCount+NeutralCount)) "%.\n"
+  report = report "Random choice would have produced a 33% success rate.\n"
+  report = report "Disclaimer: Like every other prediction of the stock\n"
+  report = report "market, this report is, of course, complete nonsense.\n"
+  report = report "If you are stupid enough to believe these predictions\n"
+  report = report "you should visit a doctor who can treat your ailment."
+}
+function SendMail() {
+  # send report to customers
+  customer["uncle.scrooge@ducktown.gov"] = "Uncle Scrooge"
+  customer["more@utopia.org"           ] = "Sir Thomas More"
+  customer["spinoza@denhaag.nl"        ] = "Baruch de Spinoza"
+  customer["marx@highgate.uk"          ] = "Karl Marx"
+  customer["keynes@the.long.run"       ] = "John Maynard Keynes"
+  customer["bierce@devil.hell.org"     ] = "Ambrose Bierce"
+  customer["laplace@paris.fr"          ] = "Pierre Simon de Laplace"
+  for (c in customer) {
+    MailPipe = "mail -s 'Daily Stock Prediction Newsletter'" c
+    print "Good morning " customer[c] "," | MailPipe
+    print report "\n.\n" | MailPipe
+    close(MailPipe)
+  }
+}
diff --git a/gawk-5.0.1/awklib/eg/network/testserv.awk b/gawk-5.0.1/awklib/eg/network/testserv.awk
new file mode 100644
index 00000000000..812bfe6a617
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/testserv.awk
@@ -0,0 +1,12 @@
+BEGIN {
+  CGI_setup("GET",
+  "http://www.gnu.org/cgi-bin/foo?p1=stuff&p2=stuff%26junk" \
+       "&percent=a %25 sign",
+  "1.0")
+  for (i in MENU)
+      printf "MENU[\"%s\"] = %s\n", i, MENU[i]
+  for (i in PARAM)
+      printf "PARAM[\"%s\"] = %s\n", i, PARAM[i]
+  for (i in GETARG)
+      printf "GETARG[\"%s\"] = %s\n", i, GETARG[i]
+}
diff --git a/gawk-5.0.1/awklib/eg/network/urlchk.awk b/gawk-5.0.1/awklib/eg/network/urlchk.awk
new file mode 100644
index 00000000000..6ddedfa854d
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/urlchk.awk
@@ -0,0 +1,28 @@
+BEGIN {
+  if (ARGC != 2) {
+    print "URLCHK - check if URLs have changed"
+    print "IN:\n    the file with URLs as a command-line parameter"
+    print "    file contains URL, old length, new length"
+    print "PARAMS:\n    -v Proxy=MyProxy -v ProxyPort=8080"
+    print "OUT:\n    same as file with URLs"
+    print "JK 02.03.1998"
+    exit
+  }
+  URLfile = ARGV[1]; ARGV[1] = ""
+  if (Proxy     != "") Proxy     = " -v Proxy="     Proxy
+  if (ProxyPort != "") ProxyPort = " -v ProxyPort=" ProxyPort
+  while ((getline < URLfile) > 0)
+     Length[$1] = $3 + 0
+  close(URLfile)      # now, URLfile is read in and can be updated
+  GetHeader = "gawk " Proxy ProxyPort " -v Method=\"HEAD\" -f geturl.awk "
+  for (i in Length) {
+    GetThisHeader = GetHeader i " 2>&1"
+    while ((GetThisHeader | getline) > 0)
+      if (toupper($0) ~ /CONTENT-LENGTH/) NewLength = $2 + 0
+    close(GetThisHeader)
+    print i, Length[i], NewLength > URLfile
+    if (Length[i] != NewLength)  # report only changed URLs
+      print i, Length[i], NewLength
+  }
+  close(URLfile)
+}
diff --git a/gawk-5.0.1/awklib/eg/network/webgrab.awk b/gawk-5.0.1/awklib/eg/network/webgrab.awk
new file mode 100644
index 00000000000..a843da18b5a
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/network/webgrab.awk
@@ -0,0 +1,6 @@
+BEGIN { RS = "https?://[#%&\\+\\-\\./0-9\\:;\\?A-Z_a-z\\~]*" }
+RT != "" {
+   command = ("gawk -v Proxy=MyProxy -f geturl.awk " RT \
+               " > doc" NR ".html")
+   print command
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/alarm.awk b/gawk-5.0.1/awklib/eg/prog/alarm.awk
new file mode 100644
index 00000000000..59630ea8818
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/alarm.awk
@@ -0,0 +1,90 @@
+# alarm.awk --- set an alarm
+#
+# Requires getlocaltime() library function
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised December 2010
+
+# usage: alarm time [ "message" [ count [ delay ] ] ]
+
+BEGIN {
+    # Initial argument sanity checking
+    usage1 = "usage: alarm time ['message' [count [delay]]]"
+    usage2 = sprintf("\t(%s) time ::= hh:mm", ARGV[1])
+
+    if (ARGC < 2) {
+        print usage1 > "/dev/stderr"
+        print usage2 > "/dev/stderr"
+        exit 1
+    }
+    switch (ARGC) {
+    case 5:
+        delay = ARGV[4] + 0
+        # fall through
+    case 4:
+        count = ARGV[3] + 0
+        # fall through
+    case 3:
+        message = ARGV[2]
+        break
+    default:
+        if (ARGV[1] !~ /[[:digit:]]?[[:digit:]]:[[:digit:]]{2}/) {
+            print usage1 > "/dev/stderr"
+            print usage2 > "/dev/stderr"
+            exit 1
+        }
+        break
+    }
+
+    # set defaults for once we reach the desired time
+    if (delay == 0)
+        delay = 180    # 3 minutes
+    if (count == 0)
+        count = 5
+    if (message == "")
+        message = sprintf("\aIt is now %s!\a", ARGV[1])
+    else if (index(message, "\a") == 0)
+        message = "\a" message "\a"
+    # split up alarm time
+    split(ARGV[1], atime, ":")
+    hour = atime[1] + 0    # force numeric
+    minute = atime[2] + 0  # force numeric
+
+    # get current broken down time
+    getlocaltime(now)
+
+    # if time given is 12-hour hours and it's after that
+    # hour, e.g., `alarm 5:30' at 9 a.m. means 5:30 p.m.,
+    # then add 12 to real hour
+    if (hour < 12 && now["hour"] > hour)
+        hour += 12
+
+    # set target time in seconds since midnight
+    target = (hour * 60 * 60) + (minute * 60)
+
+    # get current time in seconds since midnight
+    current = (now["hour"] * 60 * 60) + \
+               (now["minute"] * 60) + now["second"]
+
+    # how long to sleep for
+    naptime = target - current
+    if (naptime <= 0) {
+        print "alarm: time is in the past!" > "/dev/stderr"
+        exit 1
+    }
+    # zzzzzz..... go away if interrupted
+    if (system(sprintf("sleep %d", naptime)) != 0)
+        exit 1
+
+    # time to notify!
+    command = sprintf("sleep %d", delay)
+    for (i = 1; i <= count; i++) {
+        print message
+        # if sleep command interrupted, go away
+        if (system(command) != 0)
+            break
+    }
+
+    exit 0
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/anagram.awk b/gawk-5.0.1/awklib/eg/prog/anagram.awk
new file mode 100644
index 00000000000..4c2ce1fdb69
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/anagram.awk
@@ -0,0 +1,50 @@
+# anagram.awk --- An implementation of the anagram-finding algorithm
+#                 from Jon Bentley's "Programming Pearls," 2nd edition.
+#                 Addison Wesley, 2000, ISBN 0-201-65788-0.
+#                 Column 2, Problem C, section 2.8, pp 18-20.
+#
+# This program requires gawk 4.0 or newer.
+# Required gawk-specific features:
+#   - True multidimensional arrays
+#   - split() with "" as separator splits out individual characters
+#   - asort() and asorti() functions
+#
+# See https://savannah.gnu.org/projects/gawk.
+#
+# Arnold Robbins
+# arnold@skeeve.com
+# Public Domain
+# January, 2011
+
+/'s$/   { next }        # Skip possessives
+{
+    key = word2key($1)  # Build signature
+    data[key][$1] = $1  # Store word with signature
+}
+# word2key --- split word apart into letters, sort, and join back together
+
+function word2key(word,     a, i, n, result)
+{
+    n = split(word, a, "")
+    asort(a)
+
+    for (i = 1; i <= n; i++)
+        result = result a[i]
+
+    return result
+}
+END {
+    sort = "sort"
+    for (key in data) {
+        # Sort words with same key
+        nwords = asorti(data[key], words)
+        if (nwords == 1)
+            continue
+
+        # And print. Minor glitch: trailing space at end of each line
+        for (j = 1; j <= nwords; j++)
+            printf("%s ", words[j]) | sort
+        print "" | sort
+    }
+    close(sort)
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/awksed.awk b/gawk-5.0.1/awklib/eg/prog/awksed.awk
new file mode 100644
index 00000000000..d9f177175ca
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/awksed.awk
@@ -0,0 +1,31 @@
+# awksed.awk --- do s/foo/bar/g using just print
+#    Thanks to Michael Brennan for the idea
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# August 1995
+
+function usage()
+{
+    print "usage: awksed pat repl [files...]" > "/dev/stderr"
+    exit 1
+}
+
+BEGIN {
+    # validate arguments
+    if (ARGC < 3)
+        usage()
+
+    RS = ARGV[1]
+    ORS = ARGV[2]
+
+    # don't use arguments as files
+    ARGV[1] = ARGV[2] = ""
+}
+
+# look ma, no hands!
+{
+    if (RT == "")
+        printf "%s", $0
+    else
+        print
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/cut.awk b/gawk-5.0.1/awklib/eg/prog/cut.awk
new file mode 100644
index 00000000000..fd77910d091
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/cut.awk
@@ -0,0 +1,137 @@
+# cut.awk --- implement cut in awk
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+
+# Options:
+#    -f list     Cut fields
+#    -d c        Field delimiter character
+#    -c list     Cut characters
+#
+#    -s          Suppress lines without the delimiter
+#
+# Requires getopt() and join() library functions
+
+function usage()
+{
+    print("usage: cut [-f list] [-d c] [-s] [files...]") > "/dev/stderr"
+    print("usage: cut [-c list] [files...]") > "/dev/stderr"
+    exit 1
+}
+BEGIN {
+    FS = "\t"    # default
+    OFS = FS
+    while ((c = getopt(ARGC, ARGV, "sf:c:d:")) != -1) {
+        if (c == "f") {
+            by_fields = 1
+            fieldlist = Optarg
+        } else if (c == "c") {
+            by_chars = 1
+            fieldlist = Optarg
+            OFS = ""
+        } else if (c == "d") {
+            if (length(Optarg) > 1) {
+                printf("cut: using first character of %s" \
+                       " for delimiter\n", Optarg) > "/dev/stderr"
+                Optarg = substr(Optarg, 1, 1)
+            }
+            fs = FS = Optarg
+            OFS = FS
+            if (FS == " ")    # defeat awk semantics
+                FS = "[ ]"
+        } else if (c == "s")
+            suppress = 1
+        else
+            usage()
+    }
+
+    # Clear out options
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+    if (by_fields && by_chars)
+        usage()
+
+    if (by_fields == 0 && by_chars == 0)
+        by_fields = 1    # default
+
+    if (fieldlist == "") {
+        print "cut: needs list for -c or -f" > "/dev/stderr"
+        exit 1
+    }
+
+    if (by_fields)
+        set_fieldlist()
+    else
+        set_charlist()
+}
+function set_fieldlist(        n, m, i, j, k, f, g)
+{
+    n = split(fieldlist, f, ",")
+    j = 1    # index in flist
+    for (i = 1; i <= n; i++) {
+        if (index(f[i], "-") != 0) { # a range
+            m = split(f[i], g, "-")
+            if (m != 2 || g[1] >= g[2]) {
+                printf("cut: bad field list: %s\n",
+                                  f[i]) > "/dev/stderr"
+                exit 1
+            }
+            for (k = g[1]; k <= g[2]; k++)
+                flist[j++] = k
+        } else
+            flist[j++] = f[i]
+    }
+    nfields = j - 1
+}
+function set_charlist(    field, i, j, f, g, n, m, t,
+                          filler, last, len)
+{
+    field = 1   # count total fields
+    n = split(fieldlist, f, ",")
+    j = 1       # index in flist
+    for (i = 1; i <= n; i++) {
+        if (index(f[i], "-") != 0) { # range
+            m = split(f[i], g, "-")
+            if (m != 2 || g[1] >= g[2]) {
+                printf("cut: bad character list: %s\n",
+                               f[i]) > "/dev/stderr"
+                exit 1
+            }
+            len = g[2] - g[1] + 1
+            if (g[1] > 1)  # compute length of filler
+                filler = g[1] - last - 1
+            else
+                filler = 0
+            if (filler)
+                t[field++] = filler
+            t[field++] = len  # length of field
+            last = g[2]
+            flist[j++] = field - 1
+        } else {
+            if (f[i] > 1)
+                filler = f[i] - last - 1
+            else
+                filler = 0
+            if (filler)
+                t[field++] = filler
+            t[field++] = 1
+            last = f[i]
+            flist[j++] = field - 1
+        }
+    }
+    FIELDWIDTHS = join(t, 1, field - 1)
+    nfields = j - 1
+}
+{
+    if (by_fields && suppress && index($0, fs) == 0)
+        next
+
+    for (i = 1; i <= nfields; i++) {
+        if ($flist[i] != "") {
+            printf "%s", $flist[i]
+            if (i < nfields && $flist[i+1] != "")
+                printf "%s", OFS
+        }
+    }
+    print ""
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/dupword.awk b/gawk-5.0.1/awklib/eg/prog/dupword.awk
new file mode 100644
index 00000000000..047b99f5bfd
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/dupword.awk
@@ -0,0 +1,21 @@
+# dupword.awk --- find duplicate words in text
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# December 1991
+# Revised October 2000
+
+{
+    $0 = tolower($0)
+    gsub(/[^[:alnum:][:blank:]]/, " ");
+    $0 = $0         # re-split
+    if (NF == 0)
+        next
+    if ($1 == prev)
+        printf("%s:%d: duplicate %s\n",
+            FILENAME, FNR, $1)
+    for (i = 2; i <= NF; i++)
+        if ($i == $(i-1))
+            printf("%s:%d: duplicate %s\n",
+                FILENAME, FNR, $i)
+    prev = $NF
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/egrep.awk b/gawk-5.0.1/awklib/eg/prog/egrep.awk
new file mode 100644
index 00000000000..a4165a9078f
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/egrep.awk
@@ -0,0 +1,99 @@
+# egrep.awk --- simulate egrep in awk
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+
+# Options:
+#    -c    count of lines
+#    -s    silent - use exit value
+#    -v    invert test, success if no match
+#    -i    ignore case
+#    -l    print filenames only
+#    -e    argument is pattern
+#
+# Requires getopt and file transition library functions
+
+BEGIN {
+    while ((c = getopt(ARGC, ARGV, "ce:svil")) != -1) {
+        if (c == "c")
+            count_only++
+        else if (c == "s")
+            no_print++
+        else if (c == "v")
+            invert++
+        else if (c == "i")
+            IGNORECASE = 1
+        else if (c == "l")
+            filenames_only++
+        else if (c == "e")
+            pattern = Optarg
+        else
+            usage()
+    }
+    if (pattern == "")
+        pattern = ARGV[Optind++]
+
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+    if (Optind >= ARGC) {
+        ARGV[1] = "-"
+        ARGC = 2
+    } else if (ARGC - Optind > 1)
+        do_filenames++
+
+#    if (IGNORECASE)
+#        pattern = tolower(pattern)
+}
+#{
+#    if (IGNORECASE)
+#        $0 = tolower($0)
+#}
+function beginfile(junk)
+{
+    fcount = 0
+}
+function endfile(file)
+{
+    if (! no_print && count_only) {
+        if (do_filenames)
+            print file ":" fcount
+        else
+            print fcount
+    }
+
+    total += fcount
+}
+{
+    matches = ($0 ~ pattern)
+    if (invert)
+        matches = ! matches
+
+    fcount += matches    # 1 or 0
+
+    if (! matches)
+        next
+
+    if (! count_only) {
+        if (no_print)
+            nextfile
+
+        if (filenames_only) {
+            print FILENAME
+            nextfile
+        }
+
+        if (do_filenames)
+            print FILENAME ":" $0
+        else
+            print
+    }
+}
+END {
+    exit (total == 0)
+}
+function usage()
+{
+    print("Usage: egrep [-csvil] [-e pat] [files ...]") > "/dev/stderr"
+    print("\n\tegrep [-csvil] pat [files ...]") > "/dev/stderr"
+    exit 1
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/extract.awk b/gawk-5.0.1/awklib/eg/prog/extract.awk
new file mode 100644
index 00000000000..0e9bcca3f9f
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/extract.awk
@@ -0,0 +1,73 @@
+# extract.awk --- extract files and run programs from Texinfo files
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised September 2000
+
+BEGIN    { IGNORECASE = 1 }
+
+/^@c(omment)?[ \t]+system/ {
+    if (NF < 3) {
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e  ": badly formed `system' line")
+        print e > "/dev/stderr"
+        next
+    }
+    $1 = ""
+    $2 = ""
+    stat = system($0)
+    if (stat != 0) {
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e ": warning: system returned " stat)
+        print e > "/dev/stderr"
+    }
+}
+/^@c(omment)?[ \t]+file/ {
+    if (NF != 3) {
+        e = ("extract: " FILENAME ":" FNR ": badly formed `file' line")
+        print e > "/dev/stderr"
+        next
+    }
+    if ($3 != curfile) {
+        if (curfile != "")
+            filelist[curfile] = 1   # save to close later
+        curfile = $3
+    }
+
+    for (;;) {
+        if ((getline line) <= 0)
+            unexpected_eof()
+        if (line ~ /^@c(omment)?[ \t]+endfile/)
+            break
+        else if (line ~ /^@(end[ \t]+)?group/)
+            continue
+        else if (line ~ /^@c(omment+)?[ \t]+/)
+            continue
+        if (index(line, "@") == 0) {
+            print line > curfile
+            continue
+        }
+        n = split(line, a, "@")
+        # if a[1] == "", means leading @,
+        # don't add one back in.
+        for (i = 2; i <= n; i++) {
+            if (a[i] == "") { # was an @@
+                a[i] = "@"
+                if (a[i+1] == "")
+                    i++
+            }
+        }
+        print join(a, 1, n, SUBSEP) > curfile
+    }
+}
+END {
+    close(curfile)          # close the last one
+    for (f in filelist)     # close all the rest
+        close(f)
+}
+function unexpected_eof()
+{
+    printf("extract: %s:%d: unexpected EOF or error\n",
+                     FILENAME, FNR) > "/dev/stderr"
+    exit 1
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/guide.awk b/gawk-5.0.1/awklib/eg/prog/guide.awk
new file mode 100644
index 00000000000..a2dea1b7f64
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/guide.awk
@@ -0,0 +1,7 @@
+BEGIN {
+    TEXTDOMAIN = "guide"
+    bindtextdomain(".")  # for testing
+    print _"Don't Panic"
+    print _"The Answer Is", 42
+    print "Pardon me, Zaphod who?"
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/histsort.awk b/gawk-5.0.1/awklib/eg/prog/histsort.awk
new file mode 100644
index 00000000000..b156f67dfc1
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/histsort.awk
@@ -0,0 +1,15 @@
+# histsort.awk --- compact a shell history file
+# Thanks to Byron Rakitzis for the general idea
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+
+{
+    if (data[$0]++ == 0)
+        lines[++count] = $0
+}
+
+END {
+    for (i = 1; i <= count; i++)
+        print lines[i]
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/id.awk b/gawk-5.0.1/awklib/eg/prog/id.awk
new file mode 100644
index 00000000000..b6061f9b403
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/id.awk
@@ -0,0 +1,61 @@
+# id.awk --- implement id in awk
+#
+# Requires user and group library functions
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised February 1996
+# Revised May 2014
+# Revised September 2014
+
+# output is:
+# uid=12(foo) euid=34(bar) gid=3(baz) \
+#             egid=5(blat) groups=9(nine),2(two),1(one)
+
+BEGIN {
+    uid = PROCINFO["uid"]
+    euid = PROCINFO["euid"]
+    gid = PROCINFO["gid"]
+    egid = PROCINFO["egid"]
+
+    printf("uid=%d", uid)
+    pw = getpwuid(uid)
+    pr_first_field(pw)
+
+    if (euid != uid) {
+        printf(" euid=%d", euid)
+        pw = getpwuid(euid)
+        pr_first_field(pw)
+    }
+
+    printf(" gid=%d", gid)
+    pw = getgrgid(gid)
+    pr_first_field(pw)
+
+    if (egid != gid) {
+        printf(" egid=%d", egid)
+        pw = getgrgid(egid)
+        pr_first_field(pw)
+    }
+
+    for (i = 1; ("group" i) in PROCINFO; i++) {
+        if (i == 1)
+            printf(" groups=")
+        group = PROCINFO["group" i]
+        printf("%d", group)
+        pw = getgrgid(group)
+        pr_first_field(pw)
+        if (("group" (i+1)) in PROCINFO)
+            printf(",")
+    }
+
+    print ""
+}
+
+function pr_first_field(str,  a)
+{
+    if (str != "") {
+        split(str, a, ":")
+        printf("(%s)", a[1])
+    }
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/igawk.sh b/gawk-5.0.1/awklib/eg/prog/igawk.sh
new file mode 100644
index 00000000000..70edf606bf4
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/igawk.sh
@@ -0,0 +1,138 @@
+#! /bin/sh
+# igawk --- like gawk but do @include processing
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# July 1993
+# December 2010, minor edits
+
+if [ "$1" = debug ]
+then
+    set -x
+    shift
+fi
+
+# A literal newline, so that program text is formatted correctly
+n='
+'
+
+# Initialize variables to empty
+program=
+opts=
+
+while [ $# -ne 0 ] # loop over arguments
+do
+    case $1 in
+    --)     shift
+            break ;;
+
+    -W)     shift
+            # The ${x?'message here'} construct prints a
+            # diagnostic if $x is the null string
+            set -- -W"${@?'missing operand'}"
+            continue ;;
+
+    -[vF])  opts="$opts $1 '${2?'missing operand'}'"
+            shift ;;
+
+    -[vF]*) opts="$opts '$1'" ;;
+
+    -f)     program="$program$n@include ${2?'missing operand'}"
+            shift ;;
+
+    -f*)    f=$(expr "$1" : '-f\(.*\)')
+            program="$program$n@include $f" ;;
+
+    -[W-]file=*)
+            f=$(expr "$1" : '-.file=\(.*\)')
+            program="$program$n@include $f" ;;
+
+    -[W-]file)
+            program="$program$n@include ${2?'missing operand'}"
+            shift ;;
+
+    -[W-]source=*)
+            t=$(expr "$1" : '-.source=\(.*\)')
+            program="$program$n$t" ;;
+
+    -[W-]source)
+            program="$program$n${2?'missing operand'}"
+            shift ;;
+
+    -[W-]version)
+            echo igawk: version 3.0 1>&2
+            gawk --version
+            exit 0 ;;
+
+    -[W-]*) opts="$opts '$1'" ;;
+
+    *)      break ;;
+    esac
+    shift
+done
+
+if [ -z "$program" ]
+then
+     program=${1?'missing program'}
+     shift
+fi
+
+# At this point, `program' has the program.
+expand_prog='
+
+function pathto(file,    i, t, junk)
+{
+    if (index(file, "/") != 0)
+        return file
+
+    if (file == "-")
+        return file
+
+    for (i = 1; i <= ndirs; i++) {
+        t = (pathlist[i] "/" file)
+        if ((getline junk < t) > 0) {
+            # found it
+            close(t)
+            return t
+        }
+    }
+    return ""
+}
+BEGIN {
+    path = ENVIRON["AWKPATH"]
+    ndirs = split(path, pathlist, ":")
+    for (i = 1; i <= ndirs; i++) {
+        if (pathlist[i] == "")
+            pathlist[i] = "."
+    }
+    stackptr = 0
+    input[stackptr] = ARGV[1] # ARGV[1] is first file
+
+    for (; stackptr >= 0; stackptr--) {
+        while ((getline < input[stackptr]) > 0) {
+            if (tolower($1) != "@include") {
+                print
+                continue
+            }
+            fpath = pathto($2)
+            if (fpath == "") {
+                printf("igawk: %s:%d: cannot find %s\n",
+                    input[stackptr], FNR, $2) > "/dev/stderr"
+                continue
+            }
+            if (! (fpath in processed)) {
+                processed[fpath] = input[stackptr]
+                input[++stackptr] = fpath  # push onto stack
+            } else
+                print $2, "included in", input[stackptr],
+                    "already included in",
+                    processed[fpath] > "/dev/stderr"
+        }
+        close(input[stackptr])
+    }
+}'  # close quote ends `expand_prog' variable
+
+processed_program=$(gawk -- "$expand_prog" /dev/stdin << EOF
+$program
+EOF
+)
+eval gawk $opts -- '"$processed_program"' '"$@"'
diff --git a/gawk-5.0.1/awklib/eg/prog/indirectcall.awk b/gawk-5.0.1/awklib/eg/prog/indirectcall.awk
new file mode 100644
index 00000000000..b2b82686a90
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/indirectcall.awk
@@ -0,0 +1,90 @@
+# indirectcall.awk --- Demonstrate indirect function calls
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# January 2009
+# average --- return the average of the values in fields $first - $last
+
+function average(first, last,   sum, i)
+{
+    sum = 0;
+    for (i = first; i <= last; i++)
+        sum += $i
+
+    return sum / (last - first + 1)
+}
+
+# sum --- return the sum of the values in fields $first - $last
+
+function sum(first, last,   ret, i)
+{
+    ret = 0;
+    for (i = first; i <= last; i++)
+        ret += $i
+
+    return ret
+}
+# For each record, print the class name and the requested statistics
+{
+    class_name = $1
+    gsub(/_/, " ", class_name)  # Replace _ with spaces
+
+    # find start
+    for (i = 1; i <= NF; i++) {
+        if ($i == "data:") {
+            start = i + 1
+            break
+        }
+    }
+
+    printf("%s:\n", class_name)
+    for (i = 2; $i != "data:"; i++) {
+        the_function = $i
+        printf("\t%s: <%s>\n", $i, @the_function(start, NF) "")
+    }
+    print ""
+}
+# num_lt --- do a numeric less than comparison
+
+function num_lt(left, right)
+{
+    return ((left + 0) < (right + 0))
+}
+
+# num_ge --- do a numeric greater than or equal to comparison
+
+function num_ge(left, right)
+{
+    return ((left + 0) >= (right + 0))
+}
+# do_sort --- sort the data according to `compare'
+#             and return it as a string
+
+function do_sort(first, last, compare,      data, i, retval)
+{
+    delete data
+    for (i = 1; first <= last; first++) {
+        data[i] = $first
+        i++
+    }
+
+    quicksort(data, 1, i-1, compare)
+
+    retval = data[1]
+    for (i = 2; i in data; i++)
+        retval = retval " " data[i]
+
+    return retval
+}
+# sort --- sort the data in ascending order and return it as a string
+
+function sort(first, last)
+{
+    return do_sort(first, last, "num_lt")
+}
+
+# rsort --- sort the data in descending order and return it as a string
+
+function rsort(first, last)
+{
+    return do_sort(first, last, "num_ge")
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/labels.awk b/gawk-5.0.1/awklib/eg/prog/labels.awk
new file mode 100644
index 00000000000..3195809ba2b
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/labels.awk
@@ -0,0 +1,53 @@
+# labels.awk --- print mailing labels
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# June 1992
+# December 2010, minor edits
+
+# Each label is 5 lines of data that may have blank lines.
+# The label sheets have 2 blank lines at the top and 2 at
+# the bottom.
+
+BEGIN    { RS = "" ; MAXLINES = 100 }
+
+function printpage(    i, j)
+{
+    if (Nlines <= 0)
+        return
+
+    printf "\n\n"        # header
+
+    for (i = 1; i <= Nlines; i += 10) {
+        if (i == 21 || i == 61)
+            print ""
+        for (j = 0; j < 5; j++) {
+            if (i + j > MAXLINES)
+                break
+            printf "   %-41s %s\n", line[i+j], line[i+j+5]
+        }
+        print ""
+    }
+
+    printf "\n\n"        # footer
+
+    delete line
+}
+
+# main rule
+{
+    if (Count >= 20) {
+        printpage()
+        Count = 0
+        Nlines = 0
+    }
+    n = split($0, a, "\n")
+    for (i = 1; i <= n; i++)
+        line[++Nlines] = a[i]
+    for (; i <= 5; i++)
+        line[++Nlines] = ""
+    Count++
+}
+
+END {
+    printpage()
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/pi.awk b/gawk-5.0.1/awklib/eg/prog/pi.awk
new file mode 100644
index 00000000000..91060db94ff
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/pi.awk
@@ -0,0 +1,18 @@
+# pi.awk --- compute the digits of pi
+#
+# Katie Wasserman, katie@wass.net
+# August 2014
+
+BEGIN {
+    digits = 100000
+    two = 2 * 10 ^ digits
+    pi = two
+    for (m = digits * 4; m > 0; --m) {
+        d = m * 2 + 1
+        x = pi * m
+        intdiv0(x, d, result)
+        pi = result["quotient"]
+        pi = pi + two
+    }
+    print pi
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/split.awk b/gawk-5.0.1/awklib/eg/prog/split.awk
new file mode 100644
index 00000000000..9239a6c5147
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/split.awk
@@ -0,0 +1,56 @@
+# split.awk --- do split in awk
+#
+# Requires ord() and chr() library functions
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised slightly, May 2014
+
+# usage: split [-count] [file] [outname]
+
+BEGIN {
+    outfile = "x"    # default
+    count = 1000
+    if (ARGC > 4)
+        usage()
+
+    i = 1
+    if (i in ARGV && ARGV[i] ~ /^-[[:digit:]]+$/) {
+        count = -ARGV[i]
+        ARGV[i] = ""
+        i++
+    }
+    # test argv in case reading from stdin instead of file
+    if (i in ARGV)
+        i++    # skip datafile name
+    if (i in ARGV) {
+        outfile = ARGV[i]
+        ARGV[i] = ""
+    }
+    s1 = s2 = "a"
+    out = (outfile s1 s2)
+}
+{
+    if (++tcount > count) {
+        close(out)
+        if (s2 == "z") {
+            if (s1 == "z") {
+                printf("split: %s is too large to split\n",
+                       FILENAME) > "/dev/stderr"
+                exit 1
+            }
+            s1 = chr(ord(s1) + 1)
+            s2 = "a"
+        }
+        else
+            s2 = chr(ord(s2) + 1)
+        out = (outfile s1 s2)
+        tcount = 1
+    }
+    print > out
+}
+function usage()
+{
+    print("usage: split [-num] [file] [outname]") > "/dev/stderr"
+    exit 1
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/tee.awk b/gawk-5.0.1/awklib/eg/prog/tee.awk
new file mode 100644
index 00000000000..fd9985f1380
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/tee.awk
@@ -0,0 +1,40 @@
+# tee.awk --- tee in awk
+#
+# Copy standard input to all named output files.
+# Append content if -a option is supplied.
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised December 1995
+
+BEGIN {
+    for (i = 1; i < ARGC; i++)
+        copy[i] = ARGV[i]
+
+    if (ARGV[1] == "-a") {
+        append = 1
+        delete ARGV[1]
+        delete copy[1]
+        ARGC--
+    }
+    if (ARGC < 2) {
+        print "usage: tee [-a] file ..." > "/dev/stderr"
+        exit 1
+    }
+    ARGV[1] = "-"
+    ARGC = 2
+}
+{
+    # moving the if outside the loop makes it run faster
+    if (append)
+        for (i in copy)
+            print >> copy[i]
+    else
+        for (i in copy)
+            print > copy[i]
+    print
+}
+END {
+    for (i in copy)
+        close(copy[i])
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/testbits.awk b/gawk-5.0.1/awklib/eg/prog/testbits.awk
new file mode 100644
index 00000000000..03cb71644c4
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/testbits.awk
@@ -0,0 +1,27 @@
+# bits2str --- turn an integer into readable ones and zeros
+
+function bits2str(bits,        data, mask)
+{
+    if (bits == 0)
+        return "0"
+
+    mask = 1
+    for (; bits != 0; bits = rshift(bits, 1))
+        data = (and(bits, mask) ? "1" : "0") data
+
+    while ((length(data) % 8) != 0)
+        data = "0" data
+
+    return data
+}
+BEGIN {
+    printf "123 = %s\n", bits2str(123)
+    printf "0123 = %s\n", bits2str(0123)
+    printf "0x99 = %s\n", bits2str(0x99)
+    comp = compl(0x99)
+    printf "compl(0x99) = %#x = %s\n", comp, bits2str(comp)
+    shift = lshift(0x99, 2)
+    printf "lshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
+    shift = rshift(0x99, 2)
+    printf "rshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/translate.awk b/gawk-5.0.1/awklib/eg/prog/translate.awk
new file mode 100644
index 00000000000..e7403717964
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/translate.awk
@@ -0,0 +1,51 @@
+# translate.awk --- do tr-like stuff
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# August 1989
+# February 2009 - bug fix
+
+# Bugs: does not handle things like tr A-Z a-z; it has
+# to be spelled out. However, if `to' is shorter than `from',
+# the last character in `to' is used for the rest of `from'.
+
+function stranslate(from, to, target,     lf, lt, ltarget, t_ar, i, c,
+                                                               result)
+{
+    lf = length(from)
+    lt = length(to)
+    ltarget = length(target)
+    for (i = 1; i <= lt; i++)
+        t_ar[substr(from, i, 1)] = substr(to, i, 1)
+    if (lt < lf)
+        for (; i <= lf; i++)
+            t_ar[substr(from, i, 1)] = substr(to, lt, 1)
+    for (i = 1; i <= ltarget; i++) {
+        c = substr(target, i, 1)
+        if (c in t_ar)
+            c = t_ar[c]
+        result = result c
+    }
+    return result
+}
+
+function translate(from, to)
+{
+    return $0 = stranslate(from, to, $0)
+}
+
+# main program
+BEGIN {
+    if (ARGC < 3) {
+        print "usage: translate from to" > "/dev/stderr"
+        exit
+    }
+    FROM = ARGV[1]
+    TO = ARGV[2]
+    ARGC = 2
+    ARGV[1] = "-"
+}
+
+{
+    translate(FROM, TO)
+    print
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/uniq.awk b/gawk-5.0.1/awklib/eg/prog/uniq.awk
new file mode 100644
index 00000000000..7dd16099d28
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/uniq.awk
@@ -0,0 +1,118 @@
+# uniq.awk --- do uniq in awk
+#
+# Requires getopt() and join() library functions
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+
+function usage()
+{
+    print("Usage: uniq [-udc [-n]] [+n] [ in [ out ]]") > "/dev/stderr"
+    exit 1
+}
+
+# -c    count lines. overrides -d and -u
+# -d    only repeated lines
+# -u    only nonrepeated lines
+# -n    skip n fields
+# +n    skip n characters, skip fields first
+
+BEGIN {
+    count = 1
+    outputfile = "/dev/stdout"
+    opts = "udc0:1:2:3:4:5:6:7:8:9:"
+    while ((c = getopt(ARGC, ARGV, opts)) != -1) {
+        if (c == "u")
+            non_repeated_only++
+        else if (c == "d")
+            repeated_only++
+        else if (c == "c")
+            do_count++
+        else if (index("0123456789", c) != 0) {
+            # getopt() requires args to options
+            # this messes us up for things like -5
+            if (Optarg ~ /^[[:digit:]]+$/)
+                fcount = (c Optarg) + 0
+            else {
+                fcount = c + 0
+                Optind--
+            }
+        } else
+            usage()
+    }
+
+    if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) {
+        charcount = substr(ARGV[Optind], 2) + 0
+        Optind++
+    }
+
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+
+    if (repeated_only == 0 && non_repeated_only == 0)
+        repeated_only = non_repeated_only = 1
+
+    if (ARGC - Optind == 2) {
+        outputfile = ARGV[ARGC - 1]
+        ARGV[ARGC - 1] = ""
+    }
+}
+function are_equal(    n, m, clast, cline, alast, aline)
+{
+    if (fcount == 0 && charcount == 0)
+        return (last == $0)
+
+    if (fcount > 0) {
+        n = split(last, alast)
+        m = split($0, aline)
+        clast = join(alast, fcount+1, n)
+        cline = join(aline, fcount+1, m)
+    } else {
+        clast = last
+        cline = $0
+    }
+    if (charcount) {
+        clast = substr(clast, charcount + 1)
+        cline = substr(cline, charcount + 1)
+    }
+
+    return (clast == cline)
+}
+NR == 1 {
+    last = $0
+    next
+}
+
+{
+    equal = are_equal()
+
+    if (do_count) {    # overrides -d and -u
+        if (equal)
+            count++
+        else {
+            printf("%4d %s\n", count, last) > outputfile
+            last = $0
+            count = 1    # reset
+        }
+        next
+    }
+
+    if (equal)
+        count++
+    else {
+        if ((repeated_only && count > 1) ||
+            (non_repeated_only && count == 1))
+                print last > outputfile
+        last = $0
+        count = 1
+    }
+}
+
+END {
+    if (do_count)
+        printf("%4d %s\n", count, last) > outputfile
+    else if ((repeated_only && count > 1) ||
+            (non_repeated_only && count == 1))
+        print last > outputfile
+    close(outputfile)
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/wc.awk b/gawk-5.0.1/awklib/eg/prog/wc.awk
new file mode 100644
index 00000000000..c46d0984b90
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/wc.awk
@@ -0,0 +1,69 @@
+# wc.awk --- count lines, words, characters
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+
+# Options:
+#    -l    only count lines
+#    -w    only count words
+#    -c    only count characters
+#
+# Default is to count lines, words, characters
+#
+# Requires getopt() and file transition library functions
+
+BEGIN {
+    # let getopt() print a message about
+    # invalid options. we ignore them
+    while ((c = getopt(ARGC, ARGV, "lwc")) != -1) {
+        if (c == "l")
+            do_lines = 1
+        else if (c == "w")
+            do_words = 1
+        else if (c == "c")
+            do_chars = 1
+    }
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+
+    # if no options, do all
+    if (! do_lines && ! do_words && ! do_chars)
+        do_lines = do_words = do_chars = 1
+
+    print_total = (ARGC - i > 1)
+}
+function beginfile(file)
+{
+    lines = words = chars = 0
+    fname = FILENAME
+}
+function endfile(file)
+{
+    tlines += lines
+    twords += words
+    tchars += chars
+    if (do_lines)
+        printf "\t%d", lines
+    if (do_words)
+        printf "\t%d", words
+    if (do_chars)
+        printf "\t%d", chars
+    printf "\t%s\n", fname
+}
+# do per line
+{
+    chars += length($0) + 1    # get newline
+    lines++
+    words += NF
+}
+END {
+    if (print_total) {
+        if (do_lines)
+            printf "\t%d", tlines
+        if (do_words)
+            printf "\t%d", twords
+        if (do_chars)
+            printf "\t%d", tchars
+        print "\ttotal"
+    }
+}
diff --git a/gawk-5.0.1/awklib/eg/prog/wordfreq.awk b/gawk-5.0.1/awklib/eg/prog/wordfreq.awk
new file mode 100644
index 00000000000..6d7195e4dbb
--- /dev/null
+++ b/gawk-5.0.1/awklib/eg/prog/wordfreq.awk
@@ -0,0 +1,16 @@
+# wordfreq.awk --- print list of word frequencies
+
+{
+    $0 = tolower($0)    # remove case distinctions
+    # remove punctuation
+    gsub(/[^[:alnum:]_[:blank:]]/, "", $0)
+    for (i = 1; i <= NF; i++)
+        freq[$i]++
+}
+
+END {
+    sort = "sort -k 2nr"
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word] | sort
+    close(sort)
+}
diff --git a/gawk-5.0.1/awklib/extract.awk b/gawk-5.0.1/awklib/extract.awk
new file mode 100644
index 00000000000..0c20e299f25
--- /dev/null
+++ b/gawk-5.0.1/awklib/extract.awk
@@ -0,0 +1,90 @@
+# extract.awk --- extract files and run programs from Texinfo files
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised September 2000
+
+BEGIN    { IGNORECASE = 1 }
+
+/^@c(omment)?[ \t]+system/ {
+    if (NF < 3) {
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e  ": badly formed `system' line")
+        print e > "/dev/stderr"
+        next
+    }
+    $1 = ""
+    $2 = ""
+    stat = system($0)
+    if (stat != 0) {
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e ": warning: system returned " stat)
+        print e > "/dev/stderr"
+    }
+}
+/^@c(omment)?[ \t]+file/ {
+    if (NF != 3) {
+        e = ("extract: " FILENAME ":" FNR ": badly formed `file' line")
+        print e > "/dev/stderr"
+        next
+    }
+    if ($3 != curfile) {
+        if (curfile != "")
+            filelist[curfile] = 1     # save to close later
+        curfile = $3
+    }
+
+    for (;;) {
+        if ((getline line) <= 0)
+            unexpected_eof()
+        if (line ~ /^@c(omment)?[ \t]+endfile/)
+            break
+        else if (line ~ /^@(end[ \t]+)?group/)
+            continue
+        else if (line ~ /^@c(omment+)?[ \t]+/)
+            continue
+        if (index(line, "@") == 0) {
+            print line > curfile
+            continue
+        }
+        n = split(line, a, "@")
+        # if a[1] == "", means leading @,
+        # don't add one back in.
+        for (i = 2; i <= n; i++) {
+            if (a[i] == "") { # was an @@
+                a[i] = "@"
+                if (a[i+1] == "")
+                    i++
+            }
+        }
+        print join(a, 1, n, SUBSEP) > curfile
+    }
+}
+END {
+    close(curfile)          # close the last one
+    for (f in filelist)     # close all the rest
+        close(f)
+}
+function unexpected_eof()
+{
+    printf("extract: %s:%d: unexpected EOF or error\n",
+                     FILENAME, FNR) > "/dev/stderr"
+    exit 1
+}
+
+# join.awk --- join an array into a string
+#
+# Arnold Robbins, arnold@gnu.org, Public Domain
+# May 1993
+
+function join(array, start, end, sep,    result, i)
+{
+    if (sep == "")
+       sep = " "
+    else if (sep == SUBSEP) # magic value
+       sep = ""
+    result = array[start]
+    for (i = start + 1; i <= end; i++)
+        result = result sep array[i]
+    return result
+}
diff --git a/gawk-5.0.1/awklib/stamp-eg b/gawk-5.0.1/awklib/stamp-eg
new file mode 100644
index 00000000000..241abd9ebd4
--- /dev/null
+++ b/gawk-5.0.1/awklib/stamp-eg
@@ -0,0 +1,2 @@
+some makes are stupid and will not check a directory
+against a file, so this file is a place holder. gack.
diff --git a/gawk-5.0.1/builtin.c b/gawk-5.0.1/builtin.c
new file mode 100644
index 00000000000..bea88b86b35
--- /dev/null
+++ b/gawk-5.0.1/builtin.c
@@ -0,0 +1,4256 @@
+/*
+ * builtin.c - Builtin functions and various utility procedures.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2019 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+
+#include "awk.h"
+#if defined(HAVE_FCNTL_H)
+#include <fcntl.h>
+#endif
+#include <math.h>
+#include "random.h"
+#include "floatmagic.h"
+
+#if defined(HAVE_POPEN_H)
+#include "popen.h"
+#endif
+
+#ifndef CHAR_BIT
+# define CHAR_BIT 8
+#endif
+
+/* The extra casts work around common compiler bugs.  */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+/* Note:  these assume that negative integers are represented internally
+   via 2's complement, which is not mandated by C.  They also ignore the
+   fact that signed integer arithmetic overflow can trigger exceptions,
+   unlike unsigned which is guaranteed not to do so. */
+#define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
+			      ? ~ (uintmax_t) 0 << (sizeof (t) * CHAR_BIT - 1) \
+			      : 0))
+#define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
+
+#ifndef INTMAX_MIN
+# define INTMAX_MIN TYPE_MINIMUM (intmax_t)
+#endif
+#ifndef UINTMAX_MAX
+# define UINTMAX_MAX TYPE_MAXIMUM (uintmax_t)
+#endif
+
+#ifndef SIZE_MAX	/* C99 constant, can't rely on it everywhere */
+#define SIZE_MAX ((size_t) -1)
+#endif
+
+#define DEFAULT_G_PRECISION 6
+
+static size_t mbc_byte_count(const char *ptr, size_t numchars);
+static size_t mbc_char_count(const char *ptr, size_t numbytes);
+
+/* Can declare these, since we always use the random shipped with gawk */
+extern char *initstate(unsigned long seed, char *state, long n);
+extern char *setstate(char *state);
+extern long random(void);
+extern void srandom(unsigned long seed);
+
+extern NODE **args_array;
+extern int max_args;
+extern NODE **fields_arr;
+extern bool output_is_tty;
+extern FILE *output_fp;
+
+
+#define POP_TWO_SCALARS(s1, s2) \
+s2 = POP_SCALAR(); \
+s1 = POP(); \
+do { if (s1->type == Node_var_array) { \
+DEREF(s2); \
+fatal(_("attempt to use array `%s' in a scalar context"), array_vname(s1)); \
+}} while (false)
+
+
+/*
+ * Since we supply the version of random(), we know what
+ * value to use here.
+ */
+#define GAWK_RANDOM_MAX 0x7fffffffL
+
+/* efwrite --- like fwrite, but with error checking */
+
+static void
+efwrite(const void *ptr,
+	size_t size,
+	size_t count,
+	FILE *fp,
+	const char *from,
+	struct redirect *rp,
+	bool flush)
+{
+	errno = 0;
+	if (rp != NULL) {
+		if (rp->output.gawk_fwrite(ptr, size, count, fp, rp->output.opaque) != count)
+			goto wrerror;
+	} else if (fwrite(ptr, size, count, fp) != count)
+		goto wrerror;
+	if (flush
+	  && ((fp == stdout && output_is_tty)
+	      || (rp != NULL && (rp->flag & RED_NOBUF) != 0))) {
+		if (rp != NULL) {
+			rp->output.gawk_fflush(fp, rp->output.opaque);
+			if (rp->output.gawk_ferror(fp, rp->output.opaque))
+				goto wrerror;
+		} else {
+			fflush(fp);
+			if (ferror(fp))
+				goto wrerror;
+		}
+	}
+	return;
+
+wrerror:
+#ifdef __MINGW32__
+	if (errno == 0 || errno == EINVAL)
+		w32_maybe_set_errno();
+#endif
+	/* for stdout, die with a real SIGPIPE, like other awks */
+	if (fp == stdout && errno == EPIPE)
+		die_via_sigpipe();
+
+	/* otherwise die verbosely */
+	if ((rp != NULL) ? is_non_fatal_redirect(rp->value, strlen(rp->value)) : is_non_fatal_std(fp))
+		update_ERRNO_int(errno);
+	else
+		fatal(_("%s to \"%s\" failed (%s)"), from,
+			rp != NULL
+				? rp->value
+				: fp == stdout
+					? _("standard output")
+					: _("standard error"),
+			errno ? strerror(errno) : _("reason unknown"));
+}
+
+/* do_exp --- exponential function */
+
+NODE *
+do_exp(int nargs)
+{
+	NODE *tmp;
+	double d, res;
+
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+		lintwarn(_("exp: received non-numeric argument"));
+	d = force_number(tmp)->numbr;
+	DEREF(tmp);
+	errno = 0;
+	res = exp(d);
+	if (errno == ERANGE)
+		warning(_("exp: argument %g is out of range"), d);
+	return make_number((AWKNUM) res);
+}
+
+/* stdfile --- return fp for a standard file */
+
+/*
+ * This function allows `fflush("/dev/stdout")' to work.
+ * The other files will be available via getredirect().
+ * /dev/stdin is not included, since fflush is only for output.
+ */
+
+static FILE *
+stdfile(const char *name, size_t len)
+{
+	if (len == 11) {
+		if (strncmp(name, "/dev/stderr", 11) == 0)
+			return stderr;
+		else if (strncmp(name, "/dev/stdout", 11) == 0)
+			return stdout;
+	}
+
+	return NULL;
+}
+
+/* do_fflush --- flush output, either named file or pipe or everything */
+
+NODE *
+do_fflush(int nargs)
+{
+	struct redirect *rp;
+	NODE *tmp;
+	FILE *fp;
+	int status = 0;
+	const char *file;
+	int len;
+
+	/*
+	 * November, 2012.
+	 * It turns out that circa 2002, when BWK
+	 * added fflush() and fflush("") to his awk, he made both of
+	 * them flush everything.
+	 *
+	 * Now, with our inside agent getting ready to try to get fflush()
+	 * standardized in POSIX, we are going to make our awk consistent
+	 * with his.  This should not really affect anyone, as flushing
+	 * everything also flushes stdout.
+	 *
+	 * So. Once upon a time:
+	 * 	fflush()	--- flush stdout
+	 * 	fflush("")	--- flush everything
+	 * Now, both calls flush everything.
+	 */
+
+	/* fflush() */
+	if (nargs == 0) {
+		status = flush_io();	// ERRNO updated
+		return make_number((AWKNUM) status);
+	}
+
+	tmp = POP_STRING();
+	file = tmp->stptr;
+	len = tmp->stlen;
+
+	/* fflush("") */
+	if (tmp->stlen == 0) {
+		status = flush_io();	// ERRNO updated
+		DEREF(tmp);
+		return make_number((AWKNUM) status);
+	}
+
+	/* fflush("/some/path") */
+	rp = getredirect(tmp->stptr, tmp->stlen);
+	status = -1;
+	if (rp != NULL) {
+		if ((rp->flag & (RED_WRITE|RED_APPEND)) == 0) {
+			if ((rp->flag & RED_PIPE) != 0)
+				warning(_("fflush: cannot flush: pipe `%.*s' opened for reading, not writing"),
+					len, file);
+			else
+				warning(_("fflush: cannot flush: file `%.*s' opened for reading, not writing"),
+					len, file);
+			DEREF(tmp);
+			return make_number((AWKNUM) status);
+		}
+		fp = rp->output.fp;
+		if (fp != NULL) {
+			status = rp->output.gawk_fflush(fp, rp->output.opaque);
+
+			if (status != 0) {
+				if (! is_non_fatal_redirect(tmp->stptr, tmp->stlen))
+					fatal(_("fflush: cannot flush file `%.*s': %s"),
+						len, file, strerror(errno));
+				update_ERRNO_int(errno);
+			}
+		} else if ((rp->flag & RED_TWOWAY) != 0)
+				warning(_("fflush: cannot flush: two-way pipe `%.*s' has closed write end"),
+					len, file);
+	} else if ((fp = stdfile(tmp->stptr, tmp->stlen)) != NULL) {
+		status = (non_fatal_flush_std_file(fp) == false);
+	} else {
+		status = -1;
+		warning(_("fflush: `%.*s' is not an open file, pipe or co-process"), len, file);
+	}
+	DEREF(tmp);
+	return make_number((AWKNUM) status);
+}
+
+/* strncasecmpmbs --- like strncasecmp (multibyte string version)  */
+
+int
+strncasecmpmbs(const unsigned char *s1, const unsigned char *s2, size_t n)
+{
+	size_t i1, i2, mbclen1, mbclen2, gap;
+	wchar_t wc1, wc2;
+	mbstate_t mbs1, mbs2;
+
+	memset(& mbs1, 0, sizeof(mbs1));
+	memset(& mbs2, 0, sizeof(mbs2));
+
+	for (i1 = i2 = 0 ; i1 < n && i2 < n ;i1 += mbclen1, i2 += mbclen2) {
+		if (is_valid_character(s1[i1])) {
+			mbclen1 = 1;
+			wc1 = btowc_cache(s1[i1]);
+		} else {
+			mbclen1 = mbrtowc(& wc1, (const char *)s1 + i1,
+					  n - i1, & mbs1);
+			if (mbclen1 == (size_t) -1 || mbclen1 == (size_t) -2 || mbclen1 == 0) {
+				/* We treat it as a singlebyte character. */
+				mbclen1 = 1;
+				wc1 = btowc_cache(s1[i1]);
+			}
+		}
+		if (is_valid_character(s2[i2])) {
+			mbclen2 = 1;
+			wc2 = btowc_cache(s2[i2]);
+		} else {
+			mbclen2 = mbrtowc(& wc2, (const char *)s2 + i2,
+					  n - i2, & mbs2);
+			if (mbclen2 == (size_t) -1 || mbclen2 == (size_t) -2 || mbclen2 == 0) {
+				/* We treat it as a singlebyte character. */
+				mbclen2 = 1;
+				wc2 = btowc_cache(s2[i2]);
+			}
+		}
+		if ((gap = towlower(wc1) - towlower(wc2)) != 0)
+			/* s1 and s2 are not equivalent. */
+			return gap;
+	}
+	/* s1 and s2 are equivalent. */
+	return 0;
+}
+
+/* Inspect the buffer `src' and write the index of each byte to `dest'.
+   Caller must allocate `dest'.
+   e.g. str = <mb1(1)>, <mb1(2)>, a, b, <mb2(1)>, <mb2(2)>, <mb2(3)>, c
+        where mb(i) means the `i'-th byte of a multibyte character.
+		dest =       1,        2, 1, 1,        1,        2,        3. 1
+*/
+static void
+index_multibyte_buffer(char* src, char* dest, int len)
+{
+	int idx, prev_idx;
+	mbstate_t mbs, prevs;
+
+	memset(& prevs, 0, sizeof(mbstate_t));
+	for (idx = prev_idx = 0 ; idx < len ; idx++) {
+		size_t mbclen;
+		mbs = prevs;
+		mbclen = mbrlen(src + prev_idx, idx - prev_idx + 1, & mbs);
+		if (mbclen == (size_t) -1 || mbclen == 1 || mbclen == 0) {
+			/* singlebyte character.  */
+			mbclen = 1;
+			prev_idx = idx + 1;
+		} else if (mbclen == (size_t) -2) {
+			/* a part of a multibyte character.  */
+			mbclen = idx - prev_idx + 1;
+		} else if (mbclen > 1) {
+			/* the end of a multibyte character.  */
+			prev_idx = idx + 1;
+			prevs = mbs;
+		} else {
+			/* Can't reach.  */
+		}
+		dest[idx] = mbclen;
+    }
+}
+
+/* do_index --- find index of a string */
+
+NODE *
+do_index(int nargs)
+{
+	NODE *s1, *s2;
+	const char *p1, *p2;
+	size_t l1, l2;
+	long ret;
+	bool do_single_byte = false;
+	mbstate_t mbs1, mbs2;
+
+	if (gawk_mb_cur_max > 1) {
+		memset(& mbs1, 0, sizeof(mbstate_t));
+		memset(& mbs2, 0, sizeof(mbstate_t));
+	}
+
+	POP_TWO_SCALARS(s1, s2);
+
+	if (do_lint) {
+		if ((fixtype(s1)->flags & STRING) == 0)
+			lintwarn(_("index: received non-string first argument"));
+		if ((fixtype(s2)->flags & STRING) == 0)
+			lintwarn(_("index: received non-string second argument"));
+	}
+
+	s1 = force_string(s1);
+	s2 = force_string(s2);
+
+	p1 = s1->stptr;
+	p2 = s2->stptr;
+	l1 = s1->stlen;
+	l2 = s2->stlen;
+	ret = 0;
+
+	/*
+	 * Icky special case, index(foo, "") should return 1,
+	 * since both bwk awk and mawk do, and since match("foo", "")
+	 * returns 1. This makes index("", "") work, too, fwiw.
+	 */
+	if (l2 == 0) {
+		ret = 1;
+		goto out;
+	}
+
+	if (gawk_mb_cur_max > 1) {
+		s1 = force_wstring(s1);
+		s2 = force_wstring(s2);
+		/*
+		 * If we don't have valid wide character strings, use
+		 * the real bytes.
+		 */
+		do_single_byte = ((s1->wstlen == 0 && s1->stlen > 0)
+					|| (s2->wstlen == 0 && s2->stlen > 0));
+	}
+
+	/* IGNORECASE will already be false if posix */
+	if (IGNORECASE) {
+		while (l1 > 0) {
+			if (l2 > l1)
+				break;
+			if (! do_single_byte && gawk_mb_cur_max > 1) {
+				const wchar_t *pos;
+
+				pos = wcasestrstr(s1->wstptr, s1->wstlen, s2->wstptr, s2->wstlen);
+				if (pos == NULL)
+					ret = 0;
+				else
+					ret = pos - s1->wstptr + 1;	/* 1-based */
+				goto out;
+			} else {
+				/*
+				 * Could use tolower(*p1) == tolower(*p2) here.
+				 * See discussion in eval.c as to why not.
+				 */
+				if (casetable[(unsigned char)*p1] == casetable[(unsigned char)*p2]
+				    && (l2 == 1 || strncasecmp(p1, p2, l2) == 0)) {
+					ret = 1 + s1->stlen - l1;
+					break;
+				}
+				l1--;
+				p1++;
+			}
+		}
+	} else {
+		while (l1 > 0) {
+			if (l2 > l1)
+				break;
+			if (*p1 == *p2
+			    && (l2 == 1 || (l2 > 0 && memcmp(p1, p2, l2) == 0))) {
+				ret = 1 + s1->stlen - l1;
+				break;
+			}
+			if (! do_single_byte && gawk_mb_cur_max > 1) {
+				const wchar_t *pos;
+
+				pos = wstrstr(s1->wstptr, s1->wstlen, s2->wstptr, s2->wstlen);
+				if (pos == NULL)
+					ret = 0;
+				else
+					ret = pos - s1->wstptr + 1;	/* 1-based */
+				goto out;
+			} else {
+				l1--;
+				p1++;
+			}
+		}
+	}
+out:
+	DEREF(s1);
+	DEREF(s2);
+	return make_number((AWKNUM) ret);
+}
+
+/* double_to_int --- convert double to int, used several places */
+
+double
+double_to_int(double d)
+{
+	if (d >= 0)
+		d = floor(d);
+	else
+		d = ceil(d);
+	return d;
+}
+
+/* do_int --- convert double to int for awk */
+
+NODE *
+do_int(int nargs)
+{
+	NODE *tmp;
+	double d;
+
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+		lintwarn(_("int: received non-numeric argument"));
+	d = force_number(tmp)->numbr;
+	d = double_to_int(d);
+	DEREF(tmp);
+	return make_number((AWKNUM) d);
+}
+
+/* do_isarray --- check if argument is array */
+
+NODE *
+do_isarray(int nargs)
+{
+	NODE *tmp;
+	int ret = 1;
+
+	tmp = POP();
+	if (tmp->type != Node_var_array) {
+		ret = 0;
+		// could be Node_var_new
+		if (tmp->type == Node_val)
+			DEREF(tmp);
+	}
+	return make_number((AWKNUM) ret);
+}
+
+/* do_length --- length of a string, array or $0 */
+
+NODE *
+do_length(int nargs)
+{
+	NODE *tmp;
+	size_t len;
+
+	tmp = POP();
+	if (tmp->type == Node_var_array) {
+		static bool warned = false;
+		unsigned long size;
+
+		if (do_posix)
+			fatal(_("length: received array argument"));
+   		if (do_lint_extensions && ! warned) {
+			warned = true;
+			lintwarn(_("`length(array)' is a gawk extension"));
+		}
+
+		/*
+		 * Support for deferred loading of array elements requires that
+		 * we use the array length interface even though it isn't
+		 * necessary for the built-in array types.
+		 *
+		 * 1/2015: The deferred arrays are gone, but this is probably
+		 * still a good idea.
+		 */
+
+		size = assoc_length(tmp);
+		return make_number(size);
+	}
+
+	assert(tmp->type == Node_val);
+
+	if (do_lint && (fixtype(tmp)->flags & STRING) == 0)
+		lintwarn(_("length: received non-string argument"));
+	tmp = force_string(tmp);
+
+	if (gawk_mb_cur_max > 1) {
+		tmp = force_wstring(tmp);
+		len = tmp->wstlen;
+		/*
+		 * If the bytes don't make a valid wide character
+		 * string, fall back to the bytes themselves.
+		 */
+		 if (len == 0 && tmp->stlen > 0)
+			 len = tmp->stlen;
+	} else
+		len = tmp->stlen;
+
+	DEREF(tmp);
+	return make_number((AWKNUM) len);
+}
+
+/* do_log --- the log function */
+
+NODE *
+do_log(int nargs)
+{
+	NODE *tmp;
+	double d, arg;
+
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+		lintwarn(_("log: received non-numeric argument"));
+	arg = force_number(tmp)->numbr;
+	if (arg < 0.0)
+		warning(_("log: received negative argument %g"), arg);
+	d = log(arg);
+	DEREF(tmp);
+	return make_number((AWKNUM) d);
+}
+
+
+#ifdef HAVE_MPFR
+
+/*
+ * mpz2mpfr --- convert an arbitrary-precision integer to a float
+ *	without any loss of precision. The returned value is only
+ * 	good for temporary use.
+ */
+
+
+static mpfr_ptr
+mpz2mpfr(mpz_ptr zi)
+{
+	size_t prec;
+	static mpfr_t mpfrval;
+	static bool inited = false;
+	int tval;
+
+	/* estimate minimum precision for exact conversion */
+	prec = mpz_sizeinbase(zi, 2);	/* most significant 1 bit position starting at 1 */
+	prec -= (size_t) mpz_scan1(zi, 0);	/* least significant 1 bit index starting at 0 */
+	if (prec < MPFR_PREC_MIN)
+		prec = MPFR_PREC_MIN;
+	else if (prec > MPFR_PREC_MAX)
+		prec = MPFR_PREC_MAX;
+
+	if (! inited) {
+		mpfr_init2(mpfrval, prec);
+		inited = true;
+	} else
+		mpfr_set_prec(mpfrval, prec);
+	tval = mpfr_set_z(mpfrval, zi, ROUND_MODE);
+	IEEE_FMT(mpfrval, tval);
+	return mpfrval;
+}
+#endif
+
+/*
+ * format_tree() formats arguments of sprintf,
+ * and accordingly to a fmt_string providing a format like in
+ * printf family from C library.  Returns a string node which value
+ * is a formatted string.  Called by  sprintf function.
+ *
+ * It is one of the uglier parts of gawk.  Thanks to Michal Jaegermann
+ * for taming this beast and making it compatible with ANSI C.
+ */
+
+NODE *
+format_tree(
+	const char *fmt_string,
+	size_t n0,
+	NODE **the_args,
+	long num_args)
+{
+/* copy 'l' bytes from 's' to 'obufout' checking for space in the process */
+/* difference of pointers should be of ptrdiff_t type, but let us be kind */
+#define bchunk(s, l) if (l) { \
+	while ((l) > ofre) { \
+		size_t olen = obufout - obuf; \
+		erealloc(obuf, char *, osiz * 2, "format_tree"); \
+		ofre += osiz; \
+		osiz *= 2; \
+		obufout = obuf + olen; \
+	} \
+	memcpy(obufout, s, (size_t) (l)); \
+	obufout += (l); \
+	ofre -= (l); \
+}
+
+/* copy one byte from 's' to 'obufout' checking for space in the process */
+#define bchunk_one(s) { \
+	if (ofre < 1) { \
+		size_t olen = obufout - obuf; \
+		erealloc(obuf, char *, osiz * 2, "format_tree"); \
+		ofre += osiz; \
+		osiz *= 2; \
+		obufout = obuf + olen; \
+	} \
+	*obufout++ = *s; \
+	--ofre; \
+}
+
+/* Is there space for something L big in the buffer? */
+#define chksize(l)  if ((l) >= ofre) { \
+	size_t olen = obufout - obuf; \
+	size_t delta = osiz+l-ofre; \
+	erealloc(obuf, char *, osiz + delta, "format_tree"); \
+	obufout = obuf + olen; \
+	ofre += delta; \
+	osiz += delta; \
+}
+
+	size_t cur_arg = 0;
+	NODE *r = NULL;
+	int i, nc;
+	bool toofew = false;
+	char *obuf, *obufout;
+	size_t osiz, ofre, olen_final;
+	const char *chbuf;
+	const char *s0, *s1;
+	int cs1;
+	NODE *arg;
+	long fw, prec, argnum;
+	bool used_dollar;
+	bool lj, alt, big_flag, bigbig_flag, small_flag, have_prec, need_format;
+	long *cur = NULL;
+	uintmax_t uval;
+	bool sgn;
+	int base;
+	/*
+	 * Although this is an array, the elements serve two different
+	 * purposes. The first element is the general buffer meant
+	 * to hold the entire result string.  The second one is a
+	 * temporary buffer for large floating point values. They
+	 * could just as easily be separate variables, and the
+	 * code might arguably be clearer.
+	 */
+	struct {
+		char *buf;
+		size_t bufsize;
+		char stackbuf[30];
+	} cpbufs[2];
+#define cpbuf	cpbufs[0].buf
+	char *cend = &cpbufs[0].stackbuf[sizeof(cpbufs[0].stackbuf)];
+	char *cp;
+	const char *fill;
+	AWKNUM tmpval = 0.0;
+	char signchar = '\0';
+	size_t len;
+	bool zero_flag = false;
+	bool quote_flag = false;
+	int ii, jj;
+	char *chp;
+	size_t copy_count, char_count;
+	char *nan_inf_val;
+	bool magic_posix_flag;
+#ifdef HAVE_MPFR
+	mpz_ptr zi;
+	mpfr_ptr mf;
+#endif
+	enum { MP_NONE = 0, MP_INT_WITH_PREC = 1, MP_INT_WITHOUT_PREC, MP_FLOAT } fmt_type;
+
+	static const char sp[] = " ";
+	static const char zero_string[] = "0";
+	static const char lchbuf[] = "0123456789abcdef";
+	static const char Uchbuf[] = "0123456789ABCDEF";
+
+#define INITIAL_OUT_SIZE	512
+	emalloc(obuf, char *, INITIAL_OUT_SIZE, "format_tree");
+	obufout = obuf;
+	osiz = INITIAL_OUT_SIZE;
+	ofre = osiz - 1;
+
+	cur_arg = 1;
+
+	{
+		size_t k;
+		for (k = 0; k < sizeof(cpbufs)/sizeof(cpbufs[0]); k++) {
+			cpbufs[k].bufsize = sizeof(cpbufs[k].stackbuf);
+			cpbufs[k].buf = cpbufs[k].stackbuf;
+		}
+	}
+
+	/*
+	 * The point of this goop is to grow the buffer
+	 * holding the converted number, so that large
+	 * values don't overflow a fixed length buffer.
+	 */
+#define PREPEND(CH) do {	\
+	if (cp == cpbufs[0].buf) {	\
+		char *prev = cpbufs[0].buf;	\
+		emalloc(cpbufs[0].buf, char *, 2*cpbufs[0].bufsize, \
+		 	"format_tree");	\
+		memcpy((cp = cpbufs[0].buf+cpbufs[0].bufsize), prev,	\
+		       cpbufs[0].bufsize);	\
+		cpbufs[0].bufsize *= 2;	\
+		if (prev != cpbufs[0].stackbuf)	\
+			efree(prev);	\
+		cend = cpbufs[0].buf+cpbufs[0].bufsize;	\
+	}	\
+	*--cp = (CH);	\
+} while(0)
+
+	/*
+	 * Check first for use of `count$'.
+	 * If plain argument retrieval was used earlier, choke.
+	 *	Otherwise, return the requested argument.
+	 * If not `count$' now, but it was used earlier, choke.
+	 * If this format is more than total number of args, choke.
+	 * Otherwise, return the current argument.
+	 */
+#define parse_next_arg() { \
+	if (argnum > 0) { \
+		if (cur_arg > 1) { \
+			msg(_("fatal: must use `count$' on all formats or none")); \
+			goto out; \
+		} \
+		arg = the_args[argnum]; \
+	} else if (used_dollar) { \
+		msg(_("fatal: must use `count$' on all formats or none")); \
+		arg = 0; /* shutup the compiler */ \
+		goto out; \
+	} else if (cur_arg >= num_args) { \
+		arg = 0; /* shutup the compiler */ \
+		toofew = true; \
+		break; \
+	} else { \
+		arg = the_args[cur_arg]; \
+		cur_arg++; \
+	} \
+}
+
+	need_format = false;
+	used_dollar = false;
+
+	s0 = s1 = fmt_string;
+	while (n0-- > 0) {
+		if (*s1 != '%') {
+			s1++;
+			continue;
+		}
+		need_format = true;
+		bchunk(s0, s1 - s0);
+		s0 = s1;
+		cur = &fw;
+		fw = 0;
+		prec = 0;
+		base = 0;
+		argnum = 0;
+		base = 0;
+		have_prec = false;
+		signchar = '\0';
+		zero_flag = false;
+		quote_flag = false;
+		nan_inf_val = NULL;
+#ifdef HAVE_MPFR
+		mf = NULL;
+		zi = NULL;
+#endif
+		fmt_type = MP_NONE;
+
+		lj = alt = big_flag = bigbig_flag = small_flag = false;
+		magic_posix_flag = false;
+		fill = sp;
+		cp = cend;
+		chbuf = lchbuf;
+		s1++;
+
+retry:
+		if (n0-- == 0)	/* ran out early! */
+			break;
+
+		switch (cs1 = *s1++) {
+		case (-1):	/* dummy case to allow for checking */
+check_pos:
+			if (cur != &fw)
+				break;		/* reject as a valid format */
+			goto retry;
+		case '%':
+			need_format = false;
+			/*
+			 * 29 Oct. 2002:
+			 * The C99 standard pages 274 and 279 seem to imply that
+			 * since there's no arg converted, the field width doesn't
+			 * apply.  The code already was that way, but this
+			 * comment documents it, at least in the code.
+			 */
+			if (do_lint) {
+				const char *msg = NULL;
+
+				if (fw && ! have_prec)
+					msg = _("field width is ignored for `%%' specifier");
+				else if (fw == 0 && have_prec)
+					msg = _("precision is ignored for `%%' specifier");
+				else if (fw && have_prec)
+					msg = _("field width and precision are ignored for `%%' specifier");
+
+				if (msg != NULL)
+					lintwarn("%s", msg);
+			}
+			bchunk_one("%");
+			s0 = s1;
+			break;
+
+		case '0':
+			/*
+			 * Only turn on zero_flag if we haven't seen
+			 * the field width or precision yet.  Otherwise,
+			 * screws up floating point formatting.
+			 */
+			if (cur == & fw)
+				zero_flag = true;
+			if (lj)
+				goto retry;
+			/* FALL through */
+		case '1':
+		case '2':
+		case '3':
+		case '4':
+		case '5':
+		case '6':
+		case '7':
+		case '8':
+		case '9':
+			if (cur == NULL)
+				break;
+			if (prec >= 0)
+				*cur = cs1 - '0';
+			/*
+			 * with a negative precision *cur is already set
+			 * to -1, so it will remain negative, but we have
+			 * to "eat" precision digits in any case
+			 */
+			while (n0 > 0 && *s1 >= '0' && *s1 <= '9') {
+				--n0;
+				*cur = *cur * 10 + *s1++ - '0';
+			}
+			if (prec < 0) 	/* negative precision is discarded */
+				have_prec = false;
+			if (cur == &prec)
+				cur = NULL;
+			if (n0 == 0)	/* badly formatted control string */
+				continue;
+			goto retry;
+		case '$':
+			if (do_traditional) {
+				msg(_("fatal: `$' is not permitted in awk formats"));
+				goto out;
+			}
+
+			if (cur == &fw) {
+				argnum = fw;
+				fw = 0;
+				used_dollar = true;
+				if (argnum <= 0) {
+					msg(_("fatal: arg count with `$' must be > 0"));
+					goto out;
+				}
+				if (argnum >= num_args) {
+					msg(_("fatal: arg count %ld greater than total number of supplied arguments"), argnum);
+					goto out;
+				}
+			} else {
+				msg(_("fatal: `$' not permitted after period in format"));
+				goto out;
+			}
+
+			goto retry;
+		case '*':
+			if (cur == NULL)
+				break;
+			if (! do_traditional && used_dollar && ! isdigit((unsigned char) *s1)) {
+				fatal(_("fatal: must use `count$' on all formats or none"));
+				break;	/* silence warnings */
+			} else if (! do_traditional && isdigit((unsigned char) *s1)) {
+				int val = 0;
+
+				for (; n0 > 0 && *s1 && isdigit((unsigned char) *s1); s1++, n0--) {
+					val *= 10;
+					val += *s1 - '0';
+				}
+				if (*s1 != '$') {
+					msg(_("fatal: no `$' supplied for positional field width or precision"));
+					goto out;
+				} else {
+					s1++;
+					n0--;
+				}
+				if (val >= num_args) {
+					toofew = true;
+					break;
+				}
+				arg = the_args[val];
+			} else {
+				parse_next_arg();
+			}
+			(void) force_number(arg);
+			*cur = get_number_si(arg);
+			if (*cur < 0 && cur == &fw) {
+				*cur = -*cur;
+				lj = true;
+			}
+			if (cur == &prec) {
+				if (*cur >= 0)
+					have_prec = true;
+				else
+					have_prec = false;
+				cur = NULL;
+			}
+			goto retry;
+		case ' ':		/* print ' ' or '-' */
+					/* 'space' flag is ignored */
+					/* if '+' already present  */
+			if (signchar != false)
+				goto check_pos;
+			/* FALL THROUGH */
+		case '+':		/* print '+' or '-' */
+			signchar = cs1;
+			goto check_pos;
+		case '-':
+			if (prec < 0)
+				break;
+			if (cur == &prec) {
+				prec = -1;
+				goto retry;
+			}
+			fill = sp;      /* if left justified then other */
+			lj = true;	/* filling is ignored */
+			goto check_pos;
+		case '.':
+			if (cur != &fw)
+				break;
+			cur = &prec;
+			have_prec = true;
+			goto retry;
+		case '#':
+			alt = true;
+			goto check_pos;
+		case '\'':
+#if defined(HAVE_LOCALE_H)
+			quote_flag = true;
+			goto check_pos;
+#else
+			goto retry;
+#endif
+		case 'l':
+			if (big_flag)
+				break;
+			else {
+				static bool warned = false;
+
+				if (do_lint && ! warned) {
+					lintwarn(_("`l' is meaningless in awk formats; ignored"));
+					warned = true;
+				}
+				if (do_posix) {
+					msg(_("fatal: `l' is not permitted in POSIX awk formats"));
+					goto out;
+				}
+			}
+			big_flag = true;
+			goto retry;
+		case 'L':
+			if (bigbig_flag)
+				break;
+			else {
+				static bool warned = false;
+
+				if (do_lint && ! warned) {
+					lintwarn(_("`L' is meaningless in awk formats; ignored"));
+					warned = true;
+				}
+				if (do_posix) {
+					msg(_("fatal: `L' is not permitted in POSIX awk formats"));
+					goto out;
+				}
+			}
+			bigbig_flag = true;
+			goto retry;
+		case 'h':
+			if (small_flag)
+				break;
+			else {
+				static bool warned = false;
+
+				if (do_lint && ! warned) {
+					lintwarn(_("`h' is meaningless in awk formats; ignored"));
+					warned = true;
+				}
+				if (do_posix) {
+					msg(_("fatal: `h' is not permitted in POSIX awk formats"));
+					goto out;
+				}
+			}
+			small_flag = true;
+			goto retry;
+		case 'P':
+			if (magic_posix_flag)
+				break;
+			magic_posix_flag = true;
+			goto retry;
+		case 'c':
+			need_format = false;
+			parse_next_arg();
+			/* user input that looks numeric is numeric */
+			fixtype(arg);
+			if ((arg->flags & NUMBER) != 0) {
+				uval = get_number_uj(arg);
+				if (gawk_mb_cur_max > 1) {
+					char buf[100];
+					wchar_t wc;
+					mbstate_t mbs;
+					size_t count;
+
+					memset(& mbs, 0, sizeof(mbs));
+
+					/* handle systems with too small wchar_t */
+					if (sizeof(wchar_t) < 4 && uval > 0xffff) {
+						if (do_lint)
+							lintwarn(
+						_("[s]printf: value %g is too big for %%c format"),
+									arg->numbr);
+
+						goto out0;
+					}
+
+					wc = uval;
+
+					count = wcrtomb(buf, wc, & mbs);
+					if (count == 0
+					    || count == (size_t) -1) {
+						if (do_lint)
+							lintwarn(
+						_("[s]printf: value %g is not a valid wide character"),
+									arg->numbr);
+
+						goto out0;
+					}
+
+					memcpy(cpbuf, buf, count);
+					prec = count;
+					cp = cpbuf;
+					goto pr_tail;
+				}
+out0:
+				;
+				/* else,
+					fall through */
+
+				cpbuf[0] = uval;
+				prec = 1;
+				cp = cpbuf;
+				goto pr_tail;
+			}
+			/*
+			 * As per POSIX, only output first character of a
+			 * string value.  Thus, we ignore any provided
+			 * precision, forcing it to 1.  (Didn't this
+			 * used to work? 6/2003.)
+			 */
+			cp = arg->stptr;
+			prec = 1;
+			/*
+			 * First character can be multiple bytes if
+			 * it's a multibyte character. Grr.
+			 */
+			if (gawk_mb_cur_max > 1) {
+				mbstate_t state;
+				size_t count;
+
+				memset(& state, 0, sizeof(state));
+				count = mbrlen(cp, arg->stlen, & state);
+				if (count != (size_t) -1 && count != (size_t) -2 && count > 0) {
+					prec = count;
+					/* may need to increase fw so that padding happens, see pr_tail code */
+					if (fw > 0)
+						fw += count - 1;
+				}
+			}
+			goto pr_tail;
+		case 's':
+			need_format = false;
+			parse_next_arg();
+			arg = force_string(arg);
+			if (fw == 0 && ! have_prec)
+				prec = arg->stlen;
+			else {
+				char_count = mbc_char_count(arg->stptr, arg->stlen);
+				if (! have_prec || prec > char_count)
+					prec = char_count;
+			}
+			cp = arg->stptr;
+			goto pr_tail;
+		case 'd':
+		case 'i':
+			need_format = false;
+			parse_next_arg();
+			(void) force_number(arg);
+
+			/*
+			 * Check for Nan or Inf.
+			 */
+			if (out_of_range(arg))
+				goto out_of_range;
+#ifdef HAVE_MPFR
+			if (is_mpg_float(arg))
+				goto mpf0;
+			else if (is_mpg_integer(arg))
+				goto mpz0;
+			else
+#endif
+			tmpval = double_to_int(arg->numbr);
+
+			/*
+			 * ``The result of converting a zero value with a
+			 * precision of zero is no characters.''
+			 */
+			if (have_prec && prec == 0 && tmpval == 0)
+				goto pr_tail;
+
+			if (tmpval < 0) {
+				tmpval = -tmpval;
+				sgn = true;
+			} else {
+				if (tmpval == -0.0)
+					/* avoid printing -0 */
+					tmpval = 0.0;
+				sgn = false;
+			}
+			/*
+			 * Use snprintf return value to tell if there
+			 * is enough room in the buffer or not.
+			 */
+			while ((i = snprintf(cpbufs[1].buf,
+					     cpbufs[1].bufsize, "%.0f",
+					     tmpval)) >=
+			       cpbufs[1].bufsize) {
+				if (cpbufs[1].buf == cpbufs[1].stackbuf)
+					cpbufs[1].buf = NULL;
+				if (i > 0) {
+					cpbufs[1].bufsize += ((i > cpbufs[1].bufsize) ?
+							      i : cpbufs[1].bufsize);
+				}
+				else
+					cpbufs[1].bufsize *= 2;
+				assert(cpbufs[1].bufsize > 0);
+				erealloc(cpbufs[1].buf, char *,
+					 cpbufs[1].bufsize, "format_tree");
+			}
+			if (i < 1)
+				goto out_of_range;
+#if defined(HAVE_LOCALE_H)
+			quote_flag = (quote_flag && loc.thousands_sep[0] != 0);
+#endif
+			chp = &cpbufs[1].buf[i-1];
+			ii = jj = 0;
+			do {
+				PREPEND(*chp);
+				chp--; i--;
+#if defined(HAVE_LOCALE_H)
+				if (quote_flag && loc.grouping[ii] && ++jj == loc.grouping[ii]) {
+					if (i) {	/* only add if more digits coming */
+						int k;
+						const char *ts = loc.thousands_sep;
+
+						for (k = strlen(ts) - 1; k >= 0; k--) {
+							PREPEND(ts[k]);
+						}
+					}
+					if (loc.grouping[ii+1] == 0)
+						jj = 0;		/* keep using current val in loc.grouping[ii] */
+					else if (loc.grouping[ii+1] == CHAR_MAX)
+						quote_flag = false;
+					else {
+						ii++;
+						jj = 0;
+					}
+				}
+#endif
+			} while (i > 0);
+
+			/* add more output digits to match the precision */
+			if (have_prec) {
+				while (cend - cp < prec)
+					PREPEND('0');
+			}
+
+			if (sgn)
+				PREPEND('-');
+			else if (signchar)
+				PREPEND(signchar);
+			/*
+			 * When to fill with zeroes is of course not simple.
+			 * First: No zero fill if left-justifying.
+			 * Next: There seem to be two cases:
+			 * 	A '0' without a precision, e.g. %06d
+			 * 	A precision with no field width, e.g. %.10d
+			 * Any other case, we don't want to fill with zeroes.
+			 */
+			if (! lj
+			    && ((zero_flag && ! have_prec)
+				 || (fw == 0 && have_prec)))
+				fill = zero_string;
+			if (prec > fw)
+				fw = prec;
+			prec = cend - cp;
+			if (fw > prec && ! lj && fill != sp
+			    && (*cp == '-' || signchar)) {
+				bchunk_one(cp);
+				cp++;
+				prec--;
+				fw--;
+			}
+			goto pr_tail;
+		case 'X':
+			chbuf = Uchbuf;	/* FALL THROUGH */
+		case 'x':
+			base += 6;	/* FALL THROUGH */
+		case 'u':
+			base += 2;	/* FALL THROUGH */
+		case 'o':
+			base += 8;
+			need_format = false;
+			parse_next_arg();
+			(void) force_number(arg);
+
+			if (out_of_range(arg))
+				goto out_of_range;
+#ifdef HAVE_MPFR
+			if (is_mpg_integer(arg)) {
+mpz0:
+				zi = arg->mpg_i;
+
+				if (cs1 != 'd' && cs1 != 'i') {
+					if (mpz_sgn(zi) <= 0) {
+						/*
+						 * Negative value or 0 requires special handling.
+						 * Unlike MPFR, GMP does not allow conversion
+						 * to (u)intmax_t. So we first convert GMP type to
+						 * a MPFR type.
+						 */
+						mf = mpz2mpfr(zi);
+						goto mpf1;
+					}
+					signchar = '\0';	/* Don't print '+' */
+				}
+
+				/* See comments above about when to fill with zeros */
+				zero_flag = (! lj
+						    && ((zero_flag && ! have_prec)
+							 || (fw == 0 && have_prec)));
+
+ 				fmt_type = have_prec ? MP_INT_WITH_PREC : MP_INT_WITHOUT_PREC;
+				goto fmt0;
+
+			} else if (is_mpg_float(arg)) {
+mpf0:
+				mf = arg->mpg_numbr;
+				if (! mpfr_number_p(mf)) {
+					/* inf or NaN */
+					cs1 = 'g';
+					fmt_type = MP_FLOAT;
+					goto fmt1;
+				}
+
+				if (cs1 != 'd' && cs1 != 'i') {
+mpf1:
+					/*
+					 * The output of printf("%#.0x", 0) is 0 instead of 0x, hence <= in
+					 * the comparison below.
+					 */
+					if (mpfr_sgn(mf) <= 0) {
+						if (! mpfr_fits_intmax_p(mf, ROUND_MODE)) {
+							/* -ve number is too large */
+							cs1 = 'g';
+							fmt_type = MP_FLOAT;
+							goto fmt1;
+						}
+
+						tmpval = uval = (uintmax_t) mpfr_get_sj(mf, ROUND_MODE);
+						if (! alt && have_prec && prec == 0 && tmpval == 0)
+							goto pr_tail;	/* printf("%.0x", 0) is no characters */
+						goto int0;
+					}
+					signchar = '\0';	/* Don't print '+' */
+				}
+
+				/* See comments above about when to fill with zeros */
+				zero_flag = (! lj
+						    && ((zero_flag && ! have_prec)
+							 || (fw == 0 && have_prec)));
+
+				(void) mpfr_get_z(mpzval, mf, MPFR_RNDZ);	/* convert to GMP integer */
+ 				fmt_type = have_prec ? MP_INT_WITH_PREC : MP_INT_WITHOUT_PREC;
+				zi = mpzval;
+				goto fmt0;
+			} else
+#endif
+				tmpval = arg->numbr;
+
+			/*
+			 * ``The result of converting a zero value with a
+			 * precision of zero is no characters.''
+			 *
+			 * If I remember the ANSI C standard, though,
+			 * it says that for octal conversions
+			 * the precision is artificially increased
+			 * to add an extra 0 if # is supplied.
+			 * Indeed, in C,
+			 * 	printf("%#.0o\n", 0);
+			 * prints a single 0.
+			 */
+			if (! alt && have_prec && prec == 0 && tmpval == 0)
+				goto pr_tail;
+
+			if (tmpval < 0) {
+				uval = (uintmax_t) (intmax_t) tmpval;
+				if ((AWKNUM)(intmax_t)uval != double_to_int(tmpval))
+					goto out_of_range;
+			} else {
+				uval = (uintmax_t) tmpval;
+				if ((AWKNUM)uval != double_to_int(tmpval))
+					goto out_of_range;
+			}
+#ifdef HAVE_MPFR
+	int0:
+#endif
+#if defined(HAVE_LOCALE_H)
+			quote_flag = (quote_flag && loc.thousands_sep[0] != 0);
+#endif
+			/*
+			 * When to fill with zeroes is of course not simple.
+			 * First: No zero fill if left-justifying.
+			 * Next: There seem to be two cases:
+			 * 	A '0' without a precision, e.g. %06d
+			 * 	A precision with no field width, e.g. %.10d
+			 * Any other case, we don't want to fill with zeroes.
+			 */
+			if (! lj
+			    && ((zero_flag && ! have_prec)
+				 || (fw == 0 && have_prec)))
+				fill = zero_string;
+			ii = jj = 0;
+			do {
+				PREPEND(chbuf[uval % base]);
+				uval /= base;
+#if defined(HAVE_LOCALE_H)
+				if (base == 10 && quote_flag && loc.grouping[ii] && ++jj == loc.grouping[ii]) {
+					if (uval) {	/* only add if more digits coming */
+						int k;
+						const char *ts = loc.thousands_sep;
+
+						for (k = strlen(ts) - 1; k >= 0; k--) {
+							PREPEND(ts[k]);
+						}
+					}
+					if (loc.grouping[ii+1] == 0)
+						jj = 0;     /* keep using current val in loc.grouping[ii] */
+					else if (loc.grouping[ii+1] == CHAR_MAX)
+						quote_flag = false;
+					else {
+						ii++;
+						jj = 0;
+					}
+				}
+#endif
+			} while (uval > 0);
+
+			/* add more output digits to match the precision */
+			if (have_prec) {
+				while (cend - cp < prec)
+					PREPEND('0');
+			}
+
+			if (alt && tmpval != 0) {
+				if (base == 16) {
+					PREPEND(cs1);
+					PREPEND('0');
+					if (fill != sp) {
+						bchunk(cp, 2);
+						cp += 2;
+						fw -= 2;
+					}
+				} else if (base == 8)
+					PREPEND('0');
+			}
+			base = 0;
+			if (prec > fw)
+				fw = prec;
+			prec = cend - cp;
+	pr_tail:
+			if (! lj) {
+				while (fw > prec) {
+			    		bchunk_one(fill);
+					fw--;
+				}
+			}
+			copy_count = prec;
+			if (fw == 0 && ! have_prec)
+				;
+			else if (gawk_mb_cur_max > 1) {
+				if (cs1 == 's') {
+					assert(cp == arg->stptr || cp == cpbuf);
+					copy_count = mbc_byte_count(arg->stptr, prec);
+				}
+				/* prec was set by code for %c */
+				/* else
+					copy_count = prec; */
+			}
+			bchunk(cp, copy_count);
+			while (fw > prec) {
+				bchunk_one(fill);
+				fw--;
+			}
+			s0 = s1;
+			break;
+
+     out_of_range:
+			/*
+			 * out of range - emergency use of %g format,
+			 * or format NaN and INF values.
+			 */
+			nan_inf_val = format_nan_inf(arg, cs1);
+			if (do_posix || magic_posix_flag || nan_inf_val == NULL) {
+				if (do_lint && ! do_posix && ! magic_posix_flag)
+					lintwarn(_("[s]printf: value %g is out of range for `%%%c' format"),
+								(double) tmpval, cs1);
+				tmpval = arg->numbr;
+				if (strchr("aAeEfFgG", cs1) == NULL)
+					cs1 = 'g';
+				goto fmt1;
+			} else {
+				if (do_lint)
+					lintwarn(_("[s]printf: value %s is out of range for `%%%c' format"),
+								nan_inf_val, cs1);
+				bchunk(nan_inf_val, strlen(nan_inf_val));
+				s0 = s1;
+				break;
+			}
+
+		case 'F':
+#if ! defined(PRINTF_HAS_F_FORMAT) || PRINTF_HAS_F_FORMAT != 1
+			cs1 = 'f';
+			/* FALL THROUGH */
+#endif
+		case 'g':
+		case 'G':
+		case 'e':
+		case 'f':
+		case 'E':
+#if defined(PRINTF_HAS_A_FORMAT) && PRINTF_HAS_A_FORMAT == 1
+		case 'A':
+		case 'a':
+		{
+			static bool warned = false;
+
+			if (do_lint && tolower(cs1) == 'a' && ! warned) {
+				warned = true;
+				lintwarn(_("%%%c format is POSIX standard but not portable to other awks"), cs1);
+			}
+		}
+#endif
+			need_format = false;
+			parse_next_arg();
+			(void) force_number(arg);
+
+			if (! is_mpg_number(arg))
+				tmpval = arg->numbr;
+#ifdef HAVE_MPFR
+			else if (is_mpg_float(arg)) {
+				mf = arg->mpg_numbr;
+				fmt_type = MP_FLOAT;
+			} else {
+				/* arbitrary-precision integer, convert to MPFR float */
+				assert(mf == NULL);
+				mf = mpz2mpfr(arg->mpg_i);
+				fmt_type = MP_FLOAT;
+			}
+#endif
+			if (out_of_range(arg))
+				goto out_of_range;
+
+     fmt1:
+			if (! have_prec)
+				prec = DEFAULT_G_PRECISION;
+#ifdef HAVE_MPFR
+     fmt0:
+#endif
+			chksize(fw + prec + 11);	/* 11 == slop */
+			cp = cpbuf;
+			*cp++ = '%';
+			if (lj)
+				*cp++ = '-';
+			if (signchar)
+				*cp++ = signchar;
+			if (alt)
+				*cp++ = '#';
+			if (zero_flag)
+				*cp++ = '0';
+			if (quote_flag)
+				*cp++ = '\'';
+
+#if defined(LC_NUMERIC)
+			if (quote_flag && ! use_lc_numeric)
+				setlocale(LC_NUMERIC, "");
+#endif
+
+			switch (fmt_type) {
+#ifdef HAVE_MPFR
+			case MP_INT_WITH_PREC:
+				sprintf(cp, "*.*Z%c", cs1);
+				while ((nc = mpfr_snprintf(obufout, ofre, cpbuf,
+					     (int) fw, (int) prec, zi)) >= ofre)
+					chksize(nc)
+				break;
+			case MP_INT_WITHOUT_PREC:
+				sprintf(cp, "*Z%c", cs1);
+				while ((nc = mpfr_snprintf(obufout, ofre, cpbuf,
+					     (int) fw, zi)) >= ofre)
+					chksize(nc)
+				break;
+			case MP_FLOAT:
+				sprintf(cp, "*.*R*%c", cs1);
+				while ((nc = mpfr_snprintf(obufout, ofre, cpbuf,
+					     (int) fw, (int) prec, ROUND_MODE, mf)) >= ofre)
+					chksize(nc)
+				break;
+#endif
+			default:
+				if (have_prec || tolower(cs1) != 'a') {
+					sprintf(cp, "*.*%c", cs1);
+					while ((nc = snprintf(obufout, ofre, cpbuf,
+						     (int) fw, (int) prec,
+						     (double) tmpval)) >= ofre)
+						chksize(nc)
+				} else {
+					// For %a and %A, use the default precision if it
+					// wasn't supplied by the user.
+					sprintf(cp, "*%c", cs1);
+					while ((nc = snprintf(obufout, ofre, cpbuf,
+						     (int) fw,
+						     (double) tmpval)) >= ofre)
+						chksize(nc)
+				}
+			}
+
+#if defined(LC_NUMERIC)
+			if (quote_flag && ! use_lc_numeric)
+				setlocale(LC_NUMERIC, "C");
+#endif
+
+			len = strlen(obufout);
+			ofre -= len;
+			obufout += len;
+			s0 = s1;
+			break;
+		default:
+			if (do_lint && is_alpha(cs1))
+				lintwarn(_("ignoring unknown format specifier character `%c': no argument converted"), cs1);
+			break;
+		}
+		if (toofew) {
+			msg("%s\n\t`%s'\n\t%*s%s",
+			      _("fatal: not enough arguments to satisfy format string"),
+			      fmt_string, (int) (s1 - fmt_string - 1), "",
+			      _("^ ran out for this one"));
+			goto out;
+		}
+	}
+	if (do_lint) {
+		if (need_format)
+			lintwarn(
+			_("[s]printf: format specifier does not have control letter"));
+		if (cur_arg < num_args)
+			lintwarn(
+			_("too many arguments supplied for format string"));
+	}
+	bchunk(s0, s1 - s0);
+	olen_final = obufout - obuf;
+	if (ofre > 0)
+		erealloc(obuf, char *, olen_final + 1, "format_tree");
+	r = make_str_node(obuf, olen_final, ALREADY_MALLOCED);
+	obuf = NULL;
+out:
+	{
+		size_t k;
+		size_t count = sizeof(cpbufs)/sizeof(cpbufs[0]);
+		for (k = 0; k < count; k++) {
+			if (cpbufs[k].buf != cpbufs[k].stackbuf)
+				efree(cpbufs[k].buf);
+		}
+		if (obuf != NULL)
+			efree(obuf);
+	}
+
+	if (r == NULL)
+		gawk_exit(EXIT_FATAL);
+	return r;
+}
+
+
+/* printf_common --- common code for sprintf and printf */
+
+static NODE *
+printf_common(int nargs)
+{
+	int i;
+	NODE *r, *tmp;
+
+	assert(nargs > 0 && nargs <= max_args);
+	for (i = 1; i <= nargs; i++) {
+		tmp = args_array[nargs - i] = POP();
+		if (tmp->type == Node_var_array) {
+			while (--i > 0)
+				DEREF(args_array[nargs - i]);
+			fatal(_("attempt to use array `%s' in a scalar context"), array_vname(tmp));
+		}
+	}
+
+	args_array[0] = force_string(args_array[0]);
+	r = format_tree(args_array[0]->stptr, args_array[0]->stlen, args_array, nargs);
+	for (i = 0; i < nargs; i++)
+		DEREF(args_array[i]);
+	return r;
+}
+
+/* do_sprintf --- perform sprintf */
+
+NODE *
+do_sprintf(int nargs)
+{
+	NODE *r;
+
+	if (nargs == 0)
+		fatal(_("sprintf: no arguments"));
+
+	r = printf_common(nargs);
+	if (r == NULL)
+		gawk_exit(EXIT_FATAL);
+	return r;
+}
+
+
+/* do_printf --- perform printf, including redirection */
+
+void
+do_printf(int nargs, int redirtype)
+{
+	FILE *fp = NULL;
+	NODE *tmp;
+	struct redirect *rp = NULL;
+	int errflg = 0;
+	NODE *redir_exp = NULL;
+
+	if (nargs == 0) {
+		if (do_traditional) {
+			if (do_lint)
+				lintwarn(_("printf: no arguments"));
+			if (redirtype != 0) {
+				redir_exp = TOP();
+				if (redir_exp->type != Node_val)
+					fatal(_("attempt to use array `%s' in a scalar context"), array_vname(redir_exp));
+				rp = redirect(redir_exp, redirtype, & errflg, true);
+				DEREF(redir_exp);
+				decr_sp();
+			}
+			return;	/* bwk accepts it silently */
+		}
+		fatal(_("printf: no arguments"));
+	}
+
+	if (redirtype != 0) {
+		redir_exp = PEEK(nargs);
+		if (redir_exp->type != Node_val)
+			fatal(_("attempt to use array `%s' in a scalar context"), array_vname(redir_exp));
+		rp = redirect(redir_exp, redirtype, & errflg, true);
+		if (rp != NULL) {
+			if ((rp->flag & RED_TWOWAY) != 0 && rp->output.fp == NULL) {
+				if (is_non_fatal_redirect(redir_exp->stptr, redir_exp->stlen)) {
+					update_ERRNO_int(EBADF);
+					return;
+				}
+				(void) close_rp(rp, CLOSE_ALL);
+				fatal(_("printf: attempt to write to closed write end of two-way pipe"));
+			}
+			fp = rp->output.fp;
+		}
+		else if (errflg) {
+			update_ERRNO_int(errflg);
+			return;
+		}
+	} else if (do_debug)	/* only the debugger can change the default output */
+		fp = output_fp;
+	else
+		fp = stdout;
+
+	tmp = printf_common(nargs);
+	if (redir_exp != NULL) {
+		DEREF(redir_exp);
+		decr_sp();
+	}
+	if (tmp != NULL) {
+		if (fp == NULL) {
+			DEREF(tmp);
+			return;
+		}
+		efwrite(tmp->stptr, sizeof(char), tmp->stlen, fp, "printf", rp, true);
+		if (rp != NULL && (rp->flag & RED_TWOWAY) != 0)
+			rp->output.gawk_fflush(rp->output.fp, rp->output.opaque);
+		DEREF(tmp);
+	} else
+		gawk_exit(EXIT_FATAL);
+}
+
+/* do_sqrt --- do the sqrt function */
+
+NODE *
+do_sqrt(int nargs)
+{
+	NODE *tmp;
+	double arg;
+
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+		lintwarn(_("sqrt: received non-numeric argument"));
+	arg = (double) force_number(tmp)->numbr;
+	DEREF(tmp);
+	if (arg < 0.0)
+		warning(_("sqrt: called with negative argument %g"), arg);
+	return make_number((AWKNUM) sqrt(arg));
+}
+
+/* do_substr --- do the substr function */
+
+NODE *
+do_substr(int nargs)
+{
+	NODE *t1;
+	NODE *r;
+	size_t indx;
+	size_t length = 0;
+	double d_index = 0, d_length = 0;
+	size_t src_len;
+
+	if (nargs == 3) {
+		t1 = POP_NUMBER();
+		d_length = get_number_d(t1);
+		DEREF(t1);
+	}
+
+	t1 = POP_NUMBER();
+	d_index = get_number_d(t1);
+	DEREF(t1);
+
+	t1 = POP_STRING();
+
+	if (nargs == 3) {
+		if (! (d_length >= 1)) {
+			if (do_lint == DO_LINT_ALL)
+				lintwarn(_("substr: length %g is not >= 1"), d_length);
+			else if (do_lint == DO_LINT_INVALID && ! (d_length >= 0))
+				lintwarn(_("substr: length %g is not >= 0"), d_length);
+			DEREF(t1);
+			/*
+			 * Return explicit null string instead of doing
+			 * dupnode(Nnull_string) so that if the result
+			 * is checked with the combination of length()
+			 * and lint, no error is reported about using
+			 * an uninitialized value. Same thing later, too.
+			 */
+			return make_string("", 0);
+		}
+		if (do_lint) {
+			if (double_to_int(d_length) != d_length)
+				lintwarn(
+			_("substr: non-integer length %g will be truncated"),
+					d_length);
+
+			if (d_length > SIZE_MAX)
+				lintwarn(
+			_("substr: length %g too big for string indexing, truncating to %g"),
+					d_length, (double) SIZE_MAX);
+		}
+		if (d_length < SIZE_MAX)
+			length = d_length;
+		else
+			length = SIZE_MAX;
+	}
+
+	/* the weird `! (foo)' tests help catch NaN values. */
+	if (! (d_index >= 1)) {
+		if (do_lint)
+			lintwarn(_("substr: start index %g is invalid, using 1"),
+				 d_index);
+		d_index = 1;
+	}
+	if (do_lint && double_to_int(d_index) != d_index)
+		lintwarn(_("substr: non-integer start index %g will be truncated"),
+			 d_index);
+
+	/* awk indices are from 1, C's are from 0 */
+	if (d_index <= SIZE_MAX)
+		indx = d_index - 1;
+	else
+		indx = SIZE_MAX;
+
+	if (nargs == 2) {	/* third arg. missing */
+		/* use remainder of string */
+		length = t1->stlen - indx;	/* default to bytes */
+		if (gawk_mb_cur_max > 1) {
+			t1 = force_wstring(t1);
+			if (t1->wstlen > 0)	/* use length of wide char string if we have one */
+				length = t1->wstlen - indx;
+		}
+		d_length = length;	/* set here in case used in diagnostics, below */
+	}
+
+	if (t1->stlen == 0) {
+		/* substr("", 1, 0) produces a warning only if LINT_ALL */
+		if (do_lint && (do_lint == DO_LINT_ALL || ((indx | length) != 0)))
+			lintwarn(_("substr: source string is zero length"));
+		DEREF(t1);
+		return make_string("", 0);
+	}
+
+	/* get total len of input string, for following checks */
+	if (gawk_mb_cur_max > 1) {
+		t1 = force_wstring(t1);
+		src_len = t1->wstlen;
+	} else
+		src_len = t1->stlen;
+
+	if (indx >= src_len) {
+		if (do_lint)
+			lintwarn(_("substr: start index %g is past end of string"),
+				d_index);
+		DEREF(t1);
+		return make_string("", 0);
+	}
+	if (length > src_len - indx) {
+		if (do_lint)
+			lintwarn(
+	_("substr: length %g at start index %g exceeds length of first argument (%lu)"),
+			d_length, d_index, (unsigned long int) src_len);
+		length = src_len - indx;
+	}
+
+	/* force_wstring() already called */
+	if (gawk_mb_cur_max == 1 || t1->wstlen == t1->stlen)
+		/* single byte case */
+		r = make_string(t1->stptr + indx, length);
+	else {
+		/* multibyte case, more work */
+		size_t result;
+		wchar_t *wp;
+		mbstate_t mbs;
+		char *substr, *cp;
+
+		/*
+		 * Convert the wide chars in t1->wstptr back into m.b. chars.
+		 * This is pretty grotty, but it's the most straightforward
+		 * way to do things.
+		 */
+		memset(& mbs, 0, sizeof(mbs));
+		emalloc(substr, char *, (length * gawk_mb_cur_max) + 1, "do_substr");
+		wp = t1->wstptr + indx;
+		for (cp = substr; length > 0; length--) {
+			result = wcrtomb(cp, *wp, & mbs);
+			if (result == (size_t) -1)	/* what to do? break seems best */
+				break;
+			cp += result;
+			wp++;
+		}
+		*cp = '\0';
+		r = make_str_node(substr, cp - substr, ALREADY_MALLOCED);
+	}
+
+	DEREF(t1);
+	return r;
+}
+
+/* do_strftime --- format a time stamp */
+
+NODE *
+do_strftime(int nargs)
+{
+	NODE *t1, *t2, *t3, *ret;
+	struct tm *tm;
+	time_t fclock;
+	double clock_val;
+	char *bufp;
+	size_t buflen, bufsize;
+	char buf[BUFSIZ];
+	const char *format;
+	int formatlen;
+	bool do_gmt;
+	NODE *val = NULL;
+	NODE *sub = NULL;
+	char save = '\0';	// initialize to avoid compiler warnings
+	static const time_t time_t_min = TYPE_MINIMUM(time_t);
+	static const time_t time_t_max = TYPE_MAXIMUM(time_t);
+
+	/* set defaults first */
+	format = def_strftime_format;	/* traditional date format */
+	formatlen = strlen(format);
+	(void) time(& fclock);	/* current time of day */
+	do_gmt = false;
+
+	if (PROCINFO_node != NULL) {
+		sub = make_string("strftime", 8);
+		val = in_array(PROCINFO_node, sub);
+		unref(sub);
+
+		if (val != NULL) {
+			if (do_lint && (fixtype(val)->flags & STRING) == 0)
+				lintwarn(_("strftime: format value in PROCINFO[\"strftime\"] has numeric type"));
+			val = force_string(val);
+			format = val->stptr;
+			formatlen = val->stlen;
+		}
+	}
+
+	t1 = t2 = t3 = NULL;
+	if (nargs > 0) {	/* have args */
+		NODE *tmp;
+
+		if (nargs == 3) {
+			t3 = POP_SCALAR();
+			do_gmt = boolval(t3);
+			DEREF(t3);
+		}
+
+		if (nargs >= 2) {
+			t2 = POP_SCALAR();
+			if (do_lint && (fixtype(t2)->flags & NUMBER) == 0)
+				lintwarn(_("strftime: received non-numeric second argument"));
+			(void) force_number(t2);
+			clock_val = get_number_d(t2);
+			fclock = (time_t) clock_val;
+			/*
+			 * Protect against negative value being assigned
+			 * to unsigned time_t.
+			 */
+			if (clock_val < 0 && fclock > 0) {
+				if (do_lint)
+					lintwarn(_("strftime: second argument less than 0 or too big for time_t"));
+				return make_string("", 0);
+			}
+
+			/* And check that the value is in range */
+			if (clock_val < time_t_min || clock_val > time_t_max) {
+				if (do_lint)
+					lintwarn(_("strftime: second argument out of range for time_t"));
+				return make_string("", 0);
+			}
+
+			DEREF(t2);
+		}
+
+		tmp = POP_SCALAR();
+		if (do_lint && (fixtype(tmp)->flags & STRING) == 0)
+			lintwarn(_("strftime: received non-string first argument"));
+
+		t1 = force_string(tmp);
+		format = t1->stptr;
+		formatlen = t1->stlen;
+		if (formatlen == 0) {
+			if (do_lint)
+				lintwarn(_("strftime: received empty format string"));
+			DEREF(t1);
+			return make_string("", 0);
+		}
+		str_terminate(t1, save);
+	}
+
+	if (do_gmt)
+		tm = gmtime(& fclock);
+	else
+		tm = localtime(& fclock);
+
+	if (tm == NULL) {
+		ret = make_string("", 0);
+		goto done;
+	}
+
+	bufp = buf;
+	bufsize = sizeof(buf);
+	for (;;) {
+		*bufp = '\0';
+		buflen = strftime(bufp, bufsize, format, tm);
+		/*
+		 * buflen can be zero EITHER because there's not enough
+		 * room in the string, or because the control command
+		 * goes to the empty string. Make a reasonable guess that
+		 * if the buffer is 1024 times bigger than the length of the
+		 * format string, it's not failing for lack of room.
+		 * Thanks to Paul Eggert for pointing out this issue.
+		 */
+		if (buflen > 0 || bufsize >= 1024 * formatlen)
+			break;
+		bufsize *= 2;
+		if (bufp == buf)
+			emalloc(bufp, char *, bufsize, "do_strftime");
+		else
+			erealloc(bufp, char *, bufsize, "do_strftime");
+	}
+	ret = make_string(bufp, buflen);
+	if (bufp != buf)
+		efree(bufp);
+done:
+	if (t1) {
+		str_restore(t1, save);
+		DEREF(t1);
+	}
+	return ret;
+}
+
+/* do_systime --- get the time of day */
+
+NODE *
+do_systime(int nargs ATTRIBUTE_UNUSED)
+{
+	time_t lclock;
+
+	(void) time(& lclock);
+	return make_number((AWKNUM) lclock);
+}
+
+/* do_mktime --- turn a time string into a timestamp */
+
+NODE *
+do_mktime(int nargs)
+{
+	NODE *t1, *t2;
+	struct tm then;
+	long year;
+	int month, day, hour, minute, second, count;
+	int dst = -1; /* default is unknown */
+	time_t then_stamp;
+	char save;
+	bool do_gmt;
+
+	if (nargs == 2) {
+		t2 = POP_SCALAR();
+		do_gmt = boolval(t2);
+		DEREF(t2);
+	}
+	else
+		do_gmt = false;
+	t1 = POP_SCALAR();
+	if (do_lint && (fixtype(t1)->flags & STRING) == 0)
+		lintwarn(_("mktime: received non-string argument"));
+	t1 = force_string(t1);
+
+	save = t1->stptr[t1->stlen];
+	t1->stptr[t1->stlen] = '\0';
+
+	count = sscanf(t1->stptr, "%ld %d %d %d %d %d %d",
+		        & year, & month, & day,
+			& hour, & minute, & second,
+		        & dst);
+
+	if (   do_lint /* Ready? Set! Go: */
+	    && (   (second < 0 || second > 60)
+		|| (minute < 0 || minute > 59)
+		|| (hour < 0 || hour > 23) /* FIXME ISO 8601 allows 24 ? */
+		|| (day < 1 || day > 31)
+		|| (month < 1 || month > 12) ))
+			lintwarn(_("mktime: at least one of the values is out of the default range"));
+
+	t1->stptr[t1->stlen] = save;
+	DEREF(t1);
+
+	if (count < 6
+	    || month == INT_MIN
+	    || year < INT_MIN + 1900
+	    || year - 1900 > INT_MAX)
+		return make_number((AWKNUM) -1);
+
+	memset(& then, '\0', sizeof(then));
+	then.tm_sec = second;
+	then.tm_min = minute;
+	then.tm_hour = hour;
+	then.tm_mday = day;
+	then.tm_mon = month - 1;
+	then.tm_year = year - 1900;
+	then.tm_isdst = dst;
+
+	then_stamp = (do_gmt ? timegm(& then) : mktime(& then));
+	return make_number((AWKNUM) then_stamp);
+}
+
+/* do_system --- run an external command */
+
+NODE *
+do_system(int nargs)
+{
+	NODE *tmp;
+	AWKNUM ret = 0;		/* floating point on purpose, compat Unix awk */
+	char *cmd;
+	char save;
+	int status;
+
+	if (do_sandbox)
+		fatal(_("'system' function not allowed in sandbox mode"));
+
+	(void) flush_io();     /* so output is synchronous with gawk's */
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & STRING) == 0)
+		lintwarn(_("system: received non-string argument"));
+	cmd = force_string(tmp)->stptr;
+
+	if (cmd && *cmd) {
+		/* insure arg to system is zero-terminated */
+		save = cmd[tmp->stlen];
+		cmd[tmp->stlen] = '\0';
+
+		os_restore_mode(fileno(stdin));
+		set_sigpipe_to_default();
+
+		status = system(cmd);
+		/*
+		 * 3/2016. What to do with ret? It's never simple.
+		 * POSIX says to use the full return value. BWK awk
+		 * divides the result by 256.  That normally gives the
+		 * exit status but gives a weird result for death-by-signal.
+		 * So we compromise as follows:
+		 */
+		ret = status;
+		if (status != -1) {
+			if (do_posix)
+				;	/* leave it alone, full 16 bits */
+			else if (do_traditional)
+#ifdef __MINGW32__
+				ret = (((unsigned)status) & ~0xC0000000);
+#else
+				ret = (status / 256.0);
+#endif
+			else
+				ret = sanitize_exit_status(status);
+		}
+
+		if ((BINMODE & BINMODE_INPUT) != 0)
+			os_setbinmode(fileno(stdin), O_BINARY);
+		ignore_sigpipe();
+
+		cmd[tmp->stlen] = save;
+	}
+	DEREF(tmp);
+	return make_number((AWKNUM) ret);
+}
+
+/* do_print --- print items, separated by OFS, terminated with ORS */
+
+void
+do_print(int nargs, int redirtype)
+{
+	struct redirect *rp = NULL;
+	int errflg = 0;
+	FILE *fp = NULL;
+	int i;
+	NODE *redir_exp = NULL;
+	NODE *tmp = NULL;
+
+	assert(nargs <= max_args);
+
+	if (redirtype != 0) {
+		redir_exp = PEEK(nargs);
+		if (redir_exp->type != Node_val)
+			fatal(_("attempt to use array `%s' in a scalar context"), array_vname(redir_exp));
+		rp = redirect(redir_exp, redirtype, & errflg, true);
+		if (rp != NULL) {
+			if ((rp->flag & RED_TWOWAY) != 0 && rp->output.fp == NULL) {
+				if (is_non_fatal_redirect(redir_exp->stptr, redir_exp->stlen)) {
+					update_ERRNO_int(EBADF);
+					return;
+				}
+				(void) close_rp(rp, CLOSE_ALL);
+				fatal(_("print: attempt to write to closed write end of two-way pipe"));
+			}
+			fp = rp->output.fp;
+		}
+		else if (errflg) {
+			update_ERRNO_int(errflg);
+			return;
+		}
+	} else if (do_debug)	/* only the debugger can change the default output */
+		fp = output_fp;
+	else
+		fp = stdout;
+
+	for (i = 1; i <= nargs; i++) {
+		tmp = args_array[i] = POP();
+		if (tmp->type == Node_var_array) {
+			while (--i > 0)
+				DEREF(args_array[i]);
+			fatal(_("attempt to use array `%s' in a scalar context"), array_vname(tmp));
+		}
+		// Let force_string_ofmt handle checking if things
+		// are already valid.
+		args_array[i] = force_string_ofmt(tmp);
+	}
+
+	if (redir_exp != NULL) {
+		DEREF(redir_exp);
+		decr_sp();
+	}
+
+	if (fp == NULL) {
+		for (i = nargs; i > 0; i--)
+			DEREF(args_array[i]);
+		return;
+	}
+
+	for (i = nargs; i > 0; i--) {
+		efwrite(args_array[i]->stptr, sizeof(char), args_array[i]->stlen, fp, "print", rp, false);
+		DEREF(args_array[i]);
+		if (i != 1 && OFSlen > 0)
+			efwrite(OFS, sizeof(char), (size_t) OFSlen,
+				fp, "print", rp, false);
+
+	}
+	if (ORSlen > 0)
+		efwrite(ORS, sizeof(char), (size_t) ORSlen, fp, "print", rp, true);
+
+	if (rp != NULL && (rp->flag & RED_TWOWAY) != 0)
+		rp->output.gawk_fflush(rp->output.fp, rp->output.opaque);
+}
+
+/* do_print_rec --- special case printing of $0, for speed */
+
+void
+do_print_rec(int nargs, int redirtype)
+{
+	FILE *fp = NULL;
+	NODE *f0;
+	struct redirect *rp = NULL;
+	int errflg = 0;
+	NODE *redir_exp = NULL;
+
+	assert(nargs == 0);
+	if (redirtype != 0) {
+		redir_exp = TOP();
+		rp = redirect(redir_exp, redirtype, & errflg, true);
+		if (rp != NULL) {
+			if ((rp->flag & RED_TWOWAY) != 0 && rp->output.fp == NULL) {
+				if (is_non_fatal_redirect(redir_exp->stptr, redir_exp->stlen)) {
+					update_ERRNO_int(EBADF);
+					return;
+				}
+				(void) close_rp(rp, CLOSE_ALL);
+				fatal(_("print: attempt to write to closed write end of two-way pipe"));
+			}
+			fp = rp->output.fp;
+		}
+		DEREF(redir_exp);
+		decr_sp();
+	} else
+		fp = output_fp;
+
+	if (errflg) {
+		update_ERRNO_int(errflg);
+		return;
+	}
+
+	if (fp == NULL)
+		return;
+
+	if (! field0_valid || do_lint)	// lint check for field access in END
+		(void) get_field(0L, NULL);
+
+	f0 = fields_arr[0];
+
+	if (do_lint && (f0->flags & NULL_FIELD) != 0)
+		lintwarn(_("reference to uninitialized field `$%d'"), 0);
+
+	efwrite(f0->stptr, sizeof(char), f0->stlen, fp, "print", rp, false);
+
+	if (ORSlen > 0)
+		efwrite(ORS, sizeof(char), (size_t) ORSlen, fp, "print", rp, true);
+
+	if (rp != NULL && (rp->flag & RED_TWOWAY) != 0)
+		rp->output.gawk_fflush(rp->output.fp, rp->output.opaque);
+}
+
+
+/* is_wupper --- function version of iswupper for passing function pointers */
+
+static int
+is_wupper(wchar_t c)
+{
+	return iswupper(c);
+}
+
+/* is_wlower --- function version of iswlower for passing function pointers */
+
+static int
+is_wlower(wchar_t c)
+{
+	return iswlower(c);
+}
+
+/* to_wupper --- function version of towupper for passing function pointers */
+
+static int
+to_wlower(wchar_t c)
+{
+	return towlower(c);
+}
+
+/* to_wlower --- function version of towlower for passing function pointers */
+
+static int
+to_wupper(wchar_t c)
+{
+	return towupper(c);
+}
+
+/* wide_change_case --- generic case converter for wide characters */
+
+static void
+wide_change_case(wchar_t *wstr,
+			size_t wlen,
+			int (*is_x)(wchar_t c),
+			int (*to_y)(wchar_t c))
+{
+	size_t i;
+	wchar_t *wcp;
+
+	for (i = 0, wcp = wstr; i < wlen; i++, wcp++)
+		if (is_x(*wcp))
+			*wcp = to_y(*wcp);
+}
+
+/* wide_toupper --- map a wide string to upper case */
+
+static void
+wide_toupper(wchar_t *wstr, size_t wlen)
+{
+	wide_change_case(wstr, wlen, is_wlower, to_wupper);
+}
+
+/* wide_tolower --- map a wide string to lower case */
+
+static void
+wide_tolower(wchar_t *wstr, size_t wlen)
+{
+	wide_change_case(wstr, wlen, is_wupper, to_wlower);
+}
+
+/* do_tolower --- lower case a string */
+
+NODE *
+do_tolower(int nargs)
+{
+	NODE *t1, *t2;
+
+	t1 = POP_SCALAR();
+	if (do_lint && (fixtype(t1)->flags & STRING) == 0)
+		lintwarn(_("tolower: received non-string argument"));
+	t1 = force_string(t1);
+	t2 = make_string(t1->stptr, t1->stlen);
+
+	if (gawk_mb_cur_max == 1) {
+		unsigned char *cp, *cp2;
+
+		for (cp = (unsigned char *)t2->stptr,
+		     cp2 = (unsigned char *)(t2->stptr + t2->stlen);
+			cp < cp2; cp++)
+			if (isupper(*cp))
+				*cp = tolower(*cp);
+	} else {
+		force_wstring(t2);
+		wide_tolower(t2->wstptr, t2->wstlen);
+		wstr2str(t2);
+	}
+
+	DEREF(t1);
+	return t2;
+}
+
+/* do_toupper --- upper case a string */
+
+NODE *
+do_toupper(int nargs)
+{
+	NODE *t1, *t2;
+
+	t1 = POP_SCALAR();
+	if (do_lint && (fixtype(t1)->flags & STRING) == 0)
+		lintwarn(_("toupper: received non-string argument"));
+	t1 = force_string(t1);
+	t2 = make_string(t1->stptr, t1->stlen);
+
+	if (gawk_mb_cur_max == 1) {
+		unsigned char *cp, *cp2;
+
+		for (cp = (unsigned char *)t2->stptr,
+		     cp2 = (unsigned char *)(t2->stptr + t2->stlen);
+			cp < cp2; cp++)
+			if (islower(*cp))
+				*cp = toupper(*cp);
+	} else {
+		force_wstring(t2);
+		wide_toupper(t2->wstptr, t2->wstlen);
+		wstr2str(t2);
+	}
+
+	DEREF(t1);
+	return t2;
+}
+
+/* do_atan2 --- do the atan2 function */
+
+NODE *
+do_atan2(int nargs)
+{
+	NODE *t1, *t2;
+	double d1, d2;
+
+	POP_TWO_SCALARS(t1, t2);
+	if (do_lint) {
+		if ((fixtype(t1)->flags & NUMBER) == 0)
+			lintwarn(_("atan2: received non-numeric first argument"));
+		if ((fixtype(t2)->flags & NUMBER) == 0)
+			lintwarn(_("atan2: received non-numeric second argument"));
+	}
+	d1 = force_number(t1)->numbr;
+	d2 = force_number(t2)->numbr;
+	DEREF(t1);
+	DEREF(t2);
+	return make_number((AWKNUM) atan2(d1, d2));
+}
+
+/* do_sin --- do the sin function */
+
+NODE *
+do_sin(int nargs)
+{
+	NODE *tmp;
+	double d;
+
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+		lintwarn(_("sin: received non-numeric argument"));
+	d = sin((double) force_number(tmp)->numbr);
+	DEREF(tmp);
+	return make_number((AWKNUM) d);
+}
+
+/* do_cos --- do the cos function */
+
+NODE *
+do_cos(int nargs)
+{
+	NODE *tmp;
+	double d;
+
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+		lintwarn(_("cos: received non-numeric argument"));
+	d = cos((double) force_number(tmp)->numbr);
+	DEREF(tmp);
+	return make_number((AWKNUM) d);
+}
+
+/* do_rand --- do the rand function */
+
+static bool firstrand = true;
+/* Some systems require this array to be integer aligned. Sigh. */
+#define SIZEOF_STATE 256
+static uint32_t istate[SIZEOF_STATE/sizeof(uint32_t)];
+static char *const state = (char *const) istate;
+
+/* ARGSUSED */
+NODE *
+do_rand(int nargs ATTRIBUTE_UNUSED)
+{
+	double tmprand;
+#define RAND_DIVISOR ((double)GAWK_RANDOM_MAX+1.0)
+	if (firstrand) {
+		(void) initstate((unsigned) 1, state, SIZEOF_STATE);
+		/* don't need to srandom(1), initstate() does it for us. */
+		firstrand = false;
+		setstate(state);
+	}
+	/*
+	 * Per historical practice and POSIX, return value N is
+	 *
+	 * 	0 <= n < 1
+	 */
+ 	/*
+	 * Date: Wed, 28 Aug 2013 17:52:46 -0700
+	 * From: Bob Jewett <jewett@bill.scs.agilent.com>
+	 *
+ 	 * Call random() twice to fill in more bits in the value
+ 	 * of the double.  Also, there is a bug in random() such
+ 	 * that when the values of successive values are combined
+ 	 * like (rand1*rand2)^2, (rand3*rand4)^2,  ...  the
+ 	 * resulting time series is not white noise.  The
+ 	 * following also seems to fix that bug.
+ 	 *
+ 	 * The add/subtract 0.5 keeps small bits from filling
+ 	 * below 2^-53 in the double, not that anyone should be
+ 	 * looking down there.
+	 *
+	 * Date: Wed, 25 Sep 2013 10:45:38 -0600 (MDT)
+	 * From: "Nelson H. F. Beebe" <beebe@math.utah.edu>
+	 * (4) The code is typical of many published fragments for converting
+	 *     from integer to floating-point, and I discuss the serious pitfalls
+	 *     in my book, because it leads to platform-dependent behavior at the
+	 *     end points of the interval [0,1]
+	 *
+	 * (5) the documentation in the gawk info node says
+	 *
+	 *     `rand()'
+	 * 	 Return a random number.  The values of `rand()' are uniformly
+	 * 	 distributed between zero and one.  The value could be zero but is
+	 * 	 never one.(1)
+	 *
+	 *     The division by RAND_DIVISOR may not guarantee that 1.0 is never
+	 *     returned: the programmer forgot the platform-dependent issue of
+	 *     rounding.
+	 *
+	 * For points 4 and 5, the safe way is a loop:
+	 *
+	 *         double
+	 * 	   rand(void)		// return value in [0.0, 1.0)
+	 *         {
+	 * 	    value = internal_rand();
+	 *
+	 * 	    while (value == 1.0)
+	 *                 value = internal_rand();
+	 *
+	 * 	    return (value);
+	 *         }
+ 	 */
+
+	do {
+		long d1, d2;
+		/*
+		 * Do the calls in predictable order to avoid
+		 * compiler differences in order of evaluation.
+		 */
+		d1 = random();
+		d2 = random();
+	 	tmprand = 0.5 + ( (d1/RAND_DIVISOR + d2) / RAND_DIVISOR );
+		tmprand -= 0.5;
+	} while (tmprand == 1.0);
+
+ 	return make_number((AWKNUM) tmprand);
+}
+
+/* do_srand --- seed the random number generator */
+
+NODE *
+do_srand(int nargs)
+{
+	NODE *tmp;
+	static long save_seed = 1;
+	long ret = save_seed;	/* SVR4 awk srand returns previous seed */
+
+	if (firstrand) {
+		(void) initstate((unsigned) 1, state, SIZEOF_STATE);
+		/* don't need to srandom(1), we're changing the seed below */
+		firstrand = false;
+		(void) setstate(state);
+	}
+
+	if (nargs == 0)
+		srandom((unsigned int) (save_seed = (long) time((time_t *) 0)));
+	else {
+		tmp = POP_SCALAR();
+		if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+			lintwarn(_("srand: received non-numeric argument"));
+		srandom((unsigned int) (save_seed = (long) force_number(tmp)->numbr));
+		DEREF(tmp);
+	}
+	return make_number((AWKNUM) ret);
+}
+
+/* do_match --- match a regexp, set RSTART and RLENGTH,
+ * 	optional third arg is array filled with text of
+ * 	subpatterns enclosed in parens and start and len info.
+ */
+
+NODE *
+do_match(int nargs)
+{
+	NODE *tre, *t1, *dest, *it;
+	int rstart, len, ii;
+	int rlength;
+	Regexp *rp;
+	regoff_t s;
+	char *start;
+	char *buf = NULL;
+	char buff[100];
+	size_t amt, oldamt = 0, ilen, slen;
+	char *subsepstr;
+	size_t subseplen;
+
+	dest = NULL;
+	if (nargs == 3) {	/* 3rd optional arg for the subpatterns */
+		dest = POP_PARAM();
+		if (dest->type != Node_var_array)
+			fatal(_("match: third argument is not an array"));
+		assoc_clear(dest);
+	}
+	tre = POP();
+	rp = re_update(tre);
+	t1 = POP_STRING();
+
+	rstart = research(rp, t1->stptr, 0, t1->stlen, RE_NEED_START);
+	if (rstart >= 0) {	/* match succeded */
+		size_t *wc_indices = NULL;
+
+		rlength = REEND(rp, t1->stptr) - RESTART(rp, t1->stptr);	/* byte length */
+		if (rlength > 0 && gawk_mb_cur_max > 1) {
+			t1 = str2wstr(t1, & wc_indices);
+			rlength = wc_indices[rstart + rlength - 1] - wc_indices[rstart] + 1;
+			rstart = wc_indices[rstart];
+		}
+
+		rstart++;	/* now it's 1-based indexing */
+
+		/* Build the array only if the caller wants the optional subpatterns */
+		if (dest != NULL) {
+			subsepstr = SUBSEP_node->var_value->stptr;
+			subseplen = SUBSEP_node->var_value->stlen;
+
+			for (ii = 0; ii < NUMSUBPATS(rp, t1->stptr); ii++) {
+				/*
+				 * Loop over all the subpats; some of them may have
+				 * matched even if all of them did not.
+				 */
+				if ((s = SUBPATSTART(rp, t1->stptr, ii)) != -1) {
+					size_t subpat_start;
+					size_t subpat_len;
+
+					start = t1->stptr + s;
+					subpat_start = s;
+					subpat_len = len = SUBPATEND(rp, t1->stptr, ii) - s;
+					if (len > 0 && gawk_mb_cur_max > 1) {
+						subpat_start = wc_indices[s];
+						subpat_len = wc_indices[s + len - 1] - subpat_start + 1;
+					}
+
+					it = make_string(start, len);
+					it->flags |= USER_INPUT;
+					assoc_set(dest, make_number((AWKNUM) (ii)), it);;
+
+					sprintf(buff, "%d", ii);
+					ilen = strlen(buff);
+					amt = ilen + subseplen + strlen("length") + 1;
+
+					if (oldamt == 0) {
+						emalloc(buf, char *, amt, "do_match");
+					} else if (amt > oldamt) {
+						erealloc(buf, char *, amt, "do_match");
+					}
+					oldamt = amt;
+					memcpy(buf, buff, ilen);
+					memcpy(buf + ilen, subsepstr, subseplen);
+					memcpy(buf + ilen + subseplen, "start", 6);
+
+					slen = ilen + subseplen + 5;
+
+					assoc_set(dest, make_string(buf, slen), make_number((AWKNUM) subpat_start + 1));
+
+					memcpy(buf, buff, ilen);
+					memcpy(buf + ilen, subsepstr, subseplen);
+					memcpy(buf + ilen + subseplen, "length", 7);
+
+					slen = ilen + subseplen + 6;
+
+					assoc_set(dest, make_string(buf, slen), make_number((AWKNUM) subpat_len));
+				}
+			}
+
+			efree(buf);
+		}
+		if (wc_indices != NULL)
+			efree(wc_indices);
+	} else {		/* match failed */
+		rstart = 0;
+		rlength = -1;
+	}
+
+	DEREF(t1);
+	unref(RSTART_node->var_value);
+	RSTART_node->var_value = make_number((AWKNUM) rstart);
+	unref(RLENGTH_node->var_value);
+	RLENGTH_node->var_value = make_number((AWKNUM) rlength);
+	return make_number((AWKNUM) rstart);
+}
+
+/* do_sub --- do the work for sub, gsub, and gensub */
+
+/*
+ * Gsub can be tricksy; particularly when handling the case of null strings.
+ * The following awk code was useful in debugging problems.  It is too bad
+ * that it does not readily translate directly into the C code, below.
+ *
+ * #! /usr/local/bin/mawk -f
+ *
+ * BEGIN {
+ * 	true = 1; false = 0
+ * 	print "--->", mygsub("abc", "b+", "FOO")
+ * 	print "--->", mygsub("abc", "x*", "X")
+ * 	print "--->", mygsub("abc", "b*", "X")
+ * 	print "--->", mygsub("abc", "c", "X")
+ * 	print "--->", mygsub("abc", "c+", "X")
+ * 	print "--->", mygsub("abc", "x*$", "X")
+ * }
+ *
+ * function mygsub(str, regex, replace,	origstr, newstr, eosflag, nonzeroflag)
+ * {
+ * 	origstr = str;
+ * 	eosflag = nonzeroflag = false
+ * 	while (match(str, regex)) {
+ * 		if (RLENGTH > 0) {	# easy case
+ * 			nonzeroflag = true
+ * 			if (RSTART == 1) {	# match at front of string
+ * 				newstr = newstr replace
+ * 			} else {
+ * 				newstr = newstr substr(str, 1, RSTART-1) replace
+ * 			}
+ * 			str = substr(str, RSTART+RLENGTH)
+ * 		} else if (nonzeroflag) {
+ * 			# last match was non-zero in length, and at the
+ * 			# current character, we get a zero length match,
+ * 			# which we don't really want, so skip over it
+ * 			newstr = newstr substr(str, 1, 1)
+ * 			str = substr(str, 2)
+ * 			nonzeroflag = false
+ * 		} else {
+ * 			# 0-length match
+ * 			if (RSTART == 1) {
+ * 				newstr = newstr replace substr(str, 1, 1)
+ * 				str = substr(str, 2)
+ * 			} else {
+ * 				return newstr str replace
+ * 			}
+ * 		}
+ * 		if (length(str) == 0)
+ * 			if (eosflag)
+ * 				break
+ * 			else
+ * 				eosflag = true
+ * 	}
+ * 	if (length(str) > 0)
+ * 		newstr = newstr str	# rest of string
+ *
+ * 	return newstr
+ * }
+ */
+
+/*
+ * 1/2004:  The gawk sub/gsub behavior dates from 1996, when we proposed it
+ * for POSIX.  The proposal fell through the cracks, and the 2001 POSIX
+ * standard chose a more simple behavior.
+ *
+ * The relevant text is to be found on lines 6394-6407 (pages 166, 167) of the
+ * 2001 standard:
+ *
+ * sub(ere, repl[, in ])
+ *  Substitute the string repl in place of the first instance of the
+ *  extended regular expression ERE in string in and return the number of
+ *  substitutions. An ampersand ('&') appearing in the string repl shall
+ *  be replaced by the string from in that matches the ERE. An ampersand
+ *  preceded with a backslash ('\') shall be interpreted as the literal
+ *  ampersand character. An occurrence of two consecutive backslashes shall
+ *  be interpreted as just a single literal backslash character. Any other
+ *  occurrence of a backslash (for example, preceding any other character)
+ *  shall be treated as a literal backslash character. Note that if repl is a
+ *  string literal (the lexical token STRING; see Grammar (on page 170)), the
+ *  handling of the ampersand character occurs after any lexical processing,
+ *  including any lexical backslash escape sequence processing. If in is
+ *  specified and it is not an lvalue (see Expressions in awk (on page 156)),
+ *  the behavior is undefined. If in is omitted, awk shall use the current
+ *  record ($0) in its place.
+ *
+ * 11/2010: The text in the 2008 standard is the same as just quoted.
+ * However, POSIX behavior is now the default.  This can change the behavior
+ * of awk programs.  The old behavior is not available.
+ *
+ * 7/2011: Reverted backslash handling to what it used to be. It was in
+ * gawk for too long. Should have known better.
+ */
+
+/*
+ * NB: `howmany' conflicts with a SunOS 4.x macro in <sys/param.h>.
+ */
+
+NODE *
+do_sub(int nargs, unsigned int flags)
+{
+	char *scan;
+	char *bp, *cp;
+	char *buf = NULL;
+	size_t buflen;
+	char *matchend;
+	size_t len;
+	char *matchstart;
+	char *text;
+	size_t textlen = 0;
+	char *repl;
+	char *replend;
+	size_t repllen;
+	int sofar;
+	int ampersands;
+	int matches = 0;
+	Regexp *rp;
+	NODE *rep_node;		/* replacement text */
+	NODE *target;		/* string to make sub. in; $0 if none given */
+	NODE *tmp;
+	NODE **lhs = NULL;
+	long how_many = 1;	/* one substitution for sub, also gensub default */
+	bool global;
+	long current;
+	bool lastmatchnonzero;
+	char *mb_indices = NULL;
+
+	if ((flags & GENSUB) != 0) {
+		double d;
+		NODE *glob_flag;
+
+		tmp = PEEK(3);
+		rp = re_update(tmp);
+
+		target = POP_STRING();	/* original string */
+
+		glob_flag = POP_SCALAR();	/* value of global flag */
+		if (   (glob_flag->flags & STRING) != 0
+		    && glob_flag->stlen > 0
+		    && (glob_flag->stptr[0] == 'g' || glob_flag->stptr[0] == 'G'))
+			how_many = -1;
+		else {
+			(void) force_number(glob_flag);
+			d = get_number_d(glob_flag);
+			if (d < 1)
+				how_many = 1;
+			else if (d < LONG_MAX)
+				how_many = d;
+			else
+				how_many = LONG_MAX;
+			if (d <= 0) {
+				(void) force_string(glob_flag);
+				warning(_("gensub: third argument `%.*s' treated as 1"),
+						(int) glob_flag->stlen,
+						glob_flag->stptr);
+			}
+		}
+		DEREF(glob_flag);
+	} else {
+		/* take care of regexp early, in case re_update is fatal */
+
+		tmp = PEEK(2);
+		rp = re_update(tmp);
+
+		if ((flags & GSUB) != 0)
+			how_many = -1;
+
+		/* original string */
+
+		if ((flags & LITERAL) != 0)
+			target = POP_STRING();
+		else {
+			lhs = POP_ADDRESS();
+			target = force_string(*lhs);
+		}
+	}
+
+	global = (how_many == -1);
+
+	rep_node = POP_STRING();	/* replacement text */
+	decr_sp();		/* regexp, already updated above */
+
+	/* do the search early to avoid work on non-match */
+	if (research(rp, target->stptr, 0, target->stlen, RE_NEED_START) == -1 ||
+			RESTART(rp, target->stptr) > target->stlen)
+		goto done;
+
+	target->flags |= STRING;
+
+	text = target->stptr;
+	textlen = target->stlen;
+
+	repl = rep_node->stptr;
+	replend = repl + rep_node->stlen;
+	repllen = replend - repl;
+
+	ampersands = 0;
+
+	/*
+	 * Some systems' malloc() can't handle being called with an
+	 * argument of zero.  Thus we have to have some special case
+	 * code to check for `repllen == 0'.  This can occur for
+	 * something like:
+	 * 	sub(/foo/, "", mystring)
+	 * for example.
+	 */
+	if (gawk_mb_cur_max > 1 && repllen > 0) {
+		emalloc(mb_indices, char *, repllen * sizeof(char), "do_sub");
+		index_multibyte_buffer(repl, mb_indices, repllen);
+	}
+
+	/* compute length of replacement string, number of ampersands */
+	for (scan = repl; scan < replend; scan++) {
+		if ((gawk_mb_cur_max == 1 || (repllen > 0 && mb_indices[scan - repl] == 1))
+		    && (*scan == '&')) {
+			repllen--;
+			ampersands++;
+		} else if (*scan == '\\') {
+			if ((flags & GENSUB) != 0) {	/* gensub, behave sanely */
+				if (isdigit((unsigned char) scan[1])) {
+					ampersands++;
+					scan++;
+				} else {	/* \q for any q --> q */
+					repllen--;
+					scan++;
+				}
+			} else if (do_posix) {
+				/* \& --> &, \\ --> \ */
+				if (scan[1] == '&' || scan[1] == '\\') {
+					repllen--;
+					scan++;
+				} /* else
+					leave alone, it goes into the output */
+			} else {
+				/* gawk default behavior since 1996 */
+				if (strncmp(scan, "\\\\\\&", 4) == 0
+				    || strncmp(scan, "\\\\\\\\", 4) == 0) {	/* 2016: fixed */
+					/* \\\& --> \& */
+					/* \\\\ --> \\ */
+					repllen -= 2;
+					scan += 3;
+				} else if (strncmp(scan, "\\\\&", 3) == 0) {
+					/* \\& --> \<string> */
+					ampersands++;
+					repllen--;
+					scan += 2;
+				} else if (scan[1] == '&') {
+					/* \& --> & */
+					repllen--;
+					scan++;
+				} /* else
+					leave alone, it goes into the output */
+			}
+		}
+	}
+
+	lastmatchnonzero = false;
+
+	/* guesstimate how much room to allocate; +1 forces > 0 */
+	buflen = textlen + (ampersands + 1) * repllen + 1;
+	emalloc(buf, char *, buflen + 1, "do_sub");
+	buf[buflen] = '\0';
+
+	bp = buf;
+	for (current = 1;; current++) {
+		matches++;
+		matchstart = target->stptr + RESTART(rp, target->stptr);
+		matchend = target->stptr + REEND(rp, target->stptr);
+
+		/*
+		 * create the result, copying in parts of the original
+		 * string. note that length of replacement string can
+		 * vary since ampersand is actual text of regexp match.
+		 */
+
+		/*
+		 * add 1 to len to handle "empty" case where
+		 * matchend == matchstart and we force a match on a single
+		 * char.  Use 'matchend - text' instead of 'matchstart - text'
+		 * because we may not actually make any substitution depending
+		 * on the 'global' and 'how_many' values.
+		 */
+		len = matchend - text + repllen
+		      + ampersands * (matchend - matchstart) + 1;
+		sofar = bp - buf;
+		while (buflen < (sofar + len + 1)) {
+			buflen *= 2;
+			erealloc(buf, char *, buflen, "sub_common");
+			bp = buf + sofar;
+		}
+		for (scan = text; scan < matchstart; scan++)
+			*bp++ = *scan;
+		if (global || current == how_many) {
+			/*
+			 * If the current match matched the null string,
+			 * and the last match didn't and did a replacement,
+			 * and the match of the null string is at the front of
+			 * the text (meaning right after end of the previous
+			 * replacement), then skip this one.
+			 */
+			if (matchstart == matchend
+			    && lastmatchnonzero
+			    && matchstart == text) {
+				lastmatchnonzero = false;
+				matches--;
+				goto empty;
+			}
+			/*
+			 * If replacing all occurrences, or this is the
+			 * match we want, copy in the replacement text,
+			 * making substitutions as we go.
+			 */
+			for (scan = repl; scan < replend; scan++)
+				if (*scan == '&'
+					/*
+					 * Don't test repllen here. A simple "&" could
+					 * end up with repllen == 0.
+					 */
+					&& (gawk_mb_cur_max == 1
+						|| mb_indices[scan - repl] == 1)
+				) {
+						for (cp = matchstart; cp < matchend; cp++)
+								*bp++ = *cp;
+				} else if (*scan == '\\'
+					&& (gawk_mb_cur_max == 1
+						|| (repllen > 0 && mb_indices[scan - repl] == 1))
+				) {
+					if (flags & GENSUB) {	/* gensub, behave sanely */
+						if (isdigit((unsigned char) scan[1])) {
+							int dig = scan[1] - '0';
+							if (dig < NUMSUBPATS(rp, target->stptr) && SUBPATSTART(rp, tp->stptr, dig) != -1) {
+								char *start, *end;
+
+								start = target->stptr
+								      + SUBPATSTART(rp, target->stptr, dig);
+								end = target->stptr
+								      + SUBPATEND(rp, target->stptr, dig);
+
+								for (cp = start; cp < end; cp++)
+									*bp++ = *cp;
+							}
+							scan++;
+						} else	/* \q for any q --> q */
+							*bp++ = *++scan;
+					} else if (do_posix) {
+						/* \& --> &, \\ --> \ */
+						if (scan[1] == '&' || scan[1] == '\\')
+							scan++;
+						*bp++ = *scan;
+					} else {
+						/* gawk default behavior since 1996 */
+						if (strncmp(scan, "\\\\\\&", 4) == 0
+						    || strncmp(scan, "\\\\\\\\", 4) == 0) {	/* 2016: fixed */
+							/* \\\& --> \& */
+							/* \\\\ --> \\ */
+							*bp++ = '\\';
+							*bp++ = scan[3];
+							scan += 3;
+						} else if (strncmp(scan, "\\\\&", 3) == 0) {
+							/* \\& --> \<string> */
+							*bp++ = '\\';
+							for (cp = matchstart; cp < matchend; cp++)
+								*bp++ = *cp;
+							scan += 2;
+						} else if (scan[1] == '&') {
+							/* \& --> & */
+							*bp++ = '&';
+							scan++;
+						} else
+							*bp++ = *scan;
+					}
+				} else
+					*bp++ = *scan;
+			if (matchstart != matchend)
+				lastmatchnonzero = true;
+		} else {
+			/*
+			 * don't want this match, skip over it by copying
+			 * in current text.
+			 */
+			for (cp = matchstart; cp < matchend; cp++)
+				*bp++ = *cp;
+		}
+	empty:
+		/* catch the case of gsub(//, "blah", whatever), i.e. empty regexp */
+		if (matchstart == matchend && matchend < text + textlen) {
+			*bp++ = *matchend;
+			matchend++;
+		}
+		textlen = text + textlen - matchend;
+		text = matchend;
+
+#if 0
+		if (bp - buf > sofar + len)
+			fprintf(stderr, "debug: len = %zu, but used %ld\n", len, (long)((bp - buf) - (long)sofar));
+#endif
+
+		if ((current >= how_many && ! global)
+		    || ((long) textlen <= 0 && matchstart == matchend)
+		    || research(rp, target->stptr, text - target->stptr, textlen, RE_NEED_START) == -1)
+			break;
+
+	}
+	sofar = bp - buf;
+	if (buflen < (sofar + textlen + 1)) {
+		buflen = sofar + textlen + 1;
+		erealloc(buf, char *, buflen, "do_sub");
+		bp = buf + sofar;
+	}
+	/*
+	 * Note that text == matchend, since that assignment is made before
+	 * exiting the 'for' loop above. Thus we copy in the rest of the
+	 * original string.
+	 */
+	for (scan = text; scan < text + textlen; scan++)
+		*bp++ = *scan;
+	*bp = '\0';
+	textlen = bp - buf;
+
+	if (mb_indices != NULL)
+		efree(mb_indices);
+
+done:
+	DEREF(rep_node);
+
+	if ((matches == 0 || (flags & LITERAL) != 0) && buf != NULL) {
+		efree(buf);
+		buf = NULL;
+	}
+
+	if (flags & GENSUB) {
+		if (matches > 0) {
+			/* return the result string */
+			DEREF(target);
+			assert(buf != NULL);
+			return make_str_node(buf, textlen, ALREADY_MALLOCED);
+		}
+
+		/* return the original string */
+		return target;
+	}
+
+	/* For a string literal, must not change the original string. */
+	if ((flags & LITERAL) != 0)
+		DEREF(target);
+	else if (matches > 0) {
+		unref(*lhs);
+		*lhs = make_str_node(buf, textlen, ALREADY_MALLOCED);
+	}
+
+	return make_number((AWKNUM) matches);
+}
+
+/* call_sub --- call do_sub indirectly */
+
+NODE *
+call_sub(const char *name, int nargs)
+{
+	unsigned int flags = 0;
+	NODE *regex, *replace, *glob_flag;
+	NODE **lhs, *rhs;
+	NODE *zero = make_number(0.0);
+	NODE *result;
+
+	if (name[0] == 'g') {
+		if (name[1] == 'e')
+			flags = GENSUB;
+		else
+			flags = GSUB;
+	}
+
+	if (flags == 0 || flags == GSUB) {
+		/* sub or gsub */
+		if (nargs != 2)
+			fatal(_("%s: can be called indirectly only with two arguments"), name);
+
+		replace = POP_STRING();
+		regex = POP();	/* the regex */
+		/*
+		 * push regex
+		 * push replace
+		 * push $0
+		 */
+		if ((regex->flags & REGEX) != 0)
+			regex = regex->typed_re;
+		else
+			regex = make_regnode(Node_regex, regex);
+		PUSH(regex);
+		PUSH(replace);
+		lhs = r_get_field(zero, (Func_ptr *) 0, true);
+		nargs++;
+		PUSH_ADDRESS(lhs);
+	} else {
+		/* gensub */
+		if (nargs == 4)
+			rhs = POP();
+		else
+			rhs = NULL;
+		glob_flag = POP_STRING();
+		replace = POP_STRING();
+		regex = POP();	/* the regex */
+		/*
+		 * push regex
+		 * push replace
+		 * push glob_flag
+		 * if (nargs = 3) {
+		 *	 push $0
+		 *	 nargs++
+		 * }
+		 */
+		if ((regex->flags & REGEX) != 0)
+			regex = regex->typed_re;
+		else
+			regex = make_regnode(Node_regex, regex);
+		PUSH(regex);
+		PUSH(replace);
+		PUSH(glob_flag);
+		if (rhs == NULL) {
+			lhs = r_get_field(zero, (Func_ptr *) 0, true);
+			rhs = *lhs;
+			UPREF(rhs);
+			PUSH(rhs);
+			nargs++;
+		}
+		else
+			PUSH(rhs);
+	}
+
+	unref(zero);
+	result = do_sub(nargs, flags);
+	if (flags != GENSUB)
+		reset_record();
+	return result;
+}
+
+/* call_match --- call do_match indirectly */
+
+NODE *
+call_match(int nargs)
+{
+	NODE *regex, *text, *array;
+	NODE *result;
+
+	regex = text = array = NULL;
+	if (nargs == 3)
+		array = POP();
+	regex = POP();
+
+	/* Don't need to pop the string just to push it back ... */
+
+	if ((regex->flags & REGEX) != 0)
+		regex = regex->typed_re;
+	else
+		regex = make_regnode(Node_regex, regex);
+
+	PUSH(regex);
+
+	if (array)
+		PUSH(array);
+
+	result = do_match(nargs);
+	return result;
+}
+
+/* call_split_func --- call do_split or do_pat_split indirectly */
+
+NODE *
+call_split_func(const char *name, int nargs)
+{
+	NODE *regex, *seps;
+	NODE *result;
+
+	regex = seps = NULL;
+	if (nargs < 2)
+		fatal(_("indirect call to %s requires at least two arguments"),
+				name);
+
+	if (nargs == 4)
+		seps = POP();
+
+	if (nargs >= 3) {
+		regex = POP_STRING();
+		if ((regex->flags & REGEX) != 0)
+			regex = regex->typed_re;
+		else
+			regex = make_regnode(Node_regex, regex);
+	} else {
+		if (name[0] == 's') {
+			regex = make_regnode(Node_regex, FS_node->var_value);
+			regex->re_flags |= FS_DFLT;
+		} else
+			regex = make_regnode(Node_regex, FPAT_node->var_value);
+		nargs++;
+	}
+
+	/* Don't need to pop the string or the data array */
+
+	PUSH(regex);
+
+	if (seps)
+		PUSH(seps);
+
+	result = (name[0] == 's') ? do_split(nargs) : do_patsplit(nargs);
+
+	return result;
+}
+
+/* make_integer - Convert an integer to a number node.  */
+
+static NODE *
+make_integer(uintmax_t n)
+{
+	n = adjust_uint(n);
+
+	return make_number((AWKNUM) n);
+}
+
+/* do_lshift --- perform a << operation */
+
+NODE *
+do_lshift(int nargs)
+{
+	NODE *s1, *s2;
+	uintmax_t uval, ushift, res;
+	AWKNUM val, shift;
+
+	POP_TWO_SCALARS(s1, s2);
+	if (do_lint) {
+		if ((fixtype(s1)->flags & NUMBER) == 0)
+			lintwarn(_("lshift: received non-numeric first argument"));
+		if ((fixtype(s2)->flags & NUMBER) == 0)
+			lintwarn(_("lshift: received non-numeric second argument"));
+	}
+
+	val = force_number(s1)->numbr;
+	shift = force_number(s2)->numbr;
+	if (val < 0 || shift < 0)
+		fatal(_("lshift(%f, %f): negative values are not allowed"), val, shift);
+
+	if (do_lint) {
+		if (double_to_int(val) != val || double_to_int(shift) != shift)
+			lintwarn(_("lshift(%f, %f): fractional values will be truncated"), val, shift);
+		if (shift >= sizeof(uintmax_t) * CHAR_BIT)
+			lintwarn(_("lshift(%f, %f): too large shift value will give strange results"), val, shift);
+	}
+
+	DEREF(s1);
+	DEREF(s2);
+
+	uval = (uintmax_t) val;
+	ushift = (uintmax_t) shift;
+
+	res = uval << ushift;
+	return make_integer(res);
+}
+
+/* do_rshift --- perform a >> operation */
+
+NODE *
+do_rshift(int nargs)
+{
+	NODE *s1, *s2;
+	uintmax_t uval, ushift, res;
+	AWKNUM val, shift;
+
+	POP_TWO_SCALARS(s1, s2);
+	if (do_lint) {
+		if ((fixtype(s1)->flags & NUMBER) == 0)
+			lintwarn(_("rshift: received non-numeric first argument"));
+		if ((fixtype(s2)->flags & NUMBER) == 0)
+			lintwarn(_("rshift: received non-numeric second argument"));
+	}
+
+	val = force_number(s1)->numbr;
+	shift = force_number(s2)->numbr;
+	if (val < 0 || shift < 0)
+		fatal(_("rshift(%f, %f): negative values are not allowed"), val, shift);
+
+	if (do_lint) {
+		if (double_to_int(val) != val || double_to_int(shift) != shift)
+			lintwarn(_("rshift(%f, %f): fractional values will be truncated"), val, shift);
+		if (shift >= sizeof(uintmax_t) * CHAR_BIT)
+			lintwarn(_("rshift(%f, %f): too large shift value will give strange results"), val, shift);
+	}
+
+	DEREF(s1);
+	DEREF(s2);
+
+	uval = (uintmax_t) val;
+	ushift = (uintmax_t) shift;
+
+	res = uval >> ushift;
+	return make_integer(res);
+}
+
+/* do_and --- perform an & operation */
+
+NODE *
+do_and(int nargs)
+{
+	NODE *s1;
+	uintmax_t res, uval;
+	AWKNUM val;
+	int i;
+
+	res = ~0;	/* start off with all ones */
+	if (nargs < 2)
+		fatal(_("and: called with less than two arguments"));
+
+	for (i = 1; nargs > 0; nargs--, i++) {
+		s1 = POP_SCALAR();
+		if (do_lint && (fixtype(s1)->flags & NUMBER) == 0)
+			lintwarn(_("and: argument %d is non-numeric"), i);
+
+		val = force_number(s1)->numbr;
+		if (val < 0)
+			fatal(_("and: argument %d negative value %g is not allowed"), i, val);
+
+		uval = (uintmax_t) val;
+		res &= uval;
+
+		DEREF(s1);
+	}
+
+	return make_integer(res);
+}
+
+/* do_or --- perform an | operation */
+
+NODE *
+do_or(int nargs)
+{
+	NODE *s1;
+	uintmax_t res, uval;
+	AWKNUM val;
+	int i;
+
+	res = 0;
+	if (nargs < 2)
+		fatal(_("or: called with less than two arguments"));
+
+	for (i = 1; nargs > 0; nargs--, i++) {
+		s1 = POP_SCALAR();
+		if (do_lint && (fixtype(s1)->flags & NUMBER) == 0)
+			lintwarn(_("or: argument %d is non-numeric"), i);
+
+		val = force_number(s1)->numbr;
+		if (val < 0)
+			fatal(_("or: argument %d negative value %g is not allowed"), i, val);
+
+		uval = (uintmax_t) val;
+		res |= uval;
+
+		DEREF(s1);
+	}
+
+	return make_integer(res);
+}
+
+/* do_xor --- perform an ^ operation */
+
+NODE *
+do_xor(int nargs)
+{
+	NODE *s1;
+	uintmax_t res, uval;
+	AWKNUM val;
+	int i;
+
+	if (nargs < 2)
+		fatal(_("xor: called with less than two arguments"));
+
+	res = 0;	/* silence compiler warning */
+	for (i = 1; nargs > 0; nargs--, i++) {
+		s1 = POP_SCALAR();
+		if (do_lint && (fixtype(s1)->flags & NUMBER) == 0)
+			lintwarn(_("xor: argument %d is non-numeric"), i);
+
+		val = force_number(s1)->numbr;
+		if (val < 0)
+			fatal(_("xor: argument %d negative value %g is not allowed"), i, val);
+
+		uval = (uintmax_t) val;
+		if (i == 1)
+			res = uval;
+		else
+			res ^= uval;
+
+		DEREF(s1);
+	}
+
+	return make_integer(res);
+}
+
+/* do_compl --- perform a ~ operation */
+
+NODE *
+do_compl(int nargs)
+{
+	NODE *tmp;
+	double d;
+	uintmax_t uval;
+
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+		lintwarn(_("compl: received non-numeric argument"));
+	d = force_number(tmp)->numbr;
+	DEREF(tmp);
+
+	if (d < 0)
+		fatal(_("compl(%f): negative value is not allowed"), d);
+
+	if (do_lint && double_to_int(d) != d)
+		lintwarn(_("compl(%f): fractional value will be truncated"), d);
+
+	uval = (uintmax_t) d;
+	uval = ~ uval;
+	return make_integer(uval);
+}
+
+/* do_strtonum --- the strtonum function */
+
+NODE *
+do_strtonum(int nargs)
+{
+	NODE *tmp;
+	AWKNUM d;
+
+	tmp = fixtype(POP_SCALAR());
+	if ((tmp->flags & NUMBER) != 0)
+		d = (AWKNUM) tmp->numbr;
+	else if (get_numbase(tmp->stptr, tmp->stlen, use_lc_numeric) != 10)
+		d = nondec2awknum(tmp->stptr, tmp->stlen, NULL);
+	else
+		d = (AWKNUM) force_number(tmp)->numbr;
+
+	DEREF(tmp);
+	return make_number((AWKNUM) d);
+}
+
+/* nondec2awknum --- convert octal or hex value to double */
+
+/*
+ * Because of awk's concatenation rules and the way awk.y:yylex()
+ * collects a number, this routine has to be willing to stop on the
+ * first invalid character.
+ */
+
+AWKNUM
+nondec2awknum(char *str, size_t len, char **endptr)
+{
+	AWKNUM retval = 0.0;
+	char save;
+	short val;
+	char *start = str;
+
+	if (len >= 2 && *str == '0' && (str[1] == 'x' || str[1] == 'X')) {
+		/*
+		 * User called strtonum("0x") or some such,
+		 * so just quit early.
+		 */
+		if (len <= 2) {
+			if (endptr)
+				*endptr = start;
+			return (AWKNUM) 0.0;
+		}
+
+		for (str += 2, len -= 2; len > 0; len--, str++) {
+			switch (*str) {
+			case '0':
+			case '1':
+			case '2':
+			case '3':
+			case '4':
+			case '5':
+			case '6':
+			case '7':
+			case '8':
+			case '9':
+				val = *str - '0';
+				break;
+			case 'a':
+			case 'b':
+			case 'c':
+			case 'd':
+			case 'e':
+			case 'f':
+				val = *str - 'a' + 10;
+				break;
+			case 'A':
+			case 'B':
+			case 'C':
+			case 'D':
+			case 'E':
+			case 'F':
+				val = *str - 'A' + 10;
+				break;
+			default:
+				if (endptr)
+					*endptr = str;
+				goto done;
+			}
+			retval = (retval * 16) + val;
+		}
+		if (endptr)
+			*endptr = str;
+	} else if (len >= 1 && *str == '0') {
+		for (; len > 0; len--) {
+			if (! isdigit((unsigned char) *str)) {
+				if (endptr)
+					*endptr = str;
+				goto done;
+			}
+			else if (*str == '8' || *str == '9') {
+				str = start;
+				goto decimal;
+			}
+			retval = (retval * 8) + (*str - '0');
+			str++;
+		}
+		if (endptr)
+			*endptr = str;
+	} else {
+decimal:
+		save = str[len];
+		str[len] = '\0';
+		retval = strtod(str, endptr);
+		str[len] = save;
+	}
+done:
+	return retval;
+}
+
+/* do_dcgettext, do_dcngettext --- handle i18n translations */
+
+#if ENABLE_NLS && defined(LC_MESSAGES) && HAVE_DCGETTEXT
+
+static int
+localecategory_from_argument(NODE *t)
+{
+	static const struct category_table {
+		int val;
+		const char *name;
+	} cat_tab[] = {
+#ifdef LC_ALL
+		{ LC_ALL,	"LC_ALL" },
+#endif /* LC_ALL */
+#ifdef LC_COLLATE
+		{ LC_COLLATE,	"LC_COLLATE" },
+#endif /* LC_COLLATE */
+#ifdef LC_CTYPE
+		{ LC_CTYPE,	"LC_CTYPE" },
+#endif /* LC_CTYPE */
+#ifdef LC_MESSAGES
+		{ LC_MESSAGES,	"LC_MESSAGES" },
+#endif /* LC_MESSAGES */
+#ifdef LC_MONETARY
+		{ LC_MONETARY,	"LC_MONETARY" },
+#endif /* LC_MONETARY */
+#ifdef LC_NUMERIC
+		{ LC_NUMERIC,	"LC_NUMERIC" },
+#endif /* LC_NUMERIC */
+#ifdef LC_RESPONSE
+		{ LC_RESPONSE,	"LC_RESPONSE" },
+#endif /* LC_RESPONSE */
+#ifdef LC_TIME
+		{ LC_TIME,	"LC_TIME" },
+#endif /* LC_TIME */
+	};
+
+	if (t != NULL) {
+		int low, high, i, mid;
+		char *category;
+		int lc_cat = -1;
+
+		char save = t->stptr[t->stlen];
+		t->stptr[t->stlen] = '\0';
+		category = t->stptr;
+
+		/* binary search the table */
+		low = 0;
+		high = (sizeof(cat_tab) / sizeof(cat_tab[0])) - 1;
+		while (low <= high) {
+			mid = (low + high) / 2;
+			i = strcmp(category, cat_tab[mid].name);
+
+			if (i < 0)		/* category < mid */
+				high = mid - 1;
+			else if (i > 0)		/* category > mid */
+				low = mid + 1;
+			else {
+				lc_cat = cat_tab[mid].val;
+				break;
+			}
+		}
+		t->stptr[t->stlen] = save;
+		if (lc_cat == -1)	/* not there */
+			fatal(_("dcgettext: `%s' is not a valid locale category"), category);
+
+		return lc_cat;
+	} else
+		return LC_MESSAGES;
+}
+
+#endif
+
+/*
+ * awk usage is
+ *
+ * 	str = dcgettext(string [, domain [, category]])
+ * 	str = dcngettext(string1, string2, number [, domain [, category]])
+ *
+ * Default domain is TEXTDOMAIN, default category is LC_MESSAGES.
+ */
+
+NODE *
+do_dcgettext(int nargs)
+{
+	NODE *tmp, *t1, *t2 = NULL;
+	char *string;
+	char *the_result;
+	size_t reslen;
+#if ENABLE_NLS && defined(LC_MESSAGES) && HAVE_DCGETTEXT
+	int lc_cat;
+	char *domain;
+	char save1 = '\0', save2 = '\0';
+
+	if (nargs == 3) {	/* third argument */
+		tmp = POP_STRING();
+		lc_cat = localecategory_from_argument(tmp);
+		DEREF(tmp);
+	} else
+		lc_cat = LC_MESSAGES;
+
+	if (nargs >= 2) {  /* second argument */
+		t2 = POP_STRING();
+		domain = t2->stptr;
+		str_terminate(t2, save2);
+	} else
+		domain = TEXTDOMAIN;
+#else
+	if (nargs == 3) {
+		tmp = POP_STRING();
+		DEREF(tmp);
+	}
+	if (nargs >= 2) {
+		t2 = POP_STRING();
+		DEREF(t2);
+	}
+#endif
+
+	t1 = POP_STRING();	/* first argument */
+	string = t1->stptr;
+
+#if ENABLE_NLS && defined(LC_MESSAGES) && HAVE_DCGETTEXT
+	str_terminate(t1, save1);
+	the_result = dcgettext(domain, string, lc_cat);
+	str_restore(t1, save1);
+	if (t2 != NULL) {
+		str_restore(t2, save2);
+		DEREF(t2);
+	}
+	reslen = strlen(the_result);
+#else
+	the_result = string;
+	reslen = t1->stlen;
+#endif
+	DEREF(t1);
+	return make_string(the_result, reslen);
+}
+
+
+NODE *
+do_dcngettext(int nargs)
+{
+	NODE *tmp, *t1, *t2, *t3;
+	char *string1, *string2;
+	unsigned long number;
+	AWKNUM d;
+	char *the_result;
+	size_t reslen;
+
+#if ENABLE_NLS && defined(LC_MESSAGES) && HAVE_DCGETTEXT
+	int lc_cat;
+	char *domain;
+	char save = '\0', save1 = '\0', save2 = '\0';
+	bool saved_end = false;
+
+	if (nargs == 5) {	/* fifth argument */
+		tmp = POP_STRING();
+		lc_cat = localecategory_from_argument(tmp);
+		DEREF(tmp);
+	} else
+		lc_cat = LC_MESSAGES;
+
+	t3 = NULL;
+	if (nargs >= 4) {	/* fourth argument */
+		t3 = POP_STRING();
+		domain = t3->stptr;
+		save = domain[t3->stlen];
+		domain[t3->stlen] = '\0';
+		saved_end = true;
+	} else
+		domain = TEXTDOMAIN;
+#else
+	if (nargs == 5) {
+		tmp = POP_STRING();
+		DEREF(tmp);
+	}
+	if (nargs >= 4) {
+		t3 = POP_STRING();
+		DEREF(t3);
+	}
+#endif
+
+	t2 = POP_NUMBER();	/* third argument */
+	d = get_number_d(t2);
+	DEREF(t2);
+
+	number = (unsigned long) double_to_int(d);
+	t2 = POP_STRING();	/* second argument */
+	string2 = t2->stptr;
+	t1 = POP_STRING();	/* first argument */
+	string1 = t1->stptr;
+
+#if ENABLE_NLS && defined(LC_MESSAGES) && HAVE_DCGETTEXT
+
+	str_terminate(t1, save1);
+	str_terminate(t2, save2);
+	the_result = dcngettext(domain, string1, string2, number, lc_cat);
+	reslen = strlen(the_result);
+	str_restore(t1, save1);
+	str_restore(t2, save2);
+	if (saved_end)
+		domain[t3->stlen] = save;
+	if (t3 != NULL)
+		DEREF(t3);
+#else
+	if (number == 1) {
+		the_result = string1;
+		reslen = t1->stlen;
+	} else {
+		the_result = string2;
+		reslen = t2->stlen;
+	}
+#endif
+	DEREF(t1);
+	DEREF(t2);
+	return make_string(the_result, reslen);
+}
+
+/* do_bindtextdomain --- set the directory for a text domain */
+
+/*
+ * awk usage is
+ *
+ * 	binding = bindtextdomain(dir [, domain])
+ *
+ * If dir is "", pass NULL to C version.
+ * Default domain is TEXTDOMAIN.
+ */
+
+NODE *
+do_bindtextdomain(int nargs)
+{
+	NODE *t1, *t2;
+	const char *directory, *domain;
+	const char *the_result;
+
+	t1 = t2 = NULL;
+	/* set defaults */
+	directory = NULL;
+	domain = TEXTDOMAIN;
+	char save = '\0', save1 = '\0';
+
+	if (nargs == 2) {	/* second argument */
+		t2 = POP_STRING();
+		domain = (const char *) t2->stptr;
+		save = t2->stptr[t2->stlen];
+		t2->stptr[t2->stlen] = '\0';
+	}
+
+	/* first argument */
+	t1 = POP_STRING();
+	if (t1->stlen > 0) {
+		directory = (const char *) t1->stptr;
+		str_terminate(t1, save1);
+	}
+
+	the_result = bindtextdomain(domain, directory);
+	if (directory)
+		str_restore(t1, save1);
+
+	DEREF(t1);
+	if (t2 != NULL) {
+		t2->stptr[t2->stlen] = save;
+		DEREF(t2);
+	}
+
+	return make_string(the_result, strlen(the_result));
+}
+
+#ifdef SUPPLY_INTDIV
+/* do_intdiv --- do integer division, return quotient and remainder in dest array */
+
+/*
+ * We define the semantics as:
+ * 	numerator = int(numerator)
+ *	denominator = int(denonmator)
+ *	quotient = int(numerator / denomator)
+ *	remainder = int(numerator % denomator)
+ */
+
+NODE *
+do_intdiv(int nargs)
+{
+	NODE *numerator, *denominator, *result;
+	double num, denom, quotient, remainder;
+
+	result = POP_PARAM();
+	if (result->type != Node_var_array)
+		fatal(_("intdiv: third argument is not an array"));
+	assoc_clear(result);
+
+	denominator = POP_SCALAR();
+	numerator = POP_SCALAR();
+
+	if (do_lint) {
+		if ((fixtype(numerator)->flags & NUMBER) == 0)
+			lintwarn(_("intdiv: received non-numeric first argument"));
+		if ((fixtype(denominator)->flags & NUMBER) == 0)
+			lintwarn(_("intdiv: received non-numeric second argument"));
+	}
+
+	(void) force_number(numerator);
+	(void) force_number(denominator);
+	num = double_to_int(get_number_d(numerator));
+	denom = double_to_int(get_number_d(denominator));
+
+	if (denom == 0.0)
+		fatal(_("intdiv: division by zero attempted"));
+
+	quotient = double_to_int(num / denom);
+	/*
+	 * FIXME: This code is duplicated, factor it out to a
+	 * separate function.
+	 */
+#ifdef HAVE_FMOD
+	remainder = fmod(num, denom);
+#else	/* ! HAVE_FMOD */
+	(void) modf(num / denom, & remainder);
+	remainder = num - remainder * denom;
+#endif	/* ! HAVE_FMOD */
+	remainder = double_to_int(remainder);
+
+	assoc_set(result, make_string("quotient", 8), make_number((AWKNUM) quotient));
+
+	assoc_set(result, make_string("remainder", 9), make_number((AWKNUM) remainder));
+
+	DEREF(denominator);
+	DEREF(numerator);
+
+	return make_number((AWKNUM) 0.0);
+}
+#endif /* SUPPLY_INTDIV */
+
+/* do_typeof --- return a string with the type of the arg */
+
+NODE *
+do_typeof(int nargs)
+{
+	NODE *arg;
+	char *res = NULL;
+	bool deref = true;
+	NODE *dbg;
+
+	if (nargs == 2) {	/* 2nd optional arg for debugging */
+		dbg = POP_PARAM();
+		if (dbg->type != Node_var_array)
+			fatal(_("typeof: second argument is not an array"));
+		assoc_clear(dbg);
+	}
+	else
+		dbg = NULL;
+	arg = POP();
+	switch (arg->type) {
+	case Node_var_array:
+		/* Node_var_array is never UPREF'ed */
+		res = "array";
+		deref = false;
+		if (dbg)
+			assoc_set(dbg, make_string("array_type", 10), make_string(arg->array_funcs->name, strlen(arg->array_funcs->name)));
+		break;
+	case Node_val:
+		switch (fixtype(arg)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) {
+		case NUMBER:
+			res = "number";
+			break;
+		case NUMBER|USER_INPUT:
+			res = "strnum";
+			break;
+		case REGEX:
+			res = "regexp";
+			break;
+		case STRING:
+			res = "string";
+			// fall through
+		case NUMBER|STRING:
+			if (arg == Nnull_string || (arg->flags & NULL_FIELD) != 0) {
+				res = "unassigned";
+				break;
+			}
+			/* fall through */
+		default:
+			if (res == NULL) {
+				warning(_("typeof detected invalid flags combination `%s'; please file a bug report."), flags2str(arg->flags));
+				res = "unknown";
+			}
+			break;
+		}
+		if (dbg) {
+			const char *s = flags2str(arg->flags);
+			assoc_set(dbg, make_string("flags", 5), make_string(s, strlen(s)));
+		}
+		break;
+	case Node_var_new:
+		res = "untyped";
+		deref = false;
+		break;
+	case Node_var:
+		/*
+		 * Note: this doesn't happen because the function calling code
+		 * in interpret.h pushes Node_var->var_value.
+		 */
+		fatal(_("typeof: invalid argument type `%s'"),
+				nodetype2str(arg->type));
+		break;
+	default:
+		fatal(_("typeof: unknown argument type `%s'"),
+				nodetype2str(arg->type));
+		break;
+	}
+
+	if (deref)
+		DEREF(arg);
+	return make_string(res, strlen(res));
+}
+
+/* mbc_byte_count --- return number of bytes for corresponding numchars multibyte characters */
+
+static size_t
+mbc_byte_count(const char *ptr, size_t numchars)
+{
+	mbstate_t cur_state;
+	size_t sum = 0;
+	int mb_len;
+
+	memset(& cur_state, 0, sizeof(cur_state));
+
+	assert(gawk_mb_cur_max > 1);
+	mb_len = mbrlen(ptr, numchars * gawk_mb_cur_max, &cur_state);
+	if (mb_len <= 0)
+		return numchars;	/* no valid m.b. char */
+
+	for (; numchars > 0; numchars--) {
+		mb_len = mbrlen(ptr, numchars * gawk_mb_cur_max, &cur_state);
+		if (mb_len <= 0)
+			break;
+		sum += mb_len;
+		ptr += mb_len;
+	}
+
+	return sum;
+}
+
+/* mbc_char_count --- return number of m.b. chars in string, up to numbytes bytes */
+
+static size_t
+mbc_char_count(const char *ptr, size_t numbytes)
+{
+	mbstate_t cur_state;
+	size_t sum = 0;
+	int mb_len;
+
+	if (gawk_mb_cur_max == 1)
+		return numbytes;
+
+	memset(& cur_state, 0, sizeof(cur_state));
+
+	mb_len = mbrlen(ptr, numbytes, &cur_state);
+	if (mb_len <= 0)
+		return numbytes;	/* no valid m.b. char */
+
+	while (numbytes > 0) {
+		mb_len = mbrlen(ptr, numbytes, &cur_state);
+		if (mb_len <= 0)
+			break;
+		sum++;
+		ptr += mb_len;
+		numbytes -= mb_len;
+	}
+
+	return sum;
+}
+
+/* sanitize_exit_status --- convert a 16 bit Unix exit status into something reasonable */
+
+int sanitize_exit_status(int status)
+{
+	int ret = 0;
+
+	if (WIFEXITED(status))
+		ret = WEXITSTATUS(status); /* normal exit */
+	else if (WIFSIGNALED(status)) {
+		bool coredumped = false;
+#ifdef WCOREDUMP
+		coredumped = WCOREDUMP(status);
+#endif
+		/* use 256 since exit values are 8 bits */
+		ret = WTERMSIG(status) + (coredumped ? 512 : 256);
+	} else
+		ret = 0;	/* shouldn't get here */
+
+	return ret;
+}
+
+/* out_of_range --- return true if a value is out of range */
+
+bool
+out_of_range(NODE *n)
+{
+#ifdef HAVE_MPFR
+	if (is_mpg_integer(n))
+		return false;
+	else if (is_mpg_float(n))
+		return (! mpfr_number_p(n->mpg_numbr));
+	else
+#endif
+		return (isnan(n->numbr) || isinf(n->numbr));
+}
+
+/* format_nan_inf --- format NaN and INF values */
+
+char *
+format_nan_inf(NODE *n, char format)
+{
+	static char buf[100];
+
+#ifdef HAVE_MPFR
+	if (is_mpg_integer(n))
+		return NULL;
+	else if (is_mpg_float(n)) {
+		if (mpfr_nan_p(n->mpg_numbr)) {
+			strcpy(buf, mpfr_sgn(n->mpg_numbr) < 0 ? "-nan" : "+nan");
+
+			goto fmt;
+		} else if (mpfr_inf_p(n->mpg_numbr)) {
+			strcpy(buf, mpfr_sgn(n->mpg_numbr) < 0 ? "-inf" : "+inf");
+
+			goto fmt;
+		} else
+			return NULL;
+	}
+	/* else
+		fallthrough */
+#endif
+	double val = n->numbr;
+
+	if (isnan(val)) {
+		strcpy(buf, signbit(val) != 0 ? "-nan" : "+nan");
+
+		// fall through to end
+	} else if (isinf(val)) {
+		strcpy(buf, val < 0 ? "-inf" : "+inf");
+
+		// fall through to end
+	} else
+		return NULL;
+
+#ifdef HAVE_MPFR
+fmt:
+#endif
+	if (isupper(format)) {
+		int i;
+
+		for (i = 0; buf[i] != '\0'; i++)
+			buf[i] = toupper(buf[i]);
+	}
+	return buf;
+}
diff --git a/gawk-5.0.1/cint_array.c b/gawk-5.0.1/cint_array.c
new file mode 100644
index 00000000000..417f27d56e2
--- /dev/null
+++ b/gawk-5.0.1/cint_array.c
@@ -0,0 +1,1315 @@
+/*
+ * cint_array.c - routines for arrays of (mostly) consecutive positive integer indices.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2013, 2016, 2017, 2019,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+#define INT32_BIT 32
+
+extern FILE *output_fp;
+extern void indent(int indent_level);
+extern NODE **is_integer(NODE *symbol, NODE *subs);
+
+/*
+ * NHAT         ---  maximum size of a leaf array (2^NHAT).
+ * THRESHOLD    ---  Maximum capacity waste; THRESHOLD >= 2^(NHAT + 1).
+ */
+
+static int NHAT = 10;
+static long THRESHOLD;
+
+/*
+ * What is the optimium NHAT ? timing results suggest that 10 is a good choice,
+ * although differences aren't that significant for > 10.
+ */
+
+
+static NODE **cint_array_init(NODE *symbol, NODE *subs);
+static NODE **is_uinteger(NODE *symbol, NODE *subs);
+static NODE **cint_lookup(NODE *symbol, NODE *subs);
+static NODE **cint_exists(NODE *symbol, NODE *subs);
+static NODE **cint_clear(NODE *symbol, NODE *subs);
+static NODE **cint_remove(NODE *symbol, NODE *subs);
+static NODE **cint_list(NODE *symbol, NODE *t);
+static NODE **cint_copy(NODE *symbol, NODE *newsymb);
+static NODE **cint_dump(NODE *symbol, NODE *ndump);
+#ifdef ARRAYDEBUG
+static void cint_print(NODE *symbol);
+#endif
+
+const array_funcs_t cint_array_func = {
+	"cint",
+	cint_array_init,
+	is_uinteger,
+	cint_lookup,
+	cint_exists,
+	cint_clear,
+	cint_remove,
+	cint_list,
+	cint_copy,
+	cint_dump,
+	(afunc_t) 0,
+};
+
+
+static NODE **argv_store(NODE *symbol, NODE *subs);
+
+/* special case for ARGV in sandbox mode */
+const array_funcs_t argv_array_func = {
+	"argv",
+	cint_array_init,
+	is_uinteger,
+	cint_lookup,
+	cint_exists,
+	cint_clear,
+	cint_remove,
+	cint_list,
+	cint_copy,
+	cint_dump,
+	argv_store,
+};
+
+static inline int cint_hash(long k);
+static inline NODE **cint_find(NODE *symbol, long k, int h1);
+
+static inline NODE *make_node(NODETYPE type);
+
+static NODE **tree_lookup(NODE *symbol, NODE *tree, long k, int m, long base);
+static NODE **tree_exists(NODE *tree, long k);
+static void tree_clear(NODE *tree);
+static int tree_remove(NODE *symbol, NODE *tree, long k);
+static void tree_copy(NODE *newsymb, NODE *tree, NODE *newtree);
+static long tree_list(NODE *tree, NODE **list, assoc_kind_t assoc_kind);
+static inline NODE **tree_find(NODE *tree, long k, int i);
+static void tree_info(NODE *tree, NODE *ndump, const char *aname);
+static size_t tree_kilobytes(NODE *tree);
+#ifdef ARRAYDEBUG
+static void tree_print(NODE *tree, size_t bi, int indent_level);
+#endif
+
+static inline NODE **leaf_lookup(NODE *symbol, NODE *array, long k, long size, long base);
+static inline NODE **leaf_exists(NODE *array, long k);
+static void leaf_clear(NODE *array);
+static int leaf_remove(NODE *symbol, NODE *array, long k);
+static void leaf_copy(NODE *newsymb, NODE *array, NODE *newarray);
+static long leaf_list(NODE *array, NODE **list, assoc_kind_t assoc_kind);
+static void leaf_info(NODE *array, NODE *ndump, const char *aname);
+#ifdef ARRAYDEBUG
+static void leaf_print(NODE *array, size_t bi, int indent_level);
+#endif
+
+/* powers of 2 table upto 2^30 */
+static const long power_two_table[] = {
+	1, 2, 4, 8, 16, 32, 64,
+	128, 256, 512, 1024, 2048, 4096,
+	8192, 16384, 32768, 65536, 131072, 262144,
+	524288, 1048576, 2097152, 4194304, 8388608, 16777216,
+	33554432, 67108864, 134217728, 268435456, 536870912, 1073741824
+};
+
+
+#define ISUINT(a, s)	((((s)->flags & NUMINT) != 0 || is_integer(a, s) != NULL) \
+                                    && (s)->numbr >= 0)
+
+/*
+ * To store 2^n integers, allocate top-level array of size n, elements
+ * of which are 1-Dimensional (leaf-array) of geometrically increasing
+ * size (power of 2).
+ *
+ *  [0]   -->  [ 0 ]
+ *  [1]   -->  [ 1 ]
+ *  |2|   -->  [ 2 | 3 ]
+ *  |3|   -->  [ 4 | 5 | 6 | 7 ]
+ *  |.|
+ *  |k|   -->  [ 2^(k - 1)| ...  | 2^k - 1 ]
+ *  ...
+ *
+ * For a given integer n (> 0), the leaf-array is at 1 + floor(log2(n)).
+ *
+ * The idea for the geometrically increasing array sizes is from:
+ * 	Fast Functional Lists, Hash-Lists, Deques and Variable Length Arrays.
+ * 	Bagwell, Phil (2002).
+ * 	http://infoscience.epfl.ch/record/64410/files/techlists.pdf
+ *
+ * Disadvantage:
+ * Worst case memory waste > 99% and will happen when each of the
+ * leaf arrays contains only a single element. Even with consecutive
+ * integers, memory waste can be as high as 50%.
+ *
+ * Solution: Hashed Array Trees (HATs).
+ *
+ */
+
+/* cint_array_init ---  array initialization routine */
+
+static NODE **
+cint_array_init(NODE *symbol ATTRIBUTE_UNUSED, NODE *subs ATTRIBUTE_UNUSED)
+{
+	if (symbol == NULL) {
+		long newval;
+		size_t nelems = (sizeof(power_two_table) / sizeof(power_two_table[0]));
+
+		/* check relevant environment variables */
+		if ((newval = getenv_long("NHAT")) > 1 && newval < INT32_BIT)
+			NHAT = newval;
+		/* don't allow overflow off the end of the table */
+		if (NHAT >= nelems)
+			NHAT = nelems - 2;
+		THRESHOLD = power_two_table[NHAT + 1];
+	} else
+		null_array(symbol);
+
+	return & success_node;
+}
+
+
+/* is_uinteger --- test if the subscript is an integer >= 0 */
+
+NODE **
+is_uinteger(NODE *symbol, NODE *subs)
+{
+	if (is_integer(symbol, subs) != NULL && subs->numbr >= 0)
+		return & success_node;
+	return NULL;
+}
+
+
+/* cint_lookup --- Find the subscript in the array; Install it if it isn't there. */
+
+static NODE **
+cint_lookup(NODE *symbol, NODE *subs)
+{
+	NODE **lhs;
+	long k;
+	int h1 = -1, m, li;
+	NODE *tn, *xn;
+	long cint_size, capacity;
+
+	k = -1;
+	if (ISUINT(symbol, subs)) {
+		k = subs->numbr;	/* k >= 0 */
+		h1 = cint_hash(k);	/* h1 >= NHAT */
+		if ((lhs = cint_find(symbol, k, h1)) != NULL)
+			return lhs;
+	}
+	xn = symbol->xarray;
+	if (xn != NULL && (lhs = xn->aexists(xn, subs)) != NULL)
+		return lhs;
+
+	/* It's not there, install it */
+
+	if (k < 0)
+		goto xinstall;
+
+	m = h1 - 1;	/* m >= (NHAT- 1) */
+
+	/* Estimate capacity upper bound.
+	 * capacity upper bound = current capacity + leaf array size.
+	 */
+	li = m > NHAT ? m : NHAT;
+	while (li >= NHAT) {
+		/* leaf-array of a HAT */
+		li = (li + 1) / 2;
+	}
+	capacity = symbol->array_capacity + power_two_table[li];
+
+	cint_size = (xn == NULL) ? symbol->table_size
+				: (symbol->table_size - xn->table_size);
+	assert(cint_size >= 0);
+	if ((capacity - cint_size) > THRESHOLD)
+		goto xinstall;
+
+	if (symbol->nodes == NULL) {
+		symbol->array_capacity = 0;
+		assert(symbol->table_size == 0);
+
+		/* nodes[0] .. nodes[NHAT- 1] not used */
+		ezalloc(symbol->nodes, NODE **, INT32_BIT * sizeof(NODE *), "cint_lookup");
+	}
+
+	symbol->table_size++;	/* one more element in array */
+
+	tn = symbol->nodes[h1];
+	if (tn == NULL) {
+		tn = make_node(Node_array_tree);
+		symbol->nodes[h1] = tn;
+	}
+
+	if (m < NHAT)
+		return tree_lookup(symbol, tn, k, NHAT, 0);
+	return tree_lookup(symbol, tn, k, m, power_two_table[m]);
+
+xinstall:
+
+	symbol->table_size++;
+	if (xn == NULL) {
+		xn = symbol->xarray = make_array();
+		xn->vname = symbol->vname;	/* shallow copy */
+
+		/*
+		 * Avoid using assoc_lookup(xn, subs) which may lead
+		 * to infinite recursion.
+		 */
+
+		if (is_integer(xn, subs))
+			xn->array_funcs = & int_array_func;
+		else
+			xn->array_funcs = & str_array_func;
+		xn->flags |= XARRAY;
+	}
+	return xn->alookup(xn, subs);
+}
+
+
+/* cint_exists --- test whether an index is in the array or not. */
+
+static NODE **
+cint_exists(NODE *symbol, NODE *subs)
+{
+	NODE *xn;
+
+	if (ISUINT(symbol, subs)) {
+		long k = subs->numbr;
+		NODE **lhs;
+		if ((lhs = cint_find(symbol, k, cint_hash(k))) != NULL)
+			return lhs;
+	}
+	if ((xn = symbol->xarray) == NULL)
+		return NULL;
+	return xn->aexists(xn, subs);
+}
+
+
+/* cint_clear --- flush all the values in symbol[] */
+
+static NODE **
+cint_clear(NODE *symbol, NODE *subs ATTRIBUTE_UNUSED)
+{
+	size_t i;
+	NODE *tn;
+
+	assert(symbol->nodes != NULL);
+
+	if (symbol->xarray != NULL) {
+		NODE *xn = symbol->xarray;
+		assoc_clear(xn);
+		freenode(xn);
+		symbol->xarray = NULL;
+	}
+
+	for (i = NHAT; i < INT32_BIT; i++) {
+		tn = symbol->nodes[i];
+		if (tn != NULL) {
+			tree_clear(tn);
+			freenode(tn);
+		}
+	}
+
+	efree(symbol->nodes);
+	symbol->ainit(symbol, NULL);	/* re-initialize symbol */
+	return NULL;
+}
+
+
+/* cint_remove --- remove an index from the array */
+
+static NODE **
+cint_remove(NODE *symbol, NODE *subs)
+{
+	long k;
+	int h1;
+	NODE *tn, *xn = symbol->xarray;
+
+	if (symbol->table_size == 0)
+		return NULL;
+
+	if (! ISUINT(symbol, subs))
+		goto xremove;
+
+	assert(symbol->nodes != NULL);
+
+	k = subs->numbr;
+	h1 = cint_hash(k);
+	tn = symbol->nodes[h1];
+	if (tn == NULL || ! tree_remove(symbol, tn, k))
+		goto xremove;
+
+	if (tn->table_size == 0) {
+		freenode(tn);
+		symbol->nodes[h1] = NULL;
+	}
+
+	symbol->table_size--;
+
+	if (xn == NULL && symbol->table_size == 0) {
+		efree(symbol->nodes);
+		symbol->ainit(symbol, NULL);	/* re-initialize array 'symbol' */
+	} else if(xn != NULL && symbol->table_size == xn->table_size) {
+		/* promote xn to symbol */
+
+		xn->flags &= ~XARRAY;
+		xn->parent_array = symbol->parent_array;
+		efree(symbol->nodes);
+		*symbol = *xn;
+		freenode(xn);
+	}
+
+	return & success_node;
+
+xremove:
+	xn = symbol->xarray;
+	if (xn == NULL || xn->aremove(xn, subs) == NULL)
+		return NULL;
+	if (xn->table_size == 0) {
+		freenode(xn);
+		symbol->xarray = NULL;
+	}
+	symbol->table_size--;
+	assert(symbol->table_size > 0);
+
+	return & success_node;
+}
+
+
+/* cint_copy --- duplicate input array "symbol" */
+
+static NODE **
+cint_copy(NODE *symbol, NODE *newsymb)
+{
+	NODE **old, **new;
+	size_t i;
+
+	assert(symbol->nodes != NULL);
+
+	/* allocate new table */
+	ezalloc(new, NODE **, INT32_BIT * sizeof(NODE *), "cint_copy");
+
+	old = symbol->nodes;
+	for (i = NHAT; i < INT32_BIT; i++) {
+		if (old[i] == NULL)
+			continue;
+		new[i] = make_node(Node_array_tree);
+		tree_copy(newsymb, old[i], new[i]);
+	}
+
+	if (symbol->xarray != NULL) {
+		NODE *xn, *n;
+		xn = symbol->xarray;
+		n = make_array();
+		n->vname = newsymb->vname;
+		(void) xn->acopy(xn, n);
+		newsymb->xarray = n;
+	} else
+		newsymb->xarray = NULL;
+
+	newsymb->nodes = new;
+	newsymb->table_size = symbol->table_size;
+	newsymb->array_capacity = symbol->array_capacity;
+	newsymb->flags = symbol->flags;
+
+	return NULL;
+}
+
+
+/* cint_list --- return a list of items */
+
+static NODE**
+cint_list(NODE *symbol, NODE *t)
+{
+	NODE **list = NULL;
+	NODE *tn, *xn;
+	unsigned long k = 0, num_elems, list_size;
+	size_t j, ja, jd;
+	int elem_size = 1;
+	assoc_kind_t assoc_kind;
+
+	num_elems = symbol->table_size;
+	if (num_elems == 0)
+		return NULL;
+	assoc_kind = (assoc_kind_t) t->flags;
+	if ((assoc_kind & (AINDEX|AVALUE|ADELETE)) == (AINDEX|ADELETE))
+		num_elems = 1;
+
+	if ((assoc_kind & (AINDEX|AVALUE)) == (AINDEX|AVALUE))
+		elem_size = 2;
+	list_size = num_elems * elem_size;
+
+	if (symbol->xarray != NULL) {
+		xn = symbol->xarray;
+		list = xn->alist(xn, t);
+		assert(list != NULL);
+		assoc_kind &= ~(AASC|ADESC);
+		t->flags = (unsigned int) assoc_kind;
+		if (num_elems == 1 || num_elems == xn->table_size)
+			return list;
+		erealloc(list, NODE **, list_size * sizeof(NODE *), "cint_list");
+		k = elem_size * xn->table_size;
+	} else
+		emalloc(list, NODE **, list_size * sizeof(NODE *), "cint_list");
+
+	if ((assoc_kind & AINUM) == 0) {
+		/* not sorting by "index num" */
+		assoc_kind &= ~(AASC|ADESC);
+		t->flags = (unsigned int) assoc_kind;
+	}
+
+	/* populate it with index in ascending or descending order */
+
+	for (ja = NHAT, jd = INT32_BIT - 1; ja < INT32_BIT && jd >= NHAT; ) {
+		j = (assoc_kind & ADESC) != 0 ? jd-- : ja++;
+		tn = symbol->nodes[j];
+		if (tn == NULL)
+			continue;
+		k += tree_list(tn, list + k, assoc_kind);
+		if (k >= list_size)
+			return list;
+	}
+	return list;
+}
+
+
+/* cint_dump --- dump array info */
+
+static NODE **
+cint_dump(NODE *symbol, NODE *ndump)
+{
+	NODE *tn, *xn = NULL;
+	int indent_level;
+	size_t i;
+	long cint_size = 0, xsize = 0;
+	AWKNUM kb = 0;
+	extern AWKNUM int_kilobytes(NODE *symbol);
+	extern AWKNUM str_kilobytes(NODE *symbol);
+
+	indent_level = ndump->alevel;
+
+	if (symbol->xarray != NULL) {
+		xn = symbol->xarray;
+		xsize = xn->table_size;
+	}
+	cint_size = symbol->table_size - xsize;
+
+	if ((symbol->flags & XARRAY) == 0)
+		fprintf(output_fp, "%s `%s'\n",
+			(symbol->parent_array == NULL) ? "array" : "sub-array",
+			array_vname(symbol));
+	indent_level++;
+	indent(indent_level);
+	fprintf(output_fp, "array_func: cint_array_func\n");
+	if (symbol->flags != 0) {
+		indent(indent_level);
+		fprintf(output_fp, "flags: %s\n", flags2str(symbol->flags));
+	}
+	indent(indent_level);
+	fprintf(output_fp, "NHAT: %d\n", NHAT);
+	indent(indent_level);
+	fprintf(output_fp, "THRESHOLD: %ld\n", THRESHOLD);
+	indent(indent_level);
+	fprintf(output_fp, "table_size: %ld (total), %ld (cint), %ld (int + str)\n",
+				symbol->table_size, cint_size, xsize);
+	indent(indent_level);
+	fprintf(output_fp, "array_capacity: %lu\n", (unsigned long) symbol->array_capacity);
+	indent(indent_level);
+	fprintf(output_fp, "Load Factor: %.2g\n", (AWKNUM) cint_size / symbol->array_capacity);
+
+	for (i = NHAT; i < INT32_BIT; i++) {
+		tn = symbol->nodes[i];
+		if (tn == NULL)
+			continue;
+		/* Node_array_tree  + HAT */
+		kb += (sizeof(NODE) + tree_kilobytes(tn)) / 1024.0;
+	}
+	kb += (INT32_BIT * sizeof(NODE *)) / 1024.0;	/* symbol->nodes */
+	kb += (symbol->array_capacity * sizeof(NODE *)) / 1024.0;	/* value nodes in Node_array_leaf(s) */
+	if (xn != NULL) {
+		if (xn->array_funcs == & int_array_func)
+			kb += int_kilobytes(xn);
+		else
+			kb += str_kilobytes(xn);
+	}
+
+	indent(indent_level);
+	fprintf(output_fp, "memory: %.2g kB (total)\n", kb);
+
+	/* dump elements */
+
+	if (ndump->adepth >= 0) {
+		const char *aname;
+
+		fprintf(output_fp, "\n");
+		aname = make_aname(symbol);
+		for (i = NHAT; i < INT32_BIT; i++) {
+			tn = symbol->nodes[i];
+			if (tn != NULL)
+				tree_info(tn, ndump, aname);
+		}
+	}
+
+	if (xn != NULL) {
+		fprintf(output_fp, "\n");
+		xn->adump(xn, ndump);
+	}
+
+#ifdef ARRAYDEBUG
+	if (ndump->adepth < -999)
+		cint_print(symbol);
+#endif
+
+	return NULL;
+}
+
+
+/* cint_hash --- locate the HAT for a given number 'k' */
+
+static inline int
+cint_hash(long k)
+{
+	uint32_t num, r, shift;
+
+	assert(k >= 0);
+	if (k == 0)
+		return NHAT;
+	num = k;
+
+	/* Find the Floor(log base 2 of 32-bit integer) */
+
+	/*
+	 * Warren Jr., Henry S. (2002). Hacker's Delight.
+	 * Addison Wesley. pp. pp. 215. ISBN 978-0201914658.
+	 *
+	 *	r = 0;
+	 *	if (num >= 1<<16) { num >>= 16;	r += 16; }
+	 *	if (num >= 1<< 8) { num >>=  8;	r +=  8; }
+	 *	if (num >= 1<< 4) { num >>=  4;	r +=  4; }
+	 *	if (num >= 1<< 2) { num >>=  2;	r +=  2; }
+	 *	if (num >= 1<< 1) {		r +=  1; }
+	 */
+
+
+	/*
+	 * Slightly different code copied from:
+	 *
+	 * http://www-graphics.stanford.edu/~seander/bithacks.html
+	 * Bit Twiddling Hacks
+	 * By Sean Eron Anderson
+	 * seander@cs.stanford.edu
+	 * Individually, the code snippets here are in the public domain
+	 * (unless otherwise noted) --- feel free to use them however you please.
+	 * The aggregate collection and descriptions are (C) 1997-2005
+	 * Sean Eron Anderson. The code and descriptions are distributed in the
+	 * hope that they will be useful, but WITHOUT ANY WARRANTY and without
+	 * even the implied warranty of merchantability or fitness for a particular
+	 * purpose.
+	 *
+	 */
+
+	r = (num > 0xFFFF) << 4; num >>= r;
+	shift = (num > 0xFF) << 3; num >>= shift; r |= shift;
+	shift = (num > 0x0F) << 2; num >>= shift; r |= shift;
+	shift = (num > 0x03) << 1; num >>= shift; r |= shift;
+	r |= (num >> 1);
+
+	/* We use a single HAT for 0 <= num < 2^NHAT */
+	if (r < NHAT)
+		return NHAT;
+
+	return (1 + r);
+}
+
+
+/* cint_find --- locate the integer subscript */
+
+static inline NODE **
+cint_find(NODE *symbol, long k, int h1)
+{
+	NODE *tn;
+
+	if (symbol->nodes == NULL || (tn = symbol->nodes[h1]) == NULL)
+		return NULL;
+	return tree_exists(tn, k);
+}
+
+
+#ifdef ARRAYDEBUG
+
+/* cint_print --- print structural info */
+
+static void
+cint_print(NODE *symbol)
+{
+	NODE *tn;
+	size_t i;
+
+	fprintf(output_fp, "I[%4lu:%-4lu]\n", (unsigned long) INT32_BIT,
+				(unsigned long) symbol->table_size);
+	for (i = NHAT; i < INT32_BIT; i++) {
+		tn = symbol->nodes[i];
+		if (tn == NULL)
+			continue;
+		tree_print(tn, i, 1);
+	}
+}
+
+#endif
+
+
+/*------------------------ Hashed Array Trees -----------------------------*/
+
+/*
+ * HATs: Hashed Array Trees
+ * Fast variable-length arrays
+ * Edward Sitarski
+ * http://www.drdobbs.com/architecture-and-design/184409965
+ *
+ *  HAT has a top-level array containing a power of two
+ *  number of leaf arrays. All leaf arrays are the same size as the
+ *  top-level array. A full HAT can hold n^2 elements,
+ *  where n (some power of 2) is the size of each leaf array.
+ *  [i/n][i & (n - 1)] locates the `i th' element in a HAT.
+ *
+ */
+
+/*
+ *  A half HAT is defined here as a HAT with a top-level array of size n^2/2
+ *  and holds the first n^2/2 elements.
+ *
+ *   1. 2^8 elements can be stored in a full HAT of size 2^4.
+ *   2. 2^9 elements can be stored in a half HAT of size 2^5.
+ *   3. When the number of elements is some power of 2, it
+ *      can be stored in a full or a half HAT.
+ *   4. When the number of elements is some power of 2, it
+ *      can be stored in a HAT (full or half) with HATs as leaf elements
+ *      (full or half),  and so on (e.g. 2^8 elements in a HAT of size 2^4 (top-level
+ *      array dimension) with each leaf array being a HAT of size 2^2).
+ *
+ *  IMPLEMENTATION DETAILS:
+ *    1. A HAT of 2^12 elements needs 2^6 house-keeping NODEs
+ *       of Node_array_leaf.
+ *
+ *    2. A HAT of HATS of 2^12 elements needs
+ *       2^6 * (1 Node_array_tree + 2^3 Node_array_leaf)
+ *       ~ 2^9 house-keeping NODEs.
+ *
+ *    3. When a leaf array (or leaf HAT) becomes empty, the memory
+ *       is deallocated, and when there is no leaf array (or leaf HAT) left,
+ *       the HAT is deleted.
+ *
+ *    4. A HAT stores the base (first) element, and locates the leaf array/HAT
+ *       for the `i th' element using integer division
+ *       (i - base)/n where n is the size of the top-level array.
+ *
+ */
+
+/* make_node --- initialize a NODE */
+
+static inline NODE *
+make_node(NODETYPE type)
+{
+	NODE *n;
+	getnode(n);
+	memset(n, '\0', sizeof(NODE));
+	n->type = type;
+	return n;
+}
+
+
+/* tree_lookup --- Find an integer subscript in a HAT; Install it if it isn't there */
+
+static NODE **
+tree_lookup(NODE *symbol, NODE *tree, long k, int m, long base)
+{
+	NODE **lhs;
+	NODE *tn;
+	int i, n;
+	size_t size;
+	long num = k;
+
+	/*
+	 * HAT size (size of Top & Leaf array) = 2^n
+	 * where n = Floor ((m + 1)/2). For an odd value of m,
+	 * only the first half of the HAT is needed.
+	 */
+
+	n = (m + 1) / 2;
+
+	if (tree->table_size == 0) {
+		size_t actual_size;
+		NODE **table;
+
+		assert(tree->nodes == NULL);
+
+		/* initialize top-level array */
+		size = actual_size = power_two_table[n];
+		tree->array_base = base;
+		tree->array_size = size;
+		tree->table_size = 0;	/* # of elements in the array */
+		if (n > m/2) {
+			/* only first half of the array used */
+			actual_size /= 2;
+			tree->flags |= HALFHAT;
+		}
+		ezalloc(table, NODE **, actual_size * sizeof(NODE *), "tree_lookup");
+		tree->nodes = table;
+	} else
+		size = tree->array_size;
+
+	num -= tree->array_base;
+	i = num / size;	/* top-level array index */
+	assert(i >= 0);
+
+	if ((lhs = tree_find(tree, k, i)) != NULL)
+		return lhs;
+
+	/* It's not there, install it */
+
+	tree->table_size++;
+	base += (size * i);
+	tn = tree->nodes[i];
+	if (n > NHAT) {
+		if (tn == NULL)
+			tn = tree->nodes[i] = make_node(Node_array_tree);
+		return tree_lookup(symbol, tn, k, n, base);
+	} else {
+		if (tn == NULL)
+			tn = tree->nodes[i] = make_node(Node_array_leaf);
+		return leaf_lookup(symbol, tn, k, size, base);
+	}
+}
+
+
+/* tree_exists --- test whether integer subscript `k' exists or not */
+
+static NODE **
+tree_exists(NODE *tree, long k)
+{
+	int i;
+	NODE *tn;
+
+	i = (k - tree->array_base) / tree->array_size;
+	assert(i >= 0);
+	tn = tree->nodes[i];
+	if (tn == NULL)
+		return NULL;
+	if (tn->type == Node_array_tree)
+		return tree_exists(tn, k);
+	return leaf_exists(tn, k);
+}
+
+/* tree_clear --- flush all the values */
+
+static void
+tree_clear(NODE *tree)
+{
+	NODE *tn;
+	size_t	j, hsize;
+
+	hsize = tree->array_size;
+	if ((tree->flags & HALFHAT) != 0)
+		hsize /= 2;
+
+	for (j = 0; j < hsize; j++) {
+		tn = tree->nodes[j];
+		if (tn == NULL)
+			continue;
+		if (tn->type == Node_array_tree)
+			tree_clear(tn);
+		else
+			leaf_clear(tn);
+		freenode(tn);
+	}
+
+	efree(tree->nodes);
+	memset(tree, '\0', sizeof(NODE));
+	tree->type = Node_array_tree;
+}
+
+
+/* tree_remove --- If the integer subscript is in the HAT, remove it */
+
+static int
+tree_remove(NODE *symbol, NODE *tree, long k)
+{
+	int i;
+	NODE *tn;
+
+	i = (k - tree->array_base) / tree->array_size;
+	assert(i >= 0);
+	tn = tree->nodes[i];
+	if (tn == NULL)
+		return false;
+
+	if (tn->type == Node_array_tree
+			&& ! tree_remove(symbol, tn, k))
+		return false;
+	else if (tn->type == Node_array_leaf
+			&& ! leaf_remove(symbol, tn, k))
+		return false;
+
+	if (tn->table_size == 0) {
+		freenode(tn);
+		tree->nodes[i] = NULL;
+	}
+
+	/* one less item in array */
+	if (--tree->table_size == 0) {
+		efree(tree->nodes);
+		memset(tree, '\0', sizeof(NODE));
+		tree->type = Node_array_tree;
+	}
+	return true;
+}
+
+
+/* tree_find --- locate an interger subscript in the HAT */
+
+static inline NODE **
+tree_find(NODE *tree, long k, int i)
+{
+	NODE *tn;
+
+	assert(tree->nodes != NULL);
+	tn = tree->nodes[i];
+	if (tn != NULL) {
+		if (tn->type == Node_array_tree)
+			return tree_exists(tn, k);
+		return leaf_exists(tn, k);
+	}
+	return NULL;
+}
+
+
+/* tree_list --- return a list of items in the HAT */
+
+static long
+tree_list(NODE *tree, NODE **list, assoc_kind_t assoc_kind)
+{
+	NODE *tn;
+	size_t j, cj, hsize;
+	long k = 0;
+
+	assert(list != NULL);
+
+	hsize = tree->array_size;
+	if ((tree->flags & HALFHAT) != 0)
+		hsize /= 2;
+
+	for (j = 0; j < hsize; j++) {
+		cj = (assoc_kind & ADESC) != 0 ? (hsize - 1 - j) : j;
+		tn = tree->nodes[cj];
+		if (tn == NULL)
+			continue;
+		if (tn->type == Node_array_tree)
+			k += tree_list(tn, list + k, assoc_kind);
+		else
+			k += leaf_list(tn, list + k, assoc_kind);
+		if ((assoc_kind & ADELETE) != 0 && k >= 1)
+			return k;
+	}
+	return k;
+}
+
+
+/* tree_copy --- duplicate a HAT */
+
+static void
+tree_copy(NODE *newsymb, NODE *tree, NODE *newtree)
+{
+	NODE **old, **new;
+	size_t j, hsize;
+
+	hsize = tree->array_size;
+	if ((tree->flags & HALFHAT) != 0)
+		hsize /= 2;
+
+	ezalloc(new, NODE **, hsize * sizeof(NODE *), "tree_copy");
+	newtree->nodes = new;
+	newtree->array_base = tree->array_base;
+	newtree->array_size = tree->array_size;
+	newtree->table_size = tree->table_size;
+	newtree->flags = tree->flags;
+
+	old = tree->nodes;
+	for (j = 0; j < hsize; j++) {
+		if (old[j] == NULL)
+			continue;
+		if (old[j]->type == Node_array_tree) {
+			new[j] = make_node(Node_array_tree);
+			tree_copy(newsymb, old[j], new[j]);
+		} else {
+			new[j] = make_node(Node_array_leaf);
+			leaf_copy(newsymb, old[j], new[j]);
+		}
+	}
+}
+
+
+/* tree_info --- print index, value info */
+
+static void
+tree_info(NODE *tree, NODE *ndump, const char *aname)
+{
+	NODE *tn;
+	size_t j, hsize;
+
+	hsize = tree->array_size;
+	if ((tree->flags & HALFHAT) != 0)
+		hsize /= 2;
+
+	for (j = 0; j < hsize; j++) {
+		tn = tree->nodes[j];
+		if (tn == NULL)
+			continue;
+		if (tn->type == Node_array_tree)
+			tree_info(tn, ndump, aname);
+		else
+			leaf_info(tn, ndump, aname);
+	}
+}
+
+
+/* tree_kilobytes --- calculate memory consumption of a HAT */
+
+static size_t
+tree_kilobytes(NODE *tree)
+{
+	NODE *tn;
+	size_t j, hsize;
+	size_t sz = 0;
+
+	hsize = tree->array_size;
+	if ((tree->flags & HALFHAT) != 0)
+		hsize /= 2;
+	for (j = 0; j < hsize; j++) {
+		tn = tree->nodes[j];
+		if (tn == NULL)
+			continue;
+		sz += sizeof(NODE);	/* Node_array_tree or Node_array_leaf */
+		if (tn->type == Node_array_tree)
+			sz += tree_kilobytes(tn);
+	}
+	sz += hsize * sizeof(NODE *);	/* tree->nodes */
+	return sz;
+}
+
+#ifdef ARRAYDEBUG
+
+/* tree_print --- print the HAT structures */
+
+static void
+tree_print(NODE *tree, size_t bi, int indent_level)
+{
+	NODE *tn;
+	size_t j, hsize;
+
+	indent(indent_level);
+
+	hsize = tree->array_size;
+	if ((tree->flags & HALFHAT) != 0)
+		hsize /= 2;
+	fprintf(output_fp, "%4lu:%s[%4lu:%-4lu]\n",
+			(unsigned long) bi,
+			(tree->flags & HALFHAT) != 0 ? "HH" : "H",
+			(unsigned long) hsize, (unsigned long) tree->table_size);
+
+	for (j = 0; j < hsize; j++) {
+		tn = tree->nodes[j];
+		if (tn == NULL)
+			continue;
+		if (tn->type == Node_array_tree)
+			tree_print(tn, j, indent_level + 1);
+		else
+			leaf_print(tn, j, indent_level + 1);
+	}
+}
+#endif
+
+/*--------------------- leaf (linear 1-D) array --------------------*/
+
+/*
+ * leaf_lookup --- find an integer subscript in the array; Install it if
+ *	it isn't there.
+ */
+
+static inline NODE **
+leaf_lookup(NODE *symbol, NODE *array, long k, long size, long base)
+{
+	NODE **lhs;
+
+	if (array->nodes == NULL) {
+		array->table_size = 0;	/* sanity */
+		array->array_size = size;
+		array->array_base = base;
+		ezalloc(array->nodes, NODE **, size * sizeof(NODE *), "leaf_lookup");
+		symbol->array_capacity += size;
+	}
+
+	lhs = array->nodes + (k - base); /* leaf element */
+	if (*lhs == NULL) {
+		array->table_size++;	/* one more element in leaf array */
+		*lhs = dupnode(Nnull_string);
+	}
+	return lhs;
+}
+
+
+/* leaf_exists --- check if the array contains an integer subscript */
+
+static inline NODE **
+leaf_exists(NODE *array, long k)
+{
+	NODE **lhs;
+	lhs = array->nodes + (k - array->array_base);
+	return (*lhs != NULL) ? lhs : NULL;
+}
+
+
+/* leaf_clear --- flush all values in the array */
+
+static void
+leaf_clear(NODE *array)
+{
+	long i, size = array->array_size;
+	NODE *r;
+
+	for (i = 0; i < size; i++) {
+		r = array->nodes[i];
+		if (r == NULL)
+			continue;
+		if (r->type == Node_var_array) {
+			assoc_clear(r);		/* recursively clear all sub-arrays */
+			efree(r->vname);
+			freenode(r);
+		} else
+			unref(r);
+	}
+	efree(array->nodes);
+	array->nodes = NULL;
+	array->array_size = array->table_size = 0;
+}
+
+
+/* leaf_remove --- remove an integer subscript from the array */
+
+static int
+leaf_remove(NODE *symbol, NODE *array, long k)
+{
+	NODE **lhs;
+
+	lhs = array->nodes + (k - array->array_base);
+	if (*lhs == NULL)
+		return false;
+	*lhs = NULL;
+	if (--array->table_size == 0) {
+		efree(array->nodes);
+		array->nodes = NULL;
+		symbol->array_capacity -= array->array_size;
+		array->array_size = 0;	/* sanity */
+	}
+	return true;
+}
+
+
+/* leaf_copy --- duplicate a leaf array */
+
+static void
+leaf_copy(NODE *newsymb, NODE *array, NODE *newarray)
+{
+	NODE **old, **new;
+	long size, i;
+
+	size = array->array_size;
+	ezalloc(new, NODE **, size * sizeof(NODE *), "leaf_copy");
+	newarray->nodes = new;
+	newarray->array_size = size;
+	newarray->array_base = array->array_base;
+	newarray->flags = array->flags;
+	newarray->table_size = array->table_size;
+
+	old = array->nodes;
+	for (i = 0; i < size; i++) {
+		if (old[i] == NULL)
+			continue;
+		if (old[i]->type == Node_val)
+			new[i] = dupnode(old[i]);
+		else {
+			NODE *r;
+			r = make_array();
+			r->vname = estrdup(old[i]->vname, strlen(old[i]->vname));
+			r->parent_array = newsymb;
+			new[i] = assoc_copy(old[i], r);
+		}
+	}
+}
+
+
+/* leaf_list --- return a list of items */
+
+static long
+leaf_list(NODE *array, NODE **list, assoc_kind_t assoc_kind)
+{
+	NODE *r, *subs;
+	long num, i, ci, k = 0;
+	long size = array->array_size;
+	static char buf[100];
+
+	for (i = 0; i < size; i++) {
+		ci = (assoc_kind & ADESC) != 0 ? (size - 1 - i) : i;
+		r = array->nodes[ci];
+		if (r == NULL)
+			continue;
+
+		/* index */
+		num = array->array_base + ci;
+		if ((assoc_kind & AISTR) != 0) {
+			sprintf(buf, "%ld", num);
+			subs = make_string(buf, strlen(buf));
+			subs->numbr = num;
+			subs->flags |= (NUMCUR|NUMINT);
+		} else {
+			subs = make_number((AWKNUM) num);
+			subs->flags |= (INTIND|NUMINT);
+		}
+		list[k++] = subs;
+
+		/* value */
+		if ((assoc_kind & AVALUE) != 0) {
+			if (r->type == Node_val) {
+				if ((assoc_kind & AVNUM) != 0)
+					(void) force_number(r);
+				else if ((assoc_kind & AVSTR) != 0)
+					r = force_string(r);
+			}
+			list[k++] = r;
+		}
+		if ((assoc_kind & ADELETE) != 0 && k >= 1)
+			return k;
+	}
+
+	return k;
+}
+
+
+/* leaf_info --- print index, value info */
+
+static void
+leaf_info(NODE *array, NODE *ndump, const char *aname)
+{
+	NODE *subs, *val;
+	size_t i, size;
+
+	size = array->array_size;
+
+	subs = make_number((AWKNUM) 0.0);
+	subs->flags |= (INTIND|NUMINT);
+	for (i = 0; i < size; i++) {
+		val = array->nodes[i];
+		if (val == NULL)
+			continue;
+		subs->numbr = array->array_base + i;
+		assoc_info(subs, val, ndump, aname);
+	}
+	unref(subs);
+}
+
+#ifdef ARRAYDEBUG
+
+/* leaf_print --- print the leaf-array structure */
+
+
+static void
+leaf_print(NODE *array, size_t bi, int indent_level)
+{
+	indent(indent_level);
+	fprintf(output_fp, "%4lu:L[%4lu:%-4lu]\n",
+			(unsigned long) bi,
+			(unsigned long) array->array_size,
+			(unsigned long) array->table_size);
+}
+#endif
+
+static NODE *argv_shadow_array = NULL;
+
+/* argv_store --- post assign function for ARGV in sandbox mode */
+
+static NODE **
+argv_store(NODE *symbol, NODE *subs)
+{
+	NODE **val = cint_exists(symbol, subs);
+	NODE *newval = *val;
+	char *cp;
+
+	if (newval->stlen == 0)	// empty strings in ARGV are OK
+		return val;
+
+	if ((cp = strchr(newval->stptr, '=')) == NULL) {
+		if (! in_array(argv_shadow_array, newval))
+			fatal(_("cannot add a new file (%.*s) to ARGV in sandbox mode"),
+				(int) newval->stlen, newval->stptr);
+	} else {
+		// check if it's a valid variable assignment
+		bool badvar = false;
+		char *arg = newval->stptr;
+		char *cp2;
+
+		*cp = '\0';	// temporarily
+
+		if (! is_letter((unsigned char) arg[0]))
+			badvar = true;
+		else
+			for (cp2 = arg+1; *cp2; cp2++)
+				if (! is_identchar((unsigned char) *cp2) && *cp2 != ':') {
+					badvar = true;
+					break;
+				}
+
+		// further checks
+		if (! badvar) {
+			char *cp = strchr(arg, ':');
+			if (cp && (cp[1] != ':' || strchr(cp + 2, ':') != NULL))
+				badvar = true;
+		}
+		*cp = '=';	// restore the '='
+
+		if (badvar && ! in_array(argv_shadow_array, newval))
+			fatal(_("cannot add a new file (%.*s) to ARGV in sandbox mode"),
+				(int) newval->stlen, newval->stptr);
+
+		// otherwise, badvar is false, let it through as variable assignment
+	}
+	return val;
+}
+
+/* init_argv_array --- set up the pointers for ARGV in sandbox mode. A bit hacky. */
+
+void
+init_argv_array(NODE *argv_node, NODE *shadow_node)
+{
+	/* If POSIX simply don't reset the vtable and things work as before */
+	if (! do_sandbox)
+		return;
+
+	argv_node->array_funcs = & argv_array_func;
+	argv_shadow_array = shadow_node;
+}
diff --git a/gawk-5.0.1/cmd.h b/gawk-5.0.1/cmd.h
new file mode 100644
index 00000000000..375ea08b325
--- /dev/null
+++ b/gawk-5.0.1/cmd.h
@@ -0,0 +1,215 @@
+/*
+ * cmd.h - definitions for command parser
+ */
+
+/*
+ * Copyright (C) 2004, 2010, 2011, 2013, 2014, 2017,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_LIBREADLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+extern char **command_completion(const char *text, int start, int end);
+extern void initialize_pager(FILE *fp); /* debug.c */
+extern NODE *get_function(void);
+#else
+#define initialize_pager(x)		/* nothing */
+#define add_history(x)		/* nothing */
+#endif
+
+extern int gprintf(FILE *fp, const char *format, ...);
+extern jmp_buf pager_quit_tag;
+extern int pager_quit_tag_valid;
+
+extern bool output_is_tty;
+extern int input_fd;
+extern bool input_from_tty;
+extern FILE *out_fp;
+extern char *dbg_prompt;
+extern char *commands_prompt;
+extern char *eval_prompt;
+extern char *dgawk_prompt;
+
+enum argtype {
+	D_illegal,
+
+	/* commands */
+	D_backtrace,
+	D_break,
+	D_clear,
+	D_commands,
+	D_condition,
+	D_continue,
+	D_delete,
+	D_disable,
+	D_display,
+	D_down,
+	D_dump,
+	D_enable,
+	D_end,
+	D_eval,
+	D_finish,
+	D_frame,
+	D_help,
+	D_ignore,
+	D_info,
+	D_list,
+	D_next,
+	D_nexti,
+	D_option,
+	D_print,
+	D_printf,
+	D_quit,
+	D_return,
+	D_run,
+	D_save,
+	D_set,
+	D_silent,
+	D_source,
+	D_step,
+	D_stepi,
+	D_tbreak,
+	D_trace,
+	D_undisplay,
+	D_until,
+	D_unwatch,
+	D_up,
+	D_watch,
+
+	/* arguments */
+	D_argument,
+	D_int,
+	D_string,
+	D_variable,
+	D_node,
+	D_field,
+	D_array,
+	D_subscript,
+	D_func,
+	D_range
+};
+
+/* non-number arguments to commands */
+
+enum nametypeval {
+	A_NONE = 0,
+	A_ARGS,
+	A_BREAK,
+	A_DEL,
+	A_DISPLAY,
+	A_FRAME,
+	A_FUNCTIONS,
+	A_LOCALS,
+	A_ONCE,
+	A_SOURCE,
+	A_SOURCES,
+	A_TRACE_ON,
+	A_TRACE_OFF,
+	A_VARIABLES,
+	A_WATCH
+};
+
+typedef struct cmd_argument {
+	struct cmd_argument *next;
+	enum argtype type;
+	union {
+		long lval;
+		char *sval;
+		NODE *nodeval;
+	} value;
+
+#define a_int       value.lval	/* type = D_int or D_range */
+#define a_argument  value.lval	/* type = D_argument */
+#define a_string  value.sval	/* type = D_string, D_array, D_subscript or D_variable */
+#define a_node    value.nodeval /* type = D_node, D_field or D_func */
+
+	int a_count;		/* subscript count for D_subscript and D_array */
+} CMDARG;
+
+typedef int (*Func_cmd)(CMDARG *, int);
+
+struct cmdtoken {
+	const char *name;
+	char *abbrvn;	/* abbreviation */
+	enum argtype type;
+	int class;
+	Func_cmd cf_ptr;
+	const char *help_txt;
+};
+
+/* command.c */
+extern void free_cmdarg(CMDARG *list);
+extern Func_cmd get_command(int ctype);
+extern const char *get_command_name(int ctype);
+
+/* debug.c */
+extern void d_error(const char *mesg, ...);
+
+/* command.c */
+extern int find_option(char *name);
+extern void option_help(void);
+extern char *(*read_a_line)(const char *prompt);
+extern char *read_commands_string(const char *prompt);
+extern int in_cmd_src(const char *);
+extern int get_eof_status(void);
+extern void push_cmd_src(int fd, bool istty, char * (*readfunc)(const char *),
+		int (*closefunc)(int), int cmd, int eofstatus);
+extern int pop_cmd_src(void);
+extern int has_break_or_watch_point(int *pnum, bool any);
+extern int do_list(CMDARG *arg, int cmd);
+extern int do_info(CMDARG *arg, int cmd);
+extern int do_print_var(CMDARG *arg, int cmd);
+extern int do_backtrace(CMDARG *arg, int cmd);
+extern int do_breakpoint(CMDARG *arg, int cmd);
+extern int do_tmp_breakpoint(CMDARG *arg, int cmd);
+extern int do_delete_breakpoint(CMDARG *arg, int cmd);
+extern int do_enable_breakpoint(CMDARG *arg, int cmd);
+extern int do_disable_breakpoint(CMDARG *arg, int cmd) ;
+extern int do_ignore_breakpoint(CMDARG *arg, int cmd) ;
+extern int do_run(CMDARG *arg, int cmd);
+extern int do_quit(CMDARG *arg, int cmd);
+extern int do_continue(CMDARG *arg, int cmd);
+extern int do_step(CMDARG *arg, int cmd) ;
+extern int do_stepi(CMDARG *arg, int cmd) ;
+extern int do_next(CMDARG *arg, int cmd);
+extern int do_nexti(CMDARG *arg, int cmd);
+extern int do_clear(CMDARG *arg, int cmd);
+extern int do_finish(CMDARG *arg, int cmd) ;
+extern int do_help(CMDARG *arg, int cmd) ;
+extern int do_up(CMDARG *arg, int cmd);
+extern int do_down(CMDARG *arg, int cmd);
+extern int do_frame(CMDARG *arg, int cmd);
+extern int do_until(CMDARG *arg, int cmd);
+extern int do_set_var(CMDARG *arg, int cmd);
+extern int do_return(CMDARG *arg, int cmd);
+extern int do_display(CMDARG *arg, int cmd);
+extern int do_undisplay(CMDARG *arg, int cmd);
+extern int do_watch(CMDARG *arg, int cmd);
+extern int do_unwatch(CMDARG *arg, int cmd);
+extern int do_dump_instructions(CMDARG *arg, int cmd);
+extern int do_trace_instruction(CMDARG *arg, int cmd);
+extern int do_option(CMDARG *arg, int cmd);
+extern int do_commands(CMDARG *arg, int cmd);
+extern int do_print_f(CMDARG *arg, int cmd);
+extern int do_source(CMDARG *arg, int cmd);
+extern int do_save(CMDARG *arg, int cmd);
+extern int do_eval(CMDARG *arg, int cmd);
+extern int do_condition(CMDARG *arg, int cmd);
diff --git a/gawk-5.0.1/command.c b/gawk-5.0.1/command.c
new file mode 100644
index 00000000000..b805b627fe4
--- /dev/null
+++ b/gawk-5.0.1/command.c
@@ -0,0 +1,3494 @@
+/* A Bison parser, made by GNU Bison 3.4.  */
+
+/* Bison implementation for Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
+   Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Undocumented macros, especially those whose name start with YY_,
+   are private implementation details.  Do not rely on them.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "3.4"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Push parsers.  */
+#define YYPUSH 0
+
+/* Pull parsers.  */
+#define YYPULL 1
+
+
+/* Substitute the variable and function names.  */
+#define yyparse         zzparse
+#define yylex           zzlex
+#define yyerror         zzerror
+#define yydebug         zzdebug
+#define yynerrs         zznerrs
+
+#define yylval          zzlval
+#define yychar          zzchar
+
+/* First part of user prologue.  */
+#line 28 "command.y"
+
+#include "awk.h"
+#include "cmd.h"
+
+#if 0
+#define YYDEBUG 12
+int yydebug = 2;
+#endif
+
+static int yylex(void);
+static void yyerror(const char *mesg, ...);
+
+static int find_command(const char *token, size_t toklen);
+
+static bool want_nodeval = false;
+
+static int cmd_idx = -1;		/* index of current command in cmd table */
+static int repeat_idx = -1;		/* index of last repeatable command in command table */
+static CMDARG *arg_list = NULL;		/* list of arguments */
+static long dbg_errcount = 0;
+static char *lexptr_begin = NULL;
+static bool in_commands = false;
+static int num_dim;
+
+static bool in_eval = false;
+static const char start_EVAL[] = "function @eval(){";
+static const char end_EVAL[] = "}";
+static CMDARG *append_statement(CMDARG *stmt_list, char *stmt);
+static NODE *concat_args(CMDARG *a, int count);
+
+#ifdef HAVE_LIBREADLINE
+static char *next_word(char *p, int len, char **endp);
+static void history_expand_line(char **line);
+static char *command_generator(const char *text, int state);
+static char *srcfile_generator(const char *text, int state);
+static char *argument_generator(const char *text, int state);
+static char *variable_generator(const char *text, int state);
+extern char *option_generator(const char *text, int state);
+static int this_cmd = D_illegal;
+#else
+#define history_expand_line(p)	/* nothing */
+static int rl_inhibit_completion;	/* dummy variable */
+#endif
+
+struct argtoken {
+	const char *name;
+	enum argtype cmd;
+	enum nametypeval value;
+};
+
+/*
+ * These two should be static, but there are some compilers that
+ * don't like the static keyword with an empty size. Therefore give
+ * them names that are less likely to conflict with the rest of gawk.
+ */
+#define argtab zz_debug_argtab
+#define cmdtab zz_debug_cmdtab
+
+extern struct argtoken argtab[];
+extern struct cmdtoken cmdtab[];
+
+static CMDARG *mk_cmdarg(enum argtype type);
+static void append_cmdarg(CMDARG *arg);
+static int find_argument(CMDARG *arg);
+#define YYSTYPE CMDARG *
+
+#line 145 "command.c"
+
+# ifndef YY_NULLPTR
+#  if defined __cplusplus
+#   if 201103L <= __cplusplus
+#    define YY_NULLPTR nullptr
+#   else
+#    define YY_NULLPTR 0
+#   endif
+#  else
+#   define YY_NULLPTR ((void*)0)
+#  endif
+# endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+
+/* Debug traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int zzdebug;
+#endif
+
+/* Token type.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+  enum yytokentype
+  {
+    D_BACKTRACE = 258,
+    D_BREAK = 259,
+    D_CLEAR = 260,
+    D_CONTINUE = 261,
+    D_DELETE = 262,
+    D_DISABLE = 263,
+    D_DOWN = 264,
+    D_ENABLE = 265,
+    D_FINISH = 266,
+    D_FRAME = 267,
+    D_HELP = 268,
+    D_IGNORE = 269,
+    D_INFO = 270,
+    D_LIST = 271,
+    D_NEXT = 272,
+    D_NEXTI = 273,
+    D_PRINT = 274,
+    D_PRINTF = 275,
+    D_QUIT = 276,
+    D_RETURN = 277,
+    D_RUN = 278,
+    D_SET = 279,
+    D_STEP = 280,
+    D_STEPI = 281,
+    D_TBREAK = 282,
+    D_UP = 283,
+    D_UNTIL = 284,
+    D_DISPLAY = 285,
+    D_UNDISPLAY = 286,
+    D_WATCH = 287,
+    D_UNWATCH = 288,
+    D_DUMP = 289,
+    D_TRACE = 290,
+    D_INT = 291,
+    D_STRING = 292,
+    D_NODE = 293,
+    D_VARIABLE = 294,
+    D_OPTION = 295,
+    D_COMMANDS = 296,
+    D_END = 297,
+    D_SILENT = 298,
+    D_SOURCE = 299,
+    D_SAVE = 300,
+    D_EVAL = 301,
+    D_CONDITION = 302,
+    D_STATEMENT = 303
+  };
+#endif
+/* Tokens.  */
+#define D_BACKTRACE 258
+#define D_BREAK 259
+#define D_CLEAR 260
+#define D_CONTINUE 261
+#define D_DELETE 262
+#define D_DISABLE 263
+#define D_DOWN 264
+#define D_ENABLE 265
+#define D_FINISH 266
+#define D_FRAME 267
+#define D_HELP 268
+#define D_IGNORE 269
+#define D_INFO 270
+#define D_LIST 271
+#define D_NEXT 272
+#define D_NEXTI 273
+#define D_PRINT 274
+#define D_PRINTF 275
+#define D_QUIT 276
+#define D_RETURN 277
+#define D_RUN 278
+#define D_SET 279
+#define D_STEP 280
+#define D_STEPI 281
+#define D_TBREAK 282
+#define D_UP 283
+#define D_UNTIL 284
+#define D_DISPLAY 285
+#define D_UNDISPLAY 286
+#define D_WATCH 287
+#define D_UNWATCH 288
+#define D_DUMP 289
+#define D_TRACE 290
+#define D_INT 291
+#define D_STRING 292
+#define D_NODE 293
+#define D_VARIABLE 294
+#define D_OPTION 295
+#define D_COMMANDS 296
+#define D_END 297
+#define D_SILENT 298
+#define D_SOURCE 299
+#define D_SAVE 300
+#define D_EVAL 301
+#define D_CONDITION 302
+#define D_STATEMENT 303
+
+/* Value type.  */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef int YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
+#endif
+
+
+extern YYSTYPE zzlval;
+
+int zzparse (void);
+
+
+
+
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#else
+typedef signed char yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(Msgid) Msgid
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE
+# if (defined __GNUC__                                               \
+      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
+     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
+#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
+# else
+#  define YY_ATTRIBUTE(Spec) /* empty */
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_PURE
+# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(E) ((void) (E))
+#else
+# define YYUSE(E) /* empty */
+#endif
+
+#if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+    _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
+#endif
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
+#endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
+#     ifndef EXIT_SUCCESS
+#      define EXIT_SUCCESS 0
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's 'empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined EXIT_SUCCESS \
+       && ! ((defined YYMALLOC || defined malloc) \
+             && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef EXIT_SUCCESS
+#    define EXIT_SUCCESS 0
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+         || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
+    do                                                                  \
+      {                                                                 \
+        YYSIZE_T yynewbytes;                                            \
+        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
+        Stack = &yyptr->Stack_alloc;                                    \
+        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+        yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                 \
+    while (0)
+
+#endif
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(Dst, Src, Count) \
+      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
+#  else
+#   define YYCOPY(Dst, Src, Count)              \
+      do                                        \
+        {                                       \
+          YYSIZE_T yyi;                         \
+          for (yyi = 0; yyi < (Count); yyi++)   \
+            (Dst)[yyi] = (Src)[yyi];            \
+        }                                       \
+      while (0)
+#  endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  2
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   203
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  59
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  55
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  156
+/* YYNSTATES -- Number of states.  */
+#define YYNSTATES  203
+
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   303
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex, with out-of-bounds checking.  */
+#define YYTRANSLATE(YYX)                                                \
+  ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      58,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,    57,     2,     2,     2,
+       2,     2,     2,    53,    50,    54,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    51,     2,
+       2,    49,     2,     2,    52,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,    55,     2,    56,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48
+};
+
+#if YYDEBUG
+  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
+static const yytype_uint16 yyrline[] =
+{
+       0,   109,   109,   110,   128,   129,   179,   186,   187,   188,
+     189,   190,   194,   195,   196,   197,   201,   202,   203,   204,
+     208,   209,   214,   218,   238,   245,   245,   252,   268,   282,
+     283,   284,   285,   286,   287,   293,   305,   306,   307,   307,
+     308,   308,   309,   310,   311,   312,   313,   313,   314,   315,
+     315,   316,   316,   317,   317,   318,   319,   320,   325,   330,
+     356,   366,   371,   383,   383,   391,   405,   418,   419,   425,
+     426,   430,   431,   432,   433,   439,   440,   441,   446,   457,
+     458,   463,   471,   488,   489,   490,   491,   492,   497,   498,
+     498,   499,   500,   500,   501,   506,   507,   512,   513,   518,
+     519,   523,   524,   528,   529,   544,   545,   550,   558,   559,
+     560,   561,   565,   566,   570,   571,   572,   577,   578,   580,
+     587,   588,   589,   590,   591,   592,   596,   609,   610,   611,
+     615,   616,   617,   618,   622,   624,   626,   630,   645,   649,
+     651,   656,   657,   666,   676,   678,   685,   698,   699,   705,
+     706,   711,   717,   726,   728,   730,   738
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || 0
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "D_BACKTRACE", "D_BREAK", "D_CLEAR",
+  "D_CONTINUE", "D_DELETE", "D_DISABLE", "D_DOWN", "D_ENABLE", "D_FINISH",
+  "D_FRAME", "D_HELP", "D_IGNORE", "D_INFO", "D_LIST", "D_NEXT", "D_NEXTI",
+  "D_PRINT", "D_PRINTF", "D_QUIT", "D_RETURN", "D_RUN", "D_SET", "D_STEP",
+  "D_STEPI", "D_TBREAK", "D_UP", "D_UNTIL", "D_DISPLAY", "D_UNDISPLAY",
+  "D_WATCH", "D_UNWATCH", "D_DUMP", "D_TRACE", "D_INT", "D_STRING",
+  "D_NODE", "D_VARIABLE", "D_OPTION", "D_COMMANDS", "D_END", "D_SILENT",
+  "D_SOURCE", "D_SAVE", "D_EVAL", "D_CONDITION", "D_STATEMENT", "'='",
+  "','", "':'", "'@'", "'+'", "'-'", "'['", "']'", "'$'", "'\\n'",
+  "$accept", "input", "line", "control_cmd", "d_cmd", "frame_cmd",
+  "break_cmd", "set_want_nodeval", "eval_prologue", "statement_list", "@1",
+  "eval_cmd", "command", "$@2", "$@3", "$@4", "$@5", "$@6", "$@7", "$@8",
+  "condition_exp", "commands_arg", "opt_param_list", "param_list",
+  "opt_string_node", "string_node", "option_args", "func_name", "location",
+  "break_args", "$@9", "$@10", "opt_variable", "opt_string", "opt_node",
+  "help_args", "enable_args", "print_exp", "print_args", "printf_exp",
+  "printf_args", "list_args", "integer_range", "opt_integer_list",
+  "integer_list", "exp_list", "subscript", "subscript_list", "variable",
+  "node", "opt_plus_integer", "opt_integer", "plus_integer", "integer",
+  "nls", YY_NULLPTR
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+   (internal) symbol number NUM (which must be that of a token).  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,    61,
+      44,    58,    64,    43,    45,    91,    93,    36,    10
+};
+# endif
+
+#define YYPACT_NINF -151
+
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-151)))
+
+#define YYTABLE_NINF -148
+
+#define yytable_value_is_error(Yytable_value) \
+  0
+
+  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+     STATE-NUM.  */
+static const yytype_int16 yypact[] =
+{
+    -151,   145,  -151,   -34,  -151,  -151,    50,  -151,  -151,  -151,
+    -151,    10,  -151,  -151,   -10,    59,    -9,    43,  -151,  -151,
+    -151,  -151,  -151,  -151,  -151,  -151,  -151,  -151,  -151,  -151,
+      50,  -151,  -151,  -151,  -151,    -8,    -6,    14,    12,  -151,
+    -151,    22,    23,  -151,    59,  -151,  -151,    59,    13,    36,
+      64,  -151,  -151,   -34,  -151,  -151,  -151,    24,    47,  -151,
+    -151,  -151,  -151,    13,  -151,  -151,  -151,    59,    48,  -151,
+    -151,    80,  -151,    67,    47,  -151,  -151,  -151,  -151,    48,
+       4,    19,    69,   -20,  -151,   -20,   -20,  -151,  -151,  -151,
+      70,  -151,  -151,  -151,  -151,  -151,  -151,  -151,    16,  -151,
+    -151,  -151,  -151,    84,    85,  -151,  -151,    73,  -151,  -151,
+    -151,    40,  -151,    74,  -151,  -151,  -151,    48,    59,  -151,
+      74,  -151,    71,    89,    91,  -151,    42,  -151,  -151,  -151,
+    -151,    81,  -151,  -151,    92,    94,  -151,  -151,    86,  -151,
+    -151,     6,    96,  -151,  -151,  -151,   -34,    75,  -151,     6,
+    -151,  -151,    74,     6,  -151,  -151,  -151,  -151,  -151,  -151,
+    -151,  -151,    48,    31,  -151,    71,    71,  -151,    52,  -151,
+     -17,  -151,  -151,    69,  -151,  -151,  -151,  -151,  -151,  -151,
+    -151,    95,  -151,  -151,  -151,  -151,   -34,  -151,    17,  -151,
+    -151,    71,  -151,  -151,  -151,  -151,     6,  -151,  -151,    69,
+    -151,  -151,  -151
+};
+
+  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+     Performed when YYTABLE does not specify something else to do.  Zero
+     means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+       2,     0,     1,     0,    18,    20,    83,     7,    15,    14,
+      17,     0,    32,    19,   101,     0,     0,   117,     8,     9,
+      38,    40,    30,    49,    31,    46,    10,    11,    21,    16,
+      83,    51,    12,    53,    13,    97,     0,    79,     0,    60,
+      61,     0,     0,    22,     0,   156,     3,   147,     0,   149,
+      88,    24,    65,     0,     4,     6,   151,    82,     0,    85,
+      44,    84,   129,     0,    37,   131,   103,   128,   130,   102,
+      29,     0,    35,    82,   118,   119,   121,    42,   122,   120,
+       0,     0,    99,     0,    43,    95,     0,    98,    56,    62,
+      80,    48,    68,    59,    67,   148,    57,    58,     0,    63,
+      33,    55,   153,     0,     0,    34,   150,    82,    91,    45,
+      89,     0,     5,     0,   152,   104,   133,   132,     0,    36,
+       0,   111,   141,     0,     0,   108,    39,   105,   116,   112,
+     114,    41,   113,   144,     0,     0,    50,   100,     0,    52,
+      96,     0,     0,    74,    78,    71,     0,    70,    28,     0,
+     154,   155,     0,     0,    27,    25,    82,    87,    86,   126,
+     124,   125,   123,     0,   139,   143,   106,   142,     0,   109,
+       0,   145,   146,     0,    77,    54,    66,    76,    81,    23,
+      72,     0,    64,    94,    92,    90,     0,   136,     0,   134,
+     140,   107,   110,   115,    47,    73,     0,    26,   138,     0,
+     137,    93,   135
+};
+
+  /* YYPGOTO[NTERM-NUM].  */
+static const yytype_int16 yypgoto[] =
+{
+    -151,  -151,  -151,  -151,  -151,  -151,  -151,  -151,  -151,  -151,
+    -151,  -151,  -151,  -151,  -151,  -151,  -151,  -151,  -151,  -151,
+    -119,  -151,  -151,  -151,  -151,    38,  -151,   -15,   108,  -151,
+    -151,  -151,  -151,  -151,  -151,  -151,  -151,   -90,  -151,   -31,
+    -151,  -151,   -14,   -25,  -151,  -151,  -150,   -26,   -77,  -147,
+      97,  -151,    -5,  -151,    -3
+};
+
+  /* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
+{
+      -1,     1,    46,    47,    48,    49,    50,    98,    51,   111,
+     186,    52,    53,    80,    81,    83,    82,    85,    86,   149,
+     175,    93,   146,   147,   176,   177,    91,    59,    60,   109,
+     153,   196,   139,    88,   136,    70,    64,   125,   126,   130,
+     131,    77,    65,    66,    67,   188,   164,   165,   127,   137,
+      94,   105,    68,   106,    54
+};
+
+  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
+     positive, shift that token.  If negative, reduce the rule whose
+     number is the opposite.  If YYTABLE_NINF, syntax error.  */
+static const yytype_int16 yytable[] =
+{
+      55,    61,    76,    78,   132,   121,   138,   174,   140,   141,
+      71,    62,    79,    92,    62,   190,   189,   143,   198,   122,
+     128,   129,   122,   101,    45,    61,   194,    69,    72,    87,
+     182,    89,   187,    95,   185,   108,   169,   124,   115,    99,
+     124,   190,    95,   122,   144,   110,    56,    63,    56,    56,
+     112,    90,   202,   116,   144,   145,   123,   129,   122,    96,
+      97,   124,   117,    58,   -75,    58,    58,   199,  -127,   133,
+    -147,  -127,   102,   200,   -69,   113,   124,   201,   192,    56,
+      73,   122,   154,   114,   134,   135,    56,    57,   155,   103,
+     104,   122,   168,   132,   123,    56,    74,    75,   157,   124,
+      56,   107,   118,    58,   123,   160,   161,   133,   158,   124,
+      56,   156,    58,   159,   180,   162,   119,    58,   120,   142,
+     150,   151,   134,   135,   152,   181,   163,    58,   166,   167,
+     171,   170,   172,   178,   195,   173,   148,   183,    84,   193,
+     191,     0,     0,   179,   100,     2,     3,   184,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+      36,     0,     0,   197,     0,    37,    38,    39,    40,    41,
+      42,    43,    44,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    45
+};
+
+static const yytype_int16 yycheck[] =
+{
+       3,     6,    17,    17,    81,     1,    83,     1,    85,    86,
+      15,     1,    17,     1,     1,   165,   163,     1,     1,    39,
+       1,    38,    39,    48,    58,    30,   173,    37,    37,    37,
+     149,    37,     1,    38,   153,    50,   126,    57,    63,    44,
+      57,   191,    47,    39,    38,    50,    36,    37,    36,    36,
+      53,    37,   199,    67,    38,    39,    52,    38,    39,    37,
+      37,    57,    67,    53,    58,    53,    53,    50,    58,    38,
+      58,    58,    36,    56,    58,    51,    57,   196,   168,    36,
+      37,    39,    42,    36,    53,    54,    36,    37,    48,    53,
+      54,    39,    50,   170,    52,    36,    53,    54,   113,    57,
+      36,    37,    54,    53,    52,   120,   120,    38,   113,    57,
+      36,    37,    53,   118,    39,   120,    36,    53,    51,    49,
+      36,    36,    53,    54,    51,    50,    55,    53,    39,    38,
+      38,    50,    38,    37,    39,    49,    98,   152,    30,   170,
+     166,    -1,    -1,   146,    47,     0,     1,   152,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    -1,    -1,   186,    -1,    40,    41,    42,    43,    44,
+      45,    46,    47,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    58
+};
+
+  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+     symbol of state STATE-NUM.  */
+static const yytype_uint8 yystos[] =
+{
+       0,    60,     0,     1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    40,    41,    42,
+      43,    44,    45,    46,    47,    58,    61,    62,    63,    64,
+      65,    67,    70,    71,   113,   113,    36,    37,    53,    86,
+      87,   111,     1,    37,    95,   101,   102,   103,   111,    37,
+      94,   111,    37,    37,    53,    54,    86,   100,   101,   111,
+      72,    73,    75,    74,    87,    76,    77,    37,    92,    37,
+      37,    85,     1,    80,   109,   111,    37,    37,    66,   111,
+     109,   102,    36,    53,    54,   110,   112,    37,    86,    88,
+     111,    68,   113,    51,    36,   102,   101,   111,    54,    36,
+      51,     1,    39,    52,    57,    96,    97,   107,     1,    38,
+      98,    99,   107,    38,    53,    54,    93,   108,   107,    91,
+     107,   107,    49,     1,    38,    39,    81,    82,    84,    78,
+      36,    36,    51,    89,    42,    48,    37,    86,   111,   111,
+      86,   101,   111,    55,   105,   106,    39,    38,    50,    96,
+      50,    38,    38,    49,     1,    79,    83,    84,    37,   113,
+      39,    50,    79,    86,   111,    79,    69,     1,   104,   108,
+     105,   106,    96,    98,   108,    39,    90,   113,     1,    50,
+      56,    79,   108
+};
+
+  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    59,    60,    60,    61,    61,    61,    62,    62,    62,
+      62,    62,    63,    63,    63,    63,    64,    64,    64,    64,
+      65,    65,    66,    67,    68,    69,    68,    70,    70,    71,
+      71,    71,    71,    71,    71,    71,    71,    71,    72,    71,
+      73,    71,    71,    71,    71,    71,    74,    71,    71,    75,
+      71,    76,    71,    77,    71,    71,    71,    71,    71,    71,
+      71,    71,    71,    78,    71,    71,    79,    80,    80,    81,
+      81,    82,    82,    82,    82,    83,    83,    83,    84,    85,
+      85,    85,    86,    87,    87,    87,    87,    87,    88,    89,
+      88,    88,    90,    88,    88,    91,    91,    92,    92,    93,
+      93,    94,    94,    95,    95,    96,    96,    96,    97,    97,
+      97,    97,    98,    98,    99,    99,    99,   100,   100,   100,
+     100,   100,   100,   100,   100,   100,   101,   102,   102,   102,
+     103,   103,   103,   103,   104,   104,   104,   105,   105,   106,
+     106,   107,   107,   107,   108,   108,   108,   109,   109,   110,
+     110,   111,   111,   112,   112,   112,   113
+};
+
+  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     0,     2,     1,     2,     2,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     0,     4,     0,     0,     4,     3,     3,     2,
+       1,     1,     1,     2,     2,     2,     3,     2,     0,     3,
+       0,     3,     2,     2,     2,     2,     0,     5,     2,     0,
+       3,     0,     3,     0,     4,     2,     2,     2,     2,     2,
+       1,     1,     2,     0,     4,     1,     1,     1,     1,     0,
+       1,     1,     2,     3,     1,     0,     1,     1,     1,     0,
+       1,     3,     1,     0,     1,     1,     3,     3,     0,     0,
+       3,     1,     0,     5,     3,     0,     1,     0,     1,     0,
+       1,     0,     1,     1,     2,     1,     2,     3,     1,     2,
+       3,     1,     1,     1,     1,     3,     1,     0,     1,     1,
+       1,     1,     1,     3,     3,     3,     3,     0,     1,     1,
+       1,     1,     2,     2,     1,     3,     1,     3,     3,     1,
+       2,     1,     2,     2,     1,     2,     2,     0,     1,     0,
+       1,     1,     2,     1,     2,     2,     1
+};
+
+
+#define yyerrok         (yyerrstatus = 0)
+#define yyclearin       (yychar = YYEMPTY)
+#define YYEMPTY         (-2)
+#define YYEOF           0
+
+#define YYACCEPT        goto yyacceptlab
+#define YYABORT         goto yyabortlab
+#define YYERROR         goto yyerrorlab
+
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                    \
+  do                                                              \
+    if (yychar == YYEMPTY)                                        \
+      {                                                           \
+        yychar = (Token);                                         \
+        yylval = (Value);                                         \
+        YYPOPSTACK (yylen);                                       \
+        yystate = *yyssp;                                         \
+        goto yybackup;                                            \
+      }                                                           \
+    else                                                          \
+      {                                                           \
+        yyerror (YY_("syntax error: cannot back up")); \
+        YYERROR;                                                  \
+      }                                                           \
+  while (0)
+
+/* Error token number */
+#define YYTERROR        1
+#define YYERRCODE       256
+
+
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                        \
+do {                                            \
+  if (yydebug)                                  \
+    YYFPRINTF Args;                             \
+} while (0)
+
+/* This macro is provided for backward compatibility. */
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
+
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
+do {                                                                      \
+  if (yydebug)                                                            \
+    {                                                                     \
+      YYFPRINTF (stderr, "%s ", Title);                                   \
+      yy_symbol_print (stderr,                                            \
+                  Type, Value); \
+      YYFPRINTF (stderr, "\n");                                           \
+    }                                                                     \
+} while (0)
+
+
+/*-----------------------------------.
+| Print this symbol's value on YYO.  |
+`-----------------------------------*/
+
+static void
+yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep)
+{
+  FILE *yyoutput = yyo;
+  YYUSE (yyoutput);
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyo, yytoknum[yytype], *yyvaluep);
+# endif
+  YYUSE (yytype);
+}
+
+
+/*---------------------------.
+| Print this symbol on YYO.  |
+`---------------------------*/
+
+static void
+yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep)
+{
+  YYFPRINTF (yyo, "%s %s (",
+             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
+
+  yy_symbol_value_print (yyo, yytype, yyvaluep);
+  YYFPRINTF (yyo, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+static void
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)                            \
+do {                                                            \
+  if (yydebug)                                                  \
+    yy_stack_print ((Bottom), (Top));                           \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
+{
+  unsigned long yylno = yyrline[yyrule];
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+             yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr,
+                       yystos[yyssp[yyi + 1 - yynrhs]],
+                       &yyvsp[(yyi + 1) - (yynrhs)]
+                                              );
+      YYFPRINTF (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)          \
+do {                                    \
+  if (yydebug)                          \
+    yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+yystrlen (const char *yystr)
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+        switch (*++yyp)
+          {
+          case '\'':
+          case ',':
+            goto do_not_strip_quotes;
+
+          case '\\':
+            if (*++yyp != '\\')
+              goto do_not_strip_quotes;
+            else
+              goto append;
+
+          append:
+          default:
+            if (yyres)
+              yyres[yyn] = *yyp;
+            yyn++;
+            break;
+
+          case '"':
+            if (yyres)
+              yyres[yyn] = '\0';
+            return yyn;
+          }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return (YYSIZE_T) (yystpcpy (yyres, yystr) - yyres);
+}
+# endif
+
+/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
+   about the unexpected token YYTOKEN for the state stack whose top is
+   YYSSP.
+
+   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
+   not large enough to hold the message.  In that case, also set
+   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
+   required number of bytes is too large to store.  */
+static int
+yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
+                yytype_int16 *yyssp, int yytoken)
+{
+  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
+  YYSIZE_T yysize = yysize0;
+  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+  /* Internationalized format string. */
+  const char *yyformat = YY_NULLPTR;
+  /* Arguments of yyformat. */
+  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+  /* Number of reported tokens (one for the "unexpected", one per
+     "expected"). */
+  int yycount = 0;
+
+  /* There are many possibilities here to consider:
+     - If this state is a consistent state with a default action, then
+       the only way this function was invoked is if the default action
+       is an error action.  In that case, don't check for expected
+       tokens because there are none.
+     - The only way there can be no lookahead present (in yychar) is if
+       this state is a consistent state with a default action.  Thus,
+       detecting the absence of a lookahead is sufficient to determine
+       that there is no unexpected or expected token to report.  In that
+       case, just report a simple "syntax error".
+     - Don't assume there isn't a lookahead just because this state is a
+       consistent state with a default action.  There might have been a
+       previous inconsistent state, consistent state with a non-default
+       action, or user semantic action that manipulated yychar.
+     - Of course, the expected token list depends on states to have
+       correct lookahead information, and it depends on the parser not
+       to perform extra reductions after fetching a lookahead from the
+       scanner and before detecting a syntax error.  Thus, state merging
+       (from LALR or IELR) and default reductions corrupt the expected
+       token list.  However, the list is correct for canonical LR with
+       one exception: it will still contain any token that will not be
+       accepted due to an error action in a later state.
+  */
+  if (yytoken != YYEMPTY)
+    {
+      int yyn = yypact[*yyssp];
+      yyarg[yycount++] = yytname[yytoken];
+      if (!yypact_value_is_default (yyn))
+        {
+          /* Start YYX at -YYN if negative to avoid negative indexes in
+             YYCHECK.  In other words, skip the first -YYN actions for
+             this state because they are default actions.  */
+          int yyxbegin = yyn < 0 ? -yyn : 0;
+          /* Stay within bounds of both yycheck and yytname.  */
+          int yychecklim = YYLAST - yyn + 1;
+          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+          int yyx;
+
+          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
+                && !yytable_value_is_error (yytable[yyx + yyn]))
+              {
+                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+                  {
+                    yycount = 1;
+                    yysize = yysize0;
+                    break;
+                  }
+                yyarg[yycount++] = yytname[yyx];
+                {
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
+                  if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+                    yysize = yysize1;
+                  else
+                    return 2;
+                }
+              }
+        }
+    }
+
+  switch (yycount)
+    {
+# define YYCASE_(N, S)                      \
+      case N:                               \
+        yyformat = S;                       \
+      break
+    default: /* Avoid compiler warnings. */
+      YYCASE_(0, YY_("syntax error"));
+      YYCASE_(1, YY_("syntax error, unexpected %s"));
+      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
+      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
+      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
+      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
+# undef YYCASE_
+    }
+
+  {
+    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
+    if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
+      yysize = yysize1;
+    else
+      return 2;
+  }
+
+  if (*yymsg_alloc < yysize)
+    {
+      *yymsg_alloc = 2 * yysize;
+      if (! (yysize <= *yymsg_alloc
+             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
+        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
+      return 1;
+    }
+
+  /* Avoid sprintf, as that infringes on the user's name space.
+     Don't have undefined behavior even if the translation
+     produced a string with the wrong number of "%s"s.  */
+  {
+    char *yyp = *yymsg;
+    int yyi = 0;
+    while ((*yyp = *yyformat) != '\0')
+      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
+        {
+          yyp += yytnamerr (yyp, yyarg[yyi++]);
+          yyformat += 2;
+        }
+      else
+        {
+          yyp++;
+          yyformat++;
+        }
+  }
+  return 0;
+}
+#endif /* YYERROR_VERBOSE */
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+{
+  YYUSE (yyvaluep);
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  YYUSE (yytype);
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+int
+yyparse (void)
+{
+    int yystate;
+    /* Number of tokens to shift before error messages enabled.  */
+    int yyerrstatus;
+
+    /* The stacks and their tools:
+       'yyss': related to states.
+       'yyvs': related to semantic values.
+
+       Refer to the stacks through separate pointers, to allow yyoverflow
+       to reallocate them elsewhere.  */
+
+    /* The state stack.  */
+    yytype_int16 yyssa[YYINITDEPTH];
+    yytype_int16 *yyss;
+    yytype_int16 *yyssp;
+
+    /* The semantic value stack.  */
+    YYSTYPE yyvsa[YYINITDEPTH];
+    YYSTYPE *yyvs;
+    YYSTYPE *yyvsp;
+
+    YYSIZE_T yystacksize;
+
+  int yyn;
+  int yyresult;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  yyssp = yyss = yyssa;
+  yyvsp = yyvs = yyvsa;
+  yystacksize = YYINITDEPTH;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY; /* Cause a token to be read.  */
+  goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yynewstate -- set current state (the top of the stack) to yystate.  |
+`--------------------------------------------------------------------*/
+yysetstate:
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+  YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+  *yyssp = (yytype_int16) yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+    goto yyexhaustedlab;
+#else
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = (YYSIZE_T) (yyssp - yyss + 1);
+
+# if defined yyoverflow
+      {
+        /* Give user a chance to reallocate the stack.  Use copies of
+           these so that the &'s don't force the real ones into
+           memory.  */
+        YYSTYPE *yyvs1 = yyvs;
+        yytype_int16 *yyss1 = yyss;
+
+        /* Each stack pointer address is followed by the size of the
+           data in use in that stack, in bytes.  This used to be a
+           conditional around just the two extra args, but that might
+           be undefined if yyoverflow is a macro.  */
+        yyoverflow (YY_("memory exhausted"),
+                    &yyss1, yysize * sizeof (*yyssp),
+                    &yyvs1, yysize * sizeof (*yyvsp),
+                    &yystacksize);
+        yyss = yyss1;
+        yyvs = yyvs1;
+      }
+# else /* defined YYSTACK_RELOCATE */
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+        goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+        yystacksize = YYMAXDEPTH;
+
+      {
+        yytype_int16 *yyss1 = yyss;
+        union yyalloc *yyptr =
+          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+        if (! yyptr)
+          goto yyexhaustedlab;
+        YYSTACK_RELOCATE (yyss_alloc, yyss);
+        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+        if (yyss1 != yyssa)
+          YYSTACK_FREE (yyss1);
+      }
+# endif
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                  (unsigned long) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+        YYABORT;
+    }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
+
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
+  goto yybackup;
+
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+  /* Do appropriate processing given the current state.  Read a
+     lookahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+  yyn = yypact[yystate];
+  if (yypact_value_is_default (yyn))
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = yylex ();
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yytable_value_is_error (yyn))
+        goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the lookahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
+
+  yystate = yyn;
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     '$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+  case 3:
+#line 111 "command.y"
+    {
+		cmd_idx = -1;
+		want_nodeval = false;
+		if (lexptr_begin != NULL) {
+			if (input_from_tty && lexptr_begin[0] != '\0')
+				add_history(lexptr_begin);
+			efree(lexptr_begin);
+			lexptr_begin = NULL;
+		}
+		if (arg_list != NULL) {
+			free_cmdarg(arg_list);
+			arg_list = NULL;
+		}
+	  }
+#line 1553 "command.c"
+    break;
+
+  case 5:
+#line 130 "command.y"
+    {
+		if (dbg_errcount == 0 && cmd_idx >= 0) {
+			Func_cmd cmdfunc;
+			bool terminate = false;
+			CMDARG *args;
+			int ctype = 0;
+
+			ctype = cmdtab[cmd_idx].type;
+
+			/* a blank line repeats previous command
+			 * (list, next, nexti, step, stepi and continue without arguments).
+			 * save the index in the command table; used in yylex
+			 */
+			if ((ctype == D_list
+					|| ctype == D_next
+					|| ctype == D_step
+					|| ctype == D_nexti
+					|| ctype == D_stepi
+					|| ctype == D_continue)
+				&& arg_list == NULL
+				&& ! in_commands
+				&& input_from_tty
+			)
+				repeat_idx = cmd_idx;
+			else
+				repeat_idx = -1;
+
+			/* call the command handler; reset the globals arg_list, cmd_idx,
+			 * since this handler could invoke yyparse again.
+			 * call do_commands for the list of commands in `commands';
+			 * arg_list isn't freed on return.
+			 */
+
+			cmdfunc = cmdtab[cmd_idx].cf_ptr;
+			if (in_commands)
+				cmdfunc = do_commands;
+			cmd_idx = -1;
+			want_nodeval = false;
+
+			args = arg_list;
+			arg_list = NULL;
+
+			terminate = (*cmdfunc)(args, ctype);
+			if (! in_commands || ctype == D_commands)
+				free_cmdarg(args);
+			if (terminate)
+				YYACCEPT;
+		}
+	  }
+#line 1607 "command.c"
+    break;
+
+  case 6:
+#line 180 "command.y"
+    {
+		yyerrok;
+	  }
+#line 1615 "command.c"
+    break;
+
+  case 22:
+#line 214 "command.y"
+    { want_nodeval = true; }
+#line 1621 "command.c"
+    break;
+
+  case 23:
+#line 219 "command.y"
+    {
+		if (dbg_errcount == 0) {
+			/* don't free arg_list;	passed on to statement_list
+			 * non-terminal (empty rule action). See below.
+			 */
+			if (input_from_tty) {
+				dbg_prompt = eval_prompt;
+				fprintf(out_fp,
+		_("Type (g)awk statement(s). End with the command \"end\"\n"));
+				rl_inhibit_completion = 1;
+			}
+			cmd_idx = -1;
+			in_eval = true;
+		}
+	  }
+#line 1641 "command.c"
+    break;
+
+  case 24:
+#line 238 "command.y"
+    {
+		yyval = append_statement(arg_list, (char *) start_EVAL);
+		if (read_a_line == read_commands_string)	/* unserializing 'eval' in 'commands' */
+			yyval->a_string[0] = '\0';
+		free_cmdarg(arg_list);
+		arg_list = NULL;
+	  }
+#line 1653 "command.c"
+    break;
+
+  case 25:
+#line 245 "command.y"
+    { yyval = append_statement(yyvsp[-1], lexptr_begin); }
+#line 1659 "command.c"
+    break;
+
+  case 26:
+#line 246 "command.y"
+    {
+		yyval = yyvsp[-1];
+	  }
+#line 1667 "command.c"
+    break;
+
+  case 27:
+#line 253 "command.y"
+    {
+		arg_list = append_statement(yyvsp[-1], (char *) end_EVAL);
+		if (read_a_line == read_commands_string) {	/* unserializing 'eval' in 'commands' */
+			char *str = arg_list->a_string;
+			size_t len = strlen(str);
+			assert(len > 2 && str[len - 2] == '}');
+			str[len - 2] = '\0';
+		}
+		if (input_from_tty) {
+			dbg_prompt = in_commands ? commands_prompt : dgawk_prompt;
+			rl_inhibit_completion = 0;
+		}
+		cmd_idx = find_command("eval", 4);
+		in_eval = false;
+	  }
+#line 1687 "command.c"
+    break;
+
+  case 28:
+#line 269 "command.y"
+    {
+		NODE *n;
+		CMDARG *arg;
+		n = yyvsp[0]->a_node;
+		arg = append_statement(NULL, (char *) start_EVAL);
+		(void) append_statement(arg, n->stptr);
+		(void) append_statement(arg, (char *) end_EVAL);
+		free_cmdarg(arg_list);
+		arg_list = arg;
+	  }
+#line 1702 "command.c"
+    break;
+
+  case 34:
+#line 288 "command.y"
+    {
+		if (cmdtab[cmd_idx].class == D_FRAME
+				&& yyvsp[0] != NULL && yyvsp[0]->a_int < 0)
+			yyerror(_("invalid frame number: %d"), yyvsp[0]->a_int);
+	  }
+#line 1712 "command.c"
+    break;
+
+  case 35:
+#line 294 "command.y"
+    {
+		int idx = find_argument(yyvsp[0]);
+		if (idx < 0)
+			yyerror(_("info: invalid option - \"%s\""), yyvsp[0]->a_string);
+		else {
+			efree(yyvsp[0]->a_string);
+			yyvsp[0]->a_string = NULL;
+			yyvsp[0]->type = D_argument;
+			yyvsp[0]->a_argument = argtab[idx].value;
+		}
+	  }
+#line 1728 "command.c"
+    break;
+
+  case 38:
+#line 307 "command.y"
+    { want_nodeval = true; }
+#line 1734 "command.c"
+    break;
+
+  case 40:
+#line 308 "command.y"
+    { want_nodeval = true; }
+#line 1740 "command.c"
+    break;
+
+  case 46:
+#line 313 "command.y"
+    { want_nodeval = true; }
+#line 1746 "command.c"
+    break;
+
+  case 49:
+#line 315 "command.y"
+    { want_nodeval = true; }
+#line 1752 "command.c"
+    break;
+
+  case 51:
+#line 316 "command.y"
+    { want_nodeval = true; }
+#line 1758 "command.c"
+    break;
+
+  case 53:
+#line 317 "command.y"
+    { want_nodeval = true; }
+#line 1764 "command.c"
+    break;
+
+  case 57:
+#line 321 "command.y"
+    {
+		if (in_cmd_src(yyvsp[0]->a_string))
+			yyerror(_("source \"%s\": already sourced."), yyvsp[0]->a_string);
+	  }
+#line 1773 "command.c"
+    break;
+
+  case 58:
+#line 326 "command.y"
+    {
+		if (! input_from_tty)
+			yyerror(_("save \"%s\": command not permitted."), yyvsp[0]->a_string);
+	  }
+#line 1782 "command.c"
+    break;
+
+  case 59:
+#line 331 "command.y"
+    {
+		int type = 0;
+		int num;
+
+		if (yyvsp[0] != NULL)
+			num = yyvsp[0]->a_int;
+
+		if (dbg_errcount != 0)
+			;
+		else if (in_commands)
+			yyerror(_("Can't use command `commands' for breakpoint/watchpoint commands"));
+		else if (yyvsp[0] == NULL &&  ! (type = has_break_or_watch_point(&num, true)))
+			yyerror(_("no breakpoint/watchpoint has been set yet"));
+		else if (yyvsp[0] != NULL && ! (type = has_break_or_watch_point(&num, false)))
+			yyerror(_("invalid breakpoint/watchpoint number"));
+		if (type) {
+			in_commands = true;
+			if (input_from_tty) {
+				dbg_prompt = commands_prompt;
+				fprintf(out_fp, _("Type commands for when %s %d is hit, one per line.\n"),
+								(type == D_break) ? "breakpoint" : "watchpoint", num);
+				fprintf(out_fp, _("End with the command \"end\"\n"));
+			}
+		}
+	  }
+#line 1812 "command.c"
+    break;
+
+  case 60:
+#line 357 "command.y"
+    {
+		if (! in_commands)
+			yyerror(_("`end' valid only in command `commands' or `eval'"));
+		else {
+			if (input_from_tty)
+				dbg_prompt = dgawk_prompt;
+			in_commands = false;
+		}
+	  }
+#line 1826 "command.c"
+    break;
+
+  case 61:
+#line 367 "command.y"
+    {
+		if (! in_commands)
+			yyerror(_("`silent' valid only in command `commands'"));
+	  }
+#line 1835 "command.c"
+    break;
+
+  case 62:
+#line 372 "command.y"
+    {
+		int idx = find_argument(yyvsp[0]);
+		if (idx < 0)
+			yyerror(_("trace: invalid option - \"%s\""), yyvsp[0]->a_string);
+		else {
+			efree(yyvsp[0]->a_string);
+			yyvsp[0]->a_string = NULL;
+			yyvsp[0]->type = D_argument;
+			yyvsp[0]->a_argument = argtab[idx].value;
+		}
+	  }
+#line 1851 "command.c"
+    break;
+
+  case 63:
+#line 383 "command.y"
+    { want_nodeval = true; }
+#line 1857 "command.c"
+    break;
+
+  case 64:
+#line 384 "command.y"
+    {
+		int type;
+		int num = yyvsp[-2]->a_int;
+		type = has_break_or_watch_point(&num, false);
+		if (! type)
+			yyerror(_("condition: invalid breakpoint/watchpoint number"));
+	  }
+#line 1869 "command.c"
+    break;
+
+  case 65:
+#line 392 "command.y"
+    {
+		if (in_commands) {
+			/* Prepend command 'eval' to argument list */
+			CMDARG *arg;
+			arg = mk_cmdarg(D_string);
+			arg->a_string = estrdup("eval", 4);
+			arg->next = arg_list;
+			arg_list = arg;
+		}
+	  }
+#line 1884 "command.c"
+    break;
+
+  case 66:
+#line 406 "command.y"
+    {
+		if (yyvsp[0] != NULL) {
+			NODE *n = yyvsp[0]->a_node;
+			yyvsp[0]->type = D_string;
+			yyvsp[0]->a_string = n->stptr;
+			freenode(n);
+		}
+		yyval = yyvsp[0];
+	  }
+#line 1898 "command.c"
+    break;
+
+  case 68:
+#line 420 "command.y"
+    {	yyval = NULL; }
+#line 1904 "command.c"
+    break;
+
+  case 69:
+#line 425 "command.y"
+    { yyval = NULL; }
+#line 1910 "command.c"
+    break;
+
+  case 74:
+#line 434 "command.y"
+    { yyval = NULL; }
+#line 1916 "command.c"
+    break;
+
+  case 75:
+#line 439 "command.y"
+    { yyval = NULL; }
+#line 1922 "command.c"
+    break;
+
+  case 77:
+#line 442 "command.y"
+    { yyval = NULL; }
+#line 1928 "command.c"
+    break;
+
+  case 78:
+#line 447 "command.y"
+    {
+		NODE *n;
+		n = yyvsp[0]->a_node;
+		if ((n->flags & STRING) == 0)
+			yyerror(_("argument not a string"));
+	  }
+#line 1939 "command.c"
+    break;
+
+  case 79:
+#line 457 "command.y"
+    { yyval = NULL; }
+#line 1945 "command.c"
+    break;
+
+  case 80:
+#line 459 "command.y"
+    {
+		if (find_option(yyvsp[0]->a_string) < 0)
+			yyerror(_("option: invalid parameter - \"%s\""), yyvsp[0]->a_string);
+ 	  }
+#line 1954 "command.c"
+    break;
+
+  case 81:
+#line 464 "command.y"
+    {
+		if (find_option(yyvsp[-2]->a_string) < 0)
+			yyerror(_("option: invalid parameter - \"%s\""), yyvsp[-2]->a_string);
+ 	  }
+#line 1963 "command.c"
+    break;
+
+  case 82:
+#line 472 "command.y"
+    {
+		NODE *n;
+		n = lookup(yyvsp[0]->a_string);
+		if (n == NULL || n->type != Node_func)
+			yyerror(_("no such function - \"%s\""), yyvsp[0]->a_string);
+		else {
+			yyvsp[0]->type = D_func;
+			efree(yyvsp[0]->a_string);
+			yyvsp[0]->a_string = NULL;
+			yyvsp[0]->a_node = n;
+		}
+	  }
+#line 1980 "command.c"
+    break;
+
+  case 83:
+#line 488 "command.y"
+    { yyval = NULL; }
+#line 1986 "command.c"
+    break;
+
+  case 88:
+#line 497 "command.y"
+    { yyval = NULL; }
+#line 1992 "command.c"
+    break;
+
+  case 89:
+#line 498 "command.y"
+    { want_nodeval = true; }
+#line 1998 "command.c"
+    break;
+
+  case 92:
+#line 500 "command.y"
+    { want_nodeval = true; }
+#line 2004 "command.c"
+    break;
+
+  case 95:
+#line 506 "command.y"
+    { yyval = NULL; }
+#line 2010 "command.c"
+    break;
+
+  case 97:
+#line 512 "command.y"
+    { yyval = NULL; }
+#line 2016 "command.c"
+    break;
+
+  case 99:
+#line 518 "command.y"
+    { yyval = NULL; }
+#line 2022 "command.c"
+    break;
+
+  case 104:
+#line 530 "command.y"
+    {
+		int idx = find_argument(yyvsp[-1]);
+		if (idx < 0)
+			yyerror(_("enable: invalid option - \"%s\""), yyvsp[-1]->a_string);
+		else {
+			efree(yyvsp[-1]->a_string);
+			yyvsp[-1]->a_string = NULL;
+			yyvsp[-1]->type = D_argument;
+			yyvsp[-1]->a_argument = argtab[idx].value;
+		}
+	  }
+#line 2038 "command.c"
+    break;
+
+  case 106:
+#line 546 "command.y"
+    {
+		yyvsp[0]->type = D_array;	/* dump all items */
+		yyvsp[0]->a_count = 0;
+	  }
+#line 2047 "command.c"
+    break;
+
+  case 107:
+#line 551 "command.y"
+    {
+		yyvsp[-1]->type = D_array;
+		yyvsp[-1]->a_count = num_dim;
+	  }
+#line 2056 "command.c"
+    break;
+
+  case 117:
+#line 577 "command.y"
+    { yyval = NULL; }
+#line 2062 "command.c"
+    break;
+
+  case 118:
+#line 579 "command.y"
+    { yyval = NULL; }
+#line 2068 "command.c"
+    break;
+
+  case 119:
+#line 581 "command.y"
+    {
+		CMDARG *a;
+		a = mk_cmdarg(D_int);
+		a->a_int = -1;
+		append_cmdarg(a);
+	  }
+#line 2079 "command.c"
+    break;
+
+  case 126:
+#line 597 "command.y"
+    {
+		if (yyvsp[-2]->a_int > yyvsp[0]->a_int)
+			yyerror(_("invalid range specification: %d - %d"),
+				yyvsp[-2]->a_int, yyvsp[0]->a_int);
+		else
+			yyvsp[-2]->type = D_range;
+		yyval = yyvsp[-2];
+	  }
+#line 2092 "command.c"
+    break;
+
+  case 127:
+#line 609 "command.y"
+    { yyval = NULL; }
+#line 2098 "command.c"
+    break;
+
+  case 134:
+#line 623 "command.y"
+    { yyval = yyvsp[0]; }
+#line 2104 "command.c"
+    break;
+
+  case 135:
+#line 625 "command.y"
+    { yyval = yyvsp[-2]; }
+#line 2110 "command.c"
+    break;
+
+  case 137:
+#line 631 "command.y"
+    {
+		CMDARG *a;
+		NODE *subs;
+		int count = 0;
+
+		for (a = yyvsp[-1]; a != NULL; a = a->next)
+			count++;
+		subs = concat_args(yyvsp[-1], count);
+		free_cmdarg(yyvsp[-1]->next);
+		yyvsp[-1]->next = NULL;
+		yyvsp[-1]->type = D_node;
+		yyvsp[-1]->a_node = subs;
+		yyval = yyvsp[-1];
+	  }
+#line 2129 "command.c"
+    break;
+
+  case 139:
+#line 650 "command.y"
+    { yyval = yyvsp[0]; num_dim = 1; }
+#line 2135 "command.c"
+    break;
+
+  case 140:
+#line 652 "command.y"
+    {	yyval = yyvsp[-1]; num_dim++; }
+#line 2141 "command.c"
+    break;
+
+  case 142:
+#line 658 "command.y"
+    {
+		NODE *n = yyvsp[0]->a_node;
+		if ((n->flags & NUMBER) == 0)
+			yyerror(_("non-numeric value for field number"));
+		else
+			yyvsp[0]->type = D_field;
+		yyval = yyvsp[0];
+	  }
+#line 2154 "command.c"
+    break;
+
+  case 143:
+#line 667 "command.y"
+    {
+		/* a_string is array name, a_count is dimension count */
+		yyvsp[-1]->type = D_subscript;
+		yyvsp[-1]->a_count = num_dim;
+		yyval = yyvsp[-1];
+	  }
+#line 2165 "command.c"
+    break;
+
+  case 144:
+#line 677 "command.y"
+    { yyval = yyvsp[0]; }
+#line 2171 "command.c"
+    break;
+
+  case 145:
+#line 679 "command.y"
+    {
+		NODE *n = yyvsp[0]->a_node;
+		if ((n->flags & NUMBER) == 0)
+			yyerror(_("non-numeric value found, numeric expected"));
+		yyval = yyvsp[0];
+	  }
+#line 2182 "command.c"
+    break;
+
+  case 146:
+#line 686 "command.y"
+    {
+		NODE *n = yyvsp[0]->a_node;
+		if ((n->flags & NUMBER) == 0)
+			yyerror(_("non-numeric value found, numeric expected"));
+		else
+			negate_num(n);
+		yyval = yyvsp[0];
+	  }
+#line 2195 "command.c"
+    break;
+
+  case 147:
+#line 698 "command.y"
+    { yyval = NULL; }
+#line 2201 "command.c"
+    break;
+
+  case 148:
+#line 700 "command.y"
+    { yyval = yyvsp[0]; }
+#line 2207 "command.c"
+    break;
+
+  case 149:
+#line 705 "command.y"
+    { yyval = NULL; }
+#line 2213 "command.c"
+    break;
+
+  case 150:
+#line 707 "command.y"
+    { yyval = yyvsp[0]; }
+#line 2219 "command.c"
+    break;
+
+  case 151:
+#line 712 "command.y"
+    {
+		if (yyvsp[0]->a_int == 0)
+			yyerror(_("non-zero integer value"));
+		yyval = yyvsp[0];
+	  }
+#line 2229 "command.c"
+    break;
+
+  case 152:
+#line 718 "command.y"
+    {
+		if (yyvsp[0]->a_int == 0)
+			yyerror(_("non-zero integer value"));
+		yyval = yyvsp[0];
+	  }
+#line 2239 "command.c"
+    break;
+
+  case 153:
+#line 727 "command.y"
+    { yyval = yyvsp[0]; }
+#line 2245 "command.c"
+    break;
+
+  case 154:
+#line 729 "command.y"
+    { yyval = yyvsp[0]; }
+#line 2251 "command.c"
+    break;
+
+  case 155:
+#line 731 "command.y"
+    {
+		yyvsp[0]->a_int = - yyvsp[0]->a_int;
+		yyval = yyvsp[0];
+	  }
+#line 2260 "command.c"
+    break;
+
+  case 156:
+#line 739 "command.y"
+    {
+		if (lexptr_begin != NULL) {
+			if (input_from_tty && lexptr_begin[0] != '\0')
+				add_history(lexptr_begin);
+			efree(lexptr_begin);
+			lexptr_begin = NULL;
+		}
+	  }
+#line 2273 "command.c"
+    break;
+
+
+#line 2277 "command.c"
+
+      default: break;
+    }
+  /* User semantic actions sometimes alter yychar, and that requires
+     that yytoken be updated with the new translation.  We take the
+     approach of translating immediately before every use of yytoken.
+     One alternative is translating here after every semantic action,
+     but that translation would be missed if the semantic action invokes
+     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
+     incorrect destructor might then be invoked immediately.  In the
+     case of YYERROR or YYBACKUP, subsequent parser actions might lead
+     to an incorrect destructor call or verbose syntax error message
+     before the lookahead is translated.  */
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+  /* Now 'shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+  {
+    const int yylhs = yyr1[yyn] - YYNTOKENS;
+    const int yyi = yypgoto[yylhs] + *yyssp;
+    yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+               ? yytable[yyi]
+               : yydefgoto[yylhs]);
+  }
+
+  goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error.  |
+`--------------------------------------*/
+yyerrlab:
+  /* Make sure we have latest lookahead translation.  See comments at
+     user semantic actions for why this is necessary.  */
+  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
+
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
+                                        yyssp, yytoken)
+      {
+        char const *yymsgp = YY_("syntax error");
+        int yysyntax_error_status;
+        yysyntax_error_status = YYSYNTAX_ERROR;
+        if (yysyntax_error_status == 0)
+          yymsgp = yymsg;
+        else if (yysyntax_error_status == 1)
+          {
+            if (yymsg != yymsgbuf)
+              YYSTACK_FREE (yymsg);
+            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
+            if (!yymsg)
+              {
+                yymsg = yymsgbuf;
+                yymsg_alloc = sizeof yymsgbuf;
+                yysyntax_error_status = 2;
+              }
+            else
+              {
+                yysyntax_error_status = YYSYNTAX_ERROR;
+                yymsgp = yymsg;
+              }
+          }
+        yyerror (yymsgp);
+        if (yysyntax_error_status == 2)
+          goto yyexhaustedlab;
+      }
+# undef YYSYNTAX_ERROR
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+         error, discard it.  */
+
+      if (yychar <= YYEOF)
+        {
+          /* Return failure if at end of input.  */
+          if (yychar == YYEOF)
+            YYABORT;
+        }
+      else
+        {
+          yydestruct ("Error: discarding",
+                      yytoken, &yylval);
+          yychar = YYEMPTY;
+        }
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+  /* Pacify compilers when the user code never invokes YYERROR and the
+     label yyerrorlab therefore never appears in user code.  */
+  if (0)
+    YYERROR;
+
+  /* Do not reclaim the symbols of the rule whose action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (!yypact_value_is_default (yyn))
+        {
+          yyn += YYTERROR;
+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+            {
+              yyn = yytable[yyn];
+              if (0 < yyn)
+                break;
+            }
+        }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+        YYABORT;
+
+
+      yydestruct ("Error: popping",
+                  yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+
+#if !defined yyoverflow || YYERROR_VERBOSE
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+
+/*-----------------------------------------------------.
+| yyreturn -- parsing is finished, return the result.  |
+`-----------------------------------------------------*/
+yyreturn:
+  if (yychar != YYEMPTY)
+    {
+      /* Make sure we have latest lookahead translation.  See comments at
+         user semantic actions for why this is necessary.  */
+      yytoken = YYTRANSLATE (yychar);
+      yydestruct ("Cleanup: discarding lookahead",
+                  yytoken, &yylval);
+    }
+  /* Do not reclaim the symbols of the rule whose action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+                  yystos[*yyssp], yyvsp);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  return yyresult;
+}
+#line 749 "command.y"
+
+
+
+/* append_statement --- append 'stmt' to the list of eval awk statements */
+
+static CMDARG *
+append_statement(CMDARG *stmt_list, char *stmt)
+{
+	CMDARG *a, *arg;
+	char *s;
+	int len, slen, ssize;
+
+#define EVALSIZE	512
+
+	if (stmt == start_EVAL) {
+		len = sizeof(start_EVAL);
+		for (a = stmt_list; a != NULL; a = a->next)
+			len += strlen(a->a_string) + 1;	/* 1 for ',' */
+		len += EVALSIZE;
+
+		emalloc(s, char *, (len + 1) * sizeof(char), "append_statement");
+		arg = mk_cmdarg(D_string);
+		arg->a_string = s;
+		arg->a_count = len;	/* kludge */
+
+		slen = sizeof("function @eval(") - 1;
+		memcpy(s, start_EVAL, slen);
+
+		for (a = stmt_list; a != NULL; a = a->next) {
+			len = strlen(a->a_string);
+			memcpy(s + slen, a->a_string, len);
+			slen += len;
+			if (a->next != NULL)
+				s[slen++] = ',';
+		}
+		s[slen++] = ')';
+		s[slen++] = '{';
+		s[slen] = '\0';
+		return arg;
+	}
+
+	len = strlen(stmt) + 1;	/* 1 for newline */
+	s = stmt_list->a_string;
+	slen = strlen(s);
+	ssize = stmt_list->a_count;
+	if (len > ssize - slen) {
+		ssize = slen + len + EVALSIZE;
+		erealloc(s, char *, (ssize + 1) * sizeof(char), "append_statement");
+		stmt_list->a_string = s;
+		stmt_list->a_count = ssize;
+	}
+	memcpy(s + slen, stmt, len);
+	slen += len;
+	if (slen >= 2 && s[slen - 2] != '\n') {
+		s[slen - 1] = '\n';
+		s[slen] = '\0';
+	}
+
+	if (stmt == end_EVAL)
+		erealloc(stmt_list->a_string, char *, slen + 1, "append_statement");
+	return stmt_list;
+
+#undef EVALSIZE
+}
+
+
+/* command names sorted in ascending order */
+
+struct cmdtoken cmdtab[] = {
+{ "backtrace", "bt", D_backtrace, D_BACKTRACE, do_backtrace,
+	gettext_noop("backtrace [N] - print trace of all or N innermost (outermost if N < 0) frames.") },
+{ "break", "b", D_break, D_BREAK, do_breakpoint,
+	gettext_noop("break [[filename:]N|function] - set breakpoint at the specified location.") },
+{ "clear", "", D_clear, D_CLEAR, do_clear,
+	gettext_noop("clear [[filename:]N|function] - delete breakpoints previously set.") },
+{ "commands", "", D_commands, D_COMMANDS, do_commands,
+	gettext_noop("commands [num] - starts a list of commands to be executed at a breakpoint(watchpoint) hit.") },
+{ "condition", "", D_condition, D_CONDITION, do_condition,
+	gettext_noop("condition num [expr] - set or clear breakpoint or watchpoint condition.") },
+{ "continue", "c", D_continue, D_CONTINUE, do_continue,
+	gettext_noop("continue [COUNT] - continue program being debugged.") },
+{ "delete", "d", D_delete, D_DELETE, do_delete_breakpoint,
+	gettext_noop("delete [breakpoints] [range] - delete specified breakpoints.") },
+{ "disable", "", D_disable, D_DISABLE, do_disable_breakpoint,
+	gettext_noop("disable [breakpoints] [range] - disable specified breakpoints.") },
+{ "display", "", D_display, D_DISPLAY, do_display,
+	gettext_noop("display [var] - print value of variable each time the program stops.") },
+{ "down", "", D_down, D_DOWN, do_down,
+	gettext_noop("down [N] - move N frames down the stack.") },
+{ "dump", "", D_dump, D_DUMP, do_dump_instructions,
+	gettext_noop("dump [filename] - dump instructions to file or stdout.") },
+{ "enable", "e", D_enable, D_ENABLE, do_enable_breakpoint,
+	gettext_noop("enable [once|del] [breakpoints] [range] - enable specified breakpoints.") },
+{ "end", "", D_end, D_END, do_commands,
+	gettext_noop("end - end a list of commands or awk statements.") },
+{ "eval", "", D_eval, D_EVAL, do_eval,
+	gettext_noop("eval stmt|[p1, p2, ...] - evaluate awk statement(s).") },
+{ "exit", "", D_quit, D_QUIT, do_quit,
+	gettext_noop("exit - (same as quit) exit debugger.") },
+{ "finish", "", D_finish, D_FINISH, do_finish,
+	gettext_noop("finish - execute until selected stack frame returns.") },
+{ "frame", "f", D_frame, D_FRAME, do_frame,
+	gettext_noop("frame [N] - select and print stack frame number N.") },
+{ "help", "h", D_help, D_HELP, do_help,
+	gettext_noop("help [command] - print list of commands or explanation of command.") },
+{ "ignore", "", D_ignore, D_IGNORE, do_ignore_breakpoint,
+	gettext_noop("ignore N COUNT - set ignore-count of breakpoint number N to COUNT.") },
+{ "info", "i", D_info, D_INFO, do_info,
+	gettext_noop("info topic - source|sources|variables|functions|break|frame|args|locals|display|watch.") },
+{ "list", "l", D_list, D_LIST, do_list,
+	gettext_noop("list [-|+|[filename:]lineno|function|range] - list specified line(s).") },
+{ "next", "n", D_next, D_NEXT, do_next,
+	gettext_noop("next [COUNT] - step program, proceeding through subroutine calls.") },
+{ "nexti", "ni", D_nexti, D_NEXTI, do_nexti,
+	gettext_noop("nexti [COUNT] - step one instruction, but proceed through subroutine calls.") },
+{ "option", "o", D_option, D_OPTION, do_option,
+	gettext_noop("option [name[=value]] - set or display debugger option(s).") },
+{ "print", "p", D_print, D_PRINT, do_print_var,
+	gettext_noop("print var [var] - print value of a variable or array.") },
+{ "printf", "", D_printf, D_PRINTF, do_print_f,
+	gettext_noop("printf format, [arg], ... - formatted output.") },
+{ "quit", "q", D_quit, D_QUIT, do_quit,
+	gettext_noop("quit - exit debugger.") },
+{ "return", "", D_return, D_RETURN, do_return,
+	gettext_noop("return [value] - make selected stack frame return to its caller.") },
+{ "run", "r", D_run, D_RUN, do_run,
+	gettext_noop("run - start or restart executing program.") },
+#ifdef HAVE_LIBREADLINE
+{ "save", "", D_save, D_SAVE, do_save,
+	gettext_noop("save filename - save commands from the session to file.") },
+#endif
+{ "set", "", D_set, D_SET, do_set_var,
+	gettext_noop("set var = value - assign value to a scalar variable.") },
+{ "silent", "", D_silent, D_SILENT, do_commands,
+	gettext_noop("silent - suspends usual message when stopped at a breakpoint/watchpoint.") },
+{ "source", "", D_source, D_SOURCE, do_source,
+	gettext_noop("source file - execute commands from file.") },
+{ "step", "s", D_step, D_STEP, do_step,
+	gettext_noop("step [COUNT] - step program until it reaches a different source line.") },
+{ "stepi", "si", D_stepi, D_STEPI, do_stepi,
+	gettext_noop("stepi [COUNT] - step one instruction exactly.") },
+{ "tbreak", "t", D_tbreak, D_TBREAK, do_tmp_breakpoint,
+	gettext_noop("tbreak [[filename:]N|function] - set a temporary breakpoint.") },
+{ "trace", "", D_trace, D_TRACE, do_trace_instruction,
+	gettext_noop("trace on|off - print instruction before executing.") },
+{ "undisplay",	"", D_undisplay, D_UNDISPLAY, do_undisplay,
+	gettext_noop("undisplay [N] - remove variable(s) from automatic display list.") },
+{ "until", "u", D_until, D_UNTIL, do_until,
+	gettext_noop("until [[filename:]N|function] - execute until program reaches a different line or line N within current frame.") },
+{ "unwatch", "", D_unwatch, D_UNWATCH, do_unwatch,
+	gettext_noop("unwatch [N] - remove variable(s) from watch list.") },
+{ "up",	"", D_up, D_UP, do_up,
+	gettext_noop("up [N] - move N frames up the stack.") },
+{ "watch", "w", D_watch, D_WATCH, do_watch,
+	gettext_noop("watch var - set a watchpoint for a variable.") },
+{ "where", "", D_backtrace, D_BACKTRACE, do_backtrace,
+	gettext_noop("where [N] - (same as backtrace) print trace of all or N innermost (outermost if N < 0) frames.") },
+{ NULL, NULL, D_illegal, 0, (Func_cmd) 0,
+	 NULL },
+};
+
+struct argtoken argtab[] = {
+	{ "args", D_info, A_ARGS },
+	{ "break", D_info, A_BREAK },
+	{ "del", D_enable, A_DEL },
+	{ "display", D_info, A_DISPLAY },
+	{ "frame", D_info, A_FRAME },
+	{ "functions", D_info, A_FUNCTIONS },
+	{ "locals", D_info, A_LOCALS },
+	{ "off", D_trace, A_TRACE_OFF },
+	{ "on", D_trace, A_TRACE_ON },
+	{ "once", D_enable, A_ONCE },
+	{ "source", D_info, A_SOURCE },
+	{ "sources", D_info, A_SOURCES },
+	{ "variables", D_info, A_VARIABLES },
+	{ "watch", D_info, A_WATCH },
+	{ NULL, D_illegal, A_NONE },
+};
+
+
+/* get_command --- return command handler function */
+
+Func_cmd
+get_command(int ctype)
+{
+	int i;
+	for (i = 0; cmdtab[i].name != NULL; i++) {
+		if (cmdtab[i].type == ctype)
+			return cmdtab[i].cf_ptr;
+	}
+	return (Func_cmd) 0;
+}
+
+/* get_command_name --- return command name given it's type */
+
+const char *
+get_command_name(int ctype)
+{
+	int i;
+	for (i = 0; cmdtab[i].name != NULL; i++) {
+		if (cmdtab[i].type == ctype)
+			return cmdtab[i].name;
+	}
+	return NULL;
+}
+
+/* mk_cmdarg --- make an argument for command */
+
+static CMDARG *
+mk_cmdarg(enum argtype type)
+{
+	CMDARG *arg;
+	ezalloc(arg, CMDARG *, sizeof(CMDARG), "mk_cmdarg");
+	arg->type = type;
+	return arg;
+}
+
+/* append_cmdarg --- append ARG to the list of arguments for the current command */
+
+static void
+append_cmdarg(CMDARG *arg)
+{
+	static CMDARG *savetail;
+
+	if (arg_list == NULL)
+		arg_list = arg;
+	else
+		savetail->next = arg;
+	savetail = arg;
+}
+
+/* free_cmdarg --- free all arguments in LIST */
+
+void
+free_cmdarg(CMDARG *list)
+{
+	CMDARG *arg, *nexta;
+
+	for (arg = list; arg != NULL; arg = nexta) {
+		nexta = arg->next;
+
+		switch (arg->type) {
+		case D_variable:
+		case D_subscript:
+		case D_array:
+		case D_string:
+			if (arg->a_string != NULL)
+				efree(arg->a_string);
+			break;
+		case D_node:
+		case D_field:
+			unref(arg->a_node);
+			break;
+		default:
+			break;
+		}
+		efree(arg);
+	}
+}
+
+/* yyerror --- print a syntax error message */
+
+static void
+yyerror(const char *mesg, ...)
+{
+	va_list args;
+	va_start(args, mesg);
+	fprintf(out_fp, _("error: "));
+	vfprintf(out_fp, mesg, args);
+	fprintf(out_fp, "\n");
+	va_end(args);
+	dbg_errcount++;
+	repeat_idx = -1;
+}
+
+
+/* yylex --- read a command and turn it into tokens */
+
+static int
+#ifdef USE_EBCDIC
+yylex_ebcdic(void)
+#else
+yylex(void)
+#endif
+{
+	static char *lexptr = NULL;
+	static char *lexend;
+	int c;
+	char *tokstart;
+	size_t toklen;
+
+	yylval = (CMDARG *) NULL;
+
+	if (dbg_errcount > 0 && lexptr_begin == NULL) {
+		/* fake a new line */
+		dbg_errcount = 0;
+		return '\n';
+	}
+
+	if (lexptr_begin == NULL) {
+again:
+		lexptr_begin = read_a_line(dbg_prompt);
+		if (lexptr_begin == NULL) {	/* EOF or error */
+			if (get_eof_status() == EXIT_FATAL)
+				exit(EXIT_FATAL);
+			if (get_eof_status() == EXIT_FAILURE) {
+				static int seen_eof = 0;
+
+				/* force a quit, and let do_quit (in debug.c) exit */
+				if (! seen_eof) {
+					if (errno != 0)	{
+						fprintf(stderr, _("can't read command (%s)\n"), strerror(errno));
+						exit_val = EXIT_FAILURE;
+					} /* else
+						exit_val = EXIT_SUCCESS; */
+
+					seen_eof = 1;
+					return '\n';	/* end current command if any */
+				} else if (seen_eof++ == 1) {
+					cmd_idx = find_command("quit", 4);
+					return D_QUIT;	/* 'quit' token */
+				} else
+					return '\n';	/* end command 'quit' */
+			}
+			if (errno != 0)
+				d_error(_("can't read command (%s)"), strerror(errno));
+			if (pop_cmd_src() == 0)
+				goto again;
+			exit(EXIT_FATAL);	/* shouldn't happen */
+		}
+
+		if (! in_commands && ! in_eval	/* history expansion off in 'commands' and 'eval' */
+				&& input_from_tty
+		)
+			history_expand_line(&lexptr_begin);
+
+		lexptr = lexptr_begin;
+		lexend = lexptr + strlen(lexptr);
+		if (*lexptr == '\0'		/* blank line */
+				&& repeat_idx >= 0
+				&& input_from_tty
+				&& ! in_eval
+		) {
+#ifdef HAVE_LIBREADLINE
+			HIST_ENTRY *h;
+			h = previous_history();
+			if (h != NULL)
+				add_history(h->line);
+#endif
+			cmd_idx = repeat_idx;
+			return cmdtab[cmd_idx].class;	/* repeat last command */
+		}
+		repeat_idx = -1;
+	}
+
+	c = *lexptr;
+
+	while (c == ' ' || c == '\t')
+		c = *++lexptr;
+
+	if (! input_from_tty && c == '#')
+		return '\n';
+
+	tokstart = lexptr;
+	if (lexptr >= lexend)
+		return '\n';
+
+	if (cmd_idx < 0) {	/* need a command */
+		if (c == '?' && tokstart[1] == '\0'	&& ! in_eval) {
+			lexptr++;
+			cmd_idx = find_command("help", 4);
+			return D_HELP;
+		}
+
+		while (c != '\0' && c != ' ' && c != '\t') {
+			if (! is_alpha(c) && ! in_eval) {
+				yyerror(_("invalid character in command"));
+				return '\n';
+			}
+			c = *++lexptr;
+		}
+
+		toklen = lexptr - tokstart;
+
+		if (in_eval) {
+			if (toklen == 3
+					&& tokstart[3] == '\0'
+					&& tokstart[0] == 'e'
+					&& tokstart[1] == 'n'
+					&& tokstart[2] == 'd'
+			) {
+				cmd_idx = find_command(tokstart, toklen);
+				return D_END;
+			}
+			lexptr = lexend;
+			return D_STATEMENT;
+		}
+
+		cmd_idx = find_command(tokstart, toklen);
+		if (cmd_idx >= 0) {
+			if (in_commands && cmdtab[cmd_idx].type != D_eval) {
+				/* add the actual command string (lexptr_begin) to
+				 * arg_list; command string for 'eval' prepended to the arg_list
+				 * in the grammer above (see eval_cmd non-terminal).
+				 */
+				CMDARG *arg;
+				arg = mk_cmdarg(D_string);
+				arg->a_string = estrdup(lexptr_begin, lexend - lexptr_begin);
+				append_cmdarg(arg);
+			}
+			return cmdtab[cmd_idx].class;
+		} else {
+			yyerror(_("unknown command - \"%.*s\", try help"), toklen, tokstart);
+			return '\n';
+		}
+	}
+
+	c = *lexptr;
+
+	if (cmdtab[cmd_idx].type == D_option) {
+		if (c == '=')
+			return *lexptr++;
+	} else if (c == '-' || c == '+' || c == ':' || c == '|')
+		return *lexptr++;
+
+	if (c == '"') {
+		char *str, *p;
+		int flags = ALREADY_MALLOCED;
+		bool esc_seen = false;
+
+		toklen = lexend - lexptr;
+		emalloc(str, char *, toklen + 1, "yylex");
+		p = str;
+
+		while ((c = *++lexptr) != '"') {
+			if (lexptr == lexend) {
+err:
+				efree(str);
+				yyerror(_("unterminated string"));
+				return '\n';
+			}
+			if (c == '\\') {
+				c = *++lexptr;
+				esc_seen = true;
+				if (want_nodeval || c != '"')
+					*p++ = '\\';
+			}
+			if (lexptr == lexend)
+				goto err;
+			*p++ = c;
+		}
+		lexptr++;
+		*p = '\0';
+
+		if (! want_nodeval) {
+			yylval = mk_cmdarg(D_string);
+			yylval->a_string = str;
+			append_cmdarg(yylval);
+			return D_STRING;
+		} else {	/* awk string */
+			if (esc_seen)
+				flags |= SCAN;
+			yylval = mk_cmdarg(D_node);
+			yylval->a_node = make_str_node(str, p - str, flags);
+			append_cmdarg(yylval);
+			return D_NODE;
+		}
+	}
+
+	if (! want_nodeval) {
+		while ((c = *++lexptr) != '\0' && c != ':' && c != '-'
+					&& c != ' ' && c != '\t' && c != '=')
+			;
+
+		/* Is it an integer? */
+		if (isdigit((unsigned char) tokstart[0]) && cmdtab[cmd_idx].type != D_option) {
+			char *end;
+			long l;
+
+			errno = 0;
+			l = strtol(tokstart, &end, 0);
+			if (errno != 0) {
+				yyerror(_("%s"), strerror(errno));
+				errno = 0;
+				return '\n';
+			}
+
+			if (lexptr == end) {
+				yylval = mk_cmdarg(D_int);
+				yylval->a_int = l;
+				append_cmdarg(yylval);
+				return D_INT;
+			}
+		}
+
+		/* Must be string */
+		yylval = mk_cmdarg(D_string);
+		yylval->a_string = estrdup(tokstart, lexptr - tokstart);
+		append_cmdarg(yylval);
+		return D_STRING;
+	}
+
+	/* look for awk number */
+
+	if (isdigit((unsigned char) tokstart[0])) {
+		NODE *r = NULL;
+
+		errno = 0;
+#ifdef HAVE_MPFR
+		if (do_mpfr) {
+			int tval;
+			r = mpg_float();
+			tval = mpfr_strtofr(r->mpg_numbr, tokstart, & lexptr, 0, ROUND_MODE);
+			IEEE_FMT(r->mpg_numbr, tval);
+			if (mpfr_integer_p(r->mpg_numbr)) {
+				/* integral value, convert to a GMP type. */
+				NODE *tmp = r;
+				r = mpg_integer();
+				mpfr_get_z(r->mpg_i, tmp->mpg_numbr, MPFR_RNDZ);
+				unref(tmp);
+			}
+		} else
+#endif
+			r = make_number(strtod(tokstart, & lexptr));
+
+		if (errno != 0) {
+			yyerror(strerror(errno));
+			unref(r);
+			errno = 0;
+			return '\n';
+		}
+		yylval = mk_cmdarg(D_node);
+		yylval->a_node = r;
+		append_cmdarg(yylval);
+		return D_NODE;
+	}
+
+	c = *lexptr;
+	if (c == '$' || c == '@'
+			|| c == '[' || c == ']'
+			|| c == ',' || c == '=')
+		return *lexptr++;
+
+	if (! is_letter(c)) {
+		yyerror(_("invalid character"));
+		return '\n';
+	}
+
+	while (is_identchar(c))
+		c = *++lexptr;
+	toklen = lexptr - tokstart;
+
+	/* awk variable */
+	yylval = mk_cmdarg(D_variable);
+	yylval->a_string = estrdup(tokstart, toklen);
+	append_cmdarg(yylval);
+	return D_VARIABLE;
+}
+
+/* Convert single-character tokens coming out of yylex() from EBCDIC to
+   ASCII values on-the-fly so that the parse tables need not be regenerated
+   for EBCDIC systems.  */
+#ifdef USE_EBCDIC
+static int
+yylex(void)
+{
+	static char etoa_xlate[256];
+	static int do_etoa_init = 1;
+	int tok;
+
+	if (do_etoa_init)
+	{
+		for (tok = 0; tok < 256; tok++)
+			etoa_xlate[tok] = (char) tok;
+#ifdef HAVE___ETOA_L
+		/* IBM helpfully provides this function.  */
+		__etoa_l(etoa_xlate, sizeof(etoa_xlate));
+#else
+# error "An EBCDIC-to-ASCII translation function is needed for this system"
+#endif
+		do_etoa_init = 0;
+	}
+
+	tok = yylex_ebcdic();
+
+	if (tok >= 0 && tok <= 0xFF)
+		tok = etoa_xlate[tok];
+
+	return tok;
+}
+#endif /* USE_EBCDIC */
+
+/* find_argument --- find index in 'argtab' for a command option */
+
+static int
+find_argument(CMDARG *arg)
+{
+	/* non-number argument */
+	int idx;
+	char *name, *p;
+	size_t len;
+	assert(cmd_idx >= 0);
+	name = arg->a_string;
+	len = strlen(name);
+	for (idx = 0; (p = (char *) argtab[idx].name) != NULL; idx++) {
+		if (cmdtab[cmd_idx].type == argtab[idx].cmd
+				&& *p == *name
+				&& strlen(p) == len
+				&& strncmp(p, name, len) == 0
+		)
+			return idx;
+	}
+	return -1;	/* invalid option */
+}
+
+/* concat_args --- concatenate argument strings into a single string NODE */
+
+static NODE *
+concat_args(CMDARG *arg, int count)
+{
+	NODE *n;
+	NODE **tmp;
+	char *str, *subsep, *p;
+	long len, subseplen;
+	int i;
+
+	if (count == 1) {
+		n = force_string(arg->a_node);
+		return dupnode(n);
+	}
+
+	emalloc(tmp, NODE **, count * sizeof(NODE *), "concat_args");
+	subseplen = SUBSEP_node->var_value->stlen;
+	subsep = SUBSEP_node->var_value->stptr;
+	len = -subseplen;
+
+	for (i = 0; i < count; i++) {
+		n = force_string(arg->a_node);
+		len += n->stlen + subseplen;
+		tmp[i] = n;
+		arg = arg->next;
+	}
+
+	emalloc(str, char *, len + 1, "concat_args");
+	n = tmp[0];
+	memcpy(str, n->stptr, n->stlen);
+	p = str + n->stlen;
+	for (i = 1; i < count; i++) {
+		if (subseplen == 1)
+			*p++ = *subsep;
+		else if (subseplen > 0) {
+			memcpy(p, subsep, subseplen);
+			p += subseplen;
+		}
+
+		n = tmp[i];
+		memcpy(p, n->stptr, n->stlen);
+		p += n->stlen;
+	}
+	str[len] = '\0';
+	efree(tmp);
+	return make_str_node(str, len, ALREADY_MALLOCED);
+}
+
+/* find_command --- find the index in 'cmdtab' using exact,
+ *                  abbreviation or unique partial match
+ */
+
+static int
+find_command(const char *token, size_t toklen)
+{
+	char *name, *abrv;
+	int i, k;
+	bool try_exact = true;
+	int abrv_match = -1;
+	int partial_match = -1;
+
+#ifdef USE_EBCDIC
+	/* make sure all lower case characters in token (sorting
+	 * isn't the solution in this case)
+	 */
+	for (i = 0; i < toklen; i++) {
+		if (token[i] != tolower(token[i]))
+			return -1;
+	}
+#endif
+
+	k = sizeof(cmdtab)/sizeof(cmdtab[0]) - 1;
+	for (i = 0; i < k; i++) {
+		name = (char *) cmdtab[i].name;
+		if (try_exact && *token == *name
+				&& toklen == strlen(name)
+				&& strncmp(name, token, toklen) == 0
+		)
+			return i;
+
+		if (*name > *token || i == (k - 1))
+			try_exact = false;
+
+		if (abrv_match < 0) {
+			abrv = cmdtab[i].abbrvn;
+			if (abrv[0] == token[0]) {
+				if (toklen == 1 && ! abrv[1])
+					abrv_match = i;
+				else if (toklen == 2 && abrv[1] == token[1])
+					abrv_match = i;
+			}
+		}
+		if (! try_exact && abrv_match >= 0)
+			return abrv_match;
+		if (partial_match < 0) {
+			if (*token == *name
+					&& toklen < strlen(name)
+					&& strncmp(name, token, toklen) == 0
+			) {
+				if ((i == k - 1 || strncmp(cmdtab[i + 1].name, token, toklen) != 0)
+					&& (i == 0 || strncmp(cmdtab[i - 1].name, token, toklen) != 0)
+				)
+					partial_match = i;
+			}
+		}
+	}
+	return partial_match;
+}
+
+/* do_help -- help command */
+
+int
+do_help(CMDARG *arg, int cmd)
+{
+	int i;
+	if (arg == NULL) {
+		initialize_pager(out_fp);
+		if (setjmp(pager_quit_tag) == 0) {
+			for (i = 0; cmdtab[i].name != NULL; i++) {
+				gprintf(out_fp, "%s:\n", cmdtab[i].name);
+				gprintf(out_fp, "\t%s\n", _(cmdtab[i].help_txt));
+			}
+		}
+	} else if (arg->type == D_string) {
+		char *name;
+		name = arg->a_string;
+		i = find_command(name, strlen(name));
+		if (i >= 0) {
+			fprintf(out_fp, "%s\n", cmdtab[i].help_txt);
+			if (strcmp(cmdtab[i].name, "option") == 0)
+				option_help();
+		} else
+			fprintf(out_fp, _("undefined command: %s\n"), name);
+	}
+
+	return false;
+}
+
+
+#ifdef HAVE_LIBREADLINE
+
+/* next_word --- find the next word in a line to complete
+ *               (word seperation characters are space and tab).
+ */
+
+static char *
+next_word(char *p, int len, char **endp)
+{
+	char *q;
+	int i;
+
+	if (p == NULL || len <= 0)
+		return NULL;
+	for (i = 0; i < len; i++, p++)
+		if (*p != ' ' && *p != '\t')
+			break;
+	if (i == len)
+		return NULL;
+	if (endp != NULL) {
+		for (i++, q = p + 1; i < len; i++, q++)
+			if (*q == ' ' || *q == '\t')
+				break;
+		*endp = q;
+	}
+	return p;
+}
+
+/* command_completion --- attempt to complete based on the word number in line;
+ *    try to complete on command names if this is the first word; for the next
+ *    word(s), the type of completion depends on the command name (first word).
+ */
+
+#ifndef RL_READLINE_VERSION		/* < 4.2a */
+#define rl_completion_matches(x, y) completion_matches((char *) (x), (y))
+#endif
+
+
+char **
+command_completion(const char *text, int start, int end)
+{
+	char *cmdtok, *e;
+	int idx;
+	int len;
+
+	rl_attempted_completion_over = true;	/* no default filename completion please */
+
+	this_cmd = D_illegal;
+	len = start;
+	if ((cmdtok = next_word(rl_line_buffer, len, &e)) == NULL)	/* no first word yet */
+		return  rl_completion_matches(text, command_generator);
+	len -= (e - rl_line_buffer);
+
+	idx = find_command(cmdtok, e - cmdtok);
+	if (idx < 0)
+		return NULL;
+	this_cmd = cmdtab[idx].type;
+
+	if (! next_word(e, len, NULL)) {
+		switch (this_cmd) {
+		case D_break:
+		case D_list:
+		case D_until:
+		case D_tbreak:
+		case D_clear:
+			return rl_completion_matches(text, srcfile_generator);
+		case D_info:
+		case D_enable:
+		case D_trace:
+		case D_help:
+			return rl_completion_matches(text, argument_generator);
+		case D_option:
+			return rl_completion_matches(text, option_generator);
+		case D_print:
+		case D_printf:
+		case D_set:
+		case D_display:
+		case D_watch:
+			return rl_completion_matches(text, variable_generator);
+		default:
+			return NULL;
+		}
+	}
+
+	if (this_cmd == D_print || this_cmd == D_printf)
+		return rl_completion_matches(text, variable_generator);
+	return NULL;
+}
+
+/* command_generator --- generator function for command completion */
+
+static char *
+command_generator(const char *text, int state)
+{
+	static size_t textlen;
+	static int idx = 0;
+	char *name;
+
+	if (! state) {	/* first time */
+		textlen = strlen(text);
+		idx = 0;
+	}
+	while ((name = (char *) cmdtab[idx].name) != NULL) {
+		idx++;
+		if (strncmp(name, text, textlen) == 0)
+			return estrdup(name, strlen(name));
+	}
+	return NULL;
+}
+
+/* srcfile_generator --- generator function for source file completion */
+
+static char *
+srcfile_generator(const char *text, int state)
+{
+	static size_t textlen;
+	static SRCFILE *s;
+	char *name;
+	extern SRCFILE *srcfiles;
+
+	if (! state) {	/* first time */
+		textlen = strlen(text);
+		s = srcfiles->next;
+	}
+	while (s != srcfiles) {
+		if (s->stype != SRC_FILE && s->stype != SRC_INC) {
+			s = s->next;
+			continue;
+		}
+		name = s->src;
+		s = s->next;
+		if (strncmp(name, text, textlen) == 0)
+			return estrdup(name, strlen(name));
+	}
+	return NULL;
+}
+
+/* argument_generator --- generator function for non-number argument completion */
+
+static char *
+argument_generator(const char *text, int state)
+{
+	static size_t textlen;
+	static int idx;
+	const char *name;
+
+	if (! state) {	/* first time */
+		textlen = strlen(text);
+		idx = 0;
+	}
+
+	if (this_cmd == D_help) {
+		while ((name = cmdtab[idx++].name) != NULL) {
+			if (strncmp(name, text, textlen) == 0)
+				return estrdup(name, strlen(name));
+		}
+	} else {
+		while ((name = argtab[idx].name) != NULL) {
+			if (this_cmd != argtab[idx++].cmd)
+				continue;
+			if (strncmp(name, text, textlen) == 0)
+				return estrdup(name, strlen(name));
+		}
+	}
+	return NULL;
+}
+
+/* variable_generator --- generator function for variable name completion */
+
+static char *
+variable_generator(const char *text, int state)
+{
+	static size_t textlen;
+	static int idx = 0;
+	static NODE *func = NULL;
+	static NODE **vars = NULL;
+	const char *name;
+	NODE *r;
+
+	if (! state) {	/* first time */
+		textlen = strlen(text);
+		if (vars != NULL)
+			efree(vars);
+		vars = variable_list();
+		idx = 0;
+		func = get_function();  /* function in current context */
+	}
+
+	/* function params */
+	while (func != NULL) {
+		if (idx >= func->param_cnt) {
+			func = NULL;	/* don't try to match params again */
+			idx = 0;
+			break;
+		}
+		name = func->fparms[idx++].param;
+		if (strncmp(name, text, textlen) == 0)
+			return estrdup(name, strlen(name));
+	}
+
+	/* globals */
+	while ((r = vars[idx++]) != NULL) {
+		name = r->vname;
+		if (strncmp(name, text, textlen) == 0)
+			return estrdup(name, strlen(name));
+	}
+
+	return NULL;
+}
+
+/* history_expand_line ---  history expand the LINE */
+
+static void
+history_expand_line(char **line)
+{
+	int ret;
+	char *expansion;
+
+	if (! *line || input_fd != 0 || ! input_from_tty)
+		return;
+	using_history();
+	ret = history_expand(*line, &expansion);
+	if (ret < 0 || ret == 2)
+		efree(expansion);
+	else {
+		efree(*line);
+		*line = expansion;
+	}
+}
+
+#endif
diff --git a/gawk-5.0.1/command.y b/gawk-5.0.1/command.y
new file mode 100644
index 00000000000..6d2c9ef2970
--- /dev/null
+++ b/gawk-5.0.1/command.y
@@ -0,0 +1,1734 @@
+/*
+ * command.y - yacc/bison parser for debugger commands.
+ */
+
+/*
+ * Copyright (C) 2004, 2010, 2011, 2014, 2016, 2017
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335,
+ * USA 
+ */
+
+%{
+#include "awk.h"
+#include "cmd.h"
+
+#if 0
+#define YYDEBUG 12
+int yydebug = 2;
+#endif
+
+static int yylex(void);
+static void yyerror(const char *mesg, ...);
+
+static int find_command(const char *token, size_t toklen);
+
+static bool want_nodeval = false;
+
+static int cmd_idx = -1;		/* index of current command in cmd table */
+static int repeat_idx = -1;		/* index of last repeatable command in command table */
+static CMDARG *arg_list = NULL;		/* list of arguments */
+static long dbg_errcount = 0;
+static char *lexptr_begin = NULL;
+static bool in_commands = false;
+static int num_dim;
+
+static bool in_eval = false;
+static const char start_EVAL[] = "function @eval(){";
+static const char end_EVAL[] = "}";
+static CMDARG *append_statement(CMDARG *stmt_list, char *stmt);
+static NODE *concat_args(CMDARG *a, int count);
+
+#ifdef HAVE_LIBREADLINE
+static char *next_word(char *p, int len, char **endp);
+static void history_expand_line(char **line);
+static char *command_generator(const char *text, int state);
+static char *srcfile_generator(const char *text, int state);
+static char *argument_generator(const char *text, int state);
+static char *variable_generator(const char *text, int state);
+extern char *option_generator(const char *text, int state);
+static int this_cmd = D_illegal;
+#else
+#define history_expand_line(p)	/* nothing */
+static int rl_inhibit_completion;	/* dummy variable */
+#endif
+
+struct argtoken {
+	const char *name;
+	enum argtype cmd;
+	enum nametypeval value;
+};
+
+/*
+ * These two should be static, but there are some compilers that
+ * don't like the static keyword with an empty size. Therefore give
+ * them names that are less likely to conflict with the rest of gawk.
+ */
+#define argtab zz_debug_argtab
+#define cmdtab zz_debug_cmdtab
+
+extern struct argtoken argtab[];
+extern struct cmdtoken cmdtab[];
+
+static CMDARG *mk_cmdarg(enum argtype type);
+static void append_cmdarg(CMDARG *arg);
+static int find_argument(CMDARG *arg);
+#define YYSTYPE CMDARG *
+%}
+
+%token D_BACKTRACE D_BREAK D_CLEAR D_CONTINUE D_DELETE D_DISABLE D_DOWN
+%token D_ENABLE D_FINISH D_FRAME D_HELP D_IGNORE D_INFO D_LIST
+%token D_NEXT D_NEXTI D_PRINT D_PRINTF D_QUIT D_RETURN D_RUN D_SET
+%token D_STEP D_STEPI D_TBREAK D_UP D_UNTIL
+%token D_DISPLAY D_UNDISPLAY D_WATCH D_UNWATCH
+%token D_DUMP D_TRACE
+%token D_INT D_STRING D_NODE D_VARIABLE
+%token D_OPTION D_COMMANDS D_END D_SILENT D_SOURCE
+%token D_SAVE D_EVAL D_CONDITION
+%token D_STATEMENT
+
+%%
+
+input
+	: /* empty */
+	| input line
+	  {
+		cmd_idx = -1;
+		want_nodeval = false;
+		if (lexptr_begin != NULL) {
+			if (input_from_tty && lexptr_begin[0] != '\0')
+				add_history(lexptr_begin);
+			efree(lexptr_begin);
+			lexptr_begin = NULL;
+		}
+		if (arg_list != NULL) {
+			free_cmdarg(arg_list);
+			arg_list = NULL;
+		}
+	  }
+	;
+
+line
+	: nls
+	| command nls
+	  {
+		if (dbg_errcount == 0 && cmd_idx >= 0) {
+			Func_cmd cmdfunc;
+			bool terminate = false;
+			CMDARG *args;
+			int ctype = 0;
+
+			ctype = cmdtab[cmd_idx].type;
+
+			/* a blank line repeats previous command
+			 * (list, next, nexti, step, stepi and continue without arguments).
+			 * save the index in the command table; used in yylex
+			 */
+			if ((ctype == D_list
+					|| ctype == D_next
+					|| ctype == D_step
+					|| ctype == D_nexti
+					|| ctype == D_stepi
+					|| ctype == D_continue)
+				&& arg_list == NULL
+				&& ! in_commands
+				&& input_from_tty
+			)
+				repeat_idx = cmd_idx;
+			else
+				repeat_idx = -1;
+
+			/* call the command handler; reset the globals arg_list, cmd_idx,
+			 * since this handler could invoke yyparse again.
+			 * call do_commands for the list of commands in `commands';
+			 * arg_list isn't freed on return.
+			 */
+
+			cmdfunc = cmdtab[cmd_idx].cf_ptr;
+			if (in_commands)
+				cmdfunc = do_commands;
+			cmd_idx = -1;
+			want_nodeval = false;
+
+			args = arg_list;
+			arg_list = NULL;
+
+			terminate = (*cmdfunc)(args, ctype);
+			if (! in_commands || ctype == D_commands)
+				free_cmdarg(args);
+			if (terminate)
+				YYACCEPT;
+		}
+	  }
+	| error nls
+	  {
+		yyerrok;
+	  }
+	;
+
+control_cmd
+	: D_CONTINUE
+	| D_NEXT
+	| D_NEXTI
+	| D_STEP
+	| D_STEPI
+	;
+
+d_cmd
+	: D_UNDISPLAY
+	| D_UNWATCH
+	| D_DISABLE
+	| D_DELETE
+	;
+
+frame_cmd
+	: D_UP
+	| D_DOWN
+	| D_BACKTRACE
+	| D_FRAME
+	;
+
+break_cmd
+	: D_BREAK
+	| D_TBREAK
+	;
+
+/* mid-rule action buried in non-terminal to avoid conflict */
+set_want_nodeval
+	: { want_nodeval = true; }
+	;
+
+eval_prologue
+	: D_EVAL set_want_nodeval opt_param_list nls
+	  {
+		if (dbg_errcount == 0) {
+			/* don't free arg_list;	passed on to statement_list
+			 * non-terminal (empty rule action). See below.
+			 */
+			if (input_from_tty) {
+				dbg_prompt = eval_prompt;
+				fprintf(out_fp,
+		_("Type (g)awk statement(s). End with the command \"end\"\n"));
+				rl_inhibit_completion = 1;
+			}
+			cmd_idx = -1;
+			in_eval = true;
+		}
+	  }
+	;
+
+statement_list
+	: /* empty */
+	  {
+		$$ = append_statement(arg_list, (char *) start_EVAL);
+		if (read_a_line == read_commands_string)	/* unserializing 'eval' in 'commands' */
+			$$->a_string[0] = '\0';
+		free_cmdarg(arg_list);
+		arg_list = NULL;
+	  }
+	| statement_list D_STATEMENT { $$ = append_statement($1, lexptr_begin); } nls
+	  {
+		$$ = $3;
+	  }
+	;
+
+eval_cmd
+	: eval_prologue statement_list D_END
+	  {
+		arg_list = append_statement($2, (char *) end_EVAL);
+		if (read_a_line == read_commands_string) {	/* unserializing 'eval' in 'commands' */
+			char *str = arg_list->a_string;
+			size_t len = strlen(str);
+			assert(len > 2 && str[len - 2] == '}');
+			str[len - 2] = '\0';
+		}
+		if (input_from_tty) {
+			dbg_prompt = in_commands ? commands_prompt : dgawk_prompt;
+			rl_inhibit_completion = 0;
+		}
+		cmd_idx = find_command("eval", 4);
+		in_eval = false;
+	  }
+	| D_EVAL set_want_nodeval string_node
+	  {
+		NODE *n;
+		CMDARG *arg;
+		n = $3->a_node;
+		arg = append_statement(NULL, (char *) start_EVAL);
+		(void) append_statement(arg, n->stptr);
+		(void) append_statement(arg, (char *) end_EVAL);
+		free_cmdarg(arg_list);
+		arg_list = arg;
+	  }
+	;
+
+command
+	: D_HELP help_args
+	| D_QUIT
+	| D_RUN
+	| D_FINISH
+	| control_cmd opt_plus_integer
+	| frame_cmd opt_integer
+	  {
+		if (cmdtab[cmd_idx].class == D_FRAME
+				&& $2 != NULL && $2->a_int < 0)
+			yyerror(_("invalid frame number: %d"), $2->a_int);
+	  }
+	| D_INFO D_STRING
+	  {
+		int idx = find_argument($2);
+		if (idx < 0)
+			yyerror(_("info: invalid option - \"%s\""), $2->a_string);
+		else {
+			efree($2->a_string);
+			$2->a_string = NULL;
+			$2->type = D_argument;
+			$2->a_argument = argtab[idx].value;
+		}
+	  }
+	| D_IGNORE plus_integer D_INT
+	| D_ENABLE enable_args
+	| D_PRINT { want_nodeval = true; } print_args
+	| D_PRINTF { want_nodeval = true; } printf_args
+	| D_LIST list_args
+	| D_UNTIL location
+	| D_CLEAR location
+	| break_cmd break_args
+	| D_SET { want_nodeval = true; } variable '=' node
+	| D_OPTION option_args
+	| D_RETURN { want_nodeval = true; } opt_node
+	| D_DISPLAY { want_nodeval = true; } opt_variable
+	| D_WATCH { want_nodeval = true; } variable condition_exp
+	| d_cmd opt_integer_list
+	| D_DUMP opt_string
+	| D_SOURCE D_STRING
+	  {
+		if (in_cmd_src($2->a_string))
+			yyerror(_("source \"%s\": already sourced."), $2->a_string);
+	  }
+	| D_SAVE D_STRING
+	  {
+		if (! input_from_tty)
+			yyerror(_("save \"%s\": command not permitted."), $2->a_string);
+	  }
+	| D_COMMANDS commands_arg
+	  {
+		int type = 0;
+		int num;
+
+		if ($2 != NULL)
+			num = $2->a_int;
+
+		if (dbg_errcount != 0)
+			;
+		else if (in_commands)
+			yyerror(_("Can't use command `commands' for breakpoint/watchpoint commands"));
+		else if ($2 == NULL &&  ! (type = has_break_or_watch_point(&num, true)))
+			yyerror(_("no breakpoint/watchpoint has been set yet"));
+		else if ($2 != NULL && ! (type = has_break_or_watch_point(&num, false)))
+			yyerror(_("invalid breakpoint/watchpoint number"));
+		if (type) {
+			in_commands = true;
+			if (input_from_tty) {
+				dbg_prompt = commands_prompt;
+				fprintf(out_fp, _("Type commands for when %s %d is hit, one per line.\n"),
+								(type == D_break) ? "breakpoint" : "watchpoint", num);
+				fprintf(out_fp, _("End with the command \"end\"\n"));
+			}
+		}
+	  }
+	| D_END
+	  {
+		if (! in_commands)
+			yyerror(_("`end' valid only in command `commands' or `eval'"));
+		else {
+			if (input_from_tty)
+				dbg_prompt = dgawk_prompt;
+			in_commands = false;
+		}
+	  }
+	| D_SILENT
+	  {
+		if (! in_commands)
+			yyerror(_("`silent' valid only in command `commands'"));
+	  }
+	| D_TRACE D_STRING
+	  {
+		int idx = find_argument($2);
+		if (idx < 0)
+			yyerror(_("trace: invalid option - \"%s\""), $2->a_string);
+		else {
+			efree($2->a_string);
+			$2->a_string = NULL;
+			$2->type = D_argument;
+			$2->a_argument = argtab[idx].value;
+		}
+	  }
+	| D_CONDITION plus_integer { want_nodeval = true; } condition_exp
+	  {
+		int type;
+		int num = $2->a_int;
+		type = has_break_or_watch_point(&num, false);
+		if (! type)
+			yyerror(_("condition: invalid breakpoint/watchpoint number"));
+	  }
+	| eval_cmd
+	  {
+		if (in_commands) {
+			/* Prepend command 'eval' to argument list */
+			CMDARG *arg;
+			arg = mk_cmdarg(D_string);
+			arg->a_string = estrdup("eval", 4);
+			arg->next = arg_list;
+			arg_list = arg;
+		}
+	  }
+	;
+
+condition_exp
+	: opt_string_node
+	  {
+		if ($1 != NULL) {
+			NODE *n = $1->a_node;
+			$1->type = D_string;
+			$1->a_string = n->stptr;
+			freenode(n);
+		}
+		$$ = $1;
+	  }
+	;
+
+commands_arg
+	: opt_plus_integer
+	| error
+	  {	$$ = NULL; }
+	;
+
+opt_param_list
+	: /* empty */
+	  { $$ = NULL; }
+	| param_list
+	;
+
+param_list
+	: D_VARIABLE
+	| param_list D_VARIABLE
+	| param_list ',' D_VARIABLE
+	| error
+	  { $$ = NULL; }
+	;
+
+opt_string_node
+	: /* empty */
+	  { $$ = NULL; }
+	| string_node
+	| error
+	  { $$ = NULL; }
+	;
+
+string_node
+	: D_NODE
+	  {
+		NODE *n;
+		n = $1->a_node;
+		if ((n->flags & STRING) == 0)
+			yyerror(_("argument not a string"));
+	  }
+	;
+
+option_args
+	: /* empty */
+	  { $$ = NULL; }
+	| D_STRING
+	  {
+		if (find_option($1->a_string) < 0)
+			yyerror(_("option: invalid parameter - \"%s\""), $1->a_string);
+ 	  }
+	| D_STRING '=' D_STRING
+	  {
+		if (find_option($1->a_string) < 0)
+			yyerror(_("option: invalid parameter - \"%s\""), $1->a_string);
+ 	  }
+	;
+
+func_name
+	: D_STRING
+	  {
+		NODE *n;
+		n = lookup($1->a_string);
+		if (n == NULL || n->type != Node_func)
+			yyerror(_("no such function - \"%s\""), $1->a_string);
+		else {
+			$1->type = D_func;
+			efree($1->a_string);
+			$1->a_string = NULL;
+			$1->a_node = n;
+		}
+	  }
+	;
+
+location
+	: /* empty */
+	  { $$ = NULL; }
+	| plus_integer
+	| func_name
+	| D_STRING ':' plus_integer
+	| D_STRING ':' func_name
+	;
+
+break_args
+	: /* empty */
+	  { $$ = NULL; }
+	| plus_integer { want_nodeval = true; } condition_exp
+	| func_name
+	| D_STRING ':' plus_integer { want_nodeval = true; } condition_exp
+	| D_STRING ':' func_name
+	;
+
+opt_variable
+	: /* empty */
+	  { $$ = NULL; }
+	| variable
+	;
+
+opt_string
+	: /* empty */
+	  { $$ = NULL; }
+	| D_STRING
+	;
+
+opt_node
+	: /* empty */
+	  { $$ = NULL; }
+	| node
+	;
+
+help_args
+	: /* empty */
+	| D_STRING
+	;
+
+enable_args
+	: opt_integer_list
+	| D_STRING opt_integer_list
+	  {
+		int idx = find_argument($1);
+		if (idx < 0)
+			yyerror(_("enable: invalid option - \"%s\""), $1->a_string);
+		else {
+			efree($1->a_string);
+			$1->a_string = NULL;
+			$1->type = D_argument;
+			$1->a_argument = argtab[idx].value;
+		}
+	  }
+	;
+
+print_exp
+	: variable
+	| '@' D_VARIABLE
+	  {
+		$2->type = D_array;	/* dump all items */
+		$2->a_count = 0;
+	  }
+	| '@' D_VARIABLE subscript_list /* dump sub-array items*/
+	  {
+		$2->type = D_array;
+		$2->a_count = num_dim;
+	  }
+	;
+
+print_args
+	: print_exp
+	| print_args print_exp
+	| print_args ',' print_exp
+	| error
+	;
+
+printf_exp
+	: D_NODE
+	| variable
+	;
+
+printf_args
+	: printf_exp
+	| printf_args ',' printf_exp
+	| error
+	;
+
+list_args
+	: /* empty */
+	  { $$ = NULL; }
+	| '+'
+	  { $$ = NULL; }
+	| '-'
+	  {
+		CMDARG *a;
+		a = mk_cmdarg(D_int);
+		a->a_int = -1;
+		append_cmdarg(a);
+	  }
+	| plus_integer
+	| func_name
+	| integer_range
+	| D_STRING ':' plus_integer
+	| D_STRING ':' func_name
+	| D_STRING ':' integer_range
+	;
+
+integer_range
+	: plus_integer '-' plus_integer
+	  {
+		if ($1->a_int > $3->a_int)
+			yyerror(_("invalid range specification: %d - %d"),
+				$1->a_int, $3->a_int);
+		else
+			$1->type = D_range;
+		$$ = $1;
+	  }
+	;
+
+opt_integer_list
+	: /* empty */
+	  { $$ = NULL; }
+	| integer_list
+	| error
+	;
+
+integer_list
+	: plus_integer
+	| integer_range
+	| integer_list plus_integer
+	| integer_list integer_range
+	;
+
+exp_list
+	: node
+	  { $$ = $1; }
+	| exp_list ',' node
+	  { $$ = $1; }
+	| error
+	;
+
+subscript
+	: '[' exp_list ']'
+	  {
+		CMDARG *a;
+		NODE *subs;
+		int count = 0;
+
+		for (a = $2; a != NULL; a = a->next)
+			count++;
+		subs = concat_args($2, count);
+		free_cmdarg($2->next);
+		$2->next = NULL;
+		$2->type = D_node;
+		$2->a_node = subs;
+		$$ = $2;
+	  }
+	| '[' exp_list error
+	;
+
+subscript_list
+	: subscript
+	  { $$ = $1; num_dim = 1; }
+	| subscript_list subscript
+	  {	$$ = $1; num_dim++; }
+	;
+
+variable
+	: D_VARIABLE
+	| '$' D_NODE
+	  {
+		NODE *n = $2->a_node;
+		if ((n->flags & NUMBER) == 0)
+			yyerror(_("non-numeric value for field number"));
+		else
+			$2->type = D_field;
+		$$ = $2;
+	  }
+	| D_VARIABLE subscript_list
+	  {
+		/* a_string is array name, a_count is dimension count */
+		$1->type = D_subscript;
+		$1->a_count = num_dim;
+		$$ = $1;
+	  }
+	;
+
+node
+	: D_NODE
+	  { $$ = $1; }
+	| '+' D_NODE
+	  {
+		NODE *n = $2->a_node;
+		if ((n->flags & NUMBER) == 0)
+			yyerror(_("non-numeric value found, numeric expected"));
+		$$ = $2;
+	  }
+	| '-' D_NODE
+	  {
+		NODE *n = $2->a_node;
+		if ((n->flags & NUMBER) == 0)
+			yyerror(_("non-numeric value found, numeric expected"));
+		else
+			negate_num(n);
+		$$ = $2;
+	  }
+	;
+
+opt_plus_integer
+	: /* empty */
+	  { $$ = NULL; }
+	| plus_integer
+	  { $$ = $1; }
+	;
+
+opt_integer
+	: /* empty */
+	  { $$ = NULL; }
+	| integer
+	  { $$ = $1; }
+	;
+
+plus_integer
+	: D_INT
+	  {
+		if ($1->a_int == 0)
+			yyerror(_("non-zero integer value"));
+		$$ = $1;
+	  }
+	| '+' D_INT
+	  {
+		if ($2->a_int == 0)
+			yyerror(_("non-zero integer value"));
+		$$ = $2;
+	  }
+	;
+
+integer
+	: D_INT
+	  { $$ = $1; }
+	| '+' D_INT
+	  { $$ = $2; }
+	| '-' D_INT
+	  {
+		$2->a_int = - $2->a_int;
+		$$ = $2;
+	  }
+	;
+
+nls
+	: '\n'
+	  {
+		if (lexptr_begin != NULL) {
+			if (input_from_tty && lexptr_begin[0] != '\0')
+				add_history(lexptr_begin);
+			efree(lexptr_begin);
+			lexptr_begin = NULL;
+		}
+	  }
+	;
+
+%%
+
+
+/* append_statement --- append 'stmt' to the list of eval awk statements */
+
+static CMDARG *
+append_statement(CMDARG *stmt_list, char *stmt)
+{
+	CMDARG *a, *arg;
+	char *s;
+	int len, slen, ssize;
+
+#define EVALSIZE	512
+
+	if (stmt == start_EVAL) {
+		len = sizeof(start_EVAL);
+		for (a = stmt_list; a != NULL; a = a->next)
+			len += strlen(a->a_string) + 1;	/* 1 for ',' */
+		len += EVALSIZE;
+
+		emalloc(s, char *, (len + 1) * sizeof(char), "append_statement");
+		arg = mk_cmdarg(D_string);
+		arg->a_string = s;
+		arg->a_count = len;	/* kludge */
+
+		slen = sizeof("function @eval(") - 1;
+		memcpy(s, start_EVAL, slen);
+
+		for (a = stmt_list; a != NULL; a = a->next) {
+			len = strlen(a->a_string);
+			memcpy(s + slen, a->a_string, len);
+			slen += len;
+			if (a->next != NULL)
+				s[slen++] = ',';
+		}
+		s[slen++] = ')';
+		s[slen++] = '{';
+		s[slen] = '\0';
+		return arg;
+	}
+
+	len = strlen(stmt) + 1;	/* 1 for newline */
+	s = stmt_list->a_string;
+	slen = strlen(s);
+	ssize = stmt_list->a_count;
+	if (len > ssize - slen) {
+		ssize = slen + len + EVALSIZE;
+		erealloc(s, char *, (ssize + 1) * sizeof(char), "append_statement");
+		stmt_list->a_string = s;
+		stmt_list->a_count = ssize;
+	}
+	memcpy(s + slen, stmt, len);
+	slen += len;
+	if (slen >= 2 && s[slen - 2] != '\n') {
+		s[slen - 1] = '\n';
+		s[slen] = '\0';
+	}
+
+	if (stmt == end_EVAL)
+		erealloc(stmt_list->a_string, char *, slen + 1, "append_statement");
+	return stmt_list;
+
+#undef EVALSIZE
+}
+
+
+/* command names sorted in ascending order */
+
+struct cmdtoken cmdtab[] = {
+{ "backtrace", "bt", D_backtrace, D_BACKTRACE, do_backtrace,
+	gettext_noop("backtrace [N] - print trace of all or N innermost (outermost if N < 0) frames.") },
+{ "break", "b", D_break, D_BREAK, do_breakpoint,
+	gettext_noop("break [[filename:]N|function] - set breakpoint at the specified location.") },
+{ "clear", "", D_clear, D_CLEAR, do_clear,
+	gettext_noop("clear [[filename:]N|function] - delete breakpoints previously set.") },
+{ "commands", "", D_commands, D_COMMANDS, do_commands,
+	gettext_noop("commands [num] - starts a list of commands to be executed at a breakpoint(watchpoint) hit.") },
+{ "condition", "", D_condition, D_CONDITION, do_condition,
+	gettext_noop("condition num [expr] - set or clear breakpoint or watchpoint condition.") },
+{ "continue", "c", D_continue, D_CONTINUE, do_continue,
+	gettext_noop("continue [COUNT] - continue program being debugged.") },
+{ "delete", "d", D_delete, D_DELETE, do_delete_breakpoint,
+	gettext_noop("delete [breakpoints] [range] - delete specified breakpoints.") },
+{ "disable", "", D_disable, D_DISABLE, do_disable_breakpoint,
+	gettext_noop("disable [breakpoints] [range] - disable specified breakpoints.") },
+{ "display", "", D_display, D_DISPLAY, do_display,
+	gettext_noop("display [var] - print value of variable each time the program stops.") },
+{ "down", "", D_down, D_DOWN, do_down,
+	gettext_noop("down [N] - move N frames down the stack.") },
+{ "dump", "", D_dump, D_DUMP, do_dump_instructions,
+	gettext_noop("dump [filename] - dump instructions to file or stdout.") },
+{ "enable", "e", D_enable, D_ENABLE, do_enable_breakpoint,
+	gettext_noop("enable [once|del] [breakpoints] [range] - enable specified breakpoints.") },
+{ "end", "", D_end, D_END, do_commands,
+	gettext_noop("end - end a list of commands or awk statements.") },
+{ "eval", "", D_eval, D_EVAL, do_eval,
+	gettext_noop("eval stmt|[p1, p2, ...] - evaluate awk statement(s).") },
+{ "exit", "", D_quit, D_QUIT, do_quit,
+	gettext_noop("exit - (same as quit) exit debugger.") },
+{ "finish", "", D_finish, D_FINISH, do_finish,
+	gettext_noop("finish - execute until selected stack frame returns.") },
+{ "frame", "f", D_frame, D_FRAME, do_frame,
+	gettext_noop("frame [N] - select and print stack frame number N.") },
+{ "help", "h", D_help, D_HELP, do_help,
+	gettext_noop("help [command] - print list of commands or explanation of command.") },
+{ "ignore", "", D_ignore, D_IGNORE, do_ignore_breakpoint,
+	gettext_noop("ignore N COUNT - set ignore-count of breakpoint number N to COUNT.") },
+{ "info", "i", D_info, D_INFO, do_info,
+	gettext_noop("info topic - source|sources|variables|functions|break|frame|args|locals|display|watch.") },
+{ "list", "l", D_list, D_LIST, do_list,
+	gettext_noop("list [-|+|[filename:]lineno|function|range] - list specified line(s).") },
+{ "next", "n", D_next, D_NEXT, do_next,
+	gettext_noop("next [COUNT] - step program, proceeding through subroutine calls.") },
+{ "nexti", "ni", D_nexti, D_NEXTI, do_nexti,
+	gettext_noop("nexti [COUNT] - step one instruction, but proceed through subroutine calls.") },
+{ "option", "o", D_option, D_OPTION, do_option,
+	gettext_noop("option [name[=value]] - set or display debugger option(s).") },
+{ "print", "p", D_print, D_PRINT, do_print_var,
+	gettext_noop("print var [var] - print value of a variable or array.") },
+{ "printf", "", D_printf, D_PRINTF, do_print_f,
+	gettext_noop("printf format, [arg], ... - formatted output.") },
+{ "quit", "q", D_quit, D_QUIT, do_quit,
+	gettext_noop("quit - exit debugger.") },
+{ "return", "", D_return, D_RETURN, do_return,
+	gettext_noop("return [value] - make selected stack frame return to its caller.") },
+{ "run", "r", D_run, D_RUN, do_run,
+	gettext_noop("run - start or restart executing program.") },
+#ifdef HAVE_LIBREADLINE
+{ "save", "", D_save, D_SAVE, do_save,
+	gettext_noop("save filename - save commands from the session to file.") },
+#endif
+{ "set", "", D_set, D_SET, do_set_var,
+	gettext_noop("set var = value - assign value to a scalar variable.") },
+{ "silent", "", D_silent, D_SILENT, do_commands,
+	gettext_noop("silent - suspends usual message when stopped at a breakpoint/watchpoint.") },
+{ "source", "", D_source, D_SOURCE, do_source,
+	gettext_noop("source file - execute commands from file.") },
+{ "step", "s", D_step, D_STEP, do_step,
+	gettext_noop("step [COUNT] - step program until it reaches a different source line.") },
+{ "stepi", "si", D_stepi, D_STEPI, do_stepi,
+	gettext_noop("stepi [COUNT] - step one instruction exactly.") },
+{ "tbreak", "t", D_tbreak, D_TBREAK, do_tmp_breakpoint,
+	gettext_noop("tbreak [[filename:]N|function] - set a temporary breakpoint.") },
+{ "trace", "", D_trace, D_TRACE, do_trace_instruction,
+	gettext_noop("trace on|off - print instruction before executing.") },
+{ "undisplay",	"", D_undisplay, D_UNDISPLAY, do_undisplay,
+	gettext_noop("undisplay [N] - remove variable(s) from automatic display list.") },
+{ "until", "u", D_until, D_UNTIL, do_until,
+	gettext_noop("until [[filename:]N|function] - execute until program reaches a different line or line N within current frame.") },
+{ "unwatch", "", D_unwatch, D_UNWATCH, do_unwatch,
+	gettext_noop("unwatch [N] - remove variable(s) from watch list.") },
+{ "up",	"", D_up, D_UP, do_up,
+	gettext_noop("up [N] - move N frames up the stack.") },
+{ "watch", "w", D_watch, D_WATCH, do_watch,
+	gettext_noop("watch var - set a watchpoint for a variable.") },
+{ "where", "", D_backtrace, D_BACKTRACE, do_backtrace,
+	gettext_noop("where [N] - (same as backtrace) print trace of all or N innermost (outermost if N < 0) frames.") },
+{ NULL, NULL, D_illegal, 0, (Func_cmd) 0,
+	 NULL },
+};
+
+struct argtoken argtab[] = {
+	{ "args", D_info, A_ARGS },
+	{ "break", D_info, A_BREAK },
+	{ "del", D_enable, A_DEL },
+	{ "display", D_info, A_DISPLAY },
+	{ "frame", D_info, A_FRAME },
+	{ "functions", D_info, A_FUNCTIONS },
+	{ "locals", D_info, A_LOCALS },
+	{ "off", D_trace, A_TRACE_OFF },
+	{ "on", D_trace, A_TRACE_ON },
+	{ "once", D_enable, A_ONCE },
+	{ "source", D_info, A_SOURCE },
+	{ "sources", D_info, A_SOURCES },
+	{ "variables", D_info, A_VARIABLES },
+	{ "watch", D_info, A_WATCH },
+	{ NULL, D_illegal, A_NONE },
+};
+
+
+/* get_command --- return command handler function */
+
+Func_cmd
+get_command(int ctype)
+{
+	int i;
+	for (i = 0; cmdtab[i].name != NULL; i++) {
+		if (cmdtab[i].type == ctype)
+			return cmdtab[i].cf_ptr;
+	}
+	return (Func_cmd) 0;
+}
+
+/* get_command_name --- return command name given it's type */
+
+const char *
+get_command_name(int ctype)
+{
+	int i;
+	for (i = 0; cmdtab[i].name != NULL; i++) {
+		if (cmdtab[i].type == ctype)
+			return cmdtab[i].name;
+	}
+	return NULL;
+}
+
+/* mk_cmdarg --- make an argument for command */
+
+static CMDARG *
+mk_cmdarg(enum argtype type)
+{
+	CMDARG *arg;
+	ezalloc(arg, CMDARG *, sizeof(CMDARG), "mk_cmdarg");
+	arg->type = type;
+	return arg;
+}
+
+/* append_cmdarg --- append ARG to the list of arguments for the current command */
+
+static void
+append_cmdarg(CMDARG *arg)
+{
+	static CMDARG *savetail;
+
+	if (arg_list == NULL)
+		arg_list = arg;
+	else
+		savetail->next = arg;
+	savetail = arg;
+}
+
+/* free_cmdarg --- free all arguments in LIST */
+
+void
+free_cmdarg(CMDARG *list)
+{
+	CMDARG *arg, *nexta;
+
+	for (arg = list; arg != NULL; arg = nexta) {
+		nexta = arg->next;
+
+		switch (arg->type) {
+		case D_variable:
+		case D_subscript:
+		case D_array:
+		case D_string:
+			if (arg->a_string != NULL)
+				efree(arg->a_string);
+			break;
+		case D_node:
+		case D_field:
+			unref(arg->a_node);
+			break;
+		default:
+			break;
+		}
+		efree(arg);
+	}
+}
+
+/* yyerror --- print a syntax error message */
+
+static void
+yyerror(const char *mesg, ...)
+{
+	va_list args;
+	va_start(args, mesg);
+	fprintf(out_fp, _("error: "));
+	vfprintf(out_fp, mesg, args);
+	fprintf(out_fp, "\n");
+	va_end(args);
+	dbg_errcount++;
+	repeat_idx = -1;
+}
+
+
+/* yylex --- read a command and turn it into tokens */
+
+static int
+#ifdef USE_EBCDIC
+yylex_ebcdic(void)
+#else
+yylex(void)
+#endif
+{
+	static char *lexptr = NULL;
+	static char *lexend;
+	int c;
+	char *tokstart;
+	size_t toklen;
+
+	yylval = (CMDARG *) NULL;
+
+	if (dbg_errcount > 0 && lexptr_begin == NULL) {
+		/* fake a new line */
+		dbg_errcount = 0;
+		return '\n';
+	}
+
+	if (lexptr_begin == NULL) {
+again:
+		lexptr_begin = read_a_line(dbg_prompt);
+		if (lexptr_begin == NULL) {	/* EOF or error */
+			if (get_eof_status() == EXIT_FATAL)
+				exit(EXIT_FATAL);
+			if (get_eof_status() == EXIT_FAILURE) {
+				static int seen_eof = 0;
+
+				/* force a quit, and let do_quit (in debug.c) exit */
+				if (! seen_eof) {
+					if (errno != 0)	{
+						fprintf(stderr, _("can't read command (%s)\n"), strerror(errno));
+						exit_val = EXIT_FAILURE;
+					} /* else
+						exit_val = EXIT_SUCCESS; */
+
+					seen_eof = 1;
+					return '\n';	/* end current command if any */
+				} else if (seen_eof++ == 1) {
+					cmd_idx = find_command("quit", 4);
+					return D_QUIT;	/* 'quit' token */
+				} else
+					return '\n';	/* end command 'quit' */
+			}
+			if (errno != 0)
+				d_error(_("can't read command (%s)"), strerror(errno));
+			if (pop_cmd_src() == 0)
+				goto again;
+			exit(EXIT_FATAL);	/* shouldn't happen */
+		}
+
+		if (! in_commands && ! in_eval	/* history expansion off in 'commands' and 'eval' */
+				&& input_from_tty
+		)
+			history_expand_line(&lexptr_begin);
+
+		lexptr = lexptr_begin;
+		lexend = lexptr + strlen(lexptr);
+		if (*lexptr == '\0'		/* blank line */
+				&& repeat_idx >= 0
+				&& input_from_tty
+				&& ! in_eval
+		) {
+#ifdef HAVE_LIBREADLINE
+			HIST_ENTRY *h;
+			h = previous_history();
+			if (h != NULL)
+				add_history(h->line);
+#endif
+			cmd_idx = repeat_idx;
+			return cmdtab[cmd_idx].class;	/* repeat last command */
+		}
+		repeat_idx = -1;
+	}
+
+	c = *lexptr;
+
+	while (c == ' ' || c == '\t')
+		c = *++lexptr;
+
+	if (! input_from_tty && c == '#')
+		return '\n';
+
+	tokstart = lexptr;
+	if (lexptr >= lexend)
+		return '\n';
+
+	if (cmd_idx < 0) {	/* need a command */
+		if (c == '?' && tokstart[1] == '\0'	&& ! in_eval) {
+			lexptr++;
+			cmd_idx = find_command("help", 4);
+			return D_HELP;
+		}
+
+		while (c != '\0' && c != ' ' && c != '\t') {
+			if (! is_alpha(c) && ! in_eval) {
+				yyerror(_("invalid character in command"));
+				return '\n';
+			}
+			c = *++lexptr;
+		}
+
+		toklen = lexptr - tokstart;
+
+		if (in_eval) {
+			if (toklen == 3
+					&& tokstart[3] == '\0'
+					&& tokstart[0] == 'e'
+					&& tokstart[1] == 'n'
+					&& tokstart[2] == 'd'
+			) {
+				cmd_idx = find_command(tokstart, toklen);
+				return D_END;
+			}
+			lexptr = lexend;
+			return D_STATEMENT;
+		}
+
+		cmd_idx = find_command(tokstart, toklen);
+		if (cmd_idx >= 0) {
+			if (in_commands && cmdtab[cmd_idx].type != D_eval) {
+				/* add the actual command string (lexptr_begin) to
+				 * arg_list; command string for 'eval' prepended to the arg_list
+				 * in the grammer above (see eval_cmd non-terminal).
+				 */
+				CMDARG *arg;
+				arg = mk_cmdarg(D_string);
+				arg->a_string = estrdup(lexptr_begin, lexend - lexptr_begin);
+				append_cmdarg(arg);
+			}
+			return cmdtab[cmd_idx].class;
+		} else {
+			yyerror(_("unknown command - \"%.*s\", try help"), toklen, tokstart);
+			return '\n';
+		}
+	}
+
+	c = *lexptr;
+
+	if (cmdtab[cmd_idx].type == D_option) {
+		if (c == '=')
+			return *lexptr++;
+	} else if (c == '-' || c == '+' || c == ':' || c == '|')
+		return *lexptr++;
+
+	if (c == '"') {
+		char *str, *p;
+		int flags = ALREADY_MALLOCED;
+		bool esc_seen = false;
+
+		toklen = lexend - lexptr;
+		emalloc(str, char *, toklen + 1, "yylex");
+		p = str;
+
+		while ((c = *++lexptr) != '"') {
+			if (lexptr == lexend) {
+err:
+				efree(str);
+				yyerror(_("unterminated string"));
+				return '\n';
+			}
+			if (c == '\\') {
+				c = *++lexptr;
+				esc_seen = true;
+				if (want_nodeval || c != '"')
+					*p++ = '\\';
+			}
+			if (lexptr == lexend)
+				goto err;
+			*p++ = c;
+		}
+		lexptr++;
+		*p = '\0';
+
+		if (! want_nodeval) {
+			yylval = mk_cmdarg(D_string);
+			yylval->a_string = str;
+			append_cmdarg(yylval);
+			return D_STRING;
+		} else {	/* awk string */
+			if (esc_seen)
+				flags |= SCAN;
+			yylval = mk_cmdarg(D_node);
+			yylval->a_node = make_str_node(str, p - str, flags);
+			append_cmdarg(yylval);
+			return D_NODE;
+		}
+	}
+
+	if (! want_nodeval) {
+		while ((c = *++lexptr) != '\0' && c != ':' && c != '-'
+					&& c != ' ' && c != '\t' && c != '=')
+			;
+
+		/* Is it an integer? */
+		if (isdigit((unsigned char) tokstart[0]) && cmdtab[cmd_idx].type != D_option) {
+			char *end;
+			long l;
+
+			errno = 0;
+			l = strtol(tokstart, &end, 0);
+			if (errno != 0) {
+				yyerror(_("%s"), strerror(errno));
+				errno = 0;
+				return '\n';
+			}
+
+			if (lexptr == end) {
+				yylval = mk_cmdarg(D_int);
+				yylval->a_int = l;
+				append_cmdarg(yylval);
+				return D_INT;
+			}
+		}
+
+		/* Must be string */
+		yylval = mk_cmdarg(D_string);
+		yylval->a_string = estrdup(tokstart, lexptr - tokstart);
+		append_cmdarg(yylval);
+		return D_STRING;
+	}
+
+	/* look for awk number */
+
+	if (isdigit((unsigned char) tokstart[0])) {
+		NODE *r = NULL;
+
+		errno = 0;
+#ifdef HAVE_MPFR
+		if (do_mpfr) {
+			int tval;
+			r = mpg_float();
+			tval = mpfr_strtofr(r->mpg_numbr, tokstart, & lexptr, 0, ROUND_MODE);
+			IEEE_FMT(r->mpg_numbr, tval);
+			if (mpfr_integer_p(r->mpg_numbr)) {
+				/* integral value, convert to a GMP type. */
+				NODE *tmp = r;
+				r = mpg_integer();
+				mpfr_get_z(r->mpg_i, tmp->mpg_numbr, MPFR_RNDZ);
+				unref(tmp);
+			}
+		} else
+#endif
+			r = make_number(strtod(tokstart, & lexptr));
+
+		if (errno != 0) {
+			yyerror(strerror(errno));
+			unref(r);
+			errno = 0;
+			return '\n';
+		}
+		yylval = mk_cmdarg(D_node);
+		yylval->a_node = r;
+		append_cmdarg(yylval);
+		return D_NODE;
+	}
+
+	c = *lexptr;
+	if (c == '$' || c == '@'
+			|| c == '[' || c == ']'
+			|| c == ',' || c == '=')
+		return *lexptr++;
+
+	if (! is_letter(c)) {
+		yyerror(_("invalid character"));
+		return '\n';
+	}
+
+	while (is_identchar(c))
+		c = *++lexptr;
+	toklen = lexptr - tokstart;
+
+	/* awk variable */
+	yylval = mk_cmdarg(D_variable);
+	yylval->a_string = estrdup(tokstart, toklen);
+	append_cmdarg(yylval);
+	return D_VARIABLE;
+}
+
+/* Convert single-character tokens coming out of yylex() from EBCDIC to
+   ASCII values on-the-fly so that the parse tables need not be regenerated
+   for EBCDIC systems.  */
+#ifdef USE_EBCDIC
+static int
+yylex(void)
+{
+	static char etoa_xlate[256];
+	static int do_etoa_init = 1;
+	int tok;
+
+	if (do_etoa_init)
+	{
+		for (tok = 0; tok < 256; tok++)
+			etoa_xlate[tok] = (char) tok;
+#ifdef HAVE___ETOA_L
+		/* IBM helpfully provides this function.  */
+		__etoa_l(etoa_xlate, sizeof(etoa_xlate));
+#else
+# error "An EBCDIC-to-ASCII translation function is needed for this system"
+#endif
+		do_etoa_init = 0;
+	}
+
+	tok = yylex_ebcdic();
+
+	if (tok >= 0 && tok <= 0xFF)
+		tok = etoa_xlate[tok];
+
+	return tok;
+}
+#endif /* USE_EBCDIC */
+
+/* find_argument --- find index in 'argtab' for a command option */
+
+static int
+find_argument(CMDARG *arg)
+{
+	/* non-number argument */
+	int idx;
+	char *name, *p;
+	size_t len;
+	assert(cmd_idx >= 0);
+	name = arg->a_string;
+	len = strlen(name);
+	for (idx = 0; (p = (char *) argtab[idx].name) != NULL; idx++) {
+		if (cmdtab[cmd_idx].type == argtab[idx].cmd
+				&& *p == *name
+				&& strlen(p) == len
+				&& strncmp(p, name, len) == 0
+		)
+			return idx;
+	}
+	return -1;	/* invalid option */
+}
+
+/* concat_args --- concatenate argument strings into a single string NODE */
+
+static NODE *
+concat_args(CMDARG *arg, int count)
+{
+	NODE *n;
+	NODE **tmp;
+	char *str, *subsep, *p;
+	long len, subseplen;
+	int i;
+
+	if (count == 1) {
+		n = force_string(arg->a_node);
+		return dupnode(n);
+	}
+
+	emalloc(tmp, NODE **, count * sizeof(NODE *), "concat_args");
+	subseplen = SUBSEP_node->var_value->stlen;
+	subsep = SUBSEP_node->var_value->stptr;
+	len = -subseplen;
+
+	for (i = 0; i < count; i++) {
+		n = force_string(arg->a_node);
+		len += n->stlen + subseplen;
+		tmp[i] = n;
+		arg = arg->next;
+	}
+
+	emalloc(str, char *, len + 1, "concat_args");
+	n = tmp[0];
+	memcpy(str, n->stptr, n->stlen);
+	p = str + n->stlen;
+	for (i = 1; i < count; i++) {
+		if (subseplen == 1)
+			*p++ = *subsep;
+		else if (subseplen > 0) {
+			memcpy(p, subsep, subseplen);
+			p += subseplen;
+		}
+
+		n = tmp[i];
+		memcpy(p, n->stptr, n->stlen);
+		p += n->stlen;
+	}
+	str[len] = '\0';
+	efree(tmp);
+	return make_str_node(str, len, ALREADY_MALLOCED);
+}
+
+/* find_command --- find the index in 'cmdtab' using exact,
+ *                  abbreviation or unique partial match
+ */
+
+static int
+find_command(const char *token, size_t toklen)
+{
+	char *name, *abrv;
+	int i, k;
+	bool try_exact = true;
+	int abrv_match = -1;
+	int partial_match = -1;
+
+#ifdef USE_EBCDIC
+	/* make sure all lower case characters in token (sorting
+	 * isn't the solution in this case)
+	 */
+	for (i = 0; i < toklen; i++) {
+		if (token[i] != tolower(token[i]))
+			return -1;
+	}
+#endif
+
+	k = sizeof(cmdtab)/sizeof(cmdtab[0]) - 1;
+	for (i = 0; i < k; i++) {
+		name = (char *) cmdtab[i].name;
+		if (try_exact && *token == *name
+				&& toklen == strlen(name)
+				&& strncmp(name, token, toklen) == 0
+		)
+			return i;
+
+		if (*name > *token || i == (k - 1))
+			try_exact = false;
+
+		if (abrv_match < 0) {
+			abrv = cmdtab[i].abbrvn;
+			if (abrv[0] == token[0]) {
+				if (toklen == 1 && ! abrv[1])
+					abrv_match = i;
+				else if (toklen == 2 && abrv[1] == token[1])
+					abrv_match = i;
+			}
+		}
+		if (! try_exact && abrv_match >= 0)
+			return abrv_match;
+		if (partial_match < 0) {
+			if (*token == *name
+					&& toklen < strlen(name)
+					&& strncmp(name, token, toklen) == 0
+			) {
+				if ((i == k - 1 || strncmp(cmdtab[i + 1].name, token, toklen) != 0)
+					&& (i == 0 || strncmp(cmdtab[i - 1].name, token, toklen) != 0)
+				)
+					partial_match = i;
+			}
+		}
+	}
+	return partial_match;
+}
+
+/* do_help -- help command */
+
+int
+do_help(CMDARG *arg, int cmd)
+{
+	int i;
+	if (arg == NULL) {
+		initialize_pager(out_fp);
+		if (setjmp(pager_quit_tag) == 0) {
+			for (i = 0; cmdtab[i].name != NULL; i++) {
+				gprintf(out_fp, "%s:\n", cmdtab[i].name);
+				gprintf(out_fp, "\t%s\n", _(cmdtab[i].help_txt));
+			}
+		}
+	} else if (arg->type == D_string) {
+		char *name;
+		name = arg->a_string;
+		i = find_command(name, strlen(name));
+		if (i >= 0) {
+			fprintf(out_fp, "%s\n", cmdtab[i].help_txt);
+			if (strcmp(cmdtab[i].name, "option") == 0)
+				option_help();
+		} else
+			fprintf(out_fp, _("undefined command: %s\n"), name);
+	}
+
+	return false;
+}
+
+
+#ifdef HAVE_LIBREADLINE
+
+/* next_word --- find the next word in a line to complete
+ *               (word seperation characters are space and tab).
+ */
+
+static char *
+next_word(char *p, int len, char **endp)
+{
+	char *q;
+	int i;
+
+	if (p == NULL || len <= 0)
+		return NULL;
+	for (i = 0; i < len; i++, p++)
+		if (*p != ' ' && *p != '\t')
+			break;
+	if (i == len)
+		return NULL;
+	if (endp != NULL) {
+		for (i++, q = p + 1; i < len; i++, q++)
+			if (*q == ' ' || *q == '\t')
+				break;
+		*endp = q;
+	}
+	return p;
+}
+
+/* command_completion --- attempt to complete based on the word number in line;
+ *    try to complete on command names if this is the first word; for the next
+ *    word(s), the type of completion depends on the command name (first word).
+ */
+
+#ifndef RL_READLINE_VERSION		/* < 4.2a */
+#define rl_completion_matches(x, y) completion_matches((char *) (x), (y))
+#endif
+
+
+char **
+command_completion(const char *text, int start, int end)
+{
+	char *cmdtok, *e;
+	int idx;
+	int len;
+
+	rl_attempted_completion_over = true;	/* no default filename completion please */
+
+	this_cmd = D_illegal;
+	len = start;
+	if ((cmdtok = next_word(rl_line_buffer, len, &e)) == NULL)	/* no first word yet */
+		return  rl_completion_matches(text, command_generator);
+	len -= (e - rl_line_buffer);
+
+	idx = find_command(cmdtok, e - cmdtok);
+	if (idx < 0)
+		return NULL;
+	this_cmd = cmdtab[idx].type;
+
+	if (! next_word(e, len, NULL)) {
+		switch (this_cmd) {
+		case D_break:
+		case D_list:
+		case D_until:
+		case D_tbreak:
+		case D_clear:
+			return rl_completion_matches(text, srcfile_generator);
+		case D_info:
+		case D_enable:
+		case D_trace:
+		case D_help:
+			return rl_completion_matches(text, argument_generator);
+		case D_option:
+			return rl_completion_matches(text, option_generator);
+		case D_print:
+		case D_printf:
+		case D_set:
+		case D_display:
+		case D_watch:
+			return rl_completion_matches(text, variable_generator);
+		default:
+			return NULL;
+		}
+	}
+
+	if (this_cmd == D_print || this_cmd == D_printf)
+		return rl_completion_matches(text, variable_generator);
+	return NULL;
+}
+
+/* command_generator --- generator function for command completion */
+
+static char *
+command_generator(const char *text, int state)
+{
+	static size_t textlen;
+	static int idx = 0;
+	char *name;
+
+	if (! state) {	/* first time */
+		textlen = strlen(text);
+		idx = 0;
+	}
+	while ((name = (char *) cmdtab[idx].name) != NULL) {
+		idx++;
+		if (strncmp(name, text, textlen) == 0)
+			return estrdup(name, strlen(name));
+	}
+	return NULL;
+}
+
+/* srcfile_generator --- generator function for source file completion */
+
+static char *
+srcfile_generator(const char *text, int state)
+{
+	static size_t textlen;
+	static SRCFILE *s;
+	char *name;
+	extern SRCFILE *srcfiles;
+
+	if (! state) {	/* first time */
+		textlen = strlen(text);
+		s = srcfiles->next;
+	}
+	while (s != srcfiles) {
+		if (s->stype != SRC_FILE && s->stype != SRC_INC) {
+			s = s->next;
+			continue;
+		}
+		name = s->src;
+		s = s->next;
+		if (strncmp(name, text, textlen) == 0)
+			return estrdup(name, strlen(name));
+	}
+	return NULL;
+}
+
+/* argument_generator --- generator function for non-number argument completion */
+
+static char *
+argument_generator(const char *text, int state)
+{
+	static size_t textlen;
+	static int idx;
+	const char *name;
+
+	if (! state) {	/* first time */
+		textlen = strlen(text);
+		idx = 0;
+	}
+
+	if (this_cmd == D_help) {
+		while ((name = cmdtab[idx++].name) != NULL) {
+			if (strncmp(name, text, textlen) == 0)
+				return estrdup(name, strlen(name));
+		}
+	} else {
+		while ((name = argtab[idx].name) != NULL) {
+			if (this_cmd != argtab[idx++].cmd)
+				continue;
+			if (strncmp(name, text, textlen) == 0)
+				return estrdup(name, strlen(name));
+		}
+	}
+	return NULL;
+}
+
+/* variable_generator --- generator function for variable name completion */
+
+static char *
+variable_generator(const char *text, int state)
+{
+	static size_t textlen;
+	static int idx = 0;
+	static NODE *func = NULL;
+	static NODE **vars = NULL;
+	const char *name;
+	NODE *r;
+
+	if (! state) {	/* first time */
+		textlen = strlen(text);
+		if (vars != NULL)
+			efree(vars);
+		vars = variable_list();
+		idx = 0;
+		func = get_function();  /* function in current context */
+	}
+
+	/* function params */
+	while (func != NULL) {
+		if (idx >= func->param_cnt) {
+			func = NULL;	/* don't try to match params again */
+			idx = 0;
+			break;
+		}
+		name = func->fparms[idx++].param;
+		if (strncmp(name, text, textlen) == 0)
+			return estrdup(name, strlen(name));
+	}
+
+	/* globals */
+	while ((r = vars[idx++]) != NULL) {
+		name = r->vname;
+		if (strncmp(name, text, textlen) == 0)
+			return estrdup(name, strlen(name));
+	}
+
+	return NULL;
+}
+
+/* history_expand_line ---  history expand the LINE */
+
+static void
+history_expand_line(char **line)
+{
+	int ret;
+	char *expansion;
+
+	if (! *line || input_fd != 0 || ! input_from_tty)
+		return;
+	using_history();
+	ret = history_expand(*line, &expansion);
+	if (ret < 0 || ret == 2)
+		efree(expansion);
+	else {
+		efree(*line);
+		*line = expansion;
+	}
+}
+
+#endif
diff --git a/gawk-5.0.1/compile b/gawk-5.0.1/compile
new file mode 100755
index 00000000000..99e50524b3b
--- /dev/null
+++ b/gawk-5.0.1/compile
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""	$nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+	# lazily determine how to convert abs files
+	case `uname -s` in
+	  MINGW*)
+	    file_conv=mingw
+	    ;;
+	  CYGWIN*)
+	    file_conv=cygwin
+	    ;;
+	  *)
+	    file_conv=wine
+	    ;;
+	esac
+      fi
+      case $file_conv/,$2, in
+	*,$file_conv,*)
+	  ;;
+	mingw/*)
+	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+	  ;;
+	cygwin/*)
+	  file=`cygpath -m "$file" || echo "$file"`
+	  ;;
+	wine/*)
+	  file=`winepath -w "$file" || echo "$file"`
+	  ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+	-o)
+	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
+	  eat=1
+	  case $2 in
+	    *.o | *.[oO][bB][jJ])
+	      func_file_conv "$2"
+	      set x "$@" -Fo"$file"
+	      shift
+	      ;;
+	    *)
+	      func_file_conv "$2"
+	      set x "$@" -Fe"$file"
+	      shift
+	      ;;
+	  esac
+	  ;;
+	-I)
+	  eat=1
+	  func_file_conv "$2" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-I*)
+	  func_file_conv "${1#-I}" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-l)
+	  eat=1
+	  func_cl_dashl "$2"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-l*)
+	  func_cl_dashl "${1#-l}"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-L)
+	  eat=1
+	  func_cl_dashL "$2"
+	  ;;
+	-L*)
+	  func_cl_dashL "${1#-L}"
+	  ;;
+	-static)
+	  shared=false
+	  ;;
+	-Wl,*)
+	  arg=${1#-Wl,}
+	  save_ifs="$IFS"; IFS=','
+	  for flag in $arg; do
+	    IFS="$save_ifs"
+	    linker_opts="$linker_opts $flag"
+	  done
+	  IFS="$save_ifs"
+	  ;;
+	-Xlinker)
+	  eat=1
+	  linker_opts="$linker_opts $2"
+	  ;;
+	-*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+	  func_file_conv "$1"
+	  set x "$@" -Tp"$file"
+	  shift
+	  ;;
+	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+	  func_file_conv "$1" mingw
+	  set x "$@" "$file"
+	  shift
+	  ;;
+	*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as 'compile cc -o foo foo.c'.
+	# So we strip '-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gawk-5.0.1/config.guess b/gawk-5.0.1/config.guess
new file mode 100755
index 00000000000..79d1317f52b
--- /dev/null
+++ b/gawk-5.0.1/config.guess
@@ -0,0 +1,1645 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2019 Free Software Foundation, Inc.
+
+timestamp='2019-03-04'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2019 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+    : "${TMPDIR=/tmp}"
+    # shellcheck disable=SC2039
+    { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+	{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+	{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+	{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+    dummy=$tmp/dummy
+    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+	,,)    echo "int x;" > "$dummy.c"
+	       for driver in cc gcc c89 c99 ; do
+		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+		       CC_FOR_BUILD="$driver"
+		       break
+		   fi
+	       done
+	       if test x"$CC_FOR_BUILD" = x ; then
+		   CC_FOR_BUILD=no_compiler_found
+	       fi
+	       ;;
+	,,*)   CC_FOR_BUILD=$CC ;;
+	,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+    esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "$UNAME_SYSTEM" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	set_cc_for_build
+	cat <<-EOF > "$dummy.c"
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`"
+
+	# If ldd exists, use it to detect musl libc.
+	if command -v ldd >/dev/null && \
+		ldd --version 2>&1 | grep -q ^musl
+	then
+	    LIBC=musl
+	fi
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    "/sbin/$sysctl" 2>/dev/null || \
+	    "/usr/sbin/$sysctl" 2>/dev/null || \
+	    echo unknown)`
+	case "$UNAME_MACHINE_ARCH" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine="${arch}${endian}"-unknown
+		;;
+	    *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently (or will in the future) and ABI.
+	case "$UNAME_MACHINE_ARCH" in
+	    earm*)
+		os=netbsdelf
+		;;
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# Determine ABI tags.
+	case "$UNAME_MACHINE_ARCH" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "$UNAME_VERSION" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "$machine-${os}${release}${abi-}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
+	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
+	exit ;;
+    *:MidnightBSD:*:*)
+	echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
+	exit ;;
+    *:SolidBSD:*:*)
+	echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
+	exit ;;
+    *:MirBSD:*:*)
+	echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
+	exit ;;
+    *:Sortix:*:*)
+	echo "$UNAME_MACHINE"-unknown-sortix
+	exit ;;
+    *:Redox:*:*)
+	echo "$UNAME_MACHINE"-unknown-redox
+	exit ;;
+    mips:OSF1:*.*)
+        echo mips-dec-osf1
+        exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE=alpha ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE=alphaev5 ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE=alphaev56 ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE=alphapca56 ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE=alphapca57 ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE=alphaev6 ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE=alphaev67 ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE=alphaev69 ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE=alphaev7 ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE=alphaev79 ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`"
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo "$UNAME_MACHINE"-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo "$UNAME_MACHINE"-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix"$UNAME_RELEASE"
+	exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux"$UNAME_RELEASE"
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	set_cc_for_build
+	SUN_ARCH=i386
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH=x86_64
+	    fi
+	fi
+	echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`"
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos"$UNAME_RELEASE"
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos"$UNAME_RELEASE"
+		;;
+	    sun4)
+		echo sparc-sun-sunos"$UNAME_RELEASE"
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos"$UNAME_RELEASE"
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint"$UNAME_RELEASE"
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint"$UNAME_RELEASE"
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint"$UNAME_RELEASE"
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint"$UNAME_RELEASE"
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint"$UNAME_RELEASE"
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint"$UNAME_RELEASE"
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten"$UNAME_RELEASE"
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten"$UNAME_RELEASE"
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix"$UNAME_RELEASE"
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix"$UNAME_RELEASE"
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix"$UNAME_RELEASE"
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+	  dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos"$UNAME_RELEASE"
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ]
+	then
+	    if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \
+	       [ "$TARGET_BINARY_INTERFACE"x = x ]
+	    then
+		echo m88k-dg-dgux"$UNAME_RELEASE"
+	    else
+		echo m88k-dg-dguxbcs"$UNAME_RELEASE"
+	    fi
+	else
+	    echo i586-dg-dgux"$UNAME_RELEASE"
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`"
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+	fi
+	echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		set_cc_for_build
+		sed 's/^		//' << EOF > "$dummy.c"
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+	else
+		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+	fi
+	echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd"$UNAME_RELEASE"   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+	case "$UNAME_MACHINE" in
+	    9000/31?)            HP_ARCH=m68000 ;;
+	    9000/[34]??)         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "$sc_cpu_version" in
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "$sc_kernel_bits" in
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "$HP_ARCH" = "" ]; then
+		    set_cc_for_build
+		    sed 's/^		//' << EOF > "$dummy.c"
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ "$HP_ARCH" = hppa2.0w ]
+	then
+	    set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH=hppa2.0w
+	    else
+		HP_ARCH=hppa64
+	    fi
+	fi
+	echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux"$HPUX_REV"
+	exit ;;
+    3050*:HI-UX:*:*)
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo "$UNAME_MACHINE"-unknown-osf1mk
+	else
+	    echo "$UNAME_MACHINE"-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi"$UNAME_RELEASE"
+	exit ;;
+    *:BSD/OS:*:*)
+	echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
+	exit ;;
+    arm:FreeBSD:*:*)
+	UNAME_PROCESSOR=`uname -p`
+	set_cc_for_build
+	if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_PCS_VFP
+	then
+	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi
+	else
+	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf
+	fi
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case "$UNAME_PROCESSOR" in
+	    amd64)
+		UNAME_PROCESSOR=x86_64 ;;
+	    i386)
+		UNAME_PROCESSOR=i586 ;;
+	esac
+	echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+	exit ;;
+    i*:CYGWIN*:*)
+	echo "$UNAME_MACHINE"-pc-cygwin
+	exit ;;
+    *:MINGW64*:*)
+	echo "$UNAME_MACHINE"-pc-mingw64
+	exit ;;
+    *:MINGW*:*)
+	echo "$UNAME_MACHINE"-pc-mingw32
+	exit ;;
+    *:MSYS*:*)
+	echo "$UNAME_MACHINE"-pc-msys
+	exit ;;
+    i*:PW*:*)
+	echo "$UNAME_MACHINE"-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case "$UNAME_MACHINE" in
+	    x86)
+		echo i586-pc-interix"$UNAME_RELEASE"
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix"$UNAME_RELEASE"
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix"$UNAME_RELEASE"
+		exit ;;
+	esac ;;
+    i*:UWIN*:*)
+	echo "$UNAME_MACHINE"-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-pc-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`"
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
+	exit ;;
+    *:Minix:*:*)
+	echo "$UNAME_MACHINE"-unknown-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    arm*:Linux:*:*)
+	set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
+	    else
+		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    cris:Linux:*:*)
+	echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+	exit ;;
+    crisv32:Linux:*:*)
+	echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+	exit ;;
+    e2k:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    frv:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    hexagon:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    i*86:Linux:*:*)
+	echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+	exit ;;
+    ia64:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    k1om:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    m32r*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    m68*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	set_cc_for_build
+	IS_GLIBC=0
+	test x"${LIBC}" = xgnu && IS_GLIBC=1
+	sed 's/^	//' << EOF > "$dummy.c"
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#undef mips64
+	#undef mips64el
+	#if ${IS_GLIBC} && defined(_ABI64)
+	LIBCABI=gnuabi64
+	#else
+	#if ${IS_GLIBC} && defined(_ABIN32)
+	LIBCABI=gnuabin32
+	#else
+	LIBCABI=${LIBC}
+	#endif
+	#endif
+
+	#if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa64r6
+	#else
+	#if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa32r6
+	#else
+	#if defined(__mips64)
+	CPU=mips64
+	#else
+	CPU=mips
+	#endif
+	#endif
+	#endif
+
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	MIPS_ENDIAN=el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	MIPS_ENDIAN=
+	#else
+	MIPS_ENDIAN=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`"
+	test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+	;;
+    mips64el:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-"$LIBC"
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-"$LIBC"
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-"$LIBC"
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
+	  PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
+	  *)    echo hppa-unknown-linux-"$LIBC" ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-"$LIBC"
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-"$LIBC"
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-"$LIBC"
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-"$LIBC"
+	exit ;;
+    riscv32:Linux:*:* | riscv64:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
+	exit ;;
+    sh64*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    sh*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    tile*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    vax:Linux:*:*)
+	echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
+	exit ;;
+    x86_64:Linux:*:*)
+	echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo "$UNAME_MACHINE"-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo "$UNAME_MACHINE"-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo "$UNAME_MACHINE"-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo "$UNAME_MACHINE"-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    i*86:*DOS:*:*)
+	echo "$UNAME_MACHINE"-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:*)
+	UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
+	else
+		echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
+	else
+		echo "$UNAME_MACHINE"-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configure will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv"$UNAME_RELEASE"  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv"$UNAME_RELEASE"
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo "$UNAME_MACHINE"-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel@ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo "$UNAME_MACHINE"-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux"$UNAME_RELEASE"
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv"$UNAME_RELEASE"
+	else
+		echo mips-unknown-sysv"$UNAME_RELEASE"
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody"$UNAME_RELEASE"
+	exit ;;
+    *:Rhapsody:*:*)
+	echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+		# On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+		if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_PPC >/dev/null
+		then
+		    UNAME_PROCESSOR=powerpc
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
+	echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = x86; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-*:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    NSR-*:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    NSV-*:NONSTOP_KERNEL:*:*)
+	echo nsv-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    NSX-*:NONSTOP_KERNEL:*:*)
+	echo nsx-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	# shellcheck disable=SC2154
+	if test "$cputype" = 386; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo "$UNAME_MACHINE"-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux"$UNAME_RELEASE"
+	exit ;;
+    *:DragonFly:*:*)
+	echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "$UNAME_MACHINE" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`"
+	exit ;;
+    i*86:rdos:*:*)
+	echo "$UNAME_MACHINE"-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo "$UNAME_MACHINE"-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo "$UNAME_MACHINE"-unknown-esx
+	exit ;;
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
+	exit ;;
+    *:Unleashed:*:*)
+	echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
+	exit ;;
+esac
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+  "4"
+#else
+  ""
+#endif
+  ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+  struct utsname un;
+
+  uname(&un);
+  if (strncmp(un.version, "V2", 2) == 0) {
+    printf ("i386-sequent-ptx2\n"); exit (0);
+  }
+  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+    printf ("i386-sequent-ptx1\n"); exit (0);
+  }
+  printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+  printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+  printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) /* >= ULTRIX4 */
+  printf ("mips-dec-ultrix4\n"); exit (0);
+#else
+#if defined(ULTRIX3) || defined(ultrix3) || defined(SIGLOST)
+  printf ("mips-dec-ultrix3\n"); exit (0);
+#endif
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM" in
+    mips:Linux | mips64:Linux)
+	# If we got here on MIPS GNU/Linux, output extra information.
+	cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+	;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+and
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM  = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/gawk-5.0.1/config.rpath b/gawk-5.0.1/config.rpath
new file mode 100755
index 00000000000..be202c1a9e7
--- /dev/null
+++ b/gawk-5.0.1/config.rpath
@@ -0,0 +1,684 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+#   Copyright 1996-2019 Free Software Foundation, Inc.
+#   Taken from GNU libtool, 2001
+#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+#   This file is free software; the Free Software Foundation gives
+#   unlimited permission to copy and/or distribute it, with or without
+#   modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+#   than 256 bytes, otherwise the compiler driver will dump core. The only
+#   known workaround is to choose shorter directory names for the build
+#   directory and/or the installation directory.
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+  wl='-Wl,'
+else
+  case "$host_os" in
+    aix*)
+      wl='-Wl,'
+      ;;
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      ;;
+    hpux9* | hpux10* | hpux11*)
+      wl='-Wl,'
+      ;;
+    irix5* | irix6* | nonstopux*)
+      wl='-Wl,'
+      ;;
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+        ecc*)
+          wl='-Wl,'
+          ;;
+        icc* | ifort*)
+          wl='-Wl,'
+          ;;
+        lf95*)
+          wl='-Wl,'
+          ;;
+        nagfor*)
+          wl='-Wl,-Wl,,'
+          ;;
+        pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+          wl='-Wl,'
+          ;;
+        ccc*)
+          wl='-Wl,'
+          ;;
+        xl* | bgxl* | bgf* | mpixl*)
+          wl='-Wl,'
+          ;;
+        como)
+          wl='-lopt='
+          ;;
+        *)
+          case `$CC -V 2>&1 | sed 5q` in
+            *Sun\ F* | *Sun*Fortran*)
+              wl=
+              ;;
+            *Sun\ C*)
+              wl='-Wl,'
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+    newsos6)
+      ;;
+    *nto* | *qnx*)
+      ;;
+    osf3* | osf4* | osf5*)
+      wl='-Wl,'
+      ;;
+    rdos*)
+      ;;
+    solaris*)
+      case $cc_basename in
+        f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+          wl='-Qoption ld '
+          ;;
+        *)
+          wl='-Wl,'
+          ;;
+      esac
+      ;;
+    sunos4*)
+      wl='-Qoption ld '
+      ;;
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      wl='-Wl,'
+      ;;
+    sysv4*MP*)
+      ;;
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      wl='-Wl,'
+      ;;
+    unicos*)
+      wl='-Wl,'
+      ;;
+    uts4*)
+      ;;
+  esac
+fi
+
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # Set some defaults for GNU ld with shared library support. These
+  # are reset later if shared libraries are not supported. Putting them
+  # here allows them to be overridden if necessary.
+  # Unlike libtool, we use -rpath here, not --rpath, since the documented
+  # option of GNU ld is called -rpath, not --rpath.
+  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  case "$host_os" in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+        ld_shlibs=no
+      fi
+      ;;
+    amigaos*)
+      case "$host_cpu" in
+        powerpc)
+          ;;
+        m68k)
+          hardcode_libdir_flag_spec='-L$libdir'
+          hardcode_minus_L=yes
+          ;;
+      esac
+      ;;
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    cygwin* | mingw* | pw32* | cegcc*)
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    haiku*)
+      ;;
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      ;;
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    netbsd*)
+      ;;
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+        ld_shlibs=no
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+          ld_shlibs=no
+          ;;
+        *)
+          if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+            hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+          else
+            ld_shlibs=no
+          fi
+          ;;
+      esac
+      ;;
+    sunos4*)
+      hardcode_direct=yes
+      ;;
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+  esac
+  if test "$ld_shlibs" = no; then
+    hardcode_libdir_flag_spec=
+  fi
+else
+  case "$host_os" in
+    aix3*)
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes; then
+        # Neither direct hardcoding nor static linking is supported with a
+        # broken collect2.
+        hardcode_direct=unsupported
+      fi
+      ;;
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+        # On IA64, the linker does run time linking by default, so we don't
+        # have to do anything special.
+        aix_use_runtimelinking=no
+      else
+        aix_use_runtimelinking=no
+        # Test if we are trying to use run time linking or normal
+        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+        # need to do runtime linking.
+        case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+          for ld_flag in $LDFLAGS; do
+            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+              aix_use_runtimelinking=yes
+              break
+            fi
+          done
+          ;;
+        esac
+      fi
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      if test "$GCC" = yes; then
+        case $host_os in aix4.[012]|aix4.[012].*)
+          collect2name=`${CC} -print-prog-name=collect2`
+          if test -f "$collect2name" && \
+            strings "$collect2name" | grep resolve_lib_name >/dev/null
+          then
+            # We have reworked collect2
+            :
+          else
+            # We have old collect2
+            hardcode_direct=unsupported
+            hardcode_minus_L=yes
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_libdir_separator=
+          fi
+          ;;
+        esac
+      fi
+      # Begin _LT_AC_SYS_LIBPATH_AIX.
+      echo 'int main () { return 0; }' > conftest.c
+      ${CC} ${LDFLAGS} conftest.c -o conftest
+      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      if test -z "$aix_libpath"; then
+        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      fi
+      if test -z "$aix_libpath"; then
+        aix_libpath="/usr/lib:/lib"
+      fi
+      rm -f conftest.c conftest
+      # End _LT_AC_SYS_LIBPATH_AIX.
+      if test "$aix_use_runtimelinking" = yes; then
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+      else
+        if test "$host_cpu" = ia64; then
+          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+        else
+          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        fi
+      fi
+      ;;
+    amigaos*)
+      case "$host_cpu" in
+        powerpc)
+          ;;
+        m68k)
+          hardcode_libdir_flag_spec='-L$libdir'
+          hardcode_minus_L=yes
+          ;;
+      esac
+      ;;
+    bsdi[45]*)
+      ;;
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      libext=lib
+      ;;
+    darwin* | rhapsody*)
+      hardcode_direct=no
+      if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    dgux*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    freebsd2.[01]*)
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    freebsd* | dragonfly*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    hpux9*)
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      ;;
+    hpux10*)
+      if test "$with_gnu_ld" = no; then
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        hardcode_direct=yes
+        # hardcode_minus_L: Not really in the search PATH,
+        # but as the default location of the library.
+        hardcode_minus_L=yes
+      fi
+      ;;
+    hpux11*)
+      if test "$with_gnu_ld" = no; then
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct=no
+            ;;
+          *)
+            hardcode_direct=yes
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+        esac
+      fi
+      ;;
+    irix5* | irix6* | nonstopux*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    netbsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    newsos6)
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    *nto* | *qnx*)
+      ;;
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+        hardcode_direct=yes
+        if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+          hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+        else
+          case "$host_os" in
+            openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+              hardcode_libdir_flag_spec='-R$libdir'
+              ;;
+            *)
+              hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+              ;;
+          esac
+        fi
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      ;;
+    osf3*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    osf4* | osf5*)
+      if test "$GCC" = yes; then
+        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+        # Both cc and cxx compiler support -rpath directly
+        hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+    solaris*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      ;;
+    sunos4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    sysv4)
+      case $host_vendor in
+        sni)
+          hardcode_direct=yes # is this really true???
+          ;;
+        siemens)
+          hardcode_direct=no
+          ;;
+        motorola)
+          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+          ;;
+      esac
+      ;;
+    sysv4.3*)
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        ld_shlibs=yes
+      fi
+      ;;
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      ;;
+    sysv5* | sco3.2v5* | sco5v6*)
+      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator=':'
+      ;;
+    uts4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    *)
+      ld_shlibs=no
+      ;;
+  esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec=      # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+  aix3*)
+    library_names_spec='$libname.a'
+    ;;
+  aix[4-9]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  amigaos*)
+    case "$host_cpu" in
+      powerpc*)
+        library_names_spec='$libname$shrext' ;;
+      m68k)
+        library_names_spec='$libname.a' ;;
+    esac
+    ;;
+  beos*)
+    library_names_spec='$libname$shrext'
+    ;;
+  bsdi[45]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  cygwin* | mingw* | pw32* | cegcc*)
+    shrext=.dll
+    library_names_spec='$libname.dll.a $libname.lib'
+    ;;
+  darwin* | rhapsody*)
+    shrext=.dylib
+    library_names_spec='$libname$shrext'
+    ;;
+  dgux*)
+    library_names_spec='$libname$shrext'
+    ;;
+  freebsd[23].*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  freebsd* | dragonfly*)
+    library_names_spec='$libname$shrext'
+    ;;
+  gnu*)
+    library_names_spec='$libname$shrext'
+    ;;
+  haiku*)
+    library_names_spec='$libname$shrext'
+    ;;
+  hpux9* | hpux10* | hpux11*)
+    case $host_cpu in
+      ia64*)
+        shrext=.so
+        ;;
+      hppa*64*)
+        shrext=.sl
+        ;;
+      *)
+        shrext=.sl
+        ;;
+    esac
+    library_names_spec='$libname$shrext'
+    ;;
+  interix[3-9]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  irix5* | irix6* | nonstopux*)
+    library_names_spec='$libname$shrext'
+    case "$host_os" in
+      irix5* | nonstopux*)
+        libsuff= shlibsuff=
+        ;;
+      *)
+        case $LD in
+          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+          *) libsuff= shlibsuff= ;;
+        esac
+        ;;
+    esac
+    ;;
+  linux*oldld* | linux*aout* | linux*coff*)
+    ;;
+  linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    library_names_spec='$libname$shrext'
+    ;;
+  knetbsd*-gnu)
+    library_names_spec='$libname$shrext'
+    ;;
+  netbsd*)
+    library_names_spec='$libname$shrext'
+    ;;
+  newsos6)
+    library_names_spec='$libname$shrext'
+    ;;
+  *nto* | *qnx*)
+    library_names_spec='$libname$shrext'
+    ;;
+  openbsd*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  os2*)
+    libname_spec='$name'
+    shrext=.dll
+    library_names_spec='$libname.a'
+    ;;
+  osf3* | osf4* | osf5*)
+    library_names_spec='$libname$shrext'
+    ;;
+  rdos*)
+    ;;
+  solaris*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sunos4*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  sysv4 | sysv4.3*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sysv4*MP*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+    library_names_spec='$libname$shrext'
+    ;;
+  tpf*)
+    library_names_spec='$libname$shrext'
+    ;;
+  uts4*)
+    library_names_spec='$libname$shrext'
+    ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/gawk-5.0.1/config.sub b/gawk-5.0.1/config.sub
new file mode 100755
index 00000000000..f53af5a2da7
--- /dev/null
+++ b/gawk-5.0.1/config.sub
@@ -0,0 +1,1798 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2019 Free Software Foundation, Inc.
+
+timestamp='2019-01-05'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2019 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo "$1"
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+
+# Separate into logical components for further validation
+case $1 in
+	*-*-*-*-*)
+		echo Invalid configuration \`"$1"\': more than four components >&2
+		exit 1
+		;;
+	*-*-*-*)
+		basic_machine=$field1-$field2
+		os=$field3-$field4
+		;;
+	*-*-*)
+		# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+		# parts
+		maybe_os=$field2-$field3
+		case $maybe_os in
+			nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \
+			| linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
+			| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+			| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+			| storm-chaos* | os2-emx* | rtmk-nova*)
+				basic_machine=$field1
+				os=$maybe_os
+				;;
+			android-linux)
+				basic_machine=$field1-unknown
+				os=linux-android
+				;;
+			*)
+				basic_machine=$field1-$field2
+				os=$field3
+				;;
+		esac
+		;;
+	*-*)
+		# A lone config we happen to match not fitting any pattern
+		case $field1-$field2 in
+			decstation-3100)
+				basic_machine=mips-dec
+				os=
+				;;
+			*-*)
+				# Second component is usually, but not always the OS
+				case $field2 in
+					# Prevent following clause from handling this valid os
+					sun*os*)
+						basic_machine=$field1
+						os=$field2
+						;;
+					# Manufacturers
+					dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+					| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+					| unicom* | ibm* | next | hp | isi* | apollo | altos* \
+					| convergent* | ncr* | news | 32* | 3600* | 3100* \
+					| hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+					| ultra | tti* | harris | dolphin | highlevel | gould \
+					| cbm | ns | masscomp | apple | axis | knuth | cray \
+					| microblaze* | sim | cisco \
+					| oki | wec | wrs | winbond)
+						basic_machine=$field1-$field2
+						os=
+						;;
+					*)
+						basic_machine=$field1
+						os=$field2
+						;;
+				esac
+			;;
+		esac
+		;;
+	*)
+		# Convert single-component short-hands not valid as part of
+		# multi-component configurations.
+		case $field1 in
+			386bsd)
+				basic_machine=i386-pc
+				os=bsd
+				;;
+			a29khif)
+				basic_machine=a29k-amd
+				os=udi
+				;;
+			adobe68k)
+				basic_machine=m68010-adobe
+				os=scout
+				;;
+			alliant)
+				basic_machine=fx80-alliant
+				os=
+				;;
+			altos | altos3068)
+				basic_machine=m68k-altos
+				os=
+				;;
+			am29k)
+				basic_machine=a29k-none
+				os=bsd
+				;;
+			amdahl)
+				basic_machine=580-amdahl
+				os=sysv
+				;;
+			amiga)
+				basic_machine=m68k-unknown
+				os=
+				;;
+			amigaos | amigados)
+				basic_machine=m68k-unknown
+				os=amigaos
+				;;
+			amigaunix | amix)
+				basic_machine=m68k-unknown
+				os=sysv4
+				;;
+			apollo68)
+				basic_machine=m68k-apollo
+				os=sysv
+				;;
+			apollo68bsd)
+				basic_machine=m68k-apollo
+				os=bsd
+				;;
+			aros)
+				basic_machine=i386-pc
+				os=aros
+				;;
+			aux)
+				basic_machine=m68k-apple
+				os=aux
+				;;
+			balance)
+				basic_machine=ns32k-sequent
+				os=dynix
+				;;
+			blackfin)
+				basic_machine=bfin-unknown
+				os=linux
+				;;
+			cegcc)
+				basic_machine=arm-unknown
+				os=cegcc
+				;;
+			convex-c1)
+				basic_machine=c1-convex
+				os=bsd
+				;;
+			convex-c2)
+				basic_machine=c2-convex
+				os=bsd
+				;;
+			convex-c32)
+				basic_machine=c32-convex
+				os=bsd
+				;;
+			convex-c34)
+				basic_machine=c34-convex
+				os=bsd
+				;;
+			convex-c38)
+				basic_machine=c38-convex
+				os=bsd
+				;;
+			cray)
+				basic_machine=j90-cray
+				os=unicos
+				;;
+			crds | unos)
+				basic_machine=m68k-crds
+				os=
+				;;
+			da30)
+				basic_machine=m68k-da30
+				os=
+				;;
+			decstation | pmax | pmin | dec3100 | decstatn)
+				basic_machine=mips-dec
+				os=
+				;;
+			delta88)
+				basic_machine=m88k-motorola
+				os=sysv3
+				;;
+			dicos)
+				basic_machine=i686-pc
+				os=dicos
+				;;
+			djgpp)
+				basic_machine=i586-pc
+				os=msdosdjgpp
+				;;
+			ebmon29k)
+				basic_machine=a29k-amd
+				os=ebmon
+				;;
+			es1800 | OSE68k | ose68k | ose | OSE)
+				basic_machine=m68k-ericsson
+				os=ose
+				;;
+			gmicro)
+				basic_machine=tron-gmicro
+				os=sysv
+				;;
+			go32)
+				basic_machine=i386-pc
+				os=go32
+				;;
+			h8300hms)
+				basic_machine=h8300-hitachi
+				os=hms
+				;;
+			h8300xray)
+				basic_machine=h8300-hitachi
+				os=xray
+				;;
+			h8500hms)
+				basic_machine=h8500-hitachi
+				os=hms
+				;;
+			harris)
+				basic_machine=m88k-harris
+				os=sysv3
+				;;
+			hp300)
+				basic_machine=m68k-hp
+				;;
+			hp300bsd)
+				basic_machine=m68k-hp
+				os=bsd
+				;;
+			hp300hpux)
+				basic_machine=m68k-hp
+				os=hpux
+				;;
+			hppaosf)
+				basic_machine=hppa1.1-hp
+				os=osf
+				;;
+			hppro)
+				basic_machine=hppa1.1-hp
+				os=proelf
+				;;
+			i386mach)
+				basic_machine=i386-mach
+				os=mach
+				;;
+			vsta)
+				basic_machine=i386-pc
+				os=vsta
+				;;
+			isi68 | isi)
+				basic_machine=m68k-isi
+				os=sysv
+				;;
+			m68knommu)
+				basic_machine=m68k-unknown
+				os=linux
+				;;
+			magnum | m3230)
+				basic_machine=mips-mips
+				os=sysv
+				;;
+			merlin)
+				basic_machine=ns32k-utek
+				os=sysv
+				;;
+			mingw64)
+				basic_machine=x86_64-pc
+				os=mingw64
+				;;
+			mingw32)
+				basic_machine=i686-pc
+				os=mingw32
+				;;
+			mingw32ce)
+				basic_machine=arm-unknown
+				os=mingw32ce
+				;;
+			monitor)
+				basic_machine=m68k-rom68k
+				os=coff
+				;;
+			morphos)
+				basic_machine=powerpc-unknown
+				os=morphos
+				;;
+			moxiebox)
+				basic_machine=moxie-unknown
+				os=moxiebox
+				;;
+			msdos)
+				basic_machine=i386-pc
+				os=msdos
+				;;
+			msys)
+				basic_machine=i686-pc
+				os=msys
+				;;
+			mvs)
+				basic_machine=i370-ibm
+				os=mvs
+				;;
+			nacl)
+				basic_machine=le32-unknown
+				os=nacl
+				;;
+			ncr3000)
+				basic_machine=i486-ncr
+				os=sysv4
+				;;
+			netbsd386)
+				basic_machine=i386-pc
+				os=netbsd
+				;;
+			netwinder)
+				basic_machine=armv4l-rebel
+				os=linux
+				;;
+			news | news700 | news800 | news900)
+				basic_machine=m68k-sony
+				os=newsos
+				;;
+			news1000)
+				basic_machine=m68030-sony
+				os=newsos
+				;;
+			necv70)
+				basic_machine=v70-nec
+				os=sysv
+				;;
+			nh3000)
+				basic_machine=m68k-harris
+				os=cxux
+				;;
+			nh[45]000)
+				basic_machine=m88k-harris
+				os=cxux
+				;;
+			nindy960)
+				basic_machine=i960-intel
+				os=nindy
+				;;
+			mon960)
+				basic_machine=i960-intel
+				os=mon960
+				;;
+			nonstopux)
+				basic_machine=mips-compaq
+				os=nonstopux
+				;;
+			os400)
+				basic_machine=powerpc-ibm
+				os=os400
+				;;
+			OSE68000 | ose68000)
+				basic_machine=m68000-ericsson
+				os=ose
+				;;
+			os68k)
+				basic_machine=m68k-none
+				os=os68k
+				;;
+			paragon)
+				basic_machine=i860-intel
+				os=osf
+				;;
+			parisc)
+				basic_machine=hppa-unknown
+				os=linux
+				;;
+			pw32)
+				basic_machine=i586-unknown
+				os=pw32
+				;;
+			rdos | rdos64)
+				basic_machine=x86_64-pc
+				os=rdos
+				;;
+			rdos32)
+				basic_machine=i386-pc
+				os=rdos
+				;;
+			rom68k)
+				basic_machine=m68k-rom68k
+				os=coff
+				;;
+			sa29200)
+				basic_machine=a29k-amd
+				os=udi
+				;;
+			sei)
+				basic_machine=mips-sei
+				os=seiux
+				;;
+			sequent)
+				basic_machine=i386-sequent
+				os=
+				;;
+			sps7)
+				basic_machine=m68k-bull
+				os=sysv2
+				;;
+			st2000)
+				basic_machine=m68k-tandem
+				os=
+				;;
+			stratus)
+				basic_machine=i860-stratus
+				os=sysv4
+				;;
+			sun2)
+				basic_machine=m68000-sun
+				os=
+				;;
+			sun2os3)
+				basic_machine=m68000-sun
+				os=sunos3
+				;;
+			sun2os4)
+				basic_machine=m68000-sun
+				os=sunos4
+				;;
+			sun3)
+				basic_machine=m68k-sun
+				os=
+				;;
+			sun3os3)
+				basic_machine=m68k-sun
+				os=sunos3
+				;;
+			sun3os4)
+				basic_machine=m68k-sun
+				os=sunos4
+				;;
+			sun4)
+				basic_machine=sparc-sun
+				os=
+				;;
+			sun4os3)
+				basic_machine=sparc-sun
+				os=sunos3
+				;;
+			sun4os4)
+				basic_machine=sparc-sun
+				os=sunos4
+				;;
+			sun4sol2)
+				basic_machine=sparc-sun
+				os=solaris2
+				;;
+			sun386 | sun386i | roadrunner)
+				basic_machine=i386-sun
+				os=
+				;;
+			sv1)
+				basic_machine=sv1-cray
+				os=unicos
+				;;
+			symmetry)
+				basic_machine=i386-sequent
+				os=dynix
+				;;
+			t3e)
+				basic_machine=alphaev5-cray
+				os=unicos
+				;;
+			t90)
+				basic_machine=t90-cray
+				os=unicos
+				;;
+			toad1)
+				basic_machine=pdp10-xkl
+				os=tops20
+				;;
+			tpf)
+				basic_machine=s390x-ibm
+				os=tpf
+				;;
+			udi29k)
+				basic_machine=a29k-amd
+				os=udi
+				;;
+			ultra3)
+				basic_machine=a29k-nyu
+				os=sym1
+				;;
+			v810 | necv810)
+				basic_machine=v810-nec
+				os=none
+				;;
+			vaxv)
+				basic_machine=vax-dec
+				os=sysv
+				;;
+			vms)
+				basic_machine=vax-dec
+				os=vms
+				;;
+			vxworks960)
+				basic_machine=i960-wrs
+				os=vxworks
+				;;
+			vxworks68)
+				basic_machine=m68k-wrs
+				os=vxworks
+				;;
+			vxworks29k)
+				basic_machine=a29k-wrs
+				os=vxworks
+				;;
+			xbox)
+				basic_machine=i686-pc
+				os=mingw32
+				;;
+			ymp)
+				basic_machine=ymp-cray
+				os=unicos
+				;;
+			*)
+				basic_machine=$1
+				os=
+				;;
+		esac
+		;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+	# Here we handle the default manufacturer of certain CPU types.  It is in
+	# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		cpu=hppa1.1
+		vendor=winbond
+		;;
+	op50n)
+		cpu=hppa1.1
+		vendor=oki
+		;;
+	op60c)
+		cpu=hppa1.1
+		vendor=oki
+		;;
+	ibm*)
+		cpu=i370
+		vendor=ibm
+		;;
+	orion105)
+		cpu=clipper
+		vendor=highlevel
+		;;
+	mac | mpw | mac-mpw)
+		cpu=m68k
+		vendor=apple
+		;;
+	pmac | pmac-mpw)
+		cpu=powerpc
+		vendor=apple
+		;;
+
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		cpu=m68000
+		vendor=att
+		;;
+	3b*)
+		cpu=we32k
+		vendor=att
+		;;
+	bluegene*)
+		cpu=powerpc
+		vendor=ibm
+		os=cnk
+		;;
+	decsystem10* | dec10*)
+		cpu=pdp10
+		vendor=dec
+		os=tops10
+		;;
+	decsystem20* | dec20*)
+		cpu=pdp10
+		vendor=dec
+		os=tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		cpu=m68k
+		vendor=motorola
+		;;
+	dpx2*)
+		cpu=m68k
+		vendor=bull
+		os=sysv3
+		;;
+	encore | umax | mmax)
+		cpu=ns32k
+		vendor=encore
+		;;
+	elxsi)
+		cpu=elxsi
+		vendor=elxsi
+		os=${os:-bsd}
+		;;
+	fx2800)
+		cpu=i860
+		vendor=alliant
+		;;
+	genix)
+		cpu=ns32k
+		vendor=ns
+		;;
+	h3050r* | hiux*)
+		cpu=hppa1.1
+		vendor=hitachi
+		os=hiuxwe2
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		cpu=m68000
+		vendor=hp
+		;;
+	hp9k3[2-9][0-9])
+		cpu=m68k
+		vendor=hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	i*86v32)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		os=sysv32
+		;;
+	i*86v4*)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		os=sysv4
+		;;
+	i*86v)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		os=sysv
+		;;
+	i*86sol2)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		os=solaris2
+		;;
+	j90 | j90-cray)
+		cpu=j90
+		vendor=cray
+		os=${os:-unicos}
+		;;
+	iris | iris4d)
+		cpu=mips
+		vendor=sgi
+		case $os in
+		    irix*)
+			;;
+		    *)
+			os=irix4
+			;;
+		esac
+		;;
+	miniframe)
+		cpu=m68000
+		vendor=convergent
+		;;
+	*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		cpu=m68k
+		vendor=atari
+		os=mint
+		;;
+	news-3600 | risc-news)
+		cpu=mips
+		vendor=sony
+		os=newsos
+		;;
+	next | m*-next)
+		cpu=m68k
+		vendor=next
+		case $os in
+		    openstep*)
+		        ;;
+		    nextstep*)
+			;;
+		    ns2*)
+		      os=nextstep2
+			;;
+		    *)
+		      os=nextstep3
+			;;
+		esac
+		;;
+	np1)
+		cpu=np1
+		vendor=gould
+		;;
+	op50n-* | op60c-*)
+		cpu=hppa1.1
+		vendor=oki
+		os=proelf
+		;;
+	pa-hitachi)
+		cpu=hppa1.1
+		vendor=hitachi
+		os=hiuxwe2
+		;;
+	pbd)
+		cpu=sparc
+		vendor=tti
+		;;
+	pbb)
+		cpu=m68k
+		vendor=tti
+		;;
+	pc532)
+		cpu=ns32k
+		vendor=pc532
+		;;
+	pn)
+		cpu=pn
+		vendor=gould
+		;;
+	power)
+		cpu=power
+		vendor=ibm
+		;;
+	ps2)
+		cpu=i386
+		vendor=ibm
+		;;
+	rm[46]00)
+		cpu=mips
+		vendor=siemens
+		;;
+	rtpc | rtpc-*)
+		cpu=romp
+		vendor=ibm
+		;;
+	sde)
+		cpu=mipsisa32
+		vendor=sde
+		os=${os:-elf}
+		;;
+	simso-wrs)
+		cpu=sparclite
+		vendor=wrs
+		os=vxworks
+		;;
+	tower | tower-32)
+		cpu=m68k
+		vendor=ncr
+		;;
+	vpp*|vx|vx-*)
+		cpu=f301
+		vendor=fujitsu
+		;;
+	w65)
+		cpu=w65
+		vendor=wdc
+		;;
+	w89k-*)
+		cpu=hppa1.1
+		vendor=winbond
+		os=proelf
+		;;
+	none)
+		cpu=none
+		vendor=none
+		;;
+	leon|leon[3-9])
+		cpu=sparc
+		vendor=$basic_machine
+		;;
+	leon-*|leon[3-9]-*)
+		cpu=sparc
+		vendor=`echo "$basic_machine" | sed 's/-.*//'`
+		;;
+
+	*-*)
+		# shellcheck disable=SC2162
+		IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+		;;
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+		cpu=$basic_machine
+		vendor=pc
+		;;
+	# These rules are duplicated from below for sake of the special case above;
+	# i.e. things that normalized to x86 arches should also default to "pc"
+	pc98)
+		cpu=i386
+		vendor=pc
+		;;
+	x64 | amd64)
+		cpu=x86_64
+		vendor=pc
+		;;
+	# Recognize the basic CPU types without company name.
+	*)
+		cpu=$basic_machine
+		vendor=unknown
+		;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+	# Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+	# some cases the only manufacturer, in others, it is the most popular.
+	craynv-unknown)
+		vendor=cray
+		os=${os:-unicosmp}
+		;;
+	c90-unknown | c90-cray)
+		vendor=cray
+		os=${os:-unicos}
+		;;
+	fx80-unknown)
+		vendor=alliant
+		;;
+	romp-unknown)
+		vendor=ibm
+		;;
+	mmix-unknown)
+		vendor=knuth
+		;;
+	microblaze-unknown | microblazeel-unknown)
+		vendor=xilinx
+		;;
+	rs6000-unknown)
+		vendor=ibm
+		;;
+	vax-unknown)
+		vendor=dec
+		;;
+	pdp11-unknown)
+		vendor=dec
+		;;
+	we32k-unknown)
+		vendor=att
+		;;
+	cydra-unknown)
+		vendor=cydrome
+		;;
+	i370-ibm*)
+		vendor=ibm
+		;;
+	orion-unknown)
+		vendor=highlevel
+		;;
+	xps-unknown | xps100-unknown)
+		cpu=xps100
+		vendor=honeywell
+		;;
+
+	# Here we normalize CPU types with a missing or matching vendor
+	dpx20-unknown | dpx20-bull)
+		cpu=rs6000
+		vendor=bull
+		os=${os:-bosx}
+		;;
+
+	# Here we normalize CPU types irrespective of the vendor
+	amd64-*)
+		cpu=x86_64
+		;;
+	blackfin-*)
+		cpu=bfin
+		os=linux
+		;;
+	c54x-*)
+		cpu=tic54x
+		;;
+	c55x-*)
+		cpu=tic55x
+		;;
+	c6x-*)
+		cpu=tic6x
+		;;
+	e500v[12]-*)
+		cpu=powerpc
+		os=$os"spe"
+		;;
+	mips3*-*)
+		cpu=mips64
+		;;
+	ms1-*)
+		cpu=mt
+		;;
+	m68knommu-*)
+		cpu=m68k
+		os=linux
+		;;
+	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+		cpu=s12z
+		;;
+	openrisc-*)
+		cpu=or32
+		;;
+	parisc-*)
+		cpu=hppa
+		os=linux
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		cpu=i586
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+		cpu=i686
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		cpu=i686
+		;;
+	pentium4-*)
+		cpu=i786
+		;;
+	pc98-*)
+		cpu=i386
+		;;
+	ppc-* | ppcbe-*)
+		cpu=powerpc
+		;;
+	ppcle-* | powerpclittle-*)
+		cpu=powerpcle
+		;;
+	ppc64-*)
+		cpu=powerpc64
+		;;
+	ppc64le-* | powerpc64little-*)
+		cpu=powerpc64le
+		;;
+	sb1-*)
+		cpu=mipsisa64sb1
+		;;
+	sb1el-*)
+		cpu=mipsisa64sb1el
+		;;
+	sh5e[lb]-*)
+		cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+		;;
+	spur-*)
+		cpu=spur
+		;;
+	strongarm-* | thumb-*)
+		cpu=arm
+		;;
+	tx39-*)
+		cpu=mipstx39
+		;;
+	tx39el-*)
+		cpu=mipstx39el
+		;;
+	x64-*)
+		cpu=x86_64
+		;;
+	xscale-* | xscalee[bl]-*)
+		cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+		;;
+
+	# Recognize the canonical CPU Types that limit and/or modify the
+	# company names they are paired with.
+	cr16-*)
+		os=${os:-elf}
+		;;
+	crisv32-* | etraxfs*-*)
+		cpu=crisv32
+		vendor=axis
+		;;
+	cris-* | etrax*-*)
+		cpu=cris
+		vendor=axis
+		;;
+	crx-*)
+		os=${os:-elf}
+		;;
+	neo-tandem)
+		cpu=neo
+		vendor=tandem
+		;;
+	nse-tandem)
+		cpu=nse
+		vendor=tandem
+		;;
+	nsr-tandem)
+		cpu=nsr
+		vendor=tandem
+		;;
+	nsv-tandem)
+		cpu=nsv
+		vendor=tandem
+		;;
+	nsx-tandem)
+		cpu=nsx
+		vendor=tandem
+		;;
+	s390-*)
+		cpu=s390
+		vendor=ibm
+		;;
+	s390x-*)
+		cpu=s390x
+		vendor=ibm
+		;;
+	tile*-*)
+		os=${os:-linux-gnu}
+		;;
+
+	*)
+		# Recognize the canonical CPU types that are allowed with any
+		# company name.
+		case $cpu in
+			1750a | 580 \
+			| a29k \
+			| aarch64 | aarch64_be \
+			| abacus \
+			| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+			| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+			| alphapca5[67] | alpha64pca5[67] \
+			| am33_2.0 \
+			| amdgcn \
+			| arc | arceb \
+			| arm  | arm[lb]e | arme[lb] | armv* \
+			| avr | avr32 \
+			| asmjs \
+			| ba \
+			| be32 | be64 \
+			| bfin | bs2000 \
+			| c[123]* | c30 | [cjt]90 | c4x \
+			| c8051 | clipper | craynv | csky | cydra \
+			| d10v | d30v | dlx | dsp16xx \
+			| e2k | elxsi | epiphany \
+			| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+			| h8300 | h8500 \
+			| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+			| hexagon \
+			| i370 | i*86 | i860 | i960 | ia16 | ia64 \
+			| ip2k | iq2000 \
+			| k1om \
+			| le32 | le64 \
+			| lm32 \
+			| m32c | m32r | m32rle \
+			| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+			| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+			| m88110 | m88k | maxq | mb | mcore | mep | metag \
+			| microblaze | microblazeel \
+			| mips | mipsbe | mipseb | mipsel | mipsle \
+			| mips16 \
+			| mips64 | mips64eb | mips64el \
+			| mips64octeon | mips64octeonel \
+			| mips64orion | mips64orionel \
+			| mips64r5900 | mips64r5900el \
+			| mips64vr | mips64vrel \
+			| mips64vr4100 | mips64vr4100el \
+			| mips64vr4300 | mips64vr4300el \
+			| mips64vr5000 | mips64vr5000el \
+			| mips64vr5900 | mips64vr5900el \
+			| mipsisa32 | mipsisa32el \
+			| mipsisa32r2 | mipsisa32r2el \
+			| mipsisa32r6 | mipsisa32r6el \
+			| mipsisa64 | mipsisa64el \
+			| mipsisa64r2 | mipsisa64r2el \
+			| mipsisa64r6 | mipsisa64r6el \
+			| mipsisa64sb1 | mipsisa64sb1el \
+			| mipsisa64sr71k | mipsisa64sr71kel \
+			| mipsr5900 | mipsr5900el \
+			| mipstx39 | mipstx39el \
+			| mmix \
+			| mn10200 | mn10300 \
+			| moxie \
+			| mt \
+			| msp430 \
+			| nds32 | nds32le | nds32be \
+			| nfp \
+			| nios | nios2 | nios2eb | nios2el \
+			| none | np1 | ns16k | ns32k | nvptx \
+			| open8 \
+			| or1k* \
+			| or32 \
+			| orion \
+			| picochip \
+			| pdp10 | pdp11 | pj | pjl | pn | power \
+			| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+			| pru \
+			| pyramid \
+			| riscv | riscv32 | riscv64 \
+			| rl78 | romp | rs6000 | rx \
+			| score \
+			| sh | shl \
+			| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+			| sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+			| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+			| sparclite \
+			| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+			| spu \
+			| tahoe \
+			| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+			| tron \
+			| ubicom32 \
+			| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+			| vax \
+			| visium \
+			| w65 \
+			| wasm32 | wasm64 \
+			| we32k \
+			| x86 | x86_64 | xc16x | xgate | xps100 \
+			| xstormy16 | xtensa* \
+			| ymp \
+			| z8k | z80)
+				;;
+
+			*)
+				echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+				exit 1
+				;;
+		esac
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+	digital*)
+		vendor=dec
+		;;
+	commodore*)
+		vendor=cbm
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x$os != x ]
+then
+case $os in
+	# First match some system type aliases that might get confused
+	# with valid system types.
+	# solaris* is a basic system type, with this one exception.
+	auroraux)
+		os=auroraux
+		;;
+	bluegene*)
+		os=cnk
+		;;
+	solaris1 | solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	solaris)
+		os=solaris2
+		;;
+	unixware*)
+		os=sysv4.2uw
+		;;
+	gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# es1800 is here to avoid being matched by es* (a different OS)
+	es1800*)
+		os=ose
+		;;
+	# Some version numbers need modification
+	chorusos*)
+		os=chorusos
+		;;
+	isc)
+		os=isc2.2
+		;;
+	sco6)
+		os=sco5v6
+		;;
+	sco5)
+		os=sco3.2v5
+		;;
+	sco4)
+		os=sco3.2v4
+		;;
+	sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		;;
+	sco3.2v[4-9]* | sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		;;
+	scout)
+		# Don't match below
+		;;
+	sco*)
+		os=sco3.2v2
+		;;
+	psos*)
+		os=psos
+		;;
+	# Now accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST end in a * to match a version number.
+	# sysv* is not here because it comes later, after sysvr4.
+	gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\
+	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+	     | sym* | kopensolaris* | plan9* \
+	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+	     | aos* | aros* | cloudabi* | sortix* \
+	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+	     | knetbsd* | mirbsd* | netbsd* \
+	     | bitrig* | openbsd* | solidbsd* | libertybsd* \
+	     | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \
+	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+	     | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \
+	     | chorusrdb* | cegcc* | glidix* \
+	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+	     | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \
+	     | linux-newlib* | linux-musl* | linux-uclibc* \
+	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+	     | interix* | uwin* | mks* | rhapsody* | darwin* \
+	     | openstep* | oskit* | conix* | pw32* | nonstopux* \
+	     | storm-chaos* | tops10* | tenex* | tops20* | its* \
+	     | os2* | vos* | palmos* | uclinux* | nucleus* \
+	     | morphos* | superux* | rtmk* | windiss* \
+	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	qnx*)
+		case $cpu in
+		    x86 | i*86)
+			;;
+		    *)
+			os=nto-$os
+			;;
+		esac
+		;;
+	hiux*)
+		os=hiuxwe2
+		;;
+	nto-qnx*)
+		;;
+	nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	sim | xray | os68k* | v88r* \
+	    | windows* | osx | abug | netware* | os9* \
+	    | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
+		;;
+	linux-dietlibc)
+		os=linux-dietlibc
+		;;
+	linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	lynx*178)
+		os=lynxos178
+		;;
+	lynx*5)
+		os=lynxos5
+		;;
+	lynx*)
+		os=lynxos
+		;;
+	mac*)
+		os=`echo "$os" | sed -e 's|mac|macos|'`
+		;;
+	opened*)
+		os=openedition
+		;;
+	os400*)
+		os=os400
+		;;
+	sunos5*)
+		os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+		;;
+	sunos6*)
+		os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+		;;
+	wince*)
+		os=wince
+		;;
+	utek*)
+		os=bsd
+		;;
+	dynix*)
+		os=bsd
+		;;
+	acis*)
+		os=aos
+		;;
+	atheos*)
+		os=atheos
+		;;
+	syllable*)
+		os=syllable
+		;;
+	386bsd)
+		os=bsd
+		;;
+	ctix* | uts*)
+		os=sysv
+		;;
+	nova*)
+		os=rtmk-nova
+		;;
+	ns2)
+		os=nextstep2
+		;;
+	nsk*)
+		os=nsk
+		;;
+	# Preserve the version number of sinix5.
+	sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	sinix*)
+		os=sysv4
+		;;
+	tpf*)
+		os=tpf
+		;;
+	triton*)
+		os=sysv3
+		;;
+	oss*)
+		os=sysv3
+		;;
+	svr4*)
+		os=sysv4
+		;;
+	svr3)
+		os=sysv3
+		;;
+	sysvr4)
+		os=sysv4
+		;;
+	# This must come after sysvr4.
+	sysv*)
+		;;
+	ose*)
+		os=ose
+		;;
+	*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+		os=mint
+		;;
+	zvmoe)
+		os=zvmoe
+		;;
+	dicos*)
+		os=dicos
+		;;
+	pikeos*)
+		# Until real need of OS specific support for
+		# particular features comes up, bare metal
+		# configurations are quite functional.
+		case $cpu in
+		    arm*)
+			os=eabi
+			;;
+		    *)
+			os=elf
+			;;
+		esac
+		;;
+	nacl*)
+		;;
+	ios)
+		;;
+	none)
+		;;
+	*-eabi)
+		;;
+	*)
+		echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $cpu-$vendor in
+	score-*)
+		os=elf
+		;;
+	spu-*)
+		os=elf
+		;;
+	*-acorn)
+		os=riscix1.2
+		;;
+	arm*-rebel)
+		os=linux
+		;;
+	arm*-semi)
+		os=aout
+		;;
+	c4x-* | tic4x-*)
+		os=coff
+		;;
+	c8051-*)
+		os=elf
+		;;
+	clipper-intergraph)
+		os=clix
+		;;
+	hexagon-*)
+		os=elf
+		;;
+	tic54x-*)
+		os=coff
+		;;
+	tic55x-*)
+		os=coff
+		;;
+	tic6x-*)
+		os=coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=tops20
+		;;
+	pdp11-*)
+		os=none
+		;;
+	*-dec | vax-*)
+		os=ultrix4.2
+		;;
+	m68*-apollo)
+		os=domain
+		;;
+	i386-sun)
+		os=sunos4.0.2
+		;;
+	m68000-sun)
+		os=sunos3
+		;;
+	m68*-cisco)
+		os=aout
+		;;
+	mep-*)
+		os=elf
+		;;
+	mips*-cisco)
+		os=elf
+		;;
+	mips*-*)
+		os=elf
+		;;
+	or32-*)
+		os=coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=sysv3
+		;;
+	sparc-* | *-sun)
+		os=sunos4.1.1
+		;;
+	pru-*)
+		os=elf
+		;;
+	*-be)
+		os=beos
+		;;
+	*-ibm)
+		os=aix
+		;;
+	*-knuth)
+		os=mmixware
+		;;
+	*-wec)
+		os=proelf
+		;;
+	*-winbond)
+		os=proelf
+		;;
+	*-oki)
+		os=proelf
+		;;
+	*-hp)
+		os=hpux
+		;;
+	*-hitachi)
+		os=hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=sysv
+		;;
+	*-cbm)
+		os=amigaos
+		;;
+	*-dg)
+		os=dgux
+		;;
+	*-dolphin)
+		os=sysv3
+		;;
+	m68k-ccur)
+		os=rtu
+		;;
+	m88k-omron*)
+		os=luna
+		;;
+	*-next)
+		os=nextstep
+		;;
+	*-sequent)
+		os=ptx
+		;;
+	*-crds)
+		os=unos
+		;;
+	*-ns)
+		os=genix
+		;;
+	i370-*)
+		os=mvs
+		;;
+	*-gould)
+		os=sysv
+		;;
+	*-highlevel)
+		os=bsd
+		;;
+	*-encore)
+		os=bsd
+		;;
+	*-sgi)
+		os=irix
+		;;
+	*-siemens)
+		os=sysv4
+		;;
+	*-masscomp)
+		os=rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=uxpv
+		;;
+	*-rom68k)
+		os=coff
+		;;
+	*-*bug)
+		os=coff
+		;;
+	*-apple)
+		os=macos
+		;;
+	*-atari*)
+		os=mint
+		;;
+	*-wrs)
+		os=vxworks
+		;;
+	*)
+		os=none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+case $vendor in
+	unknown)
+		case $os in
+			riscix*)
+				vendor=acorn
+				;;
+			sunos*)
+				vendor=sun
+				;;
+			cnk*|-aix*)
+				vendor=ibm
+				;;
+			beos*)
+				vendor=be
+				;;
+			hpux*)
+				vendor=hp
+				;;
+			mpeix*)
+				vendor=hp
+				;;
+			hiux*)
+				vendor=hitachi
+				;;
+			unos*)
+				vendor=crds
+				;;
+			dgux*)
+				vendor=dg
+				;;
+			luna*)
+				vendor=omron
+				;;
+			genix*)
+				vendor=ns
+				;;
+			clix*)
+				vendor=intergraph
+				;;
+			mvs* | opened*)
+				vendor=ibm
+				;;
+			os400*)
+				vendor=ibm
+				;;
+			ptx*)
+				vendor=sequent
+				;;
+			tpf*)
+				vendor=ibm
+				;;
+			vxsim* | vxworks* | windiss*)
+				vendor=wrs
+				;;
+			aux*)
+				vendor=apple
+				;;
+			hms*)
+				vendor=hitachi
+				;;
+			mpw* | macos*)
+				vendor=apple
+				;;
+			*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+				vendor=atari
+				;;
+			vos*)
+				vendor=stratus
+				;;
+		esac
+		;;
+esac
+
+echo "$cpu-$vendor-$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/gawk-5.0.1/configh.in b/gawk-5.0.1/configh.in
new file mode 100644
index 00000000000..68ea91aa860
--- /dev/null
+++ b/gawk-5.0.1/configh.in
@@ -0,0 +1,508 @@
+/* configh.in.  Generated from configure.ac by autoheader.  */
+
+/* dynamic loading is possible */
+#undef DYNAMIC
+
+/* Define to 1 if translation of program messages to the user's native
+   language is requested. */
+#undef ENABLE_NLS
+
+/* Define to the type of elements in the array set by `getgroups'. Usually
+   this is either `int' or `gid_t'. */
+#undef GETGROUPS_T
+
+/* Define to 1 if the `getpgrp' function requires zero arguments. */
+#undef GETPGRP_VOID
+
+/* Define to 1 if you have the `alarm' function. */
+#undef HAVE_ALARM
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define to 1 if you have the `atexit' function. */
+#undef HAVE_ATEXIT
+
+/* Define to 1 if you have the `btowc' function. */
+#undef HAVE_BTOWC
+
+/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
+   CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYCURRENT
+
+/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
+   the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+   */
+#undef HAVE_DCGETTEXT
+
+/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't.
+   */
+#undef HAVE_DECL_TZNAME
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `fmod' function. */
+#undef HAVE_FMOD
+
+/* Define to 1 if you have the `fwrite_unlocked' function. */
+#undef HAVE_FWRITE_UNLOCKED
+
+/* Define to 1 if you have the `gai_strerror' function. */
+#undef HAVE_GAI_STRERROR
+
+/* have getaddrinfo */
+#undef HAVE_GETADDRINFO
+
+/* Define to 1 if you have the `getgrent' function. */
+#undef HAVE_GETGRENT
+
+/* Define to 1 if you have the `getgroups' function. */
+#undef HAVE_GETGROUPS
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define to 1 if you have the `grantpt' function. */
+#undef HAVE_GRANTPT
+
+/* Do we have history_list? */
+#undef HAVE_HISTORY_LIST
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 if the system has the type `intmax_t'. */
+#undef HAVE_INTMAX_T
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `isascii' function. */
+#undef HAVE_ISASCII
+
+/* Define to 1 if you have the `iswctype' function. */
+#undef HAVE_ISWCTYPE
+
+/* Define to 1 if you have the `iswlower' function. */
+#undef HAVE_ISWLOWER
+
+/* Define to 1 if you have the `iswupper' function. */
+#undef HAVE_ISWUPPER
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if you have the <libintl.h> header file. */
+#undef HAVE_LIBINTL_H
+
+/* Define to 1 if you have a fully functional readline library. */
+#undef HAVE_LIBREADLINE
+
+/* Define if you have the libsigsegv library. */
+#undef HAVE_LIBSIGSEGV
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define to 1 if the system has the type 'long long int'. */
+#undef HAVE_LONG_LONG_INT
+
+/* Define to 1 if you have the `mbrlen' function. */
+#undef HAVE_MBRLEN
+
+/* Define to 1 if mbrtowc and mbstate_t are properly declared. */
+#undef HAVE_MBRTOWC
+
+/* Define to 1 if you have the <mcheck.h> header file. */
+#undef HAVE_MCHECK_H
+
+/* Define to 1 if you have the `memcmp' function. */
+#undef HAVE_MEMCMP
+
+/* Define to 1 if you have the `memcpy' function. */
+#undef HAVE_MEMCPY
+
+/* Define to 1 if you have the `memcpy_ulong' function. */
+#undef HAVE_MEMCPY_ULONG
+
+/* Define to 1 if you have the `memmove' function. */
+#undef HAVE_MEMMOVE
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `memset' function. */
+#undef HAVE_MEMSET
+
+/* Define to 1 if you have the `memset_ulong' function. */
+#undef HAVE_MEMSET_ULONG
+
+/* Define to 1 if you have the `mkstemp' function. */
+#undef HAVE_MKSTEMP
+
+/* we have the mktime function */
+#undef HAVE_MKTIME
+
+/* Define to 1 if you have fully functional mpfr and gmp libraries. */
+#undef HAVE_MPFR
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define to 1 if you have the `posix_openpt' function. */
+#undef HAVE_POSIX_OPENPT
+
+/* Define to 1 if you have the `setenv' function. */
+#undef HAVE_SETENV
+
+/* Define to 1 if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define to 1 if you have the `setsid' function. */
+#undef HAVE_SETSID
+
+/* Define to 1 if you have the `sigprocmask' function. */
+#undef HAVE_SIGPROCMASK
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* newer systems define this type here */
+#undef HAVE_SOCKADDR_STORAGE
+
+/* we have sockets on this system */
+#undef HAVE_SOCKETS
+
+/* Define to 1 if stdbool.h conforms to C99. */
+#undef HAVE_STDBOOL_H
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#undef HAVE_STDDEF_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the `strcoll' function. */
+#undef HAVE_STRCOLL
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the `strftime' function. */
+#undef HAVE_STRFTIME
+
+/* Define to 1 if cpp supports the ANSI # stringizing operator. */
+#undef HAVE_STRINGIZE
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#undef HAVE_STRNCASECMP
+
+/* Define to 1 if you have the <stropts.h> header file. */
+#undef HAVE_STROPTS_H
+
+/* Define to 1 if you have the `strtod' function. */
+#undef HAVE_STRTOD
+
+/* Define to 1 if you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define to 1 if `gr_passwd' is a member of `struct group'. */
+#undef HAVE_STRUCT_GROUP_GR_PASSWD
+
+/* Define to 1 if `pw_passwd' is a member of `struct passwd'. */
+#undef HAVE_STRUCT_PASSWD_PW_PASSWD
+
+/* Define to 1 if `st_blksize' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BLKSIZE
+
+/* Define to 1 if `tm_zone' is a member of `struct tm'. */
+#undef HAVE_STRUCT_TM_TM_ZONE
+
+/* Define to 1 if you have the `system' function. */
+#undef HAVE_SYSTEM
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#undef HAVE_SYS_IOCTL_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
+#undef HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <termios.h> header file. */
+#undef HAVE_TERMIOS_H
+
+/* Define to 1 if you have the `timegm' function. */
+#undef HAVE_TIMEGM
+
+/* Define to 1 if you have the `tmpfile' function. */
+#undef HAVE_TMPFILE
+
+/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
+   `HAVE_STRUCT_TM_TM_ZONE' instead. */
+#undef HAVE_TM_ZONE
+
+/* Define to 1 if you have the `towlower' function. */
+#undef HAVE_TOWLOWER
+
+/* Define to 1 if you have the `towupper' function. */
+#undef HAVE_TOWUPPER
+
+/* Define to 1 if you don't have `tm_zone' but do have the external array
+   `tzname'. */
+#undef HAVE_TZNAME
+
+/* Define to 1 if you have the `tzset' function. */
+#undef HAVE_TZSET
+
+/* Define to 1 if the system has the type `uintmax_t'. */
+#undef HAVE_UINTMAX_T
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if the system has the type `unsigned long long int'. */
+#undef HAVE_UNSIGNED_LONG_LONG_INT
+
+/* Define to 1 if you have the `usleep' function. */
+#undef HAVE_USLEEP
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
+/* Define to 1 if you have the <wchar.h> header file. */
+#undef HAVE_WCHAR_H
+
+/* Define to 1 if you have the `wcrtomb' function. */
+#undef HAVE_WCRTOMB
+
+/* Define to 1 if you have the `wcscoll' function. */
+#undef HAVE_WCSCOLL
+
+/* Define to 1 if you have the `wctype' function. */
+#undef HAVE_WCTYPE
+
+/* Define to 1 if you have the <wctype.h> header file. */
+#undef HAVE_WCTYPE_H
+
+/* systems should define this type here */
+#undef HAVE_WCTYPE_T
+
+/* systems should define this type here */
+#undef HAVE_WINT_T
+
+/* Define to 1 if the system has the type `_Bool'. */
+#undef HAVE__BOOL
+
+/* Define to 1 if you have the `__etoa_l' function. */
+#undef HAVE___ETOA_L
+
+/* disable lint checks */
+#undef NO_LINT
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if *printf supports %a format */
+#undef PRINTF_HAS_A_FORMAT
+
+/* Define to 1 if *printf supports %F format */
+#undef PRINTF_HAS_F_FORMAT
+
+/* The size of `unsigned int', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_INT
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* enable built-in intdiv0 function */
+#undef SUPPLY_INTDIV
+
+/* some systems define this type here */
+#undef TIME_T_IN_SYS_TYPES_H
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+#undef TM_IN_SYS_TIME
+
+/* Define to 1 if the character set is EBCDIC */
+#undef USE_EBCDIC
+
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+
+
+/* Version number of package */
+#undef VERSION
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to 1 if on MINIX. */
+#undef _MINIX
+
+/* The _Noreturn keyword of C11.  */
+#ifndef _Noreturn
+# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
+      || 0x5110 <= __SUNPRO_C)
+#  define _Noreturn __attribute__ ((__noreturn__))
+# elif defined _MSC_VER && 1200 <= _MSC_VER
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn
+# endif
+#endif
+
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+   this defined. */
+#undef _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#undef _POSIX_SOURCE
+
+/* Define to 1 if type `char' is unsigned and you are not using gcc.  */
+#ifndef __CHAR_UNSIGNED__
+# undef __CHAR_UNSIGNED__
+#endif
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef gid_t
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to the widest signed integer type if <stdint.h> and <inttypes.h> do
+   not define. */
+#undef intmax_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define to the equivalent of the C99 'restrict' keyword, or to
+   nothing if this is not supported.  Do not define if restrict is
+   supported directly.  */
+#undef restrict
+/* Work around a bug in Sun C++: it does not support _Restrict or
+   __restrict__, even though the corresponding Sun C compiler ends up with
+   "#define restrict _Restrict" or "#define restrict __restrict__" in the
+   previous line.  Perhaps some future version of Sun C++ will work with
+   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
+#if defined __SUNPRO_CC && !defined __RESTRICT
+# define _Restrict
+# define __restrict__
+#endif
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* type to use in place of socklen_t if not defined */
+#undef socklen_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef ssize_t
+
+/* Define to `int' if <sys/types.h> doesn't define. */
+#undef uid_t
+
+/* Define to the widest unsigned integer type if <stdint.h> and <inttypes.h>
+   do not define. */
+#undef uintmax_t
+
+#include "custom.h"
diff --git a/gawk-5.0.1/configure b/gawk-5.0.1/configure
new file mode 100755
index 00000000000..4ee8dbc5d74
--- /dev/null
+++ b/gawk-5.0.1/configure
@@ -0,0 +1,12818 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for GNU Awk 5.0.1.
+#
+# Report bugs to <bug-gawk@gnu.org>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and bug-gawk@gnu.org
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='GNU Awk'
+PACKAGE_TARNAME='gawk'
+PACKAGE_VERSION='5.0.1'
+PACKAGE_STRING='GNU Awk 5.0.1'
+PACKAGE_BUGREPORT='bug-gawk@gnu.org'
+PACKAGE_URL='http://www.gnu.org/software/gawk/'
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+gt_needs=
+ac_header_list=
+ac_func_list=
+enable_option_checking=no
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+subdirs
+GAWKLIBEXT
+LIBMPFR
+LIBREADLINE
+SOCKET_LIBS
+ENABLE_EXTENSIONS_FALSE
+ENABLE_EXTENSIONS_TRUE
+LIBSIGSEGV_PREFIX
+LTLIBSIGSEGV
+LIBSIGSEGV
+HAVE_LIBSIGSEGV
+LIBOBJS
+TEST_CROSS_COMPILE_FALSE
+TEST_CROSS_COMPILE_TRUE
+POSUB
+LTLIBINTL
+LIBINTL
+INTLLIBS
+LTLIBICONV
+LIBICONV
+INTL_MACOSX_LIBS
+XGETTEXT_EXTRA_OPTIONS
+MSGMERGE
+XGETTEXT_015
+XGETTEXT
+GMSGFMT_015
+MSGFMT_015
+GMSGFMT
+MSGFMT
+GETTEXT_MACRO_VERSION
+USE_NLS
+SED
+ZOS_FAIL
+acl_shlibext
+RANLIB
+LN_S
+YFLAGS
+YACC
+EGREP
+GREP
+CPP
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+pkgextensiondir
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_lint
+enable_builtin_intdiv0
+enable_mpfr
+enable_versioned_extension_dir
+enable_dependency_tracking
+enable_largefile
+enable_nls
+with_gnu_ld
+enable_rpath
+with_libiconv_prefix
+with_libintl_prefix
+with_libsigsegv_prefix
+enable_extensions
+with_readline
+with_mpfr
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+YACC
+YFLAGS'
+ac_subdirs_all='extension'
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures GNU Awk 5.0.1 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/gawk]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of GNU Awk 5.0.1:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --disable-lint          do not compile in gawk lint checking
+  --enable-builtin-intdiv0
+                          enable built-in intdiv0 function
+  --disable-mpfr          do not check for MPFR
+  --enable-versioned-extension-dir
+                          use a versioned directory for extensions
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
+  --disable-largefile     omit support for large files
+  --disable-nls           do not use Native Language Support
+  --disable-rpath         do not hardcode runtime library paths
+  --disable-extensions    disable dynamic extensions (default is detect)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
+  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
+  --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
+  --without-libintl-prefix     don't search for libintl in includedir and libdir
+  --with-libsigsegv-prefix[=DIR]  search for libsigsegv in DIR/include and DIR/lib
+  --without-libsigsegv-prefix     don't search for libsigsegv in includedir and libdir
+  --with-readline=DIR     look for the readline library in DIR
+  --with-mpfr=DIR         look for the mpfr and gmp libraries in DIR
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  YACC        The `Yet Another Compiler Compiler' implementation to use.
+              Defaults to the first program found out of: `bison -y', `byacc',
+              `yacc'.
+  YFLAGS      The list of arguments that will be passed by default to $YACC.
+              This script will default YFLAGS to the empty string to avoid a
+              default value of `-d' given by some make applications.
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <bug-gawk@gnu.org>.
+GNU Awk home page: <http://www.gnu.org/software/gawk/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+GNU Awk configure 5.0.1
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------- ##
+## Report this to bug-gawk@gnu.org ##
+## ------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
+# --------------------------------------------
+# Tries to find the compile-time value of EXPR in a program that includes
+# INCLUDES, setting VAR accordingly. Returns whether the value could be
+# computed
+ac_fn_c_compute_int ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if test "$cross_compiling" = yes; then
+    # Depending upon the size, compute the lo and hi bounds.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid; break
+else
+  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
+			if test $ac_lo -le $ac_mid; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) >= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_lo=$ac_mid; break
+else
+  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
+			if test $ac_mid -le $ac_hi; then
+			  ac_lo= ac_hi=
+			  break
+			fi
+			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  ac_lo= ac_hi=
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+static int test_array [1 - 2 * !(($2) <= $ac_mid)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_hi=$ac_mid
+else
+  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in #((
+?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
+'') ac_retval=1 ;;
+esac
+  else
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+static long int longval () { return $2; }
+static unsigned long int ulongval () { return $2; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (($2) < 0)
+    {
+      long int i = longval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%ld", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ($2))
+	return 1;
+      fprintf (f, "%lu", i);
+    }
+  /* Do not output a trailing newline, as this causes \r\n confusion
+     on some platforms.  */
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
+else
+  ac_retval=1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+rm -f conftest.val
+
+  fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_compute_int
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by GNU Awk $as_me 5.0.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+gt_needs="$gt_needs "
+as_fn_append ac_header_list " sys/time.h"
+as_fn_append ac_header_list " unistd.h"
+as_fn_append ac_func_list " alarm"
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# This is a hack. Different versions of install on different systems
+# are just too different. Chuck it and use install-sh.
+#
+# If the user supplies $INSTALL, figure they know what they're doing.
+#
+# With Autoconf 2.5x, this needs to come very early on, but *after*
+# the INIT macro. Sigh.
+
+if test "$INSTALL" = ""
+then
+	INSTALL="$srcdir/install-sh -c"
+	export INSTALL
+fi
+
+
+am__api_version='1.16'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+	&& test "$*" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gawk'
+ VERSION='5.0.1'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar  pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
+
+
+
+# Check whether --enable-lint was given.
+if test "${enable_lint+set}" = set; then :
+  enableval=$enable_lint; if test "$enableval" = no
+	then
+
+$as_echo "#define NO_LINT 1" >>confdefs.h
+
+	fi
+
+fi
+
+# Check whether --enable-builtin-intdiv0 was given.
+if test "${enable_builtin_intdiv0+set}" = set; then :
+  enableval=$enable_builtin_intdiv0; if test "$enableval" = yes
+	then
+
+$as_echo "#define SUPPLY_INTDIV 1" >>confdefs.h
+
+		sed '/^@set PATCHLEVEL/a\
+@set INTDIV' < "$srcdir"/doc/gawktexi.in > foo
+		cp foo "$srcdir"/doc/gawktexi.in
+		rm foo
+	fi
+
+fi
+
+
+SKIP_MPFR=no
+# Check whether --enable-mpfr was given.
+if test "${enable_mpfr+set}" = set; then :
+  enableval=$enable_mpfr; if test "$enableval" = no
+	then
+		SKIP_MPFR=yes
+	fi
+
+fi
+
+
+EXTENSIONDIR=
+# Check whether --enable-versioned-extension-dir was given.
+if test "${enable_versioned_extension_dir+set}" = set; then :
+  enableval=$enable_versioned_extension_dir; if test "$enableval" = yes
+	then
+		MAJOR=`awk '/define gawk_api_major_version/ { print $3 }' < $srcdir/gawkapi.h`
+		MINOR=`awk '/define gawk_api_minor_version/ { print $3 }' < $srcdir/gawkapi.h`
+
+		# note leading slash on the value
+		export EXTENSIONDIR=/ext-$MAJOR.$MINOR
+	fi
+
+fi
+
+
+# set default shared library location
+pkgextensiondir='${pkglibdir}'${EXTENSIONDIR}
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+	@echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+   (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+  case $?:`cat confinc.out 2>/dev/null` in #(
+  '0:this is the am__doit target') :
+    case $s in #(
+  BSD) :
+    am__include='.include' am__quote='"' ;; #(
+  *) :
+    am__include='include' am__quote='' ;;
+esac ;; #(
+  *) :
+     ;;
+esac
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+  ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
+if test "x$ac_cv_header_minix_config_h" = xyes; then :
+  MINIX=yes
+else
+  MINIX=
+fi
+
+
+  if test "$MINIX" = yes; then
+
+$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h
+
+
+$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+
+$as_echo "#define _MINIX 1" >>confdefs.h
+
+  fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if ${ac_cv_safe_to_define___extensions__+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#         define __EXTENSIONS__ 1
+          $ac_includes_default
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_safe_to_define___extensions__=yes
+else
+  ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
+  test $ac_cv_safe_to_define___extensions__ = yes &&
+    $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h
+
+  $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
+
+  $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
+
+  $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+  $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+for ac_prog in 'bison -y' byacc
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_YACC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_YACC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+YACC=$ac_cv_prog_YACC
+if test -n "$YACC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5
+$as_echo "$YACC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
+if ${ac_cv_prog_cc_c99+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <stdio.h>
+
+// Check varargs macros.  These examples are taken from C99 6.10.3.5.
+#define debug(...) fprintf (stderr, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+  int x = 1234;
+  int y = 5678;
+  debug ("Flag");
+  debug ("X = %d\n", x);
+  showlist (The first, second, and third items.);
+  report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+  your preprocessor is broken;
+#endif
+#if BIG_OK
+#else
+  your preprocessor is broken;
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+  int datasize;
+  double data[];
+};
+
+struct named_init {
+  int number;
+  const wchar_t *name;
+  double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+  // See if C++-style comments work.
+  // Iterate through items via the restricted pointer.
+  // Also check for declarations in for loops.
+  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
+    continue;
+  return 0;
+}
+
+// Check varargs and va_copy.
+static void
+test_varargs (const char *format, ...)
+{
+  va_list args;
+  va_start (args, format);
+  va_list args_copy;
+  va_copy (args_copy, args);
+
+  const char *str;
+  int number;
+  float fnumber;
+
+  while (*format)
+    {
+      switch (*format++)
+	{
+	case 's': // string
+	  str = va_arg (args_copy, const char *);
+	  break;
+	case 'd': // int
+	  number = va_arg (args_copy, int);
+	  break;
+	case 'f': // float
+	  fnumber = va_arg (args_copy, double);
+	  break;
+	default:
+	  break;
+	}
+    }
+  va_end (args_copy);
+  va_end (args);
+}
+
+int
+main ()
+{
+
+  // Check bool.
+  _Bool success = false;
+
+  // Check restrict.
+  if (test_restrict ("String literal") == 0)
+    success = true;
+  char *restrict newvar = "Another string";
+
+  // Check varargs.
+  test_varargs ("s, d' f .", "string", 65, 34.234);
+  test_varargs_macros ();
+
+  // Check flexible array members.
+  struct incomplete_array *ia =
+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+  ia->datasize = 10;
+  for (int i = 0; i < ia->datasize; ++i)
+    ia->data[i] = i * 1.234;
+
+  // Check named initializers.
+  struct named_init ni = {
+    .number = 34,
+    .name = L"Test wide string",
+    .average = 543.34343,
+  };
+
+  ni.number = 58;
+
+  int dynamic_array[ni.number];
+  dynamic_array[ni.number - 1] = 543;
+
+  // work around unused variable warnings
+  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
+	  || dynamic_array[ni.number - 1] != 543);
+
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c99" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c99"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c99" != xno; then :
+
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+# This is mainly for my use during testing and development.
+# Yes, it's a bit of a hack.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for special development options" >&5
+$as_echo_n "checking for special development options... " >&6; }
+if test -f $srcdir/.developing
+then
+	# add other debug flags as appropriate, save GAWKDEBUG for emergencies
+	CFLAGS="$CFLAGS -DARRAYDEBUG -DYYDEBUG -DLOCALEDEBUG"
+
+	# turn on compiler warnings if we're doing development
+	# enable debugging using macros also
+	if test "$GCC" = yes
+	then
+		CFLAGS="$CFLAGS -Wall -fno-builtin -g3 -ggdb3"
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	CFLAGS="$CFLAGS -DNDEBUG"	# turn off assertions
+fi
+
+
+
+# shared library suffix for dynamic loading:
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for z/OS USS compilation" >&5
+$as_echo_n "checking for z/OS USS compilation... " >&6; }
+if ${ac_cv_zos_uss+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+if test "OS/390" = "`uname`"
+then
+  ac_cv_zos_uss=yes
+else
+  ac_cv_zos_uss=no
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_zos_uss}" >&5
+$as_echo "${ac_cv_zos_uss}" >&6; }
+if test "x$ac_cv_zos_uss" = "xyes"
+then
+    ac_zos_uss_cc_id=unknown
+  echo " $CC " | $EGREP ' (/bin/)?c89[ |_]' >/dev/null && ac_zos_uss_cc_id=c89
+  echo " $CC " | $EGREP ' (/bin/)?c99[ |_]' >/dev/null && ac_zos_uss_cc_id=xlc
+  echo " $CC " | $EGREP ' (/bin/)?cc[ |_]'  >/dev/null && ac_zos_uss_cc_id=cc
+  echo " $CC " | $EGREP ' (/bin/)?xlc[ |_]' >/dev/null && ac_zos_uss_cc_id=xlc
+  echo " $CC " | $EGREP ' (/bin/)?xlC[ |_]' >/dev/null && ac_zos_uss_cc_id=xlc++
+  echo " $CC " | $EGREP ' (/bin/)?xlc\+\+[ |_]' >/dev/null && ac_zos_uss_cc_id=xlc++
+  test "x$GCC" = "xyes" && ac_zos_uss_cc_id=gcc
+    CPPFLAGS="$CPPFLAGS -D_ALL_SOURCE -D_OPEN_SYS_UNLOCKED_EXT"
+  test "$ac_zos_uss_cc_id" != xlc++ && CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600"
+  case "$ac_zos_uss_cc_id" in
+  c89)
+                                        if test -n "$_C89_OPTIONS"
+    then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: CC = $CC" >&5
+$as_echo "$as_me: CC = $CC" >&6;}
+      { $as_echo "$as_me:${as_lineno-$LINENO}: _C89_OPTIONS = $_C89_OPTIONS" >&5
+$as_echo "$as_me: _C89_OPTIONS = $_C89_OPTIONS" >&6;}
+    else
+      as_fn_error $? "c89-setup-required
+To build GNU Awk using \"c89\", please set
+
+    _C89_OPTIONS=\"-W c,langlvl(stdc99,libext),haltonmsg(CCN3296)\"
+
+in your environment, and reconfigure. (The above flags cannot be specified
+in CFLAGS/CPPFLAGS, due to the parentheses.)" "$LINENO" 5
+    fi
+    ;;
+  gcc)
+        ;;
+  cc)
+    as_fn_error $? "cc-invalid
+The z/OS \"cc\" compiler does not build GNU Awk correctly.
+
+If the \"xlc\" or \"c89\" compiler is available, please set CC accordingly
+and reconfigure. (\"xlc\" is the recommended compiler on z/OS.)" "$LINENO" 5
+    ;;
+  xlc*)
+        CFLAGS="$CFLAGS -qlanglvl=stdc99:libext"
+        cat >zos-cc <<EOF
+#!/bin/sh
+#
+# This wrapper script addresses two annoying peculiarities of the IBM
+# xlc/c99 compiler on z/OS:
+#
+# 1. Missing header files are considered warnings by default rather
+#    than fatal errors;
+#
+# 2. Include directories specified with -I are searched _after_ the
+#    system include directories (for #include<> directives) rather
+#    than before.
+#
+# This script allows the code and the build system to assume standard
+# compiler behavior.
+#
+
+PS4='zos-cc: '
+REAL_CC="$CC"
+
+set -x
+\$REAL_CC -qhaltonmsg=CCN3296 -qnosearch "\$@" -qsearch=/usr/include
+EOF
+    chmod +x zos-cc
+    { $as_echo "$as_me:${as_lineno-$LINENO}: wrapping $CC with zos-cc to obtain standard behavior" >&5
+$as_echo "$as_me: wrapping $CC with zos-cc to obtain standard behavior" >&6;}
+    CC="`pwd`/zos-cc"
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized compiler environment" >&5
+$as_echo "$as_me: WARNING: unrecognized compiler environment" >&2;}
+    ;;
+  esac
+fi # ac_cv_zos_uss = yes
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5
+$as_echo_n "checking for library containing strerror... " >&6; }
+if ${ac_cv_search_strerror+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strerror ();
+int
+main ()
+{
+return strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' cposix; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_strerror=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_strerror+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_strerror+:} false; then :
+
+else
+  ac_cv_search_strerror=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5
+$as_echo "$ac_cv_search_strerror" >&6; }
+ac_res=$ac_cv_search_strerror
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+	 # IRIX 6.2 and later do not support large files by default,
+	 # so use the C compiler's -n32 option if that helps.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 CC="$CC -n32"
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we are using EBCDIC" >&5
+$as_echo_n "checking if we are using EBCDIC... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#if 'a' == 0x81
+gnu_gawk_in_ebcdic
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "gnu_gawk_in_ebcdic" >/dev/null 2>&1; then :
+
+$as_echo "#define USE_EBCDIC 1" >>confdefs.h
+
+ use_ebcdic=yes
+else
+  use_ebcdic=no
+fi
+rm -f conftest*
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_ebcdic" >&5
+$as_echo "$use_ebcdic" >&6; }
+if test "$use_ebcdic" = yes
+then
+	ZOS_FAIL='; echo Expect $@ to fail on z/OS.'
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
+$as_echo_n "checking whether NLS is requested... " >&6; }
+    # Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then :
+  enableval=$enable_nls; USE_NLS=$enableval
+else
+  USE_NLS=yes
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+$as_echo "$USE_NLS" >&6; }
+
+
+
+
+      GETTEXT_MACRO_VERSION=0.19
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGFMT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$MSGFMT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+    ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+$as_echo "$MSGFMT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GMSGFMT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GMSGFMT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+$as_echo "$GMSGFMT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+    *) MSGFMT_015=$MSGFMT ;;
+  esac
+
+  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+    *) GMSGFMT_015=$GMSGFMT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_XGETTEXT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$XGETTEXT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+    ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+$as_echo "$XGETTEXT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+    rm -f messages.po
+
+    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+    *) XGETTEXT_015=$XGETTEXT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGMERGE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$MSGMERGE" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
+            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+    ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+$as_echo "$MSGMERGE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+        test -n "$localedir" || localedir='${datadir}/locale'
+
+
+    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+
+
+  ac_config_commands="$ac_config_commands po-directories"
+
+
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+      while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+        ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${acl_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$acl_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+        test "$with_gnu_ld" != no && break
+        ;;
+      *)
+        test "$with_gnu_ld" != yes && break
+        ;;
+      esac
+    fi
+  done
+  IFS="$acl_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${acl_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes
+  ;;
+*)
+  acl_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
+$as_echo "$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+                                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
+$as_echo_n "checking for shared library run path origin... " >&6; }
+if ${acl_cv_rpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
+$as_echo "$acl_cv_rpath" >&6; }
+  wl="$acl_cv_wl"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+    # Check whether --enable-rpath was given.
+if test "${enable_rpath+set}" = set; then :
+  enableval=$enable_rpath; :
+else
+  enable_rpath=yes
+fi
+
+
+
+
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+                                    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
+$as_echo_n "checking for 64-bit host... " >&6; }
+if ${gl_cv_solaris_64bit+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _LP64
+sixtyfour bits
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "sixtyfour bits" >/dev/null 2>&1; then :
+  gl_cv_solaris_64bit=yes
+else
+  gl_cv_solaris_64bit=no
+fi
+rm -f conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5
+$as_echo "$gl_cv_solaris_64bit" >&6; }
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS= 	}"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then :
+  withval=$with_libiconv_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+
+fi
+
+      LIBICONV=
+  LTLIBICONV=
+  INCICONV=
+  LIBICONV_PREFIX=
+      HAVE_LIBICONV=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='iconv '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+              else
+                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
+$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
+if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <CoreFoundation/CFPreferences.h>
+int
+main ()
+{
+CFPreferencesCopyAppValue(NULL, NULL)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  gt_cv_func_CFPreferencesCopyAppValue=yes
+else
+  gt_cv_func_CFPreferencesCopyAppValue=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
+$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+
+$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
+
+  fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
+$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
+if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <CoreFoundation/CFLocale.h>
+int
+main ()
+{
+CFLocaleCopyCurrent();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  gt_cv_func_CFLocaleCopyCurrent=yes
+else
+  gt_cv_func_CFLocaleCopyCurrent=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
+$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
+  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+
+$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
+
+  fi
+  INTL_MACOSX_LIBS=
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+  fi
+
+
+
+
+
+
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+    case " $gt_needs " in
+    *" need-formatstring-macros "*) gt_api_version=3 ;;
+    *" need-ngettext "*) gt_api_version=2 ;;
+    *) gt_api_version=1 ;;
+  esac
+  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+    if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+
+
+        if test $gt_api_version -ge 3; then
+          gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+'
+        else
+          gt_revision_test_code=
+        fi
+        if test $gt_api_version -ge 2; then
+          gt_expression_test_code=' + * ngettext ("", "", 0)'
+        else
+          gt_expression_test_code=
+        fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
+$as_echo_n "checking for GNU gettext in libc... " >&6; }
+if eval \${$gt_func_gnugettext_libc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings)
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$gt_func_gnugettext_libc=yes"
+else
+  eval "$gt_func_gnugettext_libc=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$gt_func_gnugettext_libc
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+
+
+
+
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCICONV; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+$as_echo_n "checking for iconv... " >&6; }
+if ${am_cv_func_iconv+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+           iconv(cd,NULL,NULL,NULL,NULL);
+           iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+             iconv(cd,NULL,NULL,NULL,NULL);
+             iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$am_save_LIBS"
+    fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+$as_echo "$am_cv_func_iconv" >&6; }
+  if test "$am_cv_func_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+$as_echo_n "checking for working iconv... " >&6; }
+if ${am_cv_func_iconv_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+                  am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main ()
+{
+int result = 0;
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 1;
+        iconv_close (cd_utf8_to_88591);
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\263";
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 2;
+        iconv_close (cd_ascii_to_88591);
+      }
+  }
+  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304";
+        static char buf[2] = { (char)0xDE, (char)0xAD };
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = 1;
+        char *outptr = buf;
+        size_t outbytesleft = 1;
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+          result |= 4;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          result |= 8;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    result |= 16;
+  return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  am_cv_func_iconv_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+        test "$am_cv_func_iconv_works" = no || break
+      done
+      LIBS="$am_save_LIBS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+$as_echo "$am_cv_func_iconv_works" >&6; }
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+
+$as_echo "#define HAVE_ICONV 1" >>confdefs.h
+
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+$as_echo_n "checking how to link with libiconv... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+$as_echo "$LIBICONV" >&6; }
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; then :
+  withval=$with_libintl_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+
+fi
+
+      LIBINTL=
+  LTLIBINTL=
+  INCINTL=
+  LIBINTL_PREFIX=
+      HAVE_LIBINTL=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='intl '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+              else
+                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'intl'; then
+                  LIBINTL_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'intl'; then
+                  LIBINTL_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
+$as_echo_n "checking for GNU gettext in libintl... " >&6; }
+if eval \${$gt_func_gnugettext_libintl+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+                        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias (""))
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$gt_func_gnugettext_libintl=yes"
+else
+  eval "$gt_func_gnugettext_libintl=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+                        if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias (""))
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  LIBINTL="$LIBINTL $LIBICONV"
+                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                 eval "$gt_func_gnugettext_libintl=yes"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"
+fi
+eval ac_res=\$$gt_func_gnugettext_libintl
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+        fi
+
+                                        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+                    LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+
+
+    if test -n "$INTL_MACOSX_LIBS"; then
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+                LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+      fi
+    fi
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+
+$as_echo "#define ENABLE_NLS 1" >>confdefs.h
+
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
+$as_echo_n "checking whether to use NLS... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+$as_echo "$USE_NLS" >&6; }
+  if test "$USE_NLS" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
+$as_echo_n "checking where the gettext function comes from... " >&6; }
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
+$as_echo "$gt_source" >&6; }
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
+$as_echo_n "checking how to link with libintl... " >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
+$as_echo "$LIBINTL" >&6; }
+
+  for element in $INCINTL; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+      fi
+
+
+$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h
+
+    fi
+
+        POSUB=po
+  fi
+
+
+
+    INTLLIBS="$LIBINTL"
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5
+$as_echo_n "checking for nl_langinfo and CODESET... " >&6; }
+if ${am_cv_langinfo_codeset+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <langinfo.h>
+int
+main ()
+{
+char* cs = nl_langinfo(CODESET); return !cs;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_langinfo_codeset=yes
+else
+  am_cv_langinfo_codeset=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5
+$as_echo "$am_cv_langinfo_codeset" >&6; }
+  if test $am_cv_langinfo_codeset = yes; then
+
+$as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
+
+  fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5
+$as_echo_n "checking for LC_MESSAGES... " >&6; }
+if ${gt_cv_val_LC_MESSAGES+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <locale.h>
+int
+main ()
+{
+return LC_MESSAGES
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  gt_cv_val_LC_MESSAGES=yes
+else
+  gt_cv_val_LC_MESSAGES=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_val_LC_MESSAGES" >&5
+$as_echo "$gt_cv_val_LC_MESSAGES" >&6; }
+  if test $gt_cv_val_LC_MESSAGES = yes; then
+
+$as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h
+
+  fi
+
+
+for ac_header in arpa/inet.h fcntl.h locale.h libintl.h mcheck.h \
+	netdb.h netinet/in.h stddef.h string.h \
+	sys/ioctl.h sys/param.h sys/select.h sys/socket.h sys/time.h unistd.h \
+	termios.h stropts.h wchar.h wctype.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
+$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
+if ${ac_cv_header_stdbool_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+             #include <stdbool.h>
+             #ifndef bool
+              "error: bool is not defined"
+             #endif
+             #ifndef false
+              "error: false is not defined"
+             #endif
+             #if false
+              "error: false is not 0"
+             #endif
+             #ifndef true
+              "error: true is not defined"
+             #endif
+             #if true != 1
+              "error: true is not 1"
+             #endif
+             #ifndef __bool_true_false_are_defined
+              "error: __bool_true_false_are_defined is not defined"
+             #endif
+
+             struct s { _Bool s: 1; _Bool t; } s;
+
+             char a[true == 1 ? 1 : -1];
+             char b[false == 0 ? 1 : -1];
+             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
+             char d[(bool) 0.5 == true ? 1 : -1];
+             /* See body of main program for 'e'.  */
+             char f[(_Bool) 0.0 == false ? 1 : -1];
+             char g[true];
+             char h[sizeof (_Bool)];
+             char i[sizeof s.t];
+             enum { j = false, k = true, l = false * true, m = true * 256 };
+             /* The following fails for
+                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
+             _Bool n[m];
+             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
+             char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+             /* Catch a bug in an HP-UX C compiler.  See
+                http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+                http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+              */
+             _Bool q = true;
+             _Bool *pq = &q;
+
+int
+main ()
+{
+
+             bool e = &s;
+             *pq |= q;
+             *pq |= ! q;
+             /* Refer to every declared value, to avoid compiler optimizations.  */
+             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
+                     + !m + !n + !o + !p + !q + !pq);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdbool_h=yes
+else
+  ac_cv_header_stdbool_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
+$as_echo "$ac_cv_header_stdbool_h" >&6; }
+   ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
+if test "x$ac_cv_type__Bool" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE__BOOL 1
+_ACEOF
+
+
+fi
+
+
+if test $ac_cv_header_stdbool_h = yes; then
+
+$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
+$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
+if ${ac_cv_header_sys_wait_h+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+
+int
+main ()
+{
+  int s;
+  wait (&s);
+  s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_sys_wait_h=yes
+else
+  ac_cv_header_sys_wait_h=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
+$as_echo "$ac_cv_header_sys_wait_h" >&6; }
+if test $ac_cv_header_sys_wait_h = yes; then
+
+$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
+$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
+if ${ac_cv_header_time+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_time=yes
+else
+  ac_cv_header_time=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
+$as_echo "$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
+
+fi
+
+
+if test "$ac_cv_header_string_h" = yes
+then
+	for ac_header in memory.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "memory.h" "ac_cv_header_memory_h" "$ac_includes_default"
+if test "x$ac_cv_header_memory_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_MEMORY_H 1
+_ACEOF
+
+fi
+
+done
+
+else
+	for ac_header in strings.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default"
+if test "x$ac_cv_header_strings_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STRINGS_H 1
+_ACEOF
+
+fi
+
+done
+
+fi
+
+ if test "$build_alias" != "$host_alias"; then
+  TEST_CROSS_COMPILE_TRUE=
+  TEST_CROSS_COMPILE_FALSE='#'
+else
+  TEST_CROSS_COMPILE_TRUE='#'
+  TEST_CROSS_COMPILE_FALSE=
+fi
+
+
+ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
+if test "x$ac_cv_type_pid_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
+
+fi
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
+$as_echo_n "checking for uid_t in sys/types.h... " >&6; }
+if ${ac_cv_type_uid_t+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "uid_t" >/dev/null 2>&1; then :
+  ac_cv_type_uid_t=yes
+else
+  ac_cv_type_uid_t=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
+$as_echo "$ac_cv_type_uid_t" >&6; }
+if test $ac_cv_type_uid_t = no; then
+
+$as_echo "#define uid_t int" >>confdefs.h
+
+
+$as_echo "#define gid_t int" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking type of array argument to getgroups" >&5
+$as_echo_n "checking type of array argument to getgroups... " >&6; }
+if ${ac_cv_type_getgroups+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_type_getgroups=cross
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Thanks to Mike Rendell for this test.  */
+$ac_includes_default
+#define NGID 256
+#undef MAX
+#define MAX(x, y) ((x) > (y) ? (x) : (y))
+
+int
+main ()
+{
+  gid_t gidset[NGID];
+  int i, n;
+  union { gid_t gval; long int lval; }  val;
+
+  val.lval = -1;
+  for (i = 0; i < NGID; i++)
+    gidset[i] = val.gval;
+  n = getgroups (sizeof (gidset) / MAX (sizeof (int), sizeof (gid_t)) - 1,
+		 gidset);
+  /* Exit non-zero if getgroups seems to require an array of ints.  This
+     happens when gid_t is short int but getgroups modifies an array
+     of ints.  */
+  return n > 0 && gidset[n] != val.gval;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_type_getgroups=gid_t
+else
+  ac_cv_type_getgroups=int
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+if test $ac_cv_type_getgroups = cross; then
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <unistd.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "getgroups.*int.*gid_t" >/dev/null 2>&1; then :
+  ac_cv_type_getgroups=gid_t
+else
+  ac_cv_type_getgroups=int
+fi
+rm -f conftest*
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_getgroups" >&5
+$as_echo "$ac_cv_type_getgroups" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define GETGROUPS_T $ac_cv_type_getgroups
+_ACEOF
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5
+$as_echo_n "checking for unsigned long long int... " >&6; }
+if ${ac_cv_type_unsigned_long_long_int+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+unsigned long long int ull = 18446744073709551615ULL;
+	    typedef int a[(18446744073709551615ULL <= (unsigned long long int) -1
+			   ? 1 : -1)];
+	   int i = 63;
+int
+main ()
+{
+unsigned long long int ullmax = 18446744073709551615ull;
+	    return (ull << 63 | ull >> 63 | ull << i | ull >> i
+		    | ullmax / ull | ullmax % ull);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_type_unsigned_long_long_int=yes
+else
+  ac_cv_type_unsigned_long_long_int=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5
+$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; }
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
+
+$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
+
+  fi
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5
+$as_echo_n "checking for long long int... " >&6; }
+if ${ac_cv_type_long_long_int+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_type_long_long_int=yes
+      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
+        if test $ac_cv_type_long_long_int = yes; then
+                                        if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+                 #ifndef LLONG_MAX
+                 # define HALF \
+                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+                 # define LLONG_MAX (HALF - 1 + HALF)
+                 #endif
+int
+main ()
+{
+long long int n = 1;
+                 int i;
+                 for (i = 0; ; i++)
+                   {
+                     long long int m = n << i;
+                     if (m >> i != n)
+                       return 1;
+                     if (LLONG_MAX / 2 < m)
+                       break;
+                   }
+                 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_type_long_long_int=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+        fi
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_long_long_int" >&5
+$as_echo "$ac_cv_type_long_long_int" >&6; }
+  if test $ac_cv_type_long_long_int = yes; then
+
+$as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h
+
+  fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsigned long long int" >&5
+$as_echo_n "checking for unsigned long long int... " >&6; }
+if ${ac_cv_type_unsigned_long_long_int+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+unsigned long long int ull = 18446744073709551615ULL;
+	    typedef int a[(18446744073709551615ULL <= (unsigned long long int) -1
+			   ? 1 : -1)];
+	   int i = 63;
+int
+main ()
+{
+unsigned long long int ullmax = 18446744073709551615ull;
+	    return (ull << 63 | ull >> 63 | ull << i | ull >> i
+		    | ullmax / ull | ullmax % ull);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_type_unsigned_long_long_int=yes
+else
+  ac_cv_type_unsigned_long_long_int=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_unsigned_long_long_int" >&5
+$as_echo "$ac_cv_type_unsigned_long_long_int" >&6; }
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
+
+$as_echo "#define HAVE_UNSIGNED_LONG_LONG_INT 1" >>confdefs.h
+
+  fi
+
+
+
+  ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "$ac_includes_default"
+if test "x$ac_cv_type_intmax_t" = xyes; then :
+
+$as_echo "#define HAVE_INTMAX_T 1" >>confdefs.h
+
+else
+  test $ac_cv_type_long_long_int = yes \
+       && ac_type='long long int' \
+       || ac_type='long int'
+
+cat >>confdefs.h <<_ACEOF
+#define intmax_t $ac_type
+_ACEOF
+
+fi
+
+
+
+
+  ac_fn_c_check_type "$LINENO" "uintmax_t" "ac_cv_type_uintmax_t" "$ac_includes_default"
+if test "x$ac_cv_type_uintmax_t" = xyes; then :
+
+$as_echo "#define HAVE_UINTMAX_T 1" >>confdefs.h
+
+else
+  test $ac_cv_type_unsigned_long_long_int = yes \
+       && ac_type='unsigned long long int' \
+       || ac_type='unsigned long int'
+
+cat >>confdefs.h <<_ACEOF
+#define uintmax_t $ac_type
+_ACEOF
+
+fi
+
+
+ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
+if test "x$ac_cv_type_ssize_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define ssize_t int
+_ACEOF
+
+fi
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned int" >&5
+$as_echo_n "checking size of unsigned int... " >&6; }
+if ${ac_cv_sizeof_unsigned_int+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned int))" "ac_cv_sizeof_unsigned_int"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_unsigned_int" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned int)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_unsigned_int=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_int" >&5
+$as_echo "$ac_cv_sizeof_unsigned_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned long" >&5
+$as_echo_n "checking size of unsigned long... " >&6; }
+if ${ac_cv_sizeof_unsigned_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_unsigned_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_unsigned_long=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5
+$as_echo "$ac_cv_sizeof_unsigned_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+int
+main ()
+{
+
+	time_t foo;
+	foo = 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+$as_echo "#define TIME_T_IN_SYS_TYPES_H 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wctype.h>
+int
+main ()
+{
+
+	wctype_t foo;
+	foo = 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+$as_echo "#define HAVE_WCTYPE_T 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wctype.h>
+int
+main ()
+{
+
+	wint_t foo;
+	foo = 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+$as_echo "#define HAVE_WINT_T 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/socket.h>
+int
+main ()
+{
+
+	struct sockaddr_storage foo;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+$as_echo "#define HAVE_SOCKADDR_STORAGE 1" >>confdefs.h
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+
+
+
+
+
+   ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include <sys/types.h>
+#include <sys/socket.h>
+"
+if test "x$ac_cv_type_socklen_t" = xyes; then :
+
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t equivalent" >&5
+$as_echo_n "checking for socklen_t equivalent... " >&6; }
+      if ${rsync_cv_socklen_t_equiv+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+         # Systems have either "struct sockaddr *" or
+         # "void *" as the second argument to getpeername
+         rsync_cv_socklen_t_equiv=
+         for arg2 in "struct sockaddr" void
+	 do
+            for t in int size_t unsigned long "unsigned long"
+	    do
+               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+                  int getpeername (int, $arg2 *, $t *);
+
+int
+main ()
+{
+
+                  $t len;
+                  getpeername(0,0,&len);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+                  rsync_cv_socklen_t_equiv="$t"
+                  break
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+            done
+         done
+
+         if test "$rsync_cv_socklen_t_equiv" = ""
+	 then
+		rsync_cv_socklen_t_equiv=int
+         fi
+
+fi
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rsync_cv_socklen_t_equiv" >&5
+$as_echo "$rsync_cv_socklen_t_equiv" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define socklen_t $rsync_cv_socklen_t_equiv
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+
+
+  for ac_header in $ac_header_list
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+  for ac_func in $ac_func_list
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mktime" >&5
+$as_echo_n "checking for working mktime... " >&6; }
+if ${ac_cv_func_working_mktime+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "$cross_compiling" = yes; then :
+  ac_cv_func_working_mktime=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Test program from Paul Eggert and Tony Leneis.  */
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#include <limits.h>
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifndef HAVE_ALARM
+# define alarm(X) /* empty */
+#endif
+
+/* Work around redefinition to rpl_putenv by other config tests.  */
+#undef putenv
+
+static time_t time_t_max;
+static time_t time_t_min;
+
+/* Values we'll use to set the TZ environment variable.  */
+static const char *tz_strings[] = {
+  (const char *) 0, "TZ=GMT0", "TZ=JST-9",
+  "TZ=EST+3EDT+2,M10.1.0/00:00:00,M2.3.0/00:00:00"
+};
+#define N_STRINGS (sizeof (tz_strings) / sizeof (tz_strings[0]))
+
+/* Return 0 if mktime fails to convert a date in the spring-forward gap.
+   Based on a problem report from Andreas Jaeger.  */
+static int
+spring_forward_gap ()
+{
+  /* glibc (up to about 1998-10-07) failed this test. */
+  struct tm tm;
+
+  /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
+     instead of "TZ=America/Vancouver" in order to detect the bug even
+     on systems that don't support the Olson extension, or don't have the
+     full zoneinfo tables installed.  */
+  putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0");
+
+  tm.tm_year = 98;
+  tm.tm_mon = 3;
+  tm.tm_mday = 5;
+  tm.tm_hour = 2;
+  tm.tm_min = 0;
+  tm.tm_sec = 0;
+  tm.tm_isdst = -1;
+  return mktime (&tm) != (time_t) -1;
+}
+
+static int
+mktime_test1 (time_t now)
+{
+  struct tm *lt;
+  return ! (lt = localtime (&now)) || mktime (lt) == now;
+}
+
+static int
+mktime_test (time_t now)
+{
+  return (mktime_test1 (now)
+	  && mktime_test1 ((time_t) (time_t_max - now))
+	  && mktime_test1 ((time_t) (time_t_min + now)));
+}
+
+static int
+irix_6_4_bug ()
+{
+  /* Based on code from Ariel Faigon.  */
+  struct tm tm;
+  tm.tm_year = 96;
+  tm.tm_mon = 3;
+  tm.tm_mday = 0;
+  tm.tm_hour = 0;
+  tm.tm_min = 0;
+  tm.tm_sec = 0;
+  tm.tm_isdst = -1;
+  mktime (&tm);
+  return tm.tm_mon == 2 && tm.tm_mday == 31;
+}
+
+static int
+bigtime_test (int j)
+{
+  struct tm tm;
+  time_t now;
+  tm.tm_year = tm.tm_mon = tm.tm_mday = tm.tm_hour = tm.tm_min = tm.tm_sec = j;
+  now = mktime (&tm);
+  if (now != (time_t) -1)
+    {
+      struct tm *lt = localtime (&now);
+      if (! (lt
+	     && lt->tm_year == tm.tm_year
+	     && lt->tm_mon == tm.tm_mon
+	     && lt->tm_mday == tm.tm_mday
+	     && lt->tm_hour == tm.tm_hour
+	     && lt->tm_min == tm.tm_min
+	     && lt->tm_sec == tm.tm_sec
+	     && lt->tm_yday == tm.tm_yday
+	     && lt->tm_wday == tm.tm_wday
+	     && ((lt->tm_isdst < 0 ? -1 : 0 < lt->tm_isdst)
+		  == (tm.tm_isdst < 0 ? -1 : 0 < tm.tm_isdst))))
+	return 0;
+    }
+  return 1;
+}
+
+static int
+year_2050_test ()
+{
+  /* The correct answer for 2050-02-01 00:00:00 in Pacific time,
+     ignoring leap seconds.  */
+  unsigned long int answer = 2527315200UL;
+
+  struct tm tm;
+  time_t t;
+  tm.tm_year = 2050 - 1900;
+  tm.tm_mon = 2 - 1;
+  tm.tm_mday = 1;
+  tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
+  tm.tm_isdst = -1;
+
+  /* Use the portable POSIX.1 specification "TZ=PST8PDT,M4.1.0,M10.5.0"
+     instead of "TZ=America/Vancouver" in order to detect the bug even
+     on systems that don't support the Olson extension, or don't have the
+     full zoneinfo tables installed.  */
+  putenv ((char*) "TZ=PST8PDT,M4.1.0,M10.5.0");
+
+  t = mktime (&tm);
+
+  /* Check that the result is either a failure, or close enough
+     to the correct answer that we can assume the discrepancy is
+     due to leap seconds.  */
+  return (t == (time_t) -1
+	  || (0 < t && answer - 120 <= t && t <= answer + 120));
+}
+
+int
+main ()
+{
+  time_t t, delta;
+  int i, j;
+
+  /* This test makes some buggy mktime implementations loop.
+     Give up after 60 seconds; a mktime slower than that
+     isn't worth using anyway.  */
+  alarm (60);
+
+  for (;;)
+    {
+      t = (time_t_max << 1) + 1;
+      if (t <= time_t_max)
+	break;
+      time_t_max = t;
+    }
+  time_t_min = - ((time_t) ~ (time_t) 0 == (time_t) -1) - time_t_max;
+
+  delta = time_t_max / 997; /* a suitable prime number */
+  for (i = 0; i < N_STRINGS; i++)
+    {
+      if (tz_strings[i])
+	putenv ((char*) tz_strings[i]);
+
+      for (t = 0; t <= time_t_max - delta; t += delta)
+	if (! mktime_test (t))
+	  return 1;
+      if (! (mktime_test ((time_t) 1)
+	     && mktime_test ((time_t) (60 * 60))
+	     && mktime_test ((time_t) (60 * 60 * 24))))
+	return 1;
+
+      for (j = 1; ; j <<= 1)
+	if (! bigtime_test (j))
+	  return 1;
+	else if (INT_MAX / 2 < j)
+	  break;
+      if (! bigtime_test (INT_MAX))
+	return 1;
+    }
+  return ! (irix_6_4_bug () && spring_forward_gap () && year_2050_test ());
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_func_working_mktime=yes
+else
+  ac_cv_func_working_mktime=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_working_mktime" >&5
+$as_echo "$ac_cv_func_working_mktime" >&6; }
+if test $ac_cv_func_working_mktime = no; then
+  case " $LIBOBJS " in
+  *" mktime.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS mktime.$ac_objext"
+ ;;
+esac
+
+fi
+
+case "$ac_cv_func_working_mktime" in
+yes)
+$as_echo "#define HAVE_MKTIME 1" >>confdefs.h
+
+	;;
+esac
+
+ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo"
+if test "x$ac_cv_func_getaddrinfo" = xyes; then :
+
+$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo in -lsocket" >&5
+$as_echo_n "checking for getaddrinfo in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_getaddrinfo+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getaddrinfo ();
+int
+main ()
+{
+return getaddrinfo ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_socket_getaddrinfo=yes
+else
+  ac_cv_lib_socket_getaddrinfo=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_getaddrinfo" >&5
+$as_echo "$ac_cv_lib_socket_getaddrinfo" >&6; }
+if test "x$ac_cv_lib_socket_getaddrinfo" = xyes; then :
+
+$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h
+
+fi
+
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing fmod" >&5
+$as_echo_n "checking for library containing fmod... " >&6; }
+if ${ac_cv_search_fmod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char fmod ();
+int
+main ()
+{
+return fmod ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_fmod=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_fmod+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_fmod+:} false; then :
+
+else
+  ac_cv_search_fmod=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_fmod" >&5
+$as_echo "$ac_cv_search_fmod" >&6; }
+ac_res=$ac_cv_search_fmod
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing isinf" >&5
+$as_echo_n "checking for library containing isinf... " >&6; }
+if ${ac_cv_search_isinf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char isinf ();
+int
+main ()
+{
+return isinf ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_isinf=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_isinf+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_isinf+:} false; then :
+
+else
+  ac_cv_search_isinf=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_isinf" >&5
+$as_echo "$ac_cv_search_isinf" >&6; }
+ac_res=$ac_cv_search_isinf
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing ismod" >&5
+$as_echo_n "checking for library containing ismod... " >&6; }
+if ${ac_cv_search_ismod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ismod ();
+int
+main ()
+{
+return ismod ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_ismod=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_ismod+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_ismod+:} false; then :
+
+else
+  ac_cv_search_ismod=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_ismod" >&5
+$as_echo "$ac_cv_search_ismod" >&6; }
+ac_res=$ac_cv_search_ismod
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+case $host_os in
+osf1)	: ;;
+*)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libsigsegv-prefix was given.
+if test "${with_libsigsegv_prefix+set}" = set; then :
+  withval=$with_libsigsegv_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+
+fi
+
+      LIBSIGSEGV=
+  LTLIBSIGSEGV=
+  INCSIGSEGV=
+  LIBSIGSEGV_PREFIX=
+      HAVE_LIBSIGSEGV=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='sigsegv '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBSIGSEGV="${LTLIBSIGSEGV}${LTLIBSIGSEGV:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBSIGSEGV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBSIGSEGV="${LTLIBSIGSEGV}${LTLIBSIGSEGV:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                                LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBSIGSEGV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }$found_a"
+              else
+                                                LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'sigsegv'; then
+                  LIBSIGSEGV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'sigsegv'; then
+                  LIBSIGSEGV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCSIGSEGV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCSIGSEGV="${INCSIGSEGV}${INCSIGSEGV:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBSIGSEGV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBSIGSEGV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBSIGSEGV="${LTLIBSIGSEGV}${LTLIBSIGSEGV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }$dep"
+                    LTLIBSIGSEGV="${LTLIBSIGSEGV}${LTLIBSIGSEGV:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }-l$name"
+            LTLIBSIGSEGV="${LTLIBSIGSEGV}${LTLIBSIGSEGV:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBSIGSEGV="${LIBSIGSEGV}${LIBSIGSEGV:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBSIGSEGV="${LTLIBSIGSEGV}${LTLIBSIGSEGV:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+
+        ac_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCSIGSEGV; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libsigsegv" >&5
+$as_echo_n "checking for libsigsegv... " >&6; }
+if ${ac_cv_libsigsegv+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    ac_save_LIBS="$LIBS"
+                                case " $LIBSIGSEGV" in
+      *" -l"*) LIBS="$LIBS $LIBSIGSEGV" ;;
+      *)       LIBS="$LIBSIGSEGV $LIBS" ;;
+    esac
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sigsegv.h>
+int
+main ()
+{
+sigsegv_deinstall_handler();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_libsigsegv=yes
+else
+  ac_cv_libsigsegv='no, consider installing GNU libsigsegv'
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LIBS="$ac_save_LIBS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_libsigsegv" >&5
+$as_echo "$ac_cv_libsigsegv" >&6; }
+  if test "$ac_cv_libsigsegv" = yes; then
+    HAVE_LIBSIGSEGV=yes
+
+$as_echo "#define HAVE_LIBSIGSEGV 1" >>confdefs.h
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libsigsegv" >&5
+$as_echo_n "checking how to link with libsigsegv... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBSIGSEGV" >&5
+$as_echo "$LIBSIGSEGV" >&6; }
+  else
+    HAVE_LIBSIGSEGV=no
+            CPPFLAGS="$ac_save_CPPFLAGS"
+    LIBSIGSEGV=
+    LTLIBSIGSEGV=
+    LIBSIGSEGV_PREFIX=
+  fi
+
+
+
+
+
+
+
+    gl_cv_lib_sigsegv="$ac_cv_libsigsegv"
+
+	;;
+esac
+
+# Need the check for mkstemp and tmpfile for missing_d/snprintf.c.
+for ac_func in __etoa_l atexit btowc fmod gai_strerror \
+	getgrent getgroups grantpt \
+	fwrite_unlocked \
+	isascii iswctype iswlower iswupper mbrlen \
+	memcmp memcpy memcpy_ulong memmove memset \
+	memset_ulong mkstemp posix_openpt setenv setlocale setsid sigprocmask \
+	snprintf strchr \
+	strerror strftime strcasecmp strncasecmp strcoll strtod strtoul \
+	system timegm tmpfile towlower towupper tzset usleep waitpid wcrtomb \
+	wcscoll wctype
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mbrtowc and mbstate_t are properly declared" >&5
+$as_echo_n "checking whether mbrtowc and mbstate_t are properly declared... " >&6; }
+if ${ac_cv_func_mbrtowc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <wchar.h>
+int
+main ()
+{
+wchar_t wc;
+	      char const s[] = "";
+	      size_t n = 1;
+	      mbstate_t state;
+	      return ! (sizeof state && (mbrtowc) (&wc, s, n, &state));
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_func_mbrtowc=yes
+else
+  ac_cv_func_mbrtowc=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mbrtowc" >&5
+$as_echo "$ac_cv_func_mbrtowc" >&6; }
+  if test $ac_cv_func_mbrtowc = yes; then
+
+$as_echo "#define HAVE_MBRTOWC 1" >>confdefs.h
+
+  fi
+
+
+# Check whether --enable-extensions was given.
+if test "${enable_extensions+set}" = set; then :
+  enableval=$enable_extensions;
+fi
+
+if test "$enable_extensions" != "no"
+then
+	extensions_supported=no
+
+		case $host_os in
+	mirbsd* | openedition*)	# OS/390 z/OS POSIX layer
+		;;
+	*)
+	ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+
+		# Check this separately. Some systems have dlopen
+		# in libc. Notably freebsd and cygwin.
+		# HP-NSK has it in zrldsrl
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
+$as_echo_n "checking for library containing dlopen... " >&6; }
+if ${ac_cv_search_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' dl zrldsrl; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_dlopen=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_dlopen+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_dlopen+:} false; then :
+
+else
+  ac_cv_search_dlopen=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5
+$as_echo "$ac_cv_search_dlopen" >&6; }
+ac_res=$ac_cv_search_dlopen
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  gawk_have_dlopen=yes
+else
+  gawk_have_dlopen=no
+fi
+
+		# Only do DYNAMIC if we have the lib. z/OS (some versions) have
+		# the header but not the lib, apparently
+		if test "$gawk_have_dlopen" = yes
+		then
+			extensions_supported=yes
+
+$as_echo "#define DYNAMIC 1" >>confdefs.h
+
+		fi
+
+fi
+
+
+		;;
+	esac
+
+	if test "$enable_extensions$extensions_supported" = "yesno"
+	then
+		as_fn_error $? "extension support requested, but unavailable" "$LINENO" 5
+	fi
+	enable_extensions=$extensions_supported
+fi
+ if test "$enable_extensions" = "yes"; then
+  ENABLE_EXTENSIONS_TRUE=
+  ENABLE_EXTENSIONS_FALSE='#'
+else
+  ENABLE_EXTENSIONS_TRUE='#'
+  ENABLE_EXTENSIONS_FALSE=
+fi
+
+
+case $host_os in
+vms*|beos*|os2*|msdos)
+
+$as_echo "#define GETPGRP_VOID 1" >>confdefs.h
+
+	;;
+*)	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether getpgrp requires zero arguments" >&5
+$as_echo_n "checking whether getpgrp requires zero arguments... " >&6; }
+if ${ac_cv_func_getpgrp_void+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # Use it with a single arg.
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+getpgrp (0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_func_getpgrp_void=no
+else
+  ac_cv_func_getpgrp_void=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getpgrp_void" >&5
+$as_echo "$ac_cv_func_getpgrp_void" >&6; }
+if test $ac_cv_func_getpgrp_void = yes; then
+
+$as_echo "#define GETPGRP_VOID 1" >>confdefs.h
+
+fi
+
+	;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for printf %F format" >&5
+$as_echo_n "checking for printf %F format... " >&6; }
+if test "$cross_compiling" = yes; then :
+  has_f_format=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#include <stdio.h>
+
+int main()
+{
+	char buf[100];
+
+	sprintf(buf, "%F", 123.45);
+
+	if (strcmp(buf, "123.450000") == 0)
+		return 0;
+	else
+		return 1;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  has_f_format=yes
+else
+  has_f_format=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+if test "$has_f_format" = yes
+then
+
+$as_echo "#define PRINTF_HAS_F_FORMAT 1" >>confdefs.h
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_f_format" >&5
+$as_echo "$has_f_format" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for printf %a format" >&5
+$as_echo_n "checking for printf %a format... " >&6; }
+if test "$cross_compiling" = yes; then :
+  has_a_format=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#include <stdio.h>
+
+int main()
+{
+	char buf[100];
+
+	sprintf(buf, "%a", 8.0);
+
+	if (strncmp(buf, "0x", 2) == 0)
+		return 0;
+	else
+		return 1;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  has_a_format=yes
+else
+  has_a_format=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+if test "$has_a_format" = yes
+then
+
+$as_echo "#define PRINTF_HAS_A_FORMAT 1" >>confdefs.h
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_a_format" >&5
+$as_echo "$has_a_format" >&6; }
+
+
+gawk_have_sockets=no
+# Check for system-dependent location of socket libraries
+
+SOCKET_LIBS=
+if test "$ISC" = yes; then
+  SOCKET_LIBS="-lnsl_s -linet"
+else
+  # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X
+  # libraries were built with DECnet support.  And karl@cs.umb.edu says
+  # the Alpha needs dnet_stub (dnet does not exist).
+  #
+  # ADR: Is this needed just for sockets???
+#  AC_CHECK_LIB(dnet, dnet_ntoa, [SOCKET_LIBS="$SOCKET_LIBS -ldnet"])
+#  if test $ac_cv_lib_dnet_ntoa = no; then
+#    AC_CHECK_LIB(dnet_stub, dnet_ntoa,
+#	[SOCKET_LIBS="$SOCKET_LIBS -ldnet_stub"])
+#  fi
+
+  # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+  # to get the SysV transport functions.
+  # chad@anasazi.com says the Pyramid MIS-ES running DC/OSx (SVR4)
+  # needs -lnsl.
+  # The nsl library prevents programs from opening the X display
+  # on Irix 5.2, according to dickey@clark.net.
+  ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = xyes; then :
+
+fi
+
+  if test $ac_cv_func_gethostbyname = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
+$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
+if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nsl_gethostbyname=yes
+else
+  ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
+$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
+if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
+  SOCKET_LIBS="$SOCKET_LIBS -lnsl"
+fi
+
+  fi
+
+  # lieder@skyler.mavd.honeywell.com says without -lsocket,
+  # socket/setsockopt and other routines are undefined under SCO ODT
+  # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
+  # on later versions), says simon@lia.di.epfl.ch: it contains
+  # gethostby* variants that don't use the nameserver (or something).
+  # -lsocket must be given before -lnsl if both are needed.
+  # We assume that if connect needs -lnsl, so does gethostbyname.
+  ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
+if test "x$ac_cv_func_connect" = xyes; then :
+
+fi
+
+  if test $ac_cv_func_connect = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
+$as_echo_n "checking for connect in -lsocket... " >&6; }
+if ${ac_cv_lib_socket_connect+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $SOCKET_LIBS $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char connect ();
+int
+main ()
+{
+return connect ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_socket_connect=yes
+else
+  ac_cv_lib_socket_connect=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
+$as_echo "$ac_cv_lib_socket_connect" >&6; }
+if test "x$ac_cv_lib_socket_connect" = xyes; then :
+  SOCKET_LIBS="-lsocket $SOCKET_LIBS"
+    				  gawk_have_sockets=yes
+fi
+
+  else
+    gawk_have_sockets=yes
+  fi
+fi
+
+if test "${gawk_have_sockets}" = "yes"
+then
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking where to find the socket library calls" >&5
+$as_echo_n "checking where to find the socket library calls... " >&6; }
+	case "${SOCKET_LIBS}" in
+	?*)	gawk_lib_loc="${SOCKET_LIBS}" ;;
+	*)	gawk_lib_loc="the standard library" ;;
+	esac
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${gawk_lib_loc}" >&5
+$as_echo "${gawk_lib_loc}" >&6; }
+
+
+$as_echo "#define HAVE_SOCKETS 1" >>confdefs.h
+
+fi
+
+
+
+
+# Check whether --with-readline was given.
+if test "${with_readline+set}" = set; then :
+  withval=$with_readline; _do_readline=$withval
+else
+  _do_readline=yes
+fi
+
+
+  if test "$_do_readline" != "no" ; then
+     if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+     fi
+
+     for _termcap in "" "-ltermcap" "-lcurses" "-lncurses" ; do
+        _readline_save_libs=$LIBS
+        _combo="-lreadline${_termcap:+ $_termcap}"
+        LIBS="$LIBS $_combo"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether readline via \"$_combo\" is present and sane" >&5
+$as_echo_n "checking whether readline via \"$_combo\" is present and sane... " >&6; }
+
+	if test "$cross_compiling" = yes; then :
+  		cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+int
+main ()
+{
+
+	int fd;
+	char *line;
+
+	close(0);
+	close(1);
+	fd = open("/dev/null", 2);	/* should get fd 0 */
+	dup(fd);
+	line = readline("giveittome> ");
+
+	/* some printfs don't handle NULL for %s */
+	printf("got <%s>\n", line ? line : "(NULL)");
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  			_found_readline=yes
+else
+  			_found_readline=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+
+int main(int argc, char **argv)
+{
+	int fd;
+	char *line;
+
+	close(0);
+	close(1);
+	fd = open("/dev/null", 2);	/* should get fd 0 */
+	dup(fd);
+	line = readline("giveittome> ");
+
+	/* some printfs don't handle NULL for %s */
+	printf("got <%s>\n", line ? line : "(NULL)");
+	return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+              _found_readline=yes
+else
+              _found_readline=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_found_readline" >&5
+$as_echo "$_found_readline" >&6; }
+
+        LIBS=$_readline_save_libs
+
+        if test $_found_readline = yes ; then
+	   case $host_os in
+	   *bsd* )	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermcap" >&5
+$as_echo_n "checking for tgetent in -ltermcap... " >&6; }
+if ${ac_cv_lib_termcap_tgetent+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltermcap  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tgetent ();
+int
+main ()
+{
+return tgetent ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_termcap_tgetent=yes
+else
+  ac_cv_lib_termcap_tgetent=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tgetent" >&5
+$as_echo "$ac_cv_lib_termcap_tgetent" >&6; }
+if test "x$ac_cv_lib_termcap_tgetent" = xyes; then :
+  _combo="$_combo -ltermcap"
+fi
+
+	  	 ;;
+	   esac
+
+$as_echo "#define HAVE_LIBREADLINE 1" >>confdefs.h
+
+           LIBREADLINE=$_combo
+
+
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for history_list in -lreadline" >&5
+$as_echo_n "checking for history_list in -lreadline... " >&6; }
+if ${ac_cv_lib_readline_history_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lreadline $_combo $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char history_list ();
+int
+main ()
+{
+return history_list ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_readline_history_list=yes
+else
+  ac_cv_lib_readline_history_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_history_list" >&5
+$as_echo "$ac_cv_lib_readline_history_list" >&6; }
+if test "x$ac_cv_lib_readline_history_list" = xyes; then :
+
+$as_echo "#define HAVE_HISTORY_LIST 1" >>confdefs.h
+
+fi
+
+
+           break
+        fi
+     done
+
+     unset _termcap
+     unset _readline_save_libs
+     unset _combo
+     unset _found_readline
+  fi
+
+
+case `uname -m` in
+*'Power Macintosh'*)
+	: ;;
+*)
+	case $SKIP_MPFR in
+	no)
+
+# Check whether --with-mpfr was given.
+if test "${with_mpfr+set}" = set; then :
+  withval=$with_mpfr; _do_mpfr=$withval
+else
+  _do_mpfr=yes
+fi
+
+
+  if test "$_do_mpfr" != "no" ; then
+     if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+     fi
+
+        _mpfr_save_libs=$LIBS
+        _combo="-lmpfr -lgmp"
+        LIBS="$LIBS $_combo"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mpfr via \"$_combo\" is present and usable" >&5
+$as_echo_n "checking whether mpfr via \"$_combo\" is present and usable... " >&6; }
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#include <stdio.h>
+#include <mpfr.h>
+#include <gmp.h>
+
+int
+main ()
+{
+
+mpfr_t p;
+mpz_t z;
+mpfr_init(p);
+mpz_init(z);
+mpfr_printf("%Rf%Zd", p, z);
+mpfr_clear(p);
+mpz_clear(z);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  _found_mpfr=yes
+else
+  _found_mpfr=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_found_mpfr" >&5
+$as_echo "$_found_mpfr" >&6; }
+
+        LIBS=$_mpfr_save_libs
+
+        if test $_found_mpfr = yes ; then
+
+$as_echo "#define HAVE_MPFR 1" >>confdefs.h
+
+           LIBMPFR=$_combo
+
+           break
+        fi
+
+     unset _mpfr_save_libs
+     unset _combo
+     unset _found_mpfr
+  fi
+
+		;;
+	esac
+	;;
+esac
+
+ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default"
+if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BLKSIZE 1
+_ACEOF
+
+
+fi
+
+ac_fn_c_check_member "$LINENO" "struct passwd" "pw_passwd" "ac_cv_member_struct_passwd_pw_passwd" "
+#include <sys/types.h>
+#include <pwd.h>
+
+"
+if test "x$ac_cv_member_struct_passwd_pw_passwd" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_PASSWD_PW_PASSWD 1
+_ACEOF
+
+
+fi
+
+ac_fn_c_check_member "$LINENO" "struct group" "gr_passwd" "ac_cv_member_struct_group_gr_passwd" "
+#include <sys/types.h>
+#include <grp.h>
+
+"
+if test "x$ac_cv_member_struct_group_gr_passwd" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_GROUP_GR_PASSWD 1
+_ACEOF
+
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5
+$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; }
+if ${ac_cv_struct_tm+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <time.h>
+
+int
+main ()
+{
+struct tm tm;
+				     int *p = &tm.tm_sec;
+				     return !p;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_struct_tm=time.h
+else
+  ac_cv_struct_tm=sys/time.h
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5
+$as_echo "$ac_cv_struct_tm" >&6; }
+if test $ac_cv_struct_tm = sys/time.h; then
+
+$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_member "$LINENO" "struct tm" "tm_zone" "ac_cv_member_struct_tm_tm_zone" "#include <sys/types.h>
+#include <$ac_cv_struct_tm>
+
+"
+if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_TM_TM_ZONE 1
+_ACEOF
+
+
+fi
+
+if test "$ac_cv_member_struct_tm_tm_zone" = yes; then
+
+$as_echo "#define HAVE_TM_ZONE 1" >>confdefs.h
+
+else
+  ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include <time.h>
+"
+if test "x$ac_cv_have_decl_tzname" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_TZNAME $ac_have_decl
+_ACEOF
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5
+$as_echo_n "checking for tzname... " >&6; }
+if ${ac_cv_var_tzname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <time.h>
+#if !HAVE_DECL_TZNAME
+extern char *tzname[];
+#endif
+
+int
+main ()
+{
+return tzname[0][0];
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_var_tzname=yes
+else
+  ac_cv_var_tzname=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tzname" >&5
+$as_echo "$ac_cv_var_tzname" >&6; }
+  if test $ac_cv_var_tzname = yes; then
+
+$as_echo "#define HAVE_TZNAME 1" >>confdefs.h
+
+  fi
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5
+$as_echo_n "checking whether char is unsigned... " >&6; }
+if ${ac_cv_c_char_unsigned+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((char) -1) < 0)];
+test_array [0] = 0;
+return test_array [0];
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_char_unsigned=no
+else
+  ac_cv_c_char_unsigned=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_char_unsigned" >&5
+$as_echo "$ac_cv_c_char_unsigned" >&6; }
+if test $ac_cv_c_char_unsigned = yes && test "$GCC" != yes; then
+  $as_echo "#define __CHAR_UNSIGNED__ 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this sort of thing.  */
+  typedef int charset[2];
+  const charset cs = { 0, 0 };
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this sort of thing.  */
+    char tx;
+    char *t = &tx;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; } bx;
+    struct s *b = &bx; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_const=yes
+else
+  ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5
+$as_echo_n "checking for C/C++ restrict keyword... " >&6; }
+if ${ac_cv_c_restrict+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_restrict=no
+   # The order here caters to the fact that C++ does not require restrict.
+   for ac_kw in __restrict __restrict__ _Restrict restrict; do
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+typedef int * int_ptr;
+	int foo (int_ptr $ac_kw ip) {
+	return ip[0];
+       }
+int
+main ()
+{
+int s[1];
+	int * $ac_kw t = s;
+	t[0] = 0;
+	return foo(t)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_restrict=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+     test "$ac_cv_c_restrict" != no && break
+   done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5
+$as_echo "$ac_cv_c_restrict" >&6; }
+
+ case $ac_cv_c_restrict in
+   restrict) ;;
+   no) $as_echo "#define restrict /**/" >>confdefs.h
+ ;;
+   *)  cat >>confdefs.h <<_ACEOF
+#define restrict $ac_cv_c_restrict
+_ACEOF
+ ;;
+ esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for preprocessor stringizing operator" >&5
+$as_echo_n "checking for preprocessor stringizing operator... " >&6; }
+if ${ac_cv_c_stringize+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define x(y) #y
+
+char *s = x(teststring);
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "#teststring" >/dev/null 2>&1; then :
+  ac_cv_c_stringize=no
+else
+  ac_cv_c_stringize=yes
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stringize" >&5
+$as_echo "$ac_cv_c_stringize" >&6; }
+if test $ac_cv_c_stringize = yes; then
+
+$as_echo "#define HAVE_STRINGIZE 1" >>confdefs.h
+
+fi
+
+
+ac_config_headers="$ac_config_headers config.h:configh.in"
+
+
+
+case $acl_shlibext in
+dylib)	GAWKLIBEXT=so ;;	# MacOS uses .dylib for shared libraries, but libtool uses .so for modules
+*) GAWKLIBEXT=$acl_shlibext ;;
+esac
+
+
+ac_config_files="$ac_config_files Makefile support/Makefile awklib/Makefile doc/Makefile extras/Makefile po/Makefile.in test/Makefile"
+
+if test "$enable_extensions" = "yes"
+then
+
+
+subdirs="$subdirs extension"
+
+fi
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${TEST_CROSS_COMPILE_TRUE}" && test -z "${TEST_CROSS_COMPILE_FALSE}"; then
+  as_fn_error $? "conditional \"TEST_CROSS_COMPILE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${ENABLE_EXTENSIONS_TRUE}" && test -z "${ENABLE_EXTENSIONS_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_EXTENSIONS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by GNU Awk $as_me 5.0.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-gawk@gnu.org>.
+GNU Awk home page: <http://www.gnu.org/software/gawk/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+GNU Awk config.status 5.0.1
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+    # from automake < 1.5.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:configh.in" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "support/Makefile") CONFIG_FILES="$CONFIG_FILES support/Makefile" ;;
+    "awklib/Makefile") CONFIG_FILES="$CONFIG_FILES awklib/Makefile" ;;
+    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+    "extras/Makefile") CONFIG_FILES="$CONFIG_FILES extras/Makefile" ;;
+    "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+    "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  case $CONFIG_FILES in #(
+  *\'*) :
+    eval set x "$CONFIG_FILES" ;; #(
+  *) :
+    set x $CONFIG_FILES ;; #(
+  *) :
+     ;;
+esac
+  shift
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
+  do
+    # Strip MF so we end up with the name of the file.
+    am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$am_mf" : 'X\(//\)[^/]' \| \
+	 X"$am_mf" : 'X\(//\)$' \| \
+	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$am_mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$am_mf" : 'X\(//\)$' \| \
+	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$am_mf" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { echo "$as_me:$LINENO: cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles" >&5
+   (cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } || am_rc=$?
+  done
+  if test $am_rc -ne 0; then
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+  { am_dirpart=; unset am_dirpart;}
+  { am_filepart=; unset am_filepart;}
+  { am_mf=; unset am_mf;}
+  { am_rc=; unset am_rc;}
+  rm -f conftest-deps.mk
+}
+ ;;
+    "po-directories":C)
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        # Treat a directory as a PO directory if and only if it has a
+        # POTFILES.in file. This allows packages to have multiple PO
+        # directories under different names or in different locations.
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          gt_tab=`printf '\t'`
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          # Compute POFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+          # Compute UPDATEPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+          # Compute DUMMYPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+          # Compute GMOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          GMOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+  # Remove --cache-file, --srcdir, and --disable-option-checking arguments
+  # so they do not pile up.
+  ac_sub_configure_args=
+  ac_prev=
+  eval "set x $ac_configure_args"
+  shift
+  for ac_arg
+  do
+    if test -n "$ac_prev"; then
+      ac_prev=
+      continue
+    fi
+    case $ac_arg in
+    -cache-file | --cache-file | --cache-fil | --cache-fi \
+    | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+      ac_prev=cache_file ;;
+    -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+    | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \
+    | --c=*)
+      ;;
+    --config-cache | -C)
+      ;;
+    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+      ac_prev=srcdir ;;
+    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+      ;;
+    -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+      ac_prev=prefix ;;
+    -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+      ;;
+    --disable-option-checking)
+      ;;
+    *)
+      case $ac_arg in
+      *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+      esac
+      as_fn_append ac_sub_configure_args " '$ac_arg'" ;;
+    esac
+  done
+
+  # Always prepend --prefix to ensure using the same prefix
+  # in subdir configurations.
+  ac_arg="--prefix=$prefix"
+  case $ac_arg in
+  *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+  esac
+  ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args"
+
+  # Pass --silent
+  if test "$silent" = yes; then
+    ac_sub_configure_args="--silent $ac_sub_configure_args"
+  fi
+
+  # Always prepend --disable-option-checking to silence warnings, since
+  # different subdirs can have different --enable and --with options.
+  ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args"
+
+  ac_popdir=`pwd`
+  for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+    # Do not complain, so a configure script can configure whichever
+    # parts of a large source tree are present.
+    test -d "$srcdir/$ac_dir" || continue
+
+    ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)"
+    $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5
+    $as_echo "$ac_msg" >&6
+    as_dir="$ac_dir"; as_fn_mkdir_p
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+    cd "$ac_dir"
+
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      ac_sub_configure=$ac_srcdir/configure.gnu
+    elif test -f "$ac_srcdir/configure"; then
+      ac_sub_configure=$ac_srcdir/configure
+    elif test -f "$ac_srcdir/configure.in"; then
+      # This should be Cygnus configure.
+      ac_sub_configure=$ac_aux_dir/configure
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5
+$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+      ac_sub_configure=
+    fi
+
+    # The recursion is here.
+    if test -n "$ac_sub_configure"; then
+      # Make the cache file name correct relative to the subdirectory.
+      case $cache_file in
+      [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+      *) # Relative name.
+	ac_sub_cache_file=$ac_top_build_prefix$cache_file ;;
+      esac
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+      # The eval makes quoting arguments work.
+      eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \
+	   --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" ||
+	as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5
+    fi
+
+    cd "$ac_popdir"
+  done
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+if test "$GCC" = yes &&
+   test -f $srcdir/.developing &&
+   grep -i debug $srcdir/.developing > /dev/null
+then
+	for i in . support extension
+	do
+		sed '/-O2/s///' $i/Makefile > foo
+		mv foo $i/Makefile
+	done
+fi
diff --git a/gawk-5.0.1/configure.ac b/gawk-5.0.1/configure.ac
new file mode 100644
index 00000000000..728fd615eca
--- /dev/null
+++ b/gawk-5.0.1/configure.ac
@@ -0,0 +1,486 @@
+dnl
+dnl configure.ac --- autoconf input file for gawk
+dnl
+dnl Copyright (C) 1995-2019 the Free Software Foundation, Inc.
+dnl
+dnl This file is part of GAWK, the GNU implementation of the
+dnl AWK Programming Language.
+dnl
+dnl GAWK is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl GAWK is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+dnl
+
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT([GNU Awk],[5.0.1],[bug-gawk@gnu.org],[gawk])
+
+# This is a hack. Different versions of install on different systems
+# are just too different. Chuck it and use install-sh.
+#
+# If the user supplies $INSTALL, figure they know what they're doing.
+#
+# With Autoconf 2.5x, this needs to come very early on, but *after*
+# the INIT macro. Sigh.
+
+if test "$INSTALL" = ""
+then
+	INSTALL="$srcdir/install-sh -c"
+	export INSTALL
+fi
+
+AC_PREREQ([2.69])
+AM_INIT_AUTOMAKE([1.15 dist-xz dist-lzip])
+
+AC_CONFIG_MACRO_DIR([m4])
+
+AC_ARG_ENABLE([lint],
+	[AS_HELP_STRING([--disable-lint],[do not compile in gawk lint checking])],
+	if test "$enableval" = no
+	then
+		AC_DEFINE(NO_LINT, 1, [disable lint checks])
+	fi
+)
+AC_ARG_ENABLE([builtin-intdiv0],
+	[AS_HELP_STRING([--enable-builtin-intdiv0],[enable built-in intdiv0 function])],
+	if test "$enableval" = yes
+	then
+		AC_DEFINE(SUPPLY_INTDIV, 1, [enable built-in intdiv0 function])
+		sed '/^@set PATCHLEVEL/a\
+@set INTDIV' < "$srcdir"/doc/gawktexi.in > foo
+		cp foo "$srcdir"/doc/gawktexi.in
+		rm foo
+	fi
+)
+
+SKIP_MPFR=no
+AC_ARG_ENABLE([mpfr],
+	[AS_HELP_STRING([--disable-mpfr],[do not check for MPFR])],
+	if test "$enableval" = no
+	then
+		SKIP_MPFR=yes
+	fi
+)
+
+EXTENSIONDIR=
+AC_ARG_ENABLE([versioned-extension-dir],
+	[AS_HELP_STRING([--enable-versioned-extension-dir], [use a versioned directory for extensions])],
+	if test "$enableval" = yes
+	then
+		MAJOR=`awk '/define gawk_api_major_version/ { print $3 }' < $srcdir/gawkapi.h`
+		MINOR=`awk '/define gawk_api_minor_version/ { print $3 }' < $srcdir/gawkapi.h`
+
+		# note leading slash on the value
+		export EXTENSIONDIR=/ext-$MAJOR.$MINOR
+	fi
+)
+
+# set default shared library location
+AC_SUBST([pkgextensiondir], ['${pkglibdir}'${EXTENSIONDIR}])
+
+AC_CANONICAL_HOST
+AC_USE_SYSTEM_EXTENSIONS
+
+dnl checks for programs
+AC_PROG_EGREP
+AC_PROG_YACC
+AC_PROG_LN_S
+AC_PROG_CC_C99
+AC_PROG_CPP
+AC_PROG_RANLIB
+
+AC_OBJEXT
+AC_EXEEXT
+
+AC_PROG_INSTALL
+AC_PROG_MAKE_SET
+
+# This is mainly for my use during testing and development.
+# Yes, it's a bit of a hack.
+AC_MSG_CHECKING([for special development options])
+if test -f $srcdir/.developing
+then
+	# add other debug flags as appropriate, save GAWKDEBUG for emergencies
+	CFLAGS="$CFLAGS -DARRAYDEBUG -DYYDEBUG -DLOCALEDEBUG"
+
+	# turn on compiler warnings if we're doing development
+	# enable debugging using macros also
+	if test "$GCC" = yes
+	then
+		CFLAGS="$CFLAGS -Wall -fno-builtin -g3 -ggdb3"
+	fi
+	AC_MSG_RESULT([yes])
+else
+	AC_MSG_RESULT([no])
+	CFLAGS="$CFLAGS -DNDEBUG"	# turn off assertions
+fi
+
+AC_SUBST(CFLAGS)
+
+# shared library suffix for dynamic loading:
+AC_SUBST(acl_shlibext)
+
+dnl checks for systems
+AC_ZOS_USS
+AC_SEARCH_LIBS([strerror],[cposix])
+AC_SYS_LARGEFILE
+
+AC_MSG_CHECKING([if we are using EBCDIC])
+AC_EGREP_CPP([gnu_gawk_in_ebcdic],
+[#if 'a' == 0x81
+gnu_gawk_in_ebcdic
+#endif],
+[AC_DEFINE(USE_EBCDIC, 1, Define to 1 if the character set is EBCDIC)
+ use_ebcdic=yes],
+[use_ebcdic=no])
+AC_MSG_RESULT([$use_ebcdic])
+if test "$use_ebcdic" = yes
+then
+	ZOS_FAIL='; echo Expect $@ to fail on z/OS.'
+fi
+AC_SUBST(ZOS_FAIL)
+
+dnl Set the programming language for checks. Fortunately,
+dnl this only needs to be set once, since everything is in C.
+AC_LANG([C])
+
+dnl initialize GNU gettext
+AM_GNU_GETTEXT([external])
+AM_GNU_GETTEXT_VERSION([0.19.8])
+AM_LANGINFO_CODESET
+gt_LC_MESSAGES
+
+dnl checks for header files
+AC_CHECK_HEADERS(arpa/inet.h fcntl.h locale.h libintl.h mcheck.h \
+	netdb.h netinet/in.h stddef.h string.h \
+	sys/ioctl.h sys/param.h sys/select.h sys/socket.h sys/time.h unistd.h \
+	termios.h stropts.h wchar.h wctype.h)
+AC_HEADER_STDC
+AC_HEADER_STDBOOL
+AC_HEADER_SYS_WAIT
+AC_HEADER_TIME
+
+if test "$ac_cv_header_string_h" = yes
+then
+	AC_CHECK_HEADERS(memory.h)
+else
+	AC_CHECK_HEADERS(strings.h)
+fi
+
+dnl Check cross compiling
+AM_CONDITIONAL([TEST_CROSS_COMPILE], [test "$build_alias" != "$host_alias"])
+
+dnl checks for typedefs
+AC_TYPE_PID_T
+AC_TYPE_SIZE_T
+AC_TYPE_GETGROUPS
+AC_TYPE_LONG_LONG_INT
+AC_TYPE_UNSIGNED_LONG_LONG_INT
+AC_TYPE_INTMAX_T
+AC_TYPE_UINTMAX_T
+AC_CHECK_TYPE(ssize_t, int)
+AC_CHECK_SIZEOF(unsigned int)
+AC_CHECK_SIZEOF(unsigned long)
+dnl see if time_t is defined in <sys/types.h>
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>]], [[
+	time_t foo;
+	foo = 0;
+]])],[AC_DEFINE(TIME_T_IN_SYS_TYPES_H, 1,
+		  some systems define this type here)],[])
+dnl check for wctype_t in <wctype.h>
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <wctype.h>]], [[
+	wctype_t foo;
+	foo = 0;
+]])],[AC_DEFINE(HAVE_WCTYPE_T, 1, systems should define this type here)],[])
+dnl check for wint_t in <wctype.h>
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <wctype.h>]], [[
+	wint_t foo;
+	foo = 0;
+]])],[AC_DEFINE(HAVE_WINT_T, 1, systems should define this type here)],[])
+dnl check for sockaddr_storage
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#include <sys/socket.h>]], [[
+	struct sockaddr_storage foo;
+]])],[AC_DEFINE(HAVE_SOCKADDR_STORAGE, 1, newer systems define this type here)],[])
+
+dnl Borrwed from rsync, thanks to to Jim Meyering.
+
+dnl Check for socklen_t: historically on BSD it is an int, and in
+dnl POSIX 1g it is a type of its own, but some platforms use different
+dnl types for the argument to getsockopt, getpeername, etc.  So we
+dnl have to test to find something that will work.
+
+dnl This is no good, because passing the wrong pointer on C compilers is
+dnl likely to only generate a warning, not an error.
+
+AC_DEFUN([TYPE_SOCKLEN_T],
+[
+   AC_CHECK_TYPE([socklen_t], ,[
+      AC_MSG_CHECKING([for socklen_t equivalent])
+      AC_CACHE_VAL([rsync_cv_socklen_t_equiv],
+      [
+         # Systems have either "struct sockaddr *" or
+         # "void *" as the second argument to getpeername
+         rsync_cv_socklen_t_equiv=
+         for arg2 in "struct sockaddr" void
+	 do
+            for t in int size_t unsigned long "unsigned long"
+	    do
+               AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+#include <sys/socket.h>
+
+                  int getpeername (int, $arg2 *, $t *);
+               ]], [[
+                  $t len;
+                  getpeername(0,0,&len);
+               ]])],[
+                  rsync_cv_socklen_t_equiv="$t"
+                  break
+               ],[])
+            done
+         done
+
+         if test "$rsync_cv_socklen_t_equiv" = ""
+	 then
+dnl		Some systems get this. Default to int.  -- ADR
+dnl            AC_MSG_ERROR([Cannot find a type to use in place of socklen_t])
+		rsync_cv_socklen_t_equiv=int
+         fi
+      ])
+      AC_MSG_RESULT($rsync_cv_socklen_t_equiv)
+      AC_DEFINE_UNQUOTED(socklen_t, $rsync_cv_socklen_t_equiv,
+			[type to use in place of socklen_t if not defined])],
+      [#include <sys/types.h>
+#include <sys/socket.h>])
+])
+TYPE_SOCKLEN_T
+
+dnl Check for C11 _Noreturn
+GAWK_AC_NORETURN
+
+dnl checks for functions
+AC_FUNC_MKTIME
+case "$ac_cv_func_working_mktime" in
+yes)	AC_DEFINE(HAVE_MKTIME, 1, [we have the mktime function])
+	;;
+esac
+
+AC_CHECK_FUNC(getaddrinfo, [AC_DEFINE(HAVE_GETADDRINFO, 1, [have getaddrinfo])],
+	      [AC_CHECK_LIB(socket, getaddrinfo,
+			    [AC_DEFINE(HAVE_GETADDRINFO, 1,
+				       [have getaddrinfo])])])
+
+AC_SEARCH_LIBS(fmod, m)
+AC_SEARCH_LIBS(isinf, m)
+AC_SEARCH_LIBS(ismod, m)
+dnl Don't look for libsigsegv on OSF/1, gives us severe headaches
+case $host_os in
+osf1)	: ;;
+*)
+	gl_LIBSIGSEGV
+	;;
+esac
+
+# Need the check for mkstemp and tmpfile for missing_d/snprintf.c.
+AC_CHECK_FUNCS(__etoa_l atexit btowc fmod gai_strerror \
+	getgrent getgroups grantpt \
+	fwrite_unlocked \
+	isascii iswctype iswlower iswupper mbrlen \
+	memcmp memcpy memcpy_ulong memmove memset \
+	memset_ulong mkstemp posix_openpt setenv setlocale setsid sigprocmask \
+	snprintf strchr \
+	strerror strftime strcasecmp strncasecmp strcoll strtod strtoul \
+	system timegm tmpfile towlower towupper tzset usleep waitpid wcrtomb \
+	wcscoll wctype)
+dnl this check is for both mbrtowc and the mbstate_t type, which is good
+AC_FUNC_MBRTOWC
+
+dnl check for dynamic linking
+dnl This is known to be very primitive
+AC_ARG_ENABLE([extensions],
+	[AS_HELP_STRING([--disable-extensions], [disable dynamic extensions (default is detect)])])
+if test "$enable_extensions" != "no"
+then
+	extensions_supported=no
+
+	dnl On MirBSD (and probably other systems), don't even try.
+	case $host_os in
+	mirbsd* | openedition*)	# OS/390 z/OS POSIX layer
+		;;
+	*)
+	AC_CHECK_HEADER(dlfcn.h,
+		[
+		# Check this separately. Some systems have dlopen
+		# in libc. Notably freebsd and cygwin.
+		# HP-NSK has it in zrldsrl
+		AC_SEARCH_LIBS(dlopen, dl zrldsrl, gawk_have_dlopen=yes, gawk_have_dlopen=no)
+		# Only do DYNAMIC if we have the lib. z/OS (some versions) have
+		# the header but not the lib, apparently
+		if test "$gawk_have_dlopen" = yes
+		then
+			extensions_supported=yes
+			AC_DEFINE([DYNAMIC], 1, [dynamic loading is possible])
+		fi
+	])
+		;;
+	esac
+
+	if test "$enable_extensions$extensions_supported" = "yesno"
+	then
+		AC_MSG_ERROR([extension support requested, but unavailable])
+	fi
+	enable_extensions=$extensions_supported
+fi
+AM_CONDITIONAL([ENABLE_EXTENSIONS], [test "$enable_extensions" = "yes"])
+
+dnl check for how to use getpgrp
+dnl have to hardwire it for VMS POSIX. Sigh.
+dnl ditto for BeOS, OS/2, and MS-DOS.
+case $host_os in
+vms*|beos*|os2*|msdos)
+	AC_DEFINE(GETPGRP_VOID, 1,
+	  [Define to 1 if the getpgrp function requires zero arguments.])
+	;;
+*)	AC_FUNC_GETPGRP
+	;;
+esac
+
+dnl check for printf %F format
+AC_MSG_CHECKING([for printf %F format])
+AC_RUN_IFELSE([
+AC_LANG_SOURCE([
+#include <stdio.h>
+
+int main()
+{
+	char buf[[100]];
+
+	sprintf(buf, "%F", 123.45);
+
+	if (strcmp(buf, "123.450000") == 0)
+		return 0;
+	else
+		return 1;
+}
+])],
+	has_f_format=yes,
+	has_f_format=no,
+	has_f_format=no  dnl Cross-compiling, assuming the worst.
+)
+if test "$has_f_format" = yes
+then
+	AC_DEFINE(PRINTF_HAS_F_FORMAT, 1, [Define to 1 if *printf supports %F format])
+fi
+AC_MSG_RESULT($has_f_format)
+
+dnl check for printf %a format
+AC_MSG_CHECKING([for printf %a format])
+AC_RUN_IFELSE([
+AC_LANG_SOURCE([
+#include <stdio.h>
+
+int main()
+{
+	char buf[[100]];
+
+	sprintf(buf, "%a", 8.0);
+
+	if (strncmp(buf, "0x", 2) == 0)
+		return 0;
+	else
+		return 1;
+}
+])],
+	has_a_format=yes,
+	has_a_format=no,
+	has_a_format=no  dnl Cross-compiling, assuming the worst.
+)
+if test "$has_a_format" = yes
+then
+	AC_DEFINE(PRINTF_HAS_A_FORMAT, 1, [Define to 1 if *printf supports %a format])
+fi
+AC_MSG_RESULT($has_a_format)
+
+dnl check for sockets
+GAWK_AC_LIB_SOCKETS
+
+dnl check for readline support
+GAWK_CHECK_READLINE
+
+dnl check for mpfr support
+case `uname -m` in
+*'Power Macintosh'*)
+	: ;;
+*)
+	case $SKIP_MPFR in
+	no)	GNUPG_CHECK_MPFR
+		;;
+	esac
+	;;
+esac
+
+dnl checks for structure members
+AC_CHECK_MEMBERS([struct stat.st_blksize])
+AC_CHECK_MEMBERS([struct passwd.pw_passwd],,,[
+#include <sys/types.h>
+#include <pwd.h>
+])
+AC_CHECK_MEMBERS([struct group.gr_passwd],,,[
+#include <sys/types.h>
+#include <grp.h>
+])
+AC_STRUCT_TM
+AC_STRUCT_TIMEZONE
+
+dnl checks for compiler characteristics
+AC_C_CHAR_UNSIGNED
+AC_C_CONST
+AC_C_RESTRICT
+AC_C_INLINE
+AC_C_STRINGIZE
+
+AC_CONFIG_HEADERS([config.h:configh.in])
+AH_BOTTOM([#include "custom.h"])
+
+dnl Crude but small hack to make plug-ins work on Mac OS X
+dnl We should really use the libtool value for shrext_cmds, but that
+dnl is not available here, since we do not use libtool at the top level.
+case $acl_shlibext in
+dylib)	GAWKLIBEXT=so ;;	# MacOS uses .dylib for shared libraries, but libtool uses .so for modules
+*) GAWKLIBEXT=$acl_shlibext ;;
+esac
+AC_SUBST(GAWKLIBEXT)
+
+AC_CONFIG_FILES(Makefile
+	support/Makefile
+	awklib/Makefile
+	doc/Makefile
+	extras/Makefile
+	po/Makefile.in
+	test/Makefile)
+if test "$enable_extensions" = "yes"
+then
+	AC_CONFIG_SUBDIRS(extension)
+fi
+AC_OUTPUT
+if test "$GCC" = yes &&
+   test -f $srcdir/.developing &&
+   grep -i debug $srcdir/.developing > /dev/null
+then
+	for i in . support extension
+	do
+		sed '/-O2/s///' $i/Makefile > foo
+		mv foo $i/Makefile
+	done
+fi
diff --git a/gawk-5.0.1/custom.h b/gawk-5.0.1/custom.h
new file mode 100644
index 00000000000..7dfc140f97e
--- /dev/null
+++ b/gawk-5.0.1/custom.h
@@ -0,0 +1,82 @@
+/*
+ * custom.h
+ *
+ * This file is for use on systems where Autoconf isn't quite able to
+ * get things right. It is appended to the bottom of config.h by configure,
+ * in order to override definitions from Autoconf that are erroneous. See
+ * the manual for more information.
+ *
+ * If you make additions to this file for your system, please send me
+ * the information, to arnold@skeeve.com.
+ */
+
+/*
+ * Copyright (C) 1995-2004, 2008, 2009, 2011, 2016, 2018
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/* for VMS POSIX, from Pat Rankin, r.pat.rankin@gmail.com */
+#ifdef VMS_POSIX
+#undef VMS
+#include "vms/redirect.h"
+#endif
+
+/* OpenVMS has some definitions in fp.h that should be in math.h */
+/* From John Malmberg, wb8tyw@qsl.net */
+#ifdef __VMS
+#include <fp.h>
+/* isnan () macro is broken */
+#undef isnan
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+#ifndef SIZE_MAX
+#define SIZE_MAX __INT32_MAX
+#endif
+#endif
+
+/* For QNX, based on submission from Michael Hunter, mphunter@qnx.com */
+#ifdef __QNX__
+#define GETPGRP_VOID	1
+#endif
+
+/* For MacOS X, which is almost BSD Unix */
+#ifdef __APPLE__
+#define HAVE_MKTIME	1
+#endif
+
+/* For HP/UX with gcc */
+#if defined(hpux) || defined(_HPUX_SOURCE)
+#undef HAVE_TZSET
+#define HAVE_TZSET 1
+#define _TZSET 1
+#endif
+
+#if defined(_AIX)
+#define _XOPEN_SOURCE_EXTENDED 1
+#endif
+
+/* Junk for dfa.[ch] */
+/* The __pure__ attribute was added in gcc 2.96.  */
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+#else
+# define _GL_ATTRIBUTE_PURE /* empty */
+#endif
diff --git a/gawk-5.0.1/debug.c b/gawk-5.0.1/debug.c
new file mode 100644
index 00000000000..1987428474a
--- /dev/null
+++ b/gawk-5.0.1/debug.c
@@ -0,0 +1,5922 @@
+/*
+ * debug.c - gawk debugger
+ */
+
+/*
+ * Copyright (C) 2004, 2010-2013, 2016-2019 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+#include "cmd.h"
+
+#ifndef O_RDONLY
+#include <fcntl.h>	/* open() */
+#endif
+
+#ifdef __MINGW32__
+#define execvp(p,a) w32_execvp(p,a)
+int w32_execvp(const char *, char **);
+#endif
+
+extern bool exiting;
+extern SRCFILE *srcfiles;
+extern INSTRUCTION *rule_list;
+extern INSTRUCTION *code_block;
+extern NODE **fcall_list;
+extern long fcall_count;
+extern FILE *output_fp;
+extern IOBUF *curfile;
+extern const char *command_file;
+extern const char *get_spec_varname(Func_ptr fptr);
+extern int zzparse(void);
+#define read_command()		(void) zzparse()
+
+extern const char *redir2str(int redirtype);
+
+static char *linebuf = NULL;	/* used to print a single line of source */
+static size_t linebuf_len;
+
+FILE *out_fp;
+char *dbg_prompt;
+char *commands_prompt = "> ";	/* breakpoint or watchpoint commands list */
+char *eval_prompt = "@> ";	/* awk statement(s) */
+
+bool input_from_tty = false;
+int input_fd;
+
+static SRCFILE *cur_srcfile;
+static long cur_frame = 0;
+static INSTRUCTION *cur_pc;
+int cur_rule = 0;
+
+static bool prog_running = false;
+
+struct condition {
+	INSTRUCTION *code;
+	AWK_CONTEXT *ctxt;
+	char *expr;
+};
+
+struct commands_item {
+	struct commands_item *next;
+	struct commands_item *prev;
+	int cmd;
+	char *cmd_string;
+	CMDARG *arg;
+};
+
+/* breakpoint structure */
+typedef struct break_point {
+	struct break_point *next;
+	struct break_point *prev;
+	int number;
+
+	long ignore_count;
+	long hit_count;
+	char *src;
+	INSTRUCTION *bpi;	/* Op_breakpoint */
+
+	struct commands_item commands;  /* list of commands to run */
+	bool silent;
+
+	struct condition cndn;
+
+	short flags;
+#define BP_ENABLE       1
+#define BP_ENABLE_ONCE  2		/* enable once */
+#define BP_TEMP         4
+#define BP_IGNORE       8
+
+} BREAKPOINT;
+
+static BREAKPOINT breakpoints = { &breakpoints, &breakpoints, 0 };
+
+#ifdef HAVE_LIBREADLINE
+/* do_save -- save command */
+static int sess_history_base = 0;
+#endif
+
+#ifndef HAVE_HISTORY_LIST
+#define HIST_ENTRY void
+#define history_list()	NULL
+#endif
+
+
+/* 'list' command */
+static int last_printed_line = 0;
+static int last_print_count;	/* # of lines printed */
+
+/* watch or display item */
+struct list_item {
+	struct list_item *next;
+	struct list_item *prev;
+	int number;     /* item number */
+
+	NODE *symbol;   /* variable or function param */
+	NODE **subs;    /* subscripts */
+	int num_subs;	/* subscript(dimension) count */
+	char *sname;	/* symbol or param name */
+
+	long fcall_count;
+
+	struct commands_item commands;
+	int silent;
+	struct condition cndn;
+
+	/* This is for the value of the watched item */
+	union {
+		NODE *n;
+		long l;
+	} value[2];
+#define cur_value value[0].n
+#define cur_size  value[0].l
+#define old_value value[1].n
+#define old_size  value[1].l
+
+	int flags;
+#define PARAM           1
+#define SUBSCRIPT       2
+#define FIELD_NUM       4
+#define OLD_IS_ARRAY    8    /* old item is array */
+#define CUR_IS_ARRAY    16   /* current item is array */
+};
+
+#define IS_PARAM(d)	(((d)->flags & PARAM) != 0)
+#define IS_SUBSCRIPT(d)	(((d)->flags & SUBSCRIPT) != 0)
+#define IS_FIELD(d)	(((d)->flags & FIELD_NUM) != 0)
+#define WATCHING_ARRAY(d)	(((d)->flags & CUR_IS_ARRAY) != 0)
+
+static struct list_item display_list = { &display_list, &display_list, 0 };
+static struct list_item watch_list = { &watch_list, &watch_list, 0 };
+
+
+/* Structure to maintain data for processing debugger commands */
+
+static struct {
+	long fcall_count;    /* 'finish', 'until', 'next', 'step', 'nexti' commands */
+	int sourceline;      /* source line number last
+	                      * time we stopped execution,
+	                      * used by next, until and step commands
+	                      */
+	char *source;        /* next, until and step */
+
+	INSTRUCTION *pc;     /* 'until' and 'return' commands */
+	int repeat_count;    /* 'step', 'next', 'stepi', 'nexti' commands */
+	bool print_frame;    /* print frame info,  'finish' and 'until' */
+	bool print_ret;      /* print returned value, 'finish' */
+	int break_point;     /* non-zero (breakpoint number) if stopped at break point */
+	int watch_point;     /* non-zero (watchpoint number) if stopped at watch point */
+
+	int (*check_func)(INSTRUCTION **);      /* function to decide when to suspend
+	                                         * awk interpreter and return control
+	                                         * to debugger command interpreter.
+	                                         */
+
+	enum argtype command;		 /* command type */
+} stop;
+
+
+/* restart related stuff */
+extern char **d_argv;	/* copy of argv array */
+static bool need_restart = false;
+enum { BREAK=1, WATCH, DISPLAY, HISTORY, OPTION };
+static const char *const env_variable[] = {
+"",
+"DGAWK_BREAK",
+"DGAWK_WATCH",
+"DGAWK_DISPLAY",
+"DGAWK_HISTORY",
+"DGAWK_OPTION",
+};
+static void serialize_list(int type);
+static void unserialize_list(int type);
+static const char *commands_string = NULL;
+static int commands_string_len = 0;
+static char line_sep;
+#define FSEP	(char)'\037'
+#define RSEP	(char)'\036'
+#define CSEP	(char)'\035'
+
+
+/* debugger option */
+struct dbg_option {
+	const char *name;
+	int *num_val;
+	char **str_val;
+	void (*assign)(const char *);
+	const char *help_txt;
+};
+
+#define DEFAULT_HISTFILE	"./.gawk_history"
+#define DEFAULT_OPTFILE		"./.gawkrc"
+#define DEFAULT_PROMPT		"gawk> "
+#define DEFAULT_LISTSIZE	15
+#define DEFAULT_HISTSIZE	100
+
+static void set_gawk_output(const char *file);
+static void set_prompt(const char *value);
+static void set_listsize(const char *value);
+static void set_trace(const char *value);
+static void set_save_history(const char *value);
+static void set_save_options(const char *value);
+static void set_history_size(const char *value);
+static const char *options_file = DEFAULT_OPTFILE;
+#ifdef HAVE_LIBREADLINE
+static const char *history_file = DEFAULT_HISTFILE;
+#endif
+
+/* debugger option related variables */
+
+static char *output_file = "/dev/stdout";  /* gawk output redirection */
+char *dgawk_prompt = NULL;                 /* initialized in interpret */
+static int list_size = DEFAULT_LISTSIZE;   /* # of lines that 'list' prints */
+static int do_trace = false;
+static int do_save_history = true;
+static int do_save_options = true;
+static int history_size = DEFAULT_HISTSIZE;  /* max # of lines in history file */
+
+static const struct dbg_option option_list[] = {
+{"history_size", &history_size, NULL, &set_history_size,
+	gettext_noop("set or show the number of lines to keep in history file.") },
+{"listsize", &list_size, NULL, &set_listsize,
+	gettext_noop("set or show the list command window size.") },
+{"outfile", NULL, &output_file, &set_gawk_output,
+	gettext_noop("set or show gawk output file.") },
+{"prompt", NULL, &dgawk_prompt, &set_prompt,
+	gettext_noop("set or show debugger prompt."), },
+{"save_history", &do_save_history, NULL, &set_save_history,
+	gettext_noop("(un)set or show saving of command history (value=on|off).") },
+{"save_options", &do_save_options, NULL, &set_save_options,
+	gettext_noop("(un)set or show saving of options (value=on|off).") },
+{"trace", &do_trace, NULL, &set_trace,
+	gettext_noop("(un)set or show instruction tracing (value=on|off).") },
+{0, NULL, NULL, NULL, 0},
+};
+
+static void save_options(const char *file);
+
+
+/* pager */
+jmp_buf pager_quit_tag;
+int pager_quit_tag_valid = 0;
+static int screen_width = INT_MAX;	/* no of columns */
+static int screen_height = INT_MAX;	/* no of rows */
+static int pager_lines_printed = 0;	/* no of lines printed so far */
+
+static void restart(bool run) ATTRIBUTE_NORETURN;
+static void close_all(void);
+static int open_readfd(const char *file);
+static int find_lines(SRCFILE *s);
+static SRCFILE *source_find(char *src);
+static int print_lines(char *src, int start_line, int nlines);
+static void print_symbol(NODE *r, bool isparam);
+static NODE *find_frame(long num);
+static NODE *find_param(const char *name, long num, char **pname);
+static NODE *find_symbol(const char *name, char **pname);
+static NODE *find_array(const char *name);
+static void print_field(long field_num);
+static int print_function(INSTRUCTION *pc, void *);
+static void print_frame(NODE *func, char *src, int srcline);
+static void print_numbered_frame(long num);
+static void print_cur_frame_and_sourceline(void);
+static INSTRUCTION *find_rule(char *src, long lineno);
+static INSTRUCTION *mk_breakpoint(char *src, int srcline);
+static int execute_commands(struct commands_item *commands);
+static void delete_commands_item(struct commands_item *c);
+static NODE *execute_code(volatile INSTRUCTION *code);
+static int pre_execute_code(INSTRUCTION **pi);
+static int parse_condition(int type, int num, char *expr);
+static BREAKPOINT *add_breakpoint(INSTRUCTION *prevp, INSTRUCTION *ip, char *src, bool silent);
+static BREAKPOINT *set_breakpoint_next(INSTRUCTION *rp, INSTRUCTION *ip);
+static BREAKPOINT *set_breakpoint_at(INSTRUCTION *rp, int lineno, bool silent);
+static void delete_breakpoint(BREAKPOINT *b);
+static BREAKPOINT *find_breakpoint(long num);
+static void display(struct list_item *d);
+static struct list_item *find_item(struct list_item *list, long num);
+static struct list_item *add_item(struct list_item *list, int type, NODE *symbol, char *pname);
+static void delete_item(struct list_item *d);
+static int breakpoint_triggered(BREAKPOINT *b);
+static int watchpoint_triggered(struct list_item *w);
+static void print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump);
+static void print_ns_list(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump);
+static int print_code(INSTRUCTION *pc, void *x);
+static void next_command();
+static void debug_post_execute(INSTRUCTION *pc);
+static int debug_pre_execute(INSTRUCTION **pi);
+static char *g_readline(const char *prompt);
+static int prompt_yes_no(const char *, char , int , FILE *);
+static struct pf_data {
+	Func_print print_func;
+	bool defn;
+	FILE *fp;
+} pf_data;
+
+char * (*read_a_line)(const char *) = 0;	/* reads a line of input */
+
+struct command_source
+{
+	int fd;
+	int is_tty;
+	char * (*read_func)(const char *);
+	int (*close_func)(int);
+	int eof_status;		/* see push_cmd_src */
+	int cmd;		/* D_source or 0 */
+	char *str;		/* sourced file */
+	struct command_source *next;
+};
+
+static struct command_source *cmd_src = NULL;
+
+#define PUSH_BINDING(stack, tag, val)	\
+if (val++) \
+	memcpy((char *) (stack), (const char *) tag, sizeof(jmp_buf))
+#define POP_BINDING(stack, tag, val)	\
+if (--val) \
+	memcpy((char *) tag, (const char *) (stack), sizeof(jmp_buf))
+
+
+#define CHECK_PROG_RUNNING() \
+	do { \
+		if (! prog_running) { \
+			d_error(_("program not running.")); \
+			return false; \
+		} \
+	} while (false)
+
+
+/* g_readline --  read a line of text; the interface is like 'readline' but
+ *		without	any command-line editing; used when not compiled with
+ *		readline support and/or input is not from terminal (prompt set to NULL).
+ */
+
+static char *
+g_readline(const char *prompt)
+{
+	char *line;
+	size_t line_size = 100;
+	static char buf[2];
+	char *p, *end;
+	int n;
+
+	if (input_from_tty && prompt && *prompt)
+		fprintf(out_fp, "%s", prompt);
+
+	emalloc(line, char *, line_size + 1, "g_readline");
+	p = line;
+	end = line + line_size;
+	while ((n = read(input_fd, buf, 1)) > 0) {
+		if (buf[0] == '\n') {
+			if (p > line && p[-1] == '\r')
+				p--;
+			break;
+		}
+		if (p == end) {
+			erealloc(line, char *, 2 * line_size + 1, "g_readline");
+			p = line + line_size;
+			line_size *= 2;
+			end = line + line_size;
+		}
+		*p++ = buf[0];
+	}
+	if (n == -1 || (n == 0 && p == line)) {
+		efree(line);
+		return NULL;
+	}
+	*p = '\0';
+	return line;
+}
+
+
+/* d_error --- print an error message */
+
+void
+d_error(const char *mesg, ...)
+{
+	va_list args;
+	va_start(args, mesg);
+	fprintf(out_fp, _("error: "));
+	vfprintf(out_fp, mesg, args);
+	fprintf(out_fp, "\n");
+	va_end(args);
+}
+
+/* find_lines --- find the positions of the lines in the source file. */
+
+static int
+find_lines(SRCFILE *s)
+{
+	char *buf, *p, *end;
+	int n;
+	int ofs = 0;
+	int *pos;
+	int pos_size;
+	int maxlen = 0;
+	int numlines = 0;
+	char lastchar = '\0';
+
+	emalloc(buf, char *, s->bufsize, "find_lines");
+	pos_size = s->srclines;
+	emalloc(s->line_offset, int *, (pos_size + 2) * sizeof(int), "find_lines");
+	pos = s->line_offset;
+	pos[0] = 0;
+
+	while ((n = read(s->fd, buf, s->bufsize)) > 0) {
+		end = buf + n;
+		lastchar = buf[n - 1];
+		p = buf;
+		while (p < end) {
+			if (*p++ == '\n') {
+				if (++numlines > pos_size) {
+					erealloc(s->line_offset, int *, (2 * pos_size + 2) * sizeof(int), "find_lines");
+					pos = s->line_offset + pos_size;
+					pos_size *= 2;
+				}
+				*++pos = ofs + (p - buf);
+				if ((pos[0] - pos[-1]) > maxlen)
+					maxlen = pos[0] - pos[-1];	/* length including NEWLINE */
+			}
+		}
+		ofs += n;
+	}
+	efree(buf);
+
+	if (n == -1) {
+		d_error(_("can't read source file `%s' (%s)"),
+					s->src, strerror(errno));
+		return -1;
+	}
+	if (ofs <= 0) {
+		fprintf(out_fp, _("source file `%s' is empty.\n"), s->src);
+		return -1;
+	}
+
+	if (lastchar != '\n') {
+		/* fake a NEWLINE at end */
+		*++pos = ofs + 1;
+		numlines++;
+		if ((pos[0] - pos[-1]) > maxlen)
+			maxlen = pos[0] - pos[-1];
+	}
+	s->maxlen = maxlen;
+	s->srclines = numlines;
+	return 0;
+}
+
+/* source_find --- return the SRCFILE struct for the source 'src' */
+
+static SRCFILE *
+source_find(char *src)
+{
+	SRCFILE *s;
+	struct stat sbuf;
+	char *path;
+	int errno_val = 0;
+
+	if (src == NULL || *src == '\0') {
+		d_error(_("no current source file."));
+		return NULL;
+	}
+
+	if (cur_srcfile->src == src)  /* strcmp(cur_srcfile->src, src) == 0 */
+		return cur_srcfile;
+
+	for (s = srcfiles->next; s != srcfiles; s = s->next) {
+		if ((s->stype == SRC_FILE || s->stype == SRC_INC)
+				&& strcmp(s->src, src) == 0)
+			return s;
+	}
+
+	path = find_source(src, & sbuf, & errno_val, false);
+	if (path != NULL) {
+		for (s = srcfiles->next; s != srcfiles; s = s->next) {
+			if ((s->stype == SRC_FILE || s->stype == SRC_INC)
+			    		&& files_are_same(path, s)) {
+				efree(path);
+				return s;
+			}
+		}
+		efree(path);
+	}
+
+	d_error(_("cannot find source file named `%s' (%s)"), src, strerror(errno_val));
+	return NULL;
+}
+
+/* print_lines --- print source lines, and update 'cur_srcfile' */
+
+static int
+print_lines(char *src, int start_line, int nlines)
+{
+	SRCFILE *s;
+	int *pos;
+	int i;
+	struct stat sbuf;
+
+	s = source_find(src);
+	if (s == NULL)
+		return -1;
+	if (s->fd <= INVALID_HANDLE && (s->fd = srcopen(s)) <= INVALID_HANDLE) {
+		d_error(_("can't open source file `%s' for reading (%s)"),
+				src, strerror(errno));
+		return -1;
+	}
+
+	if (fstat(s->fd, &sbuf) == 0 && s->mtime < sbuf.st_mtime) {
+		fprintf(out_fp, _("WARNING: source file `%s' modified since program compilation.\n"),
+				src);
+		efree(s->line_offset);
+		s->line_offset = NULL;
+		s->mtime = sbuf.st_mtime;
+
+		/* reopen source file */
+		close(s->fd);
+		s->fd = INVALID_HANDLE;
+		if ((s->fd = srcopen(s)) <= INVALID_HANDLE) {
+			d_error(_("can't open source file `%s' for reading (%s)"),
+					src, strerror(errno));
+			return -1;
+		}
+	}
+
+	/* set binary mode so that byte offset calculations will be right */
+	os_setbinmode(s->fd, O_BINARY);
+
+	if (s->line_offset == NULL && find_lines(s) != 0)
+		return -1;
+  	if (start_line < 1 || start_line > s->srclines) {
+		d_error(_("line number %d out of range; `%s' has %d lines"),
+					start_line, src, s->srclines);
+		return -1;
+	}
+
+	assert(nlines > 0);
+	if ((start_line + nlines - 1) > s->srclines)
+		nlines = s->srclines - start_line + 1;
+
+	pos = s->line_offset;
+	if (lseek(s->fd, (off_t) pos[start_line - 1], SEEK_SET) < 0) {
+		d_error("%s: %s", src, strerror(errno));
+		return -1;
+	}
+
+	if (linebuf == NULL) {
+		emalloc(linebuf, char *, s->maxlen + 20, "print_lines"); /* 19 for line # */
+		linebuf_len = s->maxlen;
+	} else if (linebuf_len < s->maxlen) {
+		erealloc(linebuf, char *, s->maxlen + 20, "print_lines");
+		linebuf_len = s->maxlen;
+	}
+
+	for (i = start_line; i < start_line + nlines; i++) {
+		int supposed_len, len;
+		char *p;
+
+		sprintf(linebuf, "%-8d", i);
+
+		/* mark the line about to be executed with =>; nlines > 1
+	 	 * condition makes sure that we are in list command
+		 */
+		if (nlines > 1) {
+			BREAKPOINT *b;
+			bool has_bpt = false;
+			for (b = breakpoints.prev; b != &breakpoints; b = b->prev) {
+				if (src == b->src && i == b->bpi->source_line) {
+					has_bpt = true;
+					break;
+				}
+			}
+			if (prog_running && src == source && i == sourceline) {
+				if (has_bpt)
+					sprintf(linebuf, "%-4d:b=>", i);
+				else
+					sprintf(linebuf, "%-4d  =>", i);
+			} else if (has_bpt)
+				sprintf(linebuf, "%-4d:b  ", i);
+		}
+
+		p = linebuf + strlen(linebuf);
+		supposed_len = pos[i] - pos[i - 1];
+		len = read(s->fd, p, supposed_len);
+		switch (len) {
+		case -1:
+			d_error(_("can't read source file `%s' (%s)"),
+						src, strerror(errno));
+			return -1;
+
+		case 0:
+			d_error(_("unexpected eof while reading file `%s', line %d"),
+						src, i);
+			return -1;
+
+		default:
+			if (i == s->srclines && p[len - 1] != '\n')
+				p[len++] = '\n';
+#if 0
+			if (len != supposed_len || p[len - 1] != '\n') {
+				d_error(_("source file `%s' modified since start of program execution"),
+						src);
+				return -1;
+			}
+#endif
+			len += (p - linebuf);
+			if (fwrite(linebuf, sizeof(char), len, out_fp) != len)
+				return -1;
+		}
+	}
+
+	if (cur_srcfile != s) {
+		if (cur_srcfile->fd != INVALID_HANDLE) {
+			close(cur_srcfile->fd);
+			cur_srcfile->fd = INVALID_HANDLE;
+		}
+		cur_srcfile = s;
+	}
+	return (i - 1);		/* no of lines printed */
+}
+
+/* do_list --- list command */
+
+int
+do_list(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	long line_first, line_last;
+	long count = list_size;
+	INSTRUCTION *rp;
+	char *src = cur_srcfile->src;
+
+	line_first = last_printed_line + 1;		/* default or no arg */
+	if (arg == NULL)	/* list or list + */
+		goto list;
+
+	switch (arg->type) {
+	case D_int:		/* list n or list - */
+		if (arg->a_int < 0) {		/* list - */
+			line_first = last_printed_line - last_print_count - list_size + 1;
+			if (line_first < 1) {
+				if (last_printed_line != last_print_count)
+					line_first = 1;
+				else
+					return false;
+			}
+		} else {
+line:
+			line_first = arg->a_int - list_size / 2;
+			if (line_first < 1)
+				line_first = 1;
+		}
+		break;
+
+	case D_range:	/* list m-n */
+range:
+		line_first = arg->a_int;
+		arg = arg->next;
+		assert(arg != NULL);
+		assert(arg->type == D_int);
+		count = arg->a_int - line_first + 1;
+		break;
+
+	case D_string:
+		src = arg->a_string;
+		if (arg->next != NULL) {
+			arg = arg->next;
+			if (arg->type == D_int)	/* list file:n */
+				goto line;
+			else if (arg->type == D_range)	/* list file:m-n */
+				goto range;
+			else if (arg->type == D_func)	/* list file:function */
+				goto func;
+			else
+				line_first = 1;
+		} else
+			line_first = 1;
+		break;
+
+	case D_func:	/* list function */
+func:
+		rp = arg->a_node->code_ptr;
+		src = rp->source_file;
+		line_first = rp->source_line - list_size / 2;
+		if (line_first < 1)
+			line_first = 1;
+		break;
+
+	default:
+		break;
+ 	}
+
+list:
+	line_last = print_lines(src, line_first, count);
+	if (line_last != -1) {
+		last_printed_line = line_last;
+		last_print_count = line_last - line_first + 1;
+	}
+	return false;
+}
+
+/* do_info --- info command */
+
+int
+do_info(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	NODE **table;
+
+	if (arg == NULL || arg->type != D_argument)
+		return false;
+
+	switch (arg->a_argument) {
+	case A_SOURCE:
+		fprintf(out_fp, _("Current source file: %s\n"), cur_srcfile->src);
+		fprintf(out_fp, _("Number of lines: %d\n"), cur_srcfile->srclines);
+		break;
+
+	case A_SOURCES:
+	{
+		SRCFILE *s;
+		for (s = srcfiles->next; s != srcfiles; s = s->next) {
+			fprintf(out_fp, _("Source file (lines): %s (%d)\n"),
+					(s->stype == SRC_FILE || s->stype == SRC_INC) ? s->src
+			 		                                      : "cmd. line",
+					s->srclines);
+		}
+	}
+		break;
+
+	case A_BREAK:
+		initialize_pager(out_fp);
+		if (setjmp(pager_quit_tag) == 0) {
+			BREAKPOINT *b;
+			struct commands_item *c;
+
+			gprintf(out_fp, _("Number  Disp  Enabled  Location\n\n"));
+			for (b = breakpoints.prev; b != &breakpoints; b = b->prev) {
+				char *disp = "keep";
+				if ((b->flags & BP_ENABLE_ONCE) != 0)
+					disp = "dis";
+				else if ((b->flags & BP_TEMP) != 0)
+					disp = "del";
+				gprintf(out_fp, "%-6d  %-4.4s  %-7.7s  file %s, line #%d\n",
+						b->number, disp, (b->flags & BP_ENABLE) != 0 ? "yes" : "no",
+					 	b->src,	b->bpi->source_line);
+				if (b->hit_count > 0)
+					gprintf(out_fp, _("\tno of hits = %ld\n"), b->hit_count);
+				if ((b->flags & BP_IGNORE) != 0)
+					gprintf(out_fp, _("\tignore next %ld hit(s)\n"), b->ignore_count);
+				if (b->cndn.code != NULL)
+					gprintf(out_fp, _("\tstop condition: %s\n"), b->cndn.expr);
+				if (b->commands.next != &b->commands)
+					gprintf(out_fp, _("\tcommands:\n"));
+				for (c = b->commands.next; c != &b->commands; c = c->next) {
+					gprintf(out_fp, "\t%s\n", c->cmd_string);
+					if (c->cmd == D_eval) {
+						char *start, *end;
+						CMDARG *a = c->arg;
+						start = strchr(a->a_string, '{');
+						end = strrchr(a->a_string, '}');
+						if (start == NULL || end == NULL)
+							continue;
+						start++;
+						*end = '\0';
+						gprintf(out_fp, "%s", start);	/* FIXME: translate ? */
+						*end = '}';
+					}
+				}
+			}
+		}
+		break;
+
+	case A_FRAME:
+		CHECK_PROG_RUNNING();
+		fprintf(out_fp, _("Current frame: "));
+		print_numbered_frame(cur_frame);
+		if (cur_frame < fcall_count) {
+			fprintf(out_fp, _("Called by frame: "));
+			print_numbered_frame(cur_frame + 1);
+		}
+		if (cur_frame > 0) {
+			fprintf(out_fp, _("Caller of frame: "));
+			print_numbered_frame(cur_frame - 1);
+		}
+		break;
+
+	case A_ARGS:
+	case A_LOCALS:
+	{
+		NODE *f, *func;
+		INSTRUCTION *pc;
+		int arg_count, pcount;
+		int i, from, to;
+
+		CHECK_PROG_RUNNING();
+		f = find_frame(cur_frame);
+		func = f->func_node;
+		if (func == NULL) {
+			/* print ARGV ? */
+			fprintf(out_fp, _("None in main().\n"));
+			return false;
+		}
+
+		pcount = func->param_cnt;              /* # of defined params */
+
+		pc = (INSTRUCTION *) f->reti;          /* Op_func_call instruction */
+		arg_count = (pc + 1)->expr_count;      /* # of arguments supplied */
+
+		if (arg_count > pcount)                /* extra args */
+			arg_count = pcount;
+		if (arg->a_argument == A_ARGS) {
+			from = 0;
+			to = arg_count - 1;
+		} else {
+			from = arg_count;
+			to = pcount - 1;
+		}
+
+		for (i = from; i <= to; i++) {
+			NODE *r;
+			r = f->stack[i];
+			if (r->type == Node_array_ref)
+				r = r->orig_array;
+			fprintf(out_fp, "%s = ", func->fparms[i].param);
+			print_symbol(r, true);
+		}
+		if (to < from)
+			fprintf(out_fp, "%s",
+				arg->a_argument == A_ARGS ?
+					_("No arguments.\n") :
+					_("No locals.\n"));
+	}
+		break;
+
+	case A_VARIABLES:
+		table = variable_list();
+		initialize_pager(out_fp);
+		if (setjmp(pager_quit_tag) == 0) {
+			gprintf(out_fp, _("All defined variables:\n\n"));
+			print_vars(table, gprintf, out_fp);
+		}
+		efree(table);
+		break;
+
+	case A_FUNCTIONS:
+		table = function_list(true);
+		initialize_pager(out_fp);
+		if (setjmp(pager_quit_tag) == 0) {
+			gprintf(out_fp, _("All defined functions:\n\n"));
+			pf_data.print_func = gprintf;
+			pf_data.fp = out_fp;
+			pf_data.defn = true;
+			(void) foreach_func(table,
+			            (int (*)(INSTRUCTION *, void *)) print_function,
+			            &pf_data);
+		}
+		efree(table);
+		break;
+
+	case A_DISPLAY:
+	case A_WATCH:
+		initialize_pager(out_fp);
+		if (setjmp(pager_quit_tag) == 0) {
+			struct list_item *d, *list;
+
+			if (arg->a_argument == A_DISPLAY) {
+				list = &display_list;
+				gprintf(out_fp, _("Auto-display variables:\n\n"));
+			} else {
+				list = &watch_list;
+				gprintf(out_fp, _("Watch variables:\n\n"));
+			}
+			for (d = list->prev; d != list; d = d->prev) {
+				int i;
+				struct commands_item *c;
+				NODE *symbol = d->symbol;
+
+				if (IS_SUBSCRIPT(d)) {
+					gprintf(out_fp, "%d:\t%s",  d->number, d->sname);
+					for (i = 0; i < d->num_subs; i++) {
+						NODE *sub;
+						sub = d->subs[i];
+						gprintf(out_fp, "[\"%.*s\"]", (int) sub->stlen, sub->stptr);
+					}
+					gprintf(out_fp, "\n");
+				} else if (IS_FIELD(d))
+					gprintf(out_fp, "%d:\t$%ld\n", d->number, get_number_si(symbol));
+				else
+					gprintf(out_fp, "%d:\t%s\n", d->number, d->sname);
+				if (d->cndn.code != NULL)
+					gprintf(out_fp, _("\tstop condition: %s\n"), d->cndn.expr);
+				if (d->commands.next != &d->commands)
+					gprintf(out_fp, _("\tcommands:\n"));
+				for (c = d->commands.next; c != &d->commands; c = c->next) {
+					gprintf(out_fp, "\t%s\n", c->cmd_string);
+					if (c->cmd == D_eval) {
+						char *start, *end;
+						CMDARG *a = c->arg;
+						start = strchr(a->a_string, '{');
+						end = strrchr(a->a_string, '}');
+						if (start == NULL || end == NULL)
+							continue;
+						start++;
+						*end = '\0';
+						gprintf(out_fp, "%s", start);	/* FIXME: translate ? */
+						*end = '}';
+					}
+				}
+
+			}
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	return false;
+}
+
+/* print_symbol --- print a symbol table entry */
+
+static void
+print_symbol(NODE *r, bool isparam)
+{
+	switch (r->type) {
+	case Node_var_new:
+		fprintf(out_fp, "untyped variable\n");
+		break;
+	case Node_var:
+		if (! isparam && r->var_update)
+			r->var_update();
+		valinfo(r->var_value, fprintf, out_fp);
+		break;
+	case Node_var_array:
+		fprintf(out_fp, "array, %ld elements\n", assoc_length(r));
+		break;
+	case Node_func:
+		fprintf(out_fp, "`function'\n");
+		break;
+	default:
+		break;
+	}
+}
+
+/* find_frame --- find frame given a frame number */
+
+static NODE *
+find_frame(long num)
+{
+	assert(num >= 0);
+	if (num == 0)
+		return frame_ptr;
+
+	assert(prog_running == true);
+	assert(num <= fcall_count);
+	assert(fcall_list[num] != NULL);
+	return fcall_list[num];
+}
+
+/* find_param --- find a function parameter in a given frame number */
+
+static NODE *
+find_param(const char *name, long num, char **pname)
+{
+	NODE *r = NULL;
+	NODE *f;
+	char *fparam;
+
+	if (pname)
+		*pname = NULL;
+
+	if (num < 0 || num > fcall_count || name == NULL)
+		return NULL;
+	f = find_frame(num);
+	if (f->func_node != NULL) {		/* in function */
+		NODE *func;
+		int i, pcount;
+
+		func = f->func_node;
+		pcount = func->param_cnt;
+		for (i = 0; i < pcount; i++) {
+			fparam = func->fparms[i].param;
+			if (strcmp(name, fparam) == 0) {
+				r = f->stack[i];
+				if (r->type == Node_array_ref)
+					r = r->orig_array;
+				if (pname)
+					*pname = fparam;
+				break;
+			}
+		}
+	}
+	return r;
+}
+
+/* find_symbol --- find a symbol in current context */
+
+static
+NODE *find_symbol(const char *name, char **pname)
+{
+	NODE *r = NULL;
+
+	if (pname)
+		*pname = NULL;
+	if (prog_running)
+		r = find_param(name, cur_frame, pname);
+	if (r == NULL)
+		r = lookup(name); // for now, require fully qualified name
+	if (r == NULL)
+		fprintf(out_fp, _("no symbol `%s' in current context\n"), name);
+	return r;
+}
+
+/* find_array -- find an array in current context */
+
+static NODE *
+find_array(const char *name)
+{
+	NODE *r;
+	r = find_symbol(name, NULL);
+	if (r != NULL && r->type != Node_var_array) {
+		fprintf(out_fp, _("`%s' is not an array\n"), name);
+		return NULL;
+	}
+	return r;
+}
+
+/* print_field --- print the value of $n */
+
+static void
+print_field(long field_num)
+{
+	NODE **lhs;
+	lhs = get_field(field_num, NULL);
+	if (*lhs == Null_field || *lhs == Nnull_string)
+		fprintf(out_fp, _("$%ld = uninitialized field\n"), field_num);
+	else {
+		fprintf(out_fp, "$%ld = ", field_num);
+		valinfo(*lhs, fprintf, out_fp);
+	}
+}
+
+/* print_array --- print the contents of an array */
+
+static int
+print_array(volatile NODE *arr, char *arr_name)
+{
+	NODE *subs;
+	NODE **list;
+	int i;
+	size_t num_elems = 0;
+	volatile NODE *r;
+	volatile int ret = 0;
+	volatile jmp_buf pager_quit_tag_stack;
+
+	if (assoc_empty((NODE *) arr)) {
+		gprintf(out_fp, _("array `%s' is empty\n"), arr_name);
+		return 0;
+	}
+
+	num_elems = assoc_length((NODE *) arr);
+
+	/* sort indices, sub_arrays are also sorted! */
+	list = assoc_list((NODE *) arr, "@ind_str_asc", SORTED_IN);
+
+	PUSH_BINDING(pager_quit_tag_stack, pager_quit_tag, pager_quit_tag_valid);
+	if (setjmp(pager_quit_tag) == 0) {
+		for (i = 0; ret == 0 && i < num_elems; i++) {
+			subs = list[i];
+			r = *assoc_lookup((NODE *) arr, subs);
+			if (r->type == Node_var_array)
+				ret = print_array(r, r->vname);
+			else {
+				gprintf(out_fp, "%s[\"%.*s\"] = ", arr_name, (int) subs->stlen, subs->stptr);
+				valinfo((NODE *) r, gprintf, out_fp);
+			}
+		}
+	} else
+		ret = 1;
+
+	POP_BINDING(pager_quit_tag_stack, pager_quit_tag, pager_quit_tag_valid);
+
+	for (i = 0; i < num_elems; i++)
+		unref(list[i]);
+	efree(list);
+
+	return ret;
+}
+
+/* print_subscript --- print an array element */
+
+static void
+print_subscript(NODE *arr, char *arr_name, CMDARG *a, int count)
+{
+	NODE *r, *subs;
+
+	subs = a->a_node;
+	r = in_array(arr, subs);
+	if (r == NULL)
+		fprintf(out_fp, _("[\"%.*s\"] not in array `%s'\n"), (int) subs->stlen, subs->stptr, arr_name);
+	else if (r->type == Node_var_array) {
+		if (count > 1)
+			print_subscript(r, r->vname, a->next, count - 1);
+		else {
+			/* print # of elements in array */
+			fprintf(out_fp, "%s = ", r->vname);
+			print_symbol(r, false);
+		}
+	} else {
+		fprintf(out_fp, "%s[\"%.*s\"] = ", arr_name, (int) subs->stlen, subs->stptr);
+		valinfo(r, fprintf, out_fp);
+	}
+}
+
+/* do_print_var --- print command */
+
+int
+do_print_var(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	NODE *r;
+	CMDARG *a;
+	char *name, *pname;
+
+	for (a = arg; a != NULL; a = a->next) {
+		switch (a->type) {
+		case D_variable:
+			name = a->a_string;
+			if ((r = find_symbol(name, &pname)) != NULL) {
+				fprintf(out_fp, "%s = ", name);
+				print_symbol(r, (pname != NULL));
+			}
+			break;
+
+		case D_subscript:
+			assert(a->a_count > 0);
+			name = a->a_string;
+			r = find_array(name);
+			if (r != NULL)
+				print_subscript(r, name, a->next, a->a_count);
+			break;
+
+		case D_array:
+			name = a->a_string;
+			if ((r = find_array(name)) != NULL) {
+				int count = a->a_count;
+				for (; count > 0; count--) {
+					NODE *value, *subs;
+					a = a->next;
+					subs = a->a_node;
+					value = in_array(r, subs);
+					if (value == NULL) {
+						fprintf(out_fp, _("[\"%.*s\"] not in array `%s'\n"),
+									(int) subs->stlen, subs->stptr, name);
+						break;
+					} else if (value->type != Node_var_array) {
+						fprintf(out_fp, _("`%s[\"%.*s\"]' is not an array\n"),
+									name, (int) subs->stlen, subs->stptr);
+						break;
+					} else {
+						r = value;
+						name = r->vname;
+					}
+				}
+				if (count == 0) {
+					initialize_pager(out_fp);
+					print_array((volatile NODE *) r, name);
+				}
+			}
+			break;
+
+		case D_field:
+			print_field(get_number_si(a->a_node));
+			break;
+
+		default:
+			/* notably D_node, subscript for invalid array name; skip */
+			break;
+		}
+	}
+	return false;
+}
+
+/* do_set_var --- set command */
+
+int
+do_set_var(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	NODE *r, *val;
+	NODE **lhs;
+	char *name, *pname;
+
+	switch (arg->type) {
+	case D_variable:
+		name = arg->a_string;
+		arg = arg->next;
+		val = arg->a_node;
+
+		if ((r = find_symbol(name, &pname)) == NULL)
+			break;
+
+		switch (r->type) {
+		case Node_var_new:
+			r->type = Node_var;
+			r->var_value = dupnode(Nnull_string);
+			/* fall through */
+		case Node_var:
+			lhs = &r->var_value;
+			unref(*lhs);
+			*lhs = dupnode(val);
+			if (pname == NULL && r->var_assign != NULL)
+				r->var_assign();
+			fprintf(out_fp, "%s = ", name);
+			print_symbol(r, (pname != NULL));
+			break;
+
+		default:
+			d_error(_("`%s' is not a scalar variable"), name);
+			break;
+		}
+		break;
+
+	case D_subscript:
+	{
+		NODE *subs, *value;
+		int count = arg->a_count;
+		NODE *newval;
+
+		assert(count > 0);
+		name = arg->a_string;
+		r = find_array(name);
+		if (r == NULL)
+			break;
+		for (; count > 0; count--) {
+			arg = arg->next;
+			subs = arg->a_node;
+			value = in_array(r, subs);
+
+			if (count == 1) {
+				if (value != NULL && value->type == Node_var_array)
+					d_error(_("attempt to use array `%s[\"%.*s\"]' in a scalar context"),
+								name, (int) subs->stlen, subs->stptr);
+				else {
+					arg = arg->next;
+					val = arg->a_node;
+					newval = dupnode(val);
+					// subs should not be freed, so
+					// use dupnode in call to assoc_set.
+					assoc_set(r, dupnode(subs), newval);
+					fprintf(out_fp, "%s[\"%.*s\"] = ", name, (int) subs->stlen, subs->stptr);
+					valinfo(newval, fprintf, out_fp);
+				}
+			} else {
+				if (value == NULL) {
+					NODE *array;
+					array = make_array();
+					array->vname = estrdup(subs->stptr, subs->stlen);
+					array->parent_array = r;
+					// subs should not be freed, so
+					// use dupnode in call to assoc_set.
+					assoc_set(r, dupnode(subs), array);
+					r = array;
+				} else if (value->type != Node_var_array) {
+					d_error(_("attempt to use scalar `%s[\"%.*s\"]' as array"),
+							name, (int) subs->stlen, subs->stptr);
+					break;
+				} else {
+					r = value;
+					name = r->vname;
+				}
+			}
+		}
+	}
+		break;
+
+	case D_field:
+	{
+		long field_num;
+		Func_ptr assign = NULL;
+
+		field_num = get_number_si(arg->a_node);
+		assert(field_num >= 0);
+		arg = arg->next;
+		val = arg->a_node;
+		lhs = get_field(field_num, &assign);
+		if (assign)
+			/* call assign to copy fields before unref frees $0 */
+			assign();
+		unref(*lhs);
+		*lhs = dupnode(val);
+		print_field(field_num);
+	}
+		break;
+
+	default:
+		break;
+	}
+	return false;
+}
+
+/* find_item --- find an item in the watch/display list */
+
+static struct list_item *
+find_item(struct list_item *list, long num)
+{
+	struct list_item *d;
+
+	if (num <= 0)
+		return NULL;
+	for (d = list->next; d != list; d = d->next) {
+		if (d->number == num)
+			return d;
+	}
+	return NULL;
+}
+
+/* delete_item --- delete an item from the watch/display list */
+
+static void
+delete_item(struct list_item *d)
+{
+	struct commands_item *c;
+	int i;
+
+	if (IS_SUBSCRIPT(d)) {
+		for (i = 0; i < d->num_subs; i++)
+			unref(d->subs[i]);
+		efree(d->subs);
+	} else if (IS_FIELD(d))
+		unref(d->symbol);
+
+	if ((d->flags & CUR_IS_ARRAY) == 0)
+		unref(d->cur_value);
+	if ((d->flags & OLD_IS_ARRAY) == 0)
+		unref(d->old_value);
+
+	/* delete commands */
+	for (c = d->commands.next; c != &d->commands; c = c->next) {
+		c = c->prev;
+		delete_commands_item(c->next);
+	}
+
+	free_context(d->cndn.ctxt, false);
+	if (d->cndn.expr != NULL)
+		efree(d->cndn.expr);
+
+	d->next->prev = d->prev;
+	d->prev->next = d->next;
+	efree(d);
+}
+
+/* add_item --- craete a watch/display item and add it to the list */
+
+static struct list_item *
+add_item(struct list_item *list, int type, NODE *symbol, char *pname)
+{
+	struct list_item *d;
+
+	ezalloc(d, struct list_item *, sizeof(struct list_item), "add_item");
+	d->commands.next = d->commands.prev = &d->commands;
+
+	d->number = ++list->number;
+	d->sname = symbol->vname;
+	if (pname != NULL) {	/* function param */
+		d->sname = pname;
+		d->flags |= PARAM;
+		d->fcall_count = fcall_count - cur_frame;
+	}
+
+	if (type == D_field) {
+		/* field number */
+		d->symbol = symbol;
+		d->flags |= FIELD_NUM;
+	} else if (type == D_subscript) {
+		/* subscript */
+		d->symbol = symbol;
+		d->flags |= SUBSCRIPT;
+	} else {
+		/* array or variable */
+		d->symbol = symbol;
+	}
+
+	/* add to list */
+	d->next = list->next;
+	d->prev = list;
+	list->next = d;
+	d->next->prev = d;
+	return d;
+}
+
+/* do_add_item --- add an item to the watch/display list */
+
+static struct list_item *
+do_add_item(struct list_item *list, CMDARG *arg)
+{
+	NODE *symbol = NULL;
+	char *name, *pname = NULL;
+	struct list_item *item = NULL;
+
+	switch (arg->type) {
+	case D_subscript:
+	case D_variable:
+		name = arg->a_string;
+		if ((symbol = find_symbol(name, &pname)) == NULL)
+			return NULL;
+		if (symbol->type == Node_func) {
+			d_error(_("`%s' is a function"), name);
+			return NULL;
+		}
+		if (arg->type == D_subscript && symbol->type != Node_var_array) {
+			d_error(_("`%s' is not an array\n"), name);
+			return NULL;
+		}
+
+		item = add_item(list, arg->type, symbol, pname);
+		if (item != NULL && arg->type == D_subscript) {
+			NODE **subs;
+			int count = arg->a_count;
+			int i;
+
+			assert(count > 0);
+			emalloc(subs, NODE **, count * sizeof(NODE *), "do_add_item");
+			for (i = 0; i < count; i++) {
+				arg = arg->next;
+				subs[i] = dupnode(arg->a_node);
+				subs[i] = force_string(subs[i]);
+			}
+			item->subs = subs;
+			item->num_subs = count;
+		}
+		break;
+
+	case D_field:
+		symbol = dupnode(arg->a_node);
+		item = add_item(list, D_field, symbol, NULL);
+		break;
+
+	default:
+		break;
+	}
+
+	/* watch condition if any */
+	if (list == &watch_list) {
+		arg = arg->next;
+		if (item != NULL && arg != NULL) {
+			if (parse_condition(D_watch, item->number, arg->a_string) == 0)
+				arg->a_string = NULL;	/* don't let free_cmdarg free it */
+			else
+				fprintf(out_fp, _("watchpoint %d is unconditional\n"), item->number);
+		}
+	}
+	return item;
+}
+
+/* do_delete_item --- delete a watch/display item from list. */
+
+static void
+do_delete_item(struct list_item *list, CMDARG *arg)
+{
+	if (arg == NULL) {
+		while (list->next != list)
+			delete_item(list->next);
+	}
+
+	for (; arg != NULL; arg = arg->next) {
+		struct list_item *d;
+		if (arg->type == D_range) {
+			long i, j;
+
+			i = arg->a_int;
+			arg = arg->next;
+			j = arg->a_int;
+			if (j > list->number)
+				j = list->number;
+			for (; i <= j; i++) {
+				if ((d = find_item(list, i)) != NULL)
+					delete_item(d);
+			}
+		} else {
+			if ((d = find_item(list, arg->a_int)) == NULL) {
+				/* split into two for easier message translation */
+				if (list == &display_list)
+					d_error(_("No display item numbered %ld"),
+						arg->a_int);
+				else
+					d_error(_("No watch item numbered %ld"),
+						arg->a_int);
+			} else
+				delete_item(d);
+		}
+	}
+}
+
+/* display --- print an item from the auto-display list */
+
+static void
+display(struct list_item *d)
+{
+	NODE *symbol;
+
+	symbol = d->symbol;
+	if (IS_PARAM(d)	&& (d->fcall_count != (fcall_count - cur_frame)))
+		return;
+
+	if (IS_SUBSCRIPT(d)) {
+		NODE *sub, *r;
+		int i = 0, count = d->num_subs;
+		for (i = 0; i < count; i++) {
+			sub = d->subs[i];
+			r = in_array(symbol, sub);
+			if (r == NULL) {
+				fprintf(out_fp, _("%d: [\"%.*s\"] not in array `%s'\n"),
+							d->number, (int) sub->stlen, sub->stptr, d->sname);
+				break;
+			}
+			if (r->type == Node_var_array) {
+				symbol = r;
+				if (i == count - 1)	/* it's a sub-array */
+					goto print_sym;		/* print # of elements in sub-array */
+			} else {
+				if (i != count - 1)
+					return;		/* FIXME msg and delete item ? */
+				fprintf(out_fp, "%d: %s[\"%.*s\"] = ", d->number,
+							d->sname, (int) sub->stlen, sub->stptr);
+				valinfo(r, fprintf, out_fp);
+			}
+		}
+	} else if (IS_FIELD(d)) {
+		NODE *r = d->symbol;
+		fprintf(out_fp, "%d: ", d->number);
+		print_field(get_number_si(r));
+	} else {
+print_sym:
+		fprintf(out_fp, "%d: %s = ", d->number, d->sname);
+		print_symbol(symbol, IS_PARAM(d));
+	}
+}
+
+
+/* do_display --- display command */
+
+int
+do_display(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	struct list_item *d;
+
+	if (arg == NULL) {
+		/* display all items */
+		for (d = display_list.prev; d != &display_list; d = d->prev)
+			display(d);
+		return false;
+	}
+
+	if ((d = do_add_item(&display_list, arg)) != NULL)
+		display(d);
+
+	return false;
+}
+
+/* do_undisplay --- undisplay command */
+
+int
+do_undisplay(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	do_delete_item(&display_list, arg);
+	return false;
+}
+
+/* condition_triggered --- test if a condition expression is true */
+
+static int
+condition_triggered(struct condition *cndn)
+{
+	NODE *r;
+	int di;
+
+	assert(cndn != NULL);
+	if (cndn->code == NULL)
+		return true;
+
+	push_context(cndn->ctxt);
+	r = execute_code((volatile INSTRUCTION *) cndn->code);
+	pop_context();  /* switch to prev context */
+	if (r == NULL)      /* fatal error */
+		return false;   /* not triggered */
+
+	force_number(r);
+	di = ! iszero(r);
+	DEREF(r);
+	return di;
+}
+
+
+static int
+find_subscript(struct list_item *item, NODE **ptr)
+{
+	NODE *symbol = item->symbol;
+	NODE *sub, *r;
+	int i = 0, count = item->num_subs;
+
+	r = *ptr = NULL;
+	for (i = 0; i < count; i++) {
+		sub = item->subs[i];
+		r = in_array(symbol, sub);
+		if (r == NULL)
+			return 0;
+		if (r->type == Node_var_array)
+			symbol = r;
+		else if (i < count - 1)
+			return -1;
+	}
+	if (r != NULL)
+		*ptr = r;
+	return 0;
+}
+
+/* cmp_val --- compare values of watched item, returns true if different; */
+
+static int
+cmp_val(struct list_item *w, NODE *old, NODE *new)
+{
+		/*
+		 *	case    old     new     result
+		 *	------------------------------
+		 *	1:      NULL    ARRAY   true
+		 *	2:      NULL    SCALAR  true
+		 *	3:      NULL    NULL    false
+		 *	4:      SCALAR  SCALAR  cmp_node
+		 *	5:      SCALAR  ARRAY   true
+		 *	6:      SCALAR  NULL    true
+		 *	7:      ARRAY   SCALAR  true
+		 *	8:      ARRAY   ARRAY   compare size
+		 *	9:      ARRAY   NULL    true
+		 */
+
+	if (WATCHING_ARRAY(w)) {
+		long size = 0;
+		if (! new)		/* 9 */
+			return true;
+		if (new->type == Node_val)	/* 7 */
+			return true;
+		/* new->type == Node_var_array */	/* 8 */
+		size = assoc_length(new);
+		if (w->cur_size == size)
+			return false;
+		return true;
+	}
+
+	if (! old && ! new)	/* 3 */
+		return false;
+	if ((! old && new)	/* 1, 2 */
+			|| (old && ! new))	/* 6 */
+		return true;
+
+	if (new->type == Node_var_array)	/* 5 */
+		return true;
+	return cmp_nodes(old, new, true);	/* 4 */
+}
+
+/* watchpoint_triggered --- check if we should stop at this watchpoint;
+ *                          update old and current values accordingly.
+ */
+
+static int
+watchpoint_triggered(struct list_item *w)
+{
+	NODE *symbol;
+	NODE *t1, *t2;
+
+	symbol = w->symbol;
+	if (IS_PARAM(w) && (w->fcall_count != (fcall_count - cur_frame)))
+		return 0; /* parameter with same name in a different function */
+	if (! condition_triggered(&w->cndn))
+		return 0;
+
+	t1 = w->cur_value;
+	t2 = (NODE *) 0;
+	if (IS_SUBSCRIPT(w))
+		(void) find_subscript(w, &t2);
+	else if (IS_FIELD(w)) {
+		long field_num;
+		field_num = get_number_si(w->symbol);
+		t2 = *get_field(field_num, NULL);
+	} else {
+		switch (symbol->type) {
+		case Node_var:
+			t2 = symbol->var_value;
+			break;
+		case Node_var_array:
+			t2 = symbol;
+			break;
+		case Node_var_new:
+			break;
+		default:
+			cant_happen();
+		}
+	}
+
+	if (! cmp_val(w, t1, t2))
+		return 0;
+
+	/* update old and current values */
+
+	if ((w->flags & OLD_IS_ARRAY) == 0)
+		unref(w->old_value);
+	w->flags &= ~OLD_IS_ARRAY;
+	if (WATCHING_ARRAY(w)) {	/* 7, 8, 9 */
+		w->old_size = w->cur_size;
+		w->flags |= OLD_IS_ARRAY;
+		if (! t2) {
+			w->flags &= ~CUR_IS_ARRAY;
+			w->cur_value = 0;
+		} else if (t2->type == Node_val) {
+			w->flags &= ~CUR_IS_ARRAY;
+			w->cur_value = dupnode(t2);
+		} else
+			w->cur_size = (t2->type == Node_var_array) ? assoc_length(t2) : 0;
+	} else if (! t1) { /* 1, 2 */
+		w->old_value = 0;
+		/* new != NULL */
+		if (t2->type == Node_val)
+			w->cur_value = dupnode(t2);
+		else {
+			w->flags |= CUR_IS_ARRAY;
+			w->cur_size = (t2->type == Node_var_array) ? assoc_length(t2) : 0;
+		}
+	} else /* if (t1->type == Node_val) */ {	/* 4, 5, 6 */
+		w->old_value = w->cur_value;
+		if (! t2)
+			w->cur_value = 0;
+		else if (t2->type == Node_var_array) {
+			w->flags |= CUR_IS_ARRAY;
+			w->cur_size = assoc_length(t2);
+		} else
+			w->cur_value = dupnode(t2);
+	}
+
+	return w->number;
+}
+
+/* initialize_watch_item --- initialize current value of a watched item */
+
+static int
+initialize_watch_item(struct list_item *w)
+{
+	NODE *t, *r;
+	NODE *symbol = w->symbol;
+
+	if (IS_SUBSCRIPT(w)) {
+		if (find_subscript(w, &r) == -1) {
+			d_error(_("attempt to use scalar value as array"));
+			return -1;
+		}
+
+		if (r == NULL)
+			w->cur_value = (NODE *) 0;
+		else if (r->type == Node_var_array) { /* it's a sub-array */
+			w->flags |= CUR_IS_ARRAY;
+			w->cur_size = assoc_length(r);
+		} else
+			w->cur_value = dupnode(r);
+	} else if (IS_FIELD(w)) {
+		long field_num;
+		t = w->symbol;
+		field_num = get_number_si(t);
+		r = *get_field(field_num, NULL);
+		w->cur_value = dupnode(r);
+	} else {
+		if (symbol->type == Node_var_new)
+			w->cur_value = (NODE *) 0;
+		else if (symbol->type == Node_var) {
+			r = symbol->var_value;
+			w->cur_value = dupnode(r);
+		} else if (symbol->type == Node_var_array) {
+			w->flags |= CUR_IS_ARRAY;
+			w->cur_size = assoc_length(symbol);
+		} else if (symbol->type == Node_val && (symbol->flags & REGEX) != 0) {
+			w->cur_value = dupnode(symbol);
+		} /* else
+			can't happen */
+	}
+	return 0;
+}
+
+/* do_watch --- watch command */
+
+int
+do_watch(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	struct list_item *w;
+	NODE *symbol, *sub;
+	int i;
+
+	w = do_add_item(&watch_list, arg);
+	if (w == NULL)
+		return false;
+
+	if (initialize_watch_item(w) == -1) {
+		delete_item(w);
+		return false;
+	}
+
+	fprintf(out_fp, "Watchpoint %d: ", w->number);
+	symbol = w->symbol;
+
+	/* FIXME: common code also in print_watch_item */
+	if (IS_SUBSCRIPT(w)) {
+		fprintf(out_fp, "%s", w->sname);
+		for (i = 0; i < w->num_subs; i++) {
+			sub = w->subs[i];
+			fprintf(out_fp, "[\"%.*s\"]", (int) sub->stlen, sub->stptr);
+		}
+		fprintf(out_fp, "\n");
+	} else if (IS_FIELD(w))
+		fprintf(out_fp, "$%ld\n", get_number_si(symbol));
+	else
+		fprintf(out_fp, "%s\n", w->sname);
+
+	return false;
+}
+
+/* do_unwatch --- unwatch command */
+
+int
+do_unwatch(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	do_delete_item(&watch_list, arg);
+	return false;
+}
+
+/* callback from pop_frame in eval.c */
+
+void
+frame_popped()
+{
+	struct list_item *item;
+
+	/* delete all out of scope watchpoints */
+	for (item = watch_list.next; item != &watch_list; item = item->next) {
+		if (IS_PARAM(item) && (item->fcall_count > fcall_count)) {
+			fprintf(out_fp,
+				_("Watchpoint %d deleted because parameter is out of scope.\n"),
+				item->number);
+			item = item->prev;
+			delete_item(item->next);
+		}
+	}
+
+	/* delete all out of scope display items */
+	for (item = display_list.next; item != &display_list; item = item->next) {
+		if (IS_PARAM(item) && (item->fcall_count > fcall_count)) {
+			fprintf(out_fp,
+				_("Display %d deleted because parameter is out of scope.\n"),
+				item->number);
+			item = item->prev;
+			delete_item(item->next);
+		}
+	}
+}
+
+/* print_function --- print function name, parameters, and optionally
+ *                file and line number.
+ */
+
+static int
+print_function(INSTRUCTION *pc, void *x)
+{
+	NODE *func;
+	int i, pcount;
+	struct pf_data *data = (struct pf_data *) x;
+	int defn = data->defn;
+	Func_print print_func = data->print_func;
+	FILE *fp = data->fp;
+
+	func = pc->func_body;
+	pcount = func->param_cnt;
+
+	print_func(fp, "%s(", func->vname);
+	for (i = 0; i < pcount; i++) {
+		print_func(fp, "%s", func->fparms[i].param);
+		if (i < pcount - 1)
+			print_func(fp, ", ");
+	}
+	print_func(fp, ")");
+	if (defn)
+		print_func(fp, _(" in file `%s', line %d\n"),
+				pc->source_file, pc->source_line);
+	return 0;
+}
+
+/* print_frame --- print function name, parameters,
+ *                 source and line number of where it is
+ *                 executing.
+ */
+
+static void
+print_frame(NODE *func, char *src, int srcline)
+{
+	if (func == NULL)
+		fprintf(out_fp, "main()");
+	else {
+		pf_data.print_func = fprintf;
+		pf_data.fp = out_fp;
+		pf_data.defn = false;
+		(void) print_function(func->code_ptr, &pf_data);
+	}
+	fprintf(out_fp, _(" at `%s':%d"), src, srcline);
+}
+
+/* print_numbered_frame --- print a frame given its number */
+
+static void
+print_numbered_frame(long num)
+{
+	NODE *f;
+
+	assert(prog_running == true);
+	f = find_frame(num);
+	if (num == 0) {
+		fprintf(out_fp, "#%ld\t ", num);
+		print_frame(f->func_node, source, sourceline);
+	} else {
+		fprintf(out_fp, _("#%ld\tin "), num);
+		print_frame(f->func_node, f->vname,
+			((INSTRUCTION *) find_frame(num - 1)->reti)->source_line);
+	}
+	fprintf(out_fp, "\n");
+}
+
+/* do_backtrace --- backtrace command */
+
+int
+do_backtrace(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	long cur = 0;
+	long last = fcall_count;
+
+	CHECK_PROG_RUNNING();
+	if (arg != NULL && arg->type == D_int) {
+		long count = arg->a_int;
+
+		/* frame_ptr (frame #0),  fcall_list[1, 2, ... fcall_count] => total count */
+		if (count >= 0) {
+			/* toward outermost frame #fcall_count */
+			last = count - 1;
+			if (last > fcall_count)
+				 last = fcall_count;
+		} else {
+			/* toward innermost frame #0 */
+			cur = 1 + fcall_count + count;
+			if (cur < 0)
+				cur = 0;
+		}
+	}
+
+	for (; cur <= last; cur++) {
+		print_numbered_frame(cur);
+	}
+	if (cur <= fcall_count)
+		fprintf(out_fp, _("More stack frames follow ...\n"));
+	return false;
+}
+
+/* print_cur_frame_and_sourceline --- print current frame, and
+ *                                    current source line.
+ */
+
+static void
+print_cur_frame_and_sourceline()
+{
+	NODE *f;
+	int srcline;
+	char *src;
+
+	assert(prog_running == true);
+	f = find_frame(cur_frame);
+	if (cur_frame == 0) {
+		src = source;
+		srcline = sourceline;
+	} else {
+		f = find_frame(cur_frame);
+		src = f->vname;
+		srcline = ((INSTRUCTION *) find_frame(cur_frame - 1)->reti)->source_line;
+	}
+
+	fprintf(out_fp, (cur_frame > 0 ? _("#%ld\tin ") : "#%ld\t "), cur_frame);
+	print_frame(f->func_node, src, srcline);
+	fprintf(out_fp, "\n");
+	print_lines(src, srcline, 1);
+	last_printed_line = srcline - list_size / 2;
+	if (last_printed_line < 0)
+		last_printed_line = 0;
+}
+
+/* do_frame --- frame command */
+
+int
+do_frame(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	CHECK_PROG_RUNNING();
+	if (arg && arg->type == D_int) {
+		if (arg->a_int < 0 || arg->a_int > fcall_count) {
+			d_error(_("invalid frame number"));
+			return false;
+		}
+		cur_frame = arg->a_int;
+	}
+	print_cur_frame_and_sourceline();
+	return false;
+}
+
+/* do_up --- up command */
+
+int
+do_up(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	CHECK_PROG_RUNNING();
+	if (arg != NULL && arg->type == D_int)
+		cur_frame += arg->a_int;
+	else
+		cur_frame++;
+	if (cur_frame < 0)
+		cur_frame = 0;
+	else if (cur_frame > fcall_count)
+		cur_frame = fcall_count;
+	print_cur_frame_and_sourceline();
+	return false;
+}
+
+/* do_down --- down command */
+
+int
+do_down(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	CHECK_PROG_RUNNING();
+	if (arg != NULL && arg->type == D_int)
+		cur_frame -= arg->a_int;
+	else
+		cur_frame--;
+	if (cur_frame < 0)
+		cur_frame = 0;
+	else if (cur_frame > fcall_count)
+		cur_frame = fcall_count;
+	print_cur_frame_and_sourceline();
+	return false;
+}
+
+/* find_rule --- find a rule or function in file 'src' containing
+ *               source line 'lineno'
+ */
+
+static INSTRUCTION *
+find_rule(char *src, long lineno)
+{
+	INSTRUCTION *rp;
+
+	/*
+	 * FIXME: The check for zero and code that goes with it
+	 * are probably fragile.  A break with no arguments can
+	 * cause this in certain cases. Try to review how this works.
+	 */
+	if (lineno == 0) {
+		for (rp = rule_list->nexti; rp != NULL; rp = rp->nexti) {
+			if ((rp - 1)->source_file == src && (rp - 1)->source_line > 0)
+				return (rp - 1);
+		}
+	} else {
+		for (rp = rule_list->nexti; rp != NULL; rp = rp->nexti) {
+			if ((rp - 1)->source_file == src
+					&& lineno >= (rp + 1)->first_line
+					&& lineno <= (rp + 1)->last_line)
+				return (rp - 1);
+		}
+	}
+	return NULL;
+}
+
+/* mk_breakpoint --- create a breakpoint instruction and the corresponding
+ *                   breakpoint structure.
+ */
+
+static INSTRUCTION *
+mk_breakpoint(char *src, int srcline)
+{
+	INSTRUCTION *bp;
+	BREAKPOINT *b;
+
+	bp = bcalloc(Op_breakpoint, 1, srcline);
+	emalloc(b, BREAKPOINT *, sizeof(BREAKPOINT), "mk_breakpoint");
+	memset(&b->cndn, 0, sizeof(struct condition));
+	b->commands.next = b->commands.prev = &b->commands;
+	b->silent = false;
+
+
+	b->number = ++watch_list.number;	/* breakpoints and watchpoints use same counter */
+	b->ignore_count = 0;
+	b->hit_count = 0;
+	b->flags = BP_ENABLE;
+	b->src = src;
+	bp->break_pt = b;
+	b->bpi = bp;
+
+	/* prepend to list */
+	b->next = breakpoints.next;
+	b->prev = &breakpoints;
+	breakpoints.next = b;
+	b->next->prev = b;
+	return bp;
+}
+
+/* delete_breakpoint --- delete a breakpoint structure and
+ *                       disable the breakpoint instruction.
+ */
+
+static void
+delete_breakpoint(BREAKPOINT *b)
+{
+	INSTRUCTION *pc = b->bpi;
+	struct commands_item *c;
+
+	/* N.B.: easiest thing to do is to turn Op_breakpoint into a no-op;
+	 * deleteing the instruction is not that simple,
+	 * since could have reference to it somewhere else (e.g. cur_pc).
+	 */
+
+	pc->opcode = Op_no_op;
+	pc->source_line = 0;
+	pc->break_pt = NULL;
+
+	/* delete commands */
+	for (c = b->commands.next; c != &b->commands; c = c->next) {
+		c = c->prev;
+		delete_commands_item(c->next);
+	}
+
+	free_context(b->cndn.ctxt, false);
+	if (b->cndn.expr != NULL)
+		efree(b->cndn.expr);
+
+	/* remove from list */
+	b->next->prev = b->prev;
+	b->prev->next = b->next;
+	efree(b);
+}
+
+/* find_breakpoint --- find the breakpoint structure from a breakpoint number */
+
+static BREAKPOINT *
+find_breakpoint(long num)
+{
+	BREAKPOINT *b;
+
+	if (num <= 0)
+		return NULL;
+
+	for (b = breakpoints.next; b != &breakpoints; b = b->next) {
+		if (b->number == num)
+			return b;
+	}
+	return NULL;
+}
+
+/* add_breakpoint --- add a breakpoint instruction between PREVP and IP */
+
+static BREAKPOINT *
+add_breakpoint(INSTRUCTION *prevp, INSTRUCTION *ip, char *src, bool silent)
+{
+	BREAKPOINT *b;
+	INSTRUCTION *bp;
+	int lineno = ip->source_line;
+
+	/* add new breakpoint instruction at the end of
+	 * already set breakpoints at this line number.
+	 */
+
+	while (ip->opcode == Op_breakpoint && ip->source_line == lineno) {
+		if (! silent) {
+			b = ip->break_pt;
+			/*
+			 * This is more verbose that it might otherwise be,
+			 * in order to provide easily translatable strings.
+			 */
+			if ((b->flags & BP_ENABLE) != 0) {
+				if ((b->flags & BP_IGNORE) != 0)
+					fprintf(out_fp,
+			_("Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"),
+						b->number,
+						b->ignore_count,
+						b->src,
+						lineno);
+				else
+					fprintf(out_fp,
+			_("Note: breakpoint %d (enabled), also set at %s:%d"),
+						b->number,
+						b->src,
+						lineno);
+			} else {
+				if ((b->flags & BP_IGNORE) != 0)
+					fprintf(out_fp,
+			_("Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"),
+						b->number,
+						b->ignore_count,
+						b->src,
+						lineno);
+				else
+					fprintf(out_fp,
+			_("Note: breakpoint %d (disabled), also set at %s:%d"),
+						b->number,
+						b->src,
+						lineno);
+			}
+		}
+		prevp = ip;
+		ip = ip->nexti;
+	}
+
+	assert(ip->source_line == lineno);
+
+	bp = mk_breakpoint(src, lineno);
+	prevp->nexti = bp;
+	bp->nexti = ip;
+	b = bp->break_pt;
+	if (! silent)
+		fprintf(out_fp, _("Breakpoint %d set at file `%s', line %d\n"),
+						b->number, src, lineno);
+	return b;
+}
+
+/* set_breakpoint_at --- set a breakpoint at given line number*/
+
+static BREAKPOINT *
+set_breakpoint_at(INSTRUCTION *rp, int lineno, bool silent)
+{
+	INSTRUCTION *ip, *prevp;
+
+	for (prevp = rp, ip = rp->nexti; ip; prevp = ip, ip = ip->nexti) {
+		if (ip->opcode == Op_K_case) {
+			INSTRUCTION *i1, *i2;
+
+			/* Special case: the code line numbers for a switch do not form
+			 * a monotonically increasing sequence. Check if the line # is between
+			 * the first and last statements of the case block before continuing
+			 * the search.
+			 */
+			for (i2 = ip->stmt_start, i1 = i2->nexti; i2 != ip->stmt_end;
+								i2 = i1, i1 = i1->nexti) {
+				if (i1->source_line >= lineno)
+					return add_breakpoint(i2, i1, rp->source_file, silent);
+				if (i1 == ip->stmt_end)
+					break;
+			}
+		}
+
+		if (ip->source_line >= lineno)
+			return add_breakpoint(prevp, ip, rp->source_file, silent);
+		if (ip == (rp + 1)->lasti)
+			break;
+	}
+	return NULL;
+}
+
+/* set_breakpoint_next --- set a breakpoint at the next instruction */
+
+static BREAKPOINT *
+set_breakpoint_next(INSTRUCTION *rp, INSTRUCTION *ip)
+{
+	INSTRUCTION *prevp;
+
+	if (ip == (rp + 1)->lasti)
+		return NULL;
+	prevp = ip;
+	if (ip->opcode != Op_breakpoint)
+		ip = ip->nexti;
+	for (; ip; prevp = ip, ip = ip->nexti) {
+		if (ip->source_line > 0)
+			return add_breakpoint(prevp, ip, rp->source_file, false);
+		if (ip == (rp + 1)->lasti)
+			break;
+	}
+	return NULL;
+}
+
+/* set_breakpoint --- set a breakpoint */
+
+static int
+set_breakpoint(CMDARG *arg, bool temporary)
+{
+	int lineno;
+	BREAKPOINT *b = NULL;
+	INSTRUCTION *rp, *ip;
+	NODE *func;
+	SRCFILE *s = cur_srcfile;
+	char *src = cur_srcfile->src;
+
+	if (arg == NULL) {
+/*
+* (From GDB Documentation):
+*
+* When called without any arguments, break sets a breakpoint at the next instruction
+* to be executed in the selected stack frame (see section Examining the Stack).
+* In any selected frame but the innermost, this makes your program stop as soon
+* as control returns to that frame. This is similar to the effect of a finish command
+* in the frame inside the selected frame--except that finish does not leave an
+* active breakpoint. If you use break without an argument in the innermost frame,
+* GDB stops the next time it reaches the current location; this may be useful
+* inside loops.
+* GDB normally ignores breakpoints when it resumes execution, until at least
+* one instruction has been executed. If it did not do this,
+* you would be unable to proceed past a breakpoint without first disabling the
+* breakpoint. This rule applies whether or not the breakpoint already existed
+* when your program stopped.
+*/
+		CHECK_PROG_RUNNING();
+		if (cur_frame == 0) {
+			src = source;
+			ip = cur_pc;
+		} else {
+			NODE *f;
+			f = find_frame(cur_frame);
+			src = f->vname;
+			ip = (INSTRUCTION *) find_frame(cur_frame - 1)->reti;  /* Op_func_call */
+		}
+		rp = find_rule(src, ip->source_line);
+		assert(rp != NULL);
+		if ((b = set_breakpoint_next(rp, ip)) == NULL)
+			fprintf(out_fp, _("Can't set breakpoint in file `%s'\n"), src);
+		else {
+			if (cur_frame == 0) {	/* stop next time */
+				b->flags |= BP_IGNORE;
+				b->ignore_count = 1;
+			}
+			if (temporary)
+				b->flags |= BP_TEMP;
+		}
+		return false;
+	}
+
+	/* arg != NULL */
+
+	switch (arg->type) {
+	case D_string:	/* break filename:lineno|function */
+		s = source_find(arg->a_string);
+		arg = arg->next;
+		if (s == NULL || arg == NULL
+				|| (arg->type != D_int && arg->type != D_func))
+			return false;
+		src = s->src;
+		if (arg->type == D_func) /* break filename:function */
+			goto func;
+		else
+			/* fall through */
+	case D_int:		/* break lineno */
+		lineno = (int) arg->a_int;
+		if (lineno <= 0 || lineno > s->srclines)
+			d_error(_("line number %d in file `%s' out of range"), lineno, src);
+		else {
+			rp = find_rule(src, lineno);
+			if (rp == NULL)
+				fprintf(out_fp, _("Can't find rule!!!\n"));
+			if (rp == NULL || (b = set_breakpoint_at(rp, lineno, false)) == NULL)
+				fprintf(out_fp, _("Can't set breakpoint at `%s':%d\n"),
+						src, lineno);
+			if (b != NULL && temporary)
+				b->flags |= BP_TEMP;
+		}
+		break;
+
+	case D_func:	/* break function */
+func:
+		func = arg->a_node;
+		rp = func->code_ptr;
+		if ((b = set_breakpoint_at(rp, rp->source_line, false)) == NULL)
+			fprintf(out_fp, _("Can't set breakpoint in function `%s'\n"),
+						func->vname);
+		else if (temporary)
+			b->flags |= BP_TEMP;
+		lineno = b->bpi->source_line;
+		break;
+
+	default:
+		return false;
+	}
+	/* condition if any */
+	arg = arg->next;
+	if (b != NULL && arg != NULL) {
+		if (parse_condition(D_break, b->number, arg->a_string) == 0)
+			arg->a_string = NULL;	/* don't let free_cmdarg free it */
+		else
+			fprintf(out_fp, _("breakpoint %d set at file `%s', line %d is unconditional\n"),
+							b->number, src, lineno);
+	}
+	return false;
+}
+
+
+/* breakpoint_triggered --- check if we should stop at this breakpoint */
+
+static int
+breakpoint_triggered(BREAKPOINT *b)
+{
+	if ((b->flags & BP_ENABLE) == 0)
+		return 0;
+	if ((b->flags & BP_IGNORE) != 0) {
+		if (--b->ignore_count <= 0)
+			b->flags &= ~BP_IGNORE;
+		return 0;
+	}
+
+	if (! condition_triggered(&b->cndn))
+		return 0;
+
+	b->hit_count++;
+	if ((b->flags & BP_ENABLE_ONCE) != 0) {
+		b->flags &= ~BP_ENABLE_ONCE;
+		b->flags &= ~BP_ENABLE;
+	}
+	return b->number;
+}
+
+/* do_breakpoint --- break command */
+
+int
+do_breakpoint(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	return set_breakpoint(arg, false);
+}
+
+/* do_tmp_breakpoint --- tbreak command */
+
+int
+do_tmp_breakpoint(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	return set_breakpoint(arg, true);
+}
+
+/* do_clear --- clear command */
+
+int
+do_clear(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	int lineno;
+	BREAKPOINT *b;
+	INSTRUCTION *rp, *ip;
+	NODE *func;
+	SRCFILE *s = cur_srcfile;
+	char *src = cur_srcfile->src;
+	int bp_found = 0;
+
+	if (arg == NULL) {	/* clear */
+		CHECK_PROG_RUNNING();
+		if (cur_frame == 0) {
+			lineno = sourceline;
+			src = source;
+		} else {
+			NODE *f;
+			f = find_frame(cur_frame);
+			src = f->vname;
+			lineno = ((INSTRUCTION *) find_frame(cur_frame - 1)->reti)->source_line;
+		}
+		goto delete_bp;
+	}
+
+	switch (arg->type) {
+	case D_string:	/* clear filename:lineno|function */
+		s = source_find(arg->a_string);
+		arg = arg->next;
+		if (s == NULL || arg == NULL ||
+				(arg->type != D_int && arg->type != D_func))
+			return false;
+		src = s->src;
+		if (arg->type == D_func)
+			goto func;
+		/* else
+			fall through */
+	case D_int:	/* clear lineno */
+		lineno = (int) arg->a_int;
+		if (lineno <= 0 || lineno > s->srclines) {
+			d_error(_("line number %d in file `%s' out of range"), lineno, src);
+			return false;
+		}
+		break;
+
+	case D_func:	/* clear function */
+func:
+		func = arg->a_node;
+		rp = func->code_ptr;
+		for (ip = rp->nexti; ip; ip = ip->nexti) {
+			if (ip->source_line <= 0)
+				continue;
+			if (ip->opcode != Op_breakpoint)
+				break;
+			b = ip->break_pt;
+			if (++bp_found == 1)
+				fprintf(out_fp, _("Deleted breakpoint %d"), b->number);
+			else
+				fprintf(out_fp, ", %d", b->number);
+			delete_breakpoint(b);
+		}
+		if (bp_found == 0)
+			fprintf(out_fp, _("No breakpoint(s) at entry to function `%s'\n"),
+					func->vname);
+		else
+			fprintf(out_fp, "\n");
+		/* fall through */
+	default:
+		return false;
+	}
+
+delete_bp:
+	rp = find_rule(src, lineno);
+	if (rp != NULL) {
+		for (ip = rp->nexti; ip; ip = ip->nexti) {
+			if (ip->opcode == Op_breakpoint	&& ip->source_line == lineno) {
+				b = ip->break_pt;
+				if (++bp_found == 1)
+					fprintf(out_fp, _("Deleted breakpoint %d"), b->number);
+				else
+					fprintf(out_fp, ", %d", b->number);
+				delete_breakpoint(b);
+			}
+			if (ip == (rp + 1)->lasti)
+				break;
+		}
+	}
+
+	if (bp_found == 0)
+		fprintf(out_fp, _("No breakpoint at file `%s', line #%d\n"),
+					src, (int) lineno);
+	else
+		fprintf(out_fp, "\n");
+	return false;
+}
+
+/* enable_breakpoint --- enable a breakpoint and set its disposition */
+
+static inline void
+enable_breakpoint(BREAKPOINT *b, short disp)
+{
+	b->flags &= ~(BP_ENABLE_ONCE|BP_TEMP);
+	b->flags |= BP_ENABLE;
+	if (disp)
+		b->flags |= disp;
+}
+
+/* do_enable_breakpoint --- enable command */
+
+int
+do_enable_breakpoint(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	BREAKPOINT *b;
+	short disp = 0;
+
+	if (arg != NULL && arg->type == D_argument) {
+		if (arg->a_argument == A_DEL)	/* del */
+			disp = BP_TEMP;
+		else						/* once */
+			disp = BP_ENABLE_ONCE;
+		arg = arg->next;
+	}
+
+	if (arg == NULL) {	/* enable [once|del] */
+		for (b = breakpoints.next; b != &breakpoints; b = b->next)
+			enable_breakpoint(b, disp);
+	}
+
+	for (; arg != NULL; arg = arg->next) {
+		if (arg->type == D_range) {
+			long i, j;
+
+			i = arg->a_int;
+			arg = arg->next;
+			j = arg->a_int;
+			if (j > breakpoints.number)
+				j = breakpoints.number;
+			for (; i <= j; i++) {
+				if ((b = find_breakpoint(i)) != NULL)
+					enable_breakpoint(b, disp);
+			}
+		} else {
+			assert(arg->type == D_int);
+			if ((b = find_breakpoint(arg->a_int)) == NULL)
+				d_error(_("invalid breakpoint number"));
+			else
+				enable_breakpoint(b, disp);
+		}
+	}
+	return false;
+}
+
+/* do_delete_breakpoint --- delete command */
+
+int
+do_delete_breakpoint(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	if (arg == NULL) {
+		bool delete_all = true;
+		delete_all = prompt_yes_no(
+					_("Delete all breakpoints? (y or n) "),
+					_("y")[0], true, out_fp);
+
+		if (delete_all) {
+			while (breakpoints.next != &breakpoints)
+				delete_breakpoint(breakpoints.next);
+		}
+	}
+
+	for (; arg != NULL; arg = arg->next) {
+		BREAKPOINT *b;
+		if (arg->type == D_range) {
+			long i, j;
+
+			i = arg->a_int;
+			arg = arg->next;
+			j = arg->a_int;
+			if (j > breakpoints.number)
+				j = breakpoints.number;
+			for (; i <= j; i++) {
+				if ((b = find_breakpoint(i)) != NULL)
+					delete_breakpoint(b);
+			}
+		} else {
+			if ((b = find_breakpoint(arg->a_int)) == NULL)
+				d_error(_("invalid breakpoint number"));
+			else
+				delete_breakpoint(b);
+		}
+	}
+	return false;
+}
+
+/* do_ignore_breakpoint --- ignore command */
+
+int
+do_ignore_breakpoint(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	BREAKPOINT *b;
+
+	if (arg == NULL || arg->type != D_int
+			|| arg->next == NULL || arg->next->type != D_int)
+		return false;
+
+	if ((b = find_breakpoint(arg->a_int)) == NULL)
+		d_error(_("invalid breakpoint number"));
+	else {
+		b->ignore_count = arg->next->a_int;
+		if (b->ignore_count > 0) {
+			b->flags |= BP_IGNORE;
+			fprintf(out_fp, _("Will ignore next %ld crossing(s) of breakpoint %d.\n"),
+					b->ignore_count, b->number);
+		} else {
+			b->flags &= ~BP_IGNORE;
+ 			fprintf(out_fp, _("Will stop next time breakpoint %d is reached.\n"),
+					b->number);
+		}
+	}
+	return false;
+}
+
+/* do_disable_breakpoint --- disable command */
+
+int
+do_disable_breakpoint(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	BREAKPOINT *b;
+
+	if (arg == NULL) {
+		/* disable all */
+		for (b = breakpoints.next; b != &breakpoints; b = b->next)
+			b->flags &= ~BP_ENABLE;
+	}
+
+	for (; arg != NULL; arg = arg->next) {
+		if (arg->type == D_range) {
+			long i, j;
+
+			i = arg->a_int;
+			arg = arg->next;
+			j = arg->a_int;
+			if (j > breakpoints.number)
+				j = breakpoints.number;
+			for (; i <= j; i++)
+				if ((b = find_breakpoint(i)) != NULL)
+					b->flags &= ~BP_ENABLE;
+		} else {
+			if ((b = find_breakpoint(arg->a_int)) == NULL)
+				d_error(_("invalid breakpoint number"));
+			else
+				b->flags &= ~BP_ENABLE;
+		}
+	}
+	return false;
+}
+
+#ifdef HAVE_LIBREADLINE
+
+/* get_function --- function definition in current context */
+
+NODE *
+get_function()
+{
+	NODE *func;
+
+	if (! prog_running)
+		return NULL;
+	func = find_frame(cur_frame)->func_node;
+	return func;
+}
+
+/* initialize_readline --- initialize readline */
+
+static void
+initialize_readline()
+{
+	/* tell readline which stream to use for output,
+	 * default input stream is stdin.
+	 */
+	rl_outstream = out_fp;
+
+	/* allow conditional parsing of the ~/.inputrc file. */
+	rl_readline_name = "gawk";
+
+	/* our completion function. */
+	rl_attempted_completion_function = command_completion;
+
+	read_a_line = readline;
+}
+#else
+#define initialize_readline()	/* nothing */
+#endif
+
+
+/* init_debug --- register debugger exec hooks */
+
+void
+init_debug()
+{
+	register_exec_hook(debug_pre_execute, debug_post_execute);
+}
+
+
+/* debug_prog --- debugger entry point */
+
+int
+debug_prog(INSTRUCTION *pc)
+{
+	char *run;
+
+	input_fd = fileno(stdin);
+	out_fp = stdout;
+	if (os_isatty(input_fd))
+		input_from_tty = true;
+	if (input_fd == 0 && input_from_tty)
+		initialize_readline();
+
+	if (! read_a_line)
+		read_a_line = g_readline;
+
+	push_cmd_src(input_fd, input_from_tty, read_a_line, 0, 0, EXIT_FATAL);
+
+	setbuf(out_fp, (char *) NULL);
+	for (cur_srcfile = srcfiles->prev; cur_srcfile != srcfiles;
+			cur_srcfile = cur_srcfile->prev) {
+		if (cur_srcfile->stype == SRC_FILE
+			|| cur_srcfile->stype == SRC_INC)
+			break;
+	}
+
+	if (cur_srcfile == srcfiles) {
+		fprintf(out_fp, _("Can only debug programs provided with the `-f' option.\n"));
+		exit(EXIT_FAILURE);
+	}
+
+	dgawk_prompt = estrdup(DEFAULT_PROMPT, strlen(DEFAULT_PROMPT));
+	dbg_prompt = dgawk_prompt;
+
+	memset(&stop, 0, sizeof(stop));
+	stop.command = D_illegal;
+
+	if ((run = getenv("DGAWK_RESTART")) != NULL) {
+		/* We are restarting; restore state (breakpoints, history etc.)
+		 * passed as environment variables and optionally execute the run command.
+		 */
+		unserialize_list(BREAK);
+		unserialize_list(WATCH);
+		unserialize_list(DISPLAY);
+		unserialize_list(HISTORY);
+		unserialize_list(OPTION);
+		unsetenv("DGAWK_RESTART");
+		fprintf(out_fp, "Restarting ...\n");
+		if (strcasecmp(run, "true") == 0)
+			(void) do_run(NULL, 0);
+
+	} else if (command_file != NULL) {
+		/* run commands from a file (--debug=file  or -D file) */
+		int fd;
+		fd = open_readfd(command_file);
+		if (fd == INVALID_HANDLE) {
+			fprintf(stderr, _("can't open source file `%s' for reading (%s)"),
+						command_file, strerror(errno));
+			exit(EXIT_FAILURE);
+		}
+		push_cmd_src(fd, false, g_readline, close, 0, EXIT_FAILURE);
+		cmd_src->str = estrdup(command_file, strlen(command_file));
+
+	} else {
+		int fd;
+
+#ifdef HAVE_LIBREADLINE
+		(void) read_history(history_file);
+		sess_history_base = history_length;
+#endif
+
+		/* read saved options */
+		fd = open_readfd(options_file);
+		if (fd > INVALID_HANDLE)
+			push_cmd_src(fd, false, g_readline, close, 0, EXIT_SUCCESS);
+	}
+
+	/* start the command interpreter */
+	read_command();	/* yyparse */
+	return EXIT_SUCCESS;
+}
+
+
+/* N.B.: ignore breakpoints and watchpoints for return command */
+
+/* check_watchpoint --- check if any watchpoint triggered */
+
+static int
+check_watchpoint()
+{
+	struct list_item *w;
+
+	if (stop.command == D_return)
+		return false;
+	for (w = watch_list.prev; w != &watch_list; w = w->prev) {
+		int wnum = watchpoint_triggered(w);
+		if (wnum > 0) {
+			stop.watch_point = wnum;
+			stop.print_frame = true;
+			return true;
+		}
+	}
+	return false;
+}
+
+/* check_breakpoint --- check if breakpoint triggered */
+
+static int
+check_breakpoint(INSTRUCTION **pi)
+{
+	INSTRUCTION *pc;
+
+	pc = *pi;
+	if (stop.command == D_return)
+		return false;
+	if (pc->opcode == Op_breakpoint) {
+		int bnum;
+		*pi = pc->nexti;    /* skip past the breakpoint instruction;
+		                     * interpreter doesn't process Op_breakpoint.
+		                     */
+		bnum = breakpoint_triggered(pc->break_pt);
+		if (bnum > 0) {
+			stop.break_point = bnum;
+			stop.print_frame = true;
+			return true;
+		}
+	}
+	return false;
+}
+
+/* restart --- restart the debugger */
+
+static void
+restart(bool run)
+{
+	/* save state in the environment after serialization */
+	serialize_list(BREAK);
+	serialize_list(WATCH);
+	serialize_list(DISPLAY);
+	serialize_list(HISTORY);
+	serialize_list(OPTION);
+
+	/* tell the new process to restore state from the environment */
+	setenv("DGAWK_RESTART", (run ? "true" : "false"), 1);
+
+	/* close all open files */
+	close_all();
+
+	/* start a new process replacing the current process */
+	execvp(d_argv[0], d_argv);
+
+	/* execvp failed !!! */
+	fprintf(out_fp, _("Failed to restart debugger"));
+	exit(EXIT_FAILURE);
+}
+
+/* do_run --- run command */
+
+int
+do_run(CMDARG *arg ATTRIBUTE_UNUSED, int cmd ATTRIBUTE_UNUSED)
+{
+	if (prog_running) {
+		if (! input_from_tty)
+			need_restart = true;	/* handled later */
+		else {
+			need_restart = prompt_yes_no(
+			         _("Program already running. Restart from beginning (y/n)? "),
+			         _("y")[0], false, out_fp);
+
+			if (! need_restart) {
+				fprintf(out_fp, _("Program not restarted\n"));
+				return false;
+			}
+		}
+	}
+
+	if (need_restart) {
+		/* avoid endless cycles of restarting */
+		if (command_file != NULL) {
+			/* input_from_tty = false */
+			fprintf(stderr, _("error: cannot restart, operation not allowed\n"));
+			exit(EXIT_FAILURE);
+		}
+
+		if (cmd_src->cmd == D_source) {
+			/* input_from_tty = false */
+			fprintf(out_fp, _("error (%s): cannot restart, ignoring rest of the commands\n"), cmd_src->str);
+			pop_cmd_src();
+			return false;
+		}
+
+		restart(true);	/* does not return */
+	}
+
+	fprintf(out_fp, _("Starting program: \n"));
+
+	prog_running = true;
+	fatal_tag_valid = 1;
+	if (setjmp(fatal_tag) == 0)
+		(void) interpret(code_block);
+
+	fatal_tag_valid = 0;
+	prog_running = false;
+	fprintf(out_fp, (! exiting && exit_val != EXIT_SUCCESS)
+				? _("Program exited abnormally with exit value: %d\n")
+				: _("Program exited normally with exit value: %d\n"),
+			exit_val);
+	need_restart = true;
+	return false;
+}
+
+/* do_quit --- quit command */
+
+int
+do_quit(CMDARG *arg ATTRIBUTE_UNUSED, int cmd ATTRIBUTE_UNUSED)
+{
+	bool terminate = true;
+	if (prog_running)
+		terminate = prompt_yes_no(
+		            _("The program is running. Exit anyway (y/n)? "),
+		            _("y")[0], true, out_fp);
+	if (terminate) {
+		close_all();
+		do_trace = false; 	/* don't save 'trace on' */
+
+#ifdef HAVE_LIBREADLINE
+		if (do_save_history && input_from_tty) {
+			int ret;
+			ret = write_history(history_file);
+			if (ret == 0 && history_length > history_size)
+				(void) history_truncate_file(history_file, history_size);
+		}
+#endif
+		if (do_save_options && input_from_tty)
+			save_options(options_file);
+
+		exit(exit_val);
+	}
+	return false;
+}
+
+/* do_continue --- continue command */
+
+int
+do_continue(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	BREAKPOINT *b;
+
+	CHECK_PROG_RUNNING();
+	if (! arg || arg->type != D_int)
+		return true;
+
+	/* arg is breakpoint ignore count if stopped at a breakpoint */
+	if (! stop.break_point) {
+		fprintf(out_fp, _("Not stopped at any breakpoint; argument ignored.\n"));
+		return true;
+	}
+	b = find_breakpoint(stop.break_point);
+	if (b == NULL) {
+		d_error(_("invalid breakpoint number %d."), stop.break_point);
+		return false;
+	}
+	b->flags |= BP_IGNORE;
+	b->ignore_count = arg->a_int;
+	fprintf(out_fp, _("Will ignore next %ld crossings of breakpoint %d.\n"),
+				b->ignore_count, stop.break_point);
+	return true;
+}
+
+/* next_step --- common code for next and step commands */
+
+static int
+next_step(CMDARG *arg, int cmd)
+{
+	CHECK_PROG_RUNNING();
+	if (arg != NULL && arg->type == D_int)
+		stop.repeat_count = arg->a_int;
+	else
+		stop.repeat_count = 1;
+	stop.command = cmd;
+	return true;
+}
+
+/* check_step --- process step command, return true if stopping */
+
+static int
+check_step(INSTRUCTION **pi)
+{
+	if (fcall_count != stop.fcall_count) {
+		stop.fcall_count = fcall_count;
+		stop.sourceline = sourceline;
+		stop.source = source;
+		stop.print_frame = true;
+		return (--stop.repeat_count == 0);
+	}
+
+	if (source != stop.source) {
+		stop.source = source;
+		stop.sourceline = sourceline;
+		return (--stop.repeat_count == 0);
+	}
+
+	if (sourceline != stop.sourceline) {
+		stop.sourceline = sourceline;
+		return (--stop.repeat_count == 0);
+	}
+	return false;
+}
+
+/* do_step -- process step command, return true if stopping */
+
+int
+do_step(CMDARG *arg, int cmd)
+{
+	int ret;
+	ret = next_step(arg, cmd);
+	if (ret) {
+		stop.fcall_count = fcall_count;
+		stop.source = source;
+		stop.sourceline = sourceline;
+		stop.check_func = check_step;
+	}
+	return ret;
+}
+
+/* do_stepi -- process stepi command, return true if stopping */
+
+static int
+check_stepi(INSTRUCTION **pi)
+{
+	return (--stop.repeat_count == 0);
+}
+
+/* do_stepi -- stepi command */
+
+int
+do_stepi(CMDARG *arg, int cmd)
+{
+	int ret;
+	ret = next_step(arg, cmd);
+	if (ret)
+		stop.check_func = check_stepi;
+	return ret;
+}
+
+
+/* check_next -- process next command returning true if stopping */
+
+static int
+check_next(INSTRUCTION **pi)
+{
+	/* make sure not to step inside function calls */
+
+	if (fcall_count < stop.fcall_count) {
+		stop.fcall_count = fcall_count;
+		stop.sourceline = sourceline;
+		stop.source = source;
+		stop.print_frame = true;
+		return (--stop.repeat_count == 0);
+	}
+
+	if (fcall_count == stop.fcall_count) {
+		if (source != stop.source) {
+			stop.source = source;
+			stop.sourceline = sourceline;
+			return (--stop.repeat_count == 0);
+		}
+		if (sourceline != stop.sourceline) {
+			stop.sourceline = sourceline;
+			return (--stop.repeat_count == 0);
+		}
+	}
+
+#if 0
+	/* redundant ? */
+	if (fcall_count > stop.fcall_count) {
+		stop.source = source;
+		stop.sourceline = sourceline;
+	}
+#endif
+
+	return false;
+}
+
+/* do_next -- next command */
+
+int
+do_next(CMDARG *arg, int cmd)
+{
+	int ret;
+
+	ret = next_step(arg, cmd);
+	if (ret) {
+		stop.source = source;
+		stop.sourceline = sourceline;
+		stop.fcall_count = fcall_count;
+		stop.check_func = check_next;
+	}
+	return ret;
+}
+
+/* check_nexti --- process nexti command, returns true if stopping */
+
+static int
+check_nexti(INSTRUCTION **pi)
+{
+	/* make sure not to step inside function calls */
+
+	if (fcall_count < stop.fcall_count) {
+		stop.print_frame = true;
+		stop.fcall_count = fcall_count;
+	}
+	return (fcall_count == stop.fcall_count
+			&& --stop.repeat_count == 0);
+}
+
+/* do_nexti -- nexti command */
+
+int
+do_nexti(CMDARG *arg, int cmd)
+{
+	int ret;
+
+	ret = next_step(arg, cmd);
+	if (ret) {
+		stop.fcall_count = fcall_count;
+		stop.check_func = check_nexti;
+	}
+	return ret;
+}
+
+/* check_finish --- process finish command, returns true if stopping */
+
+static int
+check_finish(INSTRUCTION **pi)
+{
+	if (fcall_count == stop.fcall_count) {
+		stop.print_frame = true;
+		return true;
+	}
+	return false;
+}
+
+/* do_finish --- finish command */
+
+int
+do_finish(CMDARG *arg ATTRIBUTE_UNUSED, int cmd)
+{
+	CHECK_PROG_RUNNING();
+	if (cur_frame == fcall_count) {
+		fprintf(out_fp,
+			_("'finish' not meaningful in the outermost frame main()\n"));
+		return false;
+	}
+	stop.fcall_count = fcall_count - cur_frame - 1;
+	assert(stop.fcall_count >= 0);
+	fprintf(out_fp, _("Run till return from "));
+	print_numbered_frame(cur_frame);
+	stop.check_func = check_finish;
+	stop.command = cmd;
+	stop.print_ret = true;
+	return true;
+}
+
+/* check_return --- process return, returns true if stopping */
+
+static int
+check_return(INSTRUCTION **pi)
+{
+	assert(fcall_count >= stop.fcall_count);
+
+	if (fcall_count == stop.fcall_count) {
+		stop.print_frame = true;
+		return true;
+	}
+
+	if (fcall_count > stop.fcall_count) {	/* innermost frame just returned */
+		/* force this one to return too */
+		NODE *func;
+
+		func = find_frame(cur_frame)->func_node;
+		assert(func != NULL);
+		*pi = (func->code_ptr + 1)->lasti;
+		/* assert((*pi)->opcode == Op_K_return); */
+	}
+
+	return false;
+}
+
+/* do_return --- return command */
+
+int
+do_return(CMDARG *arg, int cmd)
+{
+	NODE *func, *n;
+
+	CHECK_PROG_RUNNING();
+	func = find_frame(cur_frame)->func_node;
+	if (func == NULL) {
+		fprintf(out_fp, _("'return' not meaningful in the outermost frame main()\n"));
+		return false;
+	}
+
+	stop.fcall_count = fcall_count - cur_frame - 1;
+	assert(stop.fcall_count >= 0);
+	stop.pc = (func->code_ptr + 1)->lasti;
+	assert(stop.pc->opcode == Op_K_return);
+	stop.command = cmd;
+
+	stop.check_func = check_return;
+
+	if (arg != NULL && arg->type == D_node)	/* optional return value */
+		n = dupnode(arg->a_node);
+	else
+		n = dupnode(Nnull_string);
+	PUSH(n);
+
+	return true;
+}
+
+/* check_until --- process until, returns true if stopping */
+
+int
+check_until(INSTRUCTION **pi)
+{
+	if (fcall_count < stop.fcall_count) { /* current stack frame returned */
+		stop.print_frame = true;
+		return true;
+	} else if (fcall_count == stop.fcall_count) {
+		if (stop.pc && *pi == stop.pc)		/* until location */
+			return true;
+		if (stop.sourceline > 0		/* until */
+				&& source == stop.source
+				&& sourceline > stop.sourceline)
+			return true;
+	}
+	return false;
+}
+
+/* do_until --- until command */
+
+int
+do_until(CMDARG *arg, int cmd)
+{
+	SRCFILE *s = cur_srcfile;
+	char *src = cur_srcfile->src;
+	int lineno;
+	INSTRUCTION *rp, *ip;
+	NODE *func;
+
+	CHECK_PROG_RUNNING();
+	stop.pc = NULL;
+	stop.sourceline = 0;
+
+	if (arg == NULL) {	/* until without argument */
+
+    /* GDB doc.: continue running until a source line past the current line,
+     * in the current stack frame, is reached. Is used to avoid single
+     * stepping through a loop more than once. ...
+     * This means that when you reach the end of a loop after single
+     * stepping though it, until makes your program continue execution
+     * until it exits the loop. In contrast, a next command at the end
+     * of a loop simply steps back to the beginning of the loop, which
+     * forces you to step through the next iteration.
+     */
+
+		stop.source = source;
+		stop.sourceline = sourceline;
+		stop.fcall_count = fcall_count - cur_frame;
+		stop.check_func = check_until;
+		stop.command = cmd;
+		return true;
+	}
+
+    /* GDB: until location - continue running program until
+     * either the specified location is reached, or the
+     * current stack frame returns.
+     */
+
+	switch (arg->type) {
+	case D_string:	/* until filename : lineno|function */
+		s = source_find(arg->a_string);
+		arg = arg->next;
+		if (s == NULL || arg == NULL
+				|| (arg->type != D_int && arg->type != D_func))
+			return false;
+		src = s->src;
+		if (arg->type == D_func)
+			goto func;
+		/* else
+			fall through */
+	case D_int:	/* until lineno */
+		lineno = arg->a_int;
+		if (lineno <= 0 || lineno > s->srclines) {
+			d_error(_("line number %d in file `%s' out of range"),
+						lineno, src);
+			return false;
+		}
+		break;
+
+	case D_func:	/* until function */
+func:
+		func = arg->a_node;
+		rp = func->code_ptr;
+		for (ip = rp->nexti; ip; ip = ip->nexti) {
+			if (ip->opcode != Op_breakpoint && ip->source_line > 0) {
+				stop.pc = ip;
+				stop.fcall_count = fcall_count - cur_frame;
+				stop.check_func = check_until;
+				stop.command = cmd;
+				return true;
+			}
+		}
+		fprintf(out_fp, _("Can't find specified location in function `%s'\n"),
+				func->vname);
+		/* fall through */
+	default:
+		return false;
+	}
+
+	if ((rp = find_rule(src, lineno)) == NULL) {
+		d_error(_("invalid source line %d in file `%s'"), lineno, src);
+		return false;
+	}
+
+	for (ip = rp->nexti; ip; ip = ip->nexti) {
+		if (ip->opcode != Op_breakpoint && ip->source_line >= lineno) {
+			stop.pc = ip;
+			stop.fcall_count = fcall_count - cur_frame;
+			stop.check_func = check_until;
+			stop.command = cmd;
+			return true;
+		}
+		if (ip == (rp + 1)->lasti)
+			break;
+	}
+	fprintf(out_fp, _("Can't find specified location %d in file `%s'\n"),
+				lineno, src);
+	return false;
+}
+
+/* print_watch_item --- print watched item name, old and current values */
+
+static void
+print_watch_item(struct list_item *w)
+{
+	NODE *symbol, *sub;
+	int i;
+
+	symbol = w->symbol;
+	if (IS_SUBSCRIPT(w)) {
+		fprintf(out_fp, "%s", w->sname);
+		for (i = 0; i < w->num_subs; i++) {
+			sub = w->subs[i];
+			fprintf(out_fp, "[\"%.*s\"]", (int) sub->stlen, sub->stptr);
+		}
+		fprintf(out_fp, "\n");
+	} else if (IS_FIELD(w))
+		fprintf(out_fp, "$%ld\n", get_number_si(symbol));
+	else
+		fprintf(out_fp, "%s\n", w->sname);
+
+
+#define print_value(X, S, V)                                        \
+if (X)                                                              \
+	fprintf(out_fp, "array, %ld elements\n", w->S);                 \
+else if (! w->V)                                                    \
+	fprintf(out_fp, IS_SUBSCRIPT(w) ?                               \
+			_("element not in array\n") : _("untyped variable\n")); \
+else                                                                \
+	valinfo(w->V, fprintf, out_fp);
+
+	fprintf(out_fp, "  Old value: ");
+	print_value((w->flags & OLD_IS_ARRAY) != 0, old_size, old_value);
+	fprintf(out_fp, "  New value: ");
+	print_value((w->flags & CUR_IS_ARRAY) != 0, cur_size, cur_value);
+
+#undef print_value
+}
+
+/* next_command --- (optionally) print stoppage location and reason;
+ *                  also fetch next debug command from the user.
+ */
+
+static void
+next_command()
+{
+	static int last_rule = 0;
+	struct list_item *d = NULL, *w = NULL;
+	BREAKPOINT *b = NULL;
+	SRCFILE *s;
+
+	if (source == NULL) {
+		stop.command = D_illegal;
+		stop.check_func = NULL;
+		return;
+	}
+
+	if (stop.break_point) {
+		b = find_breakpoint(stop.break_point);
+		assert(b != NULL);
+		if (b->silent)
+			goto no_output;
+	} else if (stop.watch_point) {
+		w = find_item(&watch_list, stop.watch_point);
+		if (w->silent)
+			goto no_output;
+	}
+
+	if (cur_rule != last_rule) {
+		fprintf(out_fp, _("Stopping in %s ...\n"), ruletab[cur_rule]);
+		last_rule = cur_rule;
+	}
+
+	if (b != NULL)
+		fprintf(out_fp, "Breakpoint %d, ", b->number);
+	else if (w != NULL) {
+		fprintf(out_fp, "Watchpoint %d: ", w->number);
+		print_watch_item(w);
+	}
+
+	/* frame info */
+	if (stop.print_frame) {
+		print_frame(frame_ptr->func_node, source, sourceline);
+		fprintf(out_fp, "\n");
+		stop.print_frame = false;
+	}
+
+	(void) print_lines(source, sourceline, 1);
+
+	/* automatic display of variables */
+	for (d = display_list.prev; d != &display_list; d = d->prev)
+		display(d);
+
+no_output:
+	/* update last_printed_line, so that  output of 'list' is
+	 * centered around current sourceline
+	 */
+
+	last_printed_line = sourceline - list_size / 2;
+	if (last_printed_line < 0)
+		last_printed_line = 0;
+
+	/* update current source file */
+	s = source_find(source);
+	if (cur_srcfile != s) {
+		if (cur_srcfile->fd != INVALID_HANDLE) {
+			close(cur_srcfile->fd);
+			cur_srcfile->fd = INVALID_HANDLE;
+		}
+		cur_srcfile = s;
+	}
+
+	stop.command = D_illegal;
+	stop.check_func = NULL;
+
+	if (b != NULL) {
+		int ret;
+		ret = execute_commands(&b->commands);
+		if ((b->flags & BP_TEMP) != 0)
+			delete_breakpoint(b);
+		if (ret)	/* resume execution */
+			return;
+	} else if (w != NULL && execute_commands(&w->commands))
+		return;
+
+	read_command();		/* zzparse */
+}
+
+/* debug_post_execute --- post_hook in the interpreter */
+
+static void
+debug_post_execute(INSTRUCTION *pc)
+{
+	if (! in_main_context())
+		return;
+
+	switch (pc->opcode) {
+	case Op_K_next:
+	case Op_K_nextfile:
+	case Op_K_exit:
+		if (stop.command == D_finish) {
+			/* cancel finish command */
+			stop.print_ret = false;
+			stop.print_frame = false;
+			stop.command = D_illegal;
+			stop.check_func = NULL;
+			fprintf(out_fp, _("'finish' not meaningful with non-local jump '%s'\n"),
+							op2str(pc->opcode));
+		} else if (stop.command == D_until) {
+			/* cancel until command */
+			stop.print_frame = false;
+			stop.command = D_illegal;
+			stop.check_func = NULL;
+			fprintf(out_fp, _("'until' not meaningful with non-local jump '%s'\n"),
+							op2str(pc->opcode));
+		}
+		break;
+
+	case Op_K_return:
+		if (stop.command == D_finish
+				&& fcall_count == stop.fcall_count
+				&& stop.print_ret
+		) {
+			NODE *r;
+			/* print the returned value before it disappears. */
+			r = TOP();
+			fprintf(out_fp, "Returned value = ");
+			valinfo(r, fprintf, out_fp);
+			stop.print_ret = false;
+		}
+		break;
+
+	case Op_newfile:
+	case Op_get_record:
+		return;
+
+	default:
+		break;
+	}
+}
+
+/* debug_pre_execute --- pre_hook, called by the interpreter before execution;
+ *                 checks if execution needs to be suspended and control
+ *                 transferred to the debugger.
+ */
+
+static int
+debug_pre_execute(INSTRUCTION **pi)
+{
+	static bool cant_stop = false;
+	NODE *m;
+
+	if (! in_main_context())
+		return pre_execute_code(pi);
+
+	cur_pc = *pi;
+	stop.break_point = 0;
+	stop.watch_point = 0;
+	cur_frame = 0;
+
+	if (do_trace
+		&& cur_pc->opcode != Op_breakpoint
+		&& stop.command != D_return
+	)
+		print_instruction(cur_pc, fprintf, out_fp, false);
+
+/* N.B.: For Op_field_spec_lhs must execute instructions upto Op_field_assign
+ * as a group before stopping. Otherwise, watch/print of field variables
+ * yield surprising results. Ditto for Op_push_lhs for special variables
+ * (upto Op_var_assign, the set_FOO routine).
+ */
+
+	switch (cur_pc->opcode) {
+	case Op_field_spec_lhs:
+		cant_stop = true;
+		break;
+
+	case Op_field_assign:
+		cant_stop = false;
+		return true; /* may stop at next instruction */
+
+	case Op_push_lhs:
+		m = cur_pc->memory;
+		if (m->type == Node_var && m->var_assign)
+			cant_stop = true;
+		break;
+
+	case Op_arrayfor_incr:	/* can have special var as array variable !!! */
+		m = cur_pc->array_var;
+		if (m->type == Node_var && m->var_assign)
+			cant_stop = true;
+		break;
+
+	case Op_var_assign:
+		cant_stop = false;
+		return true; /* may stop at next instruction */
+
+	case Op_rule:
+		cur_rule = cur_pc->in_rule;
+		return true;
+
+	case Op_func:
+	case Op_var_update:
+		return true;
+
+	case Op_breakpoint:
+		break;	/* processed later in check_breakpoint() */
+
+	default:
+		if (cur_pc->source_line <= 0)
+			return true;
+		break;
+	}
+
+	if (cant_stop)
+		return true;
+
+	assert(sourceline > 0);
+
+	/*
+	 * 11/2015: This used to check breakpoints first, but that could
+	 * produce strange behavior, where a watchpoint doesn't print until
+	 * some time after the data changed.  This reworks things so that
+	 * watchpoints are checked first. It's a bit of a hack, but
+	 * the behavior for the user is more logical.
+	 */
+	if (check_watchpoint()) {
+		next_command();	/* return to debugger interface */
+		if (stop.command == D_return)
+			*pi = stop.pc;	/* jump to this instruction */
+		else if (cur_pc->opcode == Op_breakpoint)
+			cur_pc = cur_pc->nexti;    /* skip past the breakpoint instruction */
+	} else if (check_breakpoint(pi)
+			|| (stop.check_func && stop.check_func(pi))) {
+		next_command();	/* return to debugger interface */
+		if (stop.command == D_return)
+			*pi = stop.pc;	/* jump to this instruction */
+	}
+
+	/* if cur_pc == *pi, interpreter executes cur_pc;
+	 * Otherwise, jumps to instruction *pi.
+	 */
+	return (cur_pc == *pi);
+}
+
+/* print_memory --- print a scalar value */
+
+static void
+print_memory(NODE *m, NODE *func, Func_print print_func, FILE *fp)
+{
+	switch (m->type) {
+	case Node_val:
+		if (m == Nnull_string)
+			print_func(fp, "Nnull_string");
+		else if ((m->flags & NUMBER) != 0) {
+#ifdef HAVE_MPFR
+			if ((m->flags & MPFN) != 0)
+				print_func(fp, "%s", mpg_fmt("%R*g", ROUND_MODE, m->mpg_numbr));
+			else if ((m->flags & MPZN) != 0)
+				print_func(fp, "%s", mpg_fmt("%Zd", m->mpg_i));
+			else
+#endif
+				print_func(fp, "%g", m->numbr);
+		} else if ((m->flags & STRING) != 0)
+			pp_string_fp(print_func, fp, m->stptr, m->stlen, '"', false);
+		else if ((m->flags & REGEX) != 0) {
+			print_func(fp, "@");
+			pp_string_fp(print_func, fp, m->stptr, m->stlen, '/', false);
+		} else
+			print_func(fp, "-?-");
+		print_func(fp, " [%s]", flags2str(m->flags));
+		break;
+
+	case Node_regex:
+		pp_string_fp(print_func, fp, m->re_exp->stptr, m->re_exp->stlen, '/', false);
+		break;
+
+	case Node_dynregex:
+		break;
+
+	case Node_param_list:
+		assert(func != NULL);
+		print_func(fp, "%s", func->fparms[m->param_cnt].param);
+		break;
+
+	case Node_var:
+	case Node_var_new:
+	case Node_var_array:
+		print_func(fp, "%s", m->vname);
+		break;
+
+	default:
+		print_func(fp, "?");  /* can't happen */
+	}
+}
+
+/* print_instruction --- print a bytecode */
+
+static void
+print_instruction(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump)
+{
+	int pcount = 0;
+	static NODE *func = NULL;
+	static int noffset = 0;
+
+	if (noffset == 0) {
+		static char buf[50];
+		/* offset for 2nd to last lines in a multi-line output */
+		noffset = sprintf(buf, "[      :%p] %-20.20s: ", (void *) pc,
+				opcode2str(pc->opcode));
+	}
+
+	if (pc->opcode == Op_func) {
+		func = pc->func_body;
+		pcount = func->param_cnt;
+		if (in_dump) {
+			int j;
+			print_func(fp, "\n\t# Function: %s (", func->vname);
+			for (j = 0; j < pcount; j++) {
+				print_func(fp, "%s", func->fparms[j].param);
+				if (j < pcount - 1)
+					print_func(fp, ", ");
+			}
+			print_func(fp, ")\n\n");
+		}
+	} else if (pc->opcode == Op_rule) {
+		if (in_dump)
+			print_func(fp, "\n\t# %s\n\n", ruletab[pc->in_rule]);
+	}
+
+	if (pc->opcode == Op_newfile)
+		print_func(fp, "\n");
+
+	if (pc->source_line <= 0)
+		print_func(fp, "[      :%p] %-20.20s: ", pc, opcode2str(pc->opcode));
+	else
+		print_func(fp, "[%6d:%p] %-20.20s: ",
+		                pc->source_line, pc, opcode2str(pc->opcode));
+
+	if (prog_running && ! in_dump) {
+		/* find Node_func if in function */
+		func = find_frame(0)->func_node;
+	}
+
+
+	switch (pc->opcode) {
+	case Op_K_if:
+		print_func(fp, "[branch_if = %p] [branch_else = %p] [branch_else->lasti = %p]\n",
+				pc->branch_if, pc->branch_else, pc->branch_else->lasti);
+		break;
+
+	case Op_K_else:
+		print_func(fp, "[branch_end = %p]\n", pc->branch_end);
+		break;
+
+	case Op_K_while:
+		print_func(fp, "[while_body = %p] [target_break = %p]\n", (pc+1)->while_body, pc->target_break);
+		break;
+
+	case Op_K_do:
+		print_func(fp, "[doloop_cond = %p] [target_break = %p]", (pc+1)->doloop_cond, pc->target_break);
+		if (pc->comment)
+			print_func(fp, " [comment = %p]", pc->comment);
+		print_func(fp, "\n");
+		if (pc->comment)
+			print_instruction(pc->comment, print_func, fp, in_dump);
+		break;
+
+	case Op_K_for:
+		print_func(fp, "[forloop_cond = %p] ", (pc+1)->forloop_cond);
+		/* fall through */
+	case Op_K_arrayfor:
+		print_func(fp, "[forloop_body = %p] ", (pc+1)->forloop_body);
+		print_func(fp, "[target_break = %p] [target_continue = %p]", pc->target_break, pc->target_continue);
+		if (pc->comment != NULL) {
+			print_func(fp, " [comment = %p]\n", (pc)->comment);
+			print_instruction(pc->comment, print_func, fp, in_dump);
+		} else
+			print_func(fp, "\n");
+		break;
+
+	case Op_K_switch:
+	{
+		bool need_newline = false;
+		print_func(fp, "[switch_start = %p] [switch_end = %p]\n", (pc+1)->switch_start, (pc+1)->switch_end);
+		if (pc->comment || (pc+1)->switch_end->comment)
+			print_func(fp, "%*s", noffset, "");
+		if (pc->comment) {
+			print_func(fp, "[start_comment = %p]", pc->comment);
+			need_newline = true;
+		}
+		if ((pc+1)->switch_end->comment) {
+			print_func(fp, "[end_comment = %p]", (pc + 1)->switch_end->comment);
+			need_newline = true;
+		}
+		if (need_newline)
+			print_func(fp, "\n");
+		if (pc->comment)
+			print_instruction(pc->comment, print_func, fp, in_dump);
+		if ((pc+1)->switch_end->comment)
+			print_instruction((pc+1)->switch_end->comment, print_func, fp, in_dump);
+	}
+		break;
+
+	case Op_K_default:
+		print_func(fp, "[stmt_start = %p] [stmt_end = %p]", pc->stmt_start, pc->stmt_end);
+		if (pc->comment) {
+			print_func(fp, " [comment = %p]\n", pc->comment);
+			print_instruction(pc->comment, print_func, fp, in_dump);
+		} else
+			print_func(fp, "\n");
+		break;
+
+	case Op_var_update:
+		print_func(fp, "[update_%s()]\n", get_spec_varname(pc->update_var));
+		break;
+
+	case Op_var_assign:
+		print_func(fp, "[set_%s()]", get_spec_varname(pc->assign_var));
+		if (pc->assign_ctxt != 0)
+			print_func(fp, " [assign_ctxt = %s]", opcode2str(pc->assign_ctxt));
+		print_func(fp, "\n");
+		break;
+
+	case Op_field_assign:
+		print_func(fp, "[%s]\n", pc->field_assign == reset_record ?
+					"reset_record()" : "invalidate_field0()");
+		break;
+
+	case Op_field_spec_lhs:
+		print_func(fp, "[target_assign = %p] [do_reference = %s]\n",
+				pc->target_assign, pc->do_reference ? "true" : "false");
+		break;
+
+	case Op_func:
+		print_func(fp, "[param_cnt = %d] [source_file = %s]", pcount,
+				pc->source_file ? pc->source_file : "cmd. line");
+		if (pc[3].nexti != NULL) {
+			print_func(fp, "[ns_list = %p]\n", pc[3].nexti);
+			print_ns_list(pc[3].nexti, print_func, fp, in_dump);
+		} else
+			print_func(fp, "\n");
+		break;
+
+	case Op_K_getline_redir:
+		print_func(fp, "[into_var = %s] [redir_type = \"%s\"]\n",
+		                pc->into_var ? "true" : "false",
+		                redir2str(pc->redir_type));
+		break;
+
+	case Op_K_getline:
+		print_func(fp, "[into_var = %s]\n", pc->into_var ? "true" : "false");
+		print_func(fp, "%*s[target_beginfile = %p] [target_endfile = %p]\n",
+		                noffset, "",
+		                (pc + 1)->target_beginfile, (pc + 1)->target_endfile);
+		break;
+
+	case Op_K_print_rec:
+		print_func(fp, "[redir_type = \"%s\"]\n", redir2str(pc->redir_type));
+		break;
+
+	case Op_K_print:
+	case Op_K_printf:
+		print_func(fp, "[expr_count = %ld] [redir_type = \"%s\"]\n",
+		                pc->expr_count, redir2str(pc->redir_type));
+		break;
+
+	case Op_indirect_func_call:
+	case Op_func_call:
+		print_func(fp, "[func_name = %s] [arg_count = %ld]\n",
+		                pc->func_name, (pc + 1)->expr_count);
+		break;
+
+	case Op_K_nextfile:
+		print_func(fp, "[target_newfile = %p] [target_endfile = %p]\n",
+		                pc->target_newfile, pc->target_endfile);
+		break;
+
+	case Op_newfile:
+		print_func(fp, "[target_jmp = %p] [target_endfile = %p]\n",
+		                pc->target_jmp, pc->target_endfile);
+		print_func(fp, "%*s[target_get_record = %p]\n",
+		                noffset, "", (pc + 1)->target_get_record);
+		break;
+
+	case Op_get_record:
+		print_func(fp, "[target_newfile = %p]\n", pc->target_newfile);
+		break;
+
+	case Op_jmp:
+	case Op_jmp_false:
+	case Op_jmp_true:
+	case Op_and:
+	case Op_or:
+	case Op_K_next:
+	case Op_arrayfor_init:
+	case Op_K_break:
+	case Op_K_continue:
+		print_func(fp, "[target_jmp = %p]\n", pc->target_jmp);
+		break;
+
+	case Op_K_exit:
+		print_func(fp, "[target_end = %p] [target_atexit = %p]\n",
+						pc->target_end, pc->target_atexit);
+		break;
+
+	case Op_K_case:
+		print_func(fp, "[target_jmp = %p] [match_exp = %s]",
+						pc->target_jmp,	(pc + 1)->match_exp ? "true" : "false");
+		if (pc->comment) {
+			print_func(fp, " [comment = %p]\n", pc->comment);
+			print_instruction(pc->comment, print_func, fp, in_dump);
+		} else
+			print_func(fp, "\n");
+		break;
+
+	case Op_K_namespace:
+		print_func(fp, "[namespace = %s]", pc->ns_name);
+		if (pc->nexti)
+			print_func(fp, "[nexti = %p]", pc->nexti);
+		if (pc->comment)
+			print_func(fp, "[comment = %p]", pc->comment);
+		print_func(fp, "\n");
+		break;
+
+	case Op_arrayfor_incr:
+		print_func(fp, "[array_var = %s] [target_jmp = %p]\n",
+		                pc->array_var->type == Node_param_list ?
+		                   func->fparms[pc->array_var->param_cnt].param : pc->array_var->vname,
+		                pc->target_jmp);
+		break;
+
+	case Op_line_range:
+		print_func(fp, "[triggered = %ld] [target_jmp = %p]\n",
+		                pc->triggered, pc->target_jmp);
+		break;
+
+	case Op_cond_pair:
+		print_func(fp, "[line_range = %p] [target_jmp = %p]\n",
+		                pc->line_range, pc->target_jmp);
+		break;
+
+	case Op_sub_builtin:
+	{
+		const char *fname = "sub";
+		static const struct flagtab values[] = {
+			{ GSUB, "GSUB" },
+			{ GENSUB, "GENSUB" },
+			{ LITERAL, "LITERAL" },
+			{ 0, NULL }
+		};
+
+		if ((pc->sub_flags & GSUB) != 0)
+			fname = "gsub";
+		else if ((pc->sub_flags & GENSUB) != 0)
+			fname = "gensub";
+		print_func(fp, "%s [arg_count = %ld] [sub_flags = %s]\n",
+				fname, pc->expr_count,
+				genflags2str(pc->sub_flags, values));
+	}
+		break;
+
+	case Op_builtin:
+		print_func(fp, "%s [arg_count = %ld]\n", getfname(pc->builtin, false),
+						pc->expr_count);
+		break;
+
+	case Op_ext_builtin:
+		print_func(fp, "%s [arg_count = %ld]\n", (pc + 1)->func_name,
+						pc->expr_count);
+		break;
+
+	case Op_subscript:
+	case Op_sub_array:
+		print_func(fp, "[sub_count = %ld]\n", pc->sub_count);
+		break;
+
+	case Op_store_sub:
+		print_memory(pc->memory, func, print_func, fp);
+		print_func(fp, " [sub_count = %ld]\n", pc->expr_count);
+		break;
+
+	case Op_subscript_lhs:
+		print_func(fp, "[sub_count = %ld] [do_reference = %s]\n",
+		                pc->sub_count,
+		                pc->do_reference ? "true" : "false");
+		break;
+
+	case Op_K_delete:
+	case Op_in_array:
+		print_func(fp, "[expr_count = %ld]\n", pc->expr_count);
+		break;
+
+	case Op_concat:
+		/* NB: concat_flag CSVAR only used in grammar, don't display it */
+		print_func(fp, "[expr_count = %ld] [concat_flag = %s]\n",
+						pc->expr_count,
+						(pc->concat_flag & CSUBSEP) != 0 ? "CSUBSEP" : "0");
+		break;
+
+	case Op_rule:
+		print_func(fp, "[in_rule = %s] [source_file = %s]",
+		                ruletab[pc->in_rule],
+		                pc->source_file ? pc->source_file : "cmd. line");
+		if (pc[3].nexti != NULL) {
+			print_func(fp, "[ns_list = %p]\n", pc[3].nexti);
+			print_ns_list(pc[3].nexti, print_func, fp, in_dump);
+		} else
+			print_func(fp, "\n");
+		break;
+
+	case Op_lint:
+	{
+		static const char *const linttypetab[] = {
+			"LINT_illegal",
+			"LINT_assign_in_cond",
+			"LINT_no_effect"
+		};
+		print_func(fp, "[lint_type = %s]\n", linttypetab[pc->lint_type]);
+	}
+		break;
+
+	case Op_exec_count:
+		print_func(fp, "[exec_count = %ld]\n", pc->exec_count);
+		break;
+
+ 	case Op_store_var:
+		print_memory(pc->memory, func, print_func, fp);
+		if (pc->initval != NULL) {
+			print_func(fp, " = ");
+			print_memory(pc->initval, func, print_func, fp);
+		}
+		print_func(fp, "\n");
+		break;
+
+	case Op_push_lhs:
+		print_memory(pc->memory, func, print_func, fp);
+		print_func(fp, " [do_reference = %s]\n",
+		                pc->do_reference ? "true" : "false");
+		break;
+
+	case Op_comment:
+		print_memory(pc->memory, func, print_func, fp);
+		print_func(fp, " [comment_type = %s]",
+			pc->memory->comment_type == EOL_COMMENT ?
+						"EOL" : "BLOCK");
+		if (pc->comment) {
+			print_func(fp, " [comment = %p]\n", pc->comment);
+			print_instruction(pc->comment, print_func, fp, in_dump);
+		} else
+			print_func(fp, "\n");
+		break;
+
+	case Op_push_i:
+	case Op_push:
+	case Op_push_arg:
+	case Op_push_arg_untyped:
+	case Op_push_param:
+	case Op_push_array:
+	case Op_push_re:
+	case Op_match_rec:
+	case Op_match:
+	case Op_nomatch:
+	case Op_plus_i:
+	case Op_minus_i:
+	case Op_times_i:
+	case Op_exp_i:
+	case Op_quotient_i:
+	case Op_mod_i:
+	case Op_assign_concat:
+		print_memory(pc->memory, func, print_func, fp);
+		/* fall through */
+	default:
+		print_func(fp, "\n");
+		break;
+	}
+}
+
+/* do_trace_instruction --- trace command */
+
+int
+do_trace_instruction(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	if (arg != NULL && arg->type == D_argument
+			&& arg->a_argument == A_TRACE_ON)
+		do_trace = true;
+	else
+		do_trace = false;
+	return false;
+}
+
+/* print_code --- print a list of instructions */
+
+static int
+print_code(INSTRUCTION *pc, void *x)
+{
+	struct pf_data *data = (struct pf_data *) x;
+	for (; pc != NULL; pc = pc->nexti)
+		print_instruction(pc, data->print_func, data->fp, data->defn /* in_dump */);
+	return 0;
+}
+
+/* print_ns_list --- print the list of namespaces */
+
+static void
+print_ns_list(INSTRUCTION *pc, Func_print print_func, FILE *fp, int in_dump)
+{
+	for (; pc != NULL; pc = pc->nexti) {
+		print_instruction(pc, print_func, fp, in_dump);
+		if (pc->comment != NULL)
+			print_instruction(pc->comment, print_func, fp, in_dump);
+	}
+}
+
+/* do_dump_instructions --- dump command */
+
+int
+do_dump_instructions(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	FILE *fp;
+  	NODE **funcs;
+
+	if (arg != NULL && arg->type == D_string) {
+		/* dump to a file */
+		if ((fp = fopen(arg->a_string, "w")) == NULL) {
+			d_error(_("could not open `%s' for writing (%s)"),
+					arg->a_string, strerror(errno));
+			return false;
+		}
+		pf_data.print_func = fprintf;
+		pf_data.fp = fp;
+		pf_data.defn = true;	/* in_dump = true */
+		(void) print_code(code_block, &pf_data);
+		funcs = function_list(true);
+		(void) foreach_func(funcs,
+		                     (int (*)(INSTRUCTION *, void *)) print_code,
+		                     &pf_data);
+		efree(funcs);
+		fclose(fp);
+		return false;
+	}
+
+	funcs = function_list(true);
+	initialize_pager(out_fp);
+	if (setjmp(pager_quit_tag) == 0) {
+		pf_data.print_func = gprintf;
+		pf_data.fp = out_fp;
+		pf_data.defn = true;	/* in_dump = true */
+		(void) print_code(code_block, &pf_data);
+		(void) foreach_func(funcs,
+		                    (int (*)(INSTRUCTION *, void *)) print_code,
+		                     &pf_data);
+	}
+	efree(funcs);
+	return false;
+}
+
+/* do_save --- save command */
+
+int
+do_save(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+#if defined(HAVE_LIBREADLINE) && defined(HAVE_HISTORY_LIST)
+	FILE *fp;
+	HIST_ENTRY **hist_list;
+	int i;
+
+	if ((fp = fopen(arg->a_string, "w")) == NULL) {
+		d_error(_("could not open `%s' for writing (%s)"),
+				arg->a_string, strerror(errno));
+		return false;
+	}
+
+	hist_list = history_list();
+	if (hist_list && history_length > sess_history_base) {
+		for (i = sess_history_base; hist_list[i] != NULL; i++) {
+			char *line;
+			line = hist_list[i]->line;
+
+			/* exclude save commands;
+			 * N.B.: this test may fail if there is another
+			 * command with the same first 2 letters.
+			 */
+
+			if (strlen(line) > 1
+			    && strncmp(line, "sa", 2) == 0)
+				continue;
+
+			fprintf(fp, "%s\n", line);
+		}
+	}
+	fclose(fp);
+#endif
+	return false;
+}
+
+/* do_option --- option command */
+
+int
+do_option(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	const struct dbg_option *opt;
+	char *name, *value;
+
+	if (arg == NULL) {	/* display all available options and corresponding values */
+		for (opt = option_list; opt->name; opt++) {
+			if (opt->str_val != NULL)
+				fprintf(out_fp, "%s = \"%s\"\n", opt->name, *(opt->str_val));
+			else
+				fprintf(out_fp, "%s = %d\n", opt->name, *(opt->num_val));
+		}
+		return false;
+	}
+
+	name = arg->a_string;
+	arg = arg->next;
+	value = arg ? arg->a_string : NULL;
+
+	for (opt = option_list; opt->name; opt++) {	/* linear search */
+		if (strcmp(name, opt->name) == 0)
+			break;
+	}
+	if (! opt->name)
+		return false;
+
+	if (value == NULL) {	/* display current setting */
+		if (opt->str_val != NULL)
+			fprintf(out_fp, "%s = \"%s\"\n", opt->name, *(opt->str_val));
+		else
+			fprintf(out_fp, "%s = %d\n", opt->name, *(opt->num_val));
+	} else
+		(*(opt->assign))(value);
+	return false;
+}
+
+
+#ifdef HAVE_LIBREADLINE
+
+/* initialize_pager --- initialize our idea of the terminal size */
+
+void
+initialize_pager(FILE *fp)
+{
+	if (! os_isatty(fileno(fp)) || ! input_from_tty || input_fd != 0) {
+		screen_width = INT_MAX;
+		screen_height = INT_MAX;
+	} else {
+		/* get the terminal size from readline. */
+
+		rl_reset_terminal(NULL); /* N.B.: NULL argument means
+		                          * "use TERM env variable for terminal name".
+		                          */
+		rl_get_screen_size(&screen_height, &screen_width);
+		if (screen_height <= 1)
+			screen_height = INT_MAX;
+		if (screen_width <= 1)
+			screen_width = INT_MAX;
+	}
+	pager_lines_printed = 0;
+}
+#endif
+
+static void
+prompt_continue(FILE *fp)
+{
+	bool quit_pager = false;
+
+	if (os_isatty(fileno(fp)) && input_fd == 0)
+		quit_pager = prompt_yes_no(
+	                _("\t------[Enter] to continue or q [Enter] to quit------"),
+	                _("q")[0], false, fp);
+	if (quit_pager)
+		longjmp(pager_quit_tag, 1);
+	pager_lines_printed = 0;
+}
+
+/* gprintf --- like fprintf but allows paging */
+
+int
+gprintf(FILE *fp, const char *format, ...)
+{
+	va_list args;
+	static char *buf = NULL;
+	static size_t buflen = 0;
+	static int bl = 0;
+	char *p, *q;
+	int nchar;
+
+#define GPRINTF_BUFSIZ 512
+	if (buf == NULL) {
+		buflen = GPRINTF_BUFSIZ;
+		emalloc(buf, char *, buflen * sizeof(char), "gprintf");
+	} else if (buflen - bl < GPRINTF_BUFSIZ/2) {
+		buflen += GPRINTF_BUFSIZ;
+		erealloc(buf, char *, buflen * sizeof(char), "gprintf");
+	}
+#undef GPRINTF_BUFSIZ
+
+	while (true) {
+		va_start(args, format);
+		nchar = vsnprintf(buf + bl, buflen - bl, format, args);
+		va_end(args);
+		if (nchar == 0)
+			return 0;
+		if (nchar > 0 && nchar < buflen - bl) {
+			bl += nchar;
+			if (buf[bl-1] != '\n') /* buffer output until see a newline at end */
+				return nchar;
+			break;
+		}
+
+		/* enlarge buffer, and try again */
+		buflen *= 2;
+		erealloc(buf, char *, buflen * sizeof(char), "gprintf");
+	}
+
+	bl = 0;
+	for (p = buf; (q = strchr(p, '\n')) != NULL; p = q + 1) {
+		int sz = (int) (q - p);
+
+		while (sz > 0) {
+			int cnt;
+			cnt = sz > screen_width ? screen_width : sz;
+
+			/* do not print partial line before scrolling */
+			if (cnt < sz && (pager_lines_printed == (screen_height - 2)))
+				prompt_continue(fp);
+
+			if (fwrite(p, sizeof(char), cnt, fp) != cnt)
+				return -1;
+			if (cnt == sz)
+				break;
+			else {
+				if (++pager_lines_printed == (screen_height - 1))
+					prompt_continue(fp);
+				sz -= screen_width;
+				assert(sz > 0);
+				p += cnt;
+			}
+		}
+
+		fprintf(fp, "\n");
+		if (++pager_lines_printed == (screen_height - 1))
+			prompt_continue(fp);
+		p++;
+	}
+	return nchar;
+}
+
+
+static int
+serialize_subscript(char *buf, int buflen, struct list_item *item)
+{
+	int bl, nchar, i;
+	NODE *sub;
+
+	nchar = snprintf(buf, buflen, "%d%c%d%c%s%c%d%c",
+				item->number, FSEP, D_subscript, FSEP, item->sname, FSEP,
+				item->num_subs, FSEP);
+	if (nchar <= 0)
+		return 0;
+	else if (nchar >= buflen)	/* need larger buffer */
+		return nchar;
+ 	bl = nchar;
+	for (i = 0; i < item->num_subs; i++) {
+		sub = item->subs[i];
+		nchar = snprintf(buf + bl, buflen - bl, "%lu%c%.*s%c",
+					(unsigned long) sub->stlen, FSEP,
+					(int) sub->stlen, sub->stptr, FSEP);
+		if (nchar <= 0)
+			return 0;
+		bl += nchar;
+		if (bl >= buflen)	/* need larger buffer */
+			return bl;
+	}
+	return bl;
+}
+
+
+
+/* serialize_list--- convert a list structure to a byte stream and
+ *               save in environment.
+ */
+
+static void
+serialize_list(int type)
+{
+	static char *buf = NULL;
+	static int buflen = 0;
+	int bl;
+	BREAKPOINT *b = NULL;
+	struct list_item *wd = NULL;
+	HIST_ENTRY **hist_list = NULL;
+	int hist_index = 0;
+	struct dbg_option *opt = NULL;
+	struct commands_item *commands = NULL, *c;
+	int cnum = 0;
+	struct condition *cndn = NULL;
+	void *ptr, *end_ptr;
+#ifdef HAVE_LIBREADLINE
+	HIST_ENTRY *h = NULL;
+#endif
+
+	switch (type) {
+	case BREAK:
+		end_ptr = (void *) &breakpoints;
+		ptr = (void *) breakpoints.prev;
+		break;
+	case WATCH:
+		end_ptr = (void *) &watch_list;
+		ptr = (void *) watch_list.prev;
+		break;
+	case DISPLAY:
+		end_ptr = (void *) &display_list;
+		ptr = (void *) display_list.prev;
+		break;
+	case HISTORY:
+		hist_list = history_list();
+		if (hist_list == NULL) /* empty history list */
+			return;
+		end_ptr = NULL;
+		ptr = (void *) hist_list[0];
+		break;
+	case OPTION:
+	{
+		int n;
+		n = sizeof(option_list)/sizeof(option_list[0]);
+		end_ptr = (void *) &option_list[n - 1];
+		ptr = (void *) option_list;
+	}
+		break;
+
+	default:
+		return;
+	}
+
+	if (type != HISTORY && ptr == end_ptr)		/* empty list */
+		return;
+
+#define SERIALIZE_BUFSIZ 512
+
+	if (buf == NULL) {	/* first time */
+		buflen = SERIALIZE_BUFSIZ;
+		emalloc(buf, char *, buflen + 1, "serialize");
+	}
+	bl = 0;
+
+	while (ptr != end_ptr) {
+		int nchar = 0;
+		if (buflen - bl < SERIALIZE_BUFSIZ/2) {
+enlarge_buffer:
+			buflen *= 2;
+			erealloc(buf, char *, buflen + 1, "serialize");
+		}
+
+#undef SERIALIZE_BUFSIZ
+
+		/* field seperator is FSEP ('\037'), and the record separator is RSEP ('\036') */
+
+		switch (type) {
+		case BREAK:
+			b = (BREAKPOINT *) ptr;
+
+			/* src source_line flags ignore_count hit_count number;
+			 * commands and condition processed later in the end switch
+			 */
+
+			nchar = snprintf(buf + bl, buflen - bl,
+			                 "%s%c%d%c%d%c%d%c%d%c%d%c",
+			                 b->src, FSEP, b->bpi->source_line, FSEP, b->flags, FSEP,
+			                 (int) b->ignore_count, FSEP,
+			                 (int) b->hit_count, FSEP, b->number, FSEP);
+			cnum = b->number;
+			commands = &b->commands;
+			cndn = &b->cndn;
+			break;
+		case DISPLAY:
+		case WATCH:
+			wd = (struct list_item *) ptr;
+
+			/* subscript    -- number type sname num_subs subs(stlen + stptr) [commands [condition]]
+			 * variable     -- number type sname [commands [condition]]
+			 * field        -- number type symbol(numbr) [commands [condition]]
+			 */
+
+			if (IS_PARAM(wd))	/* exclude parameters */
+				nchar = 0;
+			else if (IS_SUBSCRIPT(wd))
+				nchar = serialize_subscript(buf + bl, buflen - bl, wd);
+			else if (IS_FIELD(wd))
+				nchar = snprintf(buf + bl, buflen - bl, "%d%c%d%c%d%c",
+				            wd->number, FSEP, D_field, FSEP, (int) get_number_si(wd->symbol), FSEP);
+			else
+				nchar = snprintf(buf + bl, buflen - bl, "%d%c%d%c%s%c",
+				            wd->number, FSEP, D_variable, FSEP, wd->sname, FSEP);
+			cnum = wd->number;
+			commands = &wd->commands;
+			cndn = &wd->cndn;
+			break;
+		case HISTORY:
+#if defined(HAVE_LIBREADLINE) && defined(HAVE_HISTORY_LIST)
+			h = (HIST_ENTRY *) ptr;
+			nchar = strlen(h->line);
+			if (nchar >= buflen - bl)
+				goto enlarge_buffer;
+			strcpy(buf + bl, h->line);
+#endif
+			break;
+		case OPTION:
+			opt = (struct dbg_option *) ptr;
+			if (opt->num_val != NULL)
+				nchar = snprintf(buf + bl, buflen - bl,
+								"%s%c%d%c", opt->name, FSEP, *(opt->num_val), FSEP);
+			else
+				nchar = snprintf(buf + bl, buflen - bl,
+								"%s%c%s%c", opt->name, FSEP, *(opt->str_val), FSEP);
+			break;
+		default:
+			break;
+		}
+
+		if (nchar == 0)	/* skip empty history lines etc.*/
+			;
+		else if (nchar > 0 && nchar  < buflen - bl) {
+			bl += nchar;
+			buf[bl] = RSEP;	/* record */
+			buf[++bl] = '\0';
+		} else
+			goto enlarge_buffer;
+
+		switch (type) {
+		case BREAK:
+		case WATCH:
+			/* recreate the `commands' command strings including the `commands'
+			 * and `end' commands; command seperator is '\034'.
+			 * re-parsed in unserialize_list to recover the commands list.
+			 * Alternatively, one could encode(serialize) each command and it's arguments.
+			 */
+
+			bl--;	/* undo RSEP from above */
+
+			/* compute required room in buffer */
+			nchar = 0;
+			for (c = commands->next; c != commands; c = c->next) {
+				nchar += (strlen(c->cmd_string) + 1);
+				if (c->cmd == D_eval) {
+					CMDARG *a = c->arg;
+					nchar += (strlen(a->a_string) + 1);	/* awk statements */
+					nchar += (strlen("end") + 1);
+				}
+			}
+
+			if (nchar > 0) {	/* non-empty commands list */
+				nchar += (strlen("commands ") + 20 + strlen("end") + 1); /* 20 for cnum (an int) */
+				if (nchar > buflen - bl) {
+					buflen = bl + nchar;
+					erealloc(buf, char *, buflen + 3, "serialize_list");
+				}
+				nchar = sprintf(buf + bl, "commands %d", cnum);
+				bl += nchar;
+				buf[bl++] = CSEP;
+				for (c = commands->next; c != commands; c = c->next) {
+					nchar = strlen(c->cmd_string);
+					memcpy(buf + bl, c->cmd_string, nchar);
+					bl += nchar;
+					buf[bl++] = CSEP;
+
+					if (c->cmd == D_eval) {
+						CMDARG *a = c->arg;
+						nchar = strlen(a->a_string);	/* statements */
+						memcpy(buf + bl, a->a_string, nchar);
+						bl += nchar;
+						buf[bl++] = CSEP;
+						nchar = strlen("end");	/* end of 'eval' */
+						memcpy(buf + bl, "end", nchar);
+						bl += nchar;
+						buf[bl++] = CSEP;
+					}
+				}
+				nchar = strlen("end");	/* end of 'commands' */
+				memcpy(buf + bl, "end", nchar);
+				bl += nchar;
+			}
+			buf[bl++] = FSEP;		/* field */
+			buf[bl++] = RSEP;		/* record */
+			buf[bl] = '\0';
+
+			/* condition expression */
+			if (cndn->expr) {
+				bl--;	/* undo RSEP from above */
+				nchar = strlen(cndn->expr);
+				if (nchar > buflen - bl) {
+					buflen = bl + nchar;
+					erealloc(buf, char *, buflen + 3, "serialize_list");
+				}
+				memcpy(buf + bl, cndn->expr, nchar);
+				bl += nchar;
+				buf[bl++] = FSEP;		/* field */
+				buf[bl++] = RSEP;		/* record */
+				buf[bl] = '\0';
+			}
+
+			ptr = (type == BREAK) ? (void *) b->prev : (void *) wd->prev;
+			break;
+		case DISPLAY:
+			ptr = (void *) wd->prev;
+			break;
+		case HISTORY:
+			ptr = (void *) hist_list[++hist_index];
+			break;
+		case OPTION:
+			ptr = (void *) (++opt);
+			break;
+		default:
+			break;
+		}
+	}
+
+	if (bl > 0)	/* non-empty list */
+		setenv(env_variable[type], buf, 1);
+}
+
+
+static void
+unserialize_commands(char *str, int str_len)
+{
+	if (str_len <= 0 || str == NULL)
+		return;
+	commands_string = str;
+	commands_string_len = str_len;
+	push_cmd_src(INVALID_HANDLE, false, read_commands_string, 0, 0, EXIT_FATAL);
+	line_sep = CSEP;
+	read_command();		/* forced to return in do_commands */
+	pop_cmd_src();
+}
+
+
+/* unserialize_list_item --- create a list_item structure from unserialized data */
+
+static struct list_item *
+unserialize_list_item(struct list_item *list, char **pstr, int *pstr_len, int field_cnt)
+{
+	int num, type, i;
+	struct list_item *l;
+	NODE *symbol = NULL;
+	int sub_cnt = 0, cnt;
+	NODE **subs = NULL;
+
+	/* subscript	-- number type sname num_subs subs [commands [condition]]
+	 * variable		-- number type sname [commands [condition]]
+	 * field		-- number type symbol(numbr) commands [commands [condition]]
+	 */
+
+	num = strtol(pstr[0], NULL, 0);
+	type = strtol(pstr[1], NULL, 0);
+
+	if (type == D_field) {
+		int field_num;
+		field_num = strtol(pstr[2], NULL, 0);
+		symbol = make_number((AWKNUM) field_num);
+		cnt = 3;
+	} else {
+		char *name;
+		name = estrdup(pstr[2], pstr_len[2]);
+		symbol = find_symbol(name, NULL);
+		efree(name);
+		if (symbol == NULL)
+			return NULL;
+		cnt = 3;
+		if (type == D_subscript) {
+			int sub_len;
+			sub_cnt = strtol(pstr[3], NULL, 0);
+			emalloc(subs, NODE **, sub_cnt * sizeof(NODE *), "unserialize_list_item");
+			cnt++;
+			for (i = 0; i < sub_cnt; i++) {
+				sub_len = strtol(pstr[cnt], NULL, 0);
+				subs[i] = make_string(pstr[cnt + 1], sub_len);
+				cnt += 2;
+			}
+		}
+	}
+
+	l = add_item(list, type, symbol, NULL);
+	if (type == D_subscript) {
+		l->num_subs = sub_cnt;
+		l->subs = subs;
+	}
+	l->number = num;	/* keep same item number across executions */
+
+	if (list == &watch_list) {
+		initialize_watch_item(l);
+		/* unserialize watchpoint `commands' */
+		unserialize_commands(pstr[cnt], pstr_len[cnt]);
+		cnt++;
+		if (field_cnt > cnt) {
+			char *expr;
+			expr = estrdup(pstr[cnt], pstr_len[cnt]);
+			if (parse_condition(D_watch, l->number, expr) != 0)
+				efree(expr);
+		}
+		if (num > list->number)   /* update list number counter */
+			list->number = num;
+	} else
+		list->number = num;
+
+	return l;
+}
+
+/* unserialize_breakpoint --- create a breakpoint structure from unserialized data */
+
+static BREAKPOINT *
+unserialize_breakpoint(char **pstr, int *pstr_len, int field_cnt)
+{
+	char *src;
+	int lineno;
+	BREAKPOINT *b = NULL;
+	INSTRUCTION *rp;
+	SRCFILE *s;
+
+	/* src source_line flags ignore_count hit_count number commands [condition] */
+
+	src = estrdup(pstr[0], pstr_len[0]);
+	s = source_find(src);
+	efree(src);
+	if (s == NULL)
+		return NULL;
+	src = s->src;
+	lineno = strtol(pstr[1], NULL, 0);
+	if (lineno <= 0 || lineno > s->srclines)
+		return NULL;
+	rp = find_rule(src, lineno);
+	if (rp == NULL
+			||  (b = set_breakpoint_at(rp, lineno, true)) == NULL
+	)
+		return NULL;
+
+	b->flags =  strtol(pstr[2], NULL, 0);
+	b->ignore_count = strtol(pstr[3], NULL, 0);
+	b->hit_count = strtol(pstr[4], NULL, 0);
+	b->number =  strtol(pstr[5], NULL, 0);	/* same number as previous run */
+
+	if (field_cnt > 6)	/* unserialize breakpoint `commands' */
+		unserialize_commands(pstr[6], pstr_len[6]);
+
+	if (field_cnt > 7) {	/* condition expression */
+		char *expr;
+		expr = estrdup(pstr[7], pstr_len[7]);
+		if (parse_condition(D_break, b->number, expr) != 0)
+			efree(expr);
+	}
+
+	if (b->number > watch_list.number)  /* watch and break has same number counter */
+		watch_list.number = b->number;  /* update counter */
+	return b;
+}
+
+/* unserialize_option --- set a debugger option from unserialized data. */
+
+static struct dbg_option *
+unserialize_option(char **pstr, int *pstr_len, int field_cnt ATTRIBUTE_UNUSED)
+{
+	const struct dbg_option *opt;
+
+	for (opt = option_list; opt->name; opt++) {
+		if (strncmp(pstr[0], opt->name, pstr_len[0]) == 0) {
+			char *value;
+
+			value = estrdup(pstr[1], pstr_len[1]);
+			(*(opt->assign))(value);
+			efree(value);
+			return ((struct dbg_option *) opt);
+		}
+	}
+	return NULL;
+}
+
+/* unserialize_list -- reconstruct list from serialized data stored in
+ *                environment variable.
+ */
+
+static void
+unserialize_list(int type)
+{
+	char *val;
+	char *p, *q, *r, *s;
+#define MAX_FIELD 30
+	static char *pstr[MAX_FIELD];
+	static int pstr_len[MAX_FIELD];
+
+	val = getenv(env_variable[type]);
+	if (val == NULL)
+		return;
+
+	for (p = val; (q = strchr(p, RSEP)) != NULL; p = q + 1) {
+		int field_cnt = 0;
+		if (type == HISTORY) {
+			*q = '\0';
+			add_history(p);
+			*q = RSEP;
+			continue;
+		}
+
+		r = p;
+		while ((s = strchr(r, FSEP)) != NULL && s < q) {
+			pstr[field_cnt] = r;
+			pstr_len[field_cnt] = (int) (s - r);
+			r = s + 1;
+			field_cnt++;
+			if (field_cnt == MAX_FIELD)
+#ifdef GAWKDEBUG
+				fatal("Increase MAX_FIELD and recompile.");
+#else
+				return;
+#endif
+		}
+
+		switch (type) {
+		case BREAK:
+			(void) unserialize_breakpoint(pstr, pstr_len, field_cnt);
+			break;
+		case DISPLAY:
+			(void) unserialize_list_item(&display_list, pstr, pstr_len, field_cnt);
+			break;
+		case WATCH:
+			(void) unserialize_list_item(&watch_list, pstr, pstr_len, field_cnt);
+			break;
+		case OPTION:
+			(void) unserialize_option(pstr, pstr_len, field_cnt);
+			break;
+		case HISTORY:
+			/* processed at the beginning of for loop */
+			break;
+		default:
+			break;
+		}
+	}
+
+#ifdef HAVE_LIBREADLINE
+	if (type == HISTORY)
+		sess_history_base = history_length;
+#endif
+
+	unsetenv(env_variable[type]);
+#undef MAX_FIELD
+}
+
+static int
+prompt_yes_no(const char *mesg, char res_true, int res_default, FILE *fp)
+{
+	char *in_str;
+	int ret = res_default; /* default */
+
+	if (input_from_tty) {
+		fprintf(fp, "%s", _(mesg));
+		in_str = read_a_line(NULL);
+		if (in_str == NULL)	/* EOF */
+			exit(EXIT_FAILURE);
+		ret = (*in_str == res_true);
+		efree(in_str);
+	}
+	return ret;
+}
+
+/* has_break_or_watch_point --- check if given breakpoint or watchpoint
+ *                              number exists. When flag any is true,
+ *                              check if any breakpoint/watchpoint
+ *                              has been set (ignores num). Returns
+ *                              type (breakpoint or watchpoint) or 0.
+ */
+
+int
+has_break_or_watch_point(int *pnum, bool any)
+{
+	BREAKPOINT *b = NULL;
+	struct list_item *w = NULL;
+
+	if (any) {
+		if (breakpoints.next != &breakpoints)
+			b = breakpoints.next;
+		if (watch_list.next != &watch_list)
+			w = watch_list.next;
+
+		if (! b && ! w)
+			return 0;
+		if (b && ! w) {
+			*pnum = b->number;
+			return D_break;
+		}
+		if (w && ! b) {
+			*pnum = w->number;
+			return D_watch;
+		}
+		if (w->number > b->number) {
+			*pnum = w->number;
+			return D_watch;
+		}
+		*pnum = b->number;
+		return D_break;
+	}
+
+	/* N.B: breakpoints and watchpoints get numbers from a single
+	 * counter/sequencer watch_list.number.
+	 */
+
+	for (b = breakpoints.next; b != &breakpoints; b = b->next) {
+		if (b->number == *pnum)
+			return D_break;
+	}
+	for (w = watch_list.next; w != &watch_list; w = w->next) {
+		if (w->number == *pnum)
+			return D_watch;
+	}
+
+	return 0;
+}
+
+/* delete_commands_item --- delete item(command) from `commands' list. */
+
+static void
+delete_commands_item(struct commands_item *c)
+{
+	efree(c->cmd_string);
+	free_cmdarg(c->arg);
+	c->next->prev = c->prev;
+	c->prev->next = c->next;
+	efree(c);
+}
+
+/* do_commands --- commands command */
+
+int
+do_commands(CMDARG *arg, int cmd)
+{
+	static BREAKPOINT *b;
+	static struct list_item *w;
+	static struct commands_item *commands;
+	struct commands_item *c;
+
+	if (cmd == D_commands) {
+		int num = -1, type;
+		if (arg == NULL)
+			type = has_break_or_watch_point(&num, true);
+		else {
+			num = arg->a_int;
+			type = has_break_or_watch_point(&num, false);
+		}
+		b = NULL;
+		w = NULL;
+		if (type == D_break)
+			b = find_breakpoint(num);
+		else if (type == D_watch)
+			w = find_item(&watch_list, num);
+		assert((b != NULL) || (w != NULL));
+		commands = (b != NULL) ? &b->commands : &w->commands;
+
+		/* delete current commands */
+		for (c = commands->next; c != commands; c = c->next) {
+			c = c->prev;
+			delete_commands_item(c->next);
+		}
+		return false;
+
+	} else if (cmd == D_end) {
+		commands = NULL;
+		if (read_a_line == read_commands_string) /* unserializig commands */
+			return true;	/* done unserializing, terminate zzparse() */
+		return false;
+
+	} else if (cmd == D_silent) {
+		if (b != NULL)
+			b->silent = true;
+		else if (w != NULL)
+			w->silent = true;
+		/* we also append silent command to the list for use
+		 * in `info break(watch)', and to simplify
+		 * serialization/unserialization of commands.
+		 */
+	}
+
+	assert(commands != NULL);
+
+	emalloc(c, struct commands_item *, sizeof(struct commands_item), "do_commands");
+	c->next = NULL;
+	c->cmd = cmd;
+
+	/* N.B.: first arg is the command string, see command.y */
+	c->cmd_string = arg->a_string;
+	c->arg = arg->next; /* actual arguments to the command */
+	efree(arg);
+
+	/* append to the list */
+	c->prev = commands->prev;
+	c->next = commands;
+	commands->prev = c;
+	c->prev->next = c;
+	return false;
+}
+
+/* execute_commands --- execute breakpoint/watchpoint commands, the first
+ *                      command that resumes execution terminates
+ *                      commands processing.
+ */
+
+static int
+execute_commands(struct commands_item *commands)
+{
+	struct commands_item *c;
+	Func_cmd cmd_ptr;
+	bool ret = false;
+
+	for (c = commands->next; c != commands; c = c->next) {
+		if (c->cmd == D_silent)
+			continue;
+		cmd_ptr = get_command(c->cmd);		/* command handler */
+		ret = (*cmd_ptr)(c->arg, c->cmd);
+		if (ret)	/* resume execution (continue, next etc.) */
+			break;
+	}
+	return ret;
+}
+
+/* do_print_f --- printf command */
+
+int
+do_print_f(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	int count = 0;
+	int i;
+	CMDARG *a;
+	NODE **tmp;
+	char *name;
+	NODE *r;
+	volatile jmp_buf fatal_tag_stack;
+
+	/* count maximum required size for tmp */
+	for (a = arg; a != NULL ; a = a->next)
+		count++;
+	emalloc(tmp, NODE **, count * sizeof(NODE *), "do_print_f");
+
+	for (i = 0, a = arg; a != NULL ; i++, a = a->next) {
+		switch (a->type) {
+		case D_variable:
+			name = a->a_string;
+			r = find_symbol(name, NULL);
+			if (r == NULL)
+				goto done;
+			if (r->type == Node_var_new)
+				tmp[i] = Nnull_string;
+			else if (r->type != Node_var) {
+				d_error(_("`%s' is not a scalar variable"), name);
+				goto done;
+			} else
+				tmp[i] = r->var_value;
+			break;
+		case D_field:
+		{
+			long field_num;
+			r = a->a_node;
+			field_num = get_number_si(r);
+			tmp[i] = *get_field(field_num, NULL);
+		}
+			break;
+		case D_subscript:
+		{
+			int cnt = a->a_count;
+			name = a->a_string;
+			r = find_array(name);
+			if (r == NULL)
+				goto done;
+
+			for (; cnt > 0; cnt--) {
+				NODE *value, *subs;
+				a = a->next;
+				subs = a->a_node;
+				value = in_array(r, subs);
+				if (cnt == 1) {
+					if (value == NULL)
+						tmp[i] = Nnull_string;		/* FIXME: goto done ? */
+					else if (value->type == Node_var_array) {
+						d_error(_("attempt to use array `%s[\"%.*s\"]' in a scalar context"),
+									name, (int) subs->stlen, subs->stptr);
+						goto done;
+					} else
+						tmp[i] = value;
+				} else {
+					if (value == NULL) {
+						d_error(_("[\"%.*s\"] not in array `%s'"),
+									(int) subs->stlen, subs->stptr, name);
+						goto done;
+					} else if (value->type != Node_var_array) {
+						d_error(_("attempt to use scalar `%s[\"%.*s\"]' as array"),
+									name, (int) subs->stlen, subs->stptr);
+						goto done;
+					} else {
+						r = value;
+						name = r->vname;
+					}
+				}
+			}
+		}
+			break;
+		case D_node:
+			tmp[i] = a->a_node;
+			break;
+		default:
+			break;
+		}
+	}
+
+	tmp[0] = force_string(tmp[0]);
+
+	PUSH_BINDING(fatal_tag_stack, fatal_tag, fatal_tag_valid);
+	if (setjmp(fatal_tag) == 0)
+		r = format_tree(tmp[0]->stptr, tmp[0]->stlen, tmp, i);
+	else {
+		/* fatal error, restore exit_val of program */
+		exit_val = EXIT_SUCCESS;
+		r = NULL;
+	}
+	POP_BINDING(fatal_tag_stack, fatal_tag, fatal_tag_valid);
+
+	if (r != NULL) {
+		(void) fwrite(r->stptr, sizeof(char), r->stlen, out_fp);
+		unref(r);
+	}
+done:
+	efree(tmp);
+	return false;
+}
+
+/* do_source --- source command */
+
+int
+do_source(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	int fd;
+	char *file = arg->a_string;
+
+	fd = open_readfd(file);
+	if (fd <= INVALID_HANDLE) {
+		d_error(_("can't open source file `%s' for reading (%s)"),
+					file, strerror(errno));
+		return false;
+	}
+
+	push_cmd_src(fd, false, g_readline, close, D_source, EXIT_SUCCESS);
+	cmd_src->str = estrdup(file, strlen(file));
+	return false;
+}
+
+/* open_readfd --- open a file for reading */
+
+static int
+open_readfd(const char *file)
+{
+	int fd;
+
+	fd = open(file, O_RDONLY);
+	if (fd <= INVALID_HANDLE)
+		return INVALID_HANDLE;
+	else if (os_isdir(fd)) {
+		(void) close(fd);
+		errno = EISDIR;
+		return INVALID_HANDLE;
+	}
+	return fd;
+}
+
+/* find_option --- check if option name is valid */
+
+int
+find_option(char *name)
+{
+	const char *p;
+	int idx;
+
+	for (idx = 0; (p = option_list[idx].name); idx++) {
+		if (strcmp(p, name) == 0)
+			return idx;
+	}
+	return -1;
+}
+
+/* option_help --- display help text for debugger options */
+
+void
+option_help()
+{
+	const struct dbg_option *opt;
+
+	for (opt = option_list; opt->name; opt++)
+		fprintf(out_fp, "\t%-15.15s - %s\n", opt->name, _(opt->help_txt));
+}
+
+#ifdef HAVE_LIBREADLINE
+
+/* option_generator --- generator function for option name completion */
+
+char *
+option_generator(const char *text, int state)
+{
+	static size_t textlen;
+	static int idx;
+	const char *name;
+
+	if (! state) {	/* first time */
+		textlen = strlen(text);
+		idx = 0;
+	}
+
+	while ((name = option_list[idx++].name)) {
+		if (strncmp(name, text, textlen) == 0)
+			return estrdup(name, strlen(name));
+	}
+	return NULL;
+}
+
+#endif
+
+/* set_gawk_output --- redirect gawk (normal) output */
+
+static void
+set_gawk_output(const char *file)
+{
+	int fd = INVALID_HANDLE;
+	FILE *fp = NULL;
+
+	if (output_fp != stdout) {
+		if (output_fp != stderr) {
+			fclose(output_fp);
+			efree(output_file);
+		}
+		output_fp = stdout;
+		output_is_tty = os_isatty(fileno(stdout));
+		output_file = "/dev/stdout";
+	}
+
+	if (file == NULL || file[0] == '\0')
+		return;
+
+	errno = 0;
+	if ((fd = os_devopen(file, O_WRONLY)) != INVALID_HANDLE) {
+		fp = fdopen(fd, "w");
+		if (fp == NULL)
+			close(fd);
+
+	} else if (strncmp(file, "/dev/", 5) == 0) {
+		char *cp = (char *) file + 5;
+
+		if (strcmp(cp, "stdout") == 0)
+			return;
+		if (strcmp(cp, "stderr") == 0) {
+			output_fp = stderr;
+			output_file = "/dev/stderr";
+			output_is_tty = os_isatty(fileno(stderr));
+			return;
+		}
+
+		if (strncmp(cp, "fd/", 3) == 0) {
+			cp += 3;
+			fd = (int) strtoul(cp, NULL, 10);
+			if (errno == 0 && fd > INVALID_HANDLE) {
+				fp = fdopen(fd, "w");
+				if (fp == NULL)
+					fd = INVALID_HANDLE;
+			} else
+				fd = INVALID_HANDLE;
+		} else {
+			/* /dev/ttyN, /dev/pts/N, /dev/null etc. */
+			fd = open(file, O_WRONLY);
+		}
+
+		if (fd > INVALID_HANDLE && fp == NULL) {
+			fp = fdopen(fd, "w");
+			if (fp == NULL)
+				close(fd);
+		}
+
+	} else {
+		/* regular file */
+		fp = fopen(file, "w");
+	}
+
+	if (fp != NULL) {
+		output_fp = fp;
+		output_file = estrdup(file, strlen(file));
+		setbuf(fp, (char *) NULL);
+		output_is_tty = os_isatty(fileno(fp));
+	} else {
+		d_error(_("could not open `%s' for writing (%s)"),
+					file,
+					errno != 0 ? strerror(errno) : _("reason unknown"));
+		fprintf(out_fp, _("sending output to stdout\n"));
+	}
+}
+
+/* set_prompt --- set debugger prompt */
+
+static void
+set_prompt(const char *value)
+{
+	efree(dgawk_prompt);
+	dgawk_prompt = estrdup(value, strlen(value));
+	dbg_prompt = dgawk_prompt;
+}
+
+/* set_option_flag --- convert option string to flag value */
+
+static int
+set_option_flag(const char *value)
+{
+	long n;
+	if (strcmp(value, "on") == 0)
+		return true;
+	if (strcmp(value, "off") == 0)
+		return false;
+	errno = 0;
+	n = strtol(value, NULL, 0);
+	return (errno == 0 && n != 0);
+}
+
+/* set_option_num --- set integer option value from string */
+
+static void
+set_option_num(int *pnum, const char *value)
+{
+	long n;
+	errno = 0;
+	n = strtol(value, NULL, 0);
+	if (errno == 0 && n > 0)
+		*pnum = n;
+	else
+		d_error(_("invalid number"));
+}
+
+/* set_listsize --- set list output window size */
+
+static void
+set_listsize(const char *value)
+{
+	set_option_num(&list_size, value);
+}
+
+/* set_trace --- set instruction tracing on or off */
+
+static void
+set_trace(const char *value)
+{
+	do_trace = set_option_flag(value);
+}
+
+/* set_save_history --- save history on exit */
+
+static void
+set_save_history(const char *value)
+{
+	do_save_history = set_option_flag(value);
+}
+
+/* set_save_options --- save options on exit */
+
+static void
+set_save_options(const char *value)
+{
+	do_save_options = set_option_flag(value);
+}
+
+/* set_history_size --- maximum entries in history file */
+
+static void
+set_history_size(const char *value)
+{
+	set_option_num(&history_size, value);
+}
+
+
+/* read_commands_string --- one of the many ways zzlex fetches a line to parse;
+ *                          this one is used to parse `commands' string during
+ *                          unserialization.
+ */
+
+char *
+read_commands_string(const char *prompt ATTRIBUTE_UNUSED)
+{
+	char *p, *end, *line;
+
+	if (commands_string == NULL)
+		return NULL;
+
+	p = (char *) commands_string;
+	end = (char *) commands_string + commands_string_len;
+	for (; p < end; p++) {
+		if (*p == line_sep) {
+			line = estrdup(commands_string, p - commands_string);
+			commands_string = p + 1;
+			commands_string_len = end - commands_string;
+			return line;
+		}
+	}
+
+	line = estrdup(commands_string, commands_string_len);
+	commands_string = NULL;
+	commands_string_len = 0;
+	return line;
+}
+
+/* save_options --- save current options to file */
+
+static void
+save_options(const char *file)
+{
+	FILE *fp;
+	const struct dbg_option *opt;
+
+	fp = fopen(file, "w");
+	if (fp == NULL)
+		return;
+
+	for (opt = option_list; opt->name; opt++) {
+		if (opt->str_val != NULL)
+			fprintf(fp, "option %s = \"%s\"\n", opt->name, *(opt->str_val));
+		else
+			fprintf(fp, "option %s = %d\n", opt->name, *(opt->num_val));
+	}
+	fclose(fp);
+	chmod(file, 0600);
+}
+
+/* close_all --- close all open files */
+
+static void
+close_all()
+{
+	bool stdio_problem, got_EPIPE;
+	struct command_source *cs;
+
+	(void) nextfile(& curfile, true);	/* close input data file */
+	(void) close_io(& stdio_problem, & got_EPIPE);
+	if (cur_srcfile->fd != INVALID_HANDLE) {
+		close(cur_srcfile->fd);
+		cur_srcfile->fd = INVALID_HANDLE;
+	}
+	for (cs = cmd_src; cs != NULL; cs = cs->next) {
+		if (cs->close_func && cs->fd != INVALID_HANDLE) {
+			cs->close_func(cs->fd);
+			cs->fd = INVALID_HANDLE;
+		}
+	}
+
+	close_extensions();
+
+	set_gawk_output(NULL);	/* closes output_fp if not stdout */
+}
+
+/* pre_execute_code --- pre_hook for execute_code, called by pre_execute */
+
+static int
+pre_execute_code(INSTRUCTION **pi)
+{
+	INSTRUCTION *ei = *pi;
+
+	switch (ei->opcode) {
+	case Op_K_exit:
+	case Op_K_next:
+	case Op_K_nextfile:
+	case Op_K_getline:	/* getline without redirection */
+		d_error(_("`%s' not allowed in current context;"
+				" statement ignored"),
+				op2str(ei->opcode));
+		*pi = ei->nexti;
+		break;
+	case Op_K_return_from_eval:
+		if (ei->nexti != NULL) {	/* not an implicit return */
+			NODE *r;
+			d_error(_("`return' not allowed in current context;"
+					" statement ignored"));
+			/* throw away return value already pushed onto stack */
+			r = POP_SCALAR();
+			DEREF(r);
+			*pi = ei->nexti;
+		}
+		break;
+	default:
+		break;
+	}
+	return (ei == *pi);
+}
+
+extern INSTRUCTION *unwind_stack(long n);
+
+static NODE *
+execute_code(volatile INSTRUCTION *code)
+{
+	volatile NODE *r = NULL;
+	volatile jmp_buf fatal_tag_stack;
+	long save_stack_size;
+	int save_flags = do_flags;
+
+	/* We use one global stack for all contexts.
+	 * Save # of items in stack; in case of
+	 * a fatal error, pop stack until it has that many items.
+	 */
+
+	save_stack_size = (stack_ptr  - stack_bottom) + 1;
+	do_flags = false;
+
+	PUSH_BINDING(fatal_tag_stack, fatal_tag, fatal_tag_valid);
+	if (setjmp(fatal_tag) == 0) {
+		(void) interpret((INSTRUCTION *) code);
+		r = POP_SCALAR();
+	} else	/* fatal error */
+		(void) unwind_stack(save_stack_size);
+
+	POP_BINDING(fatal_tag_stack, fatal_tag, fatal_tag_valid);
+	do_flags = save_flags;
+	if (exit_val != EXIT_SUCCESS) {	/* must be EXIT_FATAL? */
+		exit_val = EXIT_SUCCESS;
+		return NULL;
+	}
+	return (NODE *) r;
+}
+
+/* do_eval --- eval command */
+
+int
+do_eval(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	NODE *r, *ret_val;
+	NODE *f = NULL;
+	NODE *this_frame = NULL, *this_func = NULL;
+	NODE **sp;
+	INSTRUCTION *eval, *code = NULL;
+	AWK_CONTEXT *ctxt;
+	int ecount = 0, pcount = 0;
+	int ret;
+	int save_flags = do_flags;
+	SRCFILE *the_source;
+
+	if (prog_running) {
+		this_frame = find_frame(0);
+		this_func = this_frame->func_node;
+	}
+
+	install_params(this_func);	/* expose current function parameters to eval */
+	ctxt = new_context();
+	ctxt->install_func = append_symbol;	/* keep track of newly installed globals */
+	push_context(ctxt);
+	the_source = add_srcfile(SRC_CMDLINE, arg->a_string, srcfiles, NULL, NULL);
+	do_flags = false;
+	ret = parse_program(&code, true);
+	do_flags = save_flags;
+	remove_params(this_func);
+	if (ret != 0) {
+		pop_context();	/* switch to prev context */
+		free_context(ctxt, false /* keep_globals */);
+		return false;
+	}
+
+	f = lookup("@eval");
+	assert(f != NULL);
+	if (this_func == NULL) {	/* in main */
+		/* do a function call */
+		eval = bcalloc(Op_func_call, 2, 0);
+		eval->source_file = cur_srcfile->src;
+		eval->func_body = f;
+		eval->func_name = NULL;	/* not needed, func_body already assigned */
+		(eval + 1)->expr_count = 0;
+		eval->nexti = bcalloc(Op_stop, 1, 0);
+
+	} else {
+		/* execute as a part of the current function */
+		int i;
+		INSTRUCTION *t;
+
+		eval = f->code_ptr;	/* Op_func */
+		eval->source_file = cur_srcfile->src;
+		/* turn implicit Op_K_return into Op_stop */
+		t = (eval + 1)->lasti;	/* Op_K_return */
+		t->opcode = Op_stop;
+
+		/* add or append eval locals to the current frame stack */
+		ecount = f->param_cnt;	/* eval local count */
+		pcount = this_func->param_cnt;
+
+		if (ecount > 0) {
+			if (pcount == 0)
+				emalloc(this_frame->stack, NODE **, ecount * sizeof(NODE *), "do_eval");
+			else
+				erealloc(this_frame->stack, NODE **, (pcount + ecount) * sizeof(NODE *), "do_eval");
+
+			sp = this_frame->stack + pcount;
+			for (i = 0; i < ecount; i++) {
+				NODE *np;
+
+				np = f->fparms + i;
+				np->param_cnt += pcount;	/* appending eval locals: fixup param_cnt */
+
+				getnode(r);
+				memset(r, 0, sizeof(NODE));
+				*sp++ = r;
+				/* local variable */
+				r->type = Node_var_new;
+				r->vname = np->param;
+			}
+
+			this_func->param_cnt += ecount;
+		}
+	}
+
+#if 0
+	pf_data.print_func = fprintf;
+	pf_data.fp = out_fp;
+	pf_data.defn = false;	/* in_dump = false */
+	(void) print_code(f->code_ptr, &pf_data);
+#endif
+
+	ret_val = execute_code((volatile INSTRUCTION *) eval);
+
+	if (ret_val != NULL)
+		DEREF(ret_val);	/* throw away return value */
+	/* else
+		fatal error */
+
+	if (this_func != NULL && ecount > 0) {
+		int i;
+
+		/* undo frame manipulation from above */
+
+		/* free eval locals */
+		sp = this_frame->stack + pcount;
+		for (i = ecount; i > 0; i--) {
+			r = *sp;
+			if (r->type == Node_var)     /* eval local variable */
+				DEREF(r->var_value);
+			else if (r->type == Node_var_array)     /* eval local array */
+				assoc_clear(r);
+			freenode(r);
+			*sp++ = (NODE *) 0;
+		}
+		if (pcount == 0) {
+			efree(this_frame->stack);
+			this_frame->stack = NULL;
+		} /* else
+				restore_frame() will free it */
+
+		this_func->param_cnt -= ecount;
+	}
+
+	/*
+	 * Always destroy symbol "@eval", however destroy all newly installed
+	 * globals only if fatal error (execute_code() returing NULL).
+	 */
+
+	pop_context();	/* switch to prev context */
+	free_context(ctxt, (ret_val != NULL));   /* free all instructions and optionally symbols */
+
+	if (ret_val != NULL) {
+		/*
+		 * Remove @eval from FUNCTAB, so that above code
+		 * will work the next time around.
+		 */
+		NODE *s = make_string("@eval", 5);
+
+		(void) assoc_remove(func_table, s);
+		unref(s);
+	}
+
+	free_srcfile(the_source);
+
+	return false;
+}
+
+/*
+GDB Documentation:
+	... When you use condition, GDB checks expression
+immediately for syntactic correctness, and to determine whether symbols
+in it have referents in the context of your breakpoint. If expression
+uses symbols not referenced in the context of the breakpoint, GDB prints
+an error message:
+
+    No symbol "foo" in current context.
+*/
+
+static int invalid_symbol = 0;
+
+static void
+check_symbol(NODE *r)
+{
+	invalid_symbol++;
+	d_error(_("No symbol `%s' in current context"), r->vname);
+	/* install anyway, but keep track of it */
+	append_symbol(r);
+}
+
+/* parse_condition --- compile a condition expression */
+
+static int
+parse_condition(int type, int num, char *expr)
+{
+	INSTRUCTION *code = NULL;
+	AWK_CONTEXT *ctxt = NULL;
+	int ret;
+	BREAKPOINT *b;
+	struct list_item *w;
+	NODE *this_func = NULL;
+	INSTRUCTION *it, *stop, *rule;
+	struct condition *cndn = NULL;
+	int save_flags = do_flags;
+
+	if (type == D_break && (b = find_breakpoint(num)) != NULL) {
+		INSTRUCTION *rp;
+		cndn = &b->cndn;
+		rp = find_rule(b->src, b->bpi->source_line);
+		if (rp != NULL && rp->opcode == Op_func)
+			this_func = rp->func_body;
+	} else if (type == D_watch && (w = find_item(&watch_list, num)) != NULL) {
+		cndn = &w->cndn;
+		this_func = find_frame(cur_frame)->func_node;
+	}
+
+	if (cndn == NULL)
+		return -1;
+	if (expr == NULL)
+		goto out;	/* delete condition */
+
+	install_params(this_func);
+	ctxt = new_context();
+	invalid_symbol = 0;
+	ctxt->install_func = check_symbol;
+	push_context(ctxt);
+	(void) add_srcfile(SRC_CMDLINE, expr, srcfiles, NULL, NULL);
+	do_flags = false;
+	ret = parse_program(&code, true);
+	do_flags = save_flags;
+	remove_params(this_func);
+	pop_context();
+
+	if (ret != 0 || invalid_symbol) {
+		free_context(ctxt, false /* keep_globals */);
+		return -1;
+	}
+
+	/* condition expression is parsed as awk pattern without
+	 * any action. The code is then modified to end up with
+	 * a `1.0' on stack when the expression is true, `0.0' otherwise.
+	 */
+
+	assert(code != NULL);
+	rule = ctxt->rule_list.nexti;
+	stop = bcalloc(Op_stop, 1, 0);
+
+	it = rule->firsti;	/* Op_K_print_rec */
+	assert(it->opcode == Op_K_print_rec);
+	it->opcode = Op_push_i;
+	it->memory = make_number(1.0);
+	it->nexti = bcalloc(Op_jmp, 1, 0);
+	it->nexti->target_jmp = stop;
+	it->nexti->nexti = rule->lasti;
+
+	it = rule->lasti;		/* Op_no_op, target for Op_jmp_false */
+	assert(it->opcode == Op_no_op);
+	it->opcode = Op_push_i;
+	it->memory = make_number(0.0);
+	it->nexti = stop;
+
+out:
+	if (cndn->expr != NULL)
+		efree(cndn->expr);
+	free_context(cndn->ctxt, false);
+	cndn->code = code;
+	cndn->expr = expr;
+	cndn->ctxt = ctxt;
+
+	return 0;
+}
+
+/* do_condition --- condition command */
+
+int
+do_condition(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
+{
+	int type, num;
+	char *expr = NULL;
+
+	num = arg->a_int;
+	type = has_break_or_watch_point(&num, false);
+	if (! type)
+		return false;
+	arg = arg->next;	/* condition expression */
+	if (arg != NULL)
+		expr = arg->a_string;
+	if (parse_condition(type, num, expr) == 0 && arg != NULL)
+		arg->a_string = NULL;	/* don't let free_cmdarg free it */
+	return false;
+}
+
+/* in_cmd_src --- check if filename already in cmd_src */
+
+int
+in_cmd_src(const char *filename)
+{
+	struct command_source *cs;
+	for (cs = cmd_src; cs != NULL; cs = cs->next) {
+		if (cs->str != NULL && strcmp(cs->str, filename) == 0)
+			return true;
+	}
+	return false;
+}
+
+int
+get_eof_status()
+{
+	if (cmd_src == NULL)
+		return EXIT_FATAL;
+	return cmd_src->eof_status;
+}
+
+void
+push_cmd_src(
+	int fd,
+	bool istty,
+	char * (*readfunc)(const char *),
+	int (*closefunc)(int),
+	int ctype,
+	int eofstatus)
+{
+	struct command_source *cs;
+	emalloc(cs, struct command_source *, sizeof(struct command_source), "push_cmd_src");
+	cs->fd = fd;
+	cs->is_tty = istty;
+	cs->read_func = readfunc;
+	cs->close_func = closefunc;
+	cs->cmd = ctype;
+
+	/* eof_status = EXIT_FATAL     - exit with status EXIT_FATAL on EOF or error.
+	 *            = EXIT_FAILURE   - exit status EXIT_FAILURE on error.
+	 *            = EXIT_SUCCESS   - don't exit on EOF or error.
+	 */
+	cs->eof_status = eofstatus;
+	cs->str = NULL;
+	cs->next = cmd_src;
+	cmd_src = cs;
+
+	input_fd = fd;
+	input_from_tty = istty;
+	read_a_line = readfunc;
+}
+
+int
+pop_cmd_src()
+{
+	struct command_source *cs;
+
+	if (cmd_src->next == NULL)
+		return -1;
+
+	cs = cmd_src;
+	cmd_src = cs->next;
+	if (cs->close_func && cs->fd != INVALID_HANDLE)
+		cs->close_func(cs->fd);
+	if (cs->str != NULL)
+		efree(cs->str);
+	efree(cs);
+
+	input_fd = cmd_src->fd;
+	input_from_tty = cmd_src->is_tty;
+	read_a_line = cmd_src->read_func;
+	return 0;
+}
diff --git a/gawk-5.0.1/depcomp b/gawk-5.0.1/depcomp
new file mode 100755
index 00000000000..65cbf7093a1
--- /dev/null
+++ b/gawk-5.0.1/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='	'
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gawk-5.0.1/doc/ChangeLog b/gawk-5.0.1/doc/ChangeLog
new file mode 100644
index 00000000000..364854d977f
--- /dev/null
+++ b/gawk-5.0.1/doc/ChangeLog
@@ -0,0 +1,84 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Plain Getline): Improve the program and show
+	sample input and output. Thanks to Mark Krauze <daburashka@ya.ru>
+	for some of the changes.
+	Unrelated: Set the update month.
+	* awkcard.in: Bump version in download info.
+
+2019-06-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Regexp Operator Details): Add a paragraph
+	describing how unmatched left and right parentheses work.
+	Thanks to Neil Ormos <ormos-gnulists17@ormos.org>
+	for pointing out the need.
+
+2019-06-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Type Functions): Clarify isarray() and
+	typeof() behavior. Thanks to  Mark Krauze <daburashka@ya.ru>,
+	for pointing out the issues.
+
+2019-05-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1, gawktexi.in: Document --lint=no-ext.
+
+2019-05-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix some typos.  Thanks to Mark Krauze
+	<daburashka@ya.ru>, for pointing them out.
+	(Options): Document new feature in --sandbox, that you can't
+	add files that weren't there to start with.
+
+2019-05-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Additional Configuration Options): Document that
+	--disable-extensions also disables the extensions! Thanks to
+	Mark Krauze <daburashka@ya.ru>, for pointing it out.
+
+2019-04-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Options): Fix a copy/paste error. Thanks to
+	Mark Krauze <daburashka@ya.ru>, for pointing it out.
+
+2019-04-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Undocumented): Fix a typo. Thanks to Antonio Columbo
+	for pointing it out.
+
+2019-04-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Limitations): Provide brief instructions
+	on how to use use a temporary file in a script with
+	the debugger.  Thanks to Holger Klene <h.klene@gmx.de>
+	for the discussion.
+	(Multiple Lines): Note that POSIX seems to require \n as
+	separator for all values of FS, but that in reality it
+	doesn't apply to regexps; this is a POSIX bug.
+	(Options): Document clearly that if no -f or -e, anything
+	after the program text is placed into ARGV and not
+	parsed for options. Thanks to Neil Ormos <ormos-gnulists17@ormos.org>
+	for the tip.
+	(Other Versions): Add a link to Mircea Neacsu's embeddable
+	awk interpreter.
+
+2019-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Undocumented): Note an undocumented feature.
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.1 to the list. Ooops.
+
+2019-04-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Case-sensitivity): Document that single-byte
+	locales ignore case based on the current locale and not
+	always Latin-1.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/doc/ChangeLog.0 b/gawk-5.0.1/doc/ChangeLog.0
new file mode 100644
index 00000000000..8b32325b364
--- /dev/null
+++ b/gawk-5.0.1/doc/ChangeLog.0
@@ -0,0 +1,1032 @@
+Mon Jun 13 22:28:02 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Document that POSIX now says [a-z] is undefined outside
+	the C and POSIX locales, so gawk treats it as the Good Lord intended
+	in all cases.  Thanks to Paul Eggert for letting me know about this
+	and providing URLs to cite.
+
+Fri May 27 09:59:38 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1, gawk.texi: Minor edits w.r.t. the bug reporting address.
+
+Wed May 25 22:03:53 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1, gawk.texi: Straighten out owners of the different
+	Windows ports.
+
+Thu May 19 17:52:46 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Igawk, have pathto check for "-".
+	Thanks to Steffen Schuler <schuler.steffen@googlemail.com>,
+	from email dated 27, December 2008.
+
+Thu May 19 16:57:28 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: Revised to reflect the reality
+	that -d and -p don't allow a space before the file name.
+	Thanks to Pat Rankin.
+
+Mon May 16 16:40:50 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Remove last vestiges of old PROCINFO sorting
+	description.
+
+Mon May  9 15:58:33 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Finish array sorting and do a spell check.
+
+Fri May  6 13:21:20 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Finish edits after full read through.
+	* gawk.1: Update array sorting information.
+
+Wed May  4 23:39:09 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Start at revamping array sorting doc. Still
+	needs work.
+
+Wed Apr 27 21:49:23 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1: Minor edit.
+	* awkcard.in: Document third arg to asort and asorti.
+
+Thu Apr  7 21:55:27 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Nextfile Function): Removed, along with all references,
+	since only gawk and MKS awk allow next from a function, so this
+	function was useless for most people. Strange that noone noticed.
+	I wonder who really reads the doc?
+
+	Lots of other fixes have been going in too.
+
+Sun Mar 27 21:10:55 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* gawk.texi (Builit-in Variables: PROCINFO array, Scanning All
+	Elements of an Array: `for' statement): Update the documentation
+	for PROCINFO["sorted_in"]; add "ascending index number",
+	"descending index string", "ascending value", and "descending
+	value" as supported sort orderings.
+	* gawk.1 (PROCINFO array): Update PROCINFO["sorted_in"] to
+	reflect that the value matters, and list the supported sort orders.
+
+Tue Feb 15 17:11:26 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* gawk.texi (Builit-in Variables: PROCINFO array, Scanning All
+	Elements of an Array: `for' statement): Document that the value
+	of PROCINFO["sorted_in"] matters; sort orders "ascending index
+	string", "descending index string", and "unsorted" are supported.
+
+Sun Feb 13 19:58:35 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in, gawk.1, gawk.texi, gawkinet.texi: Fix typos
+	and spelling errors.
+
+Thu Feb 10 21:48:18 2011  Pat Rankin         <rankin@pactechdata.com>
+
+	* gawk.texi: Update VMS section.
+
+Thu Feb 10 21:31:36 2011  Andreas Buening    <andreas.buening@nexgo.de>
+
+	* gawk.texi: Update OS/2 information.
+
+Thu Feb 10 21:06:14 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* lflashlight-small.xpic: Renamed from lflashlight.small.xpic.
+	* rflashlight-small.xpic: Renamed from rflashlight.small.xpic.
+	* Makefile.am (EXTRA_DIST): Adjusted.
+
+Tue Feb  1 10:21:22 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, awkcard.in, gawk.1: Document isarray function,
+	magic string in PROCINFO for array sorting. Needs a little
+	more work in gawk.texi.
+
+Mon Jan 10 21:52:21 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* lflashlight.small.xpic, rflashlight.small.xpic: Original
+	source files for flashlight files from xpic tool.
+	It only took over 10 years to put them into the dist.
+	* Makefile.am (EXTRA_DIST): Add the new files.
+
+Thu Jan  6 22:13:11 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Replace xpic figures in Appendix D with figures
+	from xfig.
+	* general-program.eps, general-program.fig, general-program.pdf,
+	process-flow.eps, process-flow.fig, process-flow.pdf: New files.
+	* Makefile.am (EXTRA_DIST): Add the new files.
+
+Wed Jan  5 14:33:51 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: Sanitize making of different PDF files.
+
+Sun Jan  2 20:30:37 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Update to latest from texinfo CVS repository.
+
+Tue Dec 28 21:46:21 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* README.DGAWK: Removed, since there is now a chapter on the
+	debugger.
+	* Makefile.am (EXTRA_DIST): Remove README.DGAWK.
+
+Tue Dec 28 07:13:20 2010  John Haque  <j.eh@mchsi.com>
+
+	* gawk.texi: Update dgawk examples. Document condition command
+	without an expression. Fix a typo.
+
+Tue Dec 21 10:06:05 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (pdf): Renamed from `all-pdf'. Much more logical
+	and easier to remember.
+
+Sat Dec 18 20:14:58 2010  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawk.texi (DOS Quoting): Fix a typo.
+	(Top, PC Installation): Remove "PC Dynamic" from the menus.
+	(PC Installation, PC Compiling, PC Using): Remove obsolete stuff.
+	Fix whitespace between sentences.  Add indexing.
+	(PC Testing): New node, stuff moved from "PC Compiling".
+	(PC Dynamic): Node removed.
+	(Cygwin): Fix wording.
+	(MSYS): Fix whitespace between sentences.
+
+Thu Dec  9 22:27:53 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in, gawk.1, gawk.texi, gawkinet.texi: Remove discussion
+	of raw option in making sockets, since it was never implemented.
+
+Wed Dec  1 21:39:15 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in, gawk.1: Document arrays of arrays.
+	* gawk.texi: General progress.
+
+Mon Nov  8 22:24:21 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1: Minor fix from Jari Aalto <jari.aalto@cante.net>
+	to help Emacs fontification.
+
+Tue Nov  2 12:15:56 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in, gawk.1, gawk.texi: --lint --> -L,
+	--lint-old --> -t.
+
+Mon Nov  1 22:01:26 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in, gawk.1, gawk.texi: -l renamed -t.
+
+Sat Oct 30 05:53:25 2010  John Haque  <j.eh@mchsi.com>
+
+	* gawk.texi: Added section on Array of Arrays.
+
+Sat Oct 23 20:36:58 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in: Updated, cleaned up.
+	* gawk.1: Updated, some clean up.
+
+Wed Sep 22 05:29:43 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Added section on @include files.
+
+Wed Aug 18 22:14:19 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Minor edits.
+	* Makefile.am (LN): Use `ln -f' when installing link for
+	pgawk.1. Thanks to Peter Breitenlohner <peb@mppmu.mpg.de>.
+
+Thu Jul  1 21:29:25 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: Document `/inet4' and `/inet6'.
+
+Sun Jun 27 21:58:47 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: Document all short options.
+
+Wed Jun  2 22:06:22 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: Document FPAT variable and patsplit
+	function.
+
+Fri Jun 12 13:28:24 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1: Remove --disable-directories-fatal configuration
+	option.
+
+Thu Feb 26 20:36:18 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: Document BEGINFILE and ENDFILE.
+
+Mon Feb 16 21:53:22 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Document switch statements as always available.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Thu Feb 12 22:36:32 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Document that interval expressions are now on by default.
+	Also that --gen-po is now --gen-pot.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Sat Jan 17 20:03:43 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Document indirect function calls.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Tue Dec 30 22:22:04 2008  Assaf Gordon       <gordon@cshl.edu>
+
+	* gawk.texi: Document new --sandbox option.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Tue Dec 30 22:21:11 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Change --binary to --characters-as-bytes, per Karl Berry.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Thu Dec 18 05:30:13 2008  Steffen Schuler  <schuler.steffen@googlemail.com>
+
+	* gawk.texi: Documented fourth parameter of split().
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Thu Dec 18 05:16:48 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Minimally document `-b' / --binary.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Sun Nov 16 22:03:50 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Fully documented `-r' as synonym for --re-interval.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Tue Aug  3 13:35:15 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Document that gawk now uses the 2001 POSIX
+	rules for `sub' and `gsub'.
+
+Wed Dec 26 22:15:05 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Documented that process special files are gone.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Tue Apr 20 11:48:31 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Update to latest from texinfo git repository.
+	* gawk.texi, gawk.1, awkcard.in: Update version and copyright dates.
+
+Thu Mar 25 21:51:58 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1: Clarify the socket timeout environment variables.
+
+Wed Mar 10 21:28:12 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Reworded 'index in array' so that there's no chance of
+	someone using 'index' as a real subscript. Thanks to Hermann
+	Peifer for the push.
+
+Thu Feb  4 20:54:48 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Multiple cleanups and bringing of things up to date.
+	* gawk.1: Ditto, only not as much.
+	* Makefile.am: New `all-pdf' target to make PDF files of manpage
+	and reference card.
+
+Tue Aug  4 06:07:35 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: Document that 0 flag in
+	printf applies only to the numeric formats.
+
+Tue Aug  4 05:58:52 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to current version.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Tue Jul 21 22:20:25 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, awkcard.in: Update mawk site information now
+	that Thomas Dickey is maintaining it.
+
+Mon Jul 13 07:53:32 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (SEDME2): New macro, used in making awkcard.ps,
+	removes last empty page.  Finally!
+
+Fri Jul 10 10:35:29 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in: Rearrange items for better formatting and
+	organization.
+	* gawk.texi (Exit Status): New node to document exit values.
+	(Exit Statement): Give portability advice about exit value.
+
+Wed Jul  8 08:55:50 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in: Really fix table option for --verbose. Other
+	fixes and improvements, including document %'d flag.
+
+Tue Jul  7 09:13:02 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in: Fix table option for --verbose.
+
+Mon Jun  8 00:40:26 2009  Tommi Vainikainen  <thv@iki.fi>
+
+	* gawk.1: Bug fix to restore space between paragraphs at
+	entry for "--".
+
+Thu May 21 21:09:59 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1, awkcard.in: Document new -O / --optimize option.
+	* gawk.texi (Options): Likewise.
+
+Fri May 15 14:34:37 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (User-defined): Document that you can't use
+	the name of a built-in variable as a function parameter.
+
+Sat May  2 23:36:10 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Other Versions): Add Quiktrim awk.
+	(How to Contribute): Change things to point to awk.info.
+
+Mon Apr  6 22:29:47 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in: Bell Labs awk also supports fflush()
+	and fflush(""). Thanks to Steffen Schuler
+	<schuler.steffen@googlemail.com>.
+
+Mon Mar 30 21:26:04 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Simple Server): Fix bug since 3.1.0 where error
+	message from typo was in the middle of the HandleGet function.
+	Thanks to Tim Menzies for catching this.
+
+Mon Feb  9 22:11:16 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Translate Program): Bug fix in stranslate
+	function from Steffen Schuler <schuler.steffen@googlemail.com>.
+
+Tue Feb  3 22:06:10 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Regexp Field Splitting): Documented dark corner
+	of ^ in FS.
+
+Sat Jan 17 20:37:12 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Plain Getline): Bug fix in code. Thanks to
+	Steffen Schuler <schuler.steffen@googlemail.com>.
+
+Mon Jan  5 22:47:42 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1, awkcard.in: Document that getline returns 1
+	on sucess. Thanks to Paolo <oopla@users.sf.net> for
+	the report.
+
+Fri Dec 26 14:45:39 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawkinet.texi: Update to FDL 1.3.
+
+Mon Dec  1 21:20:39 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (File Checking): Correct the text at the end; getline
+	isn't fatal, period, not related to POSIX.  Thanks to
+	Seb <sbb@tuxfamily.org> for pointing this out.
+	(Round-Function): Change initial return when equal to return ival,
+	which lops off any digits, e.g. if given 121.0. Thanks to
+	Timothy J. Stefanski <TJStefanski@magellanhealth.com>.
+
+Fri Aug  1 17:34:55 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Signature Program): Added new subsection.
+
+Thu Jul 31 21:38:08 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Variable Typing): Document that array elements created
+	by `match' also get strnum attribute.
+
+Mon Jun  2 22:47:08 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Control Letters): Add a note about %c only
+	taking values from 0 to 255.
+	(DOS Quoting): New node.
+
+Thu Jan 31 16:17:27 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawkinet.texi: Updated the Back-Cover text per
+	latest from the FSF.
+
+Fri Jan 25 12:13:39 2008  Dave Pitts         <dpitts@cozx.com>
+
+	* gawk.texi (pwcat.c, grcat.c): Added ZOS_USS changes.
+
+Mon Jan 14 05:30:16 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Add maintainer contact info for z/OS.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Fri Oct 19 04:13:33 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1: Add length(array) to list of extensions at end.
+	Revise date.
+
+Thu Oct 18 08:40:59 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version from Texinfo 4.11.
+
+Sun Oct 14 20:37:59 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in: Fix version numbers and copyright info, minor
+	cleanups to format nicely.
+
+Sun Sep 30 22:30:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Conversion): Add table describing locale decimal
+	point versus period.
+
+Sat Sep  8 23:53:46 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: A number of minor fixes based on suggestions
+	from Jack Kelley <Jack.Kelley@epa.qld.gov.au>.
+
+Sat Aug 11 22:46:14 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Copying): Move to GPL 3.
+
+Wed May 30 17:11:19 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (CLEANFILES): Added, so that even "make distclean"
+	will do the right thing.
+	(clean): Removed, let automake to do it.
+
+Tue May 29 22:49:16 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Document --use-lc-numeric. Document that some
+	VMS systems come with an old version of gawk.
+
+Mon May 28 08:21:51 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1, awkcard.in: Document --use-lc-numeric.
+
+Tue May 15 13:27:38 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1: Documented --disable-directories-fatal
+	configure option.
+
+Wed May  9 21:50:44 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1: Reviewed and updated, minor typos fixed.
+	* awkcard.in: Added mention of %F.
+
+Wed May  2 19:55:02 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Cleaned up discussion of string concatenation
+	where needed, including a note about the mixed treatment
+	of `"echo " "date" | getline'.  Sigh.
+
+Sun Apr 29 13:33:27 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Time Functions): Update description of strftime
+	for third utc-flag argument. Other minor fixes.
+	* gawk.1, awkcard.in: Same.
+
+Tue Apr  3 22:47:40 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (New Ports): Update list of files for all of
+	regex that should not be messed with lightly.
+
+Wed Mar 21 09:02:53 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Removed last vestiges of arnold@gnu.org
+	email address.
+
+Wed Mar  7 13:06:31 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Getopt Function): Add a note that user level
+	code must clear out ARGV from 1 to Optind.
+	Thanks to Matthew.Hall1@VerizonWireless.com, from mail
+	dated Tue, 02 Aug 2005 09:04:37 -0700.
+
+Wed Mar  7 08:48:02 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Fix my personal email address. Sheesh.
+	Thanks again to Sahak Petrosyan <petrosyan@gmail.com>.
+
+Tue Mar  6 09:13:38 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Fix link to online version of the manual.
+	Thanks to Sahak Petrosyan <petrosyan@gmail.com>.
+
+Wed Feb 14 19:40:33 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Add discussion of magic values for Inf, NaN,
+	and hexadecimal floating point in appendix on numbers.
+	Other minor updates for date, trademarks, etc.
+
+Sun Jan 21 12:59:33 2007  "Ennio-(Sr)"     <ennio@WouldBe-ei.net>
+
+	* gawk.1: Add note that locale settings can influence the
+	choice of decimal point character.
+
+Sat Jan 13 22:43:39 2007  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* gawk.texi: Fix some typos.
+	* gawkinet.texi: Likewise.
+
+Sat Jan 13 21:25:28 2007  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de> 
+
+	* awkcard.in: next is POSIX.
+	* gawk.texi: V7/SVR3.1: Mention assignable `$0', `var in index'
+	as expression.  Specify `FS' limitation. 
+
+Fri Jan 12 12:28:51 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated upon move to current autotools.
+
+Thu Jan  4 19:56:45 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1: Applied patch from Eric Raymond to stop his stupid
+	automated email kvetching about the wonders of docbook.
+
+2006-07-29  Paul Eggert  <eggert@cs.ucla.edu>
+
+	* gawk.texi: Document that `$$0++--' isn't valid even though it
+	is unambiguous according to the Awk grammar.  This is in response
+	to Open Group XCU ERN 86
+	<http://www.opengroup.org/austin/aardvark/latest/xcubug2.txt>.
+
+Fri Oct 21 12:50:19 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Better support for PDF, thanks to Marty Leisner
+	<leisner@rochester.rr.com> for the prodding.
+
+	* Makefile.am: Add lflashlight.pdf, rflashlight.pdf, statist.pdf
+	to EXTRADIST and add gawk.pdf and gawkinet.pdf to list of files
+	to remove for `clean'.
+	*  lflashlight.pdf, rflashlight.pdf, statist.pdf: New files, created
+	with `epstopdf foo.eps > foo.pdf'.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Sun Jun 26 16:24:07 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Document `length(array)'.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+Mon May 23 20:56:32 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* gawk.texi: Removed references to `--with-included-gettext'.
+
+Fri Apr  1 06:25:30 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2005-01-30.17.
+
+Wed Feb  9 11:39:38 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Makefile.am: Per Stepan Kasal, removed html rules, since
+	Automake does it for us.
+
+Tue Jan  4 18:47:34 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2004-11-25.16.
+
+Mon Jan  3 14:09:57 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2004-10-31.06.
+
+Wed Sep 22 11:40:06 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* gawk.1, gawk.texi, awkcard.in: Documented new --exec option.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+Wed Jul 28 17:03:16 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (TROFF): Add -U flag to invocation. Makes it
+	possible to format ref card from a build directory that isn't
+	the source directory.
+	(distclean): Removed target. Let automake handle it.
+
+Tue Jun 15 12:21:09 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2004-06-14.14.
+	* gawk.texi (Dynamic Extensions): Text revised to follow
+	current implementation: new APIs, info on `n->param_cnt'
+	fixed.
+
+	Also in all index entries where comma does not separate
+	primary, secondary or tertiary terms, replaced the comma
+	with @comma{} and removed the corresponding comments.
+
+Mon May 31 09:11:01 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ad.block, awkcard.in, cardfonts, colors, no.colors: Change
+	old email address to current one.
+
+Mon May  3 09:54:46 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version from Automake 1.8.4.
+
+Mon Mar 22 10:53:13 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated.
+
+Tue Jan  6 17:38:40 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated.
+	* gawk.texi: All @strong{Note:} changed to `@quotation NOTE'.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+Mon Jun  9 16:06:30 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Set automatic-xref-title and change all cross
+	references to be of the single-argument type.  Made all
+	@node lines have just the node name.
+
+	Should have done both of these years ago.
+
+Sun May 11 16:08:58 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (html, gawk.html, gawkinet.html): New targets.
+
+Mon Mar 31 17:15:23 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (install-data-hook, uninstall-hook): Added code to
+	hard link gawk.1 to pgawk.1 upon install and remove pgawk.1 upon
+	uninstall.  Avoids MANPATH search problems, etc. etc.
+	(man_MANS): Removed pgawk.1 from the list.
+	* pgawk.1: Removed.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Tue Mar 11 11:22:36 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (man_MANS): Add pgawk.1.
+	* pgawk.1: New file, does `.so gawk.1' so that `man pgawk' will work.
+	Thanks to Nelson Beebe for pointing the need for this.
+
+Sun Feb  9 09:45:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawkinet.texi: Per Karl Berry, change dircategory
+	to follow current standards. In gawkinet.texi, remove
+	bracketing ifinfo.
+
+Thu Feb  6 12:06:22 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2003-02-03.16 from Texinfo 4.5.
+
+Tue Feb  4 15:21:46 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* awkcard.in: Redid the page-breaking.
+
+Tue Feb  4 14:28:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	All relevant files: Copyright year updated to 2003.
+
+Sun Jan 26 11:13:01 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2003-01-24.17 from prep.
+	* gawk.texi: Documented asorti(), new elements in match() 3rd arg,
+	misc cleanups.  Updated to FDL 1.2.
+	* awkcard.in, gawk.1: Ditto for asorti(), match().
+	* gawkinet.texi: Updated to FDL 1.2.
+
+Thu Jan 16 18:34:54 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2003-01-12.11 from prep.
+
+Sun Nov 24 17:55:23 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2002-11-05.11 from Texinfo 4.3.
+
+Sun Nov 17 21:34:35 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2002-10-13.14 from automake 1.7.1.
+
+Fri Nov  1 11:25:00 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	From Kaveh Ghazi:
+
+	* gawk.texi (grcat.c): Include stdlib.h.
+	(main): Fix format specifier warnings.
+	* gawk.texi (pwcat.c): Include config.h/stdlib.h.
+	(main): Fix format specifier warnings.
+
+Tue Jun 11 23:08:04 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Fix grcat code ifdef for HAVE_GETGRENT.
+
+2002-05-09  Paul Eggert  <eggert@twinsun.com>
+
+	[ ADR: Some minor post-patch editing was required. ]
+
+	* gawk.texi (igawk): Do not put temporary files in /tmp, as that
+	has some security problems.  This fixes a problem originally
+	reported by Jarno Huuskonen via solar@openwall.com.
+
+	Fix the following problems with igawk while we're at it.
+
+	* Report missing operands of options; this fixes e.g. an
+	  infinite loop with "igawk -W".
+
+	* Check for --source and -Wsource only, not -.source (which matches
+	  errors).  Similarly for other multichar options.
+
+	* Do not use 'echo', as that mishandles backslashes.
+
+Mon May 13 01:25:40 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkinet.texi: Change `ifinfo' to `ifnottex' around
+	the Top node. Thanks to Eli Zaretskii.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+Tue Apr 16 13:26:13 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: FINALLY. All O'Reilly production and
+	  indexing changes integrated.  Index reviewed and
+	  cleaned up.
+	* gawkinet.texi: Ditto.
+	* awkcard.in: Redid page breaking.
+	* Makefile.am (clean): Add `awkcard.tr' to list of files
+	that are removed.
+	(distclean): Depend on clean to REALLY GET `awkcard.tr'.
+	Sheesh.
+
+Mon Apr 15 14:43:51 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version from Texinfo 4.2.
+	* gawk.texi: Modified to use new @copying command.
+	* gawkinet.texi: Ditto.
+
+Wed Mar 20 17:07:50 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version from Texinfo 4.1.
+
+2002-02-10  Paul Eggert  <eggert@twinsun.com>
+
+	* gawk.texi (Word Sorting): Don't use sort +1, as POSIX 1003.1-2001
+	no longer allows it.  Use sort -k instead.
+
+2002-01-27  Bruno Haible  <bruno@clisp.org>
+
+	* gawk.texi: Document the dcngettext function.
+	* awkcard.in: Likewise.
+	* gawk.1: Likewise.
+
+Mon Jan 28 18:41:02 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkinet.texi, Makefile.am: Removed User Friendly cartoon.
+	  Sigh.
+
+Wed Dec 19 16:00:39 2001  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* gawk.texi (Profiling): Describe the signals used for profile
+	dumping in the DJGPP version.
+
+Mon Sep  3 18:30:13 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi (Top): Put in @ifnottex so that makeinfo
+	  --html is now happy.
+
+Sun Jun  3 13:04:44 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.0: Release tar file made.  And there was
+	  rejoicing.
+
+Mon May 14 19:57:31 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawkinet.texi: Versions for distribution
+	  put in place.
+	* gawk.1, awkcard.in: Minor edits for consistency of
+	  usage, formatting.
+
+Wed Nov 22 14:57:59 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: Removed all documentation
+	  of abort.
+
+Sun Aug 13 11:23:50 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: documented sort function
+	  and optional third argument to match.
+
+Sun Aug 13 00:40:41 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: hardwired publisher info.
+	* publisher.texi: Removed.  Not needed any more.
+	* gawkinet.texi: Added title page stuff.
+
+Thu Jul  5 21:05:57 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: moved to use of @command, @option everywhere
+	  appropriate.  Removed all @page and @group in anticipation
+	  of re-page breaking.  Updated stuff for install-info.
+	  Added FDL.
+
+Tue Nov 10 11:42:26 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* publisher.texi: new file with publisher related info.
+	* Makefile.in: updated dvi and postscript targets to make
+	  them lots smarter about not reformatting if need be.
+
+Mon Aug  7 15:23:00 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.6: Release tar file made.
+
+Sun Jun 25 15:08:19 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.5: Release tar file made.
+
+Wed May 17 19:04:54 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: Documented %u.  Ooops.
+
+Tue May  2 11:44:13 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 1999-10-01.07.
+	* gawk.texi: Redid page breaking for new texinfo.tex.
+
+Thu Apr  6 12:32:49 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: Change info dir file entry to `(gawk)' from
+	  `(gawk.info)'.
+	* Makefile.in [$(infodir)/gawk.info]: Fix grep test is
+	  accordance with above.
+
+Sun Feb 13 15:36:32 2000  Paul Eggert  <eggert@twinsun.com>
+
+	* gawk.texi: Mention that arithmetic is done in double
+	  precision floating point, and point to Goldberg's paper for
+	  people who want to know more.  Fix some other minor floating
+	  point discussion issues.
+
+Wed Nov  3 17:04:35 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.1: Lots of troff ``lint'' from Paul Eggert.  Not all
+	  of his changes, just the ones I thought worth doing.
+
+Mon Oct 11 16:53:54 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (gawk.dvi): Put $(srcdir) first in TEXINPUTS,
+	  and also just use texi2dvi, don't run texindex and tex
+	  manually.  Doing so is no longer necessary.
+
+Mon Aug  9 13:06:01 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.texi: New node `Array Efficiency' on the best use
+	  of subscripting to avoid memory bloat.
+
+Thu Jul 29 23:15:34 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in ($(infodir)/gawk.info): Removed loop around
+	  $(INSTALL_DATA), since there's only one Info file to install,
+	  install it directly.
+
+Wed Jun 30 16:14:36 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Release 3.0.4: Release tar file made.  This time for sure.
+
+Wed Oct  7 21:59:33 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* texinfo.tex: Updated to version 2.227, from Texinfo 3.12.
+
+Sun Oct 19 12:26:08 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* ALL: change references to arnold@gnu.ai.mit.edu to arnold@gnu.org.
+
+Tue Sep 23 10:31:17 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* texinfo.tex: Updated to version 2.218, from Texinfo 3.11.
+
+Fri Jul  4 08:19:00 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in ($(infodir)/gawk.info): Don't make dependent upon
+	  gawk.info, in case installed one is newer. Instead, check that
+	  an installed gawk.info exists and is identical to current one.
+	  If so, just exit; otherwise do the install.
+
+Wed Jul  2 14:55:12 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in ($(infodir)/gawk.info): typo fix.
+
+Thu May 15 12:49:08 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.3: Release tar file made.
+
+Fri Apr 18 07:55:47 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* BETA Release 3.0.34: Release tar file made.
+
+Sun Apr 13 15:39:20 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in ($(infodir)/gawk.info): exit 0 in case install-info
+	  fails.
+
+Thu Jan  2 23:17:53 1997  Fred Fish  <fnf@ninemoons.com>
+
+	* Makefile.in (awkcard.tr): Use ':' chars to separate parts of
+	  sed command, since $(srcdir) may expand to something with '/'
+	  characters in it, which confuses sed terribly.
+	* gawk.texi (Amiga Installation): Note change of configuration
+	  from "m68k-cbm-amigados" to "m68k-amigaos".  Point ftp users
+	  towards current ADE distribution and not obsolete Aminet
+	  "gcc" distribution.  Change "FreshFish" to "Geek Gadgets".
+
+Wed Dec 25 11:25:22 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.2: Release tar file made.
+
+Wed Dec 25 11:17:32 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in ($(mandir)/igawk$(manext),$(mandir)/gawk$(manext)):
+	  remove chmod command; let $(INSTALL_DATA) use -m.
+
+Tue Dec 17 22:38:28 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (gawk.info,gawk.dvi,postscript): run makeinfo, TeX,
+	  and/or troff against files in $(srcdir). Thanks to Ulrich Drepper.
+	  ($(infodir)/gawk.info): use --info-dir to install-info, not
+	  --infodir.
+
+Tue Dec 10 23:09:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.1: Release tar file made.
+
+Mon Dec  9 12:48:54 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* no.colors: new file from Michal for old troffs.
+	* Makefile.in [AWKCARD]: changes to parameterize old/new troff.
+
+Sun Dec  1 15:04:56 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* texinfo.tex: Updated to version 2.193, from Karl Berry.
+
+Tue Nov 26 22:57:15 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in ($(infodir)/gawk.info): Change option in call
+	  to `install-info' to `--info-dir' from `--infodir'.
+
+Mon Nov  4 13:30:39 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in: updates for reference card.
+	  (ad.block, awkcard.in, cardfonts, colors, macros, setter.outline):
+	  new files for reference card.
+
+Wed Oct 16 12:43:02 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* texinfo.tex: Updated to version 2.185, from texinfo-3.9 dist.
+
+Sun Aug 11 23:12:08 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in ($(infodir)/gawk.info): correct use of
+	  $(INSTALL_DATA) and remove chmod command.
+
+Thu Jul 11 22:06:50 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in ($(mandir)/gawk.$(ext), $(mandir)/igawk.$(ext)):
+	  made dependant on files in $(srcdir).
+
+Fri Mar 15 06:45:35 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (clean): add `*~' to list of files to be removed.
+
+Thu Jan 25 23:40:15 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (dvi): run texindex and tex an extra time.
+	  This gets the cross references right. Sigh.
+
+Wed Jan 24 11:51:54 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (maintainer-clean):
+	  Depend on distclean, not the other way around.
+	  Output warning message as per GNU standards.
diff --git a/gawk-5.0.1/doc/ChangeLog.1 b/gawk-5.0.1/doc/ChangeLog.1
new file mode 100644
index 00000000000..759f2051571
--- /dev/null
+++ b/gawk-5.0.1/doc/ChangeLog.1
@@ -0,0 +1,2906 @@
+2019-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated from GNULIB.
+
+2019-04-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Add a missing word.
+
+2019-03-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkinet.texi: Small formatting fixes. Update version and dates.
+
+2019-03-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More minor fixes.
+	* wordlist: Updated.
+
+2019-03-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update master menu.
+
+2019-03-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Regexp Operators): Refactor a bit into subsections,
+	mention that BWK awk now has interval expressions.
+
+2019-02-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix a spelling error, change update month.
+	* gawkworkflow.texi: Small fixes.
+	* wordlist: Updated.
+
+2019-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated from GNULIB.
+
+2019-02-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix order of values for PROCINFO["platform"],
+	save an email in @ignore for possible eventual inclusion.
+	* gawk.1: Correct values for PROCINFO["platform"].
+
+2019-02-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Viewing And Changing Data): Revise note for eval
+	to list commands that are not allowed using it.
+
+2019-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix wording for %f.
+	Thanks to Dan Liddell <dan_liddell@mentor.com> for the catch.
+	(Viewing And Changing Data): Note that eval has problems calling
+	user-defined functions that return a value. Thanks to
+	Lothar Langer <lotharla@gmail.com> for the report.
+
+2019-02-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Don't use `\global\usebracesinindexestrue' as it's
+	no longer supported.
+	(Function Calling): Renamed from `Function Caveats'.
+	(Function Caveats): New node.
+	* gawkinet.texi: Don't use `\global\usebracesinindexestrue' as it's
+	no longer supported.
+
+2019-02-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix some indexing with too many commas.
+	* gawk.info: Regenerated, moved to makeinfo 6.5.
+	* texinfo.tex: Updated.
+
+2019-02-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Some more minor edits.
+
+2019-02-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add wordlist3.
+	(spellmanpage): New target.
+	(spell): Add spellmanpage to the list.
+	* wordlist1: Updated.
+	* wordlist3: New file.
+	* awkcard.in: Finish cleanups.
+	* gawk.1: Ditto.
+	* gawktexi.in: Fix small typo.
+
+2019-02-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkcard.in: Start on cleanup edits.
+	* gawk.1: Ditto.
+	* gawktexi.in: Credit Nelson Beebe with gawk's current
+	random number generator.
+	* gawk.texi, gawk.info: Brought back into sync.
+
+2019-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, gawk.1, awkcard.in: Update copyright dates and
+	appropriate version numbers.
+
+2019-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): Add a cautionary note that the feature
+	is new and may still have dark corners and/or bugs.
+
+2019-01-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Finish up indexing changes.
+
+2019-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More work on the indexing.
+	Document that `-f -' works to read source code from stdin.
+
+2019-01-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Work on the indexing.
+
+2019-01-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (I18N Example): $LC_MESSAGES is involved here
+	also. Document this.
+
+2019-01-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in (Undocumented): Discuss typeof's optional 2nd argument.
+
+2019-01-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (I18N Example): Add more explanation of how to
+	make the directory to hold the .mo file.
+
+2019-01-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Indexing fixes and small corrections.
+
+2019-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Some small indexing fixes. Thanks to Antonio
+	Giovanni Colombo for pointing them out.
+
+2019-01-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: A few more fixes w.r.t. namespaces. Thanks to
+	Antonio Giovanni Colombo for pointing out the problems.
+
+2018-12-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: A few fixes w.r.t. namespaces. Thanks to
+	Antonio Giovanni Colombo for pointing out the problems.
+
+2018-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Added more indexing to the debugger chapter.
+	Add more indexing to namespaces chapter, too.
+
+2018-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Clean up some FIXMEs and other improvements.
+	* gawk.1: Mention that files read with -f and -i and command
+	line segments all implicitly start with @namespace "awk".
+
+2018-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Added more indexing to the debugger chapter.
+
+2018-11-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Auto-set): Document that you can no longer use
+	arbitrary indices in SYMTAB.
+	* gawk.1: Ditto.
+
+2018-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Added more indexing to the debugger chapter.
+
+2018-11-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Other Versions): Document GoAWK, an awk interpreter
+	written in Go.
+
+2018-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Auto-set) : Update values of PROCINFO["platform"].
+	(PC Using): Add to BINMODE discussion to always set it and
+	not worry about checking platforms. Per discussion with the dev team.
+
+2018-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document that split() third arg is like FS, if it's
+	a single character, that character is used, even if it's a
+	regexp metacharacter.
+	* gawk.1: Ditto.
+	Thanks to R <0xef967c36@gmail.com> for the report.
+
+2018-11-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document PROCINFO["platform"].
+	* gawk.1: Ditto.
+
+2018-11-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Small typo fix.
+
+2018-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Assignment Options): Add description of assigning
+	strongly typed regexp constants to variables.
+
+2018-11-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in): Small typo fixes. Thanks to Antonio
+	Giovanni Colombo for pointing them out.
+
+2018-11-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Profiling): Review and update.
+
+2018-10-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Arrays of Arrays): Typo fix in code. Thanks to Alto Tom
+	<alto.tom@gmail.com> for the report.
+	(Usenet): Small edit.
+
+2018-10-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Usenet): Mention that web forums are also not
+	the right place for gawk bug reports.
+
+2018-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Bug address): Mention the GNU Kind
+	Communications Guidelines, with URL.
+	* texinfo.tex: Updated from GNULIB.
+
+2018-10-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Profiling): Revise example for pattern without
+	action and note that the profiler distinguishes `print' and
+	`print $0'.
+
+2018-09-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Extracting): Note that patch levels above
+	60 are beta software, instead of above 70.
+
+2018-09-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update UPDATE_MONTH.
+
+2018-09-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.in: Regenerated, using Automake 1.16.1.
+
+2018-08-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Other Versions): Updated info on BWK awk.
+	* gawktexi.in (Control Letters): Note that BWK awk now also
+	supports %a/%A.
+
+2018-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: A number of unrelated updates. Most notably,
+	removed the section on old extensions which has been irrelevant
+	since 4.2.0. Oops.
+
+2018-08-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Scalar Constants): Fix typos in example.
+
+2018-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Scalar Constants): Document what happens with
+	physical newlines in strings, escaped and otherwise.
+
+2018-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Two-way I/O): Fix some typos.
+	* gawkworkflow.texi (Configuring git): Correct some
+	command usages. Thanks to Antonio Colombo for the fix.
+
+2018-07-31         Ralph Corderoy        <ralph@inputplus.co.uk>
+
+	* gawk.1: Avoid hyphenation in gawk email address.
+
+2018-07-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Two-way I/O): Add a nice example on buffering
+	and ptys from Andrew Schorr.
+
+2018-07-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Control Letters): Add a note about output of NaN and
+	INF values with an xref to POSIX Floating Point Problems.
+	(POSIX Floating Point Problems): Describe that gawk also outputs the
+	four special strings for NaN and INF values.
+
+2018-06-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated.
+
+2018-06-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Records, gawk split records): More explanation
+	of how RS works when it's longer than one character. Thanks
+	to Andrew Schorr for most of the wording.
+	* wordlist: Updated.
+
+2018-06-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (awk split records): Document that even if the
+	single character in RS is a regexp metacharacter, it's
+	treated literally. Per suggestion from Ed Morton.
+
+2018-06-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Extract Program): Remove an obsolete sentence.
+	Thanks to Andrew Giovanni Colombo for pointing it out.
+
+2018-05-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (String Functions): Clean up and clarify the
+	prose description of gensub(). Thanks to Andrew Schorr
+	for the encouragement (back in 2016...).
+
+2018-05-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Extract Program): Additional bug fixes. Close
+	the last file processed, and use the index of the for loop
+	which is the filename as the argument to close()!
+
+2018-05-28         Bjarni Ingi Gislason  <bjarniig@rhi.hi.is>
+
+	* gawk.1: Change two-fonts macros to one-font macros for a
+	single argument.
+
+2018-05-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Extract Program): Bug fix. Keep the files open
+	in case one program's bits are intermixed with another's.
+	Then close them all at the end.  Bug report was about
+	indirectcall.awk but affected another file as well. Thanks
+	to Ramasahayam Reddy <rureddy57@gmail.com> for the report.
+
+2018-05-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Auto-Set): For PROCINFO["sorted_in"], make the xref
+	point to the right place. Reported by David Kaspar
+	<dkaspar@redhat.com> from downstream bugzilla:
+	https://bugzilla.redhat.com/show_bug.cgi?id=1581434
+
+2018-05-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Bitwise Functions): Use @asis in the table to
+	get brackets for optional stuff to come out in Roman.
+
+2018-05-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Bracket Expressions): Document the full list
+	of characters in [:space:]. Thanks to Jannick <thirdedition@gmx.net>
+	for the suggestion.  Also note that current BWK awk gets [:blank:]
+	wrong, treating it like [:space:].
+
+2018-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Minor edit in the man page. Thanks to Howard
+	Johnson <hj@HowardJohnson.name> for the report.
+
+2018-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated.
+
+2018-03-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, gawk.1: Remove mention of tail recursion
+	optimization from documentation on -O.
+
+2018-03-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, gawk.1, awkcard.in: Document %a and %A.
+	* wordlist, wordlist2: Updated.
+
+2018-03-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkworkflow.texi: Fix update month.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update UPDATE-MONTH.
+	* awkcard.in: Update tar ball version and copyright year.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated.
+
+2018-02-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Further fix to NONFATAL stuff. Thanks to
+	Antonio Giovanni Colombo for the report.
+
+2018-02-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix NONFATAL stuff to cover input redirections too.
+
+2018-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Fix NONFATAL stuff to cover input redirections too.
+
+2018-02-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Clarify binary mode is default on Cygwin,
+	improve section on using on PCs to refer to MinGW and DJGPP.
+	Thanks for the report to a contributor who wishes to
+	remain anonymous.
+
+2018-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* wordlist: Updated.
+
+2018-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (AWKLIBPATH Variable): Add note that changing
+	ENVIRON["AWKLIBPATH"] won't affect the running program. Thanks to
+	Neil R. Ormos <ormos-gnulists17@ormos.org> for the suggestion.
+
+2018-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (gawkextlib): Update discussion of gawkextlib.
+	Add not about json extension, and just present the list as
+	describing some of the extensions, since there are now too
+	many to try to keep up with all of them.
+
+2018-01-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update gnu.org and fsf.org URLs to https. OK'd
+	by the FSF.
+
+2018-01-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Remove incorrect '*' on some declarations of
+	ext_id in sample extension code. Thanks to Panos Papadopoulos
+	<panos1962@gmail.com> for the report.
+	* texinfo.tex: Updated from GNULIB.
+
+2018-01-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in (Checking for MPFR): Add warnings about exit's processing
+	of END rules.
+
+2018-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update copryight year, and some small cleanups.
+
+2018-01-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Setting the rounding mode): Add a sidebar
+	with sample code (courtesy of <nethox@gmail.com>) to
+	demonstrate how ROUNDMODE affects number to string conversion.
+
+2017-12-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated.
+	* gawktexi.in (How To Contribute): Update to point to
+	awklang.org.
+
+2017-12-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated.
+
+2017-12-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Additional Configuration Options): Add
+	description of the --enable-versioned-extension-dir option.
+
+2017-12-01         Sergey Tselikh     <stselikh@gmail.com>
+
+	* 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     <arnold@skeeve.com>
+
+	* gawktexi.in: Add a note to add a section on recursion.
+	Thanks to Bill Duncan <bduncan@beachnet.org> for the
+	suggestion.
+	* gawktexi.in: Add a missing DARKCORNER indicator and
+	a few missing dark corner index entries. Remove the note
+	at the end to check that all dark corners are indexed and
+	instead make it part of the list of consistency checks.
+
+2017-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkworkflow.texi (General practices): Use correct option
+	--delete for deleting a branch upstream, instead of -d.
+
+2017-11-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in (Setting the Rounding Mode): Fix the description
+	of ROUNDMODE "A": it uses MPFR_RNDA mode, which rounds away from zero,
+	not "Round to nearest, ties away from zero". 
+	* gawk.1 (ROUNDMODE): Fix description of "A".
+
+2017-11-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Changes from API V1): Give a list of things
+	that changed, with xrefs. Thanks to Andrew Schorr for the push.
+
+2017-11-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (For Statement): Small clarification in the text.
+
+2017-11-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (General Data Types): Move AWK_NUMBER_TYPE
+	enum out to top level, corresponding to code change.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-10-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (EDITION): Update to 4.2. Also, remove all visible
+	references to http://awk.info; that site no longer exists.  
+
+2017-10-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Update docs to indicate that isarray is not deprected in this release.
+
+	* awkcard.in: Remove "Deprecated" notice under isarray.
+	* gawk.1: Remove deprecated warning under isarray documentation.
+	* gawkexti.in: Remove sentence indicating that isarray is deprecated
+	and recommending typeof instead.
+
+2017-10-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkcard.in: Add @namespaces to Execution section.
+
+2017-10-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Documents namespaces.
+	* awkcard.in: Ditto.
+
+2017-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Readfile Function): Fix the code for the naive
+	function to be syntactically and semantically correct. Thanks to
+	Jaromir Obr <jaromir.obr@gmail.com> for the report.
+	(POSIX String Comparison): Add some URL references in @ignore.
+
+	Unrelated:
+
+	* gawktexi.in: Remove description of --with-whiny-user-strftime
+	configuration option.
+
+2017-10-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Fix discussion of AWKPATH in section on @include.
+
+2017-10-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update the update month to October.
+
+2017-10-02         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Two typo fixes.
+
+2017-10-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add pointer to mawk 2.0 GitHub page.
+
+2017-10-01         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Update many URLs to https. Some other small fixes.
+
+2017-10-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkcard.in: One more small change.
+	* gawk.1: Brought up to date and polished a bit.
+	* gawktexi.in: Some small additional fixes.
+
+2017-09-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkcard.in: Finish changes (we hope) for next release.
+
+2017-09-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ad.block: Change FSF URL to https.
+	* awkcard.in: First round of changes for next release.
+
+2017-09-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Change GNU URLs to use `https://...'.
+	Revise UPDATE_MONTH.
+	* texinfo.tex: Updated.
+
+2017-09-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Change 'namespace' to 'name_space' where it matters
+	for C++ compatibility.
+
+2017-09-13         David Kaspar          <dkaspar@redhat.com>
+
+	* gawktexi.in: Fix the dir entry.
+	* gawkinet.texi: Allow calling as `info awktexi'.
+
+2017-09-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Installation summary): Note OS/2 exists for PCs
+	in a comment.
+
+2017-08-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Contributors): Update entry for Steven Davies.
+
+2017-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated. Fixes table of contents issue
+	with very long title.
+	* gawktexi.in: Slight rearranging of order of things that
+	happened in 4.2.  Minor cleanups related to Scott Deifik.
+
+2017-08-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated. Fixes table of contents issue
+	with Part header.
+
+2017-08-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document Marco Curreli's contribution of
+	the Italian translation, along with Antonio Colombo.
+
+2017-08-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update history of features appendix section.
+	* wordlist, worldlist2: Add more words.
+
+2017-08-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, gawk.1, awkcard.in: Update versions and
+	copyright years, prepatory to starting a release spiral.
+
+2017-08-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update API chapter with info about additions
+	for accessing and/or creating MPZ and MPFR values.
+
+2017-08-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated.
+
+2017-08-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespace Summary): Add summary to namespace
+	chapter.
+
+2017-08-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update with info about DJGPP port now
+	being supported.
+
+2017-07-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Type Functions): Improve the example
+	for untyped variables.
+	(Extension Exercises): Remove the exercise that talks
+	about namespaces, since it's no longer relevant.
+
+2017-07-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Extension Sample Inplace): Apply GPL to
+	inplace.awk; should have done that when it was first
+	added. Oops.
+
+2017-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): More edits.
+
+2017-07-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix a spelling error.
+	* wordlist: Update with more words.
+
+	Done also for namespace material.
+
+2017-07-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Extension Sample Inplace): Rework to use the
+	"inplace" namespace.
+
+	* gawktexi.in (Namespace And Features): Renamed from
+	`Namespace Misc' and reworked.
+	(Symbol table by name): Add note about namespace and
+	component name rules with xref to section in Namespaces chapter.
+
+2017-07-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): Cleanup, new section on naming rules
+	added.
+
+2017-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): Revised password suite example.
+	(Symbol table by name): Add entries for namespace versions
+	of lookup and update routines.
+
+2017-07-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): More updates. Especially that
+	reserved words are not allowed in either half of a fully
+	qualified name or as a namespace.
+
+2017-07-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): More updates.
+
+2017-07-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Pull in latest from Texinfo SVN.
+
+2017-06-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): Move to later in the book.
+
+2017-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): More minor doc edits.
+
+2017-06-19         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in (Memory Allocation Functions and Convenience Macros):
+	Document new ezalloc API macro.
+
+2017-06-18         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkworkflow.texi: Fix typo.
+
+2017-06-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Expand tab characters.
+	* gawktexi.in (Namespaces): Further minor doc edits, including
+	hyphenation hint.
+
+2017-06-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): Document that reserved words and
+	predefined functions can be namespace names but can be in
+	the second part of a fully qualified name. (Design decision
+	change.)
+
+2017-06-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): Document that reserved words and
+	predefined functions can't be namespace names. Reformat the
+	input a little bit.
+
+2017-06-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): Further clarifications. Move to
+	`::' as the namespace separator.
+
+2017-06-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in (Checking for MPFR): Fix typo.
+
+2017-06-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Namespaces): Fixes in passwd.awk example. Document
+	that indirect calls with an unadorned name assume "awk" namespace.
+
+2017-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Initial doc on namespaces. Serves as a design
+	right now.
+	* gawktexi.in: More doc added.
+
+2017-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document PROCINFO["argv"].
+
+2017-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Checking for MPFR): New node on checking if
+	gawk was invoked with -M.
+
+2017-05-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document FIELDWIDTHS much better, including how
+	it works in corner cases. Some general organizational improvements
+	in this chunk of text.
+
+2017-04-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Improve documentation of --source option.
+
+2017-04-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document --disable-mpfr configure option.
+
+2017-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkcard.in: Comment out description of intdiv().
+	* gawk.1: Ditto.
+	* gawktexi.in: References to intdiv changed to intdiv0 and
+	bracketed inside @ifset INTDIV. Not set by default.
+
+2017-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Improve documentation of the intdiv() function.
+
+2017-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* it: New directory with Italian translation of the manual.
+	* Makefile.am (EXTRA_DIST): Add `it' and wordlist2.
+
+2017-04-12         Manuel Collado        <m-collado@users.sourceforge.net>
+
+	* gawktexi.in, gawk.1: Small clarification of the patsplit behavior.
+
+2017-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor style edits.
+
+2017-04-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Document FIELDWIDTHS enhancement to support an optional
+	field skip prefix. Document new PROCINFO["FS"] value "API".
+	Document new get_record field_width argument that enables the API
+	parser to override the default field parsing mechanism.
+
+2017-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* using-git.texi: Removed.
+	* gawkworkflow.texi: Added. New file.
+	* wordlist2: New file.
+	* Makefile.am: Revised for new document. Copyright years updated.
+
+	* gawkworkflow.texi: Fix some spelling errors. :-(
+	* wordlist2: Updated.
+	* Makefile.am: Fix spell checking. :-(
+
+2017-03-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.1: Document new PROCINFO["FS"] value "API".
+
+2017-03-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* awkcard.in: Document FIELDWIDTHS enhancement to support an optional
+	field skip prefix.
+	* gawk.1: Ditto.
+
+2017-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Improve the discussion of quoting on
+	MS-Windows. Original text contributed by
+	Vincent Belaiche <vincent.belaiche@gmail.com>.
+
+2017-03-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Additional small writing tip in the notes
+	after the @bye.
+
+2017-03-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Edits preparatory to release.
+
+2017-02-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: "timezone" --> "time zone".
+	* awkcard.in: Update copyright year.
+
+2017-02-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.1: Document new mktime optional 2nd utc-flag argument.
+	* gawktexi.in: Ditto.
+	* awkcard.in: Ditto.
+
+2017-02-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix two typos.
+	* wordlist.txt: Update.
+
+	Related:
+
+	* gawktexi.in: Fix more typos.
+	* wordlist.txt: Update again.
+
+2017-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update UPDATE-MONTH and copyright years.
+
+2017-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Comment out stuff about awk.info, since that
+	domain is now gone.
+
+2016-12-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Explain why an API extension function might want
+	to use the AWK_STRNUM type to return data.
+
+2016-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update API table of type requested / type returned.
+
+2016-12-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor edits after merging branches and some
+	additional work in the code.
+
+2016-12-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Further API clarifications and edits, add a
+	section on backwards compatibility.
+
+2016-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update description of awk_ext_func_t structure,
+	again.
+
+2016-12-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update description of awk_ext_func_t structure.
+
+2016-12-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Document strnum changes as relates to API.
+	Still stuff left to do -- tables for type conversions need
+	to be updated to show new strnum and regex rows and columns.
+
+2016-12-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Remove make_regex and replace it with make_const_regex
+	and make_malloced_regex.
+
+2016-12-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Document new flatten_array_typed API function, and
+	indicate that the old flatten_array function has been superseded.
+
+2016-11-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document typed regex changes as relates to API.
+	Still stuff left to do.
+
+2016-11-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Finish off discussion of strongly typed regexp
+	constants and put it in the right place in the manual. A few other
+	minor fixes.
+	* wordlist: Updated.
+
+2016-11-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Variable Typing): Rework and improve discussion
+	of strings, numbers, and strnums.  Update description of strnum
+	in other places.
+
+2016-11-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix example use of dcngettext.
+	Thanks to Sergey Tselikh <stselikh@gmail.com>
+	for the report.
+
+2016-11-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, wordlist: Typo fix. ECBDIC --> EBCDIC.
+	Thanks to Sergey Tselikh <stselikh@gmail.com> for the report.
+	(bitwise-ops): Put table in @verbatim instead of @display.
+	Works better for Info, text, and HTML. Thanks to
+	Marco Curreli <marcocurreli@tiscali.it> for the report.
+
+2016-11-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix a spelling error.
+	* wordlist: Update.
+
+2016-10-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document that negative arguments are not allowed
+	for bitwise functions. Add a sidebar explaining it a bit and
+	also showing the difference with and without -M.
+	* gawk.1: Document that negative arguments are not allowed.
+
+2016-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Remove references to MS-DOS and OS/2,
+	simplify the whole section on PC operating systems.
+
+2016-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Bugs): Rework this section and break into
+	subsections, mainly to emphasize that I no longer
+	read comp.lang.awk.
+
+2016-09-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Group Functions): Typo fix. Reported
+	by Jaromir Obr <jaromir.obr@gmail.com>.
+	(Time Functions): Slightly enhance description of ISO 8601
+	definition of first and last weeks. Thanks to
+	Michel de Ruiter <mdruiter@gmail.com> for the note.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (POSIX String Comparison): Update for new
+	spec where == and != use strcmp, rest use strcoll. Thanks to
+	Chet Ramey for pointing me at the new rules.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* wordlist: Add more words.
+	* gawktexi.in: Fix more typos.
+
+2016-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add new file, wordlist.
+	(spell): New target.
+	* wordlist: New file.
+	* gawktexi.in: Fix typos, adjust update date.
+	* awkcard.in: Update copyright years.
+
+2016-08-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Restored doc on typed regexes.
+
+	* gawk.1, gawktexi.in: Updated.
+
+2016-08-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove typed regexes until they can be done properly.
+
+	* gawk.1, gawktexi.in: Updated.
+
+2016-08-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Mark DJGPP port as unsupported.
+
+2016-07-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix a typo. Thanks to Marco Curreli for reporting.
+
+2016-07-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document return value of close on a pipe now like
+	that of system: exit status, status + 256 for signal, or
+	status + 512 for signal with core dump.
+
+2016-07-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix a typo. Thanks to Antonio Colombo for reporting.
+
+2016-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document GAWK_LOCALE_DIR env var and also to not
+	use LANGUAGE env var.
+
+2016-07-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Auto-set): Add example use of multiply function.
+
+2016-06-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Typo fix. Thanks to Antonio Giovanni Colombo
+	for noticing.
+
+2016-06-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Document typeof(), update modified date.
+	* awkcard.in: Document typeof().
+
+2016-06-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix a typo, and replace hard-coded "section" with
+	@value{SECTION} where appropriate. Thanks to Antonio
+	Giovanni Colombo for the reports.
+	(UPDATE-MONTH, PATCHLEVEL): Update to current before release.
+	* awkcard.in: Update version.
+
+2016-05-30         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Replace num_expected_args with max_expected_args.
+	Explain what it's used for.
+
+2016-05-25         Manuel Collado        <mcollado2011@gmail.com>.
+
+	* gawktexi.in: Document new 'nonfatal' API function.
+
+2016-05-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Typo fix in extension section, thanks to
+	 Manuel Collado <mcollado2011@gmail.com>.
+
+2016-05-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Document new CPP defines gawk_api_major_version and
+	gawk_api_minor_version.
+
+2016-04-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkinet.texi: Some general cleanups. Remove stuff commented
+	out since 2001, index RFCs, change function name convention to
+	match main gawktexi.in. Update the update month.
+
+2016-04-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Two-way I/O): Document that writing to the closed
+	write end of a two way pipe or reading from the closed read end
+	can be made nonfatal.
+
+2016-04-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, gawkinet.texi: Enable use of braces in
+	indexes. Requires Texinfo 6.0 or later.
+
+2016-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Two-way I/O): Document that closing the "from"
+	end waits for the process to exit, so it's not such a great idea.
+
+2016-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkinet.texi: Small update about end of line vs full
+	comments when pretty printing.
+
+2016-03-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkinet.texi: Update UDP client and discussion, update
+	modification dates and gawk versions.
+
+2016-03-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Improve system() return values documentation.
+
+2016-03-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document system() return values.
+	* gawk.1: Add a pointer to the manual about same.
+
+2016-02-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* sidebar.awk: Globally replace [[:space:]] with [ \t] so that
+	it will work with old versions of mawk (as found, boo!, on many
+	Debian-based distributions).  Thanks to Yehezkel Bernat for
+	discovering and reporting the issue.
+
+2016-02-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Bracket Expressions): Add a small note about
+	Unicode in bracket expressions.
+
+2016-02-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fixes in wc.awk and in cut.awk. Thanks to David Ward,
+	dlward134@gmail.com.  Added an example of use of rewind(), also
+	per suggestion from David Ward.
+	* gawktexi.in: Update info about Texinfo versions.
+	* gawktexi.in (Limitations): Fix Heisenberg Physics example and
+	spelling of Heisenberg's name. Thanks to Hermann Peifer.
+
+2016-02-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Revise for use with Texinfo 6.1.
+	Remove ` @c' at the end of inline docbook constructs.
+	Remove special @DB*REF macros, not needed anymore.
+	Use @sup for superscripts where possible.
+	* texinfo.tex: Updated.
+
+2016-02-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Document that optimization in now the default,
+	there are new -s/--no-optimize options and that
+	pretty-printing and profiling disable optimization.
+	* gawk.1: Ditto.
+	* awkcard.in: Ditto.
+
+2016-02-03         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in (Command-Line Options): Change wording of -M description
+	to say "Select" instead of "Force".
+	(Arbitrary-Precision Arithmetic Features): Tweak the wording to make
+	it clear that MPFR is not used unless the -M option is supplied.
+
+2016-02-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (VMS Running): Improve the Texinfo usage.
+
+2016-01-31         John E. Malmberg     <wb8tyw@qsl.net>
+
+	* gawktexi.in (VMS Running): Add instructions on how to redirect
+	gawk data to a VMS command.
+
+2016-01-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Bracket Expressions): Document that '[', '.' and
+	'*' are literal inside bracket expressions.
+	(Two-way I/O): Add stuff about stdbuf and deadlocks.
+
+2016-01-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Array Sorting Functions): Clean up the code some,
+	per suggestion from Michal Jaegermann. Tighten up the prose
+	a bit too.
+
+2016-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog: Remove spurious whitespace.
+
+	Unrelated:
+
+	* gawk.1: Restore text on PROCINFO["RETRY"] and fix up the
+	formatting while we're at it. Thanks to Andrew Schorr for
+	pointing out the problem.
+
+2016-01-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Array Sorting Functions): Add an example of
+	using a function name with asort(). Response to bug report
+	Stephane Goujet <stephane.goujet@wanadoo.fr>.
+
+2016-01-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Finish documenting that --pretty-print
+	doesn't run the program. Thanks to Antonio
+	Giovanni Colombo for the report and patch.
+
+2016-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document that GNU/Linux on Alpha is no
+	longer supported.
+
+2015-12-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix some @c endfile. Thanks to Antonio
+	Giovanni Colombo for the report and patch.
+
+2015-12-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add PROCINFO["NONFATAL"] to the list for PROCINFO.
+	* gawk.1: Ditto.
+
+2015-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Update description of PROCINFO, and sort it properly.
+	* gawktexi.in: Ditto.
+
+2015-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add "exit" as synonym for "quit" in the
+	debugger.  Suggested by Joep van Delft <joepvandelft@xs4all.nl>.
+
+2015-11-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor edits.
+	* gawk.1: Revise \x to maximum of two digits.
+
+2015-11-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pdf-local): Remove igawk.1.pdf. Ooops.
+
+2015-10-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (awkcard.ps): Add options to force paper size
+	to letter. This makes the cut marks come out correctly even
+	if groff's default paper size is a4.
+
+2015-10-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Put commas outside quoting in regexps to avoid
+	confusion. Thanks to Mike Frysinger <vapier@gentoo.org>.
+
+2015-10-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkcard.in: Fix tbl complaint.
+
+2015-10-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to a working version.
+
+2015-10-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Revert update. It stopped working. I should learn
+	to test these things. Thanks to Antonio Giovanni Colombo for
+	the report.
+
+2015-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Note that there is no support for SSL.
+
+2015-09-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Update to latest.
+
+2015-08-28	Daniel Richard G.	<skunk@iSKUNK.ORG>
+
+	* doc/gawktexi.in: Check for the "struct passwd.pw_passwd" and
+	"struct group.gr_passwd" fields and conditionalize their use, as
+	they don't exist on z/OS.
+	* Makefile.am (pdf-local): Renamed from "pdf", as Automake already
+	defines "pdf" and warns us as much.
+
+2015-08-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Typo fixes in Appendix A.
+	Thanks to Antonio Colombo.
+
+2015-07-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Small typo fix; thanks to Antonio Colombo
+	for noticing.
+
+2015-07-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update info on Quiktrim awk; thanks to
+	Antonio Colombo for the pointer.
+
+2015-06-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Limitations): Document that sometimes the
+	debugger can affect the program being run.
+	Thanks to Hermann Peifer for the test case.
+
+2015-06-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update description of values returned by typeof.
+
+2015-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkinet.info: Fix an old arnold@gnu.org.
+
+2015-06-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Document inplace shortcomings -- it does not preserve
+	ACLs, and it may leave temporary files behind if killed by a signal.
+
+2015-06-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Document new inplace variable to control whether
+	inplace editing is active.
+
+2015-06-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Comment out exercise 10.3, since the answer
+	is included in the text. Thanks to Antonio Colombo
+	for pointing this out.
+
+2015-06-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add another pithy quote from Chet Ramey. Currently
+	commented out.
+
+2015-05-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Revised description of default field parsing
+	for POSIX. Newline is now a separator also.  Thanks to
+	Michael Klement <michael.klement@usa.net> for pointing this out.
+	* gawk.1: Updated too.
+
+2015-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Bitwise Functions): Update results of testbits.awk.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Bump patch level and modified date.
+	Move to modern version of @image.
+	* texinfo.tex: Update to latest.
+	* array-elements.txt: Remove texinfo commands.
+
+2015-05-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add a pithy quote from Chet Ramey. Currently
+	commented out.
+
+2015-05-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix description of nextfile within a function. Sigh.
+
+2015-05-15         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in (Undocumented): Describe the new PROCINFO["argv"] array.
+
+2015-05-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Bugs): Add that email should be in plain
+	text and not in HTML.  Sigh.
+
+2015-05-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add doc on conversions for strongly typed
+	regexp variables.
+
+2015-05-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add initial documentation for strongly typed
+	regexps and for `typeof'.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Undocumented): More info added.
+
+2015-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update feature history section.
+
+2015-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add a minor note to revisit FPAT pattern for CSV
+	files at some point.
+
+2015-04-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Replace http://gawkextlib.sourceforge.net with
+	http://sourceforge.net/projects/gawkextlib, since the former link
+	contains obsolete info.  Update the gawkextlib build instructions
+	to point to http://sourceforge.net/projects/gawkextlib/files for the
+	current info.
+
+2015-04-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix a figure caption. Thanks to Antonio Colombo
+	for pointing this out.
+	* gawktexi.in: Additional typo fix, also thanks to Antonio.
+
+2015-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, gawk.1, awkcard.in: Name change: div() --> intdiv().
+
+2015-03-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update discussion of calling built-in functions
+	indirectly. Small additional fix relating to rand(). Thanks
+	to Antonio Colombo.
+
+2015-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor edits.
+
+2015-03-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor fixes from Antonio Colombo and new exercise
+	in chapter 16.
+	* gawk.1: Minor edits.
+	* gawktexi.in: Edits in material on errno and retryable and get_file
+	API.
+
+2015-03-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Modify inplace.awk to call inplace_end in BEGINFILE
+	and END instead of in ENDFILE. This way, actions in ENDFILE rules
+	will be redirected as expected.
+
+2015-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Turn "positive" into non-negative as appropriate.
+	Thanks to Nicholas Mills <nlmills@clemson.edu> for pointing out
+	the issue.
+
+2015-03-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Briefly describe that nonfatal I/O overrides
+	GAWK_SOCK_RETRIES, in the env var part and in the nonfatal I/O
+	part.
+
+2015-03-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Change quotes to @dfn for pseudorandom.
+	A last-minute O'Reilly fix.
+
+2015-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update UPDATE-MONTH and copyright year.
+	Note that "the guide is definitive" quote is really
+	from "The Restaurant at the End of the Universe". Thanks
+	to Antonio Colombo for pointing this out.
+
+2015-02-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Update to most current version.
+	* gawktexi.in: Minor edit to match an O'Reilly fix.
+	Add some FIXMEs to one day use @sup.
+
+2015-02-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Change 'div' to 'divisor' in some examples.
+	This future-proofs against a new function in master.
+	Thanks to Antonio Giovanni Colombo for the report.
+
+2015-02-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More O'Reilly fixes. I think it's done!
+
+2015-02-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More O'Reilly fixes.
+
+2015-02-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: A few minor formatting fixes to sync with O'Reilly
+	version.
+
+2015-02-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes. Through QC1 review.
+
+2015-02-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+
+2015-02-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor fixes, O'Reilly fixes.
+
+2015-02-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Restore a lost sentence. O'Reilly fixes.
+
+2015-02-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+	Make non-fatal i/o use "NONFATAL".
+
+2015-02-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+
+2015-02-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+	* gawktexi.in: Update various version-related bits of info.
+
+2015-02-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+
+2015-02-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: POSIX requirement that function parameters cannot
+	have the same name as a function is now --posix.
+	Restore indirectcall example.
+
+	More O'Reilly fixes.
+
+2015-01-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document POSIX requirement that function parameters
+	cannot have the same name as a function. Fix indirectcall example.
+
+2015-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+	And still more. Also, fix @code --> @command in a number of places.
+
+2015-01-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+
+2015-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix a bad URL. And another one.
+	More O'Reilly fixes.
+
+2015-01-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+	(Glossary): Many new entries from Antonio Giovanni Colombo.
+
+2015-01-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+	Remove obsolete start/end of range indexing comments.
+
+2015-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: O'Reilly fixes.
+
+2015-01-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkinet.texi: Fix capitalization in document title.
+	* gawktexi.in: Here we go again: Starting on more O'Reilly fixes.
+
+2014-12-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add info that nonfatal I/O works with stdout and
+	stderr.  Revise version info and what was added when.
+
+2015-01-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Improve get_file documentation.
+
+2015-01-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Replace "Retrying I/O" with "Retrying Input", since this
+	feature pertains to input, not output.
+
+2015-01-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Document the get_file API function.
+
+2015-01-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.1: Document new features PROCINFO["errno"] and
+	PROCINFO["input", "RETRY"], and new getline return value of -2.
+	* gawktexi.in: Ditto.
+
+2014-12-26         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in (Glossary): Really sort the items.
+
+2014-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Start documenting nonfatal output.
+
+2014-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add one more paragraph to new foreword.
+	* gawktexi.in: Fix exponentiation in TeX mode. Thanks to
+	Marco Curreli by way of Antonio Giovanni Colombo.
+
+	* texinfo.tex: Updated.
+
+2014-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor fix.
+	Thanks to Teri Price <tjp212@lehigh.edu>.
+
+2014-12-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More minor fixes.
+
+2014-12-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More minor fixes.
+
+2014-12-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor fixes.
+
+2014-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: A minor fix.
+
+2014-12-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Various minor fixes and updates.
+
+2014-11-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update that TZ env. var can influence mktime
+	in running program.  Thanks to Hermann Peifer.
+
+2014-11-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update that RFC 4180 documents CSV data.
+
+2014-11-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Copyedits applied.
+
+2014-11-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Comment out that I need an owner for awk.info.
+	I may have found one or two people.
+
+2014-10-29         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Document new extras directory containing shell startup
+	files to manipulate AWKPATH and AWKLIBPATH environment variables.
+
+2014-10-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Clarification that debugger reads stdin.
+	* gawktexi.in: Ditto, and correctly place the "Braces" entry in
+	the Glossary. Thanks to Antonio Colombo for that.
+
+	Unrelated:
+
+	* gawktexi.in: Restore use of @sc. Karl fixed makeinfo. :-)
+
+2014-10-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor typo fixes.
+	Fix discussion of \x, per note from Antonio Colombo.
+
+2014-10-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix date in docbook attribution for new Foreword;
+	thanks to Antonio Colombo for the catch.  Update latest version
+	of gettext.
+
+2014-10-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Fix default value for AWKLIBPATH.
+	* gawktexi.in: Revised text for AWKPATH and AWKLIBPATH.
+
+2014-10-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add new Foreword from Mike Brennan.
+
+2014-10-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix example outputs in chapter 2.
+	Improve description of SYMTAB.
+
+2014-10-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Revise doc for {INT,STR}_CHAIN_MAX. Remove Pat
+	Rankin from VMS duties (per his request). Add a small TeX fix
+	for the table in ch 16 for requesting values.
+
+2014-10-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Finished changes!
+
+2014-10-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (EMRED): Renamed from EMISTERED to match original.
+	Thanks to Warren Toomey at TUHS for access to archives recording
+	the text.
+
+2014-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Pretty much done!
+
+	Unrelated:
+
+	* gawktexi.in: Fix braino in awk version of div function.
+	Thanks to Katie Wasserman for the catch.
+
+2014-10-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More fixes after reading through the MS.
+
+	Unrelated:
+
+	* gawktexi.in: Add Katie Wasserman's program to compute
+	the digits of PI.
+
+	Unrelated:
+
+	* gawktexi.in: Document the differences between profiling
+	and pretty printing.
+
+2014-09-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More fixes after reading through the MS.
+
+2014-09-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More fixes after reading through the MS.
+	And still more fixes.
+
+2014-09-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More fixes after reading through the MS.
+	Document the debugger's "where" command.
+
+2014-09-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Lots more fixes after reading through the MS.
+
+2014-09-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Rework the documentation of special files in
+	Chapter 5; some reordering as well as rewriting.
+
+2014-09-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktex.in: Continue fixes after reading through the MS.
+
+2014-09-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktex.in: Start on fixes after reading through the MS.
+
+2014-09-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix italics in quotations.  Some docbook special
+	cases.
+
+2014-09-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document that identifiers must use the English
+	letters.
+
+2014-09-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More edits during review, minor addition.
+
+2014-09-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Remove text that won't get used.
+
+2014-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor cleanups.
+
+2014-09-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document builtin functions in FUNCTAB and in
+	PROCINFO["identifiers"].
+	* gawk.1: Ditto.
+
+	Unrelated:
+
+	* gawktexi.in: More stuff from reviewer comments.
+
+2014-09-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document that indirect calls now work on built-in
+	and extension functions.
+	* gawk.1: Same.
+
+2014-09-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Further fixes from reviews and bug reports.
+
+2014-09-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Corrections to walkthrough in debugger chapter.
+	Thanks to David Ward <dlward134@gmail.com> for the problem report.
+
+2014-09-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add index entry for @ - @load, @include,
+	and indirect function calls. Thanks to "Kenny McKormack" in
+	comp.lang.awk.
+
+2014-08-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Continuing on reviewer comments, and other
+	bug fixes, miscellaneous improvements.
+
+2014-08-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Use a different mechanism to exclude
+	exercises. Remove use of LC_ALL in an example; doesn't seem
+	to be needed anymore.
+
+	Unrelated:
+
+	* gawktexi.in: Document that MirBSD is no longer supported.
+
+2014-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Exercises are excluded from print edition.
+
+2014-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Continuing on reviewer comments.
+
+2014-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Continuing on reviewer comments.
+
+2014-08-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Continuing on reviewer comments.
+
+2014-08-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Continuing on reviewer comments.
+
+2014-08-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Continuing on reviewer comments.
+
+2014-08-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Continuing on reviewer comments.
+
+2014-08-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Starting on reviewer comments.
+	Update acknowledgements.
+
+2014-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Cause div.awk to get into the example files.
+
+2014-08-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Misc minor additions.
+
+2014-08-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: For sprintf %c document that if value is a valid
+	wide character, gawk uses the low 8 bits of the value.
+
+	Unrelated:
+
+	* gawktexi.in: Fix doc for API get_record - errcode needs to
+	be greater than zero.
+
+2014-07-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Numeric Functions): For `div()', clarify
+	truncation is towards zero.  Thanks to Michal Jaegermann
+	for pointing out the need to clarify this.
+
+2014-07-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Numeric Functions): Document new `div()' function.
+	(Arbitrary Precision Integers): Document raison d'etre for div().
+	* gawk.1, awkcard.in: Document `div()'.
+
+2014-07-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Bracket Expressions): Add a note about how to
+	match ASCII characters.  Thanks to Hermann Peifer.
+
+2014-06-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update permissions on copyright page per
+	latest maintain.texi. Add GPL to print version of book.
+
+2014-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Document that --pretty-print no longer runs the
+	program. Remove mention of GAWK_NO_PP_RUN env var.
+
+2014-06-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Typo fixes and minor corrections.
+
+2014-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add thanks to Patrice Dumas and to Karl Berry.
+	Per request from Hermann Peifer, try to clarify how local variables
+	in functions are initialized.
+
+2014-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Split 6.1.4 into subsections. Other minor fixes.
+
+2014-06-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Finish adding exercises.
+	Rework chapter 15 on floating point and MPFR.
+	Spell check. Fix menues.
+
+2014-06-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Start adding exercises.
+
+2014-06-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Finish up summaries. Improvements in mystrtonum().
+
+2014-06-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix typos from changes of 3 June when macros were
+	added for filename, data file, etc. Ooops.
+
+2014-06-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More "Summary" sections. Through chapter 14.
+
+2014-06-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More "Summary" sections. Through chapter 10.
+
+2014-06-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update docbook figure markup.
+
+2014-06-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More "Summary" sections.
+	Judiciously arrange for full xrefs in docbook in a few spots.
+
+2014-06-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Start adding "Summary" sections.
+
+2014-06-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Restore macros for file name vs. filename etc.
+	Go through @if... and @ifnot... and fix them up too. Other misc.
+	cleanup.
+
+2014-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Remove some obsolete bits, fix up some other
+	minor stuff.
+
+2014-05-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Edits through the end!
+
+2014-05-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Edits through Appendix A.
+	* gawktexi.in: Tweak nested lists for docbook.
+
+2014-05-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Staying current): New section.
+
+2014-05-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in (BEGINFILE/ENDFILE): Update doc for getline - any
+	redirected form is allowed inside BEGINFILE/ENDFILE.
+
+2014-05-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add comments for where we need full xrefs in
+	docbook.
+
+2014-05-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Misc improvements for docbook, consistency
+	in table and figure captions.
+
+2014-05-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Edits through Chapter 16.
+
+2014-05-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Edits through Chapter 14.
+
+2014-05-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix displays for docbook, edits through Chapter 11.
+
+2014-05-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix real preface for docbook.
+
+2014-05-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Complete formatting for FOR_PRINT and not FOR_PRINT.
+
+2014-05-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Docbook edits for preface and parts.
+	Document AWKBUFSIZE.
+
+2014-05-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Editing progress. Through Chapter 9.
+
+2014-05-05         Michal Jaegermann     <michal@harddata.com>
+
+	* array-elements.fig: Fix subscripts to be aligned
+	horizontally.  Regenerate the other files.
+
+2014-05-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Editing progress. Through Chapter 8.
+	* array-elements.eps, array-elements.fig, array-elements.pdf,
+	array-elements.png array-elements.txt: New files.
+	* Makefile.am (EXTRA_DIST): Add them.
+
+2014-04-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Editing progress. Through Chapter 5.
+	* gawktexi.in: Editing progress. Through Chapter 6 and into
+	Chapter 7.
+
+2014-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Editing progress. Through Chapter 3.
+
+2014-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Start on revisions.
+
+2014-04-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Remove the bit about single character programs overflowing
+	the parse stack. It doesn't seem to be true anymore.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Update to latest.
+	* awkcard.in: Update copyright, patchlevel in download.
+	* gawktexi.in: Update patchlevel, update month, spell check.
+
+2014-03-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Cleanups to docbook, finish math stuff.
+
+2014-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor cleanups to the indexing.
+
+	Unrelated:
+
+	* gawktexi.in: Merge in changes needed for creating valid
+	DocBook XML. Works with post-5.2 Texinfo and dblatex!
+
+2014-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Finish the massive indexing improvements such that
+	functions are indexed the way I want in TeX and the way Eli
+	wants in Info.
+
+	Unrelated:
+
+	* gawktexi.in: Add a note in extension chapter that lookup of
+	PROCINFO can fail.
+
+2014-03-27         Eli Zaretskii             <eliz@gnu.org>
+
+	* gawktexi.in: First round of massive indexing improvements.
+
+2014-03-27         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Redo all the examples using BBS-list to a different
+	file that doesn't use out-of-date concepts.
+
+2014-03-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Finish indexing improvements. (For now, anyway.)
+
+	Unrelated:
+
+	* gawk.1: Document the quote flag! (Better late than never.)
+	* awkcard.in: Update documentation of quote flag.
+
+2014-03-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor edits to the discussion of the memory allocation
+	functions.
+
+2014-03-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawktexi.in: Document new extension API functions api_malloc,
+	api_calloc, api_realloc, and api_free.
+
+2014-03-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Indexing improvements.
+
+2014-03-02         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawktexi.in: Remove paragraph about obsolete VMS
+	  compilers.  Update reference about building PCSI kit.
+
+2014-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Lots of small fixes throughout, update of
+	profiling output.  Finished fixes needed before a release.
+
+2014-02-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add a quote to the alarm clock program.
+
+2014-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Update to latest.
+
+2014-02-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Lots of small edits.
+
+2014-02-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More minor fixes, update UPDATE_MONTH.
+
+2014-02-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More minor fixes, in indexing.
+
+2014-02-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, gawkinet.texi: Minor fixes, mostly in indexing.
+	* texinfo.tex: Update to latest.
+
+2014-01-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add `()' to names of extension functions in indexing
+	commands and in one place in the text. Consistency, don'tcha know.
+
+2014-01-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add a few missing STARTOFRANGE comments.
+	* gawk.1: Note that `(i, j) in array' doesn't work in for loops.
+	Update the copyright year.
+
+2014-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update info for Anders Wallin.
+
+2014-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to current version.
+	* gawktexi.in: Add magic stuff so that PDFs have "dark red"
+	links like before.
+
+2014-01-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Feature History): New node.
+	(Common Extensions): Update features now in mawk, too.
+
+2014-12-14         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawktexi.in: Add information on building VMS PCSI kit.
+
+2014-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Full Line Fields): New node.
+	Update copyright year.
+
+2013-12-29         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawktexi.in: VMS dynamic extensions.
+
+2013-12-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: More minor additions / fixes.
+	(Bugs): Add John Malmberg for VMS. Other minor edits.
+
+2013-12-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Minor additions / fixes.
+
+2013-12-23         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawktexi.in: Document the VMS exit status encoding.
+
+2013-12-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Additional Configuration Options): Document
+	the --disable-extensions option.
+
+2013-12-16         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawktexi.in: Updates to VMS sections.
+
+2013-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix the presentation of asort() and asorti().
+	Thanks to Andy Schorr for pointing out the problems.
+
+2013-11-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update quotations to use @author, fix a few
+	placements of footnotes.
+
+2013-11-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Update the list of files included in the gawk
+	distribution and fix a few typos.
+
+2013-11-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Fix the section and subsection headings in
+	the Preface.  Also change the short title page to just
+	"GNU Awk".
+
+2013-10-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Add @shorttitlepage command.
+
+2013-10-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Contributors): Update with more info.
+	(Distribution contents): Ditto.
+	General: Remove all hyphens when used with "multi" prefix.
+
+2013-10-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Other Environment Variables): Document GAWK_MSG_SRC
+	variable and fix documentation of *_CHAIN_MAX variables.
+
+2013-10-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Conversion, Printf Ordering): Better wording for
+	descriptions of CONVFMT. Thanks to Hermann Peifer.
+
+2013-09-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Other Versions): Updated info on MKS awk and
+	some other links.
+
+2013-09-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Readfile function): New node.
+
+2013-09-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (FN, FFN, DF,DDF, PVERSION, CTL): Remove macros.
+	They have no alternate versions and are just in the way.
+
+2013-08-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Document that ENVIRON updates affect the environment.
+	* gawktexi.in: Ditto.
+
+2013-06-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Update from Karl, fixes a formatting problem.
+	* gawktexi.in (Conversions): Undo @w{} around @option{--posix}.
+
+2013-06-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Type Functions): Add more explanation to isarray(),
+	including that it makes no sense to call it at the global level.
+
+2013-06-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Make it crystal clear not to use delete with FUNCTAB,
+	or attempt to assign to it.
+
+2013-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Internal File Description): Add "devbsize" element
+	to stat data array.
+
+2013-05-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Sample filefuncs.c extension code: Change test from
+	ifdef HAVE_ST_BLKSIZE to HAVE_STRUCT_STAT_ST_BLKSIZE.
+
+2013-05-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (Quick Installation): Add a paragraph advising to
+	run `make install'. Thanks to Hermann Peifer.
+
+2013-05-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (gawkextlib): Add a note to use make install on
+	gawkextlib itself. Thanks to Hermann Peifer.
+	(Cut program): Fix test for skipping lines if -s was supplied.
+	Thanks to David Ward <bamberward@gmail.com> for the bug report.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, gawk.1: Document that a regexp constant as the second
+	argument to index() produces a fatal error.
+	* gawktexi.in: More cleanups. Particularly, cleanup the index.
+
+2013-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Renamed from gawkman.texi.
+	Add a reference to Overton's IEEE Math book in MPFR chapter.
+	Thanks to Nelson Beebe for the recommendation.
+	* Makefile.am, sidebar.awk: Adjusted.
+
+2013-04-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkman.texi: Cleanup in MPFR and API chapters.
+	Also minor cleanup in design decisions. Add vim modeline.
+	* api-figure2.fig: Minor fix.
+	* api-figure2.eps, api-figure2.pdf, api-figure2.png: Regenerated.
+
+2013-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Finish cleanup pass.
+	* awkcard.in: Document that getline sets RT.
+	* gawkman.texi: Ditto.
+
+2013-04-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Start cleanup pass.
+	* awkcard.in: Minor addition.
+	* gawkman.texi: Minor fixes.
+
+	* gawk.1, gawkman.texi: Document PROCINFO entries for API
+	major and minor versions.
+
+2013-04-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkman.texi: Update all the menus. Fix spelling errors. Remove
+	some unneeded fakenodes.
+
+2013-04-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkcard.in: Clean up and bring up to date.
+
+2013-04-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (gawk.ps, gawkinet.ps): Set TEXINPUTS to point
+	at $(srcdir) to be able to include various figures if doing a
+	build not in the source directory.
+
+2013-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkman.texi: New file. This is now the real source for the
+	manual and gawk.texi is generated from it.
+	* sidebar.awk: New file to DTRT for sidebars in the manual.
+	* Makefile.am (EXTRA_DIST): Update.
+	(gawk.texi): Add new rule to create / update it if necessary.
+
+2013-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Pretty much finish cleanup. Move i18n chapter to
+	after advanced features chapter.
+	* texinfo.tex: Updated to current in texinfo SVN.
+
+2013-04-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Continue cleanup.
+
+2013-04-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Add link to 'pawk' - awk for python.
+	Further cleanups.
+
+2013-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Continue cleanup.
+
+2013-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Continue cleanup.
+
+2013-04-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Continue cleanup.
+
+2013-04-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Continue cleanup.
+
+2013-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Start a simple cleanup pass before the release.
+
+2013-03-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Update URL for texinfo, fix a typo.
+
+2013-03-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Getline/Pipe): Add a nice quote from BWK.
+
+2013-02-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Restore centering of text images.
+
+2013-02-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Other Versions): Remove the description of xmlgawk.
+
+2013-02-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: For Info output, don't use @center on text images
+	since the new makeinfo doesn't yet center the file as a block.
+	Thanks to Karl Berry for the diagnostic.
+	* gawk.1: Remove commented out doc for -m option which was for
+	compatibility with BWK awk. His awk dropped it back in 2007.
+
+2013-01-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* api-figure2.txt, api-figure3.txt: Convert tabs to spaces.
+	* gawk.texi (Gory Details): Fix a command that new makeinfo doesn't
+	recognize.
+	(Conversion): Update example to be in POSIX mode. Thanks to
+	Hermann Peifer.
+
+2013-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Dynamic Typing): Clarify that gawk dies after the
+	first fatal error on the test program. Thanks to Hermann Peifer.
+
+2013-01-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Setting Precision): Fix a typo. 3.322 instead
+	of 3.332.  Thanks to Hermann Peifer.
+
+2013-01-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Minor edits to documentation for new inplace extension.
+
+2013-01-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.texi: Add documentation for new inplace extension.
+
+2013-01-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi, awkcard.in: Sync what mawk has. Main point of
+	interest is that mawk supports the three time functions.
+
+2013-01-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi, awkcard.in: Add Git Hub info for BWK awk.
+	Update copyrights.
+	* gawk.texi: Add Software Tools quote in chapter on library functions.
+
+2012-12-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Remove doc sym_constant() API function.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Remove an incorrect comment.
+	* awkcard.in: Bump patch level.
+
+2012-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Input Parsers): Add info on read_func.
+
+2012-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Move design decisions on new API to appendix C.
+	Move section on old extensions to last in the same appendix.
+
+2012-12-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* macros: Update to GPL Version 3 and add copyright year.
+	* texinfo.tex: Updated, from automake 1.12.6.
+	* gawk.texi (Derived Files): A few minor fixes.
+
+2012-12-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkforai.txt: Changed content to be pointers to the article
+	to avoid copyright issues.
+	* gawk.texi: Updated description of awkforai.txt.
+
+2012-12-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (I/O Functions): Document that fflush() is now part
+	of POSIX. Fix in a few other places as well.
+	* awkcard.in: Update for fflush().
+
+2012-12-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Fix all @tex ... @end tex tables to use a different
+	control character than @ so that the new makeinfo won't
+	complain about them. Thanks to Karl Berry for the guidance.
+	(Old Extension Mechanism): New node.
+
+2012-12-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: API chapter. Sync with gawkapi.h
+
+2012-11-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: API chapter. Change command for making shared libs
+	to use gcc, not ld. Thanks to Nelson Beebe.
+	(I/O Functions): Document new behavior for fflush().
+	* gawk.1: Update for fflush().
+	* awkcard.in: Ditto. And some general cleanup.
+
+2012-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Future Extensions): Point to TODO file in the
+	gawk dist.
+	(Implementation Limitations): New node, from old LIMITATIONS file.
+
+2012-11-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: In API chapter, document the full list of include
+	files that need to be included.
+
+2012-11-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: In API chapter, update behavior of stat function
+	in the filefuncs extension.  Update the code example and prose
+	to match the current code.
+
+2012-11-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: In API chapter, update behavior of readdir extension.
+
+2012-11-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Minor edits in API chapter.
+	Thanks to Nelson Beebe.
+
+2012-11-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Minor edits in API chapter.
+	Thanks to Andrew Schorr.
+
+2012-11-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Rearrange chapter order and separate into parts
+	using @part for TeX.  Fix capitalization in @caption text.
+	(Variable Scope): Document that arrays can be local also.
+	Thanks to Denis Shirokov <cosmogen@gmail.com>, for pointing out
+	the lack.
+
+2012-11-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Semi-rationalize invocations of @image.
+
+2012-11-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: New chapter on extension API.
+	* api-figure1.pdf, api-figure2.pdf, api-figure3.pdf,
+	general-program.pdf, process-flow.pdf: New files. Again.
+	* Makefile.am (EXTRA_DIST): Update. Again.
+
+2012-11-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* api-figure1.pdf, api-figure2.pdf, api-figure3.pdf: Removed.
+	* api-figure1.txt, api-figure2.txt, api-figure3.txt,
+	api-figure1.png, api-figure2.png, api-figure3.png: New files.
+	* Makefile.am (EXTRA_DIST): Update.
+
+	* gawk.texi: Fix up images.
+	* general-program.pdf, process-flow.pdf: Removed.
+	* general-program.png, process-flow.png,
+	general-program.txt, process-flow.txt: New files.
+	* Makefile.am (EXTRA_DIST): Update.
+
+2012-10-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* api-figure1.eps, api-figure1.fig, api-figure1.pdf,
+	api-figure2.eps, api-figure2.fig, api-figure2.pdf,
+	api-figure3.eps, api-figure3.fig, api-figure3.pdf: New files.
+	* Makefile.am (EXTRA_DIST): Add the above.
+
+2012-10-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Glossary): Document cookie, some cleanup of
+	notes at the end.
+
+2012-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: More doc on SYMTAB.
+
+2012-10-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (LN, install-data-hook, uninstall-hook): Removed. No
+	longer needed since dgawk and pgawk are gone.
+
+2012-10-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Add dgawk.1 to man page links created / removed
+	on install / uninstall. (On stable branch.)
+
+2012-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Glossary). Correct the full name for `ISO' per
+	bug report from William Bresler <wbresler@acm.org>. Add a link
+	to the ISO website.
+
+	* gawk.texi, gawk.1, awkcard.in: Document FUNCTAB, SYMTAB, and
+	PROCINFO["identifiers"]. Including that delete does not work
+	on FUNCTAB and SYMTAB.
+
+2012-09-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Nextfile Statement): Document that it's now part of POSIX
+	and update the title.
+	(Delete): Document that `delete array' is now part of POSIX.
+	* awkcard.in: Adjust coloring for nextfile and delete array.
+
+2012-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Updated to version 2012-09-05.06.
+
+2012-08-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Minor edits, fix some spelling mistakes.
+
+2012-08-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: More edits to chapter on arithmetic.
+	Primarily English changes.
+
+2012-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Emphasize more that floating point behavior is
+	not a language issue. Add a pointer to POSIX bc.
+	Move arithmetic chapter to later in the book, before chapter
+	on dynamic extensions.
+
+2012-08-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Update infrastructure to Automake 1.12.3.
+
+2012-08-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Fixed a math bug in the chapter on multiple
+	precision floating point. Thanks to John Haque.
+
+2012-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Merged discussion of numbers from Appendix C into
+	the chapter on arbitrary precision arithmetic. Did some surgery
+	on that chapter to organize it a little better.
+
+2012-08-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkcard.in, gawk.1, gawk.texi: Updated. Mostly for new API stuff
+	but also some other things.
+	* gawk.texi (Derived Files): New node.
+
+2012-08-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (install-data-hook): Install a dgawk.1 link to the
+	man page also. Remove it on uninstall.
+
+2012-07-29         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.texi: Document that RT is set by getline.
+
+2012-07-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1, awkcard.in: Document that and(), or(), and
+	xor() can all take any number of arguments, with a minimum of two.
+
+2012-06-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.texi: Rename gettimeofday function to getlocaltime, since
+	the new time extension will provide gettimeofday.
+
+2012-05-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.texi, gawk.1: Replace references to dlload with dl_load.
+	But much more work needs to be done on the docs.
+
+2012-05-19         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.texi, gawk.1: Document new -i option, and describe new default
+	.awk suffix behavior.
+
+2012-04-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.texi: Replace documentation of removed functions update_ERRNO and
+	update_ERRNO_saved with descriptions new functions update_ERRNO_int,
+	update_ERRNO_string and unset_ERRNO.  And fix a couple of examples
+	to use update_ERRNO_int instead of update_ERRNO.
+
+2012-03-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Minor style edits.
+
+2012-03-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.texi, gawk.1: Document new @load keyword.
+
+2012-03-20         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawk.texi, gawk.1: Add AWKLIBPATH.
+
+2012-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Ranges and Locales): Clarified ranges and
+	locales. Again.
+
+2012-08-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (PC Binary Installation): Document Eli Zaretskii's
+	site.
+	(Records): Update case of RS = "a". It only prints 1 if in
+	POSIX mode. Thanks to Jeroen Schot who first reported it.
+
+2012-07-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Ranges and Locales): Clarified ranges and
+	locales.
+
+2012-07-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Getline Notes): Discuss side effects in
+	argument expression.
+
+2012-06-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi, awkcard.in: Latest mawk understands /dev/stdin.
+
+2012-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Add that -b affects output.
+
+2012-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Update to latest from automake 1.12.
+
+2012-04-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* texinfo.tex: Update to latest from automake 1.11.4.
+
+2012-04-11         John Haque     <j.eh@mchsi.com>
+
+	* gawk.texi: Change RNDMODE to ROUNDMODE.
+	* gawk.1, awkcard.in: Ditto.
+
+2012-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Change --arbitrary-precision to --bignum.
+	* gawk.1: Ditto.
+	* awkcard.in: Add --bignum, RNDMODE, PREC.
+
+2012-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Editing on new chapter on arbitrary precision numbers.
+
+2012-03-31         John Haque     <j.eh@mchsi.com>
+
+	* gawk.texi, gawk.1: Add text on support for arbitrary precision
+	numbers.
+
+2012-02-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi, gawk.1: And some minor edits thereunto.
+
+2012-02-03         John Haque     <j.eh@mchsi.com>
+
+	* gawk.texi, gawk.1: Add text on read timeout.
+
+2011-12-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* awkcard.in, gawk.1: Minor edits after merge of executables.
+
+2011-12-21         John Haque     <j.eh@mchsi.com>
+
+	* gawk.texi: Updated sections on profiling and debugging
+	after merging the exes. Document new options --debug and
+	--load, and add a sub-section on loading extension library.
+	* gawk.1: Same.
+	* awkcard.in: Same.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2012-02-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi, awkcard.in: Bump patch level.
+	* texinfo.tex: Updated from Texinfo CVS.
+
+2011-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Various typo fixes from mailing list.
+
+2011-11-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Fix some .BR to be .B.
+
+2011-11-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Further improvement in the discussion of sorted array
+	traversal. Some sections reordered and text edited to suit.
+
+2011-11-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Try to improve discussion of sorted array
+	traversal.
+
+2011-09-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.1: Fix some spelling errors. Thanks to
+	Jeroen Schot <schot@A-Eskwadraat.nl>.
+	* gawk.texi: Some minor fixes.
+
+2011-08-31         John Haque     <j.eh@mchsi.com>
+
+	* gawk.texi: Updated gawk dynamic extension doc.
+
+2011-07-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi (Gory Details): Restore text on historical behavior
+	etc. and add explanation on gawk 4.0.x.
+
+2011-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk.texi: Add reference in node Expressions to node Precedence,
+	based on suggestion from Dan Jacobson dated 4 Jun 2001.
+
+2011-07-17  Paul Eggert  <eggert@twinsun.com>
+
+	* gawk.texi: Warn up-front (indirectly) that plain gawk is not
+	compatible with SVR4 awk and with POSIX awk.  Describe how
+	gawk differs from the GNU standard in its interpretation of
+	POSIXLY_CORRECT.  (From mail dated 15 May 2001).
+
+2011-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.0.
+	* 4.0.0: Remake the tar ball.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/doc/Makefile.am b/gawk-5.0.1/doc/Makefile.am
new file mode 100644
index 00000000000..24dd0405cd8
--- /dev/null
+++ b/gawk-5.0.1/doc/Makefile.am
@@ -0,0 +1,128 @@
+#
+# doc/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2007, 2010, 2011, 2016, 2017
+# the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+## process this file with automake to produce Makefile.in
+
+info_TEXINFOS = gawk.texi gawkinet.texi gawkworkflow.texi
+
+man_MANS = gawk.1
+
+EXTRA_DIST = ChangeLog ChangeLog.0 ChangeLog.1 \
+	README.card ad.block setter.outline \
+	awkcard.in awkforai.txt texinfo.tex cardfonts \
+	api-figure1.eps api-figure1.fig api-figure1.pdf \
+	api-figure1.png api-figure1.txt \
+	api-figure2.eps api-figure2.fig api-figure2.pdf \
+	api-figure2.png api-figure2.txt \
+	api-figure3.eps api-figure3.fig api-figure3.pdf \
+	api-figure3.png api-figure3.txt \
+	array-elements.eps array-elements.fig array-elements.pdf \
+	array-elements.png array-elements.txt \
+	gawktexi.in sidebar.awk \
+	general-program.eps general-program.fig general-program.pdf \
+	general-program.png general-program.txt \
+	it \
+	process-flow.eps process-flow.fig process-flow.pdf \
+	process-flow.png process-flow.txt \
+	macros colors no.colors $(man_MANS) \
+	lflashlight-small.xpic lflashlight.eps lflashlight.pdf \
+	rflashlight-small.xpic rflashlight.eps rflashlight.pdf \
+	statist.jpg statist.eps statist.pdf \
+	wordlist wordlist2 wordlist3 \
+	bc_notes
+
+# Get rid of generated files when cleaning
+CLEANFILES = *.ps *.html *.dvi *~ awkcard.nc awkcard.tr gawk.pdf gawkinet.pdf gawkworkflow.pdf awkcard.pdf gawk.1.pdf
+
+MAKEINFO = @MAKEINFO@ --no-split --force
+
+TROFF = groff -t -Tps -U
+SEDME = sed -e "s/^level0 restore/level0 restore flashme 100 72 moveto (Copyright `date '+%m-%d-%y %T'`, FSF, Inc. (all)) show/" \
+		-e "s/^\/level0 save def/\/level0 save def 30 -48 translate/"
+SEDME2 = sed '/%%Page: 10 10/,/0 Cg EP/d'
+
+CARDSRC = $(srcdir)/macros $(srcdir)/cardfonts $(srcdir)/colors awkcard.tr
+CARDSRC_N = $(srcdir)/macros $(srcdir)/cardfonts $(srcdir)/no.colors awkcard.tr
+CARDFILES= $(CARDSRC) ad.block awkcard.in setter.outline
+PAPEROPTS= -dpaper=letter -P-pletter
+
+# Use this if your troff can correctly handle macros from 'colors' file
+AWKCARD = awkcard.ps
+
+# Uncomment the following definition of AWKCARD if your troff can produce
+# Postscript but still has troubles with macros from 'colors'.  As this
+# is not groff you will have to change TROFF macro as well.  Do not forget
+# to ensure that awkcard.tr is processed by tbl.
+#AWKCARD = awkcard.nc
+
+gawk.texi: $(srcdir)/gawktexi.in $(srcdir)/sidebar.awk
+	awk -f $(srcdir)/sidebar.awk < $(srcdir)/gawktexi.in > gawk.texi
+
+postscript: gawk.ps gawkinet.ps gawkworkflow.ps gawk.1.ps $(AWKCARD)
+
+pdf-local: postscript gawk.pdf gawkinet.pdf awkcard.pdf gawk.1.pdf
+
+gawk.ps: gawk.dvi
+	TEXINPUTS=$(srcdir): dvips -o gawk.ps gawk.dvi
+
+gawkinet.ps: gawkinet.dvi
+	TEXINPUTS=$(srcdir): dvips -o gawkinet.ps gawkinet.dvi
+
+gawkworkflow.ps: gawkworkflow.dvi
+	TEXINPUTS=$(srcdir): dvips -o gawkworkflow.ps gawkworkflow.dvi
+
+gawk.1.ps: gawk.1
+	-groff -man $(srcdir)/gawk.1 > gawk.1.ps
+
+gawk.1.pdf: gawk.1.ps
+	ps2pdf gawk.1.ps gawk.1.pdf
+
+awkcard.tr: awkcard.in
+	sed 's:SRCDIR:$(srcdir):' < $(srcdir)/awkcard.in > awkcard.tr
+
+awkcard.ps: $(CARDFILES)
+	$(TROFF) $(PAPEROPTS) $(CARDSRC) | $(SEDME) | cat $(srcdir)/setter.outline - | $(SEDME2) > awkcard.ps
+
+awkcard.nc: $(CARDFILES)
+	$(TROFF) $(PAPEROPTS) $(CARDSRC_N) | $(SEDME) | cat $(srcdir)/setter.outline - | $(SEDME2) > awkcard.ps && touch awkcard.nc
+
+awkcard.pdf: awkcard.ps
+	ps2pdf awkcard.ps awkcard.pdf
+
+spell: spellmanual spellworkflow spellmanpage
+
+spellmanual:
+	@echo ==== gawktexi.in ====;
+	export LC_ALL=C ; spell "$(srcdir)"/gawktexi.in | \
+	sort -u | comm -23 - "$(srcdir)"/wordlist
+
+spellworkflow:
+	@echo ==== gawkworkflow.texi ====
+	export LC_ALL=C ; spell "$(srcdir)"/gawkworkflow.texi | \
+	sort -u | comm -23 - "$(srcdir)"/wordlist2
+
+spellmanpage:
+	@echo ==== gawk.1 ====
+	export LC_ALL=C ; spell "$(srcdir)"/gawk.1 | \
+	sort -u | comm -23 - "$(srcdir)"/wordlist3
diff --git a/gawk-5.0.1/doc/Makefile.in b/gawk-5.0.1/doc/Makefile.in
new file mode 100644
index 00000000000..9bce117db9a
--- /dev/null
+++ b/gawk-5.0.1/doc/Makefile.in
@@ -0,0 +1,950 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# doc/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2007, 2010, 2011, 2016, 2017
+# the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \
+	$(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libsigsegv.m4 $(top_srcdir)/m4/longlong.m4 \
+	$(top_srcdir)/m4/mpfr.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/noreturn.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/readline.m4 \
+	$(top_srcdir)/m4/socket.m4 $(top_srcdir)/m4/ulonglong.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+AM_V_DVIPS = $(am__v_DVIPS_@AM_V@)
+am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@)
+am__v_DVIPS_0 = @echo "  DVIPS   " $@;
+am__v_DVIPS_1 = 
+AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@)
+am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@)
+am__v_MAKEINFO_0 = @echo "  MAKEINFO" $@;
+am__v_MAKEINFO_1 = 
+AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@)
+am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@)
+am__v_INFOHTML_0 = @echo "  INFOHTML" $@;
+am__v_INFOHTML_1 = 
+AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@)
+am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@)
+am__v_TEXI2DVI_0 = @echo "  TEXI2DVI" $@;
+am__v_TEXI2DVI_1 = 
+AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@)
+am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@)
+am__v_TEXI2PDF_0 = @echo "  TEXI2PDF" $@;
+am__v_TEXI2PDF_1 = 
+AM_V_texinfo = $(am__v_texinfo_@AM_V@)
+am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@)
+am__v_texinfo_0 = -q
+am__v_texinfo_1 = 
+AM_V_texidevnull = $(am__v_texidevnull_@AM_V@)
+am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@)
+am__v_texidevnull_0 = > /dev/null
+am__v_texidevnull_1 = 
+INFO_DEPS = $(srcdir)/gawk.info $(srcdir)/gawkinet.info \
+	$(srcdir)/gawkworkflow.info
+am__TEXINFO_TEX_DIR = $(srcdir)
+DVIS = gawk.dvi gawkinet.dvi gawkworkflow.dvi
+PDFS = gawk.pdf gawkinet.pdf gawkworkflow.pdf
+PSS = gawk.ps gawkinet.ps gawkworkflow.ps
+HTMLS = gawk.html gawkinet.html gawkworkflow.html
+TEXINFOS = gawk.texi gawkinet.texi gawkworkflow.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+man1dir = $(mandir)/man1
+NROFF = nroff
+MANS = $(man_MANS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \
+	ChangeLog texinfo.tex
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GAWKLIBEXT = @GAWKLIBEXT@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_LIBSIGSEGV = @HAVE_LIBSIGSEGV@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMPFR = @LIBMPFR@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBSIGSEGV = @LIBSIGSEGV@
+LIBSIGSEGV_PREFIX = @LIBSIGSEGV_PREFIX@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSIGSEGV = @LTLIBSIGSEGV@
+MAKEINFO = @MAKEINFO@ --no-split --force
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+ZOS_FAIL = @ZOS_FAIL@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+acl_shlibext = @acl_shlibext@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgextensiondir = @pkgextensiondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+info_TEXINFOS = gawk.texi gawkinet.texi gawkworkflow.texi
+man_MANS = gawk.1
+EXTRA_DIST = ChangeLog ChangeLog.0 ChangeLog.1 \
+	README.card ad.block setter.outline \
+	awkcard.in awkforai.txt texinfo.tex cardfonts \
+	api-figure1.eps api-figure1.fig api-figure1.pdf \
+	api-figure1.png api-figure1.txt \
+	api-figure2.eps api-figure2.fig api-figure2.pdf \
+	api-figure2.png api-figure2.txt \
+	api-figure3.eps api-figure3.fig api-figure3.pdf \
+	api-figure3.png api-figure3.txt \
+	array-elements.eps array-elements.fig array-elements.pdf \
+	array-elements.png array-elements.txt \
+	gawktexi.in sidebar.awk \
+	general-program.eps general-program.fig general-program.pdf \
+	general-program.png general-program.txt \
+	it \
+	process-flow.eps process-flow.fig process-flow.pdf \
+	process-flow.png process-flow.txt \
+	macros colors no.colors $(man_MANS) \
+	lflashlight-small.xpic lflashlight.eps lflashlight.pdf \
+	rflashlight-small.xpic rflashlight.eps rflashlight.pdf \
+	statist.jpg statist.eps statist.pdf \
+	wordlist wordlist2 wordlist3 \
+	bc_notes
+
+
+# Get rid of generated files when cleaning
+CLEANFILES = *.ps *.html *.dvi *~ awkcard.nc awkcard.tr gawk.pdf gawkinet.pdf gawkworkflow.pdf awkcard.pdf gawk.1.pdf
+TROFF = groff -t -Tps -U
+SEDME = sed -e "s/^level0 restore/level0 restore flashme 100 72 moveto (Copyright `date '+%m-%d-%y %T'`, FSF, Inc. (all)) show/" \
+		-e "s/^\/level0 save def/\/level0 save def 30 -48 translate/"
+
+SEDME2 = sed '/%%Page: 10 10/,/0 Cg EP/d'
+CARDSRC = $(srcdir)/macros $(srcdir)/cardfonts $(srcdir)/colors awkcard.tr
+CARDSRC_N = $(srcdir)/macros $(srcdir)/cardfonts $(srcdir)/no.colors awkcard.tr
+CARDFILES = $(CARDSRC) ad.block awkcard.in setter.outline
+PAPEROPTS = -dpaper=letter -P-pletter
+
+# Use this if your troff can correctly handle macros from 'colors' file
+AWKCARD = awkcard.ps
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu doc/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+.texi.info:
+	$(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+	am__cwd=`pwd` && $(am__cd) $(srcdir) && \
+	rm -rf $$backupdir && mkdir $$backupdir && \
+	if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+	  for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+	    if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+	  done; \
+	else :; fi && \
+	cd "$$am__cwd"; \
+	if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+	 -o $@ $<; \
+	then \
+	  rc=0; \
+	  $(am__cd) $(srcdir); \
+	else \
+	  rc=$$?; \
+	  $(am__cd) $(srcdir) && \
+	  $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+	fi; \
+	rm -rf $$backupdir; exit $$rc
+
+.texi.dvi:
+	$(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+	$(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \
+	$<
+
+.texi.pdf:
+	$(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+	MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+	$(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \
+	$<
+
+.texi.html:
+	$(AM_V_MAKEINFO)rm -rf $(@:.html=.htp)
+	$(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+	 -o $(@:.html=.htp) $<; \
+	then \
+	  rm -rf $@ && mv $(@:.html=.htp) $@; \
+	else \
+	  rm -rf $(@:.html=.htp); exit 1; \
+	fi
+$(srcdir)/gawk.info: gawk.texi 
+gawk.dvi: gawk.texi 
+gawk.pdf: gawk.texi 
+gawk.html: gawk.texi 
+$(srcdir)/gawkinet.info: gawkinet.texi 
+gawkinet.dvi: gawkinet.texi 
+gawkinet.pdf: gawkinet.texi 
+gawkinet.html: gawkinet.texi 
+$(srcdir)/gawkworkflow.info: gawkworkflow.texi 
+gawkworkflow.dvi: gawkworkflow.texi 
+gawkworkflow.pdf: gawkworkflow.texi 
+gawkworkflow.html: gawkworkflow.texi 
+.dvi.ps:
+	$(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+	$(DVIPS) $(AM_V_texinfo) -o $@ $<
+
+uninstall-dvi-am:
+	@$(NORMAL_UNINSTALL)
+	@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(dvidir)/$$f"; \
+	done
+
+uninstall-html-am:
+	@$(NORMAL_UNINSTALL)
+	@list='$(HTMLS)'; test -n "$(htmldir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
+	  rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
+	done
+
+uninstall-info-am:
+	@$(PRE_UNINSTALL)
+	@if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \
+	  list='$(INFO_DEPS)'; \
+	  for file in $$list; do \
+	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
+	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+	    if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+	    then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \
+	  done; \
+	else :; fi
+	@$(NORMAL_UNINSTALL)
+	@list='$(INFO_DEPS)'; \
+	for file in $$list; do \
+	  relfile=`echo "$$file" | sed 's|^.*/||'`; \
+	  relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+	  (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
+	     echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+	     rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+	   else :; fi); \
+	done
+
+uninstall-pdf-am:
+	@$(NORMAL_UNINSTALL)
+	@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
+	done
+
+uninstall-ps-am:
+	@$(NORMAL_UNINSTALL)
+	@list='$(PSS)'; test -n "$(psdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(psdir)/$$f"; \
+	done
+
+dist-info: $(INFO_DEPS)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	list='$(INFO_DEPS)'; \
+	for base in $$list; do \
+	  case $$base in \
+	    $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+	  esac; \
+	  if test -f $$base; then d=.; else d=$(srcdir); fi; \
+	  base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+	  for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+	    if test -f $$file; then \
+	      relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+	      test -f "$(distdir)/$$relfile" || \
+		cp -p $$file "$(distdir)/$$relfile"; \
+	    else :; fi; \
+	  done; \
+	done
+
+mostlyclean-aminfo:
+	-rm -rf gawk.t2d gawk.t2p gawkinet.t2d gawkinet.t2p gawkworkflow.t2d \
+	  gawkworkflow.t2p
+
+clean-aminfo:
+	-test -z "gawk.dvi gawk.pdf gawk.ps gawk.html gawkinet.dvi gawkinet.pdf \
+	  gawkinet.ps gawkinet.html gawkworkflow.dvi gawkworkflow.pdf \
+	  gawkworkflow.ps gawkworkflow.html" \
+	|| rm -rf gawk.dvi gawk.pdf gawk.ps gawk.html gawkinet.dvi gawkinet.pdf \
+	  gawkinet.ps gawkinet.html gawkworkflow.dvi gawkworkflow.pdf \
+	  gawkworkflow.ps gawkworkflow.html
+
+maintainer-clean-aminfo:
+	@list='$(INFO_DEPS)'; for i in $$list; do \
+	  i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+	  echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+	  rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+	done
+install-man1: $(man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(man_MANS)'; \
+	test -n "$(man1dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.1[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man1:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man1dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.1[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	$(MAKE) $(AM_MAKEFLAGS) \
+	  top_distdir="$(top_distdir)" distdir="$(distdir)" \
+	  dist-info
+check-am: all-am
+check: check-am
+all-am: Makefile $(INFO_DEPS) $(MANS)
+installdirs:
+	for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-aminfo clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS)
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-info-am install-man
+
+install-dvi: install-dvi-am
+
+install-dvi-am: $(DVIS)
+	@$(NORMAL_INSTALL)
+	@list='$(DVIS)'; test -n "$(dvidir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \
+	done
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am: $(HTMLS)
+	@$(NORMAL_INSTALL)
+	@list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  $(am__strip_dir) \
+	  d2=$$d$$p; \
+	  if test -d "$$d2"; then \
+	    echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
+	    $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
+	    echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+	    $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \
+	  else \
+	    list2="$$list2 $$d2"; \
+	  fi; \
+	done; \
+	test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \
+	done; }
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+	@$(NORMAL_INSTALL)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+	list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \
+	fi; \
+	for file in $$list; do \
+	  case $$file in \
+	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+	  esac; \
+	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
+	  file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+	  for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+	               $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+	    if test -f $$ifile; then \
+	      echo "$$ifile"; \
+	    else : ; fi; \
+	  done; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done
+	@$(POST_INSTALL)
+	@if $(am__can_run_installinfo); then \
+	  list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \
+	  for file in $$list; do \
+	    relfile=`echo "$$file" | sed 's|^.*/||'`; \
+	    echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+	    install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+	  done; \
+	else : ; fi
+install-man: install-man1
+
+install-pdf: install-pdf-am
+
+install-pdf-am: $(PDFS)
+	@$(NORMAL_INSTALL)
+	@list='$(PDFS)'; test -n "$(pdfdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done
+install-ps: install-ps-am
+
+install-ps-am: $(PSS)
+	@$(NORMAL_INSTALL)
+	@list='$(PSS)'; test -n "$(psdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+	maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am: $(PDFS) pdf-local
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
+	uninstall-man uninstall-pdf-am uninstall-ps-am
+
+uninstall-man: uninstall-man1
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-aminfo clean-generic \
+	cscopelist-am ctags-am dist-info distclean distclean-generic \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-man1 install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-aminfo \
+	maintainer-clean-generic mostlyclean mostlyclean-aminfo \
+	mostlyclean-generic pdf pdf-am pdf-local ps ps-am tags-am \
+	uninstall uninstall-am uninstall-dvi-am uninstall-html-am \
+	uninstall-info-am uninstall-man uninstall-man1 \
+	uninstall-pdf-am uninstall-ps-am
+
+.PRECIOUS: Makefile
+
+
+# Uncomment the following definition of AWKCARD if your troff can produce
+# Postscript but still has troubles with macros from 'colors'.  As this
+# is not groff you will have to change TROFF macro as well.  Do not forget
+# to ensure that awkcard.tr is processed by tbl.
+#AWKCARD = awkcard.nc
+
+gawk.texi: $(srcdir)/gawktexi.in $(srcdir)/sidebar.awk
+	awk -f $(srcdir)/sidebar.awk < $(srcdir)/gawktexi.in > gawk.texi
+
+postscript: gawk.ps gawkinet.ps gawkworkflow.ps gawk.1.ps $(AWKCARD)
+
+pdf-local: postscript gawk.pdf gawkinet.pdf awkcard.pdf gawk.1.pdf
+
+gawk.ps: gawk.dvi
+	TEXINPUTS=$(srcdir): dvips -o gawk.ps gawk.dvi
+
+gawkinet.ps: gawkinet.dvi
+	TEXINPUTS=$(srcdir): dvips -o gawkinet.ps gawkinet.dvi
+
+gawkworkflow.ps: gawkworkflow.dvi
+	TEXINPUTS=$(srcdir): dvips -o gawkworkflow.ps gawkworkflow.dvi
+
+gawk.1.ps: gawk.1
+	-groff -man $(srcdir)/gawk.1 > gawk.1.ps
+
+gawk.1.pdf: gawk.1.ps
+	ps2pdf gawk.1.ps gawk.1.pdf
+
+awkcard.tr: awkcard.in
+	sed 's:SRCDIR:$(srcdir):' < $(srcdir)/awkcard.in > awkcard.tr
+
+awkcard.ps: $(CARDFILES)
+	$(TROFF) $(PAPEROPTS) $(CARDSRC) | $(SEDME) | cat $(srcdir)/setter.outline - | $(SEDME2) > awkcard.ps
+
+awkcard.nc: $(CARDFILES)
+	$(TROFF) $(PAPEROPTS) $(CARDSRC_N) | $(SEDME) | cat $(srcdir)/setter.outline - | $(SEDME2) > awkcard.ps && touch awkcard.nc
+
+awkcard.pdf: awkcard.ps
+	ps2pdf awkcard.ps awkcard.pdf
+
+spell: spellmanual spellworkflow spellmanpage
+
+spellmanual:
+	@echo ==== gawktexi.in ====;
+	export LC_ALL=C ; spell "$(srcdir)"/gawktexi.in | \
+	sort -u | comm -23 - "$(srcdir)"/wordlist
+
+spellworkflow:
+	@echo ==== gawkworkflow.texi ====
+	export LC_ALL=C ; spell "$(srcdir)"/gawkworkflow.texi | \
+	sort -u | comm -23 - "$(srcdir)"/wordlist2
+
+spellmanpage:
+	@echo ==== gawk.1 ====
+	export LC_ALL=C ; spell "$(srcdir)"/gawk.1 | \
+	sort -u | comm -23 - "$(srcdir)"/wordlist3
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/doc/README.card b/gawk-5.0.1/doc/README.card
new file mode 100644
index 00000000000..ef77cdacec7
--- /dev/null
+++ b/gawk-5.0.1/doc/README.card
@@ -0,0 +1,19 @@
+Mon Dec  9 12:45:48 EST 1996
+
+The AWK reference card included here requires a modern version of troff
+(ditroff). GNU Troff (groff) is known to work.
+
+If your troff is able to produce Postscript but does not know how to
+properly use the macros from `colors' file then try to uncomment in
+Makefile the defintion which sets AWKCARD to awkcard.nc (no colors).
+This will definitely require changes to the TROFF macro and you have to
+ensure that the tbl preprocessor is called.  For example, the following
+modifications on NeXT:
+
+TROFF = tbl
+SEDME = ptroff -t | sed -e \
+	"s/^level0 restore/level0 restore flashme 100 72 moveto\
+ (Copyright `date`, FSF, Inc. (all)) show/" \
+	-e "s/^\/level0 save def/\/level0 save def 30 -48 translate/"
+
+will produce a correctly formatted, albeit monochromatic, reference card.
diff --git a/gawk-5.0.1/doc/ad.block b/gawk-5.0.1/doc/ad.block
new file mode 100644
index 00000000000..54a0f31de37
--- /dev/null
+++ b/gawk-5.0.1/doc/ad.block
@@ -0,0 +1,49 @@
+.\" AWK Reference Card --- Arnold Robbins, arnold@skeeve.com
+.\" This file is the Ad block (included in cover)
+.\"
+.\" Copyright (C) 1996, 1998, 2000, 2001, 2003, 2017
+.\" Free Software Foundation, Inc.
+.\" 
+.\" Permission is granted to make and distribute verbatim copies of
+.\" this reference card provided the copyright notice and this permission
+.\" notice are preserved on all copies.
+.\" 
+.\" Permission is granted to process this file through troff and print the
+.\" results, provided the printed document carries copying permission
+.\" notice identical to this one except for the removal of this paragraph
+.\" (this paragraph not being relevant to the printed reference card).
+.\" 
+.\" Permission is granted to copy and distribute modified versions of this
+.\" reference card under the conditions for verbatim copying, provided that
+.\" the entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\" 
+.\" Permission is granted to copy and distribute translations of this
+.\" reference card into another language, under the above conditions for
+.\" modified versions, except that this permission notice may be stated in
+.\" a translation approved by the Foundation.
+.\"
+.ft HB
+.ps 10
+.vs 12
+.ES
+.nf
+.ce 7
+\*(CBFree Software Foundation, Inc.
+.ft H
+51 Franklin Street, Fifth Floor
+Boston, MA  02110-1301 USA
+Phone: +1-617-542-5942
+Fax (including Japan): +1-617-542-2652
+E-mail: gnu@gnu.org
+URL: https://www.gnu.org
+
+.ce 5
+.ft HB
+\*(CGSource Distributions on CD-ROM
+.\" Deluxe Distributions
+Emacs, Make and GDB Manuals
+Emacs and GDB References\*(CX
+.EB "\f(HBOTHER FSF PRODUCTS:\*(FR"
+.ps
+.vs
diff --git a/gawk-5.0.1/doc/api-figure1.eps b/gawk-5.0.1/doc/api-figure1.eps
new file mode 100644
index 00000000000..7af094c9ee3
--- /dev/null
+++ b/gawk-5.0.1/doc/api-figure1.eps
@@ -0,0 +1,536 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: api-figure1.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5d
+%%CreationDate: Wed Oct 31 20:16:08 2012
+%%BoundingBox: 0 0 399 227
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/MyAppDict 100 dict dup begin def
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+% This junk string is used by the show operators
+/PATsstr 1 string def
+/PATawidthshow { 	% cx cy cchar rx ry string
+  % Loop over each character in the string
+  {  % cx cy cchar rx ry char
+    % Show the character
+    dup				% cx cy cchar rx ry char char
+    PATsstr dup 0 4 -1 roll put	% cx cy cchar rx ry char (char)
+    false charpath		% cx cy cchar rx ry char
+    /clip load PATdraw
+    % Move past the character (charpath modified the
+    % current point)
+    currentpoint			% cx cy cchar rx ry char x y
+    newpath
+    moveto			% cx cy cchar rx ry char
+    % Reposition by cx,cy if the character in the string is cchar
+    3 index eq {			% cx cy cchar rx ry
+      4 index 4 index rmoveto
+    } if
+    % Reposition all characters by rx ry
+    2 copy rmoveto		% cx cy cchar rx ry
+  } forall
+  pop pop pop pop pop		% -
+  currentpoint
+  newpath
+  moveto
+} bind def
+/PATcg {
+  7 dict dup begin
+    /lw currentlinewidth def
+    /lc currentlinecap def
+    /lj currentlinejoin def
+    /ml currentmiterlimit def
+    /ds [ currentdash ] def
+    /cc [ currentrgbcolor ] def
+    /cm matrix currentmatrix def
+  end
+} bind def
+% PATdraw - calculates the boundaries of the object and
+% fills it with the current pattern
+/PATdraw {			% proc
+  save exch
+    PATpcalc			% proc nw nh px py
+    5 -1 roll exec		% nw nh px py
+    newpath
+    PATfill			% -
+  restore
+} bind def
+% PATfill - performs the tiling for the shape
+/PATfill { % nw nh px py PATfill -
+  PATDict /CurrentPattern get dup begin
+    setfont
+    % Set the coordinate system to Pattern Space
+    PatternGState PATsg
+    % Set the color for uncolored pattezns
+    PaintType 2 eq { PATDict /PColor get PATsc } if
+    % Create the string for showing
+    3 index string		% nw nh px py str
+    % Loop for each of the pattern sources
+    0 1 Multi 1 sub {		% nw nh px py str source
+	% Move to the starting location
+	3 index 3 index		% nw nh px py str source px py
+	moveto			% nw nh px py str source
+	% For multiple sources, set the appropriate color
+	Multi 1 ne { dup PC exch get PATsc } if
+	% Set the appropriate string for the source
+	0 1 7 index 1 sub { 2 index exch 2 index put } for pop
+	% Loop over the number of vertical cells
+	3 index 		% nw nh px py str nh
+	{			% nw nh px py str
+	  currentpoint		% nw nh px py str cx cy
+	  2 index oldshow	% nw nh px py str cx cy
+	  YStep add moveto	% nw nh px py str
+	} repeat		% nw nh px py str
+    } for
+    5 { pop } repeat
+  end
+} bind def
+
+% PATkshow - kshow with the current pattezn
+/PATkshow {			% proc string
+  exch bind			% string proc
+  1 index 0 get			% string proc char
+  % Loop over all but the last character in the string
+  0 1 4 index length 2 sub {
+				% string proc char idx
+    % Find the n+1th character in the string
+    3 index exch 1 add get	% string proc char char+1
+    exch 2 copy			% strinq proc char+1 char char+1 char
+    % Now show the nth character
+    PATsstr dup 0 4 -1 roll put	% string proc chr+1 chr chr+1 (chr)
+    false charpath		% string proc char+1 char char+1
+    /clip load PATdraw
+    % Move past the character (charpath modified the current point)
+    currentpoint newpath moveto
+    % Execute the user proc (should consume char and char+1)
+    mark 3 1 roll		% string proc char+1 mark char char+1
+    4 index exec		% string proc char+1 mark...
+    cleartomark			% string proc char+1
+  } for
+  % Now display the last character
+  PATsstr dup 0 4 -1 roll put	% string proc (char+1)
+  false charpath		% string proc
+  /clip load PATdraw
+  neewath
+  pop pop			% -
+} bind def
+% PATmp - the makepattern equivalent
+/PATmp {			% patdict patmtx PATmp patinstance
+  exch dup length 7 add		% We will add 6 new entries plus 1 FID
+  dict copy			% Create a new dictionary
+  begin
+    % Matrix to install when painting the pattern
+    TilingType PATtcalc
+    /PatternGState PATcg def
+    PatternGState /cm 3 -1 roll put
+    % Check for multi pattern sources (Level 1 fast color patterns)
+    currentdict /Multi known not { /Multi 1 def } if
+    % Font dictionary definitions
+    /FontType 3 def
+    % Create a dummy encoding vector
+    /Encoding 256 array def
+    3 string 0 1 255 {
+      Encoding exch dup 3 index cvs cvn put } for pop
+    /FontMatrix matrix def
+    /FontBBox BBox def
+    /BuildChar {
+	mark 3 1 roll		% mark dict char
+	exch begin
+	Multi 1 ne {PaintData exch get}{pop} ifelse  % mark [paintdata]
+	  PaintType 2 eq Multi 1 ne or
+	  { XStep 0 FontBBox aload pop setcachedevice }
+	  { XStep 0 setcharwidth } ifelse
+	  currentdict		% mark [paintdata] dict
+	  /PaintProc load	% mark [paintdata] dict paintproc
+	end
+	gsave
+	  false PATredef exec true PATredef
+	grestore
+	cleartomark		% -
+    } bind def
+    currentdict
+  end				% newdict
+  /foo exch			% /foo newlict
+  definefont			% newfont
+} bind def
+% PATpcalc - calculates the starting point and width/height
+% of the tile fill for the shape
+/PATpcalc {	% - PATpcalc nw nh px py
+  PATDict /CurrentPattern get begin
+    gsave
+	% Set up the coordinate system to Pattern Space
+	% and lock down pattern
+	PatternGState /cm get setmatrix
+	BBox aload pop pop pop translate
+	% Determine the bounding box of the shape
+	pathbbox			% llx lly urx ury
+    grestore
+    % Determine (nw, nh) the # of cells to paint width and height
+    PatHeight div ceiling		% llx lly urx qh
+    4 1 roll				% qh llx lly urx
+    PatWidth div ceiling		% qh llx lly qw
+    4 1 roll				% qw qh llx lly
+    PatHeight div floor			% qw qh llx ph
+    4 1 roll				% ph qw qh llx
+    PatWidth div floor			% ph qw qh pw
+    4 1 roll				% pw ph qw qh
+    2 index sub cvi abs			% pw ph qs qh-ph
+    exch 3 index sub cvi abs exch	% pw ph nw=qw-pw nh=qh-ph
+    % Determine the starting point of the pattern fill
+    %(px, py)
+    4 2 roll				% nw nh pw ph
+    PatHeight mul			% nw nh pw py
+    exch				% nw nh py pw
+    PatWidth mul exch			% nw nh px py
+  end
+} bind def
+
+% Save the original routines so that we can use them later on
+/oldfill	/fill load def
+/oldeofill	/eofill load def
+/oldstroke	/stroke load def
+/oldshow	/show load def
+/oldashow	/ashow load def
+/oldwidthshow	/widthshow load def
+/oldawidthshow	/awidthshow load def
+/oldkshow	/kshow load def
+
+% These defs are necessary so that subsequent procs don't bind in
+% the originals
+/fill	   { oldfill } bind def
+/eofill	   { oldeofill } bind def
+/stroke	   { oldstroke } bind def
+/show	   { oldshow } bind def
+/ashow	   { oldashow } bind def
+/widthshow { oldwidthshow } bind def
+/awidthshow { oldawidthshow } bind def
+/kshow 	   { oldkshow } bind def
+/PATredef {
+  MyAppDict begin
+    {
+    /fill { /clip load PATdraw newpath } bind def
+    /eofill { /eoclip load PATdraw newpath } bind def
+    /stroke { PATstroke } bind def
+    /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def
+    /ashow { 0 0 null 6 3 roll PATawidthshow }
+    bind def
+    /widthshow { 0 0 3 -1 roll PATawidthshow }
+    bind def
+    /awidthshow { PATawidthshow } bind def
+    /kshow { PATkshow } bind def
+  } {
+    /fill   { oldfill } bind def
+    /eofill { oldeofill } bind def
+    /stroke { oldstroke } bind def
+    /show   { oldshow } bind def
+    /ashow  { oldashow } bind def
+    /widthshow { oldwidthshow } bind def
+    /awidthshow { oldawidthshow } bind def
+    /kshow  { oldkshow } bind def
+    } ifelse
+  end
+} bind def
+false PATredef
+% Conditionally define setcmykcolor if not available
+/setcmykcolor where { pop } {
+  /setcmykcolor {
+    1 sub 4 1 roll
+    3 {
+	3 index add neg dup 0 lt { pop 0 } if 3 1 roll
+    } repeat
+    setrgbcolor - pop
+  } bind def
+} ifelse
+/PATsc {		% colorarray
+  aload length		% c1 ... cn length
+    dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor
+  } ifelse } ifelse
+} bind def
+/PATsg {		% dict
+  begin
+    lw setlinewidth
+    lc setlinecap
+    lj setlinejoin
+    ml setmiterlimit
+    ds aload pop setdash
+    cc aload pop setrgbcolor
+    cm setmatrix
+  end
+} bind def
+
+/PATDict 3 dict def
+/PATsp {
+  true PATredef
+  PATDict begin
+    /CurrentPattern exch def
+    % If it's an uncolored pattern, save the color
+    CurrentPattern /PaintType get 2 eq {
+      /PColor exch def
+    } if
+    /CColor [ currentrgbcolor ] def
+  end
+} bind def
+% PATstroke - stroke with the current pattern
+/PATstroke {
+  countdictstack
+  save
+  mark
+  {
+    currentpoint strokepath moveto
+    PATpcalc				% proc nw nh px py
+    clip newpath PATfill
+    } stopped {
+	(*** PATstroke Warning: Path is too complex, stroking
+	  with gray) =
+    cleartomark
+    restore
+    countdictstack exch sub dup 0 gt
+	{ { end } repeat } { pop } ifelse
+    gsave 0.5 setgray oldstroke grestore
+  } { pop restore pop } ifelse
+  newpath
+} bind def
+/PATtcalc {		% modmtx tilingtype PATtcalc tilematrix
+  % Note: tiling types 2 and 3 are not supported
+  gsave
+    exch concat					% tilingtype
+    matrix currentmatrix exch			% cmtx tilingtype
+    % Tiling type 1 and 3: constant spacing
+    2 ne {
+	% Distort the pattern so that it occupies
+	% an integral number of device pixels
+	dup 4 get exch dup 5 get exch		% tx ty cmtx
+	XStep 0 dtransform
+	round exch round exch			% tx ty cmtx dx.x dx.y
+	XStep div exch XStep div exch		% tx ty cmtx a b
+	0 YStep dtransform
+	round exch round exch			% tx ty cmtx a b dy.x dy.y
+	YStep div exch YStep div exch		% tx ty cmtx a b c d
+	7 -3 roll astore			% { a b c d tx ty }
+    } if
+  grestore
+} bind def
+/PATusp {
+  false PATredef
+  PATDict begin
+    CColor PATsc
+  end
+} bind def
+
+% right30
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 32 16 true [ 32 0 0 -16 0 16 ]
+	{<00030003000c000c0030003000c000c0030003000c000c00
+	30003000c000c00000030003000c000c0030003000c000c0
+	030003000c000c0030003000c000c000>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P2 exch def
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 227 moveto 0 0 lineto 399 0 lineto 399 227 lineto closepath clip newpath
+-194.8 350.2 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Arc
+7.500 slw
+0 slc
+gs  clippath
+3599 4000 m 3567 4148 l 3626 4161 l 3658 4013 l 3658 4013 l 3603 4124 l 3599 4000 l cp
+eoclip
+n 5449.3 4471.5 1878.7 -70.5453 -169.8379 arcn
+gs col0 s gr
+ gr
+
+% arrowhead
+0 slj
+n 3599 4000 m 3603 4124 l 3658 4013 l 3599 4000 l  cp gs 0.00 setgray ef gr  col0 s
+% Arc
+gs  clippath
+4422 4004 m 4425 4155 l 4485 4154 l 4482 4003 l 4482 4003 l 4455 4124 l 4422 4004 l cp
+eoclip
+n 5539.0 4051.3 1087.6 -60.4713 175.3232 arcn
+gs col0 s gr
+ gr
+
+% arrowhead
+n 4422 4004 m 4455 4124 l 4482 4003 l 4422 4004 l  cp gs 0.00 setgray ef gr  col0 s
+% Arc
+gs  clippath
+4986 4010 m 5012 4159 l 5072 4149 l 5046 4000 l 5046 4000 l 5037 4124 l 4986 4010 l cp
+eoclip
+n 5628.8 3967.5 613.5 -36.7999 163.6698 arcn
+gs col0 s gr
+ gr
+
+% arrowhead
+n 4986 4010 m 5037 4124 l 5046 4000 l 4986 4010 l  cp gs 0.00 setgray ef gr  col0 s
+% Arc
+135.000 slw
+gs  clippath
+7736 3835 m 7756 3984 l 7907 3964 l 7887 3814 l 7841 3821 l 7828 3944 l 7782 3829 l cp
+eoclip
+n 6609.1 4056.9 1224.8 -93.9364 -4.5364 arc
+gs col0 s gr
+ gr
+
+% arrowhead
+7.500 slw
+n 7782 3829 m 7828 3944 l 7841 3821 l  col0 s
+% Polyline
+n 3105 4140 m 6660 4140 l 6660 5085 l 3105 5085 l
+ cp gs col0 s gr 
+% Polyline
+n 6660 4140 m 8730 4140 l 8730 5085 l 6660 5085 l
+ cp gs col7 0.50 shd ef gr gs col0 s gr 
+% Polyline
+n 5805 2610 m 6345 2610 l 6345 3690 l 5805 3690 l
+ cp gs col0 s gr 
+% Polyline
+n 5805 2835 m 6345 2835 l 6345 3015 l 5805 3015 l
+ cp gs col0 s gr 
+% Polyline
+n 5805 3195 m 6345 3195 l 6345 3375 l 5805 3375 l
+ cp gs col0 s gr 
+% Polyline
+n 5805 3510 m 6345 3510 l 6345 3690 l 5805 3690 l
+ cp gs col0 s gr 
+% Polyline
+n 3510 4140 m 3780 4140 l 3780 5085 l 3510 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 234.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4365 4140 m 4635 4140 l 4635 5085 l 4365 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 291.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4905 4140 m 5265 4140 l 5265 5085 l 4905 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 327.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+/Times-Roman ff 180.00 scf sf
+3510 5490 m
+gs 1 -1 sc (gawk Main Program Address Space) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+7290 5490 m
+gs 1 -1 sc (Extension) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+5985 2115 m
+gs 1 -1 sc (API) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+5895 2340 m
+gs 1 -1 sc (Struct) col0 sh gr
+/Courier-Bold ff 180.00 scf sf
+7065 2655 m
+gs 1 -1 sc (dl_load\(api_p, id\);) col0 sh gr
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+end
+%EOF
diff --git a/gawk-5.0.1/doc/api-figure1.fig b/gawk-5.0.1/doc/api-figure1.fig
new file mode 100644
index 00000000000..7bc47846bf2
--- /dev/null
+++ b/gawk-5.0.1/doc/api-figure1.fig
@@ -0,0 +1,40 @@
+#FIG 3.2  Produced by xfig version 3.2.5b
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5449.265 4471.471 6075 2700 4320 2970 3600 4140
+	1 1 1.00 60.00 120.00
+5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5538.971 4051.323 6075 3105 4725 3330 4455 4140
+	1 1 1.00 60.00 120.00
+5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5628.750 3967.500 6120 3600 5220 3510 5040 4140
+	1 1 1.00 60.00 120.00
+5 1 0 10 0 7 50 -1 -1 0.000 0 0 1 0 6609.079 4056.868 6525 2835 7560 3285 7830 3960
+	0 0 1.00 60.00 120.00
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3105 4140 6660 4140 6660 5085 3105 5085 3105 4140
+2 2 0 1 0 7 50 -1 10 0.000 0 0 -1 0 0 5
+	 6660 4140 8730 4140 8730 5085 6660 5085 6660 4140
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5805 2610 6345 2610 6345 3690 5805 3690 5805 2610
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5805 2835 6345 2835 6345 3015 5805 3015 5805 2835
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5805 3195 6345 3195 6345 3375 5805 3375 5805 3195
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5805 3510 6345 3510 6345 3690 5805 3690 5805 3510
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 3510 4140 3780 4140 3780 5085 3510 5085 3510 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4365 4140 4635 4140 4635 5085 4365 5085 4365 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4905 4140 5265 4140 5265 5085 4905 5085 4905 4140
+4 0 0 50 -1 0 12 0.0000 4 180 2850 3510 5490 gawk Main Program Address Space\001
+4 0 0 50 -1 0 12 0.0000 4 135 825 7290 5490 Extension\001
+4 0 0 50 -1 0 12 0.0000 4 135 300 5985 2115 API\001
+4 0 0 50 -1 0 12 0.0000 4 135 480 5895 2340 Struct\001
+4 0 0 50 -1 14 12 0.0000 4 165 2280 7065 2655 dl_load(api_p, id);\001
diff --git a/gawk-5.0.1/doc/api-figure1.pdf b/gawk-5.0.1/doc/api-figure1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..0c24b67dd97bd2ee5c34d6f72e8ac833839a6b81
GIT binary patch
diff --git a/gawk-5.0.1/doc/api-figure1.png b/gawk-5.0.1/doc/api-figure1.png
new file mode 100644
index 0000000000000000000000000000000000000000..72d552cd98496ef1f65d2db5cd4995bc61e3451e
GIT binary patch
diff --git a/gawk-5.0.1/doc/api-figure1.txt b/gawk-5.0.1/doc/api-figure1.txt
new file mode 100644
index 00000000000..686b853b8fe
--- /dev/null
+++ b/gawk-5.0.1/doc/api-figure1.txt
@@ -0,0 +1,24 @@
+                          API
+                         Struct
+                         +---+
+                         |   |
+                         +---+
+         +---------------|   |
+         |               +---+      dl_load(api_p, id);
+         |               |   |  ___________________ 
+         |               +---+                     |
+         |     +---------|   |  __________________ |
+         |     |         +---+                    ||
+         |     |         |   |                    ||
+         |     |         +---+                    ||
+         |     |     +---|   |                    ||
+         |     |     |   +---+                  \ || /
+         |     |     |                           \  /
+         v     v     v                            \/
++-------+-+---+-+---+-+------------------+--------------------+
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOOOOOOOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOOOOOOOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOOOOOOOO|
++-------+-+---+-+---+-+------------------+--------------------+
+
+    gawk Main Program Address Space              Extension
diff --git a/gawk-5.0.1/doc/api-figure2.eps b/gawk-5.0.1/doc/api-figure2.eps
new file mode 100644
index 00000000000..caf5c34c8f4
--- /dev/null
+++ b/gawk-5.0.1/doc/api-figure2.eps
@@ -0,0 +1,517 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: api-figure2.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5d
+%%CreationDate: Thu Apr 25 22:22:07 2013
+%%BoundingBox: 0 0 363 179
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/MyAppDict 100 dict dup begin def
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+% This junk string is used by the show operators
+/PATsstr 1 string def
+/PATawidthshow { 	% cx cy cchar rx ry string
+  % Loop over each character in the string
+  {  % cx cy cchar rx ry char
+    % Show the character
+    dup				% cx cy cchar rx ry char char
+    PATsstr dup 0 4 -1 roll put	% cx cy cchar rx ry char (char)
+    false charpath		% cx cy cchar rx ry char
+    /clip load PATdraw
+    % Move past the character (charpath modified the
+    % current point)
+    currentpoint			% cx cy cchar rx ry char x y
+    newpath
+    moveto			% cx cy cchar rx ry char
+    % Reposition by cx,cy if the character in the string is cchar
+    3 index eq {			% cx cy cchar rx ry
+      4 index 4 index rmoveto
+    } if
+    % Reposition all characters by rx ry
+    2 copy rmoveto		% cx cy cchar rx ry
+  } forall
+  pop pop pop pop pop		% -
+  currentpoint
+  newpath
+  moveto
+} bind def
+/PATcg {
+  7 dict dup begin
+    /lw currentlinewidth def
+    /lc currentlinecap def
+    /lj currentlinejoin def
+    /ml currentmiterlimit def
+    /ds [ currentdash ] def
+    /cc [ currentrgbcolor ] def
+    /cm matrix currentmatrix def
+  end
+} bind def
+% PATdraw - calculates the boundaries of the object and
+% fills it with the current pattern
+/PATdraw {			% proc
+  save exch
+    PATpcalc			% proc nw nh px py
+    5 -1 roll exec		% nw nh px py
+    newpath
+    PATfill			% -
+  restore
+} bind def
+% PATfill - performs the tiling for the shape
+/PATfill { % nw nh px py PATfill -
+  PATDict /CurrentPattern get dup begin
+    setfont
+    % Set the coordinate system to Pattern Space
+    PatternGState PATsg
+    % Set the color for uncolored pattezns
+    PaintType 2 eq { PATDict /PColor get PATsc } if
+    % Create the string for showing
+    3 index string		% nw nh px py str
+    % Loop for each of the pattern sources
+    0 1 Multi 1 sub {		% nw nh px py str source
+	% Move to the starting location
+	3 index 3 index		% nw nh px py str source px py
+	moveto			% nw nh px py str source
+	% For multiple sources, set the appropriate color
+	Multi 1 ne { dup PC exch get PATsc } if
+	% Set the appropriate string for the source
+	0 1 7 index 1 sub { 2 index exch 2 index put } for pop
+	% Loop over the number of vertical cells
+	3 index 		% nw nh px py str nh
+	{			% nw nh px py str
+	  currentpoint		% nw nh px py str cx cy
+	  2 index oldshow	% nw nh px py str cx cy
+	  YStep add moveto	% nw nh px py str
+	} repeat		% nw nh px py str
+    } for
+    5 { pop } repeat
+  end
+} bind def
+
+% PATkshow - kshow with the current pattezn
+/PATkshow {			% proc string
+  exch bind			% string proc
+  1 index 0 get			% string proc char
+  % Loop over all but the last character in the string
+  0 1 4 index length 2 sub {
+				% string proc char idx
+    % Find the n+1th character in the string
+    3 index exch 1 add get	% string proc char char+1
+    exch 2 copy			% strinq proc char+1 char char+1 char
+    % Now show the nth character
+    PATsstr dup 0 4 -1 roll put	% string proc chr+1 chr chr+1 (chr)
+    false charpath		% string proc char+1 char char+1
+    /clip load PATdraw
+    % Move past the character (charpath modified the current point)
+    currentpoint newpath moveto
+    % Execute the user proc (should consume char and char+1)
+    mark 3 1 roll		% string proc char+1 mark char char+1
+    4 index exec		% string proc char+1 mark...
+    cleartomark			% string proc char+1
+  } for
+  % Now display the last character
+  PATsstr dup 0 4 -1 roll put	% string proc (char+1)
+  false charpath		% string proc
+  /clip load PATdraw
+  neewath
+  pop pop			% -
+} bind def
+% PATmp - the makepattern equivalent
+/PATmp {			% patdict patmtx PATmp patinstance
+  exch dup length 7 add		% We will add 6 new entries plus 1 FID
+  dict copy			% Create a new dictionary
+  begin
+    % Matrix to install when painting the pattern
+    TilingType PATtcalc
+    /PatternGState PATcg def
+    PatternGState /cm 3 -1 roll put
+    % Check for multi pattern sources (Level 1 fast color patterns)
+    currentdict /Multi known not { /Multi 1 def } if
+    % Font dictionary definitions
+    /FontType 3 def
+    % Create a dummy encoding vector
+    /Encoding 256 array def
+    3 string 0 1 255 {
+      Encoding exch dup 3 index cvs cvn put } for pop
+    /FontMatrix matrix def
+    /FontBBox BBox def
+    /BuildChar {
+	mark 3 1 roll		% mark dict char
+	exch begin
+	Multi 1 ne {PaintData exch get}{pop} ifelse  % mark [paintdata]
+	  PaintType 2 eq Multi 1 ne or
+	  { XStep 0 FontBBox aload pop setcachedevice }
+	  { XStep 0 setcharwidth } ifelse
+	  currentdict		% mark [paintdata] dict
+	  /PaintProc load	% mark [paintdata] dict paintproc
+	end
+	gsave
+	  false PATredef exec true PATredef
+	grestore
+	cleartomark		% -
+    } bind def
+    currentdict
+  end				% newdict
+  /foo exch			% /foo newlict
+  definefont			% newfont
+} bind def
+% PATpcalc - calculates the starting point and width/height
+% of the tile fill for the shape
+/PATpcalc {	% - PATpcalc nw nh px py
+  PATDict /CurrentPattern get begin
+    gsave
+	% Set up the coordinate system to Pattern Space
+	% and lock down pattern
+	PatternGState /cm get setmatrix
+	BBox aload pop pop pop translate
+	% Determine the bounding box of the shape
+	pathbbox			% llx lly urx ury
+    grestore
+    % Determine (nw, nh) the # of cells to paint width and height
+    PatHeight div ceiling		% llx lly urx qh
+    4 1 roll				% qh llx lly urx
+    PatWidth div ceiling		% qh llx lly qw
+    4 1 roll				% qw qh llx lly
+    PatHeight div floor			% qw qh llx ph
+    4 1 roll				% ph qw qh llx
+    PatWidth div floor			% ph qw qh pw
+    4 1 roll				% pw ph qw qh
+    2 index sub cvi abs			% pw ph qs qh-ph
+    exch 3 index sub cvi abs exch	% pw ph nw=qw-pw nh=qh-ph
+    % Determine the starting point of the pattern fill
+    %(px, py)
+    4 2 roll				% nw nh pw ph
+    PatHeight mul			% nw nh pw py
+    exch				% nw nh py pw
+    PatWidth mul exch			% nw nh px py
+  end
+} bind def
+
+% Save the original routines so that we can use them later on
+/oldfill	/fill load def
+/oldeofill	/eofill load def
+/oldstroke	/stroke load def
+/oldshow	/show load def
+/oldashow	/ashow load def
+/oldwidthshow	/widthshow load def
+/oldawidthshow	/awidthshow load def
+/oldkshow	/kshow load def
+
+% These defs are necessary so that subsequent procs don't bind in
+% the originals
+/fill	   { oldfill } bind def
+/eofill	   { oldeofill } bind def
+/stroke	   { oldstroke } bind def
+/show	   { oldshow } bind def
+/ashow	   { oldashow } bind def
+/widthshow { oldwidthshow } bind def
+/awidthshow { oldawidthshow } bind def
+/kshow 	   { oldkshow } bind def
+/PATredef {
+  MyAppDict begin
+    {
+    /fill { /clip load PATdraw newpath } bind def
+    /eofill { /eoclip load PATdraw newpath } bind def
+    /stroke { PATstroke } bind def
+    /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def
+    /ashow { 0 0 null 6 3 roll PATawidthshow }
+    bind def
+    /widthshow { 0 0 3 -1 roll PATawidthshow }
+    bind def
+    /awidthshow { PATawidthshow } bind def
+    /kshow { PATkshow } bind def
+  } {
+    /fill   { oldfill } bind def
+    /eofill { oldeofill } bind def
+    /stroke { oldstroke } bind def
+    /show   { oldshow } bind def
+    /ashow  { oldashow } bind def
+    /widthshow { oldwidthshow } bind def
+    /awidthshow { oldawidthshow } bind def
+    /kshow  { oldkshow } bind def
+    } ifelse
+  end
+} bind def
+false PATredef
+% Conditionally define setcmykcolor if not available
+/setcmykcolor where { pop } {
+  /setcmykcolor {
+    1 sub 4 1 roll
+    3 {
+	3 index add neg dup 0 lt { pop 0 } if 3 1 roll
+    } repeat
+    setrgbcolor - pop
+  } bind def
+} ifelse
+/PATsc {		% colorarray
+  aload length		% c1 ... cn length
+    dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor
+  } ifelse } ifelse
+} bind def
+/PATsg {		% dict
+  begin
+    lw setlinewidth
+    lc setlinecap
+    lj setlinejoin
+    ml setmiterlimit
+    ds aload pop setdash
+    cc aload pop setrgbcolor
+    cm setmatrix
+  end
+} bind def
+
+/PATDict 3 dict def
+/PATsp {
+  true PATredef
+  PATDict begin
+    /CurrentPattern exch def
+    % If it's an uncolored pattern, save the color
+    CurrentPattern /PaintType get 2 eq {
+      /PColor exch def
+    } if
+    /CColor [ currentrgbcolor ] def
+  end
+} bind def
+% PATstroke - stroke with the current pattern
+/PATstroke {
+  countdictstack
+  save
+  mark
+  {
+    currentpoint strokepath moveto
+    PATpcalc				% proc nw nh px py
+    clip newpath PATfill
+    } stopped {
+	(*** PATstroke Warning: Path is too complex, stroking
+	  with gray) =
+    cleartomark
+    restore
+    countdictstack exch sub dup 0 gt
+	{ { end } repeat } { pop } ifelse
+    gsave 0.5 setgray oldstroke grestore
+  } { pop restore pop } ifelse
+  newpath
+} bind def
+/PATtcalc {		% modmtx tilingtype PATtcalc tilematrix
+  % Note: tiling types 2 and 3 are not supported
+  gsave
+    exch concat					% tilingtype
+    matrix currentmatrix exch			% cmtx tilingtype
+    % Tiling type 1 and 3: constant spacing
+    2 ne {
+	% Distort the pattern so that it occupies
+	% an integral number of device pixels
+	dup 4 get exch dup 5 get exch		% tx ty cmtx
+	XStep 0 dtransform
+	round exch round exch			% tx ty cmtx dx.x dx.y
+	XStep div exch XStep div exch		% tx ty cmtx a b
+	0 YStep dtransform
+	round exch round exch			% tx ty cmtx a b dy.x dy.y
+	YStep div exch YStep div exch		% tx ty cmtx a b c d
+	7 -3 roll astore			% { a b c d tx ty }
+    } if
+  grestore
+} bind def
+/PATusp {
+  false PATredef
+  PATDict begin
+    CColor PATsc
+  end
+} bind def
+
+% right30
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 32 16 true [ 32 0 0 -16 0 16 ]
+	{<00030003000c000c0030003000c000c0030003000c000c00
+	30003000c000c00000030003000c000c0030003000c000c0
+	030003000c000c0030003000c000c000>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P2 exch def
+
+% crosshatch45
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 20 20 true [ 20 0 0 -20 0 20 ]
+	{<8020004050102088201104400a02800401000a02
+	8011044020882040501080200040501020882011
+	04400a02800401000a0280110440208820405010>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P6 exch def
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 179 moveto 0 0 lineto 363 0 lineto 363 179 lineto closepath clip newpath
+-194.8 350.2 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Arc
+7.500 slw
+0 slc
+gs  clippath
+3662 4014 m 3567 4132 l 3613 4170 l 3708 4052 l 3708 4052 l 3610 4127 l 3662 4014 l cp
+eoclip
+n 5895.0 5917.5 2902.8 -37.7581 -142.2419 arcn
+gs col0 s gr
+ gr
+
+% arrowhead
+0 slj
+n 3662 4014 m 3610 4127 l 3708 4052 l 3662 4014 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 3105 4140 m 6660 4140 l 6660 5085 l 3105 5085 l
+ cp gs col0 s gr 
+% Polyline
+n 6660 4140 m 8730 4140 l 8730 5085 l 6660 5085 l
+ cp gs col7 0.50 shd ef gr gs col0 s gr 
+% Polyline
+n 3510 4140 m 3780 4140 l 3780 5085 l 3510 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 234.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4365 4140 m 4635 4140 l 4635 5085 l 4365 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 291.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4905 4140 m 5265 4140 l 5265 5085 l 4905 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 327.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7965 4140 m 8370 4140 l 8370 5085 l 7965 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 531.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+/Times-Roman ff 180.00 scf sf
+3510 5490 m
+gs 1 -1 sc (gawk Main Program Address Space) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+7290 5490 m
+gs 1 -1 sc (Extension) col0 sh gr
+/Courier-Bold ff 180.00 scf sf
+3420 2880 m
+gs 1 -1 sc (register_ext_func\({ "chdir", do_chdir, 1 }\);) col0 sh gr
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+end
+%EOF
diff --git a/gawk-5.0.1/doc/api-figure2.fig b/gawk-5.0.1/doc/api-figure2.fig
new file mode 100644
index 00000000000..2ae60854c0d
--- /dev/null
+++ b/gawk-5.0.1/doc/api-figure2.fig
@@ -0,0 +1,26 @@
+#FIG 3.2  Produced by xfig version 3.2.5b
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5895.000 5917.500 8190 4140 5940 3015 3600 4140
+	1 1 1.00 60.00 120.00
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3105 4140 6660 4140 6660 5085 3105 5085 3105 4140
+2 2 0 1 0 7 50 -1 10 0.000 0 0 -1 0 0 5
+	 6660 4140 8730 4140 8730 5085 6660 5085 6660 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 3510 4140 3780 4140 3780 5085 3510 5085 3510 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4365 4140 4635 4140 4635 5085 4365 5085 4365 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4905 4140 5265 4140 5265 5085 4905 5085 4905 4140
+2 2 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 5
+	 7965 4140 8370 4140 8370 5085 7965 5085 7965 4140
+4 0 0 50 -1 0 12 0.0000 4 180 2850 3510 5490 gawk Main Program Address Space\001
+4 0 0 50 -1 0 12 0.0000 4 135 825 7290 5490 Extension\001
+4 0 0 50 -1 14 12 0.0000 4 165 5280 3420 2880 register_ext_func({ "chdir", do_chdir, 1 });\001
diff --git a/gawk-5.0.1/doc/api-figure2.pdf b/gawk-5.0.1/doc/api-figure2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..20462856e4d8d6b495315257a71f35f546f464d8
GIT binary patch
diff --git a/gawk-5.0.1/doc/api-figure2.png b/gawk-5.0.1/doc/api-figure2.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6e28c98088dd59f1519f17670d985d6270c4a2c
GIT binary patch
diff --git a/gawk-5.0.1/doc/api-figure2.txt b/gawk-5.0.1/doc/api-figure2.txt
new file mode 100644
index 00000000000..5ed8e2a8859
--- /dev/null
+++ b/gawk-5.0.1/doc/api-figure2.txt
@@ -0,0 +1,12 @@
+            register_ext_func({ "chdir", do_chdir, 1 });
+
+            +--------------------------------------------+
+            |                                            |
+            V                                            |
++-------+-+---+-+---+-+------------------+--------------+-+---+
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
++-------+-+---+-+---+-+------------------+--------------+-+---+
+
+    gawk Main Program Address Space              Extension
diff --git a/gawk-5.0.1/doc/api-figure3.eps b/gawk-5.0.1/doc/api-figure3.eps
new file mode 100644
index 00000000000..d713575f67c
--- /dev/null
+++ b/gawk-5.0.1/doc/api-figure3.eps
@@ -0,0 +1,526 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: api-figure3.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5d
+%%CreationDate: Wed Oct 31 20:16:08 2012
+%%BoundingBox: 0 0 356 175
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/MyAppDict 100 dict dup begin def
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+% This junk string is used by the show operators
+/PATsstr 1 string def
+/PATawidthshow { 	% cx cy cchar rx ry string
+  % Loop over each character in the string
+  {  % cx cy cchar rx ry char
+    % Show the character
+    dup				% cx cy cchar rx ry char char
+    PATsstr dup 0 4 -1 roll put	% cx cy cchar rx ry char (char)
+    false charpath		% cx cy cchar rx ry char
+    /clip load PATdraw
+    % Move past the character (charpath modified the
+    % current point)
+    currentpoint			% cx cy cchar rx ry char x y
+    newpath
+    moveto			% cx cy cchar rx ry char
+    % Reposition by cx,cy if the character in the string is cchar
+    3 index eq {			% cx cy cchar rx ry
+      4 index 4 index rmoveto
+    } if
+    % Reposition all characters by rx ry
+    2 copy rmoveto		% cx cy cchar rx ry
+  } forall
+  pop pop pop pop pop		% -
+  currentpoint
+  newpath
+  moveto
+} bind def
+/PATcg {
+  7 dict dup begin
+    /lw currentlinewidth def
+    /lc currentlinecap def
+    /lj currentlinejoin def
+    /ml currentmiterlimit def
+    /ds [ currentdash ] def
+    /cc [ currentrgbcolor ] def
+    /cm matrix currentmatrix def
+  end
+} bind def
+% PATdraw - calculates the boundaries of the object and
+% fills it with the current pattern
+/PATdraw {			% proc
+  save exch
+    PATpcalc			% proc nw nh px py
+    5 -1 roll exec		% nw nh px py
+    newpath
+    PATfill			% -
+  restore
+} bind def
+% PATfill - performs the tiling for the shape
+/PATfill { % nw nh px py PATfill -
+  PATDict /CurrentPattern get dup begin
+    setfont
+    % Set the coordinate system to Pattern Space
+    PatternGState PATsg
+    % Set the color for uncolored pattezns
+    PaintType 2 eq { PATDict /PColor get PATsc } if
+    % Create the string for showing
+    3 index string		% nw nh px py str
+    % Loop for each of the pattern sources
+    0 1 Multi 1 sub {		% nw nh px py str source
+	% Move to the starting location
+	3 index 3 index		% nw nh px py str source px py
+	moveto			% nw nh px py str source
+	% For multiple sources, set the appropriate color
+	Multi 1 ne { dup PC exch get PATsc } if
+	% Set the appropriate string for the source
+	0 1 7 index 1 sub { 2 index exch 2 index put } for pop
+	% Loop over the number of vertical cells
+	3 index 		% nw nh px py str nh
+	{			% nw nh px py str
+	  currentpoint		% nw nh px py str cx cy
+	  2 index oldshow	% nw nh px py str cx cy
+	  YStep add moveto	% nw nh px py str
+	} repeat		% nw nh px py str
+    } for
+    5 { pop } repeat
+  end
+} bind def
+
+% PATkshow - kshow with the current pattezn
+/PATkshow {			% proc string
+  exch bind			% string proc
+  1 index 0 get			% string proc char
+  % Loop over all but the last character in the string
+  0 1 4 index length 2 sub {
+				% string proc char idx
+    % Find the n+1th character in the string
+    3 index exch 1 add get	% string proc char char+1
+    exch 2 copy			% strinq proc char+1 char char+1 char
+    % Now show the nth character
+    PATsstr dup 0 4 -1 roll put	% string proc chr+1 chr chr+1 (chr)
+    false charpath		% string proc char+1 char char+1
+    /clip load PATdraw
+    % Move past the character (charpath modified the current point)
+    currentpoint newpath moveto
+    % Execute the user proc (should consume char and char+1)
+    mark 3 1 roll		% string proc char+1 mark char char+1
+    4 index exec		% string proc char+1 mark...
+    cleartomark			% string proc char+1
+  } for
+  % Now display the last character
+  PATsstr dup 0 4 -1 roll put	% string proc (char+1)
+  false charpath		% string proc
+  /clip load PATdraw
+  neewath
+  pop pop			% -
+} bind def
+% PATmp - the makepattern equivalent
+/PATmp {			% patdict patmtx PATmp patinstance
+  exch dup length 7 add		% We will add 6 new entries plus 1 FID
+  dict copy			% Create a new dictionary
+  begin
+    % Matrix to install when painting the pattern
+    TilingType PATtcalc
+    /PatternGState PATcg def
+    PatternGState /cm 3 -1 roll put
+    % Check for multi pattern sources (Level 1 fast color patterns)
+    currentdict /Multi known not { /Multi 1 def } if
+    % Font dictionary definitions
+    /FontType 3 def
+    % Create a dummy encoding vector
+    /Encoding 256 array def
+    3 string 0 1 255 {
+      Encoding exch dup 3 index cvs cvn put } for pop
+    /FontMatrix matrix def
+    /FontBBox BBox def
+    /BuildChar {
+	mark 3 1 roll		% mark dict char
+	exch begin
+	Multi 1 ne {PaintData exch get}{pop} ifelse  % mark [paintdata]
+	  PaintType 2 eq Multi 1 ne or
+	  { XStep 0 FontBBox aload pop setcachedevice }
+	  { XStep 0 setcharwidth } ifelse
+	  currentdict		% mark [paintdata] dict
+	  /PaintProc load	% mark [paintdata] dict paintproc
+	end
+	gsave
+	  false PATredef exec true PATredef
+	grestore
+	cleartomark		% -
+    } bind def
+    currentdict
+  end				% newdict
+  /foo exch			% /foo newlict
+  definefont			% newfont
+} bind def
+% PATpcalc - calculates the starting point and width/height
+% of the tile fill for the shape
+/PATpcalc {	% - PATpcalc nw nh px py
+  PATDict /CurrentPattern get begin
+    gsave
+	% Set up the coordinate system to Pattern Space
+	% and lock down pattern
+	PatternGState /cm get setmatrix
+	BBox aload pop pop pop translate
+	% Determine the bounding box of the shape
+	pathbbox			% llx lly urx ury
+    grestore
+    % Determine (nw, nh) the # of cells to paint width and height
+    PatHeight div ceiling		% llx lly urx qh
+    4 1 roll				% qh llx lly urx
+    PatWidth div ceiling		% qh llx lly qw
+    4 1 roll				% qw qh llx lly
+    PatHeight div floor			% qw qh llx ph
+    4 1 roll				% ph qw qh llx
+    PatWidth div floor			% ph qw qh pw
+    4 1 roll				% pw ph qw qh
+    2 index sub cvi abs			% pw ph qs qh-ph
+    exch 3 index sub cvi abs exch	% pw ph nw=qw-pw nh=qh-ph
+    % Determine the starting point of the pattern fill
+    %(px, py)
+    4 2 roll				% nw nh pw ph
+    PatHeight mul			% nw nh pw py
+    exch				% nw nh py pw
+    PatWidth mul exch			% nw nh px py
+  end
+} bind def
+
+% Save the original routines so that we can use them later on
+/oldfill	/fill load def
+/oldeofill	/eofill load def
+/oldstroke	/stroke load def
+/oldshow	/show load def
+/oldashow	/ashow load def
+/oldwidthshow	/widthshow load def
+/oldawidthshow	/awidthshow load def
+/oldkshow	/kshow load def
+
+% These defs are necessary so that subsequent procs don't bind in
+% the originals
+/fill	   { oldfill } bind def
+/eofill	   { oldeofill } bind def
+/stroke	   { oldstroke } bind def
+/show	   { oldshow } bind def
+/ashow	   { oldashow } bind def
+/widthshow { oldwidthshow } bind def
+/awidthshow { oldawidthshow } bind def
+/kshow 	   { oldkshow } bind def
+/PATredef {
+  MyAppDict begin
+    {
+    /fill { /clip load PATdraw newpath } bind def
+    /eofill { /eoclip load PATdraw newpath } bind def
+    /stroke { PATstroke } bind def
+    /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def
+    /ashow { 0 0 null 6 3 roll PATawidthshow }
+    bind def
+    /widthshow { 0 0 3 -1 roll PATawidthshow }
+    bind def
+    /awidthshow { PATawidthshow } bind def
+    /kshow { PATkshow } bind def
+  } {
+    /fill   { oldfill } bind def
+    /eofill { oldeofill } bind def
+    /stroke { oldstroke } bind def
+    /show   { oldshow } bind def
+    /ashow  { oldashow } bind def
+    /widthshow { oldwidthshow } bind def
+    /awidthshow { oldawidthshow } bind def
+    /kshow  { oldkshow } bind def
+    } ifelse
+  end
+} bind def
+false PATredef
+% Conditionally define setcmykcolor if not available
+/setcmykcolor where { pop } {
+  /setcmykcolor {
+    1 sub 4 1 roll
+    3 {
+	3 index add neg dup 0 lt { pop 0 } if 3 1 roll
+    } repeat
+    setrgbcolor - pop
+  } bind def
+} ifelse
+/PATsc {		% colorarray
+  aload length		% c1 ... cn length
+    dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor
+  } ifelse } ifelse
+} bind def
+/PATsg {		% dict
+  begin
+    lw setlinewidth
+    lc setlinecap
+    lj setlinejoin
+    ml setmiterlimit
+    ds aload pop setdash
+    cc aload pop setrgbcolor
+    cm setmatrix
+  end
+} bind def
+
+/PATDict 3 dict def
+/PATsp {
+  true PATredef
+  PATDict begin
+    /CurrentPattern exch def
+    % If it's an uncolored pattern, save the color
+    CurrentPattern /PaintType get 2 eq {
+      /PColor exch def
+    } if
+    /CColor [ currentrgbcolor ] def
+  end
+} bind def
+% PATstroke - stroke with the current pattern
+/PATstroke {
+  countdictstack
+  save
+  mark
+  {
+    currentpoint strokepath moveto
+    PATpcalc				% proc nw nh px py
+    clip newpath PATfill
+    } stopped {
+	(*** PATstroke Warning: Path is too complex, stroking
+	  with gray) =
+    cleartomark
+    restore
+    countdictstack exch sub dup 0 gt
+	{ { end } repeat } { pop } ifelse
+    gsave 0.5 setgray oldstroke grestore
+  } { pop restore pop } ifelse
+  newpath
+} bind def
+/PATtcalc {		% modmtx tilingtype PATtcalc tilematrix
+  % Note: tiling types 2 and 3 are not supported
+  gsave
+    exch concat					% tilingtype
+    matrix currentmatrix exch			% cmtx tilingtype
+    % Tiling type 1 and 3: constant spacing
+    2 ne {
+	% Distort the pattern so that it occupies
+	% an integral number of device pixels
+	dup 4 get exch dup 5 get exch		% tx ty cmtx
+	XStep 0 dtransform
+	round exch round exch			% tx ty cmtx dx.x dx.y
+	XStep div exch XStep div exch		% tx ty cmtx a b
+	0 YStep dtransform
+	round exch round exch			% tx ty cmtx a b dy.x dy.y
+	YStep div exch YStep div exch		% tx ty cmtx a b c d
+	7 -3 roll astore			% { a b c d tx ty }
+    } if
+  grestore
+} bind def
+/PATusp {
+  false PATredef
+  PATDict begin
+    CColor PATsc
+  end
+} bind def
+
+% right30
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 32 16 true [ 32 0 0 -16 0 16 ]
+	{<00030003000c000c0030003000c000c0030003000c000c00
+	30003000c000c00000030003000c000c0030003000c000c0
+	030003000c000c0030003000c000c000>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P2 exch def
+
+% crosshatch45
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 20 20 true [ 20 0 0 -20 0 20 ]
+	{<8020004050102088201104400a02800401000a02
+	8011044020882040501080200040501020882011
+	04400a02800401000a0280110440208820405010>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P6 exch def
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 175 moveto 0 0 lineto 356 0 lineto 356 175 lineto closepath clip newpath
+-194.8 350.2 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Arc
+7.500 slw
+0 slc
+gs  clippath
+8019 4079 m 8138 4172 l 8175 4125 l 8056 4032 l 8056 4032 l 8132 4130 l 8019 4079 l cp
+eoclip
+n 6120.0 6627.7 3207.7 -129.1463 -50.8537 arc
+gs col0 s gr
+ gr
+
+% arrowhead
+0 slj
+n 8019 4079 m 8132 4130 l 8056 4032 l 8019 4079 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 3105 4140 m 6660 4140 l 6660 5085 l 3105 5085 l
+ cp gs col0 s gr 
+% Polyline
+n 6660 4140 m 8730 4140 l 8730 5085 l 6660 5085 l
+ cp gs col7 0.50 shd ef gr gs col0 s gr 
+% Polyline
+n 3510 4140 m 3780 4140 l 3780 5085 l 3510 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 234.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4365 4140 m 4635 4140 l 4635 5085 l 4365 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 291.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4905 4140 m 5265 4140 l 5265 5085 l 4905 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 327.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7965 4140 m 8370 4140 l 8370 5085 l 7965 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 531.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+/Times-Roman ff 180.00 scf sf
+3510 5490 m
+gs 1 -1 sc (gawk Main Program Address Space) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+7290 5490 m
+gs 1 -1 sc (Extension) col0 sh gr
+/Courier-Bold ff 180.00 scf sf
+3240 3150 m
+gs 1 -1 sc (    chdir\("/path"\)) col0 sh gr
+/Courier-Bold ff 180.00 scf sf
+3330 3375 m
+gs 1 -1 sc (}) col0 sh gr
+/Courier-Bold ff 180.00 scf sf
+3375 2925 m
+gs 1 -1 sc (BEGIN {) col0 sh gr
+/Courier-Bold ff 180.00 scf sf
+6660 3150 m
+gs 1 -1 sc (\(*fnptr\)\(1\);) col0 sh gr
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+end
+%EOF
diff --git a/gawk-5.0.1/doc/api-figure3.fig b/gawk-5.0.1/doc/api-figure3.fig
new file mode 100644
index 00000000000..5c7fdd976ba
--- /dev/null
+++ b/gawk-5.0.1/doc/api-figure3.fig
@@ -0,0 +1,29 @@
+#FIG 3.2  Produced by xfig version 3.2.5b
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 7 50 -1 -1 0.000 0 0 1 0 6120.000 6627.656 4095 4140 6120 3420 8145 4140
+	1 1 1.00 60.00 120.00
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3105 4140 6660 4140 6660 5085 3105 5085 3105 4140
+2 2 0 1 0 7 50 -1 10 0.000 0 0 -1 0 0 5
+	 6660 4140 8730 4140 8730 5085 6660 5085 6660 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 3510 4140 3780 4140 3780 5085 3510 5085 3510 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4365 4140 4635 4140 4635 5085 4365 5085 4365 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4905 4140 5265 4140 5265 5085 4905 5085 4905 4140
+2 2 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 5
+	 7965 4140 8370 4140 8370 5085 7965 5085 7965 4140
+4 0 0 50 -1 0 12 0.0000 4 180 2850 3510 5490 gawk Main Program Address Space\001
+4 0 0 50 -1 0 12 0.0000 4 135 825 7290 5490 Extension\001
+4 0 0 50 -1 14 12 0.0000 4 180 2160 3240 3150     chdir("/path")\001
+4 0 0 50 -1 14 12 0.0000 4 150 120 3330 3375 }\001
+4 0 0 50 -1 14 12 0.0000 4 150 840 3375 2925 BEGIN {\001
+4 0 0 50 -1 14 12 0.0000 4 165 1440 6660 3150 (*fnptr)(1);\001
diff --git a/gawk-5.0.1/doc/api-figure3.pdf b/gawk-5.0.1/doc/api-figure3.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..517b2ecc14622cbd83668a0807c154fe0ab1e9b7
GIT binary patch
diff --git a/gawk-5.0.1/doc/api-figure3.png b/gawk-5.0.1/doc/api-figure3.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7db079437d1455c5ce3aae8f627305a34fb913f
GIT binary patch
diff --git a/gawk-5.0.1/doc/api-figure3.txt b/gawk-5.0.1/doc/api-figure3.txt
new file mode 100644
index 00000000000..a601ce9477a
--- /dev/null
+++ b/gawk-5.0.1/doc/api-figure3.txt
@@ -0,0 +1,13 @@
+    BEGIN {
+        chdir("/path")                             (*fnptr)(1);
+    }
+            +--------------------------------------------+
+            |                                            |
+            |                                            V
++-------+-+---+-+---+-+------------------+--------------+-+---+
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
++-------+-+---+-+---+-+------------------+--------------+-+---+
+
+    gawk Main Program Address Space              Extension
diff --git a/gawk-5.0.1/doc/array-elements.eps b/gawk-5.0.1/doc/array-elements.eps
new file mode 100644
index 00000000000..041c0b39577
--- /dev/null
+++ b/gawk-5.0.1/doc/array-elements.eps
@@ -0,0 +1,158 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: array-elements.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5d
+%%CreationDate: Sun May  4 22:46:26 2014
+%%BoundingBox: 0 0 379 76
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 76 moveto 0 0 lineto 379 0 lineto 379 76 lineto closepath clip newpath
+-203.3 199.4 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Polyline
+0 slj
+0 slc
+7.500 slw
+n 4455 1980 m 4455 2700 l 4455 2655 l
+ 4455 2700 l gs col0 s gr 
+% Polyline
+n 6075 1980 m
+ 6075 2700 l gs col0 s gr 
+% Polyline
+n 7425 1980 m
+ 7425 2700 l gs col0 s gr 
+/Courier-Bold ff 180.00 scf sf
+3735 2340 m
+gs 1 -1 sc (8) col0 sh gr
+/Courier-Bold ff 180.00 scf sf
+5175 2340 m
+gs 1 -1 sc ("foo") col0 sh gr
+/Courier-Bold ff 180.00 scf sf
+6795 2340 m
+gs 1 -1 sc ("") col0 sh gr
+/Courier-Bold ff 180.00 scf sf
+7875 2340 m
+gs 1 -1 sc (30) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+3735 3150 m
+gs 1 -1 sc (0) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+5175 3150 m
+gs 1 -1 sc (1) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+6795 3150 m
+gs 1 -1 sc (2) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+7875 3150 m
+gs 1 -1 sc (3) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+8730 2340 m
+gs 1 -1 sc (Value) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+8730 3150 m
+gs 1 -1 sc (Index) col0 sh gr
+% here ends figure;
+% 
+% here starts figure with depth 40
+% Polyline
+0 slj
+0 slc
+7.500 slw
+n 3240 1980 m 8415 1980 l 8415 2700 l 3240 2700 l
+ cp gs col0 s gr 
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+%EOF
diff --git a/gawk-5.0.1/doc/array-elements.fig b/gawk-5.0.1/doc/array-elements.fig
new file mode 100644
index 00000000000..63b5ffbf715
--- /dev/null
+++ b/gawk-5.0.1/doc/array-elements.fig
@@ -0,0 +1,27 @@
+#FIG 3.2  Produced by xfig version 3.2.5b
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5
+	 3240 1980 8415 1980 8415 2700 3240 2700 3240 1980
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
+	 4455 1980 4455 2700 4455 2655 4455 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6075 1980 6075 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 7425 1980 7425 2700
+4 0 0 50 -1 14 12 0.0000 4 120 120 3735 2340 8\001
+4 0 0 50 -1 14 12 0.0000 4 120 600 5175 2340 "foo"\001
+4 0 0 50 -1 14 12 0.0000 4 60 240 6795 2340 ""\001
+4 0 0 50 -1 14 12 0.0000 4 120 240 7875 2340 30\001
+4 0 0 50 -1 0 12 0.0000 4 135 105 3735 3150 0\001
+4 0 0 50 -1 0 12 0.0000 4 135 105 5175 3150 1\001
+4 0 0 50 -1 0 12 0.0000 4 135 105 6795 3150 2\001
+4 0 0 50 -1 0 12 0.0000 4 135 105 7875 3150 3\001
+4 0 0 50 -1 0 12 0.0000 4 135 480 8730 2340 Value\001
+4 0 0 50 -1 0 12 0.0000 4 135 465 8730 3150 Index\001
diff --git a/gawk-5.0.1/doc/array-elements.pdf b/gawk-5.0.1/doc/array-elements.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..328cbd1a1b895007597f5edc3dccd484516baf91
GIT binary patch
diff --git a/gawk-5.0.1/doc/array-elements.png b/gawk-5.0.1/doc/array-elements.png
new file mode 100644
index 0000000000000000000000000000000000000000..b57d66b7bece42140c91a844e695ada8734719ff
GIT binary patch
diff --git a/gawk-5.0.1/doc/array-elements.txt b/gawk-5.0.1/doc/array-elements.txt
new file mode 100644
index 00000000000..424c17089f4
--- /dev/null
+++ b/gawk-5.0.1/doc/array-elements.txt
@@ -0,0 +1,4 @@
++---------+---------+--------+---------+
+|    8    |  "foo"  |   ""   |    30   |    Value
++---------+---------+--------+---------+
+     0         1         2         3        Index
diff --git a/gawk-5.0.1/doc/awkcard.in b/gawk-5.0.1/doc/awkcard.in
new file mode 100644
index 00000000000..eeebdebe520
--- /dev/null
+++ b/gawk-5.0.1/doc/awkcard.in
@@ -0,0 +1,2053 @@
+.\" AWK Reference Card --- Arnold Robbins, arnold@skeeve.com
+.\"
+.\" Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+.\" 2005, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018,
+.\" 2019
+.\" Free Software Foundation, Inc.
+.\" 
+.\" Permission is granted to make and distribute verbatim copies of
+.\" this reference card provided the copyright notice and this permission
+.\" notice are preserved on all copies.
+.\" 
+.\" Permission is granted to process this file through troff and print the
+.\" results, provided the printed document carries copying permission
+.\" notice identical to this one except for the removal of this paragraph
+.\" (this paragraph not being relevant to the printed reference card).
+.\" 
+.\" Permission is granted to copy and distribute modified versions of this
+.\" reference card under the conditions for verbatim copying, provided that
+.\" the entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\" 
+.\" Permission is granted to copy and distribute translations of this
+.\" reference card into another language, under the above conditions for
+.\" modified versions, except that this permission notice may be stated in
+.\" a translation approved by the Foundation.
+.\"
+.\" Strings to save typing
+.ds AK \*(FCawk\*(FR
+.ds GK \*(FCgawk\*(FR
+.ds NK Brian Kernighan's \*(FCawk\*(FR
+.ds MK \*(FCmawk\*(FR
+.\"
+.\"
+.de TD\" tab defaults
+.ta .2i .78i 1i 1.2i 1.4i 1.7i
+..
+.de TE
+.TD
+..
+
+.sp
+.ce
+\*(CD\f(HB\s+8AWK REFERENCE\s0\*(FR
+.sp
+.\" --- Table Of Contents
+.ta 2.4i 2.6iR
+.lc .
+.ES
+.in +.2i
+.nf
+\*(FRAcknowledgements	9
+Action Statements	9
+Arrays	7
+Awk Program Execution	5
+Bit Manipulation Functions (\*(GK)	17
+Bug Reports	2
+Closing Redirections	13
+Command Line Arguments (standard)	2
+Command Line Arguments (\*(GK)	3
+Command Line Arguments (\*(MK)	4
+Conversions And Comparisons	8
+Copying Permissions	18
+Definitions	2
+Dynamic Extensions (\*(GK)	17
+Environment Variables (\*(GK)	11
+Escape Sequences	9
+Expressions	7
+Fields	10
+FTP/HTTP/GIT Information	18
+Historical Features (\*(GK)	10
+Input Control	13
+Internationalization (\*(GK)	18
+Lines And Statements	4
+Localization (\*(GK)	12
+Namespaces (\*(GK)	12
+Numeric Functions	15
+Output Control	13
+Pattern Elements	8
+Printf Formats	14
+Records	10
+Regular Expressions	11
+Signals (\*(GK \*(FC\-\^\-profile\*(FR)	4
+Special Filenames	12
+String Functions	16
+Time Functions	17
+Type Functions (\*(GK)	18
+User-defined Functions	15
+Variables	5\*(CX
+.in -.2i
+.EB "\s+2\f(HBCONTENTS\*(FR\s0"
+.sp .4
+.TD
+.fi
+.sp .4
+.SL
+.sp .4
+.so SRCDIR/ad.block
+.\" a subtlety here; this line changes color. We rely on it
+.\" also to provide a empty line.
+\*(CD
+.SL
+.nf
+\*(FRCopyright \(co 1996\(en2005, 2007, 2009\(en2019
+Free Software Foundation, Inc.
+.nf
+.BT
+
+
+.\"
+.\"
+.\" --- Definitions
+.fi
+.ES
+\*(CDThis card describes POSIX AWK, as well as three
+freely available \*(AK implementations
+(see \fHFTP/HTTP/GIT Information\fP).
+\*(CLCommon extensions (in two or more versions) are printed in light blue.
+\*(CBFeatures specific to just one version\(emusually GNU AWK (\*(GK)\(emare
+printed in dark blue.
+\*(CRExceptions and deprecated features are printed in red.
+\*(CDFeatures mandated by POSIX are printed in black.
+.sp .5
+Several type faces are used to clarify the meaning:
+.br
+.nr IN \w'\(bu '
+\(bu \*(FC\*(CN\fP is used for computer input.
+.br
+.fi
+.in +\n(INu
+.ti -\n(INu
+\(bu\|\^\*(FI\*(IN\fP is used for emphasis, to indicate user input and for syntactic
+placeholders, such as \*(FIvariable\fP or \*(FIaction\fP.
+.in -\n(INu
+.br
+\(bu \*(RN is used for explanatory text.
+.sp .5
+\*(FInumber\fP \- a floating point number as in ANSI C, such as
+\*(FC3\*(FR,
+\*(FC2.3\*(FR,
+\*(FC.4\*(FR,
+\*(FC1.4e2\*(FR
+or
+\*(FC4.1E5\*(FR.
+\*(CBNumbers may also be given in octal or hexadecimal: e.g.,
+\*(FC011\*(FR or \*(FC0x11\*(FR.\*(CD
+.sp .5
+\*(FIescape sequences\fP \- a special sequence of characters beginning
+with a backslash, used to describe otherwise unprintable characters.
+(See \fHEscape Sequences\fP.)
+.sp .5
+\*(FIstring\fP \- a group of characters enclosed in double quotes.
+Strings may contain \*(FIescape sequences\*(FR.
+.sp .5
+\*(FIregexp\fP \- a regular expression, either a regexp constant
+enclosed in forward slashes, or a dynamic regexp computed at run-time.
+Regexp constants may contain \*(FIescape sequences\*(FR.
+.sp .5
+\*(CB\*(FIstrongly typed regexp\fP \- a regular expression constant with
+a leading \*(FC@\*(FR. E.g., \*(FC@/stuff/\*(FR. Such constants may
+be assigned to variables and passed to user-defined functions.\*(CD
+.sp .5
+\*(FIname\fP \- a variable, array or function name.
+.sp .5
+\*(FIentry\fP(\*(FIN\fP) \- entry \*(FIentry\fP in section \*(FIN\fP of the
+Unix reference manual.
+.sp .5
+\*(FIpattern\fP \- an expression describing an input record to be matched.
+.sp .5
+\*(FIaction\fP \- statements to execute when an input record is matched.
+.sp .5
+\*(FIrule\fP \- a pattern-action pair, where the pattern or action may
+be missing.\*(CX
+.EB "\s+2\f(HBDEFINITIONS\*(FR\s0"
+
+.\"
+.\"
+.\" --- Command Line Arguments
+.ES
+.fi
+\*(CDCommand line arguments control setting the field separator,
+setting variables before the \*(FCBEGIN\fP rule runs, and
+the location of AWK program source code.
+Implementation-specific command line arguments change
+the behavior of the running interpreter.
+.sp .5
+.TS
+expand;
+l lw(2.0i).
+\*(FC\-F \*(FIfs\*(FR	Use \*(FIfs\fP for the input field separator.
+\*(FC\-v\*(FI var\*(FC\^=\^\*(FIval\*(FR	T{
+Assign the value \*(FIval\*(FR to the variable \*(FIvar\*(FR
+before execution of the program begins. Such
+variable values are available to the \*(FCBEGIN\fP rule.
+T}
+\*(FC\-f \*(FIprog-file\*(FR	T{
+Read the AWK program source from the file
+\*(FIprog-file\*(FR, instead of from the first command
+line argument. Multiple \*(FC\-f\*(FR options may be used.
+T}
+\*(FC\-\^\-\*(FR	Signal the end of options.\*(CX
+.TE
+.EB "\s+2\f(HBCOMMAND LINE ARGUMENTS (standard)\*(FR\s0"
+
+.\" --- Bug Reports
+.ES
+.fi
+\*(CDIf you find a bug in this reference card, please report it via electronic
+mail to \*(FCbug-gawk@gnu.org\*(FR.\*(CX
+.EB "\s+2\f(HBBUG REPORTS\*(FR\s0"
+
+.BT
+
+.\"
+.\"
+.\" --- Command Line Arguments (gawk)
+.ES
+.fi
+\*(CDLong options may be abbreviated as long as the abbreviation
+remains unique.
+Use ``\*(FC\-W \*(FIoption\*(FR''
+for full POSIX compliance.
+.sp .5
+.ig
+.\" This option is left undocumented, on purpose.
+\*(FC\-\^\-nostalgia\*(FR%T{
+provide a moment of nostalgia for
+long time \*(AK users.
+T}
+..
+.de TI \" table item
+.ti -4n
+\\$1
+.br
+..
+.TS
+expand, tab(%);
+l lw(1.3i).
+\*(FC\-\^\-assign \*(FIvar\*(FC\^=\^\*(FIval\*(FR%Same as \*(FC\-v\fP.
+\*(FC\-\^\-field-separator \*(FIfs\*(FR%Same as \*(FC\-F\fP.
+\*(FC\-\^\-file \*(FIprog-file%\*(FRSame as \*(FC\-f\fP.
+.TE
+.in +4n
+.TI "\*(FC\-b\*(FR, \*(FC\-\^\-characters\-as\-bytes\*(FR
+Treat all input data as single-byte characters.
+Overridden by \*(FC\-\^\-posix\*(FR.
+.TI "\*(FC\-c\*(FR, \*(FC\-\^\-traditional\*(FR
+Disable \*(GK-specific extensions.
+.TI "\*(FC\-C\*(FR, \*(FC\-\^\-copyright\*(FR
+Print the short GNU
+copyright information on \*(FCstdout\*(FR.
+.TI "\*(FC\-d\*(FR[\*(FIfile\*(FR], \*(FC\-\^\-dump-variables\*(FR[\*(FC=\*(FIfile\*(FR]
+Print a sorted list of global variables,
+their types and final values to
+\*(FIfile\*(FR (default: \*(FCawkvars.out\*(FR).
+.TI "\*(FC\-D\*(FR[\*(FC\*(FIfile\*(FR], \*(FC\-\^\-debug\*(FR[\*(FC=\*(FIfile\*(FR]
+Enable debugging of program. Optionally read stored commands
+from \*(FIfile\*(FR.
+.TI "\*(FC-e '\*(FItext\*(FC'\*(FR, \*(FC\-\^\-source '\*(FItext\*(FC'\*(FR
+Use \*(FItext\*(FR as AWK program source code.
+.TI "\*(FC\-E \*(FIfile\*(FR, \*(FC\-\^\-exec \*(FIfile\*(FR
+Read program text from \*(FIfile\fP. No other
+options are processed.
+Also disable command-line variable assignments.
+Useful with \*(FC#!\fP.
+.TI "\*(FC\-g\*(FR, \*(FC\-\^\-gen\-pot\*(FR
+Process the program and print a GNU \*(FCgettext\*(FR
+format \*(FC\&.pot\*(FR file on \*(FCstdout\*(FR,
+containing the text of all strings that were marked
+for localization.
+.TI "\*(FC\-h\*(FR, \*(FC\-\^\-help\*(FR
+Print a short summary of the available
+options on \*(FCstdout\*(FR, then exit zero.
+.TI "\*(FC\-i \*(FIfile\*(FR, \*(FC\-\^\-include \*(FIfile\*(FR
+Include library AWK code in \*(FIfile\*(FR.
+See \fHAwk Program Execution\*(FR.
+.TI "\*(FC\-l \*(FIlib\*(FR, \*(FC\-\^\-load \*(FIlib\*(FR
+Load dynamic extension \*(FIlib\fP.
+See \fHDynamic Extensions\*(FR.
+.TI "\*(FC\-L \*(FR[\*(FC\*(FIvalue\*(FR], \*(FC\-\^\-lint\*(FR[\*(FC=\*(FIvalue\*(FR]
+Warn about dubious or non-portable constructs.
+If \*(FIvalue\*(FR is
+\*(FCfatal\*(FR,
+lint warnings become fatal errors.
+If \*(FIvalue\*(FR is
+\*(FCinvalid\*(FR,
+only issue warnings about things that are
+actually invalid (not fully implemented yet).
+.TI "\*(FC\-M\*(FR, \*(FC\-\^\-bignum\*(FR
+Enable arbitrary-precision arithmetic.
+.TI "\*(FC\-n\*(FR, \*(FC\-\^\-non\-decimal\-data\*(FR
+Recognize octal and hexadecimal values in input data.
+\*(FIUse this option with great caution!\*(FR
+.TI "\*(FC\-N\*(FR, \*(FC\-\^\-use\-lc\-numeric\*(FR
+Force use of the locale's decimal point character when parsing input data.
+.TI "\*(FC\-o\*(FR[\*(FC\*(FIfile\*(FR], \*(FC\-\^\-pretty-print\*(FR[\*(FC=\*(FIfile\*(FR]
+Output a pretty printed version of the program to \*(FIfile\*(FR
+(default: \*(FCawkprof.out\*(FR).
+.TI "\*(FC\-O\*(FR, \*(FC\-\^\-optimize\*(FR
+Enable internal optimizations (default is on).
+.TI "\*(FC\-p\*(FR[\*(FC\*(FIfile\*(FR], \*(FC\-\^\-profile\*(FR[\*(FC=\*(FIfile\*(FR]
+Send profiling data to \*(FIfile\*(FR
+(default: \*(FCawkprof.out\*(FR).
+The profile contains execution counts in the left margin
+of each statement in the program.
+.TI "\*(FC\-P\*(FR, \*(FC\-\^\-posix\*(FR
+Disable common and GNU extensions.
+.TI "\*(FC\-r\*(FR, \*(FC\-\^\-re\-interval\*(FR
+Enable \*(FIinterval expressions\*(FR.
+(Needed with \*(FC\-c\*(FR.)\*(CB
+.in -4n
+.EB "\s+2\f(HBCOMMAND LINE ARGUMENTS (\*(GK\f(HB)\*(FR\s0"
+
+.BT
+
+.\"
+.\"
+.\" --- Command Line Arguments (gawk) continued
+.ES
+.fi
+.in +4n
+.TI "\*(FC\-s\*(FR, \*(FC\-\^\-no\-optimize\*(FR
+Disable internal optimizations.
+.TI "\*(FC\-S\*(FR, \*(FC\-\^\-sandbox\*(FR
+Disable the \*(FCsystem()\*(FR function,
+input redirection with \*(FCgetline\*(FR,
+output redirection with \*(FCprint\*(FR and \*(FCprintf\*(FR,
+and loading dynamic extensions.
+.TI "\*(FC-t\*(FR, \*(FC\-\^\-lint\-old\*(FR
+Warn about constructs that are not
+portable to the original version of
+Unix \*(AK.
+.TI "\*(FC\-V\*(FR, \*(FC\-\^\-version\*(FR
+Print version \" information
+info
+on \*(FCstdout\fP
+and exit zero.
+.in -4n
+.sp .5
+.fi
+Normally, if there is program text, unknown
+options are passed on to the AWK program in
+\*(FCARGV\*(FR
+for processing.
+In compatibility mode,
+unknown options are flagged as invalid, but are otherwise ignored.\*(CB
+.EB "\s+2\f(HBCOMMAND LINE ARGUMENTS (\*(GK\f(HB)\*(FR\s0"
+.sp .4
+.\"
+.\"
+.\" --- Command Line Arguments (mawk)
+.ES
+.fi
+\*(CDThe following options are specific to \*(MK.
+.sp .5
+.fi
+.TS
+expand;
+l lw(1.8i).
+\*(FC\-W dump\*(FR	T{
+Print an assembly listing of the program to
+\*(FCstdout\fP and exit zero.
+T}
+\*(FC\-W exec \*(FIfile\*(FR	T{
+Read program text from \*(FIfile\fP. No other
+options are processed. Useful with \*(FC#!\fP.
+T}
+\*(FC\-W interactive\*(FR	T{
+Unbuffer \*(FCstdout\fP and line buffer \*(FCstdin\fP.
+Lines are always records, ignoring \*(FCRS\fP.
+T}
+\*(FC\-W posix_space\*(FR	T{
+\*(FC\en\*(FR separates fields when \*(FCRS = "\^"\fP.
+T}
+\*(FC\-W sprintf=\*(FInum\*(FR	T{
+Adjust the size of \*(MK's internal
+\*(FCsprintf\*(FR buffer.
+T}
+\*(FC\-W version\*(FR	T{
+Print version and copyright on
+\*(FCstdout\fP, limit information on \*(FCstderr\fP,
+and exit zero.
+T}
+.TE
+.sp .5
+.fi
+The options may be abbreviated using just the first letter, e.g.,
+\*(FC\-We\*(FR,
+\*(FC\-Wv\*(FR
+and so on.\*(CB
+.EB "\s+2\f(HBCOMMAND LINE ARGUMENTS (\*(MK\f(HB)\*(FR\s0"
+.sp .7
+.\" --- Signals (gawk --profile)
+.ES
+.fi
+\*(CD\*(GK accepts two signals while profiling.
+\*(FCSIGUSR1\fP dumps a profile and function call stack to the
+profile file.  It then continues to run.
+\*(FCSIGHUP\fP is similar, but exits.\*(CB
+.EB "\s+2\f(HBSIGNALS (\*(GK \f(HB\-\^\-profile)\*(FR\s0"
+
+.\" --- Lines And Statements
+.ES
+.fi
+\*(CDAWK is a line-oriented language. The pattern comes first, and then the
+action. Action statements are enclosed in \*(FC{\fP and \*(FC}\*(FR.
+Either the pattern  or the action may be missing, but
+not both. If the pattern is missing, the action is
+executed for every input record.
+A missing action is equivalent to
+.sp .5
+	\*(FC{ print }\fP
+.sp .5
+which prints the entire record.
+.sp .5
+Comments begin with the \*(FC#\*(FR character, and continue until the
+end of the line.
+Normally, statements end with a newline, but lines ending in
+a ``,'',
+\*(FC{\*(FR,
+\*(CB\*(FC?\*(FR,
+\*(FC:\*(FR,\*(CD
+\*(FC&&\*(FR,
+or
+\*(FC||\*(FR,
+are automatically continued.
+Lines ending in \*(FCdo\fP or \*(FCelse\fP
+also have their statements automatically continued on the following line.
+In other cases, a line can be continued by ending it with a ``\e'',
+in which case the newline is ignored. However, a ``\e'' after a
+\*(FC#\*(FR is not special.
+.sp .5
+Multiple statements may be put on one line by separating them with a ``;''.
+This applies to both the statements within the action part of a
+pattern-action pair (the usual case)
+and to the pattern-action statements themselves.\*(CX
+.EB "\s+2\f(HBLINES AND STATEMENTS\*(FR\s0"
+.BT
+
+.\" --- Awk Program Execution
+.ES
+.fi
+\*(CDAWK programs are a sequence of
+\*(CBoptional directives,\*(CD
+pattern-action statements
+and optional function definitions.
+.sp .5
+	\*(CB\*(FC@include "\*(FIfilename\*(FC"
+.br
+	\*(FC@load "\*(FIfilename\*(FC"
+.br
+	\*(FC@namespace "\*(FInamespace\*(FC"\*(CD
+.br
+	\*(FIpattern\*(FC	{ \*(FIaction statements\*(FC }\*(FR
+.br
+	\*(FCfunction \*(FIname\*(FC(\*(FIparameter list\*(FC) { \*(FIstatements\*(FC }\*(FR
+.sp .5
+\*(AK first reads the program source from the
+\*(FIprog-file\*(FR(s), if specified,
+\*(CBfrom arguments to \*(FC\-\^\-source\*(FR,\*(CD
+or from the first non-option argument on the command line.
+The program text is read as if all the \*(FIprog-file\*(FR(s)
+\*(CBand command line
+source texts\*(CD had been concatenated.
+.sp
+\*(CB\*(GK includes files named on \*(FC@include\*(FR lines.
+Nested includes are allowed.
+\*(GK loads extensions named on \*(FC@load\*(FR lines;
+see \fHDynamic Extensions\*(FR.\*(CD
+.sp .5
+AWK programs execute in the following order.
+First, all variable assignments specified via the \*(FC\-v\fP
+option are performed.
+Next, \*(AK executes the code in the
+\*(FCBEGIN\fP rules(s), if any, and then proceeds to read
+the files \*(FC1\fP through \*(FCARGC \- 1\fP in the \*(FCARGV\fP array.
+If there are no files named on the command line,
+\*(AK reads the standard input.
+.sp .5
+A command line argument of the form
+\*(FIvar\*(FC=\*(FIval\*(FR,
+is treated as a variable assignment. The variable
+\*(FIvar\fP is assigned the value \*(FIval\*(FR.
+(This happens after any \*(FCBEGIN\fP rule(s) have been run.)
+.sp .5
+If the value of a particular element of \*(FCARGV\fP is empty
+(\*(FC"\^"\*(FR), \*(AK skips over it.
+.sp .5
+Naming directories on the command-line is generally a fatal error.
+\*(CB\*(GK skips them, with a warning, unless invoked with
+\*(FC\-\^\-posix\*(FR
+or
+\*(FC\-\^\-traditional.\*(CK\*(FR
+.sp .5
+\*(CBFor each input file,
+if a \*(FCBEGINFILE\fP rule exists, \*(GK executes the associated \*(FIaction\*(FR
+before processing the contents of the file. Similarly, \*(GK executes
+the \*(FIaction\*(FR associated with \*(FCENDFILE\fP after processing the file.\*(CD
+.sp .5
+For each record in the input, \*(AK tests to see if it matches any
+\*(FIpattern\fP in the AWK program.
+For each pattern that the record matches,
+it executes the associated \*(FIaction\fP.
+The patterns are tested in the order they occur in the program.
+.sp .5
+Finally, after all the input is exhausted,
+\*(AK executes the code in the \*(FCEND\fP rule(s), if any.
+.sp .5
+If a program only has a \*(FCBEGIN\fP rule, no input files are processed.
+If a program only has an \*(FCEND\fP rule, the input is read.
+\*(CX
+.EB "\s+2\f(HBAWK PROGRAM EXECUTION\*(FR\s0"
+.sp .5
+.\" --- Variables
+.ES
+.fi
+.TS
+expand;
+l lw(2.3i).
+\*(CD\*(FCARGC\fP	T{
+Number of command line arguments.
+T}
+\*(CB\*(FCARGIND\fP	T{
+Index in \*(FCARGV\fP of current data file.\*(CD
+T}
+\*(FCARGV\fP	T{
+Array of command line arguments. Indexed from
+zero to \*(FCARGC\fP \- 1. Dynamically changing the
+contents of \*(FCARGV\fP can control the files used
+for data.
+T}
+\*(CL\*(FCBINMODE\fP	T{
+Controls ``binary'' mode for all file I/O.  Values of 1, 2, or 3,
+indicate input, output, or all files, respectively, should use binary
+I/O.  \*(CR(Not \*(NK.)  \*(CLOnly for non-POSIX systems.
+\*(CBFor \*(GK, string values of \*(FC"r"\fP, or \*(FC"w"\fP specify
+that input files, or output files, respectively, should use binary I/O.
+Use \*(FC"rw"\fP or \*(FC"wr"\fP for all files.\*(CX
+T}
+.TE
+.EB "\s+2\f(HBVARIABLES\*(FR\s0"
+.BT
+
+.\" --- Variables (continued)
+.ES
+.fi
+.TS
+expand;
+l lw(2i).
+\*(FCCONVFMT\fP	T{
+Conversion format for numbers, default value
+is \*(FC"%.6g"\*(FR.
+T}
+\*(FCENVIRON\fP	T{
+Array containing the current environment.
+It is indexed by the environment
+variable names, each element being the value of
+that variable.
+T}
+\*(CB\*(FCERRNO\fP	T{
+String error value if a
+\*(FCgetline\*(FR
+redirection or read
+fails, or if
+\*(FCclose()\*(FR fails.
+T}
+\*(FCFIELDWIDTHS\fP	T{
+Whitespace-separated list of field widths.
+Used to parse the input into fields of fixed width,
+instead of the value of \*(FCFS\fP
+(see \fHFields\*(FR).\*(CD
+T}
+\*(FCFILENAME\fP	T{
+Name of the current input file. If no files given
+on the command line, \*(FCFILENAME\fP is ``\-''.
+\*(FCFILENAME\fP is undefined inside the \*(FCBEGIN\fP rule
+(unless set by \*(FCgetline\fP).
+T}
+\*(FCFNR\fP	T{
+Record number in current input file.
+T}
+\*(CB\*(FCFPAT\fP	T{
+Regular expression describing field contents.
+Used to parse the input based on the fields
+instead of the field separator
+(see \fHFields\*(FR).\*(CD
+T}
+\*(FCFS\fP	T{
+Input field separator, a space by default
+(see \fHFields\fP).
+T}
+\*(CB\*(FCFUNCTAB\fP	T{
+An array indexed by the names of all user-defined
+and extension functions.\*(CD
+T}
+\*(CB\*(FCIGNORECASE\fP	T{
+If non-zero, all regular expression and string
+operations ignore case.
+Array subscripting
+is \*(FInot\*(FR affected.
+However, the
+\*(FCasort()\*(FR
+and
+\*(FCasorti()\*(FR
+function are affected.
+T}
+\*(CB\*(FCLINT\fP	T{
+Provides dynamic control of the \*(FC\-\^\-lint\fP
+option from within an AWK program.
+T}
+\*(CD\*(FCNF\fP	T{
+Number of fields in the current input record.
+T}
+\*(FCNR\fP	T{
+Total number of input records seen so far.\*(CX
+T}
+\*(CD\*(FCOFMT\fP	T{
+Output format for numbers, \*(FC"%.6g"\*(FR, by default.
+T}
+\*(FCOFS\fP	T{
+Output field separator, a space by default.
+T}
+\*(FCORS\fP	T{
+Output record separator, a newline by default.
+T}
+\*(CB\*(FCPREC\fP	T{
+The working precision of arbitrary precision floating-point
+numbers, 53 by default.
+T}
+\*(FCPROCINFO\fP	T{
+Elements of this array provide access to information
+about the running AWK program. See
+\*(AM for details.\*(CD
+T}
+\*(FCRLENGTH\fP	T{
+Length of the string matched by \*(FCmatch()\*(FR;
+\-1 if no match.
+T}
+\*(CB\*(FCROUNDMODE\fP	T{
+The rounding mode to use for arbitrary precision arithmetic,
+by default \*(FC"N"\fP.\*(CD
+T}
+\*(FCRS\fP	T{
+Input record separator, a newline by default
+(see \fHRecords\fP).
+T}
+\*(FCRSTART\fP	T{
+Index of the first character matched by
+\*(FCmatch()\*(FR; zero if no match.
+T}
+\*(CB\*(FCRT\fP	T{
+Record terminator. \*(GK sets \*(FCRT\fP to the input
+text that matched the character or regular
+expression specified by \*(FCRS\*(FR.\*(CD
+T}
+\*(FCSUBSEP\fP	T{
+Character(s) used to separate multiple subscripts
+in array elements, by default \*(FC"\e034"\*(FR. (See
+\fHArrays\fP).
+T}
+\*(CB\*(FCSYMTAB\fP	T{
+An array indexed by the names of all global
+variables and arrays. May be used to indirectly
+set variable and array values.\*(CD
+T}
+\*(CB\*(FCTEXTDOMAIN\fP	T{
+The internationalization text domain,
+for finding the localized
+translations of the program's strings.\*(CX
+T}
+.TE
+.EB "\s+2\f(HBVARIABLES (continued)\*(FR\s0"
+
+.BT
+
+.\" --- Arrays
+.ES
+.fi
+\*(CDAn array subscript is an expression between square brackets
+(\*(FC[ \*(FRand \*(FC]\*(FR).
+If the expression is a list
+(\*(FIexpr\*(FC, \*(FIexpr \*(FR...),
+then the subscript is a string consisting of the
+concatenation of the (string) value of each expression,
+separated by the value of \*(FCSUBSEP\fP.
+This simulates multi-dimensional
+arrays. For example:
+.nf
+.sp .5
+	\*(FCi = "A";\^ j = "B";\^ k = "C"
+	x[i, j, k] = "hello, world\en"\*(FR
+.sp .5
+.fi
+assigns \*(FC"hello, world\en"\*(FR to the element of the array
+\*(FCx\fP
+indexed by the string \*(FC"A\e034B\e034C"\*(FR. All arrays in AWK
+are associative, i.e., indexed by string values.
+.sp .5
+Use the special operator \*(FCin\fP in an \*(FCif\fP
+or \*(FCwhile\fP statement to see if a particular value is
+an array index.
+.sp .5
+.nf
+	\*(FCif (val in array)
+		print array[val]\*(FR
+.sp .5
+.fi
+If the array has multiple subscripts, use
+\*(FC(i, j) in array\*(FR.
+.sp .5
+Use the \*(FCin\fP construct in a \*(FCfor\fP
+loop to iterate over all the elements of an array.
+.sp .5
+Use the \*(FCdelete\fP statement to delete an
+element from an array.
+Specifying just the array name without a subscript in
+the \*(FCdelete\fP
+statement deletes the entire contents of an array.
+\*(CBYou cannot use \*(FCdelete\fP with \*(FCFUNCTAB\fP
+or \*(FCSYMTAB\fP.\*(CD
+.sp .5
+\*(CB\*(GK provides true multidimensional arrays.
+Such arrays need not be ``rectangular'' as in C or C++. For example:
+.sp .5
+.nf
+	\*(FCa[1] = 5; a[2][1] = 6; a[2][2] = 7\*(FR\*(CX
+.fi
+.EB "\s+2\f(HBARRAYS\*(FR\s0"
+
+.\" --- Expressions
+.ES
+.fi
+\*(CDExpressions are used as patterns, for controlling conditional action
+statements, and to produce parameter values when calling functions.
+Expressions may also be used as simple statements,
+particularly if they have side-effects such as assignment.
+Expressions mix \*(FIoperands\fP and \*(FIoperators\fP. Operands are
+constants, fields, variables, array elements, and the return
+values from function calls (both built-in and user-defined).
+.sp .5
+Regexp constants (\*(FC/\*(FIpat\*(FC/\*(FR), when used as simple expressions,
+i.e., not used on the right-hand side of
+\*(FC~\fP and \*(FC!~\fP, or as arguments to the
+\*(CB\*(FCgensub()\fP,\*(CD
+\*(FCgsub()\fP,
+\*(FCmatch()\fP,
+\*(CB\*(FCpatsplit()\fP,\*(CD
+\*(FCsplit()\fP,
+and
+\*(FCsub()\fP,
+functions, mean \*(FC$0 ~ /\*(FIpat\*(FC/\*(FR.
+.sp .5
+The AWK operators, in order of decreasing precedence, are:
+.sp .5
+.fi
+.TS
+expand;
+l lw(1.8i).
+\*(FC(\&...)\*(FR	Grouping
+\*(FC$\fP	Field reference
+\*(FC++ \-\^\-\fP	T{
+Increment and decrement,
+prefix and postfix
+T}
+\*(FC^\fP \*(CL\*(FC**\*(FR\*(CD	Exponentiation
+\*(FC+ \- !\fP	Unary plus, unary minus, and logical negation
+\*(FC* / %\fP	Multiplication, division, and modulus
+\*(FC+ \-\fP	Addition and subtraction
+\*(FIspace\fP	String concatenation
+\*(FC< >\fP	Less than, greater than
+\*(FC<= >=\fP	Less than or equal, greater than or equal
+\*(FC== !=\fP	Equal, not equal
+\*(FC~ !~\fP	Regular expression match, negated match
+\*(FCin\fP	Array membership
+\*(FC&&\fP	Logical AND, short circuit
+\*(FC||\fP	Logical OR, short circuit
+\*(FC?\^:\fP	In-line conditional expression
+.T&
+l s
+l lw(1.8i).
+\*(FC=\0+=\0\-=\0*=\0/=\0%=\0^=\0\*(CL**=\*(CD\fP
+	Assignment operators\*(CX
+.TE
+.EB "\s+2\f(HBEXPRESSIONS\*(FR\s0"
+
+.BT
+
+.\" --- Conversions and Comparisons
+.ES
+.fi
+\*(CDVariables and fields may be (floating point) numbers, strings or both.
+Context determines how a variable's value is interpreted. If used in
+a numeric expression, it will be treated as a number; if used as a string
+it will be treated as a string.
+\*(CBAssigning a strongly typed regexp constant to a scalar makes it
+a regexp.\*(CD
+.sp .5
+To force a variable to be treated as a number, add zero to it; to force it
+to be treated as a string, concatenate it with the null string.
+.sp .5
+Uninitialized variables have the numeric value zero and the string value
+\*(FC"\^"\fP
+(the null, or empty, string).
+.sp .5
+When a string must be converted to a number, the conversion is accomplished
+using \*(FIstrtod\*(FR(3).
+A number is converted to a string by using the value of \*(FCCONVFMT\fP
+as a format string for \*(FIsprintf\*(FR(3),
+with the numeric value of the variable as the argument.
+However, even though all numbers in AWK are floating-point,
+integral values are \*(FIalways\fP converted as integers.
+.sp .5
+Comparisons are performed as follows:
+If two variables are numeric, they are compared numerically.
+If one value is numeric and the other has a string value that is a
+``numeric string,'' then comparisons are also done numerically.
+Otherwise, the numeric value is converted to a string, and a string
+comparison is performed.
+Two strings are compared, of course, as strings.
+.sp .5
+Note that string constants, such as \*(FC"57"\fP, are \*(FInot\fP
+numeric strings, they are string constants. The idea of ``numeric string''
+only applies to fields, \*(FCgetline\fP input,
+\*(FCFILENAME\*(FR, \*(FCARGV\fP elements, \*(FCENVIRON\fP
+elements and the elements of an array created by \*(FCsplit()\fP
+\*(CBor \*(FCpatsplit()\fP\*(CD that are numeric strings.
+The basic idea is that \*(FIuser input\*(FR,
+and only user input, that looks numeric,
+should be treated that way.\*(CX
+.EB "\s+2\f(HBCONVERSIONS AND COMPARISONS\*(FR\s0"
+
+.\" --- Pattern Elements
+.ES
+.fi
+\*(CDAWK patterns may be one of the following.
+.sp .5
+.nf
+	\*(FCBEGIN
+	END
+	\*(CBBEGINFILE
+	ENDFILE\*(CD
+	\*(FIexpression	
+	pat1\*(FC,\*(FIpat2\*(FR
+.sp .5
+.fi
+\*(FCBEGIN\fP and \*(FCEND\fP are special patterns that provide start-up
+and clean-up actions respectively. They must have actions. There can
+be multiple \*(FCBEGIN\fP and \*(FCEND\fP rules; they are merged and
+executed as if there had just been one large rule. They may occur anywhere
+in a program, including different source files.
+.sp .5
+\*(CB\*(FCBEGINFILE\*(FR and \*(FCENDFILE\*(FR are special patterns that
+execute before the first record of each file and after the last record
+of each file, respectively. In the \*(FCBEGINFILE\*(FR rule, the \*(FCERRNO\*(FR
+variable is non-null if there is a problem with the file; the rule should use
+\*(FCnextfile\*(FR to skip the file if desired. Otherwise \*(GK exits with
+its usual fatal error.  The actions for multiple
+\*(FCBEGINFILE\*(FR and \*(FCENDFILE\*(FR patterns are merged.\*(CD
+.sp .5
+Expression patterns can be any expression, as described
+under \fHExpressions\fP.
+.sp .5
+The \*(FIpat1\*(FC,\*(FIpat2\*(FR pattern
+is called a \*(FIrange pattern\*(FR.
+It matches all input records starting with a record that matches
+\*(FIpat1\*(FR, and continuing until a record that matches
+\*(FIpat2\*(FR, inclusive.
+It does not combine with any other pattern expression.\*(CX
+.EB "\s+2\f(HBPATTERN ELEMENTS\*(FR\s0"
+
+.BT
+
+.\" --- Action Statements
+.ES
+.fi
+.in +.2i
+.ti -.2i
+\*(CD\*(FCbreak\*(FR
+.br
+Break out of the nearest enclosing
+\*(CB\*(FCswitch\fP statement, or\*(CD
+\*(FCdo\*(FR, \*(FCfor\*(FR, or \*(FCwhile\*(FR loop.
+.ti -.2i
+\*(FCcontinue\*(FR
+.br
+Skip the rest of the loop body.
+Evaluate the \*(FIcondition\*(FR
+part of the nearest enclosing \*(FCdo\*(FR or \*(FCwhile\*(FR loop,
+or go to the \*(FIincr\*(FR part of a \*(FCfor\*(FR loop.
+.ti -.2i
+\*(FCdelete \*(FIarray\^\*(FC[\^\*(FIindex\^\*(FC]\*(FR
+.br
+Delete element \*(FIindex\*(FR from array \*(FIarray\*(FR.
+.ti -.2i
+\*(FCdelete \*(FIarray\^\*(FR
+.br
+Delete all elements from array \*(FIarray\*(FR.
+.ti -.2i
+\*(FCdo \*(FIstatement  \*(FCwhile (\*(FIcondition\*(FC)\*(FR
+.br
+Execute \*(FIstatement\*(FR while \*(FIcondition\*(FR is true.
+The \*(FIstatement\*(FR is always executed at least once.
+.ti -.2i
+\*(FCexit\*(FR [ \*(FIexpression\*(FR ]
+.br
+Terminate input record processing.
+Execute the \*(FCEND\*(FR rule(s) if present.
+If present, \*(FIexpression\*(FR becomes \*(AK's return value.
+.ti -.2i
+\*(FCfor (\*(FIinit\*(FC; \*(FIcond\*(FC; \*(FIincr\*(FC) \*(FIstatement\*(FR
+.br
+Execute \*(FIinit\*(FR.
+Evaluate \*(FIcond\*(FR.
+If it is true, execute \*(FIstatement\*(FR.
+Execute \*(FIincr\*(FR before going back to the top to
+re-evaluate \*(FIcond\*(FR.
+Any of the three may be omitted.
+A missing \*(FIcond\*(FR is considered to be true.
+.ti -.2i
+\*(FCfor (\*(FIvar \*(FCin\*(FI array\*(FC) \*(FIstatement\*(FR
+.br
+Execute \*(FIstatement\*(FR once for each subscript in \*(FIarray\*(FR,
+with \*(FIvar\*(FR set to a different subscript each time through
+the loop.
+.ti -.2i
+\*(CD\*(FCif (\*(FIcondition\*(FC) \*(FIstatement1\*(FR [ \*(FCelse\*(FI statement2\*(FR ]
+.br
+If \*(FIcondition\*(FR is true, execute \*(FIstatement1\*(FR,
+otherwise execute \*(FIstatement2\*(FR. Each \*(FCelse\*(FR
+matches the closest \*(FCif\*(FR.
+.ti -.2i
+\*(FCnext\*(FR	See \fHInput Control.\fP
+.ti -.2i
+\*(FCnextfile\*(FR	See \fHInput Control.\fP
+.in -.2i
+.\" --- Start switch statement
+\*(CB\*(FCswitch (\*(FIexpression\*(FC) {
+.br
+case \*(FIconstant\*(FC|\*(FIregular expression\*(FC: \*(FIstatement(s)
+.br
+\*(FCdefault: \*(FIstatement(s)
+.br
+\*(FC}\*(FR
+.in +.2i
+.br
+Switch on \*(FIexpression\*(FR,
+execute \*(FIcase\*(FR if matched, default if not.
+The \*(FCdefault\fP label and associated statements are optional.\*(CD
+.ti -.2i
+.\" --- End switch statement
+\*(FCwhile (\*(FIcondition\*(FC) \*(FIstatement \*(FR
+.br
+While \*(FIcondition\*(FR is true, execute \*(FIstatement\*(FR.
+.ti -.2i
+\*(FC{ \*(FIstatements \*(FC}\*(FR
+.br
+A list of statements enclosed in braces can be used anywhere
+that a single statement would otherwise be used.\*(CX
+.in -.2i
+.EB "\s+2\f(HBACTION STATEMENTS\*(FR\s0"
+
+.\" --- Escape Sequences
+.ES
+.fi
+\*(CDWithin strings constants (\*(FC"..."\fP) and regexp
+constants (\*(FC/.../\fP), escape sequences may be used to
+generate otherwise unprintable characters. This table lists
+the available escape sequences.
+.sp .5
+.TS
+center, tab(~);
+lp8 lp8 lp8 lp8.
+\*(FC\ea\fP~alert (bell)~\*(FC\er\fP~carriage return
+\*(FC\eb\fP~backspace~\*(FC\et\fP~horizontal tab
+\*(FC\ef\fP~form feed~\*(FC\ev\fP~vertical tab
+\*(FC\en\fP~newline~\*(FC\e\e\fP~backslash
+\*(FC\e\*(FIddd\*(FR~octal value \*(FIddd\fP~\*(CL\*(FC\ex\*(FIhh\*(FR~hex value \*(FIhh\fP\*(CD
+\*(FC\e"\fP~double quote~\*(FC\e/\fP~forward slash\*(CX
+.TE
+.EB "\s+2\f(HBESCAPE SEQUENCES\*(FR\s0"
+.sp
+.\" --- Acknowledgements
+.ES
+.fi
+\*(CD\*(FRArnold Robbins wrote this reference card.
+We thank
+Brian Kernighan and Michael Brennan who reviewed it.\*(CX
+.EB "\s+2\f(HBACKNOWLEDGMENTS\*(FR\s0"
+.BT
+
+.\" --- Records
+.ES
+.fi
+\*(CDNormally, records are separated by newline characters.
+Assigning values to the built-in variable \*(FCRS\*(FR
+controls how records are separated.
+If \*(FCRS\fP is any single character, that character separates records.
+\*(CLOtherwise, \*(FCRS\fP is a regular expression.
+\*(CR(Not \*(NK.)\*(CL
+Text in the input that matches this
+regular expression separates the record.
+\*(CB\*(GK sets \*(FCRT\*(FR to the value of the
+input text that matched the regular expression.
+The value of \*(FCIGNORECASE\fP
+also affects how records are separated when
+\*(FCRS\fP is a regular expression.\*(CD
+If \*(FCRS\fP is set to the null string,
+then records are separated by one or more empty lines.
+When \*(FCRS\fP is set to the null string,
+the newline character always acts as
+a field separator, in addition to whatever value
+\*(FCFS\fP may have.
+\*(CB\*(MK does not apply exceptional rules to \*(FCFS\fP
+when \*(FCRS\fP is set to \*(FC"\^"\fP.\*(CX
+.EB "\s+2\f(HBRECORDS\*(FR\s0"
+
+.\" --- Fields
+.ES
+.fi
+\*(CDAs each input record is read, \*(AK splits the record into
+\*(FIfields\*(FR, using the value of the \*(FCFS\fP
+variable as the field separator.
+If \*(FCFS\fP is a single character,
+fields are separated by that character.
+\*(CLIf \*(FCFS\fP is the null string,
+then each individual character becomes a separate field.\*(CD
+Otherwise, \*(FCFS\fP is expected to be a full regular expression.
+In the special case that \*(FCFS\fP
+is a single space, fields are separated
+by runs of spaces and/or tabs
+and/or newlines.
+Leading and trailing whitespace are ignored.
+\*(CBThe value of \*(FCIGNORECASE\fP
+also affects how fields are split when
+\*(FCFS\fP is a regular expression.\*(CD
+.sp .5
+\*(CBIf \*(FCFIELDWIDTHS\fP
+is set to a space-separated list of numbers, each field is
+expected to have a fixed width, and \*(GK
+splits the record using the specified widths.
+Each field width may optionally be preceded by a colon-separated
+value specifying the number of characters to skip before the field starts.
+The value of \*(FCFS\fP is ignored.
+Assigning a new value to \*(FCFS\fP or \*(FCFPAT\fP
+overrides the use of \*(FCFIELDWIDTHS\*(FR.
+.sp .5
+Similarly, if the
+\*(FCFPAT\fP
+variable is set to a string representing a regular expression,
+each field is made up of text that matches that regular expression. In
+this case, the regular expression describes the fields themselves,
+instead of the text that separates the fields.
+Assigning a new value to
+\*(FCFS\fP
+or
+\*(FCFIELDWIDTHS\fP
+overrides the use of
+\*(FCFPAT\fP.\*(CD
+.sp .5
+Each field in the input record may be referenced by its position:
+\*(FC$1\*(FR, \*(FC$2\*(FR and so on.
+\*(FC$0\fP is the whole record.
+Fields may also be assigned new values.
+.sp .5
+The variable \*(FCNF\fP
+is set to the total number of fields in the input record.
+.sp .5
+References to non-existent fields (i.e., fields after \*(FC$NF\*(FR)
+produce the null string. However, assigning to a non-existent field
+(e.g., \*(FC$(NF+2) = 5\*(FR) increases the value of
+\*(FCNF\*(FR, creates any intervening fields with the null string as their value,
+and causes the value of \*(FC$0\fP
+to be recomputed with the fields being separated by the
+value of \*(FCOFS\*(FR.
+References to negative numbered fields cause a fatal error.
+Decreasing the value of \*(FCNF\fP causes the trailing fields to be lost.\*(CX
+.EB "\s+2\f(HBFIELDS\*(FR\s0"
+
+.\" --- Historical Features
+.ES
+.fi
+\*(CDIt is possible to call the \*(FClength()\fP
+built-in function not only with no argument, but even without parentheses.
+Doing so, however, is poor practice,
+and \*(GK
+issues a warning about its use if \*(FC\-\^\-lint\fP
+is specified on the command line.\*(CB
+.EB "\s+2\f(HBHISTORICAL FEATURES (\*(GK\f(HB)\*(FR\s0"
+.BT
+
+.\" --- Regular Expressions
+.ES
+.fi
+\*(CDRegular expressions are the extended kind originally defined by
+\*(FCegrep\fP.
+\*(CB\*(GK supports additional GNU operators.
+A \*(FIword-constituent\fP character is a letter, digit, or
+underscore (\*(FC_\fP).\*(CD
+.sp .5
+.TS
+center, tab(~);
+cp8 sp8
+cp8 sp8
+lp8|lp8.
+.\" .vs 10
+_
+Summary of Regular Expressions
+In Decreasing Precedence
+_
+\*(FC(\^\*(FIr\*(FC)\*(FR~regular expression (for grouping)
+\*(FIc\*(FR~if non-special character, matches itself
+\*(FC\e\*(FI\^c\*(FR~turn off special meaning of \*(FIc\fP
+\*(FC^\*(FR~beginning of string (note: \*(FInot\fP line)
+\*(FC$\*(FR~end of string (note: \*(FInot\fP line)
+\*(FC.\*(FR~any single character, including newline
+\*(FC[\*(FR...\*(FC]\*(FR~any one character in ... or range
+\*(FC[^\*(FR...\*(FC]\*(FR~any one character not in ... or range
+\*(CB\*(FC\ey\*(FR~word boundary
+\*(FC\eB\*(FR~middle of a word
+\*(FC\e<\*(FR~beginning of a word
+\*(FC\e>\*(FR~end of a word
+\*(FC\es\*(FR~any whitespace character
+\*(FC\eS\*(FR~any non-whitespace character
+\*(FC\ew\*(FR~any word-constituent character
+\*(FC\eW\*(FR~any non-word-constituent character
+\*(FC\e`\*(FR~beginning of a string
+\*(FC\e'\*(FR~end of a string\*(CD
+\*(FIr\*(FC*\*(FR~zero or more occurrences of \*(FIr\*(FR
+\*(FIr\*(FC+\*(FR~one or more occurrences of \*(FIr\*(FR
+\*(FIr\*(FC?\*(FR~zero or one occurrences of \*(FIr\*(FR
+\*(FIr\*(FC{\*(FIn\*(FC,\*(FIm\*(FC}\*(FR~\*(FIn\fP to \*(FIm\fP occurrences of \*(FIr\*(FR \*(CR(POSIX: see note below)\*(CD
+\*(FIr1\*(FC|\|\*(FIr2\*(FR~\*(FIr1\*(FR or \*(FIr2\*(FR
+.TE
+.sp .5
+.fi
+The \*(FIr\*(FC{\*(FIn\*(FC,\*(FIm\*(FC}\*(FR notation is called an
+\*(FIinterval expression\fP.
+\*(CRNot supported by
+\*(MK or \*(NK.\*(CX
+.sp .5
+\*(CDIn regular expressions, within character ranges
+(\*(FC[\*(FR...\*(FC]\*(FR),
+the notation \*(FC[[:\*(FIclass\*(FC:]]\*(FR defines character classes\*(CD:
+.sp .5
+.TS
+center, tab(~);
+lp8 lp8 lp8 lp8.
+\*(FCalnum\*(FR~alphanumeric~\*(FClower\*(FR~lowercase
+\*(FCalpha\*(FR~alphabetic~\*(FCprint\*(FR~printable
+\*(FCblank\*(FR~space or tab~\*(FCpunct\*(FR~punctuation
+\*(FCcntrl\*(FR~control~\*(FCspace\*(FR~whitespace
+\*(FCdigit\*(FR~decimal~\*(FCupper\*(FR~uppercase
+\*(FCgraph\*(FR~non-spaces~\*(FCxdigit\*(FR~hexadecimal\*(CX
+.TE
+.fi
+.EB "\s+2\f(HBREGULAR EXPRESSIONS\*(FR\s0"
+
+.\" --- Environment Variables
+.ES
+.fi
+\*(CDThe environment variable \*(FCAWKPATH\fP specifies a search path to use
+when finding source files named with the \*(FC\-f\fP and \*(FC\-i\fP
+options.
+The default path is
+\*(FC".:/usr/local/share/awk"\*(FR.
+.\" if this variable does not exist.
+.\" (The actual directory may vary,
+.\" depending upon how \*(GK was built and installed.)
+If a source file name contains a ``/'' character,
+no path search is performed.
+.sp .5
+The variable \*(FCAWKLIBPATH\fP
+specifies the search path for dynamic extensions to use
+with \*(FC@load\fP and the \*(FC\-l\fP option.
+.sp .5
+For socket communication,
+\*(FCGAWK_SOCK_RETRIES\fP
+controls the number of connection retries, and
+\*(FCGAWK_MSEC_SLEEP\fP controls
+the interval between retries.
+The interval is in milliseconds. On systems that do not support
+\*(FIusleep\fP(3),
+the value is rounded up to an integral number of seconds.
+.sp .5
+The value of \*(FCGAWK_READ_TIMEOUT\fP specifies the time, in milliseconds,
+for \*(GK to
+wait for input before returning with an error.
+.sp .5
+If \*(FCPOSIXLY_CORRECT\fP exists
+.\" in the environment,
+then \*(GK
+behaves exactly as if the \*(FC\-\^\-posix\fP option had been given.\*(CB
+.EB "\s+2\f(HBENVIRONMENT VARIABLES (\*(GK\f(HB)\*(FR\s0"
+.BT
+
+.\" --- Localization
+.ES
+.fi
+\*(CDThere are several steps involved in producing and running a localizable
+\*(AK program.
+.sp .5
+1. Add a \*(FCBEGIN\*(FR action to assign a value to the
+\*(FCTEXTDOMAIN\*(FR variable to set the text domain for
+your program.
+.sp .3
+.ti +5n
+\*(FCBEGIN { TEXTDOMAIN = "myprog" }\*(FR
+.sp .3
+This allows \*(GK to find the \*(FC\&.gmo\*(FR
+file associated with your program.
+Without this step, \*(GK uses the \*(FCmessages\*(FR text domain,
+which probably won't work.
+.sp .5
+2. Mark all strings that should be translated with leading underscores.
+.sp .5
+3. Use the
+\*(FCbindtextdomain()\*(FR,
+\*(FCdcgettext()\*(FR,
+and/or
+\*(FCdcngettext()\*(FR
+functions in your program, as appropriate.
+.sp .5
+4. Run
+.sp .3
+.ti +3n
+\*(FCgawk\0\-\^\-gen\-pot\0\-f\0myprog.awk\0>\0myprog.pot\*(FR
+.sp .3
+to generate a \*(FC\&.pot\*(FR
+file for your program.
+.sp .5
+5. Provide appropriate translations, and build and install a corresponding
+\*(FC\&.gmo\*(FR file.
+.sp .5
+The internationalization features are described in full detail in \*(AM.\*(CB
+.EB "\s+2\f(HBLOCALIZATION (\*(GK\f(HB)\*(FR\s0"
+
+.\" --- Special Filenames
+.ES
+.fi
+\*(CDAll three \*(FCawk\fP implementations
+recognize certain special filenames internally
+when doing I/O redirection from either \*(FCprint\fP
+or \*(FCprintf\fP into a file or via \*(FCgetline\fP
+from a file.
+These filenames
+provide access to open file descriptors inherited from the
+parent process.  They
+may also be used on the command line to name data files.
+The filenames are:
+.sp .5
+.TS
+expand;
+l lw(2i).
+\*(FC"\-"\fP	standard input
+\*(FC/dev/stdin\fP	standard input
+\*(FC/dev/stdout\fP	standard output
+\*(FC/dev/stderr\fP	standard error output
+.TE
+.sp .5
+.fi
+\*(CBThe following names are specific to \*(GK.
+.sp .5
+.in +.2i
+.ti -.2i
+\*(FC/dev/fd/\^\*(FIn\*(FR
+.br
+File associated with the open file descriptor \*(FIn\*(FR.
+.ti -.2i
+\*(FC/inet/tcp/\*(FIlport\*(FC/\*(FIrhost\*(FC/\*(FIrport\*(FR
+.br
+.ti -.2i
+\*(FC/inet4/tcp/\*(FIlport\*(FC/\*(FIrhost\*(FC/\*(FIrport\*(FR
+.br
+.ti -.2i
+\*(FC/inet6/tcp/\*(FIlport\*(FC/\*(FIrhost\*(FC/\*(FIrport\*(FR
+.br
+Files for TCP/IP connections on local port \*(FIlport\*(FR to
+remote host \*(FIrhost\*(FR on remote port \*(FIrport\*(FR.
+Use a port of \*(FC0\*(FR to have the system pick a port.
+Use \*(FC/inet4\fP to force an IPv4 connection,
+and \*(FC/inet6\fP to force an IPv6 connection.
+Plain \*(FC/inet\fP uses the system default (probably IPv4).
+Usable only with the \*(FC|&\*(FR two-way I/O operator.
+.ti -.2i
+\*(FC/inet/udp/\*(FIlport\*(FC/\*(FIrhost\*(FC/\*(FIrport\*(FR
+.br
+.ti -.2i
+\*(FC/inet4/udp/\*(FIlport\*(FC/\*(FIrhost\*(FC/\*(FIrport\*(FR
+.br
+.ti -.2i
+\*(FC/inet6/udp/\*(FIlport\*(FC/\*(FIrhost\*(FC/\*(FIrport\*(FR
+.br
+Similar, but use UDP/IP instead of TCP/IP.\*(CL
+.in -.2i
+.EB "\s+2\f(HBSPECIAL FILENAMES\*(FR\s0"
+.sp .5
+.\" --- Namespaces
+.ES
+.fi
+\*(CDA
+\*(FIqualified name\fP
+consists of a two simple identifiers joined by a double colon
+(\*(FC::\fP).
+The left identifier is the namespace and the right one
+is the variable within it.
+All non-qualified names are treated as if in the
+``current'' namespace; the default namespace is \*(FCawk\fP.
+However, simple identifiers consisting solely of uppercase
+letters are forced into the
+\*(FCawk\fP
+namespace.
+You change the current namespace with an
+\*(FC@namespace "\*(FIname\^\*(FC"\*(FR
+directive.\*(CB
+.EB "\s+2\f(HBNAMESPACES (\*(GK\f(HB)\*(FR\s0"
+
+.BT
+
+.\" --- Input Control
+.ES
+.fi
+.TS
+expand;
+l lw(1.8i).
+\*(FCgetline\fP	T{
+Set \*(FC$0\fP from next record;
+set \*(FCNF\*(FR, \*(FCNR\*(FR, \*(FCFNR\*(FR.
+T}
+\*(FCgetline < \*(FIfile\*(FR	Set \*(FC$0\fP from next record of \*(FIfile\*(FR; set \*(FCNF\*(FR.
+\*(FCgetline \*(FIv\*(FR	T{
+Set \*(FIv\fP from next input record;
+set \*(FCNR\*(FR, \*(FCFNR\*(FR.
+T}
+\*(FCgetline \*(FIv \*(FC< \*(FIfile\*(FR	Set \*(FIv\fP from next record of \*(FIfile\*(FR.
+\*(FIcmd \*(FC| getline\*(FR	Pipe into \*(FCgetline\*(FR; set \*(FC$0\*(FR, \*(FCNF\*(FR.
+\*(FIcmd \*(FC| getline \*(FIv\*(FR	Pipe into \*(FCgetline\*(FR; set \*(FIv\*(FR.
+.\" \*(CB\*(FIcmd \*(FC|& getline\*(FR	Coprocess pipe into \*(FCgetline\*(FR; set \*(FC$0\*(FR, \*(FCNF\*(FR.
+.TE
+.fi
+.in +.2i
+.ti -.2i
+\*(CB\*(FIcmd \*(FC|& getline\*(FR
+.br
+Coprocess pipe into \*(FCgetline\*(FR; set \*(FC$0\*(FR, \*(FCNF\*(FR.
+.br
+.ti -.2i
+\*(FIcmd \*(FC|& getline \*(FIv\*(FR
+.br
+Coprocess pipe into \*(FCgetline\*(FR; set \*(FIv\*(FR.
+.ti -.2i
+\*(CD\*(FCnext\fP
+.br
+Stop processing the current input
+record. Read next input record and
+start over with the first pattern in the
+program. Upon end of the input data,
+execute any \*(FCEND\fP rule(s).
+.br
+.ti -.2i
+\*(FCnextfile\fP
+.br
+Stop processing the current input file.
+The next input record comes from the
+next input file. Update \*(FCFILENAME\fP \*(CBand
+\*(FCARGIND\fP\*(CD, reset \*(FCFNR\fP to 1,
+and start over with the first
+pattern. At end
+of file, execute any \*(CB\*(FCENDFILE\fP and\*(CD \*(FCEND\fP rule(s).
+.in -.2i
+.sp .5
+.fi
+\*(FCgetline\*(FR returns 1 on success, zero on end of file,
+and \-1 on an error.
+\*(CBFor retryable I/O, \*(FCgetline\*(FR returns \-2.
+All versions set \*(FCRT\fP.
+Upon an error, \*(FCERRNO\*(FR describes
+the problem.\*(CX
+.EB "\s+2\f(HBINPUT CONTROL\*(FR\s0"
+.sp .6
+.\" --- Output Control
+.ES
+.fi
+.in +.2i
+.ti -.2i
+\*(CD\*(FCfflush(\*(FR[\*(FIfile\^\*(FR]\*(FC)\*(FR
+.br
+Flush any buffers associated
+with the open output file or pipe \*(FIfile\*(FR.
+If no \*(FIfile\fP, or if
+\*(FIfile\fP is null, then flush all open output files and pipes.
+.ti -.2i
+\*(FCprint\fP
+.br
+Print \*(FC$0\*(FR. Terminate the output record
+with \*(FCORS\fP.
+.ti -.2i
+\*(FCprint \*(FIexpr-list\*(FR
+.br
+Print expressions. Each expression is separated
+by the value of \*(FCOFS\fP. Terminate the output record
+with \*(FCORS\fP.
+.ti -.2i
+\*(FCprintf \*(FIfmt\*(FC, \*(FIexpr-list\*(FR
+.br
+Format and print (see \fHPrintf Formats\fP).
+.ti -.2i
+\*(FCsystem(\*(FIcmd\*(FC)\*(FR
+.br
+Execute the command \*(FIcmd\*(FR,
+and return the exit status
+\*(CR(may not be available on non-POSIX systems)\*(CD.
+.sp .5
+.in -.2i
+I/O redirections may be used with both \*(FCprint\fP and \*(FCprintf\fP.
+.sp .5
+.in +.2i
+.ti -.2i
+\*(CD\*(FCprint "hello" > \*(FIfile\*(FR
+.br
+Print data to \*(FIfile\fP. The first time the file is written to, it
+is truncated. Subsequent commands append data.
+.ti -.2i
+\*(FCprint "hello" >> \*(FIfile\*(FR
+.br
+Append data to \*(FIfile\fP. The previous contents of \*(FIfile\*(FR are not lost.
+.ti -.2i
+\*(FCprint "hello" | \*(FIcmd\*(FR
+.br
+Print data down a pipeline to \*(FIcmd\*(FR.
+.ti -.2i
+\*(CB\*(FCprint "hello" |& \*(FIcmd\*(FR
+.br
+Print data down a pipeline to coprocess \*(FIcmd\*(FR.\*(CX
+.in -.2i
+.EB "\s+2\f(HBOUTPUT CONTROL\*(FR\s0"
+.sp .6
+.\" --- Closing Redirections
+.ES
+.fi
+.in +.2i
+.ti -.2i
+\*(CD\*(FCclose(\*(FIfile\*(FC)\*(FR
+.br
+Close input or output file, pipe \*(CBor coprocess.\*(CD
+.ti -.2i
+\*(CB\*(FCclose(\*(FIcommand\*(FC, \*(FIhow\*(FC)\*(FR
+.br
+Close one end of coprocess pipe.
+Use \*(FC"to"\*(FR for the write end, or
+\*(FC"from"\*(FR for the read end.\*(CD
+.in -.2i
+.sp .5
+On success, \*(FCclose()\*(FR returns zero for a file, or the exit status for a process.
+It returns \-1 if \*(FIfile\*(FR
+was never opened, or
+if there was a system problem.
+\*(CB\*(FCERRNO\*(FR describes
+the error.\*(CX
+.EB "\s+2\f(HBCLOSING REDIRECTIONS\*(FR\s0"
+
+.BT
+
+.\" --- Printf Formats
+.ES
+.fi
+\*(CDThe \*(FCprintf\fP statement and
+\*(FCsprintf()\fP function
+accept the following conversion specification formats:
+.sp .5
+.nf
+\*(CB\*(FC%a\fP, \*(FC%A\fP	A C99 floating point hexadecimal number.\*(CD
+\*(FC%c\fP		An \s-1ASCII\s+1 character.
+\*(FC%d\fP, \*(FC%i\fP	A decimal number (the integer part).
+\*(FC%e\fP		A floating point number of the form
+		\*(FC[\-]d.dddddde[+\^\-]dd\*(FR.
+\*(FC%E\fP		Like \*(FC%e\fP, but use \*(FCE\fP instead of \*(FCe\*(FR.
+\*(FC%f\fP		A floating point number of the form
+		\*(FC[\-]ddd.dddddd\*(FR.
+\*(FC%F\fP		Like \*(FC%f\fP, but use capital letters for infinity and
+		not-a-number values.
+\*(FC%g\fP		Use \*(FC%e\fP or \*(FC%f\fP, whichever is shorter, with
+		nonsignificant zeros suppressed.
+\*(FC%G\fP		Like \*(FC%g\fP, but use \*(FC%E\fP instead of \*(FC%e\*(FR.
+\*(FC%o\fP		An unsigned octal integer.
+\*(FC%u\fP		An unsigned decimal integer.
+\*(FC%s\fP		A character string.
+\*(FC%x\fP		An unsigned hexadecimal integer.
+\*(FC%X\fP		Like \*(FC%x\fP, but use \*(FCABCDEF\fP for 10\(en15.
+\*(FC%%\fP		A literal \*(FC%\fP; no argument is converted.
+.sp .5
+.fi
+Optional, additional parameters may lie between the \*(FC%\fP
+and the control letter:
+.sp .5
+.TS
+expand;
+l lw(2.2i).
+\*(CB\*(FIcount\*(FC$\*(FR	T{
+Use the
+\*(FIcount\*(FR'th
+argument at this point in the formatting
+(a \*(FIpositional specifier\*(FR).
+For use in translated versions of
+format strings, not in the original text of an AWK program.\*(CD
+T}
+\*(FC\-\fP	T{
+Left-justify the expression within its field.
+T}
+\*(FIspace\fP	T{
+For numeric conversions, prefix positive values
+with a space and negative values with a
+minus sign.
+T}
+\*(FC+\fP	T{
+Use before the \*(FIwidth\fP modifier to always
+supply a sign for numeric conversions, even if
+the data to be formatted is positive. The \*(FC+\fP
+overrides the space modifier.
+T}
+\*(FC#\fP	T{
+Use an ``alternate form'' for some control letters:
+T}
+  \*(FC%o\*(FR	T{
+Supply a leading zero.
+T}
+  \*(FC%x\*(FR, \*(FC%X\*(FR	T{
+Supply a leading \*(FC0x\*(FR or \*(FC0X\*(FR for a nonzero result.
+T}
+  \*(FC%e\*(FR, \*(FC%E\*(FR, \*(FC%f\*(FR	T{
+The result always has a decimal point.
+T}
+  \*(FC%g\*(FR, \*(FC%G\*(FR	T{
+Trailing zeros are not removed.
+T}
+\*(FC0\fP	T{
+Pad output with zeros instead of spaces.
+This applies only to the numeric output formats.
+Only has an effect when the field width is wider
+than the value to be printed.
+T}
+\*(CB\*(FC'\*(FR	T{
+Use the locale's thousands separator and decimal
+point characters.\*(CD
+T}
+\*(FIwidth\fP	T{
+Pad the field to this width. The field is normally
+padded with spaces. If the \*(FC0\fP flag has been used,
+pad with zeros.
+T}
+\*(FC.\*(FIprec\*(FR	T{
+Precision.
+The meaning of the \*(FIprec\*(FR varies by control letter:
+T}
+  \*(FC%d\*(FR,\|\*(FC%o\*(FR,\|\*(FC%i\fP,	\0
+  \*(FC%u\*(FR,\|\*(FC%x\*(FR,\|\*(FC%X\fP	T{
+The minimum number of digits to print.
+T}
+  \*(FC%e\*(FR, \*(FC%E\*(FR, \*(FC%f\*(FR	T{
+The number of digits to print to the right of the decimal point.
+T}
+  \*(FC%g\*(FR, \*(FC%G\fP	T{
+The maximum number of significant digits.
+T}
+  \*(FC%s\fP	T{
+The maximum number of characters to print.
+T}
+.TE
+.sp .5
+.fi
+Use a
+\*(FC*\fP in place of either the \*(FIwidth\fP or \*(FIprec\fP
+specifications to take their values from
+the \*(FCprintf\fP or \*(FCsprintf()\*(FR argument list.
+\*(CBUse \*(FC*\*(FIn\*(FC$\*(FR to use positional specifiers
+with a dynamic width or precision.\*(CX
+.EB "\s+2\f(HBPRINTF FORMATS\*(FR\s0"
+
+
+.BT
+
+.\" --- User-defined Functions
+.ES
+.fi
+\*(CDFunctions in AWK are defined as follows:
+.sp .5
+.nf
+	\*(FCfunction \*(FIname\*(FC(\*(FIparameter list\*(FC)
+	{
+		\*(FIstatements
+	\*(FC}\*(FR
+.sp .5
+.fi
+Functions execute when they are called from within expressions
+in either patterns or actions. Actual parameters supplied in the function
+call instantiate the formal parameters declared in the function.
+Arrays are passed by reference, other variables are passed by value.
+.sp .5
+Declare local variables as extra parameters
+in the parameter list. The convention is to separate local variables from
+real parameters by extra spaces in the parameter list. For example:
+.sp .5
+.nf
+	\*(FC# a and b are local
+	function f(p, q,     a, b)
+	{
+		\&.....
+	}
+.sp .3
+	/abc/	{ ... ; f(1, 2) ; ... }\*(FR
+.fi
+.sp .5
+The left parenthesis in a function call is required
+to immediately follow the function name
+without any intervening whitespace.
+This is to avoid a syntactic ambiguity with the concatenation operator.
+This restriction does not apply to the built-in functions.
+.sp .5
+Functions may call each other and may be recursive.
+Function parameters used as local variables are initialized
+to the null string and the number zero upon function invocation.
+.sp .5
+\*(CBFunctions may be called indirectly. To do this, assign
+the name of the function to be called, as a string, to a variable.
+Then use the variable as if it were the name of a function, prefixed with
+an ``at'' sign, like so:\*(FC
+.nf
+.sp .5
+	function myfunc()
+	{
+		print "myfunc called"
+	}
+.sp .3
+	{
+		the_func = "myfunc"
+		@the_func()
+	}
+.fi
+.sp .5
+\*(FR\*(CDUse \*(FCreturn\fP to return a value from a function. The return value
+is undefined if no value is provided, or if the function returns by
+``falling off'' the end.
+.sp .5
+\*(CLThe word
+\*(FCfunc\fP
+may be used in place of
+\*(FCfunction\*(FR.
+\*(CRThis usage is deprecated.\*(CX
+.EB "\s+2\f(HBUSER-DEFINED FUNCTIONS\*(FR\s0"
+.sp .6
+.\" --- Built-in Numeric Functions
+.ES
+.fi
+.TS
+expand;
+l lw(1.9i).
+\*(CD\*(FCatan2(\*(FIy\*(FC, \*(FIx\*(FC)\*(FR	The arctangent of \*(FIy/x\fP in radians.
+\*(FCcos(\*(FIexpr\*(FC)\*(FR	The cosine of \*(FIexpr\fP, which is in radians.
+\*(FCexp(\*(FIexpr\*(FC)\*(FR	The exponential function (\*(FIe\|\*(FC^\|\*(FIx\*(FR).
+\*(FCint(\*(FIexpr\*(FC)\*(FR	Truncate to integer.
+.\" \*(CB\*(FCintdiv(\*(FIn\*(FR\*(FC,\*(FI d\*(FR\*(FC,\*(FI r\*(FR\*(FC)\*(FR	T{
+.\" Return result of integer division in \*(FIr\*(FR.\*(CD
+.\" T}
+\*(FClog(\*(FIexpr\*(FC)\*(FR	The natural logarithm function (base \*(FIe\^\*(FR).
+\*(FCrand()\fP	A random number \*(FIN\fP such that 0 \(<= \*(FIN\fP < 1.
+\*(FCsin(\*(FIexpr\*(FC)\*(FR	The sine of \*(FIexpr\fP, which is in radians.
+\*(FCsqrt(\*(FIexpr\*(FC)\*(FR	The square root of \*(FIexpr\fP.
+\&\*(FCsrand(\*(FR[\*(FIexpr\^\*(FR]\*(FC)\*(FR	T{
+Use \*(FIexpr\fP as the new seed for the random number
+generator. If no \*(FIexpr\fP, use the time of day.
+Return the \" random number generator's
+previous seed.\*(CX
+T}
+.TE
+.EB "\s+2\f(HBNUMERIC FUNCTIONS\*(FR\s0"
+.BT
+
+.\" --- Built-in String Functions
+.ES
+.fi
+.in +.2i
+.ti -.2i
+\*(CB\*(FCasort(\*(FIs \*(FR[\*(FC,\*(FI d \*(FR[\*(FC,\*(FI comp\*(FR]]\*(FC)\*(FR
+.br
+Sort the source array \*(FIs\*(FR, replacing the indices with numeric
+values 1 through \*(FIn\*(FR (the number of elements in the array),
+and return the number of elements.
+If destination \*(FId\*(FR is supplied, copy \*(FIs\*(FR to \*(FId\*(FR,
+sort \*(FId\*(FR, and leave \*(FIs\*(FR unchanged.
+Use \*(FIcomp\*(FR to compare indices and elements.\*(CD
+.ti -.2i
+\*(CB\*(FCasorti(\*(FIs \*(FR[\*(FC,\*(FI d \*(FR[\*(FC,\*(FI comp\*(FR]]\*(FC)\*(FR
+.br
+Like \*(FCasort()\*(FR, but sort on the indices, not
+the values.  The original values are thrown array, so provide a
+second array to preserve the first.\*(CD
+.ti -.2i
+\*(CB\*(FCgensub(\*(FIr\*(FC, \*(FIs\*(FC, \*(FIh \*(FR[\*(FC, \*(FIt\*(FR]\*(FC)\*(FR
+.br
+Search the target string
+\*(FIt\fP for matches of the regular expression \*(FIr\*(FR. If
+\*(FIh\fP is a string beginning with \*(FCg\fP or \*(FCG\*(FR,
+replace all matches of \*(FIr\fP with \*(FIs\*(FR. Otherwise, \*(FIh\fP
+is a number indicating which match of \*(FIr\fP to replace.
+If \*(FIt\fP is not supplied, use \*(FC$0\fP instead. Within the
+replacement text \*(FIs\*(FR, the sequence \*(FC\e\*(FIn\*(FR,
+where \*(FIn\fP is a digit from 1 to 9, indicates just
+the text that matched the \*(FIn\*(FRth parenthesized subexpression.
+The sequence \*(FC\e0\fP represents the entire matched text, as does
+the character \*(FC&\*(FR. Unlike \*(FCsub()\fP and \*(FCgsub()\*(FR,
+the function returns the modified string;
+the original target string is \*(FInot\fP changed.\*(CD
+.ti -.2i
+\*(FCgsub(\*(FIr\*(FC, \*(FIs \*(FR[\*(FC, \*(FIt\*(FR]\*(FC)\*(FR
+.br
+For each substring matching the
+regular expression \*(FIr\fP in the string \*(FIt\*(FR, substitute the
+string \*(FIs\*(FR, and return the number of substitutions. If
+\*(FIt\fP is not supplied, use \*(FC$0\*(FR. An \*(FC&\fP in the
+replacement text is replaced with the text that was actually matched.
+Use \*(FC\e&\fP to get a literal \*(FC&\*(FR. See \*(AM
+for a fuller discussion of the rules for \*(FC&\*(FR's and backslashes
+in the replacement text of \*(CB\*(FCgensub()\*(FR,\*(CD \*(FCsub()\*(FR
+and \*(FCgsub().\*(FR
+.ti -.2i
+\*(FCindex(\*(FIs\*(FC, \*(FIt\*(FC)\*(FR
+.br
+Return the index of the string
+\*(FIt\fP in the string \*(FIs\*(FR, or zero if \*(FIt\fP is not present.
+.ti -.2i
+\*(FClength(\*(FR[\*(FIs\*(FR]\*(FC)\*(FR
+.br
+Return the length of the string
+\*(FIs\*(FR, or the length of \*(FC$0\fP if \*(FIs\fP is not supplied.
+\*(CLWith an array argument, return the number of elements
+in the array.\*(CD
+.ti -.2i
+\*(FCmatch(\*(FIs\*(FC, \*(FIr \*(CB\*(FR[\*(FC, \*(FIa\*(FR]\*(CD\*(FC)\*(FR
+.br
+Return the position in
+\*(FIs\fP where the regular expression \*(FIr\fP occurs, or zero if
+\*(FIr\fP is not present, and set the values of variables
+\*(FCRSTART\fP
+and \*(FCRLENGTH\*(FR.
+\*(CBIf \*(FIa\*(FR is supplied, the text matching all of \*(FIr\*(FR
+is placed in \*(FIa\*(FC[0]\*(FR.  If there were parenthesized
+subexpressions, the matching texts are placed
+in \*(FIa\*(FC[1]\*(FR, \*(FIa\*(FC[2]\*(FR, and so on.
+Subscripts
+\*(FIa\*(FC[\*(FIn\^\*(FC, "start"]\*(FR,
+and
+\*(FIa\*(FC[\*(FIn\^\*(FC, "length"]\*(FR
+provide the starting index in the string and length,
+respectively, of each matching substring.\*(CD
+.ti -.2i
+\*(CB\*(FCpatsplit(\*(FIs\*(FC, \*(FIa \*(FR[\*(FC, \*(FIr \*(CB\*(FR[\*(FC, \*(FIseps \*(FR] \*(FR] \*(FC)\*(FR
+.br
+Split the string
+\*(FIs\fP into the array \*(FIa\fP
+and the array \*(FIseps\fP of separator strings
+using the regular expression \*(FIr\*(FR,
+and return the number of fields.
+Element values are the portions of \*(FIs\fP that matched \*(FIr\fP.
+The value of \*(FIseps\*(FC[\*(FIi\^\fP]\*(FR is the separator that appeared in
+front of \*(FIa\*(FC[\*(FIi\fP+1]\*(FR.
+If \*(FIr\fP is omitted, use \*(FCFPAT\fP instead.
+Clear the arrays \*(FIa\fP and \*(FIseps\fP first.
+Splitting behaves identically to field splitting with \*(FCFPAT\fP.\*(CD
+.ti -.2i
+\*(FCsplit(\*(FIs\*(FC, \*(FIa \*(FR[\*(FC, \*(FIr \*(CB\*(FR[\*(FC, \*(FIseps \*(FR]\*(CD \*(FR] \*(FC)\*(FR
+.br
+Split the string
+\*(FIs\fP into the array \*(FIa\fP \*(CBand the array \*(FIseps\fP of separator strings\*(CD 
+using the regular expression \*(FIr\*(FR,
+and return the number of fields. If \*(FIr\fP is omitted, use \*(FCFS\fP
+instead.
+Clear the arrays \*(FIa\fP \*(CBand \*(FIseps\fP\*(CD first.
+Splitting behaves identically to field splitting.
+(See \fHFields\fP.)
+.ti -.2i
+\*(FCsprintf(\*(FIfmt\*(FC, \*(FIexpr-list\*(FC)\*(FR
+.br
+Print \*(FIexpr-list\fP
+according to \*(FIfmt\*(FR, and return the result.\*(CX
+.in -.2i
+.EB "\s+2\f(HBSTRING FUNCTIONS\*(FR\s0"
+
+.BT
+
+.\" --- Built-in String Functions
+.ES
+.fi
+.in +.2i
+.ti -.2i
+\*(CB\*(FCstrtonum(\*(FIs\*(FC)\*(FR
+.br
+Examine \*(FIs\*(FR, and return its numeric value.
+If \*(FIs\*(FR begins with a leading \*(FC0\*(FR,
+treat it as an octal number.
+If \*(FIs\*(FR begins with a leading \*(FC0x\*(FR
+or \*(FC0X\*(FR, treat
+\*(FIs\*(FR as a hexadecimal number. Otherwise,
+treat \*(FIs\*(FR as decimal.\*(CD
+.ti -.2i
+\*(FCsub(\*(FIr\*(FC, \*(FIs \*(FR[\*(FC, \*(FIt\*(FR]\*(FC)\*(FR
+.br
+Just like
+\*(FCgsub()\*(FR, but replace only the first matching substring.\*(CX
+.ti -.2i
+\*(CD\*(FCsubstr(\*(FIs\*(FC, \*(FIi \*(FR[\*(FC, \*(FIn\*(FR]\*(FC)\*(FR
+.br
+Return the at most
+\*(FIn\*(FR-character substring of \*(FIs\fP starting at \*(FIi\*(FR.
+If \*(FIn\fP is omitted, use the rest of \*(FIs\fP.
+.ti -.2i
+\*(FCtolower(\*(FIstr\*(FC)\*(FR
+.br
+Return a copy of the string \*(FIstr\*(FR,
+with all the uppercase characters in \*(FIstr\fP translated to their
+corresponding lowercase counterparts. Non-alphabetic characters are
+left unchanged.
+.ti -.2i
+\*(FCtoupper(\*(FIstr\*(FC)\*(FR
+.br
+Return a copy of the string \*(FIstr\*(FR,
+with all the lowercase characters in \*(FIstr\fP translated to their
+corresponding uppercase counterparts. Non-alphabetic characters are
+left unchanged.\*(CX
+.in -.2i
+.EB "\s+2\f(HBSTRING FUNCTIONS (continued)\*(FR\s0"
+.sp .6
+.\" --- Built-in Time Functions
+.ES
+.fi
+\*(CD\*(GK and \*(MK
+provide the following functions for obtaining time stamps and
+formatting them.
+.sp .5
+.fi
+.in +.2i
+.ti -.2i
+\*(FCmktime(\*(FIdatespec \*(CB\*(FR[\*(FC, \*(FIutc-flag\*(FR]\*(FC\*(CD)\*(FR
+.br
+Convert \*(FIdatespec\fP into a time
+stamp of the same form as returned by \*(FCsystime()\*(FR
+and return it.
+The \*(FIdatespec\fP is a string of the form
+\*(FC"\*(FIYYYY MM DD HH MM SS[ DST]\*(FC"\*(FR.
+\*(CBIf \*(FIutc-flag\*(FR
+is present and is non-zero or non-null, the result
+is in UTC, otherwise it is in local time.\*(CD
+.ti -.2i
+\*(FCstrftime(\*(FR[\*(FIformat \*(FR[\*(FC, \*(FItimestamp\*(FR[\*(FC, \*(FIutc-flag\*(FR]]]\*(FC)\*(FR
+.br
+Format \*(FItimestamp\fP
+according to the specification in \*(FIformat\*(FR. The
+\*(FItimestamp\fP should be of the same form as returned by
+\*(FCsystime()\*(FR.
+If \*(FIutc-flag\*(FR
+is present and is non-zero or non-null, the result
+is in UTC, otherwise it is in local time.
+If \*(FItimestamp\fP is missing, use the current time of day. If
+\*(FIformat\fP is missing, use \*(FCPROCINFO["strftime"]\fP.
+The default value is
+equivalent to the output
+of \*(FIdate\*(FR\^(1).
+.ti -.2i
+\*(FCsystime()\fP
+.br
+Return the current time of day as the number of
+seconds since the Epoch.\*(CL
+.in -.2i
+.EB "\s+2\f(HBTIME FUNCTIONS\*(FR\s0"
+.sp .6
+.\" --- Built-in Bit Manipulation Functions
+.ES
+.fi
+\*(CD\*(GK
+provides the following bit manipulation functions.
+.sp .5
+.fi
+.in +.2i
+.ti -.2i
+\*(FCand(\*(FIv1\*(FC, \*(FIv2\*(FR [\*(FC,\*(FR ... ]\*(FC)\*(FR
+.br
+Return the bitwise AND of the arguments.
+.ti -.2i
+\*(FCcompl(\*(FIval\*(FC)\*(FR
+.br
+Return the bitwise complement of
+\*(FIval\*(FR.
+.ti -.2i
+\*(FClshift(\*(FIval\*(FC, \*(FIcount\*(FC)\*(FR
+.br
+Return the value of \*(FIval\*(FR,
+shifted left by \*(FIcount\*(FR bits.
+.ti -.2i
+\*(FCor(\*(FIv1\*(FC, \*(FIv2\*(FR [\*(FC,\*(FR ... ]\*(FC)\*(FR
+.br
+Return the bitwise OR of the arguments.
+.ti -.2i
+\*(FCrshift(\*(FIval\*(FC, \*(FIcount\*(FC)\*(FR
+.br
+Return the value of \*(FIval\*(FR,
+shifted right by \*(FIcount\*(FR bits.
+.ti -.2i
+\*(FCxor(\*(FIv1\*(FC, \*(FIv2\*(FR [\*(FC,\*(FR ... ]\*(FC)\*(FR
+.br
+Return the bitwise XOR of the arguments.\*(CB
+.in -.2i
+.EB "\s+2\f(HBBIT MANIPULATION FUNCTIONS (\*(GK\f(HB)\*(FR\s0"
+.sp .6
+.\" --- Extensions
+.ES
+.fi
+.in +.2i
+.ti -.2i
+\*(CD\*(FC@load "\*(FIextension\*(FC"\*(FR
+.br
+Dynamically load the named \*(FIextension\*(FR.
+This adds new built-in functions to \*(GK.
+.\" The extension should use the API defined by the
+.\" \*(FCgawkapi.h\*(FR header file, as documented in
+.\" the full manual.
+The extension is loaded during the parsing of the program.
+See the manual for details.\*(CB
+.in -.2i
+.EB "\s+2\f(HBDYNAMIC EXTENSIONS (\*(GK\f(HB)\*(FR\s0"
+.BT
+
+.\" --- Type Functions
+.ES
+.fi
+.in +.2i
+.ti -.2i
+\*(CD\*(FCisarray(\*(FIx\*(FC)\*(FR
+.br
+Return true if \*(FIx\fP is an array, false otherwise.
+.br
+.ti -.2i
+\*(FCtypeof(\*(FIx\*(FC)\*(FR
+.br
+Return a string indicating the type of \*(FIx\fP.\*(CB
+.in -.2i
+.EB "\s+2\f(HBTYPE FUNCTIONS (\*(GK\f(HB)\*(FR\s0"
+.sp .5
+.\" --- Built-in Internationalization Functions
+.ES
+.fi
+\*(CD\*(GK
+provides the following functions for runtime message translation.
+.in +.2i
+.sp .5
+.ti -.2i
+\*(FCbindtextdomain(\*(FIdirectory \*(FR[\*(FC, \*(FIdomain\*(FR]\*(FC)\*(FR
+.br
+Specify the directory where \*(GK looks for the \*(FC\&.gmo\*(FR
+files, in case they
+will not or cannot be placed in the ``standard'' locations
+(e.g., during testing).
+Return the directory where \*(FIdomain\*(FR is ``bound.''
+.sp .5
+The default \*(FIdomain\*(FR is the value of \*(FCTEXTDOMAIN\*(FR.
+When \*(FIdirectory\*(FR is the null string (\*(FC"\^"\*(FR),
+\*(FCbindtextdomain()\*(FR returns the current binding for the
+given \*(FIdomain\*(FR.
+.ti -.2i
+\*(FCdcgettext(\*(FIstring \*(FR[\*(FC, \*(FIdomain \*(FR[\*(FC, \*(FIcategory\*(FR]]\*(FC)\*(FR
+.br
+Return the translation of \*(FIstring\*(FR in text domain
+\*(FIdomain\*(FR for locale category \*(FIcategory\*(FR.
+The default value for \*(FIdomain\*(FR is the current value of \*(FCTEXTDOMAIN\*(FR.
+The default value for \*(FIcategory\*(FR is \*(FC"LC_MESSAGES"\*(FR.
+.sp .5
+If you supply a value for \*(FIcategory\*(FR, it must be a string equal to
+one of the known locale categories.
+You must also supply a text domain.  Use \*(FCTEXTDOMAIN\*(FR
+to use the current domain.
+.ti -.2i
+\*(FCdcngettext(\*(FIstring1\*(FC, \*(FIstring2\*(FC, \*(FInumber\*(FR [\*(FC, \*(FIdom \*(FR[\*(FC, \*(FIcat\*(FR]]\*(FC)\*(FR
+.br
+Return the plural form used for \*(FInumber\*(FR of the translation of
+\*(FIstring1\*(FR and \*(FIstring2\*(FR in text domain
+\*(FIdom\*(FR for locale category \*(FIcat\*(FR.
+The default value for \*(FIdom\*(FR is the current value of \*(FCTEXTDOMAIN\*(FR.
+The default for \*(FIcat\*(FR is \*(FC"LC_MESSAGES"\*(FR.
+.sp .5
+If you supply a value for \*(FIcat\*(FR, it must be a string equal to
+one of the known locale categories.
+You must also supply a text domain.  Use \*(FCTEXTDOMAIN\*(FR
+to use the current domain.\*(CB
+.in -.2i
+.EB "\s+2\f(HBINTERNATIONALIZATION (\*(GK\f(HB)\*(FR\s0"
+.sp .5
+.\" --- FTP/HTTP/GIT Information
+.ES
+.nf
+\*(CDHost: \*(FCftp.gnu.org\*(FR
+File: \*(FC/gnu/gawk/gawk-5.0.1:tar.gz\fP
+.in +.2i
+.fi
+GNU \*(AK (\*(GK). There may be a later version.
+.in -.2i
+.nf
+.sp .4
+.\" http://www.cs.princeton.edu/~bwk/btl.mirror/
+.\" awk.tar.gz
+.\" .br
+\*(FCgit clone git://github.com/onetrueawk/awk\fP
+.in +.2i
+.fi
+\*(NK. This version requires an ANSI C compiler;
+GCC (the GNU Compiler Collection) works well.
+.in -.2i
+.nf
+.sp .4
+Host: \*(FCinvisible-island.net\*(FR
+File: \*(FC/mawk/mawk.tar.gz\fP
+.in +.2i
+.fi
+Michael Brennan's \*(MK. Thomas Dickey now
+maintains it.\*(CX
+.in -.2i
+.EB "\s+2\f(HBFTP/HTTP/GIT INFORMATION\*(FR\s0"
+.sp .5
+.\" --- Copying Permissions
+.ES
+.fi
+\*(CDCopyright \(co 1996\(en2005,
+2007, 2009\(en2019 Free Software Foundation, Inc.
+.sp .5   
+Permission is granted to make and distribute verbatim copies of this
+reference card provided the copyright notice and this permission notice
+are preserved on all copies.
+.sp .5
+Permission is granted to copy and distribute modified versions of this
+reference card under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.sp .5
+Permission is granted to copy and distribute translations of this
+reference card into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in a
+translation approved by the Foundation.\*(CX
+.EB "\s+2\f(HBCOPYING PERMISSIONS\*(FR\s0"
+.\" Need the BT here to get the final page number
+
+.ig
+.ES
+\*(CX
+.sp 10
+.EB "\s+2\f(HBNOTES\*(FR\s0"
+..
+
+.BT
diff --git a/gawk-5.0.1/doc/awkforai.txt b/gawk-5.0.1/doc/awkforai.txt
new file mode 100644
index 00000000000..2908da56c1c
--- /dev/null
+++ b/gawk-5.0.1/doc/awkforai.txt
@@ -0,0 +1,18 @@
+Sun Dec  9 11:58:23 IST 2012
+============================
+
+The original of this file was a draft of an article written in 1996 by
+Ronald P. Lui for an ACM Sigplan publication, explaining why he used
+gawk for teaching introductory Artificial Intelligence courses.
+
+Since it was not clear as to copying permissions and so on, it has been
+removed from the gawk distribution.
+
+A quick web search shows that this same draft is available at
+http://www.cs.wustl.edu/~loui/sigplan and the final article is available
+from the ACM: http://dl.acm.org/citation.cfm?id=242908
+
+The article itself is recommended reading.
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/doc/bc_notes b/gawk-5.0.1/doc/bc_notes
new file mode 100644
index 00000000000..b548cec5076
--- /dev/null
+++ b/gawk-5.0.1/doc/bc_notes
@@ -0,0 +1,323 @@
+Op Codes
+========
+	Op_illegal,   /* illegal entry == 0 */
+
+	/* binary operators */
+	Op_times,
+	Op_times_i,		all _i operators here are used to optimise arithmetic 
+	Op_quotient,		 by converting push, push , op to just push, op_i
+	Op_quotient_i, 
+	Op_mod,
+	Op_mod_i,
+	Op_plus,
+	Op_plus_i,
+	Op_minus,
+	Op_minus_i,
+	Op_exp,
+	Op_exp_i,
+	Op_concat,
+
+	/* line range instruction pairs */
+	Op_line_range,		/* flags for Op_cond_pair */
+	Op_cond_pair,		/* conditional pair */
+
+	Op_subscript,		calculate array subscript
+
+	/* unary operators */
+	Op_preincrement,
+	Op_predecrement,
+	Op_postincrement,
+	Op_postdecrement,
+	Op_unary_minus,
+	Op_field_spec,		usage: push #, field_spec -> $#
+
+	/* unary relationals */
+	Op_not,
+
+	/* assignments */
+	Op_assign,		simple assign
+	Op_assign_times,	*= etc
+	Op_assign_quotient,
+	Op_assign_mod,
+	Op_assign_plus,
+	Op_assign_minus,
+	Op_assign_exp,
+	Op_assign_concat,	optimised concatenation
+
+	/* boolean binaries */
+	Op_and,			/* a left subexpression in && */
+	Op_and_final,	/* right subexpression of && */
+	Op_or,
+	Op_or_final,
+
+	/* binary relationals */
+	Op_equal,
+	Op_notequal,
+	Op_less,
+	Op_greater,
+	Op_leq,
+	Op_geq,
+	Op_match,
+	Op_match_rec,			/* match $0 */
+	Op_nomatch,
+
+	Op_rule,
+
+	/* keywords */
+	Op_K_case,
+	Op_K_default,
+	Op_K_break,
+	Op_K_continue,
+	Op_K_print,
+	Op_K_print_rec,
+	Op_K_printf,
+	Op_K_next,
+	Op_K_exit,
+	Op_K_return,
+	Op_K_delete,
+	Op_K_delete_loop,
+	Op_K_getline,
+	Op_K_nextfile,
+
+	Op_builtin,
+	Op_in_array,	/* boolean test of membership in array */
+
+	/* function call instruction pairs */
+	Op_func_call,
+
+	Op_push,		/* variable */
+	Op_push_i,		/* number, string */
+	Op_push_re,		/* regex */
+	Op_push_array,
+	Op_push_param,
+	Op_push_lhs,		var assignment 
+	Op_subscript_lhs,	array assignment
+	Op_field_spec_lhs,	field assignment
+	Op_no_op,		/* jump target */
+	Op_pop,   		/* pop an item from the runtime stack */
+	Op_jmp,
+	Op_jmp_true,
+	Op_jmp_false,
+	Op_push_loop,		/* break (continue) target for loop */
+	Op_pop_loop,		end of loop
+	Op_get_record,		read next input line
+	Op_newfile,		open next input file
+	Op_arrayfor_init,	initialise array for loop
+	Op_arrayfor_incr,	next in array for loop
+	Op_arrayfor_final,	end of array loop
+
+	Op_var_update,		/* update value of NR, NF or FNR */
+	Op_var_assign,
+	Op_field_assign,
+
+	Op_ext_func,
+	Op_func,
+
+	Op_exec_count,		debugging etc
+	Op_breakpoint,
+	Op_lint,
+	Op_exit,		/* end of instructions, contains final exit value */
+
+	/*--------- end proper opcodes -------*/
+
+	/* program structures */
+	Op_K_do,
+	Op_K_for,			
+	Op_K_arrayfor,
+	Op_K_while,
+	Op_K_switch,
+	Op_K_if,
+	Op_K_else,
+	Op_K_function,
+	Op_cond_exp,
+	Op_list,
+	Op_case_list,
+
+	/* I/O redirection for print statements */
+	Op_redirect_output,
+	Op_redirect_append,
+	Op_redirect_pipe,
+	Op_redirect_pipein,
+	Op_redirect_input,
+	Op_redirect_twoway,
+
+	Op_final			/* sentry value, not legal */
+
+
+INSTRUCTIONs
+============
+
+typedef struct exp_instruction {
+        struct exp_instruction *nexti;
+        union {
+                NODE *dn;
+                struct exp_instruction *di;
+                NODE *(*fptr) P((int));
+                long dl;
+                char *name;
+        } d;
+
+        union {
+                long  xl;
+                NODE *xn;
+                void (*aptr) P((void));
+                struct exp_instruction *xi;
+                struct break_point *bpt;
+        } x;
+
+        short source_line;
+        OPCODE opcode;
+} INSTRUCTION;
+
+#define lextok          d.name
+#define func_name       d.name
+
+#define memory          d.dn
+#define builtin         d.fptr
+#define builtin_idx     d.dl
+
+#define expr_count      x.xl
+
+#define target_continue d.di
+#define target_jmp      d.di
+#define target_break    x.xi
+
+/* Op_rule */
+#define in_rule         x.xl
+#define source_file     d.name
+
+/* Op_K_case, Op_K_default */
+#define target_stmt     x.xi
+
+/* Op_case_list, Op_K_switch */
+#define case_val        d.di
+#define case_stmt       x.xi
+#define switch_dflt     x.xi
+#define switch_body     d.di    /* pretty printing and profiling */
+
+/* Op_K_exit  */
+#define target_exit     x.xi
+
+/* Op_exit */
+#define exit_value      d.dl
+
+/* Op_K_getline */
+#define into_var        x.xl
+
+/* Op_K_getline, Op_K_print, Op_K_print_rec, Op_K_printf */
+#define redir_type      d.dl
+
+/* Op_arrayfor_incr     */
+#define array_var       x.xn
+
+/* Op_line_range */
+#define triggered       x.xl
+
+/* Op_cond_pair */
+#define line_range      x.xi
+
+/* Op_func_call, Op_func */
+#define func_body       x.xn
+
+/* Op_subscript */
+#define sub_count       d.dl
+
+/* Op_push_lhs, Op_subscript_lhs, Op_field_spec_lhs */
+#define do_reference    x.xl
+
+/* Op_list, Op_rule, Op_func */
+#define lasti           d.di
+#define firsti          x.xi
+
+/* Op_rule, Op_func */
+#define last_line       x.xl
+#define first_line      source_line
+
+/* Op_lint */
+#define lint_type       d.dl
+
+/* Op_field_spec_lhs */
+#define target_assign   d.di
+
+/* Op_field_assign */
+#define field_assign    x.aptr
+
+/* Op_concat */
+#define var_concat          d.dl
+
+/* Op_breakpoint */
+#define break_pt        x.bpt
+
+/*------------------ pretty printing/profiling --------*/
+
+/* Op_exec_count */
+#define exec_count      d.dl
+
+/* Op_K_while */
+#define while_body      d.di
+
+/* Op_K_do */
+#define doloop_cond     d.di
+
+/* Op_K_for */
+#define forloop_cond    d.di
+#define forloop_body    x.xi
+
+/* Op_K_if */
+#define branch_if       d.di
+#define branch_else     x.xi
+
+/* Op_K_else */
+#define branch_end      x.xi
+
+/* Op_line_range */
+#define condpair_left   d.di
+#define condpair_right  x.xi
+
+Programs consist of a list of INSTRUCTIONs linked by nexti pointers.
+Each source statement generates a list of INSTRUCTIONs which are then in turn linked to create the program list.
+
+The list for a given source statement is delimited by the lasti (last INSTRUCTION) pointer.
+(The first INSTRUCTION in any rule is identified by the firsti pointer. This is only used in profiling (I think).)
+
+Each INSTRUCTION can be linked to a NODE via the d.dn (memory) pointer.
+
+The BEGIN rule(s) are prepended to the program list and the END rule(s) are appended to complete the program build process.
+
+At run-time, the "virtual machine" walks the program list using the nexti pointers.
+
+The list_xxx functions are used to create and manipulate these INSTRUCTION lists.
+
+list_create creates an INSTRUCTION with opcode Op_list and nexti and lasti pointers pointing to itself (an empty list).
+
+list_append adds a single INSTRUCTION to the end of an existing list and list_prepend does the same at the start of an existing list.
+list_merge adds one list to the end of another (and frees the "header" INSTRUCTION of the added list);
+
+The list_append, list_prepend and list_merge functions reset the nexti and lasti pointers as needed.
+
+
+
+Run-time Stack
+==============
+
+Stack is allocated in eval.c line 1040 with an initial 256 (NODE) entries.
+If this stack fills, additional blocks of 256 entries are added.
+
+The various push operators add NODE entries to the stack for processing by subsequent operators.
+Once a stack variable is used and no longer required, it is popped off and (if temporary) freed.
+Current stack position is in stack_ptr.
+
+Most operators (eg builtin functions) expect all of their "arguments" to be on the stack.
+Some operators (eg Op_plus_i etc) expect one operand on the stack and another in the NODE linked to the 
+operator via the d.dn (memory) pointer.
+
+
+Debugger
+========
+The dgawk debugger usage is described in README.DGAWK. I suggest that we make -DBCDEBUG a default setting (or remove the ifdefs)
+so that the dump and trace commands are always available.
+
+dgawk operates in exactly the same way as gawk except that it offers the ability to dump the program list, to step through the program list, to set breakpoints and to view variables etc.
+
+dgawk uses exactly the same "virtual machine" as gawk so the results are identical. The only difference is that dgawk checks to see if any debug action is required before executing each INSTRUCTION.
+
diff --git a/gawk-5.0.1/doc/cardfonts b/gawk-5.0.1/doc/cardfonts
new file mode 100644
index 00000000000..0f528e1347d
--- /dev/null
+++ b/gawk-5.0.1/doc/cardfonts
@@ -0,0 +1,37 @@
+.\" AWK Reference Card --- Arnold Robbins, arnold@skeeve.com
+.\" cardfonts --- this file sets the fonts to use for the reference card
+.\"
+.\" Copyright (C) 1996 Free Software Foundation, Inc.
+.\" 
+.\" Permission is granted to make and distribute verbatim copies of
+.\" this reference card provided the copyright notice and this permission
+.\" notice are preserved on all copies.
+.\" 
+.\" Permission is granted to process this file through troff and print the
+.\" results, provided the printed document carries copying permission
+.\" notice identical to this one except for the removal of this paragraph
+.\" (this paragraph not being relevant to the printed reference card).
+.\" 
+.\" Permission is granted to copy and distribute modified versions of this
+.\" reference card under the conditions for verbatim copying, provided that
+.\" the entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\" 
+.\" Permission is granted to copy and distribute translations of this
+.\" reference card into another language, under the above conditions for
+.\" modified versions, except that this permission notice may be stated in
+.\" a translation approved by the Foundation.
+.\"
+.ig
+Strings for inline font change.
+FR - font roman
+FI - font italic
+FC - font courier
+..
+.ds FR \fR
+.ds FI \fI
+.ds FC \f(CB
+.ds RN Times Roman
+.ds IN Times Italic
+.ds CN Courier Bold
+.ds AM \fIGAWK: Effective AWK Programming\fP
diff --git a/gawk-5.0.1/doc/colors b/gawk-5.0.1/doc/colors
new file mode 100644
index 00000000000..97dbff76950
--- /dev/null
+++ b/gawk-5.0.1/doc/colors
@@ -0,0 +1,39 @@
+.\" AWK Reference Card --- Arnold Robbins, arnold@skeeve.com
+.\" This file sets the colors to use.
+.\"
+.\" Copyright (C) 1996,97,99 Free Software Foundation, Inc.
+.\" 
+.\" Permission is granted to make and distribute verbatim copies of
+.\" this reference card provided the copyright notice and this permission
+.\" notice are preserved on all copies.
+.\" 
+.\" Permission is granted to process this file through troff and print the
+.\" results, provided the printed document carries copying permission
+.\" notice identical to this one except for the removal of this paragraph
+.\" (this paragraph not being relevant to the printed reference card).
+.\" 
+.\" Permission is granted to copy and distribute modified versions of this
+.\" reference card under the conditions for verbatim copying, provided that
+.\" the entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\" 
+.\" Permission is granted to copy and distribute translations of this
+.\" reference card into another language, under the above conditions for
+.\" modified versions, except that this permission notice may be stated in
+.\" a translation approved by the Foundation.
+.\"
+.ig
+Strings for inline color change.
+CR - color red
+CG - color green
+CL - color light blue
+CB - color blue
+CD - color dark, i.e. black
+CX - color boX, i.e. for the surrounding boxes (red for now)
+..
+.ds CR \X'ps: exec 0 .96 .65 0 setcmykcolor'
+.ds CG \X'ps: exec 1.0 0 .51 .43 setcmykcolor'
+.ds CL \X'ps: exec .69 .34 0 0 setcmykcolor'
+.ds CB \X'ps: exec 1 .72 0 .06 setcmykcolor'
+.ds CD \X'ps: exec 1 1 1 1 setcmykcolor'
+.ds CX \*(CG
diff --git a/gawk-5.0.1/doc/gawk.1 b/gawk-5.0.1/doc/gawk.1
new file mode 100644
index 00000000000..de613aa90bb
--- /dev/null
+++ b/gawk-5.0.1/doc/gawk.1
@@ -0,0 +1,4299 @@
+.ds PX \s-1POSIX\s+1
+.ds UX \s-1UNIX\s+1
+.ds GN \s-1GNU\s+1
+.ds AK \s-1AWK\s+1
+.ds EP \fIGAWK: Effective AWK Programming\fP
+.if !\n(.g \{\
+.	if !\w|\*(lq| \{\
+.		ds lq ``
+.		if \w'\(lq' .ds lq "\(lq
+.	\}
+.	if !\w|\*(rq| \{\
+.		ds rq ''
+.		if \w'\(rq' .ds rq "\(rq
+.	\}
+.\}
+.TH GAWK 1 "May 22 2019" "Free Software Foundation" "Utility Commands"
+.SH NAME
+gawk \- pattern scanning and processing language
+.SH SYNOPSIS
+.B gawk
+[ \*(PX or \*(GN style options ]
+.B \-f
+.I program-file
+[
+.B \-\^\-
+] file .\|.\|.
+.br
+.B gawk
+[ \*(PX or \*(GN style options ]
+[
+.B \-\^\-
+]
+.I program-text
+file .\|.\|.
+.SH DESCRIPTION
+.I Gawk
+is the \*(GN Project's implementation of the \*(AK programming language.
+It conforms to the definition of the language in
+the \*(PX 1003.1 standard.
+This version in turn is based on the description in
+.IR "The AWK Programming Language" ,
+by Aho, Kernighan, and Weinberger.
+.I Gawk
+provides the additional features found in the current version
+of Brian Kernighan's
+.I awk
+and numerous \*(GN-specific extensions.
+.PP
+The command line consists of options to
+.I gawk
+itself, the \*(AK program text (if not supplied via the
+.B \-f
+or
+.B \-\^\-include
+options), and values to be made
+available in the
+.B ARGC
+and
+.B ARGV
+pre-defined \*(AK variables.
+.PP
+When
+.I gawk
+is invoked with the
+.B \-\^\-profile
+option, it starts gathering profiling statistics
+from the execution of the program.
+.I Gawk
+runs more slowly in this mode, and automatically produces an execution
+profile in the file
+.B awkprof.out
+when done.
+See the
+.B \-\^\-profile
+option, below.
+.PP
+.I Gawk
+also has an integrated debugger. An interactive debugging session can
+be started by supplying the
+.B \-\^\-debug
+option to the command line. In this mode of execution,
+.I gawk
+loads the
+AWK source code and then prompts for debugging commands.
+.I Gawk
+can only debug AWK program source provided with the
+.B \-f
+and
+.B \-\^\-include
+options.
+The debugger is documented in \*(EP.
+.SH OPTION FORMAT
+.PP
+.I Gawk
+options may be either traditional \*(PX-style one letter options,
+or \*(GN-style long options.  \*(PX options start with a single \*(lq\-\*(rq,
+while long options start with \*(lq\-\^\-\*(rq.
+Long options are provided for both \*(GN-specific features and
+for \*(PX-mandated features.
+.PP
+.IR Gawk -specific
+options are typically used in long-option form.
+Arguments to long options are either joined with the option
+by an
+.B =
+sign, with no intervening spaces, or they may be provided in the
+next command line argument.
+Long options may be abbreviated, as long as the abbreviation
+remains unique.
+.PP
+Additionally, every long option has a corresponding short
+option, so that the option's functionality may be used from
+within
+.B #!
+executable scripts.
+.SH OPTIONS
+.PP
+.I Gawk
+accepts the following options.
+Standard options are listed first, followed by options for
+.I gawk
+extensions, listed alphabetically by short option.
+.TP
+.PD 0
+.BI \-f " program-file"
+.TP
+.PD
+.BI \-\^\-file " program-file"
+Read the \*(AK program source from the file
+.IR program-file ,
+instead of from the first command line argument.
+Multiple
+.B \-f
+(or
+.BR \-\^\-file )
+options may be used.
+Files read with
+.B \-f
+are treated as if they begin with an implicit \fB@namespace "awk"\fR statement.
+.TP
+.PD 0
+.BI \-F " fs"
+.TP
+.PD
+.BI \-\^\-field-separator " fs"
+Use
+.I fs
+for the input field separator (the value of the
+.B FS
+predefined
+variable).
+.TP
+.PD 0
+\fB\-v\fI var\fB\^=\^\fIval\fR
+.TP
+.PD
+\fB\-\^\-assign \fIvar\fB\^=\^\fIval\fR
+Assign the value
+.I val
+to the variable
+.IR var ,
+before execution of the program begins.
+Such variable values are available to the
+.B BEGIN
+rule of an \*(AK program.
+.TP
+.PD 0
+.B \-b
+.TP
+.PD
+.B \-\^\-characters\-as\-bytes
+Treat all input data as single-byte characters. In other words,
+don't pay any attention to the locale information when attempting to
+process strings as multibyte characters.
+The
+.B "\-\^\-posix"
+option overrides this one.
+.bp
+.TP
+.PD 0
+.B \-c
+.TP
+.PD
+.B \-\^\-traditional
+Run in
+.I compatibility
+mode.  In compatibility mode,
+.I gawk
+behaves identically to Brian Kernighan's
+.IR awk ;
+none of the \*(GN-specific extensions are recognized.
+.\" The use of
+.\" .B \-\^\-traditional
+.\" is preferred over the other forms of this option.
+See
+.BR "GNU EXTENSIONS" ,
+below, for more information.
+.TP
+.PD 0
+.B \-C
+.TP
+.PD
+.B \-\^\-copyright
+Print the short version of the \*(GN copyright information message on
+the standard output and exit successfully.
+.TP
+.PD 0
+\fB\-d\fR[\fIfile\fR]
+.TP
+.PD
+\fB\-\^\-dump-variables\fR[\fB=\fIfile\fR]
+Print a sorted list of global variables, their types and final values to
+.IR file .
+If no
+.I file
+is provided,
+.I gawk
+uses a file named
+.B awkvars.out
+in the current directory.
+.sp .5
+Having a list of all the global variables is a good way to look for
+typographical errors in your programs.
+You would also use this option if you have a large program with a lot of
+functions, and you want to be sure that your functions don't
+inadvertently use global variables that you meant to be local.
+(This is a particularly easy mistake to make with simple variable
+names like
+.BR i ,
+.BR j ,
+and so on.)
+.TP
+.PD 0
+\fB\-D\fR[\fIfile\fR]
+.TP
+.PD
+\fB\-\^\-debug\fR[\fB=\fIfile\fR]
+Enable debugging of \*(AK programs.
+By default, the debugger reads commands interactively from the keyboard
+(standard input).
+The optional
+.I file
+argument specifies a file with a list
+of commands for the debugger to execute non-interactively.
+.TP
+.PD 0
+.BI "\-e " program-text
+.TP
+.PD
+.BI \-\^\-source " program-text"
+Use
+.I program-text
+as \*(AK program source code.
+This option allows the easy intermixing of library functions (used via the
+.B \-f
+and
+.B \-\^\-include
+options) with source code entered on the command line.
+It is intended primarily for medium to large \*(AK programs used
+in shell scripts.
+Each argument supplied via
+.B \-e
+is treated as if it begins with an implicit \fB@namespace "awk"\fR statement.
+.TP
+.PD 0
+.BI "\-E " file
+.TP
+.PD
+.BI \-\^\-exec " file"
+Similar to
+.BR \-f ,
+however, this is option is the last one processed.
+This should be used with
+.B #!
+scripts, particularly for CGI applications, to avoid
+passing in options or source code (!) on the command line
+from a URL.
+This option disables command-line variable assignments.
+.TP
+.PD 0
+.B \-g
+.TP
+.PD
+.B \-\^\-gen\-pot
+Scan and parse the \*(AK program, and generate a \*(GN
+.B \&.pot
+(Portable Object Template)
+format file on standard output with entries for all localizable
+strings in the program.  The program itself is not executed.
+See the \*(GN
+.I gettext
+distribution for more information on
+.B \&.pot
+files.
+.TP
+.PD 0
+.B \-h
+.TP
+.PD
+.B \-\^\-help
+Print a relatively short summary of the available options on
+the standard output.
+(Per the
+.IR "GNU Coding Standards" ,
+these options cause an immediate, successful exit.)
+.TP
+.PD 0
+.BI "\-i " include-file
+.TP
+.PD
+.BI \-\^\-include " include-file"
+Load an awk source library.
+This searches for the library using the
+.B AWKPATH
+environment variable.  If the initial search fails, another attempt will
+be made after appending the
+.B \&.awk
+suffix.  The file will be loaded only
+once (i.e., duplicates are eliminated), and the code does not constitute
+the main program source.
+Files read with
+.B \-\^\-include
+are treated as if they begin with an implicit \fB@namespace "awk"\fR statement.
+.TP
+.PD 0
+.BI "\-l " lib
+.TP
+.PD
+.BI \-\^\-load " lib"
+Load a
+.I gawk
+extension from the shared library
+.IR lib .
+This searches for the library using the
+.B AWKLIBPATH
+environment variable.  If the initial search fails, another attempt will
+be made after appending the default shared library suffix for the platform.
+The library initialization routine is expected to be named
+.BR dl_load() .
+.TP
+.PD 0
+.BR "\-L " [ \fIvalue\fR ]
+.TP
+.PD
+.BR \-\^\-lint [ =\fIvalue\fR ]
+Provide warnings about constructs that are
+dubious or non-portable to other \*(AK implementations.
+With an optional argument of
+.BR fatal ,
+lint warnings become fatal errors.
+This may be drastic, but its use will certainly encourage the
+development of cleaner \*(AK programs.
+With an optional argument of
+.BR invalid ,
+only warnings about things that are
+actually invalid are issued. (This is not fully implemented yet.)
+With an optional argument of
+.BR no-ext ,
+warnings about
+.I gawk
+extensions are disabled.
+.TP
+.PD 0
+.B \-M
+.TP
+.PD
+.B \-\^\-bignum
+Force arbitrary precision arithmetic on numbers. This option has
+no effect if
+.I gawk
+is not compiled to use the GNU MPFR and GMP libraries.
+(In such a case,
+.I gawk
+issues a warning.)
+.TP
+.PD 0
+.B \-n
+.TP
+.PD
+.B "\-\^\-non\-decimal\-data"
+Recognize octal and hexadecimal values in input data.
+.I "Use this option with great caution!"
+.TP
+.PD 0
+.B \-N
+.TP
+.PD
+.B \-\^\-use\-lc\-numeric
+Force
+.I gawk
+to use the locale's decimal point character when parsing input data.
+Although the POSIX standard requires this behavior, and
+.I gawk
+does so when
+.B \-\^\-posix
+is in effect, the default is to follow traditional behavior and use a
+period as the decimal point, even in locales where the period is not the
+decimal point character.  This option overrides the default behavior,
+without the full draconian strictness of the
+.B \-\^\-posix
+option.
+.ig
+.\" This option is left undocumented, on purpose.
+.TP
+.PD 0
+.B "\-W nostalgia"
+.TP
+.PD
+.B \-\^\-nostalgia
+Provide a moment of nostalgia for long time
+.I awk
+users.
+..
+.TP
+.PD 0
+\fB\-o\fR[\fIfile\fR]
+.TP
+.PD
+\fB\-\^\-pretty-print\fR[\fB=\fIfile\fR]
+Output a pretty printed version of the program to
+.IR file .
+If no
+.I file
+is provided,
+.I gawk
+uses a file named
+.B awkprof.out
+in the current directory.
+This option implies
+.BR \-\^\-no\-optimize .
+.TP
+.PD 0
+.B \-O
+.TP
+.PD
+.B \-\^\-optimize
+Enable
+.IR gawk 's
+default optimizations upon the internal representation of the program.
+Currently, this just includes simple constant folding.
+This option is on by default.
+.TP
+.PD 0
+\fB\-p\fR[\fIprof-file\fR]
+.TP
+.PD
+\fB\-\^\-profile\fR[\fB=\fIprof-file\fR]
+Start a profiling session, and send the profiling data to
+.IR prof-file .
+The default is
+.BR awkprof.out .
+The profile contains execution counts of each statement in the program
+in the left margin and function call counts for each user-defined function.
+This option implies
+.BR \-\^\-no\-optimize .
+.TP
+.PD 0
+.B \-P
+.TP
+.PD
+.B \-\^\-posix
+This turns on
+.I compatibility
+mode, with the following additional restrictions:
+.RS
+.TP "\w'\(bu'u+1n"
+\(bu
+.B \ex
+escape sequences are not recognized.
+.TP
+\(bu
+You cannot continue lines after
+.B ?
+and
+.BR : .
+.TP
+\(bu
+The synonym
+.B func
+for the keyword
+.B function
+is not recognized.
+.TP
+\(bu
+The operators
+.B **
+and
+.B **=
+cannot be used in place of
+.B ^
+and
+.BR ^= .
+.RE
+.TP
+.PD 0
+.B \-r
+.TP
+.PD
+.B \-\^\-re\-interval
+Enable the use of
+.I "interval expressions"
+in regular expression matching
+(see
+.BR "Regular Expressions" ,
+below).
+Interval expressions were not traditionally available in the
+\*(AK language.  The \*(PX standard added them, to make
+.I awk
+and
+.I egrep
+consistent with each other.
+They are enabled by default, but this option remains for use together with
+.BR \-\^\-traditional .
+.TP
+.PD 0
+.B \-s
+.TP
+.PD
+.B \-\^\-no\-optimize
+Disable
+.IR gawk 's
+default optimizations upon the internal representation of the program.
+.TP
+.PD 0
+.B \-S
+.TP
+.PD
+.B \-\^\-sandbox
+Run
+.I gawk
+in sandbox mode, disabling the
+.B system()
+function, input redirection with
+.BR getline ,
+output redirection with
+.BR print " and " printf ,
+and loading dynamic extensions.
+Command execution (through pipelines) is also disabled.
+This effectively blocks a script from accessing local resources,
+except for the files specified on the command line.
+.TP
+.PD 0
+.B \-t
+.TP
+.PD
+.B \-\^\-lint\-old
+Provide warnings about constructs that are
+not portable to the original version of \*(UX
+.IR awk .
+.TP
+.PD 0
+.B \-V
+.TP
+.PD
+.B \-\^\-version
+Print version information for this particular copy of
+.I gawk
+on the standard output.
+This is useful mainly for knowing if the current copy of
+.I gawk
+on your system
+is up to date with respect to whatever the Free Software Foundation
+is distributing.
+This is also useful when reporting bugs.
+(Per the
+.IR "GNU Coding Standards" ,
+these options cause an immediate, successful exit.)
+.TP
+.B \-\^\-
+Signal the end of options. This is useful to allow further arguments to the
+\*(AK program itself to start with a \*(lq\-\*(rq.
+This provides consistency with the argument parsing convention used
+by most other \*(PX programs.
+.PP
+In compatibility mode,
+any other options are flagged as invalid, but are otherwise ignored.
+In normal operation, as long as program text has been supplied, unknown
+options are passed on to the \*(AK program in the
+.B ARGV
+array for processing.  This is particularly useful for running \*(AK
+programs via the
+.B #!
+executable interpreter mechanism.
+.PP
+For \*(PX compatibility, the
+.B \-W
+option may be used, followed by the name of a long option.
+.SH AWK PROGRAM EXECUTION
+.PP
+An \*(AK program consists of a sequence of
+optional directives,
+pattern-action statements,
+and optional function definitions.
+.RS
+.PP
+\fB@include "\fIfilename\^\fB"
+.br
+\fB@load "\fIfilename\^\fB"
+.br
+\fB@namespace "\fIname\^\fB"
+.br
+\fIpattern\fB	{ \fIaction statements\fB }\fR
+.br
+\fBfunction \fIname\fB(\fIparameter list\fB) { \fIstatements\fB }\fR
+.RE
+.PP
+.I Gawk
+first reads the program source from the
+.IR program-file (s)
+if specified,
+from arguments to
+.BR \-\^\-source ,
+or from the first non-option argument on the command line.
+The
+.B \-f
+and
+.B \-\^\-source
+options may be used multiple times on the command line.
+.I Gawk
+reads the program text as if all the
+.IR program-file s
+and command line source texts
+had been concatenated together.  This is useful for building libraries
+of \*(AK functions, without having to include them in each new \*(AK
+program that uses them.  It also provides the ability to mix library
+functions with command line programs.
+.PP
+In addition, lines beginning with
+.B @include
+may be used to include other source files into your program,
+making library use even easier.  This is equivalent
+to using the
+.B \-\^\-include
+option.
+.PP
+Lines beginning with
+.B @load
+may be used to load extension functions into your program.  This is equivalent
+to using the
+.B \-\^\-load
+option.
+.PP
+The environment variable
+.B AWKPATH
+specifies a search path to use when finding source files named with
+the
+.B \-f
+and
+.B \-\^\-include
+options.  If this variable does not exist, the default path is
+\fB".:/usr/local/share/awk"\fR.
+(The actual directory may vary, depending upon how
+.I gawk
+was built and installed.)
+If a file name given to the
+.B \-f
+option contains a \*(lq/\*(rq character, no path search is performed.
+.PP
+The environment variable
+.B AWKLIBPATH
+specifies a search path to use when finding source files named with
+the
+.B \-\^\-load
+option.  If this variable does not exist, the default path is
+\fB"/usr/local/lib/gawk"\fR.
+(The actual directory may vary, depending upon how
+.I gawk
+was built and installed.)
+.PP
+.I Gawk
+executes \*(AK programs in the following order.
+First,
+all variable assignments specified via the
+.B \-v
+option are performed.
+Next,
+.I gawk
+compiles the program into an internal form.
+Then,
+.I gawk
+executes the code in the
+.B BEGIN
+rule(s) (if any),
+and then proceeds to read
+each file named in the
+.B ARGV
+array (up to
+.BR ARGV[ARGC\-1] ).
+If there are no files named on the command line,
+.I gawk
+reads the standard input.
+.PP
+If a filename on the command line has the form
+.IB var = val
+it is treated as a variable assignment.  The variable
+.I var
+will be assigned the value
+.IR val .
+(This happens after any
+.B BEGIN
+rule(s) have been run.)
+Command line variable assignment
+is most useful for dynamically assigning values to the variables
+\*(AK uses to control how input is broken into fields and records.
+It is also useful for controlling state if multiple passes are needed over
+a single data file.
+.PP
+If the value of a particular element of
+.B ARGV
+is empty (\fB""\fR),
+.I gawk
+skips over it.
+.PP
+For each input file,
+if a
+.B BEGINFILE
+rule exists,
+.I gawk
+executes the associated code
+before processing the contents of the file. Similarly,
+.I gawk
+executes
+the code associated with
+.B ENDFILE
+after processing the file.
+.PP
+For each record in the input,
+.I gawk
+tests to see if it matches any
+.I pattern
+in the \*(AK program.
+For each pattern that the record matches,
+.I gawk
+executes the associated
+.IR action .
+The patterns are tested in the order they occur in the program.
+.PP
+Finally, after all the input is exhausted,
+.I gawk
+executes the code in the
+.B END
+rule(s) (if any).
+.SS Command Line Directories
+.PP
+According to POSIX, files named on the
+.I awk
+command line must be
+text files.  The behavior is ``undefined'' if they are not.  Most versions
+of
+.I awk
+treat a directory on the command line as a fatal error.
+.PP
+Starting with version 4.0 of
+.IR gawk ,
+a directory on the command line
+produces a warning, but is otherwise skipped.  If either of the
+.B \-\^\-posix
+or
+.B \-\^\-traditional
+options is given, then
+.I gawk
+reverts to
+treating directories on the command line as a fatal error.
+.SH VARIABLES, RECORDS AND FIELDS
+\*(AK variables are dynamic; they come into existence when they are
+first used.  Their values are either floating-point numbers or strings,
+or both,
+depending upon how they are used.
+Additionally,
+.I gawk
+allows variables to have regular-expression type.
+\*(AK also has one dimensional
+arrays; arrays with multiple dimensions may be simulated.
+.I Gawk
+provides true arrays of arrays; see
+.BR Arrays ,
+below.
+Several pre-defined variables are set as a program
+runs; these are described as needed and summarized below.
+.SS Records
+Normally, records are separated by newline characters.  You can control how
+records are separated by assigning values to the built-in variable
+.BR RS .
+If
+.B RS
+is any single character, that character separates records.
+Otherwise,
+.B RS
+is a regular expression.  Text in the input that matches this
+regular expression separates the record.
+However, in compatibility mode,
+only the first character of its string
+value is used for separating records.
+If
+.B RS
+is set to the null string, then records are separated by
+empty lines.
+When
+.B RS
+is set to the null string, the newline character always acts as
+a field separator, in addition to whatever value
+.B FS
+may have.
+.SS Fields
+.PP
+As each input record is read,
+.I gawk
+splits the record into
+.IR fields ,
+using the value of the
+.B FS
+variable as the field separator.
+If
+.B FS
+is a single character, fields are separated by that character.
+If
+.B FS
+is the null string, then each individual character becomes a
+separate field.
+Otherwise,
+.B FS
+is expected to be a full regular expression.
+In the special case that
+.B FS
+is a single space, fields are separated
+by runs of spaces and/or tabs and/or newlines.
+.BR NOTE :
+The value of
+.B IGNORECASE
+(see below) also affects how fields are split when
+.B FS
+is a regular expression, and how records are separated when
+.B RS
+is a regular expression.
+.PP
+If the
+.B FIELDWIDTHS
+variable is set to a space-separated list of numbers, each field is
+expected to have fixed width, and
+.I gawk
+splits up the record using the specified widths. 
+Each field width may optionally be preceded by a colon-separated
+value specifying the number of characters to skip before the field starts.
+The value of
+.B FS
+is ignored.
+Assigning a new value to
+.B FS
+or
+.B FPAT
+overrides the use of
+.BR FIELDWIDTHS .
+.PP
+Similarly, if the
+.B FPAT
+variable is set to a string representing a regular expression,
+each field is made up of text that matches that regular expression. In
+this case, the regular expression describes the fields themselves,
+instead of the text that separates the fields.
+Assigning a new value to
+.B FS
+or
+.B FIELDWIDTHS
+overrides the use of
+.BR FPAT .
+.PP
+Each field in the input record may be referenced by its position:
+.BR $1 ,
+.BR $2 ,
+and so on.
+.B $0
+is the whole record,
+including leading and trailing whitespace.
+Fields need not be referenced by constants:
+.RS
+.PP
+.ft B
+n = 5
+.br
+print $n
+.ft R
+.RE
+.PP
+prints the fifth field in the input record.
+.PP
+The variable
+.B NF
+is set to the total number of fields in the input record.
+.PP
+References to non-existent fields (i.e., fields after
+.BR $NF )
+produce the null string.  However, assigning to a non-existent field
+(e.g.,
+.BR "$(NF+2) = 5" )
+increases the value of
+.BR NF ,
+creates any intervening fields with the null string as their values, and
+causes the value of
+.B $0
+to be recomputed, with the fields being separated by the value of
+.BR OFS .
+References to negative numbered fields cause a fatal error.
+Decrementing
+.B NF
+causes the values of fields past the new value to be lost, and the value of
+.B $0
+to be recomputed, with the fields being separated by the value of
+.BR OFS .
+.PP
+Assigning a value to an existing field
+causes the whole record to be rebuilt when
+.B $0
+is referenced.
+Similarly, assigning a value to
+.B $0
+causes the record to be resplit, creating new
+values for the fields.
+.SS Built-in Variables
+.PP
+.IR Gawk\^ "'s"
+built-in variables are:
+.PP
+.TP "\w'\fBFIELDWIDTHS\fR'u+1n"
+.B ARGC
+The number of command line arguments (does not include options to
+.IR gawk ,
+or the program source).
+.TP
+.B ARGIND
+The index in
+.B ARGV
+of the current file being processed.
+.TP
+.B ARGV
+Array of command line arguments.  The array is indexed from
+0 to
+.B ARGC
+\- 1.
+Dynamically changing the contents of
+.B ARGV
+can control the files used for data.
+.TP
+.B BINMODE
+On non-POSIX systems, specifies use of \*(lqbinary\*(rq mode for all file I/O.
+Numeric values of 1, 2, or 3, specify that input files, output files, or
+all files, respectively, should use binary I/O.
+String values of \fB"r"\fR, or \fB"w"\fR specify that input files, or output files,
+respectively, should use binary I/O.
+String values of \fB"rw"\fR or \fB"wr"\fR specify that all files
+should use binary I/O.
+Any other string value is treated as \fB"rw"\fR, but generates a warning message.
+.TP
+.B CONVFMT
+The conversion format for numbers, \fB"%.6g"\fR, by default.
+.TP
+.B ENVIRON
+An array containing the values of the current environment.
+The array is indexed by the environment variables, each element being
+the value of that variable (e.g., \fBENVIRON["HOME"]\fP might be
+\fB"/home/arnold"\fR).
+.sp
+In POSIX mode,
+changing this array does not affect the environment seen by programs which
+.I gawk
+spawns via redirection or the
+.B system()
+function.
+Otherwise,
+.I gawk
+updates its real environment so that programs it spawns see
+the changes.
+.TP
+.B ERRNO
+If a system error occurs either doing a redirection for
+.BR getline ,
+during a read for
+.BR getline ,
+or during a
+.BR close() ,
+then
+.B ERRNO
+is set to
+a string describing the error.
+The value is subject to translation in non-English locales.
+If the string in
+.B ERRNO
+corresponds to a system error in the
+.IR errno (3)
+variable, then the numeric value can be found in
+.B PROCINFO["errno"].
+For non-system errors,
+.B PROCINFO["errno"]
+will be zero.
+.TP
+.B FIELDWIDTHS
+A whitespace-separated list of field widths.  When set,
+.I gawk
+parses the input into fields of fixed width, instead of using the
+value of the
+.B FS
+variable as the field separator.
+Each field width may optionally be preceded by a colon-separated
+value specifying the number of characters to skip before the field starts.
+See
+.BR Fields ,
+above.
+.TP
+.B FILENAME
+The name of the current input file.
+If no files are specified on the command line, the value of
+.B FILENAME
+is \*(lq\-\*(rq.
+However,
+.B FILENAME
+is undefined inside the
+.B BEGIN
+rule
+(unless set by
+.BR getline ).
+.TP
+.B FNR
+The input record number in the current input file.
+.TP
+.B FPAT
+A regular expression describing the contents of the
+fields in a record.
+When set,
+.I gawk
+parses the input into fields, where the fields match the
+regular expression, instead of using the
+value of
+.B FS
+as the field separator.
+See
+.BR Fields ,
+above.
+.TP
+.B FS
+The input field separator, a space by default.  See
+.BR Fields ,
+above.
+.TP
+.B FUNCTAB
+An array whose indices and corresponding values
+are the names of all the user-defined
+or extension functions in the program.
+.BR NOTE :
+You may not use the
+.B delete
+statement with the
+.B FUNCTAB
+array.
+.TP
+.B IGNORECASE
+Controls the case-sensitivity of all regular expression
+and string operations.  If
+.B IGNORECASE
+has a non-zero value, then string comparisons and
+pattern matching in rules,
+field splitting with
+.B FS
+and
+.BR FPAT ,
+record separating with
+.BR RS ,
+regular expression
+matching with
+.B ~
+and
+.BR !~ ,
+and the
+.BR gensub() ,
+.BR gsub() ,
+.BR index() ,
+.BR match() ,
+.BR patsplit() ,
+.BR split() ,
+and
+.B sub()
+built-in functions all ignore case when doing regular expression
+operations.
+.BR NOTE :
+Array subscripting is
+.I not
+affected.
+However, the
+.B asort()
+and
+.B asorti()
+functions are affected.
+.sp .5
+Thus, if
+.B IGNORECASE
+is not equal to zero,
+.B /aB/
+matches all of the strings \fB"ab"\fP, \fB"aB"\fP, \fB"Ab"\fP,
+and \fB"AB"\fP.
+As with all \*(AK variables, the initial value of
+.B IGNORECASE
+is zero, so all regular expression and string
+operations are normally case-sensitive.
+.TP
+.B LINT
+Provides dynamic control of the
+.B \-\^\-lint
+option from within an \*(AK program.
+When true,
+.I gawk
+prints lint warnings. When false, it does not.
+When assigned the string value \fB"fatal"\fP,
+lint warnings become fatal errors, exactly like
+.BR \-\^\-lint=fatal .
+Any other true value just prints warnings.
+.TP
+.B NF
+The number of fields in the current input record.
+.TP
+.B NR
+The total number of input records seen so far.
+.TP
+.B OFMT
+The output format for numbers, \fB"%.6g"\fR, by default.
+.TP
+.B OFS
+The output field separator, a space by default.
+.TP
+.B ORS
+The output record separator, by default a newline.
+.TP
+.B PREC
+The working precision of arbitrary precision floating-point
+numbers, 53 by default.
+.TP
+.B PROCINFO
+The elements of this array provide access to information about the
+running \*(AK program.
+On some systems,
+there may be elements in the array, \fB"group1"\fP through
+\fB"group\fIn\fB"\fR for some
+.IR n ,
+which is the number of supplementary groups that the process has.
+Use the
+.B in
+operator to test for these elements.
+The following elements are guaranteed to be available:
+.RS
+.TP \w'\fBPROCINFO["strftime"]\fR'u+1n
+\fBPROCINFO["argv"]\fP
+The command line arguments as received by
+.I gawk
+at the C-language level.
+The subscripts start from zero.
+.TP
+\fBPROCINFO["egid"]\fP
+The value of the
+.IR getegid (2)
+system call.
+.TP
+\fBPROCINFO["errno"]\fP
+The value of
+.IR errno (3)
+when
+.B ERRNO
+is set to the associated error message.
+.TP
+\fBPROCINFO["euid"]\fP
+The value of the
+.IR geteuid (2)
+system call.
+.TP
+\fBPROCINFO["FS"]\fP
+\fB"FS"\fP if field splitting with
+.B FS
+is in effect,
+\fB"FPAT"\fP if field splitting with
+.B FPAT
+is in effect,
+\fB"FIELDWIDTHS"\fP if field splitting with
+.B FIELDWIDTHS
+is in effect,
+or \fB"API"\fP if API input parser field splitting
+is in effect.
+.TP
+\fBPROCINFO["gid"]\fP
+The value of the
+.IR getgid (2)
+system call.
+.TP
+\fBPROCINFO["identifiers"]\fP
+A subarray, indexed by the names of all identifiers used in the
+text of the AWK program.
+The values indicate what
+.I gawk
+knows about the identifiers after it has finished parsing the program; they are
+.I not
+updated while the program runs.
+For each identifier, the value of the element is one of the following:
+.RS
+.TP \w'\fB"extension"\fR'u+1n
+\fB"array"\fR
+The identifier is an array.
+.TP
+\fB"builtin"\fR
+The identifier is a built-in function.
+.TP
+\fB"extension"\fR
+The identifier is an extension function loaded via
+.B @load
+or
+.BR \-\^\-load .
+.TP
+\fB"scalar"\fR
+The identifier is a scalar.
+.TP
+\fB"untyped"\fR
+The identifier is untyped (could be used as a scalar or array,
+.I gawk
+doesn't know yet).
+.TP
+\fB"user"\fR
+The identifier is a user-defined function.
+.RE
+.TP
+\fBPROCINFO["pgrpid"]\fP
+The value of the
+.IR getpgrp (2)
+system call.
+.TP
+\fBPROCINFO["pid"]\fP
+The value of the
+.IR getpid (2)
+system call.
+.TP
+\fBPROCINFO["platform"]\fP
+A string indicating the platform for which
+.I gawk
+was compiled.  It is one of:
+.RS
+.TP
+\fB"djgpp"\fR, \fB"mingw"\fR
+Microsoft Windows, using either DJGPP, or MinGW, respectively.
+.TP
+\fB"os2"\fR
+OS/2.
+.TP
+\fB"posix"\fR
+GNU/Linux, Cygwin, Mac OS X, and legacy Unix systems.
+.TP
+\fB"vms"\fR
+OpenVMS or Vax/VMS.
+.RE
+.TP
+\fBPROCINFO["ppid"]\fP
+The value of the
+.IR getppid (2)
+system call.
+.TP
+\fBPROCINFO["strftime"]\fP
+The default time format string for
+.BR strftime() .
+Changing its value affects how
+.B strftime()
+formats time values when called with no arguments.
+.TP
+\fBPROCINFO["uid"]\fP
+The value of the
+.IR getuid (2)
+system call.
+.TP
+\fBPROCINFO["version"]\fP
+The version of
+.IR gawk .
+.PP
+The following elements are present if loading dynamic
+extensions is available:
+.TP
+\fBPROCINFO["api_major"]\fP
+The major version of the extension API.
+.TP
+\fBPROCINFO["api_minor"]\fP
+The minor version of the extension API.
+.PP
+The following elements are available if MPFR support is
+compiled into
+.IR gawk\^ :
+.TP
+\fBPROCINFO["gmp_version"]\fP
+The version of the GNU GMP library used for arbitrary precision
+number support in
+.IR gawk .
+.TP
+\fBPROCINFO["mpfr_version"]\fP
+The version of the GNU MPFR library used for arbitrary precision
+number support in
+.IR gawk .
+.TP
+\fBPROCINFO["prec_max"]\fP
+The maximum precision supported by the GNU MPFR library for
+arbitrary precision floating-point numbers.
+.TP
+\fBPROCINFO["prec_min"]\fP
+The minimum precision allowed by the GNU MPFR library for
+arbitrary precision floating-point numbers.
+.PP
+The following elements may set by a program to
+change
+.IR gawk 's
+behavior:
+.TP
+\fBPROCINFO["NONFATAL"]\fR
+If this exists, then I/O errors for all redirections become nonfatal.
+.TP
+\fBPROCINFO["\fIname\fB", "NONFATAL"]\fR
+Make I/O errors for
+.I name
+be nonfatal.
+.TP
+\fBPROCINFO["\fIcommand\fB", "pty"]\fR
+Use a pseudo-tty for two-way communication with
+.I command
+instead of setting up two one-way pipes.
+.TP
+\fBPROCINFO["\fIinput\fB", "READ_TIMEOUT"]\fR
+The timeout in milliseconds for reading data from
+.IR input ,
+where
+.I input
+is a redirection string or a filename. A value of zero or
+less than zero means no timeout.
+.TP
+\fBPROCINFO["\fIinput\^\fB", "RETRY"]\fR
+If an I/O error that may be retried occurs when reading data from
+.IR input ,
+and this array entry exists, then
+.B getline
+returns \-2 instead of following the default behavior of returning \-1
+and configuring
+.I input
+to return no further data.
+An I/O error that may be retried is one where
+.IR errno (3)
+has the value EAGAIN, EWOULDBLOCK, EINTR, or ETIMEDOUT.
+This may be useful in conjunction with
+\fBPROCINFO["\fIinput\^\fB", "READ_TIMEOUT"]\fR
+or in situations where a file descriptor has been configured to behave in a
+non-blocking fashion.
+.TP
+\fBPROCINFO["sorted_in"]\fP
+If this element exists in
+.BR PROCINFO ,
+then its value controls the order in which array elements
+are traversed in
+.B for
+loops.
+Supported values are
+\fB"@ind_str_asc"\fR,
+\fB"@ind_num_asc"\fR,
+\fB"@val_type_asc"\fR,
+\fB"@val_str_asc"\fR,
+\fB"@val_num_asc"\fR,
+\fB"@ind_str_desc"\fR,
+\fB"@ind_num_desc"\fR,
+\fB"@val_type_desc"\fR,
+\fB"@val_str_desc"\fR,
+\fB"@val_num_desc"\fR,
+and
+\fB"@unsorted"\fR.
+The value can also be the name (as a
+.IR string )
+of any comparison function defined
+as follows:
+.sp
+.in +5m
+\fBfunction cmp_func(i1, v1, i2, v2)\fR
+.in -5m
+.sp
+where
+.I i1
+and
+.I i2
+are the indices, and
+.I v1
+and
+.I v2
+are the
+corresponding values of the two elements being compared.
+It should return a number less than, equal to, or greater than 0,
+depending on how the elements of the array are to be ordered.
+.RE
+.TP
+.B ROUNDMODE
+The rounding mode to use for arbitrary precision arithmetic on
+numbers, by default \fB"N"\fR (IEEE-754 roundTiesToEven mode).
+The accepted values are:
+.RS
+.TP
+\fB"A"\fR or \fB"a"\fR
+for rounding away from zero.
+These are only available if your version of
+the GNU MPFR library supports rounding away from zero.
+.TP "\w'\fB\(dqD\(dq\fR or \fB\(dqd\(dq\fR'u+1n"
+\fB"D"\fR or \fB"d"\fR
+for roundTowardNegative.
+.TP
+\fB"N"\fR or \fB"n"\fR
+for roundTiesToEven.
+.TP
+\fB"U"\fR or \fB"u"\fR
+for roundTowardPositive.
+.TP
+\fB"Z"\fR or \fB"z"\fR
+for roundTowardZero.
+.RE
+.TP
+.B RS
+The input record separator, by default a newline.
+.TP
+.B RT
+The record terminator.
+.I Gawk
+sets
+.B RT
+to the input text that matched the character or regular expression
+specified by
+.BR RS .
+.TP
+.B RSTART
+The index of the first character matched by
+.BR match() ;
+0 if no match.
+(This implies that character indices start at one.)
+.TP
+.B RLENGTH
+The length of the string matched by
+.BR match() ;
+\-1 if no match.
+.TP
+.B SUBSEP
+The string used to separate multiple subscripts in array
+elements, by default \fB"\e034"\fR.
+.TP
+.B SYMTAB
+An array whose indices are the names of all currently defined
+global variables and arrays in the program.  The array may be used
+for indirect access to read or write the value of a variable:
+.sp
+.ft B
+.nf
+.in +5m
+foo = 5
+SYMTAB["foo"] = 4
+print foo    # prints 4
+.fi
+.ft R
+.in -5m
+.sp
+The
+.B typeof()
+function may be used to test if an element in
+.B SYMTAB
+is an array.
+You may not use the
+.B delete
+statement with the
+.B SYMTAB
+array, nor assign to elements with an index that is
+not a variable name.
+.TP
+.B TEXTDOMAIN
+The text domain of the \*(AK program; used to find the localized
+translations for the program's strings.
+.SS Arrays
+.PP
+Arrays are subscripted with an expression between square brackets
+.RB ( [ " and " ] ).
+If the expression is an expression list
+.RI ( expr ", " expr " .\|.\|.)"
+then the array subscript is a string consisting of the
+concatenation of the (string) value of each expression,
+separated by the value of the
+.B SUBSEP
+variable.
+This facility is used to simulate multiply dimensioned
+arrays.  For example:
+.PP
+.RS
+.ft B
+i = "A";\^ j = "B";\^ k = "C"
+.br
+x[i, j, k] = "hello, world\en"
+.ft R
+.RE
+.PP
+assigns the string \fB"hello,\ world\en"\fR to the element of the array
+.B x
+which is indexed by the string \fB"A\e034B\e034C"\fR.  All arrays in \*(AK
+are associative, i.e., indexed by string values.
+.PP
+The special operator
+.B in
+may be used to test if an array has an index consisting of a particular
+value:
+.PP
+.RS
+.ft B
+.nf
+if (val in array)
+	print array[val]
+.fi
+.ft
+.RE
+.PP
+If the array has multiple subscripts, use
+.BR "(i, j) in array" .
+.PP
+The
+.B in
+construct may also be used in a
+.B for
+loop to iterate over all the elements of an array.
+However, the
+.B "(i, j) in array"
+construct only works in tests, not in
+.B for
+loops.
+.PP
+An element may be deleted from an array using the
+.B delete
+statement.
+The
+.B delete
+statement may also be used to delete the entire contents of an array,
+just by specifying the array name without a subscript.
+.PP
+.I gawk
+supports true multidimensional arrays. It does not require that
+such arrays be ``rectangular'' as in C or C++.
+For example:
+.sp
+.RS
+.ft B
+.nf
+a[1] = 5
+a[2][1] = 6
+a[2][2] = 7
+.fi
+.ft
+.RE
+.PP
+.BR NOTE :
+You may need to tell
+.I gawk
+that an array element is really a subarray in order to use it where
+.I gawk
+expects an array (such as in the second argument to
+.BR split() ).
+You can do this by creating an element in the subarray and then
+deleting it with the
+.B delete
+statement.
+.SS Namespaces
+.I Gawk
+provides a simple
+.I namespace
+facility to help work around the fact that all variables in
+AWK are global.
+.PP
+A
+.I "qualified name"
+consists of a two simple identifiers joined by a double colon
+.RB ( :: ).
+The left-hand identifier represents the namespace and the right-hand
+identifier is the variable within it.
+All simple (non-qualified) names are considered to be in the
+``current'' namespace; the default namespace is
+.BR awk .
+However, simple identifiers consisting solely of uppercase
+letters are forced into the
+.B awk
+namespace, even if the current namespace is different.
+.PP
+You change the current namespace with an
+\fB@namespace "\fIname\^\fB"\fR
+directive.
+.PP
+The standard predefined builtin function names may not be used as
+namespace names.  The names of additional functions provided by
+.I gawk
+may be used as namespace names or as simple identifiers in other
+namespaces.
+For more details, see \*(EP.
+.SS Variable Typing And Conversion
+.PP
+Variables and fields
+may be (floating point) numbers, or strings, or both.
+They may also be regular expressions. How the
+value of a variable is interpreted depends upon its context.  If used in
+a numeric expression, it will be treated as a number; if used as a string
+it will be treated as a string.
+.PP
+To force a variable to be treated as a number, add zero to it; to force it
+to be treated as a string, concatenate it with the null string.
+.PP
+Uninitialized variables have the numeric value zero and the string value ""
+(the null, or empty, string).
+.PP
+When a string must be converted to a number, the conversion is accomplished
+using
+.IR strtod (3).
+A number is converted to a string by using the value of
+.B CONVFMT
+as a format string for
+.IR sprintf (3),
+with the numeric value of the variable as the argument.
+However, even though all numbers in \*(AK are floating-point,
+integral values are
+.I always
+converted as integers.  Thus, given
+.PP
+.RS
+.ft B
+.nf
+CONVFMT = "%2.2f"
+a = 12
+b = a ""
+.fi
+.ft R
+.RE
+.PP
+the variable
+.B b
+has a string value of \fB"12"\fR and not \fB"12.00"\fR.
+.PP
+.BR NOTE :
+When operating in POSIX mode (such as with the
+.B \-\^\-posix
+option),
+beware that locale settings may interfere with the way
+decimal numbers are treated: the decimal separator of the numbers you
+are feeding to
+.I gawk
+must conform to what your locale would expect, be it
+a comma (,) or a period (.).
+.PP
+.I Gawk
+performs comparisons as follows:
+If two variables are numeric, they are compared numerically.
+If one value is numeric and the other has a string value that is a
+\*(lqnumeric string,\*(rq then comparisons are also done numerically.
+Otherwise, the numeric value is converted to a string and a string
+comparison is performed.
+Two strings are compared, of course, as strings.
+.PP
+Note that string constants, such as \fB"57"\fP, are
+.I not
+numeric strings, they are string constants.
+The idea of \*(lqnumeric string\*(rq
+only applies to fields,
+.B getline
+input,
+.BR FILENAME ,
+.B ARGV
+elements,
+.B ENVIRON
+elements and the elements of an array created by
+.B split()
+or
+.B patsplit()
+that are numeric strings.
+The basic idea is that
+.IR "user input" ,
+and only user input, that looks numeric,
+should be treated that way.
+.SS Octal and Hexadecimal Constants
+You may use C-style octal and hexadecimal constants in your AWK
+program source code.
+For example, the octal value
+.B 011
+is equal to decimal
+.BR 9 ,
+and the hexadecimal value
+.B 0x11
+is equal to decimal 17.
+.SS String Constants
+.PP
+String constants in \*(AK are sequences of characters enclosed
+between double quotes (like \fB"value"\fR).  Within strings, certain
+.I "escape sequences"
+are recognized, as in C.  These are:
+.PP
+.TP "\w'\fB\e\^\fIddd\fR'u+1n"
+.B \e\e
+A literal backslash.
+.TP
+.B \ea
+The \*(lqalert\*(rq character; usually the \s-1ASCII\s+1 \s-1BEL\s+1 character.
+.TP
+.B \eb
+Backspace.
+.TP
+.B \ef
+Form-feed.
+.TP
+.B \en
+Newline.
+.TP
+.B \er
+Carriage return.
+.TP
+.B \et
+Horizontal tab.
+.TP
+.B \ev
+Vertical tab.
+.TP
+.BI \ex "\^hex digits"
+The character represented by the string of hexadecimal digits following
+the
+.BR \ex .
+Up to two
+following hexadecimal digits are considered part of
+the escape sequence.
+E.g., \fB"\ex1B"\fR is the \s-1ASCII\s+1 \s-1ESC\s+1 (escape) character.
+.TP
+.BI \e ddd
+The character represented by the 1-, 2-, or 3-digit sequence of octal
+digits.
+E.g., \fB"\e033"\fR is the \s-1ASCII\s+1 \s-1ESC\s+1 (escape) character.
+.TP
+.BI \e c
+The literal character
+.IR c\^ .
+.PP
+In compatibility mode, the characters represented by octal and
+hexadecimal escape sequences are treated literally when used in
+regular expression constants.  Thus,
+.B /a\e52b/
+is equivalent to
+.BR /a\e*b/ .
+.SS Regexp Constants
+A regular expression constant is a sequence of characters enclosed
+between forward slashes (like
+.BR /value/ ).
+Regular expression matching is described more fully below; see
+.BR "Regular Expressions" .
+.PP
+The escape sequences described earlier may also be used inside
+constant regular expressions
+(e.g.,
+.B "/[\ \et\ef\en\er\ev]/"
+matches whitespace characters).
+.PP
+.I Gawk
+provides
+.I "strongly typed"
+regular expression constants. These are written with a leading
+.B @
+symbol (like so:
+.BR @/value/ ).
+Such constants may be assigned to scalars (variables, array elements)
+and passed to user-defined functions. Variables that have been so
+assigned have regular expression type.
+.SH PATTERNS AND ACTIONS
+\*(AK is a line-oriented language.  The pattern comes first, and then the
+action.  Action statements are enclosed in
+.B {
+and
+.BR } .
+Either the pattern may be missing, or the action may be missing, but,
+of course, not both.  If the pattern is missing, the action
+executes for every single record of input.
+A missing action is equivalent to
+.RS
+.PP
+.B "{ print }"
+.RE
+.PP
+which prints the entire record.
+.PP
+Comments begin with the
+.B #
+character, and continue until the
+end of the line.
+Empty lines may be used to separate statements.
+Normally, a statement ends with a newline, however, this is not the
+case for lines ending in
+a comma,
+.BR { ,
+.BR ? ,
+.BR : ,
+.BR && ,
+or
+.BR || .
+Lines ending in
+.B do
+or
+.B else
+also have their statements automatically continued on the following line.
+In other cases, a line can be continued by ending it with a \*(lq\e\*(rq,
+in which case the newline is ignored.  However, a \*(lq\e\*(rq after a
+.B #
+is not special.
+.PP
+Multiple statements may
+be put on one line by separating them with a \*(lq;\*(rq.
+This applies to both the statements within the action part of a
+pattern-action pair (the usual case),
+and to the pattern-action statements themselves.
+.SS Patterns
+\*(AK patterns may be one of the following:
+.PP
+.RS
+.nf
+.B BEGIN
+.B END
+.B BEGINFILE
+.B ENDFILE
+.BI / "regular expression" /
+.I "relational expression"
+.IB pattern " && " pattern
+.IB pattern " || " pattern
+.IB pattern " ? " pattern " : " pattern
+.BI ( pattern )
+.BI ! " pattern"
+.IB pattern1 ", " pattern2
+.fi
+.RE
+.PP
+.B BEGIN
+and
+.B END
+are two special kinds of patterns which are not tested against
+the input.
+The action parts of all
+.B BEGIN
+patterns are merged as if all the statements had
+been written in a single
+.B BEGIN
+rule.  They are executed before any
+of the input is read.  Similarly, all the
+.B END
+rules are merged,
+and executed when all the input is exhausted (or when an
+.B exit
+statement is executed).
+.B BEGIN
+and
+.B END
+patterns cannot be combined with other patterns in pattern expressions.
+.B BEGIN
+and
+.B END
+patterns cannot have missing action parts.
+.PP
+.B BEGINFILE
+and
+.B ENDFILE
+are additional special patterns whose actions are executed
+before reading the first record of each command-line input file
+and after reading the last record of each file.
+Inside the
+.B BEGINFILE
+rule, the value of
+.B ERRNO
+is the empty string if the file was opened successfully.
+Otherwise, there is some problem with the file and the code should
+use
+.B nextfile
+to skip it. If that is not done,
+.I gawk
+produces its usual fatal error for files that cannot be opened.
+.PP
+For
+.BI / "regular expression" /
+patterns, the associated statement is executed for each input record that matches
+the regular expression.
+Regular expressions are the same as those in
+.IR egrep (1),
+and are summarized below.
+.PP
+A
+.I "relational expression"
+may use any of the operators defined below in the section on actions.
+These generally test whether certain fields match certain regular expressions.
+.PP
+The
+.BR && ,
+.BR || ,
+and
+.B !
+operators are logical AND, logical OR, and logical NOT, respectively, as in C.
+They do short-circuit evaluation, also as in C, and are used for combining
+more primitive pattern expressions.  As in most languages, parentheses
+may be used to change the order of evaluation.
+.PP
+The
+.B ?\^:
+operator is like the same operator in C.  If the first pattern is true
+then the pattern used for testing is the second pattern, otherwise it is
+the third.  Only one of the second and third patterns is evaluated.
+.PP
+The
+.IB pattern1 ", " pattern2
+form of an expression is called a
+.IR "range pattern" .
+It matches all input records starting with a record that matches
+.IR pattern1 ,
+and continuing until a record that matches
+.IR pattern2 ,
+inclusive.  It does not combine with any other sort of pattern expression.
+.SS Regular Expressions
+Regular expressions are the extended kind found in
+.IR egrep .
+They are composed of characters as follows:
+.TP "\w'\fB[^\fIabc.\|.\|.\fB]\fR'u+2n"
+.I c
+Matches the non-metacharacter
+.IR c .
+.TP
+.I \ec
+Matches the literal character
+.IR c .
+.TP
+.B .
+Matches any character
+.I including
+newline.
+.TP
+.B ^
+Matches the beginning of a string.
+.TP
+.B $
+Matches the end of a string.
+.TP
+.BI [ abc.\|.\|. ]
+A character list: matches any of the characters
+.IR abc.\|.\|. .
+You may include a range of characters by separating them with a dash.
+To include a literal dash in the list, put it first or last.
+.TP
+\fB[^\fIabc.\|.\|.\fB]\fR
+A negated character list: matches any character except
+.IR abc.\|.\|. .
+.TP
+.IB r1 | r2
+Alternation: matches either
+.I r1
+or
+.IR r2 .
+.TP
+.I r1r2
+Concatenation: matches
+.IR r1 ,
+and then
+.IR r2 .
+.TP
+.IB r\^ +
+Matches one or more
+.IR r\^ "'s."
+.TP
+.IB r *
+Matches zero or more
+.IR r\^ "'s."
+.TP
+.IB r\^ ?
+Matches zero or one
+.IR r\^ "'s."
+.TP
+.BI ( r )
+Grouping: matches
+.IR r .
+.TP
+.PD 0
+.IB r { n }
+.TP
+.PD 0
+.IB r { n ,}
+.TP
+.PD
+.IB r { n , m }
+One or two numbers inside braces denote an
+.IR "interval expression" .
+If there is one number in the braces, the preceding regular expression
+.I r
+is repeated
+.I n
+times.  If there are two numbers separated by a comma,
+.I r
+is repeated
+.I n
+to
+.I m
+times.
+If there is one number followed by a comma, then
+.I r
+is repeated at least
+.I n
+times.
+.TP
+.B \ey
+Matches the empty string at either the beginning or the
+end of a word.
+.TP
+.B \eB
+Matches the empty string within a word.
+.TP
+.B \e<
+Matches the empty string at the beginning of a word.
+.TP
+.B \e>
+Matches the empty string at the end of a word.
+.TP
+.B \es
+Matches any whitespace character.
+.TP
+.B \eS
+Matches any nonwhitespace character.
+.TP
+.B \ew
+Matches any word-constituent character (letter, digit, or underscore).
+.TP
+.B \eW
+Matches any character that is not word-constituent.
+.TP
+.B \e`
+Matches the empty string at the beginning of a buffer (string).
+.TP
+.B \e'
+Matches the empty string at the end of a buffer.
+.PP
+The escape sequences that are valid in string constants (see
+.BR "String Constants" )
+are also valid in regular expressions.
+.PP
+.I "Character classes"
+are a feature introduced in the \*(PX standard.
+A character class is a special notation for describing
+lists of characters that have a specific attribute, but where the
+actual characters themselves can vary from country to country and/or
+from character set to character set.  For example, the notion of what
+is an alphabetic character differs in the USA and in France.
+.PP
+A character class is only valid in a regular expression
+.I inside
+the brackets of a character list.  Character classes consist of
+.BR [: ,
+a keyword denoting the class, and
+.BR :] .
+The character
+classes defined by the \*(PX standard are:
+.TP "\w'\fB[:alnum:]\fR'u+2n"
+.B [:alnum:]
+Alphanumeric characters.
+.TP
+.B [:alpha:]
+Alphabetic characters.
+.TP
+.B [:blank:]
+Space or tab characters.
+.TP
+.B [:cntrl:]
+Control characters.
+.TP
+.B [:digit:]
+Numeric characters.
+.TP
+.B [:graph:]
+Characters that are both printable and visible.
+(A space is printable, but not visible, while an
+.B a
+is both.)
+.TP
+.B [:lower:]
+Lowercase alphabetic characters.
+.TP
+.B [:print:]
+Printable characters (characters that are not control characters.)
+.TP
+.B [:punct:]
+Punctuation characters (characters that are not letter, digits,
+control characters, or space characters).
+.TP
+.B [:space:]
+Space characters (such as space, tab, and formfeed, to name a few).
+.TP
+.B [:upper:]
+Uppercase alphabetic characters.
+.TP
+.B [:xdigit:]
+Characters that are hexadecimal digits.
+.PP
+For example, before the \*(PX standard, to match alphanumeric
+characters, you would have had to write
+.BR /[A\-Za\-z0\-9]/ .
+If your character set had other alphabetic characters in it, this would not
+match them, and if your character set collated differently from
+\s-1ASCII\s+1, this might not even match the
+\s-1ASCII\s+1 alphanumeric characters.
+With the \*(PX character classes, you can write
+.BR /[[:alnum:]]/ ,
+and this matches
+the alphabetic and numeric characters in your character set,
+no matter what it is.
+.PP
+Two additional special sequences can appear in character lists.
+These apply to non-\s-1ASCII\s+1 character sets, which can have single symbols
+(called
+.IR "collating elements" )
+that are represented with more than one
+character, as well as several characters that are equivalent for
+.IR collating ,
+or sorting, purposes.  (E.g., in French, a plain \*(lqe\*(rq
+and a grave-accented \*(lqe\h'-\w:e:u'\`\*(rq are equivalent.)
+.TP
+Collating Symbols
+A collating symbol is a multi-character collating element enclosed in
+.B [.
+and
+.BR .] .
+For example, if
+.B ch
+is a collating element, then
+.B [[.ch.]]
+is a regular expression that matches this collating element, while
+.B [ch]
+is a regular expression that matches either
+.B c
+or
+.BR h .
+.TP
+Equivalence Classes
+An equivalence class is a locale-specific name for a list of
+characters that are equivalent.  The name is enclosed in
+.B [=
+and
+.BR =] .
+For example, the name
+.B e
+might be used to represent all of
+\*(lqe\*(rq, \*(lqe\h'-\w:e:u'\'\*(rq, and \*(lqe\h'-\w:e:u'\`\*(rq.
+In this case,
+.B [[=e=]]
+is a regular expression
+that matches any of
+.BR e ,
+.BR "e\h'-\w:e:u'\'" ,
+or
+.BR "e\h'-\w:e:u'\`" .
+.PP
+These features are very valuable in non-English speaking locales.
+The library functions that
+.I gawk
+uses for regular expression matching
+currently only recognize \*(PX character classes; they do not recognize
+collating symbols or equivalence classes.
+.PP
+The
+.BR \ey ,
+.BR \eB ,
+.BR \e< ,
+.BR \e> ,
+.BR \es ,
+.BR \eS ,
+.BR \ew ,
+.BR \eW ,
+.BR \e` ,
+and
+.B \e'
+operators are specific to
+.IR gawk ;
+they are extensions based on facilities in the \*(GN regular expression libraries.
+.PP
+The various command line options
+control how
+.I gawk
+interprets characters in regular expressions.
+.TP
+No options
+In the default case,
+.I gawk
+provides all the facilities of
+\*(PX regular expressions and the \*(GN regular expression operators described above.
+.TP
+.B \-\^\-posix
+Only \*(PX regular expressions are supported, the \*(GN operators are not special.
+(E.g.,
+.B \ew
+matches a literal
+.BR w ).
+.TP
+.B \-\^\-traditional
+Traditional \*(UX
+.I awk
+regular expressions are matched.  The \*(GN operators
+are not special, and interval expressions are not available.
+Characters described by octal and hexadecimal escape sequences are
+treated literally, even if they represent regular expression metacharacters.
+.TP
+.B \-\^\-re\-interval
+Allow interval expressions in regular expressions, even if
+.B \-\^\-traditional
+has been provided.
+.SS Actions
+Action statements are enclosed in braces,
+.B {
+and
+.BR } .
+Action statements consist of the usual assignment, conditional, and looping
+statements found in most languages.  The operators, control statements,
+and input/output statements
+available are patterned after those in C.
+.SS Operators
+.PP
+The operators in \*(AK, in order of decreasing precedence, are:
+.PP
+.TP "\w'\fB*= /= %= ^=\fR'u+1n"
+.BR ( \&.\|.\|. )
+Grouping
+.TP
+.B $
+Field reference.
+.TP
+.B "++ \-\^\-"
+Increment and decrement, both prefix and postfix.
+.TP
+.B ^
+Exponentiation (\fB**\fR may also be used, and \fB**=\fR for
+the assignment operator).
+.TP
+.B "+ \- !"
+Unary plus, unary minus, and logical negation.
+.TP
+.B "* / %"
+Multiplication, division, and modulus.
+.TP
+.B "+ \-"
+Addition and subtraction.
+.TP
+.I space
+String concatenation.
+.TP
+.B "|   |&"
+Piped I/O for
+.BR getline ,
+.BR print ,
+and
+.BR printf .
+.TP
+.B "< > <= >= == !="
+The regular relational operators.
+.TP
+.B "~ !~"
+Regular expression match, negated match.
+.BR NOTE :
+Do not use a constant regular expression
+.RB ( /foo/ )
+on the left-hand side of a
+.B ~
+or
+.BR !~ .
+Only use one on the right-hand side.  The expression
+.BI "/foo/ ~ " exp
+has the same meaning as \fB(($0 ~ /foo/) ~ \fIexp\fB)\fR.
+This is usually
+.I not
+what you want.
+.TP
+.B in
+Array membership.
+.TP
+.B &&
+Logical AND.
+.TP
+.B ||
+Logical OR.
+.TP
+.B ?:
+The C conditional expression.  This has the form
+.IB expr1 " ? " expr2 " : " expr3\c
+\&.
+If
+.I expr1
+is true, the value of the expression is
+.IR expr2 ,
+otherwise it is
+.IR expr3 .
+Only one of
+.I expr2
+and
+.I expr3
+is evaluated.
+.TP
+.B "= += \-= *= /= %= ^="
+Assignment.  Both absolute assignment
+.BI ( var " = " value )
+and operator-assignment (the other forms) are supported.
+.SS Control Statements
+.PP
+The control statements are
+as follows:
+.PP
+.RS
+.nf
+\fBif (\fIcondition\fB) \fIstatement\fR [ \fBelse\fI statement \fR]
+\fBwhile (\fIcondition\fB) \fIstatement \fR
+\fBdo \fIstatement \fBwhile (\fIcondition\fB)\fR
+\fBfor (\fIexpr1\fB; \fIexpr2\fB; \fIexpr3\fB) \fIstatement\fR
+\fBfor (\fIvar \fBin\fI array\fB) \fIstatement\fR
+\fBbreak\fR
+\fBcontinue\fR
+\fBdelete \fIarray\^\fB[\^\fIindex\^\fB]\fR
+\fBdelete \fIarray\^\fR
+\fBexit\fR [ \fIexpression\fR ]
+\fB{ \fIstatements \fB}\fR
+\fBswitch (\fIexpression\fB) {
+\fBcase \fIvalue\fB|\fIregex\fB : \fIstatement
+\&.\^.\^.
+\fR[ \fBdefault: \fIstatement \fR]
+\fB}\fR
+.fi
+.RE
+.SS "I/O Statements"
+.PP
+The input/output statements are as follows:
+.PP
+.TP "\w'\fBprintf \fIfmt, expr-list\fR'u+1n"
+\fBclose(\fIfile \fR[\fB, \fIhow\fR]\fB)\fR
+Close file, pipe or coprocess.
+The optional
+.I how
+should only be used when closing one end of a
+two-way pipe to a coprocess.
+It must be a string value, either
+\fB"to"\fR or \fB"from"\fR.
+.TP
+.B getline
+Set
+.B $0
+from the next input record; set
+.BR NF ,
+.BR NR ,
+.BR FNR ,
+.BR RT .
+.TP
+.BI "getline <" file
+Set
+.B $0
+from the next record of
+.IR file ;
+set
+.BR NF ,
+.BR RT .
+.TP
+.BI getline " var"
+Set
+.I var
+from the next input record; set
+.BR NR ,
+.BR FNR ,
+.BR RT .
+.TP
+.BI getline " var" " <" file
+Set
+.I var
+from the next record of
+.IR file ;
+set
+.BR RT .
+.TP
+\fIcommand\fB | getline \fR[\fIvar\fR]
+Run
+.IR command ,
+piping the output either into
+.B $0
+or
+.IR var ,
+as above, and
+.BR RT .
+.TP
+\fIcommand\fB |& getline \fR[\fIvar\fR]
+Run
+.I command
+as a coprocess
+piping the output either into
+.B $0
+or
+.IR var ,
+as above, and
+.BR RT .
+Coprocesses are a
+.I gawk
+extension.
+.RI "(The " command
+can also be a socket.  See the subsection
+.BR "Special File Names" ,
+below.)
+.TP
+.B next
+Stop processing the current input record.
+Read the next input record
+and start processing over with the first pattern in the
+\*(AK program.
+Upon reaching the end of the input data,
+execute any
+.B END
+rule(s).
+.TP
+.B "nextfile"
+Stop processing the current input file.  The next input record read
+comes from the next input file.
+Update
+.B FILENAME
+and
+.BR ARGIND ,
+reset
+.B FNR
+to 1, and start processing over with the first pattern in the
+\*(AK program.
+Upon reaching the end of the input data,
+execute any
+.B ENDFILE
+and
+.B END
+rule(s).
+.TP
+.B print
+Print the current record.
+The output record is terminated with the value of
+.BR ORS .
+.TP
+.BI print " expr-list"
+Print expressions.
+Each expression is separated by the value of
+.BR OFS .
+The output record is terminated with the value of
+.BR ORS .
+.TP
+.BI print " expr-list" " >" file
+Print expressions on
+.IR file .
+Each expression is separated by the value of
+.BR OFS .
+The output record is terminated with the value of
+.BR ORS .
+.TP
+.BI printf " fmt, expr-list"
+Format and print.
+See \fBThe \fIprintf \fBStatement\fR, below.
+.TP
+.BI printf " fmt, expr-list" " >" file
+Format and print on
+.IR file .
+.TP
+.BI system( cmd-line )
+Execute the command
+.IR cmd-line ,
+and return the exit status.
+(This may not be available on non-\*(PX systems.)
+See \*(EP for the full details on the exit status.
+.TP
+\&\fBfflush(\fR[\fIfile\^\fR]\fB)\fR
+Flush any buffers associated with the open output file or pipe
+.IR file .
+If
+.I file
+is missing or if it
+is the null string,
+then flush all open output files and pipes.
+.PP
+Additional output redirections are allowed for
+.B print
+and
+.BR printf .
+.TP
+.BI "print .\|.\|. >>" " file"
+Append output to the
+.IR file .
+.TP
+.BI "print .\|.\|. |" " command"
+Write on a pipe.
+.TP
+.BI "print .\|.\|. |&" " command"
+Send data to a coprocess or socket.
+(See also the subsection
+.BR "Special File Names" ,
+below.)
+.PP
+The
+.B getline
+command returns 1 on success, zero on end of file, and \-1 on an error.
+If the
+.IR errno (3)
+value indicates that the I/O operation may be retried,
+and \fBPROCINFO["\fIinput\^\fP", "RETRY"]\fR
+is set, then \-2 is returned instead of \-1, and further calls to
+.B getline
+may be attempted.
+Upon an error,
+.B ERRNO
+is set to a string describing the problem.
+.PP
+.BR NOTE :
+Failure in opening a two-way socket results in a non-fatal error being
+returned to the calling function. If using a pipe, coprocess, or socket to
+.BR getline ,
+or from
+.B print
+or
+.B printf
+within a loop, you
+.I must
+use
+.B close()
+to create new instances of the command or socket.
+\*(AK does not automatically close pipes, sockets, or coprocesses when
+they return EOF.
+.SS The \fIprintf\fP\^ Statement
+.PP
+The \*(AK versions of the
+.B printf
+statement and
+.B sprintf()
+function
+(see below)
+accept the following conversion specification formats:
+.TP "\w'\fB%g\fR, \fB%G\fR'u+2n"
+.BR "%a" "," " %A"
+A floating point number of the form
+[\fB\-\fP]\fB0x\fIh\fB.\fIhhhh\fBp+\-\fIdd\fR
+(C99 hexadecimal floating point format).
+For
+.BR %A ,
+uppercase letters are used instead of lowercase ones.
+.TP
+.B %c
+A single character.
+If the argument used for
+.B %c
+is numeric, it is treated as a character and printed.
+Otherwise, the argument is assumed to be a string, and the only first
+character of that string is printed.
+.TP
+.BR "%d" "," " %i"
+A decimal number (the integer part).
+.TP
+.BR %e , " %E"
+A floating point number of the form
+[\fB\-\fP]\fId\fB.\fIdddddd\^\fBe\fR[\fB+\-\fR]\fIdd\fR.
+The
+.B %E
+format uses
+.B E
+instead of
+.BR e .
+.TP
+.BR %f , " %F"
+A floating point number of the form
+[\fB\-\fP]\fIddd\fB.\fIdddddd\fR.
+If the system library supports it,
+.B %F
+is available as well. This is like
+.BR %f ,
+but uses capital letters for special \*(lqnot a number\*(rq
+and \*(lqinfinity\*(rq values. If
+.B %F
+is not available,
+.I gawk
+uses
+.BR %f .
+.TP
+.BR %g , " %G"
+Use
+.B %e
+or
+.B %f
+conversion, whichever is shorter, with nonsignificant zeros suppressed.
+The
+.B %G
+format uses
+.B %E
+instead of
+.BR %e .
+.TP
+.B %o
+An unsigned octal number (also an integer).
+.TP
+.PD
+.B %u
+An unsigned decimal number (again, an integer).
+.TP
+.B %s
+A character string.
+.TP
+.BR %x , " %X"
+An unsigned hexadecimal number (an integer).
+The
+.B %X
+format uses
+.B ABCDEF
+instead of
+.BR abcdef .
+.TP
+.B %%
+A single
+.B %
+character; no argument is converted.
+.PP
+Optional, additional parameters may lie between the
+.B %
+and the control letter:
+.TP
+.IB count $
+Use the
+.IR count "'th"
+argument at this point in the formatting.
+This is called a
+.I "positional specifier"
+and
+is intended primarily for use in translated versions of
+format strings, not in the original text of an AWK program.
+It is a
+.I gawk
+extension.
+.TP
+.B \-
+The expression should be left-justified within its field.
+.TP
+.I space
+For numeric conversions, prefix positive values with a space, and
+negative values with a minus sign.
+.TP
+.B +
+The plus sign, used before the width modifier (see below),
+says to always supply a sign for numeric conversions, even if the data
+to be formatted is positive.  The
+.B +
+overrides the space modifier.
+.TP
+.B #
+Use an \*(lqalternate form\*(rq for certain control letters.
+For
+.BR %o ,
+supply a leading zero.
+For
+.BR %x ,
+and
+.BR %X ,
+supply a leading
+.B 0x
+or
+.B 0X
+for
+a nonzero result.
+For
+.BR %e ,
+.BR %E ,
+.B %f
+and
+.BR %F ,
+the result always contains a
+decimal point.
+For
+.BR %g ,
+and
+.BR %G ,
+trailing zeros are not removed from the result.
+.TP
+.B 0
+A leading
+.B 0
+(zero) acts as a flag, indicating that output should be
+padded with zeroes instead of spaces.
+This applies only to the numeric output formats.
+This flag only has an effect when the field width is wider than the
+value to be printed.
+.TP
+.B '
+A single quote character instructs
+.I gawk
+to insert the locale's thousands-separator character
+into decimal numbers, and to also use the locale's
+decimal point character with floating point formats.
+This requires correct locale support in the C library
+and in the definition of the current locale.
+.TP
+.I width
+The field should be padded to this width.  The field is normally padded
+with spaces.  With the
+.B 0
+flag, it is padded with zeroes.
+.TP
+.BI \&. prec
+A number that specifies the precision to use when printing.
+For the
+.BR %e ,
+.BR %E ,
+.B %f
+and
+.BR %F ,
+formats, this specifies the
+number of digits you want printed to the right of the decimal point.
+For the
+.BR %g ,
+and
+.B %G
+formats, it specifies the maximum number
+of significant digits.  For the
+.BR %d ,
+.BR %i ,
+.BR %o ,
+.BR %u ,
+.BR %x ,
+and
+.B %X
+formats, it specifies the minimum number of
+digits to print.  For the
+.B %s 
+format,
+it specifies the maximum number of
+characters from the string that should be printed.
+.PP
+The dynamic
+.I width
+and
+.I prec
+capabilities of the ISO C
+.B printf()
+routines are supported.
+A
+.B *
+in place of either the
+.I width
+or
+.I prec
+specifications causes their values to be taken from
+the argument list to
+.B printf
+or
+.BR sprintf() .
+To use a positional specifier with a dynamic width or precision,
+supply the
+.IB count $
+after the
+.B *
+in the format string.
+For example, \fB"%3$*2$.*1$s"\fP.
+.SS Special File Names
+.PP
+When doing I/O redirection from either
+.B print
+or
+.B printf
+into a file,
+or via
+.B getline
+from a file,
+.I gawk
+recognizes certain special filenames internally.  These filenames
+allow access to open file descriptors inherited from
+.IR gawk\^ "'s"
+parent process (usually the shell).
+These file names may also be used on the command line to name data files.
+The filenames are:
+.TP "\w'\fB/dev/stdout\fR'u+1n"
+.B \-
+The standard input.
+.TP
+.B /dev/stdin
+The standard input.
+.TP
+.B /dev/stdout
+The standard output.
+.TP
+.B /dev/stderr
+The standard error output.
+.TP
+.BI /dev/fd/\^ n
+The file associated with the open file descriptor
+.IR n .
+.PP
+These are particularly useful for error messages.  For example:
+.PP
+.RS
+.ft B
+print "You blew it!" > "/dev/stderr"
+.ft R
+.RE
+.PP
+whereas you would otherwise have to use
+.PP
+.RS
+.ft B
+print "You blew it!" | "cat 1>&2"
+.ft R
+.RE
+.PP
+The following special filenames may be used with the
+.B |&
+coprocess operator for creating TCP/IP network connections:
+.TP
+.PD 0
+.BI /inet/tcp/ lport / rhost / rport
+.TP
+.PD 0
+.BI /inet4/tcp/ lport / rhost / rport
+.TP
+.PD
+.BI /inet6/tcp/ lport / rhost / rport
+Files for a TCP/IP connection on local port
+.I lport
+to
+remote host
+.I rhost
+on remote port
+.IR rport .
+Use a port of
+.B 0
+to have the system pick a port.
+Use
+.B /inet4
+to force an IPv4 connection,
+and
+.B /inet6
+to force an IPv6 connection.
+Plain
+.B /inet
+uses the system default (most likely IPv4).
+Usable only with the
+.B |&
+two-way I/O operator.
+.TP
+.PD 0
+.BI /inet/udp/ lport / rhost / rport
+.TP
+.PD 0
+.BI /inet4/udp/ lport / rhost / rport
+.TP
+.PD
+.BI /inet6/udp/ lport / rhost / rport
+Similar, but use UDP/IP instead of TCP/IP.
+.SS Numeric Functions
+.PP
+\*(AK has the following built-in arithmetic functions:
+.PP
+.TP "\w'\fBsrand(\fR[\fIexpr\^\fR]\fB)\fR'u+1n"
+.BI atan2( y , " x" )
+Return the arctangent of
+.I y/x
+in radians.
+.TP
+.BI cos( expr )
+Return the cosine of
+.IR expr ,
+which is in radians.
+.TP
+.BI exp( expr )
+The exponential function.
+.TP
+.BI int( expr )
+Truncate to integer.
+.ig
+.TP
+.BI intdiv( num ", " denom ", " result )
+Truncate
+.I num
+and
+.I denom
+to integers. Return the quotient of
+.I num
+divided by
+.I denom
+in \fIresult\fB["quotient"]\fR
+and the remainder in
+in \fIresult\fB["remainder"]\fR.
+This is a
+.I gawk
+extension, primarily of value when working with
+arbitrarily large integers.
+..
+.TP
+.BI log( expr )
+The natural logarithm function.
+.TP
+.B rand()
+Return a random number
+.IR N ,
+between zero and one,
+such that 0 \(<= \fIN\fP < 1.
+.TP
+.BI sin( expr )
+Return the sine of
+.IR expr ,
+which is in radians.
+.TP
+.BI sqrt( expr )
+Return the square root of
+.IR expr .
+.TP
+\&\fBsrand(\fR[\fIexpr\^\fR]\fB)\fR
+Use
+.I expr
+as the new seed for the random number generator.  If no
+.I expr
+is provided, use the time of day.
+Return the previous seed for the random
+number generator.
+.SS String Functions
+.PP
+.I Gawk
+has the following built-in string functions:
+.PP
+.TP "\w'\fBsprintf(\^\fIfmt\fB\^, \fIexpr-list\^\fB)\fR'u+1n"
+\fBasort(\fIs \fR[\fB, \fId\fR [\fB, \fIhow\fR] ]\fB)\fR
+Return the number of elements in the source
+array
+.IR s .
+Sort
+the contents of
+.I s
+using
+.IR gawk\^ "'s"
+normal rules for
+comparing values, and replace the indices of the
+sorted values
+.I s
+with sequential
+integers starting with 1. If the optional
+destination array
+.I d
+is specified,
+first duplicate
+.I s
+into
+.IR d ,
+and then sort
+.IR d ,
+leaving the indices of the
+source array
+.I s
+unchanged. The optional string
+.I how
+controls the direction and the comparison mode.
+Valid values for
+.I how
+are
+any of the strings valid for
+\fBPROCINFO["sorted_in"]\fR.
+It can also be the name of a user-defined
+comparison function as described in
+\fBPROCINFO["sorted_in"]\fR.
+.TP "\w'\fBsprintf(\^\fIfmt\fB\^, \fIexpr-list\^\fB)\fR'u+1n"
+\fBasorti(\fIs \fR[\fB, \fId\fR [\fB, \fIhow\fR] ]\fB)\fR
+Return the number of elements in the source
+array
+.IR s .
+The behavior is the same as that of
+.BR asort() ,
+except that the array
+.I indices
+are used for sorting, not the array values.
+When done, the array is indexed numerically, and
+the values are those of the original indices.
+The original values are lost; thus provide
+a second array if you wish to preserve the original.
+The purpose of the optional string
+.I how
+is the same as described
+previously for
+.BR asort() .
+.TP
+\fBgensub(\fIr\fB, \fIs\fB, \fIh \fR[\fB, \fIt\fR]\fB)\fR
+Search the target string
+.I t
+for matches of the regular expression
+.IR r .
+If
+.I h
+is a string beginning with
+.B g
+or
+.BR G ,
+then replace all matches of
+.I r
+with
+.IR s .
+Otherwise,
+.I h
+is a number indicating which match of
+.I r
+to replace.
+If
+.I t
+is not supplied, use
+.B $0
+instead.
+Within the replacement text
+.IR s ,
+the sequence
+.BI \e n\fR,
+where
+.I n
+is a digit from 1 to 9, may be used to indicate just the text that
+matched the
+.IR n 'th
+parenthesized subexpression.  The sequence
+.B \e0
+represents the entire matched text, as does the character
+.BR & .
+Unlike
+.B sub()
+and
+.BR gsub() ,
+the modified string is returned as the result of the function,
+and the original target string is
+.I not
+changed.
+.TP "\w'\fBsprintf(\^\fIfmt\fB\^, \fIexpr-list\^\fB)\fR'u+1n"
+\fBgsub(\fIr\fB, \fIs \fR[\fB, \fIt\fR]\fB)\fR
+For each substring matching the regular expression
+.I r
+in the string
+.IR t ,
+substitute the string
+.IR s ,
+and return the number of substitutions.
+If
+.I t
+is not supplied, use
+.BR $0 .
+An
+.B &
+in the replacement text is replaced with the text that was actually matched.
+Use
+.B \e&
+to get a literal
+.BR & .
+(This must be typed as \fB"\e\e&"\fP;
+see \*(EP
+for a fuller discussion of the rules for ampersands
+and backslashes in the replacement text of
+.BR sub() ,
+.BR gsub() ,
+and
+.BR gensub() .)
+.TP
+.BI index( s , " t" )
+Return the index of the string
+.I t
+in the string
+.IR s ,
+or zero if
+.I t
+is not present.
+(This implies that character indices start at one.)
+It is a fatal error to use a regexp constant for
+.IR t .
+.TP
+\fBlength(\fR[\fIs\fR]\fB)
+Return the length of the string
+.IR s ,
+or the length of
+.B $0
+if
+.I s
+is not supplied.
+As a non-standard extension, with an array argument,
+.B length()
+returns the number of elements in the array.
+.TP
+\fBmatch(\fIs\fB, \fIr \fR[\fB, \fIa\fR]\fB)\fR
+Return the position in
+.I s
+where the regular expression
+.I r
+occurs, or zero if
+.I r
+is not present, and set the values of
+.B RSTART
+and
+.BR RLENGTH .
+Note that the argument order is the same as for the
+.B ~
+operator:
+.IB str " ~"
+.IR re .
+.ft R
+If array
+.I a
+is provided,
+.I a
+is cleared and then elements 1 through
+.I n
+are filled with the portions of
+.I s
+that match the corresponding parenthesized
+subexpression in
+.IR r .
+The zero'th element of
+.I a
+contains the portion
+of
+.I s
+matched by the entire regular expression
+.IR r .
+Subscripts
+\fBa[\fIn\^\fB, "start"]\fR,
+and
+\fBa[\fIn\^\fB, "length"]\fR
+provide the starting index in the string and length
+respectively, of each matching substring.
+.TP
+\fBpatsplit(\fIs\fB, \fIa \fR[\fB, \fIr\fR [\fB, \fIseps\fR] ]\fB)\fR
+Split the string
+.I s
+into the array
+.I a
+and the separators array
+.I seps
+on the regular expression
+.IR r ,
+and return the number of fields.
+Element values are the portions of
+.I s
+that matched
+.IR r .
+The value of
+.BI seps[ i ]
+is the possibly null separator that appeared after
+.BI a[ i ]\fR.
+The value of
+.B seps[0]
+is the possibly null leading separator.
+If
+.I r
+is omitted,
+.B FPAT
+is used instead.
+The arrays
+.I a
+and
+.I seps
+are cleared first.
+Splitting behaves identically to field splitting with
+.BR FPAT ,
+described above.
+.TP
+\fBsplit(\fIs\fB, \fIa \fR[\fB, \fIr\fR [\fB, \fIseps\fR] ]\fB)\fR
+Split the string
+.I s
+into the array
+.I a
+and the separators array
+.I seps
+on the regular expression
+.IR r ,
+and return the number of fields.  If
+.I r
+is omitted,
+.B FS
+is used instead.
+The arrays
+.I a
+and
+.I seps
+are cleared first.
+.BI seps[ i ]
+is the field separator matched by
+.I r
+between
+.BI a[ i ]
+and
+.BI a[ i +1]\fR.
+If
+.I r
+is a single space, then leading whitespace in
+.I s
+goes into the extra array element
+.B seps[0]
+and trailing whitespace goes into the extra array element
+.BI seps[ n ]\fR,
+where
+.I n
+is the return value of
+.BI split( s ", " a ", " r ", " seps )\fR.
+Splitting behaves identically to field splitting, described above.
+In particular, if
+.I r
+is a single-character string, that string acts as the separator,
+even if it happens to be a regular expression metacharacter.
+.TP
+.BI sprintf( fmt , " expr-list" )
+Print
+.I expr-list
+according to
+.IR fmt ,
+and return the resulting string.
+.TP
+.BI strtonum( str )
+Examine
+.IR str ,
+and return its numeric value.
+If
+.I str
+begins
+with a leading
+.BR 0 ,
+treat it
+as an octal number.
+If
+.I str
+begins
+with a leading
+.B 0x
+or
+.BR 0X ,
+treat it
+as a hexadecimal number.
+Otherwise, assume it is a decimal number.
+.TP
+\fBsub(\fIr\fB, \fIs \fR[\fB, \fIt\fR]\fB)\fR
+Just like
+.BR gsub() ,
+but replace only the first matching substring.
+Return either zero or one.
+.TP
+\fBsubstr(\fIs\fB, \fIi \fR[\fB, \fIn\fR]\fB)\fR
+Return the at most
+.IR n -character
+substring of
+.I s
+starting at
+.IR i .
+If
+.I n
+is omitted, use the rest of
+.IR s .
+.TP
+.BI tolower( str )
+Return a copy of the string
+.IR str ,
+with all the uppercase characters in
+.I str
+translated to their corresponding lowercase counterparts.
+Non-alphabetic characters are left unchanged.
+.TP
+.BI toupper( str )
+Return a copy of the string
+.IR str ,
+with all the lowercase characters in
+.I str
+translated to their corresponding uppercase counterparts.
+Non-alphabetic characters are left unchanged.
+.PP
+.I Gawk
+is multibyte aware.  This means that
+.BR index() ,
+.BR length() ,
+.B substr()
+and
+.B match()
+all work in terms of characters, not bytes.
+.SS Time Functions
+Since one of the primary uses of \*(AK programs is processing log files
+that contain time stamp information,
+.I gawk
+provides the following functions for obtaining time stamps and
+formatting them.
+.PP
+.TP "\w'\fBsystime()\fR'u+1n"
+\fBmktime(\fIdatespec\fR [\fB, \fIutc-flag\fR]\fB)\fR
+Turn
+.I datespec
+into a time stamp of the same form as returned by
+.BR systime() ,
+and return the result.
+The
+.I datespec
+is a string of the form
+.IR "YYYY MM DD HH MM SS[ DST]" .
+The contents of the string are six or seven numbers representing respectively
+the full year including century,
+the month from 1 to 12,
+the day of the month from 1 to 31,
+the hour of the day from 0 to 23,
+the minute from 0 to 59,
+the second from 0 to 60,
+and an optional daylight saving flag.
+The values of these numbers need not be within the ranges specified;
+for example, an hour of \-1 means 1 hour before midnight.
+The origin-zero Gregorian calendar is assumed,
+with year 0 preceding year 1 and year \-1 preceding year 0.
+If
+.I utc-flag
+is present and is non-zero or non-null, the time is assumed to be in
+the UTC time zone; otherwise, the
+time is assumed to be in the local time zone.
+If the
+.I DST
+daylight saving flag is positive,
+the time is assumed to be daylight saving time;
+if zero, the time is assumed to be standard time;
+and if negative (the default),
+.B mktime()
+attempts to determine whether daylight saving time is in effect
+for the specified time.
+If
+.I datespec
+does not contain enough elements or if the resulting time
+is out of range,
+.B mktime()
+returns \-1.
+.TP
+\fBstrftime(\fR[\fIformat \fR[\fB, \fItimestamp\fR[\fB, \fIutc-flag\fR]]]\fB)\fR
+Format
+.I timestamp
+according to the specification in
+.IR format .
+If
+.I utc-flag
+is present and is non-zero or non-null, the result
+is in UTC, otherwise the result is in local time.
+The
+.I timestamp
+should be of the same form as returned by
+.BR systime() .
+If
+.I timestamp
+is missing, the current time of day is used.
+If
+.I format
+is missing, a default format equivalent to the output of
+.IR date (1)
+is used.
+The default format is available in
+.BR PROCINFO["strftime"] .
+See the specification for the
+.B strftime()
+function in ISO C for the format conversions that are
+guaranteed to be available.
+.TP
+.B systime()
+Return the current time of day as the number of seconds since the Epoch
+(1970-01-01 00:00:00 UTC on \*(PX systems).
+.SS Bit Manipulations Functions
+.I Gawk
+supplies the following bit manipulation functions.
+They work by converting double-precision floating point
+values to
+.B uintmax_t
+integers, doing the operation, and then converting the
+result back to floating point.
+.PP
+.BR NOTE :
+Passing negative operands to any of these functions causes
+a fatal error.
+.PP
+The functions are:
+.TP "\w'\fBrshift(\fIval\fB, \fIcount\fB)\fR'u+2n"
+\fBand(\fIv1\fB, \fIv2 \fR[, ...]\fB)\fR
+Return the bitwise AND of the values provided in the argument list.
+There must be at least two.
+.TP
+\fBcompl(\fIval\fB)\fR
+Return the bitwise complement of
+.IR val .
+.TP
+\fBlshift(\fIval\fB, \fIcount\fB)\fR
+Return the value of
+.IR val ,
+shifted left by
+.I count
+bits.
+.TP
+\fBor(\fIv1\fB, \fIv2 \fR[, ...]\fB)\fR
+Return the bitwise OR of the values provided in the argument list.
+There must be at least two.
+.TP
+\fBrshift(\fIval\fB, \fIcount\fB)\fR
+Return the value of
+.IR val ,
+shifted right by
+.I count
+bits.
+.TP
+\fBxor(\fIv1\fB, \fIv2 \fR[, ...]\fB)\fR
+Return the bitwise XOR of the values provided in the argument list.
+There must be at least two.
+.PP
+.SS Type Functions
+The following functions provide type related information about
+their arguments.
+.TP \w'\fBisarray(\fIx\fB)\fR'u+1n
+\fBisarray(\fIx\fB)\fR
+Return true if
+.I x
+is an array, false otherwise.
+This function is mainly for use with the elements of multidimensional arrays
+and with function parameters.
+.TP
+\fBtypeof(\fIx\fB)\fR
+Return a string indicating the type of
+.IR x .
+The string will be one of
+\fB"array"\fP,
+\fB"number"\fP,
+\fB"regexp"\fP,
+\fB"string"\fP,
+\fB"strnum"\fP,
+\fB"unassigned"\fP,
+or
+\fB"undefined"\fP.
+.SS Internationalization Functions
+The following functions may be used from within your AWK program for
+translating strings at run-time.
+For full details, see \*(EP.
+.TP
+\fBbindtextdomain(\fIdirectory \fR[\fB, \fIdomain\fR]\fB)\fR
+Specify the directory where
+.I gawk
+looks for the
+.B \&.gmo
+files, in case they
+will not or cannot be placed in the ``standard'' locations
+(e.g., during testing).
+It returns the directory where
+.I domain
+is ``bound.''
+.sp .5
+The default
+.I domain
+is the value of
+.BR TEXTDOMAIN .
+If
+.I directory
+is the null string (\fB""\fR), then
+.B bindtextdomain()
+returns the current binding for the
+given
+.IR domain .
+.TP
+\fBdcgettext(\fIstring \fR[\fB, \fIdomain \fR[\fB, \fIcategory\fR]]\fB)\fR
+Return the translation of
+.I string
+in text domain
+.I domain
+for locale category
+.IR category .
+The default value for
+.I domain
+is the current value of
+.BR TEXTDOMAIN .
+The default value for
+.I category
+is \fB"LC_MESSAGES"\fR.
+.sp .5
+If you supply a value for
+.IR category ,
+it must be a string equal to
+one of the known locale categories described
+in \*(EP.
+You must also supply a text domain.  Use
+.B TEXTDOMAIN
+if you want to use the current domain.
+.TP
+\fBdcngettext(\fIstring1\fB, \fIstring2\fB, \fInumber \fR[\fB, \fIdomain \fR[\fB, \fIcategory\fR]]\fB)\fR
+Return the plural form used for
+.I number
+of the translation of
+.I string1
+and
+.I string2
+in
+text domain
+.I domain
+for locale category
+.IR category .
+The default value for
+.I domain
+is the current value of
+.BR TEXTDOMAIN .
+The default value for
+.I category
+is \fB"LC_MESSAGES"\fR.
+.sp .5
+If you supply a value for
+.IR category ,
+it must be a string equal to
+one of the known locale categories described
+in \*(EP.
+You must also supply a text domain.  Use
+.B TEXTDOMAIN
+if you want to use the current domain.
+.SH USER-DEFINED FUNCTIONS
+Functions in \*(AK are defined as follows:
+.PP
+.RS
+\fBfunction \fIname\fB(\fIparameter list\fB) { \fIstatements \fB}\fR
+.RE
+.PP
+Functions execute when they are called from within expressions
+in either patterns or actions.  Actual parameters supplied in the function
+call are used to instantiate the formal parameters declared in the function.
+Arrays are passed by reference, other variables are passed by value.
+.PP
+Since functions were not originally part of the \*(AK language, the provision
+for local variables is rather clumsy: They are declared as extra parameters
+in the parameter list.  The convention is to separate local variables from
+real parameters by extra spaces in the parameter list.  For example:
+.PP
+.RS
+.ft B
+.nf
+function  f(p, q,     a, b)	# a and b are local
+{
+	\&.\|.\|.
+}
+
+/abc/	{ .\|.\|. ; f(1, 2) ; .\|.\|. }
+.fi
+.ft R
+.RE
+.PP
+The left parenthesis in a function call is required
+to immediately follow the function name,
+without any intervening whitespace.
+This avoids a syntactic ambiguity with the concatenation operator.
+This restriction does not apply to the built-in functions listed above.
+.PP
+Functions may call each other and may be recursive.
+Function parameters used as local variables are initialized
+to the null string and the number zero upon function invocation.
+.PP
+Use
+.BI return " expr"
+to return a value from a function.  The return value is undefined if no
+value is provided, or if the function returns by \*(lqfalling off\*(rq the
+end.
+.PP
+As a
+.I gawk
+extension, functions may be called indirectly. To do this, assign
+the name of the function to be called, as a string, to a variable.
+Then use the variable as if it were the name of a function, prefixed with an
+.B @
+sign, like so:
+.RS
+.ft B
+.nf
+function myfunc()
+{
+	print "myfunc called"
+	\&.\|.\|.
+}
+
+{	.\|.\|.
+	the_func = "myfunc"
+	@the_func()	# call through the_func to myfunc
+	.\|.\|.
+}
+.fi
+.ft R
+.RE
+As of version 4.1.2, this works with user-defined functions,
+built-in functions, and extension functions.
+.PP
+If
+.B \-\^\-lint
+has been provided,
+.I gawk
+warns about calls to undefined functions at parse time,
+instead of at run time.
+Calling an undefined function at run time is a fatal error.
+.PP
+The word
+.B func
+may be used in place of
+.BR function ,
+although this is deprecated.
+.SH DYNAMICALLY LOADING NEW FUNCTIONS
+You can dynamically add new functions written in C or C++ to the running
+.I gawk
+interpreter with the
+.B @load
+statement.
+The full details are beyond the scope of this manual page;
+see \*(EP.
+.SH SIGNALS
+The
+.I gawk
+profiler accepts two signals.
+.B SIGUSR1
+causes it to dump a profile and function call stack to the
+profile file, which is either
+.BR awkprof.out ,
+or whatever file was named with the
+.B \-\^\-profile
+option.  It then continues to run.
+.B SIGHUP
+causes
+.I gawk
+to dump the profile and function call stack and then exit.
+.SH INTERNATIONALIZATION
+.PP
+String constants are sequences of characters enclosed in double
+quotes.  In non-English speaking environments, it is possible to mark
+strings in the \*(AK program as requiring translation to the local
+natural language. Such strings are marked in the \*(AK program with
+a leading underscore (\*(lq_\*(rq).  For example,
+.sp
+.RS
+.ft B
+gawk 'BEGIN { print "hello, world" }'
+.RE
+.sp
+.ft R
+always prints
+.BR "hello, world" .
+But,
+.sp
+.RS
+.ft B
+gawk 'BEGIN { print _"hello, world" }'
+.RE
+.sp
+.ft R
+might print
+.B "bonjour, monde"
+in France.
+.PP
+There are several steps involved in producing and running a localizable
+\*(AK program.
+.TP "\w'4.'u+2n"
+1.
+Add a
+.B BEGIN
+action to assign a value to the
+.B TEXTDOMAIN
+variable to set the text domain to a name associated with your program:
+.sp
+.in +5m
+.ft B
+BEGIN { TEXTDOMAIN = "myprog" }
+.ft R
+.in -5m
+.sp
+This allows
+.I gawk
+to find the
+.B \&.gmo
+file associated with your program.
+Without this step,
+.I gawk
+uses the
+.B messages
+text domain,
+which likely does not contain translations for your program.
+.TP
+2.
+Mark all strings that should be translated with leading underscores.
+.TP
+3.
+If necessary, use the
+.B dcgettext()
+and/or
+.B bindtextdomain()
+functions in your program, as appropriate.
+.TP
+4.
+Run
+.B "gawk \-\^\-gen\-pot \-f myprog.awk > myprog.pot"
+to generate a
+.B \&.pot
+file for your program.
+.TP
+5.
+Provide appropriate translations, and build and install the corresponding
+.B \&.gmo
+files.
+.PP
+The internationalization features are described in full detail in \*(EP.
+.SH POSIX COMPATIBILITY
+A primary goal for
+.I gawk
+is compatibility with the \*(PX standard, as well as with the
+latest version of Brian Kernighan's
+.IR awk .
+To this end,
+.I gawk
+incorporates the following user visible
+features which are not described in the \*(AK book,
+but are part of the Brian Kernighan's version of
+.IR awk ,
+and are in the \*(PX standard.
+.PP
+The book indicates that command line variable assignment happens when
+.I awk
+would otherwise open the argument as a file, which is after the
+.B BEGIN
+rule is executed.  However, in earlier implementations, when such an
+assignment appeared before any file names, the assignment would happen
+.I before
+the
+.B BEGIN
+rule was run.  Applications came to depend on this \*(lqfeature.\*(rq
+When
+.I awk
+was changed to match its documentation, the
+.B \-v
+option for assigning variables before program execution was added to
+accommodate applications that depended upon the old behavior.
+(This feature was agreed upon by both the Bell Laboratories developers
+and the \*(GN developers.)
+.PP
+When processing arguments,
+.I gawk
+uses the special option \*(lq\-\^\-\*(rq to signal the end of
+arguments.
+In compatibility mode, it warns about but otherwise ignores
+undefined options.
+In normal operation, such arguments are passed on to the \*(AK program for
+it to process.
+.PP
+The \*(AK book does not define the return value of
+.BR srand() .
+The \*(PX standard
+has it return the seed it was using, to allow keeping track
+of random number sequences.  Therefore
+.B srand()
+in
+.I gawk
+also returns its current seed.
+.PP
+Other features are:
+The use of multiple
+.B \-f
+options (from MKS
+.IR awk );
+the
+.B ENVIRON
+array; the
+.BR \ea ,
+and
+.B \ev
+escape sequences (done originally in
+.I gawk
+and fed back into the Bell Laboratories version); the
+.B tolower()
+and
+.B toupper()
+built-in functions (from the Bell Laboratories version); and the ISO C conversion specifications in
+.B printf
+(done first in the Bell Laboratories version).
+.SH HISTORICAL FEATURES
+There is one feature of historical \*(AK implementations that
+.I gawk
+supports:
+It is possible to call the
+.B length()
+built-in function not only with no argument, but even without parentheses!
+Thus,
+.RS
+.PP
+.ft B
+a = length	# Holy Algol 60, Batman!
+.ft R
+.RE
+.PP
+is the same as either of
+.RS
+.PP
+.ft B
+a = length()
+.br
+a = length($0)
+.ft R
+.RE
+.PP
+Using this feature is poor practice, and
+.I gawk
+issues a warning about its use if
+.B \-\^\-lint
+is specified on the command line.
+.SH GNU EXTENSIONS
+.I Gawk
+has a too-large number of extensions to \*(PX
+.IR awk .
+They are described in this section.  All the extensions described here
+can be disabled by
+invoking
+.I gawk
+with the
+.B \-\^\-traditional
+or
+.B \-\^\-posix
+options.
+.PP
+The following features of
+.I gawk
+are not available in
+\*(PX
+.IR awk .
+.\" Environment vars and startup stuff
+.TP "\w'\(bu'u+1n"
+\(bu
+No path search is performed for files named via the
+.B \-f
+option.  Therefore the
+.B AWKPATH
+environment variable is not special.
+.\" POSIX and language recognition issues
+.TP
+\(bu
+There is no facility for doing file inclusion
+.RI ( gawk 's
+.B @include
+mechanism).
+.TP
+\(bu
+There is no facility for dynamically adding new functions
+written in C
+.RI ( gawk 's
+.B @load
+mechanism).
+.TP
+\(bu
+The
+.B \ex
+escape sequence.
+.TP
+\(bu
+The ability to continue lines after
+.B ?
+and
+.BR : .
+.TP
+\(bu
+Octal and hexadecimal constants in AWK programs.
+.\" Special variables
+.TP
+\(bu
+The
+.BR ARGIND ,
+.BR BINMODE ,
+.BR ERRNO ,
+.BR LINT ,
+.BR PREC ,
+.BR ROUNDMODE ,
+.B  RT
+and
+.B  TEXTDOMAIN
+variables are not special.
+.TP
+\(bu
+The
+.B IGNORECASE
+variable and its side-effects are not available.
+.TP
+\(bu
+The
+.B FIELDWIDTHS
+variable and fixed-width field splitting.
+.TP
+\(bu
+The
+.B FPAT
+variable and field splitting based on field values.
+.TP
+\(bu
+The
+.BR FUNCTAB ,
+.BR SYMTAB ,
+and
+.B PROCINFO
+arrays are not available.
+.\" I/O stuff
+.TP
+\(bu
+The use of
+.B RS
+as a regular expression.
+.TP
+\(bu
+The special file names available for I/O redirection are not recognized.
+.TP
+\(bu
+The
+.B |&
+operator for creating coprocesses.
+.TP
+\(bu
+The
+.B BEGINFILE
+and
+.B ENDFILE
+special patterns are not available.
+.\" Changes to standard awk functions
+.TP
+\(bu
+The ability to split out individual characters using the null string
+as the value of
+.BR FS ,
+and as the third argument to
+.BR split() .
+.TP
+\(bu
+An optional fourth argument to
+.B split()
+to receive the separator texts.
+.TP
+\(bu
+The optional second argument to the
+.B close()
+function.
+.TP
+\(bu
+The optional third argument to the
+.B match()
+function.
+.TP
+\(bu
+The ability to use positional specifiers with
+.B printf
+and
+.BR sprintf() .
+.TP
+\(bu
+The ability to pass an array to
+.BR length() .
+.\" New keywords or changes to keywords
+.\" (As of 2012, these are in POSIX)
+.\" .TP
+.\" \(bu
+.\" The use of
+.\" .BI delete " array"
+.\" to delete the entire contents of an array.
+.\" .TP
+.\" \(bu
+.\" The use of
+.\" .B "nextfile"
+.\" to abandon processing of the current input file.
+.\" New functions
+.TP
+\(bu
+The
+.BR and() ,
+.BR asort() ,
+.BR asorti() ,
+.BR bindtextdomain() ,
+.BR compl() ,
+.BR dcgettext() ,
+.BR dcngettext() ,
+.BR gensub() ,
+.BR lshift() ,
+.BR mktime() ,
+.BR or() ,
+.BR patsplit() ,
+.BR rshift() ,
+.BR strftime() ,
+.BR strtonum() ,
+.B systime()
+and
+.B xor()
+functions.
+.\" I18N stuff
+.TP
+\(bu
+Localizable strings.
+.TP
+\(bu
+Non-fatal I/O.
+.TP
+\(bu
+Retryable I/O.
+.PP
+The \*(AK book does not define the return value of the
+.B close()
+function.
+.IR Gawk\^ "'s"
+.B close()
+returns the value from
+.IR fclose (3),
+or
+.IR pclose (3),
+when closing an output file or pipe, respectively.
+It returns the process's exit status when closing an input pipe.
+The return value is \-1 if the named file, pipe
+or coprocess was not opened with a redirection.
+.PP
+When
+.I gawk
+is invoked with the
+.B \-\^\-traditional
+option,
+if the
+.I fs
+argument to the
+.B \-F
+option is \*(lqt\*(rq, then
+.B FS
+is set to the tab character.
+Note that typing
+.B "gawk \-F\et \&.\|.\|."
+simply causes the shell to quote the \*(lqt,\*(rq and does not pass
+\*(lq\et\*(rq to the
+.B \-F
+option.
+Since this is a rather ugly special case, it is not the default behavior.
+This behavior also does not occur if
+.B \-\^\-posix
+has been specified.
+To really get a tab character as the field separator, it is best to use
+single quotes:
+.BR "gawk \-F'\et' \&.\|.\|." .
+.ig
+.PP
+If
+.I gawk
+was compiled for debugging, it
+accepts the following additional options:
+.TP
+.PD 0
+.B \-Y
+.TP
+.PD
+.B \-\^\-parsedebug
+Turn on
+.IR yacc (1)
+or
+.IR bison (1)
+debugging output during program parsing.
+This option should only be of interest to the
+.I gawk
+maintainers, and may not even be compiled into
+.IR gawk .
+..
+.SH ENVIRONMENT VARIABLES
+The
+.B AWKPATH
+environment variable can be used to provide a list of directories that
+.I gawk
+searches when looking for files named via the
+.BR \-f ,
+.BR \-\^\-file ,
+.B \-i
+and
+.B \-\^\-include
+options, and the
+.B @include
+directive.  If the initial search fails, the path is searched again after
+appending
+.B \&.awk
+to the filename.
+.PP
+The
+.B AWKLIBPATH
+environment variable can be used to provide a list of directories that
+.I gawk
+searches when looking for files named via the
+.B \-l
+and
+.B \-\^\-load
+options.
+.PP
+The
+.B GAWK_READ_TIMEOUT
+environment variable can be used to specify a timeout
+in milliseconds for reading input from a terminal, pipe
+or two-way communication including sockets.
+.PP
+For connection to a remote host via socket,
+.B GAWK_SOCK_RETRIES
+controls the number of retries, and
+.B GAWK_MSEC_SLEEP
+the interval between retries.
+The interval is in milliseconds. On systems that do not support
+.IR usleep (3),
+the value is rounded up to an integral number of seconds.
+.PP
+If
+.B POSIXLY_CORRECT
+exists in the environment, then
+.I gawk
+behaves exactly as if
+.B \-\^\-posix
+had been specified on the command line.
+If
+.B \-\^\-lint
+has been specified,
+.I gawk
+issues a warning message to this effect.
+.SH EXIT STATUS
+If the
+.B exit
+statement is used with a value,
+then
+.I gawk
+exits with
+the numeric value given to it.
+.PP
+Otherwise, if there were no problems during execution,
+.I gawk
+exits with the value of the C constant
+.BR EXIT_SUCCESS .
+This is usually zero.
+.PP
+If an error occurs,
+.I gawk
+exits with the value of
+the C constant
+.BR EXIT_FAILURE .
+This is usually one.
+.PP
+If
+.I gawk
+exits because of a fatal error, the exit
+status is 2.  On non-POSIX systems, this value may be mapped to
+.BR EXIT_FAILURE .
+.SH VERSION INFORMATION
+This man page documents
+.IR gawk ,
+version 5.0.
+.SH AUTHORS
+The original version of \*(UX
+.I awk
+was designed and implemented by Alfred Aho,
+Peter Weinberger, and Brian Kernighan of Bell Laboratories.  Brian Kernighan
+continues to maintain and enhance it.
+.PP
+Paul Rubin and Jay Fenlason,
+of the Free Software Foundation, wrote
+.IR gawk ,
+to be compatible with the original version of
+.I awk
+distributed in Seventh Edition \*(UX.
+John Woods contributed a number of bug fixes.
+David Trueman, with contributions
+from Arnold Robbins, made
+.I gawk
+compatible with the new version of \*(UX
+.IR awk .
+Arnold Robbins is the current maintainer.
+.PP
+See \*(EP for a full list of the contributors to
+.I gawk
+and its documentation.
+.PP
+See the
+.B README
+file in the
+.I gawk
+distribution for up-to-date information about maintainers
+and which ports are currently supported.
+.SH BUG REPORTS
+If you find a bug in
+.IR gawk ,
+please send electronic mail to
+.BR \%bug-gawk@gnu.org .
+Please include your operating system and its revision, the version of
+.I gawk
+(from
+.BR "gawk \-\^\-version" ),
+which C compiler you used to compile it, and a test program
+and data that are as small as possible for reproducing the problem.
+.PP
+Before sending a bug report, please do the following things.  First, verify that
+you have the latest version of
+.IR gawk .
+Many bugs (usually subtle ones) are fixed at each release, and if
+yours is out of date, the problem may already have been solved.
+Second, please see if setting the environment variable
+.B LC_ALL
+to
+.B LC_ALL=C
+causes things to behave as you expect. If so, it's a locale issue,
+and may or may not really be a bug.
+Finally, please read this man page and the reference manual carefully to
+be sure that what you think is a bug really is, instead of just a quirk
+in the language.
+.PP
+Whatever you do, do
+.B NOT
+post a bug report in
+.BR comp.lang.awk .
+While the
+.I gawk
+developers occasionally read this newsgroup, posting bug reports there
+is an unreliable way to report bugs.
+Similarly, do
+.B NOT
+use a web forum (such as Stack Overflow) for reporting bugs.
+Instead, please use the electronic mail
+addresses given above.
+Really.
+.PP
+If you're using a GNU/Linux or BSD-based system,
+you may wish to submit a bug report to the vendor of your distribution.
+That's fine, but please send a copy to the official email address as well,
+since there's no guarantee that the bug report will be forwarded to the
+.I gawk
+maintainer.
+.SH BUGS
+The
+.B \-F
+option is not necessary given the command line variable assignment feature;
+it remains only for backwards compatibility.
+.SH SEE ALSO
+.IR egrep (1),
+.IR sed (1),
+.IR getpid (2),
+.IR getppid (2),
+.IR getpgrp (2),
+.IR getuid (2),
+.IR geteuid (2),
+.IR getgid (2),
+.IR getegid (2),
+.IR getgroups (2),
+.IR printf (3),
+.IR strftime (3),
+.IR usleep (3)
+.PP
+.IR "The AWK Programming Language" ,
+Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger,
+Addison-Wesley, 1988.  ISBN 0-201-07981-X.
+.PP
+\*(EP,
+Edition 5.0, shipped with the
+.I gawk
+source.
+The current version of this document is available online at
+.BR https://www.gnu.org/software/gawk/manual .
+.PP
+The GNU
+.B gettext
+documentation, available online at
+.BR https://www.gnu.org/software/gettext .
+.SH EXAMPLES
+.nf
+Print and sort the login names of all users:
+
+.ft B
+	BEGIN	{ FS = ":" }
+		{ print $1 | "sort" }
+
+.ft R
+Count lines in a file:
+
+.ft B
+		{ nlines++ }
+	END	{ print nlines }
+
+.ft R
+Precede each line by its number in the file:
+
+.ft B
+	{ print FNR, $0 }
+
+.ft R
+Concatenate and line number (a variation on a theme):
+
+.ft B
+	{ print NR, $0 }
+
+.ft R
+Run an external command for particular lines of data:
+
+.ft B
+	tail \-f access_log |
+	awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }'
+.ft R
+.fi
+.SH ACKNOWLEDGEMENTS
+Brian Kernighan
+provided valuable assistance during testing and debugging.
+We thank him.
+.SH COPYING PERMISSIONS
+Copyright \(co 1989, 1991, 1992, 1993, 1994, 1995, 1996,
+1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2007, 2009,
+2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
diff --git a/gawk-5.0.1/doc/gawk.texi b/gawk-5.0.1/doc/gawk.texi
new file mode 100644
index 00000000000..d3f7d8dd43f
--- /dev/null
+++ b/gawk-5.0.1/doc/gawk.texi
@@ -0,0 +1,45233 @@
+% ****************************************************
+% * DO NOT MODIFY THIS FILE!!!!                      *
+% * It was generated from gawktexi.in by sidebar.awk *
+% * Edit gawktexi.in instead.                        *
+% ****************************************************
+\input texinfo   @c -*-texinfo-*-
+@c vim: filetype=texinfo
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename gawk.info
+@settitle The GNU Awk User's Guide
+@c %**end of header (This is for running Texinfo on a region.)
+
+@dircategory Text creation and manipulation
+@direntry
+* Gawk: (gawk).                 A text scanning and processing language.
+@end direntry
+@dircategory Individual utilities
+@direntry
+* awk: (gawk)Invoking Gawk.                     Text scanning and processing.
+@end direntry
+
+@ifset FOR_PRINT
+@tex
+\gdef\xrefprintnodename#1{``#1''}
+@end tex
+@end ifset
+
+@ifclear FOR_PRINT
+@c With early 2014 texinfo.tex, restore PDF links and colors
+@tex
+\gdef\linkcolor{0.5 0.09 0.12} % Dark Red
+\gdef\urlcolor{0.5 0.09 0.12} % Also
+\global\urefurlonlylinktrue
+@end tex
+@end ifclear
+
+@ifnotdocbook
+@set BULLET @bullet{}
+@set MINUS @minus{}
+@end ifnotdocbook
+
+@ifdocbook
+@set BULLET
+@set MINUS
+@end ifdocbook
+
+@iftex
+@set TIMES @times
+@end iftex
+@ifnottex
+@set TIMES *
+@end ifnottex
+        
+@c Let texinfo.tex give us full section titles
+@xrefautomaticsectiontitle on
+
+@c The following information should be updated here only!
+@c This sets the edition of the document, the version of gawk it
+@c applies to and all the info about who's publishing this edition
+
+@c These apply across the board.
+@set UPDATE-MONTH June, 2019
+@set VERSION 5.0
+@set PATCHLEVEL 1
+
+@set GAWKINETTITLE TCP/IP Internetworking with @command{gawk}
+@ifset FOR_PRINT
+@set TITLE Effective awk Programming
+@end ifset
+@ifclear FOR_PRINT
+@set TITLE GAWK: Effective AWK Programming
+@end ifclear
+@set SUBTITLE A User's Guide for GNU Awk
+@set EDITION 5.0
+
+@iftex
+@set DOCUMENT book
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER @inmargin{@image{lflashlight,1cm}, @image{rflashlight,1cm}}
+@set COMMONEXT (c.e.)
+@set PAGE page
+@end iftex
+@ifinfo
+@set DOCUMENT Info file
+@set CHAPTER major node
+@set APPENDIX major node
+@set SECTION minor node
+@set SUBSECTION node
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE screen
+@end ifinfo
+@ifhtml
+@set DOCUMENT Web page
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE screen
+@end ifhtml
+@ifdocbook
+@set DOCUMENT book
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE page
+@end ifdocbook
+@ifxml
+@set DOCUMENT book
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE page
+@end ifxml
+@ifplaintext
+@set DOCUMENT book
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE page
+@end ifplaintext
+
+@ifdocbook
+@c empty on purpose
+@set PART1
+@set PART2
+@set PART3
+@set PART4
+@end ifdocbook
+
+@ifnotdocbook
+@set PART1 Part I:@*
+@set PART2 Part II:@*
+@set PART3 Part III:@*
+@set PART4 Part IV:@*
+@end ifnotdocbook
+
+@c some special symbols
+@iftex
+@set LEQ @math{@leq}
+@set PI @math{@pi}
+@end iftex
+@ifdocbook
+@set LEQ @inlineraw{docbook, &le;}
+@set PI @inlineraw{docbook, &pgr;}
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@set LEQ <=
+@set PI @i{pi}
+@end ifnotdocbook
+@end ifnottex
+
+@ifnottex
+@ifnotdocbook
+@macro ii{text}
+@i{\text\}
+@end macro
+@end ifnotdocbook
+@end ifnottex
+
+@ifdocbook
+@macro ii{text}
+@inlineraw{docbook,<lineannotation>\text\</lineannotation>}
+@end macro
+@end ifdocbook
+
+@ifclear FOR_PRINT
+@set FN file name
+@set FFN File name
+@set DF data file
+@set DDF Data file
+@set PVERSION version
+@end ifclear
+@ifset FOR_PRINT
+@set FN filename
+@set FFN Filename
+@set DF datafile
+@set DDF Datafile
+@set PVERSION version
+@end ifset
+
+@c For HTML, spell out email addresses, to avoid problems with
+@c address harvesters for spammers.
+@ifhtml
+@macro EMAIL{real,spelled}
+``\spelled\''
+@end macro
+@end ifhtml
+@ifnothtml
+@macro EMAIL{real,spelled}
+@email{\real\}
+@end macro
+@end ifnothtml
+
+@c Indexing macros
+@ifinfo
+
+@macro cindexawkfunc{name}
+@cindex @code{\name\}
+@end macro
+
+@macro cindexgawkfunc{name}
+@cindex @code{\name\}
+@end macro
+
+@end ifinfo
+
+@ifnotinfo
+
+@macro cindexawkfunc{name}
+@cindex @code{\name\()} function
+@end macro
+
+@macro cindexgawkfunc{name}
+@cindex @code{\name\()} function (@command{gawk})
+@end macro
+@end ifnotinfo
+
+@ignore
+Some comments on the layout for TeX.
+1. Use at least texinfo.tex 2016-02-05.07.
+@end ignore
+
+@c merge the function and variable indexes into the concept index
+@ifinfo
+@synindex fn cp
+@synindex vr cp
+@end ifinfo
+@iftex
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end iftex
+@ifxml
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end ifxml
+@ifdocbook
+@synindex fn cp
+@synindex vr cp
+@end ifdocbook
+
+@c If "finalout" is commented out, the printed output will show
+@c black boxes that mark lines that are too long.  Thus, it is
+@c unwise to comment it out when running a master in case there are
+@c overfulls which are deemed okay.
+
+@iftex
+@finalout
+@end iftex
+
+@copying
+@docbook
+<para>
+&ldquo;To boldly go where no man has gone before&rdquo; is a
+Registered Trademark of Paramount Pictures Corporation.</para>
+
+<para>Published by:</para>
+
+<literallayout class="normal">Free Software Foundation
+51 Franklin Street, Fifth Floor
+Boston, MA  02110-1301 USA
+Phone: +1-617-542-5942
+Fax: +1-617-542-2652
+Email: <email>gnu@@gnu.org</email>
+URL: <ulink url="https://www.gnu.org">https://www.gnu.org/</ulink></literallayout>
+
+<literallayout class="normal">Copyright &copy; 1989, 1991, 1992, 1993, 1996&ndash;2005, 2007, 2009&ndash;2019
+Free Software Foundation, Inc.
+All Rights Reserved.</literallayout>
+@end docbook
+
+@ifnotdocbook
+Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2019 @*
+Free Software Foundation, Inc.
+@end ifnotdocbook
+@sp 2
+
+This is Edition @value{EDITION} of @cite{@value{TITLE}: @value{SUBTITLE}},
+for the @value{VERSION}.@value{PATCHLEVEL} (or later) version of the GNU
+implementation of AWK.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``GNU General Public License'', with the
+Front-Cover Texts being ``A GNU Manual'', and with the Back-Cover Texts
+as in (a) below.
+@ifclear FOR_PRINT
+A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+@end ifclear
+@ifset FOR_PRINT
+A copy of the license
+may be found on the Internet at
+@uref{https://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html,
+the GNU Project's website}.
+@end ifset
+
+@enumerate a
+@item
+The FSF's Back-Cover Text is: ``You have the freedom to
+copy and modify this GNU manual.''
+@end enumerate
+@end copying
+
+@c Comment out the "smallbook" for technical review.  Saves
+@c considerable paper.  Remember to turn it back on *before*
+@c starting the page-breaking work.
+
+@c 4/2002: Karl Berry recommends commenting out this and the
+@c `@setchapternewpage odd', and letting users use `texi2dvi -t'
+@c if they want to waste paper.
+@c @smallbook
+
+
+@c Uncomment this for the release.  Leaving it off saves paper
+@c during editing and review.
+@setchapternewpage odd
+
+@shorttitlepage GNU Awk
+@titlepage
+@title @value{TITLE}
+@subtitle @value{SUBTITLE}
+@subtitle Edition @value{EDITION}
+@subtitle @value{UPDATE-MONTH}
+@author Arnold D. Robbins
+
+@ifnotdocbook
+@c Include the Distribution inside the titlepage environment so
+@c that headings are turned off.  Headings on and off do not work.
+
+@page
+@vskip 0pt plus 1filll
+``To boldly go where no man has gone before'' is a
+Registered Trademark of Paramount Pictures Corporation. @*
+@c sorry, i couldn't resist
+@sp 3
+Published by:
+@sp 1
+
+Free Software Foundation @*
+51 Franklin Street, Fifth Floor @*
+Boston, MA  02110-1301 USA @*
+Phone: +1-617-542-5942 @*
+Fax: +1-617-542-2652 @*
+Email: @email{gnu@@gnu.org} @*
+URL: @uref{https://www.gnu.org/} @*
+
+@c This one is correct for gawk 3.1.0 from the FSF
+ISBN 1-882114-28-0 @*
+@sp 2
+@insertcopying
+@end ifnotdocbook
+@end titlepage
+
+@c Thanks to Bob Chassell for directions on doing dedications.
+@iftex
+@headings off
+@page
+@w{ }
+@sp 9
+@center @i{To my parents, for their love, and for the wonderful example they set for me.}
+@sp 1
+@center @i{To my wife, Miriam, for making me complete.
+Thank you for building your life together with me.}
+@sp 1
+@center @i{To our children, Chana, Rivka, Nachum, and Malka, for enrichening our lives in innumerable ways.}
+@sp 1
+@w{ }
+@page
+@w{ }
+@page
+@headings on
+@end iftex
+
+@docbook
+<dedication>
+<para>To my parents, for their love, and for the wonderful
+example they set for me.</para>
+<para>To my wife Miriam, for making me complete.
+Thank you for building your life together with me.</para>
+<para>To our children Chana, Rivka, Nachum and Malka,
+for enrichening our lives in innumerable ways.</para>
+</dedication>
+@end docbook
+
+@iftex
+@headings off
+@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @|
+@oddheading  @| @| @strong{@thischapter}@ @ @ @thispage
+@end iftex
+
+@ifnottex
+@ifnotxml
+@ifnotdocbook
+@node Top
+@top General Introduction
+@c Preface node should come right after the Top
+@c node, in `unnumbered' sections, then the chapter, `What is gawk'.
+@c Licensing nodes are appendices, they're not central to AWK.
+
+This file documents @command{awk}, a program that you can use to select
+particular records in a file and perform operations upon them.
+
+@insertcopying
+
+@end ifnotdocbook
+@end ifnotxml
+@end ifnottex
+
+@menu
+* Foreword3::                      Some nice words about this
+                                   @value{DOCUMENT}.
+* Foreword4::                      More nice words.
+* Preface::                        What this @value{DOCUMENT} is about; brief
+                                   history and acknowledgments.
+* Getting Started::                A basic introduction to using
+                                   @command{awk}. How to run an @command{awk}
+                                   program. Command-line syntax.
+* Invoking Gawk::                  How to run @command{gawk}.
+* Regexp::                         All about matching things using regular
+                                   expressions.
+* Reading Files::                  How to read files and manipulate fields.
+* Printing::                       How to print using @command{awk}. Describes
+                                   the @code{print} and @code{printf}
+                                   statements. Also describes redirection of
+                                   output.
+* Expressions::                    Expressions are the basic building blocks
+                                   of statements.
+* Patterns and Actions::           Overviews of patterns and actions.
+* Arrays::                         The description and use of arrays. Also
+                                   includes array-oriented control statements.
+* Functions::                      Built-in and user-defined functions.
+* Library Functions::              A Library of @command{awk} Functions.
+* Sample Programs::                Many @command{awk} programs with complete
+                                   explanations.
+* Advanced Features::              Stuff for advanced users, specific to
+                                   @command{gawk}.
+* Internationalization::           Getting @command{gawk} to speak your
+                                   language.
+* Debugger::                       The @command{gawk} debugger.
+* Namespaces::                     How namespaces work in @command{gawk}.
+* Arbitrary Precision Arithmetic:: Arbitrary precision arithmetic with
+                                   @command{gawk}.
+* Dynamic Extensions::             Adding new built-in functions to
+                                   @command{gawk}.
+* Language History::               The evolution of the @command{awk}
+                                   language.
+* Installation::                   Installing @command{gawk} under various
+                                   operating systems.
+* Notes::                          Notes about adding things to @command{gawk}
+                                   and possible future work.
+* Basic Concepts::                 A very quick introduction to programming
+                                   concepts.
+* Glossary::                       An explanation of some unfamiliar terms.
+* Copying::                        Your right to copy and distribute
+                                   @command{gawk}.
+* GNU Free Documentation License:: The license for this @value{DOCUMENT}.
+* Index::                          Concept and Variable Index.
+
+@detailmenu
+* History::                             The history of @command{gawk} and
+                                        @command{awk}.
+* Names::                               What name to use to find
+                                        @command{awk}.
+* This Manual::                         Using this @value{DOCUMENT}. Includes
+                                        sample input files that you can use.
+* Conventions::                         Typographical Conventions.
+* Manual History::                      Brief history of the GNU project and
+                                        this @value{DOCUMENT}.
+* How To Contribute::                   Helping to save the world.
+* Acknowledgments::                     Acknowledgments.
+* Running gawk::                        How to run @command{gawk} programs;
+                                        includes command-line syntax.
+* One-shot::                            Running a short throwaway
+                                        @command{awk} program.
+* Read Terminal::                       Using no input files (input from the
+                                        keyboard instead).
+* Long::                                Putting permanent @command{awk}
+                                        programs in files.
+* Executable Scripts::                  Making self-contained @command{awk}
+                                        programs.
+* Comments::                            Adding documentation to @command{gawk}
+                                        programs.
+* Quoting::                             More discussion of shell quoting
+                                        issues.
+* DOS Quoting::                         Quoting in Windows Batch Files.
+* Sample Data Files::                   Sample data files for use in the
+                                        @command{awk} programs illustrated in
+                                        this @value{DOCUMENT}.
+* Very Simple::                         A very simple example.
+* Two Rules::                           A less simple one-line example using
+                                        two rules.
+* More Complex::                        A more complex example.
+* Statements/Lines::                    Subdividing or combining statements
+                                        into lines.
+* Other Features::                      Other Features of @command{awk}.
+* When::                                When to use @command{gawk} and when to
+                                        use other things.
+* Intro Summary::                       Summary of the introduction.
+* Command Line::                        How to run @command{awk}.
+* Options::                             Command-line options and their
+                                        meanings.
+* Other Arguments::                     Input file names and variable
+                                        assignments.
+* Naming Standard Input::               How to specify standard input with
+                                        other files.
+* Environment Variables::               The environment variables
+                                        @command{gawk} uses.
+* AWKPATH Variable::                    Searching directories for
+                                        @command{awk} programs.
+* AWKLIBPATH Variable::                 Searching directories for
+                                        @command{awk} shared libraries.
+* Other Environment Variables::         The environment variables.
+* Exit Status::                         @command{gawk}'s exit status.
+* Include Files::                       Including other files into your
+                                        program.
+* Loading Shared Libraries::            Loading shared libraries into your
+                                        program.
+* Obsolete::                            Obsolete Options and/or features.
+* Undocumented::                        Undocumented Options and Features.
+* Invoking Summary::                    Invocation summary.
+* Regexp Usage::                        How to Use Regular Expressions.
+* Escape Sequences::                    How to write nonprinting characters.
+* Regexp Operators::                    Regular Expression Operators.
+* Regexp Operator Details::             The actual details.
+* Interval Expressions::                Notes on interval expressions.
+* Bracket Expressions::                 What can go between @samp{[...]}.
+* Leftmost Longest::                    How much text matches.
+* Computed Regexps::                    Using Dynamic Regexps.
+* GNU Regexp Operators::                Operators specific to GNU software.
+* Case-sensitivity::                    How to do case-insensitive matching.
+* Regexp Summary::                      Regular expressions summary.
+* Records::                             Controlling how data is split into
+                                        records.
+* awk split records::                   How standard @command{awk} splits
+                                        records.
+* gawk split records::                  How @command{gawk} splits records.
+* Fields::                              An introduction to fields.
+* Nonconstant Fields::                  Nonconstant Field Numbers.
+* Changing Fields::                     Changing the Contents of a Field.
+* Field Separators::                    The field separator and how to change
+                                        it.
+* Default Field Splitting::             How fields are normally separated.
+* Regexp Field Splitting::              Using regexps as the field separator.
+* Single Character Fields::             Making each character a separate
+                                        field.
+* Command Line Field Separator::        Setting @code{FS} from the command
+                                        line.
+* Full Line Fields::                    Making the full line be a single
+                                        field.
+* Field Splitting Summary::             Some final points and a summary table.
+* Constant Size::                       Reading constant width data.
+* Fixed width data::                    Processing fixed-width data.
+* Skipping intervening::                Skipping intervening fields.
+* Allowing trailing data::              Capturing optional trailing data.
+* Fields with fixed data::              Field values with fixed-width data.
+* Splitting By Content::                Defining Fields By Content
+* Testing field creation::              Checking how @command{gawk} is
+                                        splitting records.
+* Multiple Line::                       Reading multiline records.
+* Getline::                             Reading files under explicit program
+                                        control using the @code{getline}
+                                        function.
+* Plain Getline::                       Using @code{getline} with no
+                                        arguments.
+* Getline/Variable::                    Using @code{getline} into a variable.
+* Getline/File::                        Using @code{getline} from a file.
+* Getline/Variable/File::               Using @code{getline} into a variable
+                                        from a file.
+* Getline/Pipe::                        Using @code{getline} from a pipe.
+* Getline/Variable/Pipe::               Using @code{getline} into a variable
+                                        from a pipe.
+* Getline/Coprocess::                   Using @code{getline} from a coprocess.
+* Getline/Variable/Coprocess::          Using @code{getline} into a variable
+                                        from a coprocess.
+* Getline Notes::                       Important things to know about
+                                        @code{getline}.
+* Getline Summary::                     Summary of @code{getline} Variants.
+* Read Timeout::                        Reading input with a timeout.
+* Retrying Input::                      Retrying input after certain errors.
+* Command-line directories::            What happens if you put a directory on
+                                        the command line.
+* Input Summary::                       Input summary.
+* Input Exercises::                     Exercises.
+* Print::                               The @code{print} statement.
+* Print Examples::                      Simple examples of @code{print}
+                                        statements.
+* Output Separators::                   The output separators and how to
+                                        change them.
+* OFMT::                                Controlling Numeric Output With
+                                        @code{print}.
+* Printf::                              The @code{printf} statement.
+* Basic Printf::                        Syntax of the @code{printf} statement.
+* Control Letters::                     Format-control letters.
+* Format Modifiers::                    Format-specification modifiers.
+* Printf Examples::                     Several examples.
+* Redirection::                         How to redirect output to multiple
+                                        files and pipes.
+* Special FD::                          Special files for I/O.
+* Special Files::                       File name interpretation in
+                                        @command{gawk}. @command{gawk} allows
+                                        access to inherited file descriptors.
+* Other Inherited Files::               Accessing other open files with
+                                        @command{gawk}.
+* Special Network::                     Special files for network
+                                        communications.
+* Special Caveats::                     Things to watch out for.
+* Close Files And Pipes::               Closing Input and Output Files and
+                                        Pipes.
+* Nonfatal::                            Enabling Nonfatal Output.
+* Output Summary::                      Output summary.
+* Output Exercises::                    Exercises.
+* Values::                              Constants, Variables, and Regular
+                                        Expressions.
+* Constants::                           String, numeric and regexp constants.
+* Scalar Constants::                    Numeric and string constants.
+* Nondecimal-numbers::                  What are octal and hex numbers.
+* Regexp Constants::                    Regular Expression constants.
+* Using Constant Regexps::              When and how to use a regexp constant.
+* Standard Regexp Constants::           Regexp constants in standard
+                                        @command{awk}.
+* Strong Regexp Constants::             Strongly typed regexp constants.
+* Variables::                           Variables give names to values for
+                                        later use.
+* Using Variables::                     Using variables in your programs.
+* Assignment Options::                  Setting variables on the command line
+                                        and a summary of command-line syntax.
+                                        This is an advanced method of input.
+* Conversion::                          The conversion of strings to numbers
+                                        and vice versa.
+* Strings And Numbers::                 How @command{awk} Converts Between
+                                        Strings And Numbers.
+* Locale influences conversions::       How the locale may affect conversions.
+* All Operators::                       @command{gawk}'s operators.
+* Arithmetic Ops::                      Arithmetic operations (@samp{+},
+                                        @samp{-}, etc.)
+* Concatenation::                       Concatenating strings.
+* Assignment Ops::                      Changing the value of a variable or a
+                                        field.
+* Increment Ops::                       Incrementing the numeric value of a
+                                        variable.
+* Truth Values and Conditions::         Testing for true and false.
+* Truth Values::                        What is ``true'' and what is
+                                        ``false''.
+* Typing and Comparison::               How variables acquire types and how
+                                        this affects comparison of numbers and
+                                        strings with @samp{<}, etc.
+* Variable Typing::                     String type versus numeric type.
+* Comparison Operators::                The comparison operators.
+* POSIX String Comparison::             String comparison with POSIX rules.
+* Boolean Ops::                         Combining comparison expressions using
+                                        boolean operators @samp{||} (``or''),
+                                        @samp{&&} (``and'') and @samp{!}
+                                        (``not'').
+* Conditional Exp::                     Conditional expressions select between
+                                        two subexpressions under control of a
+                                        third subexpression.
+* Function Calls::                      A function call is an expression.
+* Precedence::                          How various operators nest.
+* Locales::                             How the locale affects things.
+* Expressions Summary::                 Expressions summary.
+* Pattern Overview::                    What goes into a pattern.
+* Regexp Patterns::                     Using regexps as patterns.
+* Expression Patterns::                 Any expression can be used as a
+                                        pattern.
+* Ranges::                              Pairs of patterns specify record
+                                        ranges.
+* BEGIN/END::                           Specifying initialization and cleanup
+                                        rules.
+* Using BEGIN/END::                     How and why to use BEGIN/END rules.
+* I/O And BEGIN/END::                   I/O issues in BEGIN/END rules.
+* BEGINFILE/ENDFILE::                   Two special patterns for advanced
+                                        control.
+* Empty::                               The empty pattern, which matches every
+                                        record.
+* Using Shell Variables::               How to use shell variables with
+                                        @command{awk}.
+* Action Overview::                     What goes into an action.
+* Statements::                          Describes the various control
+                                        statements in detail.
+* If Statement::                        Conditionally execute some
+                                        @command{awk} statements.
+* While Statement::                     Loop until some condition is
+                                        satisfied.
+* Do Statement::                        Do specified action while looping
+                                        until some condition is satisfied.
+* For Statement::                       Another looping statement, that
+                                        provides initialization and increment
+                                        clauses.
+* Switch Statement::                    Switch/case evaluation for conditional
+                                        execution of statements based on a
+                                        value.
+* Break Statement::                     Immediately exit the innermost
+                                        enclosing loop.
+* Continue Statement::                  Skip to the end of the innermost
+                                        enclosing loop.
+* Next Statement::                      Stop processing the current input
+                                        record.
+* Nextfile Statement::                  Stop processing the current file.
+* Exit Statement::                      Stop execution of @command{awk}.
+* Built-in Variables::                  Summarizes the predefined variables.
+* User-modified::                       Built-in variables that you change to
+                                        control @command{awk}.
+* Auto-set::                            Built-in variables where @command{awk}
+                                        gives you information.
+* ARGC and ARGV::                       Ways to use @code{ARGC} and
+                                        @code{ARGV}.
+* Pattern Action Summary::              Patterns and Actions summary.
+* Array Basics::                        The basics of arrays.
+* Array Intro::                         Introduction to Arrays
+* Reference to Elements::               How to examine one element of an
+                                        array.
+* Assigning Elements::                  How to change an element of an array.
+* Array Example::                       Basic Example of an Array
+* Scanning an Array::                   A variation of the @code{for}
+                                        statement. It loops through the
+                                        indices of an array's existing
+                                        elements.
+* Controlling Scanning::                Controlling the order in which arrays
+                                        are scanned.
+* Numeric Array Subscripts::            How to use numbers as subscripts in
+                                        @command{awk}.
+* Uninitialized Subscripts::            Using Uninitialized variables as
+                                        subscripts.
+* Delete::                              The @code{delete} statement removes an
+                                        element from an array.
+* Multidimensional::                    Emulating multidimensional arrays in
+                                        @command{awk}.
+* Multiscanning::                       Scanning multidimensional arrays.
+* Arrays of Arrays::                    True multidimensional arrays.
+* Arrays Summary::                      Summary of arrays.
+* Built-in::                            Summarizes the built-in functions.
+* Calling Built-in::                    How to call built-in functions.
+* Numeric Functions::                   Functions that work with numbers,
+                                        including @code{int()}, @code{sin()}
+                                        and @code{rand()}.
+* String Functions::                    Functions for string manipulation,
+                                        such as @code{split()}, @code{match()}
+                                        and @code{sprintf()}.
+* Gory Details::                        More than you want to know about
+                                        @samp{\} and @samp{&} with
+                                        @code{sub()}, @code{gsub()}, and
+                                        @code{gensub()}.
+* I/O Functions::                       Functions for files and shell
+                                        commands.
+* Time Functions::                      Functions for dealing with timestamps.
+* Bitwise Functions::                   Functions for bitwise operations.
+* Type Functions::                      Functions for type information.
+* I18N Functions::                      Functions for string translation.
+* User-defined::                        Describes User-defined functions in
+                                        detail.
+* Definition Syntax::                   How to write definitions and what they
+                                        mean.
+* Function Example::                    An example function definition and
+                                        what it does.
+* Function Calling::                    Calling user-defined functions.
+* Calling A Function::                  Don't use spaces.
+* Variable Scope::                      Controlling variable scope.
+* Pass By Value/Reference::             Passing parameters.
+* Function Caveats::                    Other points to know about functions.
+* Return Statement::                    Specifying the value a function
+                                        returns.
+* Dynamic Typing::                      How variable types can change at
+                                        runtime.
+* Indirect Calls::                      Choosing the function to call at
+                                        runtime.
+* Functions Summary::                   Summary of functions.
+* Library Names::                       How to best name private global
+                                        variables in library functions.
+* General Functions::                   Functions that are of general use.
+* Strtonum Function::                   A replacement for the built-in
+                                        @code{strtonum()} function.
+* Assert Function::                     A function for assertions in
+                                        @command{awk} programs.
+* Round Function::                      A function for rounding if
+                                        @code{sprintf()} does not do it
+                                        correctly.
+* Cliff Random Function::               The Cliff Random Number Generator.
+* Ordinal Functions::                   Functions for using characters as
+                                        numbers and vice versa.
+* Join Function::                       A function to join an array into a
+                                        string.
+* Getlocaltime Function::               A function to get formatted times.
+* Readfile Function::                   A function to read an entire file at
+                                        once.
+* Shell Quoting::                       A function to quote strings for the
+                                        shell.
+* Data File Management::                Functions for managing command-line
+                                        data files.
+* Filetrans Function::                  A function for handling data file
+                                        transitions.
+* Rewind Function::                     A function for rereading the current
+                                        file.
+* File Checking::                       Checking that data files are readable.
+* Empty Files::                         Checking for zero-length files.
+* Ignoring Assigns::                    Treating assignments as file names.
+* Getopt Function::                     A function for processing command-line
+                                        arguments.
+* Passwd Functions::                    Functions for getting user
+                                        information.
+* Group Functions::                     Functions for getting group
+                                        information.
+* Walking Arrays::                      A function to walk arrays of arrays.
+* Library Functions Summary::           Summary of library functions.
+* Library Exercises::                   Exercises.
+* Running Examples::                    How to run these examples.
+* Clones::                              Clones of common utilities.
+* Cut Program::                         The @command{cut} utility.
+* Egrep Program::                       The @command{egrep} utility.
+* Id Program::                          The @command{id} utility.
+* Split Program::                       The @command{split} utility.
+* Tee Program::                         The @command{tee} utility.
+* Uniq Program::                        The @command{uniq} utility.
+* Wc Program::                          The @command{wc} utility.
+* Miscellaneous Programs::              Some interesting @command{awk}
+                                        programs.
+* Dupword Program::                     Finding duplicated words in a
+                                        document.
+* Alarm Program::                       An alarm clock.
+* Translate Program::                   A program similar to the @command{tr}
+                                        utility.
+* Labels Program::                      Printing mailing labels.
+* Word Sorting::                        A program to produce a word usage
+                                        count.
+* History Sorting::                     Eliminating duplicate entries from a
+                                        history file.
+* Extract Program::                     Pulling out programs from Texinfo
+                                        source files.
+* Simple Sed::                          A Simple Stream Editor.
+* Igawk Program::                       A wrapper for @command{awk} that
+                                        includes files.
+* Anagram Program::                     Finding anagrams from a dictionary.
+* Signature Program::                   People do amazing things with too much
+                                        time on their hands.
+* Programs Summary::                    Summary of programs.
+* Programs Exercises::                  Exercises.
+* Nondecimal Data::                     Allowing nondecimal input data.
+* Array Sorting::                       Facilities for controlling array
+                                        traversal and sorting arrays.
+* Controlling Array Traversal::         How to use PROCINFO["sorted_in"].
+* Array Sorting Functions::             How to use @code{asort()} and
+                                        @code{asorti()}.
+* Two-way I/O::                         Two-way communications with another
+                                        process.
+* TCP/IP Networking::                   Using @command{gawk} for network
+                                        programming.
+* Profiling::                           Profiling your @command{awk} programs.
+* Advanced Features Summary::           Summary of advanced features.
+* I18N and L10N::                       Internationalization and Localization.
+* Explaining gettext::                  How GNU @command{gettext} works.
+* Programmer i18n::                     Features for the programmer.
+* Translator i18n::                     Features for the translator.
+* String Extraction::                   Extracting marked strings.
+* Printf Ordering::                     Rearranging @code{printf} arguments.
+* I18N Portability::                    @command{awk}-level portability
+                                        issues.
+* I18N Example::                        A simple i18n example.
+* Gawk I18N::                           @command{gawk} is also
+                                        internationalized.
+* I18N Summary::                        Summary of I18N stuff.
+* Debugging::                           Introduction to @command{gawk}
+                                        debugger.
+* Debugging Concepts::                  Debugging in General.
+* Debugging Terms::                     Additional Debugging Concepts.
+* Awk Debugging::                       Awk Debugging.
+* Sample Debugging Session::            Sample debugging session.
+* Debugger Invocation::                 How to Start the Debugger.
+* Finding The Bug::                     Finding the Bug.
+* List of Debugger Commands::           Main debugger commands.
+* Breakpoint Control::                  Control of Breakpoints.
+* Debugger Execution Control::          Control of Execution.
+* Viewing And Changing Data::           Viewing and Changing Data.
+* Execution Stack::                     Dealing with the Stack.
+* Debugger Info::                       Obtaining Information about the
+                                        Program and the Debugger State.
+* Miscellaneous Debugger Commands::     Miscellaneous Commands.
+* Readline Support::                    Readline support.
+* Limitations::                         Limitations and future plans.
+* Debugging Summary::                   Debugging summary.
+* Global Namespace::                    The global namespace in standard @command{awk}.
+* Qualified Names::                     How to qualify names with a namespace.
+* Default Namespace::                   The default namespace.
+* Changing The Namespace::              How to change the namespace.
+* Naming Rules::                        Namespace and Component Naming Rules.
+* Internal Name Management::            How names are stored internally.
+* Namespace Example::                   An example of code using a namespace.
+* Namespace And Features::              Namespaces and other @command{gawk} features.
+* Namespace Summary::                   Summarizing namespaces.
+* Computer Arithmetic::                 A quick intro to computer math.
+* Math Definitions::                    Defining terms used.
+* MPFR features::                       The MPFR features in @command{gawk}.
+* FP Math Caution::                     Things to know.
+* Inexactness of computations::         Floating point math is not exact.
+* Inexact representation::              Numbers are not exactly represented.
+* Comparing FP Values::                 How to compare floating point values.
+* Errors accumulate::                   Errors get bigger as they go.
+* Getting Accuracy::                    Getting more accuracy takes some work.
+* Try To Round::                        Add digits and round.
+* Setting precision::                   How to set the precision.
+* Setting the rounding mode::           How to set the rounding mode.
+* Arbitrary Precision Integers::        Arbitrary Precision Integer Arithmetic
+                                        with @command{gawk}.
+* Checking for MPFR::                   How to check if MPFR is available.
+* POSIX Floating Point Problems::       Standards Versus Existing Practice.
+* Floating point summary::              Summary of floating point discussion.
+* Extension Intro::                     What is an extension.
+* Plugin License::                      A note about licensing.
+* Extension Mechanism Outline::         An outline of how it works.
+* Extension API Description::           A full description of the API.
+* Extension API Functions Introduction:: Introduction to the API functions.
+* General Data Types::                  The data types.
+* Memory Allocation Functions::         Functions for allocating memory.
+* Constructor Functions::               Functions for creating values.
+* Registration Functions::              Functions to register things with
+                                        @command{gawk}.
+* Extension Functions::                 Registering extension functions.
+* Exit Callback Functions::             Registering an exit callback.
+* Extension Version String::            Registering a version string.
+* Input Parsers::                       Registering an input parser.
+* Output Wrappers::                     Registering an output wrapper.
+* Two-way processors::                  Registering a two-way processor.
+* Printing Messages::                   Functions for printing messages.
+* Updating @code{ERRNO}::               Functions for updating @code{ERRNO}.
+* Requesting Values::                   How to get a value.
+* Accessing Parameters::                Functions for accessing parameters.
+* Symbol Table Access::                 Functions for accessing global
+                                        variables.
+* Symbol table by name::                Accessing variables by name.
+* Symbol table by cookie::              Accessing variables by ``cookie''.
+* Cached values::                       Creating and using cached values.
+* Array Manipulation::                  Functions for working with arrays.
+* Array Data Types::                    Data types for working with arrays.
+* Array Functions::                     Functions for working with arrays.
+* Flattening Arrays::                   How to flatten arrays.
+* Creating Arrays::                     How to create and populate arrays.
+* Redirection API::                     How to access and manipulate
+                                        redirections.
+* Extension API Variables::             Variables provided by the API.
+* Extension Versioning::                API Version information.
+* Extension GMP/MPFR Versioning::       Version information about GMP and
+                                        MPFR.
+* Extension API Informational Variables:: Variables providing information about
+                                        @command{gawk}'s invocation.
+* Extension API Boilerplate::           Boilerplate code for using the API.
+* Changes from API V1::                 Changes from V1 of the API.
+* Finding Extensions::                  How @command{gawk} finds compiled
+                                        extensions.
+* Extension Example::                   Example C code for an extension.
+* Internal File Description::           What the new functions will do.
+* Internal File Ops::                   The code for internal file operations.
+* Using Internal File Ops::             How to use an external extension.
+* Extension Samples::                   The sample extensions that ship with
+                                        @command{gawk}.
+* Extension Sample File Functions::     The file functions sample.
+* Extension Sample Fnmatch::            An interface to @code{fnmatch()}.
+* Extension Sample Fork::               An interface to @code{fork()} and
+                                        other process functions.
+* Extension Sample Inplace::            Enabling in-place file editing.
+* Extension Sample Ord::                Character to value to character
+                                        conversions.
+* Extension Sample Readdir::            An interface to @code{readdir()}.
+* Extension Sample Revout::             Reversing output sample output
+                                        wrapper.
+* Extension Sample Rev2way::            Reversing data sample two-way
+                                        processor.
+* Extension Sample Read write array::   Serializing an array to a file.
+* Extension Sample Readfile::           Reading an entire file into a string.
+* Extension Sample Time::               An interface to @code{gettimeofday()}
+                                        and @code{sleep()}.
+* Extension Sample API Tests::          Tests for the API.
+* gawkextlib::                          The @code{gawkextlib} project.
+* Extension summary::                   Extension summary.
+* Extension Exercises::                 Exercises.
+* V7/SVR3.1::                           The major changes between V7 and
+                                        System V Release 3.1.
+* SVR4::                                Minor changes between System V
+                                        Releases 3.1 and 4.
+* POSIX::                               New features from the POSIX standard.
+* BTL::                                 New features from Brian Kernighan's
+                                        version of @command{awk}.
+* POSIX/GNU::                           The extensions in @command{gawk} not
+                                        in POSIX @command{awk}.
+* Feature History::                     The history of the features in
+                                        @command{gawk}.
+* Common Extensions::                   Common Extensions Summary.
+* Ranges and Locales::                  How locales used to affect regexp
+                                        ranges.
+* Contributors::                        The major contributors to
+                                        @command{gawk}.
+* History summary::                     History summary.
+* Gawk Distribution::                   What is in the @command{gawk}
+                                        distribution.
+* Getting::                             How to get the distribution.
+* Extracting::                          How to extract the distribution.
+* Distribution contents::               What is in the distribution.
+* Unix Installation::                   Installing @command{gawk} under
+                                        various versions of Unix.
+* Quick Installation::                  Compiling @command{gawk} under Unix.
+* Shell Startup Files::                 Shell convenience functions.
+* Additional Configuration Options::    Other compile-time options.
+* Configuration Philosophy::            How it's all supposed to work.
+* Non-Unix Installation::               Installation on Other Operating
+                                        Systems.
+* PC Installation::                     Installing and Compiling
+                                        @command{gawk} on Microsoft Windows.
+* PC Binary Installation::              Installing a prepared distribution.
+* PC Compiling::                        Compiling @command{gawk} for
+                                        Windows32.
+* PC Using::                            Running @command{gawk} on Windows32.
+* Cygwin::                              Building and running @command{gawk}
+                                        for Cygwin.
+* MSYS::                                Using @command{gawk} In The MSYS
+                                        Environment.
+* VMS Installation::                    Installing @command{gawk} on VMS.
+* VMS Compilation::                     How to compile @command{gawk} under
+                                        VMS.
+* VMS Dynamic Extensions::              Compiling @command{gawk} dynamic
+                                        extensions on VMS.
+* VMS Installation Details::            How to install @command{gawk} under
+                                        VMS.
+* VMS Running::                         How to run @command{gawk} under VMS.
+* VMS GNV::                             The VMS GNV Project.
+* VMS Old Gawk::                        An old version comes with some VMS
+                                        systems.
+* Bugs::                                Reporting Problems and Bugs.
+* Bug address::                         Where to send reports to.
+* Usenet::                              Where not to send reports to.
+* Maintainers::                         Maintainers of non-*nix ports.
+* Other Versions::                      Other freely available @command{awk}
+                                        implementations.
+* Installation summary::                Summary of installation.
+* Compatibility Mode::                  How to disable certain @command{gawk}
+                                        extensions.
+* Additions::                           Making Additions To @command{gawk}.
+* Accessing The Source::                Accessing the Git repository.
+* Adding Code::                         Adding code to the main body of
+                                        @command{gawk}.
+* New Ports::                           Porting @command{gawk} to a new
+                                        operating system.
+* Derived Files::                       Why derived files are kept in the Git
+                                        repository.
+* Future Extensions::                   New features that may be implemented
+                                        one day.
+* Implementation Limitations::          Some limitations of the
+                                        implementation.
+* Extension Design::                    Design notes about the extension API.
+* Old Extension Problems::              Problems with the old mechanism.
+* Extension New Mechanism Goals::       Goals for the new mechanism.
+* Extension Other Design Decisions::    Some other design decisions.
+* Extension Future Growth::             Some room for future growth.
+* Notes summary::                       Summary of implementation notes.
+* Basic High Level::                    The high level view.
+* Basic Data Typing::                   A very quick intro to data types.
+@end detailmenu
+@end menu
+
+@c dedication for Info file
+@ifinfo
+To my parents, for their love, and for the wonderful
+example they set for me.
+@sp 1
+To my wife Miriam, for making me complete.
+Thank you for building your life together with me.
+@sp 1
+To our children Chana, Rivka, Nachum and Malka,
+for enrichening our lives in innumerable ways.
+@end ifinfo
+
+@summarycontents
+@contents
+
+@node Foreword3
+@unnumbered Foreword to the Third Edition
+
+@c This bit is post-processed by a script which turns the chapter
+@c tag into a preface tag, and moves this stuff to before the title.
+@c Bleah.
+@docbook
+  <prefaceinfo>
+    <author>
+      <firstname>Michael</firstname>
+      <surname>Brennan</surname>
+      <!-- can't put mawk into command tags. sigh. -->
+      <affiliation><jobtitle>Author of mawk</jobtitle></affiliation>
+    </author>
+    <date>March 2001</date>
+   </prefaceinfo>
+@end docbook
+
+Arnold Robbins and I are good friends. We were introduced
+@c 11 years ago
+in 1990
+by circumstances---and our favorite programming language, AWK.
+The circumstances started a couple of years
+earlier. I was working at a new job and noticed an unplugged
+Unix computer sitting in the corner.  No one knew how to use it,
+and neither did I.  However,
+a couple of days later, it was running, and
+I was @code{root} and the one-and-only user.
+That day, I began the transition from statistician to Unix programmer.
+
+On one of many trips to the library or bookstore in search of
+books on Unix, I found the gray AWK book, a.k.a.@:
+Alfred V.@: Aho, Brian W.@: Kernighan, and
+Peter J.@: Weinberger's @cite{The AWK Programming Language} (Addison-Wesley,
+1988).  @command{awk}'s simple programming paradigm---find a pattern in the
+input and then perform an action---often reduced complex or tedious
+data manipulations to a few lines of code.  I was excited to try my
+hand at programming in AWK.
+
+Alas,  the @command{awk} on my computer was a limited version of the
+language described in the gray book.  I discovered that my computer
+had ``old @command{awk}'' and the book described
+``new @command{awk}.''
+I learned that this was typical; the old version refused to step
+aside or relinquish its name.  If a system had a new @command{awk}, it was
+invariably called @command{nawk}, and few systems had it.
+The best way to get a new @command{awk} was to @command{ftp} the source code for
+@command{gawk} from @code{prep.ai.mit.edu}.  @command{gawk} was a version of
+new @command{awk} written by David Trueman and Arnold, and available under
+the GNU General Public License.
+
+(Incidentally,
+it's no longer difficult to find a new @command{awk}. @command{gawk} ships with
+GNU/Linux, and you can download binaries or source code for almost
+any system; my wife uses @command{gawk} on her VMS box.)
+
+My Unix system started out unplugged from the wall; it certainly was not
+plugged into a network.  So, oblivious to the existence of @command{gawk}
+and the Unix community in general, and desiring a new @command{awk}, I wrote
+my own, called @command{mawk}.
+Before I was finished, I knew about @command{gawk},
+but it was too late to stop, so I eventually posted
+to a @code{comp.sources} newsgroup.
+
+A few days after my posting, I got a friendly email
+from Arnold introducing
+himself.   He suggested we share design and algorithms and
+attached a draft of the POSIX standard so
+that I could update @command{mawk} to support language extensions added
+after publication of @cite{The AWK Programming Language}.
+
+Frankly, if our roles had
+been reversed, I would not have been so open and we probably would
+have never met.  I'm glad we did meet.
+He is an AWK expert's AWK expert and a genuinely nice person.
+Arnold contributes significant amounts of his
+expertise and time to the Free Software Foundation.
+
+This book is the @command{gawk} reference manual, but at its core it
+is a book about AWK programming that
+will appeal to a wide audience.
+It is a definitive reference to the AWK language as defined by the
+1987 Bell Laboratories release and codified in the 1992 POSIX Utilities
+standard.
+
+On the other hand, the novice AWK programmer can study
+a wealth of practical programs that emphasize
+the power of AWK's basic idioms:
+data-driven control flow, pattern matching with regular expressions,
+and associative arrays.
+Those looking for something new can try out @command{gawk}'s
+interface to network protocols via special @file{/inet} files.
+
+The programs in this book make clear that an AWK program is
+typically much smaller and faster to develop than
+a counterpart written in C.
+Consequently, there is often a payoff to prototyping an
+algorithm or design in AWK to get it running quickly and expose
+problems early. Often, the interpreted performance is adequate
+and the AWK prototype becomes the product.
+
+The new @command{pgawk} (profiling @command{gawk}), produces
+program execution counts.
+I recently experimented with an algorithm that for
+@ifnotdocbook
+@math{n}
+@end ifnotdocbook
+@ifdocbook
+@i{n}
+@end ifdocbook
+lines of input, exhibited
+@tex
+$\sim\! Cn^2$
+@end tex
+@ifnottex
+@ifnotdocbook
+~ C n^2
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>&sim; Cn<superscript>2</superscript></emphasis>
+@end docbook
+performance, while
+theory predicted
+@tex
+$\sim\! Cn\log n$
+@end tex
+@ifnottex
+@ifnotdocbook
+~ C n log n
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>&sim; Cn log n</emphasis>
+@end docbook
+behavior. A few minutes poring
+over the @file{awkprof.out} profile pinpointed the problem to
+a single line of code.  @command{pgawk} is a welcome addition to
+my programmer's toolbox.
+
+Arnold has distilled over a decade of experience writing and
+using AWK programs, and developing @command{gawk}, into this book.  If you use
+AWK or want to learn how, then read this book.
+
+@ifnotdocbook
+@cindex Brennan, Michael
+@display
+Michael Brennan
+Author of @command{mawk}
+March 2001
+@end display
+@end ifnotdocbook
+
+@node Foreword4
+@unnumbered Foreword to the Fourth Edition
+
+@c This bit is post-processed by a script which turns the chapter
+@c tag into a preface tag, and moves this stuff to before the title.
+@c Bleah.
+@docbook
+  <prefaceinfo>
+    <author>
+      <firstname>Michael</firstname>
+      <surname>Brennan</surname>
+      <!-- can't put mawk into command tags. sigh. -->
+      <affiliation><jobtitle>Author of mawk</jobtitle></affiliation>
+    </author>
+    <date>October 2014</date>
+   </prefaceinfo>
+@end docbook
+
+Some things don't change.  Thirteen years ago I wrote:
+``If you use AWK or want to learn how, then read this book.''
+True then, and still true today.
+
+Learning to use a programming language is about more than mastering the
+syntax.  One needs to acquire an understanding of how to use the
+features of the language to solve practical programming problems.
+A focus of this book is many examples that show how to use AWK.
+
+Some things do change. Our computers are much faster and have more memory.
+Consequently, speed and storage inefficiencies of a high-level language
+matter less.  Prototyping in AWK and then rewriting in C for performance
+reasons happens less, because more often the prototype is fast enough.
+
+Of course, there are computing operations that are best done in C or C++.
+With @command{gawk} 4.1 and later, you do not have to choose between writing
+your program in AWK or in C/C++.  You can write most of your
+program in AWK and the aspects that require C/C++ capabilities can be written
+in C/C++, and then the pieces glued together when the @command{gawk} module loads
+the C/C++ module as a dynamic plug-in.
+@c Chapter 16
+@ref{Dynamic Extensions},
+has all the
+details, and, as expected, many examples to help you learn the ins and outs.
+
+I enjoy programming in AWK and had fun (re)reading this book.
+I think you will too.
+
+@ifnotdocbook
+@cindex Brennan, Michael
+@display
+Michael Brennan
+Author of @command{mawk}
+October 2014
+@end display
+@end ifnotdocbook
+
+@node Preface
+@unnumbered Preface
+@c I saw a comment somewhere that the preface should describe the book itself,
+@c and the introduction should describe what the book covers.
+@c
+@c 12/2000: Chuck wants the preface & intro combined.
+
+@c This bit is post-processed by a script which turns the chapter
+@c tag into a preface tag, and moves this stuff to before the title.
+@c Bleah.
+@docbook
+  <prefaceinfo>
+    <author>
+      <firstname>Arnold</firstname>
+      <surname>Robbins</surname>
+      <affiliation><jobtitle>Nof Ayalon</jobtitle></affiliation>
+      <affiliation><jobtitle>Israel</jobtitle></affiliation>
+    </author>
+    <date>February 2015</date>
+   </prefaceinfo>
+@end docbook
+
+Several kinds of tasks occur repeatedly when working with text files.
+You might want to extract certain lines and discard the rest.  Or you
+may need to make changes wherever certain patterns appear, but leave the
+rest of the file alone.  Such jobs are often easy with @command{awk}.
+The @command{awk} utility interprets a special-purpose programming
+language that makes it easy to handle simple data-reformatting jobs.
+
+The GNU implementation of @command{awk} is called @command{gawk}; if you
+invoke it with the proper options or environment variables,
+it is fully compatible with
+the POSIX@footnote{The 2008 POSIX standard is accessible online at
+@w{@url{http://www.opengroup.org/onlinepubs/9699919799/}.}}
+specification of the @command{awk} language
+and with the Unix version of @command{awk} maintained
+by Brian Kernighan.
+This means that all
+properly written @command{awk} programs should work with @command{gawk}.
+So most of the time, we don't distinguish between @command{gawk} and other
+@command{awk} implementations.
+
+@cindex @command{awk}, POSIX and, See Also POSIX @command{awk}
+@cindex @command{awk}, POSIX and
+@cindex POSIX, @command{awk} and
+@cindex @command{gawk}, @command{awk} and
+@cindex @command{awk}, @command{gawk} and
+@cindex @command{awk}, uses for
+Using @command{awk} you can:
+
+@itemize @value{BULLET}
+@item
+Manage small, personal databases
+
+@item
+Generate reports
+
+@item
+Validate data
+
+@item
+Produce indexes and perform other document-preparation tasks
+
+@item
+Experiment with algorithms that you can adapt later to other computer
+languages
+@end itemize
+
+@cindex @command{awk}, See Also @command{gawk}
+@cindex @command{gawk}, See Also @command{awk}
+@cindex @command{gawk}, uses for
+In addition,
+@command{gawk}
+provides facilities that make it easy to:
+
+@itemize @value{BULLET}
+@item
+Extract bits and pieces of data for processing
+
+@item
+Sort data
+
+@item
+Perform simple network communications
+
+@item
+Profile and debug @command{awk} programs
+
+@item
+Extend the language with functions written in C or C++
+@end itemize
+
+This @value{DOCUMENT} teaches you about the @command{awk} language and
+how you can use it effectively.  You should already be familiar with basic
+system commands, such as @command{cat} and @command{ls},@footnote{These utilities
+are available on POSIX-compliant systems, as well as on traditional
+Unix-based systems. If you are using some other operating system, you still need to
+be familiar with the ideas of I/O redirection and pipes.} as well as basic shell
+facilities, such as input/output (I/O) redirection and pipes.
+
+@cindex GNU @command{awk}, See @command{gawk}
+Implementations of the @command{awk} language are available for many
+different computing environments.  This @value{DOCUMENT}, while describing
+the @command{awk} language in general, also describes the particular
+implementation of @command{awk} called @command{gawk} (which stands for
+``GNU @command{awk}'').  @command{gawk} runs on a broad range of Unix systems,
+ranging from Intel-architecture PC-based computers
+up through large-scale systems.
+@command{gawk} has also been ported to Mac OS X,
+Microsoft Windows
+(all versions),
+and OpenVMS.@footnote{Some other, obsolete systems to which @command{gawk}
+was once ported are no longer supported and the code for those systems
+has been removed.}
+
+@menu
+* History::                     The history of @command{gawk} and
+                                @command{awk}.
+* Names::                       What name to use to find @command{awk}.
+* This Manual::                 Using this @value{DOCUMENT}. Includes sample
+                                input files that you can use.
+* Conventions::                 Typographical Conventions.
+* Manual History::              Brief history of the GNU project and this
+                                @value{DOCUMENT}.
+* How To Contribute::           Helping to save the world.
+* Acknowledgments::             Acknowledgments.
+@end menu
+
+@node History
+@unnumberedsec History of @command{awk} and @command{gawk}
+@cindex recipe for a programming language
+@cindex programming language, recipe for
+@cindex sidebar, Recipe for a Programming Language
+@ifdocbook
+@docbook
+<sidebar><title>Recipe for a Programming Language</title>
+@end docbook
+
+
+@multitable {2 parts} {1 part  @code{egrep}} {1 part  @code{snobol}}
+@item @tab 1 part  @code{egrep} @tab 1 part  @code{snobol}
+@item @tab 2 parts @code{ed} @tab 3 parts C
+@end multitable
+
+Blend all parts well using @code{lex} and @code{yacc}.
+Document minimally and release.
+
+After eight years, add another part @code{egrep} and two
+more parts C.  Document very well and release.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Recipe for a Programming Language}
+
+
+
+@multitable {2 parts} {1 part  @code{egrep}} {1 part  @code{snobol}}
+@item @tab 1 part  @code{egrep} @tab 1 part  @code{snobol}
+@item @tab 2 parts @code{ed} @tab 3 parts C
+@end multitable
+
+Blend all parts well using @code{lex} and @code{yacc}.
+Document minimally and release.
+
+After eight years, add another part @code{egrep} and two
+more parts C.  Document very well and release.
+@end cartouche
+@end ifnotdocbook
+
+@cindex Aho, Alfred
+@cindex Weinberger, Peter
+@cindex Kernighan, Brian
+@cindex @command{awk}, history of
+The name @command{awk} comes from the initials of its designers: Alfred V.@:
+Aho, Peter J.@: Weinberger, and Brian W.@: Kernighan.  The original version of
+@command{awk} was written in 1977 at AT&T Bell Laboratories.
+In 1985, a new version made the programming
+language more powerful, introducing user-defined functions, multiple input
+streams, and computed regular expressions.
+This new version became widely available with Unix System V
+Release 3.1 (1987).
+The version in System V Release 4 (1989) added some new features and cleaned
+up the behavior in some of the ``dark corners'' of the language.
+The specification for @command{awk} in the POSIX Command Language
+and Utilities standard further clarified the language.
+Both the @command{gawk} designers and the original @command{awk} designers at Bell Laboratories
+provided feedback for the POSIX specification.
+
+@cindex Rubin, Paul
+@cindex Fenlason, Jay
+@cindex Trueman, David
+Paul Rubin wrote @command{gawk} in 1986.
+Jay Fenlason completed it, with advice from Richard Stallman.  John Woods
+contributed parts of the code as well.  In 1988 and 1989, David Trueman, with
+help from me, thoroughly reworked @command{gawk} for compatibility
+with the newer @command{awk}.
+Circa 1994, I became the primary maintainer.
+Current development focuses on bug fixes,
+performance improvements, standards compliance, and, occasionally, new features.
+
+In May 1997, J@"urgen Kahrs felt the need for network access
+from @command{awk}, and with a little help from me, set about adding
+features to do this for @command{gawk}.  At that time, he also
+wrote the bulk of
+@cite{@value{GAWKINETTITLE}}
+(a separate document, available as part of the @command{gawk} distribution).
+His code finally became part of the main @command{gawk} distribution
+with @command{gawk} @value{PVERSION} 3.1.
+
+John Haque rewrote the @command{gawk} internals, in the process providing
+an @command{awk}-level debugger. This version became available as
+@command{gawk} @value{PVERSION} 4.0 in 2011.
+
+@xref{Contributors}
+for a full list of those who have made important contributions to @command{gawk}.
+
+@node Names
+@unnumberedsec A Rose by Any Other Name
+
+@cindex @command{awk}, new vs.@: old
+The @command{awk} language has evolved over the years. Full details are
+provided in @ref{Language History}.
+The language described in this @value{DOCUMENT}
+is often referred to as ``new @command{awk}.''
+By analogy, the original version of @command{awk} is
+referred to as ``old @command{awk}.''
+
+On most current systems, when you run the @command{awk} utility
+you get some version of new @command{awk}.@footnote{Only
+Solaris systems still use an old @command{awk} for the
+default @command{awk} utility. A more modern @command{awk} lives in
+@file{/usr/xpg6/bin} on these systems.} If your system's standard
+@command{awk} is the old one, you will see something like this
+if you try the test program:
+
+@example
+@group
+$ @kbd{awk 1 /dev/null}
+@error{} awk: syntax error near line 1
+@error{} awk: bailing out near line 1
+@end group
+@end example
+
+@noindent
+In this case, you should find a version of new @command{awk},
+or just install @command{gawk}!
+
+Throughout this @value{DOCUMENT}, whenever we refer to a language feature
+that should be available in any complete implementation of POSIX @command{awk},
+we simply use the term @command{awk}.  When referring to a feature that is
+specific to the GNU implementation, we use the term @command{gawk}.
+
+@node This Manual
+@unnumberedsec Using This Book
+@cindex @command{awk}, terms describing
+
+The term @command{awk} refers to a particular program as well as to the language you
+use to tell this program what to do.  When we need to be careful, we call
+the language ``the @command{awk} language,''
+and the program ``the @command{awk} utility.''
+This @value{DOCUMENT} explains
+both how to write programs in the @command{awk} language and how to
+run the @command{awk} utility.
+The term ``@command{awk} program'' refers to a program written by you in
+the @command{awk} programming language.
+
+@cindex @command{gawk}, @command{awk} and
+@cindex @command{awk}, @command{gawk} and
+@cindex POSIX @command{awk}
+Primarily, this @value{DOCUMENT} explains the features of @command{awk}
+as defined in the POSIX standard.  It does so in the context of the
+@command{gawk} implementation.  While doing so, it also
+attempts to describe important differences between @command{gawk}
+and other @command{awk}
+@ifclear FOR_PRINT
+implementations.@footnote{All such differences
+appear in the index under the
+entry ``differences in @command{awk} and @command{gawk}.''}
+@end ifclear
+@ifset FOR_PRINT
+implementations.
+@end ifset
+Finally, it notes any @command{gawk} features that are not in
+the POSIX standard for @command{awk}.
+
+@ifnotinfo
+This @value{DOCUMENT} has the difficult task of being both a tutorial and a reference.
+If you are a novice, feel free to skip over details that seem too complex.
+You should also ignore the many cross-references; they are for the
+expert user and for the Info and
+@uref{https://www.gnu.org/software/gawk/manual/, HTML}
+versions of the @value{DOCUMENT}.
+@end ifnotinfo
+
+There are sidebars
+scattered throughout the @value{DOCUMENT}.
+They add a more complete explanation of points that are relevant, but not likely
+to be of interest on first reading.
+@ifclear FOR_PRINT
+All appear in the index, under the heading ``sidebar.''
+@end ifclear
+
+Most of the time, the examples use complete @command{awk} programs.
+Some of the more advanced @value{SECTION}s show only the part of the @command{awk}
+program that illustrates the concept being described.
+
+Although this @value{DOCUMENT} is aimed principally at people who have not been
+exposed
+to @command{awk}, there is a lot of information here that even the @command{awk}
+expert should find useful.  In particular, the description of POSIX
+@command{awk} and the example programs in
+@ref{Library Functions}, and
+@ifnotdocbook
+in
+@end ifnotdocbook
+@ref{Sample Programs},
+should be of interest.
+
+This @value{DOCUMENT} is split into several parts, as follows:
+
+@c FULLXREF ON
+
+@itemize @value{BULLET}
+@item
+Part I describes the @command{awk} language and the @command{gawk} program in detail.
+It starts with the basics, and continues through all of the features of @command{awk}.
+It contains the following chapters:
+
+@c nested
+@itemize @value{MINUS}
+@item
+@ref{Getting Started},
+provides the essentials you need to know to begin using @command{awk}.
+
+@item
+@ref{Invoking Gawk},
+describes how to run @command{gawk}, the meaning of its
+command-line options, and how it finds @command{awk}
+program source files.
+
+@item
+@ref{Regexp},
+introduces regular expressions in general, and in particular the flavors
+supported by POSIX @command{awk} and @command{gawk}.
+
+@item
+@ref{Reading Files},
+describes how @command{awk} reads your data.
+It introduces the concepts of records and fields, as well
+as the @code{getline} command.
+I/O redirection is first described here.
+Network I/O is also briefly introduced here.
+
+@item
+@ref{Printing},
+describes how @command{awk} programs can produce output with
+@code{print} and @code{printf}.
+
+@item
+@ref{Expressions},
+describes expressions, which are the basic building blocks
+for getting most things done in a program.
+
+@item
+@ref{Patterns and Actions},
+describes how to write patterns for matching records, actions for
+doing something when a record is matched, and the predefined variables
+@command{awk} and @command{gawk} use.
+
+@item
+@ref{Arrays},
+covers @command{awk}'s one-and-only data structure: the associative array.
+Deleting array elements and whole arrays is described, as well as
+sorting arrays in @command{gawk}.  The @value{CHAPTER} also describes how
+@command{gawk} provides arrays of arrays.
+
+@item
+@ref{Functions},
+describes the built-in functions @command{awk} and @command{gawk} provide,
+as well as how to define your own functions.  It also discusses how
+@command{gawk} lets you call functions indirectly.
+@end itemize
+
+@item
+Part II shows how to use @command{awk} and @command{gawk} for problem solving.
+There is lots of code here for you to read and learn from.
+This part contains the following chapters:
+
+@c nested
+@itemize @value{MINUS}
+@item
+@ref{Library Functions}, provides a number of functions meant to
+be used from main @command{awk} programs.
+
+@item
+@ref{Sample Programs},
+provides many sample @command{awk} programs.
+@end itemize
+
+Reading these two chapters allows you to see @command{awk}
+solving real problems.
+
+@item
+Part III focuses on features specific to @command{gawk}.
+It contains the following chapters:
+
+@c nested
+@itemize @value{MINUS}
+@item
+@ref{Advanced Features},
+describes a number of advanced features.
+Of particular note
+are the abilities to control the order of array traversal,
+have two-way communications with another process,
+perform TCP/IP networking, and
+profile your @command{awk} programs.
+
+@item
+@ref{Internationalization},
+describes special features for translating program
+messages into different languages at runtime.
+
+@item
+@ref{Debugger}, describes the @command{gawk} debugger.
+
+@item
+@ref{Namespaces}, describes how @command{gawk} allows variables and/or
+functions of the same name to be in different namespaces.
+
+@item
+@ref{Arbitrary Precision Arithmetic},
+describes advanced arithmetic facilities.
+
+@item
+@ref{Dynamic Extensions}, describes how to add new variables and
+functions to @command{gawk} by writing extensions in C or C++.
+@end itemize
+
+@item
+@ifclear FOR_PRINT
+Part IV provides the appendices, the Glossary, and two licenses that cover
+the @command{gawk} source code and this @value{DOCUMENT}, respectively.
+It contains the following appendices:
+@end ifclear
+@ifset FOR_PRINT
+Part IV provides the following appendices,
+including the GNU General Public License:
+@end ifset
+
+@itemize @value{MINUS}
+@item
+@ref{Language History},
+describes how the @command{awk} language has evolved since
+its first release to the present.  It also describes how @command{gawk}
+has acquired features over time.
+
+@item
+@ref{Installation},
+describes how to get @command{gawk}, how to compile it
+on POSIX-compatible systems,
+and how to compile and use it on different
+non-POSIX systems.  It also describes how to report bugs
+in @command{gawk} and where to get other freely
+available @command{awk} implementations.
+
+@ifset FOR_PRINT
+@item
+@ref{Copying},
+presents the license that covers the @command{gawk} source code.
+@end ifset
+
+@ifclear FOR_PRINT
+@item
+@ref{Notes},
+describes how to disable @command{gawk}'s extensions, as
+well as how to contribute new code to @command{gawk},
+and some possible future directions for @command{gawk} development.
+
+@item
+@ref{Basic Concepts},
+provides some very cursory background material for those who
+are completely unfamiliar with computer programming.
+
+@item
+The @ref{Glossary}, defines most, if not all, of the significant terms used
+throughout the @value{DOCUMENT}.  If you find terms that you aren't familiar with,
+try looking them up here.
+
+@item
+@ref{Copying}, and
+@ref{GNU Free Documentation License},
+present the licenses that cover the @command{gawk} source code
+and this @value{DOCUMENT}, respectively.
+@end ifclear
+@end itemize
+@end itemize
+
+@ifset FOR_PRINT
+The version of this @value{DOCUMENT} distributed with @command{gawk}
+contains additional appendices and other end material.
+To save space, we have omitted them from the
+printed edition. You may find them online, as follows:
+
+@itemize @value{BULLET}
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Notes.html,
+The appendix on implementation notes}
+describes how to disable @command{gawk}'s extensions, how to contribute
+new code to @command{gawk}, where to find information on some possible
+future directions for @command{gawk} development, and the design decisions
+behind the extension API.
+
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Basic-Concepts.html,
+The appendix on basic concepts}
+provides some very cursory background material for those who
+are completely unfamiliar with computer programming.
+
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Glossary.html,
+The Glossary}
+defines most, if not all, of the significant terms used
+throughout the @value{DOCUMENT}.  If you find terms that you aren't familiar with,
+try looking them up here.
+
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html,
+The GNU FDL}
+is the license that covers this @value{DOCUMENT}.
+@end itemize
+
+@c ok not to use CHAPTER / SECTION here
+Some of the chapters have exercise sections; these have also been
+omitted from the print edition but are available online.
+@end ifset
+
+@c FULLXREF OFF
+
+@node Conventions
+@unnumberedsec Typographical Conventions
+
+@cindex Texinfo
+This @value{DOCUMENT} is written in @uref{https://www.gnu.org/software/texinfo/, Texinfo},
+the GNU documentation formatting language.
+A single Texinfo source file is used to produce both the printed and online
+versions of the documentation.
+@ifnotinfo
+Because of this, the typographical conventions
+are slightly different than in other books you may have read.
+@end ifnotinfo
+@ifinfo
+This @value{SECTION} briefly documents the typographical conventions used in Texinfo.
+@end ifinfo
+
+Examples you would type at the command line are preceded by the common
+shell primary and secondary prompts, @samp{$} and @samp{>}.
+Input that you type is shown @kbd{like this}.
+@c 8/2014: @print{} is stripped from the texi to make docbook.
+@ifclear FOR_PRINT
+Output from the command is preceded by the glyph ``@print{}''.
+This typically represents the command's standard output.
+@end ifclear
+@ifset FOR_PRINT
+Output from the command, usually its standard output, appears
+@code{like this}.
+@end ifset
+Error messages and other output on the command's standard error are preceded
+by the glyph ``@error{}''.  For example:
+
+@example
+$ @kbd{echo hi on stdout}
+@print{} hi on stdout
+$ @kbd{echo hello on stderr 1>&2}
+@error{} hello on stderr
+@end example
+
+@ifnotinfo
+In the text, almost anything related to programming, such as
+command names,
+variable and function names, and string, numeric and regexp constants
+appear in @code{this font}. Code fragments
+appear in the same font and quoted, @samp{like this}.
+Things that are replaced by the user or programmer
+appear in @var{this font}.
+Options look like this: @option{-f}.
+@value{FFN}s are indicated like this: @file{/path/to/ourfile}.
+@ifclear FOR_PRINT
+Some things are
+emphasized @emph{like this}, and if a point needs to be made
+strongly, it is done @strong{like this}.
+@end ifclear
+The first occurrence of
+a new term is usually its @dfn{definition} and appears in the same
+font as the previous occurrence of ``definition'' in this sentence.
+@end ifnotinfo
+
+Characters that you type at the keyboard look @kbd{like this}.  In particular,
+there are special characters called ``control characters.''  These are
+characters that you type by holding down both the @kbd{CONTROL} key and
+another key, at the same time.  For example, a @kbd{Ctrl-d} is typed
+by first pressing and holding the @kbd{CONTROL} key, next
+pressing the @kbd{d} key, and finally releasing both keys.
+
+For the sake of brevity, throughout this @value{DOCUMENT}, we refer to
+Brian Kernighan's version of @command{awk} as ``BWK @command{awk}.''
+(@xref{Other Versions} for information on his and other versions.)
+
+@ifset FOR_PRINT
+@quotation NOTE
+Notes of interest look like this.
+@end quotation
+
+@quotation CAUTION
+Cautionary or warning notes look like this.
+@end quotation
+@end ifset
+
+@c fakenode --- for prepinfo
+@unnumberedsubsec Dark Corners
+@cindex Kernighan, Brian
+@quotation
+@i{Dark corners are basically fractal---no matter how much
+you illuminate, there's always a smaller but darker one.}
+@author Brian Kernighan
+@end quotation
+
+@cindex d.c., See dark corner
+@cindex dark corner
+Until the POSIX standard (and @cite{@value{TITLE}}),
+many features of @command{awk} were either poorly documented or not
+documented at all.  Descriptions of such features
+(often called ``dark corners'') are noted in this @value{DOCUMENT} with
+@iftex
+the picture of a flashlight in the margin, as shown here.
+@value{DARKCORNER}
+@end iftex
+@ifnottex
+``(d.c.).''
+@end ifnottex
+@ifclear FOR_PRINT
+They also appear in the index under the heading ``dark corner.''
+@end ifclear
+
+But, as noted by the opening quote, any coverage of dark
+corners is by definition incomplete.
+
+@cindex c.e., See common extensions
+Extensions to the standard @command{awk} language that are supported by
+more than one @command{awk} implementation are marked
+@ifclear FOR_PRINT
+``@value{COMMONEXT},'' and listed in the index under ``common extensions''
+and ``extensions, common.''
+@end ifclear
+@ifset FOR_PRINT
+``@value{COMMONEXT}'' for ``common extension.''
+@end ifset
+
+@node Manual History
+@unnumberedsec The GNU Project and This Book
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@cindex Stallman, Richard
+The Free Software Foundation (FSF) is a nonprofit organization dedicated
+to the production and distribution of freely distributable software.
+It was founded by Richard M.@: Stallman, the author of the original
+Emacs editor.  GNU Emacs is the most widely used version of Emacs today.
+
+@cindex GNU Project
+@cindex GPL (General Public License)
+@cindex General Public License, See GPL
+@cindex documentation, online
+The GNU@footnote{GNU stands for ``GNU's Not Unix.''}
+Project is an ongoing effort on the part of the Free Software
+Foundation to create a complete, freely distributable, POSIX-compliant
+computing environment.
+The FSF uses the GNU General Public License (GPL) to ensure that
+its software's
+source code is always available to the end user.
+@ifclear FOR_PRINT
+A copy of the GPL is included
+@ifnotinfo
+in this @value{DOCUMENT}
+@end ifnotinfo
+for your reference
+(@pxref{Copying}).
+@end ifclear
+The GPL applies to the C language source code for @command{gawk}.
+To find out more about the FSF and the GNU Project online,
+see @uref{https://www.gnu.org, the GNU Project's home page}.
+This @value{DOCUMENT} may also be read from
+@uref{https://www.gnu.org/software/gawk/manual/, GNU's website}.
+
+@ifclear FOR_PRINT
+A shell, an editor (Emacs), highly portable optimizing C, C++, and
+Objective-C compilers, a symbolic debugger and dozens of large and
+small utilities (such as @command{gawk}), have all been completed and are
+freely available.  The GNU operating
+system kernel (the HURD), has been released but remains in an early
+stage of development.
+
+@cindex Linux
+@cindex GNU/Linux
+@cindex operating systems, BSD-based
+Until the GNU operating system is more fully developed, you should
+consider using GNU/Linux, a freely distributable, Unix-like operating
+system for Intel,
+Power Architecture,
+Sun SPARC, IBM S/390, and other
+systems.@footnote{The terminology ``GNU/Linux'' is explained
+in the @ref{Glossary}.}
+Many GNU/Linux distributions are
+available for download from the Internet.
+@end ifclear
+
+@ifnotinfo
+The @value{DOCUMENT} you are reading is actually free---at least, the
+information in it is free to anyone.  The machine-readable
+source code for the @value{DOCUMENT} comes with @command{gawk}.
+@ifclear FOR_PRINT
+(Take a moment to check the Free Documentation
+License in @ref{GNU Free Documentation License}.)
+@end ifclear
+@end ifnotinfo
+
+@cindex Close, Diane
+The @value{DOCUMENT} itself has gone through multiple previous editions.
+Paul Rubin wrote the very first draft of @cite{The GAWK Manual};
+it was around 40 pages long.
+Diane Close and Richard Stallman improved it, yielding a
+version that was
+around 90 pages and barely described the original, ``old''
+version of @command{awk}.
+
+I started working with that version in the fall of 1988.
+As work on it progressed,
+the FSF published several preliminary versions (numbered 0.@var{x}).
+In 1996, edition 1.0 was released with @command{gawk} 3.0.0.
+The FSF published the first two editions under
+the title @cite{The GNU Awk User's Guide}.
+@ifset FOR_PRINT
+SSC published two editions of the @value{DOCUMENT} under the
+title @cite{Effective awk Programming}, and O'Reilly published
+the third edition in 2001.
+@end ifset
+
+This edition maintains the basic structure of the previous editions.
+For FSF edition 4.0, the content was thoroughly reviewed and updated. All
+references to @command{gawk} versions prior to 4.0 were removed.
+Of significant note for that edition was the addition of @ref{Debugger}.
+
+For FSF edition
+@ifclear FOR_PRINT
+@value{EDITION},
+@end ifclear
+@ifset FOR_PRINT
+@value{EDITION}
+(the fourth edition as published by O'Reilly),
+@end ifset
+the content has been reorganized into parts,
+and the major new additions are @ref{Arbitrary Precision Arithmetic},
+and @ref{Dynamic Extensions}.
+
+This @value{DOCUMENT} will undoubtedly continue to evolve.  If you
+find an error in the @value{DOCUMENT}, please report it!  @xref{Bugs}
+for information on submitting problem reports electronically.
+
+@ifset FOR_PRINT
+@c fakenode --- for prepinfo
+@unnumberedsec How to Stay Current
+
+You may have a newer version of @command{gawk} than the
+one described here.  To find out what has changed,
+you should first look at the @file{NEWS} file in the @command{gawk}
+distribution, which provides a high-level summary of the changes in
+each release.
+
+You can then look at the @uref{https://www.gnu.org/software/gawk/manual/,
+online version} of this @value{DOCUMENT} to read about any new features.
+@end ifset
+
+@ifclear FOR_PRINT
+@node How To Contribute
+@unnumberedsec How to Contribute
+
+As the maintainer of GNU @command{awk}, I once thought that I would be
+able to manage a collection of publicly available @command{awk} programs
+and I even solicited contributions.  Making things available on the Internet
+helps keep the @command{gawk} distribution down to manageable size.
+
+The initial collection of material, such as it is, is still available
+at @uref{ftp://ftp.freefriends.org/arnold/Awkstuff}.
+
+In the hopes of doing something more broad, I acquired the
+@code{awklang.org} domain.  Late in 2017, a volunteer took on the task
+of managing it.
+
+If you have written an interesting @command{awk} program, that
+you would like to share with the rest of the world, please see
+@uref{http://www.awklang.org} and use the ``Contact'' link.
+
+If you have written a @command{gawk} extension, please see
+@ref{gawkextlib}.
+@end ifclear
+
+@node Acknowledgments
+@unnumberedsec Acknowledgments
+
+The initial draft of @cite{The GAWK Manual} had the following acknowledgments:
+
+@quotation
+Many people need to be thanked for their assistance in producing this
+manual.  Jay Fenlason contributed many ideas and sample programs.  Richard
+Mlynarik and Robert Chassell gave helpful comments on drafts of this
+manual.  The paper @cite{A Supplemental Document for AWK} by John W.@:
+Pierce of the Chemistry Department at UC San Diego, pinpointed several
+issues relevant both to @command{awk} implementation and to this manual, that
+would otherwise have escaped us.
+@end quotation
+
+@cindex Stallman, Richard
+I would like to acknowledge Richard M.@: Stallman, for his vision of a
+better world and for his courage in founding the FSF and starting the
+GNU Project.
+
+@ifclear FOR_PRINT
+Earlier editions of this @value{DOCUMENT} had the following acknowledgements:
+@end ifclear
+@ifset FOR_PRINT
+The previous edition of this @value{DOCUMENT} had
+the following acknowledgements:
+@end ifset
+
+@quotation
+The following people (in alphabetical order)
+provided helpful comments on various
+versions of this book:
+Rick Adams,
+Dr.@: Nelson H.F. Beebe,
+Karl Berry,
+Dr.@: Michael Brennan,
+Rich Burridge,
+Claire Cloutier,
+Diane Close,
+Scott Deifik,
+Christopher (``Topher'') Eliot,
+Jeffrey Friedl,
+Dr.@: Darrel Hankerson,
+Michal Jaegermann,
+Dr.@: Richard J.@: LeBlanc,
+Michael Lijewski,
+Pat Rankin,
+Miriam Robbins,
+Mary Sheehan,
+and
+Chuck Toporek.
+
+@cindex Berry, Karl
+@cindex Chassell, Robert J.@:
+@c @cindex Texinfo
+Robert J.@: Chassell provided much valuable advice on
+the use of Texinfo.
+He also deserves special thanks for
+convincing me @emph{not} to title this @value{DOCUMENT}
+@cite{How to Gawk Politely}.
+Karl Berry helped significantly with the @TeX{} part of Texinfo.
+
+@cindex Hartholz, Marshall
+@cindex Hartholz, Elaine
+@cindex Schreiber, Bert
+@cindex Schreiber, Rita
+I would like to thank Marshall and Elaine Hartholz of Seattle and
+Dr.@: Bert and Rita Schreiber of Detroit for large amounts of quiet vacation
+time in their homes, which allowed me to make significant progress on
+this @value{DOCUMENT} and on @command{gawk} itself.
+
+@cindex Hughes, Phil
+Phil Hughes of SSC
+contributed in a very important way by loaning me his laptop GNU/Linux
+system, not once, but twice, which allowed me to do a lot of work while
+away from home.
+
+@cindex Trueman, David
+David Trueman deserves special credit; he has done a yeoman job
+of evolving @command{gawk} so that it performs well and without bugs.
+Although he is no longer involved with @command{gawk},
+working with him on this project was a significant pleasure.
+
+@cindex Drepper, Ulrich
+@cindex GNITS mailing list
+@cindex mailing list, GNITS
+The intrepid members of the GNITS mailing list, and most notably Ulrich
+Drepper, provided invaluable help and feedback for the design of the
+internationalization features.
+
+Chuck Toporek, Mary Sheehan, and Claire Cloutier of O'Reilly & Associates contributed
+significant editorial help for this @value{DOCUMENT} for the
+3.1 release of @command{gawk}.
+@end quotation
+
+@cindex Beebe, Nelson H.F.@:
+@cindex Buening, Andreas
+@cindex Collado, Manuel
+@cindex Colombo, Antonio
+@cindex Davies, Stephen
+@cindex Deifik, Scott
+@cindex Demaille, Akim
+@cindex G., Daniel Richard
+@cindex Guerrero, Juan Manuel
+@cindex Hankerson, Darrel
+@cindex Jaegermann, Michal
+@cindex Kahrs, J@"urgen
+@cindex Kasal, Stepan
+@cindex Malmberg, John
+@cindex Pitts, Dave
+@cindex Ramey, Chet
+@cindex Rankin, Pat
+@cindex Schorr, Andrew
+@cindex Vinschen, Corinna
+@cindex Zaretskii, Eli
+
+Dr.@: Nelson Beebe,
+Andreas Buening,
+Dr.@: Manuel Collado,
+Antonio Colombo,
+Stephen Davies,
+Scott Deifik,
+Akim Demaille,
+Daniel Richard G.,
+Juan Manuel Guerrero,
+Darrel Hankerson,
+Michal Jaegermann,
+J@"urgen Kahrs,
+Stepan Kasal,
+John Malmberg,
+Dave Pitts,
+Chet Ramey,
+Pat Rankin,
+Andrew Schorr,
+Corinna Vinschen,
+and Eli Zaretskii
+(in alphabetical order)
+make up the current @command{gawk} ``crack portability team.''  Without
+their hard work and help, @command{gawk} would not be nearly the robust,
+portable program it is today.  It has been and continues to be a pleasure
+working with this team of fine people.
+
+Notable code and documentation contributions were made by
+a number of people. @xref{Contributors} for the full list.
+
+@ifset FOR_PRINT
+@cindex Oram, Andy
+Thanks to Andy Oram of O'Reilly Media for initiating
+the fourth edition and for his support during the work.
+Thanks to Jasmine Kwityn for her copyediting work.
+@end ifset
+
+Thanks to Michael Brennan for the Forewords.
+
+@cindex Duman, Patrice
+@cindex Berry, Karl
+Thanks to Patrice Dumas for the new @command{makeinfo} program.
+Thanks to Karl Berry, who continues to work to keep
+the Texinfo markup language sane.
+
+@cindex Kernighan, Brian
+@cindex Brennan, Michael
+@cindex Day, Robert P.J.@:
+Robert P.J.@: Day, Michael Brennan, and Brian Kernighan kindly acted as
+reviewers for the 2015 edition of this @value{DOCUMENT}. Their feedback
+helped improve the final work.
+
+I would also like to thank Brian Kernighan for his invaluable assistance during the
+testing and debugging of @command{gawk}, and for his ongoing
+help and advice in clarifying numerous points about the language.
+We could not have done nearly as good a job on either @command{gawk}
+or its documentation without his help.
+
+Brian is in a class by himself as a programmer and technical
+author.  I have to thank him (yet again) for his ongoing friendship
+and for being a role model to me for close to 30 years!
+Having him as a reviewer is an exciting privilege. It has also
+been extremely humbling@enddots{}
+
+@cindex Robbins, Miriam
+@cindex Robbins, Jean
+@cindex Robbins, Harry
+@cindex G-d
+I must thank my wonderful wife, Miriam, for her patience through
+the many versions of this project, for her proofreading,
+and for sharing me with the computer.
+I would like to thank my parents for their love, and for the grace with
+which they raised and educated me.
+Finally, I also must acknowledge my gratitude to G-d, for the many opportunities
+He has sent my way, as well as for the gifts He has given me with which to
+take advantage of those opportunities.
+@ifnotdocbook
+@sp 2
+@noindent
+Arnold Robbins @*
+Nof Ayalon @*
+Israel @*
+February 2015
+@end ifnotdocbook
+
+@ifnotinfo
+@part @value{PART1}The @command{awk} Language
+@end ifnotinfo
+
+@ifdocbook
+
+Part I describes the @command{awk} language and @command{gawk} program
+in detail.  It starts with the basics, and continues through all of
+the features of @command{awk}. Included also are many, but not all,
+of the features of @command{gawk}.  This part contains the
+following chapters:
+
+@itemize @value{BULLET}
+@item
+@ref{Getting Started}
+
+@item
+@ref{Invoking Gawk}
+
+@item
+@ref{Regexp}
+
+@item
+@ref{Reading Files}
+
+@item
+@ref{Printing}
+
+@item
+@ref{Expressions}
+
+@item
+@ref{Patterns and Actions}
+
+@item
+@ref{Arrays}
+
+@item
+@ref{Functions}
+@end itemize
+@end ifdocbook
+
+@node Getting Started
+@chapter Getting Started with @command{awk}
+@c @cindex script, definition of
+@c @cindex rule, definition of
+@c @cindex program, definition of
+@c @cindex basic function of @command{awk}
+@cindex @command{awk}, function of
+
+The basic function of @command{awk} is to search files for lines (or other
+units of text) that contain certain patterns.  When a line matches one
+of the patterns, @command{awk} performs specified actions on that line.
+@command{awk} continues to process input lines in this way until it reaches
+the end of the input files.
+
+@cindex @command{awk}, uses for
+@cindex programming languages@comma{} data-driven vs.@: procedural
+@cindex @command{awk} programs
+Programs in @command{awk} are different from programs in most other languages,
+because @command{awk} programs are @dfn{data driven} (i.e., you describe
+the data you want to work with and then what to do when you find it).
+Most other languages are @dfn{procedural}; you have to describe, in great
+detail, every step the program should take.  When working with procedural
+languages, it is usually much
+harder to clearly describe the data your program will process.
+For this reason, @command{awk} programs are often refreshingly easy to
+read and write.
+
+@cindex program, definition of
+@cindex rule, definition of
+When you run @command{awk}, you specify an @command{awk} @dfn{program} that
+tells @command{awk} what to do.  The program consists of a series of
+@dfn{rules} (it may also contain @dfn{function definitions},
+an advanced feature that we will ignore for now;
+@pxref{User-defined}).  Each rule specifies one
+pattern to search for and one action to perform
+upon finding the pattern.
+
+Syntactically, a rule consists of a @dfn{pattern} followed by an
+@dfn{action}.  The action is enclosed in braces to separate it from the
+pattern.  Newlines usually separate rules.  Therefore, an @command{awk}
+program looks like this:
+
+@example
+@var{pattern} @{ @var{action} @}
+@var{pattern} @{ @var{action} @}
+@dots{}
+@end example
+
+@menu
+* Running gawk::                How to run @command{gawk} programs; includes
+                                command-line syntax.
+* Sample Data Files::           Sample data files for use in the @command{awk}
+                                programs illustrated in this @value{DOCUMENT}.
+* Very Simple::                 A very simple example.
+* Two Rules::                   A less simple one-line example using two
+                                rules.
+* More Complex::                A more complex example.
+* Statements/Lines::            Subdividing or combining statements into
+                                lines.
+* Other Features::              Other Features of @command{awk}.
+* When::                        When to use @command{gawk} and when to use
+                                other things.
+* Intro Summary::               Summary of the introduction.
+@end menu
+
+@node Running gawk
+@section How to Run @command{awk} Programs
+
+@cindex @command{awk} programs, running
+There are several ways to run an @command{awk} program.  If the program is
+short, it is easiest to include it in the command that runs @command{awk},
+like this:
+
+@example
+awk '@var{program}' @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@cindex command line, formats
+When the program is long, it is usually more convenient to put it in a file
+and run it with a command like this:
+
+@example
+awk -f @var{program-file} @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+This @value{SECTION} discusses both mechanisms, along with several
+variations of each.
+
+@menu
+* One-shot::                    Running a short throwaway @command{awk}
+                                program.
+* Read Terminal::               Using no input files (input from the keyboard
+                                instead).
+* Long::                        Putting permanent @command{awk} programs in
+                                files.
+* Executable Scripts::          Making self-contained @command{awk} programs.
+* Comments::                    Adding documentation to @command{gawk}
+                                programs.
+* Quoting::                     More discussion of shell quoting issues.
+@end menu
+
+@node One-shot
+@subsection One-Shot Throwaway @command{awk} Programs
+
+Once you are familiar with @command{awk}, you will often type in simple
+programs the moment you want to use them.  Then you can write the
+program as the first argument of the @command{awk} command, like this:
+
+@example
+awk '@var{program}' @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@noindent
+where @var{program} consists of a series of patterns and
+actions, as described earlier.
+
+@cindex single quote (@code{'})
+@cindex @code{'} (single quote)
+This command format instructs the @dfn{shell}, or command interpreter,
+to start @command{awk} and use the @var{program} to process records in the
+input file(s).  There are single quotes around @var{program} so
+the shell won't interpret any @command{awk} characters as special shell
+characters.  The quotes also cause the shell to treat all of @var{program} as
+a single argument for @command{awk}, and allow @var{program} to be more
+than one line long.
+
+@cindex shells, scripts
+@cindex @command{awk} programs, running, from shell scripts
+This format is also useful for running short or medium-sized @command{awk}
+programs from shell scripts, because it avoids the need for a separate
+file for the @command{awk} program.  A self-contained shell script is more
+reliable because there are no other files to misplace.
+
+Later in this chapter, in
+@ifdocbook
+the @value{SECTION}
+@end ifdocbook
+@ref{Very Simple},
+we'll see examples of several short,
+self-contained programs.
+
+@node Read Terminal
+@subsection Running @command{awk} Without Input Files
+
+@cindex standard input
+@cindex input, standard
+@cindex input files, running @command{awk} without
+You can also run @command{awk} without any input files.  If you type the
+following command line:
+
+@example
+awk '@var{program}'
+@end example
+
+@noindent
+@command{awk} applies the @var{program} to the @dfn{standard input},
+which usually means whatever you type on the keyboard.  This continues
+until you indicate end-of-file by typing @kbd{Ctrl-d}.
+(On non-POSIX operating systems, the end-of-file character may be different.)
+
+@cindex files, input, See input files
+@cindex input files, running @command{awk} without
+@cindex @command{awk} programs, running, without input files
+As an example, the following program prints a friendly piece of advice
+(from Douglas Adams's @cite{The Hitchhiker's Guide to the Galaxy}),
+to keep you from worrying about the complexities of computer
+programming:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Don\47t Panic!" @}'}
+@print{} Don't Panic!
+@end example
+
+@command{awk} executes statements associated with @code{BEGIN} before
+reading any input.  If there are no other statements in your program,
+as is the case here, @command{awk} just stops, instead of trying to read
+input it doesn't know how to process.
+The @samp{\47} is a magic way (explained later) of getting a single quote into
+the program, without having to engage in ugly shell quoting tricks.
+
+@quotation NOTE
+If you use Bash as your shell, you should execute the
+command @samp{set +H} before running this program interactively, to
+disable the C shell-style command history, which treats @samp{!} as a
+special character. We recommend putting this command into your personal
+startup file.
+@end quotation
+
+This next simple @command{awk} program
+emulates the @command{cat} utility; it copies whatever you type on the
+keyboard to its standard output (why this works is explained shortly):
+
+@example
+$ @kbd{awk '@{ print @}'}
+@kbd{Now is the time for all good men}
+@print{} Now is the time for all good men
+@kbd{to come to the aid of their country.}
+@print{} to come to the aid of their country.
+@kbd{Four score and seven years ago, ...}
+@print{} Four score and seven years ago, ...
+@kbd{What, me worry?}
+@print{} What, me worry?
+@kbd{Ctrl-d}
+@end example
+
+@node Long
+@subsection Running Long Programs
+
+@cindex @command{awk} programs, running
+@cindex @command{awk} programs, lengthy
+@cindex files, @command{awk} programs in
+Sometimes @command{awk} programs are very long.  In these cases, it is
+more convenient to put the program into a separate file.  In order to tell
+@command{awk} to use that file for its program, you type:
+
+@example
+awk -f @var{source-file} @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@cindex @option{-f} option
+@cindex command line, option @option{-f}
+The @option{-f} instructs the @command{awk} utility to get the
+@command{awk} program from the file @var{source-file} (@pxref{Options}).
+Any @value{FN} can be used for @var{source-file}.  For example, you
+could put the program:
+
+@example
+BEGIN @{ print "Don't Panic!" @}
+@end example
+
+@noindent
+into the file @file{advice}.  Then this command:
+
+@example
+awk -f advice
+@end example
+
+@noindent
+does the same thing as this one:
+
+@example
+awk 'BEGIN @{ print "Don\47t Panic!" @}'
+@end example
+
+@cindex quoting, in @command{gawk} command lines
+@noindent
+This was explained earlier
+(@pxref{Read Terminal}).
+Note that you don't usually need single quotes around the @value{FN} that you
+specify with @option{-f}, because most @value{FN}s don't contain any of the shell's
+special characters.  Notice that in @file{advice}, the @command{awk}
+program did not have single quotes around it.  The quotes are only needed
+for programs that are provided on the @command{awk} command line.
+(Also, placing the program in a file allows us to use a literal single quote in the program
+text, instead of the magic @samp{\47}.)
+
+@cindex single quote (@code{'}) in @command{gawk} command lines
+@cindex @code{'} (single quote) in @command{gawk} command lines
+If you want to clearly identify an @command{awk} program file as such,
+you can add the extension @file{.awk} to the @value{FN}.  This doesn't
+affect the execution of the @command{awk} program but it does make
+``housekeeping'' easier.
+
+@node Executable Scripts
+@subsection Executable @command{awk} Programs
+@cindex @command{awk} programs
+@cindex @code{#} (number sign), @code{#!} (executable scripts)
+@cindex Unix, @command{awk} scripts and
+@cindex number sign (@code{#}), @code{#!} (executable scripts)
+
+Once you have learned @command{awk}, you may want to write self-contained
+@command{awk} scripts, using the @samp{#!} script mechanism.  You can do
+this on many systems.@footnote{The @samp{#!} mechanism works on
+GNU/Linux systems, BSD-based systems, and commercial Unix systems.}
+For example, you could update the file @file{advice} to look like this:
+
+@example
+#! /bin/awk -f
+
+BEGIN @{ print "Don't Panic!" @}
+@end example
+
+@noindent
+After making this file executable (with the @command{chmod} utility),
+simply type @samp{advice}
+at the shell and the system arranges to run @command{awk} as if you had
+typed @samp{awk -f advice}:
+
+@example
+$ @kbd{chmod +x advice}
+$ @kbd{advice}
+@print{} Don't Panic!
+@end example
+
+@noindent
+(We assume you have the current directory in your shell's search
+path variable [typically @code{$PATH}].  If not, you may need
+to type @samp{./advice} at the shell.)
+
+Self-contained @command{awk} scripts are useful when you want to write a
+program that users can invoke without their having to know that the program is
+written in @command{awk}.
+
+@cindex sidebar, Understanding @samp{#!}
+@ifdocbook
+@docbook
+<sidebar><title>Understanding @samp{#!}</title>
+@end docbook
+
+@cindex portability, @code{#!} (executable scripts)
+
+@command{awk} is an @dfn{interpreted} language. This means that the
+@command{awk} utility reads your program and then processes your data
+according to the instructions in your program. (This is different
+from a @dfn{compiled} language such as C, where your program is first
+compiled into machine code that is executed directly by your system's
+processor.)  The @command{awk} utility is thus termed an @dfn{interpreter}.
+Many modern languages are interpreted.
+
+The line beginning with @samp{#!} lists the full @value{FN} of an
+interpreter to run and a single optional initial command-line argument
+to pass to that interpreter.  The operating system then runs the
+interpreter with the given argument and the full argument list of the
+executed program.  The first argument in the list is the full @value{FN}
+of the @command{awk} program.  The rest of the argument list contains
+either options to @command{awk}, or @value{DF}s, or both. (Note that on
+many systems @command{awk} may be found in @file{/usr/bin} instead of
+in @file{/bin}.)
+
+Some systems limit the length of the interpreter name to 32 characters.
+Often, this can be dealt with by using a symbolic link.
+
+You should not put more than one argument on the @samp{#!}
+line after the path to @command{awk}. It does not work. The operating system
+treats the rest of the line as a single argument and passes it to @command{awk}.
+Doing this leads to confusing behavior---most likely a usage diagnostic
+of some sort from @command{awk}.
+
+@cindex @code{ARGC}/@code{ARGV} variables, portability and
+@cindex portability, @code{ARGV} variable
+@cindex dark corner, @code{ARGV} variable, value of
+Finally, the value of @code{ARGV[0]}
+(@pxref{Built-in Variables})
+varies depending upon your operating system.
+Some systems put @samp{awk} there, some put the full pathname
+of @command{awk} (such as @file{/bin/awk}), and some put the name
+of your script (@samp{advice}).  @value{DARKCORNER}
+Don't rely on the value of @code{ARGV[0]}
+to provide your script name.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Understanding @samp{#!}}
+
+
+@cindex portability, @code{#!} (executable scripts)
+
+@command{awk} is an @dfn{interpreted} language. This means that the
+@command{awk} utility reads your program and then processes your data
+according to the instructions in your program. (This is different
+from a @dfn{compiled} language such as C, where your program is first
+compiled into machine code that is executed directly by your system's
+processor.)  The @command{awk} utility is thus termed an @dfn{interpreter}.
+Many modern languages are interpreted.
+
+The line beginning with @samp{#!} lists the full @value{FN} of an
+interpreter to run and a single optional initial command-line argument
+to pass to that interpreter.  The operating system then runs the
+interpreter with the given argument and the full argument list of the
+executed program.  The first argument in the list is the full @value{FN}
+of the @command{awk} program.  The rest of the argument list contains
+either options to @command{awk}, or @value{DF}s, or both. (Note that on
+many systems @command{awk} may be found in @file{/usr/bin} instead of
+in @file{/bin}.)
+
+Some systems limit the length of the interpreter name to 32 characters.
+Often, this can be dealt with by using a symbolic link.
+
+You should not put more than one argument on the @samp{#!}
+line after the path to @command{awk}. It does not work. The operating system
+treats the rest of the line as a single argument and passes it to @command{awk}.
+Doing this leads to confusing behavior---most likely a usage diagnostic
+of some sort from @command{awk}.
+
+@cindex @code{ARGC}/@code{ARGV} variables, portability and
+@cindex portability, @code{ARGV} variable
+@cindex dark corner, @code{ARGV} variable, value of
+Finally, the value of @code{ARGV[0]}
+(@pxref{Built-in Variables})
+varies depending upon your operating system.
+Some systems put @samp{awk} there, some put the full pathname
+of @command{awk} (such as @file{/bin/awk}), and some put the name
+of your script (@samp{advice}).  @value{DARKCORNER}
+Don't rely on the value of @code{ARGV[0]}
+to provide your script name.
+@end cartouche
+@end ifnotdocbook
+
+@node Comments
+@subsection Comments in @command{awk} Programs
+@cindex @code{#} (number sign), commenting
+@cindex number sign (@code{#}), commenting
+@cindex commenting
+@cindex @command{awk} programs, documenting
+
+A @dfn{comment} is some text that is included in a program for the sake
+of human readers; it is not really an executable part of the program.  Comments
+can explain what the program does and how it works.  Nearly all
+programming languages have provisions for comments, as programs are
+typically hard to understand without them.
+
+In the @command{awk} language, a comment starts with the number sign
+character (@samp{#}) and continues to the end of the line.
+The @samp{#} does not have to be the first character on the line. The
+@command{awk} language ignores the rest of a line following a number sign.
+For example, we could have put the following into @file{advice}:
+
+@example
+# This program prints a nice, friendly message.  It helps
+# keep novice users from being afraid of the computer.
+BEGIN    @{ print "Don't Panic!" @}
+@end example
+
+You can put comment lines into keyboard-composed throwaway @command{awk}
+programs, but this usually isn't very useful; the purpose of a
+comment is to help you or another person understand the program
+when reading it at a later time.
+
+@cindex quoting, for small awk programs
+@cindex single quote (@code{'}), vs.@: apostrophe
+@cindex @code{'} (single quote), vs.@: apostrophe
+@quotation CAUTION
+As mentioned in
+@ref{One-shot},
+you can enclose short to medium-sized programs in single quotes,
+in order to keep
+your shell scripts self-contained.  When doing so, @emph{don't} put
+an apostrophe (i.e., a single quote) into a comment (or anywhere else
+in your program). The shell interprets the quote as the closing
+quote for the entire program. As a result, usually the shell
+prints a message about mismatched quotes, and if @command{awk} actually
+runs, it will probably print strange messages about syntax errors.
+For example, look at the following:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "hello" @} # let's be cute'}
+>
+@end example
+
+The shell sees that the first two quotes match, and that
+a new quoted object begins at the end of the command line.
+It therefore prompts with the secondary prompt, waiting for more input.
+With Unix @command{awk}, closing the quoted string produces this result:
+
+@example
+$ @kbd{awk '@{ print "hello" @} # let's be cute'}
+> @kbd{'}
+@error{} awk: can't open file be
+@error{}  source line number 1
+@end example
+
+@cindex @code{\} (backslash)
+@cindex backslash (@code{\})
+Putting a backslash before the single quote in @samp{let's} wouldn't help,
+because backslashes are not special inside single quotes.
+The next @value{SUBSECTION} describes the shell's quoting rules.
+@end quotation
+
+@node Quoting
+@subsection Shell Quoting Issues
+@cindex shell quoting, rules for
+
+@menu
+* DOS Quoting::                 Quoting in Windows Batch Files.
+@end menu
+
+For short to medium-length @command{awk} programs, it is most convenient
+to enter the program on the @command{awk} command line.
+This is best done by enclosing the entire program in single quotes.
+This is true whether you are entering the program interactively at
+the shell prompt, or writing it as part of a larger shell script:
+
+@example
+awk '@var{program text}' @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@cindex shells, quoting, rules for
+@cindex Bourne shell, quoting rules for
+Once you are working with the shell, it is helpful to have a basic
+knowledge of shell quoting rules.  The following rules apply only to
+POSIX-compliant, Bourne-style shells (such as Bash, the GNU Bourne-Again
+Shell).  If you use the C shell, you're on your own.
+
+Before diving into the rules, we introduce a concept that appears
+throughout this @value{DOCUMENT}, which is that of the @dfn{null},
+or empty, string.
+
+The null string is character data that has no value.
+In other words, it is empty.  It is written in @command{awk} programs
+like this: @code{""}. In the shell, it can be written using single
+or double quotes: @code{""} or @code{''}. Although the null string has
+no characters in it, it does exist. For example, consider this command:
+
+@example
+$ @kbd{echo ""}
+@end example
+
+@noindent
+Here, the @command{echo} utility receives a single argument, even
+though that argument has no characters in it. In the rest of this
+@value{DOCUMENT}, we use the terms @dfn{null string} and @dfn{empty string}
+interchangeably.  Now, on to the quoting rules:
+
+@itemize @value{BULLET}
+@item
+Quoted items can be concatenated with nonquoted items as well as with other
+quoted items.  The shell turns everything into one argument for
+the command.
+
+@item
+Preceding any single character with a backslash (@samp{\}) quotes
+that character.  The shell removes the backslash and passes the quoted
+character on to the command.
+
+@item
+@cindex @code{\} (backslash), in shell commands
+@cindex backslash (@code{\}), in shell commands
+@cindex single quote (@code{'}), in shell commands
+@cindex @code{'} (single quote), in shell commands
+Single quotes protect everything between the opening and closing quotes.
+The shell does no interpretation of the quoted text, passing it on verbatim
+to the command.
+It is @emph{impossible} to embed a single quote inside single-quoted text.
+Refer back to
+@ref{Comments}
+for an example of what happens if you try.
+
+@item
+@cindex double quote (@code{"}), in shell commands
+@cindex @code{"} (double quote), in shell commands
+Double quotes protect most things between the opening and closing quotes.
+The shell does at least variable and command substitution on the quoted text.
+Different shells may do additional kinds of processing on double-quoted text.
+
+Because certain characters within double-quoted text are processed by the shell,
+they must be @dfn{escaped} within the text.  Of note are the characters
+@samp{$}, @samp{`}, @samp{\}, and @samp{"}, all of which must be preceded by
+a backslash within double-quoted text if they are to be passed on literally
+to the program.  (The leading backslash is stripped first.)
+Thus, the example seen
+@ifnotinfo
+previously
+@end ifnotinfo
+in @ref{Read Terminal}:
+
+@example
+awk 'BEGIN @{ print "Don\47t Panic!" @}'
+@end example
+
+@noindent
+could instead be written this way:
+
+@example
+$ @kbd{awk "BEGIN @{ print \"Don't Panic!\" @}"}
+@print{} Don't Panic!
+@end example
+
+@cindex single quote (@code{'}), with double quotes
+@cindex @code{'} (single quote), with double quotes
+Note that the single quote is not special within double quotes.
+
+@item
+Null strings are removed when they occur as part of a non-null
+command-line argument, while explicit null objects are kept.
+For example, to specify that the field separator @code{FS} should
+be set to the null string, use:
+
+@example
+awk -F "" '@var{program}' @var{files} # correct
+@end example
+
+@noindent
+@cindex null strings in @command{gawk} arguments, quoting and
+Don't use this:
+
+@example
+awk -F"" '@var{program}' @var{files}  # wrong!
+@end example
+
+@noindent
+In the second case, @command{awk} attempts to use the text of the program
+as the value of @code{FS}, and the first @value{FN} as the text of the program!
+This results in syntax errors at best, and confusing behavior at worst.
+@end itemize
+
+@cindex quoting, in @command{gawk} command lines, tricks for
+Mixing single and double quotes is difficult.  You have to resort
+to shell quoting tricks, like this:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Here is a single quote <'"'"'>" @}'}
+@print{} Here is a single quote <'>
+@end example
+
+@noindent
+This program consists of three concatenated quoted strings.  The first and the
+third are single-quoted, and the second is double-quoted.
+
+This can be ``simplified'' to:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Here is a single quote <'\''>" @}'}
+@print{} Here is a single quote <'>
+@end example
+
+@noindent
+Judge for yourself which of these two is the more readable.
+
+Another option is to use double quotes, escaping the embedded, @command{awk}-level
+double quotes:
+
+@example
+$ @kbd{awk "BEGIN @{ print \"Here is a single quote <'>\" @}"}
+@print{} Here is a single quote <'>
+@end example
+
+@noindent
+This option is also painful, because double quotes, backslashes, and dollar signs
+are very common in more advanced @command{awk} programs.
+
+A third option is to use the octal escape sequence equivalents
+(@pxref{Escape Sequences})
+for the
+single- and double-quote characters, like so:
+
+@example
+@group
+$ @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 <">
+@end group
+@end example
+
+@noindent
+This works nicely, but you should comment clearly what the
+escapes mean.
+
+A fourth option is to use command-line variable assignment, like this:
+
+@example
+$ @kbd{awk -v sq="'" 'BEGIN @{ print "Here is a single quote <" sq ">" @}'}
+@print{} Here is a single quote <'>
+@end example
+
+(Here, the two string constants and the value of @code{sq} are concatenated
+into a single string that is printed by @code{print}.)
+
+If you really need both single and double quotes in your @command{awk}
+program, it is probably best to move it into a separate file, where
+the shell won't be part of the picture and you can say what you mean.
+
+@node DOS Quoting
+@subsubsection Quoting in MS-Windows Batch Files
+
+@ignore
+Date: Wed, 21 May 2008 09:58:43 +0200 (CEST)
+From: jeroen.brink@inter.NL.net
+Subject: (g)awk "contribution"
+To: arnold@skeeve.com
+Message-id: <42220.193.172.132.34.1211356723.squirrel@webmail.internl.net>
+
+Hello Arnold,
+
+maybe you can help me out. Found your email on the GNU/awk online manual
+pages.
+
+I've searched hard to figure out how, on Windows, to print double quotes.
+Couldn't find it in the Quotes area, nor on google or elsewhere. Finally i
+figured out how to do this myself.
+
+How to print all lines in a file surrounded by double quotes (on Windows):
+
+gawk "{ print \"\042\" $0 \"\042\" }" <file>
+
+Maybe this is a helpfull tip for other (Windows) gawk users. However, i
+don't have a clue as to where to "publish" this tip! Do you?
+
+Kind regards,
+
+Jeroen Brink
+@end ignore
+
+Although this @value{DOCUMENT} generally only worries about POSIX systems and the
+POSIX shell, the following issue arises often enough for many users that
+it is worth addressing.
+
+@cindex Brink, Jeroen
+The ``shells'' on Microsoft Windows systems use the double-quote
+character for quoting, and make it difficult or impossible to include an
+escaped double-quote character in a command-line script.  The following
+example, courtesy of Jeroen Brink, shows how to escape the double quotes
+from this one liner script that prints all lines in a file surrounded by
+double quotes:
+
+@example
+@{ print "\"" $0 "\"" @}
+@end example
+
+@noindent
+In an MS-Windows command-line the one-liner script above may be passed as
+follows:
+
+@example
+gawk "@{ print \"\042\" $0 \"\042\" @}" @var{file}
+@end example
+
+In this example the @samp{\042} is the octal code for a double-quote;
+@command{gawk} converts it into a real double-quote for output by
+the @code{print} statement.
+
+In MS-Windows escaping double-quotes is a little tricky because you use
+backslashes to escape double-quotes, but backslashes themselves are not
+escaped in the usual way; indeed they are either duplicated or not,
+depending upon whether there is a subsequent double-quote.  The MS-Windows
+rule for double-quoting a string is the following:
+
+@enumerate
+@item
+For each double quote in the original string, let @var{N} be the number
+of backslash(es) before it, @var{N} might be zero. Replace these @var{N}
+backslash(es) by @math{2@value{TIMES}@var{N}+1} backslash(es)
+
+@item
+Let @var{N} be the number of backslash(es) tailing the original string,
+@var{N} might be zero. Replace these @var{N} backslash(es) by
+@math{2@value{TIMES}@var{N}} backslash(es)
+
+@item
+Surround the resulting string by double-quotes.
+@end enumerate
+
+So to double-quote the one-liner script @samp{@{ print "\"" $0 "\"" @}}
+from the previous example you would do it this way:
+
+@example
+gawk "@{ print \"\\\"\" $0 \"\\\"\" @}" @var{file}
+@end example
+
+@noindent
+However, the use of @samp{\042} instead of @samp{\\\"} is also possible
+and easier to read, because backslashes that are not followed by a
+double-quote don't need duplication.
+
+@node Sample Data Files
+@section @value{DDF}s for the Examples
+
+@cindex input files, examples
+@cindex @code{mail-list} file
+Many of the examples in this @value{DOCUMENT} take their input from two sample
+@value{DF}s.  The first, @file{mail-list}, represents a list of peoples' names
+together with their email addresses and information about those people.
+The second @value{DF}, called @file{inventory-shipped}, contains
+information about monthly shipments.  In both files,
+each line is considered to be one @dfn{record}.
+
+In @file{mail-list}, each record contains the name of a person,
+his/her phone number, his/her email address, and a code for his/her relationship
+with the author of the list.
+The columns are aligned using spaces.
+An @samp{A} in the last column
+means that the person is an acquaintance.  An @samp{F} in the last
+column means that the person is a friend.
+An @samp{R} means that the person is a relative:
+
+@example
+@c system if test ! -d eg      ; then mkdir eg      ; fi
+@c system if test ! -d eg/lib  ; then mkdir eg/lib  ; fi
+@c system if test ! -d eg/data ; then mkdir eg/data ; fi
+@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi
+@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi
+@c file eg/data/mail-list
+Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+Anthony      555-3412     anthony.asserturo@@hotmail.com   A
+Becky        555-7685     becky.algebrarum@@gmail.com      A
+Bill         555-1675     bill.drowning@@hotmail.com       A
+Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
+Camilla      555-2912     camilla.infusarum@@skynet.be     R
+Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
+Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+Martin       555-6480     martin.codicibus@@hotmail.com    A
+Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@c endfile
+@end example
+
+@cindex @code{inventory-shipped} file
+The @value{DF} @file{inventory-shipped} represents
+information about shipments during the year.
+Each record contains the month, the number
+of green crates shipped, the number of red boxes shipped, the number of
+orange bags shipped, and the number of blue packages shipped,
+respectively.  There are 16 entries, covering the 12 months of last year
+and the first four months of the current year.
+An empty line separates the data for the two years:
+
+@example
+@c file eg/data/inventory-shipped
+Jan  13  25  15 115
+Feb  15  32  24 226
+Mar  15  24  34 228
+Apr  31  52  63 420
+May  16  34  29 208
+Jun  31  42  75 492
+Jul  24  34  67 436
+Aug  15  34  47 316
+Sep  13  55  37 277
+Oct  29  54  68 525
+Nov  20  87  82 577
+Dec  17  35  61 401
+
+Jan  21  36  64 620
+Feb  26  58  80 652
+Mar  24  75  70 495
+Apr  21  70  74 514
+@c endfile
+@end example
+
+The sample files are included in the @command{gawk} distribution,
+in the directory @file{awklib/eg/data}.
+
+@node Very Simple
+@section Some Simple Examples
+
+The following command runs a simple @command{awk} program that searches the
+input file @file{mail-list} for the character string @samp{li} (a
+grouping of characters is usually called a @dfn{string};
+the term @dfn{string} is based on similar usage in English, such
+as ``a string of pearls'' or ``a string of cars in a train''):
+
+@example
+awk '/li/ @{ print $0 @}' mail-list
+@end example
+
+@noindent
+When lines containing @samp{li} are found, they are printed because
+@w{@samp{print $0}} means print the current line.  (Just @samp{print} by
+itself means the same thing, so we could have written that
+instead.)
+
+You will notice that slashes (@samp{/}) surround the string @samp{li}
+in the @command{awk} program.  The slashes indicate that @samp{li}
+is the pattern to search for.  This type of pattern is called a
+@dfn{regular expression}, which is covered in more detail later
+(@pxref{Regexp}).
+The pattern is allowed to match parts of words.
+There are
+single quotes around the @command{awk} program so that the shell won't
+interpret any of it as special shell characters.
+
+Here is what this program prints:
+
+@example
+$ @kbd{awk '/li/ @{ print $0 @}' mail-list}
+@print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+@print{} Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
+@print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+@print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+@end example
+
+@cindex actions, default
+@cindex patterns, default
+In an @command{awk} rule, either the pattern or the action can be omitted,
+but not both.  If the pattern is omitted, then the action is performed
+for @emph{every} input line.  If the action is omitted, the default
+action is to print all lines that match the pattern.
+
+@cindex actions, empty
+Thus, we could leave out the action (the @code{print} statement and the
+braces) in the previous example and the result would be the same:
+@command{awk} prints all lines matching the pattern @samp{li}.  By comparison,
+omitting the @code{print} statement but retaining the braces makes an
+empty action that does nothing (i.e., no lines are printed).
+
+@cindex @command{awk} programs, one-line examples
+Many practical @command{awk} programs are just a line or two long.  Following is a
+collection of useful, short programs to get you started.  Some of these
+programs contain constructs that haven't been covered yet. (The description
+of the program will give you a good idea of what is going on, but you'll
+need to read the rest of the @value{DOCUMENT} to become an @command{awk} expert!)
+Most of the examples use a @value{DF} named @file{data}.  This is just a
+placeholder; if you use these programs yourself, substitute
+your own @value{FN}s for @file{data}.
+For future reference, note that there is often more than
+one way to do things in @command{awk}.  At some point, you may want
+to look back at these examples and see if
+you can come up with different ways to do the same things shown here:
+
+@itemize @value{BULLET}
+@item
+Print every line that is longer than 80 characters:
+
+@example
+awk 'length($0) > 80' data
+@end example
+
+The sole rule has a relational expression as its pattern and has no
+action---so it uses the default action, printing the record.
+
+@item
+Print the length of the longest input line:
+
+@example
+@group
+awk '@{ if (length($0) > max) max = length($0) @}
+     END @{ print max @}' data
+@end group
+@end example
+
+The code associated with @code{END} executes after all
+input has been read; it's the other side of the coin to @code{BEGIN}.
+
+@cindex @command{expand} utility
+@item
+Print the length of the longest line in @file{data}:
+
+@example
+expand data | awk '@{ if (x < length($0)) x = length($0) @}
+                   END @{ print "maximum line length is " x @}'
+@end example
+
+This example differs slightly from the previous one:
+the input is processed by the @command{expand} utility to change TABs
+into spaces, so the widths compared are actually the right-margin columns,
+as opposed to the number of input characters on each line.
+
+@item
+Print every line that has at least one field:
+
+@example
+awk 'NF > 0' data
+@end example
+
+This is an easy way to delete blank lines from a file (or rather, to
+create a new file similar to the old file but from which the blank lines
+have been removed).
+
+@item
+Print seven random numbers from 0 to 100, inclusive:
+
+@example
+awk 'BEGIN @{ for (i = 1; i <= 7; i++)
+                 print int(101 * rand()) @}'
+@end example
+
+@item
+Print the total number of bytes used by @var{files}:
+
+@example
+ls -l @var{files} | awk '@{ x += $5 @}
+                   END @{ print "total bytes: " x @}'
+@end example
+
+@item
+Print the total number of kilobytes used by @var{files}:
+
+@c Don't use \ continuation, not discussed yet
+@c Remember that awk does floating point division,
+@c no need for (x+1023) / 1024
+@example
+ls -l @var{files} | awk '@{ x += $5 @}
+   END @{ print "total K-bytes:", x / 1024 @}'
+@end example
+
+@item
+Print a sorted list of the login names of all users:
+
+@example
+awk -F: '@{ print $1 @}' /etc/passwd | sort
+@end example
+
+@item
+Count the lines in a file:
+
+@example
+awk 'END @{ print NR @}' data
+@end example
+
+@item
+Print the even-numbered lines in the @value{DF}:
+
+@example
+awk 'NR % 2 == 0' data
+@end example
+
+If you used the expression @samp{NR % 2 == 1} instead,
+the program would print the odd-numbered lines.
+@end itemize
+
+@node Two Rules
+@section An Example with Two Rules
+@cindex @command{awk} programs
+
+The @command{awk} utility reads the input files one line at a
+time.  For each line, @command{awk} tries the patterns of each rule.
+If several patterns match, then several actions execute in the order in
+which they appear in the @command{awk} program.  If no patterns match, then
+no actions run.
+
+After processing all the rules that match the line (and perhaps there are none),
+@command{awk} reads the next line.  (However,
+@pxref{Next Statement}
+@ifdocbook
+and @ref{Nextfile Statement}.)
+@end ifdocbook
+@ifnotdocbook
+and also @pxref{Nextfile Statement}.)
+@end ifnotdocbook
+This continues until the program reaches the end of the file.
+For example, the following @command{awk} program contains two rules:
+
+@example
+/12/  @{ print $0 @}
+/21/  @{ print $0 @}
+@end example
+
+@noindent
+The first rule has the string @samp{12} as the
+pattern and @samp{print $0} as the action.  The second rule has the
+string @samp{21} as the pattern and also has @samp{print $0} as the
+action.  Each rule's action is enclosed in its own pair of braces.
+
+This program prints every line that contains the string
+@samp{12} @emph{or} the string @samp{21}.  If a line contains both
+strings, it is printed twice, once by each rule.
+
+This is what happens if we run this program on our two sample @value{DF}s,
+@file{mail-list} and @file{inventory-shipped}:
+
+@example
+$ @kbd{awk '/12/ @{ print $0 @}}
+>      @kbd{/21/ @{ print $0 @}' mail-list inventory-shipped}
+@print{} Anthony      555-3412     anthony.asserturo@@hotmail.com   A
+@print{} Camilla      555-2912     camilla.infusarum@@skynet.be     R
+@print{} Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@print{} Jan  21  36  64 620
+@print{} Apr  21  70  74 514
+@end example
+
+@noindent
+Note how the line beginning with @samp{Jean-Paul}
+in @file{mail-list} was printed twice, once for each rule.
+
+@node More Complex
+@section A More Complex Example
+
+Now that we've mastered some simple tasks, let's look at
+what typical @command{awk}
+programs do.  This example shows how @command{awk} can be used to
+summarize, select, and rearrange the output of another utility.  It uses
+features that haven't been covered yet, so don't worry if you don't
+understand all the details:
+
+@example
+ls -l | awk '$6 == "Nov" @{ sum += $5 @}
+             END @{ print sum @}'
+@end example
+
+@cindex @command{ls} utility
+This command prints the total number of bytes in all the files in the
+current directory that were last modified in November (of any year).
+The @w{@samp{ls -l}} part of this example is a system command that gives
+you a listing of the files in a directory, including each file's size and the date
+the file was last modified. Its output looks like this:
+
+@example
+-rw-r--r--  1 arnold   user   1933 Nov  7 13:05 Makefile
+-rw-r--r--  1 arnold   user  10809 Nov  7 13:03 awk.h
+-rw-r--r--  1 arnold   user    983 Apr 13 12:14 awk.tab.h
+-rw-r--r--  1 arnold   user  31869 Jun 15 12:20 awkgram.y
+-rw-r--r--  1 arnold   user  22414 Nov  7 13:03 awk1.c
+-rw-r--r--  1 arnold   user  37455 Nov  7 13:03 awk2.c
+-rw-r--r--  1 arnold   user  27511 Dec  9 13:07 awk3.c
+-rw-r--r--  1 arnold   user   7989 Nov  7 13:03 awk4.c
+@end example
+
+@noindent
+@cindex line continuations, with C shell
+The first field contains read-write permissions, the second field contains
+the number of links to the file, and the third field identifies the file's owner.
+The fourth field identifies the file's group.
+The fifth field contains the file's size in bytes.  The
+sixth, seventh, and eighth fields contain the month, day, and time,
+respectively, that the file was last modified.  Finally, the ninth field
+contains the @value{FN}.
+
+@c @cindex automatic initialization
+@cindex initialization, automatic
+The @samp{$6 == "Nov"} in our @command{awk} program is an expression that
+tests whether the sixth field of the output from @w{@samp{ls -l}}
+matches the string @samp{Nov}.  Each time a line has the string
+@samp{Nov} for its sixth field, @command{awk} performs the action
+@samp{sum += $5}.  This adds the fifth field (the file's size) to the variable
+@code{sum}.  As a result, when @command{awk} has finished reading all the
+input lines, @code{sum} is the total of the sizes of the files whose
+lines matched the pattern.  (This works because @command{awk} variables
+are automatically initialized to zero.)
+
+After the last line of output from @command{ls} has been processed, the
+@code{END} rule executes and prints the value of @code{sum}.
+In this example, the value of @code{sum} is 80600.
+
+These more advanced @command{awk} techniques are covered in later
+@value{SECTION}s
+(@pxref{Action Overview}).  Before you can move on to more
+advanced @command{awk} programming, you have to know how @command{awk} interprets
+your input and displays your output.  By manipulating fields and using
+@code{print} statements, you can produce some very useful and
+impressive-looking reports.
+
+@node Statements/Lines
+@section @command{awk} Statements Versus Lines
+@cindex line breaks
+@cindex newlines
+
+Most often, each line in an @command{awk} program is a separate statement or
+separate rule, like this:
+
+@example
+awk '/12/  @{ print $0 @}
+     /21/  @{ print $0 @}' mail-list inventory-shipped
+@end example
+
+@cindex @command{gawk}, newlines in
+However, @command{gawk} ignores newlines after any of the following
+symbols and keywords:
+
+@example
+,    @{    ?    :    ||    &&    do    else
+@end example
+
+@noindent
+A newline at any other point is considered the end of the
+statement.@footnote{The @samp{?} and @samp{:} referred to here is the
+three-operand conditional expression described in
+@ref{Conditional Exp}.
+Splitting lines after @samp{?} and @samp{:} is a minor @command{gawk}
+extension; if @option{--posix} is specified
+(@pxref{Options}), then this extension is disabled.}
+
+@cindex @code{\} (backslash), continuing lines and
+@cindex backslash (@code{\}), continuing lines and
+If you would like to split a single statement into two lines at a point
+where a newline would terminate it, you can @dfn{continue} it by ending the
+first line with a backslash character (@samp{\}).  The backslash must be
+the final character on the line in order to be recognized as a continuation
+character.  A backslash is allowed anywhere in the statement, even
+in the middle of a string or regular expression.  For example:
+
+@example
+awk '/This regular expression is too long, so continue it\
+ on the next line/ @{ print $1 @}'
+@end example
+
+@noindent
+@cindex portability, backslash continuation and
+We have generally not used backslash continuation in our sample programs.
+@command{gawk} places no limit on the
+length of a line, so backslash continuation is never strictly necessary;
+it just makes programs more readable.  For this same reason, as well as
+for clarity, we have kept most statements short in the programs
+presented throughout the @value{DOCUMENT}.  Backslash continuation is
+most useful when your @command{awk} program is in a separate source file
+instead of entered from the command line.  You should also note that
+many @command{awk} implementations are more particular about where you
+may use backslash continuation. For example, they may not allow you to
+split a string constant using backslash continuation.  Thus, for maximum
+portability of your @command{awk} programs, it is best not to split your
+lines in the middle of a regular expression or a string.
+@c 10/2000: gawk, mawk, and current bell labs awk allow it,
+@c solaris 2.7 nawk does not. Solaris /usr/xpg4/bin/awk does though!  sigh.
+
+@cindex @command{csh} utility
+@cindex backslash (@code{\}), continuing lines and, in @command{csh}
+@cindex @code{\} (backslash), continuing lines and, in @command{csh}
+@quotation CAUTION
+@emph{Backslash continuation does not work as described
+with the C shell.}  It works for @command{awk} programs in files and
+for one-shot programs, @emph{provided} you are using a POSIX-compliant
+shell, such as the Unix Bourne shell or Bash.  But the C shell behaves
+differently!  There you must use two backslashes in a row, followed by
+a newline.  Note also that when using the C shell, @emph{every} newline
+in your @command{awk} program must be escaped with a backslash. To illustrate:
+
+@example
+% @kbd{awk 'BEGIN @{ \}
+? @kbd{  print \\}
+? @kbd{      "hello, world" \}
+? @kbd{@}'}
+@print{} hello, world
+@end example
+
+@noindent
+Here, the @samp{%} and @samp{?} are the C shell's primary and secondary
+prompts, analogous to the standard shell's @samp{$} and @samp{>}.
+
+Compare the previous example to how it is done with a POSIX-compliant shell:
+
+@example
+$ @kbd{awk 'BEGIN @{}
+>   @kbd{print \}
+>       @kbd{"hello, world"}
+> @kbd{@}'}
+@print{} hello, world
+@end example
+@end quotation
+
+@command{awk} is a line-oriented language.  Each rule's action has to
+begin on the same line as the pattern.  To have the pattern and action
+on separate lines, you @emph{must} use backslash continuation; there
+is no other option.
+
+@cindex backslash (@code{\}), continuing lines and, comments and
+@cindex @code{\} (backslash), continuing lines and, comments and
+@cindex commenting, backslash continuation and
+Another thing to keep in mind is that backslash continuation and
+comments do not mix. As soon as @command{awk} sees the @samp{#} that
+starts a comment, it ignores @emph{everything} on the rest of the
+line. For example:
+
+@example
+@group
+$ @kbd{gawk 'BEGIN @{ print "dont panic" # a friendly \}
+> @kbd{                                   BEGIN rule}
+> @kbd{@}'}
+@error{} gawk: cmd. line:2:                BEGIN rule
+@error{} gawk: cmd. line:2:                ^ syntax error
+@end group
+@end example
+
+@noindent
+In this case, it looks like the backslash would continue the comment onto the
+next line. However, the backslash-newline combination is never even
+noticed because it is ``hidden'' inside the comment. Thus, the
+@code{BEGIN} is noted as a syntax error.
+
+@cindex statements, multiple
+@cindex @code{;} (semicolon), separating statements in actions
+@cindex semicolon (@code{;}), separating statements in actions
+@cindex @code{;} (semicolon), separating rules
+@cindex semicolon (@code{;}), separating rules
+When @command{awk} statements within one rule are short, you might want to put
+more than one of them on a line.  This is accomplished by separating the statements
+with a semicolon (@samp{;}).
+This also applies to the rules themselves.
+Thus, the program shown at the start of this @value{SECTION}
+could also be written this way:
+
+@example
+/12/ @{ print $0 @} ; /21/ @{ print $0 @}
+@end example
+
+@quotation NOTE
+The requirement that states that rules on the same line must be
+separated with a semicolon was not in the original @command{awk}
+language; it was added for consistency with the treatment of statements
+within an action.
+@end quotation
+
+@node Other Features
+@section Other Features of @command{awk}
+
+@cindex variables
+The @command{awk} language provides a number of predefined, or
+@dfn{built-in}, variables that your programs can use to get information
+from @command{awk}.  There are other variables your program can set
+as well to control how @command{awk} processes your data.
+
+In addition, @command{awk} provides a number of built-in functions for doing
+common computational and string-related operations.
+@command{gawk} provides built-in functions for working with timestamps,
+performing bit manipulation, for runtime string translation (internationalization),
+determining the type of a variable,
+and array sorting.
+
+As we develop our presentation of the @command{awk} language, we will introduce
+most of the variables and many of the functions. They are described
+systematically in @ref{Built-in Variables} and in
+@ref{Built-in}.
+
+@node When
+@section When to Use @command{awk}
+
+@cindex @command{awk}, uses for
+Now that you've seen some of what @command{awk} can do,
+you might wonder how @command{awk} could be useful for you.  By using
+utility programs, advanced patterns, field separators, arithmetic
+statements, and other selection criteria, you can produce much more
+complex output.  The @command{awk} language is very useful for producing
+reports from large amounts of raw data, such as summarizing information
+from the output of other utility programs like @command{ls}.
+(@xref{More Complex}.)
+
+Programs written with @command{awk} are usually much smaller than they would
+be in other languages.  This makes @command{awk} programs easy to compose and
+use.  Often, @command{awk} programs can be quickly composed at your keyboard,
+used once, and thrown away.  Because @command{awk} programs are interpreted, you
+can avoid the (usually lengthy) compilation part of the typical
+edit-compile-test-debug cycle of software development.
+
+@cindex Brian Kernighan's @command{awk}
+Complex programs have been written in @command{awk}, including a complete
+retargetable assembler for
+@ifclear FOR_PRINT
+eight-bit microprocessors (@pxref{Glossary}, for more information),
+@end ifclear
+@ifset FOR_PRINT
+eight-bit microprocessors,
+@end ifset
+and a microcode assembler for a special-purpose Prolog
+computer.
+The original @command{awk}'s capabilities were strained by tasks
+of such complexity, but modern versions are more capable.
+
+@cindex @command{awk} programs, complex
+If you find yourself writing @command{awk} scripts of more than, say,
+a few hundred lines, you might consider using a different programming
+language.  The shell is good at string and pattern matching; in addition,
+it allows powerful use of the system utilities.  Python offers a nice
+balance between high-level ease of programming and access to system
+facilities.@footnote{Other popular scripting languages include Ruby
+and Perl.}
+
+@node Intro Summary
+@section Summary
+
+@c FIXME: Review this chapter for summary of builtin functions called.
+@itemize @value{BULLET}
+@item
+Programs in @command{awk} consist of @var{pattern}--@var{action} pairs.
+
+@item
+An @var{action} without a @var{pattern} always runs.  The default
+@var{action} for a pattern without one is @samp{@{ print $0 @}}.
+
+@item
+Use either
+@samp{awk '@var{program}' @var{files}}
+or
+@samp{awk -f @var{program-file} @var{files}}
+to run @command{awk}.
+
+@item
+You may use the special @samp{#!} header line to create @command{awk}
+programs that are directly executable.
+
+@item
+Comments in @command{awk} programs start with @samp{#} and continue to
+the end of the same line.
+
+@item
+Be aware of quoting issues when writing @command{awk} programs as
+part of a larger shell script (or MS-Windows batch file).
+
+@item
+You may use backslash continuation to continue a source line.
+Lines are automatically continued after
+a comma, open brace, question mark, colon,
+@samp{||}, @samp{&&}, @code{do}, and @code{else}.
+@end itemize
+
+@node Invoking Gawk
+@chapter Running @command{awk} and @command{gawk}
+
+This @value{CHAPTER} covers how to run @command{awk}, both POSIX-standard
+and @command{gawk}-specific command-line options, and what
+@command{awk} and
+@command{gawk} do with nonoption arguments.
+It then proceeds to cover how @command{gawk} searches for source files,
+reading standard input along with other files, @command{gawk}'s
+environment variables, @command{gawk}'s exit status, using include files,
+and obsolete and undocumented options and/or features.
+
+Many of the options and features described here are discussed in
+more detail later in the @value{DOCUMENT}; feel free to skip over
+things in this @value{CHAPTER} that don't interest you right now.
+
+@menu
+* Command Line::                How to run @command{awk}.
+* Options::                     Command-line options and their meanings.
+* Other Arguments::             Input file names and variable assignments.
+* Naming Standard Input::       How to specify standard input with other
+                                files.
+* Environment Variables::       The environment variables @command{gawk} uses.
+* Exit Status::                 @command{gawk}'s exit status.
+* Include Files::               Including other files into your program.
+* Loading Shared Libraries::    Loading shared libraries into your program.
+* Obsolete::                    Obsolete Options and/or features.
+* Undocumented::                Undocumented Options and Features.
+* Invoking Summary::            Invocation summary.
+@end menu
+
+@node Command Line
+@section Invoking @command{awk}
+@cindex command line, invoking @command{awk} from
+@cindex @command{awk}, invoking
+@cindex arguments, command-line, invoking @command{awk}
+@cindex options, command-line, invoking @command{awk}
+
+There are two ways to run @command{awk}---with an explicit program or with
+one or more program files.  Here are templates for both of them; items
+enclosed in [@dots{}] in these templates are optional:
+
+@display
+@command{awk} [@var{options}] @option{-f} @var{progfile} [@option{--}] @var{file} @dots{}
+@command{awk} [@var{options}] [@option{--}] @code{'@var{program}'} @var{file} @dots{}
+@end display
+
+@cindex GNU long options
+@cindex long options
+@cindex options, long
+In addition to traditional one-letter POSIX-style options, @command{gawk} also
+supports GNU long options.
+
+@cindex dark corner, invoking @command{awk}
+@cindex lint checking, empty programs
+It is possible to invoke @command{awk} with an empty program:
+
+@example
+awk '' datafile1 datafile2
+@end example
+
+@cindex @option{--lint} option
+@cindex dark corner, empty programs
+@noindent
+Doing so makes little sense, though; @command{awk} exits
+silently when given an empty program.
+@value{DARKCORNER}
+If @option{--lint} has
+been specified on the command line, @command{gawk} issues a
+warning that the program is empty.
+
+@node Options
+@section Command-Line Options
+@cindex options, command-line
+@cindex command line, options
+@cindex GNU long options
+@cindex options, long
+
+Options begin with a dash and consist of a single character.
+GNU-style long options consist of two dashes and a keyword.
+The keyword can be abbreviated, as long as the abbreviation allows the option
+to be uniquely identified.  If the option takes an argument, either the
+keyword is immediately followed by an equals sign (@samp{=}) and the
+argument's value, or the keyword and the argument's value are separated
+by whitespace.
+If a particular option with a value is given more than once, it is the
+last value that counts.
+
+@cindex POSIX @command{awk}, GNU long options and
+Each long option for @command{gawk} has a corresponding
+POSIX-style short option.
+The long and short options are
+interchangeable in all contexts.
+The following list describes options mandated by the POSIX standard:
+
+@table @code
+@item -F @var{fs}
+@itemx --field-separator @var{fs}
+@cindex @option{-F} option
+@cindex @option{--field-separator} option
+@cindex @code{FS} variable, @code{--field-separator} option and
+Set the @code{FS} variable to @var{fs}
+(@pxref{Field Separators}).
+
+@item -f @var{source-file}
+@itemx --file @var{source-file}
+@cindex @option{-f} option
+@cindex @option{--file} option
+@cindex @command{awk} programs, location of
+Read the @command{awk} program source from @var{source-file}
+instead of in the first nonoption argument.
+This option may be given multiple times; the @command{awk}
+program consists of the concatenation of the contents of
+each specified @var{source-file}.
+
+Files named with @option{-f} are treated as if they had @samp{@@namespace "awk"}
+at their beginning. @xref{Changing The Namespace}, for more information.
+
+@item -v @var{var}=@var{val}
+@itemx --assign @var{var}=@var{val}
+@cindex @option{-v} option
+@cindex @option{--assign} option
+@cindex variables, setting
+Set the variable @var{var} to the value @var{val} @emph{before}
+execution of the program begins.  Such variable values are available
+inside the @code{BEGIN} rule
+(@pxref{Other Arguments}).
+
+The @option{-v} option can only set one variable, but it can be used
+more than once, setting another variable each time, like this:
+@samp{awk @w{-v foo=1} @w{-v bar=2} @dots{}}.
+
+@cindex predefined variables, @code{-v} option@comma{} setting with
+@cindex variables, predefined, @code{-v} option@comma{} setting with
+@quotation CAUTION
+Using @option{-v} to set the values of the built-in
+variables may lead to surprising results.  @command{awk} will reset the
+values of those variables as it needs to, possibly ignoring any
+initial value you may have given.
+@end quotation
+
+@item -W @var{gawk-opt}
+@cindex @option{-W} option
+Provide an implementation-specific option.
+This is the POSIX convention for providing implementation-specific options.
+These options
+also have corresponding GNU-style long options.
+Note that the long options may be abbreviated, as long as
+the abbreviations remain unique.
+The full list of @command{gawk}-specific options is provided next.
+
+@item --
+@cindex command line, options, end of
+@cindex options, command-line, end of
+Signal the end of the command-line options.  The following arguments
+are not treated as options even if they begin with @samp{-}.  This
+interpretation of @option{--} follows the POSIX argument parsing
+conventions.
+
+@cindex @code{-} (hyphen), file names beginning with
+@cindex hyphen (@code{-}), file names beginning with
+This is useful if you have @value{FN}s that start with @samp{-},
+or in shell scripts, if you have @value{FN}s that will be specified
+by the user that could start with @samp{-}.
+It is also useful for passing options on to the @command{awk}
+program; see @ref{Getopt Function}.
+@end table
+
+The following list describes @command{gawk}-specific options:
+
+@c Have to use @asis here to get docbook to come out right.
+@table @asis
+@item @option{-b}
+@itemx @option{--characters-as-bytes}
+@cindex @option{-b} option
+@cindex @option{--characters-as-bytes} option
+Cause @command{gawk} to treat all input data as single-byte characters.
+In addition, all output written with @code{print} or @code{printf}
+is treated as single-byte characters.
+
+Normally, @command{gawk} follows the POSIX standard and attempts to process
+its input data according to the current locale (@pxref{Locales}). This can often involve
+converting multibyte characters into wide characters (internally), and
+can lead to problems or confusion if the input data does not contain valid
+multibyte characters. This option is an easy way to tell @command{gawk},
+``Hands off my data!''
+
+@item @option{-c}
+@itemx @option{--traditional}
+@cindex @option{-c} option
+@cindex @option{--traditional} option
+@cindex compatibility mode (@command{gawk}), specifying
+Specify @dfn{compatibility mode}, in which the GNU extensions to
+the @command{awk} language are disabled, so that @command{gawk} behaves just
+like BWK @command{awk}.
+@xref{POSIX/GNU},
+which summarizes the extensions.
+@ifclear FOR_PRINT
+Also see
+@ref{Compatibility Mode}.
+@end ifclear
+
+@item @option{-C}
+@itemx @option{--copyright}
+@cindex @option{-C} option
+@cindex @option{--copyright} option
+@cindex GPL (General Public License), printing
+Print the short version of the General Public License and then exit.
+
+@item @option{-d}[@var{file}]
+@itemx @option{--dump-variables}[@code{=}@var{file}]
+@cindex @option{-d} option
+@cindex @option{--dump-variables} option
+@cindex dump all variables of a program
+@cindex @file{awkvars.out} file
+@cindex files, @file{awkvars.out}
+@cindex variables, global, printing list of
+Print a sorted list of global variables, their types, and final values
+to @var{file}.  If no @var{file} is provided, print this
+list to a file named @file{awkvars.out} in the current directory.
+No space is allowed between the @option{-d} and @var{file}, if
+@var{file} is supplied.
+
+@cindex troubleshooting, typographical errors@comma{} global variables
+Having a list of all global variables is a good way to look for
+typographical errors in your programs.
+You would also use this option if you have a large program with a lot of
+functions, and you want to be sure that your functions don't
+inadvertently use global variables that you meant to be local.
+(This is a particularly easy mistake to make with simple variable
+names like @code{i}, @code{j}, etc.)
+
+@item @option{-D}[@var{file}]
+@itemx @option{--debug}[@code{=}@var{file}]
+@cindex @option{-D} option
+@cindex @option{--debug} option
+@cindex @command{awk} debugging, enabling
+Enable debugging of @command{awk} programs
+(@pxref{Debugging}).
+By default, the debugger reads commands interactively from the keyboard
+(standard input).
+The optional @var{file} argument allows you to specify a file with a list
+of commands for the debugger to execute noninteractively.
+No space is allowed between the @option{-D} and @var{file}, if
+@var{file} is supplied.
+
+@item @option{-e} @var{program-text}
+@itemx @option{--source} @var{program-text}
+@cindex @option{-e} option
+@cindex @option{--source} option
+@cindex source code, mixing
+Provide program source code in the @var{program-text}.
+This option allows you to mix source code in files with source
+code that you enter on the command line.
+This is particularly useful
+when you have library functions that you want to use from your command-line
+programs (@pxref{AWKPATH Variable}).
+
+Note that @command{gawk} treats each string as if it ended with
+a newline character (even if it doesn't). This makes building
+the total program easier.
+
+@quotation CAUTION
+Prior to @value{PVERSION} 5.0, there was
+no requirement that each @var{program-text}
+be a full syntactic unit. I.e., the following worked:
+
+@example
+$ @kbd{gawk -e 'BEGIN @{ a = 5 ;' -e 'print a @}'}
+@print{} 5
+@end example
+
+@noindent
+However, this is no longer true. If you have any scripts that
+rely upon this feature, you should revise them.
+
+This is because each @var{program-text} is treated as if it had
+@samp{@@namespace "awk"} at its beginning. @xref{Changing The Namespace},
+for more information.
+@end quotation
+
+@item @option{-E} @var{file}
+@itemx @option{--exec} @var{file}
+@cindex @option{-E} option
+@cindex @option{--exec} option
+@cindex @command{awk} programs, location of
+@cindex CGI, @command{awk} scripts for
+Similar to @option{-f}, read @command{awk} program text from @var{file}.
+There are two differences from @option{-f}:
+
+@itemize @value{BULLET}
+@item
+This option terminates option processing; anything
+else on the command line is passed on directly to the @command{awk} program.
+
+@item
+Command-line variable assignments of the form
+@samp{@var{var}=@var{value}} are disallowed.
+@end itemize
+
+This option is particularly necessary for World Wide Web CGI applications
+that pass arguments through the URL; using this option prevents a malicious
+(or other) user from passing in options, assignments, or @command{awk} source
+code (via @option{-e}) to the CGI application.@footnote{For more detail,
+please see Section 4.4 of @uref{http://www.ietf.org/rfc/rfc3875,
+RFC 3875}. Also see the
+@uref{https://lists.gnu.org/archive/html/bug-gawk/2014-11/msg00022.html,
+explanatory note sent to the @command{gawk} bug
+mailing list}.}
+This option should be used
+with @samp{#!} scripts (@pxref{Executable Scripts}), like so:
+
+@example
+#! /usr/local/bin/gawk -E
+
+@var{awk program here @dots{}}
+@end example
+
+@item @option{-g}
+@itemx @option{--gen-pot}
+@cindex @option{-g} option
+@cindex @option{--gen-pot} option
+@cindex portable object files, generating
+@cindex files, portable object, generating
+Analyze the source program and
+generate a GNU @command{gettext} portable object template file on standard
+output for all string constants that have been marked for translation.
+@xref{Internationalization},
+for information about this option.
+
+@item @option{-h}
+@itemx @option{--help}
+@cindex @option{-h} option
+@cindex @option{--help} option
+@cindex GNU long options, printing list of
+@cindex options, printing list of
+@cindex printing, list of options
+Print a ``usage'' message summarizing the short- and long-style options
+that @command{gawk} accepts and then exit.
+
+@item @option{-i} @var{source-file}
+@itemx @option{--include} @var{source-file}
+@cindex @option{-i} option
+@cindex @option{--include} option
+@cindex @command{awk} programs, location of
+Read an @command{awk} source library from @var{source-file}.  This option
+is completely equivalent to using the @code{@@include} directive inside
+your program.  It is very similar to the @option{-f} option,
+but there are two important differences.  First, when @option{-i} is
+used, the program source is not loaded if it has been previously
+loaded, whereas with @option{-f}, @command{gawk} always loads the file.
+Second, because this option is intended to be used with code libraries,
+@command{gawk} does not recognize such files as constituting main program
+input.  Thus, after processing an @option{-i} argument, @command{gawk}
+still expects to find the main source code via the @option{-f} option
+or on the command line.
+
+Files named with @option{-i} are treated as if they had @samp{@@namespace "awk"}
+at their beginning.  @xref{Changing The Namespace}, for more information.
+
+@item @option{-l} @var{ext}
+@itemx @option{--load} @var{ext}
+@cindex @option{-l} option
+@cindex @option{--load} option
+@cindex loading, extensions
+Load a dynamic extension named @var{ext}. Extensions
+are stored as system shared libraries.
+This option searches for the library using the @env{AWKLIBPATH}
+environment variable.  The correct library suffix for your platform will be
+supplied by default, so it need not be specified in the extension name.
+The extension initialization routine should be named @code{dl_load()}.
+An alternative is to use the @code{@@load} keyword inside the program to load
+a shared library.  This advanced feature is described in detail in @ref{Dynamic Extensions}.
+
+@item @option{-L}[@var{value}]
+@itemx @option{--lint}[@code{=}@var{value}]
+@cindex @option{-l} option
+@cindex @option{--lint} option
+@cindex lint checking, issuing warnings
+@cindex warnings, issuing
+Warn about constructs that are dubious or nonportable to
+other @command{awk} implementations.
+No space is allowed between the @option{-L} and @var{value}, if
+@var{value} is supplied.
+Some warnings are issued when @command{gawk} first reads your program.  Others
+are issued at runtime, as your program executes.
+With an optional argument of @samp{fatal},
+lint warnings become fatal errors.
+This may be drastic, but its use will certainly encourage the
+development of cleaner @command{awk} programs.
+With an optional argument of @samp{invalid}, only warnings about things
+that are actually invalid are issued. (This is not fully implemented yet.)
+With an optional argument of @samp{no-ext}, warnings about @command{gawk}
+extensions are disabled.
+
+Some warnings are only printed once, even if the dubious constructs they
+warn about occur multiple times in your @command{awk} program.  Thus,
+when eliminating problems pointed out by @option{--lint}, you should take
+care to search for all occurrences of each inappropriate construct. As
+@command{awk} programs are usually short, doing so is not burdensome.
+
+@item @option{-M}
+@itemx @option{--bignum}
+@cindex @option{-M} option
+@cindex @option{--bignum} option
+Select arbitrary-precision arithmetic on numbers. This option has no effect
+if @command{gawk} is not compiled to use the GNU MPFR and MP libraries
+(@pxref{Arbitrary Precision Arithmetic}).
+
+@item @option{-n}
+@itemx @option{--non-decimal-data}
+@cindex @option{-n} option
+@cindex @option{--non-decimal-data} option
+@cindex hexadecimal values@comma{} enabling interpretation of
+@cindex octal values@comma{} enabling interpretation of
+@cindex troubleshooting, @code{--non-decimal-data} option
+Enable automatic interpretation of octal and hexadecimal
+values in input data
+(@pxref{Nondecimal Data}).
+
+@quotation CAUTION
+This option can severely break old programs.  Use with care.  Also note
+that this option may disappear in a future version of @command{gawk}.
+@end quotation
+
+@item @option{-N}
+@itemx @option{--use-lc-numeric}
+@cindex @option{-N} option
+@cindex @option{--use-lc-numeric} option
+Force the use of the locale's decimal point character
+when parsing numeric input data (@pxref{Locales}).
+
+@cindex pretty printing
+@item @option{-o}[@var{file}]
+@itemx @option{--pretty-print}[@code{=}@var{file}]
+@cindex @option{-o} option
+@cindex @option{--pretty-print} option
+Enable pretty-printing of @command{awk} programs.
+Implies @option{--no-optimize}.
+By default, the output program is created in a file named @file{awkprof.out}
+(@pxref{Profiling}).
+The optional @var{file} argument allows you to specify a different
+@value{FN} for the output.
+No space is allowed between the @option{-o} and @var{file}, if
+@var{file} is supplied.
+
+@quotation NOTE
+In the past, this option would also execute your program.
+This is no longer the case.
+@end quotation
+
+@item @option{-O}
+@itemx @option{--optimize}
+@cindex @option{--optimize} option
+@cindex @option{-O} option
+Enable @command{gawk}'s default optimizations on the internal
+representation of the program.  At the moment, this includes just simple
+constant folding.
+
+Optimization is enabled by default.
+This option remains primarily for backwards compatibility. However, it may
+be used to cancel the effect of an earlier @option{-s} option
+(see later in this list).
+
+@item @option{-p}[@var{file}]
+@itemx @option{--profile}[@code{=}@var{file}]
+@cindex @option{-p} option
+@cindex @option{--profile} option
+@cindex @command{awk} profiling, enabling
+Enable profiling of @command{awk} programs
+(@pxref{Profiling}).
+Implies @option{--no-optimize}.
+By default, profiles are created in a file named @file{awkprof.out}.
+The optional @var{file} argument allows you to specify a different
+@value{FN} for the profile file.
+No space is allowed between the @option{-p} and @var{file}, if
+@var{file} is supplied.
+
+The profile contains execution counts for each statement in the program
+in the left margin, and function call counts for each function.
+
+@item @option{-P}
+@itemx @option{--posix}
+@cindex @option{-P} option
+@cindex @option{--posix} option
+@cindex POSIX mode
+@cindex @command{gawk}, extensions@comma{} disabling
+Operate in strict POSIX mode.  This disables all @command{gawk}
+extensions (just like @option{--traditional}) and
+disables all extensions not allowed by POSIX.
+@xref{Common Extensions} for a summary of the extensions
+in @command{gawk} that are disabled by this option.
+Also,
+the following additional
+restrictions apply:
+
+@itemize @value{BULLET}
+
+@cindex newlines
+@cindex whitespace, newlines as
+@item
+Newlines are not allowed after @samp{?} or @samp{:}
+(@pxref{Conditional Exp}).
+
+
+@cindex @code{FS} variable, TAB character as
+@item
+Specifying @samp{-Ft} on the command line does not set the value
+of @code{FS} to be a single TAB character
+(@pxref{Field Separators}).
+
+@cindex locale decimal point character
+@cindex decimal point character, locale specific
+@item
+The locale's decimal point character is used for parsing input
+data (@pxref{Locales}).
+@end itemize
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex @option{--traditional} option, @code{--posix} option and
+@cindex @option{--posix} option, @code{--traditional} option and
+If you supply both @option{--traditional} and @option{--posix} on the
+command line, @option{--posix} takes precedence. @command{gawk}
+issues a warning if both options are supplied.
+
+@item @option{-r}
+@itemx @option{--re-interval}
+@cindex @option{-r} option
+@cindex @option{--re-interval} option
+@cindex regular expressions, interval expressions and
+Allow interval expressions
+(@pxref{Regexp Operators})
+in regexps.
+This is now @command{gawk}'s default behavior.
+Nevertheless, this option remains (both for backward compatibility
+and for use in combination with @option{--traditional}).
+
+@item @option{-s}
+@itemx @option{--no-optimize}
+@cindex @option{--no-optimize} option
+@cindex @option{-s} option
+Disable @command{gawk}'s default optimizations on the internal
+representation of the program.
+
+@item @option{-S}
+@itemx @option{--sandbox}
+@cindex @option{-S} option
+@cindex @option{--sandbox} option
+@cindex sandbox mode
+@cindex @code{ARGV} array
+Disable the @code{system()} function,
+input redirections with @code{getline},
+output redirections with @code{print} and @code{printf},
+and dynamic extensions.
+Also, disallow adding filenames to @code{ARGV} that were
+not there when @command{gawk} started running.
+This is particularly useful when you want to run @command{awk} scripts
+from questionable sources and need to make sure the scripts
+can't access your system (other than the specified input @value{DF}).
+
+@item @option{-t}
+@itemx @option{--lint-old}
+@cindex @option{-L} option
+@cindex @option{--lint-old} option
+Warn about constructs that are not available in the original version of
+@command{awk} from Version 7 Unix
+(@pxref{V7/SVR3.1}).
+
+@item @option{-V}
+@itemx @option{--version}
+@cindex @option{-V} option
+@cindex @option{--version} option
+@cindex @command{gawk}, versions of, information about@comma{} printing
+Print version information for this particular copy of @command{gawk}.
+This allows you to determine if your copy of @command{gawk} is up to date
+with respect to whatever the Free Software Foundation is currently
+distributing.
+It is also useful for bug reports
+(@pxref{Bugs}).
+@end table
+
+As long as program text has been supplied,
+any other options are flagged as invalid with a warning message but
+are otherwise ignored.
+
+@cindex @option{-F} option, @option{-Ft} sets @code{FS} to TAB
+In compatibility mode, as a special case, if the value of @var{fs} supplied
+to the @option{-F} option is @samp{t}, then @code{FS} is set to the TAB
+character (@code{"\t"}).  This is true only for @option{--traditional} and not
+for @option{--posix}
+(@pxref{Field Separators}).
+
+@cindex @option{-f} option, multiple uses
+The @option{-f} option may be used more than once on the command line.
+If it is, @command{awk} reads its program source from all of the named files, as
+if they had been concatenated together into one big file.  This is
+useful for creating libraries of @command{awk} functions.  These functions
+can be written once and then retrieved from a standard place, instead
+of having to be included in each individual program.
+The @option{-i} option is similar in this regard.
+(As mentioned in
+@ref{Definition Syntax},
+function names must be unique.)
+
+With standard @command{awk}, library functions can still be used, even
+if the program is entered at the keyboard,
+by specifying @samp{-f /dev/tty}.  After typing your program,
+type @kbd{Ctrl-d} (the end-of-file character) to terminate it.
+(You may also use @samp{-f -} to read program source from the standard
+input, but then you will not be able to also use the standard input as a
+source of data.)
+
+Because it is clumsy using the standard @command{awk} mechanisms to mix
+source file and command-line @command{awk} programs, @command{gawk}
+provides the @option{-e} option.  This does not require you to
+preempt the standard input for your source code; it allows you to easily
+mix command-line and library source code (@pxref{AWKPATH Variable}).
+As with @option{-f}, the @option{-e} and @option{-i}
+options may also be used multiple times on the command line.
+
+@cindex @option{-e} option
+If no @option{-f} option (or @option{-e} option for @command{gawk})
+is specified, then @command{awk} uses the first nonoption command-line
+argument as the text of the program source code.  Arguments on
+the command line that follow the program text are entered into the
+@code{ARGV} array; @command{awk} does @emph{not} continue to parse the
+command line looking for options.
+
+@cindex @env{POSIXLY_CORRECT} environment variable
+@cindex lint checking, @env{POSIXLY_CORRECT} environment variable
+@cindex POSIX mode
+If the environment variable @env{POSIXLY_CORRECT} exists,
+then @command{gawk} behaves in strict POSIX mode, exactly as if
+you had supplied @option{--posix}.
+Many GNU programs look for this environment variable to suppress
+extensions that conflict with POSIX, but @command{gawk} behaves
+differently: it suppresses all extensions, even those that do not
+conflict with POSIX, and behaves in
+strict POSIX mode. If @option{--lint} is supplied on the command line
+and @command{gawk} turns on POSIX mode because of @env{POSIXLY_CORRECT},
+then it issues a warning message indicating that POSIX
+mode is in effect.
+You would typically set this variable in your shell's startup file.
+For a Bourne-compatible shell (such as Bash), you would add these
+lines to the @file{.profile} file in your home directory:
+
+@example
+POSIXLY_CORRECT=true
+export POSIXLY_CORRECT
+@end example
+
+@cindex @command{csh} utility, @env{POSIXLY_CORRECT} environment variable
+For a C shell-compatible
+shell,@footnote{Not recommended.}
+you would add this line to the @file{.login} file in your home directory:
+
+@example
+setenv POSIXLY_CORRECT true
+@end example
+
+@cindex portability, @env{POSIXLY_CORRECT} environment variable
+Having @env{POSIXLY_CORRECT} set is not recommended for daily use,
+but it is good for testing the portability of your programs to other
+environments.
+
+@node Other Arguments
+@section Other Command-Line Arguments
+@cindex command line, arguments
+@cindex arguments, command-line
+
+Any additional arguments on the command line are normally treated as
+input files to be processed in the order specified.   However, an
+argument that has the form @code{@var{var}=@var{value}}, assigns
+the value @var{value} to the variable @var{var}---it does not specify a
+file at all.  (See @ref{Assignment Options}.) In the following example,
+@var{count=1} is a variable assignment, not a @value{FN}:
+
+@example
+awk -f program.awk file1 count=1 file2
+@end example
+
+@cindex @command{gawk}, @code{ARGIND} variable in
+@cindex @code{ARGIND} variable, command-line arguments
+@cindex @code{ARGV} array, indexing into
+@cindex @code{ARGC}/@code{ARGV} variables, command-line arguments
+All the command-line arguments are made available to your @command{awk} program in the
+@code{ARGV} array (@pxref{Built-in Variables}).  Command-line options
+and the program text (if present) are omitted from @code{ARGV}.
+All other arguments, including variable assignments, are
+included.   As each element of @code{ARGV} is processed, @command{gawk}
+sets @code{ARGIND} to the index in @code{ARGV} of the
+current element.
+
+@c FIXME: One day, move the ARGC and ARGV node closer to here.
+Changing @code{ARGC} and @code{ARGV} in your @command{awk} program lets
+you control how @command{awk} processes the input files; this is described
+in more detail in @ref{ARGC and ARGV}.
+
+@cindex input files, variable assignments and
+@cindex variable assignments and input files
+The distinction between @value{FN} arguments and variable-assignment
+arguments is made when @command{awk} is about to open the next input file.
+At that point in execution, it checks the @value{FN} to see whether
+it is really a variable assignment; if so, @command{awk} sets the variable
+instead of reading a file.
+
+Therefore, the variables actually receive the given values after all
+previously specified files have been read.  In particular, the values of
+variables assigned in this fashion are @emph{not} available inside a
+@code{BEGIN} rule
+(@pxref{BEGIN/END}),
+because such rules are run before @command{awk} begins scanning the argument list.
+
+@cindex dark corner, escape sequences
+The variable values given on the command line are processed for escape
+sequences (@pxref{Escape Sequences}).
+@value{DARKCORNER}
+
+In some very early implementations of @command{awk}, when a variable assignment
+occurred before any @value{FN}s, the assignment would happen @emph{before}
+the @code{BEGIN} rule was executed.  @command{awk}'s behavior was thus
+inconsistent; some command-line assignments were available inside the
+@code{BEGIN} rule, while others were not.  Unfortunately,
+some applications came to depend
+upon this ``feature.''  When @command{awk} was changed to be more consistent,
+the @option{-v} option was added to accommodate applications that depended
+upon the old behavior.
+
+The variable assignment feature is most useful for assigning to variables
+such as @code{RS}, @code{OFS}, and @code{ORS}, which control input and
+output formats, before scanning the @value{DF}s.  It is also useful for
+controlling state if multiple passes are needed over a @value{DF}.  For
+example:
+
+@cindex files, multiple passes over
+@example
+awk 'pass == 1  @{ @var{pass 1 stuff} @}
+     pass == 2  @{ @var{pass 2 stuff} @}' pass=1 mydata pass=2 mydata
+@end example
+
+Given the variable assignment feature, the @option{-F} option for setting
+the value of @code{FS} is not
+strictly necessary.  It remains for historical compatibility.
+
+@node Naming Standard Input
+@section Naming Standard Input
+
+Often, you may wish to read standard input together with other files.
+For example, you may wish to read one file, read standard input coming
+from a pipe, and then read another file.
+
+The way to name the standard input, with all versions of @command{awk},
+is to use a single, standalone minus sign or dash, @samp{-}.  For example:
+
+@example
+@var{some_command} | awk -f myprog.awk file1 - file2
+@end example
+
+@noindent
+Here, @command{awk} first reads @file{file1}, then it reads
+the output of @var{some_command}, and finally it reads
+@file{file2}.
+
+You may also use @code{"-"} to name standard input when reading
+files with @code{getline} (@pxref{Getline/File}).
+And, you can even use @code{"-"} with the @option{-f} option
+to read program source code from standard input (@pxref{Options}).
+
+In addition, @command{gawk} allows you to specify the special
+@value{FN} @file{/dev/stdin}, both on the command line and
+with @code{getline}.
+Some other versions of @command{awk} also support this, but it
+is not standard.
+(Some operating systems provide a @file{/dev/stdin} file
+in the filesystem; however, @command{gawk} always processes
+this @value{FN} itself.)
+
+@node Environment Variables
+@section The Environment Variables @command{gawk} Uses
+@cindex environment variables used by @command{gawk}
+
+A number of environment variables influence how @command{gawk}
+behaves.
+
+@menu
+* AWKPATH Variable::            Searching directories for @command{awk}
+                                programs.
+* AWKLIBPATH Variable::         Searching directories for @command{awk} shared
+                                libraries.
+* Other Environment Variables:: The environment variables.
+@end menu
+
+@node AWKPATH Variable
+@subsection The @env{AWKPATH} Environment Variable
+@cindex @env{AWKPATH} environment variable
+@cindex directories, searching for source files
+@cindex search paths, for source files
+@cindex differences in @command{awk} and @command{gawk}, @env{AWKPATH} environment variable
+@ifinfo
+The previous @value{SECTION} described how @command{awk} program files can be named
+on the command line with the @option{-f} option.
+@end ifinfo
+In most @command{awk}
+implementations, you must supply a precise pathname for each program
+file, unless the file is in the current directory.
+But with @command{gawk}, if the @value{FN} supplied to the @option{-f}
+or @option{-i} options
+does not contain a directory separator @samp{/}, then @command{gawk} searches a list of
+directories (called the @dfn{search path}) one by one, looking for a
+file with the specified name.
+
+The search path is a string consisting of directory names
+separated by colons.@footnote{Semicolons on MS-Windows.}
+@command{gawk} gets its search path from the
+@env{AWKPATH} environment variable.  If that variable does not exist,
+or if it has an empty value,
+@command{gawk} uses a default path (described shortly).
+
+The search path feature is particularly helpful for building libraries
+of useful @command{awk} functions.  The library files can be placed in a
+standard directory in the default path and then specified on
+the command line with a short @value{FN}.  Otherwise, you would have to
+type the full @value{FN} for each file.
+
+By using the @option{-i} or @option{-f} options, your command-line
+@command{awk} programs can use facilities in @command{awk} library files
+(@pxref{Library Functions}).
+Path searching is not done if @command{gawk} is in compatibility mode.
+This is true for both @option{--traditional} and @option{--posix}.
+@xref{Options}.
+
+If the source code file is not found after the initial search, the path is searched
+again after adding the suffix @samp{.awk} to the @value{FN}.
+
+@command{gawk}'s path search mechanism is similar
+to the shell's.
+(See @uref{https://www.gnu.org/software/bash/manual/,
+@cite{The Bourne-Again SHell manual}}.)
+It treats a null entry in the path as indicating the current
+directory.
+(A null entry is indicated by starting or ending the path with a
+colon or by placing two colons next to each other [@samp{::}].)
+
+@quotation NOTE
+To include the current directory in the path, either place @file{.}
+as an entry in the path or write a null entry in the path.
+
+Different past versions of @command{gawk} would also look explicitly in
+the current directory, either before or after the path search.  As of
+@value{PVERSION} 4.1.2, this no longer happens; if you wish to look
+in the current directory, you must include @file{.} either as a separate
+entry or as a null entry in the search path.
+@end quotation
+
+The default value for @env{AWKPATH} is
+@samp{.:/usr/local/share/awk}.@footnote{Your version of @command{gawk}
+may use a different directory; it
+will depend upon how @command{gawk} was built and installed. The actual
+directory is the value of @code{$(datadir)} generated when
+@command{gawk} was configured.  You probably don't need to worry about this,
+though.}  Since @file{.} is included at the beginning, @command{gawk}
+searches first in the current directory and then in @file{/usr/local/share/awk}.
+In practice, this means that you will rarely need to change the
+value of @env{AWKPATH}.
+
+@xref{Shell Startup Files}, for information on functions that help to
+manipulate the @env{AWKPATH} variable.
+
+@command{gawk} places the value of the search path that it used into
+@code{ENVIRON["AWKPATH"]}. This provides access to the actual search
+path value from within an @command{awk} program.
+
+Although you can change @code{ENVIRON["AWKPATH"]} within your @command{awk}
+program, this has no effect on the running program's behavior.  This makes
+sense: the @env{AWKPATH} environment variable is used to find the program
+source files.  Once your program is running, all the files have been
+found, and @command{gawk} no longer needs to use @env{AWKPATH}.
+
+@node AWKLIBPATH Variable
+@subsection The @env{AWKLIBPATH} Environment Variable
+@cindex @env{AWKLIBPATH} environment variable
+@cindex directories, searching for loadable extensions
+@cindex search paths, for loadable extensions
+@cindex differences in @command{awk} and @command{gawk}, @code{AWKLIBPATH} environment variable
+
+The @env{AWKLIBPATH} environment variable is similar to the @env{AWKPATH}
+variable, but it is used to search for loadable extensions (stored as
+system shared libraries) specified with the @option{-l} option rather
+than for source files.  If the extension is not found, the path is
+searched again after adding the appropriate shared library suffix for
+the platform.  For example, on GNU/Linux systems, the suffix @samp{.so}
+is used.  The search path specified is also used for extensions loaded
+via the @code{@@load} keyword (@pxref{Loading Shared Libraries}).
+
+If @env{AWKLIBPATH} does not exist in the environment, or if it has
+an empty value, @command{gawk} uses a default path; this
+is typically @samp{/usr/local/lib/gawk}, although it can vary depending
+upon how @command{gawk} was built.
+
+@xref{Shell Startup Files}, for information on functions that help to
+manipulate the @env{AWKLIBPATH} variable.
+
+@command{gawk} places the value of the search path that it used into
+@code{ENVIRON["AWKLIBPATH"]}. This provides access to the actual search
+path value from within an @command{awk} program.
+
+Although you can change @code{ENVIRON["AWKLIBPATH"]} within your
+@command{awk} program, this has no effect on the running program's
+behavior.  This makes sense: the @env{AWKLIBPATH} environment variable
+is used to find any requested extensions, and they are loaded before
+the program starts to run.  Once your program is running, all the
+extensions have been found, and @command{gawk} no longer needs to use
+@env{AWKLIBPATH}.
+
+@node Other Environment Variables
+@subsection Other Environment Variables
+
+A number of other environment variables affect @command{gawk}'s
+behavior, but they are more specialized. Those in the following
+list are meant to be used by regular users:
+
+@table @env
+@item GAWK_MSEC_SLEEP
+Specifies the interval between connection retries,
+in milliseconds. On systems that do not support
+the @code{usleep()} system call,
+the value is rounded up to an integral number of seconds.
+
+@item GAWK_READ_TIMEOUT
+Specifies the time, in milliseconds, for @command{gawk} to
+wait for input before returning with an error.
+@xref{Read Timeout}.
+
+@item GAWK_SOCK_RETRIES
+Controls the number of times @command{gawk} attempts to
+retry a two-way TCP/IP (socket) connection before giving up.
+@xref{TCP/IP Networking}.
+Note that when nonfatal I/O is enabled (@pxref{Nonfatal}),
+@command{gawk} only tries to open a TCP/IP socket once.
+
+@item POSIXLY_CORRECT
+Causes @command{gawk} to switch to POSIX-compatibility
+mode, disabling all traditional and GNU extensions.
+@xref{Options}.
+@end table
+
+The environment variables in the following list are meant
+for use by the @command{gawk} developers for testing and tuning.
+They are subject to change. The variables are:
+
+@table @env
+@item AWKBUFSIZE
+This variable only affects @command{gawk} on POSIX-compliant systems.
+With a value of @samp{exact}, @command{gawk} uses the size of each input
+file as the size of the memory buffer to allocate for I/O. Otherwise,
+the value should be a number, and @command{gawk} uses that number as
+the size of the buffer to allocate.  (When this variable is not set,
+@command{gawk} uses the smaller of the file's size and the ``default''
+blocksize, which is usually the filesystem's I/O blocksize.)
+
+@item AWK_HASH
+If this variable exists with a value of @samp{gst}, @command{gawk}
+switches to using the hash function from GNU Smalltalk for
+managing arrays.
+This function may be marginally faster than the standard function.
+
+@item AWKREADFUNC
+If this variable exists, @command{gawk} switches to reading source
+files one line at a time, instead of reading in blocks. This exists
+for debugging problems on filesystems on non-POSIX operating systems
+where I/O is performed in records, not in blocks.
+
+@item GAWK_MSG_SRC
+If this variable exists, @command{gawk} includes the @value{FN}
+and line number within the @command{gawk} source code
+from which warning and/or fatal messages
+are generated.  Its purpose is to help isolate the source of a
+message, as there are multiple places that produce the
+same warning or error message.
+
+@item GAWK_LOCALE_DIR
+Specifies the location of compiled message object files
+for @command{gawk} itself. This is passed to the @code{bindtextdomain()}
+function when @command{gawk} starts up.
+
+@item GAWK_NO_DFA
+If this variable exists, @command{gawk} does not use the DFA regexp matcher
+for ``does it match'' kinds of tests. This can cause @command{gawk}
+to be slower. Its purpose is to help isolate differences between the
+two regexp matchers that @command{gawk} uses internally. (There aren't
+supposed to be differences, but occasionally theory and practice don't
+coordinate with each other.)
+
+@item GAWK_STACKSIZE
+This specifies the amount by which @command{gawk} should grow its
+internal evaluation stack, when needed.
+
+@item INT_CHAIN_MAX
+This specifies intended maximum number of items @command{gawk} will maintain on a
+hash chain for managing arrays indexed by integers.
+
+@item STR_CHAIN_MAX
+This specifies intended maximum number of items @command{gawk} will maintain on a
+hash chain for managing arrays indexed by strings.
+
+@item TIDYMEM
+If this variable exists, @command{gawk} uses the @code{mtrace()} library
+calls from the GNU C library to help track down possible memory leaks.
+@end table
+
+@node Exit Status
+@section @command{gawk}'s Exit Status
+
+@cindex exit status, of @command{gawk}
+If the @code{exit} statement is used with a value
+(@pxref{Exit Statement}), then @command{gawk} exits with
+the numeric value given to it.
+
+Otherwise, if there were no problems during execution,
+@command{gawk} exits with the value of the C constant
+@code{EXIT_SUCCESS}.  This is usually zero.
+
+If an error occurs, @command{gawk} exits with the value of
+the C constant @code{EXIT_FAILURE}.  This is usually one.
+
+If @command{gawk} exits because of a fatal error, the exit
+status is two.  On non-POSIX systems, this value may be mapped
+to @code{EXIT_FAILURE}.
+
+@node Include Files
+@section Including Other Files into Your Program
+
+@c Panos Papadopoulos <panos1962@gmail.com> contributed the original
+@c text for this section.
+
+This @value{SECTION} describes a feature that is specific to @command{gawk}.
+
+@cindex @code{@@include} directive
+@cindex file inclusion, @code{@@include} directive
+@cindex including files, @code{@@include} directive
+The @code{@@include} keyword can be used to read external @command{awk} source
+files.  This gives you the ability to split large @command{awk} source files
+into smaller, more manageable pieces, and also lets you reuse common @command{awk}
+code from various @command{awk} scripts.  In other words, you can group
+together @command{awk} functions used to carry out specific tasks
+into external files. These files can be used just like function libraries,
+using the @code{@@include} keyword in conjunction with the @env{AWKPATH}
+environment variable.  Note that source files may also be included
+using the @option{-i} option.
+
+Let's see an example.
+We'll start with two (trivial) @command{awk} scripts, namely
+@file{test1} and @file{test2}. Here is the @file{test1} script:
+
+@example
+BEGIN @{
+    print "This is script test1."
+@}
+@end example
+
+@noindent
+and here is @file{test2}:
+
+@example
+@@include "test1"
+BEGIN @{
+    print "This is script test2."
+@}
+@end example
+
+Running @command{gawk} with @file{test2}
+produces the following result:
+
+@example
+$ @kbd{gawk -f test2}
+@print{} This is script test1.
+@print{} This is script test2.
+@end example
+
+@command{gawk} runs the @file{test2} script, which includes @file{test1}
+using the @code{@@include}
+keyword.  So, to include external @command{awk} source files, you just
+use @code{@@include} followed by the name of the file to be included,
+enclosed in double quotes.
+
+@quotation NOTE
+Keep in mind that this is a language construct and the @value{FN} cannot
+be a string variable, but rather just a literal string constant in double quotes.
+@end quotation
+
+The files to be included may be nested; e.g., given a third
+script, namely @file{test3}:
+
+@example
+@group
+@@include "test2"
+BEGIN @{
+    print "This is script test3."
+@}
+@end group
+@end example
+
+@noindent
+Running @command{gawk} with the @file{test3} script produces the
+following results:
+
+@example
+$ @kbd{gawk -f test3}
+@print{} This is script test1.
+@print{} This is script test2.
+@print{} This is script test3.
+@end example
+
+The @value{FN} can, of course, be a pathname. For example:
+
+@example
+@@include "../io_funcs"
+@end example
+
+@noindent
+and:
+
+@example
+@@include "/usr/awklib/network"
+@end example
+
+@noindent
+are both valid. The @env{AWKPATH} environment variable can be of great
+value when using @code{@@include}. The same rules for the use
+of the @env{AWKPATH} variable in command-line file searches
+(@pxref{AWKPATH Variable}) apply to
+@code{@@include} also.
+
+This is very helpful in constructing @command{gawk} function libraries.
+If you have a large script with useful, general-purpose @command{awk}
+functions, you can break it down into library files and put those files
+in a special directory.  You can then include those ``libraries,''
+either by using the full pathnames of the files, or by setting the @env{AWKPATH}
+environment variable accordingly and then using @code{@@include} with
+just the file part of the full pathname. Of course,
+you can keep library files in more than one directory;
+the more complex the working
+environment is, the more directories you may need to organize the files
+to be included.
+
+Given the ability to specify multiple @option{-f} options, the
+@code{@@include} mechanism is not strictly necessary.
+However, the @code{@@include} keyword
+can help you in constructing self-contained @command{gawk} programs,
+thus reducing the need for writing complex and tedious command lines.
+In particular, @code{@@include} is very useful for writing CGI scripts
+to be run from web pages.
+
+The rules for finding a source file described in @ref{AWKPATH Variable} also
+apply to files loaded with @code{@@include}.
+
+Finally, files included with @code{@@include}
+are treated as if they had @samp{@@namespace "awk"}
+at their beginning.  @xref{Changing The Namespace}, for more information.
+
+@node Loading Shared Libraries
+@section Loading Dynamic Extensions into Your Program
+
+This @value{SECTION} describes a feature that is specific to @command{gawk}.
+
+@cindex @code{@@load} directive
+@cindex loading extensions, @code{@@load} directive
+@cindex extensions, loading, @code{@@load} directive
+The @code{@@load} keyword can be used to read external @command{awk} extensions
+(stored as system shared libraries).
+This allows you to link in compiled code that may offer superior
+performance and/or give you access to extended capabilities not supported
+by the @command{awk} language.  The @env{AWKLIBPATH} variable is used to
+search for the extension.  Using @code{@@load} is completely equivalent
+to using the @option{-l} command-line option.
+
+If the extension is not initially found in @env{AWKLIBPATH}, another
+search is conducted after appending the platform's default shared library
+suffix to the @value{FN}.  For example, on GNU/Linux systems, the suffix
+@samp{.so} is used:
+
+@example
+$ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'}
+@print{} A
+@end example
+
+@noindent
+This is equivalent to the following example:
+
+@example
+@group
+$ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'}
+@print{} A
+@end group
+@end example
+
+@noindent
+For command-line usage, the @option{-l} option is more convenient,
+but @code{@@load} is useful for embedding inside an @command{awk} source file
+that requires access to an extension.
+
+@ref{Dynamic Extensions}, describes how to write extensions (in C or C++)
+that can be loaded with either @code{@@load} or the @option{-l} option.
+It also describes the @code{ordchr} extension.
+
+@node Obsolete
+@section Obsolete Options and/or Features
+
+@c update this section for each release!
+
+@cindex options, deprecated
+@cindex features, deprecated
+@cindex obsolete features
+This @value{SECTION} describes features and/or command-line options from
+previous releases of @command{gawk} that either are not available in the
+current version or are still supported but deprecated (meaning that
+they will @emph{not} be in the next release).
+
+The process-related special files @file{/dev/pid}, @file{/dev/ppid},
+@file{/dev/pgrpid}, and @file{/dev/user} were deprecated in @command{gawk}
+3.1, but still worked.  As of @value{PVERSION} 4.0, they are no longer
+interpreted specially by @command{gawk}.  (Use @code{PROCINFO} instead;
+see @ref{Auto-set}.)
+
+@ignore
+This @value{SECTION}
+is thus essentially a place holder,
+in case some option becomes obsolete in a future version of @command{gawk}.
+@end ignore
+
+@node Undocumented
+@section Undocumented Options and Features
+@cindex undocumented features
+@cindex features, undocumented
+@cindex Skywalker, Luke
+@cindex Kenobi, Obi-Wan
+@cindex jedi knights
+@cindex knights, jedi
+@quotation
+@i{Use the Source, Luke!}
+@author Obi-Wan
+@end quotation
+
+@cindex shells, sea
+This @value{SECTION} intentionally left
+blank.
+
+@ignore
+@c If these came out in the Info file or TeX document, then they wouldn't
+@c be undocumented, would they?
+
+@command{gawk} has one undocumented option:
+
+@table @code
+@item -W nostalgia
+@itemx --nostalgia
+Print the message @samp{awk: bailing out near line 1} and dump core.
+This option was inspired by the common behavior of very early versions of
+Unix @command{awk} and by a t--shirt.
+The message is @emph{not} subject to translation in non-English locales.
+@c so there! nyah, nyah.
+@end table
+
+Early versions of @command{awk} used to not require any separator (either
+a newline or @samp{;}) between the rules in @command{awk} programs.  Thus,
+it was common to see one-line programs like:
+
+@example
+awk '@{ sum += $1 @} END @{ print sum @}'
+@end example
+
+@command{gawk} actually supports this but it is purposely undocumented
+because it is bad style.  The correct way to write such a program
+is either:
+
+@example
+awk '@{ sum += $1 @} ; END @{ print sum @}'
+@end example
+
+@noindent
+or:
+
+@example
+awk '@{ sum += $1 @}
+     END @{ print sum @}' data
+@end example
+
+@noindent
+@xref{Statements/Lines}, for a fuller explanation.
+
+You can insert newlines after the @samp{;} in @code{for} loops.
+This seems to have been a long-undocumented feature in Unix @command{awk}.
+
+Similarly, you may use @code{print} or @code{printf} statements in the
+@var{init} and @var{increment} parts of a @code{for} loop.  This is another
+long-undocumented ``feature'' of Unix @command{awk}.
+
+@command{gawk} lets you use the names of built-in functions that are
+@command{gawk} extensions as the names of parameters in user-defined functions.
+This is intended to ``future-proof'' old code that happens to use
+function names added by @command{gawk} after the code was written.
+Standard @command{awk} built-in functions, such as @code{sin()} or
+@code{substr()} are @emph{not} shadowed in this way.
+
+You can use a @samp{P} modifier for the @code{printf()} floating-point
+format control letters to use the underlying C library's result for
+NaN and Infinity values, instead of the special values @command{gawk}
+usually produces, as described in @ref{POSIX Floating Point Problems}.
+This is mainly useful for the included unit tests.
+
+The @code{typeof()} built-in function
+(@pxref{Type Functions})
+takes an optional second array argument that, if present, will be cleared
+and populated with some information about the internal implementation of
+the variable. This can be useful for debugging. At the moment, this
+returns a textual version of the flags for scalar variables, and the
+array back-end implementation type for arrays. This interface is subject
+to change and may not be stable.
+
+When not in POSIX or compatibility mode, if you set @code{LINENO} to a
+numeric value using the @option{-v} option, @command{gawk} adds that value
+to the real line number for use in error messages.  This is intended for
+use within Bash shell scripts, such that the error message will reflect
+the line number in the shell script, instead of in the @command{awk}
+program. To demonstrate:
+
+@example
+$ @kbd{gawk -v LINENO=10 'BEGIN @{ print("hi" @}'}
+@error{} gawk: cmd. line:11: BEGIN @{ print("hi" @}
+@error{} gawk: cmd. line:11:                    ^ syntax error
+@end example
+
+@end ignore
+
+@node Invoking Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Use either
+@samp{awk '@var{program}' @var{files}}
+or
+@samp{awk -f @var{program-file} @var{files}}
+to run @command{awk}.
+
+@item
+The three standard options for all versions of @command{awk} are
+@option{-f}, @option{-F}, and @option{-v}.  @command{gawk} supplies these
+and many others, as well as corresponding GNU-style long options.
+
+@item
+Nonoption command-line arguments are usually treated as @value{FN}s,
+unless they have the form @samp{@var{var}=@var{value}}, in which case
+they are taken as variable assignments to be performed at that point
+in processing the input.
+
+@item
+All nonoption command-line arguments, excluding the program text,
+are placed in the @code{ARGV} array.  Adjusting @code{ARGC} and @code{ARGV}
+affects how @command{awk} processes input.
+
+@item
+You can use a single minus sign (@samp{-}) to refer to standard input
+on the command line. @command{gawk} also lets you use the special
+@value{FN} @file{/dev/stdin}.
+
+@item
+@command{gawk} pays attention to a number of environment variables.
+@env{AWKPATH}, @env{AWKLIBPATH}, and @env{POSIXLY_CORRECT} are the
+most important ones.
+
+@item
+@command{gawk}'s exit status conveys information to the program
+that invoked it. Use the @code{exit} statement from within
+an @command{awk} program to set the exit status.
+
+@item
+@command{gawk} allows you to include other @command{awk} source files into
+your program using the @code{@@include} statement and/or the @option{-i}
+and @option{-f} command-line options.
+
+@item
+@command{gawk} allows you to load additional functions written in C
+or C++ using the @code{@@load} statement and/or the @option{-l} option.
+(This advanced feature is described later, in @ref{Dynamic Extensions}.)
+@end itemize
+
+@node Regexp
+@chapter Regular Expressions
+@cindex regexp
+@cindex regular expressions
+
+A @dfn{regular expression}, or @dfn{regexp}, is a way of describing a
+set of strings.
+Because regular expressions are such a fundamental part of @command{awk}
+programming, their format and use deserve a separate @value{CHAPTER}.
+
+@cindex forward slash (@code{/}) to enclose regular expressions
+@cindex @code{/} (forward slash) to enclose regular expressions
+A regular expression enclosed in slashes (@samp{/})
+is an @command{awk} pattern that matches every input record whose text
+belongs to that set.
+The simplest regular expression is a sequence of letters, numbers, or
+both.  Such a regexp matches any string that contains that sequence.
+Thus, the regexp @samp{foo} matches any string containing @samp{foo}.
+Thus, the pattern @code{/foo/} matches any input record containing
+the three adjacent characters @samp{foo} @emph{anywhere} in the record.  Other
+kinds of regexps let you specify more complicated classes of strings.
+
+@ifnotinfo
+Initially, the examples in this @value{CHAPTER} are simple.
+As we explain more about how
+regular expressions work, we present more complicated instances.
+@end ifnotinfo
+
+@menu
+* Regexp Usage::                How to Use Regular Expressions.
+* Escape Sequences::            How to write nonprinting characters.
+* Regexp Operators::            Regular Expression Operators.
+* Bracket Expressions::         What can go between @samp{[...]}.
+* Leftmost Longest::            How much text matches.
+* Computed Regexps::            Using Dynamic Regexps.
+* GNU Regexp Operators::        Operators specific to GNU software.
+* Case-sensitivity::            How to do case-insensitive matching.
+* Regexp Summary::              Regular expressions summary.
+@end menu
+
+@node Regexp Usage
+@section How to Use Regular Expressions
+
+@cindex patterns, regular expressions as
+@cindex regular expressions, as patterns
+A regular expression can be used as a pattern by enclosing it in
+slashes.  Then the regular expression is tested against the
+entire text of each record.  (Normally, it only needs
+to match some part of the text in order to succeed.)  For example, the
+following prints the second field of each record where the string
+@samp{li} appears anywhere in the record:
+
+@example
+$ @kbd{awk '/li/ @{ print $2 @}' mail-list}
+@print{} 555-5553
+@print{} 555-0542
+@print{} 555-6699
+@print{} 555-3430
+@end example
+
+@cindex regular expressions, operators
+@cindex operators, string-matching
+@c @cindex operators, @code{~}
+@cindex string-matching operators
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@c @cindex operators, @code{!~}
+@cindex @code{if} statement, use of regexps in
+@cindex @code{while} statement, use of regexps in
+@cindex @code{do}-@code{while} statement, use of regexps in
+@c @cindex statements, @code{if}
+@c @cindex statements, @code{while}
+@c @cindex statements, @code{do}
+Regular expressions can also be used in matching expressions.  These
+expressions allow you to specify the string to match against; it need
+not be the entire current input record.  The two operators @samp{~}
+and @samp{!~} perform regular expression comparisons.  Expressions
+using these operators can be used as patterns, or in @code{if},
+@code{while}, @code{for}, and @code{do} statements.
+(@xref{Statements}.)
+For example, the following is true if the expression @var{exp} (taken
+as a string) matches @var{regexp}:
+
+@example
+@var{exp} ~ /@var{regexp}/
+@end example
+
+@noindent
+This example matches, or selects, all input records with the uppercase
+letter @samp{J} somewhere in the first field:
+
+@example
+$ @kbd{awk '$1 ~ /J/' inventory-shipped}
+@print{} Jan  13  25  15 115
+@print{} Jun  31  42  75 492
+@print{} Jul  24  34  67 436
+@print{} Jan  21  36  64 620
+@end example
+
+So does this:
+
+@example
+awk '@{ if ($1 ~ /J/) print @}' inventory-shipped
+@end example
+
+This next example is true if the expression @var{exp}
+(taken as a character string)
+does @emph{not} match @var{regexp}:
+
+@example
+@var{exp} !~ /@var{regexp}/
+@end example
+
+The following example matches,
+or selects, all input records whose first field @emph{does not} contain
+the uppercase letter @samp{J}:
+
+@example
+$ @kbd{awk '$1 !~ /J/' inventory-shipped}
+@print{} Feb  15  32  24 226
+@print{} Mar  15  24  34 228
+@print{} Apr  31  52  63 420
+@print{} May  16  34  29 208
+@dots{}
+@end example
+
+@cindex regexp constants
+@cindex constant regexps
+@cindex regular expressions, constants, See regexp constants
+When a regexp is enclosed in slashes, such as @code{/foo/}, we call it
+a @dfn{regexp constant}, much like @code{5.27} is a numeric constant and
+@code{"foo"} is a string constant.
+
+@node Escape Sequences
+@section Escape Sequences
+
+@cindex escape sequences, in strings
+@cindex backslash (@code{\}), in escape sequences
+@cindex @code{\} (backslash), in escape sequences
+Some characters cannot be included literally in string constants
+(@code{"foo"}) or regexp constants (@code{/foo/}).
+Instead, they should be represented with @dfn{escape sequences},
+which are character sequences beginning with a backslash (@samp{\}).
+One use of an escape sequence is to include a double-quote character in
+a string constant.  Because a plain double quote ends the string, you
+must use @samp{\"} to represent an actual double-quote character as a
+part of the string.  For example:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "He said \"hi!\" to her." @}'}
+@print{} He said "hi!" to her.
+@end example
+
+The  backslash character itself is another character that cannot be
+included normally; you must write @samp{\\} to put one backslash in the
+string or regexp.  Thus, the string whose contents are the two characters
+@samp{"} and @samp{\} must be written @code{"\"\\"}.
+
+Other escape sequences represent unprintable characters
+such as TAB or newline.  There is nothing to stop you from entering most
+unprintable characters directly in a string constant or regexp constant,
+but they may look ugly.
+
+The following list presents
+all the escape sequences used in @command{awk} and
+what they represent. Unless noted otherwise, all these escape
+sequences apply to both string constants and regexp constants:
+
+@table @code
+@item \\
+A literal backslash, @samp{\}.
+
+@c @cindex @command{awk} language, V.4 version
+@cindex @code{\} (backslash), @code{\a} escape sequence
+@cindex backslash (@code{\}), @code{\a} escape sequence
+@item \a
+The ``alert'' character, @kbd{Ctrl-g}, ASCII code 7 (BEL).
+(This often makes some sort of audible noise.)
+
+@cindex @code{\} (backslash), @code{\b} escape sequence
+@cindex backslash (@code{\}), @code{\b} escape sequence
+@item \b
+Backspace, @kbd{Ctrl-h}, ASCII code 8 (BS).
+
+@cindex @code{\} (backslash), @code{\f} escape sequence
+@cindex backslash (@code{\}), @code{\f} escape sequence
+@item \f
+Formfeed, @kbd{Ctrl-l}, ASCII code 12 (FF).
+
+@cindex @code{\} (backslash), @code{\n} escape sequence
+@cindex backslash (@code{\}), @code{\n} escape sequence
+@item \n
+Newline, @kbd{Ctrl-j}, ASCII code 10 (LF).
+
+@cindex @code{\} (backslash), @code{\r} escape sequence
+@cindex backslash (@code{\}), @code{\r} escape sequence
+@item \r
+Carriage return, @kbd{Ctrl-m}, ASCII code 13 (CR).
+
+@cindex @code{\} (backslash), @code{\t} escape sequence
+@cindex backslash (@code{\}), @code{\t} escape sequence
+@item \t
+Horizontal TAB, @kbd{Ctrl-i}, ASCII code 9 (HT).
+
+@c @cindex @command{awk} language, V.4 version
+@cindex @code{\} (backslash), @code{\v} escape sequence
+@cindex backslash (@code{\}), @code{\v} escape sequence
+@item \v
+Vertical TAB, @kbd{Ctrl-k}, ASCII code 11 (VT).
+
+@cindex @code{\} (backslash), @code{\}@var{nnn} escape sequence
+@cindex backslash (@code{\}), @code{\}@var{nnn} escape sequence
+@item \@var{nnn}
+The octal value @var{nnn}, where @var{nnn} stands for 1 to 3 digits
+between @samp{0} and @samp{7}.  For example, the code for the ASCII ESC
+(escape) character is @samp{\033}.
+
+@c @cindex @command{awk} language, V.4 version
+@c @cindex @command{awk} language, POSIX version
+@cindex @code{\} (backslash), @code{\x} escape sequence
+@cindex backslash (@code{\}), @code{\x} escape sequence
+@cindex common extensions, @code{\x} escape sequence
+@cindex extensions, common@comma{} @code{\x} escape sequence
+@item \x@var{hh}@dots{}
+The hexadecimal value @var{hh}, where @var{hh} stands for a sequence
+of hexadecimal digits (@samp{0}--@samp{9}, and either @samp{A}--@samp{F}
+or @samp{a}--@samp{f}).  A maximum of two digts are allowed after
+the @samp{\x}. Any further hexadecimal digits are treated as simple
+letters or numbers.  @value{COMMONEXT}
+(The @samp{\x} escape sequence is not allowed in POSIX awk.)
+
+@quotation CAUTION
+In ISO C, the escape sequence continues until the first nonhexadecimal
+digit is seen.
+For many years, @command{gawk} would continue incorporating
+hexadecimal digits into the value until a non-hexadecimal digit
+or the end of the string was encountered.
+However, using more than two hexadecimal digits produced
+undefined results.
+As of @value{PVERSION} 4.2, only two digits
+are processed.
+@end quotation
+
+@cindex @code{\} (backslash), @code{\/} escape sequence
+@cindex backslash (@code{\}), @code{\/} escape sequence
+@item \/
+A literal slash (necessary for regexp constants only).
+This sequence is used when you want to write a regexp
+constant that contains a slash
+(such as @code{/.*:\/home\/[[:alnum:]]+:.*/}; the @samp{[[:alnum:]]}
+notation is discussed in @ref{Bracket Expressions}).
+Because the regexp is delimited by
+slashes, you need to escape any slash that is part of the pattern,
+in order to tell @command{awk} to keep processing the rest of the regexp.
+
+@cindex @code{\} (backslash), @code{\"} escape sequence
+@cindex backslash (@code{\}), @code{\"} escape sequence
+@item \"
+A literal double quote (necessary for string constants only).
+This sequence is used when you want to write a string
+constant that contains a double quote
+(such as @code{"He said \"hi!\" to her."}).
+Because the string is delimited by
+double quotes, you need to escape any quote that is part of the string,
+in order to tell @command{awk} to keep processing the rest of the string.
+@end table
+
+In @command{gawk}, a number of additional two-character sequences that begin
+with a backslash have special meaning in regexps.
+@xref{GNU Regexp Operators}.
+
+In a regexp, a backslash before any character that is not in the previous list
+and not listed in
+@ref{GNU Regexp Operators}
+means that the next character should be taken literally, even if it would
+normally be a regexp operator.  For example, @code{/a\+b/} matches the three
+characters @samp{a+b}.
+
+@cindex backslash (@code{\}), in escape sequences
+@cindex @code{\} (backslash), in escape sequences
+@cindex portability
+For complete portability, do not use a backslash before any character not
+shown in the previous list or that is not an operator.
+
+@c 11/2014: Moved so as to not stack sidebars
+@cindex sidebar, Backslash Before Regular Characters
+@ifdocbook
+@docbook
+<sidebar><title>Backslash Before Regular Characters</title>
+@end docbook
+
+@cindex portability, backslash in escape sequences
+@cindex POSIX @command{awk}, backslashes in string constants
+@cindex backslash (@code{\}), in escape sequences, POSIX and
+@cindex @code{\} (backslash), in escape sequences, POSIX and
+
+@cindex troubleshooting, backslash before nonspecial character
+If you place a backslash in a string constant before something that is
+not one of the characters previously listed, POSIX @command{awk} purposely
+leaves what happens as undefined.  There are two choices:
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex Brian Kernighan's @command{awk}
+@table @asis
+@item Strip the backslash out
+This is what BWK @command{awk} and @command{gawk} both do.
+For example, @code{"a\qc"} is the same as @code{"aqc"}.
+(Because this is such an easy bug both to introduce and to miss,
+@command{gawk} warns you about it.)
+Consider @samp{FS = @w{"[ \t]+\|[ \t]+"}} to use vertical bars
+surrounded by whitespace as the field separator. There should be
+two backslashes in the string: @samp{FS = @w{"[ \t]+\\|[ \t]+"}}.)
+@c I did this!  This is why I added the warning.
+
+@cindex @command{gawk}, escape sequences
+@cindex Unix @command{awk}, backslashes in escape sequences
+@cindex @command{mawk} utility
+@item Leave the backslash alone
+Some other @command{awk} implementations do this.
+In such implementations, typing @code{"a\qc"} is the same as typing
+@code{"a\\qc"}.
+@end table
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Backslash Before Regular Characters}
+
+
+@cindex portability, backslash in escape sequences
+@cindex POSIX @command{awk}, backslashes in string constants
+@cindex backslash (@code{\}), in escape sequences, POSIX and
+@cindex @code{\} (backslash), in escape sequences, POSIX and
+
+@cindex troubleshooting, backslash before nonspecial character
+If you place a backslash in a string constant before something that is
+not one of the characters previously listed, POSIX @command{awk} purposely
+leaves what happens as undefined.  There are two choices:
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex Brian Kernighan's @command{awk}
+@table @asis
+@item Strip the backslash out
+This is what BWK @command{awk} and @command{gawk} both do.
+For example, @code{"a\qc"} is the same as @code{"aqc"}.
+(Because this is such an easy bug both to introduce and to miss,
+@command{gawk} warns you about it.)
+Consider @samp{FS = @w{"[ \t]+\|[ \t]+"}} to use vertical bars
+surrounded by whitespace as the field separator. There should be
+two backslashes in the string: @samp{FS = @w{"[ \t]+\\|[ \t]+"}}.)
+@c I did this!  This is why I added the warning.
+
+@cindex @command{gawk}, escape sequences
+@cindex Unix @command{awk}, backslashes in escape sequences
+@cindex @command{mawk} utility
+@item Leave the backslash alone
+Some other @command{awk} implementations do this.
+In such implementations, typing @code{"a\qc"} is the same as typing
+@code{"a\\qc"}.
+@end table
+@end cartouche
+@end ifnotdocbook
+
+To summarize:
+
+@itemize @value{BULLET}
+@item
+The escape sequences in the preceding list are always processed first,
+for both string constants and regexp constants. This happens very early,
+as soon as @command{awk} reads your program.
+
+@item
+@command{gawk} processes both regexp constants and dynamic regexps
+(@pxref{Computed Regexps}),
+for the special operators listed in
+@ref{GNU Regexp Operators}.
+
+@item
+A backslash before any other character means to treat that character
+literally.
+@end itemize
+
+@cindex sidebar, Escape Sequences for Metacharacters
+@ifdocbook
+@docbook
+<sidebar><title>Escape Sequences for Metacharacters</title>
+@end docbook
+
+@cindex metacharacters, escape sequences for
+
+Suppose you use an octal or hexadecimal
+escape to represent a regexp metacharacter.
+(See @ref{Regexp Operators}.)
+Does @command{awk} treat the character as a literal character or as a regexp
+operator?
+
+@cindex dark corner, escape sequences, for metacharacters
+Historically, such characters were taken literally.
+@value{DARKCORNER}
+However, the POSIX standard indicates that they should be treated
+as real metacharacters, which is what @command{gawk} does.
+In compatibility mode (@pxref{Options}),
+@command{gawk} treats the characters represented by octal and hexadecimal
+escape sequences literally when used in regexp constants. Thus,
+@code{/a\52b/} is equivalent to @code{/a\*b/}.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Escape Sequences for Metacharacters}
+
+
+@cindex metacharacters, escape sequences for
+
+Suppose you use an octal or hexadecimal
+escape to represent a regexp metacharacter.
+(See @ref{Regexp Operators}.)
+Does @command{awk} treat the character as a literal character or as a regexp
+operator?
+
+@cindex dark corner, escape sequences, for metacharacters
+Historically, such characters were taken literally.
+@value{DARKCORNER}
+However, the POSIX standard indicates that they should be treated
+as real metacharacters, which is what @command{gawk} does.
+In compatibility mode (@pxref{Options}),
+@command{gawk} treats the characters represented by octal and hexadecimal
+escape sequences literally when used in regexp constants. Thus,
+@code{/a\52b/} is equivalent to @code{/a\*b/}.
+@end cartouche
+@end ifnotdocbook
+
+@node Regexp Operators
+@section Regular Expression Operators
+@cindex regular expressions, operators
+@cindex metacharacters in regular expressions
+
+You can combine regular expressions with special characters,
+called @dfn{regular expression operators} or @dfn{metacharacters}, to
+increase the power and versatility of regular expressions.
+
+@menu
+* Regexp Operator Details::     The actual details.
+* Interval Expressions::        Notes on interval expressions.
+@end menu
+
+@node Regexp Operator Details
+@subsection Regexp Operators in @command{awk}
+
+The escape sequences described
+@ifnotinfo
+earlier
+@end ifnotinfo
+in @ref{Escape Sequences}
+are valid inside a regexp.  They are introduced by a @samp{\} and
+are recognized and converted into corresponding real characters as
+the very first step in processing regexps.
+
+Here is a list of metacharacters.  All characters that are not escape
+sequences and that are not listed here stand for themselves:
+
+@c Use @asis so the docbook comes out ok. Sigh.
+@table @asis
+@cindex backslash (@code{\}), regexp operator
+@cindex @code{\} (backslash), regexp operator
+@item @code{\}
+This suppresses the special meaning of a character when
+matching.  For example, @samp{\$}
+matches the character @samp{$}.
+
+@cindex regular expressions, anchors in
+@cindex Texinfo, chapter beginnings in files
+@cindex @code{^} (caret), regexp operator
+@cindex caret (@code{^}), regexp operator
+@item @code{^}
+This matches the beginning of a string.  @samp{^@@chapter}
+matches @samp{@@chapter} at the beginning of a string,
+for example, and can be used
+to identify chapter beginnings in Texinfo source files.
+The @samp{^} is known as an @dfn{anchor}, because it anchors the pattern to
+match only at the beginning of the string.
+
+It is important to realize that @samp{^} does not match the beginning of
+a line (the point right after a @samp{\n} newline character) embedded in a string.
+The condition is not true in the following example:
+
+@example
+if ("line1\nLINE 2" ~ /^L/) @dots{}
+@end example
+
+@cindex @code{$} (dollar sign), regexp operator
+@cindex dollar sign (@code{$}), regexp operator
+@item @code{$}
+This is similar to @samp{^}, but it matches only at the end of a string.
+For example, @samp{p$}
+matches a record that ends with a @samp{p}.  The @samp{$} is an anchor
+and does not match the end of a line
+(the point right before a @samp{\n} newline character)
+embedded in a string.
+The condition in the following example is not true:
+
+@example
+if ("line1\nLINE 2" ~ /1$/) @dots{}
+@end example
+
+@cindex @code{.} (period), regexp operator
+@cindex period (@code{.}), regexp operator
+@item @code{.} (period)
+This matches any single character,
+@emph{including} the newline character.  For example, @samp{.P}
+matches any single character followed by a @samp{P} in a string.  Using
+concatenation, we can make a regular expression such as @samp{U.A}, which
+matches any three-character sequence that begins with @samp{U} and ends
+with @samp{A}.
+
+@cindex POSIX @command{awk}, period (@code{.})@comma{} using
+In strict POSIX mode (@pxref{Options}),
+@samp{.} does not match the @sc{nul}
+character, which is a character with all bits equal to zero.
+Otherwise, @sc{nul} is just another character. Other versions of @command{awk}
+may not be able to match the @sc{nul} character.
+
+@cindex @code{[]} (square brackets), regexp operator
+@cindex square brackets (@code{[]}), regexp operator
+@cindex bracket expressions
+@cindex character sets, See Also bracket expressions
+@cindex character lists, See bracket expressions
+@cindex character classes, See bracket expressions
+@item @code{[}@dots{}@code{]}
+This is called a @dfn{bracket expression}.@footnote{In other literature,
+you may see a bracket expression referred to as either a
+@dfn{character set}, a @dfn{character class}, or a @dfn{character list}.}
+It matches any @emph{one} of the characters that are enclosed in
+the square brackets.  For example, @samp{[MVX]} matches any one of
+the characters @samp{M}, @samp{V}, or @samp{X} in a string.  A full
+discussion of what can be inside the square brackets of a bracket expression
+is given in
+@ref{Bracket Expressions}.
+
+@cindex bracket expressions, complemented
+@item @code{[^}@dots{}@code{]}
+This is a @dfn{complemented bracket expression}.  The first character after
+the @samp{[} @emph{must} be a @samp{^}.  It matches any characters
+@emph{except} those in the square brackets.  For example, @samp{[^awk]}
+matches any character that is not an @samp{a}, @samp{w},
+or @samp{k}.
+
+@cindex @code{|} (vertical bar)
+@cindex vertical bar (@code{|})
+@item @code{|}
+This is the @dfn{alternation operator} and it is used to specify
+alternatives.  The @samp{|} has the lowest precedence of all the regular
+expression operators.  For example, @samp{^P|[aeiouy]} matches any string
+that matches either @samp{^P} or @samp{[aeiouy]}.  This means it matches
+any string that starts with @samp{P} or contains (anywhere within it)
+a lowercase English vowel.
+
+The alternation applies to the largest possible regexps on either side.
+
+@cindex @code{()} (parentheses), regexp operator
+@cindex parentheses @code{()}, regexp operator
+@item @code{(}@dots{}@code{)}
+Parentheses are used for grouping in regular expressions, as in
+arithmetic.  They can be used to concatenate regular expressions
+containing the alternation operator, @samp{|}.  For example,
+@samp{@@(samp|code)\@{[^@}]+\@}} matches both @samp{@@code@{foo@}} and
+@samp{@@samp@{bar@}}.
+(These are Texinfo formatting control sequences. The @samp{+} is
+explained further on in this list.)
+
+The left or opening parenthesis is always a metacharacter; to match
+one literally, precede it with a backslash. However, the right or
+closing parenthesis is only special when paired with a left parenthesis;
+an unpaired right parenthesis is (silently) treated as a regular character.
+
+@cindex @code{*} (asterisk), @code{*} operator, as regexp operator
+@cindex asterisk (@code{*}), @code{*} operator, as regexp operator
+@item @code{*}
+This symbol means that the preceding regular expression should be
+repeated as many times as necessary to find a match.  For example, @samp{ph*}
+applies the @samp{*} symbol to the preceding @samp{h} and looks for matches
+of one @samp{p} followed by any number of @samp{h}s.  This also matches
+just @samp{p} if no @samp{h}s are present.
+
+There are two subtle points to understand about how @samp{*} works.
+First, the @samp{*} applies only to the single preceding regular expression
+component (e.g., in @samp{ph*}, it applies just to the @samp{h}).
+To cause @samp{*} to apply to a larger subexpression, use parentheses:
+@samp{(ph)*} matches @samp{ph}, @samp{phph}, @samp{phphph}, and so on.
+
+Second, @samp{*} finds as many repetitions as possible. If the text
+to be matched is @samp{phhhhhhhhhhhhhhooey}, @samp{ph*} matches all of
+the @samp{h}s.
+
+@cindex @code{+} (plus sign), regexp operator
+@cindex plus sign (@code{+}), regexp operator
+@item @code{+}
+This symbol is similar to @samp{*}, except that the preceding expression must be
+matched at least once.  This means that @samp{wh+y}
+would match @samp{why} and @samp{whhy}, but not @samp{wy}, whereas
+@samp{wh*y} would match all three.
+
+@cindex @code{?} (question mark), regexp operator
+@cindex question mark (@code{?}), regexp operator
+@item @code{?}
+This symbol is similar to @samp{*}, except that the preceding expression can be
+matched either once or not at all.  For example, @samp{fe?d}
+matches @samp{fed} and @samp{fd}, but nothing else.
+
+@cindex interval expressions, regexp operator
+@item @code{@{}@var{n}@code{@}}
+@itemx @code{@{}@var{n}@code{,@}}
+@itemx @code{@{}@var{n}@code{,}@var{m}@code{@}}
+One or two numbers inside braces denote an @dfn{interval expression}.
+If there is one number in the braces, the preceding regexp is repeated
+@var{n} times.
+If there are two numbers separated by a comma, the preceding regexp is
+repeated @var{n} to @var{m} times.
+If there is one number followed by a comma, then the preceding regexp
+is repeated at least @var{n} times:
+
+@table @code
+@item wh@{3@}y
+Matches @samp{whhhy}, but not @samp{why} or @samp{whhhhy}.
+
+@item wh@{3,5@}y
+Matches @samp{whhhy}, @samp{whhhhy}, or @samp{whhhhhy} only.
+
+@item wh@{2,@}y
+Matches @samp{whhy}, @samp{whhhy}, and so on.
+@end table
+@end table
+
+@cindex precedence, regexp operators
+@cindex regular expressions, operators, precedence of
+In regular expressions, the @samp{*}, @samp{+}, and @samp{?} operators,
+as well as the braces @samp{@{} and @samp{@}},
+have
+the highest precedence, followed by concatenation, and finally by @samp{|}.
+As in arithmetic, parentheses can change how operators are grouped.
+
+@cindex POSIX @command{awk}, regular expressions and
+@cindex @command{gawk}, regular expressions, precedence
+In POSIX @command{awk} and @command{gawk}, the @samp{*}, @samp{+}, and
+@samp{?} operators stand for themselves when there is nothing in the
+regexp that precedes them.  For example, @code{/+/} matches a literal
+plus sign.  However, many other versions of @command{awk} treat such a
+usage as a syntax error.
+
+@node Interval Expressions
+@subsection Some Notes On Interval Expressions
+
+@cindex POSIX @command{awk}, interval expressions in
+Interval expressions were not traditionally available in @command{awk}.
+They were added as part of the POSIX standard to make @command{awk}
+and @command{egrep} consistent with each other.
+
+@cindex @command{gawk}, interval expressions and
+Initially, because old programs may use @samp{@{} and @samp{@}} in regexp
+constants,
+@command{gawk} did @emph{not} match interval expressions
+in regexps.
+
+However, beginning with @value{PVERSION} 4.0,
+@command{gawk} does match interval expressions by default.
+This is because compatibility with POSIX has become more
+important to most @command{gawk} users than compatibility with
+old programs.
+
+For programs that use @samp{@{} and @samp{@}} in regexp constants,
+it is good practice to always escape them with a backslash.  Then the
+regexp constants are valid and work the way you want them to, using
+any version of @command{awk}.@footnote{Use two backslashes if you're
+using a string constant with a regexp operator or function.}
+
+Finally, when @samp{@{} and @samp{@}} appear in regexp constants
+in a way that cannot be interpreted as an interval expression
+(such as @code{/q@{a@}/}), then they stand for themselves.
+
+As mentioned, interval expressions were not traditionally available
+in @command{awk}. In March of 2019, Brian Kernighan's
+@command{awk} (finally) acquired them.
+
+Nonetheless, because they were not available for
+so many decades, @command{gawk} continues to not supply them
+when in compatibility mode (@pxref{Options}).
+
+@node Bracket Expressions
+@section Using Bracket Expressions
+@cindex bracket expressions
+@cindex bracket expressions, range expressions
+@cindex range expressions (regexps)
+@cindex character lists in regular expressions
+
+As mentioned earlier, a bracket expression matches any character among
+those listed between the opening and closing square brackets.
+
+Within a bracket expression, a @dfn{range expression} consists of two
+characters separated by a hyphen.  It matches any single character that
+sorts between the two characters, based upon the system's native character
+set.  For example, @samp{[0-9]} is equivalent to @samp{[0123456789]}.
+(See @ref{Ranges and Locales} for an explanation of how the POSIX
+standard and @command{gawk} have changed over time.  This is mainly
+of historical interest.)
+
+With the increasing popularity of the
+@uref{http://www.unicode.org, Unicode character standard},
+there is an additional wrinkle to consider. Octal and hexadecimal
+escape sequences inside bracket expressions are taken to represent
+only single-byte characters (characters whose values fit within
+the range 0--256).  To match a range of characters where the endpoints
+of the range are larger than 256, enter the multibyte encodings of
+the characters directly.
+
+@cindex @code{\} (backslash), in bracket expressions
+@cindex backslash (@code{\}), in bracket expressions
+@cindex @code{^} (caret), in bracket expressions
+@cindex caret (@code{^}), in bracket expressions
+@cindex @code{-} (hyphen), in bracket expressions
+@cindex hyphen (@code{-}), in bracket expressions
+To include one of the characters @samp{\}, @samp{]}, @samp{-}, or @samp{^} in a
+bracket expression, put a @samp{\} in front of it.  For example:
+
+@example
+[d\]]
+@end example
+
+@noindent
+matches either @samp{d} or @samp{]}.
+Additionally, if you place @samp{]} right after the opening
+@samp{[}, the closing bracket is treated as one of the
+characters to be matched.
+
+@cindex POSIX @command{awk}, bracket expressions and
+@cindex Extended Regular Expressions (EREs)
+@cindex EREs (Extended Regular Expressions)
+@cindex @command{egrep} utility
+The treatment of @samp{\} in bracket expressions
+is compatible with other @command{awk}
+implementations and is also mandated by POSIX.
+The regular expressions in @command{awk} are a superset
+of the POSIX specification for Extended Regular Expressions (EREs).
+POSIX EREs are based on the regular expressions accepted by the
+traditional @command{egrep} utility.
+
+@cindex bracket expressions, character classes
+@cindex POSIX @command{awk}, bracket expressions and, character classes
+@dfn{Character classes} are a feature introduced in the POSIX standard.
+A character class is a special notation for describing
+lists of characters that have a specific attribute, but the
+actual characters can vary from country to country and/or
+from character set to character set.  For example, the notion of what
+is an alphabetic character differs between the United States and France.
+
+A character class is only valid in a regexp @emph{inside} the
+brackets of a bracket expression.  Character classes consist of @samp{[:},
+a keyword denoting the class, and @samp{:]}.
+@ref{table-char-classes} lists the character classes defined by the
+POSIX standard.
+
+@float Table,table-char-classes
+@caption{POSIX character classes}
+@multitable @columnfractions .15 .85
+@headitem Class @tab Meaning
+@item @code{[:alnum:]} @tab Alphanumeric characters
+@item @code{[:alpha:]} @tab Alphabetic characters
+@item @code{[:blank:]} @tab Space and TAB characters
+@item @code{[:cntrl:]} @tab Control characters
+@item @code{[:digit:]} @tab Numeric characters
+@item @code{[:graph:]} @tab Characters that are both printable and visible
+(a space is printable but not visible, whereas an @samp{a} is both)
+@item @code{[:lower:]} @tab Lowercase alphabetic characters
+@item @code{[:print:]} @tab Printable characters (characters that are not control characters)
+@item @code{[:punct:]} @tab Punctuation characters (characters that are not letters, digits,
+control characters, or space characters)
+@item @code{[:space:]} @tab Space characters (these are: space, TAB, newline, carriage return, formfeed and vertical tab)
+@item @code{[:upper:]} @tab Uppercase alphabetic characters
+@item @code{[:xdigit:]} @tab Characters that are hexadecimal digits
+@end multitable
+@end float
+
+For example, before the POSIX standard, you had to write @code{/[A-Za-z0-9]/}
+to match alphanumeric characters.  If your
+character set had other alphabetic characters in it, this would not
+match them.
+With the POSIX character classes, you can write
+@code{/[[:alnum:]]/} to match the alphabetic
+and numeric characters in your character set.
+
+@ignore
+From eliz@gnu.org  Fri Feb 15 03:38:41 2019
+Date: Fri, 15 Feb 2019 12:38:23 +0200
+From: Eli Zaretskii <eliz@gnu.org>
+To: arnold@skeeve.com
+CC: pengyu.ut@gmail.com, bug-gawk@gnu.org
+Subject: Re: [bug-gawk] Does gawk character classes follow this?
+
+> From: arnold@skeeve.com
+> Date: Fri, 15 Feb 2019 03:01:34 -0700
+> Cc: pengyu.ut@gmail.com, bug-gawk@gnu.org
+> 
+> I get the feeling that there's something really bothering you, but
+> I don't understand what.
+> 
+> Can you clarify, please?
+
+I thought I already did: we cannot be expected to provide a definitive
+description of what the named classes stand for, because the answer
+depends on various factors out of our control.
+@end ignore
+
+@c Thanks to
+@c Date: Tue, 01 Jul 2014 07:39:51 +0200
+@c From: Hermann Peifer <peifer@gmx.eu>
+Some utilities that match regular expressions provide a nonstandard
+@samp{[:ascii:]} character class; @command{awk} does not. However, you
+can simulate such a construct using @samp{[\x00-\x7F]}.  This matches
+all values numerically between zero and 127, which is the defined
+range of the ASCII character set.  Use a complemented character list
+(@samp{[^\x00-\x7F]}) to match any single-byte characters that are not
+in the ASCII range.
+
+@quotation NOTE
+Some older versions of Unix @command{awk}
+treat @code{[:blank:]} like @code{[:space:]}, incorrectly matching
+more characters than they should.  Caveat Emptor.
+@end quotation
+
+@cindex bracket expressions, collating elements
+@cindex bracket expressions, non-ASCII
+@cindex collating elements
+Two additional special sequences can appear in bracket expressions.
+These apply to non-ASCII character sets, which can have single symbols
+(called @dfn{collating elements}) that are represented with more than one
+character. They can also have several characters that are equivalent for
+@dfn{collating}, or sorting, purposes.  (For example, in French, a plain ``e''
+and a grave-accented ``@`e'' are equivalent.)
+These sequences are:
+
+@table @asis
+@cindex bracket expressions, collating symbols
+@cindex collating symbols
+@item Collating symbols
+Multicharacter collating elements enclosed between
+@samp{[.} and @samp{.]}.  For example, if @samp{ch} is a collating element,
+then @samp{[[.ch.]]} is a regexp that matches this collating element, whereas
+@samp{[ch]} is a regexp that matches either @samp{c} or @samp{h}.
+
+@cindex bracket expressions, equivalence classes
+@item Equivalence classes
+Locale-specific names for a list of
+characters that are equal. The name is enclosed between
+@samp{[=} and @samp{=]}.
+For example, the name @samp{e} might be used to represent all of
+``e,'' ``@^e,'' ``@`e,'' and ``@'e.'' In this case, @samp{[[=e=]]} is a regexp
+that matches any of @samp{e}, @samp{@^e}, @samp{@'e}, or @samp{@`e}.
+@end table
+
+These features are very valuable in non-English-speaking locales.
+
+@cindex internationalization, localization, character classes
+@cindex @command{gawk}, character classes and
+@cindex POSIX @command{awk}, bracket expressions and, character classes
+@quotation CAUTION
+The library functions that @command{gawk} uses for regular
+expression matching currently recognize only POSIX character classes;
+they do not recognize collating symbols or equivalence classes.
+@end quotation
+@c maybe one day ...
+
+Inside a bracket expression, an opening bracket (@samp{[}) that does
+not start a character class, collating element or equivalence class is
+taken literally. This is also true of @samp{.} and @samp{*}.
+
+@node Leftmost Longest
+@section How Much Text Matches?
+
+@cindex regular expressions, leftmost longest match
+@c @cindex matching, leftmost longest
+Consider the following:
+
+@example
+echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'
+@end example
+
+This example uses the @code{sub()} function to make a change to the input
+record.  (@code{sub()} replaces the first instance of any text matched
+by the first argument with the string provided as the second argument;
+@pxref{String Functions}.)  Here, the regexp @code{/a+/} indicates ``one
+or more @samp{a} characters,'' and the replacement text is @samp{<A>}.
+
+The input contains four @samp{a} characters.
+@command{awk} (and POSIX) regular expressions always match
+the leftmost, @emph{longest} sequence of input characters that can
+match.  Thus, all four @samp{a} characters are
+replaced with @samp{<A>} in this example:
+
+@example
+$ @kbd{echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'}
+@print{} <A>bcd
+@end example
+
+For simple match/no-match tests, this is not so important. But when doing
+text matching and substitutions with the @code{match()}, @code{sub()}, @code{gsub()},
+and @code{gensub()} functions, it is very important.
+@ifinfo
+@xref{String Functions},
+for more information on these functions.
+@end ifinfo
+Understanding this principle is also important for regexp-based record
+and field splitting (@pxref{Records},
+and also @pxref{Field Separators}).
+
+@node Computed Regexps
+@section Using Dynamic Regexps
+
+@cindex regular expressions, computed
+@cindex regular expressions, dynamic
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@c @cindex operators, @code{~}
+@c @cindex operators, @code{!~}
+The righthand side of a @samp{~} or @samp{!~} operator need not be a
+regexp constant (i.e., a string of characters between slashes).  It may
+be any expression.  The expression is evaluated and converted to a string
+if necessary; the contents of the string are then used as the
+regexp.  A regexp computed in this way is called a @dfn{dynamic
+regexp} or a @dfn{computed regexp}:
+
+@example
+BEGIN @{ digits_regexp = "[[:digit:]]+" @}
+$0 ~ digits_regexp    @{ print @}
+@end example
+
+@noindent
+This sets @code{digits_regexp} to a regexp that describes one or more digits,
+and tests whether the input record matches this regexp.
+
+@quotation NOTE
+When using the @samp{~} and @samp{!~}
+operators, be aware that there is a difference between a regexp constant
+enclosed in slashes and a string constant enclosed in double quotes.
+If you are going to use a string constant, you have to understand that
+the string is, in essence, scanned @emph{twice}: the first time when
+@command{awk} reads your program, and the second time when it goes to
+match the string on the lefthand side of the operator with the pattern
+on the right.  This is true of any string-valued expression (such as
+@code{digits_regexp}, shown in the previous example), not just string constants.
+@end quotation
+
+@cindex regexp constants, slashes vs.@: quotes
+@cindex @code{\} (backslash), in regexp constants
+@cindex backslash (@code{\}), in regexp constants
+@cindex @code{"} (double quote), in regexp constants
+@cindex double quote (@code{"}), in regexp constants
+What difference does it make if the string is
+scanned twice? The answer has to do with escape sequences, and particularly
+with backslashes.  To get a backslash into a regular expression inside a
+string, you have to type two backslashes.
+
+For example, @code{/\*/} is a regexp constant for a literal @samp{*}.
+Only one backslash is needed.  To do the same thing with a string,
+you have to type @code{"\\*"}.  The first backslash escapes the
+second one so that the string actually contains the
+two characters @samp{\} and @samp{*}.
+
+@cindex troubleshooting, regexp constants vs.@: string constants
+@cindex regexp constants, vs.@: string constants
+@cindex string constants, vs.@: regexp constants
+Given that you can use both regexp and string constants to describe
+regular expressions, which should you use?  The answer is ``regexp
+constants,'' for several reasons:
+
+@itemize @value{BULLET}
+@item
+String constants are more complicated to write and
+more difficult to read. Using regexp constants makes your programs
+less error-prone.  Not understanding the difference between the two
+kinds of constants is a common source of errors.
+
+@item
+It is more efficient to use regexp constants. @command{awk} can note
+that you have supplied a regexp and store it internally in a form that
+makes pattern matching more efficient.  When using a string constant,
+@command{awk} must first convert the string into this internal form and
+then perform the pattern matching.
+
+@item
+Using regexp constants is better form; it shows clearly that you
+intend a regexp match.
+@end itemize
+
+@cindex sidebar, Using @code{\n} in Bracket Expressions of Dynamic Regexps
+@ifdocbook
+@docbook
+<sidebar><title>Using @code{\n} in Bracket Expressions of Dynamic Regexps</title>
+@end docbook
+
+@cindex regular expressions, dynamic, with embedded newlines
+@cindex newlines, in dynamic regexps
+
+Some older versions of @command{awk} do not allow the newline
+character to be used inside a bracket expression for a dynamic regexp:
+
+@example
+$ @kbd{awk '$0 ~ "[ \t\n]"'}
+@error{} awk: newline in character class [
+@error{} ]...
+@error{}  source line number 1
+@error{}  context is
+@error{}        $0 ~ "[ >>>  \t\n]" <<<
+@end example
+
+@cindex newlines, in regexp constants
+But a newline in a regexp constant works with no problem:
+
+@example
+$ @kbd{awk '$0 ~ /[ \t\n]/'}
+@kbd{here is a sample line}
+@print{} here is a sample line
+@kbd{Ctrl-d}
+@end example
+
+@command{gawk} does not have this problem, and it isn't likely to
+occur often in practice, but it's worth noting for future reference.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Using @code{\n} in Bracket Expressions of Dynamic Regexps}
+
+
+@cindex regular expressions, dynamic, with embedded newlines
+@cindex newlines, in dynamic regexps
+
+Some older versions of @command{awk} do not allow the newline
+character to be used inside a bracket expression for a dynamic regexp:
+
+@example
+$ @kbd{awk '$0 ~ "[ \t\n]"'}
+@error{} awk: newline in character class [
+@error{} ]...
+@error{}  source line number 1
+@error{}  context is
+@error{}        $0 ~ "[ >>>  \t\n]" <<<
+@end example
+
+@cindex newlines, in regexp constants
+But a newline in a regexp constant works with no problem:
+
+@example
+$ @kbd{awk '$0 ~ /[ \t\n]/'}
+@kbd{here is a sample line}
+@print{} here is a sample line
+@kbd{Ctrl-d}
+@end example
+
+@command{gawk} does not have this problem, and it isn't likely to
+occur often in practice, but it's worth noting for future reference.
+@end cartouche
+@end ifnotdocbook
+
+@node GNU Regexp Operators
+@section @command{gawk}-Specific Regexp Operators
+
+@c This section adapted (long ago) from the regex-0.12 manual
+
+@cindex regular expressions, operators, @command{gawk}
+@cindex @command{gawk}, regular expressions, operators
+@cindex operators, GNU-specific
+@cindex regular expressions, operators, for words
+@cindex word, regexp definition of
+GNU software that deals with regular expressions provides a number of
+additional regexp operators.  These operators are described in this
+@value{SECTION} and are specific to @command{gawk};
+they are not available in other @command{awk} implementations.
+Most of the additional operators deal with word matching.
+For our purposes, a @dfn{word} is a sequence of one or more letters, digits,
+or underscores (@samp{_}):
+
+@table @code
+@c @cindex operators, @code{\s} (@command{gawk})
+@cindex backslash (@code{\}), @code{\s} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\s} operator (@command{gawk})
+@item \s
+Matches any whitespace character.
+Think of it as shorthand for
+@w{@samp{[[:space:]]}}.
+
+@c @cindex operators, @code{\S} (@command{gawk})
+@cindex backslash (@code{\}), @code{\S} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\S} operator (@command{gawk})
+@item \S
+Matches any character that is not whitespace.
+Think of it as shorthand for
+@w{@samp{[^[:space:]]}}.
+
+@c @cindex operators, @code{\w} (@command{gawk})
+@cindex backslash (@code{\}), @code{\w} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\w} operator (@command{gawk})
+@item \w
+Matches any word-constituent character---that is, it matches any
+letter, digit, or underscore. Think of it as shorthand for
+@w{@samp{[[:alnum:]_]}}.
+
+@c @cindex operators, @code{\W} (@command{gawk})
+@cindex backslash (@code{\}), @code{\W} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\W} operator (@command{gawk})
+@item \W
+Matches any character that is not word-constituent.
+Think of it as shorthand for
+@w{@samp{[^[:alnum:]_]}}.
+
+@c @cindex operators, @code{\<} (@command{gawk})
+@cindex backslash (@code{\}), @code{\<} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\<} operator (@command{gawk})
+@item \<
+Matches the empty string at the beginning of a word.
+For example, @code{/\<away/} matches @samp{away} but not
+@samp{stowaway}.
+
+@c @cindex operators, @code{\>} (@command{gawk})
+@cindex backslash (@code{\}), @code{\>} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\>} operator (@command{gawk})
+@item \>
+Matches the empty string at the end of a word.
+For example, @code{/stow\>/} matches @samp{stow} but not @samp{stowaway}.
+
+@c @cindex operators, @code{\y} (@command{gawk})
+@cindex backslash (@code{\}), @code{\y} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\y} operator (@command{gawk})
+@cindex word boundaries@comma{} matching
+@item \y
+Matches the empty string at either the beginning or the
+end of a word (i.e., the word boundar@strong{y}).  For example, @samp{\yballs?\y}
+matches either @samp{ball} or @samp{balls}, as a separate word.
+
+@c @cindex operators, @code{\B} (@command{gawk})
+@cindex backslash (@code{\}), @code{\B} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\B} operator (@command{gawk})
+@item \B
+Matches the empty string that occurs between two
+word-constituent characters. For example,
+@code{/\Brat\B/} matches @samp{crate}, but it does not match @samp{dirty rat}.
+@samp{\B} is essentially the opposite of @samp{\y}.
+@end table
+
+@cindex buffers, operators for
+@cindex regular expressions, operators, for buffers
+@cindex operators, string-matching, for buffers
+There are two other operators that work on buffers.  In Emacs, a
+@dfn{buffer} is, naturally, an Emacs buffer.
+Other GNU programs, including @command{gawk},
+consider the entire string to match as the buffer.
+The operators are:
+
+@table @code
+@item \`
+@c @cindex operators, @code{\`} (@command{gawk})
+@cindex backslash (@code{\}), @code{\`} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\`} operator (@command{gawk})
+Matches the empty string at the
+beginning of a buffer (string)
+
+@c @cindex operators, @code{\'} (@command{gawk})
+@cindex backslash (@code{\}), @code{\'} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\'} operator (@command{gawk})
+@item \'
+Matches the empty string at the
+end of a buffer (string)
+@end table
+
+@cindex @code{^} (caret), regexp operator
+@cindex caret (@code{^}), regexp operator
+@cindex @code{?} (question mark), regexp operator
+@cindex question mark (@code{?}), regexp operator
+Because @samp{^} and @samp{$} always work in terms of the beginning
+and end of strings, these operators don't add any new capabilities
+for @command{awk}.  They are provided for compatibility with other
+GNU software.
+
+@cindex @command{gawk}, word-boundary operator
+@cindex word-boundary operator (@command{gawk})
+@cindex operators, word-boundary (@command{gawk})
+In other GNU software, the word-boundary operator is @samp{\b}. However,
+that conflicts with the @command{awk} language's definition of @samp{\b}
+as backspace, so @command{gawk} uses a different letter.
+An alternative method would have been to require two backslashes in the
+GNU operators, but this was deemed too confusing. The current
+method of using @samp{\y} for the GNU @samp{\b} appears to be the
+lesser of two evils.
+
+@cindex regular expressions, @command{gawk}, command-line options
+@cindex @command{gawk}, command-line options, and regular expressions
+The various command-line options
+(@pxref{Options})
+control how @command{gawk} interprets characters in regexps:
+
+@table @asis
+@item No options
+In the default case, @command{gawk} provides all the facilities of
+POSIX regexps and the
+@ifnotinfo
+previously described
+GNU regexp operators.
+@end ifnotinfo
+@ifnottex
+@ifnotdocbook
+GNU regexp operators described
+in @ref{Regexp Operators}.
+@end ifnotdocbook
+@end ifnottex
+
+@item @code{--posix}
+Match only POSIX regexps; the GNU operators are not special
+(e.g., @samp{\w} matches a literal @samp{w}).  Interval expressions
+are allowed.
+
+@cindex Brian Kernighan's @command{awk}
+@item @code{--traditional}
+Match traditional Unix @command{awk} regexps. The GNU operators
+are not special, and interval expressions are not available.
+Because BWK @command{awk} supports them,
+the POSIX character classes (@samp{[[:alnum:]]}, etc.) are available.
+Characters described by octal and hexadecimal escape sequences are
+treated literally, even if they represent regexp metacharacters.
+
+@item @code{--re-interval}
+Allow interval expressions in regexps, if @option{--traditional}
+has been provided.
+Otherwise, interval expressions are available by default.
+@end table
+
+@node Case-sensitivity
+@section Case Sensitivity in Matching
+
+@cindex regular expressions, case sensitivity
+@cindex case sensitivity, regexps and
+Case is normally significant in regular expressions, both when matching
+ordinary characters (i.e., not metacharacters) and inside bracket
+expressions.  Thus, a @samp{w} in a regular expression matches only a lowercase
+@samp{w} and not an uppercase @samp{W}.
+
+The simplest way to do a case-independent match is to use a bracket
+expression---for example, @samp{[Ww]}.  However, this can be cumbersome if
+you need to use it often, and it can make the regular expressions harder
+to read.  There are two alternatives that you might prefer.
+
+One way to perform a case-insensitive match at a particular point in the
+program is to convert the data to a single case, using the
+@code{tolower()} or @code{toupper()} built-in string functions (which we
+haven't discussed yet;
+@pxref{String Functions}).
+For example:
+
+@example
+tolower($1) ~ /foo/  @{ @dots{} @}
+@end example
+
+@noindent
+converts the first field to lowercase before matching against it.
+This works in any POSIX-compliant @command{awk}.
+
+@cindex @command{gawk}, regular expressions, case sensitivity
+@cindex case sensitivity, @command{gawk}
+@cindex differences in @command{awk} and @command{gawk}, regular expressions
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@cindex @code{IGNORECASE} variable, with @code{~} and @code{!~} operators
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+@c @cindex variables, @code{IGNORECASE}
+Another method, specific to @command{gawk}, is to set the variable
+@code{IGNORECASE} to a nonzero value (@pxref{Built-in Variables}).
+When @code{IGNORECASE} is not zero, @emph{all} regexp and string
+operations ignore case.
+
+Changing the value of @code{IGNORECASE} dynamically controls the
+case sensitivity of the program as it runs.  Case is significant by
+default because @code{IGNORECASE} (like most variables) is initialized
+to zero:
+
+@example
+x = "aB"
+if (x ~ /ab/) @dots{}   # this test will fail
+
+IGNORECASE = 1
+if (x ~ /ab/) @dots{}   # now it will succeed
+@end example
+
+In general, you cannot use @code{IGNORECASE} to make certain rules
+case insensitive and other rules case sensitive, as there is no
+straightforward way
+to set @code{IGNORECASE} just for the pattern of
+a particular rule.@footnote{Experienced C and C++ programmers will note
+that it is possible, using something like
+@samp{IGNORECASE = 1 && /foObAr/ @{ @dots{} @}}
+and
+@samp{IGNORECASE = 0 || /foobar/ @{ @dots{} @}}.
+However, this is somewhat obscure and we don't recommend it.}
+To do this, use either bracket expressions or @code{tolower()}.  However, one
+thing you can do with @code{IGNORECASE} only is dynamically turn
+case sensitivity on or off for all the rules at once.
+
+@code{IGNORECASE} can be set on the command line or in a @code{BEGIN} rule
+(@pxref{Other Arguments}; also
+@pxref{Using BEGIN/END}).
+Setting @code{IGNORECASE} from the command line is a way to make
+a program case insensitive without having to edit it.
+
+@c @cindex ISO 8859-1
+@c @cindex ISO Latin-1
+In multibyte locales, the equivalences between upper- and lowercase
+characters are tested based on the wide-character values of the locale's
+character set.  Prior to @value{PVERSION} 5.0, single-byte characters were
+tested based on the ISO-8859-1 (ISO Latin-1) character set.  However, as
+of @value{PVERSION} 5.0, single-byte characters are also tested based on
+the values of the locale's character set.@footnote{If you don't understand
+this, don't worry about it; it just means that @command{gawk} does the
+right thing.}
+
+The value of @code{IGNORECASE} has no effect if @command{gawk} is in
+compatibility mode (@pxref{Options}).
+Case is always significant in compatibility mode.
+
+@node Regexp Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Regular expressions describe sets of strings to be matched.
+In @command{awk}, regular expression constants are written enclosed
+between slashes: @code{/}@dots{}@code{/}.
+
+@item
+Regexp constants may be used standalone in patterns and
+in conditional expressions, or as part of matching expressions
+using the @samp{~} and @samp{!~} operators.
+
+@item
+Escape sequences let you represent nonprintable characters and
+also let you represent regexp metacharacters as literal characters
+to be matched.
+
+@item
+Regexp operators provide grouping, alternation, and repetition.
+
+@item
+Bracket expressions give you a shorthand for specifying sets
+of characters that can match at a particular point in a regexp.
+Within bracket expressions, POSIX character classes let you specify
+certain groups of characters in a locale-independent fashion.
+
+@item
+Regular expressions match the leftmost longest text in the string being
+matched.  This matters for cases where you need to know the extent of
+the match, such as for text substitution and when the record separator
+is a regexp.
+
+@item
+Matching expressions may use dynamic regexps (i.e., string values
+treated as regular expressions).
+
+@item
+@command{gawk}'s @code{IGNORECASE} variable lets you control the
+case sensitivity of regexp matching.  In other @command{awk}
+versions, use @code{tolower()} or @code{toupper()}.
+
+@end itemize
+
+
+@node Reading Files
+@chapter Reading Input Files
+
+@cindex reading input files
+@cindex input files, reading
+@cindex input files
+@cindex @code{FILENAME} variable
+In the typical @command{awk} program,
+@command{awk} reads all input either from the
+standard input (by default, this is the keyboard, but often it is a pipe from another
+command) or from files whose names you specify on the @command{awk}
+command line.  If you specify input files, @command{awk} reads them
+in order, processing all the data from one before going on to the next.
+The name of the current input file can be found in the predefined variable
+@code{FILENAME}
+(@pxref{Built-in Variables}).
+
+@cindex records
+@cindex fields
+The input is read in units called @dfn{records}, and is processed by the
+rules of your program one record at a time.
+By default, each record is one line.  Each
+record is automatically split into chunks called @dfn{fields}.
+This makes it more convenient for programs to work on the parts of a record.
+
+@cindex @code{getline} command
+On rare occasions, you may need to use the @code{getline} command.
+The  @code{getline} command is valuable both because it
+can do explicit input from any number of files, and because the files
+used with it do not have to be named on the @command{awk} command line
+(@pxref{Getline}).
+
+@menu
+* Records::                     Controlling how data is split into records.
+* Fields::                      An introduction to fields.
+* Nonconstant Fields::          Nonconstant Field Numbers.
+* Changing Fields::             Changing the Contents of a Field.
+* Field Separators::            The field separator and how to change it.
+* Constant Size::               Reading constant width data.
+* Splitting By Content::        Defining Fields By Content
+* Testing field creation::      Checking how @command{gawk} is splitting
+                                records.
+* Multiple Line::               Reading multiline records.
+* Getline::                     Reading files under explicit program control
+                                using the @code{getline} function.
+* Read Timeout::                Reading input with a timeout.
+* Retrying Input::              Retrying input after certain errors.
+* Command-line directories::    What happens if you put a directory on the
+                                command line.
+* Input Summary::               Input summary.
+* Input Exercises::             Exercises.
+@end menu
+
+@node Records
+@section How Input Is Split into Records
+
+@cindex input, splitting into records
+@cindex records, splitting input into
+@cindex @code{NR} variable
+@cindex @code{FNR} variable
+@command{awk} divides the input for your program into records and fields.
+It keeps track of the number of records that have been read so far from
+the current input file.  This value is stored in a predefined variable
+called @code{FNR}, which is reset to zero every time a new file is started.
+Another predefined variable, @code{NR}, records the total number of input
+records read so far from all @value{DF}s.  It starts at zero, but is
+never automatically reset to zero.
+
+Normally, records are separated by newline characters.  You can control how
+records are separated by assigning values to the built-in variable @code{RS}.
+If @code{RS} is any single character, that character separates records.
+Otherwise (in @command{gawk}), @code{RS} is treated as a regular expression.
+This mechanism is explained in greater detail shortly.
+
+@menu
+* awk split records::           How standard @command{awk} splits records.
+* gawk split records::          How @command{gawk} splits records.
+@end menu
+
+@node awk split records
+@subsection Record Splitting with Standard @command{awk}
+
+@cindex separators, for records
+@cindex record separators
+Records are separated by a character called the @dfn{record separator}.
+By default, the record separator is the newline character.
+This is why records are, by default, single lines.
+To use a different character for the record separator,
+simply assign that character to the predefined variable @code{RS}.
+
+@cindex record separators, newlines as
+@cindex newlines, as record separators
+@cindex @code{RS} variable
+Like any other variable,
+the value of @code{RS} can be changed in the @command{awk} program
+with the assignment operator, @samp{=}
+(@pxref{Assignment Ops}).
+The new record-separator character should be enclosed in quotation marks,
+which indicate a string constant.  Often, the right time to do this is
+at the beginning of execution, before any input is processed,
+so that the very first record is read with the proper separator.
+To do this, use the special @code{BEGIN} pattern
+(@pxref{BEGIN/END}).
+For example:
+
+@example
+awk 'BEGIN @{ RS = "u" @}
+     @{ print $0 @}' mail-list
+@end example
+
+@noindent
+changes the value of @code{RS} to @samp{u}, before reading any input.
+The new value is a string whose first character is the letter ``u''; as a result, records
+are separated by the letter ``u''.  Then the input file is read, and the second
+rule in the @command{awk} program (the action with no pattern) prints each
+record.  Because each @code{print} statement adds a newline at the end of
+its output, this @command{awk} program copies the input
+with each @samp{u} changed to a newline.  Here are the results of running
+the program on @file{mail-list}:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{ RS = "u" @}}
+>      @kbd{@{ print $0 @}' mail-list}
+@end group
+@print{} Amelia       555-5553     amelia.zodiac
+@print{} sq
+@print{} e@@gmail.com    F
+@print{} Anthony      555-3412     anthony.assert
+@print{} ro@@hotmail.com   A
+@print{} Becky        555-7685     becky.algebrar
+@print{} m@@gmail.com      A
+@print{} Bill         555-1675     bill.drowning@@hotmail.com       A
+@print{} Broderick    555-0542     broderick.aliq
+@print{} otiens@@yahoo.com R
+@print{} Camilla      555-2912     camilla.inf
+@print{} sar
+@print{} m@@skynet.be     R
+@print{} Fabi
+@print{} s       555-1234     fabi
+@print{} s.
+@print{} ndevicesim
+@print{} s@@
+@print{} cb.ed
+@print{}     F
+@print{} J
+@print{} lie        555-6699     j
+@print{} lie.perscr
+@print{} tabor@@skeeve.com   F
+@print{} Martin       555-6480     martin.codicib
+@print{} s@@hotmail.com    A
+@print{} Sam
+@print{} el       555-3430     sam
+@print{} el.lanceolis@@sh
+@print{} .ed
+@print{}         A
+@print{} Jean-Pa
+@print{} l    555-2127     jeanpa
+@print{} l.campanor
+@print{} m@@ny
+@print{} .ed
+@print{}      R
+@print{}
+@end example
+
+@noindent
+Note that the entry for the name @samp{Bill} is not split.
+In the original @value{DF}
+(@pxref{Sample Data Files}),
+the line looks like this:
+
+@example
+Bill         555-1675     bill.drowning@@hotmail.com       A
+@end example
+
+@noindent
+It contains no @samp{u}, so there is no reason to split the record,
+unlike the others, which each have one or more occurrences of the @samp{u}.
+In fact, this record is treated as part of the previous record;
+the newline separating them in the output
+is the original newline in the @value{DF}, not the one added by
+@command{awk} when it printed the record!
+
+@cindex record separators, changing
+@cindex separators, for records
+Another way to change the record separator is on the command line,
+using the variable-assignment feature
+(@pxref{Other Arguments}):
+
+@example
+awk '@{ print $0 @}' RS="u" mail-list
+@end example
+
+@noindent
+This sets @code{RS} to @samp{u} before processing @file{mail-list}.
+
+Using an alphabetic character such as @samp{u} for the record separator
+is highly likely to produce strange results.
+Using an unusual character such as @samp{/} is more likely to
+produce correct behavior in the majority of cases, but there
+are no guarantees. The moral is: Know Your Data.
+
+@command{gawk} allows @code{RS} to be a full regular expression
+(discussed shortly; @pxref{gawk split records}).  Even so, using
+a regular expression metacharacter, such as @samp{.} as the single
+character in the value of @code{RS} has no special effect: it is
+treated literally. This is required for backwards compatibility with
+both Unix @command{awk} and with POSIX.
+
+When using regular characters as the record separator,
+there is one unusual case that occurs when @command{gawk} is
+being fully POSIX-compliant (@pxref{Options}).
+Then, the following (extreme) pipeline prints a surprising @samp{1}:
+
+@example
+$ @kbd{echo | gawk --posix 'BEGIN @{ RS = "a" @} ; @{ print NF @}'}
+@print{} 1
+@end example
+
+There is one field, consisting of a newline.  The value of the built-in
+variable @code{NF} is the number of fields in the current record.
+(In the normal case, @command{gawk} treats the newline as whitespace,
+printing @samp{0} as the result. Most other versions of @command{awk}
+also act this way.)
+
+@cindex dark corner, input files
+Reaching the end of an input file terminates the current input record,
+even if the last character in the file is not the character in @code{RS}.
+@value{DARKCORNER}
+
+@cindex empty strings
+@cindex null strings
+@cindex strings, empty, See null strings
+The empty string @code{""} (a string without any characters)
+has a special meaning
+as the value of @code{RS}. It means that records are separated
+by one or more blank lines and nothing else.
+@xref{Multiple Line} for more details.
+
+If you change the value of @code{RS} in the middle of an @command{awk} run,
+the new value is used to delimit subsequent records, but the record
+currently being processed, as well as records already processed, are not
+affected.
+
+@cindex @command{gawk}, @code{RT} variable in
+@cindex @code{RT} variable
+@cindex records, terminating
+@cindex terminating records
+@cindex differences in @command{awk} and @command{gawk}, record separators
+@cindex differences in @command{awk} and @command{gawk}, @code{RS}/@code{RT} variables
+@cindex regular expressions, as record separators
+@cindex record separators, regular expressions as
+@cindex separators, for records, regular expressions as
+After the end of the record has been determined, @command{gawk}
+sets the variable @code{RT} to the text in the input that matched
+@code{RS}.
+
+@node gawk split records
+@subsection Record Splitting with @command{gawk}
+
+@cindex common extensions, @code{RS} as a regexp
+@cindex extensions, common@comma{} @code{RS} as a regexp
+When using @command{gawk}, the value of @code{RS} is not limited to a
+one-character string.  If it contains more than one character, it is
+treated as a regular expression
+(@pxref{Regexp}). @value{COMMONEXT}
+In general, each record
+ends at the next string that matches the regular expression; the next
+record starts at the end of the matching string.  This general rule is
+actually at work in the usual case, where @code{RS} contains just a
+newline: a record ends at the beginning of the next matching string (the
+next newline in the input), and the following record starts just after
+the end of this string (at the first character of the following line).
+The newline, because it matches @code{RS}, is not part of either record.
+
+When @code{RS} is a single character, @code{RT}
+contains the same single character. However, when @code{RS} is a
+regular expression, @code{RT} contains
+the actual input text that matched the regular expression.
+
+If the input file ends without any text matching @code{RS},
+@command{gawk} sets @code{RT} to the null string.
+
+The following example illustrates both of these features.
+It sets @code{RS} equal to a regular expression that
+matches either a newline or a series of one or more uppercase letters
+with optional leading and/or trailing whitespace:
+
+@example
+@group
+$ @kbd{echo record 1 AAAA record 2 BBBB record 3 |}
+> @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}}
+>             @kbd{@{ print "Record =", $0,"and RT = [" RT "]" @}'}
+@end group
+@print{} Record = record 1 and RT = [ AAAA ]
+@print{} Record = record 2 and RT = [ BBBB ]
+@print{} Record = record 3 and RT = [
+@print{} ]
+@end example
+
+@noindent
+The square brackets delineate the contents of @code{RT}, letting you
+see the leading and trailing whitespace. The final value of
+@code{RT} is a newline.
+@xref{Simple Sed} for a more useful example
+of @code{RS} as a regexp and @code{RT}.
+
+If you set @code{RS} to a regular expression that allows optional
+trailing text, such as @samp{RS = "abc(XYZ)?"}, it is possible, due
+to implementation constraints, that @command{gawk} may match the leading
+part of the regular expression, but not the trailing part, particularly
+if the input text that could match the trailing part is fairly long.
+@command{gawk} attempts to avoid this problem, but currently, there's
+no guarantee that this will never happen.
+
+@quotation NOTE
+Remember that in @command{awk}, the @samp{^} and @samp{$} anchor
+metacharacters match the beginning and end of a @emph{string}, and not
+the beginning and end of a @emph{line}.  As a result, something like
+@samp{RS = "^[[:upper:]]"} can only match at the beginning of a file.
+This is because @command{gawk} views the input file as one long string
+that happens to contain newline characters.
+It is thus best to avoid anchor metacharacters in the value of @code{RS}.
+@end quotation
+
+@cindex @command{gawk}, @code{RT} variable in
+@cindex @code{RT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{RS}/@code{RT} variables
+The use of @code{RS} as a regular expression and the @code{RT}
+variable are @command{gawk} extensions; they are not available in
+compatibility mode
+(@pxref{Options}).
+In compatibility mode, only the first character of the value of
+@code{RS} determines the end of the record.
+
+@cindex sidebar, @code{RS = "\0"} Is Not Portable
+@ifdocbook
+@docbook
+<sidebar><title>@code{RS = "\0"} Is Not Portable</title>
+@end docbook
+
+@cindex portability, data files as single record
+There are times when you might want to treat an entire @value{DF} as a
+single record.  The only way to make this happen is to give @code{RS}
+a value that you know doesn't occur in the input file.  This is hard
+to do in a general way, such that a program always works for arbitrary
+input files.
+
+You might think that for text files, the @sc{nul} character, which
+consists of a character with all bits equal to zero, is a good
+value to use for @code{RS} in this case:
+
+@example
+BEGIN @{ RS = "\0" @}  # whole file becomes one record?
+@end example
+
+@cindex differences in @command{awk} and @command{gawk}, strings, storing
+@command{gawk} in fact accepts this, and uses the @sc{nul}
+character for the record separator.
+This works for certain special files, such as @file{/proc/environ} on
+GNU/Linux systems, where the @sc{nul} character is in fact the record separator.
+However, this usage is @emph{not} portable
+to most other @command{awk} implementations.
+
+@cindex dark corner, strings, storing
+Almost all other @command{awk} implementations@footnote{At least that we know
+about.} store strings internally as C-style strings.  C strings use the
+@sc{nul} character as the string terminator.  In effect, this means that
+@samp{RS = "\0"} is the same as @samp{RS = ""}.
+@value{DARKCORNER}
+
+It happens that recent versions of @command{mawk} can use the @sc{nul}
+character as a record separator. However, this is a special case:
+@command{mawk} does not allow embedded @sc{nul} characters in strings.
+(This may change in a future version of @command{mawk}.)
+
+@cindex records, treating files as
+@cindex treating files, as single records
+@cindex single records, treating files as
+@xref{Readfile Function} for an interesting way to read
+whole files.  If you are using @command{gawk}, see @ref{Extension Sample
+Readfile} for another option.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{@code{RS = "\0"} Is Not Portable}
+
+
+@cindex portability, data files as single record
+There are times when you might want to treat an entire @value{DF} as a
+single record.  The only way to make this happen is to give @code{RS}
+a value that you know doesn't occur in the input file.  This is hard
+to do in a general way, such that a program always works for arbitrary
+input files.
+
+You might think that for text files, the @sc{nul} character, which
+consists of a character with all bits equal to zero, is a good
+value to use for @code{RS} in this case:
+
+@example
+BEGIN @{ RS = "\0" @}  # whole file becomes one record?
+@end example
+
+@cindex differences in @command{awk} and @command{gawk}, strings, storing
+@command{gawk} in fact accepts this, and uses the @sc{nul}
+character for the record separator.
+This works for certain special files, such as @file{/proc/environ} on
+GNU/Linux systems, where the @sc{nul} character is in fact the record separator.
+However, this usage is @emph{not} portable
+to most other @command{awk} implementations.
+
+@cindex dark corner, strings, storing
+Almost all other @command{awk} implementations@footnote{At least that we know
+about.} store strings internally as C-style strings.  C strings use the
+@sc{nul} character as the string terminator.  In effect, this means that
+@samp{RS = "\0"} is the same as @samp{RS = ""}.
+@value{DARKCORNER}
+
+It happens that recent versions of @command{mawk} can use the @sc{nul}
+character as a record separator. However, this is a special case:
+@command{mawk} does not allow embedded @sc{nul} characters in strings.
+(This may change in a future version of @command{mawk}.)
+
+@cindex records, treating files as
+@cindex treating files, as single records
+@cindex single records, treating files as
+@xref{Readfile Function} for an interesting way to read
+whole files.  If you are using @command{gawk}, see @ref{Extension Sample
+Readfile} for another option.
+@end cartouche
+@end ifnotdocbook
+
+@node Fields
+@section Examining Fields
+
+@cindex examining fields
+@cindex fields
+@cindex accessing fields
+@cindex fields, examining
+When @command{awk} reads an input record, the record is
+automatically @dfn{parsed} or separated by the @command{awk} utility into chunks
+called @dfn{fields}.  By default, fields are separated by @dfn{whitespace},
+like words in a line.
+Whitespace in @command{awk} means any string of one or more spaces,
+TABs, or newlines; other characters
+that are considered whitespace by other languages
+(such as formfeed, vertical tab, etc.) are @emph{not} considered
+whitespace by @command{awk}.
+
+The purpose of fields is to make it more convenient for you to refer to
+these pieces of the record.  You don't have to use them---you can
+operate on the whole record if you want---but fields are what make
+simple @command{awk} programs so powerful.
+
+@cindex field operator @code{$}
+@cindex @code{$} (dollar sign), @code{$} field operator
+@cindex dollar sign (@code{$}), @code{$} field operator
+@cindex field operators@comma{} dollar sign as
+You use a dollar sign (@samp{$})
+to refer to a field in an @command{awk} program,
+followed by the number of the field you want.  Thus, @code{$1}
+refers to the first field, @code{$2} to the second, and so on.
+(Unlike in the Unix shells, the field numbers are not limited to single digits.
+@code{$127} is the 127th field in the record.)
+For example, suppose the following is a line of input:
+
+@example
+This seems like a pretty nice example.
+@end example
+
+@noindent
+Here the first field, or @code{$1}, is @samp{This}, the second field, or
+@code{$2}, is @samp{seems}, and so on.  Note that the last field,
+@code{$7}, is @samp{example.}.  Because there is no space between the
+@samp{e} and the @samp{.}, the period is considered part of the seventh
+field.
+
+@cindex @code{NF} variable
+@cindex fields, number of
+@code{NF} is a predefined variable whose value is the number of fields
+in the current record.  @command{awk} automatically updates the value
+of @code{NF} each time it reads a record.  No matter how many fields
+there are, the last field in a record can be represented by @code{$NF}.
+So, @code{$NF} is the same as @code{$7}, which is @samp{example.}.
+If you try to reference a field beyond the last
+one (such as @code{$8} when the record has only seven fields), you get
+the empty string.  (If used in a numeric operation, you get zero.)
+
+The use of @code{$0}, which looks like a reference to the ``zeroth'' field, is
+a special case: it represents the whole input record. Use it
+when you are not interested in specific fields.
+Here are some more examples:
+
+@example
+$ @kbd{awk '$1 ~ /li/ @{ print $0 @}' mail-list}
+@print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+@print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+@end example
+
+@noindent
+This example prints each record in the file @file{mail-list} whose first
+field contains the string @samp{li}.
+
+By contrast, the following example looks for @samp{li} in @emph{the
+entire record} and prints the first and last fields for each matching
+input record:
+
+@example
+$ @kbd{awk '/li/ @{ print $1, $NF @}' mail-list}
+@print{} Amelia F
+@print{} Broderick R
+@print{} Julie F
+@print{} Samuel A
+@end example
+
+@node Nonconstant Fields
+@section Nonconstant Field Numbers
+@cindex fields, numbers
+@cindex field numbers
+
+A field number need not be a constant.  Any expression in
+the @command{awk} language can be used after a @samp{$} to refer to a
+field.  The value of the expression specifies the field number.  If the
+value is a string, rather than a number, it is converted to a number.
+Consider this example:
+
+@example
+awk '@{ print $NR @}'
+@end example
+
+@noindent
+Recall that @code{NR} is the number of records read so far: one in the
+first record, two in the second, and so on.  So this example prints the first
+field of the first record, the second field of the second record, and so
+on.  For the twentieth record, field number 20 is printed; most likely,
+the record has fewer than 20 fields, so this prints a blank line.
+Here is another example of using expressions as field numbers:
+
+@example
+awk '@{ print $(2*2) @}' mail-list
+@end example
+
+@command{awk} evaluates the expression @samp{(2*2)} and uses
+its value as the number of the field to print.  The @samp{*}
+represents multiplication, so the expression @samp{2*2} evaluates to four.
+The parentheses are used so that the multiplication is done before the
+@samp{$} operation; they are necessary whenever there is a binary
+operator@footnote{A @dfn{binary operator}, such as @samp{*} for
+multiplication, is one that takes two operands. The distinction
+is required because @command{awk} also has unary (one-operand)
+and ternary (three-operand) operators.}
+in the field-number expression.  This example, then, prints the
+type of relationship (the fourth field) for every line of the file
+@file{mail-list}.  (All of the @command{awk} operators are listed, in
+order of decreasing precedence, in
+@ref{Precedence}.)
+
+If the field number you compute is zero, you get the entire record.
+Thus, @samp{$(2-2)} has the same value as @code{$0}.  Negative field
+numbers are not allowed; trying to reference one usually terminates
+the program.  (The POSIX standard does not define
+what happens when you reference a negative field number.  @command{gawk}
+notices this and terminates your program.  Other @command{awk}
+implementations may behave differently.)
+
+As mentioned in @ref{Fields},
+@command{awk} stores the current record's number of fields in the built-in
+variable @code{NF} (also @pxref{Built-in Variables}).  Thus, the expression
+@code{$NF} is not a special feature---it is the direct consequence of
+evaluating @code{NF} and using its value as a field number.
+
+@node Changing Fields
+@section Changing the Contents of a Field
+
+@cindex fields, changing contents of
+The contents of a field, as seen by @command{awk}, can be changed within an
+@command{awk} program; this changes what @command{awk} perceives as the
+current input record.  (The actual input is untouched; @command{awk} @emph{never}
+modifies the input file.)
+Consider the following example and its output:
+
+@example
+$ @kbd{awk '@{ nboxes = $3 ; $3 = $3 - 10}
+>        @kbd{print nboxes, $3 @}' inventory-shipped}
+@print{} 25 15
+@print{} 32 22
+@print{} 24 14
+@dots{}
+@end example
+
+@noindent
+The program first saves the original value of field three in the variable
+@code{nboxes}.
+The @samp{-} sign represents subtraction, so this program reassigns
+field three, @code{$3}, as the original value of field three minus ten:
+@samp{$3 - 10}.  (@xref{Arithmetic Ops}.)
+Then it prints the original and new values for field three.
+(Someone in the warehouse made a consistent mistake while inventorying
+the red boxes.)
+
+For this to work, the text in @code{$3} must make sense
+as a number; the string of characters must be converted to a number
+for the computer to do arithmetic on it.  The number resulting
+from the subtraction is converted back to a string of characters that
+then becomes field three.
+@xref{Conversion}.
+
+When the value of a field is changed (as perceived by @command{awk}), the
+text of the input record is recalculated to contain the new field where
+the old one was.  In other words, @code{$0} changes to reflect the altered
+field.  Thus, this program
+prints a copy of the input file, with 10 subtracted from the second
+field of each line:
+
+@example
+$ @kbd{awk '@{ $2 = $2 - 10; print $0 @}' inventory-shipped}
+@print{} Jan 3 25 15 115
+@print{} Feb 5 32 24 226
+@print{} Mar 5 24 34 228
+@dots{}
+@end example
+
+It is also possible to assign contents to fields that are out
+of range.  For example:
+
+@example
+$ @kbd{awk '@{ $6 = ($5 + $4 + $3 + $2)}
+> @kbd{       print $6 @}' inventory-shipped}
+@print{} 168
+@print{} 297
+@print{} 301
+@dots{}
+@end example
+
+@cindex adding, fields
+@cindex fields, adding
+@noindent
+We've just created @code{$6}, whose value is the sum of fields
+@code{$2}, @code{$3}, @code{$4}, and @code{$5}.  The @samp{+} sign
+represents addition.  For the file @file{inventory-shipped}, @code{$6}
+represents the total number of parcels shipped for a particular month.
+
+Creating a new field changes @command{awk}'s internal copy of the current
+input record, which is the value of @code{$0}.  Thus, if you do @samp{print $0}
+after adding a field, the record printed includes the new field, with
+the appropriate number of field separators between it and the previously
+existing fields.
+
+@cindex @code{OFS} variable
+@cindex output field separator, See @code{OFS} variable
+@cindex field separators, See Also @code{OFS}
+This recomputation affects and is affected by
+@code{NF} (the number of fields; @pxref{Fields}).
+For example, the value of @code{NF} is set to the number of the highest
+field you create.
+The exact format of @code{$0} is also affected by a feature that has not been discussed yet:
+the @dfn{output field separator}, @code{OFS},
+used to separate the fields (@pxref{Output Separators}).
+
+Note, however, that merely @emph{referencing} an out-of-range field
+does @emph{not} change the value of either @code{$0} or @code{NF}.
+Referencing an out-of-range field only produces an empty string.  For
+example:
+
+@example
+if ($(NF+1) != "")
+    print "can't happen"
+else
+    print "everything is normal"
+@end example
+
+@noindent
+should print @samp{everything is normal}, because @code{NF+1} is certain
+to be out of range.  (@xref{If Statement}
+for more information about @command{awk}'s @code{if-else} statements.
+@xref{Typing and Comparison}
+for more information about the @samp{!=} operator.)
+
+It is important to note that making an assignment to an existing field
+changes the
+value of @code{$0} but does not change the value of @code{NF},
+even when you assign the empty string to a field.  For example:
+
+@example
+$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""}
+>                       @kbd{print $0; print NF @}'}
+@print{} a::c:d
+@print{} 4
+@end example
+
+@noindent
+The field is still there; it just has an empty value, delimited by
+the two colons between @samp{a} and @samp{c}.
+This example shows what happens if you create a new field:
+
+@example
+$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""; $6 = "new"}
+>                       @kbd{print $0; print NF @}'}
+@print{} a::c:d::new
+@print{} 6
+@end example
+
+@noindent
+The intervening field, @code{$5}, is created with an empty value
+(indicated by the second pair of adjacent colons),
+and @code{NF} is updated with the value six.
+
+@cindex dark corner, @code{NF} variable, decrementing
+@cindex @code{NF} variable, decrementing
+Decrementing @code{NF} throws away the values of the fields
+after the new value of @code{NF} and recomputes @code{$0}.
+@value{DARKCORNER}
+Here is an example:
+
+@example
+$ @kbd{echo a b c d e f | awk '@{ print "NF =", NF;}
+> @kbd{                          NF = 3; print $0 @}'}
+@print{} NF = 6
+@print{} a b c
+@end example
+
+@cindex portability, @code{NF} variable@comma{} decrementing
+@quotation CAUTION
+Some versions of @command{awk} don't
+rebuild @code{$0} when @code{NF} is decremented.
+Until August, 2018, this included BWK @command{awk}; fortunately
+his version now handles this correctly.
+@end quotation
+
+Finally, there are times when it is convenient to force
+@command{awk} to rebuild the entire record, using the current
+values of the fields and @code{OFS}.  To do this, use the
+seemingly innocuous assignment:
+
+@example
+@group
+$1 = $1   # force record to be reconstituted
+print $0  # or whatever else with $0
+@end group
+@end example
+
+@noindent
+This forces @command{awk} to rebuild the record.  It does help
+to add a comment, as we've shown here.
+
+There is a flip side to the relationship between @code{$0} and
+the fields.  Any assignment to @code{$0} causes the record to be
+reparsed into fields using the @emph{current} value of @code{FS}.
+This also applies to any built-in function that updates @code{$0},
+such as @code{sub()} and @code{gsub()}
+(@pxref{String Functions}).
+
+@cindex sidebar, Understanding @code{$0}
+@ifdocbook
+@docbook
+<sidebar><title>Understanding @code{$0}</title>
+@end docbook
+
+
+It is important to remember that @code{$0} is the @emph{full}
+record, exactly as it was read from the input.  This includes
+any leading or trailing whitespace, and the exact whitespace (or other
+characters) that separates the fields.
+
+It is a common error to try to change the field separators
+in a record simply by setting @code{FS} and @code{OFS}, and then
+expecting a plain @samp{print} or @samp{print $0} to print the
+modified record.
+
+But this does not work, because nothing was done to change the record
+itself.  Instead, you must force the record to be rebuilt, typically
+with a statement such as @samp{$1 = $1}, as described earlier.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Understanding @code{$0}}
+
+
+
+It is important to remember that @code{$0} is the @emph{full}
+record, exactly as it was read from the input.  This includes
+any leading or trailing whitespace, and the exact whitespace (or other
+characters) that separates the fields.
+
+It is a common error to try to change the field separators
+in a record simply by setting @code{FS} and @code{OFS}, and then
+expecting a plain @samp{print} or @samp{print $0} to print the
+modified record.
+
+But this does not work, because nothing was done to change the record
+itself.  Instead, you must force the record to be rebuilt, typically
+with a statement such as @samp{$1 = $1}, as described earlier.
+@end cartouche
+@end ifnotdocbook
+
+
+@node Field Separators
+@section Specifying How Fields Are Separated
+
+@menu
+* Default Field Splitting::      How fields are normally separated.
+* Regexp Field Splitting::       Using regexps as the field separator.
+* Single Character Fields::      Making each character a separate field.
+* Command Line Field Separator:: Setting @code{FS} from the command line.
+* Full Line Fields::             Making the full line be a single field.
+* Field Splitting Summary::      Some final points and a summary table.
+@end menu
+
+@cindex @code{FS} variable
+@cindex fields, separating
+@cindex field separators
+@cindex fields, separating
+The @dfn{field separator}, which is either a single character or a regular
+expression, controls the way @command{awk} splits an input record into fields.
+@command{awk} scans the input record for character sequences that
+match the separator; the fields themselves are the text between the matches.
+
+In the examples that follow, we use the bullet symbol (@bullet{}) to
+represent spaces in the output.
+If the field separator is @samp{oo}, then the following line:
+
+@example
+moo goo gai pan
+@end example
+
+@noindent
+is split into three fields: @samp{m}, @samp{@bullet{}g}, and
+@samp{@bullet{}gai@bullet{}pan}.
+Note the leading spaces in the values of the second and third fields.
+
+@cindex troubleshooting, @command{awk} uses @code{FS} not @code{IFS}
+The field separator is represented by the predefined variable @code{FS}.
+Shell programmers take note:  @command{awk} does @emph{not} use the
+name @code{IFS} that is used by the POSIX-compliant shells (such as
+the Unix Bourne shell, @command{sh}, or Bash).
+
+@cindex @code{FS} variable, changing value of
+The value of @code{FS} can be changed in the @command{awk} program with the
+assignment operator, @samp{=} (@pxref{Assignment Ops}).
+Often, the right time to do this is at the beginning of execution
+before any input has been processed, so that the very first record
+is read with the proper separator.  To do this, use the special
+@code{BEGIN} pattern
+(@pxref{BEGIN/END}).
+For example, here we set the value of @code{FS} to the string
+@code{","}:
+
+@example
+awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}'
+@end example
+
+@cindex @code{BEGIN} pattern
+@noindent
+Given the input line:
+
+@example
+John Q. Smith, 29 Oak St., Walamazoo, MI 42139
+@end example
+
+@noindent
+this @command{awk} program extracts and prints the string
+@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
+
+@cindex field separators, choice of
+@cindex regular expressions, as field separators
+@cindex field separators, regular expressions as
+Sometimes the input data contains separator characters that don't
+separate fields the way you thought they would.  For instance, the
+person's name in the example we just used might have a title or
+suffix attached, such as:
+
+@example
+John Q. Smith, LXIX, 29 Oak St., Walamazoo, MI 42139
+@end example
+
+@noindent
+The same program would extract @samp{@bullet{}LXIX} instead of
+@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
+If you were expecting the program to print the
+address, you would be surprised.  The moral is to choose your data layout and
+separator characters carefully to prevent such problems.
+(If the data is not in a form that is easy to process, perhaps you
+can massage it first with a separate @command{awk} program.)
+
+
+@node Default Field Splitting
+@subsection Whitespace Normally Separates Fields
+
+@cindex field separators, whitespace as
+@cindex whitespace, as field separators
+Fields are normally separated by whitespace sequences
+(spaces, TABs, and newlines), not by single spaces.  Two spaces in a row do not
+delimit an empty field.  The default value of the field separator @code{FS}
+is a string containing a single space, @w{@code{" "}}.  If @command{awk}
+interpreted this value in the usual way, each space character would separate
+fields, so two spaces in a row would make an empty field between them.
+The reason this does not happen is that a single space as the value of
+@code{FS} is a special case---it is taken to specify the default manner
+of delimiting fields.
+
+If @code{FS} is any other single character, such as @code{","}, then
+each occurrence of that character separates two fields.  Two consecutive
+occurrences delimit an empty field.  If the character occurs at the
+beginning or the end of the line, that too delimits an empty field.  The
+space character is the only single character that does not follow these
+rules.
+
+@node Regexp Field Splitting
+@subsection Using Regular Expressions to Separate Fields
+
+@cindex regular expressions, as field separators
+@cindex field separators, regular expressions as
+The previous @value{SUBSECTION}
+discussed the use of single characters or simple strings as the
+value of @code{FS}.
+More generally, the value of @code{FS} may be a string containing any
+regular expression.  In this case, each match in the record for the regular
+expression separates fields.  For example, the assignment:
+
+@example
+FS = ", \t"
+@end example
+
+@noindent
+makes every area of an input line that consists of a comma followed by a
+space and a TAB into a field separator.
+@ifinfo
+(@samp{\t}
+is an @dfn{escape sequence} that stands for a TAB;
+@pxref{Escape Sequences},
+for the complete list of similar escape sequences.)
+@end ifinfo
+
+For a less trivial example of a regular expression, try using
+single spaces to separate fields the way single commas are used.
+@code{FS} can be set to @w{@code{"[@ ]"}} (left bracket, space, right
+bracket).  This regular expression matches a single space and nothing else
+(@pxref{Regexp}).
+
+There is an important difference between the two cases of @samp{FS = @w{" "}}
+(a single space) and @samp{FS = @w{"[ \t\n]+"}}
+(a regular expression matching one or more spaces, TABs, or newlines).
+For both values of @code{FS}, fields are separated by @dfn{runs}
+(multiple adjacent occurrences) of spaces, TABs,
+and/or newlines.  However, when the value of @code{FS} is @w{@code{" "}},
+@command{awk} first strips leading and trailing whitespace from
+the record and then decides where the fields are.
+For example, the following pipeline prints @samp{b}:
+
+@example
+$ @kbd{echo ' a b c d ' | awk '@{ print $2 @}'}
+@print{} b
+@end example
+
+@noindent
+However, this pipeline prints @samp{a} (note the extra spaces around
+each letter):
+
+@example
+$ @kbd{echo ' a  b  c  d ' | awk 'BEGIN @{ FS = "[ \t\n]+" @}}
+>                                  @kbd{@{ print $2 @}'}
+@print{} a
+@end example
+
+@noindent
+@cindex null strings
+@cindex strings, null
+@cindex empty strings, See null strings
+In this case, the first field is null, or empty.
+
+The stripping of leading and trailing whitespace also comes into
+play whenever @code{$0} is recomputed.  For instance, study this pipeline:
+
+@example
+$ @kbd{echo '   a b c d' | awk '@{ print; $2 = $2; print @}'}
+@print{}    a b c d
+@print{} a b c d
+@end example
+
+@noindent
+The first @code{print} statement prints the record as it was read,
+with leading whitespace intact.  The assignment to @code{$2} rebuilds
+@code{$0} by concatenating @code{$1} through @code{$NF} together,
+separated by the value of @code{OFS} (which is a space by default).
+Because the leading whitespace was ignored when finding @code{$1},
+it is not part of the new @code{$0}.  Finally, the last @code{print}
+statement prints the new @code{$0}.
+
+@cindex @code{FS}, containing @code{^}
+@cindex @code{^} (caret), in @code{FS}
+@cindex dark corner, @code{^}, in @code{FS}
+There is an additional subtlety to be aware of when using regular expressions
+for field splitting.
+It is not well specified in the POSIX standard, or anywhere else, what @samp{^}
+means when splitting fields.  Does the @samp{^}  match only at the beginning of
+the entire record? Or is each field separator a new string?  It turns out that
+different @command{awk} versions answer this question differently, and you
+should not rely on any specific behavior in your programs.
+@value{DARKCORNER}
+
+@cindex Brian Kernighan's @command{awk}
+As a point of information, BWK @command{awk} allows @samp{^}
+to match only at the beginning of the record. @command{gawk}
+also works this way. For example:
+
+@example
+$ @kbd{echo 'xxAA  xxBxx  C' |}
+> @kbd{gawk -F '(^x+)|( +)' '@{ for (i = 1; i <= NF; i++)}
+> @kbd{                            printf "-->%s<--\n", $i @}'}
+@print{} --><--
+@print{} -->AA<--
+@print{} -->xxBxx<--
+@print{} -->C<--
+@end example
+
+@node Single Character Fields
+@subsection Making Each Character a Separate Field
+
+@cindex common extensions, single character fields
+@cindex extensions, common@comma{} single character fields
+@cindex differences in @command{awk} and @command{gawk}, single-character fields
+@cindex single-character fields
+@cindex fields, single-character
+There are times when you may want to examine each character
+of a record separately.  This can be done in @command{gawk} by
+simply assigning the null string (@code{""}) to @code{FS}. @value{COMMONEXT}
+In this case,
+each individual character in the record becomes a separate field.
+For example:
+
+@example
+$ @kbd{echo a b | gawk 'BEGIN @{ FS = "" @}}
+>                  @kbd{@{}
+>                      @kbd{for (i = 1; i <= NF; i = i + 1)}
+>                          @kbd{print "Field", i, "is", $i}
+>                  @kbd{@}'}
+@print{} Field 1 is a
+@print{} Field 2 is
+@print{} Field 3 is b
+@end example
+
+@cindex dark corner, @code{FS} as null string
+@cindex @code{FS} variable, as null string
+Traditionally, the behavior of @code{FS} equal to @code{""} was not defined.
+In this case, most versions of Unix @command{awk} simply treat the entire record
+as only having one field.
+@value{DARKCORNER}
+In compatibility mode
+(@pxref{Options}),
+if @code{FS} is the null string, then @command{gawk} also
+behaves this way.
+
+@node Command Line Field Separator
+@subsection Setting @code{FS} from the Command Line
+@cindex @option{-F} option, command-line
+@cindex field separator, on command line
+@cindex command line, @code{FS} on@comma{} setting
+@cindex @code{FS} variable, setting from command line
+
+@code{FS} can be set on the command line.  Use the @option{-F} option to
+do so.  For example:
+
+@example
+awk -F, '@var{program}' @var{input-files}
+@end example
+
+@noindent
+sets @code{FS} to the @samp{,} character.  Notice that the option uses
+an uppercase @samp{F} instead of a lowercase @samp{f}. The latter
+option (@option{-f}) specifies a file containing an @command{awk} program.
+
+The value used for the argument to @option{-F} is processed in exactly the
+same way as assignments to the predefined variable @code{FS}.
+Any special characters in the field separator must be escaped
+appropriately.  For example, to use a @samp{\} as the field separator
+on the command line, you would have to type:
+
+@example
+# same as FS = "\\"
+awk -F\\\\ '@dots{}' files @dots{}
+@end example
+
+@noindent
+@cindex field separator, backslash (@code{\}) as
+@cindex @code{\} (backslash), as field separator
+@cindex backslash (@code{\}), as field separator
+Because @samp{\} is used for quoting in the shell, @command{awk} sees
+@samp{-F\\}.  Then @command{awk} processes the @samp{\\} for escape
+characters (@pxref{Escape Sequences}), finally yielding
+a single @samp{\} to use for the field separator.
+
+@c @cindex historical features
+As a special case, in compatibility mode
+(@pxref{Options}),
+if the argument to @option{-F} is @samp{t}, then @code{FS} is set to
+the TAB character.  If you type @samp{-F\t} at the
+shell, without any quotes, the @samp{\} gets deleted, so @command{awk}
+figures that you really want your fields to be separated with TABs and
+not @samp{t}s.  Use @samp{-v FS="t"} or @samp{-F"[t]"} on the command line
+if you really do want to separate your fields with @samp{t}s.
+Use @samp{-F '\t'} when not in compatibility mode to specify that TABs
+separate fields.
+
+As an example, let's use an @command{awk} program file called @file{edu.awk}
+that contains the pattern @code{/edu/} and the action @samp{print $1}:
+
+@example
+/edu/   @{ print $1 @}
+@end example
+
+Let's also set @code{FS} to be the @samp{-} character and run the
+program on the file @file{mail-list}.  The following command prints a
+list of the names of the people that work at or attend a university, and
+the first three digits of their phone numbers:
+
+@example
+$ @kbd{awk -F- -f edu.awk mail-list}
+@print{} Fabius       555
+@print{} Samuel       555
+@print{} Jean
+@end example
+
+@noindent
+Note the third line of output.  The third line
+in the original file looked like this:
+
+@example
+Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@end example
+
+The @samp{-} as part of the person's name was used as the field
+separator, instead of the @samp{-} in the phone number that was
+originally intended.  This demonstrates why you have to be careful in
+choosing your field and record separators.
+
+@cindex Unix @command{awk}, password files@comma{} field separators and
+Perhaps the most common use of a single character as the field separator
+occurs when processing the Unix system password file.  On many Unix
+systems, each user has a separate entry in the system password file, with one
+line per user.  The information in these lines is separated by colons.
+The first field is the user's login name and the second is the user's
+encrypted or shadow password.  (A shadow password is indicated by the
+presence of a single @samp{x} in the second field.)  A password file
+entry might look like this:
+
+@cindex Robbins, Arnold
+@example
+arnold:x:2076:10:Arnold Robbins:/home/arnold:/bin/bash
+@end example
+
+The following program searches the system password file and prints
+the entries for users whose full name is not indicated:
+
+@example
+awk -F: '$5 == ""' /etc/passwd
+@end example
+
+@node Full Line Fields
+@subsection Making the Full Line Be a Single Field
+
+Occasionally, it's useful to treat the whole input line as a
+single field.  This can be done easily and portably simply by
+setting @code{FS} to @code{"\n"} (a newline):@footnote{Thanks to
+Andrew Schorr for this tip.}
+
+@example
+awk -F'\n' '@var{program}' @var{files @dots{}}
+@end example
+
+@noindent
+When you do this, @code{$1} is the same as @code{$0}.
+
+@cindex sidebar, Changing @code{FS} Does Not Affect the Fields
+@ifdocbook
+@docbook
+<sidebar><title>Changing @code{FS} Does Not Affect the Fields</title>
+@end docbook
+
+
+@cindex POSIX @command{awk}, field separators and
+@cindex field separator, POSIX and
+According to the POSIX standard, @command{awk} is supposed to behave
+as if each record is split into fields at the time it is read.
+In particular, this means that if you change the value of @code{FS}
+after a record is read, the values of the fields (i.e., how they were split)
+should reflect the old value of @code{FS}, not the new one.
+
+@cindex dark corner, field separators
+@cindex @command{sed} utility
+@cindex stream editors
+However, many older implementations of @command{awk} do not work this way.  Instead,
+they defer splitting the fields until a field is actually
+referenced.  The fields are split
+using the @emph{current} value of @code{FS}!
+@value{DARKCORNER}
+This behavior can be difficult
+to diagnose. The following example illustrates the difference
+between the two methods:
+
+@example
+sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}'
+@end example
+
+@noindent
+which usually prints:
+
+@example
+root
+@end example
+
+@noindent
+on an incorrect implementation of @command{awk}, while @command{gawk}
+prints the full first line of the file, something like:
+
+@example
+root:x:0:0:Root:/:
+@end example
+
+(The @command{sed}@footnote{The @command{sed} utility is a ``stream editor.''
+Its behavior is also defined by the POSIX standard.}
+command prints just the first line of @file{/etc/passwd}.)
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Changing @code{FS} Does Not Affect the Fields}
+
+
+
+@cindex POSIX @command{awk}, field separators and
+@cindex field separator, POSIX and
+According to the POSIX standard, @command{awk} is supposed to behave
+as if each record is split into fields at the time it is read.
+In particular, this means that if you change the value of @code{FS}
+after a record is read, the values of the fields (i.e., how they were split)
+should reflect the old value of @code{FS}, not the new one.
+
+@cindex dark corner, field separators
+@cindex @command{sed} utility
+@cindex stream editors
+However, many older implementations of @command{awk} do not work this way.  Instead,
+they defer splitting the fields until a field is actually
+referenced.  The fields are split
+using the @emph{current} value of @code{FS}!
+@value{DARKCORNER}
+This behavior can be difficult
+to diagnose. The following example illustrates the difference
+between the two methods:
+
+@example
+sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}'
+@end example
+
+@noindent
+which usually prints:
+
+@example
+root
+@end example
+
+@noindent
+on an incorrect implementation of @command{awk}, while @command{gawk}
+prints the full first line of the file, something like:
+
+@example
+root:x:0:0:Root:/:
+@end example
+
+(The @command{sed}@footnote{The @command{sed} utility is a ``stream editor.''
+Its behavior is also defined by the POSIX standard.}
+command prints just the first line of @file{/etc/passwd}.)
+@end cartouche
+@end ifnotdocbook
+
+@node Field Splitting Summary
+@subsection Field-Splitting Summary
+
+It is important to remember that when you assign a string constant
+as the value of @code{FS}, it undergoes normal @command{awk} string
+processing.  For example, with Unix @command{awk} and @command{gawk},
+the assignment @samp{FS = "\.."} assigns the character string @code{".."}
+to @code{FS} (the backslash is stripped).  This creates a regexp meaning
+``fields are separated by occurrences of any two characters.''
+If instead you want fields to be separated by a literal period followed
+by any single character, use @samp{FS = "\\.."}.
+
+The following list summarizes how fields are split, based on the value
+of @code{FS} (@samp{==} means ``is equal to''):
+
+@table @code
+@item FS == " "
+Fields are separated by runs of whitespace.  Leading and trailing
+whitespace are ignored.  This is the default.
+
+@item FS == @var{any other single character}
+Fields are separated by each occurrence of the character.  Multiple
+successive occurrences delimit empty fields, as do leading and
+trailing occurrences.
+The character can even be a regexp metacharacter; it does not need
+to be escaped.
+
+@item FS == @var{regexp}
+Fields are separated by occurrences of characters that match @var{regexp}.
+Leading and trailing matches of @var{regexp} delimit empty fields.
+
+@item FS == ""
+Each individual character in the record becomes a separate field.
+(This is a common extension; it is not specified by the POSIX standard.)
+@end table
+
+@cindex sidebar, @code{FS} and @code{IGNORECASE}
+@ifdocbook
+@docbook
+<sidebar><title>@code{FS} and @code{IGNORECASE}</title>
+@end docbook
+
+
+The @code{IGNORECASE} variable
+(@pxref{User-modified})
+affects field splitting @emph{only} when the value of @code{FS} is a regexp.
+It has no effect when @code{FS} is a single character, even if
+that character is a letter.  Thus, in the following code:
+
+@example
+FS = "c"
+IGNORECASE = 1
+$0 = "aCa"
+print $1
+@end example
+
+@noindent
+The output is @samp{aCa}.  If you really want to split fields on an
+alphabetic character while ignoring case, use a regexp that will
+do it for you (e.g., @samp{FS = "[c]"}).  In this case, @code{IGNORECASE}
+will take effect.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{@code{FS} and @code{IGNORECASE}}
+
+
+
+The @code{IGNORECASE} variable
+(@pxref{User-modified})
+affects field splitting @emph{only} when the value of @code{FS} is a regexp.
+It has no effect when @code{FS} is a single character, even if
+that character is a letter.  Thus, in the following code:
+
+@example
+FS = "c"
+IGNORECASE = 1
+$0 = "aCa"
+print $1
+@end example
+
+@noindent
+The output is @samp{aCa}.  If you really want to split fields on an
+alphabetic character while ignoring case, use a regexp that will
+do it for you (e.g., @samp{FS = "[c]"}).  In this case, @code{IGNORECASE}
+will take effect.
+@end cartouche
+@end ifnotdocbook
+
+
+@node Constant Size
+@section Reading Fixed-Width Data
+
+@cindex data, fixed-width
+@cindex fixed-width data
+@cindex advanced features, fixed-width data
+
+@c O'Reilly doesn't like it as a note the first thing in the section.
+This @value{SECTION} discusses an advanced
+feature of @command{gawk}.  If you are a novice @command{awk} user,
+you might want to skip it on the first reading.
+
+@command{gawk} provides a facility for dealing with fixed-width fields
+with no distinctive field separator. We discuss this feature in
+the following @value{SUBSECTION}s.
+
+@menu
+* Fixed width data::            Processing fixed-width data.
+* Skipping intervening::        Skipping intervening fields.
+* Allowing trailing data::      Capturing optional trailing data.
+* Fields with fixed data::      Field values with fixed-width data.
+@end menu
+
+@node Fixed width data
+@subsection Processing Fixed-Width Data
+
+An example of fixed-width data would be the input for old Fortran programs
+where numbers are run together, or the output of programs that did not
+anticipate the use of their output as input for other programs.
+
+An example of the latter is a table where all the columns are lined up
+by the use of a variable number of spaces and @emph{empty fields are
+just spaces}.  Clearly, @command{awk}'s normal field splitting based
+on @code{FS} does not work well in this case.  Although a portable
+@command{awk} program can use a series of @code{substr()} calls on
+@code{$0} (@pxref{String Functions}), this is awkward and inefficient
+for a large number of fields.
+
+@cindex troubleshooting, fatal errors, field widths@comma{} specifying
+@cindex @command{w} utility
+@cindex @code{FIELDWIDTHS} variable
+@cindex @command{gawk}, @code{FIELDWIDTHS} variable in
+The splitting of an input record into fixed-width fields is specified by
+assigning a string containing space-separated numbers to the built-in
+variable @code{FIELDWIDTHS}.  Each number specifies the width of the
+field, @emph{including} columns between fields.  If you want to ignore
+the columns between fields, you can specify the width as a separate
+field that is subsequently ignored.  It is a fatal error to supply a
+field width that has a negative value.
+
+The following data is the output of the Unix @command{w} utility.  It is useful
+to illustrate the use of @code{FIELDWIDTHS}:
+
+@example
+@group
+ 10:06pm  up 21 days, 14:04,  23 users
+User     tty       login@  idle   JCPU   PCPU  what
+hzuo     ttyV0     8:58pm            9      5  vi p24.tex
+hzang    ttyV3     6:37pm    50                -csh
+eklye    ttyV5     9:53pm            7      1  em thes.tex
+dportein ttyV6     8:17pm  1:47                -csh
+gierd    ttyD3    10:00pm     1                elm
+dave     ttyD4     9:47pm            4      4  w
+brent    ttyp0    26Jun91  4:46  26:46   4:41  bash
+dave     ttyq4    26Jun9115days     46     46  wnewmail
+@end group
+@end example
+
+The following program takes this input, converts the idle time to
+number of seconds, and prints out the first two fields and the calculated
+idle time:
+
+@example
+BEGIN  @{ FIELDWIDTHS = "9 6 10 6 7 7 35" @}
+NR > 2 @{
+    idle = $4
+    sub(/^ +/, "", idle)   # strip leading spaces
+    if (idle == "")
+        idle = 0
+    if (idle ~ /:/) @{      # hh:mm
+        split(idle, t, ":")
+        idle = t[1] * 60 + t[2]
+    @}
+    if (idle ~ /days/)
+        idle *= 24 * 60 * 60
+
+    print $1, $2, idle
+@}
+@end example
+
+@quotation NOTE
+The preceding program uses a number of @command{awk} features that
+haven't been introduced yet.
+@end quotation
+
+Running the program on the data produces the following results:
+
+@example
+hzuo      ttyV0  0
+hzang     ttyV3  50
+eklye     ttyV5  0
+dportein  ttyV6  107
+gierd     ttyD3  1
+dave      ttyD4  0
+brent     ttyp0  286
+dave      ttyq4  1296000
+@end example
+
+Another (possibly more practical) example of fixed-width input data
+is the input from a deck of balloting cards.  In some parts of
+the United States, voters mark their choices by punching holes in computer
+cards.  These cards are then processed to count the votes for any particular
+candidate or on any particular issue.  Because a voter may choose not to
+vote on some issue, any column on the card may be empty.  An @command{awk}
+program for processing such data could use the @code{FIELDWIDTHS} feature
+to simplify reading the data.  (Of course, getting @command{gawk} to run on
+a system with card readers is another story!)
+
+@node Skipping intervening
+@subsection Skipping Intervening Fields
+
+Starting in @value{PVERSION} 4.2, each field width may optionally be
+preceded by a colon-separated value specifying the number of characters
+to skip before the field starts.  Thus, the preceding program could be
+rewritten to specify @code{FIELDWIDTHS} like so:
+
+@example
+BEGIN  @{ FIELDWIDTHS = "8 1:5 4:7 6 1:6 1:6 2:33" @}
+@end example
+
+This strips away some of the white space separating the fields. With such
+a change, the program produces the following results:
+
+@example
+hzang    ttyV3 50
+eklye    ttyV5 0
+dportein ttyV6 107
+gierd    ttyD3 1
+dave     ttyD4 0
+brent    ttyp0 286
+dave     ttyq4 1296000
+@end example
+
+@node Allowing trailing data
+@subsection Capturing Optional Trailing Data
+
+There are times when fixed-width data may be followed by additional data
+that has no fixed length.  Such data may or may not be present, but if
+it is, it should be possible to get at it from an @command{awk} program.
+
+Starting with @value{PVERSION} 4.2, in order to provide a way to say ``anything
+else in the record after the defined fields,'' @command{gawk}
+allows you to add a final @samp{*} character to the value of
+@code{FIELDWIDTHS}. There can only be one such character, and it must
+be the final non-whitespace character in @code{FIELDWIDTHS}.
+For example:
+
+@example
+$ @kbd{cat fw.awk}                         @ii{Show the program}
+@print{} BEGIN @{ FIELDWIDTHS = "2 2 *" @}
+@print{} @{ print NF, $1, $2, $3 @}
+$ @kbd{cat fw.in}                          @ii{Show sample input}
+@print{} 1234abcdefghi
+$ @kbd{gawk -f fw.awk fw.in}               @ii{Run the program}
+@print{} 3 12 34 abcdefghi
+@end example
+
+@node Fields with fixed data
+@subsection Field Values With Fixed-Width Data
+
+So far, so good.  But what happens if there isn't as much data as there
+should be based on the contents of @code{FIELDWIDTHS}? Or, what happens
+if there is more data than expected?
+
+For many years, what happens in these cases was not well defined. Starting
+with @value{PVERSION} 4.2, the rules are as follows:
+
+@table @asis
+@item Enough data for some fields
+For example, if @code{FIELDWIDTHS} is set to @code{"2 3 4"} and the
+input record is @samp{aabbb}.  In this case, @code{NF} is set to two.
+
+@item Not enough data for a field
+For example, if @code{FIELDWIDTHS} is set to @code{"2 3 4"} and the
+input record is @samp{aab}.  In this case, @code{NF} is set to two and
+@code{$2} has the value @code{"b"}. The idea is that even though there
+aren't as many characters as were expected, there are some, so the data
+should be made available to the program.
+
+@item Too much data
+For example, if @code{FIELDWIDTHS} is set to @code{"2 3 4"} and the
+input record is @samp{aabbbccccddd}.  In this case, @code{NF} is set to
+three and the extra characters (@samp{ddd}) are ignored.  If you want
+@command{gawk} to capture the extra characters, supply a final @samp{*}
+in the value of @code{FIELDWIDTHS}.
+
+@item Too much data, but with @samp{*} supplied
+For example, if @code{FIELDWIDTHS} is set to @code{"2 3 4 *"} and the
+input record is @samp{aabbbccccddd}.  In this case, @code{NF} is set to
+four, and @code{$4} has the value @code{"ddd"}.
+
+@end table
+
+@node Splitting By Content
+@section Defining Fields by Content
+
+@c O'Reilly doesn't like it as a note the first thing in the section.
+This @value{SECTION} discusses an advanced
+feature of @command{gawk}.  If you are a novice @command{awk} user,
+you might want to skip it on the first reading.
+
+@cindex advanced features, specifying field content
+Normally, when using @code{FS}, @command{gawk} defines the fields as the
+parts of the record that occur in between each field separator. In other
+words, @code{FS} defines what a field @emph{is not}, instead of what a field
+@emph{is}.
+However, there are times when you really want to define the fields by
+what they are, and not by what they are not.
+
+The most notorious such case
+is so-called @dfn{comma-separated values} (CSV) data. Many spreadsheet programs,
+for example, can export their data into text files, where each record is
+terminated with a newline, and fields are separated by commas. If
+commas only separated the data, there wouldn't be an issue. The problem comes when
+one of the fields contains an @emph{embedded} comma.
+In such cases, most programs embed the field in double quotes.@footnote{The
+CSV format lacked a formal standard definition for many years.
+@uref{http://www.ietf.org/rfc/rfc4180.txt, RFC 4180}
+standardizes the most common practices.}
+So, we might have data like this:
+
+@example
+@c file eg/misc/addresses.csv
+Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA
+@c endfile
+@end example
+
+@cindex @command{gawk}, @code{FPAT} variable in
+@cindex @code{FPAT} variable
+The @code{FPAT} variable offers a solution for cases like this.
+The value of @code{FPAT} should be a string that provides a regular expression.
+This regular expression describes the contents of each field.
+
+In the case of CSV data as presented here, each field is either ``anything that
+is not a comma,'' or ``a double quote, anything that is not a double quote, and a
+closing double quote.''  If written as a regular expression constant
+(@pxref{Regexp}),
+we would have @code{/([^,]+)|("[^"]+")/}.
+Writing this as a string requires us to escape the double quotes, leading to:
+
+@example
+FPAT = "([^,]+)|(\"[^\"]+\")"
+@end example
+
+Putting this to use, here is a simple program to parse the data:
+
+@example
+@c file eg/misc/simple-csv.awk
+@group
+BEGIN @{
+    FPAT = "([^,]+)|(\"[^\"]+\")"
+@}
+@end group
+
+@group
+@{
+    print "NF = ", NF
+    for (i = 1; i <= NF; i++) @{
+        printf("$%d = <%s>\n", i, $i)
+    @}
+@}
+@end group
+@c endfile
+@end example
+
+When run, we get the following:
+
+@example
+$ @kbd{gawk -f simple-csv.awk addresses.csv}
+NF =  7
+$1 = <Robbins>
+$2 = <Arnold>
+$3 = <"1234 A Pretty Street, NE">
+$4 = <MyTown>
+$5 = <MyState>
+$6 = <12345-6789>
+$7 = <USA>
+@end example
+
+Note the embedded comma in the value of @code{$3}.
+
+A straightforward improvement when processing CSV data of this sort
+would be to remove the quotes when they occur, with something like this:
+
+@example
+if (substr($i, 1, 1) == "\"") @{
+    len = length($i)
+    $i = substr($i, 2, len - 2)    # Get text within the two quotes
+@}
+@end example
+
+As with @code{FS}, the @code{IGNORECASE} variable (@pxref{User-modified})
+affects field splitting with @code{FPAT}.
+
+Assigning a value to @code{FPAT} overrides field splitting
+with @code{FS} and with @code{FIELDWIDTHS}.
+
+@quotation NOTE
+Some programs export CSV data that contains embedded newlines between
+the double quotes.  @command{gawk} provides no way to deal with this.
+Even though a formal specification for CSV data exists, there isn't much
+more to be done;
+the @code{FPAT} mechanism provides an elegant solution for the majority
+of cases, and the @command{gawk} developers are satisfied with that.
+@end quotation
+
+As written, the regexp used for @code{FPAT} requires that each field
+contain at least one character.  A straightforward modification
+(changing the first @samp{+} to @samp{*}) allows fields to be empty:
+
+@example
+FPAT = "([^,]*)|(\"[^\"]+\")"
+@end example
+
+@c FIXME: 4/2015
+@c Consider use of FPAT = "([^,]*)|(\"[^\"]*\")"
+@c (star in latter part of value) to allow quoted strings to be empty.
+@c Per email from Ed Morton <mortoneccc@comcast.net>
+
+Finally, the @code{patsplit()} function makes the same functionality
+available for splitting regular strings (@pxref{String Functions}).
+
+@node Testing field creation
+@section Checking How @command{gawk} Is Splitting Records
+
+@cindex @command{gawk}, splitting fields and
+As we've seen, @command{gawk} provides three independent methods to split
+input records into fields.  The mechanism used is based on which of the
+three variables---@code{FS}, @code{FIELDWIDTHS}, or @code{FPAT}---was
+last assigned to. In addition, an API input parser may choose to override
+the record parsing mechanism; please refer to @ref{Input Parsers} for
+further information about this feature.
+
+To restore normal field splitting after using @code{FIELDWIDTHS}
+and/or @code{FPAT}, simply assign a value to @code{FS}.
+You can use @samp{FS = FS} to do this,
+without having to know the current value of @code{FS}.
+
+In order to tell which kind of field splitting is in effect,
+use @code{PROCINFO["FS"]} (@pxref{Auto-set}).
+The value is @code{"FS"} if regular field splitting is being used,
+@code{"FIELDWIDTHS"} if fixed-width field splitting is being used,
+or @code{"FPAT"} if content-based field splitting is being used:
+
+@example
+if (PROCINFO["FS"] == "FS")
+    @var{regular field splitting} @dots{}
+else if (PROCINFO["FS"] == "FIELDWIDTHS")
+    @var{fixed-width field splitting} @dots{}
+else if (PROCINFO["FS"] == "FPAT")
+    @var{content-based field splitting} @dots{}
+else
+    @var{API input parser field splitting} @dots{} @ii{(advanced feature)}
+@end example
+
+This information is useful when writing a function that needs to
+temporarily change @code{FS} or @code{FIELDWIDTHS}, read some records,
+and then restore the original settings (@pxref{Passwd Functions} for an
+example of such a function).
+
+@node Multiple Line
+@section Multiple-Line Records
+
+@cindex multiple-line records
+@cindex records, multiline
+@cindex input, multiline records
+@cindex files, reading, multiline records
+@cindex input, files, See input files
+In some databases, a single line cannot conveniently hold all the
+information in one entry.  In such cases, you can use multiline
+records.  The first step in doing this is to choose your data format.
+
+@cindex record separators, with multiline records
+One technique is to use an unusual character or string to separate
+records.  For example, you could use the formfeed character (written
+@samp{\f} in @command{awk}, as in C) to separate them, making each record
+a page of the file.  To do this, just set the variable @code{RS} to
+@code{"\f"} (a string containing the formfeed character).  Any
+other character could equally well be used, as long as it won't be part
+of the data in a record.
+
+@cindex @code{RS} variable, multiline records and
+Another technique is to have blank lines separate records.  By a special
+dispensation, an empty string as the value of @code{RS} indicates that
+records are separated by one or more blank lines.  When @code{RS} is set
+to the empty string, each record always ends at the first blank line
+encountered.  The next record doesn't start until the first nonblank
+line that follows.  No matter how many blank lines appear in a row, they
+all act as one record separator.
+(Blank lines must be completely empty; lines that contain only
+whitespace do not count.)
+
+@cindex leftmost longest match
+@cindex matching, leftmost longest
+You can achieve the same effect as @samp{RS = ""} by assigning the
+string @code{"\n\n+"} to @code{RS}. This regexp matches the newline
+at the end of the record and one or more blank lines after the record.
+In addition, a regular expression always matches the longest possible
+sequence when there is a choice
+(@pxref{Leftmost Longest}).
+So, the next record doesn't start until
+the first nonblank line that follows---no matter how many blank lines
+appear in a row, they are considered one record separator.
+
+@cindex dark corner, multiline records
+However, there is an important difference between @samp{RS = ""} and
+@samp{RS = "\n\n+"}. In the first case, leading newlines in the input
+@value{DF} are ignored, and if a file ends without extra blank lines
+after the last record, the final newline is removed from the record.
+In the second case, this special processing is not done.
+@value{DARKCORNER}
+
+@cindex field separator, in multiline records
+@cindex @code{FS}, in multiline records
+Now that the input is separated into records, the second step is to
+separate the fields in the records.  One way to do this is to divide each
+of the lines into fields in the normal manner.  This happens by default
+as the result of a special feature.  When @code{RS} is set to the empty
+string @emph{and} @code{FS} is set to a single character,
+the newline character @emph{always} acts as a field separator.
+This is in addition to whatever field separations result from
+@code{FS}.
+
+@quotation NOTE
+When @code{FS} is the null string (@code{""})
+or a regexp, this special feature of @code{RS} does not apply.
+It does apply to the default field separator of a single space:
+@samp{FS = @w{" "}}.
+
+Note that language in the POSIX specification implies that
+this special feature should apply when @code{FS} is a regexp.
+However, Unix @command{awk} has never behaved that way, nor has
+@command{gawk}. This is essentially a bug in POSIX.
+@c Noted as of 4/2019; working to get the standard fixed.
+@end quotation
+
+The original motivation for this special exception was probably to provide
+useful behavior in the default case (i.e., @code{FS} is equal
+to @w{@code{" "}}).  This feature can be a problem if you really don't
+want the newline character to separate fields, because there is no way to
+prevent it.  However, you can work around this by using the @code{split()}
+function to break up the record manually
+(@pxref{String Functions}).
+If you have a single-character field separator, you can work around
+the special feature in a different way, by making @code{FS} into a
+regexp for that single character.  For example, if the field
+separator is a percent character, instead of
+@samp{FS = "%"}, use @samp{FS = "[%]"}.
+
+Another way to separate fields is to
+put each field on a separate line: to do this, just set the
+variable @code{FS} to the string @code{"\n"}.
+(This single-character separator matches a single newline.)
+A practical example of a @value{DF} organized this way might be a mailing
+list, where blank lines separate the entries.  Consider a mailing
+list in a file named @file{addresses}, which looks like this:
+
+@example
+Jane Doe
+123 Main Street
+Anywhere, SE 12345-6789
+
+John Smith
+456 Tree-lined Avenue
+Smallville, MW 98765-4321
+@dots{}
+@end example
+
+@noindent
+A simple program to process this file is as follows:
+
+@example
+# addrs.awk --- simple mailing list program
+
+# Records are separated by blank lines.
+# Each line is one field.
+BEGIN @{ RS = "" ; FS = "\n" @}
+
+@{
+      print "Name is:", $1
+      print "Address is:", $2
+      print "City and State are:", $3
+      print ""
+@}
+@end example
+
+Running the program produces the following output:
+
+@example
+$ @kbd{awk -f addrs.awk addresses}
+@print{} Name is: Jane Doe
+@print{} Address is: 123 Main Street
+@print{} City and State are: Anywhere, SE 12345-6789
+@print{}
+@print{} Name is: John Smith
+@print{} Address is: 456 Tree-lined Avenue
+@print{} City and State are: Smallville, MW 98765-4321
+@print{}
+@dots{}
+@end example
+
+@xref{Labels Program} for a more realistic program dealing with
+address lists.  The following list summarizes how records are split,
+based on the value of
+@ifinfo
+@code{RS}.
+(@samp{==} means ``is equal to.'')
+@end ifinfo
+@ifnotinfo
+@code{RS}:
+@end ifnotinfo
+
+@table @code
+@item RS == "\n"
+Records are separated by the newline character (@samp{\n}).  In effect,
+every line in the @value{DF} is a separate record, including blank lines.
+This is the default.
+
+@item RS == @var{any single character}
+Records are separated by each occurrence of the character.  Multiple
+successive occurrences delimit empty records.
+
+@item RS == ""
+Records are separated by runs of blank lines.
+When @code{FS} is a single character, then
+the newline character
+always serves as a field separator, in addition to whatever value
+@code{FS} may have. Leading and trailing newlines in a file are ignored.
+
+@item RS == @var{regexp}
+Records are separated by occurrences of characters that match @var{regexp}.
+Leading and trailing matches of @var{regexp} delimit empty records.
+(This is a @command{gawk} extension; it is not specified by the
+POSIX standard.)
+@end table
+
+@cindex @command{gawk}, @code{RT} variable in
+@cindex @code{RT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{RS}/@code{RT} variables
+If not in compatibility mode (@pxref{Options}), @command{gawk} sets
+@code{RT} to the input text that matched the value specified by @code{RS}.
+But if the input file ended without any text that matches @code{RS},
+then @command{gawk} sets @code{RT} to the null string.
+
+@node Getline
+@section Explicit Input with @code{getline}
+
+@cindex @code{getline} command, explicit input with
+@cindex input, explicit
+So far we have been getting our input data from @command{awk}'s main
+input stream---either the standard input (usually your keyboard, sometimes
+the output from another program) or the
+files specified on the command line.  The @command{awk} language has a
+special built-in command called @code{getline} that
+can be used to read input under your explicit control.
+
+The @code{getline} command is used in several different ways and should
+@emph{not} be used by beginners.
+The examples that follow the explanation of the @code{getline} command
+include material that has not been covered yet.  Therefore, come back
+and study the @code{getline} command @emph{after} you have reviewed the
+rest of
+@ifinfo
+this @value{DOCUMENT}
+@end ifinfo
+@ifhtml
+this @value{DOCUMENT}
+@end ifhtml
+@ifnotinfo
+@ifnothtml
+Parts I and II
+@end ifnothtml
+@end ifnotinfo
+and have a good knowledge of how @command{awk} works.
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable, with @command{getline} command
+@cindex differences in @command{awk} and @command{gawk}, @code{getline} command
+@cindex @code{getline} command, return values
+@cindex @option{--sandbox} option, input redirection with @code{getline}
+
+The @code{getline} command returns 1 if it finds a record and 0 if
+it encounters the end of the file.  If there is some error in getting
+a record, such as a file that cannot be opened, then @code{getline}
+returns @minus{}1.  In this case, @command{gawk} sets the variable
+@code{ERRNO} to a string describing the error that occurred.
+
+If @code{ERRNO} indicates that the I/O operation may be
+retried, and @code{PROCINFO["@var{input}", "RETRY"]} is set,
+then @code{getline} returns @minus{}2
+instead of @minus{}1, and further calls to @code{getline}
+may be attempted.  @xref{Retrying Input} for further information about
+this feature.
+
+In the following examples, @var{command} stands for a string value that
+represents a shell command.
+
+@quotation NOTE
+When @option{--sandbox} is specified (@pxref{Options}),
+reading lines from files, pipes, and coprocesses is disabled.
+@end quotation
+
+@menu
+* Plain Getline::               Using @code{getline} with no arguments.
+* Getline/Variable::            Using @code{getline} into a variable.
+* Getline/File::                Using @code{getline} from a file.
+* Getline/Variable/File::       Using @code{getline} into a variable from a
+                                file.
+* Getline/Pipe::                Using @code{getline} from a pipe.
+* Getline/Variable/Pipe::       Using @code{getline} into a variable from a
+                                pipe.
+* Getline/Coprocess::           Using @code{getline} from a coprocess.
+* Getline/Variable/Coprocess::  Using @code{getline} into a variable from a
+                                coprocess.
+* Getline Notes::               Important things to know about @code{getline}.
+* Getline Summary::             Summary of @code{getline} Variants.
+@end menu
+
+@node Plain Getline
+@subsection Using @code{getline} with No Arguments
+
+The @code{getline} command can be used without arguments to read input
+from the current input file.  All it does in this case is read the next
+input record and split it up into fields.  This is useful if you've
+finished processing the current record, but want to do some special
+processing on the next record @emph{right now}.  For example:
+
+@c 6/2019: Thanks to Mark Krauze <daburashka@ya.ru> for suggested
+@c improvements (the inner while loop).
+@example
+# Remove text between /* and */, inclusive
+@{
+    while ((start = index($0, "/*")) != 0) @{
+        out = substr($0, 1, start - 1)  # leading part of the string
+        rest = substr($0, start + 2)    # ... */ ...    
+        while ((end = index(rest, "*/")) == 0) @{  # is */ in trailing part?
+            # get more text
+            if (getline <= 0) @{
+                print("unexpected EOF or error:", ERRNO) > "/dev/stderr"
+                exit
+            @}
+            # build up the line using string concatenation
+            rest = rest $0
+        @}
+        rest = substr(rest, end + 2)  # remove comment
+        # build up the output line using string concatenation
+        $0 = out rest
+    @}
+    print $0
+@}
+@end example
+
+This @command{awk} program deletes C-style comments (@samp{/* @dots{}
+*/}) from the input.
+It uses a number of features we haven't covered yet, including
+string concatenation
+(@pxref{Concatenation})
+and the @code{index()} and @code{substr()} built-in
+functions
+(@pxref{String Functions}).
+By replacing the @samp{print $0} with other
+statements, you could perform more complicated processing on the
+decommented input, such as searching for matches of a regular
+expression.
+
+Here is some sample input:
+
+@example
+mon/*comment*/key
+rab/*commen
+t*/bit
+horse /*comment*/more text
+part 1 /*comment*/part 2 /*comment*/part 3
+no comment
+@end example
+
+When run, the output is:
+
+@example
+$ @kbd{awk -f strip_comments.awk example_text}
+@print{} monkey
+@print{} rabbit
+@print{} horse more text
+@print{} part 1 part 2 part 3
+@print{} no comment
+@end example
+
+This form of the @code{getline} command sets @code{NF},
+@code{NR}, @code{FNR}, @code{RT}, and the value of @code{$0}.
+
+@quotation NOTE
+The new value of @code{$0} is used to test
+the patterns of any subsequent rules.  The original value
+of @code{$0} that triggered the rule that executed @code{getline}
+is lost.
+By contrast, the @code{next} statement reads a new record
+but immediately begins processing it normally, starting with the first
+rule in the program.  @xref{Next Statement}.
+@end quotation
+
+@node Getline/Variable
+@subsection Using @code{getline} into a Variable
+@cindex @code{getline} into a variable
+@cindex variables, @code{getline} command into@comma{} using
+
+You can use @samp{getline @var{var}} to read the next record from
+@command{awk}'s input into the variable @var{var}.  No other processing is
+done.
+For example, suppose the next line is a comment or a special string,
+and you want to read it without triggering
+any rules.  This form of @code{getline} allows you to read that line
+and store it in a variable so that the main
+read-a-line-and-check-each-rule loop of @command{awk} never sees it.
+The following example swaps every two lines of input:
+
+@example
+@group
+@{
+     if ((getline tmp) > 0) @{
+          print tmp
+          print $0
+     @} else
+          print $0
+@}
+@end group
+@end example
+
+@noindent
+It takes the following list:
+
+@example
+wan
+tew
+free
+phore
+@end example
+
+@noindent
+and produces these results:
+
+@example
+tew
+wan
+phore
+free
+@end example
+
+The @code{getline} command used in this way sets only the variables
+@code{NR}, @code{FNR}, and @code{RT} (and, of course, @var{var}).
+The record is not
+split into fields, so the values of the fields (including @code{$0}) and
+the value of @code{NF} do not change.
+
+@node Getline/File
+@subsection Using @code{getline} from a File
+
+@cindex @code{getline} from a file
+@cindex input redirection
+@cindex redirection of input
+@cindex @code{<} (left angle bracket), @code{<} operator (I/O)
+@cindex left angle bracket (@code{<}), @code{<} operator (I/O)
+@cindex operators, input/output
+Use @samp{getline < @var{file}} to read the next record from @var{file}.
+Here, @var{file} is a string-valued expression that
+specifies the @value{FN}.  @samp{< @var{file}} is called a @dfn{redirection}
+because it directs input to come from a different place.
+For example, the following
+program reads its input record from the file @file{secondary.input} when it
+encounters a first field with a value equal to 10 in the current input
+file:
+
+@example
+@{
+    if ($1 == 10) @{
+         getline < "secondary.input"
+         print
+    @} else
+         print
+@}
+@end example
+
+Because the main input stream is not used, the values of @code{NR} and
+@code{FNR} are not changed. However, the record it reads is split into fields in
+the normal manner, so the values of @code{$0} and the other fields are
+changed, resulting in a new value of @code{NF}.
+@code{RT} is also set.
+
+@cindex POSIX @command{awk}, @code{<} operator and
+@c Thanks to Paul Eggert for initial wording here
+According to POSIX, @samp{getline < @var{expression}} is ambiguous if
+@var{expression} contains unparenthesized operators other than
+@samp{$}; for example, @samp{getline < dir "/" file} is ambiguous
+because the concatenation operator (not discussed yet; @pxref{Concatenation})
+is not parenthesized.  You should write it as @samp{getline < (dir "/" file)} if
+you want your program to be portable to all @command{awk} implementations.
+
+@node Getline/Variable/File
+@subsection Using @code{getline} into a Variable from a File
+@cindex variables, @code{getline} command into@comma{} using
+
+Use @samp{getline @var{var} < @var{file}} to read input
+from the file
+@var{file}, and put it in the variable @var{var}.  As earlier, @var{file}
+is a string-valued expression that specifies the file from which to read.
+
+In this version of @code{getline}, none of the predefined variables are
+changed and the record is not split into fields.  The only variable
+changed is @var{var}.@footnote{This is not quite true. @code{RT} could
+be changed if @code{RS} is a regular expression.}
+For example, the following program copies all the input files to the
+output, except for records that say @w{@samp{@@include @var{filename}}}.
+Such a record is replaced by the contents of the file
+@var{filename}:
+
+@example
+@{
+     if (NF == 2 && $1 == "@@include") @{
+          while ((getline line < $2) > 0)
+               print line
+          close($2)
+     @} else
+          print
+@}
+@end example
+
+Note here how the name of the extra input file is not built into
+the program; it is taken directly from the data, specifically from the second field on
+the @code{@@include} line.
+
+The @code{close()} function is called to ensure that if two identical
+@code{@@include} lines appear in the input, the entire specified file is
+included twice.
+@xref{Close Files And Pipes}.
+
+One deficiency of this program is that it does not process nested
+@code{@@include} statements
+(i.e., @code{@@include} statements in included files)
+the way a true macro preprocessor would.
+@xref{Igawk Program} for a program
+that does handle nested @code{@@include} statements.
+
+@node Getline/Pipe
+@subsection Using @code{getline} from a Pipe
+
+@c From private email, dated October 2, 1988. Used by permission, March 2013.
+@cindex Kernighan, Brian
+@quotation
+@i{Omniscience has much to recommend it.
+Failing that, attention to details would be useful.}
+@author Brian Kernighan
+@end quotation
+
+@cindex @code{|} (vertical bar), @code{|} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|} operator (I/O)
+@cindex input pipeline
+@cindex pipe, input
+@cindex operators, input/output
+The output of a command can also be piped into @code{getline}, using
+@samp{@var{command} | getline}.  In
+this case, the string @var{command} is run as a shell command and its output
+is piped into @command{awk} to be used as input.  This form of @code{getline}
+reads one record at a time from the pipe.
+For example, the following program copies its input to its output, except for
+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
+@group
+@{
+     if ($1 == "@@execute") @{
+          tmp = substr($0, 10)        # Remove "@@execute"
+          while ((tmp | getline) > 0)
+               print
+          close(tmp)
+     @} else
+          print
+@}
+@end group
+@end example
+
+@noindent
+The @code{close()} function is called to ensure that if two identical
+@samp{@@execute} lines appear in the input, the command is run for
+each one.
+@ifnottex
+@ifnotdocbook
+@xref{Close Files And Pipes}.
+@end ifnotdocbook
+@end ifnottex
+@c This example is unrealistic, since you could just use system
+Given the input:
+
+@example
+foo
+bar
+baz
+@@execute who
+bletch
+@end example
+
+@noindent
+the program might produce:
+
+@cindex Robbins, Bill
+@cindex Robbins, Miriam
+@cindex Robbins, Arnold
+@example
+foo
+bar
+baz
+arnold     ttyv0   Jul 13 14:22
+miriam     ttyp0   Jul 13 14:23     (murphy:0)
+bill       ttyp1   Jul 13 14:23     (murphy:0)
+bletch
+@end example
+
+@noindent
+Notice that this program ran the command @command{who} and printed the result.
+(If you try this program yourself, you will of course get different results,
+depending upon who is logged in on your system.)
+
+This variation of @code{getline} splits the record into fields, sets the
+value of @code{NF}, and recomputes the value of @code{$0}.  The values of
+@code{NR} and @code{FNR} are not changed.
+@code{RT} is set.
+
+@cindex POSIX @command{awk}, @code{|} I/O operator and
+@c Thanks to Paul Eggert for initial wording here
+According to POSIX, @samp{@var{expression} | getline} is ambiguous if
+@var{expression} contains unparenthesized operators other than
+@samp{$}---for example, @samp{@w{"echo "} "date" | getline} is ambiguous
+because the concatenation operator is not parenthesized.  You should
+write it as @samp{(@w{"echo "} "date") | getline} if you want your program
+to be portable to all @command{awk} implementations.
+
+@cindex Brian Kernighan's @command{awk}
+@cindex @command{mawk} utility
+@quotation NOTE
+Unfortunately, @command{gawk} has not been consistent in its treatment
+of a construct like @samp{@w{"echo "} "date" | getline}.
+Most versions, including the current version, treat it at as
+@samp{@w{("echo "} "date") | getline}.
+(This is also how BWK @command{awk} behaves.)
+Some versions instead treat it as
+@samp{@w{"echo "} ("date" | getline)}.
+(This is how @command{mawk} behaves.)
+In short, @emph{always} use explicit parentheses, and then you won't
+have to worry.
+@end quotation
+
+@node Getline/Variable/Pipe
+@subsection Using @code{getline} into a Variable from a Pipe
+@cindex variables, @code{getline} command into@comma{} using
+
+When you use @samp{@var{command} | getline @var{var}}, the
+output of @var{command} is sent through a pipe to
+@code{getline} and into the variable @var{var}.  For example, the
+following program reads the current date and time into the variable
+@code{current_time}, using the @command{date} utility, and then
+prints it:
+
+@example
+BEGIN @{
+     "date" | getline current_time
+     close("date")
+     print "Report printed on " current_time
+@}
+@end example
+
+In this version of @code{getline}, none of the predefined variables are
+changed and the record is not split into fields. However, @code{RT} is set.
+
+@ifinfo
+@c Thanks to Paul Eggert for initial wording here
+According to POSIX, @samp{@var{expression} | getline @var{var}} is ambiguous if
+@var{expression} contains unparenthesized operators other than
+@samp{$}; for example, @samp{@w{"echo "} "date" | getline @var{var}} is ambiguous
+because the concatenation operator is not parenthesized. You should
+write it as @samp{(@w{"echo "} "date") | getline @var{var}} if you want your
+program to be portable to other @command{awk} implementations.
+@end ifinfo
+
+@node Getline/Coprocess
+@subsection Using @code{getline} from a Coprocess
+@cindex coprocesses, @code{getline} from
+@cindex @code{getline} command, coprocesses@comma{} using from
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|&} operator (I/O)
+@cindex operators, input/output
+@cindex differences in @command{awk} and @command{gawk}, input/output operators
+
+Reading input into @code{getline} from a pipe is a one-way operation.
+The command that is started with @samp{@var{command} | getline} only
+sends data @emph{to} your @command{awk} program.
+
+On occasion, you might want to send data to another program
+for processing and then read the results back.
+@command{gawk} allows you to start a @dfn{coprocess}, with which two-way
+communications are possible.  This is done with the @samp{|&}
+operator.
+Typically, you write data to the coprocess first and then
+read the results back, as shown in the following:
+
+@example
+print "@var{some query}" |& "db_server"
+"db_server" |& getline
+@end example
+
+@noindent
+which sends a query to @command{db_server} and then reads the results.
+
+The values of @code{NR} and
+@code{FNR} are not changed,
+because the main input stream is not used.
+However, the record is split into fields in
+the normal manner, thus changing the values of @code{$0}, of the other fields,
+and of @code{NF} and @code{RT}.
+
+Coprocesses are an advanced feature. They are discussed here only because
+this is the @value{SECTION} on @code{getline}.
+@xref{Two-way I/O},
+where coprocesses are discussed in more detail.
+
+@node Getline/Variable/Coprocess
+@subsection Using @code{getline} into a Variable from a Coprocess
+@cindex variables, @code{getline} command into@comma{} using
+
+When you use @samp{@var{command} |& getline @var{var}}, the output from
+the coprocess @var{command} is sent through a two-way pipe to @code{getline}
+and into the variable @var{var}.
+
+In this version of @code{getline}, none of the predefined variables are
+changed and the record is not split into fields.  The only variable
+changed is @var{var}.
+However, @code{RT} is set.
+
+@ifinfo
+Coprocesses are an advanced feature. They are discussed here only because
+this is the @value{SECTION} on @code{getline}.
+@xref{Two-way I/O},
+where coprocesses are discussed in more detail.
+@end ifinfo
+
+@node Getline Notes
+@subsection Points to Remember About @code{getline}
+Here are some miscellaneous points about @code{getline} that
+you should bear in mind:
+
+@itemize @value{BULLET}
+@item
+When @code{getline} changes the value of @code{$0} and @code{NF},
+@command{awk} does @emph{not} automatically jump to the start of the
+program and start testing the new record against every pattern.
+However, the new record is tested against any subsequent rules.
+
+@cindex differences in @command{awk} and @command{gawk}, implementation limitations
+@cindex implementation issues, @command{gawk}, limits
+@cindex @command{awk}, implementations, limits
+@cindex @command{gawk}, implementation issues, limits
+@item
+Some very old @command{awk} implementations limit the number of pipelines that an @command{awk}
+program may have open to just one.  In @command{gawk}, there is no such limit.
+You can open as many pipelines (and coprocesses) as the underlying operating
+system permits.
+
+@cindex side effects, @code{FILENAME} variable
+@cindex @code{FILENAME} variable, @code{getline}@comma{} setting with
+@cindex dark corner, @code{FILENAME} variable
+@cindex @code{getline} command, @code{FILENAME} variable and
+@cindex @code{BEGIN} pattern, @code{getline} and
+@item
+An interesting side effect occurs if you use @code{getline} without a
+redirection inside a @code{BEGIN} rule. Because an unredirected @code{getline}
+reads from the command-line @value{DF}s, the first @code{getline} command
+causes @command{awk} to set the value of @code{FILENAME}. Normally,
+@code{FILENAME} does not have a value inside @code{BEGIN} rules, because you
+have not yet started to process the command-line @value{DF}s.
+@value{DARKCORNER}
+(See @ref{BEGIN/END};
+also @pxref{Auto-set}.)
+
+@item
+Using @code{FILENAME} with @code{getline}
+(@samp{getline < FILENAME})
+is likely to be a source of
+confusion.  @command{awk} opens a separate input stream from the
+current input file.  However, by not using a variable, @code{$0}
+and @code{NF} are still updated.  If you're doing this, it's
+probably by accident, and you should reconsider what it is you're
+trying to accomplish.
+
+@item
+@ifdocbook
+The next @value{SECTION}
+@end ifdocbook
+@ifnotdocbook
+@ref{Getline Summary},
+@end ifnotdocbook
+presents a table summarizing the
+@code{getline} variants and which variables they can affect.
+It is worth noting that those variants that do not use redirection
+can cause @code{FILENAME} to be updated if they cause
+@command{awk} to start reading a new input file.
+
+@item
+@cindex Moore, Duncan
+If the variable being assigned is an expression with side effects,
+different versions of @command{awk} behave differently upon encountering
+end-of-file.  Some versions don't evaluate the expression; many versions
+(including @command{gawk}) do.  Here is an example, courtesy of Duncan Moore:
+
+@ignore
+Date: Sun, 01 Apr 2012 11:49:33 +0100
+From: Duncan Moore <duncan.moore@@gmx.com>
+@end ignore
+
+@example
+BEGIN @{
+    system("echo 1 > f")
+    while ((getline a[++c] < "f") > 0) @{ @}
+    print c
+@}
+@end example
+
+@noindent
+Here, the side effect is the @samp{++c}.  Is @code{c} incremented if
+end-of-file is encountered before the element in @code{a} is assigned?
+
+@command{gawk} treats @code{getline} like a function call, and evaluates
+the expression @samp{a[++c]} before attempting to read from @file{f}.
+However, some versions of @command{awk} only evaluate the expression once they
+know that there is a string value to be assigned.
+@end itemize
+
+@node Getline Summary
+@subsection Summary of @code{getline} Variants
+@cindex @code{getline} command, variants
+
+@ref{table-getline-variants}
+summarizes the eight variants of @code{getline},
+listing which predefined variables are set by each one,
+and whether the variant is standard or a @command{gawk} extension.
+Note: for each variant, @command{gawk} sets the @code{RT} predefined variable.
+
+@float Table,table-getline-variants
+@caption{@code{getline} variants and what they set}
+@multitable @columnfractions .33 .38 .27
+@headitem Variant @tab Effect @tab @command{awk} / @command{gawk}
+@item @code{getline} @tab Sets @code{$0}, @code{NF}, @code{FNR}, @code{NR}, and @code{RT} @tab @command{awk}
+@item @code{getline} @var{var} @tab Sets @var{var}, @code{FNR}, @code{NR}, and @code{RT} @tab @command{awk}
+@item @code{getline <} @var{file} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab @command{awk}
+@item @code{getline @var{var} < @var{file}} @tab Sets @var{var} and @code{RT} @tab @command{awk}
+@item @var{command} @code{| getline} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab @command{awk}
+@item @var{command} @code{| getline} @var{var} @tab Sets @var{var} and @code{RT} @tab @command{awk}
+@item @var{command} @code{|& getline} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab @command{gawk}
+@item @var{command} @code{|& getline} @var{var} @tab Sets @var{var} and @code{RT} @tab @command{gawk}
+@end multitable
+@end float
+
+@node Read Timeout
+@section Reading Input with a Timeout
+@cindex timeout, reading input
+
+@cindex differences in @command{awk} and @command{gawk}, read timeouts
+This @value{SECTION} describes a feature that is specific to @command{gawk}.
+
+You may specify a timeout in milliseconds for reading input from the keyboard,
+a pipe, or two-way communication, including TCP/IP sockets. This can be done
+on a per-input, per-command, or per-connection basis, by setting a special
+element in the @code{PROCINFO} array (@pxref{Auto-set}):
+
+@example
+PROCINFO["input_name", "READ_TIMEOUT"] = @var{timeout in milliseconds}
+@end example
+
+When set, this causes @command{gawk} to time out and return failure
+if no data is available to read within the specified timeout period.
+For example, a TCP client can decide to give up on receiving
+any response from the server after a certain amount of time:
+
+@example
+@group
+Service = "/inet/tcp/0/localhost/daytime"
+PROCINFO[Service, "READ_TIMEOUT"] = 100
+if ((Service |& getline) > 0)
+    print $0
+else if (ERRNO != "")
+    print ERRNO
+@end group
+@end example
+
+Here is how to read interactively from the user@footnote{This assumes
+that standard input is the keyboard.} without waiting
+for more than five seconds:
+
+@example
+PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 5000
+while ((getline < "/dev/stdin") > 0)
+    print $0
+@end example
+
+@command{gawk} terminates the read operation if input does not
+arrive after waiting for the timeout period, returns failure,
+and sets @code{ERRNO} to an appropriate string value.
+A negative or zero value for the timeout is the same as specifying
+no timeout at all.
+
+A timeout can also be set for reading from the keyboard in the implicit
+loop that reads input records and matches them against patterns,
+like so:
+
+@example
+$ @kbd{gawk 'BEGIN @{ PROCINFO["-", "READ_TIMEOUT"] = 5000 @}}
+> @kbd{@{ print "You entered: " $0 @}'}
+@kbd{gawk}
+@print{} You entered: gawk
+@end example
+
+In this case, failure to respond within five seconds results in the following
+error message:
+
+@example
+@error{} gawk: cmd. line:2: (FILENAME=- FNR=1) fatal: error reading input file `-': Connection timed out
+@end example
+
+The timeout can be set or changed at any time, and will take effect on the
+next attempt to read from the input device. In the following example,
+we start with a timeout value of one second, and progressively
+reduce it by one-tenth of a second until we wait indefinitely
+for the input to arrive:
+
+@example
+PROCINFO[Service, "READ_TIMEOUT"] = 1000
+while ((Service |& getline) > 0) @{
+    print $0
+    PROCINFO[Service, "READ_TIMEOUT"] -= 100
+@}
+@end example
+
+@quotation NOTE
+You should not assume that the read operation will block
+exactly after the tenth record has been printed. It is possible that
+@command{gawk} will read and buffer more than one record's
+worth of data the first time. Because of this, changing the value
+of timeout like in the preceding example is not very useful.
+@end quotation
+
+If the @code{PROCINFO} element is not present and the
+@env{GAWK_READ_TIMEOUT} environment variable exists,
+@command{gawk} uses its value to initialize the timeout value.
+The exclusive use of the environment variable to specify timeout
+has the disadvantage of not being able to control it
+on a per-command or per-connection basis.
+
+@command{gawk} considers a timeout event to be an error even though
+the attempt to read from the underlying device may
+succeed in a later attempt. This is a limitation, and it also
+means that you cannot use this to multiplex input from
+two or more sources.  @xref{Retrying Input} for a way to enable 
+later I/O attempts to succeed.
+
+Assigning a timeout value prevents read operations from
+blocking indefinitely. But bear in mind that there are other ways
+@command{gawk} can stall waiting for an input device to be ready.
+A network client can sometimes take a long time to establish
+a connection before it can start reading any data,
+or the attempt to open a FIFO special file for reading can block
+indefinitely until some other process opens it for writing.
+
+@node Retrying Input
+@section Retrying Reads After Certain Input Errors
+@cindex retrying input
+
+@cindex differences in @command{awk} and @command{gawk}, retrying input
+This @value{SECTION} describes a feature that is specific to @command{gawk}.
+
+When @command{gawk} encounters an error while reading input, by
+default @code{getline} returns @minus{}1, and subsequent attempts to
+read from that file result in an end-of-file indication.  However, you
+may optionally instruct @command{gawk} to allow I/O to be retried when
+certain errors are encountered by setting a special element in
+the @code{PROCINFO} array (@pxref{Auto-set}):
+
+@example
+PROCINFO["@var{input_name}", "RETRY"] = 1
+@end example
+
+When this element exists, @command{gawk} checks the value of the system
+(C language)
+@code{errno} variable when an I/O error occurs.  If @code{errno} indicates
+a subsequent I/O attempt may succeed, @code{getline} instead returns
+@minus{}2 and
+further calls to @code{getline} may succeed.  This applies to the @code{errno}
+values @code{EAGAIN}, @code{EWOULDBLOCK}, @code{EINTR}, or @code{ETIMEDOUT}.
+
+This feature is useful in conjunction with
+@code{PROCINFO["@var{input_name}", "READ_TIMEOUT"]} or situations where a file
+descriptor has been configured to behave in a non-blocking fashion.
+
+@node Command-line directories
+@section Directories on the Command Line
+@cindex differences in @command{awk} and @command{gawk}, command-line directories
+@cindex directories, command-line
+@cindex command line, directories on
+
+According to the POSIX standard, files named on the @command{awk}
+command line must be text files; it is a fatal error if they are not.
+Most versions of @command{awk} treat a directory on the command line as
+a fatal error.
+
+By default, @command{gawk} produces a warning for a directory on the
+command line, but otherwise ignores it.  This makes it easier to use
+shell wildcards with your @command{awk} program:
+
+@example
+$ @kbd{gawk -f whizprog.awk *}        @ii{Directories could kill this program}
+@end example
+
+If either of the @option{--posix}
+or @option{--traditional} options is given, then @command{gawk} reverts
+to treating a directory on the command line as a fatal error.
+
+@xref{Extension Sample Readdir} for a way to treat directories
+as usable data from an @command{awk} program.
+
+@node Input Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Input is split into records based on the value of @code{RS}.
+The possibilities are as follows:
+
+@multitable @columnfractions .25 .35 .40
+@headitem Value of @code{RS} @tab Records are split on @dots{} @tab @command{awk} / @command{gawk}
+@item Any single character @tab That character @tab @command{awk}
+@item The empty string (@code{""}) @tab Runs of two or more newlines @tab @command{awk}
+@item A regexp @tab Text that matches the regexp @tab @command{gawk}
+@end multitable
+
+@item
+@code{FNR} indicates how many records have been read from the current input file;
+@code{NR} indicates how many records have been read in total.
+
+@item
+@command{gawk} sets @code{RT} to the text matched by @code{RS}.
+
+@item
+After splitting the input into records, @command{awk} further splits
+the records into individual fields, named @code{$1}, @code{$2}, and so
+on. @code{$0} is the whole record, and @code{NF} indicates how many
+fields there are.  The default way to split fields is between whitespace
+characters.
+
+@item
+Fields may be referenced using a variable, as in @code{$NF}.  Fields
+may also be assigned values, which causes the value of @code{$0} to be
+recomputed when it is later referenced. Assigning to a field with a number
+greater than @code{NF} creates the field and rebuilds the record, using
+@code{OFS} to separate the fields.  Incrementing @code{NF} does the same
+thing. Decrementing @code{NF} throws away fields and rebuilds the record.
+
+@item
+Field splitting is more complicated than record splitting:
+
+@multitable @columnfractions .40 .40 .20
+@headitem Field separator value @tab Fields are split @dots{} @tab @command{awk} / @command{gawk}
+@item @code{FS == " "} @tab On runs of whitespace @tab @command{awk}
+@item @code{FS == @var{any single character}} @tab On that character @tab @command{awk}
+@item @code{FS == @var{regexp}} @tab On text matching the regexp @tab @command{awk}
+@item @code{FS == ""}  @tab Such that each individual character is a separate field @tab @command{gawk}
+@item @code{FIELDWIDTHS == @var{list of columns}} @tab Based on character position @tab @command{gawk}
+@item @code{FPAT == @var{regexp}} @tab On the text surrounding text matching the regexp @tab @command{gawk}
+@end multitable
+
+@item
+Using @samp{FS = "\n"} causes the entire record to be a single field
+(assuming that newlines separate records).
+
+@item
+@code{FS} may be set from the command line using the @option{-F} option.
+This can also be done using command-line variable assignment.
+
+@item
+Use @code{PROCINFO["FS"]} to see how fields are being split.
+
+@item
+Use @code{getline} in its various forms to read additional records
+from the default input stream, from a file, or from a pipe or coprocess.
+
+@item
+Use @code{PROCINFO[@var{file}, "READ_TIMEOUT"]} to cause reads to time out
+for @var{file}.
+
+@item
+Directories on the command line are fatal for standard @command{awk};
+@command{gawk} ignores them if not in POSIX mode.
+
+@end itemize
+
+@c EXCLUDE START
+@node Input Exercises
+@section Exercises
+
+@enumerate
+@item
+Using the @code{FIELDWIDTHS} variable (@pxref{Constant Size}),
+write a program to read election data, where each record represents
+one voter's votes.  Come up with a way to define which columns are
+associated with each ballot item, and print the total votes,
+including abstentions, for each item.
+
+@item
+@ref{Plain Getline}, presented a program to remove C-style
+comments (@samp{/* @dots{} */}) from the input.  That program
+does not work if one comment ends on one line and another one
+starts later on the same line.
+That can be fixed by making one simple change. What is it?
+
+@end enumerate
+@c EXCLUDE END
+
+@node Printing
+@chapter Printing Output
+
+@cindex printing
+@cindex output, printing, See printing
+One of the most common programming actions is to @dfn{print}, or output,
+some or all of the input.  Use the @code{print} statement
+for simple output, and the @code{printf} statement
+for fancier formatting.
+The @code{print} statement is not limited when
+computing @emph{which} values to print. However, with two exceptions,
+you cannot specify @emph{how} to print them---how many
+columns, whether to use exponential notation or not, and so on.
+(For the exceptions, @pxref{Output Separators} and
+@ref{OFMT}.)
+For printing with specifications, you need the @code{printf} statement
+(@pxref{Printf}).
+
+@cindex @code{print} statement
+@cindex @code{printf} statement
+Besides basic and formatted printing, this @value{CHAPTER}
+also covers I/O redirections to files and pipes, introduces
+the special @value{FN}s that @command{gawk} processes internally,
+and discusses the @code{close()} built-in function.
+
+@menu
+* Print::                       The @code{print} statement.
+* Print Examples::              Simple examples of @code{print} statements.
+* Output Separators::           The output separators and how to change them.
+* OFMT::                        Controlling Numeric Output With @code{print}.
+* Printf::                      The @code{printf} statement.
+* Redirection::                 How to redirect output to multiple files and
+                                pipes.
+* Special FD::                  Special files for I/O.
+* Special Files::               File name interpretation in @command{gawk}.
+                                @command{gawk} allows access to inherited file
+                                descriptors.
+* Close Files And Pipes::       Closing Input and Output Files and Pipes.
+* Nonfatal::                    Enabling Nonfatal Output.
+* Output Summary::              Output summary.
+* Output Exercises::            Exercises.
+@end menu
+
+@node Print
+@section The @code{print} Statement
+
+Use the @code{print} statement to produce output with simple, standardized
+formatting.  You specify only the strings or numbers to print, in a
+list separated by commas.  They are output, separated by single spaces,
+followed by a newline.  The statement looks like this:
+
+@example
+print @var{item1}, @var{item2}, @dots{}
+@end example
+
+@noindent
+The entire list of items may be optionally enclosed in parentheses.  The
+parentheses are necessary if any of the item expressions uses the @samp{>}
+relational operator; otherwise it could be confused with an output redirection
+(@pxref{Redirection}).
+
+The items to print can be constant strings or numbers, fields of the
+current record (such as @code{$1}), variables, or any @command{awk}
+expression.  Numeric values are converted to strings and then printed.
+
+@cindex records, printing
+@cindex lines, blank, printing
+@cindex text, printing
+The simple statement @samp{print} with no items is equivalent to
+@samp{print $0}: it prints the entire current record.  To print a blank
+line, use @samp{print ""}.
+To print a fixed piece of text, use a string constant, such as
+@w{@code{"Don't Panic"}}, as one item.  If you forget to use the
+double-quote characters, your text is taken as an @command{awk}
+expression, and you will probably get an error.  Keep in mind that a
+space is printed between any two items.
+
+Note that the @code{print} statement is a statement and not an
+expression---you can't use it in the pattern part of a
+pattern--action statement, for example.
+
+@node Print Examples
+@section @code{print} Statement Examples
+
+Each @code{print} statement makes at least one line of output.  However, it
+isn't limited to only one line.  If an item value is a string containing a
+newline, the newline is output along with the rest of the string.  A
+single @code{print} statement can make any number of lines this way.
+
+@cindex newlines, printing
+The following is an example of printing a string that contains embedded
+@ifinfo
+newlines
+(the @samp{\n} is an escape sequence, used to represent the newline
+character; @pxref{Escape Sequences}):
+@end ifinfo
+@ifhtml
+newlines
+(the @samp{\n} is an escape sequence, used to represent the newline
+character; @pxref{Escape Sequences}):
+@end ifhtml
+@ifnotinfo
+@ifnothtml
+newlines:
+@end ifnothtml
+@end ifnotinfo
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{ print "line one\nline two\nline three" @}'}
+@print{} line one
+@print{} line two
+@print{} line three
+@end group
+@end example
+
+@cindex fields, printing
+The next example, which is run on the @file{inventory-shipped} file,
+prints the first two fields of each input record, with a space between
+them:
+
+@example
+$ @kbd{awk '@{ print $1, $2 @}' inventory-shipped}
+@print{} Jan 13
+@print{} Feb 15
+@print{} Mar 15
+@dots{}
+@end example
+
+@cindex @code{print} statement, commas, omitting
+@cindex troubleshooting, @code{print} statement@comma{} omitting commas
+A common mistake in using the @code{print} statement is to omit the comma
+between two items.  This often has the effect of making the items run
+together in the output, with no space.  The reason for this is that
+juxtaposing two string expressions in @command{awk} means to concatenate
+them.  Here is the same program, without the comma:
+
+@example
+$ @kbd{awk '@{ print $1 $2 @}' inventory-shipped}
+@print{} Jan13
+@print{} Feb15
+@print{} Mar15
+@dots{}
+@end example
+
+@cindex @code{BEGIN} pattern, headings@comma{} adding
+To someone unfamiliar with the @file{inventory-shipped} file, neither
+example's output makes much sense.  A heading line at the beginning
+would make it clearer.  Let's add some headings to our table of months
+(@code{$1}) and green crates shipped (@code{$2}).  We do this using
+a @code{BEGIN} rule (@pxref{BEGIN/END}) so that the headings are only
+printed once:
+
+@example
+awk 'BEGIN @{  print "Month Crates"
+              print "----- ------" @}
+           @{  print $1, $2 @}' inventory-shipped
+@end example
+
+@noindent
+When run, the program prints the following:
+
+@example
+Month Crates
+----- ------
+Jan 13
+Feb 15
+Mar 15
+@dots{}
+@end example
+
+@noindent
+The only problem, however, is that the headings and the table data
+don't line up!  We can fix this by printing some spaces between the
+two fields:
+
+@example
+@group
+awk 'BEGIN @{ print "Month Crates"
+             print "----- ------" @}
+           @{ print $1, "     ", $2 @}' inventory-shipped
+@end group
+@end example
+
+@cindex @code{printf} statement, columns@comma{} aligning
+@cindex columns, aligning
+Lining up columns this way can get pretty
+complicated when there are many columns to fix.  Counting spaces for two
+or three columns is simple, but any more than this can take up
+a lot of time. This is why the @code{printf} statement was
+created (@pxref{Printf});
+one of its specialties is lining up columns of data.
+
+@cindex line continuations, in @code{print} statement
+@cindex @code{print} statement, line continuations and
+@quotation NOTE
+You can continue either a @code{print} or
+@code{printf} statement simply by putting a newline after any comma
+(@pxref{Statements/Lines}).
+@end quotation
+
+@node Output Separators
+@section Output Separators
+
+@cindex @code{OFS} variable
+As mentioned previously, a @code{print} statement contains a list
+of items separated by commas.  In the output, the items are normally
+separated by single spaces.  However, this doesn't need to be the case;
+a single space is simply the default.  Any string of
+characters may be used as the @dfn{output field separator} by setting the
+predefined variable @code{OFS}.  The initial value of this variable
+is the string @w{@code{" "}} (i.e., a single space).
+
+The output from an entire @code{print} statement is called an @dfn{output
+record}.  Each @code{print} statement outputs one output record, and
+then outputs a string called the @dfn{output record separator} (or
+@code{ORS}).  The initial value of @code{ORS} is the string @code{"\n"}
+(i.e., a newline character).  Thus, each @code{print} statement normally
+makes a separate line.
+
+@cindex output, records
+@cindex output record separator, See @code{ORS} variable
+@cindex @code{ORS} variable
+@cindex @code{BEGIN} pattern, @code{OFS}/@code{ORS} variables, assigning values to
+In order to change how output fields and records are separated, assign
+new values to the variables @code{OFS} and @code{ORS}.  The usual
+place to do this is in the @code{BEGIN} rule
+(@pxref{BEGIN/END}), so
+that it happens before any input is processed.  It can also be done
+with assignments on the command line, before the names of the input
+files, or using the @option{-v} command-line option
+(@pxref{Options}).
+The following example prints the first and second fields of each input
+record, separated by a semicolon, with a blank line added after each
+newline:
+
+
+@example
+$ @kbd{awk 'BEGIN @{ OFS = ";"; ORS = "\n\n" @}}
+>            @kbd{@{ print $1, $2 @}' mail-list}
+@print{} Amelia;555-5553
+@print{}
+@print{} Anthony;555-3412
+@print{}
+@print{} Becky;555-7685
+@print{}
+@print{} Bill;555-1675
+@print{}
+@print{} Broderick;555-0542
+@print{}
+@print{} Camilla;555-2912
+@print{}
+@print{} Fabius;555-1234
+@print{}
+@print{} Julie;555-6699
+@print{}
+@print{} Martin;555-6480
+@print{}
+@print{} Samuel;555-3430
+@print{}
+@print{} Jean-Paul;555-2127
+@print{}
+@end example
+
+If the value of @code{ORS} does not contain a newline, the program's output
+runs together on a single line.
+
+@node OFMT
+@section Controlling Numeric Output with @code{print}
+@cindex numeric, output format
+@cindex formats@comma{} numeric output
+When printing numeric values with the @code{print} statement,
+@command{awk} internally converts each number to a string of characters
+and prints that string.  @command{awk} uses the @code{sprintf()} function
+to do this conversion
+(@pxref{String Functions}).
+For now, it suffices to say that the @code{sprintf()}
+function accepts a @dfn{format specification} that tells it how to format
+numbers (or strings), and that there are a number of different ways in which
+numbers can be formatted.  The different format specifications are discussed
+more fully in
+@ref{Control Letters}.
+
+@cindexawkfunc{sprintf}
+@cindex @code{OFMT} variable
+@cindex output, format specifier@comma{} @code{OFMT}
+The predefined variable @code{OFMT} contains the format specification
+that @code{print} uses with @code{sprintf()} when it wants to convert a
+number to a string for printing.
+The default value of @code{OFMT} is @code{"%.6g"}.
+The way @code{print} prints numbers can be changed
+by supplying a different format specification
+for the value of @code{OFMT}, as shown in the following example:
+
+@example
+$ @kbd{awk 'BEGIN @{}
+>   @kbd{OFMT = "%.0f"  # print numbers as integers (rounds)}
+>   @kbd{print 17.23, 17.54 @}'}
+@print{} 17 18
+@end example
+
+@noindent
+@cindex dark corner, @code{OFMT} variable
+@cindex POSIX @command{awk}, @code{OFMT} variable and
+@cindex @code{OFMT} variable, POSIX @command{awk} and
+According to the POSIX standard, @command{awk}'s behavior is undefined
+if @code{OFMT} contains anything but a floating-point conversion specification.
+@value{DARKCORNER}
+
+@node Printf
+@section Using @code{printf} Statements for Fancier Printing
+
+@cindex @code{printf} statement
+@cindex output, formatted
+@cindex formatting output
+For more precise control over the output format than what is
+provided by @code{print}, use @code{printf}.
+With @code{printf} you can
+specify the width to use for each item, as well as various
+formatting choices for numbers (such as what output base to use, whether to
+print an exponent, whether to print a sign, and how many digits to print
+after the decimal point).
+
+@menu
+* Basic Printf::                Syntax of the @code{printf} statement.
+* Control Letters::             Format-control letters.
+* Format Modifiers::            Format-specification modifiers.
+* Printf Examples::             Several examples.
+@end menu
+
+@node Basic Printf
+@subsection Introduction to the @code{printf} Statement
+
+@cindex @code{printf} statement, syntax of
+A simple @code{printf} statement looks like this:
+
+@example
+printf @var{format}, @var{item1}, @var{item2}, @dots{}
+@end example
+
+@noindent
+As for @code{print}, the entire list of arguments may optionally be
+enclosed in parentheses. Here too, the parentheses are necessary if any
+of the item expressions uses the @samp{>} relational operator; otherwise,
+it can be confused with an output redirection (@pxref{Redirection}).
+
+@cindex format specifiers
+The difference between @code{printf} and @code{print} is the @var{format}
+argument.  This is an expression whose value is taken as a string; it
+specifies how to output each of the other arguments.  It is called the
+@dfn{format string}.
+
+The format string is very similar to that in the ISO C library function
+@code{printf()}.  Most of @var{format} is text to output verbatim.
+Scattered among this text are @dfn{format specifiers}---one per item.
+Each format specifier says to output the next item in the argument list
+at that place in the format.
+
+The @code{printf} statement does not automatically append a newline
+to its output.  It outputs only what the format string specifies.
+So if a newline is needed, you must include one in the format string.
+The output separator variables @code{OFS} and @code{ORS} have no effect
+on @code{printf} statements. For example:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{}
+>    @kbd{ORS = "\nOUCH!\n"; OFS = "+"}
+>    @kbd{msg = "Don\47t Panic!"}
+>    @kbd{printf "%s\n", msg}
+> @kbd{@}'}
+@print{} Don't Panic!
+@end group
+@end example
+
+@noindent
+Here, neither the @samp{+} nor the @samp{OUCH!} appears in
+the output message.
+
+@node Control Letters
+@subsection Format-Control Letters
+@cindex @code{printf} statement, format-control characters
+@cindex format specifiers, @code{printf} statement
+
+A format specifier starts with the character @samp{%} and ends with
+a @dfn{format-control letter}---it tells the @code{printf} statement
+how to output one item.  The format-control letter specifies what @emph{kind}
+of value to print.  The rest of the format specifier is made up of
+optional @dfn{modifiers} that control @emph{how} to print the value, such as
+the field width.  Here is a list of the format-control letters:
+
+@c @asis for docbook to come out right
+@table @asis
+@item @code{%a}, @code{%A}
+A floating point number of the form
+[@code{-}]@code{0x@var{h}.@var{hhhh}p+-@var{dd}}
+(C99 hexadecimal floating point format).
+For @code{%A},
+uppercase letters are used instead of lowercase ones.
+
+@quotation NOTE
+The current POSIX standard requires support for @code{%a} and @code{%A} in
+@command{awk}. As far as we know, besides @command{gawk}, the only other
+version of @command{awk} that actually implements it is BWK @command{awk}.
+It's use is thus highly nonportable!
+
+Furthermore, these formats are not available on any system where the
+underlying C library @code{printf()} function does not support them. As
+of this writing, among current systems, only OpenVMS is known to not
+support them.
+@end quotation
+
+@item @code{%c}
+Print a number as a character; thus, @samp{printf "%c",
+65} outputs the letter @samp{A}. The output for a string value is
+the first character of the string.
+
+@cindex dark corner, format-control characters
+@cindex @command{gawk}, format-control characters
+@quotation NOTE
+The POSIX standard says the first character of a string is printed.
+In locales with multibyte characters, @command{gawk} attempts to
+convert the leading bytes of the string into a valid wide character
+and then to print the multibyte encoding of that character.
+Similarly, when printing a numeric value, @command{gawk} allows the
+value to be within the numeric range of values that can be held
+in a wide character.
+If the conversion to multibyte encoding fails, @command{gawk}
+uses the low eight bits of the value as the character to print.
+
+Other @command{awk} versions generally restrict themselves to printing
+the first byte of a string or to numeric values within the range of
+a single byte (0--255).
+@value{DARKCORNER}
+@end quotation
+
+
+@item @code{%d}, @code{%i}
+Print a decimal integer.
+The two control letters are equivalent.
+(The @samp{%i} specification is for compatibility with ISO C.)
+
+@item @code{%e}, @code{%E}
+Print a number in scientific (exponential) notation.
+For example:
+
+@example
+printf "%4.3e\n", 1950
+@end example
+
+@noindent
+prints @samp{1.950e+03}, with a total of four significant figures, three of
+which follow the decimal point.
+(The @samp{4.3} represents two modifiers,
+discussed in the next @value{SUBSECTION}.)
+@samp{%E} uses @samp{E} instead of @samp{e} in the output.
+
+@item @code{%f}
+Print a number in floating-point notation.
+For example:
+
+@example
+printf "%4.3f", 1950
+@end example
+
+@noindent
+prints @samp{1950.000}, with a minimum of four significant figures, three of
+which follow the decimal point.
+(The @samp{4.3} represents two modifiers,
+discussed in the next @value{SUBSECTION}.)
+
+On systems supporting IEEE 754 floating-point format, values
+representing negative
+infinity are formatted as
+@samp{-inf} or @samp{-infinity},
+and positive infinity as
+@samp{inf} or @samp{infinity}.
+The special ``not a number'' value formats as @samp{-nan} or @samp{nan}
+(@pxref{Math Definitions}).
+
+@item @code{%F}
+Like @samp{%f}, but the infinity and ``not a number'' values are spelled
+using uppercase letters.
+
+The @samp{%F} format is a POSIX extension to ISO C; not all systems
+support it.  On those that don't, @command{gawk} uses @samp{%f} instead.
+
+@item @code{%g}, @code{%G}
+Print a number in either scientific notation or in floating-point
+notation, whichever uses fewer characters; if the result is printed in
+scientific notation, @samp{%G} uses @samp{E} instead of @samp{e}.
+
+@item @code{%o}
+Print an unsigned octal integer
+(@pxref{Nondecimal-numbers}).
+
+@item @code{%s}
+Print a string.
+
+@item @code{%u}
+Print an unsigned decimal integer.
+(This format is of marginal use, because all numbers in @command{awk}
+are floating point; it is provided primarily for compatibility with C.)
+
+@item @code{%x}, @code{%X}
+Print an unsigned hexadecimal integer;
+@samp{%X} uses the letters @samp{A} through @samp{F}
+instead of @samp{a} through @samp{f}
+(@pxref{Nondecimal-numbers}).
+
+@item @code{%%}
+Print a single @samp{%}.
+This does not consume an
+argument and it ignores any modifiers.
+@end table
+
+@cindex dark corner, format-control characters
+@cindex @command{gawk}, format-control characters
+@quotation NOTE
+When using the integer format-control letters for values that are
+outside the range of the widest C integer type, @command{gawk} switches to
+the @samp{%g} format specifier. If @option{--lint} is provided on the
+command line (@pxref{Options}), @command{gawk}
+warns about this.  Other versions of @command{awk} may print invalid
+values or do something else entirely.
+@value{DARKCORNER}
+@end quotation
+
+@quotation NOTE
+The IEEE 754 standard for floating-point arithmetic allows for special
+values that represent ``infinity'' (positive and negative) and values
+that are ``not a number'' (NaN).
+
+Input and output of these values occurs as text strings. This is
+somewhat problematic for the @command{awk} language, which predates
+the IEEE standard.  Further details are provided in
+@ref{POSIX Floating Point Problems}; please see there.
+@end quotation
+
+@node Format Modifiers
+@subsection Modifiers for @code{printf} Formats
+
+@cindex @code{printf} statement, modifiers
+@cindex modifiers@comma{} in format specifiers
+A format specification can also include @dfn{modifiers} that can control
+how much of the item's value is printed, as well as how much space it gets.
+The modifiers come between the @samp{%} and the format-control letter.
+We use the bullet symbol ``@bullet{}'' in the following examples to
+represent
+spaces in the output. Here are the possible modifiers, in the order in
+which they may appear:
+
+@table @asis
+@cindex differences in @command{awk} and @command{gawk}, @code{print}/@code{printf} statements
+@cindex @code{printf} statement, positional specifiers
+@c the code{} does NOT start a secondary
+@cindex positional specifiers, @code{printf} statement
+@item @code{@var{N}$}
+An integer constant followed by a @samp{$} is a @dfn{positional specifier}.
+Normally, format specifications are applied to arguments in the order
+given in the format string.  With a positional specifier, the format
+specification is applied to a specific argument, instead of what
+would be the next argument in the list.  Positional specifiers begin
+counting with one. Thus:
+
+@example
+printf "%s %s\n", "don't", "panic"
+printf "%2$s %1$s\n", "panic", "don't"
+@end example
+
+@noindent
+prints the famous friendly message twice.
+
+At first glance, this feature doesn't seem to be of much use.
+It is in fact a @command{gawk} extension, intended for use in translating
+messages at runtime.
+@xref{Printf Ordering},
+which describes how and why to use positional specifiers.
+For now, we ignore them.
+
+@item @code{-} (Minus)
+The minus sign, used before the width modifier (see later on in
+this list),
+says to left-justify
+the argument within its specified width.  Normally, the argument
+is printed right-justified in the specified width.  Thus:
+
+@example
+printf "%-4s", "foo"
+@end example
+
+@noindent
+prints @samp{foo@bullet{}}.
+
+@item @var{space}
+For numeric conversions, prefix positive values with a space and
+negative values with a minus sign.
+
+@item @code{+}
+The plus sign, used before the width modifier (see later on in
+this list),
+says to always supply a sign for numeric conversions, even if the data
+to format is positive. The @samp{+} overrides the space modifier.
+
+@item @code{#}
+Use an ``alternative form'' for certain control letters.
+For @samp{%o}, supply a leading zero.
+For @samp{%x} and @samp{%X}, supply a leading @samp{0x} or @samp{0X} for
+a nonzero result.
+For @samp{%e}, @samp{%E}, @samp{%f}, and @samp{%F}, the result always
+contains a decimal point.
+For @samp{%g} and @samp{%G}, trailing zeros are not removed from the result.
+
+@item @code{0}
+A leading @samp{0} (zero) acts as a flag indicating that output should be
+padded with zeros instead of spaces.
+This applies only to the numeric output formats.
+This flag only has an effect when the field width is wider than the
+value to print.
+
+@item @code{'}
+A single quote or apostrophe character is a POSIX extension to ISO C.
+It indicates that the integer part of a floating-point value, or the
+entire part of an integer decimal value, should have a thousands-separator
+character in it.  This only works in locales that support such characters.
+For example:
+
+@example
+$ @kbd{cat thousands.awk}          @ii{Show source program}
+@print{} BEGIN @{ printf "%'d\n", 1234567 @}
+$ @kbd{LC_ALL=C gawk -f thousands.awk}
+@print{} 1234567                   @ii{Results in} "C" @ii{locale}
+$ @kbd{LC_ALL=en_US.UTF-8 gawk -f thousands.awk}
+@print{} 1,234,567                 @ii{Results in US English UTF locale}
+@end example
+
+@noindent
+For more information about locales and internationalization issues,
+see @ref{Locales}.
+
+@quotation NOTE
+The @samp{'} flag is a nice feature, but its use complicates things: it
+becomes difficult to use it in command-line programs.  For information
+on appropriate quoting tricks, see @ref{Quoting}.
+@end quotation
+
+@item @var{width}
+This is a number specifying the desired minimum width of a field.  Inserting any
+number between the @samp{%} sign and the format-control character forces the
+field to expand to this width.  The default way to do this is to
+pad with spaces on the left.  For example:
+
+@example
+printf "%4s", "foo"
+@end example
+
+@noindent
+prints @samp{@bullet{}foo}.
+
+The value of @var{width} is a minimum width, not a maximum.  If the item
+value requires more than @var{width} characters, it can be as wide as
+necessary.  Thus, the following:
+
+@example
+printf "%4s", "foobar"
+@end example
+
+@noindent
+prints @samp{foobar}.
+
+Preceding the @var{width} with a minus sign causes the output to be
+padded with spaces on the right, instead of on the left.
+
+@item @code{.@var{prec}}
+A period followed by an integer constant
+specifies the precision to use when printing.
+The meaning of the precision varies by control letter:
+
+@table @asis
+@item @code{%d}, @code{%i}, @code{%o}, @code{%u}, @code{%x}, @code{%X}
+Minimum number of digits to print.
+
+@item @code{%e}, @code{%E}, @code{%f}, @code{%F}
+Number of digits to the right of the decimal point.
+
+@item @code{%g}, @code{%G}
+Maximum number of significant digits.
+
+@item @code{%s}
+Maximum number of characters from the string that should print.
+@end table
+
+Thus, the following:
+
+@example
+printf "%.4s", "foobar"
+@end example
+
+@noindent
+prints @samp{foob}.
+@end table
+
+The C library @code{printf}'s dynamic @var{width} and @var{prec}
+capability (e.g., @code{"%*.*s"}) is supported.  Instead of
+supplying explicit @var{width} and/or @var{prec} values in the format
+string, they are passed in the argument list.  For example:
+
+@example
+w = 5
+p = 3
+s = "abcdefg"
+printf "%*.*s\n", w, p, s
+@end example
+
+@noindent
+is exactly equivalent to:
+
+@example
+s = "abcdefg"
+printf "%5.3s\n", s
+@end example
+
+@noindent
+Both programs output @samp{@w{@bullet{}@bullet{}abc}}.
+Earlier versions of @command{awk} did not support this capability.
+If you must use such a version, you may simulate this feature by using
+concatenation to build up the format string, like so:
+
+@example
+w = 5
+p = 3
+s = "abcdefg"
+printf "%" w "." p "s\n", s
+@end example
+
+@noindent
+This is not particularly easy to read, but it does work.
+
+@c @cindex lint checks
+@cindex troubleshooting, fatal errors, @code{printf} format strings
+@cindex POSIX @command{awk}, @code{printf} format strings and
+C programmers may be used to supplying additional modifiers (@samp{h},
+@samp{j}, @samp{l}, @samp{L}, @samp{t}, and @samp{z}) in @code{printf}
+format strings. These are not valid in @command{awk}.  Most @command{awk}
+implementations silently ignore them.  If @option{--lint} is provided
+on the command line (@pxref{Options}), @command{gawk} warns about their
+use. If @option{--posix} is supplied, their use is a fatal error.
+
+@node Printf Examples
+@subsection Examples Using @code{printf}
+
+The following simple example shows
+how to use @code{printf} to make an aligned table:
+
+@example
+awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list
+@end example
+
+@noindent
+This command
+prints the names of the people (@code{$1}) in the file
+@file{mail-list} as a string of 10 characters that are left-justified.  It also
+prints the phone numbers (@code{$2}) next on the line.  This
+produces an aligned two-column table of names and phone numbers,
+as shown here:
+
+@example
+$ @kbd{awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list}
+@print{} Amelia     555-5553
+@print{} Anthony    555-3412
+@print{} Becky      555-7685
+@print{} Bill       555-1675
+@print{} Broderick  555-0542
+@print{} Camilla    555-2912
+@print{} Fabius     555-1234
+@print{} Julie      555-6699
+@print{} Martin     555-6480
+@print{} Samuel     555-3430
+@print{} Jean-Paul  555-2127
+@end example
+
+In this case, the phone numbers had to be printed as strings because
+the numbers are separated by dashes.  Printing the phone numbers as
+numbers would have produced just the first three digits: @samp{555}.
+This would have been pretty confusing.
+
+It wasn't necessary to specify a width for the phone numbers because
+they are last on their lines.  They don't need to have spaces
+after them.
+
+The table could be made to look even nicer by adding headings to the
+tops of the columns.  This is done using a @code{BEGIN} rule
+(@pxref{BEGIN/END})
+so that the headers are only printed once, at the beginning of
+the @command{awk} program:
+
+@example
+awk 'BEGIN @{ print "Name      Number"
+             print "----      ------" @}
+           @{ printf "%-10s %s\n", $1, $2 @}' mail-list
+@end example
+
+The preceding example mixes @code{print} and @code{printf} statements in
+the same program.  Using just @code{printf} statements can produce the
+same results:
+
+@example
+awk 'BEGIN @{ printf "%-10s %s\n", "Name", "Number"
+             printf "%-10s %s\n", "----", "------" @}
+           @{ printf "%-10s %s\n", $1, $2 @}' mail-list
+@end example
+
+@noindent
+Printing each column heading with the same format specification
+used for the column elements ensures that the headings
+are aligned just like the columns.
+
+The fact that the same format specification is used three times can be
+emphasized by storing it in a variable, like this:
+
+@example
+awk 'BEGIN @{ format = "%-10s %s\n"
+             printf format, "Name", "Number"
+             printf format, "----", "------" @}
+           @{ printf format, $1, $2 @}' mail-list
+@end example
+
+
+@node Redirection
+@section Redirecting Output of @code{print} and @code{printf}
+
+@cindex output redirection
+@cindex redirection of output
+@cindex @option{--sandbox} option, output redirection with @code{print}, @code{printf}
+So far, the output from @code{print} and @code{printf} has gone
+to the standard
+output, usually the screen.  Both @code{print} and @code{printf} can
+also send their output to other places.
+This is called @dfn{redirection}.
+
+@quotation NOTE
+When @option{--sandbox} is specified (@pxref{Options}),
+redirecting output to files, pipes, and coprocesses is disabled.
+@end quotation
+
+A redirection appears after the @code{print} or @code{printf} statement.
+Redirections in @command{awk} are written just like redirections in shell
+commands, except that they are written inside the @command{awk} program.
+
+@c the commas here are part of the see also
+@cindex @code{print} statement, See Also redirection@comma{} of output
+@cindex @code{printf} statement, See Also redirection@comma{} of output
+There are four forms of output redirection: output to a file, output
+appended to a file, output through a pipe to another command, and output
+to a coprocess.  We show them all for the @code{print} statement,
+but they work identically for @code{printf}:
+
+@table @code
+@cindex @code{>} (right angle bracket), @code{>} operator (I/O)
+@cindex right angle bracket (@code{>}), @code{>} operator (I/O)
+@cindex operators, input/output
+@item print @var{items} > @var{output-file}
+This redirection prints the items into the output file named
+@var{output-file}.  The @value{FN} @var{output-file} can be any
+expression.  Its value is changed to a string and then used as a
+@value{FN} (@pxref{Expressions}).
+
+When this type of redirection is used, the @var{output-file} is erased
+before the first output is written to it.  Subsequent writes to the same
+@var{output-file} do not erase @var{output-file}, but append to it.
+(This is different from how you use redirections in shell scripts.)
+If @var{output-file} does not exist, it is created.  For example, here
+is how an @command{awk} program can write a list of peoples' names to one
+file named @file{name-list}, and a list of phone numbers to another file
+named @file{phone-list}:
+
+@example
+$ @kbd{awk '@{ print $2 > "phone-list"}
+>        @kbd{print $1 > "name-list" @}' mail-list}
+$ @kbd{cat phone-list}
+@print{} 555-5553
+@print{} 555-3412
+@dots{}
+$ @kbd{cat name-list}
+@print{} Amelia
+@print{} Anthony
+@dots{}
+@end example
+
+@noindent
+Each output file contains one name or number per line.
+
+@cindex @code{>} (right angle bracket), @code{>>} operator (I/O)
+@cindex right angle bracket (@code{>}), @code{>>} operator (I/O)
+@item print @var{items} >> @var{output-file}
+This redirection prints the items into the preexisting output file
+named @var{output-file}.  The difference between this and the
+single-@samp{>} redirection is that the old contents (if any) of
+@var{output-file} are not erased.  Instead, the @command{awk} output is
+appended to the file.
+If @var{output-file} does not exist, then it is created.
+
+@cindex @code{|} (vertical bar), @code{|} operator (I/O)
+@cindex pipe, output
+@cindex output, pipes
+@item print @var{items} | @var{command}
+It is possible to send output to another program through a pipe
+instead of into a file.   This redirection opens a pipe to
+@var{command}, and writes the values of @var{items} through this pipe
+to another process created to execute @var{command}.
+
+The redirection argument @var{command} is actually an @command{awk}
+expression.  Its value is converted to a string whose contents give
+the shell command to be run.  For example, the following produces two
+files, one unsorted list of peoples' names, and one list sorted in reverse
+alphabetical order:
+
+@ignore
+10/2000:
+This isn't the best style, since COMMAND is assigned for each
+record.  It's done to avoid overfull hboxes in TeX.  Leave it
+alone for now and let's hope no-one notices.
+@end ignore
+
+@example
+@group
+awk '@{ print $1 > "names.unsorted"
+       command = "sort -r > names.sorted"
+       print $1 | command @}' mail-list
+@end group
+@end example
+
+The unsorted list is written with an ordinary redirection, while
+the sorted list is written by piping through the @command{sort} utility.
+
+The next example uses redirection to mail a message to the mailing
+list @code{bug-system}.  This might be useful when trouble is encountered
+in an @command{awk} script run periodically for system maintenance:
+
+@example
+report = "mail bug-system"
+print("Awk script failed:", $0) | report
+print("at record number", FNR, "of", FILENAME) | report
+close(report)
+@end example
+
+The @code{close()} function is called here because it's a good idea to close
+the pipe as soon as all the intended output has been sent to it.
+@xref{Close Files And Pipes}
+for more information.
+
+This example also illustrates the use of a variable to represent
+a @var{file} or @var{command}---it is not necessary to always
+use a string constant.  Using a variable is generally a good idea,
+because (if you mean to refer to that same file or command)
+@command{awk} requires that the string value be written identically
+every time.
+
+@cindex coprocesses
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O)
+@cindex operators, input/output
+@cindex differences in @command{awk} and @command{gawk}, input/output operators
+@item print @var{items} |& @var{command}
+This redirection prints the items to the input of @var{command}.
+The difference between this and the
+single-@samp{|} redirection is that the output from @var{command}
+can be read with @code{getline}.
+Thus, @var{command} is a @dfn{coprocess}, which works together with
+but is subsidiary to the @command{awk} program.
+
+This feature is a @command{gawk} extension, and is not available in
+POSIX @command{awk}.
+@ifnotdocbook
+@xref{Getline/Coprocess},
+for a brief discussion.
+@xref{Two-way I/O},
+for a more complete discussion.
+@end ifnotdocbook
+@ifdocbook
+@xref{Getline/Coprocess}
+for a brief discussion and
+@ref{Two-way I/O}
+for a more complete discussion.
+@end ifdocbook
+@end table
+
+Redirecting output using @samp{>}, @samp{>>}, @samp{|}, or @samp{|&}
+asks the system to open a file, pipe, or coprocess only if the particular
+@var{file} or @var{command} you specify has not already been written
+to by your program or if it has been closed since it was last written to.
+
+@cindex troubleshooting, printing
+It is a common error to use @samp{>} redirection for the first @code{print}
+to a file, and then to use @samp{>>} for subsequent output:
+
+@example
+# clear the file
+print "Don't panic" > "guide.txt"
+@dots{}
+# append
+print "Avoid improbability generators" >> "guide.txt"
+@end example
+
+@noindent
+This is indeed how redirections must be used from the shell.  But in
+@command{awk}, it isn't necessary.  In this kind of case, a program should
+use @samp{>} for all the @code{print} statements, because the output file
+is only opened once. (It happens that if you mix @samp{>} and @samp{>>}
+output is produced in the expected order. However, mixing the operators
+for the same file is definitely poor style, and is confusing to readers
+of your program.)
+
+@cindex differences in @command{awk} and @command{gawk}, implementation limitations
+@cindex implementation issues, @command{gawk}, limits
+@cindex @command{awk}, implementation issues, pipes
+@cindex @command{gawk}, implementation issues, pipes
+@ifnotinfo
+As mentioned earlier
+(@pxref{Getline Notes}),
+many
+@end ifnotinfo
+@ifnottex
+@ifnotdocbook
+Many
+@end ifnotdocbook
+@end ifnottex
+older
+@command{awk} implementations limit the number of pipelines that an @command{awk}
+program may have open to just one!  In @command{gawk}, there is no such limit.
+@command{gawk} allows a program to
+open as many pipelines as the underlying operating system permits.
+
+@cindex sidebar, Piping into @command{sh}
+@ifdocbook
+@docbook
+<sidebar><title>Piping into @command{sh}</title>
+@end docbook
+
+@cindex shells, piping commands into
+
+A particularly powerful way to use redirection is to build command lines
+and pipe them into the shell, @command{sh}.  For example, suppose you
+have a list of files brought over from a system where all the @value{FN}s
+are stored in uppercase, and you wish to rename them to have names in
+all lowercase.  The following program is both simple and efficient:
+
+@c @cindex @command{mv} utility
+@example
+@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @}
+
+END @{ close("sh") @}
+@end example
+
+The @code{tolower()} function returns its argument string with all
+uppercase characters converted to lowercase
+(@pxref{String Functions}).
+The program builds up a list of command lines,
+using the @command{mv} utility to rename the files.
+It then sends the list to the shell for execution.
+
+@xref{Shell Quoting} for a function that can help in generating
+command lines to be fed to the shell.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Piping into @command{sh}}
+
+
+@cindex shells, piping commands into
+
+A particularly powerful way to use redirection is to build command lines
+and pipe them into the shell, @command{sh}.  For example, suppose you
+have a list of files brought over from a system where all the @value{FN}s
+are stored in uppercase, and you wish to rename them to have names in
+all lowercase.  The following program is both simple and efficient:
+
+@c @cindex @command{mv} utility
+@example
+@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @}
+
+END @{ close("sh") @}
+@end example
+
+The @code{tolower()} function returns its argument string with all
+uppercase characters converted to lowercase
+(@pxref{String Functions}).
+The program builds up a list of command lines,
+using the @command{mv} utility to rename the files.
+It then sends the list to the shell for execution.
+
+@xref{Shell Quoting} for a function that can help in generating
+command lines to be fed to the shell.
+@end cartouche
+@end ifnotdocbook
+
+@node Special FD
+@section Special Files for Standard Preopened Data Streams
+@cindex standard input
+@cindex input, standard
+@cindex standard output
+@cindex output, standard
+@cindex error output
+@cindex standard error
+@cindex file descriptors
+@cindex files, descriptors, See file descriptors
+
+Running programs conventionally have three input and output streams
+already available to them for reading and writing.  These are known
+as the @dfn{standard input}, @dfn{standard output}, and @dfn{standard
+error output}.  These open streams (and any other open files or pipes)
+are often referred to by the technical term @dfn{file descriptors}.
+
+These streams are, by default, connected to your keyboard and screen, but
+they are often redirected with the shell, via the @samp{<}, @samp{<<},
+@samp{>}, @samp{>>}, @samp{>&}, and @samp{|} operators.  Standard error
+is typically used for writing error messages; the reason there are two separate
+streams, standard output and standard error, is so that they can be
+redirected separately.
+
+@cindex differences in @command{awk} and @command{gawk}, error messages
+@cindex error handling
+In traditional implementations of @command{awk}, the only way to write an error
+message to standard error in an @command{awk} program is as follows:
+
+@example
+print "Serious error detected!" | "cat 1>&2"
+@end example
+
+@noindent
+This works by opening a pipeline to a shell command that can access the
+standard error stream that it inherits from the @command{awk} process.
+@c 8/2014: Mike Brennan says not to cite this as inefficient. So, fixed.
+This is far from elegant, and it also requires a
+separate process.  So people writing @command{awk} programs often
+don't do this.  Instead, they send the error messages to the
+screen, like this:
+
+@example
+print "Serious error detected!" > "/dev/tty"
+@end example
+
+@noindent
+(@file{/dev/tty} is a special file supplied by the operating system
+that is connected to your keyboard and screen. It represents the
+``terminal,''@footnote{The ``tty'' in @file{/dev/tty} stands for
+``Teletype,'' a serial terminal.} which on modern systems is a keyboard
+and screen, not a serial console.)
+This generally has the same effect, but not always: although the
+standard error stream is usually the screen, it can be redirected; when
+that happens, writing to the screen is not correct.  In fact, if
+@command{awk} is run from a background job, it may not have a
+terminal at all.
+Then opening @file{/dev/tty} fails.
+
+@command{gawk}, BWK @command{awk}, and @command{mawk} provide
+special @value{FN}s for accessing the three standard streams.
+If the @value{FN} matches one of these special names when @command{gawk}
+(or one of the others) redirects input or output, then it directly uses
+the descriptor that the @value{FN} stands for.  These special
+@value{FN}s work for all operating systems that @command{gawk}
+has been ported to, not just those that are POSIX-compliant:
+
+@cindex common extensions, @code{/dev/stdin} special file
+@cindex common extensions, @code{/dev/stdout} special file
+@cindex common extensions, @code{/dev/stderr} special file
+@cindex extensions, common@comma{} @code{/dev/stdin} special file
+@cindex extensions, common@comma{} @code{/dev/stdout} special file
+@cindex extensions, common@comma{} @code{/dev/stderr} special file
+@cindex file names, standard streams in @command{gawk}
+@cindex @code{/dev/@dots{}} special files
+@cindex files, @code{/dev/@dots{}} special files
+@cindex @code{/dev/fd/@var{N}} special files (@command{gawk})
+@table @file
+@item /dev/stdin
+The standard input (file descriptor 0).
+
+@item /dev/stdout
+The standard output (file descriptor 1).
+
+@item /dev/stderr
+The standard error output (file descriptor 2).
+@end table
+
+With these facilities,
+the proper way to write an error message then becomes:
+
+@example
+print "Serious error detected!" > "/dev/stderr"
+@end example
+
+@cindex troubleshooting, quotes with file names
+Note the use of quotes around the @value{FN}.
+Like with any other redirection, the value must be a string.
+It is a common error to omit the quotes, which leads
+to confusing results.
+
+@command{gawk} does not treat these @value{FN}s as special when
+in POSIX-compatibility mode. However, because BWK @command{awk}
+supports them, @command{gawk} does support them even when
+invoked with the @option{--traditional} option (@pxref{Options}).
+
+@node Special Files
+@section Special @value{FFN}s in @command{gawk}
+@cindex @command{gawk}, file names in
+
+Besides access to standard input, standard output, and standard error,
+@command{gawk} provides access to any open file descriptor.
+Additionally, there are special @value{FN}s reserved for
+TCP/IP networking.
+
+@menu
+* Other Inherited Files::       Accessing other open files with
+                                @command{gawk}.
+* Special Network::             Special files for network communications.
+* Special Caveats::             Things to watch out for.
+@end menu
+
+@node Other Inherited Files
+@subsection Accessing Other Open Files with @command{gawk}
+
+Besides the @code{/dev/stdin}, @code{/dev/stdout}, and @code{/dev/stderr}
+special @value{FN}s mentioned earlier, @command{gawk} provides syntax
+for accessing any other inherited open file:
+
+@table @file
+@item /dev/fd/@var{N}
+The file associated with file descriptor @var{N}.  Such a file must
+be opened by the program initiating the @command{awk} execution (typically
+the shell).  Unless special pains are taken in the shell from which
+@command{gawk} is invoked, only descriptors 0, 1, and 2 are available.
+@end table
+
+The @value{FN}s @file{/dev/stdin}, @file{/dev/stdout}, and @file{/dev/stderr}
+are essentially aliases for @file{/dev/fd/0}, @file{/dev/fd/1}, and
+@file{/dev/fd/2}, respectively. However, those names are more self-explanatory.
+
+Note that using @code{close()} on a @value{FN} of the
+form @code{"/dev/fd/@var{N}"}, for file descriptor numbers
+above two, does actually close the given file descriptor.
+
+@node Special Network
+@subsection Special Files for Network Communications
+@cindex networks, support for
+@cindex TCP/IP, support for
+
+@command{gawk} programs
+can open a two-way
+TCP/IP connection, acting as either a client or a server.
+This is done using a special @value{FN} of the form:
+
+@example
+@file{/@var{net-type}/@var{protocol}/@var{local-port}/@var{remote-host}/@var{remote-port}}
+@end example
+
+The @var{net-type} is one of @samp{inet}, @samp{inet4}, or @samp{inet6}.
+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 @w{a coprocess}
+(@pxref{Two-way I/O}).
+This is an advanced feature, mentioned here only for completeness.
+Full discussion is delayed until
+@ref{TCP/IP Networking}.
+
+@node Special Caveats
+@subsection Special @value{FFN} Caveats
+
+Here are some things to bear in mind when using the
+special @value{FN}s that @command{gawk} provides:
+
+@itemize @value{BULLET}
+@cindex compatibility mode (@command{gawk}), file names
+@cindex file names, in compatibility mode
+@item
+Recognition of the @value{FN}s for the three standard preopened
+files is disabled only in POSIX mode.
+
+@item
+Recognition of the other special @value{FN}s is disabled if @command{gawk} is in
+compatibility mode (either @option{--traditional} or @option{--posix};
+@pxref{Options}).
+
+@item
+@command{gawk} @emph{always}
+interprets these special @value{FN}s.
+For example, using @samp{/dev/fd/4}
+for output actually writes on file descriptor 4, and not on a new
+file descriptor that is @code{dup()}ed from file descriptor 4.  Most of
+the time this does not matter; however, it is important to @emph{not}
+close any of the files related to file descriptors 0, 1, and 2.
+Doing so results in unpredictable behavior.
+@end itemize
+
+@node Close Files And Pipes
+@section Closing Input and Output Redirections
+@cindex files, output, See output files
+@cindex input files, closing
+@cindex output, files@comma{} closing
+@cindex pipe, closing
+@cindex coprocesses, closing
+@cindex @code{getline} command, coprocesses@comma{} using from
+
+If the same @value{FN} or the same shell command is used with @code{getline}
+more than once during the execution of an @command{awk} program
+(@pxref{Getline}),
+the file is opened (or the command is executed) the first time only.
+At that time, the first record of input is read from that file or command.
+The next time the same file or command is used with @code{getline},
+another record is read from it, and so on.
+
+Similarly, when a file or pipe is opened for output, @command{awk} remembers
+the @value{FN} or command associated with it, and subsequent
+writes to the same file or command are appended to the previous writes.
+The file or pipe stays open until @command{awk} exits.
+
+@cindexawkfunc{close}
+This implies that special steps are necessary in order to read the same
+file again from the beginning, or to rerun a shell command (rather than
+reading more output from the same command).  The @code{close()} function
+makes these things possible:
+
+@example
+close(@var{filename})
+@end example
+
+@noindent
+or:
+
+@example
+close(@var{command})
+@end example
+
+The argument @var{filename} or @var{command} can be any expression.  Its
+value must @emph{exactly} match the string that was used to open the file or
+start the command (spaces and other ``irrelevant'' characters
+included). For example, if you open a pipe with this:
+
+@example
+"sort -r names" | getline foo
+@end example
+
+@noindent
+then you must close it with this:
+
+@example
+close("sort -r names")
+@end example
+
+Once this function call is executed, the next @code{getline} from that
+file or command, or the next @code{print} or @code{printf} to that
+file or command, reopens the file or reruns the command.
+Because the expression that you use to close a file or pipeline must
+exactly match the expression used to open the file or run the command,
+it is good practice to use a variable to store the @value{FN} or command.
+The previous example becomes the following:
+
+@example
+@group
+sortcom = "sort -r names"
+sortcom | getline foo
+@end group
+@group
+@dots{}
+close(sortcom)
+@end group
+@end example
+
+@noindent
+This helps avoid hard-to-find typographical errors in your @command{awk}
+programs.  Here are some of the reasons for closing an output file:
+
+@itemize @value{BULLET}
+@item
+To write a file and read it back later on in the same @command{awk}
+program.  Close the file after writing it, then
+begin reading it with @code{getline}.
+
+@item
+To write numerous files, successively, in the same @command{awk}
+program.  If the files aren't closed, eventually @command{awk} may exceed a
+system limit on the number of open files in one process.  It is best to
+close each one when the program has finished writing it.
+
+@item
+To make a command finish.  When output is redirected through a pipe,
+the command reading the pipe normally continues to try to read input
+as long as the pipe is open.  Often this means the command cannot
+really do its work until the pipe is closed.  For example, if
+output is redirected to the @command{mail} program, the message is not
+actually sent until the pipe is closed.
+
+@item
+To run the same program a second time, with the same arguments.
+This is not the same thing as giving more input to the first run!
+
+For example, suppose a program pipes output to the @command{mail} program.
+If it outputs several lines redirected to this pipe without closing
+it, they make a single message of several lines.  By contrast, if the
+program closes the pipe after each line of output, then each line makes
+a separate message.
+@end itemize
+
+@cindex differences in @command{awk} and @command{gawk}, @code{close()} function
+@cindex portability, @code{close()} function and
+@cindex @code{close()} function, portability
+If you use more files than the system allows you to have open,
+@command{gawk} attempts to multiplex the available open files among
+your @value{DF}s.  @command{gawk}'s ability to do this depends upon the
+facilities of your operating system, so it may not always work.  It is
+therefore both good practice and good portability advice to always
+use @code{close()} on your files when you are done with them.
+In fact, if you are using a lot of pipes, it is essential that
+you close commands when done. For example, consider something like this:
+
+@example
+@{
+    @dots{}
+    command = ("grep " $1 " /some/file | my_prog -q " $3)
+    while ((command | getline) > 0) @{
+        @var{process output of} command
+    @}
+    # need close(command) here
+@}
+@end example
+
+This example creates a new pipeline based on data in @emph{each} record.
+Without the call to @code{close()} indicated in the comment, @command{awk}
+creates child processes to run the commands, until it eventually
+runs out of file descriptors for more pipelines.
+
+Even though each command has finished (as indicated by the end-of-file
+return status from @code{getline}), the child process is not
+terminated;@footnote{The technical terminology is rather morbid.
+The finished child is called a ``zombie,'' and cleaning up after
+it is referred to as ``reaping.''}
+@c Good old UNIX: give the marketing guys fits, that's the ticket
+more importantly, the file descriptor for the pipe
+is not closed and released until @code{close()} is called or
+@command{awk} exits.
+
+@code{close()} silently does nothing if given an argument that
+does not represent a file, pipe, or coprocess that was opened with
+a redirection.  In such a case, it returns a negative value,
+indicating an error. In addition, @command{gawk} sets @code{ERRNO}
+to a string indicating the error.
+
+Note also that @samp{close(FILENAME)} has no ``magic'' effects on the
+implicit loop that reads through the files named on the command line.
+It is, more likely, a close of a file that was never opened with a
+redirection, so @command{awk} silently does nothing, except return
+a negative value.
+
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O), pipes@comma{} closing
+When using the @samp{|&} operator to communicate with a coprocess,
+it is occasionally useful to be able to close one end of the two-way
+pipe without closing the other.
+This is done by supplying a second argument to @code{close()}.
+As in any other call to @code{close()},
+the first argument is the name of the command or special file used
+to start the coprocess.
+The second argument should be a string, with either of the values
+@code{"to"} or @code{"from"}.  Case does not matter.
+As this is an advanced feature, discussion is
+delayed until
+@ref{Two-way I/O},
+which describes it in more detail and gives an example.
+
+@cindex sidebar, Using @code{close()}'s Return Value
+@ifdocbook
+@docbook
+<sidebar><title>Using @code{close()}'s Return Value</title>
+@end docbook
+
+@cindex dark corner, @code{close()} function
+@cindex @code{close()} function, return value
+@cindex return value@comma{} @code{close()} function
+@cindex differences in @command{awk} and @command{gawk}, @code{close()} function
+@cindex Unix @command{awk}, @code{close()} function and
+
+In many older versions of Unix @command{awk}, the @code{close()} function
+is actually a statement.
+@value{DARKCORNER}
+It is a syntax error to try and use the return
+value from @code{close()}:
+
+@example
+command = "@dots{}"
+command | getline info
+retval = close(command)  # syntax error in many Unix awks
+@end example
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable, with @command{close()} function
+@command{gawk} treats @code{close()} as a function.
+The return value is @minus{}1 if the argument names something
+that was never opened with a redirection, or if there is
+a system problem closing the file or process.
+In these cases, @command{gawk} sets the predefined variable
+@code{ERRNO} to a string describing the problem.
+
+In @command{gawk}, starting with @value{PVERSION} 4.2, when closing a pipe or
+coprocess (input or output), the return value is the exit status of the
+command, as described in @ref{table-close-pipe-return-values}.@footnote{Prior
+to @value{PVERSION} 4.2, the return value from closing a pipe or co-process
+was the full 16-bit exit value as defined by the @code{wait()} system
+call.} Otherwise, it is the return value from the system's @code{close()}
+or @code{fclose()} C functions when closing input or output files,
+respectively.  This value is zero if the close succeeds, or @minus{}1
+if it fails.
+
+@float Table,table-close-pipe-return-values
+@caption{Return values from @code{close()} of a pipe}
+@multitable @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
+@item Death by signal of command with core dump @tab 512 + number of murderous signal
+@item Some kind of error @tab @minus{}1
+@end multitable
+@end float
+
+The POSIX standard is very vague; it says that @code{close()}
+returns zero on success and a nonzero value otherwise.  In general,
+different implementations vary in what they report when closing
+pipes; thus, the return value cannot be used portably.
+@value{DARKCORNER}
+In POSIX mode (@pxref{Options}), @command{gawk} just returns zero
+when closing a pipe.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Using @code{close()}'s Return Value}
+
+
+@cindex dark corner, @code{close()} function
+@cindex @code{close()} function, return value
+@cindex return value@comma{} @code{close()} function
+@cindex differences in @command{awk} and @command{gawk}, @code{close()} function
+@cindex Unix @command{awk}, @code{close()} function and
+
+In many older versions of Unix @command{awk}, the @code{close()} function
+is actually a statement.
+@value{DARKCORNER}
+It is a syntax error to try and use the return
+value from @code{close()}:
+
+@example
+command = "@dots{}"
+command | getline info
+retval = close(command)  # syntax error in many Unix awks
+@end example
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable, with @command{close()} function
+@command{gawk} treats @code{close()} as a function.
+The return value is @minus{}1 if the argument names something
+that was never opened with a redirection, or if there is
+a system problem closing the file or process.
+In these cases, @command{gawk} sets the predefined variable
+@code{ERRNO} to a string describing the problem.
+
+In @command{gawk}, starting with @value{PVERSION} 4.2, when closing a pipe or
+coprocess (input or output), the return value is the exit status of the
+command, as described in @ref{table-close-pipe-return-values}.@footnote{Prior
+to @value{PVERSION} 4.2, the return value from closing a pipe or co-process
+was the full 16-bit exit value as defined by the @code{wait()} system
+call.} Otherwise, it is the return value from the system's @code{close()}
+or @code{fclose()} C functions when closing input or output files,
+respectively.  This value is zero if the close succeeds, or @minus{}1
+if it fails.
+
+@float Table,table-close-pipe-return-values
+@caption{Return values from @code{close()} of a pipe}
+@multitable @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
+@item Death by signal of command with core dump @tab 512 + number of murderous signal
+@item Some kind of error @tab @minus{}1
+@end multitable
+@end float
+
+The POSIX standard is very vague; it says that @code{close()}
+returns zero on success and a nonzero value otherwise.  In general,
+different implementations vary in what they report when closing
+pipes; thus, the return value cannot be used portably.
+@value{DARKCORNER}
+In POSIX mode (@pxref{Options}), @command{gawk} just returns zero
+when closing a pipe.
+@end cartouche
+@end ifnotdocbook
+
+@node Nonfatal
+@section Enabling Nonfatal Output
+
+This @value{SECTION} describes a @command{gawk}-specific feature.
+
+In standard @command{awk}, output with @code{print} or @code{printf}
+to a nonexistent file, or some other I/O error (such as filling up the
+disk) is a fatal error.
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "hi" > "/no/such/file" @}'}
+@error{} gawk: cmd. line:1: fatal: can't redirect to `/no/such/file' (No
+@error{} such file or directory)
+@end example
+
+@command{gawk} makes it possible to detect that an error has
+occurred, allowing you to possibly recover from the error, or
+at least print an error message of your choosing before exiting.
+You can do this in one of two ways:
+
+@itemize @bullet
+@item
+For all output files, by assigning any value to @code{PROCINFO["NONFATAL"]}.
+
+@item
+On a per-file basis, by assigning any value to
+@code{PROCINFO[@var{filename}, "NONFATAL"]}.
+Here, @var{filename} is the name of the file to which
+you wish output to be nonfatal.
+@end itemize
+
+Once you have enabled nonfatal output, you must check @code{ERRNO}
+after every relevant @code{print} or @code{printf} statement to
+see if something went wrong.  It is also a good idea to initialize
+@code{ERRNO} to zero before attempting the output. For example:
+
+@example
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+> @kbd{    PROCINFO["NONFATAL"] = 1}
+> @kbd{    ERRNO = 0}
+> @kbd{    print "hi" > "/no/such/file"}
+> @kbd{    if (ERRNO) @{}
+> @kbd{        print("Output failed:", ERRNO) > "/dev/stderr"}
+> @kbd{        exit 1}
+> @kbd{    @}}
+> @kbd{@}'}
+@error{} Output failed: No such file or directory
+@end example
+
+Here, @command{gawk} did not produce a fatal error; instead
+it let the @command{awk} program code detect the problem and handle it.
+
+This mechanism works also for standard output and standard error.
+For standard output, you may use @code{PROCINFO["-", "NONFATAL"]}
+or @code{PROCINFO["/dev/stdout", "NONFATAL"]}.  For standard error, use
+@code{PROCINFO["/dev/stderr", "NONFATAL"]}.
+
+When attempting to open a TCP/IP socket (@pxref{TCP/IP Networking}),
+@command{gawk} tries multiple times. The @env{GAWK_SOCK_RETRIES}
+environment variable (@pxref{Other Environment Variables}) allows you to
+override @command{gawk}'s builtin default number of attempts.  However,
+once nonfatal I/O is enabled for a given socket, @command{gawk} only
+retries once, relying on @command{awk}-level code to notice that there
+was a problem.
+
+@node Output Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+The @code{print} statement prints comma-separated expressions. Each
+expression is separated by the value of @code{OFS} and terminated by
+the value of @code{ORS}.  @code{OFMT} provides the conversion format
+for numeric values for the @code{print} statement.
+
+@item
+The @code{printf} statement provides finer-grained control over output,
+with format-control letters for different data types and various flags
+that modify the behavior of the format-control letters.
+
+@item
+Output from both @code{print} and @code{printf} may be redirected to
+files, pipes, and coprocesses.
+
+@item
+@command{gawk} provides special @value{FN}s for access to standard input,
+output, and error, and for network communications.
+
+@item
+Use @code{close()} to close open file, pipe, and coprocess redirections.
+For coprocesses, it is possible to close only one direction of the
+communications.
+
+@item
+Normally errors with @code{print} or @code{printf} are fatal.
+@command{gawk} lets you make output errors be nonfatal either for
+all files or on a per-file basis. You must then check for errors
+after every relevant output statement.
+
+@end itemize
+
+@c EXCLUDE START
+@node Output Exercises
+@section Exercises
+
+@enumerate
+@item
+Rewrite the program:
+
+@example
+awk 'BEGIN @{ print "Month Crates"
+             print "----- ------" @}
+           @{ print $1, "     ", $2 @}' inventory-shipped
+@end example
+
+@noindent
+from @ref{Output Separators}, by using a new value of @code{OFS}.
+
+@item
+Use the @code{printf} statement to line up the headings and table data
+for the @file{inventory-shipped} example that was covered in @ref{Print}.
+
+@item
+What happens if you forget the double quotes when redirecting
+output, as follows:
+
+@example
+BEGIN @{ print "Serious error detected!" > /dev/stderr @}
+@end example
+
+@end enumerate
+@c EXCLUDE END
+
+
+@node Expressions
+@chapter Expressions
+@cindex expressions
+
+Expressions are the basic building blocks of @command{awk} patterns
+and actions.  An expression evaluates to a value that you can print, test,
+or pass to a function.  Additionally, an expression
+can assign a new value to a variable or a field by using an assignment operator.
+
+An expression can serve as a pattern or action statement on its own.
+Most other kinds of
+statements contain one or more expressions that specify the data on which to
+operate.  As in other languages, expressions in @command{awk} can include
+variables, array references, constants, and function calls, as well as
+combinations of these with various operators.
+
+@menu
+* Values::                      Constants, Variables, and Regular Expressions.
+* All Operators::               @command{gawk}'s operators.
+* Truth Values and Conditions:: Testing for true and false.
+* Function Calls::              A function call is an expression.
+* Precedence::                  How various operators nest.
+* Locales::                     How the locale affects things.
+* Expressions Summary::         Expressions summary.
+@end menu
+
+@node Values
+@section Constants, Variables, and Conversions
+
+Expressions are built up from values and the operations performed
+upon them. This @value{SECTION} describes the elementary objects
+that provide the values used in expressions.
+
+@menu
+* Constants::                   String, numeric and regexp constants.
+* Using Constant Regexps::      When and how to use a regexp constant.
+* Variables::                   Variables give names to values for later use.
+* Conversion::                  The conversion of strings to numbers and vice
+                                versa.
+@end menu
+
+@node Constants
+@subsection Constant Expressions
+
+@cindex constants, types of
+
+The simplest type of expression is the @dfn{constant}, which always has
+the same value.  There are three types of constants: numeric,
+string, and regular expression.
+
+Each is used in the appropriate context when you need a data
+value that isn't going to change.  Numeric constants can
+have different forms, but are internally stored in an identical manner.
+
+@menu
+* Scalar Constants::            Numeric and string constants.
+* Nondecimal-numbers::          What are octal and hex numbers.
+* Regexp Constants::            Regular Expression constants.
+@end menu
+
+@node Scalar Constants
+@subsubsection Numeric and String Constants
+
+@cindex constants, numeric
+@cindex numeric constants
+A @dfn{numeric constant} stands for a number.  This number can be an
+integer, a decimal fraction, or a number in scientific (exponential)
+notation.@footnote{The internal representation of all numbers,
+including integers, uses double-precision floating-point numbers.
+On most modern systems, these are in IEEE 754 standard format.
+@xref{Arbitrary Precision Arithmetic}, for much more information.}
+Here are some examples of numeric constants that all
+have the same value:
+
+@example
+105
+1.05e+2
+1050e-1
+@end example
+
+@cindex string constants
+A @dfn{string constant} consists of a sequence of characters enclosed in
+double quotation marks.  For example:
+
+@example
+"parrot"
+@end example
+
+@noindent
+@cindex differences in @command{awk} and @command{gawk}, strings
+@cindex strings, length limitations
+represents the string whose contents are @samp{parrot}.  Strings in
+@command{gawk} can be of any length, and they can contain any of the possible
+eight-bit ASCII characters, including ASCII @sc{nul} (character code zero).
+Other @command{awk}
+implementations may have difficulty with some character codes.
+
+Some languages allow you to continue long strings across
+multiple lines by ending the line with a backslash. For example in C:
+
+@example
+#include <stdio.h>
+
+int main()
+@{
+    printf "hello, \
+world\n");
+    return 0;
+@}
+@end example
+
+@noindent
+In such a case, the C compiler removes both the backslash and the newline,
+producing a string as if it had been typed @samp{"hello, world\n"}.
+This is useful when a single string needs to contain a large amount of text.
+
+The POSIX standard says explicitly that newlines are not allowed inside string
+constants.  And indeed, all @command{awk} implementations report an error
+if you try to do so. For example:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "hello, }
+> @kbd{world" @}'}
+@print{} gawk: cmd. line:1: BEGIN @{ print "hello,
+@print{} gawk: cmd. line:1:               ^ unterminated string
+@print{} gawk: cmd. line:1: BEGIN @{ print "hello,
+@print{} gawk: cmd. line:1:               ^ syntax error
+@end example
+
+@cindex dark corner, string continuation
+@cindex strings, continuation across lines
+@cindex differences in @command{awk} and @command{gawk}, strings
+Although POSIX doesn't define what happens if you use an escaped
+newline, as in the previous C example, all known versions of
+@command{awk} allow you to do so.  Unfortunately, what each one
+does with such a string varies.  @value{DARKCORNER} @command{gawk},
+@command{mawk}, and the OpenSolaris POSIX @command{awk}
+(@pxref{Other Versions}) elide the backslash and newline, as in C:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "hello, \}
+> @kbd{world" @}'}
+@print{} hello, world
+@end example
+
+In POSIX mode (@pxref{Options}), @command{gawk} does not
+allow escaped newlines.  Otherwise, it behaves as just described.
+
+Brian Kernighan's @command{awk} and BusyBox @command{awk}
+remove the backslash but leave the newline
+intact, as part of the string:
+
+@example
+$ @kbd{nawk 'BEGIN @{ print "hello, \}
+> @kbd{world" @}'}
+@print{} hello, 
+@print{} world
+@end example
+
+@node Nondecimal-numbers
+@subsubsection Octal and Hexadecimal Numbers
+@cindex octal numbers
+@cindex hexadecimal numbers
+@cindex numbers, octal
+@cindex numbers, hexadecimal
+
+In @command{awk}, all numbers are in decimal (i.e., base 10).  Many other
+programming languages allow you to specify numbers in other bases, often
+octal (base 8) and hexadecimal (base 16).
+In octal, the numbers go 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, and so on.
+Just as @samp{11} in decimal is 1 times 10 plus 1, so
+@samp{11} in octal is 1 times 8 plus 1. This equals 9 in decimal.
+In hexadecimal, there are 16 digits. Because the everyday decimal
+number system only has ten digits (@samp{0}--@samp{9}), the letters
+@samp{a} through @samp{f} represent the rest.
+(Case in the letters is usually irrelevant; hexadecimal @samp{a} and @samp{A}
+have the same value.)
+Thus, @samp{11} in
+hexadecimal is 1 times 16 plus 1, which equals 17 in decimal.
+
+Just by looking at plain @samp{11}, you can't tell what base it's in.
+So, in C, C++, and other languages derived from C,
+@c such as PERL, but we won't mention that....
+there is a special notation to signify the base.
+Octal numbers start with a leading @samp{0},
+and hexadecimal numbers start with a leading @samp{0x} or @samp{0X}:
+
+@table @code
+@item 11
+Decimal value 11
+
+@item 011
+Octal 11, decimal value 9
+
+@item 0x11
+Hexadecimal 11, decimal value 17
+@end table
+
+This example shows the difference:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "%d, %d, %d\n", 011, 11, 0x11 @}'}
+@print{} 9, 11, 17
+@end example
+
+Being able to use octal and hexadecimal constants in your programs is most
+useful when working with data that cannot be represented conveniently as
+characters or as regular numbers, such as binary data of various sorts.
+
+@cindex @command{gawk}, octal numbers and
+@cindex @command{gawk}, hexadecimal numbers and
+@command{gawk} allows the use of octal and hexadecimal
+constants in your program text.  However, such numbers in the input data
+are not treated differently; doing so by default would break old
+programs.
+(If you really need to do this, use the @option{--non-decimal-data}
+command-line option;
+@pxref{Nondecimal Data}.)
+If you have octal or hexadecimal data,
+you can use the @code{strtonum()} function
+(@pxref{String Functions})
+to convert the data into a number.
+Most of the time, you will want to use octal or hexadecimal constants
+when working with the built-in bit-manipulation functions;
+see @ref{Bitwise Functions}
+for more information.
+
+Unlike in some early C implementations, @samp{8} and @samp{9} are not
+valid in octal constants.  For example, @command{gawk} treats @samp{018}
+as decimal 18:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "021 is", 021 ; print 018 @}'}
+@print{} 021 is 17
+@print{} 18
+@end example
+
+@cindex compatibility mode (@command{gawk}), octal numbers
+@cindex compatibility mode (@command{gawk}), hexadecimal numbers
+Octal and hexadecimal source code constants are a @command{gawk} extension.
+If @command{gawk} is in compatibility mode
+(@pxref{Options}),
+they are not available.
+
+@cindex sidebar, A Constant's Base Does Not Affect Its Value
+@ifdocbook
+@docbook
+<sidebar><title>A Constant's Base Does Not Affect Its Value</title>
+@end docbook
+
+
+Once a numeric constant has
+been converted internally into a number,
+@command{gawk} no longer remembers
+what the original form of the constant was; the internal value is
+always used.  This has particular consequences for conversion of
+numbers to strings:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "0x11 is <%s>\n", 0x11 @}'}
+@print{} 0x11 is <17>
+@end example
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{A Constant's Base Does Not Affect Its Value}
+
+
+
+Once a numeric constant has
+been converted internally into a number,
+@command{gawk} no longer remembers
+what the original form of the constant was; the internal value is
+always used.  This has particular consequences for conversion of
+numbers to strings:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "0x11 is <%s>\n", 0x11 @}'}
+@print{} 0x11 is <17>
+@end example
+@end cartouche
+@end ifnotdocbook
+
+@node Regexp Constants
+@subsubsection Regular Expression Constants
+
+@cindex regexp constants
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+A @dfn{regexp constant} is a regular expression description enclosed in
+slashes, such as @code{@w{/^beginning and end$/}}.  Most regexps used in
+@command{awk} programs are constant, but the @samp{~} and @samp{!~}
+matching operators can also match computed or dynamic regexps
+(which are typically just ordinary strings or variables that contain a regexp,
+but could be more complex expressions).
+
+@node Using Constant Regexps
+@subsection Using Regular Expression Constants
+
+Regular expression constants consist of text describing
+a regular expression enclosed in slashes (such as @code{/the +answer/}).
+This @value{SECTION} describes how such constants work in
+POSIX @command{awk} and @command{gawk}, and then goes on to describe
+@dfn{strongly typed regexp constants}, which are a @command{gawk} extension.
+
+@menu
+* Standard Regexp Constants::   Regexp constants in standard @command{awk}.
+* Strong Regexp Constants::     Strongly typed regexp constants.
+@end menu
+
+@node Standard Regexp Constants
+@subsubsection Standard Regular Expression Constants
+
+@cindex dark corner, regexp constants
+When used on the righthand side of the @samp{~} or @samp{!~}
+operators, a regexp constant merely stands for the regexp that is to be
+matched.
+However, regexp constants (such as @code{/foo/}) may be used like simple expressions.
+When a
+regexp constant appears by itself, it has the same meaning as if it appeared
+in a pattern (i.e., @samp{($0 ~ /foo/)}).
+@value{DARKCORNER}
+@xref{Expression Patterns}.
+This means that the following two code segments:
+
+@example
+if ($0 ~ /barfly/ || $0 ~ /camelot/)
+    print "found"
+@end example
+
+@noindent
+and:
+
+@example
+if (/barfly/ || /camelot/)
+    print "found"
+@end example
+
+@noindent
+are exactly equivalent.
+One rather bizarre consequence of this rule is that the following
+Boolean expression is valid, but does not do what its author probably
+intended:
+
+@example
+# Note that /foo/ is on the left of the ~
+if (/foo/ ~ $1) print "found foo"
+@end example
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex @command{gawk}, regexp constants and
+@cindex regexp constants, in @command{gawk}
+@noindent
+This code is ``obviously'' testing @code{$1} for a match against the regexp
+@code{/foo/}.  But in fact, the expression @samp{/foo/ ~ $1} really means
+@samp{($0 ~ /foo/) ~ $1}.  In other words, first match the input record
+against the regexp @code{/foo/}.  The result is either zero or one,
+depending upon the success or failure of the match.  That result
+is then matched against the first field in the record.
+Because it is unlikely that you would ever really want to make this kind of
+test, @command{gawk} issues a warning when it sees this construct in
+a program.
+Another consequence of this rule is that the assignment statement:
+
+@example
+matches = /foo/
+@end example
+
+@noindent
+assigns either zero or one to the variable @code{matches}, depending
+upon the contents of the current input record.
+
+@cindex differences in @command{awk} and @command{gawk}, regexp constants
+@cindex dark corner, regexp constants, as arguments to user-defined functions
+@cindexgawkfunc{gensub}
+@cindexawkfunc{sub}
+@cindexawkfunc{gsub}
+Constant regular expressions are also used as the first argument for
+the @code{gensub()}, @code{sub()}, and @code{gsub()} functions, as the
+second argument of the @code{match()} function,
+and as the third argument of the @code{split()} and @code{patsplit()} functions
+(@pxref{String Functions}).
+Modern implementations of @command{awk}, including @command{gawk}, allow
+the third argument of @code{split()} to be a regexp constant, but some
+older implementations do not.
+@value{DARKCORNER}
+Because some built-in functions accept regexp constants as arguments,
+confusion can arise when attempting to use regexp constants as arguments
+to user-defined functions (@pxref{User-defined}).  For example:
+
+@example
+@group
+function mysub(pat, repl, str, global)
+@{
+    if (global)
+        gsub(pat, repl, str)
+    else
+        sub(pat, repl, str)
+    return str
+@}
+@end group
+
+@group
+@{
+    @dots{}
+    text = "hi! hi yourself!"
+    mysub(/hi/, "howdy", text, 1)
+    @dots{}
+@}
+@end group
+@end example
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+In this example, the programmer wants to pass a regexp constant to the
+user-defined function @code{mysub()}, which in turn passes it on to
+either @code{sub()} or @code{gsub()}.  However, what really happens is that
+the @code{pat} parameter is assigned a value of either one or zero, depending upon whether
+or not @code{$0} matches @code{/hi/}.
+@command{gawk} issues a warning when it sees a regexp constant used as
+a parameter to a user-defined function, because passing a truth value in
+this way is probably not what was intended.
+
+@node Strong Regexp Constants
+@subsubsection Strongly Typed Regexp Constants
+
+This @value{SECTION} describes a @command{gawk}-specific feature.
+
+As we saw in the previous @value{SECTION},
+regexp constants (@code{/@dots{}/}) hold a strange position in the
+@command{awk} language. In most contexts, they act like an expression:
+@samp{$0 ~ /@dots{}/}. In other contexts, they denote only a regexp to
+be matched. In no case are they really a ``first class citizen'' of the
+language. That is, you cannot define a scalar variable whose type is
+``regexp'' in the same sense that you can define a variable to be a
+number or a string:
+
+@example
+num = 42        @ii{Numeric variable}
+str = "hi"      @ii{String variable}
+re = /foo/      @ii{Wrong!} re @ii{is the result of} $0 ~ /foo/
+@end example
+
+For a number of more advanced use cases,
+it would be nice to have regexp constants that
+are @dfn{strongly typed}; in other words, that denote a regexp useful
+for matching, and not an expression.
+
+@cindex values, regexp
+@command{gawk} provides this feature.  A strongly typed regexp constant
+looks almost like a regular regexp constant, except that it is preceded
+by an @samp{@@} sign:
+
+@example
+re = @@/foo/     @ii{Regexp variable}
+@end example
+
+Strongly typed regexp constants @emph{cannot} be used everywhere that a
+regular regexp constant can, because this would make the language even more
+confusing.  Instead, you may use them only in certain contexts:
+
+@itemize @bullet
+@item
+On the righthand side of the @samp{~} and @samp{!~} operators: @samp{some_var ~ @@/foo/}
+(@pxref{Regexp Usage}).
+
+@item
+In the @code{case} part of a @code{switch} statement
+(@pxref{Switch Statement}).
+
+@item
+As an argument to one of the built-in functions that accept regexp constants:
+@code{gensub()},
+@code{gsub()},
+@code{match()},
+@code{patsplit()},
+@code{split()},
+and
+@code{sub()}
+(@pxref{String Functions}).
+
+@item
+As a parameter in a call to a user-defined function
+(@pxref{User-defined}).
+
+@item
+On the righthand side of an assignment to a variable: @samp{some_var = @@/foo/}.
+In this case, the type of @code{some_var} is regexp. Additionally, @code{some_var}
+can be used with @samp{~} and @samp{!~}, passed to one of the built-in functions
+listed above, or passed as a parameter to a user-defined function.
+@end itemize
+
+You may use the @code{typeof()} built-in function
+(@pxref{Type Functions})
+to determine if a variable or function parameter is
+a regexp variable.
+
+The true power of this feature comes from the ability to create variables that
+have regexp type. Such variables can be passed on to user-defined functions,
+without the confusing aspects of computed regular expressions created from
+strings or string constants. They may also be passed through indirect function
+calls (@pxref{Indirect Calls})
+and on to the built-in functions that accept regexp constants.
+
+When used in numeric conversions, strongly typed regexp variables convert
+to zero. When used in string conversions, they convert to the string
+value of the original regexp text.
+
+@node Variables
+@subsection Variables
+
+@cindex variables, user-defined
+@cindex user-defined, variables
+@dfn{Variables} are ways of storing values at one point in your program for
+use later in another part of your program.  They can be manipulated
+entirely within the program text, and they can also be assigned values
+on the @command{awk} command line.
+
+@menu
+* Using Variables::             Using variables in your programs.
+* Assignment Options::          Setting variables on the command line and a
+                                summary of command-line syntax. This is an
+                                advanced method of input.
+@end menu
+
+@node Using Variables
+@subsubsection Using Variables in a Program
+
+Variables let you give names to values and refer to them later.  Variables
+have already been used in many of the examples.  The name of a variable
+must be a sequence of letters, digits, or underscores, and it may not begin
+with a digit.
+Here, a @dfn{letter} is any one of the 52 upper- and lowercase
+English letters.  Other characters that may be defined as letters
+in non-English locales are not valid in variable names.
+Case is significant in variable names; @code{a} and @code{A}
+are distinct variables.
+
+A variable name is a valid expression by itself; it represents the
+variable's current value.  Variables are given new values with
+@dfn{assignment operators}, @dfn{increment operators}, and
+@dfn{decrement operators}
+(@pxref{Assignment Ops}).
+In addition, the @code{sub()} and @code{gsub()} functions can
+change a variable's value, and the @code{match()}, @code{split()},
+and @code{patsplit()} functions can change the contents of their
+array parameters (@pxref{String Functions}).
+
+@cindex variables, built-in
+@cindex variables, initializing
+A few variables have special built-in meanings, such as @code{FS} (the
+field separator) and @code{NF} (the number of fields in the current input
+record).  @xref{Built-in Variables} for a list of the predefined variables.
+These predefined variables can be used and assigned just like all other
+variables, but their values are also used or changed automatically by
+@command{awk}.  All predefined variables' names are entirely uppercase.
+
+Variables in @command{awk} can be assigned either numeric or string values.
+The kind of value a variable holds can change over the life of a program.
+By default, variables are initialized to the empty string, which
+is zero if converted to a number.  There is no need to explicitly
+initialize a variable in @command{awk},
+which is what you would do in C and in most other traditional languages.
+
+@node Assignment Options
+@subsubsection Assigning Variables on the Command Line
+@cindex variables, assigning on command line
+@cindex command line, variables@comma{} assigning on
+
+Any @command{awk} variable can be set by including a @dfn{variable assignment}
+among the arguments on the command line when @command{awk} is invoked
+(@pxref{Other Arguments}).
+Such an assignment has the following form:
+
+@example
+@var{variable}=@var{text}
+@end example
+
+@cindex @option{-v} option
+@noindent
+With it, a variable is set either at the beginning of the
+@command{awk} run or in between input files.
+When the assignment is preceded with the @option{-v} option,
+as in the following:
+
+@example
+-v @var{variable}=@var{text}
+@end example
+
+@noindent
+the variable is set at the very beginning, even before the
+@code{BEGIN} rules execute.  The @option{-v} option and its assignment
+must precede all the @value{FN} arguments, as well as the program text.
+(@xref{Options} for more information about
+the @option{-v} option.)
+Otherwise, the variable assignment is performed at a time determined by
+its position among the input file arguments---after the processing of the
+preceding input file argument.  For example:
+
+@example
+awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list
+@end example
+
+@noindent
+prints the value of field number @code{n} for all input records.  Before
+the first file is read, the command line sets the variable @code{n}
+equal to four.  This causes the fourth field to be printed in lines from
+@file{inventory-shipped}.  After the first file has finished,
+but before the second file is started, @code{n} is set to two, so that the
+second field is printed in lines from @file{mail-list}:
+
+@example
+$ @kbd{awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list}
+@print{} 15
+@print{} 24
+@dots{}
+@print{} 555-5553
+@print{} 555-3412
+@dots{}
+@end example
+
+@cindex dark corner, command-line arguments
+Command-line arguments are made available for explicit examination by
+the @command{awk} program in the @code{ARGV} array
+(@pxref{ARGC and ARGV}).
+@command{awk} processes the values of command-line assignments for escape
+sequences
+(@pxref{Escape Sequences}).
+@value{DARKCORNER}
+
+Normally, variables assigned on the command line (with or without the
+@option{-v} option) are treated as strings.  When such variables are
+used as numbers, @command{awk}'s normal automatic conversion of strings
+to numbers takes place, and everything ``just works.''
+
+However, @command{gawk} supports variables whose types are ``regexp''.
+You can assign variables of this type using the following syntax:
+
+@example
+gawk -v 're1=@/foo|bar/' '@dots{}' /path/to/file1 're2=@/baz|quux/' /path/to/file2
+@end example
+
+@noindent
+Strongly typed regexps are an advanced feature (@pxref{Strong Regexp Constants}).
+We mention them here only for completeness.
+
+@node Conversion
+@subsection Conversion of Strings and Numbers
+
+Number-to-string and string-to-number conversion are generally
+straightforward.  There can be subtleties to be aware of;
+this @value{SECTION} discusses this important facet of @command{awk}.
+
+@menu
+* Strings And Numbers::         How @command{awk} Converts Between Strings And
+                                Numbers.
+* Locale influences conversions:: How the locale may affect conversions.
+@end menu
+
+@node Strings And Numbers
+@subsubsection How @command{awk} Converts Between Strings and Numbers
+
+@cindex converting, strings to numbers
+@cindex strings, converting
+@cindex numbers, converting
+@cindex converting, numbers to strings
+Strings are converted to numbers and numbers are converted to strings, if the context
+of the @command{awk} program demands it.  For example, if the value of
+either @code{foo} or @code{bar} in the expression @samp{foo + bar}
+happens to be a string, it is converted to a number before the addition
+is performed.  If numeric values appear in string concatenation, they
+are converted to strings.  Consider the following:
+
+@example
+@group
+two = 2; three = 3
+print (two three) + 4
+@end group
+@end example
+
+@noindent
+This prints the (numeric) value 27.  The numeric values of
+the variables @code{two} and @code{three} are converted to strings and
+concatenated together.  The resulting string is converted back to the
+number 23, to which 4 is then added.
+
+@cindex null strings, converting numbers to strings
+@cindex type conversion
+If, for some reason, you need to force a number to be converted to a
+string, concatenate that number with the empty string, @code{""}.
+To force a string to be converted to a number, add zero to that string.
+A string is converted to a number by interpreting any numeric prefix
+of the string as numerals:
+@code{"2.5"} converts to 2.5, @code{"1e3"} converts to 1,000, and @code{"25fix"}
+has a numeric value of 25.
+Strings that can't be interpreted as valid numbers convert to zero.
+
+@cindex @code{CONVFMT} variable
+The exact manner in which numbers are converted into strings is controlled
+by the @command{awk} predefined variable @code{CONVFMT} (@pxref{Built-in Variables}).
+Numbers are converted using the @code{sprintf()} function
+with @code{CONVFMT} as the format
+specifier
+(@pxref{String Functions}).
+
+@code{CONVFMT}'s default value is @code{"%.6g"}, which creates a value with
+at most six significant digits.  For some applications, you might want to
+change it to specify more precision.
+On most modern machines,
+17 digits is usually enough to capture a floating-point number's
+value exactly.@footnote{Pathological cases can require up to
+752 digits (!), but we doubt that you need to worry about this.}
+
+@cindex dark corner, @code{CONVFMT} variable
+Strange results can occur if you set @code{CONVFMT} to a string that doesn't
+tell @code{sprintf()} how to format floating-point numbers in a useful way.
+For example, if you forget the @samp{%} in the format, @command{awk} converts
+all numbers to the same constant string.
+
+As a special case, if a number is an integer, then the result of converting
+it to a string is @emph{always} an integer, no matter what the value of
+@code{CONVFMT} may be.  Given the following code fragment:
+
+@example
+CONVFMT = "%2.2f"
+a = 12
+b = a ""
+@end example
+
+@noindent
+@code{b} has the value @code{"12"}, not @code{"12.00"}.
+@value{DARKCORNER}
+
+@cindex sidebar, Pre-POSIX @command{awk} Used @code{OFMT} for String Conversion
+@ifdocbook
+@docbook
+<sidebar><title>Pre-POSIX @command{awk} Used @code{OFMT} for String Conversion</title>
+@end docbook
+
+@cindex POSIX @command{awk}, @code{OFMT} variable and
+@cindex @code{OFMT} variable
+@cindex portability, new @command{awk} vs.@: old @command{awk}
+@cindex @command{awk}, new vs.@: old, @code{OFMT} variable
+Prior to the POSIX standard, @command{awk} used the value
+of @code{OFMT} for converting numbers to strings.  @code{OFMT}
+specifies the output format to use when printing numbers with @code{print}.
+@code{CONVFMT} was introduced in order to separate the semantics of
+conversion from the semantics of printing.  Both @code{CONVFMT} and
+@code{OFMT} have the same default value: @code{"%.6g"}.  In the vast majority
+of cases, old @command{awk} programs do not change their behavior.
+@xref{Print} for more information on the @code{print} statement.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Pre-POSIX @command{awk} Used @code{OFMT} for String Conversion}
+
+
+@cindex POSIX @command{awk}, @code{OFMT} variable and
+@cindex @code{OFMT} variable
+@cindex portability, new @command{awk} vs.@: old @command{awk}
+@cindex @command{awk}, new vs.@: old, @code{OFMT} variable
+Prior to the POSIX standard, @command{awk} used the value
+of @code{OFMT} for converting numbers to strings.  @code{OFMT}
+specifies the output format to use when printing numbers with @code{print}.
+@code{CONVFMT} was introduced in order to separate the semantics of
+conversion from the semantics of printing.  Both @code{CONVFMT} and
+@code{OFMT} have the same default value: @code{"%.6g"}.  In the vast majority
+of cases, old @command{awk} programs do not change their behavior.
+@xref{Print} for more information on the @code{print} statement.
+@end cartouche
+@end ifnotdocbook
+
+@node Locale influences conversions
+@subsubsection Locales Can Influence Conversion
+
+Where you are can matter when it comes to converting between numbers and
+strings.  The local character set and language---the @dfn{locale}---can
+affect numeric formats.  In particular, for @command{awk} programs,
+it affects the decimal point character and the thousands-separator
+character.  The @code{"C"} locale, and most English-language locales,
+use the period character (@samp{.}) as the decimal point and don't
+have a thousands separator.  However, many (if not most) European and
+non-English locales use the comma (@samp{,}) as the decimal point
+character. European locales often use either a space or a period as
+the thousands separator, if they have one.
+
+@cindex dark corner, locale's decimal point character
+The POSIX standard says that @command{awk} always uses the period as the decimal
+point when reading the @command{awk} program source code, and for
+command-line variable assignments (@pxref{Other Arguments}).  However,
+when interpreting input data, for @code{print} and @code{printf} output,
+and for number-to-string conversion, the local decimal point character
+is used.  @value{DARKCORNER} In all cases, numbers in source code and
+in input data cannot have a thousands separator.  Here are some examples
+indicating the difference in behavior, on a GNU/Linux system:
+
+@example
+$ @kbd{export POSIXLY_CORRECT=1}                        @ii{Force POSIX behavior}
+$ @kbd{gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
+@print{} 3.14159
+$ @kbd{LC_ALL=en_DK.utf-8 gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
+@print{} 3,14159
+$ @kbd{echo 4,321 | gawk '@{ print $1 + 1 @}'}
+@print{} 5
+$ @kbd{echo 4,321 | LC_ALL=en_DK.utf-8 gawk '@{ print $1 + 1 @}'}
+@print{} 5,321
+@end example
+
+@noindent
+The @code{en_DK.utf-8} locale is for English in Denmark, where the comma acts as
+the decimal point separator.  In the normal @code{"C"} locale, @command{gawk}
+treats @samp{4,321} as 4, while in the Danish locale, it's treated
+as the full number including the fractional part, 4.321.
+
+Some earlier versions of @command{gawk} fully complied with this aspect
+of the standard.  However, many users in non-English locales complained
+about this behavior, because their data used a period as the decimal
+point, so the default behavior was restored to use a period as the
+decimal point character.  You can use the @option{--use-lc-numeric}
+option (@pxref{Options}) to force @command{gawk} to use the locale's
+decimal point character.  (@command{gawk} also uses the locale's decimal
+point character when in POSIX mode, either via @option{--posix} or the
+@env{POSIXLY_CORRECT} environment variable, as shown previously.)
+
+@ref{table-locale-affects} describes the cases in which the locale's decimal
+point character is used and when a period is used. Some of these
+features have not been described yet.
+
+@float Table,table-locale-affects
+@caption{Locale decimal point versus a period}
+@multitable @columnfractions .15 .20 .45
+@headitem Feature @tab Default @tab @option{--posix} or @option{--use-lc-numeric}
+@item @code{%'g} @tab Use locale @tab Use locale
+@item @code{%g} @tab Use period @tab Use locale
+@item Input @tab Use period @tab Use locale
+@item @code{strtonum()} @tab Use period @tab Use locale
+@end multitable
+@end float
+
+Finally, modern-day formal standards and the IEEE standard floating-point
+representation can have an unusual but important effect on the way
+@command{gawk} converts some special string values to numbers.  The details
+are presented in @ref{POSIX Floating Point Problems}.
+
+@node All Operators
+@section Operators: Doing Something with Values
+
+This @value{SECTION} introduces the @dfn{operators} that make use
+of the values provided by constants and variables.
+
+@menu
+* Arithmetic Ops::              Arithmetic operations (@samp{+}, @samp{-},
+                                etc.)
+* Concatenation::               Concatenating strings.
+* Assignment Ops::              Changing the value of a variable or a field.
+* Increment Ops::               Incrementing the numeric value of a variable.
+@end menu
+
+@node Arithmetic Ops
+@subsection Arithmetic Operators
+@cindex arithmetic operators
+@cindex operators, arithmetic
+@c @cindex addition
+@c @cindex subtraction
+@c @cindex multiplication
+@c @cindex division
+@c @cindex remainder
+@c @cindex quotient
+@c @cindex exponentiation
+
+The @command{awk} language uses the common arithmetic operators when
+evaluating expressions.  All of these arithmetic operators follow normal
+precedence rules and work as you would expect them to.
+
+The following example uses a file named @file{grades}, which contains
+a list of student names as well as three test scores per student (it's
+a small class):
+
+@example
+Pat   100 97 58
+Sandy  84 72 93
+Chris  72 92 89
+@end example
+
+@noindent
+This program takes the file @file{grades} and prints the average
+of the scores:
+
+@example
+$ @kbd{awk '@{ sum = $2 + $3 + $4 ; avg = sum / 3}
+>        @kbd{print $1, avg @}' grades}
+@print{} Pat 85
+@print{} Sandy 83
+@print{} Chris 84.3333
+@end example
+
+The following list provides the arithmetic operators in @command{awk},
+in order from the highest precedence to the lowest:
+
+@table @code
+@cindex common extensions, @code{**} operator
+@cindex extensions, common@comma{} @code{**} operator
+@cindex POSIX @command{awk}, arithmetic operators and
+@item @var{x} ^ @var{y}
+@itemx @var{x} ** @var{y}
+Exponentiation; @var{x} raised to the @var{y} power.  @samp{2 ^ 3} has
+the value eight; the character sequence @samp{**} is equivalent to
+@samp{^}. @value{COMMONEXT}
+
+@item - @var{x}
+Negation.
+
+@item + @var{x}
+Unary plus; the expression is converted to a number.
+
+@item @var{x} * @var{y}
+Multiplication.
+
+@cindex troubleshooting, division
+@cindex division
+@item @var{x} / @var{y}
+Division;  because all numbers in @command{awk} are floating-point
+numbers, the result is @emph{not} rounded to an integer---@samp{3 / 4} has
+the value 0.75.  (It is a common mistake, especially for C programmers,
+to forget that @emph{all} numbers in @command{awk} are floating point,
+and that division of integer-looking constants produces a real number,
+not an integer.)
+
+@item @var{x} % @var{y}
+Remainder; further discussion is provided in the text, just
+after this list.
+
+@item @var{x} + @var{y}
+Addition.
+
+@item @var{x} - @var{y}
+Subtraction.
+@end table
+
+Unary plus and minus have the same precedence,
+the multiplication operators all have the same precedence, and
+addition and subtraction have the same precedence.
+
+@cindex differences in @command{awk} and @command{gawk}, trunc-mod operation
+@cindex trunc-mod operation
+When computing the remainder of @samp{@var{x} % @var{y}},
+the quotient is rounded toward zero to an integer and
+multiplied by @var{y}. This result is subtracted from @var{x};
+this operation is sometimes known as ``trunc-mod.''  The following
+relation always holds:
+
+@example
+b * int(a / b) + (a % b) == a
+@end example
+
+One possibly undesirable effect of this definition of remainder is that
+@samp{@var{x} % @var{y}} is negative if @var{x} is negative.  Thus:
+
+@example
+-17 % 8 = -1
+@end example
+
+In other @command{awk} implementations, the signedness of the remainder
+may be machine-dependent.
+@c FIXME !!! what does posix say?
+
+@cindex portability, @code{**} operator and
+@cindex @code{*} (asterisk), @code{**} operator
+@cindex asterisk (@code{*}), @code{**} operator
+@quotation NOTE
+The POSIX standard only specifies the use of @samp{^}
+for exponentiation.
+For maximum portability, do not use the @samp{**} operator.
+@end quotation
+
+@node Concatenation
+@subsection String Concatenation
+@cindex Kernighan, Brian
+@quotation
+@i{It seemed like a good idea at the time.}
+@author Brian Kernighan
+@end quotation
+
+@cindex string operators
+@cindex operators, string
+@cindex concatenating
+There is only one string operation: concatenation.  It does not have a
+specific operator to represent it.  Instead, concatenation is performed by
+writing expressions next to one another, with no operator.  For example:
+
+@example
+$ @kbd{awk '@{ print "Field number one: " $1 @}' mail-list}
+@print{} Field number one: Amelia
+@print{} Field number one: Anthony
+@dots{}
+@end example
+
+Without the space in the string constant after the @samp{:}, the line
+runs together.  For example:
+
+@example
+$ @kbd{awk '@{ print "Field number one:" $1 @}' mail-list}
+@print{} Field number one:Amelia
+@print{} Field number one:Anthony
+@dots{}
+@end example
+
+@cindex troubleshooting, string concatenation
+Because string concatenation does not have an explicit operator, it is
+often necessary to ensure that it happens at the right time by using
+parentheses to enclose the items to concatenate.  For example,
+you might expect that the
+following code fragment concatenates @code{file} and @code{name}:
+
+@example
+file = "file"
+name = "name"
+print "something meaningful" > file name
+@end example
+
+@cindex Brian Kernighan's @command{awk}
+@cindex @command{mawk} utility
+@noindent
+This produces a syntax error with some versions of Unix
+@command{awk}.@footnote{It happens that BWK
+@command{awk}, @command{gawk}, and @command{mawk} all ``get it right,''
+but you should not rely on this.}
+It is necessary to use the following:
+
+@example
+print "something meaningful" > (file name)
+@end example
+
+@cindex order of evaluation, concatenation
+@cindex evaluation order, concatenation
+@cindex side effects
+Parentheses should be used around concatenation in all but the
+most common contexts, such as on the righthand side of @samp{=}.
+Be careful about the kinds of expressions used in string concatenation.
+In particular, the order of evaluation of expressions used for concatenation
+is undefined in the @command{awk} language.  Consider this example:
+
+@example
+BEGIN @{
+    a = "don't"
+    print (a " " (a = "panic"))
+@}
+@end example
+
+@noindent
+It is not defined whether the second assignment to @code{a} happens
+before or after the value of @code{a} is retrieved for producing the
+concatenated value.  The result could be either @samp{don't panic},
+or @samp{panic panic}.
+@c see test/nasty.awk for a worse example
+
+The precedence of concatenation, when mixed with other operators, is often
+counter-intuitive.  Consider this example:
+
+@ignore
+> To: bug-gnu-utils@@gnu.org
+> CC: arnold@@gnu.org
+> Subject: gawk 3.0.4 bug with {print -12 " " -24}
+> From: Russell Schulz <Russell_Schulz@locutus.ofB.ORG>
+> Date: Tue, 8 Feb 2000 19:56:08 -0700
+>
+> gawk 3.0.4 on NT gives me:
+>
+> prompt> cat bad.awk
+> BEGIN { print -12 " " -24; }
+>
+> prompt> gawk -f bad.awk
+> -12-24
+>
+> when I would expect
+>
+> -12 -24
+>
+> I have not investigated the source, or other implementations.  The
+> bug is there on my NT and DOS versions 2.15.6 .
+@end ignore
+
+@example
+$ @kbd{awk 'BEGIN @{ print -12 " " -24 @}'}
+@print{} -12-24
+@end example
+
+This ``obviously'' is concatenating @minus{}12, a space, and @minus{}24.
+But where did the space disappear to?
+The answer lies in the combination of operator precedences and
+@command{awk}'s automatic conversion rules.  To get the desired result,
+write the program this way:
+
+@example
+$ @kbd{awk 'BEGIN @{ print -12 " " (-24) @}'}
+@print{} -12 -24
+@end example
+
+This forces @command{awk} to treat the @samp{-} on the @samp{-24} as unary.
+Otherwise, it's parsed as follows:
+
+@display
+    @minus{}12 (@code{"@ "} @minus{} 24)
+@result{} @minus{}12 (0 @minus{} 24)
+@result{} @minus{}12 (@minus{}24)
+@result{} @minus{}12@minus{}24
+@end display
+
+As mentioned earlier,
+when mixing concatenation with other operators, @emph{parenthesize}.  Otherwise,
+you're never quite sure what you'll get.
+
+@node Assignment Ops
+@subsection Assignment Expressions
+@cindex assignment operators
+@cindex operators, assignment
+@cindex expressions, assignment
+@cindex @code{=} (equals sign), @code{=} operator
+@cindex equals sign (@code{=}), @code{=} operator
+An @dfn{assignment} is an expression that stores a (usually different)
+value into a variable.  For example, let's assign the value one to the variable
+@code{z}:
+
+@example
+z = 1
+@end example
+
+After this expression is executed, the variable @code{z} has the value one.
+Whatever old value @code{z} had before the assignment is forgotten.
+
+Assignments can also store string values.  For example, the
+following stores
+the value @code{"this food is good"} in the variable @code{message}:
+
+@example
+thing = "food"
+predicate = "good"
+message = "this " thing " is " predicate
+@end example
+
+@noindent
+@cindex side effects, assignment expressions
+This also illustrates string concatenation.
+The @samp{=} sign is called an @dfn{assignment operator}.  It is the
+simplest assignment operator because the value of the righthand
+operand is stored unchanged.
+Most operators (addition, concatenation, and so on) have no effect
+except to compute a value.  If the value isn't used, there's no reason to
+use the operator.  An assignment operator is different; it does
+produce a value, but even if you ignore it, the assignment still
+makes itself felt through the alteration of the variable.  We call this
+a @dfn{side effect}.
+
+@cindex lvalues/rvalues
+@cindex rvalues/lvalues
+@cindex assignment operators, lvalues/rvalues
+@cindex operators, assignment
+The lefthand operand of an assignment need not be a variable
+(@pxref{Variables}); it can also be a field
+(@pxref{Changing Fields}) or
+an array element (@pxref{Arrays}).
+These are all called @dfn{lvalues},
+which means they can appear on the lefthand side of an assignment operator.
+The righthand operand may be any expression; it produces the new value
+that the assignment stores in the specified variable, field, or array
+element. (Such values are called @dfn{rvalues}.)
+
+@cindex variables, types of
+It is important to note that variables do @emph{not} have permanent types.
+A variable's type is simply the type of whatever value was last assigned
+to it.  In the following program fragment, the variable
+@code{foo} has a numeric value at first, and a string value later on:
+
+@example
+@group
+foo = 1
+print foo
+@end group
+@group
+foo = "bar"
+print foo
+@end group
+@end example
+
+@noindent
+When the second assignment gives @code{foo} a string value, the fact that
+it previously had a numeric value is forgotten.
+
+String values that do not begin with a digit have a numeric value of
+zero. After executing the following code, the value of @code{foo} is five:
+
+@example
+foo = "a string"
+foo = foo + 5
+@end example
+
+@quotation NOTE
+Using a variable as a number and then later as a string
+can be confusing and is poor programming style.  The previous two examples
+illustrate how @command{awk} works, @emph{not} how you should write your
+programs!
+@end quotation
+
+An assignment is an expression, so it has a value---the same value that
+is assigned.  Thus, @samp{z = 1} is an expression with the value one.
+One consequence of this is that you can write multiple assignments together,
+such as:
+
+@example
+x = y = z = 5
+@end example
+
+@noindent
+This example stores the value five in all three variables
+(@code{x}, @code{y}, and @code{z}).
+It does so because the
+value of @samp{z = 5}, which is five, is stored into @code{y} and then
+the value of @samp{y = z = 5}, which is five, is stored into @code{x}.
+
+Assignments may be used anywhere an expression is called for.  For
+example, it is valid to write @samp{x != (y = 1)} to set @code{y} to one,
+and then test whether @code{x} equals one.  But this style tends to make
+programs hard to read; such nesting of assignments should be avoided,
+except perhaps in a one-shot program.
+
+@cindex @code{+} (plus sign), @code{+=} operator
+@cindex plus sign (@code{+}), @code{+=} operator
+Aside from @samp{=}, there are several other assignment operators that
+do arithmetic with the old value of the variable.  For example, the
+operator @samp{+=} computes a new value by adding the righthand value
+to the old value of the variable.  Thus, the following assignment adds
+five to the value of @code{foo}:
+
+@example
+foo += 5
+@end example
+
+@noindent
+This is equivalent to the following:
+
+@example
+foo = foo + 5
+@end example
+
+@noindent
+Use whichever makes the meaning of your program clearer.
+
+There are situations where using @samp{+=} (or any assignment operator)
+is @emph{not} the same as simply repeating the lefthand operand in the
+righthand expression.  For example:
+
+@cindex Rankin, Pat
+@example
+@group
+# Thanks to Pat Rankin for this example
+BEGIN  @{
+    foo[rand()] += 5
+    for (x in foo)
+       print x, foo[x]
+@end group
+
+@group
+    bar[rand()] = bar[rand()] + 5
+    for (x in bar)
+       print x, bar[x]
+@}
+@end group
+@end example
+
+@cindex operators, assignment, evaluation order
+@cindex assignment operators, evaluation order
+@noindent
+The indices of @code{bar} are practically guaranteed to be different, because
+@code{rand()} returns different values each time it is called.
+(Arrays and the @code{rand()} function haven't been covered yet.
+@xref{Arrays},
+and
+@ifnotdocbook
+@pxref{Numeric Functions}
+@end ifnotdocbook
+@ifdocbook
+@ref{Numeric Functions}
+@end ifdocbook
+for more information.)
+This example illustrates an important fact about assignment
+operators: the lefthand expression is only evaluated @emph{once}.
+
+It is up to the implementation as to which expression is evaluated
+first, the lefthand or the righthand.
+Consider this example:
+
+@example
+i = 1
+a[i += 2] = i + 1
+@end example
+
+@noindent
+The value of @code{a[3]} could be either two or four.
+
+@ref{table-assign-ops} lists the arithmetic assignment operators.  In each
+case, the righthand operand is an expression whose value is converted
+to a number.
+
+@cindex @code{-} (hyphen), @code{-=} operator
+@cindex hyphen (@code{-}), @code{-=} operator
+@cindex @code{*} (asterisk), @code{*=} operator
+@cindex asterisk (@code{*}), @code{*=} operator
+@cindex @code{/} (forward slash), @code{/=} operator
+@cindex forward slash (@code{/}), @code{/=} operator
+@cindex @code{%} (percent sign), @code{%=} operator
+@cindex percent sign (@code{%}), @code{%=} operator
+@cindex @code{^} (caret), @code{^=} operator
+@cindex caret (@code{^}), @code{^=} operator
+@cindex @code{*} (asterisk), @code{**=} operator
+@cindex asterisk (@code{*}), @code{**=} operator
+@float Table,table-assign-ops
+@caption{Arithmetic assignment operators}
+@multitable @columnfractions .30 .70
+@headitem Operator @tab Effect
+@item @var{lvalue} @code{+=} @var{increment} @tab Add @var{increment} to the value of @var{lvalue}.
+@item @var{lvalue} @code{-=} @var{decrement} @tab Subtract @var{decrement} from the value of @var{lvalue}.
+@item @var{lvalue} @code{*=} @var{coefficient} @tab Multiply the value of @var{lvalue} by @var{coefficient}.
+@item @var{lvalue} @code{/=} @var{divisor} @tab Divide the value of @var{lvalue} by @var{divisor}.
+@item @var{lvalue} @code{%=} @var{modulus} @tab Set @var{lvalue} to its remainder by @var{modulus}.
+@cindex common extensions, @code{**=} operator
+@cindex extensions, common@comma{} @code{**=} operator
+@cindex @command{awk} language, POSIX version
+@cindex POSIX @command{awk}
+@item @var{lvalue} @code{^=} @var{power} @tab Raise @var{lvalue} to the power @var{power}.
+@item @var{lvalue} @code{**=} @var{power} @tab Raise @var{lvalue} to the power @var{power}. @value{COMMONEXT}
+@end multitable
+@end float
+
+@cindex POSIX @command{awk}, @code{**=} operator and
+@cindex portability, @code{**=} operator and
+@quotation NOTE
+Only the @samp{^=} operator is specified by POSIX.
+For maximum portability, do not use the @samp{**=} operator.
+@end quotation
+
+@cindex sidebar, Syntactic Ambiguities Between @samp{/=} and Regular Expressions
+@ifdocbook
+@docbook
+<sidebar><title>Syntactic Ambiguities Between @samp{/=} and Regular Expressions</title>
+@end docbook
+
+@cindex dark corner, regexp constants, @code{/=} operator and
+@cindex @code{/} (forward slash), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant
+@cindex forward slash (@code{/}), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant
+@cindex regexp constants, @code{/=@dots{}/}, @code{/=} operator and
+
+@c derived from email from  "Nelson H. F. Beebe" <beebe@math.utah.edu>
+@c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT)
+
+@cindex dark corner, @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+@cindex ambiguity, syntactic: @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+@cindex syntactic ambiguity: @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+@cindex @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+There is a syntactic ambiguity between the @code{/=} assignment
+operator and regexp constants whose first character is an @samp{=}.
+@value{DARKCORNER}
+This is most notable in some commercial @command{awk} versions.
+For example:
+
+@example
+$ @kbd{awk /==/ /dev/null}
+@error{} awk: syntax error at source line 1
+@error{}  context is
+@error{}         >>> /= <<<
+@error{} awk: bailing out at source line 1
+@end example
+
+@noindent
+A workaround is:
+
+@example
+awk '/[=]=/' /dev/null
+@end example
+
+@command{gawk} does not have this problem; BWK @command{awk}
+and @command{mawk} also do not.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Syntactic Ambiguities Between @samp{/=} and Regular Expressions}
+
+
+@cindex dark corner, regexp constants, @code{/=} operator and
+@cindex @code{/} (forward slash), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant
+@cindex forward slash (@code{/}), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant
+@cindex regexp constants, @code{/=@dots{}/}, @code{/=} operator and
+
+@c derived from email from  "Nelson H. F. Beebe" <beebe@math.utah.edu>
+@c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT)
+
+@cindex dark corner, @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+@cindex ambiguity, syntactic: @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+@cindex syntactic ambiguity: @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+@cindex @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+There is a syntactic ambiguity between the @code{/=} assignment
+operator and regexp constants whose first character is an @samp{=}.
+@value{DARKCORNER}
+This is most notable in some commercial @command{awk} versions.
+For example:
+
+@example
+$ @kbd{awk /==/ /dev/null}
+@error{} awk: syntax error at source line 1
+@error{}  context is
+@error{}         >>> /= <<<
+@error{} awk: bailing out at source line 1
+@end example
+
+@noindent
+A workaround is:
+
+@example
+awk '/[=]=/' /dev/null
+@end example
+
+@command{gawk} does not have this problem; BWK @command{awk}
+and @command{mawk} also do not.
+@end cartouche
+@end ifnotdocbook
+
+@node Increment Ops
+@subsection Increment and Decrement Operators
+
+@cindex increment operators
+@cindex operators, decrement/increment
+@dfn{Increment} and @dfn{decrement operators} increase or decrease the value of
+a variable by one.  An assignment operator can do the same thing, so
+the increment operators add no power to the @command{awk} language; however, they
+are convenient abbreviations for very common operations.
+
+@cindex side effects
+@cindex @code{+} (plus sign), @code{++} operator
+@cindex plus sign (@code{+}), @code{++} operator
+@cindex side effects, decrement/increment operators
+The operator used for adding one is written @samp{++}.  It can be used to increment
+a variable either before or after taking its value.
+To @dfn{pre-increment} a variable @code{v}, write @samp{++v}.  This adds
+one to the value of @code{v}---that new value is also the value of the
+expression. (The assignment expression @samp{v += 1} is completely equivalent.)
+Writing the @samp{++} after the variable specifies @dfn{post-increment}.  This
+increments the variable value just the same; the difference is that the
+value of the increment expression itself is the variable's @emph{old}
+value.  Thus, if @code{foo} has the value four, then the expression @samp{foo++}
+has the value four, but it changes the value of @code{foo} to five.
+In other words, the operator returns the old value of the variable,
+but with the side effect of incrementing it.
+
+The post-increment @samp{foo++} is nearly the same as writing @samp{(foo
++= 1) - 1}.  It is not perfectly equivalent because all numbers in
+@command{awk} are floating point---in floating point, @samp{foo + 1 - 1} does
+not necessarily equal @code{foo}.  But the difference is minute as
+long as you stick to numbers that are fairly small (less than
+@iftex
+@math{10^{12}}).
+@end iftex
+@ifinfo
+10e12).
+@end ifinfo
+@ifnottex
+@ifnotinfo
+10@sup{12}).
+@end ifnotinfo
+@end ifnottex
+
+@cindex @code{$} (dollar sign), incrementing fields and arrays
+@cindex dollar sign (@code{$}), incrementing fields and arrays
+Fields and array elements are incremented
+just like variables.  (Use @samp{$(i++)} when you want to do a field reference
+and a variable increment at the same time.  The parentheses are necessary
+because of the precedence of the field reference operator @samp{$}.)
+
+@cindex decrement operators
+The decrement operator @samp{--} works just like @samp{++}, except that
+it subtracts one instead of adding it.  As with @samp{++}, it can be used before
+the lvalue to pre-decrement or after it to post-decrement.
+Following is a summary of increment and decrement expressions:
+
+@table @code
+@cindex @code{+} (plus sign), @code{++} operator
+@cindex plus sign (@code{+}), @code{++} operator
+@item ++@var{lvalue}
+Increment @var{lvalue}, returning the new value as the
+value of the expression.
+
+@item @var{lvalue}++
+Increment @var{lvalue}, returning the @emph{old} value of @var{lvalue}
+as the value of the expression.
+
+@cindex @code{-} (hyphen), @code{--} operator
+@cindex hyphen (@code{-}), @code{--} operator
+@item --@var{lvalue}
+Decrement @var{lvalue}, returning the new value as the
+value of the expression.
+(This expression is
+like @samp{++@var{lvalue}}, but instead of adding, it subtracts.)
+
+@item @var{lvalue}--
+Decrement @var{lvalue}, returning the @emph{old} value of @var{lvalue}
+as the value of the expression.
+(This expression is
+like @samp{@var{lvalue}++}, but instead of adding, it subtracts.)
+@end table
+
+@cindex sidebar, Operator Evaluation Order
+@ifdocbook
+@docbook
+<sidebar><title>Operator Evaluation Order</title>
+@end docbook
+
+@cindex precedence
+@cindex operators, precedence of
+@cindex portability, operators
+@cindex evaluation order
+@cindex Marx, Groucho
+@quotation
+@i{Doctor, it hurts when I do this!@*
+Then don't do that!}
+@author Groucho Marx
+@end quotation
+
+@noindent
+What happens for something like the following?
+
+@example
+b = 6
+print b += b++
+@end example
+
+@noindent
+Or something even stranger?
+
+@example
+b = 6
+b += ++b + b++
+print b
+@end example
+
+@cindex side effects
+In other words, when do the various side effects prescribed by the
+postfix operators (@samp{b++}) take effect?
+When side effects happen is @dfn{implementation-defined}.
+In other words, it is up to the particular version of @command{awk}.
+The result for the first example may be 12 or 13, and for the second, it
+may be 22 or 23.
+
+In short, doing things like this is not recommended and definitely
+not anything that you can rely upon for portability.
+You should avoid such things in your own programs.
+@c You'll sleep better at night and be able to look at yourself
+@c in the mirror in the morning.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Operator Evaluation Order}
+
+
+@cindex precedence
+@cindex operators, precedence of
+@cindex portability, operators
+@cindex evaluation order
+@cindex Marx, Groucho
+@quotation
+@i{Doctor, it hurts when I do this!@*
+Then don't do that!}
+@author Groucho Marx
+@end quotation
+
+@noindent
+What happens for something like the following?
+
+@example
+b = 6
+print b += b++
+@end example
+
+@noindent
+Or something even stranger?
+
+@example
+b = 6
+b += ++b + b++
+print b
+@end example
+
+@cindex side effects
+In other words, when do the various side effects prescribed by the
+postfix operators (@samp{b++}) take effect?
+When side effects happen is @dfn{implementation-defined}.
+In other words, it is up to the particular version of @command{awk}.
+The result for the first example may be 12 or 13, and for the second, it
+may be 22 or 23.
+
+In short, doing things like this is not recommended and definitely
+not anything that you can rely upon for portability.
+You should avoid such things in your own programs.
+@c You'll sleep better at night and be able to look at yourself
+@c in the mirror in the morning.
+@end cartouche
+@end ifnotdocbook
+
+@node Truth Values and Conditions
+@section Truth Values and Conditions
+
+In certain contexts, expression values also serve as ``truth values''; i.e.,
+they determine what should happen next as the program runs. This
+@value{SECTION} describes how @command{awk} defines ``true'' and ``false''
+and how values are compared.
+
+@menu
+* Truth Values::                What is ``true'' and what is ``false''.
+* Typing and Comparison::       How variables acquire types and how this
+                                affects comparison of numbers and strings with
+                                @samp{<}, etc.
+* Boolean Ops::                 Combining comparison expressions using boolean
+                                operators @samp{||} (``or''), @samp{&&}
+                                (``and'') and @samp{!} (``not'').
+* Conditional Exp::             Conditional expressions select between two
+                                subexpressions under control of a third
+                                subexpression.
+@end menu
+
+@node Truth Values
+@subsection True and False in @command{awk}
+@cindex truth values
+@cindex logical false/true
+@cindex false, logical
+@cindex true, logical
+
+@cindex null strings
+Many programming languages have a special representation for the concepts
+of ``true'' and ``false.''  Such languages usually use the special
+constants @code{true} and @code{false}, or perhaps their uppercase
+equivalents.
+However, @command{awk} is different.
+It borrows a very simple concept of true and
+false from C.  In @command{awk}, any nonzero numeric value @emph{or} any
+nonempty string value is true.  Any other value (zero or the null
+string, @code{""}) is false.  The following program prints @samp{A strange
+truth value} three times:
+
+@example
+BEGIN @{
+   if (3.1415927)
+       print "A strange truth value"
+   if ("Four Score And Seven Years Ago")
+       print "A strange truth value"
+   if (j = 57)
+       print "A strange truth value"
+@}
+@end example
+
+@cindex dark corner, @code{"0"} is actually true
+There is a surprising consequence of the ``nonzero or non-null'' rule:
+the string constant @code{"0"} is actually true, because it is non-null.
+@value{DARKCORNER}
+
+@node Typing and Comparison
+@subsection Variable Typing and Comparison Expressions
+@quotation
+@i{The Guide is definitive. Reality is frequently inaccurate.}
+@author Douglas Adams, @cite{The Hitchhiker's Guide to the Galaxy}
+@end quotation
+@c 2/2015: Antonio Colombo points out that this is really from
+@c The Restaurant at the End of the Universe. But I'm going to
+@c leave it alone.
+
+@cindex comparison expressions
+@cindex expressions, comparison
+@cindex expressions, matching, See comparison expressions
+@cindex matching, expressions, See comparison expressions
+@cindex relational operators, See comparison operators
+@cindex operators, relational, See operators@comma{} comparison
+@cindex variable typing
+@cindex variables, types of, comparison expressions and
+Unlike in other programming languages, in @command{awk} variables do not have a
+fixed type. Instead, they can be either a number or a string, depending
+upon the value that is assigned to them.
+We look now at how variables are typed, and how @command{awk}
+compares variables.
+
+@menu
+* Variable Typing::             String type versus numeric type.
+* Comparison Operators::        The comparison operators.
+* POSIX String Comparison::     String comparison with POSIX rules.
+@end menu
+
+@node Variable Typing
+@subsubsection String Type versus Numeric Type
+
+Scalar objects in @command{awk} (variables, array elements, and fields)
+are @emph{dynamically} typed.  This means their type can change as the
+program runs, from @dfn{untyped} before any use,@footnote{@command{gawk}
+calls this @dfn{unassigned}, as the following example shows.} to string
+or number, and then from string to number or number to string, as the
+program progresses.  (@command{gawk} also provides regexp-typed scalars,
+but let's ignore that for now; @pxref{Strong Regexp Constants}.)
+
+You can't do much with untyped variables, other than tell that they
+are untyped. The following program tests @code{a} against @code{""}
+and @code{0}; the test succeeds when @code{a} has never been assigned
+a value.  It also uses the built-in @code{typeof()} function
+(not presented yet; @pxref{Type Functions}) to show @code{a}'s type:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print (a == "" && a == 0 ?}
+> @kbd{"a is untyped" : "a has a type!") ; print typeof(a) @}'}
+@print{} a is untyped
+@print{} unassigned
+@end example
+
+A scalar has numeric type when assigned a numeric value,
+such as from a numeric constant, or from another scalar
+with numeric type:
+
+@example
+$ @kbd{gawk 'BEGIN @{ a = 42 ; print typeof(a)}
+> @kbd{b = a ; print typeof(b) @}'}
+number
+number
+@end example
+
+Similarly, a scalar has string type when assigned a string
+value, such as from a string constant, or from another scalar
+with string type:
+
+@example
+$ @kbd{gawk 'BEGIN @{ a = "forty two" ; print typeof(a)}
+> @kbd{b = a ; print typeof(b) @}'}
+string
+string
+@end example
+
+So far, this is all simple and straightforward.  What happens, though,
+when @command{awk} has to process data from a user?  Let's start with
+field data.  What should the following command produce as output?
+
+@example
+echo hello | awk '@{ printf("%s %s < 42\n", $1,
+                           ($1 < 42 ? "is" : "is not")) @}'
+@end example
+
+@noindent
+Since @samp{hello} is alphabetic data, @command{awk} can only do a string
+comparison.  Internally, it converts @code{42} into @code{"42"} and compares
+the two string values @code{"hello"} and @code{"42"}. Here's the result:
+
+@example
+$ @kbd{echo hello | awk '@{ printf("%s %s < 42\n", $1,}
+> @kbd{                           ($1 < 42 ? "is" : "is not")) @}'}
+@print{} hello is not < 42
+@end example
+
+However, what happens when data from a user @emph{looks like} a number?
+On the one hand, in reality, the input data consists of characters, not
+binary numeric
+values.  But, on the other hand, the data looks numeric, and @command{awk}
+really ought to treat it as such. And indeed, it does:
+
+@example
+$ @kbd{echo 37 | awk '@{ printf("%s %s < 42\n", $1,}
+> @kbd{                        ($1 < 42 ? "is" : "is not")) @}'}
+@print{} 37 is < 42
+@end example
+
+Here are the rules for when @command{awk}
+treats data as a number, and for when it treats data as a string.
+
+@cindex numeric, strings
+@cindex strings, numeric
+@cindex POSIX @command{awk}, numeric strings and
+The POSIX standard uses the term @dfn{numeric string} for input data that
+looks numeric.  The @samp{37} in the previous example is a numeric string.
+So what is the type of a numeric string? Answer: numeric.
+
+The type of a variable is important because the types of two variables
+determine how they are compared.
+Variable typing follows these definitions and rules:
+
+@itemize @value{BULLET}
+@item
+A numeric constant or the result of a numeric operation has the @dfn{numeric}
+attribute.
+
+@item
+A string constant or the result of a string operation has the @dfn{string}
+attribute.
+
+@item
+Fields, @code{getline} input, @code{FILENAME}, @code{ARGV} elements,
+@code{ENVIRON} elements, and the elements of an array created by
+@code{match()}, @code{split()}, and @code{patsplit()} that are numeric
+strings have the @dfn{strnum} attribute.@footnote{Thus, a POSIX
+numeric string and @command{gawk}'s strnum are the same thing.}
+Otherwise, they have
+the @dfn{string} attribute.  Uninitialized variables also have the
+@dfn{strnum} attribute.
+
+@item
+Attributes propagate across assignments but are not changed by
+any use.
+@c (Although a use may cause the entity to acquire an additional
+@c value such that it has both a numeric and string value, this leaves the
+@c attribute unchanged.)
+@c This is important but not relevant
+@end itemize
+
+The last rule is particularly important. In the following program,
+@code{a} has numeric type, even though it is later used in a string
+operation:
+
+@example
+BEGIN @{
+     a = 12.345
+     b = a " is a cute number"
+     print b
+@}
+@end example
+
+When two operands are compared, either string comparison or numeric comparison
+may be used. This depends upon the attributes of the operands, according to the
+following symmetric matrix:
+
+@c thanks to Karl Berry, kb@cs.umb.edu, for major help with TeX tables
+@tex
+\centerline{
+\vbox{\bigskip % space above the table (about 1 linespace)
+% Because we have vertical rules, we can't let TeX insert interline space
+% in its usual way.
+\offinterlineskip
+%
+% Define the table template. & separates columns, and \cr ends the
+% template (and each row). # is replaced by the text of that entry on
+% each row. The template for the first column breaks down like this:
+%   \strut -- a way to make each line have the height and depth
+%             of a normal line of type, since we turned off interline spacing.
+%   \hfil -- infinite glue; has the effect of right-justifying in this case.
+%   #     -- replaced by the text (for instance, `STRNUM', in the last row).
+%   \quad -- about the width of an `M'. Just separates the columns.
+%
+% The second column (\vrule#) is what generates the vertical rule that
+% spans table rows.
+%
+% The doubled && before the next entry means `repeat the following
+% template as many times as necessary on each line' -- in our case, twice.
+%
+% The template itself, \quad#\hfil, left-justifies with a little space before.
+%
+\halign{\strut\hfil#\quad&\vrule#&&\quad#\hfil\cr
+	&&STRING	&NUMERIC	&STRNUM\cr
+% The \omit tells TeX to skip inserting the template for this column on
+% this particular row. In this case, we only want a little extra space
+% to separate the heading row from the rule below it.  the depth 2pt --
+% `\vrule depth 2pt' is that little space.
+\omit	&depth 2pt\cr
+% This is the horizontal rule below the heading. Since it has nothing to
+% do with the columns of the table, we use \noalign to get it in there.
+\noalign{\hrule}
+% Like above, this time a little more space.
+\omit	&depth 4pt\cr
+% The remaining rows have nothing special about them.
+STRING	&&string	&string		&string\cr
+NUMERIC	&&string	&numeric	&numeric\cr
+STRNUM  &&string	&numeric	&numeric\cr
+}}}
+@end tex
+@ifnottex
+@ifnotdocbook
+@verbatim
+        +----------------------------------------------
+        |       STRING          NUMERIC         STRNUM
+--------+----------------------------------------------
+        |
+STRING  |       string          string          string
+        |
+NUMERIC |       string          numeric         numeric
+        |
+STRNUM  |       string          numeric         numeric
+--------+----------------------------------------------
+@end verbatim
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<informaltable>
+<tgroup cols="4">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<colspec colname="3" align="left"/>
+<colspec colname="4" align="left"/>
+<thead>
+<row>
+<entry/>
+<entry>STRING</entry>
+<entry>NUMERIC</entry>
+<entry>STRNUM</entry>
+</row>
+</thead>
+
+<tbody>
+<row>
+<entry><emphasis role="bold">STRING</emphasis></entry>
+<entry>string</entry>
+<entry>string</entry>
+<entry>string</entry>
+</row>
+
+<row>
+<entry><emphasis role="bold">NUMERIC</emphasis></entry>
+<entry>string</entry>
+<entry>numeric</entry>
+<entry>numeric</entry>
+</row>
+
+<row>
+<entry><emphasis role="bold">STRNUM</emphasis></entry>
+<entry>string</entry>
+<entry>numeric</entry>
+<entry>numeric</entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+The basic idea is that user input that looks numeric---and @emph{only}
+user input---should be treated as numeric, even though it is actually
+made of characters and is therefore also a string.
+Thus, for example, the string constant @w{@code{" +3.14"}},
+when it appears in program source code,
+is a string---even though it looks numeric---and
+is @emph{never} treated as a number for comparison
+purposes.
+
+In short, when one operand is a ``pure'' string, such as a string
+constant, then a string comparison is performed.  Otherwise, a
+numeric comparison is performed.
+(The primary difference between a number and a strnum is that
+for strnums @command{gawk} preserves the original string value that
+the scalar had when it came in.)
+
+This point bears additional emphasis:
+Input that looks numeric @emph{is} numeric.
+All other input is treated as strings.
+
+Thus, the six-character input string @w{@samp{ +3.14}} receives the
+strnum attribute. In contrast, the eight characters
+@w{@code{" +3.14"}} appearing in program text comprise a string constant.
+The following examples print @samp{1} when the comparison between
+the two different constants is true, and @samp{0} otherwise:
+
+@c 22.9.2014: Tested with mawk and BWK awk, got same results.
+@example
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == " +3.14") @}'}    @ii{True}
+@print{} 1
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == "+3.14") @}'}     @ii{False}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == "3.14") @}'}      @ii{False}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == 3.14) @}'}        @ii{True}
+@print{} 1
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == " +3.14") @}'}    @ii{False}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == "+3.14") @}'}     @ii{True}
+@print{} 1
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == "3.14") @}'}      @ii{False}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == 3.14) @}'}        @ii{True}
+@print{} 1
+@end example
+
+You can see the type of an input field (or other user input)
+using @code{typeof()}:
+
+@example
+$ @kbd{echo hello 37 | gawk '@{ print typeof($1), typeof($2) @}'}
+@print{} string strnum
+@end example
+
+@node Comparison Operators
+@subsubsection Comparison Operators
+
+@dfn{Comparison expressions} compare strings or numbers for
+relationships such as equality.  They are written using @dfn{relational
+operators}, which are a superset of those in C.
+@ref{table-relational-ops} describes them.
+
+@cindex @code{<} (left angle bracket), @code{<} operator
+@cindex left angle bracket (@code{<}), @code{<} operator
+@cindex @code{<} (left angle bracket), @code{<=} operator
+@cindex left angle bracket (@code{<}), @code{<=} operator
+@cindex @code{>} (right angle bracket), @code{>=} operator
+@cindex right angle bracket (@code{>}), @code{>=} operator
+@cindex @code{>} (right angle bracket), @code{>} operator
+@cindex right angle bracket (@code{>}), @code{>} operator
+@cindex @code{=} (equals sign), @code{==} operator
+@cindex equals sign (@code{=}), @code{==} operator
+@cindex @code{!} (exclamation point), @code{!=} operator
+@cindex exclamation point (@code{!}), @code{!=} operator
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@cindex @code{in} operator
+@float Table,table-relational-ops
+@caption{Relational operators}
+@multitable @columnfractions .25 .75
+@headitem Expression @tab Result
+@item @var{x} @code{<} @var{y} @tab True if @var{x} is less than @var{y}
+@item @var{x} @code{<=} @var{y} @tab True if @var{x} is less than or equal to @var{y}
+@item @var{x} @code{>} @var{y} @tab True if @var{x} is greater than @var{y}
+@item @var{x} @code{>=} @var{y} @tab True if @var{x} is greater than or equal to @var{y}
+@item @var{x} @code{==} @var{y} @tab True if @var{x} is equal to @var{y}
+@item @var{x} @code{!=} @var{y} @tab True if @var{x} is not equal to @var{y}
+@item @var{x} @code{~} @var{y} @tab True if the string @var{x} matches the regexp denoted by @var{y}
+@item @var{x} @code{!~} @var{y} @tab True if the string @var{x} does not match the regexp denoted by @var{y}
+@item @var{subscript} @code{in} @var{array} @tab True if the array @var{array} has an element with the subscript @var{subscript}
+@end multitable
+@end float
+
+Comparison expressions have the value one if true and zero if false.
+When comparing operands of mixed types, numeric operands are converted
+to strings using the value of @code{CONVFMT}
+(@pxref{Conversion}).
+
+Strings are compared
+by comparing the first character of each, then the second character of each,
+and so on.  Thus, @code{"10"} is less than @code{"9"}.  If there are two
+strings where one is a prefix of the other, the shorter string is less than
+the longer one.  Thus, @code{"abc"} is less than @code{"abcd"}.
+
+@cindex troubleshooting, @code{==} operator
+It is very easy to accidentally mistype the @samp{==} operator and
+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
+@group
+if (a = b)   # oops! should be a == b
+   @dots{}
+else
+   @dots{}
+@end group
+@end example
+
+@noindent
+Unless @code{b} happens to be zero or the null string, the @code{if}
+part of the test always succeeds.  Because the operators are
+so similar, this kind of error is very difficult to spot when
+scanning the source code.
+
+The following list of expressions illustrates the kinds of comparisons
+@command{awk} performs, as well as what the result of each comparison is:
+
+@table @code
+@item 1.5 <= 2.0
+Numeric comparison (true)
+
+@item "abc" >= "xyz"
+String comparison (false)
+
+@item 1.5 != " +2"
+String comparison (true)
+
+@item "1e2" < "3"
+String comparison (true)
+
+@item a = 2; b = "2"
+@itemx a == b
+String comparison (true)
+
+@item a = 2; b = " +2"
+@itemx a == b
+String comparison (false)
+@end table
+
+In this example:
+
+@example
+$ @kbd{echo 1e2 3 | awk '@{ print ($1 < $2) ? "true" : "false" @}'}
+@print{} false
+@end example
+
+@cindex comparison expressions, string vs.@: regexp
+@c @cindex string comparison vs.@: regexp comparison
+@c @cindex regexp comparison vs.@: string comparison
+@noindent
+the result is @samp{false} because both @code{$1} and @code{$2}
+are user input.  They are numeric strings---therefore both have
+the strnum attribute, dictating a numeric comparison.
+The purpose of the comparison rules and the use of numeric strings is
+to attempt to produce the behavior that is ``least surprising,'' while
+still ``doing the right thing.''
+
+String comparisons and regular expression comparisons are very different.
+For example:
+
+@example
+x == "foo"
+@end example
+
+@noindent
+has the value one, or is true if the variable @code{x}
+is precisely @samp{foo}.  By contrast:
+
+@example
+x ~ /foo/
+@end example
+
+@noindent
+has the value one if @code{x} contains @samp{foo}, such as
+@code{"Oh, what a fool am I!"}.
+
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+The righthand operand of the @samp{~} and @samp{!~} operators may be
+either a regexp constant (@code{/}@dots{}@code{/}) or an ordinary
+expression. In the latter case, the value of the expression as a string is used as a
+dynamic regexp (@pxref{Regexp Usage}; also
+@pxref{Computed Regexps}).
+
+@cindex @command{awk}, regexp constants and
+@cindex regexp constants
+A constant regular
+expression in slashes by itself is also an expression.
+@code{/@var{regexp}/} is an abbreviation for the following comparison expression:
+
+@example
+$0 ~ /@var{regexp}/
+@end example
+
+One special place where @code{/foo/} is @emph{not} an abbreviation for
+@samp{$0 ~ /foo/} is when it is the righthand operand of @samp{~} or
+@samp{!~}.
+@xref{Using Constant Regexps},
+where this is discussed in more detail.
+
+@node POSIX String Comparison
+@subsubsection String Comparison Based on Locale Collating Order
+
+The POSIX standard used to say that all string comparisons are
+performed based on the locale's @dfn{collating order}. This
+is the order in which characters sort, as defined by the locale
+(for more discussion, @pxref{Locales}).  This order is usually very
+different from the results obtained when doing straight byte-by-byte
+comparison.@footnote{Technically, string comparison is supposed to behave
+the same way as if the strings were compared with the C @code{strcoll()}
+function.}
+
+Because this behavior differs considerably from existing practice,
+@command{gawk} only implemented it when in POSIX mode (@pxref{Options}).
+Here is an example to illustrate the difference, in an @code{en_US.UTF-8}
+locale:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf("ABC < abc = %s\n",}
+>                     @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
+@print{} ABC < abc = TRUE
+$ @kbd{gawk --posix 'BEGIN @{ printf("ABC < abc = %s\n",}
+>                             @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
+@print{} ABC < abc = FALSE
+@end example
+
+Fortunately, as of August 2016, comparison based on locale
+collating order is no longer required for the @code{==} and @code{!=}
+operators.@footnote{See @uref{http://austingroupbugs.net/view.php?id=1070,
+the Austin Group website}.} However, comparison based on locales is still
+required for @code{<}, @code{<=}, @code{>}, and @code{>=}.  POSIX thus
+recommends as follows:
+
+@quotation
+Since the @code{==} operator checks whether strings are identical,
+not whether they collate equally, applications needing to check whether
+strings collate equally can use:
+
+@example
+a <= b && a >= b
+@end example
+@end quotation
+
+As of @value{PVERSION} 4.2, @command{gawk} continues to use locale
+collating order for @code{<}, @code{<=}, @code{>}, and @code{>=} only
+in POSIX mode.
+
+@ignore
+References: http://austingroupbugs.net/view.php?id=963
+and http://austingroupbugs.net/view.php?id=1070.
+@end ignore
+
+@node Boolean Ops
+@subsection Boolean Expressions
+@cindex and Boolean-logic operator
+@cindex or Boolean-logic operator
+@cindex not Boolean-logic operator
+@cindex expressions, Boolean
+@cindex Boolean expressions
+@cindex operators, Boolean, See Boolean expressions
+@cindex Boolean operators, See Boolean expressions
+@cindex logical operators, See Boolean expressions
+@cindex operators, logical, See Boolean expressions
+
+A @dfn{Boolean expression} is a combination of comparison expressions or
+matching expressions, using the Boolean operators ``or''
+(@samp{||}), ``and'' (@samp{&&}), and ``not'' (@samp{!}), along with
+parentheses to control nesting.  The truth value of the Boolean expression is
+computed by combining the truth values of the component expressions.
+Boolean expressions are also referred to as @dfn{logical expressions}.
+The terms are equivalent.
+
+Boolean expressions can be used wherever comparison and matching
+expressions can be used.  They can be used in @code{if}, @code{while},
+@code{do}, and @code{for} statements
+(@pxref{Statements}).
+They have numeric values (one if true, zero if false) that come into play
+if the result of the Boolean expression is stored in a variable or
+used in arithmetic.
+
+In addition, every Boolean expression is also a valid pattern, so
+you can use one as a pattern to control the execution of rules.
+The Boolean operators are:
+
+@table @code
+@item @var{boolean1} && @var{boolean2}
+True if both @var{boolean1} and @var{boolean2} are true.  For example,
+the following statement prints the current input record if it contains
+both @samp{edu} and @samp{li}:
+
+@example
+if ($0 ~ /edu/ && $0 ~ /li/) print
+@end example
+
+@cindex side effects, Boolean operators
+The subexpression @var{boolean2} is evaluated only if @var{boolean1}
+is true.  This can make a difference when @var{boolean2} contains
+expressions that have side effects. In the case of @samp{$0 ~ /foo/ &&
+($2 == bar++)}, the variable @code{bar} is not incremented if there is
+no substring @samp{foo} in the record.
+
+@item @var{boolean1} || @var{boolean2}
+True if at least one of @var{boolean1} or @var{boolean2} is true.
+For example, the following statement prints all records in the input
+that contain @emph{either} @samp{edu} or
+@samp{li}:
+
+@example
+if ($0 ~ /edu/ || $0 ~ /li/) print
+@end example
+
+The subexpression @var{boolean2} is evaluated only if @var{boolean1}
+is false.  This can make a difference when @var{boolean2} contains
+expressions that have side effects.
+(Thus, this test never really distinguishes records that contain both
+@samp{edu} and @samp{li}---as soon as @samp{edu} is matched,
+the full test succeeds.)
+
+@item ! @var{boolean}
+True if @var{boolean} is false.  For example,
+the following program prints @samp{no home!} in
+the unusual event that the @env{HOME} environment
+variable is not defined:
+
+@example
+BEGIN @{ if (! ("HOME" in ENVIRON))
+            print "no home!" @}
+@end example
+
+(The @code{in} operator is described in
+@ref{Reference to Elements}.)
+@end table
+
+@cindex short-circuit operators
+@cindex operators, short-circuit
+@cindex @code{&} (ampersand), @code{&&} operator
+@cindex ampersand (@code{&}), @code{&&} operator
+@cindex @code{|} (vertical bar), @code{||} operator
+@cindex vertical bar (@code{|}), @code{||} operator
+The @samp{&&} and @samp{||} operators are called @dfn{short-circuit}
+operators because of the way they work.  Evaluation of the full expression
+is ``short-circuited'' if the result can be determined partway through
+its evaluation.
+
+@cindex line continuations
+Statements that end with @samp{&&} or @samp{||} can be continued simply
+by putting a newline after them.  But you cannot put a newline in front
+of either of these operators without using backslash continuation
+(@pxref{Statements/Lines}).
+
+@cindex @code{!} (exclamation point), @code{!}  operator
+@cindex exclamation point (@code{!}), @code{!} operator
+@cindex newlines
+@cindex variables, flag
+@cindex flag variables
+The actual value of an expression using the @samp{!} operator is
+either one or zero, depending upon the truth value of the expression it
+is applied to.
+The @samp{!} operator is often useful for changing the sense of a flag
+variable from false to true and back again. For example, the following
+program is one way to print lines in between special bracketing lines:
+
+@example
+$1 == "START"   @{ interested = ! interested; next @}
+interested      @{ print @}
+$1 == "END"     @{ interested = ! interested; next @}
+@end example
+
+@noindent
+The variable @code{interested}, as with all @command{awk} variables, starts
+out initialized to zero, which is also false.  When a line is seen whose
+first field is @samp{START}, the value of @code{interested} is toggled
+to true, using @samp{!}. The next rule prints lines as long as
+@code{interested} is true.  When a line is seen whose first field is
+@samp{END}, @code{interested} is toggled back to false.@footnote{This
+program has a bug; it prints lines starting with @samp{END}. How
+would you fix it?}
+
+@ignore
+Scott Deifik points out that this program isn't robust against
+bogus input data, but the point is to illustrate the use of `!',
+so we'll leave well enough alone.
+@end ignore
+
+Most commonly, the @samp{!} operator is used in the conditions of
+@code{if} and @code{while} statements, where it often makes more
+sense to phrase the logic in the negative:
+
+@example
+if (! @var{some condition} || @var{some other condition}) @{
+    @var{@dots{} do whatever processing @dots{}}
+@}
+@end example
+
+@cindex @code{next} statement
+@quotation NOTE
+The @code{next} statement is discussed in
+@ref{Next Statement}.
+@code{next} tells @command{awk} to skip the rest of the rules, get the
+next record, and start processing the rules over again at the top.
+The reason it's there is to avoid printing the bracketing
+@samp{START} and @samp{END} lines.
+@end quotation
+
+@node Conditional Exp
+@subsection Conditional Expressions
+@cindex conditional expressions
+@cindex expressions, conditional
+@cindex expressions, selecting
+
+A @dfn{conditional expression} is a special kind of expression that has
+three operands.  It allows you to use one expression's value to select
+one of two other expressions.
+The conditional expression in @command{awk} is the same as in the C
+language, as shown here:
+
+@example
+@var{selector} ? @var{if-true-exp} : @var{if-false-exp}
+@end example
+
+@noindent
+There are three subexpressions.  The first, @var{selector}, is always
+computed first.  If it is ``true'' (not zero or not null), then
+@var{if-true-exp} is computed next, and its value becomes the value of
+the whole expression.  Otherwise, @var{if-false-exp} is computed next,
+and its value becomes the value of the whole expression.
+For example, the following expression produces the absolute value of @code{x}:
+
+@example
+x >= 0 ? x : -x
+@end example
+
+@cindex side effects, conditional expressions
+Each time the conditional expression is computed, only one of
+@var{if-true-exp} and @var{if-false-exp} is used; the other is ignored.
+This is important when the expressions have side effects.  For example,
+this conditional expression examines element @code{i} of either array
+@code{a} or array @code{b}, and increments @code{i}:
+
+@example
+x == y ? a[i++] : b[i++]
+@end example
+
+@noindent
+This is guaranteed to increment @code{i} exactly once, because each time
+only one of the two increment expressions is executed
+and the other is not.
+@xref{Arrays},
+for more information about arrays.
+
+@cindex differences in @command{awk} and @command{gawk}, line continuations
+@cindex line continuations, @command{gawk}
+@cindex @command{gawk}, line continuation in
+As a minor @command{gawk} extension,
+a statement that uses @samp{?:} can be continued simply
+by putting a newline after either character.
+However, putting a newline in front
+of either character does not work without using backslash continuation
+(@pxref{Statements/Lines}).
+If @option{--posix} is specified
+(@pxref{Options}), this extension is disabled.
+
+@node Function Calls
+@section Function Calls
+@cindex function calls
+
+A @dfn{function} is a name for a particular calculation.
+This enables you to
+ask for it by name at any point in the program.  For
+example, the function @code{sqrt()} computes the square root of a number.
+
+@cindex functions, built-in
+A fixed set of functions are @dfn{built in}, which means they are
+available in every @command{awk} program.  The @code{sqrt()} function is one
+of these.  @xref{Built-in} for a list of built-in
+functions and their descriptions.  In addition, you can define
+functions for use in your program.
+@xref{User-defined}
+for instructions on how to do this.
+Finally, @command{gawk} lets you write functions in C or C++
+that may be called from your program (@pxref{Dynamic Extensions}).
+
+@cindex arguments, in function calls
+The way to use a function is with a @dfn{function call} expression,
+which consists of the function name followed immediately by a list of
+@dfn{arguments} in parentheses.  The arguments are expressions that
+provide the raw materials for the function's calculations.
+When there is more than one argument, they are separated by commas.  If
+there are no arguments, just write @samp{()} after the function name.
+The following examples show function calls with and without arguments:
+
+@example
+sqrt(x^2 + y^2)        @ii{one argument}
+atan2(y, x)            @ii{two arguments}
+rand()                 @ii{no arguments}
+@end example
+
+@cindex troubleshooting, function call syntax
+@quotation CAUTION
+Do not put any space between the function name and the opening parenthesis!
+A user-defined function name looks just like the name of a
+variable---a space would make the expression look like concatenation of
+a variable with an expression inside parentheses.
+With built-in functions, space before the parenthesis is harmless, but
+it is best not to get into the habit of using space to avoid mistakes
+with user-defined functions.
+@end quotation
+
+Each function expects a particular number
+of arguments.  For example, the @code{sqrt()} function must be called with
+a single argument, the number of which to take the square root:
+
+@example
+sqrt(@var{argument})
+@end example
+
+Some of the built-in functions have one or
+more optional arguments.
+If those arguments are not supplied, the functions
+use a reasonable default value.
+@xref{Built-in} for full details.  If arguments
+are omitted in calls to user-defined functions, then those arguments are
+treated as local variables. Such local variables act like the
+empty string if referenced where a string value is required,
+and like zero if referenced where a numeric value is required
+(@pxref{User-defined}).
+
+As an advanced feature, @command{gawk} provides indirect function calls,
+which is a way to choose the function to call at runtime, instead of
+when you write the source code to your program. We defer discussion of
+this feature until later; see @ref{Indirect Calls}.
+
+@cindex side effects, function calls
+Like every other expression, the function call has a value, often
+called the @dfn{return value}, which is computed by the function
+based on the arguments you give it.  In this example, the return value
+of @samp{sqrt(@var{argument})} is the square root of @var{argument}.
+The following program reads numbers, one number per line, and prints
+the square root of each one:
+
+@example
+$ @kbd{awk '@{ print "The square root of", $1, "is", sqrt($1) @}'}
+@kbd{1}
+@print{} The square root of 1 is 1
+@kbd{3}
+@print{} The square root of 3 is 1.73205
+@kbd{5}
+@print{} The square root of 5 is 2.23607
+@kbd{Ctrl-d}
+@end example
+
+A function can also have side effects, such as assigning
+values to certain variables or doing I/O.
+This program shows how the @code{match()} function
+(@pxref{String Functions})
+changes the variables @code{RSTART} and @code{RLENGTH}:
+
+@example
+@{
+    if (match($1, $2))
+        print RSTART, RLENGTH
+    else
+        print "no match"
+@}
+@end example
+
+@noindent
+Here is a sample run:
+
+@example
+$ @kbd{awk -f matchit.awk}
+@kbd{aaccdd  c+}
+@print{} 3 2
+@kbd{foo     bar}
+@print{} no match
+@kbd{abcdefg e}
+@print{} 5 1
+@end example
+
+@node Precedence
+@section Operator Precedence (How Operators Nest)
+@cindex precedence
+@cindex operators, precedence
+
+@dfn{Operator precedence} determines how operators are grouped when
+different operators appear close by in one expression.  For example,
+@samp{*} has higher precedence than @samp{+}; thus, @samp{a + b * c}
+means to multiply @code{b} and @code{c}, and then add @code{a} to the
+product (i.e., @samp{a + (b * c)}).
+
+The normal precedence of the operators can be overruled by using parentheses.
+Think of the precedence rules as saying where the
+parentheses are assumed to be.  In
+fact, it is wise to always use parentheses whenever there is an unusual
+combination of operators, because other people who read the program may
+not remember what the precedence is in this case.
+Even experienced programmers occasionally forget the exact rules,
+which leads to mistakes.
+Explicit parentheses help prevent
+any such mistakes.
+
+When operators of equal precedence are used together, the leftmost
+operator groups first, except for the assignment, conditional, and
+exponentiation operators, which group in the opposite order.
+Thus, @samp{a - b + c} groups as @samp{(a - b) + c} and
+@samp{a = b = c} groups as @samp{a = (b = c)}.
+
+Normally the precedence of prefix unary operators does not matter,
+because there is only one way to interpret
+them: innermost first.  Thus, @samp{$++i} means @samp{$(++i)} and
+@samp{++$x} means @samp{++($x)}.  However, when another operator follows
+the operand, then the precedence of the unary operators can matter.
+@samp{$x^2} means @samp{($x)^2}, but @samp{-x^2} means
+@samp{-(x^2)}, because @samp{-} has lower precedence than @samp{^},
+whereas @samp{$} has higher precedence.
+Also, operators cannot be combined in a way that violates the
+precedence rules; for example, @samp{$$0++--} is not a valid
+expression because the first @samp{$} has higher precedence than the
+@samp{++}; to avoid the problem the expression can be rewritten as
+@samp{$($0++)--}.
+
+This list presents @command{awk}'s operators, in order of highest
+to lowest precedence:
+
+@c @asis for docbook to come out right
+@table @asis
+@item @code{(}@dots{}@code{)}
+Grouping.
+
+@cindex @code{$} (dollar sign), @code{$} field operator
+@cindex dollar sign (@code{$}), @code{$} field operator
+@item @code{$}
+Field reference.
+
+@cindex @code{+} (plus sign), @code{++} operator
+@cindex plus sign (@code{+}), @code{++} operator
+@cindex @code{-} (hyphen), @code{--} operator
+@cindex hyphen (@code{-}), @code{--} operator
+@item @code{++ --}
+Increment, decrement.
+
+@cindex @code{^} (caret), @code{^} operator
+@cindex caret (@code{^}), @code{^} operator
+@cindex @code{*} (asterisk), @code{**} operator
+@cindex asterisk (@code{*}), @code{**} operator
+@item @code{^ **}
+Exponentiation.  These operators group right to left.
+
+@cindex @code{+} (plus sign), @code{+} operator
+@cindex plus sign (@code{+}), @code{+} operator
+@cindex @code{-} (hyphen), @code{-} operator
+@cindex hyphen (@code{-}), @code{-} operator
+@cindex @code{!} (exclamation point), @code{!} operator
+@cindex exclamation point (@code{!}), @code{!} operator
+@item @code{+ - !}
+Unary plus, minus, logical ``not.''
+
+@cindex @code{*} (asterisk), @code{*} operator, as multiplication operator
+@cindex asterisk (@code{*}), @code{*} operator, as multiplication operator
+@cindex @code{/} (forward slash), @code{/} operator
+@cindex forward slash (@code{/}), @code{/} operator
+@cindex @code{%} (percent sign), @code{%} operator
+@cindex percent sign (@code{%}), @code{%} operator
+@item @code{* / %}
+Multiplication, division, remainder.
+
+@cindex @code{+} (plus sign), @code{+} operator
+@cindex plus sign (@code{+}), @code{+} operator
+@cindex @code{-} (hyphen), @code{-} operator
+@cindex hyphen (@code{-}), @code{-} operator
+@item @code{+ -}
+Addition, subtraction.
+
+@item String concatenation
+There is no special symbol for concatenation.
+The operands are simply written side by side
+(@pxref{Concatenation}).
+
+@cindex @code{<} (left angle bracket), @code{<} operator
+@cindex left angle bracket (@code{<}), @code{<} operator
+@cindex @code{<} (left angle bracket), @code{<=} operator
+@cindex left angle bracket (@code{<}), @code{<=} operator
+@cindex @code{>} (right angle bracket), @code{>=} operator
+@cindex right angle bracket (@code{>}), @code{>=} operator
+@cindex @code{>} (right angle bracket), @code{>} operator
+@cindex right angle bracket (@code{>}), @code{>} operator
+@cindex @code{=} (equals sign), @code{==} operator
+@cindex equals sign (@code{=}), @code{==} operator
+@cindex @code{!} (exclamation point), @code{!=} operator
+@cindex exclamation point (@code{!}), @code{!=} operator
+@cindex @code{>} (right angle bracket), @code{>>} operator (I/O)
+@cindex right angle bracket (@code{>}), @code{>>} operator (I/O)
+@cindex operators, input/output
+@cindex @code{|} (vertical bar), @code{|} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|} operator (I/O)
+@cindex operators, input/output
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|&} operator (I/O)
+@cindex operators, input/output
+@item @code{< <= == != > >= >> | |&}
+Relational and redirection.
+The relational operators and the redirections have the same precedence
+level.  Characters such as @samp{>} serve both as relationals and as
+redirections; the context distinguishes between the two meanings.
+
+@cindex @code{print} statement, I/O operators in
+@cindex @code{printf} statement, I/O operators in
+Note that the I/O redirection operators in @code{print} and @code{printf}
+statements belong to the statement level, not to expressions.  The
+redirection does not produce an expression that could be the operand of
+another operator.  As a result, it does not make sense to use a
+redirection operator near another operator of lower precedence without
+parentheses.  Such combinations (e.g., @samp{print foo > a ? b : c})
+result in syntax errors.
+The correct way to write this statement is @samp{print foo > (a ? b : c)}.
+
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@item @code{~ !~}
+Matching, nonmatching.
+
+@cindex @code{in} operator
+@item @code{in}
+Array membership.
+
+@cindex @code{&} (ampersand), @code{&&} operator
+@cindex ampersand (@code{&}), @code{&&} operator
+@item @code{&&}
+Logical ``and.''
+
+@cindex @code{|} (vertical bar), @code{||} operator
+@cindex vertical bar (@code{|}), @code{||} operator
+@item @code{||}
+Logical ``or.''
+
+@cindex @code{?} (question mark), @code{?:} operator
+@cindex question mark (@code{?}), @code{?:} operator
+@cindex @code{:} (colon), @code{?:} operator
+@cindex colon (@code{:}), @code{?:} operator
+@item @code{?:}
+Conditional.  This operator groups right to left.
+
+@cindex @code{+} (plus sign), @code{+=} operator
+@cindex plus sign (@code{+}), @code{+=} operator
+@cindex @code{-} (hyphen), @code{-=} operator
+@cindex hyphen (@code{-}), @code{-=} operator
+@cindex @code{*} (asterisk), @code{*=} operator
+@cindex asterisk (@code{*}), @code{*=} operator
+@cindex @code{*} (asterisk), @code{**=} operator
+@cindex asterisk (@code{*}), @code{**=} operator
+@cindex @code{/} (forward slash), @code{/=} operator
+@cindex forward slash (@code{/}), @code{/=} operator
+@cindex @code{%} (percent sign), @code{%=} operator
+@cindex percent sign (@code{%}), @code{%=} operator
+@cindex @code{^} (caret), @code{^=} operator
+@cindex caret (@code{^}), @code{^=} operator
+@item @code{= += -= *= /= %= ^= **=}
+Assignment.  These operators group right to left.
+@end table
+
+@cindex POSIX @command{awk}, @code{**} operator and
+@cindex portability, operators, not in POSIX @command{awk}
+@quotation NOTE
+The @samp{|&}, @samp{**}, and @samp{**=} operators are not specified by POSIX.
+For maximum portability, do not use them.
+@end quotation
+
+@node Locales
+@section Where You Are Makes a Difference
+@cindex locale, definition of
+
+Modern systems support the notion of @dfn{locales}: a way to tell the
+system about the local character set and language.  The ISO C standard
+defines a default @code{"C"} locale, which is an environment that is
+typical of what many C programmers are used to.
+
+Once upon a time, the locale setting used to affect regexp matching,
+but this is no longer true (@pxref{Ranges and Locales}).
+
+Locales can affect record splitting.  For the normal case of @samp{RS =
+"\n"}, the locale is largely irrelevant.  For other single-character
+record separators, setting @samp{LC_ALL=C} in the environment will
+give you much better performance when reading records.  Otherwise,
+@command{gawk} has to make several function calls, @emph{per input
+character}, to find the record terminator.
+
+Locales can affect how dates and times are formatted (@pxref{Time
+Functions}).  For example, a common way to abbreviate the date September
+4, 2015, in the United States is ``9/4/15.''  In many countries in
+Europe, however, it is abbreviated ``4.9.15.''  Thus, the @samp{%x}
+specification in a @code{"US"} locale might produce @samp{9/4/15},
+while in a @code{"EUROPE"} locale, it might produce @samp{4.9.15}.
+
+According to POSIX, string comparison is also affected by locales (similar
+to regular expressions).  The details are presented in @ref{POSIX String
+Comparison}.
+
+Finally, the locale affects the value of the decimal point character
+used when @command{gawk} parses input data.  This is discussed in detail
+in @ref{Conversion}.
+
+@node Expressions Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Expressions are the basic elements of computation in programs.  They are
+built from constants, variables, function calls, and combinations of the
+various kinds of values with operators.
+
+@item
+@command{awk} supplies three kinds of constants: numeric, string, and
+regexp.  @command{gawk} lets you specify numeric constants in octal
+and hexadecimal (bases 8 and 16) as well as decimal (base 10).
+In certain contexts, a standalone regexp constant such as @code{/foo/}
+has the same meaning as @samp{$0 ~ /foo/}.
+
+@item
+Variables hold values between uses in computations. A number of built-in
+variables provide information to your @command{awk} program, and a number
+of others let you control how @command{awk} behaves.
+
+@item
+Numbers are automatically converted to strings, and strings to numbers,
+as needed by @command{awk}. Numeric values are converted as if they were
+formatted with @code{sprintf()} using the format in @code{CONVFMT}.
+Locales can influence the conversions.
+
+@item
+@command{awk} provides the usual arithmetic operators (addition,
+subtraction, multiplication, division, modulus), and unary plus and minus.
+It also provides comparison operators, Boolean operators, an array membership
+testing operator, and regexp
+matching operators.  String concatenation is accomplished by placing
+two expressions next to each other; there is no explicit operator.
+The three-operand @samp{?:} operator provides an ``if-else'' test within
+expressions.
+
+@item
+Assignment operators provide convenient shorthands for common arithmetic
+operations.
+
+@item
+In @command{awk}, a value is considered to be true if it is nonzero
+@emph{or} non-null. Otherwise, the value is false.
+
+@item
+A variable's type is set upon each assignment and may change over its
+lifetime.  The type determines how it behaves in comparisons (string
+or numeric).
+
+@item
+Function calls return a value that may be used as part of a larger
+expression.  Expressions used to pass parameter values are fully
+evaluated before the function is called.  @command{awk} provides
+built-in and user-defined functions; this is described in
+@ref{Functions}.
+
+@item
+Operator precedence specifies the order in which operations are performed,
+unless explicitly overridden by parentheses.  @command{awk}'s operator
+precedence is compatible with that of C.
+
+@item
+Locales can affect the format of data as output by an @command{awk}
+program, and occasionally the format for data read as input.
+
+@end itemize
+
+
+@node Patterns and Actions
+@chapter Patterns, Actions, and Variables
+@cindex patterns
+
+As you have already seen, each @command{awk} statement consists of
+a pattern with an associated action.  This @value{CHAPTER} describes how
+you build patterns and actions, what kinds of things you can do within
+actions, and @command{awk}'s predefined variables.
+
+The pattern--action rules and the statements available for use
+within actions form the core of @command{awk} programming.
+In a sense, everything covered
+up to here has been the foundation
+that programs are built on top of.  Now it's time to start
+building something useful.
+
+@menu
+* Pattern Overview::            What goes into a pattern.
+* Using Shell Variables::       How to use shell variables with @command{awk}.
+* Action Overview::             What goes into an action.
+* Statements::                  Describes the various control statements in
+                                detail.
+* Built-in Variables::          Summarizes the predefined variables.
+* Pattern Action Summary::      Patterns and Actions summary.
+@end menu
+
+@node Pattern Overview
+@section Pattern Elements
+
+@menu
+* Regexp Patterns::             Using regexps as patterns.
+* Expression Patterns::         Any expression can be used as a pattern.
+* Ranges::                      Pairs of patterns specify record ranges.
+* BEGIN/END::                   Specifying initialization and cleanup rules.
+* BEGINFILE/ENDFILE::           Two special patterns for advanced control.
+* Empty::                       The empty pattern, which matches every record.
+@end menu
+
+@cindex patterns, types of
+Patterns in @command{awk} control the execution of rules---a rule is
+executed when its pattern matches the current input record.
+The following is a summary of the types of @command{awk} patterns:
+
+@table @code
+@item /@var{regular expression}/
+A regular expression. It matches when the text of the
+input record fits the regular expression.
+(@xref{Regexp}.)
+
+@item @var{expression}
+A single expression.  It matches when its value
+is nonzero (if a number) or non-null (if a string).
+(@xref{Expression Patterns}.)
+
+@item @var{begpat}, @var{endpat}
+A pair of patterns separated by a comma, specifying a @dfn{range} of records.
+The range includes both the initial record that matches @var{begpat} and
+the final record that matches @var{endpat}.
+(@xref{Ranges}.)
+
+@item BEGIN
+@itemx END
+Special patterns for you to supply startup or cleanup actions for your
+@command{awk} program.
+(@xref{BEGIN/END}.)
+
+@item BEGINFILE
+@itemx ENDFILE
+Special patterns for you to supply startup or cleanup actions to be
+done on a per-file basis.
+(@xref{BEGINFILE/ENDFILE}.)
+
+@item @var{empty}
+The empty pattern matches every input record.
+(@xref{Empty}.)
+@end table
+
+@node Regexp Patterns
+@subsection Regular Expressions as Patterns
+@cindex patterns, regular expressions as
+@cindex regular expressions, as patterns
+
+Regular expressions are one of the first kinds of patterns presented
+in this book.
+This kind of pattern is simply a regexp constant in the pattern part of
+a rule.  Its  meaning is @samp{$0 ~ /@var{pattern}/}.
+The pattern matches when the input record matches the regexp.
+For example:
+
+@example
+/foo|bar|baz/  @{ buzzwords++ @}
+END            @{ print buzzwords, "buzzwords seen" @}
+@end example
+
+@node Expression Patterns
+@subsection Expressions as Patterns
+@cindex expressions, as patterns
+@cindex patterns, expressions as
+
+Any @command{awk} expression is valid as an @command{awk} pattern.
+The pattern matches if the expression's value is nonzero (if a
+number) or non-null (if a string).
+The expression is reevaluated each time the rule is tested against a new
+input record.  If the expression uses fields such as @code{$1}, the
+value depends directly on the new input record's text; otherwise, it
+depends on only what has happened so far in the execution of the
+@command{awk} program.
+
+@cindex comparison expressions, as patterns
+@cindex patterns, comparison expressions as
+Comparison expressions, using the comparison operators described in
+@ref{Typing and Comparison},
+are a very common kind of pattern.
+Regexp matching and nonmatching are also very common expressions.
+The left operand of the @samp{~} and @samp{!~} operators is a string.
+The right operand is either a constant regular expression enclosed in
+slashes (@code{/@var{regexp}/}), or any expression whose string value
+is used as a dynamic regular expression
+(@pxref{Computed Regexps}).
+The following example prints the second field of each input record
+whose first field is precisely @samp{li}:
+
+@cindex @code{/} (forward slash), patterns and
+@cindex forward slash (@code{/}), patterns and
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@example
+$ @kbd{awk '$1 == "li" @{ print $2 @}' mail-list}
+@end example
+
+@noindent
+(There is no output, because there is no person with the exact name @samp{li}.)
+Contrast this with the following regular expression match, which
+accepts any record with a first field that contains @samp{li}:
+
+@example
+$ @kbd{awk '$1 ~ /li/ @{ print $2 @}' mail-list}
+@print{} 555-5553
+@print{} 555-6699
+@end example
+
+@cindex regexp constants, as patterns
+@cindex patterns, regexp constants as
+A regexp constant as a pattern is also a special case of an expression
+pattern.  The expression @code{/li/} has the value one if @samp{li}
+appears in the current input record. Thus, as a pattern, @code{/li/}
+matches any record containing @samp{li}.
+
+@cindex Boolean expressions, as patterns
+@cindex patterns, Boolean expressions as
+Boolean expressions are also commonly used as patterns.
+Whether the pattern
+matches an input record depends on whether its subexpressions match.
+For example, the following command prints all the records in
+@file{mail-list} that contain both @samp{edu} and @samp{li}:
+
+@example
+$ @kbd{awk '/edu/ && /li/' mail-list}
+@print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+@end example
+
+The following command prints all records in
+@file{mail-list} that contain @emph{either} @samp{edu} or @samp{li}
+(or both, of course):
+
+@example
+$ @kbd{awk '/edu/ || /li/' mail-list}
+@print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+@print{} Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
+@print{} Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
+@print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+@print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@end example
+
+The following command prints all records in
+@file{mail-list} that do @emph{not} contain the string @samp{li}:
+
+@example
+$ @kbd{awk '! /li/' mail-list}
+@print{} Anthony      555-3412     anthony.asserturo@@hotmail.com   A
+@print{} Becky        555-7685     becky.algebrarum@@gmail.com      A
+@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
+@group
+@print{} Martin       555-6480     martin.codicibus@@hotmail.com    A
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@end group
+@end example
+
+@cindex @code{BEGIN} pattern, Boolean patterns and
+@cindex @code{END} pattern, Boolean patterns and
+@cindex @code{BEGINFILE} pattern, Boolean patterns and
+@cindex @code{ENDFILE} pattern, Boolean patterns and
+The subexpressions of a Boolean operator in a pattern can be constant regular
+expressions, comparisons, or any other @command{awk} expressions.  Range
+patterns are not expressions, so they cannot appear inside Boolean
+patterns.  Likewise, the special patterns @code{BEGIN}, @code{END},
+@code{BEGINFILE}, and @code{ENDFILE},
+which never match any input record, are not expressions and cannot
+appear inside Boolean patterns.
+
+The precedence of the different operators that can appear in
+patterns is described in @ref{Precedence}.
+
+@node Ranges
+@subsection Specifying Record Ranges with Patterns
+
+@cindex range patterns
+@cindex patterns, ranges in
+@cindex lines, matching ranges of
+@cindex @code{,} (comma), in range patterns
+@cindex comma (@code{,}), in range patterns
+A @dfn{range pattern} is made of two patterns separated by a comma, in
+the form @samp{@var{begpat}, @var{endpat}}.  It is used to match ranges of
+consecutive input records.  The first pattern, @var{begpat}, controls
+where the range begins, while @var{endpat} controls where
+the pattern ends.  For example, the following:
+
+@example
+awk '$1 == "on", $1 == "off"' myfile
+@end example
+
+@noindent
+prints every record in @file{myfile} between @samp{on}/@samp{off} pairs, inclusive.
+
+A range pattern starts out by matching @var{begpat} against every
+input record.  When a record matches @var{begpat}, the range pattern is
+@dfn{turned on}, and the range pattern matches this record as well.  As long as
+the range pattern stays turned on, it automatically matches every input
+record read.  The range pattern also matches @var{endpat} against every
+input record; when this succeeds, the range pattern is @dfn{turned off} again
+for the following record.  Then the range pattern goes back to checking
+@var{begpat} against each record.
+
+@cindex @code{if} statement, actions@comma{} changing
+The record that turns on the range pattern and the one that turns it
+off both match the range pattern.  If you don't want to operate on
+these records, you can write @code{if} statements in the rule's action
+to distinguish them from the records you are interested in.
+
+It is possible for a pattern to be turned on and off by the same
+record. If the record satisfies both conditions, then the action is
+executed for just that record.
+For example, suppose there is text between two identical markers (e.g.,
+the @samp{%} symbol), each on its own line, that should be ignored.
+A first attempt would be to
+combine a range pattern that describes the delimited text with the
+@code{next} statement
+(not discussed yet, @pxref{Next Statement}).
+This causes @command{awk} to skip any further processing of the current
+record and start over again with the next input record. Such a program
+looks like this:
+
+@example
+/^%$/,/^%$/    @{ next @}
+               @{ print @}
+@end example
+
+@noindent
+@cindex lines, skipping between markers
+@c @cindex flag variables
+This program fails because the range pattern is both turned on and turned off
+by the first line, which just has a @samp{%} on it.  To accomplish this task,
+write the program in the following manner, using a flag:
+
+@cindex @code{!} (exclamation point), @code{!} operator
+@example
+/^%$/     @{ skip = ! skip; next @}
+skip == 1 @{ next @} # skip lines with `skip' set
+@end example
+
+In a range pattern, the comma (@samp{,}) has the lowest precedence of
+all the operators (i.e., it is evaluated last).  Thus, the following
+program attempts to combine a range pattern with another, simpler test:
+
+@example
+echo Yes | awk '/1/,/2/ || /Yes/'
+@end example
+
+The intent of this program is @samp{(/1/,/2/) || /Yes/}.
+However, @command{awk} interprets this as @samp{/1/, (/2/ || /Yes/)}.
+This cannot be changed or worked around; range patterns do not combine
+with other patterns:
+
+@example
+$ @kbd{echo Yes | gawk '(/1/,/2/) || /Yes/'}
+@error{} gawk: cmd. line:1: (/1/,/2/) || /Yes/
+@error{} gawk: cmd. line:1:           ^ syntax error
+@end example
+
+@cindex range patterns, line continuation and
+@cindex dark corner, range patterns, line continuation and
+As a minor point of interest, although it is poor style,
+POSIX allows you to put a newline after the comma in
+a range pattern.  @value{DARKCORNER}
+
+@node BEGIN/END
+@subsection The @code{BEGIN} and @code{END} Special Patterns
+
+@cindex @code{BEGIN} pattern
+@cindex @code{END} pattern
+All the patterns described so far are for matching input records.
+The @code{BEGIN} and @code{END} special patterns are different.
+They supply startup and cleanup actions for @command{awk} programs.
+@code{BEGIN} and @code{END} rules must have actions; there is no default
+action for these rules because there is no current record when they run.
+@code{BEGIN} and @code{END} rules are often referred to as
+``@code{BEGIN} and @code{END} blocks'' by longtime @command{awk}
+programmers.
+
+@menu
+* Using BEGIN/END::             How and why to use BEGIN/END rules.
+* I/O And BEGIN/END::           I/O issues in BEGIN/END rules.
+@end menu
+
+@node Using BEGIN/END
+@subsubsection Startup and Cleanup Actions
+
+@cindex @code{BEGIN} pattern
+@cindex @code{END} pattern
+A @code{BEGIN} rule is executed once only, before the first input record
+is read. Likewise, an @code{END} rule is executed once only, after all the
+input is read.  For example:
+
+@example
+$ @kbd{awk '}
+> @kbd{BEGIN @{ print "Analysis of \"li\"" @}}
+> @kbd{/li/  @{ ++n @}}
+> @kbd{END   @{ print "\"li\" appears in", n, "records." @}' mail-list}
+@print{} Analysis of "li"
+@print{} "li" appears in 4 records.
+@end example
+
+@cindex @code{BEGIN} pattern, operators and
+@cindex @code{END} pattern, operators and
+This program finds the number of records in the input file @file{mail-list}
+that contain the string @samp{li}.  The @code{BEGIN} rule prints a title
+for the report.  There is no need to use the @code{BEGIN} rule to
+initialize the counter @code{n} to zero, as @command{awk} does this
+automatically (@pxref{Variables}).
+The second rule increments the variable @code{n} every time a
+record containing the pattern @samp{li} is read.  The @code{END} rule
+prints the value of @code{n} at the end of the run.
+
+The special patterns @code{BEGIN} and @code{END} cannot be used in ranges
+or with Boolean operators (indeed, they cannot be used with any operators).
+An @command{awk} program may have multiple @code{BEGIN} and/or @code{END}
+rules.  They are executed in the order in which they appear: all the @code{BEGIN}
+rules at startup and all the @code{END} rules at termination.
+@code{BEGIN} and @code{END} rules may be intermixed with other rules.
+This feature was added in the 1987 version of @command{awk} and is included
+in the POSIX standard.
+The original (1978) version of @command{awk}
+required the @code{BEGIN} rule to be placed at the beginning of the
+program, the @code{END} rule to be placed at the end, and only allowed one of
+each.
+This is no longer required, but it is a good idea to follow this template
+in terms of program organization and readability.
+
+Multiple @code{BEGIN} and @code{END} rules are useful for writing
+library functions, because each library file can have its own @code{BEGIN} and/or
+@code{END} rule to do its own initialization and/or cleanup.
+The order in which library functions are named on the command line
+controls the order in which their @code{BEGIN} and @code{END} rules are
+executed.  Therefore, you have to be careful when writing such rules in
+library files so that the order in which they are executed doesn't matter.
+@xref{Options} for more information on
+using library functions.
+@xref{Library Functions},
+for a number of useful library functions.
+
+If an @command{awk} program has only @code{BEGIN} rules and no
+other rules, then the program exits after the @code{BEGIN} rules are
+run.@footnote{The original version of @command{awk} kept
+reading and ignoring input until the end of the file was seen.}  However, if an
+@code{END} rule exists, then the input is read, even if there are
+no other rules in the program.  This is necessary in case the @code{END}
+rule checks the @code{FNR} and @code{NR} variables.
+
+@node I/O And BEGIN/END
+@subsubsection Input/Output from @code{BEGIN} and @code{END} Rules
+
+@cindex input/output, from @code{BEGIN} and @code{END}
+There are several (sometimes subtle) points to be aware of when doing I/O
+from a @code{BEGIN} or @code{END} rule.
+The first has to do with the value of @code{$0} in a @code{BEGIN}
+rule.  Because @code{BEGIN} rules are executed before any input is read,
+there simply is no input record, and therefore no fields, when
+executing @code{BEGIN} rules.  References to @code{$0} and the fields
+yield a null string or zero, depending upon the context.  One way
+to give @code{$0} a real value is to execute a @code{getline} command
+without a variable (@pxref{Getline}).
+Another way is simply to assign a value to @code{$0}.
+
+@cindex Brian Kernighan's @command{awk}
+@cindex differences in @command{awk} and @command{gawk}, @code{BEGIN}/@code{END} patterns
+@cindex POSIX @command{awk}, @code{BEGIN}/@code{END} patterns
+@cindex @code{print} statement, @code{BEGIN}/@code{END} patterns and
+@cindex @code{BEGIN} pattern, @code{print} statement and
+@cindex @code{END} pattern, @code{print} statement and
+The second point is similar to the first, but from the other direction.
+Traditionally, due largely to implementation issues, @code{$0} and
+@code{NF} were @emph{undefined} inside an @code{END} rule.
+The POSIX standard specifies that @code{NF} is available in an @code{END}
+rule. It contains the number of fields from the last input record.
+Most probably due to an oversight, the standard does not say that @code{$0}
+is also preserved, although logically one would think that it should be.
+In fact, all of BWK @command{awk}, @command{mawk}, and @command{gawk}
+preserve the value of @code{$0} for use in @code{END} rules.  Be aware,
+however, that some other implementations and many older versions
+of Unix @command{awk} do not.
+
+The third point follows from the first two.  The meaning of @samp{print}
+inside a @code{BEGIN} or @code{END} rule is the same as always:
+@samp{print $0}.  If @code{$0} is the null string, then this prints an
+empty record.  Many longtime @command{awk} programmers use an unadorned
+@samp{print} in @code{BEGIN} and @code{END} rules, to mean @samp{@w{print ""}},
+relying on @code{$0} being null.  Although one might generally get away with
+this in @code{BEGIN} rules, it is a very bad idea in @code{END} rules,
+at least in @command{gawk}.  It is also poor style, because if an empty
+line is needed in the output, the program should print one explicitly.
+
+@cindex @code{next} statement, @code{BEGIN}/@code{END} patterns and
+@cindex @code{nextfile} statement, @code{BEGIN}/@code{END} patterns and
+@cindex @code{BEGIN} pattern, @code{next}/@code{nextfile} statements and
+@cindex @code{END} pattern, @code{next}/@code{nextfile} statements and
+Finally, the @code{next} and @code{nextfile} statements are not allowed
+in a @code{BEGIN} rule, because the implicit
+read-a-record-and-match-against-the-rules loop has not started yet.  Similarly, those statements
+are not valid in an @code{END} rule, because all the input has been read.
+(@xref{Next Statement} and
+@ifnotdocbook
+@pxref{Nextfile Statement}.)
+@end ifnotdocbook
+@ifdocbook
+@ref{Nextfile Statement}.)
+@end ifdocbook
+
+@node BEGINFILE/ENDFILE
+@subsection The @code{BEGINFILE} and @code{ENDFILE} Special Patterns
+@cindex @code{BEGINFILE} pattern
+@cindex @code{ENDFILE} pattern
+@cindex differences in @command{awk} and @command{gawk}, @code{BEGINFILE}/@code{ENDFILE} patterns
+
+This @value{SECTION} describes a @command{gawk}-specific feature.
+
+Two special kinds of rule, @code{BEGINFILE} and @code{ENDFILE}, give
+you ``hooks'' into @command{gawk}'s command-line file processing loop.
+As with the @code{BEGIN} and @code{END} rules
+@ifnottex
+@ifnotdocbook
+(@pxref{BEGIN/END}),
+@end ifnotdocbook
+@end ifnottex
+@iftex
+(see the previous @value{SECTION}),
+@end iftex
+@ifdocbook
+(see the previous @value{SECTION}),
+@end ifdocbook
+all @code{BEGINFILE} rules in a program are merged, in the order they are
+read by @command{gawk}, and all @code{ENDFILE} rules are merged as well.
+
+The body of the @code{BEGINFILE} rules is executed just before
+@command{gawk} reads the first record from a file.  @code{FILENAME}
+is set to the name of the current file, and @code{FNR} is set to zero.
+
+The @code{BEGINFILE} rule provides you the opportunity to accomplish two tasks
+that would otherwise be difficult or impossible to perform:
+
+@itemize @value{BULLET}
+@item
+You can test if the file is readable.  Normally, it is a fatal error if a
+file named on the command line cannot be opened for reading.  However,
+you can bypass the fatal error and move on to the next file on the
+command line.
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable, with @code{BEGINFILE} pattern
+@cindex @code{nextfile} statement, @code{BEGINFILE}/@code{ENDFILE} patterns and
+You do this by checking if the @code{ERRNO} variable is not the empty
+string; if so, then @command{gawk} was not able to open the file. In
+this case, your program can execute the @code{nextfile} statement
+(@pxref{Nextfile Statement}).  This causes @command{gawk} to skip
+the file entirely.  Otherwise, @command{gawk} exits with the usual
+fatal error.
+
+@item
+If you have written extensions that modify the record handling (by
+inserting an ``input parser''; @pxref{Input Parsers}), you can invoke
+them at this point, before @command{gawk} has started processing the file.
+(This is a @emph{very} advanced feature, currently used only by the
+@uref{https://sourceforge.net/projects/gawkextlib, @code{gawkextlib} project}.)
+@end itemize
+
+The @code{ENDFILE} rule is called when @command{gawk} has finished processing
+the last record in an input file.  For the last input file,
+it will be called before any @code{END} rules.
+The @code{ENDFILE} rule is executed even for empty input files.
+
+Normally, when an error occurs when reading input in the normal
+input-processing loop, the error is fatal.  However, if an @code{ENDFILE}
+rule is present, the error becomes non-fatal, and instead @code{ERRNO}
+is set.  This makes it possible to catch and process I/O errors at the
+level of the @command{awk} program.
+
+@cindex @code{next} statement, @code{BEGINFILE}/@code{ENDFILE} patterns and
+The @code{next} statement (@pxref{Next Statement}) is not allowed inside
+either a @code{BEGINFILE} or an @code{ENDFILE} rule.  The @code{nextfile}
+statement is allowed only inside a
+@code{BEGINFILE} rule, not inside an @code{ENDFILE} rule.
+
+@cindex @code{getline} statement, @code{BEGINFILE}/@code{ENDFILE} patterns and
+The @code{getline} statement (@pxref{Getline}) is restricted inside
+both @code{BEGINFILE} and @code{ENDFILE}: only redirected
+forms of @code{getline} are allowed.
+
+@code{BEGINFILE} and @code{ENDFILE} are @command{gawk} extensions.
+In most other @command{awk} implementations, or if @command{gawk} is in
+compatibility mode (@pxref{Options}), they are not special.
+
+@c FIXME: For 4.2 maybe deal with this?
+@ignore
+Date:     Tue, 17 May 2011 02:06:10 PDT
+From:     rankin@pactechdata.com (Pat Rankin)
+Message-Id: <110517015127.20240f4a@pactechdata.com>
+Subject:  BEGINFILE
+To:       arnold@skeeve.com
+
+     The documentation for BEGINFILE states that FNR is 0, which seems
+pretty obvious.  It doesn't mention what the value of $0 is, and that's
+not obvious.  I think setting it to null before starting the BEGINFILE
+action would be preferable to leaving whatever was there in the last
+record of the previous file.
+
+     ENDFILE can retain the last record in $0.  I guess it has to if
+the END rule's actions see that value too.  But the beginning of a new
+file doesn't just mean that the old one has been closed; the old file
+is being superseded, so leaving the old data around feels wrong to me.
+[If the user wants to keep it on hand, he or she can use an ENDFILE
+rule to grab it before moving on to the next file.]
+@end ignore
+
+@node Empty
+@subsection The Empty Pattern
+
+@cindex empty pattern
+@cindex patterns, empty
+An empty (i.e., nonexistent) pattern is considered to match @emph{every}
+input record.  For example, the program:
+
+@example
+awk '@{ print $1 @}' mail-list
+@end example
+
+@noindent
+prints the first field of every record.
+
+@node Using Shell Variables
+@section Using Shell Variables in Programs
+@cindex shells, variables
+@cindex @command{awk} programs, shell variables in
+@c @cindex shell and @command{awk} interaction
+
+@command{awk} programs are often used as components in larger
+programs written in shell.
+For example, it is very common to use a shell variable to
+hold a pattern that the @command{awk} program searches for.
+There are two ways to get the value of the shell variable
+into the body of the @command{awk} program.
+
+@cindex shells, quoting
+A common method is to use shell quoting to substitute
+the variable's value into the program inside the script.
+For example, consider the following program:
+
+@example
+@group
+printf "Enter search pattern: "
+read pattern
+awk "/$pattern/ "'@{ nmatches++ @}
+     END @{ print nmatches, "found" @}' /path/to/data
+@end group
+@end example
+
+@noindent
+The @command{awk} program consists of two pieces of quoted text
+that are concatenated together to form the program.
+The first part is double-quoted, which allows substitution of
+the @code{pattern} shell variable inside the quotes.
+The second part is single-quoted.
+
+Variable substitution via quoting works, but can potentially be
+messy.  It requires a good understanding of the shell's quoting rules
+(@pxref{Quoting}),
+and it's often difficult to correctly
+match up the quotes when reading the program.
+
+A better method is to use @command{awk}'s variable assignment feature
+(@pxref{Assignment Options})
+to assign the shell variable's value to an @command{awk} variable.
+Then use dynamic regexps to match the pattern
+(@pxref{Computed Regexps}).
+The following shows how to redo the
+previous example using this technique:
+
+@example
+printf "Enter search pattern: "
+read pattern
+awk -v pat="$pattern" '$0 ~ pat @{ nmatches++ @}
+       END @{ print nmatches, "found" @}' /path/to/data
+@end example
+
+@noindent
+Now, the @command{awk} program is just one single-quoted string.
+The assignment @samp{-v pat="$pattern"} still requires double quotes,
+in case there is whitespace in the value of @code{$pattern}.
+The @command{awk} variable @code{pat} could be named @code{pattern}
+too, but that would be more confusing.  Using a variable also
+provides more flexibility, as the variable can be used anywhere inside
+the program---for printing, as an array subscript, or for any other
+use---without requiring the quoting tricks at every point in the program.
+
+@node Action Overview
+@section Actions
+@c @cindex action, definition of
+@c @cindex curly braces
+@c @cindex action, curly braces
+@c @cindex action, separating statements
+@cindex actions
+
+An @command{awk} program or script consists of a series of
+rules and function definitions interspersed.  (Functions are
+described later.  @xref{User-defined}.)
+A rule contains a pattern and an action, either of which (but not
+both) may be omitted.  The purpose of the @dfn{action} is to tell
+@command{awk} what to do once a match for the pattern is found.  Thus,
+in outline, an @command{awk} program generally looks like this:
+
+@display
+[@var{pattern}]  @code{@{ @var{action} @}}
+ @var{pattern}  [@code{@{ @var{action} @}}]
+@dots{}
+@code{function @var{name}(@var{args}) @{ @dots{} @}}
+@dots{}
+@end display
+
+@cindex @code{@{@}} (braces), actions and
+@cindex braces (@code{@{@}}), actions and
+@cindex separators, for statements in actions
+@cindex newlines, separating statements in actions
+@cindex @code{;} (semicolon), separating statements in actions
+@cindex semicolon (@code{;}), separating statements in actions
+An action consists of one or more @command{awk} @dfn{statements}, enclosed
+in braces (@samp{@{@r{@dots{}}@}}).  Each statement specifies one
+thing to do.  The statements are separated by newlines or semicolons.
+The braces around an action must be used even if the action
+contains only one statement, or if it contains no statements at
+all.  However, if you omit the action entirely, omit the braces as
+well.  An omitted action is equivalent to @samp{@{ print $0 @}}:
+
+@example
+/foo/  @{ @}     @ii{match @code{foo}, do nothing --- empty action}
+/foo/          @ii{match @code{foo}, print the record --- omitted action}
+@end example
+
+The following types of statements are supported in @command{awk}:
+
+@table @asis
+@cindex side effects, statements
+@item Expressions
+Call functions or assign values to variables
+(@pxref{Expressions}).  Executing
+this kind of statement simply computes the value of the expression.
+This is useful when the expression has side effects
+(@pxref{Assignment Ops}).
+
+@item Control statements
+Specify the control flow of @command{awk}
+programs.  The @command{awk} language gives you C-like constructs
+(@code{if}, @code{for}, @code{while}, and @code{do}) as well as a few
+special ones (@pxref{Statements}).
+
+@item Compound statements
+Enclose one or more statements in braces.  A compound statement
+is used in order to put several statements together in the body of an
+@code{if}, @code{while}, @code{do}, or @code{for} statement.
+
+@item Input statements
+Use the @code{getline} command
+(@pxref{Getline}).
+Also supplied in @command{awk} are the @code{next}
+statement (@pxref{Next Statement})
+and the @code{nextfile} statement
+(@pxref{Nextfile Statement}).
+
+@item Output statements
+Such as @code{print} and @code{printf}.
+@xref{Printing}.
+
+@item Deletion statements
+For deleting array elements.
+@xref{Delete}.
+@end table
+
+@node Statements
+@section Control Statements in Actions
+@cindex control statements
+@cindex statements, control, in actions
+@cindex actions, control statements in
+
+@dfn{Control statements}, such as @code{if}, @code{while}, and so on,
+control the flow of execution in @command{awk} programs.  Most of @command{awk}'s
+control statements are patterned after similar statements in C.
+
+@cindex compound statements@comma{} control statements and
+@cindex statements, compound@comma{} control statements and
+@cindex body, in actions
+@cindex @code{@{@}} (braces), statements, grouping
+@cindex braces (@code{@{@}}), statements, grouping
+@cindex newlines, separating statements in actions
+@cindex @code{;} (semicolon), separating statements in actions
+@cindex semicolon (@code{;}), separating statements in actions
+All the control statements start with special keywords, such as @code{if}
+and @code{while}, to distinguish them from simple expressions.
+Many control statements contain other statements.  For example, the
+@code{if} statement contains another statement that may or may not be
+executed.  The contained statement is called the @dfn{body}.
+To include more than one statement in the body, group them into a
+single @dfn{compound statement} with braces, separating them with
+newlines or semicolons.
+
+@menu
+* If Statement::                Conditionally execute some @command{awk}
+                                statements.
+* While Statement::             Loop until some condition is satisfied.
+* Do Statement::                Do specified action while looping until some
+                                condition is satisfied.
+* For Statement::               Another looping statement, that provides
+                                initialization and increment clauses.
+* Switch Statement::            Switch/case evaluation for conditional
+                                execution of statements based on a value.
+* Break Statement::             Immediately exit the innermost enclosing loop.
+* Continue Statement::          Skip to the end of the innermost enclosing
+                                loop.
+* Next Statement::              Stop processing the current input record.
+* Nextfile Statement::          Stop processing the current file.
+* Exit Statement::              Stop execution of @command{awk}.
+@end menu
+
+@node If Statement
+@subsection The @code{if}-@code{else} Statement
+
+@cindex @code{if} statement
+The @code{if}-@code{else} statement is @command{awk}'s decision-making
+statement.  It looks like this:
+
+@display
+@code{if (@var{condition}) @var{then-body}} [@code{else @var{else-body}}]
+@end display
+
+@noindent
+The @var{condition} is an expression that controls what the rest of the
+statement does.  If the @var{condition} is true, @var{then-body} is
+executed; otherwise, @var{else-body} is executed.
+The @code{else} part of the statement is
+optional.  The condition is considered false if its value is zero or
+the null string; otherwise, the condition is true.
+Refer to the following:
+
+@example
+@group
+if (x % 2 == 0)
+    print "x is even"
+else
+    print "x is odd"
+@end group
+@end example
+
+In this example, if the expression @samp{x % 2 == 0} is true (i.e.,
+if the value of @code{x} is evenly divisible by two), then the first
+@code{print} statement is executed; otherwise, the second @code{print}
+statement is executed.
+If the @code{else} keyword appears on the same line as @var{then-body} and
+@var{then-body} is not a compound statement (i.e., not surrounded by
+braces), then a semicolon must separate @var{then-body} from
+the @code{else}.
+To illustrate this, the previous example can be rewritten as:
+
+@example
+if (x % 2 == 0) print "x is even"; else
+        print "x is odd"
+@end example
+
+@noindent
+If the @samp{;} is left out, @command{awk} can't interpret the statement and
+it produces a syntax error.  Don't actually write programs this way,
+because a human reader might fail to see the @code{else} if it is not
+the first thing on its line.
+
+@node While Statement
+@subsection The @code{while} Statement
+@cindex @code{while} statement
+@cindex loops
+@cindex loops, @code{while}
+@cindex loops, See Also @code{while} statement
+
+In programming, a @dfn{loop} is a part of a program that can
+be executed two or more times in succession.
+The @code{while} statement is the simplest looping statement in
+@command{awk}.  It repeatedly executes a statement as long as a condition is
+true.  For example:
+
+@example
+while (@var{condition})
+  @var{body}
+@end example
+
+@cindex body, in loops
+@noindent
+@var{body} is a statement called the @dfn{body} of the loop,
+and @var{condition} is an expression that controls how long the loop
+keeps running.
+The first thing the @code{while} statement does is test the @var{condition}.
+If the @var{condition} is true, it executes the statement @var{body}.
+@ifinfo
+(The @var{condition} is true when the value
+is not zero and not a null string.)
+@end ifinfo
+After @var{body} has been executed,
+@var{condition} is tested again, and if it is still true, @var{body}
+executes again.  This process repeats until the @var{condition} is no longer
+true.  If the @var{condition} is initially false, the body of the loop
+never executes and @command{awk} continues with the statement following
+the loop.
+This example prints the first three fields of each record, one per line:
+
+@example
+awk '
+@{
+    i = 1
+    while (i <= 3) @{
+        print $i
+        i++
+    @}
+@}' inventory-shipped
+@end example
+
+@noindent
+The body of this loop is a compound statement enclosed in braces,
+containing two statements.
+The loop works in the following manner: first, the value of @code{i} is set to one.
+Then, the @code{while} statement tests whether @code{i} is less than or equal to
+three.  This is true when @code{i} equals one, so the @code{i}th
+field is printed.  Then the @samp{i++} increments the value of @code{i}
+and the loop repeats.  The loop terminates when @code{i} reaches four.
+
+A newline is not required between the condition and the
+body; however, using one makes the program clearer unless the body is a
+compound statement or else is very simple.  The newline after the open brace
+that begins the compound statement is not required either, but the
+program is harder to read without it.
+
+@node Do Statement
+@subsection The @code{do}-@code{while} Statement
+@cindex @code{do}-@code{while} statement
+@cindex loops, @code{do}-@code{while}
+
+The @code{do} loop is a variation of the @code{while} looping statement.
+The @code{do} loop executes the @var{body} once and then repeats the
+@var{body} as long as the @var{condition} is true.  It looks like this:
+
+@example
+do
+  @var{body}
+while (@var{condition})
+@end example
+
+Even if the @var{condition} is false at the start, the @var{body}
+executes at least once (and only once, unless executing @var{body}
+makes @var{condition} true).  Contrast this with the corresponding
+@code{while} statement:
+
+@example
+while (@var{condition})
+    @var{body}
+@end example
+
+@noindent
+This statement does not execute the @var{body} even once if the
+@var{condition} is false to begin with.  The following is an example of
+a @code{do} statement:
+
+@example
+@{
+    i = 1
+    do @{
+        print $0
+        i++
+    @} while (i <= 10)
+@}
+@end example
+
+@noindent
+This program prints each input record 10 times.  However, it isn't a very
+realistic example, because in this case an ordinary @code{while} would do
+just as well.  This situation reflects actual experience; only
+occasionally is there a real use for a @code{do} statement.
+
+@node For Statement
+@subsection The @code{for} Statement
+@cindex @code{for} statement
+@cindex loops, @code{for}, iterative
+
+The @code{for} statement makes it more convenient to count iterations of a
+loop.  The general form of the @code{for} statement looks like this:
+
+@example
+for (@var{initialization}; @var{condition}; @var{increment})
+  @var{body}
+@end example
+
+@noindent
+The @var{initialization}, @var{condition}, and @var{increment} parts are
+arbitrary @command{awk} expressions, and @var{body} stands for any
+@command{awk} statement.
+
+The @code{for} statement starts by executing @var{initialization}.
+Then, as long
+as the @var{condition} is true, it repeatedly executes @var{body} and then
+@var{increment}.  Typically, @var{initialization} sets a variable to
+either zero or one, @var{increment} adds one to it, and @var{condition}
+compares it against the desired number of iterations.
+For example:
+
+@example
+awk '
+@{
+    for (i = 1; i <= 3; i++)
+        print $i
+@}' inventory-shipped
+@end example
+
+@noindent
+This prints the first three fields of each input record, with one
+input field per output line.
+
+It isn't possible to
+set more than one variable in the
+@var{initialization} part without using a multiple assignment statement
+such as @samp{x = y = 0}. This makes sense only if all the initial values
+are equal.  (But it is possible to initialize additional variables by writing
+their assignments as separate statements preceding the @code{for} loop.)
+
+@c @cindex comma operator, not supported
+The same is true of the @var{increment} part. Incrementing additional
+variables requires separate statements at the end of the loop.
+The C compound expression, using C's comma operator, is useful in
+this context, but it is not supported in @command{awk}.
+
+Most often, @var{increment} is an increment expression, as in the previous
+example.  But this is not required; it can be any expression
+whatsoever.  For example, the following statement prints all the powers of two
+between 1 and 100:
+
+@example
+for (i = 1; i <= 100; i *= 2)
+    print i
+@end example
+
+If there is nothing to be done, any of the three expressions in the
+parentheses following the @code{for} keyword may be omitted.  Thus,
+@w{@samp{for (; x > 0;)}} is equivalent to @w{@samp{while (x > 0)}}.  If the
+@var{condition} is omitted, it is treated as true, effectively
+yielding an @dfn{infinite loop} (i.e., a loop that never terminates).
+
+In most cases, a @code{for} loop is an abbreviation for a @code{while}
+loop, as shown here:
+
+@example
+@var{initialization}
+while (@var{condition}) @{
+  @var{body}
+  @var{increment}
+@}
+@end example
+
+@cindex loops, @code{continue} statements and
+@noindent
+The only exception is when the @code{continue} statement
+(@pxref{Continue Statement}) is used
+inside the loop. Changing a @code{for} statement to a @code{while}
+statement in this way can change the effect of the @code{continue}
+statement inside the loop.
+
+The @command{awk} language has a @code{for} statement in addition to a
+@code{while} statement because a @code{for} loop is often both less work to
+type and more natural to think of.  Counting the number of iterations is
+very common in loops.  It can be easier to think of this counting as part
+of looping rather than as something to do inside the loop.
+
+@cindex @code{in} operator
+There is an alternative version of the @code{for} loop, for iterating over
+all the indices of an array:
+
+@example
+for (i in array)
+    @var{do something with} array[i]
+@end example
+
+@noindent
+@xref{Scanning an Array}
+for more information on this version of the @code{for} loop.
+
+@node Switch Statement
+@subsection The @code{switch} Statement
+@cindex @code{switch} statement
+@cindex @code{case} keyword
+@cindex @code{default} keyword
+
+This @value{SECTION} describes a @command{gawk}-specific feature.
+If @command{gawk} is in compatibility mode (@pxref{Options}),
+it is not available.
+
+The @code{switch} statement allows the evaluation of an expression and
+the execution of statements based on a @code{case} match. Case statements
+are checked for a match in the order they are defined.  If no suitable
+@code{case} is found, the @code{default} section is executed, if supplied.
+
+Each @code{case} contains a single constant, be it numeric, string, or
+regexp.  The @code{switch} expression is evaluated, and then each
+@code{case}'s constant is compared against the result in turn. The type of constant
+determines the comparison: numeric or string do the usual comparisons.
+A regexp constant does a regular expression match against the string
+value of the original expression.  The general form of the @code{switch}
+statement looks like this:
+
+@example
+switch (@var{expression}) @{
+case @var{value or regular expression}:
+    @var{case-body}
+default:
+    @var{default-body}
+@}
+@end example
+
+Control flow in
+the @code{switch} statement works as it does in C. Once a match to a given
+case is made, the case statement bodies execute until a @code{break},
+@code{continue}, @code{next}, @code{nextfile}, or @code{exit} is encountered,
+or the end of the @code{switch} statement itself. For example:
+
+@example
+while ((c = getopt(ARGC, ARGV, "aksx")) != -1) @{
+    switch (c) @{
+    case "a":
+        # report size of all files
+        all_files = TRUE;
+        break
+    case "k":
+        BLOCK_SIZE = 1024       # 1K block size
+        break
+    case "s":
+        # do sums only
+        sum_only = TRUE
+        break
+    case "x":
+        # don't cross filesystems
+        fts_flags = or(fts_flags, FTS_XDEV)
+        break
+    case "?":
+    default:
+        usage()
+        break
+    @}
+@}
+@end example
+
+Note that if none of the statements specified here halt execution
+of a matched @code{case} statement, execution falls through to the
+next @code{case} until execution halts. In this example, the
+@code{case} for @code{"?"} falls through to the @code{default}
+case, which is to call a function named @code{usage()}.
+(The @code{getopt()} function being called here is
+described in @ref{Getopt Function}.)
+
+@node Break Statement
+@subsection The @code{break} Statement
+@cindex @code{break} statement
+@cindex loops, exiting
+@cindex loops, @code{break} statement and
+
+The @code{break} statement jumps out of the innermost @code{for},
+@code{while}, or @code{do} loop that encloses it.  The following example
+finds the smallest divisor of any integer, and also identifies prime
+numbers:
+
+@example
+@group
+# find smallest divisor of num
+@{
+    num = $1
+    for (divisor = 2; divisor * divisor <= num; divisor++) @{
+        if (num % divisor == 0)
+            break
+    @}
+@end group
+@group
+    if (num % divisor == 0)
+        printf "Smallest divisor of %d is %d\n", num, divisor
+    else
+        printf "%d is prime\n", num
+@}
+@end group
+@end example
+
+When the remainder is zero in the first @code{if} statement, @command{awk}
+immediately @dfn{breaks out} of the containing @code{for} loop.  This means
+that @command{awk} proceeds immediately to the statement following the loop
+and continues processing.  (This is very different from the @code{exit}
+statement, which stops the entire @command{awk} program.
+@xref{Exit Statement}.)
+
+The following program illustrates how the @var{condition} of a @code{for}
+or @code{while} statement could be replaced with a @code{break} inside
+an @code{if}:
+
+@example
+# find smallest divisor of num
+@{
+    num = $1
+    for (divisor = 2; ; divisor++) @{
+        if (num % divisor == 0) @{
+            printf "Smallest divisor of %d is %d\n", num, divisor
+            break
+        @}
+        if (divisor * divisor > num) @{
+            printf "%d is prime\n", num
+            break
+        @}
+    @}
+@}
+@end example
+
+The @code{break} statement is also used to break out of the
+@code{switch} statement.
+This is discussed in @ref{Switch Statement}.
+
+@c @cindex @code{break}, outside of loops
+@c @cindex historical features
+@c @cindex @command{awk} language, POSIX version
+@cindex POSIX @command{awk}, @code{break} statement and
+@cindex dark corner, @code{break} statement
+@cindex @command{gawk}, @code{break} statement in
+@cindex Brian Kernighan's @command{awk}
+The @code{break} statement has no meaning when
+used outside the body of a loop or @code{switch}.
+However, although it was never documented,
+historical implementations of @command{awk} treated the @code{break}
+statement outside of a loop as if it were a @code{next} statement
+(@pxref{Next Statement}).
+@value{DARKCORNER}
+Recent versions of BWK @command{awk} no longer allow this usage,
+nor does @command{gawk}.
+
+@node Continue Statement
+@subsection The @code{continue} Statement
+
+@cindex @code{continue} statement
+Similar to @code{break}, the @code{continue} statement is used only inside
+@code{for}, @code{while}, and @code{do} loops.  It skips
+over the rest of the loop body, causing the next cycle around the loop
+to begin immediately.  Contrast this with @code{break}, which jumps out
+of the loop altogether.
+
+The @code{continue} statement in a @code{for} loop directs @command{awk} to
+skip the rest of the body of the loop and resume execution with the
+increment-expression of the @code{for} statement.  The following program
+illustrates this fact:
+
+@example
+BEGIN @{
+     for (x = 0; x <= 20; x++) @{
+         if (x == 5)
+             continue
+         printf "%d ", x
+     @}
+     print ""
+@}
+@end example
+
+@noindent
+This program prints all the numbers from 0 to 20---except for 5, for
+which the @code{printf} is skipped.  Because the increment @samp{x++}
+is not skipped, @code{x} does not remain stuck at 5.  Contrast the
+@code{for} loop from the previous example with the following @code{while} loop:
+
+@example
+BEGIN @{
+     x = 0
+     while (x <= 20) @{
+         if (x == 5)
+             continue
+         printf "%d ", x
+         x++
+     @}
+     print ""
+@}
+@end example
+
+@noindent
+This program loops forever once @code{x} reaches 5, because
+the increment (@samp{x++}) is never reached.
+
+@c @cindex @code{continue}, outside of loops
+@c @cindex historical features
+@c @cindex @command{awk} language, POSIX version
+@cindex POSIX @command{awk}, @code{continue} statement and
+@cindex dark corner, @code{continue} statement
+@cindex @command{gawk}, @code{continue} statement in
+@cindex Brian Kernighan's @command{awk}
+The @code{continue} statement has no special meaning with respect to the
+@code{switch} statement, nor does it have any meaning when used outside the
+body of a loop.  Historical versions of @command{awk} treated a @code{continue}
+statement outside a loop the same way they treated a @code{break}
+statement outside a loop: as if it were a @code{next}
+statement
+@ifset FOR_PRINT
+(discussed in the following @value{SECTION}).
+@end ifset
+@ifclear FOR_PRINT
+(@pxref{Next Statement}).
+@end ifclear
+@value{DARKCORNER}
+Recent versions of BWK @command{awk} no longer work this way, nor
+does @command{gawk}.
+
+@node Next Statement
+@subsection The @code{next} Statement
+@cindex @code{next} statement
+
+The @code{next} statement forces @command{awk} to immediately stop processing
+the current record and go on to the next record.  This means that no
+further rules are executed for the current record, and the rest of the
+current rule's action isn't executed.
+
+Contrast this with the effect of the @code{getline} function
+(@pxref{Getline}).  That also causes
+@command{awk} to read the next record immediately, but it does not alter the
+flow of control in any way (i.e., the rest of the current action executes
+with a new input record).
+
+@cindex @command{awk} programs, execution of
+At the highest level, @command{awk} program execution is a loop that reads
+an input record and then tests each rule's pattern against it.  If you
+think of this loop as a @code{for} statement whose body contains the
+rules, then the @code{next} statement is analogous to a @code{continue}
+statement. It skips to the end of the body of this implicit loop and
+executes the increment (which reads another record).
+
+For example, suppose an @command{awk} program works only on records
+with four fields, and it shouldn't fail when given bad input.  To avoid
+complicating the rest of the program, write a ``weed out'' rule near
+the beginning, in the following manner:
+
+@example
+NF != 4 @{
+    printf("%s:%d: skipped: NF != 4\n", FILENAME, FNR) > "/dev/stderr"
+    next
+@}
+@end example
+
+@noindent
+Because of the @code{next} statement,
+the program's subsequent rules won't see the bad record.  The error
+message is redirected to the standard error output stream, as error
+messages should be.
+For more detail, see
+@ref{Special Files}.
+
+If the @code{next} statement causes the end of the input to be reached,
+then the code in any @code{END} rules is executed.
+@xref{BEGIN/END}.
+
+The @code{next} statement is not allowed inside @code{BEGINFILE} and
+@code{ENDFILE} rules. @xref{BEGINFILE/ENDFILE}.
+
+@c @cindex @command{awk} language, POSIX version
+@c @cindex @code{next}, inside a user-defined function
+@cindex @code{BEGIN} pattern, @code{next}/@code{nextfile} statements and
+@cindex @code{END} pattern, @code{next}/@code{nextfile} statements and
+@cindex POSIX @command{awk}, @code{next}/@code{nextfile} statements and
+@cindex @code{next} statement, user-defined functions and
+@cindex functions, user-defined, @code{next}/@code{nextfile} statements and
+According to the POSIX standard, the behavior is undefined if the
+@code{next} statement is used in a @code{BEGIN} or @code{END} rule.
+@command{gawk} treats it as a syntax error.  Although POSIX does not disallow it,
+most other @command{awk} implementations don't allow the @code{next}
+statement inside function bodies (@pxref{User-defined}).  Just as with any
+other @code{next} statement, a @code{next} statement inside a function
+body reads the next record and starts processing it with the first rule
+in the program.
+
+@node Nextfile Statement
+@subsection The @code{nextfile} Statement
+@cindex @code{nextfile} statement
+
+The @code{nextfile} statement
+is similar to the @code{next} statement.
+However, instead of abandoning processing of the current record, the
+@code{nextfile} statement instructs @command{awk} to stop processing the
+current @value{DF}.
+
+Upon execution of the @code{nextfile} statement,
+@code{FILENAME} is
+updated to the name of the next @value{DF} listed on the command line,
+@code{FNR} is reset to one,
+and processing
+starts over with the first rule in the program.
+If the @code{nextfile} statement causes the end of the input to be reached,
+then the code in any @code{END} rules is executed. An exception to this is
+when @code{nextfile} is invoked during execution of any statement in an
+@code{END} rule; in this case, it causes the program to stop immediately.
+@xref{BEGIN/END}.
+
+The @code{nextfile} statement is useful when there are many @value{DF}s
+to process but it isn't necessary to process every record in every file.
+Without @code{nextfile},
+in order to move on to the next @value{DF}, a program
+would have to continue scanning the unwanted records.  The @code{nextfile}
+statement accomplishes this much more efficiently.
+
+In @command{gawk}, execution of @code{nextfile} causes additional things
+to happen: any @code{ENDFILE} rules are executed if @command{gawk} is
+not currently in an @code{END} or @code{BEGINFILE} rule, @code{ARGIND} is
+incremented, and any @code{BEGINFILE} rules are executed.  (@code{ARGIND}
+hasn't been introduced yet. @xref{Built-in Variables}.)
+
+With @command{gawk}, @code{nextfile} is useful inside a @code{BEGINFILE}
+rule to skip over a file that would otherwise cause @command{gawk}
+to exit with a fatal error. In this case, @code{ENDFILE} rules are not
+executed. @xref{BEGINFILE/ENDFILE}.
+
+Although it might seem that @samp{close(FILENAME)} would accomplish
+the same as @code{nextfile}, this isn't true.  @code{close()} is
+reserved for closing files, pipes, and coprocesses that are
+opened with redirections.  It is not related to the main processing that
+@command{awk} does with the files listed in @code{ARGV}.
+
+@quotation NOTE
+For many years, @code{nextfile} was a
+common extension. In September 2012, it was accepted for
+inclusion into the POSIX standard.
+See @uref{http://austingroupbugs.net/view.php?id=607, the Austin Group website}.
+@end quotation
+
+@cindex functions, user-defined, @code{next}/@code{nextfile} statements and
+@cindex @code{nextfile} statement, user-defined functions and
+@cindex Brian Kernighan's @command{awk}
+@cindex @command{mawk} utility
+The current version of BWK @command{awk} and @command{mawk}
+also support @code{nextfile}.  However, they don't allow the
+@code{nextfile} statement inside function bodies (@pxref{User-defined}).
+@command{gawk} does; a @code{nextfile} inside a function body reads the
+first record from the next file and starts processing it with the first
+rule in the program, just as any other @code{nextfile} statement.
+
+@node Exit Statement
+@subsection The @code{exit} Statement
+
+@cindex @code{exit} statement
+The @code{exit} statement causes @command{awk} to immediately stop
+executing the current rule and to stop processing input; any remaining input
+is ignored.  The @code{exit} statement is written as follows:
+
+@display
+@code{exit} [@var{return code}]
+@end display
+
+@cindex @code{BEGIN} pattern, @code{exit} statement and
+@cindex @code{END} pattern, @code{exit} statement and
+When an @code{exit} statement is executed from a @code{BEGIN} rule, the
+program stops processing everything immediately.  No input records are
+read.  However, if an @code{END} rule is present,
+as part of executing the @code{exit} statement,
+the @code{END} rule is executed
+(@pxref{BEGIN/END}).
+If @code{exit} is used in the body of an @code{END} rule, it causes
+the program to stop immediately.
+
+An @code{exit} statement that is not part of a @code{BEGIN} or @code{END}
+rule stops the execution of any further automatic rules for the current
+record, skips reading any remaining input records, and executes the
+@code{END} rule if there is one.  @command{gawk} also skips
+any @code{ENDFILE} rules; they do not execute.
+
+In such a case,
+if you don't want the @code{END} rule to do its job, set a variable
+to a nonzero value before the @code{exit} statement and check that variable in
+the @code{END} rule.
+@xref{Assert Function}
+for an example that does this.
+
+@cindex dark corner, @code{exit} statement
+If an argument is supplied to @code{exit}, its value is used as the exit
+status code for the @command{awk} process.  If no argument is supplied,
+@code{exit} causes @command{awk} to return a ``success'' status.
+In the case where an argument
+is supplied to a first @code{exit} statement, and then @code{exit} is
+called a second time from an @code{END} rule with no argument,
+@command{awk} uses the previously supplied exit value.  @value{DARKCORNER}
+@xref{Exit Status} for more information.
+
+@cindex programming conventions, @code{exit} statement
+For example, suppose an error condition occurs that is difficult or
+impossible to handle.  Conventionally, programs report this by
+exiting with a nonzero status.  An @command{awk} program can do this
+using an @code{exit} statement with a nonzero argument, as shown
+in the following example:
+
+@example
+@group
+BEGIN @{
+    if (("date" | getline date_now) <= 0) @{
+        print "Can't get system date" > "/dev/stderr"
+        exit 1
+    @}
+@end group
+@group
+    print "current date is", date_now
+    close("date")
+@}
+@end group
+@end example
+
+@quotation NOTE
+For full portability, exit values should be between zero and 126, inclusive.
+Negative values, and values of 127 or greater, may not produce consistent
+results across different operating systems.
+@end quotation
+
+
+@node Built-in Variables
+@section Predefined Variables
+@cindex predefined variables
+@cindex variables, predefined
+
+Most @command{awk} variables are available to use for your own
+purposes; they never change unless your program assigns values to
+them, and they never affect anything unless your program examines them.
+However, a few variables in @command{awk} have special built-in meanings.
+@command{awk} examines some of these automatically, so that they enable you
+to tell @command{awk} how to do certain things.  Others are set
+automatically by @command{awk}, so that they carry information from the
+internal workings of @command{awk} to your program.
+
+@cindex @command{gawk}, predefined variables and
+This @value{SECTION} documents all of @command{gawk}'s predefined variables,
+most of which are also documented in the @value{CHAPTER}s describing
+their areas of activity.
+
+@menu
+* User-modified::               Built-in variables that you change to control
+                                @command{awk}.
+* Auto-set::                    Built-in variables where @command{awk} gives
+                                you information.
+* ARGC and ARGV::               Ways to use @code{ARGC} and @code{ARGV}.
+@end menu
+
+@node User-modified
+@subsection Built-in Variables That Control @command{awk}
+@cindex predefined variables, user-modifiable
+@cindex user-modifiable variables
+
+The following is an alphabetical list of variables that you can change to
+control how @command{awk} does certain things.
+
+The variables that are specific to @command{gawk} are marked with a pound
+sign (@samp{#}).  These variables are @command{gawk} extensions.  In other
+@command{awk} implementations or if @command{gawk} is in compatibility
+mode (@pxref{Options}), they are not special.  (Any exceptions are noted
+in the description of each variable.)
+
+@table @code
+@cindex @code{BINMODE} variable
+@cindex binary input/output
+@cindex input/output, binary
+@cindex differences in @command{awk} and @command{gawk}, @code{BINMODE} variable
+@item BINMODE #
+On non-POSIX systems, this variable specifies use of binary mode
+for all I/O.  Numeric values of one, two, or three specify that input
+files, output files, or all files, respectively, should use binary I/O.
+A numeric value less than zero is treated as zero, and a numeric value
+greater than three is treated as three.  Alternatively, string values
+of @code{"r"} or @code{"w"} specify that input files and output files,
+respectively, should use binary I/O.  A string value of @code{"rw"} or
+@code{"wr"} indicates that all files should use binary I/O.  Any other
+string value is treated the same as @code{"rw"}, but causes @command{gawk}
+to generate a warning message.  @code{BINMODE} is described in more
+detail in @ref{PC Using}.  @command{mawk} (@pxref{Other Versions})
+also supports this variable, but only using numeric values.
+
+@cindex @code{CONVFMT} variable
+@cindex POSIX @command{awk}, @code{CONVFMT} variable and
+@cindex numbers, converting, to strings
+@cindex strings, converting, numbers to
+@item @code{CONVFMT}
+A string that controls the conversion of numbers to
+strings (@pxref{Conversion}).
+It works by being passed, in effect, as the first argument to the
+@code{sprintf()} function
+(@pxref{String Functions}).
+Its default value is @code{"%.6g"}.
+@code{CONVFMT} was introduced by the POSIX standard.
+
+@cindex @command{gawk}, @code{FIELDWIDTHS} variable in
+@cindex @code{FIELDWIDTHS} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{FIELDWIDTHS} variable
+@cindex field separators, @code{FIELDWIDTHS} variable and
+@cindex separators, field, @code{FIELDWIDTHS} variable and
+@item FIELDWIDTHS #
+A space-separated list of columns that tells @command{gawk}
+how to split input with fixed columnar boundaries.
+Starting in @value{PVERSION} 4.2, each field width may optionally be
+preceded by a colon-separated value specifying the number of characters to skip
+before the field starts.
+Assigning a value to @code{FIELDWIDTHS}
+overrides the use of @code{FS} and @code{FPAT} for field splitting.
+@xref{Constant Size} for more information.
+
+@cindex @command{gawk}, @code{FPAT} variable in
+@cindex @code{FPAT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{FPAT} variable
+@cindex field separators, @code{FPAT} variable and
+@cindex separators, field, @code{FPAT} variable and
+@item FPAT #
+A regular expression (as a string) that tells @command{gawk}
+to create the fields based on text that matches the regular expression.
+Assigning a value to @code{FPAT}
+overrides the use of @code{FS} and @code{FIELDWIDTHS} for field splitting.
+@xref{Splitting By Content} for more information.
+
+@cindex @code{FS} variable
+@cindex separators, field
+@cindex field separators
+@item FS
+The input field separator (@pxref{Field Separators}).
+The value is a single-character string or a multicharacter regular
+expression that matches the separations between fields in an input
+record.  If the value is the null string (@code{""}), then each
+character in the record becomes a separate field.
+(This behavior is a @command{gawk} extension. POSIX @command{awk} does not
+specify the behavior when @code{FS} is the null string.
+Nonetheless, some other versions of @command{awk} also treat
+@code{""} specially.)
+
+The default value is @w{@code{" "}}, a string consisting of a single
+space.  As a special exception, this value means that any sequence of
+spaces, TABs, and/or newlines is a single separator.  It also causes
+spaces, TABs, and newlines at the beginning and end of a record to
+be ignored.
+
+You can set the value of @code{FS} on the command line using the
+@option{-F} option:
+
+@example
+awk -F, '@var{program}' @var{input-files}
+@end example
+
+@cindex @command{gawk}, field separators and
+If @command{gawk} is using @code{FIELDWIDTHS} or @code{FPAT}
+for field splitting,
+assigning a value to @code{FS} causes @command{gawk} to return to
+the normal, @code{FS}-based field splitting. An easy way to do this
+is to simply say @samp{FS = FS}, perhaps with an explanatory comment.
+
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+@cindex @code{IGNORECASE} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{IGNORECASE} variable
+@cindex case sensitivity, string comparisons and
+@cindex case sensitivity, regexps and
+@cindex regular expressions, case sensitivity
+@item IGNORECASE #
+If @code{IGNORECASE} is nonzero or non-null, then all string comparisons
+and all regular expression matching are case-independent.
+This applies to
+regexp matching with @samp{~} and @samp{!~},
+the @code{gensub()}, @code{gsub()}, @code{index()}, @code{match()},
+@code{patsplit()}, @code{split()}, and @code{sub()} functions,
+record termination with @code{RS}, and field splitting with
+@code{FS} and @code{FPAT}.
+However, the value of @code{IGNORECASE} does @emph{not} affect array subscripting
+and it does not affect field splitting when using a single-character
+field separator.
+@xref{Case-sensitivity}.
+
+@cindex @command{gawk}, @code{LINT} variable in
+@cindex @code{LINT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{LINT} variable
+@cindex lint checking
+@item LINT #
+When this variable is true (nonzero or non-null), @command{gawk}
+behaves as if the @option{--lint} command-line option is in effect
+(@pxref{Options}).
+With a value of @code{"fatal"}, lint warnings become fatal errors.
+With a value of @code{"invalid"}, only warnings about things that are
+actually invalid are issued. (This is not fully implemented yet.)
+Any other true value prints nonfatal warnings.
+Assigning a false value to @code{LINT} turns off the lint warnings.
+
+This variable is a @command{gawk} extension.  It is not special
+in other @command{awk} implementations.  Unlike with the other special variables,
+changing @code{LINT} does affect the production of lint warnings,
+even if @command{gawk} is in compatibility mode.  Much as
+the @option{--lint} and @option{--traditional} options independently
+control different aspects of @command{gawk}'s behavior, the control
+of lint warnings during program execution is independent of the flavor
+of @command{awk} being executed.
+
+@cindex @code{OFMT} variable
+@cindex numbers, converting, to strings
+@cindex strings, converting, numbers to
+@item OFMT
+A string that controls conversion of numbers to
+strings (@pxref{Conversion}) for
+printing with the @code{print} statement.  It works by being passed
+as the first argument to the @code{sprintf()} function
+(@pxref{String Functions}).
+Its default value is @code{"%.6g"}.  Earlier versions of @command{awk}
+used @code{OFMT} to specify the format for converting numbers to
+strings in general expressions; this is now done by @code{CONVFMT}.
+
+@cindex @code{print} statement, @code{OFMT} variable and
+@cindex @code{OFS} variable
+@cindex separators, field
+@cindex field separators
+@item OFS
+The output field separator (@pxref{Output Separators}).  It is
+output between the fields printed by a @code{print} statement.  Its
+default value is @w{@code{" "}}, a string consisting of a single space.
+
+@cindex @code{ORS} variable
+@item ORS
+The output record separator.  It is output at the end of every
+@code{print} statement.  Its default value is @code{"\n"}, the newline
+character.  (@xref{Output Separators}.)
+
+@cindex @code{PREC} variable
+@item PREC #
+The working precision of arbitrary-precision floating-point numbers,
+53 bits by default (@pxref{Setting precision}).
+
+@cindex @code{ROUNDMODE} variable
+@item ROUNDMODE #
+The rounding mode to use for arbitrary-precision arithmetic on
+numbers, by default @code{"N"} (@code{roundTiesToEven} in
+the IEEE 754 standard; @pxref{Setting the rounding mode}).
+
+@cindex @code{RS} variable
+@cindex separators, for records
+@cindex record separators
+@item @code{RS}
+The input record separator.  Its default value is a string
+containing a single newline character, which means that an input record
+consists of a single line of text.
+It can also be the null string, in which case records are separated by
+runs of blank lines.
+If it is a regexp, records are separated by
+matches of the regexp in the input text.
+(@xref{Records}.)
+
+The ability for @code{RS} to be a regular expression
+is a @command{gawk} extension.
+In most other @command{awk} implementations,
+or if @command{gawk} is in compatibility mode
+(@pxref{Options}),
+just the first character of @code{RS}'s value is used.
+
+@cindex @code{SUBSEP} variable
+@cindex separators, subscript
+@cindex subscript separators
+@item @code{SUBSEP}
+The subscript separator.  It has the default value of
+@code{"\034"} and is used to separate the parts of the indices of a
+multidimensional array.  Thus, the expression @samp{@w{foo["A", "B"]}}
+really accesses @code{foo["A\034B"]}
+(@pxref{Multidimensional}).
+
+@cindex @command{gawk}, @code{TEXTDOMAIN} variable in
+@cindex @code{TEXTDOMAIN} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{TEXTDOMAIN} variable
+@cindex internationalization, localization
+@item TEXTDOMAIN #
+Used for internationalization of programs at the
+@command{awk} level.  It sets the default text domain for specially
+marked string constants in the source text, as well as for the
+@code{dcgettext()}, @code{dcngettext()}, and @code{bindtextdomain()} functions
+(@pxref{Internationalization}).
+The default value of @code{TEXTDOMAIN} is @code{"messages"}.
+@end table
+
+@node Auto-set
+@subsection Built-in Variables That Convey Information
+
+@cindex predefined variables, conveying information
+@cindex variables, predefined, conveying information
+The following is an alphabetical list of variables that @command{awk}
+sets automatically on certain occasions in order to provide
+information to your program.
+
+The variables that are specific to @command{gawk} are marked with a pound
+sign (@samp{#}).  These variables are @command{gawk} extensions.  In other
+@command{awk} implementations or if @command{gawk} is in compatibility
+mode (@pxref{Options}), they are not special:
+
+@c @asis for docbook
+@table @asis
+@cindex @code{ARGC}/@code{ARGV} variables
+@cindex arguments, command-line
+@cindex command line, arguments
+@item @code{ARGC}, @code{ARGV}
+The command-line arguments available to @command{awk} programs are stored in
+an array called @code{ARGV}.  @code{ARGC} is the number of command-line
+arguments present.  @xref{Other Arguments}.
+Unlike most @command{awk} arrays,
+@code{ARGV} is indexed from 0 to @code{ARGC} @minus{} 1.
+In the following example:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{}
+>         @kbd{for (i = 0; i < ARGC; i++)}
+>             @kbd{print ARGV[i]}
+>      @kbd{@}' inventory-shipped mail-list}
+@print{} awk
+@print{} inventory-shipped
+@print{} mail-list
+@end group
+@end example
+
+@noindent
+@code{ARGV[0]} contains @samp{awk}, @code{ARGV[1]}
+contains @samp{inventory-shipped}, and @code{ARGV[2]} contains
+@samp{mail-list}.  The value of @code{ARGC} is three, one more than the
+index of the last element in @code{ARGV}, because the elements are numbered
+from zero.
+
+@cindex programming conventions, @code{ARGC}/@code{ARGV} variables
+The names @code{ARGC} and @code{ARGV}, as well as the convention of indexing
+the array from 0 to @code{ARGC} @minus{} 1, are derived from the C language's
+method of accessing command-line arguments.
+
+@cindex dark corner, value of @code{ARGV[0]}
+The value of @code{ARGV[0]} can vary from system to system.
+Also, you should note that the program text is @emph{not} included in
+@code{ARGV}, nor are any of @command{awk}'s command-line options.
+@xref{ARGC and ARGV} for information
+about how @command{awk} uses these variables.
+@value{DARKCORNER}
+
+@cindex @code{ARGIND} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{ARGIND} variable
+@item @code{ARGIND #}
+The index in @code{ARGV} of the current file being processed.
+Every time @command{gawk} opens a new @value{DF} for processing, it sets
+@code{ARGIND} to the index in @code{ARGV} of the @value{FN}.
+When @command{gawk} is processing the input files,
+@samp{FILENAME == ARGV[ARGIND]} is always true.
+
+@cindex files, processing@comma{} @code{ARGIND} variable and
+This variable is useful in file processing; it allows you to tell how far
+along you are in the list of @value{DF}s as well as to distinguish between
+successive instances of the same @value{FN} on the command line.
+
+@cindex file names, distinguishing
+While you can change the value of @code{ARGIND} within your @command{awk}
+program, @command{gawk} automatically sets it to a new value when it
+opens the next file.
+
+@cindex @code{ENVIRON} array
+@cindex environment variables, in @code{ENVIRON} array
+@item @code{ENVIRON}
+An associative array containing the values of the environment.  The array
+indices are the environment variable names; the elements are the values of
+the particular environment variables.  For example,
+@code{ENVIRON["HOME"]} might be @code{/home/arnold}.
+
+For POSIX @command{awk}, changing this array does not affect the
+environment passed on to any programs that @command{awk} may spawn via
+redirection or the @code{system()} function.
+
+However, beginning with @value{PVERSION} 4.2, if not in POSIX
+compatibility mode, @command{gawk} does update its own environment when
+@code{ENVIRON} is changed, thus changing the environment seen by programs
+that it creates.  You should therefore be especially careful if you
+modify @code{ENVIRON["PATH"]}, which is the search path for finding
+executable programs.
+
+This can also affect the running @command{gawk} program, since some of the
+built-in functions may pay attention to certain environment variables.
+The most notable instance of this is @code{mktime()} (@pxref{Time
+Functions}), which pays attention the value of the @env{TZ} environment
+variable on many systems.
+
+Some operating systems may not have environment variables.
+On such systems, the @code{ENVIRON} array is empty (except for
+@w{@code{ENVIRON["AWKPATH"]}} and
+@w{@code{ENVIRON["AWKLIBPATH"]}};
+@pxref{AWKPATH Variable} and
+@ifdocbook
+@ref{AWKLIBPATH Variable}).
+@end ifdocbook
+@ifnotdocbook
+@pxref{AWKLIBPATH Variable}).
+@end ifnotdocbook
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{ERRNO} variable
+@cindex error handling, @code{ERRNO} variable and
+@item @code{ERRNO #}
+If a system error occurs during a redirection for @code{getline}, during
+a read for @code{getline}, or during a @code{close()} operation, then
+@code{ERRNO} contains a string describing the error.
+
+In addition, @command{gawk} clears @code{ERRNO} before opening each
+command-line input file. This enables checking if the file is readable
+inside a @code{BEGINFILE} pattern (@pxref{BEGINFILE/ENDFILE}).
+
+Otherwise, @code{ERRNO} works similarly to the C variable @code{errno}.
+Except for the case just mentioned, @command{gawk} @emph{never} clears
+it (sets it to zero or @code{""}).  Thus, you should only expect its
+value to be meaningful when an I/O operation returns a failure value,
+such as @code{getline} returning @minus{}1.  You are, of course, free
+to clear it yourself before doing an I/O operation.
+
+If the value of @code{ERRNO} corresponds to a system error in the C
+@code{errno} variable, then @code{PROCINFO["errno"]} will be set to the value
+of @code{errno}.  For non-system errors, @code{PROCINFO["errno"]} will
+be zero.
+
+@cindex @code{FILENAME} variable
+@cindex dark corner, @code{FILENAME} variable
+@item @code{FILENAME}
+The name of the current input file.  When no @value{DF}s are listed
+on the command line, @command{awk} reads from the standard input and
+@code{FILENAME} is set to @code{"-"}.  @code{FILENAME} changes each
+time a new file is read (@pxref{Reading Files}).  Inside a @code{BEGIN}
+rule, the value of @code{FILENAME} is @code{""}, because there are no input
+files being processed yet.@footnote{Some early implementations of Unix
+@command{awk} initialized @code{FILENAME} to @code{"-"}, even if there
+were @value{DF}s to be processed. This behavior was incorrect and should
+not be relied upon in your programs.} @value{DARKCORNER} Note, though,
+that using @code{getline} (@pxref{Getline}) inside a @code{BEGIN} rule
+can give @code{FILENAME} a value.
+
+@cindex @code{FNR} variable
+@item @code{FNR}
+The current record number in the current file.  @command{awk} increments
+@code{FNR} each time it reads a new record (@pxref{Records}).
+@command{awk} resets @code{FNR} to zero each time it starts a new
+input file.
+
+@cindex @code{NF} variable
+@item @code{NF}
+The number of fields in the current input record.
+@code{NF} is set each time a new record is read, when a new field is
+created, or when @code{$0} changes (@pxref{Fields}).
+
+Unlike most of the variables described in this @value{SUBSECTION},
+assigning a value to @code{NF} has the potential to affect
+@command{awk}'s internal workings.  In particular, assignments
+to @code{NF} can be used to create fields in or remove fields from the
+current record. @xref{Changing Fields}.
+
+@cindex @code{FUNCTAB} array
+@cindex @command{gawk}, @code{FUNCTAB} array in
+@cindex differences in @command{awk} and @command{gawk}, @code{FUNCTAB} variable
+@item @code{FUNCTAB #}
+An array whose indices and corresponding values are the names of all
+the built-in, user-defined, and extension functions in the program.
+
+@quotation NOTE
+Attempting to use the @code{delete} statement with the @code{FUNCTAB}
+array causes a fatal error.  Any attempt to assign to an element of
+@code{FUNCTAB} also causes a fatal error.
+@end quotation
+
+@cindex @code{NR} variable
+@item @code{NR}
+The number of input records @command{awk} has processed since
+the beginning of the program's execution
+(@pxref{Records}).
+@command{awk} increments @code{NR} each time it reads a new record.
+
+@cindex @command{gawk}, @code{PROCINFO} array in
+@cindex @code{PROCINFO} array
+@cindex differences in @command{awk} and @command{gawk}, @code{PROCINFO} array
+@item @code{PROCINFO #}
+The elements of this array provide access to information about the
+running @command{awk} program.
+The following elements (listed alphabetically)
+are guaranteed to be available:
+
+@table @code
+@item PROCINFO["argv"]
+@cindex command line, arguments
+The @code{PROCINFO["argv"]} array contains all of the command-line arguments
+(after glob expansion and redirection processing on platforms where that must
+be done manually by the program) with subscripts ranging from 0 through
+@code{argc} @minus{} 1.  For example, @code{PROCINFO["argv"][0]} will contain
+the name by which @command{gawk} was invoked.  Here is an example of how this
+feature may be used:
+
+@example
+gawk '
+BEGIN @{
+        for (i = 0; i < length(PROCINFO["argv"]); i++)
+                print i, PROCINFO["argv"][i]
+@}'
+@end example
+
+Please note that this differs from the standard @code{ARGV} array which does
+not include command-line arguments that have already been processed by
+@command{gawk} (@pxref{ARGC and ARGV}).
+
+@cindex effective group ID of @command{gawk} user
+@item PROCINFO["egid"]
+The value of the @code{getegid()} system call.
+
+@item PROCINFO["errno"]
+The value of the C @code{errno} variable when @code{ERRNO} is set to
+the associated error message.
+
+@item PROCINFO["euid"]
+@cindex effective user ID of @command{gawk} user
+The value of the @code{geteuid()} system call.
+
+@item PROCINFO["FS"]
+This is
+@code{"FS"} if field splitting with @code{FS} is in effect,
+@code{"FIELDWIDTHS"} if field splitting with @code{FIELDWIDTHS} is in effect,
+@code{"FPAT"} if field matching with @code{FPAT} is in effect,
+or @code{"API"} if field splitting is controlled by an API input parser.
+
+@item PROCINFO["gid"]
+@cindex group ID of @command{gawk} user
+The value of the @code{getgid()} system call.
+
+@item PROCINFO["identifiers"]
+@cindex program identifiers
+A subarray, indexed by the names of all identifiers used in the text of
+the @command{awk} program.  An @dfn{identifier} is simply the name of a variable
+(be it scalar or array), built-in function, user-defined function, or
+extension function.  For each identifier, the value of the element is
+one of the following:
+
+@table @code
+@item "array"
+The identifier is an array.
+
+@item "builtin"
+The identifier is a built-in function.
+
+@item "extension"
+The identifier is an extension function loaded via
+@code{@@load} or @option{-l}.
+
+@item "scalar"
+The identifier is a scalar.
+
+@item "untyped"
+The identifier is untyped (could be used as a scalar or an array;
+@command{gawk} doesn't know yet).
+
+@item "user"
+The identifier is a user-defined function.
+@end table
+
+@noindent
+The values indicate what @command{gawk} knows about the identifiers
+after it has finished parsing the program; they are @emph{not} updated
+while the program runs.
+
+@item PROCINFO["platform"]
+@cindex platform running on
+This element gives a string indicating the platform for which
+@command{gawk} was compiled. The value will be one of the following:
+
+@c nested table
+@table @code
+@item "djgpp"
+@itemx "mingw"
+Microsoft Windows, using either DJGPP or MinGW, respectively.
+
+@item "os2"
+OS/2.
+
+@item "os390"
+OS/390.
+
+@item "posix"
+GNU/Linux, Cygwin, Mac OS X, and legacy Unix systems.
+
+@item "vms"
+OpenVMS or Vax/VMS.
+@end table
+
+@item PROCINFO["pgrpid"]
+@cindex process group ID of @command{gawk} process
+The process group ID of the current process.
+
+@item PROCINFO["pid"]
+@cindex process ID of @command{gawk} process
+The process ID of the current process.
+
+@item PROCINFO["ppid"]
+@cindex parent process ID of @command{gawk} process
+The parent process ID of the current process.
+
+@item PROCINFO["strftime"]
+The default time format string for @code{strftime()}.
+Assigning a new value to this element changes the default.
+@xref{Time Functions}.
+
+@item PROCINFO["uid"]
+The value of the @code{getuid()} system call.
+
+@item PROCINFO["version"]
+@cindex version of @command{gawk}
+@cindex @command{gawk} version
+The version of @command{gawk}.
+@end table
+
+The following additional elements in the array
+are available to provide information about the MPFR and GMP libraries
+if your version of @command{gawk} supports arbitrary-precision arithmetic
+(@pxref{Arbitrary Precision Arithmetic}):
+
+@table @code
+@item PROCINFO["gmp_version"]
+@cindex version of GNU MP library
+The version of the GNU MP library.
+
+@cindex version of GNU MPFR library
+@item PROCINFO["mpfr_version"]
+The version of the GNU MPFR library.
+
+@item PROCINFO["prec_max"]
+@cindex maximum precision supported by MPFR library
+The maximum precision supported by MPFR.
+
+@item PROCINFO["prec_min"]
+@cindex minimum precision required by MPFR library
+The minimum precision required by MPFR.
+@end table
+
+The following additional elements in the array are available to provide
+information about the version of the extension API, if your version
+of @command{gawk} supports dynamic loading of extension functions
+(@pxref{Dynamic Extensions}):
+
+@table @code
+@item PROCINFO["api_major"]
+@cindex version of @command{gawk} extension API
+@cindex extension API, version number
+The major version of the extension API.
+
+@item PROCINFO["api_minor"]
+The minor version of the extension API.
+@end table
+
+@cindex supplementary groups of @command{gawk} process
+On some systems, there may be elements in the array, @code{"group1"}
+through @code{"group@var{N}"} for some @var{N}. @var{N} is the number of
+supplementary groups that the process has.  Use the @code{in} operator
+to test for these elements
+(@pxref{Reference to Elements}).
+
+The following elements allow you to change @command{gawk}'s behavior:
+
+@table @code
+@item PROCINFO["NONFATAL"]
+If this element exists, then I/O errors for all redirections become nonfatal.
+@xref{Nonfatal}.
+
+@item PROCINFO["@var{name}", "NONFATAL"]
+Make I/O errors for @var{name} be nonfatal.
+@xref{Nonfatal}.
+
+@item PROCINFO["@var{command}", "pty"]
+For two-way communication to @var{command}, use a pseudo-tty instead
+of setting up a two-way pipe.
+@xref{Two-way I/O} for more information.
+
+@item PROCINFO["@var{input_name}", "READ_TIMEOUT"]
+Set a timeout for reading from input redirection @var{input_name}.
+@xref{Read Timeout} for more information.
+
+@item PROCINFO["@var{input_name}", "RETRY"]
+If an I/O error that may be retried occurs when reading data from
+@var{input_name}, and this array entry exists, then @code{getline} returns
+@minus{}2 instead of following the default behavior of returning @minus{}1
+and configuring @var{input_name} to return no further data.  An I/O error
+that may be retried is one where @code{errno} has the value @code{EAGAIN},
+@code{EWOULDBLOCK}, @code{EINTR}, or @code{ETIMEDOUT}.  This may be useful
+in conjunction with @code{PROCINFO["@var{input_name}", "READ_TIMEOUT"]}
+or situations where a file descriptor has been configured to behave in
+a non-blocking fashion.
+@xref{Retrying Input} for more information.
+
+@item PROCINFO["sorted_in"]
+If this element exists in @code{PROCINFO}, its value controls the
+order in which array indices will be processed by
+@samp{for (@var{indx} in @var{array})} loops.
+This is an advanced feature, so we defer the
+full description until later; see
+@ref{Controlling Scanning}.
+@end table
+
+@cindex @code{RLENGTH} variable
+@item @code{RLENGTH}
+The length of the substring matched by the
+@code{match()} function
+(@pxref{String Functions}).
+@code{RLENGTH} is set by invoking the @code{match()} function.  Its value
+is the length of the matched string, or @minus{}1 if no match is found.
+
+@cindex @code{RSTART} variable
+@item @code{RSTART}
+The start index in characters of the substring that is matched by the
+@code{match()} function
+(@pxref{String Functions}).
+@code{RSTART} is set by invoking the @code{match()} function.  Its value
+is the position of the string where the matched substring starts, or zero
+if no match was found.
+
+@cindex @command{gawk}, @code{RT} variable in
+@cindex @code{RT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{RS}/@code{RT} variables
+@item @code{RT #}
+The input text that matched the text denoted by @code{RS},
+the record separator.  It is set every time a record is read.
+
+@cindex @command{gawk}, @code{SYMTAB} array in
+@cindex @code{SYMTAB} array
+@cindex differences in @command{awk} and @command{gawk}, @code{SYMTAB} variable
+@item @code{SYMTAB #}
+An array whose indices are the names of all defined global variables and
+arrays in the program.  @code{SYMTAB} makes @command{gawk}'s symbol table
+visible to the @command{awk} programmer.  It is built as @command{gawk}
+parses the program and is complete before the program starts to run.
+
+The array may be used for indirect access to read or write the value of
+a variable:
+
+@example
+foo = 5
+SYMTAB["foo"] = 4
+print foo    # prints 4
+@end example
+
+@noindent
+The @code{isarray()} function (@pxref{Type Functions}) may be used to test
+if an element in @code{SYMTAB} is an array.
+Also, you may not use the @code{delete} statement with the
+@code{SYMTAB} array.
+
+Prior to @value{PVERSION} 5.0 of @command{gawk}, you could
+use an index for @code{SYMTAB} that was not a predefined identifier:
+
+@example
+SYMTAB["xxx"] = 5
+print SYMTAB["xxx"]
+@end example
+
+@noindent
+This no longer works, instead producing a fatal error, as it led
+to rampant confusion.
+
+@cindex Schorr, Andrew
+The @code{SYMTAB} array is more interesting than it looks. Andrew Schorr
+points out that it effectively gives @command{awk} data pointers. Consider his
+example:
+
+@example
+@group
+# Indirect multiply of any variable by amount, return result
+
+function multiply(variable, amount)
+@{
+    return SYMTAB[variable] *= amount
+@}
+@end group
+@end example
+
+@noindent
+You would use it like this:
+
+@example
+BEGIN @{
+    answer = 10.5
+    multiply("answer", 4)
+    print "The answer is", answer
+@}
+@end example
+
+@noindent
+When run, this produces:
+
+@example
+$ @kbd{gawk -f answer.awk}
+@print{} The answer is 42
+@end example
+
+@quotation NOTE
+In order to avoid severe time-travel paradoxes,@footnote{Not to mention
+difficult implementation issues.} neither @code{FUNCTAB} nor @code{SYMTAB}
+is available as an element within the @code{SYMTAB} array.
+@end quotation
+@end table
+
+@cindex sidebar, Changing @code{NR} and @code{FNR}
+@ifdocbook
+@docbook
+<sidebar><title>Changing @code{NR} and @code{FNR}</title>
+@end docbook
+
+@cindex @code{NR} variable, changing
+@cindex @code{FNR} variable, changing
+@cindex dark corner, @code{FNR}/@code{NR} variables
+@command{awk} increments @code{NR} and @code{FNR}
+each time it reads a record, instead of setting them to the absolute
+value of the number of records read.  This means that a program can
+change these variables and their new values are incremented for
+each record.
+@value{DARKCORNER}
+The following example shows this:
+
+@example
+$ @kbd{echo '1}
+> @kbd{2}
+> @kbd{3}
+> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}}
+> @kbd{@{ print NR @}'}
+@print{} 1
+@print{} 17
+@print{} 18
+@print{} 19
+@end example
+
+@noindent
+Before @code{FNR} was added to the @command{awk} language
+(@pxref{V7/SVR3.1}),
+many @command{awk} programs used this feature to track the number of
+records in a file by resetting @code{NR} to zero when @code{FILENAME}
+changed.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Changing @code{NR} and @code{FNR}}
+
+
+@cindex @code{NR} variable, changing
+@cindex @code{FNR} variable, changing
+@cindex dark corner, @code{FNR}/@code{NR} variables
+@command{awk} increments @code{NR} and @code{FNR}
+each time it reads a record, instead of setting them to the absolute
+value of the number of records read.  This means that a program can
+change these variables and their new values are incremented for
+each record.
+@value{DARKCORNER}
+The following example shows this:
+
+@example
+$ @kbd{echo '1}
+> @kbd{2}
+> @kbd{3}
+> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}}
+> @kbd{@{ print NR @}'}
+@print{} 1
+@print{} 17
+@print{} 18
+@print{} 19
+@end example
+
+@noindent
+Before @code{FNR} was added to the @command{awk} language
+(@pxref{V7/SVR3.1}),
+many @command{awk} programs used this feature to track the number of
+records in a file by resetting @code{NR} to zero when @code{FILENAME}
+changed.
+@end cartouche
+@end ifnotdocbook
+
+@node ARGC and ARGV
+@subsection Using @code{ARGC} and @code{ARGV}
+@cindex @code{ARGC}/@code{ARGV} variables, how to use
+@cindex arguments, command-line
+@cindex command line, arguments
+
+@ref{Auto-set}
+presented the following program describing the information contained in @code{ARGC}
+and @code{ARGV}:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{}
+>        @kbd{for (i = 0; i < ARGC; i++)}
+>            @kbd{print ARGV[i]}
+>      @kbd{@}' inventory-shipped mail-list}
+@print{} awk
+@print{} inventory-shipped
+@print{} mail-list
+@end group
+@end example
+
+@noindent
+In this example, @code{ARGV[0]} contains @samp{awk}, @code{ARGV[1]}
+contains @samp{inventory-shipped}, and @code{ARGV[2]} contains
+@samp{mail-list}.
+Notice that the @command{awk} program is not entered in @code{ARGV}.  The
+other command-line options, with their arguments, are also not
+entered.  This includes variable assignments done with the @option{-v}
+option (@pxref{Options}).
+Normal variable assignments on the command line @emph{are}
+treated as arguments and do show up in the @code{ARGV} array.
+Given the following program in a file named @file{showargs.awk}:
+
+@example
+BEGIN @{
+    printf "A=%d, B=%d\n", A, B
+    for (i = 0; i < ARGC; i++)
+        printf "\tARGV[%d] = %s\n", i, ARGV[i]
+@}
+END   @{ printf "A=%d, B=%d\n", A, B @}
+@end example
+
+@noindent
+Running it produces the following:
+
+@example
+$ @kbd{awk -v A=1 -f showargs.awk B=2 /dev/null}
+@print{} A=1, B=0
+@print{}        ARGV[0] = awk
+@print{}        ARGV[1] = B=2
+@print{}        ARGV[2] = /dev/null
+@print{} A=1, B=2
+@end example
+
+A program can alter @code{ARGC} and the elements of @code{ARGV}.
+Each time @command{awk} reaches the end of an input file, it uses the next
+element of @code{ARGV} as the name of the next input file.  By storing a
+different string there, a program can change which files are read.
+Use @code{"-"} to represent the standard input.  Storing
+additional elements and incrementing @code{ARGC} causes
+additional files to be read.
+
+If the value of @code{ARGC} is decreased, that eliminates input files
+from the end of the list.  By recording the old value of @code{ARGC}
+elsewhere, a program can treat the eliminated arguments as
+something other than @value{FN}s.
+
+To eliminate a file from the middle of the list, store the null string
+(@code{""}) into @code{ARGV} in place of the file's name.  As a
+special feature, @command{awk} ignores @value{FN}s that have been
+replaced with the null string.
+Another option is to
+use the @code{delete} statement to remove elements from
+@code{ARGV} (@pxref{Delete}).
+
+All of these actions are typically done in the @code{BEGIN} rule,
+before actual processing of the input begins.
+@xref{Split Program} and
+@ifnotdocbook
+@pxref{Tee Program}
+@end ifnotdocbook
+@ifdocbook
+@ref{Tee Program}
+@end ifdocbook
+for examples
+of each way of removing elements from @code{ARGV}.
+
+To actually get options into an @command{awk} program,
+end the @command{awk} options with @option{--} and then supply
+the @command{awk} program's options, in the following manner:
+
+@example
+awk -f myprog.awk -- -v -q file1 file2 @dots{}
+@end example
+
+The following fragment processes @code{ARGV} in order to examine, and
+then remove, the previously mentioned command-line options:
+
+@example
+BEGIN @{
+    for (i = 1; i < ARGC; i++) @{
+        if (ARGV[i] == "-v")
+            verbose = 1
+        else if (ARGV[i] == "-q")
+            debug = 1
+        else if (ARGV[i] ~ /^-./) @{
+            e = sprintf("%s: unrecognized option -- %c",
+                    ARGV[0], substr(ARGV[i], 2, 1))
+            print e > "/dev/stderr"
+        @} else
+            break
+        delete ARGV[i]
+    @}
+@}
+@end example
+
+@cindex differences in @command{awk} and @command{gawk}, @code{ARGC}/@code{ARGV} variables
+Ending the @command{awk} options with @option{--} isn't
+necessary in @command{gawk}. Unless @option{--posix} has
+been specified, @command{gawk} silently puts any unrecognized options
+into @code{ARGV} for the @command{awk} program to deal with.  As soon
+as it sees an unknown option, @command{gawk} stops looking for other
+options that it might otherwise recognize.  The previous command line with
+@command{gawk} would be:
+
+@example
+gawk -f myprog.awk -q -v file1 file2 @dots{}
+@end example
+
+@noindent
+Because @option{-q} is not a valid @command{gawk} option, it and the
+following @option{-v} are passed on to the @command{awk} program.
+(@xref{Getopt Function} for an @command{awk} library function that
+parses command-line options.)
+
+When designing your program, you should choose options that don't
+conflict with @command{gawk}'s, because it will process any options
+that it accepts before passing the rest of the command line on to
+your program.  Using @samp{#!} with the @option{-E} option may help
+(@pxref{Executable Scripts}
+and
+@ifnotdocbook
+@pxref{Options}).
+@end ifnotdocbook
+@ifdocbook
+@ref{Options}).
+@end ifdocbook
+
+@node Pattern Action Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Pattern--action pairs make up the basic elements of an @command{awk}
+program.  Patterns are either normal expressions, range expressions,
+or regexp constants; one of the special keywords @code{BEGIN}, @code{END},
+@code{BEGINFILE}, or @code{ENDFILE}; or empty.  The action executes if
+the current record matches the pattern.  Empty (missing) patterns match
+all records.
+
+@item
+I/O from @code{BEGIN} and @code{END} rules has certain constraints.
+This is also true, only more so, for @code{BEGINFILE} and @code{ENDFILE}
+rules.  The latter two give you ``hooks'' into @command{gawk}'s file
+processing, allowing you to recover from a file that otherwise would
+cause a fatal error (such as a file that cannot be opened).
+
+@item
+Shell variables can be used in @command{awk} programs by careful
+use of shell quoting.  It is easier to pass a shell variable into
+@command{awk} by using the @option{-v} option and an @command{awk}
+variable.
+
+@item
+Actions consist of statements enclosed in curly braces. Statements
+are built up from expressions, control statements, compound statements,
+input and output statements, and deletion statements.
+
+@item
+The control statements in @command{awk} are @code{if}-@code{else},
+@code{while}, @code{for}, and @code{do}-@code{while}.  @command{gawk}
+adds the @code{switch} statement.  There are two flavors of @code{for}
+statement: one for performing general looping, and the other for iterating
+through an array.
+
+@item
+@code{break} and @code{continue} let you exit early or start the next
+iteration of a loop (or get out of a @code{switch}).
+
+@item
+@code{next} and @code{nextfile} let you read the next record and start
+over at the top of your program or skip to the next input file and
+start over, respectively.
+
+@item
+The @code{exit} statement terminates your program. When executed
+from an action (or function body), it transfers control to the
+@code{END} statements. From an @code{END} statement body, it exits
+immediately.  You may pass an optional numeric value to be used
+as @command{awk}'s exit status.
+
+@item
+Some predefined variables provide control over @command{awk}, mainly for I/O.
+Other variables convey information from @command{awk} to your program.
+
+@item
+@code{ARGC} and @code{ARGV} make the command-line arguments available
+to your program. Manipulating them from a @code{BEGIN} rule lets you
+control how @command{awk} will process the provided @value{DF}s.
+
+@end itemize
+
+@node Arrays
+@chapter Arrays in @command{awk}
+@cindex arrays
+
+An @dfn{array} is a table of values called @dfn{elements}.  The
+elements of an array are distinguished by their @dfn{indices}.  Indices
+may be either numbers or strings.
+
+This @value{CHAPTER} describes how arrays work in @command{awk},
+how to use array elements, how to scan through every element in an array,
+and how to remove array elements.
+It also describes how @command{awk} simulates multidimensional
+arrays, as well as some of the less obvious points about array usage.
+The @value{CHAPTER} moves on to discuss @command{gawk}'s facility
+for sorting arrays, and ends with a brief description of @command{gawk}'s
+ability to support true arrays of arrays.
+
+@menu
+* Array Basics::                The basics of arrays.
+* Numeric Array Subscripts::    How to use numbers as subscripts in
+                                @command{awk}.
+* Uninitialized Subscripts::    Using Uninitialized variables as subscripts.
+* Delete::                      The @code{delete} statement removes an element
+                                from an array.
+* Multidimensional::            Emulating multidimensional arrays in
+                                @command{awk}.
+* Arrays of Arrays::            True multidimensional arrays.
+* Arrays Summary::              Summary of arrays.
+@end menu
+
+@node Array Basics
+@section The Basics of Arrays
+
+This @value{SECTION} presents the basics: working with elements
+in arrays one at a time, and traversing all of the elements in
+an array.
+
+@menu
+* Array Intro::                 Introduction to Arrays
+* Reference to Elements::       How to examine one element of an array.
+* Assigning Elements::          How to change an element of an array.
+* Array Example::               Basic Example of an Array
+* Scanning an Array::           A variation of the @code{for} statement. It
+                                loops through the indices of an array's
+                                existing elements.
+* Controlling Scanning::        Controlling the order in which arrays are
+                                scanned.
+@end menu
+
+@node Array Intro
+@subsection Introduction to Arrays
+
+@cindex Wall, Larry
+@quotation
+@i{Doing linear scans over an associative array is like trying to club someone
+to death with a loaded Uzi.}
+@author Larry Wall
+@end quotation
+
+The @command{awk} language provides one-dimensional arrays
+for storing groups of related strings or numbers.
+Every @command{awk} array must have a name.  Array names have the same
+syntax as variable names; any valid variable name would also be a valid
+array name.  But one name cannot be used in both ways (as an array and
+as a variable) in the same @command{awk} program.
+
+Arrays in @command{awk} superficially resemble arrays in other programming
+languages, but there are fundamental differences.  In @command{awk}, it
+isn't necessary to specify the size of an array before starting to use it.
+Additionally, any number or string, not just consecutive integers,
+may be used as an array index.
+
+In most other languages, arrays must be @dfn{declared} before use,
+including a specification of
+how many elements or components they contain.  In such languages, the
+declaration causes a contiguous block of memory to be allocated for that
+many elements.  Usually, an index in the array must be a nonnegative integer.
+For example, the index zero specifies the first element in the array, which is
+actually stored at the beginning of the block of memory.  Index one
+specifies the second element, which is stored in memory right after the
+first element, and so on.  It is impossible to add more elements to the
+array, because it has room only for as many elements as given in
+the declaration.
+(Some languages allow arbitrary starting and ending
+indices---e.g., @samp{15 .. 27}---but the size of the array is still fixed when
+the array is declared.)
+
+@c 1/2015: Do not put the numeric values into @code. Array element
+@c values are no different than scalar variable values.
+A contiguous array of four elements might look like
+@ifnotdocbook
+@ref{figure-array-elements},
+@end ifnotdocbook
+@ifdocbook
+@inlineraw{docbook, <xref linkend="figure-array-elements"/>},
+@end ifdocbook
+conceptually, if the element values are eight, @code{"foo"},
+@code{""}, and 30.
+
+@ifnotdocbook
+@float Figure,figure-array-elements
+@caption{A contiguous array}
+@center @image{array-elements, , , A Contiguous Array}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-array-elements" float="0">
+<title>A contiguous array</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="array-elements.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+@noindent
+Only the values are stored; the indices are implicit from the order of
+the values. Here, eight is the value at index zero, because eight appears in the
+position with zero elements before it.
+
+@cindex arrays, indexing
+@cindex indexing arrays
+@cindex associative arrays
+@cindex arrays, associative
+Arrays in @command{awk} are different---they are @dfn{associative}.  This means
+that each array is a collection of pairs---an index and its corresponding
+array element value:
+
+@ifnotdocbook
+@c extra empty column to indent it right
+@multitable @columnfractions .1 .1 .1
+@headitem @tab Index @tab Value
+@item @tab @code{3} @tab @code{30}
+@item @tab @code{1} @tab @code{"foo"}
+@item @tab @code{0} @tab @code{8}
+@item @tab @code{2} @tab @code{""}
+@end multitable
+@end ifnotdocbook
+
+@docbook
+<informaltable>
+<tgroup cols="2">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<thead>
+<row>
+<entry>Index</entry>
+<entry>Value</entry>
+</row>
+</thead>
+
+<tbody>
+<row>
+<entry><literal>3</literal></entry>
+<entry><literal>30</literal></entry>
+</row>
+
+<row>
+<entry><literal>1</literal></entry>
+<entry><literal>"foo"</literal></entry>
+</row>
+
+<row>
+<entry><literal>0</literal></entry>
+<entry><literal>8</literal></entry>
+</row>
+
+<row>
+<entry><literal>2</literal></entry>
+<entry><literal>""</literal></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+@noindent
+The pairs are shown in jumbled order because their order is
+irrelevant.@footnote{The ordering will vary among @command{awk}
+implementations, which typically use hash tables to store array elements
+and values.}
+
+One advantage of associative arrays is that new pairs can be added
+at any time.  For example, suppose a tenth element is added to the array
+whose value is @w{@code{"number ten"}}.  The result is:
+
+@ifnotdocbook
+@c extra empty column to indent it right
+@multitable @columnfractions .1 .1 .2
+@headitem @tab Index @tab Value
+@item @tab @code{10} @tab @code{"number ten"}
+@item @tab @code{3} @tab @code{30}
+@item @tab @code{1} @tab @code{"foo"}
+@item @tab @code{0} @tab @code{8}
+@item @tab @code{2} @tab @code{""}
+@end multitable
+@end ifnotdocbook
+
+@docbook
+<informaltable>
+<tgroup cols="2">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<thead>
+<row>
+<entry>Index</entry>
+<entry>Value</entry>
+</row>
+</thead>
+<tbody>
+
+<row>
+<entry><literal>10</literal></entry>
+<entry><literal>"number ten"</literal></entry>
+</row>
+
+<row>
+<entry><literal>3</literal></entry>
+<entry><literal>30</literal></entry>
+</row>
+
+<row>
+<entry><literal>1</literal></entry>
+<entry><literal>"foo"</literal></entry>
+</row>
+
+<row>
+<entry><literal>0</literal></entry>
+<entry><literal>8</literal></entry>
+</row>
+
+<row>
+<entry><literal>2</literal></entry>
+<entry><literal>""</literal></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+@noindent
+@cindex sparse arrays
+@cindex arrays, sparse
+Now the array is @dfn{sparse}, which just means some indices are missing.
+It has elements 0--3 and 10, but doesn't have elements 4, 5, 6, 7, 8, or 9.
+
+Another consequence of associative arrays is that the indices don't
+have to be nonnegative integers.  Any number, or even a string, can be
+an index.  For example, the following is an array that translates words from
+English to French:
+
+@ifnotdocbook
+@multitable @columnfractions .1 .1 .1
+@headitem @tab Index @tab Value
+@item @tab @code{"dog"} @tab @code{"chien"}
+@item @tab @code{"cat"} @tab @code{"chat"}
+@item @tab @code{"one"} @tab @code{"un"}
+@item @tab @code{1} @tab @code{"un"}
+@end multitable
+@end ifnotdocbook
+
+@docbook
+<informaltable>
+<tgroup cols="2">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<thead>
+<row>
+<entry>Index</entry>
+<entry>Value</entry>
+</row>
+</thead>
+<tbody>
+<row>
+<entry><literal>"dog"</literal></entry>
+<entry><literal>"chien"</literal></entry>
+</row>
+
+<row>
+<entry><literal>"cat"</literal></entry>
+<entry><literal>"chat"</literal></entry>
+</row>
+
+<row>
+<entry><literal>"one"</literal></entry>
+<entry><literal>"un"</literal></entry>
+</row>
+
+<row>
+<entry><literal>1</literal></entry>
+<entry><literal>"un"</literal></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+@noindent
+Here we decided to translate the number one in both spelled-out and
+numeric form---thus illustrating that a single array can have both
+numbers and strings as indices.
+(In fact, array subscripts are always strings.
+There are some subtleties to how numbers work when used as
+array subscripts; this is discussed in more detail in
+@ref{Numeric Array Subscripts}.)
+Here, the number @code{1} isn't double-quoted, because @command{awk}
+automatically converts it to a string.
+
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+@cindex case sensitivity, array indices and
+@cindex arrays, @code{IGNORECASE} variable and
+@cindex @code{IGNORECASE} variable, array indices and
+The value of @code{IGNORECASE} has no effect upon array subscripting.
+The identical string value used to store an array element must be used
+to retrieve it.
+When @command{awk} creates an array (e.g., with the @code{split()}
+built-in function),
+that array's indices are consecutive integers starting at one.
+(@xref{String Functions}.)
+
+@command{awk}'s arrays are efficient---the time to access an element
+is independent of the number of elements in the array.
+
+@node Reference to Elements
+@subsection Referring to an Array Element
+@cindex arrays, referencing elements
+@cindex array members
+@cindex elements of arrays
+
+The principal way to use an array is to refer to one of its elements.
+An @dfn{array reference} is an expression as follows:
+
+@example
+@var{array}[@var{index-expression}]
+@end example
+
+@noindent
+Here, @var{array} is the name of an array.  The expression @var{index-expression} is
+the index of the desired element of the array.
+
+@c 1/2015: Having the 4.3 in @samp is a little iffy. It's essentially
+@c an expression though, so leave be. It's to early in the discussion
+@c to mention that it's really a string.
+The value of the array reference is the current value of that array
+element.  For example, @code{foo[4.3]} is an expression referencing the element
+of array @code{foo} at index @samp{4.3}.
+
+@cindex arrays, unassigned elements
+@cindex unassigned array elements
+@cindex empty array elements
+A reference to an array element that has no recorded value yields a value of
+@code{""}, the null string.  This includes elements
+that have not been assigned any value as well as elements that have been
+deleted (@pxref{Delete}).
+
+@cindex non-existent array elements
+@cindex arrays, elements that don't exist
+@quotation NOTE
+A reference to an element that does not exist @emph{automatically} creates
+that array element, with the null string as its value.  (In some cases,
+this is unfortunate, because it might waste memory inside @command{awk}.)
+
+Novice @command{awk} programmers often make the mistake of checking if
+an element exists by checking if the value is empty:
+
+@example
+# Check if "foo" exists in a:         @ii{Incorrect!}
+if (a["foo"] != "") @dots{}
+@end example
+
+@noindent
+This is incorrect for two reasons. First, it @emph{creates} @code{a["foo"]}
+if it didn't exist before! Second, it is valid (if a bit unusual) to set
+an array element equal to the empty string.
+@end quotation
+
+@c @cindex arrays, @code{in} operator and
+@cindex @code{in} operator, testing if array element exists
+To determine whether an element exists in an array at a certain index, use
+the following expression:
+
+@example
+@var{indx} in @var{array}
+@end example
+
+@cindex side effects, array indexing
+@noindent
+This expression tests whether the particular index @var{indx} exists,
+without the side effect of creating that element if it is not present.
+The expression has the value one (true) if @code{@var{array}[@var{indx}]}
+exists and zero (false) if it does not exist.
+(We use @var{indx} here, because @samp{index} is the name of a built-in
+function.)
+For example, this statement tests whether the array @code{frequencies}
+contains the index @samp{2}:
+
+@example
+@group
+if (2 in frequencies)
+    print "Subscript 2 is present."
+@end group
+@end example
+
+Note that this is @emph{not} a test of whether the array
+@code{frequencies} contains an element whose @emph{value} is two.
+There is no way to do that except to scan all the elements.  Also, this
+@emph{does not} create @code{frequencies[2]}, while the following
+(incorrect) alternative does:
+
+@example
+@group
+if (frequencies[2] != "")
+    print "Subscript 2 is present."
+@end group
+@end example
+
+@node Assigning Elements
+@subsection Assigning Array Elements
+@cindex arrays, elements, assigning values
+@cindex elements in arrays, assigning values
+
+Array elements can be assigned values just like
+@command{awk} variables:
+
+@example
+@var{array}[@var{index-expression}] = @var{value}
+@end example
+
+@noindent
+@var{array} is the name of an array.  The expression
+@var{index-expression} is the index of the element of the array that is
+assigned a value.  The expression @var{value} is the value to
+assign to that element of the array.
+
+@node Array Example
+@subsection Basic Array Example
+@cindex arrays, an example of using
+
+The following program takes a list of lines, each beginning with a line
+number, and prints them out in order of line number.  The line numbers
+are not in order when they are first read---instead, they
+are scrambled.  This program sorts the lines by making an array using
+the line numbers as subscripts.  The program then prints out the lines
+in sorted order of their numbers.  It is a very simple program and gets
+confused upon encountering repeated numbers, gaps, or lines that don't
+begin with a number:
+
+@example
+@c file eg/misc/arraymax.awk
+@{
+    if ($1 > max)
+        max = $1
+    arr[$1] = $0
+@}
+
+END @{
+    for (x = 1; x <= max; x++)
+        print arr[x]
+@}
+@c endfile
+@end example
+
+The first rule keeps track of the largest line number seen so far;
+it also stores each line into the array @code{arr}, at an index that
+is the line's number.
+The second rule runs after all the input has been read, to print out
+all the lines.
+When this program is run with the following input:
+
+@example
+@group
+@c file eg/misc/arraymax.data
+5  I am the Five man
+2  Who are you?  The new number two!
+4  . . . And four on the floor
+1  Who is number one?
+3  I three you.
+@c endfile
+@end group
+@end example
+
+@noindent
+Its output is:
+
+@example
+@group
+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
+@end group
+@end example
+
+If a line number is repeated, the last line with a given number overrides
+the others.
+Gaps in the line numbers can be handled with an easy improvement to the
+program's @code{END} rule, as follows:
+
+@example
+@group
+END @{
+    for (x = 1; x <= max; x++)
+        if (x in arr)
+            print arr[x]
+@}
+@end group
+@end example
+
+@node Scanning an Array
+@subsection Scanning All Elements of an Array
+@cindex elements in arrays, scanning
+@cindex scanning arrays
+@cindex arrays, scanning
+@cindex loops, @code{for}, array scanning
+
+In programs that use arrays, it is often necessary to use a loop that
+executes once for each element of an array.  In other languages, where
+arrays are contiguous and indices are limited to nonnegative integers,
+this is easy: all the valid indices can be found by counting from
+the lowest index up to the highest.  This technique won't do the job
+in @command{awk}, because any number or string can be an array index.
+So @command{awk} has a special kind of @code{for} statement for scanning
+an array:
+
+@example
+@group
+for (@var{var} in @var{array})
+    @var{body}
+@end group
+@end example
+
+@noindent
+@cindex @code{in} operator, use in loops
+This loop executes @var{body} once for each index in @var{array} that the
+program has previously used, with the variable @var{var} set to that index.
+
+@cindex arrays, @code{for} statement and
+@cindex @code{for} statement, looping over arrays
+The following program uses this form of the @code{for} statement.  The
+first rule scans the input records and notes which words appear (at
+least once) in the input, by storing a one into the array @code{used} with
+the word as the index.  The second rule scans the elements of @code{used} to
+find all the distinct words that appear in the input.  It prints each
+word that is more than 10 characters long and also prints the number of
+such words.
+@xref{String Functions}
+for more information on the built-in function @code{length()}.
+
+@example
+@group
+# Record a 1 for each word that is used at least once
+@{
+    for (i = 1; i <= NF; i++)
+        used[$i] = 1
+@}
+@end group
+
+@group
+# Find number of distinct words more than 10 characters long
+END @{
+    for (x in used) @{
+        if (length(x) > 10) @{
+            ++num_long_words
+            print x
+        @}
+    @}
+    print num_long_words, "words longer than 10 characters"
+@}
+@end group
+@end example
+
+@noindent
+@xref{Word Sorting}
+for a more detailed example of this type.
+
+@cindex arrays, elements, order of access by @code{in} operator
+@cindex elements in arrays, order of access by @code{in} operator
+@cindex @code{in} operator, order of array access
+The order in which elements of the array are accessed by this statement
+is determined by the internal arrangement of the array elements within
+@command{awk} and in standard @command{awk} cannot be controlled
+or changed.  This can lead to problems if new elements are added to
+@var{array} by statements in the loop body; it is not predictable whether
+the @code{for} loop will reach them.  Similarly, changing @var{var} inside
+the loop may produce strange results.  It is best to avoid such things.
+
+As a point of information, @command{gawk} sets up the list of elements
+to be iterated over before the loop starts, and does not change it.
+But not all @command{awk} versions do so. Consider this program, named
+@file{loopcheck.awk}:
+
+@example
+BEGIN @{
+    a["here"] = "here"
+    a["is"] = "is"
+    a["a"] = "a"
+    a["loop"] = "loop"
+    for (i in a) @{
+        j++
+        a[j] = j
+        print i
+    @}
+@}
+@end example
+
+Here is what happens when run with @command{gawk} (and @command{mawk}):
+
+@example
+$ @kbd{gawk -f loopcheck.awk}
+@print{} here
+@print{} loop
+@print{} a
+@print{} is
+@end example
+
+Contrast this to BWK @command{awk}:
+
+@example
+$ @kbd{nawk -f loopcheck.awk}
+@print{} loop
+@print{} here
+@print{} is
+@print{} a
+@print{} 1
+@end example
+
+@node Controlling Scanning
+@subsection Using Predefined Array Scanning Orders with @command{gawk}
+
+This @value{SUBSECTION} describes a feature that is specific to @command{gawk}.
+
+By default, when a @code{for} loop traverses an array, the order
+is undefined, meaning that the @command{awk} implementation
+determines the order in which the array is traversed.
+This order is usually based on the internal implementation of arrays
+and will vary from one version of @command{awk} to the next.
+
+@cindex array scanning order, controlling
+@cindex controlling array scanning order
+Often, though, you may wish to do something simple, such as
+``traverse the array by comparing the indices in ascending order,''
+or ``traverse the array by comparing the values in descending order.''
+@command{gawk} provides two mechanisms that give you this control:
+
+@itemize @value{BULLET}
+@item
+Set @code{PROCINFO["sorted_in"]} to one of a set of predefined values.
+We describe this now.
+
+@item
+Set @code{PROCINFO["sorted_in"]} to the name of a user-defined function
+to use for comparison of array elements. This advanced feature
+is described later in @ref{Array Sorting}.
+@end itemize
+
+@cindex @code{PROCINFO}, values of @code{sorted_in}
+The following special values for @code{PROCINFO["sorted_in"]} are available:
+
+@table @code
+@item "@@unsorted"
+Array elements are processed in arbitrary order, which is the default
+@command{awk} behavior.
+
+@item "@@ind_str_asc"
+Order by indices in ascending order compared as strings; this is the most basic sort.
+(Internally, array indices are always strings, so with @samp{a[2*5] = 1}
+the index is @code{"10"} rather than numeric 10.)
+
+@item "@@ind_num_asc"
+Order by indices in ascending order but force them to be treated as numbers in the process.
+Any index with a non-numeric value will end up positioned as if it were zero.
+
+@item "@@val_type_asc"
+Order by element values in ascending order (rather than by indices).
+Ordering is by the type assigned to the element
+(@pxref{Typing and Comparison}).
+All numeric values come before all string values,
+which in turn come before all subarrays.
+(Subarrays have not been described yet;
+@pxref{Arrays of Arrays}.)
+
+@item "@@val_str_asc"
+Order by element values in ascending order (rather than by indices).  Scalar values are
+compared as strings.  Subarrays, if present, come out last.
+
+@item "@@val_num_asc"
+Order by element values in ascending order (rather than by indices).  Scalar values are
+compared as numbers.  Subarrays, if present, come out last.
+When numeric values are equal, the string values are used to provide
+an ordering: this guarantees consistent results across different
+versions of the C @code{qsort()} function,@footnote{When two elements
+compare as equal, the C @code{qsort()} function does not guarantee
+that they will maintain their original relative order after sorting.
+Using the string value to provide a unique ordering when the numeric
+values are equal ensures that @command{gawk} behaves consistently
+across different environments.} which @command{gawk} uses internally
+to perform the sorting.
+
+@item "@@ind_str_desc"
+Like @code{"@@ind_str_asc"}, but the
+string indices are ordered from high to low.
+
+@item "@@ind_num_desc"
+Like @code{"@@ind_num_asc"}, but the
+numeric indices are ordered from high to low.
+
+@item "@@val_type_desc"
+Like @code{"@@val_type_asc"}, but the
+element values, based on type, are ordered from high to low.
+Subarrays, if present, come out first.
+
+@item "@@val_str_desc"
+Like @code{"@@val_str_asc"}, but the
+element values, treated as strings, are ordered from high to low.
+Subarrays, if present, come out first.
+
+@item "@@val_num_desc"
+Like @code{"@@val_num_asc"}, but the
+element values, treated as numbers, are ordered from high to low.
+Subarrays, if present, come out first.
+@end table
+
+The array traversal order is determined before the @code{for} loop
+starts to run. Changing @code{PROCINFO["sorted_in"]} in the loop body
+does not affect the loop.
+For example:
+
+@example
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+> @kbd{   a[4] = 4}
+> @kbd{   a[3] = 3}
+> @kbd{   for (i in a)}
+> @kbd{       print i, a[i]}
+> @kbd{@}'}
+@print{} 4 4
+@print{} 3 3
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+> @kbd{   PROCINFO["sorted_in"] = "@@ind_str_asc"}
+> @kbd{   a[4] = 4}
+> @kbd{   a[3] = 3}
+> @kbd{   for (i in a)}
+> @kbd{       print i, a[i]}
+> @kbd{@}'}
+@print{} 3 3
+@print{} 4 4
+@end example
+
+When sorting an array by element values, if a value happens to be
+a subarray then it is considered to be greater than any string or
+numeric value, regardless of what the subarray itself contains,
+and all subarrays are treated as being equal to each other.  Their
+order relative to each other is determined by their index strings.
+
+Here are some additional things to bear in mind about sorted
+array traversal:
+
+@itemize @value{BULLET}
+@item
+The value of @code{PROCINFO["sorted_in"]} is global. That is, it affects
+all array traversal @code{for} loops.  If you need to change it within your
+own code, you should see if it's defined and save and restore the value:
+
+@example
+@dots{}
+if ("sorted_in" in PROCINFO) @{
+    save_sorted = PROCINFO["sorted_in"]
+    PROCINFO["sorted_in"] = "@@val_str_desc" # or whatever
+@}
+@dots{}
+if (save_sorted)
+    PROCINFO["sorted_in"] = save_sorted
+@end example
+
+@item
+As already mentioned, the default array traversal order is represented by
+@code{"@@unsorted"}.  You can also get the default behavior by assigning
+the null string to @code{PROCINFO["sorted_in"]} or by just deleting the
+@code{"sorted_in"} element from the @code{PROCINFO} array with
+the @code{delete} statement.
+(The @code{delete} statement hasn't been described yet; @pxref{Delete}.)
+@end itemize
+
+In addition, @command{gawk} provides built-in functions for
+sorting arrays; see @ref{Array Sorting Functions}.
+
+@node Numeric Array Subscripts
+@section Using Numbers to Subscript Arrays
+
+@cindex numbers, as array subscripts
+@cindex array subscripts, numbers as
+@cindex arrays, numeric subscripts
+@cindex subscripts in arrays, numbers as
+@cindex @code{CONVFMT} variable, array subscripts and
+An important aspect to remember about arrays is that @emph{array subscripts
+are always strings}.  When a numeric value is used as a subscript,
+it is converted to a string value before being used for subscripting
+(@pxref{Conversion}).
+This means that the value of the predefined variable @code{CONVFMT} can
+affect how your program accesses elements of an array.  For example:
+
+@example
+xyz = 12.153
+data[xyz] = 1
+CONVFMT = "%2.2f"
+if (xyz in data)
+    printf "%s is in data\n", xyz
+else
+    printf "%s is not in data\n", xyz
+@end example
+
+@noindent
+This prints @samp{12.15 is not in data}.  The first statement gives
+@code{xyz} a numeric value.  Assigning to
+@code{data[xyz]} subscripts @code{data} with the string value @code{"12.153"}
+(using the default conversion value of @code{CONVFMT}, @code{"%.6g"}).
+Thus, the array element @code{data["12.153"]} is assigned the value one.
+The program then changes
+the value of @code{CONVFMT}.  The test @samp{(xyz in data)} generates a new
+string value from @code{xyz}---this time @code{"12.15"}---because the value of
+@code{CONVFMT} only allows two significant digits.  This test fails,
+because @code{"12.15"} is different from @code{"12.153"}.
+
+@cindex converting integer array subscripts
+@cindex integer array indices
+According to the rules for conversions
+(@pxref{Conversion}), integer
+values always convert to strings as integers, no matter what the
+value of @code{CONVFMT} may happen to be.  So the usual case of
+the following works:
+
+@example
+for (i = 1; i <= maxsub; i++)
+    @ii{do something with} array[i]
+@end example
+
+The ``integer values always convert to strings as integers'' rule
+has an additional consequence for array indexing.
+Octal and hexadecimal constants
+@ifnotdocbook
+(@pxref{Nondecimal-numbers})
+@end ifnotdocbook
+@ifdocbook
+(covered in @ref{Nondecimal-numbers})
+@end ifdocbook
+are converted internally into numbers, and their original form
+is forgotten.  This means, for example, that @code{array[17]},
+@code{array[021]}, and @code{array[0x11]} all refer to the same element!
+
+As with many things in @command{awk}, the majority of the time
+things work as you would expect them to.  But it is useful to have a precise
+knowledge of the actual rules, as they can sometimes have a subtle
+effect on your programs.
+
+@node Uninitialized Subscripts
+@section Using Uninitialized Variables as Subscripts
+
+@cindex variables, uninitialized@comma{} as array subscripts
+@cindex uninitialized variables, as array subscripts
+@cindex subscripts in arrays, uninitialized variables as
+@cindex arrays, subscripts, uninitialized variables as
+Suppose it's necessary to write a program
+to print the input data in reverse order.
+A reasonable attempt to do so (with some test
+data) might look like this:
+
+@example
+$ @kbd{echo 'line 1}
+> @kbd{line 2}
+> @kbd{line 3' | awk '@{ l[lines] = $0; ++lines @}}
+> @kbd{END @{}
+>     @kbd{for (i = lines - 1; i >= 0; i--)}
+>        @kbd{print l[i]}
+> @kbd{@}'}
+@print{} line 3
+@print{} line 2
+@end example
+
+Unfortunately, the very first line of input data did not appear in the
+output!
+
+Upon first glance, we would think that this program should have worked.
+The variable @code{lines}
+is uninitialized, and uninitialized variables have the numeric value zero.
+So, @command{awk} should have printed the value of @code{l[0]}.
+
+The issue here is that subscripts for @command{awk} arrays are @emph{always}
+strings. Uninitialized variables, when used as strings, have the
+value @code{""}, not zero.  Thus, @samp{line 1} ends up stored in
+@code{l[""]}.
+The following version of the program works correctly:
+
+@example
+@{ l[lines++] = $0 @}
+END @{
+    for (i = lines - 1; i >= 0; i--)
+       print l[i]
+@}
+@end example
+
+Here, the @samp{++} forces @code{lines} to be numeric, thus making
+the ``old value'' numeric zero. This is then converted to @code{"0"}
+as the array subscript.
+
+@cindex array subscripts, null strings as
+@cindex null strings, as array subscripts
+@cindex dark corner, array subscripts
+@cindex lint checking, array subscripts
+Even though it is somewhat unusual, the null string
+(@code{""}) is a valid array subscript.
+@value{DARKCORNER}
+@command{gawk} warns about the use of the null string as a subscript
+if @option{--lint} is provided
+on the command line (@pxref{Options}).
+
+@node Delete
+@section The @code{delete} Statement
+@cindex @code{delete} statement
+@cindex deleting elements in arrays
+@cindex arrays, elements, deleting
+@cindex elements in arrays, deleting
+
+To remove an individual element of an array, use the @code{delete}
+statement:
+
+@example
+delete @var{array}[@var{index-expression}]
+@end example
+
+Once an array element has been deleted, any value the element once
+had is no longer available. It is as if the element had never
+been referred to or been given a value.
+The following is an example of deleting elements in an array:
+
+@example
+for (i in frequencies)
+    delete frequencies[i]
+@end example
+
+@noindent
+This example removes all the elements from the array @code{frequencies}.
+Once an element is deleted, a subsequent @code{for} statement to scan the array
+does not report that element and using the @code{in} operator to check for
+the presence of that element returns zero (i.e., false):
+
+@example
+delete foo[4]
+if (4 in foo)
+    print "This will never be printed"
+@end example
+
+@cindex null strings, deleting array elements and
+It is important to note that deleting an element is @emph{not} the
+same as assigning it a null value (the empty string, @code{""}).
+For example:
+
+@example
+@group
+foo[4] = ""
+if (4 in foo)
+  print "This is printed, even though foo[4] is empty"
+@end group
+@end example
+
+@cindex lint checking, array elements
+It is not an error to delete an element that does not exist.
+However, if @option{--lint} is provided on the command line
+(@pxref{Options}),
+@command{gawk} issues a warning message when an element that
+is not in the array is deleted.
+
+@cindex common extensions, @code{delete} to delete entire arrays
+@cindex extensions, common@comma{} @code{delete} to delete entire arrays
+@cindex arrays, deleting entire contents
+@cindex deleting entire arrays
+@cindex @code{delete} @var{array}
+@cindex differences in @command{awk} and @command{gawk}, array elements, deleting
+All the elements of an array may be deleted with a single statement
+by leaving off the subscript in the @code{delete} statement,
+as follows:
+
+
+@example
+delete @var{array}
+@end example
+
+Using this version of the @code{delete} statement is about three times
+more efficient than the equivalent loop that deletes each element one
+at a time.
+
+This form of the @code{delete} statement is also supported
+by BWK @command{awk} and @command{mawk}, as well as
+by a number of other implementations.
+
+@cindex Brian Kernighan's @command{awk}
+@quotation NOTE
+For many years, using @code{delete} without a subscript was a common
+extension.  In September 2012, it was accepted for inclusion into the
+POSIX standard.  See @uref{http://austingroupbugs.net/view.php?id=544,
+the Austin Group website}.
+@end quotation
+
+@cindex portability, deleting array elements
+@cindex Brennan, Michael
+The following statement provides a portable but nonobvious way to clear
+out an array:@footnote{Thanks to Michael Brennan for pointing this out.}
+
+@example
+split("", array)
+@end example
+
+@cindex @code{split()} function, array elements@comma{} deleting
+The @code{split()} function
+(@pxref{String Functions})
+clears out the target array first. This call asks it to split
+apart the null string. Because there is no data to split out, the
+function simply clears the array and then returns.
+
+@quotation CAUTION
+Deleting all the elements from an array does not change its type; you cannot
+clear an array and then use the array's name as a scalar
+(i.e., a regular variable). For example, the following does not work:
+
+@example
+a[1] = 3
+delete a
+a = 3
+@end example
+@end quotation
+
+@node Multidimensional
+@section Multidimensional Arrays
+
+@menu
+* Multiscanning::               Scanning multidimensional arrays.
+@end menu
+
+@cindex subscripts in arrays, multidimensional
+@cindex arrays, multidimensional
+A @dfn{multidimensional array} is an array in which an element is identified
+by a sequence of indices instead of a single index.  For example, a
+two-dimensional array requires two indices.  The usual way (in many
+languages, including @command{awk}) to refer to an element of a
+two-dimensional array named @code{grid} is with
+@code{grid[@var{x},@var{y}]}.
+
+@cindex @code{SUBSEP} variable, multidimensional arrays and
+Multidimensional arrays are supported in @command{awk} through
+concatenation of indices into one string.
+@command{awk} converts the indices into strings
+(@pxref{Conversion}) and
+concatenates them together, with a separator between them.  This creates
+a single string that describes the values of the separate indices.  The
+combined string is used as a single index into an ordinary,
+one-dimensional array.  The separator used is the value of the built-in
+variable @code{SUBSEP}.
+
+For example, suppose we evaluate the expression @samp{foo[5,12] = "value"}
+when the value of @code{SUBSEP} is @code{"@@"}.  The numbers 5 and 12 are
+converted to strings and
+concatenated with an @samp{@@} between them, yielding @code{"5@@12"}; thus,
+the array element @code{foo["5@@12"]} is set to @code{"value"}.
+
+Once the element's value is stored, @command{awk} has no record of whether
+it was stored with a single index or a sequence of indices.  The two
+expressions @samp{foo[5,12]} and @w{@samp{foo[5 SUBSEP 12]}} are always
+equivalent.
+
+The default value of @code{SUBSEP} is the string @code{"\034"},
+which contains a nonprinting character that is unlikely to appear in an
+@command{awk} program or in most input data.
+The usefulness of choosing an unlikely character comes from the fact
+that index values that contain a string matching @code{SUBSEP} can lead to
+combined strings that are ambiguous.  Suppose that @code{SUBSEP} is
+@code{"@@"}; then @w{@samp{foo["a@@b", "c"]}} and @w{@samp{foo["a",
+"b@@c"]}} are indistinguishable because both are actually
+stored as @samp{foo["a@@b@@c"]}.
+
+@cindex @code{in} operator, index existence in multidimensional arrays
+To test whether a particular index sequence exists in a
+multidimensional array, use the same operator (@code{in}) that is
+used for single-dimensional arrays.  Write the whole sequence of indices
+in parentheses, separated by commas, as the left operand:
+
+@example
+if ((@var{subscript1}, @var{subscript2}, @dots{}) in @var{array})
+    @dots{}
+@end example
+
+Here is an example that treats its input as a two-dimensional array of
+fields; it rotates this array 90 degrees clockwise and prints the
+result.  It assumes that all lines have the same number of
+elements:
+
+@example
+@{
+     if (max_nf < NF)
+          max_nf = NF
+     max_nr = NR
+     for (x = 1; x <= NF; x++)
+          vector[x, NR] = $x
+@}
+
+END @{
+     for (x = 1; x <= max_nf; x++) @{
+          for (y = max_nr; y >= 1; --y)
+               printf("%s ", vector[x, y])
+          printf("\n")
+     @}
+@}
+@end example
+
+@noindent
+When given the input:
+
+@example
+@group
+1 2 3 4 5 6
+2 3 4 5 6 1
+3 4 5 6 1 2
+4 5 6 1 2 3
+@end group
+@end example
+
+@noindent
+the program produces the following output:
+
+@example
+@group
+4 3 2 1
+5 4 3 2
+6 5 4 3
+1 6 5 4
+2 1 6 5
+3 2 1 6
+@end group
+@end example
+
+@node Multiscanning
+@subsection Scanning Multidimensional Arrays
+
+There is no special @code{for} statement for scanning a
+``multidimensional'' array. There cannot be one, because, in truth,
+@command{awk} does not have
+multidimensional arrays or elements---there is only a
+multidimensional @emph{way of accessing} an array.
+
+@cindex subscripts in arrays, multidimensional, scanning
+@cindex arrays, multidimensional, scanning
+@cindex scanning multidimensional arrays
+However, if your program has an array that is always accessed as
+multidimensional, you can get the effect of scanning it by combining
+the scanning @code{for} statement
+(@pxref{Scanning an Array}) with the
+built-in @code{split()} function
+(@pxref{String Functions}).
+It works in the following manner:
+
+@example
+for (combined in array) @{
+    split(combined, separate, SUBSEP)
+    @dots{}
+@}
+@end example
+
+@noindent
+This sets the variable @code{combined} to
+each concatenated combined index in the array, and splits it
+into the individual indices by breaking it apart where the value of
+@code{SUBSEP} appears.  The individual indices then become the elements of
+the array @code{separate}.
+
+Thus, if a value is previously stored in @code{array[1, "foo"]}, then
+an element with index @code{"1\034foo"} exists in @code{array}.  (Recall
+that the default value of @code{SUBSEP} is the character with code 034.)
+Sooner or later, the @code{for} statement finds that index and does an
+iteration with the variable @code{combined} set to @code{"1\034foo"}.
+Then the @code{split()} function is called as follows:
+
+@example
+split("1\034foo", separate, "\034")
+@end example
+
+@noindent
+The result is to set @code{separate[1]} to @code{"1"} and
+@code{separate[2]} to @code{"foo"}.  Presto! The original sequence of
+separate indices is recovered.
+
+
+@node Arrays of Arrays
+@section Arrays of Arrays
+@cindex arrays of arrays
+
+@command{gawk} goes beyond standard @command{awk}'s multidimensional
+array access and provides true arrays of
+arrays. Elements of a subarray are referred to by their own indices
+enclosed in square brackets, just like the elements of the main array.
+For example, the following creates a two-element subarray at index @code{1}
+of the main array @code{a}:
+
+@example
+a[1][1] = 1
+a[1][2] = 2
+@end example
+
+This simulates a true two-dimensional array. Each subarray element can
+contain another subarray as a value, which in turn can hold other arrays
+as well. In this way, you can create arrays of three or more dimensions.
+The indices can be any @command{awk} expressions, including scalars
+separated by commas (i.e., a regular @command{awk} simulated
+multidimensional subscript). So the following is valid in
+@command{gawk}:
+
+@example
+a[1][3][1, "name"] = "barney"
+@end example
+
+Each subarray and the main array can be of different length. In fact, the
+elements of an array or its subarray do not all have to have the same
+type. This means that the main array and any of its subarrays can be
+nonrectangular, or jagged in structure. You can assign a scalar value to
+the index @code{4} of the main array @code{a}, even though @code{a[1]}
+is itself an array and not a scalar:
+
+@example
+a[4] = "An element in a jagged array"
+@end example
+
+The terms @dfn{dimension}, @dfn{row}, and @dfn{column} are
+meaningless when applied
+to such an array, but we will use ``dimension'' henceforth to imply the
+maximum number of indices needed to refer to an existing element. The
+type of any element that has already been assigned cannot be changed
+by assigning a value of a different type. You have to first delete the
+current element, which effectively makes @command{gawk} forget about
+the element at that index:
+
+@example
+delete a[4]
+a[4][5][6][7] = "An element in a four-dimensional array"
+@end example
+
+@noindent
+This removes the scalar value from index @code{4} and then inserts a
+three-level nested subarray
+containing a scalar. You can also
+delete an entire subarray or subarray of subarrays:
+
+@example
+delete a[4][5]
+a[4][5] = "An element in subarray a[4]"
+@end example
+
+But recall that you can not delete the main array @code{a} and then use it
+as a scalar.
+
+The built-in functions that take array arguments can also be used
+with subarrays. For example, the following code fragment uses @code{length()}
+(@pxref{String Functions})
+to determine the number of elements in the main array @code{a} and
+its subarrays:
+
+@example
+print length(a), length(a[1]), length(a[1][3])
+@end example
+
+@noindent
+This results in the following output for our main array @code{a}:
+
+@example
+2, 3, 1
+@end example
+
+@noindent
+The @samp{@var{subscript} in @var{array}} expression
+(@pxref{Reference to Elements}) works similarly for both
+regular @command{awk}-style
+arrays and arrays of arrays. For example, the tests @samp{1 in a},
+@samp{3 in a[1]}, and @samp{(1, "name") in a[1][3]} all evaluate to
+one (true) for our array @code{a}.
+
+The @samp{for (item in array)} statement (@pxref{Scanning an Array})
+can be nested to scan all the
+elements of an array of arrays if it is rectangular in structure. In order
+to print the contents (scalar values) of a two-dimensional array of arrays
+(i.e., in which each first-level element is itself an
+array, not necessarily of the same length),
+you could use the following code:
+
+@example
+for (i in array)
+    for (j in array[i])
+        print array[i][j]
+@end example
+
+The @code{isarray()} function (@pxref{Type Functions})
+lets you test if an array element is itself an array:
+
+@example
+for (i in array) @{
+    if (isarray(array[i])) @{
+        for (j in array[i]) @{
+            print array[i][j]
+        @}
+    @}
+    else
+        print array[i]
+@}
+@end example
+
+If the structure of a jagged array of arrays is known in advance,
+you can often devise workarounds using control statements. For example,
+the following code prints the elements of our main array @code{a}:
+
+@example
+@group
+for (i in a) @{
+    for (j in a[i]) @{
+        if (j == 3) @{
+            for (k in a[i][j])
+                print a[i][j][k]
+@end group
+@group
+        @} else
+            print a[i][j]
+    @}
+@}
+@end group
+@end example
+
+@noindent
+@xref{Walking Arrays} for a user-defined function that ``walks'' an
+arbitrarily dimensioned array of arrays.
+
+Recall that a reference to an uninitialized array element yields a value
+of @code{""}, the null string. This has one important implication when you
+intend to use a subarray as an argument to a function, as illustrated by
+the following example:
+
+@example
+$ @kbd{gawk 'BEGIN @{ split("a b c d", b[1]); print b[1][1] @}'}
+@error{} gawk: cmd. line:1: fatal: split: second argument is not an array
+@end example
+
+The way to work around this is to first force @code{b[1]} to be an array by
+creating an arbitrary index:
+
+@example
+$ @kbd{gawk 'BEGIN @{ b[1][1] = ""; split("a b c d", b[1]); print b[1][1] @}'}
+@print{} a
+@end example
+
+@node Arrays Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Standard @command{awk} provides one-dimensional associative arrays
+(arrays indexed by string values).  All arrays are associative; numeric
+indices are converted automatically to strings.
+
+@item
+Array elements are referenced as @code{@var{array}[@var{indx}]}.
+Referencing an element creates it if it did not exist previously.
+
+@item
+The proper way to see if an array has an element with a given index
+is to use the @code{in} operator: @samp{@var{indx} in @var{array}}.
+
+@item
+Use @samp{for (@var{indx} in @var{array}) @dots{}} to scan through all the
+individual elements of an array. In the body of the loop, @var{indx} takes
+on the value of each element's index in turn.
+
+@item
+The order in which a @samp{for (@var{indx} in @var{array})} loop
+traverses an array is undefined in POSIX @command{awk} and varies among
+implementations.  @command{gawk} lets you control the order by assigning
+special predefined values to @code{PROCINFO["sorted_in"]}.
+
+@item
+Use @samp{delete @var{array}[@var{indx}]} to delete an individual element.
+To delete all of the elements in an array,
+use @samp{delete @var{array}}.
+This latter feature has been a common extension for many
+years and is now standard, but may not be supported by all commercial
+versions of @command{awk}.
+
+@item
+Standard @command{awk} simulates multidimensional arrays by separating
+subscript values with commas.  The values are concatenated into a
+single string, separated by the value of @code{SUBSEP}.  The fact
+that such a subscript was created in this way is not retained; thus,
+changing @code{SUBSEP} may have unexpected consequences.  You can use
+@samp{(@var{sub1}, @var{sub2}, @dots{}) in @var{array}} to see if such
+a multidimensional subscript exists in @var{array}.
+
+@item
+@command{gawk} provides true arrays of arrays. You use a separate
+set of square brackets for each dimension in such an array:
+@code{data[row][col]}, for example. Array elements may thus be either
+scalar values (number or string) or other arrays.
+
+@item
+Use the @code{isarray()} built-in function to determine if an array
+element is itself a subarray.
+
+@end itemize
+
+
+@node Functions
+@chapter Functions
+
+@cindex functions, built-in
+@cindex built-in functions
+This @value{CHAPTER} describes @command{awk}'s built-in functions,
+which fall into three categories: numeric, string, and I/O.
+@command{gawk} provides additional groups of functions
+to work with values that represent time, do
+bit manipulation, sort arrays,
+provide type information, and internationalize and localize programs.
+
+Besides the built-in functions, @command{awk} has provisions for
+writing new functions that the rest of a program can use.
+The second half of this @value{CHAPTER} describes these
+@dfn{user-defined} functions.
+Finally, we explore indirect function calls, a @command{gawk}-specific
+extension that lets you determine at runtime what function is to
+be called.
+
+@menu
+* Built-in::                    Summarizes the built-in functions.
+* User-defined::                Describes User-defined functions in detail.
+* Indirect Calls::              Choosing the function to call at runtime.
+* Functions Summary::           Summary of functions.
+@end menu
+
+@node Built-in
+@section Built-in Functions
+
+@dfn{Built-in} functions are always available for your @command{awk}
+program to call.  This @value{SECTION} defines all the built-in functions
+in @command{awk}; some of these are mentioned in other @value{SECTION}s
+but are summarized here for your convenience.
+
+@menu
+* Calling Built-in::            How to call built-in functions.
+* Numeric Functions::           Functions that work with numbers, including
+                                @code{int()}, @code{sin()} and @code{rand()}.
+* String Functions::            Functions for string manipulation, such as
+                                @code{split()}, @code{match()} and
+                                @code{sprintf()}.
+* I/O Functions::               Functions for files and shell commands.
+* Time Functions::              Functions for dealing with timestamps.
+* Bitwise Functions::           Functions for bitwise operations.
+* Type Functions::              Functions for type information.
+* I18N Functions::              Functions for string translation.
+@end menu
+
+@node Calling Built-in
+@subsection Calling Built-in Functions
+
+To call one of @command{awk}'s built-in functions, write the name of
+the function followed
+by arguments in parentheses.  For example, @samp{atan2(y + z, 1)}
+is a call to the function @code{atan2()} and has two arguments.
+
+@cindex programming conventions, functions, calling
+@cindex whitespace, functions@comma{} calling
+Whitespace is ignored between the built-in function name and the
+opening parenthesis, but nonetheless it is good practice to avoid using whitespace
+there.  User-defined functions do not permit whitespace in this way, and
+it is easier to avoid mistakes by following a simple
+convention that always works---no whitespace after a function name.
+
+@cindex troubleshooting, @command{gawk}, fatal errors@comma{} function arguments
+@cindex @command{gawk}, function arguments and
+@cindex differences in @command{awk} and @command{gawk}, function arguments (@command{gawk})
+Each built-in function accepts a certain number of arguments.
+In some cases, arguments can be omitted. The defaults for omitted
+arguments vary from function to function and are described under the
+individual functions.  In some @command{awk} implementations, extra
+arguments given to built-in functions are ignored.  However, in @command{gawk},
+it is a fatal error to give extra arguments to a built-in function.
+
+When a function is called, expressions that create the function's actual
+parameters are evaluated completely before the call is performed.
+For example, in the following code fragment:
+
+@example
+i = 4
+j = sqrt(i++)
+@end example
+
+@cindex evaluation order, functions
+@cindex functions, built-in, evaluation order
+@cindex built-in functions, evaluation order
+@noindent
+the variable @code{i} is incremented to the value five before @code{sqrt()}
+is called with a value of four for its actual parameter.
+The order of evaluation of the expressions used for the function's
+parameters is undefined.  Thus, avoid writing programs that
+assume that parameters are evaluated from left to right or from
+right to left.  For example:
+
+@example
+i = 5
+j = atan2(++i, i *= 2)
+@end example
+
+If the order of evaluation is left to right, then @code{i} first becomes
+six, and then 12, and @code{atan2()} is called with the two arguments six
+and 12.  But if the order of evaluation is right to left, @code{i}
+first becomes 10, then 11, and @code{atan2()} is called with the
+two arguments 11 and 10.
+
+@node Numeric Functions
+@subsection Numeric Functions
+@cindex numeric functions
+
+The following list describes all of
+the built-in functions that work with numbers.
+Optional parameters are enclosed in square brackets@w{ ([ ]):}
+
+@c @asis for docbook
+@table @asis
+@item @code{atan2(@var{y}, @var{x})}
+@cindexawkfunc{atan2}
+@cindex arctangent
+Return the arctangent of @code{@var{y} / @var{x}} in radians.
+You can use @samp{pi = atan2(0, -1)} to retrieve the value of
+@value{PI}.
+
+@item @code{cos(@var{x})}
+@cindexawkfunc{cos}
+@cindex cosine
+Return the cosine of @var{x}, with @var{x} in radians.
+
+@item @code{exp(@var{x})}
+@cindexawkfunc{exp}
+@cindex exponent
+Return the exponential of @var{x} (@code{e ^ @var{x}}) or report
+an error if @var{x} is out of range.  The range of values @var{x} can have
+depends on your machine's floating-point representation.
+
+@item @code{int(@var{x})}
+@cindexawkfunc{int}
+@cindex round to nearest integer
+Return the nearest integer to @var{x}, located between @var{x} and zero and
+truncated toward zero.
+For example, @code{int(3)} is 3, @code{int(3.9)} is 3, @code{int(-3.9)}
+is @minus{}3, and @code{int(-3)} is @minus{}3 as well.
+
+@ifset INTDIV
+@item @code{intdiv0(@var{numerator}, @var{denominator}, @var{result})}
+@cindexawkfunc{intdiv0}
+@cindex intdiv0
+Perform integer division, similar to the standard C @code{div()} function.
+First, truncate @code{numerator} and @code{denominator}
+towards zero, creating integer values.  Clear the @code{result}
+array, and then set @code{result["quotient"]} to the result of
+@samp{numerator / denominator}, truncated towards zero to an integer,
+and set @code{result["remainder"]} to the result of @samp{numerator %
+denominator}, truncated towards zero to an integer.
+Attempting division by zero causes a fatal error.
+The function returns zero upon success, and @minus{}1 upon error.
+
+This function is
+primarily intended for use with arbitrary length integers; it avoids
+creating MPFR arbitrary precision floating-point values (@pxref{Arbitrary
+Precision Integers}).
+
+This function is a @code{gawk} extension.  It is not available in
+compatibility mode (@pxref{Options}).
+@end ifset
+
+@item @code{log(@var{x})}
+@cindexawkfunc{log}
+@cindex logarithm
+Return the natural logarithm of @var{x}, if @var{x} is positive;
+otherwise, return @code{NaN} (``not a number'') on IEEE 754 systems.
+Additionally, @command{gawk} prints a warning message when @code{x}
+is negative.
+
+@cindex Beebe, Nelson H.F.@:
+@item @code{rand()}
+@cindexawkfunc{rand}
+@cindex random numbers, @code{rand()}/@code{srand()} functions
+Return a random number.  The values of @code{rand()} are
+uniformly distributed between zero and one.
+The value could be zero but is never one.@footnote{The C version of
+@code{rand()} on many Unix systems is known to produce fairly poor
+sequences of random numbers.  However, nothing requires that an
+@command{awk} implementation use the C @code{rand()} to implement the
+@command{awk} version of @code{rand()}.  In fact, for many years,
+@command{gawk} used the BSD @code{random()} function, which is
+considerably better than @code{rand()}, to produce random numbers.
+From @value{PVERSION} 4.1.4, courtesy of Nelson H.F.@: Beebe, @command{gawk}
+uses the Bayes-Durham shuffle buffer algorithm which considerably extends
+the period of the random number generator, and eliminates short-range and
+long-range correlations that might exist in the original generator.}
+
+Often random integers are needed instead.  Following is a user-defined function
+that can be used to obtain a random nonnegative integer less than @var{n}:
+
+@example
+function randint(n)
+@{
+    return int(n * rand())
+@}
+@end example
+
+@noindent
+The multiplication produces a random number greater than or equal to
+zero and less than @code{n}.  Using @code{int()}, this result is made into
+an integer between zero and @code{n} @minus{} 1, inclusive.
+
+The following example uses a similar function to produce random integers
+between one and @var{n}.  This program prints a new random number for
+each input record:
+
+@example
+# Function to roll a simulated die.
+function roll(n) @{ return 1 + int(rand() * n) @}
+
+# Roll 3 six-sided dice and
+# print total number of points.
+@{
+    printf("%d points\n", roll(6) + roll(6) + roll(6))
+@}
+@end example
+
+@cindex seeding random number generator
+@cindex random numbers, seed of
+@quotation CAUTION
+In most @command{awk} implementations, including @command{gawk},
+@code{rand()} starts generating numbers from the same
+starting number, or @dfn{seed}, each time you run @command{awk}.@footnote{@command{mawk}
+uses a different seed each time.}  Thus,
+a program generates the same results each time you run it.
+The numbers are random within one @command{awk} run but predictable
+from run to run.  This is convenient for debugging, but if you want
+a program to do different things each time it is used, you must change
+the seed to a value that is different in each run.  To do this,
+use @code{srand()}.
+@end quotation
+
+@item @code{sin(@var{x})}
+@cindexawkfunc{sin}
+@cindex sine
+Return the sine of @var{x}, with @var{x} in radians.
+
+@item @code{sqrt(@var{x})}
+@cindexawkfunc{sqrt}
+@cindex square root
+Return the positive square root of @var{x}.
+@command{gawk} prints a warning message
+if @var{x} is negative.  Thus, @code{sqrt(4)} is 2.
+
+@item @code{srand(}[@var{x}]@code{)}
+@cindexawkfunc{srand}
+Set the starting point, or seed,
+for generating random numbers to the value @var{x}.
+
+Each seed value leads to a particular sequence of random
+numbers.@footnote{Computer-generated random numbers really are not truly
+random.  They are technically known as @dfn{pseudorandom}.  This means
+that although the numbers in a sequence appear to be random, you can in
+fact generate the same sequence of random numbers over and over again.}
+Thus, if the seed is set to the same value a second time,
+the same sequence of random numbers is produced again.
+
+@quotation CAUTION
+Different @command{awk} implementations use different random-number
+generators internally.  Don't expect the same @command{awk} program
+to produce the same series of random numbers when executed by
+different versions of @command{awk}.
+@end quotation
+
+If the argument @var{x} is omitted, as in @samp{srand()}, then the current
+date and time of day are used for a seed.  This is the way to get random
+numbers that are truly unpredictable.
+
+The return value of @code{srand()} is the previous seed.  This makes it
+easy to keep track of the seeds in case you need to consistently reproduce
+sequences of random numbers.
+
+POSIX does not specify the initial seed; it differs among @command{awk}
+implementations.
+@end table
+
+@node String Functions
+@subsection String-Manipulation Functions
+@cindex string-manipulation functions
+
+The functions in this @value{SECTION} look at or change the text of one
+or more strings.
+
+@command{gawk} understands locales (@pxref{Locales}) and does all
+string processing in terms of @emph{characters}, not @emph{bytes}.
+This distinction is particularly important to understand for locales
+where one character may be represented by multiple bytes.  Thus, for
+example, @code{length()} returns the number of characters in a string,
+and not the number of bytes used to represent those characters. Similarly,
+@code{index()} works with character indices, and not byte indices.
+
+@quotation CAUTION
+A number of functions deal with indices into strings.  For these
+functions, the first character of a string is at position (index) one.
+This is different from C and the languages descended from it, where the
+first character is at position zero.  You need to remember this when
+doing index calculations, particularly if you are used to C.
+@end quotation
+
+In the following list, optional parameters are enclosed in square brackets@w{ ([ ]).}
+Several functions perform string substitution; the full discussion is
+provided in the description of the @code{sub()} function, which comes
+toward the end, because the list is presented alphabetically.
+
+Those functions that are specific to @command{gawk} are marked with a
+pound sign (@samp{#}).  They are not available in compatibility mode
+(@pxref{Options}):
+
+
+@menu
+* Gory Details::                More than you want to know about @samp{\} and
+                                @samp{&} with @code{sub()}, @code{gsub()}, and
+                                @code{gensub()}.
+@end menu
+
+@c @asis for docbook
+@table @asis
+@item @code{asort(}@var{source} [@code{,} @var{dest} [@code{,} @var{how} ] ]@code{) #}
+@itemx @code{asorti(}@var{source} [@code{,} @var{dest} [@code{,} @var{how} ] ]@code{) #}
+@cindexgawkfunc{asorti}
+@cindex sort array
+@cindex arrays, elements, retrieving number of
+@cindexgawkfunc{asort}
+@cindex sort array indices
+These two functions are similar in behavior, so they are described
+together.
+
+@quotation NOTE
+The following description ignores the third argument, @var{how}, as it
+requires understanding features that we have not discussed yet.  Thus,
+the discussion here is a deliberate simplification.  (We do provide all
+the details later on; see @ref{Array Sorting Functions} for the full story.)
+@end quotation
+
+Both functions return the number of elements in the array @var{source}.
+For @command{asort()}, @command{gawk} sorts the values of @var{source}
+and replaces the indices of the sorted values of @var{source} with
+sequential integers starting with one.  If the optional array @var{dest}
+is specified, then @var{source} is duplicated into @var{dest}.  @var{dest}
+is then sorted, leaving the indices of @var{source} unchanged.
+
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+When comparing strings, @code{IGNORECASE} affects the sorting
+(@pxref{Array Sorting Functions}).  If the
+@var{source} array contains subarrays as values (@pxref{Arrays of
+Arrays}), they will come last, after all scalar values.
+Subarrays are @emph{not} recursively sorted.
+
+For example, if the contents of @code{a} are as follows:
+
+@example
+a["last"] = "de"
+a["first"] = "sac"
+a["middle"] = "cul"
+@end example
+
+@noindent
+A call to @code{asort()}:
+
+@example
+asort(a)
+@end example
+
+@noindent
+results in the following contents of @code{a}:
+
+@example
+@group
+a[1] = "cul"
+a[2] = "de"
+a[3] = "sac"
+@end group
+@end example
+
+The @code{asorti()} function works similarly to @code{asort()}; however,
+the @emph{indices} are sorted, instead of the values. Thus, in the
+previous example, starting with the same initial set of indices and
+values in @code{a}, calling @samp{asorti(a)} would yield:
+
+@example
+a[1] = "first"
+a[2] = "last"
+a[3] = "middle"
+@end example
+
+@item @code{gensub(@var{regexp}, @var{replacement}, @var{how}} [@code{, @var{target}}]@code{) #}
+@cindexgawkfunc{gensub}
+@cindex search and replace in strings
+@cindex substitute in string
+Search the target string @var{target} for matches of the regular
+expression @var{regexp}.  If @var{how} is a string beginning with
+@samp{g} or @samp{G} (short for ``global''), then replace all matches
+of @var{regexp} with @var{replacement}.  Otherwise, treat @var{how}
+as a number indicating which match of @var{regexp} to replace.  Treat
+numeric values less than one as if they were one.  If no @var{target}
+is supplied, use @code{$0}.  Return the modified string as the result
+of the function. The original target string is @emph{not} changed.
+
+@code{gensub()} is a general substitution function.  Its purpose is
+to provide more features than the standard @code{sub()} and @code{gsub()}
+functions.
+
+@code{gensub()} provides an additional feature that is not available
+in @code{sub()} or @code{gsub()}: the ability to specify components of a
+regexp in the replacement text.  This is done by using parentheses in
+the regexp to mark the components and then specifying @samp{\@var{N}}
+in the replacement text, where @var{N} is a digit from 1 to 9.
+For example:
+
+@example
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+>      @kbd{a = "abc def"}
+>      @kbd{b = gensub(/(.+) (.+)/, "\\2 \\1", "g", a)}
+>      @kbd{print b}
+> @kbd{@}'}
+@print{} def abc
+@end example
+
+@noindent
+As with @code{sub()}, you must type two backslashes in order
+to get one into the string.
+In the replacement text, the sequence @samp{\0} represents the entire
+matched text, as does the character @samp{&}.
+
+The following example shows how you can use the third argument to control
+which match of the regexp should be changed:
+
+@example
+$ @kbd{echo a b c a b c |}
+> @kbd{gawk '@{ print gensub(/a/, "AA", 2) @}'}
+@print{} a b c AA b c
+@end example
+
+In this case, @code{$0} is the default target string.
+@code{gensub()} returns the new string as its result, which is
+passed directly to @code{print} for printing.
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+If the @var{how} argument is a string that does not begin with @samp{g} or
+@samp{G}, or if it is a number that is less than or equal to zero, only one
+substitution is performed.  If @var{how} is zero, @command{gawk} issues
+a warning message.
+
+If @var{regexp} does not match @var{target}, @code{gensub()}'s return value
+is the original unchanged value of @var{target}.
+
+@item @code{gsub(@var{regexp}, @var{replacement}} [@code{, @var{target}}]@code{)}
+@cindexawkfunc{gsub}
+Search @var{target} for
+@emph{all} of the longest, leftmost, @emph{nonoverlapping} matching
+substrings it can find and replace them with @var{replacement}.
+The @samp{g} in @code{gsub()} stands for
+``global,'' which means replace everywhere.  For example:
+
+@example
+@{ gsub(/Britain/, "United Kingdom"); print @}
+@end example
+
+@noindent
+replaces all occurrences of the string @samp{Britain} with @samp{United
+Kingdom} for all input records.
+
+The @code{gsub()} function returns the number of substitutions made.  If
+the variable to search and alter (@var{target}) is
+omitted, then the entire input record (@code{$0}) is used.
+As in @code{sub()}, the characters @samp{&} and @samp{\} are special,
+and the third argument must be assignable.
+
+@item @code{index(@var{in}, @var{find})}
+@cindexawkfunc{index}
+@cindex search in string
+@cindex find substring in string
+Search the string @var{in} for the first occurrence of the string
+@var{find}, and return the position in characters where that occurrence
+begins in the string @var{in}.  Consider the following example:
+
+@example
+$ @kbd{awk 'BEGIN @{ print index("peanut", "an") @}'}
+@print{} 3
+@end example
+
+@noindent
+If @var{find} is not found, @code{index()} returns zero.
+
+@cindex dark corner, regexp as second argument to @code{index()}
+With BWK @command{awk} and @command{gawk},
+it is a fatal error to use a regexp constant for @var{find}.
+Other implementations allow it, simply treating the regexp
+constant as an expression meaning @samp{$0 ~ /regexp/}. @value{DARKCORNER}
+
+@item @code{length(}[@var{string}]@code{)}
+@cindexawkfunc{length}
+@cindex string length
+@cindex length of string
+Return the number of characters in @var{string}.  If
+@var{string} is a number, the length of the digit string representing
+that number is returned.  For example, @code{length("abcde")} is five.  By
+contrast, @code{length(15 * 35)} works out to three. In this example,
+@iftex
+@math{15 @cdot 35 = 525},
+@end iftex
+@ifnottex
+@ifnotdocbook
+15 * 35 = 525,
+@end ifnotdocbook
+@end ifnottex
+@docbook
+15 &sdot; 35 = 525,
+@end docbook
+and 525 is then converted to the string @code{"525"}, which has
+three characters.
+
+@cindex length of input record
+@cindex input record, length of
+If no argument is supplied, @code{length()} returns the length of @code{$0}.
+
+@c @cindex historical features
+@cindex portability, @code{length()} function
+@cindex POSIX @command{awk}, functions and, @code{length()}
+@quotation NOTE
+In older versions of @command{awk}, the @code{length()} function could
+be called
+without any parentheses.  Doing so is considered poor practice,
+although the 2008 POSIX standard explicitly allows it, to
+support historical practice.  For programs to be maximally portable,
+always supply the parentheses.
+@end quotation
+
+@cindex dark corner, @code{length()} function
+If @code{length()} is called with a variable that has not been used,
+@command{gawk} forces the variable to be a scalar.  Other
+implementations of @command{awk} leave the variable without a type.
+@value{DARKCORNER}
+Consider:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
+@print{} 0
+@error{} gawk: fatal: attempt to use scalar `x' as array
+
+$ @kbd{nawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
+@print{} 0
+@end example
+
+@noindent
+If @option{--lint} has
+been specified on the command line, @command{gawk} issues a
+warning about this.
+
+@cindex common extensions, @code{length()} applied to an array
+@cindex extensions, common@comma{} @code{length()} applied to an array
+@cindex differences in @command{awk} and @command{gawk}, @code{length()} function
+@cindex number of array elements
+@cindex array, number of elements
+With @command{gawk} and several other @command{awk} implementations, when given an
+array argument, the @code{length()} function returns the number of elements
+in the array. @value{COMMONEXT}
+This is less useful than it might seem at first, as the
+array is not guaranteed to be indexed from one to the number of elements
+in it.
+If @option{--lint} is provided on the command line
+(@pxref{Options}),
+@command{gawk} warns that passing an array argument is not portable.
+If @option{--posix} is supplied, using an array argument is a fatal error
+(@pxref{Arrays}).
+
+@item @code{match(@var{string}, @var{regexp}} [@code{, @var{array}}]@code{)}
+@cindexawkfunc{match}
+@cindex string, regular expression match
+@cindex match regexp in string
+Search @var{string} for the
+longest, leftmost substring matched by the regular expression
+@var{regexp} and return the character position (index)
+at which that substring begins (one, if it starts at the beginning of
+@var{string}).  If no match is found, return zero.
+
+The @var{regexp} argument may be either a regexp constant
+(@code{/}@dots{}@code{/}) or a string constant (@code{"}@dots{}@code{"}).
+In the latter case, the string is treated as a regexp to be matched.
+@xref{Computed Regexps} for a
+discussion of the difference between the two forms, and the
+implications for writing your program correctly.
+
+The order of the first two arguments is the opposite of most other string
+functions that work with regular expressions, such as
+@code{sub()} and @code{gsub()}.  It might help to remember that
+for @code{match()}, the order is the same as for the @samp{~} operator:
+@samp{@var{string} ~ @var{regexp}}.
+
+@cindex @code{RSTART} variable, @code{match()} function and
+@cindex @code{RLENGTH} variable, @code{match()} function and
+@cindex @code{match()} function, @code{RSTART}/@code{RLENGTH} variables
+The @code{match()} function sets the predefined variable @code{RSTART} to
+the index.  It also sets the predefined variable @code{RLENGTH} to the
+length in characters of the matched substring.  If no match is found,
+@code{RSTART} is set to zero, and @code{RLENGTH} to @minus{}1.
+
+For example:
+
+@example
+@c file eg/misc/findpat.awk
+@{
+    if ($1 == "FIND")
+        regex = $2
+    else @{
+        where = match($0, regex)
+        if (where != 0)
+            print "Match of", regex, "found at", where, "in", $0
+       @}
+@}
+@c endfile
+@end example
+
+@noindent
+This program looks for lines that match the regular expression stored in
+the variable @code{regex}.  This regular expression can be changed.  If the
+first word on a line is @samp{FIND}, @code{regex} is changed to be the
+second word on that line.  Therefore, if given:
+
+@example
+@c file eg/misc/findpat.data
+FIND ru+n
+My program runs
+but not very quickly
+FIND Melvin
+JF+KM
+This line is property of Reality Engineering Co.
+Melvin was here.
+@c endfile
+@end example
+
+@noindent
+@command{awk} prints:
+
+@example
+Match of ru+n found at 12 in My program runs
+Match of Melvin found at 1 in Melvin was here.
+@end example
+
+@cindex differences in @command{awk} and @command{gawk}, @code{match()} function
+If @var{array} is present, it is cleared, and then the zeroth element
+of @var{array} is set to the entire portion of @var{string}
+matched by @var{regexp}.  If @var{regexp} contains parentheses,
+the integer-indexed elements of @var{array} are set to contain the
+portion of @var{string} matching the corresponding parenthesized
+subexpression.
+For example:
+
+@example
+$ @kbd{echo foooobazbarrrrr |}
+> @kbd{gawk '@{ match($0, /(fo+).+(bar*)/, arr)}
+>         @kbd{print arr[1], arr[2] @}'}
+@print{} foooo barrrrr
+@end example
+
+In addition,
+multidimensional subscripts are available providing
+the start index and length of each matched subexpression:
+
+@example
+$ @kbd{echo foooobazbarrrrr |}
+> @kbd{gawk '@{ match($0, /(fo+).+(bar*)/, arr)}
+>           @kbd{print arr[1], arr[2]}
+>           @kbd{print arr[1, "start"], arr[1, "length"]}
+>           @kbd{print arr[2, "start"], arr[2, "length"]}
+> @kbd{@}'}
+@print{} foooo barrrrr
+@print{} 1 5
+@print{} 9 7
+@end example
+
+There may not be subscripts for the start and index for every parenthesized
+subexpression, because they may not all have matched text; thus, they
+should be tested for with the @code{in} operator
+(@pxref{Reference to Elements}).
+
+@cindex troubleshooting, @code{match()} function
+The @var{array} argument to @code{match()} is a
+@command{gawk} extension.  In compatibility mode
+(@pxref{Options}),
+using a third argument is a fatal error.
+
+@item @code{patsplit(@var{string}, @var{array}} [@code{, @var{fieldpat}} [@code{, @var{seps}} ] ]@code{) #}
+@cindexgawkfunc{patsplit}
+@cindex split string into array
+Divide
+@var{string} into pieces (or ``fields'') defined by @var{fieldpat}
+and store the pieces in @var{array} and the separator strings in the
+@var{seps} array.  The first piece is stored in
+@code{@var{array}[1]}, the second piece in @code{@var{array}[2]}, and so
+forth.  The third argument, @var{fieldpat}, is
+a regexp describing the fields in @var{string} (just as @code{FPAT} is
+a regexp describing the fields in input records).
+It may be either a regexp constant or a string.
+If @var{fieldpat} is omitted, the value of @code{FPAT} is used.
+@code{patsplit()} returns the number of elements created.
+@code{@var{seps}[@var{i}]} is
+the possibly null separator string
+after @code{@var{array}[@var{i}]}.
+The possibly null leading separator will be in @code{@var{seps}[0]}.
+So a non-null @var{string} with @var{n} fields will have @var{n+1} separators.
+A null @var{string} will not have neither fields nor separators.
+
+The @code{patsplit()} function splits strings into pieces in a
+manner similar to the way input lines are split into fields using @code{FPAT}
+(@pxref{Splitting By Content}).
+
+Before splitting the string, @code{patsplit()} deletes any previously existing
+elements in the arrays @var{array} and @var{seps}.
+
+@item @code{split(@var{string}, @var{array}} [@code{, @var{fieldsep}} [@code{, @var{seps}} ] ]@code{)}
+@cindexawkfunc{split}
+Divide @var{string} into pieces separated by @var{fieldsep}
+and store the pieces in @var{array} and the separator strings in the
+@var{seps} array.  The first piece is stored in
+@code{@var{array}[1]}, the second piece in @code{@var{array}[2]}, and so
+forth.  The string value of the third argument, @var{fieldsep}, is
+a regexp describing where to split @var{string} (much as @code{FS} can
+be a regexp describing where to split input records).
+If @var{fieldsep} is omitted, the value of @code{FS} is used.
+@code{split()} returns the number of elements created.
+@var{seps} is a @command{gawk} extension, with @code{@var{seps}[@var{i}]}
+being the separator string
+between @code{@var{array}[@var{i}]} and @code{@var{array}[@var{i}+1]}.
+If @var{fieldsep} is a single
+space, then any leading whitespace goes into @code{@var{seps}[0]} and
+any trailing
+whitespace goes into @code{@var{seps}[@var{n}]}, where @var{n} is the
+return value of
+@code{split()} (i.e., the number of elements in @var{array}).
+
+The @code{split()} function splits strings into pieces in the same way
+that input lines are split into fields.  For example:
+
+@example
+split("cul-de-sac", a, "-", seps)
+@end example
+
+@noindent
+@cindex strings splitting, example
+splits the string @code{"cul-de-sac"} into three fields using @samp{-} as the
+separator.  It sets the contents of the array @code{a} as follows:
+
+@example
+a[1] = "cul"
+a[2] = "de"
+a[3] = "sac"
+@end example
+
+and sets the contents of the array @code{seps} as follows:
+
+@example
+seps[1] = "-"
+seps[2] = "-"
+@end example
+
+@noindent
+The value returned by this call to @code{split()} is three.
+
+@cindex differences in @command{awk} and @command{gawk}, @code{split()} function
+As with input field-splitting, when the value of @var{fieldsep} is
+@w{@code{" "}}, leading and trailing whitespace is ignored in values assigned to
+the elements of
+@var{array} but not in @var{seps}, and the elements
+are separated by runs of whitespace.
+Also, as with input field splitting, if @var{fieldsep} is the null string, each
+individual character in the string is split into its own array element.
+@value{COMMONEXT}
+Additionally, if @var{fieldsep} is a single-character string, that string acts
+as the separator, even if its value is a regular expression metacharacter.
+
+Note, however, that @code{RS} has no effect on the way @code{split()}
+works. Even though @samp{RS = ""} causes the newline character to also be an input
+field separator, this does not affect how @code{split()} splits strings.
+
+@cindex dark corner, @code{split()} function
+Modern implementations of @command{awk}, including @command{gawk}, allow
+the third argument to be a regexp constant (@w{@code{/}@dots{}@code{/}})
+as well as a string.  @value{DARKCORNER}
+The POSIX standard allows this as well.
+@xref{Computed Regexps} for a
+discussion of the difference between using a string constant or a regexp constant,
+and the implications for writing your program correctly.
+
+Before splitting the string, @code{split()} deletes any previously existing
+elements in the arrays @var{array} and @var{seps}.
+
+If @var{string} is null, the array has no elements. (So this is a portable
+way to delete an entire array with one statement.
+@xref{Delete}.)
+
+If @var{string} does not match @var{fieldsep} at all (but is not null),
+@var{array} has one element only. The value of that element is the original
+@var{string}.
+
+In POSIX mode (@pxref{Options}), the fourth argument is not allowed.
+
+@item @code{sprintf(@var{format}, @var{expression1}, @dots{})}
+@cindexawkfunc{sprintf}
+@cindex formatting strings
+Return (without printing) the string that @code{printf} would
+have printed out with the same arguments
+(@pxref{Printf}).
+For example:
+
+@example
+pival = sprintf("pi = %.2f (approx.)", 22/7)
+@end example
+
+@noindent
+assigns the string @w{@samp{pi = 3.14 (approx.)}} to the variable @code{pival}.
+
+@cindexgawkfunc{strtonum}
+@cindex convert string to number
+@item @code{strtonum(@var{str}) #}
+Examine @var{str} and return its numeric value.  If @var{str}
+begins with a leading @samp{0}, @code{strtonum()} assumes that @var{str}
+is an octal number.  If @var{str} begins with a leading @samp{0x} or
+@samp{0X}, @code{strtonum()} assumes that @var{str} is a hexadecimal number.
+For example:
+
+@example
+$ @kbd{echo 0x11 |}
+> @kbd{gawk '@{ printf "%d\n", strtonum($1) @}'}
+@print{} 17
+@end example
+
+Using the @code{strtonum()} function is @emph{not} the same as adding zero
+to a string value; the automatic coercion of strings to numbers
+works only for decimal data, not for octal or hexadecimal.@footnote{Unless
+you use the @option{--non-decimal-data} option, which isn't recommended.
+@xref{Nondecimal Data} for more information.}
+
+Note also that @code{strtonum()} uses the current locale's decimal point
+for recognizing numbers (@pxref{Locales}).
+
+@item @code{sub(@var{regexp}, @var{replacement}} [@code{, @var{target}}]@code{)}
+@cindexawkfunc{sub}
+@cindex replace in string
+Search @var{target}, which is treated as a string, for the
+leftmost, longest substring matched by the regular expression @var{regexp}.
+Modify the entire string
+by replacing the matched text with @var{replacement}.
+The modified string becomes the new value of @var{target}.
+Return the number of substitutions made (zero or one).
+
+The @var{regexp} argument may be either a regexp constant
+(@code{/}@dots{}@code{/}) or a string constant (@code{"}@dots{}@code{"}).
+In the latter case, the string is treated as a regexp to be matched.
+@xref{Computed Regexps} for a
+discussion of the difference between the two forms, and the
+implications for writing your program correctly.
+
+This function is peculiar because @var{target} is not simply
+used to compute a value, and not just any expression will do---it
+must be a variable, field, or array element so that @code{sub()} can
+store a modified value there.  If this argument is omitted, then the
+default is to use and alter @code{$0}.@footnote{Note that this means
+that the record will first be regenerated using the value of @code{OFS} if
+any fields have been changed, and that the fields will be updated
+after the substitution, even if the operation is a ``no-op'' such
+as @samp{sub(/^/, "")}.}
+For example:
+
+@example
+str = "water, water, everywhere"
+sub(/at/, "ith", str)
+@end example
+
+@noindent
+sets @code{str} to @w{@samp{wither, water, everywhere}}, by replacing the
+leftmost longest occurrence of @samp{at} with @samp{ith}.
+
+If the special character @samp{&} appears in @var{replacement}, it
+stands for the precise substring that was matched by @var{regexp}.  (If
+the regexp can match more than one string, then this precise substring
+may vary.)  For example:
+
+@example
+@{ sub(/candidate/, "& and his wife"); print @}
+@end example
+
+@noindent
+changes the first occurrence of @samp{candidate} to @samp{candidate
+and his wife} on each input line.
+Here is another example:
+
+@example
+$ @kbd{awk 'BEGIN @{}
+>         @kbd{str = "daabaaa"}
+>         @kbd{sub(/a+/, "C&C", str)}
+>         @kbd{print str}
+> @kbd{@}'}
+@print{} dCaaCbaaa
+@end example
+
+@noindent
+This shows how @samp{&} can represent a nonconstant string and also
+illustrates the ``leftmost, longest'' rule in regexp matching
+(@pxref{Leftmost Longest}).
+
+The effect of this special character (@samp{&}) can be turned off by putting a
+backslash before it in the string.  As usual, to insert one backslash in
+the string, you must write two backslashes.  Therefore, write @samp{\\&}
+in a string constant to include a literal @samp{&} in the replacement.
+For example, the following shows how to replace the first @samp{|} on each line with
+an @samp{&}:
+
+@example
+@{ sub(/\|/, "\\&"); print @}
+@end example
+
+@cindex @code{sub()} function, arguments of
+@cindex @code{gsub()} function, arguments of
+As mentioned, the third argument to @code{sub()} must
+be a variable, field, or array element.
+Some versions of @command{awk} allow the third argument to
+be an expression that is not an lvalue.  In such a case, @code{sub()}
+still searches for the pattern and returns zero or one, but the result of
+the substitution (if any) is thrown away because there is no place
+to put it.  Such versions of @command{awk} accept expressions
+like the following:
+
+@example
+sub(/USA/, "United States", "the USA and Canada")
+@end example
+
+@noindent
+@cindex troubleshooting, @code{gsub()}/@code{sub()} functions
+For historical compatibility, @command{gawk} accepts such erroneous code.
+However, using any other nonchangeable
+object as the third parameter causes a fatal error and your program
+will not run.
+
+Finally, if the @var{regexp} is not a regexp constant, it is converted into a
+string, and then the value of that string is treated as the regexp to match.
+
+@item @code{substr(@var{string}, @var{start}} [@code{, @var{length}} ]@code{)}
+@cindexawkfunc{substr}
+@cindex substring
+Return a @var{length}-character-long substring of @var{string},
+starting at character number @var{start}.  The first character of a
+string is character number one.@footnote{This is different from
+C and C++, in which the first character is number zero.}
+For example, @code{substr("washington", 5, 3)} returns @code{"ing"}.
+
+If @var{length} is not present, @code{substr()} returns the whole suffix of
+@var{string} that begins at character number @var{start}.  For example,
+@code{substr("washington", 5)} returns @code{"ington"}.  The whole
+suffix is also returned
+if @var{length} is greater than the number of characters remaining
+in the string, counting from character @var{start}.
+
+@cindex Brian Kernighan's @command{awk}
+If @var{start} is less than one, @code{substr()} treats it as
+if it was one. (POSIX doesn't specify what to do in this case:
+BWK @command{awk} acts this way, and therefore @command{gawk}
+does too.)
+If @var{start} is greater than the number of characters
+in the string, @code{substr()} returns the null string.
+Similarly, if @var{length} is present but less than or equal to zero,
+the null string is returned.
+
+@cindex troubleshooting, @code{substr()} function
+The string returned by @code{substr()} @emph{cannot} be
+assigned.  Thus, it is a mistake to attempt to change a portion of
+a string, as shown in the following example:
+
+@example
+string = "abcdef"
+# try to get "abCDEf", won't work
+substr(string, 3, 3) = "CDE"
+@end example
+
+@noindent
+It is also a mistake to use @code{substr()} as the third argument
+of @code{sub()} or @code{gsub()}:
+
+@example
+gsub(/xyz/, "pdq", substr($0, 5, 20))  # WRONG
+@end example
+
+@cindex portability, @code{substr()} function
+(Some commercial versions of @command{awk} treat
+@code{substr()} as assignable, but doing so is not portable.)
+
+If you need to replace bits and pieces of a string, combine @code{substr()}
+with string concatenation, in the following manner:
+
+@example
+string = "abcdef"
+@dots{}
+string = substr(string, 1, 2) "CDE" substr(string, 6)
+@end example
+
+@cindex case sensitivity, converting case
+@cindex strings, converting letter case
+@item @code{tolower(@var{string})}
+@cindexawkfunc{tolower}
+@cindex convert string to lower case
+Return a copy of @var{string}, with each uppercase character
+in the string replaced with its corresponding lowercase character.
+Nonalphabetic characters are left unchanged.  For example,
+@code{tolower("MiXeD cAsE 123")} returns @code{"mixed case 123"}.
+
+@item @code{toupper(@var{string})}
+@cindexawkfunc{toupper}
+@cindex convert string to upper case
+Return a copy of @var{string}, with each lowercase character
+in the string replaced with its corresponding uppercase character.
+Nonalphabetic characters are left unchanged.  For example,
+@code{toupper("MiXeD cAsE 123")} returns @code{"MIXED CASE 123"}.
+@end table
+
+@cindex sidebar, Matching the Null String
+@ifdocbook
+@docbook
+<sidebar><title>Matching the Null String</title>
+@end docbook
+
+@cindex matching, null strings
+@cindex null strings, matching
+@cindex @code{*} (asterisk), @code{*} operator, null strings@comma{} matching
+@cindex asterisk (@code{*}), @code{*} operator, null strings@comma{} matching
+
+In @command{awk}, the @samp{*} operator can match the null string.
+This is particularly important for the @code{sub()}, @code{gsub()},
+and @code{gensub()} functions.  For example:
+
+@example
+$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'}
+@print{} XaXbXcX
+@end example
+
+@noindent
+Although this makes a certain amount of sense, it can be surprising.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Matching the Null String}
+
+
+@cindex matching, null strings
+@cindex null strings, matching
+@cindex @code{*} (asterisk), @code{*} operator, null strings@comma{} matching
+@cindex asterisk (@code{*}), @code{*} operator, null strings@comma{} matching
+
+In @command{awk}, the @samp{*} operator can match the null string.
+This is particularly important for the @code{sub()}, @code{gsub()},
+and @code{gensub()} functions.  For example:
+
+@example
+$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'}
+@print{} XaXbXcX
+@end example
+
+@noindent
+Although this makes a certain amount of sense, it can be surprising.
+@end cartouche
+@end ifnotdocbook
+
+
+@node Gory Details
+@subsubsection More about @samp{\} and @samp{&} with @code{sub()}, @code{gsub()}, and @code{gensub()}
+
+@cindex escape processing, @code{gsub()}/@code{gensub()}/@code{sub()} functions
+@cindex @code{sub()} function, escape processing
+@cindex @code{gsub()} function, escape processing
+@cindex @code{gensub()} function (@command{gawk}), escape processing
+@cindex @code{\} (backslash), @code{gsub()}/@code{gensub()}/@code{sub()} functions and
+@cindex backslash (@code{\}), @code{gsub()}/@code{gensub()}/@code{sub()} functions and
+@cindex @code{&} (ampersand), @code{gsub()}/@code{gensub()}/@code{sub()} functions and
+@cindex ampersand (@code{&}), @code{gsub()}/@code{gensub()}/@code{sub()} functions and
+
+@quotation CAUTION
+This subsubsection has been reported to cause headaches.
+You might want to skip it upon first reading.
+@end quotation
+
+When using @code{sub()}, @code{gsub()}, or @code{gensub()}, and trying to get literal
+backslashes and ampersands into the replacement text, you need to remember
+that there are several levels of @dfn{escape processing} going on.
+
+First, there is the @dfn{lexical} level, which is when @command{awk} reads
+your program
+and builds an internal copy of it to execute.
+Then there is the runtime level, which is when @command{awk} actually scans the
+replacement string to determine what to generate.
+
+@cindex Brian Kernighan's @command{awk}
+At both levels, @command{awk} looks for a defined set of characters that
+can come after a backslash.  At the lexical level, it looks for the
+escape sequences listed in @ref{Escape Sequences}.
+Thus, for every @samp{\} that @command{awk} processes at the runtime
+level, you must type two backslashes at the lexical level.
+When a character that is not valid for an escape sequence follows the
+@samp{\}, BWK @command{awk} and @command{gawk} both simply remove the initial
+@samp{\} and put the next character into the string. Thus, for
+example, @code{"a\qb"} is treated as @code{"aqb"}.
+
+At the runtime level, the various functions handle sequences of
+@samp{\} and @samp{&} differently.  The situation is (sadly) somewhat complex.
+Historically, the @code{sub()} and @code{gsub()} functions treated the
+two-character sequence @samp{\&} specially; this sequence was replaced in
+the generated text with a single @samp{&}.  Any other @samp{\} within
+the @var{replacement} string that did not precede an @samp{&} was passed
+through unchanged.  This is illustrated in @ref{table-sub-escapes}.
+
+@c Thank to Karl Berry for help with the TeX stuff.
+@float Table,table-sub-escapes
+@caption{Historical escape sequence processing for @code{sub()} and @code{gsub()}}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+      You type!@code{sub()} sees!@code{sub()} generates_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+     @code{\&}!       @code{&}!The matched text_cr
+    @code{\\&}!      @code{\&}!A literal @samp{&}_cr
+   @code{\\\&}!      @code{\&}!A literal @samp{&}_cr
+  @code{\\\\&}!     @code{\\&}!A literal @samp{\&}_cr
+ @code{\\\\\&}!     @code{\\&}!A literal @samp{\&}_cr
+@code{\\\\\\&}!    @code{\\\&}!A literal @samp{\\&}_cr
+    @code{\\q}!      @code{\q}!A literal @samp{\q}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates
+@item @code{\&}      @tab @code{&}    @tab The matched text
+@item @code{\\&}     @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\\&}    @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\\\&}   @tab @code{\\&}  @tab A literal @samp{\&}
+@item @code{\\\\\&}  @tab @code{\\&}  @tab A literal @samp{\&}
+@item @code{\\\\\\&} @tab @code{\\\&} @tab A literal @samp{\\&}
+@item @code{\\q}     @tab @code{\q}   @tab A literal @samp{\q}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+ You type         @code{sub()} sees          @code{sub()} generates
+ --------         ----------          ---------------
+     @code{\&}              @code{&}            The matched text
+    @code{\\&}             @code{\&}            A literal @samp{&}
+   @code{\\\&}             @code{\&}            A literal @samp{&}
+  @code{\\\\&}            @code{\\&}            A literal @samp{\&}
+ @code{\\\\\&}            @code{\\&}            A literal @samp{\&}
+@code{\\\\\\&}           @code{\\\&}            A literal @samp{\\&}
+    @code{\\q}             @code{\q}            A literal @samp{\q}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+@noindent
+This table shows the lexical-level processing, where
+an odd number of backslashes becomes an even number at the runtime level,
+as well as the runtime processing done by @code{sub()}.
+(For the sake of simplicity, the rest of the following tables only show the
+case of even numbers of backslashes entered at the lexical level.)
+
+The problem with the historical approach is that there is no way to get
+a literal @samp{\} followed by the matched text.
+
+Several editions of the POSIX standard attempted to fix this problem
+but weren't successful. The details are irrelevant at this point in time.
+
+At one point, the @command{gawk} maintainer submitted
+proposed text for a revised standard that
+reverts to rules that correspond more closely to the original existing
+practice. The proposed rules have special cases that make it possible
+to produce a @samp{\} preceding the matched text.
+This is shown in
+@ref{table-sub-proposed}.
+
+@float Table,table-sub-proposed
+@caption{@command{gawk} rules for @code{sub()} and backslash}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+    You type!@code{sub()} sees!@code{sub()} generates_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+@code{\\\\\\&}!     @code{\\\&}!A literal @samp{\&}_cr
+@code{\\\\&}!     @code{\\&}!A literal @samp{\}, followed by the matched text_cr
+  @code{\\&}!      @code{\&}!A literal @samp{&}_cr
+  @code{\\q}!      @code{\q}!A literal @samp{\q}_cr
+ @code{\\\\}!      @code{\\}!@code{\\}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates
+@item @code{\\\\\\&} @tab @code{\\\&} @tab A literal @samp{\&}
+@item @code{\\\\&}   @tab @code{\\&}  @tab A literal @samp{\}, followed by the matched text
+@item @code{\\&}     @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\q}     @tab @code{\q}   @tab A literal @samp{\q}
+@item @code{\\\\}    @tab @code{\\}   @tab @code{\\}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+ You type         @code{sub()} sees         @code{sub()} generates
+ --------         ----------         ---------------
+@code{\\\\\\&}           @code{\\\&}            A literal @samp{\&}
+  @code{\\\\&}            @code{\\&}            A literal @samp{\}, followed by the matched text
+    @code{\\&}             @code{\&}            A literal @samp{&}
+    @code{\\q}             @code{\q}            A literal @samp{\q}
+   @code{\\\\}             @code{\\}            @code{\\}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+In a nutshell, at the runtime level, there are now three special sequences
+of characters (@samp{\\\&}, @samp{\\&}, and @samp{\&}) whereas historically
+there was only one.  However, as in the historical case, any @samp{\} that
+is not part of one of these three sequences is not special and appears
+in the output literally.
+
+@command{gawk} 3.0 and 3.1 follow these rules for @code{sub()} and
+@code{gsub()}.  The POSIX standard took much longer to be revised than
+was expected.  In addition, the @command{gawk} maintainer's proposal was
+lost during the standardization process.  The final rules are
+somewhat simpler.  The results are similar except for one case.
+
+@cindex POSIX @command{awk}, functions and, @code{gsub()}/@code{sub()}
+The POSIX rules state that @samp{\&} in the replacement string produces
+a literal @samp{&}, @samp{\\} produces a literal @samp{\}, and @samp{\} followed
+by anything else is not special; the @samp{\} is placed straight into the output.
+These rules are presented in @ref{table-posix-sub}.
+
+@float Table,table-posix-sub
+@caption{POSIX rules for @code{sub()} and @code{gsub()}}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+    You type!@code{sub()} sees!@code{sub()} generates_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+@code{\\\\\\&}!     @code{\\\&}!A literal @samp{\&}_cr
+@code{\\\\&}!     @code{\\&}!A literal @samp{\}, followed by the matched text_cr
+  @code{\\&}!      @code{\&}!A literal @samp{&}_cr
+  @code{\\q}!      @code{\q}!A literal @samp{\q}_cr
+ @code{\\\\}!      @code{\\}!@code{\}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates
+@item @code{\\\\\\&} @tab @code{\\\&} @tab A literal @samp{\&}
+@item @code{\\\\&}   @tab @code{\\&}  @tab A literal @samp{\}, followed by the matched text
+@item @code{\\&}     @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\q}     @tab @code{\q}   @tab A literal @samp{\q}
+@item @code{\\\\}    @tab @code{\\}   @tab @code{\}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+ You type         @code{sub()} sees         @code{sub()} generates
+ --------         ----------         ---------------
+@code{\\\\\\&}           @code{\\\&}            A literal @samp{\&}
+  @code{\\\\&}            @code{\\&}            A literal @samp{\}, followed by the matched text
+    @code{\\&}             @code{\&}            A literal @samp{&}
+    @code{\\q}             @code{\q}            A literal @samp{\q}
+   @code{\\\\}             @code{\\}            @code{\}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+The only case where the difference is noticeable is the last one: @samp{\\\\}
+is seen as @samp{\\} and produces @samp{\} instead of @samp{\\}.
+
+Starting with @value{PVERSION} 3.1.4, @command{gawk} followed the POSIX rules
+when @option{--posix} was specified (@pxref{Options}). Otherwise,
+it continued to follow the proposed rules, as
+that had been its behavior for many years.
+
+When @value{PVERSION} 4.0.0 was released, the @command{gawk} maintainer
+made the POSIX rules the default, breaking well over a decade's worth
+of backward compatibility.@footnote{This was rather naive of him, despite
+there being a note in this @value{SECTION} indicating that the next major version
+would move to the POSIX rules.} Needless to say, this was a bad idea,
+and as of @value{PVERSION} 4.0.1, @command{gawk} resumed its historical
+behavior, and only follows the POSIX rules when @option{--posix} is given.
+
+The rules for @code{gensub()} are considerably simpler. At the runtime
+level, whenever @command{gawk} sees a @samp{\}, if the following character
+is a digit, then the text that matched the corresponding parenthesized
+subexpression is placed in the generated output.  Otherwise,
+no matter what character follows the @samp{\}, it
+appears in the generated text and the @samp{\} does not,
+as shown in @ref{table-gensub-escapes}.
+
+@float Table,table-gensub-escapes
+@caption{Escape sequence processing for @code{gensub()}}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+    You type!@code{gensub()} sees!@code{gensub()} generates_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+      @code{&}!           @code{&}!The matched text_cr
+    @code{\\&}!          @code{\&}!A literal @samp{&}_cr
+   @code{\\\\}!          @code{\\}!A literal @samp{\}_cr
+  @code{\\\\&}!         @code{\\&}!A literal @samp{\}, then the matched text_cr
+@code{\\\\\\&}!        @code{\\\&}!A literal @samp{\&}_cr
+    @code{\\q}!          @code{\q}!A literal @samp{q}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem You type @tab @code{gensub()} sees @tab @code{gensub()} generates
+@item @code{&}       @tab @code{&}    @tab The matched text
+@item @code{\\&}     @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\\\}    @tab @code{\\}   @tab A literal @samp{\}
+@item @code{\\\\&}   @tab @code{\\&}  @tab A literal @samp{\}, then the matched text
+@item @code{\\\\\\&} @tab @code{\\\&} @tab A literal @samp{\&}
+@item @code{\\q}     @tab  @code{\q}  @tab A literal @samp{q}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+  You type          @code{gensub()} sees         @code{gensub()} generates
+  --------          -------------         ------------------
+      @code{&}                    @code{&}            The matched text
+    @code{\\&}                   @code{\&}            A literal @samp{&}
+   @code{\\\\}                   @code{\\}            A literal @samp{\}
+  @code{\\\\&}                  @code{\\&}            A literal @samp{\}, then the matched text
+@code{\\\\\\&}                 @code{\\\&}            A literal @samp{\&}
+    @code{\\q}                   @code{\q}            A literal @samp{q}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+Because of the complexity of the lexical- and runtime-level processing
+and the special cases for @code{sub()} and @code{gsub()},
+we recommend the use of @command{gawk} and @code{gensub()} when you have
+to do substitutions.
+
+@node I/O Functions
+@subsection Input/Output Functions
+@cindex input/output functions
+
+The following functions relate to input/output (I/O).
+Optional parameters are enclosed in square brackets ([ ]):
+
+@table @asis
+@item @code{close(}@var{filename} [@code{,} @var{how}]@code{)}
+@cindexawkfunc{close}
+@cindex files, closing
+@cindex close file or coprocess
+Close the file @var{filename} for input or output. Alternatively, the
+argument may be a shell command that was used for creating a coprocess, or
+for redirecting to or from a pipe; then the coprocess or pipe is closed.
+@xref{Close Files And Pipes}
+for more information.
+
+When closing a coprocess, it is occasionally useful to first close
+one end of the two-way pipe and then to close the other.  This is done
+by providing a second argument to @code{close()}.  This second argument
+(@var{how})
+should be one of the two string values @code{"to"} or @code{"from"},
+indicating which end of the pipe to close.  Case in the string does
+not matter.
+@xref{Two-way I/O},
+which discusses this feature in more detail and gives an example.
+
+Note that the second argument to @code{close()} is a @command{gawk}
+extension; it is not available in compatibility mode (@pxref{Options}).
+
+@item @code{fflush(}[@var{filename}]@code{)}
+@cindexawkfunc{fflush}
+@cindex flush buffered output
+Flush any buffered output associated with @var{filename}, which is either a
+file opened for writing or a shell command for redirecting output to
+a pipe or coprocess.
+
+@cindex buffers, flushing
+@cindex output, buffering
+Many utility programs @dfn{buffer} their output (i.e., they save information
+to write to a disk file or the screen in memory until there is enough
+for it to be worthwhile to send the data to the output device).
+This is often more efficient than writing
+every little bit of information as soon as it is ready.  However, sometimes
+it is necessary to force a program to @dfn{flush} its buffers (i.e.,
+write the information to its destination, even if a buffer is not full).
+This is the purpose of the @code{fflush()} function---@command{gawk} also
+buffers its output, and the @code{fflush()} function forces
+@command{gawk} to flush its buffers.
+
+@cindex extensions, common@comma{} @code{fflush()} function
+@cindex Brian Kernighan's @command{awk}
+Brian Kernighan added @code{fflush()} to his @command{awk} in April
+1992.  For two decades, it was a common extension.  In December
+2012, it was accepted for inclusion into the POSIX standard.
+See @uref{http://austingroupbugs.net/view.php?id=634, the Austin Group website}.
+
+POSIX standardizes @code{fflush()} as follows: if there
+is no argument, or if the argument is the null string (@w{@code{""}}),
+then @command{awk} flushes the buffers for @emph{all} open output files
+and pipes.
+
+@quotation NOTE
+Prior to @value{PVERSION} 4.0.2, @command{gawk}
+would flush only the standard output if there was no argument,
+and flush all output files and pipes if the argument was the null
+string. This was changed in order to be compatible with Brian
+Kernighan's @command{awk}, in the hope that standardizing this
+feature in POSIX would then be easier (which indeed proved to be the case).
+
+With @command{gawk},
+you can use @samp{fflush("/dev/stdout")} if you wish to flush
+only the standard output.
+@end quotation
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex troubleshooting, @code{fflush()} function
+@code{fflush()} returns zero if the buffer is successfully flushed;
+otherwise, it returns a nonzero value. (@command{gawk} returns @minus{}1.)
+In the case where all buffers are flushed, the return value is zero
+only if all buffers were flushed successfully.  Otherwise, it is
+@minus{}1, and @command{gawk} warns about the problem @var{filename}.
+
+@command{gawk} also issues a warning message if you attempt to flush
+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.
+
+@c end the table to let the sidebar take up the full width of the page.
+@end table
+
+@cindex sidebar, Interactive Versus Noninteractive Buffering
+@ifdocbook
+@docbook
+<sidebar><title>Interactive Versus Noninteractive Buffering</title>
+@end docbook
+
+@cindex buffering, interactive vs.@: noninteractive
+
+As a side point, buffering issues can be even more confusing if
+your program is @dfn{interactive} (i.e., communicating
+with a user sitting at a keyboard).@footnote{A program is interactive
+if the standard output is connected to a terminal device. On modern
+systems, this means your keyboard and screen.}
+
+@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for
+@c motivating me to write this section.
+Interactive programs generally @dfn{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:
+
+@example
+$ @kbd{awk '@{ print $1 + $2 @}'}
+@kbd{1 1}
+@print{} 2
+@kbd{2 3}
+@print{} 5
+@kbd{Ctrl-d}
+@end example
+
+@noindent
+Each line of output is printed immediately. Compare that behavior
+with this example:
+
+@example
+$ @kbd{awk '@{ print $1 + $2 @}' | cat}
+@kbd{1 1}
+@kbd{2 3}
+@kbd{Ctrl-d}
+@print{} 2
+@print{} 5
+@end example
+
+@noindent
+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.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Interactive Versus Noninteractive Buffering}
+
+
+@cindex buffering, interactive vs.@: noninteractive
+
+As a side point, buffering issues can be even more confusing if
+your program is @dfn{interactive} (i.e., communicating
+with a user sitting at a keyboard).@footnote{A program is interactive
+if the standard output is connected to a terminal device. On modern
+systems, this means your keyboard and screen.}
+
+@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for
+@c motivating me to write this section.
+Interactive programs generally @dfn{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:
+
+@example
+$ @kbd{awk '@{ print $1 + $2 @}'}
+@kbd{1 1}
+@print{} 2
+@kbd{2 3}
+@print{} 5
+@kbd{Ctrl-d}
+@end example
+
+@noindent
+Each line of output is printed immediately. Compare that behavior
+with this example:
+
+@example
+$ @kbd{awk '@{ print $1 + $2 @}' | cat}
+@kbd{1 1}
+@kbd{2 3}
+@kbd{Ctrl-d}
+@print{} 2
+@print{} 5
+@end example
+
+@noindent
+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 cartouche
+@end ifnotdocbook
+
+@table @asis
+@item @code{system(@var{command})}
+@cindexawkfunc{system}
+@cindex invoke shell command
+@cindex interacting with other programs
+Execute the operating system
+command @var{command} and then return to the @command{awk} program.
+Return @var{command}'s exit status (see further on).
+
+For example, if the following fragment of code is put in your @command{awk}
+program:
+
+@example
+END @{
+     system("date | mail -s 'awk run done' root")
+@}
+@end example
+
+@noindent
+the system administrator is sent mail when the @command{awk} program
+finishes processing input and begins its end-of-input processing.
+
+Note that redirecting @code{print} or @code{printf} into a pipe is often
+enough to accomplish your task.  If you need to run many commands, it
+is more efficient to simply print them down a pipeline to the shell:
+
+@example
+while (@var{more stuff to do})
+    print @var{command} | "/bin/sh"
+close("/bin/sh")
+@end example
+
+@noindent
+@cindex troubleshooting, @code{system()} function
+@cindex @option{--sandbox} option, disabling @code{system()} function
+However, if your @command{awk}
+program is interactive, @code{system()} is useful for running large
+self-contained programs, such as a shell or an editor.
+Some operating systems cannot implement the @code{system()} function.
+@code{system()} causes a fatal error if it is not supported.
+
+@quotation NOTE
+When @option{--sandbox} is specified, the @code{system()} function is disabled
+(@pxref{Options}).
+@end quotation
+
+On POSIX systems, a command's exit status is a 16-bit number. The exit
+value passed to the C @code{exit()} function is held in the high-order
+eight bits. The low-order bits indicate if the process was killed by a
+signal (bit 7) and if so, the guilty signal number (bits 0--6).
+
+Traditionally, @command{awk}'s @code{system()} function has simply
+returned the exit status value divided by 256. In the normal case this
+gives the exit status but in the case of death-by-signal it yields
+a fractional floating-point value.@footnote{In private correspondence,
+Dr.@: Kernighan has indicated to me that the way this was done
+was probably a mistake.} POSIX states that @command{awk}'s
+@code{system()} should return the full 16-bit value.
+
+@command{gawk} steers a middle ground.
+The return values are summarized in @ref{table-system-return-values}.
+
+@float Table,table-system-return-values
+@caption{Return values from @code{system()}}
+@multitable @columnfractions .40 .60
+@headitem Situation @tab Return value from @code{system()}
+@item @option{--traditional} @tab C @code{system()}'s value divided by 256
+@item @option{--posix} @tab C @code{system()}'s value
+@item Normal exit of command @tab Command's exit status
+@item Death by signal of command @tab 256 + number of murderous signal
+@item Death by signal of command with core dump @tab 512 + number of murderous signal
+@item Some kind of error @tab @minus{}1
+@end multitable
+@end float
+@end table
+
+As of August, 2018, BWK @command{awk} now follows @command{gawk}'s behavior
+for the return value of @code{system()}.
+
+@cindex sidebar, Controlling Output Buffering with @code{system()}
+@ifdocbook
+@docbook
+<sidebar><title>Controlling Output Buffering with @code{system()}</title>
+@end docbook
+
+@cindex buffers, flushing
+@cindex buffering, input/output
+@cindex output, buffering
+
+The @code{fflush()} function provides explicit control over output buffering for
+individual files and pipes.  However, its use is not portable to many older
+@command{awk} implementations.  An alternative method to flush output
+buffers is to call @code{system()} with a null string as its argument:
+
+@example
+system("")   # flush output
+@end example
+
+@noindent
+@command{gawk} treats this use of the @code{system()} function as a special
+case and is smart enough not to run a shell (or other command
+interpreter) with the empty command.  Therefore, with @command{gawk}, this
+idiom is not only useful, it is also efficient.  Although this method should work
+with other @command{awk} implementations, it does not necessarily avoid
+starting an unnecessary shell.  (Other implementations may only
+flush the buffer associated with the standard output and not necessarily
+all buffered output.)
+
+If you think about what a programmer expects, it makes sense that
+@code{system()} should flush any pending output.  The following program:
+
+@example
+BEGIN @{
+     print "first print"
+     system("echo system echo")
+     print "second print"
+@}
+@end example
+
+@noindent
+must print:
+
+@example
+first print
+system echo
+second print
+@end example
+
+@noindent
+and not:
+
+@example
+system echo
+first print
+second print
+@end example
+
+If @command{awk} did not flush its buffers before calling @code{system()},
+you would see the latter (undesirable) output.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Controlling Output Buffering with @code{system()}}
+
+
+@cindex buffers, flushing
+@cindex buffering, input/output
+@cindex output, buffering
+
+The @code{fflush()} function provides explicit control over output buffering for
+individual files and pipes.  However, its use is not portable to many older
+@command{awk} implementations.  An alternative method to flush output
+buffers is to call @code{system()} with a null string as its argument:
+
+@example
+system("")   # flush output
+@end example
+
+@noindent
+@command{gawk} treats this use of the @code{system()} function as a special
+case and is smart enough not to run a shell (or other command
+interpreter) with the empty command.  Therefore, with @command{gawk}, this
+idiom is not only useful, it is also efficient.  Although this method should work
+with other @command{awk} implementations, it does not necessarily avoid
+starting an unnecessary shell.  (Other implementations may only
+flush the buffer associated with the standard output and not necessarily
+all buffered output.)
+
+If you think about what a programmer expects, it makes sense that
+@code{system()} should flush any pending output.  The following program:
+
+@example
+BEGIN @{
+     print "first print"
+     system("echo system echo")
+     print "second print"
+@}
+@end example
+
+@noindent
+must print:
+
+@example
+first print
+system echo
+second print
+@end example
+
+@noindent
+and not:
+
+@example
+system echo
+first print
+second print
+@end example
+
+If @command{awk} did not flush its buffers before calling @code{system()},
+you would see the latter (undesirable) output.
+@end cartouche
+@end ifnotdocbook
+
+@node Time Functions
+@subsection Time Functions
+@cindex time functions
+
+@cindex timestamps
+@cindex log files, timestamps in
+@cindex files, log@comma{} timestamps in
+@cindex @command{gawk}, timestamps
+@cindex POSIX @command{awk}, timestamps and
+@command{awk} programs are commonly used to process log files
+containing timestamp information, indicating when a
+particular log record was written.  Many programs log their timestamps
+in the form returned by the @code{time()} system call, which is the
+number of seconds since a particular epoch.  On POSIX-compliant systems,
+it is the number of seconds since
+1970-01-01 00:00:00 UTC, not counting leap
+@ifclear FOR_PRINT
+seconds.@footnote{@xref{Glossary}, especially the entries ``Epoch'' and ``UTC.''}
+@end ifclear
+@ifset FOR_PRINT
+seconds.
+@end ifset
+All known POSIX-compliant systems support timestamps from 0 through
+@iftex
+@math{2^{31} - 1},
+@end iftex
+@ifinfo
+2^31 - 1,
+@end ifinfo
+@ifnottex
+@ifnotinfo
+2@sup{31} @minus{} 1,
+@end ifnotinfo
+@end ifnottex
+which is sufficient to represent times through
+2038-01-19 03:14:07 UTC.  Many systems support a wider range of timestamps,
+including negative timestamps that represent times before the
+epoch.
+
+@cindex @command{date} utility, GNU
+@cindex time, retrieving
+In order to make it easier to process such log files and to produce
+useful reports, @command{gawk} provides the following functions for
+working with timestamps.  They are @command{gawk} extensions; they are
+not specified in the POSIX standard.@footnote{The GNU @command{date} utility can
+also do many of the things described here.  Its use may be preferable
+for simple time-related operations in shell scripts.}
+However, recent versions
+of @command{mawk} (@pxref{Other Versions}) also support these functions.
+Optional parameters are enclosed in square brackets ([ ]):
+
+@c @asis for docbook
+@table @asis
+@item @code{mktime(@var{datespec}} [@code{, @var{utc-flag}} ]@code{)}
+@cindexgawkfunc{mktime}
+@cindex generate time values
+Turn @var{datespec} into a timestamp in the same form
+as is returned by @code{systime()}.  It is similar to the function of the
+same name in ISO C.  The argument, @var{datespec}, is a string of the form
+@w{@code{"@var{YYYY} @var{MM} @var{DD} @var{HH} @var{MM} @var{SS} [@var{DST}]"}}.
+The string consists of six or seven numbers representing, respectively,
+the full year including century, the month from 1 to 12, the day of the month
+from 1 to 31, the hour of the day from 0 to 23, the minute from 0 to
+59, the second from 0 to 60,@footnote{Occasionally there are
+minutes in a year with a leap second, which is why the
+seconds can go up to 60.}
+and an optional daylight-savings flag.
+
+The values of these numbers need not be within the ranges specified;
+for example, an hour of @minus{}1 means 1 hour before midnight.
+The origin-zero Gregorian calendar is assumed, with year 0 preceding
+year 1 and year @minus{}1 preceding year 0.
+If @var{utc-flag} is present and is either nonzero or non-null, the time
+is assumed to be in the UTC time zone; otherwise, the
+time is assumed to be in the local time zone.
+If the @var{DST} daylight-savings flag is positive, the time is assumed to be
+daylight savings time; if zero, the time is assumed to be standard
+time; and if negative (the default), @code{mktime()} attempts to determine
+whether daylight savings time is in effect for the specified time.
+
+If @var{datespec} does not contain enough elements or if the resulting time
+is out of range, @code{mktime()} returns @minus{}1.
+
+@cindex @command{gawk}, @code{PROCINFO} array in
+@cindex @code{PROCINFO} array
+@item @code{strftime(}[@var{format} [@code{,} @var{timestamp} [@code{,} @var{utc-flag}] ] ]@code{)}
+@cindexgawkfunc{strftime}
+@cindex format time string
+Format the time specified by @var{timestamp}
+based on the contents of the @var{format} string and return the result.
+It is similar to the function of the same name in ISO C.
+If @var{utc-flag} is present and is either nonzero or non-null, the value
+is formatted as UTC (Coordinated Universal Time, formerly GMT or Greenwich
+Mean Time). Otherwise, the value is formatted for the local time zone.
+The @var{timestamp} is in the same format as the value returned by the
+@code{systime()} function.  If no @var{timestamp} argument is supplied,
+@command{gawk} uses the current time of day as the timestamp.
+Without a @var{format} argument, @code{strftime()} uses
+the value of @code{PROCINFO["strftime"]} as the format string
+(@pxref{Built-in Variables}).
+The default string value is
+@code{@w{"%a %b %e %H:%M:%S %Z %Y"}}.  This format string produces
+output that is equivalent to that of the @command{date} utility.
+You can assign a new value to @code{PROCINFO["strftime"]} to
+change the default format; see the following list for the various format directives.
+
+@item @code{systime()}
+@cindexgawkfunc{systime}
+@cindex timestamps
+@cindex current system time
+Return the current time as the number of seconds since
+the system epoch.  On POSIX systems, this is the number of seconds
+since 1970-01-01 00:00:00 UTC, not counting leap seconds.
+It may be a different number on other systems.
+@end table
+
+The @code{systime()} function allows you to compare a timestamp from a
+log file with the current time of day.  In particular, it is easy to
+determine how long ago a particular record was logged.  It also allows
+you to produce log records using the ``seconds since the epoch'' format.
+
+@cindex converting, dates to timestamps
+@cindex dates, converting to timestamps
+@cindex timestamps, converting dates to
+The @code{mktime()} function allows you to convert a textual representation
+of a date and time into a timestamp.   This makes it easy to do before/after
+comparisons of dates and times, particularly when dealing with date and
+time data coming from an external source, such as a log file.
+
+The @code{strftime()} function allows you to easily turn a timestamp
+into human-readable information.  It is similar in nature to the @code{sprintf()}
+function
+(@pxref{String Functions}),
+in that it copies nonformat specification characters verbatim to the
+returned string, while substituting date and time values for format
+specifications in the @var{format} string.
+
+@cindex format specifiers, @code{strftime()} function (@command{gawk})
+@code{strftime()} is guaranteed by the 1999 ISO C
+standard@footnote{Unfortunately,
+not every system's @code{strftime()} necessarily
+supports all of the conversions listed here.}
+to support the following date format specifications:
+
+@table @code
+@item %a
+The locale's abbreviated weekday name.
+
+@item %A
+The locale's full weekday name.
+
+@item %b
+The locale's abbreviated month name.
+
+@item %B
+The locale's full month name.
+
+@item %c
+The locale's ``appropriate'' date and time representation.
+(This is @samp{%A %B %d %T %Y} in the @code{"C"} locale.)
+
+@item %C
+The century part of the current year.
+This is the year divided by 100 and truncated to the next
+lower integer.
+
+@item %d
+The day of the month as a decimal number (01--31).
+
+@item %D
+Equivalent to specifying @samp{%m/%d/%y}.
+
+@item %e
+The day of the month, padded with a space if it is only one digit.
+
+@item %F
+Equivalent to specifying @samp{%Y-%m-%d}.
+This is the ISO 8601 date format.
+
+@item %g
+The year modulo 100 of the ISO 8601 week number, as a decimal number (00--99).
+For example, January 1, 2012, is in week 53 of 2011. Thus, the year
+of its ISO 8601 week number is 2011, even though its year is 2012.
+Similarly, December 31, 2012, is in week 1 of 2013. Thus, the year
+of its ISO week number is 2013, even though its year is 2012.
+
+@item %G
+The full year of the ISO week number, as a decimal number.
+
+@item %h
+Equivalent to @samp{%b}.
+
+@item %H
+The hour (24-hour clock) as a decimal number (00--23).
+
+@item %I
+The hour (12-hour clock) as a decimal number (01--12).
+
+@item %j
+The day of the year as a decimal number (001--366).
+
+@item %m
+The month as a decimal number (01--12).
+
+@item %M
+The minute as a decimal number (00--59).
+
+@item %n
+A newline character (ASCII LF).
+
+@item %p
+The locale's equivalent of the AM/PM designations associated
+with a 12-hour clock.
+
+@item %r
+The locale's 12-hour clock time.
+(This is @samp{%I:%M:%S %p} in the @code{"C"} locale.)
+
+@item %R
+Equivalent to specifying @samp{%H:%M}.
+
+@item %S
+The second as a decimal number (00--60).
+
+@item %t
+A TAB character.
+
+@item %T
+Equivalent to specifying @samp{%H:%M:%S}.
+
+@item %u
+The weekday as a decimal number (1--7).  Monday is day one.
+
+@item %U
+The week number of the year (with the first Sunday as the first day of week one)
+as a decimal number (00--53).
+
+@c @cindex ISO 8601
+@item %V
+The week number of the year (with the first Monday as the first
+day of week one) as a decimal number (01--53).
+The method for determining the week number is as specified by ISO 8601.
+(To wit: if the week containing January 1 has four or more days in the
+new year, then it is week one; otherwise it is the last week
+[52 or 53] of the previous year and the next week is week one.)
+
+@item %w
+The weekday as a decimal number (0--6).  Sunday is day zero.
+
+@item %W
+The week number of the year (with the first Monday as the first day of week one)
+as a decimal number (00--53).
+
+@item %x
+The locale's ``appropriate'' date representation.
+(This is @samp{%A %B %d %Y} in the @code{"C"} locale.)
+
+@item %X
+The locale's ``appropriate'' time representation.
+(This is @samp{%T} in the @code{"C"} locale.)
+
+@item %y
+The year modulo 100 as a decimal number (00--99).
+
+@item %Y
+The full year as a decimal number (e.g., 2015).
+
+@c @cindex RFC 822
+@c @cindex RFC 1036
+@item %z
+The time zone offset in a @samp{+@var{HHMM}} format (e.g., the format
+necessary to produce RFC 822/RFC 1036 date headers).
+
+@item %Z
+The time zone name or abbreviation; no characters if
+no time zone is determinable.
+
+@item %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH
+@itemx %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy
+``Alternative representations'' for the specifications
+that use only the second letter (@samp{%c}, @samp{%C},
+and so on).@footnote{If you don't understand any of this, don't worry about
+it; these facilities are meant to make it easier to ``internationalize''
+programs.
+Other internationalization features are described in
+@ref{Internationalization}.}
+(These facilitate compliance with the POSIX @command{date} utility.)
+
+@item %%
+A literal @samp{%}.
+@end table
+
+If a conversion specifier is not one of those just listed, the behavior is
+undefined.@footnote{This is because ISO C leaves the
+behavior of the C version of @code{strftime()} undefined and @command{gawk}
+uses the system's version of @code{strftime()} if it's there.
+Typically, the conversion specifier either does not appear in the
+returned string or appears literally.}
+
+For systems that are not yet fully standards-compliant,
+@command{gawk} supplies a copy of
+@code{strftime()} from the GNU C Library.
+It supports all of the just-listed format specifications.
+If that version is
+used to compile @command{gawk} (@pxref{Installation}),
+then the following additional format specifications are available:
+
+@table @code
+@item %k
+The hour (24-hour clock) as a decimal number (0--23).
+Single-digit numbers are padded with a space.
+
+@item %l
+The hour (12-hour clock) as a decimal number (1--12).
+Single-digit numbers are padded with a space.
+
+@ignore
+@item %N
+The ``Emperor/Era'' name.
+Equivalent to @samp{%C}.
+
+@item %o
+The ``Emperor/Era'' year.
+Equivalent to @samp{%y}.
+@end ignore
+
+@item %s
+The time as a decimal timestamp in seconds since the epoch.
+
+@ignore
+@item %v
+The date in VMS format (e.g., @samp{20-JUN-1991}).
+@end ignore
+@end table
+
+Additionally, the alternative representations are recognized but their
+normal representations are used.
+
+@cindex @code{date} utility, POSIX
+@cindex POSIX @command{awk}, @code{date} utility and
+The following example is an @command{awk} implementation of the POSIX
+@command{date} utility.  Normally, the @command{date} utility prints the
+current date and time of day in a well-known format.  However, if you
+provide an argument to it that begins with a @samp{+}, @command{date}
+copies nonformat specifier characters to the standard output and
+interprets the current time according to the format specifiers in
+the string.  For example:
+
+@example
+$ @kbd{date '+Today is %A, %B %d, %Y.'}
+@print{} Today is Monday, September 22, 2014.
+@end example
+
+Here is the @command{gawk} version of the @command{date} utility.
+It has a shell ``wrapper'' to handle the @option{-u} option,
+which requires that @command{date} run as if the time zone
+is set to UTC:
+
+@example
+#! /bin/sh
+#
+# date --- approximate the POSIX 'date' command
+
+case $1 in
+-u)  TZ=UTC0     # use UTC
+     export TZ
+     shift ;;
+esac
+
+gawk 'BEGIN  @{
+    format = PROCINFO["strftime"]
+    exitval = 0
+
+    if (ARGC > 2)
+        exitval = 1
+    else if (ARGC == 2) @{
+        format = ARGV[1]
+        if (format ~ /^\+/)
+            format = substr(format, 2)   # remove leading +
+    @}
+    print strftime(format)
+    exit exitval
+@}' "$@@"
+@end example
+
+@node Bitwise Functions
+@subsection Bit-Manipulation Functions
+@cindex bit-manipulation functions
+@cindex bitwise, operations
+@cindex AND bitwise operation
+@cindex OR bitwise operation
+@cindex XOR bitwise operation
+@cindex operations, bitwise
+@quotation
+@i{I can explain it for you, but I can't understand it for you.}
+@author Anonymous
+@end quotation
+
+Many languages provide the ability to perform @dfn{bitwise} operations
+on two integer numbers.  In other words, the operation is performed on
+each successive pair of bits in the operands.
+Three common operations are bitwise AND, OR, and XOR.
+The operations are described in @ref{table-bitwise-ops}.
+
+@c 11/2014: Postprocessing turns the docbook informaltable
+@c into a table. Hurray for scripting!
+@float Table,table-bitwise-ops
+@caption{Bitwise operations}
+@ifnottex
+@ifnotdocbook
+@verbatim
+                Bit operator
+          |  AND  |   OR  |  XOR
+          |---+---+---+---+---+---
+Operands  | 0 | 1 | 0 | 1 | 0 | 1
+----------+---+---+---+---+---+---
+    0     | 0   0 | 0   1 | 0   1
+    1     | 0   1 | 1   1 | 1   0
+@end verbatim
+@end ifnotdocbook
+@end ifnottex
+@tex
+\centerline{
+\vbox{\bigskip % space above the table (about 1 linespace)
+% Because we have vertical rules, we can't let TeX insert interline space
+% in its usual way.
+\offinterlineskip
+\halign{\strut\hfil#\quad\hfil  % operands
+        &\vrule#&\quad#\quad    % rule, 0 (of and)
+        &\vrule#&\quad#\quad    % rule, 1 (of and)
+        &\vrule#                % rule between and and or
+        &\quad#\quad            % 0 (of or)
+        &\vrule#&\quad#\quad    % rule, 1 (of of)
+        &\vrule#                % rule between or and xor
+        &\quad#\quad            % 0 of xor
+        &\vrule#&\quad#\quad    % rule, 1 of xor
+        \cr
+&\omit&\multispan{11}\hfil\bf Bit operator\hfil\cr
+\noalign{\smallskip}
+&     &\multispan3\hfil AND\hfil&&\multispan3\hfil  OR\hfil
+                           &&\multispan3\hfil XOR\hfil\cr
+\bf Operands&&0&&1&&0&&1&&0&&1\cr
+\noalign{\hrule}
+\omit&height 2pt&&\omit&&&&\omit&&&&\omit\cr
+\noalign{\hrule height0pt}% without this the rule does not extend; why?
+0&&0&\omit&0&&0&\omit&1&&0&\omit&1\cr
+1&&0&\omit&1&&1&\omit&1&&1&\omit&0\cr
+}}}
+@end tex
+
+@docbook
+<informaltable>
+
+<tgroup cols="7" colsep="1">
+<colspec colname="c1"/>
+<colspec colname="c2"/>
+<colspec colname="c3"/>
+<colspec colname="c4"/>
+<colspec colname="c5"/>
+<colspec colname="c6"/>
+<colspec colname="c7"/>
+<spanspec spanname="optitle" namest="c2" nameend="c7" align="center"/>
+<spanspec spanname="andspan" namest="c2" nameend="c3" align="center"/>
+<spanspec spanname="orspan" namest="c4" nameend="c5" align="center"/>
+<spanspec spanname="xorspan" namest="c6" nameend="c7" align="center"/>
+
+<tbody>
+<row>
+<entry colsep="0"></entry>
+<entry spanname="optitle"><emphasis role="bold">Bit operator</emphasis></entry>
+</row>
+
+<row rowsep="1">
+<entry rowsep="0"></entry>
+<entry spanname="andspan">AND</entry>
+<entry spanname="orspan">OR</entry>
+<entry spanname="xorspan">XOR</entry>
+</row>
+
+<row rowsep="1">
+<entry ><emphasis role="bold">Operands</emphasis></entry>
+<entry colsep="0">0</entry>
+<entry colsep="1">1</entry>
+<entry colsep="0">0</entry>
+<entry colsep="1">1</entry>
+<entry colsep="0">0</entry>
+<entry colsep="1">1</entry>
+</row>
+
+<row>
+<entry align="center">0</entry>
+<entry colsep="0">0</entry>
+<entry>0</entry>
+<entry colsep="0">0</entry>
+<entry>1</entry>
+<entry colsep="0">0</entry>
+<entry>1</entry>
+</row>
+
+<row>
+<entry align="center">1</entry>
+<entry colsep="0">0</entry>
+<entry>1</entry>
+<entry colsep="0">1</entry>
+<entry>1</entry>
+<entry colsep="0">1</entry>
+<entry>0</entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+@end docbook
+@end float
+
+@cindex bitwise complement
+@cindex complement, bitwise
+As you can see, the result of an AND operation is 1 only when @emph{both}
+bits are 1.
+The result of an OR operation is 1 if @emph{either} bit is 1.
+The result of an XOR operation is 1 if either bit is 1,
+but not both.
+The next operation is the @dfn{complement}; the complement of 1 is 0 and
+the complement of 0 is 1. Thus, this operation ``flips'' all the bits
+of a given value.
+
+@cindex bitwise, shift
+@cindex left shift, bitwise
+@cindex right shift, bitwise
+@cindex shift, bitwise
+Finally, two other common operations are to shift the bits left or right.
+For example, if you have a bit string @samp{10111001} and you shift it
+right by three bits, you end up with @samp{00010111}.@footnote{This example
+shows that zeros come in on the left side. For @command{gawk}, this is
+always true, but in some languages, it's possible to have the left side
+fill with ones.}
+If you start over again with @samp{10111001} and shift it left by three
+bits, you end up with @samp{11001000}.  The following list describes
+@command{gawk}'s built-in functions that implement the bitwise operations.
+Optional parameters are enclosed in square brackets ([ ]):
+
+@cindex @command{gawk}, bitwise operations in
+@table @asis
+@cindexgawkfunc{and}
+@cindex bitwise AND
+@item @code{and(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
+Return the bitwise AND of the arguments. There must be at least two.
+
+@cindexgawkfunc{compl}
+@cindex bitwise complement
+@item @code{compl(@var{val})}
+Return the bitwise complement of @var{val}.
+
+@cindexgawkfunc{lshift}
+@cindex left shift
+@item @code{lshift(@var{val}, @var{count})}
+Return the value of @var{val}, shifted left by @var{count} bits.
+
+@cindexgawkfunc{or}
+@cindex bitwise OR
+@item @code{or(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
+Return the bitwise OR of the arguments. There must be at least two.
+
+@cindexgawkfunc{rshift}
+@cindex right shift
+@item @code{rshift(@var{val}, @var{count})}
+Return the value of @var{val}, shifted right by @var{count} bits.
+
+@cindexgawkfunc{xor}
+@cindex bitwise XOR
+@item @code{xor(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
+Return the bitwise XOR of the arguments. There must be at least two.
+@end table
+
+@quotation CAUTION
+Beginning with @command{gawk} @value{PVERSION} 4.2, negative
+operands are not allowed for any of these functions. A negative
+operand produces a fatal error.  See the sidebar
+``Beware The Smoke and Mirrors!'' for more information as to why.
+@end quotation
+
+Here is a user-defined function (@pxref{User-defined})
+that illustrates the use of these functions:
+
+@cindex @code{bits2str()} user-defined function
+@cindex @code{testbits.awk} program
+@example
+@group
+@c file eg/lib/bits2str.awk
+# bits2str --- turn an integer into readable ones and zeros
+
+function bits2str(bits,        data, mask)
+@{
+    if (bits == 0)
+        return "0"
+
+    mask = 1
+    for (; bits != 0; bits = rshift(bits, 1))
+        data = (and(bits, mask) ? "1" : "0") data
+
+    while ((length(data) % 8) != 0)
+        data = "0" data
+
+    return data
+@}
+@c endfile
+@end group
+
+@c this is a hack to make testbits.awk self-contained
+@ignore
+@c file eg/prog/testbits.awk
+# bits2str --- turn an integer into readable ones and zeros
+
+function bits2str(bits,        data, mask)
+@{
+    if (bits == 0)
+        return "0"
+
+    mask = 1
+    for (; bits != 0; bits = rshift(bits, 1))
+        data = (and(bits, mask) ? "1" : "0") data
+
+    while ((length(data) % 8) != 0)
+        data = "0" data
+
+    return data
+@}
+@c endfile
+@end ignore
+@c file eg/prog/testbits.awk
+BEGIN @{
+    printf "123 = %s\n", bits2str(123)
+    printf "0123 = %s\n", bits2str(0123)
+    printf "0x99 = %s\n", bits2str(0x99)
+    comp = compl(0x99)
+    printf "compl(0x99) = %#x = %s\n", comp, bits2str(comp)
+    shift = lshift(0x99, 2)
+    printf "lshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
+    shift = rshift(0x99, 2)
+    printf "rshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
+@}
+@c endfile
+@end example
+
+@noindent
+This program produces the following output when run:
+
+@example
+$ @kbd{gawk -f testbits.awk}
+@print{} 123 = 01111011
+@print{} 0123 = 01010011
+@print{} 0x99 = 10011001
+@print{} compl(0x99) = 0x3fffffffffff66 =
+@print{} 00111111111111111111111111111111111111111111111101100110
+@print{} lshift(0x99, 2) = 0x264 = 0000001001100100
+@print{} rshift(0x99, 2) = 0x26 = 00100110
+@end example
+
+@cindex converting, strings to numbers
+@cindex strings, converting
+@cindex numbers, converting
+@cindex converting, numbers to strings
+@cindex numbers, as string of bits
+The @code{bits2str()} function turns a binary number into a string.
+Initializing @code{mask} to one creates
+a binary value where the rightmost bit
+is set to one.  Using this mask,
+the function repeatedly checks the rightmost bit.
+ANDing the mask with the value indicates whether the
+rightmost bit is one or not. If so, a @code{"1"} is concatenated onto the front
+of the string.
+Otherwise, a @code{"0"} is added.
+The value is then shifted right by one bit and the loop continues
+until there are no more one bits.
+
+If the initial value is zero, it returns a simple @code{"0"}.
+Otherwise, at the end, it pads the value with zeros to represent multiples
+of 8-bit quantities. This is typical in modern computers.
+
+The main code in the @code{BEGIN} rule shows the difference between the
+decimal and octal values for the same numbers
+(@pxref{Nondecimal-numbers}),
+and then demonstrates the
+results of the @code{compl()}, @code{lshift()}, and @code{rshift()} functions.
+
+@cindex sidebar, Beware The Smoke and Mirrors!
+@ifdocbook
+@docbook
+<sidebar><title>Beware The Smoke and Mirrors!</title>
+@end docbook
+
+
+It other languages, bitwise operations are performed on integer values,
+not floating-point values.  As a general statement, such operations work
+best when performed on unsigned integers.
+
+@command{gawk} attempts to treat the arguments to the bitwise functions
+as unsigned integers.  For this reason, negative arguments produce a
+fatal error.
+
+In normal operation, for all of these functions, first the
+double-precision floating-point value is converted to the widest C
+unsigned integer type, then the bitwise operation is performed.  If the
+result cannot be represented exactly as a C @code{double}, leading
+nonzero bits are removed one by one until it can be represented exactly.
+The result is then converted back into a C @code{double}.@footnote{If you don't
+understand this paragraph, the upshot is that @command{gawk} can only
+store a particular range of integer values; numbers outside that range
+are reduced to fit within the range.}
+
+However, when using arbitrary precision arithmetic with the @option{-M}
+option (@pxref{Arbitrary Precision Arithmetic}), the results may differ.
+This is particularly noticeable with the @code{compl()} function:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print compl(42) @}'}
+@print{} 9007199254740949
+$ @kbd{gawk -M 'BEGIN @{ print compl(42) @}'}
+@print{} -43
+@end example
+
+What's going on becomes clear when printing the results
+in hexadecimal:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "%#x\n", compl(42) @}'}
+@print{} 0x1fffffffffffd5
+$ @kbd{gawk -M 'BEGIN @{ printf "%#x\n", compl(42) @}'}
+@print{} 0xffffffffffffffd5
+@end example
+
+When using the @option{-M} option, under the hood, @command{gawk} uses
+GNU MP arbitrary precision integers which have at least 64 bits of precision.
+When not using @option{-M}, @command{gawk} stores integral values in
+regular double-precision floating point, which only maintain 53 bits of
+precision.  Furthermore, the GNU MP library treats (or at least seems to treat)
+the leading bit as a sign bit; thus the result with @option{-M} in this case is
+a negative number.
+
+In short, using @command{gawk} for any but the simplest kind of bitwise
+operations is probably a bad idea; caveat emptor!
+
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Beware The Smoke and Mirrors!}
+
+
+
+It other languages, bitwise operations are performed on integer values,
+not floating-point values.  As a general statement, such operations work
+best when performed on unsigned integers.
+
+@command{gawk} attempts to treat the arguments to the bitwise functions
+as unsigned integers.  For this reason, negative arguments produce a
+fatal error.
+
+In normal operation, for all of these functions, first the
+double-precision floating-point value is converted to the widest C
+unsigned integer type, then the bitwise operation is performed.  If the
+result cannot be represented exactly as a C @code{double}, leading
+nonzero bits are removed one by one until it can be represented exactly.
+The result is then converted back into a C @code{double}.@footnote{If you don't
+understand this paragraph, the upshot is that @command{gawk} can only
+store a particular range of integer values; numbers outside that range
+are reduced to fit within the range.}
+
+However, when using arbitrary precision arithmetic with the @option{-M}
+option (@pxref{Arbitrary Precision Arithmetic}), the results may differ.
+This is particularly noticeable with the @code{compl()} function:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print compl(42) @}'}
+@print{} 9007199254740949
+$ @kbd{gawk -M 'BEGIN @{ print compl(42) @}'}
+@print{} -43
+@end example
+
+What's going on becomes clear when printing the results
+in hexadecimal:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "%#x\n", compl(42) @}'}
+@print{} 0x1fffffffffffd5
+$ @kbd{gawk -M 'BEGIN @{ printf "%#x\n", compl(42) @}'}
+@print{} 0xffffffffffffffd5
+@end example
+
+When using the @option{-M} option, under the hood, @command{gawk} uses
+GNU MP arbitrary precision integers which have at least 64 bits of precision.
+When not using @option{-M}, @command{gawk} stores integral values in
+regular double-precision floating point, which only maintain 53 bits of
+precision.  Furthermore, the GNU MP library treats (or at least seems to treat)
+the leading bit as a sign bit; thus the result with @option{-M} in this case is
+a negative number.
+
+In short, using @command{gawk} for any but the simplest kind of bitwise
+operations is probably a bad idea; caveat emptor!
+
+@end cartouche
+@end ifnotdocbook
+
+@node Type Functions
+@subsection Getting Type Information
+
+@command{gawk} provides two functions that let you distinguish
+the type of a variable.
+This is necessary for writing code
+that traverses every element of an array of arrays
+(@pxref{Arrays of Arrays}), and in other contexts.
+
+@table @code
+@cindexgawkfunc{isarray}
+@cindex scalar or array
+@item isarray(@var{x})
+Return a true value if @var{x} is an array. Otherwise, return false.
+
+@cindexgawkfunc{typeof}
+@cindex variable type
+@cindex type, of variable
+@item typeof(@var{x})
+Return one of the following strings, depending upon the type of @var{x}:
+
+@c nested table
+@table @code
+@item "array"
+@var{x} is an array.
+
+@item "regexp"
+@var{x} is a strongly typed regexp (@pxref{Strong Regexp Constants}).
+
+@item "number"
+@var{x} is a number.
+
+@item "string"
+@var{x} is a string.
+
+@item "strnum"
+@var{x} is a number that started life as user input, such as a field or
+the result of calling @code{split()}. (I.e., @var{x} has the strnum
+attribute; @pxref{Variable Typing}.)
+
+@item "unassigned"
+@var{x} is a scalar variable that has not been assigned a value yet.
+For example:
+
+@example
+BEGIN @{
+    # creates a[1] but it has no assigned value
+    a[1]
+    print typeof(a[1])  # unassigned
+@}
+@end example
+
+@item "untyped"
+@var{x} has not yet been used yet at all; it can become a scalar or an
+array.  The typing could even conceivably differ from run to run of
+the same program! For example:
+
+@example
+BEGIN @{
+    print "initially, typeof(v) = ", typeof(v)
+
+    if ("FOO" in ENVIRON)
+        make_scalar(v)
+    else
+        make_array(v)
+
+    print "typeof(v) =", typeof(v)
+@}
+
+function make_scalar(p,    l) @{ l = p @}
+
+function make_array(p) @{ p[1] = 1 @}
+@end example
+
+@end table
+@end table
+
+@code{isarray()} is meant for use in two circumstances. The first is when
+traversing a multidimensional array: you can test if an element is itself
+an array or not.  The second is inside the body of a user-defined function
+(not discussed yet; @pxref{User-defined}), to test if a parameter is an
+array or not.
+
+@quotation NOTE
+While you can use @code{isarray()} at the global level to test variables,
+doing so makes no sense. Because @emph{you} are the one writing the
+program, @emph{you} are supposed to know if your variables are arrays
+or not.
+@end quotation
+
+The @code{typeof()} function is general; it allows you to determine
+if a variable or function parameter is a scalar (number, string,
+or strongly typed regexp) or an array.
+
+Normally, passing a variable that has never been used to a built-in
+function causes it to become a scalar variable (unassigned).
+However, @code{isarray()} and @code{typeof()} are different; they do
+not change their arguments from untyped to unassigned.
+
+@node I18N Functions
+@subsection String-Translation Functions
+@cindex @command{gawk}, string-translation functions
+@cindex functions, string-translation
+@cindex string-translation functions
+@cindex internationalization
+@cindex @command{awk} programs, internationalizing
+
+@command{gawk} provides facilities for internationalizing @command{awk} programs.
+These include the functions described in the following list.
+The descriptions here are purposely brief.
+@xref{Internationalization},
+for the full story.
+Optional parameters are enclosed in square brackets ([ ]):
+
+@table @asis
+@cindexgawkfunc{bindtextdomain}
+@cindex set directory of message catalogs
+@item @code{bindtextdomain(@var{directory}} [@code{,} @var{domain}]@code{)}
+Set the directory in which
+@command{gawk} will look for message translation files, in case they
+will not or cannot be placed in the ``standard'' locations
+(e.g., during testing).
+It returns the directory in which @var{domain} is ``bound.''
+
+The default @var{domain} is the value of @code{TEXTDOMAIN}.
+If @var{directory} is the null string (@code{""}), then
+@code{bindtextdomain()} returns the current binding for the
+given @var{domain}.
+
+@cindexgawkfunc{dcgettext}
+@cindex translate string
+@item @code{dcgettext(@var{string}} [@code{,} @var{domain} [@code{,} @var{category}] ]@code{)}
+Return the translation of @var{string} in
+text domain @var{domain} for locale category @var{category}.
+The default value for @var{domain} is the current value of @code{TEXTDOMAIN}.
+The default value for @var{category} is @code{"LC_MESSAGES"}.
+
+@cindexgawkfunc{dcngettext}
+@item @code{dcngettext(@var{string1}, @var{string2}, @var{number}} [@code{,} @var{domain} [@code{,} @var{category}] ]@code{)}
+Return the plural form used for @var{number} of the
+translation of @var{string1} and @var{string2} in text domain
+@var{domain} for locale category @var{category}. @var{string1} is the
+English singular variant of a message, and @var{string2} is the English plural
+variant of the same message.
+The default value for @var{domain} is the current value of @code{TEXTDOMAIN}.
+The default value for @var{category} is @code{"LC_MESSAGES"}.
+@end table
+
+@node User-defined
+@section User-Defined Functions
+
+@cindex user-defined functions
+@cindex functions, user-defined
+Complicated @command{awk} programs can often be simplified by defining
+your own functions.  User-defined functions can be called just like
+built-in ones (@pxref{Function Calls}), but it is up to you to define
+them (i.e., to tell @command{awk} what they should do).
+
+@menu
+* Definition Syntax::           How to write definitions and what they mean.
+* Function Example::            An example function definition and what it
+                                does.
+* Function Calling::            Calling user-defined functions.
+* Return Statement::            Specifying the value a function returns.
+* Dynamic Typing::              How variable types can change at runtime.
+@end menu
+
+@node Definition Syntax
+@subsection Function Definition Syntax
+
+@quotation
+@i{It's entirely fair to say that the awk syntax for local
+variable definitions is appallingly awful.}
+@author Brian Kernighan
+@end quotation
+
+@cindex functions, defining
+Definitions of functions can appear anywhere between the rules of an
+@command{awk} program.  Thus, the general form of an @command{awk} program is
+extended to include sequences of rules @emph{and} user-defined function
+definitions.
+There is no need to put the definition of a function
+before all uses of the function.  This is because @command{awk} reads the
+entire program before starting to execute any of it.
+
+The definition of a function named @var{name} looks like this:
+
+@display
+@group
+@code{function} @var{name}@code{(}[@var{parameter-list}]@code{)}
+@code{@{}
+     @var{body-of-function}
+@code{@}}
+@end group
+@end display
+
+@cindex names, functions
+@cindex functions, names of
+@cindex namespace issues, functions
+@noindent
+Here, @var{name} is the name of the function to define.  A valid function
+name is like a valid variable name: a sequence of letters, digits, and
+underscores that doesn't start with a digit.
+Here too, only the 52 upper- and lowercase English letters may
+be used in a function name.
+Within a single @command{awk} program, any particular name can only be
+used as a variable, array, or function.
+
+@var{parameter-list} is an optional list of the function's arguments and local
+variable names, separated by commas.  When the function is called,
+the argument names are used to hold the argument values given in
+the call.
+
+A function cannot have two parameters with the same name, nor may it
+have a parameter with the same name as the function itself.
+
+@quotation CAUTION
+According to the POSIX standard, function parameters
+cannot have the same name as one of the special predefined variables
+(@pxref{Built-in Variables}), nor may a function parameter have the
+same name as another function.
+
+Not all versions of @command{awk} enforce
+these restrictions.
+@command{gawk} always enforces the first restriction.
+With @option{--posix} (@pxref{Options}),
+it also enforces the second restriction.
+@end quotation
+
+Local variables act like the empty string if referenced where a string
+value is required, and like zero if referenced where a numeric value
+is required. This is the same as the behavior of regular variables that have never been
+assigned a value.  (There is more to understand about local variables;
+@pxref{Dynamic Typing}.)
+
+The @var{body-of-function} consists of @command{awk} statements.  It is the
+most important part of the definition, because it says what the function
+should actually @emph{do}.  The argument names exist to give the body a
+way to talk about the arguments; local variables exist to give the body
+places to keep temporary values.
+
+Argument names are not distinguished syntactically from local variable
+names. Instead, the number of arguments supplied when the function is
+called determines how many argument variables there are.  Thus, if three
+argument values are given, the first three names in @var{parameter-list}
+are arguments and the rest are local variables.
+
+It follows that if the number of arguments is not the same in all calls
+to the function, some of the names in @var{parameter-list} may be
+arguments on some occasions and local variables on others.  Another
+way to think of this is that omitted arguments default to the
+null string.
+
+@cindex programming conventions, functions, writing
+Usually when you write a function, you know how many names you intend to
+use for arguments and how many you intend to use as local variables.  It is
+conventional to place some extra space between the arguments and
+the local variables, in order to document how your function is supposed to be used.
+
+@cindex variables, shadowing
+@cindex shadowing of variable values
+During execution of the function body, the arguments and local variable
+values hide, or @dfn{shadow}, any variables of the same names used in the
+rest of the program.  The shadowed variables are not accessible in the
+function definition, because there is no way to name them while their
+names have been taken away for the arguments and local variables.  All other variables
+used in the @command{awk} program can be referenced or set normally in the
+function's body.
+
+The arguments and local variables last only as long as the function body
+is executing.  Once the body finishes, you can once again access the
+variables that were shadowed while the function was running.
+
+@cindex recursive functions
+@cindex functions, recursive
+The function body can contain expressions that call functions.  They
+can even call this function, either directly or by way of another
+function.  When this happens, we say the function is @dfn{recursive}.
+The act of a function calling itself is called @dfn{recursion}.
+
+All the built-in functions return a value to their caller.
+User-defined functions can do so also, using the @code{return} statement,
+which is described in detail in @ref{Return Statement}.
+Many of the subsequent examples in this @value{SECTION} use
+the @code{return} statement.
+
+@cindex common extensions, @code{func} keyword
+@cindex extensions, common@comma{} @code{func} keyword
+@c @cindex @command{awk} language, POSIX version
+@c @cindex POSIX @command{awk}
+@cindex POSIX @command{awk}, @code{function} keyword in
+In many @command{awk} implementations, including @command{gawk},
+the keyword @code{function} may be
+abbreviated @code{func}. @value{COMMONEXT}
+However, POSIX only specifies the use of
+the keyword @code{function}.  This actually has some practical implications.
+If @command{gawk} is in POSIX-compatibility mode
+(@pxref{Options}), then the following
+statement does @emph{not} define a function:
+
+@example
+func foo() @{ a = sqrt($1) ; print a @}
+@end example
+
+@noindent
+Instead, it defines a rule that, for each record, concatenates the value
+of the variable @samp{func} with the return value of the function @samp{foo}.
+If the resulting string is non-null, the action is executed.
+This is probably not what is desired.  (@command{awk} accepts this input as
+syntactically valid, because functions may be used before they are defined
+in @command{awk} programs.@footnote{This program won't actually run,
+because @code{foo()} is undefined.})
+
+@cindex portability, functions@comma{} defining
+To ensure that your @command{awk} programs are portable, always use the
+keyword @code{function} when defining a function.
+
+@node Function Example
+@subsection Function Definition Examples
+@cindex function definition example
+
+Here is an example of a user-defined function, called @code{myprint()}, that
+takes a number and prints it in a specific format:
+
+@example
+function myprint(num)
+@{
+     printf "%6.3g\n", num
+@}
+@end example
+
+@noindent
+To illustrate, here is an @command{awk} rule that uses our @code{myprint()}
+function:
+
+@example
+$3 > 0     @{ myprint($3) @}
+@end example
+
+@noindent
+This program prints, in our special format, all the third fields that
+contain a positive number in our input.  Therefore, when given the following input:
+
+@example
+ 1.2   3.4    5.6   7.8
+ 9.10 11.12 -13.14 15.16
+17.18 19.20  21.22 23.24
+@end example
+
+@noindent
+this program, using our function to format the results, prints:
+
+@example
+   5.6
+  21.2
+@end example
+
+This function deletes all the elements in an array (recall that the
+extra whitespace signifies the start of the local variable list):
+
+@example
+@group
+function delarray(a,    i)
+@{
+    for (i in a)
+        delete a[i]
+@}
+@end group
+@end example
+
+When working with arrays, it is often necessary to delete all the elements
+in an array and start over with a new list of elements
+(@pxref{Delete}).
+Instead of having
+to repeat this loop everywhere that you need to clear out
+an array, your program can just call @code{delarray()}.
+(This guarantees portability.  The use of @samp{delete @var{array}} to delete
+the contents of an entire array is a relatively recent@footnote{Late in 2012.}
+addition to the POSIX standard.)
+
+The following is an example of a recursive function.  It takes a string
+as an input parameter and returns the string in reverse order.
+Recursive functions must always have a test that stops the recursion.
+In this case, the recursion terminates when the input string is
+already empty:
+
+@c 8/2014: Thanks to Mike Brennan for the improved formulation
+@cindex @code{rev()} user-defined function
+@example
+function rev(str)
+@{
+    if (str == "")
+        return ""
+
+    return (rev(substr(str, 2)) substr(str, 1, 1))
+@}
+@end example
+
+If this function is in a file named @file{rev.awk}, it can be tested
+this way:
+
+@example
+$ @kbd{echo "Don't Panic!" |}
+> @kbd{gawk -e '@{ print rev($0) @}' -f rev.awk}
+@print{} !cinaP t'noD
+@end example
+
+The C @code{ctime()} function takes a timestamp and returns it as a string,
+formatted in a well-known fashion.
+The following example uses the built-in @code{strftime()} function
+(@pxref{Time Functions})
+to create an @command{awk} version of @code{ctime()}:
+
+@cindex @code{ctime()} user-defined function
+@example
+@c file eg/lib/ctime.awk
+# ctime.awk
+#
+# awk version of C ctime(3) function
+
+function ctime(ts,    format)
+@{
+    format = "%a %b %e %H:%M:%S %Z %Y"
+
+    if (ts == 0)
+        ts = systime()       # use current time as default
+    return strftime(format, ts)
+@}
+@c endfile
+@end example
+
+You might think that @code{ctime()} could use @code{PROCINFO["strftime"]}
+for its format string. That would be a mistake, because @code{ctime()} is
+supposed to return the time formatted in a standard fashion, and user-level
+code could have changed @code{PROCINFO["strftime"]}.
+
+@node Function Calling
+@subsection Calling User-Defined Functions
+
+@cindex functions, user-defined, calling
+@dfn{Calling a function} means causing the function to run and do its job.
+A function call is an expression and its value is the value returned by
+the function.
+
+@menu
+* Calling A Function::          Don't use spaces.
+* Variable Scope::              Controlling variable scope.
+* Pass By Value/Reference::     Passing parameters.
+* Function Caveats::            Other points to know about functions.
+@end menu
+
+@node Calling A Function
+@subsubsection Writing a Function Call
+
+A function call consists of the function name followed by the arguments
+in parentheses.  @command{awk} expressions are what you write in the
+call for the arguments.  Each time the call is executed, these
+expressions are evaluated, and the values become the actual arguments.  For
+example, here is a call to @code{foo()} with three arguments (the first
+being a string concatenation):
+
+@example
+foo(x y, "lose", 4 * z)
+@end example
+
+@quotation CAUTION
+Whitespace characters (spaces and TABs) are not allowed
+between the function name and the opening parenthesis of the argument list.
+If you write whitespace by mistake, @command{awk} might think that you mean
+to concatenate a variable with an expression in parentheses.  However, it
+notices that you used a function name and not a variable name, and reports
+an error.
+@end quotation
+
+@node Variable Scope
+@subsubsection Controlling Variable Scope
+
+@cindex local variables, in a function
+@cindex variables, local to a function
+Unlike in many languages,
+there is no way to make a variable local to a @code{@{} @dots{} @code{@}} block in
+@command{awk}, but you can make a variable local to a function. It is
+good practice to do so whenever a variable is needed only in that
+function.
+
+To make a variable local to a function, simply declare the variable as
+an argument after the actual function arguments
+(@pxref{Definition Syntax}).
+Look at the following example, where variable
+@code{i} is a global variable used by both functions @code{foo()} and
+@code{bar()}:
+
+@example
+function bar()
+@{
+    for (i = 0; i < 3; i++)
+        print "bar's i=" i
+@}
+
+function foo(j)
+@{
+    i = j + 1
+    print "foo's i=" i
+    bar()
+    print "foo's i=" i
+@}
+
+BEGIN @{
+      i = 10
+      print "top's i=" i
+      foo(0)
+      print "top's i=" i
+@}
+@end example
+
+Running this script produces the following, because the @code{i} in
+functions @code{foo()} and @code{bar()} and at the top level refer to the same
+variable instance:
+
+@example
+top's i=10
+foo's i=1
+bar's i=0
+bar's i=1
+bar's i=2
+foo's i=3
+top's i=3
+@end example
+
+If you want @code{i} to be local to both @code{foo()} and @code{bar()}, do as
+follows (the extra space before @code{i} is a coding convention to
+indicate that @code{i} is a local variable, not an argument):
+
+@example
+function bar(    i)
+@{
+    for (i = 0; i < 3; i++)
+        print "bar's i=" i
+@}
+
+function foo(j,    i)
+@{
+    i = j + 1
+    print "foo's i=" i
+    bar()
+    print "foo's i=" i
+@}
+
+BEGIN @{
+      i = 10
+      print "top's i=" i
+      foo(0)
+      print "top's i=" i
+@}
+@end example
+
+Running the corrected script produces the following:
+
+@example
+top's i=10
+foo's i=1
+bar's i=0
+bar's i=1
+bar's i=2
+foo's i=1
+top's i=10
+@end example
+
+Besides scalar values (strings and numbers), you may also have
+local arrays.  By using a parameter name as an array, @command{awk}
+treats it as an array, and it is local to the function.
+In addition, recursive calls create new arrays.
+Consider this example:
+
+@example
+@group
+function some_func(p1,      a)
+@{
+    if (p1++ > 3)
+        return
+@end group
+
+    a[p1] = p1
+
+    some_func(p1)
+
+    printf("At level %d, index %d %s found in a\n",
+         p1, (p1 - 1), (p1 - 1) in a ? "is" : "is not")
+    printf("At level %d, index %d %s found in a\n",
+         p1, p1, p1 in a ? "is" : "is not")
+    print ""
+@}
+
+BEGIN @{
+    some_func(1)
+@}
+@end example
+
+When run, this program produces the following output:
+
+@example
+At level 4, index 3 is not found in a
+At level 4, index 4 is found in a
+
+At level 3, index 2 is not found in a
+At level 3, index 3 is found in a
+
+At level 2, index 1 is not found in a
+At level 2, index 2 is found in a
+@end example
+
+@node Pass By Value/Reference
+@subsubsection Passing Function Arguments by Value Or by Reference
+
+In @command{awk}, when you declare a function, there is no way to
+declare explicitly whether the arguments are passed @dfn{by value} or
+@dfn{by reference}.
+
+Instead, the passing convention is determined at runtime when
+the function is called, according to the following rule:
+if the argument is an array variable, then it is passed by reference.
+Otherwise, the argument is passed by value.
+
+@cindex call by value
+Passing an argument by value means that when a function is called, it
+is given a @emph{copy} of the value of this argument.
+The caller may use a variable as the expression for the argument, but
+the called function does not know this---it only knows what value the
+argument had.  For example, if you write the following code:
+
+@example
+foo = "bar"
+z = myfunc(foo)
+@end example
+
+@noindent
+then you should not think of the argument to @code{myfunc()} as being
+``the variable @code{foo}.''  Instead, think of the argument as the
+string value @code{"bar"}.
+If the function @code{myfunc()} alters the values of its local variables,
+this has no effect on any other variables.  Thus, if @code{myfunc()}
+does this:
+
+@example
+@group
+function myfunc(str)
+@{
+   print str
+   str = "zzz"
+   print str
+@}
+@end group
+@end example
+
+@noindent
+to change its first argument variable @code{str}, it does @emph{not}
+change the value of @code{foo} in the caller.  The role of @code{foo} in
+calling @code{myfunc()} ended when its value (@code{"bar"}) was computed.
+If @code{str} also exists outside of @code{myfunc()}, the function body
+cannot alter this outer value, because it is shadowed during the
+execution of @code{myfunc()} and cannot be seen or changed from there.
+
+@cindex call by reference
+@cindex arrays, as parameters to functions
+@cindex functions, arrays as parameters to
+However, when arrays are the parameters to functions, they are @emph{not}
+copied.  Instead, the array itself is made available for direct manipulation
+by the function.  This is usually termed @dfn{call by reference}.
+Changes made to an array parameter inside the body of a function @emph{are}
+visible outside that function.
+
+@quotation NOTE
+Changing an array parameter inside a function
+can be very dangerous if you do not watch what you are doing.
+For example:
+
+@example
+function changeit(array, ind, nvalue)
+@{
+     array[ind] = nvalue
+@}
+
+BEGIN @{
+    a[1] = 1; a[2] = 2; a[3] = 3
+    changeit(a, 2, "two")
+    printf "a[1] = %s, a[2] = %s, a[3] = %s\n",
+            a[1], a[2], a[3]
+@}
+@end example
+
+@noindent
+prints @samp{a[1] = 1, a[2] = two, a[3] = 3}, because
+@code{changeit()} stores @code{"two"} in the second element of @code{a}.
+@end quotation
+
+@node Function Caveats
+@subsubsection Other Points About Calling Functions
+
+@cindex undefined functions
+@cindex functions, undefined
+Some @command{awk} implementations allow you to call a function that
+has not been defined. They only report a problem at runtime, when the
+program actually tries to call the function. For example:
+
+@example
+BEGIN @{
+    if (0)
+        foo()
+    else
+        bar()
+@}
+function bar() @{ @dots{} @}
+# note that `foo' is not defined
+@end example
+
+@noindent
+Because the @samp{if} statement will never be true, it is not really a
+problem that @code{foo()} has not been defined.  Usually, though, it is a
+problem if a program calls an undefined function.
+
+@cindex lint checking, undefined functions
+If @option{--lint} is specified
+(@pxref{Options}),
+@command{gawk} reports calls to undefined functions.
+
+@cindex portability, @code{next} statement in user-defined functions
+Some @command{awk} implementations generate a runtime
+error if you use either the @code{next} statement
+or the @code{nextfile} statement
+(@pxref{Next Statement}, and
+@ifdocbook
+@ref{Nextfile Statement})
+@end ifdocbook
+@ifnotdocbook
+@pxref{Nextfile Statement})
+@end ifnotdocbook
+inside a user-defined function.
+@command{gawk} does not have this limitation.
+
+You can call a function and pass it more parameters than it was declared
+with, like so:
+
+@example
+function foo(p1, p2)
+@{
+    @dots{}
+@}
+
+BEGIN @{
+    foo(1, 2, 3, 4)
+@}
+@end example
+
+Doing so is bad practice, however.  The called function cannot do
+anything with the additional values being passed to it, so @command{awk}
+evaluates the expressions but then just throws them away.
+
+More importantly, such a call is confusing for whoever will next read your
+program.@footnote{Said person might even be you, sometime in the future,
+at which point you will wonder, ``what was I thinking?!?''} Function
+parameters generally are input items that influence the computation
+performed by the function.  Calling a function with more parameters than
+it accepts gives the false impression that those values are important
+to the function, when in fact they are not.
+
+Because this is such a bad practice, @command{gawk} @emph{unconditionally}
+issues a warning whenever it executes such a function call.  (If you
+don't like the warning, fix your code!  It's incorrect, after all.)
+
+@node Return Statement
+@subsection The @code{return} Statement
+@cindex @code{return} statement@comma{} user-defined functions
+
+As seen in several earlier examples,
+the body of a user-defined function can contain a @code{return} statement.
+This statement returns control to the calling part of the @command{awk} program.  It
+can also be used to return a value for use in the rest of the @command{awk}
+program.  It looks like this:
+
+@display
+@code{return} [@var{expression}]
+@end display
+
+The @var{expression} part is optional.
+Due most likely to an oversight, POSIX does not define what the return
+value is if you omit the @var{expression}.  Technically speaking, this
+makes the returned value undefined, and therefore, unpredictable.
+In practice, though, all versions of @command{awk} simply return the
+null string, which acts like zero if used in a numeric context.
+
+A @code{return} statement without an @var{expression} is assumed at the end of
+every function definition.  So, if control reaches the end of the function
+body, then technically the function returns an unpredictable value.
+In practice, it returns the empty string.  @command{awk}
+does @emph{not} warn you if you use the return value of such a function.
+
+Sometimes, you want to write a function for what it does, not for
+what it returns.  Such a function corresponds to a @code{void} function
+in C, C++, or Java, or to a @code{procedure} in Ada.  Thus, it may be appropriate to not
+return any value; simply bear in mind that you should not be using the
+return value of such a function.
+
+The following is an example of a user-defined function that returns a value
+for the largest number among the elements of an array:
+
+@example
+function maxelt(vec,   i, ret)
+@{
+     for (i in vec) @{
+          if (ret == "" || vec[i] > ret)
+               ret = vec[i]
+     @}
+     return ret
+@}
+@end example
+
+@cindex programming conventions, function parameters
+@noindent
+You call @code{maxelt()} with one argument, which is an array name.  The local
+variables @code{i} and @code{ret} are not intended to be arguments;
+there is nothing to stop you from passing more than one argument
+to @code{maxelt()} but the results would be strange.  The extra space before
+@code{i} in the function parameter list indicates that @code{i} and
+@code{ret} are local variables.
+You should follow this convention when defining functions.
+
+The following program uses the @code{maxelt()} function.  It loads an
+array, calls @code{maxelt()}, and then reports the maximum number in that
+array:
+
+@example
+function maxelt(vec,   i, ret)
+@{
+     for (i in vec) @{
+          if (ret == "" || vec[i] > ret)
+               ret = vec[i]
+     @}
+     return ret
+@}
+
+@group
+# Load all fields of each record into nums.
+@{
+     for(i = 1; i <= NF; i++)
+          nums[NR, i] = $i
+@}
+@end group
+
+END @{
+     print maxelt(nums)
+@}
+@end example
+
+Given the following input:
+
+@example
+ 1 5 23 8 16
+44 3 5 2 8 26
+256 291 1396 2962 100
+-6 467 998 1101
+99385 11 0 225
+@end example
+
+@noindent
+the program reports (predictably) that 99,385 is the largest value
+in the array.
+
+@node Dynamic Typing
+@subsection Functions and Their Effects on Variable Typing
+
+@command{awk} is a very fluid language.
+It is possible that @command{awk} can't tell if an identifier
+represents a scalar variable or an array until runtime.
+Here is an annotated sample program:
+
+@example
+function foo(a)
+@{
+    a[1] = 1   # parameter is an array
+@}
+
+BEGIN @{
+    b = 1
+    foo(b)  # invalid: fatal type mismatch
+
+    foo(x)  # x uninitialized, becomes an array dynamically
+    x = 1   # now not allowed, runtime error
+@}
+@end example
+
+In this example, the first call to @code{foo()} generates
+a fatal error, so @command{awk} will not report the second
+error. If you comment out that call, though, then @command{awk}
+does report the second error.
+
+Usually, such things aren't a big issue, but it's worth
+being aware of them.
+
+@node Indirect Calls
+@section Indirect Function Calls
+
+@cindex indirect function calls
+@cindex function calls, indirect
+@cindex function pointers
+@cindex pointers to functions
+@cindex differences in @command{awk} and @command{gawk}, indirect function calls
+
+This section describes an advanced, @command{gawk}-specific extension.
+
+Often, you may wish to defer the choice of function to call until runtime.
+For example, you may have different kinds of records, each of which
+should be processed differently.
+
+Normally, you would have to use a series of @code{if}-@code{else}
+statements to decide which function to call.  By using @dfn{indirect}
+function calls, you can specify the name of the function to call as a
+string variable, and then call the function.  Let's look at an example.
+
+Suppose you have a file with your test scores for the classes you
+are taking, and
+you wish to get the sum and the average of
+your test scores.
+The first field is the class name. The following fields
+are the functions to call to process the data, up to a ``marker''
+field @samp{data:}.  Following the marker, to the end of the record,
+are the various numeric test scores.
+
+Here is the initial file:
+
+@example
+@c file eg/data/class_data1
+Biology_101 sum average data: 87.0 92.4 78.5 94.9
+Chemistry_305 sum average data: 75.2 98.3 94.7 88.2
+English_401 sum average data: 100.0 95.6 87.1 93.4
+@c endfile
+@end example
+
+To process the data, you might write initially:
+
+@example
+@{
+    class = $1
+    for (i = 2; $i != "data:"; i++) @{
+        if ($i == "sum")
+            sum()   # processes the whole record
+        else if ($i == "average")
+            average()
+        @dots{}           # and so on
+    @}
+@}
+@end example
+
+@noindent
+This style of programming works, but can be awkward.  With @dfn{indirect}
+function calls, you tell @command{gawk} to use the @emph{value} of a
+variable as the @emph{name} of the function to call.
+
+@cindex @code{@@}-notation for indirect function calls
+@cindex indirect function calls, @code{@@}-notation
+@cindex function calls, indirect, @code{@@}-notation for
+The syntax is similar to that of a regular function call: an identifier
+immediately followed by an opening parenthesis, any arguments, and then
+a closing parenthesis, with the addition of a leading @samp{@@}
+character:
+
+@example
+the_func = "sum"
+result = @@the_func()   # calls the sum() function
+@end example
+
+Here is a full program that processes the previously shown data,
+using indirect function calls:
+
+@example
+@c file eg/prog/indirectcall.awk
+# indirectcall.awk --- Demonstrate indirect function calls
+@c endfile
+@ignore
+@c file eg/prog/indirectcall.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# January 2009
+@c endfile
+@end ignore
+
+@c file eg/prog/indirectcall.awk
+# average --- return the average of the values in fields $first - $last
+
+function average(first, last,   sum, i)
+@{
+    sum = 0;
+    for (i = first; i <= last; i++)
+        sum += $i
+
+    return sum / (last - first + 1)
+@}
+
+# sum --- return the sum of the values in fields $first - $last
+
+function sum(first, last,   ret, i)
+@{
+    ret = 0;
+    for (i = first; i <= last; i++)
+        ret += $i
+
+    return ret
+@}
+@c endfile
+@end example
+
+These two functions expect to work on fields; thus, the parameters
+@code{first} and @code{last} indicate where in the fields to start and end.
+Otherwise, they perform the expected computations and are not unusual:
+
+@example
+@c file eg/prog/indirectcall.awk
+# For each record, print the class name and the requested statistics
+@{
+    class_name = $1
+    gsub(/_/, " ", class_name)  # Replace _ with spaces
+
+    # find start
+    for (i = 1; i <= NF; i++) @{
+        if ($i == "data:") @{
+            start = i + 1
+            break
+        @}
+    @}
+
+    printf("%s:\n", class_name)
+    for (i = 2; $i != "data:"; i++) @{
+        the_function = $i
+        printf("\t%s: <%s>\n", $i, @@the_function(start, NF) "")
+    @}
+    print ""
+@}
+@c endfile
+@end example
+
+This is the main processing for each record. It prints the class name (with
+underscores replaced with spaces). It then finds the start of the actual data,
+saving it in @code{start}.
+The last part of the code loops through each function name (from @code{$2} up to
+the marker, @samp{data:}), calling the function named by the field. The indirect
+function call itself occurs as a parameter in the call to @code{printf}.
+(The @code{printf} format string uses @samp{%s} as the format specifier so that we
+can use functions that return strings, as well as numbers. Note that the result
+from the indirect call is concatenated with the empty string, in order to force
+it to be a string value.)
+
+Here is the result of running the program:
+
+@example
+$ @kbd{gawk -f indirectcall.awk class_data1}
+@print{} Biology 101:
+@print{}     sum: <352.8>
+@print{}     average: <88.2>
+@print{}
+@print{} Chemistry 305:
+@print{}     sum: <356.4>
+@print{}     average: <89.1>
+@print{}
+@print{} English 401:
+@print{}     sum: <376.1>
+@print{}     average: <94.025>
+@end example
+
+The ability to use indirect function calls is more powerful than you may
+think at first.  The C and C++ languages provide ``function pointers,'' which
+are a mechanism for calling a function chosen at runtime.  One of the most
+well-known uses of this ability is the C @code{qsort()} function, which sorts
+an array using the famous ``quicksort'' algorithm
+(see @uref{https://en.wikipedia.org/wiki/Quicksort, the Wikipedia article}
+for more information).  To use this function, you supply a pointer to a comparison
+function.  This mechanism allows you to sort arbitrary data in an arbitrary
+fashion.
+
+We can do something similar using @command{gawk}, like this:
+
+@example
+@c file eg/lib/quicksort.awk
+# quicksort.awk --- Quicksort algorithm, with user-supplied
+#                   comparison function
+@c endfile
+@ignore
+@c file eg/lib/quicksort.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# January 2009
+
+@c endfile
+@end ignore
+@c file eg/lib/quicksort.awk
+
+# quicksort --- C.A.R. Hoare's quicksort algorithm. See Wikipedia
+#               or almost any algorithms or computer science text.
+@c endfile
+@ignore
+@c file eg/lib/quicksort.awk
+#
+# Adapted from K&R-II, page 110
+@c endfile
+@end ignore
+@c file eg/lib/quicksort.awk
+
+function quicksort(data, left, right, less_than,    i, last)
+@{
+    if (left >= right)  # do nothing if array contains fewer
+        return          # than two elements
+
+    quicksort_swap(data, left, int((left + right) / 2))
+    last = left
+    for (i = left + 1; i <= right; i++)
+        if (@@less_than(data[i], data[left]))
+            quicksort_swap(data, ++last, i)
+    quicksort_swap(data, left, last)
+    quicksort(data, left, last - 1, less_than)
+    quicksort(data, last + 1, right, less_than)
+@}
+
+# quicksort_swap --- helper function for quicksort, should really be inline
+
+function quicksort_swap(data, i, j,      temp)
+@{
+    temp = data[i]
+    data[i] = data[j]
+    data[j] = temp
+@}
+@c endfile
+@end example
+
+The @code{quicksort()} function receives the @code{data} array, the starting and ending
+indices to sort (@code{left} and @code{right}), and the name of a function that
+performs a ``less than'' comparison.  It then implements the quicksort algorithm.
+
+To make use of the sorting function, we return to our previous example. The
+first thing to do is write some comparison functions:
+
+@example
+@c file eg/prog/indirectcall.awk
+@group
+# num_lt --- do a numeric less than comparison
+
+function num_lt(left, right)
+@{
+    return ((left + 0) < (right + 0))
+@}
+@end group
+
+# num_ge --- do a numeric greater than or equal to comparison
+
+function num_ge(left, right)
+@{
+    return ((left + 0) >= (right + 0))
+@}
+@c endfile
+@end example
+
+The @code{num_ge()} function is needed to perform a descending sort; when used
+to perform a ``less than'' test, it actually does the opposite (greater than
+or equal to), which yields data sorted in descending order.
+
+Next comes a sorting function.  It is parameterized with the starting and
+ending field numbers and the comparison function. It builds an array with
+the data and calls @code{quicksort()} appropriately, and then formats the
+results as a single string:
+
+@example
+@c file eg/prog/indirectcall.awk
+# do_sort --- sort the data according to `compare'
+#             and return it as a string
+
+function do_sort(first, last, compare,      data, i, retval)
+@{
+    delete data
+    for (i = 1; first <= last; first++) @{
+        data[i] = $first
+        i++
+    @}
+
+    quicksort(data, 1, i-1, compare)
+
+    retval = data[1]
+    for (i = 2; i in data; i++)
+        retval = retval " " data[i]
+
+    return retval
+@}
+@c endfile
+@end example
+
+Finally, the two sorting functions call @code{do_sort()}, passing in the
+names of the two comparison functions:
+
+@example
+@c file eg/prog/indirectcall.awk
+@group
+# sort --- sort the data in ascending order and return it as a string
+
+function sort(first, last)
+@{
+    return do_sort(first, last, "num_lt")
+@}
+@end group
+
+@group
+# rsort --- sort the data in descending order and return it as a string
+
+function rsort(first, last)
+@{
+    return do_sort(first, last, "num_ge")
+@}
+@end group
+@c endfile
+@end example
+
+Here is an extended version of the @value{DF}:
+
+@example
+@c file eg/data/class_data2
+Biology_101 sum average sort rsort data: 87.0 92.4 78.5 94.9
+Chemistry_305 sum average sort rsort data: 75.2 98.3 94.7 88.2
+English_401 sum average sort rsort data: 100.0 95.6 87.1 93.4
+@c endfile
+@end example
+
+Finally, here are the results when the enhanced program is run:
+
+@example
+$ @kbd{gawk -f quicksort.awk -f indirectcall.awk class_data2}
+@print{} Biology 101:
+@print{}     sum: <352.8>
+@print{}     average: <88.2>
+@print{}     sort: <78.5 87.0 92.4 94.9>
+@print{}     rsort: <94.9 92.4 87.0 78.5>
+@print{}
+@print{} Chemistry 305:
+@print{}     sum: <356.4>
+@print{}     average: <89.1>
+@print{}     sort: <75.2 88.2 94.7 98.3>
+@print{}     rsort: <98.3 94.7 88.2 75.2>
+@print{}
+@print{} English 401:
+@print{}     sum: <376.1>
+@print{}     average: <94.025>
+@print{}     sort: <87.1 93.4 95.6 100.0>
+@print{}     rsort: <100.0 95.6 93.4 87.1>
+@end example
+
+Another example where indirect functions calls are useful can be found in
+processing arrays. This is described in @ref{Walking Arrays}.
+
+Remember that you must supply a leading @samp{@@} in front of an indirect function call.
+
+Starting with @value{PVERSION} 4.1.2 of @command{gawk}, indirect function
+calls may also be used with built-in functions and with extension functions
+(@pxref{Dynamic Extensions}). There are some limitations when calling
+built-in functions indirectly, as follows.
+
+@itemize @value{BULLET}
+@item
+You cannot pass a regular expression constant to a built-in function
+through an indirect function call.@footnote{This may change in a future
+version; recheck the documentation that comes with your version of
+@command{gawk} to see if it has.} This applies to the @code{sub()},
+@code{gsub()}, @code{gensub()}, @code{match()}, @code{split()} and
+@code{patsplit()} functions.
+
+@item
+If calling @code{sub()} or @code{gsub()}, you may only pass two arguments,
+since those functions are unusual in that they update their third argument.
+This means that @code{$0} will be updated.
+@end itemize
+
+@command{gawk} does its best to make indirect function calls efficient.
+For example, in the following case:
+
+@example
+for (i = 1; i <= n; i++)
+    @@the_func()
+@end example
+
+@noindent
+@command{gawk} looks up the actual function to call only once.
+
+@node Functions Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+@command{awk} provides built-in functions and lets you define your own
+functions.
+
+@item
+POSIX @command{awk} provides three kinds of built-in functions: numeric,
+string, and I/O.  @command{gawk} provides functions that sort arrays, work
+with values representing time, do bit manipulation, determine variable
+type (array versus scalar), and internationalize and localize programs.
+@command{gawk} also provides several extensions to some of standard
+functions, typically in the form of additional arguments.
+
+@item
+Functions accept zero or more arguments and return a value.  The
+expressions that provide the argument values are completely evaluated
+before the function is called. Order of evaluation is not defined.
+The return value can be ignored.
+
+@item
+The handling of backslash in @code{sub()} and @code{gsub()} is not simple.
+It is more straightforward in @command{gawk}'s @code{gensub()} function,
+but that function still requires care in its use.
+
+@item
+User-defined functions provide important capabilities but come with
+some syntactic inelegancies. In a function call, there cannot be any
+space between the function name and the opening left parenthesis of the
+argument list.  Also, there is no provision for local variables, so the
+convention is to add extra parameters, and to separate them visually
+from the real parameters by extra whitespace.
+
+@item
+User-defined functions may call other user-defined (and built-in)
+functions and may call themselves recursively. Function parameters
+``hide'' any global variables of the same names.
+You cannot use the name of a reserved variable (such as @code{ARGC})
+as the name of a parameter in user-defined functions.
+
+@item
+Scalar values are passed to user-defined functions by value. Array
+parameters are passed by reference; any changes made by the function to
+array parameters are thus visible after the function has returned.
+
+@item
+Use the @code{return} statement to return from a user-defined function.
+An optional expression becomes the function's return value.  Only scalar
+values may be returned by a function.
+
+@item
+If a variable that has never been used is passed to a user-defined
+function, how that function treats the variable can set its nature:
+either scalar or array.
+
+@item
+@command{gawk} provides indirect function calls using a special syntax.
+By setting a variable to the name of a function, you can
+determine at runtime what function will be called at that point in the
+program. This is equivalent to function pointers in C and C++.
+
+@end itemize
+
+
+@ifnotinfo
+@part @value{PART2}Problem Solving with @command{awk}
+@end ifnotinfo
+
+@ifdocbook
+Part II shows how to use @command{awk} and @command{gawk} for problem solving.
+There is lots of code here for you to read and learn from.
+It contains the following chapters:
+
+@itemize @value{BULLET}
+@item
+@ref{Library Functions}
+
+@item
+@ref{Sample Programs}
+@end itemize
+@end ifdocbook
+
+@node Library Functions
+@chapter A Library of @command{awk} Functions
+@cindex libraries of @command{awk} functions
+@cindex functions, library
+@cindex functions, user-defined, library of
+
+@ref{User-defined} describes how to write
+your own @command{awk} functions.  Writing functions is important, because
+it allows you to encapsulate algorithms and program tasks in a single
+place.  It simplifies programming, making program development more
+manageable and making programs more readable.
+
+@cindex Kernighan, Brian
+@cindex Plauger, P.J.@:
+In their seminal 1976 book, @cite{Software Tools},@footnote{Sadly, over 35
+years later, many of the lessons taught by this book have yet to be
+learned by a vast number of practicing programmers.} Brian Kernighan
+and P.J.@: Plauger wrote:
+
+@quotation
+Good Programming is not learned from generalities, but by seeing how
+significant programs can be made clean, easy to read, easy to maintain and
+modify, human-engineered, efficient and reliable, by the application of
+common sense and good programming practices.  Careful study and imitation
+of good programs leads to better writing.
+@end quotation
+
+In fact, they felt this idea was so important that they placed this
+statement on the cover of their book.  Because we believe strongly
+that their statement is correct, this @value{CHAPTER} and @ref{Sample
+Programs}, provide a good-sized body of code for you to read and, we hope,
+to learn from.
+
+This @value{CHAPTER} presents a library of useful @command{awk} functions.
+Many of the sample programs presented later in this @value{DOCUMENT}
+use these functions.
+The functions are presented here in a progression from simple to complex.
+
+@cindex Texinfo
+@ref{Extract Program}
+presents a program that you can use to extract the source code for
+these example library functions and programs from the Texinfo source
+for this @value{DOCUMENT}.
+(This has already been done as part of the @command{gawk} distribution.)
+
+@ifclear FOR_PRINT
+If you have written one or more useful, general-purpose @command{awk} functions
+and would like to contribute them to the @command{awk} user community, see
+@ref{How To Contribute}, for more information.
+@end ifclear
+
+@cindex portability, example programs
+The programs in this @value{CHAPTER} and in
+@ref{Sample Programs},
+freely use @command{gawk}-specific features.
+Rewriting these programs for different implementations of @command{awk}
+is pretty straightforward:
+
+@itemize @value{BULLET}
+@item
+Diagnostic error messages are sent to @file{/dev/stderr}.
+Use @samp{| "cat 1>&2"} instead of @samp{> "/dev/stderr"} if your system
+does not have a @file{/dev/stderr}, or if you cannot use @command{gawk}.
+
+@item
+A number of programs use @code{nextfile}
+(@pxref{Nextfile Statement})
+to skip any remaining input in the input file.
+
+@item
+@c 12/2000: Thanks to Nelson Beebe for pointing out the output issue.
+@cindex case sensitivity, example programs
+@cindex @code{IGNORECASE} variable, in example programs
+Finally, some of the programs choose to ignore upper- and lowercase
+distinctions in their input. They do so by assigning one to @code{IGNORECASE}.
+You can achieve almost the same effect@footnote{The effects are
+not identical.  Output of the transformed
+record will be in all lowercase, while @code{IGNORECASE} preserves the original
+contents of the input record.} by adding the following rule to the
+beginning of the program:
+
+@example
+# ignore case
+@{ $0 = tolower($0) @}
+@end example
+
+@noindent
+Also, verify that all regexp and string constants used in
+comparisons use only lowercase letters.
+@end itemize
+
+@menu
+* Library Names::               How to best name private global variables in
+                                library functions.
+* General Functions::           Functions that are of general use.
+* Data File Management::        Functions for managing command-line data
+                                files.
+* Getopt Function::             A function for processing command-line
+                                arguments.
+* Passwd Functions::            Functions for getting user information.
+* Group Functions::             Functions for getting group information.
+* Walking Arrays::              A function to walk arrays of arrays.
+* Library Functions Summary::   Summary of library functions.
+* Library Exercises::           Exercises.
+@end menu
+
+@node Library Names
+@section Naming Library Function Global Variables
+
+@cindex names, arrays/variables
+@cindex names, functions
+@cindex namespace issues
+@cindex @command{awk} programs, documenting
+@cindex documentation, of @command{awk} programs
+Due to the way the @command{awk} language evolved, variables are either
+@dfn{global} (usable by the entire program) or @dfn{local} (usable just by
+a specific function).  There is no intermediate state analogous to
+@code{static} variables in C.
+
+@cindex variables, global, for library functions
+@cindex private variables
+@cindex variables, private
+Library functions often need to have global variables that they can use to
+preserve state information between calls to the function---for example,
+@code{getopt()}'s variable @code{_opti}
+(@pxref{Getopt Function}).
+Such variables are called @dfn{private}, as the only functions that need to
+use them are the ones in the library.
+
+When writing a library function, you should try to choose names for your
+private variables that will not conflict with any variables used by
+either another library function or a user's main program.  For example, a
+name like @code{i} or @code{j} is not a good choice, because user programs
+often use variable names like these for their own purposes.
+
+@cindex programming conventions, private variable names
+The example programs shown in this @value{CHAPTER} all start the names of their
+private variables with an underscore (@samp{_}).  Users generally don't use
+leading underscores in their variable names, so this convention immediately
+decreases the chances that the variable names will be accidentally shared
+with the user's program.
+
+@cindex @code{_} (underscore), in names of private variables
+@cindex underscore (@code{_}), in names of private variables
+In addition, several of the library functions use a prefix that helps
+indicate what function or set of functions use the variables---for example,
+@code{_pw_byname()} in the user database routines
+(@pxref{Passwd Functions}).
+This convention is recommended, as it even further decreases the
+chance of inadvertent conflict among variable names.  Note that this
+convention is used equally well for variable names and for private
+function names.@footnote{Although all the library routines could have
+been rewritten to use this convention, this was not done, in order to
+show how our own @command{awk} programming style has evolved and to
+provide some basis for this discussion.}
+
+As a final note on variable naming, if a function makes global variables
+available for use by a main program, it is a good convention to start those
+variables' names with a capital letter---for
+example, @code{getopt()}'s @code{Opterr} and @code{Optind} variables
+(@pxref{Getopt Function}).
+The leading capital letter indicates that it is global, while the fact that
+the variable name is not all capital letters indicates that the variable is
+not one of @command{awk}'s predefined variables, such as @code{FS}.
+
+@cindex @option{--dump-variables} option, using for library functions
+It is also important that @emph{all} variables in library
+functions that do not need to save state are, in fact, declared
+local.@footnote{@command{gawk}'s @option{--dump-variables} command-line
+option is useful for verifying this.} If this is not done, the variables
+could accidentally be used in the user's program, leading to bugs that
+are very difficult to track down:
+
+@example
+function lib_func(x, y,    l1, l2)
+@{
+    @dots{}
+    # some_var should be local but by oversight is not
+    @var{use variable} some_var
+    @dots{}
+@}
+@end example
+
+@cindex arrays, associative, library functions and
+@cindex libraries of @command{awk} functions, associative arrays and
+@cindex functions, library, associative arrays and
+@cindex Tcl
+A different convention, common in the Tcl community, is to use a single
+associative array to hold the values needed by the library function(s), or
+``package.''  This significantly decreases the number of actual global names
+in use.  For example, the functions described in
+@ref{Passwd Functions}
+might have used array elements @code{@w{PW_data["inited"]}}, @code{@w{PW_data["total"]}},
+@code{@w{PW_data["count"]}}, and @code{@w{PW_data["awklib"]}}, instead of
+@code{@w{_pw_inited}}, @code{@w{_pw_awklib}}, @code{@w{_pw_total}},
+and @code{@w{_pw_count}}.
+
+The conventions presented in this @value{SECTION} are exactly
+that: conventions. You are not required to write your programs this
+way---we merely recommend that you do so.
+
+Beginning with @value{PVERSION} 5.0, @command{gawk} provides
+a powerful mechanism for solving the problems described in this
+section: @dfn{namespaces}.  Namespaces and their use are described
+in detail in @ref{Namespaces}.
+
+@node General Functions
+@section General Programming
+
+This @value{SECTION} presents a number of functions that are of general
+programming use.
+
+@menu
+* Strtonum Function::           A replacement for the built-in
+                                @code{strtonum()} function.
+* Assert Function::             A function for assertions in @command{awk}
+                                programs.
+* Round Function::              A function for rounding if @code{sprintf()}
+                                does not do it correctly.
+* Cliff Random Function::       The Cliff Random Number Generator.
+* Ordinal Functions::           Functions for using characters as numbers and
+                                vice versa.
+* Join Function::               A function to join an array into a string.
+* Getlocaltime Function::       A function to get formatted times.
+* Readfile Function::           A function to read an entire file at once.
+* Shell Quoting::               A function to quote strings for the shell.
+@end menu
+
+@node Strtonum Function
+@subsection Converting Strings to Numbers
+
+The @code{strtonum()} function (@pxref{String Functions})
+is a @command{gawk} extension.  The following function
+provides an implementation for other versions of @command{awk}:
+
+@example
+@c file eg/lib/strtonum.awk
+# mystrtonum --- convert string to number
+
+@c endfile
+@ignore
+@c file eg/lib/strtonum.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# February, 2004
+# Revised June, 2014
+
+@c endfile
+@end ignore
+@c file eg/lib/strtonum.awk
+function mystrtonum(str,        ret, n, i, k, c)
+@{
+    if (str ~ /^0[0-7]*$/) @{
+        # octal
+        n = length(str)
+        ret = 0
+        for (i = 1; i <= n; i++) @{
+            c = substr(str, i, 1)
+            # index() returns 0 if c not in string,
+            # includes c == "0"
+            k = index("1234567", c)
+
+            ret = ret * 8 + k
+        @}
+    @} else if (str ~ /^0[xX][[:xdigit:]]+$/) @{
+        # hexadecimal
+        str = substr(str, 3)    # lop off leading 0x
+        n = length(str)
+        ret = 0
+        for (i = 1; i <= n; i++) @{
+            c = substr(str, i, 1)
+            c = tolower(c)
+            # index() returns 0 if c not in string,
+            # includes c == "0"
+            k = index("123456789abcdef", c)
+
+            ret = ret * 16 + k
+        @}
+    @} else if (str ~ \
+  /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) @{
+        # decimal number, possibly floating point
+        ret = str + 0
+    @} else
+        ret = "NOT-A-NUMBER"
+
+    return ret
+@}
+
+# BEGIN @{     # gawk test harness
+#     a[1] = "25"
+#     a[2] = ".31"
+#     a[3] = "0123"
+#     a[4] = "0xdeadBEEF"
+#     a[5] = "123.45"
+#     a[6] = "1.e3"
+#     a[7] = "1.32"
+#     a[8] = "1.32E2"
+#
+#     for (i = 1; i in a; i++)
+#         print a[i], strtonum(a[i]), mystrtonum(a[i])
+# @}
+@c endfile
+@end example
+
+The function first looks for C-style octal numbers (base 8).
+If the input string matches a regular expression describing octal
+numbers, then @code{mystrtonum()} loops through each character in the
+string.  It sets @code{k} to the index in @code{"1234567"} of the current
+octal digit.
+The return value will either be the same number as the digit, or zero
+if the character is not there, which will be true for a @samp{0}.
+This is safe, because the regexp test in the @code{if} ensures that
+only octal values are converted.
+
+Similar logic applies to the code that checks for and converts a
+hexadecimal value, which starts with @samp{0x} or @samp{0X}.
+The use of @code{tolower()} simplifies the computation for finding
+the correct numeric value for each hexadecimal digit.
+
+Finally, if the string matches the (rather complicated) regexp for a
+regular decimal integer or floating-point number, the computation
+@samp{ret = str + 0} lets @command{awk} convert the value to a
+number.
+
+A commented-out test program is included, so that the function can
+be tested with @command{gawk} and the results compared to the built-in
+@code{strtonum()} function.
+
+@node Assert Function
+@subsection Assertions
+
+@cindex assertions
+@cindex @code{assert()} function (C library)
+@cindex libraries of @command{awk} functions, assertions
+@cindex functions, library, assertions
+@cindex @command{awk} programs, lengthy, assertions
+When writing large programs, it is often useful to know
+that a condition or set of conditions is true.  Before proceeding with a
+particular computation, you make a statement about what you believe to be
+the case.  Such a statement is known as an
+@dfn{assertion}.  The C language provides an @code{<assert.h>} header file
+and corresponding @code{assert()} macro that a programmer can use to make
+assertions.  If an assertion fails, the @code{assert()} macro arranges to
+print a diagnostic message describing the condition that should have
+been true but was not, and then it kills the program.  In C, using
+@code{assert()} looks this:
+
+@example
+@group
+#include <assert.h>
+
+int myfunc(int a, double b)
+@{
+     assert(a <= 5 && b >= 17.1);
+     @dots{}
+@}
+@end group
+@end example
+
+If the assertion fails, the program prints a message similar to this:
+
+@example
+prog.c:5: assertion failed: a <= 5 && b >= 17.1
+@end example
+
+@cindex @code{assert()} user-defined function
+The C language makes it possible to turn the condition into a string for use
+in printing the diagnostic message.  This is not possible in @command{awk}, so
+this @code{assert()} function also requires a string version of the condition
+that is being tested.
+Following is the function:
+
+@example
+@c file eg/lib/assert.awk
+# assert --- assert that a condition is true. Otherwise, exit.
+
+@c endfile
+@ignore
+@c file eg/lib/assert.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May, 1993
+
+@c endfile
+@end ignore
+@c file eg/lib/assert.awk
+function assert(condition, string)
+@{
+    if (! condition) @{
+        printf("%s:%d: assertion failed: %s\n",
+            FILENAME, FNR, string) > "/dev/stderr"
+        _assert_exit = 1
+        exit 1
+    @}
+@}
+
+@group
+END @{
+    if (_assert_exit)
+        exit 1
+@}
+@end group
+@c endfile
+@end example
+
+The @code{assert()} function tests the @code{condition} parameter. If it
+is false, it prints a message to standard error, using the @code{string}
+parameter to describe the failed condition.  It then sets the variable
+@code{_assert_exit} to one and executes the @code{exit} statement.
+The @code{exit} statement jumps to the @code{END} rule. If the @code{END}
+rule finds @code{_assert_exit} to be true, it exits immediately.
+
+The purpose of the test in the @code{END} rule is to
+keep any other @code{END} rules from running.  When an assertion fails, the
+program should exit immediately.
+If no assertions fail, then @code{_assert_exit} is still
+false when the @code{END} rule is run normally, and the rest of the
+program's @code{END} rules execute.
+For all of this to work correctly, @file{assert.awk} must be the
+first source file read by @command{awk}.
+The function can be used in a program in the following way:
+
+@example
+function myfunc(a, b)
+@{
+     assert(a <= 5 && b >= 17.1, "a <= 5 && b >= 17.1")
+     @dots{}
+@}
+@end example
+
+@noindent
+If the assertion fails, you see a message similar to the following:
+
+@example
+mydata:1357: assertion failed: a <= 5 && b >= 17.1
+@end example
+
+@cindex @code{END} pattern, @code{assert()} user-defined function and
+There is a small problem with this version of @code{assert()}.
+An @code{END} rule is automatically added
+to the program calling @code{assert()}.  Normally, if a program consists
+of just a @code{BEGIN} rule, the input files and/or standard input are
+not read. However, now that the program has an @code{END} rule, @command{awk}
+attempts to read the input @value{DF}s or standard input
+(@pxref{Using BEGIN/END}),
+most likely causing the program to hang as it waits for input.
+
+@cindex @code{BEGIN} pattern, @code{assert()} user-defined function and
+There is a simple workaround to this:
+make sure that such a @code{BEGIN} rule always ends
+with an @code{exit} statement.
+
+@node Round Function
+@subsection Rounding Numbers
+
+@cindex rounding numbers
+@cindex numbers, rounding
+@cindex libraries of @command{awk} functions, rounding numbers
+@cindex functions, library, rounding numbers
+@cindex @code{print} statement, @code{sprintf()} function and
+@cindex @code{printf} statement, @code{sprintf()} function and
+@cindex @code{sprintf()} function, @code{print}/@code{printf} statements and
+The way @code{printf} and @code{sprintf()}
+(@pxref{Printf})
+perform rounding often depends upon the system's C @code{sprintf()}
+subroutine.  On many machines, @code{sprintf()} rounding is @dfn{unbiased},
+which means it doesn't always round a trailing .5 up, contrary
+to naive expectations.  In unbiased rounding, .5 rounds to even,
+rather than always up, so 1.5 rounds to 2 but 4.5 rounds to 4.  This means
+that if you are using a format that does rounding (e.g., @code{"%.0f"}),
+you should check what your system does.  The following function does
+traditional rounding; it might be useful if your @command{awk}'s @code{printf}
+does unbiased rounding:
+
+@cindex @code{round()} user-defined function
+@example
+@c file eg/lib/round.awk
+# round.awk --- do normal rounding
+@c endfile
+@ignore
+@c file eg/lib/round.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# August, 1996
+@c endfile
+@end ignore
+@c file eg/lib/round.awk
+
+function round(x,   ival, aval, fraction)
+@{
+   ival = int(x)    # integer part, int() truncates
+
+   # see if fractional part
+   if (ival == x)   # no fraction
+      return ival   # ensure no decimals
+
+   if (x < 0) @{
+      aval = -x     # absolute value
+      ival = int(aval)
+      fraction = aval - ival
+      if (fraction >= .5)
+         return int(x) - 1   # -2.5 --> -3
+      else
+         return int(x)       # -2.3 --> -2
+   @} else @{
+      fraction = x - ival
+      if (fraction >= .5)
+         return ival + 1
+      else
+         return ival
+   @}
+@}
+@c endfile
+@c don't include test harness in the file that gets installed
+@group
+# test harness
+# @{ print $0, round($0) @}
+@end group
+@end example
+
+@node Cliff Random Function
+@subsection The Cliff Random Number Generator
+@cindex random numbers, Cliff
+@cindex Cliff random numbers
+@cindex numbers, Cliff random
+@cindex functions, library, Cliff random numbers
+
+The
+@uref{http://mathworld.wolfram.com/CliffRandomNumberGenerator.html, Cliff random number generator}
+is a very simple random number generator that ``passes the noise sphere test
+for randomness by showing no structure.''
+It is easily programmed, in less than 10 lines of @command{awk} code:
+
+@cindex @code{cliff_rand()} user-defined function
+@example
+@c file eg/lib/cliff_rand.awk
+# cliff_rand.awk --- generate Cliff random numbers
+@c endfile
+@ignore
+@c file eg/lib/cliff_rand.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# December 2000
+@c endfile
+@end ignore
+@c file eg/lib/cliff_rand.awk
+
+BEGIN @{ _cliff_seed = 0.1 @}
+
+function cliff_rand()
+@{
+    _cliff_seed = (100 * log(_cliff_seed)) % 1
+    if (_cliff_seed < 0)
+        _cliff_seed = - _cliff_seed
+    return _cliff_seed
+@}
+@c endfile
+@end example
+
+This algorithm requires an initial ``seed'' of 0.1.  Each new value
+uses the current seed as input for the calculation.
+If the built-in @code{rand()} function
+(@pxref{Numeric Functions})
+isn't random enough, you might try using this function instead.
+
+@node Ordinal Functions
+@subsection Translating Between Characters and Numbers
+
+@cindex libraries of @command{awk} functions, character values as numbers
+@cindex functions, library, character values as numbers
+@cindex characters, values of as numbers
+@cindex numbers, as values of characters
+One commercial implementation of @command{awk} supplies a built-in function,
+@code{ord()}, which takes a character and returns the numeric value for that
+character in the machine's character set.  If the string passed to
+@code{ord()} has more than one character, only the first one is used.
+
+The inverse of this function is @code{chr()} (from the function of the same
+name in Pascal), which takes a number and returns the corresponding character.
+Both functions are written very nicely in @command{awk}; there is no real
+reason to build them into the @command{awk} interpreter:
+
+@cindex @code{ord()} user-defined function
+@cindex @code{chr()} user-defined function
+@cindex @code{_ord_init()} user-defined function
+@example
+@c file eg/lib/ord.awk
+# ord.awk --- do ord and chr
+
+# Global identifiers:
+#    _ord_:        numerical values indexed by characters
+#    _ord_init:    function to initialize _ord_
+@c endfile
+@ignore
+@c file eg/lib/ord.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# 16 January, 1992
+# 20 July, 1992, revised
+@c endfile
+@end ignore
+@c file eg/lib/ord.awk
+
+BEGIN    @{ _ord_init() @}
+
+function _ord_init(    low, high, i, t)
+@{
+    low = sprintf("%c", 7) # BEL is ascii 7
+    if (low == "\a") @{    # regular ascii
+        low = 0
+        high = 127
+    @} else if (sprintf("%c", 128 + 7) == "\a") @{
+        # ascii, mark parity
+        low = 128
+        high = 255
+    @} else @{        # ebcdic(!)
+        low = 0
+        high = 255
+    @}
+
+    for (i = low; i <= high; i++) @{
+        t = sprintf("%c", i)
+        _ord_[t] = i
+    @}
+@}
+@c endfile
+@end example
+
+@cindex character sets (machine character encodings)
+@cindex ASCII
+@cindex EBCDIC
+@cindex Unicode
+@cindex mark parity
+Some explanation of the numbers used by @code{_ord_init()} is worthwhile.
+The most prominent character set in use today is ASCII.@footnote{This
+is changing; many systems use Unicode, a very large character set
+that includes ASCII as a subset.  On systems with full Unicode support,
+a character can occupy up to 32 bits, making simple tests such as
+used here prohibitively expensive.}
+Although an
+8-bit byte can hold 256 distinct values (from 0 to 255), ASCII only
+defines characters that use the values from 0 to 127.@footnote{ASCII
+has been extended in many countries to use the values from 128 to 255
+for country-specific characters.  If your  system uses these extensions,
+you can simplify @code{_ord_init()} to loop from 0 to 255.}
+In the now distant past,
+at least one minicomputer manufacturer
+@c Pr1me, blech
+used ASCII, but with mark parity, meaning that the leftmost bit in the byte
+is always 1.  This means that on those systems, characters
+have numeric values from 128 to 255.
+Finally, large mainframe systems use the EBCDIC character set, which
+uses all 256 values.
+There are other character sets in use on some older systems, but
+they are not really worth worrying about:
+
+@example
+@c file eg/lib/ord.awk
+function ord(str,    c)
+@{
+    # only first character is of interest
+    c = substr(str, 1, 1)
+    return _ord_[c]
+@}
+
+function chr(c)
+@{
+    # force c to be numeric by adding 0
+    return sprintf("%c", c + 0)
+@}
+@c endfile
+
+#### test code ####
+# BEGIN @{
+#    for (;;) @{
+#        printf("enter a character: ")
+#        if (getline var <= 0)
+#            break
+#        printf("ord(%s) = %d\n", var, ord(var))
+#    @}
+# @}
+@c endfile
+@end example
+
+An obvious improvement to these functions is to move the code for the
+@code{@w{_ord_init}} function into the body of the @code{BEGIN} rule.  It was
+written this way initially for ease of development.
+There is a ``test program'' in a @code{BEGIN} rule, to test the
+function.  It is commented out for production use.
+
+@node Join Function
+@subsection Merging an Array into a String
+
+@cindex libraries of @command{awk} functions, merging arrays into strings
+@cindex functions, library, merging arrays into strings
+@cindex strings, merging arrays into
+@cindex arrays, merging into strings
+When doing string processing, it is often useful to be able to join
+all the strings in an array into one long string.  The following function,
+@code{join()}, accomplishes this task.  It is used later in several of
+the application programs
+(@pxref{Sample Programs}).
+
+Good function design is important; this function needs to be general, but it
+should also have a reasonable default behavior.  It is called with an array
+as well as the beginning and ending indices of the elements in the array to be
+merged.  This assumes that the array indices are numeric---a reasonable
+assumption, as the array was likely created with @code{split()}
+(@pxref{String Functions}):
+
+@cindex @code{join()} user-defined function
+@example
+@c file eg/lib/join.awk
+# join.awk --- join an array into a string
+@c endfile
+@ignore
+@c file eg/lib/join.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/lib/join.awk
+
+function join(array, start, end, sep,    result, i)
+@{
+    if (sep == "")
+       sep = " "
+    else if (sep == SUBSEP) # magic value
+       sep = ""
+    result = array[start]
+    for (i = start + 1; i <= end; i++)
+        result = result sep array[i]
+    return result
+@}
+@c endfile
+@end example
+
+An optional additional argument is the separator to use when joining the
+strings back together.  If the caller supplies a nonempty value,
+@code{join()} uses it; if it is not supplied, it has a null
+value.  In this case, @code{join()} uses a single space as a default
+separator for the strings.  If the value is equal to @code{SUBSEP},
+then @code{join()} joins the strings with no separator between them.
+@code{SUBSEP} serves as a ``magic'' value to indicate that there should
+be no separation between the component strings.@footnote{It would
+be nice if @command{awk} had an assignment operator for concatenation.
+The lack of an explicit operator for concatenation makes string operations
+more difficult than they really need to be.}
+
+@node Getlocaltime Function
+@subsection Managing the Time of Day
+
+@cindex libraries of @command{awk} functions, managing, time
+@cindex functions, library, managing time
+@cindex timestamps, formatted
+@cindex time, managing
+The @code{systime()} and @code{strftime()} functions described in
+@ref{Time Functions}
+provide the minimum functionality necessary for dealing with the time of day
+in human-readable form.  Although @code{strftime()} is extensive, the control
+formats are not necessarily easy to remember or intuitively obvious when
+reading a program.
+
+The following function, @code{getlocaltime()}, populates a user-supplied array
+with preformatted time information.  It returns a string with the current
+time formatted in the same way as the @command{date} utility:
+
+@cindex @code{getlocaltime()} user-defined function
+@example
+@c file eg/lib/gettime.awk
+# getlocaltime.awk --- get the time of day in a usable format
+@c endfile
+@ignore
+@c file eg/lib/gettime.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain, May 1993
+#
+@c endfile
+@end ignore
+@c file eg/lib/gettime.awk
+
+# Returns a string in the format of output of date(1)
+# Populates the array argument time with individual values:
+#    time["second"]       -- seconds (0 - 59)
+#    time["minute"]       -- minutes (0 - 59)
+#    time["hour"]         -- hours (0 - 23)
+#    time["althour"]      -- hours (0 - 12)
+#    time["monthday"]     -- day of month (1 - 31)
+#    time["month"]        -- month of year (1 - 12)
+#    time["monthname"]    -- name of the month
+#    time["shortmonth"]   -- short name of the month
+#    time["year"]         -- year modulo 100 (0 - 99)
+#    time["fullyear"]     -- full year
+#    time["weekday"]      -- day of week (Sunday = 0)
+#    time["altweekday"]   -- day of week (Monday = 0)
+#    time["dayname"]      -- name of weekday
+#    time["shortdayname"] -- short name of weekday
+#    time["yearday"]      -- day of year (0 - 365)
+#    time["timezone"]     -- abbreviation of timezone name
+#    time["ampm"]         -- AM or PM designation
+#    time["weeknum"]      -- week number, Sunday first day
+#    time["altweeknum"]   -- week number, Monday first day
+
+function getlocaltime(time,    ret, now, i)
+@{
+    # get time once, avoids unnecessary system calls
+    now = systime()
+
+    # return date(1)-style output
+    ret = strftime("%a %b %e %H:%M:%S %Z %Y", now)
+
+    # clear out target array
+    delete time
+
+    # fill in values, force numeric values to be
+    # numeric by adding 0
+    time["second"]       = strftime("%S", now) + 0
+    time["minute"]       = strftime("%M", now) + 0
+    time["hour"]         = strftime("%H", now) + 0
+    time["althour"]      = strftime("%I", now) + 0
+    time["monthday"]     = strftime("%d", now) + 0
+    time["month"]        = strftime("%m", now) + 0
+    time["monthname"]    = strftime("%B", now)
+    time["shortmonth"]   = strftime("%b", now)
+    time["year"]         = strftime("%y", now) + 0
+    time["fullyear"]     = strftime("%Y", now) + 0
+    time["weekday"]      = strftime("%w", now) + 0
+    time["altweekday"]   = strftime("%u", now) + 0
+    time["dayname"]      = strftime("%A", now)
+    time["shortdayname"] = strftime("%a", now)
+    time["yearday"]      = strftime("%j", now) + 0
+    time["timezone"]     = strftime("%Z", now)
+    time["ampm"]         = strftime("%p", now)
+    time["weeknum"]      = strftime("%U", now) + 0
+    time["altweeknum"]   = strftime("%W", now) + 0
+
+    return ret
+@}
+@c endfile
+@end example
+
+The string indices are easier to use and read than the various formats
+required by @code{strftime()}.  The @code{alarm} program presented in
+@ref{Alarm Program}
+uses this function.
+A more general design for the @code{getlocaltime()} function would have
+allowed the user to supply an optional timestamp value to use instead
+of the current time.
+
+@node Readfile Function
+@subsection Reading a Whole File at Once
+
+Often, it is convenient to have the entire contents of a file available
+in memory as a single string. A straightforward but naive way to
+do that might be as follows:
+
+@example
+function readfile1(file,    tmp, contents)
+@{
+    if ((getline tmp < file) < 0)
+        return
+
+    contents = tmp RT
+    while ((getline tmp < file) > 0)
+        contents = contents tmp RT
+
+    close(file)
+    return contents
+@}
+@end example
+
+This function reads from @code{file} one record at a time, building
+up the full contents of the file in the local variable @code{contents}.
+It works, but is not necessarily efficient.
+
+The following function, based on a suggestion by Denis Shirokov,
+reads the entire contents of the named file in one shot:
+
+@cindex @code{readfile()} user-defined function
+@example
+@c file eg/lib/readfile.awk
+# readfile.awk --- read an entire file at once
+@c endfile
+@ignore
+@c file eg/lib/readfile.awk
+#
+# Original idea by Denis Shirokov, cosmogen@@gmail.com, April 2013
+#
+@c endfile
+@end ignore
+@c file eg/lib/readfile.awk
+
+function readfile(file,     tmp, save_rs)
+@{
+    save_rs = RS
+    RS = "^$"
+    getline tmp < file
+    close(file)
+    RS = save_rs
+
+    return tmp
+@}
+@c endfile
+@end example
+
+It works by setting @code{RS} to @samp{^$}, a regular expression that
+will never match if the file has contents.  @command{gawk} reads data from
+the file into @code{tmp}, attempting to match @code{RS}.  The match fails
+after each read, but fails quickly, such that @command{gawk} fills
+@code{tmp} with the entire contents of the file.
+(@xref{Records} for information on @code{RT} and @code{RS}.)
+
+In the case that @code{file} is empty, the return value is the null
+string.  Thus, calling code may use something like:
+
+@example
+contents = readfile("/some/path")
+if (length(contents) == 0)
+    # file was empty @dots{}
+@end example
+
+This tests the result to see if it is empty or not. An equivalent
+test would be @samp{@w{contents == ""}}.
+
+@xref{Extension Sample Readfile} for an extension function that
+also reads an entire file into memory.
+
+@node Shell Quoting
+@subsection Quoting Strings to Pass to the Shell
+
+@c included by permission
+@ignore
+Date: Sun, 27 Jul 2014 17:16:16 -0700
+Message-ID: <CAKuGj+iCF_obaCLDUX60aSAgbfocFVtguG39GyeoNxTFby5sqQ@mail.gmail.com>
+Subject: Useful awk function
+From: Mike Brennan <mike@madronabluff.com>
+To: Arnold Robbins <arnold@skeeve.com>
+@end ignore
+
+Michael Brennan offers the following programming pattern,
+which he uses frequently:
+
+@example
+#! /bin/sh
+
+awkp='
+   @dots{}
+   '
+
+@var{input_program} | awk "$awkp" | /bin/sh
+@end example
+
+For example, a program of his named @command{flac-edit} has this form:
+
+@example
+$ @kbd{flac-edit -song="Whoope! That's Great" file.flac}
+@end example
+
+It generates the following output, which is to be piped to
+the shell (@file{/bin/sh}):
+
+@example
+chmod +w file.flac
+metaflac --remove-tag=TITLE file.flac
+LANG=en_US.88591 metaflac --set-tag=TITLE='Whoope! That'"'"'s Great' file.flac
+chmod -w file.flac
+@end example
+
+Note the need for shell quoting.  The function @code{shell_quote()}
+does it.  @code{SINGLE} is the one-character string @code{"'"} and
+@code{QSINGLE} is the three-character string @code{"\"'\""}:
+
+@example
+@c file eg/lib/shellquote.awk
+# shell_quote --- quote an argument for passing to the shell
+@c endfile
+@ignore
+@c file eg/lib/shellquote.awk
+#
+# Michael Brennan
+# brennan@@madronabluff.com
+# September 2014
+@c endfile
+@end ignore
+@c file eg/lib/shellquote.awk
+
+function shell_quote(s,             # parameter
+    SINGLE, QSINGLE, i, X, n, ret)  # locals
+@{
+    if (s == "")
+        return "\"\""
+
+    SINGLE = "\x27"  # single quote
+    QSINGLE = "\"\x27\""
+    n = split(s, X, SINGLE)
+
+    ret = SINGLE X[1] SINGLE
+    for (i = 2; i <= n; i++)
+        ret = ret QSINGLE SINGLE X[i] SINGLE
+
+    return ret
+@}
+@c endfile
+@end example
+
+@node Data File Management
+@section @value{DDF} Management
+
+@cindex files, managing
+@cindex libraries of @command{awk} functions, managing, data files
+@cindex functions, library, managing data files
+This @value{SECTION} presents functions that are useful for managing
+command-line @value{DF}s.
+
+@menu
+* Filetrans Function::          A function for handling data file transitions.
+* Rewind Function::             A function for rereading the current file.
+* File Checking::               Checking that data files are readable.
+* Empty Files::                 Checking for zero-length files.
+* Ignoring Assigns::            Treating assignments as file names.
+@end menu
+
+@node Filetrans Function
+@subsection Noting @value{DDF} Boundaries
+
+@cindex files, managing, data file boundaries
+@cindex files, initialization and cleanup
+The @code{BEGIN} and @code{END} rules are each executed exactly once, at
+the beginning and end of your @command{awk} program, respectively
+(@pxref{BEGIN/END}).
+We (the @command{gawk} authors) once had a user who mistakenly thought that the
+@code{BEGIN} rules were executed at the beginning of each @value{DF} and the
+@code{END} rules were executed at the end of each @value{DF}.
+
+When informed
+that this was not the case, the user requested that we add new special
+patterns to @command{gawk}, named @code{BEGIN_FILE} and @code{END_FILE}, that
+would have the desired behavior.  He even supplied us the code to do so.
+
+Adding these special patterns to @command{gawk} wasn't necessary;
+the job can be done cleanly in @command{awk} itself, as illustrated
+by the following library program.
+It arranges to call two user-supplied functions, @code{beginfile()} and
+@code{endfile()}, at the beginning and end of each @value{DF}.
+Besides solving the problem in only nine(!) lines of code, it does so
+@emph{portably}; this works with any implementation of @command{awk}:
+
+@example
+# transfile.awk
+#
+# Give the user a hook for filename transitions
+#
+# The user must supply functions beginfile() and endfile()
+# that each take the name of the file being started or
+# finished, respectively.
+@c #
+@c # Arnold Robbins, arnold@@skeeve.com, Public Domain
+@c # January 1992
+
+FILENAME != _oldfilename @{
+    if (_oldfilename != "")
+        endfile(_oldfilename)
+    _oldfilename = FILENAME
+    beginfile(FILENAME)
+@}
+
+END @{ endfile(FILENAME) @}
+@end example
+
+This file must be loaded before the user's ``main'' program, so that the
+rule it supplies is executed first.
+
+This rule relies on @command{awk}'s @code{FILENAME} variable, which
+automatically changes for each new @value{DF}.  The current @value{FN} is
+saved in a private variable, @code{_oldfilename}.  If @code{FILENAME} does
+not equal @code{_oldfilename}, then a new @value{DF} is being processed and
+it is necessary to call @code{endfile()} for the old file.  Because
+@code{endfile()} should only be called if a file has been processed, the
+program first checks to make sure that @code{_oldfilename} is not the null
+string.  The program then assigns the current @value{FN} to
+@code{_oldfilename} and calls @code{beginfile()} for the file.
+Because, like all @command{awk} variables, @code{_oldfilename} is
+initialized to the null string, this rule executes correctly even for the
+first @value{DF}.
+
+The program also supplies an @code{END} rule to do the final processing for
+the last file.  Because this @code{END} rule comes before any @code{END} rules
+supplied in the ``main'' program, @code{endfile()} is called first.  Once
+again, the value of multiple @code{BEGIN} and @code{END} rules should be clear.
+
+@cindex @code{beginfile()} user-defined function
+@cindex @code{endfile()} user-defined function
+If the same @value{DF} occurs twice in a row on the command line, then
+@code{endfile()} and @code{beginfile()} are not executed at the end of the
+first pass and at the beginning of the second pass.
+The following version solves the problem:
+
+@example
+@c file eg/lib/ftrans.awk
+# ftrans.awk --- handle datafile transitions
+#
+# user supplies beginfile() and endfile() functions
+@c endfile
+@ignore
+@c file eg/lib/ftrans.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# November 1992
+@c endfile
+@end ignore
+@c file eg/lib/ftrans.awk
+
+FNR == 1 @{
+    if (_filename_ != "")
+        endfile(_filename_)
+    _filename_ = FILENAME
+    beginfile(FILENAME)
+@}
+
+END @{ endfile(_filename_) @}
+@c endfile
+@end example
+
+@ref{Wc Program}
+shows how this library function can be used and
+how it simplifies writing the main program.
+
+@cindex sidebar, So Why Does @command{gawk} Have @code{BEGINFILE} and @code{ENDFILE}?
+@ifdocbook
+@docbook
+<sidebar><title>So Why Does @command{gawk} Have @code{BEGINFILE} and @code{ENDFILE}?</title>
+@end docbook
+
+
+You are probably wondering, if @code{beginfile()} and @code{endfile()}
+functions can do the job, why does @command{gawk} have
+@code{BEGINFILE} and @code{ENDFILE} patterns?
+
+Good question.  Normally, if @command{awk} cannot open a file, this
+causes an immediate fatal error.  In this case, there is no way for a
+user-defined function to deal with the problem, as the mechanism for
+calling it relies on the file being open and at the first record.  Thus,
+the main reason for @code{BEGINFILE} is to give you a ``hook'' to catch
+files that cannot be processed.  @code{ENDFILE} exists for symmetry,
+and because it provides an easy way to do per-file cleanup processing.
+For more information, refer to @ref{BEGINFILE/ENDFILE}.
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{So Why Does @command{gawk} Have @code{BEGINFILE} and @code{ENDFILE}?}
+
+
+
+You are probably wondering, if @code{beginfile()} and @code{endfile()}
+functions can do the job, why does @command{gawk} have
+@code{BEGINFILE} and @code{ENDFILE} patterns?
+
+Good question.  Normally, if @command{awk} cannot open a file, this
+causes an immediate fatal error.  In this case, there is no way for a
+user-defined function to deal with the problem, as the mechanism for
+calling it relies on the file being open and at the first record.  Thus,
+the main reason for @code{BEGINFILE} is to give you a ``hook'' to catch
+files that cannot be processed.  @code{ENDFILE} exists for symmetry,
+and because it provides an easy way to do per-file cleanup processing.
+For more information, refer to @ref{BEGINFILE/ENDFILE}.
+@end cartouche
+@end ifnotdocbook
+
+@node Rewind Function
+@subsection Rereading the Current File
+
+@cindex files, reading
+Another request for a new built-in function was for a
+function that would make it possible to reread the current file.
+The requesting user didn't want to have to use @code{getline}
+(@pxref{Getline})
+inside a loop.
+
+However, as long as you are not in the @code{END} rule, it is
+quite easy to arrange to immediately close the current input file
+and then start over with it from the top.
+For lack of a better name, we'll call the function @code{rewind()}:
+
+@cindex @code{rewind()} user-defined function
+@example
+@c file eg/lib/rewind.awk
+# rewind.awk --- rewind the current file and start over
+@c endfile
+@ignore
+@c file eg/lib/rewind.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# September 2000
+@c endfile
+@end ignore
+@c file eg/lib/rewind.awk
+
+function rewind(    i)
+@{
+    # shift remaining arguments up
+    for (i = ARGC; i > ARGIND; i--)
+        ARGV[i] = ARGV[i-1]
+
+    # make sure gawk knows to keep going
+    ARGC++
+
+    # make current file next to get done
+    ARGV[ARGIND+1] = FILENAME
+
+    # do it
+    nextfile
+@}
+@c endfile
+@end example
+
+The @code{rewind()} function relies on the @code{ARGIND} variable
+(@pxref{Auto-set}), which is specific to @command{gawk}.  It also
+relies on the @code{nextfile} keyword (@pxref{Nextfile Statement}).
+Because of this, you should not call it from an @code{ENDFILE} rule.
+(This isn't necessary anyway, because @command{gawk} goes to the next
+file as soon as an @code{ENDFILE} rule finishes!)
+
+You need to be careful calling @code{rewind()}.  You can end up
+causing infinite recursion if you don't pay attention. Here is an
+example use:
+
+@example
+$ @kbd{cat data}
+@print{} a
+@print{} b
+@print{} c
+@print{} d
+@print{} e
+
+$ cat @kbd{test.awk}
+@print{} FNR == 3 && ! rewound @{
+@print{}    rewound = 1
+@print{}    rewind()
+@print{} @}
+@print{} 
+@print{} @{ print FILENAME, FNR, $0 @}
+
+$ @kbd{gawk -f rewind.awk -f test.awk data }
+@print{} data 1 a
+@print{} data 2 b
+@print{} data 1 a
+@print{} data 2 b
+@print{} data 3 c
+@group
+@print{} data 4 d
+@print{} data 5 e
+@end group
+@end example
+
+@node File Checking
+@subsection Checking for Readable @value{DDF}s
+
+@cindex troubleshooting, readable data files
+@cindex readable data files@comma{} checking
+@cindex files, skipping
+Normally, if you give @command{awk} a @value{DF} that isn't readable,
+it stops with a fatal error.  There are times when you might want to
+just ignore such files and keep going.@footnote{The @code{BEGINFILE}
+special pattern (@pxref{BEGINFILE/ENDFILE}) provides an alternative
+mechanism for dealing with files that can't be opened.  However, the
+code here provides a portable solution.} You can do this by prepending
+the following program to your @command{awk} program:
+
+@cindex @code{readable.awk} program
+@example
+@c file eg/lib/readable.awk
+# readable.awk --- library file to skip over unreadable files
+@c endfile
+@ignore
+@c file eg/lib/readable.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# October 2000
+# December 2010
+@c endfile
+@end ignore
+@c file eg/lib/readable.awk
+
+BEGIN @{
+    for (i = 1; i < ARGC; i++) @{
+        if (ARGV[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/ \
+            || ARGV[i] == "-" || ARGV[i] == "/dev/stdin")
+            continue    # assignment or standard input
+        else if ((getline junk < ARGV[i]) < 0) # unreadable
+            delete ARGV[i]
+        else
+            close(ARGV[i])
+    @}
+@}
+@c endfile
+@end example
+
+@cindex troubleshooting, @code{getline} function
+This works, because the @code{getline} won't be fatal.
+Removing the element from @code{ARGV} with @code{delete}
+skips the file (because it's no longer in the list).
+See also @ref{ARGC and ARGV}.
+
+Because @command{awk} variable names only allow the English letters,
+the regular expression check purposely does not use character classes
+such as @samp{[:alpha:]} and @samp{[:alnum:]}
+(@pxref{Bracket Expressions}).
+
+@node Empty Files
+@subsection Checking for Zero-Length Files
+
+All known @command{awk} implementations silently skip over zero-length files.
+This is a by-product of @command{awk}'s implicit
+read-a-record-and-match-against-the-rules loop: when @command{awk}
+tries to read a record from an empty file, it immediately receives an
+end-of-file indication, closes the file, and proceeds on to the next
+command-line @value{DF}, @emph{without} executing any user-level
+@command{awk} program code.
+
+Using @command{gawk}'s @code{ARGIND} variable
+(@pxref{Built-in Variables}), it is possible to detect when an empty
+@value{DF} has been skipped.  Similar to the library file presented
+in @ref{Filetrans Function}, the following library file calls a function named
+@code{zerofile()} that the user must provide.  The arguments passed are
+the @value{FN} and the position in @code{ARGV} where it was found:
+
+@cindex @code{zerofile.awk} program
+@example
+@c file eg/lib/zerofile.awk
+# zerofile.awk --- library file to process empty input files
+@c endfile
+@ignore
+@c file eg/lib/zerofile.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# June 2003
+@c endfile
+@end ignore
+@c file eg/lib/zerofile.awk
+
+BEGIN @{ Argind = 0 @}
+
+ARGIND > Argind + 1 @{
+    for (Argind++; Argind < ARGIND; Argind++)
+        zerofile(ARGV[Argind], Argind)
+@}
+
+ARGIND != Argind @{ Argind = ARGIND @}
+
+END @{
+    if (ARGIND > Argind)
+        for (Argind++; Argind <= ARGIND; Argind++)
+            zerofile(ARGV[Argind], Argind)
+@}
+@c endfile
+@end example
+
+The user-level variable @code{Argind} allows the @command{awk} program
+to track its progress through @code{ARGV}.  Whenever the program detects
+that @code{ARGIND} is greater than @samp{Argind + 1}, it means that one or
+more empty files were skipped.  The action then calls @code{zerofile()} for
+each such file, incrementing @code{Argind} along the way.
+
+The @samp{Argind != ARGIND} rule simply keeps @code{Argind} up to date
+in the normal case.
+
+Finally, the @code{END} rule catches the case of any empty files at
+the end of the command-line arguments.  Note that the test in the
+condition of the @code{for} loop uses the @samp{<=} operator,
+not @samp{<}.
+
+@node Ignoring Assigns
+@subsection Treating Assignments as @value{FFN}s
+
+@cindex assignments as file names
+@cindex file names, assignments as
+Occasionally, you might not want @command{awk} to process command-line
+variable assignments
+(@pxref{Assignment Options}).
+In particular, if you have a @value{FN} that contains an @samp{=} character,
+@command{awk} treats the @value{FN} as an assignment and does not process it.
+
+Some users have suggested an additional command-line option for @command{gawk}
+to disable command-line assignments.  However, some simple programming with
+a library file does the trick:
+
+@cindex @code{noassign.awk} program
+@example
+@c file eg/lib/noassign.awk
+# noassign.awk --- library file to avoid the need for a
+# special option that disables command-line assignments
+@c endfile
+@ignore
+@c file eg/lib/noassign.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# October 1999
+@c endfile
+@end ignore
+@c file eg/lib/noassign.awk
+
+function disable_assigns(argc, argv,    i)
+@{
+    for (i = 1; i < argc; i++)
+        if (argv[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/)
+            argv[i] = ("./" argv[i])
+@}
+
+BEGIN @{
+    if (No_command_assign)
+        disable_assigns(ARGC, ARGV)
+@}
+@c endfile
+@end example
+
+You then run your program this way:
+
+@example
+awk -v No_command_assign=1 -f noassign.awk -f yourprog.awk *
+@end example
+
+The function works by looping through the arguments.
+It prepends @samp{./} to
+any argument that matches the form
+of a variable assignment, turning that argument into a @value{FN}.
+
+The use of @code{No_command_assign} allows you to disable command-line
+assignments at invocation time, by giving the variable a true value.
+When not set, it is initially zero (i.e., false), so the command-line arguments
+are left alone.
+
+@node Getopt Function
+@section Processing Command-Line Options
+
+@cindex libraries of @command{awk} functions, command-line options
+@cindex functions, library, command-line options
+@cindex command-line options, processing
+@cindex options, command-line, processing
+@cindex functions, library, C library
+@cindex arguments, processing
+Most utilities on POSIX-compatible systems take options on
+the command line that can be used to change the way a program behaves.
+@command{awk} is an example of such a program
+(@pxref{Options}).
+Often, options take @dfn{arguments} (i.e., data that the program needs to
+correctly obey the command-line option).  For example, @command{awk}'s
+@option{-F} option requires a string to use as the field separator.
+The first occurrence on the command line of either @option{--} or a
+string that does not begin with @samp{-} ends the options.
+
+@cindex @code{getopt()} function (C library)
+Modern Unix systems provide a C function named @code{getopt()} for processing
+command-line arguments.  The programmer provides a string describing the
+one-letter options. If an option requires an argument, it is followed in the
+string with a colon.  @code{getopt()} is also passed the
+count and values of the command-line arguments and is called in a loop.
+@code{getopt()} processes the command-line arguments for option letters.
+Each time around the loop, it returns a single character representing the
+next option letter that it finds, or @samp{?} if it finds an invalid option.
+When it returns @minus{}1, there are no options left on the command line.
+
+When using @code{getopt()}, options that do not take arguments can be
+grouped together.  Furthermore, options that take arguments require that the
+argument be present.  The argument can immediately follow the option letter,
+or it can be a separate command-line argument.
+
+Given a hypothetical program that takes
+three command-line options, @option{-a}, @option{-b}, and @option{-c}, where
+@option{-b} requires an argument, all of the following are valid ways of
+invoking the program:
+
+@example
+prog -a -b foo -c data1 data2 data3
+prog -ac -bfoo -- data1 data2 data3
+prog -acbfoo data1 data2 data3
+@end example
+
+Notice that when the argument is grouped with its option, the rest of
+the argument is considered to be the option's argument.
+In this example, @option{-acbfoo} indicates that all of the
+@option{-a}, @option{-b}, and @option{-c} options were supplied,
+and that @samp{foo} is the argument to the @option{-b} option.
+
+@code{getopt()} provides four external variables that the programmer can use:
+
+@table @code
+@item optind
+The index in the argument value array (@code{argv}) where the first
+nonoption command-line argument can be found.
+
+@item optarg
+The string value of the argument to an option.
+
+@item opterr
+Usually @code{getopt()} prints an error message when it finds an invalid
+option.  Setting @code{opterr} to zero disables this feature.  (An
+application might want to print its own error message.)
+
+@item optopt
+The letter representing the command-line option.
+@end table
+
+The following C fragment shows how @code{getopt()} might process command-line
+arguments for @command{awk}:
+
+@example
+int
+main(int argc, char *argv[])
+@{
+    @dots{}
+    /* print our own message */
+    opterr = 0;
+    while ((c = getopt(argc, argv, "v:f:F:W:")) != -1) @{
+        switch (c) @{
+        case 'f':    /* file */
+            @dots{}
+            break;
+        case 'F':    /* field separator */
+            @dots{}
+            break;
+        case 'v':    /* variable assignment */
+            @dots{}
+            break;
+        case 'W':    /* extension */
+            @dots{}
+            break;
+        case '?':
+        default:
+            usage();
+            break;
+        @}
+    @}
+    @dots{}
+@}
+@end example
+
+As a side point, @command{gawk} actually uses the GNU @code{getopt_long()}
+function to process both normal and GNU-style long options
+(@pxref{Options}).
+
+The abstraction provided by @code{getopt()} is very useful and is quite
+handy in @command{awk} programs as well.  Following is an @command{awk}
+version of @code{getopt()}.  This function highlights one of the
+greatest weaknesses in @command{awk}, which is that it is very poor at
+manipulating single characters.  Repeated calls to @code{substr()} are
+necessary for accessing individual characters
+(@pxref{String Functions}).@footnote{This
+function was written before @command{gawk} acquired the ability to
+split strings into single characters using @code{""} as the separator.
+We have left it alone, as using @code{substr()} is more portable.}
+
+The discussion that follows walks through the code a bit at a time:
+
+@cindex @code{getopt()} user-defined function
+@example
+@c file eg/lib/getopt.awk
+# getopt.awk --- Do C library getopt(3) function in awk
+@c endfile
+@ignore
+@c file eg/lib/getopt.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+#
+# Initial version: March, 1991
+# Revised: May, 1993
+@c endfile
+@end ignore
+@c file eg/lib/getopt.awk
+
+# External variables:
+#    Optind -- index in ARGV of first nonoption argument
+#    Optarg -- string value of argument to current option
+#    Opterr -- if nonzero, print our own diagnostic
+#    Optopt -- current option letter
+
+# Returns:
+#    -1     at end of options
+#    "?"    for unrecognized option
+#    <c>    a character representing the current option
+
+# Private Data:
+#    _opti  -- index in multiflag option, e.g., -abc
+@c endfile
+@end example
+
+The function starts out with comments presenting
+a list of the global variables it uses,
+what the return values are, what they mean, and any global variables that
+are ``private'' to this library function.  Such documentation is essential
+for any program, and particularly for library functions.
+
+The @code{getopt()} function first checks that it was indeed called with
+a string of options (the @code{options} parameter).  If @code{options}
+has a zero length, @code{getopt()} immediately returns @minus{}1:
+
+@cindex @code{getopt()} user-defined function
+@example
+@c file eg/lib/getopt.awk
+function getopt(argc, argv, options,    thisopt, i)
+@{
+    if (length(options) == 0)    # no options given
+        return -1
+
+@group
+    if (argv[Optind] == "--") @{  # all done
+        Optind++
+        _opti = 0
+        return -1
+@end group
+    @} else if (argv[Optind] !~ /^-[^:[:space:]]/) @{
+        _opti = 0
+        return -1
+    @}
+@c endfile
+@end example
+
+The next thing to check for is the end of the options.  A @option{--}
+ends the command-line options, as does any command-line argument that
+does not begin with a @samp{-}.  @code{Optind} is used to step through
+the array of command-line arguments; it retains its value across calls
+to @code{getopt()}, because it is a global variable.
+
+The regular expression that is used, @code{@w{/^-[^:[:space:]/}},
+checks for a @samp{-} followed by anything
+that is not whitespace and not a colon.
+If the current command-line argument does not match this pattern,
+it is not an option, and it ends option processing. Continuing on:
+
+@example
+@c file eg/lib/getopt.awk
+    if (_opti == 0)
+        _opti = 2
+    thisopt = substr(argv[Optind], _opti, 1)
+    Optopt = thisopt
+    i = index(options, thisopt)
+    if (i == 0) @{
+        if (Opterr)
+            printf("%c -- invalid option\n", thisopt) > "/dev/stderr"
+        if (_opti >= length(argv[Optind])) @{
+            Optind++
+            _opti = 0
+        @} else
+            _opti++
+        return "?"
+    @}
+@c endfile
+@end example
+
+The @code{_opti} variable tracks the position in the current command-line
+argument (@code{argv[Optind]}).  If multiple options are
+grouped together with one @samp{-} (e.g., @option{-abx}), it is necessary
+to return them to the user one at a time.
+
+If @code{_opti} is equal to zero, it is set to two, which is the index in
+the string of the next character to look at (we skip the @samp{-}, which
+is at position one).  The variable @code{thisopt} holds the character,
+obtained with @code{substr()}.  It is saved in @code{Optopt} for the main
+program to use.
+
+If @code{thisopt} is not in the @code{options} string, then it is an
+invalid option.  If @code{Opterr} is nonzero, @code{getopt()} prints an error
+message on the standard error that is similar to the message from the C
+version of @code{getopt()}.
+
+Because the option is invalid, it is necessary to skip it and move on to the
+next option character.  If @code{_opti} is greater than or equal to the
+length of the current command-line argument, it is necessary to move on
+to the next argument, so @code{Optind} is incremented and @code{_opti} is reset
+to zero. Otherwise, @code{Optind} is left alone and @code{_opti} is merely
+incremented.
+
+In any case, because the option is invalid, @code{getopt()} returns @code{"?"}.
+The main program can examine @code{Optopt} if it needs to know what the
+invalid option letter actually is. Continuing on:
+
+@example
+@c file eg/lib/getopt.awk
+    if (substr(options, i + 1, 1) == ":") @{
+        # get option argument
+        if (length(substr(argv[Optind], _opti + 1)) > 0)
+            Optarg = substr(argv[Optind], _opti + 1)
+        else
+            Optarg = argv[++Optind]
+        _opti = 0
+    @} else
+        Optarg = ""
+@c endfile
+@end example
+
+If the option requires an argument, the option letter is followed by a colon
+in the @code{options} string.  If there are remaining characters in the
+current command-line argument (@code{argv[Optind]}), then the rest of that
+string is assigned to @code{Optarg}.  Otherwise, the next command-line
+argument is used (@samp{-xFOO} versus @samp{@w{-x FOO}}). In either case,
+@code{_opti} is reset to zero, because there are no more characters left to
+examine in the current command-line argument. Continuing:
+
+@example
+@c file eg/lib/getopt.awk
+    if (_opti == 0 || _opti >= length(argv[Optind])) @{
+        Optind++
+        _opti = 0
+    @} else
+        _opti++
+    return thisopt
+@}
+@c endfile
+@end example
+
+Finally, if @code{_opti} is either zero or greater than the length of the
+current command-line argument, it means this element in @code{argv} is
+through being processed, so @code{Optind} is incremented to point to the
+next element in @code{argv}.  If neither condition is true, then only
+@code{_opti} is incremented, so that the next option letter can be processed
+on the next call to @code{getopt()}.
+
+The @code{BEGIN} rule initializes both @code{Opterr} and @code{Optind} to one.
+@code{Opterr} is set to one, because the default behavior is for @code{getopt()}
+to print a diagnostic message upon seeing an invalid option.  @code{Optind}
+is set to one, because there's no reason to look at the program name, which is
+in @code{ARGV[0]}:
+
+@example
+@c file eg/lib/getopt.awk
+BEGIN @{
+    Opterr = 1    # default is to diagnose
+    Optind = 1    # skip ARGV[0]
+
+    # test program
+    if (_getopt_test) @{
+        while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
+            printf("c = <%c>, Optarg = <%s>\n",
+                                       _go_c, Optarg)
+        printf("non-option arguments:\n")
+        for (; Optind < ARGC; Optind++)
+            printf("\tARGV[%d] = <%s>\n",
+                                    Optind, ARGV[Optind])
+    @}
+@}
+@c endfile
+@end example
+
+The rest of the @code{BEGIN} rule is a simple test program.  Here are the
+results of two sample runs of the test program:
+
+@example
+$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -cbARG bax -x}
+@print{} c = <a>, Optarg = <>
+@print{} c = <c>, Optarg = <>
+@print{} c = <b>, Optarg = <ARG>
+@print{} non-option arguments:
+@print{}         ARGV[3] = <bax>
+@print{}         ARGV[4] = <-x>
+
+$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -x -- xyz abc}
+@print{} c = <a>, Optarg = <>
+@error{} x -- invalid option
+@print{} c = <?>, Optarg = <>
+@print{} non-option arguments:
+@print{}         ARGV[4] = <xyz>
+@print{}         ARGV[5] = <abc>
+@end example
+
+In both runs, the first @option{--} terminates the arguments to
+@command{awk}, so that it does not try to interpret the @option{-a},
+etc., as its own options.
+
+@quotation NOTE
+After @code{getopt()} is through,
+user-level code must clear out all the elements of @code{ARGV} from 1
+to @code{Optind}, so that @command{awk} does not try to process the
+command-line options as @value{FN}s.
+@end quotation
+
+Using @samp{#!} with the @option{-E} option may help avoid
+conflicts between your program's options and @command{gawk}'s options,
+as @option{-E} causes @command{gawk} to abandon processing of
+further options
+(@pxref{Executable Scripts} and
+@ifnotdocbook
+@pxref{Options}).
+@end ifnotdocbook
+@ifdocbook
+@ref{Options}).
+@end ifdocbook
+
+Several of the sample programs presented in
+@ref{Sample Programs},
+use @code{getopt()} to process their arguments.
+
+@node Passwd Functions
+@section Reading the User Database
+
+@cindex libraries of @command{awk} functions, user database, reading
+@cindex functions, library, user database@comma{} reading
+@cindex user database@comma{} reading
+@cindex database, users@comma{} reading
+@cindex @code{PROCINFO} array
+The @code{PROCINFO} array
+(@pxref{Built-in Variables})
+provides access to the current user's real and effective user and group ID
+numbers, and, if available, the user's supplementary group set.
+However, because these are numbers, they do not provide very useful
+information to the average user.  There needs to be some way to find the
+user information associated with the user and group ID numbers.  This
+@value{SECTION} presents a suite of functions for retrieving information from the
+user database.  @xref{Group Functions}
+for a similar suite that retrieves information from the group database.
+
+@cindex @code{getpwent()} function (C library)
+@cindex @code{getpwent()} user-defined function
+@cindex users, information about, retrieving
+@cindex login information
+@cindex account information
+@cindex password file
+@cindex files, password
+The POSIX standard does not define the file where user information is
+kept.  Instead, it provides the @code{<pwd.h>} header file
+and several C language subroutines for obtaining user information.
+The primary function is @code{getpwent()}, for ``get password entry.''
+The ``password'' comes from the original user database file,
+@file{/etc/passwd}, which stores user information along with the
+encrypted passwords (hence the name).
+
+@cindex @command{pwcat} program
+Although an @command{awk} program could simply read @file{/etc/passwd}
+directly, this file may not contain complete information about the
+system's set of users.@footnote{It is often the case that password
+information is stored in a network database.} To be sure you are able to
+produce a readable and complete version of the user database, it is necessary
+to write a small C program that calls @code{getpwent()}.  @code{getpwent()}
+is defined as returning a pointer to a @code{struct passwd}.  Each time it
+is called, it returns the next entry in the database.  When there are
+no more entries, it returns @code{NULL}, the null pointer.  When this
+happens, the C program should call @code{endpwent()} to close the database.
+Following is @command{pwcat}, a C program that ``cats'' the password database:
+
+@example
+@c file eg/lib/pwcat.c
+/*
+ * pwcat.c
+ *
+ * Generate a printable version of the password database.
+ */
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+/*
+ * Arnold Robbins, arnold@@skeeve.com, May 1993
+ * Public Domain
+ * December 2010, move to ANSI C definition for main().
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+#include <stdio.h>
+#include <pwd.h>
+
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+#if defined (STDC_HEADERS)
+#include <stdlib.h>
+#endif
+
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+int
+main(int argc, char **argv)
+@{
+    struct passwd *p;
+
+    while ((p = getpwent()) != NULL)
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+#ifdef HAVE_STRUCT_PASSWD_PW_PASSWD
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+        printf("%s:%s:%ld:%ld:%s:%s:%s\n",
+            p->pw_name, p->pw_passwd, (long) p->pw_uid,
+            (long) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell);
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+#else
+        printf("%s:*:%ld:%ld:%s:%s\n",
+            p->pw_name, (long) p->pw_uid,
+            (long) p->pw_gid, p->pw_dir, p->pw_shell);
+#endif
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+
+    endpwent();
+    return 0;
+@}
+@c endfile
+@end example
+
+If you don't understand C, don't worry about it.
+The output from @command{pwcat} is the user database, in the traditional
+@file{/etc/passwd} format of colon-separated fields.  The fields are:
+
+@table @asis
+@item Login name
+The user's login name.
+
+@item Encrypted password
+The user's encrypted password.  This may not be available on some systems.
+
+@item User-ID
+The user's numeric user ID number.
+(On some systems, it's a C @code{long}, and not an @code{int}.  Thus,
+we cast it to @code{long} for all cases.)
+
+@item Group-ID
+The user's numeric group ID number.
+(Similar comments about @code{long} versus @code{int} apply here.)
+
+@item Full name
+The user's full name, and perhaps other information associated with the
+user.
+
+@item Home directory
+The user's login (or ``home'') directory (familiar to shell programmers as
+@code{$HOME}).
+
+@item Login shell
+The program that is run when the user logs in.  This is usually a
+shell, such as Bash.
+@end table
+
+A few lines representative of @command{pwcat}'s output are as follows:
+
+@cindex Jacobs, Andrew
+@cindex Robbins, Arnold
+@cindex Robbins, Miriam
+@example
+$ @kbd{pwcat}
+@print{} root:x:0:1:Operator:/:/bin/sh
+@print{} nobody:*:65534:65534::/:
+@print{} daemon:*:1:1::/:
+@print{} sys:*:2:2::/:/bin/csh
+@print{} bin:*:3:3::/bin:
+@print{} arnold:xyzzy:2076:10:Arnold Robbins:/home/arnold:/bin/sh
+@print{} miriam:yxaay:112:10:Miriam Robbins:/home/miriam:/bin/sh
+@print{} andy:abcca2:113:10:Andy Jacobs:/home/andy:/bin/sh
+@dots{}
+@end example
+
+With that introduction, following is a group of functions for getting user
+information.  There are several functions here, corresponding to the C
+functions of the same names:
+
+@cindex @code{_pw_init()} user-defined function
+@example
+@c file eg/lib/passwdawk.in
+# passwd.awk --- access password file information
+@c endfile
+@ignore
+@c file eg/lib/passwdawk.in
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+@c endfile
+@end ignore
+@c file eg/lib/passwdawk.in
+
+BEGIN @{
+    # tailor this to suit your system
+    _pw_awklib = "/usr/local/libexec/awk/"
+@}
+
+function _pw_init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+@{
+    if (_pw_inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    pwcat = _pw_awklib "pwcat"
+    while ((pwcat | getline) > 0) @{
+        _pw_byname[$1] = $0
+        _pw_byuid[$3] = $0
+        _pw_bycount[++_pw_total] = $0
+    @}
+    close(pwcat)
+    _pw_count = 0
+    _pw_inited = 1
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+@}
+@c endfile
+@end example
+
+@cindex @code{BEGIN} pattern, @code{pwcat} program
+The @code{BEGIN} rule sets a private variable to the directory where
+@command{pwcat} is stored.  Because it is used to help out an @command{awk} library
+routine, we have chosen to put it in @file{/usr/local/libexec/awk};
+however, you might want it to be in a different directory on your system.
+
+The function @code{_pw_init()} fills three copies of the user information
+into three associative arrays.  The arrays are indexed by username
+(@code{_pw_byname}), by user ID number (@code{_pw_byuid}), and by order of
+occurrence (@code{_pw_bycount}).
+The variable @code{_pw_inited} is used for efficiency, as @code{_pw_init()}
+needs to be called only once.
+
+@cindex @code{PROCINFO} array, testing the field splitting
+@cindex @code{getline} command, @code{_pw_init()} function
+Because this function uses @code{getline} to read information from
+@command{pwcat}, it first saves the values of @code{FS}, @code{RS}, and @code{$0}.
+It notes in the variable @code{using_fw} whether field splitting
+with @code{FIELDWIDTHS} is in effect or not.
+Doing so is necessary, as these functions could be called
+from anywhere within a user's program, and the user may have his
+or her own way of splitting records and fields.
+This makes it possible to restore the correct
+field-splitting mechanism later.  The test can only be true for
+@command{gawk}.  It is false if using @code{FS} or @code{FPAT},
+or on some other @command{awk} implementation.
+
+The code that checks for using @code{FPAT}, using @code{using_fpat}
+and @code{PROCINFO["FS"]}, is similar.
+
+The main part of the function uses a loop to read database lines, split
+the lines into fields, and then store the lines into each array as necessary.
+When the loop is done, @code{@w{_pw_init()}} cleans up by closing the pipeline,
+setting @code{@w{_pw_inited}} to one, and restoring @code{FS}
+(and @code{FIELDWIDTHS} or @code{FPAT}
+if necessary), @code{RS}, and @code{$0}.
+The use of @code{@w{_pw_count}} is explained shortly.
+
+@cindex @code{getpwnam()} function (C library)
+The @code{getpwnam()} function takes a username as a string argument. If that
+user is in the database, it returns the appropriate line. Otherwise, it
+relies on the array reference to a nonexistent
+element to create the element with the null string as its value:
+
+@cindex @code{getpwnam()} user-defined function
+@example
+@group
+@c file eg/lib/passwdawk.in
+function getpwnam(name)
+@{
+    _pw_init()
+    return _pw_byname[name]
+@}
+@c endfile
+@end group
+@end example
+
+@cindex @code{getpwuid()} function (C library)
+Similarly, the @code{getpwuid()} function takes a user ID number
+argument. If that user number is in the database, it returns the
+appropriate line. Otherwise, it returns the null string:
+
+@cindex @code{getpwuid()} user-defined function
+@example
+@c file eg/lib/passwdawk.in
+function getpwuid(uid)
+@{
+    _pw_init()
+    return _pw_byuid[uid]
+@}
+@c endfile
+@end example
+
+@cindex @code{getpwent()} function (C library)
+The @code{getpwent()} function simply steps through the database, one entry at
+a time.  It uses @code{_pw_count} to track its current position in the
+@code{_pw_bycount} array:
+
+@cindex @code{getpwent()} user-defined function
+@example
+@c file eg/lib/passwdawk.in
+function getpwent()
+@{
+    _pw_init()
+    if (_pw_count < _pw_total)
+        return _pw_bycount[++_pw_count]
+    return ""
+@}
+@c endfile
+@end example
+
+@cindex @code{endpwent()} function (C library)
+The @code{@w{endpwent()}} function resets @code{@w{_pw_count}} to zero, so that
+subsequent calls to @code{getpwent()} start over again:
+
+@cindex @code{endpwent()} user-defined function
+@example
+@c file eg/lib/passwdawk.in
+function endpwent()
+@{
+    _pw_count = 0
+@}
+@c endfile
+@end example
+
+A conscious design decision in this suite is that each subroutine calls
+@code{@w{_pw_init()}} to initialize the database arrays.
+The overhead of running
+a separate process to generate the user database, and the I/O to scan it,
+are only incurred if the user's main program actually calls one of these
+functions.  If this library file is loaded along with a user's program, but
+none of the routines are ever called, then there is no extra runtime overhead.
+(The alternative is move the body of @code{@w{_pw_init()}} into a
+@code{BEGIN} rule, which always runs @command{pwcat}.  This simplifies the
+code but runs an extra process that may never be needed.)
+
+In turn, calling @code{_pw_init()} is not too expensive, because the
+@code{_pw_inited} variable keeps the program from reading the data more than
+once.  If you are worried about squeezing every last cycle out of your
+@command{awk} program, the check of @code{_pw_inited} could be moved out of
+@code{_pw_init()} and duplicated in all the other functions.  In practice,
+this is not necessary, as most @command{awk} programs are I/O-bound,
+and such a change would clutter up the code.
+
+The @command{id} program in @ref{Id Program}
+uses these functions.
+
+@node Group Functions
+@section Reading the Group Database
+
+@cindex libraries of @command{awk} functions, group database, reading
+@cindex functions, library, group database@comma{} reading
+@cindex group database, reading
+@cindex database, group, reading
+@cindex @code{PROCINFO} array, group membership and
+@cindex @code{getgrent()} function (C library)
+@cindex @code{getgrent()} user-defined function
+@cindex groups@comma{} information about
+@cindex account information
+@cindex group file
+@cindex files, group
+Much of the discussion presented in
+@ref{Passwd Functions}
+applies to the group database as well.  Although there has traditionally
+been a well-known file (@file{/etc/group}) in a well-known format, the POSIX
+standard only provides a set of C library routines
+(@code{<grp.h>} and @code{getgrent()})
+for accessing the information.
+Even though this file may exist, it may not have
+complete information.  Therefore, as with the user database, it is necessary
+to have a small C program that generates the group database as its output.
+@command{grcat}, a C program that ``cats'' the group database,
+is as follows:
+
+@cindex @command{grcat} program
+@example
+@c file eg/lib/grcat.c
+/*
+ * grcat.c
+ *
+ * Generate a printable version of the group database.
+ */
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+/*
+ * Arnold Robbins, arnold@@skeeve.com, May 1993
+ * Public Domain
+ * December 2010, move to ANSI C definition for main().
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined (STDC_HEADERS)
+#include <stdlib.h>
+#endif
+
+#ifndef HAVE_GETGRENT
+int main() { return 0; }
+#else
+@c endfile
+@end ignore
+@c file eg/lib/grcat.c
+#include <stdio.h>
+#include <grp.h>
+
+int
+main(int argc, char **argv)
+@{
+    struct group *g;
+    int i;
+
+    while ((g = getgrent()) != NULL) @{
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+#ifdef HAVE_STRUCT_GROUP_GR_PASSWD
+@c endfile
+@end ignore
+@c file eg/lib/grcat.c
+        printf("%s:%s:%ld:", g->gr_name, g->gr_passwd,
+                                     (long) g->gr_gid);
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+#else
+        printf("%s:*:%ld:", g->gr_name, (long) g->gr_gid);
+#endif
+@c endfile
+@end ignore
+@c file eg/lib/grcat.c
+        for (i = 0; g->gr_mem[i] != NULL; i++) @{
+            printf("%s", g->gr_mem[i]);
+@group
+            if (g->gr_mem[i+1] != NULL)
+                putchar(',');
+        @}
+@end group
+        putchar('\n');
+    @}
+    endgrent();
+    return 0;
+@}
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+#endif /* HAVE_GETGRENT */
+@c endfile
+@end ignore
+@end example
+
+Each line in the group database represents one group.  The fields are
+separated with colons and represent the following information:
+
+@table @asis
+@item Group Name
+The group's name.
+
+@item Group Password
+The group's encrypted password. In practice, this field is never used;
+it is usually empty or set to @samp{*}.
+
+@item Group ID Number
+The group's numeric group ID number;
+the association of name to number must be unique within the file.
+(On some systems it's a C @code{long}, and not an @code{int}.  Thus,
+we cast it to @code{long} for all cases.)
+
+@item Group Member List
+A comma-separated list of usernames.  These users are members of the group.
+Modern Unix systems allow users to be members of several groups
+simultaneously.  If your system does, then there are elements
+@code{"group1"} through @code{"group@var{N}"} in @code{PROCINFO}
+for those group ID numbers.
+(Note that @code{PROCINFO} is a @command{gawk} extension;
+@pxref{Built-in Variables}.)
+@end table
+
+Here is what running @command{grcat} might produce:
+
+@example
+$ @kbd{grcat}
+@print{} wheel:*:0:arnold
+@print{} nogroup:*:65534:
+@print{} daemon:*:1:
+@print{} kmem:*:2:
+@print{} staff:*:10:arnold,miriam,andy
+@print{} other:*:20:
+@dots{}
+@end example
+
+Here are the functions for obtaining information from the group database.
+There are several, modeled after the C library functions of the same names:
+
+@cindex @code{getline} command, @code{_gr_init()} user-defined function
+@cindex @code{_gr_init()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+# group.awk --- functions for dealing with the group file
+@c endfile
+@ignore
+@c file eg/lib/groupawk.in
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+@c endfile
+@end ignore
+@c line break on _gr_init for smallbook
+@c file eg/lib/groupawk.in
+
+BEGIN @{
+    # Change to suit your system
+    _gr_awklib = "/usr/local/libexec/awk/"
+@}
+
+function _gr_init(    oldfs, oldrs, olddol0, grcat,
+                             using_fw, using_fpat, n, a, i)
+@{
+    if (_gr_inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    grcat = _gr_awklib "grcat"
+    while ((grcat | getline) > 0) @{
+        if ($1 in _gr_byname)
+            _gr_byname[$1] = _gr_byname[$1] "," $4
+        else
+            _gr_byname[$1] = $0
+        if ($3 in _gr_bygid)
+            _gr_bygid[$3] = _gr_bygid[$3] "," $4
+        else
+            _gr_bygid[$3] = $0
+
+        n = split($4, a, "[ \t]*,[ \t]*")
+        for (i = 1; i <= n; i++)
+            if (a[i] in _gr_groupsbyuser)
+                _gr_groupsbyuser[a[i]] = _gr_groupsbyuser[a[i]] " " $1
+            else
+                _gr_groupsbyuser[a[i]] = $1
+
+        _gr_bycount[++_gr_count] = $0
+    @}
+    close(grcat)
+    _gr_count = 0
+    _gr_inited++
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+@}
+@c endfile
+@end example
+
+The @code{BEGIN} rule sets a private variable to the directory where
+@command{grcat} is stored.  Because it is used to help out an @command{awk} library
+routine, we have chosen to put it in @file{/usr/local/libexec/awk}.  You might
+want it to be in a different directory on your system.
+
+These routines follow the same general outline as the user database routines
+(@pxref{Passwd Functions}).
+The @code{@w{_gr_inited}} variable is used to
+ensure that the database is scanned no more than once.
+The @code{@w{_gr_init()}} function first saves @code{FS},
+@code{RS}, and
+@code{$0}, and then sets @code{FS} and @code{RS} to the correct values for
+scanning the group information.
+It also takes care to note whether @code{FIELDWIDTHS} or @code{FPAT}
+is being used, and to restore the appropriate field-splitting mechanism.
+
+The group information is stored in several associative arrays.
+The arrays are indexed by group name (@code{@w{_gr_byname}}), by group ID number
+(@code{@w{_gr_bygid}}), and by position in the database (@code{@w{_gr_bycount}}).
+There is an additional array indexed by username (@code{@w{_gr_groupsbyuser}}),
+which is a space-separated list of groups to which each user belongs.
+
+Unlike in the user database, it is possible to have multiple records in the
+database for the same group.  This is common when a group has a large number
+of members.  A pair of such entries might look like the following:
+
+@example
+tvpeople:*:101:johnny,jay,arsenio
+tvpeople:*:101:david,conan,tom,joan
+@end example
+
+For this reason, @code{_gr_init()} looks to see if a group name or
+group ID number is already seen.  If so, the usernames are
+simply concatenated onto the previous list of users.@footnote{There is a
+subtle problem with the code just presented.  Suppose that
+the first time there were no names. This code adds the names with
+a leading comma. It also doesn't check that there is a @code{$4}.}
+
+Finally, @code{_gr_init()} closes the pipeline to @command{grcat}, restores
+@code{FS} (and @code{FIELDWIDTHS} or @code{FPAT}, if necessary), @code{RS}, and @code{$0},
+initializes @code{_gr_count} to zero
+(it is used later), and makes @code{_gr_inited} nonzero.
+
+@cindex @code{getgrnam()} function (C library)
+The @code{getgrnam()} function takes a group name as its argument, and if that
+group exists, it is returned.
+Otherwise, it
+relies on the array reference to a nonexistent
+element to create the element with the null string as its value:
+
+@cindex @code{getgrnam()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+function getgrnam(group)
+@{
+    _gr_init()
+    return _gr_byname[group]
+@}
+@c endfile
+@end example
+
+@cindex @code{getgrgid()} function (C library)
+The @code{getgrgid()} function is similar; it takes a numeric group ID and
+looks up the information associated with that group ID:
+
+@cindex @code{getgrgid()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+function getgrgid(gid)
+@{
+    _gr_init()
+    return _gr_bygid[gid]
+@}
+@c endfile
+@end example
+
+@cindex @code{getgruser()} function (C library)
+The @code{getgruser()} function does not have a C counterpart. It takes a
+username and returns the list of groups that have the user as a member:
+
+@cindex @code{getgruser()} function, user-defined
+@example
+@c file eg/lib/groupawk.in
+function getgruser(user)
+@{
+    _gr_init()
+    return _gr_groupsbyuser[user]
+@}
+@c endfile
+@end example
+
+@cindex @code{getgrent()} function (C library)
+The @code{getgrent()} function steps through the database one entry at a time.
+It uses @code{_gr_count} to track its position in the list:
+
+@cindex @code{getgrent()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+function getgrent()
+@{
+    _gr_init()
+    if (++_gr_count in _gr_bycount)
+        return _gr_bycount[_gr_count]
+@group
+    return ""
+@}
+@end group
+@c endfile
+@end example
+
+@cindex @code{endgrent()} function (C library)
+The @code{endgrent()} function resets @code{_gr_count} to zero so that @code{getgrent()} can
+start over again:
+
+@cindex @code{endgrent()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+function endgrent()
+@{
+    _gr_count = 0
+@}
+@c endfile
+@end example
+
+As with the user database routines, each function calls @code{_gr_init()} to
+initialize the arrays.  Doing so only incurs the extra overhead of running
+@command{grcat} if these functions are used (as opposed to moving the body of
+@code{_gr_init()} into a @code{BEGIN} rule).
+
+Most of the work is in scanning the database and building the various
+associative arrays.  The functions that the user calls are themselves very
+simple, relying on @command{awk}'s associative arrays to do work.
+
+The @command{id} program in @ref{Id Program}
+uses these functions.
+
+@node Walking Arrays
+@section Traversing Arrays of Arrays
+
+@ref{Arrays of Arrays} described how @command{gawk}
+provides arrays of arrays.  In particular, any element of
+an array may be either a scalar or another array. The
+@code{isarray()} function (@pxref{Type Functions})
+lets you distinguish an array
+from a scalar.
+The following function, @code{walk_array()}, recursively traverses
+an array, printing the element indices and values.
+You call it with the array and a string representing the name
+of the array:
+
+@cindex @code{walk_array()} user-defined function
+@example
+@c file eg/lib/walkarray.awk
+function walk_array(arr, name,      i)
+@{
+    for (i in arr) @{
+        if (isarray(arr[i]))
+            walk_array(arr[i], (name "[" i "]"))
+        else
+            printf("%s[%s] = %s\n", name, i, arr[i])
+    @}
+@}
+@c endfile
+@end example
+
+@noindent
+It works by looping over each element of the array. If any given
+element is itself an array, the function calls itself recursively,
+passing the subarray and a new string representing the current index.
+Otherwise, the function simply prints the element's name, index, and value.
+Here is a main program to demonstrate:
+
+@example
+BEGIN @{
+    a[1] = 1
+    a[2][1] = 21
+    a[2][2] = 22
+    a[3] = 3
+    a[4][1][1] = 411
+    a[4][2] = 42
+
+    walk_array(a, "a")
+@}
+@end example
+
+When run, the program produces the following output:
+
+@example
+$ @kbd{gawk -f walk_array.awk}
+@print{} a[1] = 1
+@print{} a[2][1] = 21
+@print{} a[2][2] = 22
+@print{} a[3] = 3
+@print{} a[4][1][1] = 411
+@print{} a[4][2] = 42
+@end example
+
+The function just presented simply prints the
+name and value of each scalar array element. However, it is easy to
+generalize it, by passing in the name of a function to call
+when walking an array. The modified function looks like this:
+
+@example
+@c file eg/lib/processarray.awk
+function process_array(arr, name, process, do_arrays,   i, new_name)
+@{
+    for (i in arr) @{
+        new_name = (name "[" i "]")
+        if (isarray(arr[i])) @{
+            if (do_arrays)
+                @@process(new_name, arr[i])
+            process_array(arr[i], new_name, process, do_arrays)
+        @} else
+            @@process(new_name, arr[i])
+    @}
+@}
+@c endfile
+@end example
+
+The arguments are as follows:
+
+@table @code
+@item arr
+The array.
+
+@item name
+The name of the array (a string).
+
+@item process
+The name of the function to call.
+
+@item do_arrays
+If this is true, the function can handle elements that are subarrays.
+@end table
+
+If subarrays are to be processed, that is done before walking them further.
+
+When run with the following scaffolding, the function produces the same
+results as does the earlier version of @code{walk_array()}:
+
+@example
+BEGIN @{
+    a[1] = 1
+    a[2][1] = 21
+    a[2][2] = 22
+    a[3] = 3
+    a[4][1][1] = 411
+    a[4][2] = 42
+
+    process_array(a, "a", "do_print", 0)
+@}
+
+function do_print(name, element)
+@{
+    printf "%s = %s\n", name, element
+@}
+@end example
+
+@node Library Functions Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Reading programs is an excellent way to learn Good Programming.
+The functions and programs provided in this @value{CHAPTER} and the next
+are intended to serve that purpose.
+
+@item
+When writing general-purpose library functions, put some thought into how
+to name any global variables so that they won't conflict with variables
+from a user's program.
+
+@item
+The functions presented here fit into the following categories:
+
+@c nested list
+@table @asis
+@item General problems
+Number-to-string conversion, testing assertions, rounding, random number
+generation, converting characters to numbers, joining strings, getting
+easily usable time-of-day information, and reading a whole file in
+one shot
+
+@item Managing @value{DF}s
+Noting @value{DF} boundaries, rereading the current file, checking for
+readable files, checking for zero-length files, and treating assignments
+as @value{FN}s
+
+@item Processing command-line options
+An @command{awk} version of the standard C @code{getopt()} function
+
+@item Reading the user and group databases
+Two sets of routines that parallel the C library versions
+
+@item Traversing arrays of arrays
+Two functions that traverse an array of arrays to any depth
+@end table
+@c end nested list
+
+@end itemize
+
+@c EXCLUDE START
+@node Library Exercises
+@section Exercises
+
+@enumerate
+@item
+In @ref{Empty Files}, we presented the @file{zerofile.awk} program,
+which made use of @command{gawk}'s @code{ARGIND} variable.  Can this
+problem be solved without relying on @code{ARGIND}?  If so, how?
+
+@ignore
+# zerofile2.awk --- same thing, portably
+
+BEGIN @{
+    ARGIND = Argind = 0
+    for (i = 1; i < ARGC; i++)
+        Fnames[ARGV[i]]++
+
+@}
+FNR == 1 @{
+    while (ARGV[ARGIND] != FILENAME)
+        ARGIND++
+    Seen[FILENAME]++
+    if (Seen[FILENAME] == Fnames[FILENAME])
+        do
+            ARGIND++
+        while (ARGV[ARGIND] != FILENAME)
+@}
+ARGIND > Argind + 1 @{
+    for (Argind++; Argind < ARGIND; Argind++)
+        zerofile(ARGV[Argind], Argind)
+@}
+ARGIND != Argind @{
+    Argind = ARGIND
+@}
+END @{
+    if (ARGIND < ARGC - 1)
+        ARGIND = ARGC - 1
+    if (ARGIND > Argind)
+        for (Argind++; Argind <= ARGIND; Argind++)
+            zerofile(ARGV[Argind], Argind)
+@}
+@end ignore
+
+@item
+As a related challenge, revise that code to handle the case where
+an intervening value in @code{ARGV} is a variable assignment.
+
+@ignore
+@c June 13 2015: Antonio points out that this is answered in the text. Ooops.
+@item
+@ref{Walking Arrays} presented a function that walked a multidimensional
+array to print it out.  However, walking an array and processing
+each element is a general-purpose operation.  Generalize the
+@code{walk_array()} function by adding an additional parameter named
+@code{process}.
+
+Then, inside the loop, instead of printing the array element's index and
+value, use the indirect function call syntax (@pxref{Indirect Calls})
+on @code{process}, passing it the index and the value.
+
+When calling @code{walk_array()}, you would pass the name of a
+user-defined function that expects to receive an index and a value,
+and then processes the element.
+
+Test your new version by printing the array; you should end up with
+output identical to that of the original version.
+@end ignore
+
+@end enumerate
+@c EXCLUDE END
+
+
+@node Sample Programs
+@chapter Practical @command{awk} Programs
+@cindex @command{awk} programs, examples of
+
+@c FULLXREF ON
+@ref{Library Functions},
+presents the idea that reading programs in a language contributes to
+learning that language.  This @value{CHAPTER} continues that theme,
+presenting a potpourri of @command{awk} programs for your reading
+enjoyment.
+@c FULLXREF OFF
+@ifnotinfo
+There are three @value{SECTION}s.
+The first describes how to run the programs presented
+in this @value{CHAPTER}.
+
+The second presents @command{awk}
+versions of several common POSIX utilities.
+These are programs that you are hopefully already familiar with,
+and therefore whose problems are understood.
+By reimplementing these programs in @command{awk},
+you can focus on the @command{awk}-related aspects of solving
+the programming problems.
+
+The third is a grab bag of interesting programs.
+These solve a number of different data-manipulation and management
+problems.  Many of the programs are short, which emphasizes @command{awk}'s
+ability to do a lot in just a few lines of code.
+@end ifnotinfo
+
+Many of these programs use library functions presented in
+@ref{Library Functions}.
+
+@menu
+* Running Examples::            How to run these examples.
+* Clones::                      Clones of common utilities.
+* Miscellaneous Programs::      Some interesting @command{awk} programs.
+* Programs Summary::            Summary of programs.
+* Programs Exercises::          Exercises.
+@end menu
+
+@node Running Examples
+@section Running the Example Programs
+
+To run a given program, you would typically do something like this:
+
+@example
+awk -f @var{program} -- @var{options} @var{files}
+@end example
+
+@noindent
+Here, @var{program} is the name of the @command{awk} program (such as
+@file{cut.awk}), @var{options} are any command-line options for the
+program that start with a @samp{-}, and @var{files} are the actual @value{DF}s.
+
+If your system supports the @samp{#!} executable interpreter mechanism
+(@pxref{Executable Scripts}),
+you can instead run your program directly:
+
+@example
+cut.awk -c1-8 myfiles > results
+@end example
+
+If your @command{awk} is not @command{gawk}, you may instead need to use this:
+
+@example
+cut.awk -- -c1-8 myfiles > results
+@end example
+
+@node Clones
+@section Reinventing Wheels for Fun and Profit
+@cindex POSIX, programs@comma{} implementing in @command{awk}
+
+This @value{SECTION} presents a number of POSIX utilities implemented in
+@command{awk}.  Reinventing these programs in @command{awk} is often enjoyable,
+because the algorithms can be very clearly expressed, and the code is usually
+very concise and simple.  This is true because @command{awk} does so much for you.
+
+It should be noted that these programs are not necessarily intended to
+replace the installed versions on your system.
+Nor may all of these programs be fully compliant with the most recent
+POSIX standard.  This is not a problem; their
+purpose is to illustrate @command{awk} language programming for ``real-world''
+tasks.
+
+The programs are presented in alphabetical order.
+
+@menu
+* Cut Program::                 The @command{cut} utility.
+* Egrep Program::               The @command{egrep} utility.
+* Id Program::                  The @command{id} utility.
+* Split Program::               The @command{split} utility.
+* Tee Program::                 The @command{tee} utility.
+* Uniq Program::                The @command{uniq} utility.
+* Wc Program::                  The @command{wc} utility.
+@end menu
+
+@node Cut Program
+@subsection Cutting Out Fields and Columns
+
+@cindex @command{cut} utility
+@cindex @command{cut} utility
+@cindex fields, cutting
+@cindex columns, cutting
+The @command{cut} utility selects, or ``cuts,'' characters or fields
+from its standard input and sends them to its standard output.
+Fields are separated by TABs by default,
+but you may supply a command-line option to change the field
+@dfn{delimiter} (i.e., the field-separator character). @command{cut}'s
+definition of fields is less general than @command{awk}'s.
+
+A common use of @command{cut} might be to pull out just the login names of
+logged-on users from the output of @command{who}.  For example, the following
+pipeline generates a sorted, unique list of the logged-on users:
+
+@example
+who | cut -c1-8 | sort | uniq
+@end example
+
+The options for @command{cut} are:
+
+@table @code
+@item -c @var{list}
+Use @var{list} as the list of characters to cut out.  Items within the list
+may be separated by commas, and ranges of characters can be separated with
+dashes.  The list @samp{1-8,15,22-35} specifies characters 1 through
+8, 15, and 22 through 35.
+
+@item -f @var{list}
+Use @var{list} as the list of fields to cut out.
+
+@item -d @var{delim}
+Use @var{delim} as the field-separator character instead of the TAB
+character.
+
+@item -s
+Suppress printing of lines that do not contain the field delimiter.
+@end table
+
+The @command{awk} implementation of @command{cut} uses the @code{getopt()} library
+function (@pxref{Getopt Function})
+and the @code{join()} library function
+(@pxref{Join Function}).
+
+The program begins with a comment describing the options, the library
+functions needed, and a @code{usage()} function that prints out a usage
+message and exits.  @code{usage()} is called if invalid arguments are
+supplied:
+
+@cindex @code{cut.awk} program
+@example
+@c file eg/prog/cut.awk
+# cut.awk --- implement cut in awk
+@c endfile
+@ignore
+@c file eg/prog/cut.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/cut.awk
+
+# Options:
+#    -f list     Cut fields
+#    -d c        Field delimiter character
+#    -c list     Cut characters
+#
+#    -s          Suppress lines without the delimiter
+#
+# Requires getopt() and join() library functions
+
+@group
+function usage()
+@{
+    print("usage: cut [-f list] [-d c] [-s] [files...]") > "/dev/stderr"
+    print("usage: cut [-c list] [files...]") > "/dev/stderr"
+    exit 1
+@}
+@end group
+@c endfile
+@end example
+
+@cindex @code{BEGIN} pattern, running @command{awk} programs and
+@cindex @code{FS} variable, running @command{awk} programs and
+Next comes a @code{BEGIN} rule that parses the command-line options.
+It sets @code{FS} to a single TAB character, because that is @command{cut}'s
+default field separator. The rule then sets the output field separator to be the
+same as the input field separator.  A loop using @code{getopt()} steps
+through the command-line options.  Exactly one of the variables
+@code{by_fields} or @code{by_chars} is set to true, to indicate that
+processing should be done by fields or by characters, respectively.
+When cutting by characters, the output field separator is set to the null
+string:
+
+@example
+@c file eg/prog/cut.awk
+BEGIN @{
+    FS = "\t"    # default
+    OFS = FS
+    while ((c = getopt(ARGC, ARGV, "sf:c:d:")) != -1) @{
+        if (c == "f") @{
+            by_fields = 1
+            fieldlist = Optarg
+        @} else if (c == "c") @{
+            by_chars = 1
+            fieldlist = Optarg
+            OFS = ""
+        @} else if (c == "d") @{
+            if (length(Optarg) > 1) @{
+                printf("cut: using first character of %s" \
+                       " for delimiter\n", Optarg) > "/dev/stderr"
+                Optarg = substr(Optarg, 1, 1)
+            @}
+            fs = FS = Optarg
+            OFS = FS
+            if (FS == " ")    # defeat awk semantics
+                FS = "[ ]"
+        @} else if (c == "s")
+            suppress = 1
+        else
+            usage()
+    @}
+
+    # Clear out options
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+@c endfile
+@end example
+
+@cindex field separators, spaces as
+The code must take
+special care when the field delimiter is a space.  Using
+a single space (@code{@w{" "}}) for the value of @code{FS} is
+incorrect---@command{awk} would separate fields with runs of spaces,
+TABs, and/or newlines, and we want them to be separated with individual
+spaces.
+To this end, we save the original space character in the variable
+@code{fs} for later use; after setting @code{FS} to @code{"[ ]"} we can't
+use it directly to see if the field delimiter character is in the string.
+
+Also remember that after @code{getopt()} is through
+(as described in @ref{Getopt Function}),
+we have to
+clear out all the elements of @code{ARGV} from 1 to @code{Optind},
+so that @command{awk} does not try to process the command-line options
+as @value{FN}s.
+
+After dealing with the command-line options, the program verifies that the
+options make sense.  Only one or the other of @option{-c} and @option{-f}
+should be used, and both require a field list.  Then the program calls
+either @code{set_fieldlist()} or @code{set_charlist()} to pull apart the
+list of fields or characters:
+
+@example
+@c file eg/prog/cut.awk
+    if (by_fields && by_chars)
+        usage()
+
+    if (by_fields == 0 && by_chars == 0)
+        by_fields = 1    # default
+
+@group
+    if (fieldlist == "") @{
+        print "cut: needs list for -c or -f" > "/dev/stderr"
+        exit 1
+    @}
+@end group
+
+    if (by_fields)
+        set_fieldlist()
+    else
+        set_charlist()
+@}
+@c endfile
+@end example
+
+@code{set_fieldlist()} splits the field list apart at the commas
+into an array.  Then, for each element of the array, it looks to
+see if the element is actually a range, and if so, splits it apart.
+The function checks the range
+to make sure that the first number is smaller than the second.
+Each number in the list is added to the @code{flist} array, which
+simply lists the fields that will be printed.  Normal field splitting
+is used.  The program lets @command{awk} handle the job of doing the
+field splitting:
+
+@example
+@c file eg/prog/cut.awk
+function set_fieldlist(        n, m, i, j, k, f, g)
+@{
+    n = split(fieldlist, f, ",")
+    j = 1    # index in flist
+    for (i = 1; i <= n; i++) @{
+        if (index(f[i], "-") != 0) @{ # a range
+            m = split(f[i], g, "-")
+@group
+            if (m != 2 || g[1] >= g[2]) @{
+                printf("cut: bad field list: %s\n",
+                                  f[i]) > "/dev/stderr"
+                exit 1
+            @}
+@end group
+            for (k = g[1]; k <= g[2]; k++)
+                flist[j++] = k
+        @} else
+            flist[j++] = f[i]
+    @}
+    nfields = j - 1
+@}
+@c endfile
+@end example
+
+The @code{set_charlist()} function is more complicated than
+@code{set_fieldlist()}.
+The idea here is to use @command{gawk}'s @code{FIELDWIDTHS} variable
+(@pxref{Constant Size}),
+which describes constant-width input.  When using a character list, that is
+exactly what we have.
+
+Setting up @code{FIELDWIDTHS} is more complicated than simply listing the
+fields that need to be printed.  We have to keep track of the fields to
+print and also the intervening characters that have to be skipped.
+For example, suppose you wanted characters 1 through 8, 15, and
+22 through 35.  You would use @samp{-c 1-8,15,22-35}.  The necessary value
+for @code{FIELDWIDTHS} is @code{@w{"8 6 1 6 14"}}.  This yields five
+fields, and the fields to print
+are @code{$1}, @code{$3}, and @code{$5}.
+The intermediate fields are @dfn{filler},
+which is stuff in between the desired data.
+@code{flist} lists the fields to print, and @code{t} tracks the
+complete field list, including filler fields:
+
+@example
+@c file eg/prog/cut.awk
+function set_charlist(    field, i, j, f, g, n, m, t,
+                          filler, last, len)
+@{
+    field = 1   # count total fields
+    n = split(fieldlist, f, ",")
+    j = 1       # index in flist
+    for (i = 1; i <= n; i++) @{
+        if (index(f[i], "-") != 0) @{ # range
+            m = split(f[i], g, "-")
+            if (m != 2 || g[1] >= g[2]) @{
+                printf("cut: bad character list: %s\n",
+                               f[i]) > "/dev/stderr"
+                exit 1
+            @}
+            len = g[2] - g[1] + 1
+            if (g[1] > 1)  # compute length of filler
+                filler = g[1] - last - 1
+            else
+                filler = 0
+@group
+            if (filler)
+                t[field++] = filler
+@end group
+            t[field++] = len  # length of field
+            last = g[2]
+            flist[j++] = field - 1
+        @} else @{
+            if (f[i] > 1)
+                filler = f[i] - last - 1
+            else
+                filler = 0
+            if (filler)
+                t[field++] = filler
+            t[field++] = 1
+            last = f[i]
+            flist[j++] = field - 1
+        @}
+    @}
+    FIELDWIDTHS = join(t, 1, field - 1)
+    nfields = j - 1
+@}
+@c endfile
+@end example
+
+Next is the rule that processes the data.  If the @option{-s} option
+is given, then @code{suppress} is true.  The first @code{if} statement
+makes sure that the input record does have the field separator.  If
+@command{cut} is processing fields, @code{suppress} is true, and the field
+separator character is not in the record, then the record is skipped.
+
+If the record is valid, then @command{gawk} has split the data
+into fields, either using the character in @code{FS} or using fixed-length
+fields and @code{FIELDWIDTHS}.  The loop goes through the list of fields
+that should be printed.  The corresponding field is printed if it contains data.
+If the next field also has data, then the separator character is
+written out between the fields:
+
+@example
+@c file eg/prog/cut.awk
+@{
+    if (by_fields && suppress && index($0, fs) == 0)
+        next
+
+    for (i = 1; i <= nfields; i++) @{
+        if ($flist[i] != "") @{
+            printf "%s", $flist[i]
+            if (i < nfields && $flist[i+1] != "")
+                printf "%s", OFS
+        @}
+    @}
+    print ""
+@}
+@c endfile
+@end example
+
+This version of @command{cut} relies on @command{gawk}'s @code{FIELDWIDTHS}
+variable to do the character-based cutting.  It is possible in
+other @command{awk} implementations to use @code{substr()}
+(@pxref{String Functions}), but
+it is also extremely painful.
+The @code{FIELDWIDTHS} variable supplies an elegant solution to the problem
+of picking the input line apart by characters.
+
+
+@node Egrep Program
+@subsection Searching for Regular Expressions in Files
+
+@cindex regular expressions, searching for
+@cindex searching, files for regular expressions
+@cindex files, searching for regular expressions
+@cindex @command{egrep} utility
+The @command{egrep} utility searches files for patterns.  It uses regular
+expressions that are almost identical to those available in @command{awk}
+(@pxref{Regexp}).
+You invoke it as follows:
+
+@display
+@command{egrep} [@var{options}] @code{'@var{pattern}'} @var{files} @dots{}
+@end display
+
+The @var{pattern} is a regular expression.  In typical usage, the regular
+expression is quoted to prevent the shell from expanding any of the
+special characters as @value{FN} wildcards.  Normally, @command{egrep}
+prints the lines that matched.  If multiple @value{FN}s are provided on
+the command line, each output line is preceded by the name of the file
+and a colon.
+
+The options to @command{egrep} are as follows:
+
+@table @code
+@item -c
+Print out a count of the lines that matched the pattern, instead of the
+lines themselves.
+
+@item -s
+Be silent.  No output is produced and the exit value indicates whether
+the pattern was matched.
+
+@item -v
+Invert the sense of the test. @command{egrep} prints the lines that do
+@emph{not} match the pattern and exits successfully if the pattern is not
+matched.
+
+@item -i
+Ignore case distinctions in both the pattern and the input data.
+
+@item -l
+Only print (list) the names of the files that matched, not the lines that matched.
+
+@item -e @var{pattern}
+Use @var{pattern} as the regexp to match.  The purpose of the @option{-e}
+option is to allow patterns that start with a @samp{-}.
+@end table
+
+This version uses the @code{getopt()} library function
+(@pxref{Getopt Function})
+and the file transition library program
+(@pxref{Filetrans Function}).
+
+The program begins with a descriptive comment and then a @code{BEGIN} rule
+that processes the command-line arguments with @code{getopt()}.  The @option{-i}
+(ignore case) option is particularly easy with @command{gawk}; we just use the
+@code{IGNORECASE} predefined variable
+(@pxref{Built-in Variables}):
+
+@cindex @code{egrep.awk} program
+@example
+@c file eg/prog/egrep.awk
+# egrep.awk --- simulate egrep in awk
+#
+@c endfile
+@ignore
+@c file eg/prog/egrep.awk
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+
+@c endfile
+@end ignore
+@c file eg/prog/egrep.awk
+# Options:
+#    -c    count of lines
+#    -s    silent - use exit value
+#    -v    invert test, success if no match
+#    -i    ignore case
+#    -l    print filenames only
+#    -e    argument is pattern
+#
+# Requires getopt and file transition library functions
+
+BEGIN @{
+    while ((c = getopt(ARGC, ARGV, "ce:svil")) != -1) @{
+        if (c == "c")
+            count_only++
+        else if (c == "s")
+            no_print++
+        else if (c == "v")
+            invert++
+        else if (c == "i")
+            IGNORECASE = 1
+        else if (c == "l")
+            filenames_only++
+        else if (c == "e")
+            pattern = Optarg
+        else
+            usage()
+    @}
+@c endfile
+@end example
+
+Next comes the code that handles the @command{egrep}-specific behavior. If no
+pattern is supplied with @option{-e}, the first nonoption on the
+command line is used.  The @command{awk} command-line arguments up to @code{ARGV[Optind]}
+are cleared, so that @command{awk} won't try to process them as files.  If no
+files are specified, the standard input is used, and if multiple files are
+specified, we make sure to note this so that the @value{FN}s can precede the
+matched lines in the output:
+
+@example
+@c file eg/prog/egrep.awk
+    if (pattern == "")
+        pattern = ARGV[Optind++]
+
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+    if (Optind >= ARGC) @{
+        ARGV[1] = "-"
+        ARGC = 2
+    @} else if (ARGC - Optind > 1)
+        do_filenames++
+
+#    if (IGNORECASE)
+#        pattern = tolower(pattern)
+@}
+@c endfile
+@end example
+
+The last two lines are commented out, as they are not needed in
+@command{gawk}.  They should be uncommented if you have to use another version
+of @command{awk}.
+
+The next set of lines should be uncommented if you are not using
+@command{gawk}.  This rule translates all the characters in the input line
+into lowercase if the @option{-i} option is specified.@footnote{It
+also introduces a subtle bug;
+if a match happens, we output the translated line, not the original.}
+The rule is
+commented out as it is not necessary with @command{gawk}:
+
+@example
+@c file eg/prog/egrep.awk
+#@{
+#    if (IGNORECASE)
+#        $0 = tolower($0)
+#@}
+@c endfile
+@end example
+
+The @code{beginfile()} function is called by the rule in @file{ftrans.awk}
+when each new file is processed.  In this case, it is very simple; all it
+does is initialize a variable @code{fcount} to zero. @code{fcount} tracks
+how many lines in the current file matched the pattern.
+Naming the parameter @code{junk} shows we know that @code{beginfile()}
+is called with a parameter, but that we're not interested in its value:
+
+@example
+@c file eg/prog/egrep.awk
+function beginfile(junk)
+@{
+    fcount = 0
+@}
+@c endfile
+@end example
+
+The @code{endfile()} function is called after each file has been processed.
+It affects the output only when the user wants a count of the number of lines that
+matched.  @code{no_print} is true only if the exit status is desired.
+@code{count_only} is true if line counts are desired.  @command{egrep}
+therefore only prints line counts if printing and counting are enabled.
+The output format must be adjusted depending upon the number of files to
+process.  Finally, @code{fcount} is added to @code{total}, so that we
+know the total number of lines that matched the pattern:
+
+@example
+@c file eg/prog/egrep.awk
+function endfile(file)
+@{
+    if (! no_print && count_only) @{
+        if (do_filenames)
+            print file ":" fcount
+        else
+            print fcount
+    @}
+
+@group
+    total += fcount
+@}
+@end group
+@c endfile
+@end example
+
+The @code{BEGINFILE} and @code{ENDFILE} special patterns
+(@pxref{BEGINFILE/ENDFILE}) could be used, but then the program would be
+@command{gawk}-specific. Additionally, this example was written before
+@command{gawk} acquired @code{BEGINFILE} and @code{ENDFILE}.
+
+The following rule does most of the work of matching lines. The variable
+@code{matches} is true if the line matched the pattern. If the user
+wants lines that did not match, the sense of @code{matches} is inverted
+using the @samp{!} operator. @code{fcount} is incremented with the value of
+@code{matches}, which is either one or zero, depending upon a
+successful or unsuccessful match.  If the line does not match, the
+@code{next} statement just moves on to the next record.
+
+A number of additional tests are made, but they are only done if we
+are not counting lines.  First, if the user only wants the exit status
+(@code{no_print} is true), then it is enough to know that @emph{one}
+line in this file matched, and we can skip on to the next file with
+@code{nextfile}.  Similarly, if we are only printing @value{FN}s, we can
+print the @value{FN}, and then skip to the next file with @code{nextfile}.
+Finally, each line is printed, with a leading @value{FN} and colon
+if necessary:
+
+@cindex @code{!} (exclamation point), @code{!} operator
+@cindex exclamation point (@code{!}), @code{!} operator
+@example
+@c file eg/prog/egrep.awk
+@{
+    matches = ($0 ~ pattern)
+    if (invert)
+        matches = ! matches
+
+    fcount += matches    # 1 or 0
+
+    if (! matches)
+        next
+
+    if (! count_only) @{
+        if (no_print)
+            nextfile
+
+        if (filenames_only) @{
+            print FILENAME
+            nextfile
+        @}
+
+        if (do_filenames)
+            print FILENAME ":" $0
+        else
+            print
+    @}
+@}
+@c endfile
+@end example
+
+The @code{END} rule takes care of producing the correct exit status. If
+there are no matches, the exit status is one; otherwise, it is zero:
+
+@example
+@c file eg/prog/egrep.awk
+END @{
+    exit (total == 0)
+@}
+@c endfile
+@end example
+
+The @code{usage()} function prints a usage message in case of invalid options,
+and then exits:
+
+@example
+@c file eg/prog/egrep.awk
+function usage()
+@{
+    print("Usage: egrep [-csvil] [-e pat] [files ...]") > "/dev/stderr"
+    print("\n\tegrep [-csvil] pat [files ...]") > "/dev/stderr"
+    exit 1
+@}
+@c endfile
+@end example
+
+
+@node Id Program
+@subsection Printing Out User Information
+
+@cindex printing, user information
+@cindex users, information about, printing
+@cindex @command{id} utility
+The @command{id} utility lists a user's real and effective user ID numbers,
+real and effective group ID numbers, and the user's group set, if any.
+@command{id} only prints the effective user ID and group ID if they are
+different from the real ones.  If possible, @command{id} also supplies the
+corresponding user and group names.  The output might look like this:
+
+@example
+$ @kbd{id}
+@print{} uid=1000(arnold) gid=1000(arnold) groups=1000(arnold),4(adm),7(lp),27(sudo)
+@end example
+
+@cindex @code{PROCINFO} array, user and group ID numbers and
+This information is part of what is provided by @command{gawk}'s
+@code{PROCINFO} array (@pxref{Built-in Variables}).
+However, the @command{id} utility provides a more palatable output than just
+individual numbers.
+
+Here is a simple version of @command{id} written in @command{awk}.
+It uses the user database library functions
+(@pxref{Passwd Functions})
+and the group database library functions
+(@pxref{Group Functions})
+from @ref{Library Functions}.
+
+The program is fairly straightforward.  All the work is done in the
+@code{BEGIN} rule.  The user and group ID numbers are obtained from
+@code{PROCINFO}.
+The code is repetitive.  The entry in the user database for the real user ID
+number is split into parts at the @samp{:}. The name is the first field.
+Similar code is used for the effective user ID number and the group
+numbers:
+
+@cindex @code{id.awk} program
+@example
+@c file eg/prog/id.awk
+# id.awk --- implement id in awk
+#
+# Requires user and group library functions
+@c endfile
+@ignore
+@c file eg/prog/id.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised February 1996
+# Revised May 2014
+# Revised September 2014
+
+@c endfile
+@end ignore
+@c file eg/prog/id.awk
+# output is:
+# uid=12(foo) euid=34(bar) gid=3(baz) \
+#             egid=5(blat) groups=9(nine),2(two),1(one)
+
+@group
+BEGIN @{
+    uid = PROCINFO["uid"]
+    euid = PROCINFO["euid"]
+    gid = PROCINFO["gid"]
+    egid = PROCINFO["egid"]
+@end group
+
+    printf("uid=%d", uid)
+    pw = getpwuid(uid)
+    pr_first_field(pw)
+
+@group
+    if (euid != uid) @{
+        printf(" euid=%d", euid)
+        pw = getpwuid(euid)
+@end group
+@group
+        pr_first_field(pw)
+    @}
+@end group
+
+    printf(" gid=%d", gid)
+    pw = getgrgid(gid)
+    pr_first_field(pw)
+
+    if (egid != gid) @{
+        printf(" egid=%d", egid)
+        pw = getgrgid(egid)
+        pr_first_field(pw)
+    @}
+
+    for (i = 1; ("group" i) in PROCINFO; i++) @{
+        if (i == 1)
+            printf(" groups=")
+        group = PROCINFO["group" i]
+        printf("%d", group)
+        pw = getgrgid(group)
+        pr_first_field(pw)
+        if (("group" (i+1)) in PROCINFO)
+            printf(",")
+    @}
+
+    print ""
+@}
+
+function pr_first_field(str,  a)
+@{
+    if (str != "") @{
+        split(str, a, ":")
+        printf("(%s)", a[1])
+    @}
+@}
+@c endfile
+@end example
+
+The test in the @code{for} loop is worth noting.
+Any supplementary groups in the @code{PROCINFO} array have the
+indices @code{"group1"} through @code{"group@var{N}"} for some
+@var{N} (i.e., the total number of supplementary groups).
+However, we don't know in advance how many of these groups
+there are.
+
+This loop works by starting at one, concatenating the value with
+@code{"group"}, and then using @code{in} to see if that value is
+in the array (@pxref{Reference to Elements}).  Eventually, @code{i} is incremented past
+the last group in the array and the loop exits.
+
+The loop is also correct if there are @emph{no} supplementary
+groups; then the condition is false the first time it's
+tested, and the loop body never executes.
+
+The @code{pr_first_field()} function simply isolates out some
+code that is used repeatedly, making the whole program
+shorter and cleaner. In particular, moving the check for
+the empty string into this function saves several lines of code.
+
+
+@node Split Program
+@subsection Splitting a Large File into Pieces
+
+@c FIXME: One day, update to current POSIX version of split
+
+@cindex files, splitting
+@cindex @code{split} utility
+The @command{split} program splits large text files into smaller pieces.
+Usage is as follows:@footnote{This is the traditional usage. The
+POSIX usage is different, but not relevant for what the program
+aims to demonstrate.}
+
+@display
+@command{split} [@code{-@var{count}}] [@var{file}] [@var{prefix}]
+@end display
+
+By default,
+the output files are named @file{xaa}, @file{xab}, and so on. Each file has
+1,000 lines in it, with the likely exception of the last file. To change the
+number of lines in each file, supply a number on the command line
+preceded with a minus sign (e.g., @samp{-500} for files with 500 lines in them
+instead of 1,000).  To change the names of the output files to something like
+@file{myfileaa}, @file{myfileab}, and so on, supply an additional
+argument that specifies the @value{FN} prefix.
+
+Here is a version of @command{split} in @command{awk}. It uses the
+@code{ord()} and @code{chr()} functions presented in
+@ref{Ordinal Functions}.
+
+The program first sets its defaults, and then tests to make sure there are
+not too many arguments.  It then looks at each argument in turn.  The
+first argument could be a minus sign followed by a number. If it is, this happens
+to look like a negative number, so it is made positive, and that is the
+count of lines.  The @value{DF} name is skipped over and the final argument
+is used as the prefix for the output @value{FN}s:
+
+@cindex @code{split.awk} program
+@example
+@c file eg/prog/split.awk
+# split.awk --- do split in awk
+#
+# Requires ord() and chr() library functions
+@c endfile
+@ignore
+@c file eg/prog/split.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised slightly, May 2014
+
+@c endfile
+@end ignore
+@c file eg/prog/split.awk
+# usage: split [-count] [file] [outname]
+
+BEGIN @{
+    outfile = "x"    # default
+    count = 1000
+    if (ARGC > 4)
+        usage()
+
+    i = 1
+    if (i in ARGV && ARGV[i] ~ /^-[[:digit:]]+$/) @{
+        count = -ARGV[i]
+        ARGV[i] = ""
+        i++
+    @}
+    # test argv in case reading from stdin instead of file
+    if (i in ARGV)
+        i++    # skip datafile name
+@group
+    if (i in ARGV) @{
+        outfile = ARGV[i]
+        ARGV[i] = ""
+    @}
+@end group
+@group
+    s1 = s2 = "a"
+    out = (outfile s1 s2)
+@}
+@end group
+@c endfile
+@end example
+
+The next rule does most of the work. @code{tcount} (temporary count) tracks
+how many lines have been printed to the output file so far. If it is greater
+than @code{count}, it is time to close the current file and start a new one.
+@code{s1} and @code{s2} track the current suffixes for the @value{FN}. If
+they are both @samp{z}, the file is just too big.  Otherwise, @code{s1}
+moves to the next letter in the alphabet and @code{s2} starts over again at
+@samp{a}:
+
+@c else on separate line here for page breaking
+@example
+@c file eg/prog/split.awk
+@{
+    if (++tcount > count) @{
+        close(out)
+        if (s2 == "z") @{
+            if (s1 == "z") @{
+                printf("split: %s is too large to split\n",
+                       FILENAME) > "/dev/stderr"
+                exit 1
+            @}
+            s1 = chr(ord(s1) + 1)
+            s2 = "a"
+        @}
+@group
+        else
+            s2 = chr(ord(s2) + 1)
+@end group
+        out = (outfile s1 s2)
+        tcount = 1
+    @}
+    print > out
+@}
+@c endfile
+@end example
+
+@noindent
+The @code{usage()} function simply prints an error message and exits:
+
+@example
+@c file eg/prog/split.awk
+function usage()
+@{
+    print("usage: split [-num] [file] [outname]") > "/dev/stderr"
+    exit 1
+@}
+@c endfile
+@end example
+
+This program is a bit sloppy; it relies on @command{awk} to automatically close the last file
+instead of doing it in an @code{END} rule.
+It also assumes that letters are contiguous in the character set,
+which isn't true for EBCDIC systems.
+
+@ifset FOR_PRINT
+You might want to consider how to eliminate the use of
+@code{ord()} and @code{chr()}; this can be done in such a
+way as to solve the EBCDIC issue as well.
+@end ifset
+
+
+@node Tee Program
+@subsection Duplicating Output into Multiple Files
+
+@cindex files, multiple@comma{} duplicating output into
+@cindex output, duplicating into files
+@cindex @code{tee} utility
+The @code{tee} program is known as a ``pipe fitting.''  @code{tee} copies
+its standard input to its standard output and also duplicates it to the
+files named on the command line.  Its usage is as follows:
+
+@display
+@command{tee} [@option{-a}] @var{file} @dots{}
+@end display
+
+The @option{-a} option tells @code{tee} to append to the named files, instead of
+truncating them and starting over.
+
+The @code{BEGIN} rule first makes a copy of all the command-line arguments
+into an array named @code{copy}.
+@code{ARGV[0]} is not needed, so it is not copied.
+@code{tee} cannot use @code{ARGV} directly, because @command{awk} attempts to
+process each @value{FN} in @code{ARGV} as input data.
+
+@cindex flag variables
+If the first argument is @option{-a}, then the flag variable
+@code{append} is set to true, and both @code{ARGV[1]} and
+@code{copy[1]} are deleted. If @code{ARGC} is less than two, then no
+@value{FN}s were supplied and @code{tee} prints a usage message and exits.
+Finally, @command{awk} is forced to read the standard input by setting
+@code{ARGV[1]} to @code{"-"} and @code{ARGC} to two:
+
+@cindex @code{tee.awk} program
+@example
+@c file eg/prog/tee.awk
+# tee.awk --- tee in awk
+#
+# Copy standard input to all named output files.
+# Append content if -a option is supplied.
+#
+@c endfile
+@ignore
+@c file eg/prog/tee.awk
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised December 1995
+
+@c endfile
+@end ignore
+@c file eg/prog/tee.awk
+BEGIN @{
+    for (i = 1; i < ARGC; i++)
+        copy[i] = ARGV[i]
+
+    if (ARGV[1] == "-a") @{
+        append = 1
+        delete ARGV[1]
+        delete copy[1]
+        ARGC--
+    @}
+    if (ARGC < 2) @{
+        print "usage: tee [-a] file ..." > "/dev/stderr"
+        exit 1
+    @}
+    ARGV[1] = "-"
+    ARGC = 2
+@}
+@c endfile
+@end example
+
+The following single rule does all the work.  Because there is no pattern, it is
+executed for each line of input.  The body of the rule simply prints the
+line into each file on the command line, and then to the standard output:
+
+@example
+@c file eg/prog/tee.awk
+@{
+    # moving the if outside the loop makes it run faster
+    if (append)
+        for (i in copy)
+            print >> copy[i]
+    else
+        for (i in copy)
+            print > copy[i]
+    print
+@}
+@c endfile
+@end example
+
+@noindent
+It is also possible to write the loop this way:
+
+@example
+@group
+for (i in copy)
+    if (append)
+        print >> copy[i]
+@end group
+@group
+    else
+        print > copy[i]
+@end group
+@end example
+
+@noindent
+This is more concise, but it is also less efficient.  The @samp{if} is
+tested for each record and for each output file.  By duplicating the loop
+body, the @samp{if} is only tested once for each input record.  If there are
+@var{N} input records and @var{M} output files, the first method only
+executes @var{N} @samp{if} statements, while the second executes
+@var{N}@code{*}@var{M} @samp{if} statements.
+
+Finally, the @code{END} rule cleans up by closing all the output files:
+
+@example
+@c file eg/prog/tee.awk
+END @{
+    for (i in copy)
+        close(copy[i])
+@}
+@c endfile
+@end example
+
+@node Uniq Program
+@subsection Printing Nonduplicated Lines of Text
+
+@c FIXME: One day, update to current POSIX version of uniq
+
+@cindex printing, unduplicated lines of text
+@cindex text@comma{} printing, unduplicated lines of
+@cindex @command{uniq} utility
+The @command{uniq} utility reads sorted lines of data on its standard
+input, and by default removes duplicate lines.  In other words, it only
+prints unique lines---hence the name.  @command{uniq} has a number of
+options. The usage is as follows:
+
+@display
+@command{uniq} [@option{-udc} [@code{-@var{n}}]] [@code{+@var{n}}] [@var{inputfile} [@var{outputfile}]]
+@end display
+
+The options for @command{uniq} are:
+
+@table @code
+@item -d
+Print only repeated (duplicated) lines.
+
+@item -u
+Print only nonrepeated (unique) lines.
+
+@item -c
+Count lines. This option overrides @option{-d} and @option{-u}.  Both repeated
+and nonrepeated lines are counted.
+
+@item -@var{n}
+Skip @var{n} fields before comparing lines.  The definition of fields
+is similar to @command{awk}'s default: nonwhitespace characters separated
+by runs of spaces and/or TABs.
+
+@item +@var{n}
+Skip @var{n} characters before comparing lines.  Any fields specified with
+@samp{-@var{n}} are skipped first.
+
+@item @var{inputfile}
+Data is read from the input file named on the command line, instead of from
+the standard input.
+
+@item @var{outputfile}
+The generated output is sent to the named output file, instead of to the
+standard output.
+@end table
+
+Normally @command{uniq} behaves as if both the @option{-d} and
+@option{-u} options are provided.
+
+@command{uniq} uses the
+@code{getopt()} library function
+(@pxref{Getopt Function})
+and the @code{join()} library function
+(@pxref{Join Function}).
+
+The program begins with a @code{usage()} function and then a brief outline of
+the options and their meanings in comments.
+The @code{BEGIN} rule deals with the command-line arguments and options. It
+uses a trick to get @code{getopt()} to handle options of the form @samp{-25},
+treating such an option as the option letter @samp{2} with an argument of
+@samp{5}. If indeed two or more digits are supplied (@code{Optarg} looks
+like a number), @code{Optarg} is
+concatenated with the option digit and then the result is added to zero to make
+it into a number.  If there is only one digit in the option, then
+@code{Optarg} is not needed. In this case, @code{Optind} must be decremented so that
+@code{getopt()} processes it next time.  This code is admittedly a bit
+tricky.
+
+If no options are supplied, then the default is taken, to print both
+repeated and nonrepeated lines.  The output file, if provided, is assigned
+to @code{outputfile}.  Early on, @code{outputfile} is initialized to the
+standard output, @file{/dev/stdout}:
+
+@cindex @code{uniq.awk} program
+@example
+@c file eg/prog/uniq.awk
+@group
+# uniq.awk --- do uniq in awk
+#
+# Requires getopt() and join() library functions
+@end group
+@c endfile
+@ignore
+@c file eg/prog/uniq.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/uniq.awk
+
+function usage()
+@{
+    print("Usage: uniq [-udc [-n]] [+n] [ in [ out ]]") > "/dev/stderr"
+    exit 1
+@}
+
+# -c    count lines. overrides -d and -u
+# -d    only repeated lines
+# -u    only nonrepeated lines
+# -n    skip n fields
+# +n    skip n characters, skip fields first
+
+BEGIN @{
+    count = 1
+    outputfile = "/dev/stdout"
+    opts = "udc0:1:2:3:4:5:6:7:8:9:"
+    while ((c = getopt(ARGC, ARGV, opts)) != -1) @{
+        if (c == "u")
+            non_repeated_only++
+        else if (c == "d")
+            repeated_only++
+        else if (c == "c")
+            do_count++
+        else if (index("0123456789", c) != 0) @{
+            # getopt() requires args to options
+            # this messes us up for things like -5
+            if (Optarg ~ /^[[:digit:]]+$/)
+                fcount = (c Optarg) + 0
+            else @{
+                fcount = c + 0
+                Optind--
+            @}
+        @} else
+            usage()
+    @}
+
+@group
+    if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{
+        charcount = substr(ARGV[Optind], 2) + 0
+        Optind++
+    @}
+@end group
+
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+
+    if (repeated_only == 0 && non_repeated_only == 0)
+        repeated_only = non_repeated_only = 1
+
+    if (ARGC - Optind == 2) @{
+        outputfile = ARGV[ARGC - 1]
+        ARGV[ARGC - 1] = ""
+    @}
+@}
+@c endfile
+@end example
+
+The following function, @code{are_equal()}, compares the current line,
+@code{$0}, to the previous line, @code{last}.  It handles skipping fields
+and characters.  If no field count and no character count are specified,
+@code{are_equal()} returns one or zero depending upon the result of a
+simple string comparison of @code{last} and @code{$0}.
+
+Otherwise, things get more complicated.  If fields have to be skipped,
+each line is broken into an array using @code{split()} (@pxref{String
+Functions}); the desired fields are then joined back into a line
+using @code{join()}.  The joined lines are stored in @code{clast} and
+@code{cline}.  If no fields are skipped, @code{clast} and @code{cline}
+are set to @code{last} and @code{$0}, respectively.  Finally, if
+characters are skipped, @code{substr()} is used to strip off the leading
+@code{charcount} characters in @code{clast} and @code{cline}.  The two
+strings are then compared and @code{are_equal()} returns the result:
+
+@example
+@c file eg/prog/uniq.awk
+@group
+function are_equal(    n, m, clast, cline, alast, aline)
+@{
+    if (fcount == 0 && charcount == 0)
+        return (last == $0)
+@end group
+
+    if (fcount > 0) @{
+        n = split(last, alast)
+        m = split($0, aline)
+        clast = join(alast, fcount+1, n)
+        cline = join(aline, fcount+1, m)
+    @} else @{
+        clast = last
+        cline = $0
+    @}
+    if (charcount) @{
+        clast = substr(clast, charcount + 1)
+        cline = substr(cline, charcount + 1)
+    @}
+@group
+
+    return (clast == cline)
+@}
+@end group
+@c endfile
+@end example
+
+The following two rules are the body of the program.  The first one is
+executed only for the very first line of data.  It sets @code{last} equal to
+@code{$0}, so that subsequent lines of text have something to be compared to.
+
+The second rule does the work. The variable @code{equal} is one or zero,
+depending upon the results of @code{are_equal()}'s comparison. If @command{uniq}
+is counting repeated lines, and the lines are equal, then it increments the @code{count} variable.
+Otherwise, it prints the line and resets @code{count},
+because the two lines are not equal.
+
+If @command{uniq} is not counting, and if the lines are equal, @code{count} is incremented.
+Nothing is printed, as the point is to remove duplicates.
+Otherwise, if @command{uniq} is counting repeated lines and more than
+one line is seen, or if @command{uniq} is counting nonrepeated lines
+and only one line is seen, then the line is printed, and @code{count}
+is reset.
+
+Finally, similar logic is used in the @code{END} rule to print the final
+line of input data:
+
+@example
+@c file eg/prog/uniq.awk
+NR == 1 @{
+    last = $0
+    next
+@}
+
+@{
+    equal = are_equal()
+
+    if (do_count) @{    # overrides -d and -u
+        if (equal)
+            count++
+        else @{
+            printf("%4d %s\n", count, last) > outputfile
+            last = $0
+            count = 1    # reset
+        @}
+        next
+    @}
+
+    if (equal)
+        count++
+    else @{
+        if ((repeated_only && count > 1) ||
+            (non_repeated_only && count == 1))
+                print last > outputfile
+        last = $0
+        count = 1
+    @}
+@}
+
+END @{
+    if (do_count)
+        printf("%4d %s\n", count, last) > outputfile
+@group
+    else if ((repeated_only && count > 1) ||
+            (non_repeated_only && count == 1))
+        print last > outputfile
+    close(outputfile)
+@}
+@end group
+@c endfile
+@end example
+
+As a side note, this program does not follow our recommended convention of naming
+global variables with a leading capital letter.  Doing that would
+make the program a little easier to follow.
+
+@ifset FOR_PRINT
+The logic for choosing which lines to print represents a @dfn{state
+machine}, which is ``a device that can be in one of a set number of stable
+conditions depending on its previous condition and on the present values
+of its inputs.''@footnote{This is the definition returned from entering
+@code{define: state machine} into Google.}
+Brian Kernighan suggests that
+``an alternative approach to state machines is to just read
+the input into an array, then use indexing.  It's almost always
+easier code, and for most inputs where you would use this, just
+as fast.''  Consider how to rewrite the logic to follow this
+suggestion.
+@end ifset
+
+
+
+@node Wc Program
+@subsection Counting Things
+
+@c FIXME: One day, update to current POSIX version of wc
+
+@cindex counting
+@cindex input files, counting elements in
+@cindex words, counting
+@cindex characters, counting
+@cindex lines, counting
+@cindex @command{wc} utility
+The @command{wc} (word count) utility counts lines, words, and characters in
+one or more input files. Its usage is as follows:
+
+@display
+@command{wc} [@option{-lwc}] [@var{files} @dots{}]
+@end display
+
+If no files are specified on the command line, @command{wc} reads its standard
+input. If there are multiple files, it also prints total counts for all
+the files.  The options and their meanings are as follows:
+
+@table @code
+@item -l
+Count only lines.
+
+@item -w
+Count only words.
+A ``word'' is a contiguous sequence of nonwhitespace characters, separated
+by spaces and/or TABs.  Luckily, this is the normal way @command{awk} separates
+fields in its input data.
+
+@item -c
+Count only characters.
+@end table
+
+Implementing @command{wc} in @command{awk} is particularly elegant,
+because @command{awk} does a lot of the work for us; it splits lines into
+words (i.e., fields) and counts them, it counts lines (i.e., records),
+and it can easily tell us how long a line is.
+
+This program uses the @code{getopt()} library function
+(@pxref{Getopt Function})
+and the file-transition functions
+(@pxref{Filetrans Function}).
+
+This version has one notable difference from traditional versions of
+@command{wc}: it always prints the counts in the order lines, words,
+and characters.  Traditional versions note the order of the @option{-l},
+@option{-w}, and @option{-c} options on the command line, and print the
+counts in that order.
+
+The @code{BEGIN} rule does the argument processing.  The variable
+@code{print_total} is true if more than one file is named on the
+command line:
+
+@cindex @code{wc.awk} program
+@example
+@c file eg/prog/wc.awk
+# wc.awk --- count lines, words, characters
+@c endfile
+@ignore
+@c file eg/prog/wc.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/wc.awk
+
+# Options:
+#    -l    only count lines
+#    -w    only count words
+#    -c    only count characters
+#
+# Default is to count lines, words, characters
+#
+# Requires getopt() and file transition library functions
+
+BEGIN @{
+    # let getopt() print a message about
+    # invalid options. we ignore them
+    while ((c = getopt(ARGC, ARGV, "lwc")) != -1) @{
+        if (c == "l")
+            do_lines = 1
+        else if (c == "w")
+            do_words = 1
+        else if (c == "c")
+            do_chars = 1
+    @}
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+
+    # if no options, do all
+    if (! do_lines && ! do_words && ! do_chars)
+        do_lines = do_words = do_chars = 1
+
+    print_total = (ARGC - i > 1)
+@}
+@c endfile
+@end example
+
+The @code{beginfile()} function is simple; it just resets the counts of lines,
+words, and characters to zero, and saves the current @value{FN} in
+@code{fname}:
+
+@example
+@c file eg/prog/wc.awk
+function beginfile(file)
+@{
+    lines = words = chars = 0
+    fname = FILENAME
+@}
+@c endfile
+@end example
+
+The @code{endfile()} function adds the current file's numbers to the
+running totals of lines, words, and characters.  It then prints out those
+numbers for the file that was just read. It relies on @code{beginfile()}
+to reset the numbers for the following @value{DF}:
+
+@example
+@c file eg/prog/wc.awk
+function endfile(file)
+@{
+    tlines += lines
+    twords += words
+    tchars += chars
+    if (do_lines)
+        printf "\t%d", lines
+@group
+    if (do_words)
+        printf "\t%d", words
+@end group
+    if (do_chars)
+        printf "\t%d", chars
+    printf "\t%s\n", fname
+@}
+@c endfile
+@end example
+
+There is one rule that is executed for each line. It adds the length of
+the record, plus one, to @code{chars}.@footnote{Because @command{gawk}
+understands multibyte locales, this code counts characters, not bytes.}
+Adding one plus the record length
+is needed because the newline character separating records (the value
+of @code{RS}) is not part of the record itself, and thus not included
+in its length.  Next, @code{lines} is incremented for each line read,
+and @code{words} is incremented by the value of @code{NF}, which is the
+number of ``words'' on this line:
+
+@example
+@c file eg/prog/wc.awk
+# do per line
+@{
+    chars += length($0) + 1    # get newline
+    lines++
+    words += NF
+@}
+@c endfile
+@end example
+
+Finally, the @code{END} rule simply prints the totals for all the files:
+
+@example
+@c file eg/prog/wc.awk
+END @{
+    if (print_total) @{
+        if (do_lines)
+            printf "\t%d", tlines
+        if (do_words)
+            printf "\t%d", twords
+        if (do_chars)
+            printf "\t%d", tchars
+        print "\ttotal"
+    @}
+@}
+@c endfile
+@end example
+
+@node Miscellaneous Programs
+@section A Grab Bag of @command{awk} Programs
+
+This @value{SECTION} is a large ``grab bag'' of miscellaneous programs.
+We hope you find them both interesting and enjoyable.
+
+@menu
+* Dupword Program::             Finding duplicated words in a document.
+* Alarm Program::               An alarm clock.
+* Translate Program::           A program similar to the @command{tr} utility.
+* Labels Program::              Printing mailing labels.
+* Word Sorting::                A program to produce a word usage count.
+* History Sorting::             Eliminating duplicate entries from a history
+                                file.
+* Extract Program::             Pulling out programs from Texinfo source
+                                files.
+* Simple Sed::                  A Simple Stream Editor.
+* Igawk Program::               A wrapper for @command{awk} that includes
+                                files.
+* Anagram Program::             Finding anagrams from a dictionary.
+* Signature Program::           People do amazing things with too much time on
+                                their hands.
+@end menu
+
+@node Dupword Program
+@subsection Finding Duplicated Words in a Document
+
+@cindex words, duplicate@comma{} searching for
+@cindex searching, for words
+@cindex documents@comma{} searching
+A common error when writing large amounts of prose is to accidentally
+duplicate words.  Typically you will see this in text as something like ``the
+the program does the following@dots{}''  When the text is online, often
+the duplicated words occur at the end of one line and the
+@iftex
+the
+@end iftex
+beginning of
+another, making them very difficult to spot.
+@c as here!
+
+This program, @file{dupword.awk}, scans through a file one line at a time
+and looks for adjacent occurrences of the same word.  It also saves the last
+word on a line (in the variable @code{prev}) for comparison with the first
+word on the next line.
+
+@cindex Texinfo
+The first two statements make sure that the line is all lowercase,
+so that, for example, ``The'' and ``the'' compare equal to each other.
+The next statement replaces nonalphanumeric and nonwhitespace characters
+with spaces, so that punctuation does not affect the comparison either.
+The characters are replaced with spaces so that formatting controls
+don't create nonsense words (e.g., the Texinfo @samp{@@code@{NF@}}
+becomes @samp{codeNF} if punctuation is simply deleted).  The record is
+then resplit into fields, yielding just the actual words on the line,
+and ensuring that there are no empty fields.
+
+If there are no fields left after removing all the punctuation, the
+current record is skipped.  Otherwise, the program loops through each
+word, comparing it to the previous one:
+
+@cindex @code{dupword.awk} program
+@example
+@c file eg/prog/dupword.awk
+# dupword.awk --- find duplicate words in text
+@c endfile
+@ignore
+@c file eg/prog/dupword.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# December 1991
+# Revised October 2000
+
+@c endfile
+@end ignore
+@c file eg/prog/dupword.awk
+@{
+    $0 = tolower($0)
+    gsub(/[^[:alnum:][:blank:]]/, " ");
+    $0 = $0         # re-split
+    if (NF == 0)
+        next
+    if ($1 == prev)
+        printf("%s:%d: duplicate %s\n",
+            FILENAME, FNR, $1)
+    for (i = 2; i <= NF; i++)
+        if ($i == $(i-1))
+            printf("%s:%d: duplicate %s\n",
+                FILENAME, FNR, $i)
+    prev = $NF
+@}
+@c endfile
+@end example
+
+@node Alarm Program
+@subsection An Alarm Clock Program
+@cindex insomnia, cure for
+@cindex Robbins, Arnold
+@quotation
+@i{Nothing cures insomnia like a ringing alarm clock.}
+@author Arnold Robbins
+@end quotation
+@cindex Quanstrom, Erik
+@ignore
+Date: Sat, 15 Feb 2014 16:47:09 -0500
+Subject: Re: 9atom install question
+Message-ID: <l2jcvx6j6mey60xnrkb0hhob.1392500829294@email.android.com>
+From: Erik Quanstrom <quanstro@quanstro.net>
+To: Aharon Robbins <arnold@skeeve.com>
+
+yes.
+
+- erik
+
+Aharon Robbins <arnold@skeeve.com> wrote:
+
+>> sleep is for web developers.
+>
+>Can I quote you, in the gawk manual?
+>
+>Thanks,
+>
+>Arnold
+@end ignore
+@quotation
+@i{Sleep is for web developers.}
+@author Erik Quanstrom
+@end quotation
+
+@cindex time, alarm clock example program
+@cindex alarm clock example program
+The following program is a simple ``alarm clock'' program.
+You give it a time of day and an optional message.  At the specified time,
+it prints the message on the standard output. In addition, you can give it
+the number of times to repeat the message as well as a delay between
+repetitions.
+
+This program uses the @code{getlocaltime()} function from
+@ref{Getlocaltime Function}.
+
+All the work is done in the @code{BEGIN} rule.  The first part is argument
+checking and setting of defaults: the delay, the count, and the message to
+print.  If the user supplied a message without the ASCII BEL
+character (known as the ``alert'' character, @code{"\a"}), then it is added to
+the message.  (On many systems, printing the ASCII BEL generates an
+audible alert. Thus, when the alarm goes off, the system calls attention
+to itself in case the user is not looking at the computer.)
+Just for a change, this program uses a @code{switch} statement
+(@pxref{Switch Statement}), but the processing could be done with a series of
+@code{if}-@code{else} statements instead.
+Here is the program:
+
+@cindex @code{alarm.awk} program
+@example
+@c file eg/prog/alarm.awk
+# alarm.awk --- set an alarm
+#
+# Requires getlocaltime() library function
+@c endfile
+@ignore
+@c file eg/prog/alarm.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised December 2010
+
+@c endfile
+@end ignore
+@c file eg/prog/alarm.awk
+# usage: alarm time [ "message" [ count [ delay ] ] ]
+
+BEGIN @{
+    # Initial argument sanity checking
+    usage1 = "usage: alarm time ['message' [count [delay]]]"
+    usage2 = sprintf("\t(%s) time ::= hh:mm", ARGV[1])
+
+    if (ARGC < 2) @{
+        print usage1 > "/dev/stderr"
+        print usage2 > "/dev/stderr"
+        exit 1
+    @}
+    switch (ARGC) @{
+    case 5:
+        delay = ARGV[4] + 0
+        # fall through
+    case 4:
+        count = ARGV[3] + 0
+        # fall through
+    case 3:
+        message = ARGV[2]
+        break
+    default:
+        if (ARGV[1] !~ /[[:digit:]]?[[:digit:]]:[[:digit:]]@{2@}/) @{
+            print usage1 > "/dev/stderr"
+            print usage2 > "/dev/stderr"
+            exit 1
+        @}
+        break
+    @}
+
+    # set defaults for once we reach the desired time
+    if (delay == 0)
+        delay = 180    # 3 minutes
+@group
+    if (count == 0)
+        count = 5
+@end group
+    if (message == "")
+        message = sprintf("\aIt is now %s!\a", ARGV[1])
+    else if (index(message, "\a") == 0)
+        message = "\a" message "\a"
+@c endfile
+@end example
+
+The next @value{SECTION} of code turns the alarm time into hours and minutes,
+converts it (if necessary) to a 24-hour clock, and then turns that
+time into a count of the seconds since midnight.  Next it turns the current
+time into a count of seconds since midnight.  The difference between the two
+is how long to wait before setting off the alarm:
+
+@example
+@c file eg/prog/alarm.awk
+    # split up alarm time
+    split(ARGV[1], atime, ":")
+    hour = atime[1] + 0    # force numeric
+    minute = atime[2] + 0  # force numeric
+
+    # get current broken down time
+    getlocaltime(now)
+
+    # if time given is 12-hour hours and it's after that
+    # hour, e.g., `alarm 5:30' at 9 a.m. means 5:30 p.m.,
+    # then add 12 to real hour
+    if (hour < 12 && now["hour"] > hour)
+        hour += 12
+
+    # set target time in seconds since midnight
+    target = (hour * 60 * 60) + (minute * 60)
+
+    # get current time in seconds since midnight
+    current = (now["hour"] * 60 * 60) + \
+               (now["minute"] * 60) + now["second"]
+
+    # how long to sleep for
+    naptime = target - current
+    if (naptime <= 0) @{
+        print "alarm: time is in the past!" > "/dev/stderr"
+        exit 1
+    @}
+@c endfile
+@end example
+
+@cindex @command{sleep} utility
+Finally, the program uses the @code{system()} function
+(@pxref{I/O Functions})
+to call the @command{sleep} utility.  The @command{sleep} utility simply pauses
+for the given number of seconds.  If the exit status is not zero,
+the program assumes that @command{sleep} was interrupted and exits. If
+@command{sleep} exited with an OK status (zero), then the program prints the
+message in a loop, again using @command{sleep} to delay for however many
+seconds are necessary:
+
+@example
+@c file eg/prog/alarm.awk
+    # zzzzzz..... go away if interrupted
+    if (system(sprintf("sleep %d", naptime)) != 0)
+        exit 1
+
+    # time to notify!
+    command = sprintf("sleep %d", delay)
+    for (i = 1; i <= count; i++) @{
+        print message
+        # if sleep command interrupted, go away
+        if (system(command) != 0)
+            break
+    @}
+
+    exit 0
+@}
+@c endfile
+@end example
+
+@node Translate Program
+@subsection Transliterating Characters
+
+@cindex characters, transliterating
+@cindex @command{tr} utility
+The system @command{tr} utility transliterates characters.  For example, it is
+often used to map uppercase letters into lowercase for further processing:
+
+@example
+@var{generate data} | tr 'A-Z' 'a-z' | @var{process data} @dots{}
+@end example
+
+@command{tr} requires two lists of characters.@footnote{On some older
+systems, including Solaris, the system version of @command{tr} may require
+that the lists be written as range expressions enclosed in square brackets
+(@samp{[a-z]}) and quoted, to prevent the shell from attempting a
+@value{FN} expansion.  This is not a feature.}  When processing the input, the
+first character in the first list is replaced with the first character
+in the second list, the second character in the first list is replaced
+with the second character in the second list, and so on.  If there are
+more characters in the ``from'' list than in the ``to'' list, the last
+character of the ``to'' list is used for the remaining characters in the
+``from'' list.
+
+Once upon a time,
+@c early or mid-1989!
+a user proposed adding a transliteration function
+to @command{gawk}.
+@c Wishing to avoid gratuitous new features,
+@c at least theoretically
+The following program was written to
+prove that character transliteration could be done with a user-level
+function.  This program is not as complete as the system @command{tr} utility,
+but it does most of the job.
+
+The @command{translate} program was written long before @command{gawk}
+acquired the ability to split each character in a string into separate
+array elements.  Thus, it makes repeated use of the @code{substr()},
+@code{index()}, and @code{gsub()} built-in functions (@pxref{String
+Functions}).  There are two functions.  The first, @code{stranslate()},
+takes three arguments:
+
+@table @code
+@item from
+A list of characters from which to translate
+
+@item to
+A list of characters to which to translate
+
+@item target
+The string on which to do the translation
+@end table
+
+Associative arrays make the translation part fairly easy. @code{t_ar} holds
+the ``to'' characters, indexed by the ``from'' characters.  Then a simple
+loop goes through @code{from}, one character at a time.  For each character
+in @code{from}, if the character appears in @code{target},
+it is replaced with the corresponding @code{to} character.
+
+The @code{translate()} function calls @code{stranslate()}, using @code{$0}
+as the target.  The main program sets two global variables, @code{FROM} and
+@code{TO}, from the command line, and then changes @code{ARGV} so that
+@command{awk} reads from the standard input.
+
+Finally, the processing rule simply calls @code{translate()} for each record:
+
+@cindex @code{translate.awk} program
+@example
+@c file eg/prog/translate.awk
+# translate.awk --- do tr-like stuff
+@c endfile
+@ignore
+@c file eg/prog/translate.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# August 1989
+# February 2009 - bug fix
+
+@c endfile
+@end ignore
+@c file eg/prog/translate.awk
+# Bugs: does not handle things like tr A-Z a-z; it has
+# to be spelled out. However, if `to' is shorter than `from',
+# the last character in `to' is used for the rest of `from'.
+
+function stranslate(from, to, target,     lf, lt, ltarget, t_ar, i, c,
+                                                               result)
+@{
+    lf = length(from)
+    lt = length(to)
+    ltarget = length(target)
+    for (i = 1; i <= lt; i++)
+        t_ar[substr(from, i, 1)] = substr(to, i, 1)
+    if (lt < lf)
+        for (; i <= lf; i++)
+            t_ar[substr(from, i, 1)] = substr(to, lt, 1)
+    for (i = 1; i <= ltarget; i++) @{
+        c = substr(target, i, 1)
+        if (c in t_ar)
+            c = t_ar[c]
+        result = result c
+    @}
+    return result
+@}
+
+function translate(from, to)
+@{
+    return $0 = stranslate(from, to, $0)
+@}
+
+# main program
+BEGIN @{
+@group
+    if (ARGC < 3) @{
+        print "usage: translate from to" > "/dev/stderr"
+        exit
+    @}
+@end group
+    FROM = ARGV[1]
+    TO = ARGV[2]
+    ARGC = 2
+    ARGV[1] = "-"
+@}
+
+@{
+    translate(FROM, TO)
+    print
+@}
+@c endfile
+@end example
+
+It is possible to do character transliteration in a user-level
+function, but it is not necessarily efficient, and we (the @command{gawk}
+developers) started to consider adding a built-in function.  However,
+shortly after writing this program, we learned that Brian Kernighan
+had added the @code{toupper()} and @code{tolower()} functions to his
+@command{awk} (@pxref{String Functions}).  These functions handle the
+vast majority of the cases where character transliteration is necessary,
+and so we chose to simply add those functions to @command{gawk} as well
+and then leave well enough alone.
+
+An obvious improvement to this program would be to set up the
+@code{t_ar} array only once, in a @code{BEGIN} rule. However, this
+assumes that the ``from'' and ``to'' lists
+will never change throughout the lifetime of the program.
+
+Another obvious improvement is to enable the use of ranges,
+such as @samp{a-z}, as allowed by the @command{tr} utility.
+Look at the code for @file{cut.awk} (@pxref{Cut Program})
+for inspiration.
+
+
+@node Labels Program
+@subsection Printing Mailing Labels
+
+@cindex printing, mailing labels
+@cindex mailing labels@comma{} printing
+Here is a ``real-world''@footnote{``Real world'' is defined as
+``a program actually used to get something done.''}
+program.  This
+script reads lists of names and
+addresses and generates mailing labels.  Each page of labels has 20 labels
+on it, two across and 10 down.  The addresses are guaranteed to be no more
+than five lines of data.  Each address is separated from the next by a blank
+line.
+
+The basic idea is to read 20 labels' worth of data.  Each line of each label
+is stored in the @code{line} array.  The single rule takes care of filling
+the @code{line} array and printing the page when 20 labels have been read.
+
+The @code{BEGIN} rule simply sets @code{RS} to the empty string, so that
+@command{awk} splits records at blank lines
+(@pxref{Records}).
+It sets @code{MAXLINES} to 100, because 100 is the maximum number
+of lines on the page
+@iftex
+(@math{20 @cdot 5 = 100}).
+@end iftex
+@ifnottex
+@ifnotdocbook
+(20 * 5 = 100).
+@end ifnotdocbook
+@end ifnottex
+@docbook
+(20 &sdot; 5 = 100).
+@end docbook
+
+Most of the work is done in the @code{printpage()} function.
+The label lines are stored sequentially in the @code{line} array.  But they
+have to print horizontally: @code{line[1]} next to @code{line[6]},
+@code{line[2]} next to @code{line[7]}, and so on.  Two loops
+accomplish this.  The outer loop, controlled by @code{i}, steps through
+every 10 lines of data; this is each row of labels.  The inner loop,
+controlled by @code{j}, goes through the lines within the row.
+As @code{j} goes from 0 to 4, @samp{i+j} is the @code{j}th line in
+the row, and @samp{i+j+5} is the entry next to it.  The output ends up
+looking something like this:
+
+@example
+line 1          line 6
+line 2          line 7
+line 3          line 8
+line 4          line 9
+line 5          line 10
+@dots{}
+@end example
+
+@noindent
+The @code{printf} format string @samp{%-41s} left-aligns
+the data and prints it within a fixed-width field.
+
+As a final note, an extra blank line is printed at lines 21 and 61, to keep
+the output lined up on the labels.  This is dependent on the particular
+brand of labels in use when the program was written.  You will also note
+that there are two blank lines at the top and two blank lines at the bottom.
+
+The @code{END} rule arranges to flush the final page of labels; there may
+not have been an even multiple of 20 labels in the data:
+
+@cindex @code{labels.awk} program
+@example
+@c file eg/prog/labels.awk
+# labels.awk --- print mailing labels
+@c endfile
+@ignore
+@c file eg/prog/labels.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# June 1992
+# December 2010, minor edits
+@c endfile
+@end ignore
+@c file eg/prog/labels.awk
+
+# Each label is 5 lines of data that may have blank lines.
+# The label sheets have 2 blank lines at the top and 2 at
+# the bottom.
+
+BEGIN    @{ RS = "" ; MAXLINES = 100 @}
+
+function printpage(    i, j)
+@{
+    if (Nlines <= 0)
+        return
+
+    printf "\n\n"        # header
+
+    for (i = 1; i <= Nlines; i += 10) @{
+        if (i == 21 || i == 61)
+            print ""
+        for (j = 0; j < 5; j++) @{
+            if (i + j > MAXLINES)
+                break
+            printf "   %-41s %s\n", line[i+j], line[i+j+5]
+        @}
+        print ""
+    @}
+
+    printf "\n\n"        # footer
+
+    delete line
+@}
+
+# main rule
+@{
+    if (Count >= 20) @{
+        printpage()
+        Count = 0
+        Nlines = 0
+    @}
+    n = split($0, a, "\n")
+    for (i = 1; i <= n; i++)
+        line[++Nlines] = a[i]
+    for (; i <= 5; i++)
+        line[++Nlines] = ""
+    Count++
+@}
+
+END @{
+    printpage()
+@}
+@c endfile
+@end example
+
+@node Word Sorting
+@subsection Generating Word-Usage Counts
+
+@cindex words, usage counts@comma{} generating
+
+When working with large amounts of text, it can be interesting to know
+how often different words appear.  For example, an author may overuse
+certain words, in which case he or she might wish to find synonyms to substitute
+for words that appear too often. This @value{SUBSECTION} develops a
+program for counting words and presenting the frequency information
+in a useful format.
+
+At first glance, a program like this would seem to do the job:
+
+@example
+# wordfreq-first-try.awk --- print list of word frequencies
+
+@{
+    for (i = 1; i <= NF; i++)
+        freq[$i]++
+@}
+
+@group
+END @{
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word]
+@}
+@end group
+@end example
+
+The program relies on @command{awk}'s default field-splitting
+mechanism to break each line up into ``words'' and uses an
+associative array named @code{freq}, indexed by each word, to count
+the number of times the word occurs. In the @code{END} rule,
+it prints the counts.
+
+This program has several problems that prevent it from being
+useful on real text files:
+
+@itemize @value{BULLET}
+@item
+The @command{awk} language considers upper- and lowercase characters to be
+distinct.  Therefore, ``bartender'' and ``Bartender'' are not treated
+as the same word.  This is undesirable, because words are capitalized
+if they begin sentences in normal text, and a frequency analyzer should
+not be sensitive to capitalization.
+
+@item
+Words are detected using the @command{awk} convention that fields are
+separated just by whitespace.  Other characters in the input (except
+newlines) don't have any special meaning to @command{awk}.  This means that
+punctuation characters count as part of words.
+
+@item
+The output does not come out in any useful order.  You're more likely to be
+interested in which words occur most frequently or in having an alphabetized
+table of how frequently each word occurs.
+@end itemize
+
+@cindex @command{sort} utility
+The first problem can be solved by using @code{tolower()} to remove case
+distinctions.  The second problem can be solved by using @code{gsub()}
+to remove punctuation characters.  Finally, we solve the third problem
+by using the system @command{sort} utility to process the output of the
+@command{awk} script.  Here is the new version of the program:
+
+@cindex @code{wordfreq.awk} program
+@example
+@c file eg/prog/wordfreq.awk
+# wordfreq.awk --- print list of word frequencies
+
+@{
+    $0 = tolower($0)    # remove case distinctions
+    # remove punctuation
+    gsub(/[^[:alnum:]_[:blank:]]/, "", $0)
+    for (i = 1; i <= NF; i++)
+        freq[$i]++
+@}
+
+@c endfile
+END @{
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word]
+@}
+@end example
+
+The regexp @code{/[^[:alnum:]_[:blank:]]/} might have been written
+@code{/[[:punct:]]/}, but then underscores would also be removed,
+and we want to keep them.
+
+Assuming we have saved this program in a file named @file{wordfreq.awk},
+and that the data is in @file{file1}, the following pipeline:
+
+@example
+awk -f wordfreq.awk file1 | sort -k 2nr
+@end example
+
+@noindent
+produces a table of the words appearing in @file{file1} in order of
+decreasing frequency.
+
+The @command{awk} program suitably massages the
+data and produces a word frequency table, which is not ordered.
+The @command{awk} script's output is then sorted by the @command{sort}
+utility and printed on the screen.
+
+The options given to @command{sort}
+specify a sort that uses the second field of each input line (skipping
+one field), that the sort keys should be treated as numeric quantities
+(otherwise @samp{15} would come before @samp{5}), and that the sorting
+should be done in descending (reverse) order.
+
+The @command{sort} could even be done from within the program, by changing
+the @code{END} action to:
+
+@example
+@c file eg/prog/wordfreq.awk
+END @{
+    sort = "sort -k 2nr"
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word] | sort
+    close(sort)
+@}
+@c endfile
+@end example
+
+This way of sorting must be used on systems that do not
+have true pipes at the command-line (or batch-file) level.
+See the general operating system documentation for more information on how
+to use the @command{sort} program.
+
+@node History Sorting
+@subsection Removing Duplicates from Unsorted Text
+
+@cindex lines, duplicate@comma{} removing
+The @command{uniq} program
+(@pxref{Uniq Program})
+removes duplicate lines from @emph{sorted} data.
+
+Suppose, however, you need to remove duplicate lines from a @value{DF} but
+that you want to preserve the order the lines are in.  A good example of
+this might be a shell history file.  The history file keeps a copy of all
+the commands you have entered, and it is not unusual to repeat a command
+several times in a row.  Occasionally you might want to compact the history
+by removing duplicate entries.  Yet it is desirable to maintain the order
+of the original commands.
+
+This simple program does the job.  It uses two arrays.  The @code{data}
+array is indexed by the text of each line.
+For each line, @code{data[$0]} is incremented.
+If a particular line has not
+been seen before, then @code{data[$0]} is zero.
+In this case, the text of the line is stored in @code{lines[count]}.
+Each element of @code{lines} is a unique command, and the indices of
+@code{lines} indicate the order in which those lines are encountered.
+The @code{END} rule simply prints out the lines, in order:
+
+@cindex Rakitzis, Byron
+@cindex @code{histsort.awk} program
+@example
+@c file eg/prog/histsort.awk
+# histsort.awk --- compact a shell history file
+# Thanks to Byron Rakitzis for the general idea
+@c endfile
+@ignore
+@c file eg/prog/histsort.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/histsort.awk
+
+@group
+@{
+    if (data[$0]++ == 0)
+        lines[++count] = $0
+@}
+@end group
+
+@group
+END @{
+    for (i = 1; i <= count; i++)
+        print lines[i]
+@}
+@end group
+@c endfile
+@end example
+
+This program also provides a foundation for generating other useful
+information.  For example, using the following @code{print} statement in the
+@code{END} rule indicates how often a particular command is used:
+
+@example
+print data[lines[i]], lines[i]
+@end example
+
+@noindent
+This works because @code{data[$0]} is incremented each time a line is
+seen.
+
+@node Extract Program
+@subsection Extracting Programs from Texinfo Source Files
+
+@cindex Texinfo, extracting programs from source files
+@cindex files, Texinfo@comma{} extracting programs from
+@ifnotinfo
+Both this chapter and the previous chapter
+(@ref{Library Functions})
+present a large number of @command{awk} programs.
+@end ifnotinfo
+@ifinfo
+The nodes
+@ref{Library Functions},
+and @ref{Sample Programs},
+are the top level nodes for a large number of @command{awk} programs.
+@end ifinfo
+If you want to experiment with these programs, it is tedious to type
+them in by hand.  Here we present a program that can extract parts of a
+Texinfo input file into separate files.
+
+@cindex Texinfo
+This @value{DOCUMENT} is written in @uref{https://www.gnu.org/software/texinfo/, Texinfo},
+the GNU Project's document formatting language.
+A single Texinfo source file can be used to produce both
+printed documentation, with @TeX{}, and online documentation.
+@ifnotinfo
+(Texinfo is fully documented in the book
+@cite{Texinfo---The GNU Documentation Format},
+available from the Free Software Foundation,
+and also available @uref{https://www.gnu.org/software/texinfo/manual/texinfo/, online}.)
+@end ifnotinfo
+@ifinfo
+(The Texinfo language is described fully, starting with
+@inforef{Top, , Texinfo, texinfo,Texinfo---The GNU Documentation Format}.)
+@end ifinfo
+
+For our purposes, it is enough to know three things about Texinfo input
+files:
+
+@itemize @value{BULLET}
+@item
+The ``at'' symbol (@samp{@@}) is special in Texinfo, much as
+the backslash (@samp{\}) is in C
+or @command{awk}.  Literal @samp{@@} symbols are represented in Texinfo source
+files as @samp{@@@@}.
+
+@item
+Comments start with either @samp{@@c} or @samp{@@comment}.
+The file-extraction program works by using special comments that start
+at the beginning of a line.
+
+@item
+Lines containing @samp{@@group} and @samp{@@end group} commands bracket
+example text that should not be split across a page boundary.
+(Unfortunately, @TeX{} isn't always smart enough to do things exactly right,
+so we have to give it some help.)
+@end itemize
+
+The following program, @file{extract.awk}, reads through a Texinfo source
+file and does two things, based on the special comments.
+Upon seeing @samp{@w{@@c system @dots{}}},
+it runs a command, by extracting the command text from the
+control line and passing it on to the @code{system()} function
+(@pxref{I/O Functions}).
+Upon seeing @samp{@@c file @var{filename}}, each subsequent line is sent to
+the file @var{filename}, until @samp{@@c endfile} is encountered.
+The rules in @file{extract.awk} match either @samp{@@c} or
+@samp{@@comment} by letting the @samp{omment} part be optional.
+Lines containing @samp{@@group} and @samp{@@end group} are simply removed.
+@file{extract.awk} uses the @code{join()} library function
+(@pxref{Join Function}).
+
+The example programs in the online Texinfo source for @cite{@value{TITLE}}
+(@file{gawktexi.in}) have all been bracketed inside @samp{file} and
+@samp{endfile} lines.  The @command{gawk} distribution uses a copy of
+@file{extract.awk} to extract the sample programs and install many
+of them in a standard directory where @command{gawk} can find them.
+The Texinfo file looks something like this:
+
+@example
+@dots{}
+This program has a @@code@{BEGIN@} rule
+that prints a nice message:
+
+@@example
+@@c file examples/messages.awk
+BEGIN @@@{ print "Don't panic!" @@@}
+@@c endfile
+@@end example
+
+It also prints some final advice:
+
+@@example
+@@c file examples/messages.awk
+END @@@{ print "Always avoid bored archaeologists!" @@@}
+@@c endfile
+@@end example
+@dots{}
+@end example
+
+@file{extract.awk} begins by setting @code{IGNORECASE} to one, so that
+mixed upper- and lowercase letters in the directives won't matter.
+
+The first rule handles calling @code{system()}, checking that a command is
+given (@code{NF} is at least three) and also checking that the command
+exits with a zero exit status, signifying OK:
+
+@cindex @code{extract.awk} program
+@example
+@c file eg/prog/extract.awk
+# extract.awk --- extract files and run programs from Texinfo files
+@c endfile
+@ignore
+@c file eg/prog/extract.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised September 2000
+@c endfile
+@end ignore
+@c file eg/prog/extract.awk
+
+BEGIN    @{ IGNORECASE = 1 @}
+
+/^@@c(omment)?[ \t]+system/ @{
+    if (NF < 3) @{
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e  ": badly formed `system' line")
+        print e > "/dev/stderr"
+        next
+    @}
+    $1 = ""
+    $2 = ""
+    stat = system($0)
+    if (stat != 0) @{
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e ": warning: system returned " stat)
+        print e > "/dev/stderr"
+    @}
+@}
+@c endfile
+@end example
+
+@noindent
+The variable @code{e} is used so that the rule
+fits nicely on the @value{PAGE}.
+
+The second rule handles moving data into files.  It verifies that a
+@value{FN} is given in the directive.  If the file named is not the
+current file, then the current file is closed.  Keeping the current file
+open until a new file is encountered allows the use of the @samp{>}
+redirection for printing the contents, keeping open-file management
+simple.
+
+The @code{for} loop does the work.  It reads lines using @code{getline}
+(@pxref{Getline}).
+For an unexpected end-of-file, it calls the @code{@w{unexpected_eof()}}
+function.  If the line is an ``endfile'' line, then it breaks out of
+the loop.
+If the line is an @samp{@@group} or @samp{@@end group} line, then it
+ignores it and goes on to the next line.
+Similarly, comments within examples are also ignored.
+
+Most of the work is in the following few lines.  If the line has no @samp{@@}
+symbols, the program can print it directly.
+Otherwise, each leading @samp{@@} must be stripped off.
+To remove the @samp{@@} symbols, the line is split into separate elements of
+the array @code{a}, using the @code{split()} function
+(@pxref{String Functions}).
+The @samp{@@} symbol is used as the separator character.
+Each element of @code{a} that is empty indicates two successive @samp{@@}
+symbols in the original line.  For each two empty elements (@samp{@@@@} in
+the original file), we have to add a single @samp{@@} symbol back in.
+
+When the processing of the array is finished, @code{join()} is called with the
+value of @code{SUBSEP} (@pxref{Multidimensional}),
+to rejoin the pieces back into a single
+line.  That line is then printed to the output file:
+
+@example
+@c file eg/prog/extract.awk
+/^@@c(omment)?[ \t]+file/ @{
+    if (NF != 3) @{
+        e = ("extract: " FILENAME ":" FNR ": badly formed `file' line")
+        print e > "/dev/stderr"
+        next
+    @}
+    if ($3 != curfile) @{
+        if (curfile != "")
+            filelist[curfile] = 1   # save to close later
+        curfile = $3
+    @}
+
+    for (;;) @{
+        if ((getline line) <= 0)
+            unexpected_eof()
+        if (line ~ /^@@c(omment)?[ \t]+endfile/)
+            break
+        else if (line ~ /^@@(end[ \t]+)?group/)
+            continue
+        else if (line ~ /^@@c(omment+)?[ \t]+/)
+            continue
+        if (index(line, "@@") == 0) @{
+            print line > curfile
+            continue
+        @}
+        n = split(line, a, "@@")
+        # if a[1] == "", means leading @@,
+        # don't add one back in.
+        for (i = 2; i <= n; i++) @{
+            if (a[i] == "") @{ # was an @@@@
+                a[i] = "@@"
+                if (a[i+1] == "")
+                    i++
+            @}
+        @}
+@group
+        print join(a, 1, n, SUBSEP) > curfile
+    @}
+@}
+@end group
+@c endfile
+@end example
+
+An important thing to note is the use of the @samp{>} redirection.
+Output done with @samp{>} only opens the file once; it stays open and
+subsequent output is appended to the file
+(@pxref{Redirection}).
+This makes it easy to mix program text and explanatory prose for the same
+sample source file (as has been done here!) without any hassle.  The file is
+only closed when a new @value{DF} name is encountered or at the end of the
+input file.
+
+When a new @value{FN} is encountered, instead of closing the file,
+the program saves the name of the current file in @code{filelist}.
+This makes it possible to interleave the code for more than one file in
+the Texinfo input file.  (Previous versions of this program @emph{did}
+close the file. But because of the @samp{>} redirection, a file whose
+parts were not all one after the other ended up getting clobbered.)
+An @code{END} rule then closes all the open files when processing
+is finished:
+
+@example
+@c file eg/prog/extract.awk
+@group
+END @{
+    close(curfile)          # close the last one
+    for (f in filelist)     # close all the rest
+        close(f)
+@}
+@end group
+@c endfile
+@end example
+
+Finally, the function @code{@w{unexpected_eof()}} prints an appropriate
+error message and then exits:
+
+@example
+@c file eg/prog/extract.awk
+@group
+function unexpected_eof()
+@{
+    printf("extract: %s:%d: unexpected EOF or error\n",
+                     FILENAME, FNR) > "/dev/stderr"
+    exit 1
+@}
+@end group
+@c endfile
+@end example
+
+@node Simple Sed
+@subsection A Simple Stream Editor
+
+@cindex @command{sed} utility
+@cindex stream editors
+The @command{sed} utility is a @dfn{stream editor}, a program that reads a
+stream of data, makes changes to it, and passes it on.
+It is often used to make global changes to a large file or to a stream
+of data generated by a pipeline of commands.
+Although @command{sed} is a complicated program in its own right, its most common
+use is to perform global substitutions in the middle of a pipeline:
+
+@example
+@var{command1} < orig.data | sed 's/old/new/g' | @var{command2} > result
+@end example
+
+Here, @samp{s/old/new/g} tells @command{sed} to look for the regexp
+@samp{old} on each input line and globally replace it with the text
+@samp{new} (i.e., all the occurrences on a line).  This is similar to
+@command{awk}'s @code{gsub()} function
+(@pxref{String Functions}).
+
+The following program, @file{awksed.awk}, accepts at least two command-line
+arguments: the pattern to look for and the text to replace it with. Any
+additional arguments are treated as @value{DF} names to process. If none
+are provided, the standard input is used:
+
+@cindex Brennan, Michael
+@cindex @command{awksed.awk} program
+@c @cindex simple stream editor
+@c @cindex stream editor, simple
+@example
+@c file eg/prog/awksed.awk
+# awksed.awk --- do s/foo/bar/g using just print
+#    Thanks to Michael Brennan for the idea
+@c endfile
+@ignore
+@c file eg/prog/awksed.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# August 1995
+@c endfile
+@end ignore
+@c file eg/prog/awksed.awk
+
+function usage()
+@{
+    print "usage: awksed pat repl [files...]" > "/dev/stderr"
+    exit 1
+@}
+
+@group
+BEGIN @{
+    # validate arguments
+    if (ARGC < 3)
+        usage()
+@end group
+
+    RS = ARGV[1]
+    ORS = ARGV[2]
+
+    # don't use arguments as files
+    ARGV[1] = ARGV[2] = ""
+@}
+
+@group
+# look ma, no hands!
+@{
+    if (RT == "")
+        printf "%s", $0
+    else
+        print
+@}
+@end group
+@c endfile
+@end example
+
+The program relies on @command{gawk}'s ability to have @code{RS} be a regexp,
+as well as on the setting of @code{RT} to the actual text that terminates the
+record (@pxref{Records}).
+
+The idea is to have @code{RS} be the pattern to look for. @command{gawk}
+automatically sets @code{$0} to the text between matches of the pattern.
+This is text that we want to keep, unmodified.  Then, by setting @code{ORS}
+to the replacement text, a simple @code{print} statement outputs the
+text we want to keep, followed by the replacement text.
+
+There is one wrinkle to this scheme, which is what to do if the last record
+doesn't end with text that matches @code{RS}.  Using a @code{print}
+statement unconditionally prints the replacement text, which is not correct.
+However, if the file did not end in text that matches @code{RS}, @code{RT}
+is set to the null string.  In this case, we can print @code{$0} using
+@code{printf}
+(@pxref{Printf}).
+
+The @code{BEGIN} rule handles the setup, checking for the right number
+of arguments and calling @code{usage()} if there is a problem. Then it sets
+@code{RS} and @code{ORS} from the command-line arguments and sets
+@code{ARGV[1]} and @code{ARGV[2]} to the null string, so that they are
+not treated as @value{FN}s
+(@pxref{ARGC and ARGV}).
+
+The @code{usage()} function prints an error message and exits.
+Finally, the single rule handles the printing scheme outlined earlier,
+using @code{print} or @code{printf} as appropriate, depending upon the
+value of @code{RT}.
+
+@node Igawk Program
+@subsection An Easy Way to Use Library Functions
+
+@cindex libraries of @command{awk} functions, example program for using
+@cindex functions, library, example program for using
+In @ref{Include Files}, we saw how @command{gawk} provides a built-in
+file-inclusion capability.  However, this is a @command{gawk} extension.
+This @value{SECTION} provides the motivation for making file inclusion
+available for standard @command{awk}, and shows how to do it using a
+combination of shell and @command{awk} programming.
+
+Using library functions in @command{awk} can be very beneficial. It
+encourages code reuse and the writing of general functions. Programs are
+smaller and therefore clearer.
+However, using library functions is only easy when writing @command{awk}
+programs; it is painful when running them, requiring multiple @option{-f}
+options.  If @command{gawk} is unavailable, then so too is the @env{AWKPATH}
+environment variable and the ability to put @command{awk} functions into a
+library directory (@pxref{Options}).
+It would be nice to be able to write programs in the following manner:
+
+@example
+# library functions
+@@include getopt.awk
+@@include join.awk
+@dots{}
+
+# main program
+BEGIN @{
+    while ((c = getopt(ARGC, ARGV, "a:b:cde")) != -1)
+        @dots{}
+    @dots{}
+@}
+@end example
+
+The following program, @file{igawk.sh}, provides this service.
+It simulates @command{gawk}'s searching of the @env{AWKPATH} variable
+and also allows @dfn{nested} includes (i.e., a file that is included
+with @code{@@include} can contain further @code{@@include} statements).
+@command{igawk} makes an effort to only include files once, so that nested
+includes don't accidentally include a library function twice.
+
+@command{igawk} should behave just like @command{gawk} externally.  This
+means it should accept all of @command{gawk}'s command-line arguments,
+including the ability to have multiple source files specified via
+@option{-f} and the ability to mix command-line and library source files.
+
+The program is written using the POSIX Shell (@command{sh}) command
+language.@footnote{Fully explaining the @command{sh} language is beyond
+the scope of this book. We provide some minimal explanations, but see
+a good shell programming book if you wish to understand things in more
+depth.} It works as follows:
+
+@enumerate
+@item
+Loop through the arguments, saving anything that doesn't represent
+@command{awk} source code for later, when the expanded program is run.
+
+@item
+For any arguments that do represent @command{awk} text, put the arguments into
+a shell variable that will be expanded.  There are two cases:
+
+@enumerate a
+@item
+Literal text, provided with @option{-e} or @option{--source}.  This
+text is just appended directly.
+
+@item
+Source @value{FN}s, provided with @option{-f}.  We use a neat trick and
+append @samp{@@include @var{filename}} to the shell variable's contents.
+Because the file-inclusion program works the way @command{gawk} does, this
+gets the text of the file included in the program at the correct point.
+@end enumerate
+
+@item
+Run an @command{awk} program (naturally) over the shell variable's contents to expand
+@code{@@include} statements.  The expanded program is placed in a second
+shell variable.
+
+@item
+Run the expanded program with @command{gawk} and any other original command-line
+arguments that the user supplied (such as the @value{DF} names).
+@end enumerate
+
+This program uses shell variables extensively: for storing command-line arguments and
+the text of the @command{awk} program that will expand the user's program, for the
+user's original program, and for the expanded program.  Doing so removes some
+potential problems that might arise were we to use temporary files instead,
+at the cost of making the script somewhat more complicated.
+
+The initial part of the program turns on shell tracing if the first
+argument is @samp{debug}.
+
+The next part loops through all the command-line arguments.
+There are several cases of interest:
+
+@c @asis for docbook
+@table @asis
+@item @option{--}
+This ends the arguments to @command{igawk}.  Anything else should be passed on
+to the user's @command{awk} program without being evaluated.
+
+@item @option{-W}
+This indicates that the next option is specific to @command{gawk}.  To make
+argument processing easier, the @option{-W} is appended to the front of the
+remaining arguments and the loop continues.  (This is an @command{sh}
+programming trick.  Don't worry about it if you are not familiar with
+@command{sh}.)
+
+@item @option{-v}, @option{-F}
+These are saved and passed on to @command{gawk}.
+
+@item @option{-f}, @option{--file}, @option{--file=}, @option{-Wfile=}
+The @value{FN} is appended to the shell variable @code{program} with an
+@code{@@include} statement.
+The @command{expr} utility is used to remove the leading option part of the
+argument (e.g., @samp{--file=}).
+(Typical @command{sh} usage would be to use the @command{echo} and @command{sed}
+utilities to do this work.  Unfortunately, some versions of @command{echo} evaluate
+escape sequences in their arguments, possibly mangling the program text.
+Using @command{expr} avoids this problem.)
+
+@item @option{--source}, @option{--source=}, @option{-Wsource=}
+The source text is appended to @code{program}.
+
+@item @option{--version}, @option{-Wversion}
+@command{igawk} prints its version number, runs @samp{gawk --version}
+to get the @command{gawk} version information, and then exits.
+@end table
+
+If none of the @option{-f}, @option{--file}, @option{-Wfile}, @option{--source},
+or @option{-Wsource} arguments are supplied, then the first nonoption argument
+should be the @command{awk} program.  If there are no command-line
+arguments left, @command{igawk} prints an error message and exits.
+Otherwise, the first argument is appended to @code{program}.
+In any case, after the arguments have been processed,
+the shell variable
+@code{program} contains the complete text of the original @command{awk}
+program.
+
+The program is as follows:
+
+@cindex @code{igawk.sh} program
+@example
+@c file eg/prog/igawk.sh
+#! /bin/sh
+# igawk --- like gawk but do @@include processing
+@c endfile
+@ignore
+@c file eg/prog/igawk.sh
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# July 1993
+# December 2010, minor edits
+@c endfile
+@end ignore
+@c file eg/prog/igawk.sh
+
+if [ "$1" = debug ]
+then
+    set -x
+    shift
+fi
+
+# A literal newline, so that program text is formatted correctly
+n='
+'
+
+# Initialize variables to empty
+program=
+opts=
+
+while [ $# -ne 0 ] # loop over arguments
+do
+    case $1 in
+    --)     shift
+            break ;;
+
+    -W)     shift
+            # The $@{x?'message here'@} construct prints a
+            # diagnostic if $x is the null string
+            set -- -W"$@{@@?'missing operand'@}"
+            continue ;;
+
+    -[vF])  opts="$opts $1 '$@{2?'missing operand'@}'"
+            shift ;;
+
+    -[vF]*) opts="$opts '$1'" ;;
+
+    -f)     program="$program$n@@include $@{2?'missing operand'@}"
+            shift ;;
+
+    -f*)    f=$(expr "$1" : '-f\(.*\)')
+            program="$program$n@@include $f" ;;
+
+    -[W-]file=*)
+            f=$(expr "$1" : '-.file=\(.*\)')
+            program="$program$n@@include $f" ;;
+
+    -[W-]file)
+            program="$program$n@@include $@{2?'missing operand'@}"
+            shift ;;
+
+    -[W-]source=*)
+            t=$(expr "$1" : '-.source=\(.*\)')
+            program="$program$n$t" ;;
+
+    -[W-]source)
+            program="$program$n$@{2?'missing operand'@}"
+            shift ;;
+
+    -[W-]version)
+            echo igawk: version 3.0 1>&2
+            gawk --version
+            exit 0 ;;
+
+    -[W-]*) opts="$opts '$1'" ;;
+
+    *)      break ;;
+    esac
+    shift
+done
+
+if [ -z "$program" ]
+then
+     program=$@{1?'missing program'@}
+     shift
+fi
+
+# At this point, `program' has the program.
+@c endfile
+@end example
+
+The @command{awk} program to process @code{@@include} directives
+is stored in the shell variable @code{expand_prog}.  Doing this keeps
+the shell script readable.  The @command{awk} program
+reads through the user's program, one line at a time, using @code{getline}
+(@pxref{Getline}).  The input
+@value{FN}s and @code{@@include} statements are managed using a stack.
+As each @code{@@include} is encountered, the current @value{FN} is
+``pushed'' onto the stack and the file named in the @code{@@include}
+directive becomes the current @value{FN}.  As each file is finished,
+the stack is ``popped,'' and the previous input file becomes the current
+input file again.  The process is started by making the original file
+the first one on the stack.
+
+The @code{pathto()} function does the work of finding the full path to
+a file.  It simulates @command{gawk}'s behavior when searching the
+@env{AWKPATH} environment variable
+(@pxref{AWKPATH Variable}).
+If a @value{FN} has a @samp{/} in it, no path search is done.
+Similarly, if the @value{FN} is @code{"-"}, then that string is
+used as-is.  Otherwise,
+the @value{FN} is concatenated with the name of each directory in
+the path, and an attempt is made to open the generated @value{FN}.
+The only way to test if a file can be read in @command{awk} is to go
+ahead and try to read it with @code{getline}; this is what @code{pathto()}
+does.@footnote{On some very old versions of @command{awk}, the test
+@samp{getline junk < t} can loop forever if the file exists but is empty.}
+If the file can be read, it is closed and the @value{FN}
+is returned:
+
+@ignore
+An alternative way to test for the file's existence would be to call
+@samp{system("test -r " t)}, which uses the @command{test} utility to
+see if the file exists and is readable.  The disadvantage to this method
+is that it requires creating an extra process and can thus be slightly
+slower.
+@end ignore
+
+@example
+@c file eg/prog/igawk.sh
+expand_prog='
+
+function pathto(file,    i, t, junk)
+@{
+    if (index(file, "/") != 0)
+        return file
+
+    if (file == "-")
+        return file
+
+    for (i = 1; i <= ndirs; i++) @{
+        t = (pathlist[i] "/" file)
+@group
+        if ((getline junk < t) > 0) @{
+            # found it
+            close(t)
+            return t
+        @}
+@end group
+    @}
+    return ""
+@}
+@c endfile
+@end example
+
+The main program is contained inside one @code{BEGIN} rule.  The first thing it
+does is set up the @code{pathlist} array that @code{pathto()} uses.  After
+splitting the path on @samp{:}, null elements are replaced with @code{"."},
+which represents the current directory:
+
+@example
+@c file eg/prog/igawk.sh
+BEGIN @{
+    path = ENVIRON["AWKPATH"]
+    ndirs = split(path, pathlist, ":")
+    for (i = 1; i <= ndirs; i++) @{
+        if (pathlist[i] == "")
+            pathlist[i] = "."
+    @}
+@c endfile
+@end example
+
+The stack is initialized with @code{ARGV[1]}, which will be @code{"/dev/stdin"}.
+The main loop comes next.  Input lines are read in succession. Lines that
+do not start with @code{@@include} are printed verbatim.
+If the line does start with @code{@@include}, the @value{FN} is in @code{$2}.
+@code{pathto()} is called to generate the full path.  If it cannot, then the program
+prints an error message and continues.
+
+The next thing to check is if the file is included already.  The
+@code{processed} array is indexed by the full @value{FN} of each included
+file and it tracks this information for us.  If the file is
+seen again, a warning message is printed. Otherwise, the new @value{FN} is
+pushed onto the stack and processing continues.
+
+Finally, when @code{getline} encounters the end of the input file, the file
+is closed and the stack is popped.  When @code{stackptr} is less than zero,
+the program is done:
+
+@example
+@c file eg/prog/igawk.sh
+    stackptr = 0
+    input[stackptr] = ARGV[1] # ARGV[1] is first file
+
+    for (; stackptr >= 0; stackptr--) @{
+        while ((getline < input[stackptr]) > 0) @{
+            if (tolower($1) != "@@include") @{
+                print
+                continue
+            @}
+            fpath = pathto($2)
+            if (fpath == "") @{
+                printf("igawk: %s:%d: cannot find %s\n",
+                    input[stackptr], FNR, $2) > "/dev/stderr"
+                continue
+            @}
+            if (! (fpath in processed)) @{
+                processed[fpath] = input[stackptr]
+                input[++stackptr] = fpath  # push onto stack
+            @} else
+                print $2, "included in", input[stackptr],
+                    "already included in",
+                    processed[fpath] > "/dev/stderr"
+        @}
+        close(input[stackptr])
+    @}
+@}'  # close quote ends `expand_prog' variable
+
+processed_program=$(gawk -- "$expand_prog" /dev/stdin << EOF
+$program
+EOF
+)
+@c endfile
+@end example
+
+The shell construct @samp{@var{command} << @var{marker}} is called
+a @dfn{here document}.  Everything in the shell script up to the
+@var{marker} is fed to @var{command} as input.  The shell processes
+the contents of the here document for variable and command substitution
+(and possibly other things as well, depending upon the shell).
+
+The shell construct @samp{$(@dots{})} is called @dfn{command substitution}.
+The output of the command inside the parentheses is substituted
+into the command line.
+Because the result is used in a variable assignment,
+it is saved as a single string, even if the results contain whitespace.
+
+The expanded program is saved in the variable @code{processed_program}.
+It's done in these steps:
+
+@enumerate
+@item
+Run @command{gawk} with the @code{@@include}-processing program (the
+value of the @code{expand_prog} shell variable) reading standard input.
+
+@item
+Standard input is the contents of the user's program,
+from the shell variable @code{program}.
+Feed its contents to @command{gawk} via a here document.
+
+@item
+Save the results of this processing in the shell variable
+@code{processed_program} by using command substitution.
+@end enumerate
+
+The last step is to call @command{gawk} with the expanded program,
+along with the original
+options and command-line arguments that the user supplied:
+
+@example
+@c file eg/prog/igawk.sh
+eval gawk $opts -- '"$processed_program"' '"$@@"'
+@c endfile
+@end example
+
+The @command{eval} command is a shell construct that reruns the shell's parsing
+process.  This keeps things properly quoted.
+
+This version of @command{igawk} represents the fifth version of this program.
+There are four key simplifications that make the program work better:
+
+@itemize @value{BULLET}
+@item
+Using @code{@@include} even for the files named with @option{-f} makes building
+the initial collected @command{awk} program much simpler; all the
+@code{@@include} processing can be done once.
+
+@item
+Not trying to save the line read with @code{getline}
+in the @code{pathto()} function when testing for the
+file's accessibility for use with the main program simplifies things
+considerably.
+
+@item
+Using a @code{getline} loop in the @code{BEGIN} rule does it all in one
+place.  It is not necessary to call out to a separate loop for processing
+nested @code{@@include} statements.
+
+@item
+Instead of saving the expanded program in a temporary file, putting it in a shell variable
+avoids some potential security problems.
+This has the disadvantage that the script relies upon more features
+of the @command{sh} language, making it harder to follow for those who
+aren't familiar with @command{sh}.
+@end itemize
+
+Also, this program illustrates that it is often worthwhile to combine
+@command{sh} and @command{awk} programming together.  You can usually
+accomplish quite a lot, without having to resort to low-level programming
+in C or C++, and it is frequently easier to do certain kinds of string
+and argument manipulation using the shell than it is in @command{awk}.
+
+Finally, @command{igawk} shows that it is not always necessary to add new
+features to a program; they can often be layered on top.@footnote{@command{gawk}
+does @code{@@include} processing itself in order to support the use
+of @command{awk} programs as Web CGI scripts.}
+
+
+@node Anagram Program
+@subsection Finding Anagrams from a Dictionary
+
+@cindex anagrams, finding
+An interesting programming challenge is to
+search for @dfn{anagrams} in a
+word list (such as
+@file{/usr/share/dict/words} on many GNU/Linux systems).
+One word is an anagram of another if both words contain
+the same letters
+(e.g., ``babbling'' and ``blabbing'').
+
+Column 2, Problem C, of Jon Bentley's @cite{Programming Pearls}, Second
+Edition, presents an elegant algorithm.  The idea is to give words that
+are anagrams a common signature, sort all the words together by their
+signatures, and then print them.  Dr.@: Bentley observes that taking the
+letters in each word and sorting them produces those common signatures.
+
+The following program uses arrays of arrays to bring together
+words with the same signature and array sorting to print the words
+in sorted order:
+
+@cindex @code{anagram.awk} program
+@example
+@c file eg/prog/anagram.awk
+# anagram.awk --- An implementation of the anagram-finding algorithm
+#                 from Jon Bentley's "Programming Pearls," 2nd edition.
+#                 Addison Wesley, 2000, ISBN 0-201-65788-0.
+#                 Column 2, Problem C, section 2.8, pp 18-20.
+@c endfile
+@ignore
+@c file eg/prog/anagram.awk
+#
+# This program requires gawk 4.0 or newer.
+# Required gawk-specific features:
+#   - True multidimensional arrays
+#   - split() with "" as separator splits out individual characters
+#   - asort() and asorti() functions
+#
+# See https://savannah.gnu.org/projects/gawk.
+#
+# Arnold Robbins
+# arnold@@skeeve.com
+# Public Domain
+# January, 2011
+@c endfile
+@end ignore
+@c file eg/prog/anagram.awk
+
+/'s$/   @{ next @}        # Skip possessives
+@c endfile
+@end example
+
+The program starts with a header, and then a rule to skip
+possessives in the dictionary file. The next rule builds
+up the data structure. The first dimension of the array
+is indexed by the signature; the second dimension is the word
+itself:
+
+@example
+@c file eg/prog/anagram.awk
+@{
+    key = word2key($1)  # Build signature
+    data[key][$1] = $1  # Store word with signature
+@}
+@c endfile
+@end example
+
+The @code{word2key()} function creates the signature.
+It splits the word apart into individual letters,
+sorts the letters, and then joins them back together:
+
+@example
+@c file eg/prog/anagram.awk
+# word2key --- split word apart into letters, sort, and join back together
+
+function word2key(word,     a, i, n, result)
+@{
+    n = split(word, a, "")
+    asort(a)
+
+    for (i = 1; i <= n; i++)
+        result = result a[i]
+
+    return result
+@}
+@c endfile
+@end example
+
+Finally, the @code{END} rule traverses the array
+and prints out the anagram lists.  It sends the output
+to the system @command{sort} command because otherwise
+the anagrams would appear in arbitrary order:
+
+@example
+@c file eg/prog/anagram.awk
+END @{
+    sort = "sort"
+    for (key in data) @{
+        # Sort words with same key
+        nwords = asorti(data[key], words)
+        if (nwords == 1)
+            continue
+
+        # And print. Minor glitch: trailing space at end of each line
+        for (j = 1; j <= nwords; j++)
+            printf("%s ", words[j]) | sort
+        print "" | sort
+    @}
+    close(sort)
+@}
+@c endfile
+@end example
+
+Here is some partial output when the program is run:
+
+@example
+$ @kbd{gawk -f anagram.awk /usr/share/dict/words | grep '^b'}
+@dots{}
+babbled blabbed
+babbler blabber brabble
+babblers blabbers brabbles
+babbling blabbing
+babbly blabby
+babel bable
+babels beslab
+babery yabber
+@dots{}
+@end example
+
+
+@node Signature Program
+@subsection And Now for Something Completely Different
+
+@cindex signature program
+@cindex Brini, Davide
+The following program was written by Davide Brini
+@c (@email{dave_br@@gmx.com})
+and is published on @uref{http://backreference.org/2011/02/03/obfuscated-awk/,
+his website}.
+It serves as his signature in the Usenet group @code{comp.lang.awk}.
+He supplies the following copyright terms:
+
+@quotation
+Copyright @copyright{} 2008 Davide Brini
+
+Copying and distribution of the code published in this page, with or without
+modification, are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+@end quotation
+
+Here is the program:
+
+@example
+@group
+awk 'BEGIN@{O="~"~"~";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),x-O@}'
+@end group
+@end example
+
+@cindex Johansen, Chris
+We leave it to you to determine what the program does.  (If you are
+truly desperate to understand it, see Chris Johansen's explanation,
+which is embedded in the Texinfo source file for this @value{DOCUMENT}.)
+
+@ignore
+To: "Arnold Robbins" <arnold@skeeve.com>
+Date: Sat, 20 Aug 2011 13:50:46 -0400
+Subject: The GNU Awk User's Guide, Section 13.3.11
+From: "Chris Johansen" <johansen@main.nc.us>
+Message-ID: <op.v0iw6wlv7finx3@asusodin.thrudvang.lan>
+
+Arnold, you don't know me, but we have a tenuous connection.  My wife is
+Barbara A. Field, FAIA, GIT '65 (B. Arch.).
+
+I have had a couple of paper copies of "Effective Awk Programming" for
+years, and now I'm going through a Kindle version of "The GNU Awk User's
+Guide" again.  When I got to section 13.3.11, I reformatted and lightly
+commented Davide Brin's signature script to understand its workings.
+
+It occurs to me that this might have pedagogical value as an example
+(although imperfect) of the value of whitespace and comments, and a
+starting point for that discussion.  It certainly helped _me_ understand
+what's going on.  You are welcome to it, as-is or modified (subject to
+Davide's constraints, of course, which I think I have met).
+
+If I were to include it in a future edition, I would put it at some
+distance from section 13.3.11, say, as a note or an appendix, so as not to
+be a "spoiler" to the puzzle.
+
+Best regards,
+--
+Chris Johansen {johansen at main dot nc dot us}
+  . . . collapsing the probability wave function, sending ripples of
+certainty through the space-time continuum.
+
+
+#! /usr/bin/gawk -f
+
+# From "13.3.11 And Now For Something Completely Different"
+#   https://www.gnu.org/software/gawk/manual/html_node/Signature-Program.html#Signature-Program
+
+# Copyright @copyright{} 2008 Davide Brini
+
+# Copying and distribution of the code published in this page, with
+# or without modification, are permitted in any medium without
+# royalty provided the copyright notice and this notice are preserved.
+
+BEGIN {
+  O = "~" ~ "~";    #  1
+  o = "==" == "=="; #  1
+  o += +o;          #  2
+  x = O "" O;       # 11
+
+
+  while ( X++ <= x + o + o ) c = c "%c";
+
+  # O is  1
+  # o is  2
+  # x is 11
+  # X is 17
+  # c is "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"
+
+  printf c,
+    ( x - O )*( x - O),                  # 100 d
+    x*( x - o ) - o,                     #  97 a
+    x*( x - O ) + x - O - o,             # 118 v
+    +x*( x - O ) - x + o,                # 101 e
+    X*( o*o + O ) + x - O,               #  95 _
+    X*( X - x ) - o*o,                   #  98 b
+    ( x + X )*o*o + o,                   # 114 r
+    x*( X - x ) - O - O,                 #  64 @
+    x - O + ( O + o + X + x )*( o + O ), # 103 g
+    X*X - X*( x - O ) - x + O,           # 109 m
+    O + X*( o*( o + O ) + O ),           # 120 x
+    +x + O + X*o,                        #  46 .
+    x*( x - o),                          #  99 c
+    ( o + X + x )*o*o - ( x - O - O ),   # 111 0
+    O + ( X - x )*( X + O ),             # 109 m
+    x - O                                #  10 \n
+}
+@end ignore
+
+@node Programs Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+The programs provided in this @value{CHAPTER}
+continue on the theme that reading programs is an excellent way to learn
+Good Programming.
+
+@item
+Using @samp{#!} to make @command{awk} programs directly runnable makes
+them easier to use.  Otherwise, invoke the program using @samp{awk
+-f @dots{}}.
+
+@item
+Reimplementing standard POSIX programs in @command{awk} is a pleasant
+exercise; @command{awk}'s expressive power lets you write such programs
+in relatively few lines of code, yet they are functionally complete
+and usable.
+
+@item
+One of standard @command{awk}'s weaknesses is working with individual
+characters.  The ability to use @code{split()} with the empty string as
+the separator can considerably simplify such tasks.
+
+@item
+The examples here demonstrate the usefulness of the library
+functions from @ref{Library Functions}
+for a number of real (if small) programs.
+
+@item
+Besides reinventing POSIX wheels, other programs solved a selection of
+interesting problems, such as finding duplicate words in text, printing
+mailing labels, and finding anagrams.
+
+@end itemize
+
+@c EXCLUDE START
+@node Programs Exercises
+@section Exercises
+
+@enumerate
+@item
+Rewrite @file{cut.awk} (@pxref{Cut Program})
+using @code{split()} with @code{""} as the separator.
+
+@item
+In @ref{Egrep Program}, we mentioned that @samp{egrep -i} could be
+simulated in versions of @command{awk} without @code{IGNORECASE} by
+using @code{tolower()} on the line and the pattern. In a footnote there,
+we also mentioned that this solution has a bug: the translated line is
+output, and not the original one.  Fix this problem.
+@c Exercise: Fix this, w/array and new line as key to original line
+
+@item
+The POSIX version of @command{id} takes options that control which
+information is printed.  Modify the @command{awk} version
+(@pxref{Id Program}) to accept the same arguments and perform in the
+same way.
+
+@item
+The @code{split.awk} program (@pxref{Split Program}) assumes
+that letters are contiguous in the character set,
+which isn't true for EBCDIC systems.
+Fix this problem.
+(Hint: Consider a different way to work through the alphabet,
+without relying on @code{ord()} and @code{chr()}.)
+
+@item
+In @file{uniq.awk} (@pxref{Uniq Program}, the
+logic for choosing which lines to print represents a @dfn{state
+machine}, which is ``a device that can be in one of a set number of stable
+conditions depending on its previous condition and on the present values
+of its inputs.''@footnote{This is the definition returned from entering
+@code{define: state machine} into Google.}
+Brian Kernighan suggests that
+``an alternative approach to state machines is to just read
+the input into an array, then use indexing.  It's almost always
+easier code, and for most inputs where you would use this, just
+as fast.''  Rewrite the logic to follow this
+suggestion.
+
+
+@item
+Why can't the @file{wc.awk} program (@pxref{Wc Program}) just
+use the value of @code{FNR} in @code{endfile()}?
+Hint: Examine the code in @ref{Filetrans Function}.
+
+@ignore
+@command{wc} can't just use the value of @code{FNR} in
+@code{endfile()}. If you examine the code in @ref{Filetrans Function},
+you will see that @code{FNR} has already been reset by the time
+@code{endfile()} is called.
+@end ignore
+
+@item
+Manipulation of individual characters in the @command{translate} program
+(@pxref{Translate Program}) is painful using standard @command{awk}
+functions.  Given that @command{gawk} can split strings into individual
+characters using @code{""} as the separator, how might you use this
+feature to simplify the program?
+
+@item
+The @file{extract.awk} program (@pxref{Extract Program}) was written
+before @command{gawk} had the @code{gensub()} function.  Use it
+to simplify the code.
+
+@item
+Compare the performance of the @file{awksed.awk} program
+(@pxref{Simple Sed}) with the more straightforward:
+
+@example
+BEGIN @{
+    pat = ARGV[1]
+    repl = ARGV[2]
+    ARGV[1] = ARGV[2] = ""
+@}
+
+@{ gsub(pat, repl); print @}
+@end example
+
+@item
+What are the advantages and disadvantages of @file{awksed.awk} versus
+the real @command{sed} utility?
+
+@ignore
+  Advantage: egrep regexps
+             speed (?)
+  Disadvantage: no & in replacement text
+
+Others?
+@end ignore
+
+@item
+In @ref{Igawk Program}, we mentioned that not trying to save the line
+read with @code{getline} in the @code{pathto()} function when testing
+for the file's accessibility for use with the main program simplifies
+things considerably.  What problem does this engender though?
+@c answer, reading from "-" or /dev/stdin
+
+@cindex search paths
+@cindex search paths, for source files
+@cindex source files@comma{} search path for
+@cindex files, source@comma{} search path for
+@cindex directories, searching
+@item
+As an additional example of the idea that it is not always necessary to
+add new features to a program, consider the idea of having two files in
+a directory in the search path:
+
+@table @file
+@item default.awk
+This file contains a set of default library functions, such
+as @code{getopt()} and @code{assert()}.
+
+@item site.awk
+This file contains library functions that are specific to a site or
+installation; i.e., locally developed functions.
+Having a separate file allows @file{default.awk} to change with
+new @command{gawk} releases, without requiring the system administrator to
+update it each time by adding the local functions.
+@end table
+
+One user
+@c Karl Berry, karl@ileaf.com, 10/95
+suggested that @command{gawk} be modified to automatically read these files
+upon startup.  Instead, it would be very simple to modify @command{igawk}
+to do this. Since @command{igawk} can process nested @code{@@include}
+directives, @file{default.awk} could simply contain @code{@@include}
+statements for the desired library functions.
+Make this change.
+
+@item
+Modify @file{anagram.awk} (@pxref{Anagram Program}), to avoid
+the use of the external @command{sort} utility.
+
+@end enumerate
+@c EXCLUDE END
+
+@ifnotinfo
+@part @value{PART3}Moving Beyond Standard @command{awk} with @command{gawk}
+@end ifnotinfo
+
+@ifdocbook
+Part III focuses on features specific to @command{gawk}.
+It contains the following chapters:
+
+@itemize @value{BULLET}
+@item
+@ref{Namespaces}
+
+@item
+@ref{Advanced Features}
+
+@item
+@ref{Internationalization}
+
+@item
+@ref{Debugger}
+
+@item
+@ref{Arbitrary Precision Arithmetic}
+
+@item
+@ref{Dynamic Extensions}
+@end itemize
+@end ifdocbook
+
+@node Advanced Features
+@chapter Advanced Features of @command{gawk}
+@cindex @command{gawk}, features, advanced
+@cindex advanced features, @command{gawk}
+@ignore
+Contributed by: Peter Langston <pud!psl@bellcore.bellcore.com>
+
+    Found in Steve English's "signature" line:
+
+"Write documentation as if whoever reads it is a violent psychopath
+who knows where you live."
+@end ignore
+@cindex Langston, Peter
+@cindex English, Steve
+@quotation
+@i{Write documentation as if whoever reads it is
+a violent psychopath who knows where you live.}
+@author Steve English, as quoted by Peter Langston
+@end quotation
+
+This @value{CHAPTER} discusses advanced features in @command{gawk}.
+It's a bit of a ``grab bag'' of items that are otherwise unrelated
+to each other.
+First, we look at a command-line option that allows @command{gawk} to recognize
+nondecimal numbers in input data, not just in @command{awk}
+programs.
+Then, @command{gawk}'s special features for sorting arrays are presented.
+Next, two-way I/O, discussed briefly in earlier parts of this
+@value{DOCUMENT}, is described in full detail, along with the basics
+of TCP/IP networking.  Finally, we see how @command{gawk}
+can @dfn{profile} an @command{awk} program, making it possible to tune
+it for performance.
+
+@c FULLXREF ON
+Additional advanced features are discussed in separate @value{CHAPTER}s of their
+own:
+
+@itemize @value{BULLET}
+@item
+@ref{Internationalization}, discusses how to internationalize
+your @command{awk} programs, so that they can speak multiple
+national languages.
+
+@item
+@ref{Debugger}, describes @command{gawk}'s built-in command-line
+debugger for debugging @command{awk} programs.
+
+@item
+@ref{Arbitrary Precision Arithmetic}, describes how you can use
+@command{gawk} to perform arbitrary-precision arithmetic.
+
+@item
+@ref{Dynamic Extensions},
+discusses the ability to dynamically add new built-in functions to
+@command{gawk}.
+@end itemize
+@c FULLXREF OFF
+
+@menu
+* Nondecimal Data::             Allowing nondecimal input data.
+* Array Sorting::               Facilities for controlling array traversal and
+                                sorting arrays.
+* Two-way I/O::                 Two-way communications with another process.
+* TCP/IP Networking::           Using @command{gawk} for network programming.
+* Profiling::                   Profiling your @command{awk} programs.
+* Advanced Features Summary::   Summary of advanced features.
+@end menu
+
+@node Nondecimal Data
+@section Allowing Nondecimal Input Data
+@cindex @option{--non-decimal-data} option
+@cindex advanced features, nondecimal input data
+@cindex input, data@comma{} nondecimal
+@cindex constants, nondecimal
+
+If you run @command{gawk} with the @option{--non-decimal-data} option,
+you can have nondecimal values in your input data:
+
+@example
+$ @kbd{echo 0123 123 0x123 |}
+> @kbd{gawk --non-decimal-data '@{ printf "%d, %d, %d\n", $1, $2, $3 @}'}
+@print{} 83, 123, 291
+@end example
+
+For this feature to work, write your program so that
+@command{gawk} treats your data as numeric:
+
+@example
+$ @kbd{echo 0123 123 0x123 | gawk '@{ print $1, $2, $3 @}'}
+@print{} 0123 123 0x123
+@end example
+
+@noindent
+The @code{print} statement treats its expressions as strings.
+Although the fields can act as numbers when necessary,
+they are still strings, so @code{print} does not try to treat them
+numerically.  You need to add zero to a field to force it to
+be treated as a number.  For example:
+
+@example
+$ @kbd{echo 0123 123 0x123 | gawk --non-decimal-data '}
+> @kbd{@{ print $1, $2, $3}
+>   @kbd{print $1 + 0, $2 + 0, $3 + 0 @}'}
+@print{} 0123 123 0x123
+@print{} 83 123 291
+@end example
+
+Because it is common to have decimal data with leading zeros, and because
+using this facility could lead to surprising results, the default is to leave it
+disabled.  If you want it, you must explicitly request it.
+
+@cindex programming conventions, @code{--non-decimal-data} option
+@cindex @option{--non-decimal-data} option, @code{strtonum()} function and
+@cindex @code{strtonum()} function (@command{gawk}), @code{--non-decimal-data} option and
+@quotation CAUTION
+@emph{Use of this option is not recommended.}
+It can break old programs very badly.
+Instead, use the @code{strtonum()} function to convert your data
+(@pxref{String Functions}).
+This makes your programs easier to write and easier to read, and
+leads to less surprising results.
+
+This option may disappear in a future version of @command{gawk}.
+@end quotation
+
+@node Array Sorting
+@section Controlling Array Traversal and Array Sorting
+
+@command{gawk} lets you control the order in which a
+@samp{for (@var{indx} in @var{array})}
+loop traverses an array.
+
+In addition, two built-in functions, @code{asort()} and @code{asorti()},
+let you sort arrays based on the array values and indices, respectively.
+These two functions also provide control over the sorting criteria used
+to order the elements during sorting.
+
+@menu
+* Controlling Array Traversal:: How to use PROCINFO["sorted_in"].
+* Array Sorting Functions::     How to use @code{asort()} and @code{asorti()}.
+@end menu
+
+@node Controlling Array Traversal
+@subsection Controlling Array Traversal
+
+By default, the order in which a @samp{for (@var{indx} in @var{array})} loop
+scans an array is not defined; it is generally based upon
+the internal implementation of arrays inside @command{awk}.
+
+Often, though, it is desirable to be able to loop over the elements
+in a particular order that you, the programmer, choose.  @command{gawk}
+lets you do this.
+
+@ref{Controlling Scanning} describes how you can assign special,
+predefined values to @code{PROCINFO["sorted_in"]} in order to
+control the order in which @command{gawk} traverses an array
+during a @code{for} loop.
+
+In addition, the value of @code{PROCINFO["sorted_in"]} can be a
+function name.@footnote{This is why the predefined sorting orders
+start with an @samp{@@} character, which cannot be part of an identifier.}
+This lets you traverse an array based on any custom criterion.
+The array elements are ordered according to the return value of this
+function.  The comparison function should be defined with at least
+four arguments:
+
+@example
+function comp_func(i1, v1, i2, v2)
+@{
+    @var{compare elements 1 and 2 in some fashion}
+    @var{return < 0; 0; or > 0}
+@}
+@end example
+
+Here, @code{i1} and @code{i2} are the indices, and @code{v1} and @code{v2}
+are the corresponding values of the two elements being compared.
+Either @code{v1} or @code{v2}, or both, can be arrays if the array being
+traversed contains subarrays as values.
+(@xref{Arrays of Arrays} for more information about subarrays.)
+The three possible return values are interpreted as follows:
+
+@table @code
+@item comp_func(i1, v1, i2, v2) < 0
+Index @code{i1} comes before index @code{i2} during loop traversal.
+
+@item comp_func(i1, v1, i2, v2) == 0
+Indices @code{i1} and @code{i2}
+come together, but the relative order with respect to each other is undefined.
+
+@item comp_func(i1, v1, i2, v2) > 0
+Index @code{i1} comes after index @code{i2} during loop traversal.
+@end table
+
+Our first comparison function can be used to scan an array in
+numerical order of the indices:
+
+@example
+@group
+function cmp_num_idx(i1, v1, i2, v2)
+@{
+     # numerical index comparison, ascending order
+     return (i1 - i2)
+@}
+@end group
+@end example
+
+Our second function traverses an array based on the string order of
+the element values rather than by indices:
+
+@example
+function cmp_str_val(i1, v1, i2, v2)
+@{
+    # string value comparison, ascending order
+    v1 = v1 ""
+    v2 = v2 ""
+    if (v1 < v2)
+        return -1
+    return (v1 != v2)
+@}
+@end example
+
+The third
+comparison function makes all numbers, and numeric strings without
+any leading or trailing spaces, come out first during loop traversal:
+
+@example
+function cmp_num_str_val(i1, v1, i2, v2,   n1, n2)
+@{
+     # numbers before string value comparison, ascending order
+     n1 = v1 + 0
+     n2 = v2 + 0
+     if (n1 == v1)
+         return (n2 == v2) ? (n1 - n2) : -1
+     else if (n2 == v2)
+         return 1
+     return (v1 < v2) ? -1 : (v1 != v2)
+@}
+@end example
+
+Here is a main program to demonstrate how @command{gawk}
+behaves using each of the previous functions:
+
+@example
+BEGIN @{
+    data["one"] = 10
+    data["two"] = 20
+    data[10] = "one"
+    data[100] = 100
+    data[20] = "two"
+
+    f[1] = "cmp_num_idx"
+    f[2] = "cmp_str_val"
+    f[3] = "cmp_num_str_val"
+    for (i = 1; i <= 3; i++) @{
+        printf("Sort function: %s\n", f[i])
+        PROCINFO["sorted_in"] = f[i]
+        for (j in data)
+            printf("\tdata[%s] = %s\n", j, data[j])
+        print ""
+    @}
+@}
+@end example
+
+Here are the results when the program is run:
+
+@example
+$ @kbd{gawk -f compdemo.awk}
+@print{} Sort function: cmp_num_idx      @ii{Sort by numeric index}
+@print{}     data[two] = 20
+@print{}     data[one] = 10              @ii{Both strings are numerically zero}
+@print{}     data[10] = one
+@print{}     data[20] = two
+@print{}     data[100] = 100
+@print{}
+@print{} Sort function: cmp_str_val      @ii{Sort by element values as strings}
+@print{}     data[one] = 10
+@print{}     data[100] = 100             @ii{String 100 is less than string 20}
+@print{}     data[two] = 20
+@print{}     data[10] = one
+@print{}     data[20] = two
+@print{}
+@print{} Sort function: cmp_num_str_val  @ii{Sort all numeric values before all strings}
+@print{}     data[one] = 10
+@print{}     data[two] = 20
+@print{}     data[100] = 100
+@print{}     data[10] = one
+@print{}     data[20] = two
+@end example
+
+Consider sorting the entries of a GNU/Linux system password file
+according to login name.  The following program sorts records
+by a specific field position and can be used for this purpose:
+
+@example
+# passwd-sort.awk --- simple program to sort by field position
+# field position is specified by the global variable POS
+
+function cmp_field(i1, v1, i2, v2)
+@{
+    # comparison by value, as string, and ascending order
+    return v1[POS] < v2[POS] ? -1 : (v1[POS] != v2[POS])
+@}
+
+@{
+    for (i = 1; i <= NF; i++)
+        a[NR][i] = $i
+@}
+
+@group
+END @{
+    PROCINFO["sorted_in"] = "cmp_field"
+@end 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 ? ":" : "")
+        print ""
+    @}
+@}
+@end example
+
+The first field in each entry of the password file is the user's login name,
+and the fields are separated by colons.
+Each record defines a subarray,
+with each field as an element in the subarray.
+Running the program produces the
+following output:
+
+@example
+$ @kbd{gawk -v POS=1 -F: -f sort.awk /etc/passwd}
+@print{} adm:x:3:4:adm:/var/adm:/sbin/nologin
+@print{} apache:x:48:48:Apache:/var/www:/sbin/nologin
+@print{} avahi:x:70:70:Avahi daemon:/:/sbin/nologin
+@dots{}
+@end example
+
+The comparison should normally always return the same value when given a
+specific pair of array elements as its arguments.  If inconsistent
+results are returned, then the order is undefined.  This behavior can be
+exploited to introduce random order into otherwise seemingly
+ordered data:
+
+@example
+function cmp_randomize(i1, v1, i2, v2)
+@{
+    # random order (caution: this may never terminate!)
+    return (2 - 4 * rand())
+@}
+@end example
+
+As already mentioned, the order of the indices is arbitrary if two
+elements compare equal.  This is usually not a problem, but letting
+the tied elements come out in arbitrary order can be an issue, especially
+when comparing item values.  The partial ordering of the equal elements
+may change the next time the array is traversed, if other elements are added to or
+removed from the array.  One way to resolve ties when comparing elements
+with otherwise equal values is to include the indices in the comparison
+rules.  Note that doing this may make the loop traversal less efficient,
+so consider it only if necessary.  The following comparison functions
+force a deterministic order, and are based on the fact that the
+(string) indices of two elements are never equal:
+
+@example
+function cmp_numeric(i1, v1, i2, v2)
+@{
+    # numerical value (and index) comparison, descending order
+    return (v1 != v2) ? (v2 - v1) : (i2 - i1)
+@}
+
+@group
+function cmp_string(i1, v1, i2, v2)
+@{
+    # string value (and index) comparison, descending order
+    v1 = v1 i1
+    v2 = v2 i2
+    return (v1 > v2) ? -1 : (v1 != v2)
+@}
+@end group
+@end example
+
+@c Avoid using the term ``stable'' when describing the unpredictable behavior
+@c if two items compare equal.  Usually, the goal of a "stable algorithm"
+@c is to maintain the original order of the items, which is a meaningless
+@c concept for a list constructed from a hash.
+
+A custom comparison function can often simplify ordered loop
+traversal, and the sky is really the limit when it comes to
+designing such a function.
+
+When string comparisons are made during a sort, either for element
+values where one or both aren't numbers, or for element indices
+handled as strings, the value of @code{IGNORECASE}
+(@pxref{Built-in Variables}) controls whether
+the comparisons treat corresponding upper- and lowercase letters as
+equivalent or distinct.
+
+Another point to keep in mind is that in the case of subarrays,
+the element values can themselves be arrays; a production comparison
+function should use the @code{isarray()} function
+(@pxref{Type Functions})
+to check for this, and choose a defined sorting order for subarrays.
+
+All sorting based on @code{PROCINFO["sorted_in"]}
+is disabled in POSIX mode,
+because the @code{PROCINFO} array is not special in that case.
+
+As a side note, sorting the array indices before traversing
+the array has been reported to add a 15% to 20% overhead to the
+execution time of @command{awk} programs. For this reason,
+sorted array traversal is not the default.
+
+@c The @command{gawk}
+@c maintainers believe that only the people who wish to use a
+@c feature should have to pay for it.
+
+@node Array Sorting Functions
+@subsection Sorting Array Values and Indices with @command{gawk}
+
+@cindex arrays, sorting
+@cindexgawkfunc{asort}
+@cindex @code{asort()} function (@command{gawk}), arrays@comma{} sorting
+@cindexgawkfunc{asorti}
+@cindex @code{asorti()} function (@command{gawk}), arrays@comma{} sorting
+@cindex sort function, arrays, sorting
+In most @command{awk} implementations, sorting an array requires writing
+a @code{sort()} function.  This can be educational for exploring
+different sorting algorithms, but usually that's not the point of the program.
+@command{gawk} provides the built-in @code{asort()} and @code{asorti()}
+functions (@pxref{String Functions}) for sorting arrays.  For example:
+
+@example
+@var{populate the array} data
+n = asort(data)
+for (i = 1; i <= n; i++)
+    @var{do something with} data[i]
+@end example
+
+After the call to @code{asort()}, the array @code{data} is indexed from 1
+to some number @var{n}, the total number of elements in @code{data}.
+(This count is @code{asort()}'s return value.)
+@code{data[1]} @value{LEQ} @code{data[2]} @value{LEQ} @code{data[3]}, and so on.
+The default comparison is based on the type of the elements
+(@pxref{Typing and Comparison}).
+All numeric values come before all string values,
+which in turn come before all subarrays.
+
+@cindex side effects, @code{asort()} function
+An important side effect of calling @code{asort()} is that
+@emph{the array's original indices are irrevocably lost}.
+As this isn't always desirable, @code{asort()} accepts a
+second argument:
+
+@example
+@var{populate the array} source
+n = asort(source, dest)
+for (i = 1; i <= n; i++)
+    @var{do something with} dest[i]
+@end example
+
+In this case, @command{gawk} copies the @code{source} array into the
+@code{dest} array and then sorts @code{dest}, destroying its indices.
+However, the @code{source} array is not affected.
+
+Often, what's needed is to sort on the values of the @emph{indices}
+instead of the values of the elements.  To do that, use the
+@code{asorti()} function.  The interface and behavior are identical to
+that of @code{asort()}, except that the index values are used for sorting
+and become the values of the result array:
+
+@example
+@{ source[$0] = some_func($0) @}
+
+END @{
+    n = asorti(source, dest)
+    for (i = 1; i <= n; i++) @{
+        @ii{Work with sorted indices directly:}
+        @var{do something with} dest[i]
+        @dots{}
+        @ii{Access original array via sorted indices:}
+        @var{do something with} source[dest[i]]
+    @}
+@}
+@end example
+
+So far, so good. Now it starts to get interesting.  Both @code{asort()}
+and @code{asorti()} accept a third string argument to control comparison
+of array elements.  When we introduced @code{asort()} and @code{asorti()}
+in @ref{String Functions}, we ignored this third argument; however,
+now is the time to describe how this argument affects these two functions.
+
+Basically, the third argument specifies how the array is to be sorted.
+There are two possibilities.  As with @code{PROCINFO["sorted_in"]},
+this argument may be one of the predefined names that @command{gawk}
+provides (@pxref{Controlling Scanning}), or it may be the name of a
+user-defined function (@pxref{Controlling Array Traversal}).
+
+In the latter case, @emph{the function can compare elements in any way
+it chooses}, taking into account just the indices, just the values,
+or both.  This is extremely powerful.
+
+Once the array is sorted, @code{asort()} takes the @emph{values} in
+their final order and uses them to fill in the result array, whereas
+@code{asorti()} takes the @emph{indices} in their final order and uses
+them to fill in the result array.
+
+@cindex reference counting, sorting arrays
+@quotation NOTE
+Copying array indices and elements isn't expensive in terms of memory.
+Internally, @command{gawk} maintains @dfn{reference counts} to data.
+For example, when @code{asort()} copies the first array to the second one,
+there is only one copy of the original array elements' data, even though
+both arrays use the values.
+@end quotation
+
+@c Document It And Call It A Feature. Sigh.
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+@cindex arrays, sorting, @code{IGNORECASE} variable and
+@cindex @code{IGNORECASE} variable, array sorting functions and
+Because @code{IGNORECASE} affects string comparisons, the value
+of @code{IGNORECASE} also affects sorting for both @code{asort()} and @code{asorti()}.
+Note also that the locale's sorting order does @emph{not}
+come into play; comparisons are based on character values only.@footnote{This
+is true because locale-based comparison occurs only when in
+POSIX-compatibility mode, and because @code{asort()} and @code{asorti()} are
+@command{gawk} extensions, they are not available in that case.}
+
+The following example demonstrates the use of a comparison function with
+@code{asort()}.  The comparison function, @code{case_fold_compare()}, maps
+both values to lowercase in order to compare them ignoring case.
+
+@example
+@group
+# case_fold_compare --- compare as strings, ignoring case
+
+function case_fold_compare(i1, v1, i2, v2,    l, r)
+@{
+    l = tolower(v1)
+@end group
+    r = tolower(v2)
+
+    if (l < r)
+        return -1
+    else if (l == r)
+        return 0
+    else
+        return 1
+@}
+@end example
+
+And here is the test program for it:
+
+@example
+# Test program
+
+BEGIN @{
+    Letters = "abcdefghijklmnopqrstuvwxyz" \
+              "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    split(Letters, data, "")
+
+    asort(data, result, "case_fold_compare")
+
+    j = length(result)
+    for (i = 1; i <= j; i++) @{
+        printf("%s", result[i])
+        if (i % (j/2) == 0)
+            printf("\n")
+        else
+            printf(" ")
+    @}
+@}
+@end example
+
+When run, we get the following:
+
+@example
+$ @kbd{gawk -f case_fold_compare.awk}
+@print{} A a B b c C D d e E F f g G H h i I J j k K l L M m
+@print{} n N O o p P Q q r R S s t T u U V v w W X x y Y z Z
+@end example
+
+@node Two-way I/O
+@section Two-Way Communications with Another Process
+
+@c 8/2014. Neither Mike nor BWK saw this as relevant. Commenting it out.
+@ignore
+@cindex Brennan, Michael
+@cindex programmers, attractiveness of
+@smallexample
+@c Path: cssun.mathcs.emory.edu!gatech!newsxfer3.itd.umich.edu!news-peer.sprintlink.net!news-sea-19.sprintlink.net!news-in-west.sprintlink.net!news.sprintlink.net!Sprint!204.94.52.5!news.whidbey.com!brennan
+From: brennan@@whidbey.com (Mike Brennan)
+Newsgroups: comp.lang.awk
+Subject: Re: Learn the SECRET to Attract Women Easily
+Date: 4 Aug 1997 17:34:46 GMT
+@c Organization: WhidbeyNet
+@c Lines: 12
+Message-ID: <5s53rm$eca@@news.whidbey.com>
+@c References: <5s20dn$2e1@chronicle.concentric.net>
+@c Reply-To: brennan@whidbey.com
+@c NNTP-Posting-Host: asn202.whidbey.com
+@c X-Newsreader: slrn (0.9.4.1 UNIX)
+@c Xref: cssun.mathcs.emory.edu comp.lang.awk:5403
+
+On 3 Aug 1997 13:17:43 GMT, Want More Dates???
+<tracy78@@kilgrona.com> wrote:
+>Learn the SECRET to Attract Women Easily
+>
+>The SCENT(tm)  Pheromone Sex Attractant For Men to Attract Women
+
+The scent of awk programmers is a lot more attractive to women than
+the scent of perl programmers.
+--
+Mike Brennan
+@c brennan@@whidbey.com
+@end smallexample
+@end ignore
+
+@cindex advanced features, processes@comma{} communicating with
+@cindex processes, two-way communications with
+It is often useful to be able to
+send data to a separate program for
+processing and then read the result.  This can always be
+done with temporary files:
+
+@example
+# Write the data for processing
+tempfile = ("mydata." PROCINFO["pid"])
+while (@var{not done with data})
+    print @var{data} | ("subprogram > " tempfile)
+close("subprogram > " tempfile)
+
+# Read the results, remove tempfile when done
+while ((getline newdata < tempfile) > 0)
+    @var{process} newdata @var{appropriately}
+close(tempfile)
+system("rm " tempfile)
+@end example
+
+@noindent
+This works, but not elegantly.  Among other things, it requires that
+the program be run in a directory that cannot be shared among users;
+for example, @file{/tmp} will not do, as another user might happen
+to be using a temporary file with the same name.@footnote{Michael
+Brennan suggests the use of @command{rand()} to generate unique
+@value{FN}s. This is a valid point; nevertheless, temporary files
+remain more difficult to use than two-way pipes.} @c 8/2014
+
+@cindex coprocesses
+@cindex input/output, two-way
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|&} operator (I/O)
+@cindex @command{csh} utility, @code{|&} operator, comparison with
+However, with @command{gawk}, it is possible to
+open a @emph{two-way} pipe to another process.  The second process is
+termed a @dfn{coprocess}, as it runs in parallel with @command{gawk}.
+The two-way connection is created using the @samp{|&} operator
+(borrowed from the Korn shell, @command{ksh}):@footnote{This is very
+different from the same operator in the C shell and in Bash.}
+
+@example
+do @{
+    print @var{data} |& "subprogram"
+    "subprogram" |& getline results
+@} while (@var{data left to process})
+close("subprogram")
+@end example
+
+The first time an I/O operation is executed using the @samp{|&}
+operator, @command{gawk} creates a two-way pipeline to a child process
+that runs the other program.  Output created with @code{print}
+or @code{printf} is written to the program's standard input, and
+output from the program's standard output can be read by the @command{gawk}
+program using @code{getline}.
+As is the case with processes started by @samp{|}, the subprogram
+can be any program, or pipeline of programs, that can be started by
+the shell.
+
+There are some cautionary items to be aware of:
+
+@itemize @value{BULLET}
+@item
+As the code inside @command{gawk} currently stands, the coprocess's
+standard error goes to the same place that the parent @command{gawk}'s
+standard error goes. It is not possible to read the child's
+standard error separately.
+
+@cindex deadlocks
+@cindex buffering, input/output
+@cindex @code{getline} command, deadlock and
+@item
+I/O buffering may be a problem.  @command{gawk} automatically
+flushes all output down the pipe to the coprocess.
+However, if the coprocess does not flush its output,
+@command{gawk} may hang when doing a @code{getline} in order to read
+the coprocess's results.  This could lead to a situation
+known as @dfn{deadlock}, where each process is waiting for the
+other one to do something.
+@end itemize
+
+@cindex @code{close()} function, two-way pipes and
+It is possible to close just one end of the two-way pipe to
+a coprocess, by supplying a second argument to the @code{close()}
+function of either @code{"to"} or @code{"from"}
+(@pxref{Close Files And Pipes}).
+These strings tell @command{gawk} to close the end of the pipe
+that sends data to the coprocess or the end that reads from it,
+respectively.
+
+@cindex @command{sort} utility, coprocesses and
+This is particularly necessary in order to use
+the system @command{sort} utility as part of a coprocess;
+@command{sort} must read @emph{all} of its input
+data before it can produce any output.
+The @command{sort} program does not receive an end-of-file indication
+until @command{gawk} closes the write end of the pipe.
+
+When you have finished writing data to the @command{sort}
+utility, you can close the @code{"to"} end of the pipe, and
+then start reading sorted data via @code{getline}.
+For example:
+
+@example
+BEGIN @{
+    command = "LC_ALL=C sort"
+    n = split("abcdefghijklmnopqrstuvwxyz", a, "")
+
+    for (i = n; i > 0; i--)
+        print a[i] |& command
+    close(command, "to")
+
+    while ((command |& getline line) > 0)
+        print "got", line
+    close(command)
+@}
+@end example
+
+This program writes the letters of the alphabet in reverse order, one
+per line, down the two-way pipe to @command{sort}.  It then closes the
+write end of the pipe, so that @command{sort} receives an end-of-file
+indication.  This causes @command{sort} to sort the data and write the
+sorted data back to the @command{gawk} program.  Once all of the data
+has been read, @command{gawk} terminates the coprocess and exits.
+
+As a side note, the assignment @samp{LC_ALL=C} in the @command{sort}
+command ensures traditional Unix (ASCII) sorting from @command{sort}.
+This is not strictly necessary here, but it's good to know how to do this.
+
+Be careful when closing the @code{"from"} end of a two-way pipe; in this
+case @command{gawk} waits for the child process to exit, which may cause
+your program to hang.  (Thus, this particular feature is of much less
+use in practice than being able to close the @code{"to"} end.)
+
+@quotation CAUTION
+Normally,
+it is a fatal error to write to the @code{"to"} end of a two-way
+pipe which has been closed, and it is also a fatal error to read
+from the @code{"from"} end of a two-way pipe that has been closed.
+
+You may set @code{PROCINFO["@var{command}", "NONFATAL"]} to
+make such operations become nonfatal. If you do so, you then need
+to check @code{ERRNO} after each @code{print}, @code{printf},
+or @code{getline}.
+@xref{Nonfatal}, for more information.
+@end quotation
+
+@cindex @command{gawk}, @code{PROCINFO} array in
+@cindex @code{PROCINFO} array, communications via ptys and
+You may also use pseudo-ttys (ptys) for
+two-way communication instead of pipes, if your system supports them.
+This is done on a per-command basis, by setting a special element
+in the @code{PROCINFO} array
+(@pxref{Auto-set}),
+like so:
+
+@example
+command = "sort -nr"           # command, save in convenience variable
+PROCINFO[command, "pty"] = 1   # update PROCINFO
+print @dots{} |& command           # start two-way pipe
+@dots{}
+@end example
+
+@noindent
+If your system does not have ptys, or if all the system's ptys are in use,
+@command{gawk} automatically falls back to using regular pipes.
+
+Using ptys usually avoids the buffer deadlock issues described earlier,
+at some loss in performance. This is because the tty driver buffers
+and sends data line-by-line.  On systems with the @command{stdbuf}
+(part of the @uref{https://www.gnu.org/software/coreutils/coreutils.html,
+GNU Coreutils package}), you can use that program instead of ptys.
+
+Note also that ptys are not fully transparent. Certain binary control
+codes, such @kbd{Ctrl-d} for end-of-file, are interpreted by the tty
+driver and not passed through.
+
+@quotation CAUTION
+Finally, coprocesses open up the possibility of @dfn{deadlock} between
+@command{gawk} and the program running in the coprocess. This can occur
+if you send ``too much'' data to the coprocess before reading any back;
+each process is blocked writing data with no one available to read what
+they've already written.  There is no workaround for deadlock; careful
+programming and knowledge of the behavior of the coprocess are required.
+@end quotation
+
+@c From email send January 4, 2018.
+The following example, due to Andrew Schorr, demonstrates how
+using ptys can help deal with buffering deadlocks.
+
+Suppose @command{gawk} were unable to add numbers.
+You could use a coprocess to do it. Here's an exceedingly
+simple program written for that purpose: 
+
+@example
+$ @kbd{cat add.c}
+#include <stdio.h> 
+
+int 
+main(void) 
+@{ 
+    int x, y; 
+    while (scanf("%d %d", & x, & y) == 2) 
+        printf("%d\n", x + y); 
+    return 0; 
+@} 
+$ @kbd{cc -O add.c -o add}	@ii{Compile the program}
+@end example
+
+You could then write an exceedingly simple @command{gawk} program
+to add numbers by passing them to the coprocess:
+
+@example
+$ @kbd{echo 1 2 |}
+> @kbd{gawk -v cmd=./add '@{ print |& cmd; cmd |& getline x; print x @}'}
+@end example
+
+And it would deadlock, because @file{add.c} fails to call
+@samp{setlinebuf(stdout)}. The @command{add} program freezes. 
+
+Now try instead: 
+
+@example
+$ @kbd{echo 1 2 |}
+> @kbd{gawk -v cmd=add 'BEGIN @{ PROCINFO[cmd, "pty"] = 1 @}}
+> @kbd{                 @{ print |& cmd; cmd |& getline x; print x @}'}
+@print{} 3 
+@end example
+
+By using a pty, @command{gawk} fools the standard I/O library into
+thinking it has an interactive session, so it defaults to line buffering.
+And now, magically, it works!
+
+@node TCP/IP Networking
+@section Using @command{gawk} for Network Programming
+@cindex advanced features, network programming
+@cindex networks, programming
+@cindex TCP/IP
+@cindex @code{/inet/@dots{}} special files (@command{gawk})
+@cindex files, @code{/inet/@dots{}} (@command{gawk})
+@cindex @code{/inet4/@dots{}} special files (@command{gawk})
+@cindex files, @code{/inet4/@dots{}} (@command{gawk})
+@cindex @code{/inet6/@dots{}} special files (@command{gawk})
+@cindex files, @code{/inet6/@dots{}} (@command{gawk})
+@cindex @code{EMRED}
+@ifnotdocbook
+@quotation
+@code{EMRED}:@*
+@ @ @ @ @i{A host is a host from coast to coast,@*
+@ @ @ @ and nobody talks to a host that's close,@*
+@ @ @ @ unless the host that isn't close@*
+@ @ @ @ is busy, hung, or dead.}
+@author Mike O'Brien (aka Mr.@: Protocol)
+@end quotation
+@end ifnotdocbook
+
+@docbook
+<blockquote>
+<attribution>Mike O'Brien (aka Mr.&nbsp;Protocol)</attribution>
+<literallayout class="normal"><literal>EMRED</literal>:
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>A host is a host from coast to coast,</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>and no-one can talk to host that's close,</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>unless the host that isn't close</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>is busy, hung, or dead.</emphasis></literallayout>
+</blockquote>
+@end docbook
+
+In addition to being able to open a two-way pipeline to a coprocess
+on the same system
+(@pxref{Two-way I/O}),
+it is possible to make a two-way connection to
+another process on another system across an IP network connection.
+
+You can think of this as just a @emph{very long} two-way pipeline to
+a coprocess.
+The way @command{gawk} decides that you want to use TCP/IP networking is
+by recognizing special @value{FN}s that begin with one of @samp{/inet/},
+@samp{/inet4/}, or @samp{/inet6/}.
+
+The full syntax of the special @value{FN} is
+@file{/@var{net-type}/@var{protocol}/@var{local-port}/@var{remote-host}/@var{remote-port}}.
+The components are:
+
+@table @var
+@item net-type
+Specifies the kind of Internet connection to make.
+Use @samp{/inet4/} to force IPv4, and
+@samp{/inet6/} to force IPv6.
+Plain @samp{/inet/} (which used to be the only option) uses
+the system default, most likely IPv4.
+
+@item protocol
+The protocol to use over IP.  This must be either @samp{tcp}, or
+@samp{udp}, for a TCP or UDP IP connection,
+respectively.  TCP should be used for most applications.
+
+@item local-port
+@cindex @code{getaddrinfo()} function (C library)
+The local TCP or UDP port number to use.  Use a port number of @samp{0}
+when you want the system to pick a port. This is what you should do
+when writing a TCP or UDP client.
+You may also use a well-known service name, such as @samp{smtp}
+or @samp{http}, in which case @command{gawk} attempts to determine
+the predefined port number using the C @code{getaddrinfo()} function.
+
+@item remote-host
+The IP address or fully qualified domain name of the Internet
+host to which you want to connect.
+
+@item remote-port
+The TCP or UDP port number to use on the given @var{remote-host}.
+Again, use @samp{0} if you don't care, or else a well-known
+service name.
+@end table
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable
+@quotation NOTE
+Failure in opening a two-way socket will result in a nonfatal error
+being returned to the calling code. The value of @code{ERRNO} indicates
+the error (@pxref{Auto-set}).
+@end quotation
+
+Consider the following very simple example:
+
+@example
+BEGIN @{
+    Service = "/inet/tcp/0/localhost/daytime"
+    Service |& getline
+    print $0
+    close(Service)
+@}
+@end example
+
+This program reads the current date and time from the local system's
+TCP @code{daytime} server.
+It then prints the results and closes the connection.
+
+Because this topic is extensive, the use of @command{gawk} for
+TCP/IP programming is documented separately.
+@ifinfo
+See
+@inforef{Top, , General Introduction, gawkinet, @value{GAWKINETTITLE}},
+@end ifinfo
+@ifnotinfo
+See
+@uref{https://www.gnu.org/software/gawk/manual/gawkinet/,
+@cite{@value{GAWKINETTITLE}}},
+which comes as part of the @command{gawk} distribution,
+@end ifnotinfo
+for a much more complete introduction and discussion, as well as
+extensive examples.
+
+@quotation NOTE
+@command{gawk} can only open direct sockets. There is currently
+no way to access services available over Secure Socket Layer
+(SSL); this includes any web service whose URL starts with @samp{https://}.
+@end quotation
+
+
+@node Profiling
+@section Profiling Your @command{awk} Programs
+@cindex @command{awk} programs, profiling
+@cindex profiling @command{awk} programs
+@cindex @code{awkprof.out} file
+@cindex files, @code{awkprof.out}
+
+You may produce execution traces of your @command{awk} programs.
+This is done by passing the option @option{--profile} to @command{gawk}.
+When @command{gawk} has finished running, it creates a profile of your program in a file
+named @file{awkprof.out}. Because it is profiling, it also executes up to 45% slower than
+@command{gawk} normally does.
+
+@cindex @option{--profile} option
+As shown in the following example,
+the @option{--profile} option can be used to change the name of the file
+where @command{gawk} will write the profile:
+
+@example
+gawk --profile=myprog.prof -f myprog.awk data1 data2
+@end example
+
+@noindent
+In the preceding example, @command{gawk} places the profile in
+@file{myprog.prof} instead of in @file{awkprof.out}.
+
+Here is a sample session showing a simple @command{awk} program,
+its input data, and the results from running @command{gawk} with the
+@option{--profile} option.  First, the @command{awk} program:
+
+@example
+BEGIN @{ print "First BEGIN rule" @}
+
+END @{ print "First END rule" @}
+
+/foo/ @{
+    print "matched /foo/, gosh"
+    for (i = 1; i <= 3; i++)
+        sing()
+@}
+
+@{
+    if (/foo/)
+        print "if is true"
+    else
+        print "else is true"
+@}
+
+BEGIN @{ print "Second BEGIN rule" @}
+
+END @{ print "Second END rule" @}
+
+function sing(    dummy)
+@{
+    print "I gotta be me!"
+@}
+@end example
+
+Following is the input data:
+
+@example
+foo
+bar
+baz
+foo
+junk
+@end example
+
+Here is the @file{awkprof.out} that results from running the
+@command{gawk} profiler on this program and data (this example also
+illustrates that @command{awk} programmers sometimes get up very early
+in the morning to work):
+
+@cindex @code{BEGIN} pattern, profiling and
+@cindex @code{END} pattern, profiling and
+@example
+    # gawk profile, created Mon Sep 29 05:16:21 2014
+
+    # BEGIN rule(s)
+
+    BEGIN @{
+ 1          print "First BEGIN rule"
+    @}
+
+    BEGIN @{
+ 1          print "Second BEGIN rule"
+    @}
+
+    # Rule(s)
+
+ 5  /foo/ @{ # 2
+ 2          print "matched /foo/, gosh"
+ 6          for (i = 1; i <= 3; i++) @{
+ 6                  sing()
+            @}
+    @}
+
+ 5  @{
+ 5          if (/foo/) @{ # 2
+ 2                  print "if is true"
+ 3          @} else @{
+ 3                  print "else is true"
+            @}
+    @}
+
+    # END rule(s)
+
+    END @{
+ 1          print "First END rule"
+    @}
+
+    END @{
+ 1          print "Second END rule"
+    @}
+
+
+    # Functions, listed alphabetically
+
+ 6  function sing(dummy)
+    @{
+ 6          print "I gotta be me!"
+    @}
+@end example
+
+This example illustrates many of the basic features of profiling output.
+They are as follows:
+
+@itemize @value{BULLET}
+@item
+The program is printed in the order @code{BEGIN} rules,
+@code{BEGINFILE} rules,
+pattern--action rules,
+@code{ENDFILE} rules, @code{END} rules, and functions, listed
+alphabetically.
+Multiple @code{BEGIN} and @code{END} rules retain their
+separate identities, as do
+multiple @code{BEGINFILE} and @code{ENDFILE} rules.
+
+@cindex patterns, counts, in a profile
+@item
+Pattern--action rules have two counts.
+The first count, to the left of the rule, shows how many times
+the rule's pattern was @emph{tested}.
+The second count, to the right of the rule's opening left brace
+in a comment,
+shows how many times the rule's action was @emph{executed}.
+The difference between the two indicates how many times the rule's
+pattern evaluated to false.
+
+@item
+Similarly,
+the count for an @code{if}-@code{else} statement shows how many times
+the condition was tested.
+To the right of the opening left brace for the @code{if}'s body
+is a count showing how many times the condition was true.
+The count for the @code{else}
+indicates how many times the test failed.
+
+@cindex loops, count for header, in a profile
+@item
+The count for a loop header (such as @code{for}
+or @code{while}) shows how many times the loop test was executed.
+(Because of this, you can't just look at the count on the first
+statement in a rule to determine how many times the rule was executed.
+If the first statement is a loop, the count is misleading.)
+
+@cindex functions, user-defined, counts@comma{} in a profile
+@cindex user-defined, functions, counts@comma{} in a profile
+@item
+For user-defined functions, the count next to the @code{function}
+keyword indicates how many times the function was called.
+The counts next to the statements in the body show how many times
+those statements were executed.
+
+@cindex @code{@{@}} (braces)
+@cindex braces (@code{@{@}})
+@item
+The layout uses ``K&R'' style with TABs.
+Braces are used everywhere, even when
+the body of an @code{if}, @code{else}, or loop is only a single statement.
+
+@cindex @code{()} (parentheses), in a profile
+@cindex parentheses @code{()}, in a profile
+@item
+Parentheses are used only where needed, as indicated by the structure
+of the program and the precedence rules.
+For example, @samp{(3 + 5) * 4} means add three and five, then multiply
+the total by four.  However, @samp{3 + 5 * 4} has no parentheses, and
+means @samp{3 + (5 * 4)}.
+However, explicit parentheses in the source program are retained.
+
+@ignore
+@item
+All string concatenations are parenthesized too.
+(This could be made a bit smarter.)
+@end ignore
+
+@item
+Parentheses are used around the arguments to @code{print}
+and @code{printf} only when
+the @code{print} or @code{printf} statement is followed by a redirection.
+Similarly, if
+the target of a redirection isn't a scalar, it gets parenthesized.
+
+@item
+@command{gawk} supplies leading comments in
+front of the @code{BEGIN} and @code{END} rules,
+the @code{BEGINFILE} and @code{ENDFILE} rules,
+the pattern--action rules, and the functions.
+
+@end itemize
+
+The profiled version of your program may not look exactly like what you
+typed when you wrote it.  This is because @command{gawk} creates the
+profiled version by ``pretty-printing'' its internal representation of
+the program.  The advantage to this is that @command{gawk} can produce
+a standard representation.
+Also, things such as:
+
+@example
+/foo/
+@end example
+
+@noindent
+come out as:
+
+@example
+/foo/   @{
+    print
+@}
+@end example
+
+@noindent
+which is correct, but possibly unexpected.
+(If a program uses both @samp{print $0} and plain
+@samp{print}, that distinction is retained.)
+
+@cindex profiling @command{awk} programs, dynamically
+@cindex @command{gawk} program, dynamic profiling
+@cindex dynamic profiling
+Besides creating profiles when a program has completed,
+@command{gawk} can produce a profile while it is running.
+This is useful if your @command{awk} program goes into an
+infinite loop and you want to see what has been executed.
+To use this feature, run @command{gawk} with the @option{--profile}
+option in the background:
+
+@example
+$ @kbd{gawk --profile -f myprog &}
+[1] 13992
+@end example
+
+@cindex @command{kill} command@comma{} dynamic profiling
+@cindex @code{USR1} signal, for dynamic profiling
+@cindex @code{SIGUSR1} signal, for dynamic profiling
+@cindex signals, @code{USR1}/@code{SIGUSR1}, for profiling
+@noindent
+The shell prints a job number and process ID number; in this case, 13992.
+Use the @command{kill} command to send the @code{USR1} signal
+to @command{gawk}:
+
+@example
+$ @kbd{kill -USR1 13992}
+@end example
+
+@noindent
+As usual, the profiled version of the program is written to
+@file{awkprof.out}, or to a different file if one was specified with
+the @option{--profile} option.
+
+Along with the regular profile, as shown earlier, the profile file
+includes a trace of any active functions:
+
+@example
+# Function Call Stack:
+
+#   3. baz
+#   2. bar
+#   1. foo
+# -- main --
+@end example
+
+You may send @command{gawk} the @code{USR1} signal as many times as you like.
+Each time, the profile and function call trace are appended to the output
+profile file.
+
+@cindex @code{HUP} signal, for dynamic profiling
+@cindex @code{SIGHUP} signal, for dynamic profiling
+@cindex signals, @code{HUP}/@code{SIGHUP}, for profiling
+If you use the @code{HUP} signal instead of the @code{USR1} signal,
+@command{gawk} produces the profile and the function call trace and then exits.
+
+@cindex @code{INT} signal (MS-Windows)
+@cindex @code{SIGINT} signal (MS-Windows)
+@cindex signals, @code{INT}/@code{SIGINT} (MS-Windows)
+@cindex @code{QUIT} signal (MS-Windows)
+@cindex @code{SIGQUIT} signal (MS-Windows)
+@cindex signals, @code{QUIT}/@code{SIGQUIT} (MS-Windows)
+When @command{gawk} runs on MS-Windows systems, it uses the
+@code{INT} and @code{QUIT} signals for producing the profile, and in
+the case of the @code{INT} signal, @command{gawk} exits.  This is
+because these systems don't support the @command{kill} command, so the
+only signals you can deliver to a program are those generated by the
+keyboard.  The @code{INT} signal is generated by the
+@kbd{Ctrl-c} or @kbd{Ctrl-BREAK} key, while the
+@code{QUIT} signal is generated by the @kbd{Ctrl-\} key.
+
+@cindex pretty printing
+Finally, @command{gawk} also accepts another option, @option{--pretty-print}.
+When called this way, @command{gawk} ``pretty-prints'' the program into
+@file{awkprof.out}, without any execution counts.
+
+@quotation NOTE
+Once upon a time, the @option{--pretty-print} option would also run
+your program.  This is no longer the case.
+@end quotation
+
+@cindex profiling, pretty-printing, difference with
+@cindex pretty-printing, profiling, difference with
+There is a significant difference between the output created when
+profiling, and that created when pretty-printing.  Pretty-printed output
+preserves the original comments that were in the program, although their
+placement may not correspond exactly to their original locations in the
+source code. However, no comments should be lost.
+Also, @command{gawk} does the best it can to preserve
+the distinction between comments at the end of a statement and comments
+on lines by themselves. This isn't always perfect, though.
+
+However, as a deliberate design decision, profiling output @emph{omits}
+the original program's comments. This allows you to focus on the
+execution count data and helps you avoid the temptation to use the
+profiler for pretty-printing.
+
+Additionally, pretty-printed output does not have the leading indentation
+that the profiling output does. This makes it easy to pretty-print your
+code once development is completed, and then use the result as the final
+version of your program.
+
+Because the internal representation of your program is formatted to
+recreate an @command{awk} program, profiling and pretty-printing
+automatically disable @command{gawk}'s default optimizations.
+
+Profiling and pretty-printing also preserve the original format of numeric
+constants; if you used an octal or hexadecimal value in your source
+code, it will appear that way in the output.
+
+@node Advanced Features Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+The @option{--non-decimal-data} option causes @command{gawk} to treat
+octal- and hexadecimal-looking input data as octal and hexadecimal.
+This option should be used with caution or not at all; use of @code{strtonum()}
+is preferable.
+Note that this option may disappear in a future version of @command{gawk}.
+
+@item
+You can take over complete control of sorting in @samp{for (@var{indx} in @var{array})}
+array traversal by setting @code{PROCINFO["sorted_in"]} to the name of a user-defined
+function that does the comparison of array elements based on index and value.
+
+@item
+Similarly, you can supply the name of a user-defined comparison function as the
+third argument to either @code{asort()} or @command{asorti()} to control how
+those functions sort arrays. Or you may provide one of the predefined control
+strings that work for @code{PROCINFO["sorted_in"]}.
+
+@item
+You can use the @samp{|&} operator to create a two-way pipe to a coprocess.
+You read from the coprocess with @code{getline} and write to it with @code{print}
+or @code{printf}. Use @code{close()} to close off the coprocess completely, or
+optionally, close off one side of the two-way communications.
+
+@item
+By using special @value{FN}s with the @samp{|&} operator, you can open a
+TCP/IP (or UDP/IP) connection to remote hosts on the Internet. @command{gawk}
+supports both IPv4 and IPv6.
+
+@item
+You can generate statement count profiles of your program. This can help you
+determine which parts of your program may be taking the most time and let
+you tune them more easily.  Sending the @code{USR1} signal while profiling causes
+@command{gawk} to dump the profile and keep going, including a function call stack.
+
+@item
+You can also just ``pretty-print'' the program.
+
+@end itemize
+
+
+@node Internationalization
+@chapter Internationalization with @command{gawk}
+
+Once upon a time, computer makers
+wrote software that worked only in English.
+Eventually, hardware and software vendors noticed that if their
+systems worked in the native languages of non-English-speaking
+countries, they were able to sell more systems.
+As a result, internationalization and localization
+of programs and software systems became a common practice.
+
+@cindex internationalization, localization
+@cindex @command{gawk}, internationalization and, See internationalization
+@cindex internationalization, localization, @command{gawk} and
+For many years, the ability to provide internationalization
+was largely restricted to programs written in C and C++.
+This @value{CHAPTER} describes the underlying library @command{gawk}
+uses for internationalization, as well as how
+@command{gawk} makes internationalization
+features available at the @command{awk} program level.
+Having internationalization available at the @command{awk} level
+gives software developers additional flexibility---they are no
+longer forced to write in C or C++ when internationalization is
+a requirement.
+
+@menu
+* I18N and L10N::               Internationalization and Localization.
+* Explaining gettext::          How GNU @command{gettext} works.
+* Programmer i18n::             Features for the programmer.
+* Translator i18n::             Features for the translator.
+* I18N Example::                A simple i18n example.
+* Gawk I18N::                   @command{gawk} is also internationalized.
+* I18N Summary::                Summary of I18N stuff.
+@end menu
+
+@node I18N and L10N
+@section Internationalization and Localization
+
+@cindex internationalization
+@cindex localization, See internationalization@comma{} localization
+@cindex localization
+@dfn{Internationalization} means writing (or modifying) a program once,
+in such a way that it can use multiple languages without requiring
+further source code changes.
+@dfn{Localization} means providing the data necessary for an
+internationalized program to work in a particular language.
+Most typically, these terms refer to features such as the language
+used for printing error messages, the language used to read
+responses, and information related to how numerical and
+monetary values are printed and read.
+
+@node Explaining gettext
+@section GNU @command{gettext}
+
+@cindex internationalizing a program
+@cindex @command{gettext} library
+@command{gawk} uses GNU @command{gettext} to provide its internationalization
+features.
+The facilities in GNU @command{gettext} focus on messages: strings printed
+by a program, either directly or via formatting with @code{printf} or
+@code{sprintf()}.@footnote{For some operating systems, the @command{gawk}
+port doesn't support GNU @command{gettext}.
+Therefore, these features are not available
+if you are using one of those operating systems. Sorry.}
+
+@cindex portability, @command{gettext} library and
+When using GNU @command{gettext}, each application has its own
+@dfn{text domain}.  This is a unique name, such as @samp{kpilot} or @samp{gawk},
+that identifies the application.
+A complete application may have multiple components---programs written
+in C or C++, as well as scripts written in @command{sh} or @command{awk}.
+All of the components use the same text domain.
+
+To make the discussion concrete, assume we're writing an application
+named @command{guide}.  Internationalization consists of the
+following steps, in this order:
+
+@enumerate
+@item
+The programmer reviews the source for all of @command{guide}'s components
+and marks each string that is a candidate for translation.
+For example, @code{"`-F': option required"} is a good candidate for translation.
+A table with strings of option names is not (e.g., @command{gawk}'s
+@option{--profile} option should remain the same, no matter what the local
+language).
+
+@cindex @code{textdomain()} function (C library)
+@item
+The programmer indicates the application's text domain
+(@command{"guide"}) to the @command{gettext} library,
+by calling the @code{textdomain()} function.
+
+@cindex @code{.pot} files
+@cindex files, @code{.pot}
+@cindex portable object template files
+@cindex files, portable object template
+@item
+Messages from the application are extracted from the source code and
+collected into a portable object template file (@file{guide.pot}),
+which lists the strings and their translations.
+The translations are initially empty.
+The original (usually English) messages serve as the key for
+lookup of the translations.
+
+@cindex @code{.po} files
+@cindex files, @code{.po}
+@cindex portable object files
+@cindex files, portable object
+@item
+For each language with a translator, @file{guide.pot}
+is copied to a portable object file (@code{.po})
+and translations are created and shipped with the application.
+For example, there might be a @file{fr.po} for a French translation.
+
+@cindex @code{.gmo} files
+@cindex files, @code{.gmo}
+@cindex message object files
+@cindex files, message object
+@item
+Each language's @file{.po} file is converted into a binary
+message object (@file{.gmo}) file.
+A message object file contains the original messages and their
+translations in a binary format that allows fast lookup of translations
+at runtime.
+
+@item
+When @command{guide} is built and installed, the binary translation files
+are installed in a standard place.
+
+@cindex @code{bindtextdomain()} function (C library)
+@item
+For testing and development, it is possible to tell @command{gettext}
+to use @file{.gmo} files in a different directory than the standard
+one by using the @code{bindtextdomain()} function.
+
+@cindex @code{.gmo} files, specifying directory of
+@cindex files, @code{.gmo}, specifying directory of
+@cindex message object files, specifying directory of
+@cindex files, message object, specifying directory of
+@item
+At runtime, @command{guide} looks up each string via a call
+to @code{gettext()}.  The returned string is the translated string
+if available, or the original string if not.
+
+@item
+If necessary, it is possible to access messages from a different
+text domain than the one belonging to the application, without
+having to switch the application's default text domain back
+and forth.
+@end enumerate
+
+@cindex @code{gettext()} function (C library)
+In C (or C++), the string marking and dynamic translation lookup
+are accomplished by wrapping each string in a call to @code{gettext()}:
+
+@example
+printf("%s", gettext("Don't Panic!\n"));
+@end example
+
+The tools that extract messages from source code pull out all
+strings enclosed in calls to @code{gettext()}.
+
+@cindex @code{_} (underscore), C macro
+@cindex underscore (@code{_}), C macro
+The GNU @command{gettext} developers, recognizing that typing
+@samp{gettext(@dots{})} over and over again is both painful and ugly to look
+at, use the macro @samp{_} (an underscore) to make things easier:
+
+@example
+/* In the standard header file: */
+#define _(str) gettext(str)
+
+/* In the program text: */
+printf("%s", _("Don't Panic!\n"));
+@end example
+
+@cindex internationalization, localization, locale categories
+@cindex @command{gettext} library, locale categories
+@cindex locale categories
+@noindent
+This reduces the typing overhead to just three extra characters per string
+and is considerably easier to read as well.
+
+There are locale @dfn{categories}
+for different types of locale-related information.
+The defined locale categories that @command{gettext} knows about are:
+
+@table @code
+@cindex @code{LC_MESSAGES} locale category
+@item LC_MESSAGES
+Text messages.  This is the default category for @command{gettext}
+operations, but it is possible to supply a different one explicitly,
+if necessary.  (It is almost never necessary to supply a different category.)
+
+@cindex sorting characters in different languages
+@cindex @code{LC_COLLATE} locale category
+@item LC_COLLATE
+Text-collation information (i.e., how different characters
+and/or groups of characters sort in a given language).
+
+@cindex @code{LC_CTYPE} locale category
+@item LC_CTYPE
+Character-type information (alphabetic, digit, upper- or lowercase, and
+so on) as well as character encoding.
+@ignore
+In June 2001 Bruno Haible wrote:
+- Description of LC_CTYPE: It determines both
+  1. character encoding,
+  2. character type information.
+  (For example, in both KOI8-R and ISO-8859-5 the character type information
+  is the same - cyrillic letters could as 'alpha' - but the encoding is
+  different.)
+@end ignore
+This information is accessed via the
+POSIX character classes in regular expressions,
+such as @code{/[[:alnum:]]/}
+(@pxref{Bracket Expressions}).
+
+@cindex monetary information, localization
+@cindex currency symbols, localization
+@cindex @code{LC_MONETARY} locale category
+@item LC_MONETARY
+Monetary information, such as the currency symbol, and whether the
+symbol goes before or after a number.
+
+@cindex @code{LC_NUMERIC} locale category
+@item LC_NUMERIC
+Numeric information, such as which characters to use for the decimal
+point and the thousands separator.@footnote{Americans
+use a comma every three decimal places and a period for the decimal
+point, while many Europeans do exactly the opposite:
+1,234.56 versus 1.234,56.}
+
+@cindex time, localization and
+@cindex dates, information related to@comma{} localization
+@cindex @code{LC_TIME} locale category
+@item LC_TIME
+Time- and date-related information, such as 12- or 24-hour clock, month printed
+before or after the day in a date, local month abbreviations, and so on.
+
+@cindex @code{LC_ALL} locale category
+@item LC_ALL
+All of the above.  (Not too useful in the context of @command{gettext}.)
+@end table
+
+@quotation NOTE
+@cindex @env{LANGUAGE} environment variable
+As described in @ref{Locales}, environment variables with the same
+name as the locale categories (@env{LC_CTYPE}, @env{LC_ALL}, etc.)
+influence @command{gawk}'s behavior (and that of other utilities).
+
+Normally, these variables also affect how the @code{gettext} library
+finds translations.  However, the @env{LANGUAGE} environment variable
+overrides the @env{LC_@var{xxx}} variables. Many GNU/Linux systems
+may define this variable without your knowledge, causing @command{gawk}
+to not find the correct translations.  If this happens to you,
+look to see if @env{LANGUAGE} is defined, and if so, use the shell's
+@command{unset} command to remove it.
+@end quotation
+
+For testing translations of @command{gawk} itself, you can set
+the @env{GAWK_LOCALE_DIR} environment variable. See the documentation
+for the C @code{bindtextdomain()} function and also see
+@ref{Other Environment Variables}.
+
+@node Programmer i18n
+@section Internationalizing @command{awk} Programs
+@cindex @command{awk} programs, internationalizing
+
+@command{gawk} provides the following variables for
+internationalization:
+
+@table @code
+@cindex @code{TEXTDOMAIN} variable
+@item TEXTDOMAIN
+This variable indicates the application's text domain.
+For compatibility with GNU @command{gettext}, the default
+value is @code{"messages"}.
+
+@cindex internationalization, localization, marked strings
+@cindex strings, for localization
+@item _"your message here"
+String constants marked with a leading underscore
+are candidates for translation at runtime.
+String constants without a leading underscore are not translated.
+@end table
+
+@command{gawk} provides the following functions for
+internationalization:
+
+@table @code
+@cindexgawkfunc{dcgettext}
+@item @code{dcgettext(@var{string}} [@code{,} @var{domain} [@code{,} @var{category}]]@code{)}
+Return the translation of @var{string} in
+text domain @var{domain} for locale category @var{category}.
+The default value for @var{domain} is the current value of @code{TEXTDOMAIN}.
+The default value for @var{category} is @code{"LC_MESSAGES"}.
+
+If you supply a value for @var{category}, it must be a string equal to
+one of the known locale categories described in
+@ifnotinfo
+the previous @value{SECTION}.
+@end ifnotinfo
+@ifinfo
+@ref{Explaining gettext}.
+@end ifinfo
+You must also supply a text domain.  Use @code{TEXTDOMAIN} if
+you want to use the current domain.
+
+@quotation CAUTION
+The order of arguments to the @command{awk} version
+of the @code{dcgettext()} function is purposely different from the order for
+the C version.  The @command{awk} version's order was
+chosen to be simple and to allow for reasonable @command{awk}-style
+default arguments.
+@end quotation
+
+@cindexgawkfunc{dcngettext}
+@item @code{dcngettext(@var{string1}, @var{string2}, @var{number}} [@code{,} @var{domain} [@code{,} @var{category}]]@code{)}
+Return the plural form used for @var{number} of the
+translation of @var{string1} and @var{string2} in text domain
+@var{domain} for locale category @var{category}. @var{string1} is the
+English singular variant of a message, and @var{string2} is the English plural
+variant of the same message.
+The default value for @var{domain} is the current value of @code{TEXTDOMAIN}.
+The default value for @var{category} is @code{"LC_MESSAGES"}.
+
+The same remarks about argument order as for the @code{dcgettext()} function apply.
+
+@cindex @code{.gmo} files, specifying directory of
+@cindex files, @code{.gmo}, specifying directory of
+@cindex message object files, specifying directory of
+@cindex files, message object, specifying directory of
+@cindexgawkfunc{bindtextdomain}
+@item @code{bindtextdomain(@var{directory}} [@code{,} @var{domain} ]@code{)}
+Change the directory in which
+@command{gettext} looks for @file{.gmo} files, in case they
+will not or cannot be placed in the standard locations
+(e.g., during testing).
+Return the directory in which @var{domain} is ``bound.''
+
+The default @var{domain} is the value of @code{TEXTDOMAIN}.
+If @var{directory} is the null string (@code{""}), then
+@code{bindtextdomain()} returns the current binding for the
+given @var{domain}.
+@end table
+
+To use these facilities in your @command{awk} program, follow these steps:
+
+@enumerate
+@cindex @code{BEGIN} pattern, @code{TEXTDOMAIN} variable and
+@cindex @code{TEXTDOMAIN} variable, @code{BEGIN} pattern and
+@item
+Set the variable @code{TEXTDOMAIN} to the text domain of
+your program.  This is best done in a @code{BEGIN} rule
+(@pxref{BEGIN/END}),
+or it can also be done via the @option{-v} command-line
+option (@pxref{Options}):
+
+@example
+BEGIN @{
+    TEXTDOMAIN = "guide"
+    @dots{}
+@}
+@end example
+
+@cindex @code{_} (underscore), translatable string
+@cindex underscore (@code{_}), translatable string
+@item
+Mark all translatable strings with a leading underscore (@samp{_})
+character.  It @emph{must} be adjacent to the opening
+quote of the string.  For example:
+
+@example
+print _"hello, world"
+x = _"you goofed"
+printf(_"Number of users is %d\n", nusers)
+@end example
+
+@item
+If you are creating strings dynamically, you can
+still translate them, using the @code{dcgettext()}
+built-in function:@footnote{Thanks to Bruno Haible for this
+example.}
+
+@example
+if (groggy)
+    message = dcgettext("%d customers disturbing me\n", "adminprog")
+else
+    message = dcgettext("enjoying %d customers\n", "adminprog")
+printf(message, ncustomers)
+@end example
+
+Here, the call to @code{dcgettext()} supplies a different
+text domain (@code{"adminprog"}) in which to find the
+message, but it uses the default @code{"LC_MESSAGES"} category.
+
+The previous example only works if @code{ncustomers} is greater than one.
+This example would be better done with @code{dcngettext()}:
+
+@example
+if (groggy)
+    message = dcngettext("%d customer disturbing me\n",
+                         "%d customers disturbing me\n",
+                         ncustomers, "adminprog")
+else
+    message = dcngettext("enjoying %d customer\n",
+                         "enjoying %d customers\n",
+                         ncustomers, "adminprog")
+printf(message, ncustomers)
+@end example
+
+
+@cindex @code{LC_MESSAGES} locale category, @code{bindtextdomain()} function (@command{gawk})
+@item
+During development, you might want to put the @file{.gmo}
+file in a private directory for testing.  This is done
+with the @code{bindtextdomain()} built-in function:
+
+@example
+BEGIN @{
+   TEXTDOMAIN = "guide"   # our text domain
+   if (Testing) @{
+       # where to find our files
+       bindtextdomain("testdir")
+       # joe is in charge of adminprog
+       bindtextdomain("../joe/testdir", "adminprog")
+   @}
+   @dots{}
+@}
+@end example
+
+@end enumerate
+
+@xref{I18N Example}
+for an example program showing the steps to create
+and use translations from @command{awk}.
+
+@node Translator i18n
+@section Translating @command{awk} Programs
+
+@cindex @code{.po} files
+@cindex files, @code{.po}
+@cindex portable object files
+@cindex files, portable object
+Once a program's translatable strings have been marked, they must
+be extracted to create the initial @file{.pot} file.
+As part of translation, it is often helpful to rearrange the order
+in which arguments to @code{printf} are output.
+
+@command{gawk}'s @option{--gen-pot} command-line option extracts
+the messages and is discussed next.
+After that, @code{printf}'s ability to
+rearrange the order for @code{printf} arguments at runtime
+is covered.
+
+@menu
+* String Extraction::           Extracting marked strings.
+* Printf Ordering::             Rearranging @code{printf} arguments.
+* I18N Portability::            @command{awk}-level portability issues.
+@end menu
+
+@node String Extraction
+@subsection Extracting Marked Strings
+@cindex strings, extracting
+@cindex @option{--gen-pot} option
+@cindex command-line options, string extraction
+@cindex string extraction (internationalization)
+@cindex marked string extraction (internationalization)
+@cindex extraction, of marked strings (internationalization)
+
+@cindex @option{--gen-pot} option
+Once your @command{awk} program is working, and all the strings have
+been marked and you've set (and perhaps bound) the text domain,
+it is time to produce translations.
+First, use the @option{--gen-pot} command-line option to create
+the initial @file{.pot} file:
+
+@example
+gawk --gen-pot -f guide.awk > guide.pot
+@end example
+
+@cindex @code{xgettext} utility
+When run with @option{--gen-pot}, @command{gawk} does not execute your
+program.  Instead, it parses it as usual and prints all marked strings
+to standard output in the format of a GNU @command{gettext} Portable Object
+file.  Also included in the output are any constant strings that
+appear as the first argument to @code{dcgettext()} or as the first and
+second argument to @code{dcngettext()}.@footnote{The
+@command{xgettext} utility that comes with GNU
+@command{gettext} can handle @file{.awk} files.}
+You should distribute the generated @file{.pot} file with
+your @command{awk} program; translators will eventually use it
+to provide you translations that you can also then distribute.
+@xref{I18N Example}
+for the full list of steps to go through to create and test
+translations for @command{guide}.
+
+@node Printf Ordering
+@subsection Rearranging @code{printf} Arguments
+
+@cindex @code{printf} statement, positional specifiers
+@cindex positional specifiers, @code{printf} statement
+Format strings for @code{printf} and @code{sprintf()}
+(@pxref{Printf})
+present a special problem for translation.
+Consider the following:@footnote{This example is borrowed
+from the GNU @command{gettext} manual.}
+
+@example
+printf(_"String `%s' has %d characters\n",
+          string, length(string)))
+@end example
+
+A possible German translation for this might be:
+
+@example
+"%d Zeichen lang ist die Zeichenkette `%s'\n"
+@end example
+
+The problem should be obvious: the order of the format
+specifications is different from the original!
+Even though @code{gettext()} can return the translated string
+at runtime,
+it cannot change the argument order in the call to @code{printf}.
+
+To solve this problem, @code{printf} format specifiers may have
+an additional optional element, which we call a @dfn{positional specifier}.
+For example:
+
+@example
+"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n"
+@end example
+
+Here, the positional specifier consists of an integer count, which indicates which
+argument to use, and a @samp{$}. Counts are one-based, and the
+format string itself is @emph{not} included.  Thus, in the following
+example, @samp{string} is the first argument and @samp{length(string)} is the second:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>     @kbd{string = "Don\47t Panic"}
+>     @kbd{printf "%2$d characters live in \"%1$s\"\n",}
+>                         @kbd{string, length(string)}
+> @kbd{@}'}
+@print{} 11 characters live in "Don't Panic"
+@end example
+
+If present, positional specifiers come first in the format specification,
+before the flags, the field width, and/or the precision.
+
+Positional specifiers can be used with the dynamic field width and
+precision capability:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>    @kbd{printf("%*.*s\n", 10, 20, "hello")}
+>    @kbd{printf("%3$*2$.*1$s\n", 20, 10, "hello")}
+> @kbd{@}'}
+@print{}      hello
+@print{}      hello
+@end example
+
+@quotation NOTE
+When using @samp{*} with a positional specifier, the @samp{*}
+comes first, then the integer position, and then the @samp{$}.
+This is somewhat counterintuitive.
+@end quotation
+
+@cindex @code{printf} statement, positional specifiers, mixing with regular formats
+@cindex positional specifiers, @code{printf} statement, mixing with regular formats
+@cindex format specifiers, mixing regular with positional specifiers
+@command{gawk} does not allow you to mix regular format specifiers
+and those with positional specifiers in the same string:
+
+@example
+@group
+$ @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
+@end group
+@end example
+
+@quotation NOTE
+There are some pathological cases that @command{gawk} may fail to
+diagnose.  In such cases, the output may not be what you expect.
+It's still a bad idea to try mixing them, even if @command{gawk}
+doesn't detect it.
+@end quotation
+
+Although positional specifiers can be used directly in @command{awk} programs,
+their primary purpose is to help in producing correct translations of
+format strings into languages different from the one in which the program
+is first written.
+
+@node I18N Portability
+@subsection @command{awk} Portability Issues
+
+@cindex portability, internationalization and
+@cindex internationalization, localization, portability and
+@command{gawk}'s internationalization features were purposely chosen to
+have as little impact as possible on the portability of @command{awk}
+programs that use them to other versions of @command{awk}.
+Consider this program:
+
+@example
+BEGIN @{
+    TEXTDOMAIN = "guide"
+    if (Test_Guide)   # set with -v
+        bindtextdomain("/test/guide/messages")
+    print _"don't panic!"
+@}
+@end example
+
+@noindent
+As written, it won't work on other versions of @command{awk}.
+However, it is actually almost portable, requiring very little
+change:
+
+@itemize @value{BULLET}
+@cindex @code{TEXTDOMAIN} variable, portability and
+@item
+Assignments to @code{TEXTDOMAIN} won't have any effect,
+because @code{TEXTDOMAIN} is not special in other @command{awk} implementations.
+
+@item
+Non-GNU versions of @command{awk} treat marked strings
+as the concatenation of a variable named @code{_} with the string
+following it.@footnote{This is good fodder for an ``Obfuscated
+@command{awk}'' contest.} Typically, the variable @code{_} has
+the null string (@code{""}) as its value, leaving the original string constant as
+the result.
+
+@item
+By defining ``dummy'' functions to replace @code{dcgettext()}, @code{dcngettext()},
+and @code{bindtextdomain()}, the @command{awk} program can be made to run, but
+all the messages are output in the original language.
+For example:
+
+@cindex @code{bindtextdomain()} function (@command{gawk}), portability and
+@cindex @code{dcgettext()} function (@command{gawk}), portability and
+@cindex @code{dcngettext()} function (@command{gawk}), portability and
+@example
+@c file eg/lib/libintl.awk
+function bindtextdomain(dir, domain)
+@{
+    return dir
+@}
+
+function dcgettext(string, domain, category)
+@{
+    return string
+@}
+
+function dcngettext(string1, string2, number, domain, category)
+@{
+    return (number == 1 ? string1 : string2)
+@}
+@c endfile
+@end example
+
+@item
+The use of positional specifications in @code{printf} or
+@code{sprintf()} is @emph{not} portable.
+To support @code{gettext()} at the C level, many systems' C versions of
+@code{sprintf()} do support positional specifiers.  But it works only if
+enough arguments are supplied in the function call.  Many versions of
+@command{awk} pass @code{printf} formats and arguments unchanged to the
+underlying C library version of @code{sprintf()}, but only one format and
+argument at a time.  What happens if a positional specification is
+used is anybody's guess.
+However, because the positional specifications are primarily for use in
+@emph{translated} format strings, and because non-GNU @command{awk}s never
+retrieve the translated string, this should not be a problem in practice.
+@end itemize
+
+@node I18N Example
+@section A Simple Internationalization Example
+
+Now let's look at a step-by-step example of how to internationalize and
+localize a simple @command{awk} program, using @file{guide.awk} as our
+original source:
+
+@example
+@c file eg/prog/guide.awk
+BEGIN @{
+    TEXTDOMAIN = "guide"
+    bindtextdomain(".")  # for testing
+    print _"Don't Panic"
+    print _"The Answer Is", 42
+    print "Pardon me, Zaphod who?"
+@}
+@c endfile
+@end example
+
+@noindent
+Run @samp{gawk --gen-pot} to create the @file{.pot} file:
+
+@example
+$ @kbd{gawk --gen-pot -f guide.awk > guide.pot}
+@end example
+
+@noindent
+This produces:
+
+@example
+@c file eg/data/guide.po
+#: guide.awk:4
+msgid "Don't Panic"
+msgstr ""
+
+#: guide.awk:5
+msgid "The Answer Is"
+msgstr ""
+
+@c endfile
+@end example
+
+This original portable object template file is saved and reused for each language
+into which the application is translated.  The @code{msgid}
+is the original string and the @code{msgstr} is the translation.
+
+@quotation NOTE
+Strings not marked with a leading underscore do not
+appear in the @file{guide.pot} file.
+@end quotation
+
+Next, the messages must be translated.
+Here is a translation to a hypothetical dialect of English,
+called ``Mellow'':@footnote{Perhaps it would be better if it were
+called ``Hippy.'' Ah, well.}
+
+@example
+@group
+$ @kbd{cp guide.pot guide-mellow.po}
+@var{Add translations to} guide-mellow.po @dots{}
+@end group
+@end example
+
+@noindent
+Following are the translations:
+
+@example
+@c file eg/data/guide-mellow.po
+#: guide.awk:4
+msgid "Don't Panic"
+msgstr "Hey man, relax!"
+
+#: guide.awk:5
+msgid "The Answer Is"
+msgstr "Like, the scoop is"
+
+@c endfile
+@end example
+
+@cindex Linux
+@cindex GNU/Linux
+@quotation NOTE
+The following instructions apply to GNU/Linux with the GNU C Library. Be
+aware that the actual steps may change over time, that the following
+description may not be accurate for all GNU/Linux distributions, and
+that things may work entirely differently on other operating systems.
+@end quotation
+
+The next step is to make the directory to hold the binary message object
+file and then to create the @file{guide.mo} file.
+The directory has the form @file{@var{locale}/LC_MESSAGES}, where
+@var{locale} is a locale name known to the C @command{gettext} routines.
+
+How do we know which locale to use?  It turns out that there are
+four different environment variables used by the C @command{gettext} routines.
+In order, they are @env{$LANGUAGE}, @env{$LC_ALL}, @env{$LANG}, and
+@env{$LC_MESSAGES}.@footnote{Well, sort of. It seems that if @env{$LC_ALL}
+is set to @samp{C}, then no translations are done. Go figure.}
+Thus, we check the value of @env{$LANGUAGE}:
+
+@example
+$ @kbd{echo $LANGUAGE}
+@print{} en_US.UTF-8
+@end example
+
+@noindent
+We next make the directories:
+
+@example
+$ @kbd{mkdir en_US.UTF-8 en_US.UTF-8/LC_MESSAGES}
+@end example
+
+@cindex @code{.po} files, converting to @code{.mo}
+@cindex files, @code{.po}, converting to @code{.mo}
+@cindex @code{.mo} files, converting from @code{.po}
+@cindex files, @code{.mo}, converting from @code{.po}
+@cindex portable object files, converting to message object files
+@cindex files, portable object, converting to message object files
+@cindex message object files, converting from portable object files
+@cindex files, message object, converting from portable object files
+@cindex @command{msgfmt} utility
+The @command{msgfmt} utility converts the human-readable
+@file{.po} file into a machine-readable @file{.mo} file.
+By default, @command{msgfmt} creates a file named @file{messages}.
+This file must be renamed and placed in the proper directory (using
+the @option{-o} option) so that @command{gawk} can find it:
+
+@example
+$ @kbd{msgfmt guide-mellow.po -o en_US.UTF-8/LC_MESSAGES/guide.mo}
+@end example
+
+Finally, we run the program to test it:
+
+@example
+$ @kbd{gawk -f guide.awk}
+@print{} Hey man, relax!
+@print{} Like, the scoop is 42
+@print{} Pardon me, Zaphod who?
+@end example
+
+If the three replacement functions for @code{dcgettext()}, @code{dcngettext()},
+and @code{bindtextdomain()}
+(@pxref{I18N Portability})
+are in a file named @file{libintl.awk},
+then we can run @file{guide.awk} unchanged as follows:
+
+@example
+$ @kbd{gawk --posix -f guide.awk -f libintl.awk}
+@print{} Don't Panic
+@print{} The Answer Is 42
+@print{} Pardon me, Zaphod who?
+@end example
+
+@node Gawk I18N
+@section @command{gawk} Can Speak Your Language
+
+@command{gawk} itself has been internationalized
+using the GNU @command{gettext} package.
+(GNU @command{gettext} is described in
+complete detail in
+@ifinfo
+@inforef{Top, , GNU @command{gettext} utilities, gettext, GNU @command{gettext} utilities}.)
+@end ifinfo
+@ifnotinfo
+@uref{https://www.gnu.org/software/gettext/manual/,
+@cite{GNU @command{gettext} utilities}}.)
+@end ifnotinfo
+As of this writing, the latest version of GNU @command{gettext} is
+@uref{ftp://ftp.gnu.org/gnu/gettext/gettext-0.19.8.1.tar.gz,
+@value{PVERSION} 0.19.8.1}.
+
+If a translation of @command{gawk}'s messages exists,
+then @command{gawk} produces usage messages, warnings,
+and fatal errors in the local language.
+
+@node I18N Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Internationalization means writing a program such that it can use multiple
+languages without requiring source code changes.  Localization means
+providing the data necessary for an internationalized program to work
+in a particular language.
+
+@item
+@command{gawk} uses GNU @command{gettext} to let you internationalize
+and localize @command{awk} programs.  A program's text domain identifies
+the program for grouping all messages and other data together.
+
+@item
+You mark a program's strings for translation by preceding them with
+an underscore. Once that is done, the strings are extracted into a
+@file{.pot} file.  This file is copied for each language into a @file{.po}
+file, and the @file{.po} files are compiled into @file{.gmo} files for
+use at runtime.
+
+@item
+You can use positional specifications with @code{sprintf()} and
+@code{printf} to rearrange the placement of argument values in formatted
+strings and output. This is useful for the translation of format
+control strings.
+
+@item
+The internationalization features have been designed so that they
+can be easily worked around in a standard @command{awk}.
+
+@item
+@command{gawk} itself has been internationalized and ships with
+a number of translations for its messages.
+
+@end itemize
+
+
+@node Debugger
+@chapter Debugging @command{awk} Programs
+@cindex debugging @command{awk} programs
+
+@c The original text for this chapter was contributed by Efraim Yawitz.
+
+It would be nice if computer programs worked perfectly the first time they
+were run, but in real life, this rarely happens for programs of
+any complexity.  Thus, most programming languages have facilities available
+for ``debugging'' programs, and @command{awk} is no exception.
+
+The @command{gawk} debugger is purposely modeled after
+@uref{https://www.gnu.org/software/gdb/, the GNU Debugger (GDB)}
+command-line debugger.  If you are familiar with GDB, learning
+how to use @command{gawk} for debugging your programs is easy.
+
+@menu
+* Debugging::                   Introduction to @command{gawk} debugger.
+* Sample Debugging Session::    Sample debugging session.
+* List of Debugger Commands::   Main debugger commands.
+* Readline Support::            Readline support.
+* Limitations::                 Limitations and future plans.
+* Debugging Summary::           Debugging summary.
+@end menu
+
+@node Debugging
+@section Introduction to the @command{gawk} Debugger
+
+This @value{SECTION} introduces debugging in general and begins
+the discussion of debugging in @command{gawk}.
+
+@menu
+* Debugging Concepts::          Debugging in General.
+* Debugging Terms::             Additional Debugging Concepts.
+* Awk Debugging::               Awk Debugging.
+@end menu
+
+@node Debugging Concepts
+@subsection Debugging in General
+
+(If you have used debuggers in other languages, you may want to skip
+ahead to @ref{Awk Debugging}.)
+
+Of course, a debugging program cannot remove bugs for you, because it has
+no way of knowing what you or your users consider a ``bug'' versus a
+``feature.''  (Sometimes, we humans have a hard time with this ourselves.)
+In that case, what can you expect from such a tool?  The answer to that
+depends on the language being debugged, but in general, you can expect at
+least the following:
+
+@cindex debugger capabilities
+@itemize @value{BULLET}
+@item
+The ability to watch a program execute its instructions one by one,
+giving you, the programmer, the opportunity to think about what is happening
+on a time scale of seconds, minutes, or hours, rather than the nanosecond
+time scale at which the code usually runs.
+
+@item
+The opportunity to not only passively observe the operation of your
+program, but to control it and try different paths of execution, without
+having to change your source files.
+
+@item
+The chance to see the values of data in the program at any point in
+execution, and also to change that data on the fly, to see how that
+affects what happens afterward.  (This often includes the ability
+to look at internal data structures besides the variables you actually
+defined in your code.)
+
+@item
+The ability to obtain additional information about your program's state
+or even its internal structure.
+@end itemize
+
+All of these tools provide a great amount of help in using your own
+skills and understanding of the goals of your program to find where it
+is going wrong (or, for that matter, to better comprehend a perfectly
+functional program that you or someone else wrote).
+
+@node Debugging Terms
+@subsection Debugging Concepts
+
+@cindex debugger, concepts
+Before diving in to the details, we need to introduce several
+important concepts that apply to just about all debuggers.
+The following list defines terms used throughout the rest of
+this @value{CHAPTER}:
+
+@table @dfn
+@cindex call stack (debugger)
+@cindex stack frame (debugger)
+@item Stack frame
+Programs generally call functions during the course of their execution.
+One function can call another, or a function can call itself (recursion).
+You can view the chain of called functions (main program calls A, which
+calls B, which calls C), as a stack of executing functions: the currently
+running function is the topmost one on the stack, and when it finishes
+(returns), the next one down then becomes the active function.
+Such a stack is termed a @dfn{call stack}.
+
+For each function on the call stack, the system maintains a data area
+that contains the function's parameters, local variables, and return value,
+as well as any other ``bookkeeping'' information needed to manage the
+call stack.  This data area is termed a @dfn{stack frame}.
+
+@command{gawk} also follows this model, and gives you
+access to the call stack and to each stack frame. You can see the
+call stack, as well as from where each function on the stack was
+invoked. Commands that print the call stack print information about
+each stack frame (as detailed later on).
+
+@item Breakpoint
+@cindex breakpoint (debugger)
+During debugging, you often wish to let the program run until it
+reaches a certain point, and then continue execution from there one
+statement (or instruction) at a time.  The way to do this is to set
+a @dfn{breakpoint} within the program.  A breakpoint is where the
+execution of the program should break off (stop), so that you can
+take over control of the program's execution.  You can add and remove
+as many breakpoints as you like.
+
+@item Watchpoint
+@cindex watchpoint (debugger)
+A watchpoint is similar to a breakpoint.  The difference is that
+breakpoints are oriented around the code: stop when a certain point in the
+code is reached.  A watchpoint, however, specifies that program execution
+should stop when a @emph{data value} is changed.  This is useful, as
+sometimes it happens that a variable receives an erroneous value, and it's
+hard to track down where this happens just by looking at the code.
+By using a watchpoint, you can stop whenever a variable is assigned to,
+and usually find the errant code quite quickly.
+@end table
+
+@node Awk Debugging
+@subsection @command{awk} Debugging
+
+Debugging an @command{awk} program has some specific aspects that are
+not shared with programs written in other languages.
+
+First of all, the fact that @command{awk} programs usually take input
+line by line from a file or files and operate on those lines using specific
+rules makes it especially useful to organize viewing the execution of
+the program in terms of these rules.  As we will see, each @command{awk}
+rule is treated almost like a function call, with its own specific block
+of instructions.
+
+In addition, because @command{awk} is by design a very concise language,
+it is easy to lose sight of everything that is going on ``inside''
+each line of @command{awk} code.  The debugger provides the opportunity
+to look at the individual primitive instructions carried out
+by the higher-level @command{awk} commands.@footnote{The ``primitive
+instructions'' are defined by @command{gawk} itself; the debugger
+does not work at the level of machine instructions.}
+
+@node Sample Debugging Session
+@section Sample @command{gawk} Debugging Session
+@cindex sample debugging session
+@cindex example debugging session
+@cindex debugging, example session
+
+In order to illustrate the use of @command{gawk} as a debugger, let's look at a sample
+debugging session.  We will use the @command{awk} implementation of the
+POSIX @command{uniq} command presented earlier (@pxref{Uniq Program})
+as our example.
+
+@menu
+* Debugger Invocation::         How to Start the Debugger.
+* Finding The Bug::             Finding the Bug.
+@end menu
+
+@node Debugger Invocation
+@subsection How to Start the Debugger
+@cindex starting the debugger
+@cindex debugger, how to start
+
+Starting the debugger is almost exactly like running @command{gawk} normally,
+except you have to pass an additional option, @option{--debug}, or the
+corresponding short option, @option{-D}.  The file(s) containing the
+program and any supporting code are given on the command line as arguments
+to one or more @option{-f} options. (@command{gawk} is not designed
+to debug command-line programs, only programs contained in files.)
+In our case, we invoke the debugger like this:
+
+@example
+$ @kbd{gawk -D -f getopt.awk -f join.awk -f uniq.awk -1 inputfile}
+@end example
+
+@noindent
+where both @file{getopt.awk} and @file{uniq.awk} are in @env{$AWKPATH}.
+(Experienced users of GDB or similar debuggers should note that
+this syntax is slightly different from what you are used to.
+With the @command{gawk} debugger, you give the arguments for running the program
+in the command line to the debugger rather than as part of the @code{run}
+command at the debugger prompt.)
+The @option{-1} is an option to @file{uniq.awk}.
+
+@cindex debugger, prompt
+Instead of immediately running the program on @file{inputfile}, as
+@command{gawk} would ordinarily do, the debugger merely loads all
+the program source files, compiles them internally, and then gives
+us a prompt:
+
+@example
+gawk>
+@end example
+
+@noindent
+from which we can issue commands to the debugger.  At this point, no
+code has been executed.
+
+@node Finding The Bug
+@subsection Finding the Bug
+
+Let's say that we are having a problem using (a faulty version of)
+@file{uniq.awk} in ``field-skipping'' mode, and it doesn't seem to be
+catching lines which should be identical when skipping the first field,
+such as:
+
+@example
+awk is a wonderful program!
+gawk is a wonderful program!
+@end example
+
+This could happen if we were thinking (C-like) of the fields in a record
+as being numbered in a zero-based fashion, so instead of the lines:
+
+@example
+clast = join(alast, fcount+1, n)
+cline = join(aline, fcount+1, m)
+@end example
+
+@noindent
+we wrote:
+
+@example
+clast = join(alast, fcount, n)
+cline = join(aline, fcount, m)
+@end example
+
+The first thing we usually want to do when trying to investigate a
+problem like this is to put a breakpoint in the program so that we can
+watch it at work and catch what it is doing wrong.  A reasonable spot for
+a breakpoint in @file{uniq.awk} is at the beginning of the function
+@code{are_equal()}, which compares the current line with the previous one. To set
+the breakpoint, use the @code{b} (breakpoint) command:
+
+@cindex debugger, setting a breakpoint
+@cindex debugger, @code{breakpoint} command
+@cindex debugger, @code{break} command
+@cindex debugger, @code{b} command
+@example
+gawk> @kbd{b are_equal}
+@print{} Breakpoint 1 set at file `awklib/eg/prog/uniq.awk', line 63
+@end example
+
+The debugger tells us the file and line number where the breakpoint is.
+Now type @samp{r} or @samp{run} and the program runs until it hits
+the breakpoint for the first time:
+
+@cindex debugger, running the program
+@cindex debugger, @code{run} command
+@example
+gawk> @kbd{r}
+@print{} Starting program:
+@print{} Stopping in Rule ...
+@print{} Breakpoint 1, are_equal(n, m, clast, cline, alast, aline)
+         at `awklib/eg/prog/uniq.awk':63
+@print{} 63          if (fcount == 0 && charcount == 0)
+gawk>
+@end example
+
+Now we can look at what's going on inside our program.  First of all,
+let's see how we got to where we are.  At the prompt, we type @samp{bt}
+(short for ``backtrace''), and the debugger responds with a
+listing of the current stack frames:
+
+@cindex debugger, stack frames, showing
+@cindex debugger, @code{bt} command
+@cindex debugger, @code{backtrace} command
+@example
+gawk> @kbd{bt}
+@print{} #0  are_equal(n, m, clast, cline, alast, aline)
+         at `awklib/eg/prog/uniq.awk':68
+@print{} #1  in main() at `awklib/eg/prog/uniq.awk':88
+@end example
+
+This tells us that @code{are_equal()} was called by the main program at
+line 88 of @file{uniq.awk}.  (This is not a big surprise, because this
+is the only call to @code{are_equal()} in the program, but in more complex
+programs, knowing who called a function and with what parameters can be
+the key to finding the source of the problem.)
+
+Now that we're in @code{are_equal()}, we can start looking at the values
+of some variables.  Let's say we type @samp{p n}
+(@code{p} is short for ``print'').  We would expect to see the value of
+@code{n}, a parameter to @code{are_equal()}.  Actually, the debugger
+gives us:
+
+@cindex debugger, @code{print} command
+@cindex debugger, @code{p} command
+@example
+gawk> @kbd{p n}
+@print{} n = untyped variable
+@end example
+
+@noindent
+In this case, @code{n} is an uninitialized local variable, because the
+function was called without arguments (@pxref{Function Calls}).
+
+A more useful variable to display might be the current record:
+
+@example
+gawk> @kbd{p $0}
+@print{} $0 = "gawk is a wonderful program!"
+@end example
+
+@noindent
+This might be a bit puzzling at first, as this is the second line of
+our test input.  Let's look at @code{NR}:
+
+@example
+gawk> @kbd{p NR}
+@print{} NR = 2
+@end example
+
+@noindent
+So we can see that @code{are_equal()} was only called for the second record
+of the file.  Of course, this is because our program contains a rule for
+@samp{NR == 1}:
+
+@example
+NR == 1 @{
+    last = $0
+    next
+@}
+@end example
+
+OK, let's just check that that rule worked correctly:
+
+@example
+gawk> @kbd{p last}
+@print{} last = "awk is a wonderful program!"
+@end example
+
+Everything we have done so far has verified that the program has worked as
+planned, up to and including the call to @code{are_equal()}, so the problem must
+be inside this function.  To investigate further, we must begin
+``stepping through'' the lines of @code{are_equal()}.  We start by typing
+@samp{n} (for ``next''):
+
+@cindex debugger, @code{n} command
+@cindex debugger, @code{next} command
+@example
+@group
+gawk> @kbd{n}
+@print{} 66          if (fcount > 0) @{
+@end group
+@end example
+
+This tells us that @command{gawk} is now ready to execute line 66, which
+decides whether to give the lines the special ``field-skipping'' treatment
+indicated by the @option{-1} command-line option.  (Notice that we skipped
+from where we were before, at line 63, to here, because the condition
+in line 63, @samp{if (fcount == 0 && charcount == 0)}, was false.)
+
+Continuing to step, we now get to the splitting of the current and
+last records:
+
+@example
+gawk> @kbd{n}
+@print{} 67              n = split(last, alast)
+gawk> @kbd{n}
+@print{} 68              m = split($0, aline)
+@end example
+
+At this point, we should be curious to see what our records were split
+into, so we try to look:
+
+@example
+gawk> @kbd{p n m alast aline}
+@print{} n = 5
+@print{} m = untyped variable
+@print{} alast = array, 5 elements
+@print{} aline = untyped variable
+@end example
+
+@noindent
+(The @code{p} command can take more than one argument, similar to
+@command{awk}'s @code{print} statement.)
+
+This is kind of disappointing, though.  All we found out is that there
+are five elements in @code{alast}; @code{m} and @code{aline} don't have
+values because we are at line 68 but haven't executed it yet.
+This information is useful enough (we now know that
+none of the words were accidentally left out), but what if we want to see
+inside the array?
+
+@cindex debugger, printing single array elements
+The first choice would be to use subscripts:
+
+@example
+gawk> @kbd{p alast[0]}
+@print{} "0" not in array `alast'
+@end example
+
+@noindent
+Oops!
+
+@example
+gawk> @kbd{p alast[1]}
+@print{} alast["1"] = "awk"
+@end example
+
+This would be kind of slow for a 100-member array, though, so
+@command{gawk} provides a shortcut (reminiscent of another language
+not to be mentioned):
+
+@cindex debugger, printing all array elements
+@example
+gawk> @kbd{p @@alast}
+@print{} alast["1"] = "awk"
+@print{} alast["2"] = "is"
+@print{} alast["3"] = "a"
+@print{} alast["4"] = "wonderful"
+@print{} alast["5"] = "program!"
+@end example
+
+It looks like we got this far OK.  Let's take another step
+or two:
+
+@example
+gawk> @kbd{n}
+@print{} 69              clast = join(alast, fcount, n)
+gawk> @kbd{n}
+@print{} 70              cline = join(aline, fcount, m)
+@end example
+
+Well, here we are at our error (sorry to spoil the suspense).  What we
+had in mind was to join the fields starting from the second one to make
+the virtual record to compare, and if the first field were numbered zero,
+this would work.  Let's look at what we've got:
+
+@example
+gawk> @kbd{p cline clast}
+@print{} cline = "gawk is a wonderful program!"
+@print{} clast = "awk is a wonderful program!"
+@end example
+
+Hey, those look pretty familiar!  They're just our original, unaltered
+input records.  A little thinking (the human brain is still the best
+debugging tool), and we realize that we were off by one!
+
+We get out of the debugger:
+
+@example
+gawk> @kbd{q}
+@print{} The program is running. Exit anyway (y/n)? @kbd{y}
+@end example
+
+@noindent
+Then we get into an editor:
+
+@example
+clast = join(alast, fcount+1, n)
+cline = join(aline, fcount+1, m)
+@end example
+
+@noindent
+and problem solved!
+
+@node List of Debugger Commands
+@section Main Debugger Commands
+
+The @command{gawk} debugger command set can be divided into the
+following categories:
+
+@itemize @value{BULLET}
+
+@item
+Breakpoint control
+
+@item
+Execution control
+
+@item
+Viewing and changing data
+
+@item
+Working with the stack
+
+@item
+Getting information
+
+@item
+Miscellaneous
+@end itemize
+
+@cindex debugger, repeating commands
+Each of these are discussed in the following subsections.
+In the following descriptions, commands that may be abbreviated
+show the abbreviation on a second description line.
+A debugger command name may also be truncated if that partial
+name is unambiguous. The debugger has the built-in capability to
+automatically repeat the previous command just by hitting @kbd{Enter}.
+This works for the commands @code{list}, @code{next}, @code{nexti},
+@code{step}, @code{stepi}, and @code{continue} executed without any
+argument.
+
+@menu
+* Breakpoint Control::          Control of Breakpoints.
+* Debugger Execution Control::  Control of Execution.
+* Viewing And Changing Data::   Viewing and Changing Data.
+* Execution Stack::             Dealing with the Stack.
+* Debugger Info::               Obtaining Information about the Program and
+                                the Debugger State.
+* Miscellaneous Debugger Commands:: Miscellaneous Commands.
+@end menu
+
+@node Breakpoint Control
+@subsection Control of Breakpoints
+
+As we saw earlier, the first thing you probably want to do in a debugging
+session is to get your breakpoints set up, because your program
+will otherwise just run as if it was not under the debugger.  The commands for
+controlling breakpoints are:
+
+@table @asis
+@cindex debugger commands, @code{b} (@code{break})
+@cindex debugger commands, @code{break}
+@cindex @code{break} debugger command
+@cindex @code{b} debugger command (alias for @code{break})
+@cindex set breakpoint
+@cindex breakpoint, setting
+@item @code{break} [[@var{filename}@code{:}]@var{n} | @var{function}] [@code{"@var{expression}"}]
+@itemx @code{b} [[@var{filename}@code{:}]@var{n} | @var{function}] [@code{"@var{expression}"}]
+Without any argument, set a breakpoint at the next instruction
+to be executed in the selected stack frame.
+Arguments can be one of the following:
+
+@c @asis for docbook
+@c nested table
+@table @asis
+@item @var{n}
+Set a breakpoint at line number @var{n} in the current source file.
+
+@item @var{filename}@code{:}@var{n}
+Set a breakpoint at line number @var{n} in source file @var{filename}.
+
+@item @var{function}
+Set a breakpoint at entry to (the first instruction of)
+function @var{function}.
+@end table
+
+Each breakpoint is assigned a number that can be used to delete it from
+the breakpoint list using the @code{delete} command.
+
+With a breakpoint, you may also supply a condition.  This is an
+@command{awk} expression (enclosed in double quotes) that the debugger
+evaluates whenever the breakpoint is reached. If the condition is true,
+then the debugger stops execution and prompts for a command. Otherwise,
+it continues executing the program.
+
+@cindex debugger commands, @code{clear}
+@cindex @code{clear} debugger command
+@cindex delete breakpoint, at location
+@cindex breakpoint at location, how to delete
+@item @code{clear} [[@var{filename}@code{:}]@var{n} | @var{function}]
+Without any argument, delete any breakpoint at the next instruction
+to be executed in the selected stack frame. If the program stops at
+a breakpoint, this deletes that breakpoint so that the program
+does not stop at that location again.  Arguments can be one of the following:
+
+@c nested table
+@table @asis
+@item @var{n}
+Delete breakpoint(s) set at line number @var{n} in the current source file.
+
+@item @var{filename}@code{:}@var{n}
+Delete breakpoint(s) set at line number @var{n} in source file @var{filename}.
+
+@item @var{function}
+Delete breakpoint(s) set at entry to function @var{function}.
+@end table
+
+@cindex debugger commands, @code{condition}
+@cindex @code{condition} debugger command
+@cindex breakpoint condition
+@item @code{condition} @var{n} @code{"@var{expression}"}
+Add a condition to existing breakpoint or watchpoint @var{n}. The
+condition is an @command{awk} expression @emph{enclosed in double quotes}
+that the debugger evaluates
+whenever the breakpoint or watchpoint is reached. If the condition is true, then
+the debugger stops execution and prompts for a command. Otherwise,
+the debugger continues executing the program. If the condition expression is
+not specified, any existing condition is removed (i.e., the breakpoint or
+watchpoint is made unconditional).
+
+@cindex debugger commands, @code{d} (@code{delete})
+@cindex debugger commands, @code{delete}
+@cindex @code{delete} debugger command
+@cindex @code{d} debugger command (alias for @code{delete})
+@cindex delete breakpoint, by number
+@cindex breakpoint, delete by number
+@item @code{delete} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+@itemx @code{d} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+Delete specified breakpoints or a range of breakpoints. Delete
+all defined breakpoints if no argument is supplied.
+
+@cindex debugger commands, @code{disable}
+@cindex @code{disable} debugger command
+@cindex disable breakpoint
+@cindex breakpoint, how to disable or enable
+@item @code{disable} [@var{n1 n2} @dots{} | @var{n}--@var{m}]
+Disable specified breakpoints or a range of breakpoints. Without
+any argument, disable all breakpoints.
+
+@cindex debugger commands, @code{e} (@code{enable})
+@cindex debugger commands, @code{enable}
+@cindex @code{enable} debugger command
+@cindex @code{e} debugger command (alias for @code{enable})
+@cindex enable breakpoint
+@item @code{enable} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+@itemx @code{e} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+Enable specified breakpoints or a range of breakpoints. Without
+any argument, enable all breakpoints.
+Optionally, you can specify how to enable the breakpoints:
+
+@c nested table
+@table @code
+@item del
+Enable the breakpoints temporarily, then delete each one when
+the program stops at it.
+
+@item once
+Enable the breakpoints temporarily, then disable each one when
+the program stops at it.
+@end table
+
+@cindex debugger commands, @code{ignore}
+@cindex @code{ignore} debugger command
+@cindex ignore breakpoint
+@item @code{ignore} @var{n} @var{count}
+Ignore breakpoint number @var{n} the next @var{count} times it is
+hit.
+
+@cindex debugger commands, @code{t} (@code{tbreak})
+@cindex debugger commands, @code{tbreak}
+@cindex @code{tbreak} debugger command
+@cindex @code{t} debugger command (alias for @code{tbreak})
+@cindex temporary breakpoint
+@item @code{tbreak} [[@var{filename}@code{:}]@var{n} | @var{function}]
+@itemx @code{t} [[@var{filename}@code{:}]@var{n} | @var{function}]
+Set a temporary breakpoint (enabled for only one stop).
+The arguments are the same as for @code{break}.
+@end table
+
+@node Debugger Execution Control
+@subsection Control of Execution
+
+Now that your breakpoints are ready, you can start running the program
+and observing its behavior.  There are more commands for controlling
+execution of the program than we saw in our earlier example:
+
+@table @asis
+@cindex debugger commands, @code{commands}
+@cindex @code{commands} debugger command
+@cindex debugger commands, @code{silent}
+@cindex @code{silent} debugger command
+@cindex debugger commands, @code{end}
+@cindex @code{end} debugger command
+@cindex breakpoint commands
+@cindex commands to execute at breakpoint
+@item @code{commands} [@var{n}]
+@itemx @code{silent}
+@itemx @dots{}
+@itemx @code{end}
+Set a list of commands to be executed upon stopping at
+a breakpoint or watchpoint. @var{n} is the breakpoint or watchpoint number.
+Without a number, the last one set is used. The actual commands follow,
+starting on the next line, and terminated by the @code{end} command.
+If the command @code{silent} is in the list, the usual messages about
+stopping at a breakpoint and the source line are not printed. Any command
+in the list that resumes execution (e.g., @code{continue}) terminates the list
+(an implicit @code{end}), and subsequent commands are ignored.
+For example:
+
+@example
+gawk> @kbd{commands}
+> @kbd{silent}
+> @kbd{printf "A silent breakpoint; i = %d\n", i}
+> @kbd{info locals}
+> @kbd{set i = 10}
+> @kbd{continue}
+> @kbd{end}
+gawk>
+@end example
+
+@cindex debugger commands, @code{c} (@code{continue})
+@cindex debugger commands, @code{continue}
+@cindex continue program, in debugger
+@cindex @code{continue} debugger command
+@item @code{continue} [@var{count}]
+@itemx @code{c} [@var{count}]
+Resume program execution. If continued from a breakpoint and @var{count} is
+specified, ignore the breakpoint at that location the next @var{count} times
+before stopping.
+
+@cindex debugger commands, @code{finish}
+@cindex @code{finish} debugger command
+@item @code{finish}
+Execute until the selected stack frame returns.
+Print the returned value.
+
+@cindex debugger commands, @code{n} (@code{next})
+@cindex debugger commands, @code{next}
+@cindex @code{next} debugger command
+@cindex @code{n} debugger command (alias for @code{next})
+@cindex single-step execution, in the debugger
+@item @code{next} [@var{count}]
+@itemx @code{n} [@var{count}]
+Continue execution to the next source line, stepping over function calls.
+The argument @var{count} controls how many times to repeat the action, as
+in @code{step}.
+
+@cindex debugger commands, @code{ni} (@code{nexti})
+@cindex debugger commands, @code{nexti}
+@cindex @code{nexti} debugger command
+@cindex @code{ni} debugger command (alias for @code{nexti})
+@item @code{nexti} [@var{count}]
+@itemx @code{ni} [@var{count}]
+Execute one (or @var{count}) instruction(s), stepping over function calls.
+
+@cindex debugger commands, @code{return}
+@cindex @code{return} debugger command
+@item @code{return} [@var{value}]
+Cancel execution of a function call. If @var{value} (either a string or a
+number) is specified, it is used as the function's return value. If used in a
+frame other than the innermost one (the currently executing function; i.e.,
+frame number 0), discard all inner frames in addition to the selected one,
+and the caller of that frame becomes the innermost frame.
+
+@cindex debugger commands, @code{r} (@code{run})
+@cindex debugger commands, @code{run}
+@cindex @code{run} debugger command
+@cindex @code{r} debugger command (alias for @code{run})
+@item @code{run}
+@itemx @code{r}
+Start/restart execution of the program. When restarting, the debugger
+retains the current breakpoints, watchpoints, command history,
+automatic display variables, and debugger options.
+
+@cindex debugger commands, @code{s} (@code{step})
+@cindex debugger commands, @code{step}
+@cindex @code{step} debugger command
+@cindex @code{s} debugger command (alias for @code{step})
+@item @code{step} [@var{count}]
+@itemx @code{s} [@var{count}]
+Continue execution until control reaches a different source line in the
+current stack frame, stepping inside any function called within
+the line.  If the argument @var{count} is supplied, steps that many times before
+stopping, unless it encounters a breakpoint or watchpoint.
+
+@cindex debugger commands, @code{si} (@code{stepi})
+@cindex debugger commands, @code{stepi}
+@cindex @code{stepi} debugger command
+@cindex @code{si} debugger command (alias for @code{stepi})
+@item @code{stepi} [@var{count}]
+@itemx @code{si} [@var{count}]
+Execute one (or @var{count}) instruction(s), stepping inside function calls.
+(For illustration of what is meant by an ``instruction'' in @command{gawk},
+see the output shown under @code{dump} in @ref{Miscellaneous Debugger Commands}.)
+
+@cindex debugger commands, @code{u} (@code{until})
+@cindex debugger commands, @code{until}
+@cindex @code{until} debugger command
+@cindex @code{u} debugger command (alias for @code{until})
+@item @code{until} [[@var{filename}@code{:}]@var{n} | @var{function}]
+@itemx @code{u} [[@var{filename}@code{:}]@var{n} | @var{function}]
+Without any argument, continue execution until a line past the current
+line in the current stack frame is reached. With an argument,
+continue execution until the specified location is reached, or the current
+stack frame returns.
+@end table
+
+@node Viewing And Changing Data
+@subsection Viewing and Changing Data
+
+The commands for viewing and changing variables inside of @command{gawk} are:
+
+@table @asis
+@cindex debugger commands, @code{display}
+@cindex @code{display} debugger command
+@item @code{display} [@var{var} | @code{$}@var{n}]
+Add variable @var{var} (or field @code{$@var{n}}) to the display list.
+The value of the variable or field is displayed each time the program stops.
+Each variable added to the list is identified by a unique number:
+
+@example
+gawk> @kbd{display x}
+@print{} 10: x = 1
+@end example
+
+@noindent
+This displays the assigned item number, the variable name, and its current value.
+If the display variable refers to a function parameter, it is silently
+deleted from the list as soon as the execution reaches a context where
+no such variable of the given name exists.
+Without argument, @code{display} displays the current values of
+items on the list.
+
+@cindex debugger commands, @code{eval}
+@cindex @code{eval} debugger command
+@cindex evaluate expressions, in debugger
+@item @code{eval "@var{awk statements}"}
+Evaluate @var{awk statements} in the context of the running program.
+You can do anything that an @command{awk} program would do: assign
+values to variables, call functions, and so on.
+
+@quotation NOTE
+You cannot use @code{eval} to execute a statement containing
+any of the following:
+@code{exit},
+@code{getline},
+@code{next},
+@code{nextfile},
+or
+@code{return}.
+@end quotation
+
+@item @code{eval} @var{param}, @dots{}
+@itemx @var{awk statements}
+@itemx @code{end}
+This form of @code{eval} is similar, but it allows you to define
+``local variables'' that exist in the context of the
+@var{awk statements}, instead of using variables or function
+parameters defined by the program.
+
+@cindex debugger commands, @code{p} (@code{print})
+@cindex debugger commands, @code{print}
+@cindex @code{print} debugger command
+@cindex @code{p} debugger command (alias for @code{print})
+@cindex print variables, in debugger
+@item @code{print} @var{var1}[@code{,} @var{var2} @dots{}]
+@itemx @code{p} @var{var1}[@code{,} @var{var2} @dots{}]
+Print the value of a @command{gawk} variable or field.
+Fields must be referenced by constants:
+
+@example
+gawk> @kbd{print $3}
+@end example
+
+@noindent
+This prints the third field in the input record (if the specified field does not
+exist, it prints @samp{Null field}). A variable can be an array element, with
+the subscripts being constant string values. To print the contents of an array,
+prefix the name of the array with the @samp{@@} symbol:
+
+@example
+gawk> @kbd{print @@a}
+@end example
+
+@noindent
+This prints the indices and the corresponding values for all elements in
+the array @code{a}.
+
+@cindex debugger commands, @code{printf}
+@cindex @code{printf} debugger command
+@item @code{printf} @var{format} [@code{,} @var{arg} @dots{}]
+Print formatted text. The @var{format} may include escape sequences,
+such as @samp{\n}
+(@pxref{Escape Sequences}).
+No newline is printed unless one is specified.
+
+@cindex debugger commands, @code{set}
+@cindex @code{set} debugger command
+@cindex assign values to variables, in debugger
+@item @code{set} @var{var}@code{=}@var{value}
+Assign a constant (number or string) value to an @command{awk} variable
+or field.
+String values must be enclosed between double quotes (@code{"}@dots{}@code{"}).
+
+You can also set special @command{awk} variables, such as @code{FS},
+@code{NF}, @code{NR}, and so on.
+
+@cindex debugger commands, @code{w} (@code{watch})
+@cindex debugger commands, @code{watch}
+@cindex @code{watch} debugger command
+@cindex @code{w} debugger command (alias for @code{watch})
+@cindex set watchpoint
+@item @code{watch} @var{var} | @code{$}@var{n} [@code{"@var{expression}"}]
+@itemx @code{w} @var{var} | @code{$}@var{n} [@code{"@var{expression}"}]
+Add variable @var{var} (or field @code{$@var{n}}) to the watch list.
+The debugger then stops whenever
+the value of the variable or field changes. Each watched item is assigned a
+number that can be used to delete it from the watch list using the
+@code{unwatch} command.
+
+With a watchpoint, you may also supply a condition.  This is an
+@command{awk} expression (enclosed in double quotes) that the debugger
+evaluates whenever the watchpoint is reached. If the condition is true,
+then the debugger stops execution and prompts for a command. Otherwise,
+@command{gawk} continues executing the program.
+
+@cindex debugger commands, @code{undisplay}
+@cindex @code{undisplay} debugger command
+@cindex stop automatic display, in debugger
+@item @code{undisplay} [@var{n}]
+Remove item number @var{n} (or all items, if no argument) from the
+automatic display list.
+
+@cindex debugger commands, @code{unwatch}
+@cindex @code{unwatch} debugger command
+@cindex delete watchpoint
+@item @code{unwatch} [@var{n}]
+Remove item number @var{n} (or all items, if no argument) from the
+watch list.
+
+@end table
+
+@node Execution Stack
+@subsection Working with the Stack
+
+Whenever you run a program that contains any function calls,
+@command{gawk} maintains a stack of all of the function calls leading up
+to where the program is right now.  You can see how you got to where you are,
+and also move around in the stack to see what the state of things was in the
+functions that called the one you are in.  The commands for doing this are:
+
+@table @asis
+@cindex debugger commands, @code{bt} (@code{backtrace})
+@cindex debugger commands, @code{backtrace}
+@cindex debugger commands, @code{where} (@code{backtrace})
+@cindex @code{backtrace} debugger command
+@cindex @code{bt} debugger command (alias for @code{backtrace})
+@cindex @code{where} debugger command (alias for @code{backtrace})
+@cindex call stack, display in debugger
+@cindex traceback, display in debugger
+@item @code{backtrace} [@var{count}]
+@itemx @code{bt} [@var{count}]
+@itemx @code{where} [@var{count}]
+Print a backtrace of all function calls (stack frames), or innermost @var{count}
+frames if @var{count} > 0. Print the outermost @var{count} frames if
+@var{count} < 0.  The backtrace displays the name and arguments to each
+function, the source @value{FN}, and the line number.
+The alias @code{where} for @code{backtrace} is provided for longtime
+GDB users who may be used to that command.
+
+@cindex debugger commands, @code{down}
+@cindex @code{down} debugger command
+@item @code{down} [@var{count}]
+Move @var{count} (default 1) frames down the stack toward the innermost frame.
+Then select and print the frame.
+
+@cindex debugger commands, @code{f} (@code{frame})
+@cindex debugger commands, @code{frame}
+@cindex @code{frame} debugger command
+@cindex @code{f} debugger command (alias for @code{frame})
+@item @code{frame} [@var{n}]
+@itemx @code{f} [@var{n}]
+Select and print stack frame @var{n}.  Frame 0 is the currently executing,
+or @dfn{innermost}, frame (function call); frame 1 is the frame that
+called the innermost one. The highest-numbered frame is the one for the
+main program.  The printed information consists of the frame number,
+function and argument names, source file, and the source line.
+
+@cindex debugger commands, @code{up}
+@cindex @code{up} debugger command
+@item @code{up} [@var{count}]
+Move @var{count} (default 1) frames up the stack toward the outermost frame.
+Then select and print the frame.
+@end table
+
+@node Debugger Info
+@subsection Obtaining Information About the Program and the Debugger State
+
+Besides looking at the values of variables, there is often a need to get
+other sorts of information about the state of your program and of the
+debugging environment itself.  The @command{gawk} debugger has one command that
+provides this information, appropriately called @code{info}.  @code{info}
+is used with one of a number of arguments that tell it exactly what
+you want to know:
+
+@table @asis
+@cindex debugger commands, @code{i} (@code{info})
+@cindex debugger commands, @code{info}
+@cindex @code{info} debugger command
+@cindex @code{i} debugger command (alias for @code{info})
+@item @code{info} @var{what}
+@itemx @code{i} @var{what}
+The value for @var{what} should be one of the following:
+
+@c nested table
+@table @code
+@item args
+@cindex show function arguments, in debugger
+List arguments of the selected frame.
+
+@item break
+@cindex show breakpoints
+List all currently set breakpoints.
+
+@item display
+@cindex automatic displays, in debugger
+List all items in the automatic display list.
+
+@item frame
+@cindex describe call stack frame, in debugger
+Give a description of the selected stack frame.
+
+@item functions
+@cindex list function definitions, in debugger
+List all function definitions including source @value{FN}s and
+line numbers.
+
+@item locals
+@cindex show local variables, in debugger
+List local variables of the selected frame.
+
+@item source
+@cindex show name of current source file, in debugger
+Print the name of the current source file. Each time the program stops, the
+current source file is the file containing the current instruction.
+When the debugger first starts, the current source file is the first file
+included via the @option{-f} option. The
+@samp{list @var{filename}:@var{lineno}} command can
+be used at any time to change the current source.
+
+@item sources
+@cindex show all source files, in debugger
+List all program sources.
+
+@item variables
+@cindex list all global variables, in debugger
+List all global variables.
+
+@item watch
+@cindex show watchpoints
+List all items in the watch list.
+@end table
+@end table
+
+Additional commands give you control over the debugger, the ability to
+save the debugger's state, and the ability to run debugger commands
+from a file.  The commands are:
+
+@table @asis
+@cindex debugger commands, @code{o} (@code{option})
+@cindex debugger commands, @code{option}
+@cindex @code{option} debugger command
+@cindex @code{o} debugger command (alias for @code{option})
+@cindex display debugger options
+@cindex debugger, options
+@item @code{option} [@var{name}[@code{=}@var{value}]]
+@itemx @code{o} [@var{name}[@code{=}@var{value}]]
+Without an argument, display the available debugger options
+and their current values. @samp{option @var{name}} shows the current
+value of the named option. @samp{option @var{name}=@var{value}} assigns
+a new value to the named option.
+The available options are:
+
+@c nested table
+@c asis for docbook
+@table @asis
+@item @code{history_size}
+@cindex debugger, history size
+Set the maximum number of lines to keep in the history file
+@file{./.gawk_history}.  The default is 100.
+
+@item @code{listsize}
+@cindex debugger, default list amount
+Specify the number of lines that @code{list} prints. The default is 15.
+
+@item @code{outfile}
+@cindex redirect @command{gawk} output, in debugger
+Send @command{gawk} output to a file; debugger output still goes
+to standard output. An empty string (@code{""}) resets output to
+standard output.
+
+@item @code{prompt}
+@cindex debugger, prompt
+Change the debugger prompt. The default is @samp{@w{gawk> }}.
+
+@item @code{save_history} [@code{on} | @code{off}]
+@cindex debugger, history file
+Save command history to file @file{./.gawk_history}.
+The default is @code{on}.
+
+@item @code{save_options} [@code{on} | @code{off}]
+@cindex save debugger options
+Save current options to file @file{./.gawkrc} upon exit.
+The default is @code{on}.
+Options are read back into the next session upon startup.
+
+@item @code{trace} [@code{on} | @code{off}]
+@cindex instruction tracing, in debugger
+@cindex debugger, instruction tracing
+Turn instruction tracing on or off. The default is @code{off}.
+@end table
+
+@cindex debugger, save commands to a file
+@item @code{save} @var{filename}
+Save the commands from the current session to the given @value{FN},
+so that they can be replayed using the @command{source} command.
+
+@item @code{source} @var{filename}
+@cindex debugger, read commands from a file
+Run command(s) from a file; an error in any command does not
+terminate execution of subsequent commands. Comments (lines starting
+with @samp{#}) are allowed in a command file.
+Empty lines are ignored; they do @emph{not}
+repeat the last command.
+You can't restart the program by having more than one @code{run}
+command in the file. Also, the list of commands may include additional
+@code{source} commands; however, the @command{gawk} debugger will not source the
+same file more than once in order to avoid infinite recursion.
+
+In addition to, or instead of, the @code{source} command, you can use
+the @option{-D @var{file}} or @option{--debug=@var{file}} command-line
+options to execute commands from a file non-interactively
+(@pxref{Options}).
+@end table
+
+@node Miscellaneous Debugger Commands
+@subsection Miscellaneous Commands
+
+There are a few more commands that do not fit into the
+previous categories, as follows:
+
+@table @asis
+@cindex debugger commands, @code{dump}
+@cindex @code{dump} debugger command
+@item @code{dump} [@var{filename}]
+Dump byte code of the program to standard output or to the file
+named in @var{filename}.  This prints a representation of the internal
+instructions that @command{gawk} executes to implement the @command{awk}
+commands in a program.  This can be very enlightening, as the following
+partial dump of Davide Brini's obfuscated code
+(@pxref{Signature Program}) demonstrates:
+
+@c FIXME: This will need updating if num-handler branch is ever merged in.
+@smallexample
+@group
+gawk> @kbd{dump}
+@print{}        # BEGIN
+@print{}
+@print{} [  1:0xfcd340] Op_rule           : [in_rule = BEGIN] [source_file = brini.awk]
+@end group
+@print{} [  1:0xfcc240] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc2a0] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc280] Op_match          :
+@print{} [  1:0xfcc1e0] Op_store_var      : O
+@print{} [  1:0xfcc2e0] Op_push_i         : "==" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc340] Op_push_i         : "==" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc320] Op_equal          :
+@print{} [  1:0xfcc200] Op_store_var      : o
+@print{} [  1:0xfcc380] Op_push           : o
+@print{} [  1:0xfcc360] Op_plus_i         : 0 [MALLOC|NUMCUR|NUMBER]
+@print{} [  1:0xfcc220] Op_push_lhs       : o [do_reference = true]
+@print{} [  1:0xfcc300] Op_assign_plus    :
+@print{} [   :0xfcc2c0] Op_pop            :
+@print{} [  1:0xfcc400] Op_push           : O
+@print{} [  1:0xfcc420] Op_push_i         : "" [MALLOC|STRING|STRCUR]
+@print{} [   :0xfcc4a0] Op_no_op          :
+@print{} [  1:0xfcc480] Op_push           : O
+@print{} [   :0xfcc4c0] Op_concat         : [expr_count = 3] [concat_flag = 0]
+@print{} [  1:0xfcc3c0] Op_store_var      : x
+@print{} [  1:0xfcc440] Op_push_lhs       : X [do_reference = true]
+@print{} [  1:0xfcc3a0] Op_postincrement  :
+@print{} [  1:0xfcc4e0] Op_push           : x
+@print{} [  1:0xfcc540] Op_push           : o
+@print{} [  1:0xfcc500] Op_plus           :
+@print{} [  1:0xfcc580] Op_push           : o
+@print{} [  1:0xfcc560] Op_plus           :
+@print{} [  1:0xfcc460] Op_leq            :
+@print{} [   :0xfcc5c0] Op_jmp_false      : [target_jmp = 0xfcc5e0]
+@print{} [  1:0xfcc600] Op_push_i         : "%c" [MALLOC|STRING|STRCUR]
+@print{} [   :0xfcc660] Op_no_op          :
+@print{} [  1:0xfcc520] Op_assign_concat  : c
+@print{} [   :0xfcc620] Op_jmp            : [target_jmp = 0xfcc440]
+@dots{}
+@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  :
+@group
+@print{} [      :0xfcc160] Op_no_op            :
+@print{} [      :0xfcc1a0] Op_after_endfile    :
+gawk>
+@end group
+@end smallexample
+
+@cindex @code{exit} debugger command
+@cindex exit the debugger
+@item @code{exit}
+Exit the debugger.
+See the entry for @samp{quit}, later in this list.
+
+@cindex debugger commands, @code{h} (@code{help})
+@cindex debugger commands, @code{help}
+@cindex @code{help} debugger command
+@cindex @code{h} debugger command (alias for @code{help})
+@item @code{help}
+@itemx @code{h}
+Print a list of all of the @command{gawk} debugger commands with a short
+summary of their usage.  @samp{help @var{command}} prints the information
+about the command @var{command}.
+
+@cindex debugger commands, @code{l} (@code{list})
+@cindex debugger commands, @code{list}
+@cindex @code{list} debugger command
+@cindex @code{l} debugger command (alias for @code{list})
+@item @code{list} [@code{-} | @code{+} | @var{n} | @var{filename}@code{:}@var{n} | @var{n}--@var{m} | @var{function}]
+@itemx @code{l} [@code{-} | @code{+} | @var{n} | @var{filename}@code{:}@var{n} | @var{n}--@var{m} | @var{function}]
+Print the specified lines (default 15) from the current source file
+or the file named @var{filename}. The possible arguments to @code{list}
+are as follows:
+
+@c nested table
+@table @asis
+@item @code{-} (Minus)
+Print lines before the lines last printed.
+
+@item @code{+}
+Print lines after the lines last printed.
+@code{list} without any argument does the same thing.
+
+@item @var{n}
+Print lines centered around line number @var{n}.
+
+@item  @var{n}--@var{m}
+Print lines from @var{n} to @var{m}.
+
+@item @var{filename}@code{:}@var{n}
+Print lines centered around line number @var{n} in
+source file @var{filename}. This command may change the current source file.
+
+@item @var{function}
+Print lines centered around the beginning of the
+function @var{function}. This command may change the current source file.
+@end table
+
+@cindex debugger commands, @code{q} (@code{quit})
+@cindex debugger commands, @code{quit}
+@cindex @code{quit} debugger command
+@cindex @code{q} debugger command (alias for @code{quit})
+@cindex exit the debugger
+@item @code{quit}
+@itemx @code{q}
+Exit the debugger.  Debugging is great fun, but sometimes we all have
+to tend to other obligations in life, and sometimes we find the bug
+and are free to go on to the next one!  As we saw earlier, if you are
+running a program, the debugger warns you when you type
+@samp{q} or @samp{quit}, to make sure you really want to quit.
+
+@cindex debugger commands, @code{trace}
+@cindex @code{trace} debugger command
+@item @code{trace} [@code{on} | @code{off}]
+Turn on or off continuous printing of the instructions that are about to
+be executed, along with the @command{awk} lines they
+implement.  The default is @code{off}.
+
+It is to be hoped that most of the ``opcodes'' in these instructions are
+fairly self-explanatory, and using @code{stepi} and @code{nexti} while
+@code{trace} is on will make them into familiar friends.
+
+@end table
+
+@node Readline Support
+@section Readline Support
+@cindex command completion, in debugger
+@cindex debugger, command completion
+@cindex history expansion, in debugger
+@cindex debugger, history expansion
+
+If @command{gawk} is compiled with
+@uref{http://cnswww.cns.cwru.edu/php/chet/readline/readline.html,
+the GNU Readline library}, you can take advantage of that library's
+command completion and history expansion features. The following types
+of completion are available:
+
+@table @asis
+@item Command completion
+Command names.
+
+@item Source @value{FN} completion
+Source @value{FN}s. Relevant commands are
+@code{break},
+@code{clear},
+@code{list},
+@code{tbreak},
+and
+@code{until}.
+
+@item Argument completion
+Non-numeric arguments to a command.
+Relevant commands are @code{enable} and @code{info}.
+
+@item Variable name completion
+Global variable names, and function arguments in the current context
+if the program is running. Relevant commands are
+@code{display},
+@code{print},
+@code{set},
+and
+@code{watch}.
+
+@end table
+
+@node Limitations
+@section Limitations
+
+@cindex debugger, limitations
+We hope you find the @command{gawk} debugger useful and enjoyable to work with,
+but as with any program, especially in its early releases, it still has
+some limitations.  A few that it's worth being aware of are:
+
+@itemize @value{BULLET}
+@item
+At this point, the debugger does not give a detailed explanation of
+what you did wrong when you type in something it doesn't like. Rather, it just
+responds @samp{syntax error}.  When you do figure out what your mistake was,
+though, you'll feel like a real guru.
+
+@item
+@c NOTE: no comma after the ref{} on purpose, due to following
+@c parenthetical remark.
+If you perused the dump of opcodes in @ref{Miscellaneous Debugger Commands}
+(or if you are already familiar with @command{gawk} internals),
+you will realize that much of the internal manipulation of data
+in @command{gawk}, as in many interpreters, is done on a stack.
+@code{Op_push}, @code{Op_pop}, and the like are the ``bread and butter'' of
+most @command{gawk} code.
+
+Unfortunately, as of now, the @command{gawk}
+debugger does not allow you to examine the stack's contents.
+That is, the intermediate results of expression evaluation are on the
+stack, but cannot be printed.  Rather, only variables that are defined
+in the program can be printed.  Of course, a workaround for
+this is to use more explicit variables at the debugging stage and then
+change back to obscure, perhaps more optimal code later.
+
+@item
+There is no way to look ``inside'' the process of compiling
+regular expressions to see if you got it right.  As an @command{awk}
+programmer, you are expected to know the meaning of
+@code{/[^[:alnum:][:blank:]]/}.
+
+@item
+The @command{gawk} debugger is designed to be used by running a program (with all its
+parameters) on the command line, as described in @ref{Debugger Invocation}.
+There is no way (as of now) to attach or ``break into'' a running program.
+This seems reasonable for a language that is used mainly for quickly
+executing, short programs.
+
+@item
+The @command{gawk} debugger only accepts source code supplied with the @option{-f} option.
+If you have a shell script that provides an @command{awk} program as a command
+line parameter, and you need to use the debugger, you can write the script
+to a temporary file, and use that as the program, with the @option{-f} option. This
+might look like this:
+
+@example
+cat << \EOF > /tmp/script.$$
+@dots{}                                  @ii{Your program here}
+EOF
+gawk -D -f /tmp/script.$$
+rm /tmp/script.$$
+@end example
+@end itemize
+
+@ignore
+@c 11/2016: This no longer applies after all the type cleanup work that's been done.
+One other point is worth discussing.  Conventional debuggers run in a
+separate process (and thus address space) from the programs that they
+debug (the @dfn{debuggee}, if you will).
+
+The @command{gawk} debugger is different; it is an integrated part
+of @command{gawk} itself.  This makes it possible, in rare cases,
+for @command{gawk} to become an excellent demonstrator of Heisenberg
+Uncertainty physics, where the mere act of observing something can change
+it. Consider the following:@footnote{Thanks to Hermann Peifer for
+this example.}
+
+@example
+$ @kbd{cat test.awk}
+@print{} @{ print typeof($1), typeof($2) @}
+$ @kbd{cat test.data}
+@print{} abc 123
+$ @kbd{gawk -f test.awk test.data}
+@print{} strnum strnum
+@end example
+
+This is all as expected: field data has the STRNUM attribute
+(@pxref{Variable Typing}).  Now watch what happens when we run
+this program under the debugger:
+
+@example
+$ @kbd{gawk -D -f test.awk test.data}
+gawk> @kbd{w $1}                        @ii{Set watchpoint on} $1
+@print{} Watchpoint 1: $1
+gawk> @kbd{w $2}                        @ii{Set watchpoint on} $2
+@print{} Watchpoint 2: $2
+gawk> @kbd{r}                           @ii{Start the program}
+@print{} Starting program:
+@print{} Stopping in Rule ...
+@print{} Watchpoint 1: $1               @ii{Watchpoint fires}
+@print{}   Old value: ""
+@print{}   New value: "abc"
+@print{} main() at `test.awk':1
+@print{} 1       @{ print typeof($1), typeof($2) @}
+gawk> @kbd{n}                           @ii{Keep going @dots{}}
+@print{} Watchpoint 2: $2               @ii{Watchpoint fires}
+@print{}   Old value: ""
+@print{}   New value: "123"
+@print{} main() at `test.awk':1
+@print{} 1       @{ print typeof($1), typeof($2) @}
+gawk> @kbd{n}                           @ii{Get result from} typeof()
+@print{} strnum number                  @ii{Result for} $2 @ii{isn't right}
+@print{} Program exited normally with exit value: 0
+gawk> @kbd{quit}
+@end example
+
+In this case, the act of comparing the new value of @code{$2}
+with the old one caused @command{gawk} to evaluate it and determine that it
+is indeed a number, and this is reflected in the result of
+@code{typeof()}.
+
+Cases like this where the debugger is not transparent to the program's
+execution should be rare. If you encounter one, please report it
+(@pxref{Bugs}).
+@end ignore
+
+@ignore
+Look forward to a future release when these and other missing features may
+be added, and of course feel free to try to add them yourself!
+@end ignore
+
+@node Debugging Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Programs rarely work correctly the first time.  Finding bugs
+is called debugging, and a program that helps you find bugs is a
+debugger.  @command{gawk} has a built-in debugger that works very
+similarly to the GNU Debugger, GDB.
+
+@item
+Debuggers let you step through your program one statement at a time,
+examine and change variable and array values, and do a number of other
+things that let you understand what your program is actually doing (as
+opposed to what it is supposed to do).
+
+@item
+Like most debuggers, the @command{gawk} debugger works in terms of stack
+frames, and lets you set both breakpoints (stop at a point in the code)
+and watchpoints (stop when a data value changes).
+
+@item
+The debugger command set is fairly complete, providing control over
+breakpoints, execution, viewing and changing data, working with the stack,
+getting information, and other tasks.
+
+@item
+If the GNU Readline library is available when @command{gawk} is
+compiled, it is used by the debugger to provide command-line history
+and editing.
+
+@item
+Usually, the debugger does not not affect the
+program being debugged, but occasionally it can.
+
+@end itemize
+
+@hyphenation{name-space name-spaces Name-space Name-spaces}
+@node Namespaces
+@chapter Namespaces in @command{gawk}
+
+This @value{CHAPTER} describes a feature that is specific to @command{gawk}.
+
+@quotation CAUTION
+This feature described in this chapter is new.  It is entirely
+possible, and even likely, that there are dark corners (if not bugs)
+still lurking within the implementation. If you find any such,
+please report them (@xref{Bugs}).
+@end quotation
+
+@menu
+* Global Namespace::            The global namespace in standard @command{awk}.
+* Qualified Names::             How to qualify names with a namespace.
+* Default Namespace::           The default namespace.
+* Changing The Namespace::      How to change the namespace.
+* Naming Rules::                Namespace and Component Naming Rules.
+* Internal Name Management::    How names are stored internally.
+* Namespace Example::           An example of code using a namespace.
+* Namespace And Features::      Namespaces and other @command{gawk} features.
+* Namespace Summary::           Summarizing namespaces.
+@end menu
+
+@node Global Namespace
+@section Standard @command{awk}'s Single Namespace
+
+@cindex namespace, definition of
+@cindex namespace, standard @command{awk}, global
+In standard @command{awk}, there is a single, global, @dfn{namespace}.
+This means that @emph{all} function names and global variable names must
+be unique. For example, two different @command{awk} source files cannot
+both define a function named @code{min()}, or define the same identifier,
+used as a scalar in one and as an array in the other.
+
+This situation is okay when programs are small, say a few hundred
+lines, or even a few thousand, but it prevents the development of
+reusable libraries of @command{awk} functions, and can inadvertently
+cause independently-developed library files to accidentally step on each
+other's ``private'' global variables
+(@pxref{Library Names}).
+
+@cindex package, definition of
+@cindex module, definition of
+Most other programming languages solve this issue by providing some kind
+of namespace control: a way to say ``this function is in namespace @var{xxx},
+and that function is in namespace @var{yyy}.''  (Of course, there is then
+still a single namespace for the namespaces, but the hope is that there
+are much fewer namespaces in use by any given program, and thus much
+less chance for collisions.)  These facilities are sometimes referred
+to as @dfn{packages} or @dfn{modules}.
+
+Starting with @value{PVERSION} 5.0, @command{gawk} provides a
+simple mechanism to put functions and global variables into separate namespaces.
+
+@node Qualified Names
+@section Qualified Names
+
+@cindex qualified name, definition of
+@cindex namespaces, qualified names
+@cindex @code{::}, namespace separator
+@cindex component name
+A @dfn{qualified name} is an identifier that includes a namespace name,
+the namespace separator @code{::}, and a @dfn{component} name.  For example, one
+might have a function named @code{posix::getpid()}.  Here, the namespace
+is @code{posix} and the function name within the namespace (the component)
+is @code{getpid()}.  The namespace and component names are separated by
+a double-colon.  Only one such separator is allowed in a qualified name.
+
+@quotation NOTE
+Unlike C++, the @code{::} is @emph{not} an operator.  No spaces are
+allowed between the namespace name, the @code{::}, and the component name.
+@end quotation
+
+@cindex qualified name, use of
+You must use qualified names from one namespace to access variables
+and functions in another.  This is especially important when using
+variable names to index the special @code{SYMTAB} array (@pxref{Auto-set}),
+and when making indirect function calls (@pxref{Indirect Calls}).
+
+@node Default Namespace
+@section The Default Namespace
+
+@cindex namespace, default
+@cindex namespace, @code{awk}
+@cindex @code{awk} namespace
+The default namespace, not surprisingly, is @code{awk}.
+All of the predefined @command{awk} and @command{gawk} variables
+are in this namespace, and thus have qualified names like
+@code{awk::ARGC}, @code{awk::NF}, and so on.
+
+@cindex uppercase names, namespace for
+Furthermore, even when you have changed the namespace for your
+current source file (@pxref{Changing The Namespace}), @command{gawk}
+forces unqualified identifiers whose names are all uppercase letters
+to be in the @code{awk} namespace.  This makes it possible for you to easily
+reference @command{gawk}'s global variables from different namespaces.
+It also keeps your code looking natural.
+
+@node Changing The Namespace
+@section Changing The Namespace
+
+@cindex namespaces, changing
+@cindex @code{@@namespace} directive
+In order to set the current namespace, use an @code{@@namespace} directive
+at the top level of your program:
+
+@example
+@@namespace "passwd"
+
+BEGIN @{ @dots{} @}
+@dots{}
+@end example
+
+After this directive, all simple non-completely-uppercase identifiers are
+placed into the @code{passwd} namespace.
+
+You can change the namespace multiple times within a single
+source file, although this is likely to become confusing if you
+do it too much.
+
+@quotation NOTE
+Association of unqualified identifiers to a namespace is handled while
+@command{gawk} parses your program, @emph{before} it starts to run.  There is
+no concept of a ``current'' namespace once your program starts executing.
+Be sure you understand this.
+@end quotation
+
+@cindex namespace, implicit
+@cindex implicit namespace
+Each source file for @option{-i} and @option{-f} starts out with
+an implicit @samp{@@namespace "awk"}.  Similarly, each chunk of
+command-line code supplied with @option{-e} has such an implicit
+initial statement (@pxref{Options}).
+
+@cindex current namespace, pushing and popping
+@cindex namespace, pushing and popping
+Files included with @code{@@include} (@pxref{Include Files}) ``push''
+and ``pop'' the current namespace. That is, each @code{@@include} saves
+the current namespace and starts over with an implicit @samp{@@namespace
+"awk"} which remains in effect until an explicit @code{@@namespace}
+directive is seen.  When @command{gawk} finishes processing the included
+file, the saved namespace is restored and processing continues where it
+left off in the original file.
+
+@cindex @code{@@namespace}, no effect on @code{BEGIN}@comma{} @code{BEGINFILE}@comma{} @code{END}@comma{} and @code{ENDFILE}
+@cindex @code{BEGIN} pattern, execution order not affected by @code{@@namespace}
+@cindex @code{BEGINFILE} pattern, execution order not affected by @code{@@namespace}
+@cindex @code{END} pattern, execution order not affected by @code{@@namespace}
+@cindex @code{ENDFILE} pattern, execution order not affected by @code{@@namespace}
+The use of @code{@@namespace} has no influence upon the order of execution
+of @code{BEGIN}, @code{BEGINFILE}, @code{END}, and @code{ENDFILE} rules.
+
+@node Naming Rules
+@section Namespace and Component Naming Rules
+
+@cindex naming rules, namespaces and component names
+@cindex namespace names, naming rules
+@cindex component names, naming rules
+A number of rules apply to the namespace and component names, as follows.
+
+@itemize @bullet
+@item
+It is a syntax error to use qualified names for function parameter names.
+
+@item
+It is a syntax error to use any standard @command{awk} reserved word (such
+as @code{if} or @code{for}), or the name of any standard built-in function
+(such as @code{sin()} or @code{gsub()}) as either part of a qualified name.
+Thus, the following produces a syntax error:
+
+@example
+@@namespace "example"
+
+function gsub(str, pat, result) @{ @dots{} @}
+@end example
+
+@item
+Outside the @code{awk} namespace, the names of the additional @command{gawk}
+built-in functions (such as @code{gensub()} or @code{strftime()}) @emph{may}
+be used as component names.  The same set of names may be used as namespace
+names, although this has the potential to be confusing.
+
+@item
+The additional @command{gawk} built-in functions may still be called
+from outside the @code{awk} namespace by qualifying them. For example,
+@code{awk::systime()}.  Here is a somewhat silly example demonstrating
+this rule and the previous one:
+
+@example
+BEGIN @{
+    print "in awk namespace, systime() =", systime()
+@}
+
+@@namespace "testing"
+
+function systime()
+@{
+    print "in testing namespace, systime() =", awk::systime()
+@}
+
+BEGIN @{
+    systime()
+@}
+@end example
+
+@noindent
+
+When run, it produces output like this:
+
+@example
+$ @kbd{gawk -f systime.awk}
+@print{} in awk namespace, systime() = 1500488503
+@print{} in testing namespace, systime() = 1500488503
+@end example
+
+@item
+@command{gawk} pre-defined variable names may be used:
+@code{NF::NR} is valid, if possibly not all that useful.
+@end itemize
+
+@node Internal Name Management
+@section Internal Name Management
+
+@cindex name management
+@cindex @code{awk} namespace, identifier name storage
+@cindex @code{awk} namespace, use for indirect function calls
+For backwards compatibility, all identifiers in the @code{awk} namespace
+are stored internally as unadorned identifiers (that is, without a
+leading @samp{awk::}).  This is mainly relevant
+when using such identifiers as indices for @code{SYMTAB}, @code{FUNCTAB},
+and @code{PROCINFO["identifiers"]} (@pxref{Auto-set}), and for use in
+indirect function calls (@pxref{Indirect Calls}).
+
+In program code, to refer to variables and functions in the @code{awk}
+namespace from another namespace, you must still use the @samp{awk::}
+prefix. For example:
+
+@example
+@@namespace "awk"          @ii{This is the default namespace}
+
+BEGIN @{
+    Title = "My Report"   @ii{Qualified name is} awk::Title
+@}
+
+@@namespace "report"       @ii{Now in} report @ii{namespace}
+
+function compute()        @ii{This is really} report::compute()
+@{
+    print awk::Title      @ii{But would be} SYMTAB["Title"]
+    @dots{}
+@}
+@end example
+
+@node Namespace Example
+@section Namespace Example
+
+@cindex namespace, example code
+The following example is a revised version of the suite of routines
+developed in @ref{Passwd Functions}. See there for an explanation
+of how the code works.
+
+The formulation here, due mainly to Andrew Schorr, is rather elegant.
+All of the implementation functions and variables are in the
+@code{passwd} namespace, whereas the main interface functions are
+defined in the @code{awk} namespace.
+
+@example
+@c file eg/lib/ns_passwd.awk
+# ns_passwd.awk --- access password file information
+@c endfile
+@ignore
+@c file eg/lib/ns_passwd.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+#
+# Reworked for namespaces June 2017, with help from
+# Andrew J.@: Schorr, aschorr@@telemetry-investments.com
+@c endfile
+@end ignore
+@c file eg/lib/ns_passwd.awk
+
+@@namespace "passwd"
+
+BEGIN @{
+    # tailor this to suit your system
+    Awklib = "/usr/local/libexec/awk/"
+@}
+
+function Init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+@{
+    if (Inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    pwcat = Awklib "pwcat"
+    while ((pwcat | getline) > 0) @{
+        Byname[$1] = $0
+        Byuid[$3] = $0
+        Bycount[++Total] = $0
+    @}
+    close(pwcat)
+    Count = 0
+    Inited = 1
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+@}
+
+function awk::getpwnam(name)
+@{
+    Init()
+    return Byname[name]
+@}
+
+function awk::getpwuid(uid)
+@{
+    Init()
+    return Byuid[uid]
+@}
+
+function awk::getpwent()
+@{
+    Init()
+    if (Count < Total)
+        return Bycount[++Count]
+    return ""
+@}
+
+function awk::endpwent()
+@{
+    Count = 0
+@}
+@c endfile
+@end example
+
+As you can see, this version also follows the convention mentioned in
+@ref{Library Names}, whereby global variable and function names
+start with a capital letter.
+
+Here is a simple test program. Since it's in a separate file, unadorned
+identifiers are sought for in the @code{awk} namespace:
+
+@example
+BEGIN @{
+    while ((p = getpwent()) != "")
+        print p
+@}
+@end example
+
+@noindent
+
+Here's what happens when it's run:
+
+@example
+$ @kbd{gawk -f ns_passwd.awk -f testpasswd.awk}
+@print{} root:x:0:0:root:/root:/bin/bash
+@print{} daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
+@print{} bin:x:2:2:bin:/bin:/usr/sbin/nologin
+@print{} sys:x:3:3:sys:/dev:/usr/sbin/nologin
+@dots{}
+@end example
+
+@node Namespace And Features
+@section Namespaces and Other @command{gawk} Features
+
+This @value{SECTION} looks briefly at how the namespace facility interacts
+with other important @command{gawk} features.
+
+@cindex namespaces, interaction with profiler
+@cindex namespaces, interaction with pretty printer
+@cindex profiler, interaction with namespaces
+@cindex pretty printer, interaction with namespaces
+The profiler and pretty-printer (@pxref{Profiling}) have been enhanced
+to understand namespaces and the namespace naming rules presented in
+@ref{Naming Rules}.  In particular, the output groups functions in the same
+namespace together, and has @code{@@namespace} directives in front
+of rules as necessary. This allows component names to be
+simple identifiers, instead of using qualified identifiers everywhere.
+
+@cindex namespaces, interaction with debugger
+@cindex debugger, interaction with namespaces
+Interaction with the debugger (@pxref{Debugging}) has not had to change
+(at least as of this writing).  Some of the internal byte codes changed
+in order to accommodate namespaces, and the debugger's @code{dump} command
+was adjusted to match.
+
+@cindex namespaces, interaction with extension API
+@cindex extension API interaction with namespaces
+The extension API (@pxref{Dynamic Extensions}) has always allowed for
+placing functions into a different namespace, although this was not
+previously implemented.  However, the symbol lookup and symbol update
+routines did not have provision for including a namespace. That has now
+been corrected (@pxref{Symbol table by name}).
+@xref{Extension Sample Inplace}, for a nice example of an extension that
+leverages a namespace shared by cooperating @command{awk} and C code.
+
+@node Namespace Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Standard @command{awk} provides a single namespace for all global
+identifiers (scalars, arrays, and functions).  This is limiting when
+one wants to develop libraries of reusable functions or function suites.
+
+@item
+@command{gawk} provides multiple namespaces by using qualified names:
+names consisting of a namespace name, a double colon, @code{::}, and a
+component name.  Namespace names might still possibly conflict, but this
+is true of any language providing namespaces, modules, or packages.
+
+@item
+The default namespace is @command{awk}. The rules for namespace and
+component names are provided in @ref{Naming Rules}. The rules are
+designed in such a way as to make namespace-aware code continue to
+look and work naturally while still providing the necessary power and
+flexibility.
+
+@item
+Other parts of @command{gawk} have been extended as necessary to integrate
+namespaces smoothly with their operation.  This applies most notably to
+the profiler / pretty-printer (@pxref{Profiling}) and to the extension
+facility (@pxref{Dynamic Extensions}).
+
+@cindex namespaces, backwards compatibility
+@item
+Overall, the namespace facility was designed and implemented such that
+backwards compatibility is paramount. Programs that don't use namespaces
+should see absolutely no difference in behavior when run by a namespace-capable
+version of @command{gawk}.
+@end itemize
+
+@node Arbitrary Precision Arithmetic
+@chapter Arithmetic and Arbitrary-Precision Arithmetic with @command{gawk}
+@cindex arbitrary precision
+@cindex multiple precision
+@cindex infinite precision
+@cindex floating-point, numbers@comma{} arbitrary-precision
+
+This @value{CHAPTER} introduces some basic concepts relating to
+how computers do arithmetic and defines some important terms.
+It then proceeds to describe floating-point arithmetic,
+which is what @command{awk} uses for all its computations, including a
+discussion of arbitrary-precision floating-point arithmetic, which is
+a feature available only in @command{gawk}. It continues on to present
+arbitrary-precision integers, and concludes with a description of some
+points where @command{gawk} and the POSIX standard are not quite in
+agreement.
+
+@quotation NOTE
+Most users of @command{gawk} can safely skip this chapter.
+But if you want to do scientific calculations with @command{gawk},
+this is the place to be.
+@end quotation
+
+@menu
+* Computer Arithmetic::           A quick intro to computer math.
+* Math Definitions::              Defining terms used.
+* MPFR features::                 The MPFR features in @command{gawk}.
+* FP Math Caution::               Things to know.
+* Arbitrary Precision Integers::  Arbitrary Precision Integer Arithmetic with
+                                  @command{gawk}.
+* Checking for MPFR::             How to check if MPFR is available.
+* POSIX Floating Point Problems:: Standards Versus Existing Practice.
+* Floating point summary::        Summary of floating point discussion.
+@end menu
+
+@node Computer Arithmetic
+@section A General Description of Computer Arithmetic
+
+Until now, we have worked with data as either numbers or
+strings.  Ultimately, however, computers represent everything in terms
+of @dfn{binary digits}, or @dfn{bits}.  A decimal digit can take on any
+of 10 values: zero through nine.  A binary digit can take on any of two
+values, zero or one.  Using binary, computers (and computer software)
+can represent and manipulate numerical and character data.  In general,
+the more bits you can use to represent a particular thing, the greater
+the range of possible values it can take on.
+
+Modern computers support at least two, and often more, ways to do
+arithmetic.  Each kind of arithmetic uses a different representation
+(organization of the bits) for the numbers.  The kinds of arithmetic
+that interest us are:
+
+@table @asis
+@item Decimal arithmetic
+This is the kind of arithmetic you learned in elementary school, using
+paper and pencil (and/or a calculator). In theory, numbers can have an
+arbitrary number of digits on either side (or both sides) of the decimal
+point, and the results of a computation are always exact.
+
+Some modern systems can do decimal arithmetic in hardware, but usually you
+need a special software library to provide access to these instructions.
+There are also libraries that do decimal arithmetic entirely in software.
+
+Despite the fact that some users expect @command{gawk} to be performing
+decimal arithmetic,@footnote{We don't know why they expect this, but
+they do.} it does not do so.
+
+@item Integer arithmetic
+In school, integer values were referred to as ``whole'' numbers---that
+is, numbers without any fractional part, such as 1, 42, or @minus{}17.
+The advantage to integer numbers is that they represent values exactly.
+The disadvantage is that their range is limited.
+
+@cindex unsigned integers
+@cindex integers, unsigned
+In computers, integer values come in two flavors: @dfn{signed} and
+@dfn{unsigned}.  Signed values may be negative or positive, whereas
+unsigned values are always greater than or equal
+to zero.
+
+In computer systems, integer arithmetic is exact, but the possible
+range of values is limited.  Integer arithmetic is generally faster than
+floating-point arithmetic.
+
+@cindex 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).
+The advantage to floating-point numbers is that they can represent a
+much larger range of values than can integers.  The disadvantage is that
+there are numbers that they cannot represent exactly.
+
+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.
+
+@cindex floating-point, numbers@comma{} single-precision
+@cindex floating-point, numbers@comma{} double-precision
+@cindex floating-point, numbers@comma{} arbitrary-precision
+@cindex single-precision
+@cindex double-precision
+@cindex 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
+floating-point arithmetic, which we describe in more detail shortly.
+@end table
+
+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.
+(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
+@caption{Value ranges for integer representations}
+@multitable @columnfractions .34 .33 .33
+@headitem 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
+@end multitable
+@end float
+
+@float Table,table-floating-point-ranges
+@caption{Approximate value ranges for floating-point number representations}
+@multitable @columnfractions .38 .22 .22 .23
+@iftex
+@headitem Representation @tab @w{Minimum positive} @w{nonzero value} @tab Minimum @w{finite value} @tab Maximum @w{finite value}
+@end iftex
+@ifnottex
+@headitem Representation @tab Minimum positive nonzero value @tab Minimum finite value @tab Maximum finite value
+@end ifnottex
+@iftex
+@item @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}}
+@item @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}}
+@item @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
+@item Single-precision floating-point @tab 1.175494e-38 @tab -3.402823e+38 @tab 3.402823e+38
+@item Double-precision floating-point @tab 2.225074e-308 @tab -1.797693e+308 @tab 1.797693e+308
+@item Quadruple-precision floating-point @tab 3.362103e-4932 @tab -1.189731e+4932 @tab 1.189731e+4932
+@end ifinfo
+@ifnottex
+@ifnotinfo
+@item Single-precision floating-point @tab 1.175494*10@sup{-38} @tab -3.402823*10@sup{38} @tab 3.402823*10@sup{38}
+@item Double-precision floating-point @tab 2.225074*10@sup{-308} @tab -1.797693*10@sup{308} @tab 1.797693*10@sup{308}
+@item Quadruple-precision floating-point @tab 3.362103*10@sup{-4932} @tab -1.189731*10@sup{4932} @tab 1.189731*10@sup{4932}
+@end ifnotinfo
+@end ifnottex
+@end multitable
+@end float
+
+@node Math Definitions
+@section Other Stuff to Know
+
+The rest of this @value{CHAPTER} uses a number of terms. Here are some
+informal definitions that should help you work your way through the material
+here:
+
+@table @dfn
+@item Accuracy
+A floating-point calculation's accuracy is how close it comes
+to the real (paper and pencil) value.
+
+@item Error
+The difference between what the result of a computation ``should be''
+and what it actually is.  It is best to minimize error as much
+as possible.
+
+@item Exponent
+The order of magnitude of a value;
+some number of bits in a floating-point value store the exponent.
+
+@item Inf
+A special value representing infinity. Operations involving another
+number and infinity produce infinity.
+
+@item NaN
+``Not a number.''@footnote{Thanks to Michael Brennan for this description,
+which we have paraphrased, and for the examples.} A special value that
+results from attempting a calculation that has no answer as a real number.
+In such a case, programs can either receive a floating-point exception,
+or get @code{NaN} back as the result. The IEEE 754 standard recommends
+that systems return @code{NaN}. Some examples:
+
+@table @code
+@item sqrt(-1)
+This makes sense in the range of complex numbers, but not in the
+range of real numbers, so the result is @code{NaN}.
+
+@item log(-8)
+@minus{}8 is out of the domain of @code{log()}, so the result is @code{NaN}.
+@end table
+
+@item Normalized
+How the significand (see later in this list) is usually stored. The
+value is adjusted so that the first bit is one, and then that leading
+one is assumed instead of physically stored.  This provides one
+extra bit of precision.
+
+@item Precision
+The number of bits used to represent a floating-point number.
+The more bits, the more digits you can represent.
+Binary and decimal precisions are related approximately, according to the
+formula:
+
+@display
+@iftex
+@math{prec = 3.322 @cdot dps}
+@end iftex
+@ifnottex
+@ifnotdocbook
+@var{prec} = 3.322 * @var{dps}
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>
+@end docbook
+@end display
+
+@noindent
+Here, @emph{prec} denotes the binary precision
+(measured in bits) and @emph{dps} (short for decimal places)
+is the decimal digits.
+
+@item Rounding mode
+How numbers are rounded up or down when necessary.
+More details are provided later.
+
+@item Significand
+A floating-point value consists of the significand multiplied by 10
+to the power of the exponent. For example, in @code{1.2345e67},
+the significand is @code{1.2345}.
+
+@item Stability
+From @uref{https://en.wikipedia.org/wiki/Numerical_stability,
+the Wikipedia article on numerical stability}:
+``Calculations that can be proven not to magnify approximation errors
+are called @dfn{numerically stable}.''
+@end table
+
+See @uref{https://en.wikipedia.org/wiki/Accuracy_and_precision,
+the Wikipedia article on accuracy and precision} for more information
+on some of those terms.
+
+On modern systems, floating-point hardware uses the representation and
+operations defined by the IEEE 754 standard.
+Three of the standard IEEE 754 types are 32-bit single precision,
+64-bit double precision, and 128-bit quadruple precision.
+The standard also specifies extended precision formats
+to allow greater precisions and larger exponent ranges.
+(@command{awk} uses only the 64-bit double-precision format.)
+
+@ref{table-ieee-formats} lists the precision and exponent
+field values for the basic IEEE 754 binary formats.
+
+@float Table,table-ieee-formats
+@caption{Basic IEEE format values}
+@multitable @columnfractions .20 .20 .20 .20 .20
+@headitem Name @tab Total bits @tab Precision @tab Minimum exponent @tab Maximum exponent
+@item Single @tab 32 @tab 24 @tab @minus{}126 @tab +127
+@item Double @tab 64 @tab 53 @tab @minus{}1022 @tab +1023
+@item Quadruple @tab 128 @tab 113 @tab @minus{}16382 @tab +16383
+@end multitable
+@end float
+
+@quotation NOTE
+The precision numbers include the implied leading one that gives them
+one extra bit of significand.
+@end quotation
+
+@node MPFR features
+@section Arbitrary-Precision Arithmetic Features in @command{gawk}
+
+By default, @command{gawk} uses the double-precision floating-point values
+supplied by the hardware of the system it runs on.  However, if it was
+compiled to do so, and the @option{-M} command-line option is supplied,
+@command{gawk} uses the @uref{http://www.mpfr.org,
+GNU MPFR} and @uref{https://gmplib.org, GNU MP} (GMP) libraries for
+arbitrary-precision arithmetic on numbers.  You can see if MPFR support
+is available like so:
+
+@example
+$ @kbd{gawk --version}
+@print{} GNU Awk 4.1.2, API: 1.1 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2)
+@print{} Copyright (C) 1989, 1991-2015 Free Software Foundation.
+@dots{}
+@end example
+
+@noindent
+(You may see different version numbers than what's shown here. That's OK;
+what's important is to see that GNU MPFR and GNU MP are listed in
+the output.)
+
+Additionally, there are a few elements available in the @code{PROCINFO}
+array to provide information about the MPFR and GMP libraries
+(@pxref{Auto-set}).
+
+The MPFR library provides precise control over precisions and rounding
+modes, and gives correctly rounded, reproducible, platform-independent
+results.  With the @option{-M} command-line option,
+all floating-point arithmetic operators and numeric functions
+can yield results to any desired precision level supported by MPFR.
+
+Two predefined variables, @code{PREC} and @code{ROUNDMODE},
+provide control over the working precision and the rounding mode.
+The precision and the rounding mode are set globally for every operation
+to follow.
+@xref{Setting precision} and @ref{Setting the rounding mode}
+for more information.
+
+@node FP Math Caution
+@section Floating-Point Arithmetic: Caveat Emptor!
+
+@quotation
+@i{Math class is tough!}
+@author Teen Talk Barbie, July 1992
+@end quotation
+
+This @value{SECTION} provides a high-level overview of the issues
+involved when doing lots of floating-point arithmetic.@footnote{There
+is a very nice @uref{http://www.validlab.com/goldberg/paper.pdf,
+paper on floating-point arithmetic} by David Goldberg, ``What Every
+Computer Scientist Should Know About Floating-Point Arithmetic,''
+@cite{ACM Computing Surveys} @strong{23}, 1 (1991-03): 5-48.  This is
+worth reading if you are interested in the details, but it does require
+a background in computer science.}
+The discussion applies to both hardware and arbitrary-precision
+floating-point arithmetic.
+
+@quotation CAUTION
+The material here is purposely general. If you need to do serious
+computer arithmetic, you should do some research first, and not
+rely just on what we tell you.
+@end quotation
+
+@menu
+* Inexactness of computations:: Floating point math is not exact.
+* Getting Accuracy::            Getting more accuracy takes some work.
+* Try To Round::                Add digits and round.
+* Setting precision::           How to set the precision.
+* Setting the rounding mode::   How to set the rounding mode.
+@end menu
+
+@node Inexactness of computations
+@subsection Floating-Point Arithmetic Is Not Exact
+
+Binary floating-point representations and arithmetic are inexact.
+Simple values like 0.1 cannot be precisely represented using
+binary floating-point numbers, and the limited precision of
+floating-point numbers means that slight changes in
+the order of operations or the precision of intermediate storage
+can change the result. To make matters worse, with arbitrary-precision
+floating-point arithmetic, you can set the precision before starting a
+computation, but then you cannot be sure of the number of significant
+decimal places in the final result.
+
+@menu
+* Inexact representation::      Numbers are not exactly represented.
+* Comparing FP Values::         How to compare floating point values.
+* Errors accumulate::           Errors get bigger as they go.
+@end menu
+
+@node Inexact representation
+@subsubsection Many Numbers Cannot Be Represented Exactly
+
+So, before you start to write any code, you should think
+about what you really want and what's really happening. Consider the
+two numbers in the following example:
+
+@example
+x = 0.875             # 1/2 + 1/4 + 1/8
+y = 0.425
+@end example
+
+Unlike the number in @code{y}, the number stored in @code{x}
+is exactly representable
+in binary because it can be written as a finite sum of one or
+more fractions whose denominators are all powers of two.
+When @command{gawk} reads a floating-point number from
+program source, it automatically rounds that number to whatever
+precision your machine supports. If you try to print the numeric
+content of a variable using an output format string of @code{"%.17g"},
+it may not produce the same number as you assigned to it:
+
+@example
+$ @kbd{gawk 'BEGIN @{ x = 0.875; y = 0.425}
+> @kbd{              printf("%0.17g, %0.17g\n", x, y) @}'}
+@print{} 0.875, 0.42499999999999999
+@end example
+
+Often the error is so small you do not even notice it, and if you do,
+you can always specify how much precision you would like in your output.
+Usually this is a format string like @code{"%.15g"}, which, when
+used in the previous example, produces an output identical to the input.
+
+@node Comparing FP Values
+@subsubsection Be Careful Comparing Values
+
+Because the underlying representation can be a little bit off from the exact value,
+comparing floating-point values to see if they are exactly equal is generally a bad idea.
+Here is an example where it does not work like you would expect:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
+@print{} 0
+@end example
+
+The general wisdom when comparing floating-point values is to see if
+they are within some small range of each other (called a @dfn{delta},
+or @dfn{tolerance}).
+You have to decide how small a delta is important to you. Code to do
+this looks something like the following:
+
+@example
+@group
+delta = 0.00001                 # for example
+difference = abs(a - b)         # subtract the two values
+if (difference < delta)
+    # all ok
+else
+    # not ok
+@end group
+@end example
+
+@noindent
+(We assume that you have a simple absolute value function named
+@code{abs()} defined elsewhere in your program.)  If you write a
+function to compare values with a delta, you should be sure
+to use @samp{difference < abs(delta)} in case someone passes
+in a negative delta value.
+
+@node Errors accumulate
+@subsubsection Errors Accumulate
+
+The loss of accuracy during a single computation with floating-point
+numbers usually isn't enough to worry about. However, if you compute a
+value that is the result of a sequence of floating-point operations,
+the error can accumulate and greatly affect the computation itself.
+Here is an attempt to compute the value of @value{PI} using one of its
+many series representations:
+
+@example
+BEGIN @{
+    x = 1.0 / sqrt(3.0)
+    n = 6
+    for (i = 1; i < 30; i++) @{
+        n = n * 2.0
+        x = (sqrt(x * x + 1) - 1) / x
+        printf("%.15f\n", n * x)
+    @}
+@}
+@end example
+
+When run, the early errors propagate through later computations,
+causing the loop to terminate prematurely after attempting to divide by zero:
+
+@example
+$ @kbd{gawk -f pi.awk}
+@print{} 3.215390309173475
+@print{} 3.159659942097510
+@print{} 3.146086215131467
+@print{} 3.142714599645573
+@dots{}
+@print{} 3.224515243534819
+@print{} 2.791117213058638
+@print{} 0.000000000000000
+@error{} gawk: pi.awk:6: fatal: division by zero attempted
+@end example
+
+Here is an additional example where the inaccuracies in internal representations
+yield an unexpected result:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>   @kbd{for (d = 1.1; d <= 1.5; d += 0.1)    # loop five times (?)}
+>       @kbd{i++}
+>   @kbd{print i}
+> @kbd{@}'}
+@print{} 4
+@end example
+
+@node Getting Accuracy
+@subsection Getting the Accuracy You Need
+
+Can arbitrary-precision arithmetic give exact results? There are
+no easy answers. The standard rules of algebra often do not apply
+when using floating-point arithmetic.
+Among other things, the distributive and associative laws
+do not hold completely, and order of operation may be important
+for your computation. Rounding error, cumulative precision loss,
+and underflow are often troublesome.
+
+When @command{gawk} tests the expressions @samp{0.1 + 12.2} and
+@samp{12.3} for equality using the machine double-precision arithmetic,
+it decides that they are not equal!  (@xref{Comparing FP Values}.)
+You can get the result you want by increasing the precision; 56 bits in
+this case does the job:
+
+@example
+$ @kbd{gawk -M -v PREC=56 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
+@print{} 1
+@end example
+
+If adding more bits is good, perhaps adding even more bits of
+precision is better?
+Here is what happens if we use an even larger value of @code{PREC}:
+
+@example
+$ @kbd{gawk -M -v PREC=201 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
+@print{} 0
+@end example
+
+This is not a bug in @command{gawk} or in the MPFR library.
+It is easy to forget that the finite number of bits used to store the value
+is often just an approximation after proper rounding.
+The test for equality succeeds if and only if @emph{all} bits in the two operands
+are exactly the same. Because this is not necessarily true after floating-point
+computations with a particular precision and effective rounding mode,
+a straight test for equality may not work. Instead, compare the
+two numbers to see if they are within the desirable delta of each other.
+
+In applications where 15 or fewer decimal places suffice,
+hardware double-precision arithmetic can be adequate, and is usually much faster.
+But you need to keep in mind that every floating-point operation
+can suffer a new rounding error with catastrophic consequences, as illustrated
+by our earlier attempt to compute the value of @value{PI}.
+Extra precision can greatly enhance the stability and the accuracy
+of your computation in such cases.
+
+Additionally, you should understand that
+repeated addition is not necessarily equivalent to multiplication
+in floating-point arithmetic. In the example in
+@ref{Errors accumulate}:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>   @kbd{for (d = 1.1; d <= 1.5; d += 0.1)    # loop five times (?)}
+>       @kbd{i++}
+>   @kbd{print i}
+> @kbd{@}'}
+@print{} 4
+@end example
+
+@noindent
+you may or may not succeed in getting the correct result by choosing
+an arbitrarily large value for @code{PREC}. Reformulation of
+the problem at hand is often the correct approach in such situations.
+
+@node Try To Round
+@subsection Try a Few Extra Bits of Precision and Rounding
+
+Instead of arbitrary-precision floating-point arithmetic,
+often all you need is an adjustment of your logic
+or a different order for the operations in your calculation.
+The stability and the accuracy of the computation of @value{PI}
+in the earlier example can be enhanced by using the following
+simple algebraic transformation:
+
+@example
+(sqrt(x * x + 1) - 1) / x @equiv{} x / (sqrt(x * x + 1) + 1)
+@end example
+
+@noindent
+After making this change, the program converges to
+@value{PI} in under 30 iterations:
+
+@example
+$ @kbd{gawk -f pi2.awk}
+@print{} 3.215390309173473
+@print{} 3.159659942097501
+@print{} 3.146086215131436
+@print{} 3.142714599645370
+@print{} 3.141873049979825
+@dots{}
+@print{} 3.141592653589797
+@print{} 3.141592653589797
+@end example
+
+@node Setting precision
+@subsection Setting the Precision
+
+@command{gawk} uses a global working precision; it does not keep track of
+the precision or accuracy of individual numbers. Performing an arithmetic
+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 @code{PREC}. You can also set the
+value to one of the predefined case-insensitive strings
+shown in @ref{table-predefined-precision-strings},
+to emulate an IEEE 754 binary format.
+
+@float Table,table-predefined-precision-strings
+@caption{Predefined precision strings for @code{PREC}}
+@multitable {@code{"double"}} {12345678901234567890123456789012345}
+@headitem @code{PREC} @tab IEEE 754 binary format
+@item @code{"half"} @tab 16-bit half-precision
+@item @code{"single"} @tab Basic 32-bit single precision
+@item @code{"double"} @tab Basic 64-bit double precision
+@item @code{"quad"} @tab Basic 128-bit quadruple precision
+@item @code{"oct"} @tab 256-bit octuple precision
+@end multitable
+@end float
+
+The following example illustrates the effects of changing precision
+on arithmetic operations:
+
+@example
+$ @kbd{gawk -M -v PREC=100 'BEGIN @{ x = 1.0e-400; print x + 0}
+>   @kbd{PREC = "double"; print x + 0 @}'}
+@print{} 1e-400
+@print{} 0
+@end example
+
+@quotation CAUTION
+Be wary of floating-point constants! When reading a floating-point
+constant from program source code, @command{gawk} uses the default
+precision (that of a C @code{double}), unless overridden by an assignment
+to the special variable @code{PREC} on the command line, to store it
+internally as an MPFR number.  Changing the precision using @code{PREC}
+in the program text does @emph{not} change the precision of a constant.
+
+If you need to represent a floating-point constant at a higher precision
+than the default and cannot use a command-line assignment to @code{PREC},
+you should either specify the constant as a string, or as a rational
+number, whenever possible. The following example illustrates the
+differences among various ways to print a floating-point constant:
+
+@example
+$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 0.1) @}'}
+@print{} 0.1000000000000000055511151
+$ @kbd{gawk -M -v PREC=113 'BEGIN @{ printf("%0.25f\n", 0.1) @}'}
+@print{} 0.1000000000000000000000000
+$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", "0.1") @}'}
+@print{} 0.1000000000000000000000000
+$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 1/10) @}'}
+@print{} 0.1000000000000000000000000
+@end example
+@end quotation
+
+@node Setting the rounding mode
+@subsection Setting the Rounding Mode
+
+@cindex @code{ROUNDMODE} variable
+The @code{ROUNDMODE} variable provides
+program-level control over the rounding mode.
+The correspondence between @code{ROUNDMODE} and the IEEE
+rounding modes is shown in @ref{table-gawk-rounding-modes}.
+
+@float Table,table-gawk-rounding-modes
+@caption{@command{gawk} rounding modes}
+@multitable @columnfractions .45 .30 .25
+@headitem Rounding mode @tab IEEE name @tab @code{ROUNDMODE}
+@item Round to nearest, ties to even @tab @code{roundTiesToEven} @tab @code{"N"} or @code{"n"}
+@item Round toward positive infinity @tab @code{roundTowardPositive} @tab @code{"U"} or @code{"u"}
+@item Round toward negative infinity @tab @code{roundTowardNegative} @tab @code{"D"} or @code{"d"}
+@item Round toward zero @tab @code{roundTowardZero} @tab @code{"Z"} or @code{"z"}
+@item Round away from zero @tab @tab @code{"A"} or @code{"a"}
+@end multitable
+@end float
+
+@code{ROUNDMODE} has the default value @code{"N"}, which
+selects the IEEE 754 rounding mode @code{roundTiesToEven}.
+In @ref{table-gawk-rounding-modes}, the value @code{"A"} selects
+rounding away from zero. This is only available if your version of the
+MPFR library supports it; otherwise, setting @code{ROUNDMODE} to @code{"A"}
+has no effect.
+
+The default mode @code{roundTiesToEven} is the most preferred,
+but the least intuitive. This method does the obvious thing for most values,
+by rounding them up or down to the nearest digit.
+For example, rounding 1.132 to two digits yields 1.13,
+and rounding 1.157 yields 1.16.
+
+However, when it comes to rounding a value that is exactly halfway between,
+things do not work the way you probably learned in school.
+In this case, the number is rounded to the nearest even digit.
+So rounding 0.125 to two digits rounds down to 0.12,
+but rounding 0.6875 to three digits rounds up to 0.688.
+You probably have already encountered this rounding mode when
+using @code{printf} to format floating-point numbers.
+For example:
+
+@example
+BEGIN @{
+    x = -4.5
+    for (i = 1; i < 10; i++) @{
+        x += 1.0
+        printf("%4.1f => %2.0f\n", x, x)
+    @}
+@}
+@end example
+
+@noindent
+produces the following output when run on the author's system:@footnote{It
+is possible for the output to be completely different if the
+C library in your system does not use the IEEE 754 even-rounding
+rule to round halfway cases for @code{printf}.}
+
+@example
+-3.5 => -4
+-2.5 => -2
+-1.5 => -2
+-0.5 => 0
+ 0.5 => 0
+ 1.5 => 2
+ 2.5 => 2
+ 3.5 => 4
+ 4.5 => 4
+@end example
+
+The theory behind @code{roundTiesToEven} is that it more or less evenly
+distributes upward and downward rounds of exact halves, which might
+cause any accumulating round-off error to cancel itself out. This is the
+default rounding mode for IEEE 754 computing functions and operators.
+
+@c January 2018. Thanks to nethox@gmail.com for the example.
+@cindex sidebar, Rounding Modes and Conversion
+@ifdocbook
+@docbook
+<sidebar><title>Rounding Modes and Conversion</title>
+@end docbook
+
+It's important to understand that, along with @code{CONVFMT} and
+@code{OFMT}, the rounding mode affects how numbers are converted to strings.
+For example, consider the following program:
+
+@example
+BEGIN @{
+    pi = 3.1416
+    OFMT = "%.f"        # Print value as integer
+    print pi            # ROUNDMODE = "N" by default.
+    ROUNDMODE = "U"     # Now change ROUNDMODE
+    print pi
+@}
+@end example
+
+@noindent
+Running this program produces this output:
+
+@example
+$ @kbd{gawk -M -f roundmode.awk}
+@print{} 3
+@print{} 4
+@end example
+
+@docbook
+</sidebar>
+@end docbook
+@end ifdocbook
+
+@ifnotdocbook
+@cartouche
+@center @b{Rounding Modes and Conversion}
+
+
+It's important to understand that, along with @code{CONVFMT} and
+@code{OFMT}, the rounding mode affects how numbers are converted to strings.
+For example, consider the following program:
+
+@example
+BEGIN @{
+    pi = 3.1416
+    OFMT = "%.f"        # Print value as integer
+    print pi            # ROUNDMODE = "N" by default.
+    ROUNDMODE = "U"     # Now change ROUNDMODE
+    print pi
+@}
+@end example
+
+@noindent
+Running this program produces this output:
+
+@example
+$ @kbd{gawk -M -f roundmode.awk}
+@print{} 3
+@print{} 4
+@end example
+@end cartouche
+@end ifnotdocbook
+
+The other rounding modes are rarely used.  Rounding toward positive infinity
+(@code{roundTowardPositive}) and toward negative infinity
+(@code{roundTowardNegative}) are often used to implement interval
+arithmetic, where you adjust the rounding mode to calculate upper and
+lower bounds for the range of output. The @code{roundTowardZero} mode can
+be used for converting floating-point numbers to integers.  When rounding
+away from zero, the nearest number with magnitude greater than or equal to
+the value is selected.
+
+Some numerical analysts will tell you that your choice of rounding
+style has tremendous impact on the final outcome, and advise you to
+wait until final output for any rounding. Instead, you can often avoid
+round-off error problems by setting the precision initially to some
+value sufficiently larger than the final desired precision, so that
+the accumulation of round-off error does not influence the outcome.
+If you suspect that results from your computation are sensitive to
+accumulation of round-off error, look for a significant difference in
+output when you change the rounding mode to be sure.
+
+@node Arbitrary Precision Integers
+@section Arbitrary-Precision Integer Arithmetic with @command{gawk}
+@cindex integers, arbitrary precision
+@cindex arbitrary precision integers
+
+When given the @option{-M} option,
+@command{gawk} performs all integer arithmetic using GMP arbitrary-precision
+integers.  Any number that looks like an integer in a source
+or @value{DF} is stored as an arbitrary-precision integer.  The size
+of the integer is limited only by the available memory.  For example,
+the following computes
+@iftex
+@math{5^{4^{3^{2}}}},
+@end iftex
+@ifinfo
+5^4^3^2,
+@end ifinfo
+@ifnottex
+@ifnotinfo
+5@sup{4@sup{3@sup{2}}},
+@end ifnotinfo
+@end ifnottex
+the result of which is beyond the
+limits of ordinary hardware double-precision floating-point values:
+
+@example
+$ @kbd{gawk -M 'BEGIN @{}
+>   @kbd{x = 5^4^3^2}
+>   @kbd{print "number of digits =", length(x)}
+>   @kbd{print substr(x, 1, 20), "...", substr(x, length(x) - 19, 20)}
+> @kbd{@}'}
+@print{} number of digits = 183231
+@print{} 62060698786608744707 ... 92256259918212890625
+@end example
+
+If instead you were to compute the same value using arbitrary-precision
+floating-point values, the precision needed for correct output (using
+the formula
+@iftex
+@math{prec = 3.322 @cdot dps})
+would be @math{3.322 @cdot 183231},
+@end iftex
+@ifnottex
+@ifnotdocbook
+@samp{prec = 3.322 * dps})
+would be 3.322 x 183231,
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>)
+would be
+<emphasis>prec</emphasis> = 3.322 &sdot; 183231,
+@end docbook
+or 608693.
+
+The result from an arithmetic operation with an integer and a floating-point value
+is a floating-point value with a precision equal to the working precision.
+The following program calculates the eighth term in
+Sylvester's sequence@footnote{Weisstein, Eric W.
+@cite{Sylvester's Sequence}. From MathWorld---A Wolfram Web Resource
+@w{(@url{http://mathworld.wolfram.com/SylvestersSequence.html}).}}
+using a recurrence:
+
+@example
+$ @kbd{gawk -M 'BEGIN @{}
+>   @kbd{s = 2.0}
+>   @kbd{for (i = 1; i <= 7; i++)}
+>       @kbd{s = s * (s - 1) + 1}
+>   @kbd{print s}
+> @kbd{@}'}
+@print{} 113423713055421845118910464
+@end example
+
+The output differs from the actual number, 113,423,713,055,421,844,361,000,443,
+because the default precision of 53 bits is not enough to represent the
+floating-point results exactly. You can either increase the precision
+(100 bits is enough in this case), or replace the floating-point constant
+@samp{2.0} with an integer, to perform all computations using integer
+arithmetic to get the correct output.
+
+Sometimes @command{gawk} must implicitly convert an arbitrary-precision
+integer into an arbitrary-precision floating-point value.  This is
+primarily because the MPFR library does not always provide the relevant
+interface to process arbitrary-precision integers or mixed-mode numbers
+as needed by an operation or function.  In such a case, the precision is
+set to the minimum value necessary for exact conversion, and the working
+precision is not used for this purpose.  If this is not what you need or
+want, you can employ a subterfuge and convert the integer to floating
+point first, like this:
+
+@example
+gawk -M 'BEGIN @{ n = 13; print (n + 0.0) % 2.0 @}'
+@end example
+
+You can avoid this issue altogether by specifying the number as a floating-point value
+to begin with:
+
+@example
+gawk -M 'BEGIN @{ n = 13.0; print n % 2.0 @}'
+@end example
+
+Note that for this particular example, it is likely best
+to just use the following:
+
+@example
+gawk -M 'BEGIN @{ n = 13; print n % 2 @}'
+@end example
+
+When dividing two arbitrary precision integers with either
+@samp{/} or @samp{%}, the result is typically an arbitrary
+precision floating point value (unless the denominator evenly
+divides into the numerator).
+@ifset INTDIV
+In order to do integer division
+or remainder with arbitrary precision integers, use the built-in
+@code{intdiv0()} function (@pxref{Numeric Functions}).
+
+You can simulate the @code{intdiv0()} function in standard @command{awk}
+using this user-defined function:
+
+@example
+@c file eg/lib/intdiv0.awk
+# intdiv0 --- do integer division
+
+@c endfile
+@ignore
+@c file eg/lib/intdiv0.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# July, 2014
+#
+# Name changed from div() to intdiv()
+# April, 2015
+#
+# Changed to intdiv0()
+# April, 2016
+
+@c endfile
+
+@end ignore
+@c file eg/lib/intdiv0.awk
+function intdiv0(numerator, denominator, result)
+@{
+    split("", result)
+
+    numerator = int(numerator)
+    denominator = int(denominator)
+    result["quotient"] = int(numerator / denominator)
+    result["remainder"] = int(numerator % denominator)
+
+    return 0.0
+@}
+@c endfile
+@end example
+
+The following example program, contributed by Katie Wasserman,
+uses @code{intdiv0()} to
+compute the digits of @value{PI} to as many places as you
+choose to set:
+
+@example
+@c file eg/prog/pi.awk
+@group
+# pi.awk --- compute the digits of pi
+@c endfile
+@c endfile
+@ignore
+@c file eg/prog/pi.awk
+#
+# Katie Wasserman, katie@@wass.net
+# August 2014
+@c endfile
+@end ignore
+@c file eg/prog/pi.awk
+
+BEGIN @{
+    digits = 100000
+    two = 2 * 10 ^ digits
+@end group
+    pi = two
+    for (m = digits * 4; m > 0; --m) @{
+        d = m * 2 + 1
+        x = pi * m
+        intdiv0(x, d, result)
+        pi = result["quotient"]
+        pi = pi + two
+    @}
+    print pi
+@}
+@c endfile
+@end example
+
+@ignore
+Date: Wed, 20 Aug 2014 10:19:11 -0400
+To: arnold@skeeve.com
+From: Katherine Wasserman <katie@wass.net>
+Subject: Re: computation of digits of pi?
+
+Arnold,
+
+>The program that you sent to compute the digits of pi using div(). Is
+>that some standard algorithm that every math student knows? If so,
+>what's it called?
+
+It's not that well known but it's not that obscure either
+
+It's Euler's modification to Newton's method for calculating pi.
+
+Take a look at lines (23) - (25)  here: http://mathworld.wolfram.com/PiFormulas.htm
+
+The algorithm I wrote simply expands the multiply by 2 and works from the innermost expression outwards.  I used this to program HP calculators because it's quite easy to modify for tiny memory devices with smallish word sizes.   
+
+http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899
+
+-Katie
+@end ignore
+
+When asked about the algorithm used, Katie replied:
+
+@quotation
+It's not that well known but it's not that obscure either.
+It's Euler's modification to Newton's method for calculating pi.
+Take a look at lines (23) - (25) here: @uref{http://mathworld.wolfram.com/PiFormulas.html}.
+
+The algorithm I wrote simply expands the multiply by 2 and works from
+the innermost expression outwards.  I used this to program HP calculators
+because it's quite easy to modify for tiny memory devices with smallish
+word sizes. See
+@uref{http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899}.
+@end quotation
+@end ifset
+
+@node Checking for MPFR
+@section How To Check If MPFR Is Available
+
+@cindex MPFR, checking availability of
+@cindex checking for MPFR
+@cindex MPFR, checking for
+Occasionally, you might like to be able to check if @command{gawk}
+was invoked with the @option{-M} option, enabling arbitrary-precision
+arithmetic.  You can do so with the following function, contributed
+by Andrew Schorr:
+
+@example
+@c file eg/lib/have_mpfr.awk
+# adequate_math_precision --- return true if we have enough bits
+@c endfile
+@ignore
+@c file eg/lib/have_mpfr.awk
+#
+# Andrew Schorr, aschorr@@telemetry-investments.com, Public Domain
+# May 2017
+@c endfile
+@end ignore
+@c file eg/lib/have_mpfr.awk
+
+function adequate_math_precision(n)
+@{
+    return (1 != (1+(1/(2^(n-1)))))
+@}
+@c endfile
+@end example
+
+Here is code that invokes the function in order to check
+if arbitrary-precision arithmetic is available:
+
+@example
+BEGIN @{
+    # How many bits of mantissa precision are required
+    # for this program to function properly?
+    fpbits = 123
+
+    # We hope that we were invoked with MPFR enabled. If so, the
+    # following statement should configure calculations to our desired
+    # precision.
+    PREC = fpbits
+
+    if (! adequate_math_precision(fpbits)) @{
+        print("Error: insufficient computation precision available.\n" \
+              "Try again with the -M argument?") > "/dev/stderr"
+        # Note: you may need to set a flag here to bail out of END rules
+        exit 1
+    @}
+@}
+@end example
+
+Please be aware that @code{exit} will jump to the @code{END} rules, if present (@pxref{Exit Statement}).
+
+@node POSIX Floating Point Problems
+@section Standards Versus Existing Practice
+
+Historically, @command{awk} has converted any nonnumeric-looking string
+to the numeric value zero, when required.  Furthermore, the original
+definition of the language and the original POSIX standards specified that
+@command{awk} only understands decimal numbers (base 10), and not octal
+(base 8) or hexadecimal numbers (base 16).
+
+Changes in the language of the
+2001 and 2004 POSIX standards can be interpreted to imply that @command{awk}
+should support additional features.  These features are:
+
+@itemize @value{BULLET}
+@item
+Interpretation of floating-point data values specified in hexadecimal
+notation (e.g., @code{0xDEADBEEF}). (Note: data values, @emph{not}
+source code constants.)
+
+@item
+Support for the special IEEE 754 floating-point values ``not a number''
+(NaN), positive infinity (``inf''), and negative infinity (``@minus{}inf'').
+In particular, the format for these values is as specified by the ISO 1999
+C standard, which ignores case and can allow implementation-dependent additional
+characters after the @samp{nan} and allow either @samp{inf} or @samp{infinity}.
+@end itemize
+
+The first problem is that both of these are clear changes to historical
+practice:
+
+@itemize @value{BULLET}
+@item
+The @command{gawk} maintainer feels that supporting hexadecimal
+floating-point values, in particular, is ugly, and was never intended by the
+original designers to be part of the language.
+
+@item
+Allowing completely alphabetic strings to have valid numeric
+values is also a very severe departure from historical practice.
+@end itemize
+
+The second problem is that the @command{gawk} maintainer feels that this
+interpretation of the standard, which required a certain amount of
+``language lawyering'' to arrive at in the first place, was not even
+intended by the standard developers.  In other words, ``We see how you
+got where you are, but we don't think that that's where you want to be.''
+
+Recognizing these issues, but attempting to provide compatibility
+with the earlier versions of the standard,
+the 2008 POSIX standard added explicit wording to allow, but not require,
+that @command{awk} support hexadecimal floating-point values and
+special values for ``not a number'' and infinity.
+
+Although the @command{gawk} maintainer continues to feel that
+providing those features is inadvisable,
+nevertheless, on systems that support IEEE floating point, it seems
+reasonable to provide @emph{some} way to support NaN and infinity values.
+The solution implemented in @command{gawk} is as follows:
+
+@itemize @value{BULLET}
+@item
+With the @option{--posix} command-line option, @command{gawk} becomes
+``hands off.'' String values are passed directly to the system library's
+@code{strtod()} function, and if it successfully returns a numeric value,
+that is what's used.@footnote{You asked for it, you got it.}
+By definition, the results are not portable across
+different systems.  They are also a little surprising:
+
+@example
+$ @kbd{echo nanny | gawk --posix '@{ print $1 + 0 @}'}
+@print{} nan
+$ @kbd{echo 0xDeadBeef | gawk --posix '@{ print $1 + 0 @}'}
+@print{} 3735928559
+@end example
+
+@item
+Without @option{--posix}, @command{gawk} interprets the four string values
+@samp{+inf},
+@samp{-inf},
+@samp{+nan},
+and
+@samp{-nan}
+specially, producing the corresponding special numeric values.
+The leading sign acts a signal to @command{gawk} (and the user)
+that the value is really numeric.  Hexadecimal floating point is
+not supported (unless you also use @option{--non-decimal-data},
+which is @emph{not} recommended). For example:
+
+@example
+$ @kbd{echo nanny | gawk '@{ print $1 + 0 @}'}
+@print{} 0
+$ @kbd{echo +nan | gawk '@{ print $1 + 0 @}'}
+@print{} +nan
+$ @kbd{echo 0xDeadBeef | gawk '@{ print $1 + 0 @}'}
+@print{} 0
+@end example
+
+@command{gawk} ignores case in the four special values.
+Thus, @samp{+nan} and @samp{+NaN} are the same.
+@end itemize
+
+Besides handling input, @command{gawk} also needs to print ``correct'' values on
+output when a value is either NaN or infinity. Starting with @value{PVERSION}
+4.2.2, for such values @command{gawk} prints one of the four strings
+just described: @samp{+inf}, @samp{-inf}, @samp{+nan}, or @samp{-nan}.
+Similarly, in POSIX mode, @command{gawk} prints the result of
+the system's C @code{printf()} function using the @code{%g} format string
+for the value, whatever that may be.
+
+@node Floating point summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Most computer arithmetic is done using either integers or floating-point
+values.  Standard @command{awk} uses double-precision
+floating-point values.
+
+@item
+In the early 1990s Barbie mistakenly said, ``Math class is tough!''
+Although math isn't tough, floating-point arithmetic isn't the same
+as pencil-and-paper math, and care must be taken:
+
+@c nested list
+@itemize @value{MINUS}
+@item
+Not all numbers can be represented exactly.
+
+@item
+Comparing values should use a delta, instead of being done directly
+with @samp{==} and @samp{!=}.
+
+@item
+Errors accumulate.
+
+@item
+Operations are not always truly associative or distributive.
+@end itemize
+
+@item
+Increasing the accuracy can help, but it is not a panacea.
+
+@item
+Often, increasing the accuracy and then rounding to the desired
+number of digits produces reasonable results.
+
+@item
+Use @option{-M} (or @option{--bignum}) to enable MPFR
+arithmetic. Use @code{PREC} to set the precision in bits, and
+@code{ROUNDMODE} to set the IEEE 754 rounding mode.
+
+@item
+With @option{-M}, @command{gawk} performs
+arbitrary-precision integer arithmetic using the GMP library.
+This is faster and more space-efficient than using MPFR for
+the same calculations.
+
+@item
+There are several areas with respect to floating-point
+numbers where @command{gawk} disagrees with the POSIX standard.
+It pays to be aware of them.
+
+@item
+Overall, there is no need to be unduly suspicious about the results from
+floating-point arithmetic. The lesson to remember is that floating-point
+arithmetic is always more complex than arithmetic using pencil and
+paper. In order to take advantage of the power of floating-point arithmetic,
+you need to know its limitations and work within them. For most casual
+use of floating-point arithmetic, you will often get the expected result
+if you simply round the display of your final results to the correct number
+of significant decimal digits.
+
+@item
+As general advice, avoid presenting numerical data in a manner that
+implies better precision than is actually the case.
+
+@end itemize
+
+@node Dynamic Extensions
+@chapter Writing Extensions for @command{gawk}
+@cindex dynamically loaded extensions
+
+It is possible to add new functions written in C or C++ to @command{gawk} using
+dynamically loaded libraries. This facility is available on systems
+that support the C @code{dlopen()} and @code{dlsym()}
+functions.  This @value{CHAPTER} describes how to create extensions
+using code written in C or C++.
+
+If you don't know anything about C programming, you can safely skip this
+@value{CHAPTER}, although you may wish to review the documentation on the
+extensions that come with @command{gawk} (@pxref{Extension Samples}),
+and the information on the @code{gawkextlib} project (@pxref{gawkextlib}).
+The sample extensions are automatically built and installed when
+@command{gawk} is.
+
+@quotation NOTE
+When @option{--sandbox} is specified, extensions are disabled
+(@pxref{Options}).
+@end quotation
+
+@menu
+* Extension Intro::             What is an extension.
+* Plugin License::              A note about licensing.
+* Extension Mechanism Outline:: An outline of how it works.
+* Extension API Description::   A full description of the API.
+* Finding Extensions::          How @command{gawk} finds compiled extensions.
+* Extension Example::           Example C code for an extension.
+* Extension Samples::           The sample extensions that ship with
+                                @command{gawk}.
+* gawkextlib::                  The @code{gawkextlib} project.
+* Extension summary::           Extension summary.
+* Extension Exercises::         Exercises.
+@end menu
+
+@node Extension Intro
+@section Introduction
+
+@cindex plug-in
+An @dfn{extension} (sometimes called a @dfn{plug-in}) is a piece of
+external compiled code that @command{gawk} can load at runtime to
+provide additional functionality, over and above the built-in capabilities
+described in the rest of this @value{DOCUMENT}.
+
+Extensions are useful because they allow you (of course) to extend
+@command{gawk}'s functionality. For example, they can provide access to
+system calls (such as @code{chdir()} to change directory) and to other
+C library routines that could be of use.  As with most software,
+``the sky is the limit''; if you can imagine something that you might
+want to do and can write in C or C++, you can write an extension to do it!
+
+Extensions are written in C or C++, using the @dfn{application programming
+interface} (API) defined for this purpose by the @command{gawk}
+developers.  The rest of this @value{CHAPTER} explains
+the facilities that the API provides and how to use
+them, and presents a small example extension.  In addition, it documents
+the sample extensions included in the @command{gawk} distribution
+and describes the @code{gawkextlib} project.
+@ifclear FOR_PRINT
+@xref{Extension Design}, for a discussion of the extension mechanism
+goals and design.
+@end ifclear
+@ifset FOR_PRINT
+See @uref{https://www.gnu.org/software/gawk/manual/html_node/Extension-Design.html}
+for a discussion of the extension mechanism
+goals and design.
+@end ifset
+
+@node Plugin License
+@section Extension Licensing
+
+Every dynamic extension must be distributed under a license that is
+compatible with the GNU GPL (@pxref{Copying}).
+
+In order for the extension to tell @command{gawk} that it is
+properly licensed, the extension must define the global symbol
+@code{plugin_is_GPL_compatible}.  If this symbol does not exist,
+@command{gawk} emits a fatal error and exits when it tries to load
+your extension.
+
+The declared type of the symbol should be @code{int}.  It does not need
+to be in any allocated section, though.  The code merely asserts that
+the symbol exists in the global scope.  Something like this is enough:
+
+@example
+int plugin_is_GPL_compatible;
+@end example
+
+@node Extension Mechanism Outline
+@section How It Works at a High Level
+
+Communication between
+@command{gawk} and an extension is two-way.  First, when an extension
+is loaded, @command{gawk} passes it a pointer to a @code{struct} whose fields are
+function pointers.
+@ifnotdocbook
+This is shown in @ref{figure-load-extension}.
+@end ifnotdocbook
+@ifdocbook
+This is shown in @inlineraw{docbook, <xref linkend="figure-load-extension"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-load-extension
+@caption{Loading the extension}
+@center @image{api-figure1, , , Loading the extension}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-load-extension" float="0">
+<title>Loading the extension</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="api-figure1.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+The extension can call functions inside @command{gawk} through these
+function pointers, at runtime, without needing (link-time) access
+to @command{gawk}'s symbols.  One of these function pointers is to a
+function for ``registering'' new functions.
+@ifnotdocbook
+This is shown in @ref{figure-register-new-function}.
+@end ifnotdocbook
+@ifdocbook
+This is shown in @inlineraw{docbook, <xref linkend="figure-register-new-function"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-register-new-function
+@caption{Registering a new function}
+@center @image{api-figure2, , , Registering a new Function}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-register-new-function" float="0">
+<title>Registering a new function</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="api-figure2.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+In the other direction, the extension registers its new functions
+with @command{gawk} by passing function pointers to the functions that
+provide the new feature (@code{do_chdir()}, for example).  @command{gawk}
+associates the function pointer with a name and can then call it, using a
+defined calling convention.
+@ifnotdocbook
+This is shown in @ref{figure-call-new-function}.
+@end ifnotdocbook
+@ifdocbook
+This is shown in @inlineraw{docbook, <xref linkend="figure-call-new-function"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-call-new-function
+@caption{Calling the new function}
+@center @image{api-figure3, , , Calling the new function}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-call-new-function" float="0">
+<title>Calling the new function</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="api-figure3.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+The @code{do_@var{xxx}()} function, in turn, then uses the function
+pointers in the API @code{struct} to do its work, such as updating
+variables or arrays, printing messages, setting @code{ERRNO}, and so on.
+
+Convenience macros make calling through the function pointers look
+like regular function calls so that extension code is quite readable
+and understandable.
+
+Although all of this sounds somewhat complicated, the result is that
+extension code is quite straightforward to write and to read. You can
+see this in the sample extension @file{filefuncs.c} (@pxref{Extension
+Example}) and also in the @file{testext.c} code for testing the APIs.
+
+Some other bits and pieces:
+
+@itemize @value{BULLET}
+@item
+The API provides access to @command{gawk}'s @code{do_@var{xxx}} values,
+reflecting command-line options, like @code{do_lint}, @code{do_profiling},
+and so on (@pxref{Extension API Variables}).
+These are informational: an extension cannot affect their values
+inside @command{gawk}.  In addition, attempting to assign to them
+produces a compile-time error.
+
+@item
+The API also provides major and minor version numbers, so that an
+extension can check if the @command{gawk} it is loaded with supports the
+facilities it was compiled with.  (Version mismatches ``shouldn't''
+happen, but we all know how @emph{that} goes.)
+@xref{Extension Versioning} for details.
+@end itemize
+
+@node Extension API Description
+@section API Description
+@cindex extension API
+
+C or C++ code for an extension must include the header file
+@file{gawkapi.h}, which declares the functions and defines the data
+types used to communicate with @command{gawk}.
+This (rather large) @value{SECTION} describes the API in detail.
+
+@menu
+* Extension API Functions Introduction:: Introduction to the API functions.
+* General Data Types::                   The data types.
+* Memory Allocation Functions::          Functions for allocating memory.
+* Constructor Functions::                Functions for creating values.
+* Registration Functions::               Functions to register things with
+                                         @command{gawk}.
+* Printing Messages::                    Functions for printing messages.
+* Updating @code{ERRNO}::                Functions for updating @code{ERRNO}.
+* Requesting Values::                    How to get a value.
+* Accessing Parameters::                 Functions for accessing parameters.
+* Symbol Table Access::                  Functions for accessing global
+                                         variables.
+* Array Manipulation::                   Functions for working with arrays.
+* Redirection API::                      How to access and manipulate
+                                         redirections.
+* Extension API Variables::              Variables provided by the API.
+* Extension API Boilerplate::            Boilerplate code for using the API.
+* Changes from API V1::                  Changes from V1 of the API.
+@end menu
+
+@node Extension API Functions Introduction
+@subsection Introduction
+
+Access to facilities within @command{gawk} is achieved
+by calling through function pointers passed into your extension.
+
+API function pointers are provided for the following kinds of operations:
+
+@itemize @value{BULLET}
+@item
+Allocating, reallocating, and releasing memory.
+
+@item
+Registration functions. You may register:
+
+@c nested list
+@itemize @value{MINUS}
+@item
+Extension functions
+@item
+Exit callbacks
+@item
+A version string
+@item
+Input parsers
+@item
+Output wrappers
+@item
+Two-way processors
+@end itemize
+
+All of these are discussed in detail later in this @value{CHAPTER}.
+
+@item
+Printing fatal, warning, and ``lint'' warning messages.
+
+@item
+Updating @code{ERRNO}, or unsetting it.
+
+@item
+Accessing parameters, including converting an undefined parameter into
+an array.
+
+@item
+Symbol table access: retrieving a global variable, creating one,
+or changing one.
+
+@item
+Creating and releasing cached values; this provides an
+efficient way to use values for multiple variables and
+can be a big performance win.
+
+@item
+Manipulating arrays:
+
+@itemize @value{MINUS}
+@item
+Retrieving, adding, deleting, and modifying elements
+
+@item
+Getting the count of elements in an array
+
+@item
+Creating a new array
+
+@item
+Clearing an array
+
+@item
+Flattening an array for easy C-style looping over all its indices and elements
+@end itemize
+
+@item
+Accessing and manipulating redirections.
+
+@end itemize
+
+Some points about using the API:
+
+@itemize @value{BULLET}
+@item
+The following types, macros, and/or functions are referenced
+in @file{gawkapi.h}.  For correct use, you must therefore include the
+corresponding standard header file @emph{before} including @file{gawkapi.h}.
+The list of macros and related header files is shown in @ref{table-api-std-headers}.
+
+@float Table,table-api-std-headers
+@caption{Standard header files needed by API}
+@multitable {@code{memset()}, @code{memcpy()}} {@code{<sys/types.h>}}
+@headitem C entity @tab Header file
+@item @code{EOF} @tab @code{<stdio.h>}
+@item Values for @code{errno} @tab @code{<errno.h>}
+@item @code{FILE} @tab @code{<stdio.h>}
+@item @code{NULL} @tab @code{<stddef.h>}
+@item @code{memcpy()} @tab @code{<string.h>}
+@item @code{memset()} @tab @code{<string.h>}
+@item @code{size_t} @tab @code{<sys/types.h>}
+@item @code{struct stat} @tab @code{<sys/stat.h>}
+@end multitable
+@end float
+
+Due to portability concerns, especially to systems that are not
+fully standards-compliant, it is your responsibility
+to include the correct files in the correct way. This requirement
+is necessary in order to keep @file{gawkapi.h} clean, instead of becoming
+a portability hodge-podge as can be seen in some parts of
+the @command{gawk} source code.
+
+@item
+If your extension uses MPFR facilities, and you wish to receive such
+values from @command{gawk} and/or pass such values to it, you must include the
+@code{<mpfr.h>} header before including @code{<gawkapi.h>}.
+
+@item
+The @file{gawkapi.h} file may be included more than once without ill effect.
+Doing so, however, is poor coding practice.
+
+@item
+Although the API only uses ISO C 90 features, there is an exception; the
+``constructor'' functions use the @code{inline} keyword. If your compiler
+does not support this keyword, you should either place
+@samp{-Dinline=''} on your command line or use the GNU Autotools and include a
+@file{config.h} file in your extensions.
+
+@item
+All pointers filled in by @command{gawk} point to memory
+managed by @command{gawk} and should be treated by the extension as
+read-only.  Memory for @emph{all} strings passed into @command{gawk}
+from the extension @emph{must} come from calling one of
+@code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()},
+and is managed by @command{gawk} from then on.
+
+@item
+The API defines several simple @code{struct}s that map values as seen
+from @command{awk}.  A value can be a @code{double}, a string, or an
+array (as in multidimensional arrays, or when creating a new array).
+
+String values maintain both pointer and length, because embedded @sc{nul}
+characters are allowed.
+
+@quotation NOTE
+By intent, @command{gawk} maintains strings using the current multibyte
+encoding (as defined by @env{LC_@var{xxx}} environment variables)
+and not using wide characters.  This matches how @command{gawk} stores
+strings internally and also how characters are likely to be input into
+and output from files.
+@end quotation
+
+@quotation NOTE
+String values passed to an extension by @command{gawk} are always
+@sc{nul}-terminated.  Thus it is safe to pass such string values to
+standard library and system routines. However, because @command{gawk}
+allows embedded @sc{nul} characters in string data, before using the data
+as a regular C string, you should check that the length for that string
+passed to the extension matches the return value of @code{strlen()}
+for it.
+@end quotation
+
+@item
+When retrieving a value (such as a parameter or that of a global variable
+or array element), the extension requests a specific type (number, string,
+scalar, value cookie, array, or ``undefined'').  When the request is
+``undefined,'' the returned value will have the real underlying type.
+
+However, if the request and actual type don't match, the access function
+returns ``false'' and fills in the type of the actual value that is there,
+so that the extension can, e.g., print an error message
+(such as ``scalar passed where array expected'').
+
+@c This is documented in the header file and needs some expanding upon.
+@c The table there should be presented here
+@end itemize
+
+You may call the API functions by using the function pointers
+directly, but the interface is not so pretty. To make extension code look
+more like regular code, the @file{gawkapi.h} header file defines several
+macros that you should use in your code.  This @value{SECTION} presents
+the macros as if they were functions.
+
+@node General Data Types
+@subsection General-Purpose Data Types
+
+@cindex Robbins, Arnold
+@cindex Ramey, Chet
+@quotation
+@i{I have a true love/hate relationship with unions.}
+@author Arnold Robbins
+@end quotation
+
+@quotation
+@i{That's the thing about unions: the compiler will arrange things so they
+can accommodate both love and hate.}
+@author Chet Ramey
+@end quotation
+
+The extension API defines a number of simple types and structures for
+general-purpose use. Additional, more specialized, data structures are
+introduced in subsequent @value{SECTION}s, together with the functions
+that use them.
+
+The general-purpose types and structures are as follows:
+
+@table @code
+@item typedef void *awk_ext_id_t;
+A value of this type is received from @command{gawk} when an extension is loaded.
+That value must then be passed back to @command{gawk} as the first parameter of
+each API function.
+
+@item #define awk_const @dots{}
+This macro expands to @samp{const} when compiling an extension,
+and to nothing when compiling @command{gawk} itself.  This makes
+certain fields in the API data structures unwritable from extension code,
+while allowing @command{gawk} to use them as it needs to.
+
+@item typedef enum awk_bool @{
+@itemx @ @ @ @ awk_false = 0,
+@itemx @ @ @ @ awk_true
+@itemx @} awk_bool_t;
+A simple Boolean type.
+
+@item typedef struct awk_string @{
+@itemx @ @ @ @ char *str;@ @ @ @ @ @ /* data */
+@itemx @ @ @ @ size_t len;@ @ @ @ @ /* length thereof, in chars */
+@itemx @} awk_string_t;
+This represents a mutable string. @command{gawk}
+owns the memory pointed to if it supplied
+the value. Otherwise, it takes ownership of the memory pointed to.
+@emph{Such memory must come from calling one of the
+@code{gawk_malloc()}, @code{gawk_calloc()}, or
+@code{gawk_realloc()} functions!}
+
+As mentioned earlier, strings are maintained using the current
+multibyte encoding.
+
+@item typedef enum @{
+@itemx @ @ @ @ AWK_UNDEFINED,
+@itemx @ @ @ @ AWK_NUMBER,
+@itemx @ @ @ @ AWK_STRING,
+@itemx @ @ @ @ AWK_REGEX,
+@itemx @ @ @ @ AWK_STRNUM,
+@itemx @ @ @ @ AWK_ARRAY,
+@itemx @ @ @ @ AWK_SCALAR,@ @ @ @ @ @ @ @ @ /* opaque access to a variable */
+@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* for updating a previously created value */
+@itemx @} awk_valtype_t;
+This @code{enum} indicates the type of a value.
+It is used in the following @code{struct}.
+
+@item typedef struct awk_value @{
+@itemx @ @ @ @ awk_valtype_t   val_type;
+@itemx @ @ @ @ union @{
+@itemx @ @ @ @ @ @ @ @ awk_string_t@ @ @ @ @ @ @ s;
+@itemx @ @ @ @ @ @ @ @ awknum_t@ @ @ @ @ @ @ @ @ @ @ n;
+@itemx @ @ @ @ @ @ @ @ awk_array_t@ @ @ @ @ @ @ @ a;
+@itemx @ @ @ @ @ @ @ @ awk_scalar_t@ @ @ @ @ @ @ scl;
+@itemx @ @ @ @ @ @ @ @ awk_value_cookie_t@ vc;
+@itemx @ @ @ @ @} u;
+@itemx @} awk_value_t;
+An ``@command{awk} value.''
+The @code{val_type} member indicates what kind of value the
+@code{union} holds, and each member is of the appropriate type.
+
+@item #define str_value@ @ @ @ @ @ u.s
+@itemx #define strnum_value@ @ @ str_value
+@itemx #define regex_value@ @ @ @ str_value
+@itemx #define num_value@ @ @ @ @ @ u.n.d
+@itemx #define num_type@ @ @ @ @ @ @ u.n.type
+@itemx #define num_ptr@ @ @ @ @ @ @ @ u.n.ptr
+@itemx #define array_cookie@ @ @ u.a
+@itemx #define scalar_cookie@ @ u.scl
+@itemx #define value_cookie@ @ @ u.vc
+Using these macros makes accessing the fields of the @code{awk_value_t} more
+readable.
+
+@item enum AWK_NUMBER_TYPE @{
+@itemx @ @ @ @ AWK_NUMBER_TYPE_DOUBLE,
+@itemx @ @ @ @ AWK_NUMBER_TYPE_MPFR,
+@itemx @ @ @ @ AWK_NUMBER_TYPE_MPZ
+@itemx @};
+This @code{enum} is used in the following structure for defining the
+type of numeric value that is being worked with.  It is declared at the
+top level of the file so that it works correctly for C++ as well as for C.
+
+@item typedef struct awk_number @{
+@itemx @ @ @ @ double d;
+@itemx @ @ @ @ enum AWK_NUMBER_TYPE type;
+@itemx @ @ @ @ void *ptr;
+@itemx @} awk_number_t;
+This represents a numeric value.  Internally, @command{gawk} stores
+every number as either a C @code{double}, a GMP integer, or an MPFR
+arbitrary-precision floating-point value.  In order to allow extensions
+to also support GMP and MPFR values, numeric values are passed in this
+structure.
+
+The double-precision @code{d} element is always populated
+in data received from @command{gawk}. In addition, by examining the
+@code{type} member, an extension can determine if the @code{ptr}
+member is either a GMP integer (type @code{mpz_ptr}), or an MPFR
+floating-point value (type @code{mpfr_ptr_t}), and cast it appropriately.
+
+@item typedef void *awk_scalar_t;
+Scalars can be represented as an opaque type. These values are obtained
+from @command{gawk} and then passed back into it. This is discussed
+in a general fashion in the text following this list, and in more detail in
+@ref{Symbol table by cookie}.
+
+@item typedef void *awk_value_cookie_t;
+A ``value cookie'' is an opaque type representing a cached value.
+This is also discussed in a general fashion in the text following this list,
+and in more detail in @ref{Cached values}.
+
+@end table
+
+Scalar values in @command{awk} are numbers, strings, strnums, or typed regexps. The
+@code{awk_value_t} struct represents values.  The @code{val_type} member
+indicates what is in the @code{union}.
+
+Representing numbers is easy---the API uses a C @code{double}.  Strings
+require more work. Because @command{gawk} allows embedded @sc{nul} bytes
+in string values, a string must be represented as a pair containing a
+data pointer and length. This is the @code{awk_string_t} type.
+
+A strnum (numeric string) value is represented as a string and consists
+of user input data that appears to be numeric.
+When an extension creates a strnum value, the result is a string flagged
+as user input. Subsequent parsing by @command{gawk} then determines whether it
+looks like a number and should be treated as a strnum, or as a regular string.
+
+This is useful in cases where an extension function would like to do something
+comparable to the @code{split()} function which sets the strnum attribute
+on the array elements it creates.  For example, an extension that implements
+CSV splitting would want to use this feature. This is also useful for a
+function that retrieves a data item from a database. The PostgreSQL
+@code{PQgetvalue()} function, for example, returns a string that may be numeric
+or textual depending on the contents.
+
+Typed regexp values (@pxref{Strong Regexp Constants}) are not of
+much use to extension functions.  Extension functions can tell that
+they've received them, and create them for scalar values. Otherwise,
+they can examine the text of the regexp through @code{regex_value.str}
+and @code{regex_value.len}.
+
+Identifiers (i.e., the names of global variables) can be associated
+with either scalar values or with arrays.  In addition, @command{gawk}
+provides true arrays of arrays, where any given array element can
+itself be an array.  Discussion of arrays is delayed until
+@ref{Array Manipulation}.
+
+The various macros listed earlier make it easier to use the elements
+of the @code{union} as if they were fields in a @code{struct}; this
+is a common coding practice in C.  Such code is easier to write and to
+read, but it remains @emph{your} responsibility to make sure that
+the @code{val_type} member correctly reflects the type of the value in
+the @code{awk_value_t} struct.
+
+Conceptually, the first three members of the @code{union} (number, string,
+and array) are all that is needed for working with @command{awk} values.
+However, because the API provides routines for accessing and changing
+the value of a global scalar variable only by using the variable's name,
+there is a performance penalty: @command{gawk} must find the variable
+each time it is accessed and changed.  This turns out to be a real issue,
+not just a theoretical one.
+
+Thus, if you know that your extension will spend considerable time
+reading and/or changing the value of one or more scalar variables, you
+can obtain a @dfn{scalar cookie}@footnote{See
+@uref{http://catb.org/jargon/html/C/cookie.html, the ``cookie'' entry in the Jargon file} for a
+definition of @dfn{cookie}, and @uref{http://catb.org/jargon/html/M/magic-cookie.html,
+the ``magic cookie'' entry in the Jargon file} for a nice example.
+@ifclear FOR_PRINT
+See also the entry for ``Cookie'' in the @ref{Glossary}.
+@end ifclear
+}
+object for that variable, and then use
+the cookie for getting the variable's value or for changing the variable's
+value.
+The @code{awk_scalar_t} type holds a scalar cookie, and the
+@code{scalar_cookie} macro provides access to the value of that type
+in the @code{awk_value_t} struct.
+Given a scalar cookie, @command{gawk} can directly retrieve or
+modify the value, as required, without having to find it first.
+
+The @code{awk_value_cookie_t} type and @code{value_cookie} macro are similar.
+If you know that you wish to
+use the same numeric or string @emph{value} for one or more variables,
+you can create the value once, retaining a @dfn{value cookie} for it,
+and then pass in that value cookie whenever you wish to set the value of a
+variable.  This saves storage space within the running @command{gawk}
+process and reduces the time needed to create the value.
+
+@node Memory Allocation Functions
+@subsection Memory Allocation Functions and Convenience Macros
+@cindex allocating memory for extensions
+@cindex extensions, allocating memory
+@cindex memory, allocating for extensions
+
+The API provides a number of @dfn{memory allocation} functions for
+allocating memory that can be passed to @command{gawk}, as well as a number of
+convenience macros.
+This @value{SUBSECTION} presents them all as function prototypes, in
+the way that extension code would use them:
+
+@table @code
+@item void *gawk_malloc(size_t size);
+Call the correct version of @code{malloc()} to allocate storage that may
+be passed to @command{gawk}.
+
+@item void *gawk_calloc(size_t nmemb, size_t size);
+Call the correct version of @code{calloc()} to allocate storage that may
+be passed to @command{gawk}.
+
+@item void *gawk_realloc(void *ptr, size_t size);
+Call the correct version of @code{realloc()} to allocate storage that may
+be passed to @command{gawk}.
+
+@item void gawk_free(void *ptr);
+Call the correct version of @code{free()} to release storage that was
+allocated with @code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}.
+@end table
+
+The API has to provide these functions because it is possible
+for an extension to be compiled and linked against a different
+version of the C library than was used for the @command{gawk}
+executable.@footnote{This is more common on MS-Windows systems, but it
+can happen on Unix-like systems as well.} If @command{gawk} were
+to use its version of @code{free()} when the memory came from an
+unrelated version of @code{malloc()}, unexpected behavior would
+likely result.
+
+Three convenience macros may be used for allocating storage
+from @code{gawk_malloc()}, @code{gawk_calloc}, and
+@code{gawk_realloc()}. If the allocation fails, they cause @command{gawk}
+to exit with a fatal error message.  They should be used as if they were
+procedure calls that do not return a value:
+
+@table @code
+@item #define emalloc(pointer, type, size, message) @dots{}
+The arguments to this macro are as follows:
+
+@c nested table
+@table @code
+@item pointer
+The pointer variable to point at the allocated storage.
+
+@item type
+The type of the pointer variable.  This is used to create a cast for
+the call to @code{gawk_malloc()}.
+
+@item size
+The total number of bytes to be allocated.
+
+@item message
+A message to be prefixed to the fatal error message. Typically this is the name
+of the function using the macro.
+@end table
+
+@noindent
+For example, you might allocate a string value like so:
+
+@example
+@group
+awk_value_t result;
+char *message;
+const char greet[] = "Don't Panic!";
+
+emalloc(message, char *, sizeof(greet), "myfunc");
+strcpy(message, greet);
+make_malloced_string(message, strlen(message), & result);
+@end group
+@end example
+
+@sp 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()}.
+The arguments are the same as for the @code{emalloc()} macro, but this
+macro guarantees that the memory returned is initialized to zero.
+
+@item #define erealloc(pointer, type, size, message) @dots{}
+This is like @code{emalloc()}, but it calls @code{gawk_realloc()}
+instead of @code{gawk_malloc()}.
+The arguments are the same as for the @code{emalloc()} macro.
+@end table
+
+Two additional functions allocate MPFR and GMP objects for use
+by extension functions that need to create and then return such
+values:
+
+@table @code
+@item void *get_mpfr_ptr();
+Allocate and initialize an MPFR object and return a pointer to it.
+If the allocation fails, @command{gawk} exits with a fatal
+``out of memory'' error.  If @command{gawk} was compiled without
+MPFR support, calling this function causes a fatal error.
+
+@item void *get_mpz_ptr();
+Allocate and initialize a GMP object and return a pointer to it.
+If the allocation fails, @command{gawk} exits with a fatal
+``out of memory'' error.  If @command{gawk} was compiled without
+MPFR support, calling this function causes a fatal error.
+@end table
+
+Both of these functions return @samp{void *}, since the @file{gawkapi.h}
+header file should not have dependency upon @code{<mpfr.h>} (and @code{<gmp.h>},
+which is included from @code{<mpfr.h>}).  The actual return values are of
+types @code{mpfr_ptr} and @code{mpz_ptr} respectively, and you should cast
+the return values appropriately before assigning the results to variables
+of the correct types.
+
+@node Constructor Functions
+@subsection Constructor Functions
+
+The API provides a number of @dfn{constructor} functions for creating
+string and numeric values, as well as a number of convenience macros.
+This @value{SUBSECTION} presents them all as function prototypes, in
+the way that extension code would use them:
+
+@table @code
+@item static inline awk_value_t *
+@itemx make_const_string(const char *string, size_t length, awk_value_t *result);
+This function creates a string value in the @code{awk_value_t} variable
+pointed to by @code{result}. It expects @code{string} to be a C string constant
+(or other string data), and automatically creates a @emph{copy} of the data
+for storage in @code{result}. It returns @code{result}.
+
+@item static inline awk_value_t *
+@itemx make_malloced_string(const char *string, size_t length, awk_value_t *result);
+This function creates a string value in the @code{awk_value_t} variable
+pointed to by @code{result}. It expects @code{string} to be a @samp{char *}
+value pointing to data previously obtained from @code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}. The idea here
+is that the data is passed directly to @command{gawk}, which assumes
+responsibility for it. It returns @code{result}.
+
+@item static inline awk_value_t *
+@itemx make_null_string(awk_value_t *result);
+This specialized function creates a null string (the ``undefined'' value)
+in the @code{awk_value_t} variable pointed to by @code{result}.
+It returns @code{result}.
+
+@item static inline awk_value_t *
+@itemx make_number(double num, awk_value_t *result);
+This function simply creates a numeric value in the @code{awk_value_t} variable
+pointed to by @code{result}.
+
+@item static inline awk_value_t *
+@itemx make_number_mpz(void *mpz, awk_value_t *result);
+This function creates a GMP number value in @code{result}.
+The @code{mpz} must be from a call to @code{get_mpz_ptr()}
+(and thus be of real underlying type @code{mpz_ptr}).
+@command{gawk} takes ownership of this memory.
+
+@item static inline awk_value_t *
+@itemx make_number_mpfr(void *mpfr, awk_value_t *result);
+This function creates an MPFR number value in @code{result}.
+The @code{mpfr} must be from a call to @code{get_mpfr_ptr()}.
+(and thus be of real underlying type @code{mpfr_ptr})
+@command{gawk} takes ownership of this memory.
+
+@item static inline awk_value_t *
+@itemx make_const_user_input(const char *string, size_t length, awk_value_t *result);
+This function is identical to @code{make_const_string()}, but the string is
+flagged as user input that should be treated as a strnum value if the contents
+of the string are numeric.
+
+@item static inline awk_value_t *
+@itemx make_malloced_user_input(const char *string, size_t length, awk_value_t *result);
+This function is identical to @code{make_malloced_string()}, but the string is
+flagged as user input that should be treated as a strnum value if the contents
+of the string are numeric.
+
+@item static inline awk_value_t *
+@itemx make_const_regex(const char *string, size_t length, awk_value_t *result);
+This function creates a strongly typed regexp value by allocating a copy of the string.
+@code{string} is the regular expression of length @code{len}.
+
+@item static inline awk_value_t *
+@itemx make_malloced_regex(const char *string, size_t length, awk_value_t *result);
+This function creates a strongly typed regexp value.  @code{string} is
+the regular expression of length @code{len}.  It expects @code{string}
+to be a @samp{char *} value pointing to data previously obtained from
+@code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}.
+
+@end table
+
+@node Registration Functions
+@subsection Registration Functions
+@cindex register extension
+@cindex extension registration
+
+This @value{SECTION} describes the API functions for
+registering parts of your extension with @command{gawk}.
+
+@menu
+* Extension Functions::         Registering extension functions.
+* Exit Callback Functions::     Registering an exit callback.
+* Extension Version String::    Registering a version string.
+* Input Parsers::               Registering an input parser.
+* Output Wrappers::             Registering an output wrapper.
+* Two-way processors::          Registering a two-way processor.
+@end menu
+
+@node Extension Functions
+@subsubsection Registering An Extension Function
+
+Extension functions are described by the following record:
+
+@example
+@group
+typedef struct awk_ext_func @{
+@ @ @ @ const char *name;
+@ @ @ @ awk_value_t *(*const function)(int num_actual_args,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
+@ @ @ @ const size_t max_expected_args;
+@ @ @ @ const size_t min_required_args;
+@ @ @ @ awk_bool_t suppress_lint;
+@ @ @ @ void *data;        /* opaque pointer to any extra state */
+@} awk_ext_func_t;
+@end group
+@end example
+
+The fields are:
+
+@table @code
+@item const char *name;
+The name of the new function.
+@command{awk}-level code calls the function by this name.
+This is a regular C string.
+
+Function names must obey the rules for @command{awk}
+identifiers. That is, they must begin with either an English letter
+or an underscore, which may be followed by any number of
+letters, digits, and underscores.
+Letter case in function names is significant.
+
+@item awk_value_t *(*const function)(int num_actual_args,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
+This is a pointer to the C function that provides the extension's
+functionality.
+The function must fill in @code{*result} with either a number,
+a string, or a regexp.
+@command{gawk} takes ownership of any string memory.
+As mentioned earlier, string memory @emph{must} come from one of
+@code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}.
+
+The @code{num_actual_args} argument tells the C function how many
+actual parameters were passed from the calling @command{awk} code.
+
+The @code{finfo} parameter is a pointer to the @code{awk_ext_func_t} for
+this function. The called function may access data within it as desired, or not.
+
+The function must return the value of @code{result}.
+This is for the convenience of the calling code inside @command{gawk}.
+
+@item const size_t max_expected_args;
+This is the maximum number of arguments the function expects to receive.
+If called with more arguments than this, and if lint checking has
+been enabled, then @command{gawk} prints a warning message.  For more
+information, see the entry for @code{suppress_lint}, later in this list.
+
+@item const size_t min_required_args;
+This is the minimum number of arguments the function expects to receive.
+If called with fewer arguments, @command{gawk} prints a fatal error
+message and exits.
+
+@item awk_bool_t suppress_lint;
+This flag tells @command{gawk} not to print a lint message if lint
+checking has been enabled and if more arguments were supplied in the call
+than expected.  An extension function can tell if @command{gawk} already
+printed at least one such message by checking if @samp{num_actual_args >
+finfo->max_expected_args}.  If so, and the function does not want more
+lint messages to be printed, it should set @code{finfo->suppress_lint}
+to @code{awk_true}.
+
+@item void *data;
+This is an opaque pointer to any data that an extension function may
+wish to have available when called.  Passing the @code{awk_ext_func_t}
+structure to the extension function, and having this pointer available
+in it enable writing a single C or C++ function that implements multiple
+@command{awk}-level extension functions.
+@end table
+
+Once you have a record representing your extension function, you register
+it with @command{gawk} using this API function:
+
+@table @code
+@item awk_bool_t add_ext_func(const char *name_space, awk_ext_func_t *func);
+This function returns true upon success, false otherwise.
+The @code{name_space} parameter is the namespace in which to place
+the function (@pxref{Namespaces}).
+Use an empty string (@code{""}) or @code{"awk"} to place
+the function in the default @code{awk} namespace.
+The @code{func} pointer is the address of a
+@code{struct} representing your function, as just described.
+
+@command{gawk} does not modify what @code{func} points to, but the
+extension function itself receives this pointer and can modify what it
+points to, thus it is purposely not declared to be @code{const}.
+@end table
+
+The combination of @code{min_required_args}, @code{max_expected_args},
+and @code{suppress_lint} may be confusing. Here is how you should
+set things up.
+
+@table @asis
+@item Any number of arguments is valid
+Set @code{min_required_args} and @code{max_expected_args} to zero and
+set @code{suppress_lint} to @code{awk_true}.
+
+@item A minimum number of arguments is required, no limit on maximum number of arguments
+Set @code{min_required_args} to the minimum required. Set
+@code{max_expected_args} to zero and
+set @code{suppress_lint} to @code{awk_true}.
+
+@item A minimum number of arguments is required, a maximum number is expected
+Set @code{min_required_args} to the minimum required. Set
+@code{max_expected_args} to the maximum expected.
+Set @code{suppress_lint} to @code{awk_false}.
+
+@item A minimum number of arguments is required, and no more than a maximum is allowed
+Set @code{min_required_args} to the minimum required. Set
+@code{max_expected_args} to the maximum expected.
+Set @code{suppress_lint} to @code{awk_false}.
+In your extension function, check that @code{num_actual_args} does not
+exceed @code{f->max_expected_args}. If it does, issue a fatal error message.
+@end table
+
+@node Exit Callback Functions
+@subsubsection Registering An Exit Callback Function
+
+An @dfn{exit callback} function is a function that
+@command{gawk} calls before it exits.
+Such functions are useful if you have general ``cleanup'' tasks
+that should be performed in your extension (such as closing database
+connections or other resource deallocations).
+You can register such
+a function with @command{gawk} using the following function:
+
+@table @code
+@item void awk_atexit(void (*funcp)(void *data, int exit_status),
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ void *arg0);
+The parameters are:
+
+@c nested table
+@table @code
+@item funcp
+A pointer to the function to be called before @command{gawk} exits. The @code{data}
+parameter will be the original value of @code{arg0}.
+The @code{exit_status} parameter is the exit status value that
+@command{gawk} intends to pass to the @code{exit()} system call.
+
+@item arg0
+A pointer to private data that @command{gawk} saves in order to pass to
+the function pointed to by @code{funcp}.
+@end table
+@end table
+
+Exit callback functions are called in last-in, first-out (LIFO)
+order---that is, in the reverse order in which they are registered with
+@command{gawk}.
+
+@node Extension Version String
+@subsubsection Registering An Extension Version String
+
+You can register a version string that indicates the name and
+version of your extension with @command{gawk}, as follows:
+
+@table @code
+@item void register_ext_version(const char *version);
+Register the string pointed to by @code{version} with @command{gawk}.
+Note that @command{gawk} does @emph{not} copy the @code{version} string, so
+it should not be changed.
+@end table
+
+@command{gawk} prints all registered extension version strings when it
+is invoked with the @option{--version} option.
+
+@node Input Parsers
+@subsubsection Customized Input Parsers
+@cindex customized input parser
+
+By default, @command{gawk} reads text files as its input. It uses the value
+of @code{RS} to find the end of the record, and then uses @code{FS}
+(or @code{FIELDWIDTHS} or @code{FPAT}) to split it into fields (@pxref{Reading Files}).
+Additionally, it sets the value of @code{RT} (@pxref{Built-in Variables}).
+
+If you want, you can provide your own custom input parser.  An input
+parser's job is to return a record to the @command{gawk} record-processing
+code, along with indicators for the value and length of the data to be
+used for @code{RT}, if any.
+
+To provide an input parser, you must first provide two functions
+(where @var{XXX} is a prefix name for your extension):
+
+@table @code
+@item awk_bool_t @var{XXX}_can_take_file(const awk_input_buf_t *iobuf);
+This function examines the information available in @code{iobuf}
+(which we discuss shortly).  Based on the information there, it
+decides if the input parser should be used for this file.
+If so, it should return true. Otherwise, it should return false.
+It should not change any state (variable values, etc.) within @command{gawk}.
+
+@item awk_bool_t @var{XXX}_take_control_of(awk_input_buf_t *iobuf);
+When @command{gawk} decides to hand control of the file over to the
+input parser, it calls this function.  This function in turn must fill
+in certain fields in the @code{awk_input_buf_t} structure and ensure
+that certain conditions are true.  It should then return true. If an
+error of some kind occurs, it should not fill in any fields and should
+return false; then @command{gawk} will not use the input parser.
+The details are presented shortly.
+@end table
+
+Your extension should package these functions inside an
+@code{awk_input_parser_t}, which looks like this:
+
+@example
+@group
+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;
+@end group
+@end example
+
+The fields are:
+
+@table @code
+@item const char *name;
+The name of the input parser. This is a regular C string.
+
+@item awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
+A pointer to your @code{@var{XXX}_can_take_file()} function.
+
+@item awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
+A pointer to your @code{@var{XXX}_take_control_of()} function.
+
+@item awk_const struct input_parser *awk_const next;
+This is for use by @command{gawk};
+therefore it is marked @code{awk_const} so that the extension cannot
+modify it.
+@end table
+
+The steps are as follows:
+
+@enumerate
+@item
+Create a @code{static awk_input_parser_t} variable and initialize it
+appropriately.
+
+@item
+When your extension is loaded, register your input parser with
+@command{gawk} using the @code{register_input_parser()} API function
+(described next).
+@end enumerate
+
+An @code{awk_input_buf_t} looks like this:
+
+@example
+typedef struct awk_input @{
+    const char *name;       /* filename */
+    int fd;                 /* file descriptor */
+#define INVALID_HANDLE (-1)
+    void *opaque;           /* private data for input parsers */
+    int (*get_record)(char **out, struct awk_input *iobuf,
+                      int *errcode, char **rt_start, size_t *rt_len,
+                      const awk_fieldwidth_info_t **field_width);
+    ssize_t (*read_func)();
+    void (*close_func)(struct awk_input *iobuf);
+    struct stat sbuf;       /* stat buf */
+@} awk_input_buf_t;
+@end example
+
+The fields can be divided into two categories: those for use (initially,
+at least) by @code{@var{XXX}_can_take_file()}, and those for use by
+@code{@var{XXX}_take_control_of()}.  The first group of fields and their uses
+are as follows:
+
+@table @code
+@item const char *name;
+The name of the file.
+
+@item int fd;
+A file descriptor for the file.  If @command{gawk} was able to
+open the file, then @code{fd} will @emph{not} be equal to
+@code{INVALID_HANDLE}. Otherwise, it will.
+
+@item struct stat sbuf;
+If the file descriptor is valid, then @command{gawk} will have filled
+in this structure via a call to the @code{fstat()} system call.
+@end table
+
+The @code{@var{XXX}_can_take_file()} function should examine these
+fields and decide if the input parser should be used for the file.
+The decision can be made based upon @command{gawk} state (the value
+of a variable defined previously by the extension and set by
+@command{awk} code), the name of the
+file, whether or not the file descriptor is valid, the information
+in the @code{struct stat}, or any combination of these factors.
+
+Once @code{@var{XXX}_can_take_file()} has returned true, and
+@command{gawk} has decided to use your input parser, it calls
+@code{@var{XXX}_take_control_of()}.  That function then fills
+either the @code{get_record} field or the @code{read_func} field in
+the @code{awk_input_buf_t}.  It must also ensure that @code{fd} is @emph{not}
+set to @code{INVALID_HANDLE}.  The following list describes the fields that
+may be filled by @code{@var{XXX}_take_control_of()}:
+
+@table @code
+@item void *opaque;
+This is used to hold any state information needed by the input parser
+for this file.  It is ``opaque'' to @command{gawk}.  The input parser
+is not required to use this pointer.
+
+@item int@ (*get_record)(char@ **out,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct@ awk_input *iobuf,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int *errcode,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ char **rt_start,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t *rt_len,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_fieldwidth_info_t **field_width);
+This function pointer should point to a function that creates the input
+records.  Said function is the core of the input parser.  Its behavior
+is described in the text following this list.
+
+@item ssize_t (*read_func)();
+This function pointer should point to a function that has the
+same behavior as the standard POSIX @code{read()} system call.
+It is an alternative to the @code{get_record} pointer.  Its behavior
+is also described in the text following this list.
+
+@item void (*close_func)(struct awk_input *iobuf);
+This function pointer should point to a function that does
+the ``teardown.'' It should release any resources allocated by
+@code{@var{XXX}_take_control_of()}.  It may also close the file. If it
+does so, it should set the @code{fd} field to @code{INVALID_HANDLE}.
+
+If @code{fd} is still not @code{INVALID_HANDLE} after the call to this
+function, @command{gawk} calls the regular @code{close()} system call.
+
+Having a ``teardown'' function is optional. If your input parser does
+not need it, do not set this field.  Then, @command{gawk} calls the
+regular @code{close()} system call on the file descriptor, so it should
+be valid.
+@end table
+
+The @code{@var{XXX}_get_record()} function does the work of creating
+input records.  The parameters are as follows:
+
+@table @code
+@item char **out
+This is a pointer to a @code{char *} variable that is set to point
+to the record.  @command{gawk} makes its own copy of the data, so
+the extension must manage this storage.
+
+@item struct awk_input *iobuf
+This is the @code{awk_input_buf_t} for the file.  The fields should be
+used for reading data (@code{fd}) and for managing private state
+(@code{opaque}), if any.
+
+@item int *errcode
+If an error occurs, @code{*errcode} should be set to an appropriate
+code from @code{<errno.h>}.
+
+@item char **rt_start
+@itemx size_t *rt_len
+If the concept of a ``record terminator'' makes sense, then
+@code{*rt_start} should be set to point to the data to be used for
+@code{RT}, and @code{*rt_len} should be set to the length of the
+data. Otherwise, @code{*rt_len} should be set to zero.
+@command{gawk} makes its own copy of this data, so the
+extension must manage this storage.
+
+@item const awk_fieldwidth_info_t **field_width
+If @code{field_width} is not @code{NULL}, then @code{*field_width} will be initialized
+to @code{NULL}, and the function may set it to point to a structure
+supplying field width information to override the default
+field parsing mechanism. Note that this structure will not
+be copied by @command{gawk}; it must persist at least until the next call
+to @code{get_record} or @code{close_func}. Note also that @code{field_width} is
+@code{NULL} when @code{getline} is assigning the results to a variable, thus
+field parsing is not needed. If the parser does set @code{*field_width},
+then @command{gawk} uses this layout to parse the input record,
+and the @code{PROCINFO["FS"]} value will be @code{"API"} while this record
+is active in @code{$0}.
+The @code{awk_fieldwidth_info_t} data structure
+is described below.
+@end table
+
+The return value is the length of the buffer pointed to by
+@code{*out}, or @code{EOF} if end-of-file was reached or an
+error occurred.
+
+It is guaranteed that @code{errcode} is a valid pointer, so there is no
+need to test for a @code{NULL} value.  @command{gawk} sets @code{*errcode}
+to zero, so there is no need to set it unless an error occurs.
+
+If an error does occur, the function should return @code{EOF} and set
+@code{*errcode} to a value greater than zero.  In that case, if @code{*errcode}
+does not equal zero, @command{gawk} automatically updates
+the @code{ERRNO} variable based on the value of @code{*errcode}.
+(In general, setting @samp{*errcode = errno} should do the right thing.)
+
+As an alternative to supplying a function that returns an input record,
+you may instead supply a function that simply reads bytes, and let
+@command{gawk} parse the data into records.  If you do so, the data
+should be returned in the multibyte encoding of the current locale.
+Such a function should follow the same behavior as the @code{read()}
+system call, and you fill in the @code{read_func} pointer with its
+address in the @code{awk_input_buf_t} structure.
+
+By default, @command{gawk} sets the @code{read_func} pointer to
+point to the @code{read()} system call. So your extension need not
+set this field explicitly.
+
+@quotation NOTE
+You must choose one method or the other: either a function that
+returns a record, or one that returns raw data.  In particular,
+if you supply a function to get a record, @command{gawk} will
+call it, and will never call the raw read function.
+@end quotation
+
+@command{gawk} ships with a sample extension that reads directories,
+returning records for each entry in a directory (@pxref{Extension
+Sample Readdir}).  You may wish to use that code as a guide for writing
+your own input parser.
+
+When writing an input parser, you should think about (and document)
+how it is expected to interact with @command{awk} code.  You may want
+it to always be called, and to take effect as appropriate (as the
+@code{readdir} extension does).  Or you may want it to take effect
+based upon the value of an @command{awk} variable, as the XML extension
+from the @code{gawkextlib} project does (@pxref{gawkextlib}).
+In the latter case, code in a @code{BEGINFILE} rule
+can look at @code{FILENAME} and @code{ERRNO} to decide whether or
+not to activate an input parser (@pxref{BEGINFILE/ENDFILE}).
+
+You register your input parser with the following function:
+
+@table @code
+@item void register_input_parser(awk_input_parser_t *input_parser);
+Register the input parser pointed to by @code{input_parser} with
+@command{gawk}.
+@end table
+
+If you would like to override the default field parsing mechanism for a given
+record, then you must populate an @code{awk_fieldwidth_info_t} structure,
+which looks like this:
+
+@example
+typedef struct @{
+        awk_bool_t     use_chars; /* false ==> use bytes */
+        size_t         nf;        /* number of fields in record (NF) */
+        struct awk_field_info @{
+                size_t skip;      /* amount to skip before field starts */
+                size_t len;       /* length of field */
+        @} fields[1];              /* actual dimension should be nf */
+@} awk_fieldwidth_info_t;
+@end example
+
+The fields are:
+
+@table @code
+@item awk_bool_t use_chars;
+Set this to @code{awk_true} if the field lengths are specified in terms
+of potentially multi-byte characters, and set it to @code{awk_false} if
+the lengths are in terms of bytes.
+Performance will be better if the values are supplied in
+terms of bytes. 
+
+@item size_t nf;
+Set this to the number of fields in the input record, i.e. @code{NF}.
+
+@item struct awk_field_info fields[nf];
+This is a variable-length array whose actual dimension should be @code{nf}.
+For each field, the @code{skip} element should be set to the number
+of characters or bytes, as controlled by the @code{use_chars} flag,
+to skip before the start of this field. The @code{len} element provides
+the length of the field. The values in @code{fields[0]} provide the information
+for @code{$1}, and so on through the @code{fields[nf-1]} element containing the information for @code{$NF}.
+@end table
+
+A convenience macro @code{awk_fieldwidth_info_size(numfields)} is provided to
+calculate the appropriate size of a variable-length 
+@code{awk_fieldwidth_info_t} structure containing @code{numfields} fields. This can
+be used as an argument to @code{malloc()} or in a union to allocate space
+statically. Please refer to the @code{readdir_test} sample extension for an
+example.
+
+@node Output Wrappers
+@subsubsection Customized Output Wrappers
+@cindex customized output wrapper
+
+@cindex output wrapper
+An @dfn{output wrapper} is the mirror image of an input parser.
+It allows an extension to take over the output to a file opened
+with the @samp{>} or @samp{>>} I/O redirection operators (@pxref{Redirection}).
+
+The output wrapper is very similar to the input parser structure:
+
+@example
+typedef struct awk_output_wrapper @{
+    const char *name;   /* name of the wrapper */
+    awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
+    awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
+    awk_const struct awk_output_wrapper *awk_const next;  /* for gawk */
+@} awk_output_wrapper_t;
+@end example
+
+The members are as follows:
+
+@table @code
+@item const char *name;
+This is the name of the output wrapper.
+
+@item awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
+This points to a function that examines the information in
+the @code{awk_output_buf_t} structure pointed to by @code{outbuf}.
+It should return true if the output wrapper wants to take over the
+file, and false otherwise.  It should not change any state (variable
+values, etc.) within @command{gawk}.
+
+@item awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
+The function pointed to by this field is called when @command{gawk}
+decides to let the output wrapper take control of the file. It should
+fill in appropriate members of the @code{awk_output_buf_t} structure,
+as described next, and return true if successful, false otherwise.
+
+@item awk_const struct output_wrapper *awk_const next;
+This is for use by @command{gawk};
+therefore it is marked @code{awk_const} so that the extension cannot
+modify it.
+@end table
+
+The @code{awk_output_buf_t} structure looks like this:
+
+@example
+typedef struct awk_output_buf @{
+    const char *name;   /* name of output file */
+    const char *mode;   /* mode argument to fopen */
+    FILE *fp;           /* stdio file pointer */
+    awk_bool_t redirected;  /* true if a wrapper is active */
+    void *opaque;       /* for use by output wrapper */
+    size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
+                FILE *fp, void *opaque);
+    int (*gawk_fflush)(FILE *fp, void *opaque);
+    int (*gawk_ferror)(FILE *fp, void *opaque);
+    int (*gawk_fclose)(FILE *fp, void *opaque);
+@} awk_output_buf_t;
+@end example
+
+Here too, your extension will define @code{@var{XXX}_can_take_file()}
+and @code{@var{XXX}_take_control_of()} functions that examine and update
+data members in the @code{awk_output_buf_t}.
+The data members are as follows:
+
+@table @code
+@item const char *name;
+The name of the output file.
+
+@item const char *mode;
+The mode string (as would be used in the second argument to @code{fopen()})
+with which the file was opened.
+
+@item FILE *fp;
+The @code{FILE} pointer from @code{<stdio.h>}. @command{gawk} opens the file
+before attempting to find an output wrapper.
+
+@item awk_bool_t redirected;
+This field must be set to true by the @code{@var{XXX}_take_control_of()} function.
+
+@item void *opaque;
+This pointer is opaque to @command{gawk}. The extension should use it to store
+a pointer to any private data associated with the file.
+
+@item size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ FILE *fp, void *opaque);
+@itemx int (*gawk_fflush)(FILE *fp, void *opaque);
+@itemx int (*gawk_ferror)(FILE *fp, void *opaque);
+@itemx int (*gawk_fclose)(FILE *fp, void *opaque);
+These pointers should be set to point to functions that perform
+the equivalent function as the @code{<stdio.h>} functions do, if appropriate.
+@command{gawk} uses these function pointers for all output.
+@command{gawk} initializes the pointers to point to internal ``pass-through''
+functions that just call the regular @code{<stdio.h>} functions, so an
+extension only needs to redefine those functions that are appropriate for
+what it does.
+@end table
+
+The @code{@var{XXX}_can_take_file()} function should make a decision based
+upon the @code{name} and @code{mode} fields, and any additional state
+(such as @command{awk} variable values) that is appropriate.
+
+When @command{gawk} calls @code{@var{XXX}_take_control_of()}, that function should fill
+in the other fields as appropriate, except for @code{fp}, which it should just
+use normally.
+
+You register your output wrapper with the following function:
+
+@table @code
+@item void register_output_wrapper(awk_output_wrapper_t *output_wrapper);
+Register the output wrapper pointed to by @code{output_wrapper} with
+@command{gawk}.
+@end table
+
+@node Two-way processors
+@subsubsection Customized Two-way Processors
+@cindex customized two-way processor
+
+A @dfn{two-way processor} combines an input parser and an output wrapper for
+two-way I/O with the @samp{|&} operator (@pxref{Redirection}).  It makes identical
+use of the @code{awk_input_parser_t} and @code{awk_output_buf_t} structures
+as described earlier.
+
+A two-way processor is represented by the following structure:
+
+@example
+typedef struct awk_two_way_processor @{
+    const char *name;   /* name of the two-way processor */
+    awk_bool_t (*can_take_two_way)(const char *name);
+    awk_bool_t (*take_control_of)(const char *name,
+                                  awk_input_buf_t *inbuf,
+                                  awk_output_buf_t *outbuf);
+    awk_const struct awk_two_way_processor *awk_const next;  /* for gawk */
+@} awk_two_way_processor_t;
+@end example
+
+The fields are as follows:
+
+@table @code
+@item const char *name;
+The name of the two-way processor.
+
+@item awk_bool_t (*can_take_two_way)(const char *name);
+The function pointed to by this field should return true if it wants to take over two-way I/O for this @value{FN}.
+It should not change any state (variable
+values, etc.) within @command{gawk}.
+
+@item awk_bool_t (*take_control_of)(const char *name,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_input_buf_t *inbuf,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_output_buf_t *outbuf);
+The function pointed to by this field should fill in the @code{awk_input_buf_t} and
+@code{awk_output_buf_t} structures pointed to by @code{inbuf} and
+@code{outbuf}, respectively.  These structures were described earlier.
+
+@item awk_const struct two_way_processor *awk_const next;
+This is for use by @command{gawk};
+therefore it is marked @code{awk_const} so that the extension cannot
+modify it.
+@end table
+
+As with the input parser and output processor, you provide
+``yes I can take this'' and ``take over for this'' functions,
+@code{@var{XXX}_can_take_two_way()} and @code{@var{XXX}_take_control_of()}.
+
+You register your two-way processor with the following function:
+
+@table @code
+@item void register_two_way_processor(awk_two_way_processor_t *two_way_processor);
+Register the two-way processor pointed to by @code{two_way_processor} with
+@command{gawk}.
+@end table
+
+@node Printing Messages
+@subsection Printing Messages
+@cindex printing messages from extensions
+@cindex messages from extensions
+
+You can print different kinds of warning messages from your
+extension, as described here.  Note that for these functions,
+you must pass in the extension ID received from @command{gawk}
+when the extension was loaded:@footnote{Because the API uses only ISO C 90
+features, it cannot make use of the ISO C 99 variadic macro feature to hide
+that parameter. More's the pity.}
+
+@table @code
+@item void fatal(awk_ext_id_t id, const char *format, ...);
+Print a message and then cause @command{gawk} to exit immediately.
+
+@item void nonfatal(awk_ext_id_t id, const char *format, ...);
+Print a nonfatal error message.
+
+@item void warning(awk_ext_id_t id, const char *format, ...);
+Print a warning message.
+
+@item void lintwarn(awk_ext_id_t id, const char *format, ...);
+Print a ``lint warning.''  Normally this is the same as printing a
+warning message, but if @command{gawk} was invoked with @samp{--lint=fatal},
+then lint warnings become fatal error messages.
+@end table
+
+All of these functions are otherwise like the C @code{printf()}
+family of functions, where the @code{format} parameter is a string
+with literal characters and formatting codes intermixed.
+
+@node Updating @code{ERRNO}
+@subsection Updating @code{ERRNO}
+
+The following functions allow you to update the @code{ERRNO}
+variable:
+
+@table @code
+@item void update_ERRNO_int(int errno_val);
+Set @code{ERRNO} to the string equivalent of the error code
+in @code{errno_val}. The value should be one of the defined
+error codes in @code{<errno.h>}, and @command{gawk} turns it
+into a (possibly translated) string using the C @code{strerror()} function.
+
+@item void update_ERRNO_string(const char *string);
+Set @code{ERRNO} directly to the string value of @code{ERRNO}.
+@command{gawk} makes a copy of the value of @code{string}.
+
+@item void unset_ERRNO(void);
+Unset @code{ERRNO}.
+@end table
+
+@node Requesting Values
+@subsection Requesting Values
+
+All of the functions that return values from @command{gawk}
+work in the same way. You pass in an @code{awk_valtype_t} value
+to indicate what kind of value you expect.  If the actual value
+matches what you requested, the function returns true and fills
+in the @code{awk_value_t} result.
+Otherwise, the function returns false, and the @code{val_type}
+member indicates the type of the actual value.  You may then
+print an error message or reissue the request for the actual
+value type, as appropriate.  This behavior is summarized in
+@ref{table-value-types-returned}.
+
+@float Table,table-value-types-returned
+@caption{API value types returned}
+@docbook
+<informaltable>
+<tgroup cols="8">
+  <colspec colname="c1"/>
+  <colspec colname="c2"/>
+  <colspec colname="c3"/>
+  <colspec colname="c4"/>
+  <colspec colname="c5"/>
+  <colspec colname="c6"/>
+  <colspec colname="c7"/>
+  <colspec colname="c8"/>
+  <spanspec spanname="hspan" namest="c3" nameend="c8" align="center"/>
+  <thead>
+    <row><entry></entry><entry spanname="hspan"><para>Type of Actual Value</para></entry></row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry><para>String</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>Regex</para></entry>
+      <entry><para>Array</para></entry>
+      <entry><para>Undefined</para></entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">String</emphasis></para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Strnum</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Number</emphasis></para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry><para><emphasis role="bold">Type</emphasis></para></entry>
+      <entry><para><emphasis role="bold">Regex</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>Regex</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry><para><emphasis role="bold">Requested</emphasis></para></entry>
+      <entry><para><emphasis role="bold">Array</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>Array</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Scalar</emphasis></para></entry>
+      <entry><para>Scalar</para></entry>
+      <entry><para>Scalar</para></entry>
+      <entry><para>Scalar</para></entry>
+      <entry><para>Scalar</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Undefined</emphasis></para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>Regex</para></entry>
+      <entry><para>Array</para></entry>
+      <entry><para>Undefined</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Value cookie</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+  </tbody>
+</tgroup>
+</informaltable>
+@end docbook
+
+@ifnotplaintext
+@ifnotdocbook
+@multitable @columnfractions .50 .50
+@headitem @tab Type of Actual Value
+@end multitable
+@c 10/2014: Thanks to Karl Berry for this bit to reduce the space:
+@tex
+\vglue-1.1\baselineskip
+@end tex
+@c @multitable @columnfractions .166 .166 .198 .15 .15 .166
+@multitable {Requested} {Undefined} {Number} {Number} {Scalar} {Regex} {Array} {Undefined}
+@headitem @tab @tab String @tab Strnum @tab Number @tab Regex @tab Array @tab Undefined
+@item @tab @b{String} @tab String @tab String @tab String @tab String @tab false @tab false
+@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false
+@item @tab @b{Number} @tab Number @tab Number @tab Number @tab false @tab false @tab false
+@item @b{Type} @tab @b{Regex} @tab false @tab false @tab false @tab Regex @tab false @tab false
+@item @b{Requested} @tab @b{Array} @tab false @tab false @tab false @tab false @tab Array @tab false
+@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false
+@item @tab @b{Undefined} @tab String @tab Strnum @tab Number @tab Regex @tab Array @tab Undefined
+@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false
+@end multitable
+@end ifnotdocbook
+@end ifnotplaintext
+@ifplaintext
+@verbatim
+                        +-------------------------------------------------------+
+                        |                   Type of Actual Value:               |
+                        +--------+--------+--------+--------+-------+-----------+
+                        | String | Strnum | Number | Regex  | Array | Undefined |
++-----------+-----------+--------+--------+--------+--------+-------+-----------+
+|           | String    | String | String | String | String | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Strnum    | false  | Strnum | Strnum | false  | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Number    | Number | Number | Number | false  | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Regex     | false  | false  | false  | Regex  | false | false     |
+|   Type    +-----------+--------+--------+--------+--------+-------+-----------+
+| Requested | Array     | false  | false  | false  | false  | Array | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Scalar    | Scalar | Scalar | Scalar | Scalar | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Undefined | String | Strnum | Number | Regex  | Array | Undefined |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Value     | false  | false  | false  | false  | false | false     |
+|           | Cookie    |        |        |        |        |       |           |
++-----------+-----------+--------+--------+--------+--------+-------+-----------+
+@end verbatim
+@end ifplaintext
+@end float
+
+@node Accessing Parameters
+@subsection Accessing and Updating Parameters
+
+Two functions give you access to the arguments (parameters)
+passed to your extension function. They are:
+
+@table @code
+@item awk_bool_t get_argument(size_t count,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+Fill in the @code{awk_value_t} structure pointed to by @code{result}
+with the @code{count}th argument.  Return true if the actual
+type matches @code{wanted}, and false otherwise.  In the latter
+case, @code{result@w{->}val_type} indicates the actual type
+(@pxref{table-value-types-returned}).  Counts are zero-based---the first
+argument is numbered zero, the second one, and so on. @code{wanted}
+indicates the type of value expected.
+
+@item awk_bool_t set_argument(size_t count, awk_array_t array);
+Convert a parameter that was undefined into an array; this provides
+call by reference for arrays.  Return false if @code{count} is too big,
+or if the argument's type is not undefined.  @xref{Array Manipulation}
+for more information on creating arrays.
+@end table
+
+@node Symbol Table Access
+@subsection Symbol Table Access
+@cindex accessing global variables from extensions
+
+Two sets of routines provide access to global variables, and one set
+allows you to create and release cached values.
+
+@menu
+* Symbol table by name::        Accessing variables by name.
+* Symbol table by cookie::      Accessing variables by ``cookie''.
+* Cached values::               Creating and using cached values.
+@end menu
+
+@node Symbol table by name
+@subsubsection Variable Access and Update by Name
+
+The following routines provide the ability to access and update
+global @command{awk}-level variables by name.  In compiler terminology,
+identifiers of different kinds are termed @dfn{symbols}, thus the ``sym''
+in the routines' names.  The data structure that stores information
+about symbols is termed a @dfn{symbol table}.
+The functions are as follows:
+
+@table @code
+@item awk_bool_t sym_lookup(const char *name,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+Fill in the @code{awk_value_t} structure pointed to by @code{result}
+with the value of the variable named by the string @code{name}, which is
+a regular C string.  @code{wanted} indicates the type of value expected.
+Return true if the actual type matches @code{wanted}, and false otherwise.
+In the latter case, @code{result->val_type} indicates the actual type
+(@pxref{table-value-types-returned}).
+
+@item awk_bool_t sym_lookup_ns(const char *name,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const char *name_space,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+This is like @code{sym_lookup()}, but the @code{name_space} parameter allows you
+to specify which namespace @code{name} is part of.  @code{name_space} cannot be
+@code{NULL}. If it is @code{""} or @code{"awk"}, then @code{name} is searched
+for in the default @code{awk} namespace.
+
+Note that @code{namespace} is a C++ keyword. For interoperability with C++,
+you should avoid using that identifier in C code.
+
+@item awk_bool_t sym_update(const char *name, awk_value_t *value);
+Update the variable named by the string @code{name}, which is a regular
+C string.  The variable is added to @command{gawk}'s symbol table
+if it is not there.  Return true if everything worked, and false otherwise.
+
+Changing types (scalar to array or vice versa) of an existing variable
+is @emph{not} allowed, nor may this routine be used to update an array.
+This routine cannot be used to update any of the predefined
+variables (such as @code{ARGC} or @code{NF}).
+
+@item awk_bool_t sym_update_ns(const char *name_space, const char *name, awk_value_t *value);
+This is like @code{sym_update()}, but the @code{name_space} parameter allows you
+to specify which namespace @code{name} is part of.  @code{name_space} cannot be
+@code{NULL}. If it is @code{""} or @code{"awk}, then @code{name} is searched
+for in the default @code{awk} namespace.
+@end table
+
+An extension can look up the value of @command{gawk}'s special variables.
+However, with the exception of the @code{PROCINFO} array, an extension
+cannot change any of those variables.
+
+When searching for or updating variables outside the @code{awk} namespace
+(@pxref{Namespaces}), function and variable names must be simple
+identifiers.@footnote{Allowing both namespace plus identifier and
+@code{foo::bar} would have been too confusing to document, and to code
+and test.} In addition, namespace names and variable and function names
+must follow the rules given in @ref{Naming Rules}.
+
+@node Symbol table by cookie
+@subsubsection Variable Access and Update by Cookie
+
+A @dfn{scalar cookie} is an opaque handle that provides access
+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}.
+
+@need 1500
+The following functions let you work with scalar cookies:
+
+@table @code
+@item awk_bool_t sym_lookup_scalar(awk_scalar_t cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+Retrieve the current value of a scalar cookie.
+Once you have obtained a scalar cookie using @code{sym_lookup()}, you can
+use this function to get its value more efficiently.
+Return false if the value cannot be retrieved.
+
+@item awk_bool_t sym_update_scalar(awk_scalar_t cookie, awk_value_t *value);
+Update the value associated with a scalar cookie.  Return false if
+the new value is not of type @code{AWK_STRING}, @code{AWK_STRNUM}, @code{AWK_REGEX}, or @code{AWK_NUMBER}.
+Here too, the predefined variables may not be updated.
+@end table
+
+It is not obvious at first glance how to work with scalar cookies or
+what their @i{raison d'@^etre} really is.  In theory, the @code{sym_lookup()}
+and @code{sym_update()} routines are all you really need to work with
+variables.  For example, you might have code that looks up the value of
+a variable, evaluates a condition, and then possibly changes the value
+of the variable based on the result of that evaluation, like so:
+
+@example
+/*  do_magic --- do something really great */
+
+static awk_value_t *
+do_magic(int nargs, awk_value_t *result)
+@{
+    awk_value_t value;
+
+    if (   sym_lookup("MAGIC_VAR", AWK_NUMBER, & value)
+        && some_condition(value.num_value)) @{
+            value.num_value += 42;
+            sym_update("MAGIC_VAR", & value);
+    @}
+
+    return make_number(0.0, result);
+@}
+@end example
+
+@noindent
+This code looks (and is) simple and straightforward. So what's the problem?
+
+Well, consider what happens if @command{awk}-level code associated
+with your extension calls the @code{magic()} function (implemented in
+C by @code{do_magic()}), once per record, while processing hundreds
+of thousands or millions of records.  The @code{MAGIC_VAR} variable is
+looked up in the symbol table once or twice per function call!
+
+The symbol table lookup is really pure overhead; it is considerably
+more efficient to get a cookie that represents the variable, and use
+that to get the variable's value and update it as needed.@footnote{The
+difference is measurable and quite real. Trust us.}
+
+Thus, the way to use cookies is as follows.  First, install
+your extension's variable in @command{gawk}'s symbol table using
+@code{sym_update()}, as usual. Then get a scalar cookie for the variable
+using @code{sym_lookup()}:
+
+@example
+@group
+static awk_scalar_t magic_var_cookie;    /* cookie for MAGIC_VAR */
+
+static void
+my_extension_init()
+@{
+    awk_value_t value;
+@end group
+
+    /* install initial value */
+    sym_update("MAGIC_VAR", make_number(42.0, & value));
+
+    /* get the cookie */
+    sym_lookup("MAGIC_VAR", AWK_SCALAR, & value);
+
+    /* save the cookie */
+    magic_var_cookie = value.scalar_cookie;
+    @dots{}
+@}
+@end example
+
+Next, use the routines in this @value{SECTION} for retrieving and updating
+the value through the cookie.  Thus, @code{do_magic()} now becomes
+something like this:
+
+@example
+/*  do_magic --- do something really great */
+
+static awk_value_t *
+do_magic(int nargs, awk_value_t *result)
+@{
+    awk_value_t value;
+
+    if (   sym_lookup_scalar(magic_var_cookie, AWK_NUMBER, & value)
+        && some_condition(value.num_value)) @{
+            value.num_value += 42;
+            sym_update_scalar(magic_var_cookie, & value);
+    @}
+    @dots{}
+
+    return make_number(0.0, result);
+@}
+@end example
+
+@quotation NOTE
+The previous code omitted error checking for
+presentation purposes.  Your extension code should be more robust
+and carefully check the return values from the API functions.
+@end quotation
+
+@node Cached values
+@subsubsection Creating and Using Cached Values
+
+The routines in this @value{SECTION} allow you to create and release
+cached values.  Like scalar cookies, in theory, cached values
+are not necessary. You can create numbers and strings using
+the functions in @ref{Constructor Functions}. You can then
+assign those values to variables using @code{sym_update()}
+or @code{sym_update_scalar()}, as you like.
+
+However, you can understand the point of cached values if you remember that
+@emph{every} string value's storage @emph{must} come from @code{gawk_malloc()},
+@code{gawk_calloc()}, or @code{gawk_realloc()}.
+If you have 20 variables, all of which have the same string value, you
+must create 20 identical copies of the string.@footnote{Numeric values
+are clearly less problematic, requiring only a C @code{double} to store.
+But of course, GMP and MPFR values @emph{do} take up more memory.}
+
+It is clearly more efficient, if possible, to create a value once, and
+then tell @command{gawk} to reuse the value for multiple variables. That
+is what the routines in this @value{SECTION} let you do.  The functions are as follows:
+
+@table @code
+@item awk_bool_t create_value(awk_value_t *value, awk_value_cookie_t *result);
+Create a cached string or numeric value from @code{value} for
+efficient later assignment.  Only values of type @code{AWK_NUMBER}, @code{AWK_REGEX}, @code{AWK_STRNUM},
+and @code{AWK_STRING} are allowed.  Any other type is rejected.
+@code{AWK_UNDEFINED} could be allowed, but doing so would result in
+inferior performance.
+
+@item awk_bool_t release_value(awk_value_cookie_t vc);
+Release the memory associated with a value cookie obtained
+from @code{create_value()}.
+@end table
+
+You use value cookies in a fashion similar to the way you use scalar cookies.
+In the extension initialization routine, you create the value cookie:
+
+@example
+static awk_value_cookie_t answer_cookie;  /* static value cookie */
+
+static void
+my_extension_init()
+@{
+    awk_value_t value;
+    char *long_string;
+    size_t long_string_len;
+
+    /* code from earlier */
+    @dots{}
+    /* @dots{} fill in long_string and long_string_len @dots{} */
+    make_malloced_string(long_string, long_string_len, & value);
+    create_value(& value, & answer_cookie);    /* create cookie */
+    @dots{}
+@}
+@end example
+
+Once the value is created, you can use it as the value of any number
+of variables:
+
+@example
+static awk_value_t *
+do_magic(int nargs, awk_value_t *result)
+@{
+    awk_value_t new_value;
+
+    @dots{}    /* as earlier */
+
+    value.val_type = AWK_VALUE_COOKIE;
+    value.value_cookie = answer_cookie;
+    sym_update("VAR1", & value);
+    sym_update("VAR2", & value);
+    @dots{}
+    sym_update("VAR100", & value);
+    @dots{}
+@}
+@end example
+
+@noindent
+Using value cookies in this way saves considerable storage, as all of
+@code{VAR1} through @code{VAR100} share the same value.
+
+You might be wondering, ``Is this sharing problematic?
+What happens if @command{awk} code assigns a new value to @code{VAR1};
+are all the others changed too?''
+
+That's a great question. The answer is that no, it's not a problem.
+Internally, @command{gawk} uses @dfn{reference-counted strings}. This means
+that many variables can share the same string value, and @command{gawk}
+keeps track of the usage.  When a variable's value changes, @command{gawk}
+simply decrements the reference count on the old value and updates
+the variable to use the new value.
+
+Finally, as part of your cleanup action (@pxref{Exit Callback Functions})
+you should release any cached values that you created, using
+@code{release_value()}.
+
+@node Array Manipulation
+@subsection Array Manipulation
+@cindex array manipulation in extensions
+@cindex extensions, array manipulation in
+
+The primary data structure@footnote{OK, the only data structure.} in @command{awk}
+is the associative array (@pxref{Arrays}).
+Extensions need to be able to manipulate @command{awk} arrays.
+The API provides a number of data structures for working with arrays,
+functions for working with individual elements, and functions for
+working with arrays as a whole. This includes the ability to
+``flatten'' an array so that it is easy for C code to traverse
+every element in an array.  The array data structures integrate
+nicely with the data structures for values to make it easy to
+both work with and create true arrays of arrays (@pxref{General Data Types}).
+
+@menu
+* Array Data Types::            Data types for working with arrays.
+* Array Functions::             Functions for working with arrays.
+* Flattening Arrays::           How to flatten arrays.
+* Creating Arrays::             How to create and populate arrays.
+@end menu
+
+@node Array Data Types
+@subsubsection Array Data Types
+
+The data types associated with arrays are as follows:
+
+@table @code
+@item typedef void *awk_array_t;
+If you request the value of an array variable, you get back an
+@code{awk_array_t} value. This value is opaque@footnote{It is also
+a ``cookie,'' but the @command{gawk} developers did not wish to overuse this
+term.} to the extension; it uniquely identifies the array but can
+only be used by passing it into API functions or receiving it from API
+functions. This is very similar to way @samp{FILE *} values are used
+with the @code{<stdio.h>} library routines.
+
+@item typedef struct awk_element @{
+@itemx @ @ @ @ /* convenience linked list pointer, not used by gawk */
+@itemx @ @ @ @ struct awk_element *next;
+@itemx @ @ @ @ enum @{
+@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DEFAULT = 0,@ @ /* set by gawk */
+@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DELETE = 1@ @ @ @ /* set by extension */
+@itemx @ @ @ @ @} flags;
+@itemx @ @ @ @ awk_value_t    index;
+@itemx @ @ @ @ awk_value_t    value;
+@itemx @} awk_element_t;
+The @code{awk_element_t} is a ``flattened''
+array element. @command{awk} produces an array of these
+inside the @code{awk_flat_array_t} (see the next item).
+Individual elements may be marked for deletion. New elements must be added
+individually, one at a time, using the separate API for that purpose.
+The fields are as follows:
+
+@c nested table
+@table @code
+@item struct awk_element *next;
+This pointer is for the convenience of extension writers.  It allows
+an extension to create a linked list of new elements that can then be
+added to an array in a loop that traverses the list.
+
+@item enum @{ @dots{} @} flags;
+A set of flag values that convey information between the extension
+and @command{gawk}.  Currently there is only one: @code{AWK_ELEMENT_DELETE}.
+Setting it causes @command{gawk} to delete the
+element from the original array upon release of the flattened array.
+
+@item index
+@itemx value
+The index and value of the element, respectively.
+@emph{All} memory pointed to by @code{index} and @code{value} belongs to @command{gawk}.
+@end table
+
+@item typedef struct awk_flat_array @{
+@itemx @ @ @ @ awk_const void *awk_const opaque1;@ @ @ @ /* for use by gawk */
+@itemx @ @ @ @ awk_const void *awk_const opaque2;@ @ @ @ /* for use by gawk */
+@itemx @ @ @ @ awk_const size_t count;@ @ @ @ @ /* how many elements */
+@itemx @ @ @ @ awk_element_t elements[1];@ @ /* will be extended */
+@itemx @} awk_flat_array_t;
+This is a flattened array. When an extension gets one of these
+from @command{gawk}, the @code{elements} array is of actual
+size @code{count}.
+The @code{opaque1} and @code{opaque2} pointers are for use by @command{gawk};
+therefore they are marked @code{awk_const} so that the extension cannot
+modify them.
+@end table
+
+@node Array Functions
+@subsubsection Array Functions
+
+The following functions relate to individual array elements:
+
+@table @code
+@item awk_bool_t get_element_count(awk_array_t a_cookie, size_t *count);
+For the array represented by @code{a_cookie}, place in @code{*count}
+the number of elements it contains. A subarray counts as a single element.
+Return false if there is an error.
+
+@item awk_bool_t get_array_element(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t *const index,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+For the array represented by @code{a_cookie}, return in @code{*result}
+the value of the element whose index is @code{index}.
+@code{wanted} specifies the type of value you wish to retrieve.
+Return false if @code{wanted} does not match the actual type or if
+@code{index} is not in the array (@pxref{table-value-types-returned}).
+
+The value for @code{index} can be numeric, in which case @command{gawk}
+converts it to a string. Using nonintegral values is possible, but
+requires that you understand how such values are converted to strings
+(@pxref{Conversion}); thus, using integral values is safest.
+
+As with @emph{all} strings passed into @command{gawk} from an extension,
+the string value of @code{index} must come from @code{gawk_malloc()},
+@code{gawk_calloc()}, or @code{gawk_realloc()}, and
+@command{gawk} releases the storage.
+
+@item awk_bool_t set_array_element(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const index,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const value);
+In the array represented by @code{a_cookie}, create or modify
+the element whose index is given by @code{index}.
+The @code{ARGV} and @code{ENVIRON} arrays may not be changed,
+although the @code{PROCINFO} array can be.
+
+@item awk_bool_t set_array_element_by_elem(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_element_t element);
+Like @code{set_array_element()}, but take the @code{index} and @code{value}
+from @code{element}. This is a convenience macro.
+
+@item awk_bool_t del_array_element(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t* const index);
+Remove the element with the given index from the array
+represented by @code{a_cookie}.
+Return true if the element was removed, or false if the element did
+not exist in the array.
+@end table
+
+The following functions relate to arrays as a whole:
+
+@table @code
+@item awk_array_t create_array(void);
+Create a new array to which elements may be added.
+@xref{Creating Arrays} for a discussion of how to
+create a new array and add elements to it.
+
+@item awk_bool_t clear_array(awk_array_t a_cookie);
+Clear the array represented by @code{a_cookie}.
+Return false if there was some kind of problem, true otherwise.
+The array remains an array, but after calling this function, it
+has no elements. This is equivalent to using the @code{delete}
+statement (@pxref{Delete}).
+
+@item awk_bool_t flatten_array_typed(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_flat_array_t **data,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t index_type,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t value_type);
+For the array represented by @code{a_cookie}, create an @code{awk_flat_array_t}
+structure and fill it in with indices and values of the requested types.
+Set the pointer whose address is passed as @code{data}
+to point to this structure.
+Return true upon success, or false otherwise.
+@ifset FOR_PRINT
+See the next @value{SECTION}
+@end ifset
+@ifclear FOR_PRINT
+@xref{Flattening Arrays},
+@end ifclear
+for a discussion of how to
+flatten an array and work with it.
+
+@item awk_bool_t flatten_array(awk_array_t a_cookie, awk_flat_array_t **data);
+For the array represented by @code{a_cookie}, create an @code{awk_flat_array_t}
+structure and fill it in with @code{AWK_STRING} indices and
+@code{AWK_UNDEFINED} values.
+This is superseded by @code{flatten_array_typed()}.
+It is provided as a macro, and remains for convenience and for source code
+compatibility with the previous version of the API.
+
+@item awk_bool_t release_flattened_array(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_flat_array_t *data);
+When done with a flattened array, release the storage using this function.
+You must pass in both the original array cookie and the address of
+the created @code{awk_flat_array_t} structure.
+The function returns true upon success, false otherwise.
+@end table
+
+@node Flattening Arrays
+@subsubsection Working With All The Elements of an Array
+
+To @dfn{flatten} an array is to create a structure that
+represents the full array in a fashion that makes it easy
+for C code to traverse the entire array.  Some of the code
+in @file{extension/testext.c} does this, and also serves
+as a nice example showing how to use the APIs.
+
+We walk through that part of the code one step at a time.
+First, the @command{gawk} script that drives the test extension:
+
+@example
+@@load "testext"
+BEGIN @{
+    n = split("blacky rusty sophie raincloud lucky", pets)
+    printf("pets has %d elements\n", length(pets))
+    ret = dump_array_and_delete("pets", "3")
+    printf("dump_array_and_delete(pets) returned %d\n", ret)
+    if ("3" in pets)
+        printf("dump_array_and_delete() did NOT remove index \"3\"!\n")
+    else
+        printf("dump_array_and_delete() did remove index \"3\"!\n")
+    print ""
+@}
+@end example
+
+@noindent
+This code creates an array with @code{split()} (@pxref{String Functions})
+and then calls @code{dump_array_and_delete()}. That function looks up
+the array whose name is passed as the first argument, and
+deletes the element at the index passed in the second argument.
+The @command{awk} code then prints the return value and checks if the element
+was indeed deleted.  Here is the C code that implements
+@code{dump_array_and_delete()}. It has been edited slightly for
+presentation.
+
+The first part declares variables, sets up the default
+return value in @code{result}, and checks that the function
+was called with the correct number of arguments:
+
+@example
+static awk_value_t *
+dump_array_and_delete(int nargs, awk_value_t *result)
+@{
+    awk_value_t value, value2, value3;
+    awk_flat_array_t *flat_array;
+    size_t count;
+    char *name;
+    int i;
+
+    assert(result != NULL);
+    make_number(0.0, result);
+
+    if (nargs != 2) @{
+        printf("dump_array_and_delete: nargs not right "
+               "(%d should be 2)\n", nargs);
+        goto out;
+    @}
+@end example
+
+The function then proceeds in steps, as follows. First, retrieve
+the name of the array, passed as the first argument, followed by
+the array itself. If either operation fails, print an
+error message and return:
+
+@example
+    /* get argument named array as flat array and print it */
+    if (get_argument(0, AWK_STRING, & value)) @{
+        name = value.str_value.str;
+        if (sym_lookup(name, AWK_ARRAY, & value2))
+            printf("dump_array_and_delete: sym_lookup of %s passed\n",
+                   name);
+        else @{
+            printf("dump_array_and_delete: sym_lookup of %s failed\n",
+                   name);
+            goto out;
+        @}
+    @} else @{
+        printf("dump_array_and_delete: get_argument(0) failed\n");
+        goto out;
+    @}
+@end example
+
+For testing purposes and to make sure that the C code sees
+the same number of elements as the @command{awk} code,
+the second step is to get the count of elements in the array
+and print it:
+
+@example
+    if (! get_element_count(value2.array_cookie, & count)) @{
+        printf("dump_array_and_delete: get_element_count failed\n");
+        goto out;
+    @}
+
+    printf("dump_array_and_delete: incoming size is %lu\n",
+           (unsigned long) count);
+@end example
+
+The third step is to actually flatten the array, and then
+to double-check that the count in the @code{awk_flat_array_t}
+is the same as the count just retrieved:
+
+@example
+    if (! flatten_array_typed(value2.array_cookie, & flat_array,
+                              AWK_STRING, AWK_UNDEFINED)) @{
+        printf("dump_array_and_delete: could not flatten array\n");
+        goto out;
+    @}
+
+    if (flat_array->count != count) @{
+        printf("dump_array_and_delete: flat_array->count (%lu)"
+               " != count (%lu)\n",
+                (unsigned long) flat_array->count,
+                (unsigned long) count);
+        goto out;
+    @}
+@end example
+
+The fourth step is to retrieve the index of the element
+to be deleted, which was passed as the second argument.
+Remember that argument counts passed to @code{get_argument()}
+are zero-based, and thus the second argument is numbered one:
+
+@example
+    if (! get_argument(1, AWK_STRING, & value3)) @{
+        printf("dump_array_and_delete: get_argument(1) failed\n");
+        goto out;
+    @}
+@end example
+
+The fifth step is where the ``real work'' is done. The function
+loops over every element in the array, printing the index and
+element values. In addition, upon finding the element with the
+index that is supposed to be deleted, the function sets the
+@code{AWK_ELEMENT_DELETE} bit in the @code{flags} field
+of the element.  When the array is released, @command{gawk}
+traverses the flattened array, and deletes any elements that
+have this flag bit set:
+
+@example
+    for (i = 0; i < flat_array->count; i++) @{
+        printf("\t%s[\"%.*s\"] = %s\n",
+            name,
+            (int) flat_array->elements[i].index.str_value.len,
+            flat_array->elements[i].index.str_value.str,
+            valrep2str(& flat_array->elements[i].value));
+
+        if (strcmp(value3.str_value.str,
+                   flat_array->elements[i].index.str_value.str) == 0) @{
+            flat_array->elements[i].flags |= AWK_ELEMENT_DELETE;
+            printf("dump_array_and_delete: marking element \"%s\" "
+                   "for deletion\n",
+                flat_array->elements[i].index.str_value.str);
+        @}
+    @}
+@end example
+
+The sixth step is to release the flattened array. This tells
+@command{gawk} that the extension is no longer using the array,
+and that it should delete any elements marked for deletion.
+@command{gawk} also frees any storage that was allocated,
+so you should not use the pointer (@code{flat_array} in this
+code) once you have called @code{release_flattened_array()}:
+
+@example
+    if (! release_flattened_array(value2.array_cookie, flat_array)) @{
+        printf("dump_array_and_delete: could not release flattened array\n");
+        goto out;
+    @}
+@end example
+
+Finally, because everything was successful, the function sets the
+return value to success, and returns:
+
+@example
+@group
+    make_number(1.0, result);
+out:
+    return result;
+@}
+@end group
+@end example
+
+Here is the output from running this part of the test:
+
+@example
+pets has 5 elements
+dump_array_and_delete: sym_lookup of pets passed
+dump_array_and_delete: incoming size is 5
+        pets["1"] = "blacky"
+        pets["2"] = "rusty"
+        pets["3"] = "sophie"
+dump_array_and_delete: marking element "3" for deletion
+        pets["4"] = "raincloud"
+        pets["5"] = "lucky"
+dump_array_and_delete(pets) returned 1
+dump_array_and_delete() did remove index "3"!
+@end example
+
+@node Creating Arrays
+@subsubsection How To Create and Populate Arrays
+
+Besides working with arrays created by @command{awk} code, you can
+create arrays and populate them as you see fit, and then @command{awk}
+code can access them and manipulate them.
+
+There are two important points about creating arrays from extension code:
+
+@itemize @value{BULLET}
+@item
+You must install a new array into @command{gawk}'s symbol
+table immediately upon creating it.  Once you have done so,
+you can then populate the array.
+
+@ignore
+Strictly speaking, this is required only
+for arrays that will have subarrays as elements; however it is
+a good idea to always do this.  This restriction may be relaxed
+in a subsequent revision of the API.
+@end ignore
+
+Similarly, if installing a new array as a subarray of an existing array,
+you must add the new array to its parent before adding any elements to it.
+
+Thus, the correct way to build an array is to work ``top down.''  Create
+the array, and immediately install it in @command{gawk}'s symbol table
+using @code{sym_update()}, or install it as an element in a previously
+existing array using @code{set_array_element()}.  We show example code shortly.
+
+@item
+Due to @command{gawk} internals, after using @code{sym_update()} to install an array
+into @command{gawk}, you have to retrieve the array cookie from the value
+passed in to @command{sym_update()} before doing anything else with it, like so:
+
+@example
+awk_value_t val;
+awk_array_t new_array;
+
+new_array = create_array();
+val.val_type = AWK_ARRAY;
+val.array_cookie = new_array;
+
+/* install array in the symbol table */
+sym_update("array", & val);
+
+new_array = val.array_cookie;    /* YOU MUST DO THIS */
+@end example
+
+If installing an array as a subarray, you must also retrieve the value
+of the array cookie after the call to @code{set_element()}.
+@end itemize
+
+The following C code is a simple test extension to create an array
+with two regular elements and with a subarray. The leading @code{#include}
+directives and boilerplate variable declarations
+(@pxref{Extension API Boilerplate})
+are omitted for brevity.
+The first step is to create a new array and then install it
+in the symbol table:
+
+@example
+@ignore
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+static const gawk_api_t *api;   /* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "testarray extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+
+@end ignore
+/* create_new_array --- create a named array */
+
+static void
+create_new_array()
+@{
+    awk_array_t a_cookie;
+    awk_array_t subarray;
+    awk_value_t index, value;
+
+    a_cookie = create_array();
+    value.val_type = AWK_ARRAY;
+    value.array_cookie = a_cookie;
+
+    if (! sym_update("new_array", & value))
+        printf("create_new_array: sym_update(\"new_array\") failed!\n");
+    a_cookie = value.array_cookie;
+@end example
+
+@noindent
+Note how @code{a_cookie} is reset from the @code{array_cookie} field in
+the @code{value} structure.
+
+The second step is to install two regular values into @code{new_array}:
+
+@example
+    (void) make_const_string("hello", 5, & index);
+    (void) make_const_string("world", 5, & value);
+    if (! set_array_element(a_cookie, & index, & value)) @{
+        printf("fill_in_array: set_array_element failed\n");
+        return;
+    @}
+
+    (void) make_const_string("answer", 6, & index);
+    (void) make_number(42.0, & value);
+    if (! set_array_element(a_cookie, & index, & value)) @{
+        printf("fill_in_array: set_array_element failed\n");
+        return;
+    @}
+@end example
+
+The third step is to create the subarray and install it:
+
+@example
+    (void) make_const_string("subarray", 8, & index);
+    subarray = create_array();
+    value.val_type = AWK_ARRAY;
+    value.array_cookie = subarray;
+    if (! set_array_element(a_cookie, & index, & value)) @{
+        printf("fill_in_array: set_array_element failed\n");
+        return;
+    @}
+    subarray = value.array_cookie;
+@end example
+
+The final step is to populate the subarray with its own element:
+
+@example
+    (void) make_const_string("foo", 3, & index);
+    (void) make_const_string("bar", 3, & value);
+    if (! set_array_element(subarray, & index, & value)) @{
+        printf("fill_in_array: set_array_element failed\n");
+        return;
+    @}
+@}
+@ignore
+static awk_ext_func_t func_table[] = @{
+    @{ NULL, NULL, 0 @}
+@};
+
+/* init_testarray --- additional initialization function */
+
+static awk_bool_t init_testarray(void)
+@{
+    create_new_array();
+
+    return awk_true;
+@}
+
+static awk_bool_t (*init_func)(void) = init_testarray;
+
+dl_load_func(func_table, testarray, "")
+@end ignore
+@end example
+
+Here is a sample script that loads the extension
+and then dumps the array:
+
+@example
+@@load "subarray"
+
+function dumparray(name, array,     i)
+@{
+    for (i in array)
+        if (isarray(array[i]))
+            dumparray(name "[\"" i "\"]", array[i])
+        else
+            printf("%s[\"%s\"] = %s\n", name, i, array[i])
+@}
+
+BEGIN @{
+    dumparray("new_array", new_array);
+@}
+@end example
+
+Here is the result of running the script:
+
+@example
+$ @kbd{AWKLIBPATH=$PWD gawk -f subarray.awk}
+@print{} new_array["subarray"]["foo"] = bar
+@print{} new_array["hello"] = world
+@print{} new_array["answer"] = 42
+@end example
+
+@noindent
+(@xref{Finding Extensions} for more information on the
+@env{AWKLIBPATH} environment variable.)
+
+@node Redirection API
+@subsection Accessing and Manipulating Redirections
+
+The following function allows extensions to access and manipulate redirections.
+
+@table @code
+@item awk_bool_t get_file(const char *name,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t name_len,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const char *filetype,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int fd,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_input_buf_t **ibufp,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_output_buf_t **obufp);
+Look up file @code{name} in @command{gawk}'s internal redirection table.
+If @code{name} is @code{NULL} or @code{name_len} is zero, return
+data for the currently open input file corresponding to @code{FILENAME}.
+(This does not access the @code{filetype} argument, so that may be undefined).  
+If the file is not already open, attempt to open it.
+The @code{filetype} argument must be zero-terminated and should be one of:
+
+@table @code
+@item ">"
+A file opened for output.
+
+@item ">>"
+A file opened for append.
+
+@item "<"
+A file opened for input.
+
+@item "|>"
+A pipe opened for output.
+
+@item "|<"
+A pipe opened for input.
+
+@item "|&"
+A two-way coprocess.
+@end table
+
+On error, return @code{awk_false}.  Otherwise, return
+@code{awk_true}, and return additional information about the redirection
+in the @code{ibufp} and @code{obufp} pointers.
+
+For input redirections, the @code{*ibufp} value should be non-@code{NULL},
+and @code{*obufp} should be @code{NULL}.  For output redirections,
+the @code{*obufp} value should be non-@code{NULL}, and @code{*ibufp}
+should be @code{NULL}.  For two-way coprocesses, both values should
+be non-@code{NULL}.
+
+In the usual case, the extension is interested in @code{(*ibufp)->fd}
+and/or @code{fileno((*obufp)->fp)}.  If the file is not already
+open, and the @code{fd} argument is nonnegative, @command{gawk}
+will use that file descriptor instead of opening the file in the
+usual way.  If @code{fd} is nonnegative, but the file exists already,
+@command{gawk} ignores @code{fd} and returns the existing file.  It is
+the caller's responsibility to notice that neither the @code{fd} in
+the returned @code{awk_input_buf_t} nor the @code{fd} in the returned
+@code{awk_output_buf_t} matches the requested value.
+
+Note that supplying a file descriptor is currently @emph{not} supported
+for pipes.  However, supplying a file descriptor should work for input,
+output, append, and two-way (coprocess) sockets.  If @code{filetype}
+is two-way, @command{gawk} assumes that it is a socket!  Note that in
+the two-way case, the input and output file descriptors may differ.
+To check for success, you must check whether either matches.
+@end table
+
+It is anticipated that this API function will be used to implement I/O
+multiplexing and a socket library.
+
+@node Extension API Variables
+@subsection API Variables
+
+The API provides two sets of variables.  The first provides information
+about the version of the API (both with which the extension was compiled,
+and with which @command{gawk} was compiled).  The second provides
+information about how @command{gawk} was invoked.
+
+@menu
+* Extension Versioning::          API Version information.
+* Extension GMP/MPFR Versioning:: Version information about GMP and MPFR.
+* Extension API Informational Variables:: Variables providing information about
+                                  @command{gawk}'s invocation.
+@end menu
+
+@node Extension Versioning
+@subsubsection API Version Constants and Variables
+@cindex API version
+@cindex extension API version
+
+The API provides both a ``major'' and a ``minor'' version number.
+The API versions are available at compile time as C preprocessor defines
+to support conditional compilation, and as enum constants to facilitate
+debugging:
+
+@float Table,gawk-api-version
+@caption{gawk API version constants}
+@multitable {@b{API Version}} {@code{gawk_api_major_version}} {@code{GAWK_API_MAJOR_VERSION}}
+@headitem API Version @tab C Preprocessor Define @tab enum constant
+@item Major @tab @code{gawk_api_major_version} @tab @code{GAWK_API_MAJOR_VERSION}
+@item Minor @tab @code{gawk_api_minor_version} @tab @code{GAWK_API_MINOR_VERSION}
+@end multitable
+@end float
+
+The minor version increases when new functions are added to the API. Such
+new functions are always added to the end of the API @code{struct}.
+
+The major version increases (and the minor version is reset to zero) if any
+of the data types change size or member order, or if any of the existing
+functions change signature.
+
+It could happen that an extension may be compiled against one version
+of the API but loaded by a version of @command{gawk} using a different
+version. For this reason, the major and minor API versions of the
+running @command{gawk} are included in the API @code{struct} as read-only
+constant integers:
+
+@table @code
+@item api->major_version
+The major version of the running @command{gawk}.
+
+@item api->minor_version
+The minor version of the running @command{gawk}.
+@end table
+
+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
+    || 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",
+                GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION,
+                api->major_version, api->minor_version);
+        exit(1);
+@}
+@end example
+
+Such code is included in the boilerplate @code{dl_load_func()} macro
+provided in @file{gawkapi.h} (discussed in
+@ref{Extension API Boilerplate}).
+
+@node Extension GMP/MPFR Versioning
+@subsubsection GMP and MPFR Version Information
+
+The API also includes information about the versions of GMP and MPFR
+with which the running @command{gawk} was compiled (if any).
+They are included in the API @code{struct} as read-only
+constant integers:
+
+@table @code
+@item api->gmp_major_version
+The major version of the GMP library used to compile @command{gawk}.
+
+@item api->gmp_minor_version
+The minor version of the GMP library used to compile @command{gawk}.
+
+@item api->mpfr_major_version
+The major version of the MPFR library used to compile @command{gawk}.
+
+@item api->mpfr_minor_version
+The minor version of the MPFR library used to compile @command{gawk}.
+@end table
+
+These fields are set to zero if @command{gawk} was compiled without
+MPFR support.
+
+You can check if the versions of MPFR and GMP that you are using match those
+of @command{gawk} with the following macro:
+
+@table @code
+@item check_mpfr_version(extension)
+The @code{extension} is the extension id passed to all the other macros
+and functions defined in @file{gawkapi.h}.  If you have not included
+the @code{<mpfr.h>} header file, then this macro will be defined to do nothing.
+
+If you have included that file, then this macro compares the MPFR
+and GMP major and minor versions against those of the library you are
+compiling against.  If your libraries are newer than @command{gawk}'s, it
+produces a fatal error message.
+
+The @code{dl_load_func()} macro (@pxref{Extension API Boilerplate})
+calls @code{check_mpfr_version()}.
+@end table
+
+@node Extension API Informational Variables
+@subsubsection Informational Variables
+@cindex API informational variables
+@cindex extension API informational variables
+
+The API provides access to several variables that describe
+whether the corresponding command-line options were enabled when
+@command{gawk} was invoked.  The variables are:
+
+@table @code
+@item do_debug
+This variable is true if @command{gawk} was invoked with @option{--debug} option.
+
+@item do_lint
+This variable is true if @command{gawk} was invoked with @option{--lint} option.
+
+@item do_mpfr
+This variable is true if @command{gawk} was invoked with @option{--bignum} option.
+
+@item do_profile
+This variable is true if @command{gawk} was invoked with @option{--profile} option.
+
+@item do_sandbox
+This variable is true if @command{gawk} was invoked with @option{--sandbox} option.
+
+@item do_traditional
+This variable is true if @command{gawk} was invoked with @option{--traditional} option.
+@end table
+
+The value of @code{do_lint} can change if @command{awk} code
+modifies the @code{LINT} predefined variable (@pxref{Built-in Variables}).
+The others should not change during execution.
+
+@node Extension API Boilerplate
+@subsection Boilerplate Code
+
+As mentioned earlier (@pxref{Extension Mechanism Outline}), the function
+definitions as presented are really macros. To use these macros, your
+extension must provide a small amount of boilerplate code (variables and
+functions) toward the top of your source file, using predefined names
+as described here.  The boilerplate needed is also provided in comments
+in the @file{gawkapi.h} header file:
+
+@example
+@group
+/* Boilerplate code: */
+int plugin_is_GPL_compatible;
+
+static gawk_api_t *const api;
+@end group
+static awk_ext_id_t ext_id;
+static const char *ext_version = NULL; /* or @dots{} = "some string" */
+
+static awk_ext_func_t func_table[] = @{
+    @{ "name", do_name, 1, 0, awk_false, NULL @},
+    /* @dots{} */
+@};
+
+/* EITHER: */
+
+static awk_bool_t (*init_func)(void) = NULL;
+
+/* OR: */
+
+static awk_bool_t
+init_my_extension(void)
+@{
+    @dots{}
+@}
+
+static awk_bool_t (*init_func)(void) = init_my_extension;
+
+dl_load_func(func_table, some_name, "name_space_in_quotes")
+@end example
+
+These variables and functions are as follows:
+
+@table @code
+@item int plugin_is_GPL_compatible;
+This asserts that the extension is compatible with
+@ifclear FOR_PRINT
+the GNU GPL (@pxref{Copying}).
+@end ifclear
+@ifset FOR_PRINT
+the GNU GPL.
+@end ifset
+If your extension does not have this, @command{gawk}
+will not load it (@pxref{Plugin License}).
+
+@item static gawk_api_t *const api;
+This global @code{static} variable should be set to point to
+the @code{gawk_api_t} pointer that @command{gawk} passes to your
+@code{dl_load()} function.  This variable is used by all of the macros.
+
+@item static awk_ext_id_t ext_id;
+This global static variable should be set to the @code{awk_ext_id_t}
+value that @command{gawk} passes to your @code{dl_load()} function.
+This variable is used by all of the macros.
+
+@item static const char *ext_version = NULL; /* or @dots{} = "some string" */
+This global @code{static} variable should be set either
+to @code{NULL}, or to point to a string giving the name and version of
+your extension.
+
+@item static awk_ext_func_t func_table[] = @{ @dots{} @};
+This is an array of one or more @code{awk_ext_func_t} structures,
+as described earlier (@pxref{Extension Functions}).
+It can then be looped over for multiple calls to
+@code{add_ext_func()}.
+
+@c Use @var{OR} for docbook
+@item static awk_bool_t (*init_func)(void) = NULL;
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @var{OR}
+@itemx static awk_bool_t init_my_extension(void) @{ @dots{} @}
+@itemx static awk_bool_t (*init_func)(void) = init_my_extension;
+If you need to do some initialization work, you should define a
+function that does it (creates variables, opens files, etc.)
+and then define the @code{init_func} pointer to point to your
+function.
+The function should return @code{awk_false} upon failure, or @code{awk_true}
+if everything goes well.
+
+If you don't need to do any initialization, define the pointer and
+initialize it to @code{NULL}.
+
+@item dl_load_func(func_table, some_name, "name_space_in_quotes")
+This macro expands to a @code{dl_load()} function that performs
+all the necessary initializations.
+@end table
+
+The point of all the variables and arrays is to let the
+@code{dl_load()} function (from the @code{dl_load_func()}
+macro) do all the standard work. It does the following:
+
+@enumerate 1
+@item
+Check the API versions. If the extension major version does not match
+@command{gawk}'s, or if the extension minor version is greater than
+@command{gawk}'s, it prints a fatal error message and exits.
+
+@item
+Check the MPFR and GMP versions. If there is a mismatch, it prints
+a fatal error message and exits.
+
+@item
+Load the functions defined in @code{func_table}.
+If any of them fails to load, it prints a warning message but
+continues on.
+
+@item
+If the @code{init_func} pointer is not @code{NULL}, call the
+function it points to. If it returns @code{awk_false}, print a
+warning message.
+
+@item
+If @code{ext_version} is not @code{NULL}, register
+the version string with @command{gawk}.
+@end enumerate
+
+
+@node Changes from API V1
+@subsection Changes From Version 1 of the API
+
+The current API is @emph{not} binary compatible with version 1 of the API.
+You will have to recompile your extensions in order to use them with
+the current version of @command{gawk}.
+
+Fortunately, at the possible expense of some compile-time warnings, the API remains
+source-code--compatible with the previous API. The major differences are
+the additional members in the @code{awk_ext_func_t} structure, and the
+addition of the third argument to the C implementation function
+(@pxref{Extension Functions}).
+
+Here is a list of individual features that changed from version 1 to
+version 2 of the API:
+
+@itemize @bullet
+
+@item
+Numeric values can now have MPFR/MPZ variants
+(@pxref{General Data Types}).
+
+@item
+There are new string types: @code{AWK_REGEX} and @code{AWK_STRNUM}
+(@pxref{General Data Types}).
+
+@item
+The @code{ezalloc()} macro is new
+(@pxref{Memory Allocation Functions}).
+
+@item
+The @code{awk_ext_func_t} structure changed. Instead of
+@code{num_expected_args}, it now has @code{max_expected} and
+@code{min_required}
+(@pxref{Extension Functions}).
+
+@item
+For @code{get_record()}, an input parser can now specify field widths
+(@pxref{Input Parsers}).
+
+@item
+Extensions can now produce nonfatal error messages
+(@pxref{Printing Messages}).
+
+@item
+When flattening an array, you can now specify the index and value types
+(@pxref{Array Functions}).
+
+@item
+The @code{get_file()} API is new
+(@pxref{Redirection API}).
+@end itemize
+
+@node Finding Extensions
+@section How @command{gawk} Finds Extensions
+@cindex extension search path
+@cindex finding extensions
+
+Compiled extensions have to be installed in a directory where
+@command{gawk} can find them.  If @command{gawk} is configured and
+built in the default fashion, the directory in which to find
+extensions is @file{/usr/local/lib/gawk}.  You can also specify a search
+path with a list of directories to search for compiled extensions.
+@xref{AWKLIBPATH Variable} for more information.
+
+@node Extension Example
+@section Example: Some File Functions
+@cindex extension example
+
+@quotation
+@i{No matter where you go, there you are.}
+@author Buckaroo Banzai
+@end quotation
+
+@c It's enough to show chdir and stat, no need for fts
+
+Two useful functions that are not in @command{awk} are @code{chdir()} (so
+that an @command{awk} program can change its directory) and @code{stat()}
+(so that an @command{awk} program can gather information about a file).
+In order to illustrate the API in action, this @value{SECTION} implements
+these functions for @command{gawk} in an extension.
+
+@menu
+* Internal File Description::   What the new functions will do.
+* Internal File Ops::           The code for internal file operations.
+* Using Internal File Ops::     How to use an external extension.
+@end menu
+
+@node Internal File Description
+@subsection Using @code{chdir()} and @code{stat()}
+
+This @value{SECTION} shows how to use the new functions at
+the @command{awk} level once they've been integrated into the
+running @command{gawk} interpreter.  Using @code{chdir()} is very
+straightforward. It takes one argument, the new directory to change to:
+
+@example
+@@load "filefuncs"
+@dots{}
+newdir = "/home/arnold/funstuff"
+ret = chdir(newdir)
+if (ret < 0) @{
+    printf("could not change to %s: %s\n", newdir, ERRNO) > "/dev/stderr"
+    exit 1
+@}
+@dots{}
+@end example
+
+The return value is negative if the @code{chdir()} failed, and
+@code{ERRNO} (@pxref{Built-in Variables}) is set to a string indicating
+the error.
+
+Using @code{stat()} is a bit more complicated.  The C @code{stat()}
+function fills in a structure that has a fair amount of information.
+The right way to model this in @command{awk} is to fill in an associative
+array with the appropriate information:
+
+@c broke printf for page breaking
+@example
+file = "/home/arnold/.profile"
+ret = stat(file, fdata)
+if (ret < 0) @{
+    printf("could not stat %s: %s\n",
+             file, ERRNO) > "/dev/stderr"
+    exit 1
+@}
+printf("size of %s is %d bytes\n", file, fdata["size"])
+@end example
+
+The @code{stat()} function always clears the data array, even if
+the @code{stat()} fails.  It fills in the following elements:
+
+@table @code
+@item "name"
+The name of the file that was @code{stat()}ed.
+
+@item "dev"
+@itemx "ino"
+The file's device and inode numbers, respectively.
+
+@item "mode"
+The file's mode, as a numeric value. This includes both the file's
+type and its permissions.
+
+@item "nlink"
+The number of hard links (directory entries) the file has.
+
+@item "uid"
+@itemx "gid"
+The numeric user and group ID numbers of the file's owner.
+
+@item "size"
+The size in bytes of the file.
+
+@item "blocks"
+The number of disk blocks the file actually occupies. This may not
+be a function of the file's size if the file has holes.
+
+@item "atime"
+@itemx "mtime"
+@itemx "ctime"
+The file's last access, modification, and inode update times,
+respectively.  These are numeric timestamps, suitable for formatting
+with @code{strftime()}
+(@pxref{Time Functions}).
+
+@item "pmode"
+The file's ``printable mode.''  This is a string representation of
+the file's type and permissions, such as is produced by
+@samp{ls -l}---for example, @code{"drwxr-xr-x"}.
+
+@item "type"
+A printable string representation of the file's type.  The value
+is one of the following:
+
+@table @code
+@item "blockdev"
+@itemx "chardev"
+The file is a block or character device (``special file'').
+
+@ignore
+@item "door"
+The file is a Solaris ``door'' (special file used for
+interprocess communications).
+@end ignore
+
+@item "directory"
+The file is a directory.
+
+@item "fifo"
+The file is a named pipe (also known as a FIFO).
+
+@item "file"
+The file is just a regular file.
+
+@item "socket"
+The file is an @code{AF_UNIX} (``Unix domain'') socket in the
+filesystem.
+
+@item "symlink"
+The file is a symbolic link.
+@end table
+
+@c 5/2013: Thanks to Corinna Vinschen for this information.
+@item "devbsize"
+The size of a block for the element indexed by @code{"blocks"}.
+This information is derived from either the @code{DEV_BSIZE}
+constant defined in @code{<sys/param.h>} on most systems,
+or the @code{S_BLKSIZE} constant in @code{<sys/stat.h>} on BSD systems.
+For some other systems, @dfn{a priori} knowledge is used to provide
+a value. Where no value can be determined, it defaults to 512.
+@end table
+
+Several additional elements may be present, depending upon the operating
+system and the type of the file.  You can test for them in your @command{awk}
+program by using the @code{in} operator
+(@pxref{Reference to Elements}):
+
+@table @code
+@item "blksize"
+The preferred block size for I/O to the file. This field is not
+present on all POSIX-like systems in the C @code{stat} structure.
+
+@item "linkval"
+If the file is a symbolic link, this element is the name of the
+file the link points to (i.e., the value of the link).
+
+@item "rdev"
+@itemx "major"
+@itemx "minor"
+If the file is a block or character device file, then these values
+represent the numeric device number and the major and minor components
+of that number, respectively.
+@end table
+
+@node Internal File Ops
+@subsection C Code for @code{chdir()} and @code{stat()}
+
+Here is the C code for these extensions.@footnote{This version is
+edited slightly for presentation.  See @file{extension/filefuncs.c}
+in the @command{gawk} distribution for the complete version.}
+
+The file includes a number of standard header files, and then includes
+the @file{gawkapi.h} header file, which provides the API definitions.
+Those are followed by the necessary variable declarations
+to make use of the API macros and boilerplate code
+(@pxref{Extension API Boilerplate}):
+
+@example
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#include "gawkfts.h"
+#include "stack.h"
+
+static const gawk_api_t *api;    /* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static awk_bool_t init_filefuncs(void);
+static awk_bool_t (*init_func)(void) = init_filefuncs;
+static const char *ext_version = "filefuncs extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+@end example
+
+@cindex programming conventions, @command{gawk} extensions
+By convention, for an @command{awk} function @code{foo()}, the C function
+that implements it is called @code{do_foo()}.  The function should have
+two arguments. The first is an @code{int}, usually called @code{nargs},
+that represents the number of actual arguments for the function.
+The second is a pointer to an @code{awk_value_t} structure, usually named
+@code{result}:
+
+@example
+@group
+/*  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)
+@end group
+@{
+    awk_value_t newdir;
+    int ret = -1;
+
+    assert(result != NULL);
+@end example
+
+The @code{newdir}
+variable represents the new directory to change to, which is retrieved
+with @code{get_argument()}.  Note that the first argument is
+numbered zero.
+
+If the argument is retrieved successfully, the function calls the
+@code{chdir()} system call. Otherwise, if the @code{chdir()} fails,
+it updates @code{ERRNO}:
+
+@example
+    if (get_argument(0, AWK_STRING, & newdir)) @{
+        ret = chdir(newdir.str_value.str);
+        if (ret < 0)
+            update_ERRNO_int(errno);
+    @}
+@end example
+
+Finally, the function returns the return value to the @command{awk} level:
+
+@example
+    return make_number(ret, result);
+@}
+@end example
+
+The @code{stat()} extension is more involved.  First comes a function
+that turns a numeric mode into a printable representation
+(e.g., octal @code{0644} becomes @samp{-rw-r--r--}). This is omitted here for brevity:
+
+@example
+/* format_mode --- turn a stat mode field into something readable */
+
+static char *
+format_mode(unsigned long fmode)
+@{
+    @dots{}
+@}
+@end example
+
+Next comes a function for reading symbolic links, which is also
+omitted here for brevity:
+
+@example
+/* read_symlink --- read a symbolic link into an allocated buffer.
+   @dots{} */
+
+static char *
+read_symlink(const char *fname, size_t bufsize, ssize_t *linksize)
+@{
+    @dots{}
+@}
+@end example
+
+Two helper functions simplify entering values in the
+array that will contain the result of the @code{stat()}:
+
+@example
+/* array_set --- set an array element */
+
+static void
+array_set(awk_array_t array, const char *sub, awk_value_t *value)
+@{
+    awk_value_t index;
+
+    set_array_element(array,
+                      make_const_string(sub, strlen(sub), & index),
+                      value);
+
+@}
+
+/* array_set_numeric --- set an array element with a number */
+
+static void
+array_set_numeric(awk_array_t array, const char *sub, double num)
+@{
+    awk_value_t tmp;
+
+    array_set(array, sub, make_number(num, & tmp));
+@}
+@end example
+
+The following function does most of the work to fill in
+the @code{awk_array_t} result array with values obtained
+from a valid @code{struct stat}. This work is done in a separate function
+to support the @code{stat()} function for @command{gawk} and also
+to support the @code{fts()} extension, which is included in
+the same file but whose code is not shown here
+(@pxref{Extension Sample File Functions}).
+
+The first part of the function is variable declarations,
+including a table to map file types to strings:
+
+@example
+/* fill_stat_array --- do the work to fill an array with stat info */
+
+static int
+fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf)
+@{
+    char *pmode;    /* printable mode */
+    const char *type = "unknown";
+    awk_value_t tmp;
+    static struct ftype_map @{
+        unsigned int mask;
+        const char *type;
+    @} ftype_map[] = @{
+        @{ S_IFREG, "file" @},
+        @{ S_IFBLK, "blockdev" @},
+        @{ S_IFCHR, "chardev" @},
+        @{ S_IFDIR, "directory" @},
+#ifdef S_IFSOCK
+        @{ S_IFSOCK, "socket" @},
+#endif
+#ifdef S_IFIFO
+        @{ S_IFIFO, "fifo" @},
+#endif
+#ifdef S_IFLNK
+        @{ S_IFLNK, "symlink" @},
+#endif
+#ifdef S_IFDOOR /* Solaris weirdness */
+        @{ S_IFDOOR, "door" @},
+#endif
+    @};
+    int j, k;
+@end example
+
+The destination array is cleared, and then code fills in
+various elements based on values in the @code{struct stat}:
+
+@example
+    /* empty out the array */
+    clear_array(array);
+
+    /* fill in the array */
+    array_set(array, "name", make_const_string(name, strlen(name),
+                                               & tmp));
+    array_set_numeric(array, "dev", sbuf->st_dev);
+    array_set_numeric(array, "ino", sbuf->st_ino);
+    array_set_numeric(array, "mode", sbuf->st_mode);
+    array_set_numeric(array, "nlink", sbuf->st_nlink);
+    array_set_numeric(array, "uid", sbuf->st_uid);
+    array_set_numeric(array, "gid", sbuf->st_gid);
+    array_set_numeric(array, "size", sbuf->st_size);
+    array_set_numeric(array, "blocks", sbuf->st_blocks);
+    array_set_numeric(array, "atime", sbuf->st_atime);
+    array_set_numeric(array, "mtime", sbuf->st_mtime);
+    array_set_numeric(array, "ctime", sbuf->st_ctime);
+
+    /* for block and character devices, add rdev,
+       major and minor numbers */
+    if (S_ISBLK(sbuf->st_mode) || S_ISCHR(sbuf->st_mode)) @{
+        array_set_numeric(array, "rdev", sbuf->st_rdev);
+        array_set_numeric(array, "major", major(sbuf->st_rdev));
+        array_set_numeric(array, "minor", minor(sbuf->st_rdev));
+    @}
+@end example
+
+@noindent
+The latter part of the function makes selective additions
+to the destination array, depending upon the availability of
+certain members and/or the type of the file. It then returns zero,
+for success:
+
+@example
+@group
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+    array_set_numeric(array, "blksize", sbuf->st_blksize);
+#endif
+@end group
+
+    pmode = format_mode(sbuf->st_mode);
+    array_set(array, "pmode", make_const_string(pmode, strlen(pmode),
+                                                & tmp));
+
+    /* for symbolic links, add a linkval field */
+    if (S_ISLNK(sbuf->st_mode)) @{
+        char *buf;
+        ssize_t linksize;
+
+        if ((buf = read_symlink(name, sbuf->st_size,
+                    & linksize)) != NULL)
+            array_set(array, "linkval",
+                      make_malloced_string(buf, linksize, & tmp));
+        else
+            warning(ext_id, _("stat: unable to read symbolic link `%s'"),
+                    name);
+    @}
+
+    /* add a type field */
+    type = "unknown";   /* shouldn't happen */
+    for (j = 0, k = sizeof(ftype_map)/sizeof(ftype_map[0]); j < k; j++) @{
+        if ((sbuf->st_mode & S_IFMT) == ftype_map[j].mask) @{
+            type = ftype_map[j].type;
+            break;
+        @}
+    @}
+
+    array_set(array, "type", make_const_string(type, strlen(type), & tmp));
+
+    return 0;
+@}
+@end example
+
+The third argument to @code{stat()} was not discussed previously. This
+argument is optional. If present, it causes @code{do_stat()} to use
+the @code{stat()} system call instead of the @code{lstat()} system
+call.  This is done by using a function pointer: @code{statfunc}.
+@code{statfunc} is initialized to point to @code{lstat()} (instead
+of @code{stat()}) to get the file information, in case the file is a
+symbolic link. However, if the third argument is included, @code{statfunc}
+is set to point to @code{stat()}, instead.
+
+Here is the @code{do_stat()} function, which starts with
+variable declarations and argument checking:
+
+@example
+/* do_stat --- provide a stat() function for gawk */
+
+static awk_value_t *
+do_stat(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+@{
+    awk_value_t file_param, array_param;
+    char *name;
+    awk_array_t array;
+    int ret;
+    struct stat sbuf;
+    /* default is lstat() */
+    int (*statfunc)(const char *path, struct stat *sbuf) = lstat;
+
+    assert(result != NULL);
+@end example
+
+Then comes the actual work. First, the function gets the arguments.
+Next, it gets the information for the file.  If the called function
+(@code{lstat()} or @code{stat()}) returns an error, the code sets
+@code{ERRNO} and returns:
+
+@example
+    /* file is first arg, array to hold results is second */
+    if (   ! get_argument(0, AWK_STRING, & file_param)
+        || ! get_argument(1, AWK_ARRAY, & array_param)) @{
+        warning(ext_id, _("stat: bad parameters"));
+        return make_number(-1, result);
+    @}
+
+    if (nargs == 3) @{
+        statfunc = stat;
+    @}
+
+    name = file_param.str_value.str;
+    array = array_param.array_cookie;
+
+    /* always empty out the array */
+    clear_array(array);
+
+    /* stat the file; if error, set ERRNO and return */
+    ret = statfunc(name, & sbuf);
+@group
+    if (ret < 0) @{
+        update_ERRNO_int(errno);
+        return make_number(ret, result);
+    @}
+@end 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
+@group
+    ret = fill_stat_array(name, array, & sbuf);
+
+    return make_number(ret, result);
+@}
+@end group
+@end example
+
+Finally, it's necessary to provide the ``glue'' that loads the
+new function(s) into @command{gawk}.
+
+The @code{filefuncs} extension also provides an @code{fts()}
+function, which we omit here
+(@pxref{Extension Sample File Functions}).
+For its sake, there is an initialization
+function:
+
+@example
+/* init_filefuncs --- initialization routine */
+
+static awk_bool_t
+init_filefuncs(void)
+@{
+    @dots{}
+@}
+@end example
+
+We are almost done. We need an array of @code{awk_ext_func_t}
+structures for loading each function into @command{gawk}:
+
+@example
+static awk_ext_func_t func_table[] = @{
+    @{ "chdir", do_chdir, 1, 1, awk_false, NULL @},
+    @{ "stat",  do_stat, 3, 2, awk_false, NULL @},
+    @dots{}
+@};
+@end example
+
+Each extension must have a routine named @code{dl_load()} to load
+everything that needs to be loaded.  It is simplest to use the
+@code{dl_load_func()} macro in @code{gawkapi.h}:
+
+@example
+/* define the dl_load() function using the boilerplate macro */
+
+dl_load_func(func_table, filefuncs, "")
+@end example
+
+And that's it!
+
+@node Using Internal File Ops
+@subsection Integrating the Extensions
+
+@cindex @command{gawk}, interpreter@comma{} adding code to
+Now that the code is written, it must be possible to add it at
+runtime to the running @command{gawk} interpreter.  First, the
+code must be compiled.  Assuming that the functions are in
+a file named @file{filefuncs.c}, and @var{idir} is the location
+of the @file{gawkapi.h} header file,
+the following steps@footnote{In practice, you would probably want to
+use the GNU Autotools (Automake, Autoconf, Libtool, and @command{gettext}) to
+configure and build your libraries. Instructions for doing so are beyond
+the scope of this @value{DOCUMENT}. @xref{gawkextlib} for Internet links to
+the tools.} create a GNU/Linux shared library:
+
+@example
+$ @kbd{gcc -fPIC -shared -DHAVE_CONFIG_H -c -O -g -I@var{idir} filefuncs.c}
+$ @kbd{gcc -o filefuncs.so -shared filefuncs.o}
+@end example
+
+Once the library exists, it is loaded by using the @code{@@load} keyword:
+
+@example
+# file testff.awk
+@@load "filefuncs"
+
+BEGIN @{
+    "pwd" | getline curdir  # save current directory
+    close("pwd")
+
+    chdir("/tmp")
+    system("pwd")   # test it
+    chdir(curdir)   # go back
+
+    print "Info for testff.awk"
+    ret = stat("testff.awk", data)
+    print "ret =", ret
+    for (i in data)
+        printf "data[\"%s\"] = %s\n", i, data[i]
+    print "testff.awk modified:",
+        strftime("%m %d %Y %H:%M:%S", data["mtime"])
+
+    print "\nInfo for JUNK"
+    ret = stat("JUNK", data)
+    print "ret =", ret
+    for (i in data)
+        printf "data[\"%s\"] = %s\n", i, data[i]
+    print "JUNK modified:", strftime("%m %d %Y %H:%M:%S", data["mtime"])
+@}
+@end example
+
+The @env{AWKLIBPATH} environment variable tells
+@command{gawk} where to find extensions (@pxref{Finding Extensions}).
+We set it to the current directory and run the program:
+
+@example
+$ @kbd{AWKLIBPATH=$PWD gawk -f testff.awk}
+@print{} /tmp
+@print{} Info for testff.awk
+@print{} ret = 0
+@print{} data["blksize"] = 4096
+@print{} data["devbsize"] = 512
+@print{} data["mtime"] = 1412004710
+@print{} data["mode"] = 33204
+@print{} data["type"] = file
+@print{} data["dev"] = 2053
+@print{} data["gid"] = 1000
+@print{} data["ino"] = 10358899
+@print{} data["ctime"] = 1412004710
+@print{} data["blocks"] = 8
+@print{} data["nlink"] = 1
+@print{} data["name"] = testff.awk
+@print{} data["atime"] = 1412004716
+@print{} data["pmode"] = -rw-rw-r--
+@print{} data["size"] = 666
+@print{} data["uid"] = 1000
+@print{} testff.awk modified: 09 29 2014 18:31:50
+@print{}
+@print{} Info for JUNK
+@print{} ret = -1
+@print{} JUNK modified: 01 01 1970 02:00:00
+@end example
+
+@node Extension Samples
+@section The Sample Extensions in the @command{gawk} Distribution
+@cindex extensions distributed with @command{gawk}
+
+This @value{SECTION} provides a brief overview of the sample extensions
+that come in the @command{gawk} distribution. Some of them are intended
+for production use (e.g., the @code{filefuncs}, @code{readdir}, and
+@code{inplace} extensions).  Others mainly provide example code that
+shows how to use the extension API.
+
+@menu
+* Extension Sample File Functions::   The file functions sample.
+* Extension Sample Fnmatch::          An interface to @code{fnmatch()}.
+* Extension Sample Fork::             An interface to @code{fork()} and other
+                                      process functions.
+* Extension Sample Inplace::          Enabling in-place file editing.
+* Extension Sample Ord::              Character to value to character
+                                      conversions.
+* Extension Sample Readdir::          An interface to @code{readdir()}.
+* Extension Sample Revout::           Reversing output sample output wrapper.
+* Extension Sample Rev2way::          Reversing data sample two-way processor.
+* Extension Sample Read write array:: Serializing an array to a file.
+* Extension Sample Readfile::         Reading an entire file into a string.
+* Extension Sample Time::             An interface to @code{gettimeofday()}
+                                      and @code{sleep()}.
+* Extension Sample API Tests::        Tests for the API.
+@end menu
+
+@node Extension Sample File Functions
+@subsection File-Related Functions
+
+The @code{filefuncs} extension provides three different functions, as follows.
+The usage is:
+
+@table @asis
+@item @code{@@load "filefuncs"}
+This is how you load the extension.
+
+@cindex @code{chdir()} extension function
+@item @code{result = chdir("/some/directory")}
+The @code{chdir()} function is a direct hook to the @code{chdir()}
+system call to change the current directory.  It returns zero
+upon success or a value less than zero upon error.
+In the latter case, it updates @code{ERRNO}.
+
+@cindex @code{stat()} extension function
+@item @code{result = stat("/some/path", statdata} [@code{, follow}]@code{)}
+The @code{stat()} function provides a hook into the
+@code{stat()} system call.
+It returns zero upon success or a value less than zero upon error.
+In the latter case, it updates @code{ERRNO}.
+
+By default, it uses the @code{lstat()} system call.  However, if passed
+a third argument, it uses @code{stat()} instead.
+
+In all cases, it clears the @code{statdata} array.
+When the call is successful, @code{stat()} fills the @code{statdata}
+array with information retrieved from the filesystem, as follows:
+
+@multitable @columnfractions .15 .50 .20
+@headitem Subscript @tab Field in @code{struct stat} @tab File type
+@item @code{"name"} @tab The @value{FN} @tab All
+@item @code{"dev"} @tab @code{st_dev} @tab All
+@item @code{"ino"} @tab @code{st_ino} @tab All
+@item @code{"mode"} @tab @code{st_mode} @tab All
+@item @code{"nlink"} @tab @code{st_nlink} @tab All
+@item @code{"uid"} @tab @code{st_uid} @tab All
+@item @code{"gid"} @tab @code{st_gid} @tab All
+@item @code{"size"} @tab @code{st_size} @tab All
+@item @code{"atime"} @tab @code{st_atime} @tab All
+@item @code{"mtime"} @tab @code{st_mtime} @tab All
+@item @code{"ctime"} @tab @code{st_ctime} @tab All
+@item @code{"rdev"} @tab @code{st_rdev} @tab Device files
+@item @code{"major"} @tab @code{st_major} @tab Device files
+@item @code{"minor"} @tab @code{st_minor} @tab Device files
+@item @code{"blksize"} @tab @code{st_blksize} @tab All
+@item @code{"pmode"} @tab A human-readable version of the mode value, like that printed by
+@command{ls} (for example, @code{"-rwxr-xr-x"}) @tab All
+@item @code{"linkval"} @tab The value of the symbolic link @tab Symbolic links
+@item @code{"type"} @tab The type of the file as a string---one of
+@code{"file"},
+@code{"blockdev"},
+@code{"chardev"},
+@code{"directory"},
+@code{"socket"},
+@code{"fifo"},
+@code{"symlink"},
+@code{"door"},
+or
+@code{"unknown"}
+(not all systems support all file types) @tab All
+@end multitable
+
+@cindex @code{fts()} extension function
+@item @code{flags = or(FTS_PHYSICAL, ...)}
+@itemx @code{result = fts(pathlist, flags, filedata)}
+Walk the file trees provided in @code{pathlist} and fill in the
+@code{filedata} array, as described next.  @code{flags} is the bitwise
+OR of several predefined values, also described in a moment.
+Return zero if there were no errors, otherwise return @minus{}1.
+@end table
+
+The @code{fts()} function provides a hook to the C library @code{fts()}
+routines for traversing file hierarchies.  Instead of returning data
+about one file at a time in a stream, it fills in a multidimensional
+array with data about each file and directory encountered in the requested
+hierarchies.
+
+The arguments are as follows:
+
+@table @code
+@item pathlist
+An array of @value{FN}s.  The element values are used; the index values are ignored.
+
+@item flags
+This should be the bitwise OR of one or more of the following
+predefined constant flag values.  At least one of
+@code{FTS_LOGICAL} or @code{FTS_PHYSICAL} must be provided; otherwise
+@code{fts()} returns an error value and sets @code{ERRNO}.
+The flags are:
+
+@c nested table
+@table @code
+@item FTS_LOGICAL
+Do a ``logical'' file traversal, where the information returned for
+a symbolic link refers to the linked-to file, and not to the symbolic
+link itself.  This flag is mutually exclusive with @code{FTS_PHYSICAL}.
+
+@item FTS_PHYSICAL
+Do a ``physical'' file traversal, where the information returned for a
+symbolic link refers to the symbolic link itself.  This flag is mutually
+exclusive with @code{FTS_LOGICAL}.
+
+@item FTS_NOCHDIR
+As a performance optimization, the C library @code{fts()} routines
+change directory as they traverse a file hierarchy.  This flag disables
+that optimization.
+
+@item FTS_COMFOLLOW
+Immediately follow a symbolic link named in @code{pathlist},
+whether or not @code{FTS_LOGICAL} is set.
+
+@item FTS_SEEDOT
+By default, the C library @code{fts()} routines do not return entries for
+@file{.} (dot) and @file{..} (dot-dot).  This option causes entries for
+dot-dot to also be included.  (The extension always includes an entry
+for dot; more on this in a moment.)
+
+@item FTS_XDEV
+During a traversal, do not cross onto a different mounted filesystem.
+@end table
+
+@item filedata
+The @code{filedata} array holds the results.
+@code{fts()} first clears it.  Then it creates
+an element in @code{filedata} for every element in @code{pathlist}.
+The index is the name of the directory or file given in @code{pathlist}.
+The element for this index is itself an array.  There are two cases:
+
+@c nested table
+@table @emph
+@item The path is a file
+In this case, the array contains two or three elements:
+
+@c doubly nested table
+@table @code
+@item "path"
+The full path to this file, starting from the ``root'' that was given
+in the @code{pathlist} array.
+
+@item "stat"
+This element is itself an array, containing the same information as provided
+by the @code{stat()} function described earlier for its
+@code{statdata} argument.  The element may not be present if
+the @code{stat()} system call for the file failed.
+
+@item "error"
+If some kind of error was encountered, the array will also
+contain an element named @code{"error"}, which is a string describing the error.
+@end table
+
+@item The path is a directory
+In this case, the array contains one element for each entry in the
+directory.  If an entry is a file, that element is the same as for files, just
+described.  If the entry is a directory, that element is (recursively)
+an array describing the subdirectory.  If @code{FTS_SEEDOT} was provided
+in the flags, then there will also be an element named @code{".."}.  This
+element will be an array containing the data as provided by @code{stat()}.
+
+In addition, there will be an element whose index is @code{"."}.
+This element is an array containing the same two or three elements as
+for a file: @code{"path"}, @code{"stat"}, and @code{"error"}.
+@end table
+@end table
+
+The @code{fts()} function returns zero if there were no errors.
+Otherwise, it returns @minus{}1.
+
+@quotation NOTE
+The @code{fts()} extension does not exactly mimic the
+interface of the C library @code{fts()} routines, choosing instead to
+provide an interface that is based on associative arrays, which is
+more comfortable to use from an @command{awk} program.  This includes the
+lack of a comparison function, because @command{gawk} already provides
+powerful array sorting facilities.  Although an @code{fts_read()}-like
+interface could have been provided, this felt less natural than simply
+creating a multidimensional array to represent the file hierarchy and
+its information.
+@end quotation
+
+See @file{test/fts.awk} in the @command{gawk} distribution for an example
+use of the @code{fts()} extension function.
+
+@node Extension Sample Fnmatch
+@subsection Interface to @code{fnmatch()}
+
+This extension provides an interface to the C library
+@code{fnmatch()} function.  The usage is:
+
+@table @code
+@item @@load "fnmatch"
+This is how you load the extension.
+
+@cindex @code{fnmatch()} extension function
+@item result = fnmatch(pattern, string, flags)
+The return value is zero on success, @code{FNM_NOMATCH}
+if the string did not match the pattern, or
+a different nonzero value if an error occurred.
+@end table
+
+In addition to the @code{fnmatch()} function, the @code{fnmatch} extension
+adds one constant (@code{FNM_NOMATCH}), and an array of flag values
+named @code{FNM}.
+
+The arguments to @code{fnmatch()} are:
+
+@table @code
+@item pattern
+The @value{FN} wildcard to match
+
+@item string
+The @value{FN} string
+
+@item flag
+Either zero, or the bitwise OR of one or more of the
+flags in the @code{FNM} array
+@end table
+
+The flags are as follows:
+
+@multitable @columnfractions .25 .75
+@headitem Array element @tab Corresponding flag defined by @code{fnmatch()}
+@item @code{FNM["CASEFOLD"]} @tab @code{FNM_CASEFOLD}
+@item @code{FNM["FILE_NAME"]} @tab @code{FNM_FILE_NAME}
+@item @code{FNM["LEADING_DIR"]} @tab @code{FNM_LEADING_DIR}
+@item @code{FNM["NOESCAPE"]} @tab @code{FNM_NOESCAPE}
+@item @code{FNM["PATHNAME"]} @tab @code{FNM_PATHNAME}
+@item @code{FNM["PERIOD"]} @tab @code{FNM_PERIOD}
+@end multitable
+
+Here is an example:
+
+@example
+@@load "fnmatch"
+@dots{}
+flags = or(FNM["PERIOD"], FNM["NOESCAPE"])
+if (fnmatch("*.a", "foo.c", flags) == FNM_NOMATCH)
+    print "no match"
+@end example
+
+@node Extension Sample Fork
+@subsection Interface to @code{fork()}, @code{wait()}, and @code{waitpid()}
+
+The @code{fork} extension adds three functions, as follows:
+
+@table @code
+@item @@load "fork"
+This is how you load the extension.
+
+@cindex @code{fork()} extension function
+@item pid = fork()
+This function creates a new process. The return value is zero in the
+child and the process ID number of the child in the parent, or @minus{}1
+upon error. In the latter case, @code{ERRNO} indicates the problem.
+In the child, @code{PROCINFO["pid"]} and @code{PROCINFO["ppid"]} are
+updated to reflect the correct values.
+
+@cindex @code{waitpid()} extension function
+@item ret = waitpid(pid)
+This function takes a numeric argument, which is the process ID to
+wait for. The return value is that of the
+@code{waitpid()} system call.
+
+@cindex @code{wait()} extension function
+@item ret = wait()
+This function waits for the first child to die.
+The return value is that of the
+@code{wait()} system call.
+@end table
+
+There is no corresponding @code{exec()} function.
+
+Here is an example:
+
+@example
+@@load "fork"
+@dots{}
+if ((pid = fork()) == 0)
+    print "hello from the child"
+else
+    print "hello from the parent"
+@end example
+
+@node Extension Sample Inplace
+@subsection Enabling In-Place File Editing
+
+@cindex @code{inplace} extension
+The @code{inplace} extension emulates GNU @command{sed}'s @option{-i} option,
+which performs ``in-place'' editing of each input file.
+It uses the bundled @file{inplace.awk} include file to invoke the extension
+properly.  This extension makes use of the namespace facility to place
+all the variables and functions in the @code{inplace} namespace
+(@pxref{Namespaces}):
+
+@example
+@c file eg/lib/inplace.awk
+@group
+# inplace --- load and invoke the inplace extension.
+@c endfile
+@ignore
+@c file eg/lib/inplace.awk
+# 
+# Copyright (C) 2013, 2017 the Free Software Foundation, Inc.
+# 
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+# 
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# Andrew J. Schorr, aschorr@@telemetry-investments.com
+# January 2013
+#
+# Revised for namespaces
+# Arnold Robbins, arnold@@skeeve.com
+# July 2017
+@c endfile
+@end ignore
+@c file eg/lib/inplace.awk
+
+@@load "inplace"
+
+# Please set inplace::suffix to make a backup copy.  For example, you may
+# want to set inplace::suffix to .bak on the command line or in a BEGIN rule.
+
+# By default, each filename on the command line will be edited inplace.
+# But you can selectively disable this by adding an inplace=0 argument
+# prior to files that you do not want to process this way.  You can then
+# reenable it later on the commandline by putting inplace=1 before files
+# that you wish to be subject to inplace editing.
+
+# N.B. We call inplace::end() in the BEGINFILE and END rules so that any
+# actions in an ENDFILE rule will be redirected as expected.
+
+@@namespace "inplace"
+@end group
+
+@group
+BEGIN @{
+    enable = 1         # enabled by default
+@}
+@end group
+
+@group
+BEGINFILE @{
+    if (filename != "")
+        end(filename, suffix)
+    if (enable)
+        begin(filename = FILENAME, suffix)
+    else
+        filename = ""
+@}
+@end group
+
+@group
+END @{
+    if (filename != "")
+        end(filename, suffix)
+@}
+@end group
+@c endfile
+@end example
+
+For each regular file that is processed, the extension redirects
+standard output to a temporary file configured to have the same owner
+and permissions as the original.  After the file has been processed,
+the extension restores standard output to its original destination.
+If @code{inplace::suffix} is not an empty string, the original file is
+linked to a backup @value{FN} created by appending that suffix.  Finally,
+the temporary file is renamed to the original @value{FN}.
+
+Note that the use of this feature can be controlled by placing
+@samp{inplace::enable=0} on the command-line prior to listing files that
+should not be processed this way.  You can reenable inplace editing by adding
+an @samp{inplace::enable=1} argument prior to files that should be subject
+to inplace editing.
+
+The @code{inplace::filename} variable serves to keep track of the
+current filename so as to not invoke @code{inplace::end()} before
+processing the first file.
+
+If any error occurs, the extension issues a fatal error to terminate
+processing immediately without damaging the original file.
+
+Here are some simple examples:
+
+@example
+$ @kbd{gawk -i inplace '@{ gsub(/foo/, "bar") @}; @{ print @}' file1 file2 file3}
+@end example
+
+To keep a backup copy of the original files, try this:
+
+@example
+$ @kbd{gawk -i inplace -v inplace::suffix=.bak '@{ gsub(/foo/, "bar") @}}
+> @kbd{@{ print @}' file1 file2 file3}
+@end example
+
+Please note that, while the extension does attempt to preserve ownership and permissions, it makes no attempt to copy the ACLs from the original file.
+
+If the program dies prematurely, as might happen if an unhandled signal is received, a temporary file may be left behind.
+
+@node Extension Sample Ord
+@subsection Character and Numeric values: @code{ord()} and @code{chr()}
+
+The @code{ordchr} extension adds two functions, named
+@code{ord()} and @code{chr()}, as follows:
+
+@table @code
+@item @@load "ordchr"
+This is how you load the extension.
+
+@cindex @code{ord()} extension function
+@item number = ord(string)
+Return the numeric value of the first character in @code{string}.
+
+@cindex @code{chr()} extension function
+@item char = chr(number)
+Return a string whose first character is that represented by @code{number}.
+@end table
+
+These functions are inspired by the Pascal language functions
+of the same name.  Here is an example:
+
+@example
+@@load "ordchr"
+@dots{}
+printf("The numeric value of 'A' is %d\n", ord("A"))
+printf("The string value of 65 is %s\n", chr(65))
+@end example
+
+@node Extension Sample Readdir
+@subsection Reading Directories
+
+The @code{readdir} extension adds an input parser for directories.
+The usage is as follows:
+
+@cindex @code{readdir} extension
+@example
+@@load "readdir"
+@end example
+
+When this extension is in use, instead of skipping directories named
+on the command line (or with @code{getline}),
+they are read, with each entry returned as a record.
+
+The record consists of three fields. The first two are the inode number and the
+@value{FN}, separated by a forward slash character.
+On systems where the directory entry contains the file type, the record
+has a third field (also separated by a slash), which is a single letter
+indicating the type of the file. The letters and their corresponding file
+types are shown in @ref{table-readdir-file-types}.
+
+@float Table,table-readdir-file-types
+@caption{File types returned by the @code{readdir} extension}
+@multitable @columnfractions .1 .9
+@headitem Letter @tab File type
+@item @code{b} @tab Block device
+@item @code{c} @tab Character device
+@item @code{d} @tab Directory
+@item @code{f} @tab Regular file
+@item @code{l} @tab Symbolic link
+@item @code{p} @tab Named pipe (FIFO)
+@item @code{s} @tab Socket
+@item @code{u} @tab Anything else (unknown)
+@end multitable
+@end float
+
+On systems without the file type information, the third field is always
+@samp{u}.
+
+@quotation NOTE
+On GNU/Linux systems, there are filesystems that don't support the
+@code{d_type} entry (see the @i{readdir}(3) manual page), and so the file
+type is always @samp{u}.  You can use the @code{filefuncs} extension to call
+@code{stat()} in order to get correct type information.
+@end quotation
+
+Here is an example:
+
+@example
+@@load "readdir"
+@dots{}
+BEGIN @{ FS = "/" @}
+@{ print "@value{FN} is", $2 @}
+@end example
+
+@node Extension Sample Revout
+@subsection Reversing Output
+
+The @code{revoutput} extension adds a simple output wrapper that reverses
+the characters in each output line.  Its main purpose is to show how to
+write an output wrapper, although it may be mildly amusing for the unwary.
+Here is an example:
+
+@cindex @code{revoutput} extension
+@example
+@@load "revoutput"
+
+BEGIN @{
+    REVOUT = 1
+    print "don't panic" > "/dev/stdout"
+@}
+@end example
+
+The output from this program is @samp{cinap t'nod}.
+
+@node Extension Sample Rev2way
+@subsection Two-Way I/O Example
+
+The @code{revtwoway} extension adds a simple two-way processor that
+reverses the characters in each line sent to it for reading back by
+the @command{awk} program.  Its main purpose is to show how to write
+a two-way processor, although it may also be mildly amusing.
+The following example shows how to use it:
+
+@cindex @code{revtwoway} extension
+@example
+@@load "revtwoway"
+
+BEGIN @{
+    cmd = "/magic/mirror"
+    print "don't panic" |& cmd
+    cmd |& getline result
+    print result
+    close(cmd)
+@}
+@end example
+
+The output from this program
+@ifnotinfo
+also is:
+@end ifnotinfo
+@ifinfo
+is:
+@end ifinfo
+@samp{cinap t'nod}.
+
+@node Extension Sample Read write array
+@subsection Dumping and Restoring an Array
+
+The @code{rwarray} extension adds two functions,
+named @code{writea()} and @code{reada()}, as follows:
+
+@table @code
+@item @@load "rwarray"
+This is how you load the extension.
+
+@cindex @code{writea()} extension function
+@item ret = writea(file, array)
+This function takes a string argument, which is the name of the file
+to which to dump the array, and the array itself as the second argument.
+@code{writea()} understands arrays of arrays.  It returns one on
+success, or zero upon failure.
+
+@cindex @code{reada()} extension function
+@item ret = reada(file, array)
+@code{reada()} is the inverse of @code{writea()};
+it reads the file named as its first argument, filling in
+the array named as the second argument. It clears the array first.
+Here too, the return value is one on success, or zero upon failure.
+@end table
+
+The array created by @code{reada()} is identical to that written by
+@code{writea()} in the sense that the contents are the same. However,
+due to implementation issues, the array traversal order of the re-created
+array is likely to be different from that of the original array.  As array
+traversal order in @command{awk} is by default undefined, this is (technically)
+not a problem.  If you need to guarantee a particular traversal
+order, use the array sorting features in @command{gawk} to do so
+(@pxref{Array Sorting}).
+
+The file contains binary data.  All integral values are written in network
+byte order.  However, double-precision floating-point values are written
+as native binary data.  Thus, arrays containing only string data can
+theoretically be dumped on systems with one byte order and restored on
+systems with a different one, but this has not been tried.
+
+Here is an example:
+
+@example
+@@load "rwarray"
+@dots{}
+ret = writea("arraydump.bin", array)
+@dots{}
+ret = reada("arraydump.bin", array)
+@end example
+
+@node Extension Sample Readfile
+@subsection Reading an Entire File
+
+The @code{readfile} extension adds a single function
+named @code{readfile()}, and an input parser:
+
+@table @code
+@item @@load "readfile"
+This is how you load the extension.
+
+@cindex @code{readfile()} extension function
+@item result = readfile("/some/path")
+The argument is the name of the file to read.  The return value is a
+string containing the entire contents of the requested file.  Upon error,
+the function returns the empty string and sets @code{ERRNO}.
+
+@item BEGIN @{ PROCINFO["readfile"] = 1 @}
+In addition, the extension adds an input parser that is activated if
+@code{PROCINFO["readfile"]} exists.
+When activated, each input file is returned in its entirety as @code{$0}.
+@code{RT} is set to the null string.
+@end table
+
+Here is an example:
+
+@example
+@@load "readfile"
+@dots{}
+contents = readfile("/path/to/file");
+if (contents == "" && ERRNO != "") @{
+    print("problem reading file", ERRNO) > "/dev/stderr"
+    ...
+@}
+@end example
+
+@node Extension Sample Time
+@subsection Extension Time Functions
+
+The @code{time} extension adds two functions, named @code{gettimeofday()}
+and @code{sleep()}, as follows:
+
+@table @code
+@item @@load "time"
+This is how you load the extension.
+
+@cindex @code{gettimeofday()} extension function
+@item the_time = gettimeofday()
+Return the time in seconds that has elapsed since 1970-01-01 UTC as a
+floating-point value.  If the time is unavailable on this platform, return
+@minus{}1 and set @code{ERRNO}.  The returned time should have sub-second
+precision, but the actual precision may vary based on the platform.
+If the standard C @code{gettimeofday()} system call is available on this
+platform, then it simply returns the value.  Otherwise, if on MS-Windows,
+it tries to use @code{GetSystemTimeAsFileTime()}.
+
+@cindex @code{sleep()} extension function
+@item result = sleep(@var{seconds})
+Attempt to sleep for @var{seconds} seconds.  If @var{seconds} is negative,
+or the attempt to sleep fails, return @minus{}1 and set @code{ERRNO}.
+Otherwise, return zero after sleeping for the indicated amount of time.
+Note that @var{seconds} may be a floating-point (nonintegral) value.
+Implementation details: depending on platform availability, this function
+tries to use @code{nanosleep()} or @code{select()} to implement the delay.
+@end table
+
+@node Extension Sample API Tests
+@subsection API Tests
+@cindex @code{testext} extension
+
+The @code{testext} extension exercises parts of the extension API that
+are not tested by the other samples.  The @file{extension/testext.c}
+file contains both the C code for the extension and @command{awk}
+test code inside C comments that run the tests. The testing framework
+extracts the @command{awk} code and runs the tests.  See the source file
+for more information.
+
+@node gawkextlib
+@section The @code{gawkextlib} Project
+@cindex @code{gawkextlib}
+@cindex extensions, where to find
+
+@cindex @code{gawkextlib} project
+The @uref{https://sourceforge.net/projects/gawkextlib/, @code{gawkextlib}}
+project provides a number of @command{gawk} extensions, including one for
+processing XML files.  This is the evolution of the original @command{xgawk}
+(XML @command{gawk}) project.
+
+There are a number of extensions. Some of the more interesting ones are:
+
+@itemize @value{BULLET}
+@item
+@code{abort} extension. It allows you to exit immediately from your
+@command{awk} program without running the @code{END} rules.
+
+@item
+@code{json} extension.
+This serializes a multidimensional array into a JSON string, and
+can deserialize a JSON string into a @command{gawk} array.
+This extension is interesting since it is written in C++ instead of C.
+
+@item
+MPFR library extension.
+This provides access to a number of MPFR functions that @command{gawk}'s
+native MPFR support does not.
+
+@item
+Select extension. It provides functionality based on the
+@code{select()} system call.
+
+@item
+XML parser extension, using the @uref{https://expat.sourceforge.net, Expat}
+XML parsing library
+@end itemize
+
+@cindex @command{git} utility
+You can check out the code for the @code{gawkextlib} project
+using the @uref{https://git-scm.com, Git} distributed source
+code control system.  The command is as follows:
+
+@example
+git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib-code
+@end example
+
+@cindex RapidJson JSON parser library
+You will need to have the @uref{http://www.rapidjson.org, RapidJson}
+JSON parser library installed in order to build and use the @code{json} extension.
+
+@cindex Expat XML parser library
+You will need to have the @uref{https://expat.sourceforge.net, Expat}
+XML parser library installed in order to build and use the XML extension.
+
+In addition, you must have the GNU Autotools installed
+(@uref{https://www.gnu.org/software/autoconf, Autoconf},
+@uref{https://www.gnu.org/software/automake, Automake},
+@uref{https://www.gnu.org/software/libtool, Libtool},
+and
+@uref{https://www.gnu.org/software/gettext, GNU @command{gettext}}).
+
+The simple recipe for building and testing @code{gawkextlib} is as follows.
+First, build and install @command{gawk}:
+
+@example
+cd .../path/to/gawk/code
+./configure --prefix=/tmp/newgawk     @ii{Install in /tmp/newgawk for now}
+make && make check                    @ii{Build and check that all is OK}
+make install                          @ii{Install gawk}
+@end example
+
+Next, go to @url{https://sourceforge.net/projects/gawkextlib/files} to
+download @code{gawkextlib} and any extensions that you would like to build.
+The @file{README} file at that site explains how to build the code.  If you
+installed @command{gawk} in a non-standard location, you will need to
+specify @code{./configure --with-gawk=@var{/path/to/gawk}} to find it.
+You may need to use the @command{sudo} utility
+to install both @command{gawk} and @code{gawkextlib}, depending upon
+how your system works.
+
+If you write an extension that you wish to share with other
+@command{gawk} users, consider doing so through the
+@code{gawkextlib} project.
+See the project's website for more information.
+
+@node Extension summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+You can write extensions (sometimes called plug-ins) for @command{gawk}
+in C or C++ using the application programming interface (API) defined
+by the @command{gawk} developers.
+
+@item
+Extensions must have a license compatible with the GNU General Public
+License (GPL), and they must assert that fact by declaring a variable
+named @code{plugin_is_GPL_compatible}.
+
+@item
+Communication between @command{gawk} and an extension is two-way.
+@command{gawk} passes a @code{struct} to the extension that contains
+various data fields and function pointers.  The extension can then call
+into @command{gawk} via the supplied function pointers to accomplish
+certain tasks.
+
+@item
+One of these tasks is to ``register'' the name and implementation of
+new @command{awk}-level functions with @command{gawk}.  The implementation
+takes the form of a C function pointer with a defined signature.
+By convention, implementation functions are named @code{do_@var{XXXX}()}
+for some @command{awk}-level function @code{@var{XXXX}()}.
+
+@item
+The API is defined in a header file named @file{gawkapi.h}. You must include
+a number of standard header files @emph{before} including it in your source file.
+
+@item
+API function pointers are provided for the following kinds of operations:
+
+@itemize @value{BULLET}
+@item
+Allocating, reallocating, and releasing memory
+
+@item
+Registration functions (you may register
+extension functions,
+exit callbacks,
+a version string,
+input parsers,
+output wrappers,
+and two-way processors)
+
+@item
+Printing fatal, nonfatal, warning, and ``lint'' warning messages
+
+@item
+Updating @code{ERRNO}, or unsetting it
+
+@item
+Accessing parameters, including converting an undefined parameter into
+an array
+
+@item
+Symbol table access (retrieving a global variable, creating one,
+or changing one)
+
+@item
+Creating and releasing cached values; this provides an
+efficient way to use values for multiple variables and
+can be a big performance win
+
+@item
+Manipulating arrays
+(retrieving, adding, deleting, and modifying elements;
+getting the count of elements in an array;
+creating a new array;
+clearing an array;
+and
+flattening an array for easy C-style looping over all its indices and elements)
+@end itemize
+
+@item
+The API defines a number of standard data types for representing
+@command{awk} values, array elements, and arrays.
+
+@item
+The API provides convenience functions for constructing values.
+It also provides memory management functions to ensure compatibility
+between memory allocated by @command{gawk} and memory allocated by an
+extension.
+
+@item
+@emph{All} memory passed from @command{gawk} to an extension must be
+treated as read-only by the extension.
+
+@item
+@emph{All} memory passed from an extension to @command{gawk} must come from
+the API's memory allocation functions. @command{gawk} takes responsibility for
+the memory and releases it when appropriate.
+
+@item
+The API provides information about the running version of @command{gawk} so
+that an extension can make sure it is compatible with the @command{gawk}
+that loaded it.
+
+@item
+It is easiest to start a new extension by copying the boilerplate code
+described in this @value{CHAPTER}.  Macros in the @file{gawkapi.h} header
+file make this easier to do.
+
+@item
+The @command{gawk} distribution includes a number of small but useful
+sample extensions. The @code{gawkextlib} project includes several more
+(larger) extensions.  If you wish to write an extension and contribute it
+to the community of @command{gawk} users, the @code{gawkextlib} project
+is the place to do so.
+
+@end itemize
+
+@c EXCLUDE START
+@node Extension Exercises
+@section Exercises
+
+@enumerate
+@item
+Add functions to implement system calls such as @code{chown()},
+@code{chmod()}, and @code{umask()} to the file operations extension
+presented in @ref{Internal File Ops}.
+
+@c Idea from comp.lang.awk, February 2015
+@item
+Write an input parser that prints a prompt if the input is
+a from a ``terminal'' device.  You can use the @code{isatty()}
+function to tell if the input file is a terminal. (Hint: this function
+is usually expensive to call; try to call it just once.)
+The content of the prompt should come from a variable settable
+by @command{awk}-level code.
+You can write the prompt to standard error. However,
+for best results, open a new file descriptor (or file pointer)
+on @file{/dev/tty} and print the prompt there, in case standard
+error has been redirected.
+
+Why is standard error a better
+choice than standard output for writing the prompt?
+Which reading mechanism should you replace, the one to get
+a record, or the one to read raw bytes?
+
+@item
+Write a wrapper script that provides an interface similar to
+@samp{sed -i} for the ``inplace'' extension presented in
+@ref{Extension Sample Inplace}.
+
+@end enumerate
+@c EXCLUDE END
+
+@ifnotinfo
+@part @value{PART4}Appendices
+@end ifnotinfo
+
+@ifdocbook
+
+@ifclear FOR_PRINT
+Part IV contains the appendices (including the two licenses that cover
+the @command{gawk} source code and this @value{DOCUMENT}, respectively)
+and the Glossary:
+@end ifclear
+
+@ifset FOR_PRINT
+Part IV contains three appendices, the last of which is the license that
+covers the @command{gawk} source code:
+@end ifset
+
+@itemize @value{BULLET}
+@item
+@ref{Language History}
+
+@item
+@ref{Installation}
+
+@ifclear FOR_PRINT
+@item
+@ref{Notes}
+
+@item
+@ref{Basic Concepts}
+
+@item
+@ref{Glossary}
+@end ifclear
+
+@item
+@ref{Copying}
+
+@ifclear FOR_PRINT
+@item
+@ref{GNU Free Documentation License}
+@end ifclear
+@end itemize
+@end ifdocbook
+
+@node Language History
+@appendix The Evolution of the @command{awk} Language
+
+This @value{DOCUMENT} describes the GNU implementation of @command{awk},
+which follows the POSIX specification.  Many longtime @command{awk}
+users learned @command{awk} programming with the original @command{awk}
+implementation in Version 7 Unix.  (This implementation was the basis for
+@command{awk} in Berkeley Unix, through 4.3-Reno.  Subsequent versions
+of Berkeley Unix, and, for a while, some systems derived from 4.4BSD-Lite, used various
+versions of @command{gawk} for their @command{awk}.)  This @value{CHAPTER}
+briefly describes the evolution of the @command{awk} language, with
+cross-references to other parts of the @value{DOCUMENT} where you can
+find more information.
+
+@ifset FOR_PRINT
+To save space, we have omitted
+information on the history of features in @command{gawk} from this
+edition. You can find it in the
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Feature-History.html,
+online documentation}.
+@end ifset
+
+@menu
+* V7/SVR3.1::                   The major changes between V7 and System V
+                                Release 3.1.
+* SVR4::                        Minor changes between System V Releases 3.1
+                                and 4.
+* POSIX::                       New features from the POSIX standard.
+* BTL::                         New features from Brian Kernighan's version of
+                                @command{awk}.
+* POSIX/GNU::                   The extensions in @command{gawk} not in POSIX
+                                @command{awk}.
+* Feature History::             The history of the features in @command{gawk}.
+* Common Extensions::           Common Extensions Summary.
+* Ranges and Locales::          How locales used to affect regexp ranges.
+* Contributors::                The major contributors to @command{gawk}.
+* History summary::             History summary.
+@end menu
+
+@node V7/SVR3.1
+@appendixsec Major Changes Between V7 and SVR3.1
+@cindex @command{awk}, versions of
+@cindex @command{awk}, versions of, changes between V7 and SVR3.1
+
+The @command{awk} language evolved considerably between the release of
+Version 7 Unix (1978) and the new version that was first made generally available in
+System V Release 3.1 (1987).  This @value{SECTION} summarizes the changes, with
+cross-references to further details:
+
+@itemize @value{BULLET}
+@item
+The requirement for @samp{;} to separate rules on a line
+(@pxref{Statements/Lines})
+
+@item
+User-defined functions and the @code{return} statement
+(@pxref{User-defined})
+
+@item
+The @code{delete} statement (@pxref{Delete})
+
+@item
+The @code{do}-@code{while} statement
+(@pxref{Do Statement})
+
+@item
+The built-in functions @code{atan2()}, @code{cos()}, @code{sin()}, @code{rand()}, and
+@code{srand()} (@pxref{Numeric Functions})
+
+@item
+The built-in functions @code{gsub()}, @code{sub()}, and @code{match()}
+(@pxref{String Functions})
+
+@item
+The built-in functions @code{close()} and @code{system()}
+(@pxref{I/O Functions})
+
+@item
+The @code{ARGC}, @code{ARGV}, @code{FNR}, @code{RLENGTH}, @code{RSTART},
+and @code{SUBSEP} predefined variables (@pxref{Built-in Variables})
+
+@item
+Assignable @code{$0} (@pxref{Changing Fields})
+
+@item
+The conditional expression using the ternary operator @samp{?:}
+(@pxref{Conditional Exp})
+
+@item
+The expression @samp{@var{indx} in @var{array}} outside of @code{for}
+statements (@pxref{Reference to Elements})
+
+@item
+The exponentiation operator @samp{^}
+(@pxref{Arithmetic Ops}) and its assignment operator
+form @samp{^=} (@pxref{Assignment Ops})
+
+@item
+C-compatible operator precedence, which breaks some old @command{awk}
+programs (@pxref{Precedence})
+
+@item
+Regexps as the value of @code{FS}
+(@pxref{Field Separators}) and as the
+third argument to the @code{split()} function
+(@pxref{String Functions}), rather than using only the first character
+of @code{FS}
+
+@item
+Dynamic regexps as operands of the @samp{~} and @samp{!~} operators
+(@pxref{Computed Regexps})
+
+@item
+The escape sequences @samp{\b}, @samp{\f}, and @samp{\r}
+(@pxref{Escape Sequences})
+
+@item
+Redirection of input for the @code{getline} function
+(@pxref{Getline})
+
+@item
+Multiple @code{BEGIN} and @code{END} rules
+(@pxref{BEGIN/END})
+
+@item
+Multidimensional arrays
+(@pxref{Multidimensional})
+@end itemize
+
+@node SVR4
+@appendixsec Changes Between SVR3.1 and SVR4
+
+@cindex @command{awk}, versions of, changes between SVR3.1 and SVR4
+The System V Release 4 (1989) version of Unix @command{awk} added these features
+(some of which originated in @command{gawk}):
+
+@itemize @value{BULLET}
+@item
+The @code{ENVIRON} array (@pxref{Built-in Variables})
+@c gawk and MKS awk
+
+@item
+Multiple @option{-f} options on the command line
+(@pxref{Options})
+@c MKS awk
+
+@item
+The @option{-v} option for assigning variables before program execution begins
+(@pxref{Options})
+@c GNU, Bell Laboratories & MKS together
+
+@item
+The @option{--} signal for terminating command-line options
+
+@item
+The @samp{\a}, @samp{\v}, and @samp{\x} escape sequences
+(@pxref{Escape Sequences})
+@c GNU, for ANSI C compat
+
+@item
+A defined return value for the @code{srand()} built-in function
+(@pxref{Numeric Functions})
+
+@item
+The @code{toupper()} and @code{tolower()} built-in string functions
+for case translation
+(@pxref{String Functions})
+
+@item
+A cleaner specification for the @samp{%c} format-control letter in the
+@code{printf} function
+(@pxref{Control Letters})
+
+@item
+The ability to dynamically pass the field width and precision (@code{"%*.*d"})
+in the argument list of @code{printf} and @code{sprintf()}
+(@pxref{Control Letters})
+
+@item
+The use of regexp constants, such as @code{/foo/}, as expressions, where
+they are equivalent to using the matching operator, as in @samp{$0 ~ /foo/}
+(@pxref{Using Constant Regexps})
+
+@item
+Processing of escape sequences inside command-line variable assignments
+(@pxref{Assignment Options})
+@end itemize
+
+@node POSIX
+@appendixsec Changes Between SVR4 and POSIX @command{awk}
+@cindex @command{awk}, versions of, changes between SVR4 and POSIX @command{awk}
+@cindex POSIX @command{awk}, changes in @command{awk} versions
+
+The POSIX Command Language and Utilities standard for @command{awk} (1992)
+introduced the following changes into the language:
+
+@itemize @value{BULLET}
+@item
+The use of @option{-W} for implementation-specific options
+(@pxref{Options})
+
+@item
+The use of @code{CONVFMT} for controlling the conversion of numbers
+to strings (@pxref{Conversion})
+
+@item
+The concept of a numeric string and tighter comparison rules to go
+with it (@pxref{Typing and Comparison})
+
+@item
+The use of predefined variables as function parameter names is forbidden
+(@pxref{Definition Syntax})
+
+@item
+More complete documentation of many of the previously undocumented
+features of the language
+@end itemize
+
+In 2012, a number of extensions that had been commonly available for
+many years were finally added to POSIX. They are:
+
+@itemize @value{BULLET}
+@item
+The @code{fflush()} built-in function for flushing buffered output
+(@pxref{I/O Functions})
+
+@item
+The @code{nextfile} statement
+(@pxref{Nextfile Statement})
+
+@item
+The ability to delete all of an array at once with @samp{delete @var{array}}
+(@pxref{Delete})
+
+@end itemize
+
+@xref{Common Extensions} for a list of common extensions
+not permitted by the POSIX standard.
+
+The 2008 POSIX standard can be found online at
+@url{http://pubs.opengroup.org/onlinepubs/9699919799/}.
+
+
+@node BTL
+@appendixsec Extensions in Brian Kernighan's @command{awk}
+
+@cindex @command{awk}, versions of, See Also Brian Kernighan's @command{awk}
+@cindex extensions, Brian Kernighan's @command{awk}
+@cindex Brian Kernighan's @command{awk}, extensions
+@cindex Kernighan, Brian
+Brian Kernighan
+has made his version available via his home page
+(@pxref{Other Versions}).
+
+This @value{SECTION} describes common extensions that
+originally appeared in his version of @command{awk}:
+
+@itemize @value{BULLET}
+@item
+The @samp{**} and @samp{**=} operators
+(@pxref{Arithmetic Ops}
+and
+@ref{Assignment Ops})
+
+@item
+The use of @code{func} as an abbreviation for @code{function}
+(@pxref{Definition Syntax})
+
+@item
+The @code{fflush()} built-in function for flushing buffered output
+(@pxref{I/O Functions})
+
+@ignore
+@item
+The @code{SYMTAB} array, that allows access to @command{awk}'s internal symbol
+table. This feature was never documented for his @command{awk}, largely because
+it is somewhat shakily implemented. For instance, you cannot access arrays
+or array elements through it
+@end ignore
+@end itemize
+
+@xref{Common Extensions} for a full list of the extensions
+available in his @command{awk}.
+
+@node POSIX/GNU
+@appendixsec Extensions in @command{gawk} Not in POSIX @command{awk}
+
+@cindex compatibility mode (@command{gawk}), extensions
+@cindex extensions, in @command{gawk}, not in POSIX @command{awk}
+@cindex POSIX, @command{gawk} extensions not included in
+The GNU implementation, @command{gawk}, adds a large number of features.
+They can all be disabled with either the @option{--traditional} or
+@option{--posix} options
+(@pxref{Options}).
+
+A number of features have come and gone over the years. This @value{SECTION}
+summarizes the additional features over POSIX @command{awk} that are
+in the current version of @command{gawk}.
+
+@itemize @value{BULLET}
+
+@item
+Additional predefined variables:
+
+@itemize @value{MINUS}
+@item
+The
+@code{ARGIND},
+@code{BINMODE},
+@code{ERRNO},
+@code{FIELDWIDTHS},
+@code{FPAT},
+@code{IGNORECASE},
+@code{LINT},
+@code{PROCINFO},
+@code{RT},
+and
+@code{TEXTDOMAIN}
+variables
+(@pxref{Built-in Variables})
+@end itemize
+
+@item
+Special files in I/O redirections:
+
+@itemize @value{MINUS}
+@item
+The @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr}, and
+@file{/dev/fd/@var{N}} special @value{FN}s
+(@pxref{Special Files})
+
+@item
+The @file{/inet}, @file{/inet4}, and @file{/inet6} special files for
+TCP/IP networking using @samp{|&} to specify which version of the
+IP protocol to use
+(@pxref{TCP/IP Networking})
+@end itemize
+
+@item
+Changes and/or additions to the language:
+
+@itemize @value{MINUS}
+@item
+The @samp{\x} escape sequence
+(@pxref{Escape Sequences})
+
+@item
+Full support for both POSIX and GNU regexps
+(@pxref{Regexp})
+
+@item
+The ability for @code{FS} and for the third
+argument to @code{split()} to be null strings
+(@pxref{Single Character Fields})
+
+@item
+The ability for @code{RS} to be a regexp
+(@pxref{Records})
+
+@item
+The ability to use octal and hexadecimal constants in @command{awk}
+program source code
+(@pxref{Nondecimal-numbers})
+
+@item
+The @samp{|&} operator for two-way I/O to a coprocess
+(@pxref{Two-way I/O})
+
+@item
+Indirect function calls
+(@pxref{Indirect Calls})
+
+@item
+Directories on the command line produce a warning and are skipped
+(@pxref{Command-line directories})
+
+@item
+Output with @code{print} and @code{printf} need not be fatal
+(@pxref{Nonfatal})
+@end itemize
+
+@item
+New keywords:
+
+@itemize @value{MINUS}
+@item
+The @code{BEGINFILE} and @code{ENDFILE} special patterns
+(@pxref{BEGINFILE/ENDFILE})
+
+@item
+The @code{switch} statement
+(@pxref{Switch Statement})
+@end itemize
+
+@item
+Changes to standard @command{awk} functions:
+
+@itemize @value{MINUS}
+@item
+The optional second argument to @code{close()} that allows closing one end
+of a two-way pipe to a coprocess
+(@pxref{Two-way I/O})
+
+@item
+POSIX compliance for @code{gsub()} and @code{sub()} with @option{--posix}
+
+@item
+The @code{length()} function accepts an array argument
+and returns the number of elements in the array
+(@pxref{String Functions})
+
+@item
+The optional third argument to the @code{match()} function
+for capturing text-matching subexpressions within a regexp
+(@pxref{String Functions})
+
+@item
+Positional specifiers in @code{printf} formats for
+making translations easier
+(@pxref{Printf Ordering})
+
+@item
+The @code{split()} function's additional optional fourth
+argument, which is an array to hold the text of the field separators
+(@pxref{String Functions})
+@end itemize
+
+@item
+Additional functions only in @command{gawk}:
+
+@itemize @value{MINUS}
+@item
+The @code{gensub()}, @code{patsplit()}, and @code{strtonum()} functions
+for more powerful text manipulation
+(@pxref{String Functions})
+
+@item
+The @code{asort()} and @code{asorti()} functions for sorting arrays
+(@pxref{Array Sorting})
+
+@item
+The @code{mktime()}, @code{systime()}, and @code{strftime()}
+functions for working with timestamps
+(@pxref{Time Functions})
+
+@item
+The
+@code{and()},
+@code{compl()},
+@code{lshift()},
+@code{or()},
+@code{rshift()},
+and
+@code{xor()}
+functions for bit manipulation
+(@pxref{Bitwise Functions})
+@c In 4.1, and(), or() and xor() grew the ability to take > 2 arguments
+
+@item
+The @code{isarray()} function to check if a variable is an array or not
+(@pxref{Type Functions})
+
+@item
+The @code{bindtextdomain()}, @code{dcgettext()}, and @code{dcngettext()}
+functions for internationalization
+(@pxref{Programmer i18n})
+
+@ifset INTDIV
+@item
+The @code{intdiv0()} function for doing integer
+division and remainder
+(@pxref{Numeric Functions})
+@end ifset
+@end itemize
+
+@item
+Changes and/or additions in the command-line options:
+
+@itemize @value{MINUS}
+@item
+The @env{AWKPATH} environment variable for specifying a path search for
+the @option{-f} command-line option
+(@pxref{Options})
+
+@item
+The @env{AWKLIBPATH} environment variable for specifying a path search for
+the @option{-l} command-line option
+(@pxref{Options})
+
+@item
+The
+@option{-b},
+@option{-c},
+@option{-C},
+@option{-d},
+@option{-D},
+@option{-e},
+@option{-E},
+@option{-g},
+@option{-h},
+@option{-i},
+@option{-l},
+@option{-L},
+@option{-M},
+@option{-n},
+@option{-N},
+@option{-o},
+@option{-O},
+@option{-p},
+@option{-P},
+@option{-r},
+@option{-s},
+@option{-S},
+@option{-t},
+and
+@option{-V}
+short options. Also, the
+ability to use GNU-style long-named options that start with @option{--},
+and the
+@option{--assign},
+@option{--bignum},
+@option{--characters-as-bytes},
+@option{--copyright},
+@option{--debug},
+@option{--dump-variables},
+@option{--exec},
+@option{--field-separator},
+@option{--file},
+@option{--gen-pot},
+@option{--help},
+@option{--include},
+@option{--lint},
+@option{--lint-old},
+@option{--load},
+@option{--non-decimal-data},
+@option{--optimize},
+@option{--no-optimize},
+@option{--posix},
+@option{--pretty-print},
+@option{--profile},
+@option{--re-interval},
+@option{--sandbox},
+@option{--source},
+@option{--traditional},
+@option{--use-lc-numeric},
+and
+@option{--version}
+long options
+(@pxref{Options}).
+@end itemize
+
+@c       new ports
+
+@item
+Support for the following obsolete systems was removed from the code
+and the documentation for @command{gawk} @value{PVERSION} 4.0:
+
+@c nested table
+@itemize @value{MINUS}
+@item
+Amiga
+
+@item
+Atari
+
+@item
+BeOS
+
+@item
+Cray
+
+@item
+MIPS RiscOS
+
+@item
+MS-DOS with the Microsoft Compiler
+
+@item
+MS-Windows with the Microsoft Compiler
+
+@item
+NeXT
+
+@item
+SunOS 3.x, Sun 386 (Road Runner)
+
+@item
+Tandem (non-POSIX)
+
+@item
+Prestandard VAX C compiler for VAX/VMS
+
+@item
+GCC for VAX and Alpha has not been tested for a while.
+
+@end itemize
+
+@item
+Support for the following obsolete system was removed from the code
+for @command{gawk} @value{PVERSION} 4.1:
+
+@c nested table
+@itemize @value{MINUS}
+@item
+Ultrix
+@end itemize
+
+@item
+Support for the following systems was removed from the code
+for @command{gawk} @value{PVERSION} 4.2:
+
+@c nested table
+@itemize @value{MINUS}
+@item
+MirBSD
+
+@item
+GNU/Linux on Alpha
+@end itemize
+
+@end itemize
+
+@c XXX ADD MORE STUFF HERE
+
+
+@c This does not need to be in the formal book.
+@ifclear FOR_PRINT
+@node Feature History
+@appendixsec History of @command{gawk} Features
+
+@ignore
+See the thread:
+https://groups.google.com/forum/#!topic/comp.lang.awk/SAUiRuff30c
+This motivated me to add this section.
+@end ignore
+
+@ignore
+I've tried to follow this general order, esp.@: for the 3.0 and 3.1 sections:
+       variables
+       special files
+       language changes (e.g., hex constants)
+       differences in standard awk functions
+       new gawk functions
+       new keywords
+       new command-line options
+       behavioral changes
+       extension API changes
+       new / deprecated / removed ports
+       installation time stuff
+Within each category, be alphabetical.
+@end ignore
+
+This @value{SECTION} describes the features in @command{gawk}
+over and above those in POSIX @command{awk},
+in the order they were added to @command{gawk}.
+
+Version 2.10 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+The @env{AWKPATH} environment variable for specifying a path search for
+the @option{-f} command-line option
+(@pxref{Options}).
+
+@item
+The @code{IGNORECASE} variable and its effects
+(@pxref{Case-sensitivity}).
+
+@item
+The @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr} and
+@file{/dev/fd/@var{N}} special @value{FN}s
+(@pxref{Special Files}).
+@end itemize
+
+Version 2.13 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+The @code{FIELDWIDTHS} variable and its effects
+(@pxref{Constant Size}).
+
+@item
+The @code{systime()} and @code{strftime()} built-in functions for obtaining
+and printing timestamps
+(@pxref{Time Functions}).
+
+@item
+Additional command-line options
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The @option{-W lint} option to provide error and portability checking
+for both the source code and at runtime.
+
+@item
+The @option{-W compat} option to turn off the GNU extensions.
+
+@item
+The @option{-W posix} option for full POSIX compliance.
+@end itemize
+@end itemize
+
+Version 2.14 of @command{gawk} introduced the following feature:
+
+@itemize @value{BULLET}
+@item
+The @code{next file} statement for skipping to the next @value{DF}
+(@pxref{Nextfile Statement}).
+@end itemize
+
+Version 2.15 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+New variables (@pxref{Built-in Variables}):
+
+@itemize @value{MINUS}
+@item
+@code{ARGIND}, which tracks the movement of @code{FILENAME}
+through @code{ARGV}.
+
+@item
+@code{ERRNO}, which contains the system error message when
+@code{getline} returns @minus{}1 or @code{close()} fails.
+@end itemize
+
+@item
+The @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}, and
+@file{/dev/user} special @value{FN}s. These have since been removed.
+
+@item
+The ability to delete all of an array at once with @samp{delete @var{array}}
+(@pxref{Delete}).
+
+@item
+Command-line option changes
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The ability to use GNU-style long-named options that start with @option{--}.
+
+@item
+The @option{--source} option for mixing command-line and library-file
+source code.
+@end itemize
+@end itemize
+
+Version 3.0 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+New or changed variables:
+
+@itemize @value{MINUS}
+@item
+@code{IGNORECASE} changed, now applying to string comparison as well
+as regexp operations
+(@pxref{Case-sensitivity}).
+
+@item
+@code{RT}, which contains the input text that matched @code{RS}
+(@pxref{Records}).
+@end itemize
+
+@item
+Full support for both POSIX and GNU regexps
+(@pxref{Regexp}).
+
+@item
+The @code{gensub()} function for more powerful text manipulation
+(@pxref{String Functions}).
+
+@item
+The @code{strftime()} function acquired a default time format,
+allowing it to be called with no arguments
+(@pxref{Time Functions}).
+
+@item
+The ability for @code{FS} and for the third
+argument to @code{split()} to be null strings
+(@pxref{Single Character Fields}).
+
+@item
+The ability for @code{RS} to be a regexp
+(@pxref{Records}).
+
+@item
+The @code{next file} statement became @code{nextfile}
+(@pxref{Nextfile Statement}).
+
+@item
+The @code{fflush()} function from
+BWK @command{awk}
+(then at Bell Laboratories;
+@pxref{I/O Functions}).
+
+@item
+New command-line options:
+
+@itemize @value{MINUS}
+@item
+The @option{--lint-old} option to
+warn about constructs that are not available in
+the original Version 7 Unix version of @command{awk}
+(@pxref{V7/SVR3.1}).
+
+@item
+The @option{-m} option from BWK @command{awk}.  (Brian was
+still at Bell Laboratories at the time.)  This was later removed from
+both his @command{awk} and from @command{gawk}.
+
+@item
+The @option{--re-interval} option to provide interval expressions in regexps
+(@pxref{Regexp Operators}).
+
+@item
+The @option{--traditional} option was added as a better name for
+@option{--compat} (@pxref{Options}).
+@end itemize
+
+@item
+The use of GNU Autoconf to control the configuration process
+(@pxref{Quick Installation}).
+
+@item
+Amiga support.
+This has since been removed.
+
+@end itemize
+
+Version 3.1 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+New variables
+(@pxref{Built-in Variables}):
+
+@itemize @value{MINUS}
+@item
+@code{BINMODE}, for non-POSIX systems,
+which allows binary I/O for input and/or output files
+(@pxref{PC Using}).
+
+@item
+@code{LINT}, which dynamically controls lint warnings.
+
+@item
+@code{PROCINFO}, an array for providing process-related information.
+
+@item
+@code{TEXTDOMAIN}, for setting an application's internationalization text domain
+(@pxref{Internationalization}).
+@end itemize
+
+@item
+The ability to use octal and hexadecimal constants in @command{awk}
+program source code
+(@pxref{Nondecimal-numbers}).
+
+@item
+The @samp{|&} operator for two-way I/O to a coprocess
+(@pxref{Two-way I/O}).
+
+@item
+The @file{/inet} special files for TCP/IP networking using @samp{|&}
+(@pxref{TCP/IP Networking}).
+
+@item
+The optional second argument to @code{close()} that allows closing one end
+of a two-way pipe to a coprocess
+(@pxref{Two-way I/O}).
+
+@item
+The optional third argument to the @code{match()} function
+for capturing text-matching subexpressions within a regexp
+(@pxref{String Functions}).
+
+@item
+Positional specifiers in @code{printf} formats for
+making translations easier
+(@pxref{Printf Ordering}).
+
+@item
+A number of new built-in functions:
+
+@itemize @value{MINUS}
+@item
+The @code{asort()} and @code{asorti()} functions for sorting arrays
+(@pxref{Array Sorting}).
+
+@item
+The @code{bindtextdomain()}, @code{dcgettext()} and @code{dcngettext()} functions
+for internationalization
+(@pxref{Programmer i18n}).
+
+@item
+The @code{extension()} function and the ability to add
+new built-in functions dynamically
+(@pxref{Dynamic Extensions}).
+
+@item
+The @code{mktime()} function for creating timestamps
+(@pxref{Time Functions}).
+
+@item
+The @code{and()}, @code{or()}, @code{xor()}, @code{compl()},
+@code{lshift()}, @code{rshift()}, and @code{strtonum()} functions
+(@pxref{Bitwise Functions}).
+@end itemize
+
+@item
+@cindex @code{next file} statement
+The support for @samp{next file} as two words was removed completely
+(@pxref{Nextfile Statement}).
+
+@item
+Additional command-line options
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The @option{--dump-variables} option to print a list of all global variables.
+
+@item
+The @option{--exec} option, for use in CGI scripts.
+
+@item
+The @option{--gen-po} command-line option and the use of a leading
+underscore to mark strings that should be translated
+(@pxref{String Extraction}).
+
+@item
+The @option{--non-decimal-data} option to allow non-decimal
+input data
+(@pxref{Nondecimal Data}).
+
+@item
+The @option{--profile} option and @command{pgawk}, the
+profiling version of @command{gawk}, for producing execution
+profiles of @command{awk} programs
+(@pxref{Profiling}).
+
+@item
+The @option{--use-lc-numeric} option to force @command{gawk}
+to use the locale's decimal point for parsing input data
+(@pxref{Conversion}).
+@end itemize
+
+@item
+The use of GNU Automake to help in standardizing the configuration process
+(@pxref{Quick Installation}).
+
+@item
+The use of GNU @command{gettext} for @command{gawk}'s own message output
+(@pxref{Gawk I18N}).
+
+@item
+BeOS support. This was later removed.
+
+@item
+Tandem support. This was later removed.
+
+@item
+The Atari port became officially unsupported and was
+later removed entirely.
+
+@item
+The source code changed to use ISO C standard-style function definitions.
+
+@item
+POSIX compliance for @code{sub()} and @code{gsub()}
+(@pxref{Gory Details}).
+
+@item
+The @code{length()} function was extended to accept an array argument
+and return the number of elements in the array
+(@pxref{String Functions}).
+
+@item
+The @code{strftime()} function acquired a third argument to
+enable printing times as UTC
+(@pxref{Time Functions}).
+@end itemize
+
+Version 4.0 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+
+@item
+Variable additions:
+
+@itemize @value{MINUS}
+@item
+@code{FPAT}, which allows you to specify a regexp that matches
+the fields, instead of matching the field separator
+(@pxref{Splitting By Content}).
+
+@item
+If @code{PROCINFO["sorted_in"]} exists, @samp{for(iggy in foo)} loops sort the
+indices before looping over them.  The value of this element
+provides control over how the indices are sorted before the loop
+traversal starts
+(@pxref{Controlling Scanning}).
+
+@item
+@code{PROCINFO["strftime"]}, which holds
+the default format for @code{strftime()}
+(@pxref{Time Functions}).
+@end itemize
+
+@item
+The special files @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}
+and @file{/dev/user} were removed.
+
+@item
+Support for IPv6 was added via the @file{/inet6} special file.
+@file{/inet4} forces IPv4 and @file{/inet} chooses the system
+default, which is probably IPv4
+(@pxref{TCP/IP Networking}).
+
+@item
+The use of @samp{\s} and @samp{\S} escape sequences in regular expressions
+(@pxref{GNU Regexp Operators}).
+
+@item
+Interval expressions became part of default regular expressions
+(@pxref{Regexp Operators}).
+
+@item
+POSIX character classes work even with @option{--traditional}
+(@pxref{Regexp Operators}).
+
+@item
+@code{break} and @code{continue} became invalid outside a loop,
+even with @option{--traditional}
+(@pxref{Break Statement}, and also see
+@ref{Continue Statement}).
+
+@item
+@code{fflush()}, @code{nextfile}, and @samp{delete @var{array}}
+are allowed if @option{--posix} or @option{--traditional}, since they
+are all now part of POSIX.
+
+@item
+An optional third argument to
+@code{asort()} and @code{asorti()}, specifying how to sort
+(@pxref{String Functions}).
+
+@item
+The behavior of @code{fflush()} changed to match BWK @command{awk}
+and for POSIX; now both @samp{fflush()} and @samp{fflush("")}
+flush all open output redirections
+(@pxref{I/O Functions}).
+
+@item
+The @code{isarray()}
+function which distinguishes if an item is an array
+or not, to make it possible to traverse arrays of arrays
+(@pxref{Type Functions}).
+
+@item
+The @code{patsplit()}
+function which gives the same capability as @code{FPAT}, for splitting
+(@pxref{String Functions}).
+
+@item
+An optional fourth argument to the @code{split()} function,
+which is an array to hold the values of the separators
+(@pxref{String Functions}).
+
+@item
+Arrays of arrays
+(@pxref{Arrays of Arrays}).
+
+@item
+The @code{BEGINFILE} and @code{ENDFILE} special patterns
+(@pxref{BEGINFILE/ENDFILE}).
+
+@item
+Indirect function calls
+(@pxref{Indirect Calls}).
+
+@item
+@code{switch} / @code{case} are enabled by default
+(@pxref{Switch Statement}).
+
+@item
+Command-line option changes
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The @option{-b} and @option{--characters-as-bytes} options
+which prevent @command{gawk} from treating input as a multibyte string.
+
+@item
+The redundant @option{--compat}, @option{--copyleft}, and @option{--usage}
+long options were removed.
+
+@item
+The @option{--gen-po} option was finally renamed to the correct @option{--gen-pot}.
+
+@item
+The @option{--sandbox} option which disables certain features.
+
+@item
+All long options acquired corresponding short options, for use in @samp{#!} scripts.
+@end itemize
+
+@item
+Directories named on the command line now produce a warning, not a fatal
+error, unless @option{--posix} or @option{--traditional} are used
+(@pxref{Command-line directories}).
+
+@item
+The @command{gawk} internals were rewritten, bringing the @command{dgawk}
+debugger and possibly improved performance
+(@pxref{Debugger}).
+
+@item
+Per the GNU Coding Standards, dynamic extensions must now define
+a global symbol indicating that they are GPL-compatible
+(@pxref{Plugin License}).
+
+@item
+In POSIX mode, string comparisons use @code{strcoll()} / @code{wcscoll()}
+(@pxref{POSIX String Comparison}).
+
+@item
+The option for raw sockets was removed, since it was never implemented
+(@pxref{TCP/IP Networking}).
+
+@item
+Ranges of the form @samp{[d-h]} are treated as if they were in the
+C locale, no matter what kind of regexp is being used, and even if
+@option{--posix}
+(@pxref{Ranges and Locales}).
+
+@item
+Support was removed for the following systems:
+
+@itemize @value{MINUS}
+@item
+Atari
+
+@item
+Amiga
+
+@item
+BeOS
+
+@item
+Cray
+
+@item
+MIPS RiscOS
+
+@item
+MS-DOS with the Microsoft Compiler
+
+@item
+MS-Windows with the Microsoft Compiler
+
+@item
+NeXT
+
+@item
+SunOS 3.x, Sun 386 (Road Runner)
+
+@item
+Tandem (non-POSIX)
+
+@item
+Prestandard VAX C compiler for VAX/VMS
+@end itemize
+@end itemize
+
+Version 4.1 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+
+@item
+Three new arrays:
+@code{SYMTAB}, @code{FUNCTAB}, and @code{PROCINFO["identifiers"]}
+(@pxref{Auto-set}).
+
+@item
+The three executables @command{gawk}, @command{pgawk}, and @command{dgawk}, were merged into
+one, named just @command{gawk}.  As a result the command-line options changed.
+
+@item
+Command-line option changes
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The @option{-D} option invokes the debugger.
+
+@item
+The @option{-i} and @option{--include} options
+load @command{awk} library files.
+
+@item
+The @option{-l} and @option{--load} options load compiled dynamic extensions.
+
+@item
+The @option{-M} and @option{--bignum} options enable MPFR.
+
+@item
+The @option{-o} option only does pretty-printing.
+
+@item
+The @option{-p} option is used for profiling.
+
+@item
+The @option{-R} option was removed.
+@end itemize
+
+@item
+Support for high precision arithmetic with MPFR
+(@pxref{Arbitrary Precision Arithmetic}).
+
+@item
+The @code{and()}, @code{or()} and @code{xor()} functions
+changed to allow any number of arguments,
+with a minimum of two
+(@pxref{Bitwise Functions}).
+
+@item
+The dynamic extension interface was completely redone
+(@pxref{Dynamic Extensions}).
+
+@item
+Redirected @code{getline} became allowed inside
+@code{BEGINFILE} and @code{ENDFILE}
+(@pxref{BEGINFILE/ENDFILE}).
+
+@item
+The @code{where} command was added to the debugger
+(@pxref{Execution Stack}).
+
+@item
+Support for Ultrix was removed.
+
+@end itemize
+
+Version 4.2 of @command{gawk} introduced the following changes:
+
+@itemize @bullet
+@item
+Changes to @code{ENVIRON} are reflected into @command{gawk}'s
+environment and that of programs that it runs.
+@xref{Auto-set}.
+
+@item
+@code{FIELDWIDTHS} was enhanced to allow skipping characters
+before assigning a value to a field
+(@pxref{Splitting By Content}).
+
+@item
+The @code{PROCINFO["argv"]} array.
+@xref{Auto-set}.
+
+@item
+The maximum number of hexadecimal digits in @samp{\x} escapes
+is now two.
+@xref{Escape Sequences}.
+
+@item
+Strongly typed regexp constants of the form @samp{@@/@dots{}/}
+(@pxref{Strong Regexp Constants}).
+
+@item
+The bitwise functions changed, making negative arguments into
+a fatal error (@pxref{Bitwise Functions}).
+
+@ifset INTDIV
+@item
+The @code{intdiv0()} function.
+@xref{Numeric Functions}.
+@end ifset
+
+@item
+The @code{mktime()} function now accepts an optional
+second argument
+(@pxref{Time Functions}).
+
+@item
+The @code{typeof()} function (@pxref{Type Functions}).
+
+@item
+Optimizations are enabled by default. Use @option{-s} /
+@option{--no-optimize} to disable optimizations.
+
+@item
+For many years, POSIX specified that default field splitting
+only allowed spaces and tabs to separate fields, and this was
+how @command{gawk} behaved with @option{--posix}. As of 2013,
+the standard restored historical behavior, and now default
+field splitting with @option{--posix} also allows newlines to
+separate fields.
+
+@item
+Nonfatal output with @code{print} and @code{printf}.
+@xref{Nonfatal}.
+
+@item
+Retryable I/O via @code{PROCINFO[@var{input-file}, "RETRY"]};
+(@pxref{Retrying Input}).
+
+@item
+Changes to the pretty-printer (@pxref{Profiling}):
+
+@c nested table
+@itemize @value{MINUS}
+@item
+The @option{--pretty-print} option no longer runs the @command{awk}
+program too.
+
+@item
+Comments in the source program are preserved and placed into the
+output file.
+
+@item
+Explicit parentheses for expressions
+in the input are preserved in the generated output.
+@end itemize
+
+@item
+Improvements to the extension API
+(@pxref{Dynamic Extensions}):
+
+@c nested
+@itemize @value{MINUS}
+@item
+The @code{get_file()} function to access open redirections.
+
+@item
+The @code{nonfatal()} function for generating nonfatal error messages.
+
+@item
+Support for GMP and MPFR values.
+
+@item
+Input parsers can now override the default field parsing mechanism
+by specifying explicit locations.
+@end itemize
+
+@item
+Shell startup files are supplied with the distribution and
+installed by @samp{make install} (@pxref{Shell Startup Files}).
+
+@item
+The @command{igawk} program and its manual page are no longer
+installed when @command{gawk} is built.
+@xref{Igawk Program}.
+
+@item
+Support for MirBSD was removed.
+
+@item
+Support for GNU/Linux on Alpha was removed.
+
+@end itemize
+
+Version 5.0 added the following features:
+
+@itemize
+@item
+The @code{PROCINFO["platform"]} array element, which allows you
+to write code that takes the operating system / platform into account.
+@end itemize
+
+@c XXX ADD MORE STUFF HERE
+@end ifclear
+
+@node Common Extensions
+@appendixsec Common Extensions Summary
+
+@cindex extensions, Brian Kernighan's @command{awk}
+@cindex extensions, @command{mawk}
+The following table summarizes the common extensions supported
+by @command{gawk}, Brian Kernighan's @command{awk}, and @command{mawk},
+the three most widely used freely available versions of @command{awk}
+(@pxref{Other Versions}).
+
+@multitable {@file{/dev/stderr} special file} {BWK @command{awk}} {@command{mawk}} {@command{gawk}} {Now standard}
+@headitem Feature @tab BWK @command{awk} @tab @command{mawk} @tab @command{gawk} @tab Now standard
+@item @samp{\x} escape sequence @tab X @tab X @tab X @tab
+@item @code{FS} as null string @tab X @tab X @tab X @tab
+@item @file{/dev/stdin} special file @tab X @tab X @tab X @tab
+@item @file{/dev/stdout} special file @tab X @tab X @tab X @tab
+@item @file{/dev/stderr} special file @tab X @tab X @tab X @tab
+@item @code{delete} without subscript @tab X @tab X @tab X @tab X
+@item @code{fflush()} function @tab X @tab X @tab X @tab X
+@item @code{length()} of an array @tab X @tab X @tab X @tab
+@item @code{nextfile} statement @tab X @tab X @tab X @tab X
+@item @code{**} and @code{**=} operators @tab X @tab @tab X @tab
+@item @code{func} keyword @tab X @tab @tab X @tab
+@item @code{BINMODE} variable @tab @tab X @tab X @tab
+@item @code{RS} as regexp @tab @tab X @tab X @tab
+@item Time-related functions @tab @tab X @tab X @tab
+@end multitable
+
+@node Ranges and Locales
+@appendixsec Regexp Ranges and Locales: A Long Sad Story
+
+This @value{SECTION} describes the confusing history of ranges within
+regular expressions and their interactions with locales, and how this
+affected different versions of @command{gawk}.
+
+The original Unix tools that worked with regular expressions defined
+character ranges (such as @samp{[a-z]}) to match any character between
+the first character in the range and the last character in the range,
+inclusive.  Ordering was based on the numeric value of each character
+in the machine's native character set.  Thus, on ASCII-based systems,
+@samp{[a-z]} matched all the lowercase letters, and only the lowercase
+letters, as the numeric values for the letters from @samp{a} through
+@samp{z} were contiguous.  (On an EBCDIC system, the range @samp{[a-z]}
+includes additional nonalphabetic characters as well.)
+
+Almost all introductory Unix literature explained range expressions
+as working in this fashion, and in particular, would teach that the
+``correct'' way to match lowercase letters was with @samp{[a-z]}, and
+that @samp{[A-Z]} was the ``correct'' way to match uppercase letters.
+And indeed, this was true.@footnote{And Life was good.}
+
+The 1992 POSIX standard introduced the idea of locales (@pxref{Locales}).
+Because many locales include other letters besides the plain 26
+letters of the English alphabet, the POSIX standard added
+character classes (@pxref{Bracket Expressions}) as a way to match
+different kinds of characters besides the traditional ones in the ASCII
+character set.
+
+However, the standard @emph{changed} the interpretation of range expressions.
+In the @code{"C"} and @code{"POSIX"} locales, a range expression like
+@samp{[a-dx-z]} is still equivalent to @samp{[abcdxyz]}, as in ASCII.
+But outside those locales, the ordering was defined to be based on
+@dfn{collation order}.
+
+What does that mean?
+In many locales, @samp{A} and @samp{a} are both less than @samp{B}.
+In other words, these locales sort characters in dictionary order,
+and @samp{[a-dx-z]} is typically not equivalent to @samp{[abcdxyz]};
+instead, it might be equivalent to @samp{[ABCXYabcdxyz]}, for example.
+
+This point needs to be emphasized: much literature teaches that you should
+use @samp{[a-z]} to match a lowercase character.  But on systems with
+non-ASCII locales, this also matches all of the uppercase characters
+except @samp{A} or @samp{Z}!  This was a continuous cause of confusion, even well
+into the twenty-first century.
+
+To demonstrate these issues, the following example uses the @code{sub()}
+function, which does text replacement (@pxref{String Functions}).  Here,
+the intent is to remove trailing uppercase characters:
+
+@example
+$ @kbd{echo something1234abc | gawk-3.1.8 '@{ sub("[A-Z]*$", ""); print @}'}
+@print{} something1234a
+@end example
+
+@noindent
+This output is unexpected, as the @samp{bc} at the end of
+@samp{something1234abc} should not normally match @samp{[A-Z]*}.
+This result is due to the locale setting (and thus you may not see
+it on your system).
+
+@cindex Unicode
+Similar considerations apply to other ranges.  For example, @samp{["-/]}
+is perfectly valid in ASCII, but is not valid in many Unicode locales,
+such as @code{en_US.UTF-8}.
+
+Early versions of @command{gawk} used regexp matching code that was not
+locale-aware, so ranges had their traditional interpretation.
+
+When @command{gawk} switched to using locale-aware regexp matchers,
+the problems began; especially as both GNU/Linux and commercial Unix
+vendors started implementing non-ASCII locales, @emph{and making them
+the default}.  Perhaps the most frequently asked question became something
+like, ``Why does @samp{[A-Z]} match lowercase letters?!?''
+
+@cindex Berry, Karl
+This situation existed for close to 10 years, if not more, and
+the @command{gawk} maintainer grew weary of trying to explain that
+@command{gawk} was being nicely standards-compliant, and that the issue
+was in the user's locale.  During the development of @value{PVERSION} 4.0,
+he modified @command{gawk} to always treat ranges in the original,
+pre-POSIX fashion, unless @option{--posix} was used (@pxref{Options}).@footnote{And
+thus was born the Campaign for Rational Range Interpretation (or
+RRI). A number of GNU tools have already implemented this change,
+or will soon.  Thanks to Karl Berry for coining the phrase ``Rational
+Range Interpretation.''}
+
+Fortunately, shortly before the final release of @command{gawk} 4.0,
+the maintainer learned that the 2008 standard had changed the
+definition of ranges, such that outside the @code{"C"} and @code{"POSIX"}
+locales, the meaning of range expressions was @emph{undefined}.@footnote{See
+@uref{http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05, the standard}
+and
+@uref{http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap09.html#tag_21_09_03_05, its rationale}.}
+
+By using this lovely technical term, the standard gives license
+to implementers to implement ranges in whatever way they choose.
+The @command{gawk} maintainer chose to apply the pre-POSIX meaning
+both with the default regexp matching and when @option{--traditional} or
+@option{--posix} are used.
+In all cases @command{gawk} remains POSIX-compliant.
+
+@node Contributors
+@appendixsec Major Contributors to @command{gawk}
+@cindex @command{gawk}, list of contributors to
+@quotation
+@i{Always give credit where credit is due.}
+@author Anonymous
+@end quotation
+
+This @value{SECTION} names the major contributors to @command{gawk}
+and/or this @value{DOCUMENT}, in approximate chronological order:
+
+@itemize @value{BULLET}
+@item
+@cindex Aho, Alfred
+@cindex Weinberger, Peter
+@cindex Kernighan, Brian
+Dr.@: Alfred V.@: Aho,
+Dr.@: Peter J.@: Weinberger, and
+Dr.@: Brian W.@: Kernighan, all of Bell Laboratories,
+designed and implemented Unix @command{awk},
+from which @command{gawk} gets the majority of its feature set.
+
+@item
+@cindex Rubin, Paul
+Paul Rubin
+did the initial design and implementation in 1986, and wrote
+the first draft (around 40 pages) of this @value{DOCUMENT}.
+
+@item
+@cindex Fenlason, Jay
+Jay Fenlason
+finished the initial implementation.
+
+@item
+@cindex Close, Diane
+Diane Close
+revised the first draft of this @value{DOCUMENT}, bringing it
+to around 90 pages.
+
+@item
+@cindex Stallman, Richard
+Richard Stallman
+helped finish the implementation and the initial draft of this
+@value{DOCUMENT}.
+He is also the founder of the FSF and the GNU Project.
+
+@item
+@cindex Woods, John
+John Woods
+contributed parts of the code (mostly fixes) in
+the initial version of @command{gawk}.
+
+@item
+@cindex Trueman, David
+In 1988,
+David Trueman
+took over primary maintenance of @command{gawk},
+making it compatible with ``new'' @command{awk}, and
+greatly improving its performance.
+
+@item
+@cindex Kwok, Conrad
+@cindex Garfinkle, Scott
+@cindex Williams, Kent
+Conrad Kwok,
+Scott Garfinkle,
+and
+Kent Williams
+did the initial ports to MS-DOS with various versions of MSC.
+
+@item
+@cindex Rankin, Pat
+Pat Rankin
+provided the VMS port and its documentation.
+
+@item
+@cindex Peterson, Hal
+Hal Peterson
+provided help in porting @command{gawk} to Cray systems.
+(This is no longer supported.)
+
+@item
+@cindex Rommel, Kai Uwe
+Kai Uwe Rommel
+provided the initial port to OS/2 and its documentation.
+
+@item
+@cindex Jaegermann, Michal
+Michal Jaegermann
+provided the port to Atari systems and its documentation.
+(This port is no longer supported.)
+He continues to provide portability checking,
+and has done a lot of work to make sure @command{gawk}
+works on non-32-bit systems.
+
+@item
+@cindex Fish, Fred
+Fred Fish
+provided the port to Amiga systems and its documentation.
+(With Fred's sad passing, this is no longer supported.)
+
+@item
+@cindex Deifik, Scott
+Scott Deifik
+formerly maintained the MS-DOS port using DJGPP.
+
+@item
+@cindex Zaretskii, Eli
+Eli Zaretskii
+currently maintains the MS-Windows port using MinGW.
+
+@item
+@cindex Grigera, Juan
+Juan Grigera
+provided a port to Windows32 systems.
+(This is no longer supported.)
+
+
+@item
+@cindex Hankerson, Darrel
+For many years,
+Dr.@: Darrel Hankerson
+acted as coordinator for the various ports to different PC platforms
+and created binary distributions for various PC operating systems.
+He was also instrumental in keeping the documentation up to date for
+the various PC platforms.
+
+@item
+@cindex Zoulas, Christos
+Christos Zoulas
+provided the @code{extension()}
+built-in function for dynamically adding new functions.
+(This was obsoleted at @command{gawk} 4.1.)
+
+@item
+@cindex Kahrs, J@"urgen
+J@"urgen Kahrs
+contributed the initial version of the TCP/IP networking
+code and documentation, and motivated the inclusion of the @samp{|&} operator.
+
+@item
+@cindex Davies, Stephen
+Stephen Davies
+provided the initial port to Tandem systems and its documentation.
+(However, this is no longer supported.)
+He was also instrumental in the initial work to integrate the
+byte-code internals into the @command{gawk} code base.
+Additionally, he did most of the work enabling the pretty-printer
+to preserve and output comments.
+
+@item
+@cindex Woehlke, Matthew
+Matthew Woehlke
+provided improvements for Tandem's POSIX-compliant systems.
+
+@item
+@cindex Brown, Martin
+Martin Brown
+provided the port to BeOS and its documentation.
+(This is no longer supported.)
+
+@item
+@cindex Peters, Arno
+Arno Peters
+did the initial work to convert @command{gawk} to use
+GNU Automake and GNU @command{gettext}.
+
+@item
+@cindex Broder, Alan J.@:
+Alan J.@: Broder
+provided the initial version of the @code{asort()} function
+as well as the code for the optional third argument to the
+@code{match()} function.
+
+@item
+@cindex Buening, Andreas
+Andreas Buening
+updated the @command{gawk} port for OS/2.
+
+@item
+@cindex Hasegawa, Isamu
+Isamu Hasegawa,
+of IBM in Japan, contributed support for multibyte characters.
+
+@item
+@cindex Benzinger, Michael
+Michael Benzinger contributed the initial code for @code{switch} statements.
+
+@item
+@cindex McPhee, Patrick
+Patrick T.J.@: McPhee contributed the code for dynamic loading in Windows32
+environments.
+(This is no longer supported.)
+
+@item
+@cindex Wallin, Anders
+Anders Wallin helped keep the VMS port going for several years.
+
+@item
+@cindex Gordon, Assaf
+Assaf Gordon contributed the initial code to implement the
+@option{--sandbox} option.
+
+@item
+@cindex Haque, John
+John Haque made the following contributions:
+
+@itemize @value{MINUS}
+@item
+The modifications to convert @command{gawk}
+into a byte-code interpreter, including the debugger
+
+@item
+The addition of true arrays of arrays
+
+@item
+The additional modifications for support of arbitrary-precision arithmetic
+
+@item
+The initial text of
+@ref{Arbitrary Precision Arithmetic}
+
+@item
+The work to merge the three versions of @command{gawk}
+into one, for the 4.1 release
+
+@item
+Improved array internals for arrays indexed by integers
+
+@item
+The improved array sorting features were also driven by John, together
+with Pat Rankin
+@end itemize
+
+@cindex Papadopoulos, Panos
+@item
+Panos Papadopoulos contributed the original text for @ref{Include Files}.
+
+@item
+@cindex Yawitz, Efraim
+Efraim Yawitz contributed the original text for @ref{Debugger}.
+
+@item
+@cindex Schorr, Andrew
+The development of the extension API first released with
+@command{gawk} 4.1 was driven primarily by
+Arnold Robbins and Andrew Schorr, with notable contributions from
+the rest of the development team.
+
+@cindex Malmberg, John
+@item
+John Malmberg contributed significant improvements to the
+OpenVMS port and the related documentation.
+
+@item
+@cindex Colombo, Antonio
+Antonio Giovanni Colombo rewrote a number of examples in the early
+chapters that were severely dated, for which I am incredibly grateful.
+He also provided and maintains the Italian translation.
+
+@item
+@cindex Curreli, Marco
+Marco Curreli, together with Antonio Colombo, translated this
+@value{DOCUMENT} into Italian.  It is included in the @command{gawk}
+distribution.
+
+@item
+@cindex Guerrero, Juan Manuel
+Juan Manuel Guerrero took over maintenance of the DJGPP port.
+
+@item
+@cindex Robbins, Arnold
+Arnold Robbins
+has been working on @command{gawk} since 1988, at first
+helping David Trueman, and as the primary maintainer since around 1994.
+@end itemize
+
+@node History summary
+@appendixsec Summary
+
+@itemize @value{BULLET}
+@item
+The @command{awk} language has evolved over time. The first release
+was with V7 Unix, circa 1978.  In 1987, for System V Release 3.1,
+major additions, including user-defined functions, were made to the language.
+Additional changes were made for System V Release 4, in 1989.
+Since then, further minor changes have happened under the auspices of the
+POSIX standard.
+
+@item
+Brian Kernighan's @command{awk} provides a small number of extensions
+that are implemented in common with other versions of @command{awk}.
+
+@item
+@command{gawk} provides a large number of extensions over POSIX @command{awk}.
+They can be disabled with either the @option{--traditional} or @option{--posix}
+options.
+
+@item
+The interaction of POSIX locales and regexp matching in @command{gawk} has been confusing over
+the years. Today, @command{gawk} implements Rational Range Interpretation, where
+ranges of the form @samp{[a-z]} match @emph{only} the characters numerically between
+@samp{a} through @samp{z} in the machine's native character set.  Usually this is ASCII,
+but it can be EBCDIC on IBM S/390 systems.
+
+@item
+Many people have contributed to @command{gawk} development over the years.
+We hope that the list provided in this @value{CHAPTER} is complete and gives
+the appropriate credit where credit is due.
+
+@end itemize
+
+@node Installation
+@appendix Installing @command{gawk}
+
+@c last two commas are part of see also
+@cindex operating systems, See Also GNU/Linux@comma{} PC operating systems@comma{} Unix
+@cindex @command{gawk}, installing
+@cindex installing @command{gawk}
+This appendix provides instructions for installing @command{gawk} on the
+various platforms that are supported by the developers.  The primary
+developer supports GNU/Linux (and Unix), whereas the other ports are
+contributed.
+@xref{Bugs}
+for the email addresses of the people who maintain
+the respective ports.
+
+@menu
+* Gawk Distribution::           What is in the @command{gawk} distribution.
+* Unix Installation::           Installing @command{gawk} under various
+                                versions of Unix.
+* Non-Unix Installation::       Installation on Other Operating Systems.
+* Bugs::                        Reporting Problems and Bugs.
+* Other Versions::              Other freely available @command{awk}
+                                implementations.
+* Installation summary::        Summary of installation.
+@end menu
+
+@node Gawk Distribution
+@appendixsec The @command{gawk} Distribution
+@cindex source code, @command{gawk}
+
+This @value{SECTION} describes how to get the @command{gawk}
+distribution, how to extract it, and then what is in the various files and
+subdirectories.
+
+@menu
+* Getting::                     How to get the distribution.
+* Extracting::                  How to extract the distribution.
+* Distribution contents::       What is in the distribution.
+@end menu
+
+@node Getting
+@appendixsubsec Getting the @command{gawk} Distribution
+@cindex @command{gawk}, source code@comma{} obtaining
+There are two ways to get GNU software:
+
+@itemize @value{BULLET}
+@item
+Copy it from someone else who already has it.
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@item
+Retrieve @command{gawk}
+from the Internet host
+@code{ftp.gnu.org}, in the directory @file{/gnu/gawk}.
+Both anonymous @command{ftp} and @code{http} access are supported.
+If you have the @command{wget} program, you can use a command like
+the following:
+
+@example
+wget https://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+@end example
+@end itemize
+
+The GNU software archive is mirrored around the world.
+The up-to-date list of mirror sites is available from
+@uref{https://www.gnu.org/order/ftp.html, the main FSF website}.
+Try to use one of the mirrors; they
+will be less busy, and you can usually find one closer to your site.
+
+You may also retrieve the @command{gawk} source code from the official
+Git repository; for more information see @ref{Accessing The Source}.
+
+@node Extracting
+@appendixsubsec Extracting the Distribution
+@command{gawk} is distributed as several @code{tar} files compressed with
+different compression programs: @command{gzip}, @command{bzip2},
+and @command{xz}. For simplicity, the rest of these instructions assume
+you are using the one compressed with the GNU Gzip program (@command{gzip}).
+
+Once you have the distribution (e.g.,
+@file{gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz}),
+use @code{gzip} to expand the
+file and then use @code{tar} to extract it.  You can use the following
+pipeline to produce the @command{gawk} distribution:
+
+@example
+gzip -d -c gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz | tar -xvpf -
+@end example
+
+On a system with GNU @command{tar}, you can let @command{tar}
+do the decompression for you:
+
+@example
+tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+@end example
+
+@noindent
+Extracting the archive
+creates a directory named @file{gawk-@value{VERSION}.@value{PATCHLEVEL}}
+in the current directory.
+
+The distribution @value{FN} is of the form
+@file{gawk-@var{V}.@var{R}.@var{P}.tar.gz}.
+The @var{V} represents the major version of @command{gawk},
+the @var{R} represents the current release of version @var{V}, and
+the @var{P} represents a @dfn{patch level}, meaning that minor bugs have
+been fixed in the release.  The current patch level is @value{PATCHLEVEL},
+but when retrieving distributions, you should get the version with the highest
+version, release, and patch level.  (Note, however, that patch levels greater than
+or equal to 60 denote ``beta'' or nonproduction software; you might not want
+to retrieve such a version unless you don't mind experimenting.)
+If you are not on a Unix or GNU/Linux system, you need to make other arrangements
+for getting and extracting the @command{gawk} distribution.  You should consult
+a local expert.
+
+@node Distribution contents
+@appendixsubsec Contents of the @command{gawk} Distribution
+@cindex @command{gawk}, distribution
+
+The @command{gawk} distribution has a number of C source files,
+documentation files,
+subdirectories, and files related to the configuration process
+(@pxref{Unix Installation}),
+as well as several subdirectories related to different non-Unix
+operating systems:
+
+@table @asis
+@item Various @samp{.c}, @samp{.y}, and @samp{.h} files
+These files contain the actual @command{gawk} source code.
+@end table
+
+@table @file
+@item support/*
+C header and source files for routines that @command{gawk}
+uses, but that are not part of its core functionality.
+For example, argument parsing, regular expression matching,
+and random number generating routines are all kept here.
+
+@item ABOUT-NLS
+A file containing information about GNU @command{gettext} and translations.
+
+@item AUTHORS
+A file with some information about the authorship of @command{gawk}.
+It exists only to satisfy the pedants at the Free Software Foundation.
+
+@item README
+@itemx README_d/README.*
+Descriptive files: @file{README} for @command{gawk} under Unix and the
+rest for the various hardware and software combinations.
+
+@item INSTALL
+A file providing an overview of the configuration and installation process.
+
+@item ChangeLog
+A detailed list of source code changes as bugs are fixed or improvements made.
+
+@item ChangeLog.0
+An older list of source code changes.
+
+@item NEWS
+A list of changes to @command{gawk} since the last release or patch.
+
+@item NEWS.0
+An older list of changes to @command{gawk}.
+
+@item COPYING
+The GNU General Public License.
+
+@item POSIX.STD
+A description of behaviors in the POSIX standard for @command{awk} that
+are left undefined, or where @command{gawk} may not comply fully, as well
+as a list of things that the POSIX standard should describe but does not.
+
+@cindex artificial intelligence@comma{} @command{gawk} and
+@item doc/awkforai.txt
+Pointers to the original draft of
+a short article describing why @command{gawk} is a good language for
+artificial intelligence (AI) programming.
+
+@item doc/bc_notes
+A brief description of @command{gawk}'s ``byte code'' internals.
+
+@item doc/README.card
+@itemx doc/ad.block
+@itemx doc/awkcard.in
+@itemx doc/cardfonts
+@itemx doc/colors
+@itemx doc/macros
+@itemx doc/no.colors
+@itemx doc/setter.outline
+The @command{troff} source for a five-color @command{awk} reference card.
+A modern version of @command{troff} such as GNU @command{troff} (@command{groff}) is
+needed to produce the color version. See the file @file{README.card}
+for instructions if you have an older @command{troff}.
+
+@item doc/gawk.1
+The @command{troff} source for a manual page describing @command{gawk}.
+This is distributed for the convenience of Unix users.
+
+@cindex Texinfo
+@item doc/gawktexi.in
+@itemx doc/sidebar.awk
+The Texinfo source file for this @value{DOCUMENT}.
+It should be processed by @file{doc/sidebar.awk}
+before processing with @command{texi2dvi} or @command{texi2pdf}
+to produce a printed document, and
+with @command{makeinfo} to produce an Info or HTML file.
+The @file{Makefile} takes care of this processing and produces
+printable output via @command{texi2dvi} or @command{texi2pdf}.
+
+@item doc/gawk.texi
+The file produced after processing @file{gawktexi.in}
+with @file{sidebar.awk}.
+
+@item doc/gawk.info
+The generated Info file for this @value{DOCUMENT}.
+
+@item doc/gawkinet.texi
+The Texinfo source file for
+@ifinfo
+@inforef{Top, , General Introduction, gawkinet, @value{GAWKINETTITLE}}.
+@end ifinfo
+@ifnotinfo
+@cite{@value{GAWKINETTITLE}}.
+@end ifnotinfo
+It should be processed with @TeX{}
+(via @command{texi2dvi} or @command{texi2pdf})
+to produce a printed document and
+with @command{makeinfo} to produce an Info or HTML file.
+
+@item doc/gawkinet.info
+The generated Info file for
+@cite{@value{GAWKINETTITLE}}.
+
+@item doc/igawk.1
+The @command{troff} source for a manual page describing the @command{igawk}
+program presented in
+@ref{Igawk Program}.
+(Since @command{gawk} can do its own @code{@@include} processing,
+neither @command{igawk} nor @file{igawk.1} are installed.)
+
+@item doc/it/*
+Files for the Italian translation of this @value{DOCUMENT}, produced and
+contributed by Antonio Colombo and Marco Curreli.
+
+@item doc/Makefile.in
+The input file used during the configuration process to generate the
+actual @file{Makefile} for creating the documentation.
+
+@item Makefile.am
+@itemx */Makefile.am
+Files used by the GNU Automake software for generating
+the @file{Makefile.in} files used by Autoconf and
+@command{configure}.
+
+@item Makefile.in
+@itemx aclocal.m4
+@itemx bisonfix.awk
+@itemx config.guess
+@itemx configh.in
+@itemx configure.ac
+@itemx configure
+@itemx custom.h
+@itemx depcomp
+@itemx install-sh
+@itemx missing_d/*
+@itemx mkinstalldirs
+@itemx m4/*
+These files and subdirectories are used when configuring and compiling
+@command{gawk} for various Unix systems.  Most of them are explained
+in @ref{Unix Installation}. The rest are there to support the main
+infrastructure.
+
+@item po/*
+The @file{po} library contains message translations.
+
+@item awklib/extract.awk
+@itemx awklib/Makefile.am
+@itemx awklib/Makefile.in
+@itemx awklib/eg/*
+The @file{awklib} directory contains a copy of @file{extract.awk}
+(@pxref{Extract Program}),
+which can be used to extract the sample programs from the Texinfo
+source file for this @value{DOCUMENT}. It also contains a @file{Makefile.in} file, which
+@command{configure} uses to generate a @file{Makefile}.
+@file{Makefile.am} is used by GNU Automake to create @file{Makefile.in}.
+The library functions from
+@ref{Library Functions},
+are included as ready-to-use files in the @command{gawk} distribution.
+They are installed as part of the installation process.
+The rest of the programs in this @value{DOCUMENT} are available in appropriate
+subdirectories of @file{awklib/eg}.
+
+@item extension/*
+The source code, manual pages, and infrastructure files for
+the sample extensions included with @command{gawk}.
+@xref{Dynamic Extensions}, for more information.
+
+@item extras/*
+Additional non-essential files.  Currently, this directory contains some shell
+startup files to be installed in @file{/etc/profile.d} to aid in manipulating
+the @env{AWKPATH} and @env{AWKLIBPATH} environment variables.
+@xref{Shell Startup Files}, for more information.
+
+@item posix/*
+Files needed for building @command{gawk} on POSIX-compliant systems.
+
+@item pc/*
+Files needed for building @command{gawk} under MS-Windows
+(@pxref{PC Installation} for details).
+
+@item vms/*
+Files needed for building @command{gawk} under Vax/VMS and OpenVMS
+(@pxref{VMS Installation} for details).
+
+@item test/*
+A test suite for
+@command{gawk}.  You can use @samp{make check} from the top-level @command{gawk}
+directory to run your version of @command{gawk} against the test suite.
+If @command{gawk} successfully passes @samp{make check}, then you can
+be confident of a successful port.
+@end table
+
+@node Unix Installation
+@appendixsec Compiling and Installing @command{gawk} on Unix-Like Systems
+
+Usually, you can compile and install @command{gawk} by typing only two
+commands.  However, if you use an unusual system, you may need
+to configure @command{gawk} for your system yourself.
+
+@menu
+* Quick Installation::               Compiling @command{gawk} under Unix.
+* Shell Startup Files::              Shell convenience functions.
+* Additional Configuration Options:: Other compile-time options.
+* Configuration Philosophy::         How it's all supposed to work.
+@end menu
+
+@node Quick Installation
+@appendixsubsec Compiling @command{gawk} for Unix-Like Systems
+
+The normal installation steps should work on all modern commercial
+Unix-derived systems, GNU/Linux, BSD-based systems, and the Cygwin
+environment for MS-Windows.
+
+After you have extracted the @command{gawk} distribution, @command{cd}
+to @file{gawk-@value{VERSION}.@value{PATCHLEVEL}}.  As with most GNU
+software, you configure @command{gawk} for your system by running the
+@command{configure} program.  This program is a Bourne shell script that
+is generated automatically using GNU Autoconf.
+@ifnotinfo
+(The Autoconf software is
+described fully in
+@cite{Autoconf---Generating Automatic Configuration Scripts},
+which can be found online at
+@uref{https://www.gnu.org/software/autoconf/manual/index.html,
+the Free Software Foundation's website}.)
+@end ifnotinfo
+@ifinfo
+(The Autoconf software is described fully starting with
+@inforef{Top, , Autoconf, autoconf,Autoconf---Generating Automatic Configuration Scripts}.)
+@end ifinfo
+
+To configure @command{gawk}, simply run @command{configure}:
+
+@example
+sh ./configure
+@end example
+
+This produces a @file{Makefile} and @file{config.h} tailored to your system.
+The @file{config.h} file describes various facts about your system.
+You might want to edit the @file{Makefile} to
+change the @code{CFLAGS} variable, which controls
+the command-line options that are passed to the C compiler (such as
+optimization levels or compiling for debugging).
+
+Alternatively, you can add your own values for most @command{make}
+variables on the command line, such as @code{CC} and @code{CFLAGS}, when
+running @command{configure}:
+
+@example
+CC=cc CFLAGS=-g sh ./configure
+@end example
+
+@noindent
+See the file @file{INSTALL} in the @command{gawk} distribution for
+all the details.
+
+After you have run @command{configure} and possibly edited the @file{Makefile},
+type:
+
+@example
+make
+@end example
+
+@noindent
+Shortly thereafter, you should have an executable version of @command{gawk}.
+That's all there is to it!
+To verify that @command{gawk} is working properly,
+run @samp{make check}.  All of the tests should succeed.
+If these steps do not work, or if any of the tests fail,
+check the files in the @file{README_d} directory to see if you've
+found a known problem.  If the failure is not described there,
+send in a bug report (@pxref{Bugs}).
+
+Of course, once you've built @command{gawk}, it is likely that you will
+wish to install it.  To do so, you need to run the command @samp{make
+install}, as a user with the appropriate permissions.  How to do this
+varies by system, but on many systems you can use the @command{sudo}
+command to do so.  The command then becomes @samp{sudo make install}. It
+is likely that you will be asked for your password, and you will have
+to have been set up previously as a user who is allowed to run the
+@command{sudo} command.
+
+@node Shell Startup Files
+@appendixsubsec Shell Startup Files
+
+The distribution contains shell startup files @file{gawk.sh} and
+@file{gawk.csh}, containing functions to aid in manipulating
+the @env{AWKPATH} and @env{AWKLIBPATH} environment variables.
+On a Fedora GNU/Linux system, these files should be installed in @file{/etc/profile.d};
+on other platforms, the appropriate location may be different.
+
+@table @command
+
+@cindex @command{gawkpath_default} shell function
+@item gawkpath_default
+Reset the @env{AWKPATH} environment variable to its default value.
+
+@cindex @command{gawkpath_prepend} shell function
+@item gawkpath_prepend
+Add the argument to the front of the @env{AWKPATH} environment variable.
+
+@cindex @command{gawkpath_append} shell function
+@item gawkpath_append
+Add the argument to the end of the @env{AWKPATH} environment variable.
+
+@cindex @command{gawklibpath_default} shell function
+@item gawklibpath_default
+Reset the @env{AWKLIBPATH} environment variable to its default value.
+
+@cindex @command{gawklibpath_prepend} shell function
+@item gawklibpath_prepend
+Add the argument to the front of the @env{AWKLIBPATH} environment variable.
+
+@cindex @command{gawklibpath_append} shell function
+@item gawklibpath_append
+Add the argument to the end of the @env{AWKLIBPATH} environment variable.
+
+@end table
+
+
+@node Additional Configuration Options
+@appendixsubsec Additional Configuration Options
+@cindex @command{gawk}, configuring, options
+@cindex configuration options@comma{} @command{gawk}
+
+There are several additional options you may use on the @command{configure}
+command line when compiling @command{gawk} from scratch, including:
+
+@table @code
+
+@cindex @option{--disable-extensions} configuration option
+@cindex configuration option, @code{--disable-extensions}
+@item --disable-extensions
+Disable the extension mechanism within @command{gawk}. With this
+option, it is not possible to use dynamic extensions.  This also
+disables configuring and building the sample extensions in the
+@file{extension} directory.
+
+This option may be useful for cross-compiling.
+The default action is to dynamically check if the extensions
+can be configured and compiled.
+
+@cindex @option{--disable-lint} configuration option
+@cindex configuration option, @code{--disable-lint}
+@item --disable-lint
+Disable all lint checking within @command{gawk}.  The
+@option{--lint} and @option{--lint-old} options
+(@pxref{Options})
+are accepted, but silently do nothing.
+Similarly, setting the @code{LINT} variable
+(@pxref{User-modified})
+has no effect on the running @command{awk} program.
+
+When used with the GNU Compiler Collection's (GCC's)
+automatic dead-code-elimination, this option
+cuts almost 23K bytes off the size of the @command{gawk}
+executable on GNU/Linux x86_64 systems.  Results on other systems and
+with other compilers are likely to vary.
+Using this option may bring you some slight performance improvement.
+
+@quotation CAUTION
+Using this option will cause some of the tests in the test suite
+to fail.  This option may be removed at a later date.
+@end quotation
+
+@cindex @option{--disable-mpfr} configuration option
+@cindex configuration option, @code{--disable-mpfr}
+@item --disable-mpfr
+Skip checking for the MPFR and GMP libraries. This is useful
+mainly for the developers, to make sure nothing breaks if
+MPFR support is not available.
+
+@cindex @option{--disable-nls} configuration option
+@cindex configuration option, @code{--disable-nls}
+@item --disable-nls
+Disable all message-translation facilities.
+This is usually not desirable, but it may bring you some slight performance
+improvement.
+
+@cindex @option{--enable-versioned-extension-dir} configuration option
+@cindex configuration option, @code{--enable-versioned-extension-dir}
+@item --enable-versioned-extension-dir
+Use a versioned directory for extensions.  The directory name will
+include the major and minor API versions in it. This makes it possible
+to keep extensions for different API versions on the same system
+without their conflicting with one another.
+
+@end table
+
+Use the command @samp{./configure --help} to see the full list of
+options supplied by @command{configure}.
+
+@node Configuration Philosophy
+@appendixsubsec The Configuration Process
+
+@cindex @command{gawk}, configuring
+This @value{SECTION} is of interest only if you know something about using the
+C language and Unix-like operating systems.
+
+The source code for @command{gawk} generally attempts to adhere to formal
+standards wherever possible.  This means that @command{gawk} uses library
+routines that are specified by the ISO C standard and by the POSIX
+operating system interface standard.
+The @command{gawk} source code requires using an ISO C compiler (the 1990
+standard).
+
+Many Unix systems do not support all of either the ISO or the
+POSIX standards.  The @file{missing_d} subdirectory in the @command{gawk}
+distribution contains replacement versions of those functions that are
+most likely to be missing.
+
+The @file{config.h} file that @command{configure} creates contains
+definitions that describe features of the particular operating system
+where you are attempting to compile @command{gawk}.  The three things
+described by this file are: what header files are available, so that
+they can be correctly included, what (supposedly) standard functions
+are actually available in your C libraries, and various miscellaneous
+facts about your operating system.  For example, there may not be an
+@code{st_blksize} element in the @code{stat} structure.  In this case,
+@samp{HAVE_STRUCT_STAT_ST_BLKSIZE} is undefined.
+
+@cindex @code{custom.h} file
+It is possible for your C compiler to lie to @command{configure}. It may
+do so by not exiting with an error when a library function is not
+available.  To get around this, edit the @file{custom.h} file.
+Use an @samp{#ifdef} that is appropriate for your system, and either
+@code{#define} any constants that @command{configure} should have defined but
+didn't, or @code{#undef} any constants that @command{configure} defined and
+should not have.  The @file{custom.h} file is automatically included by
+the @file{config.h} file.
+
+It is also possible that the @command{configure} program generated by
+Autoconf will not work on your system in some other fashion.
+If you do have a problem, the @file{configure.ac} file is the input for
+Autoconf.  You may be able to change this file and generate a
+new version of @command{configure} that works on your system
+(@pxref{Bugs}
+for information on how to report problems in configuring @command{gawk}).
+The same mechanism may be used to send in updates to @file{configure.ac}
+and/or @file{custom.h}.
+
+@node Non-Unix Installation
+@appendixsec Installation on Other Operating Systems
+
+This @value{SECTION} describes how to install @command{gawk} on
+various non-Unix systems.
+
+@menu
+* PC Installation::             Installing and Compiling @command{gawk} on
+                                Microsoft Windows.
+* VMS Installation::            Installing @command{gawk} on VMS.
+@end menu
+
+@node PC Installation
+@appendixsubsec Installation on MS-Windows
+
+@cindex PC operating systems@comma{} @command{gawk} on, installing
+@cindex operating systems, PC@comma{} @command{gawk} on, installing
+This @value{SECTION} covers installation and usage of @command{gawk}
+on Intel architecture machines running any version of MS-Windows.
+In this @value{SECTION}, the term ``Windows32''
+refers to any of Microsoft Windows 95/98/ME/NT/2000/XP/Vista/7/8/10.
+
+See also the @file{README_d/README.pc} file in the distribution.
+
+@menu
+* PC Binary Installation::      Installing a prepared distribution.
+* PC Compiling::                Compiling @command{gawk} for Windows32.
+* PC Using::                    Running @command{gawk} on Windows32.
+* Cygwin::                      Building and running @command{gawk} for
+                                Cygwin.
+* MSYS::                        Using @command{gawk} In The MSYS Environment.
+@end menu
+
+@node PC Binary Installation
+@appendixsubsubsec Installing a Prepared Distribution for MS-Windows Systems
+
+The only supported binary distribution for MS-Windows systems
+is that provided by Eli Zaretskii's @uref{https://sourceforge.net/projects/ezwinports/,
+``ezwinports''} project.  Install the compiled @command{gawk} from there.
+
+@node PC Compiling
+@appendixsubsubsec Compiling @command{gawk} for PC Operating Systems
+
+@command{gawk} can be compiled for Windows32 using MinGW (Windows32).
+The file @file{README_d/README.pc} in the @command{gawk} distribution
+contains additional notes, and @file{pc/Makefile} contains important
+information on compilation options.
+
+@cindex compiling @command{gawk} for MS-Windows
+To build @command{gawk} for Windows32, copy the files in
+the @file{pc} directory (@emph{except} for @file{ChangeLog}) to the
+directory with the rest of the @command{gawk} sources, then invoke
+@command{make} with the appropriate target name as an argument to
+build @command{gawk}.  The @file{Makefile} copied from the @file{pc}
+directory contains a configuration section with comments and may need
+to be edited in order to work with your @command{make} utility.
+
+The @file{Makefile} supports a number of targets for building various
+MS-DOS and Windows32 versions.  A list of targets is printed if the
+@command{make} command is given without a target.  As an example,
+to build a native MS-Windows binary of @command{gawk} using the MinGW tools,
+type @samp{make mingw32}.
+
+@node PC Using
+@appendixsubsubsec Using @command{gawk} on PC Operating Systems
+@cindex operating systems, PC, @command{gawk} on
+@cindex PC operating systems, @command{gawk} on
+
+Information in this section applies to the MinGW and
+DJGPP ports of @command{gawk}. @xref{Cygwin} for information
+about the Cygwin port.
+
+Under MS-Windows, the MinGW environment supports
+both the @samp{|&} operator and TCP/IP networking
+(@pxref{TCP/IP Networking}).
+The DJGPP environment does not support @samp{|&}.
+
+@cindex search paths
+@cindex search paths, for source files
+@cindex @command{gawk}, MS-Windows version of
+@cindex @code{;} (semicolon), @env{AWKPATH} variable and
+@cindex semicolon (@code{;}), @env{AWKPATH} variable and
+@cindex @env{AWKPATH} environment variable
+The MS-Windows version of @command{gawk} searches for
+program files as described in @ref{AWKPATH Variable}.  However,
+semicolons (rather than colons) separate elements in the @env{AWKPATH}
+variable.  If @env{AWKPATH} is not set or is empty, then the default
+search path is @samp{@w{.;c:/lib/awk;c:/gnu/lib/awk}}.
+
+@cindex common extensions, @code{BINMODE} variable
+@cindex extensions, common@comma{} @code{BINMODE} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{BINMODE} variable
+@cindex @code{BINMODE} variable
+Under MS-Windows,
+@command{gawk} (and many other text programs) silently
+translates end-of-line @samp{\r\n} to @samp{\n} on input and @samp{\n}
+to @samp{\r\n} on output.  A special @code{BINMODE} variable @value{COMMONEXT}
+allows control over these translations and is interpreted as follows:
+
+@itemize @value{BULLET}
+@item
+If @code{BINMODE} is @code{"r"} or one,
+then
+binary mode is set on read (i.e., no translations on reads).
+
+@item
+If @code{BINMODE} is @code{"w"} or two,
+then
+binary mode is set on write (i.e., no translations on writes).
+
+@item
+If @code{BINMODE} is @code{"rw"} or @code{"wr"} or three,
+binary mode is set for both read and write.
+
+@item
+@code{BINMODE=@var{non-null-string}} is
+the same as @samp{BINMODE=3} (i.e., no translations on
+reads or writes).  However, @command{gawk} issues a warning
+message if the string is not one of @code{"rw"} or @code{"wr"}.
+@end itemize
+
+@noindent
+The modes for standard input and standard output are set one time
+only (after the
+command line is read, but before processing any of the @command{awk} program).
+Setting @code{BINMODE} for standard input or
+standard output is accomplished by using an
+appropriate @samp{-v BINMODE=@var{N}} option on the command line.
+@code{BINMODE} is set at the time a file or pipe is opened and cannot be
+changed midstream.
+
+On POSIX-compatible systems, this variable's value has no effect.
+Thus, if you think your program will run on multiple different systems
+and that you may need to use @code{BINMODE}, you should simply set it
+(in the program or on the command line) unconditionally, and not worry
+about the operating system on which your program is running.
+
+The name @code{BINMODE} was chosen to match @command{mawk}
+(@pxref{Other Versions}).
+@command{mawk} and @command{gawk} handle @code{BINMODE} similarly; however,
+@command{mawk} adds a @samp{-W BINMODE=@var{N}} option and an environment
+variable that can set @code{BINMODE}, @code{RS}, and @code{ORS}.  The
+files @file{binmode[1-3].awk} (under @file{gnu/lib/awk} in some of the
+prepared binary distributions) have been chosen to match @command{mawk}'s @samp{-W
+BINMODE=@var{N}} option.  These can be changed or discarded; in particular,
+the setting of @code{RS} giving the fewest ``surprises'' is open to debate.
+@command{mawk} uses @samp{RS = "\r\n"} if binary mode is set on read, which is
+appropriate for files with the MS-DOS-style end-of-line.
+
+To illustrate, the following examples set binary mode on writes for standard
+output and other files, and set @code{ORS} as the ``usual'' MS-DOS-style
+end-of-line:
+
+@example
+gawk -v BINMODE=2 -v ORS="\r\n" @dots{}
+@end example
+
+@noindent
+or:
+
+@example
+gawk -v BINMODE=w -f binmode2.awk @dots{}
+@end example
+
+@noindent
+These give the same result as the @samp{-W BINMODE=2} option in
+@command{mawk}.
+The following changes the record separator to @code{"\r\n"} and sets binary
+mode on reads, but does not affect the mode on standard input:
+
+@example
+gawk -v RS="\r\n" -e "BEGIN @{ BINMODE = 1 @}" @dots{}
+@end example
+
+@noindent
+or:
+
+@example
+gawk -f binmode1.awk @dots{}
+@end example
+
+@noindent
+With proper quoting, in the first example the setting of @code{RS} can be
+moved into the @code{BEGIN} rule.
+
+@node Cygwin
+@appendixsubsubsec Using @command{gawk} In The Cygwin Environment
+@cindex compiling @command{gawk} for Cygwin
+
+@command{gawk} can be built and used ``out of the box'' under MS-Windows
+if you are using the @uref{http://www.cygwin.com, Cygwin environment}.
+This environment provides an excellent simulation of GNU/Linux, using
+Bash, GCC, GNU Make,
+and other GNU programs.  Compilation and installation for Cygwin is the
+same as for a Unix system:
+
+@example
+tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+cd gawk-@value{VERSION}.@value{PATCHLEVEL}
+./configure
+make && make check
+@end example
+
+When compared to GNU/Linux on the same system, the @samp{configure}
+step on Cygwin takes considerably longer.  However, it does finish,
+and then the @samp{make} proceeds as usual.
+
+Recent versions of Cygwin open all files in binary mode. This means
+that you should use @samp{RS = "\r?\n"} in order to be able to
+handle standard MS-Windows text files with carriage-return plus
+line-feed line endings.
+
+The Cygwin environment supports
+both the @samp{|&} operator and TCP/IP networking
+(@pxref{TCP/IP Networking}).
+
+@node MSYS
+@appendixsubsubsec Using @command{gawk} In The MSYS Environment
+
+In the MSYS environment under MS-Windows, @command{gawk} automatically
+uses binary mode for reading and writing files.  Thus, there is no
+need to use the @code{BINMODE} variable.
+
+This can cause problems with other Unix-like components that have
+been ported to MS-Windows that expect @command{gawk} to do automatic
+translation of @code{"\r\n"}, because it won't.
+
+@node VMS Installation
+@appendixsubsec Compiling and Installing @command{gawk} on Vax/VMS and OpenVMS
+
+@c based on material from Pat Rankin <rankin@eql.caltech.edu>
+@c now rankin@pactechdata.com
+@c now r.pat.rankin@gmail.com
+
+@cindex @command{gawk}, VMS version of
+@cindex installation, VMS
+This @value{SUBSECTION} describes how to compile and install @command{gawk} under VMS.
+The older designation ``VMS'' is used throughout to refer to OpenVMS.
+
+@menu
+* VMS Compilation::             How to compile @command{gawk} under VMS.
+* VMS Dynamic Extensions::      Compiling @command{gawk} dynamic extensions on
+                                VMS.
+* VMS Installation Details::    How to install @command{gawk} under VMS.
+* VMS Running::                 How to run @command{gawk} under VMS.
+* VMS GNV::                     The VMS GNV Project.
+* VMS Old Gawk::                An old version comes with some VMS systems.
+@end menu
+
+@node VMS Compilation
+@appendixsubsubsec Compiling @command{gawk} on VMS
+@cindex compiling @command{gawk} for VMS
+
+To compile @command{gawk} under VMS, there is a @code{DCL} command procedure
+that issues all the necessary @code{CC} and @code{LINK} commands. There is
+also a @file{Makefile} for use with the @code{MMS} and @code{MMK} utilities.
+From the source directory, use either:
+
+@example
+$ @kbd{@@[.vms]vmsbuild.com}
+@end example
+
+@noindent
+or:
+
+@example
+$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms gawk}
+@end example
+
+@noindent
+or:
+
+@example
+$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms gawk}
+@end example
+
+@command{MMK} is an open source, free, near-clone of @command{MMS} and
+can better handle ODS-5 volumes with upper- and lowercase @value{FN}s.
+@command{MMK} is available from @uref{https://github.com/endlesssoftware/mmk}.
+
+With ODS-5 volumes and extended parsing enabled, the case of the target
+parameter may need to be exact.
+
+@command{gawk} has been tested under VAX/VMS 7.3 and Alpha/VMS 7.3-1
+using Compaq C V6.4, and under Alpha/VMS 7.3, Alpha/VMS 7.3-2, and IA64/VMS 8.3.
+The most recent builds used HP C V7.3 on Alpha VMS 8.3 and both
+Alpha and IA64 VMS 8.4 used HP C 7.3.@footnote{The IA64 architecture
+is also known as ``Itanium.''}
+
+@xref{VMS GNV} for information on building
+@command{gawk} as a PCSI kit that is compatible with the GNV product.
+
+@node VMS Dynamic Extensions
+@appendixsubsubsec Compiling @command{gawk} Dynamic Extensions on VMS
+
+The extensions that have been ported to VMS can be built using one of
+the following commands:
+
+@example
+$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms extensions}
+@end example
+
+@noindent
+or:
+
+@example
+$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms extensions}
+@end example
+
+@command{gawk} uses @code{AWKLIBPATH} as either an environment variable
+or a logical name to find the dynamic extensions.
+
+Dynamic extensions need to be compiled with the same compiler options for
+floating-point, pointer size, and symbol name handling as were used
+to compile @command{gawk} itself.
+Alpha and Itanium should use IEEE floating point.  The pointer size is 32 bits,
+and the symbol name handling should be exact case with CRC shortening for
+symbols longer than 32 bits.
+
+For Alpha and Itanium:
+
+@example
+/name=(as_is,short)
+/float=ieee/ieee_mode=denorm_results
+@end example
+
+For VAX:
+
+@example
+/name=(as_is,short)
+@end example
+
+Compile-time macros need to be defined before the first VMS-supplied
+header file is included, as follows:
+
+@example
+#if (__CRTL_VER >= 70200000) && !defined (__VAX)
+#define _LARGEFILE 1
+#endif
+
+#ifndef __VAX
+#ifdef __CRTL_VER
+#if __CRTL_VER >= 80200000
+#define _USE_STD_STAT 1
+#endif
+#endif
+#endif
+@end example
+
+If you are writing your own extensions to run on VMS, you must supply these
+definitions yourself. The @file{config.h} file created when building @command{gawk}
+on VMS does this for you; if instead you use that file or a similar one, then you
+must remember to include it before any VMS-supplied header files.
+
+@node VMS Installation Details
+@appendixsubsubsec Installing @command{gawk} on VMS
+
+To use @command{gawk}, all you need is a ``foreign'' command, which is a
+@code{DCL} symbol whose value begins with a dollar sign. For example:
+
+@example
+$ @kbd{GAWK :== $disk1:[gnubin]gawk}
+@end example
+
+@noindent
+Substitute the actual location of @command{gawk.exe} for
+@samp{$disk1:[gnubin]}. The symbol should be placed in the
+@file{login.com} of any user who wants to run @command{gawk},
+so that it is defined every time the user logs on.
+Alternatively, the symbol may be placed in the system-wide
+@file{sylogin.com} procedure, which allows all users
+to run @command{gawk}.
+
+If your @command{gawk} was installed by a PCSI kit into the
+@file{GNV$GNU:} directory tree, the program will be known as
+@file{GNV$GNU:[bin]gnv$gawk.exe} and the help file will be
+@file{GNV$GNU:[vms_help]gawk.hlp}.
+
+The PCSI kit also installs a @file{GNV$GNU:[vms_bin]gawk_verb.cld} file
+that can be used to add @command{gawk} and @command{awk} as DCL commands.
+
+For just the current process you can use:
+
+@example
+$ @kbd{set command gnv$gnu:[vms_bin]gawk_verb.cld}
+@end example
+
+Or the system manager can use @file{GNV$GNU:[vms_bin]gawk_verb.cld} to
+add the @command{gawk} and @command{awk} to the system-wide @samp{DCLTABLES}.
+
+The DCL syntax is documented in the @file{gawk.hlp} file.
+
+Optionally, the @file{gawk.hlp} entry can be loaded into a VMS help library:
+
+@example
+$ @kbd{LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp}
+@end example
+
+@noindent
+(You may want to substitute a site-specific help library rather than
+the standard VMS library @samp{HELPLIB}.)  After loading the help text,
+the command:
+
+@example
+$ @kbd{HELP GAWK}
+@end example
+
+@noindent
+provides information about both the @command{gawk} implementation and the
+@command{awk} programming language.
+
+The logical name @samp{AWK_LIBRARY} can designate a default location
+for @command{awk} program files.  For the @option{-f} option, if the specified
+@value{FN} has no device or directory path information in it, @command{gawk}
+looks in the current directory first, then in the directory specified
+by the translation of @samp{AWK_LIBRARY} if the file is not found.
+If, after searching in both directories, the file still is not found,
+@command{gawk} appends the suffix @samp{.awk} to the @value{FN} and retries
+the file search.  If @samp{AWK_LIBRARY} has no definition, a default value
+of @samp{SYS$LIBRARY:} is used for it.
+
+@node VMS Running
+@appendixsubsubsec Running @command{gawk} on VMS
+
+Command-line parsing and quoting conventions are significantly different
+on VMS, so examples in this @value{DOCUMENT} or from other sources often need minor
+changes.  They @emph{are} minor though, and all @command{awk} programs
+should run correctly.
+
+Here are a couple of trivial tests:
+
+@example
+$ @kbd{gawk -- "BEGIN @{print ""Hello, World!""@}"}
+$ @kbd{gawk -"W" version}
+! could also be -"W version" or "-W version"
+@end example
+
+@noindent
+Note that uppercase and mixed-case text must be quoted.
+
+The VMS port of @command{gawk} includes a @code{DCL}-style interface in addition
+to the original shell-style interface (see the help entry for details).
+One side effect of dual command-line parsing is that if there is only a
+single parameter (as in the quoted string program), the command
+becomes ambiguous.  To work around this, the normally optional @option{--}
+flag is required to force Unix-style parsing rather than @code{DCL} parsing.
+If any other dash-type options (or multiple parameters such as @value{DF}s to
+process) are present, there is no ambiguity and @option{--} can be omitted.
+
+@cindex exit status, of @command{gawk}, on VMS
+The @code{exit} value is a Unix-style value and is encoded into a VMS exit
+status value when the program exits.
+
+The VMS severity bits will be set based on the @code{exit} value.
+A failure is indicated by 1, and VMS sets the @code{ERROR} status.
+A fatal error is indicated by 2, and VMS sets the @code{FATAL} status.
+All other values will have the @code{SUCCESS} status.  The exit value is
+encoded to comply with VMS coding standards and will have the
+@code{C_FACILITY_NO} of @code{0x350000} with the constant @code{0xA000}
+added to the number shifted over by 3 bits to make room for the severity codes.
+
+To extract the actual @command{gawk} exit code from the VMS status, use:
+
+@example
+unix_status = (vms_status .and. %x7f8) / 8
+@end example
+
+@noindent
+A C program that uses @code{exec()} to call @command{gawk} will get the original
+Unix-style exit value.
+
+Older versions of @command{gawk} for VMS treated a Unix exit code 0 as 1,
+a failure as 2, a fatal error as 4, and passed all the other numbers through.
+This violated the VMS exit status coding requirements.
+
+@cindex floating-point, VAX/VMS
+VAX/VMS floating point uses unbiased rounding. @xref{Round Function}.
+
+VMS reports time values in GMT unless one of the @code{SYS$TIMEZONE_RULE}
+or @code{TZ} logical names is set.  Older versions of VMS, such as VAX/VMS
+7.3, do not set these logical names.
+
+@c @cindex directory search
+@c @cindex path, search
+@cindex search paths
+@cindex search paths, for source files
+The default search path, when looking for @command{awk} program files specified
+by the @option{-f} option, is @code{"SYS$DISK:[],AWK_LIBRARY:"}.  The logical
+name @env{AWKPATH} can be used to override this default.  The format
+of @env{AWKPATH} is a comma-separated list of directory specifications.
+When defining it, the value should be quoted so that it retains a single
+translation and not a multitranslation @code{RMS} searchlist.
+
+@cindex redirection on VMS
+
+This restriction also applies to running @command{gawk} under GNV,
+as redirection is always to a DCL command.
+
+If you are redirecting data to a VMS command or utility, the current
+implementation requires that setting up a VMS foreign command that runs
+a command file before invoking @command{gawk}.
+(This restriction may be removed in a future release of @command{gawk} on VMS.)
+
+Without this command file, the input data will also appear prepended
+to the output data.
+
+This also allows simulating POSIX commands that are not found on VMS or the
+use of GNV utilities.
+
+The example below is for @command{gawk} redirecting data to the VMS
+@command{sort} command.
+
+@example
+$ sort = "@@device:[dir]vms_gawk_sort.com"
+@end example
+
+The command file needs to be of the format in the example below.
+
+The first line inhibits the passed input data from also showing up in the
+output.  It must be in the format in the example.
+
+The next line creates a foreign command that overrides the outer foreign
+command which prevents an infinite recursion of command files.
+
+The next to the last command redirects @code{sys$input} to be
+@code{sys$command}, in order to pick up the data that is being redirected
+to the command.
+
+The last line runs the actual command.  It must be the last command as the data
+redirected from @command{gawk} will be read when the command file ends.
+
+@example
+$!'f$verify(0,0)'
+$ sort := sort
+$ define/user sys$input sys$command:
+$ sort sys$input: sys$output:
+@end example
+
+
+@node VMS GNV
+@appendixsubsubsec The VMS GNV Project
+
+The VMS GNV package provides a build environment similar to POSIX with ports
+of a collection of open source tools.  The @command{gawk} found in the GNV
+base kit is an older port.  Currently, the GNV project is being reorganized
+to supply individual PCSI packages for each component.
+See @w{@uref{https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/}.}
+
+The normal build procedure for @command{gawk} produces a program that
+is suitable for use with GNV.
+
+The file @file{vms/gawk_build_steps.txt} in the distribution documents
+the procedure for building a VMS PCSI kit that is compatible with GNV.
+
+@ignore
+@c The VMS POSIX product, also known as POSIX for OpenVMS, is long defunct
+@c and building gawk for it has not been tested in many years, but these
+@c old instructions might still work if anyone is still using it.
+
+@node VMS POSIX
+@appendixsubsubsec Building and Using @command{gawk} on VMS POSIX
+
+Ignore the instructions above, although @file{vms/gawk.hlp} should still
+be made available in a help library.  The source tree should be unpacked
+into a container file subsystem rather than into the ordinary VMS filesystem.
+Make sure that the two scripts, @file{configure} and
+@file{vms/posix-cc.sh}, are executable; use @samp{chmod +x} on them if
+necessary.  Then execute the following two commands:
+
+@example
+psx> @kbd{CC=vms/posix-cc.sh configure}
+psx> @kbd{make CC=c89 gawk}
+@end example
+
+@noindent
+The first command constructs files @file{config.h} and @file{Makefile} out
+of templates, using a script to make the C compiler fit @command{configure}'s
+expectations.  The second command compiles and links @command{gawk} using
+the C compiler directly; ignore any warnings from @command{make} about being
+unable to redefine @code{CC}.  @command{configure} takes a very long
+time to execute, but at least it provides incremental feedback as it runs.
+
+This has been tested with VAX/VMS V6.2, VMS POSIX V2.0, and DEC C V5.2.
+
+Once built, @command{gawk} works like any other shell utility.  Unlike
+the normal VMS port of @command{gawk}, no special command-line manipulation is
+needed in the VMS POSIX environment.
+@end ignore
+
+@node VMS Old Gawk
+@appendixsubsubsec Some VMS Systems Have An Old Version of @command{gawk}
+
+@c Thanks to "gerard labadie" <gerard.labadie@gmail.com>
+
+Some versions of VMS have an old version of @command{gawk}.  To access it,
+define a symbol, as follows:
+
+@example
+$ @kbd{gawk :== $sys$common:[syshlp.examples.tcpip.snmp]gawk.exe}
+@end example
+
+This is apparently @value{PVERSION} 2.15.6, which is extremely old. We
+recommend compiling and using the current version.
+
+@node Bugs
+@appendixsec Reporting Problems and Bugs
+@cindex archaeologists
+@quotation
+@i{There is nothing more dangerous than a bored archaeologist.}
+@author Douglas Adams, @cite{The Hitchhiker's Guide to the Galaxy}
+@end quotation
+@c the radio show, not the book. :-)
+
+@cindex debugging @command{gawk}, bug reports
+@cindex troubleshooting, @command{gawk}, bug reports
+If you have problems with @command{gawk} or think that you have found a bug,
+report it to the developers; we cannot promise to do anything,
+but we might well want to fix it.
+
+@menu
+* Bug address::                 Where to send reports to.
+* Usenet::                      Where not to send reports to.
+* Maintainers::                 Maintainers of non-*nix ports.
+@end menu
+
+@node Bug address
+@appendixsubsec Submitting Bug Reports
+
+Before reporting a bug, make sure you have really found a genuine bug.
+First, verify that you have the latest version of @command{gawk}.
+Many bugs (usually subtle ones) are fixed at each release, and if yours
+is out of date, the problem may already have been solved.
+
+Second, please see if setting the environment variable @env{LC_ALL}
+to @code{LC_ALL=C} causes things to behave as you expect. If so, it's
+a locale issue, and may or may not really be a bug.
+
+Third, carefully reread the documentation and see if it says you can do
+what you're trying to do.  If it's not clear whether you should be able
+to do something or not, report that too; it's a bug in the documentation!
+
+Finally, before reporting a bug or trying to fix it yourself, try to isolate it
+to the smallest possible @command{awk} program and input @value{DF} that
+reproduce the problem.  Then send us the program and @value{DF},
+some idea of what kind of Unix system you're using,
+the compiler you used to compile @command{gawk}, and the exact results
+@command{gawk} gave you.  Also say what you expected to occur; this helps
+us decide whether the problem is really in the documentation.
+
+Make sure to include the version number of @command{gawk} you are using.
+You can get this information with the command @samp{gawk --version}.
+
+@cindex @code{bug-gawk@@gnu.org} bug reporting address
+@cindex email address for bug reports, @code{bug-gawk@@gnu.org}
+@cindex bug reports, email address, @code{bug-gawk@@gnu.org}
+Once you have a precise problem description, send email to
+@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
+
+The @command{gawk} maintainers subscribe to this address, and
+thus they will receive your bug report.
+Although you can send mail to the maintainers directly,
+the bug reporting address is preferred because the
+email list is archived at the GNU Project.
+@emph{All email must be in English. This is the only language
+understood in common by all the maintainers.}
+In addition, please be sure to send all mail in @emph{plain text},
+not (or not exclusively) in HTML.
+
+@quotation NOTE
+Many distributions of GNU/Linux and the various BSD-based operating systems
+have their own bug reporting systems.  If you report a bug using your distribution's
+bug reporting system, you should also send a copy to
+@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
+
+This is for two reasons.  First, although some distributions forward
+bug reports ``upstream'' to the GNU mailing list, many don't, so there is a good
+chance that the @command{gawk}  maintainers won't even see the bug report!  Second,
+mail to the GNU list is archived, and having everything at the GNU Project
+keeps things self-contained and not dependent on other organizations.
+@end quotation
+
+Non-bug suggestions are always welcome as well.  If you have questions
+about things that are unclear in the documentation or are just obscure
+features, ask on the bug list; we will try to help you out if we can.
+
+Please note: We ask that you follow the
+@uref{https://gnu.org/philosophy/kind-communication.html,
+GNU Kind Communication Guidelines} in your correspondence on the
+list (as well as off of it).
+
+@node Usenet
+@appendixsubsec Please Don't Post Bug Reports to USENET
+
+@quotation
+@c Date: Sun, 17 May 2015 19:50:14 -0400
+@c From: Chet Ramey <chet.ramey@case.edu>
+@c Reply-To: chet.ramey@case.edu
+@c Organization: ITS, Case Western Reserve University
+@c To: Aharon Robbins <arnold@skeeve.com>
+@c CC: chet.ramey@case.edu
+I gave up on Usenet a couple of years ago and haven't really looked back.
+It's like sports talk radio---you feel smarter for not having read it.
+@author Chet Ramey
+@end quotation
+
+@cindex @code{comp.lang.awk} newsgroup
+Please do @emph{not} try to report bugs in @command{gawk} by posting to the
+Usenet/Internet newsgroup @code{comp.lang.awk}.  Although some of the
+@command{gawk} developers occasionally read this news group, the primary
+@command{gawk} maintainer no longer does.  Thus it's virtually guaranteed
+that he will @emph{not} see your posting.
+
+Similarly, posting bug reports or questions in web forums (such
+as @uref{https://stackoverflow.com/, Stack Overflow}) may get you
+an answer, but it won't be from the @command{gawk} maintainers,
+who do not spend their time in web forums.  The steps described here are
+the only officially recognized way for reporting bugs.  Really.
+
+@ignore
+And another one:
+
+Date: Thu, 11 Jun 2015 09:00:56 -0400
+From: Chet Ramey <chet.ramey@case.edu>
+
+My memory was imperfect.  Back in June 2009, I wrote:
+
+"That's the nice thing about open source, right?  You can take your ball
+and run to another section of the playground.  Then, if you like mixing
+metaphors, you can throw rocks from there."
+@end ignore
+
+@node Maintainers
+@appendixsubsec Reporting Problems with Non-Unix Ports
+
+If you find bugs in one of the non-Unix ports of @command{gawk},
+send an email to the bug list, with a copy to the
+person who maintains that port.  The maintainers are named in the following list,
+as well as in the @file{README} file in the @command{gawk} distribution.
+Information in the @file{README} file should be considered authoritative
+if it conflicts with this @value{DOCUMENT}.
+
+The people maintaining the various @command{gawk} ports are:
+
+@c put the index entries outside the table, for docbook
+@cindex Buening, Andreas
+@cindex Malmberg, John
+@cindex Pitts, Dave
+@cindex G., Daniel Richard
+@cindex Robbins, Arnold
+@cindex Zaretskii, Eli
+@cindex Guerrero, Juan Manuel
+@multitable {MS-Windows with MinGW} {123456789012345678901234567890123456789001234567890}
+@item Unix and POSIX systems @tab Arnold Robbins, @EMAIL{arnold@@skeeve.com,arnold at skeeve dot com}
+
+@item MS-DOS with DJGPP @tab Juan Manuel Guerrero, @EMAIL{juan.guerrero@@gmx.de, juan dot guerrero at gmx dot de}
+
+@item MS-Windows with MinGW @tab Eli Zaretskii, @EMAIL{eliz@@gnu.org,eliz at gnu dot org}
+
+@c Leave this in the document on purpose.
+@c OS/2 is not mentioned anywhere else though.
+@item OS/2 @tab Andreas Buening, @EMAIL{andreas.buening@@nexgo.de,andreas dot buening at nexgo dot de}
+
+@item VMS @tab John Malmberg, @EMAIL{wb8tyw@@qsl.net,wb8tyw at qsl.net}
+
+@item z/OS (OS/390) @tab Daniel Richard G.@: @EMAIL{skunk@@iSKUNK.ORG,skunk at iSKUNK.ORG}
+@item  @tab Dave Pitts (Maintainer Emeritus), @EMAIL{dpitts@@cozx.com,dpitts at cozx dot com}
+@end multitable
+
+If your bug is also reproducible under Unix, send a copy of your
+report to the @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org} email list as well.
+
+@node Other Versions
+@appendixsec Other Freely Available @command{awk} Implementations
+@cindex @command{awk}, implementations
+@ignore
+From: emory!amc.com!brennan (Michael Brennan)
+Subject: C++ comments in awk programs
+To: arnold@gnu.ai.mit.edu (Arnold Robbins)
+Date: Wed, 4 Sep 1996 08:11:48 -0700 (PDT)
+
+@end ignore
+@cindex Brennan, Michael
+@ifnotdocbook
+@quotation
+@i{It's kind of fun to put comments like this in your awk code:}@*
+@ @ @ @ @ @ @code{// Do C++ comments work? answer: yes! of course}
+@author Michael Brennan
+@end quotation
+@end ifnotdocbook
+
+@docbook
+<blockquote><attribution>Michael Brennan</attribution>
+<literallayout><emphasis>It's kind of fun to put comments like this in your awk code.</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<literal>// Do C++ comments work? answer: yes! of course</literal></literallayout>
+</blockquote>
+@end docbook
+
+There are a number of other freely available @command{awk} implementations.
+This @value{SECTION} briefly describes where to get them:
+
+@table @asis
+@cindex Kernighan, Brian
+@cindex source code, Brian Kernighan's @command{awk}
+@cindex @command{awk}, versions of, See Also Brian Kernighan's @command{awk}
+@cindex Brian Kernighan's @command{awk}, source code
+@item Unix @command{awk}
+Brian Kernighan, one of the original designers of Unix @command{awk},
+has made his implementation of
+@command{awk} freely available.
+You can retrieve it from GitHub:
+
+@cindex @command{git} utility
+@example
+git clone git://github.com/onetrueawk/awk bwkawk
+@end example
+
+@noindent
+This command creates a copy of the @uref{https://git-scm.com, Git}
+repository in a directory named @file{bwkawk}.  If you omit the last argument
+from the @command{git} command line, the repository copy is created in a
+directory named @file{awk}.
+
+This version requires an ISO C (1990 standard) compiler; the C compiler
+from GCC (the GNU Compiler Collection) works quite nicely.
+
+To build it, review the settings in the @file{makefile}, and then just run
+@command{make}.  Note that the result of compilation is named
+@command{a.out}; you will have to rename it to something reasonable.
+
+@xref{Common Extensions}
+for a list of extensions in this @command{awk} that are not in POSIX @command{awk}.
+
+As a side note, Dan Bornstein has created a Git repository tracking
+all the versions of BWK @command{awk} that he could find. It's
+available at @uref{git://github.com/danfuzz/one-true-awk}.
+
+@cindex Brennan, Michael
+@cindex @command{mawk} utility
+@cindex source code, @command{mawk}
+@item @command{mawk}
+Michael Brennan wrote an independent implementation of @command{awk},
+called @command{mawk}.  It is available under the
+@ifclear FOR_PRINT
+GPL (@pxref{Copying}),
+@end ifclear
+@ifset FOR_PRINT
+GPL,
+@end ifset
+just as @command{gawk} is.
+
+The original distribution site for the @command{mawk} source code
+no longer has it.  A copy is available at
+@uref{http://www.skeeve.com/gawk/mawk1.3.3.tar.gz}.
+
+In 2009, Thomas Dickey took on @command{mawk} maintenance.
+Basic information is available on
+@uref{http://www.invisible-island.net/mawk, the project's web page}.
+The download URL is
+@url{http://invisible-island.net/datafiles/release/mawk.tar.gz}.
+
+Once you have it,
+@command{gunzip} may be used to decompress this file. Installation
+is similar to @command{gawk}'s
+(@pxref{Unix Installation}).
+
+@xref{Common Extensions}
+for a list of extensions in @command{mawk} that are not in POSIX @command{awk}.
+
+@item @command{mawk} 2.0
+In 2016, Michael Brennan resumed @command{mawk} development.
+His development snapshots are available via Git from the project's
+@uref{https://github.com/mikebrennan000/mawk-2, GitHub page}.
+
+@cindex Sumner, Andrew
+@cindex @command{awka} compiler for @command{awk}
+@cindex source code, @command{awka}
+@item @command{awka}
+Written by Andrew Sumner,
+@command{awka} translates @command{awk} programs into C, compiles them,
+and links them with a library of functions that provide the core
+@command{awk} functionality.
+It also has a number of extensions.
+
+The @command{awk} translator is released under the GPL, and the library
+is under the LGPL.
+
+To get @command{awka}, go to @url{https://sourceforge.net/projects/awka}.
+@c You can reach Andrew Sumner at @email{andrew@@zbcom.net}.
+@c andrewsumner@@yahoo.net
+
+The project seems to be frozen; no new code changes have been made
+since approximately 2001.
+
+@cindex Beebe, Nelson H.F.@:
+@cindex @command{pawk} (profiling version of Brian Kernighan's @command{awk})
+@cindex source code, @command{pawk}
+@item @command{pawk}
+Nelson H.F.@: Beebe at the University of Utah has modified
+BWK @command{awk} to provide timing and profiling information.
+It is different from @command{gawk} with the @option{--profile} option
+(@pxref{Profiling})
+in that it uses CPU-based profiling, not line-count
+profiling.  You may find it at either
+@uref{ftp://ftp.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}
+or
+@uref{http://www.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}.
+
+@item BusyBox @command{awk}
+@cindex BusyBox Awk
+@cindex source code, BusyBox Awk
+BusyBox is a GPL-licensed program providing small versions of many
+applications within a single executable. It is aimed at embedded systems.
+It includes a full implementation of POSIX @command{awk}.  When building
+it, be careful not to do @samp{make install} as it will overwrite
+copies of other applications in your @file{/usr/local/bin}.  For more
+information, see the @uref{https://busybox.net, project's home page}.
+
+@cindex OpenSolaris
+@cindex Solaris, POSIX-compliant @command{awk}
+@cindex source code, Solaris @command{awk}
+@item The OpenSolaris POSIX @command{awk}
+The versions of @command{awk} in @file{/usr/xpg4/bin} and
+@file{/usr/xpg6/bin} on Solaris are more or less POSIX-compliant.
+They are based on the @command{awk} from Mortice Kern Systems for PCs.
+We were able to make this code compile and work under GNU/Linux
+with 1--2 hours of work.  Making it more generally portable (using
+GNU Autoconf and/or Automake) would take more work, and this
+has not been done, at least to our knowledge.
+
+@cindex Illumos
+@cindex Illumos, POSIX-compliant @command{awk}
+@cindex source code, Illumos @command{awk}
+The source code used to be available from the OpenSolaris website.
+However, that project was ended and the website shut down.  Fortunately, the
+@uref{https://wiki.illumos.org/display/illumos/illumos+Home, Illumos project}
+makes this implementation available.  You can view the files one at a time from
+@uref{https://github.com/joyent/illumos-joyent/blob/master/usr/src/cmd/awk_xpg4}.
+
+@cindex @command{goawk}
+@cindex Go implementation of @command{awk}
+@cindex source code, @command{goawk}
+@cindex programming languages, Go
+@item @command{goawk}
+This is an @command{awk} interpreter written in the
+@uref{https://golang.org/, Go programming language}.
+It implements POSIX @command{awk}, with a few minor extensions.
+Source code is available from @uref{https://github.com/benhoyt/goawk}.
+The author wrote a nice 
+@uref{https://benhoyt.com/writings/goawk/, article}
+describing the implementation.
+
+@cindex @command{jawk}
+@cindex Java implementation of @command{awk}
+@cindex source code, @command{jawk}
+@item @command{jawk}
+This is an interpreter for @command{awk} written in Java. It claims
+to be a full interpreter, although because it uses Java facilities
+for I/O and for regexp matching, the language it supports is different
+from POSIX @command{awk}.  More information is available on the
+@uref{https://jawk.sourceforge.net, project's home page}.
+
+@item Libmawk
+@cindex libmawk
+@cindex source code, libmawk
+This is an embeddable @command{awk} interpreter derived from
+@command{mawk}. For more information, see
+@uref{http://repo.hu/projects/libmawk/}.
+
+@cindex source code, embeddable @command{awk} interpreter
+@cindex Neacsu, Mircea
+@item Mircea Neacsu's Embeddable @command{awk}
+Mircea Neacsu has created an embeddable @command{awk}
+interpreter, based on BWK awk. It's available
+at @uref{https://github.com/neacsum/awk}.
+
+@item @code{pawk}
+@cindex source code, @command{pawk} (Python version)
+@cindex @code{pawk}, @command{awk}-like facilities for Python
+This is a Python module that claims to bring @command{awk}-like
+features to Python. See @uref{https://github.com/alecthomas/pawk}
+for more information. (This is not related to Nelson Beebe's
+modified version of BWK @command{awk}, described earlier.)
+
+@item @w{QSE @command{awk}}
+@cindex QSE @command{awk}
+@cindex source code, QSE @command{awk}
+This is an embeddable @command{awk} interpreter. For more information,
+see @uref{https://code.google.com/p/qse/}. @c and @uref{http://awk.info/?tools/qse}.
+
+@item @command{QTawk}
+@cindex QuikTrim Awk
+@cindex source code, QuikTrim Awk
+This is an independent implementation of @command{awk} distributed
+under the GPL. It has a large number of extensions over standard
+@command{awk} and may not be 100% syntactically compatible with it.
+See @uref{http://www.quiktrim.org/QTawk.html} for more information,
+including the manual. The download link there is out of date; see
+@uref{http://www.quiktrim.org/#AdditionalResources} for the latest
+download link.
+
+The project may also be frozen; no new code changes have been made
+since approximately 2014.
+
+@item Other versions
+See also the ``Versions and implementations'' section of the
+@uref{https://en.wikipedia.org/wiki/Awk_language#Versions_and_implementations,
+Wikipedia article} on @command{awk} for information on additional versions.
+
+@end table
+
+@node Installation summary
+@appendixsec Summary
+
+@itemize @value{BULLET}
+@item
+The @command{gawk} distribution is available from the GNU Project's main
+distribution site, @code{ftp.gnu.org}.  The canonical build recipe is:
+
+@example
+wget https://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+cd gawk-@value{VERSION}.@value{PATCHLEVEL}
+./configure && make && make check
+@end example
+
+@quotation NOTE
+Because of the @samp{https://} URL, you may have to supply the
+@option{--no-check-certificate} option to @command{wget} to download
+the file.
+@end quotation
+
+@item
+@command{gawk} may be built on non-POSIX systems as well. The currently
+supported systems are MS-Windows using
+MSYS, DJGPP, MinGW, and Cygwin,
+@c OS/2,
+and both Vax/VMS and OpenVMS.
+Instructions for each system are included in this @value{APPENDIX}.
+
+@item
+Bug reports should be sent via email to @email{bug-gawk@@gnu.org}.
+Bug reports should be in English and should include the version of @command{gawk},
+how it was compiled, and a short program and @value{DF} that demonstrate
+the problem.
+
+@item
+There are a number of other freely available @command{awk}
+implementations.  Many are POSIX-compliant; others are less so.
+
+@end itemize
+
+
+@ifclear FOR_PRINT
+@node Notes
+@appendix Implementation Notes
+@cindex @command{gawk}, implementation issues
+@cindex implementation issues, @command{gawk}
+
+This appendix contains information mainly of interest to implementers and
+maintainers of @command{gawk}.  Everything in it applies specifically to
+@command{gawk} and not to other implementations.
+
+@menu
+* Compatibility Mode::          How to disable certain @command{gawk}
+                                extensions.
+* Additions::                   Making Additions To @command{gawk}.
+* Future Extensions::           New features that may be implemented one day.
+* Implementation Limitations::  Some limitations of the implementation.
+* Extension Design::            Design notes about the extension API.
+* Notes summary::               Summary of implementation notes.
+@end menu
+
+@node Compatibility Mode
+@appendixsec Downward Compatibility and Debugging
+@cindex @command{gawk}, implementation issues, downward compatibility
+@cindex @command{gawk}, implementation issues, debugging
+@cindex troubleshooting, @command{gawk}
+@cindex implementation issues@comma{} @command{gawk}, debugging
+
+@xref{POSIX/GNU},
+for a summary of the GNU extensions to the @command{awk} language and program.
+All of these features can be turned off by invoking @command{gawk} with the
+@option{--traditional} option or with the @option{--posix} option.
+
+If @command{gawk} is compiled for debugging with @samp{-DDEBUG}, then there
+is one more option available on the command line:
+
+@table @code
+@item -Y
+@itemx --parsedebug
+Print out the parse stack information as the program is being parsed.
+@end table
+
+This option is intended only for serious @command{gawk} developers
+and not for the casual user.  It probably has not even been compiled into
+your version of @command{gawk}, since it slows down execution.
+
+@node Additions
+@appendixsec Making Additions to @command{gawk}
+
+If you find that you want to enhance @command{gawk} in a significant
+fashion, you are perfectly free to do so.  That is the point of having
+free software; the source code is available and you are free to change
+it as you want (@pxref{Copying}).
+
+This @value{SECTION} discusses the ways you might want to change @command{gawk}
+as well as any considerations you should bear in mind.
+
+@menu
+* Accessing The Source::        Accessing the Git repository.
+* Adding Code::                 Adding code to the main body of
+                                @command{gawk}.
+* New Ports::                   Porting @command{gawk} to a new operating
+                                system.
+* Derived Files::               Why derived files are kept in the Git
+                                repository.
+@end menu
+
+@node Accessing The Source
+@appendixsubsec Accessing The @command{gawk} Git Repository
+
+As @command{gawk} is Free Software, the source code is always available.
+@ref{Gawk Distribution} describes how to get and build the formal,
+released versions of @command{gawk}.
+
+@cindex @command{git} utility
+However, if you want to modify @command{gawk} and contribute back your
+changes, you will probably wish to work with the development version.
+To do so, you will need to access the @command{gawk} source code
+repository.  The code is maintained using the
+@uref{https://git-scm.com, Git distributed version control system}.
+You will need to install it if your system doesn't have it.
+Once you have done so, use the command:
+
+@example
+git clone git://git.savannah.gnu.org/gawk.git
+@end example
+
+@noindent
+This clones the @command{gawk} repository.  If you are behind a
+firewall that does not allow you to use the Git native protocol, you
+can still access the repository using:
+
+@example
+git clone https://git.savannah.gnu.org/r/gawk.git
+@end example
+
+Once you have made changes, you can use @samp{git diff} to produce a
+patch, and send that to the @command{gawk} maintainer; see @ref{Bugs},
+for how to do that.
+
+Once upon a time there was Git--CVS gateway for use by people who could
+not install Git. However, this gateway no longer works, so you may have
+better luck using a more modern version control system like Bazaar,
+that has a Git plug-in for working with Git repositories.
+
+@node Adding Code
+@appendixsubsec Adding New Features
+
+@cindex adding, features to @command{gawk}
+@cindex features, adding to @command{gawk}
+@cindex @command{gawk}, features, adding
+You are free to add any new features you like to @command{gawk}.
+However, if you want your changes to be incorporated into the @command{gawk}
+distribution, there are several steps that you need to take in order to
+make it possible to include them:
+
+@enumerate 1
+@item
+Before building the new feature into @command{gawk} itself,
+consider writing it as an extension
+(@pxref{Dynamic Extensions}).
+If that's not possible, continue with the rest of the steps in this list.
+
+@item
+Be prepared to sign the appropriate paperwork.
+In order for the FSF to distribute your changes, you must either place
+those changes in the public domain and submit a signed statement to that
+effect, or assign the copyright in your changes to the FSF.
+Both of these actions are easy to do and @emph{many} people have done so
+already. If you have questions, please contact me
+(@pxref{Bugs}),
+or @EMAIL{assign@@gnu.org,assign at gnu dot org}.
+
+@item
+Get the latest version.
+It is much easier for me to integrate changes if they are relative to
+the most recent distributed version of @command{gawk}, or better yet,
+relative to the latest code in the Git repository.  If your version of
+@command{gawk} is very old, I may not be able to integrate your changes at all.
+(@xref{Getting},
+for information on getting the latest version of @command{gawk}.)
+
+@item
+@ifnotinfo
+Follow the @cite{GNU Coding Standards}.
+@end ifnotinfo
+@ifinfo
+See @inforef{Top, , Version, standards, GNU Coding Standards}.
+@end ifinfo
+This document describes how GNU software should be written. If you haven't
+read it, please do so, preferably @emph{before} starting to modify @command{gawk}.
+(The @cite{GNU Coding Standards} are available from
+the GNU Project's
+@uref{https://www.gnu.org/prep/standards/, website}.
+Texinfo, Info, and DVI versions are also available.)
+
+@cindex @command{gawk}, coding style in
+@item
+Use the @command{gawk} coding style.
+The C code for @command{gawk} follows the instructions in the
+@cite{GNU Coding Standards}, with minor exceptions.  The code is formatted
+using the traditional ``K&R'' style, particularly as regards to the placement
+of braces and the use of TABs.  In brief, the coding rules for @command{gawk}
+are as follows:
+
+@itemize @value{BULLET}
+@item
+Use ANSI/ISO style (prototype) function headers when defining functions.
+
+@item
+Put the name of the function at the beginning of its own line.
+
+@item
+Use @samp{#elif} instead of nesting @samp{#if} inside @samp{#else}.
+
+@item
+Put the return type of the function, even if it is @code{int}, on the
+line above the line with the name and arguments of the function.
+
+@item
+Put spaces around parentheses used in control structures
+(@code{if}, @code{while}, @code{for}, @code{do}, @code{switch},
+and @code{return}).
+
+@item
+Do not put spaces in front of parentheses used in function calls.
+
+@item
+Put spaces around all C operators and after commas in function calls.
+
+@item
+Do not use the comma operator to produce multiple side effects, except
+in @code{for} loop initialization and increment parts, and in macro bodies.
+
+@item
+Use real TABs for indenting, not spaces.
+
+@item
+Use the ``K&R'' brace layout style.
+
+@item
+Use comparisons against @code{NULL} and @code{'\0'} in the conditions of
+@code{if}, @code{while}, and @code{for} statements, as well as in the @code{case}s
+of @code{switch} statements, instead of just the
+plain pointer or character value.
+
+@item
+Use @code{true} and @code{false} for @code{bool} values,
+the @code{NULL} symbolic constant for pointer values,
+and the character constant @code{'\0'} where appropriate, instead of @code{1}
+and @code{0}.
+
+@item
+Provide one-line descriptive comments for each function.
+
+@item
+Do not use the @code{alloca()} function for allocating memory off the
+stack.  Its use causes more portability trouble than is worth the minor
+benefit of not having to free the storage. Instead, use @code{malloc()}
+and @code{free()}.
+
+@item
+Do not use comparisons of the form @samp{! strcmp(a, b)} or similar.
+As Henry Spencer once said, ``@code{strcmp()} is not a boolean!''
+Instead, use @samp{strcmp(a, b) == 0}.
+
+@item
+If adding new bit flag values, use explicit hexadecimal constants
+(@code{0x001}, @code{0x002}, @code{0x004}, and so on) instead of
+shifting one left by successive amounts (@samp{(1<<0)}, @samp{(1<<1)},
+and so on).
+@end itemize
+
+@quotation NOTE
+If I have to reformat your code to follow the coding style used in
+@command{gawk}, I may not bother to integrate your changes at all.
+@end quotation
+
+@cindex Texinfo
+@item
+Update the documentation.
+Along with your new code, please supply new sections and/or chapters
+for this @value{DOCUMENT}.  If at all possible, please use real
+Texinfo, instead of just supplying unformatted ASCII text (although
+even that is better than no documentation at all).
+Conventions to be followed in @cite{@value{TITLE}} are provided
+after the @samp{@@bye} at the end of the Texinfo source file.
+If possible, please update the @command{man} page as well.
+
+You will also have to sign paperwork for your documentation changes.
+
+@cindex @command{git} utility
+@item
+Submit changes as unified diffs.
+Use @samp{diff -u -r -N} to compare
+the original @command{gawk} source tree with your version.
+I recommend using the GNU version of @command{diff}, or best of all,
+@samp{git diff} or @samp{git format-patch}.
+Send the output produced by @command{diff} to me when you
+submit your changes.
+(@xref{Bugs}, for the electronic mail
+information.)
+
+Using this format makes it easy for me to apply your changes to the
+master version of the @command{gawk} source code (using @code{patch}).
+If I have to apply the changes manually, using a text editor, I may
+not do so, particularly if there are lots of changes.
+
+@item
+Include an entry for the @file{ChangeLog} file with your submission.
+This helps further minimize the amount of work I have to do,
+making it easier for me to accept patches.
+It is simplest if you just make this part of your diff.
+@end enumerate
+
+Although this sounds like a lot of work, please remember that while you
+may write the new code, I have to maintain it and support it. If it
+isn't possible for me to do that with a minimum of extra work, then I
+probably will not.
+
+@node New Ports
+@appendixsubsec Porting @command{gawk} to a New Operating System
+@cindex portability, @command{gawk}
+@cindex operating systems, porting @command{gawk} to
+
+@cindex porting @command{gawk}
+If you want to port @command{gawk} to a new operating system, there are
+several steps:
+
+@enumerate 1
+@item
+Follow the guidelines in
+@ifinfo
+@ref{Adding Code},
+@end ifinfo
+@ifnotinfo
+the previous @value{SECTION}
+@end ifnotinfo
+concerning coding style, submission of diffs, and so on.
+
+@item
+Be prepared to sign the appropriate paperwork.
+In order for the FSF to distribute your code, you must either place
+your code in the public domain and submit a signed statement to that
+effect, or assign the copyright in your code to the FSF.
+Both of these actions are easy to do and @emph{many} people have done so
+already. If you have questions, please contact me, or
+@email{gnu@@gnu.org}.
+
+@item
+When doing a port, bear in mind that your code must coexist peacefully
+with the rest of @command{gawk} and the other ports. Avoid gratuitous
+changes to the system-independent parts of the code. If at all possible,
+avoid sprinkling @samp{#ifdef}s just for your port throughout the
+code.
+
+If the changes needed for a particular system affect too much of the
+code, I probably will not accept them.  In such a case, you can, of course,
+distribute your changes on your own, as long as you comply
+with the GPL
+(@pxref{Copying}).
+
+@item
+A number of the files that come with @command{gawk} are maintained by other
+people.  Thus, you should not change them
+unless it is for a very good reason; i.e., changes are not out of the
+question, but changes to these files are scrutinized extra carefully.
+These are all the files in the @file{support} directory
+within the @command{gawk} distribution. See there.
+
+@item
+A number of other files are provided by the GNU
+Autotools (Autoconf, Automake, and GNU @command{gettext}).
+You should not change them either, unless it is for a very
+good reason. The files are
+@file{ABOUT-NLS},
+@file{config.guess},
+@file{config.rpath},
+@file{config.sub},
+@file{depcomp},
+@file{INSTALL},
+@file{install-sh},
+@file{missing},
+@file{mkinstalldirs},
+and
+@file{ylwrap}.
+
+@item
+Be willing to continue to maintain the port.
+Non-Unix operating systems are supported by volunteers who maintain
+the code needed to compile and run @command{gawk} on their systems. If no-one
+volunteers to maintain a port, it becomes unsupported and it may
+be necessary to remove it from the distribution.
+
+@item
+Supply an appropriate @file{gawkmisc.???} file.
+Each port has its own @file{gawkmisc.???} that implements certain
+operating system specific functions. This is cleaner than a plethora of
+@samp{#ifdef}s scattered throughout the code.  The @file{gawkmisc.c} in
+the main source directory includes the appropriate
+@file{gawkmisc.???} file from each subdirectory.
+Be sure to update it as well.
+
+Each port's @file{gawkmisc.???} file has a suffix reminiscent of the machine
+or operating system for the port---for example, @file{pc/gawkmisc.pc} and
+@file{vms/gawkmisc.vms}. The use of separate suffixes, instead of plain
+@file{gawkmisc.c}, makes it possible to move files from a port's subdirectory
+into the main subdirectory, without accidentally destroying the real
+@file{gawkmisc.c} file.  (Currently, this is only an issue for the
+PC operating system ports.)
+
+@item
+Supply a @file{Makefile} as well as any other C source and header files that are
+necessary for your operating system.  All your code should be in a
+separate subdirectory, with a name that is the same as, or reminiscent
+of, either your operating system or the computer system.  If possible,
+try to structure things so that it is not necessary to move files out
+of the subdirectory into the main source directory.  If that is not
+possible, then be sure to avoid using names for your files that
+duplicate the names of files in the main source directory.
+
+@item
+Update the documentation.
+Please write a section (or sections) for this @value{DOCUMENT} describing the
+installation and compilation steps needed to compile and/or install
+@command{gawk} for your system.
+@end enumerate
+
+Following these steps makes it much easier to integrate your changes
+into @command{gawk} and have them coexist happily with other
+operating systems' code that is already there.
+
+In the code that you supply and maintain, feel free to use a
+coding style and brace layout that suits your taste.
+
+@node Derived Files
+@appendixsubsec Why Generated Files Are Kept In Git
+
+@cindex Git, use of for @command{gawk} source code
+@c From emails written March 22, 2012, to the gawk developers list.
+
+If you look at the @command{gawk} source in the Git
+repository, you will notice that it includes files that are automatically
+generated by GNU infrastructure tools, such as @file{Makefile.in} from
+Automake and even @file{configure} from Autoconf.
+
+This is different from many Free Software projects that do not store
+the derived files, because that keeps the repository less cluttered,
+and it is easier to see the substantive changes when comparing versions
+and trying to understand what changed between commits.
+
+However, there are several reasons why the @command{gawk} maintainer
+likes to have everything in the repository.
+
+First, because it is then easy to reproduce any given version completely,
+without relying upon the availability of (older, likely obsolete, and
+maybe even impossible to find) other tools.
+
+As an extreme example, if you ever even think about trying to compile,
+oh, say, the V7 @command{awk}, you will discover that not only do you
+have to bootstrap the V7 @command{yacc} to do so, but you also need the
+V7 @command{lex}.  And the latter is pretty much impossible to bring up
+on a modern GNU/Linux system.@footnote{We tried. It was painful.}
+
+(Or, let's say @command{gawk} 1.2 required @command{bison} whatever-it-was
+in 1989 and that there was no @file{awkgram.c} file in the repository.  Is
+there a guarantee that we could find that @command{bison} version? Or that
+@emph{it} would build?)
+
+If the repository has all the generated files, then it's easy to just check
+them out and build. (Or @emph{easier}, depending upon how far back we go.)
+
+And that brings us to the second (and stronger) reason why all the files
+really need to be in Git.  It boils down to who do you cater
+to---the @command{gawk} developer(s), or the user who just wants to check
+out a version and try it out?
+
+The @command{gawk} maintainer
+wants it to be possible for any interested @command{awk} user in the
+world to just clone the repository, check out the branch of interest and
+build it. Without their having to have the correct version(s) of the
+autotools.@footnote{There is one GNU program that is (in our opinion)
+severely difficult to bootstrap from the Git repository. For
+example, on the author's old (but still working) PowerPC Macintosh with
+Mac OS X 10.5, it was necessary to bootstrap a ton of software, starting
+with Git itself, in order to try to work with the latest code.
+It's not pleasant, and especially on older systems, it's a big waste
+of time.
+
+Starting with the latest tarball was no picnic either. The maintainers
+had dropped @file{.gz} and @file{.bz2} files and only distribute
+@file{.tar.xz} files.  It was necessary to bootstrap @command{xz} first!}
+That is the point of the @file{bootstrap.sh} file.  It touches the
+various other files in the right order such that
+
+@example
+# The canonical incantation for building GNU software:
+./bootstrap.sh && ./configure && make
+@end example
+
+@noindent
+will @emph{just work}.
+
+This is extremely important for the @code{master} and
+@code{gawk-@var{X}.@var{Y}-stable} branches.
+
+Further, the @command{gawk} maintainer would argue that it's also
+important for the @command{gawk} developers. When he tried to check out
+the @code{xgawk} branch@footnote{A branch (since removed) created by one of the other
+developers that did not include the generated files.} to build it, he
+couldn't. (No @file{ltmain.sh} file, and he had no idea how to create it,
+and that was not the only problem.)
+
+He felt @emph{extremely} frustrated.  With respect to that branch,
+the maintainer is no different than Jane User who wants to try to build
+@code{gawk-4.1-stable} or @code{master} from the repository.
+
+Thus, the maintainer thinks that it's not just important, but critical,
+that for any given branch, the above incantation @emph{just works}.
+
+@c Added 9/2014:
+A third reason to have all the files is that without them, using @samp{git
+bisect} to try to find the commit that introduced a bug is exceedingly
+difficult. The maintainer tried to do that on another project that
+requires running bootstrapping scripts just to create @command{configure}
+and so on; it was really painful. When the repository is self-contained,
+using @command{git bisect} in it is very easy.
+
+@c So - that's my reasoning and philosophy.
+
+What are some of the consequences and/or actions to take?
+
+@enumerate 1
+@item
+We don't mind that there are differing files in the different branches
+as a result of different versions of the autotools.
+
+@enumerate A
+@item
+It's the maintainer's job to merge them and he will deal with it.
+
+@item
+He is really good at @samp{git diff x y > /tmp/diff1 ; gvim /tmp/diff1} to
+remove the diffs that aren't of interest in order to review code.
+@end enumerate
+
+@item
+It would certainly help if everyone used the same versions of the GNU tools
+as he does, which in general are the latest released versions of
+Automake,
+Autoconf,
+@command{bison},
+GNU @command{gettext},
+and
+Libtool.
+
+@ignore
+If it would help if I sent out an ``I just upgraded to version x.y
+of tool Z'' kind of message to this list, I can do that.  Up until
+now it hasn't been a real issue since I'm the only one who's been
+dorking with the configuration machinery.
+@end ignore
+
+@c @enumerate A
+@c @item
+Installing from source is quite easy. It's how the maintainer worked for years
+(and still works).
+He had @file{/usr/local/bin} at the front of his @env{PATH} and just did:
+
+@example
+wget https://ftp.gnu.org/gnu/@var{package}/@var{package}-@var{x}.@var{y}.@var{z}.tar.gz
+tar -xpzvf @var{package}-@var{x}.@var{y}.@var{z}.tar.gz
+cd @var{package}-@var{x}.@var{y}.@var{z}
+./configure && make && make check
+make install    # as root
+@end example
+
+@quotation NOTE
+Because of the @samp{https://} URL, you may have to supply the
+@option{--no-check-certificate} option to @command{wget} to download
+the file.
+@end quotation
+
+@c @item
+@ignore
+These days the maintainer uses Ubuntu 12.04 which is medium current, but
+he is already doing the above for Automake, Autoconf, and @command{bison}.
+@end ignore
+
+@ignore
+(C. Rant: Recent Linux versions with GNOME 3 really suck. What
+    are all those people thinking?  Fedora 15 was such a bust it drove
+    me to Ubuntu, but Ubuntu 11.04 and 11.10 are totally unusable from
+    a UI perspective. Bleah.)
+@end ignore
+@c @end enumerate
+
+@ignore
+@item
+If someone still feels really strongly about all this, then perhaps they
+can have two branches, one for their development with just the clean
+changes, and one that is buildable (xgawk and xgawk-buildable, maybe).
+Or, as I suggested in another mail, make commits in pairs, the first with
+the "real" changes and the second with "everything else needed for
+ building".
+@end ignore
+@end enumerate
+
+Most of the above was originally written by the maintainer to other
+@command{gawk} developers.  It raised the objection from one of
+the developers ``@dots{} that anybody pulling down the source from
+Git is not an end user.''
+
+However, this is not true. There are ``power @command{awk} users''
+who can build @command{gawk} (using the magic incantation shown previously)
+but who can't program in C.  Thus, the major branches should be
+kept buildable all the time.
+
+It was then suggested that there be a @command{cron} job to create
+nightly tarballs of ``the source.''  Here, the problem is that there
+are source trees, corresponding to the various branches! So,
+nightly tarballs aren't the answer, especially as the repository can go
+for weeks without significant change being introduced.
+
+Fortunately, the Git server can meet this need. For any given
+branch named @var{branchname}, use:
+
+@example
+wget https://git.savannah.gnu.org/cgit/gawk.git/snapshot/gawk-@var{branchname}.tar.gz
+@end example
+
+@noindent
+to retrieve a snapshot of the given branch.
+
+@node Future Extensions
+@appendixsec Probable Future Extensions
+@ignore
+From emory!scalpel.netlabs.com!lwall Tue Oct 31 12:43:17 1995
+Return-Path: <emory!scalpel.netlabs.com!lwall>
+Message-Id: <9510311732.AA28472@scalpel.netlabs.com>
+To: arnold@skeeve.atl.ga.us (Arnold D. Robbins)
+Subject: Re: May I quote you?
+In-Reply-To: Your message of "Tue, 31 Oct 95 09:11:00 EST."
+             <m0tAHPQ-00014MC@skeeve.atl.ga.us>
+Date: Tue, 31 Oct 95 09:32:46 -0800
+From: Larry Wall <emory!scalpel.netlabs.com!lwall>
+
+: Greetings. I am working on the release of gawk 3.0. Part of it will be a
+: thoroughly updated manual. One of the sections deals with planned future
+: extensions and enhancements.  I have the following at the beginning
+: of it:
+:
+: @cindex PERL
+: @cindex Wall, Larry
+: @display
+: @i{AWK is a language similar to PERL, only considerably more elegant.} @*
+: Arnold Robbins
+: @sp 1
+: @i{Hey!} @*
+: Larry Wall
+: @end display
+:
+: Before I actually release this for publication, I wanted to get your
+: permission to quote you.  (Hopefully, in the spirit of much of GNU, the
+: implied humor is visible... :-)
+
+I think that would be fine.
+
+Larry
+@end ignore
+@cindex Perl
+@cindex Wall, Larry
+@cindex Robbins, Arnold
+@quotation
+@i{AWK is a language similar to PERL, only considerably more elegant.}
+@author Arnold Robbins
+@end quotation
+
+@quotation
+@i{Hey!}
+@author Larry Wall
+@end quotation
+
+The @file{TODO} file in the @code{master} branch of the @command{gawk}
+Git repository lists possible future enhancements.  Some of these relate
+to the source code, and others to possible new features.  Please see
+that file for the list.
+@xref{Additions},
+if you are interested in tackling any of the projects listed there.
+
+@node Implementation Limitations
+@appendixsec Some Limitations of the Implementation
+
+This following table describes limits of @command{gawk} on a Unix-like
+system (although it is variable even then). Other systems may have
+different limits.
+
+@multitable @columnfractions .40 .60
+@headitem Item @tab Limit
+@item Characters in a character class @tab 2^(number of bits per byte)
+@item Length of input record @tab @code{MAX_INT}
+@item Length of output record @tab Unlimited
+@item Length of source line @tab Unlimited
+@item Number of fields in a record @tab @code{MAX_LONG}
+@item Number of file redirections @tab Unlimited
+@item Number of input records in one file @tab @code{MAX_LONG}
+@item Number of input records total @tab @code{MAX_LONG}
+@item Number of pipe redirections @tab min(number of processes per user, number of open files)
+@item Numeric values @tab Double-precision floating point (if not using MPFR)
+@item Size of a field @tab @code{MAX_INT}
+@item Size of a literal string @tab @code{MAX_INT}
+@item Size of a printf string @tab @code{MAX_INT}
+@end multitable
+
+@node Extension Design
+@appendixsec Extension API Design
+
+This @value{SECTION} documents the design of the extension API,
+including a discussion of some of the history and problems that needed
+to be solved.
+
+The first version of extensions for @command{gawk} was developed in
+the mid-1990s and released with @command{gawk} 3.1 in the late 1990s.
+The basic mechanisms and design remained unchanged for close to 15 years,
+until 2012.
+
+The old extension mechanism used data types and functions from
+@command{gawk} itself, with a ``clever hack'' to install extension
+functions.
+
+@command{gawk} included some sample extensions, of which a few were
+really useful.  However, it was clear from the outset that the extension
+mechanism was bolted onto the side and was not really well thought out.
+
+@menu
+* Old Extension Problems::           Problems with the old mechanism.
+* Extension New Mechanism Goals::    Goals for the new mechanism.
+* Extension Other Design Decisions:: Some other design decisions.
+* Extension Future Growth::          Some room for future growth.
+@end menu
+
+@node Old Extension Problems
+@appendixsubsec Problems With The Old Mechanism
+
+The old extension mechanism had several problems:
+
+@itemize @value{BULLET}
+@item
+It depended heavily upon @command{gawk} internals.  Any time the
+@code{NODE} structure@footnote{A critical central data structure
+inside @command{gawk}.} changed, an extension would have to be
+recompiled. Furthermore, to really write extensions required understanding
+something about @command{gawk}'s internal functions.  There was some
+documentation in this @value{DOCUMENT}, but it was quite minimal.
+
+@item
+Being able to call into @command{gawk} from an extension required linker
+facilities that are common on Unix-derived systems but that did
+not work on MS-Windows systems; users wanting extensions on MS-Windows
+had to statically link them into @command{gawk}, even though MS-Windows supports
+dynamic loading of shared objects.
+
+@item
+The API would change occasionally as @command{gawk} changed; no compatibility
+between versions was ever offered or planned for.
+@end itemize
+
+Despite the drawbacks, the @command{xgawk} project developers forked
+@command{gawk} and developed several significant extensions. They also
+enhanced @command{gawk}'s facilities relating to file inclusion and
+shared object access.
+
+A new API was desired for a long time, but only in 2012 did the
+@command{gawk} maintainer and the @command{xgawk} developers finally
+start working on it together.  More information about the @command{xgawk}
+project is provided in @ref{gawkextlib}.
+
+@node Extension New Mechanism Goals
+@appendixsubsec Goals For A New Mechanism
+
+Some goals for the new API were:
+
+@itemize @value{BULLET}
+@item
+The API should be independent of @command{gawk} internals.  Changes in
+@command{gawk} internals should not be visible to the writer of an
+extension function.
+
+@item
+The API should provide @emph{binary} compatibility across @command{gawk}
+releases as long as the API itself does not change.
+
+@item
+The API should enable extensions written in C or C++ to have roughly the
+same ``appearance'' to @command{awk}-level code as @command{awk}
+functions do. This means that extensions should have:
+
+@itemize @value{MINUS}
+@item
+The ability to access function parameters.
+
+@item
+The ability to turn an undefined parameter into an array (call by reference).
+
+@item
+The ability to create, access and update global variables.
+
+@item
+Easy access to all the elements of an array at once (``array flattening'')
+in order to loop over all the element in an easy fashion for C code.
+
+@item
+The ability to create arrays (including @command{gawk}'s true
+arrays of arrays).
+@end itemize
+@end itemize
+
+Some additional important goals were:
+
+@itemize @value{BULLET}
+@item
+The API should use only features in ISO C 90, so that extensions
+can be written using the widest range of C and C++ compilers. The header
+should include the appropriate @samp{#ifdef __cplusplus} and @samp{extern "C"}
+magic so that a C++ compiler could be used.  (If using C++, the runtime
+system has to be smart enough to call any constructors and destructors,
+as @command{gawk} is a C program. As of this writing, this has not been
+tested.)
+
+@item
+The API mechanism should not require access to @command{gawk}'s
+symbols@footnote{The @dfn{symbols} are the variables and functions
+defined inside @command{gawk}.  Access to these symbols by code
+external to @command{gawk} loaded dynamically at runtime is
+problematic on MS-Windows.} by the compile-time or dynamic linker,
+in order to enable creation of extensions that also work on MS-Windows.
+@end itemize
+
+During development, it became clear that there were other features
+that should be available to extensions, which were also subsequently
+provided:
+
+@itemize @value{BULLET}
+@item
+Extensions should have the ability to hook into @command{gawk}'s
+I/O redirection mechanism.  In particular, the @command{xgawk}
+developers provided a so-called ``open hook'' to take over reading
+records.  During development, this was generalized to allow
+extensions to hook into input processing, output processing, and
+two-way I/O.
+
+@item
+An extension should be able to provide a ``call back'' function
+to perform cleanup actions when @command{gawk} exits.
+
+@item
+An extension should be able to provide a version string so that
+@command{gawk}'s @option{--version} option can provide information
+about extensions as well.
+@end itemize
+
+The requirement to avoid access to @command{gawk}'s symbols is, at first
+glance, a difficult one to meet.
+
+One design, apparently used by Perl and Ruby and maybe others, would
+be to make the mainline @command{gawk} code into a library, with the
+@command{gawk} utility a small C @code{main()} function linked against
+the library.
+
+This seemed like the tail wagging the dog, complicating build and
+installation and making a simple copy of the @command{gawk} executable
+from one system to another (or one place to another on the same
+system!) into a chancy operation.
+
+Pat Rankin suggested the solution that was adopted.
+@xref{Extension Mechanism Outline}, for the details.
+
+@node Extension Other Design Decisions
+@appendixsubsec Other Design Decisions
+
+As an arbitrary design decision, extensions can read the values of
+predefined variables and arrays (such as @code{ARGV} and @code{FS}), but cannot
+change them, with the exception of @code{PROCINFO}.
+
+The reason for this is to prevent an extension function from affecting
+the flow of an @command{awk} program outside its control.  While a real
+@command{awk} function can do what it likes, that is at the discretion
+of the programmer.  An extension function should provide a service or
+make a C API available for use within @command{awk}, and not mess with
+@code{FS} or @code{ARGC} and @code{ARGV}.
+
+In addition, it becomes easy to start down a slippery slope. How
+much access to @command{gawk} facilities do extensions need?
+Do they need @code{getline}?  What about calling @code{gsub()} or
+compiling regular expressions?  What about calling into @command{awk}
+functions? (@emph{That} would be messy.)
+
+In order to avoid these issues, the @command{gawk} developers chose
+to start with the simplest, most basic features that are still truly useful.
+
+Another decision is that although @command{gawk} provides nice things like
+MPFR, and arrays indexed internally by integers, these features are not
+being brought out to the API in order to keep things simple and close to
+traditional @command{awk} semantics.  (In fact, arrays indexed internally
+by integers are so transparent that they aren't even documented!)
+
+Additionally, all functions in the API check that their pointer
+input parameters are not @code{NULL}. If they are, they return an error.
+(It is a good idea for extension code to verify that
+pointers received from @command{gawk} are not @code{NULL}.
+Such a thing should not happen, but the @command{gawk} developers
+are only human, and they have been known to occasionally make
+mistakes.)
+
+With time, the API will undoubtedly evolve; the @command{gawk} developers
+expect this to be driven by user needs. For now, the current API seems
+to provide a minimal yet powerful set of features for creating extensions.
+
+@node Extension Future Growth
+@appendixsubsec Room For Future Growth
+
+The API can later be expanded, in two ways:
+
+@itemize @value{BULLET}
+@item
+@command{gawk} passes an ``extension id'' into the extension when it
+first loads the extension.  The extension then passes this id back
+to @command{gawk} with each function call.  This mechanism allows
+@command{gawk} to identify the extension calling into it, should it need
+to know.
+
+@item
+Similarly, the extension passes a ``name space'' into @command{gawk}
+when it registers each extension function.  This accommodates a possible future
+mechanism for grouping extension functions and possibly avoiding name
+conflicts.
+@end itemize
+
+Of course, as of this writing, no decisions have been made with respect
+to any of the above.
+
+@node Notes summary
+@appendixsec Summary
+
+@itemize @value{BULLET}
+@item
+@command{gawk}'s extensions can be disabled with either the
+@option{--traditional} option or with the @option{--posix} option.
+The @option{--parsedebug} option is available if @command{gawk} is
+compiled with @samp{-DDEBUG}.
+
+@item
+The source code for @command{gawk} is maintained in a publicly
+accessible Git repository. Anyone may check it out and view the source.
+
+@item
+Contributions to @command{gawk} are welcome. Following the steps
+outlined in this @value{CHAPTER} will make it easier to integrate
+your contributions into the code base.
+This applies both to new feature contributions and to ports to
+additional operating systems.
+
+@item
+@command{gawk} has some limits---generally those that are imposed by
+the machine architecture.
+
+@item
+The extension API design was intended to solve a number of problems
+with the previous extension mechanism, enable features needed by
+the @code{xgawk} project, and provide binary compatibility going forward.
+
+@item
+The previous extension mechanism is no longer supported and was
+removed from the code base with the 4.2 release.
+
+@end itemize
+
+
+@node Basic Concepts
+@appendix Basic Programming Concepts
+@cindex programming, concepts
+@cindex programming, concepts
+
+This @value{APPENDIX} attempts to define some of the basic concepts
+and terms that are used throughout the rest of this @value{DOCUMENT}.
+As this @value{DOCUMENT} is specifically about @command{awk},
+and not about computer programming in general, the coverage here
+is by necessity fairly cursory and simplistic.
+(If you need more background, there are many
+other introductory texts that you should refer to instead.)
+
+@menu
+* Basic High Level::            The high level view.
+* Basic Data Typing::           A very quick intro to data types.
+@end menu
+
+@node Basic High Level
+@appendixsec What a Program Does
+
+@cindex processing data
+At the most basic level, the job of a program is to process
+some input data and produce results.
+@ifnotdocbook
+See @ref{figure-general-flow}.
+@end ifnotdocbook
+@ifdocbook
+See @inlineraw{docbook, <xref linkend="figure-general-flow"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-general-flow
+@caption{General Program Flow}
+@center @image{general-program, , , General program flow}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-general-flow" float="0">
+<title>General Program Flow</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="general-program.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+@cindex compiled programs
+@cindex interpreted programs
+The ``program'' in the figure can be either a compiled
+program@footnote{Compiled programs are typically written
+in lower-level languages such as C, C++, or Ada,
+and then translated, or @dfn{compiled}, into a form that
+the computer can execute directly.}
+(such as @command{ls}),
+or it may be @dfn{interpreted}.  In the latter case, a machine-executable
+program such as @command{awk} reads your program, and then uses the
+instructions in your program to process the data.
+
+@cindex programming, basic steps
+When you write a program, it usually consists
+of the following, very basic set of steps,
+@ifnotdocbook
+as shown in @ref{figure-process-flow}:
+@end ifnotdocbook
+@ifdocbook
+as shown in @inlineraw{docbook, <xref linkend="figure-process-flow"/>}:
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-process-flow
+@caption{Basic Program Steps}
+@center @image{process-flow, , , Basic Program Stages}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-process-flow" float="0">
+<title>Basic Program Stages</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="process-flow.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+@table @asis
+@item Initialization
+These are the things you do before actually starting to process
+data, such as checking arguments, initializing any data you need
+to work with, and so on.
+This step corresponds to @command{awk}'s @code{BEGIN} rule
+(@pxref{BEGIN/END}).
+
+If you were baking a cake, this might consist of laying out all the
+mixing bowls and the baking pan, and making sure you have all the
+ingredients that you need.
+
+@item Processing
+This is where the actual work is done.  Your program reads data,
+one logical chunk at a time, and processes it as appropriate.
+
+In most programming languages, you have to manually manage the reading
+of data, checking to see if there is more each time you read a chunk.
+@command{awk}'s pattern-action paradigm
+(@pxref{Getting Started})
+handles the mechanics of this for you.
+
+In baking a cake, the processing corresponds to the actual labor:
+breaking eggs, mixing the flour, water, and other ingredients, and then putting the cake
+into the oven.
+
+@item Clean Up
+Once you've processed all the data, you may have things you need to
+do before exiting.
+This step corresponds to @command{awk}'s @code{END} rule
+(@pxref{BEGIN/END}).
+
+After the cake comes out of the oven, you still have to wrap it in
+plastic wrap to keep anyone from tasting it, as well as wash
+the mixing bowls and utensils.
+@end table
+
+@cindex algorithms
+An @dfn{algorithm} is a detailed set of instructions necessary to accomplish
+a task, or process data.  It is much the same as a recipe for baking
+a cake.  Programs implement algorithms.  Often, it is up to you to design
+the algorithm and implement it, simultaneously.
+
+@cindex records
+@cindex fields
+The ``logical chunks'' we talked about previously are called @dfn{records},
+similar to the records a company keeps on employees, a school keeps for
+students, or a doctor keeps for patients.
+Each record has many component parts, such as first and last names,
+date of birth, address, and so on.  The component parts are referred
+to as the @dfn{fields} of the record.
+
+The act of reading data is termed @dfn{input}, and that of
+generating results, not too surprisingly, is termed @dfn{output}.
+They are often referred to together as ``input/output,''
+and even more often, as ``I/O'' for short.
+(You will also see ``input'' and ``output'' used as verbs.)
+
+@cindex data-driven languages
+@cindex languages@comma{} data-driven
+@command{awk} manages the reading of data for you, as well as the
+breaking it up into records and fields.  Your program's job is to
+tell @command{awk} what to do with the data.  You do this by describing
+@dfn{patterns} in the data to look for, and @dfn{actions} to execute
+when those patterns are seen.  This @dfn{data-driven} nature of
+@command{awk} programs usually makes them both easier to write
+and easier to read.
+
+@node Basic Data Typing
+@appendixsec Data Values in a Computer
+
+@cindex variables
+In a program,
+you keep track of information and values in things called @dfn{variables}.
+A variable is just a name for a given value, such as @code{first_name},
+@code{last_name}, @code{address}, and so on.
+@command{awk} has several predefined variables, and it has
+special names to refer to the current input record
+and the fields of the record.
+You may also group multiple
+associated values under one name, as an array.
+
+@cindex values, numeric
+@cindex values, string
+@cindex scalar values
+Data, particularly in @command{awk}, consists of either numeric
+values, such as 42 or 3.1415927, or string values.
+String values are essentially anything that's not a number, such as a name.
+Strings are sometimes referred to as @dfn{character data}, since they
+store the individual characters that comprise them.
+Individual variables, as well as numeric and string variables, are
+referred to as @dfn{scalar} values.
+Groups of values, such as arrays, are not scalars.
+
+@ref{Computer Arithmetic}, provided a basic introduction to numeric
+types (integer and floating-point) and how they are used in a computer.
+Please review that information, including a number of caveats that
+were presented.
+
+@cindex null strings
+While you are probably used to the idea of a number without a value (i.e., zero),
+it takes a bit more getting used to the idea of zero-length character data.
+Nevertheless, such a thing exists.
+It is called the @dfn{null string}.
+The null string is character data that has no value.
+In other words, it is empty.  It is written in @command{awk} programs
+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
+@iftex
+column.  (Remember grade school? @math{42 = 4\times 10 + 2}.)
+@end iftex
+@ifnottex
+column.  (Remember grade school? 42 = 4 x 10 + 2.)
+@end 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.
+@iftex
+Thus, binary 1010 represents @math{(1\times 8) + (0\times 4) + (1\times 2) + (0\times 1)}, or decimal 10.
+@end iftex
+@ifnottex
+Thus, binary 1010 represents (1 x 8) + (0 x 4) + (1 x 2)
++ (0 x 1), or decimal 10.
+@end ifnottex
+Octal and hexadecimal are discussed more in
+@ref{Nondecimal-numbers}.
+
+At the very lowest level, computers store values as groups of binary digits,
+or @dfn{bits}.  Modern computers group bits into groups of eight, called @dfn{bytes}.
+Advanced applications sometimes have to manipulate bits directly,
+and @command{gawk} provides functions for doing so.
+
+Programs are written in programming languages.
+Hundreds, if not thousands, of programming languages exist.
+One of the most popular is the C programming language.
+The C language had a very strong influence on the design of
+the @command{awk} language.
+
+@cindex Kernighan, Brian
+@cindex Ritchie, Dennis
+There have been several versions of C.  The first is often referred to
+as ``K&R'' C, after the initials of Brian Kernighan and Dennis Ritchie,
+the authors of the first book on C.  (Dennis Ritchie created the language,
+and Brian Kernighan was one of the creators of @command{awk}.)
+
+In the mid-1980s, an effort began to produce an international standard
+for C.  This work culminated in 1989, with the production of the ANSI
+standard for C.  This standard became an ISO standard in 1990.
+In 1999, a revised ISO C standard was approved and released.
+Where it makes sense, POSIX @command{awk} is compatible with 1999 ISO C.
+
+
+@node Glossary
+@unnumbered Glossary
+
+@table @asis
+@item Action
+A series of @command{awk} statements attached to a rule.  If the rule's
+pattern matches an input record, @command{awk} executes the
+rule's action.  Actions are always enclosed in braces.
+(@xref{Action Overview}.)
+
+@cindex Ada programming language
+@cindex programming languages, Ada
+@item Ada
+A programming language originally defined by the U.S.@: Department of
+Defense for embedded programming. It was designed to enforce good
+Software Engineering practices.
+
+@cindex Spencer, Henry
+@cindex @command{sed} utility
+@cindex amazing @command{awk} assembler (@command{aaa})
+@item Amazing @command{awk} Assembler
+Henry Spencer at the University of Toronto wrote a retargetable assembler
+completely as @command{sed} and @command{awk} scripts.  It is thousands
+of lines long, including machine descriptions for several eight-bit
+microcomputers.  It is a good example of a program that would have been
+better written in another language.
+@c You can get it from @uref{http://awk.info/?awk100/aaa}.
+
+@cindex amazingly workable formatter (@command{awf})
+@cindex @command{awf} (amazingly workable formatter) program
+@item Amazingly Workable Formatter (@command{awf})
+Henry Spencer at the University of Toronto wrote a formatter that accepts
+a large subset of the @samp{nroff -ms} and @samp{nroff -man} formatting
+commands, using @command{awk} and @command{sh}.
+@c It is available
+@c from @uref{http://awk.info/?tools/awf}.
+
+@item Anchor
+The regexp metacharacters @samp{^} and @samp{$}, which force the match
+to the beginning or end of the string, respectively.
+
+@cindex ANSI
+@item ANSI
+The American National Standards Institute.  This organization produces
+many standards, among them the standards for the C and C++ programming
+languages.
+These standards often become international standards as well. See also
+``ISO.''
+
+@item Argument
+An argument can be two different things.  It can be an option or a
+@value{FN} passed to a command while invoking it from the command line, or
+it can be something passed to a @dfn{function} inside a program, e.g.
+inside @command{awk}.
+
+In the latter case, an argument can be passed to a function in two ways.
+Either it is given to the called function by value, i.e., a copy of the
+value of the variable is made available to the called function, but the
+original variable cannot be modified by the function itself; or it is
+given by reference, i.e., a pointer to the interested variable is passed to
+the function, which can then directly modify it. In @command{awk}
+scalars are passed by value, and arrays are passed by reference.
+See ``Pass By Value/Reference.''
+
+@item Array
+A grouping of multiple values under the same name.
+Most languages just provide sequential arrays.
+@command{awk} provides associative arrays.
+
+@item Assertion
+A statement in a program that a condition is true at this point in the program.
+Useful for reasoning about how a program is supposed to behave.
+
+@item Assignment
+An @command{awk} expression that changes the value of some @command{awk}
+variable or data object.  An object that you can assign to is called an
+@dfn{lvalue}.  The assigned values are called @dfn{rvalues}.
+@xref{Assignment Ops}.
+
+@item Associative Array
+Arrays in which the indices may be numbers or strings, not just
+sequential integers in a fixed range.
+
+@item @command{awk} Language
+The language in which @command{awk} programs are written.
+
+@item @command{awk} Program
+An @command{awk} program consists of a series of @dfn{patterns} and
+@dfn{actions}, collectively known as @dfn{rules}.  For each input record
+given to the program, the program's rules are all processed in turn.
+@command{awk} programs may also contain function definitions.
+
+@item @command{awk} Script
+Another name for an @command{awk} program.
+
+@item Bash
+The GNU version of the standard shell
+@ifnotinfo
+(the @b{B}ourne-@b{A}gain @b{SH}ell).
+@end ifnotinfo
+@ifinfo
+(the Bourne-Again SHell).
+@end ifinfo
+See also ``Bourne Shell.''
+
+@item Binary
+Base-two notation, where the digits are @code{0}--@code{1}. Since
+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
+@iftex
+the same as decimal 21, (@math{(1\times 16) + (1\times 4) + (1\times 1)}).
+@end iftex
+@ifnottex
+the same as decimal 21, ((1 x 16) + (1 x 4) + (1 x 1)).
+@end ifnottex
+
+Since base-two numbers quickly become
+very long to read and write, they are usually grouped by 3 (i.e., they are
+read as octal numbers), or by 4 (i.e., they are read as hexadecimal
+numbers). There is no direct way to insert base 2 numbers in a C program.
+If need arises, such numbers are usually inserted as octal or hexadecimal
+numbers. The number of base-two digits that fit into registers used for
+representing integer numbers in computers is a rough indication of the
+computing power of the computer itself.  Most computers nowadays use 64
+bits for representing integer numbers in their registers, but 32-bit,
+16-bit and 8-bit registers have been widely used in the past.
+@xref{Nondecimal-numbers}.
+@item Bit
+Short for ``Binary Digit.''
+All values in computer memory ultimately reduce to binary digits: values
+that are either zero or one.
+Groups of bits may be interpreted differently---as integers,
+floating-point numbers, character data, addresses of other
+memory objects, or other data.
+@command{awk} lets you work with floating-point numbers and strings.
+@command{gawk} lets you manipulate bit values with the built-in
+functions described in
+@ref{Bitwise Functions}.
+
+Computers are often defined by how many bits they use to represent integer
+values.  Typical systems are 32-bit systems, but 64-bit systems are
+becoming increasingly popular, and 16-bit systems have essentially
+disappeared.
+
+@item Boolean Expression
+Named after the English mathematician Boole. See also ``Logical Expression.''
+
+@item Bourne Shell
+The standard shell (@file{/bin/sh}) on Unix and Unix-like systems,
+originally written by Steven R.@: Bourne at Bell Laboratories.
+Many shells (Bash, @command{ksh}, @command{pdksh}, @command{zsh}) are
+generally upwardly compatible with the Bourne shell.
+
+@item Braces
+The characters @samp{@{} and @samp{@}}.  Braces are used in
+@command{awk} for delimiting actions, compound statements, and function
+bodies.
+
+@item Bracket Expression
+Inside a @dfn{regular expression}, an expression included in square
+brackets, meant to designate a single character as belonging to a
+specified character class. A bracket expression can contain a list of one
+or more characters, like @samp{[abc]}, a range of characters, like
+@samp{[A-Z]}, or a name, delimited by @samp{:}, that designates a known set
+of characters, like @samp{[:digit:]}. The form of bracket expression
+enclosed between @samp{:} is independent of the underlying representation
+of the character themselves, which could utilize the ASCII, EBCDIC, or
+Unicode codesets, depending on the architecture of the computer system, and on
+localization.
+See also ``Regular Expression.''
+
+@item Built-in Function
+The @command{awk} language provides built-in functions that perform various
+numerical, I/O-related, and string computations.  Examples are
+@code{sqrt()} (for the square root of a number) and @code{substr()} (for a
+substring of a string).
+@command{gawk} provides functions for timestamp management, bit manipulation,
+array sorting, type checking,
+and runtime string translation.
+(@xref{Built-in}.)
+
+@item Built-in Variable
+@code{ARGC},
+@code{ARGV},
+@code{CONVFMT},
+@code{ENVIRON},
+@code{FILENAME},
+@code{FNR},
+@code{FS},
+@code{NF},
+@code{NR},
+@code{OFMT},
+@code{OFS},
+@code{ORS},
+@code{RLENGTH},
+@code{RSTART},
+@code{RS},
+and
+@code{SUBSEP}
+are the variables that have special meaning to @command{awk}.
+In addition,
+@code{ARGIND},
+@code{BINMODE},
+@code{ERRNO},
+@code{FIELDWIDTHS},
+@code{FPAT},
+@code{IGNORECASE},
+@code{LINT},
+@code{PROCINFO},
+@code{RT},
+and
+@code{TEXTDOMAIN}
+are the variables that have special meaning to @command{gawk}.
+Changing some of them affects @command{awk}'s running environment.
+(@xref{Built-in Variables}.)
+
+@item C
+The system programming language that most GNU software is written in.  The
+@command{awk} programming language has C-like syntax, and this @value{DOCUMENT}
+points out similarities between @command{awk} and C when appropriate.
+
+In general, @command{gawk} attempts to be as similar to the 1990 version
+of ISO C as makes sense.
+
+@item C Shell
+The C Shell (@command{csh} or its improved version, @command{tcsh}) is a Unix shell that was
+created by Bill Joy in the late 1970s. The C shell was differentiated from
+other shells by its interactive features and overall style, which
+looks more like C. The C Shell is not backward compatible with the Bourne
+Shell, so special attention is required when converting scripts
+written for other Unix shells to the C shell, especially with regard to the management of
+shell variables.
+See also ``Bourne Shell.''
+
+@item C++
+A popular object-oriented programming language derived from C.
+
+@item Character Class
+See ``Bracket Expression.''
+
+@item Character List
+See ``Bracket Expression.''
+
+@cindex ASCII
+@cindex ISO 8859-1
+@cindex ISO Latin-1
+@cindex character sets (machine character encodings)
+@cindex Unicode
+@item Character Set
+The set of numeric codes used by a computer system to represent the
+characters (letters, numbers, punctuation, etc.) of a particular country
+or place. The most common character set in use today is ASCII (American
+Standard Code for Information Interchange).  Many European
+countries use an extension of ASCII known as ISO-8859-1 (ISO Latin-1).
+The @uref{http://www.unicode.org, Unicode character set} is
+increasingly popular and standard, and is particularly
+widely used on GNU/Linux systems.
+
+@cindex Kernighan, Brian
+@cindex Bentley, Jon
+@cindex @command{chem} utility
+@item CHEM
+A preprocessor for @command{pic} that reads descriptions of molecules
+and produces @command{pic} input for drawing them.
+It was written in @command{awk}
+by Brian Kernighan and Jon Bentley, and is available from
+@uref{http://netlib.org/typesetting/chem}.
+
+@item Comparison Expression
+A relation that is either true or false, such as @samp{a < b}.
+Comparison expressions are used in @code{if}, @code{while}, @code{do},
+and @code{for}
+statements, and in patterns to select which input records to process.
+(@xref{Typing and Comparison}.)
+
+@cindex compiled programs
+@item Compiler
+A program that translates human-readable source code into
+machine-executable object code.  The object code is then executed
+directly by the computer.
+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:]]}
+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}.
+See ``Bracket Expression.''
+
+@item Compound Statement
+A series of @command{awk} statements, enclosed in curly braces.  Compound
+statements may be nested.
+(@xref{Statements}.)
+
+@item Computed Regexps
+See ``Dynamic Regular Expressions.''
+
+@item Concatenation
+Concatenating two strings means sticking them together, one after another,
+producing a new string.  For example, the string @samp{foo} concatenated with
+the string @samp{bar} gives the string @samp{foobar}.
+(@xref{Concatenation}.)
+
+@item Conditional Expression
+An expression using the @samp{?:} ternary operator, such as
+@samp{@var{expr1} ? @var{expr2} : @var{expr3}}.  The expression
+@var{expr1} is evaluated; if the result is true, the value of the whole
+expression is the value of @var{expr2}; otherwise the value is
+@var{expr3}.  In either case, only one of @var{expr2} and @var{expr3}
+is evaluated. (@xref{Conditional Exp}.)
+
+@item Control Statement
+A control statement is an instruction to perform a given operation or a set
+of operations inside an @command{awk} program, if a given condition is
+true. Control statements are: @code{if}, @code{for}, @code{while}, and
+@code{do}
+(@pxref{Statements}).
+
+@cindex McIlroy, Doug
+@cindex cookie
+@item Cookie
+A peculiar goodie, token, saying or remembrance
+produced by or presented to a program. (With thanks to Professor Doug McIlroy.)
+@ignore
+From: Doug McIlroy <doug@cs.dartmouth.edu>
+Date: Sat, 13 Oct 2012 19:55:25 -0400
+To: arnold@skeeve.com
+Subject: Re: origin of the term "cookie"?
+
+I believe the term "cookie", for a more or less inscrutable
+saying or crumb of information, was injected into Unix
+jargon by Bob Morris, who used the word quite frequently.
+It had no fixed meaning as it now does in browsers.
+
+The word had been around long before it was recognized in
+the 8th edition glossary (earlier editions had no glossary):
+
+cookie   a peculiar goodie, token, saying or remembrance
+returned by or presented to a program. [I would say that
+"returned by" would better read "produced by", and assume
+responsibility for the inexactitude.]
+
+Doug McIlroy
+
+From: Doug McIlroy <doug@cs.dartmouth.edu>
+Date: Sun, 14 Oct 2012 10:08:43 -0400
+To: arnold@skeeve.com
+Subject: Re: origin of the term "cookie"?
+
+> Can I forward your email to Eric Raymond, for possible addition to the
+> Jargon File?
+
+Sure. I might add that I don't know how "cookie" entered Morris's
+vocabulary. Certainly "values of beta give rise to dom!" (see google)
+was an early, if not the earliest Unix cookie.  The fact that it was
+found lying around on a model 37 teletype (which had Greek beta in
+its type box) suggests that maybe it was seen to be like milk and
+cookies laid out for Santa Claus. Morris was wont to make such
+connections.
+
+Doug
+@end ignore
+
+@item Coprocess
+A subordinate program with which two-way communications is possible.
+
+@item Curly Braces
+See ``Braces.''
+
+@cindex dark corner
+@item Dark Corner
+An area in the language where specifications often were (or still
+are) not clear, leading to unexpected or undesirable behavior.
+Such areas are marked in this @value{DOCUMENT} with
+@iftex
+the picture of a flashlight in the margin
+@end iftex
+@ifnottex
+``(d.c.)'' in the text
+@end ifnottex
+and are indexed under the heading ``dark corner.''
+
+@item Data Driven
+A description of @command{awk} programs, where you specify the data you
+are interested in processing, and what to do when that data is seen.
+
+@item Data Objects
+These are numbers and strings of characters.  Numbers are converted into
+strings and vice versa, as needed.
+(@xref{Conversion}.)
+
+@item Deadlock
+The situation in which two communicating processes are each waiting
+for the other to perform an action.
+
+@item Debugger
+A program used to help developers remove ``bugs'' from (de-bug)
+their programs.
+
+@item Double Precision
+An internal representation of numbers that can have fractional parts.
+Double precision numbers keep track of more digits than do single precision
+numbers, but operations on them are sometimes more expensive.  This is the way
+@command{awk} stores numeric values.  It is the C type @code{double}.
+
+@item Dynamic Regular Expression
+A dynamic regular expression is a regular expression written as an
+ordinary expression.  It could be a string constant, such as
+@code{"foo"}, but it may also be an expression whose value can vary.
+(@xref{Computed Regexps}.)
+
+@item Empty String
+See ``Null String.''
+
+@item Environment
+A collection of strings, of the form @samp{@var{name}=@var{val}}, that each
+program has available to it. Users generally place values into the
+environment in order to provide information to various programs. Typical
+examples are the environment variables @env{HOME} and @env{PATH}.
+
+@cindex epoch, definition of
+@item Epoch
+The date used as the ``beginning of time'' for timestamps.
+Time values in most systems are represented as seconds since the epoch,
+with library functions available for converting these values into
+standard date and time formats.
+
+The epoch on Unix and POSIX systems is 1970-01-01 00:00:00 UTC.
+See also ``GMT'' and ``UTC.''
+
+@item Escape Sequences
+A special sequence of characters used for describing nonprinting
+characters, such as @samp{\n} for newline or @samp{\033} for the ASCII
+ESC (Escape) character. (@xref{Escape Sequences}.)
+
+@item Extension
+An additional feature or change to a programming language or
+utility not defined by that language's or utility's standard.
+@command{gawk} has (too) many extensions over POSIX @command{awk}.
+
+@item FDL
+See ``Free Documentation License.''
+
+@item Field
+When @command{awk} reads an input record, it splits the record into pieces
+separated by whitespace (or by a separator regexp that you can
+change by setting the predefined variable @code{FS}).  Such pieces are
+called fields.  If the pieces are of fixed length, you can use the built-in
+variable @code{FIELDWIDTHS} to describe their lengths.
+If you wish to specify the contents of fields instead of the field
+separator, you can use the predefined variable @code{FPAT} to do so.
+(@xref{Field Separators},
+@ref{Constant Size},
+and
+@ref{Splitting By Content}.)
+
+@item Flag
+A variable whose truth value indicates the existence or nonexistence
+of some condition.
+
+@item Floating-Point Number
+Often referred to in mathematical terms as a ``rational'' or real number,
+this is just a number that can have a fractional part.
+See also ``Double Precision'' and ``Single Precision.''
+
+@item Format
+Format strings control the appearance of output in the
+@code{strftime()} and @code{sprintf()} functions, and in the
+@code{printf} statement as well.  Also, data conversions from numbers to strings
+are controlled by the format strings contained in the predefined variables
+@code{CONVFMT} and @code{OFMT}. (@xref{Control Letters}.)
+
+@item Fortran
+Shorthand for FORmula TRANslator, one of the first programming languages
+available for scientific calculations. It was created by John Backus,
+and has been available since 1957. It is still in use today.
+
+@item Free Documentation License
+This document describes the terms under which this @value{DOCUMENT}
+is published and may be copied. (@xref{GNU Free Documentation License}.)
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@cindex Stallman, Richard
+@item Free Software Foundation
+A nonprofit organization dedicated
+to the production and distribution of freely distributable software.
+It was founded by Richard M.@: Stallman, the author of the original
+Emacs editor.  GNU Emacs is the most widely used version of Emacs today.
+
+@item FSF
+See ``Free Software Foundation.''
+
+@item Function
+A part of an @command{awk} program that can be invoked from every point of
+the program, to perform a task.  @command{awk} has several built-in
+functions.
+Users can define their own functions in every part of the program.
+Function can be recursive, i.e., they may invoke themselves.
+@xref{Functions}.
+In @command{gawk} it is also possible to have functions shared
+among different programs, and included where required using the
+@code{@@include} directive
+(@pxref{Include Files}).
+In @command{gawk} the name of the function that should be invoked
+can be generated at run time, i.e., dynamically.
+The @command{gawk} extension API provides constructor functions
+(@pxref{Constructor Functions}).
+
+
+@item @command{gawk}
+The GNU implementation of @command{awk}.
+
+@cindex GPL (General Public License)
+@cindex General Public License (GPL)
+@cindex GNU General Public License
+@item General Public License
+This document describes the terms under which @command{gawk} and its source
+code may be distributed. (@xref{Copying}.)
+
+@item GMT
+``Greenwich Mean Time.''
+This is the old term for UTC.
+It is the time of day used internally for Unix and POSIX systems.
+See also ``Epoch'' and ``UTC.''
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@cindex GNU Project
+@item GNU
+``GNU's not Unix''.  An on-going project of the Free Software Foundation
+to create a complete, freely distributable, POSIX-compliant computing
+environment.
+
+@item GNU/Linux
+A variant of the GNU system using the Linux kernel, instead of the
+Free Software Foundation's Hurd kernel.
+The Linux kernel is a stable, efficient, full-featured clone of Unix that has
+been ported to a variety of architectures.
+It is most popular on PC-class systems, but runs well on a variety of
+other systems too.
+The Linux kernel source code is available under the terms of the GNU General
+Public License, which is perhaps its most important aspect.
+
+@item GPL
+See ``General Public License.''
+
+@item Hexadecimal
+Base 16 notation, where the digits are @code{0}--@code{9} and
+@code{A}--@code{F}, 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},
+@iftex
+to indicate their base.  Thus, @code{0x12} is 18 (@math{(1\times 16) + 2}).
+@end iftex
+@ifnottex
+to indicate their base.  Thus, @code{0x12} is 18 ((1 x 16) + 2).
+@end ifnottex
+@xref{Nondecimal-numbers}.
+
+@item I/O
+Abbreviation for ``Input/Output,'' the act of moving data into and/or
+out of a running program.
+
+@item Input Record
+A single chunk of data that is read in by @command{awk}.  Usually, an @command{awk} input
+record consists of one line of text.
+(@xref{Records}.)
+
+@item Integer
+A whole number, i.e., a number that does not have a fractional part.
+
+@item Internationalization
+The process of writing or modifying a program so
+that it can use multiple languages without requiring
+further source code changes.
+
+@cindex interpreted programs
+@item Interpreter
+A program that reads human-readable source code directly, and uses
+the instructions in it to process data and produce results.
+@command{awk} is typically (but not always) implemented as an interpreter.
+See also ``Compiler.''
+
+@item Interval Expression
+A component of a regular expression that lets you specify repeated matches of
+some part of the regexp.  Interval expressions were not originally available
+in @command{awk} programs.
+
+@cindex ISO
+@item ISO
+The International Organization for Standardization.
+This organization produces international standards for many things, including
+programming languages, such as C and C++.
+In the computer arena, important standards like those for C, C++, and POSIX
+become both American national and ISO international standards simultaneously.
+This @value{DOCUMENT} refers to Standard C as ``ISO C'' throughout.
+See @uref{https://www.iso.org/iso/home/about.htm, the ISO website} for more
+information about the name of the organization and its language-independent
+three-letter acronym.
+
+@cindex Java programming language
+@cindex programming languages, Java
+@item Java
+A modern programming language originally developed by Sun Microsystems
+(now Oracle) supporting Object-Oriented programming.  Although usually
+implemented by compiling to the instructions for a standard virtual
+machine (the JVM), the language can be compiled to native code.
+
+@item Keyword
+In the @command{awk} language, a keyword is a word that has special
+meaning.  Keywords are reserved and may not be used as variable names.
+
+@command{gawk}'s keywords are:
+@code{BEGIN},
+@code{BEGINFILE},
+@code{END},
+@code{ENDFILE},
+@code{break},
+@code{case},
+@code{continue},
+@code{default},
+@code{delete},
+@code{do@dots{}while},
+@code{else},
+@code{exit},
+@code{for@dots{}in},
+@code{for},
+@code{function},
+@code{func},
+@code{if},
+@code{next},
+@code{nextfile},
+@code{switch},
+and
+@code{while}.
+
+@item Korn Shell
+The Korn Shell (@command{ksh}) is a Unix shell which was developed by David Korn at Bell
+Laboratories in the early 1980s. The Korn Shell is backward-compatible with the Bourne
+shell and includes many features of the C shell.
+See also ``Bourne Shell.''
+
+@cindex LGPL (Lesser General Public License)
+@cindex Lesser General Public License (LGPL)
+@cindex GNU Lesser General Public License
+@item Lesser General Public License
+This document describes the terms under which binary library archives
+or shared objects,
+and their source code may be distributed.
+
+@item LGPL
+See ``Lesser General Public License.''
+
+@item Linux
+See ``GNU/Linux.''
+
+@item Localization
+The process of providing the data necessary for an
+internationalized program to work in a particular language.
+
+@item Logical Expression
+An expression using the operators for logic, AND, OR, and NOT, written
+@samp{&&}, @samp{||}, and @samp{!} in @command{awk}. Often called Boolean
+expressions, after the mathematician who pioneered this kind of
+mathematical logic.
+
+@item Lvalue
+An expression that can appear on the left side of an assignment
+operator.  In most languages, lvalues can be variables or array
+elements.  In @command{awk}, a field designator can also be used as an
+lvalue.
+
+@item Matching
+The act of testing a string against a regular expression.  If the
+regexp describes the contents of the string, it is said to @dfn{match} it.
+
+@item Metacharacters
+Characters used within a regexp that do not stand for themselves.
+Instead, they denote regular expression operations, such as repetition,
+grouping, or alternation.
+
+@item Nesting
+Nesting is where information is organized in layers, or where objects
+contain other similar objects.
+In @command{gawk} the @code{@@include}
+directive can be nested. The ``natural'' nesting of arithmetic and
+logical operations can be changed using parentheses
+(@pxref{Precedence}).
+
+@item No-op
+An operation that does nothing.
+
+@item Null String
+A string with no characters in it.  It is represented explicitly in
+@command{awk} programs by placing two double quote characters next to
+each other (@code{""}).  It can appear in input data by having two successive
+occurrences of the field separator appear next to each other.
+
+@item Number
+A numeric-valued data object.  Modern @command{awk} implementations use
+double precision floating-point to represent numbers.
+Ancient @command{awk} implementations used single precision floating-point.
+
+@item Octal
+Base-eight notation, where the digits are @code{0}--@code{7}.
+Octal numbers are written in C using a leading @samp{0},
+@iftex
+to indicate their base.  Thus, @code{013} is 11 (@math{(1\times 8) + 3}).
+@end iftex
+@ifnottex
+to indicate their base.  Thus, @code{013} is 11 ((1 x 8) + 3).
+@end ifnottex
+@xref{Nondecimal-numbers}.
+
+@item Output Record
+A single chunk of data that is written out by @command{awk}.  Usually, an
+@command{awk} output record consists of one or more lines of text.
+@xref{Records}.
+
+@item Pattern
+Patterns tell @command{awk} which input records are interesting to which
+rules.
+
+A pattern is an arbitrary conditional expression against which input is
+tested.  If the condition is satisfied, the pattern is said to @dfn{match}
+the input record.  A typical pattern might compare the input record against
+a regular expression. (@xref{Pattern Overview}.)
+
+@item PEBKAC
+An acronym describing what is possibly the most frequent
+source of computer usage problems. (Problem Exists Between
+Keyboard And Chair.)
+
+@item Plug-in
+See ``Extensions.''
+
+@item POSIX
+The name for a series of standards
+that specify a Portable Operating System interface.  The ``IX'' denotes
+the Unix heritage of these standards.  The main standard of interest for
+@command{awk} users is
+@cite{IEEE Standard for Information Technology, Standard 1003.1-2008}.
+The 2008 POSIX standard can be found online at
+@url{http://pubs.opengroup.org/onlinepubs/9699919799/}.
+
+@item Precedence
+The order in which operations are performed when operators are used
+without explicit parentheses.
+
+@item Private
+Variables and/or functions that are meant for use exclusively by library
+functions and not for the main @command{awk} program. Special care must be
+taken when naming such variables and functions.
+(@xref{Library Names}.)
+
+@item Range (of input lines)
+A sequence of consecutive lines from the input file(s).  A pattern
+can specify ranges of input lines for @command{awk} to process or it can
+specify single lines. (@xref{Pattern Overview}.)
+
+@item Record
+See ``Input record'' and ``Output record.''
+
+@item Recursion
+When a function calls itself, either directly or indirectly.
+If this is clear, stop, and proceed to the next entry.
+Otherwise, refer to the entry for ``recursion.''
+
+@item Redirection
+Redirection means performing input from something other than the standard input
+stream, or performing output to something other than the standard output stream.
+
+You can redirect input to the @code{getline} statement using
+the @samp{<}, @samp{|}, and @samp{|&} operators.
+You can redirect the output of the @code{print} and @code{printf} statements
+to a file or a system command, using the @samp{>}, @samp{>>}, @samp{|}, and @samp{|&}
+operators.
+(@xref{Getline},
+and @ref{Redirection}.)
+
+@item Reference Counts
+An internal mechanism in @command{gawk} to minimize the amount of memory
+needed to store the value of string variables. If the value assumed by
+a variable is used in more than one place, only one copy of the value
+itself is kept, and the associated reference count is increased when the
+same value is used by an additional variable, and decreased when the related
+variable is no longer in use. When the reference count goes to zero,
+the memory space used to store the value of the variable is freed.
+
+@item Regexp
+See ``Regular Expression.''
+
+@item Regular Expression
+A regular expression (``regexp'' for short) is a pattern that denotes a
+set of strings, possibly an infinite set.  For example, the regular expression
+@samp{R.*xp} matches any string starting with the letter @samp{R}
+and ending with the letters @samp{xp}.  In @command{awk}, regular expressions are
+used in patterns and in conditional expressions.  Regular expressions may contain
+escape sequences. (@xref{Regexp}.)
+
+@item Regular Expression Constant
+A regular expression constant is a regular expression written within
+slashes, such as @code{/foo/}.  This regular expression is chosen
+when you write the @command{awk} program and cannot be changed during
+its execution. (@xref{Regexp Usage}.)
+
+@item Regular Expression Operators
+See ``Metacharacters.''
+
+@item Rounding
+Rounding the result of an arithmetic operation can be tricky.
+More than one way of rounding exists, and in @command{gawk}
+it is possible to choose which method should be used in a program.
+@xref{Setting the rounding mode}.
+
+@item Rule
+A segment of an @command{awk} program that specifies how to process single
+input records.  A rule consists of a @dfn{pattern} and an @dfn{action}.
+@command{awk} reads an input record; then, for each rule, if the input record
+satisfies the rule's pattern, @command{awk} executes the rule's action.
+Otherwise, the rule does nothing for that input record.
+
+@item Rvalue
+A value that can appear on the right side of an assignment operator.
+In @command{awk}, essentially every expression has a value. These values
+are rvalues.
+
+@item Scalar
+A single value, be it a number or a string.
+Regular variables are scalars; arrays and functions are not.
+
+@item Search Path
+In @command{gawk}, a list of directories to search for @command{awk} program source files.
+In the shell, a list of directories to search for executable programs.
+
+@item @command{sed}
+See ``Stream Editor.''
+
+@item Seed
+The initial value, or starting point, for a sequence of random numbers.
+
+@item Shell
+The command interpreter for Unix and POSIX-compliant systems.
+The shell works both interactively, and as a programming language
+for batch files, or shell scripts.
+
+@item Short-Circuit
+The nature of the @command{awk} logical operators @samp{&&} and @samp{||}.
+If the value of the entire expression is determinable from evaluating just
+the lefthand side of these operators, the righthand side is not
+evaluated.
+(@xref{Boolean Ops}.)
+
+@item Side Effect
+A side effect occurs when an expression has an effect aside from merely
+producing a value.  Assignment expressions, increment and decrement
+expressions, and function calls have side effects.
+(@xref{Assignment Ops}.)
+
+@item Single Precision
+An internal representation of numbers that can have fractional parts.
+Single precision numbers keep track of fewer digits than do double precision
+numbers, but operations on them are sometimes less expensive in terms of CPU time.
+This is the type used by some ancient versions of @command{awk} to store
+numeric values.  It is the C type @code{float}.
+
+@item Space
+The character generated by hitting the space bar on the keyboard.
+
+@item Special File
+A @value{FN} interpreted internally by @command{gawk}, instead of being handed
+directly to the underlying operating system---for example, @file{/dev/stderr}.
+(@xref{Special Files}.)
+
+@item Statement
+An expression inside an @command{awk} program in the action part
+of a pattern--action rule, or inside an
+@command{awk} function. A statement can be a variable assignment,
+an array operation, a loop, etc.
+
+@item Stream Editor
+A program that reads records from an input stream and processes them one
+or more at a time.  This is in contrast with batch programs, which may
+expect to read their input files in entirety before starting to do
+anything, as well as with interactive programs which require input from the
+user.
+
+@item String
+A datum consisting of a sequence of characters, such as @samp{I am a
+string}.  Constant strings are written with double quotes in the
+@command{awk} language and may contain escape sequences.
+(@xref{Escape Sequences}.)
+
+@item Tab
+The character generated by hitting the @kbd{TAB} key on the keyboard.
+It usually expands to up to eight spaces upon output.
+
+@item Text Domain
+A unique name that identifies an application.
+Used for grouping messages that are translated at runtime
+into the local language.
+
+@item Timestamp
+A value in the ``seconds since the epoch'' format used by Unix
+and POSIX systems.  Used for the @command{gawk} functions
+@code{mktime()}, @code{strftime()}, and @code{systime()}.
+See also ``Epoch,'' ``GMT,'' and ``UTC.''
+
+@cindex Linux
+@cindex GNU/Linux
+@cindex Unix
+@cindex BSD-based operating systems
+@cindex NetBSD
+@cindex FreeBSD
+@cindex OpenBSD
+@item Unix
+A computer operating system originally developed in the early 1970's at
+AT&T Bell Laboratories.  It initially became popular in universities around
+the world and later moved into commercial environments as a software
+development system and network server system. There are many commercial
+versions of Unix, as well as several work-alike systems whose source code
+is freely available (such as GNU/Linux, @uref{http://www.netbsd.org, NetBSD},
+@uref{https://www.freebsd.org, FreeBSD}, and @uref{http://www.openbsd.org, OpenBSD}).
+
+@item UTC
+The accepted abbreviation for ``Universal Coordinated Time.''
+This is standard time in Greenwich, England, which is used as a
+reference time for day and date calculations.
+See also ``Epoch'' and ``GMT.''
+
+@item Variable
+A name for a value. In @command{awk}, variables may be either scalars
+or arrays.
+
+@item Whitespace
+A sequence of space, TAB, or newline characters occurring inside an input
+record or a string.
+
+@end table
+
+@end ifclear
+
+@c The GNU General Public License.
+@node Copying
+@unnumbered GNU General Public License
+@ifnotdocbook
+@center Version 3, 29 June 2007
+@end ifnotdocbook
+@docbook
+<subtitle>Version 3, 29 June 2007</subtitle>
+@end docbook
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{https://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+@end display
+
+@c fakenode --- for prepinfo
+@heading Preamble
+
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program---to make sure it remains
+free software for all its users.  We, the Free Software Foundation,
+use the GNU General Public License for most of our software; it
+applies also to any other work released this way by its authors.  You
+can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too,
+receive or can get the source code.  And you must show them these
+terms so they know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so.  This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software.  The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products.  If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary.  To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+@c fakenode --- for prepinfo
+@heading TERMS AND CONDITIONS
+
+@enumerate 0
+@item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as ``you''.  ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy.  The resulting work is called a ``modified version'' of
+the earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices'' to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+@item Source Code.
+
+The ``source code'' for a work means the preferred form of the work for
+making modifications to it.  ``Object code'' means any non-source form
+of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+@item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright.  Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+@item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+@item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+@item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+@enumerate a
+@item
+The work must carry prominent notices stating that you modified it,
+and giving a relevant date.
+
+@item
+The work must carry prominent notices stating that it is released
+under this License and any conditions added under section 7.  This
+requirement modifies the requirement in section 4 to ``keep intact all
+notices''.
+
+@item
+You must license the entire work, as a whole, under this License to
+anyone who comes into possession of a copy.  This License will
+therefore apply, along with any applicable section 7 additional terms,
+to the whole of the work, and all its parts, regardless of how they
+are packaged.  This License gives no permission to license the work in
+any other way, but it does not invalidate such permission if you have
+separately received it.
+
+@item
+If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your work
+need not make them do so.
+@end enumerate
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+@item  Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+@enumerate a
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium customarily
+used for software interchange.
+
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a written
+offer, valid for at least three years and valid for as long as you
+offer spare parts or customer support for that product model, to give
+anyone who possesses the object code either (1) a copy of the
+Corresponding Source for all the software in the product that is
+covered by this License, on a durable physical medium customarily used
+for software interchange, for a price no more than your reasonable
+cost of physically performing this conveying of source, or (2) access
+to copy the Corresponding Source from a network server at no charge.
+
+@item
+Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source.  This alternative is
+allowed only occasionally and noncommercially, and only if you
+received the object code with such an offer, in accord with subsection
+6b.
+
+@item
+Convey the object code by offering access from a designated place
+(gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge.  You need not require recipients to copy the
+Corresponding Source along with the object code.  If the place to copy
+the object code is a network server, the Corresponding Source may be
+on a different server (operated by you or a third party) that supports
+equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source.
+Regardless of what server hosts the Corresponding Source, you remain
+obligated to ensure that it is available for as long as needed to
+satisfy these requirements.
+
+@item
+Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of
+the work are being offered to the general public at no charge under
+subsection 6d.
+
+@end enumerate
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling.  In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage.  For a particular product received by a particular user,
+``normally used'' refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product.  A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source.  The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed.  Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+@item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+@enumerate a
+@item
+Disclaiming warranty or limiting liability differently from the terms
+of sections 15 and 16 of this License; or
+
+@item
+Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices
+displayed by works containing it; or
+
+@item
+Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+
+@item
+Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+
+@item
+Declining to grant rights under trademark law for use of some trade
+names, trademarks, or service marks; or
+
+@item
+Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with
+contractual assumptions of liability to the recipient, for any
+liability that these contractual assumptions directly impose on those
+licensors and authors.
+@end enumerate
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+@item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+@item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run
+a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+@item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+@item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License.  You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+@item No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey
+a covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all.  For example, if you agree
+to terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+@item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+@item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU General Public License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies that a certain numbered version of the GNU General Public
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation.  If
+the Program does not specify a version number of the GNU General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+@item Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+@item Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+@item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+@end enumerate
+
+@c fakenode --- for prepinfo
+@heading END OF TERMS AND CONDITIONS
+
+@c fakenode --- for prepinfo
+@heading How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and a brief idea of what it does.}
+Copyright (C) @var{year} @var{name of author}
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see @url{https://www.gnu.org/licenses/}.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+@smallexample
+@var{program} Copyright (C) @var{year} @var{name of author}
+This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type @samp{show c} for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License.  Of course, your
+program's commands might be different; for a GUI interface, you would
+use an ``about box''.
+
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a ``copyright disclaimer'' for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+@url{https://www.gnu.org/licenses/}.
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read @url{https://www.gnu.org/philosophy/why-not-lgpl.html}.
+
+@ifclear FOR_PRINT
+@c The GNU Free Documentation License.
+@node GNU Free Documentation License
+@unnumbered GNU Free Documentation License
+@ifnotdocbook
+@center Version 1.3, 3 November 2008
+@end ifnotdocbook
+
+@docbook
+<subtitle>Version 1.3, 3 November 2008</subtitle>
+@end docbook
+
+@cindex FDL (Free Documentation License)
+@cindex Free Documentation License (FDL)
+@cindex GNU Free Documentation License
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{https://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document'', below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you''.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification.  Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''.  Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''.  You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+@uref{https://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.  If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works.  A
+public wiki that anybody can edit is an example of such a server.  A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@c fakenode --- for prepinfo
+@unnumberedsec ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+  Copyright (C)  @var{year}  @var{your name}.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.3
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+    with the Invariant Sections being @var{list their titles}, with
+    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+    being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@end ifclear
+
+@ifnotdocbook
+@node Index
+@unnumbered Index
+@end ifnotdocbook
+@printindex cp
+
+@bye
+
+Unresolved Issues:
+------------------
+1. From ADR.
+
+   Robert J. Chassell points out that awk programs should have some indication
+   of how to use them.  It would be useful to perhaps have a "programming
+   style" section of the manual that would include this and other tips.
+
+Consistency issues:
+	/.../ regexps are in @code, not @samp
+	".." strings are in @code, not @samp
+	no @print before @dots
+	values of expressions in the text (@code{x} has the value 15),
+		should be in roman, not @code
+	Use   TAB   and not   tab
+	Use   ESC   and not   ESCAPE
+	Use   space and not   blank	to describe the space bar's character
+	The term "blank" is thus basically reserved for "blank lines" etc.
+	To make dark corners work, the @value{DARKCORNER} has to be outside
+		closing `.' of a sentence and after (pxref{...}).
+	Make sure that each @value{DARKCORNER} has an index entry, and
+		also that each `@cindex dark corner' has an @value{DARKCORNER}.
+	" " should have an @w{} around it
+	Use "non-" only with language names or acronyms, or the words bug and option and null
+	Use @command{ftp} when talking about anonymous ftp
+	Use uppercase and lowercase, not "upper-case" and "lower-case"
+		or "upper case" and "lower case"
+	Use "single precision" and "double precision", not "single-precision" or "double-precision"
+	Use alphanumeric, not alpha-numeric
+	Use POSIX-compliant, not POSIX compliant
+	Use --foo, not -Wfoo when describing long options
+	Use "Bell Laboratories", but not "Bell Labs".
+	Use "behavior" instead of "behaviour".
+	Use "coprocess" instead of "co-process".
+	Use "zeros" instead of "zeroes".
+	Use "nonzero" not "non-zero".
+	Use "runtime" not "run time" or "run-time".
+	Use "command-line" as an adjective and "command line" as a noun.
+	Use "online" not "on-line".
+	Use "whitespace" not "white space".
+	Use "Input/Output", not "input/output". Also "I/O", not "i/o".
+	Use "lefthand"/"righthand", not "left-hand"/"right-hand".
+	Use "workaround", not "work-around".
+	Use "startup"/"cleanup", not "start-up"/"clean-up"
+	Use "filesystem", not "file system"
+	Use @code{do}, and not @code{do}-@code{while}, except where
+		actually discussing the do-while.
+	Use "versus" in text and "vs." in index entries
+	Use @code{"C"} for the C locale, not ``C'' or @samp{C}.
+	The words "a", "and", "as", "between", "for", "from", "in", "of",
+		"on", "that", "the", "to", "with", and "without",
+		should not be capitalized in @chapter, @section etc.
+		"Into" and "How" should.
+	Search for @dfn; make sure important items are also indexed.
+	"e.g." should always be followed by a comma.
+	"i.e." should always be followed by a comma.
+	The numbers zero through ten should be spelled out, except when
+		talking about file descriptor numbers. > 10 and < 0, it's
+		ok to use numbers.
+	For most cases, do NOT put a comma before "and", "or" or "but".
+		But exercise taste with this rule.
+	Don't show the awk command with a program in quotes when it's
+		just the program.  I.e.
+
+			{
+				....
+			}
+
+		not
+			awk '{
+				...
+			}'
+
+	Do show it when showing command-line arguments, data files, etc, even
+		if there is no output shown.
+
+	Use numbered lists only to show a sequential series of steps.
+
+	Use @code{xxx} for the xxx operator in indexing statements, not @samp.
+	Use MS-Windows not MS Windows
+	Use MS-DOS not MS DOS
+	Use an empty set of parentheses after built-in and awk function names.
+	Use "multiFOO" without a hyphen.
+	Use "time zone" as two words, not "timezone".
+
+Date: Wed, 13 Apr 94 15:20:52 -0400
+From: rms@gnu.org (Richard Stallman)
+To: gnu-prog@gnu.org
+Subject: A reminder: no pathnames in GNU
+
+It's a GNU convention to use the term "file name" for the name of a
+file, never "pathname".  We use the term "path" for search paths,
+which are lists of file names.  Using it for a single file name as
+well is potentially confusing to users.
+
+So please check any documentation you maintain, if you think you might
+have used "pathname".
+
+Note that "file name" should be two words when it appears as ordinary
+text.  It's ok as one word when it's a metasyntactic variable, though.
+
+------------------------
+ORA uses filename, thus the macro.
+
+Suggestions:
+------------
+
+Better sidebars can almost sort of be done with:
+
+	@ifdocbook
+	@macro @sidebar{title, content}
+	@inlinefmt{docbook, <sidebar><title>}
+	\title\
+	@inlinefmt{docbook, </title>}
+	\content\
+	@inlinefmt{docbook, </sidebar>}
+	@end macro
+	@end ifdocbook
+
+
+	@ifnotdocbook
+	@macro @sidebar{title, content}
+	@cartouche
+	@center @b{\title\}
+
+	\content\
+	@end cartouche
+	@end macro
+	@end ifnotdocbook
+
+But to use it you have to say
+
+	@sidebar{Title Here,
+	@include file-with-content
+	}
+
+which sorta sucks.
+
+TODO:
+Add a section explaining recursion from ground zero. Probably
+easiest to do it with factorial as the example. Explain that
+recursion needs a stopping condition. Thanks to
+Bill Duncan <bduncan@beachnet.org> for the suggestion.
diff --git a/gawk-5.0.1/doc/gawkinet.texi b/gawk-5.0.1/doc/gawkinet.texi
new file mode 100644
index 00000000000..0195db96421
--- /dev/null
+++ b/gawk-5.0.1/doc/gawkinet.texi
@@ -0,0 +1,4933 @@
+\input texinfo   @c -*-texinfo-*-
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename gawkinet.info
+@settitle TCP/IP Internetworking With @command{gawk}
+@c %**end of header (This is for running Texinfo on a region.)
+@c FIXME: web vs. Web
+
+@dircategory Network applications
+@direntry
+* awkinet: (gawkinet).          TCP/IP Internetworking With `gawk'.
+@end direntry
+
+@iftex
+@set DOCUMENT book
+@set CHAPTER chapter
+@set SECTION section
+@set DARKCORNER @inmargin{@image{lflashlight,1cm}, @image{rflashlight,1cm}}
+@end iftex
+@ifinfo
+@set DOCUMENT Info file
+@set CHAPTER major node
+@set SECTION node
+@set DARKCORNER (d.c.)
+@end ifinfo
+@ifhtml
+@set DOCUMENT web page
+@set CHAPTER chapter
+@set SECTION section
+@set DARKCORNER (d.c.)
+@end ifhtml
+
+@set FSF
+
+@set FN file name
+@set FFN File Name
+
+@c merge the function and variable indexes into the concept index
+@ifinfo
+@synindex fn cp
+@synindex vr cp
+@end ifinfo
+@iftex
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end iftex
+
+@c If "finalout" is commented out, the printed output will show
+@c black boxes that mark lines that are too long.  Thus, it is
+@c unwise to comment it out when running a master in case there are
+@c overfulls which are deemed okay.
+
+@iftex
+@finalout
+@end iftex
+
+@smallbook
+
+@c Special files are described in chapter 6 Printing Output under
+@c 6.7 Special File Names in gawk. I think the networking does not
+@c fit into that chapter, thus this separate document. At over 50
+@c pages, I think this is the right decision.  ADR.
+
+@set TITLE TCP/IP Internetworking with @command{gawk}
+@set EDITION 1.5
+@set UPDATE-MONTH March, 2019
+@c gawk versions:
+@set VERSION 5.0
+@set PATCHLEVEL 0
+
+@copying
+This is Edition @value{EDITION} of @cite{@value{TITLE}},
+for the @value{VERSION}.@value{PATCHLEVEL} (or later) version of the GNU
+implementation of AWK.
+@sp 2
+Copyright (C) 2000, 2001, 2002, 2004, 2009, 2010, 2016, 2019
+Free Software Foundation, Inc.
+@sp 2
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``GNU General Public License'', the Front-Cover
+texts being (a) (see below), and with the Back-Cover Texts being (b)
+(see below).  A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+
+@enumerate a
+@item
+``A GNU Manual''
+
+@item
+``You have the freedom to
+copy and modify this GNU manual.  Buying copies from the FSF
+supports it in developing GNU and promoting software freedom.''
+@end enumerate
+@end copying
+
+@ifinfo
+This file documents the networking features in GNU @command{awk}.
+
+@insertcopying
+@end ifinfo
+
+@setchapternewpage odd
+
+@titlepage
+@title @value{TITLE}
+@subtitle Edition @value{EDITION}
+@subtitle @value{UPDATE-MONTH}
+@author J@"urgen Kahrs
+@author with Arnold D. Robbins
+
+@c Include the Distribution inside the titlepage environment so
+@c that headings are turned off.  Headings on and off do not work.
+
+@page
+@vskip 0pt plus 1filll
+@sp 2
+Published by:
+@sp 1
+
+Free Software Foundation @*
+51 Franklin Street, Fifth Floor @*
+Boston, MA 02110-1301 USA @*
+Phone: +1-617-542-5942 @*
+Fax: +1-617-542-2652 @*
+Email: @email{gnu@@gnu.org} @*
+URL: @uref{http://www.gnu.org/} @*
+
+ISBN 1-882114-93-0 @*
+
+@insertcopying
+
+@c @sp 2
+@c Cover art by ?????.
+@end titlepage
+
+@iftex
+@headings off
+@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @|
+@oddheading  @| @| @strong{@thischapter}@ @ @ @thispage
+@end iftex
+
+@ifnottex
+@node Top, Preface, (dir), (dir)
+@top General Introduction
+@comment node-name, next,          previous, up
+
+This file documents the networking features in GNU Awk (@command{gawk})
+version 4.0 and later.
+
+@insertcopying
+@end ifnottex
+
+@menu
+* Preface::                          About this document.
+* Introduction::                     About networking.
+* Using Networking::                 Some examples.
+* Some Applications and Techniques:: More extended examples.
+* Links::                            Where to find the stuff mentioned in this
+                                     document.
+* GNU Free Documentation License::   The license for this document.
+* Index::                            The index.
+
+@detailmenu
+* Stream Communications::          Sending data streams.
+* Datagram Communications::        Sending self-contained messages.
+* The TCP/IP Protocols::           How these models work in the Internet.
+* Basic Protocols::                The basic protocols.
+* Ports::                          The idea behind ports.
+* Making Connections::             Making TCP/IP connections.
+* Gawk Special Files::             How to do @command{gawk} networking.
+* Special File Fields::            The fields in the special file name.
+* Comparing Protocols::            Differences between the protocols.
+* File /inet/tcp::                 The TCP special file.
+* File /inet/udp::                 The UDP special file.
+* TCP Connecting::                 Making a TCP connection.
+* Troubleshooting::                Troubleshooting TCP/IP connections.
+* Interacting::                    Interacting with a service.
+* Setting Up::                     Setting up a service.
+* Email::                          Reading email.
+* Web page::                       Reading a Web page.
+* Primitive Service::              A primitive Web service.
+* Interacting Service::            A Web service with interaction.
+* CGI Lib::                        A simple CGI library.
+* Simple Server::                  A simple Web server.
+* Caveats::                        Network programming caveats.
+* Challenges::                     Where to go from here.
+* PANIC::                          An Emergency Web Server.
+* GETURL::                         Retrieving Web Pages.
+* REMCONF::                        Remote Configuration Of Embedded Systems.
+* URLCHK::                         Look For Changed Web Pages.
+* WEBGRAB::                        Extract Links From A Page.
+* STATIST::                        Graphing A Statistical Distribution.
+* MAZE::                           Walking Through A Maze In Virtual Reality.
+* MOBAGWHO::                       A Simple Mobile Agent.
+* STOXPRED::                       Stock Market Prediction As A Service.
+* PROTBASE::                       Searching Through A Protein Database.
+@end detailmenu
+@end menu
+
+@contents
+
+@node Preface, Introduction, Top, Top
+@unnumbered Preface
+
+In May of 1997, J@"urgen Kahrs felt the need for network access
+from @command{awk}, and, with a little help from me, set about adding
+features to do this for @command{gawk}.  At that time, he
+wrote the bulk of this @value{DOCUMENT}.
+
+The code and documentation were added to the @command{gawk} 3.1 development
+tree, and languished somewhat until I could finally get
+down to some serious work on that version of @command{gawk}.
+This finally happened in the middle of 2000.
+
+Meantime, J@"urgen wrote an article about the Internet special
+files and @samp{|&} operator for @cite{Linux Journal}, and made a
+networking patch for the production versions of @command{gawk}
+available from his home page.
+In August of 2000 (for @command{gawk} 3.0.6), this patch
+also made it to the main GNU @command{ftp} distribution site.
+
+For release with @command{gawk}, I edited J@"urgen's prose
+for English grammar and style, as he is not a native English
+speaker.  I also
+rearranged the material somewhat for what I felt was a better order of
+presentation, and (re)wrote some of the introductory material.
+
+The majority of this document and the code are his work, and the
+high quality and interesting ideas speak for themselves.  It is my
+hope that these features will be of significant value to the @command{awk}
+community.
+
+@sp 1
+@noindent
+Arnold Robbins @*
+Nof Ayalon, ISRAEL @*
+March, 2001
+
+@node Introduction, Using Networking, Preface, Top
+@chapter Networking Concepts
+
+This @value{CHAPTER} provides a (necessarily) brief introduction to
+computer networking concepts.  For many applications of @command{gawk}
+to TCP/IP networking, we hope that this is enough.  For more
+advanced tasks, you will need deeper background, and it may be necessary
+to switch to lower-level programming in C or C++.
+
+There are two real-life models for the way computers send messages
+to each other over a network.  While the analogies are not perfect,
+they are close enough to convey the major concepts.
+These two models are the phone system (reliable byte-stream communications),
+and the postal system (best-effort datagrams).
+
+@menu
+* Stream Communications::       Sending data streams.
+* Datagram Communications::     Sending self-contained messages.
+* The TCP/IP Protocols::        How these models work in the Internet.
+* Making Connections::          Making TCP/IP connections.
+@end menu
+
+@node Stream Communications, Datagram Communications, Introduction, Introduction
+@section Reliable Byte-streams (Phone Calls)
+
+When you make a phone call, the following steps occur:
+
+@enumerate
+@item
+You dial a number.
+
+@item
+The phone system connects to the called party, telling
+them there is an incoming call. (Their phone rings.)
+
+@item
+The other party answers the call, or, in the case of a
+computer network, refuses to answer the call.
+
+@item
+Assuming the other party answers, the connection between
+you is now a @dfn{duplex} (two-way), @dfn{reliable} (no data lost),
+sequenced (data comes out in the order sent) data stream.
+
+@item
+You and your friend may now talk freely, with the phone system
+moving the data (your voices) from one end to the other.
+From your point of view, you have a direct end-to-end
+connection with the person on the other end.
+@end enumerate
+
+The same steps occur in a duplex reliable computer networking connection.
+There is considerably more overhead in setting up the communications,
+but once it's done, data moves in both directions, reliably, in sequence.
+
+@node Datagram Communications, The TCP/IP Protocols, Stream Communications, Introduction
+@section Best-effort Datagrams (Mailed Letters)
+
+Suppose you mail three different documents to your office on the
+other side of the country on two different days.  Doing so
+entails the following.
+
+@enumerate
+@item
+Each document travels in its own envelope.
+
+@item
+Each envelope contains both the sender and the
+recipient address.
+
+@item
+Each envelope may travel a different route to its destination.
+
+@item
+The envelopes may arrive in a different order from the one
+in which they were sent.
+
+@item
+One or more may get lost in the mail.
+(Although, fortunately, this does not occur very often.)
+
+@item
+In a computer network, one or more @dfn{packets}
+may also arrive multiple times.  (This doesn't happen
+with the postal system!)
+
+@end enumerate
+
+The important characteristics of datagram communications, like
+those of the postal system are thus:
+
+@itemize @bullet
+@item
+Delivery is ``best effort;'' the data may never get there.
+
+@item
+Each message is self-contained, including the source and
+destination addresses.
+
+@item
+Delivery is @emph{not} sequenced; packets may arrive out
+of order, and/or multiple times.
+
+@item
+Unlike the phone system, overhead is considerably lower.
+It is not necessary to set up the call first.
+@end itemize
+
+The price the user pays for the lower overhead of datagram communications
+is exactly the lower reliability; it is often necessary for user-level
+protocols that use datagram communications to add their own reliability
+features on top of the basic communications.
+
+@node The TCP/IP Protocols, Making Connections, Datagram Communications, Introduction
+@section The Internet Protocols
+
+The Internet Protocol Suite (usually referred to as just TCP/IP)@footnote{It
+should be noted that although the Internet seems to have conquered the
+world, there are other networking protocol suites in existence and in use.}
+consists of a number of different protocols at different levels or ``layers.''
+For our purposes, three protocols provide the fundamental communications
+mechanisms.  All other defined protocols are referred to as user-level
+protocols (e.g., HTTP, used later in this @value{DOCUMENT}).
+
+@menu
+* Basic Protocols::             The basic protocols.
+* Ports::                       The idea behind ports.
+@end menu
+
+@node Basic Protocols, Ports, The TCP/IP Protocols, The TCP/IP Protocols
+@subsection The Basic Internet Protocols
+
+@table @asis
+@item IP
+The Internet Protocol.  This protocol is almost never used directly by
+applications.  It provides the basic packet delivery and routing infrastructure
+of the Internet.  Much like the phone company's switching centers or the Post
+Office's trucks, it is not of much day-to-day interest to the regular user
+(or programmer).
+It happens to be a best effort datagram protocol.
+In the early twenty-first century, there are two versions of this protocol
+in use:
+
+@table @asis
+@item IPv4
+The original version of the Internet Protocol, with 32-bit addresses, on which
+most of the current Internet is based.
+
+@item IPv6
+The ``next generation'' of the Internet Protocol, with 128-bit addresses.
+This protocol is in wide use in certain parts of the world, but has not
+yet replaced IPv4.@footnote{There isn't an IPv5.}
+@end table
+
+Versions of the other protocols that sit ``atop'' IP exist for both
+IPv4 and IPv6. However, as the IPv6 versions are fundamentally the same
+as the original IPv4 versions, we will not distinguish further between them.
+
+@item UDP
+The User Datagram Protocol.  This is a best effort datagram protocol.
+It provides a small amount of extra reliability over IP, and adds
+the notion of @dfn{ports}, described in @ref{Ports, ,TCP and UDP Ports}.
+
+@item TCP
+The Transmission Control Protocol.  This is a duplex, reliable, sequenced
+byte-stream protocol, again layered on top of IP, and also providing the
+notion of ports.  This is the protocol that you will most likely use
+when using @command{gawk} for network programming.
+@end table
+
+All other user-level protocols use either TCP or UDP to do their basic
+communications.  Examples are SMTP (Simple Mail Transfer Protocol),
+FTP (File Transfer Protocol), and HTTP (HyperText Transfer Protocol).
+@cindex SMTP (Simple Mail Transfer Protocol)
+@cindex FTP (File Transfer Protocol)
+@cindex HTTP (Hypertext Transfer Protocol)
+
+@node Ports, , Basic Protocols, The TCP/IP Protocols
+@subsection TCP and UDP Ports
+
+In the postal system, the address on an envelope indicates a physical
+location, such as a residence or office building.  But there may be
+more than one person at the location; thus you have to further quantify
+the recipient by putting a person or company name on the envelope.
+
+In the phone system, one phone number may represent an entire company,
+in which case you need a person's extension number in order to
+reach that individual directly.  Or, when you call a home, you have to
+say, ``May I please speak to ...'' before talking to the person directly.
+
+IP networking provides the concept of addressing.  An IP address represents
+a particular computer, but no more.  In order to reach the mail service
+on a system, or the FTP or WWW service on a system, you must have some
+way to further specify which service you want.  In the Internet Protocol suite,
+this is done with @dfn{port numbers}, which represent the services, much
+like an extension number used with a phone number.
+
+Port numbers are 16-bit integers.  Unix and Unix-like systems reserve ports
+below 1024 for ``well known'' services, such as SMTP, FTP, and HTTP.
+Numbers 1024 and above may be used by any application, although there is no
+promise made that a particular port number is always available.
+
+@node Making Connections, , The TCP/IP Protocols, Introduction
+@section Making TCP/IP Connections (And Some Terminology)
+
+Two terms come up repeatedly when discussing networking:
+@dfn{client} and @dfn{server}.  For now, we'll discuss these terms
+at the @dfn{connection level}, when first establishing connections
+between two processes on different systems over a network.
+(Once the connection is established, the higher level, or
+@dfn{application level} protocols,
+such as HTTP or FTP, determine who is the client and who is the
+server.  Often, it turns out that the client and server are the
+same in both roles.)
+
+@cindex servers
+The @dfn{server} is the system providing the service, such as the
+web server or email server.  It is the @dfn{host} (system) which
+is @emph{connected to} in a transaction.
+For this to work though, the server must be expecting connections.
+Much as there has to be someone at the office building to answer
+the phone@footnote{In the days before voice mail systems!}, the
+server process (usually) has to be started first and be waiting
+for a connection.
+
+@cindex clients
+The @dfn{client} is the system requesting the service.
+It is the system @emph{initiating the connection} in a transaction.
+(Just as when you pick up the phone to call an office or store.)
+
+In the TCP/IP framework, each end of a connection is represented by a pair
+of (@var{address}, @var{port}) pairs.  For the duration of the connection,
+the ports in use at each end are unique, and cannot be used simultaneously
+by other processes on the same system.  (Only after closing a connection
+can a new one be built up on the same port. This is contrary to the usual
+behavior of fully developed web servers which have to avoid situations
+in which they are not reachable. We have to pay this price in order to
+enjoy the benefits of a simple communication paradigm in @command{gawk}.)
+
+@cindex blocking
+@cindex synchronous communications
+Furthermore, once the connection is established, communications are
+@dfn{synchronous}.@footnote{For the technically savvy, data reads
+block---if there's no incoming data, the program is made to wait until
+there is, instead of receiving a ``there's no data'' error return.} I.e.,
+each end waits on the other to finish transmitting, before replying. This
+is much like two people in a phone conversation.  While both could talk
+simultaneously, doing so usually doesn't work too well.
+
+In the case of TCP, the synchronicity is enforced by the protocol when
+sending data.  Data writes @dfn{block} until the data have been received on the
+other end.  For both TCP and UDP, data reads block until there is incoming
+data waiting to be read.  This is summarized in the following table,
+where an ``X'' indicates that the given action blocks.
+
+@ifnottex
+@multitable {Protocol}  {Reads}  {Writes}
+@item TCP @tab X @tab X
+@item UDP @tab X @tab
+@end multitable
+@end ifnottex
+@tex
+\centerline{
+\vbox{\bigskip % space above the table (about 1 linespace)
+% Because we have vertical rules, we can't let TeX insert interline space
+% in its usual way.
+\offinterlineskip
+\halign{\hfil\strut# &\vrule #& \hfil#\hfil& \hfil#\hfil\cr
+Protocol&&\quad Reads\quad &Writes\cr
+\noalign{\hrule}
+\omit&height 2pt\cr
+\noalign{\hrule height0pt}% without this the rule does not extend; why?
+TCP&&X&X\cr
+UDP&&X&\cr
+}}}
+@end tex
+
+@node Using Networking, Some Applications and Techniques, Introduction, Top
+@comment node-name, next, previous, up
+@chapter Networking With @command{gawk}
+
+@c STARTOFRANGE netgawk
+@cindex networks, @command{gawk} and
+@c STARTOFRANGE gawknet
+@cindex @command{gawk}, networking
+The @command{awk} programming language was originally developed as a
+pattern-matching language for writing short programs to perform
+data manipulation tasks.
+@command{awk}'s strength is the manipulation of textual data
+that is stored in files.
+It was never meant to be used for networking purposes.
+To exploit its features in a
+networking context, it's necessary to use an access mode for network connections
+that resembles the access of files as closely as possible.
+
+@cindex Perl
+@cindex Python
+@cindex Tcl/Tk
+@command{awk} is also meant to be a prototyping language. It is used
+to demonstrate feasibility and to play with features and user interfaces.
+This can be done with file-like handling of network
+connections.
+@command{gawk} trades the lack
+of many of the advanced features of the TCP/IP family of protocols
+for the convenience of simple connection handling.
+The advanced
+features are available when programming in C or Perl. In fact, the
+network programming
+in this @value{CHAPTER}
+is very similar to what is described in books such as
+@cite{Internet Programming with Python},
+@cite{Advanced Perl Programming},
+or
+@cite{Web Client Programming with Perl}.
+
+@cindex Perl, @command{gawk} networking and
+@cindex Python, @command{gawk} networking and
+@cindex Tcl/Tk, @command{gawk} and
+However, you can do the programming here without first having to learn object-oriented
+ideology; underlying languages such as Tcl/Tk, Perl, Python; or all of
+the libraries necessary to extend these languages before they are ready for the Internet.
+
+@cindex Transmission Control Protocol, See TCP
+@cindex TCP (Transmission Control Protocol)
+This @value{CHAPTER} demonstrates how to use the TCP protocol. The
+UDP protocol is much less important for most users.
+
+@menu
+* Gawk Special Files::          How to do @command{gawk} networking.
+* TCP Connecting::              Making a TCP connection.
+* Troubleshooting::             Troubleshooting TCP/IP connections.
+* Interacting::                 Interacting with a service.
+* Setting Up::                  Setting up a service.
+* Email::                       Reading email.
+* Web page::                    Reading a Web page.
+* Primitive Service::           A primitive Web service.
+* Interacting Service::         A Web service with interaction.
+* Simple Server::               A simple Web server.
+* Caveats::                     Network programming caveats.
+* Challenges::                  Where to go from here.
+@end menu
+
+@node Gawk Special Files, TCP Connecting, Using Networking, Using Networking
+@comment node-name,      next,  previous, up
+@section @command{gawk}'s Networking Mechanisms
+
+The @samp{|&} operator for use in
+communicating with a @dfn{coprocess} is described in
+@ref{Two-way I/O, ,Two-way Communications With Another Process, gawk, GAWK: Effective AWK Programming}.
+It shows how to do two-way I/O to a
+separate process, sending it data with @code{print} or @code{printf} and
+reading data with @code{getline}.  If you haven't read it already, you should
+detour there to do so.
+
+@command{gawk} transparently extends the two-way I/O mechanism to simple networking through
+the use of special @value{FN}s.  When a ``coprocess'' that matches
+the special files we are about to describe
+is started, @command{gawk} creates the appropriate network
+connection, and then two-way I/O proceeds as usual.
+
+@c last comma is part of see-also
+@cindex input/output, two-way, See Also @command{gawk}@comma{} networking
+@cindex TCP/IP, sockets and
+At the C, C++, and Perl level, networking is accomplished
+via @dfn{sockets}, an Application Programming Interface (API) originally
+developed at the University of California at Berkeley that is now used
+almost universally for TCP/IP networking.
+Socket level programming, while fairly straightforward, requires paying
+attention to a number of details, as well as using binary data.  It is not
+well-suited for use from a high-level language like @command{awk}.
+The special files provided in @command{gawk} hide the details from
+the programmer, making things much simpler and easier to use.
+@c Who sez we can't toot our own horn occasionally?
+
+@c STARTOFRANGE filenet
+@cindex filenames, for network access
+@c STARTOFRANGE gawnetf
+@cindex @command{gawk}, networking, filenames
+@c STARTOFRANGE netgawf
+@cindex networks, @command{gawk} and, filenames
+The special @value{FN} for network access is made up of several fields, all
+of which are mandatory:
+
+@example
+/@var{net-type}/@var{protocol}/@var{localport}/@var{hostname}/@var{remoteport}
+@end example
+
+@cindex @code{/inet/} files (@command{gawk})
+@cindex files, @code{/inet/} (@command{gawk})
+@cindex localport field
+@cindex remoteport field
+The @var{net-type} field lets you specify IPv4 versus IPv6, or lets
+you allow the system to choose.
+
+@menu
+* Special File Fields::         The fields in the special file name.
+* Comparing Protocols::         Differences between the protocols.
+@end menu
+
+@node Special File Fields, Comparing Protocols, Gawk Special Files, Gawk Special Files
+@subsection The Fields of the Special @value{FFN}
+This @value{SECTION} explains the meaning of all the other fields,
+as well as the range of values and the defaults.
+All of the fields are mandatory.  To let the system pick a value,
+or if the field doesn't apply to the protocol, specify it as @samp{0}:
+
+@table @var
+@cindex network type field
+@c last comma is part of secondary
+@cindex TCP/IP, network type, selecting
+@item net-type
+This is one of @samp{inet4} for IPv4, @samp{inet6} for IPv6,
+or @samp{inet} to use the system default (which is likely to be IPv4).
+For the rest of this document, we will use the generic @samp{/inet}
+in our descriptions of how @command{gawk}'s networking works.
+
+@cindex protocol field
+@c last comma is part of secondary
+@cindex TCP/IP, protocols, selecting
+@item protocol
+Determines which member of the TCP/IP
+family of protocols is selected to transport the data across the
+network. There are two possible values (always written in lowercase):
+@samp{tcp} and @samp{udp}. The exact meaning of each is
+explained later in this @value{SECTION}.
+
+@item localport
+@cindex networks, ports, specifying
+Determines which port on the local
+machine is used to communicate across the network.  Application-level clients
+usually use @samp{0} to indicate they do not care which local port is
+used---instead they specify a remote port to connect to. It is vital for
+application-level servers to use a number different from @samp{0} here
+because their service has to be available at a specific publicly known
+port number. It is possible to use a name from @file{/etc/services} here.
+
+@item hostname
+@cindex hostname field
+@cindex servers, as hosts
+Determines which remote host is to
+be at the other end of the connection. Application-level servers must fill
+this field with a @samp{0} to indicate their being open for all other hosts
+to connect to them and enforce connection level server behavior this way.
+It is not possible for an application-level server to restrict its
+availability to one remote host by entering a host name here.
+Application-level clients must enter a name different from @samp{0}.
+The name can be either symbolic
+(e.g., @samp{jpl-devvax.jpl.nasa.gov}) or numeric (e.g., @samp{128.149.1.143}).
+
+@item remoteport
+Determines which port on the remote
+machine is used to communicate across the network.
+For @file{/inet/tcp} and @file{/inet/udp},
+application-level clients @emph{must} use a number
+other than @samp{0} to indicate to which port on the remote machine
+they want to connect. Application-level servers must not fill this field with
+a @samp{0}. Instead they specify a local port to which clients connect.
+It is possible to use a name from @file{/etc/services} here.
+@end table
+
+@cindex networks, @command{gawk} and, connections
+@cindex @command{gawk}, networking, connections
+Experts in network programming will notice that the usual
+client/server asymmetry found at the level of the socket API is not visible
+here. This is for the sake of simplicity of the high-level concept. If this
+asymmetry is necessary for your application,
+use another language.
+For @command{gawk}, it is
+more important to enable users to write a client program with a minimum
+of code. What happens when first accessing a network connection is seen
+in the following pseudocode:
+
+@smallexample
+if ((name of remote host given) && (other side accepts connection)) @{
+  rendez-vous successful; transmit with getline or print
+@} else @{
+  if ((other side did not accept) && (localport == 0))
+    exit unsuccessful
+  if (TCP) @{
+    set up a server accepting connections
+    this means waiting for the client on the other side to connect
+  @} else
+    ready
+@}
+@end smallexample
+
+The exact behavior of this algorithm depends on the values of the
+fields of the special @value{FN}. When in doubt, @ref{table-inet-components}
+gives you the combinations of values and their meaning. If this
+table is too complicated, focus on the three lines printed in
+@strong{bold}. All the examples in
+@ref{Using Networking, ,Networking With @command{gawk}},
+use only the
+patterns printed in bold letters.
+
+@float Table,table-inet-components
+@caption{@code{/inet} Special File Components}
+@multitable @columnfractions .15 .15 .15 .15 .40
+@headitem @sc{protocol} @tab @sc{local port} @tab @sc{host name}
+@tab @sc{remote port} @tab @sc{Resulting connection-level behavior}
+@item @strong{tcp} @tab @strong{0} @tab @strong{x} @tab @strong{x} @tab
+      @strong{Dedicated client, fails if immediately connecting to a
+              server on the other side fails}
+@item udp      @tab 0 @tab x @tab x @tab Dedicated client
+@item @strong{tcp, udp} @tab @strong{x} @tab @strong{x} @tab @strong{x} @tab
+      @strong{Client, switches to dedicated server if necessary}
+@item @strong{tcp, udp} @tab @strong{x} @tab @strong{0} @tab @strong{0} @tab
+      @strong{Dedicated server}
+@item tcp, udp @tab x @tab x @tab 0 @tab Invalid
+@item tcp, udp @tab 0 @tab 0 @tab x @tab Invalid
+@item tcp, udp @tab x @tab 0 @tab x @tab Invalid
+@item tcp, udp @tab 0 @tab 0 @tab 0 @tab Invalid
+@item tcp, udp @tab 0 @tab x @tab 0 @tab Invalid
+@end multitable
+@end float
+
+In general, TCP is the preferred mechanism to use.  It is the simplest
+protocol to understand and to use.  Use UDP only if circumstances
+demand low-overhead.
+
+@node Comparing Protocols, , Special File Fields, Gawk Special Files
+@subsection Comparing Protocols
+
+This @value{SECTION} develops a pair of programs (sender and receiver)
+that do nothing but send a timestamp from one machine to another. The
+sender and the receiver are implemented with each of the two protocols
+available and demonstrate the differences between them.
+
+@menu
+* File /inet/tcp::              The TCP special file.
+* File /inet/udp::              The UDP special file.
+@end menu
+
+@node File /inet/tcp, File /inet/udp, Comparing Protocols, Comparing Protocols
+@subsubsection @file{/inet/tcp}
+@cindex @code{/inet/tcp} special files (@command{gawk})
+@cindex files, @code{/inet/tcp} (@command{gawk})
+@cindex TCP (Transmission Control Protocol)
+Once again, always use TCP.
+(Use UDP when low overhead is a necessity, and use RAW for
+network experimentation.)
+The first example is the sender
+program:
+
+@example
+# Server
+BEGIN @{
+  print strftime() |& "/inet/tcp/8888/0/0"
+  close("/inet/tcp/8888/0/0")
+@}
+@end example
+
+The receiver is very simple:
+
+@example
+# Client
+BEGIN @{
+  "/inet/tcp/0/localhost/8888" |& getline
+  print $0
+  close("/inet/tcp/0/localhost/8888")
+@}
+@end example
+
+TCP guarantees that the bytes arrive at the receiving end in exactly
+the same order that they were sent. No byte is lost
+(except for broken connections), doubled, or out of order. Some
+overhead is necessary to accomplish this, but this is the price to pay for
+a reliable service.
+It does matter which side starts first. The sender/server has to be started
+first, and it waits for the receiver to read a line.
+
+@node File /inet/udp, , File /inet/tcp, Comparing Protocols
+@subsubsection @file{/inet/udp}
+@cindex @code{/inet/udp} special files (@command{gawk})
+@cindex files, @code{/inet/udp} (@command{gawk})
+@cindex UDP (User Datagram Protocol)
+@cindex User Datagram Protocol, See UDP
+The server and client programs that use UDP are almost identical to their TCP counterparts;
+only the @var{protocol} has changed. As before, it does matter which side
+starts first. The receiving side blocks and waits for the sender.
+In this case, the receiver/client has to be started first:
+
+@example
+# Server
+BEGIN @{
+  print strftime() |& "/inet/udp/8888/0/0"
+  close("/inet/udp/8888/0/0")
+@}
+@end example
+
+The receiver is almost identical to the TCP receiver:
+
+@example
+# Client
+BEGIN @{
+  print "hi!" |& "/inet/udp/0/localhost/8888"
+  "/inet/udp/0/localhost/8888" |& getline
+  print $0
+  close("/inet/udp/0/localhost/8888")
+@}
+@end example
+
+In the case of UDP, the initial @code{print} command is the one
+that actually sends data so that there is a connection.
+UDP and ``connection'' sounds strange to anyone
+who has learned that UDP is a connectionless protocol.
+Here, ``connection'' means that the @code{connect()} system call
+has completed its work and completed the ``association''
+between a certain socket and an IP address. Thus there are
+subtle differences between @code{connect()} for TCP and UDP;
+see the man page for details.@footnote{This subtlety
+is just one of many details that are hidden in the socket
+API, invisible and intractable for the @command{gawk} user.
+The developers are currently considering how to rework the
+network facilities to make them easier to understand and use.}
+
+UDP cannot guarantee that the datagrams at the receiving end will arrive in exactly
+the same order they were sent. Some datagrams could be
+lost, some doubled, and some out of order. But no overhead is necessary to
+accomplish this. This unreliable behavior is good enough for tasks
+such as data acquisition, logging, and even stateless services like
+the original versions of NFS.
+
+@node TCP Connecting, Troubleshooting, Gawk Special Files, Using Networking
+@section Establishing a TCP Connection
+
+@c STARTOFRANGE tcpcon
+@cindex TCP (Transmission Control Protocol), connection, establishing
+@c STARTOFRANGE netcon
+@cindex networks, @command{gawk} and, connections
+@c STARTOFRANGE gawcon
+@cindex @command{gawk}, networking, connections
+Let's observe a network connection at work. Type in the following program
+and watch the output. Within a second, it connects via TCP (@file{/inet/tcp})
+to the machine it is running on (@samp{localhost}) and asks the service
+@samp{daytime} on the machine what time it is:
+
+@cindex @code{getline} command
+@example
+BEGIN @{
+  "/inet/tcp/0/localhost/daytime" |& getline
+  print $0
+  close("/inet/tcp/0/localhost/daytime")
+@}
+@end example
+
+Even experienced @command{awk} users will find the second line strange in two
+respects:
+
+@itemize @bullet
+@item
+A special file is used as a shell command that pipes its output
+into @code{getline}. One would rather expect to see the special file
+being read like any other file (@samp{getline <
+"/inet/tcp/0/localhost/daytime")}.
+
+@item
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|&} operator (I/O)
+The operator @samp{|&} has not been part of any @command{awk}
+implementation (until now).
+It is actually the only extension of the @command{awk}
+language needed (apart from the special files) to introduce network access.
+@end itemize
+
+@cindex pipes, networking and
+The @samp{|&} operator was introduced in @command{gawk} 3.1 in order to
+overcome the crucial restriction that access to files and pipes in
+@command{awk} is always unidirectional. It was formerly impossible to use
+both access modes on the same file or pipe. Instead of changing the whole
+concept of file access, the @samp{|&} operator
+behaves exactly like the usual pipe operator except for two additions:
+
+@itemize @bullet
+@item
+Normal shell commands connected to their @command{gawk} program with a @samp{|&}
+pipe can be accessed bidirectionally. The @samp{|&} turns out to be a quite
+general, useful, and natural extension of @command{awk}.
+
+@item
+Pipes that consist of a special @value{FN} for network connections are not
+executed as shell commands. Instead, they can be read and written to, just
+like a full-duplex network connection.
+@end itemize
+
+In the earlier example, the @samp{|&} operator tells @code{getline}
+to read a line from the special file @file{/inet/tcp/0/localhost/daytime}.
+We could also have printed a line into the special file. But instead we just
+read a line with the time, printed it, and closed the connection.
+(While we could just let @command{gawk} close the connection by finishing
+the program, in this @value{DOCUMENT}
+we are pedantic and always explicitly close the connections.)
+
+@node Troubleshooting, Interacting, TCP Connecting, Using Networking
+@section Troubleshooting Connection Problems
+@cindex advanced features, network connections
+@c last comma is part of secondary
+@cindex troubleshooting, networks, connections
+It may well be that for some reason the program shown in the previous example does not run on your
+machine. When looking at possible reasons for this, you will learn much
+about typical problems that arise in network programming. First of all,
+your implementation of @command{gawk} may not support network access
+because it is
+a pre-3.1 version or you do not have a network interface in your machine.
+Perhaps your machine uses some other protocol, such as
+DECnet or Novell's IPX. For the rest of this @value{CHAPTER},
+we will assume
+you work on a Unix machine that supports TCP/IP. If the previous example program does
+not run on your machine, it may help to replace the name
+@samp{localhost} with the name of your machine or its IP address. If it
+does, you could replace @samp{localhost} with the name of another machine
+in your vicinity---this way, the program connects to another machine.
+Now you should see the date and time being printed by the program,
+otherwise your machine may not support the @samp{daytime} service.
+Try changing the service to @samp{chargen} or @samp{ftp}. This way, the program
+connects to other services that should give you some response. If you are
+curious, you should have a look at your @file{/etc/services} file. It could
+look like this:
+
+@smallexample
+# /etc/services:
+#
+# Network services, Internet style
+#
+# Name     Number/Protocol  Alternate name # Comments
+
+echo        7/tcp
+echo        7/udp
+discard     9/tcp         sink null
+discard     9/udp         sink null
+daytime     13/tcp
+daytime     13/udp
+chargen     19/tcp        ttytst source
+chargen     19/udp        ttytst source
+ftp         21/tcp
+telnet      23/tcp
+smtp        25/tcp        mail
+finger      79/tcp
+www         80/tcp        http      # WorldWideWeb HTTP
+www         80/udp        # HyperText Transfer Protocol
+pop-2       109/tcp       postoffice    # POP version 2
+pop-2       109/udp
+pop-3       110/tcp       # POP version 3
+pop-3       110/udp
+nntp        119/tcp       readnews untp  # USENET News
+irc         194/tcp       # Internet Relay Chat
+irc         194/udp
+@dots{}
+@end smallexample
+
+@cindex Linux
+@cindex GNU/Linux
+@cindex Microsoft Windows, networking
+Here, you find a list of services that traditional Unix machines usually
+support. If your GNU/Linux machine does not do so, it may be that these
+services are switched off in some startup script. Systems running some
+flavor of Microsoft Windows usually do @emph{not} support these services.
+Nevertheless, it @emph{is} possible to do networking with @command{gawk} on
+Microsoft
+Windows.@footnote{Microsoft preferred to ignore the TCP/IP
+family of protocols until 1995. Then came the rise of the Netscape browser
+as a landmark ``killer application.'' Microsoft added TCP/IP support and
+their own browser to Microsoft Windows 95 at the last minute. They even back-ported
+their TCP/IP implementation to Microsoft Windows for Workgroups 3.11, but it was
+a rather rudimentary and half-hearted implementation. Nevertheless,
+the equivalent of @file{/etc/services} resides under
+@file{C:\WINNT\system32\drivers\etc\services} on Microsoft Windows 2000
+and Microsoft Windows XP.}
+The first column of the file gives the name of the service, and
+the second column gives a unique number and the protocol that one can use to connect to
+this service.
+The rest of the line is treated as a comment.
+You see that some services (@samp{echo}) support TCP as
+well as UDP.
+
+@node Interacting, Setting Up, Troubleshooting, Using Networking
+@section Interacting with a Network Service
+
+The next program makes use of the possibility to really interact with a
+network service by printing something into the special file. It asks the
+so-called @command{finger} service if a user of the machine is logged in. When
+testing this program, try to change @samp{localhost} to
+some other machine name in your local network:
+
+@c system if test ! -d eg         ; then mkdir eg         ; fi
+@c system if test ! -d eg/network ; then mkdir eg/network ; fi
+@example
+@c file eg/network/fingerclient.awk
+BEGIN @{
+  NetService = "/inet/tcp/0/localhost/finger"
+  print "@var{name}" |& NetService
+  while ((NetService |& getline) > 0)
+    print $0
+  close(NetService)
+@}
+@c endfile
+@end example
+
+After telling the service on the machine which user to look for,
+the program repeatedly reads lines that come as a reply. When no more
+lines are coming (because the service has closed the connection), the
+program also closes the connection. Try replacing @code{"@var{name}"} with your
+login name (or the name of someone else logged in).  For a list
+of all users currently logged in, replace @var{name} with an empty string
+(@code{""}).
+
+@cindex Linux
+@cindex GNU/Linux
+The final @code{close()} command could be safely deleted from
+the above script, because the operating system closes any open connection
+by default when a script reaches the end of execution. In order to avoid
+portability problems, it is best to always close connections explicitly.
+With the Linux kernel,
+for example, proper closing results in flushing of buffers. Letting
+the close happen by default may result in discarding buffers.
+
+When looking at @file{/etc/services} you may have noticed that the
+@samp{daytime} service is also available with @samp{udp}. In the earlier
+example, change @samp{tcp} to @samp{udp},
+and change @samp{finger} to @samp{daytime}.
+After starting the modified program, you see the expected day and time message.
+The program then hangs, because it waits for more lines coming from the
+service. However, they never come. This behavior is a consequence of the
+differences between TCP and UDP. When using UDP, neither party is
+automatically informed about the other closing the connection.
+Continuing to experiment this way reveals many other subtle
+differences between TCP and UDP. To avoid such trouble, one should always
+remember the advice Douglas E.@: Comer and David Stevens give in
+Volume III of their series @cite{Internetworking With TCP}
+(page 14):
+
+@cindex TCP (Transmission Control Protocol), UDP and
+@cindex UDP (User Datagram Protocol), TCP and
+@cindex Internet, See networks
+@quotation
+When designing client-server applications, beginners are strongly
+advised to use TCP because it provides reliable, connection-oriented
+communication. Programs only use UDP if the application protocol handles
+reliability, the application requires hardware broadcast or multicast,
+or the application cannot tolerate virtual circuit overhead.
+@end quotation
+
+@node Setting Up, Email, Interacting, Using Networking
+@section Setting Up a Service
+@c last comma is part of tertiary
+@cindex networks, @command{gawk} and, service@comma{} establishing
+@c last comma is part of tertiary
+@cindex @command{gawk}, networking, service@comma{} establishing
+The preceding programs behaved as clients that connect to a server somewhere
+on the Internet and request a particular service. Now we set up such a
+service to mimic the behavior of the @samp{daytime} service.
+Such a server does not know in advance who is going to connect to it over
+the network. Therefore, we cannot insert a name for the host to connect to
+in our special @value{FN}.
+
+Start the following program in one window. Notice that the service does
+not have the name @samp{daytime}, but the number @samp{8888}.
+From looking at @file{/etc/services}, you know that names like @samp{daytime}
+are just mnemonics for predetermined 16-bit integers.
+Only the system administrator (@code{root}) could enter
+our new service into @file{/etc/services} with an appropriate name.
+Also notice that the service name has to be entered into a different field
+of the special @value{FN} because we are setting up a server, not a client:
+
+@cindex @command{finger} utility
+@cindex servers
+@example
+BEGIN @{
+  print strftime() |& "/inet/tcp/8888/0/0"
+  close("/inet/tcp/8888/0/0")
+@}
+@end example
+
+Now open another window on the same machine.
+Copy the client program given as the first example
+(@pxref{TCP Connecting, ,Establishing a TCP Connection})
+to a new file and edit it, changing the name @samp{daytime} to
+@samp{8888}.  Then start the modified client.  You should get a reply
+like this:
+
+@example
+Sat Sep 27 19:08:16 CEST 1997
+@end example
+
+@noindent
+Both programs explicitly close the connection.
+
+@c first comma is part of primary
+@cindex Microsoft Windows, networking, ports
+@cindex networks, ports, reserved
+@cindex Unix, network ports and
+Now we will intentionally make a mistake to see what happens when the name
+@samp{8888} (the so-called port) is already used by another service.
+Start the server
+program in both windows. The first one works, but the second one
+complains that it could not open the connection. Each port on a single
+machine can only be used by one server program at a time. Now terminate the
+server program and change the name @samp{8888} to @samp{echo}. After restarting it,
+the server program does not run any more, and you know why: there is already
+an @samp{echo} service running on your machine. But even if this isn't true,
+you would not get
+your own @samp{echo} server running on a Unix machine,
+because the ports with numbers smaller
+than 1024 (@samp{echo} is at port 7) are reserved for @code{root}.
+On machines running some flavor of Microsoft Windows, there is no restriction
+that reserves ports 1 to 1024 for a privileged user; hence, you can start
+an @samp{echo} server there.
+
+Turning this short server program into something really useful is simple.
+Imagine a server that first reads a @value{FN} from the client through the
+network connection, then does something with the file and
+sends a result back to the client. The server-side processing
+could be:
+
+@example
+BEGIN @{
+  NetService = "/inet/tcp/8888/0/0"
+  NetService |& getline
+  CatPipe    = ("cat " $1)    # sets $0 and the fields
+  while ((CatPipe | getline) > 0)
+    print $0 |& NetService
+  close(NetService)
+@}
+@end example
+
+@noindent
+and we would
+have a remote copying facility. Such a server reads the name of a file
+from any client that connects to it and transmits the contents of the
+named file across the net. The server-side processing could also be
+the execution of a command that is transmitted across the network. From this
+example, you can see how simple it is to open up a security hole on your
+machine. If you allow clients to connect to your machine and
+execute arbitrary commands, anyone would be free to do @samp{rm -rf *}.
+
+@node Email, Web page, Setting Up, Using Networking
+@section Reading Email
+@cindex RFC 1939
+@cindex RFC 821
+@cindex @command{gawk}, networking, See Also email
+@cindex networks, @command{gawk} and, See Also email
+@cindex POP (Post Office Protocol)
+@cindex SMTP (Simple Mail Transfer Protocol)
+@cindex Post Office Protocol (POP)
+@cindex Simple Mail Transfer Protocol (SMTP)
+The distribution of email is usually done by dedicated email servers that
+communicate with your machine using special protocols. To receive email, we
+will use the Post Office Protocol (POP).  Sending can be done with the much
+older Simple Mail Transfer Protocol (SMTP).
+
+@cindex email
+When you type in the following program, replace the @var{emailhost} by the
+name of your local email server. Ask your administrator if the server has a
+POP service, and then use its name or number in the program below.
+Now the program is ready to connect to your email server, but it will not
+succeed in retrieving your mail because it does not yet know your login
+name or password. Replace them in the program and it
+shows you the first email the server has in store:
+
+@example
+BEGIN @{
+  POPService  = "/inet/tcp/0/@var{emailhost}/pop3"
+  RS = ORS = "\r\n"
+  print "user @var{name}"            |& POPService
+  POPService                    |& getline
+  print "pass @var{password}"         |& POPService
+  POPService                    |& getline
+  print "retr 1"                |& POPService
+  POPService                    |& getline
+  if ($1 != "+OK") exit
+  print "quit"                  |& POPService
+  RS = "\r\n\\.\r\n"
+  POPService |& getline
+  print $0
+  close(POPService)
+@}
+@end example
+
+@cindex RFC 1939
+@cindex record separators, POP and
+@cindex @code{RS} variable, POP and
+@cindex @code{ORS} variable, POP and
+@cindex POP (Post Office Protocol)
+The record separators @code{RS} and @code{ORS} are redefined because the
+protocol (POP) requires CR-LF to separate lines. After identifying
+yourself to the email service, the command @samp{retr 1} instructs the
+service to send the first of all your email messages in line. If the service
+replies with something other than @samp{+OK}, the program exits; maybe there
+is no email. Otherwise, the program first announces that it intends to finish
+reading email, and then redefines @code{RS} in order to read the entire
+email as multiline input in one record. From the POP RFC, we know that the body
+of the email always ends with a single line containing a single dot.
+The program looks for this using @samp{RS = "\r\n\\.\r\n"}.
+When it finds this sequence in the mail message, it quits.
+You can invoke this program as often as you like; it does not delete the
+message it reads, but instead leaves it on the server.
+
+@node Web page, Primitive Service, Email, Using Networking
+@section Reading a Web Page
+@cindex web pages
+@cindex HTTP (Hypertext Transfer Protocol)
+@cindex Hypertext Transfer Protocol, See HTTP
+@cindex RFC 2068
+@cindex RFC 2616
+
+Retrieving a web page from a web server is as simple as
+retrieving email from an email server. We only have to use a
+similar, but not identical, protocol and a different port. The name of the
+protocol is HyperText Transfer Protocol (HTTP) and the port number is usually
+80.  As in the preceding @value{SECTION}, ask your administrator about the
+name of your local web server or proxy web server and its port number
+for HTTP requests.
+
+The following program employs a rather crude approach toward retrieving a
+web page. It uses the prehistoric syntax of HTTP 0.9, which almost all
+web servers still support. The most noticeable thing about it is that the
+program directs the request to the local proxy server whose name you insert
+in the special @value{FN} (which in turn calls @samp{www.yahoo.com}):
+
+@example
+BEGIN @{
+  RS = ORS = "\r\n"
+  HttpService = "/inet/tcp/0/@var{proxy}/80"
+  print "GET http://www.yahoo.com"     |& HttpService
+  while ((HttpService |& getline) > 0)
+     print $0
+  close(HttpService)
+@}
+@end example
+
+@cindex RFC 1945
+@cindex record separators, HTTP and
+@cindex @code{RS} variable, HTTP and
+@cindex @code{ORS} variable, HTTP and
+@cindex HTTP (Hypertext Transfer Protocol), record separators and
+@cindex HTML (Hypertext Markup Language)
+@cindex Hypertext Markup Language (HTML)
+Again, lines are separated by a redefined @code{RS} and @code{ORS}.
+The @code{GET} request that we send to the server is the only kind of
+HTTP request that existed when the web was created in the early 1990s.
+HTTP calls this @code{GET} request a ``method,'' which tells the
+service to transmit a web page (here the home page of the Yahoo! search
+engine). Version 1.0 added the request methods @code{HEAD} and
+@code{POST}. The current version of HTTP is 1.1,@footnote{Version 1.0 of
+HTTP was defined in RFC 1945.  HTTP 1.1 was initially specified in RFC
+2068. In June 1999, RFC 2068 was made obsolete by RFC 2616, an update
+without any substantial changes.} and knows the additional request
+methods @code{OPTIONS}, @code{PUT}, @code{DELETE}, and @code{TRACE}.
+You can fill in any valid web address, and the program prints the
+HTML code of that page to your screen.
+
+Notice the similarity between the responses of the POP and HTTP
+services. First, you get a header that is terminated by an empty line, and
+then you get the body of the page in HTML.  The lines of the headers also
+have the same form as in POP. There is the name of a parameter,
+then a colon, and finally the value of that parameter.
+
+@cindex CGI (Common Gateway Interface), dynamic web pages and
+@cindex Common Gateway Interface, See CGI
+@cindex GIF image format
+@cindex PNG image format
+@cindex images, retrieving over networks
+Images (@file{.png} or @file{.gif} files) can also be retrieved this way,
+but then you
+get binary data that should be redirected into a file. Another
+application is calling a CGI (Common Gateway Interface) script on some
+server. CGI scripts are used when the contents of a web page are not
+constant, but generated instantly at the moment you send a request
+for the page. For example, to get a detailed report about the current
+quotes of Motorola stock shares, call a CGI script at Yahoo! with
+the following:
+
+@example
+get = "GET http://quote.yahoo.com/q?s=MOT&d=t"
+print get |& HttpService
+@end example
+
+You can also request weather reports this way.
+
+@node Primitive Service, Interacting Service, Web page, Using Networking
+@section A Primitive Web Service
+@c STARTOFRANGE webser
+@cindex web service
+Now we know enough about HTTP to set up a primitive web service that just
+says @code{"Hello, world"} when someone connects to it with a browser.
+Compared
+to the situation in the preceding @value{SECTION}, our program changes the role. It
+tries to behave just like the server we have observed. Since we are setting
+up a server here, we have to insert the port number in the @samp{localport}
+field of the special @value{FN}. The other two fields (@var{hostname} and
+@var{remoteport}) have to contain a @samp{0} because we do not know in
+advance which host will connect to our service.
+
+In the early 1990s, all a server had to do was send an HTML document and
+close the connection. Here, we adhere to the modern syntax of HTTP.
+The steps are as follows:
+
+@enumerate 1
+@item
+Send a status line telling the web browser that everything
+is okay.
+
+@item
+Send a line to tell the browser how many bytes follow in the
+body of the message. This was not necessary earlier because both
+parties knew that the document ended when the connection closed. Nowadays
+it is possible to stay connected after the transmission of one web page.
+This is to avoid the network traffic necessary for repeatedly establishing
+TCP connections for requesting several images. Thus, there is the need to tell
+the receiving party how many bytes will be sent. The header is terminated
+as usual with an empty line.
+
+@item
+Send the @code{"Hello, world"} body
+in HTML.
+The useless @code{while} loop swallows the request of the browser.
+We could actually omit the loop, and on most machines the program would still
+work.
+First, start the following program:
+@end enumerate
+
+@example
+@c file eg/network/hello-serv.awk
+BEGIN @{
+  RS = ORS = "\r\n"
+  HttpService = "/inet/tcp/8080/0/0"
+  Hello = "<HTML><HEAD>" \
+          "<TITLE>A Famous Greeting</TITLE></HEAD>" \
+          "<BODY><H1>Hello, world</H1></BODY></HTML>"
+  Len = length(Hello) + length(ORS)
+  print "HTTP/1.0 200 OK"          |& HttpService
+  print "Content-Length: " Len ORS |& HttpService
+  print Hello                      |& HttpService
+  while ((HttpService |& getline) > 0)
+     continue;
+  close(HttpService)
+@}
+@c endfile
+@end example
+
+Now, on the same machine, start your favorite browser and let it point to
+@uref{http://localhost:8080} (the browser needs to know on which port
+our server is listening for requests). If this does not work, the browser
+probably tries to connect to a proxy server that does not know your machine.
+If so, change the browser's configuration so that the browser does not try to
+use a proxy to connect to your machine.
+
+@node Interacting Service, Simple Server, Primitive Service, Using Networking
+@section A Web Service with Interaction
+@cindex @command{gawk}, web and, See web service
+@cindex web browsers, See web service
+@c comma is part of primary
+@cindex HTTP server, core logic
+@cindex servers, HTTP
+@ifinfo
+This node shows how to set up a simple web server.
+The subnode is a library file that we will use with all the examples in
+@ref{Some Applications and Techniques}.
+@end ifinfo
+
+@menu
+* CGI Lib::                     A simple CGI library.
+@end menu
+
+Setting up a web service that allows user interaction is more difficult and
+shows us the limits of network access in @command{gawk}. In this @value{SECTION},
+we develop  a main program (a @code{BEGIN} pattern and its action)
+that will become the core of event-driven execution controlled by a
+graphical user interface (GUI).
+Each HTTP event that the user triggers by some action within the browser
+is received in this central procedure. Parameters and menu choices are
+extracted from this request, and an appropriate measure is taken according to
+the user's choice.
+For example:
+
+@cindex HTTP server, core logic
+@example
+BEGIN @{
+  if (MyHost == "") @{
+     "uname -n" | getline MyHost
+     close("uname -n")
+  @}
+  if (MyPort ==  0) MyPort = 8080
+  HttpService = "/inet/tcp/" MyPort "/0/0"
+  MyPrefix    = "http://" MyHost ":" MyPort
+  SetUpServer()
+  while ("awk" != "complex") @{
+    # header lines are terminated this way
+    RS = ORS = "\r\n"
+    Status   = 200          # this means OK
+    Reason   = "OK"
+    Header   = TopHeader
+    Document = TopDoc
+    Footer   = TopFooter
+    if        (GETARG["Method"] == "GET") @{
+        HandleGET()
+    @} else if (GETARG["Method"] == "HEAD") @{
+        # not yet implemented
+    @} else if (GETARG["Method"] != "") @{
+        print "bad method", GETARG["Method"]
+    @}
+    Prompt = Header Document Footer
+    print "HTTP/1.0", Status, Reason       |& HttpService
+    print "Connection: Close"              |& HttpService
+    print "Pragma: no-cache"               |& HttpService
+    len = length(Prompt) + length(ORS)
+    print "Content-length:", len           |& HttpService
+    print ORS Prompt                       |& HttpService
+    # ignore all the header lines
+    while ((HttpService |& getline) > 0)
+        ;
+    # stop talking to this client
+    close(HttpService)
+    # wait for new client request
+    HttpService |& getline
+    # do some logging
+    print systime(), strftime(), $0
+    # read request parameters
+    CGI_setup($1, $2, $3)
+  @}
+@}
+@end example
+
+This web server presents menu choices in the form of HTML links.
+Therefore, it has to tell the browser the name of the host it is
+residing on. When starting the server, the user may supply the name
+of the host from the command line with @samp{gawk -v MyHost="Rumpelstilzchen"}.
+If the user does not do this, the server looks up the name of the host it is
+running on for later use as a web address in HTML documents. The same
+applies to the port number. These values are inserted later into the
+HTML content of the web pages to refer to the home system.
+
+Each server that is built around this core has to initialize some
+application-dependent variables (such as the default home page) in a procedure
+@code{SetUpServer()}, which is called immediately before entering the
+infinite loop of the server. For now, we will write an instance that
+initiates a trivial interaction.  With this home page, the client user
+can click on two possible choices, and receive the current date either
+in human-readable format or in seconds since 1970:
+
+@example
+function SetUpServer() @{
+  TopHeader = "<HTML><HEAD>"
+  TopHeader = TopHeader \
+     "<title>My name is GAWK, GNU AWK</title></HEAD>"
+  TopDoc    = "<BODY><h2>\
+    Do you prefer your date <A HREF=" MyPrefix \
+    "/human>human</A> or \
+    <A HREF=" MyPrefix "/POSIX>POSIXed</A>?</h2>" ORS ORS
+  TopFooter = "</BODY></HTML>"
+@}
+@end example
+
+On the first run through the main loop, the default line terminators are
+set and the default home page is copied to the actual home page. Since this
+is the first run, @code{GETARG["Method"]} is not initialized yet, hence the
+case selection over the method does nothing. Now that the home page is
+initialized, the server can start communicating to a client browser.
+
+@cindex RFC 2068
+It does so by printing the HTTP header into the network connection
+(@samp{print @dots{} |& HttpService}). This command blocks execution of
+the server script until a client connects. If this server
+script is compared with the primitive one we wrote before, you will notice
+two additional lines in the header. The first instructs the browser
+to close the connection after each request. The second tells the
+browser that it should never try to @emph{remember} earlier requests
+that had identical web addresses (no caching). Otherwise, it could happen
+that the browser retrieves the time of day in the previous example just once,
+and later it takes the web page from the cache, always displaying the same
+time of day although time advances each second.
+
+Having supplied the initial home page to the browser with a valid document
+stored in the parameter @code{Prompt}, it closes the connection and waits
+for the next request.  When the request comes, a log line is printed that
+allows us to see which request the server receives. The final step in the
+loop is to call the function @code{CGI_setup()}, which reads all the lines
+of the request (coming from the browser), processes them, and stores the
+transmitted parameters in the array @code{PARAM}. The complete
+text of these application-independent functions can be found in
+@ref{CGI Lib, ,A Simple CGI Library}.
+For now, we use a simplified version of @code{CGI_setup()}:
+
+@example
+function CGI_setup(   method, uri, version, i) @{
+  delete GETARG;         delete MENU;        delete PARAM
+  GETARG["Method"] = $1
+  GETARG["URI"] = $2
+  GETARG["Version"] = $3
+  i = index($2, "?")
+  # is there a "?" indicating a CGI request?
+@group
+  if (i > 0) @{
+    split(substr($2, 1, i-1), MENU, "[/:]")
+    split(substr($2, i+1), PARAM, "&")
+    for (i in PARAM) @{
+      j = index(PARAM[i], "=")
+      GETARG[substr(PARAM[i], 1, j-1)] = \
+                                  substr(PARAM[i], j+1)
+    @}
+  @} else @{    # there is no "?", no need for splitting PARAMs
+    split($2, MENU, "[/:]")
+  @}
+@end group
+@}
+@end example
+
+At first, the function clears all variables used for
+global storage of request parameters. The rest of the function serves
+the purpose of filling the global parameters with the extracted new values.
+To accomplish this, the name of the requested resource is split into
+parts and stored for later evaluation. If the request contains a @samp{?},
+then the request has CGI variables seamlessly appended to the web address.
+Everything in front of the @samp{?} is split up into menu items, and
+everything behind the @samp{?} is a list of @samp{@var{variable}=@var{value}} pairs
+(separated by @samp{&}) that also need splitting. This way, CGI variables are
+isolated and stored. This procedure lacks recognition of special characters
+that are transmitted in coded form@footnote{As defined in RFC 2068.}. Here, any
+optional request header and body parts are ignored. We do not need
+header parameters and the request body. However, when refining our approach or
+working with the @code{POST} and @code{PUT} methods, reading the header
+and body
+becomes inevitable. Header parameters should then be stored in a global
+array as well as the body.
+
+On each subsequent run through the main loop, one request from a browser is
+received, evaluated, and answered according to the user's choice. This can be
+done by letting the value of the HTTP method guide the main loop into
+execution of the procedure @code{HandleGET()}, which evaluates the user's
+choice. In this case, we have only one hierarchical level of menus,
+but in the general case,
+menus are nested.
+The menu choices at each level are
+separated by @samp{/}, just as in @value{FN}s. Notice how simple it is to
+construct menus of arbitrary depth:
+
+@example
+function HandleGET() @{
+  if (       MENU[2] == "human") @{
+    Footer = strftime() TopFooter
+  @} else if (MENU[2] == "POSIX") @{
+    Footer = systime()  TopFooter
+  @}
+@}
+@end example
+
+The disadvantage of this approach is that our server is slow and can
+handle only one request at a time. Its main advantage, however, is that
+the server
+consists of just one @command{gawk} program. No need for installing an
+@command{httpd}, and no need for static separate HTML files, CGI scripts, or
+@code{root} privileges. This is rapid prototyping.
+This program can be started on the same host that runs your browser.
+Then let your browser point to @uref{http://localhost:8080}.
+
+@cindex XBM image format
+@cindex images, in web pages
+@cindex web pages, images in
+@cindex GNUPlot utility
+It is also possible to include images into the HTML pages.
+Most browsers support the not very well-known
+@file{.xbm} format,
+which may contain only
+monochrome pictures but is an ASCII format. Binary images are possible but
+not so easy to handle. Another way of including images is to generate them
+with a tool such as GNUPlot,
+by calling the tool with the @code{system()} function or through a pipe.
+
+@node CGI Lib, , Interacting Service, Interacting Service
+@subsection A Simple CGI Library
+@quotation
+@i{HTTP is like being married: you have to be able to handle whatever
+you're given, while being very careful what you send back.}@*
+Phil Smith III,@*
+@uref{http://www.netfunny.com/rhf/jokes/99/Mar/http.html}
+@end quotation
+
+@c STARTOFRANGE cgilib
+@cindex CGI (Common Gateway Interface), library
+In @ref{Interacting Service, ,A Web Service with Interaction},
+we saw the function @code{CGI_setup()} as part of the web server
+``core logic'' framework. The code presented there handles almost
+everything necessary for CGI requests.
+One thing it doesn't do is handle encoded characters in the requests.
+For example, an @samp{&} is encoded as a percent sign followed by
+the hexadecimal value: @samp{%26}.  These encoded values should be
+decoded.
+Following is a simple library to perform these tasks.
+This code is used for all web server examples
+used throughout the rest of this @value{DOCUMENT}.
+If you want to use it for your own web server, store the source code
+into a file named @file{inetlib.awk}. Then you can include
+these functions into your code by placing the following statement
+into your program
+(on the first line of your script):
+
+@example
+@@include inetlib.awk
+@end example
+
+@noindent
+But beware, this mechanism is
+only possible if you invoke your web server script with @command{igawk}
+instead of the usual @command{awk} or @command{gawk}.
+Here is the code:
+
+@example
+@c file eg/network/coreserv.awk
+# CGI Library and core of a web server
+@c endfile
+@ignore
+@c file eg/network/coreserv.awk
+#
+# Juergen Kahrs, Juergen.Kahrs@@vr-web.de
+# with Arnold Robbins, arnold@@skeeve.com
+# September 2000
+
+@c endfile
+@end ignore
+@c file eg/network/coreserv.awk
+# Global arrays
+#   GETARG --- arguments to CGI GET command
+#   MENU   --- menu items (path names)
+#   PARAM  --- parameters of form x=y
+
+# Optional variable MyHost contains host address
+# Optional variable MyPort contains port number
+# Needs TopHeader, TopDoc, TopFooter
+# Sets MyPrefix, HttpService, Status, Reason
+
+BEGIN @{
+  if (MyHost == "") @{
+     "uname -n" | getline MyHost
+     close("uname -n")
+  @}
+  if (MyPort ==  0) MyPort = 8080
+  HttpService = "/inet/tcp/" MyPort "/0/0"
+  MyPrefix    = "http://" MyHost ":" MyPort
+  SetUpServer()
+  while ("awk" != "complex") @{
+    # header lines are terminated this way
+    RS = ORS    = "\r\n"
+    Status      = 200             # this means OK
+    Reason      = "OK"
+    Header      = TopHeader
+    Document    = TopDoc
+    Footer      = TopFooter
+    if        (GETARG["Method"] == "GET") @{
+        HandleGET()
+    @} else if (GETARG["Method"] == "HEAD") @{
+        # not yet implemented
+    @} else if (GETARG["Method"] != "") @{
+        print "bad method", GETARG["Method"]
+    @}
+    Prompt = Header Document Footer
+    print "HTTP/1.0", Status, Reason     |& HttpService
+    print "Connection: Close"            |& HttpService
+    print "Pragma: no-cache"             |& HttpService
+    len = length(Prompt) + length(ORS)
+    print "Content-length:", len         |& HttpService
+    print ORS Prompt                     |& HttpService
+    # ignore all the header lines
+    while ((HttpService |& getline) > 0)
+        continue
+    # stop talking to this client
+    close(HttpService)
+    # wait for new client request
+    HttpService |& getline
+    # do some logging
+    print systime(), strftime(), $0
+    CGI_setup($1, $2, $3)
+  @}
+@}
+
+function CGI_setup(   method, uri, version, i)
+@{
+    delete GETARG
+    delete MENU
+    delete PARAM
+    GETARG["Method"] = method
+    GETARG["URI"] = uri
+    GETARG["Version"] = version
+
+    i = index(uri, "?")
+    if (i > 0) @{  # is there a "?" indicating a CGI request?
+        split(substr(uri, 1, i-1), MENU, "[/:]")
+        split(substr(uri, i+1), PARAM, "&")
+        for (i in PARAM) @{
+            PARAM[i] = _CGI_decode(PARAM[i])
+            j = index(PARAM[i], "=")
+            GETARG[substr(PARAM[i], 1, j-1)] = \
+                                         substr(PARAM[i], j+1)
+        @}
+    @} else @{ # there is no "?", no need for splitting PARAMs
+        split(uri, MENU, "[/:]")
+    @}
+    for (i in MENU)     # decode characters in path
+        if (i > 4)      # but not those in host name
+            MENU[i] = _CGI_decode(MENU[i])
+@}
+@c endfile
+@end example
+
+This isolates details in a single function, @code{CGI_setup()}.
+Decoding of encoded characters is pushed off to a helper function,
+@code{_CGI_decode()}. The use of the leading underscore (@samp{_}) in
+the function name is intended to indicate that it is an ``internal''
+function, although there is nothing to enforce this:
+
+@example
+@c file eg/network/coreserv.awk
+function _CGI_decode(str,   hexdigs, i, pre, code1, code2,
+                            val, result)
+@{
+   hexdigs = "123456789abcdef"
+
+   i = index(str, "%")
+   if (i == 0) # no work to do
+      return str
+
+   do @{
+      pre = substr(str, 1, i-1)   # part before %xx
+      code1 = substr(str, i+1, 1) # first hex digit
+      code2 = substr(str, i+2, 1) # second hex digit
+      str = substr(str, i+3)      # rest of string
+
+      code1 = tolower(code1)
+      code2 = tolower(code2)
+      val = index(hexdigs, code1) * 16 \
+            + index(hexdigs, code2)
+
+      result = result pre sprintf("%c", val)
+      i = index(str, "%")
+   @} while (i != 0)
+   if (length(str) > 0)
+      result = result str
+   return result
+@}
+@c endfile
+@end example
+
+This works by splitting the string apart around an encoded character.
+The two digits are converted to lowercase characters and looked up in a string
+of hex digits.  Note that @code{0} is not in the string on purpose;
+@code{index()} returns zero when it's not found, automatically giving
+the correct value!  Once the hexadecimal value is converted from
+characters in a string into a numerical value, @code{sprintf()}
+converts the value back into a real character.
+The following is a simple test harness for the above functions:
+
+@example
+@c file eg/network/testserv.awk
+BEGIN @{
+  CGI_setup("GET",
+  "http://www.gnu.org/cgi-bin/foo?p1=stuff&p2=stuff%26junk" \
+       "&percent=a %25 sign",
+  "1.0")
+  for (i in MENU)
+      printf "MENU[\"%s\"] = %s\n", i, MENU[i]
+  for (i in PARAM)
+      printf "PARAM[\"%s\"] = %s\n", i, PARAM[i]
+  for (i in GETARG)
+      printf "GETARG[\"%s\"] = %s\n", i, GETARG[i]
+@}
+@c endfile
+@end example
+
+And this is the result when we run it:
+
+@c artificial line wrap in last output line
+@example
+$ gawk -f testserv.awk
+@print{} MENU["4"] = www.gnu.org
+@print{} MENU["5"] = cgi-bin
+@print{} MENU["6"] = foo
+@print{} MENU["1"] = http
+@print{} MENU["2"] =
+@print{} MENU["3"] =
+@print{} PARAM["1"] = p1=stuff
+@print{} PARAM["2"] = p2=stuff&junk
+@print{} PARAM["3"] = percent=a % sign
+@print{} GETARG["p1"] = stuff
+@print{} GETARG["percent"] = a % sign
+@print{} GETARG["p2"] = stuff&junk
+@print{} GETARG["Method"] = GET
+@print{} GETARG["Version"] = 1.0
+@print{} GETARG["URI"] = http://www.gnu.org/cgi-bin/foo?p1=stuff&
+p2=stuff%26junk&percent=a %25 sign
+@end example
+
+@node Simple Server, Caveats, Interacting Service, Using Networking
+@section A Simple Web Server
+@c STARTOFRANGE webserx
+@cindex web servers
+@c STARTOFRANGE serweb
+@cindex servers, web
+In the preceding @value{SECTION}, we built the core logic for event-driven GUIs.
+In this @value{SECTION}, we finally extend the core to a real application.
+No one would actually write a commercial web server in @command{gawk}, but
+it is instructive to see that it is feasible in principle.
+
+@cindex ELIZA program
+@cindex Weizenbaum, Joseph
+The application is ELIZA, the famous program by Joseph Weizenbaum that
+mimics the behavior of a professional psychotherapist when talking to you.
+Weizenbaum would certainly object to this description, but this is part of
+the legend around ELIZA.
+Take the site-independent core logic and append the following code:
+
+@example
+@c file eg/network/eliza.awk
+function SetUpServer() @{
+  SetUpEliza()
+  TopHeader = \
+    "<HTML><title>An HTTP-based System with GAWK</title>\
+    <HEAD><META HTTP-EQUIV=\"Content-Type\"\
+    CONTENT=\"text/html; charset=iso-8859-1\"></HEAD>\
+    <BODY BGCOLOR=\"#ffffff\" TEXT=\"#000000\"\
+    LINK=\"#0000ff\" VLINK=\"#0000ff\"\
+    ALINK=\"#0000ff\"> <A NAME=\"top\">"
+  TopDoc    = "\
+   <h2>Please choose one of the following actions:</h2>\
+   <UL>\
+   <LI>\
+   <A HREF=" MyPrefix "/AboutServer>About this server</A>\
+   </LI><LI>\
+   <A HREF=" MyPrefix "/AboutELIZA>About Eliza</A></LI>\
+   <LI>\
+   <A HREF=" MyPrefix \
+      "/StartELIZA>Start talking to Eliza</A></LI></UL>"
+  TopFooter = "</BODY></HTML>"
+@}
+@c endfile
+@end example
+
+@code{SetUpServer()} is similar to the previous example,
+except for calling another function, @code{SetUpEliza()}.
+This approach can be used to implement other kinds of servers.
+The only changes needed to do so are hidden in the functions
+@code{SetUpServer()} and @code{HandleGET()}. Perhaps it might be necessary to
+implement other HTTP methods.
+The @command{igawk} program that comes with @command{gawk}
+may be useful for this process.
+
+When extending this example to a complete application, the first
+thing to do is to implement the function @code{SetUpServer()} to
+initialize the HTML pages and some variables. These initializations
+determine the way your HTML pages look (colors, titles, menu
+items, etc.).
+
+The function @code{HandleGET()} is a nested case selection that decides
+which page the user wants to see next.  Each nesting level refers to a menu
+level of the GUI. Each case implements a certain action of the menu. On the
+deepest level of case selection, the handler essentially knows what the
+user wants and stores the answer into the variable that holds the HTML
+page contents:
+
+@smallexample
+@c file eg/network/eliza.awk
+function HandleGET() @{
+  # A real HTTP server would treat some parts of the URI as a file name.
+  # We take parts of the URI as menu choices and go on accordingly.
+  if (MENU[2] == "AboutServer") @{
+    Document    = "This is not a CGI script.\
+      This is an httpd, an HTML file, and a CGI script all \
+      in one GAWK script. It needs no separate www-server, \
+      no installation, and no root privileges.\
+      <p>To run it, do this:</p><ul>\
+      <li> start this script with \"gawk -f httpserver.awk\",</li>\
+      <li> and on the same host let your www browser open location\
+           \"http://localhost:8080\"</li>\
+      </ul>\<p>\ Details of HTTP come from:</p><ul>\
+            <li>Hethmon:  Illustrated Guide to HTTP</p>\
+            <li>RFC 2068</li></ul><p>JK 14.9.1997</p>"
+  @} else if (MENU[2] == "AboutELIZA") @{
+    Document    = "This is an implementation of the famous ELIZA\
+        program by Joseph Weizenbaum. It is written in GAWK and\
+        uses an HTML GUI."
+  @} else if (MENU[2] == "StartELIZA") @{
+    gsub(/\+/, " ", GETARG["YouSay"])
+    # Here we also have to substitute coded special characters
+    Document    = "<form method=GET>" \
+      "<h3>" ElizaSays(GETARG["YouSay"]) "</h3>\
+      <p><input type=text name=YouSay value=\"\" size=60>\
+      <br><input type=submit value=\"Tell her about it\"></p></form>"
+  @}
+@}
+@c endfile
+@end smallexample
+
+Now we are down to the heart of ELIZA, so you can see how it works.
+Initially the user does not say anything; then ELIZA resets its money
+counter and asks the user to tell what comes to mind open heartedly.
+The subsequent answers are converted to uppercase characters and stored for
+later comparison. ELIZA presents the bill when being confronted with
+a sentence that contains the phrase ``shut up.'' Otherwise, it looks for
+keywords in the sentence, conjugates the rest of the sentence, remembers
+the keyword for later use, and finally selects an answer from the set of
+possible answers:
+
+@smallexample
+@c file eg/network/eliza.awk
+function ElizaSays(YouSay) @{
+  if (YouSay == "") @{
+    cost = 0
+    answer = "HI, IM ELIZA, TELL ME YOUR PROBLEM"
+  @} else @{
+    q = toupper(YouSay)
+    gsub("'", "", q)
+    if (q == qold) @{
+      answer = "PLEASE DONT REPEAT YOURSELF !"
+    @} else @{
+      if (index(q, "SHUT UP") > 0) @{
+        answer = "WELL, PLEASE PAY YOUR BILL. ITS EXACTLY ... $"\
+                 int(100*rand()+30+cost/100)
+      @} else @{
+        qold = q
+        w = "-"                 # no keyword recognized yet
+        for (i in k) @{          # search for keywords
+          if (index(q, i) > 0) @{
+            w = i
+            break
+          @}
+        @}
+        if (w == "-") @{         # no keyword, take old subject
+          w    = wold
+          subj = subjold
+        @} else @{                # find subject
+          subj = substr(q, index(q, w) + length(w)+1)
+          wold = w
+          subjold = subj        #  remember keyword and subject
+        @}
+        for (i in conj)
+           gsub(i, conj[i], q)   # conjugation
+        # from all answers to this keyword, select one randomly
+        answer = r[indices[int(split(k[w], indices) * rand()) + 1]]
+        # insert subject into answer
+        gsub("_", subj, answer)
+      @}
+    @}
+  @}
+  cost += length(answer) # for later payment : 1 cent per character
+  return answer
+@}
+@c endfile
+@end smallexample
+
+In the long but simple function @code{SetUpEliza()}, you can see tables
+for conjugation, keywords, and answers.@footnote{The version shown
+here is abbreviated.  The full version comes with the @command{gawk}
+distribution.} The associative array @code{k}
+contains indices into the array of answers @code{r}. To choose an
+answer, ELIZA just picks an index randomly:
+
+@example
+@c file eg/network/eliza.awk
+function SetUpEliza() @{
+  srand()
+  wold = "-"
+  subjold = " "
+
+  # table for conjugation
+  conj[" ARE "     ] = " AM "
+  conj["WERE "     ] = "WAS "
+  conj[" YOU "     ] = " I "
+  conj["YOUR "     ] = "MY "
+  conj[" IVE "     ] =\
+  conj[" I HAVE "  ] = " YOU HAVE "
+  conj[" YOUVE "   ] =\
+  conj[" YOU HAVE "] = " I HAVE "
+  conj[" IM "      ] =\
+  conj[" I AM "    ] = " YOU ARE "
+  conj[" YOURE "   ] =\
+  conj[" YOU ARE " ] = " I AM "
+
+  # table of all answers
+  r[1]   = "DONT YOU BELIEVE THAT I CAN  _"
+  r[2]   = "PERHAPS YOU WOULD LIKE TO BE ABLE TO _ ?"
+@c endfile
+  @dots{}
+@end example
+@ignore
+@c file eg/network/eliza.awk
+  r[3]   = "YOU WANT ME TO BE ABLE TO _ ?"
+  r[4]   = "PERHAPS YOU DONT WANT TO _ "
+  r[5]   = "DO YOU WANT TO BE ABLE TO _ ?"
+  r[6]   = "WHAT MAKES YOU THINK I AM _ ?"
+  r[7]   = "DOES IT PLEASE YOU TO BELIEVE I AM _ ?"
+  r[8]   = "PERHAPS YOU WOULD LIKE TO BE _ ?"
+  r[9]   = "DO YOU SOMETIMES WISH YOU WERE _ ?"
+  r[10]  = "DONT YOU REALLY _ ?"
+  r[11]  = "WHY DONT YOU _ ?"
+  r[12]  = "DO YOU WISH TO BE ABLE TO _ ?"
+  r[13]  = "DOES THAT TROUBLE YOU ?"
+  r[14]  = "TELL ME MORE ABOUT SUCH FEELINGS"
+  r[15]  = "DO YOU OFTEN FEEL _ ?"
+  r[16]  = "DO YOU ENJOY FEELING _ ?"
+  r[17]  = "DO YOU REALLY BELIEVE I DONT _ ?"
+  r[18]  = "PERHAPS IN GOOD TIME I WILL _ "
+  r[19]  = "DO YOU WANT ME TO _ ?"
+  r[20]  = "DO YOU THINK YOU SHOULD BE ABLE TO _ ?"
+  r[21]  = "WHY CANT YOU _ ?"
+  r[22]  = "WHY ARE YOU INTERESTED IN WHETHER OR NOT I AM _ ?"
+  r[23]  = "WOULD YOU PREFER IF I WERE NOT _ ?"
+  r[24]  = "PERHAPS IN YOUR FANTASIES I AM _ "
+  r[25]  = "HOW DO YOU KNOW YOU CANT _ ?"
+  r[26]  = "HAVE YOU TRIED ?"
+  r[27]  = "PERHAPS YOU CAN NOW _ "
+  r[28]  = "DID YOU COME TO ME BECAUSE YOU ARE _ ?"
+  r[29]  = "HOW LONG HAVE YOU BEEN _ ?"
+  r[30]  = "DO YOU BELIEVE ITS NORMAL TO BE _ ?"
+  r[31]  = "DO YOU ENJOY BEING _ ?"
+  r[32]  = "WE WERE DISCUSSING YOU -- NOT ME"
+  r[33]  = "Oh, I _"
+  r[34]  = "YOU'RE NOT REALLY TALKING ABOUT ME, ARE YOU ?"
+  r[35]  = "WHAT WOULD IT MEAN TO YOU, IF YOU GOT _ ?"
+  r[36]  = "WHY DO YOU WANT _ ?"
+  r[37]  = "SUPPOSE YOU SOON GOT _"
+  r[38]  = "WHAT IF YOU NEVER GOT _ ?"
+  r[39]  = "I SOMETIMES ALSO WANT _"
+  r[40]  = "WHY DO YOU ASK ?"
+  r[41]  = "DOES THAT QUESTION INTEREST YOU ?"
+  r[42]  = "WHAT ANSWER WOULD PLEASE YOU THE MOST ?"
+  r[43]  = "WHAT DO YOU THINK ?"
+  r[44]  = "ARE SUCH QUESTIONS IN YOUR MIND OFTEN ?"
+  r[45]  = "WHAT IS IT THAT YOU REALLY WANT TO KNOW ?"
+  r[46]  = "HAVE YOU ASKED ANYONE ELSE ?"
+  r[47]  = "HAVE YOU ASKED SUCH QUESTIONS BEFORE ?"
+  r[48]  = "WHAT ELSE COMES TO MIND WHEN YOU ASK THAT ?"
+  r[49]  = "NAMES DON'T INTEREST ME"
+  r[50]  = "I DONT CARE ABOUT NAMES -- PLEASE GO ON"
+  r[51]  = "IS THAT THE REAL REASON ?"
+  r[52]  = "DONT ANY OTHER REASONS COME TO MIND ?"
+  r[53]  = "DOES THAT REASON EXPLAIN ANYTHING ELSE ?"
+  r[54]  = "WHAT OTHER REASONS MIGHT THERE BE ?"
+  r[55]  = "PLEASE DON'T APOLOGIZE !"
+  r[56]  = "APOLOGIES ARE NOT NECESSARY"
+  r[57]  = "WHAT FEELINGS DO YOU HAVE WHEN YOU APOLOGIZE ?"
+  r[58]  = "DON'T BE SO DEFENSIVE"
+  r[59]  = "WHAT DOES THAT DREAM SUGGEST TO YOU ?"
+  r[60]  = "DO YOU DREAM OFTEN ?"
+  r[61]  = "WHAT PERSONS APPEAR IN YOUR DREAMS ?"
+  r[62]  = "ARE YOU DISTURBED BY YOUR DREAMS ?"
+  r[63]  = "HOW DO YOU DO ... PLEASE STATE YOUR PROBLEM"
+  r[64]  = "YOU DON'T SEEM QUITE CERTAIN"
+  r[65]  = "WHY THE UNCERTAIN TONE ?"
+  r[66]  = "CAN'T YOU BE MORE POSITIVE ?"
+  r[67]  = "YOU AREN'T SURE ?"
+  r[68]  = "DON'T YOU KNOW ?"
+  r[69]  = "WHY NO _ ?"
+  r[70]  = "DON'T SAY NO, IT'S ALWAYS SO NEGATIVE"
+  r[71]  = "WHY NOT ?"
+  r[72]  = "ARE YOU SURE ?"
+  r[73]  = "WHY NO ?"
+  r[74]  = "WHY ARE YOU CONCERNED ABOUT MY _ ?"
+  r[75]  = "WHAT ABOUT YOUR OWN _ ?"
+  r[76]  = "CAN'T YOU THINK ABOUT A SPECIFIC EXAMPLE ?"
+  r[77]  = "WHEN ?"
+  r[78]  = "WHAT ARE YOU THINKING OF ?"
+  r[79]  = "REALLY, ALWAYS ?"
+  r[80]  = "DO YOU REALLY THINK SO ?"
+  r[81]  = "BUT YOU ARE NOT SURE YOU _ "
+  r[82]  = "DO YOU DOUBT YOU _ ?"
+  r[83]  = "IN WHAT WAY ?"
+  r[84]  = "WHAT RESEMBLANCE DO YOU SEE ?"
+  r[85]  = "WHAT DOES THE SIMILARITY SUGGEST TO YOU ?"
+  r[86]  = "WHAT OTHER CONNECTION DO YOU SEE ?"
+  r[87]  = "COULD THERE REALLY BE SOME CONNECTIONS ?"
+  r[88]  = "HOW ?"
+  r[89]  = "YOU SEEM QUITE POSITIVE"
+  r[90]  = "ARE YOU SURE ?"
+  r[91]  = "I SEE"
+  r[92]  = "I UNDERSTAND"
+  r[93]  = "WHY DO YOU BRING UP THE TOPIC OF FRIENDS ?"
+  r[94]  = "DO YOUR FRIENDS WORRY YOU ?"
+  r[95]  = "DO YOUR FRIENDS PICK ON YOU ?"
+  r[96]  = "ARE YOU SURE YOU HAVE ANY FRIENDS ?"
+  r[97]  = "DO YOU IMPOSE ON YOUR FRIENDS ?"
+  r[98]  = "PERHAPS YOUR LOVE FOR FRIENDS WORRIES YOU"
+  r[99]  = "DO COMPUTERS WORRY YOU ?"
+  r[100] = "ARE YOU TALKING ABOUT ME IN PARTICULAR ?"
+  r[101] = "ARE YOU FRIGHTENED BY MACHINES ?"
+  r[102] = "WHY DO YOU MENTION COMPUTERS ?"
+  r[103] = "WHAT DO YOU THINK MACHINES HAVE TO DO WITH YOUR PROBLEMS ?"
+  r[104] = "DON'T YOU THINK COMPUTERS CAN HELP PEOPLE ?"
+  r[105] = "WHAT IS IT ABOUT MACHINES THAT WORRIES YOU ?"
+  r[106] = "SAY, DO YOU HAVE ANY PSYCHOLOGICAL PROBLEMS ?"
+  r[107] = "WHAT DOES THAT SUGGEST TO YOU ?"
+  r[108] = "I SEE"
+  r[109] = "IM NOT SURE I UNDERSTAND YOU FULLY"
+  r[110] = "COME COME ELUCIDATE YOUR THOUGHTS"
+  r[111] = "CAN YOU ELABORATE ON THAT ?"
+  r[112] = "THAT IS QUITE INTERESTING"
+  r[113] = "WHY DO YOU HAVE PROBLEMS WITH MONEY ?"
+  r[114] = "DO YOU THINK MONEY IS EVERYTHING ?"
+  r[115] = "ARE YOU SURE THAT MONEY IS THE PROBLEM ?"
+  r[116] = "I THINK WE WANT TO TALK ABOUT YOU, NOT ABOUT ME"
+  r[117] = "WHAT'S ABOUT ME ?"
+  r[118] = "WHY DO YOU ALWAYS BRING UP MY NAME ?"
+@c endfile
+@end ignore
+
+@example
+@c file eg/network/eliza.awk
+  # table for looking up answers that
+  # fit to a certain keyword
+  k["CAN YOU"]      = "1 2 3"
+  k["CAN I"]        = "4 5"
+  k["YOU ARE"]      =\
+  k["YOURE"]        = "6 7 8 9"
+@c endfile
+  @dots{}
+@end example
+@ignore
+@c file eg/network/eliza.awk
+  k["I DONT"]       = "10 11 12 13"
+  k["I FEEL"]       = "14 15 16"
+  k["WHY DONT YOU"] = "17 18 19"
+  k["WHY CANT I"]   = "20 21"
+  k["ARE YOU"]      = "22 23 24"
+  k["I CANT"]       = "25 26 27"
+  k["I AM"]         =\
+  k["IM "]          = "28 29 30 31"
+  k["YOU "]         = "32 33 34"
+  k["I WANT"]       = "35 36 37 38 39"
+  k["WHAT"]         =\
+  k["HOW"]          =\
+  k["WHO"]          =\
+  k["WHERE"]        =\
+  k["WHEN"]         =\
+  k["WHY"]          = "40 41 42 43 44 45 46 47 48"
+  k["NAME"]         = "49 50"
+  k["CAUSE"]        = "51 52 53 54"
+  k["SORRY"]        = "55 56 57 58"
+  k["DREAM"]        = "59 60 61 62"
+  k["HELLO"]        =\
+  k["HI "]          = "63"
+  k["MAYBE"]        = "64 65 66 67 68"
+  k[" NO "]         = "69 70 71 72 73"
+  k["YOUR"]         = "74 75"
+  k["ALWAYS"]       = "76 77 78 79"
+  k["THINK"]        = "80 81 82"
+  k["LIKE"]         = "83 84 85 86 87 88 89"
+  k["YES"]          = "90 91 92"
+  k["FRIEND"]       = "93 94 95 96 97 98"
+  k["COMPUTER"]     = "99 100 101 102 103 104 105"
+  k["-"]            = "106 107 108 109 110 111 112"
+  k["MONEY"]        = "113 114 115"
+  k["ELIZA"]        = "116 117 118"
+@c endfile
+@end ignore
+@example
+@c file eg/network/eliza.awk
+@}
+@c endfile
+@end example
+
+@cindex Humphrys, Mark
+@cindex ELIZA program
+Some interesting remarks and details (including the original source code
+of ELIZA) are found on Mark Humphrys' home page.  Yahoo!  also has a
+page with a collection of ELIZA-like programs. Many of them are written
+in Java, some of them disclosing the Java source code, and a few even
+explain how to modify the Java source code.
+
+@node Caveats, Challenges, Simple Server, Using Networking
+@section Network Programming Caveats
+
+@cindex networks, @command{gawk} and, troubleshooting
+@cindex @command{gawk}, networking, troubleshooting
+@cindex troubleshooting, @command{gawk}, networks
+By now it should be clear
+that debugging a networked application is more
+complicated than debugging a single-process single-hosted application.
+The behavior of a networked application sometimes looks noncausal because
+it is not reproducible in a strong sense. Whether a network application
+works or not sometimes depends on the following:
+
+@itemize @bullet
+@item
+How crowded the underlying network is
+
+@item
+If the party at the other end is running or not
+
+@item
+The state of the party at the other end
+@end itemize
+
+@cindex troubleshooting, networks, timeouts
+The most difficult problems for a beginner arise from the hidden states of the
+underlying network. After closing a TCP connection, it's often necessary to wait
+a short while before reopening the connection. Even more difficult is the
+establishment of a connection that previously ended with a ``broken pipe.''
+Those connections have to ``time out'' for a minute or so
+before they can reopen.
+Check this with the command @samp{netstat -a}, which
+provides a list of still ``active'' connections.
+
+@node Challenges, , Caveats, Using Networking
+@section Where To Go From Here
+
+@cindex Loebner, Hugh
+@cindex contest
+Now, you have learned enough to build your own application. You could,
+for example, take part in the
+Loebner Contest
+to win $100,000.  The Loebner Prize is the first formal instantiation of
+a Turing Test. Hugh Loebner agreed with The Cambridge Center for Behavioral
+Studies to underwrite a contest designed to implement the Turing Test.
+Dr.@: Loebner pledged a Grand Prize of $100,000 for the first computer whose
+responses were indistinguishable from a human's. Each year an annual prize
+of $2000 and a bronze medal is awarded to the @emph{most} human computer.
+The winner of the annual contest is the best entry relative to other entries
+that year, irrespective of how good it is in an absolute sense. Here is
+an example of a conversation with the winning program of 1997:
+
+@smallexample
+(c)1997 Cambridge Center For Behavioral Studies all rights reserved [CONVERSE]
+[Intelligent Research Ltd.] Start at: [1997/04/29 08:59:40]
+PROGRAM[10:39:20]Hi, my name is Catherine, what's yours?
+JUDGE02[10:39:36]My name is Nathan.
+PROGRAM[10:39:37]Well, it's nice to meet you, Nathan.
+PROGRAM[10:39:45]Did you see that story on CNN last night about the lesbian
+PROGRAM[10:40:03]couple who came out at a White House party on Sunday?
+JUDGE02[10:40:45]No.  I'm sorry I missed that.  How did the Prez take it?
+PROGRAM[10:40:47]Ellen Degeneres was one of them - she was kissing her lover
+PROGRAM[10:41:08]in front of Bill Clinton. Do you think he was very
+PROGRAM[10:41:21]embarrassed?
+JUDGE02[10:41:37]You tell me.  I didn't see it.
+PROGRAM[10:41:38]Are you still a Friend of Bill Clinton?
+JUDGE02[10:42:22]Yes.  I would like to talk about something else.  Do you know anything about sculpture.
+PROGRAM[10:42:24]Well, I suppose he's doing his best like most of us, but he
+PROGRAM[10:42:35]does seem to attract an UNUSUAL amount of bad publicity,
+PROGRAM[10:42:51]wouldnt you say--can it all be bad luck?
+JUDGE02[10:43:20]I asked you if you knew anything about sculpture.
+PROGRAM[10:43:21]OK, but what happens now--does it all drift on, with
+PROGRAM[10:43:36]everyone waiting to see how much his friends have said about
+PROGRAM[10:43:47]him under threat of lots and lots of jail-or will something
+PROGRAM[10:44:01]dramatic actually happen?
+JUDGE02[10:44:19]Do you know what sculpture is?
+PROGRAM[10:44:20]Well, youre more a fan of his than I am I guess---though I
+PROGRAM[10:44:34]cant SWEAR what Id have done in that locked hotel room, I
+PROGRAM[10:44:51]must say.
+JUDGE02[10:45:26]Have you ever been to the Salmagundi Club?
+PROGRAM[10:45:29]Never. to go back to the original discussion Time to get
+PROGRAM[10:45:43]off this one I think and onto something more down to earth!
+JUDGE02[10:46:20]What is more down to earth than art?
+PROGRAM[10:46:21]I don't know what -- to be honest. -
+PROGRAM[10:46:30]I suppose it depends on where you're coming from, but as the
+PROGRAM[10:46:46]song goes in My Fair Lady, "Why can't a woman be more like a
+PROGRAM[10:47:03]man? "
+JUDGE02[10:47:52]I liked that song but I prefer "Why can't children be more like we are"
+JUDGE02[10:48:10]from another play the name of which I cannot remember.
+PROGRAM[10:48:12]What, if anything, do you enjoy about being a man?
+JUDGE02[10:49:01]I would enjoy all aspects of life no matter what my gender.
+PROGRAM[10:49:02]Do you think of yourself as being attractive?
+@end smallexample
+
+@cindex Clinton, Bill
+This program insists on always speaking about the same story around Bill
+Clinton. You see, even a program with a rather narrow mind can behave so
+much like a human being that it can win this prize. It is quite common to
+let these programs talk to each other via network connections. But during the
+competition itself, the program and its computer have to be present at the
+place the competition is held. We all would love to see a @command{gawk}
+program win in such an event. Maybe it is up to you to accomplish this?
+
+Some other ideas for useful networked applications:
+@itemize @bullet
+@item
+Read the file @file{doc/awkforai.txt} in earlier @command{gawk}
+distributions.@footnote{The file is no longer distributed with
+@command{gawk}, since the copyright on the file is not clear.}
+It was written by Ronald P.@: Loui (at the time, Associate
+Professor of Computer Science, at Washington University in St. Louis,
+@email{loui@@ai.wustl.edu}) and summarizes why he taught @command{gawk} to
+students of Artificial Intelligence. Here are some passages from the text:
+
+@cindex AI
+@cindex PROLOG
+@cindex Loui, Ronald
+@cindex agent
+@quotation
+The GAWK manual can
+be consumed in a single lab session and the language can be mastered by
+the next morning by the average student.  GAWK's automatic
+initialization, implicit coercion, I/O support and lack of pointers
+forgive many of the mistakes that young programmers are likely to make.
+Those who have seen C but not mastered it are happy to see that GAWK
+retains some of the same sensibilities while adding what must be
+regarded as spoonsful of syntactic sugar.@*
+@dots{}@*
+@cindex robot
+There are further simple answers.  Probably the best is the fact that
+increasingly, undergraduate AI programming is involving the Web.  Oren
+Etzioni (University of Washington, Seattle) has for a while been arguing
+that the ``softbot'' is replacing the mechanical engineers' robot as the
+most glamorous AI testbed.  If the artifact whose behavior needs to be
+controlled in an intelligent way is the software agent, then a language
+that is well-suited to controlling the software environment is the
+appropriate language.  That would imply a scripting language.  If the
+robot is KAREL, then the right language is ``turn left; turn right.'' If
+the robot is Netscape, then the right language is something that can
+generate @samp{netscape -remote 'openURL(http://cs.wustl.edu/~loui)'} with
+elan.@*
+@dots{}@*
+AI programming requires high-level thinking.  There have always been a few
+gifted programmers who can write high-level programs in assembly language.
+Most however need the ambient abstraction to have a higher floor.@*
+@dots{}@*
+Second, inference is merely the expansion of notation.  No matter whether
+the logic that underlies an AI program is fuzzy, probabilistic, deontic,
+defeasible, or deductive, the logic merely defines how strings can be
+transformed into other strings.  A language that provides the best
+support for string processing in the end provides the best support for
+logic, for the exploration of various logics, and for most forms of
+symbolic processing that AI might choose to call ``reasoning'' instead of
+``logic.''  The implication is that PROLOG, which saves the AI programmer
+from having to write a unifier, saves perhaps two dozen lines of GAWK
+code at the expense of strongly biasing the logic and representational
+expressiveness of any approach.
+@end quotation
+
+Now that @command{gawk} itself can connect to the Internet, it should be obvious
+that it is suitable for writing intelligent web agents.
+
+@item
+@command{awk} is strong at pattern recognition and string processing.
+So, it is well suited to the classic problem of language translation.
+A first try could be a program that knows the 100 most frequent English
+words and their counterparts in German or French. The service could be
+implemented by regularly reading email with the program above, replacing
+each word by its translation and sending the translation back via SMTP.
+Users would send English email to their translation service and get
+back a translated email message in return. As soon as this works,
+more effort can be spent on a real translation program.
+
+@item
+Another dialogue-oriented application (on the verge
+of ridicule) is the email ``support service.'' Troubled customers write an
+email to an automatic @command{gawk} service that reads the email. It looks
+for keywords in the mail and assembles a reply email accordingly. By carefully
+investigating the email header, and repeating these keywords through the
+reply email, it is rather simple to give the customer a feeling that
+someone cares. Ideally, such a service would search a database of previous
+cases for solutions. If none exists, the database could, for example, consist
+of all the newsgroups, mailing lists and FAQs on the Internet.
+@end itemize
+
+@node Some Applications and Techniques, Links, Using Networking, Top
+@comment node-name,    next,  previous,      up
+
+@chapter Some Applications and Techniques
+In this @value{CHAPTER}, we look at a number of self-contained
+scripts, with an emphasis on concise networking.  Along the way, we
+work towards creating building blocks that encapsulate often needed
+functions of the networking world, show new techniques that
+broaden the scope of problems that can be solved with @command{gawk}, and
+explore leading edge technology that may shape the future of networking.
+
+We often refer to the site-independent core of the server that
+we built in
+@ref{Simple Server, ,A Simple Web Server}.
+When building new and nontrivial servers, we
+always copy this building block and append new instances of the two
+functions @code{SetUpServer()} and @code{HandleGET()}.
+
+This makes a lot of sense, since
+this scheme of event-driven
+execution provides @command{gawk} with an interface to the most widely
+accepted standard for GUIs: the web browser. Now, @command{gawk} can rival even
+Tcl/Tk.
+
+@cindex Tcl/Tk, @command{gawk} and
+Tcl and @command{gawk} have much in common. Both are simple scripting languages
+that allow us to quickly solve problems with short programs. But Tcl has Tk
+on top of it, and @command{gawk} had nothing comparable up to now. While Tcl
+needs a large and ever-changing library (Tk, which was bound to the X Window
+System until recently), @command{gawk} needs just the networking interface
+and some kind of browser on the client's side. Besides better portability,
+the most important advantage of this approach (embracing well-established
+standards such HTTP and HTML) is that @emph{we do not need to change the
+language}. We let others do the work of fighting over protocols and standards.
+We can use HTML, JavaScript, VRML, or whatever else comes along to do our work.
+
+@menu
+* PANIC::                       An Emergency Web Server.
+* GETURL::                      Retrieving Web Pages.
+* REMCONF::                     Remote Configuration Of Embedded Systems.
+* URLCHK::                      Look For Changed Web Pages.
+* WEBGRAB::                     Extract Links From A Page.
+* STATIST::                     Graphing A Statistical Distribution.
+* MAZE::                        Walking Through A Maze In Virtual Reality.
+* MOBAGWHO::                    A Simple Mobile Agent.
+* STOXPRED::                    Stock Market Prediction As A Service.
+* PROTBASE::                    Searching Through A Protein Database.
+@end menu
+
+@node PANIC, GETURL, Some Applications and Techniques, Some Applications and Techniques
+@section PANIC: An Emergency Web Server
+@cindex PANIC program
+@cindex networks, See Also web pages
+@cindex web service
+At first glance, the @code{"Hello, world"} example in
+@ref{Primitive Service, ,A Primitive Web Service},
+seems useless. By adding just a few lines, we can turn it into something useful.
+
+The PANIC program tells everyone who connects that the local
+site is not working. When a web server breaks down, it makes a difference
+if customers get a strange ``network unreachable'' message, or a short message
+telling them that the server has a problem. In such an emergency,
+the hard disk and everything on it (including the regular web service) may
+be unavailable. Rebooting the web server off a diskette makes sense in this
+setting.
+
+To use the PANIC program as an emergency web server, all you need are the
+@command{gawk} executable and the program below on a diskette. By default,
+it connects to port 8080. A different value may be supplied on the
+command line:
+
+@example
+@c file eg/network/panic.awk
+BEGIN @{
+  RS = ORS = "\r\n"
+  if (MyPort ==  0) MyPort = 8080
+  HttpService = "/inet/tcp/" MyPort "/0/0"
+  Hello = "<HTML><HEAD><TITLE>Out Of Service</TITLE>" \
+     "</HEAD><BODY><H1>" \
+     "This site is temporarily out of service." \
+     "</H1></BODY></HTML>"
+  Len = length(Hello) + length(ORS)
+  while ("awk" != "complex") @{
+    print "HTTP/1.0 200 OK"          |& HttpService
+    print "Content-Length: " Len ORS |& HttpService
+    print Hello                      |& HttpService
+    while ((HttpService |& getline) > 0)
+       continue;
+    close(HttpService)
+  @}
+@}
+@c endfile
+@end example
+
+@node GETURL, REMCONF, PANIC, Some Applications and Techniques
+@section GETURL: Retrieving Web Pages
+@cindex GETURL program
+@cindex web pages, retrieving
+GETURL is a versatile building block for shell scripts that need to retrieve
+files from the Internet. It takes a web address as a command-line parameter and
+tries to retrieve the contents of this address. The contents are printed
+to standard output, while the header is printed to @file{/dev/stderr}.
+A surrounding shell script
+could analyze the contents and extract the text or the links. An ASCII
+browser could be written around GETURL. But more interestingly, web robots are
+straightforward to write on top of GETURL. On the Internet, you can find
+several programs of the same name that do the same job. They are usually
+much more complex internally and at least 10 times longer.
+
+At first, GETURL checks if it was called with exactly one web address.
+Then, it checks if the user chose to use a special proxy server whose name
+is handed over in a variable. By default, it is assumed that the local
+machine serves as proxy. GETURL uses the @code{GET} method by default
+to access the web page. By handing over the name of a different method
+(such as @code{HEAD}), it is possible to choose a different behavior. With
+the @code{HEAD} method, the user does not receive the body of the page
+content, but does receive the header:
+
+@example
+@c file eg/network/geturl.awk
+BEGIN @{
+  if (ARGC != 2) @{
+    print "GETURL - retrieve Web page via HTTP 1.0"
+    print "IN:\n    the URL as a command-line parameter"
+    print "PARAM(S):\n    -v Proxy=MyProxy"
+    print "OUT:\n    the page content on stdout"
+    print "    the page header on stderr"
+    print "JK 16.05.1997"
+    print "ADR 13.08.2000"
+    exit
+  @}
+  URL = ARGV[1]; ARGV[1] = ""
+  if (Proxy     == "")  Proxy     = "127.0.0.1"
+  if (ProxyPort ==  0)  ProxyPort = 80
+  if (Method    == "")  Method    = "GET"
+  HttpService = "/inet/tcp/0/" Proxy "/" ProxyPort
+  ORS = RS = "\r\n\r\n"
+  print Method " " URL " HTTP/1.0" |& HttpService
+  HttpService                      |& getline Header
+  print Header > "/dev/stderr"
+  while ((HttpService |& getline) > 0)
+    printf "%s", $0
+  close(HttpService)
+@}
+@c endfile
+@end example
+
+This program can be changed as needed, but be careful with the last lines.
+Make sure transmission of binary data is not corrupted by additional line
+breaks. Even as it is now, the byte sequence @code{"\r\n\r\n"} would
+disappear if it were contained in binary data. Don't get caught in a
+trap when trying a quick fix on this one.
+
+@node REMCONF, URLCHK, GETURL, Some Applications and Techniques
+@section REMCONF: Remote Configuration of Embedded Systems
+@cindex REMCONF program
+@cindex Linux
+@cindex GNU/Linux
+@cindex Yahoo!
+Today, you often find powerful processors in embedded systems.  Dedicated
+network routers and controllers for all kinds of machinery are examples
+of embedded systems. Processors like the Intel 80x86 or the AMD Elan are
+able to run multitasking operating systems, such as XINU or GNU/Linux
+in embedded PCs.  These systems are small and usually do not have
+a keyboard or a display.  Therefore it is difficult to set up their
+configuration. There are several widespread ways to set them up:
+
+@itemize @bullet
+@item
+DIP switches
+
+@item
+Read Only Memories such as EPROMs
+
+@item
+Serial lines or some kind of keyboard
+
+@item
+Network connections via @command{telnet} or SNMP
+
+@item
+HTTP connections with HTML GUIs
+@end itemize
+
+In this @value{SECTION}, we look at a solution that uses HTTP connections
+to control variables of an embedded system that are stored in a file.
+Since embedded systems have tight limits on resources like memory,
+it is difficult to employ advanced techniques such as SNMP and HTTP
+servers. @command{gawk} fits in quite nicely with its single executable
+which needs just a short script to start working.
+The following program stores the variables in a file, and a concurrent
+process in the embedded system may read the file. The program uses the
+site-independent part of the simple web server that we developed in
+@ref{Interacting Service, ,A Web Service with Interaction}.
+As mentioned there, all we have to do is to write two new procedures
+@code{SetUpServer()} and @code{HandleGET()}:
+
+@smallexample
+@c file eg/network/remconf.awk
+function SetUpServer() @{
+  TopHeader = "<HTML><title>Remote Configuration</title>"
+  TopDoc = "<BODY>\
+    <h2>Please choose one of the following actions:</h2>\
+    <UL>\
+      <LI><A HREF=" MyPrefix "/AboutServer>About this server</A></LI>\
+      <LI><A HREF=" MyPrefix "/ReadConfig>Read Configuration</A></LI>\
+      <LI><A HREF=" MyPrefix "/CheckConfig>Check Configuration</A></LI>\
+      <LI><A HREF=" MyPrefix "/ChangeConfig>Change Configuration</A></LI>\
+      <LI><A HREF=" MyPrefix "/SaveConfig>Save Configuration</A></LI>\
+    </UL>"
+  TopFooter  = "</BODY></HTML>"
+  if (ConfigFile == "") ConfigFile = "config.asc"
+@}
+@c endfile
+@end smallexample
+
+The function @code{SetUpServer()} initializes the top level HTML texts
+as usual. It also initializes the name of the file that contains the
+configuration parameters and their values. In case the user supplies
+a name from the command line, that name is used. The file is expected to
+contain one parameter per line, with the name of the parameter in
+column one and the value in column two.
+
+The function @code{HandleGET()} reflects the structure of the menu
+tree as usual. The first menu choice tells the user what this is all
+about. The second choice reads the configuration file line by line
+and stores the parameters and their values. Notice that the record
+separator for this file is @code{"\n"}, in contrast to the record separator
+for HTTP. The third menu choice builds an HTML table to show
+the contents of the configuration file just read. The fourth choice
+does the real work of changing parameters, and the last one just saves
+the configuration into a file:
+
+@smallexample
+@c file eg/network/remconf.awk
+function HandleGET() @{
+  if (MENU[2] == "AboutServer") @{
+    Document  = "This is a GUI for remote configuration of an\
+      embedded system. It is is implemented as one GAWK script."
+  @} else if (MENU[2] == "ReadConfig") @{
+    RS = "\n"
+    while ((getline < ConfigFile) > 0)
+       config[$1] = $2;
+    close(ConfigFile)
+    RS = "\r\n"
+    Document = "Configuration has been read."
+  @} else if (MENU[2] == "CheckConfig") @{
+    Document = "<TABLE BORDER=1 CELLPADDING=5>"
+    for (i in config)
+      Document = Document "<TR><TD>" i "</TD>" \
+        "<TD>" config[i] "</TD></TR>"
+    Document = Document "</TABLE>"
+  @} else if (MENU[2] == "ChangeConfig") @{
+    if ("Param" in GETARG) @{            # any parameter to set?
+      if (GETARG["Param"] in config) @{  # is  parameter valid?
+        config[GETARG["Param"]] = GETARG["Value"]
+        Document = (GETARG["Param"] " = " GETARG["Value"] ".")
+      @} else @{
+        Document = "Parameter <b>" GETARG["Param"] "</b> is invalid."
+      @}
+    @} else @{
+      Document = "<FORM method=GET><h4>Change one parameter</h4>\
+        <TABLE BORDER CELLPADDING=5>\
+        <TR><TD>Parameter</TD><TD>Value</TD></TR>\
+        <TR><TD><input type=text name=Param value=\"\" size=20></TD>\
+            <TD><input type=text name=Value value=\"\" size=40></TD>\
+        </TR></TABLE><input type=submit value=\"Set\"></FORM>"
+    @}
+  @} else if (MENU[2] == "SaveConfig") @{
+    for (i in config)
+      printf("%s %s\n", i, config[i]) > ConfigFile
+    close(ConfigFile)
+    Document = "Configuration has been saved."
+  @}
+@}
+@c endfile
+@end smallexample
+
+@cindex MiniSQL
+We could also view the configuration file as a database. From this
+point of view, the previous program acts like a primitive database server.
+Real SQL database systems also make a service available by providing
+a TCP port that clients can connect to. But the application level protocols
+they use are usually proprietary and also change from time to time.
+This is also true for the protocol that
+MiniSQL uses.
+
+@node URLCHK, WEBGRAB, REMCONF, Some Applications and Techniques
+@section URLCHK: Look for Changed Web Pages
+@cindex URLCHK program
+Most people who make heavy use of Internet resources have a large
+bookmark file with pointers to interesting web sites. It is impossible
+to regularly check by hand if any of these sites have changed. A program
+is needed to automatically look at the headers of web pages and tell
+which ones have changed. URLCHK does the comparison after using GETURL
+with the @code{HEAD} method to retrieve the header.
+
+Like GETURL, this program first checks that it is called with exactly
+one command-line parameter. URLCHK also takes the same command-line variables
+@code{Proxy} and @code{ProxyPort} as GETURL,
+because these variables are handed over to GETURL for each URL
+that gets checked. The one and only parameter is the name of a file that
+contains one line for each URL. In the first column, we find the URL, and
+the second and third columns hold the length of the URL's body when checked
+for the two last times. Now, we follow this plan:
+
+@enumerate
+@item
+Read the URLs from the file and remember their most recent lengths
+
+@item
+Delete the contents of the file
+
+@item
+For each URL, check its new length and write it into the file
+
+@item
+If the most recent and the new length differ, tell the user
+@end enumerate
+
+It may seem a bit peculiar to read the URLs from a file together
+with their two most recent lengths, but this approach has several
+advantages. You can call the program again and again with the same
+file. After running the program, you can regenerate the changed URLs
+by extracting those lines that differ in their second and third columns:
+
+@c inspired by URLCHK in iX 5/97 166.
+@smallexample
+@c file eg/network/urlchk.awk
+BEGIN @{
+  if (ARGC != 2) @{
+    print "URLCHK - check if URLs have changed"
+    print "IN:\n    the file with URLs as a command-line parameter"
+    print "    file contains URL, old length, new length"
+    print "PARAMS:\n    -v Proxy=MyProxy -v ProxyPort=8080"
+    print "OUT:\n    same as file with URLs"
+    print "JK 02.03.1998"
+    exit
+  @}
+  URLfile = ARGV[1]; ARGV[1] = ""
+  if (Proxy     != "") Proxy     = " -v Proxy="     Proxy
+  if (ProxyPort != "") ProxyPort = " -v ProxyPort=" ProxyPort
+  while ((getline < URLfile) > 0)
+     Length[$1] = $3 + 0
+  close(URLfile)      # now, URLfile is read in and can be updated
+  GetHeader = "gawk " Proxy ProxyPort " -v Method=\"HEAD\" -f geturl.awk "
+  for (i in Length) @{
+    GetThisHeader = GetHeader i " 2>&1"
+    while ((GetThisHeader | getline) > 0)
+      if (toupper($0) ~ /CONTENT-LENGTH/) NewLength = $2 + 0
+    close(GetThisHeader)
+    print i, Length[i], NewLength > URLfile
+    if (Length[i] != NewLength)  # report only changed URLs
+      print i, Length[i], NewLength
+  @}
+  close(URLfile)
+@}
+@c endfile
+@end smallexample
+
+Another thing that may look strange is the way GETURL is called.
+Before calling GETURL, we have to check if the proxy variables need
+to be passed on. If so, we prepare strings that will become part
+of the command line later. In @code{GetHeader()}, we store these strings
+together with the longest part of the command line. Later, in the loop
+over the URLs, @code{GetHeader()} is appended with the URL and a redirection
+operator to form the command that reads the URL's header over the Internet.
+GETURL always produces the headers over @file{/dev/stderr}. That is
+the reason why we need the redirection operator to have the header
+piped in.
+
+This program is not perfect because it assumes that changing URLs
+results in changed lengths, which is not necessarily true. A more
+advanced approach is to look at some other header line that
+holds time information. But, as always when things get a bit more
+complicated, this is left as an exercise to the reader.
+
+@node WEBGRAB, STATIST, URLCHK, Some Applications and Techniques
+@section WEBGRAB: Extract Links from a Page
+@cindex WEBGRAB program
+@c Inspired by iX 1/98 157.
+@cindex robot
+Sometimes it is necessary to extract links from web pages.
+Browsers do it, web robots do it, and sometimes even humans do it.
+Since we have a tool like GETURL at hand, we can solve this problem with
+some help from the Bourne shell:
+
+@example
+@c file eg/network/webgrab.awk
+BEGIN @{ RS = "https?://[#%&\\+\\-\\./0-9\\:;\\?A-Z_a-z\\~]*" @}
+RT != "" @{
+   command = ("gawk -v Proxy=MyProxy -f geturl.awk " RT \
+               " > doc" NR ".html")
+   print command
+@}
+@c endfile
+@end example
+
+Notice that the regular expression for URLs is rather crude. A precise
+regular expression is much more complex. But this one works
+rather well. One problem is that it is unable to find internal links of
+an HTML document.  Another problem is that
+@samp{ftp}, @samp{telnet}, @samp{news}, @samp{mailto}, and other kinds
+of links are missing in the regular expression.
+However, it is straightforward to add them, if doing so is necessary for other tasks.
+
+This program reads an HTML file and prints all the HTTP links that it finds.
+It relies on @command{gawk}'s ability to use regular expressions as record
+separators. With @code{RS} set to a regular expression that matches links,
+the second action is executed each time a non-empty link is found.
+We can find the matching link itself in @code{RT}.
+
+The action could use the @code{system()} function to let another GETURL
+retrieve the page, but here we use a different approach.
+This simple program prints shell commands that can be piped into @command{sh}
+for execution.  This way it is possible to first extract
+the links, wrap shell commands around them, and pipe all the shell commands
+into a file. After editing the file, execution of the file retrieves
+exactly those files that we really need. In case we do not want to edit,
+we can retrieve all the pages like this:
+
+@smallexample
+gawk -f geturl.awk http://www.suse.de | gawk -f webgrab.awk | sh
+@end smallexample
+
+@cindex Microsoft Windows
+After this, you will find the contents of all referenced documents in
+files named @file{doc*.html} even if they do not contain HTML code.
+The most annoying thing is that we always have to pass the proxy to
+GETURL. If you do not like to see the headers of the web pages
+appear on the screen, you can redirect them to @file{/dev/null}.
+Watching the headers appear can be quite interesting, because
+it reveals
+interesting details such as which web server the companies use.
+Now, it is clear how the clever marketing people
+use web robots to determine the
+market shares
+of Microsoft and Netscape in the web server market.
+
+Port 80 of any web server is like a small hole in a repellent firewall.
+After attaching a browser to port 80, we usually catch a glimpse
+of the bright side of the server (its home page). With a tool like GETURL
+at hand, we are able to discover some of the more concealed
+or even ``indecent'' services (i.e., lacking conformity to standards of quality).
+It can be exciting to see the fancy CGI scripts that lie
+there, revealing the inner workings of the server, ready to be called:
+
+@itemize @bullet
+@item
+With a command such as:
+
+@example
+gawk -f geturl.awk http://any.host.on.the.net/cgi-bin/
+@end example
+
+some servers give you a directory listing of the CGI files.
+Knowing the names, you can try to call some of them and watch
+for useful results. Sometimes there are executables in such directories
+(such as Perl interpreters) that you may call remotely. If there are
+subdirectories with configuration data of the web server, this can also
+be quite interesting to read.
+
+@item
+@cindex apache
+The well-known Apache web server usually has its CGI files in the
+directory @file{/cgi-bin}. There you can often find the scripts
+@file{test-cgi} and @file{printenv}. Both tell you some things
+about the current connection and the installation of the web server.
+Just call:
+
+@smallexample
+gawk -f geturl.awk http://any.host.on.the.net/cgi-bin/test-cgi
+gawk -f geturl.awk http://any.host.on.the.net/cgi-bin/printenv
+@end smallexample
+
+@item
+Sometimes it is even possible to retrieve system files like the web
+server's log file---possibly containing customer data---or even the file
+@file{/etc/passwd}.
+(We don't recommend this!)
+@end itemize
+
+@strong{Caution:}
+Although this may sound funny or simply irrelevant, we are talking about
+severe security holes. Try to explore your own system this way and make
+sure that none of the above reveals too much information about your system.
+
+@node STATIST, MAZE, WEBGRAB, Some Applications and Techniques
+@section STATIST: Graphing a Statistical Distribution
+@cindex STATIST program
+
+@cindex GNUPlot utility
+@cindex image format
+@cindex GIF image format
+@cindex PNG image format
+@cindex PS image format
+@cindex Boutell, Thomas
+@iftex
+@image{statist,3in}
+@end iftex
+In the HTTP server examples we've shown thus far, we never present an image
+to the browser and its user. Presenting images is one task. Generating
+images that reflect some user input and presenting these dynamically
+generated images is another. In this @value{SECTION}, we use GNUPlot
+for generating @file{.png}, @file{.ps}, or @file{.gif}
+files.@footnote{Due to licensing problems, the default
+installation of GNUPlot disables the generation of @file{.gif} files.
+If your installed version does not accept @samp{set term gif},
+just download and install the most recent version of GNUPlot and the
+@uref{http://www.boutell.com/gd/, GD library}
+by Thomas Boutell.
+Otherwise you still have the chance to generate some
+ASCII-art style images with GNUPlot by using @samp{set term dumb}.
+(We tried it and it worked.)}
+
+The program we develop takes the statistical parameters of two samples
+and computes the t-test statistics. As a result, we get the probabilities
+that the means and the variances of both samples are the same. In order to
+let the user check plausibility, the program presents an image of the
+distributions. The statistical computation follows
+@cite{Numerical Recipes in C: The Art of Scientific Computing}
+by William H.@: Press, Saul A.@: Teukolsky, William T.@: Vetterling, and Brian P. Flannery.
+Since @command{gawk} does not have a built-in function
+for the computation of the beta function, we use the @code{ibeta()} function
+of GNUPlot. As a side effect, we learn how to use GNUPlot as a
+sophisticated calculator. The comparison of means is done as in @code{tutest},
+paragraph 14.2, page 613, and the comparison of variances is done as in @code{ftest},
+page 611 in @cite{Numerical Recipes}.
+@cindex Numerical Recipes
+
+As usual, we take the site-independent code for servers and append
+our own functions @code{SetUpServer()} and @code{HandleGET()}:
+
+@smallexample
+@c file eg/network/statist.awk
+function SetUpServer() @{
+  TopHeader = "<HTML><title>Statistics with GAWK</title>"
+  TopDoc = "<BODY>\
+   <h2>Please choose one of the following actions:</h2>\
+   <UL>\
+    <LI><A HREF=" MyPrefix "/AboutServer>About this server</A></LI>\
+    <LI><A HREF=" MyPrefix "/EnterParameters>Enter Parameters</A></LI>\
+   </UL>"
+  TopFooter  = "</BODY></HTML>"
+  GnuPlot    = "gnuplot 2>&1"
+  m1=m2=0;    v1=v2=1;    n1=n2=10
+@}
+@c endfile
+@end smallexample
+
+Here, you see the menu structure that the user sees. Later, we
+will see how the program structure of the @code{HandleGET()} function
+reflects the menu structure. What is missing here is the link for the
+image we generate. In an event-driven environment, request,
+generation, and delivery of images are separated.
+
+Notice the way we initialize the @code{GnuPlot} command string for
+the pipe. By default,
+GNUPlot outputs the generated image via standard output, as well as
+the results of @code{print}(ed) calculations via standard error.
+The redirection causes standard error to be mixed into standard
+output, enabling us to read results of calculations with @code{getline}.
+By initializing the statistical parameters with some meaningful
+defaults, we make sure the user gets an image the first time
+he uses the program.
+
+@cindex JavaScript
+Following is the rather long function @code{HandleGET()}, which
+implements the contents of this service by reacting to the different
+kinds of requests from the browser. Before you start playing with
+this script, make sure that your browser supports JavaScript and that it also
+has this option switched on. The script uses a short snippet of
+JavaScript code for delayed opening of a window with an image.
+A more detailed explanation follows:
+
+@smallexample
+@c file eg/network/statist.awk
+function HandleGET() @{
+  if (MENU[2] == "AboutServer") @{
+    Document  = "This is a GUI for a statistical computation.\
+      It compares means and variances of two distributions.\
+      It is implemented as one GAWK script and uses GNUPLOT."
+  @} else if (MENU[2] == "EnterParameters") @{
+    Document = ""
+    if ("m1" in GETARG) @{     # are there parameters to compare?
+      Document = Document "<SCRIPT LANGUAGE=\"JavaScript\">\
+        setTimeout(\"window.open(\\\"" MyPrefix "/Image" systime()\
+         "\\\",\\\"dist\\\", \\\"status=no\\\");\", 1000); </SCRIPT>"
+      m1 = GETARG["m1"]; v1 = GETARG["v1"]; n1 = GETARG["n1"]
+      m2 = GETARG["m2"]; v2 = GETARG["v2"]; n2 = GETARG["n2"]
+      t = (m1-m2)/sqrt(v1/n1+v2/n2)
+      df = (v1/n1+v2/n2)*(v1/n1+v2/n2)/((v1/n1)*(v1/n1)/(n1-1) \
+           + (v2/n2)*(v2/n2) /(n2-1))
+      if (v1>v2) @{
+          f = v1/v2
+          df1 = n1 - 1
+          df2 = n2 - 1
+      @} else @{
+          f = v2/v1
+          df1 = n2 - 1
+          df2 = n1 - 1
+      @}
+      print "pt=ibeta(" df/2 ",0.5," df/(df+t*t) ")"  |& GnuPlot
+      print "pF=2.0*ibeta(" df2/2 "," df1/2 "," \
+            df2/(df2+df1*f) ")"                    |& GnuPlot
+      print "print pt, pF"                         |& GnuPlot
+      RS="\n"; GnuPlot |& getline; RS="\r\n"    # $1 is pt, $2 is pF
+      print "invsqrt2pi=1.0/sqrt(2.0*pi)"          |& GnuPlot
+      print "nd(x)=invsqrt2pi/sd*exp(-0.5*((x-mu)/sd)**2)" |& GnuPlot
+      print "set term png small color"             |& GnuPlot
+      #print "set term postscript color"           |& GnuPlot
+      #print "set term gif medium size 320,240"    |& GnuPlot
+      print "set yrange[-0.3:]"                    |& GnuPlot
+      print "set label 'p(m1=m2) =" $1 "' at 0,-0.1 left"  |& GnuPlot
+      print "set label 'p(v1=v2) =" $2 "' at 0,-0.2 left"  |& GnuPlot
+      print "plot mu=" m1 ",sd=" sqrt(v1) ", nd(x) title 'sample 1',\
+        mu=" m2 ",sd=" sqrt(v2) ", nd(x) title 'sample 2'" |& GnuPlot
+      print "quit"                                         |& GnuPlot
+      GnuPlot |& getline Image
+      while ((GnuPlot |& getline) > 0)
+          Image = Image RS $0
+      close(GnuPlot)
+    @}
+    Document = Document "\
+    <h3>Do these samples have the same Gaussian distribution?</h3>\
+    <FORM METHOD=GET> <TABLE BORDER CELLPADDING=5>\
+    <TR>\
+    <TD>1. Mean    </TD>
+    <TD><input type=text name=m1 value=" m1 " size=8></TD>\
+    <TD>1. Variance</TD>
+    <TD><input type=text name=v1 value=" v1 " size=8></TD>\
+    <TD>1. Count   </TD>
+    <TD><input type=text name=n1 value=" n1 " size=8></TD>\
+    </TR><TR>\
+    <TD>2. Mean    </TD>
+    <TD><input type=text name=m2 value=" m2 " size=8></TD>\
+    <TD>2. Variance</TD>
+    <TD><input type=text name=v2 value=" v2 " size=8></TD>\
+    <TD>2. Count   </TD>
+    <TD><input type=text name=n2 value=" n2 " size=8></TD>\
+    </TR>                   <input type=submit value=\"Compute\">\
+    </TABLE></FORM><BR>"
+  @} else if (MENU[2] ~ "Image") @{
+    Reason = "OK" ORS "Content-type: image/png"
+    #Reason = "OK" ORS "Content-type: application/x-postscript"
+    #Reason = "OK" ORS "Content-type: image/gif"
+    Header = Footer = ""
+    Document = Image
+  @}
+@}
+@c endfile
+@end smallexample
+
+@cindex PostScript
+As usual, we give a short description of the service in the first
+menu choice. The third menu choice shows us that generation and
+presentation of an image are two separate actions. While the latter
+takes place quite instantly in the third menu choice, the former
+takes place in the much longer second choice. Image data passes from the
+generating action to the presenting action via the variable @code{Image}
+that contains a complete @file{.png} image, which is otherwise stored
+in a file. If you prefer @file{.ps} or @file{.gif} images over the
+default @file{.png} images, you may select these options by uncommenting
+the appropriate lines. But remember to do so in two places: when
+telling GNUPlot which kind of images to generate, and when transmitting the
+image at the end of the program.
+
+Looking at the end of the program,
+the way we pass the @samp{Content-type} to the browser is a bit unusual.
+It is appended to the @samp{OK} of the first header line
+to make sure the type information becomes part of the header.
+The other variables that get transmitted across the network are
+made empty, because in this case we do not have an HTML document to
+transmit, but rather raw image data to contain in the body.
+
+Most of the work is done in the second menu choice. It starts with a
+strange JavaScript code snippet. When first implementing this server,
+we used a short @code{@w{"<IMG SRC="} MyPrefix "/Image>"} here. But then
+browsers got smarter and tried to improve on speed by requesting the
+image and the HTML code at the same time. When doing this, the browser
+tries to build up a connection for the image request while the request for
+the HTML text is not yet completed. The browser tries to connect
+to the @command{gawk} server on port 8080 while port 8080 is still in use for
+transmission of the HTML text. The connection for the image cannot be
+built up, so the image appears as ``broken'' in the browser window.
+We solved this problem by telling the browser to open a separate window
+for the image, but only after a delay of 1000 milliseconds.
+By this time, the server should be ready for serving the next request.
+
+But there is one more subtlety in the JavaScript code.
+Each time the JavaScript code opens a window for the image, the
+name of the image is appended with a timestamp (@code{systime()}).
+Why this constant change of name for the image? Initially, we always named
+the image @code{Image}, but then the Netscape browser noticed the name
+had @emph{not} changed since the previous request and displayed the
+previous image (caching behavior). The server core
+is implemented so that browsers are told @emph{not} to cache anything.
+Obviously HTTP requests do not always work as expected. One way to
+circumvent the cache of such overly smart browsers is to change the
+name of the image with each request. These three lines of JavaScript
+caused us a lot of trouble.
+
+The rest can be broken
+down into two phases. At first, we check if there are statistical
+parameters. When the program is first started, there usually are no
+parameters because it enters the page coming from the top menu.
+Then, we only have to present the user a form that he can use to change
+statistical parameters and submit them. Subsequently, the submission of
+the form causes the execution of the first phase because @emph{now}
+there @emph{are} parameters to handle.
+
+Now that we have parameters, we know there will be an image available.
+Therefore we insert the JavaScript code here to initiate the opening
+of the image in a separate window. Then,
+we prepare some variables that will be passed to GNUPlot for calculation
+of the probabilities. Prior to reading the results, we must temporarily
+change @code{RS} because GNUPlot separates lines with newlines.
+After instructing GNUPlot to generate a @file{.png} (or @file{.ps} or
+@file{.gif}) image, we initiate the insertion of some text,
+explaining the resulting probabilities. The final @samp{plot} command
+actually generates the image data. This raw binary has to be read in carefully
+without adding, changing, or deleting a single byte. Hence the unusual
+initialization of @code{Image} and completion with a @code{while} loop.
+
+When using this server, it soon becomes clear that it is far from being
+perfect. It mixes source code of six scripting languages or protocols:
+
+@itemize @bullet
+@item GNU @command{awk} implements a server for the protocol:
+@item HTTP which transmits:
+@item HTML text which contains a short piece of:
+@item JavaScript code opening a separate window.
+@item A Bourne shell script is used for piping commands into:
+@item GNUPlot to generate the image to be opened.
+@end itemize
+
+After all this work, the GNUPlot image opens in the JavaScript window
+where it can be viewed by the user.
+
+It is probably better not to mix up so many different languages.
+The result is not very readable.  Furthermore, the
+statistical part of the server does not take care of invalid input.
+Among others, using negative variances will cause invalid results.
+
+@node MAZE, MOBAGWHO, STATIST, Some Applications and Techniques
+@section MAZE: Walking Through a Maze In Virtual Reality
+@cindex MAZE
+@cindex VRML
+@c VRML in iX 11/96 134.
+@quotation
+@cindex Perlis, Alan
+@i{In the long run, every program becomes rococo, and then rubble.}@*
+Alan Perlis
+@end quotation
+
+By now, we know how to present arbitrary @samp{Content-type}s to a browser.
+In this @value{SECTION}, our server will present a 3D world to our browser.
+The 3D world is described in a scene description language (VRML,
+Virtual Reality Modeling Language) that allows us to travel through a
+perspective view of a 2D maze with our browser. Browsers with a
+VRML plugin enable exploration of this technology. We could do
+one of those boring @samp{Hello world} examples here, that are usually
+presented when introducing novices to
+VRML. If you have never written
+any VRML code, have a look at
+the VRML FAQ.
+Presenting a static VRML scene is a bit trivial; in order to expose
+@command{gawk}'s new capabilities, we will present a dynamically generated
+VRML scene. The function @code{SetUpServer()} is very simple because it
+only sets the default HTML page and initializes the random number
+generator. As usual, the surrounding server lets you browse the maze.
+
+@smallexample
+@c file eg/network/maze.awk
+function SetUpServer() @{
+  TopHeader = "<HTML><title>Walk through a maze</title>"
+  TopDoc = "\
+    <h2>Please choose one of the following actions:</h2>\
+    <UL>\
+      <LI><A HREF=" MyPrefix "/AboutServer>About this server</A>\
+      <LI><A HREF=" MyPrefix "/VRMLtest>Watch a simple VRML scene</A>\
+    </UL>"
+  TopFooter  = "</HTML>"
+  srand()
+@}
+@c endfile
+@end smallexample
+
+The function @code{HandleGET()} is a bit longer because it first computes
+the maze and afterwards generates the VRML code that is sent across
+the network. As shown in the STATIST example
+(@pxref{STATIST}),
+we set the type of the
+content to VRML and then store the VRML representation of the maze as the
+page content. We assume that the maze is stored in a 2D array. Initially,
+the maze consists of walls only. Then, we add an entry and an exit to the
+maze and let the rest of the work be done by the function @code{MakeMaze()}.
+Now, only the wall fields are left in the maze. By iterating over the these
+fields, we generate one line of VRML code for each wall field.
+
+@smallexample
+@c file eg/network/maze.awk
+function HandleGET() @{
+  if (MENU[2] == "AboutServer") @{
+    Document  = "If your browser has a VRML 2 plugin,\
+      this server shows you a simple VRML scene."
+  @} else if (MENU[2] == "VRMLtest") @{
+    XSIZE = YSIZE = 11              # initially, everything is wall
+    for (y = 0; y < YSIZE; y++)
+       for (x = 0; x < XSIZE; x++)
+          Maze[x, y] = "#"
+    delete Maze[0, 1]              # entry is not wall
+    delete Maze[XSIZE-1, YSIZE-2]  # exit  is not wall
+    MakeMaze(1, 1)
+    Document = "\
+#VRML V2.0 utf8\n\
+Group @{\n\
+  children [\n\
+    PointLight @{\n\
+      ambientIntensity 0.2\n\
+      color 0.7 0.7 0.7\n\
+      location 0.0 8.0 10.0\n\
+    @}\n\
+    DEF B1 Background @{\n\
+      skyColor [0 0 0, 1.0 1.0 1.0 ]\n\
+      skyAngle 1.6\n\
+      groundColor [1 1 1, 0.8 0.8 0.8, 0.2 0.2 0.2 ]\n\
+      groundAngle [ 1.2 1.57 ]\n\
+    @}\n\
+    DEF Wall Shape @{\n\
+      geometry Box @{size 1 1 1@}\n\
+      appearance Appearance @{ material Material @{ diffuseColor 0 0 1 @} @}\n\
+    @}\n\
+    DEF Entry Viewpoint @{\n\
+      position 0.5 1.0 5.0\n\
+      orientation 0.0 0.0 -1.0 0.52\n\
+    @}\n"
+    for (i in Maze) @{
+      split(i, t, SUBSEP)
+      Document = Document "    Transform @{ translation "
+      Document = Document t[1] " 0 -" t[2] " children USE Wall @}\n"
+    @}
+    Document = Document "  ] # end of group for world\n@}"
+    Reason = "OK" ORS "Content-type: model/vrml"
+    Header = Footer = ""
+  @}
+@}
+@c endfile
+@end smallexample
+
+Finally, we have a look at @code{MakeMaze()}, the function that generates
+the @code{Maze} array. When entered, this function assumes that the array
+has been initialized so that each element represents a wall element and
+the maze is initially full of wall elements. Only the entrance and the exit
+of the maze should have been left free. The parameters of the function tell
+us which element must be marked as not being a wall. After this, we take
+a look at the four neighboring elements and remember which we have already
+treated. Of all the neighboring elements, we take one at random and
+walk in that direction. Therefore, the wall element in that direction has
+to be removed and then, we call the function recursively for that element.
+The maze is only completed if we iterate the above procedure for
+@emph{all} neighboring elements (in random order) and for our present
+element by recursively calling the function for the present element. This
+last iteration could have been done in a loop,
+but it is done much simpler recursively.
+
+Notice that elements with coordinates that are both odd are assumed to be
+on our way through the maze and the generating process cannot terminate
+as long as there is such an element not being @code{delete}d. All other
+elements are potentially part of the wall.
+
+@smallexample
+@c file eg/network/maze.awk
+function MakeMaze(x, y) @{
+  delete Maze[x, y]     # here we are, we have no wall here
+  p = 0                 # count unvisited fields in all directions
+  if (x-2 SUBSEP y   in Maze) d[p++] = "-x"
+  if (x   SUBSEP y-2 in Maze) d[p++] = "-y"
+  if (x+2 SUBSEP y   in Maze) d[p++] = "+x"
+  if (x   SUBSEP y+2 in Maze) d[p++] = "+y"
+  if (p>0) @{            # if there are unvisited fields, go there
+    p = int(p*rand())   # choose one unvisited field at random
+    if        (d[p] == "-x") @{ delete Maze[x - 1, y]; MakeMaze(x - 2, y)
+    @} else if (d[p] == "-y") @{ delete Maze[x, y - 1]; MakeMaze(x, y - 2)
+    @} else if (d[p] == "+x") @{ delete Maze[x + 1, y]; MakeMaze(x + 2, y)
+    @} else if (d[p] == "+y") @{ delete Maze[x, y + 1]; MakeMaze(x, y + 2)
+    @}                   # we are back from recursion
+    MakeMaze(x, y);     # try again while there are unvisited fields
+  @}
+@}
+@c endfile
+@end smallexample
+
+@node MOBAGWHO, STOXPRED, MAZE, Some Applications and Techniques
+@section MOBAGWHO: a Simple Mobile Agent
+@cindex MOBAGWHO program
+@cindex agent
+@quotation
+@cindex Hoare, C.A.R.
+@i{There are two ways of constructing a software design: One way is to
+make it so simple that there are obviously no deficiencies, and the
+other way is to make it so complicated that there are no obvious
+deficiencies.} @*
+C. A. R. Hoare
+@end quotation
+
+A @dfn{mobile agent} is a program that can be dispatched from a computer and
+transported to a remote server for execution. This is called @dfn{migration},
+which means that a process on another system is started that is independent
+from its originator. Ideally, it wanders through
+a network while working for its creator or owner. In places like
+the UMBC Agent Web,
+people are quite confident that (mobile) agents are a software engineering
+paradigm that enables us to significantly increase the efficiency
+of our work. Mobile agents could become the mediators between users and
+the networking world. For an unbiased view at this technology,
+see the remarkable paper @cite{Mobile Agents: Are they a good
+idea?}.@footnote{@uref{http://www.research.ibm.com/massive/mobag.ps}}
+
+When trying to migrate a process from one system to another,
+a server process is needed on the receiving side. Depending on the kind
+of server process, several ways of implementation come to mind.
+How the process is implemented depends upon the kind of server process:
+
+@itemize @bullet
+@item
+HTTP can be used as the protocol for delivery of the migrating
+process. In this case, we use a common web
+server as the receiving server process. A universal CGI script
+mediates between migrating process and web server.
+Each server willing to accept migrating agents makes this universal
+service available. HTTP supplies the @code{POST} method to transfer
+some data to a file on the web server. When a CGI script is called
+remotely with the @code{POST} method instead of the usual @code{GET} method,
+data is transmitted from the client process to the standard input
+of the server's CGI script. So, to implement a mobile agent,
+we must not only write the agent program to start on the client
+side, but also the CGI script to receive the agent on the server side.
+
+@cindex CGI (Common Gateway Interface)
+@cindex apache
+@item
+The @code{PUT} method can also be used for migration. HTTP does not
+require a CGI script for migration via @code{PUT}. However, with common web
+servers there is no advantage to this solution, because web servers such as
+Apache
+require explicit activation of a special @code{PUT} script.
+
+@item
+@cite{Agent Tcl} pursues a different course; it relies on a dedicated server
+process with a dedicated protocol specialized for receiving mobile agents.
+@end itemize
+
+Our agent example abuses a common web server as a migration tool. So, it needs a
+universal CGI script on the receiving side (the web server). The receiving script is
+activated with a @code{POST} request when placed into a location like
+@file{/httpd/cgi-bin/PostAgent.sh}. Make sure that the server system uses a
+version of @command{gawk} that supports network access (Version 3.1 or later;
+verify with @samp{gawk --version}).
+
+@example
+@c file eg/network/PostAgent.sh
+#!/bin/sh
+MobAg=/tmp/MobileAgent.$$
+# direct script to mobile agent file
+cat > $MobAg
+# execute agent concurrently
+gawk -f $MobAg $MobAg > /dev/null &
+# HTTP header, terminator and body
+gawk 'BEGIN @{ print "\r\nAgent started" @}'
+rm $MobAg      # delete script file of agent
+@c endfile
+@end example
+
+By making its process id (@code{$$}) part of the unique @value{FN}, the
+script avoids conflicts between concurrent instances of the script.
+First, all lines
+from standard input (the mobile agent's source code) are copied into
+this unique file. Then, the agent is started as a concurrent process
+and a short message reporting this fact is sent to the submitting client.
+Finally, the script file of the mobile agent is removed because it is
+no longer needed. Although it is a short script, there are several noteworthy
+points:
+
+@table @asis
+@item Security
+@emph{There is none}. In fact, the CGI script should never
+be made available on a server that is part of the Internet because everyone
+would be allowed to execute arbitrary commands with it. This behavior is
+acceptable only when performing rapid prototyping.
+
+@item Self-Reference
+Each migrating instance of an agent is started
+in a way that enables it to read its own source code from standard input
+and use the code for subsequent
+migrations. This is necessary because it needs to treat the agent's code
+as data to transmit. @command{gawk} is not the ideal language for such
+a job. Lisp and Tcl are more suitable because they do not make a distinction
+between program code and data.
+
+@item Independence
+After migration, the agent is not linked to its
+former home in any way. By reporting @samp{Agent started}, it waves
+``Goodbye'' to its origin. The originator may choose to terminate or not.
+@end table
+
+@cindex Lisp
+The originating agent itself is started just like any other command-line
+script, and reports the results on standard output.  By letting the name
+of the original host migrate with the agent, the agent that migrates
+to a host far away from its origin can report the result back home.
+Having arrived at the end of the journey, the agent establishes
+a connection and reports the results.  This is the reason for
+determining the name of the host with @samp{uname -n} and storing it
+in @code{MyOrigin} for later use.  We may also set variables with the
+@option{-v} option from the command line. This interactivity is only
+of importance in the context of starting a mobile agent; therefore this
+@code{BEGIN} pattern and its action do not take part in migration:
+
+@smallexample
+@c file eg/network/mobag.awk
+BEGIN @{
+  if (ARGC != 2) @{
+    print "MOBAG - a simple mobile agent"
+    print "CALL:\n    gawk -f mobag.awk mobag.awk"
+    print "IN:\n    the name of this script as a command-line parameter"
+    print "PARAM:\n    -v MyOrigin=myhost.com"
+    print "OUT:\n    the result on stdout"
+    print "JK 29.03.1998 01.04.1998"
+    exit
+  @}
+  if (MyOrigin == "") @{
+     "uname -n" | getline MyOrigin
+     close("uname -n")
+  @}
+@}
+@c endfile
+@end smallexample
+
+Since @command{gawk} cannot manipulate and transmit parts of the program
+directly, the source code is read and stored in strings.
+Therefore, the program scans itself for
+the beginning and the ending of functions.
+Each line in between is appended to the code string until the end of
+the function has been reached. A special case is this part of the program
+itself. It is not a function.
+Placing a similar framework around it causes it to be treated
+like a function. Notice that this mechanism works for all the
+functions of the source code, but it cannot guarantee that the order
+of the functions is preserved during migration:
+
+@smallexample
+@c file eg/network/mobag.awk
+#ReadMySelf
+/^function /                     @{ FUNC = $2 @}
+/^END/ || /^#ReadMySelf/         @{ FUNC = $1 @}
+FUNC != ""                       @{ MOBFUN[FUNC] = MOBFUN[FUNC] RS $0 @}
+(FUNC != "") && (/^@}/ || /^#EndOfMySelf/) \
+                                 @{ FUNC = "" @}
+#EndOfMySelf
+@c endfile
+@end smallexample
+
+The web server code in
+@ref{Interacting Service, ,A Web Service with Interaction},
+was first developed as a site-independent core. Likewise, the
+@command{gawk}-based mobile agent
+starts with an agent-independent core, to which can be appended
+application-dependent functions.  What follows is the only
+application-independent function needed for the mobile agent:
+
+@smallexample
+@c file eg/network/mobag.awk
+function migrate(Destination, MobCode, Label) @{
+  MOBVAR["Label"] = Label
+  MOBVAR["Destination"] = Destination
+  RS = ORS = "\r\n"
+  HttpService = "/inet/tcp/0/" Destination
+  for (i in MOBFUN)
+     MobCode = (MobCode "\n" MOBFUN[i])
+  MobCode = MobCode  "\n\nBEGIN @{"
+  for (i in MOBVAR)
+     MobCode = (MobCode "\n  MOBVAR[\"" i "\"] = \"" MOBVAR[i] "\"")
+  MobCode = MobCode "\n@}\n"
+  print "POST /cgi-bin/PostAgent.sh HTTP/1.0"  |& HttpService
+  print "Content-length:", length(MobCode) ORS |& HttpService
+  printf "%s", MobCode                         |& HttpService
+  while ((HttpService |& getline) > 0)
+     print $0
+  close(HttpService)
+@}
+@c endfile
+@end smallexample
+
+The @code{migrate()} function prepares the
+aforementioned strings containing the program code and transmits them to a
+server. A consequence of this modular approach is that the @code{migrate()}
+function takes some parameters that aren't needed in this application,
+but that will be in future ones. Its mandatory parameter @code{Destination} holds the
+name (or IP address) of the server that the agent wants as a host for its
+code. The optional parameter @code{MobCode} may contain some @command{gawk}
+code that is inserted during migration in front of all other code.
+The optional parameter @code{Label} may contain
+a string that tells the agent what to do in program execution after
+arrival at its new home site. One of the serious obstacles in implementing
+a framework for mobile agents is that it does not suffice to migrate the
+code. It is also necessary to migrate the state of execution of the agent. In
+contrast to @cite{Agent Tcl}, this program does not try to migrate the complete set
+of variables. The following conventions are used:
+
+@itemize @bullet
+@item
+Each variable in an agent program is local to the current host and does
+@emph{not} migrate.
+
+@item
+The array @code{MOBFUN} shown above is an exception. It is handled
+by the function @code{migrate()} and does migrate with the application.
+
+@item
+The other exception is the array @code{MOBVAR}. Each variable that
+takes part in migration has to be an element of this array.
+@code{migrate()} also takes care of this.
+@end itemize
+
+Now it's clear what happens to the @code{Label} parameter of the
+function @code{migrate()}. It is copied into @code{MOBVAR["Label"]} and
+travels alongside the other data. Since travelling takes place via HTTP,
+records must be separated with @code{"\r\n"} in @code{RS} and
+@code{ORS} as usual. The code assembly for migration takes place in
+three steps:
+
+@itemize @bullet
+@item
+Iterate over @code{MOBFUN} to collect all functions verbatim.
+
+@item
+Prepare a @code{BEGIN} pattern and put assignments to mobile
+variables into the action part.
+
+@item
+Transmission itself resembles GETURL: the header with the request
+and the @code{Content-length} is followed by the body. In case there is
+any reply over the network, it is read completely and echoed to
+standard output to avoid irritating the server.
+@end itemize
+
+The application-independent framework is now almost complete. What follows
+is the @code{END} pattern that is executed  when the mobile agent has
+finished reading its own code. First, it checks whether it is already
+running on a remote host or not. In case initialization has not yet taken
+place, it starts @code{MyInit()}. Otherwise (later, on a remote host), it
+starts @code{MyJob()}:
+
+@smallexample
+@c file eg/network/mobag.awk
+END @{
+  if (ARGC != 2) exit    # stop when called with wrong parameters
+  if (MyOrigin != "")    # is this the originating host?
+    MyInit()             # if so, initialize the application
+  else                   # we are on a host with migrated data
+    MyJob()              # so we do our job
+@}
+@c endfile
+@end smallexample
+
+All that's left to extend the framework into a complete application
+is to write two application-specific functions: @code{MyInit()} and
+@code{MyJob()}. Keep in mind that the former is executed once on the
+originating host, while the latter is executed after each migration:
+
+@smallexample
+@c file eg/network/mobag.awk
+function MyInit() @{
+  MOBVAR["MyOrigin"] = MyOrigin
+  MOBVAR["Machines"] = "localhost/80 max/80 moritz/80 castor/80"
+  split(MOBVAR["Machines"], Machines)           # which host is the first?
+  migrate(Machines[1], "", "")                  # go to the first host
+  while (("/inet/tcp/8080/0/0" |& getline) > 0) # wait for result
+    print $0                                    # print result
+  close("/inet/tcp/8080/0/0")
+@}
+@c endfile
+@end smallexample
+
+As mentioned earlier, this agent takes the name of its origin
+(@code{MyOrigin}) with it. Then, it takes the name of its first
+destination and goes there for further work. Notice that this name has
+the port number of the web server appended to the name of the server,
+because the function @code{migrate()} needs it this way to create
+the @code{HttpService} variable. Finally, it waits for the result to arrive.
+The @code{MyJob()} function runs on the remote host:
+
+@smallexample
+@c file eg/network/mobag.awk
+function MyJob() @{
+  # forget this host
+  sub(MOBVAR["Destination"], "", MOBVAR["Machines"])
+  MOBVAR["Result"]=MOBVAR["Result"] SUBSEP SUBSEP MOBVAR["Destination"] ":"
+  while (("who" | getline) > 0)               # who is logged in?
+    MOBVAR["Result"] = MOBVAR["Result"] SUBSEP $0
+  close("who")
+  if (index(MOBVAR["Machines"], "/") > 0) @{   # any more machines to visit?
+    split(MOBVAR["Machines"], Machines)       # which host is next?
+    migrate(Machines[1], "", "")              # go there
+  @} else @{                                    # no more machines
+    gsub(SUBSEP, "\n", MOBVAR["Result"])      # send result to origin
+    print MOBVAR["Result"] |& "/inet/tcp/0/" MOBVAR["MyOrigin"] "/8080"
+    close("/inet/tcp/0/" MOBVAR["MyOrigin"] "/8080")
+  @}
+@}
+@c endfile
+@end smallexample
+
+After migrating, the first thing to do in @code{MyJob()} is to delete
+the name of the current host from the list of hosts to visit. Now, it
+is time to start the real work by appending the host's name to the
+result string, and reading line by line who is logged in on this host.
+A very annoying circumstance is the fact that the elements of
+@code{MOBVAR} cannot hold the newline character (@code{"\n"}). If they
+did, migration of this string did not work because the string didn't
+obey the syntax rule for a string in @command{gawk}.
+@code{SUBSEP} is used as a temporary replacement.
+If the list of hosts to visit holds
+at least one more entry, the agent migrates to that place to go on
+working there. Otherwise, we replace the @code{SUBSEP}s
+with a newline character in the resulting string, and report it to
+the originating host, whose name is stored in @code{MOBVAR["MyOrigin"]}.
+
+@node STOXPRED, PROTBASE, MOBAGWHO, Some Applications and Techniques
+@section STOXPRED: Stock Market Prediction As A Service
+@cindex STOXPRED program
+@cindex Yahoo!
+@quotation
+@i{Far out in the uncharted backwaters of the unfashionable end of
+the Western Spiral arm of the Galaxy lies a small unregarded yellow sun.}
+
+@i{Orbiting this at a distance of roughly ninety-two million miles is an
+utterly insignificant little blue-green planet whose ape-descendent life
+forms are so amazingly primitive that they still think digital watches are
+a pretty neat idea.}
+
+@i{This planet has --- or rather had --- a problem, which was this:
+most of the people living on it were unhappy for pretty much of the time.
+Many solutions were suggested for this problem, but most of these were
+largely concerned with the movements of small green pieces of paper,
+which is odd because it wasn't the small green pieces of paper that
+were unhappy.} @*
+Douglas Adams, @cite{The Hitch Hiker's Guide to the Galaxy}
+@end quotation
+
+@cindex @command{cron} utility
+Valuable services on the Internet are usually @emph{not} implemented
+as mobile agents. There are much simpler ways of implementing services.
+All Unix systems provide, for example, the @command{cron} service.
+Unix system users can write a list of tasks to be done each day, each
+week, twice a day, or just once. The list is entered into a file named
+@file{crontab}.  For example, to distribute a newsletter on a daily
+basis this way, use @command{cron} for calling a script each day early
+in the morning.
+
+@example
+# run at 8 am on weekdays, distribute the newsletter
+0 8 * * 1-5   $HOME/bin/daily.job >> $HOME/log/newsletter 2>&1
+@end example
+
+The script first looks for interesting information on the Internet,
+assembles it in a nice form and sends the results via email to
+the customers.
+
+The following is an example of a primitive
+newsletter on stock market prediction. It is a report which first
+tries to predict the change of each share in the Dow Jones Industrial
+Index for the particular day. Then it mentions some especially
+promising shares as well as some shares which look remarkably bad
+on that day. The report ends with the usual disclaimer which tells
+every child @emph{not} to try this at home and hurt anybody.
+@cindex Dow Jones Industrial Index
+
+@smallexample
+Good morning Uncle Scrooge,
+
+This is your daily stock market report for Monday, October 16, 2000.
+Here are the predictions for today:
+
+        AA      neutral
+        GE      up
+        JNJ     down
+        MSFT    neutral
+        @dots{}
+        UTX     up
+        DD      down
+        IBM     up
+        MO      down
+        WMT     up
+        DIS     up
+        INTC    up
+        MRK     down
+        XOM     down
+        EK      down
+        IP      down
+
+The most promising shares for today are these:
+
+        INTC            http://biz.yahoo.com/n/i/intc.html
+
+The stock shares to avoid today are these:
+
+        EK              http://biz.yahoo.com/n/e/ek.html
+        IP              http://biz.yahoo.com/n/i/ip.html
+        DD              http://biz.yahoo.com/n/d/dd.html
+        @dots{}
+@end smallexample
+
+The script as a whole is rather long. In order to ease the pain of
+studying other people's source code, we have broken the script
+up into meaningful parts which are invoked one after the other.
+The basic structure of the script is as follows:
+
+@example
+@c file eg/network/stoxpred.awk
+BEGIN @{
+  Init()
+  ReadQuotes()
+  CleanUp()
+  Prediction()
+  Report()
+  SendMail()
+@}
+@c endfile
+@end example
+
+The earlier parts store data into variables and arrays which are
+subsequently used by later parts of the script. The @code{Init()} function
+first checks if the script is invoked correctly (without any parameters).
+If not, it informs the user of the correct usage. What follows are preparations
+for the retrieval of the historical quote data. The names of the 30 stock
+shares are stored in an array @code{name} along with the current date
+in @code{day}, @code{month}, and @code{year}.
+
+All users who are separated
+from the Internet by a firewall and have to direct their Internet accesses
+to a proxy must supply the name of the proxy to this script with the
+@samp{-v Proxy=@var{name}} option. For most users, the default proxy and
+port number should suffice.
+
+@example
+@c file eg/network/stoxpred.awk
+function Init() @{
+  if (ARGC != 1) @{
+    print "STOXPRED - daily stock share prediction"
+    print "IN:\n    no parameters, nothing on stdin"
+    print "PARAM:\n    -v Proxy=MyProxy -v ProxyPort=80"
+    print "OUT:\n    commented predictions as email"
+    print "JK 09.10.2000"
+    exit
+  @}
+  # Remember ticker symbols from Dow Jones Industrial Index
+  StockCount = split("AA GE JNJ MSFT AXP GM JPM PG BA HD KO \
+    SBC C HON MCD T CAT HWP MMM UTX DD IBM MO WMT DIS INTC \
+    MRK XOM EK IP", name);
+  # Remember the current date as the end of the time series
+  day   = strftime("%d")
+  month = strftime("%m")
+  year  = strftime("%Y")
+  if (Proxy     == "")  Proxy     = "chart.yahoo.com"
+  if (ProxyPort ==  0)  ProxyPort = 80
+  YahooData = "/inet/tcp/0/" Proxy "/" ProxyPort
+@}
+@c endfile
+@end example
+
+@cindex CSV format
+There are two really interesting parts in the script. One is the
+function which reads the historical stock quotes from an Internet
+server. The other is the one that does the actual prediction. In
+the following function we see how the quotes are read from the
+Yahoo server. The data which comes from the server is in
+CSV format (comma-separated values):
+
+@example
+@c file eg/network/stoxdata.txt
+Date,Open,High,Low,Close,Volume
+9-Oct-00,22.75,22.75,21.375,22.375,7888500
+6-Oct-00,23.8125,24.9375,21.5625,22,10701100
+5-Oct-00,24.4375,24.625,23.125,23.50,5810300
+@c endfile
+@end example
+
+Lines contain values of the same time instant, whereas columns are
+separated by commas and contain the kind of data that is described
+in the header (first) line. At first, @command{gawk} is instructed to
+separate columns by commas (@samp{FS = ","}). In the loop that follows,
+a connection to the Yahoo server is first opened, then a download takes
+place, and finally the connection is closed. All this happens once for
+each ticker symbol. In the body of this loop, an Internet address is
+built up as a string according to the rules of the Yahoo server. The
+starting and ending date are chosen to be exactly the same, but one year
+apart in the past. All the action is initiated within the @code{printf}
+command which transmits the request for data to the Yahoo server.
+
+In the inner loop, the server's data is first read and then scanned
+line by line. Only lines which have six columns and the name of a month
+in the first column contain relevant data. This data is stored
+in the two-dimensional array @code{quote}; one dimension
+being time, the other being the ticker symbol. During retrieval of the
+first stock's data, the calendar names of the time instances are stored
+in the array @code{day} because we need them later.
+
+@smallexample
+@c file eg/network/stoxpred.awk
+function ReadQuotes() @{
+  # Retrieve historical data for each ticker symbol
+  FS = ","
+  for (stock = 1; stock <= StockCount; stock++) @{
+    URL = "http://chart.yahoo.com/table.csv?s=" name[stock] \
+          "&a=" month "&b=" day   "&c=" year-1 \
+          "&d=" month "&e=" day   "&f=" year \
+          "g=d&q=q&y=0&z=" name[stock] "&x=.csv"
+    printf("GET " URL " HTTP/1.0\r\n\r\n") |& YahooData
+    while ((YahooData |& getline) > 0) @{
+      if (NF == 6 && $1 ~ /Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec/) @{
+        if (stock == 1)
+          days[++daycount] = $1;
+        quote[$1, stock] = $5
+      @}
+    @}
+    close(YahooData)
+  @}
+  FS = " "
+@}
+@c endfile
+@end smallexample
+
+Now that we @emph{have} the data, it can be checked once again to make sure
+that no individual stock is missing or invalid, and that all the stock quotes are
+aligned correctly. Furthermore, we renumber the time instances. The
+most recent day gets day number 1 and all other days get consecutive
+numbers. All quotes are rounded toward the nearest whole number in US Dollars.
+
+@smallexample
+@c file eg/network/stoxpred.awk
+function CleanUp() @{
+  # clean up time series; eliminate incomplete data sets
+  for (d = 1; d <= daycount; d++) @{
+    for (stock = 1; stock <= StockCount; stock++)
+      if (! ((days[d], stock) in quote))
+          stock = StockCount + 10
+    if (stock > StockCount + 1)
+        continue
+    datacount++
+    for (stock = 1; stock <= StockCount; stock++)
+      data[datacount, stock] = int(0.5 + quote[days[d], stock])
+  @}
+  delete quote
+  delete days
+@}
+@c endfile
+@end smallexample
+
+Now we have arrived at the second really interesting part of the whole affair.
+What we present here is a very primitive prediction algorithm:
+@emph{If a stock fell yesterday, assume it will also fall today; if
+it rose yesterday, assume it will rise today}.  (Feel free to replace this
+algorithm with a smarter one.) If a stock changed in the same direction
+on two consecutive days, this is an indication which should be highlighted.
+Two-day advances are stored in @code{hot} and two-day declines in
+@code{avoid}.
+
+The rest of the function is a sanity check. It counts the number of
+correct predictions in relation to the total number of predictions
+one could have made in the year before.
+
+@smallexample
+@c file eg/network/stoxpred.awk
+function Prediction() @{
+  # Predict each ticker symbol by prolonging yesterday's trend
+  for (stock = 1; stock <= StockCount; stock++) @{
+    if         (data[1, stock] > data[2, stock]) @{
+      predict[stock] = "up"
+    @} else if  (data[1, stock] < data[2, stock]) @{
+      predict[stock] = "down"
+    @} else @{
+      predict[stock] = "neutral"
+    @}
+    if ((data[1, stock] > data[2, stock]) && (data[2, stock] > data[3, stock]))
+      hot[stock] = 1
+    if ((data[1, stock] < data[2, stock]) && (data[2, stock] < data[3, stock]))
+      avoid[stock] = 1
+  @}
+  # Do a plausibility check: how many predictions proved correct?
+  for (s = 1; s <= StockCount; s++) @{
+    for (d = 1; d <= datacount-2; d++) @{
+      if         (data[d+1, s] > data[d+2, s]) @{
+        UpCount++
+      @} else if  (data[d+1, s] < data[d+2, s]) @{
+        DownCount++
+      @} else @{
+        NeutralCount++
+      @}
+      if (((data[d, s]  > data[d+1, s]) && (data[d+1, s]  > data[d+2, s])) ||
+          ((data[d, s]  < data[d+1, s]) && (data[d+1, s]  < data[d+2, s])) ||
+          ((data[d, s] == data[d+1, s]) && (data[d+1, s] == data[d+2, s])))
+        CorrectCount++
+    @}
+  @}
+@}
+@c endfile
+@end smallexample
+
+At this point the hard work has been done: the array @code{predict}
+contains the predictions for all the ticker symbols. It is up to the
+function @code{Report()} to find some nice words to introduce the
+desired information.
+
+@smallexample
+@c file eg/network/stoxpred.awk
+function Report() @{
+  # Generate report
+  report =        "\nThis is your daily "
+  report = report "stock market report for "strftime("%A, %B %d, %Y")".\n"
+  report = report "Here are the predictions for today:\n\n"
+  for (stock = 1; stock <= StockCount; stock++)
+    report = report "\t" name[stock] "\t" predict[stock] "\n"
+  for (stock in hot) @{
+    if (HotCount++ == 0)
+      report = report "\nThe most promising shares for today are these:\n\n"
+    report = report "\t" name[stock] "\t\thttp://biz.yahoo.com/n/" \
+      tolower(substr(name[stock], 1, 1)) "/" tolower(name[stock]) ".html\n"
+  @}
+  for (stock in avoid) @{
+    if (AvoidCount++ == 0)
+      report = report "\nThe stock shares to avoid today are these:\n\n"
+    report = report "\t" name[stock] "\t\thttp://biz.yahoo.com/n/" \
+      tolower(substr(name[stock], 1, 1)) "/" tolower(name[stock]) ".html\n"
+  @}
+  report = report "\nThis sums up to " HotCount+0 " winners and " AvoidCount+0
+  report = report " losers. When using this kind\nof prediction scheme for"
+  report = report " the 12 months which lie behind us,\nwe get " UpCount
+  report = report " 'ups' and " DownCount " 'downs' and " NeutralCount
+  report = report " 'neutrals'. Of all\nthese " UpCount+DownCount+NeutralCount
+  report = report " predictions " CorrectCount " proved correct next day.\n"
+  report = report "A success rate of "\
+             int(100*CorrectCount/(UpCount+DownCount+NeutralCount)) "%.\n"
+  report = report "Random choice would have produced a 33% success rate.\n"
+  report = report "Disclaimer: Like every other prediction of the stock\n"
+  report = report "market, this report is, of course, complete nonsense.\n"
+  report = report "If you are stupid enough to believe these predictions\n"
+  report = report "you should visit a doctor who can treat your ailment."
+@}
+@c endfile
+@end smallexample
+
+The function @code{SendMail()} goes through the list of customers and opens
+a pipe to the @code{mail} command for each of them. Each one receives an
+email message with a proper subject heading and is addressed with his full name.
+
+@smallexample
+@c file eg/network/stoxpred.awk
+function SendMail() @{
+  # send report to customers
+  customer["uncle.scrooge@@ducktown.gov"] = "Uncle Scrooge"
+  customer["more@@utopia.org"           ] = "Sir Thomas More"
+  customer["spinoza@@denhaag.nl"        ] = "Baruch de Spinoza"
+  customer["marx@@highgate.uk"          ] = "Karl Marx"
+  customer["keynes@@the.long.run"       ] = "John Maynard Keynes"
+  customer["bierce@@devil.hell.org"     ] = "Ambrose Bierce"
+  customer["laplace@@paris.fr"          ] = "Pierre Simon de Laplace"
+  for (c in customer) @{
+    MailPipe = "mail -s 'Daily Stock Prediction Newsletter'" c
+    print "Good morning " customer[c] "," | MailPipe
+    print report "\n.\n" | MailPipe
+    close(MailPipe)
+  @}
+@}
+@c endfile
+@end smallexample
+
+Be patient when running the script by hand.
+Retrieving the data for all the ticker symbols and sending the emails
+may take several minutes to complete, depending upon network traffic
+and the speed of the available Internet link.
+The quality of the prediction algorithm is likely to be disappointing.
+Try to find a better one.
+Should you find one with a success rate of more than 50%, please tell
+us about it! It is only for the sake of curiosity, of course. @code{:-)}
+
+@node PROTBASE, , STOXPRED, Some Applications and Techniques
+@section PROTBASE: Searching Through A Protein Database
+@cindex PROTBASE
+@cindex NCBI, National Center for Biotechnology Information
+@cindex BLAST, Basic Local Alignment Search Tool
+@cindex Hoare, C.A.R.
+@quotation
+@i{Hoare's Law of Large Problems: Inside every large problem is a small
+   problem struggling to get out.}
+@end quotation
+
+Yahoo's database of stock market data is just one among the many large
+databases on the Internet. Another one is located at NCBI
+(National Center for Biotechnology
+Information). Established in 1988 as a national resource for molecular
+biology information, NCBI creates public databases, conducts research
+in computational biology, develops software tools for analyzing genome
+data, and disseminates biomedical information. In this section, we
+look at one of NCBI's public services, which is called BLAST
+(Basic Local Alignment Search Tool).
+
+You probably know that the information necessary for reproducing living
+cells is encoded in the genetic material of the cells. The genetic material
+is a very long chain of four base nucleotides. It is the order of
+appearance (the sequence) of nucleotides which contains the information
+about the substance to be produced. Scientists in biotechnology often
+find a specific fragment, determine the nucleotide sequence, and need
+to know where the sequence at hand comes from. This is where the large
+databases enter the game. At NCBI, databases store the knowledge
+about which sequences have ever been found and where they have been found.
+When the scientist sends his sequence to the BLAST service, the server
+looks for regions of genetic material in its database which
+look the most similar to the delivered nucleotide sequence. After a
+search time of some seconds or minutes the server sends an answer to
+the scientist. In order to make access simple, NCBI chose to offer
+their database service through popular Internet protocols. There are
+four basic ways to use the so-called BLAST services:
+
+@itemize @bullet
+@item
+The easiest way to use BLAST is through the web. Users may simply point
+their browsers at the NCBI home page
+and link to the BLAST pages.
+NCBI provides a stable URL that may be used to perform BLAST searches
+without interactive use of a web browser. This is what we will do later
+in this section.
+A demonstration client
+and a @file{README} file demonstrate how to access this URL.
+
+@item
+Currently,
+@command{blastcl3} is the standard network BLAST client.
+You can download @command{blastcl3} from the
+anonymous FTP location.
+
+@item
+BLAST 2.0 can be run locally as a full executable and can be used to run
+BLAST searches against private local databases, or downloaded copies of the
+NCBI databases. BLAST 2.0 executables may be found on the NCBI
+anonymous FTP server.
+
+@item
+The NCBI BLAST Email server is the best option for people without convenient
+access to the web. A similarity search can be performed by sending a properly
+formatted mail message containing the nucleotide or protein query sequence to
+@email{blast@@ncbi.nlm.nih.gov}. The query sequence is compared against the
+specified database using the BLAST algorithm and the results are returned in
+an email message. For more information on formulating email BLAST searches,
+you can send a message consisting of the word ``HELP'' to the same address,
+@email{blast@@ncbi.nlm.nih.gov}.
+@end itemize
+
+Our starting point is the demonstration client mentioned in the first option.
+The @file{README} file that comes along with the client explains the whole
+process in a nutshell. In the rest of this section, we first show
+what such requests look like. Then we show how to use @command{gawk} to
+implement a client in about 10 lines of code. Finally, we show how to
+interpret the result returned from the service.
+
+Sequences are expected to be represented in the standard
+IUB/IUPAC amino acid and nucleic acid codes,
+with these exceptions:  lower-case letters are accepted and are mapped
+into upper-case; a single hyphen or dash can be used to represent a gap
+of indeterminate length; and in amino acid sequences, @samp{U} and @samp{*}
+are acceptable letters (see below).  Before submitting a request, any numerical
+digits in the query sequence should either be removed or replaced by
+appropriate letter codes (e.g., @samp{N} for unknown nucleic acid residue
+or @samp{X} for unknown amino acid residue).
+The nucleic acid codes supported are:
+
+@example
+A --> adenosine               M --> A C (amino)
+C --> cytidine                S --> G C (strong)
+G --> guanine                 W --> A T (weak)
+T --> thymidine               B --> G T C
+U --> uridine                 D --> G A T
+R --> G A (purine)            H --> A C T
+Y --> T C (pyrimidine)        V --> G C A
+K --> G T (keto)              N --> A G C T (any)
+                              -  gap of indeterminate length
+@end example
+
+Now you know the alphabet of nucleotide sequences. The last two lines
+of the following example query show you such a sequence, which is obviously
+made up only of elements of the alphabet just described. Store this example
+query into a file named @file{protbase.request}. You are now ready to send
+it to the server with the demonstration client.
+
+@example
+@c file eg/network/protbase.request
+PROGRAM blastn
+DATALIB month
+EXPECT 0.75
+BEGIN
+>GAWK310 the gawking gene GNU AWK
+tgcttggctgaggagccataggacgagagcttcctggtgaagtgtgtttcttgaaatcat
+caccaccatggacagcaaa
+@c endfile
+@end example
+
+@cindex FASTA/Pearson format
+The actual search request begins with the mandatory parameter @samp{PROGRAM}
+in the first column followed by the value @samp{blastn} (the name of the
+program) for searching nucleic acids.  The next line contains the mandatory
+search parameter @samp{DATALIB} with the value @samp{month} for the newest
+nucleic acid sequences.  The third line contains an optional @samp{EXPECT}
+parameter and the value desired for it. The fourth line contains the
+mandatory @samp{BEGIN} directive, followed by the query sequence in
+FASTA/Pearson format.
+Each line of information must be less than 80 characters in length.
+
+The ``month'' database contains all new or revised sequences released in the
+last 30 days and is useful for searching against new sequences.
+There are five different blast programs, @command{blastn} being the one that
+compares a nucleotide  query  sequence  against a nucleotide sequence database.
+
+The last server directive that must appear in every request is the
+@samp{BEGIN} directive. The query sequence should immediately follow the
+@samp{BEGIN} directive and must appear in FASTA/Pearson format.
+A sequence in
+FASTA/Pearson format begins with a single-line description.
+The description line, which is required, is distinguished from the lines of
+sequence data that follow it by having a greater-than (@samp{>}) symbol
+in the first column.  For the purposes of the BLAST server, the text of
+the description is arbitrary.
+
+If you prefer to use a client written in @command{gawk}, just store the following
+10 lines of code into a file named @file{protbase.awk} and use this client
+instead. Invoke it with @samp{gawk -f protbase.awk protbase.request}.
+Then wait a minute and watch the result coming in. In order to replicate
+the demonstration client's behavior as closely as possible, this client
+does not use a proxy server. We could also have extended the client program
+in @ref{GETURL, ,Retrieving Web Pages}, to implement the client request from
+@file{protbase.awk} as a special case.
+
+@smallexample
+@c file eg/network/protbase.awk
+@{ request = request "\n" $0 @}
+
+END @{
+  BLASTService     = "/inet/tcp/0/www.ncbi.nlm.nih.gov/80"
+  printf "POST /cgi-bin/BLAST/nph-blast_report HTTP/1.0\n" |& BLASTService
+  printf "Content-Length: " length(request) "\n\n"         |& BLASTService
+  printf request                                           |& BLASTService
+  while ((BLASTService |& getline) > 0)
+      print $0
+  close(BLASTService)
+@}
+@c endfile
+@end smallexample
+
+The demonstration client from NCBI is 214 lines long (written in C) and
+it is not immediately obvious what it does. Our client is so short that
+it @emph{is} obvious what it does. First it loops over all lines of the
+query and stores the whole query into a variable. Then the script
+establishes an Internet connection to the NCBI server and transmits the
+query by framing it with a proper HTTP request. Finally it receives
+and prints the complete result coming from the server.
+
+Now, let us look at the result. It begins with an HTTP header, which you
+can ignore. Then there are some comments about the query having been
+filtered to avoid spuriously high scores. After this, there is a reference
+to the paper that describes the software being used for searching the data
+base. After a repetition of the original query's description we find the
+list of significant alignments:
+
+@smallexample
+@c file eg/network/protbase.result
+Sequences producing significant alignments:                        (bits)  Value
+
+gb|AC021182.14|AC021182 Homo sapiens chromosome 7 clone RP11-733...    38  0.20
+gb|AC021056.12|AC021056 Homo sapiens chromosome 3 clone RP11-115...    38  0.20
+emb|AL160278.10|AL160278 Homo sapiens chromosome 9 clone RP11-57...    38  0.20
+emb|AL391139.11|AL391139 Homo sapiens chromosome X clone RP11-35...    38  0.20
+emb|AL365192.6|AL365192 Homo sapiens chromosome 6 clone RP3-421H...    38  0.20
+emb|AL138812.9|AL138812 Homo sapiens chromosome 11 clone RP1-276...    38  0.20
+gb|AC073881.3|AC073881 Homo sapiens chromosome 15 clone CTD-2169...    38  0.20
+@c endfile
+@end smallexample
+
+This means that the query sequence was found in seven human chromosomes.
+But the value 0.20 (20%) means that the probability of an accidental match
+is rather high (20%) in all cases and should be taken into account.
+You may wonder what the first column means. It is a key to the specific
+database in which this occurrence was found.  The unique sequence identifiers
+reported in the search results can be used as sequence retrieval keys
+via the NCBI server. The syntax of sequence header lines used by the NCBI
+BLAST server depends on the database from which each sequence was obtained.
+The table below lists the identifiers for the databases from which the
+sequences were derived.
+
+@ifinfo
+@example
+Database Name                     Identifier Syntax
+============================      ========================
+GenBank                           gb|accession|locus
+EMBL Data Library                 emb|accession|locus
+DDBJ, DNA Database of Japan       dbj|accession|locus
+NBRF PIR                          pir||entry
+Protein Research Foundation       prf||name
+SWISS-PROT                        sp|accession|entry name
+Brookhaven Protein Data Bank      pdb|entry|chain
+Kabat's Sequences of Immuno@dots{}    gnl|kabat|identifier
+Patents                           pat|country|number
+GenInfo Backbone Id               bbs|number
+@end example
+@end ifinfo
+
+@ifnotinfo
+@multitable {Kabat's Sequences of Immuno@dots{}} {@code{@w{sp|accession|entry name}}}
+@item GenBank @tab @code{gb|accession|locus}
+@item EMBL Data Library @tab @code{emb|accession|locus}
+@item DDBJ, DNA Database of Japan @tab @code{dbj|accession|locus}
+@item NBRF PIR @tab @code{pir||entry}
+@item Protein Research Foundation @tab @code{prf||name}
+@item SWISS-PROT @tab @code{@w{sp|accession|entry name}}
+@item Brookhaven Protein Data Bank @tab @code{pdb|entry|chain}
+@item Kabat's Sequences of Immuno@dots{} @tab @code{gnl|kabat|identifier}
+@item Patents @tab @code{pat|country|number}
+@item GenInfo Backbone Id @tab @code{bbs|number}
+@end multitable
+@end ifnotinfo
+
+
+For example, an identifier might be @samp{gb|AC021182.14|AC021182}, where the
+@samp{gb} tag indicates that the identifier refers to a GenBank sequence,
+@samp{AC021182.14} is its GenBank ACCESSION, and @samp{AC021182} is the GenBank LOCUS.
+The identifier contains no spaces, so that a space indicates the end of the
+identifier.
+
+Let us continue in the result listing. Each of the seven alignments mentioned
+above is subsequently described in detail. We will have a closer look at
+the first of them.
+
+@smallexample
+>gb|AC021182.14|AC021182 Homo sapiens chromosome 7 clone RP11-733N23, WORKING DRAFT SEQUENCE, 4
+             unordered pieces
+          Length = 176383
+
+ Score = 38.2 bits (19), Expect = 0.20
+ Identities = 19/19 (100%)
+ Strand = Plus / Plus
+
+Query: 35    tggtgaagtgtgtttcttg 53
+             |||||||||||||||||||
+Sbjct: 69786 tggtgaagtgtgtttcttg 69804
+@end smallexample
+
+This alignment was located on the human chromosome 7. The fragment on which
+part of the query was found had a total length of 176383. Only 19 of the
+nucleotides matched and the matching sequence ran from character 35 to 53
+in the query sequence and from 69786 to 69804 in the fragment on chromosome 7.
+If you are still reading at this point, you are probably interested in finding
+out more about Computational Biology and you might appreciate the following
+hints.
+
+@cindex Computational Biology
+@cindex Bioinformatics
+@enumerate
+@item
+There is a book called @cite{Introduction to Computational Biology}
+by Michael S. Waterman, which is worth reading if you are seriously
+interested. You can find a good
+book review
+on the Internet.
+
+@item
+While Waterman's book can explain to you the algorithms employed internally
+in the database search engines, most practitioners prefer to approach
+the subject differently. The applied side of Computational Biology is
+called Bioinformatics, and emphasizes the tools available for day-to-day
+work as well as how to actually @emph{use} them. One of the very few affordable
+books on Bioinformatics is
+@cite{Developing Bioinformatics Computer Skills}.
+
+@item
+The sequences @emph{gawk} and @emph{gnuawk} are in widespread use in
+the genetic material of virtually every earthly living being. Let us
+take this as a clear indication that the divine creator has intended
+@command{gawk} to prevail over other scripting languages such as @command{perl},
+@command{tcl}, or @command{python} which are not even proper sequences. (:-)
+@end enumerate
+
+@node Links, GNU Free Documentation License, Some Applications and Techniques, Top
+@chapter Related Links
+
+This section lists the URLs for various items discussed in this @value{CHAPTER}.
+They are presented in the order in which they appear.
+
+@table @asis
+
+@item @cite{Internet Programming with Python}
+@uref{http://www.fsbassociates.com/books/python.htm}
+
+@item @cite{Advanced Perl Programming}
+@uref{http://www.oreilly.com/catalog/advperl}
+
+@item @cite{Web Client Programming with Perl}
+@uref{http://www.oreilly.com/catalog/webclient}
+
+@item Richard Stevens's home page and book
+@uref{http://www.kohala.com/~rstevens}
+
+@item The SPAK home page
+@uref{http://www.userfriendly.net/linux/RPM/contrib/libc6/i386/spak-0.6b-1.i386.html}
+
+@item Volume III of @cite{Internetworking with TCP/IP}, by Comer and Stevens
+@uref{http://www.cs.purdue.edu/homes/dec/tcpip3s.cont.html}
+
+@item XBM Graphics File Format
+@uref{http://www.wotsit.org/download.asp?f=xbm}
+
+@item GNUPlot
+@uref{http://www.cs.dartmouth.edu/gnuplot_info.html}
+
+@item Mark Humphrys' Eliza page
+@uref{http://www.compapp.dcu.ie/~humphrys/eliza.html}
+
+@item Yahoo! Eliza Information
+@uref{http://dir.yahoo.com/Recreation/Games/Computer_Games/Internet_Games/Web_Games/Artificial_Intelligence}
+
+@item Java versions of Eliza
+@uref{http://www.tjhsst.edu/Psych/ch1/eliza.html}
+
+@item Java versions of Eliza with source code
+@uref{http://home.adelphia.net/~lifeisgood/eliza/eliza.htm}
+
+@item Eliza Programs with Explanations
+@uref{http://chayden.net/chayden/eliza/Eliza.shtml}
+
+@item Loebner Contest
+@uref{http://acm.org/~loebner/loebner-prize.htmlx}
+
+@item Tck/Tk Information
+@uref{http://www.scriptics.com/}
+
+@item Intel 80x86 Processors
+@uref{http://developer.intel.com/design/platform/embedpc/what_is.htm}
+
+@item AMD Elan Processors
+@uref{http://www.amd.com/products/epd/processors/4.32bitcont/32bitcont/index.html}
+
+@item XINU
+@uref{http://willow.canberra.edu.au/~chrisc/xinu.html }
+
+@item GNU/Linux
+@uref{http://uclinux.lineo.com/}
+
+@item Embedded PCs
+@uref{http://dir.yahoo.com/Business_and_Economy/Business_to_Business/Computers/Hardware/Embedded_Control/}
+
+@item MiniSQL
+@uref{http://www.hughes.com.au/library/}
+
+@item Market Share Surveys
+@uref{http://www.netcraft.com/survey}
+
+@item @cite{Numerical Recipes in C: The Art of Scientific Computing}
+@uref{http://www.nr.com}
+
+@item VRML
+@uref{http://www.vrml.org}
+
+@item The VRML FAQ
+@uref{http://www.vrml.org/technicalinfo/specifications/specifications.htm#FAQ}
+
+@item The UMBC Agent Web
+@uref{http://www.cs.umbc.edu/agents }
+
+@item Apache Web Server
+@uref{http://www.apache.org}
+
+@item National Center for Biotechnology Information (NCBI)
+@uref{http://www.ncbi.nlm.nih.gov}
+
+@item Basic Local Alignment Search Tool (BLAST)
+@uref{http://www.ncbi.nlm.nih.gov/BLAST/blast_overview.html}
+
+@item NCBI Home Page
+@uref{http://www.ncbi.nlm.nih.gov}
+
+@item BLAST Pages
+@uref{http://www.ncbi.nlm.nih.gov/BLAST}
+
+@item BLAST Demonstration Client
+@uref{ftp://ncbi.nlm.nih.gov/blast/blasturl/}
+
+@item BLAST anonymous FTP location
+@uref{ftp://ncbi.nlm.nih.gov/blast/network/netblast/}
+
+@item BLAST 2.0 Executables
+@uref{ftp://ncbi.nlm.nih.gov/blast/executables/}
+
+@item IUB/IUPAC Amino Acid and Nucleic Acid Codes
+@uref{http://www.uthscsa.edu/geninfo/blastmail.html#item6}
+
+@item FASTA/Pearson Format
+@uref{http://www.ncbi.nlm.nih.gov/BLAST/fasta.html}
+
+@item Fasta/Pearson Sequence in Java
+@uref{http://www.kazusa.or.jp/java/codon_table_java/}
+
+@item Book Review of @cite{Introduction to Computational Biology}
+@uref{http://www.acm.org/crossroads/xrds5-1/introcb.html}
+
+@item @cite{Developing Bioinformatics Computer Skills}
+@uref{http://www.oreilly.com/catalog/bioskills/}
+
+@end table
+
+@c The GNU Free Documentation License.
+@node GNU Free Documentation License, Index, Links, Top
+@unnumbered GNU Free Documentation License
+@cindex FDL (Free Documentation License)
+@cindex Free Documentation License (FDL)
+@cindex GNU Free Documentation License
+@center Version 1.3, 3 November 2008
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document'', below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you''.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification.  Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''.  Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''.  You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.  If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works.  A
+public wiki that anybody can edit is an example of such a server.  A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@c fakenode --- for prepinfo
+@unnumberedsec ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+  Copyright (C)  @var{year}  @var{your name}.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.3
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+    with the Invariant Sections being @var{list their titles}, with
+    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+    being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@c Local Variables:
+@c ispell-local-pdict: "ispell-dict"
+@c End:
+
+
+@node Index, , GNU Free Documentation License, Top
+@comment node-name,    next,  previous,      up
+
+@unnumbered Index
+@printindex cp
+@bye
+
+Conventions:
+1. Functions, built-in or otherwise, do have () after them.
+2. Gawk built-in vars and functions are in @code.  Also program vars and
+   functions.
+3. HTTP method names are in @code.
+4. Protocols such as echo, ftp, etc are in @samp.
+5. URLs are in @url.
+6. All RFCs in the index.  Put a space between `RFC' and the number.
diff --git a/gawk-5.0.1/doc/gawktexi.in b/gawk-5.0.1/doc/gawktexi.in
new file mode 100644
index 00000000000..398e35da891
--- /dev/null
+++ b/gawk-5.0.1/doc/gawktexi.in
@@ -0,0 +1,44206 @@
+\input texinfo   @c -*-texinfo-*-
+@c vim: filetype=texinfo
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename gawk.info
+@settitle The GNU Awk User's Guide
+@c %**end of header (This is for running Texinfo on a region.)
+
+@dircategory Text creation and manipulation
+@direntry
+* Gawk: (gawk).                 A text scanning and processing language.
+@end direntry
+@dircategory Individual utilities
+@direntry
+* awk: (gawk)Invoking Gawk.                     Text scanning and processing.
+@end direntry
+
+@ifset FOR_PRINT
+@tex
+\gdef\xrefprintnodename#1{``#1''}
+@end tex
+@end ifset
+
+@ifclear FOR_PRINT
+@c With early 2014 texinfo.tex, restore PDF links and colors
+@tex
+\gdef\linkcolor{0.5 0.09 0.12} % Dark Red
+\gdef\urlcolor{0.5 0.09 0.12} % Also
+\global\urefurlonlylinktrue
+@end tex
+@end ifclear
+
+@ifnotdocbook
+@set BULLET @bullet{}
+@set MINUS @minus{}
+@end ifnotdocbook
+
+@ifdocbook
+@set BULLET
+@set MINUS
+@end ifdocbook
+
+@iftex
+@set TIMES @times
+@end iftex
+@ifnottex
+@set TIMES *
+@end ifnottex
+        
+@c Let texinfo.tex give us full section titles
+@xrefautomaticsectiontitle on
+
+@c The following information should be updated here only!
+@c This sets the edition of the document, the version of gawk it
+@c applies to and all the info about who's publishing this edition
+
+@c These apply across the board.
+@set UPDATE-MONTH June, 2019
+@set VERSION 5.0
+@set PATCHLEVEL 1
+
+@set GAWKINETTITLE TCP/IP Internetworking with @command{gawk}
+@ifset FOR_PRINT
+@set TITLE Effective awk Programming
+@end ifset
+@ifclear FOR_PRINT
+@set TITLE GAWK: Effective AWK Programming
+@end ifclear
+@set SUBTITLE A User's Guide for GNU Awk
+@set EDITION 5.0
+
+@iftex
+@set DOCUMENT book
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER @inmargin{@image{lflashlight,1cm}, @image{rflashlight,1cm}}
+@set COMMONEXT (c.e.)
+@set PAGE page
+@end iftex
+@ifinfo
+@set DOCUMENT Info file
+@set CHAPTER major node
+@set APPENDIX major node
+@set SECTION minor node
+@set SUBSECTION node
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE screen
+@end ifinfo
+@ifhtml
+@set DOCUMENT Web page
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE screen
+@end ifhtml
+@ifdocbook
+@set DOCUMENT book
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE page
+@end ifdocbook
+@ifxml
+@set DOCUMENT book
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE page
+@end ifxml
+@ifplaintext
+@set DOCUMENT book
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@set DARKCORNER (d.c.)
+@set COMMONEXT (c.e.)
+@set PAGE page
+@end ifplaintext
+
+@ifdocbook
+@c empty on purpose
+@set PART1
+@set PART2
+@set PART3
+@set PART4
+@end ifdocbook
+
+@ifnotdocbook
+@set PART1 Part I:@*
+@set PART2 Part II:@*
+@set PART3 Part III:@*
+@set PART4 Part IV:@*
+@end ifnotdocbook
+
+@c some special symbols
+@iftex
+@set LEQ @math{@leq}
+@set PI @math{@pi}
+@end iftex
+@ifdocbook
+@set LEQ @inlineraw{docbook, &le;}
+@set PI @inlineraw{docbook, &pgr;}
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@set LEQ <=
+@set PI @i{pi}
+@end ifnotdocbook
+@end ifnottex
+
+@ifnottex
+@ifnotdocbook
+@macro ii{text}
+@i{\text\}
+@end macro
+@end ifnotdocbook
+@end ifnottex
+
+@ifdocbook
+@macro ii{text}
+@inlineraw{docbook,<lineannotation>\text\</lineannotation>}
+@end macro
+@end ifdocbook
+
+@ifclear FOR_PRINT
+@set FN file name
+@set FFN File name
+@set DF data file
+@set DDF Data file
+@set PVERSION version
+@end ifclear
+@ifset FOR_PRINT
+@set FN filename
+@set FFN Filename
+@set DF datafile
+@set DDF Datafile
+@set PVERSION version
+@end ifset
+
+@c For HTML, spell out email addresses, to avoid problems with
+@c address harvesters for spammers.
+@ifhtml
+@macro EMAIL{real,spelled}
+``\spelled\''
+@end macro
+@end ifhtml
+@ifnothtml
+@macro EMAIL{real,spelled}
+@email{\real\}
+@end macro
+@end ifnothtml
+
+@c Indexing macros
+@ifinfo
+
+@macro cindexawkfunc{name}
+@cindex @code{\name\}
+@end macro
+
+@macro cindexgawkfunc{name}
+@cindex @code{\name\}
+@end macro
+
+@end ifinfo
+
+@ifnotinfo
+
+@macro cindexawkfunc{name}
+@cindex @code{\name\()} function
+@end macro
+
+@macro cindexgawkfunc{name}
+@cindex @code{\name\()} function (@command{gawk})
+@end macro
+@end ifnotinfo
+
+@ignore
+Some comments on the layout for TeX.
+1. Use at least texinfo.tex 2016-02-05.07.
+@end ignore
+
+@c merge the function and variable indexes into the concept index
+@ifinfo
+@synindex fn cp
+@synindex vr cp
+@end ifinfo
+@iftex
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end iftex
+@ifxml
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end ifxml
+@ifdocbook
+@synindex fn cp
+@synindex vr cp
+@end ifdocbook
+
+@c If "finalout" is commented out, the printed output will show
+@c black boxes that mark lines that are too long.  Thus, it is
+@c unwise to comment it out when running a master in case there are
+@c overfulls which are deemed okay.
+
+@iftex
+@finalout
+@end iftex
+
+@copying
+@docbook
+<para>
+&ldquo;To boldly go where no man has gone before&rdquo; is a
+Registered Trademark of Paramount Pictures Corporation.</para>
+
+<para>Published by:</para>
+
+<literallayout class="normal">Free Software Foundation
+51 Franklin Street, Fifth Floor
+Boston, MA  02110-1301 USA
+Phone: +1-617-542-5942
+Fax: +1-617-542-2652
+Email: <email>gnu@@gnu.org</email>
+URL: <ulink url="https://www.gnu.org">https://www.gnu.org/</ulink></literallayout>
+
+<literallayout class="normal">Copyright &copy; 1989, 1991, 1992, 1993, 1996&ndash;2005, 2007, 2009&ndash;2019
+Free Software Foundation, Inc.
+All Rights Reserved.</literallayout>
+@end docbook
+
+@ifnotdocbook
+Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2019 @*
+Free Software Foundation, Inc.
+@end ifnotdocbook
+@sp 2
+
+This is Edition @value{EDITION} of @cite{@value{TITLE}: @value{SUBTITLE}},
+for the @value{VERSION}.@value{PATCHLEVEL} (or later) version of the GNU
+implementation of AWK.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``GNU General Public License'', with the
+Front-Cover Texts being ``A GNU Manual'', and with the Back-Cover Texts
+as in (a) below.
+@ifclear FOR_PRINT
+A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+@end ifclear
+@ifset FOR_PRINT
+A copy of the license
+may be found on the Internet at
+@uref{https://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html,
+the GNU Project's website}.
+@end ifset
+
+@enumerate a
+@item
+The FSF's Back-Cover Text is: ``You have the freedom to
+copy and modify this GNU manual.''
+@end enumerate
+@end copying
+
+@c Comment out the "smallbook" for technical review.  Saves
+@c considerable paper.  Remember to turn it back on *before*
+@c starting the page-breaking work.
+
+@c 4/2002: Karl Berry recommends commenting out this and the
+@c `@setchapternewpage odd', and letting users use `texi2dvi -t'
+@c if they want to waste paper.
+@c @smallbook
+
+
+@c Uncomment this for the release.  Leaving it off saves paper
+@c during editing and review.
+@setchapternewpage odd
+
+@shorttitlepage GNU Awk
+@titlepage
+@title @value{TITLE}
+@subtitle @value{SUBTITLE}
+@subtitle Edition @value{EDITION}
+@subtitle @value{UPDATE-MONTH}
+@author Arnold D. Robbins
+
+@ifnotdocbook
+@c Include the Distribution inside the titlepage environment so
+@c that headings are turned off.  Headings on and off do not work.
+
+@page
+@vskip 0pt plus 1filll
+``To boldly go where no man has gone before'' is a
+Registered Trademark of Paramount Pictures Corporation. @*
+@c sorry, i couldn't resist
+@sp 3
+Published by:
+@sp 1
+
+Free Software Foundation @*
+51 Franklin Street, Fifth Floor @*
+Boston, MA  02110-1301 USA @*
+Phone: +1-617-542-5942 @*
+Fax: +1-617-542-2652 @*
+Email: @email{gnu@@gnu.org} @*
+URL: @uref{https://www.gnu.org/} @*
+
+@c This one is correct for gawk 3.1.0 from the FSF
+ISBN 1-882114-28-0 @*
+@sp 2
+@insertcopying
+@end ifnotdocbook
+@end titlepage
+
+@c Thanks to Bob Chassell for directions on doing dedications.
+@iftex
+@headings off
+@page
+@w{ }
+@sp 9
+@center @i{To my parents, for their love, and for the wonderful example they set for me.}
+@sp 1
+@center @i{To my wife, Miriam, for making me complete.
+Thank you for building your life together with me.}
+@sp 1
+@center @i{To our children, Chana, Rivka, Nachum, and Malka, for enrichening our lives in innumerable ways.}
+@sp 1
+@w{ }
+@page
+@w{ }
+@page
+@headings on
+@end iftex
+
+@docbook
+<dedication>
+<para>To my parents, for their love, and for the wonderful
+example they set for me.</para>
+<para>To my wife Miriam, for making me complete.
+Thank you for building your life together with me.</para>
+<para>To our children Chana, Rivka, Nachum and Malka,
+for enrichening our lives in innumerable ways.</para>
+</dedication>
+@end docbook
+
+@iftex
+@headings off
+@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @|
+@oddheading  @| @| @strong{@thischapter}@ @ @ @thispage
+@end iftex
+
+@ifnottex
+@ifnotxml
+@ifnotdocbook
+@node Top
+@top General Introduction
+@c Preface node should come right after the Top
+@c node, in `unnumbered' sections, then the chapter, `What is gawk'.
+@c Licensing nodes are appendices, they're not central to AWK.
+
+This file documents @command{awk}, a program that you can use to select
+particular records in a file and perform operations upon them.
+
+@insertcopying
+
+@end ifnotdocbook
+@end ifnotxml
+@end ifnottex
+
+@menu
+* Foreword3::                      Some nice words about this
+                                   @value{DOCUMENT}.
+* Foreword4::                      More nice words.
+* Preface::                        What this @value{DOCUMENT} is about; brief
+                                   history and acknowledgments.
+* Getting Started::                A basic introduction to using
+                                   @command{awk}. How to run an @command{awk}
+                                   program. Command-line syntax.
+* Invoking Gawk::                  How to run @command{gawk}.
+* Regexp::                         All about matching things using regular
+                                   expressions.
+* Reading Files::                  How to read files and manipulate fields.
+* Printing::                       How to print using @command{awk}. Describes
+                                   the @code{print} and @code{printf}
+                                   statements. Also describes redirection of
+                                   output.
+* Expressions::                    Expressions are the basic building blocks
+                                   of statements.
+* Patterns and Actions::           Overviews of patterns and actions.
+* Arrays::                         The description and use of arrays. Also
+                                   includes array-oriented control statements.
+* Functions::                      Built-in and user-defined functions.
+* Library Functions::              A Library of @command{awk} Functions.
+* Sample Programs::                Many @command{awk} programs with complete
+                                   explanations.
+* Advanced Features::              Stuff for advanced users, specific to
+                                   @command{gawk}.
+* Internationalization::           Getting @command{gawk} to speak your
+                                   language.
+* Debugger::                       The @command{gawk} debugger.
+* Namespaces::                     How namespaces work in @command{gawk}.
+* Arbitrary Precision Arithmetic:: Arbitrary precision arithmetic with
+                                   @command{gawk}.
+* Dynamic Extensions::             Adding new built-in functions to
+                                   @command{gawk}.
+* Language History::               The evolution of the @command{awk}
+                                   language.
+* Installation::                   Installing @command{gawk} under various
+                                   operating systems.
+* Notes::                          Notes about adding things to @command{gawk}
+                                   and possible future work.
+* Basic Concepts::                 A very quick introduction to programming
+                                   concepts.
+* Glossary::                       An explanation of some unfamiliar terms.
+* Copying::                        Your right to copy and distribute
+                                   @command{gawk}.
+* GNU Free Documentation License:: The license for this @value{DOCUMENT}.
+* Index::                          Concept and Variable Index.
+
+@detailmenu
+* History::                             The history of @command{gawk} and
+                                        @command{awk}.
+* Names::                               What name to use to find
+                                        @command{awk}.
+* This Manual::                         Using this @value{DOCUMENT}. Includes
+                                        sample input files that you can use.
+* Conventions::                         Typographical Conventions.
+* Manual History::                      Brief history of the GNU project and
+                                        this @value{DOCUMENT}.
+* How To Contribute::                   Helping to save the world.
+* Acknowledgments::                     Acknowledgments.
+* Running gawk::                        How to run @command{gawk} programs;
+                                        includes command-line syntax.
+* One-shot::                            Running a short throwaway
+                                        @command{awk} program.
+* Read Terminal::                       Using no input files (input from the
+                                        keyboard instead).
+* Long::                                Putting permanent @command{awk}
+                                        programs in files.
+* Executable Scripts::                  Making self-contained @command{awk}
+                                        programs.
+* Comments::                            Adding documentation to @command{gawk}
+                                        programs.
+* Quoting::                             More discussion of shell quoting
+                                        issues.
+* DOS Quoting::                         Quoting in Windows Batch Files.
+* Sample Data Files::                   Sample data files for use in the
+                                        @command{awk} programs illustrated in
+                                        this @value{DOCUMENT}.
+* Very Simple::                         A very simple example.
+* Two Rules::                           A less simple one-line example using
+                                        two rules.
+* More Complex::                        A more complex example.
+* Statements/Lines::                    Subdividing or combining statements
+                                        into lines.
+* Other Features::                      Other Features of @command{awk}.
+* When::                                When to use @command{gawk} and when to
+                                        use other things.
+* Intro Summary::                       Summary of the introduction.
+* Command Line::                        How to run @command{awk}.
+* Options::                             Command-line options and their
+                                        meanings.
+* Other Arguments::                     Input file names and variable
+                                        assignments.
+* Naming Standard Input::               How to specify standard input with
+                                        other files.
+* Environment Variables::               The environment variables
+                                        @command{gawk} uses.
+* AWKPATH Variable::                    Searching directories for
+                                        @command{awk} programs.
+* AWKLIBPATH Variable::                 Searching directories for
+                                        @command{awk} shared libraries.
+* Other Environment Variables::         The environment variables.
+* Exit Status::                         @command{gawk}'s exit status.
+* Include Files::                       Including other files into your
+                                        program.
+* Loading Shared Libraries::            Loading shared libraries into your
+                                        program.
+* Obsolete::                            Obsolete Options and/or features.
+* Undocumented::                        Undocumented Options and Features.
+* Invoking Summary::                    Invocation summary.
+* Regexp Usage::                        How to Use Regular Expressions.
+* Escape Sequences::                    How to write nonprinting characters.
+* Regexp Operators::                    Regular Expression Operators.
+* Regexp Operator Details::             The actual details.
+* Interval Expressions::                Notes on interval expressions.
+* Bracket Expressions::                 What can go between @samp{[...]}.
+* Leftmost Longest::                    How much text matches.
+* Computed Regexps::                    Using Dynamic Regexps.
+* GNU Regexp Operators::                Operators specific to GNU software.
+* Case-sensitivity::                    How to do case-insensitive matching.
+* Regexp Summary::                      Regular expressions summary.
+* Records::                             Controlling how data is split into
+                                        records.
+* awk split records::                   How standard @command{awk} splits
+                                        records.
+* gawk split records::                  How @command{gawk} splits records.
+* Fields::                              An introduction to fields.
+* Nonconstant Fields::                  Nonconstant Field Numbers.
+* Changing Fields::                     Changing the Contents of a Field.
+* Field Separators::                    The field separator and how to change
+                                        it.
+* Default Field Splitting::             How fields are normally separated.
+* Regexp Field Splitting::              Using regexps as the field separator.
+* Single Character Fields::             Making each character a separate
+                                        field.
+* Command Line Field Separator::        Setting @code{FS} from the command
+                                        line.
+* Full Line Fields::                    Making the full line be a single
+                                        field.
+* Field Splitting Summary::             Some final points and a summary table.
+* Constant Size::                       Reading constant width data.
+* Fixed width data::                    Processing fixed-width data.
+* Skipping intervening::                Skipping intervening fields.
+* Allowing trailing data::              Capturing optional trailing data.
+* Fields with fixed data::              Field values with fixed-width data.
+* Splitting By Content::                Defining Fields By Content
+* Testing field creation::              Checking how @command{gawk} is
+                                        splitting records.
+* Multiple Line::                       Reading multiline records.
+* Getline::                             Reading files under explicit program
+                                        control using the @code{getline}
+                                        function.
+* Plain Getline::                       Using @code{getline} with no
+                                        arguments.
+* Getline/Variable::                    Using @code{getline} into a variable.
+* Getline/File::                        Using @code{getline} from a file.
+* Getline/Variable/File::               Using @code{getline} into a variable
+                                        from a file.
+* Getline/Pipe::                        Using @code{getline} from a pipe.
+* Getline/Variable/Pipe::               Using @code{getline} into a variable
+                                        from a pipe.
+* Getline/Coprocess::                   Using @code{getline} from a coprocess.
+* Getline/Variable/Coprocess::          Using @code{getline} into a variable
+                                        from a coprocess.
+* Getline Notes::                       Important things to know about
+                                        @code{getline}.
+* Getline Summary::                     Summary of @code{getline} Variants.
+* Read Timeout::                        Reading input with a timeout.
+* Retrying Input::                      Retrying input after certain errors.
+* Command-line directories::            What happens if you put a directory on
+                                        the command line.
+* Input Summary::                       Input summary.
+* Input Exercises::                     Exercises.
+* Print::                               The @code{print} statement.
+* Print Examples::                      Simple examples of @code{print}
+                                        statements.
+* Output Separators::                   The output separators and how to
+                                        change them.
+* OFMT::                                Controlling Numeric Output With
+                                        @code{print}.
+* Printf::                              The @code{printf} statement.
+* Basic Printf::                        Syntax of the @code{printf} statement.
+* Control Letters::                     Format-control letters.
+* Format Modifiers::                    Format-specification modifiers.
+* Printf Examples::                     Several examples.
+* Redirection::                         How to redirect output to multiple
+                                        files and pipes.
+* Special FD::                          Special files for I/O.
+* Special Files::                       File name interpretation in
+                                        @command{gawk}. @command{gawk} allows
+                                        access to inherited file descriptors.
+* Other Inherited Files::               Accessing other open files with
+                                        @command{gawk}.
+* Special Network::                     Special files for network
+                                        communications.
+* Special Caveats::                     Things to watch out for.
+* Close Files And Pipes::               Closing Input and Output Files and
+                                        Pipes.
+* Nonfatal::                            Enabling Nonfatal Output.
+* Output Summary::                      Output summary.
+* Output Exercises::                    Exercises.
+* Values::                              Constants, Variables, and Regular
+                                        Expressions.
+* Constants::                           String, numeric and regexp constants.
+* Scalar Constants::                    Numeric and string constants.
+* Nondecimal-numbers::                  What are octal and hex numbers.
+* Regexp Constants::                    Regular Expression constants.
+* Using Constant Regexps::              When and how to use a regexp constant.
+* Standard Regexp Constants::           Regexp constants in standard
+                                        @command{awk}.
+* Strong Regexp Constants::             Strongly typed regexp constants.
+* Variables::                           Variables give names to values for
+                                        later use.
+* Using Variables::                     Using variables in your programs.
+* Assignment Options::                  Setting variables on the command line
+                                        and a summary of command-line syntax.
+                                        This is an advanced method of input.
+* Conversion::                          The conversion of strings to numbers
+                                        and vice versa.
+* Strings And Numbers::                 How @command{awk} Converts Between
+                                        Strings And Numbers.
+* Locale influences conversions::       How the locale may affect conversions.
+* All Operators::                       @command{gawk}'s operators.
+* Arithmetic Ops::                      Arithmetic operations (@samp{+},
+                                        @samp{-}, etc.)
+* Concatenation::                       Concatenating strings.
+* Assignment Ops::                      Changing the value of a variable or a
+                                        field.
+* Increment Ops::                       Incrementing the numeric value of a
+                                        variable.
+* Truth Values and Conditions::         Testing for true and false.
+* Truth Values::                        What is ``true'' and what is
+                                        ``false''.
+* Typing and Comparison::               How variables acquire types and how
+                                        this affects comparison of numbers and
+                                        strings with @samp{<}, etc.
+* Variable Typing::                     String type versus numeric type.
+* Comparison Operators::                The comparison operators.
+* POSIX String Comparison::             String comparison with POSIX rules.
+* Boolean Ops::                         Combining comparison expressions using
+                                        boolean operators @samp{||} (``or''),
+                                        @samp{&&} (``and'') and @samp{!}
+                                        (``not'').
+* Conditional Exp::                     Conditional expressions select between
+                                        two subexpressions under control of a
+                                        third subexpression.
+* Function Calls::                      A function call is an expression.
+* Precedence::                          How various operators nest.
+* Locales::                             How the locale affects things.
+* Expressions Summary::                 Expressions summary.
+* Pattern Overview::                    What goes into a pattern.
+* Regexp Patterns::                     Using regexps as patterns.
+* Expression Patterns::                 Any expression can be used as a
+                                        pattern.
+* Ranges::                              Pairs of patterns specify record
+                                        ranges.
+* BEGIN/END::                           Specifying initialization and cleanup
+                                        rules.
+* Using BEGIN/END::                     How and why to use BEGIN/END rules.
+* I/O And BEGIN/END::                   I/O issues in BEGIN/END rules.
+* BEGINFILE/ENDFILE::                   Two special patterns for advanced
+                                        control.
+* Empty::                               The empty pattern, which matches every
+                                        record.
+* Using Shell Variables::               How to use shell variables with
+                                        @command{awk}.
+* Action Overview::                     What goes into an action.
+* Statements::                          Describes the various control
+                                        statements in detail.
+* If Statement::                        Conditionally execute some
+                                        @command{awk} statements.
+* While Statement::                     Loop until some condition is
+                                        satisfied.
+* Do Statement::                        Do specified action while looping
+                                        until some condition is satisfied.
+* For Statement::                       Another looping statement, that
+                                        provides initialization and increment
+                                        clauses.
+* Switch Statement::                    Switch/case evaluation for conditional
+                                        execution of statements based on a
+                                        value.
+* Break Statement::                     Immediately exit the innermost
+                                        enclosing loop.
+* Continue Statement::                  Skip to the end of the innermost
+                                        enclosing loop.
+* Next Statement::                      Stop processing the current input
+                                        record.
+* Nextfile Statement::                  Stop processing the current file.
+* Exit Statement::                      Stop execution of @command{awk}.
+* Built-in Variables::                  Summarizes the predefined variables.
+* User-modified::                       Built-in variables that you change to
+                                        control @command{awk}.
+* Auto-set::                            Built-in variables where @command{awk}
+                                        gives you information.
+* ARGC and ARGV::                       Ways to use @code{ARGC} and
+                                        @code{ARGV}.
+* Pattern Action Summary::              Patterns and Actions summary.
+* Array Basics::                        The basics of arrays.
+* Array Intro::                         Introduction to Arrays
+* Reference to Elements::               How to examine one element of an
+                                        array.
+* Assigning Elements::                  How to change an element of an array.
+* Array Example::                       Basic Example of an Array
+* Scanning an Array::                   A variation of the @code{for}
+                                        statement. It loops through the
+                                        indices of an array's existing
+                                        elements.
+* Controlling Scanning::                Controlling the order in which arrays
+                                        are scanned.
+* Numeric Array Subscripts::            How to use numbers as subscripts in
+                                        @command{awk}.
+* Uninitialized Subscripts::            Using Uninitialized variables as
+                                        subscripts.
+* Delete::                              The @code{delete} statement removes an
+                                        element from an array.
+* Multidimensional::                    Emulating multidimensional arrays in
+                                        @command{awk}.
+* Multiscanning::                       Scanning multidimensional arrays.
+* Arrays of Arrays::                    True multidimensional arrays.
+* Arrays Summary::                      Summary of arrays.
+* Built-in::                            Summarizes the built-in functions.
+* Calling Built-in::                    How to call built-in functions.
+* Numeric Functions::                   Functions that work with numbers,
+                                        including @code{int()}, @code{sin()}
+                                        and @code{rand()}.
+* String Functions::                    Functions for string manipulation,
+                                        such as @code{split()}, @code{match()}
+                                        and @code{sprintf()}.
+* Gory Details::                        More than you want to know about
+                                        @samp{\} and @samp{&} with
+                                        @code{sub()}, @code{gsub()}, and
+                                        @code{gensub()}.
+* I/O Functions::                       Functions for files and shell
+                                        commands.
+* Time Functions::                      Functions for dealing with timestamps.
+* Bitwise Functions::                   Functions for bitwise operations.
+* Type Functions::                      Functions for type information.
+* I18N Functions::                      Functions for string translation.
+* User-defined::                        Describes User-defined functions in
+                                        detail.
+* Definition Syntax::                   How to write definitions and what they
+                                        mean.
+* Function Example::                    An example function definition and
+                                        what it does.
+* Function Calling::                    Calling user-defined functions.
+* Calling A Function::                  Don't use spaces.
+* Variable Scope::                      Controlling variable scope.
+* Pass By Value/Reference::             Passing parameters.
+* Function Caveats::                    Other points to know about functions.
+* Return Statement::                    Specifying the value a function
+                                        returns.
+* Dynamic Typing::                      How variable types can change at
+                                        runtime.
+* Indirect Calls::                      Choosing the function to call at
+                                        runtime.
+* Functions Summary::                   Summary of functions.
+* Library Names::                       How to best name private global
+                                        variables in library functions.
+* General Functions::                   Functions that are of general use.
+* Strtonum Function::                   A replacement for the built-in
+                                        @code{strtonum()} function.
+* Assert Function::                     A function for assertions in
+                                        @command{awk} programs.
+* Round Function::                      A function for rounding if
+                                        @code{sprintf()} does not do it
+                                        correctly.
+* Cliff Random Function::               The Cliff Random Number Generator.
+* Ordinal Functions::                   Functions for using characters as
+                                        numbers and vice versa.
+* Join Function::                       A function to join an array into a
+                                        string.
+* Getlocaltime Function::               A function to get formatted times.
+* Readfile Function::                   A function to read an entire file at
+                                        once.
+* Shell Quoting::                       A function to quote strings for the
+                                        shell.
+* Data File Management::                Functions for managing command-line
+                                        data files.
+* Filetrans Function::                  A function for handling data file
+                                        transitions.
+* Rewind Function::                     A function for rereading the current
+                                        file.
+* File Checking::                       Checking that data files are readable.
+* Empty Files::                         Checking for zero-length files.
+* Ignoring Assigns::                    Treating assignments as file names.
+* Getopt Function::                     A function for processing command-line
+                                        arguments.
+* Passwd Functions::                    Functions for getting user
+                                        information.
+* Group Functions::                     Functions for getting group
+                                        information.
+* Walking Arrays::                      A function to walk arrays of arrays.
+* Library Functions Summary::           Summary of library functions.
+* Library Exercises::                   Exercises.
+* Running Examples::                    How to run these examples.
+* Clones::                              Clones of common utilities.
+* Cut Program::                         The @command{cut} utility.
+* Egrep Program::                       The @command{egrep} utility.
+* Id Program::                          The @command{id} utility.
+* Split Program::                       The @command{split} utility.
+* Tee Program::                         The @command{tee} utility.
+* Uniq Program::                        The @command{uniq} utility.
+* Wc Program::                          The @command{wc} utility.
+* Miscellaneous Programs::              Some interesting @command{awk}
+                                        programs.
+* Dupword Program::                     Finding duplicated words in a
+                                        document.
+* Alarm Program::                       An alarm clock.
+* Translate Program::                   A program similar to the @command{tr}
+                                        utility.
+* Labels Program::                      Printing mailing labels.
+* Word Sorting::                        A program to produce a word usage
+                                        count.
+* History Sorting::                     Eliminating duplicate entries from a
+                                        history file.
+* Extract Program::                     Pulling out programs from Texinfo
+                                        source files.
+* Simple Sed::                          A Simple Stream Editor.
+* Igawk Program::                       A wrapper for @command{awk} that
+                                        includes files.
+* Anagram Program::                     Finding anagrams from a dictionary.
+* Signature Program::                   People do amazing things with too much
+                                        time on their hands.
+* Programs Summary::                    Summary of programs.
+* Programs Exercises::                  Exercises.
+* Nondecimal Data::                     Allowing nondecimal input data.
+* Array Sorting::                       Facilities for controlling array
+                                        traversal and sorting arrays.
+* Controlling Array Traversal::         How to use PROCINFO["sorted_in"].
+* Array Sorting Functions::             How to use @code{asort()} and
+                                        @code{asorti()}.
+* Two-way I/O::                         Two-way communications with another
+                                        process.
+* TCP/IP Networking::                   Using @command{gawk} for network
+                                        programming.
+* Profiling::                           Profiling your @command{awk} programs.
+* Advanced Features Summary::           Summary of advanced features.
+* I18N and L10N::                       Internationalization and Localization.
+* Explaining gettext::                  How GNU @command{gettext} works.
+* Programmer i18n::                     Features for the programmer.
+* Translator i18n::                     Features for the translator.
+* String Extraction::                   Extracting marked strings.
+* Printf Ordering::                     Rearranging @code{printf} arguments.
+* I18N Portability::                    @command{awk}-level portability
+                                        issues.
+* I18N Example::                        A simple i18n example.
+* Gawk I18N::                           @command{gawk} is also
+                                        internationalized.
+* I18N Summary::                        Summary of I18N stuff.
+* Debugging::                           Introduction to @command{gawk}
+                                        debugger.
+* Debugging Concepts::                  Debugging in General.
+* Debugging Terms::                     Additional Debugging Concepts.
+* Awk Debugging::                       Awk Debugging.
+* Sample Debugging Session::            Sample debugging session.
+* Debugger Invocation::                 How to Start the Debugger.
+* Finding The Bug::                     Finding the Bug.
+* List of Debugger Commands::           Main debugger commands.
+* Breakpoint Control::                  Control of Breakpoints.
+* Debugger Execution Control::          Control of Execution.
+* Viewing And Changing Data::           Viewing and Changing Data.
+* Execution Stack::                     Dealing with the Stack.
+* Debugger Info::                       Obtaining Information about the
+                                        Program and the Debugger State.
+* Miscellaneous Debugger Commands::     Miscellaneous Commands.
+* Readline Support::                    Readline support.
+* Limitations::                         Limitations and future plans.
+* Debugging Summary::                   Debugging summary.
+* Global Namespace::                    The global namespace in standard @command{awk}.
+* Qualified Names::                     How to qualify names with a namespace.
+* Default Namespace::                   The default namespace.
+* Changing The Namespace::              How to change the namespace.
+* Naming Rules::                        Namespace and Component Naming Rules.
+* Internal Name Management::            How names are stored internally.
+* Namespace Example::                   An example of code using a namespace.
+* Namespace And Features::              Namespaces and other @command{gawk} features.
+* Namespace Summary::                   Summarizing namespaces.
+* Computer Arithmetic::                 A quick intro to computer math.
+* Math Definitions::                    Defining terms used.
+* MPFR features::                       The MPFR features in @command{gawk}.
+* FP Math Caution::                     Things to know.
+* Inexactness of computations::         Floating point math is not exact.
+* Inexact representation::              Numbers are not exactly represented.
+* Comparing FP Values::                 How to compare floating point values.
+* Errors accumulate::                   Errors get bigger as they go.
+* Getting Accuracy::                    Getting more accuracy takes some work.
+* Try To Round::                        Add digits and round.
+* Setting precision::                   How to set the precision.
+* Setting the rounding mode::           How to set the rounding mode.
+* Arbitrary Precision Integers::        Arbitrary Precision Integer Arithmetic
+                                        with @command{gawk}.
+* Checking for MPFR::                   How to check if MPFR is available.
+* POSIX Floating Point Problems::       Standards Versus Existing Practice.
+* Floating point summary::              Summary of floating point discussion.
+* Extension Intro::                     What is an extension.
+* Plugin License::                      A note about licensing.
+* Extension Mechanism Outline::         An outline of how it works.
+* Extension API Description::           A full description of the API.
+* Extension API Functions Introduction:: Introduction to the API functions.
+* General Data Types::                  The data types.
+* Memory Allocation Functions::         Functions for allocating memory.
+* Constructor Functions::               Functions for creating values.
+* Registration Functions::              Functions to register things with
+                                        @command{gawk}.
+* Extension Functions::                 Registering extension functions.
+* Exit Callback Functions::             Registering an exit callback.
+* Extension Version String::            Registering a version string.
+* Input Parsers::                       Registering an input parser.
+* Output Wrappers::                     Registering an output wrapper.
+* Two-way processors::                  Registering a two-way processor.
+* Printing Messages::                   Functions for printing messages.
+* Updating @code{ERRNO}::               Functions for updating @code{ERRNO}.
+* Requesting Values::                   How to get a value.
+* Accessing Parameters::                Functions for accessing parameters.
+* Symbol Table Access::                 Functions for accessing global
+                                        variables.
+* Symbol table by name::                Accessing variables by name.
+* Symbol table by cookie::              Accessing variables by ``cookie''.
+* Cached values::                       Creating and using cached values.
+* Array Manipulation::                  Functions for working with arrays.
+* Array Data Types::                    Data types for working with arrays.
+* Array Functions::                     Functions for working with arrays.
+* Flattening Arrays::                   How to flatten arrays.
+* Creating Arrays::                     How to create and populate arrays.
+* Redirection API::                     How to access and manipulate
+                                        redirections.
+* Extension API Variables::             Variables provided by the API.
+* Extension Versioning::                API Version information.
+* Extension GMP/MPFR Versioning::       Version information about GMP and
+                                        MPFR.
+* Extension API Informational Variables:: Variables providing information about
+                                        @command{gawk}'s invocation.
+* Extension API Boilerplate::           Boilerplate code for using the API.
+* Changes from API V1::                 Changes from V1 of the API.
+* Finding Extensions::                  How @command{gawk} finds compiled
+                                        extensions.
+* Extension Example::                   Example C code for an extension.
+* Internal File Description::           What the new functions will do.
+* Internal File Ops::                   The code for internal file operations.
+* Using Internal File Ops::             How to use an external extension.
+* Extension Samples::                   The sample extensions that ship with
+                                        @command{gawk}.
+* Extension Sample File Functions::     The file functions sample.
+* Extension Sample Fnmatch::            An interface to @code{fnmatch()}.
+* Extension Sample Fork::               An interface to @code{fork()} and
+                                        other process functions.
+* Extension Sample Inplace::            Enabling in-place file editing.
+* Extension Sample Ord::                Character to value to character
+                                        conversions.
+* Extension Sample Readdir::            An interface to @code{readdir()}.
+* Extension Sample Revout::             Reversing output sample output
+                                        wrapper.
+* Extension Sample Rev2way::            Reversing data sample two-way
+                                        processor.
+* Extension Sample Read write array::   Serializing an array to a file.
+* Extension Sample Readfile::           Reading an entire file into a string.
+* Extension Sample Time::               An interface to @code{gettimeofday()}
+                                        and @code{sleep()}.
+* Extension Sample API Tests::          Tests for the API.
+* gawkextlib::                          The @code{gawkextlib} project.
+* Extension summary::                   Extension summary.
+* Extension Exercises::                 Exercises.
+* V7/SVR3.1::                           The major changes between V7 and
+                                        System V Release 3.1.
+* SVR4::                                Minor changes between System V
+                                        Releases 3.1 and 4.
+* POSIX::                               New features from the POSIX standard.
+* BTL::                                 New features from Brian Kernighan's
+                                        version of @command{awk}.
+* POSIX/GNU::                           The extensions in @command{gawk} not
+                                        in POSIX @command{awk}.
+* Feature History::                     The history of the features in
+                                        @command{gawk}.
+* Common Extensions::                   Common Extensions Summary.
+* Ranges and Locales::                  How locales used to affect regexp
+                                        ranges.
+* Contributors::                        The major contributors to
+                                        @command{gawk}.
+* History summary::                     History summary.
+* Gawk Distribution::                   What is in the @command{gawk}
+                                        distribution.
+* Getting::                             How to get the distribution.
+* Extracting::                          How to extract the distribution.
+* Distribution contents::               What is in the distribution.
+* Unix Installation::                   Installing @command{gawk} under
+                                        various versions of Unix.
+* Quick Installation::                  Compiling @command{gawk} under Unix.
+* Shell Startup Files::                 Shell convenience functions.
+* Additional Configuration Options::    Other compile-time options.
+* Configuration Philosophy::            How it's all supposed to work.
+* Non-Unix Installation::               Installation on Other Operating
+                                        Systems.
+* PC Installation::                     Installing and Compiling
+                                        @command{gawk} on Microsoft Windows.
+* PC Binary Installation::              Installing a prepared distribution.
+* PC Compiling::                        Compiling @command{gawk} for
+                                        Windows32.
+* PC Using::                            Running @command{gawk} on Windows32.
+* Cygwin::                              Building and running @command{gawk}
+                                        for Cygwin.
+* MSYS::                                Using @command{gawk} In The MSYS
+                                        Environment.
+* VMS Installation::                    Installing @command{gawk} on VMS.
+* VMS Compilation::                     How to compile @command{gawk} under
+                                        VMS.
+* VMS Dynamic Extensions::              Compiling @command{gawk} dynamic
+                                        extensions on VMS.
+* VMS Installation Details::            How to install @command{gawk} under
+                                        VMS.
+* VMS Running::                         How to run @command{gawk} under VMS.
+* VMS GNV::                             The VMS GNV Project.
+* VMS Old Gawk::                        An old version comes with some VMS
+                                        systems.
+* Bugs::                                Reporting Problems and Bugs.
+* Bug address::                         Where to send reports to.
+* Usenet::                              Where not to send reports to.
+* Maintainers::                         Maintainers of non-*nix ports.
+* Other Versions::                      Other freely available @command{awk}
+                                        implementations.
+* Installation summary::                Summary of installation.
+* Compatibility Mode::                  How to disable certain @command{gawk}
+                                        extensions.
+* Additions::                           Making Additions To @command{gawk}.
+* Accessing The Source::                Accessing the Git repository.
+* Adding Code::                         Adding code to the main body of
+                                        @command{gawk}.
+* New Ports::                           Porting @command{gawk} to a new
+                                        operating system.
+* Derived Files::                       Why derived files are kept in the Git
+                                        repository.
+* Future Extensions::                   New features that may be implemented
+                                        one day.
+* Implementation Limitations::          Some limitations of the
+                                        implementation.
+* Extension Design::                    Design notes about the extension API.
+* Old Extension Problems::              Problems with the old mechanism.
+* Extension New Mechanism Goals::       Goals for the new mechanism.
+* Extension Other Design Decisions::    Some other design decisions.
+* Extension Future Growth::             Some room for future growth.
+* Notes summary::                       Summary of implementation notes.
+* Basic High Level::                    The high level view.
+* Basic Data Typing::                   A very quick intro to data types.
+@end detailmenu
+@end menu
+
+@c dedication for Info file
+@ifinfo
+To my parents, for their love, and for the wonderful
+example they set for me.
+@sp 1
+To my wife Miriam, for making me complete.
+Thank you for building your life together with me.
+@sp 1
+To our children Chana, Rivka, Nachum and Malka,
+for enrichening our lives in innumerable ways.
+@end ifinfo
+
+@summarycontents
+@contents
+
+@node Foreword3
+@unnumbered Foreword to the Third Edition
+
+@c This bit is post-processed by a script which turns the chapter
+@c tag into a preface tag, and moves this stuff to before the title.
+@c Bleah.
+@docbook
+  <prefaceinfo>
+    <author>
+      <firstname>Michael</firstname>
+      <surname>Brennan</surname>
+      <!-- can't put mawk into command tags. sigh. -->
+      <affiliation><jobtitle>Author of mawk</jobtitle></affiliation>
+    </author>
+    <date>March 2001</date>
+   </prefaceinfo>
+@end docbook
+
+Arnold Robbins and I are good friends. We were introduced
+@c 11 years ago
+in 1990
+by circumstances---and our favorite programming language, AWK.
+The circumstances started a couple of years
+earlier. I was working at a new job and noticed an unplugged
+Unix computer sitting in the corner.  No one knew how to use it,
+and neither did I.  However,
+a couple of days later, it was running, and
+I was @code{root} and the one-and-only user.
+That day, I began the transition from statistician to Unix programmer.
+
+On one of many trips to the library or bookstore in search of
+books on Unix, I found the gray AWK book, a.k.a.@:
+Alfred V.@: Aho, Brian W.@: Kernighan, and
+Peter J.@: Weinberger's @cite{The AWK Programming Language} (Addison-Wesley,
+1988).  @command{awk}'s simple programming paradigm---find a pattern in the
+input and then perform an action---often reduced complex or tedious
+data manipulations to a few lines of code.  I was excited to try my
+hand at programming in AWK.
+
+Alas,  the @command{awk} on my computer was a limited version of the
+language described in the gray book.  I discovered that my computer
+had ``old @command{awk}'' and the book described
+``new @command{awk}.''
+I learned that this was typical; the old version refused to step
+aside or relinquish its name.  If a system had a new @command{awk}, it was
+invariably called @command{nawk}, and few systems had it.
+The best way to get a new @command{awk} was to @command{ftp} the source code for
+@command{gawk} from @code{prep.ai.mit.edu}.  @command{gawk} was a version of
+new @command{awk} written by David Trueman and Arnold, and available under
+the GNU General Public License.
+
+(Incidentally,
+it's no longer difficult to find a new @command{awk}. @command{gawk} ships with
+GNU/Linux, and you can download binaries or source code for almost
+any system; my wife uses @command{gawk} on her VMS box.)
+
+My Unix system started out unplugged from the wall; it certainly was not
+plugged into a network.  So, oblivious to the existence of @command{gawk}
+and the Unix community in general, and desiring a new @command{awk}, I wrote
+my own, called @command{mawk}.
+Before I was finished, I knew about @command{gawk},
+but it was too late to stop, so I eventually posted
+to a @code{comp.sources} newsgroup.
+
+A few days after my posting, I got a friendly email
+from Arnold introducing
+himself.   He suggested we share design and algorithms and
+attached a draft of the POSIX standard so
+that I could update @command{mawk} to support language extensions added
+after publication of @cite{The AWK Programming Language}.
+
+Frankly, if our roles had
+been reversed, I would not have been so open and we probably would
+have never met.  I'm glad we did meet.
+He is an AWK expert's AWK expert and a genuinely nice person.
+Arnold contributes significant amounts of his
+expertise and time to the Free Software Foundation.
+
+This book is the @command{gawk} reference manual, but at its core it
+is a book about AWK programming that
+will appeal to a wide audience.
+It is a definitive reference to the AWK language as defined by the
+1987 Bell Laboratories release and codified in the 1992 POSIX Utilities
+standard.
+
+On the other hand, the novice AWK programmer can study
+a wealth of practical programs that emphasize
+the power of AWK's basic idioms:
+data-driven control flow, pattern matching with regular expressions,
+and associative arrays.
+Those looking for something new can try out @command{gawk}'s
+interface to network protocols via special @file{/inet} files.
+
+The programs in this book make clear that an AWK program is
+typically much smaller and faster to develop than
+a counterpart written in C.
+Consequently, there is often a payoff to prototyping an
+algorithm or design in AWK to get it running quickly and expose
+problems early. Often, the interpreted performance is adequate
+and the AWK prototype becomes the product.
+
+The new @command{pgawk} (profiling @command{gawk}), produces
+program execution counts.
+I recently experimented with an algorithm that for
+@ifnotdocbook
+@math{n}
+@end ifnotdocbook
+@ifdocbook
+@i{n}
+@end ifdocbook
+lines of input, exhibited
+@tex
+$\sim\! Cn^2$
+@end tex
+@ifnottex
+@ifnotdocbook
+~ C n^2
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>&sim; Cn<superscript>2</superscript></emphasis>
+@end docbook
+performance, while
+theory predicted
+@tex
+$\sim\! Cn\log n$
+@end tex
+@ifnottex
+@ifnotdocbook
+~ C n log n
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>&sim; Cn log n</emphasis>
+@end docbook
+behavior. A few minutes poring
+over the @file{awkprof.out} profile pinpointed the problem to
+a single line of code.  @command{pgawk} is a welcome addition to
+my programmer's toolbox.
+
+Arnold has distilled over a decade of experience writing and
+using AWK programs, and developing @command{gawk}, into this book.  If you use
+AWK or want to learn how, then read this book.
+
+@ifnotdocbook
+@cindex Brennan, Michael
+@display
+Michael Brennan
+Author of @command{mawk}
+March 2001
+@end display
+@end ifnotdocbook
+
+@node Foreword4
+@unnumbered Foreword to the Fourth Edition
+
+@c This bit is post-processed by a script which turns the chapter
+@c tag into a preface tag, and moves this stuff to before the title.
+@c Bleah.
+@docbook
+  <prefaceinfo>
+    <author>
+      <firstname>Michael</firstname>
+      <surname>Brennan</surname>
+      <!-- can't put mawk into command tags. sigh. -->
+      <affiliation><jobtitle>Author of mawk</jobtitle></affiliation>
+    </author>
+    <date>October 2014</date>
+   </prefaceinfo>
+@end docbook
+
+Some things don't change.  Thirteen years ago I wrote:
+``If you use AWK or want to learn how, then read this book.''
+True then, and still true today.
+
+Learning to use a programming language is about more than mastering the
+syntax.  One needs to acquire an understanding of how to use the
+features of the language to solve practical programming problems.
+A focus of this book is many examples that show how to use AWK.
+
+Some things do change. Our computers are much faster and have more memory.
+Consequently, speed and storage inefficiencies of a high-level language
+matter less.  Prototyping in AWK and then rewriting in C for performance
+reasons happens less, because more often the prototype is fast enough.
+
+Of course, there are computing operations that are best done in C or C++.
+With @command{gawk} 4.1 and later, you do not have to choose between writing
+your program in AWK or in C/C++.  You can write most of your
+program in AWK and the aspects that require C/C++ capabilities can be written
+in C/C++, and then the pieces glued together when the @command{gawk} module loads
+the C/C++ module as a dynamic plug-in.
+@c Chapter 16
+@ref{Dynamic Extensions},
+has all the
+details, and, as expected, many examples to help you learn the ins and outs.
+
+I enjoy programming in AWK and had fun (re)reading this book.
+I think you will too.
+
+@ifnotdocbook
+@cindex Brennan, Michael
+@display
+Michael Brennan
+Author of @command{mawk}
+October 2014
+@end display
+@end ifnotdocbook
+
+@node Preface
+@unnumbered Preface
+@c I saw a comment somewhere that the preface should describe the book itself,
+@c and the introduction should describe what the book covers.
+@c
+@c 12/2000: Chuck wants the preface & intro combined.
+
+@c This bit is post-processed by a script which turns the chapter
+@c tag into a preface tag, and moves this stuff to before the title.
+@c Bleah.
+@docbook
+  <prefaceinfo>
+    <author>
+      <firstname>Arnold</firstname>
+      <surname>Robbins</surname>
+      <affiliation><jobtitle>Nof Ayalon</jobtitle></affiliation>
+      <affiliation><jobtitle>Israel</jobtitle></affiliation>
+    </author>
+    <date>February 2015</date>
+   </prefaceinfo>
+@end docbook
+
+Several kinds of tasks occur repeatedly when working with text files.
+You might want to extract certain lines and discard the rest.  Or you
+may need to make changes wherever certain patterns appear, but leave the
+rest of the file alone.  Such jobs are often easy with @command{awk}.
+The @command{awk} utility interprets a special-purpose programming
+language that makes it easy to handle simple data-reformatting jobs.
+
+The GNU implementation of @command{awk} is called @command{gawk}; if you
+invoke it with the proper options or environment variables,
+it is fully compatible with
+the POSIX@footnote{The 2008 POSIX standard is accessible online at
+@w{@url{http://www.opengroup.org/onlinepubs/9699919799/}.}}
+specification of the @command{awk} language
+and with the Unix version of @command{awk} maintained
+by Brian Kernighan.
+This means that all
+properly written @command{awk} programs should work with @command{gawk}.
+So most of the time, we don't distinguish between @command{gawk} and other
+@command{awk} implementations.
+
+@cindex @command{awk}, POSIX and, See Also POSIX @command{awk}
+@cindex @command{awk}, POSIX and
+@cindex POSIX, @command{awk} and
+@cindex @command{gawk}, @command{awk} and
+@cindex @command{awk}, @command{gawk} and
+@cindex @command{awk}, uses for
+Using @command{awk} you can:
+
+@itemize @value{BULLET}
+@item
+Manage small, personal databases
+
+@item
+Generate reports
+
+@item
+Validate data
+
+@item
+Produce indexes and perform other document-preparation tasks
+
+@item
+Experiment with algorithms that you can adapt later to other computer
+languages
+@end itemize
+
+@cindex @command{awk}, See Also @command{gawk}
+@cindex @command{gawk}, See Also @command{awk}
+@cindex @command{gawk}, uses for
+In addition,
+@command{gawk}
+provides facilities that make it easy to:
+
+@itemize @value{BULLET}
+@item
+Extract bits and pieces of data for processing
+
+@item
+Sort data
+
+@item
+Perform simple network communications
+
+@item
+Profile and debug @command{awk} programs
+
+@item
+Extend the language with functions written in C or C++
+@end itemize
+
+This @value{DOCUMENT} teaches you about the @command{awk} language and
+how you can use it effectively.  You should already be familiar with basic
+system commands, such as @command{cat} and @command{ls},@footnote{These utilities
+are available on POSIX-compliant systems, as well as on traditional
+Unix-based systems. If you are using some other operating system, you still need to
+be familiar with the ideas of I/O redirection and pipes.} as well as basic shell
+facilities, such as input/output (I/O) redirection and pipes.
+
+@cindex GNU @command{awk}, See @command{gawk}
+Implementations of the @command{awk} language are available for many
+different computing environments.  This @value{DOCUMENT}, while describing
+the @command{awk} language in general, also describes the particular
+implementation of @command{awk} called @command{gawk} (which stands for
+``GNU @command{awk}'').  @command{gawk} runs on a broad range of Unix systems,
+ranging from Intel-architecture PC-based computers
+up through large-scale systems.
+@command{gawk} has also been ported to Mac OS X,
+Microsoft Windows
+(all versions),
+and OpenVMS.@footnote{Some other, obsolete systems to which @command{gawk}
+was once ported are no longer supported and the code for those systems
+has been removed.}
+
+@menu
+* History::                     The history of @command{gawk} and
+                                @command{awk}.
+* Names::                       What name to use to find @command{awk}.
+* This Manual::                 Using this @value{DOCUMENT}. Includes sample
+                                input files that you can use.
+* Conventions::                 Typographical Conventions.
+* Manual History::              Brief history of the GNU project and this
+                                @value{DOCUMENT}.
+* How To Contribute::           Helping to save the world.
+* Acknowledgments::             Acknowledgments.
+@end menu
+
+@node History
+@unnumberedsec History of @command{awk} and @command{gawk}
+@cindex recipe for a programming language
+@cindex programming language, recipe for
+@sidebar Recipe for a Programming Language
+
+@multitable {2 parts} {1 part  @code{egrep}} {1 part  @code{snobol}}
+@item @tab 1 part  @code{egrep} @tab 1 part  @code{snobol}
+@item @tab 2 parts @code{ed} @tab 3 parts C
+@end multitable
+
+Blend all parts well using @code{lex} and @code{yacc}.
+Document minimally and release.
+
+After eight years, add another part @code{egrep} and two
+more parts C.  Document very well and release.
+@end sidebar
+
+@cindex Aho, Alfred
+@cindex Weinberger, Peter
+@cindex Kernighan, Brian
+@cindex @command{awk}, history of
+The name @command{awk} comes from the initials of its designers: Alfred V.@:
+Aho, Peter J.@: Weinberger, and Brian W.@: Kernighan.  The original version of
+@command{awk} was written in 1977 at AT&T Bell Laboratories.
+In 1985, a new version made the programming
+language more powerful, introducing user-defined functions, multiple input
+streams, and computed regular expressions.
+This new version became widely available with Unix System V
+Release 3.1 (1987).
+The version in System V Release 4 (1989) added some new features and cleaned
+up the behavior in some of the ``dark corners'' of the language.
+The specification for @command{awk} in the POSIX Command Language
+and Utilities standard further clarified the language.
+Both the @command{gawk} designers and the original @command{awk} designers at Bell Laboratories
+provided feedback for the POSIX specification.
+
+@cindex Rubin, Paul
+@cindex Fenlason, Jay
+@cindex Trueman, David
+Paul Rubin wrote @command{gawk} in 1986.
+Jay Fenlason completed it, with advice from Richard Stallman.  John Woods
+contributed parts of the code as well.  In 1988 and 1989, David Trueman, with
+help from me, thoroughly reworked @command{gawk} for compatibility
+with the newer @command{awk}.
+Circa 1994, I became the primary maintainer.
+Current development focuses on bug fixes,
+performance improvements, standards compliance, and, occasionally, new features.
+
+In May 1997, J@"urgen Kahrs felt the need for network access
+from @command{awk}, and with a little help from me, set about adding
+features to do this for @command{gawk}.  At that time, he also
+wrote the bulk of
+@cite{@value{GAWKINETTITLE}}
+(a separate document, available as part of the @command{gawk} distribution).
+His code finally became part of the main @command{gawk} distribution
+with @command{gawk} @value{PVERSION} 3.1.
+
+John Haque rewrote the @command{gawk} internals, in the process providing
+an @command{awk}-level debugger. This version became available as
+@command{gawk} @value{PVERSION} 4.0 in 2011.
+
+@xref{Contributors}
+for a full list of those who have made important contributions to @command{gawk}.
+
+@node Names
+@unnumberedsec A Rose by Any Other Name
+
+@cindex @command{awk}, new vs.@: old
+The @command{awk} language has evolved over the years. Full details are
+provided in @ref{Language History}.
+The language described in this @value{DOCUMENT}
+is often referred to as ``new @command{awk}.''
+By analogy, the original version of @command{awk} is
+referred to as ``old @command{awk}.''
+
+On most current systems, when you run the @command{awk} utility
+you get some version of new @command{awk}.@footnote{Only
+Solaris systems still use an old @command{awk} for the
+default @command{awk} utility. A more modern @command{awk} lives in
+@file{/usr/xpg6/bin} on these systems.} If your system's standard
+@command{awk} is the old one, you will see something like this
+if you try the test program:
+
+@example
+@group
+$ @kbd{awk 1 /dev/null}
+@error{} awk: syntax error near line 1
+@error{} awk: bailing out near line 1
+@end group
+@end example
+
+@noindent
+In this case, you should find a version of new @command{awk},
+or just install @command{gawk}!
+
+Throughout this @value{DOCUMENT}, whenever we refer to a language feature
+that should be available in any complete implementation of POSIX @command{awk},
+we simply use the term @command{awk}.  When referring to a feature that is
+specific to the GNU implementation, we use the term @command{gawk}.
+
+@node This Manual
+@unnumberedsec Using This Book
+@cindex @command{awk}, terms describing
+
+The term @command{awk} refers to a particular program as well as to the language you
+use to tell this program what to do.  When we need to be careful, we call
+the language ``the @command{awk} language,''
+and the program ``the @command{awk} utility.''
+This @value{DOCUMENT} explains
+both how to write programs in the @command{awk} language and how to
+run the @command{awk} utility.
+The term ``@command{awk} program'' refers to a program written by you in
+the @command{awk} programming language.
+
+@cindex @command{gawk}, @command{awk} and
+@cindex @command{awk}, @command{gawk} and
+@cindex POSIX @command{awk}
+Primarily, this @value{DOCUMENT} explains the features of @command{awk}
+as defined in the POSIX standard.  It does so in the context of the
+@command{gawk} implementation.  While doing so, it also
+attempts to describe important differences between @command{gawk}
+and other @command{awk}
+@ifclear FOR_PRINT
+implementations.@footnote{All such differences
+appear in the index under the
+entry ``differences in @command{awk} and @command{gawk}.''}
+@end ifclear
+@ifset FOR_PRINT
+implementations.
+@end ifset
+Finally, it notes any @command{gawk} features that are not in
+the POSIX standard for @command{awk}.
+
+@ifnotinfo
+This @value{DOCUMENT} has the difficult task of being both a tutorial and a reference.
+If you are a novice, feel free to skip over details that seem too complex.
+You should also ignore the many cross-references; they are for the
+expert user and for the Info and
+@uref{https://www.gnu.org/software/gawk/manual/, HTML}
+versions of the @value{DOCUMENT}.
+@end ifnotinfo
+
+There are sidebars
+scattered throughout the @value{DOCUMENT}.
+They add a more complete explanation of points that are relevant, but not likely
+to be of interest on first reading.
+@ifclear FOR_PRINT
+All appear in the index, under the heading ``sidebar.''
+@end ifclear
+
+Most of the time, the examples use complete @command{awk} programs.
+Some of the more advanced @value{SECTION}s show only the part of the @command{awk}
+program that illustrates the concept being described.
+
+Although this @value{DOCUMENT} is aimed principally at people who have not been
+exposed
+to @command{awk}, there is a lot of information here that even the @command{awk}
+expert should find useful.  In particular, the description of POSIX
+@command{awk} and the example programs in
+@ref{Library Functions}, and
+@ifnotdocbook
+in
+@end ifnotdocbook
+@ref{Sample Programs},
+should be of interest.
+
+This @value{DOCUMENT} is split into several parts, as follows:
+
+@c FULLXREF ON
+
+@itemize @value{BULLET}
+@item
+Part I describes the @command{awk} language and the @command{gawk} program in detail.
+It starts with the basics, and continues through all of the features of @command{awk}.
+It contains the following chapters:
+
+@c nested
+@itemize @value{MINUS}
+@item
+@ref{Getting Started},
+provides the essentials you need to know to begin using @command{awk}.
+
+@item
+@ref{Invoking Gawk},
+describes how to run @command{gawk}, the meaning of its
+command-line options, and how it finds @command{awk}
+program source files.
+
+@item
+@ref{Regexp},
+introduces regular expressions in general, and in particular the flavors
+supported by POSIX @command{awk} and @command{gawk}.
+
+@item
+@ref{Reading Files},
+describes how @command{awk} reads your data.
+It introduces the concepts of records and fields, as well
+as the @code{getline} command.
+I/O redirection is first described here.
+Network I/O is also briefly introduced here.
+
+@item
+@ref{Printing},
+describes how @command{awk} programs can produce output with
+@code{print} and @code{printf}.
+
+@item
+@ref{Expressions},
+describes expressions, which are the basic building blocks
+for getting most things done in a program.
+
+@item
+@ref{Patterns and Actions},
+describes how to write patterns for matching records, actions for
+doing something when a record is matched, and the predefined variables
+@command{awk} and @command{gawk} use.
+
+@item
+@ref{Arrays},
+covers @command{awk}'s one-and-only data structure: the associative array.
+Deleting array elements and whole arrays is described, as well as
+sorting arrays in @command{gawk}.  The @value{CHAPTER} also describes how
+@command{gawk} provides arrays of arrays.
+
+@item
+@ref{Functions},
+describes the built-in functions @command{awk} and @command{gawk} provide,
+as well as how to define your own functions.  It also discusses how
+@command{gawk} lets you call functions indirectly.
+@end itemize
+
+@item
+Part II shows how to use @command{awk} and @command{gawk} for problem solving.
+There is lots of code here for you to read and learn from.
+This part contains the following chapters:
+
+@c nested
+@itemize @value{MINUS}
+@item
+@ref{Library Functions}, provides a number of functions meant to
+be used from main @command{awk} programs.
+
+@item
+@ref{Sample Programs},
+provides many sample @command{awk} programs.
+@end itemize
+
+Reading these two chapters allows you to see @command{awk}
+solving real problems.
+
+@item
+Part III focuses on features specific to @command{gawk}.
+It contains the following chapters:
+
+@c nested
+@itemize @value{MINUS}
+@item
+@ref{Advanced Features},
+describes a number of advanced features.
+Of particular note
+are the abilities to control the order of array traversal,
+have two-way communications with another process,
+perform TCP/IP networking, and
+profile your @command{awk} programs.
+
+@item
+@ref{Internationalization},
+describes special features for translating program
+messages into different languages at runtime.
+
+@item
+@ref{Debugger}, describes the @command{gawk} debugger.
+
+@item
+@ref{Namespaces}, describes how @command{gawk} allows variables and/or
+functions of the same name to be in different namespaces.
+
+@item
+@ref{Arbitrary Precision Arithmetic},
+describes advanced arithmetic facilities.
+
+@item
+@ref{Dynamic Extensions}, describes how to add new variables and
+functions to @command{gawk} by writing extensions in C or C++.
+@end itemize
+
+@item
+@ifclear FOR_PRINT
+Part IV provides the appendices, the Glossary, and two licenses that cover
+the @command{gawk} source code and this @value{DOCUMENT}, respectively.
+It contains the following appendices:
+@end ifclear
+@ifset FOR_PRINT
+Part IV provides the following appendices,
+including the GNU General Public License:
+@end ifset
+
+@itemize @value{MINUS}
+@item
+@ref{Language History},
+describes how the @command{awk} language has evolved since
+its first release to the present.  It also describes how @command{gawk}
+has acquired features over time.
+
+@item
+@ref{Installation},
+describes how to get @command{gawk}, how to compile it
+on POSIX-compatible systems,
+and how to compile and use it on different
+non-POSIX systems.  It also describes how to report bugs
+in @command{gawk} and where to get other freely
+available @command{awk} implementations.
+
+@ifset FOR_PRINT
+@item
+@ref{Copying},
+presents the license that covers the @command{gawk} source code.
+@end ifset
+
+@ifclear FOR_PRINT
+@item
+@ref{Notes},
+describes how to disable @command{gawk}'s extensions, as
+well as how to contribute new code to @command{gawk},
+and some possible future directions for @command{gawk} development.
+
+@item
+@ref{Basic Concepts},
+provides some very cursory background material for those who
+are completely unfamiliar with computer programming.
+
+@item
+The @ref{Glossary}, defines most, if not all, of the significant terms used
+throughout the @value{DOCUMENT}.  If you find terms that you aren't familiar with,
+try looking them up here.
+
+@item
+@ref{Copying}, and
+@ref{GNU Free Documentation License},
+present the licenses that cover the @command{gawk} source code
+and this @value{DOCUMENT}, respectively.
+@end ifclear
+@end itemize
+@end itemize
+
+@ifset FOR_PRINT
+The version of this @value{DOCUMENT} distributed with @command{gawk}
+contains additional appendices and other end material.
+To save space, we have omitted them from the
+printed edition. You may find them online, as follows:
+
+@itemize @value{BULLET}
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Notes.html,
+The appendix on implementation notes}
+describes how to disable @command{gawk}'s extensions, how to contribute
+new code to @command{gawk}, where to find information on some possible
+future directions for @command{gawk} development, and the design decisions
+behind the extension API.
+
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Basic-Concepts.html,
+The appendix on basic concepts}
+provides some very cursory background material for those who
+are completely unfamiliar with computer programming.
+
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Glossary.html,
+The Glossary}
+defines most, if not all, of the significant terms used
+throughout the @value{DOCUMENT}.  If you find terms that you aren't familiar with,
+try looking them up here.
+
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html,
+The GNU FDL}
+is the license that covers this @value{DOCUMENT}.
+@end itemize
+
+@c ok not to use CHAPTER / SECTION here
+Some of the chapters have exercise sections; these have also been
+omitted from the print edition but are available online.
+@end ifset
+
+@c FULLXREF OFF
+
+@node Conventions
+@unnumberedsec Typographical Conventions
+
+@cindex Texinfo
+This @value{DOCUMENT} is written in @uref{https://www.gnu.org/software/texinfo/, Texinfo},
+the GNU documentation formatting language.
+A single Texinfo source file is used to produce both the printed and online
+versions of the documentation.
+@ifnotinfo
+Because of this, the typographical conventions
+are slightly different than in other books you may have read.
+@end ifnotinfo
+@ifinfo
+This @value{SECTION} briefly documents the typographical conventions used in Texinfo.
+@end ifinfo
+
+Examples you would type at the command line are preceded by the common
+shell primary and secondary prompts, @samp{$} and @samp{>}.
+Input that you type is shown @kbd{like this}.
+@c 8/2014: @print{} is stripped from the texi to make docbook.
+@ifclear FOR_PRINT
+Output from the command is preceded by the glyph ``@print{}''.
+This typically represents the command's standard output.
+@end ifclear
+@ifset FOR_PRINT
+Output from the command, usually its standard output, appears
+@code{like this}.
+@end ifset
+Error messages and other output on the command's standard error are preceded
+by the glyph ``@error{}''.  For example:
+
+@example
+$ @kbd{echo hi on stdout}
+@print{} hi on stdout
+$ @kbd{echo hello on stderr 1>&2}
+@error{} hello on stderr
+@end example
+
+@ifnotinfo
+In the text, almost anything related to programming, such as
+command names,
+variable and function names, and string, numeric and regexp constants
+appear in @code{this font}. Code fragments
+appear in the same font and quoted, @samp{like this}.
+Things that are replaced by the user or programmer
+appear in @var{this font}.
+Options look like this: @option{-f}.
+@value{FFN}s are indicated like this: @file{/path/to/ourfile}.
+@ifclear FOR_PRINT
+Some things are
+emphasized @emph{like this}, and if a point needs to be made
+strongly, it is done @strong{like this}.
+@end ifclear
+The first occurrence of
+a new term is usually its @dfn{definition} and appears in the same
+font as the previous occurrence of ``definition'' in this sentence.
+@end ifnotinfo
+
+Characters that you type at the keyboard look @kbd{like this}.  In particular,
+there are special characters called ``control characters.''  These are
+characters that you type by holding down both the @kbd{CONTROL} key and
+another key, at the same time.  For example, a @kbd{Ctrl-d} is typed
+by first pressing and holding the @kbd{CONTROL} key, next
+pressing the @kbd{d} key, and finally releasing both keys.
+
+For the sake of brevity, throughout this @value{DOCUMENT}, we refer to
+Brian Kernighan's version of @command{awk} as ``BWK @command{awk}.''
+(@xref{Other Versions} for information on his and other versions.)
+
+@ifset FOR_PRINT
+@quotation NOTE
+Notes of interest look like this.
+@end quotation
+
+@quotation CAUTION
+Cautionary or warning notes look like this.
+@end quotation
+@end ifset
+
+@c fakenode --- for prepinfo
+@unnumberedsubsec Dark Corners
+@cindex Kernighan, Brian
+@quotation
+@i{Dark corners are basically fractal---no matter how much
+you illuminate, there's always a smaller but darker one.}
+@author Brian Kernighan
+@end quotation
+
+@cindex d.c., See dark corner
+@cindex dark corner
+Until the POSIX standard (and @cite{@value{TITLE}}),
+many features of @command{awk} were either poorly documented or not
+documented at all.  Descriptions of such features
+(often called ``dark corners'') are noted in this @value{DOCUMENT} with
+@iftex
+the picture of a flashlight in the margin, as shown here.
+@value{DARKCORNER}
+@end iftex
+@ifnottex
+``(d.c.).''
+@end ifnottex
+@ifclear FOR_PRINT
+They also appear in the index under the heading ``dark corner.''
+@end ifclear
+
+But, as noted by the opening quote, any coverage of dark
+corners is by definition incomplete.
+
+@cindex c.e., See common extensions
+Extensions to the standard @command{awk} language that are supported by
+more than one @command{awk} implementation are marked
+@ifclear FOR_PRINT
+``@value{COMMONEXT},'' and listed in the index under ``common extensions''
+and ``extensions, common.''
+@end ifclear
+@ifset FOR_PRINT
+``@value{COMMONEXT}'' for ``common extension.''
+@end ifset
+
+@node Manual History
+@unnumberedsec The GNU Project and This Book
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@cindex Stallman, Richard
+The Free Software Foundation (FSF) is a nonprofit organization dedicated
+to the production and distribution of freely distributable software.
+It was founded by Richard M.@: Stallman, the author of the original
+Emacs editor.  GNU Emacs is the most widely used version of Emacs today.
+
+@cindex GNU Project
+@cindex GPL (General Public License)
+@cindex General Public License, See GPL
+@cindex documentation, online
+The GNU@footnote{GNU stands for ``GNU's Not Unix.''}
+Project is an ongoing effort on the part of the Free Software
+Foundation to create a complete, freely distributable, POSIX-compliant
+computing environment.
+The FSF uses the GNU General Public License (GPL) to ensure that
+its software's
+source code is always available to the end user.
+@ifclear FOR_PRINT
+A copy of the GPL is included
+@ifnotinfo
+in this @value{DOCUMENT}
+@end ifnotinfo
+for your reference
+(@pxref{Copying}).
+@end ifclear
+The GPL applies to the C language source code for @command{gawk}.
+To find out more about the FSF and the GNU Project online,
+see @uref{https://www.gnu.org, the GNU Project's home page}.
+This @value{DOCUMENT} may also be read from
+@uref{https://www.gnu.org/software/gawk/manual/, GNU's website}.
+
+@ifclear FOR_PRINT
+A shell, an editor (Emacs), highly portable optimizing C, C++, and
+Objective-C compilers, a symbolic debugger and dozens of large and
+small utilities (such as @command{gawk}), have all been completed and are
+freely available.  The GNU operating
+system kernel (the HURD), has been released but remains in an early
+stage of development.
+
+@cindex Linux
+@cindex GNU/Linux
+@cindex operating systems, BSD-based
+Until the GNU operating system is more fully developed, you should
+consider using GNU/Linux, a freely distributable, Unix-like operating
+system for Intel,
+Power Architecture,
+Sun SPARC, IBM S/390, and other
+systems.@footnote{The terminology ``GNU/Linux'' is explained
+in the @ref{Glossary}.}
+Many GNU/Linux distributions are
+available for download from the Internet.
+@end ifclear
+
+@ifnotinfo
+The @value{DOCUMENT} you are reading is actually free---at least, the
+information in it is free to anyone.  The machine-readable
+source code for the @value{DOCUMENT} comes with @command{gawk}.
+@ifclear FOR_PRINT
+(Take a moment to check the Free Documentation
+License in @ref{GNU Free Documentation License}.)
+@end ifclear
+@end ifnotinfo
+
+@cindex Close, Diane
+The @value{DOCUMENT} itself has gone through multiple previous editions.
+Paul Rubin wrote the very first draft of @cite{The GAWK Manual};
+it was around 40 pages long.
+Diane Close and Richard Stallman improved it, yielding a
+version that was
+around 90 pages and barely described the original, ``old''
+version of @command{awk}.
+
+I started working with that version in the fall of 1988.
+As work on it progressed,
+the FSF published several preliminary versions (numbered 0.@var{x}).
+In 1996, edition 1.0 was released with @command{gawk} 3.0.0.
+The FSF published the first two editions under
+the title @cite{The GNU Awk User's Guide}.
+@ifset FOR_PRINT
+SSC published two editions of the @value{DOCUMENT} under the
+title @cite{Effective awk Programming}, and O'Reilly published
+the third edition in 2001.
+@end ifset
+
+This edition maintains the basic structure of the previous editions.
+For FSF edition 4.0, the content was thoroughly reviewed and updated. All
+references to @command{gawk} versions prior to 4.0 were removed.
+Of significant note for that edition was the addition of @ref{Debugger}.
+
+For FSF edition
+@ifclear FOR_PRINT
+@value{EDITION},
+@end ifclear
+@ifset FOR_PRINT
+@value{EDITION}
+(the fourth edition as published by O'Reilly),
+@end ifset
+the content has been reorganized into parts,
+and the major new additions are @ref{Arbitrary Precision Arithmetic},
+and @ref{Dynamic Extensions}.
+
+This @value{DOCUMENT} will undoubtedly continue to evolve.  If you
+find an error in the @value{DOCUMENT}, please report it!  @xref{Bugs}
+for information on submitting problem reports electronically.
+
+@ifset FOR_PRINT
+@c fakenode --- for prepinfo
+@unnumberedsec How to Stay Current
+
+You may have a newer version of @command{gawk} than the
+one described here.  To find out what has changed,
+you should first look at the @file{NEWS} file in the @command{gawk}
+distribution, which provides a high-level summary of the changes in
+each release.
+
+You can then look at the @uref{https://www.gnu.org/software/gawk/manual/,
+online version} of this @value{DOCUMENT} to read about any new features.
+@end ifset
+
+@ifclear FOR_PRINT
+@node How To Contribute
+@unnumberedsec How to Contribute
+
+As the maintainer of GNU @command{awk}, I once thought that I would be
+able to manage a collection of publicly available @command{awk} programs
+and I even solicited contributions.  Making things available on the Internet
+helps keep the @command{gawk} distribution down to manageable size.
+
+The initial collection of material, such as it is, is still available
+at @uref{ftp://ftp.freefriends.org/arnold/Awkstuff}.
+
+In the hopes of doing something more broad, I acquired the
+@code{awklang.org} domain.  Late in 2017, a volunteer took on the task
+of managing it.
+
+If you have written an interesting @command{awk} program, that
+you would like to share with the rest of the world, please see
+@uref{http://www.awklang.org} and use the ``Contact'' link.
+
+If you have written a @command{gawk} extension, please see
+@ref{gawkextlib}.
+@end ifclear
+
+@node Acknowledgments
+@unnumberedsec Acknowledgments
+
+The initial draft of @cite{The GAWK Manual} had the following acknowledgments:
+
+@quotation
+Many people need to be thanked for their assistance in producing this
+manual.  Jay Fenlason contributed many ideas and sample programs.  Richard
+Mlynarik and Robert Chassell gave helpful comments on drafts of this
+manual.  The paper @cite{A Supplemental Document for AWK} by John W.@:
+Pierce of the Chemistry Department at UC San Diego, pinpointed several
+issues relevant both to @command{awk} implementation and to this manual, that
+would otherwise have escaped us.
+@end quotation
+
+@cindex Stallman, Richard
+I would like to acknowledge Richard M.@: Stallman, for his vision of a
+better world and for his courage in founding the FSF and starting the
+GNU Project.
+
+@ifclear FOR_PRINT
+Earlier editions of this @value{DOCUMENT} had the following acknowledgements:
+@end ifclear
+@ifset FOR_PRINT
+The previous edition of this @value{DOCUMENT} had
+the following acknowledgements:
+@end ifset
+
+@quotation
+The following people (in alphabetical order)
+provided helpful comments on various
+versions of this book:
+Rick Adams,
+Dr.@: Nelson H.F. Beebe,
+Karl Berry,
+Dr.@: Michael Brennan,
+Rich Burridge,
+Claire Cloutier,
+Diane Close,
+Scott Deifik,
+Christopher (``Topher'') Eliot,
+Jeffrey Friedl,
+Dr.@: Darrel Hankerson,
+Michal Jaegermann,
+Dr.@: Richard J.@: LeBlanc,
+Michael Lijewski,
+Pat Rankin,
+Miriam Robbins,
+Mary Sheehan,
+and
+Chuck Toporek.
+
+@cindex Berry, Karl
+@cindex Chassell, Robert J.@:
+@c @cindex Texinfo
+Robert J.@: Chassell provided much valuable advice on
+the use of Texinfo.
+He also deserves special thanks for
+convincing me @emph{not} to title this @value{DOCUMENT}
+@cite{How to Gawk Politely}.
+Karl Berry helped significantly with the @TeX{} part of Texinfo.
+
+@cindex Hartholz, Marshall
+@cindex Hartholz, Elaine
+@cindex Schreiber, Bert
+@cindex Schreiber, Rita
+I would like to thank Marshall and Elaine Hartholz of Seattle and
+Dr.@: Bert and Rita Schreiber of Detroit for large amounts of quiet vacation
+time in their homes, which allowed me to make significant progress on
+this @value{DOCUMENT} and on @command{gawk} itself.
+
+@cindex Hughes, Phil
+Phil Hughes of SSC
+contributed in a very important way by loaning me his laptop GNU/Linux
+system, not once, but twice, which allowed me to do a lot of work while
+away from home.
+
+@cindex Trueman, David
+David Trueman deserves special credit; he has done a yeoman job
+of evolving @command{gawk} so that it performs well and without bugs.
+Although he is no longer involved with @command{gawk},
+working with him on this project was a significant pleasure.
+
+@cindex Drepper, Ulrich
+@cindex GNITS mailing list
+@cindex mailing list, GNITS
+The intrepid members of the GNITS mailing list, and most notably Ulrich
+Drepper, provided invaluable help and feedback for the design of the
+internationalization features.
+
+Chuck Toporek, Mary Sheehan, and Claire Cloutier of O'Reilly & Associates contributed
+significant editorial help for this @value{DOCUMENT} for the
+3.1 release of @command{gawk}.
+@end quotation
+
+@cindex Beebe, Nelson H.F.@:
+@cindex Buening, Andreas
+@cindex Collado, Manuel
+@cindex Colombo, Antonio
+@cindex Davies, Stephen
+@cindex Deifik, Scott
+@cindex Demaille, Akim
+@cindex G., Daniel Richard
+@cindex Guerrero, Juan Manuel
+@cindex Hankerson, Darrel
+@cindex Jaegermann, Michal
+@cindex Kahrs, J@"urgen
+@cindex Kasal, Stepan
+@cindex Malmberg, John
+@cindex Pitts, Dave
+@cindex Ramey, Chet
+@cindex Rankin, Pat
+@cindex Schorr, Andrew
+@cindex Vinschen, Corinna
+@cindex Zaretskii, Eli
+
+Dr.@: Nelson Beebe,
+Andreas Buening,
+Dr.@: Manuel Collado,
+Antonio Colombo,
+Stephen Davies,
+Scott Deifik,
+Akim Demaille,
+Daniel Richard G.,
+Juan Manuel Guerrero,
+Darrel Hankerson,
+Michal Jaegermann,
+J@"urgen Kahrs,
+Stepan Kasal,
+John Malmberg,
+Dave Pitts,
+Chet Ramey,
+Pat Rankin,
+Andrew Schorr,
+Corinna Vinschen,
+and Eli Zaretskii
+(in alphabetical order)
+make up the current @command{gawk} ``crack portability team.''  Without
+their hard work and help, @command{gawk} would not be nearly the robust,
+portable program it is today.  It has been and continues to be a pleasure
+working with this team of fine people.
+
+Notable code and documentation contributions were made by
+a number of people. @xref{Contributors} for the full list.
+
+@ifset FOR_PRINT
+@cindex Oram, Andy
+Thanks to Andy Oram of O'Reilly Media for initiating
+the fourth edition and for his support during the work.
+Thanks to Jasmine Kwityn for her copyediting work.
+@end ifset
+
+Thanks to Michael Brennan for the Forewords.
+
+@cindex Duman, Patrice
+@cindex Berry, Karl
+Thanks to Patrice Dumas for the new @command{makeinfo} program.
+Thanks to Karl Berry, who continues to work to keep
+the Texinfo markup language sane.
+
+@cindex Kernighan, Brian
+@cindex Brennan, Michael
+@cindex Day, Robert P.J.@:
+Robert P.J.@: Day, Michael Brennan, and Brian Kernighan kindly acted as
+reviewers for the 2015 edition of this @value{DOCUMENT}. Their feedback
+helped improve the final work.
+
+I would also like to thank Brian Kernighan for his invaluable assistance during the
+testing and debugging of @command{gawk}, and for his ongoing
+help and advice in clarifying numerous points about the language.
+We could not have done nearly as good a job on either @command{gawk}
+or its documentation without his help.
+
+Brian is in a class by himself as a programmer and technical
+author.  I have to thank him (yet again) for his ongoing friendship
+and for being a role model to me for close to 30 years!
+Having him as a reviewer is an exciting privilege. It has also
+been extremely humbling@enddots{}
+
+@cindex Robbins, Miriam
+@cindex Robbins, Jean
+@cindex Robbins, Harry
+@cindex G-d
+I must thank my wonderful wife, Miriam, for her patience through
+the many versions of this project, for her proofreading,
+and for sharing me with the computer.
+I would like to thank my parents for their love, and for the grace with
+which they raised and educated me.
+Finally, I also must acknowledge my gratitude to G-d, for the many opportunities
+He has sent my way, as well as for the gifts He has given me with which to
+take advantage of those opportunities.
+@ifnotdocbook
+@sp 2
+@noindent
+Arnold Robbins @*
+Nof Ayalon @*
+Israel @*
+February 2015
+@end ifnotdocbook
+
+@ifnotinfo
+@part @value{PART1}The @command{awk} Language
+@end ifnotinfo
+
+@ifdocbook
+
+Part I describes the @command{awk} language and @command{gawk} program
+in detail.  It starts with the basics, and continues through all of
+the features of @command{awk}. Included also are many, but not all,
+of the features of @command{gawk}.  This part contains the
+following chapters:
+
+@itemize @value{BULLET}
+@item
+@ref{Getting Started}
+
+@item
+@ref{Invoking Gawk}
+
+@item
+@ref{Regexp}
+
+@item
+@ref{Reading Files}
+
+@item
+@ref{Printing}
+
+@item
+@ref{Expressions}
+
+@item
+@ref{Patterns and Actions}
+
+@item
+@ref{Arrays}
+
+@item
+@ref{Functions}
+@end itemize
+@end ifdocbook
+
+@node Getting Started
+@chapter Getting Started with @command{awk}
+@c @cindex script, definition of
+@c @cindex rule, definition of
+@c @cindex program, definition of
+@c @cindex basic function of @command{awk}
+@cindex @command{awk}, function of
+
+The basic function of @command{awk} is to search files for lines (or other
+units of text) that contain certain patterns.  When a line matches one
+of the patterns, @command{awk} performs specified actions on that line.
+@command{awk} continues to process input lines in this way until it reaches
+the end of the input files.
+
+@cindex @command{awk}, uses for
+@cindex programming languages@comma{} data-driven vs.@: procedural
+@cindex @command{awk} programs
+Programs in @command{awk} are different from programs in most other languages,
+because @command{awk} programs are @dfn{data driven} (i.e., you describe
+the data you want to work with and then what to do when you find it).
+Most other languages are @dfn{procedural}; you have to describe, in great
+detail, every step the program should take.  When working with procedural
+languages, it is usually much
+harder to clearly describe the data your program will process.
+For this reason, @command{awk} programs are often refreshingly easy to
+read and write.
+
+@cindex program, definition of
+@cindex rule, definition of
+When you run @command{awk}, you specify an @command{awk} @dfn{program} that
+tells @command{awk} what to do.  The program consists of a series of
+@dfn{rules} (it may also contain @dfn{function definitions},
+an advanced feature that we will ignore for now;
+@pxref{User-defined}).  Each rule specifies one
+pattern to search for and one action to perform
+upon finding the pattern.
+
+Syntactically, a rule consists of a @dfn{pattern} followed by an
+@dfn{action}.  The action is enclosed in braces to separate it from the
+pattern.  Newlines usually separate rules.  Therefore, an @command{awk}
+program looks like this:
+
+@example
+@var{pattern} @{ @var{action} @}
+@var{pattern} @{ @var{action} @}
+@dots{}
+@end example
+
+@menu
+* Running gawk::                How to run @command{gawk} programs; includes
+                                command-line syntax.
+* Sample Data Files::           Sample data files for use in the @command{awk}
+                                programs illustrated in this @value{DOCUMENT}.
+* Very Simple::                 A very simple example.
+* Two Rules::                   A less simple one-line example using two
+                                rules.
+* More Complex::                A more complex example.
+* Statements/Lines::            Subdividing or combining statements into
+                                lines.
+* Other Features::              Other Features of @command{awk}.
+* When::                        When to use @command{gawk} and when to use
+                                other things.
+* Intro Summary::               Summary of the introduction.
+@end menu
+
+@node Running gawk
+@section How to Run @command{awk} Programs
+
+@cindex @command{awk} programs, running
+There are several ways to run an @command{awk} program.  If the program is
+short, it is easiest to include it in the command that runs @command{awk},
+like this:
+
+@example
+awk '@var{program}' @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@cindex command line, formats
+When the program is long, it is usually more convenient to put it in a file
+and run it with a command like this:
+
+@example
+awk -f @var{program-file} @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+This @value{SECTION} discusses both mechanisms, along with several
+variations of each.
+
+@menu
+* One-shot::                    Running a short throwaway @command{awk}
+                                program.
+* Read Terminal::               Using no input files (input from the keyboard
+                                instead).
+* Long::                        Putting permanent @command{awk} programs in
+                                files.
+* Executable Scripts::          Making self-contained @command{awk} programs.
+* Comments::                    Adding documentation to @command{gawk}
+                                programs.
+* Quoting::                     More discussion of shell quoting issues.
+@end menu
+
+@node One-shot
+@subsection One-Shot Throwaway @command{awk} Programs
+
+Once you are familiar with @command{awk}, you will often type in simple
+programs the moment you want to use them.  Then you can write the
+program as the first argument of the @command{awk} command, like this:
+
+@example
+awk '@var{program}' @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@noindent
+where @var{program} consists of a series of patterns and
+actions, as described earlier.
+
+@cindex single quote (@code{'})
+@cindex @code{'} (single quote)
+This command format instructs the @dfn{shell}, or command interpreter,
+to start @command{awk} and use the @var{program} to process records in the
+input file(s).  There are single quotes around @var{program} so
+the shell won't interpret any @command{awk} characters as special shell
+characters.  The quotes also cause the shell to treat all of @var{program} as
+a single argument for @command{awk}, and allow @var{program} to be more
+than one line long.
+
+@cindex shells, scripts
+@cindex @command{awk} programs, running, from shell scripts
+This format is also useful for running short or medium-sized @command{awk}
+programs from shell scripts, because it avoids the need for a separate
+file for the @command{awk} program.  A self-contained shell script is more
+reliable because there are no other files to misplace.
+
+Later in this chapter, in
+@ifdocbook
+the @value{SECTION}
+@end ifdocbook
+@ref{Very Simple},
+we'll see examples of several short,
+self-contained programs.
+
+@node Read Terminal
+@subsection Running @command{awk} Without Input Files
+
+@cindex standard input
+@cindex input, standard
+@cindex input files, running @command{awk} without
+You can also run @command{awk} without any input files.  If you type the
+following command line:
+
+@example
+awk '@var{program}'
+@end example
+
+@noindent
+@command{awk} applies the @var{program} to the @dfn{standard input},
+which usually means whatever you type on the keyboard.  This continues
+until you indicate end-of-file by typing @kbd{Ctrl-d}.
+(On non-POSIX operating systems, the end-of-file character may be different.)
+
+@cindex files, input, See input files
+@cindex input files, running @command{awk} without
+@cindex @command{awk} programs, running, without input files
+As an example, the following program prints a friendly piece of advice
+(from Douglas Adams's @cite{The Hitchhiker's Guide to the Galaxy}),
+to keep you from worrying about the complexities of computer
+programming:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Don\47t Panic!" @}'}
+@print{} Don't Panic!
+@end example
+
+@command{awk} executes statements associated with @code{BEGIN} before
+reading any input.  If there are no other statements in your program,
+as is the case here, @command{awk} just stops, instead of trying to read
+input it doesn't know how to process.
+The @samp{\47} is a magic way (explained later) of getting a single quote into
+the program, without having to engage in ugly shell quoting tricks.
+
+@quotation NOTE
+If you use Bash as your shell, you should execute the
+command @samp{set +H} before running this program interactively, to
+disable the C shell-style command history, which treats @samp{!} as a
+special character. We recommend putting this command into your personal
+startup file.
+@end quotation
+
+This next simple @command{awk} program
+emulates the @command{cat} utility; it copies whatever you type on the
+keyboard to its standard output (why this works is explained shortly):
+
+@example
+$ @kbd{awk '@{ print @}'}
+@kbd{Now is the time for all good men}
+@print{} Now is the time for all good men
+@kbd{to come to the aid of their country.}
+@print{} to come to the aid of their country.
+@kbd{Four score and seven years ago, ...}
+@print{} Four score and seven years ago, ...
+@kbd{What, me worry?}
+@print{} What, me worry?
+@kbd{Ctrl-d}
+@end example
+
+@node Long
+@subsection Running Long Programs
+
+@cindex @command{awk} programs, running
+@cindex @command{awk} programs, lengthy
+@cindex files, @command{awk} programs in
+Sometimes @command{awk} programs are very long.  In these cases, it is
+more convenient to put the program into a separate file.  In order to tell
+@command{awk} to use that file for its program, you type:
+
+@example
+awk -f @var{source-file} @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@cindex @option{-f} option
+@cindex command line, option @option{-f}
+The @option{-f} instructs the @command{awk} utility to get the
+@command{awk} program from the file @var{source-file} (@pxref{Options}).
+Any @value{FN} can be used for @var{source-file}.  For example, you
+could put the program:
+
+@example
+BEGIN @{ print "Don't Panic!" @}
+@end example
+
+@noindent
+into the file @file{advice}.  Then this command:
+
+@example
+awk -f advice
+@end example
+
+@noindent
+does the same thing as this one:
+
+@example
+awk 'BEGIN @{ print "Don\47t Panic!" @}'
+@end example
+
+@cindex quoting, in @command{gawk} command lines
+@noindent
+This was explained earlier
+(@pxref{Read Terminal}).
+Note that you don't usually need single quotes around the @value{FN} that you
+specify with @option{-f}, because most @value{FN}s don't contain any of the shell's
+special characters.  Notice that in @file{advice}, the @command{awk}
+program did not have single quotes around it.  The quotes are only needed
+for programs that are provided on the @command{awk} command line.
+(Also, placing the program in a file allows us to use a literal single quote in the program
+text, instead of the magic @samp{\47}.)
+
+@cindex single quote (@code{'}) in @command{gawk} command lines
+@cindex @code{'} (single quote) in @command{gawk} command lines
+If you want to clearly identify an @command{awk} program file as such,
+you can add the extension @file{.awk} to the @value{FN}.  This doesn't
+affect the execution of the @command{awk} program but it does make
+``housekeeping'' easier.
+
+@node Executable Scripts
+@subsection Executable @command{awk} Programs
+@cindex @command{awk} programs
+@cindex @code{#} (number sign), @code{#!} (executable scripts)
+@cindex Unix, @command{awk} scripts and
+@cindex number sign (@code{#}), @code{#!} (executable scripts)
+
+Once you have learned @command{awk}, you may want to write self-contained
+@command{awk} scripts, using the @samp{#!} script mechanism.  You can do
+this on many systems.@footnote{The @samp{#!} mechanism works on
+GNU/Linux systems, BSD-based systems, and commercial Unix systems.}
+For example, you could update the file @file{advice} to look like this:
+
+@example
+#! /bin/awk -f
+
+BEGIN @{ print "Don't Panic!" @}
+@end example
+
+@noindent
+After making this file executable (with the @command{chmod} utility),
+simply type @samp{advice}
+at the shell and the system arranges to run @command{awk} as if you had
+typed @samp{awk -f advice}:
+
+@example
+$ @kbd{chmod +x advice}
+$ @kbd{advice}
+@print{} Don't Panic!
+@end example
+
+@noindent
+(We assume you have the current directory in your shell's search
+path variable [typically @code{$PATH}].  If not, you may need
+to type @samp{./advice} at the shell.)
+
+Self-contained @command{awk} scripts are useful when you want to write a
+program that users can invoke without their having to know that the program is
+written in @command{awk}.
+
+@sidebar Understanding @samp{#!}
+@cindex portability, @code{#!} (executable scripts)
+
+@command{awk} is an @dfn{interpreted} language. This means that the
+@command{awk} utility reads your program and then processes your data
+according to the instructions in your program. (This is different
+from a @dfn{compiled} language such as C, where your program is first
+compiled into machine code that is executed directly by your system's
+processor.)  The @command{awk} utility is thus termed an @dfn{interpreter}.
+Many modern languages are interpreted.
+
+The line beginning with @samp{#!} lists the full @value{FN} of an
+interpreter to run and a single optional initial command-line argument
+to pass to that interpreter.  The operating system then runs the
+interpreter with the given argument and the full argument list of the
+executed program.  The first argument in the list is the full @value{FN}
+of the @command{awk} program.  The rest of the argument list contains
+either options to @command{awk}, or @value{DF}s, or both. (Note that on
+many systems @command{awk} may be found in @file{/usr/bin} instead of
+in @file{/bin}.)
+
+Some systems limit the length of the interpreter name to 32 characters.
+Often, this can be dealt with by using a symbolic link.
+
+You should not put more than one argument on the @samp{#!}
+line after the path to @command{awk}. It does not work. The operating system
+treats the rest of the line as a single argument and passes it to @command{awk}.
+Doing this leads to confusing behavior---most likely a usage diagnostic
+of some sort from @command{awk}.
+
+@cindex @code{ARGC}/@code{ARGV} variables, portability and
+@cindex portability, @code{ARGV} variable
+@cindex dark corner, @code{ARGV} variable, value of
+Finally, the value of @code{ARGV[0]}
+(@pxref{Built-in Variables})
+varies depending upon your operating system.
+Some systems put @samp{awk} there, some put the full pathname
+of @command{awk} (such as @file{/bin/awk}), and some put the name
+of your script (@samp{advice}).  @value{DARKCORNER}
+Don't rely on the value of @code{ARGV[0]}
+to provide your script name.
+@end sidebar
+
+@node Comments
+@subsection Comments in @command{awk} Programs
+@cindex @code{#} (number sign), commenting
+@cindex number sign (@code{#}), commenting
+@cindex commenting
+@cindex @command{awk} programs, documenting
+
+A @dfn{comment} is some text that is included in a program for the sake
+of human readers; it is not really an executable part of the program.  Comments
+can explain what the program does and how it works.  Nearly all
+programming languages have provisions for comments, as programs are
+typically hard to understand without them.
+
+In the @command{awk} language, a comment starts with the number sign
+character (@samp{#}) and continues to the end of the line.
+The @samp{#} does not have to be the first character on the line. The
+@command{awk} language ignores the rest of a line following a number sign.
+For example, we could have put the following into @file{advice}:
+
+@example
+# This program prints a nice, friendly message.  It helps
+# keep novice users from being afraid of the computer.
+BEGIN    @{ print "Don't Panic!" @}
+@end example
+
+You can put comment lines into keyboard-composed throwaway @command{awk}
+programs, but this usually isn't very useful; the purpose of a
+comment is to help you or another person understand the program
+when reading it at a later time.
+
+@cindex quoting, for small awk programs
+@cindex single quote (@code{'}), vs.@: apostrophe
+@cindex @code{'} (single quote), vs.@: apostrophe
+@quotation CAUTION
+As mentioned in
+@ref{One-shot},
+you can enclose short to medium-sized programs in single quotes,
+in order to keep
+your shell scripts self-contained.  When doing so, @emph{don't} put
+an apostrophe (i.e., a single quote) into a comment (or anywhere else
+in your program). The shell interprets the quote as the closing
+quote for the entire program. As a result, usually the shell
+prints a message about mismatched quotes, and if @command{awk} actually
+runs, it will probably print strange messages about syntax errors.
+For example, look at the following:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "hello" @} # let's be cute'}
+>
+@end example
+
+The shell sees that the first two quotes match, and that
+a new quoted object begins at the end of the command line.
+It therefore prompts with the secondary prompt, waiting for more input.
+With Unix @command{awk}, closing the quoted string produces this result:
+
+@example
+$ @kbd{awk '@{ print "hello" @} # let's be cute'}
+> @kbd{'}
+@error{} awk: can't open file be
+@error{}  source line number 1
+@end example
+
+@cindex @code{\} (backslash)
+@cindex backslash (@code{\})
+Putting a backslash before the single quote in @samp{let's} wouldn't help,
+because backslashes are not special inside single quotes.
+The next @value{SUBSECTION} describes the shell's quoting rules.
+@end quotation
+
+@node Quoting
+@subsection Shell Quoting Issues
+@cindex shell quoting, rules for
+
+@menu
+* DOS Quoting::                 Quoting in Windows Batch Files.
+@end menu
+
+For short to medium-length @command{awk} programs, it is most convenient
+to enter the program on the @command{awk} command line.
+This is best done by enclosing the entire program in single quotes.
+This is true whether you are entering the program interactively at
+the shell prompt, or writing it as part of a larger shell script:
+
+@example
+awk '@var{program text}' @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@cindex shells, quoting, rules for
+@cindex Bourne shell, quoting rules for
+Once you are working with the shell, it is helpful to have a basic
+knowledge of shell quoting rules.  The following rules apply only to
+POSIX-compliant, Bourne-style shells (such as Bash, the GNU Bourne-Again
+Shell).  If you use the C shell, you're on your own.
+
+Before diving into the rules, we introduce a concept that appears
+throughout this @value{DOCUMENT}, which is that of the @dfn{null},
+or empty, string.
+
+The null string is character data that has no value.
+In other words, it is empty.  It is written in @command{awk} programs
+like this: @code{""}. In the shell, it can be written using single
+or double quotes: @code{""} or @code{''}. Although the null string has
+no characters in it, it does exist. For example, consider this command:
+
+@example
+$ @kbd{echo ""}
+@end example
+
+@noindent
+Here, the @command{echo} utility receives a single argument, even
+though that argument has no characters in it. In the rest of this
+@value{DOCUMENT}, we use the terms @dfn{null string} and @dfn{empty string}
+interchangeably.  Now, on to the quoting rules:
+
+@itemize @value{BULLET}
+@item
+Quoted items can be concatenated with nonquoted items as well as with other
+quoted items.  The shell turns everything into one argument for
+the command.
+
+@item
+Preceding any single character with a backslash (@samp{\}) quotes
+that character.  The shell removes the backslash and passes the quoted
+character on to the command.
+
+@item
+@cindex @code{\} (backslash), in shell commands
+@cindex backslash (@code{\}), in shell commands
+@cindex single quote (@code{'}), in shell commands
+@cindex @code{'} (single quote), in shell commands
+Single quotes protect everything between the opening and closing quotes.
+The shell does no interpretation of the quoted text, passing it on verbatim
+to the command.
+It is @emph{impossible} to embed a single quote inside single-quoted text.
+Refer back to
+@ref{Comments}
+for an example of what happens if you try.
+
+@item
+@cindex double quote (@code{"}), in shell commands
+@cindex @code{"} (double quote), in shell commands
+Double quotes protect most things between the opening and closing quotes.
+The shell does at least variable and command substitution on the quoted text.
+Different shells may do additional kinds of processing on double-quoted text.
+
+Because certain characters within double-quoted text are processed by the shell,
+they must be @dfn{escaped} within the text.  Of note are the characters
+@samp{$}, @samp{`}, @samp{\}, and @samp{"}, all of which must be preceded by
+a backslash within double-quoted text if they are to be passed on literally
+to the program.  (The leading backslash is stripped first.)
+Thus, the example seen
+@ifnotinfo
+previously
+@end ifnotinfo
+in @ref{Read Terminal}:
+
+@example
+awk 'BEGIN @{ print "Don\47t Panic!" @}'
+@end example
+
+@noindent
+could instead be written this way:
+
+@example
+$ @kbd{awk "BEGIN @{ print \"Don't Panic!\" @}"}
+@print{} Don't Panic!
+@end example
+
+@cindex single quote (@code{'}), with double quotes
+@cindex @code{'} (single quote), with double quotes
+Note that the single quote is not special within double quotes.
+
+@item
+Null strings are removed when they occur as part of a non-null
+command-line argument, while explicit null objects are kept.
+For example, to specify that the field separator @code{FS} should
+be set to the null string, use:
+
+@example
+awk -F "" '@var{program}' @var{files} # correct
+@end example
+
+@noindent
+@cindex null strings in @command{gawk} arguments, quoting and
+Don't use this:
+
+@example
+awk -F"" '@var{program}' @var{files}  # wrong!
+@end example
+
+@noindent
+In the second case, @command{awk} attempts to use the text of the program
+as the value of @code{FS}, and the first @value{FN} as the text of the program!
+This results in syntax errors at best, and confusing behavior at worst.
+@end itemize
+
+@cindex quoting, in @command{gawk} command lines, tricks for
+Mixing single and double quotes is difficult.  You have to resort
+to shell quoting tricks, like this:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Here is a single quote <'"'"'>" @}'}
+@print{} Here is a single quote <'>
+@end example
+
+@noindent
+This program consists of three concatenated quoted strings.  The first and the
+third are single-quoted, and the second is double-quoted.
+
+This can be ``simplified'' to:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Here is a single quote <'\''>" @}'}
+@print{} Here is a single quote <'>
+@end example
+
+@noindent
+Judge for yourself which of these two is the more readable.
+
+Another option is to use double quotes, escaping the embedded, @command{awk}-level
+double quotes:
+
+@example
+$ @kbd{awk "BEGIN @{ print \"Here is a single quote <'>\" @}"}
+@print{} Here is a single quote <'>
+@end example
+
+@noindent
+This option is also painful, because double quotes, backslashes, and dollar signs
+are very common in more advanced @command{awk} programs.
+
+A third option is to use the octal escape sequence equivalents
+(@pxref{Escape Sequences})
+for the
+single- and double-quote characters, like so:
+
+@example
+@group
+$ @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 <">
+@end group
+@end example
+
+@noindent
+This works nicely, but you should comment clearly what the
+escapes mean.
+
+A fourth option is to use command-line variable assignment, like this:
+
+@example
+$ @kbd{awk -v sq="'" 'BEGIN @{ print "Here is a single quote <" sq ">" @}'}
+@print{} Here is a single quote <'>
+@end example
+
+(Here, the two string constants and the value of @code{sq} are concatenated
+into a single string that is printed by @code{print}.)
+
+If you really need both single and double quotes in your @command{awk}
+program, it is probably best to move it into a separate file, where
+the shell won't be part of the picture and you can say what you mean.
+
+@node DOS Quoting
+@subsubsection Quoting in MS-Windows Batch Files
+
+@ignore
+Date: Wed, 21 May 2008 09:58:43 +0200 (CEST)
+From: jeroen.brink@inter.NL.net
+Subject: (g)awk "contribution"
+To: arnold@skeeve.com
+Message-id: <42220.193.172.132.34.1211356723.squirrel@webmail.internl.net>
+
+Hello Arnold,
+
+maybe you can help me out. Found your email on the GNU/awk online manual
+pages.
+
+I've searched hard to figure out how, on Windows, to print double quotes.
+Couldn't find it in the Quotes area, nor on google or elsewhere. Finally i
+figured out how to do this myself.
+
+How to print all lines in a file surrounded by double quotes (on Windows):
+
+gawk "{ print \"\042\" $0 \"\042\" }" <file>
+
+Maybe this is a helpfull tip for other (Windows) gawk users. However, i
+don't have a clue as to where to "publish" this tip! Do you?
+
+Kind regards,
+
+Jeroen Brink
+@end ignore
+
+Although this @value{DOCUMENT} generally only worries about POSIX systems and the
+POSIX shell, the following issue arises often enough for many users that
+it is worth addressing.
+
+@cindex Brink, Jeroen
+The ``shells'' on Microsoft Windows systems use the double-quote
+character for quoting, and make it difficult or impossible to include an
+escaped double-quote character in a command-line script.  The following
+example, courtesy of Jeroen Brink, shows how to escape the double quotes
+from this one liner script that prints all lines in a file surrounded by
+double quotes:
+
+@example
+@{ print "\"" $0 "\"" @}
+@end example
+
+@noindent
+In an MS-Windows command-line the one-liner script above may be passed as
+follows:
+
+@example
+gawk "@{ print \"\042\" $0 \"\042\" @}" @var{file}
+@end example
+
+In this example the @samp{\042} is the octal code for a double-quote;
+@command{gawk} converts it into a real double-quote for output by
+the @code{print} statement.
+
+In MS-Windows escaping double-quotes is a little tricky because you use
+backslashes to escape double-quotes, but backslashes themselves are not
+escaped in the usual way; indeed they are either duplicated or not,
+depending upon whether there is a subsequent double-quote.  The MS-Windows
+rule for double-quoting a string is the following:
+
+@enumerate
+@item
+For each double quote in the original string, let @var{N} be the number
+of backslash(es) before it, @var{N} might be zero. Replace these @var{N}
+backslash(es) by @math{2@value{TIMES}@var{N}+1} backslash(es)
+
+@item
+Let @var{N} be the number of backslash(es) tailing the original string,
+@var{N} might be zero. Replace these @var{N} backslash(es) by
+@math{2@value{TIMES}@var{N}} backslash(es)
+
+@item
+Surround the resulting string by double-quotes.
+@end enumerate
+
+So to double-quote the one-liner script @samp{@{ print "\"" $0 "\"" @}}
+from the previous example you would do it this way:
+
+@example
+gawk "@{ print \"\\\"\" $0 \"\\\"\" @}" @var{file}
+@end example
+
+@noindent
+However, the use of @samp{\042} instead of @samp{\\\"} is also possible
+and easier to read, because backslashes that are not followed by a
+double-quote don't need duplication.
+
+@node Sample Data Files
+@section @value{DDF}s for the Examples
+
+@cindex input files, examples
+@cindex @code{mail-list} file
+Many of the examples in this @value{DOCUMENT} take their input from two sample
+@value{DF}s.  The first, @file{mail-list}, represents a list of peoples' names
+together with their email addresses and information about those people.
+The second @value{DF}, called @file{inventory-shipped}, contains
+information about monthly shipments.  In both files,
+each line is considered to be one @dfn{record}.
+
+In @file{mail-list}, each record contains the name of a person,
+his/her phone number, his/her email address, and a code for his/her relationship
+with the author of the list.
+The columns are aligned using spaces.
+An @samp{A} in the last column
+means that the person is an acquaintance.  An @samp{F} in the last
+column means that the person is a friend.
+An @samp{R} means that the person is a relative:
+
+@example
+@c system if test ! -d eg      ; then mkdir eg      ; fi
+@c system if test ! -d eg/lib  ; then mkdir eg/lib  ; fi
+@c system if test ! -d eg/data ; then mkdir eg/data ; fi
+@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi
+@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi
+@c file eg/data/mail-list
+Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+Anthony      555-3412     anthony.asserturo@@hotmail.com   A
+Becky        555-7685     becky.algebrarum@@gmail.com      A
+Bill         555-1675     bill.drowning@@hotmail.com       A
+Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
+Camilla      555-2912     camilla.infusarum@@skynet.be     R
+Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
+Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+Martin       555-6480     martin.codicibus@@hotmail.com    A
+Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@c endfile
+@end example
+
+@cindex @code{inventory-shipped} file
+The @value{DF} @file{inventory-shipped} represents
+information about shipments during the year.
+Each record contains the month, the number
+of green crates shipped, the number of red boxes shipped, the number of
+orange bags shipped, and the number of blue packages shipped,
+respectively.  There are 16 entries, covering the 12 months of last year
+and the first four months of the current year.
+An empty line separates the data for the two years:
+
+@example
+@c file eg/data/inventory-shipped
+Jan  13  25  15 115
+Feb  15  32  24 226
+Mar  15  24  34 228
+Apr  31  52  63 420
+May  16  34  29 208
+Jun  31  42  75 492
+Jul  24  34  67 436
+Aug  15  34  47 316
+Sep  13  55  37 277
+Oct  29  54  68 525
+Nov  20  87  82 577
+Dec  17  35  61 401
+
+Jan  21  36  64 620
+Feb  26  58  80 652
+Mar  24  75  70 495
+Apr  21  70  74 514
+@c endfile
+@end example
+
+The sample files are included in the @command{gawk} distribution,
+in the directory @file{awklib/eg/data}.
+
+@node Very Simple
+@section Some Simple Examples
+
+The following command runs a simple @command{awk} program that searches the
+input file @file{mail-list} for the character string @samp{li} (a
+grouping of characters is usually called a @dfn{string};
+the term @dfn{string} is based on similar usage in English, such
+as ``a string of pearls'' or ``a string of cars in a train''):
+
+@example
+awk '/li/ @{ print $0 @}' mail-list
+@end example
+
+@noindent
+When lines containing @samp{li} are found, they are printed because
+@w{@samp{print $0}} means print the current line.  (Just @samp{print} by
+itself means the same thing, so we could have written that
+instead.)
+
+You will notice that slashes (@samp{/}) surround the string @samp{li}
+in the @command{awk} program.  The slashes indicate that @samp{li}
+is the pattern to search for.  This type of pattern is called a
+@dfn{regular expression}, which is covered in more detail later
+(@pxref{Regexp}).
+The pattern is allowed to match parts of words.
+There are
+single quotes around the @command{awk} program so that the shell won't
+interpret any of it as special shell characters.
+
+Here is what this program prints:
+
+@example
+$ @kbd{awk '/li/ @{ print $0 @}' mail-list}
+@print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+@print{} Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
+@print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+@print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+@end example
+
+@cindex actions, default
+@cindex patterns, default
+In an @command{awk} rule, either the pattern or the action can be omitted,
+but not both.  If the pattern is omitted, then the action is performed
+for @emph{every} input line.  If the action is omitted, the default
+action is to print all lines that match the pattern.
+
+@cindex actions, empty
+Thus, we could leave out the action (the @code{print} statement and the
+braces) in the previous example and the result would be the same:
+@command{awk} prints all lines matching the pattern @samp{li}.  By comparison,
+omitting the @code{print} statement but retaining the braces makes an
+empty action that does nothing (i.e., no lines are printed).
+
+@cindex @command{awk} programs, one-line examples
+Many practical @command{awk} programs are just a line or two long.  Following is a
+collection of useful, short programs to get you started.  Some of these
+programs contain constructs that haven't been covered yet. (The description
+of the program will give you a good idea of what is going on, but you'll
+need to read the rest of the @value{DOCUMENT} to become an @command{awk} expert!)
+Most of the examples use a @value{DF} named @file{data}.  This is just a
+placeholder; if you use these programs yourself, substitute
+your own @value{FN}s for @file{data}.
+For future reference, note that there is often more than
+one way to do things in @command{awk}.  At some point, you may want
+to look back at these examples and see if
+you can come up with different ways to do the same things shown here:
+
+@itemize @value{BULLET}
+@item
+Print every line that is longer than 80 characters:
+
+@example
+awk 'length($0) > 80' data
+@end example
+
+The sole rule has a relational expression as its pattern and has no
+action---so it uses the default action, printing the record.
+
+@item
+Print the length of the longest input line:
+
+@example
+@group
+awk '@{ if (length($0) > max) max = length($0) @}
+     END @{ print max @}' data
+@end group
+@end example
+
+The code associated with @code{END} executes after all
+input has been read; it's the other side of the coin to @code{BEGIN}.
+
+@cindex @command{expand} utility
+@item
+Print the length of the longest line in @file{data}:
+
+@example
+expand data | awk '@{ if (x < length($0)) x = length($0) @}
+                   END @{ print "maximum line length is " x @}'
+@end example
+
+This example differs slightly from the previous one:
+the input is processed by the @command{expand} utility to change TABs
+into spaces, so the widths compared are actually the right-margin columns,
+as opposed to the number of input characters on each line.
+
+@item
+Print every line that has at least one field:
+
+@example
+awk 'NF > 0' data
+@end example
+
+This is an easy way to delete blank lines from a file (or rather, to
+create a new file similar to the old file but from which the blank lines
+have been removed).
+
+@item
+Print seven random numbers from 0 to 100, inclusive:
+
+@example
+awk 'BEGIN @{ for (i = 1; i <= 7; i++)
+                 print int(101 * rand()) @}'
+@end example
+
+@item
+Print the total number of bytes used by @var{files}:
+
+@example
+ls -l @var{files} | awk '@{ x += $5 @}
+                   END @{ print "total bytes: " x @}'
+@end example
+
+@item
+Print the total number of kilobytes used by @var{files}:
+
+@c Don't use \ continuation, not discussed yet
+@c Remember that awk does floating point division,
+@c no need for (x+1023) / 1024
+@example
+ls -l @var{files} | awk '@{ x += $5 @}
+   END @{ print "total K-bytes:", x / 1024 @}'
+@end example
+
+@item
+Print a sorted list of the login names of all users:
+
+@example
+awk -F: '@{ print $1 @}' /etc/passwd | sort
+@end example
+
+@item
+Count the lines in a file:
+
+@example
+awk 'END @{ print NR @}' data
+@end example
+
+@item
+Print the even-numbered lines in the @value{DF}:
+
+@example
+awk 'NR % 2 == 0' data
+@end example
+
+If you used the expression @samp{NR % 2 == 1} instead,
+the program would print the odd-numbered lines.
+@end itemize
+
+@node Two Rules
+@section An Example with Two Rules
+@cindex @command{awk} programs
+
+The @command{awk} utility reads the input files one line at a
+time.  For each line, @command{awk} tries the patterns of each rule.
+If several patterns match, then several actions execute in the order in
+which they appear in the @command{awk} program.  If no patterns match, then
+no actions run.
+
+After processing all the rules that match the line (and perhaps there are none),
+@command{awk} reads the next line.  (However,
+@pxref{Next Statement}
+@ifdocbook
+and @ref{Nextfile Statement}.)
+@end ifdocbook
+@ifnotdocbook
+and also @pxref{Nextfile Statement}.)
+@end ifnotdocbook
+This continues until the program reaches the end of the file.
+For example, the following @command{awk} program contains two rules:
+
+@example
+/12/  @{ print $0 @}
+/21/  @{ print $0 @}
+@end example
+
+@noindent
+The first rule has the string @samp{12} as the
+pattern and @samp{print $0} as the action.  The second rule has the
+string @samp{21} as the pattern and also has @samp{print $0} as the
+action.  Each rule's action is enclosed in its own pair of braces.
+
+This program prints every line that contains the string
+@samp{12} @emph{or} the string @samp{21}.  If a line contains both
+strings, it is printed twice, once by each rule.
+
+This is what happens if we run this program on our two sample @value{DF}s,
+@file{mail-list} and @file{inventory-shipped}:
+
+@example
+$ @kbd{awk '/12/ @{ print $0 @}}
+>      @kbd{/21/ @{ print $0 @}' mail-list inventory-shipped}
+@print{} Anthony      555-3412     anthony.asserturo@@hotmail.com   A
+@print{} Camilla      555-2912     camilla.infusarum@@skynet.be     R
+@print{} Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@print{} Jan  21  36  64 620
+@print{} Apr  21  70  74 514
+@end example
+
+@noindent
+Note how the line beginning with @samp{Jean-Paul}
+in @file{mail-list} was printed twice, once for each rule.
+
+@node More Complex
+@section A More Complex Example
+
+Now that we've mastered some simple tasks, let's look at
+what typical @command{awk}
+programs do.  This example shows how @command{awk} can be used to
+summarize, select, and rearrange the output of another utility.  It uses
+features that haven't been covered yet, so don't worry if you don't
+understand all the details:
+
+@example
+ls -l | awk '$6 == "Nov" @{ sum += $5 @}
+             END @{ print sum @}'
+@end example
+
+@cindex @command{ls} utility
+This command prints the total number of bytes in all the files in the
+current directory that were last modified in November (of any year).
+The @w{@samp{ls -l}} part of this example is a system command that gives
+you a listing of the files in a directory, including each file's size and the date
+the file was last modified. Its output looks like this:
+
+@example
+-rw-r--r--  1 arnold   user   1933 Nov  7 13:05 Makefile
+-rw-r--r--  1 arnold   user  10809 Nov  7 13:03 awk.h
+-rw-r--r--  1 arnold   user    983 Apr 13 12:14 awk.tab.h
+-rw-r--r--  1 arnold   user  31869 Jun 15 12:20 awkgram.y
+-rw-r--r--  1 arnold   user  22414 Nov  7 13:03 awk1.c
+-rw-r--r--  1 arnold   user  37455 Nov  7 13:03 awk2.c
+-rw-r--r--  1 arnold   user  27511 Dec  9 13:07 awk3.c
+-rw-r--r--  1 arnold   user   7989 Nov  7 13:03 awk4.c
+@end example
+
+@noindent
+@cindex line continuations, with C shell
+The first field contains read-write permissions, the second field contains
+the number of links to the file, and the third field identifies the file's owner.
+The fourth field identifies the file's group.
+The fifth field contains the file's size in bytes.  The
+sixth, seventh, and eighth fields contain the month, day, and time,
+respectively, that the file was last modified.  Finally, the ninth field
+contains the @value{FN}.
+
+@c @cindex automatic initialization
+@cindex initialization, automatic
+The @samp{$6 == "Nov"} in our @command{awk} program is an expression that
+tests whether the sixth field of the output from @w{@samp{ls -l}}
+matches the string @samp{Nov}.  Each time a line has the string
+@samp{Nov} for its sixth field, @command{awk} performs the action
+@samp{sum += $5}.  This adds the fifth field (the file's size) to the variable
+@code{sum}.  As a result, when @command{awk} has finished reading all the
+input lines, @code{sum} is the total of the sizes of the files whose
+lines matched the pattern.  (This works because @command{awk} variables
+are automatically initialized to zero.)
+
+After the last line of output from @command{ls} has been processed, the
+@code{END} rule executes and prints the value of @code{sum}.
+In this example, the value of @code{sum} is 80600.
+
+These more advanced @command{awk} techniques are covered in later
+@value{SECTION}s
+(@pxref{Action Overview}).  Before you can move on to more
+advanced @command{awk} programming, you have to know how @command{awk} interprets
+your input and displays your output.  By manipulating fields and using
+@code{print} statements, you can produce some very useful and
+impressive-looking reports.
+
+@node Statements/Lines
+@section @command{awk} Statements Versus Lines
+@cindex line breaks
+@cindex newlines
+
+Most often, each line in an @command{awk} program is a separate statement or
+separate rule, like this:
+
+@example
+awk '/12/  @{ print $0 @}
+     /21/  @{ print $0 @}' mail-list inventory-shipped
+@end example
+
+@cindex @command{gawk}, newlines in
+However, @command{gawk} ignores newlines after any of the following
+symbols and keywords:
+
+@example
+,    @{    ?    :    ||    &&    do    else
+@end example
+
+@noindent
+A newline at any other point is considered the end of the
+statement.@footnote{The @samp{?} and @samp{:} referred to here is the
+three-operand conditional expression described in
+@ref{Conditional Exp}.
+Splitting lines after @samp{?} and @samp{:} is a minor @command{gawk}
+extension; if @option{--posix} is specified
+(@pxref{Options}), then this extension is disabled.}
+
+@cindex @code{\} (backslash), continuing lines and
+@cindex backslash (@code{\}), continuing lines and
+If you would like to split a single statement into two lines at a point
+where a newline would terminate it, you can @dfn{continue} it by ending the
+first line with a backslash character (@samp{\}).  The backslash must be
+the final character on the line in order to be recognized as a continuation
+character.  A backslash is allowed anywhere in the statement, even
+in the middle of a string or regular expression.  For example:
+
+@example
+awk '/This regular expression is too long, so continue it\
+ on the next line/ @{ print $1 @}'
+@end example
+
+@noindent
+@cindex portability, backslash continuation and
+We have generally not used backslash continuation in our sample programs.
+@command{gawk} places no limit on the
+length of a line, so backslash continuation is never strictly necessary;
+it just makes programs more readable.  For this same reason, as well as
+for clarity, we have kept most statements short in the programs
+presented throughout the @value{DOCUMENT}.  Backslash continuation is
+most useful when your @command{awk} program is in a separate source file
+instead of entered from the command line.  You should also note that
+many @command{awk} implementations are more particular about where you
+may use backslash continuation. For example, they may not allow you to
+split a string constant using backslash continuation.  Thus, for maximum
+portability of your @command{awk} programs, it is best not to split your
+lines in the middle of a regular expression or a string.
+@c 10/2000: gawk, mawk, and current bell labs awk allow it,
+@c solaris 2.7 nawk does not. Solaris /usr/xpg4/bin/awk does though!  sigh.
+
+@cindex @command{csh} utility
+@cindex backslash (@code{\}), continuing lines and, in @command{csh}
+@cindex @code{\} (backslash), continuing lines and, in @command{csh}
+@quotation CAUTION
+@emph{Backslash continuation does not work as described
+with the C shell.}  It works for @command{awk} programs in files and
+for one-shot programs, @emph{provided} you are using a POSIX-compliant
+shell, such as the Unix Bourne shell or Bash.  But the C shell behaves
+differently!  There you must use two backslashes in a row, followed by
+a newline.  Note also that when using the C shell, @emph{every} newline
+in your @command{awk} program must be escaped with a backslash. To illustrate:
+
+@example
+% @kbd{awk 'BEGIN @{ \}
+? @kbd{  print \\}
+? @kbd{      "hello, world" \}
+? @kbd{@}'}
+@print{} hello, world
+@end example
+
+@noindent
+Here, the @samp{%} and @samp{?} are the C shell's primary and secondary
+prompts, analogous to the standard shell's @samp{$} and @samp{>}.
+
+Compare the previous example to how it is done with a POSIX-compliant shell:
+
+@example
+$ @kbd{awk 'BEGIN @{}
+>   @kbd{print \}
+>       @kbd{"hello, world"}
+> @kbd{@}'}
+@print{} hello, world
+@end example
+@end quotation
+
+@command{awk} is a line-oriented language.  Each rule's action has to
+begin on the same line as the pattern.  To have the pattern and action
+on separate lines, you @emph{must} use backslash continuation; there
+is no other option.
+
+@cindex backslash (@code{\}), continuing lines and, comments and
+@cindex @code{\} (backslash), continuing lines and, comments and
+@cindex commenting, backslash continuation and
+Another thing to keep in mind is that backslash continuation and
+comments do not mix. As soon as @command{awk} sees the @samp{#} that
+starts a comment, it ignores @emph{everything} on the rest of the
+line. For example:
+
+@example
+@group
+$ @kbd{gawk 'BEGIN @{ print "dont panic" # a friendly \}
+> @kbd{                                   BEGIN rule}
+> @kbd{@}'}
+@error{} gawk: cmd. line:2:                BEGIN rule
+@error{} gawk: cmd. line:2:                ^ syntax error
+@end group
+@end example
+
+@noindent
+In this case, it looks like the backslash would continue the comment onto the
+next line. However, the backslash-newline combination is never even
+noticed because it is ``hidden'' inside the comment. Thus, the
+@code{BEGIN} is noted as a syntax error.
+
+@cindex statements, multiple
+@cindex @code{;} (semicolon), separating statements in actions
+@cindex semicolon (@code{;}), separating statements in actions
+@cindex @code{;} (semicolon), separating rules
+@cindex semicolon (@code{;}), separating rules
+When @command{awk} statements within one rule are short, you might want to put
+more than one of them on a line.  This is accomplished by separating the statements
+with a semicolon (@samp{;}).
+This also applies to the rules themselves.
+Thus, the program shown at the start of this @value{SECTION}
+could also be written this way:
+
+@example
+/12/ @{ print $0 @} ; /21/ @{ print $0 @}
+@end example
+
+@quotation NOTE
+The requirement that states that rules on the same line must be
+separated with a semicolon was not in the original @command{awk}
+language; it was added for consistency with the treatment of statements
+within an action.
+@end quotation
+
+@node Other Features
+@section Other Features of @command{awk}
+
+@cindex variables
+The @command{awk} language provides a number of predefined, or
+@dfn{built-in}, variables that your programs can use to get information
+from @command{awk}.  There are other variables your program can set
+as well to control how @command{awk} processes your data.
+
+In addition, @command{awk} provides a number of built-in functions for doing
+common computational and string-related operations.
+@command{gawk} provides built-in functions for working with timestamps,
+performing bit manipulation, for runtime string translation (internationalization),
+determining the type of a variable,
+and array sorting.
+
+As we develop our presentation of the @command{awk} language, we will introduce
+most of the variables and many of the functions. They are described
+systematically in @ref{Built-in Variables} and in
+@ref{Built-in}.
+
+@node When
+@section When to Use @command{awk}
+
+@cindex @command{awk}, uses for
+Now that you've seen some of what @command{awk} can do,
+you might wonder how @command{awk} could be useful for you.  By using
+utility programs, advanced patterns, field separators, arithmetic
+statements, and other selection criteria, you can produce much more
+complex output.  The @command{awk} language is very useful for producing
+reports from large amounts of raw data, such as summarizing information
+from the output of other utility programs like @command{ls}.
+(@xref{More Complex}.)
+
+Programs written with @command{awk} are usually much smaller than they would
+be in other languages.  This makes @command{awk} programs easy to compose and
+use.  Often, @command{awk} programs can be quickly composed at your keyboard,
+used once, and thrown away.  Because @command{awk} programs are interpreted, you
+can avoid the (usually lengthy) compilation part of the typical
+edit-compile-test-debug cycle of software development.
+
+@cindex Brian Kernighan's @command{awk}
+Complex programs have been written in @command{awk}, including a complete
+retargetable assembler for
+@ifclear FOR_PRINT
+eight-bit microprocessors (@pxref{Glossary}, for more information),
+@end ifclear
+@ifset FOR_PRINT
+eight-bit microprocessors,
+@end ifset
+and a microcode assembler for a special-purpose Prolog
+computer.
+The original @command{awk}'s capabilities were strained by tasks
+of such complexity, but modern versions are more capable.
+
+@cindex @command{awk} programs, complex
+If you find yourself writing @command{awk} scripts of more than, say,
+a few hundred lines, you might consider using a different programming
+language.  The shell is good at string and pattern matching; in addition,
+it allows powerful use of the system utilities.  Python offers a nice
+balance between high-level ease of programming and access to system
+facilities.@footnote{Other popular scripting languages include Ruby
+and Perl.}
+
+@node Intro Summary
+@section Summary
+
+@c FIXME: Review this chapter for summary of builtin functions called.
+@itemize @value{BULLET}
+@item
+Programs in @command{awk} consist of @var{pattern}--@var{action} pairs.
+
+@item
+An @var{action} without a @var{pattern} always runs.  The default
+@var{action} for a pattern without one is @samp{@{ print $0 @}}.
+
+@item
+Use either
+@samp{awk '@var{program}' @var{files}}
+or
+@samp{awk -f @var{program-file} @var{files}}
+to run @command{awk}.
+
+@item
+You may use the special @samp{#!} header line to create @command{awk}
+programs that are directly executable.
+
+@item
+Comments in @command{awk} programs start with @samp{#} and continue to
+the end of the same line.
+
+@item
+Be aware of quoting issues when writing @command{awk} programs as
+part of a larger shell script (or MS-Windows batch file).
+
+@item
+You may use backslash continuation to continue a source line.
+Lines are automatically continued after
+a comma, open brace, question mark, colon,
+@samp{||}, @samp{&&}, @code{do}, and @code{else}.
+@end itemize
+
+@node Invoking Gawk
+@chapter Running @command{awk} and @command{gawk}
+
+This @value{CHAPTER} covers how to run @command{awk}, both POSIX-standard
+and @command{gawk}-specific command-line options, and what
+@command{awk} and
+@command{gawk} do with nonoption arguments.
+It then proceeds to cover how @command{gawk} searches for source files,
+reading standard input along with other files, @command{gawk}'s
+environment variables, @command{gawk}'s exit status, using include files,
+and obsolete and undocumented options and/or features.
+
+Many of the options and features described here are discussed in
+more detail later in the @value{DOCUMENT}; feel free to skip over
+things in this @value{CHAPTER} that don't interest you right now.
+
+@menu
+* Command Line::                How to run @command{awk}.
+* Options::                     Command-line options and their meanings.
+* Other Arguments::             Input file names and variable assignments.
+* Naming Standard Input::       How to specify standard input with other
+                                files.
+* Environment Variables::       The environment variables @command{gawk} uses.
+* Exit Status::                 @command{gawk}'s exit status.
+* Include Files::               Including other files into your program.
+* Loading Shared Libraries::    Loading shared libraries into your program.
+* Obsolete::                    Obsolete Options and/or features.
+* Undocumented::                Undocumented Options and Features.
+* Invoking Summary::            Invocation summary.
+@end menu
+
+@node Command Line
+@section Invoking @command{awk}
+@cindex command line, invoking @command{awk} from
+@cindex @command{awk}, invoking
+@cindex arguments, command-line, invoking @command{awk}
+@cindex options, command-line, invoking @command{awk}
+
+There are two ways to run @command{awk}---with an explicit program or with
+one or more program files.  Here are templates for both of them; items
+enclosed in [@dots{}] in these templates are optional:
+
+@display
+@command{awk} [@var{options}] @option{-f} @var{progfile} [@option{--}] @var{file} @dots{}
+@command{awk} [@var{options}] [@option{--}] @code{'@var{program}'} @var{file} @dots{}
+@end display
+
+@cindex GNU long options
+@cindex long options
+@cindex options, long
+In addition to traditional one-letter POSIX-style options, @command{gawk} also
+supports GNU long options.
+
+@cindex dark corner, invoking @command{awk}
+@cindex lint checking, empty programs
+It is possible to invoke @command{awk} with an empty program:
+
+@example
+awk '' datafile1 datafile2
+@end example
+
+@cindex @option{--lint} option
+@cindex dark corner, empty programs
+@noindent
+Doing so makes little sense, though; @command{awk} exits
+silently when given an empty program.
+@value{DARKCORNER}
+If @option{--lint} has
+been specified on the command line, @command{gawk} issues a
+warning that the program is empty.
+
+@node Options
+@section Command-Line Options
+@cindex options, command-line
+@cindex command line, options
+@cindex GNU long options
+@cindex options, long
+
+Options begin with a dash and consist of a single character.
+GNU-style long options consist of two dashes and a keyword.
+The keyword can be abbreviated, as long as the abbreviation allows the option
+to be uniquely identified.  If the option takes an argument, either the
+keyword is immediately followed by an equals sign (@samp{=}) and the
+argument's value, or the keyword and the argument's value are separated
+by whitespace.
+If a particular option with a value is given more than once, it is the
+last value that counts.
+
+@cindex POSIX @command{awk}, GNU long options and
+Each long option for @command{gawk} has a corresponding
+POSIX-style short option.
+The long and short options are
+interchangeable in all contexts.
+The following list describes options mandated by the POSIX standard:
+
+@table @code
+@item -F @var{fs}
+@itemx --field-separator @var{fs}
+@cindex @option{-F} option
+@cindex @option{--field-separator} option
+@cindex @code{FS} variable, @code{--field-separator} option and
+Set the @code{FS} variable to @var{fs}
+(@pxref{Field Separators}).
+
+@item -f @var{source-file}
+@itemx --file @var{source-file}
+@cindex @option{-f} option
+@cindex @option{--file} option
+@cindex @command{awk} programs, location of
+Read the @command{awk} program source from @var{source-file}
+instead of in the first nonoption argument.
+This option may be given multiple times; the @command{awk}
+program consists of the concatenation of the contents of
+each specified @var{source-file}.
+
+Files named with @option{-f} are treated as if they had @samp{@@namespace "awk"}
+at their beginning. @xref{Changing The Namespace}, for more information.
+
+@item -v @var{var}=@var{val}
+@itemx --assign @var{var}=@var{val}
+@cindex @option{-v} option
+@cindex @option{--assign} option
+@cindex variables, setting
+Set the variable @var{var} to the value @var{val} @emph{before}
+execution of the program begins.  Such variable values are available
+inside the @code{BEGIN} rule
+(@pxref{Other Arguments}).
+
+The @option{-v} option can only set one variable, but it can be used
+more than once, setting another variable each time, like this:
+@samp{awk @w{-v foo=1} @w{-v bar=2} @dots{}}.
+
+@cindex predefined variables, @code{-v} option@comma{} setting with
+@cindex variables, predefined, @code{-v} option@comma{} setting with
+@quotation CAUTION
+Using @option{-v} to set the values of the built-in
+variables may lead to surprising results.  @command{awk} will reset the
+values of those variables as it needs to, possibly ignoring any
+initial value you may have given.
+@end quotation
+
+@item -W @var{gawk-opt}
+@cindex @option{-W} option
+Provide an implementation-specific option.
+This is the POSIX convention for providing implementation-specific options.
+These options
+also have corresponding GNU-style long options.
+Note that the long options may be abbreviated, as long as
+the abbreviations remain unique.
+The full list of @command{gawk}-specific options is provided next.
+
+@item --
+@cindex command line, options, end of
+@cindex options, command-line, end of
+Signal the end of the command-line options.  The following arguments
+are not treated as options even if they begin with @samp{-}.  This
+interpretation of @option{--} follows the POSIX argument parsing
+conventions.
+
+@cindex @code{-} (hyphen), file names beginning with
+@cindex hyphen (@code{-}), file names beginning with
+This is useful if you have @value{FN}s that start with @samp{-},
+or in shell scripts, if you have @value{FN}s that will be specified
+by the user that could start with @samp{-}.
+It is also useful for passing options on to the @command{awk}
+program; see @ref{Getopt Function}.
+@end table
+
+The following list describes @command{gawk}-specific options:
+
+@c Have to use @asis here to get docbook to come out right.
+@table @asis
+@item @option{-b}
+@itemx @option{--characters-as-bytes}
+@cindex @option{-b} option
+@cindex @option{--characters-as-bytes} option
+Cause @command{gawk} to treat all input data as single-byte characters.
+In addition, all output written with @code{print} or @code{printf}
+is treated as single-byte characters.
+
+Normally, @command{gawk} follows the POSIX standard and attempts to process
+its input data according to the current locale (@pxref{Locales}). This can often involve
+converting multibyte characters into wide characters (internally), and
+can lead to problems or confusion if the input data does not contain valid
+multibyte characters. This option is an easy way to tell @command{gawk},
+``Hands off my data!''
+
+@item @option{-c}
+@itemx @option{--traditional}
+@cindex @option{-c} option
+@cindex @option{--traditional} option
+@cindex compatibility mode (@command{gawk}), specifying
+Specify @dfn{compatibility mode}, in which the GNU extensions to
+the @command{awk} language are disabled, so that @command{gawk} behaves just
+like BWK @command{awk}.
+@xref{POSIX/GNU},
+which summarizes the extensions.
+@ifclear FOR_PRINT
+Also see
+@ref{Compatibility Mode}.
+@end ifclear
+
+@item @option{-C}
+@itemx @option{--copyright}
+@cindex @option{-C} option
+@cindex @option{--copyright} option
+@cindex GPL (General Public License), printing
+Print the short version of the General Public License and then exit.
+
+@item @option{-d}[@var{file}]
+@itemx @option{--dump-variables}[@code{=}@var{file}]
+@cindex @option{-d} option
+@cindex @option{--dump-variables} option
+@cindex dump all variables of a program
+@cindex @file{awkvars.out} file
+@cindex files, @file{awkvars.out}
+@cindex variables, global, printing list of
+Print a sorted list of global variables, their types, and final values
+to @var{file}.  If no @var{file} is provided, print this
+list to a file named @file{awkvars.out} in the current directory.
+No space is allowed between the @option{-d} and @var{file}, if
+@var{file} is supplied.
+
+@cindex troubleshooting, typographical errors@comma{} global variables
+Having a list of all global variables is a good way to look for
+typographical errors in your programs.
+You would also use this option if you have a large program with a lot of
+functions, and you want to be sure that your functions don't
+inadvertently use global variables that you meant to be local.
+(This is a particularly easy mistake to make with simple variable
+names like @code{i}, @code{j}, etc.)
+
+@item @option{-D}[@var{file}]
+@itemx @option{--debug}[@code{=}@var{file}]
+@cindex @option{-D} option
+@cindex @option{--debug} option
+@cindex @command{awk} debugging, enabling
+Enable debugging of @command{awk} programs
+(@pxref{Debugging}).
+By default, the debugger reads commands interactively from the keyboard
+(standard input).
+The optional @var{file} argument allows you to specify a file with a list
+of commands for the debugger to execute noninteractively.
+No space is allowed between the @option{-D} and @var{file}, if
+@var{file} is supplied.
+
+@item @option{-e} @var{program-text}
+@itemx @option{--source} @var{program-text}
+@cindex @option{-e} option
+@cindex @option{--source} option
+@cindex source code, mixing
+Provide program source code in the @var{program-text}.
+This option allows you to mix source code in files with source
+code that you enter on the command line.
+This is particularly useful
+when you have library functions that you want to use from your command-line
+programs (@pxref{AWKPATH Variable}).
+
+Note that @command{gawk} treats each string as if it ended with
+a newline character (even if it doesn't). This makes building
+the total program easier.
+
+@quotation CAUTION
+Prior to @value{PVERSION} 5.0, there was
+no requirement that each @var{program-text}
+be a full syntactic unit. I.e., the following worked:
+
+@example
+$ @kbd{gawk -e 'BEGIN @{ a = 5 ;' -e 'print a @}'}
+@print{} 5
+@end example
+
+@noindent
+However, this is no longer true. If you have any scripts that
+rely upon this feature, you should revise them.
+
+This is because each @var{program-text} is treated as if it had
+@samp{@@namespace "awk"} at its beginning. @xref{Changing The Namespace},
+for more information.
+@end quotation
+
+@item @option{-E} @var{file}
+@itemx @option{--exec} @var{file}
+@cindex @option{-E} option
+@cindex @option{--exec} option
+@cindex @command{awk} programs, location of
+@cindex CGI, @command{awk} scripts for
+Similar to @option{-f}, read @command{awk} program text from @var{file}.
+There are two differences from @option{-f}:
+
+@itemize @value{BULLET}
+@item
+This option terminates option processing; anything
+else on the command line is passed on directly to the @command{awk} program.
+
+@item
+Command-line variable assignments of the form
+@samp{@var{var}=@var{value}} are disallowed.
+@end itemize
+
+This option is particularly necessary for World Wide Web CGI applications
+that pass arguments through the URL; using this option prevents a malicious
+(or other) user from passing in options, assignments, or @command{awk} source
+code (via @option{-e}) to the CGI application.@footnote{For more detail,
+please see Section 4.4 of @uref{http://www.ietf.org/rfc/rfc3875,
+RFC 3875}. Also see the
+@uref{https://lists.gnu.org/archive/html/bug-gawk/2014-11/msg00022.html,
+explanatory note sent to the @command{gawk} bug
+mailing list}.}
+This option should be used
+with @samp{#!} scripts (@pxref{Executable Scripts}), like so:
+
+@example
+#! /usr/local/bin/gawk -E
+
+@var{awk program here @dots{}}
+@end example
+
+@item @option{-g}
+@itemx @option{--gen-pot}
+@cindex @option{-g} option
+@cindex @option{--gen-pot} option
+@cindex portable object files, generating
+@cindex files, portable object, generating
+Analyze the source program and
+generate a GNU @command{gettext} portable object template file on standard
+output for all string constants that have been marked for translation.
+@xref{Internationalization},
+for information about this option.
+
+@item @option{-h}
+@itemx @option{--help}
+@cindex @option{-h} option
+@cindex @option{--help} option
+@cindex GNU long options, printing list of
+@cindex options, printing list of
+@cindex printing, list of options
+Print a ``usage'' message summarizing the short- and long-style options
+that @command{gawk} accepts and then exit.
+
+@item @option{-i} @var{source-file}
+@itemx @option{--include} @var{source-file}
+@cindex @option{-i} option
+@cindex @option{--include} option
+@cindex @command{awk} programs, location of
+Read an @command{awk} source library from @var{source-file}.  This option
+is completely equivalent to using the @code{@@include} directive inside
+your program.  It is very similar to the @option{-f} option,
+but there are two important differences.  First, when @option{-i} is
+used, the program source is not loaded if it has been previously
+loaded, whereas with @option{-f}, @command{gawk} always loads the file.
+Second, because this option is intended to be used with code libraries,
+@command{gawk} does not recognize such files as constituting main program
+input.  Thus, after processing an @option{-i} argument, @command{gawk}
+still expects to find the main source code via the @option{-f} option
+or on the command line.
+
+Files named with @option{-i} are treated as if they had @samp{@@namespace "awk"}
+at their beginning.  @xref{Changing The Namespace}, for more information.
+
+@item @option{-l} @var{ext}
+@itemx @option{--load} @var{ext}
+@cindex @option{-l} option
+@cindex @option{--load} option
+@cindex loading, extensions
+Load a dynamic extension named @var{ext}. Extensions
+are stored as system shared libraries.
+This option searches for the library using the @env{AWKLIBPATH}
+environment variable.  The correct library suffix for your platform will be
+supplied by default, so it need not be specified in the extension name.
+The extension initialization routine should be named @code{dl_load()}.
+An alternative is to use the @code{@@load} keyword inside the program to load
+a shared library.  This advanced feature is described in detail in @ref{Dynamic Extensions}.
+
+@item @option{-L}[@var{value}]
+@itemx @option{--lint}[@code{=}@var{value}]
+@cindex @option{-l} option
+@cindex @option{--lint} option
+@cindex lint checking, issuing warnings
+@cindex warnings, issuing
+Warn about constructs that are dubious or nonportable to
+other @command{awk} implementations.
+No space is allowed between the @option{-L} and @var{value}, if
+@var{value} is supplied.
+Some warnings are issued when @command{gawk} first reads your program.  Others
+are issued at runtime, as your program executes.
+With an optional argument of @samp{fatal},
+lint warnings become fatal errors.
+This may be drastic, but its use will certainly encourage the
+development of cleaner @command{awk} programs.
+With an optional argument of @samp{invalid}, only warnings about things
+that are actually invalid are issued. (This is not fully implemented yet.)
+With an optional argument of @samp{no-ext}, warnings about @command{gawk}
+extensions are disabled.
+
+Some warnings are only printed once, even if the dubious constructs they
+warn about occur multiple times in your @command{awk} program.  Thus,
+when eliminating problems pointed out by @option{--lint}, you should take
+care to search for all occurrences of each inappropriate construct. As
+@command{awk} programs are usually short, doing so is not burdensome.
+
+@item @option{-M}
+@itemx @option{--bignum}
+@cindex @option{-M} option
+@cindex @option{--bignum} option
+Select arbitrary-precision arithmetic on numbers. This option has no effect
+if @command{gawk} is not compiled to use the GNU MPFR and MP libraries
+(@pxref{Arbitrary Precision Arithmetic}).
+
+@item @option{-n}
+@itemx @option{--non-decimal-data}
+@cindex @option{-n} option
+@cindex @option{--non-decimal-data} option
+@cindex hexadecimal values@comma{} enabling interpretation of
+@cindex octal values@comma{} enabling interpretation of
+@cindex troubleshooting, @code{--non-decimal-data} option
+Enable automatic interpretation of octal and hexadecimal
+values in input data
+(@pxref{Nondecimal Data}).
+
+@quotation CAUTION
+This option can severely break old programs.  Use with care.  Also note
+that this option may disappear in a future version of @command{gawk}.
+@end quotation
+
+@item @option{-N}
+@itemx @option{--use-lc-numeric}
+@cindex @option{-N} option
+@cindex @option{--use-lc-numeric} option
+Force the use of the locale's decimal point character
+when parsing numeric input data (@pxref{Locales}).
+
+@cindex pretty printing
+@item @option{-o}[@var{file}]
+@itemx @option{--pretty-print}[@code{=}@var{file}]
+@cindex @option{-o} option
+@cindex @option{--pretty-print} option
+Enable pretty-printing of @command{awk} programs.
+Implies @option{--no-optimize}.
+By default, the output program is created in a file named @file{awkprof.out}
+(@pxref{Profiling}).
+The optional @var{file} argument allows you to specify a different
+@value{FN} for the output.
+No space is allowed between the @option{-o} and @var{file}, if
+@var{file} is supplied.
+
+@quotation NOTE
+In the past, this option would also execute your program.
+This is no longer the case.
+@end quotation
+
+@item @option{-O}
+@itemx @option{--optimize}
+@cindex @option{--optimize} option
+@cindex @option{-O} option
+Enable @command{gawk}'s default optimizations on the internal
+representation of the program.  At the moment, this includes just simple
+constant folding.
+
+Optimization is enabled by default.
+This option remains primarily for backwards compatibility. However, it may
+be used to cancel the effect of an earlier @option{-s} option
+(see later in this list).
+
+@item @option{-p}[@var{file}]
+@itemx @option{--profile}[@code{=}@var{file}]
+@cindex @option{-p} option
+@cindex @option{--profile} option
+@cindex @command{awk} profiling, enabling
+Enable profiling of @command{awk} programs
+(@pxref{Profiling}).
+Implies @option{--no-optimize}.
+By default, profiles are created in a file named @file{awkprof.out}.
+The optional @var{file} argument allows you to specify a different
+@value{FN} for the profile file.
+No space is allowed between the @option{-p} and @var{file}, if
+@var{file} is supplied.
+
+The profile contains execution counts for each statement in the program
+in the left margin, and function call counts for each function.
+
+@item @option{-P}
+@itemx @option{--posix}
+@cindex @option{-P} option
+@cindex @option{--posix} option
+@cindex POSIX mode
+@cindex @command{gawk}, extensions@comma{} disabling
+Operate in strict POSIX mode.  This disables all @command{gawk}
+extensions (just like @option{--traditional}) and
+disables all extensions not allowed by POSIX.
+@xref{Common Extensions} for a summary of the extensions
+in @command{gawk} that are disabled by this option.
+Also,
+the following additional
+restrictions apply:
+
+@itemize @value{BULLET}
+
+@cindex newlines
+@cindex whitespace, newlines as
+@item
+Newlines are not allowed after @samp{?} or @samp{:}
+(@pxref{Conditional Exp}).
+
+
+@cindex @code{FS} variable, TAB character as
+@item
+Specifying @samp{-Ft} on the command line does not set the value
+of @code{FS} to be a single TAB character
+(@pxref{Field Separators}).
+
+@cindex locale decimal point character
+@cindex decimal point character, locale specific
+@item
+The locale's decimal point character is used for parsing input
+data (@pxref{Locales}).
+@end itemize
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex @option{--traditional} option, @code{--posix} option and
+@cindex @option{--posix} option, @code{--traditional} option and
+If you supply both @option{--traditional} and @option{--posix} on the
+command line, @option{--posix} takes precedence. @command{gawk}
+issues a warning if both options are supplied.
+
+@item @option{-r}
+@itemx @option{--re-interval}
+@cindex @option{-r} option
+@cindex @option{--re-interval} option
+@cindex regular expressions, interval expressions and
+Allow interval expressions
+(@pxref{Regexp Operators})
+in regexps.
+This is now @command{gawk}'s default behavior.
+Nevertheless, this option remains (both for backward compatibility
+and for use in combination with @option{--traditional}).
+
+@item @option{-s}
+@itemx @option{--no-optimize}
+@cindex @option{--no-optimize} option
+@cindex @option{-s} option
+Disable @command{gawk}'s default optimizations on the internal
+representation of the program.
+
+@item @option{-S}
+@itemx @option{--sandbox}
+@cindex @option{-S} option
+@cindex @option{--sandbox} option
+@cindex sandbox mode
+@cindex @code{ARGV} array
+Disable the @code{system()} function,
+input redirections with @code{getline},
+output redirections with @code{print} and @code{printf},
+and dynamic extensions.
+Also, disallow adding filenames to @code{ARGV} that were
+not there when @command{gawk} started running.
+This is particularly useful when you want to run @command{awk} scripts
+from questionable sources and need to make sure the scripts
+can't access your system (other than the specified input @value{DF}).
+
+@item @option{-t}
+@itemx @option{--lint-old}
+@cindex @option{-L} option
+@cindex @option{--lint-old} option
+Warn about constructs that are not available in the original version of
+@command{awk} from Version 7 Unix
+(@pxref{V7/SVR3.1}).
+
+@item @option{-V}
+@itemx @option{--version}
+@cindex @option{-V} option
+@cindex @option{--version} option
+@cindex @command{gawk}, versions of, information about@comma{} printing
+Print version information for this particular copy of @command{gawk}.
+This allows you to determine if your copy of @command{gawk} is up to date
+with respect to whatever the Free Software Foundation is currently
+distributing.
+It is also useful for bug reports
+(@pxref{Bugs}).
+@end table
+
+As long as program text has been supplied,
+any other options are flagged as invalid with a warning message but
+are otherwise ignored.
+
+@cindex @option{-F} option, @option{-Ft} sets @code{FS} to TAB
+In compatibility mode, as a special case, if the value of @var{fs} supplied
+to the @option{-F} option is @samp{t}, then @code{FS} is set to the TAB
+character (@code{"\t"}).  This is true only for @option{--traditional} and not
+for @option{--posix}
+(@pxref{Field Separators}).
+
+@cindex @option{-f} option, multiple uses
+The @option{-f} option may be used more than once on the command line.
+If it is, @command{awk} reads its program source from all of the named files, as
+if they had been concatenated together into one big file.  This is
+useful for creating libraries of @command{awk} functions.  These functions
+can be written once and then retrieved from a standard place, instead
+of having to be included in each individual program.
+The @option{-i} option is similar in this regard.
+(As mentioned in
+@ref{Definition Syntax},
+function names must be unique.)
+
+With standard @command{awk}, library functions can still be used, even
+if the program is entered at the keyboard,
+by specifying @samp{-f /dev/tty}.  After typing your program,
+type @kbd{Ctrl-d} (the end-of-file character) to terminate it.
+(You may also use @samp{-f -} to read program source from the standard
+input, but then you will not be able to also use the standard input as a
+source of data.)
+
+Because it is clumsy using the standard @command{awk} mechanisms to mix
+source file and command-line @command{awk} programs, @command{gawk}
+provides the @option{-e} option.  This does not require you to
+preempt the standard input for your source code; it allows you to easily
+mix command-line and library source code (@pxref{AWKPATH Variable}).
+As with @option{-f}, the @option{-e} and @option{-i}
+options may also be used multiple times on the command line.
+
+@cindex @option{-e} option
+If no @option{-f} option (or @option{-e} option for @command{gawk})
+is specified, then @command{awk} uses the first nonoption command-line
+argument as the text of the program source code.  Arguments on
+the command line that follow the program text are entered into the
+@code{ARGV} array; @command{awk} does @emph{not} continue to parse the
+command line looking for options.
+
+@cindex @env{POSIXLY_CORRECT} environment variable
+@cindex lint checking, @env{POSIXLY_CORRECT} environment variable
+@cindex POSIX mode
+If the environment variable @env{POSIXLY_CORRECT} exists,
+then @command{gawk} behaves in strict POSIX mode, exactly as if
+you had supplied @option{--posix}.
+Many GNU programs look for this environment variable to suppress
+extensions that conflict with POSIX, but @command{gawk} behaves
+differently: it suppresses all extensions, even those that do not
+conflict with POSIX, and behaves in
+strict POSIX mode. If @option{--lint} is supplied on the command line
+and @command{gawk} turns on POSIX mode because of @env{POSIXLY_CORRECT},
+then it issues a warning message indicating that POSIX
+mode is in effect.
+You would typically set this variable in your shell's startup file.
+For a Bourne-compatible shell (such as Bash), you would add these
+lines to the @file{.profile} file in your home directory:
+
+@example
+POSIXLY_CORRECT=true
+export POSIXLY_CORRECT
+@end example
+
+@cindex @command{csh} utility, @env{POSIXLY_CORRECT} environment variable
+For a C shell-compatible
+shell,@footnote{Not recommended.}
+you would add this line to the @file{.login} file in your home directory:
+
+@example
+setenv POSIXLY_CORRECT true
+@end example
+
+@cindex portability, @env{POSIXLY_CORRECT} environment variable
+Having @env{POSIXLY_CORRECT} set is not recommended for daily use,
+but it is good for testing the portability of your programs to other
+environments.
+
+@node Other Arguments
+@section Other Command-Line Arguments
+@cindex command line, arguments
+@cindex arguments, command-line
+
+Any additional arguments on the command line are normally treated as
+input files to be processed in the order specified.   However, an
+argument that has the form @code{@var{var}=@var{value}}, assigns
+the value @var{value} to the variable @var{var}---it does not specify a
+file at all.  (See @ref{Assignment Options}.) In the following example,
+@var{count=1} is a variable assignment, not a @value{FN}:
+
+@example
+awk -f program.awk file1 count=1 file2
+@end example
+
+@cindex @command{gawk}, @code{ARGIND} variable in
+@cindex @code{ARGIND} variable, command-line arguments
+@cindex @code{ARGV} array, indexing into
+@cindex @code{ARGC}/@code{ARGV} variables, command-line arguments
+All the command-line arguments are made available to your @command{awk} program in the
+@code{ARGV} array (@pxref{Built-in Variables}).  Command-line options
+and the program text (if present) are omitted from @code{ARGV}.
+All other arguments, including variable assignments, are
+included.   As each element of @code{ARGV} is processed, @command{gawk}
+sets @code{ARGIND} to the index in @code{ARGV} of the
+current element.
+
+@c FIXME: One day, move the ARGC and ARGV node closer to here.
+Changing @code{ARGC} and @code{ARGV} in your @command{awk} program lets
+you control how @command{awk} processes the input files; this is described
+in more detail in @ref{ARGC and ARGV}.
+
+@cindex input files, variable assignments and
+@cindex variable assignments and input files
+The distinction between @value{FN} arguments and variable-assignment
+arguments is made when @command{awk} is about to open the next input file.
+At that point in execution, it checks the @value{FN} to see whether
+it is really a variable assignment; if so, @command{awk} sets the variable
+instead of reading a file.
+
+Therefore, the variables actually receive the given values after all
+previously specified files have been read.  In particular, the values of
+variables assigned in this fashion are @emph{not} available inside a
+@code{BEGIN} rule
+(@pxref{BEGIN/END}),
+because such rules are run before @command{awk} begins scanning the argument list.
+
+@cindex dark corner, escape sequences
+The variable values given on the command line are processed for escape
+sequences (@pxref{Escape Sequences}).
+@value{DARKCORNER}
+
+In some very early implementations of @command{awk}, when a variable assignment
+occurred before any @value{FN}s, the assignment would happen @emph{before}
+the @code{BEGIN} rule was executed.  @command{awk}'s behavior was thus
+inconsistent; some command-line assignments were available inside the
+@code{BEGIN} rule, while others were not.  Unfortunately,
+some applications came to depend
+upon this ``feature.''  When @command{awk} was changed to be more consistent,
+the @option{-v} option was added to accommodate applications that depended
+upon the old behavior.
+
+The variable assignment feature is most useful for assigning to variables
+such as @code{RS}, @code{OFS}, and @code{ORS}, which control input and
+output formats, before scanning the @value{DF}s.  It is also useful for
+controlling state if multiple passes are needed over a @value{DF}.  For
+example:
+
+@cindex files, multiple passes over
+@example
+awk 'pass == 1  @{ @var{pass 1 stuff} @}
+     pass == 2  @{ @var{pass 2 stuff} @}' pass=1 mydata pass=2 mydata
+@end example
+
+Given the variable assignment feature, the @option{-F} option for setting
+the value of @code{FS} is not
+strictly necessary.  It remains for historical compatibility.
+
+@node Naming Standard Input
+@section Naming Standard Input
+
+Often, you may wish to read standard input together with other files.
+For example, you may wish to read one file, read standard input coming
+from a pipe, and then read another file.
+
+The way to name the standard input, with all versions of @command{awk},
+is to use a single, standalone minus sign or dash, @samp{-}.  For example:
+
+@example
+@var{some_command} | awk -f myprog.awk file1 - file2
+@end example
+
+@noindent
+Here, @command{awk} first reads @file{file1}, then it reads
+the output of @var{some_command}, and finally it reads
+@file{file2}.
+
+You may also use @code{"-"} to name standard input when reading
+files with @code{getline} (@pxref{Getline/File}).
+And, you can even use @code{"-"} with the @option{-f} option
+to read program source code from standard input (@pxref{Options}).
+
+In addition, @command{gawk} allows you to specify the special
+@value{FN} @file{/dev/stdin}, both on the command line and
+with @code{getline}.
+Some other versions of @command{awk} also support this, but it
+is not standard.
+(Some operating systems provide a @file{/dev/stdin} file
+in the filesystem; however, @command{gawk} always processes
+this @value{FN} itself.)
+
+@node Environment Variables
+@section The Environment Variables @command{gawk} Uses
+@cindex environment variables used by @command{gawk}
+
+A number of environment variables influence how @command{gawk}
+behaves.
+
+@menu
+* AWKPATH Variable::            Searching directories for @command{awk}
+                                programs.
+* AWKLIBPATH Variable::         Searching directories for @command{awk} shared
+                                libraries.
+* Other Environment Variables:: The environment variables.
+@end menu
+
+@node AWKPATH Variable
+@subsection The @env{AWKPATH} Environment Variable
+@cindex @env{AWKPATH} environment variable
+@cindex directories, searching for source files
+@cindex search paths, for source files
+@cindex differences in @command{awk} and @command{gawk}, @env{AWKPATH} environment variable
+@ifinfo
+The previous @value{SECTION} described how @command{awk} program files can be named
+on the command line with the @option{-f} option.
+@end ifinfo
+In most @command{awk}
+implementations, you must supply a precise pathname for each program
+file, unless the file is in the current directory.
+But with @command{gawk}, if the @value{FN} supplied to the @option{-f}
+or @option{-i} options
+does not contain a directory separator @samp{/}, then @command{gawk} searches a list of
+directories (called the @dfn{search path}) one by one, looking for a
+file with the specified name.
+
+The search path is a string consisting of directory names
+separated by colons.@footnote{Semicolons on MS-Windows.}
+@command{gawk} gets its search path from the
+@env{AWKPATH} environment variable.  If that variable does not exist,
+or if it has an empty value,
+@command{gawk} uses a default path (described shortly).
+
+The search path feature is particularly helpful for building libraries
+of useful @command{awk} functions.  The library files can be placed in a
+standard directory in the default path and then specified on
+the command line with a short @value{FN}.  Otherwise, you would have to
+type the full @value{FN} for each file.
+
+By using the @option{-i} or @option{-f} options, your command-line
+@command{awk} programs can use facilities in @command{awk} library files
+(@pxref{Library Functions}).
+Path searching is not done if @command{gawk} is in compatibility mode.
+This is true for both @option{--traditional} and @option{--posix}.
+@xref{Options}.
+
+If the source code file is not found after the initial search, the path is searched
+again after adding the suffix @samp{.awk} to the @value{FN}.
+
+@command{gawk}'s path search mechanism is similar
+to the shell's.
+(See @uref{https://www.gnu.org/software/bash/manual/,
+@cite{The Bourne-Again SHell manual}}.)
+It treats a null entry in the path as indicating the current
+directory.
+(A null entry is indicated by starting or ending the path with a
+colon or by placing two colons next to each other [@samp{::}].)
+
+@quotation NOTE
+To include the current directory in the path, either place @file{.}
+as an entry in the path or write a null entry in the path.
+
+Different past versions of @command{gawk} would also look explicitly in
+the current directory, either before or after the path search.  As of
+@value{PVERSION} 4.1.2, this no longer happens; if you wish to look
+in the current directory, you must include @file{.} either as a separate
+entry or as a null entry in the search path.
+@end quotation
+
+The default value for @env{AWKPATH} is
+@samp{.:/usr/local/share/awk}.@footnote{Your version of @command{gawk}
+may use a different directory; it
+will depend upon how @command{gawk} was built and installed. The actual
+directory is the value of @code{$(datadir)} generated when
+@command{gawk} was configured.  You probably don't need to worry about this,
+though.}  Since @file{.} is included at the beginning, @command{gawk}
+searches first in the current directory and then in @file{/usr/local/share/awk}.
+In practice, this means that you will rarely need to change the
+value of @env{AWKPATH}.
+
+@xref{Shell Startup Files}, for information on functions that help to
+manipulate the @env{AWKPATH} variable.
+
+@command{gawk} places the value of the search path that it used into
+@code{ENVIRON["AWKPATH"]}. This provides access to the actual search
+path value from within an @command{awk} program.
+
+Although you can change @code{ENVIRON["AWKPATH"]} within your @command{awk}
+program, this has no effect on the running program's behavior.  This makes
+sense: the @env{AWKPATH} environment variable is used to find the program
+source files.  Once your program is running, all the files have been
+found, and @command{gawk} no longer needs to use @env{AWKPATH}.
+
+@node AWKLIBPATH Variable
+@subsection The @env{AWKLIBPATH} Environment Variable
+@cindex @env{AWKLIBPATH} environment variable
+@cindex directories, searching for loadable extensions
+@cindex search paths, for loadable extensions
+@cindex differences in @command{awk} and @command{gawk}, @code{AWKLIBPATH} environment variable
+
+The @env{AWKLIBPATH} environment variable is similar to the @env{AWKPATH}
+variable, but it is used to search for loadable extensions (stored as
+system shared libraries) specified with the @option{-l} option rather
+than for source files.  If the extension is not found, the path is
+searched again after adding the appropriate shared library suffix for
+the platform.  For example, on GNU/Linux systems, the suffix @samp{.so}
+is used.  The search path specified is also used for extensions loaded
+via the @code{@@load} keyword (@pxref{Loading Shared Libraries}).
+
+If @env{AWKLIBPATH} does not exist in the environment, or if it has
+an empty value, @command{gawk} uses a default path; this
+is typically @samp{/usr/local/lib/gawk}, although it can vary depending
+upon how @command{gawk} was built.
+
+@xref{Shell Startup Files}, for information on functions that help to
+manipulate the @env{AWKLIBPATH} variable.
+
+@command{gawk} places the value of the search path that it used into
+@code{ENVIRON["AWKLIBPATH"]}. This provides access to the actual search
+path value from within an @command{awk} program.
+
+Although you can change @code{ENVIRON["AWKLIBPATH"]} within your
+@command{awk} program, this has no effect on the running program's
+behavior.  This makes sense: the @env{AWKLIBPATH} environment variable
+is used to find any requested extensions, and they are loaded before
+the program starts to run.  Once your program is running, all the
+extensions have been found, and @command{gawk} no longer needs to use
+@env{AWKLIBPATH}.
+
+@node Other Environment Variables
+@subsection Other Environment Variables
+
+A number of other environment variables affect @command{gawk}'s
+behavior, but they are more specialized. Those in the following
+list are meant to be used by regular users:
+
+@table @env
+@item GAWK_MSEC_SLEEP
+Specifies the interval between connection retries,
+in milliseconds. On systems that do not support
+the @code{usleep()} system call,
+the value is rounded up to an integral number of seconds.
+
+@item GAWK_READ_TIMEOUT
+Specifies the time, in milliseconds, for @command{gawk} to
+wait for input before returning with an error.
+@xref{Read Timeout}.
+
+@item GAWK_SOCK_RETRIES
+Controls the number of times @command{gawk} attempts to
+retry a two-way TCP/IP (socket) connection before giving up.
+@xref{TCP/IP Networking}.
+Note that when nonfatal I/O is enabled (@pxref{Nonfatal}),
+@command{gawk} only tries to open a TCP/IP socket once.
+
+@item POSIXLY_CORRECT
+Causes @command{gawk} to switch to POSIX-compatibility
+mode, disabling all traditional and GNU extensions.
+@xref{Options}.
+@end table
+
+The environment variables in the following list are meant
+for use by the @command{gawk} developers for testing and tuning.
+They are subject to change. The variables are:
+
+@table @env
+@item AWKBUFSIZE
+This variable only affects @command{gawk} on POSIX-compliant systems.
+With a value of @samp{exact}, @command{gawk} uses the size of each input
+file as the size of the memory buffer to allocate for I/O. Otherwise,
+the value should be a number, and @command{gawk} uses that number as
+the size of the buffer to allocate.  (When this variable is not set,
+@command{gawk} uses the smaller of the file's size and the ``default''
+blocksize, which is usually the filesystem's I/O blocksize.)
+
+@item AWK_HASH
+If this variable exists with a value of @samp{gst}, @command{gawk}
+switches to using the hash function from GNU Smalltalk for
+managing arrays.
+This function may be marginally faster than the standard function.
+
+@item AWKREADFUNC
+If this variable exists, @command{gawk} switches to reading source
+files one line at a time, instead of reading in blocks. This exists
+for debugging problems on filesystems on non-POSIX operating systems
+where I/O is performed in records, not in blocks.
+
+@item GAWK_MSG_SRC
+If this variable exists, @command{gawk} includes the @value{FN}
+and line number within the @command{gawk} source code
+from which warning and/or fatal messages
+are generated.  Its purpose is to help isolate the source of a
+message, as there are multiple places that produce the
+same warning or error message.
+
+@item GAWK_LOCALE_DIR
+Specifies the location of compiled message object files
+for @command{gawk} itself. This is passed to the @code{bindtextdomain()}
+function when @command{gawk} starts up.
+
+@item GAWK_NO_DFA
+If this variable exists, @command{gawk} does not use the DFA regexp matcher
+for ``does it match'' kinds of tests. This can cause @command{gawk}
+to be slower. Its purpose is to help isolate differences between the
+two regexp matchers that @command{gawk} uses internally. (There aren't
+supposed to be differences, but occasionally theory and practice don't
+coordinate with each other.)
+
+@item GAWK_STACKSIZE
+This specifies the amount by which @command{gawk} should grow its
+internal evaluation stack, when needed.
+
+@item INT_CHAIN_MAX
+This specifies intended maximum number of items @command{gawk} will maintain on a
+hash chain for managing arrays indexed by integers.
+
+@item STR_CHAIN_MAX
+This specifies intended maximum number of items @command{gawk} will maintain on a
+hash chain for managing arrays indexed by strings.
+
+@item TIDYMEM
+If this variable exists, @command{gawk} uses the @code{mtrace()} library
+calls from the GNU C library to help track down possible memory leaks.
+@end table
+
+@node Exit Status
+@section @command{gawk}'s Exit Status
+
+@cindex exit status, of @command{gawk}
+If the @code{exit} statement is used with a value
+(@pxref{Exit Statement}), then @command{gawk} exits with
+the numeric value given to it.
+
+Otherwise, if there were no problems during execution,
+@command{gawk} exits with the value of the C constant
+@code{EXIT_SUCCESS}.  This is usually zero.
+
+If an error occurs, @command{gawk} exits with the value of
+the C constant @code{EXIT_FAILURE}.  This is usually one.
+
+If @command{gawk} exits because of a fatal error, the exit
+status is two.  On non-POSIX systems, this value may be mapped
+to @code{EXIT_FAILURE}.
+
+@node Include Files
+@section Including Other Files into Your Program
+
+@c Panos Papadopoulos <panos1962@gmail.com> contributed the original
+@c text for this section.
+
+This @value{SECTION} describes a feature that is specific to @command{gawk}.
+
+@cindex @code{@@include} directive
+@cindex file inclusion, @code{@@include} directive
+@cindex including files, @code{@@include} directive
+The @code{@@include} keyword can be used to read external @command{awk} source
+files.  This gives you the ability to split large @command{awk} source files
+into smaller, more manageable pieces, and also lets you reuse common @command{awk}
+code from various @command{awk} scripts.  In other words, you can group
+together @command{awk} functions used to carry out specific tasks
+into external files. These files can be used just like function libraries,
+using the @code{@@include} keyword in conjunction with the @env{AWKPATH}
+environment variable.  Note that source files may also be included
+using the @option{-i} option.
+
+Let's see an example.
+We'll start with two (trivial) @command{awk} scripts, namely
+@file{test1} and @file{test2}. Here is the @file{test1} script:
+
+@example
+BEGIN @{
+    print "This is script test1."
+@}
+@end example
+
+@noindent
+and here is @file{test2}:
+
+@example
+@@include "test1"
+BEGIN @{
+    print "This is script test2."
+@}
+@end example
+
+Running @command{gawk} with @file{test2}
+produces the following result:
+
+@example
+$ @kbd{gawk -f test2}
+@print{} This is script test1.
+@print{} This is script test2.
+@end example
+
+@command{gawk} runs the @file{test2} script, which includes @file{test1}
+using the @code{@@include}
+keyword.  So, to include external @command{awk} source files, you just
+use @code{@@include} followed by the name of the file to be included,
+enclosed in double quotes.
+
+@quotation NOTE
+Keep in mind that this is a language construct and the @value{FN} cannot
+be a string variable, but rather just a literal string constant in double quotes.
+@end quotation
+
+The files to be included may be nested; e.g., given a third
+script, namely @file{test3}:
+
+@example
+@group
+@@include "test2"
+BEGIN @{
+    print "This is script test3."
+@}
+@end group
+@end example
+
+@noindent
+Running @command{gawk} with the @file{test3} script produces the
+following results:
+
+@example
+$ @kbd{gawk -f test3}
+@print{} This is script test1.
+@print{} This is script test2.
+@print{} This is script test3.
+@end example
+
+The @value{FN} can, of course, be a pathname. For example:
+
+@example
+@@include "../io_funcs"
+@end example
+
+@noindent
+and:
+
+@example
+@@include "/usr/awklib/network"
+@end example
+
+@noindent
+are both valid. The @env{AWKPATH} environment variable can be of great
+value when using @code{@@include}. The same rules for the use
+of the @env{AWKPATH} variable in command-line file searches
+(@pxref{AWKPATH Variable}) apply to
+@code{@@include} also.
+
+This is very helpful in constructing @command{gawk} function libraries.
+If you have a large script with useful, general-purpose @command{awk}
+functions, you can break it down into library files and put those files
+in a special directory.  You can then include those ``libraries,''
+either by using the full pathnames of the files, or by setting the @env{AWKPATH}
+environment variable accordingly and then using @code{@@include} with
+just the file part of the full pathname. Of course,
+you can keep library files in more than one directory;
+the more complex the working
+environment is, the more directories you may need to organize the files
+to be included.
+
+Given the ability to specify multiple @option{-f} options, the
+@code{@@include} mechanism is not strictly necessary.
+However, the @code{@@include} keyword
+can help you in constructing self-contained @command{gawk} programs,
+thus reducing the need for writing complex and tedious command lines.
+In particular, @code{@@include} is very useful for writing CGI scripts
+to be run from web pages.
+
+The rules for finding a source file described in @ref{AWKPATH Variable} also
+apply to files loaded with @code{@@include}.
+
+Finally, files included with @code{@@include}
+are treated as if they had @samp{@@namespace "awk"}
+at their beginning.  @xref{Changing The Namespace}, for more information.
+
+@node Loading Shared Libraries
+@section Loading Dynamic Extensions into Your Program
+
+This @value{SECTION} describes a feature that is specific to @command{gawk}.
+
+@cindex @code{@@load} directive
+@cindex loading extensions, @code{@@load} directive
+@cindex extensions, loading, @code{@@load} directive
+The @code{@@load} keyword can be used to read external @command{awk} extensions
+(stored as system shared libraries).
+This allows you to link in compiled code that may offer superior
+performance and/or give you access to extended capabilities not supported
+by the @command{awk} language.  The @env{AWKLIBPATH} variable is used to
+search for the extension.  Using @code{@@load} is completely equivalent
+to using the @option{-l} command-line option.
+
+If the extension is not initially found in @env{AWKLIBPATH}, another
+search is conducted after appending the platform's default shared library
+suffix to the @value{FN}.  For example, on GNU/Linux systems, the suffix
+@samp{.so} is used:
+
+@example
+$ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'}
+@print{} A
+@end example
+
+@noindent
+This is equivalent to the following example:
+
+@example
+@group
+$ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'}
+@print{} A
+@end group
+@end example
+
+@noindent
+For command-line usage, the @option{-l} option is more convenient,
+but @code{@@load} is useful for embedding inside an @command{awk} source file
+that requires access to an extension.
+
+@ref{Dynamic Extensions}, describes how to write extensions (in C or C++)
+that can be loaded with either @code{@@load} or the @option{-l} option.
+It also describes the @code{ordchr} extension.
+
+@node Obsolete
+@section Obsolete Options and/or Features
+
+@c update this section for each release!
+
+@cindex options, deprecated
+@cindex features, deprecated
+@cindex obsolete features
+This @value{SECTION} describes features and/or command-line options from
+previous releases of @command{gawk} that either are not available in the
+current version or are still supported but deprecated (meaning that
+they will @emph{not} be in the next release).
+
+The process-related special files @file{/dev/pid}, @file{/dev/ppid},
+@file{/dev/pgrpid}, and @file{/dev/user} were deprecated in @command{gawk}
+3.1, but still worked.  As of @value{PVERSION} 4.0, they are no longer
+interpreted specially by @command{gawk}.  (Use @code{PROCINFO} instead;
+see @ref{Auto-set}.)
+
+@ignore
+This @value{SECTION}
+is thus essentially a place holder,
+in case some option becomes obsolete in a future version of @command{gawk}.
+@end ignore
+
+@node Undocumented
+@section Undocumented Options and Features
+@cindex undocumented features
+@cindex features, undocumented
+@cindex Skywalker, Luke
+@cindex Kenobi, Obi-Wan
+@cindex jedi knights
+@cindex knights, jedi
+@quotation
+@i{Use the Source, Luke!}
+@author Obi-Wan
+@end quotation
+
+@cindex shells, sea
+This @value{SECTION} intentionally left
+blank.
+
+@ignore
+@c If these came out in the Info file or TeX document, then they wouldn't
+@c be undocumented, would they?
+
+@command{gawk} has one undocumented option:
+
+@table @code
+@item -W nostalgia
+@itemx --nostalgia
+Print the message @samp{awk: bailing out near line 1} and dump core.
+This option was inspired by the common behavior of very early versions of
+Unix @command{awk} and by a t--shirt.
+The message is @emph{not} subject to translation in non-English locales.
+@c so there! nyah, nyah.
+@end table
+
+Early versions of @command{awk} used to not require any separator (either
+a newline or @samp{;}) between the rules in @command{awk} programs.  Thus,
+it was common to see one-line programs like:
+
+@example
+awk '@{ sum += $1 @} END @{ print sum @}'
+@end example
+
+@command{gawk} actually supports this but it is purposely undocumented
+because it is bad style.  The correct way to write such a program
+is either:
+
+@example
+awk '@{ sum += $1 @} ; END @{ print sum @}'
+@end example
+
+@noindent
+or:
+
+@example
+awk '@{ sum += $1 @}
+     END @{ print sum @}' data
+@end example
+
+@noindent
+@xref{Statements/Lines}, for a fuller explanation.
+
+You can insert newlines after the @samp{;} in @code{for} loops.
+This seems to have been a long-undocumented feature in Unix @command{awk}.
+
+Similarly, you may use @code{print} or @code{printf} statements in the
+@var{init} and @var{increment} parts of a @code{for} loop.  This is another
+long-undocumented ``feature'' of Unix @command{awk}.
+
+@command{gawk} lets you use the names of built-in functions that are
+@command{gawk} extensions as the names of parameters in user-defined functions.
+This is intended to ``future-proof'' old code that happens to use
+function names added by @command{gawk} after the code was written.
+Standard @command{awk} built-in functions, such as @code{sin()} or
+@code{substr()} are @emph{not} shadowed in this way.
+
+You can use a @samp{P} modifier for the @code{printf()} floating-point
+format control letters to use the underlying C library's result for
+NaN and Infinity values, instead of the special values @command{gawk}
+usually produces, as described in @ref{POSIX Floating Point Problems}.
+This is mainly useful for the included unit tests.
+
+The @code{typeof()} built-in function
+(@pxref{Type Functions})
+takes an optional second array argument that, if present, will be cleared
+and populated with some information about the internal implementation of
+the variable. This can be useful for debugging. At the moment, this
+returns a textual version of the flags for scalar variables, and the
+array back-end implementation type for arrays. This interface is subject
+to change and may not be stable.
+
+When not in POSIX or compatibility mode, if you set @code{LINENO} to a
+numeric value using the @option{-v} option, @command{gawk} adds that value
+to the real line number for use in error messages.  This is intended for
+use within Bash shell scripts, such that the error message will reflect
+the line number in the shell script, instead of in the @command{awk}
+program. To demonstrate:
+
+@example
+$ @kbd{gawk -v LINENO=10 'BEGIN @{ print("hi" @}'}
+@error{} gawk: cmd. line:11: BEGIN @{ print("hi" @}
+@error{} gawk: cmd. line:11:                    ^ syntax error
+@end example
+
+@end ignore
+
+@node Invoking Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Use either
+@samp{awk '@var{program}' @var{files}}
+or
+@samp{awk -f @var{program-file} @var{files}}
+to run @command{awk}.
+
+@item
+The three standard options for all versions of @command{awk} are
+@option{-f}, @option{-F}, and @option{-v}.  @command{gawk} supplies these
+and many others, as well as corresponding GNU-style long options.
+
+@item
+Nonoption command-line arguments are usually treated as @value{FN}s,
+unless they have the form @samp{@var{var}=@var{value}}, in which case
+they are taken as variable assignments to be performed at that point
+in processing the input.
+
+@item
+All nonoption command-line arguments, excluding the program text,
+are placed in the @code{ARGV} array.  Adjusting @code{ARGC} and @code{ARGV}
+affects how @command{awk} processes input.
+
+@item
+You can use a single minus sign (@samp{-}) to refer to standard input
+on the command line. @command{gawk} also lets you use the special
+@value{FN} @file{/dev/stdin}.
+
+@item
+@command{gawk} pays attention to a number of environment variables.
+@env{AWKPATH}, @env{AWKLIBPATH}, and @env{POSIXLY_CORRECT} are the
+most important ones.
+
+@item
+@command{gawk}'s exit status conveys information to the program
+that invoked it. Use the @code{exit} statement from within
+an @command{awk} program to set the exit status.
+
+@item
+@command{gawk} allows you to include other @command{awk} source files into
+your program using the @code{@@include} statement and/or the @option{-i}
+and @option{-f} command-line options.
+
+@item
+@command{gawk} allows you to load additional functions written in C
+or C++ using the @code{@@load} statement and/or the @option{-l} option.
+(This advanced feature is described later, in @ref{Dynamic Extensions}.)
+@end itemize
+
+@node Regexp
+@chapter Regular Expressions
+@cindex regexp
+@cindex regular expressions
+
+A @dfn{regular expression}, or @dfn{regexp}, is a way of describing a
+set of strings.
+Because regular expressions are such a fundamental part of @command{awk}
+programming, their format and use deserve a separate @value{CHAPTER}.
+
+@cindex forward slash (@code{/}) to enclose regular expressions
+@cindex @code{/} (forward slash) to enclose regular expressions
+A regular expression enclosed in slashes (@samp{/})
+is an @command{awk} pattern that matches every input record whose text
+belongs to that set.
+The simplest regular expression is a sequence of letters, numbers, or
+both.  Such a regexp matches any string that contains that sequence.
+Thus, the regexp @samp{foo} matches any string containing @samp{foo}.
+Thus, the pattern @code{/foo/} matches any input record containing
+the three adjacent characters @samp{foo} @emph{anywhere} in the record.  Other
+kinds of regexps let you specify more complicated classes of strings.
+
+@ifnotinfo
+Initially, the examples in this @value{CHAPTER} are simple.
+As we explain more about how
+regular expressions work, we present more complicated instances.
+@end ifnotinfo
+
+@menu
+* Regexp Usage::                How to Use Regular Expressions.
+* Escape Sequences::            How to write nonprinting characters.
+* Regexp Operators::            Regular Expression Operators.
+* Bracket Expressions::         What can go between @samp{[...]}.
+* Leftmost Longest::            How much text matches.
+* Computed Regexps::            Using Dynamic Regexps.
+* GNU Regexp Operators::        Operators specific to GNU software.
+* Case-sensitivity::            How to do case-insensitive matching.
+* Regexp Summary::              Regular expressions summary.
+@end menu
+
+@node Regexp Usage
+@section How to Use Regular Expressions
+
+@cindex patterns, regular expressions as
+@cindex regular expressions, as patterns
+A regular expression can be used as a pattern by enclosing it in
+slashes.  Then the regular expression is tested against the
+entire text of each record.  (Normally, it only needs
+to match some part of the text in order to succeed.)  For example, the
+following prints the second field of each record where the string
+@samp{li} appears anywhere in the record:
+
+@example
+$ @kbd{awk '/li/ @{ print $2 @}' mail-list}
+@print{} 555-5553
+@print{} 555-0542
+@print{} 555-6699
+@print{} 555-3430
+@end example
+
+@cindex regular expressions, operators
+@cindex operators, string-matching
+@c @cindex operators, @code{~}
+@cindex string-matching operators
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@c @cindex operators, @code{!~}
+@cindex @code{if} statement, use of regexps in
+@cindex @code{while} statement, use of regexps in
+@cindex @code{do}-@code{while} statement, use of regexps in
+@c @cindex statements, @code{if}
+@c @cindex statements, @code{while}
+@c @cindex statements, @code{do}
+Regular expressions can also be used in matching expressions.  These
+expressions allow you to specify the string to match against; it need
+not be the entire current input record.  The two operators @samp{~}
+and @samp{!~} perform regular expression comparisons.  Expressions
+using these operators can be used as patterns, or in @code{if},
+@code{while}, @code{for}, and @code{do} statements.
+(@xref{Statements}.)
+For example, the following is true if the expression @var{exp} (taken
+as a string) matches @var{regexp}:
+
+@example
+@var{exp} ~ /@var{regexp}/
+@end example
+
+@noindent
+This example matches, or selects, all input records with the uppercase
+letter @samp{J} somewhere in the first field:
+
+@example
+$ @kbd{awk '$1 ~ /J/' inventory-shipped}
+@print{} Jan  13  25  15 115
+@print{} Jun  31  42  75 492
+@print{} Jul  24  34  67 436
+@print{} Jan  21  36  64 620
+@end example
+
+So does this:
+
+@example
+awk '@{ if ($1 ~ /J/) print @}' inventory-shipped
+@end example
+
+This next example is true if the expression @var{exp}
+(taken as a character string)
+does @emph{not} match @var{regexp}:
+
+@example
+@var{exp} !~ /@var{regexp}/
+@end example
+
+The following example matches,
+or selects, all input records whose first field @emph{does not} contain
+the uppercase letter @samp{J}:
+
+@example
+$ @kbd{awk '$1 !~ /J/' inventory-shipped}
+@print{} Feb  15  32  24 226
+@print{} Mar  15  24  34 228
+@print{} Apr  31  52  63 420
+@print{} May  16  34  29 208
+@dots{}
+@end example
+
+@cindex regexp constants
+@cindex constant regexps
+@cindex regular expressions, constants, See regexp constants
+When a regexp is enclosed in slashes, such as @code{/foo/}, we call it
+a @dfn{regexp constant}, much like @code{5.27} is a numeric constant and
+@code{"foo"} is a string constant.
+
+@node Escape Sequences
+@section Escape Sequences
+
+@cindex escape sequences, in strings
+@cindex backslash (@code{\}), in escape sequences
+@cindex @code{\} (backslash), in escape sequences
+Some characters cannot be included literally in string constants
+(@code{"foo"}) or regexp constants (@code{/foo/}).
+Instead, they should be represented with @dfn{escape sequences},
+which are character sequences beginning with a backslash (@samp{\}).
+One use of an escape sequence is to include a double-quote character in
+a string constant.  Because a plain double quote ends the string, you
+must use @samp{\"} to represent an actual double-quote character as a
+part of the string.  For example:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "He said \"hi!\" to her." @}'}
+@print{} He said "hi!" to her.
+@end example
+
+The  backslash character itself is another character that cannot be
+included normally; you must write @samp{\\} to put one backslash in the
+string or regexp.  Thus, the string whose contents are the two characters
+@samp{"} and @samp{\} must be written @code{"\"\\"}.
+
+Other escape sequences represent unprintable characters
+such as TAB or newline.  There is nothing to stop you from entering most
+unprintable characters directly in a string constant or regexp constant,
+but they may look ugly.
+
+The following list presents
+all the escape sequences used in @command{awk} and
+what they represent. Unless noted otherwise, all these escape
+sequences apply to both string constants and regexp constants:
+
+@table @code
+@item \\
+A literal backslash, @samp{\}.
+
+@c @cindex @command{awk} language, V.4 version
+@cindex @code{\} (backslash), @code{\a} escape sequence
+@cindex backslash (@code{\}), @code{\a} escape sequence
+@item \a
+The ``alert'' character, @kbd{Ctrl-g}, ASCII code 7 (BEL).
+(This often makes some sort of audible noise.)
+
+@cindex @code{\} (backslash), @code{\b} escape sequence
+@cindex backslash (@code{\}), @code{\b} escape sequence
+@item \b
+Backspace, @kbd{Ctrl-h}, ASCII code 8 (BS).
+
+@cindex @code{\} (backslash), @code{\f} escape sequence
+@cindex backslash (@code{\}), @code{\f} escape sequence
+@item \f
+Formfeed, @kbd{Ctrl-l}, ASCII code 12 (FF).
+
+@cindex @code{\} (backslash), @code{\n} escape sequence
+@cindex backslash (@code{\}), @code{\n} escape sequence
+@item \n
+Newline, @kbd{Ctrl-j}, ASCII code 10 (LF).
+
+@cindex @code{\} (backslash), @code{\r} escape sequence
+@cindex backslash (@code{\}), @code{\r} escape sequence
+@item \r
+Carriage return, @kbd{Ctrl-m}, ASCII code 13 (CR).
+
+@cindex @code{\} (backslash), @code{\t} escape sequence
+@cindex backslash (@code{\}), @code{\t} escape sequence
+@item \t
+Horizontal TAB, @kbd{Ctrl-i}, ASCII code 9 (HT).
+
+@c @cindex @command{awk} language, V.4 version
+@cindex @code{\} (backslash), @code{\v} escape sequence
+@cindex backslash (@code{\}), @code{\v} escape sequence
+@item \v
+Vertical TAB, @kbd{Ctrl-k}, ASCII code 11 (VT).
+
+@cindex @code{\} (backslash), @code{\}@var{nnn} escape sequence
+@cindex backslash (@code{\}), @code{\}@var{nnn} escape sequence
+@item \@var{nnn}
+The octal value @var{nnn}, where @var{nnn} stands for 1 to 3 digits
+between @samp{0} and @samp{7}.  For example, the code for the ASCII ESC
+(escape) character is @samp{\033}.
+
+@c @cindex @command{awk} language, V.4 version
+@c @cindex @command{awk} language, POSIX version
+@cindex @code{\} (backslash), @code{\x} escape sequence
+@cindex backslash (@code{\}), @code{\x} escape sequence
+@cindex common extensions, @code{\x} escape sequence
+@cindex extensions, common@comma{} @code{\x} escape sequence
+@item \x@var{hh}@dots{}
+The hexadecimal value @var{hh}, where @var{hh} stands for a sequence
+of hexadecimal digits (@samp{0}--@samp{9}, and either @samp{A}--@samp{F}
+or @samp{a}--@samp{f}).  A maximum of two digts are allowed after
+the @samp{\x}. Any further hexadecimal digits are treated as simple
+letters or numbers.  @value{COMMONEXT}
+(The @samp{\x} escape sequence is not allowed in POSIX awk.)
+
+@quotation CAUTION
+In ISO C, the escape sequence continues until the first nonhexadecimal
+digit is seen.
+For many years, @command{gawk} would continue incorporating
+hexadecimal digits into the value until a non-hexadecimal digit
+or the end of the string was encountered.
+However, using more than two hexadecimal digits produced
+undefined results.
+As of @value{PVERSION} 4.2, only two digits
+are processed.
+@end quotation
+
+@cindex @code{\} (backslash), @code{\/} escape sequence
+@cindex backslash (@code{\}), @code{\/} escape sequence
+@item \/
+A literal slash (necessary for regexp constants only).
+This sequence is used when you want to write a regexp
+constant that contains a slash
+(such as @code{/.*:\/home\/[[:alnum:]]+:.*/}; the @samp{[[:alnum:]]}
+notation is discussed in @ref{Bracket Expressions}).
+Because the regexp is delimited by
+slashes, you need to escape any slash that is part of the pattern,
+in order to tell @command{awk} to keep processing the rest of the regexp.
+
+@cindex @code{\} (backslash), @code{\"} escape sequence
+@cindex backslash (@code{\}), @code{\"} escape sequence
+@item \"
+A literal double quote (necessary for string constants only).
+This sequence is used when you want to write a string
+constant that contains a double quote
+(such as @code{"He said \"hi!\" to her."}).
+Because the string is delimited by
+double quotes, you need to escape any quote that is part of the string,
+in order to tell @command{awk} to keep processing the rest of the string.
+@end table
+
+In @command{gawk}, a number of additional two-character sequences that begin
+with a backslash have special meaning in regexps.
+@xref{GNU Regexp Operators}.
+
+In a regexp, a backslash before any character that is not in the previous list
+and not listed in
+@ref{GNU Regexp Operators}
+means that the next character should be taken literally, even if it would
+normally be a regexp operator.  For example, @code{/a\+b/} matches the three
+characters @samp{a+b}.
+
+@cindex backslash (@code{\}), in escape sequences
+@cindex @code{\} (backslash), in escape sequences
+@cindex portability
+For complete portability, do not use a backslash before any character not
+shown in the previous list or that is not an operator.
+
+@c 11/2014: Moved so as to not stack sidebars
+@sidebar Backslash Before Regular Characters
+@cindex portability, backslash in escape sequences
+@cindex POSIX @command{awk}, backslashes in string constants
+@cindex backslash (@code{\}), in escape sequences, POSIX and
+@cindex @code{\} (backslash), in escape sequences, POSIX and
+
+@cindex troubleshooting, backslash before nonspecial character
+If you place a backslash in a string constant before something that is
+not one of the characters previously listed, POSIX @command{awk} purposely
+leaves what happens as undefined.  There are two choices:
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex Brian Kernighan's @command{awk}
+@table @asis
+@item Strip the backslash out
+This is what BWK @command{awk} and @command{gawk} both do.
+For example, @code{"a\qc"} is the same as @code{"aqc"}.
+(Because this is such an easy bug both to introduce and to miss,
+@command{gawk} warns you about it.)
+Consider @samp{FS = @w{"[ \t]+\|[ \t]+"}} to use vertical bars
+surrounded by whitespace as the field separator. There should be
+two backslashes in the string: @samp{FS = @w{"[ \t]+\\|[ \t]+"}}.)
+@c I did this!  This is why I added the warning.
+
+@cindex @command{gawk}, escape sequences
+@cindex Unix @command{awk}, backslashes in escape sequences
+@cindex @command{mawk} utility
+@item Leave the backslash alone
+Some other @command{awk} implementations do this.
+In such implementations, typing @code{"a\qc"} is the same as typing
+@code{"a\\qc"}.
+@end table
+@end sidebar
+
+To summarize:
+
+@itemize @value{BULLET}
+@item
+The escape sequences in the preceding list are always processed first,
+for both string constants and regexp constants. This happens very early,
+as soon as @command{awk} reads your program.
+
+@item
+@command{gawk} processes both regexp constants and dynamic regexps
+(@pxref{Computed Regexps}),
+for the special operators listed in
+@ref{GNU Regexp Operators}.
+
+@item
+A backslash before any other character means to treat that character
+literally.
+@end itemize
+
+@sidebar Escape Sequences for Metacharacters
+@cindex metacharacters, escape sequences for
+
+Suppose you use an octal or hexadecimal
+escape to represent a regexp metacharacter.
+(See @ref{Regexp Operators}.)
+Does @command{awk} treat the character as a literal character or as a regexp
+operator?
+
+@cindex dark corner, escape sequences, for metacharacters
+Historically, such characters were taken literally.
+@value{DARKCORNER}
+However, the POSIX standard indicates that they should be treated
+as real metacharacters, which is what @command{gawk} does.
+In compatibility mode (@pxref{Options}),
+@command{gawk} treats the characters represented by octal and hexadecimal
+escape sequences literally when used in regexp constants. Thus,
+@code{/a\52b/} is equivalent to @code{/a\*b/}.
+@end sidebar
+
+@node Regexp Operators
+@section Regular Expression Operators
+@cindex regular expressions, operators
+@cindex metacharacters in regular expressions
+
+You can combine regular expressions with special characters,
+called @dfn{regular expression operators} or @dfn{metacharacters}, to
+increase the power and versatility of regular expressions.
+
+@menu
+* Regexp Operator Details::     The actual details.
+* Interval Expressions::        Notes on interval expressions.
+@end menu
+
+@node Regexp Operator Details
+@subsection Regexp Operators in @command{awk}
+
+The escape sequences described
+@ifnotinfo
+earlier
+@end ifnotinfo
+in @ref{Escape Sequences}
+are valid inside a regexp.  They are introduced by a @samp{\} and
+are recognized and converted into corresponding real characters as
+the very first step in processing regexps.
+
+Here is a list of metacharacters.  All characters that are not escape
+sequences and that are not listed here stand for themselves:
+
+@c Use @asis so the docbook comes out ok. Sigh.
+@table @asis
+@cindex backslash (@code{\}), regexp operator
+@cindex @code{\} (backslash), regexp operator
+@item @code{\}
+This suppresses the special meaning of a character when
+matching.  For example, @samp{\$}
+matches the character @samp{$}.
+
+@cindex regular expressions, anchors in
+@cindex Texinfo, chapter beginnings in files
+@cindex @code{^} (caret), regexp operator
+@cindex caret (@code{^}), regexp operator
+@item @code{^}
+This matches the beginning of a string.  @samp{^@@chapter}
+matches @samp{@@chapter} at the beginning of a string,
+for example, and can be used
+to identify chapter beginnings in Texinfo source files.
+The @samp{^} is known as an @dfn{anchor}, because it anchors the pattern to
+match only at the beginning of the string.
+
+It is important to realize that @samp{^} does not match the beginning of
+a line (the point right after a @samp{\n} newline character) embedded in a string.
+The condition is not true in the following example:
+
+@example
+if ("line1\nLINE 2" ~ /^L/) @dots{}
+@end example
+
+@cindex @code{$} (dollar sign), regexp operator
+@cindex dollar sign (@code{$}), regexp operator
+@item @code{$}
+This is similar to @samp{^}, but it matches only at the end of a string.
+For example, @samp{p$}
+matches a record that ends with a @samp{p}.  The @samp{$} is an anchor
+and does not match the end of a line
+(the point right before a @samp{\n} newline character)
+embedded in a string.
+The condition in the following example is not true:
+
+@example
+if ("line1\nLINE 2" ~ /1$/) @dots{}
+@end example
+
+@cindex @code{.} (period), regexp operator
+@cindex period (@code{.}), regexp operator
+@item @code{.} (period)
+This matches any single character,
+@emph{including} the newline character.  For example, @samp{.P}
+matches any single character followed by a @samp{P} in a string.  Using
+concatenation, we can make a regular expression such as @samp{U.A}, which
+matches any three-character sequence that begins with @samp{U} and ends
+with @samp{A}.
+
+@cindex POSIX @command{awk}, period (@code{.})@comma{} using
+In strict POSIX mode (@pxref{Options}),
+@samp{.} does not match the @sc{nul}
+character, which is a character with all bits equal to zero.
+Otherwise, @sc{nul} is just another character. Other versions of @command{awk}
+may not be able to match the @sc{nul} character.
+
+@cindex @code{[]} (square brackets), regexp operator
+@cindex square brackets (@code{[]}), regexp operator
+@cindex bracket expressions
+@cindex character sets, See Also bracket expressions
+@cindex character lists, See bracket expressions
+@cindex character classes, See bracket expressions
+@item @code{[}@dots{}@code{]}
+This is called a @dfn{bracket expression}.@footnote{In other literature,
+you may see a bracket expression referred to as either a
+@dfn{character set}, a @dfn{character class}, or a @dfn{character list}.}
+It matches any @emph{one} of the characters that are enclosed in
+the square brackets.  For example, @samp{[MVX]} matches any one of
+the characters @samp{M}, @samp{V}, or @samp{X} in a string.  A full
+discussion of what can be inside the square brackets of a bracket expression
+is given in
+@ref{Bracket Expressions}.
+
+@cindex bracket expressions, complemented
+@item @code{[^}@dots{}@code{]}
+This is a @dfn{complemented bracket expression}.  The first character after
+the @samp{[} @emph{must} be a @samp{^}.  It matches any characters
+@emph{except} those in the square brackets.  For example, @samp{[^awk]}
+matches any character that is not an @samp{a}, @samp{w},
+or @samp{k}.
+
+@cindex @code{|} (vertical bar)
+@cindex vertical bar (@code{|})
+@item @code{|}
+This is the @dfn{alternation operator} and it is used to specify
+alternatives.  The @samp{|} has the lowest precedence of all the regular
+expression operators.  For example, @samp{^P|[aeiouy]} matches any string
+that matches either @samp{^P} or @samp{[aeiouy]}.  This means it matches
+any string that starts with @samp{P} or contains (anywhere within it)
+a lowercase English vowel.
+
+The alternation applies to the largest possible regexps on either side.
+
+@cindex @code{()} (parentheses), regexp operator
+@cindex parentheses @code{()}, regexp operator
+@item @code{(}@dots{}@code{)}
+Parentheses are used for grouping in regular expressions, as in
+arithmetic.  They can be used to concatenate regular expressions
+containing the alternation operator, @samp{|}.  For example,
+@samp{@@(samp|code)\@{[^@}]+\@}} matches both @samp{@@code@{foo@}} and
+@samp{@@samp@{bar@}}.
+(These are Texinfo formatting control sequences. The @samp{+} is
+explained further on in this list.)
+
+The left or opening parenthesis is always a metacharacter; to match
+one literally, precede it with a backslash. However, the right or
+closing parenthesis is only special when paired with a left parenthesis;
+an unpaired right parenthesis is (silently) treated as a regular character.
+
+@cindex @code{*} (asterisk), @code{*} operator, as regexp operator
+@cindex asterisk (@code{*}), @code{*} operator, as regexp operator
+@item @code{*}
+This symbol means that the preceding regular expression should be
+repeated as many times as necessary to find a match.  For example, @samp{ph*}
+applies the @samp{*} symbol to the preceding @samp{h} and looks for matches
+of one @samp{p} followed by any number of @samp{h}s.  This also matches
+just @samp{p} if no @samp{h}s are present.
+
+There are two subtle points to understand about how @samp{*} works.
+First, the @samp{*} applies only to the single preceding regular expression
+component (e.g., in @samp{ph*}, it applies just to the @samp{h}).
+To cause @samp{*} to apply to a larger subexpression, use parentheses:
+@samp{(ph)*} matches @samp{ph}, @samp{phph}, @samp{phphph}, and so on.
+
+Second, @samp{*} finds as many repetitions as possible. If the text
+to be matched is @samp{phhhhhhhhhhhhhhooey}, @samp{ph*} matches all of
+the @samp{h}s.
+
+@cindex @code{+} (plus sign), regexp operator
+@cindex plus sign (@code{+}), regexp operator
+@item @code{+}
+This symbol is similar to @samp{*}, except that the preceding expression must be
+matched at least once.  This means that @samp{wh+y}
+would match @samp{why} and @samp{whhy}, but not @samp{wy}, whereas
+@samp{wh*y} would match all three.
+
+@cindex @code{?} (question mark), regexp operator
+@cindex question mark (@code{?}), regexp operator
+@item @code{?}
+This symbol is similar to @samp{*}, except that the preceding expression can be
+matched either once or not at all.  For example, @samp{fe?d}
+matches @samp{fed} and @samp{fd}, but nothing else.
+
+@cindex interval expressions, regexp operator
+@item @code{@{}@var{n}@code{@}}
+@itemx @code{@{}@var{n}@code{,@}}
+@itemx @code{@{}@var{n}@code{,}@var{m}@code{@}}
+One or two numbers inside braces denote an @dfn{interval expression}.
+If there is one number in the braces, the preceding regexp is repeated
+@var{n} times.
+If there are two numbers separated by a comma, the preceding regexp is
+repeated @var{n} to @var{m} times.
+If there is one number followed by a comma, then the preceding regexp
+is repeated at least @var{n} times:
+
+@table @code
+@item wh@{3@}y
+Matches @samp{whhhy}, but not @samp{why} or @samp{whhhhy}.
+
+@item wh@{3,5@}y
+Matches @samp{whhhy}, @samp{whhhhy}, or @samp{whhhhhy} only.
+
+@item wh@{2,@}y
+Matches @samp{whhy}, @samp{whhhy}, and so on.
+@end table
+@end table
+
+@cindex precedence, regexp operators
+@cindex regular expressions, operators, precedence of
+In regular expressions, the @samp{*}, @samp{+}, and @samp{?} operators,
+as well as the braces @samp{@{} and @samp{@}},
+have
+the highest precedence, followed by concatenation, and finally by @samp{|}.
+As in arithmetic, parentheses can change how operators are grouped.
+
+@cindex POSIX @command{awk}, regular expressions and
+@cindex @command{gawk}, regular expressions, precedence
+In POSIX @command{awk} and @command{gawk}, the @samp{*}, @samp{+}, and
+@samp{?} operators stand for themselves when there is nothing in the
+regexp that precedes them.  For example, @code{/+/} matches a literal
+plus sign.  However, many other versions of @command{awk} treat such a
+usage as a syntax error.
+
+@node Interval Expressions
+@subsection Some Notes On Interval Expressions
+
+@cindex POSIX @command{awk}, interval expressions in
+Interval expressions were not traditionally available in @command{awk}.
+They were added as part of the POSIX standard to make @command{awk}
+and @command{egrep} consistent with each other.
+
+@cindex @command{gawk}, interval expressions and
+Initially, because old programs may use @samp{@{} and @samp{@}} in regexp
+constants,
+@command{gawk} did @emph{not} match interval expressions
+in regexps.
+
+However, beginning with @value{PVERSION} 4.0,
+@command{gawk} does match interval expressions by default.
+This is because compatibility with POSIX has become more
+important to most @command{gawk} users than compatibility with
+old programs.
+
+For programs that use @samp{@{} and @samp{@}} in regexp constants,
+it is good practice to always escape them with a backslash.  Then the
+regexp constants are valid and work the way you want them to, using
+any version of @command{awk}.@footnote{Use two backslashes if you're
+using a string constant with a regexp operator or function.}
+
+Finally, when @samp{@{} and @samp{@}} appear in regexp constants
+in a way that cannot be interpreted as an interval expression
+(such as @code{/q@{a@}/}), then they stand for themselves.
+
+As mentioned, interval expressions were not traditionally available
+in @command{awk}. In March of 2019, Brian Kernighan's
+@command{awk} (finally) acquired them.
+
+Nonetheless, because they were not available for
+so many decades, @command{gawk} continues to not supply them
+when in compatibility mode (@pxref{Options}).
+
+@node Bracket Expressions
+@section Using Bracket Expressions
+@cindex bracket expressions
+@cindex bracket expressions, range expressions
+@cindex range expressions (regexps)
+@cindex character lists in regular expressions
+
+As mentioned earlier, a bracket expression matches any character among
+those listed between the opening and closing square brackets.
+
+Within a bracket expression, a @dfn{range expression} consists of two
+characters separated by a hyphen.  It matches any single character that
+sorts between the two characters, based upon the system's native character
+set.  For example, @samp{[0-9]} is equivalent to @samp{[0123456789]}.
+(See @ref{Ranges and Locales} for an explanation of how the POSIX
+standard and @command{gawk} have changed over time.  This is mainly
+of historical interest.)
+
+With the increasing popularity of the
+@uref{http://www.unicode.org, Unicode character standard},
+there is an additional wrinkle to consider. Octal and hexadecimal
+escape sequences inside bracket expressions are taken to represent
+only single-byte characters (characters whose values fit within
+the range 0--256).  To match a range of characters where the endpoints
+of the range are larger than 256, enter the multibyte encodings of
+the characters directly.
+
+@cindex @code{\} (backslash), in bracket expressions
+@cindex backslash (@code{\}), in bracket expressions
+@cindex @code{^} (caret), in bracket expressions
+@cindex caret (@code{^}), in bracket expressions
+@cindex @code{-} (hyphen), in bracket expressions
+@cindex hyphen (@code{-}), in bracket expressions
+To include one of the characters @samp{\}, @samp{]}, @samp{-}, or @samp{^} in a
+bracket expression, put a @samp{\} in front of it.  For example:
+
+@example
+[d\]]
+@end example
+
+@noindent
+matches either @samp{d} or @samp{]}.
+Additionally, if you place @samp{]} right after the opening
+@samp{[}, the closing bracket is treated as one of the
+characters to be matched.
+
+@cindex POSIX @command{awk}, bracket expressions and
+@cindex Extended Regular Expressions (EREs)
+@cindex EREs (Extended Regular Expressions)
+@cindex @command{egrep} utility
+The treatment of @samp{\} in bracket expressions
+is compatible with other @command{awk}
+implementations and is also mandated by POSIX.
+The regular expressions in @command{awk} are a superset
+of the POSIX specification for Extended Regular Expressions (EREs).
+POSIX EREs are based on the regular expressions accepted by the
+traditional @command{egrep} utility.
+
+@cindex bracket expressions, character classes
+@cindex POSIX @command{awk}, bracket expressions and, character classes
+@dfn{Character classes} are a feature introduced in the POSIX standard.
+A character class is a special notation for describing
+lists of characters that have a specific attribute, but the
+actual characters can vary from country to country and/or
+from character set to character set.  For example, the notion of what
+is an alphabetic character differs between the United States and France.
+
+A character class is only valid in a regexp @emph{inside} the
+brackets of a bracket expression.  Character classes consist of @samp{[:},
+a keyword denoting the class, and @samp{:]}.
+@ref{table-char-classes} lists the character classes defined by the
+POSIX standard.
+
+@float Table,table-char-classes
+@caption{POSIX character classes}
+@multitable @columnfractions .15 .85
+@headitem Class @tab Meaning
+@item @code{[:alnum:]} @tab Alphanumeric characters
+@item @code{[:alpha:]} @tab Alphabetic characters
+@item @code{[:blank:]} @tab Space and TAB characters
+@item @code{[:cntrl:]} @tab Control characters
+@item @code{[:digit:]} @tab Numeric characters
+@item @code{[:graph:]} @tab Characters that are both printable and visible
+(a space is printable but not visible, whereas an @samp{a} is both)
+@item @code{[:lower:]} @tab Lowercase alphabetic characters
+@item @code{[:print:]} @tab Printable characters (characters that are not control characters)
+@item @code{[:punct:]} @tab Punctuation characters (characters that are not letters, digits,
+control characters, or space characters)
+@item @code{[:space:]} @tab Space characters (these are: space, TAB, newline, carriage return, formfeed and vertical tab)
+@item @code{[:upper:]} @tab Uppercase alphabetic characters
+@item @code{[:xdigit:]} @tab Characters that are hexadecimal digits
+@end multitable
+@end float
+
+For example, before the POSIX standard, you had to write @code{/[A-Za-z0-9]/}
+to match alphanumeric characters.  If your
+character set had other alphabetic characters in it, this would not
+match them.
+With the POSIX character classes, you can write
+@code{/[[:alnum:]]/} to match the alphabetic
+and numeric characters in your character set.
+
+@ignore
+From eliz@gnu.org  Fri Feb 15 03:38:41 2019
+Date: Fri, 15 Feb 2019 12:38:23 +0200
+From: Eli Zaretskii <eliz@gnu.org>
+To: arnold@skeeve.com
+CC: pengyu.ut@gmail.com, bug-gawk@gnu.org
+Subject: Re: [bug-gawk] Does gawk character classes follow this?
+
+> From: arnold@skeeve.com
+> Date: Fri, 15 Feb 2019 03:01:34 -0700
+> Cc: pengyu.ut@gmail.com, bug-gawk@gnu.org
+> 
+> I get the feeling that there's something really bothering you, but
+> I don't understand what.
+> 
+> Can you clarify, please?
+
+I thought I already did: we cannot be expected to provide a definitive
+description of what the named classes stand for, because the answer
+depends on various factors out of our control.
+@end ignore
+
+@c Thanks to
+@c Date: Tue, 01 Jul 2014 07:39:51 +0200
+@c From: Hermann Peifer <peifer@gmx.eu>
+Some utilities that match regular expressions provide a nonstandard
+@samp{[:ascii:]} character class; @command{awk} does not. However, you
+can simulate such a construct using @samp{[\x00-\x7F]}.  This matches
+all values numerically between zero and 127, which is the defined
+range of the ASCII character set.  Use a complemented character list
+(@samp{[^\x00-\x7F]}) to match any single-byte characters that are not
+in the ASCII range.
+
+@quotation NOTE
+Some older versions of Unix @command{awk}
+treat @code{[:blank:]} like @code{[:space:]}, incorrectly matching
+more characters than they should.  Caveat Emptor.
+@end quotation
+
+@cindex bracket expressions, collating elements
+@cindex bracket expressions, non-ASCII
+@cindex collating elements
+Two additional special sequences can appear in bracket expressions.
+These apply to non-ASCII character sets, which can have single symbols
+(called @dfn{collating elements}) that are represented with more than one
+character. They can also have several characters that are equivalent for
+@dfn{collating}, or sorting, purposes.  (For example, in French, a plain ``e''
+and a grave-accented ``@`e'' are equivalent.)
+These sequences are:
+
+@table @asis
+@cindex bracket expressions, collating symbols
+@cindex collating symbols
+@item Collating symbols
+Multicharacter collating elements enclosed between
+@samp{[.} and @samp{.]}.  For example, if @samp{ch} is a collating element,
+then @samp{[[.ch.]]} is a regexp that matches this collating element, whereas
+@samp{[ch]} is a regexp that matches either @samp{c} or @samp{h}.
+
+@cindex bracket expressions, equivalence classes
+@item Equivalence classes
+Locale-specific names for a list of
+characters that are equal. The name is enclosed between
+@samp{[=} and @samp{=]}.
+For example, the name @samp{e} might be used to represent all of
+``e,'' ``@^e,'' ``@`e,'' and ``@'e.'' In this case, @samp{[[=e=]]} is a regexp
+that matches any of @samp{e}, @samp{@^e}, @samp{@'e}, or @samp{@`e}.
+@end table
+
+These features are very valuable in non-English-speaking locales.
+
+@cindex internationalization, localization, character classes
+@cindex @command{gawk}, character classes and
+@cindex POSIX @command{awk}, bracket expressions and, character classes
+@quotation CAUTION
+The library functions that @command{gawk} uses for regular
+expression matching currently recognize only POSIX character classes;
+they do not recognize collating symbols or equivalence classes.
+@end quotation
+@c maybe one day ...
+
+Inside a bracket expression, an opening bracket (@samp{[}) that does
+not start a character class, collating element or equivalence class is
+taken literally. This is also true of @samp{.} and @samp{*}.
+
+@node Leftmost Longest
+@section How Much Text Matches?
+
+@cindex regular expressions, leftmost longest match
+@c @cindex matching, leftmost longest
+Consider the following:
+
+@example
+echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'
+@end example
+
+This example uses the @code{sub()} function to make a change to the input
+record.  (@code{sub()} replaces the first instance of any text matched
+by the first argument with the string provided as the second argument;
+@pxref{String Functions}.)  Here, the regexp @code{/a+/} indicates ``one
+or more @samp{a} characters,'' and the replacement text is @samp{<A>}.
+
+The input contains four @samp{a} characters.
+@command{awk} (and POSIX) regular expressions always match
+the leftmost, @emph{longest} sequence of input characters that can
+match.  Thus, all four @samp{a} characters are
+replaced with @samp{<A>} in this example:
+
+@example
+$ @kbd{echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'}
+@print{} <A>bcd
+@end example
+
+For simple match/no-match tests, this is not so important. But when doing
+text matching and substitutions with the @code{match()}, @code{sub()}, @code{gsub()},
+and @code{gensub()} functions, it is very important.
+@ifinfo
+@xref{String Functions},
+for more information on these functions.
+@end ifinfo
+Understanding this principle is also important for regexp-based record
+and field splitting (@pxref{Records},
+and also @pxref{Field Separators}).
+
+@node Computed Regexps
+@section Using Dynamic Regexps
+
+@cindex regular expressions, computed
+@cindex regular expressions, dynamic
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@c @cindex operators, @code{~}
+@c @cindex operators, @code{!~}
+The righthand side of a @samp{~} or @samp{!~} operator need not be a
+regexp constant (i.e., a string of characters between slashes).  It may
+be any expression.  The expression is evaluated and converted to a string
+if necessary; the contents of the string are then used as the
+regexp.  A regexp computed in this way is called a @dfn{dynamic
+regexp} or a @dfn{computed regexp}:
+
+@example
+BEGIN @{ digits_regexp = "[[:digit:]]+" @}
+$0 ~ digits_regexp    @{ print @}
+@end example
+
+@noindent
+This sets @code{digits_regexp} to a regexp that describes one or more digits,
+and tests whether the input record matches this regexp.
+
+@quotation NOTE
+When using the @samp{~} and @samp{!~}
+operators, be aware that there is a difference between a regexp constant
+enclosed in slashes and a string constant enclosed in double quotes.
+If you are going to use a string constant, you have to understand that
+the string is, in essence, scanned @emph{twice}: the first time when
+@command{awk} reads your program, and the second time when it goes to
+match the string on the lefthand side of the operator with the pattern
+on the right.  This is true of any string-valued expression (such as
+@code{digits_regexp}, shown in the previous example), not just string constants.
+@end quotation
+
+@cindex regexp constants, slashes vs.@: quotes
+@cindex @code{\} (backslash), in regexp constants
+@cindex backslash (@code{\}), in regexp constants
+@cindex @code{"} (double quote), in regexp constants
+@cindex double quote (@code{"}), in regexp constants
+What difference does it make if the string is
+scanned twice? The answer has to do with escape sequences, and particularly
+with backslashes.  To get a backslash into a regular expression inside a
+string, you have to type two backslashes.
+
+For example, @code{/\*/} is a regexp constant for a literal @samp{*}.
+Only one backslash is needed.  To do the same thing with a string,
+you have to type @code{"\\*"}.  The first backslash escapes the
+second one so that the string actually contains the
+two characters @samp{\} and @samp{*}.
+
+@cindex troubleshooting, regexp constants vs.@: string constants
+@cindex regexp constants, vs.@: string constants
+@cindex string constants, vs.@: regexp constants
+Given that you can use both regexp and string constants to describe
+regular expressions, which should you use?  The answer is ``regexp
+constants,'' for several reasons:
+
+@itemize @value{BULLET}
+@item
+String constants are more complicated to write and
+more difficult to read. Using regexp constants makes your programs
+less error-prone.  Not understanding the difference between the two
+kinds of constants is a common source of errors.
+
+@item
+It is more efficient to use regexp constants. @command{awk} can note
+that you have supplied a regexp and store it internally in a form that
+makes pattern matching more efficient.  When using a string constant,
+@command{awk} must first convert the string into this internal form and
+then perform the pattern matching.
+
+@item
+Using regexp constants is better form; it shows clearly that you
+intend a regexp match.
+@end itemize
+
+@sidebar Using @code{\n} in Bracket Expressions of Dynamic Regexps
+@cindex regular expressions, dynamic, with embedded newlines
+@cindex newlines, in dynamic regexps
+
+Some older versions of @command{awk} do not allow the newline
+character to be used inside a bracket expression for a dynamic regexp:
+
+@example
+$ @kbd{awk '$0 ~ "[ \t\n]"'}
+@error{} awk: newline in character class [
+@error{} ]...
+@error{}  source line number 1
+@error{}  context is
+@error{}        $0 ~ "[ >>>  \t\n]" <<<
+@end example
+
+@cindex newlines, in regexp constants
+But a newline in a regexp constant works with no problem:
+
+@example
+$ @kbd{awk '$0 ~ /[ \t\n]/'}
+@kbd{here is a sample line}
+@print{} here is a sample line
+@kbd{Ctrl-d}
+@end example
+
+@command{gawk} does not have this problem, and it isn't likely to
+occur often in practice, but it's worth noting for future reference.
+@end sidebar
+
+@node GNU Regexp Operators
+@section @command{gawk}-Specific Regexp Operators
+
+@c This section adapted (long ago) from the regex-0.12 manual
+
+@cindex regular expressions, operators, @command{gawk}
+@cindex @command{gawk}, regular expressions, operators
+@cindex operators, GNU-specific
+@cindex regular expressions, operators, for words
+@cindex word, regexp definition of
+GNU software that deals with regular expressions provides a number of
+additional regexp operators.  These operators are described in this
+@value{SECTION} and are specific to @command{gawk};
+they are not available in other @command{awk} implementations.
+Most of the additional operators deal with word matching.
+For our purposes, a @dfn{word} is a sequence of one or more letters, digits,
+or underscores (@samp{_}):
+
+@table @code
+@c @cindex operators, @code{\s} (@command{gawk})
+@cindex backslash (@code{\}), @code{\s} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\s} operator (@command{gawk})
+@item \s
+Matches any whitespace character.
+Think of it as shorthand for
+@w{@samp{[[:space:]]}}.
+
+@c @cindex operators, @code{\S} (@command{gawk})
+@cindex backslash (@code{\}), @code{\S} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\S} operator (@command{gawk})
+@item \S
+Matches any character that is not whitespace.
+Think of it as shorthand for
+@w{@samp{[^[:space:]]}}.
+
+@c @cindex operators, @code{\w} (@command{gawk})
+@cindex backslash (@code{\}), @code{\w} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\w} operator (@command{gawk})
+@item \w
+Matches any word-constituent character---that is, it matches any
+letter, digit, or underscore. Think of it as shorthand for
+@w{@samp{[[:alnum:]_]}}.
+
+@c @cindex operators, @code{\W} (@command{gawk})
+@cindex backslash (@code{\}), @code{\W} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\W} operator (@command{gawk})
+@item \W
+Matches any character that is not word-constituent.
+Think of it as shorthand for
+@w{@samp{[^[:alnum:]_]}}.
+
+@c @cindex operators, @code{\<} (@command{gawk})
+@cindex backslash (@code{\}), @code{\<} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\<} operator (@command{gawk})
+@item \<
+Matches the empty string at the beginning of a word.
+For example, @code{/\<away/} matches @samp{away} but not
+@samp{stowaway}.
+
+@c @cindex operators, @code{\>} (@command{gawk})
+@cindex backslash (@code{\}), @code{\>} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\>} operator (@command{gawk})
+@item \>
+Matches the empty string at the end of a word.
+For example, @code{/stow\>/} matches @samp{stow} but not @samp{stowaway}.
+
+@c @cindex operators, @code{\y} (@command{gawk})
+@cindex backslash (@code{\}), @code{\y} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\y} operator (@command{gawk})
+@cindex word boundaries@comma{} matching
+@item \y
+Matches the empty string at either the beginning or the
+end of a word (i.e., the word boundar@strong{y}).  For example, @samp{\yballs?\y}
+matches either @samp{ball} or @samp{balls}, as a separate word.
+
+@c @cindex operators, @code{\B} (@command{gawk})
+@cindex backslash (@code{\}), @code{\B} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\B} operator (@command{gawk})
+@item \B
+Matches the empty string that occurs between two
+word-constituent characters. For example,
+@code{/\Brat\B/} matches @samp{crate}, but it does not match @samp{dirty rat}.
+@samp{\B} is essentially the opposite of @samp{\y}.
+@end table
+
+@cindex buffers, operators for
+@cindex regular expressions, operators, for buffers
+@cindex operators, string-matching, for buffers
+There are two other operators that work on buffers.  In Emacs, a
+@dfn{buffer} is, naturally, an Emacs buffer.
+Other GNU programs, including @command{gawk},
+consider the entire string to match as the buffer.
+The operators are:
+
+@table @code
+@item \`
+@c @cindex operators, @code{\`} (@command{gawk})
+@cindex backslash (@code{\}), @code{\`} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\`} operator (@command{gawk})
+Matches the empty string at the
+beginning of a buffer (string)
+
+@c @cindex operators, @code{\'} (@command{gawk})
+@cindex backslash (@code{\}), @code{\'} operator (@command{gawk})
+@cindex @code{\} (backslash), @code{\'} operator (@command{gawk})
+@item \'
+Matches the empty string at the
+end of a buffer (string)
+@end table
+
+@cindex @code{^} (caret), regexp operator
+@cindex caret (@code{^}), regexp operator
+@cindex @code{?} (question mark), regexp operator
+@cindex question mark (@code{?}), regexp operator
+Because @samp{^} and @samp{$} always work in terms of the beginning
+and end of strings, these operators don't add any new capabilities
+for @command{awk}.  They are provided for compatibility with other
+GNU software.
+
+@cindex @command{gawk}, word-boundary operator
+@cindex word-boundary operator (@command{gawk})
+@cindex operators, word-boundary (@command{gawk})
+In other GNU software, the word-boundary operator is @samp{\b}. However,
+that conflicts with the @command{awk} language's definition of @samp{\b}
+as backspace, so @command{gawk} uses a different letter.
+An alternative method would have been to require two backslashes in the
+GNU operators, but this was deemed too confusing. The current
+method of using @samp{\y} for the GNU @samp{\b} appears to be the
+lesser of two evils.
+
+@cindex regular expressions, @command{gawk}, command-line options
+@cindex @command{gawk}, command-line options, and regular expressions
+The various command-line options
+(@pxref{Options})
+control how @command{gawk} interprets characters in regexps:
+
+@table @asis
+@item No options
+In the default case, @command{gawk} provides all the facilities of
+POSIX regexps and the
+@ifnotinfo
+previously described
+GNU regexp operators.
+@end ifnotinfo
+@ifnottex
+@ifnotdocbook
+GNU regexp operators described
+in @ref{Regexp Operators}.
+@end ifnotdocbook
+@end ifnottex
+
+@item @code{--posix}
+Match only POSIX regexps; the GNU operators are not special
+(e.g., @samp{\w} matches a literal @samp{w}).  Interval expressions
+are allowed.
+
+@cindex Brian Kernighan's @command{awk}
+@item @code{--traditional}
+Match traditional Unix @command{awk} regexps. The GNU operators
+are not special, and interval expressions are not available.
+Because BWK @command{awk} supports them,
+the POSIX character classes (@samp{[[:alnum:]]}, etc.) are available.
+Characters described by octal and hexadecimal escape sequences are
+treated literally, even if they represent regexp metacharacters.
+
+@item @code{--re-interval}
+Allow interval expressions in regexps, if @option{--traditional}
+has been provided.
+Otherwise, interval expressions are available by default.
+@end table
+
+@node Case-sensitivity
+@section Case Sensitivity in Matching
+
+@cindex regular expressions, case sensitivity
+@cindex case sensitivity, regexps and
+Case is normally significant in regular expressions, both when matching
+ordinary characters (i.e., not metacharacters) and inside bracket
+expressions.  Thus, a @samp{w} in a regular expression matches only a lowercase
+@samp{w} and not an uppercase @samp{W}.
+
+The simplest way to do a case-independent match is to use a bracket
+expression---for example, @samp{[Ww]}.  However, this can be cumbersome if
+you need to use it often, and it can make the regular expressions harder
+to read.  There are two alternatives that you might prefer.
+
+One way to perform a case-insensitive match at a particular point in the
+program is to convert the data to a single case, using the
+@code{tolower()} or @code{toupper()} built-in string functions (which we
+haven't discussed yet;
+@pxref{String Functions}).
+For example:
+
+@example
+tolower($1) ~ /foo/  @{ @dots{} @}
+@end example
+
+@noindent
+converts the first field to lowercase before matching against it.
+This works in any POSIX-compliant @command{awk}.
+
+@cindex @command{gawk}, regular expressions, case sensitivity
+@cindex case sensitivity, @command{gawk}
+@cindex differences in @command{awk} and @command{gawk}, regular expressions
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@cindex @code{IGNORECASE} variable, with @code{~} and @code{!~} operators
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+@c @cindex variables, @code{IGNORECASE}
+Another method, specific to @command{gawk}, is to set the variable
+@code{IGNORECASE} to a nonzero value (@pxref{Built-in Variables}).
+When @code{IGNORECASE} is not zero, @emph{all} regexp and string
+operations ignore case.
+
+Changing the value of @code{IGNORECASE} dynamically controls the
+case sensitivity of the program as it runs.  Case is significant by
+default because @code{IGNORECASE} (like most variables) is initialized
+to zero:
+
+@example
+x = "aB"
+if (x ~ /ab/) @dots{}   # this test will fail
+
+IGNORECASE = 1
+if (x ~ /ab/) @dots{}   # now it will succeed
+@end example
+
+In general, you cannot use @code{IGNORECASE} to make certain rules
+case insensitive and other rules case sensitive, as there is no
+straightforward way
+to set @code{IGNORECASE} just for the pattern of
+a particular rule.@footnote{Experienced C and C++ programmers will note
+that it is possible, using something like
+@samp{IGNORECASE = 1 && /foObAr/ @{ @dots{} @}}
+and
+@samp{IGNORECASE = 0 || /foobar/ @{ @dots{} @}}.
+However, this is somewhat obscure and we don't recommend it.}
+To do this, use either bracket expressions or @code{tolower()}.  However, one
+thing you can do with @code{IGNORECASE} only is dynamically turn
+case sensitivity on or off for all the rules at once.
+
+@code{IGNORECASE} can be set on the command line or in a @code{BEGIN} rule
+(@pxref{Other Arguments}; also
+@pxref{Using BEGIN/END}).
+Setting @code{IGNORECASE} from the command line is a way to make
+a program case insensitive without having to edit it.
+
+@c @cindex ISO 8859-1
+@c @cindex ISO Latin-1
+In multibyte locales, the equivalences between upper- and lowercase
+characters are tested based on the wide-character values of the locale's
+character set.  Prior to @value{PVERSION} 5.0, single-byte characters were
+tested based on the ISO-8859-1 (ISO Latin-1) character set.  However, as
+of @value{PVERSION} 5.0, single-byte characters are also tested based on
+the values of the locale's character set.@footnote{If you don't understand
+this, don't worry about it; it just means that @command{gawk} does the
+right thing.}
+
+The value of @code{IGNORECASE} has no effect if @command{gawk} is in
+compatibility mode (@pxref{Options}).
+Case is always significant in compatibility mode.
+
+@node Regexp Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Regular expressions describe sets of strings to be matched.
+In @command{awk}, regular expression constants are written enclosed
+between slashes: @code{/}@dots{}@code{/}.
+
+@item
+Regexp constants may be used standalone in patterns and
+in conditional expressions, or as part of matching expressions
+using the @samp{~} and @samp{!~} operators.
+
+@item
+Escape sequences let you represent nonprintable characters and
+also let you represent regexp metacharacters as literal characters
+to be matched.
+
+@item
+Regexp operators provide grouping, alternation, and repetition.
+
+@item
+Bracket expressions give you a shorthand for specifying sets
+of characters that can match at a particular point in a regexp.
+Within bracket expressions, POSIX character classes let you specify
+certain groups of characters in a locale-independent fashion.
+
+@item
+Regular expressions match the leftmost longest text in the string being
+matched.  This matters for cases where you need to know the extent of
+the match, such as for text substitution and when the record separator
+is a regexp.
+
+@item
+Matching expressions may use dynamic regexps (i.e., string values
+treated as regular expressions).
+
+@item
+@command{gawk}'s @code{IGNORECASE} variable lets you control the
+case sensitivity of regexp matching.  In other @command{awk}
+versions, use @code{tolower()} or @code{toupper()}.
+
+@end itemize
+
+
+@node Reading Files
+@chapter Reading Input Files
+
+@cindex reading input files
+@cindex input files, reading
+@cindex input files
+@cindex @code{FILENAME} variable
+In the typical @command{awk} program,
+@command{awk} reads all input either from the
+standard input (by default, this is the keyboard, but often it is a pipe from another
+command) or from files whose names you specify on the @command{awk}
+command line.  If you specify input files, @command{awk} reads them
+in order, processing all the data from one before going on to the next.
+The name of the current input file can be found in the predefined variable
+@code{FILENAME}
+(@pxref{Built-in Variables}).
+
+@cindex records
+@cindex fields
+The input is read in units called @dfn{records}, and is processed by the
+rules of your program one record at a time.
+By default, each record is one line.  Each
+record is automatically split into chunks called @dfn{fields}.
+This makes it more convenient for programs to work on the parts of a record.
+
+@cindex @code{getline} command
+On rare occasions, you may need to use the @code{getline} command.
+The  @code{getline} command is valuable both because it
+can do explicit input from any number of files, and because the files
+used with it do not have to be named on the @command{awk} command line
+(@pxref{Getline}).
+
+@menu
+* Records::                     Controlling how data is split into records.
+* Fields::                      An introduction to fields.
+* Nonconstant Fields::          Nonconstant Field Numbers.
+* Changing Fields::             Changing the Contents of a Field.
+* Field Separators::            The field separator and how to change it.
+* Constant Size::               Reading constant width data.
+* Splitting By Content::        Defining Fields By Content
+* Testing field creation::      Checking how @command{gawk} is splitting
+                                records.
+* Multiple Line::               Reading multiline records.
+* Getline::                     Reading files under explicit program control
+                                using the @code{getline} function.
+* Read Timeout::                Reading input with a timeout.
+* Retrying Input::              Retrying input after certain errors.
+* Command-line directories::    What happens if you put a directory on the
+                                command line.
+* Input Summary::               Input summary.
+* Input Exercises::             Exercises.
+@end menu
+
+@node Records
+@section How Input Is Split into Records
+
+@cindex input, splitting into records
+@cindex records, splitting input into
+@cindex @code{NR} variable
+@cindex @code{FNR} variable
+@command{awk} divides the input for your program into records and fields.
+It keeps track of the number of records that have been read so far from
+the current input file.  This value is stored in a predefined variable
+called @code{FNR}, which is reset to zero every time a new file is started.
+Another predefined variable, @code{NR}, records the total number of input
+records read so far from all @value{DF}s.  It starts at zero, but is
+never automatically reset to zero.
+
+Normally, records are separated by newline characters.  You can control how
+records are separated by assigning values to the built-in variable @code{RS}.
+If @code{RS} is any single character, that character separates records.
+Otherwise (in @command{gawk}), @code{RS} is treated as a regular expression.
+This mechanism is explained in greater detail shortly.
+
+@menu
+* awk split records::           How standard @command{awk} splits records.
+* gawk split records::          How @command{gawk} splits records.
+@end menu
+
+@node awk split records
+@subsection Record Splitting with Standard @command{awk}
+
+@cindex separators, for records
+@cindex record separators
+Records are separated by a character called the @dfn{record separator}.
+By default, the record separator is the newline character.
+This is why records are, by default, single lines.
+To use a different character for the record separator,
+simply assign that character to the predefined variable @code{RS}.
+
+@cindex record separators, newlines as
+@cindex newlines, as record separators
+@cindex @code{RS} variable
+Like any other variable,
+the value of @code{RS} can be changed in the @command{awk} program
+with the assignment operator, @samp{=}
+(@pxref{Assignment Ops}).
+The new record-separator character should be enclosed in quotation marks,
+which indicate a string constant.  Often, the right time to do this is
+at the beginning of execution, before any input is processed,
+so that the very first record is read with the proper separator.
+To do this, use the special @code{BEGIN} pattern
+(@pxref{BEGIN/END}).
+For example:
+
+@example
+awk 'BEGIN @{ RS = "u" @}
+     @{ print $0 @}' mail-list
+@end example
+
+@noindent
+changes the value of @code{RS} to @samp{u}, before reading any input.
+The new value is a string whose first character is the letter ``u''; as a result, records
+are separated by the letter ``u''.  Then the input file is read, and the second
+rule in the @command{awk} program (the action with no pattern) prints each
+record.  Because each @code{print} statement adds a newline at the end of
+its output, this @command{awk} program copies the input
+with each @samp{u} changed to a newline.  Here are the results of running
+the program on @file{mail-list}:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{ RS = "u" @}}
+>      @kbd{@{ print $0 @}' mail-list}
+@end group
+@print{} Amelia       555-5553     amelia.zodiac
+@print{} sq
+@print{} e@@gmail.com    F
+@print{} Anthony      555-3412     anthony.assert
+@print{} ro@@hotmail.com   A
+@print{} Becky        555-7685     becky.algebrar
+@print{} m@@gmail.com      A
+@print{} Bill         555-1675     bill.drowning@@hotmail.com       A
+@print{} Broderick    555-0542     broderick.aliq
+@print{} otiens@@yahoo.com R
+@print{} Camilla      555-2912     camilla.inf
+@print{} sar
+@print{} m@@skynet.be     R
+@print{} Fabi
+@print{} s       555-1234     fabi
+@print{} s.
+@print{} ndevicesim
+@print{} s@@
+@print{} cb.ed
+@print{}     F
+@print{} J
+@print{} lie        555-6699     j
+@print{} lie.perscr
+@print{} tabor@@skeeve.com   F
+@print{} Martin       555-6480     martin.codicib
+@print{} s@@hotmail.com    A
+@print{} Sam
+@print{} el       555-3430     sam
+@print{} el.lanceolis@@sh
+@print{} .ed
+@print{}         A
+@print{} Jean-Pa
+@print{} l    555-2127     jeanpa
+@print{} l.campanor
+@print{} m@@ny
+@print{} .ed
+@print{}      R
+@print{}
+@end example
+
+@noindent
+Note that the entry for the name @samp{Bill} is not split.
+In the original @value{DF}
+(@pxref{Sample Data Files}),
+the line looks like this:
+
+@example
+Bill         555-1675     bill.drowning@@hotmail.com       A
+@end example
+
+@noindent
+It contains no @samp{u}, so there is no reason to split the record,
+unlike the others, which each have one or more occurrences of the @samp{u}.
+In fact, this record is treated as part of the previous record;
+the newline separating them in the output
+is the original newline in the @value{DF}, not the one added by
+@command{awk} when it printed the record!
+
+@cindex record separators, changing
+@cindex separators, for records
+Another way to change the record separator is on the command line,
+using the variable-assignment feature
+(@pxref{Other Arguments}):
+
+@example
+awk '@{ print $0 @}' RS="u" mail-list
+@end example
+
+@noindent
+This sets @code{RS} to @samp{u} before processing @file{mail-list}.
+
+Using an alphabetic character such as @samp{u} for the record separator
+is highly likely to produce strange results.
+Using an unusual character such as @samp{/} is more likely to
+produce correct behavior in the majority of cases, but there
+are no guarantees. The moral is: Know Your Data.
+
+@command{gawk} allows @code{RS} to be a full regular expression
+(discussed shortly; @pxref{gawk split records}).  Even so, using
+a regular expression metacharacter, such as @samp{.} as the single
+character in the value of @code{RS} has no special effect: it is
+treated literally. This is required for backwards compatibility with
+both Unix @command{awk} and with POSIX.
+
+When using regular characters as the record separator,
+there is one unusual case that occurs when @command{gawk} is
+being fully POSIX-compliant (@pxref{Options}).
+Then, the following (extreme) pipeline prints a surprising @samp{1}:
+
+@example
+$ @kbd{echo | gawk --posix 'BEGIN @{ RS = "a" @} ; @{ print NF @}'}
+@print{} 1
+@end example
+
+There is one field, consisting of a newline.  The value of the built-in
+variable @code{NF} is the number of fields in the current record.
+(In the normal case, @command{gawk} treats the newline as whitespace,
+printing @samp{0} as the result. Most other versions of @command{awk}
+also act this way.)
+
+@cindex dark corner, input files
+Reaching the end of an input file terminates the current input record,
+even if the last character in the file is not the character in @code{RS}.
+@value{DARKCORNER}
+
+@cindex empty strings
+@cindex null strings
+@cindex strings, empty, See null strings
+The empty string @code{""} (a string without any characters)
+has a special meaning
+as the value of @code{RS}. It means that records are separated
+by one or more blank lines and nothing else.
+@xref{Multiple Line} for more details.
+
+If you change the value of @code{RS} in the middle of an @command{awk} run,
+the new value is used to delimit subsequent records, but the record
+currently being processed, as well as records already processed, are not
+affected.
+
+@cindex @command{gawk}, @code{RT} variable in
+@cindex @code{RT} variable
+@cindex records, terminating
+@cindex terminating records
+@cindex differences in @command{awk} and @command{gawk}, record separators
+@cindex differences in @command{awk} and @command{gawk}, @code{RS}/@code{RT} variables
+@cindex regular expressions, as record separators
+@cindex record separators, regular expressions as
+@cindex separators, for records, regular expressions as
+After the end of the record has been determined, @command{gawk}
+sets the variable @code{RT} to the text in the input that matched
+@code{RS}.
+
+@node gawk split records
+@subsection Record Splitting with @command{gawk}
+
+@cindex common extensions, @code{RS} as a regexp
+@cindex extensions, common@comma{} @code{RS} as a regexp
+When using @command{gawk}, the value of @code{RS} is not limited to a
+one-character string.  If it contains more than one character, it is
+treated as a regular expression
+(@pxref{Regexp}). @value{COMMONEXT}
+In general, each record
+ends at the next string that matches the regular expression; the next
+record starts at the end of the matching string.  This general rule is
+actually at work in the usual case, where @code{RS} contains just a
+newline: a record ends at the beginning of the next matching string (the
+next newline in the input), and the following record starts just after
+the end of this string (at the first character of the following line).
+The newline, because it matches @code{RS}, is not part of either record.
+
+When @code{RS} is a single character, @code{RT}
+contains the same single character. However, when @code{RS} is a
+regular expression, @code{RT} contains
+the actual input text that matched the regular expression.
+
+If the input file ends without any text matching @code{RS},
+@command{gawk} sets @code{RT} to the null string.
+
+The following example illustrates both of these features.
+It sets @code{RS} equal to a regular expression that
+matches either a newline or a series of one or more uppercase letters
+with optional leading and/or trailing whitespace:
+
+@example
+@group
+$ @kbd{echo record 1 AAAA record 2 BBBB record 3 |}
+> @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}}
+>             @kbd{@{ print "Record =", $0,"and RT = [" RT "]" @}'}
+@end group
+@print{} Record = record 1 and RT = [ AAAA ]
+@print{} Record = record 2 and RT = [ BBBB ]
+@print{} Record = record 3 and RT = [
+@print{} ]
+@end example
+
+@noindent
+The square brackets delineate the contents of @code{RT}, letting you
+see the leading and trailing whitespace. The final value of
+@code{RT} is a newline.
+@xref{Simple Sed} for a more useful example
+of @code{RS} as a regexp and @code{RT}.
+
+If you set @code{RS} to a regular expression that allows optional
+trailing text, such as @samp{RS = "abc(XYZ)?"}, it is possible, due
+to implementation constraints, that @command{gawk} may match the leading
+part of the regular expression, but not the trailing part, particularly
+if the input text that could match the trailing part is fairly long.
+@command{gawk} attempts to avoid this problem, but currently, there's
+no guarantee that this will never happen.
+
+@quotation NOTE
+Remember that in @command{awk}, the @samp{^} and @samp{$} anchor
+metacharacters match the beginning and end of a @emph{string}, and not
+the beginning and end of a @emph{line}.  As a result, something like
+@samp{RS = "^[[:upper:]]"} can only match at the beginning of a file.
+This is because @command{gawk} views the input file as one long string
+that happens to contain newline characters.
+It is thus best to avoid anchor metacharacters in the value of @code{RS}.
+@end quotation
+
+@cindex @command{gawk}, @code{RT} variable in
+@cindex @code{RT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{RS}/@code{RT} variables
+The use of @code{RS} as a regular expression and the @code{RT}
+variable are @command{gawk} extensions; they are not available in
+compatibility mode
+(@pxref{Options}).
+In compatibility mode, only the first character of the value of
+@code{RS} determines the end of the record.
+
+@sidebar @code{RS = "\0"} Is Not Portable
+@cindex portability, data files as single record
+There are times when you might want to treat an entire @value{DF} as a
+single record.  The only way to make this happen is to give @code{RS}
+a value that you know doesn't occur in the input file.  This is hard
+to do in a general way, such that a program always works for arbitrary
+input files.
+
+You might think that for text files, the @sc{nul} character, which
+consists of a character with all bits equal to zero, is a good
+value to use for @code{RS} in this case:
+
+@example
+BEGIN @{ RS = "\0" @}  # whole file becomes one record?
+@end example
+
+@cindex differences in @command{awk} and @command{gawk}, strings, storing
+@command{gawk} in fact accepts this, and uses the @sc{nul}
+character for the record separator.
+This works for certain special files, such as @file{/proc/environ} on
+GNU/Linux systems, where the @sc{nul} character is in fact the record separator.
+However, this usage is @emph{not} portable
+to most other @command{awk} implementations.
+
+@cindex dark corner, strings, storing
+Almost all other @command{awk} implementations@footnote{At least that we know
+about.} store strings internally as C-style strings.  C strings use the
+@sc{nul} character as the string terminator.  In effect, this means that
+@samp{RS = "\0"} is the same as @samp{RS = ""}.
+@value{DARKCORNER}
+
+It happens that recent versions of @command{mawk} can use the @sc{nul}
+character as a record separator. However, this is a special case:
+@command{mawk} does not allow embedded @sc{nul} characters in strings.
+(This may change in a future version of @command{mawk}.)
+
+@cindex records, treating files as
+@cindex treating files, as single records
+@cindex single records, treating files as
+@xref{Readfile Function} for an interesting way to read
+whole files.  If you are using @command{gawk}, see @ref{Extension Sample
+Readfile} for another option.
+@end sidebar
+
+@node Fields
+@section Examining Fields
+
+@cindex examining fields
+@cindex fields
+@cindex accessing fields
+@cindex fields, examining
+When @command{awk} reads an input record, the record is
+automatically @dfn{parsed} or separated by the @command{awk} utility into chunks
+called @dfn{fields}.  By default, fields are separated by @dfn{whitespace},
+like words in a line.
+Whitespace in @command{awk} means any string of one or more spaces,
+TABs, or newlines; other characters
+that are considered whitespace by other languages
+(such as formfeed, vertical tab, etc.) are @emph{not} considered
+whitespace by @command{awk}.
+
+The purpose of fields is to make it more convenient for you to refer to
+these pieces of the record.  You don't have to use them---you can
+operate on the whole record if you want---but fields are what make
+simple @command{awk} programs so powerful.
+
+@cindex field operator @code{$}
+@cindex @code{$} (dollar sign), @code{$} field operator
+@cindex dollar sign (@code{$}), @code{$} field operator
+@cindex field operators@comma{} dollar sign as
+You use a dollar sign (@samp{$})
+to refer to a field in an @command{awk} program,
+followed by the number of the field you want.  Thus, @code{$1}
+refers to the first field, @code{$2} to the second, and so on.
+(Unlike in the Unix shells, the field numbers are not limited to single digits.
+@code{$127} is the 127th field in the record.)
+For example, suppose the following is a line of input:
+
+@example
+This seems like a pretty nice example.
+@end example
+
+@noindent
+Here the first field, or @code{$1}, is @samp{This}, the second field, or
+@code{$2}, is @samp{seems}, and so on.  Note that the last field,
+@code{$7}, is @samp{example.}.  Because there is no space between the
+@samp{e} and the @samp{.}, the period is considered part of the seventh
+field.
+
+@cindex @code{NF} variable
+@cindex fields, number of
+@code{NF} is a predefined variable whose value is the number of fields
+in the current record.  @command{awk} automatically updates the value
+of @code{NF} each time it reads a record.  No matter how many fields
+there are, the last field in a record can be represented by @code{$NF}.
+So, @code{$NF} is the same as @code{$7}, which is @samp{example.}.
+If you try to reference a field beyond the last
+one (such as @code{$8} when the record has only seven fields), you get
+the empty string.  (If used in a numeric operation, you get zero.)
+
+The use of @code{$0}, which looks like a reference to the ``zeroth'' field, is
+a special case: it represents the whole input record. Use it
+when you are not interested in specific fields.
+Here are some more examples:
+
+@example
+$ @kbd{awk '$1 ~ /li/ @{ print $0 @}' mail-list}
+@print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+@print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+@end example
+
+@noindent
+This example prints each record in the file @file{mail-list} whose first
+field contains the string @samp{li}.
+
+By contrast, the following example looks for @samp{li} in @emph{the
+entire record} and prints the first and last fields for each matching
+input record:
+
+@example
+$ @kbd{awk '/li/ @{ print $1, $NF @}' mail-list}
+@print{} Amelia F
+@print{} Broderick R
+@print{} Julie F
+@print{} Samuel A
+@end example
+
+@node Nonconstant Fields
+@section Nonconstant Field Numbers
+@cindex fields, numbers
+@cindex field numbers
+
+A field number need not be a constant.  Any expression in
+the @command{awk} language can be used after a @samp{$} to refer to a
+field.  The value of the expression specifies the field number.  If the
+value is a string, rather than a number, it is converted to a number.
+Consider this example:
+
+@example
+awk '@{ print $NR @}'
+@end example
+
+@noindent
+Recall that @code{NR} is the number of records read so far: one in the
+first record, two in the second, and so on.  So this example prints the first
+field of the first record, the second field of the second record, and so
+on.  For the twentieth record, field number 20 is printed; most likely,
+the record has fewer than 20 fields, so this prints a blank line.
+Here is another example of using expressions as field numbers:
+
+@example
+awk '@{ print $(2*2) @}' mail-list
+@end example
+
+@command{awk} evaluates the expression @samp{(2*2)} and uses
+its value as the number of the field to print.  The @samp{*}
+represents multiplication, so the expression @samp{2*2} evaluates to four.
+The parentheses are used so that the multiplication is done before the
+@samp{$} operation; they are necessary whenever there is a binary
+operator@footnote{A @dfn{binary operator}, such as @samp{*} for
+multiplication, is one that takes two operands. The distinction
+is required because @command{awk} also has unary (one-operand)
+and ternary (three-operand) operators.}
+in the field-number expression.  This example, then, prints the
+type of relationship (the fourth field) for every line of the file
+@file{mail-list}.  (All of the @command{awk} operators are listed, in
+order of decreasing precedence, in
+@ref{Precedence}.)
+
+If the field number you compute is zero, you get the entire record.
+Thus, @samp{$(2-2)} has the same value as @code{$0}.  Negative field
+numbers are not allowed; trying to reference one usually terminates
+the program.  (The POSIX standard does not define
+what happens when you reference a negative field number.  @command{gawk}
+notices this and terminates your program.  Other @command{awk}
+implementations may behave differently.)
+
+As mentioned in @ref{Fields},
+@command{awk} stores the current record's number of fields in the built-in
+variable @code{NF} (also @pxref{Built-in Variables}).  Thus, the expression
+@code{$NF} is not a special feature---it is the direct consequence of
+evaluating @code{NF} and using its value as a field number.
+
+@node Changing Fields
+@section Changing the Contents of a Field
+
+@cindex fields, changing contents of
+The contents of a field, as seen by @command{awk}, can be changed within an
+@command{awk} program; this changes what @command{awk} perceives as the
+current input record.  (The actual input is untouched; @command{awk} @emph{never}
+modifies the input file.)
+Consider the following example and its output:
+
+@example
+$ @kbd{awk '@{ nboxes = $3 ; $3 = $3 - 10}
+>        @kbd{print nboxes, $3 @}' inventory-shipped}
+@print{} 25 15
+@print{} 32 22
+@print{} 24 14
+@dots{}
+@end example
+
+@noindent
+The program first saves the original value of field three in the variable
+@code{nboxes}.
+The @samp{-} sign represents subtraction, so this program reassigns
+field three, @code{$3}, as the original value of field three minus ten:
+@samp{$3 - 10}.  (@xref{Arithmetic Ops}.)
+Then it prints the original and new values for field three.
+(Someone in the warehouse made a consistent mistake while inventorying
+the red boxes.)
+
+For this to work, the text in @code{$3} must make sense
+as a number; the string of characters must be converted to a number
+for the computer to do arithmetic on it.  The number resulting
+from the subtraction is converted back to a string of characters that
+then becomes field three.
+@xref{Conversion}.
+
+When the value of a field is changed (as perceived by @command{awk}), the
+text of the input record is recalculated to contain the new field where
+the old one was.  In other words, @code{$0} changes to reflect the altered
+field.  Thus, this program
+prints a copy of the input file, with 10 subtracted from the second
+field of each line:
+
+@example
+$ @kbd{awk '@{ $2 = $2 - 10; print $0 @}' inventory-shipped}
+@print{} Jan 3 25 15 115
+@print{} Feb 5 32 24 226
+@print{} Mar 5 24 34 228
+@dots{}
+@end example
+
+It is also possible to assign contents to fields that are out
+of range.  For example:
+
+@example
+$ @kbd{awk '@{ $6 = ($5 + $4 + $3 + $2)}
+> @kbd{       print $6 @}' inventory-shipped}
+@print{} 168
+@print{} 297
+@print{} 301
+@dots{}
+@end example
+
+@cindex adding, fields
+@cindex fields, adding
+@noindent
+We've just created @code{$6}, whose value is the sum of fields
+@code{$2}, @code{$3}, @code{$4}, and @code{$5}.  The @samp{+} sign
+represents addition.  For the file @file{inventory-shipped}, @code{$6}
+represents the total number of parcels shipped for a particular month.
+
+Creating a new field changes @command{awk}'s internal copy of the current
+input record, which is the value of @code{$0}.  Thus, if you do @samp{print $0}
+after adding a field, the record printed includes the new field, with
+the appropriate number of field separators between it and the previously
+existing fields.
+
+@cindex @code{OFS} variable
+@cindex output field separator, See @code{OFS} variable
+@cindex field separators, See Also @code{OFS}
+This recomputation affects and is affected by
+@code{NF} (the number of fields; @pxref{Fields}).
+For example, the value of @code{NF} is set to the number of the highest
+field you create.
+The exact format of @code{$0} is also affected by a feature that has not been discussed yet:
+the @dfn{output field separator}, @code{OFS},
+used to separate the fields (@pxref{Output Separators}).
+
+Note, however, that merely @emph{referencing} an out-of-range field
+does @emph{not} change the value of either @code{$0} or @code{NF}.
+Referencing an out-of-range field only produces an empty string.  For
+example:
+
+@example
+if ($(NF+1) != "")
+    print "can't happen"
+else
+    print "everything is normal"
+@end example
+
+@noindent
+should print @samp{everything is normal}, because @code{NF+1} is certain
+to be out of range.  (@xref{If Statement}
+for more information about @command{awk}'s @code{if-else} statements.
+@xref{Typing and Comparison}
+for more information about the @samp{!=} operator.)
+
+It is important to note that making an assignment to an existing field
+changes the
+value of @code{$0} but does not change the value of @code{NF},
+even when you assign the empty string to a field.  For example:
+
+@example
+$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""}
+>                       @kbd{print $0; print NF @}'}
+@print{} a::c:d
+@print{} 4
+@end example
+
+@noindent
+The field is still there; it just has an empty value, delimited by
+the two colons between @samp{a} and @samp{c}.
+This example shows what happens if you create a new field:
+
+@example
+$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""; $6 = "new"}
+>                       @kbd{print $0; print NF @}'}
+@print{} a::c:d::new
+@print{} 6
+@end example
+
+@noindent
+The intervening field, @code{$5}, is created with an empty value
+(indicated by the second pair of adjacent colons),
+and @code{NF} is updated with the value six.
+
+@cindex dark corner, @code{NF} variable, decrementing
+@cindex @code{NF} variable, decrementing
+Decrementing @code{NF} throws away the values of the fields
+after the new value of @code{NF} and recomputes @code{$0}.
+@value{DARKCORNER}
+Here is an example:
+
+@example
+$ @kbd{echo a b c d e f | awk '@{ print "NF =", NF;}
+> @kbd{                          NF = 3; print $0 @}'}
+@print{} NF = 6
+@print{} a b c
+@end example
+
+@cindex portability, @code{NF} variable@comma{} decrementing
+@quotation CAUTION
+Some versions of @command{awk} don't
+rebuild @code{$0} when @code{NF} is decremented.
+Until August, 2018, this included BWK @command{awk}; fortunately
+his version now handles this correctly.
+@end quotation
+
+Finally, there are times when it is convenient to force
+@command{awk} to rebuild the entire record, using the current
+values of the fields and @code{OFS}.  To do this, use the
+seemingly innocuous assignment:
+
+@example
+@group
+$1 = $1   # force record to be reconstituted
+print $0  # or whatever else with $0
+@end group
+@end example
+
+@noindent
+This forces @command{awk} to rebuild the record.  It does help
+to add a comment, as we've shown here.
+
+There is a flip side to the relationship between @code{$0} and
+the fields.  Any assignment to @code{$0} causes the record to be
+reparsed into fields using the @emph{current} value of @code{FS}.
+This also applies to any built-in function that updates @code{$0},
+such as @code{sub()} and @code{gsub()}
+(@pxref{String Functions}).
+
+@sidebar Understanding @code{$0}
+
+It is important to remember that @code{$0} is the @emph{full}
+record, exactly as it was read from the input.  This includes
+any leading or trailing whitespace, and the exact whitespace (or other
+characters) that separates the fields.
+
+It is a common error to try to change the field separators
+in a record simply by setting @code{FS} and @code{OFS}, and then
+expecting a plain @samp{print} or @samp{print $0} to print the
+modified record.
+
+But this does not work, because nothing was done to change the record
+itself.  Instead, you must force the record to be rebuilt, typically
+with a statement such as @samp{$1 = $1}, as described earlier.
+@end sidebar
+
+
+@node Field Separators
+@section Specifying How Fields Are Separated
+
+@menu
+* Default Field Splitting::      How fields are normally separated.
+* Regexp Field Splitting::       Using regexps as the field separator.
+* Single Character Fields::      Making each character a separate field.
+* Command Line Field Separator:: Setting @code{FS} from the command line.
+* Full Line Fields::             Making the full line be a single field.
+* Field Splitting Summary::      Some final points and a summary table.
+@end menu
+
+@cindex @code{FS} variable
+@cindex fields, separating
+@cindex field separators
+@cindex fields, separating
+The @dfn{field separator}, which is either a single character or a regular
+expression, controls the way @command{awk} splits an input record into fields.
+@command{awk} scans the input record for character sequences that
+match the separator; the fields themselves are the text between the matches.
+
+In the examples that follow, we use the bullet symbol (@bullet{}) to
+represent spaces in the output.
+If the field separator is @samp{oo}, then the following line:
+
+@example
+moo goo gai pan
+@end example
+
+@noindent
+is split into three fields: @samp{m}, @samp{@bullet{}g}, and
+@samp{@bullet{}gai@bullet{}pan}.
+Note the leading spaces in the values of the second and third fields.
+
+@cindex troubleshooting, @command{awk} uses @code{FS} not @code{IFS}
+The field separator is represented by the predefined variable @code{FS}.
+Shell programmers take note:  @command{awk} does @emph{not} use the
+name @code{IFS} that is used by the POSIX-compliant shells (such as
+the Unix Bourne shell, @command{sh}, or Bash).
+
+@cindex @code{FS} variable, changing value of
+The value of @code{FS} can be changed in the @command{awk} program with the
+assignment operator, @samp{=} (@pxref{Assignment Ops}).
+Often, the right time to do this is at the beginning of execution
+before any input has been processed, so that the very first record
+is read with the proper separator.  To do this, use the special
+@code{BEGIN} pattern
+(@pxref{BEGIN/END}).
+For example, here we set the value of @code{FS} to the string
+@code{","}:
+
+@example
+awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}'
+@end example
+
+@cindex @code{BEGIN} pattern
+@noindent
+Given the input line:
+
+@example
+John Q. Smith, 29 Oak St., Walamazoo, MI 42139
+@end example
+
+@noindent
+this @command{awk} program extracts and prints the string
+@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
+
+@cindex field separators, choice of
+@cindex regular expressions, as field separators
+@cindex field separators, regular expressions as
+Sometimes the input data contains separator characters that don't
+separate fields the way you thought they would.  For instance, the
+person's name in the example we just used might have a title or
+suffix attached, such as:
+
+@example
+John Q. Smith, LXIX, 29 Oak St., Walamazoo, MI 42139
+@end example
+
+@noindent
+The same program would extract @samp{@bullet{}LXIX} instead of
+@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
+If you were expecting the program to print the
+address, you would be surprised.  The moral is to choose your data layout and
+separator characters carefully to prevent such problems.
+(If the data is not in a form that is easy to process, perhaps you
+can massage it first with a separate @command{awk} program.)
+
+
+@node Default Field Splitting
+@subsection Whitespace Normally Separates Fields
+
+@cindex field separators, whitespace as
+@cindex whitespace, as field separators
+Fields are normally separated by whitespace sequences
+(spaces, TABs, and newlines), not by single spaces.  Two spaces in a row do not
+delimit an empty field.  The default value of the field separator @code{FS}
+is a string containing a single space, @w{@code{" "}}.  If @command{awk}
+interpreted this value in the usual way, each space character would separate
+fields, so two spaces in a row would make an empty field between them.
+The reason this does not happen is that a single space as the value of
+@code{FS} is a special case---it is taken to specify the default manner
+of delimiting fields.
+
+If @code{FS} is any other single character, such as @code{","}, then
+each occurrence of that character separates two fields.  Two consecutive
+occurrences delimit an empty field.  If the character occurs at the
+beginning or the end of the line, that too delimits an empty field.  The
+space character is the only single character that does not follow these
+rules.
+
+@node Regexp Field Splitting
+@subsection Using Regular Expressions to Separate Fields
+
+@cindex regular expressions, as field separators
+@cindex field separators, regular expressions as
+The previous @value{SUBSECTION}
+discussed the use of single characters or simple strings as the
+value of @code{FS}.
+More generally, the value of @code{FS} may be a string containing any
+regular expression.  In this case, each match in the record for the regular
+expression separates fields.  For example, the assignment:
+
+@example
+FS = ", \t"
+@end example
+
+@noindent
+makes every area of an input line that consists of a comma followed by a
+space and a TAB into a field separator.
+@ifinfo
+(@samp{\t}
+is an @dfn{escape sequence} that stands for a TAB;
+@pxref{Escape Sequences},
+for the complete list of similar escape sequences.)
+@end ifinfo
+
+For a less trivial example of a regular expression, try using
+single spaces to separate fields the way single commas are used.
+@code{FS} can be set to @w{@code{"[@ ]"}} (left bracket, space, right
+bracket).  This regular expression matches a single space and nothing else
+(@pxref{Regexp}).
+
+There is an important difference between the two cases of @samp{FS = @w{" "}}
+(a single space) and @samp{FS = @w{"[ \t\n]+"}}
+(a regular expression matching one or more spaces, TABs, or newlines).
+For both values of @code{FS}, fields are separated by @dfn{runs}
+(multiple adjacent occurrences) of spaces, TABs,
+and/or newlines.  However, when the value of @code{FS} is @w{@code{" "}},
+@command{awk} first strips leading and trailing whitespace from
+the record and then decides where the fields are.
+For example, the following pipeline prints @samp{b}:
+
+@example
+$ @kbd{echo ' a b c d ' | awk '@{ print $2 @}'}
+@print{} b
+@end example
+
+@noindent
+However, this pipeline prints @samp{a} (note the extra spaces around
+each letter):
+
+@example
+$ @kbd{echo ' a  b  c  d ' | awk 'BEGIN @{ FS = "[ \t\n]+" @}}
+>                                  @kbd{@{ print $2 @}'}
+@print{} a
+@end example
+
+@noindent
+@cindex null strings
+@cindex strings, null
+@cindex empty strings, See null strings
+In this case, the first field is null, or empty.
+
+The stripping of leading and trailing whitespace also comes into
+play whenever @code{$0} is recomputed.  For instance, study this pipeline:
+
+@example
+$ @kbd{echo '   a b c d' | awk '@{ print; $2 = $2; print @}'}
+@print{}    a b c d
+@print{} a b c d
+@end example
+
+@noindent
+The first @code{print} statement prints the record as it was read,
+with leading whitespace intact.  The assignment to @code{$2} rebuilds
+@code{$0} by concatenating @code{$1} through @code{$NF} together,
+separated by the value of @code{OFS} (which is a space by default).
+Because the leading whitespace was ignored when finding @code{$1},
+it is not part of the new @code{$0}.  Finally, the last @code{print}
+statement prints the new @code{$0}.
+
+@cindex @code{FS}, containing @code{^}
+@cindex @code{^} (caret), in @code{FS}
+@cindex dark corner, @code{^}, in @code{FS}
+There is an additional subtlety to be aware of when using regular expressions
+for field splitting.
+It is not well specified in the POSIX standard, or anywhere else, what @samp{^}
+means when splitting fields.  Does the @samp{^}  match only at the beginning of
+the entire record? Or is each field separator a new string?  It turns out that
+different @command{awk} versions answer this question differently, and you
+should not rely on any specific behavior in your programs.
+@value{DARKCORNER}
+
+@cindex Brian Kernighan's @command{awk}
+As a point of information, BWK @command{awk} allows @samp{^}
+to match only at the beginning of the record. @command{gawk}
+also works this way. For example:
+
+@example
+$ @kbd{echo 'xxAA  xxBxx  C' |}
+> @kbd{gawk -F '(^x+)|( +)' '@{ for (i = 1; i <= NF; i++)}
+> @kbd{                            printf "-->%s<--\n", $i @}'}
+@print{} --><--
+@print{} -->AA<--
+@print{} -->xxBxx<--
+@print{} -->C<--
+@end example
+
+@node Single Character Fields
+@subsection Making Each Character a Separate Field
+
+@cindex common extensions, single character fields
+@cindex extensions, common@comma{} single character fields
+@cindex differences in @command{awk} and @command{gawk}, single-character fields
+@cindex single-character fields
+@cindex fields, single-character
+There are times when you may want to examine each character
+of a record separately.  This can be done in @command{gawk} by
+simply assigning the null string (@code{""}) to @code{FS}. @value{COMMONEXT}
+In this case,
+each individual character in the record becomes a separate field.
+For example:
+
+@example
+$ @kbd{echo a b | gawk 'BEGIN @{ FS = "" @}}
+>                  @kbd{@{}
+>                      @kbd{for (i = 1; i <= NF; i = i + 1)}
+>                          @kbd{print "Field", i, "is", $i}
+>                  @kbd{@}'}
+@print{} Field 1 is a
+@print{} Field 2 is
+@print{} Field 3 is b
+@end example
+
+@cindex dark corner, @code{FS} as null string
+@cindex @code{FS} variable, as null string
+Traditionally, the behavior of @code{FS} equal to @code{""} was not defined.
+In this case, most versions of Unix @command{awk} simply treat the entire record
+as only having one field.
+@value{DARKCORNER}
+In compatibility mode
+(@pxref{Options}),
+if @code{FS} is the null string, then @command{gawk} also
+behaves this way.
+
+@node Command Line Field Separator
+@subsection Setting @code{FS} from the Command Line
+@cindex @option{-F} option, command-line
+@cindex field separator, on command line
+@cindex command line, @code{FS} on@comma{} setting
+@cindex @code{FS} variable, setting from command line
+
+@code{FS} can be set on the command line.  Use the @option{-F} option to
+do so.  For example:
+
+@example
+awk -F, '@var{program}' @var{input-files}
+@end example
+
+@noindent
+sets @code{FS} to the @samp{,} character.  Notice that the option uses
+an uppercase @samp{F} instead of a lowercase @samp{f}. The latter
+option (@option{-f}) specifies a file containing an @command{awk} program.
+
+The value used for the argument to @option{-F} is processed in exactly the
+same way as assignments to the predefined variable @code{FS}.
+Any special characters in the field separator must be escaped
+appropriately.  For example, to use a @samp{\} as the field separator
+on the command line, you would have to type:
+
+@example
+# same as FS = "\\"
+awk -F\\\\ '@dots{}' files @dots{}
+@end example
+
+@noindent
+@cindex field separator, backslash (@code{\}) as
+@cindex @code{\} (backslash), as field separator
+@cindex backslash (@code{\}), as field separator
+Because @samp{\} is used for quoting in the shell, @command{awk} sees
+@samp{-F\\}.  Then @command{awk} processes the @samp{\\} for escape
+characters (@pxref{Escape Sequences}), finally yielding
+a single @samp{\} to use for the field separator.
+
+@c @cindex historical features
+As a special case, in compatibility mode
+(@pxref{Options}),
+if the argument to @option{-F} is @samp{t}, then @code{FS} is set to
+the TAB character.  If you type @samp{-F\t} at the
+shell, without any quotes, the @samp{\} gets deleted, so @command{awk}
+figures that you really want your fields to be separated with TABs and
+not @samp{t}s.  Use @samp{-v FS="t"} or @samp{-F"[t]"} on the command line
+if you really do want to separate your fields with @samp{t}s.
+Use @samp{-F '\t'} when not in compatibility mode to specify that TABs
+separate fields.
+
+As an example, let's use an @command{awk} program file called @file{edu.awk}
+that contains the pattern @code{/edu/} and the action @samp{print $1}:
+
+@example
+/edu/   @{ print $1 @}
+@end example
+
+Let's also set @code{FS} to be the @samp{-} character and run the
+program on the file @file{mail-list}.  The following command prints a
+list of the names of the people that work at or attend a university, and
+the first three digits of their phone numbers:
+
+@example
+$ @kbd{awk -F- -f edu.awk mail-list}
+@print{} Fabius       555
+@print{} Samuel       555
+@print{} Jean
+@end example
+
+@noindent
+Note the third line of output.  The third line
+in the original file looked like this:
+
+@example
+Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@end example
+
+The @samp{-} as part of the person's name was used as the field
+separator, instead of the @samp{-} in the phone number that was
+originally intended.  This demonstrates why you have to be careful in
+choosing your field and record separators.
+
+@cindex Unix @command{awk}, password files@comma{} field separators and
+Perhaps the most common use of a single character as the field separator
+occurs when processing the Unix system password file.  On many Unix
+systems, each user has a separate entry in the system password file, with one
+line per user.  The information in these lines is separated by colons.
+The first field is the user's login name and the second is the user's
+encrypted or shadow password.  (A shadow password is indicated by the
+presence of a single @samp{x} in the second field.)  A password file
+entry might look like this:
+
+@cindex Robbins, Arnold
+@example
+arnold:x:2076:10:Arnold Robbins:/home/arnold:/bin/bash
+@end example
+
+The following program searches the system password file and prints
+the entries for users whose full name is not indicated:
+
+@example
+awk -F: '$5 == ""' /etc/passwd
+@end example
+
+@node Full Line Fields
+@subsection Making the Full Line Be a Single Field
+
+Occasionally, it's useful to treat the whole input line as a
+single field.  This can be done easily and portably simply by
+setting @code{FS} to @code{"\n"} (a newline):@footnote{Thanks to
+Andrew Schorr for this tip.}
+
+@example
+awk -F'\n' '@var{program}' @var{files @dots{}}
+@end example
+
+@noindent
+When you do this, @code{$1} is the same as @code{$0}.
+
+@sidebar Changing @code{FS} Does Not Affect the Fields
+
+@cindex POSIX @command{awk}, field separators and
+@cindex field separator, POSIX and
+According to the POSIX standard, @command{awk} is supposed to behave
+as if each record is split into fields at the time it is read.
+In particular, this means that if you change the value of @code{FS}
+after a record is read, the values of the fields (i.e., how they were split)
+should reflect the old value of @code{FS}, not the new one.
+
+@cindex dark corner, field separators
+@cindex @command{sed} utility
+@cindex stream editors
+However, many older implementations of @command{awk} do not work this way.  Instead,
+they defer splitting the fields until a field is actually
+referenced.  The fields are split
+using the @emph{current} value of @code{FS}!
+@value{DARKCORNER}
+This behavior can be difficult
+to diagnose. The following example illustrates the difference
+between the two methods:
+
+@example
+sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}'
+@end example
+
+@noindent
+which usually prints:
+
+@example
+root
+@end example
+
+@noindent
+on an incorrect implementation of @command{awk}, while @command{gawk}
+prints the full first line of the file, something like:
+
+@example
+root:x:0:0:Root:/:
+@end example
+
+(The @command{sed}@footnote{The @command{sed} utility is a ``stream editor.''
+Its behavior is also defined by the POSIX standard.}
+command prints just the first line of @file{/etc/passwd}.)
+@end sidebar
+
+@node Field Splitting Summary
+@subsection Field-Splitting Summary
+
+It is important to remember that when you assign a string constant
+as the value of @code{FS}, it undergoes normal @command{awk} string
+processing.  For example, with Unix @command{awk} and @command{gawk},
+the assignment @samp{FS = "\.."} assigns the character string @code{".."}
+to @code{FS} (the backslash is stripped).  This creates a regexp meaning
+``fields are separated by occurrences of any two characters.''
+If instead you want fields to be separated by a literal period followed
+by any single character, use @samp{FS = "\\.."}.
+
+The following list summarizes how fields are split, based on the value
+of @code{FS} (@samp{==} means ``is equal to''):
+
+@table @code
+@item FS == " "
+Fields are separated by runs of whitespace.  Leading and trailing
+whitespace are ignored.  This is the default.
+
+@item FS == @var{any other single character}
+Fields are separated by each occurrence of the character.  Multiple
+successive occurrences delimit empty fields, as do leading and
+trailing occurrences.
+The character can even be a regexp metacharacter; it does not need
+to be escaped.
+
+@item FS == @var{regexp}
+Fields are separated by occurrences of characters that match @var{regexp}.
+Leading and trailing matches of @var{regexp} delimit empty fields.
+
+@item FS == ""
+Each individual character in the record becomes a separate field.
+(This is a common extension; it is not specified by the POSIX standard.)
+@end table
+
+@sidebar @code{FS} and @code{IGNORECASE}
+
+The @code{IGNORECASE} variable
+(@pxref{User-modified})
+affects field splitting @emph{only} when the value of @code{FS} is a regexp.
+It has no effect when @code{FS} is a single character, even if
+that character is a letter.  Thus, in the following code:
+
+@example
+FS = "c"
+IGNORECASE = 1
+$0 = "aCa"
+print $1
+@end example
+
+@noindent
+The output is @samp{aCa}.  If you really want to split fields on an
+alphabetic character while ignoring case, use a regexp that will
+do it for you (e.g., @samp{FS = "[c]"}).  In this case, @code{IGNORECASE}
+will take effect.
+@end sidebar
+
+
+@node Constant Size
+@section Reading Fixed-Width Data
+
+@cindex data, fixed-width
+@cindex fixed-width data
+@cindex advanced features, fixed-width data
+
+@c O'Reilly doesn't like it as a note the first thing in the section.
+This @value{SECTION} discusses an advanced
+feature of @command{gawk}.  If you are a novice @command{awk} user,
+you might want to skip it on the first reading.
+
+@command{gawk} provides a facility for dealing with fixed-width fields
+with no distinctive field separator. We discuss this feature in
+the following @value{SUBSECTION}s.
+
+@menu
+* Fixed width data::            Processing fixed-width data.
+* Skipping intervening::        Skipping intervening fields.
+* Allowing trailing data::      Capturing optional trailing data.
+* Fields with fixed data::      Field values with fixed-width data.
+@end menu
+
+@node Fixed width data
+@subsection Processing Fixed-Width Data
+
+An example of fixed-width data would be the input for old Fortran programs
+where numbers are run together, or the output of programs that did not
+anticipate the use of their output as input for other programs.
+
+An example of the latter is a table where all the columns are lined up
+by the use of a variable number of spaces and @emph{empty fields are
+just spaces}.  Clearly, @command{awk}'s normal field splitting based
+on @code{FS} does not work well in this case.  Although a portable
+@command{awk} program can use a series of @code{substr()} calls on
+@code{$0} (@pxref{String Functions}), this is awkward and inefficient
+for a large number of fields.
+
+@cindex troubleshooting, fatal errors, field widths@comma{} specifying
+@cindex @command{w} utility
+@cindex @code{FIELDWIDTHS} variable
+@cindex @command{gawk}, @code{FIELDWIDTHS} variable in
+The splitting of an input record into fixed-width fields is specified by
+assigning a string containing space-separated numbers to the built-in
+variable @code{FIELDWIDTHS}.  Each number specifies the width of the
+field, @emph{including} columns between fields.  If you want to ignore
+the columns between fields, you can specify the width as a separate
+field that is subsequently ignored.  It is a fatal error to supply a
+field width that has a negative value.
+
+The following data is the output of the Unix @command{w} utility.  It is useful
+to illustrate the use of @code{FIELDWIDTHS}:
+
+@example
+@group
+ 10:06pm  up 21 days, 14:04,  23 users
+User     tty       login@  idle   JCPU   PCPU  what
+hzuo     ttyV0     8:58pm            9      5  vi p24.tex
+hzang    ttyV3     6:37pm    50                -csh
+eklye    ttyV5     9:53pm            7      1  em thes.tex
+dportein ttyV6     8:17pm  1:47                -csh
+gierd    ttyD3    10:00pm     1                elm
+dave     ttyD4     9:47pm            4      4  w
+brent    ttyp0    26Jun91  4:46  26:46   4:41  bash
+dave     ttyq4    26Jun9115days     46     46  wnewmail
+@end group
+@end example
+
+The following program takes this input, converts the idle time to
+number of seconds, and prints out the first two fields and the calculated
+idle time:
+
+@example
+BEGIN  @{ FIELDWIDTHS = "9 6 10 6 7 7 35" @}
+NR > 2 @{
+    idle = $4
+    sub(/^ +/, "", idle)   # strip leading spaces
+    if (idle == "")
+        idle = 0
+    if (idle ~ /:/) @{      # hh:mm
+        split(idle, t, ":")
+        idle = t[1] * 60 + t[2]
+    @}
+    if (idle ~ /days/)
+        idle *= 24 * 60 * 60
+
+    print $1, $2, idle
+@}
+@end example
+
+@quotation NOTE
+The preceding program uses a number of @command{awk} features that
+haven't been introduced yet.
+@end quotation
+
+Running the program on the data produces the following results:
+
+@example
+hzuo      ttyV0  0
+hzang     ttyV3  50
+eklye     ttyV5  0
+dportein  ttyV6  107
+gierd     ttyD3  1
+dave      ttyD4  0
+brent     ttyp0  286
+dave      ttyq4  1296000
+@end example
+
+Another (possibly more practical) example of fixed-width input data
+is the input from a deck of balloting cards.  In some parts of
+the United States, voters mark their choices by punching holes in computer
+cards.  These cards are then processed to count the votes for any particular
+candidate or on any particular issue.  Because a voter may choose not to
+vote on some issue, any column on the card may be empty.  An @command{awk}
+program for processing such data could use the @code{FIELDWIDTHS} feature
+to simplify reading the data.  (Of course, getting @command{gawk} to run on
+a system with card readers is another story!)
+
+@node Skipping intervening
+@subsection Skipping Intervening Fields
+
+Starting in @value{PVERSION} 4.2, each field width may optionally be
+preceded by a colon-separated value specifying the number of characters
+to skip before the field starts.  Thus, the preceding program could be
+rewritten to specify @code{FIELDWIDTHS} like so:
+
+@example
+BEGIN  @{ FIELDWIDTHS = "8 1:5 4:7 6 1:6 1:6 2:33" @}
+@end example
+
+This strips away some of the white space separating the fields. With such
+a change, the program produces the following results:
+
+@example
+hzang    ttyV3 50
+eklye    ttyV5 0
+dportein ttyV6 107
+gierd    ttyD3 1
+dave     ttyD4 0
+brent    ttyp0 286
+dave     ttyq4 1296000
+@end example
+
+@node Allowing trailing data
+@subsection Capturing Optional Trailing Data
+
+There are times when fixed-width data may be followed by additional data
+that has no fixed length.  Such data may or may not be present, but if
+it is, it should be possible to get at it from an @command{awk} program.
+
+Starting with @value{PVERSION} 4.2, in order to provide a way to say ``anything
+else in the record after the defined fields,'' @command{gawk}
+allows you to add a final @samp{*} character to the value of
+@code{FIELDWIDTHS}. There can only be one such character, and it must
+be the final non-whitespace character in @code{FIELDWIDTHS}.
+For example:
+
+@example
+$ @kbd{cat fw.awk}                         @ii{Show the program}
+@print{} BEGIN @{ FIELDWIDTHS = "2 2 *" @}
+@print{} @{ print NF, $1, $2, $3 @}
+$ @kbd{cat fw.in}                          @ii{Show sample input}
+@print{} 1234abcdefghi
+$ @kbd{gawk -f fw.awk fw.in}               @ii{Run the program}
+@print{} 3 12 34 abcdefghi
+@end example
+
+@node Fields with fixed data
+@subsection Field Values With Fixed-Width Data
+
+So far, so good.  But what happens if there isn't as much data as there
+should be based on the contents of @code{FIELDWIDTHS}? Or, what happens
+if there is more data than expected?
+
+For many years, what happens in these cases was not well defined. Starting
+with @value{PVERSION} 4.2, the rules are as follows:
+
+@table @asis
+@item Enough data for some fields
+For example, if @code{FIELDWIDTHS} is set to @code{"2 3 4"} and the
+input record is @samp{aabbb}.  In this case, @code{NF} is set to two.
+
+@item Not enough data for a field
+For example, if @code{FIELDWIDTHS} is set to @code{"2 3 4"} and the
+input record is @samp{aab}.  In this case, @code{NF} is set to two and
+@code{$2} has the value @code{"b"}. The idea is that even though there
+aren't as many characters as were expected, there are some, so the data
+should be made available to the program.
+
+@item Too much data
+For example, if @code{FIELDWIDTHS} is set to @code{"2 3 4"} and the
+input record is @samp{aabbbccccddd}.  In this case, @code{NF} is set to
+three and the extra characters (@samp{ddd}) are ignored.  If you want
+@command{gawk} to capture the extra characters, supply a final @samp{*}
+in the value of @code{FIELDWIDTHS}.
+
+@item Too much data, but with @samp{*} supplied
+For example, if @code{FIELDWIDTHS} is set to @code{"2 3 4 *"} and the
+input record is @samp{aabbbccccddd}.  In this case, @code{NF} is set to
+four, and @code{$4} has the value @code{"ddd"}.
+
+@end table
+
+@node Splitting By Content
+@section Defining Fields by Content
+
+@c O'Reilly doesn't like it as a note the first thing in the section.
+This @value{SECTION} discusses an advanced
+feature of @command{gawk}.  If you are a novice @command{awk} user,
+you might want to skip it on the first reading.
+
+@cindex advanced features, specifying field content
+Normally, when using @code{FS}, @command{gawk} defines the fields as the
+parts of the record that occur in between each field separator. In other
+words, @code{FS} defines what a field @emph{is not}, instead of what a field
+@emph{is}.
+However, there are times when you really want to define the fields by
+what they are, and not by what they are not.
+
+The most notorious such case
+is so-called @dfn{comma-separated values} (CSV) data. Many spreadsheet programs,
+for example, can export their data into text files, where each record is
+terminated with a newline, and fields are separated by commas. If
+commas only separated the data, there wouldn't be an issue. The problem comes when
+one of the fields contains an @emph{embedded} comma.
+In such cases, most programs embed the field in double quotes.@footnote{The
+CSV format lacked a formal standard definition for many years.
+@uref{http://www.ietf.org/rfc/rfc4180.txt, RFC 4180}
+standardizes the most common practices.}
+So, we might have data like this:
+
+@example
+@c file eg/misc/addresses.csv
+Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA
+@c endfile
+@end example
+
+@cindex @command{gawk}, @code{FPAT} variable in
+@cindex @code{FPAT} variable
+The @code{FPAT} variable offers a solution for cases like this.
+The value of @code{FPAT} should be a string that provides a regular expression.
+This regular expression describes the contents of each field.
+
+In the case of CSV data as presented here, each field is either ``anything that
+is not a comma,'' or ``a double quote, anything that is not a double quote, and a
+closing double quote.''  If written as a regular expression constant
+(@pxref{Regexp}),
+we would have @code{/([^,]+)|("[^"]+")/}.
+Writing this as a string requires us to escape the double quotes, leading to:
+
+@example
+FPAT = "([^,]+)|(\"[^\"]+\")"
+@end example
+
+Putting this to use, here is a simple program to parse the data:
+
+@example
+@c file eg/misc/simple-csv.awk
+@group
+BEGIN @{
+    FPAT = "([^,]+)|(\"[^\"]+\")"
+@}
+@end group
+
+@group
+@{
+    print "NF = ", NF
+    for (i = 1; i <= NF; i++) @{
+        printf("$%d = <%s>\n", i, $i)
+    @}
+@}
+@end group
+@c endfile
+@end example
+
+When run, we get the following:
+
+@example
+$ @kbd{gawk -f simple-csv.awk addresses.csv}
+NF =  7
+$1 = <Robbins>
+$2 = <Arnold>
+$3 = <"1234 A Pretty Street, NE">
+$4 = <MyTown>
+$5 = <MyState>
+$6 = <12345-6789>
+$7 = <USA>
+@end example
+
+Note the embedded comma in the value of @code{$3}.
+
+A straightforward improvement when processing CSV data of this sort
+would be to remove the quotes when they occur, with something like this:
+
+@example
+if (substr($i, 1, 1) == "\"") @{
+    len = length($i)
+    $i = substr($i, 2, len - 2)    # Get text within the two quotes
+@}
+@end example
+
+As with @code{FS}, the @code{IGNORECASE} variable (@pxref{User-modified})
+affects field splitting with @code{FPAT}.
+
+Assigning a value to @code{FPAT} overrides field splitting
+with @code{FS} and with @code{FIELDWIDTHS}.
+
+@quotation NOTE
+Some programs export CSV data that contains embedded newlines between
+the double quotes.  @command{gawk} provides no way to deal with this.
+Even though a formal specification for CSV data exists, there isn't much
+more to be done;
+the @code{FPAT} mechanism provides an elegant solution for the majority
+of cases, and the @command{gawk} developers are satisfied with that.
+@end quotation
+
+As written, the regexp used for @code{FPAT} requires that each field
+contain at least one character.  A straightforward modification
+(changing the first @samp{+} to @samp{*}) allows fields to be empty:
+
+@example
+FPAT = "([^,]*)|(\"[^\"]+\")"
+@end example
+
+@c FIXME: 4/2015
+@c Consider use of FPAT = "([^,]*)|(\"[^\"]*\")"
+@c (star in latter part of value) to allow quoted strings to be empty.
+@c Per email from Ed Morton <mortoneccc@comcast.net>
+
+Finally, the @code{patsplit()} function makes the same functionality
+available for splitting regular strings (@pxref{String Functions}).
+
+@node Testing field creation
+@section Checking How @command{gawk} Is Splitting Records
+
+@cindex @command{gawk}, splitting fields and
+As we've seen, @command{gawk} provides three independent methods to split
+input records into fields.  The mechanism used is based on which of the
+three variables---@code{FS}, @code{FIELDWIDTHS}, or @code{FPAT}---was
+last assigned to. In addition, an API input parser may choose to override
+the record parsing mechanism; please refer to @ref{Input Parsers} for
+further information about this feature.
+
+To restore normal field splitting after using @code{FIELDWIDTHS}
+and/or @code{FPAT}, simply assign a value to @code{FS}.
+You can use @samp{FS = FS} to do this,
+without having to know the current value of @code{FS}.
+
+In order to tell which kind of field splitting is in effect,
+use @code{PROCINFO["FS"]} (@pxref{Auto-set}).
+The value is @code{"FS"} if regular field splitting is being used,
+@code{"FIELDWIDTHS"} if fixed-width field splitting is being used,
+or @code{"FPAT"} if content-based field splitting is being used:
+
+@example
+if (PROCINFO["FS"] == "FS")
+    @var{regular field splitting} @dots{}
+else if (PROCINFO["FS"] == "FIELDWIDTHS")
+    @var{fixed-width field splitting} @dots{}
+else if (PROCINFO["FS"] == "FPAT")
+    @var{content-based field splitting} @dots{}
+else
+    @var{API input parser field splitting} @dots{} @ii{(advanced feature)}
+@end example
+
+This information is useful when writing a function that needs to
+temporarily change @code{FS} or @code{FIELDWIDTHS}, read some records,
+and then restore the original settings (@pxref{Passwd Functions} for an
+example of such a function).
+
+@node Multiple Line
+@section Multiple-Line Records
+
+@cindex multiple-line records
+@cindex records, multiline
+@cindex input, multiline records
+@cindex files, reading, multiline records
+@cindex input, files, See input files
+In some databases, a single line cannot conveniently hold all the
+information in one entry.  In such cases, you can use multiline
+records.  The first step in doing this is to choose your data format.
+
+@cindex record separators, with multiline records
+One technique is to use an unusual character or string to separate
+records.  For example, you could use the formfeed character (written
+@samp{\f} in @command{awk}, as in C) to separate them, making each record
+a page of the file.  To do this, just set the variable @code{RS} to
+@code{"\f"} (a string containing the formfeed character).  Any
+other character could equally well be used, as long as it won't be part
+of the data in a record.
+
+@cindex @code{RS} variable, multiline records and
+Another technique is to have blank lines separate records.  By a special
+dispensation, an empty string as the value of @code{RS} indicates that
+records are separated by one or more blank lines.  When @code{RS} is set
+to the empty string, each record always ends at the first blank line
+encountered.  The next record doesn't start until the first nonblank
+line that follows.  No matter how many blank lines appear in a row, they
+all act as one record separator.
+(Blank lines must be completely empty; lines that contain only
+whitespace do not count.)
+
+@cindex leftmost longest match
+@cindex matching, leftmost longest
+You can achieve the same effect as @samp{RS = ""} by assigning the
+string @code{"\n\n+"} to @code{RS}. This regexp matches the newline
+at the end of the record and one or more blank lines after the record.
+In addition, a regular expression always matches the longest possible
+sequence when there is a choice
+(@pxref{Leftmost Longest}).
+So, the next record doesn't start until
+the first nonblank line that follows---no matter how many blank lines
+appear in a row, they are considered one record separator.
+
+@cindex dark corner, multiline records
+However, there is an important difference between @samp{RS = ""} and
+@samp{RS = "\n\n+"}. In the first case, leading newlines in the input
+@value{DF} are ignored, and if a file ends without extra blank lines
+after the last record, the final newline is removed from the record.
+In the second case, this special processing is not done.
+@value{DARKCORNER}
+
+@cindex field separator, in multiline records
+@cindex @code{FS}, in multiline records
+Now that the input is separated into records, the second step is to
+separate the fields in the records.  One way to do this is to divide each
+of the lines into fields in the normal manner.  This happens by default
+as the result of a special feature.  When @code{RS} is set to the empty
+string @emph{and} @code{FS} is set to a single character,
+the newline character @emph{always} acts as a field separator.
+This is in addition to whatever field separations result from
+@code{FS}.
+
+@quotation NOTE
+When @code{FS} is the null string (@code{""})
+or a regexp, this special feature of @code{RS} does not apply.
+It does apply to the default field separator of a single space:
+@samp{FS = @w{" "}}.
+
+Note that language in the POSIX specification implies that
+this special feature should apply when @code{FS} is a regexp.
+However, Unix @command{awk} has never behaved that way, nor has
+@command{gawk}. This is essentially a bug in POSIX.
+@c Noted as of 4/2019; working to get the standard fixed.
+@end quotation
+
+The original motivation for this special exception was probably to provide
+useful behavior in the default case (i.e., @code{FS} is equal
+to @w{@code{" "}}).  This feature can be a problem if you really don't
+want the newline character to separate fields, because there is no way to
+prevent it.  However, you can work around this by using the @code{split()}
+function to break up the record manually
+(@pxref{String Functions}).
+If you have a single-character field separator, you can work around
+the special feature in a different way, by making @code{FS} into a
+regexp for that single character.  For example, if the field
+separator is a percent character, instead of
+@samp{FS = "%"}, use @samp{FS = "[%]"}.
+
+Another way to separate fields is to
+put each field on a separate line: to do this, just set the
+variable @code{FS} to the string @code{"\n"}.
+(This single-character separator matches a single newline.)
+A practical example of a @value{DF} organized this way might be a mailing
+list, where blank lines separate the entries.  Consider a mailing
+list in a file named @file{addresses}, which looks like this:
+
+@example
+Jane Doe
+123 Main Street
+Anywhere, SE 12345-6789
+
+John Smith
+456 Tree-lined Avenue
+Smallville, MW 98765-4321
+@dots{}
+@end example
+
+@noindent
+A simple program to process this file is as follows:
+
+@example
+# addrs.awk --- simple mailing list program
+
+# Records are separated by blank lines.
+# Each line is one field.
+BEGIN @{ RS = "" ; FS = "\n" @}
+
+@{
+      print "Name is:", $1
+      print "Address is:", $2
+      print "City and State are:", $3
+      print ""
+@}
+@end example
+
+Running the program produces the following output:
+
+@example
+$ @kbd{awk -f addrs.awk addresses}
+@print{} Name is: Jane Doe
+@print{} Address is: 123 Main Street
+@print{} City and State are: Anywhere, SE 12345-6789
+@print{}
+@print{} Name is: John Smith
+@print{} Address is: 456 Tree-lined Avenue
+@print{} City and State are: Smallville, MW 98765-4321
+@print{}
+@dots{}
+@end example
+
+@xref{Labels Program} for a more realistic program dealing with
+address lists.  The following list summarizes how records are split,
+based on the value of
+@ifinfo
+@code{RS}.
+(@samp{==} means ``is equal to.'')
+@end ifinfo
+@ifnotinfo
+@code{RS}:
+@end ifnotinfo
+
+@table @code
+@item RS == "\n"
+Records are separated by the newline character (@samp{\n}).  In effect,
+every line in the @value{DF} is a separate record, including blank lines.
+This is the default.
+
+@item RS == @var{any single character}
+Records are separated by each occurrence of the character.  Multiple
+successive occurrences delimit empty records.
+
+@item RS == ""
+Records are separated by runs of blank lines.
+When @code{FS} is a single character, then
+the newline character
+always serves as a field separator, in addition to whatever value
+@code{FS} may have. Leading and trailing newlines in a file are ignored.
+
+@item RS == @var{regexp}
+Records are separated by occurrences of characters that match @var{regexp}.
+Leading and trailing matches of @var{regexp} delimit empty records.
+(This is a @command{gawk} extension; it is not specified by the
+POSIX standard.)
+@end table
+
+@cindex @command{gawk}, @code{RT} variable in
+@cindex @code{RT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{RS}/@code{RT} variables
+If not in compatibility mode (@pxref{Options}), @command{gawk} sets
+@code{RT} to the input text that matched the value specified by @code{RS}.
+But if the input file ended without any text that matches @code{RS},
+then @command{gawk} sets @code{RT} to the null string.
+
+@node Getline
+@section Explicit Input with @code{getline}
+
+@cindex @code{getline} command, explicit input with
+@cindex input, explicit
+So far we have been getting our input data from @command{awk}'s main
+input stream---either the standard input (usually your keyboard, sometimes
+the output from another program) or the
+files specified on the command line.  The @command{awk} language has a
+special built-in command called @code{getline} that
+can be used to read input under your explicit control.
+
+The @code{getline} command is used in several different ways and should
+@emph{not} be used by beginners.
+The examples that follow the explanation of the @code{getline} command
+include material that has not been covered yet.  Therefore, come back
+and study the @code{getline} command @emph{after} you have reviewed the
+rest of
+@ifinfo
+this @value{DOCUMENT}
+@end ifinfo
+@ifhtml
+this @value{DOCUMENT}
+@end ifhtml
+@ifnotinfo
+@ifnothtml
+Parts I and II
+@end ifnothtml
+@end ifnotinfo
+and have a good knowledge of how @command{awk} works.
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable, with @command{getline} command
+@cindex differences in @command{awk} and @command{gawk}, @code{getline} command
+@cindex @code{getline} command, return values
+@cindex @option{--sandbox} option, input redirection with @code{getline}
+
+The @code{getline} command returns 1 if it finds a record and 0 if
+it encounters the end of the file.  If there is some error in getting
+a record, such as a file that cannot be opened, then @code{getline}
+returns @minus{}1.  In this case, @command{gawk} sets the variable
+@code{ERRNO} to a string describing the error that occurred.
+
+If @code{ERRNO} indicates that the I/O operation may be
+retried, and @code{PROCINFO["@var{input}", "RETRY"]} is set,
+then @code{getline} returns @minus{}2
+instead of @minus{}1, and further calls to @code{getline}
+may be attempted.  @xref{Retrying Input} for further information about
+this feature.
+
+In the following examples, @var{command} stands for a string value that
+represents a shell command.
+
+@quotation NOTE
+When @option{--sandbox} is specified (@pxref{Options}),
+reading lines from files, pipes, and coprocesses is disabled.
+@end quotation
+
+@menu
+* Plain Getline::               Using @code{getline} with no arguments.
+* Getline/Variable::            Using @code{getline} into a variable.
+* Getline/File::                Using @code{getline} from a file.
+* Getline/Variable/File::       Using @code{getline} into a variable from a
+                                file.
+* Getline/Pipe::                Using @code{getline} from a pipe.
+* Getline/Variable/Pipe::       Using @code{getline} into a variable from a
+                                pipe.
+* Getline/Coprocess::           Using @code{getline} from a coprocess.
+* Getline/Variable/Coprocess::  Using @code{getline} into a variable from a
+                                coprocess.
+* Getline Notes::               Important things to know about @code{getline}.
+* Getline Summary::             Summary of @code{getline} Variants.
+@end menu
+
+@node Plain Getline
+@subsection Using @code{getline} with No Arguments
+
+The @code{getline} command can be used without arguments to read input
+from the current input file.  All it does in this case is read the next
+input record and split it up into fields.  This is useful if you've
+finished processing the current record, but want to do some special
+processing on the next record @emph{right now}.  For example:
+
+@c 6/2019: Thanks to Mark Krauze <daburashka@ya.ru> for suggested
+@c improvements (the inner while loop).
+@example
+# Remove text between /* and */, inclusive
+@{
+    while ((start = index($0, "/*")) != 0) @{
+        out = substr($0, 1, start - 1)  # leading part of the string
+        rest = substr($0, start + 2)    # ... */ ...    
+        while ((end = index(rest, "*/")) == 0) @{  # is */ in trailing part?
+            # get more text
+            if (getline <= 0) @{
+                print("unexpected EOF or error:", ERRNO) > "/dev/stderr"
+                exit
+            @}
+            # build up the line using string concatenation
+            rest = rest $0
+        @}
+        rest = substr(rest, end + 2)  # remove comment
+        # build up the output line using string concatenation
+        $0 = out rest
+    @}
+    print $0
+@}
+@end example
+
+This @command{awk} program deletes C-style comments (@samp{/* @dots{}
+*/}) from the input.
+It uses a number of features we haven't covered yet, including
+string concatenation
+(@pxref{Concatenation})
+and the @code{index()} and @code{substr()} built-in
+functions
+(@pxref{String Functions}).
+By replacing the @samp{print $0} with other
+statements, you could perform more complicated processing on the
+decommented input, such as searching for matches of a regular
+expression.
+
+Here is some sample input:
+
+@example
+mon/*comment*/key
+rab/*commen
+t*/bit
+horse /*comment*/more text
+part 1 /*comment*/part 2 /*comment*/part 3
+no comment
+@end example
+
+When run, the output is:
+
+@example
+$ @kbd{awk -f strip_comments.awk example_text}
+@print{} monkey
+@print{} rabbit
+@print{} horse more text
+@print{} part 1 part 2 part 3
+@print{} no comment
+@end example
+
+This form of the @code{getline} command sets @code{NF},
+@code{NR}, @code{FNR}, @code{RT}, and the value of @code{$0}.
+
+@quotation NOTE
+The new value of @code{$0} is used to test
+the patterns of any subsequent rules.  The original value
+of @code{$0} that triggered the rule that executed @code{getline}
+is lost.
+By contrast, the @code{next} statement reads a new record
+but immediately begins processing it normally, starting with the first
+rule in the program.  @xref{Next Statement}.
+@end quotation
+
+@node Getline/Variable
+@subsection Using @code{getline} into a Variable
+@cindex @code{getline} into a variable
+@cindex variables, @code{getline} command into@comma{} using
+
+You can use @samp{getline @var{var}} to read the next record from
+@command{awk}'s input into the variable @var{var}.  No other processing is
+done.
+For example, suppose the next line is a comment or a special string,
+and you want to read it without triggering
+any rules.  This form of @code{getline} allows you to read that line
+and store it in a variable so that the main
+read-a-line-and-check-each-rule loop of @command{awk} never sees it.
+The following example swaps every two lines of input:
+
+@example
+@group
+@{
+     if ((getline tmp) > 0) @{
+          print tmp
+          print $0
+     @} else
+          print $0
+@}
+@end group
+@end example
+
+@noindent
+It takes the following list:
+
+@example
+wan
+tew
+free
+phore
+@end example
+
+@noindent
+and produces these results:
+
+@example
+tew
+wan
+phore
+free
+@end example
+
+The @code{getline} command used in this way sets only the variables
+@code{NR}, @code{FNR}, and @code{RT} (and, of course, @var{var}).
+The record is not
+split into fields, so the values of the fields (including @code{$0}) and
+the value of @code{NF} do not change.
+
+@node Getline/File
+@subsection Using @code{getline} from a File
+
+@cindex @code{getline} from a file
+@cindex input redirection
+@cindex redirection of input
+@cindex @code{<} (left angle bracket), @code{<} operator (I/O)
+@cindex left angle bracket (@code{<}), @code{<} operator (I/O)
+@cindex operators, input/output
+Use @samp{getline < @var{file}} to read the next record from @var{file}.
+Here, @var{file} is a string-valued expression that
+specifies the @value{FN}.  @samp{< @var{file}} is called a @dfn{redirection}
+because it directs input to come from a different place.
+For example, the following
+program reads its input record from the file @file{secondary.input} when it
+encounters a first field with a value equal to 10 in the current input
+file:
+
+@example
+@{
+    if ($1 == 10) @{
+         getline < "secondary.input"
+         print
+    @} else
+         print
+@}
+@end example
+
+Because the main input stream is not used, the values of @code{NR} and
+@code{FNR} are not changed. However, the record it reads is split into fields in
+the normal manner, so the values of @code{$0} and the other fields are
+changed, resulting in a new value of @code{NF}.
+@code{RT} is also set.
+
+@cindex POSIX @command{awk}, @code{<} operator and
+@c Thanks to Paul Eggert for initial wording here
+According to POSIX, @samp{getline < @var{expression}} is ambiguous if
+@var{expression} contains unparenthesized operators other than
+@samp{$}; for example, @samp{getline < dir "/" file} is ambiguous
+because the concatenation operator (not discussed yet; @pxref{Concatenation})
+is not parenthesized.  You should write it as @samp{getline < (dir "/" file)} if
+you want your program to be portable to all @command{awk} implementations.
+
+@node Getline/Variable/File
+@subsection Using @code{getline} into a Variable from a File
+@cindex variables, @code{getline} command into@comma{} using
+
+Use @samp{getline @var{var} < @var{file}} to read input
+from the file
+@var{file}, and put it in the variable @var{var}.  As earlier, @var{file}
+is a string-valued expression that specifies the file from which to read.
+
+In this version of @code{getline}, none of the predefined variables are
+changed and the record is not split into fields.  The only variable
+changed is @var{var}.@footnote{This is not quite true. @code{RT} could
+be changed if @code{RS} is a regular expression.}
+For example, the following program copies all the input files to the
+output, except for records that say @w{@samp{@@include @var{filename}}}.
+Such a record is replaced by the contents of the file
+@var{filename}:
+
+@example
+@{
+     if (NF == 2 && $1 == "@@include") @{
+          while ((getline line < $2) > 0)
+               print line
+          close($2)
+     @} else
+          print
+@}
+@end example
+
+Note here how the name of the extra input file is not built into
+the program; it is taken directly from the data, specifically from the second field on
+the @code{@@include} line.
+
+The @code{close()} function is called to ensure that if two identical
+@code{@@include} lines appear in the input, the entire specified file is
+included twice.
+@xref{Close Files And Pipes}.
+
+One deficiency of this program is that it does not process nested
+@code{@@include} statements
+(i.e., @code{@@include} statements in included files)
+the way a true macro preprocessor would.
+@xref{Igawk Program} for a program
+that does handle nested @code{@@include} statements.
+
+@node Getline/Pipe
+@subsection Using @code{getline} from a Pipe
+
+@c From private email, dated October 2, 1988. Used by permission, March 2013.
+@cindex Kernighan, Brian
+@quotation
+@i{Omniscience has much to recommend it.
+Failing that, attention to details would be useful.}
+@author Brian Kernighan
+@end quotation
+
+@cindex @code{|} (vertical bar), @code{|} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|} operator (I/O)
+@cindex input pipeline
+@cindex pipe, input
+@cindex operators, input/output
+The output of a command can also be piped into @code{getline}, using
+@samp{@var{command} | getline}.  In
+this case, the string @var{command} is run as a shell command and its output
+is piped into @command{awk} to be used as input.  This form of @code{getline}
+reads one record at a time from the pipe.
+For example, the following program copies its input to its output, except for
+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
+@group
+@{
+     if ($1 == "@@execute") @{
+          tmp = substr($0, 10)        # Remove "@@execute"
+          while ((tmp | getline) > 0)
+               print
+          close(tmp)
+     @} else
+          print
+@}
+@end group
+@end example
+
+@noindent
+The @code{close()} function is called to ensure that if two identical
+@samp{@@execute} lines appear in the input, the command is run for
+each one.
+@ifnottex
+@ifnotdocbook
+@xref{Close Files And Pipes}.
+@end ifnotdocbook
+@end ifnottex
+@c This example is unrealistic, since you could just use system
+Given the input:
+
+@example
+foo
+bar
+baz
+@@execute who
+bletch
+@end example
+
+@noindent
+the program might produce:
+
+@cindex Robbins, Bill
+@cindex Robbins, Miriam
+@cindex Robbins, Arnold
+@example
+foo
+bar
+baz
+arnold     ttyv0   Jul 13 14:22
+miriam     ttyp0   Jul 13 14:23     (murphy:0)
+bill       ttyp1   Jul 13 14:23     (murphy:0)
+bletch
+@end example
+
+@noindent
+Notice that this program ran the command @command{who} and printed the result.
+(If you try this program yourself, you will of course get different results,
+depending upon who is logged in on your system.)
+
+This variation of @code{getline} splits the record into fields, sets the
+value of @code{NF}, and recomputes the value of @code{$0}.  The values of
+@code{NR} and @code{FNR} are not changed.
+@code{RT} is set.
+
+@cindex POSIX @command{awk}, @code{|} I/O operator and
+@c Thanks to Paul Eggert for initial wording here
+According to POSIX, @samp{@var{expression} | getline} is ambiguous if
+@var{expression} contains unparenthesized operators other than
+@samp{$}---for example, @samp{@w{"echo "} "date" | getline} is ambiguous
+because the concatenation operator is not parenthesized.  You should
+write it as @samp{(@w{"echo "} "date") | getline} if you want your program
+to be portable to all @command{awk} implementations.
+
+@cindex Brian Kernighan's @command{awk}
+@cindex @command{mawk} utility
+@quotation NOTE
+Unfortunately, @command{gawk} has not been consistent in its treatment
+of a construct like @samp{@w{"echo "} "date" | getline}.
+Most versions, including the current version, treat it at as
+@samp{@w{("echo "} "date") | getline}.
+(This is also how BWK @command{awk} behaves.)
+Some versions instead treat it as
+@samp{@w{"echo "} ("date" | getline)}.
+(This is how @command{mawk} behaves.)
+In short, @emph{always} use explicit parentheses, and then you won't
+have to worry.
+@end quotation
+
+@node Getline/Variable/Pipe
+@subsection Using @code{getline} into a Variable from a Pipe
+@cindex variables, @code{getline} command into@comma{} using
+
+When you use @samp{@var{command} | getline @var{var}}, the
+output of @var{command} is sent through a pipe to
+@code{getline} and into the variable @var{var}.  For example, the
+following program reads the current date and time into the variable
+@code{current_time}, using the @command{date} utility, and then
+prints it:
+
+@example
+BEGIN @{
+     "date" | getline current_time
+     close("date")
+     print "Report printed on " current_time
+@}
+@end example
+
+In this version of @code{getline}, none of the predefined variables are
+changed and the record is not split into fields. However, @code{RT} is set.
+
+@ifinfo
+@c Thanks to Paul Eggert for initial wording here
+According to POSIX, @samp{@var{expression} | getline @var{var}} is ambiguous if
+@var{expression} contains unparenthesized operators other than
+@samp{$}; for example, @samp{@w{"echo "} "date" | getline @var{var}} is ambiguous
+because the concatenation operator is not parenthesized. You should
+write it as @samp{(@w{"echo "} "date") | getline @var{var}} if you want your
+program to be portable to other @command{awk} implementations.
+@end ifinfo
+
+@node Getline/Coprocess
+@subsection Using @code{getline} from a Coprocess
+@cindex coprocesses, @code{getline} from
+@cindex @code{getline} command, coprocesses@comma{} using from
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|&} operator (I/O)
+@cindex operators, input/output
+@cindex differences in @command{awk} and @command{gawk}, input/output operators
+
+Reading input into @code{getline} from a pipe is a one-way operation.
+The command that is started with @samp{@var{command} | getline} only
+sends data @emph{to} your @command{awk} program.
+
+On occasion, you might want to send data to another program
+for processing and then read the results back.
+@command{gawk} allows you to start a @dfn{coprocess}, with which two-way
+communications are possible.  This is done with the @samp{|&}
+operator.
+Typically, you write data to the coprocess first and then
+read the results back, as shown in the following:
+
+@example
+print "@var{some query}" |& "db_server"
+"db_server" |& getline
+@end example
+
+@noindent
+which sends a query to @command{db_server} and then reads the results.
+
+The values of @code{NR} and
+@code{FNR} are not changed,
+because the main input stream is not used.
+However, the record is split into fields in
+the normal manner, thus changing the values of @code{$0}, of the other fields,
+and of @code{NF} and @code{RT}.
+
+Coprocesses are an advanced feature. They are discussed here only because
+this is the @value{SECTION} on @code{getline}.
+@xref{Two-way I/O},
+where coprocesses are discussed in more detail.
+
+@node Getline/Variable/Coprocess
+@subsection Using @code{getline} into a Variable from a Coprocess
+@cindex variables, @code{getline} command into@comma{} using
+
+When you use @samp{@var{command} |& getline @var{var}}, the output from
+the coprocess @var{command} is sent through a two-way pipe to @code{getline}
+and into the variable @var{var}.
+
+In this version of @code{getline}, none of the predefined variables are
+changed and the record is not split into fields.  The only variable
+changed is @var{var}.
+However, @code{RT} is set.
+
+@ifinfo
+Coprocesses are an advanced feature. They are discussed here only because
+this is the @value{SECTION} on @code{getline}.
+@xref{Two-way I/O},
+where coprocesses are discussed in more detail.
+@end ifinfo
+
+@node Getline Notes
+@subsection Points to Remember About @code{getline}
+Here are some miscellaneous points about @code{getline} that
+you should bear in mind:
+
+@itemize @value{BULLET}
+@item
+When @code{getline} changes the value of @code{$0} and @code{NF},
+@command{awk} does @emph{not} automatically jump to the start of the
+program and start testing the new record against every pattern.
+However, the new record is tested against any subsequent rules.
+
+@cindex differences in @command{awk} and @command{gawk}, implementation limitations
+@cindex implementation issues, @command{gawk}, limits
+@cindex @command{awk}, implementations, limits
+@cindex @command{gawk}, implementation issues, limits
+@item
+Some very old @command{awk} implementations limit the number of pipelines that an @command{awk}
+program may have open to just one.  In @command{gawk}, there is no such limit.
+You can open as many pipelines (and coprocesses) as the underlying operating
+system permits.
+
+@cindex side effects, @code{FILENAME} variable
+@cindex @code{FILENAME} variable, @code{getline}@comma{} setting with
+@cindex dark corner, @code{FILENAME} variable
+@cindex @code{getline} command, @code{FILENAME} variable and
+@cindex @code{BEGIN} pattern, @code{getline} and
+@item
+An interesting side effect occurs if you use @code{getline} without a
+redirection inside a @code{BEGIN} rule. Because an unredirected @code{getline}
+reads from the command-line @value{DF}s, the first @code{getline} command
+causes @command{awk} to set the value of @code{FILENAME}. Normally,
+@code{FILENAME} does not have a value inside @code{BEGIN} rules, because you
+have not yet started to process the command-line @value{DF}s.
+@value{DARKCORNER}
+(See @ref{BEGIN/END};
+also @pxref{Auto-set}.)
+
+@item
+Using @code{FILENAME} with @code{getline}
+(@samp{getline < FILENAME})
+is likely to be a source of
+confusion.  @command{awk} opens a separate input stream from the
+current input file.  However, by not using a variable, @code{$0}
+and @code{NF} are still updated.  If you're doing this, it's
+probably by accident, and you should reconsider what it is you're
+trying to accomplish.
+
+@item
+@ifdocbook
+The next @value{SECTION}
+@end ifdocbook
+@ifnotdocbook
+@ref{Getline Summary},
+@end ifnotdocbook
+presents a table summarizing the
+@code{getline} variants and which variables they can affect.
+It is worth noting that those variants that do not use redirection
+can cause @code{FILENAME} to be updated if they cause
+@command{awk} to start reading a new input file.
+
+@item
+@cindex Moore, Duncan
+If the variable being assigned is an expression with side effects,
+different versions of @command{awk} behave differently upon encountering
+end-of-file.  Some versions don't evaluate the expression; many versions
+(including @command{gawk}) do.  Here is an example, courtesy of Duncan Moore:
+
+@ignore
+Date: Sun, 01 Apr 2012 11:49:33 +0100
+From: Duncan Moore <duncan.moore@@gmx.com>
+@end ignore
+
+@example
+BEGIN @{
+    system("echo 1 > f")
+    while ((getline a[++c] < "f") > 0) @{ @}
+    print c
+@}
+@end example
+
+@noindent
+Here, the side effect is the @samp{++c}.  Is @code{c} incremented if
+end-of-file is encountered before the element in @code{a} is assigned?
+
+@command{gawk} treats @code{getline} like a function call, and evaluates
+the expression @samp{a[++c]} before attempting to read from @file{f}.
+However, some versions of @command{awk} only evaluate the expression once they
+know that there is a string value to be assigned.
+@end itemize
+
+@node Getline Summary
+@subsection Summary of @code{getline} Variants
+@cindex @code{getline} command, variants
+
+@ref{table-getline-variants}
+summarizes the eight variants of @code{getline},
+listing which predefined variables are set by each one,
+and whether the variant is standard or a @command{gawk} extension.
+Note: for each variant, @command{gawk} sets the @code{RT} predefined variable.
+
+@float Table,table-getline-variants
+@caption{@code{getline} variants and what they set}
+@multitable @columnfractions .33 .38 .27
+@headitem Variant @tab Effect @tab @command{awk} / @command{gawk}
+@item @code{getline} @tab Sets @code{$0}, @code{NF}, @code{FNR}, @code{NR}, and @code{RT} @tab @command{awk}
+@item @code{getline} @var{var} @tab Sets @var{var}, @code{FNR}, @code{NR}, and @code{RT} @tab @command{awk}
+@item @code{getline <} @var{file} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab @command{awk}
+@item @code{getline @var{var} < @var{file}} @tab Sets @var{var} and @code{RT} @tab @command{awk}
+@item @var{command} @code{| getline} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab @command{awk}
+@item @var{command} @code{| getline} @var{var} @tab Sets @var{var} and @code{RT} @tab @command{awk}
+@item @var{command} @code{|& getline} @tab Sets @code{$0}, @code{NF}, and @code{RT} @tab @command{gawk}
+@item @var{command} @code{|& getline} @var{var} @tab Sets @var{var} and @code{RT} @tab @command{gawk}
+@end multitable
+@end float
+
+@node Read Timeout
+@section Reading Input with a Timeout
+@cindex timeout, reading input
+
+@cindex differences in @command{awk} and @command{gawk}, read timeouts
+This @value{SECTION} describes a feature that is specific to @command{gawk}.
+
+You may specify a timeout in milliseconds for reading input from the keyboard,
+a pipe, or two-way communication, including TCP/IP sockets. This can be done
+on a per-input, per-command, or per-connection basis, by setting a special
+element in the @code{PROCINFO} array (@pxref{Auto-set}):
+
+@example
+PROCINFO["input_name", "READ_TIMEOUT"] = @var{timeout in milliseconds}
+@end example
+
+When set, this causes @command{gawk} to time out and return failure
+if no data is available to read within the specified timeout period.
+For example, a TCP client can decide to give up on receiving
+any response from the server after a certain amount of time:
+
+@example
+@group
+Service = "/inet/tcp/0/localhost/daytime"
+PROCINFO[Service, "READ_TIMEOUT"] = 100
+if ((Service |& getline) > 0)
+    print $0
+else if (ERRNO != "")
+    print ERRNO
+@end group
+@end example
+
+Here is how to read interactively from the user@footnote{This assumes
+that standard input is the keyboard.} without waiting
+for more than five seconds:
+
+@example
+PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 5000
+while ((getline < "/dev/stdin") > 0)
+    print $0
+@end example
+
+@command{gawk} terminates the read operation if input does not
+arrive after waiting for the timeout period, returns failure,
+and sets @code{ERRNO} to an appropriate string value.
+A negative or zero value for the timeout is the same as specifying
+no timeout at all.
+
+A timeout can also be set for reading from the keyboard in the implicit
+loop that reads input records and matches them against patterns,
+like so:
+
+@example
+$ @kbd{gawk 'BEGIN @{ PROCINFO["-", "READ_TIMEOUT"] = 5000 @}}
+> @kbd{@{ print "You entered: " $0 @}'}
+@kbd{gawk}
+@print{} You entered: gawk
+@end example
+
+In this case, failure to respond within five seconds results in the following
+error message:
+
+@example
+@error{} gawk: cmd. line:2: (FILENAME=- FNR=1) fatal: error reading input file `-': Connection timed out
+@end example
+
+The timeout can be set or changed at any time, and will take effect on the
+next attempt to read from the input device. In the following example,
+we start with a timeout value of one second, and progressively
+reduce it by one-tenth of a second until we wait indefinitely
+for the input to arrive:
+
+@example
+PROCINFO[Service, "READ_TIMEOUT"] = 1000
+while ((Service |& getline) > 0) @{
+    print $0
+    PROCINFO[Service, "READ_TIMEOUT"] -= 100
+@}
+@end example
+
+@quotation NOTE
+You should not assume that the read operation will block
+exactly after the tenth record has been printed. It is possible that
+@command{gawk} will read and buffer more than one record's
+worth of data the first time. Because of this, changing the value
+of timeout like in the preceding example is not very useful.
+@end quotation
+
+If the @code{PROCINFO} element is not present and the
+@env{GAWK_READ_TIMEOUT} environment variable exists,
+@command{gawk} uses its value to initialize the timeout value.
+The exclusive use of the environment variable to specify timeout
+has the disadvantage of not being able to control it
+on a per-command or per-connection basis.
+
+@command{gawk} considers a timeout event to be an error even though
+the attempt to read from the underlying device may
+succeed in a later attempt. This is a limitation, and it also
+means that you cannot use this to multiplex input from
+two or more sources.  @xref{Retrying Input} for a way to enable 
+later I/O attempts to succeed.
+
+Assigning a timeout value prevents read operations from
+blocking indefinitely. But bear in mind that there are other ways
+@command{gawk} can stall waiting for an input device to be ready.
+A network client can sometimes take a long time to establish
+a connection before it can start reading any data,
+or the attempt to open a FIFO special file for reading can block
+indefinitely until some other process opens it for writing.
+
+@node Retrying Input
+@section Retrying Reads After Certain Input Errors
+@cindex retrying input
+
+@cindex differences in @command{awk} and @command{gawk}, retrying input
+This @value{SECTION} describes a feature that is specific to @command{gawk}.
+
+When @command{gawk} encounters an error while reading input, by
+default @code{getline} returns @minus{}1, and subsequent attempts to
+read from that file result in an end-of-file indication.  However, you
+may optionally instruct @command{gawk} to allow I/O to be retried when
+certain errors are encountered by setting a special element in
+the @code{PROCINFO} array (@pxref{Auto-set}):
+
+@example
+PROCINFO["@var{input_name}", "RETRY"] = 1
+@end example
+
+When this element exists, @command{gawk} checks the value of the system
+(C language)
+@code{errno} variable when an I/O error occurs.  If @code{errno} indicates
+a subsequent I/O attempt may succeed, @code{getline} instead returns
+@minus{}2 and
+further calls to @code{getline} may succeed.  This applies to the @code{errno}
+values @code{EAGAIN}, @code{EWOULDBLOCK}, @code{EINTR}, or @code{ETIMEDOUT}.
+
+This feature is useful in conjunction with
+@code{PROCINFO["@var{input_name}", "READ_TIMEOUT"]} or situations where a file
+descriptor has been configured to behave in a non-blocking fashion.
+
+@node Command-line directories
+@section Directories on the Command Line
+@cindex differences in @command{awk} and @command{gawk}, command-line directories
+@cindex directories, command-line
+@cindex command line, directories on
+
+According to the POSIX standard, files named on the @command{awk}
+command line must be text files; it is a fatal error if they are not.
+Most versions of @command{awk} treat a directory on the command line as
+a fatal error.
+
+By default, @command{gawk} produces a warning for a directory on the
+command line, but otherwise ignores it.  This makes it easier to use
+shell wildcards with your @command{awk} program:
+
+@example
+$ @kbd{gawk -f whizprog.awk *}        @ii{Directories could kill this program}
+@end example
+
+If either of the @option{--posix}
+or @option{--traditional} options is given, then @command{gawk} reverts
+to treating a directory on the command line as a fatal error.
+
+@xref{Extension Sample Readdir} for a way to treat directories
+as usable data from an @command{awk} program.
+
+@node Input Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Input is split into records based on the value of @code{RS}.
+The possibilities are as follows:
+
+@multitable @columnfractions .25 .35 .40
+@headitem Value of @code{RS} @tab Records are split on @dots{} @tab @command{awk} / @command{gawk}
+@item Any single character @tab That character @tab @command{awk}
+@item The empty string (@code{""}) @tab Runs of two or more newlines @tab @command{awk}
+@item A regexp @tab Text that matches the regexp @tab @command{gawk}
+@end multitable
+
+@item
+@code{FNR} indicates how many records have been read from the current input file;
+@code{NR} indicates how many records have been read in total.
+
+@item
+@command{gawk} sets @code{RT} to the text matched by @code{RS}.
+
+@item
+After splitting the input into records, @command{awk} further splits
+the records into individual fields, named @code{$1}, @code{$2}, and so
+on. @code{$0} is the whole record, and @code{NF} indicates how many
+fields there are.  The default way to split fields is between whitespace
+characters.
+
+@item
+Fields may be referenced using a variable, as in @code{$NF}.  Fields
+may also be assigned values, which causes the value of @code{$0} to be
+recomputed when it is later referenced. Assigning to a field with a number
+greater than @code{NF} creates the field and rebuilds the record, using
+@code{OFS} to separate the fields.  Incrementing @code{NF} does the same
+thing. Decrementing @code{NF} throws away fields and rebuilds the record.
+
+@item
+Field splitting is more complicated than record splitting:
+
+@multitable @columnfractions .40 .40 .20
+@headitem Field separator value @tab Fields are split @dots{} @tab @command{awk} / @command{gawk}
+@item @code{FS == " "} @tab On runs of whitespace @tab @command{awk}
+@item @code{FS == @var{any single character}} @tab On that character @tab @command{awk}
+@item @code{FS == @var{regexp}} @tab On text matching the regexp @tab @command{awk}
+@item @code{FS == ""}  @tab Such that each individual character is a separate field @tab @command{gawk}
+@item @code{FIELDWIDTHS == @var{list of columns}} @tab Based on character position @tab @command{gawk}
+@item @code{FPAT == @var{regexp}} @tab On the text surrounding text matching the regexp @tab @command{gawk}
+@end multitable
+
+@item
+Using @samp{FS = "\n"} causes the entire record to be a single field
+(assuming that newlines separate records).
+
+@item
+@code{FS} may be set from the command line using the @option{-F} option.
+This can also be done using command-line variable assignment.
+
+@item
+Use @code{PROCINFO["FS"]} to see how fields are being split.
+
+@item
+Use @code{getline} in its various forms to read additional records
+from the default input stream, from a file, or from a pipe or coprocess.
+
+@item
+Use @code{PROCINFO[@var{file}, "READ_TIMEOUT"]} to cause reads to time out
+for @var{file}.
+
+@item
+Directories on the command line are fatal for standard @command{awk};
+@command{gawk} ignores them if not in POSIX mode.
+
+@end itemize
+
+@c EXCLUDE START
+@node Input Exercises
+@section Exercises
+
+@enumerate
+@item
+Using the @code{FIELDWIDTHS} variable (@pxref{Constant Size}),
+write a program to read election data, where each record represents
+one voter's votes.  Come up with a way to define which columns are
+associated with each ballot item, and print the total votes,
+including abstentions, for each item.
+
+@item
+@ref{Plain Getline}, presented a program to remove C-style
+comments (@samp{/* @dots{} */}) from the input.  That program
+does not work if one comment ends on one line and another one
+starts later on the same line.
+That can be fixed by making one simple change. What is it?
+
+@end enumerate
+@c EXCLUDE END
+
+@node Printing
+@chapter Printing Output
+
+@cindex printing
+@cindex output, printing, See printing
+One of the most common programming actions is to @dfn{print}, or output,
+some or all of the input.  Use the @code{print} statement
+for simple output, and the @code{printf} statement
+for fancier formatting.
+The @code{print} statement is not limited when
+computing @emph{which} values to print. However, with two exceptions,
+you cannot specify @emph{how} to print them---how many
+columns, whether to use exponential notation or not, and so on.
+(For the exceptions, @pxref{Output Separators} and
+@ref{OFMT}.)
+For printing with specifications, you need the @code{printf} statement
+(@pxref{Printf}).
+
+@cindex @code{print} statement
+@cindex @code{printf} statement
+Besides basic and formatted printing, this @value{CHAPTER}
+also covers I/O redirections to files and pipes, introduces
+the special @value{FN}s that @command{gawk} processes internally,
+and discusses the @code{close()} built-in function.
+
+@menu
+* Print::                       The @code{print} statement.
+* Print Examples::              Simple examples of @code{print} statements.
+* Output Separators::           The output separators and how to change them.
+* OFMT::                        Controlling Numeric Output With @code{print}.
+* Printf::                      The @code{printf} statement.
+* Redirection::                 How to redirect output to multiple files and
+                                pipes.
+* Special FD::                  Special files for I/O.
+* Special Files::               File name interpretation in @command{gawk}.
+                                @command{gawk} allows access to inherited file
+                                descriptors.
+* Close Files And Pipes::       Closing Input and Output Files and Pipes.
+* Nonfatal::                    Enabling Nonfatal Output.
+* Output Summary::              Output summary.
+* Output Exercises::            Exercises.
+@end menu
+
+@node Print
+@section The @code{print} Statement
+
+Use the @code{print} statement to produce output with simple, standardized
+formatting.  You specify only the strings or numbers to print, in a
+list separated by commas.  They are output, separated by single spaces,
+followed by a newline.  The statement looks like this:
+
+@example
+print @var{item1}, @var{item2}, @dots{}
+@end example
+
+@noindent
+The entire list of items may be optionally enclosed in parentheses.  The
+parentheses are necessary if any of the item expressions uses the @samp{>}
+relational operator; otherwise it could be confused with an output redirection
+(@pxref{Redirection}).
+
+The items to print can be constant strings or numbers, fields of the
+current record (such as @code{$1}), variables, or any @command{awk}
+expression.  Numeric values are converted to strings and then printed.
+
+@cindex records, printing
+@cindex lines, blank, printing
+@cindex text, printing
+The simple statement @samp{print} with no items is equivalent to
+@samp{print $0}: it prints the entire current record.  To print a blank
+line, use @samp{print ""}.
+To print a fixed piece of text, use a string constant, such as
+@w{@code{"Don't Panic"}}, as one item.  If you forget to use the
+double-quote characters, your text is taken as an @command{awk}
+expression, and you will probably get an error.  Keep in mind that a
+space is printed between any two items.
+
+Note that the @code{print} statement is a statement and not an
+expression---you can't use it in the pattern part of a
+pattern--action statement, for example.
+
+@node Print Examples
+@section @code{print} Statement Examples
+
+Each @code{print} statement makes at least one line of output.  However, it
+isn't limited to only one line.  If an item value is a string containing a
+newline, the newline is output along with the rest of the string.  A
+single @code{print} statement can make any number of lines this way.
+
+@cindex newlines, printing
+The following is an example of printing a string that contains embedded
+@ifinfo
+newlines
+(the @samp{\n} is an escape sequence, used to represent the newline
+character; @pxref{Escape Sequences}):
+@end ifinfo
+@ifhtml
+newlines
+(the @samp{\n} is an escape sequence, used to represent the newline
+character; @pxref{Escape Sequences}):
+@end ifhtml
+@ifnotinfo
+@ifnothtml
+newlines:
+@end ifnothtml
+@end ifnotinfo
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{ print "line one\nline two\nline three" @}'}
+@print{} line one
+@print{} line two
+@print{} line three
+@end group
+@end example
+
+@cindex fields, printing
+The next example, which is run on the @file{inventory-shipped} file,
+prints the first two fields of each input record, with a space between
+them:
+
+@example
+$ @kbd{awk '@{ print $1, $2 @}' inventory-shipped}
+@print{} Jan 13
+@print{} Feb 15
+@print{} Mar 15
+@dots{}
+@end example
+
+@cindex @code{print} statement, commas, omitting
+@cindex troubleshooting, @code{print} statement@comma{} omitting commas
+A common mistake in using the @code{print} statement is to omit the comma
+between two items.  This often has the effect of making the items run
+together in the output, with no space.  The reason for this is that
+juxtaposing two string expressions in @command{awk} means to concatenate
+them.  Here is the same program, without the comma:
+
+@example
+$ @kbd{awk '@{ print $1 $2 @}' inventory-shipped}
+@print{} Jan13
+@print{} Feb15
+@print{} Mar15
+@dots{}
+@end example
+
+@cindex @code{BEGIN} pattern, headings@comma{} adding
+To someone unfamiliar with the @file{inventory-shipped} file, neither
+example's output makes much sense.  A heading line at the beginning
+would make it clearer.  Let's add some headings to our table of months
+(@code{$1}) and green crates shipped (@code{$2}).  We do this using
+a @code{BEGIN} rule (@pxref{BEGIN/END}) so that the headings are only
+printed once:
+
+@example
+awk 'BEGIN @{  print "Month Crates"
+              print "----- ------" @}
+           @{  print $1, $2 @}' inventory-shipped
+@end example
+
+@noindent
+When run, the program prints the following:
+
+@example
+Month Crates
+----- ------
+Jan 13
+Feb 15
+Mar 15
+@dots{}
+@end example
+
+@noindent
+The only problem, however, is that the headings and the table data
+don't line up!  We can fix this by printing some spaces between the
+two fields:
+
+@example
+@group
+awk 'BEGIN @{ print "Month Crates"
+             print "----- ------" @}
+           @{ print $1, "     ", $2 @}' inventory-shipped
+@end group
+@end example
+
+@cindex @code{printf} statement, columns@comma{} aligning
+@cindex columns, aligning
+Lining up columns this way can get pretty
+complicated when there are many columns to fix.  Counting spaces for two
+or three columns is simple, but any more than this can take up
+a lot of time. This is why the @code{printf} statement was
+created (@pxref{Printf});
+one of its specialties is lining up columns of data.
+
+@cindex line continuations, in @code{print} statement
+@cindex @code{print} statement, line continuations and
+@quotation NOTE
+You can continue either a @code{print} or
+@code{printf} statement simply by putting a newline after any comma
+(@pxref{Statements/Lines}).
+@end quotation
+
+@node Output Separators
+@section Output Separators
+
+@cindex @code{OFS} variable
+As mentioned previously, a @code{print} statement contains a list
+of items separated by commas.  In the output, the items are normally
+separated by single spaces.  However, this doesn't need to be the case;
+a single space is simply the default.  Any string of
+characters may be used as the @dfn{output field separator} by setting the
+predefined variable @code{OFS}.  The initial value of this variable
+is the string @w{@code{" "}} (i.e., a single space).
+
+The output from an entire @code{print} statement is called an @dfn{output
+record}.  Each @code{print} statement outputs one output record, and
+then outputs a string called the @dfn{output record separator} (or
+@code{ORS}).  The initial value of @code{ORS} is the string @code{"\n"}
+(i.e., a newline character).  Thus, each @code{print} statement normally
+makes a separate line.
+
+@cindex output, records
+@cindex output record separator, See @code{ORS} variable
+@cindex @code{ORS} variable
+@cindex @code{BEGIN} pattern, @code{OFS}/@code{ORS} variables, assigning values to
+In order to change how output fields and records are separated, assign
+new values to the variables @code{OFS} and @code{ORS}.  The usual
+place to do this is in the @code{BEGIN} rule
+(@pxref{BEGIN/END}), so
+that it happens before any input is processed.  It can also be done
+with assignments on the command line, before the names of the input
+files, or using the @option{-v} command-line option
+(@pxref{Options}).
+The following example prints the first and second fields of each input
+record, separated by a semicolon, with a blank line added after each
+newline:
+
+
+@example
+$ @kbd{awk 'BEGIN @{ OFS = ";"; ORS = "\n\n" @}}
+>            @kbd{@{ print $1, $2 @}' mail-list}
+@print{} Amelia;555-5553
+@print{}
+@print{} Anthony;555-3412
+@print{}
+@print{} Becky;555-7685
+@print{}
+@print{} Bill;555-1675
+@print{}
+@print{} Broderick;555-0542
+@print{}
+@print{} Camilla;555-2912
+@print{}
+@print{} Fabius;555-1234
+@print{}
+@print{} Julie;555-6699
+@print{}
+@print{} Martin;555-6480
+@print{}
+@print{} Samuel;555-3430
+@print{}
+@print{} Jean-Paul;555-2127
+@print{}
+@end example
+
+If the value of @code{ORS} does not contain a newline, the program's output
+runs together on a single line.
+
+@node OFMT
+@section Controlling Numeric Output with @code{print}
+@cindex numeric, output format
+@cindex formats@comma{} numeric output
+When printing numeric values with the @code{print} statement,
+@command{awk} internally converts each number to a string of characters
+and prints that string.  @command{awk} uses the @code{sprintf()} function
+to do this conversion
+(@pxref{String Functions}).
+For now, it suffices to say that the @code{sprintf()}
+function accepts a @dfn{format specification} that tells it how to format
+numbers (or strings), and that there are a number of different ways in which
+numbers can be formatted.  The different format specifications are discussed
+more fully in
+@ref{Control Letters}.
+
+@cindexawkfunc{sprintf}
+@cindex @code{OFMT} variable
+@cindex output, format specifier@comma{} @code{OFMT}
+The predefined variable @code{OFMT} contains the format specification
+that @code{print} uses with @code{sprintf()} when it wants to convert a
+number to a string for printing.
+The default value of @code{OFMT} is @code{"%.6g"}.
+The way @code{print} prints numbers can be changed
+by supplying a different format specification
+for the value of @code{OFMT}, as shown in the following example:
+
+@example
+$ @kbd{awk 'BEGIN @{}
+>   @kbd{OFMT = "%.0f"  # print numbers as integers (rounds)}
+>   @kbd{print 17.23, 17.54 @}'}
+@print{} 17 18
+@end example
+
+@noindent
+@cindex dark corner, @code{OFMT} variable
+@cindex POSIX @command{awk}, @code{OFMT} variable and
+@cindex @code{OFMT} variable, POSIX @command{awk} and
+According to the POSIX standard, @command{awk}'s behavior is undefined
+if @code{OFMT} contains anything but a floating-point conversion specification.
+@value{DARKCORNER}
+
+@node Printf
+@section Using @code{printf} Statements for Fancier Printing
+
+@cindex @code{printf} statement
+@cindex output, formatted
+@cindex formatting output
+For more precise control over the output format than what is
+provided by @code{print}, use @code{printf}.
+With @code{printf} you can
+specify the width to use for each item, as well as various
+formatting choices for numbers (such as what output base to use, whether to
+print an exponent, whether to print a sign, and how many digits to print
+after the decimal point).
+
+@menu
+* Basic Printf::                Syntax of the @code{printf} statement.
+* Control Letters::             Format-control letters.
+* Format Modifiers::            Format-specification modifiers.
+* Printf Examples::             Several examples.
+@end menu
+
+@node Basic Printf
+@subsection Introduction to the @code{printf} Statement
+
+@cindex @code{printf} statement, syntax of
+A simple @code{printf} statement looks like this:
+
+@example
+printf @var{format}, @var{item1}, @var{item2}, @dots{}
+@end example
+
+@noindent
+As for @code{print}, the entire list of arguments may optionally be
+enclosed in parentheses. Here too, the parentheses are necessary if any
+of the item expressions uses the @samp{>} relational operator; otherwise,
+it can be confused with an output redirection (@pxref{Redirection}).
+
+@cindex format specifiers
+The difference between @code{printf} and @code{print} is the @var{format}
+argument.  This is an expression whose value is taken as a string; it
+specifies how to output each of the other arguments.  It is called the
+@dfn{format string}.
+
+The format string is very similar to that in the ISO C library function
+@code{printf()}.  Most of @var{format} is text to output verbatim.
+Scattered among this text are @dfn{format specifiers}---one per item.
+Each format specifier says to output the next item in the argument list
+at that place in the format.
+
+The @code{printf} statement does not automatically append a newline
+to its output.  It outputs only what the format string specifies.
+So if a newline is needed, you must include one in the format string.
+The output separator variables @code{OFS} and @code{ORS} have no effect
+on @code{printf} statements. For example:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{}
+>    @kbd{ORS = "\nOUCH!\n"; OFS = "+"}
+>    @kbd{msg = "Don\47t Panic!"}
+>    @kbd{printf "%s\n", msg}
+> @kbd{@}'}
+@print{} Don't Panic!
+@end group
+@end example
+
+@noindent
+Here, neither the @samp{+} nor the @samp{OUCH!} appears in
+the output message.
+
+@node Control Letters
+@subsection Format-Control Letters
+@cindex @code{printf} statement, format-control characters
+@cindex format specifiers, @code{printf} statement
+
+A format specifier starts with the character @samp{%} and ends with
+a @dfn{format-control letter}---it tells the @code{printf} statement
+how to output one item.  The format-control letter specifies what @emph{kind}
+of value to print.  The rest of the format specifier is made up of
+optional @dfn{modifiers} that control @emph{how} to print the value, such as
+the field width.  Here is a list of the format-control letters:
+
+@c @asis for docbook to come out right
+@table @asis
+@item @code{%a}, @code{%A}
+A floating point number of the form
+[@code{-}]@code{0x@var{h}.@var{hhhh}p+-@var{dd}}
+(C99 hexadecimal floating point format).
+For @code{%A},
+uppercase letters are used instead of lowercase ones.
+
+@quotation NOTE
+The current POSIX standard requires support for @code{%a} and @code{%A} in
+@command{awk}. As far as we know, besides @command{gawk}, the only other
+version of @command{awk} that actually implements it is BWK @command{awk}.
+It's use is thus highly nonportable!
+
+Furthermore, these formats are not available on any system where the
+underlying C library @code{printf()} function does not support them. As
+of this writing, among current systems, only OpenVMS is known to not
+support them.
+@end quotation
+
+@item @code{%c}
+Print a number as a character; thus, @samp{printf "%c",
+65} outputs the letter @samp{A}. The output for a string value is
+the first character of the string.
+
+@cindex dark corner, format-control characters
+@cindex @command{gawk}, format-control characters
+@quotation NOTE
+The POSIX standard says the first character of a string is printed.
+In locales with multibyte characters, @command{gawk} attempts to
+convert the leading bytes of the string into a valid wide character
+and then to print the multibyte encoding of that character.
+Similarly, when printing a numeric value, @command{gawk} allows the
+value to be within the numeric range of values that can be held
+in a wide character.
+If the conversion to multibyte encoding fails, @command{gawk}
+uses the low eight bits of the value as the character to print.
+
+Other @command{awk} versions generally restrict themselves to printing
+the first byte of a string or to numeric values within the range of
+a single byte (0--255).
+@value{DARKCORNER}
+@end quotation
+
+
+@item @code{%d}, @code{%i}
+Print a decimal integer.
+The two control letters are equivalent.
+(The @samp{%i} specification is for compatibility with ISO C.)
+
+@item @code{%e}, @code{%E}
+Print a number in scientific (exponential) notation.
+For example:
+
+@example
+printf "%4.3e\n", 1950
+@end example
+
+@noindent
+prints @samp{1.950e+03}, with a total of four significant figures, three of
+which follow the decimal point.
+(The @samp{4.3} represents two modifiers,
+discussed in the next @value{SUBSECTION}.)
+@samp{%E} uses @samp{E} instead of @samp{e} in the output.
+
+@item @code{%f}
+Print a number in floating-point notation.
+For example:
+
+@example
+printf "%4.3f", 1950
+@end example
+
+@noindent
+prints @samp{1950.000}, with a minimum of four significant figures, three of
+which follow the decimal point.
+(The @samp{4.3} represents two modifiers,
+discussed in the next @value{SUBSECTION}.)
+
+On systems supporting IEEE 754 floating-point format, values
+representing negative
+infinity are formatted as
+@samp{-inf} or @samp{-infinity},
+and positive infinity as
+@samp{inf} or @samp{infinity}.
+The special ``not a number'' value formats as @samp{-nan} or @samp{nan}
+(@pxref{Math Definitions}).
+
+@item @code{%F}
+Like @samp{%f}, but the infinity and ``not a number'' values are spelled
+using uppercase letters.
+
+The @samp{%F} format is a POSIX extension to ISO C; not all systems
+support it.  On those that don't, @command{gawk} uses @samp{%f} instead.
+
+@item @code{%g}, @code{%G}
+Print a number in either scientific notation or in floating-point
+notation, whichever uses fewer characters; if the result is printed in
+scientific notation, @samp{%G} uses @samp{E} instead of @samp{e}.
+
+@item @code{%o}
+Print an unsigned octal integer
+(@pxref{Nondecimal-numbers}).
+
+@item @code{%s}
+Print a string.
+
+@item @code{%u}
+Print an unsigned decimal integer.
+(This format is of marginal use, because all numbers in @command{awk}
+are floating point; it is provided primarily for compatibility with C.)
+
+@item @code{%x}, @code{%X}
+Print an unsigned hexadecimal integer;
+@samp{%X} uses the letters @samp{A} through @samp{F}
+instead of @samp{a} through @samp{f}
+(@pxref{Nondecimal-numbers}).
+
+@item @code{%%}
+Print a single @samp{%}.
+This does not consume an
+argument and it ignores any modifiers.
+@end table
+
+@cindex dark corner, format-control characters
+@cindex @command{gawk}, format-control characters
+@quotation NOTE
+When using the integer format-control letters for values that are
+outside the range of the widest C integer type, @command{gawk} switches to
+the @samp{%g} format specifier. If @option{--lint} is provided on the
+command line (@pxref{Options}), @command{gawk}
+warns about this.  Other versions of @command{awk} may print invalid
+values or do something else entirely.
+@value{DARKCORNER}
+@end quotation
+
+@quotation NOTE
+The IEEE 754 standard for floating-point arithmetic allows for special
+values that represent ``infinity'' (positive and negative) and values
+that are ``not a number'' (NaN).
+
+Input and output of these values occurs as text strings. This is
+somewhat problematic for the @command{awk} language, which predates
+the IEEE standard.  Further details are provided in
+@ref{POSIX Floating Point Problems}; please see there.
+@end quotation
+
+@node Format Modifiers
+@subsection Modifiers for @code{printf} Formats
+
+@cindex @code{printf} statement, modifiers
+@cindex modifiers@comma{} in format specifiers
+A format specification can also include @dfn{modifiers} that can control
+how much of the item's value is printed, as well as how much space it gets.
+The modifiers come between the @samp{%} and the format-control letter.
+We use the bullet symbol ``@bullet{}'' in the following examples to
+represent
+spaces in the output. Here are the possible modifiers, in the order in
+which they may appear:
+
+@table @asis
+@cindex differences in @command{awk} and @command{gawk}, @code{print}/@code{printf} statements
+@cindex @code{printf} statement, positional specifiers
+@c the code{} does NOT start a secondary
+@cindex positional specifiers, @code{printf} statement
+@item @code{@var{N}$}
+An integer constant followed by a @samp{$} is a @dfn{positional specifier}.
+Normally, format specifications are applied to arguments in the order
+given in the format string.  With a positional specifier, the format
+specification is applied to a specific argument, instead of what
+would be the next argument in the list.  Positional specifiers begin
+counting with one. Thus:
+
+@example
+printf "%s %s\n", "don't", "panic"
+printf "%2$s %1$s\n", "panic", "don't"
+@end example
+
+@noindent
+prints the famous friendly message twice.
+
+At first glance, this feature doesn't seem to be of much use.
+It is in fact a @command{gawk} extension, intended for use in translating
+messages at runtime.
+@xref{Printf Ordering},
+which describes how and why to use positional specifiers.
+For now, we ignore them.
+
+@item @code{-} (Minus)
+The minus sign, used before the width modifier (see later on in
+this list),
+says to left-justify
+the argument within its specified width.  Normally, the argument
+is printed right-justified in the specified width.  Thus:
+
+@example
+printf "%-4s", "foo"
+@end example
+
+@noindent
+prints @samp{foo@bullet{}}.
+
+@item @var{space}
+For numeric conversions, prefix positive values with a space and
+negative values with a minus sign.
+
+@item @code{+}
+The plus sign, used before the width modifier (see later on in
+this list),
+says to always supply a sign for numeric conversions, even if the data
+to format is positive. The @samp{+} overrides the space modifier.
+
+@item @code{#}
+Use an ``alternative form'' for certain control letters.
+For @samp{%o}, supply a leading zero.
+For @samp{%x} and @samp{%X}, supply a leading @samp{0x} or @samp{0X} for
+a nonzero result.
+For @samp{%e}, @samp{%E}, @samp{%f}, and @samp{%F}, the result always
+contains a decimal point.
+For @samp{%g} and @samp{%G}, trailing zeros are not removed from the result.
+
+@item @code{0}
+A leading @samp{0} (zero) acts as a flag indicating that output should be
+padded with zeros instead of spaces.
+This applies only to the numeric output formats.
+This flag only has an effect when the field width is wider than the
+value to print.
+
+@item @code{'}
+A single quote or apostrophe character is a POSIX extension to ISO C.
+It indicates that the integer part of a floating-point value, or the
+entire part of an integer decimal value, should have a thousands-separator
+character in it.  This only works in locales that support such characters.
+For example:
+
+@example
+$ @kbd{cat thousands.awk}          @ii{Show source program}
+@print{} BEGIN @{ printf "%'d\n", 1234567 @}
+$ @kbd{LC_ALL=C gawk -f thousands.awk}
+@print{} 1234567                   @ii{Results in} "C" @ii{locale}
+$ @kbd{LC_ALL=en_US.UTF-8 gawk -f thousands.awk}
+@print{} 1,234,567                 @ii{Results in US English UTF locale}
+@end example
+
+@noindent
+For more information about locales and internationalization issues,
+see @ref{Locales}.
+
+@quotation NOTE
+The @samp{'} flag is a nice feature, but its use complicates things: it
+becomes difficult to use it in command-line programs.  For information
+on appropriate quoting tricks, see @ref{Quoting}.
+@end quotation
+
+@item @var{width}
+This is a number specifying the desired minimum width of a field.  Inserting any
+number between the @samp{%} sign and the format-control character forces the
+field to expand to this width.  The default way to do this is to
+pad with spaces on the left.  For example:
+
+@example
+printf "%4s", "foo"
+@end example
+
+@noindent
+prints @samp{@bullet{}foo}.
+
+The value of @var{width} is a minimum width, not a maximum.  If the item
+value requires more than @var{width} characters, it can be as wide as
+necessary.  Thus, the following:
+
+@example
+printf "%4s", "foobar"
+@end example
+
+@noindent
+prints @samp{foobar}.
+
+Preceding the @var{width} with a minus sign causes the output to be
+padded with spaces on the right, instead of on the left.
+
+@item @code{.@var{prec}}
+A period followed by an integer constant
+specifies the precision to use when printing.
+The meaning of the precision varies by control letter:
+
+@table @asis
+@item @code{%d}, @code{%i}, @code{%o}, @code{%u}, @code{%x}, @code{%X}
+Minimum number of digits to print.
+
+@item @code{%e}, @code{%E}, @code{%f}, @code{%F}
+Number of digits to the right of the decimal point.
+
+@item @code{%g}, @code{%G}
+Maximum number of significant digits.
+
+@item @code{%s}
+Maximum number of characters from the string that should print.
+@end table
+
+Thus, the following:
+
+@example
+printf "%.4s", "foobar"
+@end example
+
+@noindent
+prints @samp{foob}.
+@end table
+
+The C library @code{printf}'s dynamic @var{width} and @var{prec}
+capability (e.g., @code{"%*.*s"}) is supported.  Instead of
+supplying explicit @var{width} and/or @var{prec} values in the format
+string, they are passed in the argument list.  For example:
+
+@example
+w = 5
+p = 3
+s = "abcdefg"
+printf "%*.*s\n", w, p, s
+@end example
+
+@noindent
+is exactly equivalent to:
+
+@example
+s = "abcdefg"
+printf "%5.3s\n", s
+@end example
+
+@noindent
+Both programs output @samp{@w{@bullet{}@bullet{}abc}}.
+Earlier versions of @command{awk} did not support this capability.
+If you must use such a version, you may simulate this feature by using
+concatenation to build up the format string, like so:
+
+@example
+w = 5
+p = 3
+s = "abcdefg"
+printf "%" w "." p "s\n", s
+@end example
+
+@noindent
+This is not particularly easy to read, but it does work.
+
+@c @cindex lint checks
+@cindex troubleshooting, fatal errors, @code{printf} format strings
+@cindex POSIX @command{awk}, @code{printf} format strings and
+C programmers may be used to supplying additional modifiers (@samp{h},
+@samp{j}, @samp{l}, @samp{L}, @samp{t}, and @samp{z}) in @code{printf}
+format strings. These are not valid in @command{awk}.  Most @command{awk}
+implementations silently ignore them.  If @option{--lint} is provided
+on the command line (@pxref{Options}), @command{gawk} warns about their
+use. If @option{--posix} is supplied, their use is a fatal error.
+
+@node Printf Examples
+@subsection Examples Using @code{printf}
+
+The following simple example shows
+how to use @code{printf} to make an aligned table:
+
+@example
+awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list
+@end example
+
+@noindent
+This command
+prints the names of the people (@code{$1}) in the file
+@file{mail-list} as a string of 10 characters that are left-justified.  It also
+prints the phone numbers (@code{$2}) next on the line.  This
+produces an aligned two-column table of names and phone numbers,
+as shown here:
+
+@example
+$ @kbd{awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list}
+@print{} Amelia     555-5553
+@print{} Anthony    555-3412
+@print{} Becky      555-7685
+@print{} Bill       555-1675
+@print{} Broderick  555-0542
+@print{} Camilla    555-2912
+@print{} Fabius     555-1234
+@print{} Julie      555-6699
+@print{} Martin     555-6480
+@print{} Samuel     555-3430
+@print{} Jean-Paul  555-2127
+@end example
+
+In this case, the phone numbers had to be printed as strings because
+the numbers are separated by dashes.  Printing the phone numbers as
+numbers would have produced just the first three digits: @samp{555}.
+This would have been pretty confusing.
+
+It wasn't necessary to specify a width for the phone numbers because
+they are last on their lines.  They don't need to have spaces
+after them.
+
+The table could be made to look even nicer by adding headings to the
+tops of the columns.  This is done using a @code{BEGIN} rule
+(@pxref{BEGIN/END})
+so that the headers are only printed once, at the beginning of
+the @command{awk} program:
+
+@example
+awk 'BEGIN @{ print "Name      Number"
+             print "----      ------" @}
+           @{ printf "%-10s %s\n", $1, $2 @}' mail-list
+@end example
+
+The preceding example mixes @code{print} and @code{printf} statements in
+the same program.  Using just @code{printf} statements can produce the
+same results:
+
+@example
+awk 'BEGIN @{ printf "%-10s %s\n", "Name", "Number"
+             printf "%-10s %s\n", "----", "------" @}
+           @{ printf "%-10s %s\n", $1, $2 @}' mail-list
+@end example
+
+@noindent
+Printing each column heading with the same format specification
+used for the column elements ensures that the headings
+are aligned just like the columns.
+
+The fact that the same format specification is used three times can be
+emphasized by storing it in a variable, like this:
+
+@example
+awk 'BEGIN @{ format = "%-10s %s\n"
+             printf format, "Name", "Number"
+             printf format, "----", "------" @}
+           @{ printf format, $1, $2 @}' mail-list
+@end example
+
+
+@node Redirection
+@section Redirecting Output of @code{print} and @code{printf}
+
+@cindex output redirection
+@cindex redirection of output
+@cindex @option{--sandbox} option, output redirection with @code{print}, @code{printf}
+So far, the output from @code{print} and @code{printf} has gone
+to the standard
+output, usually the screen.  Both @code{print} and @code{printf} can
+also send their output to other places.
+This is called @dfn{redirection}.
+
+@quotation NOTE
+When @option{--sandbox} is specified (@pxref{Options}),
+redirecting output to files, pipes, and coprocesses is disabled.
+@end quotation
+
+A redirection appears after the @code{print} or @code{printf} statement.
+Redirections in @command{awk} are written just like redirections in shell
+commands, except that they are written inside the @command{awk} program.
+
+@c the commas here are part of the see also
+@cindex @code{print} statement, See Also redirection@comma{} of output
+@cindex @code{printf} statement, See Also redirection@comma{} of output
+There are four forms of output redirection: output to a file, output
+appended to a file, output through a pipe to another command, and output
+to a coprocess.  We show them all for the @code{print} statement,
+but they work identically for @code{printf}:
+
+@table @code
+@cindex @code{>} (right angle bracket), @code{>} operator (I/O)
+@cindex right angle bracket (@code{>}), @code{>} operator (I/O)
+@cindex operators, input/output
+@item print @var{items} > @var{output-file}
+This redirection prints the items into the output file named
+@var{output-file}.  The @value{FN} @var{output-file} can be any
+expression.  Its value is changed to a string and then used as a
+@value{FN} (@pxref{Expressions}).
+
+When this type of redirection is used, the @var{output-file} is erased
+before the first output is written to it.  Subsequent writes to the same
+@var{output-file} do not erase @var{output-file}, but append to it.
+(This is different from how you use redirections in shell scripts.)
+If @var{output-file} does not exist, it is created.  For example, here
+is how an @command{awk} program can write a list of peoples' names to one
+file named @file{name-list}, and a list of phone numbers to another file
+named @file{phone-list}:
+
+@example
+$ @kbd{awk '@{ print $2 > "phone-list"}
+>        @kbd{print $1 > "name-list" @}' mail-list}
+$ @kbd{cat phone-list}
+@print{} 555-5553
+@print{} 555-3412
+@dots{}
+$ @kbd{cat name-list}
+@print{} Amelia
+@print{} Anthony
+@dots{}
+@end example
+
+@noindent
+Each output file contains one name or number per line.
+
+@cindex @code{>} (right angle bracket), @code{>>} operator (I/O)
+@cindex right angle bracket (@code{>}), @code{>>} operator (I/O)
+@item print @var{items} >> @var{output-file}
+This redirection prints the items into the preexisting output file
+named @var{output-file}.  The difference between this and the
+single-@samp{>} redirection is that the old contents (if any) of
+@var{output-file} are not erased.  Instead, the @command{awk} output is
+appended to the file.
+If @var{output-file} does not exist, then it is created.
+
+@cindex @code{|} (vertical bar), @code{|} operator (I/O)
+@cindex pipe, output
+@cindex output, pipes
+@item print @var{items} | @var{command}
+It is possible to send output to another program through a pipe
+instead of into a file.   This redirection opens a pipe to
+@var{command}, and writes the values of @var{items} through this pipe
+to another process created to execute @var{command}.
+
+The redirection argument @var{command} is actually an @command{awk}
+expression.  Its value is converted to a string whose contents give
+the shell command to be run.  For example, the following produces two
+files, one unsorted list of peoples' names, and one list sorted in reverse
+alphabetical order:
+
+@ignore
+10/2000:
+This isn't the best style, since COMMAND is assigned for each
+record.  It's done to avoid overfull hboxes in TeX.  Leave it
+alone for now and let's hope no-one notices.
+@end ignore
+
+@example
+@group
+awk '@{ print $1 > "names.unsorted"
+       command = "sort -r > names.sorted"
+       print $1 | command @}' mail-list
+@end group
+@end example
+
+The unsorted list is written with an ordinary redirection, while
+the sorted list is written by piping through the @command{sort} utility.
+
+The next example uses redirection to mail a message to the mailing
+list @code{bug-system}.  This might be useful when trouble is encountered
+in an @command{awk} script run periodically for system maintenance:
+
+@example
+report = "mail bug-system"
+print("Awk script failed:", $0) | report
+print("at record number", FNR, "of", FILENAME) | report
+close(report)
+@end example
+
+The @code{close()} function is called here because it's a good idea to close
+the pipe as soon as all the intended output has been sent to it.
+@xref{Close Files And Pipes}
+for more information.
+
+This example also illustrates the use of a variable to represent
+a @var{file} or @var{command}---it is not necessary to always
+use a string constant.  Using a variable is generally a good idea,
+because (if you mean to refer to that same file or command)
+@command{awk} requires that the string value be written identically
+every time.
+
+@cindex coprocesses
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O)
+@cindex operators, input/output
+@cindex differences in @command{awk} and @command{gawk}, input/output operators
+@item print @var{items} |& @var{command}
+This redirection prints the items to the input of @var{command}.
+The difference between this and the
+single-@samp{|} redirection is that the output from @var{command}
+can be read with @code{getline}.
+Thus, @var{command} is a @dfn{coprocess}, which works together with
+but is subsidiary to the @command{awk} program.
+
+This feature is a @command{gawk} extension, and is not available in
+POSIX @command{awk}.
+@ifnotdocbook
+@xref{Getline/Coprocess},
+for a brief discussion.
+@xref{Two-way I/O},
+for a more complete discussion.
+@end ifnotdocbook
+@ifdocbook
+@xref{Getline/Coprocess}
+for a brief discussion and
+@ref{Two-way I/O}
+for a more complete discussion.
+@end ifdocbook
+@end table
+
+Redirecting output using @samp{>}, @samp{>>}, @samp{|}, or @samp{|&}
+asks the system to open a file, pipe, or coprocess only if the particular
+@var{file} or @var{command} you specify has not already been written
+to by your program or if it has been closed since it was last written to.
+
+@cindex troubleshooting, printing
+It is a common error to use @samp{>} redirection for the first @code{print}
+to a file, and then to use @samp{>>} for subsequent output:
+
+@example
+# clear the file
+print "Don't panic" > "guide.txt"
+@dots{}
+# append
+print "Avoid improbability generators" >> "guide.txt"
+@end example
+
+@noindent
+This is indeed how redirections must be used from the shell.  But in
+@command{awk}, it isn't necessary.  In this kind of case, a program should
+use @samp{>} for all the @code{print} statements, because the output file
+is only opened once. (It happens that if you mix @samp{>} and @samp{>>}
+output is produced in the expected order. However, mixing the operators
+for the same file is definitely poor style, and is confusing to readers
+of your program.)
+
+@cindex differences in @command{awk} and @command{gawk}, implementation limitations
+@cindex implementation issues, @command{gawk}, limits
+@cindex @command{awk}, implementation issues, pipes
+@cindex @command{gawk}, implementation issues, pipes
+@ifnotinfo
+As mentioned earlier
+(@pxref{Getline Notes}),
+many
+@end ifnotinfo
+@ifnottex
+@ifnotdocbook
+Many
+@end ifnotdocbook
+@end ifnottex
+older
+@command{awk} implementations limit the number of pipelines that an @command{awk}
+program may have open to just one!  In @command{gawk}, there is no such limit.
+@command{gawk} allows a program to
+open as many pipelines as the underlying operating system permits.
+
+@sidebar Piping into @command{sh}
+@cindex shells, piping commands into
+
+A particularly powerful way to use redirection is to build command lines
+and pipe them into the shell, @command{sh}.  For example, suppose you
+have a list of files brought over from a system where all the @value{FN}s
+are stored in uppercase, and you wish to rename them to have names in
+all lowercase.  The following program is both simple and efficient:
+
+@c @cindex @command{mv} utility
+@example
+@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @}
+
+END @{ close("sh") @}
+@end example
+
+The @code{tolower()} function returns its argument string with all
+uppercase characters converted to lowercase
+(@pxref{String Functions}).
+The program builds up a list of command lines,
+using the @command{mv} utility to rename the files.
+It then sends the list to the shell for execution.
+
+@xref{Shell Quoting} for a function that can help in generating
+command lines to be fed to the shell.
+@end sidebar
+
+@node Special FD
+@section Special Files for Standard Preopened Data Streams
+@cindex standard input
+@cindex input, standard
+@cindex standard output
+@cindex output, standard
+@cindex error output
+@cindex standard error
+@cindex file descriptors
+@cindex files, descriptors, See file descriptors
+
+Running programs conventionally have three input and output streams
+already available to them for reading and writing.  These are known
+as the @dfn{standard input}, @dfn{standard output}, and @dfn{standard
+error output}.  These open streams (and any other open files or pipes)
+are often referred to by the technical term @dfn{file descriptors}.
+
+These streams are, by default, connected to your keyboard and screen, but
+they are often redirected with the shell, via the @samp{<}, @samp{<<},
+@samp{>}, @samp{>>}, @samp{>&}, and @samp{|} operators.  Standard error
+is typically used for writing error messages; the reason there are two separate
+streams, standard output and standard error, is so that they can be
+redirected separately.
+
+@cindex differences in @command{awk} and @command{gawk}, error messages
+@cindex error handling
+In traditional implementations of @command{awk}, the only way to write an error
+message to standard error in an @command{awk} program is as follows:
+
+@example
+print "Serious error detected!" | "cat 1>&2"
+@end example
+
+@noindent
+This works by opening a pipeline to a shell command that can access the
+standard error stream that it inherits from the @command{awk} process.
+@c 8/2014: Mike Brennan says not to cite this as inefficient. So, fixed.
+This is far from elegant, and it also requires a
+separate process.  So people writing @command{awk} programs often
+don't do this.  Instead, they send the error messages to the
+screen, like this:
+
+@example
+print "Serious error detected!" > "/dev/tty"
+@end example
+
+@noindent
+(@file{/dev/tty} is a special file supplied by the operating system
+that is connected to your keyboard and screen. It represents the
+``terminal,''@footnote{The ``tty'' in @file{/dev/tty} stands for
+``Teletype,'' a serial terminal.} which on modern systems is a keyboard
+and screen, not a serial console.)
+This generally has the same effect, but not always: although the
+standard error stream is usually the screen, it can be redirected; when
+that happens, writing to the screen is not correct.  In fact, if
+@command{awk} is run from a background job, it may not have a
+terminal at all.
+Then opening @file{/dev/tty} fails.
+
+@command{gawk}, BWK @command{awk}, and @command{mawk} provide
+special @value{FN}s for accessing the three standard streams.
+If the @value{FN} matches one of these special names when @command{gawk}
+(or one of the others) redirects input or output, then it directly uses
+the descriptor that the @value{FN} stands for.  These special
+@value{FN}s work for all operating systems that @command{gawk}
+has been ported to, not just those that are POSIX-compliant:
+
+@cindex common extensions, @code{/dev/stdin} special file
+@cindex common extensions, @code{/dev/stdout} special file
+@cindex common extensions, @code{/dev/stderr} special file
+@cindex extensions, common@comma{} @code{/dev/stdin} special file
+@cindex extensions, common@comma{} @code{/dev/stdout} special file
+@cindex extensions, common@comma{} @code{/dev/stderr} special file
+@cindex file names, standard streams in @command{gawk}
+@cindex @code{/dev/@dots{}} special files
+@cindex files, @code{/dev/@dots{}} special files
+@cindex @code{/dev/fd/@var{N}} special files (@command{gawk})
+@table @file
+@item /dev/stdin
+The standard input (file descriptor 0).
+
+@item /dev/stdout
+The standard output (file descriptor 1).
+
+@item /dev/stderr
+The standard error output (file descriptor 2).
+@end table
+
+With these facilities,
+the proper way to write an error message then becomes:
+
+@example
+print "Serious error detected!" > "/dev/stderr"
+@end example
+
+@cindex troubleshooting, quotes with file names
+Note the use of quotes around the @value{FN}.
+Like with any other redirection, the value must be a string.
+It is a common error to omit the quotes, which leads
+to confusing results.
+
+@command{gawk} does not treat these @value{FN}s as special when
+in POSIX-compatibility mode. However, because BWK @command{awk}
+supports them, @command{gawk} does support them even when
+invoked with the @option{--traditional} option (@pxref{Options}).
+
+@node Special Files
+@section Special @value{FFN}s in @command{gawk}
+@cindex @command{gawk}, file names in
+
+Besides access to standard input, standard output, and standard error,
+@command{gawk} provides access to any open file descriptor.
+Additionally, there are special @value{FN}s reserved for
+TCP/IP networking.
+
+@menu
+* Other Inherited Files::       Accessing other open files with
+                                @command{gawk}.
+* Special Network::             Special files for network communications.
+* Special Caveats::             Things to watch out for.
+@end menu
+
+@node Other Inherited Files
+@subsection Accessing Other Open Files with @command{gawk}
+
+Besides the @code{/dev/stdin}, @code{/dev/stdout}, and @code{/dev/stderr}
+special @value{FN}s mentioned earlier, @command{gawk} provides syntax
+for accessing any other inherited open file:
+
+@table @file
+@item /dev/fd/@var{N}
+The file associated with file descriptor @var{N}.  Such a file must
+be opened by the program initiating the @command{awk} execution (typically
+the shell).  Unless special pains are taken in the shell from which
+@command{gawk} is invoked, only descriptors 0, 1, and 2 are available.
+@end table
+
+The @value{FN}s @file{/dev/stdin}, @file{/dev/stdout}, and @file{/dev/stderr}
+are essentially aliases for @file{/dev/fd/0}, @file{/dev/fd/1}, and
+@file{/dev/fd/2}, respectively. However, those names are more self-explanatory.
+
+Note that using @code{close()} on a @value{FN} of the
+form @code{"/dev/fd/@var{N}"}, for file descriptor numbers
+above two, does actually close the given file descriptor.
+
+@node Special Network
+@subsection Special Files for Network Communications
+@cindex networks, support for
+@cindex TCP/IP, support for
+
+@command{gawk} programs
+can open a two-way
+TCP/IP connection, acting as either a client or a server.
+This is done using a special @value{FN} of the form:
+
+@example
+@file{/@var{net-type}/@var{protocol}/@var{local-port}/@var{remote-host}/@var{remote-port}}
+@end example
+
+The @var{net-type} is one of @samp{inet}, @samp{inet4}, or @samp{inet6}.
+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 @w{a coprocess}
+(@pxref{Two-way I/O}).
+This is an advanced feature, mentioned here only for completeness.
+Full discussion is delayed until
+@ref{TCP/IP Networking}.
+
+@node Special Caveats
+@subsection Special @value{FFN} Caveats
+
+Here are some things to bear in mind when using the
+special @value{FN}s that @command{gawk} provides:
+
+@itemize @value{BULLET}
+@cindex compatibility mode (@command{gawk}), file names
+@cindex file names, in compatibility mode
+@item
+Recognition of the @value{FN}s for the three standard preopened
+files is disabled only in POSIX mode.
+
+@item
+Recognition of the other special @value{FN}s is disabled if @command{gawk} is in
+compatibility mode (either @option{--traditional} or @option{--posix};
+@pxref{Options}).
+
+@item
+@command{gawk} @emph{always}
+interprets these special @value{FN}s.
+For example, using @samp{/dev/fd/4}
+for output actually writes on file descriptor 4, and not on a new
+file descriptor that is @code{dup()}ed from file descriptor 4.  Most of
+the time this does not matter; however, it is important to @emph{not}
+close any of the files related to file descriptors 0, 1, and 2.
+Doing so results in unpredictable behavior.
+@end itemize
+
+@node Close Files And Pipes
+@section Closing Input and Output Redirections
+@cindex files, output, See output files
+@cindex input files, closing
+@cindex output, files@comma{} closing
+@cindex pipe, closing
+@cindex coprocesses, closing
+@cindex @code{getline} command, coprocesses@comma{} using from
+
+If the same @value{FN} or the same shell command is used with @code{getline}
+more than once during the execution of an @command{awk} program
+(@pxref{Getline}),
+the file is opened (or the command is executed) the first time only.
+At that time, the first record of input is read from that file or command.
+The next time the same file or command is used with @code{getline},
+another record is read from it, and so on.
+
+Similarly, when a file or pipe is opened for output, @command{awk} remembers
+the @value{FN} or command associated with it, and subsequent
+writes to the same file or command are appended to the previous writes.
+The file or pipe stays open until @command{awk} exits.
+
+@cindexawkfunc{close}
+This implies that special steps are necessary in order to read the same
+file again from the beginning, or to rerun a shell command (rather than
+reading more output from the same command).  The @code{close()} function
+makes these things possible:
+
+@example
+close(@var{filename})
+@end example
+
+@noindent
+or:
+
+@example
+close(@var{command})
+@end example
+
+The argument @var{filename} or @var{command} can be any expression.  Its
+value must @emph{exactly} match the string that was used to open the file or
+start the command (spaces and other ``irrelevant'' characters
+included). For example, if you open a pipe with this:
+
+@example
+"sort -r names" | getline foo
+@end example
+
+@noindent
+then you must close it with this:
+
+@example
+close("sort -r names")
+@end example
+
+Once this function call is executed, the next @code{getline} from that
+file or command, or the next @code{print} or @code{printf} to that
+file or command, reopens the file or reruns the command.
+Because the expression that you use to close a file or pipeline must
+exactly match the expression used to open the file or run the command,
+it is good practice to use a variable to store the @value{FN} or command.
+The previous example becomes the following:
+
+@example
+@group
+sortcom = "sort -r names"
+sortcom | getline foo
+@end group
+@group
+@dots{}
+close(sortcom)
+@end group
+@end example
+
+@noindent
+This helps avoid hard-to-find typographical errors in your @command{awk}
+programs.  Here are some of the reasons for closing an output file:
+
+@itemize @value{BULLET}
+@item
+To write a file and read it back later on in the same @command{awk}
+program.  Close the file after writing it, then
+begin reading it with @code{getline}.
+
+@item
+To write numerous files, successively, in the same @command{awk}
+program.  If the files aren't closed, eventually @command{awk} may exceed a
+system limit on the number of open files in one process.  It is best to
+close each one when the program has finished writing it.
+
+@item
+To make a command finish.  When output is redirected through a pipe,
+the command reading the pipe normally continues to try to read input
+as long as the pipe is open.  Often this means the command cannot
+really do its work until the pipe is closed.  For example, if
+output is redirected to the @command{mail} program, the message is not
+actually sent until the pipe is closed.
+
+@item
+To run the same program a second time, with the same arguments.
+This is not the same thing as giving more input to the first run!
+
+For example, suppose a program pipes output to the @command{mail} program.
+If it outputs several lines redirected to this pipe without closing
+it, they make a single message of several lines.  By contrast, if the
+program closes the pipe after each line of output, then each line makes
+a separate message.
+@end itemize
+
+@cindex differences in @command{awk} and @command{gawk}, @code{close()} function
+@cindex portability, @code{close()} function and
+@cindex @code{close()} function, portability
+If you use more files than the system allows you to have open,
+@command{gawk} attempts to multiplex the available open files among
+your @value{DF}s.  @command{gawk}'s ability to do this depends upon the
+facilities of your operating system, so it may not always work.  It is
+therefore both good practice and good portability advice to always
+use @code{close()} on your files when you are done with them.
+In fact, if you are using a lot of pipes, it is essential that
+you close commands when done. For example, consider something like this:
+
+@example
+@{
+    @dots{}
+    command = ("grep " $1 " /some/file | my_prog -q " $3)
+    while ((command | getline) > 0) @{
+        @var{process output of} command
+    @}
+    # need close(command) here
+@}
+@end example
+
+This example creates a new pipeline based on data in @emph{each} record.
+Without the call to @code{close()} indicated in the comment, @command{awk}
+creates child processes to run the commands, until it eventually
+runs out of file descriptors for more pipelines.
+
+Even though each command has finished (as indicated by the end-of-file
+return status from @code{getline}), the child process is not
+terminated;@footnote{The technical terminology is rather morbid.
+The finished child is called a ``zombie,'' and cleaning up after
+it is referred to as ``reaping.''}
+@c Good old UNIX: give the marketing guys fits, that's the ticket
+more importantly, the file descriptor for the pipe
+is not closed and released until @code{close()} is called or
+@command{awk} exits.
+
+@code{close()} silently does nothing if given an argument that
+does not represent a file, pipe, or coprocess that was opened with
+a redirection.  In such a case, it returns a negative value,
+indicating an error. In addition, @command{gawk} sets @code{ERRNO}
+to a string indicating the error.
+
+Note also that @samp{close(FILENAME)} has no ``magic'' effects on the
+implicit loop that reads through the files named on the command line.
+It is, more likely, a close of a file that was never opened with a
+redirection, so @command{awk} silently does nothing, except return
+a negative value.
+
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O), pipes@comma{} closing
+When using the @samp{|&} operator to communicate with a coprocess,
+it is occasionally useful to be able to close one end of the two-way
+pipe without closing the other.
+This is done by supplying a second argument to @code{close()}.
+As in any other call to @code{close()},
+the first argument is the name of the command or special file used
+to start the coprocess.
+The second argument should be a string, with either of the values
+@code{"to"} or @code{"from"}.  Case does not matter.
+As this is an advanced feature, discussion is
+delayed until
+@ref{Two-way I/O},
+which describes it in more detail and gives an example.
+
+@sidebar Using @code{close()}'s Return Value
+@cindex dark corner, @code{close()} function
+@cindex @code{close()} function, return value
+@cindex return value@comma{} @code{close()} function
+@cindex differences in @command{awk} and @command{gawk}, @code{close()} function
+@cindex Unix @command{awk}, @code{close()} function and
+
+In many older versions of Unix @command{awk}, the @code{close()} function
+is actually a statement.
+@value{DARKCORNER}
+It is a syntax error to try and use the return
+value from @code{close()}:
+
+@example
+command = "@dots{}"
+command | getline info
+retval = close(command)  # syntax error in many Unix awks
+@end example
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable, with @command{close()} function
+@command{gawk} treats @code{close()} as a function.
+The return value is @minus{}1 if the argument names something
+that was never opened with a redirection, or if there is
+a system problem closing the file or process.
+In these cases, @command{gawk} sets the predefined variable
+@code{ERRNO} to a string describing the problem.
+
+In @command{gawk}, starting with @value{PVERSION} 4.2, when closing a pipe or
+coprocess (input or output), the return value is the exit status of the
+command, as described in @ref{table-close-pipe-return-values}.@footnote{Prior
+to @value{PVERSION} 4.2, the return value from closing a pipe or co-process
+was the full 16-bit exit value as defined by the @code{wait()} system
+call.} Otherwise, it is the return value from the system's @code{close()}
+or @code{fclose()} C functions when closing input or output files,
+respectively.  This value is zero if the close succeeds, or @minus{}1
+if it fails.
+
+@float Table,table-close-pipe-return-values
+@caption{Return values from @code{close()} of a pipe}
+@multitable @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
+@item Death by signal of command with core dump @tab 512 + number of murderous signal
+@item Some kind of error @tab @minus{}1
+@end multitable
+@end float
+
+The POSIX standard is very vague; it says that @code{close()}
+returns zero on success and a nonzero value otherwise.  In general,
+different implementations vary in what they report when closing
+pipes; thus, the return value cannot be used portably.
+@value{DARKCORNER}
+In POSIX mode (@pxref{Options}), @command{gawk} just returns zero
+when closing a pipe.
+@end sidebar
+
+@node Nonfatal
+@section Enabling Nonfatal Output
+
+This @value{SECTION} describes a @command{gawk}-specific feature.
+
+In standard @command{awk}, output with @code{print} or @code{printf}
+to a nonexistent file, or some other I/O error (such as filling up the
+disk) is a fatal error.
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "hi" > "/no/such/file" @}'}
+@error{} gawk: cmd. line:1: fatal: can't redirect to `/no/such/file' (No
+@error{} such file or directory)
+@end example
+
+@command{gawk} makes it possible to detect that an error has
+occurred, allowing you to possibly recover from the error, or
+at least print an error message of your choosing before exiting.
+You can do this in one of two ways:
+
+@itemize @bullet
+@item
+For all output files, by assigning any value to @code{PROCINFO["NONFATAL"]}.
+
+@item
+On a per-file basis, by assigning any value to
+@code{PROCINFO[@var{filename}, "NONFATAL"]}.
+Here, @var{filename} is the name of the file to which
+you wish output to be nonfatal.
+@end itemize
+
+Once you have enabled nonfatal output, you must check @code{ERRNO}
+after every relevant @code{print} or @code{printf} statement to
+see if something went wrong.  It is also a good idea to initialize
+@code{ERRNO} to zero before attempting the output. For example:
+
+@example
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+> @kbd{    PROCINFO["NONFATAL"] = 1}
+> @kbd{    ERRNO = 0}
+> @kbd{    print "hi" > "/no/such/file"}
+> @kbd{    if (ERRNO) @{}
+> @kbd{        print("Output failed:", ERRNO) > "/dev/stderr"}
+> @kbd{        exit 1}
+> @kbd{    @}}
+> @kbd{@}'}
+@error{} Output failed: No such file or directory
+@end example
+
+Here, @command{gawk} did not produce a fatal error; instead
+it let the @command{awk} program code detect the problem and handle it.
+
+This mechanism works also for standard output and standard error.
+For standard output, you may use @code{PROCINFO["-", "NONFATAL"]}
+or @code{PROCINFO["/dev/stdout", "NONFATAL"]}.  For standard error, use
+@code{PROCINFO["/dev/stderr", "NONFATAL"]}.
+
+When attempting to open a TCP/IP socket (@pxref{TCP/IP Networking}),
+@command{gawk} tries multiple times. The @env{GAWK_SOCK_RETRIES}
+environment variable (@pxref{Other Environment Variables}) allows you to
+override @command{gawk}'s builtin default number of attempts.  However,
+once nonfatal I/O is enabled for a given socket, @command{gawk} only
+retries once, relying on @command{awk}-level code to notice that there
+was a problem.
+
+@node Output Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+The @code{print} statement prints comma-separated expressions. Each
+expression is separated by the value of @code{OFS} and terminated by
+the value of @code{ORS}.  @code{OFMT} provides the conversion format
+for numeric values for the @code{print} statement.
+
+@item
+The @code{printf} statement provides finer-grained control over output,
+with format-control letters for different data types and various flags
+that modify the behavior of the format-control letters.
+
+@item
+Output from both @code{print} and @code{printf} may be redirected to
+files, pipes, and coprocesses.
+
+@item
+@command{gawk} provides special @value{FN}s for access to standard input,
+output, and error, and for network communications.
+
+@item
+Use @code{close()} to close open file, pipe, and coprocess redirections.
+For coprocesses, it is possible to close only one direction of the
+communications.
+
+@item
+Normally errors with @code{print} or @code{printf} are fatal.
+@command{gawk} lets you make output errors be nonfatal either for
+all files or on a per-file basis. You must then check for errors
+after every relevant output statement.
+
+@end itemize
+
+@c EXCLUDE START
+@node Output Exercises
+@section Exercises
+
+@enumerate
+@item
+Rewrite the program:
+
+@example
+awk 'BEGIN @{ print "Month Crates"
+             print "----- ------" @}
+           @{ print $1, "     ", $2 @}' inventory-shipped
+@end example
+
+@noindent
+from @ref{Output Separators}, by using a new value of @code{OFS}.
+
+@item
+Use the @code{printf} statement to line up the headings and table data
+for the @file{inventory-shipped} example that was covered in @ref{Print}.
+
+@item
+What happens if you forget the double quotes when redirecting
+output, as follows:
+
+@example
+BEGIN @{ print "Serious error detected!" > /dev/stderr @}
+@end example
+
+@end enumerate
+@c EXCLUDE END
+
+
+@node Expressions
+@chapter Expressions
+@cindex expressions
+
+Expressions are the basic building blocks of @command{awk} patterns
+and actions.  An expression evaluates to a value that you can print, test,
+or pass to a function.  Additionally, an expression
+can assign a new value to a variable or a field by using an assignment operator.
+
+An expression can serve as a pattern or action statement on its own.
+Most other kinds of
+statements contain one or more expressions that specify the data on which to
+operate.  As in other languages, expressions in @command{awk} can include
+variables, array references, constants, and function calls, as well as
+combinations of these with various operators.
+
+@menu
+* Values::                      Constants, Variables, and Regular Expressions.
+* All Operators::               @command{gawk}'s operators.
+* Truth Values and Conditions:: Testing for true and false.
+* Function Calls::              A function call is an expression.
+* Precedence::                  How various operators nest.
+* Locales::                     How the locale affects things.
+* Expressions Summary::         Expressions summary.
+@end menu
+
+@node Values
+@section Constants, Variables, and Conversions
+
+Expressions are built up from values and the operations performed
+upon them. This @value{SECTION} describes the elementary objects
+that provide the values used in expressions.
+
+@menu
+* Constants::                   String, numeric and regexp constants.
+* Using Constant Regexps::      When and how to use a regexp constant.
+* Variables::                   Variables give names to values for later use.
+* Conversion::                  The conversion of strings to numbers and vice
+                                versa.
+@end menu
+
+@node Constants
+@subsection Constant Expressions
+
+@cindex constants, types of
+
+The simplest type of expression is the @dfn{constant}, which always has
+the same value.  There are three types of constants: numeric,
+string, and regular expression.
+
+Each is used in the appropriate context when you need a data
+value that isn't going to change.  Numeric constants can
+have different forms, but are internally stored in an identical manner.
+
+@menu
+* Scalar Constants::            Numeric and string constants.
+* Nondecimal-numbers::          What are octal and hex numbers.
+* Regexp Constants::            Regular Expression constants.
+@end menu
+
+@node Scalar Constants
+@subsubsection Numeric and String Constants
+
+@cindex constants, numeric
+@cindex numeric constants
+A @dfn{numeric constant} stands for a number.  This number can be an
+integer, a decimal fraction, or a number in scientific (exponential)
+notation.@footnote{The internal representation of all numbers,
+including integers, uses double-precision floating-point numbers.
+On most modern systems, these are in IEEE 754 standard format.
+@xref{Arbitrary Precision Arithmetic}, for much more information.}
+Here are some examples of numeric constants that all
+have the same value:
+
+@example
+105
+1.05e+2
+1050e-1
+@end example
+
+@cindex string constants
+A @dfn{string constant} consists of a sequence of characters enclosed in
+double quotation marks.  For example:
+
+@example
+"parrot"
+@end example
+
+@noindent
+@cindex differences in @command{awk} and @command{gawk}, strings
+@cindex strings, length limitations
+represents the string whose contents are @samp{parrot}.  Strings in
+@command{gawk} can be of any length, and they can contain any of the possible
+eight-bit ASCII characters, including ASCII @sc{nul} (character code zero).
+Other @command{awk}
+implementations may have difficulty with some character codes.
+
+Some languages allow you to continue long strings across
+multiple lines by ending the line with a backslash. For example in C:
+
+@example
+#include <stdio.h>
+
+int main()
+@{
+    printf "hello, \
+world\n");
+    return 0;
+@}
+@end example
+
+@noindent
+In such a case, the C compiler removes both the backslash and the newline,
+producing a string as if it had been typed @samp{"hello, world\n"}.
+This is useful when a single string needs to contain a large amount of text.
+
+The POSIX standard says explicitly that newlines are not allowed inside string
+constants.  And indeed, all @command{awk} implementations report an error
+if you try to do so. For example:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "hello, }
+> @kbd{world" @}'}
+@print{} gawk: cmd. line:1: BEGIN @{ print "hello,
+@print{} gawk: cmd. line:1:               ^ unterminated string
+@print{} gawk: cmd. line:1: BEGIN @{ print "hello,
+@print{} gawk: cmd. line:1:               ^ syntax error
+@end example
+
+@cindex dark corner, string continuation
+@cindex strings, continuation across lines
+@cindex differences in @command{awk} and @command{gawk}, strings
+Although POSIX doesn't define what happens if you use an escaped
+newline, as in the previous C example, all known versions of
+@command{awk} allow you to do so.  Unfortunately, what each one
+does with such a string varies.  @value{DARKCORNER} @command{gawk},
+@command{mawk}, and the OpenSolaris POSIX @command{awk}
+(@pxref{Other Versions}) elide the backslash and newline, as in C:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "hello, \}
+> @kbd{world" @}'}
+@print{} hello, world
+@end example
+
+In POSIX mode (@pxref{Options}), @command{gawk} does not
+allow escaped newlines.  Otherwise, it behaves as just described.
+
+Brian Kernighan's @command{awk} and BusyBox @command{awk}
+remove the backslash but leave the newline
+intact, as part of the string:
+
+@example
+$ @kbd{nawk 'BEGIN @{ print "hello, \}
+> @kbd{world" @}'}
+@print{} hello, 
+@print{} world
+@end example
+
+@node Nondecimal-numbers
+@subsubsection Octal and Hexadecimal Numbers
+@cindex octal numbers
+@cindex hexadecimal numbers
+@cindex numbers, octal
+@cindex numbers, hexadecimal
+
+In @command{awk}, all numbers are in decimal (i.e., base 10).  Many other
+programming languages allow you to specify numbers in other bases, often
+octal (base 8) and hexadecimal (base 16).
+In octal, the numbers go 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, and so on.
+Just as @samp{11} in decimal is 1 times 10 plus 1, so
+@samp{11} in octal is 1 times 8 plus 1. This equals 9 in decimal.
+In hexadecimal, there are 16 digits. Because the everyday decimal
+number system only has ten digits (@samp{0}--@samp{9}), the letters
+@samp{a} through @samp{f} represent the rest.
+(Case in the letters is usually irrelevant; hexadecimal @samp{a} and @samp{A}
+have the same value.)
+Thus, @samp{11} in
+hexadecimal is 1 times 16 plus 1, which equals 17 in decimal.
+
+Just by looking at plain @samp{11}, you can't tell what base it's in.
+So, in C, C++, and other languages derived from C,
+@c such as PERL, but we won't mention that....
+there is a special notation to signify the base.
+Octal numbers start with a leading @samp{0},
+and hexadecimal numbers start with a leading @samp{0x} or @samp{0X}:
+
+@table @code
+@item 11
+Decimal value 11
+
+@item 011
+Octal 11, decimal value 9
+
+@item 0x11
+Hexadecimal 11, decimal value 17
+@end table
+
+This example shows the difference:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "%d, %d, %d\n", 011, 11, 0x11 @}'}
+@print{} 9, 11, 17
+@end example
+
+Being able to use octal and hexadecimal constants in your programs is most
+useful when working with data that cannot be represented conveniently as
+characters or as regular numbers, such as binary data of various sorts.
+
+@cindex @command{gawk}, octal numbers and
+@cindex @command{gawk}, hexadecimal numbers and
+@command{gawk} allows the use of octal and hexadecimal
+constants in your program text.  However, such numbers in the input data
+are not treated differently; doing so by default would break old
+programs.
+(If you really need to do this, use the @option{--non-decimal-data}
+command-line option;
+@pxref{Nondecimal Data}.)
+If you have octal or hexadecimal data,
+you can use the @code{strtonum()} function
+(@pxref{String Functions})
+to convert the data into a number.
+Most of the time, you will want to use octal or hexadecimal constants
+when working with the built-in bit-manipulation functions;
+see @ref{Bitwise Functions}
+for more information.
+
+Unlike in some early C implementations, @samp{8} and @samp{9} are not
+valid in octal constants.  For example, @command{gawk} treats @samp{018}
+as decimal 18:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "021 is", 021 ; print 018 @}'}
+@print{} 021 is 17
+@print{} 18
+@end example
+
+@cindex compatibility mode (@command{gawk}), octal numbers
+@cindex compatibility mode (@command{gawk}), hexadecimal numbers
+Octal and hexadecimal source code constants are a @command{gawk} extension.
+If @command{gawk} is in compatibility mode
+(@pxref{Options}),
+they are not available.
+
+@sidebar A Constant's Base Does Not Affect Its Value
+
+Once a numeric constant has
+been converted internally into a number,
+@command{gawk} no longer remembers
+what the original form of the constant was; the internal value is
+always used.  This has particular consequences for conversion of
+numbers to strings:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "0x11 is <%s>\n", 0x11 @}'}
+@print{} 0x11 is <17>
+@end example
+@end sidebar
+
+@node Regexp Constants
+@subsubsection Regular Expression Constants
+
+@cindex regexp constants
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+A @dfn{regexp constant} is a regular expression description enclosed in
+slashes, such as @code{@w{/^beginning and end$/}}.  Most regexps used in
+@command{awk} programs are constant, but the @samp{~} and @samp{!~}
+matching operators can also match computed or dynamic regexps
+(which are typically just ordinary strings or variables that contain a regexp,
+but could be more complex expressions).
+
+@node Using Constant Regexps
+@subsection Using Regular Expression Constants
+
+Regular expression constants consist of text describing
+a regular expression enclosed in slashes (such as @code{/the +answer/}).
+This @value{SECTION} describes how such constants work in
+POSIX @command{awk} and @command{gawk}, and then goes on to describe
+@dfn{strongly typed regexp constants}, which are a @command{gawk} extension.
+
+@menu
+* Standard Regexp Constants::   Regexp constants in standard @command{awk}.
+* Strong Regexp Constants::     Strongly typed regexp constants.
+@end menu
+
+@node Standard Regexp Constants
+@subsubsection Standard Regular Expression Constants
+
+@cindex dark corner, regexp constants
+When used on the righthand side of the @samp{~} or @samp{!~}
+operators, a regexp constant merely stands for the regexp that is to be
+matched.
+However, regexp constants (such as @code{/foo/}) may be used like simple expressions.
+When a
+regexp constant appears by itself, it has the same meaning as if it appeared
+in a pattern (i.e., @samp{($0 ~ /foo/)}).
+@value{DARKCORNER}
+@xref{Expression Patterns}.
+This means that the following two code segments:
+
+@example
+if ($0 ~ /barfly/ || $0 ~ /camelot/)
+    print "found"
+@end example
+
+@noindent
+and:
+
+@example
+if (/barfly/ || /camelot/)
+    print "found"
+@end example
+
+@noindent
+are exactly equivalent.
+One rather bizarre consequence of this rule is that the following
+Boolean expression is valid, but does not do what its author probably
+intended:
+
+@example
+# Note that /foo/ is on the left of the ~
+if (/foo/ ~ $1) print "found foo"
+@end example
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex @command{gawk}, regexp constants and
+@cindex regexp constants, in @command{gawk}
+@noindent
+This code is ``obviously'' testing @code{$1} for a match against the regexp
+@code{/foo/}.  But in fact, the expression @samp{/foo/ ~ $1} really means
+@samp{($0 ~ /foo/) ~ $1}.  In other words, first match the input record
+against the regexp @code{/foo/}.  The result is either zero or one,
+depending upon the success or failure of the match.  That result
+is then matched against the first field in the record.
+Because it is unlikely that you would ever really want to make this kind of
+test, @command{gawk} issues a warning when it sees this construct in
+a program.
+Another consequence of this rule is that the assignment statement:
+
+@example
+matches = /foo/
+@end example
+
+@noindent
+assigns either zero or one to the variable @code{matches}, depending
+upon the contents of the current input record.
+
+@cindex differences in @command{awk} and @command{gawk}, regexp constants
+@cindex dark corner, regexp constants, as arguments to user-defined functions
+@cindexgawkfunc{gensub}
+@cindexawkfunc{sub}
+@cindexawkfunc{gsub}
+Constant regular expressions are also used as the first argument for
+the @code{gensub()}, @code{sub()}, and @code{gsub()} functions, as the
+second argument of the @code{match()} function,
+and as the third argument of the @code{split()} and @code{patsplit()} functions
+(@pxref{String Functions}).
+Modern implementations of @command{awk}, including @command{gawk}, allow
+the third argument of @code{split()} to be a regexp constant, but some
+older implementations do not.
+@value{DARKCORNER}
+Because some built-in functions accept regexp constants as arguments,
+confusion can arise when attempting to use regexp constants as arguments
+to user-defined functions (@pxref{User-defined}).  For example:
+
+@example
+@group
+function mysub(pat, repl, str, global)
+@{
+    if (global)
+        gsub(pat, repl, str)
+    else
+        sub(pat, repl, str)
+    return str
+@}
+@end group
+
+@group
+@{
+    @dots{}
+    text = "hi! hi yourself!"
+    mysub(/hi/, "howdy", text, 1)
+    @dots{}
+@}
+@end group
+@end example
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+In this example, the programmer wants to pass a regexp constant to the
+user-defined function @code{mysub()}, which in turn passes it on to
+either @code{sub()} or @code{gsub()}.  However, what really happens is that
+the @code{pat} parameter is assigned a value of either one or zero, depending upon whether
+or not @code{$0} matches @code{/hi/}.
+@command{gawk} issues a warning when it sees a regexp constant used as
+a parameter to a user-defined function, because passing a truth value in
+this way is probably not what was intended.
+
+@node Strong Regexp Constants
+@subsubsection Strongly Typed Regexp Constants
+
+This @value{SECTION} describes a @command{gawk}-specific feature.
+
+As we saw in the previous @value{SECTION},
+regexp constants (@code{/@dots{}/}) hold a strange position in the
+@command{awk} language. In most contexts, they act like an expression:
+@samp{$0 ~ /@dots{}/}. In other contexts, they denote only a regexp to
+be matched. In no case are they really a ``first class citizen'' of the
+language. That is, you cannot define a scalar variable whose type is
+``regexp'' in the same sense that you can define a variable to be a
+number or a string:
+
+@example
+num = 42        @ii{Numeric variable}
+str = "hi"      @ii{String variable}
+re = /foo/      @ii{Wrong!} re @ii{is the result of} $0 ~ /foo/
+@end example
+
+For a number of more advanced use cases,
+it would be nice to have regexp constants that
+are @dfn{strongly typed}; in other words, that denote a regexp useful
+for matching, and not an expression.
+
+@cindex values, regexp
+@command{gawk} provides this feature.  A strongly typed regexp constant
+looks almost like a regular regexp constant, except that it is preceded
+by an @samp{@@} sign:
+
+@example
+re = @@/foo/     @ii{Regexp variable}
+@end example
+
+Strongly typed regexp constants @emph{cannot} be used everywhere that a
+regular regexp constant can, because this would make the language even more
+confusing.  Instead, you may use them only in certain contexts:
+
+@itemize @bullet
+@item
+On the righthand side of the @samp{~} and @samp{!~} operators: @samp{some_var ~ @@/foo/}
+(@pxref{Regexp Usage}).
+
+@item
+In the @code{case} part of a @code{switch} statement
+(@pxref{Switch Statement}).
+
+@item
+As an argument to one of the built-in functions that accept regexp constants:
+@code{gensub()},
+@code{gsub()},
+@code{match()},
+@code{patsplit()},
+@code{split()},
+and
+@code{sub()}
+(@pxref{String Functions}).
+
+@item
+As a parameter in a call to a user-defined function
+(@pxref{User-defined}).
+
+@item
+On the righthand side of an assignment to a variable: @samp{some_var = @@/foo/}.
+In this case, the type of @code{some_var} is regexp. Additionally, @code{some_var}
+can be used with @samp{~} and @samp{!~}, passed to one of the built-in functions
+listed above, or passed as a parameter to a user-defined function.
+@end itemize
+
+You may use the @code{typeof()} built-in function
+(@pxref{Type Functions})
+to determine if a variable or function parameter is
+a regexp variable.
+
+The true power of this feature comes from the ability to create variables that
+have regexp type. Such variables can be passed on to user-defined functions,
+without the confusing aspects of computed regular expressions created from
+strings or string constants. They may also be passed through indirect function
+calls (@pxref{Indirect Calls})
+and on to the built-in functions that accept regexp constants.
+
+When used in numeric conversions, strongly typed regexp variables convert
+to zero. When used in string conversions, they convert to the string
+value of the original regexp text.
+
+@node Variables
+@subsection Variables
+
+@cindex variables, user-defined
+@cindex user-defined, variables
+@dfn{Variables} are ways of storing values at one point in your program for
+use later in another part of your program.  They can be manipulated
+entirely within the program text, and they can also be assigned values
+on the @command{awk} command line.
+
+@menu
+* Using Variables::             Using variables in your programs.
+* Assignment Options::          Setting variables on the command line and a
+                                summary of command-line syntax. This is an
+                                advanced method of input.
+@end menu
+
+@node Using Variables
+@subsubsection Using Variables in a Program
+
+Variables let you give names to values and refer to them later.  Variables
+have already been used in many of the examples.  The name of a variable
+must be a sequence of letters, digits, or underscores, and it may not begin
+with a digit.
+Here, a @dfn{letter} is any one of the 52 upper- and lowercase
+English letters.  Other characters that may be defined as letters
+in non-English locales are not valid in variable names.
+Case is significant in variable names; @code{a} and @code{A}
+are distinct variables.
+
+A variable name is a valid expression by itself; it represents the
+variable's current value.  Variables are given new values with
+@dfn{assignment operators}, @dfn{increment operators}, and
+@dfn{decrement operators}
+(@pxref{Assignment Ops}).
+In addition, the @code{sub()} and @code{gsub()} functions can
+change a variable's value, and the @code{match()}, @code{split()},
+and @code{patsplit()} functions can change the contents of their
+array parameters (@pxref{String Functions}).
+
+@cindex variables, built-in
+@cindex variables, initializing
+A few variables have special built-in meanings, such as @code{FS} (the
+field separator) and @code{NF} (the number of fields in the current input
+record).  @xref{Built-in Variables} for a list of the predefined variables.
+These predefined variables can be used and assigned just like all other
+variables, but their values are also used or changed automatically by
+@command{awk}.  All predefined variables' names are entirely uppercase.
+
+Variables in @command{awk} can be assigned either numeric or string values.
+The kind of value a variable holds can change over the life of a program.
+By default, variables are initialized to the empty string, which
+is zero if converted to a number.  There is no need to explicitly
+initialize a variable in @command{awk},
+which is what you would do in C and in most other traditional languages.
+
+@node Assignment Options
+@subsubsection Assigning Variables on the Command Line
+@cindex variables, assigning on command line
+@cindex command line, variables@comma{} assigning on
+
+Any @command{awk} variable can be set by including a @dfn{variable assignment}
+among the arguments on the command line when @command{awk} is invoked
+(@pxref{Other Arguments}).
+Such an assignment has the following form:
+
+@example
+@var{variable}=@var{text}
+@end example
+
+@cindex @option{-v} option
+@noindent
+With it, a variable is set either at the beginning of the
+@command{awk} run or in between input files.
+When the assignment is preceded with the @option{-v} option,
+as in the following:
+
+@example
+-v @var{variable}=@var{text}
+@end example
+
+@noindent
+the variable is set at the very beginning, even before the
+@code{BEGIN} rules execute.  The @option{-v} option and its assignment
+must precede all the @value{FN} arguments, as well as the program text.
+(@xref{Options} for more information about
+the @option{-v} option.)
+Otherwise, the variable assignment is performed at a time determined by
+its position among the input file arguments---after the processing of the
+preceding input file argument.  For example:
+
+@example
+awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list
+@end example
+
+@noindent
+prints the value of field number @code{n} for all input records.  Before
+the first file is read, the command line sets the variable @code{n}
+equal to four.  This causes the fourth field to be printed in lines from
+@file{inventory-shipped}.  After the first file has finished,
+but before the second file is started, @code{n} is set to two, so that the
+second field is printed in lines from @file{mail-list}:
+
+@example
+$ @kbd{awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list}
+@print{} 15
+@print{} 24
+@dots{}
+@print{} 555-5553
+@print{} 555-3412
+@dots{}
+@end example
+
+@cindex dark corner, command-line arguments
+Command-line arguments are made available for explicit examination by
+the @command{awk} program in the @code{ARGV} array
+(@pxref{ARGC and ARGV}).
+@command{awk} processes the values of command-line assignments for escape
+sequences
+(@pxref{Escape Sequences}).
+@value{DARKCORNER}
+
+Normally, variables assigned on the command line (with or without the
+@option{-v} option) are treated as strings.  When such variables are
+used as numbers, @command{awk}'s normal automatic conversion of strings
+to numbers takes place, and everything ``just works.''
+
+However, @command{gawk} supports variables whose types are ``regexp''.
+You can assign variables of this type using the following syntax:
+
+@example
+gawk -v 're1=@/foo|bar/' '@dots{}' /path/to/file1 're2=@/baz|quux/' /path/to/file2
+@end example
+
+@noindent
+Strongly typed regexps are an advanced feature (@pxref{Strong Regexp Constants}).
+We mention them here only for completeness.
+
+@node Conversion
+@subsection Conversion of Strings and Numbers
+
+Number-to-string and string-to-number conversion are generally
+straightforward.  There can be subtleties to be aware of;
+this @value{SECTION} discusses this important facet of @command{awk}.
+
+@menu
+* Strings And Numbers::         How @command{awk} Converts Between Strings And
+                                Numbers.
+* Locale influences conversions:: How the locale may affect conversions.
+@end menu
+
+@node Strings And Numbers
+@subsubsection How @command{awk} Converts Between Strings and Numbers
+
+@cindex converting, strings to numbers
+@cindex strings, converting
+@cindex numbers, converting
+@cindex converting, numbers to strings
+Strings are converted to numbers and numbers are converted to strings, if the context
+of the @command{awk} program demands it.  For example, if the value of
+either @code{foo} or @code{bar} in the expression @samp{foo + bar}
+happens to be a string, it is converted to a number before the addition
+is performed.  If numeric values appear in string concatenation, they
+are converted to strings.  Consider the following:
+
+@example
+@group
+two = 2; three = 3
+print (two three) + 4
+@end group
+@end example
+
+@noindent
+This prints the (numeric) value 27.  The numeric values of
+the variables @code{two} and @code{three} are converted to strings and
+concatenated together.  The resulting string is converted back to the
+number 23, to which 4 is then added.
+
+@cindex null strings, converting numbers to strings
+@cindex type conversion
+If, for some reason, you need to force a number to be converted to a
+string, concatenate that number with the empty string, @code{""}.
+To force a string to be converted to a number, add zero to that string.
+A string is converted to a number by interpreting any numeric prefix
+of the string as numerals:
+@code{"2.5"} converts to 2.5, @code{"1e3"} converts to 1,000, and @code{"25fix"}
+has a numeric value of 25.
+Strings that can't be interpreted as valid numbers convert to zero.
+
+@cindex @code{CONVFMT} variable
+The exact manner in which numbers are converted into strings is controlled
+by the @command{awk} predefined variable @code{CONVFMT} (@pxref{Built-in Variables}).
+Numbers are converted using the @code{sprintf()} function
+with @code{CONVFMT} as the format
+specifier
+(@pxref{String Functions}).
+
+@code{CONVFMT}'s default value is @code{"%.6g"}, which creates a value with
+at most six significant digits.  For some applications, you might want to
+change it to specify more precision.
+On most modern machines,
+17 digits is usually enough to capture a floating-point number's
+value exactly.@footnote{Pathological cases can require up to
+752 digits (!), but we doubt that you need to worry about this.}
+
+@cindex dark corner, @code{CONVFMT} variable
+Strange results can occur if you set @code{CONVFMT} to a string that doesn't
+tell @code{sprintf()} how to format floating-point numbers in a useful way.
+For example, if you forget the @samp{%} in the format, @command{awk} converts
+all numbers to the same constant string.
+
+As a special case, if a number is an integer, then the result of converting
+it to a string is @emph{always} an integer, no matter what the value of
+@code{CONVFMT} may be.  Given the following code fragment:
+
+@example
+CONVFMT = "%2.2f"
+a = 12
+b = a ""
+@end example
+
+@noindent
+@code{b} has the value @code{"12"}, not @code{"12.00"}.
+@value{DARKCORNER}
+
+@sidebar Pre-POSIX @command{awk} Used @code{OFMT} for String Conversion
+@cindex POSIX @command{awk}, @code{OFMT} variable and
+@cindex @code{OFMT} variable
+@cindex portability, new @command{awk} vs.@: old @command{awk}
+@cindex @command{awk}, new vs.@: old, @code{OFMT} variable
+Prior to the POSIX standard, @command{awk} used the value
+of @code{OFMT} for converting numbers to strings.  @code{OFMT}
+specifies the output format to use when printing numbers with @code{print}.
+@code{CONVFMT} was introduced in order to separate the semantics of
+conversion from the semantics of printing.  Both @code{CONVFMT} and
+@code{OFMT} have the same default value: @code{"%.6g"}.  In the vast majority
+of cases, old @command{awk} programs do not change their behavior.
+@xref{Print} for more information on the @code{print} statement.
+@end sidebar
+
+@node Locale influences conversions
+@subsubsection Locales Can Influence Conversion
+
+Where you are can matter when it comes to converting between numbers and
+strings.  The local character set and language---the @dfn{locale}---can
+affect numeric formats.  In particular, for @command{awk} programs,
+it affects the decimal point character and the thousands-separator
+character.  The @code{"C"} locale, and most English-language locales,
+use the period character (@samp{.}) as the decimal point and don't
+have a thousands separator.  However, many (if not most) European and
+non-English locales use the comma (@samp{,}) as the decimal point
+character. European locales often use either a space or a period as
+the thousands separator, if they have one.
+
+@cindex dark corner, locale's decimal point character
+The POSIX standard says that @command{awk} always uses the period as the decimal
+point when reading the @command{awk} program source code, and for
+command-line variable assignments (@pxref{Other Arguments}).  However,
+when interpreting input data, for @code{print} and @code{printf} output,
+and for number-to-string conversion, the local decimal point character
+is used.  @value{DARKCORNER} In all cases, numbers in source code and
+in input data cannot have a thousands separator.  Here are some examples
+indicating the difference in behavior, on a GNU/Linux system:
+
+@example
+$ @kbd{export POSIXLY_CORRECT=1}                        @ii{Force POSIX behavior}
+$ @kbd{gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
+@print{} 3.14159
+$ @kbd{LC_ALL=en_DK.utf-8 gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
+@print{} 3,14159
+$ @kbd{echo 4,321 | gawk '@{ print $1 + 1 @}'}
+@print{} 5
+$ @kbd{echo 4,321 | LC_ALL=en_DK.utf-8 gawk '@{ print $1 + 1 @}'}
+@print{} 5,321
+@end example
+
+@noindent
+The @code{en_DK.utf-8} locale is for English in Denmark, where the comma acts as
+the decimal point separator.  In the normal @code{"C"} locale, @command{gawk}
+treats @samp{4,321} as 4, while in the Danish locale, it's treated
+as the full number including the fractional part, 4.321.
+
+Some earlier versions of @command{gawk} fully complied with this aspect
+of the standard.  However, many users in non-English locales complained
+about this behavior, because their data used a period as the decimal
+point, so the default behavior was restored to use a period as the
+decimal point character.  You can use the @option{--use-lc-numeric}
+option (@pxref{Options}) to force @command{gawk} to use the locale's
+decimal point character.  (@command{gawk} also uses the locale's decimal
+point character when in POSIX mode, either via @option{--posix} or the
+@env{POSIXLY_CORRECT} environment variable, as shown previously.)
+
+@ref{table-locale-affects} describes the cases in which the locale's decimal
+point character is used and when a period is used. Some of these
+features have not been described yet.
+
+@float Table,table-locale-affects
+@caption{Locale decimal point versus a period}
+@multitable @columnfractions .15 .20 .45
+@headitem Feature @tab Default @tab @option{--posix} or @option{--use-lc-numeric}
+@item @code{%'g} @tab Use locale @tab Use locale
+@item @code{%g} @tab Use period @tab Use locale
+@item Input @tab Use period @tab Use locale
+@item @code{strtonum()} @tab Use period @tab Use locale
+@end multitable
+@end float
+
+Finally, modern-day formal standards and the IEEE standard floating-point
+representation can have an unusual but important effect on the way
+@command{gawk} converts some special string values to numbers.  The details
+are presented in @ref{POSIX Floating Point Problems}.
+
+@node All Operators
+@section Operators: Doing Something with Values
+
+This @value{SECTION} introduces the @dfn{operators} that make use
+of the values provided by constants and variables.
+
+@menu
+* Arithmetic Ops::              Arithmetic operations (@samp{+}, @samp{-},
+                                etc.)
+* Concatenation::               Concatenating strings.
+* Assignment Ops::              Changing the value of a variable or a field.
+* Increment Ops::               Incrementing the numeric value of a variable.
+@end menu
+
+@node Arithmetic Ops
+@subsection Arithmetic Operators
+@cindex arithmetic operators
+@cindex operators, arithmetic
+@c @cindex addition
+@c @cindex subtraction
+@c @cindex multiplication
+@c @cindex division
+@c @cindex remainder
+@c @cindex quotient
+@c @cindex exponentiation
+
+The @command{awk} language uses the common arithmetic operators when
+evaluating expressions.  All of these arithmetic operators follow normal
+precedence rules and work as you would expect them to.
+
+The following example uses a file named @file{grades}, which contains
+a list of student names as well as three test scores per student (it's
+a small class):
+
+@example
+Pat   100 97 58
+Sandy  84 72 93
+Chris  72 92 89
+@end example
+
+@noindent
+This program takes the file @file{grades} and prints the average
+of the scores:
+
+@example
+$ @kbd{awk '@{ sum = $2 + $3 + $4 ; avg = sum / 3}
+>        @kbd{print $1, avg @}' grades}
+@print{} Pat 85
+@print{} Sandy 83
+@print{} Chris 84.3333
+@end example
+
+The following list provides the arithmetic operators in @command{awk},
+in order from the highest precedence to the lowest:
+
+@table @code
+@cindex common extensions, @code{**} operator
+@cindex extensions, common@comma{} @code{**} operator
+@cindex POSIX @command{awk}, arithmetic operators and
+@item @var{x} ^ @var{y}
+@itemx @var{x} ** @var{y}
+Exponentiation; @var{x} raised to the @var{y} power.  @samp{2 ^ 3} has
+the value eight; the character sequence @samp{**} is equivalent to
+@samp{^}. @value{COMMONEXT}
+
+@item - @var{x}
+Negation.
+
+@item + @var{x}
+Unary plus; the expression is converted to a number.
+
+@item @var{x} * @var{y}
+Multiplication.
+
+@cindex troubleshooting, division
+@cindex division
+@item @var{x} / @var{y}
+Division;  because all numbers in @command{awk} are floating-point
+numbers, the result is @emph{not} rounded to an integer---@samp{3 / 4} has
+the value 0.75.  (It is a common mistake, especially for C programmers,
+to forget that @emph{all} numbers in @command{awk} are floating point,
+and that division of integer-looking constants produces a real number,
+not an integer.)
+
+@item @var{x} % @var{y}
+Remainder; further discussion is provided in the text, just
+after this list.
+
+@item @var{x} + @var{y}
+Addition.
+
+@item @var{x} - @var{y}
+Subtraction.
+@end table
+
+Unary plus and minus have the same precedence,
+the multiplication operators all have the same precedence, and
+addition and subtraction have the same precedence.
+
+@cindex differences in @command{awk} and @command{gawk}, trunc-mod operation
+@cindex trunc-mod operation
+When computing the remainder of @samp{@var{x} % @var{y}},
+the quotient is rounded toward zero to an integer and
+multiplied by @var{y}. This result is subtracted from @var{x};
+this operation is sometimes known as ``trunc-mod.''  The following
+relation always holds:
+
+@example
+b * int(a / b) + (a % b) == a
+@end example
+
+One possibly undesirable effect of this definition of remainder is that
+@samp{@var{x} % @var{y}} is negative if @var{x} is negative.  Thus:
+
+@example
+-17 % 8 = -1
+@end example
+
+In other @command{awk} implementations, the signedness of the remainder
+may be machine-dependent.
+@c FIXME !!! what does posix say?
+
+@cindex portability, @code{**} operator and
+@cindex @code{*} (asterisk), @code{**} operator
+@cindex asterisk (@code{*}), @code{**} operator
+@quotation NOTE
+The POSIX standard only specifies the use of @samp{^}
+for exponentiation.
+For maximum portability, do not use the @samp{**} operator.
+@end quotation
+
+@node Concatenation
+@subsection String Concatenation
+@cindex Kernighan, Brian
+@quotation
+@i{It seemed like a good idea at the time.}
+@author Brian Kernighan
+@end quotation
+
+@cindex string operators
+@cindex operators, string
+@cindex concatenating
+There is only one string operation: concatenation.  It does not have a
+specific operator to represent it.  Instead, concatenation is performed by
+writing expressions next to one another, with no operator.  For example:
+
+@example
+$ @kbd{awk '@{ print "Field number one: " $1 @}' mail-list}
+@print{} Field number one: Amelia
+@print{} Field number one: Anthony
+@dots{}
+@end example
+
+Without the space in the string constant after the @samp{:}, the line
+runs together.  For example:
+
+@example
+$ @kbd{awk '@{ print "Field number one:" $1 @}' mail-list}
+@print{} Field number one:Amelia
+@print{} Field number one:Anthony
+@dots{}
+@end example
+
+@cindex troubleshooting, string concatenation
+Because string concatenation does not have an explicit operator, it is
+often necessary to ensure that it happens at the right time by using
+parentheses to enclose the items to concatenate.  For example,
+you might expect that the
+following code fragment concatenates @code{file} and @code{name}:
+
+@example
+file = "file"
+name = "name"
+print "something meaningful" > file name
+@end example
+
+@cindex Brian Kernighan's @command{awk}
+@cindex @command{mawk} utility
+@noindent
+This produces a syntax error with some versions of Unix
+@command{awk}.@footnote{It happens that BWK
+@command{awk}, @command{gawk}, and @command{mawk} all ``get it right,''
+but you should not rely on this.}
+It is necessary to use the following:
+
+@example
+print "something meaningful" > (file name)
+@end example
+
+@cindex order of evaluation, concatenation
+@cindex evaluation order, concatenation
+@cindex side effects
+Parentheses should be used around concatenation in all but the
+most common contexts, such as on the righthand side of @samp{=}.
+Be careful about the kinds of expressions used in string concatenation.
+In particular, the order of evaluation of expressions used for concatenation
+is undefined in the @command{awk} language.  Consider this example:
+
+@example
+BEGIN @{
+    a = "don't"
+    print (a " " (a = "panic"))
+@}
+@end example
+
+@noindent
+It is not defined whether the second assignment to @code{a} happens
+before or after the value of @code{a} is retrieved for producing the
+concatenated value.  The result could be either @samp{don't panic},
+or @samp{panic panic}.
+@c see test/nasty.awk for a worse example
+
+The precedence of concatenation, when mixed with other operators, is often
+counter-intuitive.  Consider this example:
+
+@ignore
+> To: bug-gnu-utils@@gnu.org
+> CC: arnold@@gnu.org
+> Subject: gawk 3.0.4 bug with {print -12 " " -24}
+> From: Russell Schulz <Russell_Schulz@locutus.ofB.ORG>
+> Date: Tue, 8 Feb 2000 19:56:08 -0700
+>
+> gawk 3.0.4 on NT gives me:
+>
+> prompt> cat bad.awk
+> BEGIN { print -12 " " -24; }
+>
+> prompt> gawk -f bad.awk
+> -12-24
+>
+> when I would expect
+>
+> -12 -24
+>
+> I have not investigated the source, or other implementations.  The
+> bug is there on my NT and DOS versions 2.15.6 .
+@end ignore
+
+@example
+$ @kbd{awk 'BEGIN @{ print -12 " " -24 @}'}
+@print{} -12-24
+@end example
+
+This ``obviously'' is concatenating @minus{}12, a space, and @minus{}24.
+But where did the space disappear to?
+The answer lies in the combination of operator precedences and
+@command{awk}'s automatic conversion rules.  To get the desired result,
+write the program this way:
+
+@example
+$ @kbd{awk 'BEGIN @{ print -12 " " (-24) @}'}
+@print{} -12 -24
+@end example
+
+This forces @command{awk} to treat the @samp{-} on the @samp{-24} as unary.
+Otherwise, it's parsed as follows:
+
+@display
+    @minus{}12 (@code{"@ "} @minus{} 24)
+@result{} @minus{}12 (0 @minus{} 24)
+@result{} @minus{}12 (@minus{}24)
+@result{} @minus{}12@minus{}24
+@end display
+
+As mentioned earlier,
+when mixing concatenation with other operators, @emph{parenthesize}.  Otherwise,
+you're never quite sure what you'll get.
+
+@node Assignment Ops
+@subsection Assignment Expressions
+@cindex assignment operators
+@cindex operators, assignment
+@cindex expressions, assignment
+@cindex @code{=} (equals sign), @code{=} operator
+@cindex equals sign (@code{=}), @code{=} operator
+An @dfn{assignment} is an expression that stores a (usually different)
+value into a variable.  For example, let's assign the value one to the variable
+@code{z}:
+
+@example
+z = 1
+@end example
+
+After this expression is executed, the variable @code{z} has the value one.
+Whatever old value @code{z} had before the assignment is forgotten.
+
+Assignments can also store string values.  For example, the
+following stores
+the value @code{"this food is good"} in the variable @code{message}:
+
+@example
+thing = "food"
+predicate = "good"
+message = "this " thing " is " predicate
+@end example
+
+@noindent
+@cindex side effects, assignment expressions
+This also illustrates string concatenation.
+The @samp{=} sign is called an @dfn{assignment operator}.  It is the
+simplest assignment operator because the value of the righthand
+operand is stored unchanged.
+Most operators (addition, concatenation, and so on) have no effect
+except to compute a value.  If the value isn't used, there's no reason to
+use the operator.  An assignment operator is different; it does
+produce a value, but even if you ignore it, the assignment still
+makes itself felt through the alteration of the variable.  We call this
+a @dfn{side effect}.
+
+@cindex lvalues/rvalues
+@cindex rvalues/lvalues
+@cindex assignment operators, lvalues/rvalues
+@cindex operators, assignment
+The lefthand operand of an assignment need not be a variable
+(@pxref{Variables}); it can also be a field
+(@pxref{Changing Fields}) or
+an array element (@pxref{Arrays}).
+These are all called @dfn{lvalues},
+which means they can appear on the lefthand side of an assignment operator.
+The righthand operand may be any expression; it produces the new value
+that the assignment stores in the specified variable, field, or array
+element. (Such values are called @dfn{rvalues}.)
+
+@cindex variables, types of
+It is important to note that variables do @emph{not} have permanent types.
+A variable's type is simply the type of whatever value was last assigned
+to it.  In the following program fragment, the variable
+@code{foo} has a numeric value at first, and a string value later on:
+
+@example
+@group
+foo = 1
+print foo
+@end group
+@group
+foo = "bar"
+print foo
+@end group
+@end example
+
+@noindent
+When the second assignment gives @code{foo} a string value, the fact that
+it previously had a numeric value is forgotten.
+
+String values that do not begin with a digit have a numeric value of
+zero. After executing the following code, the value of @code{foo} is five:
+
+@example
+foo = "a string"
+foo = foo + 5
+@end example
+
+@quotation NOTE
+Using a variable as a number and then later as a string
+can be confusing and is poor programming style.  The previous two examples
+illustrate how @command{awk} works, @emph{not} how you should write your
+programs!
+@end quotation
+
+An assignment is an expression, so it has a value---the same value that
+is assigned.  Thus, @samp{z = 1} is an expression with the value one.
+One consequence of this is that you can write multiple assignments together,
+such as:
+
+@example
+x = y = z = 5
+@end example
+
+@noindent
+This example stores the value five in all three variables
+(@code{x}, @code{y}, and @code{z}).
+It does so because the
+value of @samp{z = 5}, which is five, is stored into @code{y} and then
+the value of @samp{y = z = 5}, which is five, is stored into @code{x}.
+
+Assignments may be used anywhere an expression is called for.  For
+example, it is valid to write @samp{x != (y = 1)} to set @code{y} to one,
+and then test whether @code{x} equals one.  But this style tends to make
+programs hard to read; such nesting of assignments should be avoided,
+except perhaps in a one-shot program.
+
+@cindex @code{+} (plus sign), @code{+=} operator
+@cindex plus sign (@code{+}), @code{+=} operator
+Aside from @samp{=}, there are several other assignment operators that
+do arithmetic with the old value of the variable.  For example, the
+operator @samp{+=} computes a new value by adding the righthand value
+to the old value of the variable.  Thus, the following assignment adds
+five to the value of @code{foo}:
+
+@example
+foo += 5
+@end example
+
+@noindent
+This is equivalent to the following:
+
+@example
+foo = foo + 5
+@end example
+
+@noindent
+Use whichever makes the meaning of your program clearer.
+
+There are situations where using @samp{+=} (or any assignment operator)
+is @emph{not} the same as simply repeating the lefthand operand in the
+righthand expression.  For example:
+
+@cindex Rankin, Pat
+@example
+@group
+# Thanks to Pat Rankin for this example
+BEGIN  @{
+    foo[rand()] += 5
+    for (x in foo)
+       print x, foo[x]
+@end group
+
+@group
+    bar[rand()] = bar[rand()] + 5
+    for (x in bar)
+       print x, bar[x]
+@}
+@end group
+@end example
+
+@cindex operators, assignment, evaluation order
+@cindex assignment operators, evaluation order
+@noindent
+The indices of @code{bar} are practically guaranteed to be different, because
+@code{rand()} returns different values each time it is called.
+(Arrays and the @code{rand()} function haven't been covered yet.
+@xref{Arrays},
+and
+@ifnotdocbook
+@pxref{Numeric Functions}
+@end ifnotdocbook
+@ifdocbook
+@ref{Numeric Functions}
+@end ifdocbook
+for more information.)
+This example illustrates an important fact about assignment
+operators: the lefthand expression is only evaluated @emph{once}.
+
+It is up to the implementation as to which expression is evaluated
+first, the lefthand or the righthand.
+Consider this example:
+
+@example
+i = 1
+a[i += 2] = i + 1
+@end example
+
+@noindent
+The value of @code{a[3]} could be either two or four.
+
+@ref{table-assign-ops} lists the arithmetic assignment operators.  In each
+case, the righthand operand is an expression whose value is converted
+to a number.
+
+@cindex @code{-} (hyphen), @code{-=} operator
+@cindex hyphen (@code{-}), @code{-=} operator
+@cindex @code{*} (asterisk), @code{*=} operator
+@cindex asterisk (@code{*}), @code{*=} operator
+@cindex @code{/} (forward slash), @code{/=} operator
+@cindex forward slash (@code{/}), @code{/=} operator
+@cindex @code{%} (percent sign), @code{%=} operator
+@cindex percent sign (@code{%}), @code{%=} operator
+@cindex @code{^} (caret), @code{^=} operator
+@cindex caret (@code{^}), @code{^=} operator
+@cindex @code{*} (asterisk), @code{**=} operator
+@cindex asterisk (@code{*}), @code{**=} operator
+@float Table,table-assign-ops
+@caption{Arithmetic assignment operators}
+@multitable @columnfractions .30 .70
+@headitem Operator @tab Effect
+@item @var{lvalue} @code{+=} @var{increment} @tab Add @var{increment} to the value of @var{lvalue}.
+@item @var{lvalue} @code{-=} @var{decrement} @tab Subtract @var{decrement} from the value of @var{lvalue}.
+@item @var{lvalue} @code{*=} @var{coefficient} @tab Multiply the value of @var{lvalue} by @var{coefficient}.
+@item @var{lvalue} @code{/=} @var{divisor} @tab Divide the value of @var{lvalue} by @var{divisor}.
+@item @var{lvalue} @code{%=} @var{modulus} @tab Set @var{lvalue} to its remainder by @var{modulus}.
+@cindex common extensions, @code{**=} operator
+@cindex extensions, common@comma{} @code{**=} operator
+@cindex @command{awk} language, POSIX version
+@cindex POSIX @command{awk}
+@item @var{lvalue} @code{^=} @var{power} @tab Raise @var{lvalue} to the power @var{power}.
+@item @var{lvalue} @code{**=} @var{power} @tab Raise @var{lvalue} to the power @var{power}. @value{COMMONEXT}
+@end multitable
+@end float
+
+@cindex POSIX @command{awk}, @code{**=} operator and
+@cindex portability, @code{**=} operator and
+@quotation NOTE
+Only the @samp{^=} operator is specified by POSIX.
+For maximum portability, do not use the @samp{**=} operator.
+@end quotation
+
+@sidebar Syntactic Ambiguities Between @samp{/=} and Regular Expressions
+@cindex dark corner, regexp constants, @code{/=} operator and
+@cindex @code{/} (forward slash), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant
+@cindex forward slash (@code{/}), @code{/=} operator, vs. @code{/=@dots{}/} regexp constant
+@cindex regexp constants, @code{/=@dots{}/}, @code{/=} operator and
+
+@c derived from email from  "Nelson H. F. Beebe" <beebe@math.utah.edu>
+@c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT)
+
+@cindex dark corner, @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+@cindex ambiguity, syntactic: @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+@cindex syntactic ambiguity: @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+@cindex @code{/=} operator vs. @code{/=@dots{}/} regexp constant
+There is a syntactic ambiguity between the @code{/=} assignment
+operator and regexp constants whose first character is an @samp{=}.
+@value{DARKCORNER}
+This is most notable in some commercial @command{awk} versions.
+For example:
+
+@example
+$ @kbd{awk /==/ /dev/null}
+@error{} awk: syntax error at source line 1
+@error{}  context is
+@error{}         >>> /= <<<
+@error{} awk: bailing out at source line 1
+@end example
+
+@noindent
+A workaround is:
+
+@example
+awk '/[=]=/' /dev/null
+@end example
+
+@command{gawk} does not have this problem; BWK @command{awk}
+and @command{mawk} also do not.
+@end sidebar
+
+@node Increment Ops
+@subsection Increment and Decrement Operators
+
+@cindex increment operators
+@cindex operators, decrement/increment
+@dfn{Increment} and @dfn{decrement operators} increase or decrease the value of
+a variable by one.  An assignment operator can do the same thing, so
+the increment operators add no power to the @command{awk} language; however, they
+are convenient abbreviations for very common operations.
+
+@cindex side effects
+@cindex @code{+} (plus sign), @code{++} operator
+@cindex plus sign (@code{+}), @code{++} operator
+@cindex side effects, decrement/increment operators
+The operator used for adding one is written @samp{++}.  It can be used to increment
+a variable either before or after taking its value.
+To @dfn{pre-increment} a variable @code{v}, write @samp{++v}.  This adds
+one to the value of @code{v}---that new value is also the value of the
+expression. (The assignment expression @samp{v += 1} is completely equivalent.)
+Writing the @samp{++} after the variable specifies @dfn{post-increment}.  This
+increments the variable value just the same; the difference is that the
+value of the increment expression itself is the variable's @emph{old}
+value.  Thus, if @code{foo} has the value four, then the expression @samp{foo++}
+has the value four, but it changes the value of @code{foo} to five.
+In other words, the operator returns the old value of the variable,
+but with the side effect of incrementing it.
+
+The post-increment @samp{foo++} is nearly the same as writing @samp{(foo
++= 1) - 1}.  It is not perfectly equivalent because all numbers in
+@command{awk} are floating point---in floating point, @samp{foo + 1 - 1} does
+not necessarily equal @code{foo}.  But the difference is minute as
+long as you stick to numbers that are fairly small (less than
+@iftex
+@math{10^{12}}).
+@end iftex
+@ifinfo
+10e12).
+@end ifinfo
+@ifnottex
+@ifnotinfo
+10@sup{12}).
+@end ifnotinfo
+@end ifnottex
+
+@cindex @code{$} (dollar sign), incrementing fields and arrays
+@cindex dollar sign (@code{$}), incrementing fields and arrays
+Fields and array elements are incremented
+just like variables.  (Use @samp{$(i++)} when you want to do a field reference
+and a variable increment at the same time.  The parentheses are necessary
+because of the precedence of the field reference operator @samp{$}.)
+
+@cindex decrement operators
+The decrement operator @samp{--} works just like @samp{++}, except that
+it subtracts one instead of adding it.  As with @samp{++}, it can be used before
+the lvalue to pre-decrement or after it to post-decrement.
+Following is a summary of increment and decrement expressions:
+
+@table @code
+@cindex @code{+} (plus sign), @code{++} operator
+@cindex plus sign (@code{+}), @code{++} operator
+@item ++@var{lvalue}
+Increment @var{lvalue}, returning the new value as the
+value of the expression.
+
+@item @var{lvalue}++
+Increment @var{lvalue}, returning the @emph{old} value of @var{lvalue}
+as the value of the expression.
+
+@cindex @code{-} (hyphen), @code{--} operator
+@cindex hyphen (@code{-}), @code{--} operator
+@item --@var{lvalue}
+Decrement @var{lvalue}, returning the new value as the
+value of the expression.
+(This expression is
+like @samp{++@var{lvalue}}, but instead of adding, it subtracts.)
+
+@item @var{lvalue}--
+Decrement @var{lvalue}, returning the @emph{old} value of @var{lvalue}
+as the value of the expression.
+(This expression is
+like @samp{@var{lvalue}++}, but instead of adding, it subtracts.)
+@end table
+
+@sidebar Operator Evaluation Order
+@cindex precedence
+@cindex operators, precedence of
+@cindex portability, operators
+@cindex evaluation order
+@cindex Marx, Groucho
+@quotation
+@i{Doctor, it hurts when I do this!@*
+Then don't do that!}
+@author Groucho Marx
+@end quotation
+
+@noindent
+What happens for something like the following?
+
+@example
+b = 6
+print b += b++
+@end example
+
+@noindent
+Or something even stranger?
+
+@example
+b = 6
+b += ++b + b++
+print b
+@end example
+
+@cindex side effects
+In other words, when do the various side effects prescribed by the
+postfix operators (@samp{b++}) take effect?
+When side effects happen is @dfn{implementation-defined}.
+In other words, it is up to the particular version of @command{awk}.
+The result for the first example may be 12 or 13, and for the second, it
+may be 22 or 23.
+
+In short, doing things like this is not recommended and definitely
+not anything that you can rely upon for portability.
+You should avoid such things in your own programs.
+@c You'll sleep better at night and be able to look at yourself
+@c in the mirror in the morning.
+@end sidebar
+
+@node Truth Values and Conditions
+@section Truth Values and Conditions
+
+In certain contexts, expression values also serve as ``truth values''; i.e.,
+they determine what should happen next as the program runs. This
+@value{SECTION} describes how @command{awk} defines ``true'' and ``false''
+and how values are compared.
+
+@menu
+* Truth Values::                What is ``true'' and what is ``false''.
+* Typing and Comparison::       How variables acquire types and how this
+                                affects comparison of numbers and strings with
+                                @samp{<}, etc.
+* Boolean Ops::                 Combining comparison expressions using boolean
+                                operators @samp{||} (``or''), @samp{&&}
+                                (``and'') and @samp{!} (``not'').
+* Conditional Exp::             Conditional expressions select between two
+                                subexpressions under control of a third
+                                subexpression.
+@end menu
+
+@node Truth Values
+@subsection True and False in @command{awk}
+@cindex truth values
+@cindex logical false/true
+@cindex false, logical
+@cindex true, logical
+
+@cindex null strings
+Many programming languages have a special representation for the concepts
+of ``true'' and ``false.''  Such languages usually use the special
+constants @code{true} and @code{false}, or perhaps their uppercase
+equivalents.
+However, @command{awk} is different.
+It borrows a very simple concept of true and
+false from C.  In @command{awk}, any nonzero numeric value @emph{or} any
+nonempty string value is true.  Any other value (zero or the null
+string, @code{""}) is false.  The following program prints @samp{A strange
+truth value} three times:
+
+@example
+BEGIN @{
+   if (3.1415927)
+       print "A strange truth value"
+   if ("Four Score And Seven Years Ago")
+       print "A strange truth value"
+   if (j = 57)
+       print "A strange truth value"
+@}
+@end example
+
+@cindex dark corner, @code{"0"} is actually true
+There is a surprising consequence of the ``nonzero or non-null'' rule:
+the string constant @code{"0"} is actually true, because it is non-null.
+@value{DARKCORNER}
+
+@node Typing and Comparison
+@subsection Variable Typing and Comparison Expressions
+@quotation
+@i{The Guide is definitive. Reality is frequently inaccurate.}
+@author Douglas Adams, @cite{The Hitchhiker's Guide to the Galaxy}
+@end quotation
+@c 2/2015: Antonio Colombo points out that this is really from
+@c The Restaurant at the End of the Universe. But I'm going to
+@c leave it alone.
+
+@cindex comparison expressions
+@cindex expressions, comparison
+@cindex expressions, matching, See comparison expressions
+@cindex matching, expressions, See comparison expressions
+@cindex relational operators, See comparison operators
+@cindex operators, relational, See operators@comma{} comparison
+@cindex variable typing
+@cindex variables, types of, comparison expressions and
+Unlike in other programming languages, in @command{awk} variables do not have a
+fixed type. Instead, they can be either a number or a string, depending
+upon the value that is assigned to them.
+We look now at how variables are typed, and how @command{awk}
+compares variables.
+
+@menu
+* Variable Typing::             String type versus numeric type.
+* Comparison Operators::        The comparison operators.
+* POSIX String Comparison::     String comparison with POSIX rules.
+@end menu
+
+@node Variable Typing
+@subsubsection String Type versus Numeric Type
+
+Scalar objects in @command{awk} (variables, array elements, and fields)
+are @emph{dynamically} typed.  This means their type can change as the
+program runs, from @dfn{untyped} before any use,@footnote{@command{gawk}
+calls this @dfn{unassigned}, as the following example shows.} to string
+or number, and then from string to number or number to string, as the
+program progresses.  (@command{gawk} also provides regexp-typed scalars,
+but let's ignore that for now; @pxref{Strong Regexp Constants}.)
+
+You can't do much with untyped variables, other than tell that they
+are untyped. The following program tests @code{a} against @code{""}
+and @code{0}; the test succeeds when @code{a} has never been assigned
+a value.  It also uses the built-in @code{typeof()} function
+(not presented yet; @pxref{Type Functions}) to show @code{a}'s type:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print (a == "" && a == 0 ?}
+> @kbd{"a is untyped" : "a has a type!") ; print typeof(a) @}'}
+@print{} a is untyped
+@print{} unassigned
+@end example
+
+A scalar has numeric type when assigned a numeric value,
+such as from a numeric constant, or from another scalar
+with numeric type:
+
+@example
+$ @kbd{gawk 'BEGIN @{ a = 42 ; print typeof(a)}
+> @kbd{b = a ; print typeof(b) @}'}
+number
+number
+@end example
+
+Similarly, a scalar has string type when assigned a string
+value, such as from a string constant, or from another scalar
+with string type:
+
+@example
+$ @kbd{gawk 'BEGIN @{ a = "forty two" ; print typeof(a)}
+> @kbd{b = a ; print typeof(b) @}'}
+string
+string
+@end example
+
+So far, this is all simple and straightforward.  What happens, though,
+when @command{awk} has to process data from a user?  Let's start with
+field data.  What should the following command produce as output?
+
+@example
+echo hello | awk '@{ printf("%s %s < 42\n", $1,
+                           ($1 < 42 ? "is" : "is not")) @}'
+@end example
+
+@noindent
+Since @samp{hello} is alphabetic data, @command{awk} can only do a string
+comparison.  Internally, it converts @code{42} into @code{"42"} and compares
+the two string values @code{"hello"} and @code{"42"}. Here's the result:
+
+@example
+$ @kbd{echo hello | awk '@{ printf("%s %s < 42\n", $1,}
+> @kbd{                           ($1 < 42 ? "is" : "is not")) @}'}
+@print{} hello is not < 42
+@end example
+
+However, what happens when data from a user @emph{looks like} a number?
+On the one hand, in reality, the input data consists of characters, not
+binary numeric
+values.  But, on the other hand, the data looks numeric, and @command{awk}
+really ought to treat it as such. And indeed, it does:
+
+@example
+$ @kbd{echo 37 | awk '@{ printf("%s %s < 42\n", $1,}
+> @kbd{                        ($1 < 42 ? "is" : "is not")) @}'}
+@print{} 37 is < 42
+@end example
+
+Here are the rules for when @command{awk}
+treats data as a number, and for when it treats data as a string.
+
+@cindex numeric, strings
+@cindex strings, numeric
+@cindex POSIX @command{awk}, numeric strings and
+The POSIX standard uses the term @dfn{numeric string} for input data that
+looks numeric.  The @samp{37} in the previous example is a numeric string.
+So what is the type of a numeric string? Answer: numeric.
+
+The type of a variable is important because the types of two variables
+determine how they are compared.
+Variable typing follows these definitions and rules:
+
+@itemize @value{BULLET}
+@item
+A numeric constant or the result of a numeric operation has the @dfn{numeric}
+attribute.
+
+@item
+A string constant or the result of a string operation has the @dfn{string}
+attribute.
+
+@item
+Fields, @code{getline} input, @code{FILENAME}, @code{ARGV} elements,
+@code{ENVIRON} elements, and the elements of an array created by
+@code{match()}, @code{split()}, and @code{patsplit()} that are numeric
+strings have the @dfn{strnum} attribute.@footnote{Thus, a POSIX
+numeric string and @command{gawk}'s strnum are the same thing.}
+Otherwise, they have
+the @dfn{string} attribute.  Uninitialized variables also have the
+@dfn{strnum} attribute.
+
+@item
+Attributes propagate across assignments but are not changed by
+any use.
+@c (Although a use may cause the entity to acquire an additional
+@c value such that it has both a numeric and string value, this leaves the
+@c attribute unchanged.)
+@c This is important but not relevant
+@end itemize
+
+The last rule is particularly important. In the following program,
+@code{a} has numeric type, even though it is later used in a string
+operation:
+
+@example
+BEGIN @{
+     a = 12.345
+     b = a " is a cute number"
+     print b
+@}
+@end example
+
+When two operands are compared, either string comparison or numeric comparison
+may be used. This depends upon the attributes of the operands, according to the
+following symmetric matrix:
+
+@c thanks to Karl Berry, kb@cs.umb.edu, for major help with TeX tables
+@tex
+\centerline{
+\vbox{\bigskip % space above the table (about 1 linespace)
+% Because we have vertical rules, we can't let TeX insert interline space
+% in its usual way.
+\offinterlineskip
+%
+% Define the table template. & separates columns, and \cr ends the
+% template (and each row). # is replaced by the text of that entry on
+% each row. The template for the first column breaks down like this:
+%   \strut -- a way to make each line have the height and depth
+%             of a normal line of type, since we turned off interline spacing.
+%   \hfil -- infinite glue; has the effect of right-justifying in this case.
+%   #     -- replaced by the text (for instance, `STRNUM', in the last row).
+%   \quad -- about the width of an `M'. Just separates the columns.
+%
+% The second column (\vrule#) is what generates the vertical rule that
+% spans table rows.
+%
+% The doubled && before the next entry means `repeat the following
+% template as many times as necessary on each line' -- in our case, twice.
+%
+% The template itself, \quad#\hfil, left-justifies with a little space before.
+%
+\halign{\strut\hfil#\quad&\vrule#&&\quad#\hfil\cr
+	&&STRING	&NUMERIC	&STRNUM\cr
+% The \omit tells TeX to skip inserting the template for this column on
+% this particular row. In this case, we only want a little extra space
+% to separate the heading row from the rule below it.  the depth 2pt --
+% `\vrule depth 2pt' is that little space.
+\omit	&depth 2pt\cr
+% This is the horizontal rule below the heading. Since it has nothing to
+% do with the columns of the table, we use \noalign to get it in there.
+\noalign{\hrule}
+% Like above, this time a little more space.
+\omit	&depth 4pt\cr
+% The remaining rows have nothing special about them.
+STRING	&&string	&string		&string\cr
+NUMERIC	&&string	&numeric	&numeric\cr
+STRNUM  &&string	&numeric	&numeric\cr
+}}}
+@end tex
+@ifnottex
+@ifnotdocbook
+@verbatim
+        +----------------------------------------------
+        |       STRING          NUMERIC         STRNUM
+--------+----------------------------------------------
+        |
+STRING  |       string          string          string
+        |
+NUMERIC |       string          numeric         numeric
+        |
+STRNUM  |       string          numeric         numeric
+--------+----------------------------------------------
+@end verbatim
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<informaltable>
+<tgroup cols="4">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<colspec colname="3" align="left"/>
+<colspec colname="4" align="left"/>
+<thead>
+<row>
+<entry/>
+<entry>STRING</entry>
+<entry>NUMERIC</entry>
+<entry>STRNUM</entry>
+</row>
+</thead>
+
+<tbody>
+<row>
+<entry><emphasis role="bold">STRING</emphasis></entry>
+<entry>string</entry>
+<entry>string</entry>
+<entry>string</entry>
+</row>
+
+<row>
+<entry><emphasis role="bold">NUMERIC</emphasis></entry>
+<entry>string</entry>
+<entry>numeric</entry>
+<entry>numeric</entry>
+</row>
+
+<row>
+<entry><emphasis role="bold">STRNUM</emphasis></entry>
+<entry>string</entry>
+<entry>numeric</entry>
+<entry>numeric</entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+The basic idea is that user input that looks numeric---and @emph{only}
+user input---should be treated as numeric, even though it is actually
+made of characters and is therefore also a string.
+Thus, for example, the string constant @w{@code{" +3.14"}},
+when it appears in program source code,
+is a string---even though it looks numeric---and
+is @emph{never} treated as a number for comparison
+purposes.
+
+In short, when one operand is a ``pure'' string, such as a string
+constant, then a string comparison is performed.  Otherwise, a
+numeric comparison is performed.
+(The primary difference between a number and a strnum is that
+for strnums @command{gawk} preserves the original string value that
+the scalar had when it came in.)
+
+This point bears additional emphasis:
+Input that looks numeric @emph{is} numeric.
+All other input is treated as strings.
+
+Thus, the six-character input string @w{@samp{ +3.14}} receives the
+strnum attribute. In contrast, the eight characters
+@w{@code{" +3.14"}} appearing in program text comprise a string constant.
+The following examples print @samp{1} when the comparison between
+the two different constants is true, and @samp{0} otherwise:
+
+@c 22.9.2014: Tested with mawk and BWK awk, got same results.
+@example
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == " +3.14") @}'}    @ii{True}
+@print{} 1
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == "+3.14") @}'}     @ii{False}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == "3.14") @}'}      @ii{False}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == 3.14) @}'}        @ii{True}
+@print{} 1
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == " +3.14") @}'}    @ii{False}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == "+3.14") @}'}     @ii{True}
+@print{} 1
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == "3.14") @}'}      @ii{False}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == 3.14) @}'}        @ii{True}
+@print{} 1
+@end example
+
+You can see the type of an input field (or other user input)
+using @code{typeof()}:
+
+@example
+$ @kbd{echo hello 37 | gawk '@{ print typeof($1), typeof($2) @}'}
+@print{} string strnum
+@end example
+
+@node Comparison Operators
+@subsubsection Comparison Operators
+
+@dfn{Comparison expressions} compare strings or numbers for
+relationships such as equality.  They are written using @dfn{relational
+operators}, which are a superset of those in C.
+@ref{table-relational-ops} describes them.
+
+@cindex @code{<} (left angle bracket), @code{<} operator
+@cindex left angle bracket (@code{<}), @code{<} operator
+@cindex @code{<} (left angle bracket), @code{<=} operator
+@cindex left angle bracket (@code{<}), @code{<=} operator
+@cindex @code{>} (right angle bracket), @code{>=} operator
+@cindex right angle bracket (@code{>}), @code{>=} operator
+@cindex @code{>} (right angle bracket), @code{>} operator
+@cindex right angle bracket (@code{>}), @code{>} operator
+@cindex @code{=} (equals sign), @code{==} operator
+@cindex equals sign (@code{=}), @code{==} operator
+@cindex @code{!} (exclamation point), @code{!=} operator
+@cindex exclamation point (@code{!}), @code{!=} operator
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@cindex @code{in} operator
+@float Table,table-relational-ops
+@caption{Relational operators}
+@multitable @columnfractions .25 .75
+@headitem Expression @tab Result
+@item @var{x} @code{<} @var{y} @tab True if @var{x} is less than @var{y}
+@item @var{x} @code{<=} @var{y} @tab True if @var{x} is less than or equal to @var{y}
+@item @var{x} @code{>} @var{y} @tab True if @var{x} is greater than @var{y}
+@item @var{x} @code{>=} @var{y} @tab True if @var{x} is greater than or equal to @var{y}
+@item @var{x} @code{==} @var{y} @tab True if @var{x} is equal to @var{y}
+@item @var{x} @code{!=} @var{y} @tab True if @var{x} is not equal to @var{y}
+@item @var{x} @code{~} @var{y} @tab True if the string @var{x} matches the regexp denoted by @var{y}
+@item @var{x} @code{!~} @var{y} @tab True if the string @var{x} does not match the regexp denoted by @var{y}
+@item @var{subscript} @code{in} @var{array} @tab True if the array @var{array} has an element with the subscript @var{subscript}
+@end multitable
+@end float
+
+Comparison expressions have the value one if true and zero if false.
+When comparing operands of mixed types, numeric operands are converted
+to strings using the value of @code{CONVFMT}
+(@pxref{Conversion}).
+
+Strings are compared
+by comparing the first character of each, then the second character of each,
+and so on.  Thus, @code{"10"} is less than @code{"9"}.  If there are two
+strings where one is a prefix of the other, the shorter string is less than
+the longer one.  Thus, @code{"abc"} is less than @code{"abcd"}.
+
+@cindex troubleshooting, @code{==} operator
+It is very easy to accidentally mistype the @samp{==} operator and
+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
+@group
+if (a = b)   # oops! should be a == b
+   @dots{}
+else
+   @dots{}
+@end group
+@end example
+
+@noindent
+Unless @code{b} happens to be zero or the null string, the @code{if}
+part of the test always succeeds.  Because the operators are
+so similar, this kind of error is very difficult to spot when
+scanning the source code.
+
+The following list of expressions illustrates the kinds of comparisons
+@command{awk} performs, as well as what the result of each comparison is:
+
+@table @code
+@item 1.5 <= 2.0
+Numeric comparison (true)
+
+@item "abc" >= "xyz"
+String comparison (false)
+
+@item 1.5 != " +2"
+String comparison (true)
+
+@item "1e2" < "3"
+String comparison (true)
+
+@item a = 2; b = "2"
+@itemx a == b
+String comparison (true)
+
+@item a = 2; b = " +2"
+@itemx a == b
+String comparison (false)
+@end table
+
+In this example:
+
+@example
+$ @kbd{echo 1e2 3 | awk '@{ print ($1 < $2) ? "true" : "false" @}'}
+@print{} false
+@end example
+
+@cindex comparison expressions, string vs.@: regexp
+@c @cindex string comparison vs.@: regexp comparison
+@c @cindex regexp comparison vs.@: string comparison
+@noindent
+the result is @samp{false} because both @code{$1} and @code{$2}
+are user input.  They are numeric strings---therefore both have
+the strnum attribute, dictating a numeric comparison.
+The purpose of the comparison rules and the use of numeric strings is
+to attempt to produce the behavior that is ``least surprising,'' while
+still ``doing the right thing.''
+
+String comparisons and regular expression comparisons are very different.
+For example:
+
+@example
+x == "foo"
+@end example
+
+@noindent
+has the value one, or is true if the variable @code{x}
+is precisely @samp{foo}.  By contrast:
+
+@example
+x ~ /foo/
+@end example
+
+@noindent
+has the value one if @code{x} contains @samp{foo}, such as
+@code{"Oh, what a fool am I!"}.
+
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+The righthand operand of the @samp{~} and @samp{!~} operators may be
+either a regexp constant (@code{/}@dots{}@code{/}) or an ordinary
+expression. In the latter case, the value of the expression as a string is used as a
+dynamic regexp (@pxref{Regexp Usage}; also
+@pxref{Computed Regexps}).
+
+@cindex @command{awk}, regexp constants and
+@cindex regexp constants
+A constant regular
+expression in slashes by itself is also an expression.
+@code{/@var{regexp}/} is an abbreviation for the following comparison expression:
+
+@example
+$0 ~ /@var{regexp}/
+@end example
+
+One special place where @code{/foo/} is @emph{not} an abbreviation for
+@samp{$0 ~ /foo/} is when it is the righthand operand of @samp{~} or
+@samp{!~}.
+@xref{Using Constant Regexps},
+where this is discussed in more detail.
+
+@node POSIX String Comparison
+@subsubsection String Comparison Based on Locale Collating Order
+
+The POSIX standard used to say that all string comparisons are
+performed based on the locale's @dfn{collating order}. This
+is the order in which characters sort, as defined by the locale
+(for more discussion, @pxref{Locales}).  This order is usually very
+different from the results obtained when doing straight byte-by-byte
+comparison.@footnote{Technically, string comparison is supposed to behave
+the same way as if the strings were compared with the C @code{strcoll()}
+function.}
+
+Because this behavior differs considerably from existing practice,
+@command{gawk} only implemented it when in POSIX mode (@pxref{Options}).
+Here is an example to illustrate the difference, in an @code{en_US.UTF-8}
+locale:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf("ABC < abc = %s\n",}
+>                     @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
+@print{} ABC < abc = TRUE
+$ @kbd{gawk --posix 'BEGIN @{ printf("ABC < abc = %s\n",}
+>                             @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
+@print{} ABC < abc = FALSE
+@end example
+
+Fortunately, as of August 2016, comparison based on locale
+collating order is no longer required for the @code{==} and @code{!=}
+operators.@footnote{See @uref{http://austingroupbugs.net/view.php?id=1070,
+the Austin Group website}.} However, comparison based on locales is still
+required for @code{<}, @code{<=}, @code{>}, and @code{>=}.  POSIX thus
+recommends as follows:
+
+@quotation
+Since the @code{==} operator checks whether strings are identical,
+not whether they collate equally, applications needing to check whether
+strings collate equally can use:
+
+@example
+a <= b && a >= b
+@end example
+@end quotation
+
+As of @value{PVERSION} 4.2, @command{gawk} continues to use locale
+collating order for @code{<}, @code{<=}, @code{>}, and @code{>=} only
+in POSIX mode.
+
+@ignore
+References: http://austingroupbugs.net/view.php?id=963
+and http://austingroupbugs.net/view.php?id=1070.
+@end ignore
+
+@node Boolean Ops
+@subsection Boolean Expressions
+@cindex and Boolean-logic operator
+@cindex or Boolean-logic operator
+@cindex not Boolean-logic operator
+@cindex expressions, Boolean
+@cindex Boolean expressions
+@cindex operators, Boolean, See Boolean expressions
+@cindex Boolean operators, See Boolean expressions
+@cindex logical operators, See Boolean expressions
+@cindex operators, logical, See Boolean expressions
+
+A @dfn{Boolean expression} is a combination of comparison expressions or
+matching expressions, using the Boolean operators ``or''
+(@samp{||}), ``and'' (@samp{&&}), and ``not'' (@samp{!}), along with
+parentheses to control nesting.  The truth value of the Boolean expression is
+computed by combining the truth values of the component expressions.
+Boolean expressions are also referred to as @dfn{logical expressions}.
+The terms are equivalent.
+
+Boolean expressions can be used wherever comparison and matching
+expressions can be used.  They can be used in @code{if}, @code{while},
+@code{do}, and @code{for} statements
+(@pxref{Statements}).
+They have numeric values (one if true, zero if false) that come into play
+if the result of the Boolean expression is stored in a variable or
+used in arithmetic.
+
+In addition, every Boolean expression is also a valid pattern, so
+you can use one as a pattern to control the execution of rules.
+The Boolean operators are:
+
+@table @code
+@item @var{boolean1} && @var{boolean2}
+True if both @var{boolean1} and @var{boolean2} are true.  For example,
+the following statement prints the current input record if it contains
+both @samp{edu} and @samp{li}:
+
+@example
+if ($0 ~ /edu/ && $0 ~ /li/) print
+@end example
+
+@cindex side effects, Boolean operators
+The subexpression @var{boolean2} is evaluated only if @var{boolean1}
+is true.  This can make a difference when @var{boolean2} contains
+expressions that have side effects. In the case of @samp{$0 ~ /foo/ &&
+($2 == bar++)}, the variable @code{bar} is not incremented if there is
+no substring @samp{foo} in the record.
+
+@item @var{boolean1} || @var{boolean2}
+True if at least one of @var{boolean1} or @var{boolean2} is true.
+For example, the following statement prints all records in the input
+that contain @emph{either} @samp{edu} or
+@samp{li}:
+
+@example
+if ($0 ~ /edu/ || $0 ~ /li/) print
+@end example
+
+The subexpression @var{boolean2} is evaluated only if @var{boolean1}
+is false.  This can make a difference when @var{boolean2} contains
+expressions that have side effects.
+(Thus, this test never really distinguishes records that contain both
+@samp{edu} and @samp{li}---as soon as @samp{edu} is matched,
+the full test succeeds.)
+
+@item ! @var{boolean}
+True if @var{boolean} is false.  For example,
+the following program prints @samp{no home!} in
+the unusual event that the @env{HOME} environment
+variable is not defined:
+
+@example
+BEGIN @{ if (! ("HOME" in ENVIRON))
+            print "no home!" @}
+@end example
+
+(The @code{in} operator is described in
+@ref{Reference to Elements}.)
+@end table
+
+@cindex short-circuit operators
+@cindex operators, short-circuit
+@cindex @code{&} (ampersand), @code{&&} operator
+@cindex ampersand (@code{&}), @code{&&} operator
+@cindex @code{|} (vertical bar), @code{||} operator
+@cindex vertical bar (@code{|}), @code{||} operator
+The @samp{&&} and @samp{||} operators are called @dfn{short-circuit}
+operators because of the way they work.  Evaluation of the full expression
+is ``short-circuited'' if the result can be determined partway through
+its evaluation.
+
+@cindex line continuations
+Statements that end with @samp{&&} or @samp{||} can be continued simply
+by putting a newline after them.  But you cannot put a newline in front
+of either of these operators without using backslash continuation
+(@pxref{Statements/Lines}).
+
+@cindex @code{!} (exclamation point), @code{!}  operator
+@cindex exclamation point (@code{!}), @code{!} operator
+@cindex newlines
+@cindex variables, flag
+@cindex flag variables
+The actual value of an expression using the @samp{!} operator is
+either one or zero, depending upon the truth value of the expression it
+is applied to.
+The @samp{!} operator is often useful for changing the sense of a flag
+variable from false to true and back again. For example, the following
+program is one way to print lines in between special bracketing lines:
+
+@example
+$1 == "START"   @{ interested = ! interested; next @}
+interested      @{ print @}
+$1 == "END"     @{ interested = ! interested; next @}
+@end example
+
+@noindent
+The variable @code{interested}, as with all @command{awk} variables, starts
+out initialized to zero, which is also false.  When a line is seen whose
+first field is @samp{START}, the value of @code{interested} is toggled
+to true, using @samp{!}. The next rule prints lines as long as
+@code{interested} is true.  When a line is seen whose first field is
+@samp{END}, @code{interested} is toggled back to false.@footnote{This
+program has a bug; it prints lines starting with @samp{END}. How
+would you fix it?}
+
+@ignore
+Scott Deifik points out that this program isn't robust against
+bogus input data, but the point is to illustrate the use of `!',
+so we'll leave well enough alone.
+@end ignore
+
+Most commonly, the @samp{!} operator is used in the conditions of
+@code{if} and @code{while} statements, where it often makes more
+sense to phrase the logic in the negative:
+
+@example
+if (! @var{some condition} || @var{some other condition}) @{
+    @var{@dots{} do whatever processing @dots{}}
+@}
+@end example
+
+@cindex @code{next} statement
+@quotation NOTE
+The @code{next} statement is discussed in
+@ref{Next Statement}.
+@code{next} tells @command{awk} to skip the rest of the rules, get the
+next record, and start processing the rules over again at the top.
+The reason it's there is to avoid printing the bracketing
+@samp{START} and @samp{END} lines.
+@end quotation
+
+@node Conditional Exp
+@subsection Conditional Expressions
+@cindex conditional expressions
+@cindex expressions, conditional
+@cindex expressions, selecting
+
+A @dfn{conditional expression} is a special kind of expression that has
+three operands.  It allows you to use one expression's value to select
+one of two other expressions.
+The conditional expression in @command{awk} is the same as in the C
+language, as shown here:
+
+@example
+@var{selector} ? @var{if-true-exp} : @var{if-false-exp}
+@end example
+
+@noindent
+There are three subexpressions.  The first, @var{selector}, is always
+computed first.  If it is ``true'' (not zero or not null), then
+@var{if-true-exp} is computed next, and its value becomes the value of
+the whole expression.  Otherwise, @var{if-false-exp} is computed next,
+and its value becomes the value of the whole expression.
+For example, the following expression produces the absolute value of @code{x}:
+
+@example
+x >= 0 ? x : -x
+@end example
+
+@cindex side effects, conditional expressions
+Each time the conditional expression is computed, only one of
+@var{if-true-exp} and @var{if-false-exp} is used; the other is ignored.
+This is important when the expressions have side effects.  For example,
+this conditional expression examines element @code{i} of either array
+@code{a} or array @code{b}, and increments @code{i}:
+
+@example
+x == y ? a[i++] : b[i++]
+@end example
+
+@noindent
+This is guaranteed to increment @code{i} exactly once, because each time
+only one of the two increment expressions is executed
+and the other is not.
+@xref{Arrays},
+for more information about arrays.
+
+@cindex differences in @command{awk} and @command{gawk}, line continuations
+@cindex line continuations, @command{gawk}
+@cindex @command{gawk}, line continuation in
+As a minor @command{gawk} extension,
+a statement that uses @samp{?:} can be continued simply
+by putting a newline after either character.
+However, putting a newline in front
+of either character does not work without using backslash continuation
+(@pxref{Statements/Lines}).
+If @option{--posix} is specified
+(@pxref{Options}), this extension is disabled.
+
+@node Function Calls
+@section Function Calls
+@cindex function calls
+
+A @dfn{function} is a name for a particular calculation.
+This enables you to
+ask for it by name at any point in the program.  For
+example, the function @code{sqrt()} computes the square root of a number.
+
+@cindex functions, built-in
+A fixed set of functions are @dfn{built in}, which means they are
+available in every @command{awk} program.  The @code{sqrt()} function is one
+of these.  @xref{Built-in} for a list of built-in
+functions and their descriptions.  In addition, you can define
+functions for use in your program.
+@xref{User-defined}
+for instructions on how to do this.
+Finally, @command{gawk} lets you write functions in C or C++
+that may be called from your program (@pxref{Dynamic Extensions}).
+
+@cindex arguments, in function calls
+The way to use a function is with a @dfn{function call} expression,
+which consists of the function name followed immediately by a list of
+@dfn{arguments} in parentheses.  The arguments are expressions that
+provide the raw materials for the function's calculations.
+When there is more than one argument, they are separated by commas.  If
+there are no arguments, just write @samp{()} after the function name.
+The following examples show function calls with and without arguments:
+
+@example
+sqrt(x^2 + y^2)        @ii{one argument}
+atan2(y, x)            @ii{two arguments}
+rand()                 @ii{no arguments}
+@end example
+
+@cindex troubleshooting, function call syntax
+@quotation CAUTION
+Do not put any space between the function name and the opening parenthesis!
+A user-defined function name looks just like the name of a
+variable---a space would make the expression look like concatenation of
+a variable with an expression inside parentheses.
+With built-in functions, space before the parenthesis is harmless, but
+it is best not to get into the habit of using space to avoid mistakes
+with user-defined functions.
+@end quotation
+
+Each function expects a particular number
+of arguments.  For example, the @code{sqrt()} function must be called with
+a single argument, the number of which to take the square root:
+
+@example
+sqrt(@var{argument})
+@end example
+
+Some of the built-in functions have one or
+more optional arguments.
+If those arguments are not supplied, the functions
+use a reasonable default value.
+@xref{Built-in} for full details.  If arguments
+are omitted in calls to user-defined functions, then those arguments are
+treated as local variables. Such local variables act like the
+empty string if referenced where a string value is required,
+and like zero if referenced where a numeric value is required
+(@pxref{User-defined}).
+
+As an advanced feature, @command{gawk} provides indirect function calls,
+which is a way to choose the function to call at runtime, instead of
+when you write the source code to your program. We defer discussion of
+this feature until later; see @ref{Indirect Calls}.
+
+@cindex side effects, function calls
+Like every other expression, the function call has a value, often
+called the @dfn{return value}, which is computed by the function
+based on the arguments you give it.  In this example, the return value
+of @samp{sqrt(@var{argument})} is the square root of @var{argument}.
+The following program reads numbers, one number per line, and prints
+the square root of each one:
+
+@example
+$ @kbd{awk '@{ print "The square root of", $1, "is", sqrt($1) @}'}
+@kbd{1}
+@print{} The square root of 1 is 1
+@kbd{3}
+@print{} The square root of 3 is 1.73205
+@kbd{5}
+@print{} The square root of 5 is 2.23607
+@kbd{Ctrl-d}
+@end example
+
+A function can also have side effects, such as assigning
+values to certain variables or doing I/O.
+This program shows how the @code{match()} function
+(@pxref{String Functions})
+changes the variables @code{RSTART} and @code{RLENGTH}:
+
+@example
+@{
+    if (match($1, $2))
+        print RSTART, RLENGTH
+    else
+        print "no match"
+@}
+@end example
+
+@noindent
+Here is a sample run:
+
+@example
+$ @kbd{awk -f matchit.awk}
+@kbd{aaccdd  c+}
+@print{} 3 2
+@kbd{foo     bar}
+@print{} no match
+@kbd{abcdefg e}
+@print{} 5 1
+@end example
+
+@node Precedence
+@section Operator Precedence (How Operators Nest)
+@cindex precedence
+@cindex operators, precedence
+
+@dfn{Operator precedence} determines how operators are grouped when
+different operators appear close by in one expression.  For example,
+@samp{*} has higher precedence than @samp{+}; thus, @samp{a + b * c}
+means to multiply @code{b} and @code{c}, and then add @code{a} to the
+product (i.e., @samp{a + (b * c)}).
+
+The normal precedence of the operators can be overruled by using parentheses.
+Think of the precedence rules as saying where the
+parentheses are assumed to be.  In
+fact, it is wise to always use parentheses whenever there is an unusual
+combination of operators, because other people who read the program may
+not remember what the precedence is in this case.
+Even experienced programmers occasionally forget the exact rules,
+which leads to mistakes.
+Explicit parentheses help prevent
+any such mistakes.
+
+When operators of equal precedence are used together, the leftmost
+operator groups first, except for the assignment, conditional, and
+exponentiation operators, which group in the opposite order.
+Thus, @samp{a - b + c} groups as @samp{(a - b) + c} and
+@samp{a = b = c} groups as @samp{a = (b = c)}.
+
+Normally the precedence of prefix unary operators does not matter,
+because there is only one way to interpret
+them: innermost first.  Thus, @samp{$++i} means @samp{$(++i)} and
+@samp{++$x} means @samp{++($x)}.  However, when another operator follows
+the operand, then the precedence of the unary operators can matter.
+@samp{$x^2} means @samp{($x)^2}, but @samp{-x^2} means
+@samp{-(x^2)}, because @samp{-} has lower precedence than @samp{^},
+whereas @samp{$} has higher precedence.
+Also, operators cannot be combined in a way that violates the
+precedence rules; for example, @samp{$$0++--} is not a valid
+expression because the first @samp{$} has higher precedence than the
+@samp{++}; to avoid the problem the expression can be rewritten as
+@samp{$($0++)--}.
+
+This list presents @command{awk}'s operators, in order of highest
+to lowest precedence:
+
+@c @asis for docbook to come out right
+@table @asis
+@item @code{(}@dots{}@code{)}
+Grouping.
+
+@cindex @code{$} (dollar sign), @code{$} field operator
+@cindex dollar sign (@code{$}), @code{$} field operator
+@item @code{$}
+Field reference.
+
+@cindex @code{+} (plus sign), @code{++} operator
+@cindex plus sign (@code{+}), @code{++} operator
+@cindex @code{-} (hyphen), @code{--} operator
+@cindex hyphen (@code{-}), @code{--} operator
+@item @code{++ --}
+Increment, decrement.
+
+@cindex @code{^} (caret), @code{^} operator
+@cindex caret (@code{^}), @code{^} operator
+@cindex @code{*} (asterisk), @code{**} operator
+@cindex asterisk (@code{*}), @code{**} operator
+@item @code{^ **}
+Exponentiation.  These operators group right to left.
+
+@cindex @code{+} (plus sign), @code{+} operator
+@cindex plus sign (@code{+}), @code{+} operator
+@cindex @code{-} (hyphen), @code{-} operator
+@cindex hyphen (@code{-}), @code{-} operator
+@cindex @code{!} (exclamation point), @code{!} operator
+@cindex exclamation point (@code{!}), @code{!} operator
+@item @code{+ - !}
+Unary plus, minus, logical ``not.''
+
+@cindex @code{*} (asterisk), @code{*} operator, as multiplication operator
+@cindex asterisk (@code{*}), @code{*} operator, as multiplication operator
+@cindex @code{/} (forward slash), @code{/} operator
+@cindex forward slash (@code{/}), @code{/} operator
+@cindex @code{%} (percent sign), @code{%} operator
+@cindex percent sign (@code{%}), @code{%} operator
+@item @code{* / %}
+Multiplication, division, remainder.
+
+@cindex @code{+} (plus sign), @code{+} operator
+@cindex plus sign (@code{+}), @code{+} operator
+@cindex @code{-} (hyphen), @code{-} operator
+@cindex hyphen (@code{-}), @code{-} operator
+@item @code{+ -}
+Addition, subtraction.
+
+@item String concatenation
+There is no special symbol for concatenation.
+The operands are simply written side by side
+(@pxref{Concatenation}).
+
+@cindex @code{<} (left angle bracket), @code{<} operator
+@cindex left angle bracket (@code{<}), @code{<} operator
+@cindex @code{<} (left angle bracket), @code{<=} operator
+@cindex left angle bracket (@code{<}), @code{<=} operator
+@cindex @code{>} (right angle bracket), @code{>=} operator
+@cindex right angle bracket (@code{>}), @code{>=} operator
+@cindex @code{>} (right angle bracket), @code{>} operator
+@cindex right angle bracket (@code{>}), @code{>} operator
+@cindex @code{=} (equals sign), @code{==} operator
+@cindex equals sign (@code{=}), @code{==} operator
+@cindex @code{!} (exclamation point), @code{!=} operator
+@cindex exclamation point (@code{!}), @code{!=} operator
+@cindex @code{>} (right angle bracket), @code{>>} operator (I/O)
+@cindex right angle bracket (@code{>}), @code{>>} operator (I/O)
+@cindex operators, input/output
+@cindex @code{|} (vertical bar), @code{|} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|} operator (I/O)
+@cindex operators, input/output
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|&} operator (I/O)
+@cindex operators, input/output
+@item @code{< <= == != > >= >> | |&}
+Relational and redirection.
+The relational operators and the redirections have the same precedence
+level.  Characters such as @samp{>} serve both as relationals and as
+redirections; the context distinguishes between the two meanings.
+
+@cindex @code{print} statement, I/O operators in
+@cindex @code{printf} statement, I/O operators in
+Note that the I/O redirection operators in @code{print} and @code{printf}
+statements belong to the statement level, not to expressions.  The
+redirection does not produce an expression that could be the operand of
+another operator.  As a result, it does not make sense to use a
+redirection operator near another operator of lower precedence without
+parentheses.  Such combinations (e.g., @samp{print foo > a ? b : c})
+result in syntax errors.
+The correct way to write this statement is @samp{print foo > (a ? b : c)}.
+
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@item @code{~ !~}
+Matching, nonmatching.
+
+@cindex @code{in} operator
+@item @code{in}
+Array membership.
+
+@cindex @code{&} (ampersand), @code{&&} operator
+@cindex ampersand (@code{&}), @code{&&} operator
+@item @code{&&}
+Logical ``and.''
+
+@cindex @code{|} (vertical bar), @code{||} operator
+@cindex vertical bar (@code{|}), @code{||} operator
+@item @code{||}
+Logical ``or.''
+
+@cindex @code{?} (question mark), @code{?:} operator
+@cindex question mark (@code{?}), @code{?:} operator
+@cindex @code{:} (colon), @code{?:} operator
+@cindex colon (@code{:}), @code{?:} operator
+@item @code{?:}
+Conditional.  This operator groups right to left.
+
+@cindex @code{+} (plus sign), @code{+=} operator
+@cindex plus sign (@code{+}), @code{+=} operator
+@cindex @code{-} (hyphen), @code{-=} operator
+@cindex hyphen (@code{-}), @code{-=} operator
+@cindex @code{*} (asterisk), @code{*=} operator
+@cindex asterisk (@code{*}), @code{*=} operator
+@cindex @code{*} (asterisk), @code{**=} operator
+@cindex asterisk (@code{*}), @code{**=} operator
+@cindex @code{/} (forward slash), @code{/=} operator
+@cindex forward slash (@code{/}), @code{/=} operator
+@cindex @code{%} (percent sign), @code{%=} operator
+@cindex percent sign (@code{%}), @code{%=} operator
+@cindex @code{^} (caret), @code{^=} operator
+@cindex caret (@code{^}), @code{^=} operator
+@item @code{= += -= *= /= %= ^= **=}
+Assignment.  These operators group right to left.
+@end table
+
+@cindex POSIX @command{awk}, @code{**} operator and
+@cindex portability, operators, not in POSIX @command{awk}
+@quotation NOTE
+The @samp{|&}, @samp{**}, and @samp{**=} operators are not specified by POSIX.
+For maximum portability, do not use them.
+@end quotation
+
+@node Locales
+@section Where You Are Makes a Difference
+@cindex locale, definition of
+
+Modern systems support the notion of @dfn{locales}: a way to tell the
+system about the local character set and language.  The ISO C standard
+defines a default @code{"C"} locale, which is an environment that is
+typical of what many C programmers are used to.
+
+Once upon a time, the locale setting used to affect regexp matching,
+but this is no longer true (@pxref{Ranges and Locales}).
+
+Locales can affect record splitting.  For the normal case of @samp{RS =
+"\n"}, the locale is largely irrelevant.  For other single-character
+record separators, setting @samp{LC_ALL=C} in the environment will
+give you much better performance when reading records.  Otherwise,
+@command{gawk} has to make several function calls, @emph{per input
+character}, to find the record terminator.
+
+Locales can affect how dates and times are formatted (@pxref{Time
+Functions}).  For example, a common way to abbreviate the date September
+4, 2015, in the United States is ``9/4/15.''  In many countries in
+Europe, however, it is abbreviated ``4.9.15.''  Thus, the @samp{%x}
+specification in a @code{"US"} locale might produce @samp{9/4/15},
+while in a @code{"EUROPE"} locale, it might produce @samp{4.9.15}.
+
+According to POSIX, string comparison is also affected by locales (similar
+to regular expressions).  The details are presented in @ref{POSIX String
+Comparison}.
+
+Finally, the locale affects the value of the decimal point character
+used when @command{gawk} parses input data.  This is discussed in detail
+in @ref{Conversion}.
+
+@node Expressions Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Expressions are the basic elements of computation in programs.  They are
+built from constants, variables, function calls, and combinations of the
+various kinds of values with operators.
+
+@item
+@command{awk} supplies three kinds of constants: numeric, string, and
+regexp.  @command{gawk} lets you specify numeric constants in octal
+and hexadecimal (bases 8 and 16) as well as decimal (base 10).
+In certain contexts, a standalone regexp constant such as @code{/foo/}
+has the same meaning as @samp{$0 ~ /foo/}.
+
+@item
+Variables hold values between uses in computations. A number of built-in
+variables provide information to your @command{awk} program, and a number
+of others let you control how @command{awk} behaves.
+
+@item
+Numbers are automatically converted to strings, and strings to numbers,
+as needed by @command{awk}. Numeric values are converted as if they were
+formatted with @code{sprintf()} using the format in @code{CONVFMT}.
+Locales can influence the conversions.
+
+@item
+@command{awk} provides the usual arithmetic operators (addition,
+subtraction, multiplication, division, modulus), and unary plus and minus.
+It also provides comparison operators, Boolean operators, an array membership
+testing operator, and regexp
+matching operators.  String concatenation is accomplished by placing
+two expressions next to each other; there is no explicit operator.
+The three-operand @samp{?:} operator provides an ``if-else'' test within
+expressions.
+
+@item
+Assignment operators provide convenient shorthands for common arithmetic
+operations.
+
+@item
+In @command{awk}, a value is considered to be true if it is nonzero
+@emph{or} non-null. Otherwise, the value is false.
+
+@item
+A variable's type is set upon each assignment and may change over its
+lifetime.  The type determines how it behaves in comparisons (string
+or numeric).
+
+@item
+Function calls return a value that may be used as part of a larger
+expression.  Expressions used to pass parameter values are fully
+evaluated before the function is called.  @command{awk} provides
+built-in and user-defined functions; this is described in
+@ref{Functions}.
+
+@item
+Operator precedence specifies the order in which operations are performed,
+unless explicitly overridden by parentheses.  @command{awk}'s operator
+precedence is compatible with that of C.
+
+@item
+Locales can affect the format of data as output by an @command{awk}
+program, and occasionally the format for data read as input.
+
+@end itemize
+
+
+@node Patterns and Actions
+@chapter Patterns, Actions, and Variables
+@cindex patterns
+
+As you have already seen, each @command{awk} statement consists of
+a pattern with an associated action.  This @value{CHAPTER} describes how
+you build patterns and actions, what kinds of things you can do within
+actions, and @command{awk}'s predefined variables.
+
+The pattern--action rules and the statements available for use
+within actions form the core of @command{awk} programming.
+In a sense, everything covered
+up to here has been the foundation
+that programs are built on top of.  Now it's time to start
+building something useful.
+
+@menu
+* Pattern Overview::            What goes into a pattern.
+* Using Shell Variables::       How to use shell variables with @command{awk}.
+* Action Overview::             What goes into an action.
+* Statements::                  Describes the various control statements in
+                                detail.
+* Built-in Variables::          Summarizes the predefined variables.
+* Pattern Action Summary::      Patterns and Actions summary.
+@end menu
+
+@node Pattern Overview
+@section Pattern Elements
+
+@menu
+* Regexp Patterns::             Using regexps as patterns.
+* Expression Patterns::         Any expression can be used as a pattern.
+* Ranges::                      Pairs of patterns specify record ranges.
+* BEGIN/END::                   Specifying initialization and cleanup rules.
+* BEGINFILE/ENDFILE::           Two special patterns for advanced control.
+* Empty::                       The empty pattern, which matches every record.
+@end menu
+
+@cindex patterns, types of
+Patterns in @command{awk} control the execution of rules---a rule is
+executed when its pattern matches the current input record.
+The following is a summary of the types of @command{awk} patterns:
+
+@table @code
+@item /@var{regular expression}/
+A regular expression. It matches when the text of the
+input record fits the regular expression.
+(@xref{Regexp}.)
+
+@item @var{expression}
+A single expression.  It matches when its value
+is nonzero (if a number) or non-null (if a string).
+(@xref{Expression Patterns}.)
+
+@item @var{begpat}, @var{endpat}
+A pair of patterns separated by a comma, specifying a @dfn{range} of records.
+The range includes both the initial record that matches @var{begpat} and
+the final record that matches @var{endpat}.
+(@xref{Ranges}.)
+
+@item BEGIN
+@itemx END
+Special patterns for you to supply startup or cleanup actions for your
+@command{awk} program.
+(@xref{BEGIN/END}.)
+
+@item BEGINFILE
+@itemx ENDFILE
+Special patterns for you to supply startup or cleanup actions to be
+done on a per-file basis.
+(@xref{BEGINFILE/ENDFILE}.)
+
+@item @var{empty}
+The empty pattern matches every input record.
+(@xref{Empty}.)
+@end table
+
+@node Regexp Patterns
+@subsection Regular Expressions as Patterns
+@cindex patterns, regular expressions as
+@cindex regular expressions, as patterns
+
+Regular expressions are one of the first kinds of patterns presented
+in this book.
+This kind of pattern is simply a regexp constant in the pattern part of
+a rule.  Its  meaning is @samp{$0 ~ /@var{pattern}/}.
+The pattern matches when the input record matches the regexp.
+For example:
+
+@example
+/foo|bar|baz/  @{ buzzwords++ @}
+END            @{ print buzzwords, "buzzwords seen" @}
+@end example
+
+@node Expression Patterns
+@subsection Expressions as Patterns
+@cindex expressions, as patterns
+@cindex patterns, expressions as
+
+Any @command{awk} expression is valid as an @command{awk} pattern.
+The pattern matches if the expression's value is nonzero (if a
+number) or non-null (if a string).
+The expression is reevaluated each time the rule is tested against a new
+input record.  If the expression uses fields such as @code{$1}, the
+value depends directly on the new input record's text; otherwise, it
+depends on only what has happened so far in the execution of the
+@command{awk} program.
+
+@cindex comparison expressions, as patterns
+@cindex patterns, comparison expressions as
+Comparison expressions, using the comparison operators described in
+@ref{Typing and Comparison},
+are a very common kind of pattern.
+Regexp matching and nonmatching are also very common expressions.
+The left operand of the @samp{~} and @samp{!~} operators is a string.
+The right operand is either a constant regular expression enclosed in
+slashes (@code{/@var{regexp}/}), or any expression whose string value
+is used as a dynamic regular expression
+(@pxref{Computed Regexps}).
+The following example prints the second field of each input record
+whose first field is precisely @samp{li}:
+
+@cindex @code{/} (forward slash), patterns and
+@cindex forward slash (@code{/}), patterns and
+@cindex @code{~} (tilde), @code{~} operator
+@cindex tilde (@code{~}), @code{~} operator
+@cindex @code{!} (exclamation point), @code{!~} operator
+@cindex exclamation point (@code{!}), @code{!~} operator
+@example
+$ @kbd{awk '$1 == "li" @{ print $2 @}' mail-list}
+@end example
+
+@noindent
+(There is no output, because there is no person with the exact name @samp{li}.)
+Contrast this with the following regular expression match, which
+accepts any record with a first field that contains @samp{li}:
+
+@example
+$ @kbd{awk '$1 ~ /li/ @{ print $2 @}' mail-list}
+@print{} 555-5553
+@print{} 555-6699
+@end example
+
+@cindex regexp constants, as patterns
+@cindex patterns, regexp constants as
+A regexp constant as a pattern is also a special case of an expression
+pattern.  The expression @code{/li/} has the value one if @samp{li}
+appears in the current input record. Thus, as a pattern, @code{/li/}
+matches any record containing @samp{li}.
+
+@cindex Boolean expressions, as patterns
+@cindex patterns, Boolean expressions as
+Boolean expressions are also commonly used as patterns.
+Whether the pattern
+matches an input record depends on whether its subexpressions match.
+For example, the following command prints all the records in
+@file{mail-list} that contain both @samp{edu} and @samp{li}:
+
+@example
+$ @kbd{awk '/edu/ && /li/' mail-list}
+@print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+@end example
+
+The following command prints all records in
+@file{mail-list} that contain @emph{either} @samp{edu} or @samp{li}
+(or both, of course):
+
+@example
+$ @kbd{awk '/edu/ || /li/' mail-list}
+@print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+@print{} Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
+@print{} Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
+@print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+@print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@end example
+
+The following command prints all records in
+@file{mail-list} that do @emph{not} contain the string @samp{li}:
+
+@example
+$ @kbd{awk '! /li/' mail-list}
+@print{} Anthony      555-3412     anthony.asserturo@@hotmail.com   A
+@print{} Becky        555-7685     becky.algebrarum@@gmail.com      A
+@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
+@group
+@print{} Martin       555-6480     martin.codicibus@@hotmail.com    A
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@end group
+@end example
+
+@cindex @code{BEGIN} pattern, Boolean patterns and
+@cindex @code{END} pattern, Boolean patterns and
+@cindex @code{BEGINFILE} pattern, Boolean patterns and
+@cindex @code{ENDFILE} pattern, Boolean patterns and
+The subexpressions of a Boolean operator in a pattern can be constant regular
+expressions, comparisons, or any other @command{awk} expressions.  Range
+patterns are not expressions, so they cannot appear inside Boolean
+patterns.  Likewise, the special patterns @code{BEGIN}, @code{END},
+@code{BEGINFILE}, and @code{ENDFILE},
+which never match any input record, are not expressions and cannot
+appear inside Boolean patterns.
+
+The precedence of the different operators that can appear in
+patterns is described in @ref{Precedence}.
+
+@node Ranges
+@subsection Specifying Record Ranges with Patterns
+
+@cindex range patterns
+@cindex patterns, ranges in
+@cindex lines, matching ranges of
+@cindex @code{,} (comma), in range patterns
+@cindex comma (@code{,}), in range patterns
+A @dfn{range pattern} is made of two patterns separated by a comma, in
+the form @samp{@var{begpat}, @var{endpat}}.  It is used to match ranges of
+consecutive input records.  The first pattern, @var{begpat}, controls
+where the range begins, while @var{endpat} controls where
+the pattern ends.  For example, the following:
+
+@example
+awk '$1 == "on", $1 == "off"' myfile
+@end example
+
+@noindent
+prints every record in @file{myfile} between @samp{on}/@samp{off} pairs, inclusive.
+
+A range pattern starts out by matching @var{begpat} against every
+input record.  When a record matches @var{begpat}, the range pattern is
+@dfn{turned on}, and the range pattern matches this record as well.  As long as
+the range pattern stays turned on, it automatically matches every input
+record read.  The range pattern also matches @var{endpat} against every
+input record; when this succeeds, the range pattern is @dfn{turned off} again
+for the following record.  Then the range pattern goes back to checking
+@var{begpat} against each record.
+
+@cindex @code{if} statement, actions@comma{} changing
+The record that turns on the range pattern and the one that turns it
+off both match the range pattern.  If you don't want to operate on
+these records, you can write @code{if} statements in the rule's action
+to distinguish them from the records you are interested in.
+
+It is possible for a pattern to be turned on and off by the same
+record. If the record satisfies both conditions, then the action is
+executed for just that record.
+For example, suppose there is text between two identical markers (e.g.,
+the @samp{%} symbol), each on its own line, that should be ignored.
+A first attempt would be to
+combine a range pattern that describes the delimited text with the
+@code{next} statement
+(not discussed yet, @pxref{Next Statement}).
+This causes @command{awk} to skip any further processing of the current
+record and start over again with the next input record. Such a program
+looks like this:
+
+@example
+/^%$/,/^%$/    @{ next @}
+               @{ print @}
+@end example
+
+@noindent
+@cindex lines, skipping between markers
+@c @cindex flag variables
+This program fails because the range pattern is both turned on and turned off
+by the first line, which just has a @samp{%} on it.  To accomplish this task,
+write the program in the following manner, using a flag:
+
+@cindex @code{!} (exclamation point), @code{!} operator
+@example
+/^%$/     @{ skip = ! skip; next @}
+skip == 1 @{ next @} # skip lines with `skip' set
+@end example
+
+In a range pattern, the comma (@samp{,}) has the lowest precedence of
+all the operators (i.e., it is evaluated last).  Thus, the following
+program attempts to combine a range pattern with another, simpler test:
+
+@example
+echo Yes | awk '/1/,/2/ || /Yes/'
+@end example
+
+The intent of this program is @samp{(/1/,/2/) || /Yes/}.
+However, @command{awk} interprets this as @samp{/1/, (/2/ || /Yes/)}.
+This cannot be changed or worked around; range patterns do not combine
+with other patterns:
+
+@example
+$ @kbd{echo Yes | gawk '(/1/,/2/) || /Yes/'}
+@error{} gawk: cmd. line:1: (/1/,/2/) || /Yes/
+@error{} gawk: cmd. line:1:           ^ syntax error
+@end example
+
+@cindex range patterns, line continuation and
+@cindex dark corner, range patterns, line continuation and
+As a minor point of interest, although it is poor style,
+POSIX allows you to put a newline after the comma in
+a range pattern.  @value{DARKCORNER}
+
+@node BEGIN/END
+@subsection The @code{BEGIN} and @code{END} Special Patterns
+
+@cindex @code{BEGIN} pattern
+@cindex @code{END} pattern
+All the patterns described so far are for matching input records.
+The @code{BEGIN} and @code{END} special patterns are different.
+They supply startup and cleanup actions for @command{awk} programs.
+@code{BEGIN} and @code{END} rules must have actions; there is no default
+action for these rules because there is no current record when they run.
+@code{BEGIN} and @code{END} rules are often referred to as
+``@code{BEGIN} and @code{END} blocks'' by longtime @command{awk}
+programmers.
+
+@menu
+* Using BEGIN/END::             How and why to use BEGIN/END rules.
+* I/O And BEGIN/END::           I/O issues in BEGIN/END rules.
+@end menu
+
+@node Using BEGIN/END
+@subsubsection Startup and Cleanup Actions
+
+@cindex @code{BEGIN} pattern
+@cindex @code{END} pattern
+A @code{BEGIN} rule is executed once only, before the first input record
+is read. Likewise, an @code{END} rule is executed once only, after all the
+input is read.  For example:
+
+@example
+$ @kbd{awk '}
+> @kbd{BEGIN @{ print "Analysis of \"li\"" @}}
+> @kbd{/li/  @{ ++n @}}
+> @kbd{END   @{ print "\"li\" appears in", n, "records." @}' mail-list}
+@print{} Analysis of "li"
+@print{} "li" appears in 4 records.
+@end example
+
+@cindex @code{BEGIN} pattern, operators and
+@cindex @code{END} pattern, operators and
+This program finds the number of records in the input file @file{mail-list}
+that contain the string @samp{li}.  The @code{BEGIN} rule prints a title
+for the report.  There is no need to use the @code{BEGIN} rule to
+initialize the counter @code{n} to zero, as @command{awk} does this
+automatically (@pxref{Variables}).
+The second rule increments the variable @code{n} every time a
+record containing the pattern @samp{li} is read.  The @code{END} rule
+prints the value of @code{n} at the end of the run.
+
+The special patterns @code{BEGIN} and @code{END} cannot be used in ranges
+or with Boolean operators (indeed, they cannot be used with any operators).
+An @command{awk} program may have multiple @code{BEGIN} and/or @code{END}
+rules.  They are executed in the order in which they appear: all the @code{BEGIN}
+rules at startup and all the @code{END} rules at termination.
+@code{BEGIN} and @code{END} rules may be intermixed with other rules.
+This feature was added in the 1987 version of @command{awk} and is included
+in the POSIX standard.
+The original (1978) version of @command{awk}
+required the @code{BEGIN} rule to be placed at the beginning of the
+program, the @code{END} rule to be placed at the end, and only allowed one of
+each.
+This is no longer required, but it is a good idea to follow this template
+in terms of program organization and readability.
+
+Multiple @code{BEGIN} and @code{END} rules are useful for writing
+library functions, because each library file can have its own @code{BEGIN} and/or
+@code{END} rule to do its own initialization and/or cleanup.
+The order in which library functions are named on the command line
+controls the order in which their @code{BEGIN} and @code{END} rules are
+executed.  Therefore, you have to be careful when writing such rules in
+library files so that the order in which they are executed doesn't matter.
+@xref{Options} for more information on
+using library functions.
+@xref{Library Functions},
+for a number of useful library functions.
+
+If an @command{awk} program has only @code{BEGIN} rules and no
+other rules, then the program exits after the @code{BEGIN} rules are
+run.@footnote{The original version of @command{awk} kept
+reading and ignoring input until the end of the file was seen.}  However, if an
+@code{END} rule exists, then the input is read, even if there are
+no other rules in the program.  This is necessary in case the @code{END}
+rule checks the @code{FNR} and @code{NR} variables.
+
+@node I/O And BEGIN/END
+@subsubsection Input/Output from @code{BEGIN} and @code{END} Rules
+
+@cindex input/output, from @code{BEGIN} and @code{END}
+There are several (sometimes subtle) points to be aware of when doing I/O
+from a @code{BEGIN} or @code{END} rule.
+The first has to do with the value of @code{$0} in a @code{BEGIN}
+rule.  Because @code{BEGIN} rules are executed before any input is read,
+there simply is no input record, and therefore no fields, when
+executing @code{BEGIN} rules.  References to @code{$0} and the fields
+yield a null string or zero, depending upon the context.  One way
+to give @code{$0} a real value is to execute a @code{getline} command
+without a variable (@pxref{Getline}).
+Another way is simply to assign a value to @code{$0}.
+
+@cindex Brian Kernighan's @command{awk}
+@cindex differences in @command{awk} and @command{gawk}, @code{BEGIN}/@code{END} patterns
+@cindex POSIX @command{awk}, @code{BEGIN}/@code{END} patterns
+@cindex @code{print} statement, @code{BEGIN}/@code{END} patterns and
+@cindex @code{BEGIN} pattern, @code{print} statement and
+@cindex @code{END} pattern, @code{print} statement and
+The second point is similar to the first, but from the other direction.
+Traditionally, due largely to implementation issues, @code{$0} and
+@code{NF} were @emph{undefined} inside an @code{END} rule.
+The POSIX standard specifies that @code{NF} is available in an @code{END}
+rule. It contains the number of fields from the last input record.
+Most probably due to an oversight, the standard does not say that @code{$0}
+is also preserved, although logically one would think that it should be.
+In fact, all of BWK @command{awk}, @command{mawk}, and @command{gawk}
+preserve the value of @code{$0} for use in @code{END} rules.  Be aware,
+however, that some other implementations and many older versions
+of Unix @command{awk} do not.
+
+The third point follows from the first two.  The meaning of @samp{print}
+inside a @code{BEGIN} or @code{END} rule is the same as always:
+@samp{print $0}.  If @code{$0} is the null string, then this prints an
+empty record.  Many longtime @command{awk} programmers use an unadorned
+@samp{print} in @code{BEGIN} and @code{END} rules, to mean @samp{@w{print ""}},
+relying on @code{$0} being null.  Although one might generally get away with
+this in @code{BEGIN} rules, it is a very bad idea in @code{END} rules,
+at least in @command{gawk}.  It is also poor style, because if an empty
+line is needed in the output, the program should print one explicitly.
+
+@cindex @code{next} statement, @code{BEGIN}/@code{END} patterns and
+@cindex @code{nextfile} statement, @code{BEGIN}/@code{END} patterns and
+@cindex @code{BEGIN} pattern, @code{next}/@code{nextfile} statements and
+@cindex @code{END} pattern, @code{next}/@code{nextfile} statements and
+Finally, the @code{next} and @code{nextfile} statements are not allowed
+in a @code{BEGIN} rule, because the implicit
+read-a-record-and-match-against-the-rules loop has not started yet.  Similarly, those statements
+are not valid in an @code{END} rule, because all the input has been read.
+(@xref{Next Statement} and
+@ifnotdocbook
+@pxref{Nextfile Statement}.)
+@end ifnotdocbook
+@ifdocbook
+@ref{Nextfile Statement}.)
+@end ifdocbook
+
+@node BEGINFILE/ENDFILE
+@subsection The @code{BEGINFILE} and @code{ENDFILE} Special Patterns
+@cindex @code{BEGINFILE} pattern
+@cindex @code{ENDFILE} pattern
+@cindex differences in @command{awk} and @command{gawk}, @code{BEGINFILE}/@code{ENDFILE} patterns
+
+This @value{SECTION} describes a @command{gawk}-specific feature.
+
+Two special kinds of rule, @code{BEGINFILE} and @code{ENDFILE}, give
+you ``hooks'' into @command{gawk}'s command-line file processing loop.
+As with the @code{BEGIN} and @code{END} rules
+@ifnottex
+@ifnotdocbook
+(@pxref{BEGIN/END}),
+@end ifnotdocbook
+@end ifnottex
+@iftex
+(see the previous @value{SECTION}),
+@end iftex
+@ifdocbook
+(see the previous @value{SECTION}),
+@end ifdocbook
+all @code{BEGINFILE} rules in a program are merged, in the order they are
+read by @command{gawk}, and all @code{ENDFILE} rules are merged as well.
+
+The body of the @code{BEGINFILE} rules is executed just before
+@command{gawk} reads the first record from a file.  @code{FILENAME}
+is set to the name of the current file, and @code{FNR} is set to zero.
+
+The @code{BEGINFILE} rule provides you the opportunity to accomplish two tasks
+that would otherwise be difficult or impossible to perform:
+
+@itemize @value{BULLET}
+@item
+You can test if the file is readable.  Normally, it is a fatal error if a
+file named on the command line cannot be opened for reading.  However,
+you can bypass the fatal error and move on to the next file on the
+command line.
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable, with @code{BEGINFILE} pattern
+@cindex @code{nextfile} statement, @code{BEGINFILE}/@code{ENDFILE} patterns and
+You do this by checking if the @code{ERRNO} variable is not the empty
+string; if so, then @command{gawk} was not able to open the file. In
+this case, your program can execute the @code{nextfile} statement
+(@pxref{Nextfile Statement}).  This causes @command{gawk} to skip
+the file entirely.  Otherwise, @command{gawk} exits with the usual
+fatal error.
+
+@item
+If you have written extensions that modify the record handling (by
+inserting an ``input parser''; @pxref{Input Parsers}), you can invoke
+them at this point, before @command{gawk} has started processing the file.
+(This is a @emph{very} advanced feature, currently used only by the
+@uref{https://sourceforge.net/projects/gawkextlib, @code{gawkextlib} project}.)
+@end itemize
+
+The @code{ENDFILE} rule is called when @command{gawk} has finished processing
+the last record in an input file.  For the last input file,
+it will be called before any @code{END} rules.
+The @code{ENDFILE} rule is executed even for empty input files.
+
+Normally, when an error occurs when reading input in the normal
+input-processing loop, the error is fatal.  However, if an @code{ENDFILE}
+rule is present, the error becomes non-fatal, and instead @code{ERRNO}
+is set.  This makes it possible to catch and process I/O errors at the
+level of the @command{awk} program.
+
+@cindex @code{next} statement, @code{BEGINFILE}/@code{ENDFILE} patterns and
+The @code{next} statement (@pxref{Next Statement}) is not allowed inside
+either a @code{BEGINFILE} or an @code{ENDFILE} rule.  The @code{nextfile}
+statement is allowed only inside a
+@code{BEGINFILE} rule, not inside an @code{ENDFILE} rule.
+
+@cindex @code{getline} statement, @code{BEGINFILE}/@code{ENDFILE} patterns and
+The @code{getline} statement (@pxref{Getline}) is restricted inside
+both @code{BEGINFILE} and @code{ENDFILE}: only redirected
+forms of @code{getline} are allowed.
+
+@code{BEGINFILE} and @code{ENDFILE} are @command{gawk} extensions.
+In most other @command{awk} implementations, or if @command{gawk} is in
+compatibility mode (@pxref{Options}), they are not special.
+
+@c FIXME: For 4.2 maybe deal with this?
+@ignore
+Date:     Tue, 17 May 2011 02:06:10 PDT
+From:     rankin@pactechdata.com (Pat Rankin)
+Message-Id: <110517015127.20240f4a@pactechdata.com>
+Subject:  BEGINFILE
+To:       arnold@skeeve.com
+
+     The documentation for BEGINFILE states that FNR is 0, which seems
+pretty obvious.  It doesn't mention what the value of $0 is, and that's
+not obvious.  I think setting it to null before starting the BEGINFILE
+action would be preferable to leaving whatever was there in the last
+record of the previous file.
+
+     ENDFILE can retain the last record in $0.  I guess it has to if
+the END rule's actions see that value too.  But the beginning of a new
+file doesn't just mean that the old one has been closed; the old file
+is being superseded, so leaving the old data around feels wrong to me.
+[If the user wants to keep it on hand, he or she can use an ENDFILE
+rule to grab it before moving on to the next file.]
+@end ignore
+
+@node Empty
+@subsection The Empty Pattern
+
+@cindex empty pattern
+@cindex patterns, empty
+An empty (i.e., nonexistent) pattern is considered to match @emph{every}
+input record.  For example, the program:
+
+@example
+awk '@{ print $1 @}' mail-list
+@end example
+
+@noindent
+prints the first field of every record.
+
+@node Using Shell Variables
+@section Using Shell Variables in Programs
+@cindex shells, variables
+@cindex @command{awk} programs, shell variables in
+@c @cindex shell and @command{awk} interaction
+
+@command{awk} programs are often used as components in larger
+programs written in shell.
+For example, it is very common to use a shell variable to
+hold a pattern that the @command{awk} program searches for.
+There are two ways to get the value of the shell variable
+into the body of the @command{awk} program.
+
+@cindex shells, quoting
+A common method is to use shell quoting to substitute
+the variable's value into the program inside the script.
+For example, consider the following program:
+
+@example
+@group
+printf "Enter search pattern: "
+read pattern
+awk "/$pattern/ "'@{ nmatches++ @}
+     END @{ print nmatches, "found" @}' /path/to/data
+@end group
+@end example
+
+@noindent
+The @command{awk} program consists of two pieces of quoted text
+that are concatenated together to form the program.
+The first part is double-quoted, which allows substitution of
+the @code{pattern} shell variable inside the quotes.
+The second part is single-quoted.
+
+Variable substitution via quoting works, but can potentially be
+messy.  It requires a good understanding of the shell's quoting rules
+(@pxref{Quoting}),
+and it's often difficult to correctly
+match up the quotes when reading the program.
+
+A better method is to use @command{awk}'s variable assignment feature
+(@pxref{Assignment Options})
+to assign the shell variable's value to an @command{awk} variable.
+Then use dynamic regexps to match the pattern
+(@pxref{Computed Regexps}).
+The following shows how to redo the
+previous example using this technique:
+
+@example
+printf "Enter search pattern: "
+read pattern
+awk -v pat="$pattern" '$0 ~ pat @{ nmatches++ @}
+       END @{ print nmatches, "found" @}' /path/to/data
+@end example
+
+@noindent
+Now, the @command{awk} program is just one single-quoted string.
+The assignment @samp{-v pat="$pattern"} still requires double quotes,
+in case there is whitespace in the value of @code{$pattern}.
+The @command{awk} variable @code{pat} could be named @code{pattern}
+too, but that would be more confusing.  Using a variable also
+provides more flexibility, as the variable can be used anywhere inside
+the program---for printing, as an array subscript, or for any other
+use---without requiring the quoting tricks at every point in the program.
+
+@node Action Overview
+@section Actions
+@c @cindex action, definition of
+@c @cindex curly braces
+@c @cindex action, curly braces
+@c @cindex action, separating statements
+@cindex actions
+
+An @command{awk} program or script consists of a series of
+rules and function definitions interspersed.  (Functions are
+described later.  @xref{User-defined}.)
+A rule contains a pattern and an action, either of which (but not
+both) may be omitted.  The purpose of the @dfn{action} is to tell
+@command{awk} what to do once a match for the pattern is found.  Thus,
+in outline, an @command{awk} program generally looks like this:
+
+@display
+[@var{pattern}]  @code{@{ @var{action} @}}
+ @var{pattern}  [@code{@{ @var{action} @}}]
+@dots{}
+@code{function @var{name}(@var{args}) @{ @dots{} @}}
+@dots{}
+@end display
+
+@cindex @code{@{@}} (braces), actions and
+@cindex braces (@code{@{@}}), actions and
+@cindex separators, for statements in actions
+@cindex newlines, separating statements in actions
+@cindex @code{;} (semicolon), separating statements in actions
+@cindex semicolon (@code{;}), separating statements in actions
+An action consists of one or more @command{awk} @dfn{statements}, enclosed
+in braces (@samp{@{@r{@dots{}}@}}).  Each statement specifies one
+thing to do.  The statements are separated by newlines or semicolons.
+The braces around an action must be used even if the action
+contains only one statement, or if it contains no statements at
+all.  However, if you omit the action entirely, omit the braces as
+well.  An omitted action is equivalent to @samp{@{ print $0 @}}:
+
+@example
+/foo/  @{ @}     @ii{match @code{foo}, do nothing --- empty action}
+/foo/          @ii{match @code{foo}, print the record --- omitted action}
+@end example
+
+The following types of statements are supported in @command{awk}:
+
+@table @asis
+@cindex side effects, statements
+@item Expressions
+Call functions or assign values to variables
+(@pxref{Expressions}).  Executing
+this kind of statement simply computes the value of the expression.
+This is useful when the expression has side effects
+(@pxref{Assignment Ops}).
+
+@item Control statements
+Specify the control flow of @command{awk}
+programs.  The @command{awk} language gives you C-like constructs
+(@code{if}, @code{for}, @code{while}, and @code{do}) as well as a few
+special ones (@pxref{Statements}).
+
+@item Compound statements
+Enclose one or more statements in braces.  A compound statement
+is used in order to put several statements together in the body of an
+@code{if}, @code{while}, @code{do}, or @code{for} statement.
+
+@item Input statements
+Use the @code{getline} command
+(@pxref{Getline}).
+Also supplied in @command{awk} are the @code{next}
+statement (@pxref{Next Statement})
+and the @code{nextfile} statement
+(@pxref{Nextfile Statement}).
+
+@item Output statements
+Such as @code{print} and @code{printf}.
+@xref{Printing}.
+
+@item Deletion statements
+For deleting array elements.
+@xref{Delete}.
+@end table
+
+@node Statements
+@section Control Statements in Actions
+@cindex control statements
+@cindex statements, control, in actions
+@cindex actions, control statements in
+
+@dfn{Control statements}, such as @code{if}, @code{while}, and so on,
+control the flow of execution in @command{awk} programs.  Most of @command{awk}'s
+control statements are patterned after similar statements in C.
+
+@cindex compound statements@comma{} control statements and
+@cindex statements, compound@comma{} control statements and
+@cindex body, in actions
+@cindex @code{@{@}} (braces), statements, grouping
+@cindex braces (@code{@{@}}), statements, grouping
+@cindex newlines, separating statements in actions
+@cindex @code{;} (semicolon), separating statements in actions
+@cindex semicolon (@code{;}), separating statements in actions
+All the control statements start with special keywords, such as @code{if}
+and @code{while}, to distinguish them from simple expressions.
+Many control statements contain other statements.  For example, the
+@code{if} statement contains another statement that may or may not be
+executed.  The contained statement is called the @dfn{body}.
+To include more than one statement in the body, group them into a
+single @dfn{compound statement} with braces, separating them with
+newlines or semicolons.
+
+@menu
+* If Statement::                Conditionally execute some @command{awk}
+                                statements.
+* While Statement::             Loop until some condition is satisfied.
+* Do Statement::                Do specified action while looping until some
+                                condition is satisfied.
+* For Statement::               Another looping statement, that provides
+                                initialization and increment clauses.
+* Switch Statement::            Switch/case evaluation for conditional
+                                execution of statements based on a value.
+* Break Statement::             Immediately exit the innermost enclosing loop.
+* Continue Statement::          Skip to the end of the innermost enclosing
+                                loop.
+* Next Statement::              Stop processing the current input record.
+* Nextfile Statement::          Stop processing the current file.
+* Exit Statement::              Stop execution of @command{awk}.
+@end menu
+
+@node If Statement
+@subsection The @code{if}-@code{else} Statement
+
+@cindex @code{if} statement
+The @code{if}-@code{else} statement is @command{awk}'s decision-making
+statement.  It looks like this:
+
+@display
+@code{if (@var{condition}) @var{then-body}} [@code{else @var{else-body}}]
+@end display
+
+@noindent
+The @var{condition} is an expression that controls what the rest of the
+statement does.  If the @var{condition} is true, @var{then-body} is
+executed; otherwise, @var{else-body} is executed.
+The @code{else} part of the statement is
+optional.  The condition is considered false if its value is zero or
+the null string; otherwise, the condition is true.
+Refer to the following:
+
+@example
+@group
+if (x % 2 == 0)
+    print "x is even"
+else
+    print "x is odd"
+@end group
+@end example
+
+In this example, if the expression @samp{x % 2 == 0} is true (i.e.,
+if the value of @code{x} is evenly divisible by two), then the first
+@code{print} statement is executed; otherwise, the second @code{print}
+statement is executed.
+If the @code{else} keyword appears on the same line as @var{then-body} and
+@var{then-body} is not a compound statement (i.e., not surrounded by
+braces), then a semicolon must separate @var{then-body} from
+the @code{else}.
+To illustrate this, the previous example can be rewritten as:
+
+@example
+if (x % 2 == 0) print "x is even"; else
+        print "x is odd"
+@end example
+
+@noindent
+If the @samp{;} is left out, @command{awk} can't interpret the statement and
+it produces a syntax error.  Don't actually write programs this way,
+because a human reader might fail to see the @code{else} if it is not
+the first thing on its line.
+
+@node While Statement
+@subsection The @code{while} Statement
+@cindex @code{while} statement
+@cindex loops
+@cindex loops, @code{while}
+@cindex loops, See Also @code{while} statement
+
+In programming, a @dfn{loop} is a part of a program that can
+be executed two or more times in succession.
+The @code{while} statement is the simplest looping statement in
+@command{awk}.  It repeatedly executes a statement as long as a condition is
+true.  For example:
+
+@example
+while (@var{condition})
+  @var{body}
+@end example
+
+@cindex body, in loops
+@noindent
+@var{body} is a statement called the @dfn{body} of the loop,
+and @var{condition} is an expression that controls how long the loop
+keeps running.
+The first thing the @code{while} statement does is test the @var{condition}.
+If the @var{condition} is true, it executes the statement @var{body}.
+@ifinfo
+(The @var{condition} is true when the value
+is not zero and not a null string.)
+@end ifinfo
+After @var{body} has been executed,
+@var{condition} is tested again, and if it is still true, @var{body}
+executes again.  This process repeats until the @var{condition} is no longer
+true.  If the @var{condition} is initially false, the body of the loop
+never executes and @command{awk} continues with the statement following
+the loop.
+This example prints the first three fields of each record, one per line:
+
+@example
+awk '
+@{
+    i = 1
+    while (i <= 3) @{
+        print $i
+        i++
+    @}
+@}' inventory-shipped
+@end example
+
+@noindent
+The body of this loop is a compound statement enclosed in braces,
+containing two statements.
+The loop works in the following manner: first, the value of @code{i} is set to one.
+Then, the @code{while} statement tests whether @code{i} is less than or equal to
+three.  This is true when @code{i} equals one, so the @code{i}th
+field is printed.  Then the @samp{i++} increments the value of @code{i}
+and the loop repeats.  The loop terminates when @code{i} reaches four.
+
+A newline is not required between the condition and the
+body; however, using one makes the program clearer unless the body is a
+compound statement or else is very simple.  The newline after the open brace
+that begins the compound statement is not required either, but the
+program is harder to read without it.
+
+@node Do Statement
+@subsection The @code{do}-@code{while} Statement
+@cindex @code{do}-@code{while} statement
+@cindex loops, @code{do}-@code{while}
+
+The @code{do} loop is a variation of the @code{while} looping statement.
+The @code{do} loop executes the @var{body} once and then repeats the
+@var{body} as long as the @var{condition} is true.  It looks like this:
+
+@example
+do
+  @var{body}
+while (@var{condition})
+@end example
+
+Even if the @var{condition} is false at the start, the @var{body}
+executes at least once (and only once, unless executing @var{body}
+makes @var{condition} true).  Contrast this with the corresponding
+@code{while} statement:
+
+@example
+while (@var{condition})
+    @var{body}
+@end example
+
+@noindent
+This statement does not execute the @var{body} even once if the
+@var{condition} is false to begin with.  The following is an example of
+a @code{do} statement:
+
+@example
+@{
+    i = 1
+    do @{
+        print $0
+        i++
+    @} while (i <= 10)
+@}
+@end example
+
+@noindent
+This program prints each input record 10 times.  However, it isn't a very
+realistic example, because in this case an ordinary @code{while} would do
+just as well.  This situation reflects actual experience; only
+occasionally is there a real use for a @code{do} statement.
+
+@node For Statement
+@subsection The @code{for} Statement
+@cindex @code{for} statement
+@cindex loops, @code{for}, iterative
+
+The @code{for} statement makes it more convenient to count iterations of a
+loop.  The general form of the @code{for} statement looks like this:
+
+@example
+for (@var{initialization}; @var{condition}; @var{increment})
+  @var{body}
+@end example
+
+@noindent
+The @var{initialization}, @var{condition}, and @var{increment} parts are
+arbitrary @command{awk} expressions, and @var{body} stands for any
+@command{awk} statement.
+
+The @code{for} statement starts by executing @var{initialization}.
+Then, as long
+as the @var{condition} is true, it repeatedly executes @var{body} and then
+@var{increment}.  Typically, @var{initialization} sets a variable to
+either zero or one, @var{increment} adds one to it, and @var{condition}
+compares it against the desired number of iterations.
+For example:
+
+@example
+awk '
+@{
+    for (i = 1; i <= 3; i++)
+        print $i
+@}' inventory-shipped
+@end example
+
+@noindent
+This prints the first three fields of each input record, with one
+input field per output line.
+
+It isn't possible to
+set more than one variable in the
+@var{initialization} part without using a multiple assignment statement
+such as @samp{x = y = 0}. This makes sense only if all the initial values
+are equal.  (But it is possible to initialize additional variables by writing
+their assignments as separate statements preceding the @code{for} loop.)
+
+@c @cindex comma operator, not supported
+The same is true of the @var{increment} part. Incrementing additional
+variables requires separate statements at the end of the loop.
+The C compound expression, using C's comma operator, is useful in
+this context, but it is not supported in @command{awk}.
+
+Most often, @var{increment} is an increment expression, as in the previous
+example.  But this is not required; it can be any expression
+whatsoever.  For example, the following statement prints all the powers of two
+between 1 and 100:
+
+@example
+for (i = 1; i <= 100; i *= 2)
+    print i
+@end example
+
+If there is nothing to be done, any of the three expressions in the
+parentheses following the @code{for} keyword may be omitted.  Thus,
+@w{@samp{for (; x > 0;)}} is equivalent to @w{@samp{while (x > 0)}}.  If the
+@var{condition} is omitted, it is treated as true, effectively
+yielding an @dfn{infinite loop} (i.e., a loop that never terminates).
+
+In most cases, a @code{for} loop is an abbreviation for a @code{while}
+loop, as shown here:
+
+@example
+@var{initialization}
+while (@var{condition}) @{
+  @var{body}
+  @var{increment}
+@}
+@end example
+
+@cindex loops, @code{continue} statements and
+@noindent
+The only exception is when the @code{continue} statement
+(@pxref{Continue Statement}) is used
+inside the loop. Changing a @code{for} statement to a @code{while}
+statement in this way can change the effect of the @code{continue}
+statement inside the loop.
+
+The @command{awk} language has a @code{for} statement in addition to a
+@code{while} statement because a @code{for} loop is often both less work to
+type and more natural to think of.  Counting the number of iterations is
+very common in loops.  It can be easier to think of this counting as part
+of looping rather than as something to do inside the loop.
+
+@cindex @code{in} operator
+There is an alternative version of the @code{for} loop, for iterating over
+all the indices of an array:
+
+@example
+for (i in array)
+    @var{do something with} array[i]
+@end example
+
+@noindent
+@xref{Scanning an Array}
+for more information on this version of the @code{for} loop.
+
+@node Switch Statement
+@subsection The @code{switch} Statement
+@cindex @code{switch} statement
+@cindex @code{case} keyword
+@cindex @code{default} keyword
+
+This @value{SECTION} describes a @command{gawk}-specific feature.
+If @command{gawk} is in compatibility mode (@pxref{Options}),
+it is not available.
+
+The @code{switch} statement allows the evaluation of an expression and
+the execution of statements based on a @code{case} match. Case statements
+are checked for a match in the order they are defined.  If no suitable
+@code{case} is found, the @code{default} section is executed, if supplied.
+
+Each @code{case} contains a single constant, be it numeric, string, or
+regexp.  The @code{switch} expression is evaluated, and then each
+@code{case}'s constant is compared against the result in turn. The type of constant
+determines the comparison: numeric or string do the usual comparisons.
+A regexp constant does a regular expression match against the string
+value of the original expression.  The general form of the @code{switch}
+statement looks like this:
+
+@example
+switch (@var{expression}) @{
+case @var{value or regular expression}:
+    @var{case-body}
+default:
+    @var{default-body}
+@}
+@end example
+
+Control flow in
+the @code{switch} statement works as it does in C. Once a match to a given
+case is made, the case statement bodies execute until a @code{break},
+@code{continue}, @code{next}, @code{nextfile}, or @code{exit} is encountered,
+or the end of the @code{switch} statement itself. For example:
+
+@example
+while ((c = getopt(ARGC, ARGV, "aksx")) != -1) @{
+    switch (c) @{
+    case "a":
+        # report size of all files
+        all_files = TRUE;
+        break
+    case "k":
+        BLOCK_SIZE = 1024       # 1K block size
+        break
+    case "s":
+        # do sums only
+        sum_only = TRUE
+        break
+    case "x":
+        # don't cross filesystems
+        fts_flags = or(fts_flags, FTS_XDEV)
+        break
+    case "?":
+    default:
+        usage()
+        break
+    @}
+@}
+@end example
+
+Note that if none of the statements specified here halt execution
+of a matched @code{case} statement, execution falls through to the
+next @code{case} until execution halts. In this example, the
+@code{case} for @code{"?"} falls through to the @code{default}
+case, which is to call a function named @code{usage()}.
+(The @code{getopt()} function being called here is
+described in @ref{Getopt Function}.)
+
+@node Break Statement
+@subsection The @code{break} Statement
+@cindex @code{break} statement
+@cindex loops, exiting
+@cindex loops, @code{break} statement and
+
+The @code{break} statement jumps out of the innermost @code{for},
+@code{while}, or @code{do} loop that encloses it.  The following example
+finds the smallest divisor of any integer, and also identifies prime
+numbers:
+
+@example
+@group
+# find smallest divisor of num
+@{
+    num = $1
+    for (divisor = 2; divisor * divisor <= num; divisor++) @{
+        if (num % divisor == 0)
+            break
+    @}
+@end group
+@group
+    if (num % divisor == 0)
+        printf "Smallest divisor of %d is %d\n", num, divisor
+    else
+        printf "%d is prime\n", num
+@}
+@end group
+@end example
+
+When the remainder is zero in the first @code{if} statement, @command{awk}
+immediately @dfn{breaks out} of the containing @code{for} loop.  This means
+that @command{awk} proceeds immediately to the statement following the loop
+and continues processing.  (This is very different from the @code{exit}
+statement, which stops the entire @command{awk} program.
+@xref{Exit Statement}.)
+
+The following program illustrates how the @var{condition} of a @code{for}
+or @code{while} statement could be replaced with a @code{break} inside
+an @code{if}:
+
+@example
+# find smallest divisor of num
+@{
+    num = $1
+    for (divisor = 2; ; divisor++) @{
+        if (num % divisor == 0) @{
+            printf "Smallest divisor of %d is %d\n", num, divisor
+            break
+        @}
+        if (divisor * divisor > num) @{
+            printf "%d is prime\n", num
+            break
+        @}
+    @}
+@}
+@end example
+
+The @code{break} statement is also used to break out of the
+@code{switch} statement.
+This is discussed in @ref{Switch Statement}.
+
+@c @cindex @code{break}, outside of loops
+@c @cindex historical features
+@c @cindex @command{awk} language, POSIX version
+@cindex POSIX @command{awk}, @code{break} statement and
+@cindex dark corner, @code{break} statement
+@cindex @command{gawk}, @code{break} statement in
+@cindex Brian Kernighan's @command{awk}
+The @code{break} statement has no meaning when
+used outside the body of a loop or @code{switch}.
+However, although it was never documented,
+historical implementations of @command{awk} treated the @code{break}
+statement outside of a loop as if it were a @code{next} statement
+(@pxref{Next Statement}).
+@value{DARKCORNER}
+Recent versions of BWK @command{awk} no longer allow this usage,
+nor does @command{gawk}.
+
+@node Continue Statement
+@subsection The @code{continue} Statement
+
+@cindex @code{continue} statement
+Similar to @code{break}, the @code{continue} statement is used only inside
+@code{for}, @code{while}, and @code{do} loops.  It skips
+over the rest of the loop body, causing the next cycle around the loop
+to begin immediately.  Contrast this with @code{break}, which jumps out
+of the loop altogether.
+
+The @code{continue} statement in a @code{for} loop directs @command{awk} to
+skip the rest of the body of the loop and resume execution with the
+increment-expression of the @code{for} statement.  The following program
+illustrates this fact:
+
+@example
+BEGIN @{
+     for (x = 0; x <= 20; x++) @{
+         if (x == 5)
+             continue
+         printf "%d ", x
+     @}
+     print ""
+@}
+@end example
+
+@noindent
+This program prints all the numbers from 0 to 20---except for 5, for
+which the @code{printf} is skipped.  Because the increment @samp{x++}
+is not skipped, @code{x} does not remain stuck at 5.  Contrast the
+@code{for} loop from the previous example with the following @code{while} loop:
+
+@example
+BEGIN @{
+     x = 0
+     while (x <= 20) @{
+         if (x == 5)
+             continue
+         printf "%d ", x
+         x++
+     @}
+     print ""
+@}
+@end example
+
+@noindent
+This program loops forever once @code{x} reaches 5, because
+the increment (@samp{x++}) is never reached.
+
+@c @cindex @code{continue}, outside of loops
+@c @cindex historical features
+@c @cindex @command{awk} language, POSIX version
+@cindex POSIX @command{awk}, @code{continue} statement and
+@cindex dark corner, @code{continue} statement
+@cindex @command{gawk}, @code{continue} statement in
+@cindex Brian Kernighan's @command{awk}
+The @code{continue} statement has no special meaning with respect to the
+@code{switch} statement, nor does it have any meaning when used outside the
+body of a loop.  Historical versions of @command{awk} treated a @code{continue}
+statement outside a loop the same way they treated a @code{break}
+statement outside a loop: as if it were a @code{next}
+statement
+@ifset FOR_PRINT
+(discussed in the following @value{SECTION}).
+@end ifset
+@ifclear FOR_PRINT
+(@pxref{Next Statement}).
+@end ifclear
+@value{DARKCORNER}
+Recent versions of BWK @command{awk} no longer work this way, nor
+does @command{gawk}.
+
+@node Next Statement
+@subsection The @code{next} Statement
+@cindex @code{next} statement
+
+The @code{next} statement forces @command{awk} to immediately stop processing
+the current record and go on to the next record.  This means that no
+further rules are executed for the current record, and the rest of the
+current rule's action isn't executed.
+
+Contrast this with the effect of the @code{getline} function
+(@pxref{Getline}).  That also causes
+@command{awk} to read the next record immediately, but it does not alter the
+flow of control in any way (i.e., the rest of the current action executes
+with a new input record).
+
+@cindex @command{awk} programs, execution of
+At the highest level, @command{awk} program execution is a loop that reads
+an input record and then tests each rule's pattern against it.  If you
+think of this loop as a @code{for} statement whose body contains the
+rules, then the @code{next} statement is analogous to a @code{continue}
+statement. It skips to the end of the body of this implicit loop and
+executes the increment (which reads another record).
+
+For example, suppose an @command{awk} program works only on records
+with four fields, and it shouldn't fail when given bad input.  To avoid
+complicating the rest of the program, write a ``weed out'' rule near
+the beginning, in the following manner:
+
+@example
+NF != 4 @{
+    printf("%s:%d: skipped: NF != 4\n", FILENAME, FNR) > "/dev/stderr"
+    next
+@}
+@end example
+
+@noindent
+Because of the @code{next} statement,
+the program's subsequent rules won't see the bad record.  The error
+message is redirected to the standard error output stream, as error
+messages should be.
+For more detail, see
+@ref{Special Files}.
+
+If the @code{next} statement causes the end of the input to be reached,
+then the code in any @code{END} rules is executed.
+@xref{BEGIN/END}.
+
+The @code{next} statement is not allowed inside @code{BEGINFILE} and
+@code{ENDFILE} rules. @xref{BEGINFILE/ENDFILE}.
+
+@c @cindex @command{awk} language, POSIX version
+@c @cindex @code{next}, inside a user-defined function
+@cindex @code{BEGIN} pattern, @code{next}/@code{nextfile} statements and
+@cindex @code{END} pattern, @code{next}/@code{nextfile} statements and
+@cindex POSIX @command{awk}, @code{next}/@code{nextfile} statements and
+@cindex @code{next} statement, user-defined functions and
+@cindex functions, user-defined, @code{next}/@code{nextfile} statements and
+According to the POSIX standard, the behavior is undefined if the
+@code{next} statement is used in a @code{BEGIN} or @code{END} rule.
+@command{gawk} treats it as a syntax error.  Although POSIX does not disallow it,
+most other @command{awk} implementations don't allow the @code{next}
+statement inside function bodies (@pxref{User-defined}).  Just as with any
+other @code{next} statement, a @code{next} statement inside a function
+body reads the next record and starts processing it with the first rule
+in the program.
+
+@node Nextfile Statement
+@subsection The @code{nextfile} Statement
+@cindex @code{nextfile} statement
+
+The @code{nextfile} statement
+is similar to the @code{next} statement.
+However, instead of abandoning processing of the current record, the
+@code{nextfile} statement instructs @command{awk} to stop processing the
+current @value{DF}.
+
+Upon execution of the @code{nextfile} statement,
+@code{FILENAME} is
+updated to the name of the next @value{DF} listed on the command line,
+@code{FNR} is reset to one,
+and processing
+starts over with the first rule in the program.
+If the @code{nextfile} statement causes the end of the input to be reached,
+then the code in any @code{END} rules is executed. An exception to this is
+when @code{nextfile} is invoked during execution of any statement in an
+@code{END} rule; in this case, it causes the program to stop immediately.
+@xref{BEGIN/END}.
+
+The @code{nextfile} statement is useful when there are many @value{DF}s
+to process but it isn't necessary to process every record in every file.
+Without @code{nextfile},
+in order to move on to the next @value{DF}, a program
+would have to continue scanning the unwanted records.  The @code{nextfile}
+statement accomplishes this much more efficiently.
+
+In @command{gawk}, execution of @code{nextfile} causes additional things
+to happen: any @code{ENDFILE} rules are executed if @command{gawk} is
+not currently in an @code{END} or @code{BEGINFILE} rule, @code{ARGIND} is
+incremented, and any @code{BEGINFILE} rules are executed.  (@code{ARGIND}
+hasn't been introduced yet. @xref{Built-in Variables}.)
+
+With @command{gawk}, @code{nextfile} is useful inside a @code{BEGINFILE}
+rule to skip over a file that would otherwise cause @command{gawk}
+to exit with a fatal error. In this case, @code{ENDFILE} rules are not
+executed. @xref{BEGINFILE/ENDFILE}.
+
+Although it might seem that @samp{close(FILENAME)} would accomplish
+the same as @code{nextfile}, this isn't true.  @code{close()} is
+reserved for closing files, pipes, and coprocesses that are
+opened with redirections.  It is not related to the main processing that
+@command{awk} does with the files listed in @code{ARGV}.
+
+@quotation NOTE
+For many years, @code{nextfile} was a
+common extension. In September 2012, it was accepted for
+inclusion into the POSIX standard.
+See @uref{http://austingroupbugs.net/view.php?id=607, the Austin Group website}.
+@end quotation
+
+@cindex functions, user-defined, @code{next}/@code{nextfile} statements and
+@cindex @code{nextfile} statement, user-defined functions and
+@cindex Brian Kernighan's @command{awk}
+@cindex @command{mawk} utility
+The current version of BWK @command{awk} and @command{mawk}
+also support @code{nextfile}.  However, they don't allow the
+@code{nextfile} statement inside function bodies (@pxref{User-defined}).
+@command{gawk} does; a @code{nextfile} inside a function body reads the
+first record from the next file and starts processing it with the first
+rule in the program, just as any other @code{nextfile} statement.
+
+@node Exit Statement
+@subsection The @code{exit} Statement
+
+@cindex @code{exit} statement
+The @code{exit} statement causes @command{awk} to immediately stop
+executing the current rule and to stop processing input; any remaining input
+is ignored.  The @code{exit} statement is written as follows:
+
+@display
+@code{exit} [@var{return code}]
+@end display
+
+@cindex @code{BEGIN} pattern, @code{exit} statement and
+@cindex @code{END} pattern, @code{exit} statement and
+When an @code{exit} statement is executed from a @code{BEGIN} rule, the
+program stops processing everything immediately.  No input records are
+read.  However, if an @code{END} rule is present,
+as part of executing the @code{exit} statement,
+the @code{END} rule is executed
+(@pxref{BEGIN/END}).
+If @code{exit} is used in the body of an @code{END} rule, it causes
+the program to stop immediately.
+
+An @code{exit} statement that is not part of a @code{BEGIN} or @code{END}
+rule stops the execution of any further automatic rules for the current
+record, skips reading any remaining input records, and executes the
+@code{END} rule if there is one.  @command{gawk} also skips
+any @code{ENDFILE} rules; they do not execute.
+
+In such a case,
+if you don't want the @code{END} rule to do its job, set a variable
+to a nonzero value before the @code{exit} statement and check that variable in
+the @code{END} rule.
+@xref{Assert Function}
+for an example that does this.
+
+@cindex dark corner, @code{exit} statement
+If an argument is supplied to @code{exit}, its value is used as the exit
+status code for the @command{awk} process.  If no argument is supplied,
+@code{exit} causes @command{awk} to return a ``success'' status.
+In the case where an argument
+is supplied to a first @code{exit} statement, and then @code{exit} is
+called a second time from an @code{END} rule with no argument,
+@command{awk} uses the previously supplied exit value.  @value{DARKCORNER}
+@xref{Exit Status} for more information.
+
+@cindex programming conventions, @code{exit} statement
+For example, suppose an error condition occurs that is difficult or
+impossible to handle.  Conventionally, programs report this by
+exiting with a nonzero status.  An @command{awk} program can do this
+using an @code{exit} statement with a nonzero argument, as shown
+in the following example:
+
+@example
+@group
+BEGIN @{
+    if (("date" | getline date_now) <= 0) @{
+        print "Can't get system date" > "/dev/stderr"
+        exit 1
+    @}
+@end group
+@group
+    print "current date is", date_now
+    close("date")
+@}
+@end group
+@end example
+
+@quotation NOTE
+For full portability, exit values should be between zero and 126, inclusive.
+Negative values, and values of 127 or greater, may not produce consistent
+results across different operating systems.
+@end quotation
+
+
+@node Built-in Variables
+@section Predefined Variables
+@cindex predefined variables
+@cindex variables, predefined
+
+Most @command{awk} variables are available to use for your own
+purposes; they never change unless your program assigns values to
+them, and they never affect anything unless your program examines them.
+However, a few variables in @command{awk} have special built-in meanings.
+@command{awk} examines some of these automatically, so that they enable you
+to tell @command{awk} how to do certain things.  Others are set
+automatically by @command{awk}, so that they carry information from the
+internal workings of @command{awk} to your program.
+
+@cindex @command{gawk}, predefined variables and
+This @value{SECTION} documents all of @command{gawk}'s predefined variables,
+most of which are also documented in the @value{CHAPTER}s describing
+their areas of activity.
+
+@menu
+* User-modified::               Built-in variables that you change to control
+                                @command{awk}.
+* Auto-set::                    Built-in variables where @command{awk} gives
+                                you information.
+* ARGC and ARGV::               Ways to use @code{ARGC} and @code{ARGV}.
+@end menu
+
+@node User-modified
+@subsection Built-in Variables That Control @command{awk}
+@cindex predefined variables, user-modifiable
+@cindex user-modifiable variables
+
+The following is an alphabetical list of variables that you can change to
+control how @command{awk} does certain things.
+
+The variables that are specific to @command{gawk} are marked with a pound
+sign (@samp{#}).  These variables are @command{gawk} extensions.  In other
+@command{awk} implementations or if @command{gawk} is in compatibility
+mode (@pxref{Options}), they are not special.  (Any exceptions are noted
+in the description of each variable.)
+
+@table @code
+@cindex @code{BINMODE} variable
+@cindex binary input/output
+@cindex input/output, binary
+@cindex differences in @command{awk} and @command{gawk}, @code{BINMODE} variable
+@item BINMODE #
+On non-POSIX systems, this variable specifies use of binary mode
+for all I/O.  Numeric values of one, two, or three specify that input
+files, output files, or all files, respectively, should use binary I/O.
+A numeric value less than zero is treated as zero, and a numeric value
+greater than three is treated as three.  Alternatively, string values
+of @code{"r"} or @code{"w"} specify that input files and output files,
+respectively, should use binary I/O.  A string value of @code{"rw"} or
+@code{"wr"} indicates that all files should use binary I/O.  Any other
+string value is treated the same as @code{"rw"}, but causes @command{gawk}
+to generate a warning message.  @code{BINMODE} is described in more
+detail in @ref{PC Using}.  @command{mawk} (@pxref{Other Versions})
+also supports this variable, but only using numeric values.
+
+@cindex @code{CONVFMT} variable
+@cindex POSIX @command{awk}, @code{CONVFMT} variable and
+@cindex numbers, converting, to strings
+@cindex strings, converting, numbers to
+@item @code{CONVFMT}
+A string that controls the conversion of numbers to
+strings (@pxref{Conversion}).
+It works by being passed, in effect, as the first argument to the
+@code{sprintf()} function
+(@pxref{String Functions}).
+Its default value is @code{"%.6g"}.
+@code{CONVFMT} was introduced by the POSIX standard.
+
+@cindex @command{gawk}, @code{FIELDWIDTHS} variable in
+@cindex @code{FIELDWIDTHS} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{FIELDWIDTHS} variable
+@cindex field separators, @code{FIELDWIDTHS} variable and
+@cindex separators, field, @code{FIELDWIDTHS} variable and
+@item FIELDWIDTHS #
+A space-separated list of columns that tells @command{gawk}
+how to split input with fixed columnar boundaries.
+Starting in @value{PVERSION} 4.2, each field width may optionally be
+preceded by a colon-separated value specifying the number of characters to skip
+before the field starts.
+Assigning a value to @code{FIELDWIDTHS}
+overrides the use of @code{FS} and @code{FPAT} for field splitting.
+@xref{Constant Size} for more information.
+
+@cindex @command{gawk}, @code{FPAT} variable in
+@cindex @code{FPAT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{FPAT} variable
+@cindex field separators, @code{FPAT} variable and
+@cindex separators, field, @code{FPAT} variable and
+@item FPAT #
+A regular expression (as a string) that tells @command{gawk}
+to create the fields based on text that matches the regular expression.
+Assigning a value to @code{FPAT}
+overrides the use of @code{FS} and @code{FIELDWIDTHS} for field splitting.
+@xref{Splitting By Content} for more information.
+
+@cindex @code{FS} variable
+@cindex separators, field
+@cindex field separators
+@item FS
+The input field separator (@pxref{Field Separators}).
+The value is a single-character string or a multicharacter regular
+expression that matches the separations between fields in an input
+record.  If the value is the null string (@code{""}), then each
+character in the record becomes a separate field.
+(This behavior is a @command{gawk} extension. POSIX @command{awk} does not
+specify the behavior when @code{FS} is the null string.
+Nonetheless, some other versions of @command{awk} also treat
+@code{""} specially.)
+
+The default value is @w{@code{" "}}, a string consisting of a single
+space.  As a special exception, this value means that any sequence of
+spaces, TABs, and/or newlines is a single separator.  It also causes
+spaces, TABs, and newlines at the beginning and end of a record to
+be ignored.
+
+You can set the value of @code{FS} on the command line using the
+@option{-F} option:
+
+@example
+awk -F, '@var{program}' @var{input-files}
+@end example
+
+@cindex @command{gawk}, field separators and
+If @command{gawk} is using @code{FIELDWIDTHS} or @code{FPAT}
+for field splitting,
+assigning a value to @code{FS} causes @command{gawk} to return to
+the normal, @code{FS}-based field splitting. An easy way to do this
+is to simply say @samp{FS = FS}, perhaps with an explanatory comment.
+
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+@cindex @code{IGNORECASE} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{IGNORECASE} variable
+@cindex case sensitivity, string comparisons and
+@cindex case sensitivity, regexps and
+@cindex regular expressions, case sensitivity
+@item IGNORECASE #
+If @code{IGNORECASE} is nonzero or non-null, then all string comparisons
+and all regular expression matching are case-independent.
+This applies to
+regexp matching with @samp{~} and @samp{!~},
+the @code{gensub()}, @code{gsub()}, @code{index()}, @code{match()},
+@code{patsplit()}, @code{split()}, and @code{sub()} functions,
+record termination with @code{RS}, and field splitting with
+@code{FS} and @code{FPAT}.
+However, the value of @code{IGNORECASE} does @emph{not} affect array subscripting
+and it does not affect field splitting when using a single-character
+field separator.
+@xref{Case-sensitivity}.
+
+@cindex @command{gawk}, @code{LINT} variable in
+@cindex @code{LINT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{LINT} variable
+@cindex lint checking
+@item LINT #
+When this variable is true (nonzero or non-null), @command{gawk}
+behaves as if the @option{--lint} command-line option is in effect
+(@pxref{Options}).
+With a value of @code{"fatal"}, lint warnings become fatal errors.
+With a value of @code{"invalid"}, only warnings about things that are
+actually invalid are issued. (This is not fully implemented yet.)
+Any other true value prints nonfatal warnings.
+Assigning a false value to @code{LINT} turns off the lint warnings.
+
+This variable is a @command{gawk} extension.  It is not special
+in other @command{awk} implementations.  Unlike with the other special variables,
+changing @code{LINT} does affect the production of lint warnings,
+even if @command{gawk} is in compatibility mode.  Much as
+the @option{--lint} and @option{--traditional} options independently
+control different aspects of @command{gawk}'s behavior, the control
+of lint warnings during program execution is independent of the flavor
+of @command{awk} being executed.
+
+@cindex @code{OFMT} variable
+@cindex numbers, converting, to strings
+@cindex strings, converting, numbers to
+@item OFMT
+A string that controls conversion of numbers to
+strings (@pxref{Conversion}) for
+printing with the @code{print} statement.  It works by being passed
+as the first argument to the @code{sprintf()} function
+(@pxref{String Functions}).
+Its default value is @code{"%.6g"}.  Earlier versions of @command{awk}
+used @code{OFMT} to specify the format for converting numbers to
+strings in general expressions; this is now done by @code{CONVFMT}.
+
+@cindex @code{print} statement, @code{OFMT} variable and
+@cindex @code{OFS} variable
+@cindex separators, field
+@cindex field separators
+@item OFS
+The output field separator (@pxref{Output Separators}).  It is
+output between the fields printed by a @code{print} statement.  Its
+default value is @w{@code{" "}}, a string consisting of a single space.
+
+@cindex @code{ORS} variable
+@item ORS
+The output record separator.  It is output at the end of every
+@code{print} statement.  Its default value is @code{"\n"}, the newline
+character.  (@xref{Output Separators}.)
+
+@cindex @code{PREC} variable
+@item PREC #
+The working precision of arbitrary-precision floating-point numbers,
+53 bits by default (@pxref{Setting precision}).
+
+@cindex @code{ROUNDMODE} variable
+@item ROUNDMODE #
+The rounding mode to use for arbitrary-precision arithmetic on
+numbers, by default @code{"N"} (@code{roundTiesToEven} in
+the IEEE 754 standard; @pxref{Setting the rounding mode}).
+
+@cindex @code{RS} variable
+@cindex separators, for records
+@cindex record separators
+@item @code{RS}
+The input record separator.  Its default value is a string
+containing a single newline character, which means that an input record
+consists of a single line of text.
+It can also be the null string, in which case records are separated by
+runs of blank lines.
+If it is a regexp, records are separated by
+matches of the regexp in the input text.
+(@xref{Records}.)
+
+The ability for @code{RS} to be a regular expression
+is a @command{gawk} extension.
+In most other @command{awk} implementations,
+or if @command{gawk} is in compatibility mode
+(@pxref{Options}),
+just the first character of @code{RS}'s value is used.
+
+@cindex @code{SUBSEP} variable
+@cindex separators, subscript
+@cindex subscript separators
+@item @code{SUBSEP}
+The subscript separator.  It has the default value of
+@code{"\034"} and is used to separate the parts of the indices of a
+multidimensional array.  Thus, the expression @samp{@w{foo["A", "B"]}}
+really accesses @code{foo["A\034B"]}
+(@pxref{Multidimensional}).
+
+@cindex @command{gawk}, @code{TEXTDOMAIN} variable in
+@cindex @code{TEXTDOMAIN} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{TEXTDOMAIN} variable
+@cindex internationalization, localization
+@item TEXTDOMAIN #
+Used for internationalization of programs at the
+@command{awk} level.  It sets the default text domain for specially
+marked string constants in the source text, as well as for the
+@code{dcgettext()}, @code{dcngettext()}, and @code{bindtextdomain()} functions
+(@pxref{Internationalization}).
+The default value of @code{TEXTDOMAIN} is @code{"messages"}.
+@end table
+
+@node Auto-set
+@subsection Built-in Variables That Convey Information
+
+@cindex predefined variables, conveying information
+@cindex variables, predefined, conveying information
+The following is an alphabetical list of variables that @command{awk}
+sets automatically on certain occasions in order to provide
+information to your program.
+
+The variables that are specific to @command{gawk} are marked with a pound
+sign (@samp{#}).  These variables are @command{gawk} extensions.  In other
+@command{awk} implementations or if @command{gawk} is in compatibility
+mode (@pxref{Options}), they are not special:
+
+@c @asis for docbook
+@table @asis
+@cindex @code{ARGC}/@code{ARGV} variables
+@cindex arguments, command-line
+@cindex command line, arguments
+@item @code{ARGC}, @code{ARGV}
+The command-line arguments available to @command{awk} programs are stored in
+an array called @code{ARGV}.  @code{ARGC} is the number of command-line
+arguments present.  @xref{Other Arguments}.
+Unlike most @command{awk} arrays,
+@code{ARGV} is indexed from 0 to @code{ARGC} @minus{} 1.
+In the following example:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{}
+>         @kbd{for (i = 0; i < ARGC; i++)}
+>             @kbd{print ARGV[i]}
+>      @kbd{@}' inventory-shipped mail-list}
+@print{} awk
+@print{} inventory-shipped
+@print{} mail-list
+@end group
+@end example
+
+@noindent
+@code{ARGV[0]} contains @samp{awk}, @code{ARGV[1]}
+contains @samp{inventory-shipped}, and @code{ARGV[2]} contains
+@samp{mail-list}.  The value of @code{ARGC} is three, one more than the
+index of the last element in @code{ARGV}, because the elements are numbered
+from zero.
+
+@cindex programming conventions, @code{ARGC}/@code{ARGV} variables
+The names @code{ARGC} and @code{ARGV}, as well as the convention of indexing
+the array from 0 to @code{ARGC} @minus{} 1, are derived from the C language's
+method of accessing command-line arguments.
+
+@cindex dark corner, value of @code{ARGV[0]}
+The value of @code{ARGV[0]} can vary from system to system.
+Also, you should note that the program text is @emph{not} included in
+@code{ARGV}, nor are any of @command{awk}'s command-line options.
+@xref{ARGC and ARGV} for information
+about how @command{awk} uses these variables.
+@value{DARKCORNER}
+
+@cindex @code{ARGIND} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{ARGIND} variable
+@item @code{ARGIND #}
+The index in @code{ARGV} of the current file being processed.
+Every time @command{gawk} opens a new @value{DF} for processing, it sets
+@code{ARGIND} to the index in @code{ARGV} of the @value{FN}.
+When @command{gawk} is processing the input files,
+@samp{FILENAME == ARGV[ARGIND]} is always true.
+
+@cindex files, processing@comma{} @code{ARGIND} variable and
+This variable is useful in file processing; it allows you to tell how far
+along you are in the list of @value{DF}s as well as to distinguish between
+successive instances of the same @value{FN} on the command line.
+
+@cindex file names, distinguishing
+While you can change the value of @code{ARGIND} within your @command{awk}
+program, @command{gawk} automatically sets it to a new value when it
+opens the next file.
+
+@cindex @code{ENVIRON} array
+@cindex environment variables, in @code{ENVIRON} array
+@item @code{ENVIRON}
+An associative array containing the values of the environment.  The array
+indices are the environment variable names; the elements are the values of
+the particular environment variables.  For example,
+@code{ENVIRON["HOME"]} might be @code{/home/arnold}.
+
+For POSIX @command{awk}, changing this array does not affect the
+environment passed on to any programs that @command{awk} may spawn via
+redirection or the @code{system()} function.
+
+However, beginning with @value{PVERSION} 4.2, if not in POSIX
+compatibility mode, @command{gawk} does update its own environment when
+@code{ENVIRON} is changed, thus changing the environment seen by programs
+that it creates.  You should therefore be especially careful if you
+modify @code{ENVIRON["PATH"]}, which is the search path for finding
+executable programs.
+
+This can also affect the running @command{gawk} program, since some of the
+built-in functions may pay attention to certain environment variables.
+The most notable instance of this is @code{mktime()} (@pxref{Time
+Functions}), which pays attention the value of the @env{TZ} environment
+variable on many systems.
+
+Some operating systems may not have environment variables.
+On such systems, the @code{ENVIRON} array is empty (except for
+@w{@code{ENVIRON["AWKPATH"]}} and
+@w{@code{ENVIRON["AWKLIBPATH"]}};
+@pxref{AWKPATH Variable} and
+@ifdocbook
+@ref{AWKLIBPATH Variable}).
+@end ifdocbook
+@ifnotdocbook
+@pxref{AWKLIBPATH Variable}).
+@end ifnotdocbook
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{ERRNO} variable
+@cindex error handling, @code{ERRNO} variable and
+@item @code{ERRNO #}
+If a system error occurs during a redirection for @code{getline}, during
+a read for @code{getline}, or during a @code{close()} operation, then
+@code{ERRNO} contains a string describing the error.
+
+In addition, @command{gawk} clears @code{ERRNO} before opening each
+command-line input file. This enables checking if the file is readable
+inside a @code{BEGINFILE} pattern (@pxref{BEGINFILE/ENDFILE}).
+
+Otherwise, @code{ERRNO} works similarly to the C variable @code{errno}.
+Except for the case just mentioned, @command{gawk} @emph{never} clears
+it (sets it to zero or @code{""}).  Thus, you should only expect its
+value to be meaningful when an I/O operation returns a failure value,
+such as @code{getline} returning @minus{}1.  You are, of course, free
+to clear it yourself before doing an I/O operation.
+
+If the value of @code{ERRNO} corresponds to a system error in the C
+@code{errno} variable, then @code{PROCINFO["errno"]} will be set to the value
+of @code{errno}.  For non-system errors, @code{PROCINFO["errno"]} will
+be zero.
+
+@cindex @code{FILENAME} variable
+@cindex dark corner, @code{FILENAME} variable
+@item @code{FILENAME}
+The name of the current input file.  When no @value{DF}s are listed
+on the command line, @command{awk} reads from the standard input and
+@code{FILENAME} is set to @code{"-"}.  @code{FILENAME} changes each
+time a new file is read (@pxref{Reading Files}).  Inside a @code{BEGIN}
+rule, the value of @code{FILENAME} is @code{""}, because there are no input
+files being processed yet.@footnote{Some early implementations of Unix
+@command{awk} initialized @code{FILENAME} to @code{"-"}, even if there
+were @value{DF}s to be processed. This behavior was incorrect and should
+not be relied upon in your programs.} @value{DARKCORNER} Note, though,
+that using @code{getline} (@pxref{Getline}) inside a @code{BEGIN} rule
+can give @code{FILENAME} a value.
+
+@cindex @code{FNR} variable
+@item @code{FNR}
+The current record number in the current file.  @command{awk} increments
+@code{FNR} each time it reads a new record (@pxref{Records}).
+@command{awk} resets @code{FNR} to zero each time it starts a new
+input file.
+
+@cindex @code{NF} variable
+@item @code{NF}
+The number of fields in the current input record.
+@code{NF} is set each time a new record is read, when a new field is
+created, or when @code{$0} changes (@pxref{Fields}).
+
+Unlike most of the variables described in this @value{SUBSECTION},
+assigning a value to @code{NF} has the potential to affect
+@command{awk}'s internal workings.  In particular, assignments
+to @code{NF} can be used to create fields in or remove fields from the
+current record. @xref{Changing Fields}.
+
+@cindex @code{FUNCTAB} array
+@cindex @command{gawk}, @code{FUNCTAB} array in
+@cindex differences in @command{awk} and @command{gawk}, @code{FUNCTAB} variable
+@item @code{FUNCTAB #}
+An array whose indices and corresponding values are the names of all
+the built-in, user-defined, and extension functions in the program.
+
+@quotation NOTE
+Attempting to use the @code{delete} statement with the @code{FUNCTAB}
+array causes a fatal error.  Any attempt to assign to an element of
+@code{FUNCTAB} also causes a fatal error.
+@end quotation
+
+@cindex @code{NR} variable
+@item @code{NR}
+The number of input records @command{awk} has processed since
+the beginning of the program's execution
+(@pxref{Records}).
+@command{awk} increments @code{NR} each time it reads a new record.
+
+@cindex @command{gawk}, @code{PROCINFO} array in
+@cindex @code{PROCINFO} array
+@cindex differences in @command{awk} and @command{gawk}, @code{PROCINFO} array
+@item @code{PROCINFO #}
+The elements of this array provide access to information about the
+running @command{awk} program.
+The following elements (listed alphabetically)
+are guaranteed to be available:
+
+@table @code
+@item PROCINFO["argv"]
+@cindex command line, arguments
+The @code{PROCINFO["argv"]} array contains all of the command-line arguments
+(after glob expansion and redirection processing on platforms where that must
+be done manually by the program) with subscripts ranging from 0 through
+@code{argc} @minus{} 1.  For example, @code{PROCINFO["argv"][0]} will contain
+the name by which @command{gawk} was invoked.  Here is an example of how this
+feature may be used:
+
+@example
+gawk '
+BEGIN @{
+        for (i = 0; i < length(PROCINFO["argv"]); i++)
+                print i, PROCINFO["argv"][i]
+@}'
+@end example
+
+Please note that this differs from the standard @code{ARGV} array which does
+not include command-line arguments that have already been processed by
+@command{gawk} (@pxref{ARGC and ARGV}).
+
+@cindex effective group ID of @command{gawk} user
+@item PROCINFO["egid"]
+The value of the @code{getegid()} system call.
+
+@item PROCINFO["errno"]
+The value of the C @code{errno} variable when @code{ERRNO} is set to
+the associated error message.
+
+@item PROCINFO["euid"]
+@cindex effective user ID of @command{gawk} user
+The value of the @code{geteuid()} system call.
+
+@item PROCINFO["FS"]
+This is
+@code{"FS"} if field splitting with @code{FS} is in effect,
+@code{"FIELDWIDTHS"} if field splitting with @code{FIELDWIDTHS} is in effect,
+@code{"FPAT"} if field matching with @code{FPAT} is in effect,
+or @code{"API"} if field splitting is controlled by an API input parser.
+
+@item PROCINFO["gid"]
+@cindex group ID of @command{gawk} user
+The value of the @code{getgid()} system call.
+
+@item PROCINFO["identifiers"]
+@cindex program identifiers
+A subarray, indexed by the names of all identifiers used in the text of
+the @command{awk} program.  An @dfn{identifier} is simply the name of a variable
+(be it scalar or array), built-in function, user-defined function, or
+extension function.  For each identifier, the value of the element is
+one of the following:
+
+@table @code
+@item "array"
+The identifier is an array.
+
+@item "builtin"
+The identifier is a built-in function.
+
+@item "extension"
+The identifier is an extension function loaded via
+@code{@@load} or @option{-l}.
+
+@item "scalar"
+The identifier is a scalar.
+
+@item "untyped"
+The identifier is untyped (could be used as a scalar or an array;
+@command{gawk} doesn't know yet).
+
+@item "user"
+The identifier is a user-defined function.
+@end table
+
+@noindent
+The values indicate what @command{gawk} knows about the identifiers
+after it has finished parsing the program; they are @emph{not} updated
+while the program runs.
+
+@item PROCINFO["platform"]
+@cindex platform running on
+This element gives a string indicating the platform for which
+@command{gawk} was compiled. The value will be one of the following:
+
+@c nested table
+@table @code
+@item "djgpp"
+@itemx "mingw"
+Microsoft Windows, using either DJGPP or MinGW, respectively.
+
+@item "os2"
+OS/2.
+
+@item "os390"
+OS/390.
+
+@item "posix"
+GNU/Linux, Cygwin, Mac OS X, and legacy Unix systems.
+
+@item "vms"
+OpenVMS or Vax/VMS.
+@end table
+
+@item PROCINFO["pgrpid"]
+@cindex process group ID of @command{gawk} process
+The process group ID of the current process.
+
+@item PROCINFO["pid"]
+@cindex process ID of @command{gawk} process
+The process ID of the current process.
+
+@item PROCINFO["ppid"]
+@cindex parent process ID of @command{gawk} process
+The parent process ID of the current process.
+
+@item PROCINFO["strftime"]
+The default time format string for @code{strftime()}.
+Assigning a new value to this element changes the default.
+@xref{Time Functions}.
+
+@item PROCINFO["uid"]
+The value of the @code{getuid()} system call.
+
+@item PROCINFO["version"]
+@cindex version of @command{gawk}
+@cindex @command{gawk} version
+The version of @command{gawk}.
+@end table
+
+The following additional elements in the array
+are available to provide information about the MPFR and GMP libraries
+if your version of @command{gawk} supports arbitrary-precision arithmetic
+(@pxref{Arbitrary Precision Arithmetic}):
+
+@table @code
+@item PROCINFO["gmp_version"]
+@cindex version of GNU MP library
+The version of the GNU MP library.
+
+@cindex version of GNU MPFR library
+@item PROCINFO["mpfr_version"]
+The version of the GNU MPFR library.
+
+@item PROCINFO["prec_max"]
+@cindex maximum precision supported by MPFR library
+The maximum precision supported by MPFR.
+
+@item PROCINFO["prec_min"]
+@cindex minimum precision required by MPFR library
+The minimum precision required by MPFR.
+@end table
+
+The following additional elements in the array are available to provide
+information about the version of the extension API, if your version
+of @command{gawk} supports dynamic loading of extension functions
+(@pxref{Dynamic Extensions}):
+
+@table @code
+@item PROCINFO["api_major"]
+@cindex version of @command{gawk} extension API
+@cindex extension API, version number
+The major version of the extension API.
+
+@item PROCINFO["api_minor"]
+The minor version of the extension API.
+@end table
+
+@cindex supplementary groups of @command{gawk} process
+On some systems, there may be elements in the array, @code{"group1"}
+through @code{"group@var{N}"} for some @var{N}. @var{N} is the number of
+supplementary groups that the process has.  Use the @code{in} operator
+to test for these elements
+(@pxref{Reference to Elements}).
+
+The following elements allow you to change @command{gawk}'s behavior:
+
+@table @code
+@item PROCINFO["NONFATAL"]
+If this element exists, then I/O errors for all redirections become nonfatal.
+@xref{Nonfatal}.
+
+@item PROCINFO["@var{name}", "NONFATAL"]
+Make I/O errors for @var{name} be nonfatal.
+@xref{Nonfatal}.
+
+@item PROCINFO["@var{command}", "pty"]
+For two-way communication to @var{command}, use a pseudo-tty instead
+of setting up a two-way pipe.
+@xref{Two-way I/O} for more information.
+
+@item PROCINFO["@var{input_name}", "READ_TIMEOUT"]
+Set a timeout for reading from input redirection @var{input_name}.
+@xref{Read Timeout} for more information.
+
+@item PROCINFO["@var{input_name}", "RETRY"]
+If an I/O error that may be retried occurs when reading data from
+@var{input_name}, and this array entry exists, then @code{getline} returns
+@minus{}2 instead of following the default behavior of returning @minus{}1
+and configuring @var{input_name} to return no further data.  An I/O error
+that may be retried is one where @code{errno} has the value @code{EAGAIN},
+@code{EWOULDBLOCK}, @code{EINTR}, or @code{ETIMEDOUT}.  This may be useful
+in conjunction with @code{PROCINFO["@var{input_name}", "READ_TIMEOUT"]}
+or situations where a file descriptor has been configured to behave in
+a non-blocking fashion.
+@xref{Retrying Input} for more information.
+
+@item PROCINFO["sorted_in"]
+If this element exists in @code{PROCINFO}, its value controls the
+order in which array indices will be processed by
+@samp{for (@var{indx} in @var{array})} loops.
+This is an advanced feature, so we defer the
+full description until later; see
+@ref{Controlling Scanning}.
+@end table
+
+@cindex @code{RLENGTH} variable
+@item @code{RLENGTH}
+The length of the substring matched by the
+@code{match()} function
+(@pxref{String Functions}).
+@code{RLENGTH} is set by invoking the @code{match()} function.  Its value
+is the length of the matched string, or @minus{}1 if no match is found.
+
+@cindex @code{RSTART} variable
+@item @code{RSTART}
+The start index in characters of the substring that is matched by the
+@code{match()} function
+(@pxref{String Functions}).
+@code{RSTART} is set by invoking the @code{match()} function.  Its value
+is the position of the string where the matched substring starts, or zero
+if no match was found.
+
+@cindex @command{gawk}, @code{RT} variable in
+@cindex @code{RT} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{RS}/@code{RT} variables
+@item @code{RT #}
+The input text that matched the text denoted by @code{RS},
+the record separator.  It is set every time a record is read.
+
+@cindex @command{gawk}, @code{SYMTAB} array in
+@cindex @code{SYMTAB} array
+@cindex differences in @command{awk} and @command{gawk}, @code{SYMTAB} variable
+@item @code{SYMTAB #}
+An array whose indices are the names of all defined global variables and
+arrays in the program.  @code{SYMTAB} makes @command{gawk}'s symbol table
+visible to the @command{awk} programmer.  It is built as @command{gawk}
+parses the program and is complete before the program starts to run.
+
+The array may be used for indirect access to read or write the value of
+a variable:
+
+@example
+foo = 5
+SYMTAB["foo"] = 4
+print foo    # prints 4
+@end example
+
+@noindent
+The @code{isarray()} function (@pxref{Type Functions}) may be used to test
+if an element in @code{SYMTAB} is an array.
+Also, you may not use the @code{delete} statement with the
+@code{SYMTAB} array.
+
+Prior to @value{PVERSION} 5.0 of @command{gawk}, you could
+use an index for @code{SYMTAB} that was not a predefined identifier:
+
+@example
+SYMTAB["xxx"] = 5
+print SYMTAB["xxx"]
+@end example
+
+@noindent
+This no longer works, instead producing a fatal error, as it led
+to rampant confusion.
+
+@cindex Schorr, Andrew
+The @code{SYMTAB} array is more interesting than it looks. Andrew Schorr
+points out that it effectively gives @command{awk} data pointers. Consider his
+example:
+
+@example
+@group
+# Indirect multiply of any variable by amount, return result
+
+function multiply(variable, amount)
+@{
+    return SYMTAB[variable] *= amount
+@}
+@end group
+@end example
+
+@noindent
+You would use it like this:
+
+@example
+BEGIN @{
+    answer = 10.5
+    multiply("answer", 4)
+    print "The answer is", answer
+@}
+@end example
+
+@noindent
+When run, this produces:
+
+@example
+$ @kbd{gawk -f answer.awk}
+@print{} The answer is 42
+@end example
+
+@quotation NOTE
+In order to avoid severe time-travel paradoxes,@footnote{Not to mention
+difficult implementation issues.} neither @code{FUNCTAB} nor @code{SYMTAB}
+is available as an element within the @code{SYMTAB} array.
+@end quotation
+@end table
+
+@sidebar Changing @code{NR} and @code{FNR}
+@cindex @code{NR} variable, changing
+@cindex @code{FNR} variable, changing
+@cindex dark corner, @code{FNR}/@code{NR} variables
+@command{awk} increments @code{NR} and @code{FNR}
+each time it reads a record, instead of setting them to the absolute
+value of the number of records read.  This means that a program can
+change these variables and their new values are incremented for
+each record.
+@value{DARKCORNER}
+The following example shows this:
+
+@example
+$ @kbd{echo '1}
+> @kbd{2}
+> @kbd{3}
+> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}}
+> @kbd{@{ print NR @}'}
+@print{} 1
+@print{} 17
+@print{} 18
+@print{} 19
+@end example
+
+@noindent
+Before @code{FNR} was added to the @command{awk} language
+(@pxref{V7/SVR3.1}),
+many @command{awk} programs used this feature to track the number of
+records in a file by resetting @code{NR} to zero when @code{FILENAME}
+changed.
+@end sidebar
+
+@node ARGC and ARGV
+@subsection Using @code{ARGC} and @code{ARGV}
+@cindex @code{ARGC}/@code{ARGV} variables, how to use
+@cindex arguments, command-line
+@cindex command line, arguments
+
+@ref{Auto-set}
+presented the following program describing the information contained in @code{ARGC}
+and @code{ARGV}:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{}
+>        @kbd{for (i = 0; i < ARGC; i++)}
+>            @kbd{print ARGV[i]}
+>      @kbd{@}' inventory-shipped mail-list}
+@print{} awk
+@print{} inventory-shipped
+@print{} mail-list
+@end group
+@end example
+
+@noindent
+In this example, @code{ARGV[0]} contains @samp{awk}, @code{ARGV[1]}
+contains @samp{inventory-shipped}, and @code{ARGV[2]} contains
+@samp{mail-list}.
+Notice that the @command{awk} program is not entered in @code{ARGV}.  The
+other command-line options, with their arguments, are also not
+entered.  This includes variable assignments done with the @option{-v}
+option (@pxref{Options}).
+Normal variable assignments on the command line @emph{are}
+treated as arguments and do show up in the @code{ARGV} array.
+Given the following program in a file named @file{showargs.awk}:
+
+@example
+BEGIN @{
+    printf "A=%d, B=%d\n", A, B
+    for (i = 0; i < ARGC; i++)
+        printf "\tARGV[%d] = %s\n", i, ARGV[i]
+@}
+END   @{ printf "A=%d, B=%d\n", A, B @}
+@end example
+
+@noindent
+Running it produces the following:
+
+@example
+$ @kbd{awk -v A=1 -f showargs.awk B=2 /dev/null}
+@print{} A=1, B=0
+@print{}        ARGV[0] = awk
+@print{}        ARGV[1] = B=2
+@print{}        ARGV[2] = /dev/null
+@print{} A=1, B=2
+@end example
+
+A program can alter @code{ARGC} and the elements of @code{ARGV}.
+Each time @command{awk} reaches the end of an input file, it uses the next
+element of @code{ARGV} as the name of the next input file.  By storing a
+different string there, a program can change which files are read.
+Use @code{"-"} to represent the standard input.  Storing
+additional elements and incrementing @code{ARGC} causes
+additional files to be read.
+
+If the value of @code{ARGC} is decreased, that eliminates input files
+from the end of the list.  By recording the old value of @code{ARGC}
+elsewhere, a program can treat the eliminated arguments as
+something other than @value{FN}s.
+
+To eliminate a file from the middle of the list, store the null string
+(@code{""}) into @code{ARGV} in place of the file's name.  As a
+special feature, @command{awk} ignores @value{FN}s that have been
+replaced with the null string.
+Another option is to
+use the @code{delete} statement to remove elements from
+@code{ARGV} (@pxref{Delete}).
+
+All of these actions are typically done in the @code{BEGIN} rule,
+before actual processing of the input begins.
+@xref{Split Program} and
+@ifnotdocbook
+@pxref{Tee Program}
+@end ifnotdocbook
+@ifdocbook
+@ref{Tee Program}
+@end ifdocbook
+for examples
+of each way of removing elements from @code{ARGV}.
+
+To actually get options into an @command{awk} program,
+end the @command{awk} options with @option{--} and then supply
+the @command{awk} program's options, in the following manner:
+
+@example
+awk -f myprog.awk -- -v -q file1 file2 @dots{}
+@end example
+
+The following fragment processes @code{ARGV} in order to examine, and
+then remove, the previously mentioned command-line options:
+
+@example
+BEGIN @{
+    for (i = 1; i < ARGC; i++) @{
+        if (ARGV[i] == "-v")
+            verbose = 1
+        else if (ARGV[i] == "-q")
+            debug = 1
+        else if (ARGV[i] ~ /^-./) @{
+            e = sprintf("%s: unrecognized option -- %c",
+                    ARGV[0], substr(ARGV[i], 2, 1))
+            print e > "/dev/stderr"
+        @} else
+            break
+        delete ARGV[i]
+    @}
+@}
+@end example
+
+@cindex differences in @command{awk} and @command{gawk}, @code{ARGC}/@code{ARGV} variables
+Ending the @command{awk} options with @option{--} isn't
+necessary in @command{gawk}. Unless @option{--posix} has
+been specified, @command{gawk} silently puts any unrecognized options
+into @code{ARGV} for the @command{awk} program to deal with.  As soon
+as it sees an unknown option, @command{gawk} stops looking for other
+options that it might otherwise recognize.  The previous command line with
+@command{gawk} would be:
+
+@example
+gawk -f myprog.awk -q -v file1 file2 @dots{}
+@end example
+
+@noindent
+Because @option{-q} is not a valid @command{gawk} option, it and the
+following @option{-v} are passed on to the @command{awk} program.
+(@xref{Getopt Function} for an @command{awk} library function that
+parses command-line options.)
+
+When designing your program, you should choose options that don't
+conflict with @command{gawk}'s, because it will process any options
+that it accepts before passing the rest of the command line on to
+your program.  Using @samp{#!} with the @option{-E} option may help
+(@pxref{Executable Scripts}
+and
+@ifnotdocbook
+@pxref{Options}).
+@end ifnotdocbook
+@ifdocbook
+@ref{Options}).
+@end ifdocbook
+
+@node Pattern Action Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Pattern--action pairs make up the basic elements of an @command{awk}
+program.  Patterns are either normal expressions, range expressions,
+or regexp constants; one of the special keywords @code{BEGIN}, @code{END},
+@code{BEGINFILE}, or @code{ENDFILE}; or empty.  The action executes if
+the current record matches the pattern.  Empty (missing) patterns match
+all records.
+
+@item
+I/O from @code{BEGIN} and @code{END} rules has certain constraints.
+This is also true, only more so, for @code{BEGINFILE} and @code{ENDFILE}
+rules.  The latter two give you ``hooks'' into @command{gawk}'s file
+processing, allowing you to recover from a file that otherwise would
+cause a fatal error (such as a file that cannot be opened).
+
+@item
+Shell variables can be used in @command{awk} programs by careful
+use of shell quoting.  It is easier to pass a shell variable into
+@command{awk} by using the @option{-v} option and an @command{awk}
+variable.
+
+@item
+Actions consist of statements enclosed in curly braces. Statements
+are built up from expressions, control statements, compound statements,
+input and output statements, and deletion statements.
+
+@item
+The control statements in @command{awk} are @code{if}-@code{else},
+@code{while}, @code{for}, and @code{do}-@code{while}.  @command{gawk}
+adds the @code{switch} statement.  There are two flavors of @code{for}
+statement: one for performing general looping, and the other for iterating
+through an array.
+
+@item
+@code{break} and @code{continue} let you exit early or start the next
+iteration of a loop (or get out of a @code{switch}).
+
+@item
+@code{next} and @code{nextfile} let you read the next record and start
+over at the top of your program or skip to the next input file and
+start over, respectively.
+
+@item
+The @code{exit} statement terminates your program. When executed
+from an action (or function body), it transfers control to the
+@code{END} statements. From an @code{END} statement body, it exits
+immediately.  You may pass an optional numeric value to be used
+as @command{awk}'s exit status.
+
+@item
+Some predefined variables provide control over @command{awk}, mainly for I/O.
+Other variables convey information from @command{awk} to your program.
+
+@item
+@code{ARGC} and @code{ARGV} make the command-line arguments available
+to your program. Manipulating them from a @code{BEGIN} rule lets you
+control how @command{awk} will process the provided @value{DF}s.
+
+@end itemize
+
+@node Arrays
+@chapter Arrays in @command{awk}
+@cindex arrays
+
+An @dfn{array} is a table of values called @dfn{elements}.  The
+elements of an array are distinguished by their @dfn{indices}.  Indices
+may be either numbers or strings.
+
+This @value{CHAPTER} describes how arrays work in @command{awk},
+how to use array elements, how to scan through every element in an array,
+and how to remove array elements.
+It also describes how @command{awk} simulates multidimensional
+arrays, as well as some of the less obvious points about array usage.
+The @value{CHAPTER} moves on to discuss @command{gawk}'s facility
+for sorting arrays, and ends with a brief description of @command{gawk}'s
+ability to support true arrays of arrays.
+
+@menu
+* Array Basics::                The basics of arrays.
+* Numeric Array Subscripts::    How to use numbers as subscripts in
+                                @command{awk}.
+* Uninitialized Subscripts::    Using Uninitialized variables as subscripts.
+* Delete::                      The @code{delete} statement removes an element
+                                from an array.
+* Multidimensional::            Emulating multidimensional arrays in
+                                @command{awk}.
+* Arrays of Arrays::            True multidimensional arrays.
+* Arrays Summary::              Summary of arrays.
+@end menu
+
+@node Array Basics
+@section The Basics of Arrays
+
+This @value{SECTION} presents the basics: working with elements
+in arrays one at a time, and traversing all of the elements in
+an array.
+
+@menu
+* Array Intro::                 Introduction to Arrays
+* Reference to Elements::       How to examine one element of an array.
+* Assigning Elements::          How to change an element of an array.
+* Array Example::               Basic Example of an Array
+* Scanning an Array::           A variation of the @code{for} statement. It
+                                loops through the indices of an array's
+                                existing elements.
+* Controlling Scanning::        Controlling the order in which arrays are
+                                scanned.
+@end menu
+
+@node Array Intro
+@subsection Introduction to Arrays
+
+@cindex Wall, Larry
+@quotation
+@i{Doing linear scans over an associative array is like trying to club someone
+to death with a loaded Uzi.}
+@author Larry Wall
+@end quotation
+
+The @command{awk} language provides one-dimensional arrays
+for storing groups of related strings or numbers.
+Every @command{awk} array must have a name.  Array names have the same
+syntax as variable names; any valid variable name would also be a valid
+array name.  But one name cannot be used in both ways (as an array and
+as a variable) in the same @command{awk} program.
+
+Arrays in @command{awk} superficially resemble arrays in other programming
+languages, but there are fundamental differences.  In @command{awk}, it
+isn't necessary to specify the size of an array before starting to use it.
+Additionally, any number or string, not just consecutive integers,
+may be used as an array index.
+
+In most other languages, arrays must be @dfn{declared} before use,
+including a specification of
+how many elements or components they contain.  In such languages, the
+declaration causes a contiguous block of memory to be allocated for that
+many elements.  Usually, an index in the array must be a nonnegative integer.
+For example, the index zero specifies the first element in the array, which is
+actually stored at the beginning of the block of memory.  Index one
+specifies the second element, which is stored in memory right after the
+first element, and so on.  It is impossible to add more elements to the
+array, because it has room only for as many elements as given in
+the declaration.
+(Some languages allow arbitrary starting and ending
+indices---e.g., @samp{15 .. 27}---but the size of the array is still fixed when
+the array is declared.)
+
+@c 1/2015: Do not put the numeric values into @code. Array element
+@c values are no different than scalar variable values.
+A contiguous array of four elements might look like
+@ifnotdocbook
+@ref{figure-array-elements},
+@end ifnotdocbook
+@ifdocbook
+@inlineraw{docbook, <xref linkend="figure-array-elements"/>},
+@end ifdocbook
+conceptually, if the element values are eight, @code{"foo"},
+@code{""}, and 30.
+
+@ifnotdocbook
+@float Figure,figure-array-elements
+@caption{A contiguous array}
+@center @image{array-elements, , , A Contiguous Array}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-array-elements" float="0">
+<title>A contiguous array</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="array-elements.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+@noindent
+Only the values are stored; the indices are implicit from the order of
+the values. Here, eight is the value at index zero, because eight appears in the
+position with zero elements before it.
+
+@cindex arrays, indexing
+@cindex indexing arrays
+@cindex associative arrays
+@cindex arrays, associative
+Arrays in @command{awk} are different---they are @dfn{associative}.  This means
+that each array is a collection of pairs---an index and its corresponding
+array element value:
+
+@ifnotdocbook
+@c extra empty column to indent it right
+@multitable @columnfractions .1 .1 .1
+@headitem @tab Index @tab Value
+@item @tab @code{3} @tab @code{30}
+@item @tab @code{1} @tab @code{"foo"}
+@item @tab @code{0} @tab @code{8}
+@item @tab @code{2} @tab @code{""}
+@end multitable
+@end ifnotdocbook
+
+@docbook
+<informaltable>
+<tgroup cols="2">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<thead>
+<row>
+<entry>Index</entry>
+<entry>Value</entry>
+</row>
+</thead>
+
+<tbody>
+<row>
+<entry><literal>3</literal></entry>
+<entry><literal>30</literal></entry>
+</row>
+
+<row>
+<entry><literal>1</literal></entry>
+<entry><literal>"foo"</literal></entry>
+</row>
+
+<row>
+<entry><literal>0</literal></entry>
+<entry><literal>8</literal></entry>
+</row>
+
+<row>
+<entry><literal>2</literal></entry>
+<entry><literal>""</literal></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+@noindent
+The pairs are shown in jumbled order because their order is
+irrelevant.@footnote{The ordering will vary among @command{awk}
+implementations, which typically use hash tables to store array elements
+and values.}
+
+One advantage of associative arrays is that new pairs can be added
+at any time.  For example, suppose a tenth element is added to the array
+whose value is @w{@code{"number ten"}}.  The result is:
+
+@ifnotdocbook
+@c extra empty column to indent it right
+@multitable @columnfractions .1 .1 .2
+@headitem @tab Index @tab Value
+@item @tab @code{10} @tab @code{"number ten"}
+@item @tab @code{3} @tab @code{30}
+@item @tab @code{1} @tab @code{"foo"}
+@item @tab @code{0} @tab @code{8}
+@item @tab @code{2} @tab @code{""}
+@end multitable
+@end ifnotdocbook
+
+@docbook
+<informaltable>
+<tgroup cols="2">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<thead>
+<row>
+<entry>Index</entry>
+<entry>Value</entry>
+</row>
+</thead>
+<tbody>
+
+<row>
+<entry><literal>10</literal></entry>
+<entry><literal>"number ten"</literal></entry>
+</row>
+
+<row>
+<entry><literal>3</literal></entry>
+<entry><literal>30</literal></entry>
+</row>
+
+<row>
+<entry><literal>1</literal></entry>
+<entry><literal>"foo"</literal></entry>
+</row>
+
+<row>
+<entry><literal>0</literal></entry>
+<entry><literal>8</literal></entry>
+</row>
+
+<row>
+<entry><literal>2</literal></entry>
+<entry><literal>""</literal></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+@noindent
+@cindex sparse arrays
+@cindex arrays, sparse
+Now the array is @dfn{sparse}, which just means some indices are missing.
+It has elements 0--3 and 10, but doesn't have elements 4, 5, 6, 7, 8, or 9.
+
+Another consequence of associative arrays is that the indices don't
+have to be nonnegative integers.  Any number, or even a string, can be
+an index.  For example, the following is an array that translates words from
+English to French:
+
+@ifnotdocbook
+@multitable @columnfractions .1 .1 .1
+@headitem @tab Index @tab Value
+@item @tab @code{"dog"} @tab @code{"chien"}
+@item @tab @code{"cat"} @tab @code{"chat"}
+@item @tab @code{"one"} @tab @code{"un"}
+@item @tab @code{1} @tab @code{"un"}
+@end multitable
+@end ifnotdocbook
+
+@docbook
+<informaltable>
+<tgroup cols="2">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<thead>
+<row>
+<entry>Index</entry>
+<entry>Value</entry>
+</row>
+</thead>
+<tbody>
+<row>
+<entry><literal>"dog"</literal></entry>
+<entry><literal>"chien"</literal></entry>
+</row>
+
+<row>
+<entry><literal>"cat"</literal></entry>
+<entry><literal>"chat"</literal></entry>
+</row>
+
+<row>
+<entry><literal>"one"</literal></entry>
+<entry><literal>"un"</literal></entry>
+</row>
+
+<row>
+<entry><literal>1</literal></entry>
+<entry><literal>"un"</literal></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+@noindent
+Here we decided to translate the number one in both spelled-out and
+numeric form---thus illustrating that a single array can have both
+numbers and strings as indices.
+(In fact, array subscripts are always strings.
+There are some subtleties to how numbers work when used as
+array subscripts; this is discussed in more detail in
+@ref{Numeric Array Subscripts}.)
+Here, the number @code{1} isn't double-quoted, because @command{awk}
+automatically converts it to a string.
+
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+@cindex case sensitivity, array indices and
+@cindex arrays, @code{IGNORECASE} variable and
+@cindex @code{IGNORECASE} variable, array indices and
+The value of @code{IGNORECASE} has no effect upon array subscripting.
+The identical string value used to store an array element must be used
+to retrieve it.
+When @command{awk} creates an array (e.g., with the @code{split()}
+built-in function),
+that array's indices are consecutive integers starting at one.
+(@xref{String Functions}.)
+
+@command{awk}'s arrays are efficient---the time to access an element
+is independent of the number of elements in the array.
+
+@node Reference to Elements
+@subsection Referring to an Array Element
+@cindex arrays, referencing elements
+@cindex array members
+@cindex elements of arrays
+
+The principal way to use an array is to refer to one of its elements.
+An @dfn{array reference} is an expression as follows:
+
+@example
+@var{array}[@var{index-expression}]
+@end example
+
+@noindent
+Here, @var{array} is the name of an array.  The expression @var{index-expression} is
+the index of the desired element of the array.
+
+@c 1/2015: Having the 4.3 in @samp is a little iffy. It's essentially
+@c an expression though, so leave be. It's to early in the discussion
+@c to mention that it's really a string.
+The value of the array reference is the current value of that array
+element.  For example, @code{foo[4.3]} is an expression referencing the element
+of array @code{foo} at index @samp{4.3}.
+
+@cindex arrays, unassigned elements
+@cindex unassigned array elements
+@cindex empty array elements
+A reference to an array element that has no recorded value yields a value of
+@code{""}, the null string.  This includes elements
+that have not been assigned any value as well as elements that have been
+deleted (@pxref{Delete}).
+
+@cindex non-existent array elements
+@cindex arrays, elements that don't exist
+@quotation NOTE
+A reference to an element that does not exist @emph{automatically} creates
+that array element, with the null string as its value.  (In some cases,
+this is unfortunate, because it might waste memory inside @command{awk}.)
+
+Novice @command{awk} programmers often make the mistake of checking if
+an element exists by checking if the value is empty:
+
+@example
+# Check if "foo" exists in a:         @ii{Incorrect!}
+if (a["foo"] != "") @dots{}
+@end example
+
+@noindent
+This is incorrect for two reasons. First, it @emph{creates} @code{a["foo"]}
+if it didn't exist before! Second, it is valid (if a bit unusual) to set
+an array element equal to the empty string.
+@end quotation
+
+@c @cindex arrays, @code{in} operator and
+@cindex @code{in} operator, testing if array element exists
+To determine whether an element exists in an array at a certain index, use
+the following expression:
+
+@example
+@var{indx} in @var{array}
+@end example
+
+@cindex side effects, array indexing
+@noindent
+This expression tests whether the particular index @var{indx} exists,
+without the side effect of creating that element if it is not present.
+The expression has the value one (true) if @code{@var{array}[@var{indx}]}
+exists and zero (false) if it does not exist.
+(We use @var{indx} here, because @samp{index} is the name of a built-in
+function.)
+For example, this statement tests whether the array @code{frequencies}
+contains the index @samp{2}:
+
+@example
+@group
+if (2 in frequencies)
+    print "Subscript 2 is present."
+@end group
+@end example
+
+Note that this is @emph{not} a test of whether the array
+@code{frequencies} contains an element whose @emph{value} is two.
+There is no way to do that except to scan all the elements.  Also, this
+@emph{does not} create @code{frequencies[2]}, while the following
+(incorrect) alternative does:
+
+@example
+@group
+if (frequencies[2] != "")
+    print "Subscript 2 is present."
+@end group
+@end example
+
+@node Assigning Elements
+@subsection Assigning Array Elements
+@cindex arrays, elements, assigning values
+@cindex elements in arrays, assigning values
+
+Array elements can be assigned values just like
+@command{awk} variables:
+
+@example
+@var{array}[@var{index-expression}] = @var{value}
+@end example
+
+@noindent
+@var{array} is the name of an array.  The expression
+@var{index-expression} is the index of the element of the array that is
+assigned a value.  The expression @var{value} is the value to
+assign to that element of the array.
+
+@node Array Example
+@subsection Basic Array Example
+@cindex arrays, an example of using
+
+The following program takes a list of lines, each beginning with a line
+number, and prints them out in order of line number.  The line numbers
+are not in order when they are first read---instead, they
+are scrambled.  This program sorts the lines by making an array using
+the line numbers as subscripts.  The program then prints out the lines
+in sorted order of their numbers.  It is a very simple program and gets
+confused upon encountering repeated numbers, gaps, or lines that don't
+begin with a number:
+
+@example
+@c file eg/misc/arraymax.awk
+@{
+    if ($1 > max)
+        max = $1
+    arr[$1] = $0
+@}
+
+END @{
+    for (x = 1; x <= max; x++)
+        print arr[x]
+@}
+@c endfile
+@end example
+
+The first rule keeps track of the largest line number seen so far;
+it also stores each line into the array @code{arr}, at an index that
+is the line's number.
+The second rule runs after all the input has been read, to print out
+all the lines.
+When this program is run with the following input:
+
+@example
+@group
+@c file eg/misc/arraymax.data
+5  I am the Five man
+2  Who are you?  The new number two!
+4  . . . And four on the floor
+1  Who is number one?
+3  I three you.
+@c endfile
+@end group
+@end example
+
+@noindent
+Its output is:
+
+@example
+@group
+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
+@end group
+@end example
+
+If a line number is repeated, the last line with a given number overrides
+the others.
+Gaps in the line numbers can be handled with an easy improvement to the
+program's @code{END} rule, as follows:
+
+@example
+@group
+END @{
+    for (x = 1; x <= max; x++)
+        if (x in arr)
+            print arr[x]
+@}
+@end group
+@end example
+
+@node Scanning an Array
+@subsection Scanning All Elements of an Array
+@cindex elements in arrays, scanning
+@cindex scanning arrays
+@cindex arrays, scanning
+@cindex loops, @code{for}, array scanning
+
+In programs that use arrays, it is often necessary to use a loop that
+executes once for each element of an array.  In other languages, where
+arrays are contiguous and indices are limited to nonnegative integers,
+this is easy: all the valid indices can be found by counting from
+the lowest index up to the highest.  This technique won't do the job
+in @command{awk}, because any number or string can be an array index.
+So @command{awk} has a special kind of @code{for} statement for scanning
+an array:
+
+@example
+@group
+for (@var{var} in @var{array})
+    @var{body}
+@end group
+@end example
+
+@noindent
+@cindex @code{in} operator, use in loops
+This loop executes @var{body} once for each index in @var{array} that the
+program has previously used, with the variable @var{var} set to that index.
+
+@cindex arrays, @code{for} statement and
+@cindex @code{for} statement, looping over arrays
+The following program uses this form of the @code{for} statement.  The
+first rule scans the input records and notes which words appear (at
+least once) in the input, by storing a one into the array @code{used} with
+the word as the index.  The second rule scans the elements of @code{used} to
+find all the distinct words that appear in the input.  It prints each
+word that is more than 10 characters long and also prints the number of
+such words.
+@xref{String Functions}
+for more information on the built-in function @code{length()}.
+
+@example
+@group
+# Record a 1 for each word that is used at least once
+@{
+    for (i = 1; i <= NF; i++)
+        used[$i] = 1
+@}
+@end group
+
+@group
+# Find number of distinct words more than 10 characters long
+END @{
+    for (x in used) @{
+        if (length(x) > 10) @{
+            ++num_long_words
+            print x
+        @}
+    @}
+    print num_long_words, "words longer than 10 characters"
+@}
+@end group
+@end example
+
+@noindent
+@xref{Word Sorting}
+for a more detailed example of this type.
+
+@cindex arrays, elements, order of access by @code{in} operator
+@cindex elements in arrays, order of access by @code{in} operator
+@cindex @code{in} operator, order of array access
+The order in which elements of the array are accessed by this statement
+is determined by the internal arrangement of the array elements within
+@command{awk} and in standard @command{awk} cannot be controlled
+or changed.  This can lead to problems if new elements are added to
+@var{array} by statements in the loop body; it is not predictable whether
+the @code{for} loop will reach them.  Similarly, changing @var{var} inside
+the loop may produce strange results.  It is best to avoid such things.
+
+As a point of information, @command{gawk} sets up the list of elements
+to be iterated over before the loop starts, and does not change it.
+But not all @command{awk} versions do so. Consider this program, named
+@file{loopcheck.awk}:
+
+@example
+BEGIN @{
+    a["here"] = "here"
+    a["is"] = "is"
+    a["a"] = "a"
+    a["loop"] = "loop"
+    for (i in a) @{
+        j++
+        a[j] = j
+        print i
+    @}
+@}
+@end example
+
+Here is what happens when run with @command{gawk} (and @command{mawk}):
+
+@example
+$ @kbd{gawk -f loopcheck.awk}
+@print{} here
+@print{} loop
+@print{} a
+@print{} is
+@end example
+
+Contrast this to BWK @command{awk}:
+
+@example
+$ @kbd{nawk -f loopcheck.awk}
+@print{} loop
+@print{} here
+@print{} is
+@print{} a
+@print{} 1
+@end example
+
+@node Controlling Scanning
+@subsection Using Predefined Array Scanning Orders with @command{gawk}
+
+This @value{SUBSECTION} describes a feature that is specific to @command{gawk}.
+
+By default, when a @code{for} loop traverses an array, the order
+is undefined, meaning that the @command{awk} implementation
+determines the order in which the array is traversed.
+This order is usually based on the internal implementation of arrays
+and will vary from one version of @command{awk} to the next.
+
+@cindex array scanning order, controlling
+@cindex controlling array scanning order
+Often, though, you may wish to do something simple, such as
+``traverse the array by comparing the indices in ascending order,''
+or ``traverse the array by comparing the values in descending order.''
+@command{gawk} provides two mechanisms that give you this control:
+
+@itemize @value{BULLET}
+@item
+Set @code{PROCINFO["sorted_in"]} to one of a set of predefined values.
+We describe this now.
+
+@item
+Set @code{PROCINFO["sorted_in"]} to the name of a user-defined function
+to use for comparison of array elements. This advanced feature
+is described later in @ref{Array Sorting}.
+@end itemize
+
+@cindex @code{PROCINFO}, values of @code{sorted_in}
+The following special values for @code{PROCINFO["sorted_in"]} are available:
+
+@table @code
+@item "@@unsorted"
+Array elements are processed in arbitrary order, which is the default
+@command{awk} behavior.
+
+@item "@@ind_str_asc"
+Order by indices in ascending order compared as strings; this is the most basic sort.
+(Internally, array indices are always strings, so with @samp{a[2*5] = 1}
+the index is @code{"10"} rather than numeric 10.)
+
+@item "@@ind_num_asc"
+Order by indices in ascending order but force them to be treated as numbers in the process.
+Any index with a non-numeric value will end up positioned as if it were zero.
+
+@item "@@val_type_asc"
+Order by element values in ascending order (rather than by indices).
+Ordering is by the type assigned to the element
+(@pxref{Typing and Comparison}).
+All numeric values come before all string values,
+which in turn come before all subarrays.
+(Subarrays have not been described yet;
+@pxref{Arrays of Arrays}.)
+
+@item "@@val_str_asc"
+Order by element values in ascending order (rather than by indices).  Scalar values are
+compared as strings.  Subarrays, if present, come out last.
+
+@item "@@val_num_asc"
+Order by element values in ascending order (rather than by indices).  Scalar values are
+compared as numbers.  Subarrays, if present, come out last.
+When numeric values are equal, the string values are used to provide
+an ordering: this guarantees consistent results across different
+versions of the C @code{qsort()} function,@footnote{When two elements
+compare as equal, the C @code{qsort()} function does not guarantee
+that they will maintain their original relative order after sorting.
+Using the string value to provide a unique ordering when the numeric
+values are equal ensures that @command{gawk} behaves consistently
+across different environments.} which @command{gawk} uses internally
+to perform the sorting.
+
+@item "@@ind_str_desc"
+Like @code{"@@ind_str_asc"}, but the
+string indices are ordered from high to low.
+
+@item "@@ind_num_desc"
+Like @code{"@@ind_num_asc"}, but the
+numeric indices are ordered from high to low.
+
+@item "@@val_type_desc"
+Like @code{"@@val_type_asc"}, but the
+element values, based on type, are ordered from high to low.
+Subarrays, if present, come out first.
+
+@item "@@val_str_desc"
+Like @code{"@@val_str_asc"}, but the
+element values, treated as strings, are ordered from high to low.
+Subarrays, if present, come out first.
+
+@item "@@val_num_desc"
+Like @code{"@@val_num_asc"}, but the
+element values, treated as numbers, are ordered from high to low.
+Subarrays, if present, come out first.
+@end table
+
+The array traversal order is determined before the @code{for} loop
+starts to run. Changing @code{PROCINFO["sorted_in"]} in the loop body
+does not affect the loop.
+For example:
+
+@example
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+> @kbd{   a[4] = 4}
+> @kbd{   a[3] = 3}
+> @kbd{   for (i in a)}
+> @kbd{       print i, a[i]}
+> @kbd{@}'}
+@print{} 4 4
+@print{} 3 3
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+> @kbd{   PROCINFO["sorted_in"] = "@@ind_str_asc"}
+> @kbd{   a[4] = 4}
+> @kbd{   a[3] = 3}
+> @kbd{   for (i in a)}
+> @kbd{       print i, a[i]}
+> @kbd{@}'}
+@print{} 3 3
+@print{} 4 4
+@end example
+
+When sorting an array by element values, if a value happens to be
+a subarray then it is considered to be greater than any string or
+numeric value, regardless of what the subarray itself contains,
+and all subarrays are treated as being equal to each other.  Their
+order relative to each other is determined by their index strings.
+
+Here are some additional things to bear in mind about sorted
+array traversal:
+
+@itemize @value{BULLET}
+@item
+The value of @code{PROCINFO["sorted_in"]} is global. That is, it affects
+all array traversal @code{for} loops.  If you need to change it within your
+own code, you should see if it's defined and save and restore the value:
+
+@example
+@dots{}
+if ("sorted_in" in PROCINFO) @{
+    save_sorted = PROCINFO["sorted_in"]
+    PROCINFO["sorted_in"] = "@@val_str_desc" # or whatever
+@}
+@dots{}
+if (save_sorted)
+    PROCINFO["sorted_in"] = save_sorted
+@end example
+
+@item
+As already mentioned, the default array traversal order is represented by
+@code{"@@unsorted"}.  You can also get the default behavior by assigning
+the null string to @code{PROCINFO["sorted_in"]} or by just deleting the
+@code{"sorted_in"} element from the @code{PROCINFO} array with
+the @code{delete} statement.
+(The @code{delete} statement hasn't been described yet; @pxref{Delete}.)
+@end itemize
+
+In addition, @command{gawk} provides built-in functions for
+sorting arrays; see @ref{Array Sorting Functions}.
+
+@node Numeric Array Subscripts
+@section Using Numbers to Subscript Arrays
+
+@cindex numbers, as array subscripts
+@cindex array subscripts, numbers as
+@cindex arrays, numeric subscripts
+@cindex subscripts in arrays, numbers as
+@cindex @code{CONVFMT} variable, array subscripts and
+An important aspect to remember about arrays is that @emph{array subscripts
+are always strings}.  When a numeric value is used as a subscript,
+it is converted to a string value before being used for subscripting
+(@pxref{Conversion}).
+This means that the value of the predefined variable @code{CONVFMT} can
+affect how your program accesses elements of an array.  For example:
+
+@example
+xyz = 12.153
+data[xyz] = 1
+CONVFMT = "%2.2f"
+if (xyz in data)
+    printf "%s is in data\n", xyz
+else
+    printf "%s is not in data\n", xyz
+@end example
+
+@noindent
+This prints @samp{12.15 is not in data}.  The first statement gives
+@code{xyz} a numeric value.  Assigning to
+@code{data[xyz]} subscripts @code{data} with the string value @code{"12.153"}
+(using the default conversion value of @code{CONVFMT}, @code{"%.6g"}).
+Thus, the array element @code{data["12.153"]} is assigned the value one.
+The program then changes
+the value of @code{CONVFMT}.  The test @samp{(xyz in data)} generates a new
+string value from @code{xyz}---this time @code{"12.15"}---because the value of
+@code{CONVFMT} only allows two significant digits.  This test fails,
+because @code{"12.15"} is different from @code{"12.153"}.
+
+@cindex converting integer array subscripts
+@cindex integer array indices
+According to the rules for conversions
+(@pxref{Conversion}), integer
+values always convert to strings as integers, no matter what the
+value of @code{CONVFMT} may happen to be.  So the usual case of
+the following works:
+
+@example
+for (i = 1; i <= maxsub; i++)
+    @ii{do something with} array[i]
+@end example
+
+The ``integer values always convert to strings as integers'' rule
+has an additional consequence for array indexing.
+Octal and hexadecimal constants
+@ifnotdocbook
+(@pxref{Nondecimal-numbers})
+@end ifnotdocbook
+@ifdocbook
+(covered in @ref{Nondecimal-numbers})
+@end ifdocbook
+are converted internally into numbers, and their original form
+is forgotten.  This means, for example, that @code{array[17]},
+@code{array[021]}, and @code{array[0x11]} all refer to the same element!
+
+As with many things in @command{awk}, the majority of the time
+things work as you would expect them to.  But it is useful to have a precise
+knowledge of the actual rules, as they can sometimes have a subtle
+effect on your programs.
+
+@node Uninitialized Subscripts
+@section Using Uninitialized Variables as Subscripts
+
+@cindex variables, uninitialized@comma{} as array subscripts
+@cindex uninitialized variables, as array subscripts
+@cindex subscripts in arrays, uninitialized variables as
+@cindex arrays, subscripts, uninitialized variables as
+Suppose it's necessary to write a program
+to print the input data in reverse order.
+A reasonable attempt to do so (with some test
+data) might look like this:
+
+@example
+$ @kbd{echo 'line 1}
+> @kbd{line 2}
+> @kbd{line 3' | awk '@{ l[lines] = $0; ++lines @}}
+> @kbd{END @{}
+>     @kbd{for (i = lines - 1; i >= 0; i--)}
+>        @kbd{print l[i]}
+> @kbd{@}'}
+@print{} line 3
+@print{} line 2
+@end example
+
+Unfortunately, the very first line of input data did not appear in the
+output!
+
+Upon first glance, we would think that this program should have worked.
+The variable @code{lines}
+is uninitialized, and uninitialized variables have the numeric value zero.
+So, @command{awk} should have printed the value of @code{l[0]}.
+
+The issue here is that subscripts for @command{awk} arrays are @emph{always}
+strings. Uninitialized variables, when used as strings, have the
+value @code{""}, not zero.  Thus, @samp{line 1} ends up stored in
+@code{l[""]}.
+The following version of the program works correctly:
+
+@example
+@{ l[lines++] = $0 @}
+END @{
+    for (i = lines - 1; i >= 0; i--)
+       print l[i]
+@}
+@end example
+
+Here, the @samp{++} forces @code{lines} to be numeric, thus making
+the ``old value'' numeric zero. This is then converted to @code{"0"}
+as the array subscript.
+
+@cindex array subscripts, null strings as
+@cindex null strings, as array subscripts
+@cindex dark corner, array subscripts
+@cindex lint checking, array subscripts
+Even though it is somewhat unusual, the null string
+(@code{""}) is a valid array subscript.
+@value{DARKCORNER}
+@command{gawk} warns about the use of the null string as a subscript
+if @option{--lint} is provided
+on the command line (@pxref{Options}).
+
+@node Delete
+@section The @code{delete} Statement
+@cindex @code{delete} statement
+@cindex deleting elements in arrays
+@cindex arrays, elements, deleting
+@cindex elements in arrays, deleting
+
+To remove an individual element of an array, use the @code{delete}
+statement:
+
+@example
+delete @var{array}[@var{index-expression}]
+@end example
+
+Once an array element has been deleted, any value the element once
+had is no longer available. It is as if the element had never
+been referred to or been given a value.
+The following is an example of deleting elements in an array:
+
+@example
+for (i in frequencies)
+    delete frequencies[i]
+@end example
+
+@noindent
+This example removes all the elements from the array @code{frequencies}.
+Once an element is deleted, a subsequent @code{for} statement to scan the array
+does not report that element and using the @code{in} operator to check for
+the presence of that element returns zero (i.e., false):
+
+@example
+delete foo[4]
+if (4 in foo)
+    print "This will never be printed"
+@end example
+
+@cindex null strings, deleting array elements and
+It is important to note that deleting an element is @emph{not} the
+same as assigning it a null value (the empty string, @code{""}).
+For example:
+
+@example
+@group
+foo[4] = ""
+if (4 in foo)
+  print "This is printed, even though foo[4] is empty"
+@end group
+@end example
+
+@cindex lint checking, array elements
+It is not an error to delete an element that does not exist.
+However, if @option{--lint} is provided on the command line
+(@pxref{Options}),
+@command{gawk} issues a warning message when an element that
+is not in the array is deleted.
+
+@cindex common extensions, @code{delete} to delete entire arrays
+@cindex extensions, common@comma{} @code{delete} to delete entire arrays
+@cindex arrays, deleting entire contents
+@cindex deleting entire arrays
+@cindex @code{delete} @var{array}
+@cindex differences in @command{awk} and @command{gawk}, array elements, deleting
+All the elements of an array may be deleted with a single statement
+by leaving off the subscript in the @code{delete} statement,
+as follows:
+
+
+@example
+delete @var{array}
+@end example
+
+Using this version of the @code{delete} statement is about three times
+more efficient than the equivalent loop that deletes each element one
+at a time.
+
+This form of the @code{delete} statement is also supported
+by BWK @command{awk} and @command{mawk}, as well as
+by a number of other implementations.
+
+@cindex Brian Kernighan's @command{awk}
+@quotation NOTE
+For many years, using @code{delete} without a subscript was a common
+extension.  In September 2012, it was accepted for inclusion into the
+POSIX standard.  See @uref{http://austingroupbugs.net/view.php?id=544,
+the Austin Group website}.
+@end quotation
+
+@cindex portability, deleting array elements
+@cindex Brennan, Michael
+The following statement provides a portable but nonobvious way to clear
+out an array:@footnote{Thanks to Michael Brennan for pointing this out.}
+
+@example
+split("", array)
+@end example
+
+@cindex @code{split()} function, array elements@comma{} deleting
+The @code{split()} function
+(@pxref{String Functions})
+clears out the target array first. This call asks it to split
+apart the null string. Because there is no data to split out, the
+function simply clears the array and then returns.
+
+@quotation CAUTION
+Deleting all the elements from an array does not change its type; you cannot
+clear an array and then use the array's name as a scalar
+(i.e., a regular variable). For example, the following does not work:
+
+@example
+a[1] = 3
+delete a
+a = 3
+@end example
+@end quotation
+
+@node Multidimensional
+@section Multidimensional Arrays
+
+@menu
+* Multiscanning::               Scanning multidimensional arrays.
+@end menu
+
+@cindex subscripts in arrays, multidimensional
+@cindex arrays, multidimensional
+A @dfn{multidimensional array} is an array in which an element is identified
+by a sequence of indices instead of a single index.  For example, a
+two-dimensional array requires two indices.  The usual way (in many
+languages, including @command{awk}) to refer to an element of a
+two-dimensional array named @code{grid} is with
+@code{grid[@var{x},@var{y}]}.
+
+@cindex @code{SUBSEP} variable, multidimensional arrays and
+Multidimensional arrays are supported in @command{awk} through
+concatenation of indices into one string.
+@command{awk} converts the indices into strings
+(@pxref{Conversion}) and
+concatenates them together, with a separator between them.  This creates
+a single string that describes the values of the separate indices.  The
+combined string is used as a single index into an ordinary,
+one-dimensional array.  The separator used is the value of the built-in
+variable @code{SUBSEP}.
+
+For example, suppose we evaluate the expression @samp{foo[5,12] = "value"}
+when the value of @code{SUBSEP} is @code{"@@"}.  The numbers 5 and 12 are
+converted to strings and
+concatenated with an @samp{@@} between them, yielding @code{"5@@12"}; thus,
+the array element @code{foo["5@@12"]} is set to @code{"value"}.
+
+Once the element's value is stored, @command{awk} has no record of whether
+it was stored with a single index or a sequence of indices.  The two
+expressions @samp{foo[5,12]} and @w{@samp{foo[5 SUBSEP 12]}} are always
+equivalent.
+
+The default value of @code{SUBSEP} is the string @code{"\034"},
+which contains a nonprinting character that is unlikely to appear in an
+@command{awk} program or in most input data.
+The usefulness of choosing an unlikely character comes from the fact
+that index values that contain a string matching @code{SUBSEP} can lead to
+combined strings that are ambiguous.  Suppose that @code{SUBSEP} is
+@code{"@@"}; then @w{@samp{foo["a@@b", "c"]}} and @w{@samp{foo["a",
+"b@@c"]}} are indistinguishable because both are actually
+stored as @samp{foo["a@@b@@c"]}.
+
+@cindex @code{in} operator, index existence in multidimensional arrays
+To test whether a particular index sequence exists in a
+multidimensional array, use the same operator (@code{in}) that is
+used for single-dimensional arrays.  Write the whole sequence of indices
+in parentheses, separated by commas, as the left operand:
+
+@example
+if ((@var{subscript1}, @var{subscript2}, @dots{}) in @var{array})
+    @dots{}
+@end example
+
+Here is an example that treats its input as a two-dimensional array of
+fields; it rotates this array 90 degrees clockwise and prints the
+result.  It assumes that all lines have the same number of
+elements:
+
+@example
+@{
+     if (max_nf < NF)
+          max_nf = NF
+     max_nr = NR
+     for (x = 1; x <= NF; x++)
+          vector[x, NR] = $x
+@}
+
+END @{
+     for (x = 1; x <= max_nf; x++) @{
+          for (y = max_nr; y >= 1; --y)
+               printf("%s ", vector[x, y])
+          printf("\n")
+     @}
+@}
+@end example
+
+@noindent
+When given the input:
+
+@example
+@group
+1 2 3 4 5 6
+2 3 4 5 6 1
+3 4 5 6 1 2
+4 5 6 1 2 3
+@end group
+@end example
+
+@noindent
+the program produces the following output:
+
+@example
+@group
+4 3 2 1
+5 4 3 2
+6 5 4 3
+1 6 5 4
+2 1 6 5
+3 2 1 6
+@end group
+@end example
+
+@node Multiscanning
+@subsection Scanning Multidimensional Arrays
+
+There is no special @code{for} statement for scanning a
+``multidimensional'' array. There cannot be one, because, in truth,
+@command{awk} does not have
+multidimensional arrays or elements---there is only a
+multidimensional @emph{way of accessing} an array.
+
+@cindex subscripts in arrays, multidimensional, scanning
+@cindex arrays, multidimensional, scanning
+@cindex scanning multidimensional arrays
+However, if your program has an array that is always accessed as
+multidimensional, you can get the effect of scanning it by combining
+the scanning @code{for} statement
+(@pxref{Scanning an Array}) with the
+built-in @code{split()} function
+(@pxref{String Functions}).
+It works in the following manner:
+
+@example
+for (combined in array) @{
+    split(combined, separate, SUBSEP)
+    @dots{}
+@}
+@end example
+
+@noindent
+This sets the variable @code{combined} to
+each concatenated combined index in the array, and splits it
+into the individual indices by breaking it apart where the value of
+@code{SUBSEP} appears.  The individual indices then become the elements of
+the array @code{separate}.
+
+Thus, if a value is previously stored in @code{array[1, "foo"]}, then
+an element with index @code{"1\034foo"} exists in @code{array}.  (Recall
+that the default value of @code{SUBSEP} is the character with code 034.)
+Sooner or later, the @code{for} statement finds that index and does an
+iteration with the variable @code{combined} set to @code{"1\034foo"}.
+Then the @code{split()} function is called as follows:
+
+@example
+split("1\034foo", separate, "\034")
+@end example
+
+@noindent
+The result is to set @code{separate[1]} to @code{"1"} and
+@code{separate[2]} to @code{"foo"}.  Presto! The original sequence of
+separate indices is recovered.
+
+
+@node Arrays of Arrays
+@section Arrays of Arrays
+@cindex arrays of arrays
+
+@command{gawk} goes beyond standard @command{awk}'s multidimensional
+array access and provides true arrays of
+arrays. Elements of a subarray are referred to by their own indices
+enclosed in square brackets, just like the elements of the main array.
+For example, the following creates a two-element subarray at index @code{1}
+of the main array @code{a}:
+
+@example
+a[1][1] = 1
+a[1][2] = 2
+@end example
+
+This simulates a true two-dimensional array. Each subarray element can
+contain another subarray as a value, which in turn can hold other arrays
+as well. In this way, you can create arrays of three or more dimensions.
+The indices can be any @command{awk} expressions, including scalars
+separated by commas (i.e., a regular @command{awk} simulated
+multidimensional subscript). So the following is valid in
+@command{gawk}:
+
+@example
+a[1][3][1, "name"] = "barney"
+@end example
+
+Each subarray and the main array can be of different length. In fact, the
+elements of an array or its subarray do not all have to have the same
+type. This means that the main array and any of its subarrays can be
+nonrectangular, or jagged in structure. You can assign a scalar value to
+the index @code{4} of the main array @code{a}, even though @code{a[1]}
+is itself an array and not a scalar:
+
+@example
+a[4] = "An element in a jagged array"
+@end example
+
+The terms @dfn{dimension}, @dfn{row}, and @dfn{column} are
+meaningless when applied
+to such an array, but we will use ``dimension'' henceforth to imply the
+maximum number of indices needed to refer to an existing element. The
+type of any element that has already been assigned cannot be changed
+by assigning a value of a different type. You have to first delete the
+current element, which effectively makes @command{gawk} forget about
+the element at that index:
+
+@example
+delete a[4]
+a[4][5][6][7] = "An element in a four-dimensional array"
+@end example
+
+@noindent
+This removes the scalar value from index @code{4} and then inserts a
+three-level nested subarray
+containing a scalar. You can also
+delete an entire subarray or subarray of subarrays:
+
+@example
+delete a[4][5]
+a[4][5] = "An element in subarray a[4]"
+@end example
+
+But recall that you can not delete the main array @code{a} and then use it
+as a scalar.
+
+The built-in functions that take array arguments can also be used
+with subarrays. For example, the following code fragment uses @code{length()}
+(@pxref{String Functions})
+to determine the number of elements in the main array @code{a} and
+its subarrays:
+
+@example
+print length(a), length(a[1]), length(a[1][3])
+@end example
+
+@noindent
+This results in the following output for our main array @code{a}:
+
+@example
+2, 3, 1
+@end example
+
+@noindent
+The @samp{@var{subscript} in @var{array}} expression
+(@pxref{Reference to Elements}) works similarly for both
+regular @command{awk}-style
+arrays and arrays of arrays. For example, the tests @samp{1 in a},
+@samp{3 in a[1]}, and @samp{(1, "name") in a[1][3]} all evaluate to
+one (true) for our array @code{a}.
+
+The @samp{for (item in array)} statement (@pxref{Scanning an Array})
+can be nested to scan all the
+elements of an array of arrays if it is rectangular in structure. In order
+to print the contents (scalar values) of a two-dimensional array of arrays
+(i.e., in which each first-level element is itself an
+array, not necessarily of the same length),
+you could use the following code:
+
+@example
+for (i in array)
+    for (j in array[i])
+        print array[i][j]
+@end example
+
+The @code{isarray()} function (@pxref{Type Functions})
+lets you test if an array element is itself an array:
+
+@example
+for (i in array) @{
+    if (isarray(array[i])) @{
+        for (j in array[i]) @{
+            print array[i][j]
+        @}
+    @}
+    else
+        print array[i]
+@}
+@end example
+
+If the structure of a jagged array of arrays is known in advance,
+you can often devise workarounds using control statements. For example,
+the following code prints the elements of our main array @code{a}:
+
+@example
+@group
+for (i in a) @{
+    for (j in a[i]) @{
+        if (j == 3) @{
+            for (k in a[i][j])
+                print a[i][j][k]
+@end group
+@group
+        @} else
+            print a[i][j]
+    @}
+@}
+@end group
+@end example
+
+@noindent
+@xref{Walking Arrays} for a user-defined function that ``walks'' an
+arbitrarily dimensioned array of arrays.
+
+Recall that a reference to an uninitialized array element yields a value
+of @code{""}, the null string. This has one important implication when you
+intend to use a subarray as an argument to a function, as illustrated by
+the following example:
+
+@example
+$ @kbd{gawk 'BEGIN @{ split("a b c d", b[1]); print b[1][1] @}'}
+@error{} gawk: cmd. line:1: fatal: split: second argument is not an array
+@end example
+
+The way to work around this is to first force @code{b[1]} to be an array by
+creating an arbitrary index:
+
+@example
+$ @kbd{gawk 'BEGIN @{ b[1][1] = ""; split("a b c d", b[1]); print b[1][1] @}'}
+@print{} a
+@end example
+
+@node Arrays Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Standard @command{awk} provides one-dimensional associative arrays
+(arrays indexed by string values).  All arrays are associative; numeric
+indices are converted automatically to strings.
+
+@item
+Array elements are referenced as @code{@var{array}[@var{indx}]}.
+Referencing an element creates it if it did not exist previously.
+
+@item
+The proper way to see if an array has an element with a given index
+is to use the @code{in} operator: @samp{@var{indx} in @var{array}}.
+
+@item
+Use @samp{for (@var{indx} in @var{array}) @dots{}} to scan through all the
+individual elements of an array. In the body of the loop, @var{indx} takes
+on the value of each element's index in turn.
+
+@item
+The order in which a @samp{for (@var{indx} in @var{array})} loop
+traverses an array is undefined in POSIX @command{awk} and varies among
+implementations.  @command{gawk} lets you control the order by assigning
+special predefined values to @code{PROCINFO["sorted_in"]}.
+
+@item
+Use @samp{delete @var{array}[@var{indx}]} to delete an individual element.
+To delete all of the elements in an array,
+use @samp{delete @var{array}}.
+This latter feature has been a common extension for many
+years and is now standard, but may not be supported by all commercial
+versions of @command{awk}.
+
+@item
+Standard @command{awk} simulates multidimensional arrays by separating
+subscript values with commas.  The values are concatenated into a
+single string, separated by the value of @code{SUBSEP}.  The fact
+that such a subscript was created in this way is not retained; thus,
+changing @code{SUBSEP} may have unexpected consequences.  You can use
+@samp{(@var{sub1}, @var{sub2}, @dots{}) in @var{array}} to see if such
+a multidimensional subscript exists in @var{array}.
+
+@item
+@command{gawk} provides true arrays of arrays. You use a separate
+set of square brackets for each dimension in such an array:
+@code{data[row][col]}, for example. Array elements may thus be either
+scalar values (number or string) or other arrays.
+
+@item
+Use the @code{isarray()} built-in function to determine if an array
+element is itself a subarray.
+
+@end itemize
+
+
+@node Functions
+@chapter Functions
+
+@cindex functions, built-in
+@cindex built-in functions
+This @value{CHAPTER} describes @command{awk}'s built-in functions,
+which fall into three categories: numeric, string, and I/O.
+@command{gawk} provides additional groups of functions
+to work with values that represent time, do
+bit manipulation, sort arrays,
+provide type information, and internationalize and localize programs.
+
+Besides the built-in functions, @command{awk} has provisions for
+writing new functions that the rest of a program can use.
+The second half of this @value{CHAPTER} describes these
+@dfn{user-defined} functions.
+Finally, we explore indirect function calls, a @command{gawk}-specific
+extension that lets you determine at runtime what function is to
+be called.
+
+@menu
+* Built-in::                    Summarizes the built-in functions.
+* User-defined::                Describes User-defined functions in detail.
+* Indirect Calls::              Choosing the function to call at runtime.
+* Functions Summary::           Summary of functions.
+@end menu
+
+@node Built-in
+@section Built-in Functions
+
+@dfn{Built-in} functions are always available for your @command{awk}
+program to call.  This @value{SECTION} defines all the built-in functions
+in @command{awk}; some of these are mentioned in other @value{SECTION}s
+but are summarized here for your convenience.
+
+@menu
+* Calling Built-in::            How to call built-in functions.
+* Numeric Functions::           Functions that work with numbers, including
+                                @code{int()}, @code{sin()} and @code{rand()}.
+* String Functions::            Functions for string manipulation, such as
+                                @code{split()}, @code{match()} and
+                                @code{sprintf()}.
+* I/O Functions::               Functions for files and shell commands.
+* Time Functions::              Functions for dealing with timestamps.
+* Bitwise Functions::           Functions for bitwise operations.
+* Type Functions::              Functions for type information.
+* I18N Functions::              Functions for string translation.
+@end menu
+
+@node Calling Built-in
+@subsection Calling Built-in Functions
+
+To call one of @command{awk}'s built-in functions, write the name of
+the function followed
+by arguments in parentheses.  For example, @samp{atan2(y + z, 1)}
+is a call to the function @code{atan2()} and has two arguments.
+
+@cindex programming conventions, functions, calling
+@cindex whitespace, functions@comma{} calling
+Whitespace is ignored between the built-in function name and the
+opening parenthesis, but nonetheless it is good practice to avoid using whitespace
+there.  User-defined functions do not permit whitespace in this way, and
+it is easier to avoid mistakes by following a simple
+convention that always works---no whitespace after a function name.
+
+@cindex troubleshooting, @command{gawk}, fatal errors@comma{} function arguments
+@cindex @command{gawk}, function arguments and
+@cindex differences in @command{awk} and @command{gawk}, function arguments (@command{gawk})
+Each built-in function accepts a certain number of arguments.
+In some cases, arguments can be omitted. The defaults for omitted
+arguments vary from function to function and are described under the
+individual functions.  In some @command{awk} implementations, extra
+arguments given to built-in functions are ignored.  However, in @command{gawk},
+it is a fatal error to give extra arguments to a built-in function.
+
+When a function is called, expressions that create the function's actual
+parameters are evaluated completely before the call is performed.
+For example, in the following code fragment:
+
+@example
+i = 4
+j = sqrt(i++)
+@end example
+
+@cindex evaluation order, functions
+@cindex functions, built-in, evaluation order
+@cindex built-in functions, evaluation order
+@noindent
+the variable @code{i} is incremented to the value five before @code{sqrt()}
+is called with a value of four for its actual parameter.
+The order of evaluation of the expressions used for the function's
+parameters is undefined.  Thus, avoid writing programs that
+assume that parameters are evaluated from left to right or from
+right to left.  For example:
+
+@example
+i = 5
+j = atan2(++i, i *= 2)
+@end example
+
+If the order of evaluation is left to right, then @code{i} first becomes
+six, and then 12, and @code{atan2()} is called with the two arguments six
+and 12.  But if the order of evaluation is right to left, @code{i}
+first becomes 10, then 11, and @code{atan2()} is called with the
+two arguments 11 and 10.
+
+@node Numeric Functions
+@subsection Numeric Functions
+@cindex numeric functions
+
+The following list describes all of
+the built-in functions that work with numbers.
+Optional parameters are enclosed in square brackets@w{ ([ ]):}
+
+@c @asis for docbook
+@table @asis
+@item @code{atan2(@var{y}, @var{x})}
+@cindexawkfunc{atan2}
+@cindex arctangent
+Return the arctangent of @code{@var{y} / @var{x}} in radians.
+You can use @samp{pi = atan2(0, -1)} to retrieve the value of
+@value{PI}.
+
+@item @code{cos(@var{x})}
+@cindexawkfunc{cos}
+@cindex cosine
+Return the cosine of @var{x}, with @var{x} in radians.
+
+@item @code{exp(@var{x})}
+@cindexawkfunc{exp}
+@cindex exponent
+Return the exponential of @var{x} (@code{e ^ @var{x}}) or report
+an error if @var{x} is out of range.  The range of values @var{x} can have
+depends on your machine's floating-point representation.
+
+@item @code{int(@var{x})}
+@cindexawkfunc{int}
+@cindex round to nearest integer
+Return the nearest integer to @var{x}, located between @var{x} and zero and
+truncated toward zero.
+For example, @code{int(3)} is 3, @code{int(3.9)} is 3, @code{int(-3.9)}
+is @minus{}3, and @code{int(-3)} is @minus{}3 as well.
+
+@ifset INTDIV
+@item @code{intdiv0(@var{numerator}, @var{denominator}, @var{result})}
+@cindexawkfunc{intdiv0}
+@cindex intdiv0
+Perform integer division, similar to the standard C @code{div()} function.
+First, truncate @code{numerator} and @code{denominator}
+towards zero, creating integer values.  Clear the @code{result}
+array, and then set @code{result["quotient"]} to the result of
+@samp{numerator / denominator}, truncated towards zero to an integer,
+and set @code{result["remainder"]} to the result of @samp{numerator %
+denominator}, truncated towards zero to an integer.
+Attempting division by zero causes a fatal error.
+The function returns zero upon success, and @minus{}1 upon error.
+
+This function is
+primarily intended for use with arbitrary length integers; it avoids
+creating MPFR arbitrary precision floating-point values (@pxref{Arbitrary
+Precision Integers}).
+
+This function is a @code{gawk} extension.  It is not available in
+compatibility mode (@pxref{Options}).
+@end ifset
+
+@item @code{log(@var{x})}
+@cindexawkfunc{log}
+@cindex logarithm
+Return the natural logarithm of @var{x}, if @var{x} is positive;
+otherwise, return @code{NaN} (``not a number'') on IEEE 754 systems.
+Additionally, @command{gawk} prints a warning message when @code{x}
+is negative.
+
+@cindex Beebe, Nelson H.F.@:
+@item @code{rand()}
+@cindexawkfunc{rand}
+@cindex random numbers, @code{rand()}/@code{srand()} functions
+Return a random number.  The values of @code{rand()} are
+uniformly distributed between zero and one.
+The value could be zero but is never one.@footnote{The C version of
+@code{rand()} on many Unix systems is known to produce fairly poor
+sequences of random numbers.  However, nothing requires that an
+@command{awk} implementation use the C @code{rand()} to implement the
+@command{awk} version of @code{rand()}.  In fact, for many years,
+@command{gawk} used the BSD @code{random()} function, which is
+considerably better than @code{rand()}, to produce random numbers.
+From @value{PVERSION} 4.1.4, courtesy of Nelson H.F.@: Beebe, @command{gawk}
+uses the Bayes-Durham shuffle buffer algorithm which considerably extends
+the period of the random number generator, and eliminates short-range and
+long-range correlations that might exist in the original generator.}
+
+Often random integers are needed instead.  Following is a user-defined function
+that can be used to obtain a random nonnegative integer less than @var{n}:
+
+@example
+function randint(n)
+@{
+    return int(n * rand())
+@}
+@end example
+
+@noindent
+The multiplication produces a random number greater than or equal to
+zero and less than @code{n}.  Using @code{int()}, this result is made into
+an integer between zero and @code{n} @minus{} 1, inclusive.
+
+The following example uses a similar function to produce random integers
+between one and @var{n}.  This program prints a new random number for
+each input record:
+
+@example
+# Function to roll a simulated die.
+function roll(n) @{ return 1 + int(rand() * n) @}
+
+# Roll 3 six-sided dice and
+# print total number of points.
+@{
+    printf("%d points\n", roll(6) + roll(6) + roll(6))
+@}
+@end example
+
+@cindex seeding random number generator
+@cindex random numbers, seed of
+@quotation CAUTION
+In most @command{awk} implementations, including @command{gawk},
+@code{rand()} starts generating numbers from the same
+starting number, or @dfn{seed}, each time you run @command{awk}.@footnote{@command{mawk}
+uses a different seed each time.}  Thus,
+a program generates the same results each time you run it.
+The numbers are random within one @command{awk} run but predictable
+from run to run.  This is convenient for debugging, but if you want
+a program to do different things each time it is used, you must change
+the seed to a value that is different in each run.  To do this,
+use @code{srand()}.
+@end quotation
+
+@item @code{sin(@var{x})}
+@cindexawkfunc{sin}
+@cindex sine
+Return the sine of @var{x}, with @var{x} in radians.
+
+@item @code{sqrt(@var{x})}
+@cindexawkfunc{sqrt}
+@cindex square root
+Return the positive square root of @var{x}.
+@command{gawk} prints a warning message
+if @var{x} is negative.  Thus, @code{sqrt(4)} is 2.
+
+@item @code{srand(}[@var{x}]@code{)}
+@cindexawkfunc{srand}
+Set the starting point, or seed,
+for generating random numbers to the value @var{x}.
+
+Each seed value leads to a particular sequence of random
+numbers.@footnote{Computer-generated random numbers really are not truly
+random.  They are technically known as @dfn{pseudorandom}.  This means
+that although the numbers in a sequence appear to be random, you can in
+fact generate the same sequence of random numbers over and over again.}
+Thus, if the seed is set to the same value a second time,
+the same sequence of random numbers is produced again.
+
+@quotation CAUTION
+Different @command{awk} implementations use different random-number
+generators internally.  Don't expect the same @command{awk} program
+to produce the same series of random numbers when executed by
+different versions of @command{awk}.
+@end quotation
+
+If the argument @var{x} is omitted, as in @samp{srand()}, then the current
+date and time of day are used for a seed.  This is the way to get random
+numbers that are truly unpredictable.
+
+The return value of @code{srand()} is the previous seed.  This makes it
+easy to keep track of the seeds in case you need to consistently reproduce
+sequences of random numbers.
+
+POSIX does not specify the initial seed; it differs among @command{awk}
+implementations.
+@end table
+
+@node String Functions
+@subsection String-Manipulation Functions
+@cindex string-manipulation functions
+
+The functions in this @value{SECTION} look at or change the text of one
+or more strings.
+
+@command{gawk} understands locales (@pxref{Locales}) and does all
+string processing in terms of @emph{characters}, not @emph{bytes}.
+This distinction is particularly important to understand for locales
+where one character may be represented by multiple bytes.  Thus, for
+example, @code{length()} returns the number of characters in a string,
+and not the number of bytes used to represent those characters. Similarly,
+@code{index()} works with character indices, and not byte indices.
+
+@quotation CAUTION
+A number of functions deal with indices into strings.  For these
+functions, the first character of a string is at position (index) one.
+This is different from C and the languages descended from it, where the
+first character is at position zero.  You need to remember this when
+doing index calculations, particularly if you are used to C.
+@end quotation
+
+In the following list, optional parameters are enclosed in square brackets@w{ ([ ]).}
+Several functions perform string substitution; the full discussion is
+provided in the description of the @code{sub()} function, which comes
+toward the end, because the list is presented alphabetically.
+
+Those functions that are specific to @command{gawk} are marked with a
+pound sign (@samp{#}).  They are not available in compatibility mode
+(@pxref{Options}):
+
+
+@menu
+* Gory Details::                More than you want to know about @samp{\} and
+                                @samp{&} with @code{sub()}, @code{gsub()}, and
+                                @code{gensub()}.
+@end menu
+
+@c @asis for docbook
+@table @asis
+@item @code{asort(}@var{source} [@code{,} @var{dest} [@code{,} @var{how} ] ]@code{) #}
+@itemx @code{asorti(}@var{source} [@code{,} @var{dest} [@code{,} @var{how} ] ]@code{) #}
+@cindexgawkfunc{asorti}
+@cindex sort array
+@cindex arrays, elements, retrieving number of
+@cindexgawkfunc{asort}
+@cindex sort array indices
+These two functions are similar in behavior, so they are described
+together.
+
+@quotation NOTE
+The following description ignores the third argument, @var{how}, as it
+requires understanding features that we have not discussed yet.  Thus,
+the discussion here is a deliberate simplification.  (We do provide all
+the details later on; see @ref{Array Sorting Functions} for the full story.)
+@end quotation
+
+Both functions return the number of elements in the array @var{source}.
+For @command{asort()}, @command{gawk} sorts the values of @var{source}
+and replaces the indices of the sorted values of @var{source} with
+sequential integers starting with one.  If the optional array @var{dest}
+is specified, then @var{source} is duplicated into @var{dest}.  @var{dest}
+is then sorted, leaving the indices of @var{source} unchanged.
+
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+When comparing strings, @code{IGNORECASE} affects the sorting
+(@pxref{Array Sorting Functions}).  If the
+@var{source} array contains subarrays as values (@pxref{Arrays of
+Arrays}), they will come last, after all scalar values.
+Subarrays are @emph{not} recursively sorted.
+
+For example, if the contents of @code{a} are as follows:
+
+@example
+a["last"] = "de"
+a["first"] = "sac"
+a["middle"] = "cul"
+@end example
+
+@noindent
+A call to @code{asort()}:
+
+@example
+asort(a)
+@end example
+
+@noindent
+results in the following contents of @code{a}:
+
+@example
+@group
+a[1] = "cul"
+a[2] = "de"
+a[3] = "sac"
+@end group
+@end example
+
+The @code{asorti()} function works similarly to @code{asort()}; however,
+the @emph{indices} are sorted, instead of the values. Thus, in the
+previous example, starting with the same initial set of indices and
+values in @code{a}, calling @samp{asorti(a)} would yield:
+
+@example
+a[1] = "first"
+a[2] = "last"
+a[3] = "middle"
+@end example
+
+@item @code{gensub(@var{regexp}, @var{replacement}, @var{how}} [@code{, @var{target}}]@code{) #}
+@cindexgawkfunc{gensub}
+@cindex search and replace in strings
+@cindex substitute in string
+Search the target string @var{target} for matches of the regular
+expression @var{regexp}.  If @var{how} is a string beginning with
+@samp{g} or @samp{G} (short for ``global''), then replace all matches
+of @var{regexp} with @var{replacement}.  Otherwise, treat @var{how}
+as a number indicating which match of @var{regexp} to replace.  Treat
+numeric values less than one as if they were one.  If no @var{target}
+is supplied, use @code{$0}.  Return the modified string as the result
+of the function. The original target string is @emph{not} changed.
+
+@code{gensub()} is a general substitution function.  Its purpose is
+to provide more features than the standard @code{sub()} and @code{gsub()}
+functions.
+
+@code{gensub()} provides an additional feature that is not available
+in @code{sub()} or @code{gsub()}: the ability to specify components of a
+regexp in the replacement text.  This is done by using parentheses in
+the regexp to mark the components and then specifying @samp{\@var{N}}
+in the replacement text, where @var{N} is a digit from 1 to 9.
+For example:
+
+@example
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+>      @kbd{a = "abc def"}
+>      @kbd{b = gensub(/(.+) (.+)/, "\\2 \\1", "g", a)}
+>      @kbd{print b}
+> @kbd{@}'}
+@print{} def abc
+@end example
+
+@noindent
+As with @code{sub()}, you must type two backslashes in order
+to get one into the string.
+In the replacement text, the sequence @samp{\0} represents the entire
+matched text, as does the character @samp{&}.
+
+The following example shows how you can use the third argument to control
+which match of the regexp should be changed:
+
+@example
+$ @kbd{echo a b c a b c |}
+> @kbd{gawk '@{ print gensub(/a/, "AA", 2) @}'}
+@print{} a b c AA b c
+@end example
+
+In this case, @code{$0} is the default target string.
+@code{gensub()} returns the new string as its result, which is
+passed directly to @code{print} for printing.
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+If the @var{how} argument is a string that does not begin with @samp{g} or
+@samp{G}, or if it is a number that is less than or equal to zero, only one
+substitution is performed.  If @var{how} is zero, @command{gawk} issues
+a warning message.
+
+If @var{regexp} does not match @var{target}, @code{gensub()}'s return value
+is the original unchanged value of @var{target}.
+
+@item @code{gsub(@var{regexp}, @var{replacement}} [@code{, @var{target}}]@code{)}
+@cindexawkfunc{gsub}
+Search @var{target} for
+@emph{all} of the longest, leftmost, @emph{nonoverlapping} matching
+substrings it can find and replace them with @var{replacement}.
+The @samp{g} in @code{gsub()} stands for
+``global,'' which means replace everywhere.  For example:
+
+@example
+@{ gsub(/Britain/, "United Kingdom"); print @}
+@end example
+
+@noindent
+replaces all occurrences of the string @samp{Britain} with @samp{United
+Kingdom} for all input records.
+
+The @code{gsub()} function returns the number of substitutions made.  If
+the variable to search and alter (@var{target}) is
+omitted, then the entire input record (@code{$0}) is used.
+As in @code{sub()}, the characters @samp{&} and @samp{\} are special,
+and the third argument must be assignable.
+
+@item @code{index(@var{in}, @var{find})}
+@cindexawkfunc{index}
+@cindex search in string
+@cindex find substring in string
+Search the string @var{in} for the first occurrence of the string
+@var{find}, and return the position in characters where that occurrence
+begins in the string @var{in}.  Consider the following example:
+
+@example
+$ @kbd{awk 'BEGIN @{ print index("peanut", "an") @}'}
+@print{} 3
+@end example
+
+@noindent
+If @var{find} is not found, @code{index()} returns zero.
+
+@cindex dark corner, regexp as second argument to @code{index()}
+With BWK @command{awk} and @command{gawk},
+it is a fatal error to use a regexp constant for @var{find}.
+Other implementations allow it, simply treating the regexp
+constant as an expression meaning @samp{$0 ~ /regexp/}. @value{DARKCORNER}
+
+@item @code{length(}[@var{string}]@code{)}
+@cindexawkfunc{length}
+@cindex string length
+@cindex length of string
+Return the number of characters in @var{string}.  If
+@var{string} is a number, the length of the digit string representing
+that number is returned.  For example, @code{length("abcde")} is five.  By
+contrast, @code{length(15 * 35)} works out to three. In this example,
+@iftex
+@math{15 @cdot 35 = 525},
+@end iftex
+@ifnottex
+@ifnotdocbook
+15 * 35 = 525,
+@end ifnotdocbook
+@end ifnottex
+@docbook
+15 &sdot; 35 = 525,
+@end docbook
+and 525 is then converted to the string @code{"525"}, which has
+three characters.
+
+@cindex length of input record
+@cindex input record, length of
+If no argument is supplied, @code{length()} returns the length of @code{$0}.
+
+@c @cindex historical features
+@cindex portability, @code{length()} function
+@cindex POSIX @command{awk}, functions and, @code{length()}
+@quotation NOTE
+In older versions of @command{awk}, the @code{length()} function could
+be called
+without any parentheses.  Doing so is considered poor practice,
+although the 2008 POSIX standard explicitly allows it, to
+support historical practice.  For programs to be maximally portable,
+always supply the parentheses.
+@end quotation
+
+@cindex dark corner, @code{length()} function
+If @code{length()} is called with a variable that has not been used,
+@command{gawk} forces the variable to be a scalar.  Other
+implementations of @command{awk} leave the variable without a type.
+@value{DARKCORNER}
+Consider:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
+@print{} 0
+@error{} gawk: fatal: attempt to use scalar `x' as array
+
+$ @kbd{nawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
+@print{} 0
+@end example
+
+@noindent
+If @option{--lint} has
+been specified on the command line, @command{gawk} issues a
+warning about this.
+
+@cindex common extensions, @code{length()} applied to an array
+@cindex extensions, common@comma{} @code{length()} applied to an array
+@cindex differences in @command{awk} and @command{gawk}, @code{length()} function
+@cindex number of array elements
+@cindex array, number of elements
+With @command{gawk} and several other @command{awk} implementations, when given an
+array argument, the @code{length()} function returns the number of elements
+in the array. @value{COMMONEXT}
+This is less useful than it might seem at first, as the
+array is not guaranteed to be indexed from one to the number of elements
+in it.
+If @option{--lint} is provided on the command line
+(@pxref{Options}),
+@command{gawk} warns that passing an array argument is not portable.
+If @option{--posix} is supplied, using an array argument is a fatal error
+(@pxref{Arrays}).
+
+@item @code{match(@var{string}, @var{regexp}} [@code{, @var{array}}]@code{)}
+@cindexawkfunc{match}
+@cindex string, regular expression match
+@cindex match regexp in string
+Search @var{string} for the
+longest, leftmost substring matched by the regular expression
+@var{regexp} and return the character position (index)
+at which that substring begins (one, if it starts at the beginning of
+@var{string}).  If no match is found, return zero.
+
+The @var{regexp} argument may be either a regexp constant
+(@code{/}@dots{}@code{/}) or a string constant (@code{"}@dots{}@code{"}).
+In the latter case, the string is treated as a regexp to be matched.
+@xref{Computed Regexps} for a
+discussion of the difference between the two forms, and the
+implications for writing your program correctly.
+
+The order of the first two arguments is the opposite of most other string
+functions that work with regular expressions, such as
+@code{sub()} and @code{gsub()}.  It might help to remember that
+for @code{match()}, the order is the same as for the @samp{~} operator:
+@samp{@var{string} ~ @var{regexp}}.
+
+@cindex @code{RSTART} variable, @code{match()} function and
+@cindex @code{RLENGTH} variable, @code{match()} function and
+@cindex @code{match()} function, @code{RSTART}/@code{RLENGTH} variables
+The @code{match()} function sets the predefined variable @code{RSTART} to
+the index.  It also sets the predefined variable @code{RLENGTH} to the
+length in characters of the matched substring.  If no match is found,
+@code{RSTART} is set to zero, and @code{RLENGTH} to @minus{}1.
+
+For example:
+
+@example
+@c file eg/misc/findpat.awk
+@{
+    if ($1 == "FIND")
+        regex = $2
+    else @{
+        where = match($0, regex)
+        if (where != 0)
+            print "Match of", regex, "found at", where, "in", $0
+       @}
+@}
+@c endfile
+@end example
+
+@noindent
+This program looks for lines that match the regular expression stored in
+the variable @code{regex}.  This regular expression can be changed.  If the
+first word on a line is @samp{FIND}, @code{regex} is changed to be the
+second word on that line.  Therefore, if given:
+
+@example
+@c file eg/misc/findpat.data
+FIND ru+n
+My program runs
+but not very quickly
+FIND Melvin
+JF+KM
+This line is property of Reality Engineering Co.
+Melvin was here.
+@c endfile
+@end example
+
+@noindent
+@command{awk} prints:
+
+@example
+Match of ru+n found at 12 in My program runs
+Match of Melvin found at 1 in Melvin was here.
+@end example
+
+@cindex differences in @command{awk} and @command{gawk}, @code{match()} function
+If @var{array} is present, it is cleared, and then the zeroth element
+of @var{array} is set to the entire portion of @var{string}
+matched by @var{regexp}.  If @var{regexp} contains parentheses,
+the integer-indexed elements of @var{array} are set to contain the
+portion of @var{string} matching the corresponding parenthesized
+subexpression.
+For example:
+
+@example
+$ @kbd{echo foooobazbarrrrr |}
+> @kbd{gawk '@{ match($0, /(fo+).+(bar*)/, arr)}
+>         @kbd{print arr[1], arr[2] @}'}
+@print{} foooo barrrrr
+@end example
+
+In addition,
+multidimensional subscripts are available providing
+the start index and length of each matched subexpression:
+
+@example
+$ @kbd{echo foooobazbarrrrr |}
+> @kbd{gawk '@{ match($0, /(fo+).+(bar*)/, arr)}
+>           @kbd{print arr[1], arr[2]}
+>           @kbd{print arr[1, "start"], arr[1, "length"]}
+>           @kbd{print arr[2, "start"], arr[2, "length"]}
+> @kbd{@}'}
+@print{} foooo barrrrr
+@print{} 1 5
+@print{} 9 7
+@end example
+
+There may not be subscripts for the start and index for every parenthesized
+subexpression, because they may not all have matched text; thus, they
+should be tested for with the @code{in} operator
+(@pxref{Reference to Elements}).
+
+@cindex troubleshooting, @code{match()} function
+The @var{array} argument to @code{match()} is a
+@command{gawk} extension.  In compatibility mode
+(@pxref{Options}),
+using a third argument is a fatal error.
+
+@item @code{patsplit(@var{string}, @var{array}} [@code{, @var{fieldpat}} [@code{, @var{seps}} ] ]@code{) #}
+@cindexgawkfunc{patsplit}
+@cindex split string into array
+Divide
+@var{string} into pieces (or ``fields'') defined by @var{fieldpat}
+and store the pieces in @var{array} and the separator strings in the
+@var{seps} array.  The first piece is stored in
+@code{@var{array}[1]}, the second piece in @code{@var{array}[2]}, and so
+forth.  The third argument, @var{fieldpat}, is
+a regexp describing the fields in @var{string} (just as @code{FPAT} is
+a regexp describing the fields in input records).
+It may be either a regexp constant or a string.
+If @var{fieldpat} is omitted, the value of @code{FPAT} is used.
+@code{patsplit()} returns the number of elements created.
+@code{@var{seps}[@var{i}]} is
+the possibly null separator string
+after @code{@var{array}[@var{i}]}.
+The possibly null leading separator will be in @code{@var{seps}[0]}.
+So a non-null @var{string} with @var{n} fields will have @var{n+1} separators.
+A null @var{string} will not have neither fields nor separators.
+
+The @code{patsplit()} function splits strings into pieces in a
+manner similar to the way input lines are split into fields using @code{FPAT}
+(@pxref{Splitting By Content}).
+
+Before splitting the string, @code{patsplit()} deletes any previously existing
+elements in the arrays @var{array} and @var{seps}.
+
+@item @code{split(@var{string}, @var{array}} [@code{, @var{fieldsep}} [@code{, @var{seps}} ] ]@code{)}
+@cindexawkfunc{split}
+Divide @var{string} into pieces separated by @var{fieldsep}
+and store the pieces in @var{array} and the separator strings in the
+@var{seps} array.  The first piece is stored in
+@code{@var{array}[1]}, the second piece in @code{@var{array}[2]}, and so
+forth.  The string value of the third argument, @var{fieldsep}, is
+a regexp describing where to split @var{string} (much as @code{FS} can
+be a regexp describing where to split input records).
+If @var{fieldsep} is omitted, the value of @code{FS} is used.
+@code{split()} returns the number of elements created.
+@var{seps} is a @command{gawk} extension, with @code{@var{seps}[@var{i}]}
+being the separator string
+between @code{@var{array}[@var{i}]} and @code{@var{array}[@var{i}+1]}.
+If @var{fieldsep} is a single
+space, then any leading whitespace goes into @code{@var{seps}[0]} and
+any trailing
+whitespace goes into @code{@var{seps}[@var{n}]}, where @var{n} is the
+return value of
+@code{split()} (i.e., the number of elements in @var{array}).
+
+The @code{split()} function splits strings into pieces in the same way
+that input lines are split into fields.  For example:
+
+@example
+split("cul-de-sac", a, "-", seps)
+@end example
+
+@noindent
+@cindex strings splitting, example
+splits the string @code{"cul-de-sac"} into three fields using @samp{-} as the
+separator.  It sets the contents of the array @code{a} as follows:
+
+@example
+a[1] = "cul"
+a[2] = "de"
+a[3] = "sac"
+@end example
+
+and sets the contents of the array @code{seps} as follows:
+
+@example
+seps[1] = "-"
+seps[2] = "-"
+@end example
+
+@noindent
+The value returned by this call to @code{split()} is three.
+
+@cindex differences in @command{awk} and @command{gawk}, @code{split()} function
+As with input field-splitting, when the value of @var{fieldsep} is
+@w{@code{" "}}, leading and trailing whitespace is ignored in values assigned to
+the elements of
+@var{array} but not in @var{seps}, and the elements
+are separated by runs of whitespace.
+Also, as with input field splitting, if @var{fieldsep} is the null string, each
+individual character in the string is split into its own array element.
+@value{COMMONEXT}
+Additionally, if @var{fieldsep} is a single-character string, that string acts
+as the separator, even if its value is a regular expression metacharacter.
+
+Note, however, that @code{RS} has no effect on the way @code{split()}
+works. Even though @samp{RS = ""} causes the newline character to also be an input
+field separator, this does not affect how @code{split()} splits strings.
+
+@cindex dark corner, @code{split()} function
+Modern implementations of @command{awk}, including @command{gawk}, allow
+the third argument to be a regexp constant (@w{@code{/}@dots{}@code{/}})
+as well as a string.  @value{DARKCORNER}
+The POSIX standard allows this as well.
+@xref{Computed Regexps} for a
+discussion of the difference between using a string constant or a regexp constant,
+and the implications for writing your program correctly.
+
+Before splitting the string, @code{split()} deletes any previously existing
+elements in the arrays @var{array} and @var{seps}.
+
+If @var{string} is null, the array has no elements. (So this is a portable
+way to delete an entire array with one statement.
+@xref{Delete}.)
+
+If @var{string} does not match @var{fieldsep} at all (but is not null),
+@var{array} has one element only. The value of that element is the original
+@var{string}.
+
+In POSIX mode (@pxref{Options}), the fourth argument is not allowed.
+
+@item @code{sprintf(@var{format}, @var{expression1}, @dots{})}
+@cindexawkfunc{sprintf}
+@cindex formatting strings
+Return (without printing) the string that @code{printf} would
+have printed out with the same arguments
+(@pxref{Printf}).
+For example:
+
+@example
+pival = sprintf("pi = %.2f (approx.)", 22/7)
+@end example
+
+@noindent
+assigns the string @w{@samp{pi = 3.14 (approx.)}} to the variable @code{pival}.
+
+@cindexgawkfunc{strtonum}
+@cindex convert string to number
+@item @code{strtonum(@var{str}) #}
+Examine @var{str} and return its numeric value.  If @var{str}
+begins with a leading @samp{0}, @code{strtonum()} assumes that @var{str}
+is an octal number.  If @var{str} begins with a leading @samp{0x} or
+@samp{0X}, @code{strtonum()} assumes that @var{str} is a hexadecimal number.
+For example:
+
+@example
+$ @kbd{echo 0x11 |}
+> @kbd{gawk '@{ printf "%d\n", strtonum($1) @}'}
+@print{} 17
+@end example
+
+Using the @code{strtonum()} function is @emph{not} the same as adding zero
+to a string value; the automatic coercion of strings to numbers
+works only for decimal data, not for octal or hexadecimal.@footnote{Unless
+you use the @option{--non-decimal-data} option, which isn't recommended.
+@xref{Nondecimal Data} for more information.}
+
+Note also that @code{strtonum()} uses the current locale's decimal point
+for recognizing numbers (@pxref{Locales}).
+
+@item @code{sub(@var{regexp}, @var{replacement}} [@code{, @var{target}}]@code{)}
+@cindexawkfunc{sub}
+@cindex replace in string
+Search @var{target}, which is treated as a string, for the
+leftmost, longest substring matched by the regular expression @var{regexp}.
+Modify the entire string
+by replacing the matched text with @var{replacement}.
+The modified string becomes the new value of @var{target}.
+Return the number of substitutions made (zero or one).
+
+The @var{regexp} argument may be either a regexp constant
+(@code{/}@dots{}@code{/}) or a string constant (@code{"}@dots{}@code{"}).
+In the latter case, the string is treated as a regexp to be matched.
+@xref{Computed Regexps} for a
+discussion of the difference between the two forms, and the
+implications for writing your program correctly.
+
+This function is peculiar because @var{target} is not simply
+used to compute a value, and not just any expression will do---it
+must be a variable, field, or array element so that @code{sub()} can
+store a modified value there.  If this argument is omitted, then the
+default is to use and alter @code{$0}.@footnote{Note that this means
+that the record will first be regenerated using the value of @code{OFS} if
+any fields have been changed, and that the fields will be updated
+after the substitution, even if the operation is a ``no-op'' such
+as @samp{sub(/^/, "")}.}
+For example:
+
+@example
+str = "water, water, everywhere"
+sub(/at/, "ith", str)
+@end example
+
+@noindent
+sets @code{str} to @w{@samp{wither, water, everywhere}}, by replacing the
+leftmost longest occurrence of @samp{at} with @samp{ith}.
+
+If the special character @samp{&} appears in @var{replacement}, it
+stands for the precise substring that was matched by @var{regexp}.  (If
+the regexp can match more than one string, then this precise substring
+may vary.)  For example:
+
+@example
+@{ sub(/candidate/, "& and his wife"); print @}
+@end example
+
+@noindent
+changes the first occurrence of @samp{candidate} to @samp{candidate
+and his wife} on each input line.
+Here is another example:
+
+@example
+$ @kbd{awk 'BEGIN @{}
+>         @kbd{str = "daabaaa"}
+>         @kbd{sub(/a+/, "C&C", str)}
+>         @kbd{print str}
+> @kbd{@}'}
+@print{} dCaaCbaaa
+@end example
+
+@noindent
+This shows how @samp{&} can represent a nonconstant string and also
+illustrates the ``leftmost, longest'' rule in regexp matching
+(@pxref{Leftmost Longest}).
+
+The effect of this special character (@samp{&}) can be turned off by putting a
+backslash before it in the string.  As usual, to insert one backslash in
+the string, you must write two backslashes.  Therefore, write @samp{\\&}
+in a string constant to include a literal @samp{&} in the replacement.
+For example, the following shows how to replace the first @samp{|} on each line with
+an @samp{&}:
+
+@example
+@{ sub(/\|/, "\\&"); print @}
+@end example
+
+@cindex @code{sub()} function, arguments of
+@cindex @code{gsub()} function, arguments of
+As mentioned, the third argument to @code{sub()} must
+be a variable, field, or array element.
+Some versions of @command{awk} allow the third argument to
+be an expression that is not an lvalue.  In such a case, @code{sub()}
+still searches for the pattern and returns zero or one, but the result of
+the substitution (if any) is thrown away because there is no place
+to put it.  Such versions of @command{awk} accept expressions
+like the following:
+
+@example
+sub(/USA/, "United States", "the USA and Canada")
+@end example
+
+@noindent
+@cindex troubleshooting, @code{gsub()}/@code{sub()} functions
+For historical compatibility, @command{gawk} accepts such erroneous code.
+However, using any other nonchangeable
+object as the third parameter causes a fatal error and your program
+will not run.
+
+Finally, if the @var{regexp} is not a regexp constant, it is converted into a
+string, and then the value of that string is treated as the regexp to match.
+
+@item @code{substr(@var{string}, @var{start}} [@code{, @var{length}} ]@code{)}
+@cindexawkfunc{substr}
+@cindex substring
+Return a @var{length}-character-long substring of @var{string},
+starting at character number @var{start}.  The first character of a
+string is character number one.@footnote{This is different from
+C and C++, in which the first character is number zero.}
+For example, @code{substr("washington", 5, 3)} returns @code{"ing"}.
+
+If @var{length} is not present, @code{substr()} returns the whole suffix of
+@var{string} that begins at character number @var{start}.  For example,
+@code{substr("washington", 5)} returns @code{"ington"}.  The whole
+suffix is also returned
+if @var{length} is greater than the number of characters remaining
+in the string, counting from character @var{start}.
+
+@cindex Brian Kernighan's @command{awk}
+If @var{start} is less than one, @code{substr()} treats it as
+if it was one. (POSIX doesn't specify what to do in this case:
+BWK @command{awk} acts this way, and therefore @command{gawk}
+does too.)
+If @var{start} is greater than the number of characters
+in the string, @code{substr()} returns the null string.
+Similarly, if @var{length} is present but less than or equal to zero,
+the null string is returned.
+
+@cindex troubleshooting, @code{substr()} function
+The string returned by @code{substr()} @emph{cannot} be
+assigned.  Thus, it is a mistake to attempt to change a portion of
+a string, as shown in the following example:
+
+@example
+string = "abcdef"
+# try to get "abCDEf", won't work
+substr(string, 3, 3) = "CDE"
+@end example
+
+@noindent
+It is also a mistake to use @code{substr()} as the third argument
+of @code{sub()} or @code{gsub()}:
+
+@example
+gsub(/xyz/, "pdq", substr($0, 5, 20))  # WRONG
+@end example
+
+@cindex portability, @code{substr()} function
+(Some commercial versions of @command{awk} treat
+@code{substr()} as assignable, but doing so is not portable.)
+
+If you need to replace bits and pieces of a string, combine @code{substr()}
+with string concatenation, in the following manner:
+
+@example
+string = "abcdef"
+@dots{}
+string = substr(string, 1, 2) "CDE" substr(string, 6)
+@end example
+
+@cindex case sensitivity, converting case
+@cindex strings, converting letter case
+@item @code{tolower(@var{string})}
+@cindexawkfunc{tolower}
+@cindex convert string to lower case
+Return a copy of @var{string}, with each uppercase character
+in the string replaced with its corresponding lowercase character.
+Nonalphabetic characters are left unchanged.  For example,
+@code{tolower("MiXeD cAsE 123")} returns @code{"mixed case 123"}.
+
+@item @code{toupper(@var{string})}
+@cindexawkfunc{toupper}
+@cindex convert string to upper case
+Return a copy of @var{string}, with each lowercase character
+in the string replaced with its corresponding uppercase character.
+Nonalphabetic characters are left unchanged.  For example,
+@code{toupper("MiXeD cAsE 123")} returns @code{"MIXED CASE 123"}.
+@end table
+
+@sidebar Matching the Null String
+@cindex matching, null strings
+@cindex null strings, matching
+@cindex @code{*} (asterisk), @code{*} operator, null strings@comma{} matching
+@cindex asterisk (@code{*}), @code{*} operator, null strings@comma{} matching
+
+In @command{awk}, the @samp{*} operator can match the null string.
+This is particularly important for the @code{sub()}, @code{gsub()},
+and @code{gensub()} functions.  For example:
+
+@example
+$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'}
+@print{} XaXbXcX
+@end example
+
+@noindent
+Although this makes a certain amount of sense, it can be surprising.
+@end sidebar
+
+
+@node Gory Details
+@subsubsection More about @samp{\} and @samp{&} with @code{sub()}, @code{gsub()}, and @code{gensub()}
+
+@cindex escape processing, @code{gsub()}/@code{gensub()}/@code{sub()} functions
+@cindex @code{sub()} function, escape processing
+@cindex @code{gsub()} function, escape processing
+@cindex @code{gensub()} function (@command{gawk}), escape processing
+@cindex @code{\} (backslash), @code{gsub()}/@code{gensub()}/@code{sub()} functions and
+@cindex backslash (@code{\}), @code{gsub()}/@code{gensub()}/@code{sub()} functions and
+@cindex @code{&} (ampersand), @code{gsub()}/@code{gensub()}/@code{sub()} functions and
+@cindex ampersand (@code{&}), @code{gsub()}/@code{gensub()}/@code{sub()} functions and
+
+@quotation CAUTION
+This subsubsection has been reported to cause headaches.
+You might want to skip it upon first reading.
+@end quotation
+
+When using @code{sub()}, @code{gsub()}, or @code{gensub()}, and trying to get literal
+backslashes and ampersands into the replacement text, you need to remember
+that there are several levels of @dfn{escape processing} going on.
+
+First, there is the @dfn{lexical} level, which is when @command{awk} reads
+your program
+and builds an internal copy of it to execute.
+Then there is the runtime level, which is when @command{awk} actually scans the
+replacement string to determine what to generate.
+
+@cindex Brian Kernighan's @command{awk}
+At both levels, @command{awk} looks for a defined set of characters that
+can come after a backslash.  At the lexical level, it looks for the
+escape sequences listed in @ref{Escape Sequences}.
+Thus, for every @samp{\} that @command{awk} processes at the runtime
+level, you must type two backslashes at the lexical level.
+When a character that is not valid for an escape sequence follows the
+@samp{\}, BWK @command{awk} and @command{gawk} both simply remove the initial
+@samp{\} and put the next character into the string. Thus, for
+example, @code{"a\qb"} is treated as @code{"aqb"}.
+
+At the runtime level, the various functions handle sequences of
+@samp{\} and @samp{&} differently.  The situation is (sadly) somewhat complex.
+Historically, the @code{sub()} and @code{gsub()} functions treated the
+two-character sequence @samp{\&} specially; this sequence was replaced in
+the generated text with a single @samp{&}.  Any other @samp{\} within
+the @var{replacement} string that did not precede an @samp{&} was passed
+through unchanged.  This is illustrated in @ref{table-sub-escapes}.
+
+@c Thank to Karl Berry for help with the TeX stuff.
+@float Table,table-sub-escapes
+@caption{Historical escape sequence processing for @code{sub()} and @code{gsub()}}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+      You type!@code{sub()} sees!@code{sub()} generates_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+     @code{\&}!       @code{&}!The matched text_cr
+    @code{\\&}!      @code{\&}!A literal @samp{&}_cr
+   @code{\\\&}!      @code{\&}!A literal @samp{&}_cr
+  @code{\\\\&}!     @code{\\&}!A literal @samp{\&}_cr
+ @code{\\\\\&}!     @code{\\&}!A literal @samp{\&}_cr
+@code{\\\\\\&}!    @code{\\\&}!A literal @samp{\\&}_cr
+    @code{\\q}!      @code{\q}!A literal @samp{\q}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates
+@item @code{\&}      @tab @code{&}    @tab The matched text
+@item @code{\\&}     @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\\&}    @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\\\&}   @tab @code{\\&}  @tab A literal @samp{\&}
+@item @code{\\\\\&}  @tab @code{\\&}  @tab A literal @samp{\&}
+@item @code{\\\\\\&} @tab @code{\\\&} @tab A literal @samp{\\&}
+@item @code{\\q}     @tab @code{\q}   @tab A literal @samp{\q}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+ You type         @code{sub()} sees          @code{sub()} generates
+ --------         ----------          ---------------
+     @code{\&}              @code{&}            The matched text
+    @code{\\&}             @code{\&}            A literal @samp{&}
+   @code{\\\&}             @code{\&}            A literal @samp{&}
+  @code{\\\\&}            @code{\\&}            A literal @samp{\&}
+ @code{\\\\\&}            @code{\\&}            A literal @samp{\&}
+@code{\\\\\\&}           @code{\\\&}            A literal @samp{\\&}
+    @code{\\q}             @code{\q}            A literal @samp{\q}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+@noindent
+This table shows the lexical-level processing, where
+an odd number of backslashes becomes an even number at the runtime level,
+as well as the runtime processing done by @code{sub()}.
+(For the sake of simplicity, the rest of the following tables only show the
+case of even numbers of backslashes entered at the lexical level.)
+
+The problem with the historical approach is that there is no way to get
+a literal @samp{\} followed by the matched text.
+
+Several editions of the POSIX standard attempted to fix this problem
+but weren't successful. The details are irrelevant at this point in time.
+
+At one point, the @command{gawk} maintainer submitted
+proposed text for a revised standard that
+reverts to rules that correspond more closely to the original existing
+practice. The proposed rules have special cases that make it possible
+to produce a @samp{\} preceding the matched text.
+This is shown in
+@ref{table-sub-proposed}.
+
+@float Table,table-sub-proposed
+@caption{@command{gawk} rules for @code{sub()} and backslash}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+    You type!@code{sub()} sees!@code{sub()} generates_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+@code{\\\\\\&}!     @code{\\\&}!A literal @samp{\&}_cr
+@code{\\\\&}!     @code{\\&}!A literal @samp{\}, followed by the matched text_cr
+  @code{\\&}!      @code{\&}!A literal @samp{&}_cr
+  @code{\\q}!      @code{\q}!A literal @samp{\q}_cr
+ @code{\\\\}!      @code{\\}!@code{\\}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates
+@item @code{\\\\\\&} @tab @code{\\\&} @tab A literal @samp{\&}
+@item @code{\\\\&}   @tab @code{\\&}  @tab A literal @samp{\}, followed by the matched text
+@item @code{\\&}     @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\q}     @tab @code{\q}   @tab A literal @samp{\q}
+@item @code{\\\\}    @tab @code{\\}   @tab @code{\\}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+ You type         @code{sub()} sees         @code{sub()} generates
+ --------         ----------         ---------------
+@code{\\\\\\&}           @code{\\\&}            A literal @samp{\&}
+  @code{\\\\&}            @code{\\&}            A literal @samp{\}, followed by the matched text
+    @code{\\&}             @code{\&}            A literal @samp{&}
+    @code{\\q}             @code{\q}            A literal @samp{\q}
+   @code{\\\\}             @code{\\}            @code{\\}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+In a nutshell, at the runtime level, there are now three special sequences
+of characters (@samp{\\\&}, @samp{\\&}, and @samp{\&}) whereas historically
+there was only one.  However, as in the historical case, any @samp{\} that
+is not part of one of these three sequences is not special and appears
+in the output literally.
+
+@command{gawk} 3.0 and 3.1 follow these rules for @code{sub()} and
+@code{gsub()}.  The POSIX standard took much longer to be revised than
+was expected.  In addition, the @command{gawk} maintainer's proposal was
+lost during the standardization process.  The final rules are
+somewhat simpler.  The results are similar except for one case.
+
+@cindex POSIX @command{awk}, functions and, @code{gsub()}/@code{sub()}
+The POSIX rules state that @samp{\&} in the replacement string produces
+a literal @samp{&}, @samp{\\} produces a literal @samp{\}, and @samp{\} followed
+by anything else is not special; the @samp{\} is placed straight into the output.
+These rules are presented in @ref{table-posix-sub}.
+
+@float Table,table-posix-sub
+@caption{POSIX rules for @code{sub()} and @code{gsub()}}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+    You type!@code{sub()} sees!@code{sub()} generates_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+@code{\\\\\\&}!     @code{\\\&}!A literal @samp{\&}_cr
+@code{\\\\&}!     @code{\\&}!A literal @samp{\}, followed by the matched text_cr
+  @code{\\&}!      @code{\&}!A literal @samp{&}_cr
+  @code{\\q}!      @code{\q}!A literal @samp{\q}_cr
+ @code{\\\\}!      @code{\\}!@code{\}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem You type @tab @code{sub()} sees @tab @code{sub()} generates
+@item @code{\\\\\\&} @tab @code{\\\&} @tab A literal @samp{\&}
+@item @code{\\\\&}   @tab @code{\\&}  @tab A literal @samp{\}, followed by the matched text
+@item @code{\\&}     @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\q}     @tab @code{\q}   @tab A literal @samp{\q}
+@item @code{\\\\}    @tab @code{\\}   @tab @code{\}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+ You type         @code{sub()} sees         @code{sub()} generates
+ --------         ----------         ---------------
+@code{\\\\\\&}           @code{\\\&}            A literal @samp{\&}
+  @code{\\\\&}            @code{\\&}            A literal @samp{\}, followed by the matched text
+    @code{\\&}             @code{\&}            A literal @samp{&}
+    @code{\\q}             @code{\q}            A literal @samp{\q}
+   @code{\\\\}             @code{\\}            @code{\}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+The only case where the difference is noticeable is the last one: @samp{\\\\}
+is seen as @samp{\\} and produces @samp{\} instead of @samp{\\}.
+
+Starting with @value{PVERSION} 3.1.4, @command{gawk} followed the POSIX rules
+when @option{--posix} was specified (@pxref{Options}). Otherwise,
+it continued to follow the proposed rules, as
+that had been its behavior for many years.
+
+When @value{PVERSION} 4.0.0 was released, the @command{gawk} maintainer
+made the POSIX rules the default, breaking well over a decade's worth
+of backward compatibility.@footnote{This was rather naive of him, despite
+there being a note in this @value{SECTION} indicating that the next major version
+would move to the POSIX rules.} Needless to say, this was a bad idea,
+and as of @value{PVERSION} 4.0.1, @command{gawk} resumed its historical
+behavior, and only follows the POSIX rules when @option{--posix} is given.
+
+The rules for @code{gensub()} are considerably simpler. At the runtime
+level, whenever @command{gawk} sees a @samp{\}, if the following character
+is a digit, then the text that matched the corresponding parenthesized
+subexpression is placed in the generated output.  Otherwise,
+no matter what character follows the @samp{\}, it
+appears in the generated text and the @samp{\} does not,
+as shown in @ref{table-gensub-escapes}.
+
+@float Table,table-gensub-escapes
+@caption{Escape sequence processing for @code{gensub()}}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+    You type!@code{gensub()} sees!@code{gensub()} generates_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+      @code{&}!           @code{&}!The matched text_cr
+    @code{\\&}!          @code{\&}!A literal @samp{&}_cr
+   @code{\\\\}!          @code{\\}!A literal @samp{\}_cr
+  @code{\\\\&}!         @code{\\&}!A literal @samp{\}, then the matched text_cr
+@code{\\\\\\&}!        @code{\\\&}!A literal @samp{\&}_cr
+    @code{\\q}!          @code{\q}!A literal @samp{q}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem You type @tab @code{gensub()} sees @tab @code{gensub()} generates
+@item @code{&}       @tab @code{&}    @tab The matched text
+@item @code{\\&}     @tab @code{\&}   @tab A literal @samp{&}
+@item @code{\\\\}    @tab @code{\\}   @tab A literal @samp{\}
+@item @code{\\\\&}   @tab @code{\\&}  @tab A literal @samp{\}, then the matched text
+@item @code{\\\\\\&} @tab @code{\\\&} @tab A literal @samp{\&}
+@item @code{\\q}     @tab  @code{\q}  @tab A literal @samp{q}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+  You type          @code{gensub()} sees         @code{gensub()} generates
+  --------          -------------         ------------------
+      @code{&}                    @code{&}            The matched text
+    @code{\\&}                   @code{\&}            A literal @samp{&}
+   @code{\\\\}                   @code{\\}            A literal @samp{\}
+  @code{\\\\&}                  @code{\\&}            A literal @samp{\}, then the matched text
+@code{\\\\\\&}                 @code{\\\&}            A literal @samp{\&}
+    @code{\\q}                   @code{\q}            A literal @samp{q}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+Because of the complexity of the lexical- and runtime-level processing
+and the special cases for @code{sub()} and @code{gsub()},
+we recommend the use of @command{gawk} and @code{gensub()} when you have
+to do substitutions.
+
+@node I/O Functions
+@subsection Input/Output Functions
+@cindex input/output functions
+
+The following functions relate to input/output (I/O).
+Optional parameters are enclosed in square brackets ([ ]):
+
+@table @asis
+@item @code{close(}@var{filename} [@code{,} @var{how}]@code{)}
+@cindexawkfunc{close}
+@cindex files, closing
+@cindex close file or coprocess
+Close the file @var{filename} for input or output. Alternatively, the
+argument may be a shell command that was used for creating a coprocess, or
+for redirecting to or from a pipe; then the coprocess or pipe is closed.
+@xref{Close Files And Pipes}
+for more information.
+
+When closing a coprocess, it is occasionally useful to first close
+one end of the two-way pipe and then to close the other.  This is done
+by providing a second argument to @code{close()}.  This second argument
+(@var{how})
+should be one of the two string values @code{"to"} or @code{"from"},
+indicating which end of the pipe to close.  Case in the string does
+not matter.
+@xref{Two-way I/O},
+which discusses this feature in more detail and gives an example.
+
+Note that the second argument to @code{close()} is a @command{gawk}
+extension; it is not available in compatibility mode (@pxref{Options}).
+
+@item @code{fflush(}[@var{filename}]@code{)}
+@cindexawkfunc{fflush}
+@cindex flush buffered output
+Flush any buffered output associated with @var{filename}, which is either a
+file opened for writing or a shell command for redirecting output to
+a pipe or coprocess.
+
+@cindex buffers, flushing
+@cindex output, buffering
+Many utility programs @dfn{buffer} their output (i.e., they save information
+to write to a disk file or the screen in memory until there is enough
+for it to be worthwhile to send the data to the output device).
+This is often more efficient than writing
+every little bit of information as soon as it is ready.  However, sometimes
+it is necessary to force a program to @dfn{flush} its buffers (i.e.,
+write the information to its destination, even if a buffer is not full).
+This is the purpose of the @code{fflush()} function---@command{gawk} also
+buffers its output, and the @code{fflush()} function forces
+@command{gawk} to flush its buffers.
+
+@cindex extensions, common@comma{} @code{fflush()} function
+@cindex Brian Kernighan's @command{awk}
+Brian Kernighan added @code{fflush()} to his @command{awk} in April
+1992.  For two decades, it was a common extension.  In December
+2012, it was accepted for inclusion into the POSIX standard.
+See @uref{http://austingroupbugs.net/view.php?id=634, the Austin Group website}.
+
+POSIX standardizes @code{fflush()} as follows: if there
+is no argument, or if the argument is the null string (@w{@code{""}}),
+then @command{awk} flushes the buffers for @emph{all} open output files
+and pipes.
+
+@quotation NOTE
+Prior to @value{PVERSION} 4.0.2, @command{gawk}
+would flush only the standard output if there was no argument,
+and flush all output files and pipes if the argument was the null
+string. This was changed in order to be compatible with Brian
+Kernighan's @command{awk}, in the hope that standardizing this
+feature in POSIX would then be easier (which indeed proved to be the case).
+
+With @command{gawk},
+you can use @samp{fflush("/dev/stdout")} if you wish to flush
+only the standard output.
+@end quotation
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex troubleshooting, @code{fflush()} function
+@code{fflush()} returns zero if the buffer is successfully flushed;
+otherwise, it returns a nonzero value. (@command{gawk} returns @minus{}1.)
+In the case where all buffers are flushed, the return value is zero
+only if all buffers were flushed successfully.  Otherwise, it is
+@minus{}1, and @command{gawk} warns about the problem @var{filename}.
+
+@command{gawk} also issues a warning message if you attempt to flush
+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.
+
+@c end the table to let the sidebar take up the full width of the page.
+@end table
+
+@sidebar Interactive Versus Noninteractive Buffering
+@cindex buffering, interactive vs.@: noninteractive
+
+As a side point, buffering issues can be even more confusing if
+your program is @dfn{interactive} (i.e., communicating
+with a user sitting at a keyboard).@footnote{A program is interactive
+if the standard output is connected to a terminal device. On modern
+systems, this means your keyboard and screen.}
+
+@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for
+@c motivating me to write this section.
+Interactive programs generally @dfn{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:
+
+@example
+$ @kbd{awk '@{ print $1 + $2 @}'}
+@kbd{1 1}
+@print{} 2
+@kbd{2 3}
+@print{} 5
+@kbd{Ctrl-d}
+@end example
+
+@noindent
+Each line of output is printed immediately. Compare that behavior
+with this example:
+
+@example
+$ @kbd{awk '@{ print $1 + $2 @}' | cat}
+@kbd{1 1}
+@kbd{2 3}
+@kbd{Ctrl-d}
+@print{} 2
+@print{} 5
+@end example
+
+@noindent
+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
+
+@table @asis
+@item @code{system(@var{command})}
+@cindexawkfunc{system}
+@cindex invoke shell command
+@cindex interacting with other programs
+Execute the operating system
+command @var{command} and then return to the @command{awk} program.
+Return @var{command}'s exit status (see further on).
+
+For example, if the following fragment of code is put in your @command{awk}
+program:
+
+@example
+END @{
+     system("date | mail -s 'awk run done' root")
+@}
+@end example
+
+@noindent
+the system administrator is sent mail when the @command{awk} program
+finishes processing input and begins its end-of-input processing.
+
+Note that redirecting @code{print} or @code{printf} into a pipe is often
+enough to accomplish your task.  If you need to run many commands, it
+is more efficient to simply print them down a pipeline to the shell:
+
+@example
+while (@var{more stuff to do})
+    print @var{command} | "/bin/sh"
+close("/bin/sh")
+@end example
+
+@noindent
+@cindex troubleshooting, @code{system()} function
+@cindex @option{--sandbox} option, disabling @code{system()} function
+However, if your @command{awk}
+program is interactive, @code{system()} is useful for running large
+self-contained programs, such as a shell or an editor.
+Some operating systems cannot implement the @code{system()} function.
+@code{system()} causes a fatal error if it is not supported.
+
+@quotation NOTE
+When @option{--sandbox} is specified, the @code{system()} function is disabled
+(@pxref{Options}).
+@end quotation
+
+On POSIX systems, a command's exit status is a 16-bit number. The exit
+value passed to the C @code{exit()} function is held in the high-order
+eight bits. The low-order bits indicate if the process was killed by a
+signal (bit 7) and if so, the guilty signal number (bits 0--6).
+
+Traditionally, @command{awk}'s @code{system()} function has simply
+returned the exit status value divided by 256. In the normal case this
+gives the exit status but in the case of death-by-signal it yields
+a fractional floating-point value.@footnote{In private correspondence,
+Dr.@: Kernighan has indicated to me that the way this was done
+was probably a mistake.} POSIX states that @command{awk}'s
+@code{system()} should return the full 16-bit value.
+
+@command{gawk} steers a middle ground.
+The return values are summarized in @ref{table-system-return-values}.
+
+@float Table,table-system-return-values
+@caption{Return values from @code{system()}}
+@multitable @columnfractions .40 .60
+@headitem Situation @tab Return value from @code{system()}
+@item @option{--traditional} @tab C @code{system()}'s value divided by 256
+@item @option{--posix} @tab C @code{system()}'s value
+@item Normal exit of command @tab Command's exit status
+@item Death by signal of command @tab 256 + number of murderous signal
+@item Death by signal of command with core dump @tab 512 + number of murderous signal
+@item Some kind of error @tab @minus{}1
+@end multitable
+@end float
+@end table
+
+As of August, 2018, BWK @command{awk} now follows @command{gawk}'s behavior
+for the return value of @code{system()}.
+
+@sidebar Controlling Output Buffering with @code{system()}
+@cindex buffers, flushing
+@cindex buffering, input/output
+@cindex output, buffering
+
+The @code{fflush()} function provides explicit control over output buffering for
+individual files and pipes.  However, its use is not portable to many older
+@command{awk} implementations.  An alternative method to flush output
+buffers is to call @code{system()} with a null string as its argument:
+
+@example
+system("")   # flush output
+@end example
+
+@noindent
+@command{gawk} treats this use of the @code{system()} function as a special
+case and is smart enough not to run a shell (or other command
+interpreter) with the empty command.  Therefore, with @command{gawk}, this
+idiom is not only useful, it is also efficient.  Although this method should work
+with other @command{awk} implementations, it does not necessarily avoid
+starting an unnecessary shell.  (Other implementations may only
+flush the buffer associated with the standard output and not necessarily
+all buffered output.)
+
+If you think about what a programmer expects, it makes sense that
+@code{system()} should flush any pending output.  The following program:
+
+@example
+BEGIN @{
+     print "first print"
+     system("echo system echo")
+     print "second print"
+@}
+@end example
+
+@noindent
+must print:
+
+@example
+first print
+system echo
+second print
+@end example
+
+@noindent
+and not:
+
+@example
+system echo
+first print
+second print
+@end example
+
+If @command{awk} did not flush its buffers before calling @code{system()},
+you would see the latter (undesirable) output.
+@end sidebar
+
+@node Time Functions
+@subsection Time Functions
+@cindex time functions
+
+@cindex timestamps
+@cindex log files, timestamps in
+@cindex files, log@comma{} timestamps in
+@cindex @command{gawk}, timestamps
+@cindex POSIX @command{awk}, timestamps and
+@command{awk} programs are commonly used to process log files
+containing timestamp information, indicating when a
+particular log record was written.  Many programs log their timestamps
+in the form returned by the @code{time()} system call, which is the
+number of seconds since a particular epoch.  On POSIX-compliant systems,
+it is the number of seconds since
+1970-01-01 00:00:00 UTC, not counting leap
+@ifclear FOR_PRINT
+seconds.@footnote{@xref{Glossary}, especially the entries ``Epoch'' and ``UTC.''}
+@end ifclear
+@ifset FOR_PRINT
+seconds.
+@end ifset
+All known POSIX-compliant systems support timestamps from 0 through
+@iftex
+@math{2^{31} - 1},
+@end iftex
+@ifinfo
+2^31 - 1,
+@end ifinfo
+@ifnottex
+@ifnotinfo
+2@sup{31} @minus{} 1,
+@end ifnotinfo
+@end ifnottex
+which is sufficient to represent times through
+2038-01-19 03:14:07 UTC.  Many systems support a wider range of timestamps,
+including negative timestamps that represent times before the
+epoch.
+
+@cindex @command{date} utility, GNU
+@cindex time, retrieving
+In order to make it easier to process such log files and to produce
+useful reports, @command{gawk} provides the following functions for
+working with timestamps.  They are @command{gawk} extensions; they are
+not specified in the POSIX standard.@footnote{The GNU @command{date} utility can
+also do many of the things described here.  Its use may be preferable
+for simple time-related operations in shell scripts.}
+However, recent versions
+of @command{mawk} (@pxref{Other Versions}) also support these functions.
+Optional parameters are enclosed in square brackets ([ ]):
+
+@c @asis for docbook
+@table @asis
+@item @code{mktime(@var{datespec}} [@code{, @var{utc-flag}} ]@code{)}
+@cindexgawkfunc{mktime}
+@cindex generate time values
+Turn @var{datespec} into a timestamp in the same form
+as is returned by @code{systime()}.  It is similar to the function of the
+same name in ISO C.  The argument, @var{datespec}, is a string of the form
+@w{@code{"@var{YYYY} @var{MM} @var{DD} @var{HH} @var{MM} @var{SS} [@var{DST}]"}}.
+The string consists of six or seven numbers representing, respectively,
+the full year including century, the month from 1 to 12, the day of the month
+from 1 to 31, the hour of the day from 0 to 23, the minute from 0 to
+59, the second from 0 to 60,@footnote{Occasionally there are
+minutes in a year with a leap second, which is why the
+seconds can go up to 60.}
+and an optional daylight-savings flag.
+
+The values of these numbers need not be within the ranges specified;
+for example, an hour of @minus{}1 means 1 hour before midnight.
+The origin-zero Gregorian calendar is assumed, with year 0 preceding
+year 1 and year @minus{}1 preceding year 0.
+If @var{utc-flag} is present and is either nonzero or non-null, the time
+is assumed to be in the UTC time zone; otherwise, the
+time is assumed to be in the local time zone.
+If the @var{DST} daylight-savings flag is positive, the time is assumed to be
+daylight savings time; if zero, the time is assumed to be standard
+time; and if negative (the default), @code{mktime()} attempts to determine
+whether daylight savings time is in effect for the specified time.
+
+If @var{datespec} does not contain enough elements or if the resulting time
+is out of range, @code{mktime()} returns @minus{}1.
+
+@cindex @command{gawk}, @code{PROCINFO} array in
+@cindex @code{PROCINFO} array
+@item @code{strftime(}[@var{format} [@code{,} @var{timestamp} [@code{,} @var{utc-flag}] ] ]@code{)}
+@cindexgawkfunc{strftime}
+@cindex format time string
+Format the time specified by @var{timestamp}
+based on the contents of the @var{format} string and return the result.
+It is similar to the function of the same name in ISO C.
+If @var{utc-flag} is present and is either nonzero or non-null, the value
+is formatted as UTC (Coordinated Universal Time, formerly GMT or Greenwich
+Mean Time). Otherwise, the value is formatted for the local time zone.
+The @var{timestamp} is in the same format as the value returned by the
+@code{systime()} function.  If no @var{timestamp} argument is supplied,
+@command{gawk} uses the current time of day as the timestamp.
+Without a @var{format} argument, @code{strftime()} uses
+the value of @code{PROCINFO["strftime"]} as the format string
+(@pxref{Built-in Variables}).
+The default string value is
+@code{@w{"%a %b %e %H:%M:%S %Z %Y"}}.  This format string produces
+output that is equivalent to that of the @command{date} utility.
+You can assign a new value to @code{PROCINFO["strftime"]} to
+change the default format; see the following list for the various format directives.
+
+@item @code{systime()}
+@cindexgawkfunc{systime}
+@cindex timestamps
+@cindex current system time
+Return the current time as the number of seconds since
+the system epoch.  On POSIX systems, this is the number of seconds
+since 1970-01-01 00:00:00 UTC, not counting leap seconds.
+It may be a different number on other systems.
+@end table
+
+The @code{systime()} function allows you to compare a timestamp from a
+log file with the current time of day.  In particular, it is easy to
+determine how long ago a particular record was logged.  It also allows
+you to produce log records using the ``seconds since the epoch'' format.
+
+@cindex converting, dates to timestamps
+@cindex dates, converting to timestamps
+@cindex timestamps, converting dates to
+The @code{mktime()} function allows you to convert a textual representation
+of a date and time into a timestamp.   This makes it easy to do before/after
+comparisons of dates and times, particularly when dealing with date and
+time data coming from an external source, such as a log file.
+
+The @code{strftime()} function allows you to easily turn a timestamp
+into human-readable information.  It is similar in nature to the @code{sprintf()}
+function
+(@pxref{String Functions}),
+in that it copies nonformat specification characters verbatim to the
+returned string, while substituting date and time values for format
+specifications in the @var{format} string.
+
+@cindex format specifiers, @code{strftime()} function (@command{gawk})
+@code{strftime()} is guaranteed by the 1999 ISO C
+standard@footnote{Unfortunately,
+not every system's @code{strftime()} necessarily
+supports all of the conversions listed here.}
+to support the following date format specifications:
+
+@table @code
+@item %a
+The locale's abbreviated weekday name.
+
+@item %A
+The locale's full weekday name.
+
+@item %b
+The locale's abbreviated month name.
+
+@item %B
+The locale's full month name.
+
+@item %c
+The locale's ``appropriate'' date and time representation.
+(This is @samp{%A %B %d %T %Y} in the @code{"C"} locale.)
+
+@item %C
+The century part of the current year.
+This is the year divided by 100 and truncated to the next
+lower integer.
+
+@item %d
+The day of the month as a decimal number (01--31).
+
+@item %D
+Equivalent to specifying @samp{%m/%d/%y}.
+
+@item %e
+The day of the month, padded with a space if it is only one digit.
+
+@item %F
+Equivalent to specifying @samp{%Y-%m-%d}.
+This is the ISO 8601 date format.
+
+@item %g
+The year modulo 100 of the ISO 8601 week number, as a decimal number (00--99).
+For example, January 1, 2012, is in week 53 of 2011. Thus, the year
+of its ISO 8601 week number is 2011, even though its year is 2012.
+Similarly, December 31, 2012, is in week 1 of 2013. Thus, the year
+of its ISO week number is 2013, even though its year is 2012.
+
+@item %G
+The full year of the ISO week number, as a decimal number.
+
+@item %h
+Equivalent to @samp{%b}.
+
+@item %H
+The hour (24-hour clock) as a decimal number (00--23).
+
+@item %I
+The hour (12-hour clock) as a decimal number (01--12).
+
+@item %j
+The day of the year as a decimal number (001--366).
+
+@item %m
+The month as a decimal number (01--12).
+
+@item %M
+The minute as a decimal number (00--59).
+
+@item %n
+A newline character (ASCII LF).
+
+@item %p
+The locale's equivalent of the AM/PM designations associated
+with a 12-hour clock.
+
+@item %r
+The locale's 12-hour clock time.
+(This is @samp{%I:%M:%S %p} in the @code{"C"} locale.)
+
+@item %R
+Equivalent to specifying @samp{%H:%M}.
+
+@item %S
+The second as a decimal number (00--60).
+
+@item %t
+A TAB character.
+
+@item %T
+Equivalent to specifying @samp{%H:%M:%S}.
+
+@item %u
+The weekday as a decimal number (1--7).  Monday is day one.
+
+@item %U
+The week number of the year (with the first Sunday as the first day of week one)
+as a decimal number (00--53).
+
+@c @cindex ISO 8601
+@item %V
+The week number of the year (with the first Monday as the first
+day of week one) as a decimal number (01--53).
+The method for determining the week number is as specified by ISO 8601.
+(To wit: if the week containing January 1 has four or more days in the
+new year, then it is week one; otherwise it is the last week
+[52 or 53] of the previous year and the next week is week one.)
+
+@item %w
+The weekday as a decimal number (0--6).  Sunday is day zero.
+
+@item %W
+The week number of the year (with the first Monday as the first day of week one)
+as a decimal number (00--53).
+
+@item %x
+The locale's ``appropriate'' date representation.
+(This is @samp{%A %B %d %Y} in the @code{"C"} locale.)
+
+@item %X
+The locale's ``appropriate'' time representation.
+(This is @samp{%T} in the @code{"C"} locale.)
+
+@item %y
+The year modulo 100 as a decimal number (00--99).
+
+@item %Y
+The full year as a decimal number (e.g., 2015).
+
+@c @cindex RFC 822
+@c @cindex RFC 1036
+@item %z
+The time zone offset in a @samp{+@var{HHMM}} format (e.g., the format
+necessary to produce RFC 822/RFC 1036 date headers).
+
+@item %Z
+The time zone name or abbreviation; no characters if
+no time zone is determinable.
+
+@item %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH
+@itemx %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy
+``Alternative representations'' for the specifications
+that use only the second letter (@samp{%c}, @samp{%C},
+and so on).@footnote{If you don't understand any of this, don't worry about
+it; these facilities are meant to make it easier to ``internationalize''
+programs.
+Other internationalization features are described in
+@ref{Internationalization}.}
+(These facilitate compliance with the POSIX @command{date} utility.)
+
+@item %%
+A literal @samp{%}.
+@end table
+
+If a conversion specifier is not one of those just listed, the behavior is
+undefined.@footnote{This is because ISO C leaves the
+behavior of the C version of @code{strftime()} undefined and @command{gawk}
+uses the system's version of @code{strftime()} if it's there.
+Typically, the conversion specifier either does not appear in the
+returned string or appears literally.}
+
+For systems that are not yet fully standards-compliant,
+@command{gawk} supplies a copy of
+@code{strftime()} from the GNU C Library.
+It supports all of the just-listed format specifications.
+If that version is
+used to compile @command{gawk} (@pxref{Installation}),
+then the following additional format specifications are available:
+
+@table @code
+@item %k
+The hour (24-hour clock) as a decimal number (0--23).
+Single-digit numbers are padded with a space.
+
+@item %l
+The hour (12-hour clock) as a decimal number (1--12).
+Single-digit numbers are padded with a space.
+
+@ignore
+@item %N
+The ``Emperor/Era'' name.
+Equivalent to @samp{%C}.
+
+@item %o
+The ``Emperor/Era'' year.
+Equivalent to @samp{%y}.
+@end ignore
+
+@item %s
+The time as a decimal timestamp in seconds since the epoch.
+
+@ignore
+@item %v
+The date in VMS format (e.g., @samp{20-JUN-1991}).
+@end ignore
+@end table
+
+Additionally, the alternative representations are recognized but their
+normal representations are used.
+
+@cindex @code{date} utility, POSIX
+@cindex POSIX @command{awk}, @code{date} utility and
+The following example is an @command{awk} implementation of the POSIX
+@command{date} utility.  Normally, the @command{date} utility prints the
+current date and time of day in a well-known format.  However, if you
+provide an argument to it that begins with a @samp{+}, @command{date}
+copies nonformat specifier characters to the standard output and
+interprets the current time according to the format specifiers in
+the string.  For example:
+
+@example
+$ @kbd{date '+Today is %A, %B %d, %Y.'}
+@print{} Today is Monday, September 22, 2014.
+@end example
+
+Here is the @command{gawk} version of the @command{date} utility.
+It has a shell ``wrapper'' to handle the @option{-u} option,
+which requires that @command{date} run as if the time zone
+is set to UTC:
+
+@example
+#! /bin/sh
+#
+# date --- approximate the POSIX 'date' command
+
+case $1 in
+-u)  TZ=UTC0     # use UTC
+     export TZ
+     shift ;;
+esac
+
+gawk 'BEGIN  @{
+    format = PROCINFO["strftime"]
+    exitval = 0
+
+    if (ARGC > 2)
+        exitval = 1
+    else if (ARGC == 2) @{
+        format = ARGV[1]
+        if (format ~ /^\+/)
+            format = substr(format, 2)   # remove leading +
+    @}
+    print strftime(format)
+    exit exitval
+@}' "$@@"
+@end example
+
+@node Bitwise Functions
+@subsection Bit-Manipulation Functions
+@cindex bit-manipulation functions
+@cindex bitwise, operations
+@cindex AND bitwise operation
+@cindex OR bitwise operation
+@cindex XOR bitwise operation
+@cindex operations, bitwise
+@quotation
+@i{I can explain it for you, but I can't understand it for you.}
+@author Anonymous
+@end quotation
+
+Many languages provide the ability to perform @dfn{bitwise} operations
+on two integer numbers.  In other words, the operation is performed on
+each successive pair of bits in the operands.
+Three common operations are bitwise AND, OR, and XOR.
+The operations are described in @ref{table-bitwise-ops}.
+
+@c 11/2014: Postprocessing turns the docbook informaltable
+@c into a table. Hurray for scripting!
+@float Table,table-bitwise-ops
+@caption{Bitwise operations}
+@ifnottex
+@ifnotdocbook
+@verbatim
+                Bit operator
+          |  AND  |   OR  |  XOR
+          |---+---+---+---+---+---
+Operands  | 0 | 1 | 0 | 1 | 0 | 1
+----------+---+---+---+---+---+---
+    0     | 0   0 | 0   1 | 0   1
+    1     | 0   1 | 1   1 | 1   0
+@end verbatim
+@end ifnotdocbook
+@end ifnottex
+@tex
+\centerline{
+\vbox{\bigskip % space above the table (about 1 linespace)
+% Because we have vertical rules, we can't let TeX insert interline space
+% in its usual way.
+\offinterlineskip
+\halign{\strut\hfil#\quad\hfil  % operands
+        &\vrule#&\quad#\quad    % rule, 0 (of and)
+        &\vrule#&\quad#\quad    % rule, 1 (of and)
+        &\vrule#                % rule between and and or
+        &\quad#\quad            % 0 (of or)
+        &\vrule#&\quad#\quad    % rule, 1 (of of)
+        &\vrule#                % rule between or and xor
+        &\quad#\quad            % 0 of xor
+        &\vrule#&\quad#\quad    % rule, 1 of xor
+        \cr
+&\omit&\multispan{11}\hfil\bf Bit operator\hfil\cr
+\noalign{\smallskip}
+&     &\multispan3\hfil AND\hfil&&\multispan3\hfil  OR\hfil
+                           &&\multispan3\hfil XOR\hfil\cr
+\bf Operands&&0&&1&&0&&1&&0&&1\cr
+\noalign{\hrule}
+\omit&height 2pt&&\omit&&&&\omit&&&&\omit\cr
+\noalign{\hrule height0pt}% without this the rule does not extend; why?
+0&&0&\omit&0&&0&\omit&1&&0&\omit&1\cr
+1&&0&\omit&1&&1&\omit&1&&1&\omit&0\cr
+}}}
+@end tex
+
+@docbook
+<informaltable>
+
+<tgroup cols="7" colsep="1">
+<colspec colname="c1"/>
+<colspec colname="c2"/>
+<colspec colname="c3"/>
+<colspec colname="c4"/>
+<colspec colname="c5"/>
+<colspec colname="c6"/>
+<colspec colname="c7"/>
+<spanspec spanname="optitle" namest="c2" nameend="c7" align="center"/>
+<spanspec spanname="andspan" namest="c2" nameend="c3" align="center"/>
+<spanspec spanname="orspan" namest="c4" nameend="c5" align="center"/>
+<spanspec spanname="xorspan" namest="c6" nameend="c7" align="center"/>
+
+<tbody>
+<row>
+<entry colsep="0"></entry>
+<entry spanname="optitle"><emphasis role="bold">Bit operator</emphasis></entry>
+</row>
+
+<row rowsep="1">
+<entry rowsep="0"></entry>
+<entry spanname="andspan">AND</entry>
+<entry spanname="orspan">OR</entry>
+<entry spanname="xorspan">XOR</entry>
+</row>
+
+<row rowsep="1">
+<entry ><emphasis role="bold">Operands</emphasis></entry>
+<entry colsep="0">0</entry>
+<entry colsep="1">1</entry>
+<entry colsep="0">0</entry>
+<entry colsep="1">1</entry>
+<entry colsep="0">0</entry>
+<entry colsep="1">1</entry>
+</row>
+
+<row>
+<entry align="center">0</entry>
+<entry colsep="0">0</entry>
+<entry>0</entry>
+<entry colsep="0">0</entry>
+<entry>1</entry>
+<entry colsep="0">0</entry>
+<entry>1</entry>
+</row>
+
+<row>
+<entry align="center">1</entry>
+<entry colsep="0">0</entry>
+<entry>1</entry>
+<entry colsep="0">1</entry>
+<entry>1</entry>
+<entry colsep="0">1</entry>
+<entry>0</entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+@end docbook
+@end float
+
+@cindex bitwise complement
+@cindex complement, bitwise
+As you can see, the result of an AND operation is 1 only when @emph{both}
+bits are 1.
+The result of an OR operation is 1 if @emph{either} bit is 1.
+The result of an XOR operation is 1 if either bit is 1,
+but not both.
+The next operation is the @dfn{complement}; the complement of 1 is 0 and
+the complement of 0 is 1. Thus, this operation ``flips'' all the bits
+of a given value.
+
+@cindex bitwise, shift
+@cindex left shift, bitwise
+@cindex right shift, bitwise
+@cindex shift, bitwise
+Finally, two other common operations are to shift the bits left or right.
+For example, if you have a bit string @samp{10111001} and you shift it
+right by three bits, you end up with @samp{00010111}.@footnote{This example
+shows that zeros come in on the left side. For @command{gawk}, this is
+always true, but in some languages, it's possible to have the left side
+fill with ones.}
+If you start over again with @samp{10111001} and shift it left by three
+bits, you end up with @samp{11001000}.  The following list describes
+@command{gawk}'s built-in functions that implement the bitwise operations.
+Optional parameters are enclosed in square brackets ([ ]):
+
+@cindex @command{gawk}, bitwise operations in
+@table @asis
+@cindexgawkfunc{and}
+@cindex bitwise AND
+@item @code{and(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
+Return the bitwise AND of the arguments. There must be at least two.
+
+@cindexgawkfunc{compl}
+@cindex bitwise complement
+@item @code{compl(@var{val})}
+Return the bitwise complement of @var{val}.
+
+@cindexgawkfunc{lshift}
+@cindex left shift
+@item @code{lshift(@var{val}, @var{count})}
+Return the value of @var{val}, shifted left by @var{count} bits.
+
+@cindexgawkfunc{or}
+@cindex bitwise OR
+@item @code{or(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
+Return the bitwise OR of the arguments. There must be at least two.
+
+@cindexgawkfunc{rshift}
+@cindex right shift
+@item @code{rshift(@var{val}, @var{count})}
+Return the value of @var{val}, shifted right by @var{count} bits.
+
+@cindexgawkfunc{xor}
+@cindex bitwise XOR
+@item @code{xor(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
+Return the bitwise XOR of the arguments. There must be at least two.
+@end table
+
+@quotation CAUTION
+Beginning with @command{gawk} @value{PVERSION} 4.2, negative
+operands are not allowed for any of these functions. A negative
+operand produces a fatal error.  See the sidebar
+``Beware The Smoke and Mirrors!'' for more information as to why.
+@end quotation
+
+Here is a user-defined function (@pxref{User-defined})
+that illustrates the use of these functions:
+
+@cindex @code{bits2str()} user-defined function
+@cindex @code{testbits.awk} program
+@example
+@group
+@c file eg/lib/bits2str.awk
+# bits2str --- turn an integer into readable ones and zeros
+
+function bits2str(bits,        data, mask)
+@{
+    if (bits == 0)
+        return "0"
+
+    mask = 1
+    for (; bits != 0; bits = rshift(bits, 1))
+        data = (and(bits, mask) ? "1" : "0") data
+
+    while ((length(data) % 8) != 0)
+        data = "0" data
+
+    return data
+@}
+@c endfile
+@end group
+
+@c this is a hack to make testbits.awk self-contained
+@ignore
+@c file eg/prog/testbits.awk
+# bits2str --- turn an integer into readable ones and zeros
+
+function bits2str(bits,        data, mask)
+@{
+    if (bits == 0)
+        return "0"
+
+    mask = 1
+    for (; bits != 0; bits = rshift(bits, 1))
+        data = (and(bits, mask) ? "1" : "0") data
+
+    while ((length(data) % 8) != 0)
+        data = "0" data
+
+    return data
+@}
+@c endfile
+@end ignore
+@c file eg/prog/testbits.awk
+BEGIN @{
+    printf "123 = %s\n", bits2str(123)
+    printf "0123 = %s\n", bits2str(0123)
+    printf "0x99 = %s\n", bits2str(0x99)
+    comp = compl(0x99)
+    printf "compl(0x99) = %#x = %s\n", comp, bits2str(comp)
+    shift = lshift(0x99, 2)
+    printf "lshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
+    shift = rshift(0x99, 2)
+    printf "rshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
+@}
+@c endfile
+@end example
+
+@noindent
+This program produces the following output when run:
+
+@example
+$ @kbd{gawk -f testbits.awk}
+@print{} 123 = 01111011
+@print{} 0123 = 01010011
+@print{} 0x99 = 10011001
+@print{} compl(0x99) = 0x3fffffffffff66 =
+@print{} 00111111111111111111111111111111111111111111111101100110
+@print{} lshift(0x99, 2) = 0x264 = 0000001001100100
+@print{} rshift(0x99, 2) = 0x26 = 00100110
+@end example
+
+@cindex converting, strings to numbers
+@cindex strings, converting
+@cindex numbers, converting
+@cindex converting, numbers to strings
+@cindex numbers, as string of bits
+The @code{bits2str()} function turns a binary number into a string.
+Initializing @code{mask} to one creates
+a binary value where the rightmost bit
+is set to one.  Using this mask,
+the function repeatedly checks the rightmost bit.
+ANDing the mask with the value indicates whether the
+rightmost bit is one or not. If so, a @code{"1"} is concatenated onto the front
+of the string.
+Otherwise, a @code{"0"} is added.
+The value is then shifted right by one bit and the loop continues
+until there are no more one bits.
+
+If the initial value is zero, it returns a simple @code{"0"}.
+Otherwise, at the end, it pads the value with zeros to represent multiples
+of 8-bit quantities. This is typical in modern computers.
+
+The main code in the @code{BEGIN} rule shows the difference between the
+decimal and octal values for the same numbers
+(@pxref{Nondecimal-numbers}),
+and then demonstrates the
+results of the @code{compl()}, @code{lshift()}, and @code{rshift()} functions.
+
+@sidebar Beware The Smoke and Mirrors!
+
+It other languages, bitwise operations are performed on integer values,
+not floating-point values.  As a general statement, such operations work
+best when performed on unsigned integers.
+
+@command{gawk} attempts to treat the arguments to the bitwise functions
+as unsigned integers.  For this reason, negative arguments produce a
+fatal error.
+
+In normal operation, for all of these functions, first the
+double-precision floating-point value is converted to the widest C
+unsigned integer type, then the bitwise operation is performed.  If the
+result cannot be represented exactly as a C @code{double}, leading
+nonzero bits are removed one by one until it can be represented exactly.
+The result is then converted back into a C @code{double}.@footnote{If you don't
+understand this paragraph, the upshot is that @command{gawk} can only
+store a particular range of integer values; numbers outside that range
+are reduced to fit within the range.}
+
+However, when using arbitrary precision arithmetic with the @option{-M}
+option (@pxref{Arbitrary Precision Arithmetic}), the results may differ.
+This is particularly noticeable with the @code{compl()} function:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print compl(42) @}'}
+@print{} 9007199254740949
+$ @kbd{gawk -M 'BEGIN @{ print compl(42) @}'}
+@print{} -43
+@end example
+
+What's going on becomes clear when printing the results
+in hexadecimal:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "%#x\n", compl(42) @}'}
+@print{} 0x1fffffffffffd5
+$ @kbd{gawk -M 'BEGIN @{ printf "%#x\n", compl(42) @}'}
+@print{} 0xffffffffffffffd5
+@end example
+
+When using the @option{-M} option, under the hood, @command{gawk} uses
+GNU MP arbitrary precision integers which have at least 64 bits of precision.
+When not using @option{-M}, @command{gawk} stores integral values in
+regular double-precision floating point, which only maintain 53 bits of
+precision.  Furthermore, the GNU MP library treats (or at least seems to treat)
+the leading bit as a sign bit; thus the result with @option{-M} in this case is
+a negative number.
+
+In short, using @command{gawk} for any but the simplest kind of bitwise
+operations is probably a bad idea; caveat emptor!
+
+@end sidebar
+
+@node Type Functions
+@subsection Getting Type Information
+
+@command{gawk} provides two functions that let you distinguish
+the type of a variable.
+This is necessary for writing code
+that traverses every element of an array of arrays
+(@pxref{Arrays of Arrays}), and in other contexts.
+
+@table @code
+@cindexgawkfunc{isarray}
+@cindex scalar or array
+@item isarray(@var{x})
+Return a true value if @var{x} is an array. Otherwise, return false.
+
+@cindexgawkfunc{typeof}
+@cindex variable type
+@cindex type, of variable
+@item typeof(@var{x})
+Return one of the following strings, depending upon the type of @var{x}:
+
+@c nested table
+@table @code
+@item "array"
+@var{x} is an array.
+
+@item "regexp"
+@var{x} is a strongly typed regexp (@pxref{Strong Regexp Constants}).
+
+@item "number"
+@var{x} is a number.
+
+@item "string"
+@var{x} is a string.
+
+@item "strnum"
+@var{x} is a number that started life as user input, such as a field or
+the result of calling @code{split()}. (I.e., @var{x} has the strnum
+attribute; @pxref{Variable Typing}.)
+
+@item "unassigned"
+@var{x} is a scalar variable that has not been assigned a value yet.
+For example:
+
+@example
+BEGIN @{
+    # creates a[1] but it has no assigned value
+    a[1]
+    print typeof(a[1])  # unassigned
+@}
+@end example
+
+@item "untyped"
+@var{x} has not yet been used yet at all; it can become a scalar or an
+array.  The typing could even conceivably differ from run to run of
+the same program! For example:
+
+@example
+BEGIN @{
+    print "initially, typeof(v) = ", typeof(v)
+
+    if ("FOO" in ENVIRON)
+        make_scalar(v)
+    else
+        make_array(v)
+
+    print "typeof(v) =", typeof(v)
+@}
+
+function make_scalar(p,    l) @{ l = p @}
+
+function make_array(p) @{ p[1] = 1 @}
+@end example
+
+@end table
+@end table
+
+@code{isarray()} is meant for use in two circumstances. The first is when
+traversing a multidimensional array: you can test if an element is itself
+an array or not.  The second is inside the body of a user-defined function
+(not discussed yet; @pxref{User-defined}), to test if a parameter is an
+array or not.
+
+@quotation NOTE
+While you can use @code{isarray()} at the global level to test variables,
+doing so makes no sense. Because @emph{you} are the one writing the
+program, @emph{you} are supposed to know if your variables are arrays
+or not.
+@end quotation
+
+The @code{typeof()} function is general; it allows you to determine
+if a variable or function parameter is a scalar (number, string,
+or strongly typed regexp) or an array.
+
+Normally, passing a variable that has never been used to a built-in
+function causes it to become a scalar variable (unassigned).
+However, @code{isarray()} and @code{typeof()} are different; they do
+not change their arguments from untyped to unassigned.
+
+@node I18N Functions
+@subsection String-Translation Functions
+@cindex @command{gawk}, string-translation functions
+@cindex functions, string-translation
+@cindex string-translation functions
+@cindex internationalization
+@cindex @command{awk} programs, internationalizing
+
+@command{gawk} provides facilities for internationalizing @command{awk} programs.
+These include the functions described in the following list.
+The descriptions here are purposely brief.
+@xref{Internationalization},
+for the full story.
+Optional parameters are enclosed in square brackets ([ ]):
+
+@table @asis
+@cindexgawkfunc{bindtextdomain}
+@cindex set directory of message catalogs
+@item @code{bindtextdomain(@var{directory}} [@code{,} @var{domain}]@code{)}
+Set the directory in which
+@command{gawk} will look for message translation files, in case they
+will not or cannot be placed in the ``standard'' locations
+(e.g., during testing).
+It returns the directory in which @var{domain} is ``bound.''
+
+The default @var{domain} is the value of @code{TEXTDOMAIN}.
+If @var{directory} is the null string (@code{""}), then
+@code{bindtextdomain()} returns the current binding for the
+given @var{domain}.
+
+@cindexgawkfunc{dcgettext}
+@cindex translate string
+@item @code{dcgettext(@var{string}} [@code{,} @var{domain} [@code{,} @var{category}] ]@code{)}
+Return the translation of @var{string} in
+text domain @var{domain} for locale category @var{category}.
+The default value for @var{domain} is the current value of @code{TEXTDOMAIN}.
+The default value for @var{category} is @code{"LC_MESSAGES"}.
+
+@cindexgawkfunc{dcngettext}
+@item @code{dcngettext(@var{string1}, @var{string2}, @var{number}} [@code{,} @var{domain} [@code{,} @var{category}] ]@code{)}
+Return the plural form used for @var{number} of the
+translation of @var{string1} and @var{string2} in text domain
+@var{domain} for locale category @var{category}. @var{string1} is the
+English singular variant of a message, and @var{string2} is the English plural
+variant of the same message.
+The default value for @var{domain} is the current value of @code{TEXTDOMAIN}.
+The default value for @var{category} is @code{"LC_MESSAGES"}.
+@end table
+
+@node User-defined
+@section User-Defined Functions
+
+@cindex user-defined functions
+@cindex functions, user-defined
+Complicated @command{awk} programs can often be simplified by defining
+your own functions.  User-defined functions can be called just like
+built-in ones (@pxref{Function Calls}), but it is up to you to define
+them (i.e., to tell @command{awk} what they should do).
+
+@menu
+* Definition Syntax::           How to write definitions and what they mean.
+* Function Example::            An example function definition and what it
+                                does.
+* Function Calling::            Calling user-defined functions.
+* Return Statement::            Specifying the value a function returns.
+* Dynamic Typing::              How variable types can change at runtime.
+@end menu
+
+@node Definition Syntax
+@subsection Function Definition Syntax
+
+@quotation
+@i{It's entirely fair to say that the awk syntax for local
+variable definitions is appallingly awful.}
+@author Brian Kernighan
+@end quotation
+
+@cindex functions, defining
+Definitions of functions can appear anywhere between the rules of an
+@command{awk} program.  Thus, the general form of an @command{awk} program is
+extended to include sequences of rules @emph{and} user-defined function
+definitions.
+There is no need to put the definition of a function
+before all uses of the function.  This is because @command{awk} reads the
+entire program before starting to execute any of it.
+
+The definition of a function named @var{name} looks like this:
+
+@display
+@group
+@code{function} @var{name}@code{(}[@var{parameter-list}]@code{)}
+@code{@{}
+     @var{body-of-function}
+@code{@}}
+@end group
+@end display
+
+@cindex names, functions
+@cindex functions, names of
+@cindex namespace issues, functions
+@noindent
+Here, @var{name} is the name of the function to define.  A valid function
+name is like a valid variable name: a sequence of letters, digits, and
+underscores that doesn't start with a digit.
+Here too, only the 52 upper- and lowercase English letters may
+be used in a function name.
+Within a single @command{awk} program, any particular name can only be
+used as a variable, array, or function.
+
+@var{parameter-list} is an optional list of the function's arguments and local
+variable names, separated by commas.  When the function is called,
+the argument names are used to hold the argument values given in
+the call.
+
+A function cannot have two parameters with the same name, nor may it
+have a parameter with the same name as the function itself.
+
+@quotation CAUTION
+According to the POSIX standard, function parameters
+cannot have the same name as one of the special predefined variables
+(@pxref{Built-in Variables}), nor may a function parameter have the
+same name as another function.
+
+Not all versions of @command{awk} enforce
+these restrictions.
+@command{gawk} always enforces the first restriction.
+With @option{--posix} (@pxref{Options}),
+it also enforces the second restriction.
+@end quotation
+
+Local variables act like the empty string if referenced where a string
+value is required, and like zero if referenced where a numeric value
+is required. This is the same as the behavior of regular variables that have never been
+assigned a value.  (There is more to understand about local variables;
+@pxref{Dynamic Typing}.)
+
+The @var{body-of-function} consists of @command{awk} statements.  It is the
+most important part of the definition, because it says what the function
+should actually @emph{do}.  The argument names exist to give the body a
+way to talk about the arguments; local variables exist to give the body
+places to keep temporary values.
+
+Argument names are not distinguished syntactically from local variable
+names. Instead, the number of arguments supplied when the function is
+called determines how many argument variables there are.  Thus, if three
+argument values are given, the first three names in @var{parameter-list}
+are arguments and the rest are local variables.
+
+It follows that if the number of arguments is not the same in all calls
+to the function, some of the names in @var{parameter-list} may be
+arguments on some occasions and local variables on others.  Another
+way to think of this is that omitted arguments default to the
+null string.
+
+@cindex programming conventions, functions, writing
+Usually when you write a function, you know how many names you intend to
+use for arguments and how many you intend to use as local variables.  It is
+conventional to place some extra space between the arguments and
+the local variables, in order to document how your function is supposed to be used.
+
+@cindex variables, shadowing
+@cindex shadowing of variable values
+During execution of the function body, the arguments and local variable
+values hide, or @dfn{shadow}, any variables of the same names used in the
+rest of the program.  The shadowed variables are not accessible in the
+function definition, because there is no way to name them while their
+names have been taken away for the arguments and local variables.  All other variables
+used in the @command{awk} program can be referenced or set normally in the
+function's body.
+
+The arguments and local variables last only as long as the function body
+is executing.  Once the body finishes, you can once again access the
+variables that were shadowed while the function was running.
+
+@cindex recursive functions
+@cindex functions, recursive
+The function body can contain expressions that call functions.  They
+can even call this function, either directly or by way of another
+function.  When this happens, we say the function is @dfn{recursive}.
+The act of a function calling itself is called @dfn{recursion}.
+
+All the built-in functions return a value to their caller.
+User-defined functions can do so also, using the @code{return} statement,
+which is described in detail in @ref{Return Statement}.
+Many of the subsequent examples in this @value{SECTION} use
+the @code{return} statement.
+
+@cindex common extensions, @code{func} keyword
+@cindex extensions, common@comma{} @code{func} keyword
+@c @cindex @command{awk} language, POSIX version
+@c @cindex POSIX @command{awk}
+@cindex POSIX @command{awk}, @code{function} keyword in
+In many @command{awk} implementations, including @command{gawk},
+the keyword @code{function} may be
+abbreviated @code{func}. @value{COMMONEXT}
+However, POSIX only specifies the use of
+the keyword @code{function}.  This actually has some practical implications.
+If @command{gawk} is in POSIX-compatibility mode
+(@pxref{Options}), then the following
+statement does @emph{not} define a function:
+
+@example
+func foo() @{ a = sqrt($1) ; print a @}
+@end example
+
+@noindent
+Instead, it defines a rule that, for each record, concatenates the value
+of the variable @samp{func} with the return value of the function @samp{foo}.
+If the resulting string is non-null, the action is executed.
+This is probably not what is desired.  (@command{awk} accepts this input as
+syntactically valid, because functions may be used before they are defined
+in @command{awk} programs.@footnote{This program won't actually run,
+because @code{foo()} is undefined.})
+
+@cindex portability, functions@comma{} defining
+To ensure that your @command{awk} programs are portable, always use the
+keyword @code{function} when defining a function.
+
+@node Function Example
+@subsection Function Definition Examples
+@cindex function definition example
+
+Here is an example of a user-defined function, called @code{myprint()}, that
+takes a number and prints it in a specific format:
+
+@example
+function myprint(num)
+@{
+     printf "%6.3g\n", num
+@}
+@end example
+
+@noindent
+To illustrate, here is an @command{awk} rule that uses our @code{myprint()}
+function:
+
+@example
+$3 > 0     @{ myprint($3) @}
+@end example
+
+@noindent
+This program prints, in our special format, all the third fields that
+contain a positive number in our input.  Therefore, when given the following input:
+
+@example
+ 1.2   3.4    5.6   7.8
+ 9.10 11.12 -13.14 15.16
+17.18 19.20  21.22 23.24
+@end example
+
+@noindent
+this program, using our function to format the results, prints:
+
+@example
+   5.6
+  21.2
+@end example
+
+This function deletes all the elements in an array (recall that the
+extra whitespace signifies the start of the local variable list):
+
+@example
+@group
+function delarray(a,    i)
+@{
+    for (i in a)
+        delete a[i]
+@}
+@end group
+@end example
+
+When working with arrays, it is often necessary to delete all the elements
+in an array and start over with a new list of elements
+(@pxref{Delete}).
+Instead of having
+to repeat this loop everywhere that you need to clear out
+an array, your program can just call @code{delarray()}.
+(This guarantees portability.  The use of @samp{delete @var{array}} to delete
+the contents of an entire array is a relatively recent@footnote{Late in 2012.}
+addition to the POSIX standard.)
+
+The following is an example of a recursive function.  It takes a string
+as an input parameter and returns the string in reverse order.
+Recursive functions must always have a test that stops the recursion.
+In this case, the recursion terminates when the input string is
+already empty:
+
+@c 8/2014: Thanks to Mike Brennan for the improved formulation
+@cindex @code{rev()} user-defined function
+@example
+function rev(str)
+@{
+    if (str == "")
+        return ""
+
+    return (rev(substr(str, 2)) substr(str, 1, 1))
+@}
+@end example
+
+If this function is in a file named @file{rev.awk}, it can be tested
+this way:
+
+@example
+$ @kbd{echo "Don't Panic!" |}
+> @kbd{gawk -e '@{ print rev($0) @}' -f rev.awk}
+@print{} !cinaP t'noD
+@end example
+
+The C @code{ctime()} function takes a timestamp and returns it as a string,
+formatted in a well-known fashion.
+The following example uses the built-in @code{strftime()} function
+(@pxref{Time Functions})
+to create an @command{awk} version of @code{ctime()}:
+
+@cindex @code{ctime()} user-defined function
+@example
+@c file eg/lib/ctime.awk
+# ctime.awk
+#
+# awk version of C ctime(3) function
+
+function ctime(ts,    format)
+@{
+    format = "%a %b %e %H:%M:%S %Z %Y"
+
+    if (ts == 0)
+        ts = systime()       # use current time as default
+    return strftime(format, ts)
+@}
+@c endfile
+@end example
+
+You might think that @code{ctime()} could use @code{PROCINFO["strftime"]}
+for its format string. That would be a mistake, because @code{ctime()} is
+supposed to return the time formatted in a standard fashion, and user-level
+code could have changed @code{PROCINFO["strftime"]}.
+
+@node Function Calling
+@subsection Calling User-Defined Functions
+
+@cindex functions, user-defined, calling
+@dfn{Calling a function} means causing the function to run and do its job.
+A function call is an expression and its value is the value returned by
+the function.
+
+@menu
+* Calling A Function::          Don't use spaces.
+* Variable Scope::              Controlling variable scope.
+* Pass By Value/Reference::     Passing parameters.
+* Function Caveats::            Other points to know about functions.
+@end menu
+
+@node Calling A Function
+@subsubsection Writing a Function Call
+
+A function call consists of the function name followed by the arguments
+in parentheses.  @command{awk} expressions are what you write in the
+call for the arguments.  Each time the call is executed, these
+expressions are evaluated, and the values become the actual arguments.  For
+example, here is a call to @code{foo()} with three arguments (the first
+being a string concatenation):
+
+@example
+foo(x y, "lose", 4 * z)
+@end example
+
+@quotation CAUTION
+Whitespace characters (spaces and TABs) are not allowed
+between the function name and the opening parenthesis of the argument list.
+If you write whitespace by mistake, @command{awk} might think that you mean
+to concatenate a variable with an expression in parentheses.  However, it
+notices that you used a function name and not a variable name, and reports
+an error.
+@end quotation
+
+@node Variable Scope
+@subsubsection Controlling Variable Scope
+
+@cindex local variables, in a function
+@cindex variables, local to a function
+Unlike in many languages,
+there is no way to make a variable local to a @code{@{} @dots{} @code{@}} block in
+@command{awk}, but you can make a variable local to a function. It is
+good practice to do so whenever a variable is needed only in that
+function.
+
+To make a variable local to a function, simply declare the variable as
+an argument after the actual function arguments
+(@pxref{Definition Syntax}).
+Look at the following example, where variable
+@code{i} is a global variable used by both functions @code{foo()} and
+@code{bar()}:
+
+@example
+function bar()
+@{
+    for (i = 0; i < 3; i++)
+        print "bar's i=" i
+@}
+
+function foo(j)
+@{
+    i = j + 1
+    print "foo's i=" i
+    bar()
+    print "foo's i=" i
+@}
+
+BEGIN @{
+      i = 10
+      print "top's i=" i
+      foo(0)
+      print "top's i=" i
+@}
+@end example
+
+Running this script produces the following, because the @code{i} in
+functions @code{foo()} and @code{bar()} and at the top level refer to the same
+variable instance:
+
+@example
+top's i=10
+foo's i=1
+bar's i=0
+bar's i=1
+bar's i=2
+foo's i=3
+top's i=3
+@end example
+
+If you want @code{i} to be local to both @code{foo()} and @code{bar()}, do as
+follows (the extra space before @code{i} is a coding convention to
+indicate that @code{i} is a local variable, not an argument):
+
+@example
+function bar(    i)
+@{
+    for (i = 0; i < 3; i++)
+        print "bar's i=" i
+@}
+
+function foo(j,    i)
+@{
+    i = j + 1
+    print "foo's i=" i
+    bar()
+    print "foo's i=" i
+@}
+
+BEGIN @{
+      i = 10
+      print "top's i=" i
+      foo(0)
+      print "top's i=" i
+@}
+@end example
+
+Running the corrected script produces the following:
+
+@example
+top's i=10
+foo's i=1
+bar's i=0
+bar's i=1
+bar's i=2
+foo's i=1
+top's i=10
+@end example
+
+Besides scalar values (strings and numbers), you may also have
+local arrays.  By using a parameter name as an array, @command{awk}
+treats it as an array, and it is local to the function.
+In addition, recursive calls create new arrays.
+Consider this example:
+
+@example
+@group
+function some_func(p1,      a)
+@{
+    if (p1++ > 3)
+        return
+@end group
+
+    a[p1] = p1
+
+    some_func(p1)
+
+    printf("At level %d, index %d %s found in a\n",
+         p1, (p1 - 1), (p1 - 1) in a ? "is" : "is not")
+    printf("At level %d, index %d %s found in a\n",
+         p1, p1, p1 in a ? "is" : "is not")
+    print ""
+@}
+
+BEGIN @{
+    some_func(1)
+@}
+@end example
+
+When run, this program produces the following output:
+
+@example
+At level 4, index 3 is not found in a
+At level 4, index 4 is found in a
+
+At level 3, index 2 is not found in a
+At level 3, index 3 is found in a
+
+At level 2, index 1 is not found in a
+At level 2, index 2 is found in a
+@end example
+
+@node Pass By Value/Reference
+@subsubsection Passing Function Arguments by Value Or by Reference
+
+In @command{awk}, when you declare a function, there is no way to
+declare explicitly whether the arguments are passed @dfn{by value} or
+@dfn{by reference}.
+
+Instead, the passing convention is determined at runtime when
+the function is called, according to the following rule:
+if the argument is an array variable, then it is passed by reference.
+Otherwise, the argument is passed by value.
+
+@cindex call by value
+Passing an argument by value means that when a function is called, it
+is given a @emph{copy} of the value of this argument.
+The caller may use a variable as the expression for the argument, but
+the called function does not know this---it only knows what value the
+argument had.  For example, if you write the following code:
+
+@example
+foo = "bar"
+z = myfunc(foo)
+@end example
+
+@noindent
+then you should not think of the argument to @code{myfunc()} as being
+``the variable @code{foo}.''  Instead, think of the argument as the
+string value @code{"bar"}.
+If the function @code{myfunc()} alters the values of its local variables,
+this has no effect on any other variables.  Thus, if @code{myfunc()}
+does this:
+
+@example
+@group
+function myfunc(str)
+@{
+   print str
+   str = "zzz"
+   print str
+@}
+@end group
+@end example
+
+@noindent
+to change its first argument variable @code{str}, it does @emph{not}
+change the value of @code{foo} in the caller.  The role of @code{foo} in
+calling @code{myfunc()} ended when its value (@code{"bar"}) was computed.
+If @code{str} also exists outside of @code{myfunc()}, the function body
+cannot alter this outer value, because it is shadowed during the
+execution of @code{myfunc()} and cannot be seen or changed from there.
+
+@cindex call by reference
+@cindex arrays, as parameters to functions
+@cindex functions, arrays as parameters to
+However, when arrays are the parameters to functions, they are @emph{not}
+copied.  Instead, the array itself is made available for direct manipulation
+by the function.  This is usually termed @dfn{call by reference}.
+Changes made to an array parameter inside the body of a function @emph{are}
+visible outside that function.
+
+@quotation NOTE
+Changing an array parameter inside a function
+can be very dangerous if you do not watch what you are doing.
+For example:
+
+@example
+function changeit(array, ind, nvalue)
+@{
+     array[ind] = nvalue
+@}
+
+BEGIN @{
+    a[1] = 1; a[2] = 2; a[3] = 3
+    changeit(a, 2, "two")
+    printf "a[1] = %s, a[2] = %s, a[3] = %s\n",
+            a[1], a[2], a[3]
+@}
+@end example
+
+@noindent
+prints @samp{a[1] = 1, a[2] = two, a[3] = 3}, because
+@code{changeit()} stores @code{"two"} in the second element of @code{a}.
+@end quotation
+
+@node Function Caveats
+@subsubsection Other Points About Calling Functions
+
+@cindex undefined functions
+@cindex functions, undefined
+Some @command{awk} implementations allow you to call a function that
+has not been defined. They only report a problem at runtime, when the
+program actually tries to call the function. For example:
+
+@example
+BEGIN @{
+    if (0)
+        foo()
+    else
+        bar()
+@}
+function bar() @{ @dots{} @}
+# note that `foo' is not defined
+@end example
+
+@noindent
+Because the @samp{if} statement will never be true, it is not really a
+problem that @code{foo()} has not been defined.  Usually, though, it is a
+problem if a program calls an undefined function.
+
+@cindex lint checking, undefined functions
+If @option{--lint} is specified
+(@pxref{Options}),
+@command{gawk} reports calls to undefined functions.
+
+@cindex portability, @code{next} statement in user-defined functions
+Some @command{awk} implementations generate a runtime
+error if you use either the @code{next} statement
+or the @code{nextfile} statement
+(@pxref{Next Statement}, and
+@ifdocbook
+@ref{Nextfile Statement})
+@end ifdocbook
+@ifnotdocbook
+@pxref{Nextfile Statement})
+@end ifnotdocbook
+inside a user-defined function.
+@command{gawk} does not have this limitation.
+
+You can call a function and pass it more parameters than it was declared
+with, like so:
+
+@example
+function foo(p1, p2)
+@{
+    @dots{}
+@}
+
+BEGIN @{
+    foo(1, 2, 3, 4)
+@}
+@end example
+
+Doing so is bad practice, however.  The called function cannot do
+anything with the additional values being passed to it, so @command{awk}
+evaluates the expressions but then just throws them away.
+
+More importantly, such a call is confusing for whoever will next read your
+program.@footnote{Said person might even be you, sometime in the future,
+at which point you will wonder, ``what was I thinking?!?''} Function
+parameters generally are input items that influence the computation
+performed by the function.  Calling a function with more parameters than
+it accepts gives the false impression that those values are important
+to the function, when in fact they are not.
+
+Because this is such a bad practice, @command{gawk} @emph{unconditionally}
+issues a warning whenever it executes such a function call.  (If you
+don't like the warning, fix your code!  It's incorrect, after all.)
+
+@node Return Statement
+@subsection The @code{return} Statement
+@cindex @code{return} statement@comma{} user-defined functions
+
+As seen in several earlier examples,
+the body of a user-defined function can contain a @code{return} statement.
+This statement returns control to the calling part of the @command{awk} program.  It
+can also be used to return a value for use in the rest of the @command{awk}
+program.  It looks like this:
+
+@display
+@code{return} [@var{expression}]
+@end display
+
+The @var{expression} part is optional.
+Due most likely to an oversight, POSIX does not define what the return
+value is if you omit the @var{expression}.  Technically speaking, this
+makes the returned value undefined, and therefore, unpredictable.
+In practice, though, all versions of @command{awk} simply return the
+null string, which acts like zero if used in a numeric context.
+
+A @code{return} statement without an @var{expression} is assumed at the end of
+every function definition.  So, if control reaches the end of the function
+body, then technically the function returns an unpredictable value.
+In practice, it returns the empty string.  @command{awk}
+does @emph{not} warn you if you use the return value of such a function.
+
+Sometimes, you want to write a function for what it does, not for
+what it returns.  Such a function corresponds to a @code{void} function
+in C, C++, or Java, or to a @code{procedure} in Ada.  Thus, it may be appropriate to not
+return any value; simply bear in mind that you should not be using the
+return value of such a function.
+
+The following is an example of a user-defined function that returns a value
+for the largest number among the elements of an array:
+
+@example
+function maxelt(vec,   i, ret)
+@{
+     for (i in vec) @{
+          if (ret == "" || vec[i] > ret)
+               ret = vec[i]
+     @}
+     return ret
+@}
+@end example
+
+@cindex programming conventions, function parameters
+@noindent
+You call @code{maxelt()} with one argument, which is an array name.  The local
+variables @code{i} and @code{ret} are not intended to be arguments;
+there is nothing to stop you from passing more than one argument
+to @code{maxelt()} but the results would be strange.  The extra space before
+@code{i} in the function parameter list indicates that @code{i} and
+@code{ret} are local variables.
+You should follow this convention when defining functions.
+
+The following program uses the @code{maxelt()} function.  It loads an
+array, calls @code{maxelt()}, and then reports the maximum number in that
+array:
+
+@example
+function maxelt(vec,   i, ret)
+@{
+     for (i in vec) @{
+          if (ret == "" || vec[i] > ret)
+               ret = vec[i]
+     @}
+     return ret
+@}
+
+@group
+# Load all fields of each record into nums.
+@{
+     for(i = 1; i <= NF; i++)
+          nums[NR, i] = $i
+@}
+@end group
+
+END @{
+     print maxelt(nums)
+@}
+@end example
+
+Given the following input:
+
+@example
+ 1 5 23 8 16
+44 3 5 2 8 26
+256 291 1396 2962 100
+-6 467 998 1101
+99385 11 0 225
+@end example
+
+@noindent
+the program reports (predictably) that 99,385 is the largest value
+in the array.
+
+@node Dynamic Typing
+@subsection Functions and Their Effects on Variable Typing
+
+@command{awk} is a very fluid language.
+It is possible that @command{awk} can't tell if an identifier
+represents a scalar variable or an array until runtime.
+Here is an annotated sample program:
+
+@example
+function foo(a)
+@{
+    a[1] = 1   # parameter is an array
+@}
+
+BEGIN @{
+    b = 1
+    foo(b)  # invalid: fatal type mismatch
+
+    foo(x)  # x uninitialized, becomes an array dynamically
+    x = 1   # now not allowed, runtime error
+@}
+@end example
+
+In this example, the first call to @code{foo()} generates
+a fatal error, so @command{awk} will not report the second
+error. If you comment out that call, though, then @command{awk}
+does report the second error.
+
+Usually, such things aren't a big issue, but it's worth
+being aware of them.
+
+@node Indirect Calls
+@section Indirect Function Calls
+
+@cindex indirect function calls
+@cindex function calls, indirect
+@cindex function pointers
+@cindex pointers to functions
+@cindex differences in @command{awk} and @command{gawk}, indirect function calls
+
+This section describes an advanced, @command{gawk}-specific extension.
+
+Often, you may wish to defer the choice of function to call until runtime.
+For example, you may have different kinds of records, each of which
+should be processed differently.
+
+Normally, you would have to use a series of @code{if}-@code{else}
+statements to decide which function to call.  By using @dfn{indirect}
+function calls, you can specify the name of the function to call as a
+string variable, and then call the function.  Let's look at an example.
+
+Suppose you have a file with your test scores for the classes you
+are taking, and
+you wish to get the sum and the average of
+your test scores.
+The first field is the class name. The following fields
+are the functions to call to process the data, up to a ``marker''
+field @samp{data:}.  Following the marker, to the end of the record,
+are the various numeric test scores.
+
+Here is the initial file:
+
+@example
+@c file eg/data/class_data1
+Biology_101 sum average data: 87.0 92.4 78.5 94.9
+Chemistry_305 sum average data: 75.2 98.3 94.7 88.2
+English_401 sum average data: 100.0 95.6 87.1 93.4
+@c endfile
+@end example
+
+To process the data, you might write initially:
+
+@example
+@{
+    class = $1
+    for (i = 2; $i != "data:"; i++) @{
+        if ($i == "sum")
+            sum()   # processes the whole record
+        else if ($i == "average")
+            average()
+        @dots{}           # and so on
+    @}
+@}
+@end example
+
+@noindent
+This style of programming works, but can be awkward.  With @dfn{indirect}
+function calls, you tell @command{gawk} to use the @emph{value} of a
+variable as the @emph{name} of the function to call.
+
+@cindex @code{@@}-notation for indirect function calls
+@cindex indirect function calls, @code{@@}-notation
+@cindex function calls, indirect, @code{@@}-notation for
+The syntax is similar to that of a regular function call: an identifier
+immediately followed by an opening parenthesis, any arguments, and then
+a closing parenthesis, with the addition of a leading @samp{@@}
+character:
+
+@example
+the_func = "sum"
+result = @@the_func()   # calls the sum() function
+@end example
+
+Here is a full program that processes the previously shown data,
+using indirect function calls:
+
+@example
+@c file eg/prog/indirectcall.awk
+# indirectcall.awk --- Demonstrate indirect function calls
+@c endfile
+@ignore
+@c file eg/prog/indirectcall.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# January 2009
+@c endfile
+@end ignore
+
+@c file eg/prog/indirectcall.awk
+# average --- return the average of the values in fields $first - $last
+
+function average(first, last,   sum, i)
+@{
+    sum = 0;
+    for (i = first; i <= last; i++)
+        sum += $i
+
+    return sum / (last - first + 1)
+@}
+
+# sum --- return the sum of the values in fields $first - $last
+
+function sum(first, last,   ret, i)
+@{
+    ret = 0;
+    for (i = first; i <= last; i++)
+        ret += $i
+
+    return ret
+@}
+@c endfile
+@end example
+
+These two functions expect to work on fields; thus, the parameters
+@code{first} and @code{last} indicate where in the fields to start and end.
+Otherwise, they perform the expected computations and are not unusual:
+
+@example
+@c file eg/prog/indirectcall.awk
+# For each record, print the class name and the requested statistics
+@{
+    class_name = $1
+    gsub(/_/, " ", class_name)  # Replace _ with spaces
+
+    # find start
+    for (i = 1; i <= NF; i++) @{
+        if ($i == "data:") @{
+            start = i + 1
+            break
+        @}
+    @}
+
+    printf("%s:\n", class_name)
+    for (i = 2; $i != "data:"; i++) @{
+        the_function = $i
+        printf("\t%s: <%s>\n", $i, @@the_function(start, NF) "")
+    @}
+    print ""
+@}
+@c endfile
+@end example
+
+This is the main processing for each record. It prints the class name (with
+underscores replaced with spaces). It then finds the start of the actual data,
+saving it in @code{start}.
+The last part of the code loops through each function name (from @code{$2} up to
+the marker, @samp{data:}), calling the function named by the field. The indirect
+function call itself occurs as a parameter in the call to @code{printf}.
+(The @code{printf} format string uses @samp{%s} as the format specifier so that we
+can use functions that return strings, as well as numbers. Note that the result
+from the indirect call is concatenated with the empty string, in order to force
+it to be a string value.)
+
+Here is the result of running the program:
+
+@example
+$ @kbd{gawk -f indirectcall.awk class_data1}
+@print{} Biology 101:
+@print{}     sum: <352.8>
+@print{}     average: <88.2>
+@print{}
+@print{} Chemistry 305:
+@print{}     sum: <356.4>
+@print{}     average: <89.1>
+@print{}
+@print{} English 401:
+@print{}     sum: <376.1>
+@print{}     average: <94.025>
+@end example
+
+The ability to use indirect function calls is more powerful than you may
+think at first.  The C and C++ languages provide ``function pointers,'' which
+are a mechanism for calling a function chosen at runtime.  One of the most
+well-known uses of this ability is the C @code{qsort()} function, which sorts
+an array using the famous ``quicksort'' algorithm
+(see @uref{https://en.wikipedia.org/wiki/Quicksort, the Wikipedia article}
+for more information).  To use this function, you supply a pointer to a comparison
+function.  This mechanism allows you to sort arbitrary data in an arbitrary
+fashion.
+
+We can do something similar using @command{gawk}, like this:
+
+@example
+@c file eg/lib/quicksort.awk
+# quicksort.awk --- Quicksort algorithm, with user-supplied
+#                   comparison function
+@c endfile
+@ignore
+@c file eg/lib/quicksort.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# January 2009
+
+@c endfile
+@end ignore
+@c file eg/lib/quicksort.awk
+
+# quicksort --- C.A.R. Hoare's quicksort algorithm. See Wikipedia
+#               or almost any algorithms or computer science text.
+@c endfile
+@ignore
+@c file eg/lib/quicksort.awk
+#
+# Adapted from K&R-II, page 110
+@c endfile
+@end ignore
+@c file eg/lib/quicksort.awk
+
+function quicksort(data, left, right, less_than,    i, last)
+@{
+    if (left >= right)  # do nothing if array contains fewer
+        return          # than two elements
+
+    quicksort_swap(data, left, int((left + right) / 2))
+    last = left
+    for (i = left + 1; i <= right; i++)
+        if (@@less_than(data[i], data[left]))
+            quicksort_swap(data, ++last, i)
+    quicksort_swap(data, left, last)
+    quicksort(data, left, last - 1, less_than)
+    quicksort(data, last + 1, right, less_than)
+@}
+
+# quicksort_swap --- helper function for quicksort, should really be inline
+
+function quicksort_swap(data, i, j,      temp)
+@{
+    temp = data[i]
+    data[i] = data[j]
+    data[j] = temp
+@}
+@c endfile
+@end example
+
+The @code{quicksort()} function receives the @code{data} array, the starting and ending
+indices to sort (@code{left} and @code{right}), and the name of a function that
+performs a ``less than'' comparison.  It then implements the quicksort algorithm.
+
+To make use of the sorting function, we return to our previous example. The
+first thing to do is write some comparison functions:
+
+@example
+@c file eg/prog/indirectcall.awk
+@group
+# num_lt --- do a numeric less than comparison
+
+function num_lt(left, right)
+@{
+    return ((left + 0) < (right + 0))
+@}
+@end group
+
+# num_ge --- do a numeric greater than or equal to comparison
+
+function num_ge(left, right)
+@{
+    return ((left + 0) >= (right + 0))
+@}
+@c endfile
+@end example
+
+The @code{num_ge()} function is needed to perform a descending sort; when used
+to perform a ``less than'' test, it actually does the opposite (greater than
+or equal to), which yields data sorted in descending order.
+
+Next comes a sorting function.  It is parameterized with the starting and
+ending field numbers and the comparison function. It builds an array with
+the data and calls @code{quicksort()} appropriately, and then formats the
+results as a single string:
+
+@example
+@c file eg/prog/indirectcall.awk
+# do_sort --- sort the data according to `compare'
+#             and return it as a string
+
+function do_sort(first, last, compare,      data, i, retval)
+@{
+    delete data
+    for (i = 1; first <= last; first++) @{
+        data[i] = $first
+        i++
+    @}
+
+    quicksort(data, 1, i-1, compare)
+
+    retval = data[1]
+    for (i = 2; i in data; i++)
+        retval = retval " " data[i]
+
+    return retval
+@}
+@c endfile
+@end example
+
+Finally, the two sorting functions call @code{do_sort()}, passing in the
+names of the two comparison functions:
+
+@example
+@c file eg/prog/indirectcall.awk
+@group
+# sort --- sort the data in ascending order and return it as a string
+
+function sort(first, last)
+@{
+    return do_sort(first, last, "num_lt")
+@}
+@end group
+
+@group
+# rsort --- sort the data in descending order and return it as a string
+
+function rsort(first, last)
+@{
+    return do_sort(first, last, "num_ge")
+@}
+@end group
+@c endfile
+@end example
+
+Here is an extended version of the @value{DF}:
+
+@example
+@c file eg/data/class_data2
+Biology_101 sum average sort rsort data: 87.0 92.4 78.5 94.9
+Chemistry_305 sum average sort rsort data: 75.2 98.3 94.7 88.2
+English_401 sum average sort rsort data: 100.0 95.6 87.1 93.4
+@c endfile
+@end example
+
+Finally, here are the results when the enhanced program is run:
+
+@example
+$ @kbd{gawk -f quicksort.awk -f indirectcall.awk class_data2}
+@print{} Biology 101:
+@print{}     sum: <352.8>
+@print{}     average: <88.2>
+@print{}     sort: <78.5 87.0 92.4 94.9>
+@print{}     rsort: <94.9 92.4 87.0 78.5>
+@print{}
+@print{} Chemistry 305:
+@print{}     sum: <356.4>
+@print{}     average: <89.1>
+@print{}     sort: <75.2 88.2 94.7 98.3>
+@print{}     rsort: <98.3 94.7 88.2 75.2>
+@print{}
+@print{} English 401:
+@print{}     sum: <376.1>
+@print{}     average: <94.025>
+@print{}     sort: <87.1 93.4 95.6 100.0>
+@print{}     rsort: <100.0 95.6 93.4 87.1>
+@end example
+
+Another example where indirect functions calls are useful can be found in
+processing arrays. This is described in @ref{Walking Arrays}.
+
+Remember that you must supply a leading @samp{@@} in front of an indirect function call.
+
+Starting with @value{PVERSION} 4.1.2 of @command{gawk}, indirect function
+calls may also be used with built-in functions and with extension functions
+(@pxref{Dynamic Extensions}). There are some limitations when calling
+built-in functions indirectly, as follows.
+
+@itemize @value{BULLET}
+@item
+You cannot pass a regular expression constant to a built-in function
+through an indirect function call.@footnote{This may change in a future
+version; recheck the documentation that comes with your version of
+@command{gawk} to see if it has.} This applies to the @code{sub()},
+@code{gsub()}, @code{gensub()}, @code{match()}, @code{split()} and
+@code{patsplit()} functions.
+
+@item
+If calling @code{sub()} or @code{gsub()}, you may only pass two arguments,
+since those functions are unusual in that they update their third argument.
+This means that @code{$0} will be updated.
+@end itemize
+
+@command{gawk} does its best to make indirect function calls efficient.
+For example, in the following case:
+
+@example
+for (i = 1; i <= n; i++)
+    @@the_func()
+@end example
+
+@noindent
+@command{gawk} looks up the actual function to call only once.
+
+@node Functions Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+@command{awk} provides built-in functions and lets you define your own
+functions.
+
+@item
+POSIX @command{awk} provides three kinds of built-in functions: numeric,
+string, and I/O.  @command{gawk} provides functions that sort arrays, work
+with values representing time, do bit manipulation, determine variable
+type (array versus scalar), and internationalize and localize programs.
+@command{gawk} also provides several extensions to some of standard
+functions, typically in the form of additional arguments.
+
+@item
+Functions accept zero or more arguments and return a value.  The
+expressions that provide the argument values are completely evaluated
+before the function is called. Order of evaluation is not defined.
+The return value can be ignored.
+
+@item
+The handling of backslash in @code{sub()} and @code{gsub()} is not simple.
+It is more straightforward in @command{gawk}'s @code{gensub()} function,
+but that function still requires care in its use.
+
+@item
+User-defined functions provide important capabilities but come with
+some syntactic inelegancies. In a function call, there cannot be any
+space between the function name and the opening left parenthesis of the
+argument list.  Also, there is no provision for local variables, so the
+convention is to add extra parameters, and to separate them visually
+from the real parameters by extra whitespace.
+
+@item
+User-defined functions may call other user-defined (and built-in)
+functions and may call themselves recursively. Function parameters
+``hide'' any global variables of the same names.
+You cannot use the name of a reserved variable (such as @code{ARGC})
+as the name of a parameter in user-defined functions.
+
+@item
+Scalar values are passed to user-defined functions by value. Array
+parameters are passed by reference; any changes made by the function to
+array parameters are thus visible after the function has returned.
+
+@item
+Use the @code{return} statement to return from a user-defined function.
+An optional expression becomes the function's return value.  Only scalar
+values may be returned by a function.
+
+@item
+If a variable that has never been used is passed to a user-defined
+function, how that function treats the variable can set its nature:
+either scalar or array.
+
+@item
+@command{gawk} provides indirect function calls using a special syntax.
+By setting a variable to the name of a function, you can
+determine at runtime what function will be called at that point in the
+program. This is equivalent to function pointers in C and C++.
+
+@end itemize
+
+
+@ifnotinfo
+@part @value{PART2}Problem Solving with @command{awk}
+@end ifnotinfo
+
+@ifdocbook
+Part II shows how to use @command{awk} and @command{gawk} for problem solving.
+There is lots of code here for you to read and learn from.
+It contains the following chapters:
+
+@itemize @value{BULLET}
+@item
+@ref{Library Functions}
+
+@item
+@ref{Sample Programs}
+@end itemize
+@end ifdocbook
+
+@node Library Functions
+@chapter A Library of @command{awk} Functions
+@cindex libraries of @command{awk} functions
+@cindex functions, library
+@cindex functions, user-defined, library of
+
+@ref{User-defined} describes how to write
+your own @command{awk} functions.  Writing functions is important, because
+it allows you to encapsulate algorithms and program tasks in a single
+place.  It simplifies programming, making program development more
+manageable and making programs more readable.
+
+@cindex Kernighan, Brian
+@cindex Plauger, P.J.@:
+In their seminal 1976 book, @cite{Software Tools},@footnote{Sadly, over 35
+years later, many of the lessons taught by this book have yet to be
+learned by a vast number of practicing programmers.} Brian Kernighan
+and P.J.@: Plauger wrote:
+
+@quotation
+Good Programming is not learned from generalities, but by seeing how
+significant programs can be made clean, easy to read, easy to maintain and
+modify, human-engineered, efficient and reliable, by the application of
+common sense and good programming practices.  Careful study and imitation
+of good programs leads to better writing.
+@end quotation
+
+In fact, they felt this idea was so important that they placed this
+statement on the cover of their book.  Because we believe strongly
+that their statement is correct, this @value{CHAPTER} and @ref{Sample
+Programs}, provide a good-sized body of code for you to read and, we hope,
+to learn from.
+
+This @value{CHAPTER} presents a library of useful @command{awk} functions.
+Many of the sample programs presented later in this @value{DOCUMENT}
+use these functions.
+The functions are presented here in a progression from simple to complex.
+
+@cindex Texinfo
+@ref{Extract Program}
+presents a program that you can use to extract the source code for
+these example library functions and programs from the Texinfo source
+for this @value{DOCUMENT}.
+(This has already been done as part of the @command{gawk} distribution.)
+
+@ifclear FOR_PRINT
+If you have written one or more useful, general-purpose @command{awk} functions
+and would like to contribute them to the @command{awk} user community, see
+@ref{How To Contribute}, for more information.
+@end ifclear
+
+@cindex portability, example programs
+The programs in this @value{CHAPTER} and in
+@ref{Sample Programs},
+freely use @command{gawk}-specific features.
+Rewriting these programs for different implementations of @command{awk}
+is pretty straightforward:
+
+@itemize @value{BULLET}
+@item
+Diagnostic error messages are sent to @file{/dev/stderr}.
+Use @samp{| "cat 1>&2"} instead of @samp{> "/dev/stderr"} if your system
+does not have a @file{/dev/stderr}, or if you cannot use @command{gawk}.
+
+@item
+A number of programs use @code{nextfile}
+(@pxref{Nextfile Statement})
+to skip any remaining input in the input file.
+
+@item
+@c 12/2000: Thanks to Nelson Beebe for pointing out the output issue.
+@cindex case sensitivity, example programs
+@cindex @code{IGNORECASE} variable, in example programs
+Finally, some of the programs choose to ignore upper- and lowercase
+distinctions in their input. They do so by assigning one to @code{IGNORECASE}.
+You can achieve almost the same effect@footnote{The effects are
+not identical.  Output of the transformed
+record will be in all lowercase, while @code{IGNORECASE} preserves the original
+contents of the input record.} by adding the following rule to the
+beginning of the program:
+
+@example
+# ignore case
+@{ $0 = tolower($0) @}
+@end example
+
+@noindent
+Also, verify that all regexp and string constants used in
+comparisons use only lowercase letters.
+@end itemize
+
+@menu
+* Library Names::               How to best name private global variables in
+                                library functions.
+* General Functions::           Functions that are of general use.
+* Data File Management::        Functions for managing command-line data
+                                files.
+* Getopt Function::             A function for processing command-line
+                                arguments.
+* Passwd Functions::            Functions for getting user information.
+* Group Functions::             Functions for getting group information.
+* Walking Arrays::              A function to walk arrays of arrays.
+* Library Functions Summary::   Summary of library functions.
+* Library Exercises::           Exercises.
+@end menu
+
+@node Library Names
+@section Naming Library Function Global Variables
+
+@cindex names, arrays/variables
+@cindex names, functions
+@cindex namespace issues
+@cindex @command{awk} programs, documenting
+@cindex documentation, of @command{awk} programs
+Due to the way the @command{awk} language evolved, variables are either
+@dfn{global} (usable by the entire program) or @dfn{local} (usable just by
+a specific function).  There is no intermediate state analogous to
+@code{static} variables in C.
+
+@cindex variables, global, for library functions
+@cindex private variables
+@cindex variables, private
+Library functions often need to have global variables that they can use to
+preserve state information between calls to the function---for example,
+@code{getopt()}'s variable @code{_opti}
+(@pxref{Getopt Function}).
+Such variables are called @dfn{private}, as the only functions that need to
+use them are the ones in the library.
+
+When writing a library function, you should try to choose names for your
+private variables that will not conflict with any variables used by
+either another library function or a user's main program.  For example, a
+name like @code{i} or @code{j} is not a good choice, because user programs
+often use variable names like these for their own purposes.
+
+@cindex programming conventions, private variable names
+The example programs shown in this @value{CHAPTER} all start the names of their
+private variables with an underscore (@samp{_}).  Users generally don't use
+leading underscores in their variable names, so this convention immediately
+decreases the chances that the variable names will be accidentally shared
+with the user's program.
+
+@cindex @code{_} (underscore), in names of private variables
+@cindex underscore (@code{_}), in names of private variables
+In addition, several of the library functions use a prefix that helps
+indicate what function or set of functions use the variables---for example,
+@code{_pw_byname()} in the user database routines
+(@pxref{Passwd Functions}).
+This convention is recommended, as it even further decreases the
+chance of inadvertent conflict among variable names.  Note that this
+convention is used equally well for variable names and for private
+function names.@footnote{Although all the library routines could have
+been rewritten to use this convention, this was not done, in order to
+show how our own @command{awk} programming style has evolved and to
+provide some basis for this discussion.}
+
+As a final note on variable naming, if a function makes global variables
+available for use by a main program, it is a good convention to start those
+variables' names with a capital letter---for
+example, @code{getopt()}'s @code{Opterr} and @code{Optind} variables
+(@pxref{Getopt Function}).
+The leading capital letter indicates that it is global, while the fact that
+the variable name is not all capital letters indicates that the variable is
+not one of @command{awk}'s predefined variables, such as @code{FS}.
+
+@cindex @option{--dump-variables} option, using for library functions
+It is also important that @emph{all} variables in library
+functions that do not need to save state are, in fact, declared
+local.@footnote{@command{gawk}'s @option{--dump-variables} command-line
+option is useful for verifying this.} If this is not done, the variables
+could accidentally be used in the user's program, leading to bugs that
+are very difficult to track down:
+
+@example
+function lib_func(x, y,    l1, l2)
+@{
+    @dots{}
+    # some_var should be local but by oversight is not
+    @var{use variable} some_var
+    @dots{}
+@}
+@end example
+
+@cindex arrays, associative, library functions and
+@cindex libraries of @command{awk} functions, associative arrays and
+@cindex functions, library, associative arrays and
+@cindex Tcl
+A different convention, common in the Tcl community, is to use a single
+associative array to hold the values needed by the library function(s), or
+``package.''  This significantly decreases the number of actual global names
+in use.  For example, the functions described in
+@ref{Passwd Functions}
+might have used array elements @code{@w{PW_data["inited"]}}, @code{@w{PW_data["total"]}},
+@code{@w{PW_data["count"]}}, and @code{@w{PW_data["awklib"]}}, instead of
+@code{@w{_pw_inited}}, @code{@w{_pw_awklib}}, @code{@w{_pw_total}},
+and @code{@w{_pw_count}}.
+
+The conventions presented in this @value{SECTION} are exactly
+that: conventions. You are not required to write your programs this
+way---we merely recommend that you do so.
+
+Beginning with @value{PVERSION} 5.0, @command{gawk} provides
+a powerful mechanism for solving the problems described in this
+section: @dfn{namespaces}.  Namespaces and their use are described
+in detail in @ref{Namespaces}.
+
+@node General Functions
+@section General Programming
+
+This @value{SECTION} presents a number of functions that are of general
+programming use.
+
+@menu
+* Strtonum Function::           A replacement for the built-in
+                                @code{strtonum()} function.
+* Assert Function::             A function for assertions in @command{awk}
+                                programs.
+* Round Function::              A function for rounding if @code{sprintf()}
+                                does not do it correctly.
+* Cliff Random Function::       The Cliff Random Number Generator.
+* Ordinal Functions::           Functions for using characters as numbers and
+                                vice versa.
+* Join Function::               A function to join an array into a string.
+* Getlocaltime Function::       A function to get formatted times.
+* Readfile Function::           A function to read an entire file at once.
+* Shell Quoting::               A function to quote strings for the shell.
+@end menu
+
+@node Strtonum Function
+@subsection Converting Strings to Numbers
+
+The @code{strtonum()} function (@pxref{String Functions})
+is a @command{gawk} extension.  The following function
+provides an implementation for other versions of @command{awk}:
+
+@example
+@c file eg/lib/strtonum.awk
+# mystrtonum --- convert string to number
+
+@c endfile
+@ignore
+@c file eg/lib/strtonum.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# February, 2004
+# Revised June, 2014
+
+@c endfile
+@end ignore
+@c file eg/lib/strtonum.awk
+function mystrtonum(str,        ret, n, i, k, c)
+@{
+    if (str ~ /^0[0-7]*$/) @{
+        # octal
+        n = length(str)
+        ret = 0
+        for (i = 1; i <= n; i++) @{
+            c = substr(str, i, 1)
+            # index() returns 0 if c not in string,
+            # includes c == "0"
+            k = index("1234567", c)
+
+            ret = ret * 8 + k
+        @}
+    @} else if (str ~ /^0[xX][[:xdigit:]]+$/) @{
+        # hexadecimal
+        str = substr(str, 3)    # lop off leading 0x
+        n = length(str)
+        ret = 0
+        for (i = 1; i <= n; i++) @{
+            c = substr(str, i, 1)
+            c = tolower(c)
+            # index() returns 0 if c not in string,
+            # includes c == "0"
+            k = index("123456789abcdef", c)
+
+            ret = ret * 16 + k
+        @}
+    @} else if (str ~ \
+  /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) @{
+        # decimal number, possibly floating point
+        ret = str + 0
+    @} else
+        ret = "NOT-A-NUMBER"
+
+    return ret
+@}
+
+# BEGIN @{     # gawk test harness
+#     a[1] = "25"
+#     a[2] = ".31"
+#     a[3] = "0123"
+#     a[4] = "0xdeadBEEF"
+#     a[5] = "123.45"
+#     a[6] = "1.e3"
+#     a[7] = "1.32"
+#     a[8] = "1.32E2"
+#
+#     for (i = 1; i in a; i++)
+#         print a[i], strtonum(a[i]), mystrtonum(a[i])
+# @}
+@c endfile
+@end example
+
+The function first looks for C-style octal numbers (base 8).
+If the input string matches a regular expression describing octal
+numbers, then @code{mystrtonum()} loops through each character in the
+string.  It sets @code{k} to the index in @code{"1234567"} of the current
+octal digit.
+The return value will either be the same number as the digit, or zero
+if the character is not there, which will be true for a @samp{0}.
+This is safe, because the regexp test in the @code{if} ensures that
+only octal values are converted.
+
+Similar logic applies to the code that checks for and converts a
+hexadecimal value, which starts with @samp{0x} or @samp{0X}.
+The use of @code{tolower()} simplifies the computation for finding
+the correct numeric value for each hexadecimal digit.
+
+Finally, if the string matches the (rather complicated) regexp for a
+regular decimal integer or floating-point number, the computation
+@samp{ret = str + 0} lets @command{awk} convert the value to a
+number.
+
+A commented-out test program is included, so that the function can
+be tested with @command{gawk} and the results compared to the built-in
+@code{strtonum()} function.
+
+@node Assert Function
+@subsection Assertions
+
+@cindex assertions
+@cindex @code{assert()} function (C library)
+@cindex libraries of @command{awk} functions, assertions
+@cindex functions, library, assertions
+@cindex @command{awk} programs, lengthy, assertions
+When writing large programs, it is often useful to know
+that a condition or set of conditions is true.  Before proceeding with a
+particular computation, you make a statement about what you believe to be
+the case.  Such a statement is known as an
+@dfn{assertion}.  The C language provides an @code{<assert.h>} header file
+and corresponding @code{assert()} macro that a programmer can use to make
+assertions.  If an assertion fails, the @code{assert()} macro arranges to
+print a diagnostic message describing the condition that should have
+been true but was not, and then it kills the program.  In C, using
+@code{assert()} looks this:
+
+@example
+@group
+#include <assert.h>
+
+int myfunc(int a, double b)
+@{
+     assert(a <= 5 && b >= 17.1);
+     @dots{}
+@}
+@end group
+@end example
+
+If the assertion fails, the program prints a message similar to this:
+
+@example
+prog.c:5: assertion failed: a <= 5 && b >= 17.1
+@end example
+
+@cindex @code{assert()} user-defined function
+The C language makes it possible to turn the condition into a string for use
+in printing the diagnostic message.  This is not possible in @command{awk}, so
+this @code{assert()} function also requires a string version of the condition
+that is being tested.
+Following is the function:
+
+@example
+@c file eg/lib/assert.awk
+# assert --- assert that a condition is true. Otherwise, exit.
+
+@c endfile
+@ignore
+@c file eg/lib/assert.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May, 1993
+
+@c endfile
+@end ignore
+@c file eg/lib/assert.awk
+function assert(condition, string)
+@{
+    if (! condition) @{
+        printf("%s:%d: assertion failed: %s\n",
+            FILENAME, FNR, string) > "/dev/stderr"
+        _assert_exit = 1
+        exit 1
+    @}
+@}
+
+@group
+END @{
+    if (_assert_exit)
+        exit 1
+@}
+@end group
+@c endfile
+@end example
+
+The @code{assert()} function tests the @code{condition} parameter. If it
+is false, it prints a message to standard error, using the @code{string}
+parameter to describe the failed condition.  It then sets the variable
+@code{_assert_exit} to one and executes the @code{exit} statement.
+The @code{exit} statement jumps to the @code{END} rule. If the @code{END}
+rule finds @code{_assert_exit} to be true, it exits immediately.
+
+The purpose of the test in the @code{END} rule is to
+keep any other @code{END} rules from running.  When an assertion fails, the
+program should exit immediately.
+If no assertions fail, then @code{_assert_exit} is still
+false when the @code{END} rule is run normally, and the rest of the
+program's @code{END} rules execute.
+For all of this to work correctly, @file{assert.awk} must be the
+first source file read by @command{awk}.
+The function can be used in a program in the following way:
+
+@example
+function myfunc(a, b)
+@{
+     assert(a <= 5 && b >= 17.1, "a <= 5 && b >= 17.1")
+     @dots{}
+@}
+@end example
+
+@noindent
+If the assertion fails, you see a message similar to the following:
+
+@example
+mydata:1357: assertion failed: a <= 5 && b >= 17.1
+@end example
+
+@cindex @code{END} pattern, @code{assert()} user-defined function and
+There is a small problem with this version of @code{assert()}.
+An @code{END} rule is automatically added
+to the program calling @code{assert()}.  Normally, if a program consists
+of just a @code{BEGIN} rule, the input files and/or standard input are
+not read. However, now that the program has an @code{END} rule, @command{awk}
+attempts to read the input @value{DF}s or standard input
+(@pxref{Using BEGIN/END}),
+most likely causing the program to hang as it waits for input.
+
+@cindex @code{BEGIN} pattern, @code{assert()} user-defined function and
+There is a simple workaround to this:
+make sure that such a @code{BEGIN} rule always ends
+with an @code{exit} statement.
+
+@node Round Function
+@subsection Rounding Numbers
+
+@cindex rounding numbers
+@cindex numbers, rounding
+@cindex libraries of @command{awk} functions, rounding numbers
+@cindex functions, library, rounding numbers
+@cindex @code{print} statement, @code{sprintf()} function and
+@cindex @code{printf} statement, @code{sprintf()} function and
+@cindex @code{sprintf()} function, @code{print}/@code{printf} statements and
+The way @code{printf} and @code{sprintf()}
+(@pxref{Printf})
+perform rounding often depends upon the system's C @code{sprintf()}
+subroutine.  On many machines, @code{sprintf()} rounding is @dfn{unbiased},
+which means it doesn't always round a trailing .5 up, contrary
+to naive expectations.  In unbiased rounding, .5 rounds to even,
+rather than always up, so 1.5 rounds to 2 but 4.5 rounds to 4.  This means
+that if you are using a format that does rounding (e.g., @code{"%.0f"}),
+you should check what your system does.  The following function does
+traditional rounding; it might be useful if your @command{awk}'s @code{printf}
+does unbiased rounding:
+
+@cindex @code{round()} user-defined function
+@example
+@c file eg/lib/round.awk
+# round.awk --- do normal rounding
+@c endfile
+@ignore
+@c file eg/lib/round.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# August, 1996
+@c endfile
+@end ignore
+@c file eg/lib/round.awk
+
+function round(x,   ival, aval, fraction)
+@{
+   ival = int(x)    # integer part, int() truncates
+
+   # see if fractional part
+   if (ival == x)   # no fraction
+      return ival   # ensure no decimals
+
+   if (x < 0) @{
+      aval = -x     # absolute value
+      ival = int(aval)
+      fraction = aval - ival
+      if (fraction >= .5)
+         return int(x) - 1   # -2.5 --> -3
+      else
+         return int(x)       # -2.3 --> -2
+   @} else @{
+      fraction = x - ival
+      if (fraction >= .5)
+         return ival + 1
+      else
+         return ival
+   @}
+@}
+@c endfile
+@c don't include test harness in the file that gets installed
+@group
+# test harness
+# @{ print $0, round($0) @}
+@end group
+@end example
+
+@node Cliff Random Function
+@subsection The Cliff Random Number Generator
+@cindex random numbers, Cliff
+@cindex Cliff random numbers
+@cindex numbers, Cliff random
+@cindex functions, library, Cliff random numbers
+
+The
+@uref{http://mathworld.wolfram.com/CliffRandomNumberGenerator.html, Cliff random number generator}
+is a very simple random number generator that ``passes the noise sphere test
+for randomness by showing no structure.''
+It is easily programmed, in less than 10 lines of @command{awk} code:
+
+@cindex @code{cliff_rand()} user-defined function
+@example
+@c file eg/lib/cliff_rand.awk
+# cliff_rand.awk --- generate Cliff random numbers
+@c endfile
+@ignore
+@c file eg/lib/cliff_rand.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# December 2000
+@c endfile
+@end ignore
+@c file eg/lib/cliff_rand.awk
+
+BEGIN @{ _cliff_seed = 0.1 @}
+
+function cliff_rand()
+@{
+    _cliff_seed = (100 * log(_cliff_seed)) % 1
+    if (_cliff_seed < 0)
+        _cliff_seed = - _cliff_seed
+    return _cliff_seed
+@}
+@c endfile
+@end example
+
+This algorithm requires an initial ``seed'' of 0.1.  Each new value
+uses the current seed as input for the calculation.
+If the built-in @code{rand()} function
+(@pxref{Numeric Functions})
+isn't random enough, you might try using this function instead.
+
+@node Ordinal Functions
+@subsection Translating Between Characters and Numbers
+
+@cindex libraries of @command{awk} functions, character values as numbers
+@cindex functions, library, character values as numbers
+@cindex characters, values of as numbers
+@cindex numbers, as values of characters
+One commercial implementation of @command{awk} supplies a built-in function,
+@code{ord()}, which takes a character and returns the numeric value for that
+character in the machine's character set.  If the string passed to
+@code{ord()} has more than one character, only the first one is used.
+
+The inverse of this function is @code{chr()} (from the function of the same
+name in Pascal), which takes a number and returns the corresponding character.
+Both functions are written very nicely in @command{awk}; there is no real
+reason to build them into the @command{awk} interpreter:
+
+@cindex @code{ord()} user-defined function
+@cindex @code{chr()} user-defined function
+@cindex @code{_ord_init()} user-defined function
+@example
+@c file eg/lib/ord.awk
+# ord.awk --- do ord and chr
+
+# Global identifiers:
+#    _ord_:        numerical values indexed by characters
+#    _ord_init:    function to initialize _ord_
+@c endfile
+@ignore
+@c file eg/lib/ord.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# 16 January, 1992
+# 20 July, 1992, revised
+@c endfile
+@end ignore
+@c file eg/lib/ord.awk
+
+BEGIN    @{ _ord_init() @}
+
+function _ord_init(    low, high, i, t)
+@{
+    low = sprintf("%c", 7) # BEL is ascii 7
+    if (low == "\a") @{    # regular ascii
+        low = 0
+        high = 127
+    @} else if (sprintf("%c", 128 + 7) == "\a") @{
+        # ascii, mark parity
+        low = 128
+        high = 255
+    @} else @{        # ebcdic(!)
+        low = 0
+        high = 255
+    @}
+
+    for (i = low; i <= high; i++) @{
+        t = sprintf("%c", i)
+        _ord_[t] = i
+    @}
+@}
+@c endfile
+@end example
+
+@cindex character sets (machine character encodings)
+@cindex ASCII
+@cindex EBCDIC
+@cindex Unicode
+@cindex mark parity
+Some explanation of the numbers used by @code{_ord_init()} is worthwhile.
+The most prominent character set in use today is ASCII.@footnote{This
+is changing; many systems use Unicode, a very large character set
+that includes ASCII as a subset.  On systems with full Unicode support,
+a character can occupy up to 32 bits, making simple tests such as
+used here prohibitively expensive.}
+Although an
+8-bit byte can hold 256 distinct values (from 0 to 255), ASCII only
+defines characters that use the values from 0 to 127.@footnote{ASCII
+has been extended in many countries to use the values from 128 to 255
+for country-specific characters.  If your  system uses these extensions,
+you can simplify @code{_ord_init()} to loop from 0 to 255.}
+In the now distant past,
+at least one minicomputer manufacturer
+@c Pr1me, blech
+used ASCII, but with mark parity, meaning that the leftmost bit in the byte
+is always 1.  This means that on those systems, characters
+have numeric values from 128 to 255.
+Finally, large mainframe systems use the EBCDIC character set, which
+uses all 256 values.
+There are other character sets in use on some older systems, but
+they are not really worth worrying about:
+
+@example
+@c file eg/lib/ord.awk
+function ord(str,    c)
+@{
+    # only first character is of interest
+    c = substr(str, 1, 1)
+    return _ord_[c]
+@}
+
+function chr(c)
+@{
+    # force c to be numeric by adding 0
+    return sprintf("%c", c + 0)
+@}
+@c endfile
+
+#### test code ####
+# BEGIN @{
+#    for (;;) @{
+#        printf("enter a character: ")
+#        if (getline var <= 0)
+#            break
+#        printf("ord(%s) = %d\n", var, ord(var))
+#    @}
+# @}
+@c endfile
+@end example
+
+An obvious improvement to these functions is to move the code for the
+@code{@w{_ord_init}} function into the body of the @code{BEGIN} rule.  It was
+written this way initially for ease of development.
+There is a ``test program'' in a @code{BEGIN} rule, to test the
+function.  It is commented out for production use.
+
+@node Join Function
+@subsection Merging an Array into a String
+
+@cindex libraries of @command{awk} functions, merging arrays into strings
+@cindex functions, library, merging arrays into strings
+@cindex strings, merging arrays into
+@cindex arrays, merging into strings
+When doing string processing, it is often useful to be able to join
+all the strings in an array into one long string.  The following function,
+@code{join()}, accomplishes this task.  It is used later in several of
+the application programs
+(@pxref{Sample Programs}).
+
+Good function design is important; this function needs to be general, but it
+should also have a reasonable default behavior.  It is called with an array
+as well as the beginning and ending indices of the elements in the array to be
+merged.  This assumes that the array indices are numeric---a reasonable
+assumption, as the array was likely created with @code{split()}
+(@pxref{String Functions}):
+
+@cindex @code{join()} user-defined function
+@example
+@c file eg/lib/join.awk
+# join.awk --- join an array into a string
+@c endfile
+@ignore
+@c file eg/lib/join.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/lib/join.awk
+
+function join(array, start, end, sep,    result, i)
+@{
+    if (sep == "")
+       sep = " "
+    else if (sep == SUBSEP) # magic value
+       sep = ""
+    result = array[start]
+    for (i = start + 1; i <= end; i++)
+        result = result sep array[i]
+    return result
+@}
+@c endfile
+@end example
+
+An optional additional argument is the separator to use when joining the
+strings back together.  If the caller supplies a nonempty value,
+@code{join()} uses it; if it is not supplied, it has a null
+value.  In this case, @code{join()} uses a single space as a default
+separator for the strings.  If the value is equal to @code{SUBSEP},
+then @code{join()} joins the strings with no separator between them.
+@code{SUBSEP} serves as a ``magic'' value to indicate that there should
+be no separation between the component strings.@footnote{It would
+be nice if @command{awk} had an assignment operator for concatenation.
+The lack of an explicit operator for concatenation makes string operations
+more difficult than they really need to be.}
+
+@node Getlocaltime Function
+@subsection Managing the Time of Day
+
+@cindex libraries of @command{awk} functions, managing, time
+@cindex functions, library, managing time
+@cindex timestamps, formatted
+@cindex time, managing
+The @code{systime()} and @code{strftime()} functions described in
+@ref{Time Functions}
+provide the minimum functionality necessary for dealing with the time of day
+in human-readable form.  Although @code{strftime()} is extensive, the control
+formats are not necessarily easy to remember or intuitively obvious when
+reading a program.
+
+The following function, @code{getlocaltime()}, populates a user-supplied array
+with preformatted time information.  It returns a string with the current
+time formatted in the same way as the @command{date} utility:
+
+@cindex @code{getlocaltime()} user-defined function
+@example
+@c file eg/lib/gettime.awk
+# getlocaltime.awk --- get the time of day in a usable format
+@c endfile
+@ignore
+@c file eg/lib/gettime.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain, May 1993
+#
+@c endfile
+@end ignore
+@c file eg/lib/gettime.awk
+
+# Returns a string in the format of output of date(1)
+# Populates the array argument time with individual values:
+#    time["second"]       -- seconds (0 - 59)
+#    time["minute"]       -- minutes (0 - 59)
+#    time["hour"]         -- hours (0 - 23)
+#    time["althour"]      -- hours (0 - 12)
+#    time["monthday"]     -- day of month (1 - 31)
+#    time["month"]        -- month of year (1 - 12)
+#    time["monthname"]    -- name of the month
+#    time["shortmonth"]   -- short name of the month
+#    time["year"]         -- year modulo 100 (0 - 99)
+#    time["fullyear"]     -- full year
+#    time["weekday"]      -- day of week (Sunday = 0)
+#    time["altweekday"]   -- day of week (Monday = 0)
+#    time["dayname"]      -- name of weekday
+#    time["shortdayname"] -- short name of weekday
+#    time["yearday"]      -- day of year (0 - 365)
+#    time["timezone"]     -- abbreviation of timezone name
+#    time["ampm"]         -- AM or PM designation
+#    time["weeknum"]      -- week number, Sunday first day
+#    time["altweeknum"]   -- week number, Monday first day
+
+function getlocaltime(time,    ret, now, i)
+@{
+    # get time once, avoids unnecessary system calls
+    now = systime()
+
+    # return date(1)-style output
+    ret = strftime("%a %b %e %H:%M:%S %Z %Y", now)
+
+    # clear out target array
+    delete time
+
+    # fill in values, force numeric values to be
+    # numeric by adding 0
+    time["second"]       = strftime("%S", now) + 0
+    time["minute"]       = strftime("%M", now) + 0
+    time["hour"]         = strftime("%H", now) + 0
+    time["althour"]      = strftime("%I", now) + 0
+    time["monthday"]     = strftime("%d", now) + 0
+    time["month"]        = strftime("%m", now) + 0
+    time["monthname"]    = strftime("%B", now)
+    time["shortmonth"]   = strftime("%b", now)
+    time["year"]         = strftime("%y", now) + 0
+    time["fullyear"]     = strftime("%Y", now) + 0
+    time["weekday"]      = strftime("%w", now) + 0
+    time["altweekday"]   = strftime("%u", now) + 0
+    time["dayname"]      = strftime("%A", now)
+    time["shortdayname"] = strftime("%a", now)
+    time["yearday"]      = strftime("%j", now) + 0
+    time["timezone"]     = strftime("%Z", now)
+    time["ampm"]         = strftime("%p", now)
+    time["weeknum"]      = strftime("%U", now) + 0
+    time["altweeknum"]   = strftime("%W", now) + 0
+
+    return ret
+@}
+@c endfile
+@end example
+
+The string indices are easier to use and read than the various formats
+required by @code{strftime()}.  The @code{alarm} program presented in
+@ref{Alarm Program}
+uses this function.
+A more general design for the @code{getlocaltime()} function would have
+allowed the user to supply an optional timestamp value to use instead
+of the current time.
+
+@node Readfile Function
+@subsection Reading a Whole File at Once
+
+Often, it is convenient to have the entire contents of a file available
+in memory as a single string. A straightforward but naive way to
+do that might be as follows:
+
+@example
+function readfile1(file,    tmp, contents)
+@{
+    if ((getline tmp < file) < 0)
+        return
+
+    contents = tmp RT
+    while ((getline tmp < file) > 0)
+        contents = contents tmp RT
+
+    close(file)
+    return contents
+@}
+@end example
+
+This function reads from @code{file} one record at a time, building
+up the full contents of the file in the local variable @code{contents}.
+It works, but is not necessarily efficient.
+
+The following function, based on a suggestion by Denis Shirokov,
+reads the entire contents of the named file in one shot:
+
+@cindex @code{readfile()} user-defined function
+@example
+@c file eg/lib/readfile.awk
+# readfile.awk --- read an entire file at once
+@c endfile
+@ignore
+@c file eg/lib/readfile.awk
+#
+# Original idea by Denis Shirokov, cosmogen@@gmail.com, April 2013
+#
+@c endfile
+@end ignore
+@c file eg/lib/readfile.awk
+
+function readfile(file,     tmp, save_rs)
+@{
+    save_rs = RS
+    RS = "^$"
+    getline tmp < file
+    close(file)
+    RS = save_rs
+
+    return tmp
+@}
+@c endfile
+@end example
+
+It works by setting @code{RS} to @samp{^$}, a regular expression that
+will never match if the file has contents.  @command{gawk} reads data from
+the file into @code{tmp}, attempting to match @code{RS}.  The match fails
+after each read, but fails quickly, such that @command{gawk} fills
+@code{tmp} with the entire contents of the file.
+(@xref{Records} for information on @code{RT} and @code{RS}.)
+
+In the case that @code{file} is empty, the return value is the null
+string.  Thus, calling code may use something like:
+
+@example
+contents = readfile("/some/path")
+if (length(contents) == 0)
+    # file was empty @dots{}
+@end example
+
+This tests the result to see if it is empty or not. An equivalent
+test would be @samp{@w{contents == ""}}.
+
+@xref{Extension Sample Readfile} for an extension function that
+also reads an entire file into memory.
+
+@node Shell Quoting
+@subsection Quoting Strings to Pass to the Shell
+
+@c included by permission
+@ignore
+Date: Sun, 27 Jul 2014 17:16:16 -0700
+Message-ID: <CAKuGj+iCF_obaCLDUX60aSAgbfocFVtguG39GyeoNxTFby5sqQ@mail.gmail.com>
+Subject: Useful awk function
+From: Mike Brennan <mike@madronabluff.com>
+To: Arnold Robbins <arnold@skeeve.com>
+@end ignore
+
+Michael Brennan offers the following programming pattern,
+which he uses frequently:
+
+@example
+#! /bin/sh
+
+awkp='
+   @dots{}
+   '
+
+@var{input_program} | awk "$awkp" | /bin/sh
+@end example
+
+For example, a program of his named @command{flac-edit} has this form:
+
+@example
+$ @kbd{flac-edit -song="Whoope! That's Great" file.flac}
+@end example
+
+It generates the following output, which is to be piped to
+the shell (@file{/bin/sh}):
+
+@example
+chmod +w file.flac
+metaflac --remove-tag=TITLE file.flac
+LANG=en_US.88591 metaflac --set-tag=TITLE='Whoope! That'"'"'s Great' file.flac
+chmod -w file.flac
+@end example
+
+Note the need for shell quoting.  The function @code{shell_quote()}
+does it.  @code{SINGLE} is the one-character string @code{"'"} and
+@code{QSINGLE} is the three-character string @code{"\"'\""}:
+
+@example
+@c file eg/lib/shellquote.awk
+# shell_quote --- quote an argument for passing to the shell
+@c endfile
+@ignore
+@c file eg/lib/shellquote.awk
+#
+# Michael Brennan
+# brennan@@madronabluff.com
+# September 2014
+@c endfile
+@end ignore
+@c file eg/lib/shellquote.awk
+
+function shell_quote(s,             # parameter
+    SINGLE, QSINGLE, i, X, n, ret)  # locals
+@{
+    if (s == "")
+        return "\"\""
+
+    SINGLE = "\x27"  # single quote
+    QSINGLE = "\"\x27\""
+    n = split(s, X, SINGLE)
+
+    ret = SINGLE X[1] SINGLE
+    for (i = 2; i <= n; i++)
+        ret = ret QSINGLE SINGLE X[i] SINGLE
+
+    return ret
+@}
+@c endfile
+@end example
+
+@node Data File Management
+@section @value{DDF} Management
+
+@cindex files, managing
+@cindex libraries of @command{awk} functions, managing, data files
+@cindex functions, library, managing data files
+This @value{SECTION} presents functions that are useful for managing
+command-line @value{DF}s.
+
+@menu
+* Filetrans Function::          A function for handling data file transitions.
+* Rewind Function::             A function for rereading the current file.
+* File Checking::               Checking that data files are readable.
+* Empty Files::                 Checking for zero-length files.
+* Ignoring Assigns::            Treating assignments as file names.
+@end menu
+
+@node Filetrans Function
+@subsection Noting @value{DDF} Boundaries
+
+@cindex files, managing, data file boundaries
+@cindex files, initialization and cleanup
+The @code{BEGIN} and @code{END} rules are each executed exactly once, at
+the beginning and end of your @command{awk} program, respectively
+(@pxref{BEGIN/END}).
+We (the @command{gawk} authors) once had a user who mistakenly thought that the
+@code{BEGIN} rules were executed at the beginning of each @value{DF} and the
+@code{END} rules were executed at the end of each @value{DF}.
+
+When informed
+that this was not the case, the user requested that we add new special
+patterns to @command{gawk}, named @code{BEGIN_FILE} and @code{END_FILE}, that
+would have the desired behavior.  He even supplied us the code to do so.
+
+Adding these special patterns to @command{gawk} wasn't necessary;
+the job can be done cleanly in @command{awk} itself, as illustrated
+by the following library program.
+It arranges to call two user-supplied functions, @code{beginfile()} and
+@code{endfile()}, at the beginning and end of each @value{DF}.
+Besides solving the problem in only nine(!) lines of code, it does so
+@emph{portably}; this works with any implementation of @command{awk}:
+
+@example
+# transfile.awk
+#
+# Give the user a hook for filename transitions
+#
+# The user must supply functions beginfile() and endfile()
+# that each take the name of the file being started or
+# finished, respectively.
+@c #
+@c # Arnold Robbins, arnold@@skeeve.com, Public Domain
+@c # January 1992
+
+FILENAME != _oldfilename @{
+    if (_oldfilename != "")
+        endfile(_oldfilename)
+    _oldfilename = FILENAME
+    beginfile(FILENAME)
+@}
+
+END @{ endfile(FILENAME) @}
+@end example
+
+This file must be loaded before the user's ``main'' program, so that the
+rule it supplies is executed first.
+
+This rule relies on @command{awk}'s @code{FILENAME} variable, which
+automatically changes for each new @value{DF}.  The current @value{FN} is
+saved in a private variable, @code{_oldfilename}.  If @code{FILENAME} does
+not equal @code{_oldfilename}, then a new @value{DF} is being processed and
+it is necessary to call @code{endfile()} for the old file.  Because
+@code{endfile()} should only be called if a file has been processed, the
+program first checks to make sure that @code{_oldfilename} is not the null
+string.  The program then assigns the current @value{FN} to
+@code{_oldfilename} and calls @code{beginfile()} for the file.
+Because, like all @command{awk} variables, @code{_oldfilename} is
+initialized to the null string, this rule executes correctly even for the
+first @value{DF}.
+
+The program also supplies an @code{END} rule to do the final processing for
+the last file.  Because this @code{END} rule comes before any @code{END} rules
+supplied in the ``main'' program, @code{endfile()} is called first.  Once
+again, the value of multiple @code{BEGIN} and @code{END} rules should be clear.
+
+@cindex @code{beginfile()} user-defined function
+@cindex @code{endfile()} user-defined function
+If the same @value{DF} occurs twice in a row on the command line, then
+@code{endfile()} and @code{beginfile()} are not executed at the end of the
+first pass and at the beginning of the second pass.
+The following version solves the problem:
+
+@example
+@c file eg/lib/ftrans.awk
+# ftrans.awk --- handle datafile transitions
+#
+# user supplies beginfile() and endfile() functions
+@c endfile
+@ignore
+@c file eg/lib/ftrans.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# November 1992
+@c endfile
+@end ignore
+@c file eg/lib/ftrans.awk
+
+FNR == 1 @{
+    if (_filename_ != "")
+        endfile(_filename_)
+    _filename_ = FILENAME
+    beginfile(FILENAME)
+@}
+
+END @{ endfile(_filename_) @}
+@c endfile
+@end example
+
+@ref{Wc Program}
+shows how this library function can be used and
+how it simplifies writing the main program.
+
+@sidebar So Why Does @command{gawk} Have @code{BEGINFILE} and @code{ENDFILE}?
+
+You are probably wondering, if @code{beginfile()} and @code{endfile()}
+functions can do the job, why does @command{gawk} have
+@code{BEGINFILE} and @code{ENDFILE} patterns?
+
+Good question.  Normally, if @command{awk} cannot open a file, this
+causes an immediate fatal error.  In this case, there is no way for a
+user-defined function to deal with the problem, as the mechanism for
+calling it relies on the file being open and at the first record.  Thus,
+the main reason for @code{BEGINFILE} is to give you a ``hook'' to catch
+files that cannot be processed.  @code{ENDFILE} exists for symmetry,
+and because it provides an easy way to do per-file cleanup processing.
+For more information, refer to @ref{BEGINFILE/ENDFILE}.
+@end sidebar
+
+@node Rewind Function
+@subsection Rereading the Current File
+
+@cindex files, reading
+Another request for a new built-in function was for a
+function that would make it possible to reread the current file.
+The requesting user didn't want to have to use @code{getline}
+(@pxref{Getline})
+inside a loop.
+
+However, as long as you are not in the @code{END} rule, it is
+quite easy to arrange to immediately close the current input file
+and then start over with it from the top.
+For lack of a better name, we'll call the function @code{rewind()}:
+
+@cindex @code{rewind()} user-defined function
+@example
+@c file eg/lib/rewind.awk
+# rewind.awk --- rewind the current file and start over
+@c endfile
+@ignore
+@c file eg/lib/rewind.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# September 2000
+@c endfile
+@end ignore
+@c file eg/lib/rewind.awk
+
+function rewind(    i)
+@{
+    # shift remaining arguments up
+    for (i = ARGC; i > ARGIND; i--)
+        ARGV[i] = ARGV[i-1]
+
+    # make sure gawk knows to keep going
+    ARGC++
+
+    # make current file next to get done
+    ARGV[ARGIND+1] = FILENAME
+
+    # do it
+    nextfile
+@}
+@c endfile
+@end example
+
+The @code{rewind()} function relies on the @code{ARGIND} variable
+(@pxref{Auto-set}), which is specific to @command{gawk}.  It also
+relies on the @code{nextfile} keyword (@pxref{Nextfile Statement}).
+Because of this, you should not call it from an @code{ENDFILE} rule.
+(This isn't necessary anyway, because @command{gawk} goes to the next
+file as soon as an @code{ENDFILE} rule finishes!)
+
+You need to be careful calling @code{rewind()}.  You can end up
+causing infinite recursion if you don't pay attention. Here is an
+example use:
+
+@example
+$ @kbd{cat data}
+@print{} a
+@print{} b
+@print{} c
+@print{} d
+@print{} e
+
+$ cat @kbd{test.awk}
+@print{} FNR == 3 && ! rewound @{
+@print{}    rewound = 1
+@print{}    rewind()
+@print{} @}
+@print{} 
+@print{} @{ print FILENAME, FNR, $0 @}
+
+$ @kbd{gawk -f rewind.awk -f test.awk data }
+@print{} data 1 a
+@print{} data 2 b
+@print{} data 1 a
+@print{} data 2 b
+@print{} data 3 c
+@group
+@print{} data 4 d
+@print{} data 5 e
+@end group
+@end example
+
+@node File Checking
+@subsection Checking for Readable @value{DDF}s
+
+@cindex troubleshooting, readable data files
+@cindex readable data files@comma{} checking
+@cindex files, skipping
+Normally, if you give @command{awk} a @value{DF} that isn't readable,
+it stops with a fatal error.  There are times when you might want to
+just ignore such files and keep going.@footnote{The @code{BEGINFILE}
+special pattern (@pxref{BEGINFILE/ENDFILE}) provides an alternative
+mechanism for dealing with files that can't be opened.  However, the
+code here provides a portable solution.} You can do this by prepending
+the following program to your @command{awk} program:
+
+@cindex @code{readable.awk} program
+@example
+@c file eg/lib/readable.awk
+# readable.awk --- library file to skip over unreadable files
+@c endfile
+@ignore
+@c file eg/lib/readable.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# October 2000
+# December 2010
+@c endfile
+@end ignore
+@c file eg/lib/readable.awk
+
+BEGIN @{
+    for (i = 1; i < ARGC; i++) @{
+        if (ARGV[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/ \
+            || ARGV[i] == "-" || ARGV[i] == "/dev/stdin")
+            continue    # assignment or standard input
+        else if ((getline junk < ARGV[i]) < 0) # unreadable
+            delete ARGV[i]
+        else
+            close(ARGV[i])
+    @}
+@}
+@c endfile
+@end example
+
+@cindex troubleshooting, @code{getline} function
+This works, because the @code{getline} won't be fatal.
+Removing the element from @code{ARGV} with @code{delete}
+skips the file (because it's no longer in the list).
+See also @ref{ARGC and ARGV}.
+
+Because @command{awk} variable names only allow the English letters,
+the regular expression check purposely does not use character classes
+such as @samp{[:alpha:]} and @samp{[:alnum:]}
+(@pxref{Bracket Expressions}).
+
+@node Empty Files
+@subsection Checking for Zero-Length Files
+
+All known @command{awk} implementations silently skip over zero-length files.
+This is a by-product of @command{awk}'s implicit
+read-a-record-and-match-against-the-rules loop: when @command{awk}
+tries to read a record from an empty file, it immediately receives an
+end-of-file indication, closes the file, and proceeds on to the next
+command-line @value{DF}, @emph{without} executing any user-level
+@command{awk} program code.
+
+Using @command{gawk}'s @code{ARGIND} variable
+(@pxref{Built-in Variables}), it is possible to detect when an empty
+@value{DF} has been skipped.  Similar to the library file presented
+in @ref{Filetrans Function}, the following library file calls a function named
+@code{zerofile()} that the user must provide.  The arguments passed are
+the @value{FN} and the position in @code{ARGV} where it was found:
+
+@cindex @code{zerofile.awk} program
+@example
+@c file eg/lib/zerofile.awk
+# zerofile.awk --- library file to process empty input files
+@c endfile
+@ignore
+@c file eg/lib/zerofile.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# June 2003
+@c endfile
+@end ignore
+@c file eg/lib/zerofile.awk
+
+BEGIN @{ Argind = 0 @}
+
+ARGIND > Argind + 1 @{
+    for (Argind++; Argind < ARGIND; Argind++)
+        zerofile(ARGV[Argind], Argind)
+@}
+
+ARGIND != Argind @{ Argind = ARGIND @}
+
+END @{
+    if (ARGIND > Argind)
+        for (Argind++; Argind <= ARGIND; Argind++)
+            zerofile(ARGV[Argind], Argind)
+@}
+@c endfile
+@end example
+
+The user-level variable @code{Argind} allows the @command{awk} program
+to track its progress through @code{ARGV}.  Whenever the program detects
+that @code{ARGIND} is greater than @samp{Argind + 1}, it means that one or
+more empty files were skipped.  The action then calls @code{zerofile()} for
+each such file, incrementing @code{Argind} along the way.
+
+The @samp{Argind != ARGIND} rule simply keeps @code{Argind} up to date
+in the normal case.
+
+Finally, the @code{END} rule catches the case of any empty files at
+the end of the command-line arguments.  Note that the test in the
+condition of the @code{for} loop uses the @samp{<=} operator,
+not @samp{<}.
+
+@node Ignoring Assigns
+@subsection Treating Assignments as @value{FFN}s
+
+@cindex assignments as file names
+@cindex file names, assignments as
+Occasionally, you might not want @command{awk} to process command-line
+variable assignments
+(@pxref{Assignment Options}).
+In particular, if you have a @value{FN} that contains an @samp{=} character,
+@command{awk} treats the @value{FN} as an assignment and does not process it.
+
+Some users have suggested an additional command-line option for @command{gawk}
+to disable command-line assignments.  However, some simple programming with
+a library file does the trick:
+
+@cindex @code{noassign.awk} program
+@example
+@c file eg/lib/noassign.awk
+# noassign.awk --- library file to avoid the need for a
+# special option that disables command-line assignments
+@c endfile
+@ignore
+@c file eg/lib/noassign.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# October 1999
+@c endfile
+@end ignore
+@c file eg/lib/noassign.awk
+
+function disable_assigns(argc, argv,    i)
+@{
+    for (i = 1; i < argc; i++)
+        if (argv[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/)
+            argv[i] = ("./" argv[i])
+@}
+
+BEGIN @{
+    if (No_command_assign)
+        disable_assigns(ARGC, ARGV)
+@}
+@c endfile
+@end example
+
+You then run your program this way:
+
+@example
+awk -v No_command_assign=1 -f noassign.awk -f yourprog.awk *
+@end example
+
+The function works by looping through the arguments.
+It prepends @samp{./} to
+any argument that matches the form
+of a variable assignment, turning that argument into a @value{FN}.
+
+The use of @code{No_command_assign} allows you to disable command-line
+assignments at invocation time, by giving the variable a true value.
+When not set, it is initially zero (i.e., false), so the command-line arguments
+are left alone.
+
+@node Getopt Function
+@section Processing Command-Line Options
+
+@cindex libraries of @command{awk} functions, command-line options
+@cindex functions, library, command-line options
+@cindex command-line options, processing
+@cindex options, command-line, processing
+@cindex functions, library, C library
+@cindex arguments, processing
+Most utilities on POSIX-compatible systems take options on
+the command line that can be used to change the way a program behaves.
+@command{awk} is an example of such a program
+(@pxref{Options}).
+Often, options take @dfn{arguments} (i.e., data that the program needs to
+correctly obey the command-line option).  For example, @command{awk}'s
+@option{-F} option requires a string to use as the field separator.
+The first occurrence on the command line of either @option{--} or a
+string that does not begin with @samp{-} ends the options.
+
+@cindex @code{getopt()} function (C library)
+Modern Unix systems provide a C function named @code{getopt()} for processing
+command-line arguments.  The programmer provides a string describing the
+one-letter options. If an option requires an argument, it is followed in the
+string with a colon.  @code{getopt()} is also passed the
+count and values of the command-line arguments and is called in a loop.
+@code{getopt()} processes the command-line arguments for option letters.
+Each time around the loop, it returns a single character representing the
+next option letter that it finds, or @samp{?} if it finds an invalid option.
+When it returns @minus{}1, there are no options left on the command line.
+
+When using @code{getopt()}, options that do not take arguments can be
+grouped together.  Furthermore, options that take arguments require that the
+argument be present.  The argument can immediately follow the option letter,
+or it can be a separate command-line argument.
+
+Given a hypothetical program that takes
+three command-line options, @option{-a}, @option{-b}, and @option{-c}, where
+@option{-b} requires an argument, all of the following are valid ways of
+invoking the program:
+
+@example
+prog -a -b foo -c data1 data2 data3
+prog -ac -bfoo -- data1 data2 data3
+prog -acbfoo data1 data2 data3
+@end example
+
+Notice that when the argument is grouped with its option, the rest of
+the argument is considered to be the option's argument.
+In this example, @option{-acbfoo} indicates that all of the
+@option{-a}, @option{-b}, and @option{-c} options were supplied,
+and that @samp{foo} is the argument to the @option{-b} option.
+
+@code{getopt()} provides four external variables that the programmer can use:
+
+@table @code
+@item optind
+The index in the argument value array (@code{argv}) where the first
+nonoption command-line argument can be found.
+
+@item optarg
+The string value of the argument to an option.
+
+@item opterr
+Usually @code{getopt()} prints an error message when it finds an invalid
+option.  Setting @code{opterr} to zero disables this feature.  (An
+application might want to print its own error message.)
+
+@item optopt
+The letter representing the command-line option.
+@end table
+
+The following C fragment shows how @code{getopt()} might process command-line
+arguments for @command{awk}:
+
+@example
+int
+main(int argc, char *argv[])
+@{
+    @dots{}
+    /* print our own message */
+    opterr = 0;
+    while ((c = getopt(argc, argv, "v:f:F:W:")) != -1) @{
+        switch (c) @{
+        case 'f':    /* file */
+            @dots{}
+            break;
+        case 'F':    /* field separator */
+            @dots{}
+            break;
+        case 'v':    /* variable assignment */
+            @dots{}
+            break;
+        case 'W':    /* extension */
+            @dots{}
+            break;
+        case '?':
+        default:
+            usage();
+            break;
+        @}
+    @}
+    @dots{}
+@}
+@end example
+
+As a side point, @command{gawk} actually uses the GNU @code{getopt_long()}
+function to process both normal and GNU-style long options
+(@pxref{Options}).
+
+The abstraction provided by @code{getopt()} is very useful and is quite
+handy in @command{awk} programs as well.  Following is an @command{awk}
+version of @code{getopt()}.  This function highlights one of the
+greatest weaknesses in @command{awk}, which is that it is very poor at
+manipulating single characters.  Repeated calls to @code{substr()} are
+necessary for accessing individual characters
+(@pxref{String Functions}).@footnote{This
+function was written before @command{gawk} acquired the ability to
+split strings into single characters using @code{""} as the separator.
+We have left it alone, as using @code{substr()} is more portable.}
+
+The discussion that follows walks through the code a bit at a time:
+
+@cindex @code{getopt()} user-defined function
+@example
+@c file eg/lib/getopt.awk
+# getopt.awk --- Do C library getopt(3) function in awk
+@c endfile
+@ignore
+@c file eg/lib/getopt.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+#
+# Initial version: March, 1991
+# Revised: May, 1993
+@c endfile
+@end ignore
+@c file eg/lib/getopt.awk
+
+# External variables:
+#    Optind -- index in ARGV of first nonoption argument
+#    Optarg -- string value of argument to current option
+#    Opterr -- if nonzero, print our own diagnostic
+#    Optopt -- current option letter
+
+# Returns:
+#    -1     at end of options
+#    "?"    for unrecognized option
+#    <c>    a character representing the current option
+
+# Private Data:
+#    _opti  -- index in multiflag option, e.g., -abc
+@c endfile
+@end example
+
+The function starts out with comments presenting
+a list of the global variables it uses,
+what the return values are, what they mean, and any global variables that
+are ``private'' to this library function.  Such documentation is essential
+for any program, and particularly for library functions.
+
+The @code{getopt()} function first checks that it was indeed called with
+a string of options (the @code{options} parameter).  If @code{options}
+has a zero length, @code{getopt()} immediately returns @minus{}1:
+
+@cindex @code{getopt()} user-defined function
+@example
+@c file eg/lib/getopt.awk
+function getopt(argc, argv, options,    thisopt, i)
+@{
+    if (length(options) == 0)    # no options given
+        return -1
+
+@group
+    if (argv[Optind] == "--") @{  # all done
+        Optind++
+        _opti = 0
+        return -1
+@end group
+    @} else if (argv[Optind] !~ /^-[^:[:space:]]/) @{
+        _opti = 0
+        return -1
+    @}
+@c endfile
+@end example
+
+The next thing to check for is the end of the options.  A @option{--}
+ends the command-line options, as does any command-line argument that
+does not begin with a @samp{-}.  @code{Optind} is used to step through
+the array of command-line arguments; it retains its value across calls
+to @code{getopt()}, because it is a global variable.
+
+The regular expression that is used, @code{@w{/^-[^:[:space:]/}},
+checks for a @samp{-} followed by anything
+that is not whitespace and not a colon.
+If the current command-line argument does not match this pattern,
+it is not an option, and it ends option processing. Continuing on:
+
+@example
+@c file eg/lib/getopt.awk
+    if (_opti == 0)
+        _opti = 2
+    thisopt = substr(argv[Optind], _opti, 1)
+    Optopt = thisopt
+    i = index(options, thisopt)
+    if (i == 0) @{
+        if (Opterr)
+            printf("%c -- invalid option\n", thisopt) > "/dev/stderr"
+        if (_opti >= length(argv[Optind])) @{
+            Optind++
+            _opti = 0
+        @} else
+            _opti++
+        return "?"
+    @}
+@c endfile
+@end example
+
+The @code{_opti} variable tracks the position in the current command-line
+argument (@code{argv[Optind]}).  If multiple options are
+grouped together with one @samp{-} (e.g., @option{-abx}), it is necessary
+to return them to the user one at a time.
+
+If @code{_opti} is equal to zero, it is set to two, which is the index in
+the string of the next character to look at (we skip the @samp{-}, which
+is at position one).  The variable @code{thisopt} holds the character,
+obtained with @code{substr()}.  It is saved in @code{Optopt} for the main
+program to use.
+
+If @code{thisopt} is not in the @code{options} string, then it is an
+invalid option.  If @code{Opterr} is nonzero, @code{getopt()} prints an error
+message on the standard error that is similar to the message from the C
+version of @code{getopt()}.
+
+Because the option is invalid, it is necessary to skip it and move on to the
+next option character.  If @code{_opti} is greater than or equal to the
+length of the current command-line argument, it is necessary to move on
+to the next argument, so @code{Optind} is incremented and @code{_opti} is reset
+to zero. Otherwise, @code{Optind} is left alone and @code{_opti} is merely
+incremented.
+
+In any case, because the option is invalid, @code{getopt()} returns @code{"?"}.
+The main program can examine @code{Optopt} if it needs to know what the
+invalid option letter actually is. Continuing on:
+
+@example
+@c file eg/lib/getopt.awk
+    if (substr(options, i + 1, 1) == ":") @{
+        # get option argument
+        if (length(substr(argv[Optind], _opti + 1)) > 0)
+            Optarg = substr(argv[Optind], _opti + 1)
+        else
+            Optarg = argv[++Optind]
+        _opti = 0
+    @} else
+        Optarg = ""
+@c endfile
+@end example
+
+If the option requires an argument, the option letter is followed by a colon
+in the @code{options} string.  If there are remaining characters in the
+current command-line argument (@code{argv[Optind]}), then the rest of that
+string is assigned to @code{Optarg}.  Otherwise, the next command-line
+argument is used (@samp{-xFOO} versus @samp{@w{-x FOO}}). In either case,
+@code{_opti} is reset to zero, because there are no more characters left to
+examine in the current command-line argument. Continuing:
+
+@example
+@c file eg/lib/getopt.awk
+    if (_opti == 0 || _opti >= length(argv[Optind])) @{
+        Optind++
+        _opti = 0
+    @} else
+        _opti++
+    return thisopt
+@}
+@c endfile
+@end example
+
+Finally, if @code{_opti} is either zero or greater than the length of the
+current command-line argument, it means this element in @code{argv} is
+through being processed, so @code{Optind} is incremented to point to the
+next element in @code{argv}.  If neither condition is true, then only
+@code{_opti} is incremented, so that the next option letter can be processed
+on the next call to @code{getopt()}.
+
+The @code{BEGIN} rule initializes both @code{Opterr} and @code{Optind} to one.
+@code{Opterr} is set to one, because the default behavior is for @code{getopt()}
+to print a diagnostic message upon seeing an invalid option.  @code{Optind}
+is set to one, because there's no reason to look at the program name, which is
+in @code{ARGV[0]}:
+
+@example
+@c file eg/lib/getopt.awk
+BEGIN @{
+    Opterr = 1    # default is to diagnose
+    Optind = 1    # skip ARGV[0]
+
+    # test program
+    if (_getopt_test) @{
+        while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
+            printf("c = <%c>, Optarg = <%s>\n",
+                                       _go_c, Optarg)
+        printf("non-option arguments:\n")
+        for (; Optind < ARGC; Optind++)
+            printf("\tARGV[%d] = <%s>\n",
+                                    Optind, ARGV[Optind])
+    @}
+@}
+@c endfile
+@end example
+
+The rest of the @code{BEGIN} rule is a simple test program.  Here are the
+results of two sample runs of the test program:
+
+@example
+$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -cbARG bax -x}
+@print{} c = <a>, Optarg = <>
+@print{} c = <c>, Optarg = <>
+@print{} c = <b>, Optarg = <ARG>
+@print{} non-option arguments:
+@print{}         ARGV[3] = <bax>
+@print{}         ARGV[4] = <-x>
+
+$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -x -- xyz abc}
+@print{} c = <a>, Optarg = <>
+@error{} x -- invalid option
+@print{} c = <?>, Optarg = <>
+@print{} non-option arguments:
+@print{}         ARGV[4] = <xyz>
+@print{}         ARGV[5] = <abc>
+@end example
+
+In both runs, the first @option{--} terminates the arguments to
+@command{awk}, so that it does not try to interpret the @option{-a},
+etc., as its own options.
+
+@quotation NOTE
+After @code{getopt()} is through,
+user-level code must clear out all the elements of @code{ARGV} from 1
+to @code{Optind}, so that @command{awk} does not try to process the
+command-line options as @value{FN}s.
+@end quotation
+
+Using @samp{#!} with the @option{-E} option may help avoid
+conflicts between your program's options and @command{gawk}'s options,
+as @option{-E} causes @command{gawk} to abandon processing of
+further options
+(@pxref{Executable Scripts} and
+@ifnotdocbook
+@pxref{Options}).
+@end ifnotdocbook
+@ifdocbook
+@ref{Options}).
+@end ifdocbook
+
+Several of the sample programs presented in
+@ref{Sample Programs},
+use @code{getopt()} to process their arguments.
+
+@node Passwd Functions
+@section Reading the User Database
+
+@cindex libraries of @command{awk} functions, user database, reading
+@cindex functions, library, user database@comma{} reading
+@cindex user database@comma{} reading
+@cindex database, users@comma{} reading
+@cindex @code{PROCINFO} array
+The @code{PROCINFO} array
+(@pxref{Built-in Variables})
+provides access to the current user's real and effective user and group ID
+numbers, and, if available, the user's supplementary group set.
+However, because these are numbers, they do not provide very useful
+information to the average user.  There needs to be some way to find the
+user information associated with the user and group ID numbers.  This
+@value{SECTION} presents a suite of functions for retrieving information from the
+user database.  @xref{Group Functions}
+for a similar suite that retrieves information from the group database.
+
+@cindex @code{getpwent()} function (C library)
+@cindex @code{getpwent()} user-defined function
+@cindex users, information about, retrieving
+@cindex login information
+@cindex account information
+@cindex password file
+@cindex files, password
+The POSIX standard does not define the file where user information is
+kept.  Instead, it provides the @code{<pwd.h>} header file
+and several C language subroutines for obtaining user information.
+The primary function is @code{getpwent()}, for ``get password entry.''
+The ``password'' comes from the original user database file,
+@file{/etc/passwd}, which stores user information along with the
+encrypted passwords (hence the name).
+
+@cindex @command{pwcat} program
+Although an @command{awk} program could simply read @file{/etc/passwd}
+directly, this file may not contain complete information about the
+system's set of users.@footnote{It is often the case that password
+information is stored in a network database.} To be sure you are able to
+produce a readable and complete version of the user database, it is necessary
+to write a small C program that calls @code{getpwent()}.  @code{getpwent()}
+is defined as returning a pointer to a @code{struct passwd}.  Each time it
+is called, it returns the next entry in the database.  When there are
+no more entries, it returns @code{NULL}, the null pointer.  When this
+happens, the C program should call @code{endpwent()} to close the database.
+Following is @command{pwcat}, a C program that ``cats'' the password database:
+
+@example
+@c file eg/lib/pwcat.c
+/*
+ * pwcat.c
+ *
+ * Generate a printable version of the password database.
+ */
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+/*
+ * Arnold Robbins, arnold@@skeeve.com, May 1993
+ * Public Domain
+ * December 2010, move to ANSI C definition for main().
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+#include <stdio.h>
+#include <pwd.h>
+
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+#if defined (STDC_HEADERS)
+#include <stdlib.h>
+#endif
+
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+int
+main(int argc, char **argv)
+@{
+    struct passwd *p;
+
+    while ((p = getpwent()) != NULL)
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+#ifdef HAVE_STRUCT_PASSWD_PW_PASSWD
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+        printf("%s:%s:%ld:%ld:%s:%s:%s\n",
+            p->pw_name, p->pw_passwd, (long) p->pw_uid,
+            (long) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell);
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+#else
+        printf("%s:*:%ld:%ld:%s:%s\n",
+            p->pw_name, (long) p->pw_uid,
+            (long) p->pw_gid, p->pw_dir, p->pw_shell);
+#endif
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+
+    endpwent();
+    return 0;
+@}
+@c endfile
+@end example
+
+If you don't understand C, don't worry about it.
+The output from @command{pwcat} is the user database, in the traditional
+@file{/etc/passwd} format of colon-separated fields.  The fields are:
+
+@table @asis
+@item Login name
+The user's login name.
+
+@item Encrypted password
+The user's encrypted password.  This may not be available on some systems.
+
+@item User-ID
+The user's numeric user ID number.
+(On some systems, it's a C @code{long}, and not an @code{int}.  Thus,
+we cast it to @code{long} for all cases.)
+
+@item Group-ID
+The user's numeric group ID number.
+(Similar comments about @code{long} versus @code{int} apply here.)
+
+@item Full name
+The user's full name, and perhaps other information associated with the
+user.
+
+@item Home directory
+The user's login (or ``home'') directory (familiar to shell programmers as
+@code{$HOME}).
+
+@item Login shell
+The program that is run when the user logs in.  This is usually a
+shell, such as Bash.
+@end table
+
+A few lines representative of @command{pwcat}'s output are as follows:
+
+@cindex Jacobs, Andrew
+@cindex Robbins, Arnold
+@cindex Robbins, Miriam
+@example
+$ @kbd{pwcat}
+@print{} root:x:0:1:Operator:/:/bin/sh
+@print{} nobody:*:65534:65534::/:
+@print{} daemon:*:1:1::/:
+@print{} sys:*:2:2::/:/bin/csh
+@print{} bin:*:3:3::/bin:
+@print{} arnold:xyzzy:2076:10:Arnold Robbins:/home/arnold:/bin/sh
+@print{} miriam:yxaay:112:10:Miriam Robbins:/home/miriam:/bin/sh
+@print{} andy:abcca2:113:10:Andy Jacobs:/home/andy:/bin/sh
+@dots{}
+@end example
+
+With that introduction, following is a group of functions for getting user
+information.  There are several functions here, corresponding to the C
+functions of the same names:
+
+@cindex @code{_pw_init()} user-defined function
+@example
+@c file eg/lib/passwdawk.in
+# passwd.awk --- access password file information
+@c endfile
+@ignore
+@c file eg/lib/passwdawk.in
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+@c endfile
+@end ignore
+@c file eg/lib/passwdawk.in
+
+BEGIN @{
+    # tailor this to suit your system
+    _pw_awklib = "/usr/local/libexec/awk/"
+@}
+
+function _pw_init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+@{
+    if (_pw_inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    pwcat = _pw_awklib "pwcat"
+    while ((pwcat | getline) > 0) @{
+        _pw_byname[$1] = $0
+        _pw_byuid[$3] = $0
+        _pw_bycount[++_pw_total] = $0
+    @}
+    close(pwcat)
+    _pw_count = 0
+    _pw_inited = 1
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+@}
+@c endfile
+@end example
+
+@cindex @code{BEGIN} pattern, @code{pwcat} program
+The @code{BEGIN} rule sets a private variable to the directory where
+@command{pwcat} is stored.  Because it is used to help out an @command{awk} library
+routine, we have chosen to put it in @file{/usr/local/libexec/awk};
+however, you might want it to be in a different directory on your system.
+
+The function @code{_pw_init()} fills three copies of the user information
+into three associative arrays.  The arrays are indexed by username
+(@code{_pw_byname}), by user ID number (@code{_pw_byuid}), and by order of
+occurrence (@code{_pw_bycount}).
+The variable @code{_pw_inited} is used for efficiency, as @code{_pw_init()}
+needs to be called only once.
+
+@cindex @code{PROCINFO} array, testing the field splitting
+@cindex @code{getline} command, @code{_pw_init()} function
+Because this function uses @code{getline} to read information from
+@command{pwcat}, it first saves the values of @code{FS}, @code{RS}, and @code{$0}.
+It notes in the variable @code{using_fw} whether field splitting
+with @code{FIELDWIDTHS} is in effect or not.
+Doing so is necessary, as these functions could be called
+from anywhere within a user's program, and the user may have his
+or her own way of splitting records and fields.
+This makes it possible to restore the correct
+field-splitting mechanism later.  The test can only be true for
+@command{gawk}.  It is false if using @code{FS} or @code{FPAT},
+or on some other @command{awk} implementation.
+
+The code that checks for using @code{FPAT}, using @code{using_fpat}
+and @code{PROCINFO["FS"]}, is similar.
+
+The main part of the function uses a loop to read database lines, split
+the lines into fields, and then store the lines into each array as necessary.
+When the loop is done, @code{@w{_pw_init()}} cleans up by closing the pipeline,
+setting @code{@w{_pw_inited}} to one, and restoring @code{FS}
+(and @code{FIELDWIDTHS} or @code{FPAT}
+if necessary), @code{RS}, and @code{$0}.
+The use of @code{@w{_pw_count}} is explained shortly.
+
+@cindex @code{getpwnam()} function (C library)
+The @code{getpwnam()} function takes a username as a string argument. If that
+user is in the database, it returns the appropriate line. Otherwise, it
+relies on the array reference to a nonexistent
+element to create the element with the null string as its value:
+
+@cindex @code{getpwnam()} user-defined function
+@example
+@group
+@c file eg/lib/passwdawk.in
+function getpwnam(name)
+@{
+    _pw_init()
+    return _pw_byname[name]
+@}
+@c endfile
+@end group
+@end example
+
+@cindex @code{getpwuid()} function (C library)
+Similarly, the @code{getpwuid()} function takes a user ID number
+argument. If that user number is in the database, it returns the
+appropriate line. Otherwise, it returns the null string:
+
+@cindex @code{getpwuid()} user-defined function
+@example
+@c file eg/lib/passwdawk.in
+function getpwuid(uid)
+@{
+    _pw_init()
+    return _pw_byuid[uid]
+@}
+@c endfile
+@end example
+
+@cindex @code{getpwent()} function (C library)
+The @code{getpwent()} function simply steps through the database, one entry at
+a time.  It uses @code{_pw_count} to track its current position in the
+@code{_pw_bycount} array:
+
+@cindex @code{getpwent()} user-defined function
+@example
+@c file eg/lib/passwdawk.in
+function getpwent()
+@{
+    _pw_init()
+    if (_pw_count < _pw_total)
+        return _pw_bycount[++_pw_count]
+    return ""
+@}
+@c endfile
+@end example
+
+@cindex @code{endpwent()} function (C library)
+The @code{@w{endpwent()}} function resets @code{@w{_pw_count}} to zero, so that
+subsequent calls to @code{getpwent()} start over again:
+
+@cindex @code{endpwent()} user-defined function
+@example
+@c file eg/lib/passwdawk.in
+function endpwent()
+@{
+    _pw_count = 0
+@}
+@c endfile
+@end example
+
+A conscious design decision in this suite is that each subroutine calls
+@code{@w{_pw_init()}} to initialize the database arrays.
+The overhead of running
+a separate process to generate the user database, and the I/O to scan it,
+are only incurred if the user's main program actually calls one of these
+functions.  If this library file is loaded along with a user's program, but
+none of the routines are ever called, then there is no extra runtime overhead.
+(The alternative is move the body of @code{@w{_pw_init()}} into a
+@code{BEGIN} rule, which always runs @command{pwcat}.  This simplifies the
+code but runs an extra process that may never be needed.)
+
+In turn, calling @code{_pw_init()} is not too expensive, because the
+@code{_pw_inited} variable keeps the program from reading the data more than
+once.  If you are worried about squeezing every last cycle out of your
+@command{awk} program, the check of @code{_pw_inited} could be moved out of
+@code{_pw_init()} and duplicated in all the other functions.  In practice,
+this is not necessary, as most @command{awk} programs are I/O-bound,
+and such a change would clutter up the code.
+
+The @command{id} program in @ref{Id Program}
+uses these functions.
+
+@node Group Functions
+@section Reading the Group Database
+
+@cindex libraries of @command{awk} functions, group database, reading
+@cindex functions, library, group database@comma{} reading
+@cindex group database, reading
+@cindex database, group, reading
+@cindex @code{PROCINFO} array, group membership and
+@cindex @code{getgrent()} function (C library)
+@cindex @code{getgrent()} user-defined function
+@cindex groups@comma{} information about
+@cindex account information
+@cindex group file
+@cindex files, group
+Much of the discussion presented in
+@ref{Passwd Functions}
+applies to the group database as well.  Although there has traditionally
+been a well-known file (@file{/etc/group}) in a well-known format, the POSIX
+standard only provides a set of C library routines
+(@code{<grp.h>} and @code{getgrent()})
+for accessing the information.
+Even though this file may exist, it may not have
+complete information.  Therefore, as with the user database, it is necessary
+to have a small C program that generates the group database as its output.
+@command{grcat}, a C program that ``cats'' the group database,
+is as follows:
+
+@cindex @command{grcat} program
+@example
+@c file eg/lib/grcat.c
+/*
+ * grcat.c
+ *
+ * Generate a printable version of the group database.
+ */
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+/*
+ * Arnold Robbins, arnold@@skeeve.com, May 1993
+ * Public Domain
+ * December 2010, move to ANSI C definition for main().
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined (STDC_HEADERS)
+#include <stdlib.h>
+#endif
+
+#ifndef HAVE_GETGRENT
+int main() { return 0; }
+#else
+@c endfile
+@end ignore
+@c file eg/lib/grcat.c
+#include <stdio.h>
+#include <grp.h>
+
+int
+main(int argc, char **argv)
+@{
+    struct group *g;
+    int i;
+
+    while ((g = getgrent()) != NULL) @{
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+#ifdef HAVE_STRUCT_GROUP_GR_PASSWD
+@c endfile
+@end ignore
+@c file eg/lib/grcat.c
+        printf("%s:%s:%ld:", g->gr_name, g->gr_passwd,
+                                     (long) g->gr_gid);
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+#else
+        printf("%s:*:%ld:", g->gr_name, (long) g->gr_gid);
+#endif
+@c endfile
+@end ignore
+@c file eg/lib/grcat.c
+        for (i = 0; g->gr_mem[i] != NULL; i++) @{
+            printf("%s", g->gr_mem[i]);
+@group
+            if (g->gr_mem[i+1] != NULL)
+                putchar(',');
+        @}
+@end group
+        putchar('\n');
+    @}
+    endgrent();
+    return 0;
+@}
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+#endif /* HAVE_GETGRENT */
+@c endfile
+@end ignore
+@end example
+
+Each line in the group database represents one group.  The fields are
+separated with colons and represent the following information:
+
+@table @asis
+@item Group Name
+The group's name.
+
+@item Group Password
+The group's encrypted password. In practice, this field is never used;
+it is usually empty or set to @samp{*}.
+
+@item Group ID Number
+The group's numeric group ID number;
+the association of name to number must be unique within the file.
+(On some systems it's a C @code{long}, and not an @code{int}.  Thus,
+we cast it to @code{long} for all cases.)
+
+@item Group Member List
+A comma-separated list of usernames.  These users are members of the group.
+Modern Unix systems allow users to be members of several groups
+simultaneously.  If your system does, then there are elements
+@code{"group1"} through @code{"group@var{N}"} in @code{PROCINFO}
+for those group ID numbers.
+(Note that @code{PROCINFO} is a @command{gawk} extension;
+@pxref{Built-in Variables}.)
+@end table
+
+Here is what running @command{grcat} might produce:
+
+@example
+$ @kbd{grcat}
+@print{} wheel:*:0:arnold
+@print{} nogroup:*:65534:
+@print{} daemon:*:1:
+@print{} kmem:*:2:
+@print{} staff:*:10:arnold,miriam,andy
+@print{} other:*:20:
+@dots{}
+@end example
+
+Here are the functions for obtaining information from the group database.
+There are several, modeled after the C library functions of the same names:
+
+@cindex @code{getline} command, @code{_gr_init()} user-defined function
+@cindex @code{_gr_init()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+# group.awk --- functions for dealing with the group file
+@c endfile
+@ignore
+@c file eg/lib/groupawk.in
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+@c endfile
+@end ignore
+@c line break on _gr_init for smallbook
+@c file eg/lib/groupawk.in
+
+BEGIN @{
+    # Change to suit your system
+    _gr_awklib = "/usr/local/libexec/awk/"
+@}
+
+function _gr_init(    oldfs, oldrs, olddol0, grcat,
+                             using_fw, using_fpat, n, a, i)
+@{
+    if (_gr_inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    grcat = _gr_awklib "grcat"
+    while ((grcat | getline) > 0) @{
+        if ($1 in _gr_byname)
+            _gr_byname[$1] = _gr_byname[$1] "," $4
+        else
+            _gr_byname[$1] = $0
+        if ($3 in _gr_bygid)
+            _gr_bygid[$3] = _gr_bygid[$3] "," $4
+        else
+            _gr_bygid[$3] = $0
+
+        n = split($4, a, "[ \t]*,[ \t]*")
+        for (i = 1; i <= n; i++)
+            if (a[i] in _gr_groupsbyuser)
+                _gr_groupsbyuser[a[i]] = _gr_groupsbyuser[a[i]] " " $1
+            else
+                _gr_groupsbyuser[a[i]] = $1
+
+        _gr_bycount[++_gr_count] = $0
+    @}
+    close(grcat)
+    _gr_count = 0
+    _gr_inited++
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+@}
+@c endfile
+@end example
+
+The @code{BEGIN} rule sets a private variable to the directory where
+@command{grcat} is stored.  Because it is used to help out an @command{awk} library
+routine, we have chosen to put it in @file{/usr/local/libexec/awk}.  You might
+want it to be in a different directory on your system.
+
+These routines follow the same general outline as the user database routines
+(@pxref{Passwd Functions}).
+The @code{@w{_gr_inited}} variable is used to
+ensure that the database is scanned no more than once.
+The @code{@w{_gr_init()}} function first saves @code{FS},
+@code{RS}, and
+@code{$0}, and then sets @code{FS} and @code{RS} to the correct values for
+scanning the group information.
+It also takes care to note whether @code{FIELDWIDTHS} or @code{FPAT}
+is being used, and to restore the appropriate field-splitting mechanism.
+
+The group information is stored in several associative arrays.
+The arrays are indexed by group name (@code{@w{_gr_byname}}), by group ID number
+(@code{@w{_gr_bygid}}), and by position in the database (@code{@w{_gr_bycount}}).
+There is an additional array indexed by username (@code{@w{_gr_groupsbyuser}}),
+which is a space-separated list of groups to which each user belongs.
+
+Unlike in the user database, it is possible to have multiple records in the
+database for the same group.  This is common when a group has a large number
+of members.  A pair of such entries might look like the following:
+
+@example
+tvpeople:*:101:johnny,jay,arsenio
+tvpeople:*:101:david,conan,tom,joan
+@end example
+
+For this reason, @code{_gr_init()} looks to see if a group name or
+group ID number is already seen.  If so, the usernames are
+simply concatenated onto the previous list of users.@footnote{There is a
+subtle problem with the code just presented.  Suppose that
+the first time there were no names. This code adds the names with
+a leading comma. It also doesn't check that there is a @code{$4}.}
+
+Finally, @code{_gr_init()} closes the pipeline to @command{grcat}, restores
+@code{FS} (and @code{FIELDWIDTHS} or @code{FPAT}, if necessary), @code{RS}, and @code{$0},
+initializes @code{_gr_count} to zero
+(it is used later), and makes @code{_gr_inited} nonzero.
+
+@cindex @code{getgrnam()} function (C library)
+The @code{getgrnam()} function takes a group name as its argument, and if that
+group exists, it is returned.
+Otherwise, it
+relies on the array reference to a nonexistent
+element to create the element with the null string as its value:
+
+@cindex @code{getgrnam()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+function getgrnam(group)
+@{
+    _gr_init()
+    return _gr_byname[group]
+@}
+@c endfile
+@end example
+
+@cindex @code{getgrgid()} function (C library)
+The @code{getgrgid()} function is similar; it takes a numeric group ID and
+looks up the information associated with that group ID:
+
+@cindex @code{getgrgid()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+function getgrgid(gid)
+@{
+    _gr_init()
+    return _gr_bygid[gid]
+@}
+@c endfile
+@end example
+
+@cindex @code{getgruser()} function (C library)
+The @code{getgruser()} function does not have a C counterpart. It takes a
+username and returns the list of groups that have the user as a member:
+
+@cindex @code{getgruser()} function, user-defined
+@example
+@c file eg/lib/groupawk.in
+function getgruser(user)
+@{
+    _gr_init()
+    return _gr_groupsbyuser[user]
+@}
+@c endfile
+@end example
+
+@cindex @code{getgrent()} function (C library)
+The @code{getgrent()} function steps through the database one entry at a time.
+It uses @code{_gr_count} to track its position in the list:
+
+@cindex @code{getgrent()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+function getgrent()
+@{
+    _gr_init()
+    if (++_gr_count in _gr_bycount)
+        return _gr_bycount[_gr_count]
+@group
+    return ""
+@}
+@end group
+@c endfile
+@end example
+
+@cindex @code{endgrent()} function (C library)
+The @code{endgrent()} function resets @code{_gr_count} to zero so that @code{getgrent()} can
+start over again:
+
+@cindex @code{endgrent()} user-defined function
+@example
+@c file eg/lib/groupawk.in
+function endgrent()
+@{
+    _gr_count = 0
+@}
+@c endfile
+@end example
+
+As with the user database routines, each function calls @code{_gr_init()} to
+initialize the arrays.  Doing so only incurs the extra overhead of running
+@command{grcat} if these functions are used (as opposed to moving the body of
+@code{_gr_init()} into a @code{BEGIN} rule).
+
+Most of the work is in scanning the database and building the various
+associative arrays.  The functions that the user calls are themselves very
+simple, relying on @command{awk}'s associative arrays to do work.
+
+The @command{id} program in @ref{Id Program}
+uses these functions.
+
+@node Walking Arrays
+@section Traversing Arrays of Arrays
+
+@ref{Arrays of Arrays} described how @command{gawk}
+provides arrays of arrays.  In particular, any element of
+an array may be either a scalar or another array. The
+@code{isarray()} function (@pxref{Type Functions})
+lets you distinguish an array
+from a scalar.
+The following function, @code{walk_array()}, recursively traverses
+an array, printing the element indices and values.
+You call it with the array and a string representing the name
+of the array:
+
+@cindex @code{walk_array()} user-defined function
+@example
+@c file eg/lib/walkarray.awk
+function walk_array(arr, name,      i)
+@{
+    for (i in arr) @{
+        if (isarray(arr[i]))
+            walk_array(arr[i], (name "[" i "]"))
+        else
+            printf("%s[%s] = %s\n", name, i, arr[i])
+    @}
+@}
+@c endfile
+@end example
+
+@noindent
+It works by looping over each element of the array. If any given
+element is itself an array, the function calls itself recursively,
+passing the subarray and a new string representing the current index.
+Otherwise, the function simply prints the element's name, index, and value.
+Here is a main program to demonstrate:
+
+@example
+BEGIN @{
+    a[1] = 1
+    a[2][1] = 21
+    a[2][2] = 22
+    a[3] = 3
+    a[4][1][1] = 411
+    a[4][2] = 42
+
+    walk_array(a, "a")
+@}
+@end example
+
+When run, the program produces the following output:
+
+@example
+$ @kbd{gawk -f walk_array.awk}
+@print{} a[1] = 1
+@print{} a[2][1] = 21
+@print{} a[2][2] = 22
+@print{} a[3] = 3
+@print{} a[4][1][1] = 411
+@print{} a[4][2] = 42
+@end example
+
+The function just presented simply prints the
+name and value of each scalar array element. However, it is easy to
+generalize it, by passing in the name of a function to call
+when walking an array. The modified function looks like this:
+
+@example
+@c file eg/lib/processarray.awk
+function process_array(arr, name, process, do_arrays,   i, new_name)
+@{
+    for (i in arr) @{
+        new_name = (name "[" i "]")
+        if (isarray(arr[i])) @{
+            if (do_arrays)
+                @@process(new_name, arr[i])
+            process_array(arr[i], new_name, process, do_arrays)
+        @} else
+            @@process(new_name, arr[i])
+    @}
+@}
+@c endfile
+@end example
+
+The arguments are as follows:
+
+@table @code
+@item arr
+The array.
+
+@item name
+The name of the array (a string).
+
+@item process
+The name of the function to call.
+
+@item do_arrays
+If this is true, the function can handle elements that are subarrays.
+@end table
+
+If subarrays are to be processed, that is done before walking them further.
+
+When run with the following scaffolding, the function produces the same
+results as does the earlier version of @code{walk_array()}:
+
+@example
+BEGIN @{
+    a[1] = 1
+    a[2][1] = 21
+    a[2][2] = 22
+    a[3] = 3
+    a[4][1][1] = 411
+    a[4][2] = 42
+
+    process_array(a, "a", "do_print", 0)
+@}
+
+function do_print(name, element)
+@{
+    printf "%s = %s\n", name, element
+@}
+@end example
+
+@node Library Functions Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Reading programs is an excellent way to learn Good Programming.
+The functions and programs provided in this @value{CHAPTER} and the next
+are intended to serve that purpose.
+
+@item
+When writing general-purpose library functions, put some thought into how
+to name any global variables so that they won't conflict with variables
+from a user's program.
+
+@item
+The functions presented here fit into the following categories:
+
+@c nested list
+@table @asis
+@item General problems
+Number-to-string conversion, testing assertions, rounding, random number
+generation, converting characters to numbers, joining strings, getting
+easily usable time-of-day information, and reading a whole file in
+one shot
+
+@item Managing @value{DF}s
+Noting @value{DF} boundaries, rereading the current file, checking for
+readable files, checking for zero-length files, and treating assignments
+as @value{FN}s
+
+@item Processing command-line options
+An @command{awk} version of the standard C @code{getopt()} function
+
+@item Reading the user and group databases
+Two sets of routines that parallel the C library versions
+
+@item Traversing arrays of arrays
+Two functions that traverse an array of arrays to any depth
+@end table
+@c end nested list
+
+@end itemize
+
+@c EXCLUDE START
+@node Library Exercises
+@section Exercises
+
+@enumerate
+@item
+In @ref{Empty Files}, we presented the @file{zerofile.awk} program,
+which made use of @command{gawk}'s @code{ARGIND} variable.  Can this
+problem be solved without relying on @code{ARGIND}?  If so, how?
+
+@ignore
+# zerofile2.awk --- same thing, portably
+
+BEGIN @{
+    ARGIND = Argind = 0
+    for (i = 1; i < ARGC; i++)
+        Fnames[ARGV[i]]++
+
+@}
+FNR == 1 @{
+    while (ARGV[ARGIND] != FILENAME)
+        ARGIND++
+    Seen[FILENAME]++
+    if (Seen[FILENAME] == Fnames[FILENAME])
+        do
+            ARGIND++
+        while (ARGV[ARGIND] != FILENAME)
+@}
+ARGIND > Argind + 1 @{
+    for (Argind++; Argind < ARGIND; Argind++)
+        zerofile(ARGV[Argind], Argind)
+@}
+ARGIND != Argind @{
+    Argind = ARGIND
+@}
+END @{
+    if (ARGIND < ARGC - 1)
+        ARGIND = ARGC - 1
+    if (ARGIND > Argind)
+        for (Argind++; Argind <= ARGIND; Argind++)
+            zerofile(ARGV[Argind], Argind)
+@}
+@end ignore
+
+@item
+As a related challenge, revise that code to handle the case where
+an intervening value in @code{ARGV} is a variable assignment.
+
+@ignore
+@c June 13 2015: Antonio points out that this is answered in the text. Ooops.
+@item
+@ref{Walking Arrays} presented a function that walked a multidimensional
+array to print it out.  However, walking an array and processing
+each element is a general-purpose operation.  Generalize the
+@code{walk_array()} function by adding an additional parameter named
+@code{process}.
+
+Then, inside the loop, instead of printing the array element's index and
+value, use the indirect function call syntax (@pxref{Indirect Calls})
+on @code{process}, passing it the index and the value.
+
+When calling @code{walk_array()}, you would pass the name of a
+user-defined function that expects to receive an index and a value,
+and then processes the element.
+
+Test your new version by printing the array; you should end up with
+output identical to that of the original version.
+@end ignore
+
+@end enumerate
+@c EXCLUDE END
+
+
+@node Sample Programs
+@chapter Practical @command{awk} Programs
+@cindex @command{awk} programs, examples of
+
+@c FULLXREF ON
+@ref{Library Functions},
+presents the idea that reading programs in a language contributes to
+learning that language.  This @value{CHAPTER} continues that theme,
+presenting a potpourri of @command{awk} programs for your reading
+enjoyment.
+@c FULLXREF OFF
+@ifnotinfo
+There are three @value{SECTION}s.
+The first describes how to run the programs presented
+in this @value{CHAPTER}.
+
+The second presents @command{awk}
+versions of several common POSIX utilities.
+These are programs that you are hopefully already familiar with,
+and therefore whose problems are understood.
+By reimplementing these programs in @command{awk},
+you can focus on the @command{awk}-related aspects of solving
+the programming problems.
+
+The third is a grab bag of interesting programs.
+These solve a number of different data-manipulation and management
+problems.  Many of the programs are short, which emphasizes @command{awk}'s
+ability to do a lot in just a few lines of code.
+@end ifnotinfo
+
+Many of these programs use library functions presented in
+@ref{Library Functions}.
+
+@menu
+* Running Examples::            How to run these examples.
+* Clones::                      Clones of common utilities.
+* Miscellaneous Programs::      Some interesting @command{awk} programs.
+* Programs Summary::            Summary of programs.
+* Programs Exercises::          Exercises.
+@end menu
+
+@node Running Examples
+@section Running the Example Programs
+
+To run a given program, you would typically do something like this:
+
+@example
+awk -f @var{program} -- @var{options} @var{files}
+@end example
+
+@noindent
+Here, @var{program} is the name of the @command{awk} program (such as
+@file{cut.awk}), @var{options} are any command-line options for the
+program that start with a @samp{-}, and @var{files} are the actual @value{DF}s.
+
+If your system supports the @samp{#!} executable interpreter mechanism
+(@pxref{Executable Scripts}),
+you can instead run your program directly:
+
+@example
+cut.awk -c1-8 myfiles > results
+@end example
+
+If your @command{awk} is not @command{gawk}, you may instead need to use this:
+
+@example
+cut.awk -- -c1-8 myfiles > results
+@end example
+
+@node Clones
+@section Reinventing Wheels for Fun and Profit
+@cindex POSIX, programs@comma{} implementing in @command{awk}
+
+This @value{SECTION} presents a number of POSIX utilities implemented in
+@command{awk}.  Reinventing these programs in @command{awk} is often enjoyable,
+because the algorithms can be very clearly expressed, and the code is usually
+very concise and simple.  This is true because @command{awk} does so much for you.
+
+It should be noted that these programs are not necessarily intended to
+replace the installed versions on your system.
+Nor may all of these programs be fully compliant with the most recent
+POSIX standard.  This is not a problem; their
+purpose is to illustrate @command{awk} language programming for ``real-world''
+tasks.
+
+The programs are presented in alphabetical order.
+
+@menu
+* Cut Program::                 The @command{cut} utility.
+* Egrep Program::               The @command{egrep} utility.
+* Id Program::                  The @command{id} utility.
+* Split Program::               The @command{split} utility.
+* Tee Program::                 The @command{tee} utility.
+* Uniq Program::                The @command{uniq} utility.
+* Wc Program::                  The @command{wc} utility.
+@end menu
+
+@node Cut Program
+@subsection Cutting Out Fields and Columns
+
+@cindex @command{cut} utility
+@cindex @command{cut} utility
+@cindex fields, cutting
+@cindex columns, cutting
+The @command{cut} utility selects, or ``cuts,'' characters or fields
+from its standard input and sends them to its standard output.
+Fields are separated by TABs by default,
+but you may supply a command-line option to change the field
+@dfn{delimiter} (i.e., the field-separator character). @command{cut}'s
+definition of fields is less general than @command{awk}'s.
+
+A common use of @command{cut} might be to pull out just the login names of
+logged-on users from the output of @command{who}.  For example, the following
+pipeline generates a sorted, unique list of the logged-on users:
+
+@example
+who | cut -c1-8 | sort | uniq
+@end example
+
+The options for @command{cut} are:
+
+@table @code
+@item -c @var{list}
+Use @var{list} as the list of characters to cut out.  Items within the list
+may be separated by commas, and ranges of characters can be separated with
+dashes.  The list @samp{1-8,15,22-35} specifies characters 1 through
+8, 15, and 22 through 35.
+
+@item -f @var{list}
+Use @var{list} as the list of fields to cut out.
+
+@item -d @var{delim}
+Use @var{delim} as the field-separator character instead of the TAB
+character.
+
+@item -s
+Suppress printing of lines that do not contain the field delimiter.
+@end table
+
+The @command{awk} implementation of @command{cut} uses the @code{getopt()} library
+function (@pxref{Getopt Function})
+and the @code{join()} library function
+(@pxref{Join Function}).
+
+The program begins with a comment describing the options, the library
+functions needed, and a @code{usage()} function that prints out a usage
+message and exits.  @code{usage()} is called if invalid arguments are
+supplied:
+
+@cindex @code{cut.awk} program
+@example
+@c file eg/prog/cut.awk
+# cut.awk --- implement cut in awk
+@c endfile
+@ignore
+@c file eg/prog/cut.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/cut.awk
+
+# Options:
+#    -f list     Cut fields
+#    -d c        Field delimiter character
+#    -c list     Cut characters
+#
+#    -s          Suppress lines without the delimiter
+#
+# Requires getopt() and join() library functions
+
+@group
+function usage()
+@{
+    print("usage: cut [-f list] [-d c] [-s] [files...]") > "/dev/stderr"
+    print("usage: cut [-c list] [files...]") > "/dev/stderr"
+    exit 1
+@}
+@end group
+@c endfile
+@end example
+
+@cindex @code{BEGIN} pattern, running @command{awk} programs and
+@cindex @code{FS} variable, running @command{awk} programs and
+Next comes a @code{BEGIN} rule that parses the command-line options.
+It sets @code{FS} to a single TAB character, because that is @command{cut}'s
+default field separator. The rule then sets the output field separator to be the
+same as the input field separator.  A loop using @code{getopt()} steps
+through the command-line options.  Exactly one of the variables
+@code{by_fields} or @code{by_chars} is set to true, to indicate that
+processing should be done by fields or by characters, respectively.
+When cutting by characters, the output field separator is set to the null
+string:
+
+@example
+@c file eg/prog/cut.awk
+BEGIN @{
+    FS = "\t"    # default
+    OFS = FS
+    while ((c = getopt(ARGC, ARGV, "sf:c:d:")) != -1) @{
+        if (c == "f") @{
+            by_fields = 1
+            fieldlist = Optarg
+        @} else if (c == "c") @{
+            by_chars = 1
+            fieldlist = Optarg
+            OFS = ""
+        @} else if (c == "d") @{
+            if (length(Optarg) > 1) @{
+                printf("cut: using first character of %s" \
+                       " for delimiter\n", Optarg) > "/dev/stderr"
+                Optarg = substr(Optarg, 1, 1)
+            @}
+            fs = FS = Optarg
+            OFS = FS
+            if (FS == " ")    # defeat awk semantics
+                FS = "[ ]"
+        @} else if (c == "s")
+            suppress = 1
+        else
+            usage()
+    @}
+
+    # Clear out options
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+@c endfile
+@end example
+
+@cindex field separators, spaces as
+The code must take
+special care when the field delimiter is a space.  Using
+a single space (@code{@w{" "}}) for the value of @code{FS} is
+incorrect---@command{awk} would separate fields with runs of spaces,
+TABs, and/or newlines, and we want them to be separated with individual
+spaces.
+To this end, we save the original space character in the variable
+@code{fs} for later use; after setting @code{FS} to @code{"[ ]"} we can't
+use it directly to see if the field delimiter character is in the string.
+
+Also remember that after @code{getopt()} is through
+(as described in @ref{Getopt Function}),
+we have to
+clear out all the elements of @code{ARGV} from 1 to @code{Optind},
+so that @command{awk} does not try to process the command-line options
+as @value{FN}s.
+
+After dealing with the command-line options, the program verifies that the
+options make sense.  Only one or the other of @option{-c} and @option{-f}
+should be used, and both require a field list.  Then the program calls
+either @code{set_fieldlist()} or @code{set_charlist()} to pull apart the
+list of fields or characters:
+
+@example
+@c file eg/prog/cut.awk
+    if (by_fields && by_chars)
+        usage()
+
+    if (by_fields == 0 && by_chars == 0)
+        by_fields = 1    # default
+
+@group
+    if (fieldlist == "") @{
+        print "cut: needs list for -c or -f" > "/dev/stderr"
+        exit 1
+    @}
+@end group
+
+    if (by_fields)
+        set_fieldlist()
+    else
+        set_charlist()
+@}
+@c endfile
+@end example
+
+@code{set_fieldlist()} splits the field list apart at the commas
+into an array.  Then, for each element of the array, it looks to
+see if the element is actually a range, and if so, splits it apart.
+The function checks the range
+to make sure that the first number is smaller than the second.
+Each number in the list is added to the @code{flist} array, which
+simply lists the fields that will be printed.  Normal field splitting
+is used.  The program lets @command{awk} handle the job of doing the
+field splitting:
+
+@example
+@c file eg/prog/cut.awk
+function set_fieldlist(        n, m, i, j, k, f, g)
+@{
+    n = split(fieldlist, f, ",")
+    j = 1    # index in flist
+    for (i = 1; i <= n; i++) @{
+        if (index(f[i], "-") != 0) @{ # a range
+            m = split(f[i], g, "-")
+@group
+            if (m != 2 || g[1] >= g[2]) @{
+                printf("cut: bad field list: %s\n",
+                                  f[i]) > "/dev/stderr"
+                exit 1
+            @}
+@end group
+            for (k = g[1]; k <= g[2]; k++)
+                flist[j++] = k
+        @} else
+            flist[j++] = f[i]
+    @}
+    nfields = j - 1
+@}
+@c endfile
+@end example
+
+The @code{set_charlist()} function is more complicated than
+@code{set_fieldlist()}.
+The idea here is to use @command{gawk}'s @code{FIELDWIDTHS} variable
+(@pxref{Constant Size}),
+which describes constant-width input.  When using a character list, that is
+exactly what we have.
+
+Setting up @code{FIELDWIDTHS} is more complicated than simply listing the
+fields that need to be printed.  We have to keep track of the fields to
+print and also the intervening characters that have to be skipped.
+For example, suppose you wanted characters 1 through 8, 15, and
+22 through 35.  You would use @samp{-c 1-8,15,22-35}.  The necessary value
+for @code{FIELDWIDTHS} is @code{@w{"8 6 1 6 14"}}.  This yields five
+fields, and the fields to print
+are @code{$1}, @code{$3}, and @code{$5}.
+The intermediate fields are @dfn{filler},
+which is stuff in between the desired data.
+@code{flist} lists the fields to print, and @code{t} tracks the
+complete field list, including filler fields:
+
+@example
+@c file eg/prog/cut.awk
+function set_charlist(    field, i, j, f, g, n, m, t,
+                          filler, last, len)
+@{
+    field = 1   # count total fields
+    n = split(fieldlist, f, ",")
+    j = 1       # index in flist
+    for (i = 1; i <= n; i++) @{
+        if (index(f[i], "-") != 0) @{ # range
+            m = split(f[i], g, "-")
+            if (m != 2 || g[1] >= g[2]) @{
+                printf("cut: bad character list: %s\n",
+                               f[i]) > "/dev/stderr"
+                exit 1
+            @}
+            len = g[2] - g[1] + 1
+            if (g[1] > 1)  # compute length of filler
+                filler = g[1] - last - 1
+            else
+                filler = 0
+@group
+            if (filler)
+                t[field++] = filler
+@end group
+            t[field++] = len  # length of field
+            last = g[2]
+            flist[j++] = field - 1
+        @} else @{
+            if (f[i] > 1)
+                filler = f[i] - last - 1
+            else
+                filler = 0
+            if (filler)
+                t[field++] = filler
+            t[field++] = 1
+            last = f[i]
+            flist[j++] = field - 1
+        @}
+    @}
+    FIELDWIDTHS = join(t, 1, field - 1)
+    nfields = j - 1
+@}
+@c endfile
+@end example
+
+Next is the rule that processes the data.  If the @option{-s} option
+is given, then @code{suppress} is true.  The first @code{if} statement
+makes sure that the input record does have the field separator.  If
+@command{cut} is processing fields, @code{suppress} is true, and the field
+separator character is not in the record, then the record is skipped.
+
+If the record is valid, then @command{gawk} has split the data
+into fields, either using the character in @code{FS} or using fixed-length
+fields and @code{FIELDWIDTHS}.  The loop goes through the list of fields
+that should be printed.  The corresponding field is printed if it contains data.
+If the next field also has data, then the separator character is
+written out between the fields:
+
+@example
+@c file eg/prog/cut.awk
+@{
+    if (by_fields && suppress && index($0, fs) == 0)
+        next
+
+    for (i = 1; i <= nfields; i++) @{
+        if ($flist[i] != "") @{
+            printf "%s", $flist[i]
+            if (i < nfields && $flist[i+1] != "")
+                printf "%s", OFS
+        @}
+    @}
+    print ""
+@}
+@c endfile
+@end example
+
+This version of @command{cut} relies on @command{gawk}'s @code{FIELDWIDTHS}
+variable to do the character-based cutting.  It is possible in
+other @command{awk} implementations to use @code{substr()}
+(@pxref{String Functions}), but
+it is also extremely painful.
+The @code{FIELDWIDTHS} variable supplies an elegant solution to the problem
+of picking the input line apart by characters.
+
+
+@node Egrep Program
+@subsection Searching for Regular Expressions in Files
+
+@cindex regular expressions, searching for
+@cindex searching, files for regular expressions
+@cindex files, searching for regular expressions
+@cindex @command{egrep} utility
+The @command{egrep} utility searches files for patterns.  It uses regular
+expressions that are almost identical to those available in @command{awk}
+(@pxref{Regexp}).
+You invoke it as follows:
+
+@display
+@command{egrep} [@var{options}] @code{'@var{pattern}'} @var{files} @dots{}
+@end display
+
+The @var{pattern} is a regular expression.  In typical usage, the regular
+expression is quoted to prevent the shell from expanding any of the
+special characters as @value{FN} wildcards.  Normally, @command{egrep}
+prints the lines that matched.  If multiple @value{FN}s are provided on
+the command line, each output line is preceded by the name of the file
+and a colon.
+
+The options to @command{egrep} are as follows:
+
+@table @code
+@item -c
+Print out a count of the lines that matched the pattern, instead of the
+lines themselves.
+
+@item -s
+Be silent.  No output is produced and the exit value indicates whether
+the pattern was matched.
+
+@item -v
+Invert the sense of the test. @command{egrep} prints the lines that do
+@emph{not} match the pattern and exits successfully if the pattern is not
+matched.
+
+@item -i
+Ignore case distinctions in both the pattern and the input data.
+
+@item -l
+Only print (list) the names of the files that matched, not the lines that matched.
+
+@item -e @var{pattern}
+Use @var{pattern} as the regexp to match.  The purpose of the @option{-e}
+option is to allow patterns that start with a @samp{-}.
+@end table
+
+This version uses the @code{getopt()} library function
+(@pxref{Getopt Function})
+and the file transition library program
+(@pxref{Filetrans Function}).
+
+The program begins with a descriptive comment and then a @code{BEGIN} rule
+that processes the command-line arguments with @code{getopt()}.  The @option{-i}
+(ignore case) option is particularly easy with @command{gawk}; we just use the
+@code{IGNORECASE} predefined variable
+(@pxref{Built-in Variables}):
+
+@cindex @code{egrep.awk} program
+@example
+@c file eg/prog/egrep.awk
+# egrep.awk --- simulate egrep in awk
+#
+@c endfile
+@ignore
+@c file eg/prog/egrep.awk
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+
+@c endfile
+@end ignore
+@c file eg/prog/egrep.awk
+# Options:
+#    -c    count of lines
+#    -s    silent - use exit value
+#    -v    invert test, success if no match
+#    -i    ignore case
+#    -l    print filenames only
+#    -e    argument is pattern
+#
+# Requires getopt and file transition library functions
+
+BEGIN @{
+    while ((c = getopt(ARGC, ARGV, "ce:svil")) != -1) @{
+        if (c == "c")
+            count_only++
+        else if (c == "s")
+            no_print++
+        else if (c == "v")
+            invert++
+        else if (c == "i")
+            IGNORECASE = 1
+        else if (c == "l")
+            filenames_only++
+        else if (c == "e")
+            pattern = Optarg
+        else
+            usage()
+    @}
+@c endfile
+@end example
+
+Next comes the code that handles the @command{egrep}-specific behavior. If no
+pattern is supplied with @option{-e}, the first nonoption on the
+command line is used.  The @command{awk} command-line arguments up to @code{ARGV[Optind]}
+are cleared, so that @command{awk} won't try to process them as files.  If no
+files are specified, the standard input is used, and if multiple files are
+specified, we make sure to note this so that the @value{FN}s can precede the
+matched lines in the output:
+
+@example
+@c file eg/prog/egrep.awk
+    if (pattern == "")
+        pattern = ARGV[Optind++]
+
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+    if (Optind >= ARGC) @{
+        ARGV[1] = "-"
+        ARGC = 2
+    @} else if (ARGC - Optind > 1)
+        do_filenames++
+
+#    if (IGNORECASE)
+#        pattern = tolower(pattern)
+@}
+@c endfile
+@end example
+
+The last two lines are commented out, as they are not needed in
+@command{gawk}.  They should be uncommented if you have to use another version
+of @command{awk}.
+
+The next set of lines should be uncommented if you are not using
+@command{gawk}.  This rule translates all the characters in the input line
+into lowercase if the @option{-i} option is specified.@footnote{It
+also introduces a subtle bug;
+if a match happens, we output the translated line, not the original.}
+The rule is
+commented out as it is not necessary with @command{gawk}:
+
+@example
+@c file eg/prog/egrep.awk
+#@{
+#    if (IGNORECASE)
+#        $0 = tolower($0)
+#@}
+@c endfile
+@end example
+
+The @code{beginfile()} function is called by the rule in @file{ftrans.awk}
+when each new file is processed.  In this case, it is very simple; all it
+does is initialize a variable @code{fcount} to zero. @code{fcount} tracks
+how many lines in the current file matched the pattern.
+Naming the parameter @code{junk} shows we know that @code{beginfile()}
+is called with a parameter, but that we're not interested in its value:
+
+@example
+@c file eg/prog/egrep.awk
+function beginfile(junk)
+@{
+    fcount = 0
+@}
+@c endfile
+@end example
+
+The @code{endfile()} function is called after each file has been processed.
+It affects the output only when the user wants a count of the number of lines that
+matched.  @code{no_print} is true only if the exit status is desired.
+@code{count_only} is true if line counts are desired.  @command{egrep}
+therefore only prints line counts if printing and counting are enabled.
+The output format must be adjusted depending upon the number of files to
+process.  Finally, @code{fcount} is added to @code{total}, so that we
+know the total number of lines that matched the pattern:
+
+@example
+@c file eg/prog/egrep.awk
+function endfile(file)
+@{
+    if (! no_print && count_only) @{
+        if (do_filenames)
+            print file ":" fcount
+        else
+            print fcount
+    @}
+
+@group
+    total += fcount
+@}
+@end group
+@c endfile
+@end example
+
+The @code{BEGINFILE} and @code{ENDFILE} special patterns
+(@pxref{BEGINFILE/ENDFILE}) could be used, but then the program would be
+@command{gawk}-specific. Additionally, this example was written before
+@command{gawk} acquired @code{BEGINFILE} and @code{ENDFILE}.
+
+The following rule does most of the work of matching lines. The variable
+@code{matches} is true if the line matched the pattern. If the user
+wants lines that did not match, the sense of @code{matches} is inverted
+using the @samp{!} operator. @code{fcount} is incremented with the value of
+@code{matches}, which is either one or zero, depending upon a
+successful or unsuccessful match.  If the line does not match, the
+@code{next} statement just moves on to the next record.
+
+A number of additional tests are made, but they are only done if we
+are not counting lines.  First, if the user only wants the exit status
+(@code{no_print} is true), then it is enough to know that @emph{one}
+line in this file matched, and we can skip on to the next file with
+@code{nextfile}.  Similarly, if we are only printing @value{FN}s, we can
+print the @value{FN}, and then skip to the next file with @code{nextfile}.
+Finally, each line is printed, with a leading @value{FN} and colon
+if necessary:
+
+@cindex @code{!} (exclamation point), @code{!} operator
+@cindex exclamation point (@code{!}), @code{!} operator
+@example
+@c file eg/prog/egrep.awk
+@{
+    matches = ($0 ~ pattern)
+    if (invert)
+        matches = ! matches
+
+    fcount += matches    # 1 or 0
+
+    if (! matches)
+        next
+
+    if (! count_only) @{
+        if (no_print)
+            nextfile
+
+        if (filenames_only) @{
+            print FILENAME
+            nextfile
+        @}
+
+        if (do_filenames)
+            print FILENAME ":" $0
+        else
+            print
+    @}
+@}
+@c endfile
+@end example
+
+The @code{END} rule takes care of producing the correct exit status. If
+there are no matches, the exit status is one; otherwise, it is zero:
+
+@example
+@c file eg/prog/egrep.awk
+END @{
+    exit (total == 0)
+@}
+@c endfile
+@end example
+
+The @code{usage()} function prints a usage message in case of invalid options,
+and then exits:
+
+@example
+@c file eg/prog/egrep.awk
+function usage()
+@{
+    print("Usage: egrep [-csvil] [-e pat] [files ...]") > "/dev/stderr"
+    print("\n\tegrep [-csvil] pat [files ...]") > "/dev/stderr"
+    exit 1
+@}
+@c endfile
+@end example
+
+
+@node Id Program
+@subsection Printing Out User Information
+
+@cindex printing, user information
+@cindex users, information about, printing
+@cindex @command{id} utility
+The @command{id} utility lists a user's real and effective user ID numbers,
+real and effective group ID numbers, and the user's group set, if any.
+@command{id} only prints the effective user ID and group ID if they are
+different from the real ones.  If possible, @command{id} also supplies the
+corresponding user and group names.  The output might look like this:
+
+@example
+$ @kbd{id}
+@print{} uid=1000(arnold) gid=1000(arnold) groups=1000(arnold),4(adm),7(lp),27(sudo)
+@end example
+
+@cindex @code{PROCINFO} array, user and group ID numbers and
+This information is part of what is provided by @command{gawk}'s
+@code{PROCINFO} array (@pxref{Built-in Variables}).
+However, the @command{id} utility provides a more palatable output than just
+individual numbers.
+
+Here is a simple version of @command{id} written in @command{awk}.
+It uses the user database library functions
+(@pxref{Passwd Functions})
+and the group database library functions
+(@pxref{Group Functions})
+from @ref{Library Functions}.
+
+The program is fairly straightforward.  All the work is done in the
+@code{BEGIN} rule.  The user and group ID numbers are obtained from
+@code{PROCINFO}.
+The code is repetitive.  The entry in the user database for the real user ID
+number is split into parts at the @samp{:}. The name is the first field.
+Similar code is used for the effective user ID number and the group
+numbers:
+
+@cindex @code{id.awk} program
+@example
+@c file eg/prog/id.awk
+# id.awk --- implement id in awk
+#
+# Requires user and group library functions
+@c endfile
+@ignore
+@c file eg/prog/id.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised February 1996
+# Revised May 2014
+# Revised September 2014
+
+@c endfile
+@end ignore
+@c file eg/prog/id.awk
+# output is:
+# uid=12(foo) euid=34(bar) gid=3(baz) \
+#             egid=5(blat) groups=9(nine),2(two),1(one)
+
+@group
+BEGIN @{
+    uid = PROCINFO["uid"]
+    euid = PROCINFO["euid"]
+    gid = PROCINFO["gid"]
+    egid = PROCINFO["egid"]
+@end group
+
+    printf("uid=%d", uid)
+    pw = getpwuid(uid)
+    pr_first_field(pw)
+
+@group
+    if (euid != uid) @{
+        printf(" euid=%d", euid)
+        pw = getpwuid(euid)
+@end group
+@group
+        pr_first_field(pw)
+    @}
+@end group
+
+    printf(" gid=%d", gid)
+    pw = getgrgid(gid)
+    pr_first_field(pw)
+
+    if (egid != gid) @{
+        printf(" egid=%d", egid)
+        pw = getgrgid(egid)
+        pr_first_field(pw)
+    @}
+
+    for (i = 1; ("group" i) in PROCINFO; i++) @{
+        if (i == 1)
+            printf(" groups=")
+        group = PROCINFO["group" i]
+        printf("%d", group)
+        pw = getgrgid(group)
+        pr_first_field(pw)
+        if (("group" (i+1)) in PROCINFO)
+            printf(",")
+    @}
+
+    print ""
+@}
+
+function pr_first_field(str,  a)
+@{
+    if (str != "") @{
+        split(str, a, ":")
+        printf("(%s)", a[1])
+    @}
+@}
+@c endfile
+@end example
+
+The test in the @code{for} loop is worth noting.
+Any supplementary groups in the @code{PROCINFO} array have the
+indices @code{"group1"} through @code{"group@var{N}"} for some
+@var{N} (i.e., the total number of supplementary groups).
+However, we don't know in advance how many of these groups
+there are.
+
+This loop works by starting at one, concatenating the value with
+@code{"group"}, and then using @code{in} to see if that value is
+in the array (@pxref{Reference to Elements}).  Eventually, @code{i} is incremented past
+the last group in the array and the loop exits.
+
+The loop is also correct if there are @emph{no} supplementary
+groups; then the condition is false the first time it's
+tested, and the loop body never executes.
+
+The @code{pr_first_field()} function simply isolates out some
+code that is used repeatedly, making the whole program
+shorter and cleaner. In particular, moving the check for
+the empty string into this function saves several lines of code.
+
+
+@node Split Program
+@subsection Splitting a Large File into Pieces
+
+@c FIXME: One day, update to current POSIX version of split
+
+@cindex files, splitting
+@cindex @code{split} utility
+The @command{split} program splits large text files into smaller pieces.
+Usage is as follows:@footnote{This is the traditional usage. The
+POSIX usage is different, but not relevant for what the program
+aims to demonstrate.}
+
+@display
+@command{split} [@code{-@var{count}}] [@var{file}] [@var{prefix}]
+@end display
+
+By default,
+the output files are named @file{xaa}, @file{xab}, and so on. Each file has
+1,000 lines in it, with the likely exception of the last file. To change the
+number of lines in each file, supply a number on the command line
+preceded with a minus sign (e.g., @samp{-500} for files with 500 lines in them
+instead of 1,000).  To change the names of the output files to something like
+@file{myfileaa}, @file{myfileab}, and so on, supply an additional
+argument that specifies the @value{FN} prefix.
+
+Here is a version of @command{split} in @command{awk}. It uses the
+@code{ord()} and @code{chr()} functions presented in
+@ref{Ordinal Functions}.
+
+The program first sets its defaults, and then tests to make sure there are
+not too many arguments.  It then looks at each argument in turn.  The
+first argument could be a minus sign followed by a number. If it is, this happens
+to look like a negative number, so it is made positive, and that is the
+count of lines.  The @value{DF} name is skipped over and the final argument
+is used as the prefix for the output @value{FN}s:
+
+@cindex @code{split.awk} program
+@example
+@c file eg/prog/split.awk
+# split.awk --- do split in awk
+#
+# Requires ord() and chr() library functions
+@c endfile
+@ignore
+@c file eg/prog/split.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised slightly, May 2014
+
+@c endfile
+@end ignore
+@c file eg/prog/split.awk
+# usage: split [-count] [file] [outname]
+
+BEGIN @{
+    outfile = "x"    # default
+    count = 1000
+    if (ARGC > 4)
+        usage()
+
+    i = 1
+    if (i in ARGV && ARGV[i] ~ /^-[[:digit:]]+$/) @{
+        count = -ARGV[i]
+        ARGV[i] = ""
+        i++
+    @}
+    # test argv in case reading from stdin instead of file
+    if (i in ARGV)
+        i++    # skip datafile name
+@group
+    if (i in ARGV) @{
+        outfile = ARGV[i]
+        ARGV[i] = ""
+    @}
+@end group
+@group
+    s1 = s2 = "a"
+    out = (outfile s1 s2)
+@}
+@end group
+@c endfile
+@end example
+
+The next rule does most of the work. @code{tcount} (temporary count) tracks
+how many lines have been printed to the output file so far. If it is greater
+than @code{count}, it is time to close the current file and start a new one.
+@code{s1} and @code{s2} track the current suffixes for the @value{FN}. If
+they are both @samp{z}, the file is just too big.  Otherwise, @code{s1}
+moves to the next letter in the alphabet and @code{s2} starts over again at
+@samp{a}:
+
+@c else on separate line here for page breaking
+@example
+@c file eg/prog/split.awk
+@{
+    if (++tcount > count) @{
+        close(out)
+        if (s2 == "z") @{
+            if (s1 == "z") @{
+                printf("split: %s is too large to split\n",
+                       FILENAME) > "/dev/stderr"
+                exit 1
+            @}
+            s1 = chr(ord(s1) + 1)
+            s2 = "a"
+        @}
+@group
+        else
+            s2 = chr(ord(s2) + 1)
+@end group
+        out = (outfile s1 s2)
+        tcount = 1
+    @}
+    print > out
+@}
+@c endfile
+@end example
+
+@noindent
+The @code{usage()} function simply prints an error message and exits:
+
+@example
+@c file eg/prog/split.awk
+function usage()
+@{
+    print("usage: split [-num] [file] [outname]") > "/dev/stderr"
+    exit 1
+@}
+@c endfile
+@end example
+
+This program is a bit sloppy; it relies on @command{awk} to automatically close the last file
+instead of doing it in an @code{END} rule.
+It also assumes that letters are contiguous in the character set,
+which isn't true for EBCDIC systems.
+
+@ifset FOR_PRINT
+You might want to consider how to eliminate the use of
+@code{ord()} and @code{chr()}; this can be done in such a
+way as to solve the EBCDIC issue as well.
+@end ifset
+
+
+@node Tee Program
+@subsection Duplicating Output into Multiple Files
+
+@cindex files, multiple@comma{} duplicating output into
+@cindex output, duplicating into files
+@cindex @code{tee} utility
+The @code{tee} program is known as a ``pipe fitting.''  @code{tee} copies
+its standard input to its standard output and also duplicates it to the
+files named on the command line.  Its usage is as follows:
+
+@display
+@command{tee} [@option{-a}] @var{file} @dots{}
+@end display
+
+The @option{-a} option tells @code{tee} to append to the named files, instead of
+truncating them and starting over.
+
+The @code{BEGIN} rule first makes a copy of all the command-line arguments
+into an array named @code{copy}.
+@code{ARGV[0]} is not needed, so it is not copied.
+@code{tee} cannot use @code{ARGV} directly, because @command{awk} attempts to
+process each @value{FN} in @code{ARGV} as input data.
+
+@cindex flag variables
+If the first argument is @option{-a}, then the flag variable
+@code{append} is set to true, and both @code{ARGV[1]} and
+@code{copy[1]} are deleted. If @code{ARGC} is less than two, then no
+@value{FN}s were supplied and @code{tee} prints a usage message and exits.
+Finally, @command{awk} is forced to read the standard input by setting
+@code{ARGV[1]} to @code{"-"} and @code{ARGC} to two:
+
+@cindex @code{tee.awk} program
+@example
+@c file eg/prog/tee.awk
+# tee.awk --- tee in awk
+#
+# Copy standard input to all named output files.
+# Append content if -a option is supplied.
+#
+@c endfile
+@ignore
+@c file eg/prog/tee.awk
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised December 1995
+
+@c endfile
+@end ignore
+@c file eg/prog/tee.awk
+BEGIN @{
+    for (i = 1; i < ARGC; i++)
+        copy[i] = ARGV[i]
+
+    if (ARGV[1] == "-a") @{
+        append = 1
+        delete ARGV[1]
+        delete copy[1]
+        ARGC--
+    @}
+    if (ARGC < 2) @{
+        print "usage: tee [-a] file ..." > "/dev/stderr"
+        exit 1
+    @}
+    ARGV[1] = "-"
+    ARGC = 2
+@}
+@c endfile
+@end example
+
+The following single rule does all the work.  Because there is no pattern, it is
+executed for each line of input.  The body of the rule simply prints the
+line into each file on the command line, and then to the standard output:
+
+@example
+@c file eg/prog/tee.awk
+@{
+    # moving the if outside the loop makes it run faster
+    if (append)
+        for (i in copy)
+            print >> copy[i]
+    else
+        for (i in copy)
+            print > copy[i]
+    print
+@}
+@c endfile
+@end example
+
+@noindent
+It is also possible to write the loop this way:
+
+@example
+@group
+for (i in copy)
+    if (append)
+        print >> copy[i]
+@end group
+@group
+    else
+        print > copy[i]
+@end group
+@end example
+
+@noindent
+This is more concise, but it is also less efficient.  The @samp{if} is
+tested for each record and for each output file.  By duplicating the loop
+body, the @samp{if} is only tested once for each input record.  If there are
+@var{N} input records and @var{M} output files, the first method only
+executes @var{N} @samp{if} statements, while the second executes
+@var{N}@code{*}@var{M} @samp{if} statements.
+
+Finally, the @code{END} rule cleans up by closing all the output files:
+
+@example
+@c file eg/prog/tee.awk
+END @{
+    for (i in copy)
+        close(copy[i])
+@}
+@c endfile
+@end example
+
+@node Uniq Program
+@subsection Printing Nonduplicated Lines of Text
+
+@c FIXME: One day, update to current POSIX version of uniq
+
+@cindex printing, unduplicated lines of text
+@cindex text@comma{} printing, unduplicated lines of
+@cindex @command{uniq} utility
+The @command{uniq} utility reads sorted lines of data on its standard
+input, and by default removes duplicate lines.  In other words, it only
+prints unique lines---hence the name.  @command{uniq} has a number of
+options. The usage is as follows:
+
+@display
+@command{uniq} [@option{-udc} [@code{-@var{n}}]] [@code{+@var{n}}] [@var{inputfile} [@var{outputfile}]]
+@end display
+
+The options for @command{uniq} are:
+
+@table @code
+@item -d
+Print only repeated (duplicated) lines.
+
+@item -u
+Print only nonrepeated (unique) lines.
+
+@item -c
+Count lines. This option overrides @option{-d} and @option{-u}.  Both repeated
+and nonrepeated lines are counted.
+
+@item -@var{n}
+Skip @var{n} fields before comparing lines.  The definition of fields
+is similar to @command{awk}'s default: nonwhitespace characters separated
+by runs of spaces and/or TABs.
+
+@item +@var{n}
+Skip @var{n} characters before comparing lines.  Any fields specified with
+@samp{-@var{n}} are skipped first.
+
+@item @var{inputfile}
+Data is read from the input file named on the command line, instead of from
+the standard input.
+
+@item @var{outputfile}
+The generated output is sent to the named output file, instead of to the
+standard output.
+@end table
+
+Normally @command{uniq} behaves as if both the @option{-d} and
+@option{-u} options are provided.
+
+@command{uniq} uses the
+@code{getopt()} library function
+(@pxref{Getopt Function})
+and the @code{join()} library function
+(@pxref{Join Function}).
+
+The program begins with a @code{usage()} function and then a brief outline of
+the options and their meanings in comments.
+The @code{BEGIN} rule deals with the command-line arguments and options. It
+uses a trick to get @code{getopt()} to handle options of the form @samp{-25},
+treating such an option as the option letter @samp{2} with an argument of
+@samp{5}. If indeed two or more digits are supplied (@code{Optarg} looks
+like a number), @code{Optarg} is
+concatenated with the option digit and then the result is added to zero to make
+it into a number.  If there is only one digit in the option, then
+@code{Optarg} is not needed. In this case, @code{Optind} must be decremented so that
+@code{getopt()} processes it next time.  This code is admittedly a bit
+tricky.
+
+If no options are supplied, then the default is taken, to print both
+repeated and nonrepeated lines.  The output file, if provided, is assigned
+to @code{outputfile}.  Early on, @code{outputfile} is initialized to the
+standard output, @file{/dev/stdout}:
+
+@cindex @code{uniq.awk} program
+@example
+@c file eg/prog/uniq.awk
+@group
+# uniq.awk --- do uniq in awk
+#
+# Requires getopt() and join() library functions
+@end group
+@c endfile
+@ignore
+@c file eg/prog/uniq.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/uniq.awk
+
+function usage()
+@{
+    print("Usage: uniq [-udc [-n]] [+n] [ in [ out ]]") > "/dev/stderr"
+    exit 1
+@}
+
+# -c    count lines. overrides -d and -u
+# -d    only repeated lines
+# -u    only nonrepeated lines
+# -n    skip n fields
+# +n    skip n characters, skip fields first
+
+BEGIN @{
+    count = 1
+    outputfile = "/dev/stdout"
+    opts = "udc0:1:2:3:4:5:6:7:8:9:"
+    while ((c = getopt(ARGC, ARGV, opts)) != -1) @{
+        if (c == "u")
+            non_repeated_only++
+        else if (c == "d")
+            repeated_only++
+        else if (c == "c")
+            do_count++
+        else if (index("0123456789", c) != 0) @{
+            # getopt() requires args to options
+            # this messes us up for things like -5
+            if (Optarg ~ /^[[:digit:]]+$/)
+                fcount = (c Optarg) + 0
+            else @{
+                fcount = c + 0
+                Optind--
+            @}
+        @} else
+            usage()
+    @}
+
+@group
+    if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{
+        charcount = substr(ARGV[Optind], 2) + 0
+        Optind++
+    @}
+@end group
+
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+
+    if (repeated_only == 0 && non_repeated_only == 0)
+        repeated_only = non_repeated_only = 1
+
+    if (ARGC - Optind == 2) @{
+        outputfile = ARGV[ARGC - 1]
+        ARGV[ARGC - 1] = ""
+    @}
+@}
+@c endfile
+@end example
+
+The following function, @code{are_equal()}, compares the current line,
+@code{$0}, to the previous line, @code{last}.  It handles skipping fields
+and characters.  If no field count and no character count are specified,
+@code{are_equal()} returns one or zero depending upon the result of a
+simple string comparison of @code{last} and @code{$0}.
+
+Otherwise, things get more complicated.  If fields have to be skipped,
+each line is broken into an array using @code{split()} (@pxref{String
+Functions}); the desired fields are then joined back into a line
+using @code{join()}.  The joined lines are stored in @code{clast} and
+@code{cline}.  If no fields are skipped, @code{clast} and @code{cline}
+are set to @code{last} and @code{$0}, respectively.  Finally, if
+characters are skipped, @code{substr()} is used to strip off the leading
+@code{charcount} characters in @code{clast} and @code{cline}.  The two
+strings are then compared and @code{are_equal()} returns the result:
+
+@example
+@c file eg/prog/uniq.awk
+@group
+function are_equal(    n, m, clast, cline, alast, aline)
+@{
+    if (fcount == 0 && charcount == 0)
+        return (last == $0)
+@end group
+
+    if (fcount > 0) @{
+        n = split(last, alast)
+        m = split($0, aline)
+        clast = join(alast, fcount+1, n)
+        cline = join(aline, fcount+1, m)
+    @} else @{
+        clast = last
+        cline = $0
+    @}
+    if (charcount) @{
+        clast = substr(clast, charcount + 1)
+        cline = substr(cline, charcount + 1)
+    @}
+@group
+
+    return (clast == cline)
+@}
+@end group
+@c endfile
+@end example
+
+The following two rules are the body of the program.  The first one is
+executed only for the very first line of data.  It sets @code{last} equal to
+@code{$0}, so that subsequent lines of text have something to be compared to.
+
+The second rule does the work. The variable @code{equal} is one or zero,
+depending upon the results of @code{are_equal()}'s comparison. If @command{uniq}
+is counting repeated lines, and the lines are equal, then it increments the @code{count} variable.
+Otherwise, it prints the line and resets @code{count},
+because the two lines are not equal.
+
+If @command{uniq} is not counting, and if the lines are equal, @code{count} is incremented.
+Nothing is printed, as the point is to remove duplicates.
+Otherwise, if @command{uniq} is counting repeated lines and more than
+one line is seen, or if @command{uniq} is counting nonrepeated lines
+and only one line is seen, then the line is printed, and @code{count}
+is reset.
+
+Finally, similar logic is used in the @code{END} rule to print the final
+line of input data:
+
+@example
+@c file eg/prog/uniq.awk
+NR == 1 @{
+    last = $0
+    next
+@}
+
+@{
+    equal = are_equal()
+
+    if (do_count) @{    # overrides -d and -u
+        if (equal)
+            count++
+        else @{
+            printf("%4d %s\n", count, last) > outputfile
+            last = $0
+            count = 1    # reset
+        @}
+        next
+    @}
+
+    if (equal)
+        count++
+    else @{
+        if ((repeated_only && count > 1) ||
+            (non_repeated_only && count == 1))
+                print last > outputfile
+        last = $0
+        count = 1
+    @}
+@}
+
+END @{
+    if (do_count)
+        printf("%4d %s\n", count, last) > outputfile
+@group
+    else if ((repeated_only && count > 1) ||
+            (non_repeated_only && count == 1))
+        print last > outputfile
+    close(outputfile)
+@}
+@end group
+@c endfile
+@end example
+
+As a side note, this program does not follow our recommended convention of naming
+global variables with a leading capital letter.  Doing that would
+make the program a little easier to follow.
+
+@ifset FOR_PRINT
+The logic for choosing which lines to print represents a @dfn{state
+machine}, which is ``a device that can be in one of a set number of stable
+conditions depending on its previous condition and on the present values
+of its inputs.''@footnote{This is the definition returned from entering
+@code{define: state machine} into Google.}
+Brian Kernighan suggests that
+``an alternative approach to state machines is to just read
+the input into an array, then use indexing.  It's almost always
+easier code, and for most inputs where you would use this, just
+as fast.''  Consider how to rewrite the logic to follow this
+suggestion.
+@end ifset
+
+
+
+@node Wc Program
+@subsection Counting Things
+
+@c FIXME: One day, update to current POSIX version of wc
+
+@cindex counting
+@cindex input files, counting elements in
+@cindex words, counting
+@cindex characters, counting
+@cindex lines, counting
+@cindex @command{wc} utility
+The @command{wc} (word count) utility counts lines, words, and characters in
+one or more input files. Its usage is as follows:
+
+@display
+@command{wc} [@option{-lwc}] [@var{files} @dots{}]
+@end display
+
+If no files are specified on the command line, @command{wc} reads its standard
+input. If there are multiple files, it also prints total counts for all
+the files.  The options and their meanings are as follows:
+
+@table @code
+@item -l
+Count only lines.
+
+@item -w
+Count only words.
+A ``word'' is a contiguous sequence of nonwhitespace characters, separated
+by spaces and/or TABs.  Luckily, this is the normal way @command{awk} separates
+fields in its input data.
+
+@item -c
+Count only characters.
+@end table
+
+Implementing @command{wc} in @command{awk} is particularly elegant,
+because @command{awk} does a lot of the work for us; it splits lines into
+words (i.e., fields) and counts them, it counts lines (i.e., records),
+and it can easily tell us how long a line is.
+
+This program uses the @code{getopt()} library function
+(@pxref{Getopt Function})
+and the file-transition functions
+(@pxref{Filetrans Function}).
+
+This version has one notable difference from traditional versions of
+@command{wc}: it always prints the counts in the order lines, words,
+and characters.  Traditional versions note the order of the @option{-l},
+@option{-w}, and @option{-c} options on the command line, and print the
+counts in that order.
+
+The @code{BEGIN} rule does the argument processing.  The variable
+@code{print_total} is true if more than one file is named on the
+command line:
+
+@cindex @code{wc.awk} program
+@example
+@c file eg/prog/wc.awk
+# wc.awk --- count lines, words, characters
+@c endfile
+@ignore
+@c file eg/prog/wc.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/wc.awk
+
+# Options:
+#    -l    only count lines
+#    -w    only count words
+#    -c    only count characters
+#
+# Default is to count lines, words, characters
+#
+# Requires getopt() and file transition library functions
+
+BEGIN @{
+    # let getopt() print a message about
+    # invalid options. we ignore them
+    while ((c = getopt(ARGC, ARGV, "lwc")) != -1) @{
+        if (c == "l")
+            do_lines = 1
+        else if (c == "w")
+            do_words = 1
+        else if (c == "c")
+            do_chars = 1
+    @}
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+
+    # if no options, do all
+    if (! do_lines && ! do_words && ! do_chars)
+        do_lines = do_words = do_chars = 1
+
+    print_total = (ARGC - i > 1)
+@}
+@c endfile
+@end example
+
+The @code{beginfile()} function is simple; it just resets the counts of lines,
+words, and characters to zero, and saves the current @value{FN} in
+@code{fname}:
+
+@example
+@c file eg/prog/wc.awk
+function beginfile(file)
+@{
+    lines = words = chars = 0
+    fname = FILENAME
+@}
+@c endfile
+@end example
+
+The @code{endfile()} function adds the current file's numbers to the
+running totals of lines, words, and characters.  It then prints out those
+numbers for the file that was just read. It relies on @code{beginfile()}
+to reset the numbers for the following @value{DF}:
+
+@example
+@c file eg/prog/wc.awk
+function endfile(file)
+@{
+    tlines += lines
+    twords += words
+    tchars += chars
+    if (do_lines)
+        printf "\t%d", lines
+@group
+    if (do_words)
+        printf "\t%d", words
+@end group
+    if (do_chars)
+        printf "\t%d", chars
+    printf "\t%s\n", fname
+@}
+@c endfile
+@end example
+
+There is one rule that is executed for each line. It adds the length of
+the record, plus one, to @code{chars}.@footnote{Because @command{gawk}
+understands multibyte locales, this code counts characters, not bytes.}
+Adding one plus the record length
+is needed because the newline character separating records (the value
+of @code{RS}) is not part of the record itself, and thus not included
+in its length.  Next, @code{lines} is incremented for each line read,
+and @code{words} is incremented by the value of @code{NF}, which is the
+number of ``words'' on this line:
+
+@example
+@c file eg/prog/wc.awk
+# do per line
+@{
+    chars += length($0) + 1    # get newline
+    lines++
+    words += NF
+@}
+@c endfile
+@end example
+
+Finally, the @code{END} rule simply prints the totals for all the files:
+
+@example
+@c file eg/prog/wc.awk
+END @{
+    if (print_total) @{
+        if (do_lines)
+            printf "\t%d", tlines
+        if (do_words)
+            printf "\t%d", twords
+        if (do_chars)
+            printf "\t%d", tchars
+        print "\ttotal"
+    @}
+@}
+@c endfile
+@end example
+
+@node Miscellaneous Programs
+@section A Grab Bag of @command{awk} Programs
+
+This @value{SECTION} is a large ``grab bag'' of miscellaneous programs.
+We hope you find them both interesting and enjoyable.
+
+@menu
+* Dupword Program::             Finding duplicated words in a document.
+* Alarm Program::               An alarm clock.
+* Translate Program::           A program similar to the @command{tr} utility.
+* Labels Program::              Printing mailing labels.
+* Word Sorting::                A program to produce a word usage count.
+* History Sorting::             Eliminating duplicate entries from a history
+                                file.
+* Extract Program::             Pulling out programs from Texinfo source
+                                files.
+* Simple Sed::                  A Simple Stream Editor.
+* Igawk Program::               A wrapper for @command{awk} that includes
+                                files.
+* Anagram Program::             Finding anagrams from a dictionary.
+* Signature Program::           People do amazing things with too much time on
+                                their hands.
+@end menu
+
+@node Dupword Program
+@subsection Finding Duplicated Words in a Document
+
+@cindex words, duplicate@comma{} searching for
+@cindex searching, for words
+@cindex documents@comma{} searching
+A common error when writing large amounts of prose is to accidentally
+duplicate words.  Typically you will see this in text as something like ``the
+the program does the following@dots{}''  When the text is online, often
+the duplicated words occur at the end of one line and the
+@iftex
+the
+@end iftex
+beginning of
+another, making them very difficult to spot.
+@c as here!
+
+This program, @file{dupword.awk}, scans through a file one line at a time
+and looks for adjacent occurrences of the same word.  It also saves the last
+word on a line (in the variable @code{prev}) for comparison with the first
+word on the next line.
+
+@cindex Texinfo
+The first two statements make sure that the line is all lowercase,
+so that, for example, ``The'' and ``the'' compare equal to each other.
+The next statement replaces nonalphanumeric and nonwhitespace characters
+with spaces, so that punctuation does not affect the comparison either.
+The characters are replaced with spaces so that formatting controls
+don't create nonsense words (e.g., the Texinfo @samp{@@code@{NF@}}
+becomes @samp{codeNF} if punctuation is simply deleted).  The record is
+then resplit into fields, yielding just the actual words on the line,
+and ensuring that there are no empty fields.
+
+If there are no fields left after removing all the punctuation, the
+current record is skipped.  Otherwise, the program loops through each
+word, comparing it to the previous one:
+
+@cindex @code{dupword.awk} program
+@example
+@c file eg/prog/dupword.awk
+# dupword.awk --- find duplicate words in text
+@c endfile
+@ignore
+@c file eg/prog/dupword.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# December 1991
+# Revised October 2000
+
+@c endfile
+@end ignore
+@c file eg/prog/dupword.awk
+@{
+    $0 = tolower($0)
+    gsub(/[^[:alnum:][:blank:]]/, " ");
+    $0 = $0         # re-split
+    if (NF == 0)
+        next
+    if ($1 == prev)
+        printf("%s:%d: duplicate %s\n",
+            FILENAME, FNR, $1)
+    for (i = 2; i <= NF; i++)
+        if ($i == $(i-1))
+            printf("%s:%d: duplicate %s\n",
+                FILENAME, FNR, $i)
+    prev = $NF
+@}
+@c endfile
+@end example
+
+@node Alarm Program
+@subsection An Alarm Clock Program
+@cindex insomnia, cure for
+@cindex Robbins, Arnold
+@quotation
+@i{Nothing cures insomnia like a ringing alarm clock.}
+@author Arnold Robbins
+@end quotation
+@cindex Quanstrom, Erik
+@ignore
+Date: Sat, 15 Feb 2014 16:47:09 -0500
+Subject: Re: 9atom install question
+Message-ID: <l2jcvx6j6mey60xnrkb0hhob.1392500829294@email.android.com>
+From: Erik Quanstrom <quanstro@quanstro.net>
+To: Aharon Robbins <arnold@skeeve.com>
+
+yes.
+
+- erik
+
+Aharon Robbins <arnold@skeeve.com> wrote:
+
+>> sleep is for web developers.
+>
+>Can I quote you, in the gawk manual?
+>
+>Thanks,
+>
+>Arnold
+@end ignore
+@quotation
+@i{Sleep is for web developers.}
+@author Erik Quanstrom
+@end quotation
+
+@cindex time, alarm clock example program
+@cindex alarm clock example program
+The following program is a simple ``alarm clock'' program.
+You give it a time of day and an optional message.  At the specified time,
+it prints the message on the standard output. In addition, you can give it
+the number of times to repeat the message as well as a delay between
+repetitions.
+
+This program uses the @code{getlocaltime()} function from
+@ref{Getlocaltime Function}.
+
+All the work is done in the @code{BEGIN} rule.  The first part is argument
+checking and setting of defaults: the delay, the count, and the message to
+print.  If the user supplied a message without the ASCII BEL
+character (known as the ``alert'' character, @code{"\a"}), then it is added to
+the message.  (On many systems, printing the ASCII BEL generates an
+audible alert. Thus, when the alarm goes off, the system calls attention
+to itself in case the user is not looking at the computer.)
+Just for a change, this program uses a @code{switch} statement
+(@pxref{Switch Statement}), but the processing could be done with a series of
+@code{if}-@code{else} statements instead.
+Here is the program:
+
+@cindex @code{alarm.awk} program
+@example
+@c file eg/prog/alarm.awk
+# alarm.awk --- set an alarm
+#
+# Requires getlocaltime() library function
+@c endfile
+@ignore
+@c file eg/prog/alarm.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised December 2010
+
+@c endfile
+@end ignore
+@c file eg/prog/alarm.awk
+# usage: alarm time [ "message" [ count [ delay ] ] ]
+
+BEGIN @{
+    # Initial argument sanity checking
+    usage1 = "usage: alarm time ['message' [count [delay]]]"
+    usage2 = sprintf("\t(%s) time ::= hh:mm", ARGV[1])
+
+    if (ARGC < 2) @{
+        print usage1 > "/dev/stderr"
+        print usage2 > "/dev/stderr"
+        exit 1
+    @}
+    switch (ARGC) @{
+    case 5:
+        delay = ARGV[4] + 0
+        # fall through
+    case 4:
+        count = ARGV[3] + 0
+        # fall through
+    case 3:
+        message = ARGV[2]
+        break
+    default:
+        if (ARGV[1] !~ /[[:digit:]]?[[:digit:]]:[[:digit:]]@{2@}/) @{
+            print usage1 > "/dev/stderr"
+            print usage2 > "/dev/stderr"
+            exit 1
+        @}
+        break
+    @}
+
+    # set defaults for once we reach the desired time
+    if (delay == 0)
+        delay = 180    # 3 minutes
+@group
+    if (count == 0)
+        count = 5
+@end group
+    if (message == "")
+        message = sprintf("\aIt is now %s!\a", ARGV[1])
+    else if (index(message, "\a") == 0)
+        message = "\a" message "\a"
+@c endfile
+@end example
+
+The next @value{SECTION} of code turns the alarm time into hours and minutes,
+converts it (if necessary) to a 24-hour clock, and then turns that
+time into a count of the seconds since midnight.  Next it turns the current
+time into a count of seconds since midnight.  The difference between the two
+is how long to wait before setting off the alarm:
+
+@example
+@c file eg/prog/alarm.awk
+    # split up alarm time
+    split(ARGV[1], atime, ":")
+    hour = atime[1] + 0    # force numeric
+    minute = atime[2] + 0  # force numeric
+
+    # get current broken down time
+    getlocaltime(now)
+
+    # if time given is 12-hour hours and it's after that
+    # hour, e.g., `alarm 5:30' at 9 a.m. means 5:30 p.m.,
+    # then add 12 to real hour
+    if (hour < 12 && now["hour"] > hour)
+        hour += 12
+
+    # set target time in seconds since midnight
+    target = (hour * 60 * 60) + (minute * 60)
+
+    # get current time in seconds since midnight
+    current = (now["hour"] * 60 * 60) + \
+               (now["minute"] * 60) + now["second"]
+
+    # how long to sleep for
+    naptime = target - current
+    if (naptime <= 0) @{
+        print "alarm: time is in the past!" > "/dev/stderr"
+        exit 1
+    @}
+@c endfile
+@end example
+
+@cindex @command{sleep} utility
+Finally, the program uses the @code{system()} function
+(@pxref{I/O Functions})
+to call the @command{sleep} utility.  The @command{sleep} utility simply pauses
+for the given number of seconds.  If the exit status is not zero,
+the program assumes that @command{sleep} was interrupted and exits. If
+@command{sleep} exited with an OK status (zero), then the program prints the
+message in a loop, again using @command{sleep} to delay for however many
+seconds are necessary:
+
+@example
+@c file eg/prog/alarm.awk
+    # zzzzzz..... go away if interrupted
+    if (system(sprintf("sleep %d", naptime)) != 0)
+        exit 1
+
+    # time to notify!
+    command = sprintf("sleep %d", delay)
+    for (i = 1; i <= count; i++) @{
+        print message
+        # if sleep command interrupted, go away
+        if (system(command) != 0)
+            break
+    @}
+
+    exit 0
+@}
+@c endfile
+@end example
+
+@node Translate Program
+@subsection Transliterating Characters
+
+@cindex characters, transliterating
+@cindex @command{tr} utility
+The system @command{tr} utility transliterates characters.  For example, it is
+often used to map uppercase letters into lowercase for further processing:
+
+@example
+@var{generate data} | tr 'A-Z' 'a-z' | @var{process data} @dots{}
+@end example
+
+@command{tr} requires two lists of characters.@footnote{On some older
+systems, including Solaris, the system version of @command{tr} may require
+that the lists be written as range expressions enclosed in square brackets
+(@samp{[a-z]}) and quoted, to prevent the shell from attempting a
+@value{FN} expansion.  This is not a feature.}  When processing the input, the
+first character in the first list is replaced with the first character
+in the second list, the second character in the first list is replaced
+with the second character in the second list, and so on.  If there are
+more characters in the ``from'' list than in the ``to'' list, the last
+character of the ``to'' list is used for the remaining characters in the
+``from'' list.
+
+Once upon a time,
+@c early or mid-1989!
+a user proposed adding a transliteration function
+to @command{gawk}.
+@c Wishing to avoid gratuitous new features,
+@c at least theoretically
+The following program was written to
+prove that character transliteration could be done with a user-level
+function.  This program is not as complete as the system @command{tr} utility,
+but it does most of the job.
+
+The @command{translate} program was written long before @command{gawk}
+acquired the ability to split each character in a string into separate
+array elements.  Thus, it makes repeated use of the @code{substr()},
+@code{index()}, and @code{gsub()} built-in functions (@pxref{String
+Functions}).  There are two functions.  The first, @code{stranslate()},
+takes three arguments:
+
+@table @code
+@item from
+A list of characters from which to translate
+
+@item to
+A list of characters to which to translate
+
+@item target
+The string on which to do the translation
+@end table
+
+Associative arrays make the translation part fairly easy. @code{t_ar} holds
+the ``to'' characters, indexed by the ``from'' characters.  Then a simple
+loop goes through @code{from}, one character at a time.  For each character
+in @code{from}, if the character appears in @code{target},
+it is replaced with the corresponding @code{to} character.
+
+The @code{translate()} function calls @code{stranslate()}, using @code{$0}
+as the target.  The main program sets two global variables, @code{FROM} and
+@code{TO}, from the command line, and then changes @code{ARGV} so that
+@command{awk} reads from the standard input.
+
+Finally, the processing rule simply calls @code{translate()} for each record:
+
+@cindex @code{translate.awk} program
+@example
+@c file eg/prog/translate.awk
+# translate.awk --- do tr-like stuff
+@c endfile
+@ignore
+@c file eg/prog/translate.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# August 1989
+# February 2009 - bug fix
+
+@c endfile
+@end ignore
+@c file eg/prog/translate.awk
+# Bugs: does not handle things like tr A-Z a-z; it has
+# to be spelled out. However, if `to' is shorter than `from',
+# the last character in `to' is used for the rest of `from'.
+
+function stranslate(from, to, target,     lf, lt, ltarget, t_ar, i, c,
+                                                               result)
+@{
+    lf = length(from)
+    lt = length(to)
+    ltarget = length(target)
+    for (i = 1; i <= lt; i++)
+        t_ar[substr(from, i, 1)] = substr(to, i, 1)
+    if (lt < lf)
+        for (; i <= lf; i++)
+            t_ar[substr(from, i, 1)] = substr(to, lt, 1)
+    for (i = 1; i <= ltarget; i++) @{
+        c = substr(target, i, 1)
+        if (c in t_ar)
+            c = t_ar[c]
+        result = result c
+    @}
+    return result
+@}
+
+function translate(from, to)
+@{
+    return $0 = stranslate(from, to, $0)
+@}
+
+# main program
+BEGIN @{
+@group
+    if (ARGC < 3) @{
+        print "usage: translate from to" > "/dev/stderr"
+        exit
+    @}
+@end group
+    FROM = ARGV[1]
+    TO = ARGV[2]
+    ARGC = 2
+    ARGV[1] = "-"
+@}
+
+@{
+    translate(FROM, TO)
+    print
+@}
+@c endfile
+@end example
+
+It is possible to do character transliteration in a user-level
+function, but it is not necessarily efficient, and we (the @command{gawk}
+developers) started to consider adding a built-in function.  However,
+shortly after writing this program, we learned that Brian Kernighan
+had added the @code{toupper()} and @code{tolower()} functions to his
+@command{awk} (@pxref{String Functions}).  These functions handle the
+vast majority of the cases where character transliteration is necessary,
+and so we chose to simply add those functions to @command{gawk} as well
+and then leave well enough alone.
+
+An obvious improvement to this program would be to set up the
+@code{t_ar} array only once, in a @code{BEGIN} rule. However, this
+assumes that the ``from'' and ``to'' lists
+will never change throughout the lifetime of the program.
+
+Another obvious improvement is to enable the use of ranges,
+such as @samp{a-z}, as allowed by the @command{tr} utility.
+Look at the code for @file{cut.awk} (@pxref{Cut Program})
+for inspiration.
+
+
+@node Labels Program
+@subsection Printing Mailing Labels
+
+@cindex printing, mailing labels
+@cindex mailing labels@comma{} printing
+Here is a ``real-world''@footnote{``Real world'' is defined as
+``a program actually used to get something done.''}
+program.  This
+script reads lists of names and
+addresses and generates mailing labels.  Each page of labels has 20 labels
+on it, two across and 10 down.  The addresses are guaranteed to be no more
+than five lines of data.  Each address is separated from the next by a blank
+line.
+
+The basic idea is to read 20 labels' worth of data.  Each line of each label
+is stored in the @code{line} array.  The single rule takes care of filling
+the @code{line} array and printing the page when 20 labels have been read.
+
+The @code{BEGIN} rule simply sets @code{RS} to the empty string, so that
+@command{awk} splits records at blank lines
+(@pxref{Records}).
+It sets @code{MAXLINES} to 100, because 100 is the maximum number
+of lines on the page
+@iftex
+(@math{20 @cdot 5 = 100}).
+@end iftex
+@ifnottex
+@ifnotdocbook
+(20 * 5 = 100).
+@end ifnotdocbook
+@end ifnottex
+@docbook
+(20 &sdot; 5 = 100).
+@end docbook
+
+Most of the work is done in the @code{printpage()} function.
+The label lines are stored sequentially in the @code{line} array.  But they
+have to print horizontally: @code{line[1]} next to @code{line[6]},
+@code{line[2]} next to @code{line[7]}, and so on.  Two loops
+accomplish this.  The outer loop, controlled by @code{i}, steps through
+every 10 lines of data; this is each row of labels.  The inner loop,
+controlled by @code{j}, goes through the lines within the row.
+As @code{j} goes from 0 to 4, @samp{i+j} is the @code{j}th line in
+the row, and @samp{i+j+5} is the entry next to it.  The output ends up
+looking something like this:
+
+@example
+line 1          line 6
+line 2          line 7
+line 3          line 8
+line 4          line 9
+line 5          line 10
+@dots{}
+@end example
+
+@noindent
+The @code{printf} format string @samp{%-41s} left-aligns
+the data and prints it within a fixed-width field.
+
+As a final note, an extra blank line is printed at lines 21 and 61, to keep
+the output lined up on the labels.  This is dependent on the particular
+brand of labels in use when the program was written.  You will also note
+that there are two blank lines at the top and two blank lines at the bottom.
+
+The @code{END} rule arranges to flush the final page of labels; there may
+not have been an even multiple of 20 labels in the data:
+
+@cindex @code{labels.awk} program
+@example
+@c file eg/prog/labels.awk
+# labels.awk --- print mailing labels
+@c endfile
+@ignore
+@c file eg/prog/labels.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# June 1992
+# December 2010, minor edits
+@c endfile
+@end ignore
+@c file eg/prog/labels.awk
+
+# Each label is 5 lines of data that may have blank lines.
+# The label sheets have 2 blank lines at the top and 2 at
+# the bottom.
+
+BEGIN    @{ RS = "" ; MAXLINES = 100 @}
+
+function printpage(    i, j)
+@{
+    if (Nlines <= 0)
+        return
+
+    printf "\n\n"        # header
+
+    for (i = 1; i <= Nlines; i += 10) @{
+        if (i == 21 || i == 61)
+            print ""
+        for (j = 0; j < 5; j++) @{
+            if (i + j > MAXLINES)
+                break
+            printf "   %-41s %s\n", line[i+j], line[i+j+5]
+        @}
+        print ""
+    @}
+
+    printf "\n\n"        # footer
+
+    delete line
+@}
+
+# main rule
+@{
+    if (Count >= 20) @{
+        printpage()
+        Count = 0
+        Nlines = 0
+    @}
+    n = split($0, a, "\n")
+    for (i = 1; i <= n; i++)
+        line[++Nlines] = a[i]
+    for (; i <= 5; i++)
+        line[++Nlines] = ""
+    Count++
+@}
+
+END @{
+    printpage()
+@}
+@c endfile
+@end example
+
+@node Word Sorting
+@subsection Generating Word-Usage Counts
+
+@cindex words, usage counts@comma{} generating
+
+When working with large amounts of text, it can be interesting to know
+how often different words appear.  For example, an author may overuse
+certain words, in which case he or she might wish to find synonyms to substitute
+for words that appear too often. This @value{SUBSECTION} develops a
+program for counting words and presenting the frequency information
+in a useful format.
+
+At first glance, a program like this would seem to do the job:
+
+@example
+# wordfreq-first-try.awk --- print list of word frequencies
+
+@{
+    for (i = 1; i <= NF; i++)
+        freq[$i]++
+@}
+
+@group
+END @{
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word]
+@}
+@end group
+@end example
+
+The program relies on @command{awk}'s default field-splitting
+mechanism to break each line up into ``words'' and uses an
+associative array named @code{freq}, indexed by each word, to count
+the number of times the word occurs. In the @code{END} rule,
+it prints the counts.
+
+This program has several problems that prevent it from being
+useful on real text files:
+
+@itemize @value{BULLET}
+@item
+The @command{awk} language considers upper- and lowercase characters to be
+distinct.  Therefore, ``bartender'' and ``Bartender'' are not treated
+as the same word.  This is undesirable, because words are capitalized
+if they begin sentences in normal text, and a frequency analyzer should
+not be sensitive to capitalization.
+
+@item
+Words are detected using the @command{awk} convention that fields are
+separated just by whitespace.  Other characters in the input (except
+newlines) don't have any special meaning to @command{awk}.  This means that
+punctuation characters count as part of words.
+
+@item
+The output does not come out in any useful order.  You're more likely to be
+interested in which words occur most frequently or in having an alphabetized
+table of how frequently each word occurs.
+@end itemize
+
+@cindex @command{sort} utility
+The first problem can be solved by using @code{tolower()} to remove case
+distinctions.  The second problem can be solved by using @code{gsub()}
+to remove punctuation characters.  Finally, we solve the third problem
+by using the system @command{sort} utility to process the output of the
+@command{awk} script.  Here is the new version of the program:
+
+@cindex @code{wordfreq.awk} program
+@example
+@c file eg/prog/wordfreq.awk
+# wordfreq.awk --- print list of word frequencies
+
+@{
+    $0 = tolower($0)    # remove case distinctions
+    # remove punctuation
+    gsub(/[^[:alnum:]_[:blank:]]/, "", $0)
+    for (i = 1; i <= NF; i++)
+        freq[$i]++
+@}
+
+@c endfile
+END @{
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word]
+@}
+@end example
+
+The regexp @code{/[^[:alnum:]_[:blank:]]/} might have been written
+@code{/[[:punct:]]/}, but then underscores would also be removed,
+and we want to keep them.
+
+Assuming we have saved this program in a file named @file{wordfreq.awk},
+and that the data is in @file{file1}, the following pipeline:
+
+@example
+awk -f wordfreq.awk file1 | sort -k 2nr
+@end example
+
+@noindent
+produces a table of the words appearing in @file{file1} in order of
+decreasing frequency.
+
+The @command{awk} program suitably massages the
+data and produces a word frequency table, which is not ordered.
+The @command{awk} script's output is then sorted by the @command{sort}
+utility and printed on the screen.
+
+The options given to @command{sort}
+specify a sort that uses the second field of each input line (skipping
+one field), that the sort keys should be treated as numeric quantities
+(otherwise @samp{15} would come before @samp{5}), and that the sorting
+should be done in descending (reverse) order.
+
+The @command{sort} could even be done from within the program, by changing
+the @code{END} action to:
+
+@example
+@c file eg/prog/wordfreq.awk
+END @{
+    sort = "sort -k 2nr"
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word] | sort
+    close(sort)
+@}
+@c endfile
+@end example
+
+This way of sorting must be used on systems that do not
+have true pipes at the command-line (or batch-file) level.
+See the general operating system documentation for more information on how
+to use the @command{sort} program.
+
+@node History Sorting
+@subsection Removing Duplicates from Unsorted Text
+
+@cindex lines, duplicate@comma{} removing
+The @command{uniq} program
+(@pxref{Uniq Program})
+removes duplicate lines from @emph{sorted} data.
+
+Suppose, however, you need to remove duplicate lines from a @value{DF} but
+that you want to preserve the order the lines are in.  A good example of
+this might be a shell history file.  The history file keeps a copy of all
+the commands you have entered, and it is not unusual to repeat a command
+several times in a row.  Occasionally you might want to compact the history
+by removing duplicate entries.  Yet it is desirable to maintain the order
+of the original commands.
+
+This simple program does the job.  It uses two arrays.  The @code{data}
+array is indexed by the text of each line.
+For each line, @code{data[$0]} is incremented.
+If a particular line has not
+been seen before, then @code{data[$0]} is zero.
+In this case, the text of the line is stored in @code{lines[count]}.
+Each element of @code{lines} is a unique command, and the indices of
+@code{lines} indicate the order in which those lines are encountered.
+The @code{END} rule simply prints out the lines, in order:
+
+@cindex Rakitzis, Byron
+@cindex @code{histsort.awk} program
+@example
+@c file eg/prog/histsort.awk
+# histsort.awk --- compact a shell history file
+# Thanks to Byron Rakitzis for the general idea
+@c endfile
+@ignore
+@c file eg/prog/histsort.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/histsort.awk
+
+@group
+@{
+    if (data[$0]++ == 0)
+        lines[++count] = $0
+@}
+@end group
+
+@group
+END @{
+    for (i = 1; i <= count; i++)
+        print lines[i]
+@}
+@end group
+@c endfile
+@end example
+
+This program also provides a foundation for generating other useful
+information.  For example, using the following @code{print} statement in the
+@code{END} rule indicates how often a particular command is used:
+
+@example
+print data[lines[i]], lines[i]
+@end example
+
+@noindent
+This works because @code{data[$0]} is incremented each time a line is
+seen.
+
+@node Extract Program
+@subsection Extracting Programs from Texinfo Source Files
+
+@cindex Texinfo, extracting programs from source files
+@cindex files, Texinfo@comma{} extracting programs from
+@ifnotinfo
+Both this chapter and the previous chapter
+(@ref{Library Functions})
+present a large number of @command{awk} programs.
+@end ifnotinfo
+@ifinfo
+The nodes
+@ref{Library Functions},
+and @ref{Sample Programs},
+are the top level nodes for a large number of @command{awk} programs.
+@end ifinfo
+If you want to experiment with these programs, it is tedious to type
+them in by hand.  Here we present a program that can extract parts of a
+Texinfo input file into separate files.
+
+@cindex Texinfo
+This @value{DOCUMENT} is written in @uref{https://www.gnu.org/software/texinfo/, Texinfo},
+the GNU Project's document formatting language.
+A single Texinfo source file can be used to produce both
+printed documentation, with @TeX{}, and online documentation.
+@ifnotinfo
+(Texinfo is fully documented in the book
+@cite{Texinfo---The GNU Documentation Format},
+available from the Free Software Foundation,
+and also available @uref{https://www.gnu.org/software/texinfo/manual/texinfo/, online}.)
+@end ifnotinfo
+@ifinfo
+(The Texinfo language is described fully, starting with
+@inforef{Top, , Texinfo, texinfo,Texinfo---The GNU Documentation Format}.)
+@end ifinfo
+
+For our purposes, it is enough to know three things about Texinfo input
+files:
+
+@itemize @value{BULLET}
+@item
+The ``at'' symbol (@samp{@@}) is special in Texinfo, much as
+the backslash (@samp{\}) is in C
+or @command{awk}.  Literal @samp{@@} symbols are represented in Texinfo source
+files as @samp{@@@@}.
+
+@item
+Comments start with either @samp{@@c} or @samp{@@comment}.
+The file-extraction program works by using special comments that start
+at the beginning of a line.
+
+@item
+Lines containing @samp{@@group} and @samp{@@end group} commands bracket
+example text that should not be split across a page boundary.
+(Unfortunately, @TeX{} isn't always smart enough to do things exactly right,
+so we have to give it some help.)
+@end itemize
+
+The following program, @file{extract.awk}, reads through a Texinfo source
+file and does two things, based on the special comments.
+Upon seeing @samp{@w{@@c system @dots{}}},
+it runs a command, by extracting the command text from the
+control line and passing it on to the @code{system()} function
+(@pxref{I/O Functions}).
+Upon seeing @samp{@@c file @var{filename}}, each subsequent line is sent to
+the file @var{filename}, until @samp{@@c endfile} is encountered.
+The rules in @file{extract.awk} match either @samp{@@c} or
+@samp{@@comment} by letting the @samp{omment} part be optional.
+Lines containing @samp{@@group} and @samp{@@end group} are simply removed.
+@file{extract.awk} uses the @code{join()} library function
+(@pxref{Join Function}).
+
+The example programs in the online Texinfo source for @cite{@value{TITLE}}
+(@file{gawktexi.in}) have all been bracketed inside @samp{file} and
+@samp{endfile} lines.  The @command{gawk} distribution uses a copy of
+@file{extract.awk} to extract the sample programs and install many
+of them in a standard directory where @command{gawk} can find them.
+The Texinfo file looks something like this:
+
+@example
+@dots{}
+This program has a @@code@{BEGIN@} rule
+that prints a nice message:
+
+@@example
+@@c file examples/messages.awk
+BEGIN @@@{ print "Don't panic!" @@@}
+@@c endfile
+@@end example
+
+It also prints some final advice:
+
+@@example
+@@c file examples/messages.awk
+END @@@{ print "Always avoid bored archaeologists!" @@@}
+@@c endfile
+@@end example
+@dots{}
+@end example
+
+@file{extract.awk} begins by setting @code{IGNORECASE} to one, so that
+mixed upper- and lowercase letters in the directives won't matter.
+
+The first rule handles calling @code{system()}, checking that a command is
+given (@code{NF} is at least three) and also checking that the command
+exits with a zero exit status, signifying OK:
+
+@cindex @code{extract.awk} program
+@example
+@c file eg/prog/extract.awk
+# extract.awk --- extract files and run programs from Texinfo files
+@c endfile
+@ignore
+@c file eg/prog/extract.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised September 2000
+@c endfile
+@end ignore
+@c file eg/prog/extract.awk
+
+BEGIN    @{ IGNORECASE = 1 @}
+
+/^@@c(omment)?[ \t]+system/ @{
+    if (NF < 3) @{
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e  ": badly formed `system' line")
+        print e > "/dev/stderr"
+        next
+    @}
+    $1 = ""
+    $2 = ""
+    stat = system($0)
+    if (stat != 0) @{
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e ": warning: system returned " stat)
+        print e > "/dev/stderr"
+    @}
+@}
+@c endfile
+@end example
+
+@noindent
+The variable @code{e} is used so that the rule
+fits nicely on the @value{PAGE}.
+
+The second rule handles moving data into files.  It verifies that a
+@value{FN} is given in the directive.  If the file named is not the
+current file, then the current file is closed.  Keeping the current file
+open until a new file is encountered allows the use of the @samp{>}
+redirection for printing the contents, keeping open-file management
+simple.
+
+The @code{for} loop does the work.  It reads lines using @code{getline}
+(@pxref{Getline}).
+For an unexpected end-of-file, it calls the @code{@w{unexpected_eof()}}
+function.  If the line is an ``endfile'' line, then it breaks out of
+the loop.
+If the line is an @samp{@@group} or @samp{@@end group} line, then it
+ignores it and goes on to the next line.
+Similarly, comments within examples are also ignored.
+
+Most of the work is in the following few lines.  If the line has no @samp{@@}
+symbols, the program can print it directly.
+Otherwise, each leading @samp{@@} must be stripped off.
+To remove the @samp{@@} symbols, the line is split into separate elements of
+the array @code{a}, using the @code{split()} function
+(@pxref{String Functions}).
+The @samp{@@} symbol is used as the separator character.
+Each element of @code{a} that is empty indicates two successive @samp{@@}
+symbols in the original line.  For each two empty elements (@samp{@@@@} in
+the original file), we have to add a single @samp{@@} symbol back in.
+
+When the processing of the array is finished, @code{join()} is called with the
+value of @code{SUBSEP} (@pxref{Multidimensional}),
+to rejoin the pieces back into a single
+line.  That line is then printed to the output file:
+
+@example
+@c file eg/prog/extract.awk
+/^@@c(omment)?[ \t]+file/ @{
+    if (NF != 3) @{
+        e = ("extract: " FILENAME ":" FNR ": badly formed `file' line")
+        print e > "/dev/stderr"
+        next
+    @}
+    if ($3 != curfile) @{
+        if (curfile != "")
+            filelist[curfile] = 1   # save to close later
+        curfile = $3
+    @}
+
+    for (;;) @{
+        if ((getline line) <= 0)
+            unexpected_eof()
+        if (line ~ /^@@c(omment)?[ \t]+endfile/)
+            break
+        else if (line ~ /^@@(end[ \t]+)?group/)
+            continue
+        else if (line ~ /^@@c(omment+)?[ \t]+/)
+            continue
+        if (index(line, "@@") == 0) @{
+            print line > curfile
+            continue
+        @}
+        n = split(line, a, "@@")
+        # if a[1] == "", means leading @@,
+        # don't add one back in.
+        for (i = 2; i <= n; i++) @{
+            if (a[i] == "") @{ # was an @@@@
+                a[i] = "@@"
+                if (a[i+1] == "")
+                    i++
+            @}
+        @}
+@group
+        print join(a, 1, n, SUBSEP) > curfile
+    @}
+@}
+@end group
+@c endfile
+@end example
+
+An important thing to note is the use of the @samp{>} redirection.
+Output done with @samp{>} only opens the file once; it stays open and
+subsequent output is appended to the file
+(@pxref{Redirection}).
+This makes it easy to mix program text and explanatory prose for the same
+sample source file (as has been done here!) without any hassle.  The file is
+only closed when a new @value{DF} name is encountered or at the end of the
+input file.
+
+When a new @value{FN} is encountered, instead of closing the file,
+the program saves the name of the current file in @code{filelist}.
+This makes it possible to interleave the code for more than one file in
+the Texinfo input file.  (Previous versions of this program @emph{did}
+close the file. But because of the @samp{>} redirection, a file whose
+parts were not all one after the other ended up getting clobbered.)
+An @code{END} rule then closes all the open files when processing
+is finished:
+
+@example
+@c file eg/prog/extract.awk
+@group
+END @{
+    close(curfile)          # close the last one
+    for (f in filelist)     # close all the rest
+        close(f)
+@}
+@end group
+@c endfile
+@end example
+
+Finally, the function @code{@w{unexpected_eof()}} prints an appropriate
+error message and then exits:
+
+@example
+@c file eg/prog/extract.awk
+@group
+function unexpected_eof()
+@{
+    printf("extract: %s:%d: unexpected EOF or error\n",
+                     FILENAME, FNR) > "/dev/stderr"
+    exit 1
+@}
+@end group
+@c endfile
+@end example
+
+@node Simple Sed
+@subsection A Simple Stream Editor
+
+@cindex @command{sed} utility
+@cindex stream editors
+The @command{sed} utility is a @dfn{stream editor}, a program that reads a
+stream of data, makes changes to it, and passes it on.
+It is often used to make global changes to a large file or to a stream
+of data generated by a pipeline of commands.
+Although @command{sed} is a complicated program in its own right, its most common
+use is to perform global substitutions in the middle of a pipeline:
+
+@example
+@var{command1} < orig.data | sed 's/old/new/g' | @var{command2} > result
+@end example
+
+Here, @samp{s/old/new/g} tells @command{sed} to look for the regexp
+@samp{old} on each input line and globally replace it with the text
+@samp{new} (i.e., all the occurrences on a line).  This is similar to
+@command{awk}'s @code{gsub()} function
+(@pxref{String Functions}).
+
+The following program, @file{awksed.awk}, accepts at least two command-line
+arguments: the pattern to look for and the text to replace it with. Any
+additional arguments are treated as @value{DF} names to process. If none
+are provided, the standard input is used:
+
+@cindex Brennan, Michael
+@cindex @command{awksed.awk} program
+@c @cindex simple stream editor
+@c @cindex stream editor, simple
+@example
+@c file eg/prog/awksed.awk
+# awksed.awk --- do s/foo/bar/g using just print
+#    Thanks to Michael Brennan for the idea
+@c endfile
+@ignore
+@c file eg/prog/awksed.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# August 1995
+@c endfile
+@end ignore
+@c file eg/prog/awksed.awk
+
+function usage()
+@{
+    print "usage: awksed pat repl [files...]" > "/dev/stderr"
+    exit 1
+@}
+
+@group
+BEGIN @{
+    # validate arguments
+    if (ARGC < 3)
+        usage()
+@end group
+
+    RS = ARGV[1]
+    ORS = ARGV[2]
+
+    # don't use arguments as files
+    ARGV[1] = ARGV[2] = ""
+@}
+
+@group
+# look ma, no hands!
+@{
+    if (RT == "")
+        printf "%s", $0
+    else
+        print
+@}
+@end group
+@c endfile
+@end example
+
+The program relies on @command{gawk}'s ability to have @code{RS} be a regexp,
+as well as on the setting of @code{RT} to the actual text that terminates the
+record (@pxref{Records}).
+
+The idea is to have @code{RS} be the pattern to look for. @command{gawk}
+automatically sets @code{$0} to the text between matches of the pattern.
+This is text that we want to keep, unmodified.  Then, by setting @code{ORS}
+to the replacement text, a simple @code{print} statement outputs the
+text we want to keep, followed by the replacement text.
+
+There is one wrinkle to this scheme, which is what to do if the last record
+doesn't end with text that matches @code{RS}.  Using a @code{print}
+statement unconditionally prints the replacement text, which is not correct.
+However, if the file did not end in text that matches @code{RS}, @code{RT}
+is set to the null string.  In this case, we can print @code{$0} using
+@code{printf}
+(@pxref{Printf}).
+
+The @code{BEGIN} rule handles the setup, checking for the right number
+of arguments and calling @code{usage()} if there is a problem. Then it sets
+@code{RS} and @code{ORS} from the command-line arguments and sets
+@code{ARGV[1]} and @code{ARGV[2]} to the null string, so that they are
+not treated as @value{FN}s
+(@pxref{ARGC and ARGV}).
+
+The @code{usage()} function prints an error message and exits.
+Finally, the single rule handles the printing scheme outlined earlier,
+using @code{print} or @code{printf} as appropriate, depending upon the
+value of @code{RT}.
+
+@node Igawk Program
+@subsection An Easy Way to Use Library Functions
+
+@cindex libraries of @command{awk} functions, example program for using
+@cindex functions, library, example program for using
+In @ref{Include Files}, we saw how @command{gawk} provides a built-in
+file-inclusion capability.  However, this is a @command{gawk} extension.
+This @value{SECTION} provides the motivation for making file inclusion
+available for standard @command{awk}, and shows how to do it using a
+combination of shell and @command{awk} programming.
+
+Using library functions in @command{awk} can be very beneficial. It
+encourages code reuse and the writing of general functions. Programs are
+smaller and therefore clearer.
+However, using library functions is only easy when writing @command{awk}
+programs; it is painful when running them, requiring multiple @option{-f}
+options.  If @command{gawk} is unavailable, then so too is the @env{AWKPATH}
+environment variable and the ability to put @command{awk} functions into a
+library directory (@pxref{Options}).
+It would be nice to be able to write programs in the following manner:
+
+@example
+# library functions
+@@include getopt.awk
+@@include join.awk
+@dots{}
+
+# main program
+BEGIN @{
+    while ((c = getopt(ARGC, ARGV, "a:b:cde")) != -1)
+        @dots{}
+    @dots{}
+@}
+@end example
+
+The following program, @file{igawk.sh}, provides this service.
+It simulates @command{gawk}'s searching of the @env{AWKPATH} variable
+and also allows @dfn{nested} includes (i.e., a file that is included
+with @code{@@include} can contain further @code{@@include} statements).
+@command{igawk} makes an effort to only include files once, so that nested
+includes don't accidentally include a library function twice.
+
+@command{igawk} should behave just like @command{gawk} externally.  This
+means it should accept all of @command{gawk}'s command-line arguments,
+including the ability to have multiple source files specified via
+@option{-f} and the ability to mix command-line and library source files.
+
+The program is written using the POSIX Shell (@command{sh}) command
+language.@footnote{Fully explaining the @command{sh} language is beyond
+the scope of this book. We provide some minimal explanations, but see
+a good shell programming book if you wish to understand things in more
+depth.} It works as follows:
+
+@enumerate
+@item
+Loop through the arguments, saving anything that doesn't represent
+@command{awk} source code for later, when the expanded program is run.
+
+@item
+For any arguments that do represent @command{awk} text, put the arguments into
+a shell variable that will be expanded.  There are two cases:
+
+@enumerate a
+@item
+Literal text, provided with @option{-e} or @option{--source}.  This
+text is just appended directly.
+
+@item
+Source @value{FN}s, provided with @option{-f}.  We use a neat trick and
+append @samp{@@include @var{filename}} to the shell variable's contents.
+Because the file-inclusion program works the way @command{gawk} does, this
+gets the text of the file included in the program at the correct point.
+@end enumerate
+
+@item
+Run an @command{awk} program (naturally) over the shell variable's contents to expand
+@code{@@include} statements.  The expanded program is placed in a second
+shell variable.
+
+@item
+Run the expanded program with @command{gawk} and any other original command-line
+arguments that the user supplied (such as the @value{DF} names).
+@end enumerate
+
+This program uses shell variables extensively: for storing command-line arguments and
+the text of the @command{awk} program that will expand the user's program, for the
+user's original program, and for the expanded program.  Doing so removes some
+potential problems that might arise were we to use temporary files instead,
+at the cost of making the script somewhat more complicated.
+
+The initial part of the program turns on shell tracing if the first
+argument is @samp{debug}.
+
+The next part loops through all the command-line arguments.
+There are several cases of interest:
+
+@c @asis for docbook
+@table @asis
+@item @option{--}
+This ends the arguments to @command{igawk}.  Anything else should be passed on
+to the user's @command{awk} program without being evaluated.
+
+@item @option{-W}
+This indicates that the next option is specific to @command{gawk}.  To make
+argument processing easier, the @option{-W} is appended to the front of the
+remaining arguments and the loop continues.  (This is an @command{sh}
+programming trick.  Don't worry about it if you are not familiar with
+@command{sh}.)
+
+@item @option{-v}, @option{-F}
+These are saved and passed on to @command{gawk}.
+
+@item @option{-f}, @option{--file}, @option{--file=}, @option{-Wfile=}
+The @value{FN} is appended to the shell variable @code{program} with an
+@code{@@include} statement.
+The @command{expr} utility is used to remove the leading option part of the
+argument (e.g., @samp{--file=}).
+(Typical @command{sh} usage would be to use the @command{echo} and @command{sed}
+utilities to do this work.  Unfortunately, some versions of @command{echo} evaluate
+escape sequences in their arguments, possibly mangling the program text.
+Using @command{expr} avoids this problem.)
+
+@item @option{--source}, @option{--source=}, @option{-Wsource=}
+The source text is appended to @code{program}.
+
+@item @option{--version}, @option{-Wversion}
+@command{igawk} prints its version number, runs @samp{gawk --version}
+to get the @command{gawk} version information, and then exits.
+@end table
+
+If none of the @option{-f}, @option{--file}, @option{-Wfile}, @option{--source},
+or @option{-Wsource} arguments are supplied, then the first nonoption argument
+should be the @command{awk} program.  If there are no command-line
+arguments left, @command{igawk} prints an error message and exits.
+Otherwise, the first argument is appended to @code{program}.
+In any case, after the arguments have been processed,
+the shell variable
+@code{program} contains the complete text of the original @command{awk}
+program.
+
+The program is as follows:
+
+@cindex @code{igawk.sh} program
+@example
+@c file eg/prog/igawk.sh
+#! /bin/sh
+# igawk --- like gawk but do @@include processing
+@c endfile
+@ignore
+@c file eg/prog/igawk.sh
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# July 1993
+# December 2010, minor edits
+@c endfile
+@end ignore
+@c file eg/prog/igawk.sh
+
+if [ "$1" = debug ]
+then
+    set -x
+    shift
+fi
+
+# A literal newline, so that program text is formatted correctly
+n='
+'
+
+# Initialize variables to empty
+program=
+opts=
+
+while [ $# -ne 0 ] # loop over arguments
+do
+    case $1 in
+    --)     shift
+            break ;;
+
+    -W)     shift
+            # The $@{x?'message here'@} construct prints a
+            # diagnostic if $x is the null string
+            set -- -W"$@{@@?'missing operand'@}"
+            continue ;;
+
+    -[vF])  opts="$opts $1 '$@{2?'missing operand'@}'"
+            shift ;;
+
+    -[vF]*) opts="$opts '$1'" ;;
+
+    -f)     program="$program$n@@include $@{2?'missing operand'@}"
+            shift ;;
+
+    -f*)    f=$(expr "$1" : '-f\(.*\)')
+            program="$program$n@@include $f" ;;
+
+    -[W-]file=*)
+            f=$(expr "$1" : '-.file=\(.*\)')
+            program="$program$n@@include $f" ;;
+
+    -[W-]file)
+            program="$program$n@@include $@{2?'missing operand'@}"
+            shift ;;
+
+    -[W-]source=*)
+            t=$(expr "$1" : '-.source=\(.*\)')
+            program="$program$n$t" ;;
+
+    -[W-]source)
+            program="$program$n$@{2?'missing operand'@}"
+            shift ;;
+
+    -[W-]version)
+            echo igawk: version 3.0 1>&2
+            gawk --version
+            exit 0 ;;
+
+    -[W-]*) opts="$opts '$1'" ;;
+
+    *)      break ;;
+    esac
+    shift
+done
+
+if [ -z "$program" ]
+then
+     program=$@{1?'missing program'@}
+     shift
+fi
+
+# At this point, `program' has the program.
+@c endfile
+@end example
+
+The @command{awk} program to process @code{@@include} directives
+is stored in the shell variable @code{expand_prog}.  Doing this keeps
+the shell script readable.  The @command{awk} program
+reads through the user's program, one line at a time, using @code{getline}
+(@pxref{Getline}).  The input
+@value{FN}s and @code{@@include} statements are managed using a stack.
+As each @code{@@include} is encountered, the current @value{FN} is
+``pushed'' onto the stack and the file named in the @code{@@include}
+directive becomes the current @value{FN}.  As each file is finished,
+the stack is ``popped,'' and the previous input file becomes the current
+input file again.  The process is started by making the original file
+the first one on the stack.
+
+The @code{pathto()} function does the work of finding the full path to
+a file.  It simulates @command{gawk}'s behavior when searching the
+@env{AWKPATH} environment variable
+(@pxref{AWKPATH Variable}).
+If a @value{FN} has a @samp{/} in it, no path search is done.
+Similarly, if the @value{FN} is @code{"-"}, then that string is
+used as-is.  Otherwise,
+the @value{FN} is concatenated with the name of each directory in
+the path, and an attempt is made to open the generated @value{FN}.
+The only way to test if a file can be read in @command{awk} is to go
+ahead and try to read it with @code{getline}; this is what @code{pathto()}
+does.@footnote{On some very old versions of @command{awk}, the test
+@samp{getline junk < t} can loop forever if the file exists but is empty.}
+If the file can be read, it is closed and the @value{FN}
+is returned:
+
+@ignore
+An alternative way to test for the file's existence would be to call
+@samp{system("test -r " t)}, which uses the @command{test} utility to
+see if the file exists and is readable.  The disadvantage to this method
+is that it requires creating an extra process and can thus be slightly
+slower.
+@end ignore
+
+@example
+@c file eg/prog/igawk.sh
+expand_prog='
+
+function pathto(file,    i, t, junk)
+@{
+    if (index(file, "/") != 0)
+        return file
+
+    if (file == "-")
+        return file
+
+    for (i = 1; i <= ndirs; i++) @{
+        t = (pathlist[i] "/" file)
+@group
+        if ((getline junk < t) > 0) @{
+            # found it
+            close(t)
+            return t
+        @}
+@end group
+    @}
+    return ""
+@}
+@c endfile
+@end example
+
+The main program is contained inside one @code{BEGIN} rule.  The first thing it
+does is set up the @code{pathlist} array that @code{pathto()} uses.  After
+splitting the path on @samp{:}, null elements are replaced with @code{"."},
+which represents the current directory:
+
+@example
+@c file eg/prog/igawk.sh
+BEGIN @{
+    path = ENVIRON["AWKPATH"]
+    ndirs = split(path, pathlist, ":")
+    for (i = 1; i <= ndirs; i++) @{
+        if (pathlist[i] == "")
+            pathlist[i] = "."
+    @}
+@c endfile
+@end example
+
+The stack is initialized with @code{ARGV[1]}, which will be @code{"/dev/stdin"}.
+The main loop comes next.  Input lines are read in succession. Lines that
+do not start with @code{@@include} are printed verbatim.
+If the line does start with @code{@@include}, the @value{FN} is in @code{$2}.
+@code{pathto()} is called to generate the full path.  If it cannot, then the program
+prints an error message and continues.
+
+The next thing to check is if the file is included already.  The
+@code{processed} array is indexed by the full @value{FN} of each included
+file and it tracks this information for us.  If the file is
+seen again, a warning message is printed. Otherwise, the new @value{FN} is
+pushed onto the stack and processing continues.
+
+Finally, when @code{getline} encounters the end of the input file, the file
+is closed and the stack is popped.  When @code{stackptr} is less than zero,
+the program is done:
+
+@example
+@c file eg/prog/igawk.sh
+    stackptr = 0
+    input[stackptr] = ARGV[1] # ARGV[1] is first file
+
+    for (; stackptr >= 0; stackptr--) @{
+        while ((getline < input[stackptr]) > 0) @{
+            if (tolower($1) != "@@include") @{
+                print
+                continue
+            @}
+            fpath = pathto($2)
+            if (fpath == "") @{
+                printf("igawk: %s:%d: cannot find %s\n",
+                    input[stackptr], FNR, $2) > "/dev/stderr"
+                continue
+            @}
+            if (! (fpath in processed)) @{
+                processed[fpath] = input[stackptr]
+                input[++stackptr] = fpath  # push onto stack
+            @} else
+                print $2, "included in", input[stackptr],
+                    "already included in",
+                    processed[fpath] > "/dev/stderr"
+        @}
+        close(input[stackptr])
+    @}
+@}'  # close quote ends `expand_prog' variable
+
+processed_program=$(gawk -- "$expand_prog" /dev/stdin << EOF
+$program
+EOF
+)
+@c endfile
+@end example
+
+The shell construct @samp{@var{command} << @var{marker}} is called
+a @dfn{here document}.  Everything in the shell script up to the
+@var{marker} is fed to @var{command} as input.  The shell processes
+the contents of the here document for variable and command substitution
+(and possibly other things as well, depending upon the shell).
+
+The shell construct @samp{$(@dots{})} is called @dfn{command substitution}.
+The output of the command inside the parentheses is substituted
+into the command line.
+Because the result is used in a variable assignment,
+it is saved as a single string, even if the results contain whitespace.
+
+The expanded program is saved in the variable @code{processed_program}.
+It's done in these steps:
+
+@enumerate
+@item
+Run @command{gawk} with the @code{@@include}-processing program (the
+value of the @code{expand_prog} shell variable) reading standard input.
+
+@item
+Standard input is the contents of the user's program,
+from the shell variable @code{program}.
+Feed its contents to @command{gawk} via a here document.
+
+@item
+Save the results of this processing in the shell variable
+@code{processed_program} by using command substitution.
+@end enumerate
+
+The last step is to call @command{gawk} with the expanded program,
+along with the original
+options and command-line arguments that the user supplied:
+
+@example
+@c file eg/prog/igawk.sh
+eval gawk $opts -- '"$processed_program"' '"$@@"'
+@c endfile
+@end example
+
+The @command{eval} command is a shell construct that reruns the shell's parsing
+process.  This keeps things properly quoted.
+
+This version of @command{igawk} represents the fifth version of this program.
+There are four key simplifications that make the program work better:
+
+@itemize @value{BULLET}
+@item
+Using @code{@@include} even for the files named with @option{-f} makes building
+the initial collected @command{awk} program much simpler; all the
+@code{@@include} processing can be done once.
+
+@item
+Not trying to save the line read with @code{getline}
+in the @code{pathto()} function when testing for the
+file's accessibility for use with the main program simplifies things
+considerably.
+
+@item
+Using a @code{getline} loop in the @code{BEGIN} rule does it all in one
+place.  It is not necessary to call out to a separate loop for processing
+nested @code{@@include} statements.
+
+@item
+Instead of saving the expanded program in a temporary file, putting it in a shell variable
+avoids some potential security problems.
+This has the disadvantage that the script relies upon more features
+of the @command{sh} language, making it harder to follow for those who
+aren't familiar with @command{sh}.
+@end itemize
+
+Also, this program illustrates that it is often worthwhile to combine
+@command{sh} and @command{awk} programming together.  You can usually
+accomplish quite a lot, without having to resort to low-level programming
+in C or C++, and it is frequently easier to do certain kinds of string
+and argument manipulation using the shell than it is in @command{awk}.
+
+Finally, @command{igawk} shows that it is not always necessary to add new
+features to a program; they can often be layered on top.@footnote{@command{gawk}
+does @code{@@include} processing itself in order to support the use
+of @command{awk} programs as Web CGI scripts.}
+
+
+@node Anagram Program
+@subsection Finding Anagrams from a Dictionary
+
+@cindex anagrams, finding
+An interesting programming challenge is to
+search for @dfn{anagrams} in a
+word list (such as
+@file{/usr/share/dict/words} on many GNU/Linux systems).
+One word is an anagram of another if both words contain
+the same letters
+(e.g., ``babbling'' and ``blabbing'').
+
+Column 2, Problem C, of Jon Bentley's @cite{Programming Pearls}, Second
+Edition, presents an elegant algorithm.  The idea is to give words that
+are anagrams a common signature, sort all the words together by their
+signatures, and then print them.  Dr.@: Bentley observes that taking the
+letters in each word and sorting them produces those common signatures.
+
+The following program uses arrays of arrays to bring together
+words with the same signature and array sorting to print the words
+in sorted order:
+
+@cindex @code{anagram.awk} program
+@example
+@c file eg/prog/anagram.awk
+# anagram.awk --- An implementation of the anagram-finding algorithm
+#                 from Jon Bentley's "Programming Pearls," 2nd edition.
+#                 Addison Wesley, 2000, ISBN 0-201-65788-0.
+#                 Column 2, Problem C, section 2.8, pp 18-20.
+@c endfile
+@ignore
+@c file eg/prog/anagram.awk
+#
+# This program requires gawk 4.0 or newer.
+# Required gawk-specific features:
+#   - True multidimensional arrays
+#   - split() with "" as separator splits out individual characters
+#   - asort() and asorti() functions
+#
+# See https://savannah.gnu.org/projects/gawk.
+#
+# Arnold Robbins
+# arnold@@skeeve.com
+# Public Domain
+# January, 2011
+@c endfile
+@end ignore
+@c file eg/prog/anagram.awk
+
+/'s$/   @{ next @}        # Skip possessives
+@c endfile
+@end example
+
+The program starts with a header, and then a rule to skip
+possessives in the dictionary file. The next rule builds
+up the data structure. The first dimension of the array
+is indexed by the signature; the second dimension is the word
+itself:
+
+@example
+@c file eg/prog/anagram.awk
+@{
+    key = word2key($1)  # Build signature
+    data[key][$1] = $1  # Store word with signature
+@}
+@c endfile
+@end example
+
+The @code{word2key()} function creates the signature.
+It splits the word apart into individual letters,
+sorts the letters, and then joins them back together:
+
+@example
+@c file eg/prog/anagram.awk
+# word2key --- split word apart into letters, sort, and join back together
+
+function word2key(word,     a, i, n, result)
+@{
+    n = split(word, a, "")
+    asort(a)
+
+    for (i = 1; i <= n; i++)
+        result = result a[i]
+
+    return result
+@}
+@c endfile
+@end example
+
+Finally, the @code{END} rule traverses the array
+and prints out the anagram lists.  It sends the output
+to the system @command{sort} command because otherwise
+the anagrams would appear in arbitrary order:
+
+@example
+@c file eg/prog/anagram.awk
+END @{
+    sort = "sort"
+    for (key in data) @{
+        # Sort words with same key
+        nwords = asorti(data[key], words)
+        if (nwords == 1)
+            continue
+
+        # And print. Minor glitch: trailing space at end of each line
+        for (j = 1; j <= nwords; j++)
+            printf("%s ", words[j]) | sort
+        print "" | sort
+    @}
+    close(sort)
+@}
+@c endfile
+@end example
+
+Here is some partial output when the program is run:
+
+@example
+$ @kbd{gawk -f anagram.awk /usr/share/dict/words | grep '^b'}
+@dots{}
+babbled blabbed
+babbler blabber brabble
+babblers blabbers brabbles
+babbling blabbing
+babbly blabby
+babel bable
+babels beslab
+babery yabber
+@dots{}
+@end example
+
+
+@node Signature Program
+@subsection And Now for Something Completely Different
+
+@cindex signature program
+@cindex Brini, Davide
+The following program was written by Davide Brini
+@c (@email{dave_br@@gmx.com})
+and is published on @uref{http://backreference.org/2011/02/03/obfuscated-awk/,
+his website}.
+It serves as his signature in the Usenet group @code{comp.lang.awk}.
+He supplies the following copyright terms:
+
+@quotation
+Copyright @copyright{} 2008 Davide Brini
+
+Copying and distribution of the code published in this page, with or without
+modification, are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+@end quotation
+
+Here is the program:
+
+@example
+@group
+awk 'BEGIN@{O="~"~"~";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),x-O@}'
+@end group
+@end example
+
+@cindex Johansen, Chris
+We leave it to you to determine what the program does.  (If you are
+truly desperate to understand it, see Chris Johansen's explanation,
+which is embedded in the Texinfo source file for this @value{DOCUMENT}.)
+
+@ignore
+To: "Arnold Robbins" <arnold@skeeve.com>
+Date: Sat, 20 Aug 2011 13:50:46 -0400
+Subject: The GNU Awk User's Guide, Section 13.3.11
+From: "Chris Johansen" <johansen@main.nc.us>
+Message-ID: <op.v0iw6wlv7finx3@asusodin.thrudvang.lan>
+
+Arnold, you don't know me, but we have a tenuous connection.  My wife is
+Barbara A. Field, FAIA, GIT '65 (B. Arch.).
+
+I have had a couple of paper copies of "Effective Awk Programming" for
+years, and now I'm going through a Kindle version of "The GNU Awk User's
+Guide" again.  When I got to section 13.3.11, I reformatted and lightly
+commented Davide Brin's signature script to understand its workings.
+
+It occurs to me that this might have pedagogical value as an example
+(although imperfect) of the value of whitespace and comments, and a
+starting point for that discussion.  It certainly helped _me_ understand
+what's going on.  You are welcome to it, as-is or modified (subject to
+Davide's constraints, of course, which I think I have met).
+
+If I were to include it in a future edition, I would put it at some
+distance from section 13.3.11, say, as a note or an appendix, so as not to
+be a "spoiler" to the puzzle.
+
+Best regards,
+--
+Chris Johansen {johansen at main dot nc dot us}
+  . . . collapsing the probability wave function, sending ripples of
+certainty through the space-time continuum.
+
+
+#! /usr/bin/gawk -f
+
+# From "13.3.11 And Now For Something Completely Different"
+#   https://www.gnu.org/software/gawk/manual/html_node/Signature-Program.html#Signature-Program
+
+# Copyright @copyright{} 2008 Davide Brini
+
+# Copying and distribution of the code published in this page, with
+# or without modification, are permitted in any medium without
+# royalty provided the copyright notice and this notice are preserved.
+
+BEGIN {
+  O = "~" ~ "~";    #  1
+  o = "==" == "=="; #  1
+  o += +o;          #  2
+  x = O "" O;       # 11
+
+
+  while ( X++ <= x + o + o ) c = c "%c";
+
+  # O is  1
+  # o is  2
+  # x is 11
+  # X is 17
+  # c is "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"
+
+  printf c,
+    ( x - O )*( x - O),                  # 100 d
+    x*( x - o ) - o,                     #  97 a
+    x*( x - O ) + x - O - o,             # 118 v
+    +x*( x - O ) - x + o,                # 101 e
+    X*( o*o + O ) + x - O,               #  95 _
+    X*( X - x ) - o*o,                   #  98 b
+    ( x + X )*o*o + o,                   # 114 r
+    x*( X - x ) - O - O,                 #  64 @
+    x - O + ( O + o + X + x )*( o + O ), # 103 g
+    X*X - X*( x - O ) - x + O,           # 109 m
+    O + X*( o*( o + O ) + O ),           # 120 x
+    +x + O + X*o,                        #  46 .
+    x*( x - o),                          #  99 c
+    ( o + X + x )*o*o - ( x - O - O ),   # 111 0
+    O + ( X - x )*( X + O ),             # 109 m
+    x - O                                #  10 \n
+}
+@end ignore
+
+@node Programs Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+The programs provided in this @value{CHAPTER}
+continue on the theme that reading programs is an excellent way to learn
+Good Programming.
+
+@item
+Using @samp{#!} to make @command{awk} programs directly runnable makes
+them easier to use.  Otherwise, invoke the program using @samp{awk
+-f @dots{}}.
+
+@item
+Reimplementing standard POSIX programs in @command{awk} is a pleasant
+exercise; @command{awk}'s expressive power lets you write such programs
+in relatively few lines of code, yet they are functionally complete
+and usable.
+
+@item
+One of standard @command{awk}'s weaknesses is working with individual
+characters.  The ability to use @code{split()} with the empty string as
+the separator can considerably simplify such tasks.
+
+@item
+The examples here demonstrate the usefulness of the library
+functions from @ref{Library Functions}
+for a number of real (if small) programs.
+
+@item
+Besides reinventing POSIX wheels, other programs solved a selection of
+interesting problems, such as finding duplicate words in text, printing
+mailing labels, and finding anagrams.
+
+@end itemize
+
+@c EXCLUDE START
+@node Programs Exercises
+@section Exercises
+
+@enumerate
+@item
+Rewrite @file{cut.awk} (@pxref{Cut Program})
+using @code{split()} with @code{""} as the separator.
+
+@item
+In @ref{Egrep Program}, we mentioned that @samp{egrep -i} could be
+simulated in versions of @command{awk} without @code{IGNORECASE} by
+using @code{tolower()} on the line and the pattern. In a footnote there,
+we also mentioned that this solution has a bug: the translated line is
+output, and not the original one.  Fix this problem.
+@c Exercise: Fix this, w/array and new line as key to original line
+
+@item
+The POSIX version of @command{id} takes options that control which
+information is printed.  Modify the @command{awk} version
+(@pxref{Id Program}) to accept the same arguments and perform in the
+same way.
+
+@item
+The @code{split.awk} program (@pxref{Split Program}) assumes
+that letters are contiguous in the character set,
+which isn't true for EBCDIC systems.
+Fix this problem.
+(Hint: Consider a different way to work through the alphabet,
+without relying on @code{ord()} and @code{chr()}.)
+
+@item
+In @file{uniq.awk} (@pxref{Uniq Program}, the
+logic for choosing which lines to print represents a @dfn{state
+machine}, which is ``a device that can be in one of a set number of stable
+conditions depending on its previous condition and on the present values
+of its inputs.''@footnote{This is the definition returned from entering
+@code{define: state machine} into Google.}
+Brian Kernighan suggests that
+``an alternative approach to state machines is to just read
+the input into an array, then use indexing.  It's almost always
+easier code, and for most inputs where you would use this, just
+as fast.''  Rewrite the logic to follow this
+suggestion.
+
+
+@item
+Why can't the @file{wc.awk} program (@pxref{Wc Program}) just
+use the value of @code{FNR} in @code{endfile()}?
+Hint: Examine the code in @ref{Filetrans Function}.
+
+@ignore
+@command{wc} can't just use the value of @code{FNR} in
+@code{endfile()}. If you examine the code in @ref{Filetrans Function},
+you will see that @code{FNR} has already been reset by the time
+@code{endfile()} is called.
+@end ignore
+
+@item
+Manipulation of individual characters in the @command{translate} program
+(@pxref{Translate Program}) is painful using standard @command{awk}
+functions.  Given that @command{gawk} can split strings into individual
+characters using @code{""} as the separator, how might you use this
+feature to simplify the program?
+
+@item
+The @file{extract.awk} program (@pxref{Extract Program}) was written
+before @command{gawk} had the @code{gensub()} function.  Use it
+to simplify the code.
+
+@item
+Compare the performance of the @file{awksed.awk} program
+(@pxref{Simple Sed}) with the more straightforward:
+
+@example
+BEGIN @{
+    pat = ARGV[1]
+    repl = ARGV[2]
+    ARGV[1] = ARGV[2] = ""
+@}
+
+@{ gsub(pat, repl); print @}
+@end example
+
+@item
+What are the advantages and disadvantages of @file{awksed.awk} versus
+the real @command{sed} utility?
+
+@ignore
+  Advantage: egrep regexps
+             speed (?)
+  Disadvantage: no & in replacement text
+
+Others?
+@end ignore
+
+@item
+In @ref{Igawk Program}, we mentioned that not trying to save the line
+read with @code{getline} in the @code{pathto()} function when testing
+for the file's accessibility for use with the main program simplifies
+things considerably.  What problem does this engender though?
+@c answer, reading from "-" or /dev/stdin
+
+@cindex search paths
+@cindex search paths, for source files
+@cindex source files@comma{} search path for
+@cindex files, source@comma{} search path for
+@cindex directories, searching
+@item
+As an additional example of the idea that it is not always necessary to
+add new features to a program, consider the idea of having two files in
+a directory in the search path:
+
+@table @file
+@item default.awk
+This file contains a set of default library functions, such
+as @code{getopt()} and @code{assert()}.
+
+@item site.awk
+This file contains library functions that are specific to a site or
+installation; i.e., locally developed functions.
+Having a separate file allows @file{default.awk} to change with
+new @command{gawk} releases, without requiring the system administrator to
+update it each time by adding the local functions.
+@end table
+
+One user
+@c Karl Berry, karl@ileaf.com, 10/95
+suggested that @command{gawk} be modified to automatically read these files
+upon startup.  Instead, it would be very simple to modify @command{igawk}
+to do this. Since @command{igawk} can process nested @code{@@include}
+directives, @file{default.awk} could simply contain @code{@@include}
+statements for the desired library functions.
+Make this change.
+
+@item
+Modify @file{anagram.awk} (@pxref{Anagram Program}), to avoid
+the use of the external @command{sort} utility.
+
+@end enumerate
+@c EXCLUDE END
+
+@ifnotinfo
+@part @value{PART3}Moving Beyond Standard @command{awk} with @command{gawk}
+@end ifnotinfo
+
+@ifdocbook
+Part III focuses on features specific to @command{gawk}.
+It contains the following chapters:
+
+@itemize @value{BULLET}
+@item
+@ref{Namespaces}
+
+@item
+@ref{Advanced Features}
+
+@item
+@ref{Internationalization}
+
+@item
+@ref{Debugger}
+
+@item
+@ref{Arbitrary Precision Arithmetic}
+
+@item
+@ref{Dynamic Extensions}
+@end itemize
+@end ifdocbook
+
+@node Advanced Features
+@chapter Advanced Features of @command{gawk}
+@cindex @command{gawk}, features, advanced
+@cindex advanced features, @command{gawk}
+@ignore
+Contributed by: Peter Langston <pud!psl@bellcore.bellcore.com>
+
+    Found in Steve English's "signature" line:
+
+"Write documentation as if whoever reads it is a violent psychopath
+who knows where you live."
+@end ignore
+@cindex Langston, Peter
+@cindex English, Steve
+@quotation
+@i{Write documentation as if whoever reads it is
+a violent psychopath who knows where you live.}
+@author Steve English, as quoted by Peter Langston
+@end quotation
+
+This @value{CHAPTER} discusses advanced features in @command{gawk}.
+It's a bit of a ``grab bag'' of items that are otherwise unrelated
+to each other.
+First, we look at a command-line option that allows @command{gawk} to recognize
+nondecimal numbers in input data, not just in @command{awk}
+programs.
+Then, @command{gawk}'s special features for sorting arrays are presented.
+Next, two-way I/O, discussed briefly in earlier parts of this
+@value{DOCUMENT}, is described in full detail, along with the basics
+of TCP/IP networking.  Finally, we see how @command{gawk}
+can @dfn{profile} an @command{awk} program, making it possible to tune
+it for performance.
+
+@c FULLXREF ON
+Additional advanced features are discussed in separate @value{CHAPTER}s of their
+own:
+
+@itemize @value{BULLET}
+@item
+@ref{Internationalization}, discusses how to internationalize
+your @command{awk} programs, so that they can speak multiple
+national languages.
+
+@item
+@ref{Debugger}, describes @command{gawk}'s built-in command-line
+debugger for debugging @command{awk} programs.
+
+@item
+@ref{Arbitrary Precision Arithmetic}, describes how you can use
+@command{gawk} to perform arbitrary-precision arithmetic.
+
+@item
+@ref{Dynamic Extensions},
+discusses the ability to dynamically add new built-in functions to
+@command{gawk}.
+@end itemize
+@c FULLXREF OFF
+
+@menu
+* Nondecimal Data::             Allowing nondecimal input data.
+* Array Sorting::               Facilities for controlling array traversal and
+                                sorting arrays.
+* Two-way I/O::                 Two-way communications with another process.
+* TCP/IP Networking::           Using @command{gawk} for network programming.
+* Profiling::                   Profiling your @command{awk} programs.
+* Advanced Features Summary::   Summary of advanced features.
+@end menu
+
+@node Nondecimal Data
+@section Allowing Nondecimal Input Data
+@cindex @option{--non-decimal-data} option
+@cindex advanced features, nondecimal input data
+@cindex input, data@comma{} nondecimal
+@cindex constants, nondecimal
+
+If you run @command{gawk} with the @option{--non-decimal-data} option,
+you can have nondecimal values in your input data:
+
+@example
+$ @kbd{echo 0123 123 0x123 |}
+> @kbd{gawk --non-decimal-data '@{ printf "%d, %d, %d\n", $1, $2, $3 @}'}
+@print{} 83, 123, 291
+@end example
+
+For this feature to work, write your program so that
+@command{gawk} treats your data as numeric:
+
+@example
+$ @kbd{echo 0123 123 0x123 | gawk '@{ print $1, $2, $3 @}'}
+@print{} 0123 123 0x123
+@end example
+
+@noindent
+The @code{print} statement treats its expressions as strings.
+Although the fields can act as numbers when necessary,
+they are still strings, so @code{print} does not try to treat them
+numerically.  You need to add zero to a field to force it to
+be treated as a number.  For example:
+
+@example
+$ @kbd{echo 0123 123 0x123 | gawk --non-decimal-data '}
+> @kbd{@{ print $1, $2, $3}
+>   @kbd{print $1 + 0, $2 + 0, $3 + 0 @}'}
+@print{} 0123 123 0x123
+@print{} 83 123 291
+@end example
+
+Because it is common to have decimal data with leading zeros, and because
+using this facility could lead to surprising results, the default is to leave it
+disabled.  If you want it, you must explicitly request it.
+
+@cindex programming conventions, @code{--non-decimal-data} option
+@cindex @option{--non-decimal-data} option, @code{strtonum()} function and
+@cindex @code{strtonum()} function (@command{gawk}), @code{--non-decimal-data} option and
+@quotation CAUTION
+@emph{Use of this option is not recommended.}
+It can break old programs very badly.
+Instead, use the @code{strtonum()} function to convert your data
+(@pxref{String Functions}).
+This makes your programs easier to write and easier to read, and
+leads to less surprising results.
+
+This option may disappear in a future version of @command{gawk}.
+@end quotation
+
+@node Array Sorting
+@section Controlling Array Traversal and Array Sorting
+
+@command{gawk} lets you control the order in which a
+@samp{for (@var{indx} in @var{array})}
+loop traverses an array.
+
+In addition, two built-in functions, @code{asort()} and @code{asorti()},
+let you sort arrays based on the array values and indices, respectively.
+These two functions also provide control over the sorting criteria used
+to order the elements during sorting.
+
+@menu
+* Controlling Array Traversal:: How to use PROCINFO["sorted_in"].
+* Array Sorting Functions::     How to use @code{asort()} and @code{asorti()}.
+@end menu
+
+@node Controlling Array Traversal
+@subsection Controlling Array Traversal
+
+By default, the order in which a @samp{for (@var{indx} in @var{array})} loop
+scans an array is not defined; it is generally based upon
+the internal implementation of arrays inside @command{awk}.
+
+Often, though, it is desirable to be able to loop over the elements
+in a particular order that you, the programmer, choose.  @command{gawk}
+lets you do this.
+
+@ref{Controlling Scanning} describes how you can assign special,
+predefined values to @code{PROCINFO["sorted_in"]} in order to
+control the order in which @command{gawk} traverses an array
+during a @code{for} loop.
+
+In addition, the value of @code{PROCINFO["sorted_in"]} can be a
+function name.@footnote{This is why the predefined sorting orders
+start with an @samp{@@} character, which cannot be part of an identifier.}
+This lets you traverse an array based on any custom criterion.
+The array elements are ordered according to the return value of this
+function.  The comparison function should be defined with at least
+four arguments:
+
+@example
+function comp_func(i1, v1, i2, v2)
+@{
+    @var{compare elements 1 and 2 in some fashion}
+    @var{return < 0; 0; or > 0}
+@}
+@end example
+
+Here, @code{i1} and @code{i2} are the indices, and @code{v1} and @code{v2}
+are the corresponding values of the two elements being compared.
+Either @code{v1} or @code{v2}, or both, can be arrays if the array being
+traversed contains subarrays as values.
+(@xref{Arrays of Arrays} for more information about subarrays.)
+The three possible return values are interpreted as follows:
+
+@table @code
+@item comp_func(i1, v1, i2, v2) < 0
+Index @code{i1} comes before index @code{i2} during loop traversal.
+
+@item comp_func(i1, v1, i2, v2) == 0
+Indices @code{i1} and @code{i2}
+come together, but the relative order with respect to each other is undefined.
+
+@item comp_func(i1, v1, i2, v2) > 0
+Index @code{i1} comes after index @code{i2} during loop traversal.
+@end table
+
+Our first comparison function can be used to scan an array in
+numerical order of the indices:
+
+@example
+@group
+function cmp_num_idx(i1, v1, i2, v2)
+@{
+     # numerical index comparison, ascending order
+     return (i1 - i2)
+@}
+@end group
+@end example
+
+Our second function traverses an array based on the string order of
+the element values rather than by indices:
+
+@example
+function cmp_str_val(i1, v1, i2, v2)
+@{
+    # string value comparison, ascending order
+    v1 = v1 ""
+    v2 = v2 ""
+    if (v1 < v2)
+        return -1
+    return (v1 != v2)
+@}
+@end example
+
+The third
+comparison function makes all numbers, and numeric strings without
+any leading or trailing spaces, come out first during loop traversal:
+
+@example
+function cmp_num_str_val(i1, v1, i2, v2,   n1, n2)
+@{
+     # numbers before string value comparison, ascending order
+     n1 = v1 + 0
+     n2 = v2 + 0
+     if (n1 == v1)
+         return (n2 == v2) ? (n1 - n2) : -1
+     else if (n2 == v2)
+         return 1
+     return (v1 < v2) ? -1 : (v1 != v2)
+@}
+@end example
+
+Here is a main program to demonstrate how @command{gawk}
+behaves using each of the previous functions:
+
+@example
+BEGIN @{
+    data["one"] = 10
+    data["two"] = 20
+    data[10] = "one"
+    data[100] = 100
+    data[20] = "two"
+
+    f[1] = "cmp_num_idx"
+    f[2] = "cmp_str_val"
+    f[3] = "cmp_num_str_val"
+    for (i = 1; i <= 3; i++) @{
+        printf("Sort function: %s\n", f[i])
+        PROCINFO["sorted_in"] = f[i]
+        for (j in data)
+            printf("\tdata[%s] = %s\n", j, data[j])
+        print ""
+    @}
+@}
+@end example
+
+Here are the results when the program is run:
+
+@example
+$ @kbd{gawk -f compdemo.awk}
+@print{} Sort function: cmp_num_idx      @ii{Sort by numeric index}
+@print{}     data[two] = 20
+@print{}     data[one] = 10              @ii{Both strings are numerically zero}
+@print{}     data[10] = one
+@print{}     data[20] = two
+@print{}     data[100] = 100
+@print{}
+@print{} Sort function: cmp_str_val      @ii{Sort by element values as strings}
+@print{}     data[one] = 10
+@print{}     data[100] = 100             @ii{String 100 is less than string 20}
+@print{}     data[two] = 20
+@print{}     data[10] = one
+@print{}     data[20] = two
+@print{}
+@print{} Sort function: cmp_num_str_val  @ii{Sort all numeric values before all strings}
+@print{}     data[one] = 10
+@print{}     data[two] = 20
+@print{}     data[100] = 100
+@print{}     data[10] = one
+@print{}     data[20] = two
+@end example
+
+Consider sorting the entries of a GNU/Linux system password file
+according to login name.  The following program sorts records
+by a specific field position and can be used for this purpose:
+
+@example
+# passwd-sort.awk --- simple program to sort by field position
+# field position is specified by the global variable POS
+
+function cmp_field(i1, v1, i2, v2)
+@{
+    # comparison by value, as string, and ascending order
+    return v1[POS] < v2[POS] ? -1 : (v1[POS] != v2[POS])
+@}
+
+@{
+    for (i = 1; i <= NF; i++)
+        a[NR][i] = $i
+@}
+
+@group
+END @{
+    PROCINFO["sorted_in"] = "cmp_field"
+@end 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 ? ":" : "")
+        print ""
+    @}
+@}
+@end example
+
+The first field in each entry of the password file is the user's login name,
+and the fields are separated by colons.
+Each record defines a subarray,
+with each field as an element in the subarray.
+Running the program produces the
+following output:
+
+@example
+$ @kbd{gawk -v POS=1 -F: -f sort.awk /etc/passwd}
+@print{} adm:x:3:4:adm:/var/adm:/sbin/nologin
+@print{} apache:x:48:48:Apache:/var/www:/sbin/nologin
+@print{} avahi:x:70:70:Avahi daemon:/:/sbin/nologin
+@dots{}
+@end example
+
+The comparison should normally always return the same value when given a
+specific pair of array elements as its arguments.  If inconsistent
+results are returned, then the order is undefined.  This behavior can be
+exploited to introduce random order into otherwise seemingly
+ordered data:
+
+@example
+function cmp_randomize(i1, v1, i2, v2)
+@{
+    # random order (caution: this may never terminate!)
+    return (2 - 4 * rand())
+@}
+@end example
+
+As already mentioned, the order of the indices is arbitrary if two
+elements compare equal.  This is usually not a problem, but letting
+the tied elements come out in arbitrary order can be an issue, especially
+when comparing item values.  The partial ordering of the equal elements
+may change the next time the array is traversed, if other elements are added to or
+removed from the array.  One way to resolve ties when comparing elements
+with otherwise equal values is to include the indices in the comparison
+rules.  Note that doing this may make the loop traversal less efficient,
+so consider it only if necessary.  The following comparison functions
+force a deterministic order, and are based on the fact that the
+(string) indices of two elements are never equal:
+
+@example
+function cmp_numeric(i1, v1, i2, v2)
+@{
+    # numerical value (and index) comparison, descending order
+    return (v1 != v2) ? (v2 - v1) : (i2 - i1)
+@}
+
+@group
+function cmp_string(i1, v1, i2, v2)
+@{
+    # string value (and index) comparison, descending order
+    v1 = v1 i1
+    v2 = v2 i2
+    return (v1 > v2) ? -1 : (v1 != v2)
+@}
+@end group
+@end example
+
+@c Avoid using the term ``stable'' when describing the unpredictable behavior
+@c if two items compare equal.  Usually, the goal of a "stable algorithm"
+@c is to maintain the original order of the items, which is a meaningless
+@c concept for a list constructed from a hash.
+
+A custom comparison function can often simplify ordered loop
+traversal, and the sky is really the limit when it comes to
+designing such a function.
+
+When string comparisons are made during a sort, either for element
+values where one or both aren't numbers, or for element indices
+handled as strings, the value of @code{IGNORECASE}
+(@pxref{Built-in Variables}) controls whether
+the comparisons treat corresponding upper- and lowercase letters as
+equivalent or distinct.
+
+Another point to keep in mind is that in the case of subarrays,
+the element values can themselves be arrays; a production comparison
+function should use the @code{isarray()} function
+(@pxref{Type Functions})
+to check for this, and choose a defined sorting order for subarrays.
+
+All sorting based on @code{PROCINFO["sorted_in"]}
+is disabled in POSIX mode,
+because the @code{PROCINFO} array is not special in that case.
+
+As a side note, sorting the array indices before traversing
+the array has been reported to add a 15% to 20% overhead to the
+execution time of @command{awk} programs. For this reason,
+sorted array traversal is not the default.
+
+@c The @command{gawk}
+@c maintainers believe that only the people who wish to use a
+@c feature should have to pay for it.
+
+@node Array Sorting Functions
+@subsection Sorting Array Values and Indices with @command{gawk}
+
+@cindex arrays, sorting
+@cindexgawkfunc{asort}
+@cindex @code{asort()} function (@command{gawk}), arrays@comma{} sorting
+@cindexgawkfunc{asorti}
+@cindex @code{asorti()} function (@command{gawk}), arrays@comma{} sorting
+@cindex sort function, arrays, sorting
+In most @command{awk} implementations, sorting an array requires writing
+a @code{sort()} function.  This can be educational for exploring
+different sorting algorithms, but usually that's not the point of the program.
+@command{gawk} provides the built-in @code{asort()} and @code{asorti()}
+functions (@pxref{String Functions}) for sorting arrays.  For example:
+
+@example
+@var{populate the array} data
+n = asort(data)
+for (i = 1; i <= n; i++)
+    @var{do something with} data[i]
+@end example
+
+After the call to @code{asort()}, the array @code{data} is indexed from 1
+to some number @var{n}, the total number of elements in @code{data}.
+(This count is @code{asort()}'s return value.)
+@code{data[1]} @value{LEQ} @code{data[2]} @value{LEQ} @code{data[3]}, and so on.
+The default comparison is based on the type of the elements
+(@pxref{Typing and Comparison}).
+All numeric values come before all string values,
+which in turn come before all subarrays.
+
+@cindex side effects, @code{asort()} function
+An important side effect of calling @code{asort()} is that
+@emph{the array's original indices are irrevocably lost}.
+As this isn't always desirable, @code{asort()} accepts a
+second argument:
+
+@example
+@var{populate the array} source
+n = asort(source, dest)
+for (i = 1; i <= n; i++)
+    @var{do something with} dest[i]
+@end example
+
+In this case, @command{gawk} copies the @code{source} array into the
+@code{dest} array and then sorts @code{dest}, destroying its indices.
+However, the @code{source} array is not affected.
+
+Often, what's needed is to sort on the values of the @emph{indices}
+instead of the values of the elements.  To do that, use the
+@code{asorti()} function.  The interface and behavior are identical to
+that of @code{asort()}, except that the index values are used for sorting
+and become the values of the result array:
+
+@example
+@{ source[$0] = some_func($0) @}
+
+END @{
+    n = asorti(source, dest)
+    for (i = 1; i <= n; i++) @{
+        @ii{Work with sorted indices directly:}
+        @var{do something with} dest[i]
+        @dots{}
+        @ii{Access original array via sorted indices:}
+        @var{do something with} source[dest[i]]
+    @}
+@}
+@end example
+
+So far, so good. Now it starts to get interesting.  Both @code{asort()}
+and @code{asorti()} accept a third string argument to control comparison
+of array elements.  When we introduced @code{asort()} and @code{asorti()}
+in @ref{String Functions}, we ignored this third argument; however,
+now is the time to describe how this argument affects these two functions.
+
+Basically, the third argument specifies how the array is to be sorted.
+There are two possibilities.  As with @code{PROCINFO["sorted_in"]},
+this argument may be one of the predefined names that @command{gawk}
+provides (@pxref{Controlling Scanning}), or it may be the name of a
+user-defined function (@pxref{Controlling Array Traversal}).
+
+In the latter case, @emph{the function can compare elements in any way
+it chooses}, taking into account just the indices, just the values,
+or both.  This is extremely powerful.
+
+Once the array is sorted, @code{asort()} takes the @emph{values} in
+their final order and uses them to fill in the result array, whereas
+@code{asorti()} takes the @emph{indices} in their final order and uses
+them to fill in the result array.
+
+@cindex reference counting, sorting arrays
+@quotation NOTE
+Copying array indices and elements isn't expensive in terms of memory.
+Internally, @command{gawk} maintains @dfn{reference counts} to data.
+For example, when @code{asort()} copies the first array to the second one,
+there is only one copy of the original array elements' data, even though
+both arrays use the values.
+@end quotation
+
+@c Document It And Call It A Feature. Sigh.
+@cindex @command{gawk}, @code{IGNORECASE} variable in
+@cindex arrays, sorting, @code{IGNORECASE} variable and
+@cindex @code{IGNORECASE} variable, array sorting functions and
+Because @code{IGNORECASE} affects string comparisons, the value
+of @code{IGNORECASE} also affects sorting for both @code{asort()} and @code{asorti()}.
+Note also that the locale's sorting order does @emph{not}
+come into play; comparisons are based on character values only.@footnote{This
+is true because locale-based comparison occurs only when in
+POSIX-compatibility mode, and because @code{asort()} and @code{asorti()} are
+@command{gawk} extensions, they are not available in that case.}
+
+The following example demonstrates the use of a comparison function with
+@code{asort()}.  The comparison function, @code{case_fold_compare()}, maps
+both values to lowercase in order to compare them ignoring case.
+
+@example
+@group
+# case_fold_compare --- compare as strings, ignoring case
+
+function case_fold_compare(i1, v1, i2, v2,    l, r)
+@{
+    l = tolower(v1)
+@end group
+    r = tolower(v2)
+
+    if (l < r)
+        return -1
+    else if (l == r)
+        return 0
+    else
+        return 1
+@}
+@end example
+
+And here is the test program for it:
+
+@example
+# Test program
+
+BEGIN @{
+    Letters = "abcdefghijklmnopqrstuvwxyz" \
+              "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    split(Letters, data, "")
+
+    asort(data, result, "case_fold_compare")
+
+    j = length(result)
+    for (i = 1; i <= j; i++) @{
+        printf("%s", result[i])
+        if (i % (j/2) == 0)
+            printf("\n")
+        else
+            printf(" ")
+    @}
+@}
+@end example
+
+When run, we get the following:
+
+@example
+$ @kbd{gawk -f case_fold_compare.awk}
+@print{} A a B b c C D d e E F f g G H h i I J j k K l L M m
+@print{} n N O o p P Q q r R S s t T u U V v w W X x y Y z Z
+@end example
+
+@node Two-way I/O
+@section Two-Way Communications with Another Process
+
+@c 8/2014. Neither Mike nor BWK saw this as relevant. Commenting it out.
+@ignore
+@cindex Brennan, Michael
+@cindex programmers, attractiveness of
+@smallexample
+@c Path: cssun.mathcs.emory.edu!gatech!newsxfer3.itd.umich.edu!news-peer.sprintlink.net!news-sea-19.sprintlink.net!news-in-west.sprintlink.net!news.sprintlink.net!Sprint!204.94.52.5!news.whidbey.com!brennan
+From: brennan@@whidbey.com (Mike Brennan)
+Newsgroups: comp.lang.awk
+Subject: Re: Learn the SECRET to Attract Women Easily
+Date: 4 Aug 1997 17:34:46 GMT
+@c Organization: WhidbeyNet
+@c Lines: 12
+Message-ID: <5s53rm$eca@@news.whidbey.com>
+@c References: <5s20dn$2e1@chronicle.concentric.net>
+@c Reply-To: brennan@whidbey.com
+@c NNTP-Posting-Host: asn202.whidbey.com
+@c X-Newsreader: slrn (0.9.4.1 UNIX)
+@c Xref: cssun.mathcs.emory.edu comp.lang.awk:5403
+
+On 3 Aug 1997 13:17:43 GMT, Want More Dates???
+<tracy78@@kilgrona.com> wrote:
+>Learn the SECRET to Attract Women Easily
+>
+>The SCENT(tm)  Pheromone Sex Attractant For Men to Attract Women
+
+The scent of awk programmers is a lot more attractive to women than
+the scent of perl programmers.
+--
+Mike Brennan
+@c brennan@@whidbey.com
+@end smallexample
+@end ignore
+
+@cindex advanced features, processes@comma{} communicating with
+@cindex processes, two-way communications with
+It is often useful to be able to
+send data to a separate program for
+processing and then read the result.  This can always be
+done with temporary files:
+
+@example
+# Write the data for processing
+tempfile = ("mydata." PROCINFO["pid"])
+while (@var{not done with data})
+    print @var{data} | ("subprogram > " tempfile)
+close("subprogram > " tempfile)
+
+# Read the results, remove tempfile when done
+while ((getline newdata < tempfile) > 0)
+    @var{process} newdata @var{appropriately}
+close(tempfile)
+system("rm " tempfile)
+@end example
+
+@noindent
+This works, but not elegantly.  Among other things, it requires that
+the program be run in a directory that cannot be shared among users;
+for example, @file{/tmp} will not do, as another user might happen
+to be using a temporary file with the same name.@footnote{Michael
+Brennan suggests the use of @command{rand()} to generate unique
+@value{FN}s. This is a valid point; nevertheless, temporary files
+remain more difficult to use than two-way pipes.} @c 8/2014
+
+@cindex coprocesses
+@cindex input/output, two-way
+@cindex @code{|} (vertical bar), @code{|&} operator (I/O)
+@cindex vertical bar (@code{|}), @code{|&} operator (I/O)
+@cindex @command{csh} utility, @code{|&} operator, comparison with
+However, with @command{gawk}, it is possible to
+open a @emph{two-way} pipe to another process.  The second process is
+termed a @dfn{coprocess}, as it runs in parallel with @command{gawk}.
+The two-way connection is created using the @samp{|&} operator
+(borrowed from the Korn shell, @command{ksh}):@footnote{This is very
+different from the same operator in the C shell and in Bash.}
+
+@example
+do @{
+    print @var{data} |& "subprogram"
+    "subprogram" |& getline results
+@} while (@var{data left to process})
+close("subprogram")
+@end example
+
+The first time an I/O operation is executed using the @samp{|&}
+operator, @command{gawk} creates a two-way pipeline to a child process
+that runs the other program.  Output created with @code{print}
+or @code{printf} is written to the program's standard input, and
+output from the program's standard output can be read by the @command{gawk}
+program using @code{getline}.
+As is the case with processes started by @samp{|}, the subprogram
+can be any program, or pipeline of programs, that can be started by
+the shell.
+
+There are some cautionary items to be aware of:
+
+@itemize @value{BULLET}
+@item
+As the code inside @command{gawk} currently stands, the coprocess's
+standard error goes to the same place that the parent @command{gawk}'s
+standard error goes. It is not possible to read the child's
+standard error separately.
+
+@cindex deadlocks
+@cindex buffering, input/output
+@cindex @code{getline} command, deadlock and
+@item
+I/O buffering may be a problem.  @command{gawk} automatically
+flushes all output down the pipe to the coprocess.
+However, if the coprocess does not flush its output,
+@command{gawk} may hang when doing a @code{getline} in order to read
+the coprocess's results.  This could lead to a situation
+known as @dfn{deadlock}, where each process is waiting for the
+other one to do something.
+@end itemize
+
+@cindex @code{close()} function, two-way pipes and
+It is possible to close just one end of the two-way pipe to
+a coprocess, by supplying a second argument to the @code{close()}
+function of either @code{"to"} or @code{"from"}
+(@pxref{Close Files And Pipes}).
+These strings tell @command{gawk} to close the end of the pipe
+that sends data to the coprocess or the end that reads from it,
+respectively.
+
+@cindex @command{sort} utility, coprocesses and
+This is particularly necessary in order to use
+the system @command{sort} utility as part of a coprocess;
+@command{sort} must read @emph{all} of its input
+data before it can produce any output.
+The @command{sort} program does not receive an end-of-file indication
+until @command{gawk} closes the write end of the pipe.
+
+When you have finished writing data to the @command{sort}
+utility, you can close the @code{"to"} end of the pipe, and
+then start reading sorted data via @code{getline}.
+For example:
+
+@example
+BEGIN @{
+    command = "LC_ALL=C sort"
+    n = split("abcdefghijklmnopqrstuvwxyz", a, "")
+
+    for (i = n; i > 0; i--)
+        print a[i] |& command
+    close(command, "to")
+
+    while ((command |& getline line) > 0)
+        print "got", line
+    close(command)
+@}
+@end example
+
+This program writes the letters of the alphabet in reverse order, one
+per line, down the two-way pipe to @command{sort}.  It then closes the
+write end of the pipe, so that @command{sort} receives an end-of-file
+indication.  This causes @command{sort} to sort the data and write the
+sorted data back to the @command{gawk} program.  Once all of the data
+has been read, @command{gawk} terminates the coprocess and exits.
+
+As a side note, the assignment @samp{LC_ALL=C} in the @command{sort}
+command ensures traditional Unix (ASCII) sorting from @command{sort}.
+This is not strictly necessary here, but it's good to know how to do this.
+
+Be careful when closing the @code{"from"} end of a two-way pipe; in this
+case @command{gawk} waits for the child process to exit, which may cause
+your program to hang.  (Thus, this particular feature is of much less
+use in practice than being able to close the @code{"to"} end.)
+
+@quotation CAUTION
+Normally,
+it is a fatal error to write to the @code{"to"} end of a two-way
+pipe which has been closed, and it is also a fatal error to read
+from the @code{"from"} end of a two-way pipe that has been closed.
+
+You may set @code{PROCINFO["@var{command}", "NONFATAL"]} to
+make such operations become nonfatal. If you do so, you then need
+to check @code{ERRNO} after each @code{print}, @code{printf},
+or @code{getline}.
+@xref{Nonfatal}, for more information.
+@end quotation
+
+@cindex @command{gawk}, @code{PROCINFO} array in
+@cindex @code{PROCINFO} array, communications via ptys and
+You may also use pseudo-ttys (ptys) for
+two-way communication instead of pipes, if your system supports them.
+This is done on a per-command basis, by setting a special element
+in the @code{PROCINFO} array
+(@pxref{Auto-set}),
+like so:
+
+@example
+command = "sort -nr"           # command, save in convenience variable
+PROCINFO[command, "pty"] = 1   # update PROCINFO
+print @dots{} |& command           # start two-way pipe
+@dots{}
+@end example
+
+@noindent
+If your system does not have ptys, or if all the system's ptys are in use,
+@command{gawk} automatically falls back to using regular pipes.
+
+Using ptys usually avoids the buffer deadlock issues described earlier,
+at some loss in performance. This is because the tty driver buffers
+and sends data line-by-line.  On systems with the @command{stdbuf}
+(part of the @uref{https://www.gnu.org/software/coreutils/coreutils.html,
+GNU Coreutils package}), you can use that program instead of ptys.
+
+Note also that ptys are not fully transparent. Certain binary control
+codes, such @kbd{Ctrl-d} for end-of-file, are interpreted by the tty
+driver and not passed through.
+
+@quotation CAUTION
+Finally, coprocesses open up the possibility of @dfn{deadlock} between
+@command{gawk} and the program running in the coprocess. This can occur
+if you send ``too much'' data to the coprocess before reading any back;
+each process is blocked writing data with no one available to read what
+they've already written.  There is no workaround for deadlock; careful
+programming and knowledge of the behavior of the coprocess are required.
+@end quotation
+
+@c From email send January 4, 2018.
+The following example, due to Andrew Schorr, demonstrates how
+using ptys can help deal with buffering deadlocks.
+
+Suppose @command{gawk} were unable to add numbers.
+You could use a coprocess to do it. Here's an exceedingly
+simple program written for that purpose: 
+
+@example
+$ @kbd{cat add.c}
+#include <stdio.h> 
+
+int 
+main(void) 
+@{ 
+    int x, y; 
+    while (scanf("%d %d", & x, & y) == 2) 
+        printf("%d\n", x + y); 
+    return 0; 
+@} 
+$ @kbd{cc -O add.c -o add}	@ii{Compile the program}
+@end example
+
+You could then write an exceedingly simple @command{gawk} program
+to add numbers by passing them to the coprocess:
+
+@example
+$ @kbd{echo 1 2 |}
+> @kbd{gawk -v cmd=./add '@{ print |& cmd; cmd |& getline x; print x @}'}
+@end example
+
+And it would deadlock, because @file{add.c} fails to call
+@samp{setlinebuf(stdout)}. The @command{add} program freezes. 
+
+Now try instead: 
+
+@example
+$ @kbd{echo 1 2 |}
+> @kbd{gawk -v cmd=add 'BEGIN @{ PROCINFO[cmd, "pty"] = 1 @}}
+> @kbd{                 @{ print |& cmd; cmd |& getline x; print x @}'}
+@print{} 3 
+@end example
+
+By using a pty, @command{gawk} fools the standard I/O library into
+thinking it has an interactive session, so it defaults to line buffering.
+And now, magically, it works!
+
+@node TCP/IP Networking
+@section Using @command{gawk} for Network Programming
+@cindex advanced features, network programming
+@cindex networks, programming
+@cindex TCP/IP
+@cindex @code{/inet/@dots{}} special files (@command{gawk})
+@cindex files, @code{/inet/@dots{}} (@command{gawk})
+@cindex @code{/inet4/@dots{}} special files (@command{gawk})
+@cindex files, @code{/inet4/@dots{}} (@command{gawk})
+@cindex @code{/inet6/@dots{}} special files (@command{gawk})
+@cindex files, @code{/inet6/@dots{}} (@command{gawk})
+@cindex @code{EMRED}
+@ifnotdocbook
+@quotation
+@code{EMRED}:@*
+@ @ @ @ @i{A host is a host from coast to coast,@*
+@ @ @ @ and nobody talks to a host that's close,@*
+@ @ @ @ unless the host that isn't close@*
+@ @ @ @ is busy, hung, or dead.}
+@author Mike O'Brien (aka Mr.@: Protocol)
+@end quotation
+@end ifnotdocbook
+
+@docbook
+<blockquote>
+<attribution>Mike O'Brien (aka Mr.&nbsp;Protocol)</attribution>
+<literallayout class="normal"><literal>EMRED</literal>:
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>A host is a host from coast to coast,</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>and no-one can talk to host that's close,</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>unless the host that isn't close</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>is busy, hung, or dead.</emphasis></literallayout>
+</blockquote>
+@end docbook
+
+In addition to being able to open a two-way pipeline to a coprocess
+on the same system
+(@pxref{Two-way I/O}),
+it is possible to make a two-way connection to
+another process on another system across an IP network connection.
+
+You can think of this as just a @emph{very long} two-way pipeline to
+a coprocess.
+The way @command{gawk} decides that you want to use TCP/IP networking is
+by recognizing special @value{FN}s that begin with one of @samp{/inet/},
+@samp{/inet4/}, or @samp{/inet6/}.
+
+The full syntax of the special @value{FN} is
+@file{/@var{net-type}/@var{protocol}/@var{local-port}/@var{remote-host}/@var{remote-port}}.
+The components are:
+
+@table @var
+@item net-type
+Specifies the kind of Internet connection to make.
+Use @samp{/inet4/} to force IPv4, and
+@samp{/inet6/} to force IPv6.
+Plain @samp{/inet/} (which used to be the only option) uses
+the system default, most likely IPv4.
+
+@item protocol
+The protocol to use over IP.  This must be either @samp{tcp}, or
+@samp{udp}, for a TCP or UDP IP connection,
+respectively.  TCP should be used for most applications.
+
+@item local-port
+@cindex @code{getaddrinfo()} function (C library)
+The local TCP or UDP port number to use.  Use a port number of @samp{0}
+when you want the system to pick a port. This is what you should do
+when writing a TCP or UDP client.
+You may also use a well-known service name, such as @samp{smtp}
+or @samp{http}, in which case @command{gawk} attempts to determine
+the predefined port number using the C @code{getaddrinfo()} function.
+
+@item remote-host
+The IP address or fully qualified domain name of the Internet
+host to which you want to connect.
+
+@item remote-port
+The TCP or UDP port number to use on the given @var{remote-host}.
+Again, use @samp{0} if you don't care, or else a well-known
+service name.
+@end table
+
+@cindex @command{gawk}, @code{ERRNO} variable in
+@cindex @code{ERRNO} variable
+@quotation NOTE
+Failure in opening a two-way socket will result in a nonfatal error
+being returned to the calling code. The value of @code{ERRNO} indicates
+the error (@pxref{Auto-set}).
+@end quotation
+
+Consider the following very simple example:
+
+@example
+BEGIN @{
+    Service = "/inet/tcp/0/localhost/daytime"
+    Service |& getline
+    print $0
+    close(Service)
+@}
+@end example
+
+This program reads the current date and time from the local system's
+TCP @code{daytime} server.
+It then prints the results and closes the connection.
+
+Because this topic is extensive, the use of @command{gawk} for
+TCP/IP programming is documented separately.
+@ifinfo
+See
+@inforef{Top, , General Introduction, gawkinet, @value{GAWKINETTITLE}},
+@end ifinfo
+@ifnotinfo
+See
+@uref{https://www.gnu.org/software/gawk/manual/gawkinet/,
+@cite{@value{GAWKINETTITLE}}},
+which comes as part of the @command{gawk} distribution,
+@end ifnotinfo
+for a much more complete introduction and discussion, as well as
+extensive examples.
+
+@quotation NOTE
+@command{gawk} can only open direct sockets. There is currently
+no way to access services available over Secure Socket Layer
+(SSL); this includes any web service whose URL starts with @samp{https://}.
+@end quotation
+
+
+@node Profiling
+@section Profiling Your @command{awk} Programs
+@cindex @command{awk} programs, profiling
+@cindex profiling @command{awk} programs
+@cindex @code{awkprof.out} file
+@cindex files, @code{awkprof.out}
+
+You may produce execution traces of your @command{awk} programs.
+This is done by passing the option @option{--profile} to @command{gawk}.
+When @command{gawk} has finished running, it creates a profile of your program in a file
+named @file{awkprof.out}. Because it is profiling, it also executes up to 45% slower than
+@command{gawk} normally does.
+
+@cindex @option{--profile} option
+As shown in the following example,
+the @option{--profile} option can be used to change the name of the file
+where @command{gawk} will write the profile:
+
+@example
+gawk --profile=myprog.prof -f myprog.awk data1 data2
+@end example
+
+@noindent
+In the preceding example, @command{gawk} places the profile in
+@file{myprog.prof} instead of in @file{awkprof.out}.
+
+Here is a sample session showing a simple @command{awk} program,
+its input data, and the results from running @command{gawk} with the
+@option{--profile} option.  First, the @command{awk} program:
+
+@example
+BEGIN @{ print "First BEGIN rule" @}
+
+END @{ print "First END rule" @}
+
+/foo/ @{
+    print "matched /foo/, gosh"
+    for (i = 1; i <= 3; i++)
+        sing()
+@}
+
+@{
+    if (/foo/)
+        print "if is true"
+    else
+        print "else is true"
+@}
+
+BEGIN @{ print "Second BEGIN rule" @}
+
+END @{ print "Second END rule" @}
+
+function sing(    dummy)
+@{
+    print "I gotta be me!"
+@}
+@end example
+
+Following is the input data:
+
+@example
+foo
+bar
+baz
+foo
+junk
+@end example
+
+Here is the @file{awkprof.out} that results from running the
+@command{gawk} profiler on this program and data (this example also
+illustrates that @command{awk} programmers sometimes get up very early
+in the morning to work):
+
+@cindex @code{BEGIN} pattern, profiling and
+@cindex @code{END} pattern, profiling and
+@example
+    # gawk profile, created Mon Sep 29 05:16:21 2014
+
+    # BEGIN rule(s)
+
+    BEGIN @{
+ 1          print "First BEGIN rule"
+    @}
+
+    BEGIN @{
+ 1          print "Second BEGIN rule"
+    @}
+
+    # Rule(s)
+
+ 5  /foo/ @{ # 2
+ 2          print "matched /foo/, gosh"
+ 6          for (i = 1; i <= 3; i++) @{
+ 6                  sing()
+            @}
+    @}
+
+ 5  @{
+ 5          if (/foo/) @{ # 2
+ 2                  print "if is true"
+ 3          @} else @{
+ 3                  print "else is true"
+            @}
+    @}
+
+    # END rule(s)
+
+    END @{
+ 1          print "First END rule"
+    @}
+
+    END @{
+ 1          print "Second END rule"
+    @}
+
+
+    # Functions, listed alphabetically
+
+ 6  function sing(dummy)
+    @{
+ 6          print "I gotta be me!"
+    @}
+@end example
+
+This example illustrates many of the basic features of profiling output.
+They are as follows:
+
+@itemize @value{BULLET}
+@item
+The program is printed in the order @code{BEGIN} rules,
+@code{BEGINFILE} rules,
+pattern--action rules,
+@code{ENDFILE} rules, @code{END} rules, and functions, listed
+alphabetically.
+Multiple @code{BEGIN} and @code{END} rules retain their
+separate identities, as do
+multiple @code{BEGINFILE} and @code{ENDFILE} rules.
+
+@cindex patterns, counts, in a profile
+@item
+Pattern--action rules have two counts.
+The first count, to the left of the rule, shows how many times
+the rule's pattern was @emph{tested}.
+The second count, to the right of the rule's opening left brace
+in a comment,
+shows how many times the rule's action was @emph{executed}.
+The difference between the two indicates how many times the rule's
+pattern evaluated to false.
+
+@item
+Similarly,
+the count for an @code{if}-@code{else} statement shows how many times
+the condition was tested.
+To the right of the opening left brace for the @code{if}'s body
+is a count showing how many times the condition was true.
+The count for the @code{else}
+indicates how many times the test failed.
+
+@cindex loops, count for header, in a profile
+@item
+The count for a loop header (such as @code{for}
+or @code{while}) shows how many times the loop test was executed.
+(Because of this, you can't just look at the count on the first
+statement in a rule to determine how many times the rule was executed.
+If the first statement is a loop, the count is misleading.)
+
+@cindex functions, user-defined, counts@comma{} in a profile
+@cindex user-defined, functions, counts@comma{} in a profile
+@item
+For user-defined functions, the count next to the @code{function}
+keyword indicates how many times the function was called.
+The counts next to the statements in the body show how many times
+those statements were executed.
+
+@cindex @code{@{@}} (braces)
+@cindex braces (@code{@{@}})
+@item
+The layout uses ``K&R'' style with TABs.
+Braces are used everywhere, even when
+the body of an @code{if}, @code{else}, or loop is only a single statement.
+
+@cindex @code{()} (parentheses), in a profile
+@cindex parentheses @code{()}, in a profile
+@item
+Parentheses are used only where needed, as indicated by the structure
+of the program and the precedence rules.
+For example, @samp{(3 + 5) * 4} means add three and five, then multiply
+the total by four.  However, @samp{3 + 5 * 4} has no parentheses, and
+means @samp{3 + (5 * 4)}.
+However, explicit parentheses in the source program are retained.
+
+@ignore
+@item
+All string concatenations are parenthesized too.
+(This could be made a bit smarter.)
+@end ignore
+
+@item
+Parentheses are used around the arguments to @code{print}
+and @code{printf} only when
+the @code{print} or @code{printf} statement is followed by a redirection.
+Similarly, if
+the target of a redirection isn't a scalar, it gets parenthesized.
+
+@item
+@command{gawk} supplies leading comments in
+front of the @code{BEGIN} and @code{END} rules,
+the @code{BEGINFILE} and @code{ENDFILE} rules,
+the pattern--action rules, and the functions.
+
+@end itemize
+
+The profiled version of your program may not look exactly like what you
+typed when you wrote it.  This is because @command{gawk} creates the
+profiled version by ``pretty-printing'' its internal representation of
+the program.  The advantage to this is that @command{gawk} can produce
+a standard representation.
+Also, things such as:
+
+@example
+/foo/
+@end example
+
+@noindent
+come out as:
+
+@example
+/foo/   @{
+    print
+@}
+@end example
+
+@noindent
+which is correct, but possibly unexpected.
+(If a program uses both @samp{print $0} and plain
+@samp{print}, that distinction is retained.)
+
+@cindex profiling @command{awk} programs, dynamically
+@cindex @command{gawk} program, dynamic profiling
+@cindex dynamic profiling
+Besides creating profiles when a program has completed,
+@command{gawk} can produce a profile while it is running.
+This is useful if your @command{awk} program goes into an
+infinite loop and you want to see what has been executed.
+To use this feature, run @command{gawk} with the @option{--profile}
+option in the background:
+
+@example
+$ @kbd{gawk --profile -f myprog &}
+[1] 13992
+@end example
+
+@cindex @command{kill} command@comma{} dynamic profiling
+@cindex @code{USR1} signal, for dynamic profiling
+@cindex @code{SIGUSR1} signal, for dynamic profiling
+@cindex signals, @code{USR1}/@code{SIGUSR1}, for profiling
+@noindent
+The shell prints a job number and process ID number; in this case, 13992.
+Use the @command{kill} command to send the @code{USR1} signal
+to @command{gawk}:
+
+@example
+$ @kbd{kill -USR1 13992}
+@end example
+
+@noindent
+As usual, the profiled version of the program is written to
+@file{awkprof.out}, or to a different file if one was specified with
+the @option{--profile} option.
+
+Along with the regular profile, as shown earlier, the profile file
+includes a trace of any active functions:
+
+@example
+# Function Call Stack:
+
+#   3. baz
+#   2. bar
+#   1. foo
+# -- main --
+@end example
+
+You may send @command{gawk} the @code{USR1} signal as many times as you like.
+Each time, the profile and function call trace are appended to the output
+profile file.
+
+@cindex @code{HUP} signal, for dynamic profiling
+@cindex @code{SIGHUP} signal, for dynamic profiling
+@cindex signals, @code{HUP}/@code{SIGHUP}, for profiling
+If you use the @code{HUP} signal instead of the @code{USR1} signal,
+@command{gawk} produces the profile and the function call trace and then exits.
+
+@cindex @code{INT} signal (MS-Windows)
+@cindex @code{SIGINT} signal (MS-Windows)
+@cindex signals, @code{INT}/@code{SIGINT} (MS-Windows)
+@cindex @code{QUIT} signal (MS-Windows)
+@cindex @code{SIGQUIT} signal (MS-Windows)
+@cindex signals, @code{QUIT}/@code{SIGQUIT} (MS-Windows)
+When @command{gawk} runs on MS-Windows systems, it uses the
+@code{INT} and @code{QUIT} signals for producing the profile, and in
+the case of the @code{INT} signal, @command{gawk} exits.  This is
+because these systems don't support the @command{kill} command, so the
+only signals you can deliver to a program are those generated by the
+keyboard.  The @code{INT} signal is generated by the
+@kbd{Ctrl-c} or @kbd{Ctrl-BREAK} key, while the
+@code{QUIT} signal is generated by the @kbd{Ctrl-\} key.
+
+@cindex pretty printing
+Finally, @command{gawk} also accepts another option, @option{--pretty-print}.
+When called this way, @command{gawk} ``pretty-prints'' the program into
+@file{awkprof.out}, without any execution counts.
+
+@quotation NOTE
+Once upon a time, the @option{--pretty-print} option would also run
+your program.  This is no longer the case.
+@end quotation
+
+@cindex profiling, pretty-printing, difference with
+@cindex pretty-printing, profiling, difference with
+There is a significant difference between the output created when
+profiling, and that created when pretty-printing.  Pretty-printed output
+preserves the original comments that were in the program, although their
+placement may not correspond exactly to their original locations in the
+source code. However, no comments should be lost.
+Also, @command{gawk} does the best it can to preserve
+the distinction between comments at the end of a statement and comments
+on lines by themselves. This isn't always perfect, though.
+
+However, as a deliberate design decision, profiling output @emph{omits}
+the original program's comments. This allows you to focus on the
+execution count data and helps you avoid the temptation to use the
+profiler for pretty-printing.
+
+Additionally, pretty-printed output does not have the leading indentation
+that the profiling output does. This makes it easy to pretty-print your
+code once development is completed, and then use the result as the final
+version of your program.
+
+Because the internal representation of your program is formatted to
+recreate an @command{awk} program, profiling and pretty-printing
+automatically disable @command{gawk}'s default optimizations.
+
+Profiling and pretty-printing also preserve the original format of numeric
+constants; if you used an octal or hexadecimal value in your source
+code, it will appear that way in the output.
+
+@node Advanced Features Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+The @option{--non-decimal-data} option causes @command{gawk} to treat
+octal- and hexadecimal-looking input data as octal and hexadecimal.
+This option should be used with caution or not at all; use of @code{strtonum()}
+is preferable.
+Note that this option may disappear in a future version of @command{gawk}.
+
+@item
+You can take over complete control of sorting in @samp{for (@var{indx} in @var{array})}
+array traversal by setting @code{PROCINFO["sorted_in"]} to the name of a user-defined
+function that does the comparison of array elements based on index and value.
+
+@item
+Similarly, you can supply the name of a user-defined comparison function as the
+third argument to either @code{asort()} or @command{asorti()} to control how
+those functions sort arrays. Or you may provide one of the predefined control
+strings that work for @code{PROCINFO["sorted_in"]}.
+
+@item
+You can use the @samp{|&} operator to create a two-way pipe to a coprocess.
+You read from the coprocess with @code{getline} and write to it with @code{print}
+or @code{printf}. Use @code{close()} to close off the coprocess completely, or
+optionally, close off one side of the two-way communications.
+
+@item
+By using special @value{FN}s with the @samp{|&} operator, you can open a
+TCP/IP (or UDP/IP) connection to remote hosts on the Internet. @command{gawk}
+supports both IPv4 and IPv6.
+
+@item
+You can generate statement count profiles of your program. This can help you
+determine which parts of your program may be taking the most time and let
+you tune them more easily.  Sending the @code{USR1} signal while profiling causes
+@command{gawk} to dump the profile and keep going, including a function call stack.
+
+@item
+You can also just ``pretty-print'' the program.
+
+@end itemize
+
+
+@node Internationalization
+@chapter Internationalization with @command{gawk}
+
+Once upon a time, computer makers
+wrote software that worked only in English.
+Eventually, hardware and software vendors noticed that if their
+systems worked in the native languages of non-English-speaking
+countries, they were able to sell more systems.
+As a result, internationalization and localization
+of programs and software systems became a common practice.
+
+@cindex internationalization, localization
+@cindex @command{gawk}, internationalization and, See internationalization
+@cindex internationalization, localization, @command{gawk} and
+For many years, the ability to provide internationalization
+was largely restricted to programs written in C and C++.
+This @value{CHAPTER} describes the underlying library @command{gawk}
+uses for internationalization, as well as how
+@command{gawk} makes internationalization
+features available at the @command{awk} program level.
+Having internationalization available at the @command{awk} level
+gives software developers additional flexibility---they are no
+longer forced to write in C or C++ when internationalization is
+a requirement.
+
+@menu
+* I18N and L10N::               Internationalization and Localization.
+* Explaining gettext::          How GNU @command{gettext} works.
+* Programmer i18n::             Features for the programmer.
+* Translator i18n::             Features for the translator.
+* I18N Example::                A simple i18n example.
+* Gawk I18N::                   @command{gawk} is also internationalized.
+* I18N Summary::                Summary of I18N stuff.
+@end menu
+
+@node I18N and L10N
+@section Internationalization and Localization
+
+@cindex internationalization
+@cindex localization, See internationalization@comma{} localization
+@cindex localization
+@dfn{Internationalization} means writing (or modifying) a program once,
+in such a way that it can use multiple languages without requiring
+further source code changes.
+@dfn{Localization} means providing the data necessary for an
+internationalized program to work in a particular language.
+Most typically, these terms refer to features such as the language
+used for printing error messages, the language used to read
+responses, and information related to how numerical and
+monetary values are printed and read.
+
+@node Explaining gettext
+@section GNU @command{gettext}
+
+@cindex internationalizing a program
+@cindex @command{gettext} library
+@command{gawk} uses GNU @command{gettext} to provide its internationalization
+features.
+The facilities in GNU @command{gettext} focus on messages: strings printed
+by a program, either directly or via formatting with @code{printf} or
+@code{sprintf()}.@footnote{For some operating systems, the @command{gawk}
+port doesn't support GNU @command{gettext}.
+Therefore, these features are not available
+if you are using one of those operating systems. Sorry.}
+
+@cindex portability, @command{gettext} library and
+When using GNU @command{gettext}, each application has its own
+@dfn{text domain}.  This is a unique name, such as @samp{kpilot} or @samp{gawk},
+that identifies the application.
+A complete application may have multiple components---programs written
+in C or C++, as well as scripts written in @command{sh} or @command{awk}.
+All of the components use the same text domain.
+
+To make the discussion concrete, assume we're writing an application
+named @command{guide}.  Internationalization consists of the
+following steps, in this order:
+
+@enumerate
+@item
+The programmer reviews the source for all of @command{guide}'s components
+and marks each string that is a candidate for translation.
+For example, @code{"`-F': option required"} is a good candidate for translation.
+A table with strings of option names is not (e.g., @command{gawk}'s
+@option{--profile} option should remain the same, no matter what the local
+language).
+
+@cindex @code{textdomain()} function (C library)
+@item
+The programmer indicates the application's text domain
+(@command{"guide"}) to the @command{gettext} library,
+by calling the @code{textdomain()} function.
+
+@cindex @code{.pot} files
+@cindex files, @code{.pot}
+@cindex portable object template files
+@cindex files, portable object template
+@item
+Messages from the application are extracted from the source code and
+collected into a portable object template file (@file{guide.pot}),
+which lists the strings and their translations.
+The translations are initially empty.
+The original (usually English) messages serve as the key for
+lookup of the translations.
+
+@cindex @code{.po} files
+@cindex files, @code{.po}
+@cindex portable object files
+@cindex files, portable object
+@item
+For each language with a translator, @file{guide.pot}
+is copied to a portable object file (@code{.po})
+and translations are created and shipped with the application.
+For example, there might be a @file{fr.po} for a French translation.
+
+@cindex @code{.gmo} files
+@cindex files, @code{.gmo}
+@cindex message object files
+@cindex files, message object
+@item
+Each language's @file{.po} file is converted into a binary
+message object (@file{.gmo}) file.
+A message object file contains the original messages and their
+translations in a binary format that allows fast lookup of translations
+at runtime.
+
+@item
+When @command{guide} is built and installed, the binary translation files
+are installed in a standard place.
+
+@cindex @code{bindtextdomain()} function (C library)
+@item
+For testing and development, it is possible to tell @command{gettext}
+to use @file{.gmo} files in a different directory than the standard
+one by using the @code{bindtextdomain()} function.
+
+@cindex @code{.gmo} files, specifying directory of
+@cindex files, @code{.gmo}, specifying directory of
+@cindex message object files, specifying directory of
+@cindex files, message object, specifying directory of
+@item
+At runtime, @command{guide} looks up each string via a call
+to @code{gettext()}.  The returned string is the translated string
+if available, or the original string if not.
+
+@item
+If necessary, it is possible to access messages from a different
+text domain than the one belonging to the application, without
+having to switch the application's default text domain back
+and forth.
+@end enumerate
+
+@cindex @code{gettext()} function (C library)
+In C (or C++), the string marking and dynamic translation lookup
+are accomplished by wrapping each string in a call to @code{gettext()}:
+
+@example
+printf("%s", gettext("Don't Panic!\n"));
+@end example
+
+The tools that extract messages from source code pull out all
+strings enclosed in calls to @code{gettext()}.
+
+@cindex @code{_} (underscore), C macro
+@cindex underscore (@code{_}), C macro
+The GNU @command{gettext} developers, recognizing that typing
+@samp{gettext(@dots{})} over and over again is both painful and ugly to look
+at, use the macro @samp{_} (an underscore) to make things easier:
+
+@example
+/* In the standard header file: */
+#define _(str) gettext(str)
+
+/* In the program text: */
+printf("%s", _("Don't Panic!\n"));
+@end example
+
+@cindex internationalization, localization, locale categories
+@cindex @command{gettext} library, locale categories
+@cindex locale categories
+@noindent
+This reduces the typing overhead to just three extra characters per string
+and is considerably easier to read as well.
+
+There are locale @dfn{categories}
+for different types of locale-related information.
+The defined locale categories that @command{gettext} knows about are:
+
+@table @code
+@cindex @code{LC_MESSAGES} locale category
+@item LC_MESSAGES
+Text messages.  This is the default category for @command{gettext}
+operations, but it is possible to supply a different one explicitly,
+if necessary.  (It is almost never necessary to supply a different category.)
+
+@cindex sorting characters in different languages
+@cindex @code{LC_COLLATE} locale category
+@item LC_COLLATE
+Text-collation information (i.e., how different characters
+and/or groups of characters sort in a given language).
+
+@cindex @code{LC_CTYPE} locale category
+@item LC_CTYPE
+Character-type information (alphabetic, digit, upper- or lowercase, and
+so on) as well as character encoding.
+@ignore
+In June 2001 Bruno Haible wrote:
+- Description of LC_CTYPE: It determines both
+  1. character encoding,
+  2. character type information.
+  (For example, in both KOI8-R and ISO-8859-5 the character type information
+  is the same - cyrillic letters could as 'alpha' - but the encoding is
+  different.)
+@end ignore
+This information is accessed via the
+POSIX character classes in regular expressions,
+such as @code{/[[:alnum:]]/}
+(@pxref{Bracket Expressions}).
+
+@cindex monetary information, localization
+@cindex currency symbols, localization
+@cindex @code{LC_MONETARY} locale category
+@item LC_MONETARY
+Monetary information, such as the currency symbol, and whether the
+symbol goes before or after a number.
+
+@cindex @code{LC_NUMERIC} locale category
+@item LC_NUMERIC
+Numeric information, such as which characters to use for the decimal
+point and the thousands separator.@footnote{Americans
+use a comma every three decimal places and a period for the decimal
+point, while many Europeans do exactly the opposite:
+1,234.56 versus 1.234,56.}
+
+@cindex time, localization and
+@cindex dates, information related to@comma{} localization
+@cindex @code{LC_TIME} locale category
+@item LC_TIME
+Time- and date-related information, such as 12- or 24-hour clock, month printed
+before or after the day in a date, local month abbreviations, and so on.
+
+@cindex @code{LC_ALL} locale category
+@item LC_ALL
+All of the above.  (Not too useful in the context of @command{gettext}.)
+@end table
+
+@quotation NOTE
+@cindex @env{LANGUAGE} environment variable
+As described in @ref{Locales}, environment variables with the same
+name as the locale categories (@env{LC_CTYPE}, @env{LC_ALL}, etc.)
+influence @command{gawk}'s behavior (and that of other utilities).
+
+Normally, these variables also affect how the @code{gettext} library
+finds translations.  However, the @env{LANGUAGE} environment variable
+overrides the @env{LC_@var{xxx}} variables. Many GNU/Linux systems
+may define this variable without your knowledge, causing @command{gawk}
+to not find the correct translations.  If this happens to you,
+look to see if @env{LANGUAGE} is defined, and if so, use the shell's
+@command{unset} command to remove it.
+@end quotation
+
+For testing translations of @command{gawk} itself, you can set
+the @env{GAWK_LOCALE_DIR} environment variable. See the documentation
+for the C @code{bindtextdomain()} function and also see
+@ref{Other Environment Variables}.
+
+@node Programmer i18n
+@section Internationalizing @command{awk} Programs
+@cindex @command{awk} programs, internationalizing
+
+@command{gawk} provides the following variables for
+internationalization:
+
+@table @code
+@cindex @code{TEXTDOMAIN} variable
+@item TEXTDOMAIN
+This variable indicates the application's text domain.
+For compatibility with GNU @command{gettext}, the default
+value is @code{"messages"}.
+
+@cindex internationalization, localization, marked strings
+@cindex strings, for localization
+@item _"your message here"
+String constants marked with a leading underscore
+are candidates for translation at runtime.
+String constants without a leading underscore are not translated.
+@end table
+
+@command{gawk} provides the following functions for
+internationalization:
+
+@table @code
+@cindexgawkfunc{dcgettext}
+@item @code{dcgettext(@var{string}} [@code{,} @var{domain} [@code{,} @var{category}]]@code{)}
+Return the translation of @var{string} in
+text domain @var{domain} for locale category @var{category}.
+The default value for @var{domain} is the current value of @code{TEXTDOMAIN}.
+The default value for @var{category} is @code{"LC_MESSAGES"}.
+
+If you supply a value for @var{category}, it must be a string equal to
+one of the known locale categories described in
+@ifnotinfo
+the previous @value{SECTION}.
+@end ifnotinfo
+@ifinfo
+@ref{Explaining gettext}.
+@end ifinfo
+You must also supply a text domain.  Use @code{TEXTDOMAIN} if
+you want to use the current domain.
+
+@quotation CAUTION
+The order of arguments to the @command{awk} version
+of the @code{dcgettext()} function is purposely different from the order for
+the C version.  The @command{awk} version's order was
+chosen to be simple and to allow for reasonable @command{awk}-style
+default arguments.
+@end quotation
+
+@cindexgawkfunc{dcngettext}
+@item @code{dcngettext(@var{string1}, @var{string2}, @var{number}} [@code{,} @var{domain} [@code{,} @var{category}]]@code{)}
+Return the plural form used for @var{number} of the
+translation of @var{string1} and @var{string2} in text domain
+@var{domain} for locale category @var{category}. @var{string1} is the
+English singular variant of a message, and @var{string2} is the English plural
+variant of the same message.
+The default value for @var{domain} is the current value of @code{TEXTDOMAIN}.
+The default value for @var{category} is @code{"LC_MESSAGES"}.
+
+The same remarks about argument order as for the @code{dcgettext()} function apply.
+
+@cindex @code{.gmo} files, specifying directory of
+@cindex files, @code{.gmo}, specifying directory of
+@cindex message object files, specifying directory of
+@cindex files, message object, specifying directory of
+@cindexgawkfunc{bindtextdomain}
+@item @code{bindtextdomain(@var{directory}} [@code{,} @var{domain} ]@code{)}
+Change the directory in which
+@command{gettext} looks for @file{.gmo} files, in case they
+will not or cannot be placed in the standard locations
+(e.g., during testing).
+Return the directory in which @var{domain} is ``bound.''
+
+The default @var{domain} is the value of @code{TEXTDOMAIN}.
+If @var{directory} is the null string (@code{""}), then
+@code{bindtextdomain()} returns the current binding for the
+given @var{domain}.
+@end table
+
+To use these facilities in your @command{awk} program, follow these steps:
+
+@enumerate
+@cindex @code{BEGIN} pattern, @code{TEXTDOMAIN} variable and
+@cindex @code{TEXTDOMAIN} variable, @code{BEGIN} pattern and
+@item
+Set the variable @code{TEXTDOMAIN} to the text domain of
+your program.  This is best done in a @code{BEGIN} rule
+(@pxref{BEGIN/END}),
+or it can also be done via the @option{-v} command-line
+option (@pxref{Options}):
+
+@example
+BEGIN @{
+    TEXTDOMAIN = "guide"
+    @dots{}
+@}
+@end example
+
+@cindex @code{_} (underscore), translatable string
+@cindex underscore (@code{_}), translatable string
+@item
+Mark all translatable strings with a leading underscore (@samp{_})
+character.  It @emph{must} be adjacent to the opening
+quote of the string.  For example:
+
+@example
+print _"hello, world"
+x = _"you goofed"
+printf(_"Number of users is %d\n", nusers)
+@end example
+
+@item
+If you are creating strings dynamically, you can
+still translate them, using the @code{dcgettext()}
+built-in function:@footnote{Thanks to Bruno Haible for this
+example.}
+
+@example
+if (groggy)
+    message = dcgettext("%d customers disturbing me\n", "adminprog")
+else
+    message = dcgettext("enjoying %d customers\n", "adminprog")
+printf(message, ncustomers)
+@end example
+
+Here, the call to @code{dcgettext()} supplies a different
+text domain (@code{"adminprog"}) in which to find the
+message, but it uses the default @code{"LC_MESSAGES"} category.
+
+The previous example only works if @code{ncustomers} is greater than one.
+This example would be better done with @code{dcngettext()}:
+
+@example
+if (groggy)
+    message = dcngettext("%d customer disturbing me\n",
+                         "%d customers disturbing me\n",
+                         ncustomers, "adminprog")
+else
+    message = dcngettext("enjoying %d customer\n",
+                         "enjoying %d customers\n",
+                         ncustomers, "adminprog")
+printf(message, ncustomers)
+@end example
+
+
+@cindex @code{LC_MESSAGES} locale category, @code{bindtextdomain()} function (@command{gawk})
+@item
+During development, you might want to put the @file{.gmo}
+file in a private directory for testing.  This is done
+with the @code{bindtextdomain()} built-in function:
+
+@example
+BEGIN @{
+   TEXTDOMAIN = "guide"   # our text domain
+   if (Testing) @{
+       # where to find our files
+       bindtextdomain("testdir")
+       # joe is in charge of adminprog
+       bindtextdomain("../joe/testdir", "adminprog")
+   @}
+   @dots{}
+@}
+@end example
+
+@end enumerate
+
+@xref{I18N Example}
+for an example program showing the steps to create
+and use translations from @command{awk}.
+
+@node Translator i18n
+@section Translating @command{awk} Programs
+
+@cindex @code{.po} files
+@cindex files, @code{.po}
+@cindex portable object files
+@cindex files, portable object
+Once a program's translatable strings have been marked, they must
+be extracted to create the initial @file{.pot} file.
+As part of translation, it is often helpful to rearrange the order
+in which arguments to @code{printf} are output.
+
+@command{gawk}'s @option{--gen-pot} command-line option extracts
+the messages and is discussed next.
+After that, @code{printf}'s ability to
+rearrange the order for @code{printf} arguments at runtime
+is covered.
+
+@menu
+* String Extraction::           Extracting marked strings.
+* Printf Ordering::             Rearranging @code{printf} arguments.
+* I18N Portability::            @command{awk}-level portability issues.
+@end menu
+
+@node String Extraction
+@subsection Extracting Marked Strings
+@cindex strings, extracting
+@cindex @option{--gen-pot} option
+@cindex command-line options, string extraction
+@cindex string extraction (internationalization)
+@cindex marked string extraction (internationalization)
+@cindex extraction, of marked strings (internationalization)
+
+@cindex @option{--gen-pot} option
+Once your @command{awk} program is working, and all the strings have
+been marked and you've set (and perhaps bound) the text domain,
+it is time to produce translations.
+First, use the @option{--gen-pot} command-line option to create
+the initial @file{.pot} file:
+
+@example
+gawk --gen-pot -f guide.awk > guide.pot
+@end example
+
+@cindex @code{xgettext} utility
+When run with @option{--gen-pot}, @command{gawk} does not execute your
+program.  Instead, it parses it as usual and prints all marked strings
+to standard output in the format of a GNU @command{gettext} Portable Object
+file.  Also included in the output are any constant strings that
+appear as the first argument to @code{dcgettext()} or as the first and
+second argument to @code{dcngettext()}.@footnote{The
+@command{xgettext} utility that comes with GNU
+@command{gettext} can handle @file{.awk} files.}
+You should distribute the generated @file{.pot} file with
+your @command{awk} program; translators will eventually use it
+to provide you translations that you can also then distribute.
+@xref{I18N Example}
+for the full list of steps to go through to create and test
+translations for @command{guide}.
+
+@node Printf Ordering
+@subsection Rearranging @code{printf} Arguments
+
+@cindex @code{printf} statement, positional specifiers
+@cindex positional specifiers, @code{printf} statement
+Format strings for @code{printf} and @code{sprintf()}
+(@pxref{Printf})
+present a special problem for translation.
+Consider the following:@footnote{This example is borrowed
+from the GNU @command{gettext} manual.}
+
+@example
+printf(_"String `%s' has %d characters\n",
+          string, length(string)))
+@end example
+
+A possible German translation for this might be:
+
+@example
+"%d Zeichen lang ist die Zeichenkette `%s'\n"
+@end example
+
+The problem should be obvious: the order of the format
+specifications is different from the original!
+Even though @code{gettext()} can return the translated string
+at runtime,
+it cannot change the argument order in the call to @code{printf}.
+
+To solve this problem, @code{printf} format specifiers may have
+an additional optional element, which we call a @dfn{positional specifier}.
+For example:
+
+@example
+"%2$d Zeichen lang ist die Zeichenkette `%1$s'\n"
+@end example
+
+Here, the positional specifier consists of an integer count, which indicates which
+argument to use, and a @samp{$}. Counts are one-based, and the
+format string itself is @emph{not} included.  Thus, in the following
+example, @samp{string} is the first argument and @samp{length(string)} is the second:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>     @kbd{string = "Don\47t Panic"}
+>     @kbd{printf "%2$d characters live in \"%1$s\"\n",}
+>                         @kbd{string, length(string)}
+> @kbd{@}'}
+@print{} 11 characters live in "Don't Panic"
+@end example
+
+If present, positional specifiers come first in the format specification,
+before the flags, the field width, and/or the precision.
+
+Positional specifiers can be used with the dynamic field width and
+precision capability:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>    @kbd{printf("%*.*s\n", 10, 20, "hello")}
+>    @kbd{printf("%3$*2$.*1$s\n", 20, 10, "hello")}
+> @kbd{@}'}
+@print{}      hello
+@print{}      hello
+@end example
+
+@quotation NOTE
+When using @samp{*} with a positional specifier, the @samp{*}
+comes first, then the integer position, and then the @samp{$}.
+This is somewhat counterintuitive.
+@end quotation
+
+@cindex @code{printf} statement, positional specifiers, mixing with regular formats
+@cindex positional specifiers, @code{printf} statement, mixing with regular formats
+@cindex format specifiers, mixing regular with positional specifiers
+@command{gawk} does not allow you to mix regular format specifiers
+and those with positional specifiers in the same string:
+
+@example
+@group
+$ @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
+@end group
+@end example
+
+@quotation NOTE
+There are some pathological cases that @command{gawk} may fail to
+diagnose.  In such cases, the output may not be what you expect.
+It's still a bad idea to try mixing them, even if @command{gawk}
+doesn't detect it.
+@end quotation
+
+Although positional specifiers can be used directly in @command{awk} programs,
+their primary purpose is to help in producing correct translations of
+format strings into languages different from the one in which the program
+is first written.
+
+@node I18N Portability
+@subsection @command{awk} Portability Issues
+
+@cindex portability, internationalization and
+@cindex internationalization, localization, portability and
+@command{gawk}'s internationalization features were purposely chosen to
+have as little impact as possible on the portability of @command{awk}
+programs that use them to other versions of @command{awk}.
+Consider this program:
+
+@example
+BEGIN @{
+    TEXTDOMAIN = "guide"
+    if (Test_Guide)   # set with -v
+        bindtextdomain("/test/guide/messages")
+    print _"don't panic!"
+@}
+@end example
+
+@noindent
+As written, it won't work on other versions of @command{awk}.
+However, it is actually almost portable, requiring very little
+change:
+
+@itemize @value{BULLET}
+@cindex @code{TEXTDOMAIN} variable, portability and
+@item
+Assignments to @code{TEXTDOMAIN} won't have any effect,
+because @code{TEXTDOMAIN} is not special in other @command{awk} implementations.
+
+@item
+Non-GNU versions of @command{awk} treat marked strings
+as the concatenation of a variable named @code{_} with the string
+following it.@footnote{This is good fodder for an ``Obfuscated
+@command{awk}'' contest.} Typically, the variable @code{_} has
+the null string (@code{""}) as its value, leaving the original string constant as
+the result.
+
+@item
+By defining ``dummy'' functions to replace @code{dcgettext()}, @code{dcngettext()},
+and @code{bindtextdomain()}, the @command{awk} program can be made to run, but
+all the messages are output in the original language.
+For example:
+
+@cindex @code{bindtextdomain()} function (@command{gawk}), portability and
+@cindex @code{dcgettext()} function (@command{gawk}), portability and
+@cindex @code{dcngettext()} function (@command{gawk}), portability and
+@example
+@c file eg/lib/libintl.awk
+function bindtextdomain(dir, domain)
+@{
+    return dir
+@}
+
+function dcgettext(string, domain, category)
+@{
+    return string
+@}
+
+function dcngettext(string1, string2, number, domain, category)
+@{
+    return (number == 1 ? string1 : string2)
+@}
+@c endfile
+@end example
+
+@item
+The use of positional specifications in @code{printf} or
+@code{sprintf()} is @emph{not} portable.
+To support @code{gettext()} at the C level, many systems' C versions of
+@code{sprintf()} do support positional specifiers.  But it works only if
+enough arguments are supplied in the function call.  Many versions of
+@command{awk} pass @code{printf} formats and arguments unchanged to the
+underlying C library version of @code{sprintf()}, but only one format and
+argument at a time.  What happens if a positional specification is
+used is anybody's guess.
+However, because the positional specifications are primarily for use in
+@emph{translated} format strings, and because non-GNU @command{awk}s never
+retrieve the translated string, this should not be a problem in practice.
+@end itemize
+
+@node I18N Example
+@section A Simple Internationalization Example
+
+Now let's look at a step-by-step example of how to internationalize and
+localize a simple @command{awk} program, using @file{guide.awk} as our
+original source:
+
+@example
+@c file eg/prog/guide.awk
+BEGIN @{
+    TEXTDOMAIN = "guide"
+    bindtextdomain(".")  # for testing
+    print _"Don't Panic"
+    print _"The Answer Is", 42
+    print "Pardon me, Zaphod who?"
+@}
+@c endfile
+@end example
+
+@noindent
+Run @samp{gawk --gen-pot} to create the @file{.pot} file:
+
+@example
+$ @kbd{gawk --gen-pot -f guide.awk > guide.pot}
+@end example
+
+@noindent
+This produces:
+
+@example
+@c file eg/data/guide.po
+#: guide.awk:4
+msgid "Don't Panic"
+msgstr ""
+
+#: guide.awk:5
+msgid "The Answer Is"
+msgstr ""
+
+@c endfile
+@end example
+
+This original portable object template file is saved and reused for each language
+into which the application is translated.  The @code{msgid}
+is the original string and the @code{msgstr} is the translation.
+
+@quotation NOTE
+Strings not marked with a leading underscore do not
+appear in the @file{guide.pot} file.
+@end quotation
+
+Next, the messages must be translated.
+Here is a translation to a hypothetical dialect of English,
+called ``Mellow'':@footnote{Perhaps it would be better if it were
+called ``Hippy.'' Ah, well.}
+
+@example
+@group
+$ @kbd{cp guide.pot guide-mellow.po}
+@var{Add translations to} guide-mellow.po @dots{}
+@end group
+@end example
+
+@noindent
+Following are the translations:
+
+@example
+@c file eg/data/guide-mellow.po
+#: guide.awk:4
+msgid "Don't Panic"
+msgstr "Hey man, relax!"
+
+#: guide.awk:5
+msgid "The Answer Is"
+msgstr "Like, the scoop is"
+
+@c endfile
+@end example
+
+@cindex Linux
+@cindex GNU/Linux
+@quotation NOTE
+The following instructions apply to GNU/Linux with the GNU C Library. Be
+aware that the actual steps may change over time, that the following
+description may not be accurate for all GNU/Linux distributions, and
+that things may work entirely differently on other operating systems.
+@end quotation
+
+The next step is to make the directory to hold the binary message object
+file and then to create the @file{guide.mo} file.
+The directory has the form @file{@var{locale}/LC_MESSAGES}, where
+@var{locale} is a locale name known to the C @command{gettext} routines.
+
+How do we know which locale to use?  It turns out that there are
+four different environment variables used by the C @command{gettext} routines.
+In order, they are @env{$LANGUAGE}, @env{$LC_ALL}, @env{$LANG}, and
+@env{$LC_MESSAGES}.@footnote{Well, sort of. It seems that if @env{$LC_ALL}
+is set to @samp{C}, then no translations are done. Go figure.}
+Thus, we check the value of @env{$LANGUAGE}:
+
+@example
+$ @kbd{echo $LANGUAGE}
+@print{} en_US.UTF-8
+@end example
+
+@noindent
+We next make the directories:
+
+@example
+$ @kbd{mkdir en_US.UTF-8 en_US.UTF-8/LC_MESSAGES}
+@end example
+
+@cindex @code{.po} files, converting to @code{.mo}
+@cindex files, @code{.po}, converting to @code{.mo}
+@cindex @code{.mo} files, converting from @code{.po}
+@cindex files, @code{.mo}, converting from @code{.po}
+@cindex portable object files, converting to message object files
+@cindex files, portable object, converting to message object files
+@cindex message object files, converting from portable object files
+@cindex files, message object, converting from portable object files
+@cindex @command{msgfmt} utility
+The @command{msgfmt} utility converts the human-readable
+@file{.po} file into a machine-readable @file{.mo} file.
+By default, @command{msgfmt} creates a file named @file{messages}.
+This file must be renamed and placed in the proper directory (using
+the @option{-o} option) so that @command{gawk} can find it:
+
+@example
+$ @kbd{msgfmt guide-mellow.po -o en_US.UTF-8/LC_MESSAGES/guide.mo}
+@end example
+
+Finally, we run the program to test it:
+
+@example
+$ @kbd{gawk -f guide.awk}
+@print{} Hey man, relax!
+@print{} Like, the scoop is 42
+@print{} Pardon me, Zaphod who?
+@end example
+
+If the three replacement functions for @code{dcgettext()}, @code{dcngettext()},
+and @code{bindtextdomain()}
+(@pxref{I18N Portability})
+are in a file named @file{libintl.awk},
+then we can run @file{guide.awk} unchanged as follows:
+
+@example
+$ @kbd{gawk --posix -f guide.awk -f libintl.awk}
+@print{} Don't Panic
+@print{} The Answer Is 42
+@print{} Pardon me, Zaphod who?
+@end example
+
+@node Gawk I18N
+@section @command{gawk} Can Speak Your Language
+
+@command{gawk} itself has been internationalized
+using the GNU @command{gettext} package.
+(GNU @command{gettext} is described in
+complete detail in
+@ifinfo
+@inforef{Top, , GNU @command{gettext} utilities, gettext, GNU @command{gettext} utilities}.)
+@end ifinfo
+@ifnotinfo
+@uref{https://www.gnu.org/software/gettext/manual/,
+@cite{GNU @command{gettext} utilities}}.)
+@end ifnotinfo
+As of this writing, the latest version of GNU @command{gettext} is
+@uref{ftp://ftp.gnu.org/gnu/gettext/gettext-0.19.8.1.tar.gz,
+@value{PVERSION} 0.19.8.1}.
+
+If a translation of @command{gawk}'s messages exists,
+then @command{gawk} produces usage messages, warnings,
+and fatal errors in the local language.
+
+@node I18N Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Internationalization means writing a program such that it can use multiple
+languages without requiring source code changes.  Localization means
+providing the data necessary for an internationalized program to work
+in a particular language.
+
+@item
+@command{gawk} uses GNU @command{gettext} to let you internationalize
+and localize @command{awk} programs.  A program's text domain identifies
+the program for grouping all messages and other data together.
+
+@item
+You mark a program's strings for translation by preceding them with
+an underscore. Once that is done, the strings are extracted into a
+@file{.pot} file.  This file is copied for each language into a @file{.po}
+file, and the @file{.po} files are compiled into @file{.gmo} files for
+use at runtime.
+
+@item
+You can use positional specifications with @code{sprintf()} and
+@code{printf} to rearrange the placement of argument values in formatted
+strings and output. This is useful for the translation of format
+control strings.
+
+@item
+The internationalization features have been designed so that they
+can be easily worked around in a standard @command{awk}.
+
+@item
+@command{gawk} itself has been internationalized and ships with
+a number of translations for its messages.
+
+@end itemize
+
+
+@node Debugger
+@chapter Debugging @command{awk} Programs
+@cindex debugging @command{awk} programs
+
+@c The original text for this chapter was contributed by Efraim Yawitz.
+
+It would be nice if computer programs worked perfectly the first time they
+were run, but in real life, this rarely happens for programs of
+any complexity.  Thus, most programming languages have facilities available
+for ``debugging'' programs, and @command{awk} is no exception.
+
+The @command{gawk} debugger is purposely modeled after
+@uref{https://www.gnu.org/software/gdb/, the GNU Debugger (GDB)}
+command-line debugger.  If you are familiar with GDB, learning
+how to use @command{gawk} for debugging your programs is easy.
+
+@menu
+* Debugging::                   Introduction to @command{gawk} debugger.
+* Sample Debugging Session::    Sample debugging session.
+* List of Debugger Commands::   Main debugger commands.
+* Readline Support::            Readline support.
+* Limitations::                 Limitations and future plans.
+* Debugging Summary::           Debugging summary.
+@end menu
+
+@node Debugging
+@section Introduction to the @command{gawk} Debugger
+
+This @value{SECTION} introduces debugging in general and begins
+the discussion of debugging in @command{gawk}.
+
+@menu
+* Debugging Concepts::          Debugging in General.
+* Debugging Terms::             Additional Debugging Concepts.
+* Awk Debugging::               Awk Debugging.
+@end menu
+
+@node Debugging Concepts
+@subsection Debugging in General
+
+(If you have used debuggers in other languages, you may want to skip
+ahead to @ref{Awk Debugging}.)
+
+Of course, a debugging program cannot remove bugs for you, because it has
+no way of knowing what you or your users consider a ``bug'' versus a
+``feature.''  (Sometimes, we humans have a hard time with this ourselves.)
+In that case, what can you expect from such a tool?  The answer to that
+depends on the language being debugged, but in general, you can expect at
+least the following:
+
+@cindex debugger capabilities
+@itemize @value{BULLET}
+@item
+The ability to watch a program execute its instructions one by one,
+giving you, the programmer, the opportunity to think about what is happening
+on a time scale of seconds, minutes, or hours, rather than the nanosecond
+time scale at which the code usually runs.
+
+@item
+The opportunity to not only passively observe the operation of your
+program, but to control it and try different paths of execution, without
+having to change your source files.
+
+@item
+The chance to see the values of data in the program at any point in
+execution, and also to change that data on the fly, to see how that
+affects what happens afterward.  (This often includes the ability
+to look at internal data structures besides the variables you actually
+defined in your code.)
+
+@item
+The ability to obtain additional information about your program's state
+or even its internal structure.
+@end itemize
+
+All of these tools provide a great amount of help in using your own
+skills and understanding of the goals of your program to find where it
+is going wrong (or, for that matter, to better comprehend a perfectly
+functional program that you or someone else wrote).
+
+@node Debugging Terms
+@subsection Debugging Concepts
+
+@cindex debugger, concepts
+Before diving in to the details, we need to introduce several
+important concepts that apply to just about all debuggers.
+The following list defines terms used throughout the rest of
+this @value{CHAPTER}:
+
+@table @dfn
+@cindex call stack (debugger)
+@cindex stack frame (debugger)
+@item Stack frame
+Programs generally call functions during the course of their execution.
+One function can call another, or a function can call itself (recursion).
+You can view the chain of called functions (main program calls A, which
+calls B, which calls C), as a stack of executing functions: the currently
+running function is the topmost one on the stack, and when it finishes
+(returns), the next one down then becomes the active function.
+Such a stack is termed a @dfn{call stack}.
+
+For each function on the call stack, the system maintains a data area
+that contains the function's parameters, local variables, and return value,
+as well as any other ``bookkeeping'' information needed to manage the
+call stack.  This data area is termed a @dfn{stack frame}.
+
+@command{gawk} also follows this model, and gives you
+access to the call stack and to each stack frame. You can see the
+call stack, as well as from where each function on the stack was
+invoked. Commands that print the call stack print information about
+each stack frame (as detailed later on).
+
+@item Breakpoint
+@cindex breakpoint (debugger)
+During debugging, you often wish to let the program run until it
+reaches a certain point, and then continue execution from there one
+statement (or instruction) at a time.  The way to do this is to set
+a @dfn{breakpoint} within the program.  A breakpoint is where the
+execution of the program should break off (stop), so that you can
+take over control of the program's execution.  You can add and remove
+as many breakpoints as you like.
+
+@item Watchpoint
+@cindex watchpoint (debugger)
+A watchpoint is similar to a breakpoint.  The difference is that
+breakpoints are oriented around the code: stop when a certain point in the
+code is reached.  A watchpoint, however, specifies that program execution
+should stop when a @emph{data value} is changed.  This is useful, as
+sometimes it happens that a variable receives an erroneous value, and it's
+hard to track down where this happens just by looking at the code.
+By using a watchpoint, you can stop whenever a variable is assigned to,
+and usually find the errant code quite quickly.
+@end table
+
+@node Awk Debugging
+@subsection @command{awk} Debugging
+
+Debugging an @command{awk} program has some specific aspects that are
+not shared with programs written in other languages.
+
+First of all, the fact that @command{awk} programs usually take input
+line by line from a file or files and operate on those lines using specific
+rules makes it especially useful to organize viewing the execution of
+the program in terms of these rules.  As we will see, each @command{awk}
+rule is treated almost like a function call, with its own specific block
+of instructions.
+
+In addition, because @command{awk} is by design a very concise language,
+it is easy to lose sight of everything that is going on ``inside''
+each line of @command{awk} code.  The debugger provides the opportunity
+to look at the individual primitive instructions carried out
+by the higher-level @command{awk} commands.@footnote{The ``primitive
+instructions'' are defined by @command{gawk} itself; the debugger
+does not work at the level of machine instructions.}
+
+@node Sample Debugging Session
+@section Sample @command{gawk} Debugging Session
+@cindex sample debugging session
+@cindex example debugging session
+@cindex debugging, example session
+
+In order to illustrate the use of @command{gawk} as a debugger, let's look at a sample
+debugging session.  We will use the @command{awk} implementation of the
+POSIX @command{uniq} command presented earlier (@pxref{Uniq Program})
+as our example.
+
+@menu
+* Debugger Invocation::         How to Start the Debugger.
+* Finding The Bug::             Finding the Bug.
+@end menu
+
+@node Debugger Invocation
+@subsection How to Start the Debugger
+@cindex starting the debugger
+@cindex debugger, how to start
+
+Starting the debugger is almost exactly like running @command{gawk} normally,
+except you have to pass an additional option, @option{--debug}, or the
+corresponding short option, @option{-D}.  The file(s) containing the
+program and any supporting code are given on the command line as arguments
+to one or more @option{-f} options. (@command{gawk} is not designed
+to debug command-line programs, only programs contained in files.)
+In our case, we invoke the debugger like this:
+
+@example
+$ @kbd{gawk -D -f getopt.awk -f join.awk -f uniq.awk -1 inputfile}
+@end example
+
+@noindent
+where both @file{getopt.awk} and @file{uniq.awk} are in @env{$AWKPATH}.
+(Experienced users of GDB or similar debuggers should note that
+this syntax is slightly different from what you are used to.
+With the @command{gawk} debugger, you give the arguments for running the program
+in the command line to the debugger rather than as part of the @code{run}
+command at the debugger prompt.)
+The @option{-1} is an option to @file{uniq.awk}.
+
+@cindex debugger, prompt
+Instead of immediately running the program on @file{inputfile}, as
+@command{gawk} would ordinarily do, the debugger merely loads all
+the program source files, compiles them internally, and then gives
+us a prompt:
+
+@example
+gawk>
+@end example
+
+@noindent
+from which we can issue commands to the debugger.  At this point, no
+code has been executed.
+
+@node Finding The Bug
+@subsection Finding the Bug
+
+Let's say that we are having a problem using (a faulty version of)
+@file{uniq.awk} in ``field-skipping'' mode, and it doesn't seem to be
+catching lines which should be identical when skipping the first field,
+such as:
+
+@example
+awk is a wonderful program!
+gawk is a wonderful program!
+@end example
+
+This could happen if we were thinking (C-like) of the fields in a record
+as being numbered in a zero-based fashion, so instead of the lines:
+
+@example
+clast = join(alast, fcount+1, n)
+cline = join(aline, fcount+1, m)
+@end example
+
+@noindent
+we wrote:
+
+@example
+clast = join(alast, fcount, n)
+cline = join(aline, fcount, m)
+@end example
+
+The first thing we usually want to do when trying to investigate a
+problem like this is to put a breakpoint in the program so that we can
+watch it at work and catch what it is doing wrong.  A reasonable spot for
+a breakpoint in @file{uniq.awk} is at the beginning of the function
+@code{are_equal()}, which compares the current line with the previous one. To set
+the breakpoint, use the @code{b} (breakpoint) command:
+
+@cindex debugger, setting a breakpoint
+@cindex debugger, @code{breakpoint} command
+@cindex debugger, @code{break} command
+@cindex debugger, @code{b} command
+@example
+gawk> @kbd{b are_equal}
+@print{} Breakpoint 1 set at file `awklib/eg/prog/uniq.awk', line 63
+@end example
+
+The debugger tells us the file and line number where the breakpoint is.
+Now type @samp{r} or @samp{run} and the program runs until it hits
+the breakpoint for the first time:
+
+@cindex debugger, running the program
+@cindex debugger, @code{run} command
+@example
+gawk> @kbd{r}
+@print{} Starting program:
+@print{} Stopping in Rule ...
+@print{} Breakpoint 1, are_equal(n, m, clast, cline, alast, aline)
+         at `awklib/eg/prog/uniq.awk':63
+@print{} 63          if (fcount == 0 && charcount == 0)
+gawk>
+@end example
+
+Now we can look at what's going on inside our program.  First of all,
+let's see how we got to where we are.  At the prompt, we type @samp{bt}
+(short for ``backtrace''), and the debugger responds with a
+listing of the current stack frames:
+
+@cindex debugger, stack frames, showing
+@cindex debugger, @code{bt} command
+@cindex debugger, @code{backtrace} command
+@example
+gawk> @kbd{bt}
+@print{} #0  are_equal(n, m, clast, cline, alast, aline)
+         at `awklib/eg/prog/uniq.awk':68
+@print{} #1  in main() at `awklib/eg/prog/uniq.awk':88
+@end example
+
+This tells us that @code{are_equal()} was called by the main program at
+line 88 of @file{uniq.awk}.  (This is not a big surprise, because this
+is the only call to @code{are_equal()} in the program, but in more complex
+programs, knowing who called a function and with what parameters can be
+the key to finding the source of the problem.)
+
+Now that we're in @code{are_equal()}, we can start looking at the values
+of some variables.  Let's say we type @samp{p n}
+(@code{p} is short for ``print'').  We would expect to see the value of
+@code{n}, a parameter to @code{are_equal()}.  Actually, the debugger
+gives us:
+
+@cindex debugger, @code{print} command
+@cindex debugger, @code{p} command
+@example
+gawk> @kbd{p n}
+@print{} n = untyped variable
+@end example
+
+@noindent
+In this case, @code{n} is an uninitialized local variable, because the
+function was called without arguments (@pxref{Function Calls}).
+
+A more useful variable to display might be the current record:
+
+@example
+gawk> @kbd{p $0}
+@print{} $0 = "gawk is a wonderful program!"
+@end example
+
+@noindent
+This might be a bit puzzling at first, as this is the second line of
+our test input.  Let's look at @code{NR}:
+
+@example
+gawk> @kbd{p NR}
+@print{} NR = 2
+@end example
+
+@noindent
+So we can see that @code{are_equal()} was only called for the second record
+of the file.  Of course, this is because our program contains a rule for
+@samp{NR == 1}:
+
+@example
+NR == 1 @{
+    last = $0
+    next
+@}
+@end example
+
+OK, let's just check that that rule worked correctly:
+
+@example
+gawk> @kbd{p last}
+@print{} last = "awk is a wonderful program!"
+@end example
+
+Everything we have done so far has verified that the program has worked as
+planned, up to and including the call to @code{are_equal()}, so the problem must
+be inside this function.  To investigate further, we must begin
+``stepping through'' the lines of @code{are_equal()}.  We start by typing
+@samp{n} (for ``next''):
+
+@cindex debugger, @code{n} command
+@cindex debugger, @code{next} command
+@example
+@group
+gawk> @kbd{n}
+@print{} 66          if (fcount > 0) @{
+@end group
+@end example
+
+This tells us that @command{gawk} is now ready to execute line 66, which
+decides whether to give the lines the special ``field-skipping'' treatment
+indicated by the @option{-1} command-line option.  (Notice that we skipped
+from where we were before, at line 63, to here, because the condition
+in line 63, @samp{if (fcount == 0 && charcount == 0)}, was false.)
+
+Continuing to step, we now get to the splitting of the current and
+last records:
+
+@example
+gawk> @kbd{n}
+@print{} 67              n = split(last, alast)
+gawk> @kbd{n}
+@print{} 68              m = split($0, aline)
+@end example
+
+At this point, we should be curious to see what our records were split
+into, so we try to look:
+
+@example
+gawk> @kbd{p n m alast aline}
+@print{} n = 5
+@print{} m = untyped variable
+@print{} alast = array, 5 elements
+@print{} aline = untyped variable
+@end example
+
+@noindent
+(The @code{p} command can take more than one argument, similar to
+@command{awk}'s @code{print} statement.)
+
+This is kind of disappointing, though.  All we found out is that there
+are five elements in @code{alast}; @code{m} and @code{aline} don't have
+values because we are at line 68 but haven't executed it yet.
+This information is useful enough (we now know that
+none of the words were accidentally left out), but what if we want to see
+inside the array?
+
+@cindex debugger, printing single array elements
+The first choice would be to use subscripts:
+
+@example
+gawk> @kbd{p alast[0]}
+@print{} "0" not in array `alast'
+@end example
+
+@noindent
+Oops!
+
+@example
+gawk> @kbd{p alast[1]}
+@print{} alast["1"] = "awk"
+@end example
+
+This would be kind of slow for a 100-member array, though, so
+@command{gawk} provides a shortcut (reminiscent of another language
+not to be mentioned):
+
+@cindex debugger, printing all array elements
+@example
+gawk> @kbd{p @@alast}
+@print{} alast["1"] = "awk"
+@print{} alast["2"] = "is"
+@print{} alast["3"] = "a"
+@print{} alast["4"] = "wonderful"
+@print{} alast["5"] = "program!"
+@end example
+
+It looks like we got this far OK.  Let's take another step
+or two:
+
+@example
+gawk> @kbd{n}
+@print{} 69              clast = join(alast, fcount, n)
+gawk> @kbd{n}
+@print{} 70              cline = join(aline, fcount, m)
+@end example
+
+Well, here we are at our error (sorry to spoil the suspense).  What we
+had in mind was to join the fields starting from the second one to make
+the virtual record to compare, and if the first field were numbered zero,
+this would work.  Let's look at what we've got:
+
+@example
+gawk> @kbd{p cline clast}
+@print{} cline = "gawk is a wonderful program!"
+@print{} clast = "awk is a wonderful program!"
+@end example
+
+Hey, those look pretty familiar!  They're just our original, unaltered
+input records.  A little thinking (the human brain is still the best
+debugging tool), and we realize that we were off by one!
+
+We get out of the debugger:
+
+@example
+gawk> @kbd{q}
+@print{} The program is running. Exit anyway (y/n)? @kbd{y}
+@end example
+
+@noindent
+Then we get into an editor:
+
+@example
+clast = join(alast, fcount+1, n)
+cline = join(aline, fcount+1, m)
+@end example
+
+@noindent
+and problem solved!
+
+@node List of Debugger Commands
+@section Main Debugger Commands
+
+The @command{gawk} debugger command set can be divided into the
+following categories:
+
+@itemize @value{BULLET}
+
+@item
+Breakpoint control
+
+@item
+Execution control
+
+@item
+Viewing and changing data
+
+@item
+Working with the stack
+
+@item
+Getting information
+
+@item
+Miscellaneous
+@end itemize
+
+@cindex debugger, repeating commands
+Each of these are discussed in the following subsections.
+In the following descriptions, commands that may be abbreviated
+show the abbreviation on a second description line.
+A debugger command name may also be truncated if that partial
+name is unambiguous. The debugger has the built-in capability to
+automatically repeat the previous command just by hitting @kbd{Enter}.
+This works for the commands @code{list}, @code{next}, @code{nexti},
+@code{step}, @code{stepi}, and @code{continue} executed without any
+argument.
+
+@menu
+* Breakpoint Control::          Control of Breakpoints.
+* Debugger Execution Control::  Control of Execution.
+* Viewing And Changing Data::   Viewing and Changing Data.
+* Execution Stack::             Dealing with the Stack.
+* Debugger Info::               Obtaining Information about the Program and
+                                the Debugger State.
+* Miscellaneous Debugger Commands:: Miscellaneous Commands.
+@end menu
+
+@node Breakpoint Control
+@subsection Control of Breakpoints
+
+As we saw earlier, the first thing you probably want to do in a debugging
+session is to get your breakpoints set up, because your program
+will otherwise just run as if it was not under the debugger.  The commands for
+controlling breakpoints are:
+
+@table @asis
+@cindex debugger commands, @code{b} (@code{break})
+@cindex debugger commands, @code{break}
+@cindex @code{break} debugger command
+@cindex @code{b} debugger command (alias for @code{break})
+@cindex set breakpoint
+@cindex breakpoint, setting
+@item @code{break} [[@var{filename}@code{:}]@var{n} | @var{function}] [@code{"@var{expression}"}]
+@itemx @code{b} [[@var{filename}@code{:}]@var{n} | @var{function}] [@code{"@var{expression}"}]
+Without any argument, set a breakpoint at the next instruction
+to be executed in the selected stack frame.
+Arguments can be one of the following:
+
+@c @asis for docbook
+@c nested table
+@table @asis
+@item @var{n}
+Set a breakpoint at line number @var{n} in the current source file.
+
+@item @var{filename}@code{:}@var{n}
+Set a breakpoint at line number @var{n} in source file @var{filename}.
+
+@item @var{function}
+Set a breakpoint at entry to (the first instruction of)
+function @var{function}.
+@end table
+
+Each breakpoint is assigned a number that can be used to delete it from
+the breakpoint list using the @code{delete} command.
+
+With a breakpoint, you may also supply a condition.  This is an
+@command{awk} expression (enclosed in double quotes) that the debugger
+evaluates whenever the breakpoint is reached. If the condition is true,
+then the debugger stops execution and prompts for a command. Otherwise,
+it continues executing the program.
+
+@cindex debugger commands, @code{clear}
+@cindex @code{clear} debugger command
+@cindex delete breakpoint, at location
+@cindex breakpoint at location, how to delete
+@item @code{clear} [[@var{filename}@code{:}]@var{n} | @var{function}]
+Without any argument, delete any breakpoint at the next instruction
+to be executed in the selected stack frame. If the program stops at
+a breakpoint, this deletes that breakpoint so that the program
+does not stop at that location again.  Arguments can be one of the following:
+
+@c nested table
+@table @asis
+@item @var{n}
+Delete breakpoint(s) set at line number @var{n} in the current source file.
+
+@item @var{filename}@code{:}@var{n}
+Delete breakpoint(s) set at line number @var{n} in source file @var{filename}.
+
+@item @var{function}
+Delete breakpoint(s) set at entry to function @var{function}.
+@end table
+
+@cindex debugger commands, @code{condition}
+@cindex @code{condition} debugger command
+@cindex breakpoint condition
+@item @code{condition} @var{n} @code{"@var{expression}"}
+Add a condition to existing breakpoint or watchpoint @var{n}. The
+condition is an @command{awk} expression @emph{enclosed in double quotes}
+that the debugger evaluates
+whenever the breakpoint or watchpoint is reached. If the condition is true, then
+the debugger stops execution and prompts for a command. Otherwise,
+the debugger continues executing the program. If the condition expression is
+not specified, any existing condition is removed (i.e., the breakpoint or
+watchpoint is made unconditional).
+
+@cindex debugger commands, @code{d} (@code{delete})
+@cindex debugger commands, @code{delete}
+@cindex @code{delete} debugger command
+@cindex @code{d} debugger command (alias for @code{delete})
+@cindex delete breakpoint, by number
+@cindex breakpoint, delete by number
+@item @code{delete} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+@itemx @code{d} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+Delete specified breakpoints or a range of breakpoints. Delete
+all defined breakpoints if no argument is supplied.
+
+@cindex debugger commands, @code{disable}
+@cindex @code{disable} debugger command
+@cindex disable breakpoint
+@cindex breakpoint, how to disable or enable
+@item @code{disable} [@var{n1 n2} @dots{} | @var{n}--@var{m}]
+Disable specified breakpoints or a range of breakpoints. Without
+any argument, disable all breakpoints.
+
+@cindex debugger commands, @code{e} (@code{enable})
+@cindex debugger commands, @code{enable}
+@cindex @code{enable} debugger command
+@cindex @code{e} debugger command (alias for @code{enable})
+@cindex enable breakpoint
+@item @code{enable} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+@itemx @code{e} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+Enable specified breakpoints or a range of breakpoints. Without
+any argument, enable all breakpoints.
+Optionally, you can specify how to enable the breakpoints:
+
+@c nested table
+@table @code
+@item del
+Enable the breakpoints temporarily, then delete each one when
+the program stops at it.
+
+@item once
+Enable the breakpoints temporarily, then disable each one when
+the program stops at it.
+@end table
+
+@cindex debugger commands, @code{ignore}
+@cindex @code{ignore} debugger command
+@cindex ignore breakpoint
+@item @code{ignore} @var{n} @var{count}
+Ignore breakpoint number @var{n} the next @var{count} times it is
+hit.
+
+@cindex debugger commands, @code{t} (@code{tbreak})
+@cindex debugger commands, @code{tbreak}
+@cindex @code{tbreak} debugger command
+@cindex @code{t} debugger command (alias for @code{tbreak})
+@cindex temporary breakpoint
+@item @code{tbreak} [[@var{filename}@code{:}]@var{n} | @var{function}]
+@itemx @code{t} [[@var{filename}@code{:}]@var{n} | @var{function}]
+Set a temporary breakpoint (enabled for only one stop).
+The arguments are the same as for @code{break}.
+@end table
+
+@node Debugger Execution Control
+@subsection Control of Execution
+
+Now that your breakpoints are ready, you can start running the program
+and observing its behavior.  There are more commands for controlling
+execution of the program than we saw in our earlier example:
+
+@table @asis
+@cindex debugger commands, @code{commands}
+@cindex @code{commands} debugger command
+@cindex debugger commands, @code{silent}
+@cindex @code{silent} debugger command
+@cindex debugger commands, @code{end}
+@cindex @code{end} debugger command
+@cindex breakpoint commands
+@cindex commands to execute at breakpoint
+@item @code{commands} [@var{n}]
+@itemx @code{silent}
+@itemx @dots{}
+@itemx @code{end}
+Set a list of commands to be executed upon stopping at
+a breakpoint or watchpoint. @var{n} is the breakpoint or watchpoint number.
+Without a number, the last one set is used. The actual commands follow,
+starting on the next line, and terminated by the @code{end} command.
+If the command @code{silent} is in the list, the usual messages about
+stopping at a breakpoint and the source line are not printed. Any command
+in the list that resumes execution (e.g., @code{continue}) terminates the list
+(an implicit @code{end}), and subsequent commands are ignored.
+For example:
+
+@example
+gawk> @kbd{commands}
+> @kbd{silent}
+> @kbd{printf "A silent breakpoint; i = %d\n", i}
+> @kbd{info locals}
+> @kbd{set i = 10}
+> @kbd{continue}
+> @kbd{end}
+gawk>
+@end example
+
+@cindex debugger commands, @code{c} (@code{continue})
+@cindex debugger commands, @code{continue}
+@cindex continue program, in debugger
+@cindex @code{continue} debugger command
+@item @code{continue} [@var{count}]
+@itemx @code{c} [@var{count}]
+Resume program execution. If continued from a breakpoint and @var{count} is
+specified, ignore the breakpoint at that location the next @var{count} times
+before stopping.
+
+@cindex debugger commands, @code{finish}
+@cindex @code{finish} debugger command
+@item @code{finish}
+Execute until the selected stack frame returns.
+Print the returned value.
+
+@cindex debugger commands, @code{n} (@code{next})
+@cindex debugger commands, @code{next}
+@cindex @code{next} debugger command
+@cindex @code{n} debugger command (alias for @code{next})
+@cindex single-step execution, in the debugger
+@item @code{next} [@var{count}]
+@itemx @code{n} [@var{count}]
+Continue execution to the next source line, stepping over function calls.
+The argument @var{count} controls how many times to repeat the action, as
+in @code{step}.
+
+@cindex debugger commands, @code{ni} (@code{nexti})
+@cindex debugger commands, @code{nexti}
+@cindex @code{nexti} debugger command
+@cindex @code{ni} debugger command (alias for @code{nexti})
+@item @code{nexti} [@var{count}]
+@itemx @code{ni} [@var{count}]
+Execute one (or @var{count}) instruction(s), stepping over function calls.
+
+@cindex debugger commands, @code{return}
+@cindex @code{return} debugger command
+@item @code{return} [@var{value}]
+Cancel execution of a function call. If @var{value} (either a string or a
+number) is specified, it is used as the function's return value. If used in a
+frame other than the innermost one (the currently executing function; i.e.,
+frame number 0), discard all inner frames in addition to the selected one,
+and the caller of that frame becomes the innermost frame.
+
+@cindex debugger commands, @code{r} (@code{run})
+@cindex debugger commands, @code{run}
+@cindex @code{run} debugger command
+@cindex @code{r} debugger command (alias for @code{run})
+@item @code{run}
+@itemx @code{r}
+Start/restart execution of the program. When restarting, the debugger
+retains the current breakpoints, watchpoints, command history,
+automatic display variables, and debugger options.
+
+@cindex debugger commands, @code{s} (@code{step})
+@cindex debugger commands, @code{step}
+@cindex @code{step} debugger command
+@cindex @code{s} debugger command (alias for @code{step})
+@item @code{step} [@var{count}]
+@itemx @code{s} [@var{count}]
+Continue execution until control reaches a different source line in the
+current stack frame, stepping inside any function called within
+the line.  If the argument @var{count} is supplied, steps that many times before
+stopping, unless it encounters a breakpoint or watchpoint.
+
+@cindex debugger commands, @code{si} (@code{stepi})
+@cindex debugger commands, @code{stepi}
+@cindex @code{stepi} debugger command
+@cindex @code{si} debugger command (alias for @code{stepi})
+@item @code{stepi} [@var{count}]
+@itemx @code{si} [@var{count}]
+Execute one (or @var{count}) instruction(s), stepping inside function calls.
+(For illustration of what is meant by an ``instruction'' in @command{gawk},
+see the output shown under @code{dump} in @ref{Miscellaneous Debugger Commands}.)
+
+@cindex debugger commands, @code{u} (@code{until})
+@cindex debugger commands, @code{until}
+@cindex @code{until} debugger command
+@cindex @code{u} debugger command (alias for @code{until})
+@item @code{until} [[@var{filename}@code{:}]@var{n} | @var{function}]
+@itemx @code{u} [[@var{filename}@code{:}]@var{n} | @var{function}]
+Without any argument, continue execution until a line past the current
+line in the current stack frame is reached. With an argument,
+continue execution until the specified location is reached, or the current
+stack frame returns.
+@end table
+
+@node Viewing And Changing Data
+@subsection Viewing and Changing Data
+
+The commands for viewing and changing variables inside of @command{gawk} are:
+
+@table @asis
+@cindex debugger commands, @code{display}
+@cindex @code{display} debugger command
+@item @code{display} [@var{var} | @code{$}@var{n}]
+Add variable @var{var} (or field @code{$@var{n}}) to the display list.
+The value of the variable or field is displayed each time the program stops.
+Each variable added to the list is identified by a unique number:
+
+@example
+gawk> @kbd{display x}
+@print{} 10: x = 1
+@end example
+
+@noindent
+This displays the assigned item number, the variable name, and its current value.
+If the display variable refers to a function parameter, it is silently
+deleted from the list as soon as the execution reaches a context where
+no such variable of the given name exists.
+Without argument, @code{display} displays the current values of
+items on the list.
+
+@cindex debugger commands, @code{eval}
+@cindex @code{eval} debugger command
+@cindex evaluate expressions, in debugger
+@item @code{eval "@var{awk statements}"}
+Evaluate @var{awk statements} in the context of the running program.
+You can do anything that an @command{awk} program would do: assign
+values to variables, call functions, and so on.
+
+@quotation NOTE
+You cannot use @code{eval} to execute a statement containing
+any of the following:
+@code{exit},
+@code{getline},
+@code{next},
+@code{nextfile},
+or
+@code{return}.
+@end quotation
+
+@item @code{eval} @var{param}, @dots{}
+@itemx @var{awk statements}
+@itemx @code{end}
+This form of @code{eval} is similar, but it allows you to define
+``local variables'' that exist in the context of the
+@var{awk statements}, instead of using variables or function
+parameters defined by the program.
+
+@cindex debugger commands, @code{p} (@code{print})
+@cindex debugger commands, @code{print}
+@cindex @code{print} debugger command
+@cindex @code{p} debugger command (alias for @code{print})
+@cindex print variables, in debugger
+@item @code{print} @var{var1}[@code{,} @var{var2} @dots{}]
+@itemx @code{p} @var{var1}[@code{,} @var{var2} @dots{}]
+Print the value of a @command{gawk} variable or field.
+Fields must be referenced by constants:
+
+@example
+gawk> @kbd{print $3}
+@end example
+
+@noindent
+This prints the third field in the input record (if the specified field does not
+exist, it prints @samp{Null field}). A variable can be an array element, with
+the subscripts being constant string values. To print the contents of an array,
+prefix the name of the array with the @samp{@@} symbol:
+
+@example
+gawk> @kbd{print @@a}
+@end example
+
+@noindent
+This prints the indices and the corresponding values for all elements in
+the array @code{a}.
+
+@cindex debugger commands, @code{printf}
+@cindex @code{printf} debugger command
+@item @code{printf} @var{format} [@code{,} @var{arg} @dots{}]
+Print formatted text. The @var{format} may include escape sequences,
+such as @samp{\n}
+(@pxref{Escape Sequences}).
+No newline is printed unless one is specified.
+
+@cindex debugger commands, @code{set}
+@cindex @code{set} debugger command
+@cindex assign values to variables, in debugger
+@item @code{set} @var{var}@code{=}@var{value}
+Assign a constant (number or string) value to an @command{awk} variable
+or field.
+String values must be enclosed between double quotes (@code{"}@dots{}@code{"}).
+
+You can also set special @command{awk} variables, such as @code{FS},
+@code{NF}, @code{NR}, and so on.
+
+@cindex debugger commands, @code{w} (@code{watch})
+@cindex debugger commands, @code{watch}
+@cindex @code{watch} debugger command
+@cindex @code{w} debugger command (alias for @code{watch})
+@cindex set watchpoint
+@item @code{watch} @var{var} | @code{$}@var{n} [@code{"@var{expression}"}]
+@itemx @code{w} @var{var} | @code{$}@var{n} [@code{"@var{expression}"}]
+Add variable @var{var} (or field @code{$@var{n}}) to the watch list.
+The debugger then stops whenever
+the value of the variable or field changes. Each watched item is assigned a
+number that can be used to delete it from the watch list using the
+@code{unwatch} command.
+
+With a watchpoint, you may also supply a condition.  This is an
+@command{awk} expression (enclosed in double quotes) that the debugger
+evaluates whenever the watchpoint is reached. If the condition is true,
+then the debugger stops execution and prompts for a command. Otherwise,
+@command{gawk} continues executing the program.
+
+@cindex debugger commands, @code{undisplay}
+@cindex @code{undisplay} debugger command
+@cindex stop automatic display, in debugger
+@item @code{undisplay} [@var{n}]
+Remove item number @var{n} (or all items, if no argument) from the
+automatic display list.
+
+@cindex debugger commands, @code{unwatch}
+@cindex @code{unwatch} debugger command
+@cindex delete watchpoint
+@item @code{unwatch} [@var{n}]
+Remove item number @var{n} (or all items, if no argument) from the
+watch list.
+
+@end table
+
+@node Execution Stack
+@subsection Working with the Stack
+
+Whenever you run a program that contains any function calls,
+@command{gawk} maintains a stack of all of the function calls leading up
+to where the program is right now.  You can see how you got to where you are,
+and also move around in the stack to see what the state of things was in the
+functions that called the one you are in.  The commands for doing this are:
+
+@table @asis
+@cindex debugger commands, @code{bt} (@code{backtrace})
+@cindex debugger commands, @code{backtrace}
+@cindex debugger commands, @code{where} (@code{backtrace})
+@cindex @code{backtrace} debugger command
+@cindex @code{bt} debugger command (alias for @code{backtrace})
+@cindex @code{where} debugger command (alias for @code{backtrace})
+@cindex call stack, display in debugger
+@cindex traceback, display in debugger
+@item @code{backtrace} [@var{count}]
+@itemx @code{bt} [@var{count}]
+@itemx @code{where} [@var{count}]
+Print a backtrace of all function calls (stack frames), or innermost @var{count}
+frames if @var{count} > 0. Print the outermost @var{count} frames if
+@var{count} < 0.  The backtrace displays the name and arguments to each
+function, the source @value{FN}, and the line number.
+The alias @code{where} for @code{backtrace} is provided for longtime
+GDB users who may be used to that command.
+
+@cindex debugger commands, @code{down}
+@cindex @code{down} debugger command
+@item @code{down} [@var{count}]
+Move @var{count} (default 1) frames down the stack toward the innermost frame.
+Then select and print the frame.
+
+@cindex debugger commands, @code{f} (@code{frame})
+@cindex debugger commands, @code{frame}
+@cindex @code{frame} debugger command
+@cindex @code{f} debugger command (alias for @code{frame})
+@item @code{frame} [@var{n}]
+@itemx @code{f} [@var{n}]
+Select and print stack frame @var{n}.  Frame 0 is the currently executing,
+or @dfn{innermost}, frame (function call); frame 1 is the frame that
+called the innermost one. The highest-numbered frame is the one for the
+main program.  The printed information consists of the frame number,
+function and argument names, source file, and the source line.
+
+@cindex debugger commands, @code{up}
+@cindex @code{up} debugger command
+@item @code{up} [@var{count}]
+Move @var{count} (default 1) frames up the stack toward the outermost frame.
+Then select and print the frame.
+@end table
+
+@node Debugger Info
+@subsection Obtaining Information About the Program and the Debugger State
+
+Besides looking at the values of variables, there is often a need to get
+other sorts of information about the state of your program and of the
+debugging environment itself.  The @command{gawk} debugger has one command that
+provides this information, appropriately called @code{info}.  @code{info}
+is used with one of a number of arguments that tell it exactly what
+you want to know:
+
+@table @asis
+@cindex debugger commands, @code{i} (@code{info})
+@cindex debugger commands, @code{info}
+@cindex @code{info} debugger command
+@cindex @code{i} debugger command (alias for @code{info})
+@item @code{info} @var{what}
+@itemx @code{i} @var{what}
+The value for @var{what} should be one of the following:
+
+@c nested table
+@table @code
+@item args
+@cindex show function arguments, in debugger
+List arguments of the selected frame.
+
+@item break
+@cindex show breakpoints
+List all currently set breakpoints.
+
+@item display
+@cindex automatic displays, in debugger
+List all items in the automatic display list.
+
+@item frame
+@cindex describe call stack frame, in debugger
+Give a description of the selected stack frame.
+
+@item functions
+@cindex list function definitions, in debugger
+List all function definitions including source @value{FN}s and
+line numbers.
+
+@item locals
+@cindex show local variables, in debugger
+List local variables of the selected frame.
+
+@item source
+@cindex show name of current source file, in debugger
+Print the name of the current source file. Each time the program stops, the
+current source file is the file containing the current instruction.
+When the debugger first starts, the current source file is the first file
+included via the @option{-f} option. The
+@samp{list @var{filename}:@var{lineno}} command can
+be used at any time to change the current source.
+
+@item sources
+@cindex show all source files, in debugger
+List all program sources.
+
+@item variables
+@cindex list all global variables, in debugger
+List all global variables.
+
+@item watch
+@cindex show watchpoints
+List all items in the watch list.
+@end table
+@end table
+
+Additional commands give you control over the debugger, the ability to
+save the debugger's state, and the ability to run debugger commands
+from a file.  The commands are:
+
+@table @asis
+@cindex debugger commands, @code{o} (@code{option})
+@cindex debugger commands, @code{option}
+@cindex @code{option} debugger command
+@cindex @code{o} debugger command (alias for @code{option})
+@cindex display debugger options
+@cindex debugger, options
+@item @code{option} [@var{name}[@code{=}@var{value}]]
+@itemx @code{o} [@var{name}[@code{=}@var{value}]]
+Without an argument, display the available debugger options
+and their current values. @samp{option @var{name}} shows the current
+value of the named option. @samp{option @var{name}=@var{value}} assigns
+a new value to the named option.
+The available options are:
+
+@c nested table
+@c asis for docbook
+@table @asis
+@item @code{history_size}
+@cindex debugger, history size
+Set the maximum number of lines to keep in the history file
+@file{./.gawk_history}.  The default is 100.
+
+@item @code{listsize}
+@cindex debugger, default list amount
+Specify the number of lines that @code{list} prints. The default is 15.
+
+@item @code{outfile}
+@cindex redirect @command{gawk} output, in debugger
+Send @command{gawk} output to a file; debugger output still goes
+to standard output. An empty string (@code{""}) resets output to
+standard output.
+
+@item @code{prompt}
+@cindex debugger, prompt
+Change the debugger prompt. The default is @samp{@w{gawk> }}.
+
+@item @code{save_history} [@code{on} | @code{off}]
+@cindex debugger, history file
+Save command history to file @file{./.gawk_history}.
+The default is @code{on}.
+
+@item @code{save_options} [@code{on} | @code{off}]
+@cindex save debugger options
+Save current options to file @file{./.gawkrc} upon exit.
+The default is @code{on}.
+Options are read back into the next session upon startup.
+
+@item @code{trace} [@code{on} | @code{off}]
+@cindex instruction tracing, in debugger
+@cindex debugger, instruction tracing
+Turn instruction tracing on or off. The default is @code{off}.
+@end table
+
+@cindex debugger, save commands to a file
+@item @code{save} @var{filename}
+Save the commands from the current session to the given @value{FN},
+so that they can be replayed using the @command{source} command.
+
+@item @code{source} @var{filename}
+@cindex debugger, read commands from a file
+Run command(s) from a file; an error in any command does not
+terminate execution of subsequent commands. Comments (lines starting
+with @samp{#}) are allowed in a command file.
+Empty lines are ignored; they do @emph{not}
+repeat the last command.
+You can't restart the program by having more than one @code{run}
+command in the file. Also, the list of commands may include additional
+@code{source} commands; however, the @command{gawk} debugger will not source the
+same file more than once in order to avoid infinite recursion.
+
+In addition to, or instead of, the @code{source} command, you can use
+the @option{-D @var{file}} or @option{--debug=@var{file}} command-line
+options to execute commands from a file non-interactively
+(@pxref{Options}).
+@end table
+
+@node Miscellaneous Debugger Commands
+@subsection Miscellaneous Commands
+
+There are a few more commands that do not fit into the
+previous categories, as follows:
+
+@table @asis
+@cindex debugger commands, @code{dump}
+@cindex @code{dump} debugger command
+@item @code{dump} [@var{filename}]
+Dump byte code of the program to standard output or to the file
+named in @var{filename}.  This prints a representation of the internal
+instructions that @command{gawk} executes to implement the @command{awk}
+commands in a program.  This can be very enlightening, as the following
+partial dump of Davide Brini's obfuscated code
+(@pxref{Signature Program}) demonstrates:
+
+@c FIXME: This will need updating if num-handler branch is ever merged in.
+@smallexample
+@group
+gawk> @kbd{dump}
+@print{}        # BEGIN
+@print{}
+@print{} [  1:0xfcd340] Op_rule           : [in_rule = BEGIN] [source_file = brini.awk]
+@end group
+@print{} [  1:0xfcc240] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc2a0] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc280] Op_match          :
+@print{} [  1:0xfcc1e0] Op_store_var      : O
+@print{} [  1:0xfcc2e0] Op_push_i         : "==" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc340] Op_push_i         : "==" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc320] Op_equal          :
+@print{} [  1:0xfcc200] Op_store_var      : o
+@print{} [  1:0xfcc380] Op_push           : o
+@print{} [  1:0xfcc360] Op_plus_i         : 0 [MALLOC|NUMCUR|NUMBER]
+@print{} [  1:0xfcc220] Op_push_lhs       : o [do_reference = true]
+@print{} [  1:0xfcc300] Op_assign_plus    :
+@print{} [   :0xfcc2c0] Op_pop            :
+@print{} [  1:0xfcc400] Op_push           : O
+@print{} [  1:0xfcc420] Op_push_i         : "" [MALLOC|STRING|STRCUR]
+@print{} [   :0xfcc4a0] Op_no_op          :
+@print{} [  1:0xfcc480] Op_push           : O
+@print{} [   :0xfcc4c0] Op_concat         : [expr_count = 3] [concat_flag = 0]
+@print{} [  1:0xfcc3c0] Op_store_var      : x
+@print{} [  1:0xfcc440] Op_push_lhs       : X [do_reference = true]
+@print{} [  1:0xfcc3a0] Op_postincrement  :
+@print{} [  1:0xfcc4e0] Op_push           : x
+@print{} [  1:0xfcc540] Op_push           : o
+@print{} [  1:0xfcc500] Op_plus           :
+@print{} [  1:0xfcc580] Op_push           : o
+@print{} [  1:0xfcc560] Op_plus           :
+@print{} [  1:0xfcc460] Op_leq            :
+@print{} [   :0xfcc5c0] Op_jmp_false      : [target_jmp = 0xfcc5e0]
+@print{} [  1:0xfcc600] Op_push_i         : "%c" [MALLOC|STRING|STRCUR]
+@print{} [   :0xfcc660] Op_no_op          :
+@print{} [  1:0xfcc520] Op_assign_concat  : c
+@print{} [   :0xfcc620] Op_jmp            : [target_jmp = 0xfcc440]
+@dots{}
+@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  :
+@group
+@print{} [      :0xfcc160] Op_no_op            :
+@print{} [      :0xfcc1a0] Op_after_endfile    :
+gawk>
+@end group
+@end smallexample
+
+@cindex @code{exit} debugger command
+@cindex exit the debugger
+@item @code{exit}
+Exit the debugger.
+See the entry for @samp{quit}, later in this list.
+
+@cindex debugger commands, @code{h} (@code{help})
+@cindex debugger commands, @code{help}
+@cindex @code{help} debugger command
+@cindex @code{h} debugger command (alias for @code{help})
+@item @code{help}
+@itemx @code{h}
+Print a list of all of the @command{gawk} debugger commands with a short
+summary of their usage.  @samp{help @var{command}} prints the information
+about the command @var{command}.
+
+@cindex debugger commands, @code{l} (@code{list})
+@cindex debugger commands, @code{list}
+@cindex @code{list} debugger command
+@cindex @code{l} debugger command (alias for @code{list})
+@item @code{list} [@code{-} | @code{+} | @var{n} | @var{filename}@code{:}@var{n} | @var{n}--@var{m} | @var{function}]
+@itemx @code{l} [@code{-} | @code{+} | @var{n} | @var{filename}@code{:}@var{n} | @var{n}--@var{m} | @var{function}]
+Print the specified lines (default 15) from the current source file
+or the file named @var{filename}. The possible arguments to @code{list}
+are as follows:
+
+@c nested table
+@table @asis
+@item @code{-} (Minus)
+Print lines before the lines last printed.
+
+@item @code{+}
+Print lines after the lines last printed.
+@code{list} without any argument does the same thing.
+
+@item @var{n}
+Print lines centered around line number @var{n}.
+
+@item  @var{n}--@var{m}
+Print lines from @var{n} to @var{m}.
+
+@item @var{filename}@code{:}@var{n}
+Print lines centered around line number @var{n} in
+source file @var{filename}. This command may change the current source file.
+
+@item @var{function}
+Print lines centered around the beginning of the
+function @var{function}. This command may change the current source file.
+@end table
+
+@cindex debugger commands, @code{q} (@code{quit})
+@cindex debugger commands, @code{quit}
+@cindex @code{quit} debugger command
+@cindex @code{q} debugger command (alias for @code{quit})
+@cindex exit the debugger
+@item @code{quit}
+@itemx @code{q}
+Exit the debugger.  Debugging is great fun, but sometimes we all have
+to tend to other obligations in life, and sometimes we find the bug
+and are free to go on to the next one!  As we saw earlier, if you are
+running a program, the debugger warns you when you type
+@samp{q} or @samp{quit}, to make sure you really want to quit.
+
+@cindex debugger commands, @code{trace}
+@cindex @code{trace} debugger command
+@item @code{trace} [@code{on} | @code{off}]
+Turn on or off continuous printing of the instructions that are about to
+be executed, along with the @command{awk} lines they
+implement.  The default is @code{off}.
+
+It is to be hoped that most of the ``opcodes'' in these instructions are
+fairly self-explanatory, and using @code{stepi} and @code{nexti} while
+@code{trace} is on will make them into familiar friends.
+
+@end table
+
+@node Readline Support
+@section Readline Support
+@cindex command completion, in debugger
+@cindex debugger, command completion
+@cindex history expansion, in debugger
+@cindex debugger, history expansion
+
+If @command{gawk} is compiled with
+@uref{http://cnswww.cns.cwru.edu/php/chet/readline/readline.html,
+the GNU Readline library}, you can take advantage of that library's
+command completion and history expansion features. The following types
+of completion are available:
+
+@table @asis
+@item Command completion
+Command names.
+
+@item Source @value{FN} completion
+Source @value{FN}s. Relevant commands are
+@code{break},
+@code{clear},
+@code{list},
+@code{tbreak},
+and
+@code{until}.
+
+@item Argument completion
+Non-numeric arguments to a command.
+Relevant commands are @code{enable} and @code{info}.
+
+@item Variable name completion
+Global variable names, and function arguments in the current context
+if the program is running. Relevant commands are
+@code{display},
+@code{print},
+@code{set},
+and
+@code{watch}.
+
+@end table
+
+@node Limitations
+@section Limitations
+
+@cindex debugger, limitations
+We hope you find the @command{gawk} debugger useful and enjoyable to work with,
+but as with any program, especially in its early releases, it still has
+some limitations.  A few that it's worth being aware of are:
+
+@itemize @value{BULLET}
+@item
+At this point, the debugger does not give a detailed explanation of
+what you did wrong when you type in something it doesn't like. Rather, it just
+responds @samp{syntax error}.  When you do figure out what your mistake was,
+though, you'll feel like a real guru.
+
+@item
+@c NOTE: no comma after the ref{} on purpose, due to following
+@c parenthetical remark.
+If you perused the dump of opcodes in @ref{Miscellaneous Debugger Commands}
+(or if you are already familiar with @command{gawk} internals),
+you will realize that much of the internal manipulation of data
+in @command{gawk}, as in many interpreters, is done on a stack.
+@code{Op_push}, @code{Op_pop}, and the like are the ``bread and butter'' of
+most @command{gawk} code.
+
+Unfortunately, as of now, the @command{gawk}
+debugger does not allow you to examine the stack's contents.
+That is, the intermediate results of expression evaluation are on the
+stack, but cannot be printed.  Rather, only variables that are defined
+in the program can be printed.  Of course, a workaround for
+this is to use more explicit variables at the debugging stage and then
+change back to obscure, perhaps more optimal code later.
+
+@item
+There is no way to look ``inside'' the process of compiling
+regular expressions to see if you got it right.  As an @command{awk}
+programmer, you are expected to know the meaning of
+@code{/[^[:alnum:][:blank:]]/}.
+
+@item
+The @command{gawk} debugger is designed to be used by running a program (with all its
+parameters) on the command line, as described in @ref{Debugger Invocation}.
+There is no way (as of now) to attach or ``break into'' a running program.
+This seems reasonable for a language that is used mainly for quickly
+executing, short programs.
+
+@item
+The @command{gawk} debugger only accepts source code supplied with the @option{-f} option.
+If you have a shell script that provides an @command{awk} program as a command
+line parameter, and you need to use the debugger, you can write the script
+to a temporary file, and use that as the program, with the @option{-f} option. This
+might look like this:
+
+@example
+cat << \EOF > /tmp/script.$$
+@dots{}                                  @ii{Your program here}
+EOF
+gawk -D -f /tmp/script.$$
+rm /tmp/script.$$
+@end example
+@end itemize
+
+@ignore
+@c 11/2016: This no longer applies after all the type cleanup work that's been done.
+One other point is worth discussing.  Conventional debuggers run in a
+separate process (and thus address space) from the programs that they
+debug (the @dfn{debuggee}, if you will).
+
+The @command{gawk} debugger is different; it is an integrated part
+of @command{gawk} itself.  This makes it possible, in rare cases,
+for @command{gawk} to become an excellent demonstrator of Heisenberg
+Uncertainty physics, where the mere act of observing something can change
+it. Consider the following:@footnote{Thanks to Hermann Peifer for
+this example.}
+
+@example
+$ @kbd{cat test.awk}
+@print{} @{ print typeof($1), typeof($2) @}
+$ @kbd{cat test.data}
+@print{} abc 123
+$ @kbd{gawk -f test.awk test.data}
+@print{} strnum strnum
+@end example
+
+This is all as expected: field data has the STRNUM attribute
+(@pxref{Variable Typing}).  Now watch what happens when we run
+this program under the debugger:
+
+@example
+$ @kbd{gawk -D -f test.awk test.data}
+gawk> @kbd{w $1}                        @ii{Set watchpoint on} $1
+@print{} Watchpoint 1: $1
+gawk> @kbd{w $2}                        @ii{Set watchpoint on} $2
+@print{} Watchpoint 2: $2
+gawk> @kbd{r}                           @ii{Start the program}
+@print{} Starting program:
+@print{} Stopping in Rule ...
+@print{} Watchpoint 1: $1               @ii{Watchpoint fires}
+@print{}   Old value: ""
+@print{}   New value: "abc"
+@print{} main() at `test.awk':1
+@print{} 1       @{ print typeof($1), typeof($2) @}
+gawk> @kbd{n}                           @ii{Keep going @dots{}}
+@print{} Watchpoint 2: $2               @ii{Watchpoint fires}
+@print{}   Old value: ""
+@print{}   New value: "123"
+@print{} main() at `test.awk':1
+@print{} 1       @{ print typeof($1), typeof($2) @}
+gawk> @kbd{n}                           @ii{Get result from} typeof()
+@print{} strnum number                  @ii{Result for} $2 @ii{isn't right}
+@print{} Program exited normally with exit value: 0
+gawk> @kbd{quit}
+@end example
+
+In this case, the act of comparing the new value of @code{$2}
+with the old one caused @command{gawk} to evaluate it and determine that it
+is indeed a number, and this is reflected in the result of
+@code{typeof()}.
+
+Cases like this where the debugger is not transparent to the program's
+execution should be rare. If you encounter one, please report it
+(@pxref{Bugs}).
+@end ignore
+
+@ignore
+Look forward to a future release when these and other missing features may
+be added, and of course feel free to try to add them yourself!
+@end ignore
+
+@node Debugging Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Programs rarely work correctly the first time.  Finding bugs
+is called debugging, and a program that helps you find bugs is a
+debugger.  @command{gawk} has a built-in debugger that works very
+similarly to the GNU Debugger, GDB.
+
+@item
+Debuggers let you step through your program one statement at a time,
+examine and change variable and array values, and do a number of other
+things that let you understand what your program is actually doing (as
+opposed to what it is supposed to do).
+
+@item
+Like most debuggers, the @command{gawk} debugger works in terms of stack
+frames, and lets you set both breakpoints (stop at a point in the code)
+and watchpoints (stop when a data value changes).
+
+@item
+The debugger command set is fairly complete, providing control over
+breakpoints, execution, viewing and changing data, working with the stack,
+getting information, and other tasks.
+
+@item
+If the GNU Readline library is available when @command{gawk} is
+compiled, it is used by the debugger to provide command-line history
+and editing.
+
+@item
+Usually, the debugger does not not affect the
+program being debugged, but occasionally it can.
+
+@end itemize
+
+@hyphenation{name-space name-spaces Name-space Name-spaces}
+@node Namespaces
+@chapter Namespaces in @command{gawk}
+
+This @value{CHAPTER} describes a feature that is specific to @command{gawk}.
+
+@quotation CAUTION
+This feature described in this chapter is new.  It is entirely
+possible, and even likely, that there are dark corners (if not bugs)
+still lurking within the implementation. If you find any such,
+please report them (@xref{Bugs}).
+@end quotation
+
+@menu
+* Global Namespace::            The global namespace in standard @command{awk}.
+* Qualified Names::             How to qualify names with a namespace.
+* Default Namespace::           The default namespace.
+* Changing The Namespace::      How to change the namespace.
+* Naming Rules::                Namespace and Component Naming Rules.
+* Internal Name Management::    How names are stored internally.
+* Namespace Example::           An example of code using a namespace.
+* Namespace And Features::      Namespaces and other @command{gawk} features.
+* Namespace Summary::           Summarizing namespaces.
+@end menu
+
+@node Global Namespace
+@section Standard @command{awk}'s Single Namespace
+
+@cindex namespace, definition of
+@cindex namespace, standard @command{awk}, global
+In standard @command{awk}, there is a single, global, @dfn{namespace}.
+This means that @emph{all} function names and global variable names must
+be unique. For example, two different @command{awk} source files cannot
+both define a function named @code{min()}, or define the same identifier,
+used as a scalar in one and as an array in the other.
+
+This situation is okay when programs are small, say a few hundred
+lines, or even a few thousand, but it prevents the development of
+reusable libraries of @command{awk} functions, and can inadvertently
+cause independently-developed library files to accidentally step on each
+other's ``private'' global variables
+(@pxref{Library Names}).
+
+@cindex package, definition of
+@cindex module, definition of
+Most other programming languages solve this issue by providing some kind
+of namespace control: a way to say ``this function is in namespace @var{xxx},
+and that function is in namespace @var{yyy}.''  (Of course, there is then
+still a single namespace for the namespaces, but the hope is that there
+are much fewer namespaces in use by any given program, and thus much
+less chance for collisions.)  These facilities are sometimes referred
+to as @dfn{packages} or @dfn{modules}.
+
+Starting with @value{PVERSION} 5.0, @command{gawk} provides a
+simple mechanism to put functions and global variables into separate namespaces.
+
+@node Qualified Names
+@section Qualified Names
+
+@cindex qualified name, definition of
+@cindex namespaces, qualified names
+@cindex @code{::}, namespace separator
+@cindex component name
+A @dfn{qualified name} is an identifier that includes a namespace name,
+the namespace separator @code{::}, and a @dfn{component} name.  For example, one
+might have a function named @code{posix::getpid()}.  Here, the namespace
+is @code{posix} and the function name within the namespace (the component)
+is @code{getpid()}.  The namespace and component names are separated by
+a double-colon.  Only one such separator is allowed in a qualified name.
+
+@quotation NOTE
+Unlike C++, the @code{::} is @emph{not} an operator.  No spaces are
+allowed between the namespace name, the @code{::}, and the component name.
+@end quotation
+
+@cindex qualified name, use of
+You must use qualified names from one namespace to access variables
+and functions in another.  This is especially important when using
+variable names to index the special @code{SYMTAB} array (@pxref{Auto-set}),
+and when making indirect function calls (@pxref{Indirect Calls}).
+
+@node Default Namespace
+@section The Default Namespace
+
+@cindex namespace, default
+@cindex namespace, @code{awk}
+@cindex @code{awk} namespace
+The default namespace, not surprisingly, is @code{awk}.
+All of the predefined @command{awk} and @command{gawk} variables
+are in this namespace, and thus have qualified names like
+@code{awk::ARGC}, @code{awk::NF}, and so on.
+
+@cindex uppercase names, namespace for
+Furthermore, even when you have changed the namespace for your
+current source file (@pxref{Changing The Namespace}), @command{gawk}
+forces unqualified identifiers whose names are all uppercase letters
+to be in the @code{awk} namespace.  This makes it possible for you to easily
+reference @command{gawk}'s global variables from different namespaces.
+It also keeps your code looking natural.
+
+@node Changing The Namespace
+@section Changing The Namespace
+
+@cindex namespaces, changing
+@cindex @code{@@namespace} directive
+In order to set the current namespace, use an @code{@@namespace} directive
+at the top level of your program:
+
+@example
+@@namespace "passwd"
+
+BEGIN @{ @dots{} @}
+@dots{}
+@end example
+
+After this directive, all simple non-completely-uppercase identifiers are
+placed into the @code{passwd} namespace.
+
+You can change the namespace multiple times within a single
+source file, although this is likely to become confusing if you
+do it too much.
+
+@quotation NOTE
+Association of unqualified identifiers to a namespace is handled while
+@command{gawk} parses your program, @emph{before} it starts to run.  There is
+no concept of a ``current'' namespace once your program starts executing.
+Be sure you understand this.
+@end quotation
+
+@cindex namespace, implicit
+@cindex implicit namespace
+Each source file for @option{-i} and @option{-f} starts out with
+an implicit @samp{@@namespace "awk"}.  Similarly, each chunk of
+command-line code supplied with @option{-e} has such an implicit
+initial statement (@pxref{Options}).
+
+@cindex current namespace, pushing and popping
+@cindex namespace, pushing and popping
+Files included with @code{@@include} (@pxref{Include Files}) ``push''
+and ``pop'' the current namespace. That is, each @code{@@include} saves
+the current namespace and starts over with an implicit @samp{@@namespace
+"awk"} which remains in effect until an explicit @code{@@namespace}
+directive is seen.  When @command{gawk} finishes processing the included
+file, the saved namespace is restored and processing continues where it
+left off in the original file.
+
+@cindex @code{@@namespace}, no effect on @code{BEGIN}@comma{} @code{BEGINFILE}@comma{} @code{END}@comma{} and @code{ENDFILE}
+@cindex @code{BEGIN} pattern, execution order not affected by @code{@@namespace}
+@cindex @code{BEGINFILE} pattern, execution order not affected by @code{@@namespace}
+@cindex @code{END} pattern, execution order not affected by @code{@@namespace}
+@cindex @code{ENDFILE} pattern, execution order not affected by @code{@@namespace}
+The use of @code{@@namespace} has no influence upon the order of execution
+of @code{BEGIN}, @code{BEGINFILE}, @code{END}, and @code{ENDFILE} rules.
+
+@node Naming Rules
+@section Namespace and Component Naming Rules
+
+@cindex naming rules, namespaces and component names
+@cindex namespace names, naming rules
+@cindex component names, naming rules
+A number of rules apply to the namespace and component names, as follows.
+
+@itemize @bullet
+@item
+It is a syntax error to use qualified names for function parameter names.
+
+@item
+It is a syntax error to use any standard @command{awk} reserved word (such
+as @code{if} or @code{for}), or the name of any standard built-in function
+(such as @code{sin()} or @code{gsub()}) as either part of a qualified name.
+Thus, the following produces a syntax error:
+
+@example
+@@namespace "example"
+
+function gsub(str, pat, result) @{ @dots{} @}
+@end example
+
+@item
+Outside the @code{awk} namespace, the names of the additional @command{gawk}
+built-in functions (such as @code{gensub()} or @code{strftime()}) @emph{may}
+be used as component names.  The same set of names may be used as namespace
+names, although this has the potential to be confusing.
+
+@item
+The additional @command{gawk} built-in functions may still be called
+from outside the @code{awk} namespace by qualifying them. For example,
+@code{awk::systime()}.  Here is a somewhat silly example demonstrating
+this rule and the previous one:
+
+@example
+BEGIN @{
+    print "in awk namespace, systime() =", systime()
+@}
+
+@@namespace "testing"
+
+function systime()
+@{
+    print "in testing namespace, systime() =", awk::systime()
+@}
+
+BEGIN @{
+    systime()
+@}
+@end example
+
+@noindent
+
+When run, it produces output like this:
+
+@example
+$ @kbd{gawk -f systime.awk}
+@print{} in awk namespace, systime() = 1500488503
+@print{} in testing namespace, systime() = 1500488503
+@end example
+
+@item
+@command{gawk} pre-defined variable names may be used:
+@code{NF::NR} is valid, if possibly not all that useful.
+@end itemize
+
+@node Internal Name Management
+@section Internal Name Management
+
+@cindex name management
+@cindex @code{awk} namespace, identifier name storage
+@cindex @code{awk} namespace, use for indirect function calls
+For backwards compatibility, all identifiers in the @code{awk} namespace
+are stored internally as unadorned identifiers (that is, without a
+leading @samp{awk::}).  This is mainly relevant
+when using such identifiers as indices for @code{SYMTAB}, @code{FUNCTAB},
+and @code{PROCINFO["identifiers"]} (@pxref{Auto-set}), and for use in
+indirect function calls (@pxref{Indirect Calls}).
+
+In program code, to refer to variables and functions in the @code{awk}
+namespace from another namespace, you must still use the @samp{awk::}
+prefix. For example:
+
+@example
+@@namespace "awk"          @ii{This is the default namespace}
+
+BEGIN @{
+    Title = "My Report"   @ii{Qualified name is} awk::Title
+@}
+
+@@namespace "report"       @ii{Now in} report @ii{namespace}
+
+function compute()        @ii{This is really} report::compute()
+@{
+    print awk::Title      @ii{But would be} SYMTAB["Title"]
+    @dots{}
+@}
+@end example
+
+@node Namespace Example
+@section Namespace Example
+
+@cindex namespace, example code
+The following example is a revised version of the suite of routines
+developed in @ref{Passwd Functions}. See there for an explanation
+of how the code works.
+
+The formulation here, due mainly to Andrew Schorr, is rather elegant.
+All of the implementation functions and variables are in the
+@code{passwd} namespace, whereas the main interface functions are
+defined in the @code{awk} namespace.
+
+@example
+@c file eg/lib/ns_passwd.awk
+# ns_passwd.awk --- access password file information
+@c endfile
+@ignore
+@c file eg/lib/ns_passwd.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+#
+# Reworked for namespaces June 2017, with help from
+# Andrew J.@: Schorr, aschorr@@telemetry-investments.com
+@c endfile
+@end ignore
+@c file eg/lib/ns_passwd.awk
+
+@@namespace "passwd"
+
+BEGIN @{
+    # tailor this to suit your system
+    Awklib = "/usr/local/libexec/awk/"
+@}
+
+function Init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+@{
+    if (Inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    pwcat = Awklib "pwcat"
+    while ((pwcat | getline) > 0) @{
+        Byname[$1] = $0
+        Byuid[$3] = $0
+        Bycount[++Total] = $0
+    @}
+    close(pwcat)
+    Count = 0
+    Inited = 1
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+@}
+
+function awk::getpwnam(name)
+@{
+    Init()
+    return Byname[name]
+@}
+
+function awk::getpwuid(uid)
+@{
+    Init()
+    return Byuid[uid]
+@}
+
+function awk::getpwent()
+@{
+    Init()
+    if (Count < Total)
+        return Bycount[++Count]
+    return ""
+@}
+
+function awk::endpwent()
+@{
+    Count = 0
+@}
+@c endfile
+@end example
+
+As you can see, this version also follows the convention mentioned in
+@ref{Library Names}, whereby global variable and function names
+start with a capital letter.
+
+Here is a simple test program. Since it's in a separate file, unadorned
+identifiers are sought for in the @code{awk} namespace:
+
+@example
+BEGIN @{
+    while ((p = getpwent()) != "")
+        print p
+@}
+@end example
+
+@noindent
+
+Here's what happens when it's run:
+
+@example
+$ @kbd{gawk -f ns_passwd.awk -f testpasswd.awk}
+@print{} root:x:0:0:root:/root:/bin/bash
+@print{} daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
+@print{} bin:x:2:2:bin:/bin:/usr/sbin/nologin
+@print{} sys:x:3:3:sys:/dev:/usr/sbin/nologin
+@dots{}
+@end example
+
+@node Namespace And Features
+@section Namespaces and Other @command{gawk} Features
+
+This @value{SECTION} looks briefly at how the namespace facility interacts
+with other important @command{gawk} features.
+
+@cindex namespaces, interaction with profiler
+@cindex namespaces, interaction with pretty printer
+@cindex profiler, interaction with namespaces
+@cindex pretty printer, interaction with namespaces
+The profiler and pretty-printer (@pxref{Profiling}) have been enhanced
+to understand namespaces and the namespace naming rules presented in
+@ref{Naming Rules}.  In particular, the output groups functions in the same
+namespace together, and has @code{@@namespace} directives in front
+of rules as necessary. This allows component names to be
+simple identifiers, instead of using qualified identifiers everywhere.
+
+@cindex namespaces, interaction with debugger
+@cindex debugger, interaction with namespaces
+Interaction with the debugger (@pxref{Debugging}) has not had to change
+(at least as of this writing).  Some of the internal byte codes changed
+in order to accommodate namespaces, and the debugger's @code{dump} command
+was adjusted to match.
+
+@cindex namespaces, interaction with extension API
+@cindex extension API interaction with namespaces
+The extension API (@pxref{Dynamic Extensions}) has always allowed for
+placing functions into a different namespace, although this was not
+previously implemented.  However, the symbol lookup and symbol update
+routines did not have provision for including a namespace. That has now
+been corrected (@pxref{Symbol table by name}).
+@xref{Extension Sample Inplace}, for a nice example of an extension that
+leverages a namespace shared by cooperating @command{awk} and C code.
+
+@node Namespace Summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Standard @command{awk} provides a single namespace for all global
+identifiers (scalars, arrays, and functions).  This is limiting when
+one wants to develop libraries of reusable functions or function suites.
+
+@item
+@command{gawk} provides multiple namespaces by using qualified names:
+names consisting of a namespace name, a double colon, @code{::}, and a
+component name.  Namespace names might still possibly conflict, but this
+is true of any language providing namespaces, modules, or packages.
+
+@item
+The default namespace is @command{awk}. The rules for namespace and
+component names are provided in @ref{Naming Rules}. The rules are
+designed in such a way as to make namespace-aware code continue to
+look and work naturally while still providing the necessary power and
+flexibility.
+
+@item
+Other parts of @command{gawk} have been extended as necessary to integrate
+namespaces smoothly with their operation.  This applies most notably to
+the profiler / pretty-printer (@pxref{Profiling}) and to the extension
+facility (@pxref{Dynamic Extensions}).
+
+@cindex namespaces, backwards compatibility
+@item
+Overall, the namespace facility was designed and implemented such that
+backwards compatibility is paramount. Programs that don't use namespaces
+should see absolutely no difference in behavior when run by a namespace-capable
+version of @command{gawk}.
+@end itemize
+
+@node Arbitrary Precision Arithmetic
+@chapter Arithmetic and Arbitrary-Precision Arithmetic with @command{gawk}
+@cindex arbitrary precision
+@cindex multiple precision
+@cindex infinite precision
+@cindex floating-point, numbers@comma{} arbitrary-precision
+
+This @value{CHAPTER} introduces some basic concepts relating to
+how computers do arithmetic and defines some important terms.
+It then proceeds to describe floating-point arithmetic,
+which is what @command{awk} uses for all its computations, including a
+discussion of arbitrary-precision floating-point arithmetic, which is
+a feature available only in @command{gawk}. It continues on to present
+arbitrary-precision integers, and concludes with a description of some
+points where @command{gawk} and the POSIX standard are not quite in
+agreement.
+
+@quotation NOTE
+Most users of @command{gawk} can safely skip this chapter.
+But if you want to do scientific calculations with @command{gawk},
+this is the place to be.
+@end quotation
+
+@menu
+* Computer Arithmetic::           A quick intro to computer math.
+* Math Definitions::              Defining terms used.
+* MPFR features::                 The MPFR features in @command{gawk}.
+* FP Math Caution::               Things to know.
+* Arbitrary Precision Integers::  Arbitrary Precision Integer Arithmetic with
+                                  @command{gawk}.
+* Checking for MPFR::             How to check if MPFR is available.
+* POSIX Floating Point Problems:: Standards Versus Existing Practice.
+* Floating point summary::        Summary of floating point discussion.
+@end menu
+
+@node Computer Arithmetic
+@section A General Description of Computer Arithmetic
+
+Until now, we have worked with data as either numbers or
+strings.  Ultimately, however, computers represent everything in terms
+of @dfn{binary digits}, or @dfn{bits}.  A decimal digit can take on any
+of 10 values: zero through nine.  A binary digit can take on any of two
+values, zero or one.  Using binary, computers (and computer software)
+can represent and manipulate numerical and character data.  In general,
+the more bits you can use to represent a particular thing, the greater
+the range of possible values it can take on.
+
+Modern computers support at least two, and often more, ways to do
+arithmetic.  Each kind of arithmetic uses a different representation
+(organization of the bits) for the numbers.  The kinds of arithmetic
+that interest us are:
+
+@table @asis
+@item Decimal arithmetic
+This is the kind of arithmetic you learned in elementary school, using
+paper and pencil (and/or a calculator). In theory, numbers can have an
+arbitrary number of digits on either side (or both sides) of the decimal
+point, and the results of a computation are always exact.
+
+Some modern systems can do decimal arithmetic in hardware, but usually you
+need a special software library to provide access to these instructions.
+There are also libraries that do decimal arithmetic entirely in software.
+
+Despite the fact that some users expect @command{gawk} to be performing
+decimal arithmetic,@footnote{We don't know why they expect this, but
+they do.} it does not do so.
+
+@item Integer arithmetic
+In school, integer values were referred to as ``whole'' numbers---that
+is, numbers without any fractional part, such as 1, 42, or @minus{}17.
+The advantage to integer numbers is that they represent values exactly.
+The disadvantage is that their range is limited.
+
+@cindex unsigned integers
+@cindex integers, unsigned
+In computers, integer values come in two flavors: @dfn{signed} and
+@dfn{unsigned}.  Signed values may be negative or positive, whereas
+unsigned values are always greater than or equal
+to zero.
+
+In computer systems, integer arithmetic is exact, but the possible
+range of values is limited.  Integer arithmetic is generally faster than
+floating-point arithmetic.
+
+@cindex 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).
+The advantage to floating-point numbers is that they can represent a
+much larger range of values than can integers.  The disadvantage is that
+there are numbers that they cannot represent exactly.
+
+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.
+
+@cindex floating-point, numbers@comma{} single-precision
+@cindex floating-point, numbers@comma{} double-precision
+@cindex floating-point, numbers@comma{} arbitrary-precision
+@cindex single-precision
+@cindex double-precision
+@cindex 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
+floating-point arithmetic, which we describe in more detail shortly.
+@end table
+
+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.
+(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
+@caption{Value ranges for integer representations}
+@multitable @columnfractions .34 .33 .33
+@headitem 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
+@end multitable
+@end float
+
+@float Table,table-floating-point-ranges
+@caption{Approximate value ranges for floating-point number representations}
+@multitable @columnfractions .38 .22 .22 .23
+@iftex
+@headitem Representation @tab @w{Minimum positive} @w{nonzero value} @tab Minimum @w{finite value} @tab Maximum @w{finite value}
+@end iftex
+@ifnottex
+@headitem Representation @tab Minimum positive nonzero value @tab Minimum finite value @tab Maximum finite value
+@end ifnottex
+@iftex
+@item @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}}
+@item @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}}
+@item @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
+@item Single-precision floating-point @tab 1.175494e-38 @tab -3.402823e+38 @tab 3.402823e+38
+@item Double-precision floating-point @tab 2.225074e-308 @tab -1.797693e+308 @tab 1.797693e+308
+@item Quadruple-precision floating-point @tab 3.362103e-4932 @tab -1.189731e+4932 @tab 1.189731e+4932
+@end ifinfo
+@ifnottex
+@ifnotinfo
+@item Single-precision floating-point @tab 1.175494*10@sup{-38} @tab -3.402823*10@sup{38} @tab 3.402823*10@sup{38}
+@item Double-precision floating-point @tab 2.225074*10@sup{-308} @tab -1.797693*10@sup{308} @tab 1.797693*10@sup{308}
+@item Quadruple-precision floating-point @tab 3.362103*10@sup{-4932} @tab -1.189731*10@sup{4932} @tab 1.189731*10@sup{4932}
+@end ifnotinfo
+@end ifnottex
+@end multitable
+@end float
+
+@node Math Definitions
+@section Other Stuff to Know
+
+The rest of this @value{CHAPTER} uses a number of terms. Here are some
+informal definitions that should help you work your way through the material
+here:
+
+@table @dfn
+@item Accuracy
+A floating-point calculation's accuracy is how close it comes
+to the real (paper and pencil) value.
+
+@item Error
+The difference between what the result of a computation ``should be''
+and what it actually is.  It is best to minimize error as much
+as possible.
+
+@item Exponent
+The order of magnitude of a value;
+some number of bits in a floating-point value store the exponent.
+
+@item Inf
+A special value representing infinity. Operations involving another
+number and infinity produce infinity.
+
+@item NaN
+``Not a number.''@footnote{Thanks to Michael Brennan for this description,
+which we have paraphrased, and for the examples.} A special value that
+results from attempting a calculation that has no answer as a real number.
+In such a case, programs can either receive a floating-point exception,
+or get @code{NaN} back as the result. The IEEE 754 standard recommends
+that systems return @code{NaN}. Some examples:
+
+@table @code
+@item sqrt(-1)
+This makes sense in the range of complex numbers, but not in the
+range of real numbers, so the result is @code{NaN}.
+
+@item log(-8)
+@minus{}8 is out of the domain of @code{log()}, so the result is @code{NaN}.
+@end table
+
+@item Normalized
+How the significand (see later in this list) is usually stored. The
+value is adjusted so that the first bit is one, and then that leading
+one is assumed instead of physically stored.  This provides one
+extra bit of precision.
+
+@item Precision
+The number of bits used to represent a floating-point number.
+The more bits, the more digits you can represent.
+Binary and decimal precisions are related approximately, according to the
+formula:
+
+@display
+@iftex
+@math{prec = 3.322 @cdot dps}
+@end iftex
+@ifnottex
+@ifnotdocbook
+@var{prec} = 3.322 * @var{dps}
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>
+@end docbook
+@end display
+
+@noindent
+Here, @emph{prec} denotes the binary precision
+(measured in bits) and @emph{dps} (short for decimal places)
+is the decimal digits.
+
+@item Rounding mode
+How numbers are rounded up or down when necessary.
+More details are provided later.
+
+@item Significand
+A floating-point value consists of the significand multiplied by 10
+to the power of the exponent. For example, in @code{1.2345e67},
+the significand is @code{1.2345}.
+
+@item Stability
+From @uref{https://en.wikipedia.org/wiki/Numerical_stability,
+the Wikipedia article on numerical stability}:
+``Calculations that can be proven not to magnify approximation errors
+are called @dfn{numerically stable}.''
+@end table
+
+See @uref{https://en.wikipedia.org/wiki/Accuracy_and_precision,
+the Wikipedia article on accuracy and precision} for more information
+on some of those terms.
+
+On modern systems, floating-point hardware uses the representation and
+operations defined by the IEEE 754 standard.
+Three of the standard IEEE 754 types are 32-bit single precision,
+64-bit double precision, and 128-bit quadruple precision.
+The standard also specifies extended precision formats
+to allow greater precisions and larger exponent ranges.
+(@command{awk} uses only the 64-bit double-precision format.)
+
+@ref{table-ieee-formats} lists the precision and exponent
+field values for the basic IEEE 754 binary formats.
+
+@float Table,table-ieee-formats
+@caption{Basic IEEE format values}
+@multitable @columnfractions .20 .20 .20 .20 .20
+@headitem Name @tab Total bits @tab Precision @tab Minimum exponent @tab Maximum exponent
+@item Single @tab 32 @tab 24 @tab @minus{}126 @tab +127
+@item Double @tab 64 @tab 53 @tab @minus{}1022 @tab +1023
+@item Quadruple @tab 128 @tab 113 @tab @minus{}16382 @tab +16383
+@end multitable
+@end float
+
+@quotation NOTE
+The precision numbers include the implied leading one that gives them
+one extra bit of significand.
+@end quotation
+
+@node MPFR features
+@section Arbitrary-Precision Arithmetic Features in @command{gawk}
+
+By default, @command{gawk} uses the double-precision floating-point values
+supplied by the hardware of the system it runs on.  However, if it was
+compiled to do so, and the @option{-M} command-line option is supplied,
+@command{gawk} uses the @uref{http://www.mpfr.org,
+GNU MPFR} and @uref{https://gmplib.org, GNU MP} (GMP) libraries for
+arbitrary-precision arithmetic on numbers.  You can see if MPFR support
+is available like so:
+
+@example
+$ @kbd{gawk --version}
+@print{} GNU Awk 4.1.2, API: 1.1 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2)
+@print{} Copyright (C) 1989, 1991-2015 Free Software Foundation.
+@dots{}
+@end example
+
+@noindent
+(You may see different version numbers than what's shown here. That's OK;
+what's important is to see that GNU MPFR and GNU MP are listed in
+the output.)
+
+Additionally, there are a few elements available in the @code{PROCINFO}
+array to provide information about the MPFR and GMP libraries
+(@pxref{Auto-set}).
+
+The MPFR library provides precise control over precisions and rounding
+modes, and gives correctly rounded, reproducible, platform-independent
+results.  With the @option{-M} command-line option,
+all floating-point arithmetic operators and numeric functions
+can yield results to any desired precision level supported by MPFR.
+
+Two predefined variables, @code{PREC} and @code{ROUNDMODE},
+provide control over the working precision and the rounding mode.
+The precision and the rounding mode are set globally for every operation
+to follow.
+@xref{Setting precision} and @ref{Setting the rounding mode}
+for more information.
+
+@node FP Math Caution
+@section Floating-Point Arithmetic: Caveat Emptor!
+
+@quotation
+@i{Math class is tough!}
+@author Teen Talk Barbie, July 1992
+@end quotation
+
+This @value{SECTION} provides a high-level overview of the issues
+involved when doing lots of floating-point arithmetic.@footnote{There
+is a very nice @uref{http://www.validlab.com/goldberg/paper.pdf,
+paper on floating-point arithmetic} by David Goldberg, ``What Every
+Computer Scientist Should Know About Floating-Point Arithmetic,''
+@cite{ACM Computing Surveys} @strong{23}, 1 (1991-03): 5-48.  This is
+worth reading if you are interested in the details, but it does require
+a background in computer science.}
+The discussion applies to both hardware and arbitrary-precision
+floating-point arithmetic.
+
+@quotation CAUTION
+The material here is purposely general. If you need to do serious
+computer arithmetic, you should do some research first, and not
+rely just on what we tell you.
+@end quotation
+
+@menu
+* Inexactness of computations:: Floating point math is not exact.
+* Getting Accuracy::            Getting more accuracy takes some work.
+* Try To Round::                Add digits and round.
+* Setting precision::           How to set the precision.
+* Setting the rounding mode::   How to set the rounding mode.
+@end menu
+
+@node Inexactness of computations
+@subsection Floating-Point Arithmetic Is Not Exact
+
+Binary floating-point representations and arithmetic are inexact.
+Simple values like 0.1 cannot be precisely represented using
+binary floating-point numbers, and the limited precision of
+floating-point numbers means that slight changes in
+the order of operations or the precision of intermediate storage
+can change the result. To make matters worse, with arbitrary-precision
+floating-point arithmetic, you can set the precision before starting a
+computation, but then you cannot be sure of the number of significant
+decimal places in the final result.
+
+@menu
+* Inexact representation::      Numbers are not exactly represented.
+* Comparing FP Values::         How to compare floating point values.
+* Errors accumulate::           Errors get bigger as they go.
+@end menu
+
+@node Inexact representation
+@subsubsection Many Numbers Cannot Be Represented Exactly
+
+So, before you start to write any code, you should think
+about what you really want and what's really happening. Consider the
+two numbers in the following example:
+
+@example
+x = 0.875             # 1/2 + 1/4 + 1/8
+y = 0.425
+@end example
+
+Unlike the number in @code{y}, the number stored in @code{x}
+is exactly representable
+in binary because it can be written as a finite sum of one or
+more fractions whose denominators are all powers of two.
+When @command{gawk} reads a floating-point number from
+program source, it automatically rounds that number to whatever
+precision your machine supports. If you try to print the numeric
+content of a variable using an output format string of @code{"%.17g"},
+it may not produce the same number as you assigned to it:
+
+@example
+$ @kbd{gawk 'BEGIN @{ x = 0.875; y = 0.425}
+> @kbd{              printf("%0.17g, %0.17g\n", x, y) @}'}
+@print{} 0.875, 0.42499999999999999
+@end example
+
+Often the error is so small you do not even notice it, and if you do,
+you can always specify how much precision you would like in your output.
+Usually this is a format string like @code{"%.15g"}, which, when
+used in the previous example, produces an output identical to the input.
+
+@node Comparing FP Values
+@subsubsection Be Careful Comparing Values
+
+Because the underlying representation can be a little bit off from the exact value,
+comparing floating-point values to see if they are exactly equal is generally a bad idea.
+Here is an example where it does not work like you would expect:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
+@print{} 0
+@end example
+
+The general wisdom when comparing floating-point values is to see if
+they are within some small range of each other (called a @dfn{delta},
+or @dfn{tolerance}).
+You have to decide how small a delta is important to you. Code to do
+this looks something like the following:
+
+@example
+@group
+delta = 0.00001                 # for example
+difference = abs(a - b)         # subtract the two values
+if (difference < delta)
+    # all ok
+else
+    # not ok
+@end group
+@end example
+
+@noindent
+(We assume that you have a simple absolute value function named
+@code{abs()} defined elsewhere in your program.)  If you write a
+function to compare values with a delta, you should be sure
+to use @samp{difference < abs(delta)} in case someone passes
+in a negative delta value.
+
+@node Errors accumulate
+@subsubsection Errors Accumulate
+
+The loss of accuracy during a single computation with floating-point
+numbers usually isn't enough to worry about. However, if you compute a
+value that is the result of a sequence of floating-point operations,
+the error can accumulate and greatly affect the computation itself.
+Here is an attempt to compute the value of @value{PI} using one of its
+many series representations:
+
+@example
+BEGIN @{
+    x = 1.0 / sqrt(3.0)
+    n = 6
+    for (i = 1; i < 30; i++) @{
+        n = n * 2.0
+        x = (sqrt(x * x + 1) - 1) / x
+        printf("%.15f\n", n * x)
+    @}
+@}
+@end example
+
+When run, the early errors propagate through later computations,
+causing the loop to terminate prematurely after attempting to divide by zero:
+
+@example
+$ @kbd{gawk -f pi.awk}
+@print{} 3.215390309173475
+@print{} 3.159659942097510
+@print{} 3.146086215131467
+@print{} 3.142714599645573
+@dots{}
+@print{} 3.224515243534819
+@print{} 2.791117213058638
+@print{} 0.000000000000000
+@error{} gawk: pi.awk:6: fatal: division by zero attempted
+@end example
+
+Here is an additional example where the inaccuracies in internal representations
+yield an unexpected result:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>   @kbd{for (d = 1.1; d <= 1.5; d += 0.1)    # loop five times (?)}
+>       @kbd{i++}
+>   @kbd{print i}
+> @kbd{@}'}
+@print{} 4
+@end example
+
+@node Getting Accuracy
+@subsection Getting the Accuracy You Need
+
+Can arbitrary-precision arithmetic give exact results? There are
+no easy answers. The standard rules of algebra often do not apply
+when using floating-point arithmetic.
+Among other things, the distributive and associative laws
+do not hold completely, and order of operation may be important
+for your computation. Rounding error, cumulative precision loss,
+and underflow are often troublesome.
+
+When @command{gawk} tests the expressions @samp{0.1 + 12.2} and
+@samp{12.3} for equality using the machine double-precision arithmetic,
+it decides that they are not equal!  (@xref{Comparing FP Values}.)
+You can get the result you want by increasing the precision; 56 bits in
+this case does the job:
+
+@example
+$ @kbd{gawk -M -v PREC=56 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
+@print{} 1
+@end example
+
+If adding more bits is good, perhaps adding even more bits of
+precision is better?
+Here is what happens if we use an even larger value of @code{PREC}:
+
+@example
+$ @kbd{gawk -M -v PREC=201 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
+@print{} 0
+@end example
+
+This is not a bug in @command{gawk} or in the MPFR library.
+It is easy to forget that the finite number of bits used to store the value
+is often just an approximation after proper rounding.
+The test for equality succeeds if and only if @emph{all} bits in the two operands
+are exactly the same. Because this is not necessarily true after floating-point
+computations with a particular precision and effective rounding mode,
+a straight test for equality may not work. Instead, compare the
+two numbers to see if they are within the desirable delta of each other.
+
+In applications where 15 or fewer decimal places suffice,
+hardware double-precision arithmetic can be adequate, and is usually much faster.
+But you need to keep in mind that every floating-point operation
+can suffer a new rounding error with catastrophic consequences, as illustrated
+by our earlier attempt to compute the value of @value{PI}.
+Extra precision can greatly enhance the stability and the accuracy
+of your computation in such cases.
+
+Additionally, you should understand that
+repeated addition is not necessarily equivalent to multiplication
+in floating-point arithmetic. In the example in
+@ref{Errors accumulate}:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>   @kbd{for (d = 1.1; d <= 1.5; d += 0.1)    # loop five times (?)}
+>       @kbd{i++}
+>   @kbd{print i}
+> @kbd{@}'}
+@print{} 4
+@end example
+
+@noindent
+you may or may not succeed in getting the correct result by choosing
+an arbitrarily large value for @code{PREC}. Reformulation of
+the problem at hand is often the correct approach in such situations.
+
+@node Try To Round
+@subsection Try a Few Extra Bits of Precision and Rounding
+
+Instead of arbitrary-precision floating-point arithmetic,
+often all you need is an adjustment of your logic
+or a different order for the operations in your calculation.
+The stability and the accuracy of the computation of @value{PI}
+in the earlier example can be enhanced by using the following
+simple algebraic transformation:
+
+@example
+(sqrt(x * x + 1) - 1) / x @equiv{} x / (sqrt(x * x + 1) + 1)
+@end example
+
+@noindent
+After making this change, the program converges to
+@value{PI} in under 30 iterations:
+
+@example
+$ @kbd{gawk -f pi2.awk}
+@print{} 3.215390309173473
+@print{} 3.159659942097501
+@print{} 3.146086215131436
+@print{} 3.142714599645370
+@print{} 3.141873049979825
+@dots{}
+@print{} 3.141592653589797
+@print{} 3.141592653589797
+@end example
+
+@node Setting precision
+@subsection Setting the Precision
+
+@command{gawk} uses a global working precision; it does not keep track of
+the precision or accuracy of individual numbers. Performing an arithmetic
+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 @code{PREC}. You can also set the
+value to one of the predefined case-insensitive strings
+shown in @ref{table-predefined-precision-strings},
+to emulate an IEEE 754 binary format.
+
+@float Table,table-predefined-precision-strings
+@caption{Predefined precision strings for @code{PREC}}
+@multitable {@code{"double"}} {12345678901234567890123456789012345}
+@headitem @code{PREC} @tab IEEE 754 binary format
+@item @code{"half"} @tab 16-bit half-precision
+@item @code{"single"} @tab Basic 32-bit single precision
+@item @code{"double"} @tab Basic 64-bit double precision
+@item @code{"quad"} @tab Basic 128-bit quadruple precision
+@item @code{"oct"} @tab 256-bit octuple precision
+@end multitable
+@end float
+
+The following example illustrates the effects of changing precision
+on arithmetic operations:
+
+@example
+$ @kbd{gawk -M -v PREC=100 'BEGIN @{ x = 1.0e-400; print x + 0}
+>   @kbd{PREC = "double"; print x + 0 @}'}
+@print{} 1e-400
+@print{} 0
+@end example
+
+@quotation CAUTION
+Be wary of floating-point constants! When reading a floating-point
+constant from program source code, @command{gawk} uses the default
+precision (that of a C @code{double}), unless overridden by an assignment
+to the special variable @code{PREC} on the command line, to store it
+internally as an MPFR number.  Changing the precision using @code{PREC}
+in the program text does @emph{not} change the precision of a constant.
+
+If you need to represent a floating-point constant at a higher precision
+than the default and cannot use a command-line assignment to @code{PREC},
+you should either specify the constant as a string, or as a rational
+number, whenever possible. The following example illustrates the
+differences among various ways to print a floating-point constant:
+
+@example
+$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 0.1) @}'}
+@print{} 0.1000000000000000055511151
+$ @kbd{gawk -M -v PREC=113 'BEGIN @{ printf("%0.25f\n", 0.1) @}'}
+@print{} 0.1000000000000000000000000
+$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", "0.1") @}'}
+@print{} 0.1000000000000000000000000
+$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 1/10) @}'}
+@print{} 0.1000000000000000000000000
+@end example
+@end quotation
+
+@node Setting the rounding mode
+@subsection Setting the Rounding Mode
+
+@cindex @code{ROUNDMODE} variable
+The @code{ROUNDMODE} variable provides
+program-level control over the rounding mode.
+The correspondence between @code{ROUNDMODE} and the IEEE
+rounding modes is shown in @ref{table-gawk-rounding-modes}.
+
+@float Table,table-gawk-rounding-modes
+@caption{@command{gawk} rounding modes}
+@multitable @columnfractions .45 .30 .25
+@headitem Rounding mode @tab IEEE name @tab @code{ROUNDMODE}
+@item Round to nearest, ties to even @tab @code{roundTiesToEven} @tab @code{"N"} or @code{"n"}
+@item Round toward positive infinity @tab @code{roundTowardPositive} @tab @code{"U"} or @code{"u"}
+@item Round toward negative infinity @tab @code{roundTowardNegative} @tab @code{"D"} or @code{"d"}
+@item Round toward zero @tab @code{roundTowardZero} @tab @code{"Z"} or @code{"z"}
+@item Round away from zero @tab @tab @code{"A"} or @code{"a"}
+@end multitable
+@end float
+
+@code{ROUNDMODE} has the default value @code{"N"}, which
+selects the IEEE 754 rounding mode @code{roundTiesToEven}.
+In @ref{table-gawk-rounding-modes}, the value @code{"A"} selects
+rounding away from zero. This is only available if your version of the
+MPFR library supports it; otherwise, setting @code{ROUNDMODE} to @code{"A"}
+has no effect.
+
+The default mode @code{roundTiesToEven} is the most preferred,
+but the least intuitive. This method does the obvious thing for most values,
+by rounding them up or down to the nearest digit.
+For example, rounding 1.132 to two digits yields 1.13,
+and rounding 1.157 yields 1.16.
+
+However, when it comes to rounding a value that is exactly halfway between,
+things do not work the way you probably learned in school.
+In this case, the number is rounded to the nearest even digit.
+So rounding 0.125 to two digits rounds down to 0.12,
+but rounding 0.6875 to three digits rounds up to 0.688.
+You probably have already encountered this rounding mode when
+using @code{printf} to format floating-point numbers.
+For example:
+
+@example
+BEGIN @{
+    x = -4.5
+    for (i = 1; i < 10; i++) @{
+        x += 1.0
+        printf("%4.1f => %2.0f\n", x, x)
+    @}
+@}
+@end example
+
+@noindent
+produces the following output when run on the author's system:@footnote{It
+is possible for the output to be completely different if the
+C library in your system does not use the IEEE 754 even-rounding
+rule to round halfway cases for @code{printf}.}
+
+@example
+-3.5 => -4
+-2.5 => -2
+-1.5 => -2
+-0.5 => 0
+ 0.5 => 0
+ 1.5 => 2
+ 2.5 => 2
+ 3.5 => 4
+ 4.5 => 4
+@end example
+
+The theory behind @code{roundTiesToEven} is that it more or less evenly
+distributes upward and downward rounds of exact halves, which might
+cause any accumulating round-off error to cancel itself out. This is the
+default rounding mode for IEEE 754 computing functions and operators.
+
+@c January 2018. Thanks to nethox@gmail.com for the example.
+@sidebar Rounding Modes and Conversion
+It's important to understand that, along with @code{CONVFMT} and
+@code{OFMT}, the rounding mode affects how numbers are converted to strings.
+For example, consider the following program:
+
+@example
+BEGIN @{
+    pi = 3.1416
+    OFMT = "%.f"        # Print value as integer
+    print pi            # ROUNDMODE = "N" by default.
+    ROUNDMODE = "U"     # Now change ROUNDMODE
+    print pi
+@}
+@end example
+
+@noindent
+Running this program produces this output:
+
+@example
+$ @kbd{gawk -M -f roundmode.awk}
+@print{} 3
+@print{} 4
+@end example
+@end sidebar
+
+The other rounding modes are rarely used.  Rounding toward positive infinity
+(@code{roundTowardPositive}) and toward negative infinity
+(@code{roundTowardNegative}) are often used to implement interval
+arithmetic, where you adjust the rounding mode to calculate upper and
+lower bounds for the range of output. The @code{roundTowardZero} mode can
+be used for converting floating-point numbers to integers.  When rounding
+away from zero, the nearest number with magnitude greater than or equal to
+the value is selected.
+
+Some numerical analysts will tell you that your choice of rounding
+style has tremendous impact on the final outcome, and advise you to
+wait until final output for any rounding. Instead, you can often avoid
+round-off error problems by setting the precision initially to some
+value sufficiently larger than the final desired precision, so that
+the accumulation of round-off error does not influence the outcome.
+If you suspect that results from your computation are sensitive to
+accumulation of round-off error, look for a significant difference in
+output when you change the rounding mode to be sure.
+
+@node Arbitrary Precision Integers
+@section Arbitrary-Precision Integer Arithmetic with @command{gawk}
+@cindex integers, arbitrary precision
+@cindex arbitrary precision integers
+
+When given the @option{-M} option,
+@command{gawk} performs all integer arithmetic using GMP arbitrary-precision
+integers.  Any number that looks like an integer in a source
+or @value{DF} is stored as an arbitrary-precision integer.  The size
+of the integer is limited only by the available memory.  For example,
+the following computes
+@iftex
+@math{5^{4^{3^{2}}}},
+@end iftex
+@ifinfo
+5^4^3^2,
+@end ifinfo
+@ifnottex
+@ifnotinfo
+5@sup{4@sup{3@sup{2}}},
+@end ifnotinfo
+@end ifnottex
+the result of which is beyond the
+limits of ordinary hardware double-precision floating-point values:
+
+@example
+$ @kbd{gawk -M 'BEGIN @{}
+>   @kbd{x = 5^4^3^2}
+>   @kbd{print "number of digits =", length(x)}
+>   @kbd{print substr(x, 1, 20), "...", substr(x, length(x) - 19, 20)}
+> @kbd{@}'}
+@print{} number of digits = 183231
+@print{} 62060698786608744707 ... 92256259918212890625
+@end example
+
+If instead you were to compute the same value using arbitrary-precision
+floating-point values, the precision needed for correct output (using
+the formula
+@iftex
+@math{prec = 3.322 @cdot dps})
+would be @math{3.322 @cdot 183231},
+@end iftex
+@ifnottex
+@ifnotdocbook
+@samp{prec = 3.322 * dps})
+would be 3.322 x 183231,
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>)
+would be
+<emphasis>prec</emphasis> = 3.322 &sdot; 183231,
+@end docbook
+or 608693.
+
+The result from an arithmetic operation with an integer and a floating-point value
+is a floating-point value with a precision equal to the working precision.
+The following program calculates the eighth term in
+Sylvester's sequence@footnote{Weisstein, Eric W.
+@cite{Sylvester's Sequence}. From MathWorld---A Wolfram Web Resource
+@w{(@url{http://mathworld.wolfram.com/SylvestersSequence.html}).}}
+using a recurrence:
+
+@example
+$ @kbd{gawk -M 'BEGIN @{}
+>   @kbd{s = 2.0}
+>   @kbd{for (i = 1; i <= 7; i++)}
+>       @kbd{s = s * (s - 1) + 1}
+>   @kbd{print s}
+> @kbd{@}'}
+@print{} 113423713055421845118910464
+@end example
+
+The output differs from the actual number, 113,423,713,055,421,844,361,000,443,
+because the default precision of 53 bits is not enough to represent the
+floating-point results exactly. You can either increase the precision
+(100 bits is enough in this case), or replace the floating-point constant
+@samp{2.0} with an integer, to perform all computations using integer
+arithmetic to get the correct output.
+
+Sometimes @command{gawk} must implicitly convert an arbitrary-precision
+integer into an arbitrary-precision floating-point value.  This is
+primarily because the MPFR library does not always provide the relevant
+interface to process arbitrary-precision integers or mixed-mode numbers
+as needed by an operation or function.  In such a case, the precision is
+set to the minimum value necessary for exact conversion, and the working
+precision is not used for this purpose.  If this is not what you need or
+want, you can employ a subterfuge and convert the integer to floating
+point first, like this:
+
+@example
+gawk -M 'BEGIN @{ n = 13; print (n + 0.0) % 2.0 @}'
+@end example
+
+You can avoid this issue altogether by specifying the number as a floating-point value
+to begin with:
+
+@example
+gawk -M 'BEGIN @{ n = 13.0; print n % 2.0 @}'
+@end example
+
+Note that for this particular example, it is likely best
+to just use the following:
+
+@example
+gawk -M 'BEGIN @{ n = 13; print n % 2 @}'
+@end example
+
+When dividing two arbitrary precision integers with either
+@samp{/} or @samp{%}, the result is typically an arbitrary
+precision floating point value (unless the denominator evenly
+divides into the numerator).
+@ifset INTDIV
+In order to do integer division
+or remainder with arbitrary precision integers, use the built-in
+@code{intdiv0()} function (@pxref{Numeric Functions}).
+
+You can simulate the @code{intdiv0()} function in standard @command{awk}
+using this user-defined function:
+
+@example
+@c file eg/lib/intdiv0.awk
+# intdiv0 --- do integer division
+
+@c endfile
+@ignore
+@c file eg/lib/intdiv0.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# July, 2014
+#
+# Name changed from div() to intdiv()
+# April, 2015
+#
+# Changed to intdiv0()
+# April, 2016
+
+@c endfile
+
+@end ignore
+@c file eg/lib/intdiv0.awk
+function intdiv0(numerator, denominator, result)
+@{
+    split("", result)
+
+    numerator = int(numerator)
+    denominator = int(denominator)
+    result["quotient"] = int(numerator / denominator)
+    result["remainder"] = int(numerator % denominator)
+
+    return 0.0
+@}
+@c endfile
+@end example
+
+The following example program, contributed by Katie Wasserman,
+uses @code{intdiv0()} to
+compute the digits of @value{PI} to as many places as you
+choose to set:
+
+@example
+@c file eg/prog/pi.awk
+@group
+# pi.awk --- compute the digits of pi
+@c endfile
+@c endfile
+@ignore
+@c file eg/prog/pi.awk
+#
+# Katie Wasserman, katie@@wass.net
+# August 2014
+@c endfile
+@end ignore
+@c file eg/prog/pi.awk
+
+BEGIN @{
+    digits = 100000
+    two = 2 * 10 ^ digits
+@end group
+    pi = two
+    for (m = digits * 4; m > 0; --m) @{
+        d = m * 2 + 1
+        x = pi * m
+        intdiv0(x, d, result)
+        pi = result["quotient"]
+        pi = pi + two
+    @}
+    print pi
+@}
+@c endfile
+@end example
+
+@ignore
+Date: Wed, 20 Aug 2014 10:19:11 -0400
+To: arnold@skeeve.com
+From: Katherine Wasserman <katie@wass.net>
+Subject: Re: computation of digits of pi?
+
+Arnold,
+
+>The program that you sent to compute the digits of pi using div(). Is
+>that some standard algorithm that every math student knows? If so,
+>what's it called?
+
+It's not that well known but it's not that obscure either
+
+It's Euler's modification to Newton's method for calculating pi.
+
+Take a look at lines (23) - (25)  here: http://mathworld.wolfram.com/PiFormulas.htm
+
+The algorithm I wrote simply expands the multiply by 2 and works from the innermost expression outwards.  I used this to program HP calculators because it's quite easy to modify for tiny memory devices with smallish word sizes.   
+
+http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899
+
+-Katie
+@end ignore
+
+When asked about the algorithm used, Katie replied:
+
+@quotation
+It's not that well known but it's not that obscure either.
+It's Euler's modification to Newton's method for calculating pi.
+Take a look at lines (23) - (25) here: @uref{http://mathworld.wolfram.com/PiFormulas.html}.
+
+The algorithm I wrote simply expands the multiply by 2 and works from
+the innermost expression outwards.  I used this to program HP calculators
+because it's quite easy to modify for tiny memory devices with smallish
+word sizes. See
+@uref{http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899}.
+@end quotation
+@end ifset
+
+@node Checking for MPFR
+@section How To Check If MPFR Is Available
+
+@cindex MPFR, checking availability of
+@cindex checking for MPFR
+@cindex MPFR, checking for
+Occasionally, you might like to be able to check if @command{gawk}
+was invoked with the @option{-M} option, enabling arbitrary-precision
+arithmetic.  You can do so with the following function, contributed
+by Andrew Schorr:
+
+@example
+@c file eg/lib/have_mpfr.awk
+# adequate_math_precision --- return true if we have enough bits
+@c endfile
+@ignore
+@c file eg/lib/have_mpfr.awk
+#
+# Andrew Schorr, aschorr@@telemetry-investments.com, Public Domain
+# May 2017
+@c endfile
+@end ignore
+@c file eg/lib/have_mpfr.awk
+
+function adequate_math_precision(n)
+@{
+    return (1 != (1+(1/(2^(n-1)))))
+@}
+@c endfile
+@end example
+
+Here is code that invokes the function in order to check
+if arbitrary-precision arithmetic is available:
+
+@example
+BEGIN @{
+    # How many bits of mantissa precision are required
+    # for this program to function properly?
+    fpbits = 123
+
+    # We hope that we were invoked with MPFR enabled. If so, the
+    # following statement should configure calculations to our desired
+    # precision.
+    PREC = fpbits
+
+    if (! adequate_math_precision(fpbits)) @{
+        print("Error: insufficient computation precision available.\n" \
+              "Try again with the -M argument?") > "/dev/stderr"
+        # Note: you may need to set a flag here to bail out of END rules
+        exit 1
+    @}
+@}
+@end example
+
+Please be aware that @code{exit} will jump to the @code{END} rules, if present (@pxref{Exit Statement}).
+
+@node POSIX Floating Point Problems
+@section Standards Versus Existing Practice
+
+Historically, @command{awk} has converted any nonnumeric-looking string
+to the numeric value zero, when required.  Furthermore, the original
+definition of the language and the original POSIX standards specified that
+@command{awk} only understands decimal numbers (base 10), and not octal
+(base 8) or hexadecimal numbers (base 16).
+
+Changes in the language of the
+2001 and 2004 POSIX standards can be interpreted to imply that @command{awk}
+should support additional features.  These features are:
+
+@itemize @value{BULLET}
+@item
+Interpretation of floating-point data values specified in hexadecimal
+notation (e.g., @code{0xDEADBEEF}). (Note: data values, @emph{not}
+source code constants.)
+
+@item
+Support for the special IEEE 754 floating-point values ``not a number''
+(NaN), positive infinity (``inf''), and negative infinity (``@minus{}inf'').
+In particular, the format for these values is as specified by the ISO 1999
+C standard, which ignores case and can allow implementation-dependent additional
+characters after the @samp{nan} and allow either @samp{inf} or @samp{infinity}.
+@end itemize
+
+The first problem is that both of these are clear changes to historical
+practice:
+
+@itemize @value{BULLET}
+@item
+The @command{gawk} maintainer feels that supporting hexadecimal
+floating-point values, in particular, is ugly, and was never intended by the
+original designers to be part of the language.
+
+@item
+Allowing completely alphabetic strings to have valid numeric
+values is also a very severe departure from historical practice.
+@end itemize
+
+The second problem is that the @command{gawk} maintainer feels that this
+interpretation of the standard, which required a certain amount of
+``language lawyering'' to arrive at in the first place, was not even
+intended by the standard developers.  In other words, ``We see how you
+got where you are, but we don't think that that's where you want to be.''
+
+Recognizing these issues, but attempting to provide compatibility
+with the earlier versions of the standard,
+the 2008 POSIX standard added explicit wording to allow, but not require,
+that @command{awk} support hexadecimal floating-point values and
+special values for ``not a number'' and infinity.
+
+Although the @command{gawk} maintainer continues to feel that
+providing those features is inadvisable,
+nevertheless, on systems that support IEEE floating point, it seems
+reasonable to provide @emph{some} way to support NaN and infinity values.
+The solution implemented in @command{gawk} is as follows:
+
+@itemize @value{BULLET}
+@item
+With the @option{--posix} command-line option, @command{gawk} becomes
+``hands off.'' String values are passed directly to the system library's
+@code{strtod()} function, and if it successfully returns a numeric value,
+that is what's used.@footnote{You asked for it, you got it.}
+By definition, the results are not portable across
+different systems.  They are also a little surprising:
+
+@example
+$ @kbd{echo nanny | gawk --posix '@{ print $1 + 0 @}'}
+@print{} nan
+$ @kbd{echo 0xDeadBeef | gawk --posix '@{ print $1 + 0 @}'}
+@print{} 3735928559
+@end example
+
+@item
+Without @option{--posix}, @command{gawk} interprets the four string values
+@samp{+inf},
+@samp{-inf},
+@samp{+nan},
+and
+@samp{-nan}
+specially, producing the corresponding special numeric values.
+The leading sign acts a signal to @command{gawk} (and the user)
+that the value is really numeric.  Hexadecimal floating point is
+not supported (unless you also use @option{--non-decimal-data},
+which is @emph{not} recommended). For example:
+
+@example
+$ @kbd{echo nanny | gawk '@{ print $1 + 0 @}'}
+@print{} 0
+$ @kbd{echo +nan | gawk '@{ print $1 + 0 @}'}
+@print{} +nan
+$ @kbd{echo 0xDeadBeef | gawk '@{ print $1 + 0 @}'}
+@print{} 0
+@end example
+
+@command{gawk} ignores case in the four special values.
+Thus, @samp{+nan} and @samp{+NaN} are the same.
+@end itemize
+
+Besides handling input, @command{gawk} also needs to print ``correct'' values on
+output when a value is either NaN or infinity. Starting with @value{PVERSION}
+4.2.2, for such values @command{gawk} prints one of the four strings
+just described: @samp{+inf}, @samp{-inf}, @samp{+nan}, or @samp{-nan}.
+Similarly, in POSIX mode, @command{gawk} prints the result of
+the system's C @code{printf()} function using the @code{%g} format string
+for the value, whatever that may be.
+
+@node Floating point summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+Most computer arithmetic is done using either integers or floating-point
+values.  Standard @command{awk} uses double-precision
+floating-point values.
+
+@item
+In the early 1990s Barbie mistakenly said, ``Math class is tough!''
+Although math isn't tough, floating-point arithmetic isn't the same
+as pencil-and-paper math, and care must be taken:
+
+@c nested list
+@itemize @value{MINUS}
+@item
+Not all numbers can be represented exactly.
+
+@item
+Comparing values should use a delta, instead of being done directly
+with @samp{==} and @samp{!=}.
+
+@item
+Errors accumulate.
+
+@item
+Operations are not always truly associative or distributive.
+@end itemize
+
+@item
+Increasing the accuracy can help, but it is not a panacea.
+
+@item
+Often, increasing the accuracy and then rounding to the desired
+number of digits produces reasonable results.
+
+@item
+Use @option{-M} (or @option{--bignum}) to enable MPFR
+arithmetic. Use @code{PREC} to set the precision in bits, and
+@code{ROUNDMODE} to set the IEEE 754 rounding mode.
+
+@item
+With @option{-M}, @command{gawk} performs
+arbitrary-precision integer arithmetic using the GMP library.
+This is faster and more space-efficient than using MPFR for
+the same calculations.
+
+@item
+There are several areas with respect to floating-point
+numbers where @command{gawk} disagrees with the POSIX standard.
+It pays to be aware of them.
+
+@item
+Overall, there is no need to be unduly suspicious about the results from
+floating-point arithmetic. The lesson to remember is that floating-point
+arithmetic is always more complex than arithmetic using pencil and
+paper. In order to take advantage of the power of floating-point arithmetic,
+you need to know its limitations and work within them. For most casual
+use of floating-point arithmetic, you will often get the expected result
+if you simply round the display of your final results to the correct number
+of significant decimal digits.
+
+@item
+As general advice, avoid presenting numerical data in a manner that
+implies better precision than is actually the case.
+
+@end itemize
+
+@node Dynamic Extensions
+@chapter Writing Extensions for @command{gawk}
+@cindex dynamically loaded extensions
+
+It is possible to add new functions written in C or C++ to @command{gawk} using
+dynamically loaded libraries. This facility is available on systems
+that support the C @code{dlopen()} and @code{dlsym()}
+functions.  This @value{CHAPTER} describes how to create extensions
+using code written in C or C++.
+
+If you don't know anything about C programming, you can safely skip this
+@value{CHAPTER}, although you may wish to review the documentation on the
+extensions that come with @command{gawk} (@pxref{Extension Samples}),
+and the information on the @code{gawkextlib} project (@pxref{gawkextlib}).
+The sample extensions are automatically built and installed when
+@command{gawk} is.
+
+@quotation NOTE
+When @option{--sandbox} is specified, extensions are disabled
+(@pxref{Options}).
+@end quotation
+
+@menu
+* Extension Intro::             What is an extension.
+* Plugin License::              A note about licensing.
+* Extension Mechanism Outline:: An outline of how it works.
+* Extension API Description::   A full description of the API.
+* Finding Extensions::          How @command{gawk} finds compiled extensions.
+* Extension Example::           Example C code for an extension.
+* Extension Samples::           The sample extensions that ship with
+                                @command{gawk}.
+* gawkextlib::                  The @code{gawkextlib} project.
+* Extension summary::           Extension summary.
+* Extension Exercises::         Exercises.
+@end menu
+
+@node Extension Intro
+@section Introduction
+
+@cindex plug-in
+An @dfn{extension} (sometimes called a @dfn{plug-in}) is a piece of
+external compiled code that @command{gawk} can load at runtime to
+provide additional functionality, over and above the built-in capabilities
+described in the rest of this @value{DOCUMENT}.
+
+Extensions are useful because they allow you (of course) to extend
+@command{gawk}'s functionality. For example, they can provide access to
+system calls (such as @code{chdir()} to change directory) and to other
+C library routines that could be of use.  As with most software,
+``the sky is the limit''; if you can imagine something that you might
+want to do and can write in C or C++, you can write an extension to do it!
+
+Extensions are written in C or C++, using the @dfn{application programming
+interface} (API) defined for this purpose by the @command{gawk}
+developers.  The rest of this @value{CHAPTER} explains
+the facilities that the API provides and how to use
+them, and presents a small example extension.  In addition, it documents
+the sample extensions included in the @command{gawk} distribution
+and describes the @code{gawkextlib} project.
+@ifclear FOR_PRINT
+@xref{Extension Design}, for a discussion of the extension mechanism
+goals and design.
+@end ifclear
+@ifset FOR_PRINT
+See @uref{https://www.gnu.org/software/gawk/manual/html_node/Extension-Design.html}
+for a discussion of the extension mechanism
+goals and design.
+@end ifset
+
+@node Plugin License
+@section Extension Licensing
+
+Every dynamic extension must be distributed under a license that is
+compatible with the GNU GPL (@pxref{Copying}).
+
+In order for the extension to tell @command{gawk} that it is
+properly licensed, the extension must define the global symbol
+@code{plugin_is_GPL_compatible}.  If this symbol does not exist,
+@command{gawk} emits a fatal error and exits when it tries to load
+your extension.
+
+The declared type of the symbol should be @code{int}.  It does not need
+to be in any allocated section, though.  The code merely asserts that
+the symbol exists in the global scope.  Something like this is enough:
+
+@example
+int plugin_is_GPL_compatible;
+@end example
+
+@node Extension Mechanism Outline
+@section How It Works at a High Level
+
+Communication between
+@command{gawk} and an extension is two-way.  First, when an extension
+is loaded, @command{gawk} passes it a pointer to a @code{struct} whose fields are
+function pointers.
+@ifnotdocbook
+This is shown in @ref{figure-load-extension}.
+@end ifnotdocbook
+@ifdocbook
+This is shown in @inlineraw{docbook, <xref linkend="figure-load-extension"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-load-extension
+@caption{Loading the extension}
+@center @image{api-figure1, , , Loading the extension}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-load-extension" float="0">
+<title>Loading the extension</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="api-figure1.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+The extension can call functions inside @command{gawk} through these
+function pointers, at runtime, without needing (link-time) access
+to @command{gawk}'s symbols.  One of these function pointers is to a
+function for ``registering'' new functions.
+@ifnotdocbook
+This is shown in @ref{figure-register-new-function}.
+@end ifnotdocbook
+@ifdocbook
+This is shown in @inlineraw{docbook, <xref linkend="figure-register-new-function"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-register-new-function
+@caption{Registering a new function}
+@center @image{api-figure2, , , Registering a new Function}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-register-new-function" float="0">
+<title>Registering a new function</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="api-figure2.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+In the other direction, the extension registers its new functions
+with @command{gawk} by passing function pointers to the functions that
+provide the new feature (@code{do_chdir()}, for example).  @command{gawk}
+associates the function pointer with a name and can then call it, using a
+defined calling convention.
+@ifnotdocbook
+This is shown in @ref{figure-call-new-function}.
+@end ifnotdocbook
+@ifdocbook
+This is shown in @inlineraw{docbook, <xref linkend="figure-call-new-function"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-call-new-function
+@caption{Calling the new function}
+@center @image{api-figure3, , , Calling the new function}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-call-new-function" float="0">
+<title>Calling the new function</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="api-figure3.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+The @code{do_@var{xxx}()} function, in turn, then uses the function
+pointers in the API @code{struct} to do its work, such as updating
+variables or arrays, printing messages, setting @code{ERRNO}, and so on.
+
+Convenience macros make calling through the function pointers look
+like regular function calls so that extension code is quite readable
+and understandable.
+
+Although all of this sounds somewhat complicated, the result is that
+extension code is quite straightforward to write and to read. You can
+see this in the sample extension @file{filefuncs.c} (@pxref{Extension
+Example}) and also in the @file{testext.c} code for testing the APIs.
+
+Some other bits and pieces:
+
+@itemize @value{BULLET}
+@item
+The API provides access to @command{gawk}'s @code{do_@var{xxx}} values,
+reflecting command-line options, like @code{do_lint}, @code{do_profiling},
+and so on (@pxref{Extension API Variables}).
+These are informational: an extension cannot affect their values
+inside @command{gawk}.  In addition, attempting to assign to them
+produces a compile-time error.
+
+@item
+The API also provides major and minor version numbers, so that an
+extension can check if the @command{gawk} it is loaded with supports the
+facilities it was compiled with.  (Version mismatches ``shouldn't''
+happen, but we all know how @emph{that} goes.)
+@xref{Extension Versioning} for details.
+@end itemize
+
+@node Extension API Description
+@section API Description
+@cindex extension API
+
+C or C++ code for an extension must include the header file
+@file{gawkapi.h}, which declares the functions and defines the data
+types used to communicate with @command{gawk}.
+This (rather large) @value{SECTION} describes the API in detail.
+
+@menu
+* Extension API Functions Introduction:: Introduction to the API functions.
+* General Data Types::                   The data types.
+* Memory Allocation Functions::          Functions for allocating memory.
+* Constructor Functions::                Functions for creating values.
+* Registration Functions::               Functions to register things with
+                                         @command{gawk}.
+* Printing Messages::                    Functions for printing messages.
+* Updating @code{ERRNO}::                Functions for updating @code{ERRNO}.
+* Requesting Values::                    How to get a value.
+* Accessing Parameters::                 Functions for accessing parameters.
+* Symbol Table Access::                  Functions for accessing global
+                                         variables.
+* Array Manipulation::                   Functions for working with arrays.
+* Redirection API::                      How to access and manipulate
+                                         redirections.
+* Extension API Variables::              Variables provided by the API.
+* Extension API Boilerplate::            Boilerplate code for using the API.
+* Changes from API V1::                  Changes from V1 of the API.
+@end menu
+
+@node Extension API Functions Introduction
+@subsection Introduction
+
+Access to facilities within @command{gawk} is achieved
+by calling through function pointers passed into your extension.
+
+API function pointers are provided for the following kinds of operations:
+
+@itemize @value{BULLET}
+@item
+Allocating, reallocating, and releasing memory.
+
+@item
+Registration functions. You may register:
+
+@c nested list
+@itemize @value{MINUS}
+@item
+Extension functions
+@item
+Exit callbacks
+@item
+A version string
+@item
+Input parsers
+@item
+Output wrappers
+@item
+Two-way processors
+@end itemize
+
+All of these are discussed in detail later in this @value{CHAPTER}.
+
+@item
+Printing fatal, warning, and ``lint'' warning messages.
+
+@item
+Updating @code{ERRNO}, or unsetting it.
+
+@item
+Accessing parameters, including converting an undefined parameter into
+an array.
+
+@item
+Symbol table access: retrieving a global variable, creating one,
+or changing one.
+
+@item
+Creating and releasing cached values; this provides an
+efficient way to use values for multiple variables and
+can be a big performance win.
+
+@item
+Manipulating arrays:
+
+@itemize @value{MINUS}
+@item
+Retrieving, adding, deleting, and modifying elements
+
+@item
+Getting the count of elements in an array
+
+@item
+Creating a new array
+
+@item
+Clearing an array
+
+@item
+Flattening an array for easy C-style looping over all its indices and elements
+@end itemize
+
+@item
+Accessing and manipulating redirections.
+
+@end itemize
+
+Some points about using the API:
+
+@itemize @value{BULLET}
+@item
+The following types, macros, and/or functions are referenced
+in @file{gawkapi.h}.  For correct use, you must therefore include the
+corresponding standard header file @emph{before} including @file{gawkapi.h}.
+The list of macros and related header files is shown in @ref{table-api-std-headers}.
+
+@float Table,table-api-std-headers
+@caption{Standard header files needed by API}
+@multitable {@code{memset()}, @code{memcpy()}} {@code{<sys/types.h>}}
+@headitem C entity @tab Header file
+@item @code{EOF} @tab @code{<stdio.h>}
+@item Values for @code{errno} @tab @code{<errno.h>}
+@item @code{FILE} @tab @code{<stdio.h>}
+@item @code{NULL} @tab @code{<stddef.h>}
+@item @code{memcpy()} @tab @code{<string.h>}
+@item @code{memset()} @tab @code{<string.h>}
+@item @code{size_t} @tab @code{<sys/types.h>}
+@item @code{struct stat} @tab @code{<sys/stat.h>}
+@end multitable
+@end float
+
+Due to portability concerns, especially to systems that are not
+fully standards-compliant, it is your responsibility
+to include the correct files in the correct way. This requirement
+is necessary in order to keep @file{gawkapi.h} clean, instead of becoming
+a portability hodge-podge as can be seen in some parts of
+the @command{gawk} source code.
+
+@item
+If your extension uses MPFR facilities, and you wish to receive such
+values from @command{gawk} and/or pass such values to it, you must include the
+@code{<mpfr.h>} header before including @code{<gawkapi.h>}.
+
+@item
+The @file{gawkapi.h} file may be included more than once without ill effect.
+Doing so, however, is poor coding practice.
+
+@item
+Although the API only uses ISO C 90 features, there is an exception; the
+``constructor'' functions use the @code{inline} keyword. If your compiler
+does not support this keyword, you should either place
+@samp{-Dinline=''} on your command line or use the GNU Autotools and include a
+@file{config.h} file in your extensions.
+
+@item
+All pointers filled in by @command{gawk} point to memory
+managed by @command{gawk} and should be treated by the extension as
+read-only.  Memory for @emph{all} strings passed into @command{gawk}
+from the extension @emph{must} come from calling one of
+@code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()},
+and is managed by @command{gawk} from then on.
+
+@item
+The API defines several simple @code{struct}s that map values as seen
+from @command{awk}.  A value can be a @code{double}, a string, or an
+array (as in multidimensional arrays, or when creating a new array).
+
+String values maintain both pointer and length, because embedded @sc{nul}
+characters are allowed.
+
+@quotation NOTE
+By intent, @command{gawk} maintains strings using the current multibyte
+encoding (as defined by @env{LC_@var{xxx}} environment variables)
+and not using wide characters.  This matches how @command{gawk} stores
+strings internally and also how characters are likely to be input into
+and output from files.
+@end quotation
+
+@quotation NOTE
+String values passed to an extension by @command{gawk} are always
+@sc{nul}-terminated.  Thus it is safe to pass such string values to
+standard library and system routines. However, because @command{gawk}
+allows embedded @sc{nul} characters in string data, before using the data
+as a regular C string, you should check that the length for that string
+passed to the extension matches the return value of @code{strlen()}
+for it.
+@end quotation
+
+@item
+When retrieving a value (such as a parameter or that of a global variable
+or array element), the extension requests a specific type (number, string,
+scalar, value cookie, array, or ``undefined'').  When the request is
+``undefined,'' the returned value will have the real underlying type.
+
+However, if the request and actual type don't match, the access function
+returns ``false'' and fills in the type of the actual value that is there,
+so that the extension can, e.g., print an error message
+(such as ``scalar passed where array expected'').
+
+@c This is documented in the header file and needs some expanding upon.
+@c The table there should be presented here
+@end itemize
+
+You may call the API functions by using the function pointers
+directly, but the interface is not so pretty. To make extension code look
+more like regular code, the @file{gawkapi.h} header file defines several
+macros that you should use in your code.  This @value{SECTION} presents
+the macros as if they were functions.
+
+@node General Data Types
+@subsection General-Purpose Data Types
+
+@cindex Robbins, Arnold
+@cindex Ramey, Chet
+@quotation
+@i{I have a true love/hate relationship with unions.}
+@author Arnold Robbins
+@end quotation
+
+@quotation
+@i{That's the thing about unions: the compiler will arrange things so they
+can accommodate both love and hate.}
+@author Chet Ramey
+@end quotation
+
+The extension API defines a number of simple types and structures for
+general-purpose use. Additional, more specialized, data structures are
+introduced in subsequent @value{SECTION}s, together with the functions
+that use them.
+
+The general-purpose types and structures are as follows:
+
+@table @code
+@item typedef void *awk_ext_id_t;
+A value of this type is received from @command{gawk} when an extension is loaded.
+That value must then be passed back to @command{gawk} as the first parameter of
+each API function.
+
+@item #define awk_const @dots{}
+This macro expands to @samp{const} when compiling an extension,
+and to nothing when compiling @command{gawk} itself.  This makes
+certain fields in the API data structures unwritable from extension code,
+while allowing @command{gawk} to use them as it needs to.
+
+@item typedef enum awk_bool @{
+@itemx @ @ @ @ awk_false = 0,
+@itemx @ @ @ @ awk_true
+@itemx @} awk_bool_t;
+A simple Boolean type.
+
+@item typedef struct awk_string @{
+@itemx @ @ @ @ char *str;@ @ @ @ @ @ /* data */
+@itemx @ @ @ @ size_t len;@ @ @ @ @ /* length thereof, in chars */
+@itemx @} awk_string_t;
+This represents a mutable string. @command{gawk}
+owns the memory pointed to if it supplied
+the value. Otherwise, it takes ownership of the memory pointed to.
+@emph{Such memory must come from calling one of the
+@code{gawk_malloc()}, @code{gawk_calloc()}, or
+@code{gawk_realloc()} functions!}
+
+As mentioned earlier, strings are maintained using the current
+multibyte encoding.
+
+@item typedef enum @{
+@itemx @ @ @ @ AWK_UNDEFINED,
+@itemx @ @ @ @ AWK_NUMBER,
+@itemx @ @ @ @ AWK_STRING,
+@itemx @ @ @ @ AWK_REGEX,
+@itemx @ @ @ @ AWK_STRNUM,
+@itemx @ @ @ @ AWK_ARRAY,
+@itemx @ @ @ @ AWK_SCALAR,@ @ @ @ @ @ @ @ @ /* opaque access to a variable */
+@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* for updating a previously created value */
+@itemx @} awk_valtype_t;
+This @code{enum} indicates the type of a value.
+It is used in the following @code{struct}.
+
+@item typedef struct awk_value @{
+@itemx @ @ @ @ awk_valtype_t   val_type;
+@itemx @ @ @ @ union @{
+@itemx @ @ @ @ @ @ @ @ awk_string_t@ @ @ @ @ @ @ s;
+@itemx @ @ @ @ @ @ @ @ awknum_t@ @ @ @ @ @ @ @ @ @ @ n;
+@itemx @ @ @ @ @ @ @ @ awk_array_t@ @ @ @ @ @ @ @ a;
+@itemx @ @ @ @ @ @ @ @ awk_scalar_t@ @ @ @ @ @ @ scl;
+@itemx @ @ @ @ @ @ @ @ awk_value_cookie_t@ vc;
+@itemx @ @ @ @ @} u;
+@itemx @} awk_value_t;
+An ``@command{awk} value.''
+The @code{val_type} member indicates what kind of value the
+@code{union} holds, and each member is of the appropriate type.
+
+@item #define str_value@ @ @ @ @ @ u.s
+@itemx #define strnum_value@ @ @ str_value
+@itemx #define regex_value@ @ @ @ str_value
+@itemx #define num_value@ @ @ @ @ @ u.n.d
+@itemx #define num_type@ @ @ @ @ @ @ u.n.type
+@itemx #define num_ptr@ @ @ @ @ @ @ @ u.n.ptr
+@itemx #define array_cookie@ @ @ u.a
+@itemx #define scalar_cookie@ @ u.scl
+@itemx #define value_cookie@ @ @ u.vc
+Using these macros makes accessing the fields of the @code{awk_value_t} more
+readable.
+
+@item enum AWK_NUMBER_TYPE @{
+@itemx @ @ @ @ AWK_NUMBER_TYPE_DOUBLE,
+@itemx @ @ @ @ AWK_NUMBER_TYPE_MPFR,
+@itemx @ @ @ @ AWK_NUMBER_TYPE_MPZ
+@itemx @};
+This @code{enum} is used in the following structure for defining the
+type of numeric value that is being worked with.  It is declared at the
+top level of the file so that it works correctly for C++ as well as for C.
+
+@item typedef struct awk_number @{
+@itemx @ @ @ @ double d;
+@itemx @ @ @ @ enum AWK_NUMBER_TYPE type;
+@itemx @ @ @ @ void *ptr;
+@itemx @} awk_number_t;
+This represents a numeric value.  Internally, @command{gawk} stores
+every number as either a C @code{double}, a GMP integer, or an MPFR
+arbitrary-precision floating-point value.  In order to allow extensions
+to also support GMP and MPFR values, numeric values are passed in this
+structure.
+
+The double-precision @code{d} element is always populated
+in data received from @command{gawk}. In addition, by examining the
+@code{type} member, an extension can determine if the @code{ptr}
+member is either a GMP integer (type @code{mpz_ptr}), or an MPFR
+floating-point value (type @code{mpfr_ptr_t}), and cast it appropriately.
+
+@item typedef void *awk_scalar_t;
+Scalars can be represented as an opaque type. These values are obtained
+from @command{gawk} and then passed back into it. This is discussed
+in a general fashion in the text following this list, and in more detail in
+@ref{Symbol table by cookie}.
+
+@item typedef void *awk_value_cookie_t;
+A ``value cookie'' is an opaque type representing a cached value.
+This is also discussed in a general fashion in the text following this list,
+and in more detail in @ref{Cached values}.
+
+@end table
+
+Scalar values in @command{awk} are numbers, strings, strnums, or typed regexps. The
+@code{awk_value_t} struct represents values.  The @code{val_type} member
+indicates what is in the @code{union}.
+
+Representing numbers is easy---the API uses a C @code{double}.  Strings
+require more work. Because @command{gawk} allows embedded @sc{nul} bytes
+in string values, a string must be represented as a pair containing a
+data pointer and length. This is the @code{awk_string_t} type.
+
+A strnum (numeric string) value is represented as a string and consists
+of user input data that appears to be numeric.
+When an extension creates a strnum value, the result is a string flagged
+as user input. Subsequent parsing by @command{gawk} then determines whether it
+looks like a number and should be treated as a strnum, or as a regular string.
+
+This is useful in cases where an extension function would like to do something
+comparable to the @code{split()} function which sets the strnum attribute
+on the array elements it creates.  For example, an extension that implements
+CSV splitting would want to use this feature. This is also useful for a
+function that retrieves a data item from a database. The PostgreSQL
+@code{PQgetvalue()} function, for example, returns a string that may be numeric
+or textual depending on the contents.
+
+Typed regexp values (@pxref{Strong Regexp Constants}) are not of
+much use to extension functions.  Extension functions can tell that
+they've received them, and create them for scalar values. Otherwise,
+they can examine the text of the regexp through @code{regex_value.str}
+and @code{regex_value.len}.
+
+Identifiers (i.e., the names of global variables) can be associated
+with either scalar values or with arrays.  In addition, @command{gawk}
+provides true arrays of arrays, where any given array element can
+itself be an array.  Discussion of arrays is delayed until
+@ref{Array Manipulation}.
+
+The various macros listed earlier make it easier to use the elements
+of the @code{union} as if they were fields in a @code{struct}; this
+is a common coding practice in C.  Such code is easier to write and to
+read, but it remains @emph{your} responsibility to make sure that
+the @code{val_type} member correctly reflects the type of the value in
+the @code{awk_value_t} struct.
+
+Conceptually, the first three members of the @code{union} (number, string,
+and array) are all that is needed for working with @command{awk} values.
+However, because the API provides routines for accessing and changing
+the value of a global scalar variable only by using the variable's name,
+there is a performance penalty: @command{gawk} must find the variable
+each time it is accessed and changed.  This turns out to be a real issue,
+not just a theoretical one.
+
+Thus, if you know that your extension will spend considerable time
+reading and/or changing the value of one or more scalar variables, you
+can obtain a @dfn{scalar cookie}@footnote{See
+@uref{http://catb.org/jargon/html/C/cookie.html, the ``cookie'' entry in the Jargon file} for a
+definition of @dfn{cookie}, and @uref{http://catb.org/jargon/html/M/magic-cookie.html,
+the ``magic cookie'' entry in the Jargon file} for a nice example.
+@ifclear FOR_PRINT
+See also the entry for ``Cookie'' in the @ref{Glossary}.
+@end ifclear
+}
+object for that variable, and then use
+the cookie for getting the variable's value or for changing the variable's
+value.
+The @code{awk_scalar_t} type holds a scalar cookie, and the
+@code{scalar_cookie} macro provides access to the value of that type
+in the @code{awk_value_t} struct.
+Given a scalar cookie, @command{gawk} can directly retrieve or
+modify the value, as required, without having to find it first.
+
+The @code{awk_value_cookie_t} type and @code{value_cookie} macro are similar.
+If you know that you wish to
+use the same numeric or string @emph{value} for one or more variables,
+you can create the value once, retaining a @dfn{value cookie} for it,
+and then pass in that value cookie whenever you wish to set the value of a
+variable.  This saves storage space within the running @command{gawk}
+process and reduces the time needed to create the value.
+
+@node Memory Allocation Functions
+@subsection Memory Allocation Functions and Convenience Macros
+@cindex allocating memory for extensions
+@cindex extensions, allocating memory
+@cindex memory, allocating for extensions
+
+The API provides a number of @dfn{memory allocation} functions for
+allocating memory that can be passed to @command{gawk}, as well as a number of
+convenience macros.
+This @value{SUBSECTION} presents them all as function prototypes, in
+the way that extension code would use them:
+
+@table @code
+@item void *gawk_malloc(size_t size);
+Call the correct version of @code{malloc()} to allocate storage that may
+be passed to @command{gawk}.
+
+@item void *gawk_calloc(size_t nmemb, size_t size);
+Call the correct version of @code{calloc()} to allocate storage that may
+be passed to @command{gawk}.
+
+@item void *gawk_realloc(void *ptr, size_t size);
+Call the correct version of @code{realloc()} to allocate storage that may
+be passed to @command{gawk}.
+
+@item void gawk_free(void *ptr);
+Call the correct version of @code{free()} to release storage that was
+allocated with @code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}.
+@end table
+
+The API has to provide these functions because it is possible
+for an extension to be compiled and linked against a different
+version of the C library than was used for the @command{gawk}
+executable.@footnote{This is more common on MS-Windows systems, but it
+can happen on Unix-like systems as well.} If @command{gawk} were
+to use its version of @code{free()} when the memory came from an
+unrelated version of @code{malloc()}, unexpected behavior would
+likely result.
+
+Three convenience macros may be used for allocating storage
+from @code{gawk_malloc()}, @code{gawk_calloc}, and
+@code{gawk_realloc()}. If the allocation fails, they cause @command{gawk}
+to exit with a fatal error message.  They should be used as if they were
+procedure calls that do not return a value:
+
+@table @code
+@item #define emalloc(pointer, type, size, message) @dots{}
+The arguments to this macro are as follows:
+
+@c nested table
+@table @code
+@item pointer
+The pointer variable to point at the allocated storage.
+
+@item type
+The type of the pointer variable.  This is used to create a cast for
+the call to @code{gawk_malloc()}.
+
+@item size
+The total number of bytes to be allocated.
+
+@item message
+A message to be prefixed to the fatal error message. Typically this is the name
+of the function using the macro.
+@end table
+
+@noindent
+For example, you might allocate a string value like so:
+
+@example
+@group
+awk_value_t result;
+char *message;
+const char greet[] = "Don't Panic!";
+
+emalloc(message, char *, sizeof(greet), "myfunc");
+strcpy(message, greet);
+make_malloced_string(message, strlen(message), & result);
+@end group
+@end example
+
+@sp 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()}.
+The arguments are the same as for the @code{emalloc()} macro, but this
+macro guarantees that the memory returned is initialized to zero.
+
+@item #define erealloc(pointer, type, size, message) @dots{}
+This is like @code{emalloc()}, but it calls @code{gawk_realloc()}
+instead of @code{gawk_malloc()}.
+The arguments are the same as for the @code{emalloc()} macro.
+@end table
+
+Two additional functions allocate MPFR and GMP objects for use
+by extension functions that need to create and then return such
+values:
+
+@table @code
+@item void *get_mpfr_ptr();
+Allocate and initialize an MPFR object and return a pointer to it.
+If the allocation fails, @command{gawk} exits with a fatal
+``out of memory'' error.  If @command{gawk} was compiled without
+MPFR support, calling this function causes a fatal error.
+
+@item void *get_mpz_ptr();
+Allocate and initialize a GMP object and return a pointer to it.
+If the allocation fails, @command{gawk} exits with a fatal
+``out of memory'' error.  If @command{gawk} was compiled without
+MPFR support, calling this function causes a fatal error.
+@end table
+
+Both of these functions return @samp{void *}, since the @file{gawkapi.h}
+header file should not have dependency upon @code{<mpfr.h>} (and @code{<gmp.h>},
+which is included from @code{<mpfr.h>}).  The actual return values are of
+types @code{mpfr_ptr} and @code{mpz_ptr} respectively, and you should cast
+the return values appropriately before assigning the results to variables
+of the correct types.
+
+@node Constructor Functions
+@subsection Constructor Functions
+
+The API provides a number of @dfn{constructor} functions for creating
+string and numeric values, as well as a number of convenience macros.
+This @value{SUBSECTION} presents them all as function prototypes, in
+the way that extension code would use them:
+
+@table @code
+@item static inline awk_value_t *
+@itemx make_const_string(const char *string, size_t length, awk_value_t *result);
+This function creates a string value in the @code{awk_value_t} variable
+pointed to by @code{result}. It expects @code{string} to be a C string constant
+(or other string data), and automatically creates a @emph{copy} of the data
+for storage in @code{result}. It returns @code{result}.
+
+@item static inline awk_value_t *
+@itemx make_malloced_string(const char *string, size_t length, awk_value_t *result);
+This function creates a string value in the @code{awk_value_t} variable
+pointed to by @code{result}. It expects @code{string} to be a @samp{char *}
+value pointing to data previously obtained from @code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}. The idea here
+is that the data is passed directly to @command{gawk}, which assumes
+responsibility for it. It returns @code{result}.
+
+@item static inline awk_value_t *
+@itemx make_null_string(awk_value_t *result);
+This specialized function creates a null string (the ``undefined'' value)
+in the @code{awk_value_t} variable pointed to by @code{result}.
+It returns @code{result}.
+
+@item static inline awk_value_t *
+@itemx make_number(double num, awk_value_t *result);
+This function simply creates a numeric value in the @code{awk_value_t} variable
+pointed to by @code{result}.
+
+@item static inline awk_value_t *
+@itemx make_number_mpz(void *mpz, awk_value_t *result);
+This function creates a GMP number value in @code{result}.
+The @code{mpz} must be from a call to @code{get_mpz_ptr()}
+(and thus be of real underlying type @code{mpz_ptr}).
+@command{gawk} takes ownership of this memory.
+
+@item static inline awk_value_t *
+@itemx make_number_mpfr(void *mpfr, awk_value_t *result);
+This function creates an MPFR number value in @code{result}.
+The @code{mpfr} must be from a call to @code{get_mpfr_ptr()}.
+(and thus be of real underlying type @code{mpfr_ptr})
+@command{gawk} takes ownership of this memory.
+
+@item static inline awk_value_t *
+@itemx make_const_user_input(const char *string, size_t length, awk_value_t *result);
+This function is identical to @code{make_const_string()}, but the string is
+flagged as user input that should be treated as a strnum value if the contents
+of the string are numeric.
+
+@item static inline awk_value_t *
+@itemx make_malloced_user_input(const char *string, size_t length, awk_value_t *result);
+This function is identical to @code{make_malloced_string()}, but the string is
+flagged as user input that should be treated as a strnum value if the contents
+of the string are numeric.
+
+@item static inline awk_value_t *
+@itemx make_const_regex(const char *string, size_t length, awk_value_t *result);
+This function creates a strongly typed regexp value by allocating a copy of the string.
+@code{string} is the regular expression of length @code{len}.
+
+@item static inline awk_value_t *
+@itemx make_malloced_regex(const char *string, size_t length, awk_value_t *result);
+This function creates a strongly typed regexp value.  @code{string} is
+the regular expression of length @code{len}.  It expects @code{string}
+to be a @samp{char *} value pointing to data previously obtained from
+@code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}.
+
+@end table
+
+@node Registration Functions
+@subsection Registration Functions
+@cindex register extension
+@cindex extension registration
+
+This @value{SECTION} describes the API functions for
+registering parts of your extension with @command{gawk}.
+
+@menu
+* Extension Functions::         Registering extension functions.
+* Exit Callback Functions::     Registering an exit callback.
+* Extension Version String::    Registering a version string.
+* Input Parsers::               Registering an input parser.
+* Output Wrappers::             Registering an output wrapper.
+* Two-way processors::          Registering a two-way processor.
+@end menu
+
+@node Extension Functions
+@subsubsection Registering An Extension Function
+
+Extension functions are described by the following record:
+
+@example
+@group
+typedef struct awk_ext_func @{
+@ @ @ @ const char *name;
+@ @ @ @ awk_value_t *(*const function)(int num_actual_args,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
+@ @ @ @ const size_t max_expected_args;
+@ @ @ @ const size_t min_required_args;
+@ @ @ @ awk_bool_t suppress_lint;
+@ @ @ @ void *data;        /* opaque pointer to any extra state */
+@} awk_ext_func_t;
+@end group
+@end example
+
+The fields are:
+
+@table @code
+@item const char *name;
+The name of the new function.
+@command{awk}-level code calls the function by this name.
+This is a regular C string.
+
+Function names must obey the rules for @command{awk}
+identifiers. That is, they must begin with either an English letter
+or an underscore, which may be followed by any number of
+letters, digits, and underscores.
+Letter case in function names is significant.
+
+@item awk_value_t *(*const function)(int num_actual_args,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
+This is a pointer to the C function that provides the extension's
+functionality.
+The function must fill in @code{*result} with either a number,
+a string, or a regexp.
+@command{gawk} takes ownership of any string memory.
+As mentioned earlier, string memory @emph{must} come from one of
+@code{gawk_malloc()}, @code{gawk_calloc()}, or @code{gawk_realloc()}.
+
+The @code{num_actual_args} argument tells the C function how many
+actual parameters were passed from the calling @command{awk} code.
+
+The @code{finfo} parameter is a pointer to the @code{awk_ext_func_t} for
+this function. The called function may access data within it as desired, or not.
+
+The function must return the value of @code{result}.
+This is for the convenience of the calling code inside @command{gawk}.
+
+@item const size_t max_expected_args;
+This is the maximum number of arguments the function expects to receive.
+If called with more arguments than this, and if lint checking has
+been enabled, then @command{gawk} prints a warning message.  For more
+information, see the entry for @code{suppress_lint}, later in this list.
+
+@item const size_t min_required_args;
+This is the minimum number of arguments the function expects to receive.
+If called with fewer arguments, @command{gawk} prints a fatal error
+message and exits.
+
+@item awk_bool_t suppress_lint;
+This flag tells @command{gawk} not to print a lint message if lint
+checking has been enabled and if more arguments were supplied in the call
+than expected.  An extension function can tell if @command{gawk} already
+printed at least one such message by checking if @samp{num_actual_args >
+finfo->max_expected_args}.  If so, and the function does not want more
+lint messages to be printed, it should set @code{finfo->suppress_lint}
+to @code{awk_true}.
+
+@item void *data;
+This is an opaque pointer to any data that an extension function may
+wish to have available when called.  Passing the @code{awk_ext_func_t}
+structure to the extension function, and having this pointer available
+in it enable writing a single C or C++ function that implements multiple
+@command{awk}-level extension functions.
+@end table
+
+Once you have a record representing your extension function, you register
+it with @command{gawk} using this API function:
+
+@table @code
+@item awk_bool_t add_ext_func(const char *name_space, awk_ext_func_t *func);
+This function returns true upon success, false otherwise.
+The @code{name_space} parameter is the namespace in which to place
+the function (@pxref{Namespaces}).
+Use an empty string (@code{""}) or @code{"awk"} to place
+the function in the default @code{awk} namespace.
+The @code{func} pointer is the address of a
+@code{struct} representing your function, as just described.
+
+@command{gawk} does not modify what @code{func} points to, but the
+extension function itself receives this pointer and can modify what it
+points to, thus it is purposely not declared to be @code{const}.
+@end table
+
+The combination of @code{min_required_args}, @code{max_expected_args},
+and @code{suppress_lint} may be confusing. Here is how you should
+set things up.
+
+@table @asis
+@item Any number of arguments is valid
+Set @code{min_required_args} and @code{max_expected_args} to zero and
+set @code{suppress_lint} to @code{awk_true}.
+
+@item A minimum number of arguments is required, no limit on maximum number of arguments
+Set @code{min_required_args} to the minimum required. Set
+@code{max_expected_args} to zero and
+set @code{suppress_lint} to @code{awk_true}.
+
+@item A minimum number of arguments is required, a maximum number is expected
+Set @code{min_required_args} to the minimum required. Set
+@code{max_expected_args} to the maximum expected.
+Set @code{suppress_lint} to @code{awk_false}.
+
+@item A minimum number of arguments is required, and no more than a maximum is allowed
+Set @code{min_required_args} to the minimum required. Set
+@code{max_expected_args} to the maximum expected.
+Set @code{suppress_lint} to @code{awk_false}.
+In your extension function, check that @code{num_actual_args} does not
+exceed @code{f->max_expected_args}. If it does, issue a fatal error message.
+@end table
+
+@node Exit Callback Functions
+@subsubsection Registering An Exit Callback Function
+
+An @dfn{exit callback} function is a function that
+@command{gawk} calls before it exits.
+Such functions are useful if you have general ``cleanup'' tasks
+that should be performed in your extension (such as closing database
+connections or other resource deallocations).
+You can register such
+a function with @command{gawk} using the following function:
+
+@table @code
+@item void awk_atexit(void (*funcp)(void *data, int exit_status),
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ void *arg0);
+The parameters are:
+
+@c nested table
+@table @code
+@item funcp
+A pointer to the function to be called before @command{gawk} exits. The @code{data}
+parameter will be the original value of @code{arg0}.
+The @code{exit_status} parameter is the exit status value that
+@command{gawk} intends to pass to the @code{exit()} system call.
+
+@item arg0
+A pointer to private data that @command{gawk} saves in order to pass to
+the function pointed to by @code{funcp}.
+@end table
+@end table
+
+Exit callback functions are called in last-in, first-out (LIFO)
+order---that is, in the reverse order in which they are registered with
+@command{gawk}.
+
+@node Extension Version String
+@subsubsection Registering An Extension Version String
+
+You can register a version string that indicates the name and
+version of your extension with @command{gawk}, as follows:
+
+@table @code
+@item void register_ext_version(const char *version);
+Register the string pointed to by @code{version} with @command{gawk}.
+Note that @command{gawk} does @emph{not} copy the @code{version} string, so
+it should not be changed.
+@end table
+
+@command{gawk} prints all registered extension version strings when it
+is invoked with the @option{--version} option.
+
+@node Input Parsers
+@subsubsection Customized Input Parsers
+@cindex customized input parser
+
+By default, @command{gawk} reads text files as its input. It uses the value
+of @code{RS} to find the end of the record, and then uses @code{FS}
+(or @code{FIELDWIDTHS} or @code{FPAT}) to split it into fields (@pxref{Reading Files}).
+Additionally, it sets the value of @code{RT} (@pxref{Built-in Variables}).
+
+If you want, you can provide your own custom input parser.  An input
+parser's job is to return a record to the @command{gawk} record-processing
+code, along with indicators for the value and length of the data to be
+used for @code{RT}, if any.
+
+To provide an input parser, you must first provide two functions
+(where @var{XXX} is a prefix name for your extension):
+
+@table @code
+@item awk_bool_t @var{XXX}_can_take_file(const awk_input_buf_t *iobuf);
+This function examines the information available in @code{iobuf}
+(which we discuss shortly).  Based on the information there, it
+decides if the input parser should be used for this file.
+If so, it should return true. Otherwise, it should return false.
+It should not change any state (variable values, etc.) within @command{gawk}.
+
+@item awk_bool_t @var{XXX}_take_control_of(awk_input_buf_t *iobuf);
+When @command{gawk} decides to hand control of the file over to the
+input parser, it calls this function.  This function in turn must fill
+in certain fields in the @code{awk_input_buf_t} structure and ensure
+that certain conditions are true.  It should then return true. If an
+error of some kind occurs, it should not fill in any fields and should
+return false; then @command{gawk} will not use the input parser.
+The details are presented shortly.
+@end table
+
+Your extension should package these functions inside an
+@code{awk_input_parser_t}, which looks like this:
+
+@example
+@group
+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;
+@end group
+@end example
+
+The fields are:
+
+@table @code
+@item const char *name;
+The name of the input parser. This is a regular C string.
+
+@item awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
+A pointer to your @code{@var{XXX}_can_take_file()} function.
+
+@item awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
+A pointer to your @code{@var{XXX}_take_control_of()} function.
+
+@item awk_const struct input_parser *awk_const next;
+This is for use by @command{gawk};
+therefore it is marked @code{awk_const} so that the extension cannot
+modify it.
+@end table
+
+The steps are as follows:
+
+@enumerate
+@item
+Create a @code{static awk_input_parser_t} variable and initialize it
+appropriately.
+
+@item
+When your extension is loaded, register your input parser with
+@command{gawk} using the @code{register_input_parser()} API function
+(described next).
+@end enumerate
+
+An @code{awk_input_buf_t} looks like this:
+
+@example
+typedef struct awk_input @{
+    const char *name;       /* filename */
+    int fd;                 /* file descriptor */
+#define INVALID_HANDLE (-1)
+    void *opaque;           /* private data for input parsers */
+    int (*get_record)(char **out, struct awk_input *iobuf,
+                      int *errcode, char **rt_start, size_t *rt_len,
+                      const awk_fieldwidth_info_t **field_width);
+    ssize_t (*read_func)();
+    void (*close_func)(struct awk_input *iobuf);
+    struct stat sbuf;       /* stat buf */
+@} awk_input_buf_t;
+@end example
+
+The fields can be divided into two categories: those for use (initially,
+at least) by @code{@var{XXX}_can_take_file()}, and those for use by
+@code{@var{XXX}_take_control_of()}.  The first group of fields and their uses
+are as follows:
+
+@table @code
+@item const char *name;
+The name of the file.
+
+@item int fd;
+A file descriptor for the file.  If @command{gawk} was able to
+open the file, then @code{fd} will @emph{not} be equal to
+@code{INVALID_HANDLE}. Otherwise, it will.
+
+@item struct stat sbuf;
+If the file descriptor is valid, then @command{gawk} will have filled
+in this structure via a call to the @code{fstat()} system call.
+@end table
+
+The @code{@var{XXX}_can_take_file()} function should examine these
+fields and decide if the input parser should be used for the file.
+The decision can be made based upon @command{gawk} state (the value
+of a variable defined previously by the extension and set by
+@command{awk} code), the name of the
+file, whether or not the file descriptor is valid, the information
+in the @code{struct stat}, or any combination of these factors.
+
+Once @code{@var{XXX}_can_take_file()} has returned true, and
+@command{gawk} has decided to use your input parser, it calls
+@code{@var{XXX}_take_control_of()}.  That function then fills
+either the @code{get_record} field or the @code{read_func} field in
+the @code{awk_input_buf_t}.  It must also ensure that @code{fd} is @emph{not}
+set to @code{INVALID_HANDLE}.  The following list describes the fields that
+may be filled by @code{@var{XXX}_take_control_of()}:
+
+@table @code
+@item void *opaque;
+This is used to hold any state information needed by the input parser
+for this file.  It is ``opaque'' to @command{gawk}.  The input parser
+is not required to use this pointer.
+
+@item int@ (*get_record)(char@ **out,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct@ awk_input *iobuf,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int *errcode,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ char **rt_start,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t *rt_len,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_fieldwidth_info_t **field_width);
+This function pointer should point to a function that creates the input
+records.  Said function is the core of the input parser.  Its behavior
+is described in the text following this list.
+
+@item ssize_t (*read_func)();
+This function pointer should point to a function that has the
+same behavior as the standard POSIX @code{read()} system call.
+It is an alternative to the @code{get_record} pointer.  Its behavior
+is also described in the text following this list.
+
+@item void (*close_func)(struct awk_input *iobuf);
+This function pointer should point to a function that does
+the ``teardown.'' It should release any resources allocated by
+@code{@var{XXX}_take_control_of()}.  It may also close the file. If it
+does so, it should set the @code{fd} field to @code{INVALID_HANDLE}.
+
+If @code{fd} is still not @code{INVALID_HANDLE} after the call to this
+function, @command{gawk} calls the regular @code{close()} system call.
+
+Having a ``teardown'' function is optional. If your input parser does
+not need it, do not set this field.  Then, @command{gawk} calls the
+regular @code{close()} system call on the file descriptor, so it should
+be valid.
+@end table
+
+The @code{@var{XXX}_get_record()} function does the work of creating
+input records.  The parameters are as follows:
+
+@table @code
+@item char **out
+This is a pointer to a @code{char *} variable that is set to point
+to the record.  @command{gawk} makes its own copy of the data, so
+the extension must manage this storage.
+
+@item struct awk_input *iobuf
+This is the @code{awk_input_buf_t} for the file.  The fields should be
+used for reading data (@code{fd}) and for managing private state
+(@code{opaque}), if any.
+
+@item int *errcode
+If an error occurs, @code{*errcode} should be set to an appropriate
+code from @code{<errno.h>}.
+
+@item char **rt_start
+@itemx size_t *rt_len
+If the concept of a ``record terminator'' makes sense, then
+@code{*rt_start} should be set to point to the data to be used for
+@code{RT}, and @code{*rt_len} should be set to the length of the
+data. Otherwise, @code{*rt_len} should be set to zero.
+@command{gawk} makes its own copy of this data, so the
+extension must manage this storage.
+
+@item const awk_fieldwidth_info_t **field_width
+If @code{field_width} is not @code{NULL}, then @code{*field_width} will be initialized
+to @code{NULL}, and the function may set it to point to a structure
+supplying field width information to override the default
+field parsing mechanism. Note that this structure will not
+be copied by @command{gawk}; it must persist at least until the next call
+to @code{get_record} or @code{close_func}. Note also that @code{field_width} is
+@code{NULL} when @code{getline} is assigning the results to a variable, thus
+field parsing is not needed. If the parser does set @code{*field_width},
+then @command{gawk} uses this layout to parse the input record,
+and the @code{PROCINFO["FS"]} value will be @code{"API"} while this record
+is active in @code{$0}.
+The @code{awk_fieldwidth_info_t} data structure
+is described below.
+@end table
+
+The return value is the length of the buffer pointed to by
+@code{*out}, or @code{EOF} if end-of-file was reached or an
+error occurred.
+
+It is guaranteed that @code{errcode} is a valid pointer, so there is no
+need to test for a @code{NULL} value.  @command{gawk} sets @code{*errcode}
+to zero, so there is no need to set it unless an error occurs.
+
+If an error does occur, the function should return @code{EOF} and set
+@code{*errcode} to a value greater than zero.  In that case, if @code{*errcode}
+does not equal zero, @command{gawk} automatically updates
+the @code{ERRNO} variable based on the value of @code{*errcode}.
+(In general, setting @samp{*errcode = errno} should do the right thing.)
+
+As an alternative to supplying a function that returns an input record,
+you may instead supply a function that simply reads bytes, and let
+@command{gawk} parse the data into records.  If you do so, the data
+should be returned in the multibyte encoding of the current locale.
+Such a function should follow the same behavior as the @code{read()}
+system call, and you fill in the @code{read_func} pointer with its
+address in the @code{awk_input_buf_t} structure.
+
+By default, @command{gawk} sets the @code{read_func} pointer to
+point to the @code{read()} system call. So your extension need not
+set this field explicitly.
+
+@quotation NOTE
+You must choose one method or the other: either a function that
+returns a record, or one that returns raw data.  In particular,
+if you supply a function to get a record, @command{gawk} will
+call it, and will never call the raw read function.
+@end quotation
+
+@command{gawk} ships with a sample extension that reads directories,
+returning records for each entry in a directory (@pxref{Extension
+Sample Readdir}).  You may wish to use that code as a guide for writing
+your own input parser.
+
+When writing an input parser, you should think about (and document)
+how it is expected to interact with @command{awk} code.  You may want
+it to always be called, and to take effect as appropriate (as the
+@code{readdir} extension does).  Or you may want it to take effect
+based upon the value of an @command{awk} variable, as the XML extension
+from the @code{gawkextlib} project does (@pxref{gawkextlib}).
+In the latter case, code in a @code{BEGINFILE} rule
+can look at @code{FILENAME} and @code{ERRNO} to decide whether or
+not to activate an input parser (@pxref{BEGINFILE/ENDFILE}).
+
+You register your input parser with the following function:
+
+@table @code
+@item void register_input_parser(awk_input_parser_t *input_parser);
+Register the input parser pointed to by @code{input_parser} with
+@command{gawk}.
+@end table
+
+If you would like to override the default field parsing mechanism for a given
+record, then you must populate an @code{awk_fieldwidth_info_t} structure,
+which looks like this:
+
+@example
+typedef struct @{
+        awk_bool_t     use_chars; /* false ==> use bytes */
+        size_t         nf;        /* number of fields in record (NF) */
+        struct awk_field_info @{
+                size_t skip;      /* amount to skip before field starts */
+                size_t len;       /* length of field */
+        @} fields[1];              /* actual dimension should be nf */
+@} awk_fieldwidth_info_t;
+@end example
+
+The fields are:
+
+@table @code
+@item awk_bool_t use_chars;
+Set this to @code{awk_true} if the field lengths are specified in terms
+of potentially multi-byte characters, and set it to @code{awk_false} if
+the lengths are in terms of bytes.
+Performance will be better if the values are supplied in
+terms of bytes. 
+
+@item size_t nf;
+Set this to the number of fields in the input record, i.e. @code{NF}.
+
+@item struct awk_field_info fields[nf];
+This is a variable-length array whose actual dimension should be @code{nf}.
+For each field, the @code{skip} element should be set to the number
+of characters or bytes, as controlled by the @code{use_chars} flag,
+to skip before the start of this field. The @code{len} element provides
+the length of the field. The values in @code{fields[0]} provide the information
+for @code{$1}, and so on through the @code{fields[nf-1]} element containing the information for @code{$NF}.
+@end table
+
+A convenience macro @code{awk_fieldwidth_info_size(numfields)} is provided to
+calculate the appropriate size of a variable-length 
+@code{awk_fieldwidth_info_t} structure containing @code{numfields} fields. This can
+be used as an argument to @code{malloc()} or in a union to allocate space
+statically. Please refer to the @code{readdir_test} sample extension for an
+example.
+
+@node Output Wrappers
+@subsubsection Customized Output Wrappers
+@cindex customized output wrapper
+
+@cindex output wrapper
+An @dfn{output wrapper} is the mirror image of an input parser.
+It allows an extension to take over the output to a file opened
+with the @samp{>} or @samp{>>} I/O redirection operators (@pxref{Redirection}).
+
+The output wrapper is very similar to the input parser structure:
+
+@example
+typedef struct awk_output_wrapper @{
+    const char *name;   /* name of the wrapper */
+    awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
+    awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
+    awk_const struct awk_output_wrapper *awk_const next;  /* for gawk */
+@} awk_output_wrapper_t;
+@end example
+
+The members are as follows:
+
+@table @code
+@item const char *name;
+This is the name of the output wrapper.
+
+@item awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
+This points to a function that examines the information in
+the @code{awk_output_buf_t} structure pointed to by @code{outbuf}.
+It should return true if the output wrapper wants to take over the
+file, and false otherwise.  It should not change any state (variable
+values, etc.) within @command{gawk}.
+
+@item awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
+The function pointed to by this field is called when @command{gawk}
+decides to let the output wrapper take control of the file. It should
+fill in appropriate members of the @code{awk_output_buf_t} structure,
+as described next, and return true if successful, false otherwise.
+
+@item awk_const struct output_wrapper *awk_const next;
+This is for use by @command{gawk};
+therefore it is marked @code{awk_const} so that the extension cannot
+modify it.
+@end table
+
+The @code{awk_output_buf_t} structure looks like this:
+
+@example
+typedef struct awk_output_buf @{
+    const char *name;   /* name of output file */
+    const char *mode;   /* mode argument to fopen */
+    FILE *fp;           /* stdio file pointer */
+    awk_bool_t redirected;  /* true if a wrapper is active */
+    void *opaque;       /* for use by output wrapper */
+    size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
+                FILE *fp, void *opaque);
+    int (*gawk_fflush)(FILE *fp, void *opaque);
+    int (*gawk_ferror)(FILE *fp, void *opaque);
+    int (*gawk_fclose)(FILE *fp, void *opaque);
+@} awk_output_buf_t;
+@end example
+
+Here too, your extension will define @code{@var{XXX}_can_take_file()}
+and @code{@var{XXX}_take_control_of()} functions that examine and update
+data members in the @code{awk_output_buf_t}.
+The data members are as follows:
+
+@table @code
+@item const char *name;
+The name of the output file.
+
+@item const char *mode;
+The mode string (as would be used in the second argument to @code{fopen()})
+with which the file was opened.
+
+@item FILE *fp;
+The @code{FILE} pointer from @code{<stdio.h>}. @command{gawk} opens the file
+before attempting to find an output wrapper.
+
+@item awk_bool_t redirected;
+This field must be set to true by the @code{@var{XXX}_take_control_of()} function.
+
+@item void *opaque;
+This pointer is opaque to @command{gawk}. The extension should use it to store
+a pointer to any private data associated with the file.
+
+@item size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ FILE *fp, void *opaque);
+@itemx int (*gawk_fflush)(FILE *fp, void *opaque);
+@itemx int (*gawk_ferror)(FILE *fp, void *opaque);
+@itemx int (*gawk_fclose)(FILE *fp, void *opaque);
+These pointers should be set to point to functions that perform
+the equivalent function as the @code{<stdio.h>} functions do, if appropriate.
+@command{gawk} uses these function pointers for all output.
+@command{gawk} initializes the pointers to point to internal ``pass-through''
+functions that just call the regular @code{<stdio.h>} functions, so an
+extension only needs to redefine those functions that are appropriate for
+what it does.
+@end table
+
+The @code{@var{XXX}_can_take_file()} function should make a decision based
+upon the @code{name} and @code{mode} fields, and any additional state
+(such as @command{awk} variable values) that is appropriate.
+
+When @command{gawk} calls @code{@var{XXX}_take_control_of()}, that function should fill
+in the other fields as appropriate, except for @code{fp}, which it should just
+use normally.
+
+You register your output wrapper with the following function:
+
+@table @code
+@item void register_output_wrapper(awk_output_wrapper_t *output_wrapper);
+Register the output wrapper pointed to by @code{output_wrapper} with
+@command{gawk}.
+@end table
+
+@node Two-way processors
+@subsubsection Customized Two-way Processors
+@cindex customized two-way processor
+
+A @dfn{two-way processor} combines an input parser and an output wrapper for
+two-way I/O with the @samp{|&} operator (@pxref{Redirection}).  It makes identical
+use of the @code{awk_input_parser_t} and @code{awk_output_buf_t} structures
+as described earlier.
+
+A two-way processor is represented by the following structure:
+
+@example
+typedef struct awk_two_way_processor @{
+    const char *name;   /* name of the two-way processor */
+    awk_bool_t (*can_take_two_way)(const char *name);
+    awk_bool_t (*take_control_of)(const char *name,
+                                  awk_input_buf_t *inbuf,
+                                  awk_output_buf_t *outbuf);
+    awk_const struct awk_two_way_processor *awk_const next;  /* for gawk */
+@} awk_two_way_processor_t;
+@end example
+
+The fields are as follows:
+
+@table @code
+@item const char *name;
+The name of the two-way processor.
+
+@item awk_bool_t (*can_take_two_way)(const char *name);
+The function pointed to by this field should return true if it wants to take over two-way I/O for this @value{FN}.
+It should not change any state (variable
+values, etc.) within @command{gawk}.
+
+@item awk_bool_t (*take_control_of)(const char *name,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_input_buf_t *inbuf,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_output_buf_t *outbuf);
+The function pointed to by this field should fill in the @code{awk_input_buf_t} and
+@code{awk_output_buf_t} structures pointed to by @code{inbuf} and
+@code{outbuf}, respectively.  These structures were described earlier.
+
+@item awk_const struct two_way_processor *awk_const next;
+This is for use by @command{gawk};
+therefore it is marked @code{awk_const} so that the extension cannot
+modify it.
+@end table
+
+As with the input parser and output processor, you provide
+``yes I can take this'' and ``take over for this'' functions,
+@code{@var{XXX}_can_take_two_way()} and @code{@var{XXX}_take_control_of()}.
+
+You register your two-way processor with the following function:
+
+@table @code
+@item void register_two_way_processor(awk_two_way_processor_t *two_way_processor);
+Register the two-way processor pointed to by @code{two_way_processor} with
+@command{gawk}.
+@end table
+
+@node Printing Messages
+@subsection Printing Messages
+@cindex printing messages from extensions
+@cindex messages from extensions
+
+You can print different kinds of warning messages from your
+extension, as described here.  Note that for these functions,
+you must pass in the extension ID received from @command{gawk}
+when the extension was loaded:@footnote{Because the API uses only ISO C 90
+features, it cannot make use of the ISO C 99 variadic macro feature to hide
+that parameter. More's the pity.}
+
+@table @code
+@item void fatal(awk_ext_id_t id, const char *format, ...);
+Print a message and then cause @command{gawk} to exit immediately.
+
+@item void nonfatal(awk_ext_id_t id, const char *format, ...);
+Print a nonfatal error message.
+
+@item void warning(awk_ext_id_t id, const char *format, ...);
+Print a warning message.
+
+@item void lintwarn(awk_ext_id_t id, const char *format, ...);
+Print a ``lint warning.''  Normally this is the same as printing a
+warning message, but if @command{gawk} was invoked with @samp{--lint=fatal},
+then lint warnings become fatal error messages.
+@end table
+
+All of these functions are otherwise like the C @code{printf()}
+family of functions, where the @code{format} parameter is a string
+with literal characters and formatting codes intermixed.
+
+@node Updating @code{ERRNO}
+@subsection Updating @code{ERRNO}
+
+The following functions allow you to update the @code{ERRNO}
+variable:
+
+@table @code
+@item void update_ERRNO_int(int errno_val);
+Set @code{ERRNO} to the string equivalent of the error code
+in @code{errno_val}. The value should be one of the defined
+error codes in @code{<errno.h>}, and @command{gawk} turns it
+into a (possibly translated) string using the C @code{strerror()} function.
+
+@item void update_ERRNO_string(const char *string);
+Set @code{ERRNO} directly to the string value of @code{ERRNO}.
+@command{gawk} makes a copy of the value of @code{string}.
+
+@item void unset_ERRNO(void);
+Unset @code{ERRNO}.
+@end table
+
+@node Requesting Values
+@subsection Requesting Values
+
+All of the functions that return values from @command{gawk}
+work in the same way. You pass in an @code{awk_valtype_t} value
+to indicate what kind of value you expect.  If the actual value
+matches what you requested, the function returns true and fills
+in the @code{awk_value_t} result.
+Otherwise, the function returns false, and the @code{val_type}
+member indicates the type of the actual value.  You may then
+print an error message or reissue the request for the actual
+value type, as appropriate.  This behavior is summarized in
+@ref{table-value-types-returned}.
+
+@float Table,table-value-types-returned
+@caption{API value types returned}
+@docbook
+<informaltable>
+<tgroup cols="8">
+  <colspec colname="c1"/>
+  <colspec colname="c2"/>
+  <colspec colname="c3"/>
+  <colspec colname="c4"/>
+  <colspec colname="c5"/>
+  <colspec colname="c6"/>
+  <colspec colname="c7"/>
+  <colspec colname="c8"/>
+  <spanspec spanname="hspan" namest="c3" nameend="c8" align="center"/>
+  <thead>
+    <row><entry></entry><entry spanname="hspan"><para>Type of Actual Value</para></entry></row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry><para>String</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>Regex</para></entry>
+      <entry><para>Array</para></entry>
+      <entry><para>Undefined</para></entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">String</emphasis></para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Strnum</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Number</emphasis></para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry><para><emphasis role="bold">Type</emphasis></para></entry>
+      <entry><para><emphasis role="bold">Regex</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>Regex</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry><para><emphasis role="bold">Requested</emphasis></para></entry>
+      <entry><para><emphasis role="bold">Array</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>Array</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Scalar</emphasis></para></entry>
+      <entry><para>Scalar</para></entry>
+      <entry><para>Scalar</para></entry>
+      <entry><para>Scalar</para></entry>
+      <entry><para>Scalar</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Undefined</emphasis></para></entry>
+      <entry><para>String</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>Number</para></entry>
+      <entry><para>Regex</para></entry>
+      <entry><para>Array</para></entry>
+      <entry><para>Undefined</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Value cookie</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+  </tbody>
+</tgroup>
+</informaltable>
+@end docbook
+
+@ifnotplaintext
+@ifnotdocbook
+@multitable @columnfractions .50 .50
+@headitem @tab Type of Actual Value
+@end multitable
+@c 10/2014: Thanks to Karl Berry for this bit to reduce the space:
+@tex
+\vglue-1.1\baselineskip
+@end tex
+@c @multitable @columnfractions .166 .166 .198 .15 .15 .166
+@multitable {Requested} {Undefined} {Number} {Number} {Scalar} {Regex} {Array} {Undefined}
+@headitem @tab @tab String @tab Strnum @tab Number @tab Regex @tab Array @tab Undefined
+@item @tab @b{String} @tab String @tab String @tab String @tab String @tab false @tab false
+@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false
+@item @tab @b{Number} @tab Number @tab Number @tab Number @tab false @tab false @tab false
+@item @b{Type} @tab @b{Regex} @tab false @tab false @tab false @tab Regex @tab false @tab false
+@item @b{Requested} @tab @b{Array} @tab false @tab false @tab false @tab false @tab Array @tab false
+@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false
+@item @tab @b{Undefined} @tab String @tab Strnum @tab Number @tab Regex @tab Array @tab Undefined
+@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false
+@end multitable
+@end ifnotdocbook
+@end ifnotplaintext
+@ifplaintext
+@verbatim
+                        +-------------------------------------------------------+
+                        |                   Type of Actual Value:               |
+                        +--------+--------+--------+--------+-------+-----------+
+                        | String | Strnum | Number | Regex  | Array | Undefined |
++-----------+-----------+--------+--------+--------+--------+-------+-----------+
+|           | String    | String | String | String | String | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Strnum    | false  | Strnum | Strnum | false  | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Number    | Number | Number | Number | false  | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Regex     | false  | false  | false  | Regex  | false | false     |
+|   Type    +-----------+--------+--------+--------+--------+-------+-----------+
+| Requested | Array     | false  | false  | false  | false  | Array | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Scalar    | Scalar | Scalar | Scalar | Scalar | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Undefined | String | Strnum | Number | Regex  | Array | Undefined |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Value     | false  | false  | false  | false  | false | false     |
+|           | Cookie    |        |        |        |        |       |           |
++-----------+-----------+--------+--------+--------+--------+-------+-----------+
+@end verbatim
+@end ifplaintext
+@end float
+
+@node Accessing Parameters
+@subsection Accessing and Updating Parameters
+
+Two functions give you access to the arguments (parameters)
+passed to your extension function. They are:
+
+@table @code
+@item awk_bool_t get_argument(size_t count,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+Fill in the @code{awk_value_t} structure pointed to by @code{result}
+with the @code{count}th argument.  Return true if the actual
+type matches @code{wanted}, and false otherwise.  In the latter
+case, @code{result@w{->}val_type} indicates the actual type
+(@pxref{table-value-types-returned}).  Counts are zero-based---the first
+argument is numbered zero, the second one, and so on. @code{wanted}
+indicates the type of value expected.
+
+@item awk_bool_t set_argument(size_t count, awk_array_t array);
+Convert a parameter that was undefined into an array; this provides
+call by reference for arrays.  Return false if @code{count} is too big,
+or if the argument's type is not undefined.  @xref{Array Manipulation}
+for more information on creating arrays.
+@end table
+
+@node Symbol Table Access
+@subsection Symbol Table Access
+@cindex accessing global variables from extensions
+
+Two sets of routines provide access to global variables, and one set
+allows you to create and release cached values.
+
+@menu
+* Symbol table by name::        Accessing variables by name.
+* Symbol table by cookie::      Accessing variables by ``cookie''.
+* Cached values::               Creating and using cached values.
+@end menu
+
+@node Symbol table by name
+@subsubsection Variable Access and Update by Name
+
+The following routines provide the ability to access and update
+global @command{awk}-level variables by name.  In compiler terminology,
+identifiers of different kinds are termed @dfn{symbols}, thus the ``sym''
+in the routines' names.  The data structure that stores information
+about symbols is termed a @dfn{symbol table}.
+The functions are as follows:
+
+@table @code
+@item awk_bool_t sym_lookup(const char *name,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+Fill in the @code{awk_value_t} structure pointed to by @code{result}
+with the value of the variable named by the string @code{name}, which is
+a regular C string.  @code{wanted} indicates the type of value expected.
+Return true if the actual type matches @code{wanted}, and false otherwise.
+In the latter case, @code{result->val_type} indicates the actual type
+(@pxref{table-value-types-returned}).
+
+@item awk_bool_t sym_lookup_ns(const char *name,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const char *name_space,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+This is like @code{sym_lookup()}, but the @code{name_space} parameter allows you
+to specify which namespace @code{name} is part of.  @code{name_space} cannot be
+@code{NULL}. If it is @code{""} or @code{"awk"}, then @code{name} is searched
+for in the default @code{awk} namespace.
+
+Note that @code{namespace} is a C++ keyword. For interoperability with C++,
+you should avoid using that identifier in C code.
+
+@item awk_bool_t sym_update(const char *name, awk_value_t *value);
+Update the variable named by the string @code{name}, which is a regular
+C string.  The variable is added to @command{gawk}'s symbol table
+if it is not there.  Return true if everything worked, and false otherwise.
+
+Changing types (scalar to array or vice versa) of an existing variable
+is @emph{not} allowed, nor may this routine be used to update an array.
+This routine cannot be used to update any of the predefined
+variables (such as @code{ARGC} or @code{NF}).
+
+@item awk_bool_t sym_update_ns(const char *name_space, const char *name, awk_value_t *value);
+This is like @code{sym_update()}, but the @code{name_space} parameter allows you
+to specify which namespace @code{name} is part of.  @code{name_space} cannot be
+@code{NULL}. If it is @code{""} or @code{"awk}, then @code{name} is searched
+for in the default @code{awk} namespace.
+@end table
+
+An extension can look up the value of @command{gawk}'s special variables.
+However, with the exception of the @code{PROCINFO} array, an extension
+cannot change any of those variables.
+
+When searching for or updating variables outside the @code{awk} namespace
+(@pxref{Namespaces}), function and variable names must be simple
+identifiers.@footnote{Allowing both namespace plus identifier and
+@code{foo::bar} would have been too confusing to document, and to code
+and test.} In addition, namespace names and variable and function names
+must follow the rules given in @ref{Naming Rules}.
+
+@node Symbol table by cookie
+@subsubsection Variable Access and Update by Cookie
+
+A @dfn{scalar cookie} is an opaque handle that provides access
+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}.
+
+@need 1500
+The following functions let you work with scalar cookies:
+
+@table @code
+@item awk_bool_t sym_lookup_scalar(awk_scalar_t cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+Retrieve the current value of a scalar cookie.
+Once you have obtained a scalar cookie using @code{sym_lookup()}, you can
+use this function to get its value more efficiently.
+Return false if the value cannot be retrieved.
+
+@item awk_bool_t sym_update_scalar(awk_scalar_t cookie, awk_value_t *value);
+Update the value associated with a scalar cookie.  Return false if
+the new value is not of type @code{AWK_STRING}, @code{AWK_STRNUM}, @code{AWK_REGEX}, or @code{AWK_NUMBER}.
+Here too, the predefined variables may not be updated.
+@end table
+
+It is not obvious at first glance how to work with scalar cookies or
+what their @i{raison d'@^etre} really is.  In theory, the @code{sym_lookup()}
+and @code{sym_update()} routines are all you really need to work with
+variables.  For example, you might have code that looks up the value of
+a variable, evaluates a condition, and then possibly changes the value
+of the variable based on the result of that evaluation, like so:
+
+@example
+/*  do_magic --- do something really great */
+
+static awk_value_t *
+do_magic(int nargs, awk_value_t *result)
+@{
+    awk_value_t value;
+
+    if (   sym_lookup("MAGIC_VAR", AWK_NUMBER, & value)
+        && some_condition(value.num_value)) @{
+            value.num_value += 42;
+            sym_update("MAGIC_VAR", & value);
+    @}
+
+    return make_number(0.0, result);
+@}
+@end example
+
+@noindent
+This code looks (and is) simple and straightforward. So what's the problem?
+
+Well, consider what happens if @command{awk}-level code associated
+with your extension calls the @code{magic()} function (implemented in
+C by @code{do_magic()}), once per record, while processing hundreds
+of thousands or millions of records.  The @code{MAGIC_VAR} variable is
+looked up in the symbol table once or twice per function call!
+
+The symbol table lookup is really pure overhead; it is considerably
+more efficient to get a cookie that represents the variable, and use
+that to get the variable's value and update it as needed.@footnote{The
+difference is measurable and quite real. Trust us.}
+
+Thus, the way to use cookies is as follows.  First, install
+your extension's variable in @command{gawk}'s symbol table using
+@code{sym_update()}, as usual. Then get a scalar cookie for the variable
+using @code{sym_lookup()}:
+
+@example
+@group
+static awk_scalar_t magic_var_cookie;    /* cookie for MAGIC_VAR */
+
+static void
+my_extension_init()
+@{
+    awk_value_t value;
+@end group
+
+    /* install initial value */
+    sym_update("MAGIC_VAR", make_number(42.0, & value));
+
+    /* get the cookie */
+    sym_lookup("MAGIC_VAR", AWK_SCALAR, & value);
+
+    /* save the cookie */
+    magic_var_cookie = value.scalar_cookie;
+    @dots{}
+@}
+@end example
+
+Next, use the routines in this @value{SECTION} for retrieving and updating
+the value through the cookie.  Thus, @code{do_magic()} now becomes
+something like this:
+
+@example
+/*  do_magic --- do something really great */
+
+static awk_value_t *
+do_magic(int nargs, awk_value_t *result)
+@{
+    awk_value_t value;
+
+    if (   sym_lookup_scalar(magic_var_cookie, AWK_NUMBER, & value)
+        && some_condition(value.num_value)) @{
+            value.num_value += 42;
+            sym_update_scalar(magic_var_cookie, & value);
+    @}
+    @dots{}
+
+    return make_number(0.0, result);
+@}
+@end example
+
+@quotation NOTE
+The previous code omitted error checking for
+presentation purposes.  Your extension code should be more robust
+and carefully check the return values from the API functions.
+@end quotation
+
+@node Cached values
+@subsubsection Creating and Using Cached Values
+
+The routines in this @value{SECTION} allow you to create and release
+cached values.  Like scalar cookies, in theory, cached values
+are not necessary. You can create numbers and strings using
+the functions in @ref{Constructor Functions}. You can then
+assign those values to variables using @code{sym_update()}
+or @code{sym_update_scalar()}, as you like.
+
+However, you can understand the point of cached values if you remember that
+@emph{every} string value's storage @emph{must} come from @code{gawk_malloc()},
+@code{gawk_calloc()}, or @code{gawk_realloc()}.
+If you have 20 variables, all of which have the same string value, you
+must create 20 identical copies of the string.@footnote{Numeric values
+are clearly less problematic, requiring only a C @code{double} to store.
+But of course, GMP and MPFR values @emph{do} take up more memory.}
+
+It is clearly more efficient, if possible, to create a value once, and
+then tell @command{gawk} to reuse the value for multiple variables. That
+is what the routines in this @value{SECTION} let you do.  The functions are as follows:
+
+@table @code
+@item awk_bool_t create_value(awk_value_t *value, awk_value_cookie_t *result);
+Create a cached string or numeric value from @code{value} for
+efficient later assignment.  Only values of type @code{AWK_NUMBER}, @code{AWK_REGEX}, @code{AWK_STRNUM},
+and @code{AWK_STRING} are allowed.  Any other type is rejected.
+@code{AWK_UNDEFINED} could be allowed, but doing so would result in
+inferior performance.
+
+@item awk_bool_t release_value(awk_value_cookie_t vc);
+Release the memory associated with a value cookie obtained
+from @code{create_value()}.
+@end table
+
+You use value cookies in a fashion similar to the way you use scalar cookies.
+In the extension initialization routine, you create the value cookie:
+
+@example
+static awk_value_cookie_t answer_cookie;  /* static value cookie */
+
+static void
+my_extension_init()
+@{
+    awk_value_t value;
+    char *long_string;
+    size_t long_string_len;
+
+    /* code from earlier */
+    @dots{}
+    /* @dots{} fill in long_string and long_string_len @dots{} */
+    make_malloced_string(long_string, long_string_len, & value);
+    create_value(& value, & answer_cookie);    /* create cookie */
+    @dots{}
+@}
+@end example
+
+Once the value is created, you can use it as the value of any number
+of variables:
+
+@example
+static awk_value_t *
+do_magic(int nargs, awk_value_t *result)
+@{
+    awk_value_t new_value;
+
+    @dots{}    /* as earlier */
+
+    value.val_type = AWK_VALUE_COOKIE;
+    value.value_cookie = answer_cookie;
+    sym_update("VAR1", & value);
+    sym_update("VAR2", & value);
+    @dots{}
+    sym_update("VAR100", & value);
+    @dots{}
+@}
+@end example
+
+@noindent
+Using value cookies in this way saves considerable storage, as all of
+@code{VAR1} through @code{VAR100} share the same value.
+
+You might be wondering, ``Is this sharing problematic?
+What happens if @command{awk} code assigns a new value to @code{VAR1};
+are all the others changed too?''
+
+That's a great question. The answer is that no, it's not a problem.
+Internally, @command{gawk} uses @dfn{reference-counted strings}. This means
+that many variables can share the same string value, and @command{gawk}
+keeps track of the usage.  When a variable's value changes, @command{gawk}
+simply decrements the reference count on the old value and updates
+the variable to use the new value.
+
+Finally, as part of your cleanup action (@pxref{Exit Callback Functions})
+you should release any cached values that you created, using
+@code{release_value()}.
+
+@node Array Manipulation
+@subsection Array Manipulation
+@cindex array manipulation in extensions
+@cindex extensions, array manipulation in
+
+The primary data structure@footnote{OK, the only data structure.} in @command{awk}
+is the associative array (@pxref{Arrays}).
+Extensions need to be able to manipulate @command{awk} arrays.
+The API provides a number of data structures for working with arrays,
+functions for working with individual elements, and functions for
+working with arrays as a whole. This includes the ability to
+``flatten'' an array so that it is easy for C code to traverse
+every element in an array.  The array data structures integrate
+nicely with the data structures for values to make it easy to
+both work with and create true arrays of arrays (@pxref{General Data Types}).
+
+@menu
+* Array Data Types::            Data types for working with arrays.
+* Array Functions::             Functions for working with arrays.
+* Flattening Arrays::           How to flatten arrays.
+* Creating Arrays::             How to create and populate arrays.
+@end menu
+
+@node Array Data Types
+@subsubsection Array Data Types
+
+The data types associated with arrays are as follows:
+
+@table @code
+@item typedef void *awk_array_t;
+If you request the value of an array variable, you get back an
+@code{awk_array_t} value. This value is opaque@footnote{It is also
+a ``cookie,'' but the @command{gawk} developers did not wish to overuse this
+term.} to the extension; it uniquely identifies the array but can
+only be used by passing it into API functions or receiving it from API
+functions. This is very similar to way @samp{FILE *} values are used
+with the @code{<stdio.h>} library routines.
+
+@item typedef struct awk_element @{
+@itemx @ @ @ @ /* convenience linked list pointer, not used by gawk */
+@itemx @ @ @ @ struct awk_element *next;
+@itemx @ @ @ @ enum @{
+@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DEFAULT = 0,@ @ /* set by gawk */
+@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DELETE = 1@ @ @ @ /* set by extension */
+@itemx @ @ @ @ @} flags;
+@itemx @ @ @ @ awk_value_t    index;
+@itemx @ @ @ @ awk_value_t    value;
+@itemx @} awk_element_t;
+The @code{awk_element_t} is a ``flattened''
+array element. @command{awk} produces an array of these
+inside the @code{awk_flat_array_t} (see the next item).
+Individual elements may be marked for deletion. New elements must be added
+individually, one at a time, using the separate API for that purpose.
+The fields are as follows:
+
+@c nested table
+@table @code
+@item struct awk_element *next;
+This pointer is for the convenience of extension writers.  It allows
+an extension to create a linked list of new elements that can then be
+added to an array in a loop that traverses the list.
+
+@item enum @{ @dots{} @} flags;
+A set of flag values that convey information between the extension
+and @command{gawk}.  Currently there is only one: @code{AWK_ELEMENT_DELETE}.
+Setting it causes @command{gawk} to delete the
+element from the original array upon release of the flattened array.
+
+@item index
+@itemx value
+The index and value of the element, respectively.
+@emph{All} memory pointed to by @code{index} and @code{value} belongs to @command{gawk}.
+@end table
+
+@item typedef struct awk_flat_array @{
+@itemx @ @ @ @ awk_const void *awk_const opaque1;@ @ @ @ /* for use by gawk */
+@itemx @ @ @ @ awk_const void *awk_const opaque2;@ @ @ @ /* for use by gawk */
+@itemx @ @ @ @ awk_const size_t count;@ @ @ @ @ /* how many elements */
+@itemx @ @ @ @ awk_element_t elements[1];@ @ /* will be extended */
+@itemx @} awk_flat_array_t;
+This is a flattened array. When an extension gets one of these
+from @command{gawk}, the @code{elements} array is of actual
+size @code{count}.
+The @code{opaque1} and @code{opaque2} pointers are for use by @command{gawk};
+therefore they are marked @code{awk_const} so that the extension cannot
+modify them.
+@end table
+
+@node Array Functions
+@subsubsection Array Functions
+
+The following functions relate to individual array elements:
+
+@table @code
+@item awk_bool_t get_element_count(awk_array_t a_cookie, size_t *count);
+For the array represented by @code{a_cookie}, place in @code{*count}
+the number of elements it contains. A subarray counts as a single element.
+Return false if there is an error.
+
+@item awk_bool_t get_array_element(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t *const index,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *result);
+For the array represented by @code{a_cookie}, return in @code{*result}
+the value of the element whose index is @code{index}.
+@code{wanted} specifies the type of value you wish to retrieve.
+Return false if @code{wanted} does not match the actual type or if
+@code{index} is not in the array (@pxref{table-value-types-returned}).
+
+The value for @code{index} can be numeric, in which case @command{gawk}
+converts it to a string. Using nonintegral values is possible, but
+requires that you understand how such values are converted to strings
+(@pxref{Conversion}); thus, using integral values is safest.
+
+As with @emph{all} strings passed into @command{gawk} from an extension,
+the string value of @code{index} must come from @code{gawk_malloc()},
+@code{gawk_calloc()}, or @code{gawk_realloc()}, and
+@command{gawk} releases the storage.
+
+@item awk_bool_t set_array_element(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const index,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const value);
+In the array represented by @code{a_cookie}, create or modify
+the element whose index is given by @code{index}.
+The @code{ARGV} and @code{ENVIRON} arrays may not be changed,
+although the @code{PROCINFO} array can be.
+
+@item awk_bool_t set_array_element_by_elem(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_element_t element);
+Like @code{set_array_element()}, but take the @code{index} and @code{value}
+from @code{element}. This is a convenience macro.
+
+@item awk_bool_t del_array_element(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t* const index);
+Remove the element with the given index from the array
+represented by @code{a_cookie}.
+Return true if the element was removed, or false if the element did
+not exist in the array.
+@end table
+
+The following functions relate to arrays as a whole:
+
+@table @code
+@item awk_array_t create_array(void);
+Create a new array to which elements may be added.
+@xref{Creating Arrays} for a discussion of how to
+create a new array and add elements to it.
+
+@item awk_bool_t clear_array(awk_array_t a_cookie);
+Clear the array represented by @code{a_cookie}.
+Return false if there was some kind of problem, true otherwise.
+The array remains an array, but after calling this function, it
+has no elements. This is equivalent to using the @code{delete}
+statement (@pxref{Delete}).
+
+@item awk_bool_t flatten_array_typed(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_flat_array_t **data,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t index_type,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t value_type);
+For the array represented by @code{a_cookie}, create an @code{awk_flat_array_t}
+structure and fill it in with indices and values of the requested types.
+Set the pointer whose address is passed as @code{data}
+to point to this structure.
+Return true upon success, or false otherwise.
+@ifset FOR_PRINT
+See the next @value{SECTION}
+@end ifset
+@ifclear FOR_PRINT
+@xref{Flattening Arrays},
+@end ifclear
+for a discussion of how to
+flatten an array and work with it.
+
+@item awk_bool_t flatten_array(awk_array_t a_cookie, awk_flat_array_t **data);
+For the array represented by @code{a_cookie}, create an @code{awk_flat_array_t}
+structure and fill it in with @code{AWK_STRING} indices and
+@code{AWK_UNDEFINED} values.
+This is superseded by @code{flatten_array_typed()}.
+It is provided as a macro, and remains for convenience and for source code
+compatibility with the previous version of the API.
+
+@item awk_bool_t release_flattened_array(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_flat_array_t *data);
+When done with a flattened array, release the storage using this function.
+You must pass in both the original array cookie and the address of
+the created @code{awk_flat_array_t} structure.
+The function returns true upon success, false otherwise.
+@end table
+
+@node Flattening Arrays
+@subsubsection Working With All The Elements of an Array
+
+To @dfn{flatten} an array is to create a structure that
+represents the full array in a fashion that makes it easy
+for C code to traverse the entire array.  Some of the code
+in @file{extension/testext.c} does this, and also serves
+as a nice example showing how to use the APIs.
+
+We walk through that part of the code one step at a time.
+First, the @command{gawk} script that drives the test extension:
+
+@example
+@@load "testext"
+BEGIN @{
+    n = split("blacky rusty sophie raincloud lucky", pets)
+    printf("pets has %d elements\n", length(pets))
+    ret = dump_array_and_delete("pets", "3")
+    printf("dump_array_and_delete(pets) returned %d\n", ret)
+    if ("3" in pets)
+        printf("dump_array_and_delete() did NOT remove index \"3\"!\n")
+    else
+        printf("dump_array_and_delete() did remove index \"3\"!\n")
+    print ""
+@}
+@end example
+
+@noindent
+This code creates an array with @code{split()} (@pxref{String Functions})
+and then calls @code{dump_array_and_delete()}. That function looks up
+the array whose name is passed as the first argument, and
+deletes the element at the index passed in the second argument.
+The @command{awk} code then prints the return value and checks if the element
+was indeed deleted.  Here is the C code that implements
+@code{dump_array_and_delete()}. It has been edited slightly for
+presentation.
+
+The first part declares variables, sets up the default
+return value in @code{result}, and checks that the function
+was called with the correct number of arguments:
+
+@example
+static awk_value_t *
+dump_array_and_delete(int nargs, awk_value_t *result)
+@{
+    awk_value_t value, value2, value3;
+    awk_flat_array_t *flat_array;
+    size_t count;
+    char *name;
+    int i;
+
+    assert(result != NULL);
+    make_number(0.0, result);
+
+    if (nargs != 2) @{
+        printf("dump_array_and_delete: nargs not right "
+               "(%d should be 2)\n", nargs);
+        goto out;
+    @}
+@end example
+
+The function then proceeds in steps, as follows. First, retrieve
+the name of the array, passed as the first argument, followed by
+the array itself. If either operation fails, print an
+error message and return:
+
+@example
+    /* get argument named array as flat array and print it */
+    if (get_argument(0, AWK_STRING, & value)) @{
+        name = value.str_value.str;
+        if (sym_lookup(name, AWK_ARRAY, & value2))
+            printf("dump_array_and_delete: sym_lookup of %s passed\n",
+                   name);
+        else @{
+            printf("dump_array_and_delete: sym_lookup of %s failed\n",
+                   name);
+            goto out;
+        @}
+    @} else @{
+        printf("dump_array_and_delete: get_argument(0) failed\n");
+        goto out;
+    @}
+@end example
+
+For testing purposes and to make sure that the C code sees
+the same number of elements as the @command{awk} code,
+the second step is to get the count of elements in the array
+and print it:
+
+@example
+    if (! get_element_count(value2.array_cookie, & count)) @{
+        printf("dump_array_and_delete: get_element_count failed\n");
+        goto out;
+    @}
+
+    printf("dump_array_and_delete: incoming size is %lu\n",
+           (unsigned long) count);
+@end example
+
+The third step is to actually flatten the array, and then
+to double-check that the count in the @code{awk_flat_array_t}
+is the same as the count just retrieved:
+
+@example
+    if (! flatten_array_typed(value2.array_cookie, & flat_array,
+                              AWK_STRING, AWK_UNDEFINED)) @{
+        printf("dump_array_and_delete: could not flatten array\n");
+        goto out;
+    @}
+
+    if (flat_array->count != count) @{
+        printf("dump_array_and_delete: flat_array->count (%lu)"
+               " != count (%lu)\n",
+                (unsigned long) flat_array->count,
+                (unsigned long) count);
+        goto out;
+    @}
+@end example
+
+The fourth step is to retrieve the index of the element
+to be deleted, which was passed as the second argument.
+Remember that argument counts passed to @code{get_argument()}
+are zero-based, and thus the second argument is numbered one:
+
+@example
+    if (! get_argument(1, AWK_STRING, & value3)) @{
+        printf("dump_array_and_delete: get_argument(1) failed\n");
+        goto out;
+    @}
+@end example
+
+The fifth step is where the ``real work'' is done. The function
+loops over every element in the array, printing the index and
+element values. In addition, upon finding the element with the
+index that is supposed to be deleted, the function sets the
+@code{AWK_ELEMENT_DELETE} bit in the @code{flags} field
+of the element.  When the array is released, @command{gawk}
+traverses the flattened array, and deletes any elements that
+have this flag bit set:
+
+@example
+    for (i = 0; i < flat_array->count; i++) @{
+        printf("\t%s[\"%.*s\"] = %s\n",
+            name,
+            (int) flat_array->elements[i].index.str_value.len,
+            flat_array->elements[i].index.str_value.str,
+            valrep2str(& flat_array->elements[i].value));
+
+        if (strcmp(value3.str_value.str,
+                   flat_array->elements[i].index.str_value.str) == 0) @{
+            flat_array->elements[i].flags |= AWK_ELEMENT_DELETE;
+            printf("dump_array_and_delete: marking element \"%s\" "
+                   "for deletion\n",
+                flat_array->elements[i].index.str_value.str);
+        @}
+    @}
+@end example
+
+The sixth step is to release the flattened array. This tells
+@command{gawk} that the extension is no longer using the array,
+and that it should delete any elements marked for deletion.
+@command{gawk} also frees any storage that was allocated,
+so you should not use the pointer (@code{flat_array} in this
+code) once you have called @code{release_flattened_array()}:
+
+@example
+    if (! release_flattened_array(value2.array_cookie, flat_array)) @{
+        printf("dump_array_and_delete: could not release flattened array\n");
+        goto out;
+    @}
+@end example
+
+Finally, because everything was successful, the function sets the
+return value to success, and returns:
+
+@example
+@group
+    make_number(1.0, result);
+out:
+    return result;
+@}
+@end group
+@end example
+
+Here is the output from running this part of the test:
+
+@example
+pets has 5 elements
+dump_array_and_delete: sym_lookup of pets passed
+dump_array_and_delete: incoming size is 5
+        pets["1"] = "blacky"
+        pets["2"] = "rusty"
+        pets["3"] = "sophie"
+dump_array_and_delete: marking element "3" for deletion
+        pets["4"] = "raincloud"
+        pets["5"] = "lucky"
+dump_array_and_delete(pets) returned 1
+dump_array_and_delete() did remove index "3"!
+@end example
+
+@node Creating Arrays
+@subsubsection How To Create and Populate Arrays
+
+Besides working with arrays created by @command{awk} code, you can
+create arrays and populate them as you see fit, and then @command{awk}
+code can access them and manipulate them.
+
+There are two important points about creating arrays from extension code:
+
+@itemize @value{BULLET}
+@item
+You must install a new array into @command{gawk}'s symbol
+table immediately upon creating it.  Once you have done so,
+you can then populate the array.
+
+@ignore
+Strictly speaking, this is required only
+for arrays that will have subarrays as elements; however it is
+a good idea to always do this.  This restriction may be relaxed
+in a subsequent revision of the API.
+@end ignore
+
+Similarly, if installing a new array as a subarray of an existing array,
+you must add the new array to its parent before adding any elements to it.
+
+Thus, the correct way to build an array is to work ``top down.''  Create
+the array, and immediately install it in @command{gawk}'s symbol table
+using @code{sym_update()}, or install it as an element in a previously
+existing array using @code{set_array_element()}.  We show example code shortly.
+
+@item
+Due to @command{gawk} internals, after using @code{sym_update()} to install an array
+into @command{gawk}, you have to retrieve the array cookie from the value
+passed in to @command{sym_update()} before doing anything else with it, like so:
+
+@example
+awk_value_t val;
+awk_array_t new_array;
+
+new_array = create_array();
+val.val_type = AWK_ARRAY;
+val.array_cookie = new_array;
+
+/* install array in the symbol table */
+sym_update("array", & val);
+
+new_array = val.array_cookie;    /* YOU MUST DO THIS */
+@end example
+
+If installing an array as a subarray, you must also retrieve the value
+of the array cookie after the call to @code{set_element()}.
+@end itemize
+
+The following C code is a simple test extension to create an array
+with two regular elements and with a subarray. The leading @code{#include}
+directives and boilerplate variable declarations
+(@pxref{Extension API Boilerplate})
+are omitted for brevity.
+The first step is to create a new array and then install it
+in the symbol table:
+
+@example
+@ignore
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+static const gawk_api_t *api;   /* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "testarray extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+
+@end ignore
+/* create_new_array --- create a named array */
+
+static void
+create_new_array()
+@{
+    awk_array_t a_cookie;
+    awk_array_t subarray;
+    awk_value_t index, value;
+
+    a_cookie = create_array();
+    value.val_type = AWK_ARRAY;
+    value.array_cookie = a_cookie;
+
+    if (! sym_update("new_array", & value))
+        printf("create_new_array: sym_update(\"new_array\") failed!\n");
+    a_cookie = value.array_cookie;
+@end example
+
+@noindent
+Note how @code{a_cookie} is reset from the @code{array_cookie} field in
+the @code{value} structure.
+
+The second step is to install two regular values into @code{new_array}:
+
+@example
+    (void) make_const_string("hello", 5, & index);
+    (void) make_const_string("world", 5, & value);
+    if (! set_array_element(a_cookie, & index, & value)) @{
+        printf("fill_in_array: set_array_element failed\n");
+        return;
+    @}
+
+    (void) make_const_string("answer", 6, & index);
+    (void) make_number(42.0, & value);
+    if (! set_array_element(a_cookie, & index, & value)) @{
+        printf("fill_in_array: set_array_element failed\n");
+        return;
+    @}
+@end example
+
+The third step is to create the subarray and install it:
+
+@example
+    (void) make_const_string("subarray", 8, & index);
+    subarray = create_array();
+    value.val_type = AWK_ARRAY;
+    value.array_cookie = subarray;
+    if (! set_array_element(a_cookie, & index, & value)) @{
+        printf("fill_in_array: set_array_element failed\n");
+        return;
+    @}
+    subarray = value.array_cookie;
+@end example
+
+The final step is to populate the subarray with its own element:
+
+@example
+    (void) make_const_string("foo", 3, & index);
+    (void) make_const_string("bar", 3, & value);
+    if (! set_array_element(subarray, & index, & value)) @{
+        printf("fill_in_array: set_array_element failed\n");
+        return;
+    @}
+@}
+@ignore
+static awk_ext_func_t func_table[] = @{
+    @{ NULL, NULL, 0 @}
+@};
+
+/* init_testarray --- additional initialization function */
+
+static awk_bool_t init_testarray(void)
+@{
+    create_new_array();
+
+    return awk_true;
+@}
+
+static awk_bool_t (*init_func)(void) = init_testarray;
+
+dl_load_func(func_table, testarray, "")
+@end ignore
+@end example
+
+Here is a sample script that loads the extension
+and then dumps the array:
+
+@example
+@@load "subarray"
+
+function dumparray(name, array,     i)
+@{
+    for (i in array)
+        if (isarray(array[i]))
+            dumparray(name "[\"" i "\"]", array[i])
+        else
+            printf("%s[\"%s\"] = %s\n", name, i, array[i])
+@}
+
+BEGIN @{
+    dumparray("new_array", new_array);
+@}
+@end example
+
+Here is the result of running the script:
+
+@example
+$ @kbd{AWKLIBPATH=$PWD gawk -f subarray.awk}
+@print{} new_array["subarray"]["foo"] = bar
+@print{} new_array["hello"] = world
+@print{} new_array["answer"] = 42
+@end example
+
+@noindent
+(@xref{Finding Extensions} for more information on the
+@env{AWKLIBPATH} environment variable.)
+
+@node Redirection API
+@subsection Accessing and Manipulating Redirections
+
+The following function allows extensions to access and manipulate redirections.
+
+@table @code
+@item awk_bool_t get_file(const char *name,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t name_len,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const char *filetype,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int fd,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_input_buf_t **ibufp,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_output_buf_t **obufp);
+Look up file @code{name} in @command{gawk}'s internal redirection table.
+If @code{name} is @code{NULL} or @code{name_len} is zero, return
+data for the currently open input file corresponding to @code{FILENAME}.
+(This does not access the @code{filetype} argument, so that may be undefined).  
+If the file is not already open, attempt to open it.
+The @code{filetype} argument must be zero-terminated and should be one of:
+
+@table @code
+@item ">"
+A file opened for output.
+
+@item ">>"
+A file opened for append.
+
+@item "<"
+A file opened for input.
+
+@item "|>"
+A pipe opened for output.
+
+@item "|<"
+A pipe opened for input.
+
+@item "|&"
+A two-way coprocess.
+@end table
+
+On error, return @code{awk_false}.  Otherwise, return
+@code{awk_true}, and return additional information about the redirection
+in the @code{ibufp} and @code{obufp} pointers.
+
+For input redirections, the @code{*ibufp} value should be non-@code{NULL},
+and @code{*obufp} should be @code{NULL}.  For output redirections,
+the @code{*obufp} value should be non-@code{NULL}, and @code{*ibufp}
+should be @code{NULL}.  For two-way coprocesses, both values should
+be non-@code{NULL}.
+
+In the usual case, the extension is interested in @code{(*ibufp)->fd}
+and/or @code{fileno((*obufp)->fp)}.  If the file is not already
+open, and the @code{fd} argument is nonnegative, @command{gawk}
+will use that file descriptor instead of opening the file in the
+usual way.  If @code{fd} is nonnegative, but the file exists already,
+@command{gawk} ignores @code{fd} and returns the existing file.  It is
+the caller's responsibility to notice that neither the @code{fd} in
+the returned @code{awk_input_buf_t} nor the @code{fd} in the returned
+@code{awk_output_buf_t} matches the requested value.
+
+Note that supplying a file descriptor is currently @emph{not} supported
+for pipes.  However, supplying a file descriptor should work for input,
+output, append, and two-way (coprocess) sockets.  If @code{filetype}
+is two-way, @command{gawk} assumes that it is a socket!  Note that in
+the two-way case, the input and output file descriptors may differ.
+To check for success, you must check whether either matches.
+@end table
+
+It is anticipated that this API function will be used to implement I/O
+multiplexing and a socket library.
+
+@node Extension API Variables
+@subsection API Variables
+
+The API provides two sets of variables.  The first provides information
+about the version of the API (both with which the extension was compiled,
+and with which @command{gawk} was compiled).  The second provides
+information about how @command{gawk} was invoked.
+
+@menu
+* Extension Versioning::          API Version information.
+* Extension GMP/MPFR Versioning:: Version information about GMP and MPFR.
+* Extension API Informational Variables:: Variables providing information about
+                                  @command{gawk}'s invocation.
+@end menu
+
+@node Extension Versioning
+@subsubsection API Version Constants and Variables
+@cindex API version
+@cindex extension API version
+
+The API provides both a ``major'' and a ``minor'' version number.
+The API versions are available at compile time as C preprocessor defines
+to support conditional compilation, and as enum constants to facilitate
+debugging:
+
+@float Table,gawk-api-version
+@caption{gawk API version constants}
+@multitable {@b{API Version}} {@code{gawk_api_major_version}} {@code{GAWK_API_MAJOR_VERSION}}
+@headitem API Version @tab C Preprocessor Define @tab enum constant
+@item Major @tab @code{gawk_api_major_version} @tab @code{GAWK_API_MAJOR_VERSION}
+@item Minor @tab @code{gawk_api_minor_version} @tab @code{GAWK_API_MINOR_VERSION}
+@end multitable
+@end float
+
+The minor version increases when new functions are added to the API. Such
+new functions are always added to the end of the API @code{struct}.
+
+The major version increases (and the minor version is reset to zero) if any
+of the data types change size or member order, or if any of the existing
+functions change signature.
+
+It could happen that an extension may be compiled against one version
+of the API but loaded by a version of @command{gawk} using a different
+version. For this reason, the major and minor API versions of the
+running @command{gawk} are included in the API @code{struct} as read-only
+constant integers:
+
+@table @code
+@item api->major_version
+The major version of the running @command{gawk}.
+
+@item api->minor_version
+The minor version of the running @command{gawk}.
+@end table
+
+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
+    || 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",
+                GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION,
+                api->major_version, api->minor_version);
+        exit(1);
+@}
+@end example
+
+Such code is included in the boilerplate @code{dl_load_func()} macro
+provided in @file{gawkapi.h} (discussed in
+@ref{Extension API Boilerplate}).
+
+@node Extension GMP/MPFR Versioning
+@subsubsection GMP and MPFR Version Information
+
+The API also includes information about the versions of GMP and MPFR
+with which the running @command{gawk} was compiled (if any).
+They are included in the API @code{struct} as read-only
+constant integers:
+
+@table @code
+@item api->gmp_major_version
+The major version of the GMP library used to compile @command{gawk}.
+
+@item api->gmp_minor_version
+The minor version of the GMP library used to compile @command{gawk}.
+
+@item api->mpfr_major_version
+The major version of the MPFR library used to compile @command{gawk}.
+
+@item api->mpfr_minor_version
+The minor version of the MPFR library used to compile @command{gawk}.
+@end table
+
+These fields are set to zero if @command{gawk} was compiled without
+MPFR support.
+
+You can check if the versions of MPFR and GMP that you are using match those
+of @command{gawk} with the following macro:
+
+@table @code
+@item check_mpfr_version(extension)
+The @code{extension} is the extension id passed to all the other macros
+and functions defined in @file{gawkapi.h}.  If you have not included
+the @code{<mpfr.h>} header file, then this macro will be defined to do nothing.
+
+If you have included that file, then this macro compares the MPFR
+and GMP major and minor versions against those of the library you are
+compiling against.  If your libraries are newer than @command{gawk}'s, it
+produces a fatal error message.
+
+The @code{dl_load_func()} macro (@pxref{Extension API Boilerplate})
+calls @code{check_mpfr_version()}.
+@end table
+
+@node Extension API Informational Variables
+@subsubsection Informational Variables
+@cindex API informational variables
+@cindex extension API informational variables
+
+The API provides access to several variables that describe
+whether the corresponding command-line options were enabled when
+@command{gawk} was invoked.  The variables are:
+
+@table @code
+@item do_debug
+This variable is true if @command{gawk} was invoked with @option{--debug} option.
+
+@item do_lint
+This variable is true if @command{gawk} was invoked with @option{--lint} option.
+
+@item do_mpfr
+This variable is true if @command{gawk} was invoked with @option{--bignum} option.
+
+@item do_profile
+This variable is true if @command{gawk} was invoked with @option{--profile} option.
+
+@item do_sandbox
+This variable is true if @command{gawk} was invoked with @option{--sandbox} option.
+
+@item do_traditional
+This variable is true if @command{gawk} was invoked with @option{--traditional} option.
+@end table
+
+The value of @code{do_lint} can change if @command{awk} code
+modifies the @code{LINT} predefined variable (@pxref{Built-in Variables}).
+The others should not change during execution.
+
+@node Extension API Boilerplate
+@subsection Boilerplate Code
+
+As mentioned earlier (@pxref{Extension Mechanism Outline}), the function
+definitions as presented are really macros. To use these macros, your
+extension must provide a small amount of boilerplate code (variables and
+functions) toward the top of your source file, using predefined names
+as described here.  The boilerplate needed is also provided in comments
+in the @file{gawkapi.h} header file:
+
+@example
+@group
+/* Boilerplate code: */
+int plugin_is_GPL_compatible;
+
+static gawk_api_t *const api;
+@end group
+static awk_ext_id_t ext_id;
+static const char *ext_version = NULL; /* or @dots{} = "some string" */
+
+static awk_ext_func_t func_table[] = @{
+    @{ "name", do_name, 1, 0, awk_false, NULL @},
+    /* @dots{} */
+@};
+
+/* EITHER: */
+
+static awk_bool_t (*init_func)(void) = NULL;
+
+/* OR: */
+
+static awk_bool_t
+init_my_extension(void)
+@{
+    @dots{}
+@}
+
+static awk_bool_t (*init_func)(void) = init_my_extension;
+
+dl_load_func(func_table, some_name, "name_space_in_quotes")
+@end example
+
+These variables and functions are as follows:
+
+@table @code
+@item int plugin_is_GPL_compatible;
+This asserts that the extension is compatible with
+@ifclear FOR_PRINT
+the GNU GPL (@pxref{Copying}).
+@end ifclear
+@ifset FOR_PRINT
+the GNU GPL.
+@end ifset
+If your extension does not have this, @command{gawk}
+will not load it (@pxref{Plugin License}).
+
+@item static gawk_api_t *const api;
+This global @code{static} variable should be set to point to
+the @code{gawk_api_t} pointer that @command{gawk} passes to your
+@code{dl_load()} function.  This variable is used by all of the macros.
+
+@item static awk_ext_id_t ext_id;
+This global static variable should be set to the @code{awk_ext_id_t}
+value that @command{gawk} passes to your @code{dl_load()} function.
+This variable is used by all of the macros.
+
+@item static const char *ext_version = NULL; /* or @dots{} = "some string" */
+This global @code{static} variable should be set either
+to @code{NULL}, or to point to a string giving the name and version of
+your extension.
+
+@item static awk_ext_func_t func_table[] = @{ @dots{} @};
+This is an array of one or more @code{awk_ext_func_t} structures,
+as described earlier (@pxref{Extension Functions}).
+It can then be looped over for multiple calls to
+@code{add_ext_func()}.
+
+@c Use @var{OR} for docbook
+@item static awk_bool_t (*init_func)(void) = NULL;
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @var{OR}
+@itemx static awk_bool_t init_my_extension(void) @{ @dots{} @}
+@itemx static awk_bool_t (*init_func)(void) = init_my_extension;
+If you need to do some initialization work, you should define a
+function that does it (creates variables, opens files, etc.)
+and then define the @code{init_func} pointer to point to your
+function.
+The function should return @code{awk_false} upon failure, or @code{awk_true}
+if everything goes well.
+
+If you don't need to do any initialization, define the pointer and
+initialize it to @code{NULL}.
+
+@item dl_load_func(func_table, some_name, "name_space_in_quotes")
+This macro expands to a @code{dl_load()} function that performs
+all the necessary initializations.
+@end table
+
+The point of all the variables and arrays is to let the
+@code{dl_load()} function (from the @code{dl_load_func()}
+macro) do all the standard work. It does the following:
+
+@enumerate 1
+@item
+Check the API versions. If the extension major version does not match
+@command{gawk}'s, or if the extension minor version is greater than
+@command{gawk}'s, it prints a fatal error message and exits.
+
+@item
+Check the MPFR and GMP versions. If there is a mismatch, it prints
+a fatal error message and exits.
+
+@item
+Load the functions defined in @code{func_table}.
+If any of them fails to load, it prints a warning message but
+continues on.
+
+@item
+If the @code{init_func} pointer is not @code{NULL}, call the
+function it points to. If it returns @code{awk_false}, print a
+warning message.
+
+@item
+If @code{ext_version} is not @code{NULL}, register
+the version string with @command{gawk}.
+@end enumerate
+
+
+@node Changes from API V1
+@subsection Changes From Version 1 of the API
+
+The current API is @emph{not} binary compatible with version 1 of the API.
+You will have to recompile your extensions in order to use them with
+the current version of @command{gawk}.
+
+Fortunately, at the possible expense of some compile-time warnings, the API remains
+source-code--compatible with the previous API. The major differences are
+the additional members in the @code{awk_ext_func_t} structure, and the
+addition of the third argument to the C implementation function
+(@pxref{Extension Functions}).
+
+Here is a list of individual features that changed from version 1 to
+version 2 of the API:
+
+@itemize @bullet
+
+@item
+Numeric values can now have MPFR/MPZ variants
+(@pxref{General Data Types}).
+
+@item
+There are new string types: @code{AWK_REGEX} and @code{AWK_STRNUM}
+(@pxref{General Data Types}).
+
+@item
+The @code{ezalloc()} macro is new
+(@pxref{Memory Allocation Functions}).
+
+@item
+The @code{awk_ext_func_t} structure changed. Instead of
+@code{num_expected_args}, it now has @code{max_expected} and
+@code{min_required}
+(@pxref{Extension Functions}).
+
+@item
+For @code{get_record()}, an input parser can now specify field widths
+(@pxref{Input Parsers}).
+
+@item
+Extensions can now produce nonfatal error messages
+(@pxref{Printing Messages}).
+
+@item
+When flattening an array, you can now specify the index and value types
+(@pxref{Array Functions}).
+
+@item
+The @code{get_file()} API is new
+(@pxref{Redirection API}).
+@end itemize
+
+@node Finding Extensions
+@section How @command{gawk} Finds Extensions
+@cindex extension search path
+@cindex finding extensions
+
+Compiled extensions have to be installed in a directory where
+@command{gawk} can find them.  If @command{gawk} is configured and
+built in the default fashion, the directory in which to find
+extensions is @file{/usr/local/lib/gawk}.  You can also specify a search
+path with a list of directories to search for compiled extensions.
+@xref{AWKLIBPATH Variable} for more information.
+
+@node Extension Example
+@section Example: Some File Functions
+@cindex extension example
+
+@quotation
+@i{No matter where you go, there you are.}
+@author Buckaroo Banzai
+@end quotation
+
+@c It's enough to show chdir and stat, no need for fts
+
+Two useful functions that are not in @command{awk} are @code{chdir()} (so
+that an @command{awk} program can change its directory) and @code{stat()}
+(so that an @command{awk} program can gather information about a file).
+In order to illustrate the API in action, this @value{SECTION} implements
+these functions for @command{gawk} in an extension.
+
+@menu
+* Internal File Description::   What the new functions will do.
+* Internal File Ops::           The code for internal file operations.
+* Using Internal File Ops::     How to use an external extension.
+@end menu
+
+@node Internal File Description
+@subsection Using @code{chdir()} and @code{stat()}
+
+This @value{SECTION} shows how to use the new functions at
+the @command{awk} level once they've been integrated into the
+running @command{gawk} interpreter.  Using @code{chdir()} is very
+straightforward. It takes one argument, the new directory to change to:
+
+@example
+@@load "filefuncs"
+@dots{}
+newdir = "/home/arnold/funstuff"
+ret = chdir(newdir)
+if (ret < 0) @{
+    printf("could not change to %s: %s\n", newdir, ERRNO) > "/dev/stderr"
+    exit 1
+@}
+@dots{}
+@end example
+
+The return value is negative if the @code{chdir()} failed, and
+@code{ERRNO} (@pxref{Built-in Variables}) is set to a string indicating
+the error.
+
+Using @code{stat()} is a bit more complicated.  The C @code{stat()}
+function fills in a structure that has a fair amount of information.
+The right way to model this in @command{awk} is to fill in an associative
+array with the appropriate information:
+
+@c broke printf for page breaking
+@example
+file = "/home/arnold/.profile"
+ret = stat(file, fdata)
+if (ret < 0) @{
+    printf("could not stat %s: %s\n",
+             file, ERRNO) > "/dev/stderr"
+    exit 1
+@}
+printf("size of %s is %d bytes\n", file, fdata["size"])
+@end example
+
+The @code{stat()} function always clears the data array, even if
+the @code{stat()} fails.  It fills in the following elements:
+
+@table @code
+@item "name"
+The name of the file that was @code{stat()}ed.
+
+@item "dev"
+@itemx "ino"
+The file's device and inode numbers, respectively.
+
+@item "mode"
+The file's mode, as a numeric value. This includes both the file's
+type and its permissions.
+
+@item "nlink"
+The number of hard links (directory entries) the file has.
+
+@item "uid"
+@itemx "gid"
+The numeric user and group ID numbers of the file's owner.
+
+@item "size"
+The size in bytes of the file.
+
+@item "blocks"
+The number of disk blocks the file actually occupies. This may not
+be a function of the file's size if the file has holes.
+
+@item "atime"
+@itemx "mtime"
+@itemx "ctime"
+The file's last access, modification, and inode update times,
+respectively.  These are numeric timestamps, suitable for formatting
+with @code{strftime()}
+(@pxref{Time Functions}).
+
+@item "pmode"
+The file's ``printable mode.''  This is a string representation of
+the file's type and permissions, such as is produced by
+@samp{ls -l}---for example, @code{"drwxr-xr-x"}.
+
+@item "type"
+A printable string representation of the file's type.  The value
+is one of the following:
+
+@table @code
+@item "blockdev"
+@itemx "chardev"
+The file is a block or character device (``special file'').
+
+@ignore
+@item "door"
+The file is a Solaris ``door'' (special file used for
+interprocess communications).
+@end ignore
+
+@item "directory"
+The file is a directory.
+
+@item "fifo"
+The file is a named pipe (also known as a FIFO).
+
+@item "file"
+The file is just a regular file.
+
+@item "socket"
+The file is an @code{AF_UNIX} (``Unix domain'') socket in the
+filesystem.
+
+@item "symlink"
+The file is a symbolic link.
+@end table
+
+@c 5/2013: Thanks to Corinna Vinschen for this information.
+@item "devbsize"
+The size of a block for the element indexed by @code{"blocks"}.
+This information is derived from either the @code{DEV_BSIZE}
+constant defined in @code{<sys/param.h>} on most systems,
+or the @code{S_BLKSIZE} constant in @code{<sys/stat.h>} on BSD systems.
+For some other systems, @dfn{a priori} knowledge is used to provide
+a value. Where no value can be determined, it defaults to 512.
+@end table
+
+Several additional elements may be present, depending upon the operating
+system and the type of the file.  You can test for them in your @command{awk}
+program by using the @code{in} operator
+(@pxref{Reference to Elements}):
+
+@table @code
+@item "blksize"
+The preferred block size for I/O to the file. This field is not
+present on all POSIX-like systems in the C @code{stat} structure.
+
+@item "linkval"
+If the file is a symbolic link, this element is the name of the
+file the link points to (i.e., the value of the link).
+
+@item "rdev"
+@itemx "major"
+@itemx "minor"
+If the file is a block or character device file, then these values
+represent the numeric device number and the major and minor components
+of that number, respectively.
+@end table
+
+@node Internal File Ops
+@subsection C Code for @code{chdir()} and @code{stat()}
+
+Here is the C code for these extensions.@footnote{This version is
+edited slightly for presentation.  See @file{extension/filefuncs.c}
+in the @command{gawk} distribution for the complete version.}
+
+The file includes a number of standard header files, and then includes
+the @file{gawkapi.h} header file, which provides the API definitions.
+Those are followed by the necessary variable declarations
+to make use of the API macros and boilerplate code
+(@pxref{Extension API Boilerplate}):
+
+@example
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#include "gawkfts.h"
+#include "stack.h"
+
+static const gawk_api_t *api;    /* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static awk_bool_t init_filefuncs(void);
+static awk_bool_t (*init_func)(void) = init_filefuncs;
+static const char *ext_version = "filefuncs extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+@end example
+
+@cindex programming conventions, @command{gawk} extensions
+By convention, for an @command{awk} function @code{foo()}, the C function
+that implements it is called @code{do_foo()}.  The function should have
+two arguments. The first is an @code{int}, usually called @code{nargs},
+that represents the number of actual arguments for the function.
+The second is a pointer to an @code{awk_value_t} structure, usually named
+@code{result}:
+
+@example
+@group
+/*  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)
+@end group
+@{
+    awk_value_t newdir;
+    int ret = -1;
+
+    assert(result != NULL);
+@end example
+
+The @code{newdir}
+variable represents the new directory to change to, which is retrieved
+with @code{get_argument()}.  Note that the first argument is
+numbered zero.
+
+If the argument is retrieved successfully, the function calls the
+@code{chdir()} system call. Otherwise, if the @code{chdir()} fails,
+it updates @code{ERRNO}:
+
+@example
+    if (get_argument(0, AWK_STRING, & newdir)) @{
+        ret = chdir(newdir.str_value.str);
+        if (ret < 0)
+            update_ERRNO_int(errno);
+    @}
+@end example
+
+Finally, the function returns the return value to the @command{awk} level:
+
+@example
+    return make_number(ret, result);
+@}
+@end example
+
+The @code{stat()} extension is more involved.  First comes a function
+that turns a numeric mode into a printable representation
+(e.g., octal @code{0644} becomes @samp{-rw-r--r--}). This is omitted here for brevity:
+
+@example
+/* format_mode --- turn a stat mode field into something readable */
+
+static char *
+format_mode(unsigned long fmode)
+@{
+    @dots{}
+@}
+@end example
+
+Next comes a function for reading symbolic links, which is also
+omitted here for brevity:
+
+@example
+/* read_symlink --- read a symbolic link into an allocated buffer.
+   @dots{} */
+
+static char *
+read_symlink(const char *fname, size_t bufsize, ssize_t *linksize)
+@{
+    @dots{}
+@}
+@end example
+
+Two helper functions simplify entering values in the
+array that will contain the result of the @code{stat()}:
+
+@example
+/* array_set --- set an array element */
+
+static void
+array_set(awk_array_t array, const char *sub, awk_value_t *value)
+@{
+    awk_value_t index;
+
+    set_array_element(array,
+                      make_const_string(sub, strlen(sub), & index),
+                      value);
+
+@}
+
+/* array_set_numeric --- set an array element with a number */
+
+static void
+array_set_numeric(awk_array_t array, const char *sub, double num)
+@{
+    awk_value_t tmp;
+
+    array_set(array, sub, make_number(num, & tmp));
+@}
+@end example
+
+The following function does most of the work to fill in
+the @code{awk_array_t} result array with values obtained
+from a valid @code{struct stat}. This work is done in a separate function
+to support the @code{stat()} function for @command{gawk} and also
+to support the @code{fts()} extension, which is included in
+the same file but whose code is not shown here
+(@pxref{Extension Sample File Functions}).
+
+The first part of the function is variable declarations,
+including a table to map file types to strings:
+
+@example
+/* fill_stat_array --- do the work to fill an array with stat info */
+
+static int
+fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf)
+@{
+    char *pmode;    /* printable mode */
+    const char *type = "unknown";
+    awk_value_t tmp;
+    static struct ftype_map @{
+        unsigned int mask;
+        const char *type;
+    @} ftype_map[] = @{
+        @{ S_IFREG, "file" @},
+        @{ S_IFBLK, "blockdev" @},
+        @{ S_IFCHR, "chardev" @},
+        @{ S_IFDIR, "directory" @},
+#ifdef S_IFSOCK
+        @{ S_IFSOCK, "socket" @},
+#endif
+#ifdef S_IFIFO
+        @{ S_IFIFO, "fifo" @},
+#endif
+#ifdef S_IFLNK
+        @{ S_IFLNK, "symlink" @},
+#endif
+#ifdef S_IFDOOR /* Solaris weirdness */
+        @{ S_IFDOOR, "door" @},
+#endif
+    @};
+    int j, k;
+@end example
+
+The destination array is cleared, and then code fills in
+various elements based on values in the @code{struct stat}:
+
+@example
+    /* empty out the array */
+    clear_array(array);
+
+    /* fill in the array */
+    array_set(array, "name", make_const_string(name, strlen(name),
+                                               & tmp));
+    array_set_numeric(array, "dev", sbuf->st_dev);
+    array_set_numeric(array, "ino", sbuf->st_ino);
+    array_set_numeric(array, "mode", sbuf->st_mode);
+    array_set_numeric(array, "nlink", sbuf->st_nlink);
+    array_set_numeric(array, "uid", sbuf->st_uid);
+    array_set_numeric(array, "gid", sbuf->st_gid);
+    array_set_numeric(array, "size", sbuf->st_size);
+    array_set_numeric(array, "blocks", sbuf->st_blocks);
+    array_set_numeric(array, "atime", sbuf->st_atime);
+    array_set_numeric(array, "mtime", sbuf->st_mtime);
+    array_set_numeric(array, "ctime", sbuf->st_ctime);
+
+    /* for block and character devices, add rdev,
+       major and minor numbers */
+    if (S_ISBLK(sbuf->st_mode) || S_ISCHR(sbuf->st_mode)) @{
+        array_set_numeric(array, "rdev", sbuf->st_rdev);
+        array_set_numeric(array, "major", major(sbuf->st_rdev));
+        array_set_numeric(array, "minor", minor(sbuf->st_rdev));
+    @}
+@end example
+
+@noindent
+The latter part of the function makes selective additions
+to the destination array, depending upon the availability of
+certain members and/or the type of the file. It then returns zero,
+for success:
+
+@example
+@group
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+    array_set_numeric(array, "blksize", sbuf->st_blksize);
+#endif
+@end group
+
+    pmode = format_mode(sbuf->st_mode);
+    array_set(array, "pmode", make_const_string(pmode, strlen(pmode),
+                                                & tmp));
+
+    /* for symbolic links, add a linkval field */
+    if (S_ISLNK(sbuf->st_mode)) @{
+        char *buf;
+        ssize_t linksize;
+
+        if ((buf = read_symlink(name, sbuf->st_size,
+                    & linksize)) != NULL)
+            array_set(array, "linkval",
+                      make_malloced_string(buf, linksize, & tmp));
+        else
+            warning(ext_id, _("stat: unable to read symbolic link `%s'"),
+                    name);
+    @}
+
+    /* add a type field */
+    type = "unknown";   /* shouldn't happen */
+    for (j = 0, k = sizeof(ftype_map)/sizeof(ftype_map[0]); j < k; j++) @{
+        if ((sbuf->st_mode & S_IFMT) == ftype_map[j].mask) @{
+            type = ftype_map[j].type;
+            break;
+        @}
+    @}
+
+    array_set(array, "type", make_const_string(type, strlen(type), & tmp));
+
+    return 0;
+@}
+@end example
+
+The third argument to @code{stat()} was not discussed previously. This
+argument is optional. If present, it causes @code{do_stat()} to use
+the @code{stat()} system call instead of the @code{lstat()} system
+call.  This is done by using a function pointer: @code{statfunc}.
+@code{statfunc} is initialized to point to @code{lstat()} (instead
+of @code{stat()}) to get the file information, in case the file is a
+symbolic link. However, if the third argument is included, @code{statfunc}
+is set to point to @code{stat()}, instead.
+
+Here is the @code{do_stat()} function, which starts with
+variable declarations and argument checking:
+
+@example
+/* do_stat --- provide a stat() function for gawk */
+
+static awk_value_t *
+do_stat(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+@{
+    awk_value_t file_param, array_param;
+    char *name;
+    awk_array_t array;
+    int ret;
+    struct stat sbuf;
+    /* default is lstat() */
+    int (*statfunc)(const char *path, struct stat *sbuf) = lstat;
+
+    assert(result != NULL);
+@end example
+
+Then comes the actual work. First, the function gets the arguments.
+Next, it gets the information for the file.  If the called function
+(@code{lstat()} or @code{stat()}) returns an error, the code sets
+@code{ERRNO} and returns:
+
+@example
+    /* file is first arg, array to hold results is second */
+    if (   ! get_argument(0, AWK_STRING, & file_param)
+        || ! get_argument(1, AWK_ARRAY, & array_param)) @{
+        warning(ext_id, _("stat: bad parameters"));
+        return make_number(-1, result);
+    @}
+
+    if (nargs == 3) @{
+        statfunc = stat;
+    @}
+
+    name = file_param.str_value.str;
+    array = array_param.array_cookie;
+
+    /* always empty out the array */
+    clear_array(array);
+
+    /* stat the file; if error, set ERRNO and return */
+    ret = statfunc(name, & sbuf);
+@group
+    if (ret < 0) @{
+        update_ERRNO_int(errno);
+        return make_number(ret, result);
+    @}
+@end 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
+@group
+    ret = fill_stat_array(name, array, & sbuf);
+
+    return make_number(ret, result);
+@}
+@end group
+@end example
+
+Finally, it's necessary to provide the ``glue'' that loads the
+new function(s) into @command{gawk}.
+
+The @code{filefuncs} extension also provides an @code{fts()}
+function, which we omit here
+(@pxref{Extension Sample File Functions}).
+For its sake, there is an initialization
+function:
+
+@example
+/* init_filefuncs --- initialization routine */
+
+static awk_bool_t
+init_filefuncs(void)
+@{
+    @dots{}
+@}
+@end example
+
+We are almost done. We need an array of @code{awk_ext_func_t}
+structures for loading each function into @command{gawk}:
+
+@example
+static awk_ext_func_t func_table[] = @{
+    @{ "chdir", do_chdir, 1, 1, awk_false, NULL @},
+    @{ "stat",  do_stat, 3, 2, awk_false, NULL @},
+    @dots{}
+@};
+@end example
+
+Each extension must have a routine named @code{dl_load()} to load
+everything that needs to be loaded.  It is simplest to use the
+@code{dl_load_func()} macro in @code{gawkapi.h}:
+
+@example
+/* define the dl_load() function using the boilerplate macro */
+
+dl_load_func(func_table, filefuncs, "")
+@end example
+
+And that's it!
+
+@node Using Internal File Ops
+@subsection Integrating the Extensions
+
+@cindex @command{gawk}, interpreter@comma{} adding code to
+Now that the code is written, it must be possible to add it at
+runtime to the running @command{gawk} interpreter.  First, the
+code must be compiled.  Assuming that the functions are in
+a file named @file{filefuncs.c}, and @var{idir} is the location
+of the @file{gawkapi.h} header file,
+the following steps@footnote{In practice, you would probably want to
+use the GNU Autotools (Automake, Autoconf, Libtool, and @command{gettext}) to
+configure and build your libraries. Instructions for doing so are beyond
+the scope of this @value{DOCUMENT}. @xref{gawkextlib} for Internet links to
+the tools.} create a GNU/Linux shared library:
+
+@example
+$ @kbd{gcc -fPIC -shared -DHAVE_CONFIG_H -c -O -g -I@var{idir} filefuncs.c}
+$ @kbd{gcc -o filefuncs.so -shared filefuncs.o}
+@end example
+
+Once the library exists, it is loaded by using the @code{@@load} keyword:
+
+@example
+# file testff.awk
+@@load "filefuncs"
+
+BEGIN @{
+    "pwd" | getline curdir  # save current directory
+    close("pwd")
+
+    chdir("/tmp")
+    system("pwd")   # test it
+    chdir(curdir)   # go back
+
+    print "Info for testff.awk"
+    ret = stat("testff.awk", data)
+    print "ret =", ret
+    for (i in data)
+        printf "data[\"%s\"] = %s\n", i, data[i]
+    print "testff.awk modified:",
+        strftime("%m %d %Y %H:%M:%S", data["mtime"])
+
+    print "\nInfo for JUNK"
+    ret = stat("JUNK", data)
+    print "ret =", ret
+    for (i in data)
+        printf "data[\"%s\"] = %s\n", i, data[i]
+    print "JUNK modified:", strftime("%m %d %Y %H:%M:%S", data["mtime"])
+@}
+@end example
+
+The @env{AWKLIBPATH} environment variable tells
+@command{gawk} where to find extensions (@pxref{Finding Extensions}).
+We set it to the current directory and run the program:
+
+@example
+$ @kbd{AWKLIBPATH=$PWD gawk -f testff.awk}
+@print{} /tmp
+@print{} Info for testff.awk
+@print{} ret = 0
+@print{} data["blksize"] = 4096
+@print{} data["devbsize"] = 512
+@print{} data["mtime"] = 1412004710
+@print{} data["mode"] = 33204
+@print{} data["type"] = file
+@print{} data["dev"] = 2053
+@print{} data["gid"] = 1000
+@print{} data["ino"] = 10358899
+@print{} data["ctime"] = 1412004710
+@print{} data["blocks"] = 8
+@print{} data["nlink"] = 1
+@print{} data["name"] = testff.awk
+@print{} data["atime"] = 1412004716
+@print{} data["pmode"] = -rw-rw-r--
+@print{} data["size"] = 666
+@print{} data["uid"] = 1000
+@print{} testff.awk modified: 09 29 2014 18:31:50
+@print{}
+@print{} Info for JUNK
+@print{} ret = -1
+@print{} JUNK modified: 01 01 1970 02:00:00
+@end example
+
+@node Extension Samples
+@section The Sample Extensions in the @command{gawk} Distribution
+@cindex extensions distributed with @command{gawk}
+
+This @value{SECTION} provides a brief overview of the sample extensions
+that come in the @command{gawk} distribution. Some of them are intended
+for production use (e.g., the @code{filefuncs}, @code{readdir}, and
+@code{inplace} extensions).  Others mainly provide example code that
+shows how to use the extension API.
+
+@menu
+* Extension Sample File Functions::   The file functions sample.
+* Extension Sample Fnmatch::          An interface to @code{fnmatch()}.
+* Extension Sample Fork::             An interface to @code{fork()} and other
+                                      process functions.
+* Extension Sample Inplace::          Enabling in-place file editing.
+* Extension Sample Ord::              Character to value to character
+                                      conversions.
+* Extension Sample Readdir::          An interface to @code{readdir()}.
+* Extension Sample Revout::           Reversing output sample output wrapper.
+* Extension Sample Rev2way::          Reversing data sample two-way processor.
+* Extension Sample Read write array:: Serializing an array to a file.
+* Extension Sample Readfile::         Reading an entire file into a string.
+* Extension Sample Time::             An interface to @code{gettimeofday()}
+                                      and @code{sleep()}.
+* Extension Sample API Tests::        Tests for the API.
+@end menu
+
+@node Extension Sample File Functions
+@subsection File-Related Functions
+
+The @code{filefuncs} extension provides three different functions, as follows.
+The usage is:
+
+@table @asis
+@item @code{@@load "filefuncs"}
+This is how you load the extension.
+
+@cindex @code{chdir()} extension function
+@item @code{result = chdir("/some/directory")}
+The @code{chdir()} function is a direct hook to the @code{chdir()}
+system call to change the current directory.  It returns zero
+upon success or a value less than zero upon error.
+In the latter case, it updates @code{ERRNO}.
+
+@cindex @code{stat()} extension function
+@item @code{result = stat("/some/path", statdata} [@code{, follow}]@code{)}
+The @code{stat()} function provides a hook into the
+@code{stat()} system call.
+It returns zero upon success or a value less than zero upon error.
+In the latter case, it updates @code{ERRNO}.
+
+By default, it uses the @code{lstat()} system call.  However, if passed
+a third argument, it uses @code{stat()} instead.
+
+In all cases, it clears the @code{statdata} array.
+When the call is successful, @code{stat()} fills the @code{statdata}
+array with information retrieved from the filesystem, as follows:
+
+@multitable @columnfractions .15 .50 .20
+@headitem Subscript @tab Field in @code{struct stat} @tab File type
+@item @code{"name"} @tab The @value{FN} @tab All
+@item @code{"dev"} @tab @code{st_dev} @tab All
+@item @code{"ino"} @tab @code{st_ino} @tab All
+@item @code{"mode"} @tab @code{st_mode} @tab All
+@item @code{"nlink"} @tab @code{st_nlink} @tab All
+@item @code{"uid"} @tab @code{st_uid} @tab All
+@item @code{"gid"} @tab @code{st_gid} @tab All
+@item @code{"size"} @tab @code{st_size} @tab All
+@item @code{"atime"} @tab @code{st_atime} @tab All
+@item @code{"mtime"} @tab @code{st_mtime} @tab All
+@item @code{"ctime"} @tab @code{st_ctime} @tab All
+@item @code{"rdev"} @tab @code{st_rdev} @tab Device files
+@item @code{"major"} @tab @code{st_major} @tab Device files
+@item @code{"minor"} @tab @code{st_minor} @tab Device files
+@item @code{"blksize"} @tab @code{st_blksize} @tab All
+@item @code{"pmode"} @tab A human-readable version of the mode value, like that printed by
+@command{ls} (for example, @code{"-rwxr-xr-x"}) @tab All
+@item @code{"linkval"} @tab The value of the symbolic link @tab Symbolic links
+@item @code{"type"} @tab The type of the file as a string---one of
+@code{"file"},
+@code{"blockdev"},
+@code{"chardev"},
+@code{"directory"},
+@code{"socket"},
+@code{"fifo"},
+@code{"symlink"},
+@code{"door"},
+or
+@code{"unknown"}
+(not all systems support all file types) @tab All
+@end multitable
+
+@cindex @code{fts()} extension function
+@item @code{flags = or(FTS_PHYSICAL, ...)}
+@itemx @code{result = fts(pathlist, flags, filedata)}
+Walk the file trees provided in @code{pathlist} and fill in the
+@code{filedata} array, as described next.  @code{flags} is the bitwise
+OR of several predefined values, also described in a moment.
+Return zero if there were no errors, otherwise return @minus{}1.
+@end table
+
+The @code{fts()} function provides a hook to the C library @code{fts()}
+routines for traversing file hierarchies.  Instead of returning data
+about one file at a time in a stream, it fills in a multidimensional
+array with data about each file and directory encountered in the requested
+hierarchies.
+
+The arguments are as follows:
+
+@table @code
+@item pathlist
+An array of @value{FN}s.  The element values are used; the index values are ignored.
+
+@item flags
+This should be the bitwise OR of one or more of the following
+predefined constant flag values.  At least one of
+@code{FTS_LOGICAL} or @code{FTS_PHYSICAL} must be provided; otherwise
+@code{fts()} returns an error value and sets @code{ERRNO}.
+The flags are:
+
+@c nested table
+@table @code
+@item FTS_LOGICAL
+Do a ``logical'' file traversal, where the information returned for
+a symbolic link refers to the linked-to file, and not to the symbolic
+link itself.  This flag is mutually exclusive with @code{FTS_PHYSICAL}.
+
+@item FTS_PHYSICAL
+Do a ``physical'' file traversal, where the information returned for a
+symbolic link refers to the symbolic link itself.  This flag is mutually
+exclusive with @code{FTS_LOGICAL}.
+
+@item FTS_NOCHDIR
+As a performance optimization, the C library @code{fts()} routines
+change directory as they traverse a file hierarchy.  This flag disables
+that optimization.
+
+@item FTS_COMFOLLOW
+Immediately follow a symbolic link named in @code{pathlist},
+whether or not @code{FTS_LOGICAL} is set.
+
+@item FTS_SEEDOT
+By default, the C library @code{fts()} routines do not return entries for
+@file{.} (dot) and @file{..} (dot-dot).  This option causes entries for
+dot-dot to also be included.  (The extension always includes an entry
+for dot; more on this in a moment.)
+
+@item FTS_XDEV
+During a traversal, do not cross onto a different mounted filesystem.
+@end table
+
+@item filedata
+The @code{filedata} array holds the results.
+@code{fts()} first clears it.  Then it creates
+an element in @code{filedata} for every element in @code{pathlist}.
+The index is the name of the directory or file given in @code{pathlist}.
+The element for this index is itself an array.  There are two cases:
+
+@c nested table
+@table @emph
+@item The path is a file
+In this case, the array contains two or three elements:
+
+@c doubly nested table
+@table @code
+@item "path"
+The full path to this file, starting from the ``root'' that was given
+in the @code{pathlist} array.
+
+@item "stat"
+This element is itself an array, containing the same information as provided
+by the @code{stat()} function described earlier for its
+@code{statdata} argument.  The element may not be present if
+the @code{stat()} system call for the file failed.
+
+@item "error"
+If some kind of error was encountered, the array will also
+contain an element named @code{"error"}, which is a string describing the error.
+@end table
+
+@item The path is a directory
+In this case, the array contains one element for each entry in the
+directory.  If an entry is a file, that element is the same as for files, just
+described.  If the entry is a directory, that element is (recursively)
+an array describing the subdirectory.  If @code{FTS_SEEDOT} was provided
+in the flags, then there will also be an element named @code{".."}.  This
+element will be an array containing the data as provided by @code{stat()}.
+
+In addition, there will be an element whose index is @code{"."}.
+This element is an array containing the same two or three elements as
+for a file: @code{"path"}, @code{"stat"}, and @code{"error"}.
+@end table
+@end table
+
+The @code{fts()} function returns zero if there were no errors.
+Otherwise, it returns @minus{}1.
+
+@quotation NOTE
+The @code{fts()} extension does not exactly mimic the
+interface of the C library @code{fts()} routines, choosing instead to
+provide an interface that is based on associative arrays, which is
+more comfortable to use from an @command{awk} program.  This includes the
+lack of a comparison function, because @command{gawk} already provides
+powerful array sorting facilities.  Although an @code{fts_read()}-like
+interface could have been provided, this felt less natural than simply
+creating a multidimensional array to represent the file hierarchy and
+its information.
+@end quotation
+
+See @file{test/fts.awk} in the @command{gawk} distribution for an example
+use of the @code{fts()} extension function.
+
+@node Extension Sample Fnmatch
+@subsection Interface to @code{fnmatch()}
+
+This extension provides an interface to the C library
+@code{fnmatch()} function.  The usage is:
+
+@table @code
+@item @@load "fnmatch"
+This is how you load the extension.
+
+@cindex @code{fnmatch()} extension function
+@item result = fnmatch(pattern, string, flags)
+The return value is zero on success, @code{FNM_NOMATCH}
+if the string did not match the pattern, or
+a different nonzero value if an error occurred.
+@end table
+
+In addition to the @code{fnmatch()} function, the @code{fnmatch} extension
+adds one constant (@code{FNM_NOMATCH}), and an array of flag values
+named @code{FNM}.
+
+The arguments to @code{fnmatch()} are:
+
+@table @code
+@item pattern
+The @value{FN} wildcard to match
+
+@item string
+The @value{FN} string
+
+@item flag
+Either zero, or the bitwise OR of one or more of the
+flags in the @code{FNM} array
+@end table
+
+The flags are as follows:
+
+@multitable @columnfractions .25 .75
+@headitem Array element @tab Corresponding flag defined by @code{fnmatch()}
+@item @code{FNM["CASEFOLD"]} @tab @code{FNM_CASEFOLD}
+@item @code{FNM["FILE_NAME"]} @tab @code{FNM_FILE_NAME}
+@item @code{FNM["LEADING_DIR"]} @tab @code{FNM_LEADING_DIR}
+@item @code{FNM["NOESCAPE"]} @tab @code{FNM_NOESCAPE}
+@item @code{FNM["PATHNAME"]} @tab @code{FNM_PATHNAME}
+@item @code{FNM["PERIOD"]} @tab @code{FNM_PERIOD}
+@end multitable
+
+Here is an example:
+
+@example
+@@load "fnmatch"
+@dots{}
+flags = or(FNM["PERIOD"], FNM["NOESCAPE"])
+if (fnmatch("*.a", "foo.c", flags) == FNM_NOMATCH)
+    print "no match"
+@end example
+
+@node Extension Sample Fork
+@subsection Interface to @code{fork()}, @code{wait()}, and @code{waitpid()}
+
+The @code{fork} extension adds three functions, as follows:
+
+@table @code
+@item @@load "fork"
+This is how you load the extension.
+
+@cindex @code{fork()} extension function
+@item pid = fork()
+This function creates a new process. The return value is zero in the
+child and the process ID number of the child in the parent, or @minus{}1
+upon error. In the latter case, @code{ERRNO} indicates the problem.
+In the child, @code{PROCINFO["pid"]} and @code{PROCINFO["ppid"]} are
+updated to reflect the correct values.
+
+@cindex @code{waitpid()} extension function
+@item ret = waitpid(pid)
+This function takes a numeric argument, which is the process ID to
+wait for. The return value is that of the
+@code{waitpid()} system call.
+
+@cindex @code{wait()} extension function
+@item ret = wait()
+This function waits for the first child to die.
+The return value is that of the
+@code{wait()} system call.
+@end table
+
+There is no corresponding @code{exec()} function.
+
+Here is an example:
+
+@example
+@@load "fork"
+@dots{}
+if ((pid = fork()) == 0)
+    print "hello from the child"
+else
+    print "hello from the parent"
+@end example
+
+@node Extension Sample Inplace
+@subsection Enabling In-Place File Editing
+
+@cindex @code{inplace} extension
+The @code{inplace} extension emulates GNU @command{sed}'s @option{-i} option,
+which performs ``in-place'' editing of each input file.
+It uses the bundled @file{inplace.awk} include file to invoke the extension
+properly.  This extension makes use of the namespace facility to place
+all the variables and functions in the @code{inplace} namespace
+(@pxref{Namespaces}):
+
+@example
+@c file eg/lib/inplace.awk
+@group
+# inplace --- load and invoke the inplace extension.
+@c endfile
+@ignore
+@c file eg/lib/inplace.awk
+# 
+# Copyright (C) 2013, 2017 the Free Software Foundation, Inc.
+# 
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+# 
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# Andrew J. Schorr, aschorr@@telemetry-investments.com
+# January 2013
+#
+# Revised for namespaces
+# Arnold Robbins, arnold@@skeeve.com
+# July 2017
+@c endfile
+@end ignore
+@c file eg/lib/inplace.awk
+
+@@load "inplace"
+
+# Please set inplace::suffix to make a backup copy.  For example, you may
+# want to set inplace::suffix to .bak on the command line or in a BEGIN rule.
+
+# By default, each filename on the command line will be edited inplace.
+# But you can selectively disable this by adding an inplace=0 argument
+# prior to files that you do not want to process this way.  You can then
+# reenable it later on the commandline by putting inplace=1 before files
+# that you wish to be subject to inplace editing.
+
+# N.B. We call inplace::end() in the BEGINFILE and END rules so that any
+# actions in an ENDFILE rule will be redirected as expected.
+
+@@namespace "inplace"
+@end group
+
+@group
+BEGIN @{
+    enable = 1         # enabled by default
+@}
+@end group
+
+@group
+BEGINFILE @{
+    if (filename != "")
+        end(filename, suffix)
+    if (enable)
+        begin(filename = FILENAME, suffix)
+    else
+        filename = ""
+@}
+@end group
+
+@group
+END @{
+    if (filename != "")
+        end(filename, suffix)
+@}
+@end group
+@c endfile
+@end example
+
+For each regular file that is processed, the extension redirects
+standard output to a temporary file configured to have the same owner
+and permissions as the original.  After the file has been processed,
+the extension restores standard output to its original destination.
+If @code{inplace::suffix} is not an empty string, the original file is
+linked to a backup @value{FN} created by appending that suffix.  Finally,
+the temporary file is renamed to the original @value{FN}.
+
+Note that the use of this feature can be controlled by placing
+@samp{inplace::enable=0} on the command-line prior to listing files that
+should not be processed this way.  You can reenable inplace editing by adding
+an @samp{inplace::enable=1} argument prior to files that should be subject
+to inplace editing.
+
+The @code{inplace::filename} variable serves to keep track of the
+current filename so as to not invoke @code{inplace::end()} before
+processing the first file.
+
+If any error occurs, the extension issues a fatal error to terminate
+processing immediately without damaging the original file.
+
+Here are some simple examples:
+
+@example
+$ @kbd{gawk -i inplace '@{ gsub(/foo/, "bar") @}; @{ print @}' file1 file2 file3}
+@end example
+
+To keep a backup copy of the original files, try this:
+
+@example
+$ @kbd{gawk -i inplace -v inplace::suffix=.bak '@{ gsub(/foo/, "bar") @}}
+> @kbd{@{ print @}' file1 file2 file3}
+@end example
+
+Please note that, while the extension does attempt to preserve ownership and permissions, it makes no attempt to copy the ACLs from the original file.
+
+If the program dies prematurely, as might happen if an unhandled signal is received, a temporary file may be left behind.
+
+@node Extension Sample Ord
+@subsection Character and Numeric values: @code{ord()} and @code{chr()}
+
+The @code{ordchr} extension adds two functions, named
+@code{ord()} and @code{chr()}, as follows:
+
+@table @code
+@item @@load "ordchr"
+This is how you load the extension.
+
+@cindex @code{ord()} extension function
+@item number = ord(string)
+Return the numeric value of the first character in @code{string}.
+
+@cindex @code{chr()} extension function
+@item char = chr(number)
+Return a string whose first character is that represented by @code{number}.
+@end table
+
+These functions are inspired by the Pascal language functions
+of the same name.  Here is an example:
+
+@example
+@@load "ordchr"
+@dots{}
+printf("The numeric value of 'A' is %d\n", ord("A"))
+printf("The string value of 65 is %s\n", chr(65))
+@end example
+
+@node Extension Sample Readdir
+@subsection Reading Directories
+
+The @code{readdir} extension adds an input parser for directories.
+The usage is as follows:
+
+@cindex @code{readdir} extension
+@example
+@@load "readdir"
+@end example
+
+When this extension is in use, instead of skipping directories named
+on the command line (or with @code{getline}),
+they are read, with each entry returned as a record.
+
+The record consists of three fields. The first two are the inode number and the
+@value{FN}, separated by a forward slash character.
+On systems where the directory entry contains the file type, the record
+has a third field (also separated by a slash), which is a single letter
+indicating the type of the file. The letters and their corresponding file
+types are shown in @ref{table-readdir-file-types}.
+
+@float Table,table-readdir-file-types
+@caption{File types returned by the @code{readdir} extension}
+@multitable @columnfractions .1 .9
+@headitem Letter @tab File type
+@item @code{b} @tab Block device
+@item @code{c} @tab Character device
+@item @code{d} @tab Directory
+@item @code{f} @tab Regular file
+@item @code{l} @tab Symbolic link
+@item @code{p} @tab Named pipe (FIFO)
+@item @code{s} @tab Socket
+@item @code{u} @tab Anything else (unknown)
+@end multitable
+@end float
+
+On systems without the file type information, the third field is always
+@samp{u}.
+
+@quotation NOTE
+On GNU/Linux systems, there are filesystems that don't support the
+@code{d_type} entry (see the @i{readdir}(3) manual page), and so the file
+type is always @samp{u}.  You can use the @code{filefuncs} extension to call
+@code{stat()} in order to get correct type information.
+@end quotation
+
+Here is an example:
+
+@example
+@@load "readdir"
+@dots{}
+BEGIN @{ FS = "/" @}
+@{ print "@value{FN} is", $2 @}
+@end example
+
+@node Extension Sample Revout
+@subsection Reversing Output
+
+The @code{revoutput} extension adds a simple output wrapper that reverses
+the characters in each output line.  Its main purpose is to show how to
+write an output wrapper, although it may be mildly amusing for the unwary.
+Here is an example:
+
+@cindex @code{revoutput} extension
+@example
+@@load "revoutput"
+
+BEGIN @{
+    REVOUT = 1
+    print "don't panic" > "/dev/stdout"
+@}
+@end example
+
+The output from this program is @samp{cinap t'nod}.
+
+@node Extension Sample Rev2way
+@subsection Two-Way I/O Example
+
+The @code{revtwoway} extension adds a simple two-way processor that
+reverses the characters in each line sent to it for reading back by
+the @command{awk} program.  Its main purpose is to show how to write
+a two-way processor, although it may also be mildly amusing.
+The following example shows how to use it:
+
+@cindex @code{revtwoway} extension
+@example
+@@load "revtwoway"
+
+BEGIN @{
+    cmd = "/magic/mirror"
+    print "don't panic" |& cmd
+    cmd |& getline result
+    print result
+    close(cmd)
+@}
+@end example
+
+The output from this program
+@ifnotinfo
+also is:
+@end ifnotinfo
+@ifinfo
+is:
+@end ifinfo
+@samp{cinap t'nod}.
+
+@node Extension Sample Read write array
+@subsection Dumping and Restoring an Array
+
+The @code{rwarray} extension adds two functions,
+named @code{writea()} and @code{reada()}, as follows:
+
+@table @code
+@item @@load "rwarray"
+This is how you load the extension.
+
+@cindex @code{writea()} extension function
+@item ret = writea(file, array)
+This function takes a string argument, which is the name of the file
+to which to dump the array, and the array itself as the second argument.
+@code{writea()} understands arrays of arrays.  It returns one on
+success, or zero upon failure.
+
+@cindex @code{reada()} extension function
+@item ret = reada(file, array)
+@code{reada()} is the inverse of @code{writea()};
+it reads the file named as its first argument, filling in
+the array named as the second argument. It clears the array first.
+Here too, the return value is one on success, or zero upon failure.
+@end table
+
+The array created by @code{reada()} is identical to that written by
+@code{writea()} in the sense that the contents are the same. However,
+due to implementation issues, the array traversal order of the re-created
+array is likely to be different from that of the original array.  As array
+traversal order in @command{awk} is by default undefined, this is (technically)
+not a problem.  If you need to guarantee a particular traversal
+order, use the array sorting features in @command{gawk} to do so
+(@pxref{Array Sorting}).
+
+The file contains binary data.  All integral values are written in network
+byte order.  However, double-precision floating-point values are written
+as native binary data.  Thus, arrays containing only string data can
+theoretically be dumped on systems with one byte order and restored on
+systems with a different one, but this has not been tried.
+
+Here is an example:
+
+@example
+@@load "rwarray"
+@dots{}
+ret = writea("arraydump.bin", array)
+@dots{}
+ret = reada("arraydump.bin", array)
+@end example
+
+@node Extension Sample Readfile
+@subsection Reading an Entire File
+
+The @code{readfile} extension adds a single function
+named @code{readfile()}, and an input parser:
+
+@table @code
+@item @@load "readfile"
+This is how you load the extension.
+
+@cindex @code{readfile()} extension function
+@item result = readfile("/some/path")
+The argument is the name of the file to read.  The return value is a
+string containing the entire contents of the requested file.  Upon error,
+the function returns the empty string and sets @code{ERRNO}.
+
+@item BEGIN @{ PROCINFO["readfile"] = 1 @}
+In addition, the extension adds an input parser that is activated if
+@code{PROCINFO["readfile"]} exists.
+When activated, each input file is returned in its entirety as @code{$0}.
+@code{RT} is set to the null string.
+@end table
+
+Here is an example:
+
+@example
+@@load "readfile"
+@dots{}
+contents = readfile("/path/to/file");
+if (contents == "" && ERRNO != "") @{
+    print("problem reading file", ERRNO) > "/dev/stderr"
+    ...
+@}
+@end example
+
+@node Extension Sample Time
+@subsection Extension Time Functions
+
+The @code{time} extension adds two functions, named @code{gettimeofday()}
+and @code{sleep()}, as follows:
+
+@table @code
+@item @@load "time"
+This is how you load the extension.
+
+@cindex @code{gettimeofday()} extension function
+@item the_time = gettimeofday()
+Return the time in seconds that has elapsed since 1970-01-01 UTC as a
+floating-point value.  If the time is unavailable on this platform, return
+@minus{}1 and set @code{ERRNO}.  The returned time should have sub-second
+precision, but the actual precision may vary based on the platform.
+If the standard C @code{gettimeofday()} system call is available on this
+platform, then it simply returns the value.  Otherwise, if on MS-Windows,
+it tries to use @code{GetSystemTimeAsFileTime()}.
+
+@cindex @code{sleep()} extension function
+@item result = sleep(@var{seconds})
+Attempt to sleep for @var{seconds} seconds.  If @var{seconds} is negative,
+or the attempt to sleep fails, return @minus{}1 and set @code{ERRNO}.
+Otherwise, return zero after sleeping for the indicated amount of time.
+Note that @var{seconds} may be a floating-point (nonintegral) value.
+Implementation details: depending on platform availability, this function
+tries to use @code{nanosleep()} or @code{select()} to implement the delay.
+@end table
+
+@node Extension Sample API Tests
+@subsection API Tests
+@cindex @code{testext} extension
+
+The @code{testext} extension exercises parts of the extension API that
+are not tested by the other samples.  The @file{extension/testext.c}
+file contains both the C code for the extension and @command{awk}
+test code inside C comments that run the tests. The testing framework
+extracts the @command{awk} code and runs the tests.  See the source file
+for more information.
+
+@node gawkextlib
+@section The @code{gawkextlib} Project
+@cindex @code{gawkextlib}
+@cindex extensions, where to find
+
+@cindex @code{gawkextlib} project
+The @uref{https://sourceforge.net/projects/gawkextlib/, @code{gawkextlib}}
+project provides a number of @command{gawk} extensions, including one for
+processing XML files.  This is the evolution of the original @command{xgawk}
+(XML @command{gawk}) project.
+
+There are a number of extensions. Some of the more interesting ones are:
+
+@itemize @value{BULLET}
+@item
+@code{abort} extension. It allows you to exit immediately from your
+@command{awk} program without running the @code{END} rules.
+
+@item
+@code{json} extension.
+This serializes a multidimensional array into a JSON string, and
+can deserialize a JSON string into a @command{gawk} array.
+This extension is interesting since it is written in C++ instead of C.
+
+@item
+MPFR library extension.
+This provides access to a number of MPFR functions that @command{gawk}'s
+native MPFR support does not.
+
+@item
+Select extension. It provides functionality based on the
+@code{select()} system call.
+
+@item
+XML parser extension, using the @uref{https://expat.sourceforge.net, Expat}
+XML parsing library
+@end itemize
+
+@cindex @command{git} utility
+You can check out the code for the @code{gawkextlib} project
+using the @uref{https://git-scm.com, Git} distributed source
+code control system.  The command is as follows:
+
+@example
+git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib-code
+@end example
+
+@cindex RapidJson JSON parser library
+You will need to have the @uref{http://www.rapidjson.org, RapidJson}
+JSON parser library installed in order to build and use the @code{json} extension.
+
+@cindex Expat XML parser library
+You will need to have the @uref{https://expat.sourceforge.net, Expat}
+XML parser library installed in order to build and use the XML extension.
+
+In addition, you must have the GNU Autotools installed
+(@uref{https://www.gnu.org/software/autoconf, Autoconf},
+@uref{https://www.gnu.org/software/automake, Automake},
+@uref{https://www.gnu.org/software/libtool, Libtool},
+and
+@uref{https://www.gnu.org/software/gettext, GNU @command{gettext}}).
+
+The simple recipe for building and testing @code{gawkextlib} is as follows.
+First, build and install @command{gawk}:
+
+@example
+cd .../path/to/gawk/code
+./configure --prefix=/tmp/newgawk     @ii{Install in /tmp/newgawk for now}
+make && make check                    @ii{Build and check that all is OK}
+make install                          @ii{Install gawk}
+@end example
+
+Next, go to @url{https://sourceforge.net/projects/gawkextlib/files} to
+download @code{gawkextlib} and any extensions that you would like to build.
+The @file{README} file at that site explains how to build the code.  If you
+installed @command{gawk} in a non-standard location, you will need to
+specify @code{./configure --with-gawk=@var{/path/to/gawk}} to find it.
+You may need to use the @command{sudo} utility
+to install both @command{gawk} and @code{gawkextlib}, depending upon
+how your system works.
+
+If you write an extension that you wish to share with other
+@command{gawk} users, consider doing so through the
+@code{gawkextlib} project.
+See the project's website for more information.
+
+@node Extension summary
+@section Summary
+
+@itemize @value{BULLET}
+@item
+You can write extensions (sometimes called plug-ins) for @command{gawk}
+in C or C++ using the application programming interface (API) defined
+by the @command{gawk} developers.
+
+@item
+Extensions must have a license compatible with the GNU General Public
+License (GPL), and they must assert that fact by declaring a variable
+named @code{plugin_is_GPL_compatible}.
+
+@item
+Communication between @command{gawk} and an extension is two-way.
+@command{gawk} passes a @code{struct} to the extension that contains
+various data fields and function pointers.  The extension can then call
+into @command{gawk} via the supplied function pointers to accomplish
+certain tasks.
+
+@item
+One of these tasks is to ``register'' the name and implementation of
+new @command{awk}-level functions with @command{gawk}.  The implementation
+takes the form of a C function pointer with a defined signature.
+By convention, implementation functions are named @code{do_@var{XXXX}()}
+for some @command{awk}-level function @code{@var{XXXX}()}.
+
+@item
+The API is defined in a header file named @file{gawkapi.h}. You must include
+a number of standard header files @emph{before} including it in your source file.
+
+@item
+API function pointers are provided for the following kinds of operations:
+
+@itemize @value{BULLET}
+@item
+Allocating, reallocating, and releasing memory
+
+@item
+Registration functions (you may register
+extension functions,
+exit callbacks,
+a version string,
+input parsers,
+output wrappers,
+and two-way processors)
+
+@item
+Printing fatal, nonfatal, warning, and ``lint'' warning messages
+
+@item
+Updating @code{ERRNO}, or unsetting it
+
+@item
+Accessing parameters, including converting an undefined parameter into
+an array
+
+@item
+Symbol table access (retrieving a global variable, creating one,
+or changing one)
+
+@item
+Creating and releasing cached values; this provides an
+efficient way to use values for multiple variables and
+can be a big performance win
+
+@item
+Manipulating arrays
+(retrieving, adding, deleting, and modifying elements;
+getting the count of elements in an array;
+creating a new array;
+clearing an array;
+and
+flattening an array for easy C-style looping over all its indices and elements)
+@end itemize
+
+@item
+The API defines a number of standard data types for representing
+@command{awk} values, array elements, and arrays.
+
+@item
+The API provides convenience functions for constructing values.
+It also provides memory management functions to ensure compatibility
+between memory allocated by @command{gawk} and memory allocated by an
+extension.
+
+@item
+@emph{All} memory passed from @command{gawk} to an extension must be
+treated as read-only by the extension.
+
+@item
+@emph{All} memory passed from an extension to @command{gawk} must come from
+the API's memory allocation functions. @command{gawk} takes responsibility for
+the memory and releases it when appropriate.
+
+@item
+The API provides information about the running version of @command{gawk} so
+that an extension can make sure it is compatible with the @command{gawk}
+that loaded it.
+
+@item
+It is easiest to start a new extension by copying the boilerplate code
+described in this @value{CHAPTER}.  Macros in the @file{gawkapi.h} header
+file make this easier to do.
+
+@item
+The @command{gawk} distribution includes a number of small but useful
+sample extensions. The @code{gawkextlib} project includes several more
+(larger) extensions.  If you wish to write an extension and contribute it
+to the community of @command{gawk} users, the @code{gawkextlib} project
+is the place to do so.
+
+@end itemize
+
+@c EXCLUDE START
+@node Extension Exercises
+@section Exercises
+
+@enumerate
+@item
+Add functions to implement system calls such as @code{chown()},
+@code{chmod()}, and @code{umask()} to the file operations extension
+presented in @ref{Internal File Ops}.
+
+@c Idea from comp.lang.awk, February 2015
+@item
+Write an input parser that prints a prompt if the input is
+a from a ``terminal'' device.  You can use the @code{isatty()}
+function to tell if the input file is a terminal. (Hint: this function
+is usually expensive to call; try to call it just once.)
+The content of the prompt should come from a variable settable
+by @command{awk}-level code.
+You can write the prompt to standard error. However,
+for best results, open a new file descriptor (or file pointer)
+on @file{/dev/tty} and print the prompt there, in case standard
+error has been redirected.
+
+Why is standard error a better
+choice than standard output for writing the prompt?
+Which reading mechanism should you replace, the one to get
+a record, or the one to read raw bytes?
+
+@item
+Write a wrapper script that provides an interface similar to
+@samp{sed -i} for the ``inplace'' extension presented in
+@ref{Extension Sample Inplace}.
+
+@end enumerate
+@c EXCLUDE END
+
+@ifnotinfo
+@part @value{PART4}Appendices
+@end ifnotinfo
+
+@ifdocbook
+
+@ifclear FOR_PRINT
+Part IV contains the appendices (including the two licenses that cover
+the @command{gawk} source code and this @value{DOCUMENT}, respectively)
+and the Glossary:
+@end ifclear
+
+@ifset FOR_PRINT
+Part IV contains three appendices, the last of which is the license that
+covers the @command{gawk} source code:
+@end ifset
+
+@itemize @value{BULLET}
+@item
+@ref{Language History}
+
+@item
+@ref{Installation}
+
+@ifclear FOR_PRINT
+@item
+@ref{Notes}
+
+@item
+@ref{Basic Concepts}
+
+@item
+@ref{Glossary}
+@end ifclear
+
+@item
+@ref{Copying}
+
+@ifclear FOR_PRINT
+@item
+@ref{GNU Free Documentation License}
+@end ifclear
+@end itemize
+@end ifdocbook
+
+@node Language History
+@appendix The Evolution of the @command{awk} Language
+
+This @value{DOCUMENT} describes the GNU implementation of @command{awk},
+which follows the POSIX specification.  Many longtime @command{awk}
+users learned @command{awk} programming with the original @command{awk}
+implementation in Version 7 Unix.  (This implementation was the basis for
+@command{awk} in Berkeley Unix, through 4.3-Reno.  Subsequent versions
+of Berkeley Unix, and, for a while, some systems derived from 4.4BSD-Lite, used various
+versions of @command{gawk} for their @command{awk}.)  This @value{CHAPTER}
+briefly describes the evolution of the @command{awk} language, with
+cross-references to other parts of the @value{DOCUMENT} where you can
+find more information.
+
+@ifset FOR_PRINT
+To save space, we have omitted
+information on the history of features in @command{gawk} from this
+edition. You can find it in the
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Feature-History.html,
+online documentation}.
+@end ifset
+
+@menu
+* V7/SVR3.1::                   The major changes between V7 and System V
+                                Release 3.1.
+* SVR4::                        Minor changes between System V Releases 3.1
+                                and 4.
+* POSIX::                       New features from the POSIX standard.
+* BTL::                         New features from Brian Kernighan's version of
+                                @command{awk}.
+* POSIX/GNU::                   The extensions in @command{gawk} not in POSIX
+                                @command{awk}.
+* Feature History::             The history of the features in @command{gawk}.
+* Common Extensions::           Common Extensions Summary.
+* Ranges and Locales::          How locales used to affect regexp ranges.
+* Contributors::                The major contributors to @command{gawk}.
+* History summary::             History summary.
+@end menu
+
+@node V7/SVR3.1
+@appendixsec Major Changes Between V7 and SVR3.1
+@cindex @command{awk}, versions of
+@cindex @command{awk}, versions of, changes between V7 and SVR3.1
+
+The @command{awk} language evolved considerably between the release of
+Version 7 Unix (1978) and the new version that was first made generally available in
+System V Release 3.1 (1987).  This @value{SECTION} summarizes the changes, with
+cross-references to further details:
+
+@itemize @value{BULLET}
+@item
+The requirement for @samp{;} to separate rules on a line
+(@pxref{Statements/Lines})
+
+@item
+User-defined functions and the @code{return} statement
+(@pxref{User-defined})
+
+@item
+The @code{delete} statement (@pxref{Delete})
+
+@item
+The @code{do}-@code{while} statement
+(@pxref{Do Statement})
+
+@item
+The built-in functions @code{atan2()}, @code{cos()}, @code{sin()}, @code{rand()}, and
+@code{srand()} (@pxref{Numeric Functions})
+
+@item
+The built-in functions @code{gsub()}, @code{sub()}, and @code{match()}
+(@pxref{String Functions})
+
+@item
+The built-in functions @code{close()} and @code{system()}
+(@pxref{I/O Functions})
+
+@item
+The @code{ARGC}, @code{ARGV}, @code{FNR}, @code{RLENGTH}, @code{RSTART},
+and @code{SUBSEP} predefined variables (@pxref{Built-in Variables})
+
+@item
+Assignable @code{$0} (@pxref{Changing Fields})
+
+@item
+The conditional expression using the ternary operator @samp{?:}
+(@pxref{Conditional Exp})
+
+@item
+The expression @samp{@var{indx} in @var{array}} outside of @code{for}
+statements (@pxref{Reference to Elements})
+
+@item
+The exponentiation operator @samp{^}
+(@pxref{Arithmetic Ops}) and its assignment operator
+form @samp{^=} (@pxref{Assignment Ops})
+
+@item
+C-compatible operator precedence, which breaks some old @command{awk}
+programs (@pxref{Precedence})
+
+@item
+Regexps as the value of @code{FS}
+(@pxref{Field Separators}) and as the
+third argument to the @code{split()} function
+(@pxref{String Functions}), rather than using only the first character
+of @code{FS}
+
+@item
+Dynamic regexps as operands of the @samp{~} and @samp{!~} operators
+(@pxref{Computed Regexps})
+
+@item
+The escape sequences @samp{\b}, @samp{\f}, and @samp{\r}
+(@pxref{Escape Sequences})
+
+@item
+Redirection of input for the @code{getline} function
+(@pxref{Getline})
+
+@item
+Multiple @code{BEGIN} and @code{END} rules
+(@pxref{BEGIN/END})
+
+@item
+Multidimensional arrays
+(@pxref{Multidimensional})
+@end itemize
+
+@node SVR4
+@appendixsec Changes Between SVR3.1 and SVR4
+
+@cindex @command{awk}, versions of, changes between SVR3.1 and SVR4
+The System V Release 4 (1989) version of Unix @command{awk} added these features
+(some of which originated in @command{gawk}):
+
+@itemize @value{BULLET}
+@item
+The @code{ENVIRON} array (@pxref{Built-in Variables})
+@c gawk and MKS awk
+
+@item
+Multiple @option{-f} options on the command line
+(@pxref{Options})
+@c MKS awk
+
+@item
+The @option{-v} option for assigning variables before program execution begins
+(@pxref{Options})
+@c GNU, Bell Laboratories & MKS together
+
+@item
+The @option{--} signal for terminating command-line options
+
+@item
+The @samp{\a}, @samp{\v}, and @samp{\x} escape sequences
+(@pxref{Escape Sequences})
+@c GNU, for ANSI C compat
+
+@item
+A defined return value for the @code{srand()} built-in function
+(@pxref{Numeric Functions})
+
+@item
+The @code{toupper()} and @code{tolower()} built-in string functions
+for case translation
+(@pxref{String Functions})
+
+@item
+A cleaner specification for the @samp{%c} format-control letter in the
+@code{printf} function
+(@pxref{Control Letters})
+
+@item
+The ability to dynamically pass the field width and precision (@code{"%*.*d"})
+in the argument list of @code{printf} and @code{sprintf()}
+(@pxref{Control Letters})
+
+@item
+The use of regexp constants, such as @code{/foo/}, as expressions, where
+they are equivalent to using the matching operator, as in @samp{$0 ~ /foo/}
+(@pxref{Using Constant Regexps})
+
+@item
+Processing of escape sequences inside command-line variable assignments
+(@pxref{Assignment Options})
+@end itemize
+
+@node POSIX
+@appendixsec Changes Between SVR4 and POSIX @command{awk}
+@cindex @command{awk}, versions of, changes between SVR4 and POSIX @command{awk}
+@cindex POSIX @command{awk}, changes in @command{awk} versions
+
+The POSIX Command Language and Utilities standard for @command{awk} (1992)
+introduced the following changes into the language:
+
+@itemize @value{BULLET}
+@item
+The use of @option{-W} for implementation-specific options
+(@pxref{Options})
+
+@item
+The use of @code{CONVFMT} for controlling the conversion of numbers
+to strings (@pxref{Conversion})
+
+@item
+The concept of a numeric string and tighter comparison rules to go
+with it (@pxref{Typing and Comparison})
+
+@item
+The use of predefined variables as function parameter names is forbidden
+(@pxref{Definition Syntax})
+
+@item
+More complete documentation of many of the previously undocumented
+features of the language
+@end itemize
+
+In 2012, a number of extensions that had been commonly available for
+many years were finally added to POSIX. They are:
+
+@itemize @value{BULLET}
+@item
+The @code{fflush()} built-in function for flushing buffered output
+(@pxref{I/O Functions})
+
+@item
+The @code{nextfile} statement
+(@pxref{Nextfile Statement})
+
+@item
+The ability to delete all of an array at once with @samp{delete @var{array}}
+(@pxref{Delete})
+
+@end itemize
+
+@xref{Common Extensions} for a list of common extensions
+not permitted by the POSIX standard.
+
+The 2008 POSIX standard can be found online at
+@url{http://pubs.opengroup.org/onlinepubs/9699919799/}.
+
+
+@node BTL
+@appendixsec Extensions in Brian Kernighan's @command{awk}
+
+@cindex @command{awk}, versions of, See Also Brian Kernighan's @command{awk}
+@cindex extensions, Brian Kernighan's @command{awk}
+@cindex Brian Kernighan's @command{awk}, extensions
+@cindex Kernighan, Brian
+Brian Kernighan
+has made his version available via his home page
+(@pxref{Other Versions}).
+
+This @value{SECTION} describes common extensions that
+originally appeared in his version of @command{awk}:
+
+@itemize @value{BULLET}
+@item
+The @samp{**} and @samp{**=} operators
+(@pxref{Arithmetic Ops}
+and
+@ref{Assignment Ops})
+
+@item
+The use of @code{func} as an abbreviation for @code{function}
+(@pxref{Definition Syntax})
+
+@item
+The @code{fflush()} built-in function for flushing buffered output
+(@pxref{I/O Functions})
+
+@ignore
+@item
+The @code{SYMTAB} array, that allows access to @command{awk}'s internal symbol
+table. This feature was never documented for his @command{awk}, largely because
+it is somewhat shakily implemented. For instance, you cannot access arrays
+or array elements through it
+@end ignore
+@end itemize
+
+@xref{Common Extensions} for a full list of the extensions
+available in his @command{awk}.
+
+@node POSIX/GNU
+@appendixsec Extensions in @command{gawk} Not in POSIX @command{awk}
+
+@cindex compatibility mode (@command{gawk}), extensions
+@cindex extensions, in @command{gawk}, not in POSIX @command{awk}
+@cindex POSIX, @command{gawk} extensions not included in
+The GNU implementation, @command{gawk}, adds a large number of features.
+They can all be disabled with either the @option{--traditional} or
+@option{--posix} options
+(@pxref{Options}).
+
+A number of features have come and gone over the years. This @value{SECTION}
+summarizes the additional features over POSIX @command{awk} that are
+in the current version of @command{gawk}.
+
+@itemize @value{BULLET}
+
+@item
+Additional predefined variables:
+
+@itemize @value{MINUS}
+@item
+The
+@code{ARGIND},
+@code{BINMODE},
+@code{ERRNO},
+@code{FIELDWIDTHS},
+@code{FPAT},
+@code{IGNORECASE},
+@code{LINT},
+@code{PROCINFO},
+@code{RT},
+and
+@code{TEXTDOMAIN}
+variables
+(@pxref{Built-in Variables})
+@end itemize
+
+@item
+Special files in I/O redirections:
+
+@itemize @value{MINUS}
+@item
+The @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr}, and
+@file{/dev/fd/@var{N}} special @value{FN}s
+(@pxref{Special Files})
+
+@item
+The @file{/inet}, @file{/inet4}, and @file{/inet6} special files for
+TCP/IP networking using @samp{|&} to specify which version of the
+IP protocol to use
+(@pxref{TCP/IP Networking})
+@end itemize
+
+@item
+Changes and/or additions to the language:
+
+@itemize @value{MINUS}
+@item
+The @samp{\x} escape sequence
+(@pxref{Escape Sequences})
+
+@item
+Full support for both POSIX and GNU regexps
+(@pxref{Regexp})
+
+@item
+The ability for @code{FS} and for the third
+argument to @code{split()} to be null strings
+(@pxref{Single Character Fields})
+
+@item
+The ability for @code{RS} to be a regexp
+(@pxref{Records})
+
+@item
+The ability to use octal and hexadecimal constants in @command{awk}
+program source code
+(@pxref{Nondecimal-numbers})
+
+@item
+The @samp{|&} operator for two-way I/O to a coprocess
+(@pxref{Two-way I/O})
+
+@item
+Indirect function calls
+(@pxref{Indirect Calls})
+
+@item
+Directories on the command line produce a warning and are skipped
+(@pxref{Command-line directories})
+
+@item
+Output with @code{print} and @code{printf} need not be fatal
+(@pxref{Nonfatal})
+@end itemize
+
+@item
+New keywords:
+
+@itemize @value{MINUS}
+@item
+The @code{BEGINFILE} and @code{ENDFILE} special patterns
+(@pxref{BEGINFILE/ENDFILE})
+
+@item
+The @code{switch} statement
+(@pxref{Switch Statement})
+@end itemize
+
+@item
+Changes to standard @command{awk} functions:
+
+@itemize @value{MINUS}
+@item
+The optional second argument to @code{close()} that allows closing one end
+of a two-way pipe to a coprocess
+(@pxref{Two-way I/O})
+
+@item
+POSIX compliance for @code{gsub()} and @code{sub()} with @option{--posix}
+
+@item
+The @code{length()} function accepts an array argument
+and returns the number of elements in the array
+(@pxref{String Functions})
+
+@item
+The optional third argument to the @code{match()} function
+for capturing text-matching subexpressions within a regexp
+(@pxref{String Functions})
+
+@item
+Positional specifiers in @code{printf} formats for
+making translations easier
+(@pxref{Printf Ordering})
+
+@item
+The @code{split()} function's additional optional fourth
+argument, which is an array to hold the text of the field separators
+(@pxref{String Functions})
+@end itemize
+
+@item
+Additional functions only in @command{gawk}:
+
+@itemize @value{MINUS}
+@item
+The @code{gensub()}, @code{patsplit()}, and @code{strtonum()} functions
+for more powerful text manipulation
+(@pxref{String Functions})
+
+@item
+The @code{asort()} and @code{asorti()} functions for sorting arrays
+(@pxref{Array Sorting})
+
+@item
+The @code{mktime()}, @code{systime()}, and @code{strftime()}
+functions for working with timestamps
+(@pxref{Time Functions})
+
+@item
+The
+@code{and()},
+@code{compl()},
+@code{lshift()},
+@code{or()},
+@code{rshift()},
+and
+@code{xor()}
+functions for bit manipulation
+(@pxref{Bitwise Functions})
+@c In 4.1, and(), or() and xor() grew the ability to take > 2 arguments
+
+@item
+The @code{isarray()} function to check if a variable is an array or not
+(@pxref{Type Functions})
+
+@item
+The @code{bindtextdomain()}, @code{dcgettext()}, and @code{dcngettext()}
+functions for internationalization
+(@pxref{Programmer i18n})
+
+@ifset INTDIV
+@item
+The @code{intdiv0()} function for doing integer
+division and remainder
+(@pxref{Numeric Functions})
+@end ifset
+@end itemize
+
+@item
+Changes and/or additions in the command-line options:
+
+@itemize @value{MINUS}
+@item
+The @env{AWKPATH} environment variable for specifying a path search for
+the @option{-f} command-line option
+(@pxref{Options})
+
+@item
+The @env{AWKLIBPATH} environment variable for specifying a path search for
+the @option{-l} command-line option
+(@pxref{Options})
+
+@item
+The
+@option{-b},
+@option{-c},
+@option{-C},
+@option{-d},
+@option{-D},
+@option{-e},
+@option{-E},
+@option{-g},
+@option{-h},
+@option{-i},
+@option{-l},
+@option{-L},
+@option{-M},
+@option{-n},
+@option{-N},
+@option{-o},
+@option{-O},
+@option{-p},
+@option{-P},
+@option{-r},
+@option{-s},
+@option{-S},
+@option{-t},
+and
+@option{-V}
+short options. Also, the
+ability to use GNU-style long-named options that start with @option{--},
+and the
+@option{--assign},
+@option{--bignum},
+@option{--characters-as-bytes},
+@option{--copyright},
+@option{--debug},
+@option{--dump-variables},
+@option{--exec},
+@option{--field-separator},
+@option{--file},
+@option{--gen-pot},
+@option{--help},
+@option{--include},
+@option{--lint},
+@option{--lint-old},
+@option{--load},
+@option{--non-decimal-data},
+@option{--optimize},
+@option{--no-optimize},
+@option{--posix},
+@option{--pretty-print},
+@option{--profile},
+@option{--re-interval},
+@option{--sandbox},
+@option{--source},
+@option{--traditional},
+@option{--use-lc-numeric},
+and
+@option{--version}
+long options
+(@pxref{Options}).
+@end itemize
+
+@c       new ports
+
+@item
+Support for the following obsolete systems was removed from the code
+and the documentation for @command{gawk} @value{PVERSION} 4.0:
+
+@c nested table
+@itemize @value{MINUS}
+@item
+Amiga
+
+@item
+Atari
+
+@item
+BeOS
+
+@item
+Cray
+
+@item
+MIPS RiscOS
+
+@item
+MS-DOS with the Microsoft Compiler
+
+@item
+MS-Windows with the Microsoft Compiler
+
+@item
+NeXT
+
+@item
+SunOS 3.x, Sun 386 (Road Runner)
+
+@item
+Tandem (non-POSIX)
+
+@item
+Prestandard VAX C compiler for VAX/VMS
+
+@item
+GCC for VAX and Alpha has not been tested for a while.
+
+@end itemize
+
+@item
+Support for the following obsolete system was removed from the code
+for @command{gawk} @value{PVERSION} 4.1:
+
+@c nested table
+@itemize @value{MINUS}
+@item
+Ultrix
+@end itemize
+
+@item
+Support for the following systems was removed from the code
+for @command{gawk} @value{PVERSION} 4.2:
+
+@c nested table
+@itemize @value{MINUS}
+@item
+MirBSD
+
+@item
+GNU/Linux on Alpha
+@end itemize
+
+@end itemize
+
+@c XXX ADD MORE STUFF HERE
+
+
+@c This does not need to be in the formal book.
+@ifclear FOR_PRINT
+@node Feature History
+@appendixsec History of @command{gawk} Features
+
+@ignore
+See the thread:
+https://groups.google.com/forum/#!topic/comp.lang.awk/SAUiRuff30c
+This motivated me to add this section.
+@end ignore
+
+@ignore
+I've tried to follow this general order, esp.@: for the 3.0 and 3.1 sections:
+       variables
+       special files
+       language changes (e.g., hex constants)
+       differences in standard awk functions
+       new gawk functions
+       new keywords
+       new command-line options
+       behavioral changes
+       extension API changes
+       new / deprecated / removed ports
+       installation time stuff
+Within each category, be alphabetical.
+@end ignore
+
+This @value{SECTION} describes the features in @command{gawk}
+over and above those in POSIX @command{awk},
+in the order they were added to @command{gawk}.
+
+Version 2.10 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+The @env{AWKPATH} environment variable for specifying a path search for
+the @option{-f} command-line option
+(@pxref{Options}).
+
+@item
+The @code{IGNORECASE} variable and its effects
+(@pxref{Case-sensitivity}).
+
+@item
+The @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr} and
+@file{/dev/fd/@var{N}} special @value{FN}s
+(@pxref{Special Files}).
+@end itemize
+
+Version 2.13 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+The @code{FIELDWIDTHS} variable and its effects
+(@pxref{Constant Size}).
+
+@item
+The @code{systime()} and @code{strftime()} built-in functions for obtaining
+and printing timestamps
+(@pxref{Time Functions}).
+
+@item
+Additional command-line options
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The @option{-W lint} option to provide error and portability checking
+for both the source code and at runtime.
+
+@item
+The @option{-W compat} option to turn off the GNU extensions.
+
+@item
+The @option{-W posix} option for full POSIX compliance.
+@end itemize
+@end itemize
+
+Version 2.14 of @command{gawk} introduced the following feature:
+
+@itemize @value{BULLET}
+@item
+The @code{next file} statement for skipping to the next @value{DF}
+(@pxref{Nextfile Statement}).
+@end itemize
+
+Version 2.15 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+New variables (@pxref{Built-in Variables}):
+
+@itemize @value{MINUS}
+@item
+@code{ARGIND}, which tracks the movement of @code{FILENAME}
+through @code{ARGV}.
+
+@item
+@code{ERRNO}, which contains the system error message when
+@code{getline} returns @minus{}1 or @code{close()} fails.
+@end itemize
+
+@item
+The @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}, and
+@file{/dev/user} special @value{FN}s. These have since been removed.
+
+@item
+The ability to delete all of an array at once with @samp{delete @var{array}}
+(@pxref{Delete}).
+
+@item
+Command-line option changes
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The ability to use GNU-style long-named options that start with @option{--}.
+
+@item
+The @option{--source} option for mixing command-line and library-file
+source code.
+@end itemize
+@end itemize
+
+Version 3.0 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+New or changed variables:
+
+@itemize @value{MINUS}
+@item
+@code{IGNORECASE} changed, now applying to string comparison as well
+as regexp operations
+(@pxref{Case-sensitivity}).
+
+@item
+@code{RT}, which contains the input text that matched @code{RS}
+(@pxref{Records}).
+@end itemize
+
+@item
+Full support for both POSIX and GNU regexps
+(@pxref{Regexp}).
+
+@item
+The @code{gensub()} function for more powerful text manipulation
+(@pxref{String Functions}).
+
+@item
+The @code{strftime()} function acquired a default time format,
+allowing it to be called with no arguments
+(@pxref{Time Functions}).
+
+@item
+The ability for @code{FS} and for the third
+argument to @code{split()} to be null strings
+(@pxref{Single Character Fields}).
+
+@item
+The ability for @code{RS} to be a regexp
+(@pxref{Records}).
+
+@item
+The @code{next file} statement became @code{nextfile}
+(@pxref{Nextfile Statement}).
+
+@item
+The @code{fflush()} function from
+BWK @command{awk}
+(then at Bell Laboratories;
+@pxref{I/O Functions}).
+
+@item
+New command-line options:
+
+@itemize @value{MINUS}
+@item
+The @option{--lint-old} option to
+warn about constructs that are not available in
+the original Version 7 Unix version of @command{awk}
+(@pxref{V7/SVR3.1}).
+
+@item
+The @option{-m} option from BWK @command{awk}.  (Brian was
+still at Bell Laboratories at the time.)  This was later removed from
+both his @command{awk} and from @command{gawk}.
+
+@item
+The @option{--re-interval} option to provide interval expressions in regexps
+(@pxref{Regexp Operators}).
+
+@item
+The @option{--traditional} option was added as a better name for
+@option{--compat} (@pxref{Options}).
+@end itemize
+
+@item
+The use of GNU Autoconf to control the configuration process
+(@pxref{Quick Installation}).
+
+@item
+Amiga support.
+This has since been removed.
+
+@end itemize
+
+Version 3.1 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+@item
+New variables
+(@pxref{Built-in Variables}):
+
+@itemize @value{MINUS}
+@item
+@code{BINMODE}, for non-POSIX systems,
+which allows binary I/O for input and/or output files
+(@pxref{PC Using}).
+
+@item
+@code{LINT}, which dynamically controls lint warnings.
+
+@item
+@code{PROCINFO}, an array for providing process-related information.
+
+@item
+@code{TEXTDOMAIN}, for setting an application's internationalization text domain
+(@pxref{Internationalization}).
+@end itemize
+
+@item
+The ability to use octal and hexadecimal constants in @command{awk}
+program source code
+(@pxref{Nondecimal-numbers}).
+
+@item
+The @samp{|&} operator for two-way I/O to a coprocess
+(@pxref{Two-way I/O}).
+
+@item
+The @file{/inet} special files for TCP/IP networking using @samp{|&}
+(@pxref{TCP/IP Networking}).
+
+@item
+The optional second argument to @code{close()} that allows closing one end
+of a two-way pipe to a coprocess
+(@pxref{Two-way I/O}).
+
+@item
+The optional third argument to the @code{match()} function
+for capturing text-matching subexpressions within a regexp
+(@pxref{String Functions}).
+
+@item
+Positional specifiers in @code{printf} formats for
+making translations easier
+(@pxref{Printf Ordering}).
+
+@item
+A number of new built-in functions:
+
+@itemize @value{MINUS}
+@item
+The @code{asort()} and @code{asorti()} functions for sorting arrays
+(@pxref{Array Sorting}).
+
+@item
+The @code{bindtextdomain()}, @code{dcgettext()} and @code{dcngettext()} functions
+for internationalization
+(@pxref{Programmer i18n}).
+
+@item
+The @code{extension()} function and the ability to add
+new built-in functions dynamically
+(@pxref{Dynamic Extensions}).
+
+@item
+The @code{mktime()} function for creating timestamps
+(@pxref{Time Functions}).
+
+@item
+The @code{and()}, @code{or()}, @code{xor()}, @code{compl()},
+@code{lshift()}, @code{rshift()}, and @code{strtonum()} functions
+(@pxref{Bitwise Functions}).
+@end itemize
+
+@item
+@cindex @code{next file} statement
+The support for @samp{next file} as two words was removed completely
+(@pxref{Nextfile Statement}).
+
+@item
+Additional command-line options
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The @option{--dump-variables} option to print a list of all global variables.
+
+@item
+The @option{--exec} option, for use in CGI scripts.
+
+@item
+The @option{--gen-po} command-line option and the use of a leading
+underscore to mark strings that should be translated
+(@pxref{String Extraction}).
+
+@item
+The @option{--non-decimal-data} option to allow non-decimal
+input data
+(@pxref{Nondecimal Data}).
+
+@item
+The @option{--profile} option and @command{pgawk}, the
+profiling version of @command{gawk}, for producing execution
+profiles of @command{awk} programs
+(@pxref{Profiling}).
+
+@item
+The @option{--use-lc-numeric} option to force @command{gawk}
+to use the locale's decimal point for parsing input data
+(@pxref{Conversion}).
+@end itemize
+
+@item
+The use of GNU Automake to help in standardizing the configuration process
+(@pxref{Quick Installation}).
+
+@item
+The use of GNU @command{gettext} for @command{gawk}'s own message output
+(@pxref{Gawk I18N}).
+
+@item
+BeOS support. This was later removed.
+
+@item
+Tandem support. This was later removed.
+
+@item
+The Atari port became officially unsupported and was
+later removed entirely.
+
+@item
+The source code changed to use ISO C standard-style function definitions.
+
+@item
+POSIX compliance for @code{sub()} and @code{gsub()}
+(@pxref{Gory Details}).
+
+@item
+The @code{length()} function was extended to accept an array argument
+and return the number of elements in the array
+(@pxref{String Functions}).
+
+@item
+The @code{strftime()} function acquired a third argument to
+enable printing times as UTC
+(@pxref{Time Functions}).
+@end itemize
+
+Version 4.0 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+
+@item
+Variable additions:
+
+@itemize @value{MINUS}
+@item
+@code{FPAT}, which allows you to specify a regexp that matches
+the fields, instead of matching the field separator
+(@pxref{Splitting By Content}).
+
+@item
+If @code{PROCINFO["sorted_in"]} exists, @samp{for(iggy in foo)} loops sort the
+indices before looping over them.  The value of this element
+provides control over how the indices are sorted before the loop
+traversal starts
+(@pxref{Controlling Scanning}).
+
+@item
+@code{PROCINFO["strftime"]}, which holds
+the default format for @code{strftime()}
+(@pxref{Time Functions}).
+@end itemize
+
+@item
+The special files @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}
+and @file{/dev/user} were removed.
+
+@item
+Support for IPv6 was added via the @file{/inet6} special file.
+@file{/inet4} forces IPv4 and @file{/inet} chooses the system
+default, which is probably IPv4
+(@pxref{TCP/IP Networking}).
+
+@item
+The use of @samp{\s} and @samp{\S} escape sequences in regular expressions
+(@pxref{GNU Regexp Operators}).
+
+@item
+Interval expressions became part of default regular expressions
+(@pxref{Regexp Operators}).
+
+@item
+POSIX character classes work even with @option{--traditional}
+(@pxref{Regexp Operators}).
+
+@item
+@code{break} and @code{continue} became invalid outside a loop,
+even with @option{--traditional}
+(@pxref{Break Statement}, and also see
+@ref{Continue Statement}).
+
+@item
+@code{fflush()}, @code{nextfile}, and @samp{delete @var{array}}
+are allowed if @option{--posix} or @option{--traditional}, since they
+are all now part of POSIX.
+
+@item
+An optional third argument to
+@code{asort()} and @code{asorti()}, specifying how to sort
+(@pxref{String Functions}).
+
+@item
+The behavior of @code{fflush()} changed to match BWK @command{awk}
+and for POSIX; now both @samp{fflush()} and @samp{fflush("")}
+flush all open output redirections
+(@pxref{I/O Functions}).
+
+@item
+The @code{isarray()}
+function which distinguishes if an item is an array
+or not, to make it possible to traverse arrays of arrays
+(@pxref{Type Functions}).
+
+@item
+The @code{patsplit()}
+function which gives the same capability as @code{FPAT}, for splitting
+(@pxref{String Functions}).
+
+@item
+An optional fourth argument to the @code{split()} function,
+which is an array to hold the values of the separators
+(@pxref{String Functions}).
+
+@item
+Arrays of arrays
+(@pxref{Arrays of Arrays}).
+
+@item
+The @code{BEGINFILE} and @code{ENDFILE} special patterns
+(@pxref{BEGINFILE/ENDFILE}).
+
+@item
+Indirect function calls
+(@pxref{Indirect Calls}).
+
+@item
+@code{switch} / @code{case} are enabled by default
+(@pxref{Switch Statement}).
+
+@item
+Command-line option changes
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The @option{-b} and @option{--characters-as-bytes} options
+which prevent @command{gawk} from treating input as a multibyte string.
+
+@item
+The redundant @option{--compat}, @option{--copyleft}, and @option{--usage}
+long options were removed.
+
+@item
+The @option{--gen-po} option was finally renamed to the correct @option{--gen-pot}.
+
+@item
+The @option{--sandbox} option which disables certain features.
+
+@item
+All long options acquired corresponding short options, for use in @samp{#!} scripts.
+@end itemize
+
+@item
+Directories named on the command line now produce a warning, not a fatal
+error, unless @option{--posix} or @option{--traditional} are used
+(@pxref{Command-line directories}).
+
+@item
+The @command{gawk} internals were rewritten, bringing the @command{dgawk}
+debugger and possibly improved performance
+(@pxref{Debugger}).
+
+@item
+Per the GNU Coding Standards, dynamic extensions must now define
+a global symbol indicating that they are GPL-compatible
+(@pxref{Plugin License}).
+
+@item
+In POSIX mode, string comparisons use @code{strcoll()} / @code{wcscoll()}
+(@pxref{POSIX String Comparison}).
+
+@item
+The option for raw sockets was removed, since it was never implemented
+(@pxref{TCP/IP Networking}).
+
+@item
+Ranges of the form @samp{[d-h]} are treated as if they were in the
+C locale, no matter what kind of regexp is being used, and even if
+@option{--posix}
+(@pxref{Ranges and Locales}).
+
+@item
+Support was removed for the following systems:
+
+@itemize @value{MINUS}
+@item
+Atari
+
+@item
+Amiga
+
+@item
+BeOS
+
+@item
+Cray
+
+@item
+MIPS RiscOS
+
+@item
+MS-DOS with the Microsoft Compiler
+
+@item
+MS-Windows with the Microsoft Compiler
+
+@item
+NeXT
+
+@item
+SunOS 3.x, Sun 386 (Road Runner)
+
+@item
+Tandem (non-POSIX)
+
+@item
+Prestandard VAX C compiler for VAX/VMS
+@end itemize
+@end itemize
+
+Version 4.1 of @command{gawk} introduced the following features:
+
+@itemize @value{BULLET}
+
+@item
+Three new arrays:
+@code{SYMTAB}, @code{FUNCTAB}, and @code{PROCINFO["identifiers"]}
+(@pxref{Auto-set}).
+
+@item
+The three executables @command{gawk}, @command{pgawk}, and @command{dgawk}, were merged into
+one, named just @command{gawk}.  As a result the command-line options changed.
+
+@item
+Command-line option changes
+(@pxref{Options}):
+
+@itemize @value{MINUS}
+@item
+The @option{-D} option invokes the debugger.
+
+@item
+The @option{-i} and @option{--include} options
+load @command{awk} library files.
+
+@item
+The @option{-l} and @option{--load} options load compiled dynamic extensions.
+
+@item
+The @option{-M} and @option{--bignum} options enable MPFR.
+
+@item
+The @option{-o} option only does pretty-printing.
+
+@item
+The @option{-p} option is used for profiling.
+
+@item
+The @option{-R} option was removed.
+@end itemize
+
+@item
+Support for high precision arithmetic with MPFR
+(@pxref{Arbitrary Precision Arithmetic}).
+
+@item
+The @code{and()}, @code{or()} and @code{xor()} functions
+changed to allow any number of arguments,
+with a minimum of two
+(@pxref{Bitwise Functions}).
+
+@item
+The dynamic extension interface was completely redone
+(@pxref{Dynamic Extensions}).
+
+@item
+Redirected @code{getline} became allowed inside
+@code{BEGINFILE} and @code{ENDFILE}
+(@pxref{BEGINFILE/ENDFILE}).
+
+@item
+The @code{where} command was added to the debugger
+(@pxref{Execution Stack}).
+
+@item
+Support for Ultrix was removed.
+
+@end itemize
+
+Version 4.2 of @command{gawk} introduced the following changes:
+
+@itemize @bullet
+@item
+Changes to @code{ENVIRON} are reflected into @command{gawk}'s
+environment and that of programs that it runs.
+@xref{Auto-set}.
+
+@item
+@code{FIELDWIDTHS} was enhanced to allow skipping characters
+before assigning a value to a field
+(@pxref{Splitting By Content}).
+
+@item
+The @code{PROCINFO["argv"]} array.
+@xref{Auto-set}.
+
+@item
+The maximum number of hexadecimal digits in @samp{\x} escapes
+is now two.
+@xref{Escape Sequences}.
+
+@item
+Strongly typed regexp constants of the form @samp{@@/@dots{}/}
+(@pxref{Strong Regexp Constants}).
+
+@item
+The bitwise functions changed, making negative arguments into
+a fatal error (@pxref{Bitwise Functions}).
+
+@ifset INTDIV
+@item
+The @code{intdiv0()} function.
+@xref{Numeric Functions}.
+@end ifset
+
+@item
+The @code{mktime()} function now accepts an optional
+second argument
+(@pxref{Time Functions}).
+
+@item
+The @code{typeof()} function (@pxref{Type Functions}).
+
+@item
+Optimizations are enabled by default. Use @option{-s} /
+@option{--no-optimize} to disable optimizations.
+
+@item
+For many years, POSIX specified that default field splitting
+only allowed spaces and tabs to separate fields, and this was
+how @command{gawk} behaved with @option{--posix}. As of 2013,
+the standard restored historical behavior, and now default
+field splitting with @option{--posix} also allows newlines to
+separate fields.
+
+@item
+Nonfatal output with @code{print} and @code{printf}.
+@xref{Nonfatal}.
+
+@item
+Retryable I/O via @code{PROCINFO[@var{input-file}, "RETRY"]};
+(@pxref{Retrying Input}).
+
+@item
+Changes to the pretty-printer (@pxref{Profiling}):
+
+@c nested table
+@itemize @value{MINUS}
+@item
+The @option{--pretty-print} option no longer runs the @command{awk}
+program too.
+
+@item
+Comments in the source program are preserved and placed into the
+output file.
+
+@item
+Explicit parentheses for expressions
+in the input are preserved in the generated output.
+@end itemize
+
+@item
+Improvements to the extension API
+(@pxref{Dynamic Extensions}):
+
+@c nested
+@itemize @value{MINUS}
+@item
+The @code{get_file()} function to access open redirections.
+
+@item
+The @code{nonfatal()} function for generating nonfatal error messages.
+
+@item
+Support for GMP and MPFR values.
+
+@item
+Input parsers can now override the default field parsing mechanism
+by specifying explicit locations.
+@end itemize
+
+@item
+Shell startup files are supplied with the distribution and
+installed by @samp{make install} (@pxref{Shell Startup Files}).
+
+@item
+The @command{igawk} program and its manual page are no longer
+installed when @command{gawk} is built.
+@xref{Igawk Program}.
+
+@item
+Support for MirBSD was removed.
+
+@item
+Support for GNU/Linux on Alpha was removed.
+
+@end itemize
+
+Version 5.0 added the following features:
+
+@itemize
+@item
+The @code{PROCINFO["platform"]} array element, which allows you
+to write code that takes the operating system / platform into account.
+@end itemize
+
+@c XXX ADD MORE STUFF HERE
+@end ifclear
+
+@node Common Extensions
+@appendixsec Common Extensions Summary
+
+@cindex extensions, Brian Kernighan's @command{awk}
+@cindex extensions, @command{mawk}
+The following table summarizes the common extensions supported
+by @command{gawk}, Brian Kernighan's @command{awk}, and @command{mawk},
+the three most widely used freely available versions of @command{awk}
+(@pxref{Other Versions}).
+
+@multitable {@file{/dev/stderr} special file} {BWK @command{awk}} {@command{mawk}} {@command{gawk}} {Now standard}
+@headitem Feature @tab BWK @command{awk} @tab @command{mawk} @tab @command{gawk} @tab Now standard
+@item @samp{\x} escape sequence @tab X @tab X @tab X @tab
+@item @code{FS} as null string @tab X @tab X @tab X @tab
+@item @file{/dev/stdin} special file @tab X @tab X @tab X @tab
+@item @file{/dev/stdout} special file @tab X @tab X @tab X @tab
+@item @file{/dev/stderr} special file @tab X @tab X @tab X @tab
+@item @code{delete} without subscript @tab X @tab X @tab X @tab X
+@item @code{fflush()} function @tab X @tab X @tab X @tab X
+@item @code{length()} of an array @tab X @tab X @tab X @tab
+@item @code{nextfile} statement @tab X @tab X @tab X @tab X
+@item @code{**} and @code{**=} operators @tab X @tab @tab X @tab
+@item @code{func} keyword @tab X @tab @tab X @tab
+@item @code{BINMODE} variable @tab @tab X @tab X @tab
+@item @code{RS} as regexp @tab @tab X @tab X @tab
+@item Time-related functions @tab @tab X @tab X @tab
+@end multitable
+
+@node Ranges and Locales
+@appendixsec Regexp Ranges and Locales: A Long Sad Story
+
+This @value{SECTION} describes the confusing history of ranges within
+regular expressions and their interactions with locales, and how this
+affected different versions of @command{gawk}.
+
+The original Unix tools that worked with regular expressions defined
+character ranges (such as @samp{[a-z]}) to match any character between
+the first character in the range and the last character in the range,
+inclusive.  Ordering was based on the numeric value of each character
+in the machine's native character set.  Thus, on ASCII-based systems,
+@samp{[a-z]} matched all the lowercase letters, and only the lowercase
+letters, as the numeric values for the letters from @samp{a} through
+@samp{z} were contiguous.  (On an EBCDIC system, the range @samp{[a-z]}
+includes additional nonalphabetic characters as well.)
+
+Almost all introductory Unix literature explained range expressions
+as working in this fashion, and in particular, would teach that the
+``correct'' way to match lowercase letters was with @samp{[a-z]}, and
+that @samp{[A-Z]} was the ``correct'' way to match uppercase letters.
+And indeed, this was true.@footnote{And Life was good.}
+
+The 1992 POSIX standard introduced the idea of locales (@pxref{Locales}).
+Because many locales include other letters besides the plain 26
+letters of the English alphabet, the POSIX standard added
+character classes (@pxref{Bracket Expressions}) as a way to match
+different kinds of characters besides the traditional ones in the ASCII
+character set.
+
+However, the standard @emph{changed} the interpretation of range expressions.
+In the @code{"C"} and @code{"POSIX"} locales, a range expression like
+@samp{[a-dx-z]} is still equivalent to @samp{[abcdxyz]}, as in ASCII.
+But outside those locales, the ordering was defined to be based on
+@dfn{collation order}.
+
+What does that mean?
+In many locales, @samp{A} and @samp{a} are both less than @samp{B}.
+In other words, these locales sort characters in dictionary order,
+and @samp{[a-dx-z]} is typically not equivalent to @samp{[abcdxyz]};
+instead, it might be equivalent to @samp{[ABCXYabcdxyz]}, for example.
+
+This point needs to be emphasized: much literature teaches that you should
+use @samp{[a-z]} to match a lowercase character.  But on systems with
+non-ASCII locales, this also matches all of the uppercase characters
+except @samp{A} or @samp{Z}!  This was a continuous cause of confusion, even well
+into the twenty-first century.
+
+To demonstrate these issues, the following example uses the @code{sub()}
+function, which does text replacement (@pxref{String Functions}).  Here,
+the intent is to remove trailing uppercase characters:
+
+@example
+$ @kbd{echo something1234abc | gawk-3.1.8 '@{ sub("[A-Z]*$", ""); print @}'}
+@print{} something1234a
+@end example
+
+@noindent
+This output is unexpected, as the @samp{bc} at the end of
+@samp{something1234abc} should not normally match @samp{[A-Z]*}.
+This result is due to the locale setting (and thus you may not see
+it on your system).
+
+@cindex Unicode
+Similar considerations apply to other ranges.  For example, @samp{["-/]}
+is perfectly valid in ASCII, but is not valid in many Unicode locales,
+such as @code{en_US.UTF-8}.
+
+Early versions of @command{gawk} used regexp matching code that was not
+locale-aware, so ranges had their traditional interpretation.
+
+When @command{gawk} switched to using locale-aware regexp matchers,
+the problems began; especially as both GNU/Linux and commercial Unix
+vendors started implementing non-ASCII locales, @emph{and making them
+the default}.  Perhaps the most frequently asked question became something
+like, ``Why does @samp{[A-Z]} match lowercase letters?!?''
+
+@cindex Berry, Karl
+This situation existed for close to 10 years, if not more, and
+the @command{gawk} maintainer grew weary of trying to explain that
+@command{gawk} was being nicely standards-compliant, and that the issue
+was in the user's locale.  During the development of @value{PVERSION} 4.0,
+he modified @command{gawk} to always treat ranges in the original,
+pre-POSIX fashion, unless @option{--posix} was used (@pxref{Options}).@footnote{And
+thus was born the Campaign for Rational Range Interpretation (or
+RRI). A number of GNU tools have already implemented this change,
+or will soon.  Thanks to Karl Berry for coining the phrase ``Rational
+Range Interpretation.''}
+
+Fortunately, shortly before the final release of @command{gawk} 4.0,
+the maintainer learned that the 2008 standard had changed the
+definition of ranges, such that outside the @code{"C"} and @code{"POSIX"}
+locales, the meaning of range expressions was @emph{undefined}.@footnote{See
+@uref{http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05, the standard}
+and
+@uref{http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap09.html#tag_21_09_03_05, its rationale}.}
+
+By using this lovely technical term, the standard gives license
+to implementers to implement ranges in whatever way they choose.
+The @command{gawk} maintainer chose to apply the pre-POSIX meaning
+both with the default regexp matching and when @option{--traditional} or
+@option{--posix} are used.
+In all cases @command{gawk} remains POSIX-compliant.
+
+@node Contributors
+@appendixsec Major Contributors to @command{gawk}
+@cindex @command{gawk}, list of contributors to
+@quotation
+@i{Always give credit where credit is due.}
+@author Anonymous
+@end quotation
+
+This @value{SECTION} names the major contributors to @command{gawk}
+and/or this @value{DOCUMENT}, in approximate chronological order:
+
+@itemize @value{BULLET}
+@item
+@cindex Aho, Alfred
+@cindex Weinberger, Peter
+@cindex Kernighan, Brian
+Dr.@: Alfred V.@: Aho,
+Dr.@: Peter J.@: Weinberger, and
+Dr.@: Brian W.@: Kernighan, all of Bell Laboratories,
+designed and implemented Unix @command{awk},
+from which @command{gawk} gets the majority of its feature set.
+
+@item
+@cindex Rubin, Paul
+Paul Rubin
+did the initial design and implementation in 1986, and wrote
+the first draft (around 40 pages) of this @value{DOCUMENT}.
+
+@item
+@cindex Fenlason, Jay
+Jay Fenlason
+finished the initial implementation.
+
+@item
+@cindex Close, Diane
+Diane Close
+revised the first draft of this @value{DOCUMENT}, bringing it
+to around 90 pages.
+
+@item
+@cindex Stallman, Richard
+Richard Stallman
+helped finish the implementation and the initial draft of this
+@value{DOCUMENT}.
+He is also the founder of the FSF and the GNU Project.
+
+@item
+@cindex Woods, John
+John Woods
+contributed parts of the code (mostly fixes) in
+the initial version of @command{gawk}.
+
+@item
+@cindex Trueman, David
+In 1988,
+David Trueman
+took over primary maintenance of @command{gawk},
+making it compatible with ``new'' @command{awk}, and
+greatly improving its performance.
+
+@item
+@cindex Kwok, Conrad
+@cindex Garfinkle, Scott
+@cindex Williams, Kent
+Conrad Kwok,
+Scott Garfinkle,
+and
+Kent Williams
+did the initial ports to MS-DOS with various versions of MSC.
+
+@item
+@cindex Rankin, Pat
+Pat Rankin
+provided the VMS port and its documentation.
+
+@item
+@cindex Peterson, Hal
+Hal Peterson
+provided help in porting @command{gawk} to Cray systems.
+(This is no longer supported.)
+
+@item
+@cindex Rommel, Kai Uwe
+Kai Uwe Rommel
+provided the initial port to OS/2 and its documentation.
+
+@item
+@cindex Jaegermann, Michal
+Michal Jaegermann
+provided the port to Atari systems and its documentation.
+(This port is no longer supported.)
+He continues to provide portability checking,
+and has done a lot of work to make sure @command{gawk}
+works on non-32-bit systems.
+
+@item
+@cindex Fish, Fred
+Fred Fish
+provided the port to Amiga systems and its documentation.
+(With Fred's sad passing, this is no longer supported.)
+
+@item
+@cindex Deifik, Scott
+Scott Deifik
+formerly maintained the MS-DOS port using DJGPP.
+
+@item
+@cindex Zaretskii, Eli
+Eli Zaretskii
+currently maintains the MS-Windows port using MinGW.
+
+@item
+@cindex Grigera, Juan
+Juan Grigera
+provided a port to Windows32 systems.
+(This is no longer supported.)
+
+
+@item
+@cindex Hankerson, Darrel
+For many years,
+Dr.@: Darrel Hankerson
+acted as coordinator for the various ports to different PC platforms
+and created binary distributions for various PC operating systems.
+He was also instrumental in keeping the documentation up to date for
+the various PC platforms.
+
+@item
+@cindex Zoulas, Christos
+Christos Zoulas
+provided the @code{extension()}
+built-in function for dynamically adding new functions.
+(This was obsoleted at @command{gawk} 4.1.)
+
+@item
+@cindex Kahrs, J@"urgen
+J@"urgen Kahrs
+contributed the initial version of the TCP/IP networking
+code and documentation, and motivated the inclusion of the @samp{|&} operator.
+
+@item
+@cindex Davies, Stephen
+Stephen Davies
+provided the initial port to Tandem systems and its documentation.
+(However, this is no longer supported.)
+He was also instrumental in the initial work to integrate the
+byte-code internals into the @command{gawk} code base.
+Additionally, he did most of the work enabling the pretty-printer
+to preserve and output comments.
+
+@item
+@cindex Woehlke, Matthew
+Matthew Woehlke
+provided improvements for Tandem's POSIX-compliant systems.
+
+@item
+@cindex Brown, Martin
+Martin Brown
+provided the port to BeOS and its documentation.
+(This is no longer supported.)
+
+@item
+@cindex Peters, Arno
+Arno Peters
+did the initial work to convert @command{gawk} to use
+GNU Automake and GNU @command{gettext}.
+
+@item
+@cindex Broder, Alan J.@:
+Alan J.@: Broder
+provided the initial version of the @code{asort()} function
+as well as the code for the optional third argument to the
+@code{match()} function.
+
+@item
+@cindex Buening, Andreas
+Andreas Buening
+updated the @command{gawk} port for OS/2.
+
+@item
+@cindex Hasegawa, Isamu
+Isamu Hasegawa,
+of IBM in Japan, contributed support for multibyte characters.
+
+@item
+@cindex Benzinger, Michael
+Michael Benzinger contributed the initial code for @code{switch} statements.
+
+@item
+@cindex McPhee, Patrick
+Patrick T.J.@: McPhee contributed the code for dynamic loading in Windows32
+environments.
+(This is no longer supported.)
+
+@item
+@cindex Wallin, Anders
+Anders Wallin helped keep the VMS port going for several years.
+
+@item
+@cindex Gordon, Assaf
+Assaf Gordon contributed the initial code to implement the
+@option{--sandbox} option.
+
+@item
+@cindex Haque, John
+John Haque made the following contributions:
+
+@itemize @value{MINUS}
+@item
+The modifications to convert @command{gawk}
+into a byte-code interpreter, including the debugger
+
+@item
+The addition of true arrays of arrays
+
+@item
+The additional modifications for support of arbitrary-precision arithmetic
+
+@item
+The initial text of
+@ref{Arbitrary Precision Arithmetic}
+
+@item
+The work to merge the three versions of @command{gawk}
+into one, for the 4.1 release
+
+@item
+Improved array internals for arrays indexed by integers
+
+@item
+The improved array sorting features were also driven by John, together
+with Pat Rankin
+@end itemize
+
+@cindex Papadopoulos, Panos
+@item
+Panos Papadopoulos contributed the original text for @ref{Include Files}.
+
+@item
+@cindex Yawitz, Efraim
+Efraim Yawitz contributed the original text for @ref{Debugger}.
+
+@item
+@cindex Schorr, Andrew
+The development of the extension API first released with
+@command{gawk} 4.1 was driven primarily by
+Arnold Robbins and Andrew Schorr, with notable contributions from
+the rest of the development team.
+
+@cindex Malmberg, John
+@item
+John Malmberg contributed significant improvements to the
+OpenVMS port and the related documentation.
+
+@item
+@cindex Colombo, Antonio
+Antonio Giovanni Colombo rewrote a number of examples in the early
+chapters that were severely dated, for which I am incredibly grateful.
+He also provided and maintains the Italian translation.
+
+@item
+@cindex Curreli, Marco
+Marco Curreli, together with Antonio Colombo, translated this
+@value{DOCUMENT} into Italian.  It is included in the @command{gawk}
+distribution.
+
+@item
+@cindex Guerrero, Juan Manuel
+Juan Manuel Guerrero took over maintenance of the DJGPP port.
+
+@item
+@cindex Robbins, Arnold
+Arnold Robbins
+has been working on @command{gawk} since 1988, at first
+helping David Trueman, and as the primary maintainer since around 1994.
+@end itemize
+
+@node History summary
+@appendixsec Summary
+
+@itemize @value{BULLET}
+@item
+The @command{awk} language has evolved over time. The first release
+was with V7 Unix, circa 1978.  In 1987, for System V Release 3.1,
+major additions, including user-defined functions, were made to the language.
+Additional changes were made for System V Release 4, in 1989.
+Since then, further minor changes have happened under the auspices of the
+POSIX standard.
+
+@item
+Brian Kernighan's @command{awk} provides a small number of extensions
+that are implemented in common with other versions of @command{awk}.
+
+@item
+@command{gawk} provides a large number of extensions over POSIX @command{awk}.
+They can be disabled with either the @option{--traditional} or @option{--posix}
+options.
+
+@item
+The interaction of POSIX locales and regexp matching in @command{gawk} has been confusing over
+the years. Today, @command{gawk} implements Rational Range Interpretation, where
+ranges of the form @samp{[a-z]} match @emph{only} the characters numerically between
+@samp{a} through @samp{z} in the machine's native character set.  Usually this is ASCII,
+but it can be EBCDIC on IBM S/390 systems.
+
+@item
+Many people have contributed to @command{gawk} development over the years.
+We hope that the list provided in this @value{CHAPTER} is complete and gives
+the appropriate credit where credit is due.
+
+@end itemize
+
+@node Installation
+@appendix Installing @command{gawk}
+
+@c last two commas are part of see also
+@cindex operating systems, See Also GNU/Linux@comma{} PC operating systems@comma{} Unix
+@cindex @command{gawk}, installing
+@cindex installing @command{gawk}
+This appendix provides instructions for installing @command{gawk} on the
+various platforms that are supported by the developers.  The primary
+developer supports GNU/Linux (and Unix), whereas the other ports are
+contributed.
+@xref{Bugs}
+for the email addresses of the people who maintain
+the respective ports.
+
+@menu
+* Gawk Distribution::           What is in the @command{gawk} distribution.
+* Unix Installation::           Installing @command{gawk} under various
+                                versions of Unix.
+* Non-Unix Installation::       Installation on Other Operating Systems.
+* Bugs::                        Reporting Problems and Bugs.
+* Other Versions::              Other freely available @command{awk}
+                                implementations.
+* Installation summary::        Summary of installation.
+@end menu
+
+@node Gawk Distribution
+@appendixsec The @command{gawk} Distribution
+@cindex source code, @command{gawk}
+
+This @value{SECTION} describes how to get the @command{gawk}
+distribution, how to extract it, and then what is in the various files and
+subdirectories.
+
+@menu
+* Getting::                     How to get the distribution.
+* Extracting::                  How to extract the distribution.
+* Distribution contents::       What is in the distribution.
+@end menu
+
+@node Getting
+@appendixsubsec Getting the @command{gawk} Distribution
+@cindex @command{gawk}, source code@comma{} obtaining
+There are two ways to get GNU software:
+
+@itemize @value{BULLET}
+@item
+Copy it from someone else who already has it.
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@item
+Retrieve @command{gawk}
+from the Internet host
+@code{ftp.gnu.org}, in the directory @file{/gnu/gawk}.
+Both anonymous @command{ftp} and @code{http} access are supported.
+If you have the @command{wget} program, you can use a command like
+the following:
+
+@example
+wget https://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+@end example
+@end itemize
+
+The GNU software archive is mirrored around the world.
+The up-to-date list of mirror sites is available from
+@uref{https://www.gnu.org/order/ftp.html, the main FSF website}.
+Try to use one of the mirrors; they
+will be less busy, and you can usually find one closer to your site.
+
+You may also retrieve the @command{gawk} source code from the official
+Git repository; for more information see @ref{Accessing The Source}.
+
+@node Extracting
+@appendixsubsec Extracting the Distribution
+@command{gawk} is distributed as several @code{tar} files compressed with
+different compression programs: @command{gzip}, @command{bzip2},
+and @command{xz}. For simplicity, the rest of these instructions assume
+you are using the one compressed with the GNU Gzip program (@command{gzip}).
+
+Once you have the distribution (e.g.,
+@file{gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz}),
+use @code{gzip} to expand the
+file and then use @code{tar} to extract it.  You can use the following
+pipeline to produce the @command{gawk} distribution:
+
+@example
+gzip -d -c gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz | tar -xvpf -
+@end example
+
+On a system with GNU @command{tar}, you can let @command{tar}
+do the decompression for you:
+
+@example
+tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+@end example
+
+@noindent
+Extracting the archive
+creates a directory named @file{gawk-@value{VERSION}.@value{PATCHLEVEL}}
+in the current directory.
+
+The distribution @value{FN} is of the form
+@file{gawk-@var{V}.@var{R}.@var{P}.tar.gz}.
+The @var{V} represents the major version of @command{gawk},
+the @var{R} represents the current release of version @var{V}, and
+the @var{P} represents a @dfn{patch level}, meaning that minor bugs have
+been fixed in the release.  The current patch level is @value{PATCHLEVEL},
+but when retrieving distributions, you should get the version with the highest
+version, release, and patch level.  (Note, however, that patch levels greater than
+or equal to 60 denote ``beta'' or nonproduction software; you might not want
+to retrieve such a version unless you don't mind experimenting.)
+If you are not on a Unix or GNU/Linux system, you need to make other arrangements
+for getting and extracting the @command{gawk} distribution.  You should consult
+a local expert.
+
+@node Distribution contents
+@appendixsubsec Contents of the @command{gawk} Distribution
+@cindex @command{gawk}, distribution
+
+The @command{gawk} distribution has a number of C source files,
+documentation files,
+subdirectories, and files related to the configuration process
+(@pxref{Unix Installation}),
+as well as several subdirectories related to different non-Unix
+operating systems:
+
+@table @asis
+@item Various @samp{.c}, @samp{.y}, and @samp{.h} files
+These files contain the actual @command{gawk} source code.
+@end table
+
+@table @file
+@item support/*
+C header and source files for routines that @command{gawk}
+uses, but that are not part of its core functionality.
+For example, argument parsing, regular expression matching,
+and random number generating routines are all kept here.
+
+@item ABOUT-NLS
+A file containing information about GNU @command{gettext} and translations.
+
+@item AUTHORS
+A file with some information about the authorship of @command{gawk}.
+It exists only to satisfy the pedants at the Free Software Foundation.
+
+@item README
+@itemx README_d/README.*
+Descriptive files: @file{README} for @command{gawk} under Unix and the
+rest for the various hardware and software combinations.
+
+@item INSTALL
+A file providing an overview of the configuration and installation process.
+
+@item ChangeLog
+A detailed list of source code changes as bugs are fixed or improvements made.
+
+@item ChangeLog.0
+An older list of source code changes.
+
+@item NEWS
+A list of changes to @command{gawk} since the last release or patch.
+
+@item NEWS.0
+An older list of changes to @command{gawk}.
+
+@item COPYING
+The GNU General Public License.
+
+@item POSIX.STD
+A description of behaviors in the POSIX standard for @command{awk} that
+are left undefined, or where @command{gawk} may not comply fully, as well
+as a list of things that the POSIX standard should describe but does not.
+
+@cindex artificial intelligence@comma{} @command{gawk} and
+@item doc/awkforai.txt
+Pointers to the original draft of
+a short article describing why @command{gawk} is a good language for
+artificial intelligence (AI) programming.
+
+@item doc/bc_notes
+A brief description of @command{gawk}'s ``byte code'' internals.
+
+@item doc/README.card
+@itemx doc/ad.block
+@itemx doc/awkcard.in
+@itemx doc/cardfonts
+@itemx doc/colors
+@itemx doc/macros
+@itemx doc/no.colors
+@itemx doc/setter.outline
+The @command{troff} source for a five-color @command{awk} reference card.
+A modern version of @command{troff} such as GNU @command{troff} (@command{groff}) is
+needed to produce the color version. See the file @file{README.card}
+for instructions if you have an older @command{troff}.
+
+@item doc/gawk.1
+The @command{troff} source for a manual page describing @command{gawk}.
+This is distributed for the convenience of Unix users.
+
+@cindex Texinfo
+@item doc/gawktexi.in
+@itemx doc/sidebar.awk
+The Texinfo source file for this @value{DOCUMENT}.
+It should be processed by @file{doc/sidebar.awk}
+before processing with @command{texi2dvi} or @command{texi2pdf}
+to produce a printed document, and
+with @command{makeinfo} to produce an Info or HTML file.
+The @file{Makefile} takes care of this processing and produces
+printable output via @command{texi2dvi} or @command{texi2pdf}.
+
+@item doc/gawk.texi
+The file produced after processing @file{gawktexi.in}
+with @file{sidebar.awk}.
+
+@item doc/gawk.info
+The generated Info file for this @value{DOCUMENT}.
+
+@item doc/gawkinet.texi
+The Texinfo source file for
+@ifinfo
+@inforef{Top, , General Introduction, gawkinet, @value{GAWKINETTITLE}}.
+@end ifinfo
+@ifnotinfo
+@cite{@value{GAWKINETTITLE}}.
+@end ifnotinfo
+It should be processed with @TeX{}
+(via @command{texi2dvi} or @command{texi2pdf})
+to produce a printed document and
+with @command{makeinfo} to produce an Info or HTML file.
+
+@item doc/gawkinet.info
+The generated Info file for
+@cite{@value{GAWKINETTITLE}}.
+
+@item doc/igawk.1
+The @command{troff} source for a manual page describing the @command{igawk}
+program presented in
+@ref{Igawk Program}.
+(Since @command{gawk} can do its own @code{@@include} processing,
+neither @command{igawk} nor @file{igawk.1} are installed.)
+
+@item doc/it/*
+Files for the Italian translation of this @value{DOCUMENT}, produced and
+contributed by Antonio Colombo and Marco Curreli.
+
+@item doc/Makefile.in
+The input file used during the configuration process to generate the
+actual @file{Makefile} for creating the documentation.
+
+@item Makefile.am
+@itemx */Makefile.am
+Files used by the GNU Automake software for generating
+the @file{Makefile.in} files used by Autoconf and
+@command{configure}.
+
+@item Makefile.in
+@itemx aclocal.m4
+@itemx bisonfix.awk
+@itemx config.guess
+@itemx configh.in
+@itemx configure.ac
+@itemx configure
+@itemx custom.h
+@itemx depcomp
+@itemx install-sh
+@itemx missing_d/*
+@itemx mkinstalldirs
+@itemx m4/*
+These files and subdirectories are used when configuring and compiling
+@command{gawk} for various Unix systems.  Most of them are explained
+in @ref{Unix Installation}. The rest are there to support the main
+infrastructure.
+
+@item po/*
+The @file{po} library contains message translations.
+
+@item awklib/extract.awk
+@itemx awklib/Makefile.am
+@itemx awklib/Makefile.in
+@itemx awklib/eg/*
+The @file{awklib} directory contains a copy of @file{extract.awk}
+(@pxref{Extract Program}),
+which can be used to extract the sample programs from the Texinfo
+source file for this @value{DOCUMENT}. It also contains a @file{Makefile.in} file, which
+@command{configure} uses to generate a @file{Makefile}.
+@file{Makefile.am} is used by GNU Automake to create @file{Makefile.in}.
+The library functions from
+@ref{Library Functions},
+are included as ready-to-use files in the @command{gawk} distribution.
+They are installed as part of the installation process.
+The rest of the programs in this @value{DOCUMENT} are available in appropriate
+subdirectories of @file{awklib/eg}.
+
+@item extension/*
+The source code, manual pages, and infrastructure files for
+the sample extensions included with @command{gawk}.
+@xref{Dynamic Extensions}, for more information.
+
+@item extras/*
+Additional non-essential files.  Currently, this directory contains some shell
+startup files to be installed in @file{/etc/profile.d} to aid in manipulating
+the @env{AWKPATH} and @env{AWKLIBPATH} environment variables.
+@xref{Shell Startup Files}, for more information.
+
+@item posix/*
+Files needed for building @command{gawk} on POSIX-compliant systems.
+
+@item pc/*
+Files needed for building @command{gawk} under MS-Windows
+(@pxref{PC Installation} for details).
+
+@item vms/*
+Files needed for building @command{gawk} under Vax/VMS and OpenVMS
+(@pxref{VMS Installation} for details).
+
+@item test/*
+A test suite for
+@command{gawk}.  You can use @samp{make check} from the top-level @command{gawk}
+directory to run your version of @command{gawk} against the test suite.
+If @command{gawk} successfully passes @samp{make check}, then you can
+be confident of a successful port.
+@end table
+
+@node Unix Installation
+@appendixsec Compiling and Installing @command{gawk} on Unix-Like Systems
+
+Usually, you can compile and install @command{gawk} by typing only two
+commands.  However, if you use an unusual system, you may need
+to configure @command{gawk} for your system yourself.
+
+@menu
+* Quick Installation::               Compiling @command{gawk} under Unix.
+* Shell Startup Files::              Shell convenience functions.
+* Additional Configuration Options:: Other compile-time options.
+* Configuration Philosophy::         How it's all supposed to work.
+@end menu
+
+@node Quick Installation
+@appendixsubsec Compiling @command{gawk} for Unix-Like Systems
+
+The normal installation steps should work on all modern commercial
+Unix-derived systems, GNU/Linux, BSD-based systems, and the Cygwin
+environment for MS-Windows.
+
+After you have extracted the @command{gawk} distribution, @command{cd}
+to @file{gawk-@value{VERSION}.@value{PATCHLEVEL}}.  As with most GNU
+software, you configure @command{gawk} for your system by running the
+@command{configure} program.  This program is a Bourne shell script that
+is generated automatically using GNU Autoconf.
+@ifnotinfo
+(The Autoconf software is
+described fully in
+@cite{Autoconf---Generating Automatic Configuration Scripts},
+which can be found online at
+@uref{https://www.gnu.org/software/autoconf/manual/index.html,
+the Free Software Foundation's website}.)
+@end ifnotinfo
+@ifinfo
+(The Autoconf software is described fully starting with
+@inforef{Top, , Autoconf, autoconf,Autoconf---Generating Automatic Configuration Scripts}.)
+@end ifinfo
+
+To configure @command{gawk}, simply run @command{configure}:
+
+@example
+sh ./configure
+@end example
+
+This produces a @file{Makefile} and @file{config.h} tailored to your system.
+The @file{config.h} file describes various facts about your system.
+You might want to edit the @file{Makefile} to
+change the @code{CFLAGS} variable, which controls
+the command-line options that are passed to the C compiler (such as
+optimization levels or compiling for debugging).
+
+Alternatively, you can add your own values for most @command{make}
+variables on the command line, such as @code{CC} and @code{CFLAGS}, when
+running @command{configure}:
+
+@example
+CC=cc CFLAGS=-g sh ./configure
+@end example
+
+@noindent
+See the file @file{INSTALL} in the @command{gawk} distribution for
+all the details.
+
+After you have run @command{configure} and possibly edited the @file{Makefile},
+type:
+
+@example
+make
+@end example
+
+@noindent
+Shortly thereafter, you should have an executable version of @command{gawk}.
+That's all there is to it!
+To verify that @command{gawk} is working properly,
+run @samp{make check}.  All of the tests should succeed.
+If these steps do not work, or if any of the tests fail,
+check the files in the @file{README_d} directory to see if you've
+found a known problem.  If the failure is not described there,
+send in a bug report (@pxref{Bugs}).
+
+Of course, once you've built @command{gawk}, it is likely that you will
+wish to install it.  To do so, you need to run the command @samp{make
+install}, as a user with the appropriate permissions.  How to do this
+varies by system, but on many systems you can use the @command{sudo}
+command to do so.  The command then becomes @samp{sudo make install}. It
+is likely that you will be asked for your password, and you will have
+to have been set up previously as a user who is allowed to run the
+@command{sudo} command.
+
+@node Shell Startup Files
+@appendixsubsec Shell Startup Files
+
+The distribution contains shell startup files @file{gawk.sh} and
+@file{gawk.csh}, containing functions to aid in manipulating
+the @env{AWKPATH} and @env{AWKLIBPATH} environment variables.
+On a Fedora GNU/Linux system, these files should be installed in @file{/etc/profile.d};
+on other platforms, the appropriate location may be different.
+
+@table @command
+
+@cindex @command{gawkpath_default} shell function
+@item gawkpath_default
+Reset the @env{AWKPATH} environment variable to its default value.
+
+@cindex @command{gawkpath_prepend} shell function
+@item gawkpath_prepend
+Add the argument to the front of the @env{AWKPATH} environment variable.
+
+@cindex @command{gawkpath_append} shell function
+@item gawkpath_append
+Add the argument to the end of the @env{AWKPATH} environment variable.
+
+@cindex @command{gawklibpath_default} shell function
+@item gawklibpath_default
+Reset the @env{AWKLIBPATH} environment variable to its default value.
+
+@cindex @command{gawklibpath_prepend} shell function
+@item gawklibpath_prepend
+Add the argument to the front of the @env{AWKLIBPATH} environment variable.
+
+@cindex @command{gawklibpath_append} shell function
+@item gawklibpath_append
+Add the argument to the end of the @env{AWKLIBPATH} environment variable.
+
+@end table
+
+
+@node Additional Configuration Options
+@appendixsubsec Additional Configuration Options
+@cindex @command{gawk}, configuring, options
+@cindex configuration options@comma{} @command{gawk}
+
+There are several additional options you may use on the @command{configure}
+command line when compiling @command{gawk} from scratch, including:
+
+@table @code
+
+@cindex @option{--disable-extensions} configuration option
+@cindex configuration option, @code{--disable-extensions}
+@item --disable-extensions
+Disable the extension mechanism within @command{gawk}. With this
+option, it is not possible to use dynamic extensions.  This also
+disables configuring and building the sample extensions in the
+@file{extension} directory.
+
+This option may be useful for cross-compiling.
+The default action is to dynamically check if the extensions
+can be configured and compiled.
+
+@cindex @option{--disable-lint} configuration option
+@cindex configuration option, @code{--disable-lint}
+@item --disable-lint
+Disable all lint checking within @command{gawk}.  The
+@option{--lint} and @option{--lint-old} options
+(@pxref{Options})
+are accepted, but silently do nothing.
+Similarly, setting the @code{LINT} variable
+(@pxref{User-modified})
+has no effect on the running @command{awk} program.
+
+When used with the GNU Compiler Collection's (GCC's)
+automatic dead-code-elimination, this option
+cuts almost 23K bytes off the size of the @command{gawk}
+executable on GNU/Linux x86_64 systems.  Results on other systems and
+with other compilers are likely to vary.
+Using this option may bring you some slight performance improvement.
+
+@quotation CAUTION
+Using this option will cause some of the tests in the test suite
+to fail.  This option may be removed at a later date.
+@end quotation
+
+@cindex @option{--disable-mpfr} configuration option
+@cindex configuration option, @code{--disable-mpfr}
+@item --disable-mpfr
+Skip checking for the MPFR and GMP libraries. This is useful
+mainly for the developers, to make sure nothing breaks if
+MPFR support is not available.
+
+@cindex @option{--disable-nls} configuration option
+@cindex configuration option, @code{--disable-nls}
+@item --disable-nls
+Disable all message-translation facilities.
+This is usually not desirable, but it may bring you some slight performance
+improvement.
+
+@cindex @option{--enable-versioned-extension-dir} configuration option
+@cindex configuration option, @code{--enable-versioned-extension-dir}
+@item --enable-versioned-extension-dir
+Use a versioned directory for extensions.  The directory name will
+include the major and minor API versions in it. This makes it possible
+to keep extensions for different API versions on the same system
+without their conflicting with one another.
+
+@end table
+
+Use the command @samp{./configure --help} to see the full list of
+options supplied by @command{configure}.
+
+@node Configuration Philosophy
+@appendixsubsec The Configuration Process
+
+@cindex @command{gawk}, configuring
+This @value{SECTION} is of interest only if you know something about using the
+C language and Unix-like operating systems.
+
+The source code for @command{gawk} generally attempts to adhere to formal
+standards wherever possible.  This means that @command{gawk} uses library
+routines that are specified by the ISO C standard and by the POSIX
+operating system interface standard.
+The @command{gawk} source code requires using an ISO C compiler (the 1990
+standard).
+
+Many Unix systems do not support all of either the ISO or the
+POSIX standards.  The @file{missing_d} subdirectory in the @command{gawk}
+distribution contains replacement versions of those functions that are
+most likely to be missing.
+
+The @file{config.h} file that @command{configure} creates contains
+definitions that describe features of the particular operating system
+where you are attempting to compile @command{gawk}.  The three things
+described by this file are: what header files are available, so that
+they can be correctly included, what (supposedly) standard functions
+are actually available in your C libraries, and various miscellaneous
+facts about your operating system.  For example, there may not be an
+@code{st_blksize} element in the @code{stat} structure.  In this case,
+@samp{HAVE_STRUCT_STAT_ST_BLKSIZE} is undefined.
+
+@cindex @code{custom.h} file
+It is possible for your C compiler to lie to @command{configure}. It may
+do so by not exiting with an error when a library function is not
+available.  To get around this, edit the @file{custom.h} file.
+Use an @samp{#ifdef} that is appropriate for your system, and either
+@code{#define} any constants that @command{configure} should have defined but
+didn't, or @code{#undef} any constants that @command{configure} defined and
+should not have.  The @file{custom.h} file is automatically included by
+the @file{config.h} file.
+
+It is also possible that the @command{configure} program generated by
+Autoconf will not work on your system in some other fashion.
+If you do have a problem, the @file{configure.ac} file is the input for
+Autoconf.  You may be able to change this file and generate a
+new version of @command{configure} that works on your system
+(@pxref{Bugs}
+for information on how to report problems in configuring @command{gawk}).
+The same mechanism may be used to send in updates to @file{configure.ac}
+and/or @file{custom.h}.
+
+@node Non-Unix Installation
+@appendixsec Installation on Other Operating Systems
+
+This @value{SECTION} describes how to install @command{gawk} on
+various non-Unix systems.
+
+@menu
+* PC Installation::             Installing and Compiling @command{gawk} on
+                                Microsoft Windows.
+* VMS Installation::            Installing @command{gawk} on VMS.
+@end menu
+
+@node PC Installation
+@appendixsubsec Installation on MS-Windows
+
+@cindex PC operating systems@comma{} @command{gawk} on, installing
+@cindex operating systems, PC@comma{} @command{gawk} on, installing
+This @value{SECTION} covers installation and usage of @command{gawk}
+on Intel architecture machines running any version of MS-Windows.
+In this @value{SECTION}, the term ``Windows32''
+refers to any of Microsoft Windows 95/98/ME/NT/2000/XP/Vista/7/8/10.
+
+See also the @file{README_d/README.pc} file in the distribution.
+
+@menu
+* PC Binary Installation::      Installing a prepared distribution.
+* PC Compiling::                Compiling @command{gawk} for Windows32.
+* PC Using::                    Running @command{gawk} on Windows32.
+* Cygwin::                      Building and running @command{gawk} for
+                                Cygwin.
+* MSYS::                        Using @command{gawk} In The MSYS Environment.
+@end menu
+
+@node PC Binary Installation
+@appendixsubsubsec Installing a Prepared Distribution for MS-Windows Systems
+
+The only supported binary distribution for MS-Windows systems
+is that provided by Eli Zaretskii's @uref{https://sourceforge.net/projects/ezwinports/,
+``ezwinports''} project.  Install the compiled @command{gawk} from there.
+
+@node PC Compiling
+@appendixsubsubsec Compiling @command{gawk} for PC Operating Systems
+
+@command{gawk} can be compiled for Windows32 using MinGW (Windows32).
+The file @file{README_d/README.pc} in the @command{gawk} distribution
+contains additional notes, and @file{pc/Makefile} contains important
+information on compilation options.
+
+@cindex compiling @command{gawk} for MS-Windows
+To build @command{gawk} for Windows32, copy the files in
+the @file{pc} directory (@emph{except} for @file{ChangeLog}) to the
+directory with the rest of the @command{gawk} sources, then invoke
+@command{make} with the appropriate target name as an argument to
+build @command{gawk}.  The @file{Makefile} copied from the @file{pc}
+directory contains a configuration section with comments and may need
+to be edited in order to work with your @command{make} utility.
+
+The @file{Makefile} supports a number of targets for building various
+MS-DOS and Windows32 versions.  A list of targets is printed if the
+@command{make} command is given without a target.  As an example,
+to build a native MS-Windows binary of @command{gawk} using the MinGW tools,
+type @samp{make mingw32}.
+
+@node PC Using
+@appendixsubsubsec Using @command{gawk} on PC Operating Systems
+@cindex operating systems, PC, @command{gawk} on
+@cindex PC operating systems, @command{gawk} on
+
+Information in this section applies to the MinGW and
+DJGPP ports of @command{gawk}. @xref{Cygwin} for information
+about the Cygwin port.
+
+Under MS-Windows, the MinGW environment supports
+both the @samp{|&} operator and TCP/IP networking
+(@pxref{TCP/IP Networking}).
+The DJGPP environment does not support @samp{|&}.
+
+@cindex search paths
+@cindex search paths, for source files
+@cindex @command{gawk}, MS-Windows version of
+@cindex @code{;} (semicolon), @env{AWKPATH} variable and
+@cindex semicolon (@code{;}), @env{AWKPATH} variable and
+@cindex @env{AWKPATH} environment variable
+The MS-Windows version of @command{gawk} searches for
+program files as described in @ref{AWKPATH Variable}.  However,
+semicolons (rather than colons) separate elements in the @env{AWKPATH}
+variable.  If @env{AWKPATH} is not set or is empty, then the default
+search path is @samp{@w{.;c:/lib/awk;c:/gnu/lib/awk}}.
+
+@cindex common extensions, @code{BINMODE} variable
+@cindex extensions, common@comma{} @code{BINMODE} variable
+@cindex differences in @command{awk} and @command{gawk}, @code{BINMODE} variable
+@cindex @code{BINMODE} variable
+Under MS-Windows,
+@command{gawk} (and many other text programs) silently
+translates end-of-line @samp{\r\n} to @samp{\n} on input and @samp{\n}
+to @samp{\r\n} on output.  A special @code{BINMODE} variable @value{COMMONEXT}
+allows control over these translations and is interpreted as follows:
+
+@itemize @value{BULLET}
+@item
+If @code{BINMODE} is @code{"r"} or one,
+then
+binary mode is set on read (i.e., no translations on reads).
+
+@item
+If @code{BINMODE} is @code{"w"} or two,
+then
+binary mode is set on write (i.e., no translations on writes).
+
+@item
+If @code{BINMODE} is @code{"rw"} or @code{"wr"} or three,
+binary mode is set for both read and write.
+
+@item
+@code{BINMODE=@var{non-null-string}} is
+the same as @samp{BINMODE=3} (i.e., no translations on
+reads or writes).  However, @command{gawk} issues a warning
+message if the string is not one of @code{"rw"} or @code{"wr"}.
+@end itemize
+
+@noindent
+The modes for standard input and standard output are set one time
+only (after the
+command line is read, but before processing any of the @command{awk} program).
+Setting @code{BINMODE} for standard input or
+standard output is accomplished by using an
+appropriate @samp{-v BINMODE=@var{N}} option on the command line.
+@code{BINMODE} is set at the time a file or pipe is opened and cannot be
+changed midstream.
+
+On POSIX-compatible systems, this variable's value has no effect.
+Thus, if you think your program will run on multiple different systems
+and that you may need to use @code{BINMODE}, you should simply set it
+(in the program or on the command line) unconditionally, and not worry
+about the operating system on which your program is running.
+
+The name @code{BINMODE} was chosen to match @command{mawk}
+(@pxref{Other Versions}).
+@command{mawk} and @command{gawk} handle @code{BINMODE} similarly; however,
+@command{mawk} adds a @samp{-W BINMODE=@var{N}} option and an environment
+variable that can set @code{BINMODE}, @code{RS}, and @code{ORS}.  The
+files @file{binmode[1-3].awk} (under @file{gnu/lib/awk} in some of the
+prepared binary distributions) have been chosen to match @command{mawk}'s @samp{-W
+BINMODE=@var{N}} option.  These can be changed or discarded; in particular,
+the setting of @code{RS} giving the fewest ``surprises'' is open to debate.
+@command{mawk} uses @samp{RS = "\r\n"} if binary mode is set on read, which is
+appropriate for files with the MS-DOS-style end-of-line.
+
+To illustrate, the following examples set binary mode on writes for standard
+output and other files, and set @code{ORS} as the ``usual'' MS-DOS-style
+end-of-line:
+
+@example
+gawk -v BINMODE=2 -v ORS="\r\n" @dots{}
+@end example
+
+@noindent
+or:
+
+@example
+gawk -v BINMODE=w -f binmode2.awk @dots{}
+@end example
+
+@noindent
+These give the same result as the @samp{-W BINMODE=2} option in
+@command{mawk}.
+The following changes the record separator to @code{"\r\n"} and sets binary
+mode on reads, but does not affect the mode on standard input:
+
+@example
+gawk -v RS="\r\n" -e "BEGIN @{ BINMODE = 1 @}" @dots{}
+@end example
+
+@noindent
+or:
+
+@example
+gawk -f binmode1.awk @dots{}
+@end example
+
+@noindent
+With proper quoting, in the first example the setting of @code{RS} can be
+moved into the @code{BEGIN} rule.
+
+@node Cygwin
+@appendixsubsubsec Using @command{gawk} In The Cygwin Environment
+@cindex compiling @command{gawk} for Cygwin
+
+@command{gawk} can be built and used ``out of the box'' under MS-Windows
+if you are using the @uref{http://www.cygwin.com, Cygwin environment}.
+This environment provides an excellent simulation of GNU/Linux, using
+Bash, GCC, GNU Make,
+and other GNU programs.  Compilation and installation for Cygwin is the
+same as for a Unix system:
+
+@example
+tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+cd gawk-@value{VERSION}.@value{PATCHLEVEL}
+./configure
+make && make check
+@end example
+
+When compared to GNU/Linux on the same system, the @samp{configure}
+step on Cygwin takes considerably longer.  However, it does finish,
+and then the @samp{make} proceeds as usual.
+
+Recent versions of Cygwin open all files in binary mode. This means
+that you should use @samp{RS = "\r?\n"} in order to be able to
+handle standard MS-Windows text files with carriage-return plus
+line-feed line endings.
+
+The Cygwin environment supports
+both the @samp{|&} operator and TCP/IP networking
+(@pxref{TCP/IP Networking}).
+
+@node MSYS
+@appendixsubsubsec Using @command{gawk} In The MSYS Environment
+
+In the MSYS environment under MS-Windows, @command{gawk} automatically
+uses binary mode for reading and writing files.  Thus, there is no
+need to use the @code{BINMODE} variable.
+
+This can cause problems with other Unix-like components that have
+been ported to MS-Windows that expect @command{gawk} to do automatic
+translation of @code{"\r\n"}, because it won't.
+
+@node VMS Installation
+@appendixsubsec Compiling and Installing @command{gawk} on Vax/VMS and OpenVMS
+
+@c based on material from Pat Rankin <rankin@eql.caltech.edu>
+@c now rankin@pactechdata.com
+@c now r.pat.rankin@gmail.com
+
+@cindex @command{gawk}, VMS version of
+@cindex installation, VMS
+This @value{SUBSECTION} describes how to compile and install @command{gawk} under VMS.
+The older designation ``VMS'' is used throughout to refer to OpenVMS.
+
+@menu
+* VMS Compilation::             How to compile @command{gawk} under VMS.
+* VMS Dynamic Extensions::      Compiling @command{gawk} dynamic extensions on
+                                VMS.
+* VMS Installation Details::    How to install @command{gawk} under VMS.
+* VMS Running::                 How to run @command{gawk} under VMS.
+* VMS GNV::                     The VMS GNV Project.
+* VMS Old Gawk::                An old version comes with some VMS systems.
+@end menu
+
+@node VMS Compilation
+@appendixsubsubsec Compiling @command{gawk} on VMS
+@cindex compiling @command{gawk} for VMS
+
+To compile @command{gawk} under VMS, there is a @code{DCL} command procedure
+that issues all the necessary @code{CC} and @code{LINK} commands. There is
+also a @file{Makefile} for use with the @code{MMS} and @code{MMK} utilities.
+From the source directory, use either:
+
+@example
+$ @kbd{@@[.vms]vmsbuild.com}
+@end example
+
+@noindent
+or:
+
+@example
+$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms gawk}
+@end example
+
+@noindent
+or:
+
+@example
+$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms gawk}
+@end example
+
+@command{MMK} is an open source, free, near-clone of @command{MMS} and
+can better handle ODS-5 volumes with upper- and lowercase @value{FN}s.
+@command{MMK} is available from @uref{https://github.com/endlesssoftware/mmk}.
+
+With ODS-5 volumes and extended parsing enabled, the case of the target
+parameter may need to be exact.
+
+@command{gawk} has been tested under VAX/VMS 7.3 and Alpha/VMS 7.3-1
+using Compaq C V6.4, and under Alpha/VMS 7.3, Alpha/VMS 7.3-2, and IA64/VMS 8.3.
+The most recent builds used HP C V7.3 on Alpha VMS 8.3 and both
+Alpha and IA64 VMS 8.4 used HP C 7.3.@footnote{The IA64 architecture
+is also known as ``Itanium.''}
+
+@xref{VMS GNV} for information on building
+@command{gawk} as a PCSI kit that is compatible with the GNV product.
+
+@node VMS Dynamic Extensions
+@appendixsubsubsec Compiling @command{gawk} Dynamic Extensions on VMS
+
+The extensions that have been ported to VMS can be built using one of
+the following commands:
+
+@example
+$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms extensions}
+@end example
+
+@noindent
+or:
+
+@example
+$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms extensions}
+@end example
+
+@command{gawk} uses @code{AWKLIBPATH} as either an environment variable
+or a logical name to find the dynamic extensions.
+
+Dynamic extensions need to be compiled with the same compiler options for
+floating-point, pointer size, and symbol name handling as were used
+to compile @command{gawk} itself.
+Alpha and Itanium should use IEEE floating point.  The pointer size is 32 bits,
+and the symbol name handling should be exact case with CRC shortening for
+symbols longer than 32 bits.
+
+For Alpha and Itanium:
+
+@example
+/name=(as_is,short)
+/float=ieee/ieee_mode=denorm_results
+@end example
+
+For VAX:
+
+@example
+/name=(as_is,short)
+@end example
+
+Compile-time macros need to be defined before the first VMS-supplied
+header file is included, as follows:
+
+@example
+#if (__CRTL_VER >= 70200000) && !defined (__VAX)
+#define _LARGEFILE 1
+#endif
+
+#ifndef __VAX
+#ifdef __CRTL_VER
+#if __CRTL_VER >= 80200000
+#define _USE_STD_STAT 1
+#endif
+#endif
+#endif
+@end example
+
+If you are writing your own extensions to run on VMS, you must supply these
+definitions yourself. The @file{config.h} file created when building @command{gawk}
+on VMS does this for you; if instead you use that file or a similar one, then you
+must remember to include it before any VMS-supplied header files.
+
+@node VMS Installation Details
+@appendixsubsubsec Installing @command{gawk} on VMS
+
+To use @command{gawk}, all you need is a ``foreign'' command, which is a
+@code{DCL} symbol whose value begins with a dollar sign. For example:
+
+@example
+$ @kbd{GAWK :== $disk1:[gnubin]gawk}
+@end example
+
+@noindent
+Substitute the actual location of @command{gawk.exe} for
+@samp{$disk1:[gnubin]}. The symbol should be placed in the
+@file{login.com} of any user who wants to run @command{gawk},
+so that it is defined every time the user logs on.
+Alternatively, the symbol may be placed in the system-wide
+@file{sylogin.com} procedure, which allows all users
+to run @command{gawk}.
+
+If your @command{gawk} was installed by a PCSI kit into the
+@file{GNV$GNU:} directory tree, the program will be known as
+@file{GNV$GNU:[bin]gnv$gawk.exe} and the help file will be
+@file{GNV$GNU:[vms_help]gawk.hlp}.
+
+The PCSI kit also installs a @file{GNV$GNU:[vms_bin]gawk_verb.cld} file
+that can be used to add @command{gawk} and @command{awk} as DCL commands.
+
+For just the current process you can use:
+
+@example
+$ @kbd{set command gnv$gnu:[vms_bin]gawk_verb.cld}
+@end example
+
+Or the system manager can use @file{GNV$GNU:[vms_bin]gawk_verb.cld} to
+add the @command{gawk} and @command{awk} to the system-wide @samp{DCLTABLES}.
+
+The DCL syntax is documented in the @file{gawk.hlp} file.
+
+Optionally, the @file{gawk.hlp} entry can be loaded into a VMS help library:
+
+@example
+$ @kbd{LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp}
+@end example
+
+@noindent
+(You may want to substitute a site-specific help library rather than
+the standard VMS library @samp{HELPLIB}.)  After loading the help text,
+the command:
+
+@example
+$ @kbd{HELP GAWK}
+@end example
+
+@noindent
+provides information about both the @command{gawk} implementation and the
+@command{awk} programming language.
+
+The logical name @samp{AWK_LIBRARY} can designate a default location
+for @command{awk} program files.  For the @option{-f} option, if the specified
+@value{FN} has no device or directory path information in it, @command{gawk}
+looks in the current directory first, then in the directory specified
+by the translation of @samp{AWK_LIBRARY} if the file is not found.
+If, after searching in both directories, the file still is not found,
+@command{gawk} appends the suffix @samp{.awk} to the @value{FN} and retries
+the file search.  If @samp{AWK_LIBRARY} has no definition, a default value
+of @samp{SYS$LIBRARY:} is used for it.
+
+@node VMS Running
+@appendixsubsubsec Running @command{gawk} on VMS
+
+Command-line parsing and quoting conventions are significantly different
+on VMS, so examples in this @value{DOCUMENT} or from other sources often need minor
+changes.  They @emph{are} minor though, and all @command{awk} programs
+should run correctly.
+
+Here are a couple of trivial tests:
+
+@example
+$ @kbd{gawk -- "BEGIN @{print ""Hello, World!""@}"}
+$ @kbd{gawk -"W" version}
+! could also be -"W version" or "-W version"
+@end example
+
+@noindent
+Note that uppercase and mixed-case text must be quoted.
+
+The VMS port of @command{gawk} includes a @code{DCL}-style interface in addition
+to the original shell-style interface (see the help entry for details).
+One side effect of dual command-line parsing is that if there is only a
+single parameter (as in the quoted string program), the command
+becomes ambiguous.  To work around this, the normally optional @option{--}
+flag is required to force Unix-style parsing rather than @code{DCL} parsing.
+If any other dash-type options (or multiple parameters such as @value{DF}s to
+process) are present, there is no ambiguity and @option{--} can be omitted.
+
+@cindex exit status, of @command{gawk}, on VMS
+The @code{exit} value is a Unix-style value and is encoded into a VMS exit
+status value when the program exits.
+
+The VMS severity bits will be set based on the @code{exit} value.
+A failure is indicated by 1, and VMS sets the @code{ERROR} status.
+A fatal error is indicated by 2, and VMS sets the @code{FATAL} status.
+All other values will have the @code{SUCCESS} status.  The exit value is
+encoded to comply with VMS coding standards and will have the
+@code{C_FACILITY_NO} of @code{0x350000} with the constant @code{0xA000}
+added to the number shifted over by 3 bits to make room for the severity codes.
+
+To extract the actual @command{gawk} exit code from the VMS status, use:
+
+@example
+unix_status = (vms_status .and. %x7f8) / 8
+@end example
+
+@noindent
+A C program that uses @code{exec()} to call @command{gawk} will get the original
+Unix-style exit value.
+
+Older versions of @command{gawk} for VMS treated a Unix exit code 0 as 1,
+a failure as 2, a fatal error as 4, and passed all the other numbers through.
+This violated the VMS exit status coding requirements.
+
+@cindex floating-point, VAX/VMS
+VAX/VMS floating point uses unbiased rounding. @xref{Round Function}.
+
+VMS reports time values in GMT unless one of the @code{SYS$TIMEZONE_RULE}
+or @code{TZ} logical names is set.  Older versions of VMS, such as VAX/VMS
+7.3, do not set these logical names.
+
+@c @cindex directory search
+@c @cindex path, search
+@cindex search paths
+@cindex search paths, for source files
+The default search path, when looking for @command{awk} program files specified
+by the @option{-f} option, is @code{"SYS$DISK:[],AWK_LIBRARY:"}.  The logical
+name @env{AWKPATH} can be used to override this default.  The format
+of @env{AWKPATH} is a comma-separated list of directory specifications.
+When defining it, the value should be quoted so that it retains a single
+translation and not a multitranslation @code{RMS} searchlist.
+
+@cindex redirection on VMS
+
+This restriction also applies to running @command{gawk} under GNV,
+as redirection is always to a DCL command.
+
+If you are redirecting data to a VMS command or utility, the current
+implementation requires that setting up a VMS foreign command that runs
+a command file before invoking @command{gawk}.
+(This restriction may be removed in a future release of @command{gawk} on VMS.)
+
+Without this command file, the input data will also appear prepended
+to the output data.
+
+This also allows simulating POSIX commands that are not found on VMS or the
+use of GNV utilities.
+
+The example below is for @command{gawk} redirecting data to the VMS
+@command{sort} command.
+
+@example
+$ sort = "@@device:[dir]vms_gawk_sort.com"
+@end example
+
+The command file needs to be of the format in the example below.
+
+The first line inhibits the passed input data from also showing up in the
+output.  It must be in the format in the example.
+
+The next line creates a foreign command that overrides the outer foreign
+command which prevents an infinite recursion of command files.
+
+The next to the last command redirects @code{sys$input} to be
+@code{sys$command}, in order to pick up the data that is being redirected
+to the command.
+
+The last line runs the actual command.  It must be the last command as the data
+redirected from @command{gawk} will be read when the command file ends.
+
+@example
+$!'f$verify(0,0)'
+$ sort := sort
+$ define/user sys$input sys$command:
+$ sort sys$input: sys$output:
+@end example
+
+
+@node VMS GNV
+@appendixsubsubsec The VMS GNV Project
+
+The VMS GNV package provides a build environment similar to POSIX with ports
+of a collection of open source tools.  The @command{gawk} found in the GNV
+base kit is an older port.  Currently, the GNV project is being reorganized
+to supply individual PCSI packages for each component.
+See @w{@uref{https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/}.}
+
+The normal build procedure for @command{gawk} produces a program that
+is suitable for use with GNV.
+
+The file @file{vms/gawk_build_steps.txt} in the distribution documents
+the procedure for building a VMS PCSI kit that is compatible with GNV.
+
+@ignore
+@c The VMS POSIX product, also known as POSIX for OpenVMS, is long defunct
+@c and building gawk for it has not been tested in many years, but these
+@c old instructions might still work if anyone is still using it.
+
+@node VMS POSIX
+@appendixsubsubsec Building and Using @command{gawk} on VMS POSIX
+
+Ignore the instructions above, although @file{vms/gawk.hlp} should still
+be made available in a help library.  The source tree should be unpacked
+into a container file subsystem rather than into the ordinary VMS filesystem.
+Make sure that the two scripts, @file{configure} and
+@file{vms/posix-cc.sh}, are executable; use @samp{chmod +x} on them if
+necessary.  Then execute the following two commands:
+
+@example
+psx> @kbd{CC=vms/posix-cc.sh configure}
+psx> @kbd{make CC=c89 gawk}
+@end example
+
+@noindent
+The first command constructs files @file{config.h} and @file{Makefile} out
+of templates, using a script to make the C compiler fit @command{configure}'s
+expectations.  The second command compiles and links @command{gawk} using
+the C compiler directly; ignore any warnings from @command{make} about being
+unable to redefine @code{CC}.  @command{configure} takes a very long
+time to execute, but at least it provides incremental feedback as it runs.
+
+This has been tested with VAX/VMS V6.2, VMS POSIX V2.0, and DEC C V5.2.
+
+Once built, @command{gawk} works like any other shell utility.  Unlike
+the normal VMS port of @command{gawk}, no special command-line manipulation is
+needed in the VMS POSIX environment.
+@end ignore
+
+@node VMS Old Gawk
+@appendixsubsubsec Some VMS Systems Have An Old Version of @command{gawk}
+
+@c Thanks to "gerard labadie" <gerard.labadie@gmail.com>
+
+Some versions of VMS have an old version of @command{gawk}.  To access it,
+define a symbol, as follows:
+
+@example
+$ @kbd{gawk :== $sys$common:[syshlp.examples.tcpip.snmp]gawk.exe}
+@end example
+
+This is apparently @value{PVERSION} 2.15.6, which is extremely old. We
+recommend compiling and using the current version.
+
+@node Bugs
+@appendixsec Reporting Problems and Bugs
+@cindex archaeologists
+@quotation
+@i{There is nothing more dangerous than a bored archaeologist.}
+@author Douglas Adams, @cite{The Hitchhiker's Guide to the Galaxy}
+@end quotation
+@c the radio show, not the book. :-)
+
+@cindex debugging @command{gawk}, bug reports
+@cindex troubleshooting, @command{gawk}, bug reports
+If you have problems with @command{gawk} or think that you have found a bug,
+report it to the developers; we cannot promise to do anything,
+but we might well want to fix it.
+
+@menu
+* Bug address::                 Where to send reports to.
+* Usenet::                      Where not to send reports to.
+* Maintainers::                 Maintainers of non-*nix ports.
+@end menu
+
+@node Bug address
+@appendixsubsec Submitting Bug Reports
+
+Before reporting a bug, make sure you have really found a genuine bug.
+First, verify that you have the latest version of @command{gawk}.
+Many bugs (usually subtle ones) are fixed at each release, and if yours
+is out of date, the problem may already have been solved.
+
+Second, please see if setting the environment variable @env{LC_ALL}
+to @code{LC_ALL=C} causes things to behave as you expect. If so, it's
+a locale issue, and may or may not really be a bug.
+
+Third, carefully reread the documentation and see if it says you can do
+what you're trying to do.  If it's not clear whether you should be able
+to do something or not, report that too; it's a bug in the documentation!
+
+Finally, before reporting a bug or trying to fix it yourself, try to isolate it
+to the smallest possible @command{awk} program and input @value{DF} that
+reproduce the problem.  Then send us the program and @value{DF},
+some idea of what kind of Unix system you're using,
+the compiler you used to compile @command{gawk}, and the exact results
+@command{gawk} gave you.  Also say what you expected to occur; this helps
+us decide whether the problem is really in the documentation.
+
+Make sure to include the version number of @command{gawk} you are using.
+You can get this information with the command @samp{gawk --version}.
+
+@cindex @code{bug-gawk@@gnu.org} bug reporting address
+@cindex email address for bug reports, @code{bug-gawk@@gnu.org}
+@cindex bug reports, email address, @code{bug-gawk@@gnu.org}
+Once you have a precise problem description, send email to
+@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
+
+The @command{gawk} maintainers subscribe to this address, and
+thus they will receive your bug report.
+Although you can send mail to the maintainers directly,
+the bug reporting address is preferred because the
+email list is archived at the GNU Project.
+@emph{All email must be in English. This is the only language
+understood in common by all the maintainers.}
+In addition, please be sure to send all mail in @emph{plain text},
+not (or not exclusively) in HTML.
+
+@quotation NOTE
+Many distributions of GNU/Linux and the various BSD-based operating systems
+have their own bug reporting systems.  If you report a bug using your distribution's
+bug reporting system, you should also send a copy to
+@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
+
+This is for two reasons.  First, although some distributions forward
+bug reports ``upstream'' to the GNU mailing list, many don't, so there is a good
+chance that the @command{gawk}  maintainers won't even see the bug report!  Second,
+mail to the GNU list is archived, and having everything at the GNU Project
+keeps things self-contained and not dependent on other organizations.
+@end quotation
+
+Non-bug suggestions are always welcome as well.  If you have questions
+about things that are unclear in the documentation or are just obscure
+features, ask on the bug list; we will try to help you out if we can.
+
+Please note: We ask that you follow the
+@uref{https://gnu.org/philosophy/kind-communication.html,
+GNU Kind Communication Guidelines} in your correspondence on the
+list (as well as off of it).
+
+@node Usenet
+@appendixsubsec Please Don't Post Bug Reports to USENET
+
+@quotation
+@c Date: Sun, 17 May 2015 19:50:14 -0400
+@c From: Chet Ramey <chet.ramey@case.edu>
+@c Reply-To: chet.ramey@case.edu
+@c Organization: ITS, Case Western Reserve University
+@c To: Aharon Robbins <arnold@skeeve.com>
+@c CC: chet.ramey@case.edu
+I gave up on Usenet a couple of years ago and haven't really looked back.
+It's like sports talk radio---you feel smarter for not having read it.
+@author Chet Ramey
+@end quotation
+
+@cindex @code{comp.lang.awk} newsgroup
+Please do @emph{not} try to report bugs in @command{gawk} by posting to the
+Usenet/Internet newsgroup @code{comp.lang.awk}.  Although some of the
+@command{gawk} developers occasionally read this news group, the primary
+@command{gawk} maintainer no longer does.  Thus it's virtually guaranteed
+that he will @emph{not} see your posting.
+
+Similarly, posting bug reports or questions in web forums (such
+as @uref{https://stackoverflow.com/, Stack Overflow}) may get you
+an answer, but it won't be from the @command{gawk} maintainers,
+who do not spend their time in web forums.  The steps described here are
+the only officially recognized way for reporting bugs.  Really.
+
+@ignore
+And another one:
+
+Date: Thu, 11 Jun 2015 09:00:56 -0400
+From: Chet Ramey <chet.ramey@case.edu>
+
+My memory was imperfect.  Back in June 2009, I wrote:
+
+"That's the nice thing about open source, right?  You can take your ball
+and run to another section of the playground.  Then, if you like mixing
+metaphors, you can throw rocks from there."
+@end ignore
+
+@node Maintainers
+@appendixsubsec Reporting Problems with Non-Unix Ports
+
+If you find bugs in one of the non-Unix ports of @command{gawk},
+send an email to the bug list, with a copy to the
+person who maintains that port.  The maintainers are named in the following list,
+as well as in the @file{README} file in the @command{gawk} distribution.
+Information in the @file{README} file should be considered authoritative
+if it conflicts with this @value{DOCUMENT}.
+
+The people maintaining the various @command{gawk} ports are:
+
+@c put the index entries outside the table, for docbook
+@cindex Buening, Andreas
+@cindex Malmberg, John
+@cindex Pitts, Dave
+@cindex G., Daniel Richard
+@cindex Robbins, Arnold
+@cindex Zaretskii, Eli
+@cindex Guerrero, Juan Manuel
+@multitable {MS-Windows with MinGW} {123456789012345678901234567890123456789001234567890}
+@item Unix and POSIX systems @tab Arnold Robbins, @EMAIL{arnold@@skeeve.com,arnold at skeeve dot com}
+
+@item MS-DOS with DJGPP @tab Juan Manuel Guerrero, @EMAIL{juan.guerrero@@gmx.de, juan dot guerrero at gmx dot de}
+
+@item MS-Windows with MinGW @tab Eli Zaretskii, @EMAIL{eliz@@gnu.org,eliz at gnu dot org}
+
+@c Leave this in the document on purpose.
+@c OS/2 is not mentioned anywhere else though.
+@item OS/2 @tab Andreas Buening, @EMAIL{andreas.buening@@nexgo.de,andreas dot buening at nexgo dot de}
+
+@item VMS @tab John Malmberg, @EMAIL{wb8tyw@@qsl.net,wb8tyw at qsl.net}
+
+@item z/OS (OS/390) @tab Daniel Richard G.@: @EMAIL{skunk@@iSKUNK.ORG,skunk at iSKUNK.ORG}
+@item  @tab Dave Pitts (Maintainer Emeritus), @EMAIL{dpitts@@cozx.com,dpitts at cozx dot com}
+@end multitable
+
+If your bug is also reproducible under Unix, send a copy of your
+report to the @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org} email list as well.
+
+@node Other Versions
+@appendixsec Other Freely Available @command{awk} Implementations
+@cindex @command{awk}, implementations
+@ignore
+From: emory!amc.com!brennan (Michael Brennan)
+Subject: C++ comments in awk programs
+To: arnold@gnu.ai.mit.edu (Arnold Robbins)
+Date: Wed, 4 Sep 1996 08:11:48 -0700 (PDT)
+
+@end ignore
+@cindex Brennan, Michael
+@ifnotdocbook
+@quotation
+@i{It's kind of fun to put comments like this in your awk code:}@*
+@ @ @ @ @ @ @code{// Do C++ comments work? answer: yes! of course}
+@author Michael Brennan
+@end quotation
+@end ifnotdocbook
+
+@docbook
+<blockquote><attribution>Michael Brennan</attribution>
+<literallayout><emphasis>It's kind of fun to put comments like this in your awk code.</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<literal>// Do C++ comments work? answer: yes! of course</literal></literallayout>
+</blockquote>
+@end docbook
+
+There are a number of other freely available @command{awk} implementations.
+This @value{SECTION} briefly describes where to get them:
+
+@table @asis
+@cindex Kernighan, Brian
+@cindex source code, Brian Kernighan's @command{awk}
+@cindex @command{awk}, versions of, See Also Brian Kernighan's @command{awk}
+@cindex Brian Kernighan's @command{awk}, source code
+@item Unix @command{awk}
+Brian Kernighan, one of the original designers of Unix @command{awk},
+has made his implementation of
+@command{awk} freely available.
+You can retrieve it from GitHub:
+
+@cindex @command{git} utility
+@example
+git clone git://github.com/onetrueawk/awk bwkawk
+@end example
+
+@noindent
+This command creates a copy of the @uref{https://git-scm.com, Git}
+repository in a directory named @file{bwkawk}.  If you omit the last argument
+from the @command{git} command line, the repository copy is created in a
+directory named @file{awk}.
+
+This version requires an ISO C (1990 standard) compiler; the C compiler
+from GCC (the GNU Compiler Collection) works quite nicely.
+
+To build it, review the settings in the @file{makefile}, and then just run
+@command{make}.  Note that the result of compilation is named
+@command{a.out}; you will have to rename it to something reasonable.
+
+@xref{Common Extensions}
+for a list of extensions in this @command{awk} that are not in POSIX @command{awk}.
+
+As a side note, Dan Bornstein has created a Git repository tracking
+all the versions of BWK @command{awk} that he could find. It's
+available at @uref{git://github.com/danfuzz/one-true-awk}.
+
+@cindex Brennan, Michael
+@cindex @command{mawk} utility
+@cindex source code, @command{mawk}
+@item @command{mawk}
+Michael Brennan wrote an independent implementation of @command{awk},
+called @command{mawk}.  It is available under the
+@ifclear FOR_PRINT
+GPL (@pxref{Copying}),
+@end ifclear
+@ifset FOR_PRINT
+GPL,
+@end ifset
+just as @command{gawk} is.
+
+The original distribution site for the @command{mawk} source code
+no longer has it.  A copy is available at
+@uref{http://www.skeeve.com/gawk/mawk1.3.3.tar.gz}.
+
+In 2009, Thomas Dickey took on @command{mawk} maintenance.
+Basic information is available on
+@uref{http://www.invisible-island.net/mawk, the project's web page}.
+The download URL is
+@url{http://invisible-island.net/datafiles/release/mawk.tar.gz}.
+
+Once you have it,
+@command{gunzip} may be used to decompress this file. Installation
+is similar to @command{gawk}'s
+(@pxref{Unix Installation}).
+
+@xref{Common Extensions}
+for a list of extensions in @command{mawk} that are not in POSIX @command{awk}.
+
+@item @command{mawk} 2.0
+In 2016, Michael Brennan resumed @command{mawk} development.
+His development snapshots are available via Git from the project's
+@uref{https://github.com/mikebrennan000/mawk-2, GitHub page}.
+
+@cindex Sumner, Andrew
+@cindex @command{awka} compiler for @command{awk}
+@cindex source code, @command{awka}
+@item @command{awka}
+Written by Andrew Sumner,
+@command{awka} translates @command{awk} programs into C, compiles them,
+and links them with a library of functions that provide the core
+@command{awk} functionality.
+It also has a number of extensions.
+
+The @command{awk} translator is released under the GPL, and the library
+is under the LGPL.
+
+To get @command{awka}, go to @url{https://sourceforge.net/projects/awka}.
+@c You can reach Andrew Sumner at @email{andrew@@zbcom.net}.
+@c andrewsumner@@yahoo.net
+
+The project seems to be frozen; no new code changes have been made
+since approximately 2001.
+
+@cindex Beebe, Nelson H.F.@:
+@cindex @command{pawk} (profiling version of Brian Kernighan's @command{awk})
+@cindex source code, @command{pawk}
+@item @command{pawk}
+Nelson H.F.@: Beebe at the University of Utah has modified
+BWK @command{awk} to provide timing and profiling information.
+It is different from @command{gawk} with the @option{--profile} option
+(@pxref{Profiling})
+in that it uses CPU-based profiling, not line-count
+profiling.  You may find it at either
+@uref{ftp://ftp.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}
+or
+@uref{http://www.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}.
+
+@item BusyBox @command{awk}
+@cindex BusyBox Awk
+@cindex source code, BusyBox Awk
+BusyBox is a GPL-licensed program providing small versions of many
+applications within a single executable. It is aimed at embedded systems.
+It includes a full implementation of POSIX @command{awk}.  When building
+it, be careful not to do @samp{make install} as it will overwrite
+copies of other applications in your @file{/usr/local/bin}.  For more
+information, see the @uref{https://busybox.net, project's home page}.
+
+@cindex OpenSolaris
+@cindex Solaris, POSIX-compliant @command{awk}
+@cindex source code, Solaris @command{awk}
+@item The OpenSolaris POSIX @command{awk}
+The versions of @command{awk} in @file{/usr/xpg4/bin} and
+@file{/usr/xpg6/bin} on Solaris are more or less POSIX-compliant.
+They are based on the @command{awk} from Mortice Kern Systems for PCs.
+We were able to make this code compile and work under GNU/Linux
+with 1--2 hours of work.  Making it more generally portable (using
+GNU Autoconf and/or Automake) would take more work, and this
+has not been done, at least to our knowledge.
+
+@cindex Illumos
+@cindex Illumos, POSIX-compliant @command{awk}
+@cindex source code, Illumos @command{awk}
+The source code used to be available from the OpenSolaris website.
+However, that project was ended and the website shut down.  Fortunately, the
+@uref{https://wiki.illumos.org/display/illumos/illumos+Home, Illumos project}
+makes this implementation available.  You can view the files one at a time from
+@uref{https://github.com/joyent/illumos-joyent/blob/master/usr/src/cmd/awk_xpg4}.
+
+@cindex @command{goawk}
+@cindex Go implementation of @command{awk}
+@cindex source code, @command{goawk}
+@cindex programming languages, Go
+@item @command{goawk}
+This is an @command{awk} interpreter written in the
+@uref{https://golang.org/, Go programming language}.
+It implements POSIX @command{awk}, with a few minor extensions.
+Source code is available from @uref{https://github.com/benhoyt/goawk}.
+The author wrote a nice 
+@uref{https://benhoyt.com/writings/goawk/, article}
+describing the implementation.
+
+@cindex @command{jawk}
+@cindex Java implementation of @command{awk}
+@cindex source code, @command{jawk}
+@item @command{jawk}
+This is an interpreter for @command{awk} written in Java. It claims
+to be a full interpreter, although because it uses Java facilities
+for I/O and for regexp matching, the language it supports is different
+from POSIX @command{awk}.  More information is available on the
+@uref{https://jawk.sourceforge.net, project's home page}.
+
+@item Libmawk
+@cindex libmawk
+@cindex source code, libmawk
+This is an embeddable @command{awk} interpreter derived from
+@command{mawk}. For more information, see
+@uref{http://repo.hu/projects/libmawk/}.
+
+@cindex source code, embeddable @command{awk} interpreter
+@cindex Neacsu, Mircea
+@item Mircea Neacsu's Embeddable @command{awk}
+Mircea Neacsu has created an embeddable @command{awk}
+interpreter, based on BWK awk. It's available
+at @uref{https://github.com/neacsum/awk}.
+
+@item @code{pawk}
+@cindex source code, @command{pawk} (Python version)
+@cindex @code{pawk}, @command{awk}-like facilities for Python
+This is a Python module that claims to bring @command{awk}-like
+features to Python. See @uref{https://github.com/alecthomas/pawk}
+for more information. (This is not related to Nelson Beebe's
+modified version of BWK @command{awk}, described earlier.)
+
+@item @w{QSE @command{awk}}
+@cindex QSE @command{awk}
+@cindex source code, QSE @command{awk}
+This is an embeddable @command{awk} interpreter. For more information,
+see @uref{https://code.google.com/p/qse/}. @c and @uref{http://awk.info/?tools/qse}.
+
+@item @command{QTawk}
+@cindex QuikTrim Awk
+@cindex source code, QuikTrim Awk
+This is an independent implementation of @command{awk} distributed
+under the GPL. It has a large number of extensions over standard
+@command{awk} and may not be 100% syntactically compatible with it.
+See @uref{http://www.quiktrim.org/QTawk.html} for more information,
+including the manual. The download link there is out of date; see
+@uref{http://www.quiktrim.org/#AdditionalResources} for the latest
+download link.
+
+The project may also be frozen; no new code changes have been made
+since approximately 2014.
+
+@item Other versions
+See also the ``Versions and implementations'' section of the
+@uref{https://en.wikipedia.org/wiki/Awk_language#Versions_and_implementations,
+Wikipedia article} on @command{awk} for information on additional versions.
+
+@end table
+
+@node Installation summary
+@appendixsec Summary
+
+@itemize @value{BULLET}
+@item
+The @command{gawk} distribution is available from the GNU Project's main
+distribution site, @code{ftp.gnu.org}.  The canonical build recipe is:
+
+@example
+wget https://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+cd gawk-@value{VERSION}.@value{PATCHLEVEL}
+./configure && make && make check
+@end example
+
+@quotation NOTE
+Because of the @samp{https://} URL, you may have to supply the
+@option{--no-check-certificate} option to @command{wget} to download
+the file.
+@end quotation
+
+@item
+@command{gawk} may be built on non-POSIX systems as well. The currently
+supported systems are MS-Windows using
+MSYS, DJGPP, MinGW, and Cygwin,
+@c OS/2,
+and both Vax/VMS and OpenVMS.
+Instructions for each system are included in this @value{APPENDIX}.
+
+@item
+Bug reports should be sent via email to @email{bug-gawk@@gnu.org}.
+Bug reports should be in English and should include the version of @command{gawk},
+how it was compiled, and a short program and @value{DF} that demonstrate
+the problem.
+
+@item
+There are a number of other freely available @command{awk}
+implementations.  Many are POSIX-compliant; others are less so.
+
+@end itemize
+
+
+@ifclear FOR_PRINT
+@node Notes
+@appendix Implementation Notes
+@cindex @command{gawk}, implementation issues
+@cindex implementation issues, @command{gawk}
+
+This appendix contains information mainly of interest to implementers and
+maintainers of @command{gawk}.  Everything in it applies specifically to
+@command{gawk} and not to other implementations.
+
+@menu
+* Compatibility Mode::          How to disable certain @command{gawk}
+                                extensions.
+* Additions::                   Making Additions To @command{gawk}.
+* Future Extensions::           New features that may be implemented one day.
+* Implementation Limitations::  Some limitations of the implementation.
+* Extension Design::            Design notes about the extension API.
+* Notes summary::               Summary of implementation notes.
+@end menu
+
+@node Compatibility Mode
+@appendixsec Downward Compatibility and Debugging
+@cindex @command{gawk}, implementation issues, downward compatibility
+@cindex @command{gawk}, implementation issues, debugging
+@cindex troubleshooting, @command{gawk}
+@cindex implementation issues@comma{} @command{gawk}, debugging
+
+@xref{POSIX/GNU},
+for a summary of the GNU extensions to the @command{awk} language and program.
+All of these features can be turned off by invoking @command{gawk} with the
+@option{--traditional} option or with the @option{--posix} option.
+
+If @command{gawk} is compiled for debugging with @samp{-DDEBUG}, then there
+is one more option available on the command line:
+
+@table @code
+@item -Y
+@itemx --parsedebug
+Print out the parse stack information as the program is being parsed.
+@end table
+
+This option is intended only for serious @command{gawk} developers
+and not for the casual user.  It probably has not even been compiled into
+your version of @command{gawk}, since it slows down execution.
+
+@node Additions
+@appendixsec Making Additions to @command{gawk}
+
+If you find that you want to enhance @command{gawk} in a significant
+fashion, you are perfectly free to do so.  That is the point of having
+free software; the source code is available and you are free to change
+it as you want (@pxref{Copying}).
+
+This @value{SECTION} discusses the ways you might want to change @command{gawk}
+as well as any considerations you should bear in mind.
+
+@menu
+* Accessing The Source::        Accessing the Git repository.
+* Adding Code::                 Adding code to the main body of
+                                @command{gawk}.
+* New Ports::                   Porting @command{gawk} to a new operating
+                                system.
+* Derived Files::               Why derived files are kept in the Git
+                                repository.
+@end menu
+
+@node Accessing The Source
+@appendixsubsec Accessing The @command{gawk} Git Repository
+
+As @command{gawk} is Free Software, the source code is always available.
+@ref{Gawk Distribution} describes how to get and build the formal,
+released versions of @command{gawk}.
+
+@cindex @command{git} utility
+However, if you want to modify @command{gawk} and contribute back your
+changes, you will probably wish to work with the development version.
+To do so, you will need to access the @command{gawk} source code
+repository.  The code is maintained using the
+@uref{https://git-scm.com, Git distributed version control system}.
+You will need to install it if your system doesn't have it.
+Once you have done so, use the command:
+
+@example
+git clone git://git.savannah.gnu.org/gawk.git
+@end example
+
+@noindent
+This clones the @command{gawk} repository.  If you are behind a
+firewall that does not allow you to use the Git native protocol, you
+can still access the repository using:
+
+@example
+git clone https://git.savannah.gnu.org/r/gawk.git
+@end example
+
+Once you have made changes, you can use @samp{git diff} to produce a
+patch, and send that to the @command{gawk} maintainer; see @ref{Bugs},
+for how to do that.
+
+Once upon a time there was Git--CVS gateway for use by people who could
+not install Git. However, this gateway no longer works, so you may have
+better luck using a more modern version control system like Bazaar,
+that has a Git plug-in for working with Git repositories.
+
+@node Adding Code
+@appendixsubsec Adding New Features
+
+@cindex adding, features to @command{gawk}
+@cindex features, adding to @command{gawk}
+@cindex @command{gawk}, features, adding
+You are free to add any new features you like to @command{gawk}.
+However, if you want your changes to be incorporated into the @command{gawk}
+distribution, there are several steps that you need to take in order to
+make it possible to include them:
+
+@enumerate 1
+@item
+Before building the new feature into @command{gawk} itself,
+consider writing it as an extension
+(@pxref{Dynamic Extensions}).
+If that's not possible, continue with the rest of the steps in this list.
+
+@item
+Be prepared to sign the appropriate paperwork.
+In order for the FSF to distribute your changes, you must either place
+those changes in the public domain and submit a signed statement to that
+effect, or assign the copyright in your changes to the FSF.
+Both of these actions are easy to do and @emph{many} people have done so
+already. If you have questions, please contact me
+(@pxref{Bugs}),
+or @EMAIL{assign@@gnu.org,assign at gnu dot org}.
+
+@item
+Get the latest version.
+It is much easier for me to integrate changes if they are relative to
+the most recent distributed version of @command{gawk}, or better yet,
+relative to the latest code in the Git repository.  If your version of
+@command{gawk} is very old, I may not be able to integrate your changes at all.
+(@xref{Getting},
+for information on getting the latest version of @command{gawk}.)
+
+@item
+@ifnotinfo
+Follow the @cite{GNU Coding Standards}.
+@end ifnotinfo
+@ifinfo
+See @inforef{Top, , Version, standards, GNU Coding Standards}.
+@end ifinfo
+This document describes how GNU software should be written. If you haven't
+read it, please do so, preferably @emph{before} starting to modify @command{gawk}.
+(The @cite{GNU Coding Standards} are available from
+the GNU Project's
+@uref{https://www.gnu.org/prep/standards/, website}.
+Texinfo, Info, and DVI versions are also available.)
+
+@cindex @command{gawk}, coding style in
+@item
+Use the @command{gawk} coding style.
+The C code for @command{gawk} follows the instructions in the
+@cite{GNU Coding Standards}, with minor exceptions.  The code is formatted
+using the traditional ``K&R'' style, particularly as regards to the placement
+of braces and the use of TABs.  In brief, the coding rules for @command{gawk}
+are as follows:
+
+@itemize @value{BULLET}
+@item
+Use ANSI/ISO style (prototype) function headers when defining functions.
+
+@item
+Put the name of the function at the beginning of its own line.
+
+@item
+Use @samp{#elif} instead of nesting @samp{#if} inside @samp{#else}.
+
+@item
+Put the return type of the function, even if it is @code{int}, on the
+line above the line with the name and arguments of the function.
+
+@item
+Put spaces around parentheses used in control structures
+(@code{if}, @code{while}, @code{for}, @code{do}, @code{switch},
+and @code{return}).
+
+@item
+Do not put spaces in front of parentheses used in function calls.
+
+@item
+Put spaces around all C operators and after commas in function calls.
+
+@item
+Do not use the comma operator to produce multiple side effects, except
+in @code{for} loop initialization and increment parts, and in macro bodies.
+
+@item
+Use real TABs for indenting, not spaces.
+
+@item
+Use the ``K&R'' brace layout style.
+
+@item
+Use comparisons against @code{NULL} and @code{'\0'} in the conditions of
+@code{if}, @code{while}, and @code{for} statements, as well as in the @code{case}s
+of @code{switch} statements, instead of just the
+plain pointer or character value.
+
+@item
+Use @code{true} and @code{false} for @code{bool} values,
+the @code{NULL} symbolic constant for pointer values,
+and the character constant @code{'\0'} where appropriate, instead of @code{1}
+and @code{0}.
+
+@item
+Provide one-line descriptive comments for each function.
+
+@item
+Do not use the @code{alloca()} function for allocating memory off the
+stack.  Its use causes more portability trouble than is worth the minor
+benefit of not having to free the storage. Instead, use @code{malloc()}
+and @code{free()}.
+
+@item
+Do not use comparisons of the form @samp{! strcmp(a, b)} or similar.
+As Henry Spencer once said, ``@code{strcmp()} is not a boolean!''
+Instead, use @samp{strcmp(a, b) == 0}.
+
+@item
+If adding new bit flag values, use explicit hexadecimal constants
+(@code{0x001}, @code{0x002}, @code{0x004}, and so on) instead of
+shifting one left by successive amounts (@samp{(1<<0)}, @samp{(1<<1)},
+and so on).
+@end itemize
+
+@quotation NOTE
+If I have to reformat your code to follow the coding style used in
+@command{gawk}, I may not bother to integrate your changes at all.
+@end quotation
+
+@cindex Texinfo
+@item
+Update the documentation.
+Along with your new code, please supply new sections and/or chapters
+for this @value{DOCUMENT}.  If at all possible, please use real
+Texinfo, instead of just supplying unformatted ASCII text (although
+even that is better than no documentation at all).
+Conventions to be followed in @cite{@value{TITLE}} are provided
+after the @samp{@@bye} at the end of the Texinfo source file.
+If possible, please update the @command{man} page as well.
+
+You will also have to sign paperwork for your documentation changes.
+
+@cindex @command{git} utility
+@item
+Submit changes as unified diffs.
+Use @samp{diff -u -r -N} to compare
+the original @command{gawk} source tree with your version.
+I recommend using the GNU version of @command{diff}, or best of all,
+@samp{git diff} or @samp{git format-patch}.
+Send the output produced by @command{diff} to me when you
+submit your changes.
+(@xref{Bugs}, for the electronic mail
+information.)
+
+Using this format makes it easy for me to apply your changes to the
+master version of the @command{gawk} source code (using @code{patch}).
+If I have to apply the changes manually, using a text editor, I may
+not do so, particularly if there are lots of changes.
+
+@item
+Include an entry for the @file{ChangeLog} file with your submission.
+This helps further minimize the amount of work I have to do,
+making it easier for me to accept patches.
+It is simplest if you just make this part of your diff.
+@end enumerate
+
+Although this sounds like a lot of work, please remember that while you
+may write the new code, I have to maintain it and support it. If it
+isn't possible for me to do that with a minimum of extra work, then I
+probably will not.
+
+@node New Ports
+@appendixsubsec Porting @command{gawk} to a New Operating System
+@cindex portability, @command{gawk}
+@cindex operating systems, porting @command{gawk} to
+
+@cindex porting @command{gawk}
+If you want to port @command{gawk} to a new operating system, there are
+several steps:
+
+@enumerate 1
+@item
+Follow the guidelines in
+@ifinfo
+@ref{Adding Code},
+@end ifinfo
+@ifnotinfo
+the previous @value{SECTION}
+@end ifnotinfo
+concerning coding style, submission of diffs, and so on.
+
+@item
+Be prepared to sign the appropriate paperwork.
+In order for the FSF to distribute your code, you must either place
+your code in the public domain and submit a signed statement to that
+effect, or assign the copyright in your code to the FSF.
+Both of these actions are easy to do and @emph{many} people have done so
+already. If you have questions, please contact me, or
+@email{gnu@@gnu.org}.
+
+@item
+When doing a port, bear in mind that your code must coexist peacefully
+with the rest of @command{gawk} and the other ports. Avoid gratuitous
+changes to the system-independent parts of the code. If at all possible,
+avoid sprinkling @samp{#ifdef}s just for your port throughout the
+code.
+
+If the changes needed for a particular system affect too much of the
+code, I probably will not accept them.  In such a case, you can, of course,
+distribute your changes on your own, as long as you comply
+with the GPL
+(@pxref{Copying}).
+
+@item
+A number of the files that come with @command{gawk} are maintained by other
+people.  Thus, you should not change them
+unless it is for a very good reason; i.e., changes are not out of the
+question, but changes to these files are scrutinized extra carefully.
+These are all the files in the @file{support} directory
+within the @command{gawk} distribution. See there.
+
+@item
+A number of other files are provided by the GNU
+Autotools (Autoconf, Automake, and GNU @command{gettext}).
+You should not change them either, unless it is for a very
+good reason. The files are
+@file{ABOUT-NLS},
+@file{config.guess},
+@file{config.rpath},
+@file{config.sub},
+@file{depcomp},
+@file{INSTALL},
+@file{install-sh},
+@file{missing},
+@file{mkinstalldirs},
+and
+@file{ylwrap}.
+
+@item
+Be willing to continue to maintain the port.
+Non-Unix operating systems are supported by volunteers who maintain
+the code needed to compile and run @command{gawk} on their systems. If no-one
+volunteers to maintain a port, it becomes unsupported and it may
+be necessary to remove it from the distribution.
+
+@item
+Supply an appropriate @file{gawkmisc.???} file.
+Each port has its own @file{gawkmisc.???} that implements certain
+operating system specific functions. This is cleaner than a plethora of
+@samp{#ifdef}s scattered throughout the code.  The @file{gawkmisc.c} in
+the main source directory includes the appropriate
+@file{gawkmisc.???} file from each subdirectory.
+Be sure to update it as well.
+
+Each port's @file{gawkmisc.???} file has a suffix reminiscent of the machine
+or operating system for the port---for example, @file{pc/gawkmisc.pc} and
+@file{vms/gawkmisc.vms}. The use of separate suffixes, instead of plain
+@file{gawkmisc.c}, makes it possible to move files from a port's subdirectory
+into the main subdirectory, without accidentally destroying the real
+@file{gawkmisc.c} file.  (Currently, this is only an issue for the
+PC operating system ports.)
+
+@item
+Supply a @file{Makefile} as well as any other C source and header files that are
+necessary for your operating system.  All your code should be in a
+separate subdirectory, with a name that is the same as, or reminiscent
+of, either your operating system or the computer system.  If possible,
+try to structure things so that it is not necessary to move files out
+of the subdirectory into the main source directory.  If that is not
+possible, then be sure to avoid using names for your files that
+duplicate the names of files in the main source directory.
+
+@item
+Update the documentation.
+Please write a section (or sections) for this @value{DOCUMENT} describing the
+installation and compilation steps needed to compile and/or install
+@command{gawk} for your system.
+@end enumerate
+
+Following these steps makes it much easier to integrate your changes
+into @command{gawk} and have them coexist happily with other
+operating systems' code that is already there.
+
+In the code that you supply and maintain, feel free to use a
+coding style and brace layout that suits your taste.
+
+@node Derived Files
+@appendixsubsec Why Generated Files Are Kept In Git
+
+@cindex Git, use of for @command{gawk} source code
+@c From emails written March 22, 2012, to the gawk developers list.
+
+If you look at the @command{gawk} source in the Git
+repository, you will notice that it includes files that are automatically
+generated by GNU infrastructure tools, such as @file{Makefile.in} from
+Automake and even @file{configure} from Autoconf.
+
+This is different from many Free Software projects that do not store
+the derived files, because that keeps the repository less cluttered,
+and it is easier to see the substantive changes when comparing versions
+and trying to understand what changed between commits.
+
+However, there are several reasons why the @command{gawk} maintainer
+likes to have everything in the repository.
+
+First, because it is then easy to reproduce any given version completely,
+without relying upon the availability of (older, likely obsolete, and
+maybe even impossible to find) other tools.
+
+As an extreme example, if you ever even think about trying to compile,
+oh, say, the V7 @command{awk}, you will discover that not only do you
+have to bootstrap the V7 @command{yacc} to do so, but you also need the
+V7 @command{lex}.  And the latter is pretty much impossible to bring up
+on a modern GNU/Linux system.@footnote{We tried. It was painful.}
+
+(Or, let's say @command{gawk} 1.2 required @command{bison} whatever-it-was
+in 1989 and that there was no @file{awkgram.c} file in the repository.  Is
+there a guarantee that we could find that @command{bison} version? Or that
+@emph{it} would build?)
+
+If the repository has all the generated files, then it's easy to just check
+them out and build. (Or @emph{easier}, depending upon how far back we go.)
+
+And that brings us to the second (and stronger) reason why all the files
+really need to be in Git.  It boils down to who do you cater
+to---the @command{gawk} developer(s), or the user who just wants to check
+out a version and try it out?
+
+The @command{gawk} maintainer
+wants it to be possible for any interested @command{awk} user in the
+world to just clone the repository, check out the branch of interest and
+build it. Without their having to have the correct version(s) of the
+autotools.@footnote{There is one GNU program that is (in our opinion)
+severely difficult to bootstrap from the Git repository. For
+example, on the author's old (but still working) PowerPC Macintosh with
+Mac OS X 10.5, it was necessary to bootstrap a ton of software, starting
+with Git itself, in order to try to work with the latest code.
+It's not pleasant, and especially on older systems, it's a big waste
+of time.
+
+Starting with the latest tarball was no picnic either. The maintainers
+had dropped @file{.gz} and @file{.bz2} files and only distribute
+@file{.tar.xz} files.  It was necessary to bootstrap @command{xz} first!}
+That is the point of the @file{bootstrap.sh} file.  It touches the
+various other files in the right order such that
+
+@example
+# The canonical incantation for building GNU software:
+./bootstrap.sh && ./configure && make
+@end example
+
+@noindent
+will @emph{just work}.
+
+This is extremely important for the @code{master} and
+@code{gawk-@var{X}.@var{Y}-stable} branches.
+
+Further, the @command{gawk} maintainer would argue that it's also
+important for the @command{gawk} developers. When he tried to check out
+the @code{xgawk} branch@footnote{A branch (since removed) created by one of the other
+developers that did not include the generated files.} to build it, he
+couldn't. (No @file{ltmain.sh} file, and he had no idea how to create it,
+and that was not the only problem.)
+
+He felt @emph{extremely} frustrated.  With respect to that branch,
+the maintainer is no different than Jane User who wants to try to build
+@code{gawk-4.1-stable} or @code{master} from the repository.
+
+Thus, the maintainer thinks that it's not just important, but critical,
+that for any given branch, the above incantation @emph{just works}.
+
+@c Added 9/2014:
+A third reason to have all the files is that without them, using @samp{git
+bisect} to try to find the commit that introduced a bug is exceedingly
+difficult. The maintainer tried to do that on another project that
+requires running bootstrapping scripts just to create @command{configure}
+and so on; it was really painful. When the repository is self-contained,
+using @command{git bisect} in it is very easy.
+
+@c So - that's my reasoning and philosophy.
+
+What are some of the consequences and/or actions to take?
+
+@enumerate 1
+@item
+We don't mind that there are differing files in the different branches
+as a result of different versions of the autotools.
+
+@enumerate A
+@item
+It's the maintainer's job to merge them and he will deal with it.
+
+@item
+He is really good at @samp{git diff x y > /tmp/diff1 ; gvim /tmp/diff1} to
+remove the diffs that aren't of interest in order to review code.
+@end enumerate
+
+@item
+It would certainly help if everyone used the same versions of the GNU tools
+as he does, which in general are the latest released versions of
+Automake,
+Autoconf,
+@command{bison},
+GNU @command{gettext},
+and
+Libtool.
+
+@ignore
+If it would help if I sent out an ``I just upgraded to version x.y
+of tool Z'' kind of message to this list, I can do that.  Up until
+now it hasn't been a real issue since I'm the only one who's been
+dorking with the configuration machinery.
+@end ignore
+
+@c @enumerate A
+@c @item
+Installing from source is quite easy. It's how the maintainer worked for years
+(and still works).
+He had @file{/usr/local/bin} at the front of his @env{PATH} and just did:
+
+@example
+wget https://ftp.gnu.org/gnu/@var{package}/@var{package}-@var{x}.@var{y}.@var{z}.tar.gz
+tar -xpzvf @var{package}-@var{x}.@var{y}.@var{z}.tar.gz
+cd @var{package}-@var{x}.@var{y}.@var{z}
+./configure && make && make check
+make install    # as root
+@end example
+
+@quotation NOTE
+Because of the @samp{https://} URL, you may have to supply the
+@option{--no-check-certificate} option to @command{wget} to download
+the file.
+@end quotation
+
+@c @item
+@ignore
+These days the maintainer uses Ubuntu 12.04 which is medium current, but
+he is already doing the above for Automake, Autoconf, and @command{bison}.
+@end ignore
+
+@ignore
+(C. Rant: Recent Linux versions with GNOME 3 really suck. What
+    are all those people thinking?  Fedora 15 was such a bust it drove
+    me to Ubuntu, but Ubuntu 11.04 and 11.10 are totally unusable from
+    a UI perspective. Bleah.)
+@end ignore
+@c @end enumerate
+
+@ignore
+@item
+If someone still feels really strongly about all this, then perhaps they
+can have two branches, one for their development with just the clean
+changes, and one that is buildable (xgawk and xgawk-buildable, maybe).
+Or, as I suggested in another mail, make commits in pairs, the first with
+the "real" changes and the second with "everything else needed for
+ building".
+@end ignore
+@end enumerate
+
+Most of the above was originally written by the maintainer to other
+@command{gawk} developers.  It raised the objection from one of
+the developers ``@dots{} that anybody pulling down the source from
+Git is not an end user.''
+
+However, this is not true. There are ``power @command{awk} users''
+who can build @command{gawk} (using the magic incantation shown previously)
+but who can't program in C.  Thus, the major branches should be
+kept buildable all the time.
+
+It was then suggested that there be a @command{cron} job to create
+nightly tarballs of ``the source.''  Here, the problem is that there
+are source trees, corresponding to the various branches! So,
+nightly tarballs aren't the answer, especially as the repository can go
+for weeks without significant change being introduced.
+
+Fortunately, the Git server can meet this need. For any given
+branch named @var{branchname}, use:
+
+@example
+wget https://git.savannah.gnu.org/cgit/gawk.git/snapshot/gawk-@var{branchname}.tar.gz
+@end example
+
+@noindent
+to retrieve a snapshot of the given branch.
+
+@node Future Extensions
+@appendixsec Probable Future Extensions
+@ignore
+From emory!scalpel.netlabs.com!lwall Tue Oct 31 12:43:17 1995
+Return-Path: <emory!scalpel.netlabs.com!lwall>
+Message-Id: <9510311732.AA28472@scalpel.netlabs.com>
+To: arnold@skeeve.atl.ga.us (Arnold D. Robbins)
+Subject: Re: May I quote you?
+In-Reply-To: Your message of "Tue, 31 Oct 95 09:11:00 EST."
+             <m0tAHPQ-00014MC@skeeve.atl.ga.us>
+Date: Tue, 31 Oct 95 09:32:46 -0800
+From: Larry Wall <emory!scalpel.netlabs.com!lwall>
+
+: Greetings. I am working on the release of gawk 3.0. Part of it will be a
+: thoroughly updated manual. One of the sections deals with planned future
+: extensions and enhancements.  I have the following at the beginning
+: of it:
+:
+: @cindex PERL
+: @cindex Wall, Larry
+: @display
+: @i{AWK is a language similar to PERL, only considerably more elegant.} @*
+: Arnold Robbins
+: @sp 1
+: @i{Hey!} @*
+: Larry Wall
+: @end display
+:
+: Before I actually release this for publication, I wanted to get your
+: permission to quote you.  (Hopefully, in the spirit of much of GNU, the
+: implied humor is visible... :-)
+
+I think that would be fine.
+
+Larry
+@end ignore
+@cindex Perl
+@cindex Wall, Larry
+@cindex Robbins, Arnold
+@quotation
+@i{AWK is a language similar to PERL, only considerably more elegant.}
+@author Arnold Robbins
+@end quotation
+
+@quotation
+@i{Hey!}
+@author Larry Wall
+@end quotation
+
+The @file{TODO} file in the @code{master} branch of the @command{gawk}
+Git repository lists possible future enhancements.  Some of these relate
+to the source code, and others to possible new features.  Please see
+that file for the list.
+@xref{Additions},
+if you are interested in tackling any of the projects listed there.
+
+@node Implementation Limitations
+@appendixsec Some Limitations of the Implementation
+
+This following table describes limits of @command{gawk} on a Unix-like
+system (although it is variable even then). Other systems may have
+different limits.
+
+@multitable @columnfractions .40 .60
+@headitem Item @tab Limit
+@item Characters in a character class @tab 2^(number of bits per byte)
+@item Length of input record @tab @code{MAX_INT}
+@item Length of output record @tab Unlimited
+@item Length of source line @tab Unlimited
+@item Number of fields in a record @tab @code{MAX_LONG}
+@item Number of file redirections @tab Unlimited
+@item Number of input records in one file @tab @code{MAX_LONG}
+@item Number of input records total @tab @code{MAX_LONG}
+@item Number of pipe redirections @tab min(number of processes per user, number of open files)
+@item Numeric values @tab Double-precision floating point (if not using MPFR)
+@item Size of a field @tab @code{MAX_INT}
+@item Size of a literal string @tab @code{MAX_INT}
+@item Size of a printf string @tab @code{MAX_INT}
+@end multitable
+
+@node Extension Design
+@appendixsec Extension API Design
+
+This @value{SECTION} documents the design of the extension API,
+including a discussion of some of the history and problems that needed
+to be solved.
+
+The first version of extensions for @command{gawk} was developed in
+the mid-1990s and released with @command{gawk} 3.1 in the late 1990s.
+The basic mechanisms and design remained unchanged for close to 15 years,
+until 2012.
+
+The old extension mechanism used data types and functions from
+@command{gawk} itself, with a ``clever hack'' to install extension
+functions.
+
+@command{gawk} included some sample extensions, of which a few were
+really useful.  However, it was clear from the outset that the extension
+mechanism was bolted onto the side and was not really well thought out.
+
+@menu
+* Old Extension Problems::           Problems with the old mechanism.
+* Extension New Mechanism Goals::    Goals for the new mechanism.
+* Extension Other Design Decisions:: Some other design decisions.
+* Extension Future Growth::          Some room for future growth.
+@end menu
+
+@node Old Extension Problems
+@appendixsubsec Problems With The Old Mechanism
+
+The old extension mechanism had several problems:
+
+@itemize @value{BULLET}
+@item
+It depended heavily upon @command{gawk} internals.  Any time the
+@code{NODE} structure@footnote{A critical central data structure
+inside @command{gawk}.} changed, an extension would have to be
+recompiled. Furthermore, to really write extensions required understanding
+something about @command{gawk}'s internal functions.  There was some
+documentation in this @value{DOCUMENT}, but it was quite minimal.
+
+@item
+Being able to call into @command{gawk} from an extension required linker
+facilities that are common on Unix-derived systems but that did
+not work on MS-Windows systems; users wanting extensions on MS-Windows
+had to statically link them into @command{gawk}, even though MS-Windows supports
+dynamic loading of shared objects.
+
+@item
+The API would change occasionally as @command{gawk} changed; no compatibility
+between versions was ever offered or planned for.
+@end itemize
+
+Despite the drawbacks, the @command{xgawk} project developers forked
+@command{gawk} and developed several significant extensions. They also
+enhanced @command{gawk}'s facilities relating to file inclusion and
+shared object access.
+
+A new API was desired for a long time, but only in 2012 did the
+@command{gawk} maintainer and the @command{xgawk} developers finally
+start working on it together.  More information about the @command{xgawk}
+project is provided in @ref{gawkextlib}.
+
+@node Extension New Mechanism Goals
+@appendixsubsec Goals For A New Mechanism
+
+Some goals for the new API were:
+
+@itemize @value{BULLET}
+@item
+The API should be independent of @command{gawk} internals.  Changes in
+@command{gawk} internals should not be visible to the writer of an
+extension function.
+
+@item
+The API should provide @emph{binary} compatibility across @command{gawk}
+releases as long as the API itself does not change.
+
+@item
+The API should enable extensions written in C or C++ to have roughly the
+same ``appearance'' to @command{awk}-level code as @command{awk}
+functions do. This means that extensions should have:
+
+@itemize @value{MINUS}
+@item
+The ability to access function parameters.
+
+@item
+The ability to turn an undefined parameter into an array (call by reference).
+
+@item
+The ability to create, access and update global variables.
+
+@item
+Easy access to all the elements of an array at once (``array flattening'')
+in order to loop over all the element in an easy fashion for C code.
+
+@item
+The ability to create arrays (including @command{gawk}'s true
+arrays of arrays).
+@end itemize
+@end itemize
+
+Some additional important goals were:
+
+@itemize @value{BULLET}
+@item
+The API should use only features in ISO C 90, so that extensions
+can be written using the widest range of C and C++ compilers. The header
+should include the appropriate @samp{#ifdef __cplusplus} and @samp{extern "C"}
+magic so that a C++ compiler could be used.  (If using C++, the runtime
+system has to be smart enough to call any constructors and destructors,
+as @command{gawk} is a C program. As of this writing, this has not been
+tested.)
+
+@item
+The API mechanism should not require access to @command{gawk}'s
+symbols@footnote{The @dfn{symbols} are the variables and functions
+defined inside @command{gawk}.  Access to these symbols by code
+external to @command{gawk} loaded dynamically at runtime is
+problematic on MS-Windows.} by the compile-time or dynamic linker,
+in order to enable creation of extensions that also work on MS-Windows.
+@end itemize
+
+During development, it became clear that there were other features
+that should be available to extensions, which were also subsequently
+provided:
+
+@itemize @value{BULLET}
+@item
+Extensions should have the ability to hook into @command{gawk}'s
+I/O redirection mechanism.  In particular, the @command{xgawk}
+developers provided a so-called ``open hook'' to take over reading
+records.  During development, this was generalized to allow
+extensions to hook into input processing, output processing, and
+two-way I/O.
+
+@item
+An extension should be able to provide a ``call back'' function
+to perform cleanup actions when @command{gawk} exits.
+
+@item
+An extension should be able to provide a version string so that
+@command{gawk}'s @option{--version} option can provide information
+about extensions as well.
+@end itemize
+
+The requirement to avoid access to @command{gawk}'s symbols is, at first
+glance, a difficult one to meet.
+
+One design, apparently used by Perl and Ruby and maybe others, would
+be to make the mainline @command{gawk} code into a library, with the
+@command{gawk} utility a small C @code{main()} function linked against
+the library.
+
+This seemed like the tail wagging the dog, complicating build and
+installation and making a simple copy of the @command{gawk} executable
+from one system to another (or one place to another on the same
+system!) into a chancy operation.
+
+Pat Rankin suggested the solution that was adopted.
+@xref{Extension Mechanism Outline}, for the details.
+
+@node Extension Other Design Decisions
+@appendixsubsec Other Design Decisions
+
+As an arbitrary design decision, extensions can read the values of
+predefined variables and arrays (such as @code{ARGV} and @code{FS}), but cannot
+change them, with the exception of @code{PROCINFO}.
+
+The reason for this is to prevent an extension function from affecting
+the flow of an @command{awk} program outside its control.  While a real
+@command{awk} function can do what it likes, that is at the discretion
+of the programmer.  An extension function should provide a service or
+make a C API available for use within @command{awk}, and not mess with
+@code{FS} or @code{ARGC} and @code{ARGV}.
+
+In addition, it becomes easy to start down a slippery slope. How
+much access to @command{gawk} facilities do extensions need?
+Do they need @code{getline}?  What about calling @code{gsub()} or
+compiling regular expressions?  What about calling into @command{awk}
+functions? (@emph{That} would be messy.)
+
+In order to avoid these issues, the @command{gawk} developers chose
+to start with the simplest, most basic features that are still truly useful.
+
+Another decision is that although @command{gawk} provides nice things like
+MPFR, and arrays indexed internally by integers, these features are not
+being brought out to the API in order to keep things simple and close to
+traditional @command{awk} semantics.  (In fact, arrays indexed internally
+by integers are so transparent that they aren't even documented!)
+
+Additionally, all functions in the API check that their pointer
+input parameters are not @code{NULL}. If they are, they return an error.
+(It is a good idea for extension code to verify that
+pointers received from @command{gawk} are not @code{NULL}.
+Such a thing should not happen, but the @command{gawk} developers
+are only human, and they have been known to occasionally make
+mistakes.)
+
+With time, the API will undoubtedly evolve; the @command{gawk} developers
+expect this to be driven by user needs. For now, the current API seems
+to provide a minimal yet powerful set of features for creating extensions.
+
+@node Extension Future Growth
+@appendixsubsec Room For Future Growth
+
+The API can later be expanded, in two ways:
+
+@itemize @value{BULLET}
+@item
+@command{gawk} passes an ``extension id'' into the extension when it
+first loads the extension.  The extension then passes this id back
+to @command{gawk} with each function call.  This mechanism allows
+@command{gawk} to identify the extension calling into it, should it need
+to know.
+
+@item
+Similarly, the extension passes a ``name space'' into @command{gawk}
+when it registers each extension function.  This accommodates a possible future
+mechanism for grouping extension functions and possibly avoiding name
+conflicts.
+@end itemize
+
+Of course, as of this writing, no decisions have been made with respect
+to any of the above.
+
+@node Notes summary
+@appendixsec Summary
+
+@itemize @value{BULLET}
+@item
+@command{gawk}'s extensions can be disabled with either the
+@option{--traditional} option or with the @option{--posix} option.
+The @option{--parsedebug} option is available if @command{gawk} is
+compiled with @samp{-DDEBUG}.
+
+@item
+The source code for @command{gawk} is maintained in a publicly
+accessible Git repository. Anyone may check it out and view the source.
+
+@item
+Contributions to @command{gawk} are welcome. Following the steps
+outlined in this @value{CHAPTER} will make it easier to integrate
+your contributions into the code base.
+This applies both to new feature contributions and to ports to
+additional operating systems.
+
+@item
+@command{gawk} has some limits---generally those that are imposed by
+the machine architecture.
+
+@item
+The extension API design was intended to solve a number of problems
+with the previous extension mechanism, enable features needed by
+the @code{xgawk} project, and provide binary compatibility going forward.
+
+@item
+The previous extension mechanism is no longer supported and was
+removed from the code base with the 4.2 release.
+
+@end itemize
+
+
+@node Basic Concepts
+@appendix Basic Programming Concepts
+@cindex programming, concepts
+@cindex programming, concepts
+
+This @value{APPENDIX} attempts to define some of the basic concepts
+and terms that are used throughout the rest of this @value{DOCUMENT}.
+As this @value{DOCUMENT} is specifically about @command{awk},
+and not about computer programming in general, the coverage here
+is by necessity fairly cursory and simplistic.
+(If you need more background, there are many
+other introductory texts that you should refer to instead.)
+
+@menu
+* Basic High Level::            The high level view.
+* Basic Data Typing::           A very quick intro to data types.
+@end menu
+
+@node Basic High Level
+@appendixsec What a Program Does
+
+@cindex processing data
+At the most basic level, the job of a program is to process
+some input data and produce results.
+@ifnotdocbook
+See @ref{figure-general-flow}.
+@end ifnotdocbook
+@ifdocbook
+See @inlineraw{docbook, <xref linkend="figure-general-flow"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-general-flow
+@caption{General Program Flow}
+@center @image{general-program, , , General program flow}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-general-flow" float="0">
+<title>General Program Flow</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="general-program.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+@cindex compiled programs
+@cindex interpreted programs
+The ``program'' in the figure can be either a compiled
+program@footnote{Compiled programs are typically written
+in lower-level languages such as C, C++, or Ada,
+and then translated, or @dfn{compiled}, into a form that
+the computer can execute directly.}
+(such as @command{ls}),
+or it may be @dfn{interpreted}.  In the latter case, a machine-executable
+program such as @command{awk} reads your program, and then uses the
+instructions in your program to process the data.
+
+@cindex programming, basic steps
+When you write a program, it usually consists
+of the following, very basic set of steps,
+@ifnotdocbook
+as shown in @ref{figure-process-flow}:
+@end ifnotdocbook
+@ifdocbook
+as shown in @inlineraw{docbook, <xref linkend="figure-process-flow"/>}:
+@end ifdocbook
+
+@ifnotdocbook
+@float Figure,figure-process-flow
+@caption{Basic Program Steps}
+@center @image{process-flow, , , Basic Program Stages}
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figure-process-flow" float="0">
+<title>Basic Program Stages</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="process-flow.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+@table @asis
+@item Initialization
+These are the things you do before actually starting to process
+data, such as checking arguments, initializing any data you need
+to work with, and so on.
+This step corresponds to @command{awk}'s @code{BEGIN} rule
+(@pxref{BEGIN/END}).
+
+If you were baking a cake, this might consist of laying out all the
+mixing bowls and the baking pan, and making sure you have all the
+ingredients that you need.
+
+@item Processing
+This is where the actual work is done.  Your program reads data,
+one logical chunk at a time, and processes it as appropriate.
+
+In most programming languages, you have to manually manage the reading
+of data, checking to see if there is more each time you read a chunk.
+@command{awk}'s pattern-action paradigm
+(@pxref{Getting Started})
+handles the mechanics of this for you.
+
+In baking a cake, the processing corresponds to the actual labor:
+breaking eggs, mixing the flour, water, and other ingredients, and then putting the cake
+into the oven.
+
+@item Clean Up
+Once you've processed all the data, you may have things you need to
+do before exiting.
+This step corresponds to @command{awk}'s @code{END} rule
+(@pxref{BEGIN/END}).
+
+After the cake comes out of the oven, you still have to wrap it in
+plastic wrap to keep anyone from tasting it, as well as wash
+the mixing bowls and utensils.
+@end table
+
+@cindex algorithms
+An @dfn{algorithm} is a detailed set of instructions necessary to accomplish
+a task, or process data.  It is much the same as a recipe for baking
+a cake.  Programs implement algorithms.  Often, it is up to you to design
+the algorithm and implement it, simultaneously.
+
+@cindex records
+@cindex fields
+The ``logical chunks'' we talked about previously are called @dfn{records},
+similar to the records a company keeps on employees, a school keeps for
+students, or a doctor keeps for patients.
+Each record has many component parts, such as first and last names,
+date of birth, address, and so on.  The component parts are referred
+to as the @dfn{fields} of the record.
+
+The act of reading data is termed @dfn{input}, and that of
+generating results, not too surprisingly, is termed @dfn{output}.
+They are often referred to together as ``input/output,''
+and even more often, as ``I/O'' for short.
+(You will also see ``input'' and ``output'' used as verbs.)
+
+@cindex data-driven languages
+@cindex languages@comma{} data-driven
+@command{awk} manages the reading of data for you, as well as the
+breaking it up into records and fields.  Your program's job is to
+tell @command{awk} what to do with the data.  You do this by describing
+@dfn{patterns} in the data to look for, and @dfn{actions} to execute
+when those patterns are seen.  This @dfn{data-driven} nature of
+@command{awk} programs usually makes them both easier to write
+and easier to read.
+
+@node Basic Data Typing
+@appendixsec Data Values in a Computer
+
+@cindex variables
+In a program,
+you keep track of information and values in things called @dfn{variables}.
+A variable is just a name for a given value, such as @code{first_name},
+@code{last_name}, @code{address}, and so on.
+@command{awk} has several predefined variables, and it has
+special names to refer to the current input record
+and the fields of the record.
+You may also group multiple
+associated values under one name, as an array.
+
+@cindex values, numeric
+@cindex values, string
+@cindex scalar values
+Data, particularly in @command{awk}, consists of either numeric
+values, such as 42 or 3.1415927, or string values.
+String values are essentially anything that's not a number, such as a name.
+Strings are sometimes referred to as @dfn{character data}, since they
+store the individual characters that comprise them.
+Individual variables, as well as numeric and string variables, are
+referred to as @dfn{scalar} values.
+Groups of values, such as arrays, are not scalars.
+
+@ref{Computer Arithmetic}, provided a basic introduction to numeric
+types (integer and floating-point) and how they are used in a computer.
+Please review that information, including a number of caveats that
+were presented.
+
+@cindex null strings
+While you are probably used to the idea of a number without a value (i.e., zero),
+it takes a bit more getting used to the idea of zero-length character data.
+Nevertheless, such a thing exists.
+It is called the @dfn{null string}.
+The null string is character data that has no value.
+In other words, it is empty.  It is written in @command{awk} programs
+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
+@iftex
+column.  (Remember grade school? @math{42 = 4\times 10 + 2}.)
+@end iftex
+@ifnottex
+column.  (Remember grade school? 42 = 4 x 10 + 2.)
+@end 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.
+@iftex
+Thus, binary 1010 represents @math{(1\times 8) + (0\times 4) + (1\times 2) + (0\times 1)}, or decimal 10.
+@end iftex
+@ifnottex
+Thus, binary 1010 represents (1 x 8) + (0 x 4) + (1 x 2)
++ (0 x 1), or decimal 10.
+@end ifnottex
+Octal and hexadecimal are discussed more in
+@ref{Nondecimal-numbers}.
+
+At the very lowest level, computers store values as groups of binary digits,
+or @dfn{bits}.  Modern computers group bits into groups of eight, called @dfn{bytes}.
+Advanced applications sometimes have to manipulate bits directly,
+and @command{gawk} provides functions for doing so.
+
+Programs are written in programming languages.
+Hundreds, if not thousands, of programming languages exist.
+One of the most popular is the C programming language.
+The C language had a very strong influence on the design of
+the @command{awk} language.
+
+@cindex Kernighan, Brian
+@cindex Ritchie, Dennis
+There have been several versions of C.  The first is often referred to
+as ``K&R'' C, after the initials of Brian Kernighan and Dennis Ritchie,
+the authors of the first book on C.  (Dennis Ritchie created the language,
+and Brian Kernighan was one of the creators of @command{awk}.)
+
+In the mid-1980s, an effort began to produce an international standard
+for C.  This work culminated in 1989, with the production of the ANSI
+standard for C.  This standard became an ISO standard in 1990.
+In 1999, a revised ISO C standard was approved and released.
+Where it makes sense, POSIX @command{awk} is compatible with 1999 ISO C.
+
+
+@node Glossary
+@unnumbered Glossary
+
+@table @asis
+@item Action
+A series of @command{awk} statements attached to a rule.  If the rule's
+pattern matches an input record, @command{awk} executes the
+rule's action.  Actions are always enclosed in braces.
+(@xref{Action Overview}.)
+
+@cindex Ada programming language
+@cindex programming languages, Ada
+@item Ada
+A programming language originally defined by the U.S.@: Department of
+Defense for embedded programming. It was designed to enforce good
+Software Engineering practices.
+
+@cindex Spencer, Henry
+@cindex @command{sed} utility
+@cindex amazing @command{awk} assembler (@command{aaa})
+@item Amazing @command{awk} Assembler
+Henry Spencer at the University of Toronto wrote a retargetable assembler
+completely as @command{sed} and @command{awk} scripts.  It is thousands
+of lines long, including machine descriptions for several eight-bit
+microcomputers.  It is a good example of a program that would have been
+better written in another language.
+@c You can get it from @uref{http://awk.info/?awk100/aaa}.
+
+@cindex amazingly workable formatter (@command{awf})
+@cindex @command{awf} (amazingly workable formatter) program
+@item Amazingly Workable Formatter (@command{awf})
+Henry Spencer at the University of Toronto wrote a formatter that accepts
+a large subset of the @samp{nroff -ms} and @samp{nroff -man} formatting
+commands, using @command{awk} and @command{sh}.
+@c It is available
+@c from @uref{http://awk.info/?tools/awf}.
+
+@item Anchor
+The regexp metacharacters @samp{^} and @samp{$}, which force the match
+to the beginning or end of the string, respectively.
+
+@cindex ANSI
+@item ANSI
+The American National Standards Institute.  This organization produces
+many standards, among them the standards for the C and C++ programming
+languages.
+These standards often become international standards as well. See also
+``ISO.''
+
+@item Argument
+An argument can be two different things.  It can be an option or a
+@value{FN} passed to a command while invoking it from the command line, or
+it can be something passed to a @dfn{function} inside a program, e.g.
+inside @command{awk}.
+
+In the latter case, an argument can be passed to a function in two ways.
+Either it is given to the called function by value, i.e., a copy of the
+value of the variable is made available to the called function, but the
+original variable cannot be modified by the function itself; or it is
+given by reference, i.e., a pointer to the interested variable is passed to
+the function, which can then directly modify it. In @command{awk}
+scalars are passed by value, and arrays are passed by reference.
+See ``Pass By Value/Reference.''
+
+@item Array
+A grouping of multiple values under the same name.
+Most languages just provide sequential arrays.
+@command{awk} provides associative arrays.
+
+@item Assertion
+A statement in a program that a condition is true at this point in the program.
+Useful for reasoning about how a program is supposed to behave.
+
+@item Assignment
+An @command{awk} expression that changes the value of some @command{awk}
+variable or data object.  An object that you can assign to is called an
+@dfn{lvalue}.  The assigned values are called @dfn{rvalues}.
+@xref{Assignment Ops}.
+
+@item Associative Array
+Arrays in which the indices may be numbers or strings, not just
+sequential integers in a fixed range.
+
+@item @command{awk} Language
+The language in which @command{awk} programs are written.
+
+@item @command{awk} Program
+An @command{awk} program consists of a series of @dfn{patterns} and
+@dfn{actions}, collectively known as @dfn{rules}.  For each input record
+given to the program, the program's rules are all processed in turn.
+@command{awk} programs may also contain function definitions.
+
+@item @command{awk} Script
+Another name for an @command{awk} program.
+
+@item Bash
+The GNU version of the standard shell
+@ifnotinfo
+(the @b{B}ourne-@b{A}gain @b{SH}ell).
+@end ifnotinfo
+@ifinfo
+(the Bourne-Again SHell).
+@end ifinfo
+See also ``Bourne Shell.''
+
+@item Binary
+Base-two notation, where the digits are @code{0}--@code{1}. Since
+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
+@iftex
+the same as decimal 21, (@math{(1\times 16) + (1\times 4) + (1\times 1)}).
+@end iftex
+@ifnottex
+the same as decimal 21, ((1 x 16) + (1 x 4) + (1 x 1)).
+@end ifnottex
+
+Since base-two numbers quickly become
+very long to read and write, they are usually grouped by 3 (i.e., they are
+read as octal numbers), or by 4 (i.e., they are read as hexadecimal
+numbers). There is no direct way to insert base 2 numbers in a C program.
+If need arises, such numbers are usually inserted as octal or hexadecimal
+numbers. The number of base-two digits that fit into registers used for
+representing integer numbers in computers is a rough indication of the
+computing power of the computer itself.  Most computers nowadays use 64
+bits for representing integer numbers in their registers, but 32-bit,
+16-bit and 8-bit registers have been widely used in the past.
+@xref{Nondecimal-numbers}.
+@item Bit
+Short for ``Binary Digit.''
+All values in computer memory ultimately reduce to binary digits: values
+that are either zero or one.
+Groups of bits may be interpreted differently---as integers,
+floating-point numbers, character data, addresses of other
+memory objects, or other data.
+@command{awk} lets you work with floating-point numbers and strings.
+@command{gawk} lets you manipulate bit values with the built-in
+functions described in
+@ref{Bitwise Functions}.
+
+Computers are often defined by how many bits they use to represent integer
+values.  Typical systems are 32-bit systems, but 64-bit systems are
+becoming increasingly popular, and 16-bit systems have essentially
+disappeared.
+
+@item Boolean Expression
+Named after the English mathematician Boole. See also ``Logical Expression.''
+
+@item Bourne Shell
+The standard shell (@file{/bin/sh}) on Unix and Unix-like systems,
+originally written by Steven R.@: Bourne at Bell Laboratories.
+Many shells (Bash, @command{ksh}, @command{pdksh}, @command{zsh}) are
+generally upwardly compatible with the Bourne shell.
+
+@item Braces
+The characters @samp{@{} and @samp{@}}.  Braces are used in
+@command{awk} for delimiting actions, compound statements, and function
+bodies.
+
+@item Bracket Expression
+Inside a @dfn{regular expression}, an expression included in square
+brackets, meant to designate a single character as belonging to a
+specified character class. A bracket expression can contain a list of one
+or more characters, like @samp{[abc]}, a range of characters, like
+@samp{[A-Z]}, or a name, delimited by @samp{:}, that designates a known set
+of characters, like @samp{[:digit:]}. The form of bracket expression
+enclosed between @samp{:} is independent of the underlying representation
+of the character themselves, which could utilize the ASCII, EBCDIC, or
+Unicode codesets, depending on the architecture of the computer system, and on
+localization.
+See also ``Regular Expression.''
+
+@item Built-in Function
+The @command{awk} language provides built-in functions that perform various
+numerical, I/O-related, and string computations.  Examples are
+@code{sqrt()} (for the square root of a number) and @code{substr()} (for a
+substring of a string).
+@command{gawk} provides functions for timestamp management, bit manipulation,
+array sorting, type checking,
+and runtime string translation.
+(@xref{Built-in}.)
+
+@item Built-in Variable
+@code{ARGC},
+@code{ARGV},
+@code{CONVFMT},
+@code{ENVIRON},
+@code{FILENAME},
+@code{FNR},
+@code{FS},
+@code{NF},
+@code{NR},
+@code{OFMT},
+@code{OFS},
+@code{ORS},
+@code{RLENGTH},
+@code{RSTART},
+@code{RS},
+and
+@code{SUBSEP}
+are the variables that have special meaning to @command{awk}.
+In addition,
+@code{ARGIND},
+@code{BINMODE},
+@code{ERRNO},
+@code{FIELDWIDTHS},
+@code{FPAT},
+@code{IGNORECASE},
+@code{LINT},
+@code{PROCINFO},
+@code{RT},
+and
+@code{TEXTDOMAIN}
+are the variables that have special meaning to @command{gawk}.
+Changing some of them affects @command{awk}'s running environment.
+(@xref{Built-in Variables}.)
+
+@item C
+The system programming language that most GNU software is written in.  The
+@command{awk} programming language has C-like syntax, and this @value{DOCUMENT}
+points out similarities between @command{awk} and C when appropriate.
+
+In general, @command{gawk} attempts to be as similar to the 1990 version
+of ISO C as makes sense.
+
+@item C Shell
+The C Shell (@command{csh} or its improved version, @command{tcsh}) is a Unix shell that was
+created by Bill Joy in the late 1970s. The C shell was differentiated from
+other shells by its interactive features and overall style, which
+looks more like C. The C Shell is not backward compatible with the Bourne
+Shell, so special attention is required when converting scripts
+written for other Unix shells to the C shell, especially with regard to the management of
+shell variables.
+See also ``Bourne Shell.''
+
+@item C++
+A popular object-oriented programming language derived from C.
+
+@item Character Class
+See ``Bracket Expression.''
+
+@item Character List
+See ``Bracket Expression.''
+
+@cindex ASCII
+@cindex ISO 8859-1
+@cindex ISO Latin-1
+@cindex character sets (machine character encodings)
+@cindex Unicode
+@item Character Set
+The set of numeric codes used by a computer system to represent the
+characters (letters, numbers, punctuation, etc.) of a particular country
+or place. The most common character set in use today is ASCII (American
+Standard Code for Information Interchange).  Many European
+countries use an extension of ASCII known as ISO-8859-1 (ISO Latin-1).
+The @uref{http://www.unicode.org, Unicode character set} is
+increasingly popular and standard, and is particularly
+widely used on GNU/Linux systems.
+
+@cindex Kernighan, Brian
+@cindex Bentley, Jon
+@cindex @command{chem} utility
+@item CHEM
+A preprocessor for @command{pic} that reads descriptions of molecules
+and produces @command{pic} input for drawing them.
+It was written in @command{awk}
+by Brian Kernighan and Jon Bentley, and is available from
+@uref{http://netlib.org/typesetting/chem}.
+
+@item Comparison Expression
+A relation that is either true or false, such as @samp{a < b}.
+Comparison expressions are used in @code{if}, @code{while}, @code{do},
+and @code{for}
+statements, and in patterns to select which input records to process.
+(@xref{Typing and Comparison}.)
+
+@cindex compiled programs
+@item Compiler
+A program that translates human-readable source code into
+machine-executable object code.  The object code is then executed
+directly by the computer.
+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:]]}
+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}.
+See ``Bracket Expression.''
+
+@item Compound Statement
+A series of @command{awk} statements, enclosed in curly braces.  Compound
+statements may be nested.
+(@xref{Statements}.)
+
+@item Computed Regexps
+See ``Dynamic Regular Expressions.''
+
+@item Concatenation
+Concatenating two strings means sticking them together, one after another,
+producing a new string.  For example, the string @samp{foo} concatenated with
+the string @samp{bar} gives the string @samp{foobar}.
+(@xref{Concatenation}.)
+
+@item Conditional Expression
+An expression using the @samp{?:} ternary operator, such as
+@samp{@var{expr1} ? @var{expr2} : @var{expr3}}.  The expression
+@var{expr1} is evaluated; if the result is true, the value of the whole
+expression is the value of @var{expr2}; otherwise the value is
+@var{expr3}.  In either case, only one of @var{expr2} and @var{expr3}
+is evaluated. (@xref{Conditional Exp}.)
+
+@item Control Statement
+A control statement is an instruction to perform a given operation or a set
+of operations inside an @command{awk} program, if a given condition is
+true. Control statements are: @code{if}, @code{for}, @code{while}, and
+@code{do}
+(@pxref{Statements}).
+
+@cindex McIlroy, Doug
+@cindex cookie
+@item Cookie
+A peculiar goodie, token, saying or remembrance
+produced by or presented to a program. (With thanks to Professor Doug McIlroy.)
+@ignore
+From: Doug McIlroy <doug@cs.dartmouth.edu>
+Date: Sat, 13 Oct 2012 19:55:25 -0400
+To: arnold@skeeve.com
+Subject: Re: origin of the term "cookie"?
+
+I believe the term "cookie", for a more or less inscrutable
+saying or crumb of information, was injected into Unix
+jargon by Bob Morris, who used the word quite frequently.
+It had no fixed meaning as it now does in browsers.
+
+The word had been around long before it was recognized in
+the 8th edition glossary (earlier editions had no glossary):
+
+cookie   a peculiar goodie, token, saying or remembrance
+returned by or presented to a program. [I would say that
+"returned by" would better read "produced by", and assume
+responsibility for the inexactitude.]
+
+Doug McIlroy
+
+From: Doug McIlroy <doug@cs.dartmouth.edu>
+Date: Sun, 14 Oct 2012 10:08:43 -0400
+To: arnold@skeeve.com
+Subject: Re: origin of the term "cookie"?
+
+> Can I forward your email to Eric Raymond, for possible addition to the
+> Jargon File?
+
+Sure. I might add that I don't know how "cookie" entered Morris's
+vocabulary. Certainly "values of beta give rise to dom!" (see google)
+was an early, if not the earliest Unix cookie.  The fact that it was
+found lying around on a model 37 teletype (which had Greek beta in
+its type box) suggests that maybe it was seen to be like milk and
+cookies laid out for Santa Claus. Morris was wont to make such
+connections.
+
+Doug
+@end ignore
+
+@item Coprocess
+A subordinate program with which two-way communications is possible.
+
+@item Curly Braces
+See ``Braces.''
+
+@cindex dark corner
+@item Dark Corner
+An area in the language where specifications often were (or still
+are) not clear, leading to unexpected or undesirable behavior.
+Such areas are marked in this @value{DOCUMENT} with
+@iftex
+the picture of a flashlight in the margin
+@end iftex
+@ifnottex
+``(d.c.)'' in the text
+@end ifnottex
+and are indexed under the heading ``dark corner.''
+
+@item Data Driven
+A description of @command{awk} programs, where you specify the data you
+are interested in processing, and what to do when that data is seen.
+
+@item Data Objects
+These are numbers and strings of characters.  Numbers are converted into
+strings and vice versa, as needed.
+(@xref{Conversion}.)
+
+@item Deadlock
+The situation in which two communicating processes are each waiting
+for the other to perform an action.
+
+@item Debugger
+A program used to help developers remove ``bugs'' from (de-bug)
+their programs.
+
+@item Double Precision
+An internal representation of numbers that can have fractional parts.
+Double precision numbers keep track of more digits than do single precision
+numbers, but operations on them are sometimes more expensive.  This is the way
+@command{awk} stores numeric values.  It is the C type @code{double}.
+
+@item Dynamic Regular Expression
+A dynamic regular expression is a regular expression written as an
+ordinary expression.  It could be a string constant, such as
+@code{"foo"}, but it may also be an expression whose value can vary.
+(@xref{Computed Regexps}.)
+
+@item Empty String
+See ``Null String.''
+
+@item Environment
+A collection of strings, of the form @samp{@var{name}=@var{val}}, that each
+program has available to it. Users generally place values into the
+environment in order to provide information to various programs. Typical
+examples are the environment variables @env{HOME} and @env{PATH}.
+
+@cindex epoch, definition of
+@item Epoch
+The date used as the ``beginning of time'' for timestamps.
+Time values in most systems are represented as seconds since the epoch,
+with library functions available for converting these values into
+standard date and time formats.
+
+The epoch on Unix and POSIX systems is 1970-01-01 00:00:00 UTC.
+See also ``GMT'' and ``UTC.''
+
+@item Escape Sequences
+A special sequence of characters used for describing nonprinting
+characters, such as @samp{\n} for newline or @samp{\033} for the ASCII
+ESC (Escape) character. (@xref{Escape Sequences}.)
+
+@item Extension
+An additional feature or change to a programming language or
+utility not defined by that language's or utility's standard.
+@command{gawk} has (too) many extensions over POSIX @command{awk}.
+
+@item FDL
+See ``Free Documentation License.''
+
+@item Field
+When @command{awk} reads an input record, it splits the record into pieces
+separated by whitespace (or by a separator regexp that you can
+change by setting the predefined variable @code{FS}).  Such pieces are
+called fields.  If the pieces are of fixed length, you can use the built-in
+variable @code{FIELDWIDTHS} to describe their lengths.
+If you wish to specify the contents of fields instead of the field
+separator, you can use the predefined variable @code{FPAT} to do so.
+(@xref{Field Separators},
+@ref{Constant Size},
+and
+@ref{Splitting By Content}.)
+
+@item Flag
+A variable whose truth value indicates the existence or nonexistence
+of some condition.
+
+@item Floating-Point Number
+Often referred to in mathematical terms as a ``rational'' or real number,
+this is just a number that can have a fractional part.
+See also ``Double Precision'' and ``Single Precision.''
+
+@item Format
+Format strings control the appearance of output in the
+@code{strftime()} and @code{sprintf()} functions, and in the
+@code{printf} statement as well.  Also, data conversions from numbers to strings
+are controlled by the format strings contained in the predefined variables
+@code{CONVFMT} and @code{OFMT}. (@xref{Control Letters}.)
+
+@item Fortran
+Shorthand for FORmula TRANslator, one of the first programming languages
+available for scientific calculations. It was created by John Backus,
+and has been available since 1957. It is still in use today.
+
+@item Free Documentation License
+This document describes the terms under which this @value{DOCUMENT}
+is published and may be copied. (@xref{GNU Free Documentation License}.)
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@cindex Stallman, Richard
+@item Free Software Foundation
+A nonprofit organization dedicated
+to the production and distribution of freely distributable software.
+It was founded by Richard M.@: Stallman, the author of the original
+Emacs editor.  GNU Emacs is the most widely used version of Emacs today.
+
+@item FSF
+See ``Free Software Foundation.''
+
+@item Function
+A part of an @command{awk} program that can be invoked from every point of
+the program, to perform a task.  @command{awk} has several built-in
+functions.
+Users can define their own functions in every part of the program.
+Function can be recursive, i.e., they may invoke themselves.
+@xref{Functions}.
+In @command{gawk} it is also possible to have functions shared
+among different programs, and included where required using the
+@code{@@include} directive
+(@pxref{Include Files}).
+In @command{gawk} the name of the function that should be invoked
+can be generated at run time, i.e., dynamically.
+The @command{gawk} extension API provides constructor functions
+(@pxref{Constructor Functions}).
+
+
+@item @command{gawk}
+The GNU implementation of @command{awk}.
+
+@cindex GPL (General Public License)
+@cindex General Public License (GPL)
+@cindex GNU General Public License
+@item General Public License
+This document describes the terms under which @command{gawk} and its source
+code may be distributed. (@xref{Copying}.)
+
+@item GMT
+``Greenwich Mean Time.''
+This is the old term for UTC.
+It is the time of day used internally for Unix and POSIX systems.
+See also ``Epoch'' and ``UTC.''
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@cindex GNU Project
+@item GNU
+``GNU's not Unix''.  An on-going project of the Free Software Foundation
+to create a complete, freely distributable, POSIX-compliant computing
+environment.
+
+@item GNU/Linux
+A variant of the GNU system using the Linux kernel, instead of the
+Free Software Foundation's Hurd kernel.
+The Linux kernel is a stable, efficient, full-featured clone of Unix that has
+been ported to a variety of architectures.
+It is most popular on PC-class systems, but runs well on a variety of
+other systems too.
+The Linux kernel source code is available under the terms of the GNU General
+Public License, which is perhaps its most important aspect.
+
+@item GPL
+See ``General Public License.''
+
+@item Hexadecimal
+Base 16 notation, where the digits are @code{0}--@code{9} and
+@code{A}--@code{F}, 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},
+@iftex
+to indicate their base.  Thus, @code{0x12} is 18 (@math{(1\times 16) + 2}).
+@end iftex
+@ifnottex
+to indicate their base.  Thus, @code{0x12} is 18 ((1 x 16) + 2).
+@end ifnottex
+@xref{Nondecimal-numbers}.
+
+@item I/O
+Abbreviation for ``Input/Output,'' the act of moving data into and/or
+out of a running program.
+
+@item Input Record
+A single chunk of data that is read in by @command{awk}.  Usually, an @command{awk} input
+record consists of one line of text.
+(@xref{Records}.)
+
+@item Integer
+A whole number, i.e., a number that does not have a fractional part.
+
+@item Internationalization
+The process of writing or modifying a program so
+that it can use multiple languages without requiring
+further source code changes.
+
+@cindex interpreted programs
+@item Interpreter
+A program that reads human-readable source code directly, and uses
+the instructions in it to process data and produce results.
+@command{awk} is typically (but not always) implemented as an interpreter.
+See also ``Compiler.''
+
+@item Interval Expression
+A component of a regular expression that lets you specify repeated matches of
+some part of the regexp.  Interval expressions were not originally available
+in @command{awk} programs.
+
+@cindex ISO
+@item ISO
+The International Organization for Standardization.
+This organization produces international standards for many things, including
+programming languages, such as C and C++.
+In the computer arena, important standards like those for C, C++, and POSIX
+become both American national and ISO international standards simultaneously.
+This @value{DOCUMENT} refers to Standard C as ``ISO C'' throughout.
+See @uref{https://www.iso.org/iso/home/about.htm, the ISO website} for more
+information about the name of the organization and its language-independent
+three-letter acronym.
+
+@cindex Java programming language
+@cindex programming languages, Java
+@item Java
+A modern programming language originally developed by Sun Microsystems
+(now Oracle) supporting Object-Oriented programming.  Although usually
+implemented by compiling to the instructions for a standard virtual
+machine (the JVM), the language can be compiled to native code.
+
+@item Keyword
+In the @command{awk} language, a keyword is a word that has special
+meaning.  Keywords are reserved and may not be used as variable names.
+
+@command{gawk}'s keywords are:
+@code{BEGIN},
+@code{BEGINFILE},
+@code{END},
+@code{ENDFILE},
+@code{break},
+@code{case},
+@code{continue},
+@code{default},
+@code{delete},
+@code{do@dots{}while},
+@code{else},
+@code{exit},
+@code{for@dots{}in},
+@code{for},
+@code{function},
+@code{func},
+@code{if},
+@code{next},
+@code{nextfile},
+@code{switch},
+and
+@code{while}.
+
+@item Korn Shell
+The Korn Shell (@command{ksh}) is a Unix shell which was developed by David Korn at Bell
+Laboratories in the early 1980s. The Korn Shell is backward-compatible with the Bourne
+shell and includes many features of the C shell.
+See also ``Bourne Shell.''
+
+@cindex LGPL (Lesser General Public License)
+@cindex Lesser General Public License (LGPL)
+@cindex GNU Lesser General Public License
+@item Lesser General Public License
+This document describes the terms under which binary library archives
+or shared objects,
+and their source code may be distributed.
+
+@item LGPL
+See ``Lesser General Public License.''
+
+@item Linux
+See ``GNU/Linux.''
+
+@item Localization
+The process of providing the data necessary for an
+internationalized program to work in a particular language.
+
+@item Logical Expression
+An expression using the operators for logic, AND, OR, and NOT, written
+@samp{&&}, @samp{||}, and @samp{!} in @command{awk}. Often called Boolean
+expressions, after the mathematician who pioneered this kind of
+mathematical logic.
+
+@item Lvalue
+An expression that can appear on the left side of an assignment
+operator.  In most languages, lvalues can be variables or array
+elements.  In @command{awk}, a field designator can also be used as an
+lvalue.
+
+@item Matching
+The act of testing a string against a regular expression.  If the
+regexp describes the contents of the string, it is said to @dfn{match} it.
+
+@item Metacharacters
+Characters used within a regexp that do not stand for themselves.
+Instead, they denote regular expression operations, such as repetition,
+grouping, or alternation.
+
+@item Nesting
+Nesting is where information is organized in layers, or where objects
+contain other similar objects.
+In @command{gawk} the @code{@@include}
+directive can be nested. The ``natural'' nesting of arithmetic and
+logical operations can be changed using parentheses
+(@pxref{Precedence}).
+
+@item No-op
+An operation that does nothing.
+
+@item Null String
+A string with no characters in it.  It is represented explicitly in
+@command{awk} programs by placing two double quote characters next to
+each other (@code{""}).  It can appear in input data by having two successive
+occurrences of the field separator appear next to each other.
+
+@item Number
+A numeric-valued data object.  Modern @command{awk} implementations use
+double precision floating-point to represent numbers.
+Ancient @command{awk} implementations used single precision floating-point.
+
+@item Octal
+Base-eight notation, where the digits are @code{0}--@code{7}.
+Octal numbers are written in C using a leading @samp{0},
+@iftex
+to indicate their base.  Thus, @code{013} is 11 (@math{(1\times 8) + 3}).
+@end iftex
+@ifnottex
+to indicate their base.  Thus, @code{013} is 11 ((1 x 8) + 3).
+@end ifnottex
+@xref{Nondecimal-numbers}.
+
+@item Output Record
+A single chunk of data that is written out by @command{awk}.  Usually, an
+@command{awk} output record consists of one or more lines of text.
+@xref{Records}.
+
+@item Pattern
+Patterns tell @command{awk} which input records are interesting to which
+rules.
+
+A pattern is an arbitrary conditional expression against which input is
+tested.  If the condition is satisfied, the pattern is said to @dfn{match}
+the input record.  A typical pattern might compare the input record against
+a regular expression. (@xref{Pattern Overview}.)
+
+@item PEBKAC
+An acronym describing what is possibly the most frequent
+source of computer usage problems. (Problem Exists Between
+Keyboard And Chair.)
+
+@item Plug-in
+See ``Extensions.''
+
+@item POSIX
+The name for a series of standards
+that specify a Portable Operating System interface.  The ``IX'' denotes
+the Unix heritage of these standards.  The main standard of interest for
+@command{awk} users is
+@cite{IEEE Standard for Information Technology, Standard 1003.1-2008}.
+The 2008 POSIX standard can be found online at
+@url{http://pubs.opengroup.org/onlinepubs/9699919799/}.
+
+@item Precedence
+The order in which operations are performed when operators are used
+without explicit parentheses.
+
+@item Private
+Variables and/or functions that are meant for use exclusively by library
+functions and not for the main @command{awk} program. Special care must be
+taken when naming such variables and functions.
+(@xref{Library Names}.)
+
+@item Range (of input lines)
+A sequence of consecutive lines from the input file(s).  A pattern
+can specify ranges of input lines for @command{awk} to process or it can
+specify single lines. (@xref{Pattern Overview}.)
+
+@item Record
+See ``Input record'' and ``Output record.''
+
+@item Recursion
+When a function calls itself, either directly or indirectly.
+If this is clear, stop, and proceed to the next entry.
+Otherwise, refer to the entry for ``recursion.''
+
+@item Redirection
+Redirection means performing input from something other than the standard input
+stream, or performing output to something other than the standard output stream.
+
+You can redirect input to the @code{getline} statement using
+the @samp{<}, @samp{|}, and @samp{|&} operators.
+You can redirect the output of the @code{print} and @code{printf} statements
+to a file or a system command, using the @samp{>}, @samp{>>}, @samp{|}, and @samp{|&}
+operators.
+(@xref{Getline},
+and @ref{Redirection}.)
+
+@item Reference Counts
+An internal mechanism in @command{gawk} to minimize the amount of memory
+needed to store the value of string variables. If the value assumed by
+a variable is used in more than one place, only one copy of the value
+itself is kept, and the associated reference count is increased when the
+same value is used by an additional variable, and decreased when the related
+variable is no longer in use. When the reference count goes to zero,
+the memory space used to store the value of the variable is freed.
+
+@item Regexp
+See ``Regular Expression.''
+
+@item Regular Expression
+A regular expression (``regexp'' for short) is a pattern that denotes a
+set of strings, possibly an infinite set.  For example, the regular expression
+@samp{R.*xp} matches any string starting with the letter @samp{R}
+and ending with the letters @samp{xp}.  In @command{awk}, regular expressions are
+used in patterns and in conditional expressions.  Regular expressions may contain
+escape sequences. (@xref{Regexp}.)
+
+@item Regular Expression Constant
+A regular expression constant is a regular expression written within
+slashes, such as @code{/foo/}.  This regular expression is chosen
+when you write the @command{awk} program and cannot be changed during
+its execution. (@xref{Regexp Usage}.)
+
+@item Regular Expression Operators
+See ``Metacharacters.''
+
+@item Rounding
+Rounding the result of an arithmetic operation can be tricky.
+More than one way of rounding exists, and in @command{gawk}
+it is possible to choose which method should be used in a program.
+@xref{Setting the rounding mode}.
+
+@item Rule
+A segment of an @command{awk} program that specifies how to process single
+input records.  A rule consists of a @dfn{pattern} and an @dfn{action}.
+@command{awk} reads an input record; then, for each rule, if the input record
+satisfies the rule's pattern, @command{awk} executes the rule's action.
+Otherwise, the rule does nothing for that input record.
+
+@item Rvalue
+A value that can appear on the right side of an assignment operator.
+In @command{awk}, essentially every expression has a value. These values
+are rvalues.
+
+@item Scalar
+A single value, be it a number or a string.
+Regular variables are scalars; arrays and functions are not.
+
+@item Search Path
+In @command{gawk}, a list of directories to search for @command{awk} program source files.
+In the shell, a list of directories to search for executable programs.
+
+@item @command{sed}
+See ``Stream Editor.''
+
+@item Seed
+The initial value, or starting point, for a sequence of random numbers.
+
+@item Shell
+The command interpreter for Unix and POSIX-compliant systems.
+The shell works both interactively, and as a programming language
+for batch files, or shell scripts.
+
+@item Short-Circuit
+The nature of the @command{awk} logical operators @samp{&&} and @samp{||}.
+If the value of the entire expression is determinable from evaluating just
+the lefthand side of these operators, the righthand side is not
+evaluated.
+(@xref{Boolean Ops}.)
+
+@item Side Effect
+A side effect occurs when an expression has an effect aside from merely
+producing a value.  Assignment expressions, increment and decrement
+expressions, and function calls have side effects.
+(@xref{Assignment Ops}.)
+
+@item Single Precision
+An internal representation of numbers that can have fractional parts.
+Single precision numbers keep track of fewer digits than do double precision
+numbers, but operations on them are sometimes less expensive in terms of CPU time.
+This is the type used by some ancient versions of @command{awk} to store
+numeric values.  It is the C type @code{float}.
+
+@item Space
+The character generated by hitting the space bar on the keyboard.
+
+@item Special File
+A @value{FN} interpreted internally by @command{gawk}, instead of being handed
+directly to the underlying operating system---for example, @file{/dev/stderr}.
+(@xref{Special Files}.)
+
+@item Statement
+An expression inside an @command{awk} program in the action part
+of a pattern--action rule, or inside an
+@command{awk} function. A statement can be a variable assignment,
+an array operation, a loop, etc.
+
+@item Stream Editor
+A program that reads records from an input stream and processes them one
+or more at a time.  This is in contrast with batch programs, which may
+expect to read their input files in entirety before starting to do
+anything, as well as with interactive programs which require input from the
+user.
+
+@item String
+A datum consisting of a sequence of characters, such as @samp{I am a
+string}.  Constant strings are written with double quotes in the
+@command{awk} language and may contain escape sequences.
+(@xref{Escape Sequences}.)
+
+@item Tab
+The character generated by hitting the @kbd{TAB} key on the keyboard.
+It usually expands to up to eight spaces upon output.
+
+@item Text Domain
+A unique name that identifies an application.
+Used for grouping messages that are translated at runtime
+into the local language.
+
+@item Timestamp
+A value in the ``seconds since the epoch'' format used by Unix
+and POSIX systems.  Used for the @command{gawk} functions
+@code{mktime()}, @code{strftime()}, and @code{systime()}.
+See also ``Epoch,'' ``GMT,'' and ``UTC.''
+
+@cindex Linux
+@cindex GNU/Linux
+@cindex Unix
+@cindex BSD-based operating systems
+@cindex NetBSD
+@cindex FreeBSD
+@cindex OpenBSD
+@item Unix
+A computer operating system originally developed in the early 1970's at
+AT&T Bell Laboratories.  It initially became popular in universities around
+the world and later moved into commercial environments as a software
+development system and network server system. There are many commercial
+versions of Unix, as well as several work-alike systems whose source code
+is freely available (such as GNU/Linux, @uref{http://www.netbsd.org, NetBSD},
+@uref{https://www.freebsd.org, FreeBSD}, and @uref{http://www.openbsd.org, OpenBSD}).
+
+@item UTC
+The accepted abbreviation for ``Universal Coordinated Time.''
+This is standard time in Greenwich, England, which is used as a
+reference time for day and date calculations.
+See also ``Epoch'' and ``GMT.''
+
+@item Variable
+A name for a value. In @command{awk}, variables may be either scalars
+or arrays.
+
+@item Whitespace
+A sequence of space, TAB, or newline characters occurring inside an input
+record or a string.
+
+@end table
+
+@end ifclear
+
+@c The GNU General Public License.
+@node Copying
+@unnumbered GNU General Public License
+@ifnotdocbook
+@center Version 3, 29 June 2007
+@end ifnotdocbook
+@docbook
+<subtitle>Version 3, 29 June 2007</subtitle>
+@end docbook
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{https://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+@end display
+
+@c fakenode --- for prepinfo
+@heading Preamble
+
+The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom
+to share and change all versions of a program---to make sure it remains
+free software for all its users.  We, the Free Software Foundation,
+use the GNU General Public License for most of our software; it
+applies also to any other work released this way by its authors.  You
+can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you
+have certain responsibilities if you distribute copies of the
+software, or if you modify it: responsibilities to respect the freedom
+of others.
+
+For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too,
+receive or can get the source code.  And you must show them these
+terms so they know their rights.
+
+Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the
+manufacturer can do so.  This is fundamentally incompatible with the
+aim of protecting users' freedom to change the software.  The
+systematic pattern of such abuse occurs in the area of products for
+individuals to use, which is precisely where it is most unacceptable.
+Therefore, we have designed this version of the GPL to prohibit the
+practice for those products.  If such problems arise substantially in
+other domains, we stand ready to extend this provision to those
+domains in future versions of the GPL, as needed to protect the
+freedom of users.
+
+Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish
+to avoid the special danger that patents applied to a free program
+could make it effectively proprietary.  To prevent this, the GPL
+assures that patents cannot be used to render the program non-free.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+@c fakenode --- for prepinfo
+@heading TERMS AND CONDITIONS
+
+@enumerate 0
+@item Definitions.
+
+``This License'' refers to version 3 of the GNU General Public License.
+
+``Copyright'' also means copyright-like laws that apply to other kinds
+of works, such as semiconductor masks.
+
+``The Program'' refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as ``you''.  ``Licensees'' and
+``recipients'' may be individuals or organizations.
+
+To ``modify'' a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of
+an exact copy.  The resulting work is called a ``modified version'' of
+the earlier work or a work ``based on'' the earlier work.
+
+A ``covered work'' means either the unmodified Program or a work based
+on the Program.
+
+To ``propagate'' a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+To ``convey'' a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user
+through a computer network, with no transfer of a copy, is not
+conveying.
+
+An interactive user interface displays ``Appropriate Legal Notices'' to
+the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+@item Source Code.
+
+The ``source code'' for a work means the preferred form of the work for
+making modifications to it.  ``Object code'' means any non-source form
+of a work.
+
+A ``Standard Interface'' means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+The ``System Libraries'' of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+``Major Component'', in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+The ``Corresponding Source'' for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+The Corresponding Source need not include anything that users can
+regenerate automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same
+work.
+
+@item Basic Permissions.
+
+All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+You may make, run and propagate covered works that you do not convey,
+without conditions so long as your license otherwise remains in force.
+You may convey covered works to others for the sole purpose of having
+them make modifications exclusively for you, or provide you with
+facilities for running those works, provided that you comply with the
+terms of this License in conveying all material for which you do not
+control copyright.  Those thus making or running the covered works for
+you must do so exclusively on your behalf, under your direction and
+control, on terms that prohibit them from making any copies of your
+copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the
+conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+@item Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such
+circumvention is effected by exercising rights under this License with
+respect to the covered work, and you disclaim any intention to limit
+operation or modification of the work as a means of enforcing, against
+the work's users, your or third parties' legal rights to forbid
+circumvention of technological measures.
+
+@item Conveying Verbatim Copies.
+
+You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+@item Conveying Modified Source Versions.
+
+You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these
+conditions:
+
+@enumerate a
+@item
+The work must carry prominent notices stating that you modified it,
+and giving a relevant date.
+
+@item
+The work must carry prominent notices stating that it is released
+under this License and any conditions added under section 7.  This
+requirement modifies the requirement in section 4 to ``keep intact all
+notices''.
+
+@item
+You must license the entire work, as a whole, under this License to
+anyone who comes into possession of a copy.  This License will
+therefore apply, along with any applicable section 7 additional terms,
+to the whole of the work, and all its parts, regardless of how they
+are packaged.  This License gives no permission to license the work in
+any other way, but it does not invalidate such permission if you have
+separately received it.
+
+@item
+If the work has interactive user interfaces, each must display
+Appropriate Legal Notices; however, if the Program has interactive
+interfaces that do not display Appropriate Legal Notices, your work
+need not make them do so.
+@end enumerate
+
+A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+``aggregate'' if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+@item  Conveying Non-Source Forms.
+
+You may convey a covered work in object code form under the terms of
+sections 4 and 5, provided that you also convey the machine-readable
+Corresponding Source under the terms of this License, in one of these
+ways:
+
+@enumerate a
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by the
+Corresponding Source fixed on a durable physical medium customarily
+used for software interchange.
+
+@item
+Convey the object code in, or embodied in, a physical product
+(including a physical distribution medium), accompanied by a written
+offer, valid for at least three years and valid for as long as you
+offer spare parts or customer support for that product model, to give
+anyone who possesses the object code either (1) a copy of the
+Corresponding Source for all the software in the product that is
+covered by this License, on a durable physical medium customarily used
+for software interchange, for a price no more than your reasonable
+cost of physically performing this conveying of source, or (2) access
+to copy the Corresponding Source from a network server at no charge.
+
+@item
+Convey individual copies of the object code with a copy of the written
+offer to provide the Corresponding Source.  This alternative is
+allowed only occasionally and noncommercially, and only if you
+received the object code with such an offer, in accord with subsection
+6b.
+
+@item
+Convey the object code by offering access from a designated place
+(gratis or for a charge), and offer equivalent access to the
+Corresponding Source in the same way through the same place at no
+further charge.  You need not require recipients to copy the
+Corresponding Source along with the object code.  If the place to copy
+the object code is a network server, the Corresponding Source may be
+on a different server (operated by you or a third party) that supports
+equivalent copying facilities, provided you maintain clear directions
+next to the object code saying where to find the Corresponding Source.
+Regardless of what server hosts the Corresponding Source, you remain
+obligated to ensure that it is available for as long as needed to
+satisfy these requirements.
+
+@item
+Convey the object code using peer-to-peer transmission, provided you
+inform other peers where the object code and Corresponding Source of
+the work are being offered to the general public at no charge under
+subsection 6d.
+
+@end enumerate
+
+A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+A ``User Product'' is either (1) a ``consumer product'', which means any
+tangible personal property which is normally used for personal,
+family, or household purposes, or (2) anything designed or sold for
+incorporation into a dwelling.  In determining whether a product is a
+consumer product, doubtful cases shall be resolved in favor of
+coverage.  For a particular product received by a particular user,
+``normally used'' refers to a typical or common use of that class of
+product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected
+to use, the product.  A product is a consumer product regardless of
+whether the product has substantial commercial, industrial or
+non-consumer uses, unless such uses represent the only significant
+mode of use of the product.
+
+``Installation Information'' for a User Product means any methods,
+procedures, authorization keys, or other information required to
+install and execute modified versions of a covered work in that User
+Product from a modified version of its Corresponding Source.  The
+information must suffice to ensure that the continued functioning of
+the modified object code is in no case prevented or interfered with
+solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or
+updates for a work that has been modified or installed by the
+recipient, or for the User Product in which it has been modified or
+installed.  Access to a network may be denied when the modification
+itself materially and adversely affects the operation of the network
+or violates the rules and protocols for communication across the
+network.
+
+Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+@item Additional Terms.
+
+``Additional permissions'' are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders
+of that material) supplement the terms of this License with terms:
+
+@enumerate a
+@item
+Disclaiming warranty or limiting liability differently from the terms
+of sections 15 and 16 of this License; or
+
+@item
+Requiring preservation of specified reasonable legal notices or author
+attributions in that material or in the Appropriate Legal Notices
+displayed by works containing it; or
+
+@item
+Prohibiting misrepresentation of the origin of that material, or
+requiring that modified versions of such material be marked in
+reasonable ways as different from the original version; or
+
+@item
+Limiting the use for publicity purposes of names of licensors or
+authors of the material; or
+
+@item
+Declining to grant rights under trademark law for use of some trade
+names, trademarks, or service marks; or
+
+@item
+Requiring indemnification of licensors and authors of that material by
+anyone who conveys the material (or modified versions of it) with
+contractual assumptions of liability to the recipient, for any
+liability that these contractual assumptions directly impose on those
+licensors and authors.
+@end enumerate
+
+All other non-permissive additional terms are considered ``further
+restrictions'' within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions; the
+above requirements apply either way.
+
+@item Termination.
+
+You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+@item Acceptance Not Required for Having Copies.
+
+You are not required to accept this License in order to receive or run
+a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+@item Automatic Licensing of Downstream Recipients.
+
+Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+An ``entity transaction'' is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+@item Patents.
+
+A ``contributor'' is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's ``contributor version''.
+
+A contributor's ``essential patent claims'' are all patent claims owned
+or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, ``control'' includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+In the following three paragraphs, a ``patent license'' is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To ``grant'' such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  ``Knowingly relying'' means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+A patent license is ``discriminatory'' if it does not include within the
+scope of its coverage, prohibits the exercise of, or is conditioned on
+the non-exercise of one or more of the rights that are specifically
+granted under this License.  You may not convey a covered work if you
+are a party to an arrangement with a third party that is in the
+business of distributing software, under which you make payment to the
+third party based on the extent of your activity of conveying the
+work, and under which the third party grants, to any of the parties
+who would receive the covered work from you, a discriminatory patent
+license (a) in connection with copies of the covered work conveyed by
+you (or copies made from those copies), or (b) primarily for and in
+connection with specific products or compilations that contain the
+covered work, unless you entered into that arrangement, or that patent
+license was granted, prior to 28 March 2007.
+
+Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+@item No Surrender of Others' Freedom.
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey
+a covered work so as to satisfy simultaneously your obligations under
+this License and any other pertinent obligations, then as a
+consequence you may not convey it at all.  For example, if you agree
+to terms that obligate you to collect a royalty for further conveying
+from those to whom you convey the Program, the only way you could
+satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+@item Use with the GNU Affero General Public License.
+
+Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+@item Revised Versions of this License.
+
+The Free Software Foundation may publish revised and/or new versions
+of the GNU General Public License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies that a certain numbered version of the GNU General Public
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that numbered version or
+of any later version published by the Free Software Foundation.  If
+the Program does not specify a version number of the GNU General
+Public License, you may choose any version ever published by the Free
+Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions
+of the GNU General Public License can be used, that proxy's public
+statement of acceptance of a version permanently authorizes you to
+choose that version for the Program.
+
+Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+@item Disclaimer of Warranty.
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT
+WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+@item Limitation of Liability.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR
+CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT
+NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
+TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER
+PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+@item Interpretation of Sections 15 and 16.
+
+If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+@end enumerate
+
+@c fakenode --- for prepinfo
+@heading END OF TERMS AND CONDITIONS
+
+@c fakenode --- for prepinfo
+@heading How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and a brief idea of what it does.}
+Copyright (C) @var{year} @var{name of author}
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see @url{https://www.gnu.org/licenses/}.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+@smallexample
+@var{program} Copyright (C) @var{year} @var{name of author}
+This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}.
+This is free software, and you are welcome to redistribute it
+under certain conditions; type @samp{show c} for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License.  Of course, your
+program's commands might be different; for a GUI interface, you would
+use an ``about box''.
+
+You should also get your employer (if you work as a programmer) or school,
+if any, to sign a ``copyright disclaimer'' for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+@url{https://www.gnu.org/licenses/}.
+
+The GNU General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use
+the GNU Lesser General Public License instead of this License.  But
+first, please read @url{https://www.gnu.org/philosophy/why-not-lgpl.html}.
+
+@ifclear FOR_PRINT
+@c The GNU Free Documentation License.
+@node GNU Free Documentation License
+@unnumbered GNU Free Documentation License
+@ifnotdocbook
+@center Version 1.3, 3 November 2008
+@end ifnotdocbook
+
+@docbook
+<subtitle>Version 1.3, 3 November 2008</subtitle>
+@end docbook
+
+@cindex FDL (Free Documentation License)
+@cindex Free Documentation License (FDL)
+@cindex GNU Free Documentation License
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{https://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free} in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of ``copyleft'', which means that derivative
+works of the document must themselves be free in the same sense.  It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does.  But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book.  We recommend this License
+principally for works whose purpose is instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License.  Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein.  The ``Document'', below,
+refers to any such manual or work.  Any member of the public is a
+licensee, and is addressed as ``you''.  You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A ``Modified Version'' of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A ``Secondary Section'' is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could fall
+directly within that overall subject.  (Thus, if the Document is in
+part a textbook of mathematics, a Secondary Section may not explain
+any mathematics.)  The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The ``Invariant Sections'' are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License.  If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant.  The Document may contain zero
+Invariant Sections.  If the Document does not identify any Invariant
+Sections then there are none.
+
+The ``Cover Texts'' are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License.  A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A ``Transparent'' copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters.  A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text.  A copy that is not ``Transparent'' is called ``Opaque''.
+
+Examples of suitable formats for Transparent copies include plain
+@sc{ascii} without markup, Texinfo input format, La@TeX{} input
+format, @acronym{SGML} or @acronym{XML} using a publicly available
+@acronym{DTD}, and standard-conforming simple @acronym{HTML},
+PostScript or @acronym{PDF} designed for human modification.  Examples
+of transparent image formats include @acronym{PNG}, @acronym{XCF} and
+@acronym{JPG}.  Opaque formats include proprietary formats that can be
+read and edited only by proprietary word processors, @acronym{SGML} or
+@acronym{XML} for which the @acronym{DTD} and/or processing tools are
+not generally available, and the machine-generated @acronym{HTML},
+PostScript or @acronym{PDF} produced by some word processors for
+output purposes only.
+
+The ``Title Page'' means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page.  For works in
+formats which do not have any title page as such, ``Title Page'' means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+The ``publisher'' means any person or entity that distributes copies
+of the Document to the public.
+
+A section ``Entitled XYZ'' means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language.  (Here XYZ stands for a
+specific section name mentioned below, such as ``Acknowledgements'',
+``Dedications'', ``Endorsements'', or ``History''.)  To ``Preserve the Title''
+of such a section when you modify the Document means that it remains a
+section ``Entitled XYZ'' according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document.  These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License.  You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute.  However, you may accept
+compensation in exchange for copies.  If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover.  Both covers must also clearly and legibly identify
+you as the publisher of these copies.  The front cover must present
+the full title with all words of the title equally prominent and
+visible.  You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it.  In addition, you must do these things in the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title distinct
+from that of the Document, and from those of previous versions
+(which should, if there were any, be listed in the History section
+of the Document).  You may use the same title as a previous version
+if the original publisher of that version gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or entities
+responsible for authorship of the modifications in the Modified
+Version, together with at least five of the principal authors of the
+Document (all of its principal authors, if it has fewer than five),
+unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license notice
+giving the public permission to use the Modified Version under the
+terms of this License, in the form shown in the Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant Sections
+and required Cover Texts given in the Document's license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled ``History'', Preserve its Title, and add
+to it an item stating at least the title, year, new authors, and
+publisher of the Modified Version as given on the Title Page.  If
+there is no section Entitled ``History'' in the Document, create one
+stating the title, year, authors, and publisher of the Document as
+given on its Title Page, then add an item describing the Modified
+Version as stated in the previous sentence.
+
+@item
+Preserve the network location, if any, given in the Document for
+public access to a Transparent copy of the Document, and likewise
+the network locations given in the Document for previous versions
+it was based on.  These may be placed in the ``History'' section.
+You may omit a network location for a work that was published at
+least four years before the Document itself, or if the original
+publisher of the version it refers to gives permission.
+
+@item
+For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
+the Title of the section, and preserve in the section all the
+substance and tone of each of the contributor acknowledgements and/or
+dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document,
+unaltered in their text and in their titles.  Section numbers
+or the equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled ``Endorsements''.  Such a section
+may not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled ``Endorsements'' or
+to conflict in title with any Invariant Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant.  To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled ``Endorsements'', provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version.  Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity.  If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy.  If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled ``History''
+in the various original documents, forming one section Entitled
+``History''; likewise combine any sections Entitled ``Acknowledgements'',
+and any sections Entitled ``Dedications''.  You must delete all
+sections Entitled ``Endorsements.''
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an ``aggregate'' if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections.  You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers.  In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled ``Acknowledgements'',
+``Dedications'', or ``History'', the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void, and
+will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your license
+from a particular copyright holder is reinstated (a) provisionally,
+unless and until the copyright holder explicitly and finally
+terminates your license, and (b) permanently, if the copyright holder
+fails to notify you of the violation by some reasonable means prior to
+60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, receipt of a copy of some or all of the same material does
+not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time.  Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.  See
+@uref{https://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License ``or any later version'' applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation.  If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.  If the Document
+specifies that a proxy can decide which future versions of this
+License can be used, that proxy's public statement of acceptance of a
+version permanently authorizes you to choose that version for the
+Document.
+
+@item
+RELICENSING
+
+``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works.  A
+public wiki that anybody can edit is an example of such a server.  A
+``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
+site means any set of copyrightable works thus published on the MMC
+site.
+
+``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation, a not-for-profit
+corporation with a principal place of business in San Francisco,
+California, as well as future copyleft versions of that license
+published by that same organization.
+
+``Incorporate'' means to publish or republish a Document, in whole or
+in part, as part of another Document.
+
+An MMC is ``eligible for relicensing'' if it is licensed under this
+License, and if all works that were first published under this License
+somewhere other than this MMC, and subsequently incorporated in whole
+or in part into the MMC, (1) had no cover texts or invariant sections,
+and (2) were thus incorporated prior to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the site
+under CC-BY-SA on the same site at any time before August 1, 2009,
+provided the MMC is eligible for relicensing.
+
+@end enumerate
+
+@c fakenode --- for prepinfo
+@unnumberedsec ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@smallexample
+@group
+  Copyright (C)  @var{year}  @var{your name}.
+  Permission is granted to copy, distribute and/or modify this document
+  under the terms of the GNU Free Documentation License, Version 1.3
+  or any later version published by the Free Software Foundation;
+  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+  Texts.  A copy of the license is included in the section entitled ``GNU
+  Free Documentation License''.
+@end group
+@end smallexample
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the ``with@dots{}Texts.'' line with this:
+
+@smallexample
+@group
+    with the Invariant Sections being @var{list their titles}, with
+    the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
+    being @var{list}.
+@end group
+@end smallexample
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
+
+@end ifclear
+
+@ifnotdocbook
+@node Index
+@unnumbered Index
+@end ifnotdocbook
+@printindex cp
+
+@bye
+
+Unresolved Issues:
+------------------
+1. From ADR.
+
+   Robert J. Chassell points out that awk programs should have some indication
+   of how to use them.  It would be useful to perhaps have a "programming
+   style" section of the manual that would include this and other tips.
+
+Consistency issues:
+	/.../ regexps are in @code, not @samp
+	".." strings are in @code, not @samp
+	no @print before @dots
+	values of expressions in the text (@code{x} has the value 15),
+		should be in roman, not @code
+	Use   TAB   and not   tab
+	Use   ESC   and not   ESCAPE
+	Use   space and not   blank	to describe the space bar's character
+	The term "blank" is thus basically reserved for "blank lines" etc.
+	To make dark corners work, the @value{DARKCORNER} has to be outside
+		closing `.' of a sentence and after (pxref{...}).
+	Make sure that each @value{DARKCORNER} has an index entry, and
+		also that each `@cindex dark corner' has an @value{DARKCORNER}.
+	" " should have an @w{} around it
+	Use "non-" only with language names or acronyms, or the words bug and option and null
+	Use @command{ftp} when talking about anonymous ftp
+	Use uppercase and lowercase, not "upper-case" and "lower-case"
+		or "upper case" and "lower case"
+	Use "single precision" and "double precision", not "single-precision" or "double-precision"
+	Use alphanumeric, not alpha-numeric
+	Use POSIX-compliant, not POSIX compliant
+	Use --foo, not -Wfoo when describing long options
+	Use "Bell Laboratories", but not "Bell Labs".
+	Use "behavior" instead of "behaviour".
+	Use "coprocess" instead of "co-process".
+	Use "zeros" instead of "zeroes".
+	Use "nonzero" not "non-zero".
+	Use "runtime" not "run time" or "run-time".
+	Use "command-line" as an adjective and "command line" as a noun.
+	Use "online" not "on-line".
+	Use "whitespace" not "white space".
+	Use "Input/Output", not "input/output". Also "I/O", not "i/o".
+	Use "lefthand"/"righthand", not "left-hand"/"right-hand".
+	Use "workaround", not "work-around".
+	Use "startup"/"cleanup", not "start-up"/"clean-up"
+	Use "filesystem", not "file system"
+	Use @code{do}, and not @code{do}-@code{while}, except where
+		actually discussing the do-while.
+	Use "versus" in text and "vs." in index entries
+	Use @code{"C"} for the C locale, not ``C'' or @samp{C}.
+	The words "a", "and", "as", "between", "for", "from", "in", "of",
+		"on", "that", "the", "to", "with", and "without",
+		should not be capitalized in @chapter, @section etc.
+		"Into" and "How" should.
+	Search for @dfn; make sure important items are also indexed.
+	"e.g." should always be followed by a comma.
+	"i.e." should always be followed by a comma.
+	The numbers zero through ten should be spelled out, except when
+		talking about file descriptor numbers. > 10 and < 0, it's
+		ok to use numbers.
+	For most cases, do NOT put a comma before "and", "or" or "but".
+		But exercise taste with this rule.
+	Don't show the awk command with a program in quotes when it's
+		just the program.  I.e.
+
+			{
+				....
+			}
+
+		not
+			awk '{
+				...
+			}'
+
+	Do show it when showing command-line arguments, data files, etc, even
+		if there is no output shown.
+
+	Use numbered lists only to show a sequential series of steps.
+
+	Use @code{xxx} for the xxx operator in indexing statements, not @samp.
+	Use MS-Windows not MS Windows
+	Use MS-DOS not MS DOS
+	Use an empty set of parentheses after built-in and awk function names.
+	Use "multiFOO" without a hyphen.
+	Use "time zone" as two words, not "timezone".
+
+Date: Wed, 13 Apr 94 15:20:52 -0400
+From: rms@gnu.org (Richard Stallman)
+To: gnu-prog@gnu.org
+Subject: A reminder: no pathnames in GNU
+
+It's a GNU convention to use the term "file name" for the name of a
+file, never "pathname".  We use the term "path" for search paths,
+which are lists of file names.  Using it for a single file name as
+well is potentially confusing to users.
+
+So please check any documentation you maintain, if you think you might
+have used "pathname".
+
+Note that "file name" should be two words when it appears as ordinary
+text.  It's ok as one word when it's a metasyntactic variable, though.
+
+------------------------
+ORA uses filename, thus the macro.
+
+Suggestions:
+------------
+
+Better sidebars can almost sort of be done with:
+
+	@ifdocbook
+	@macro @sidebar{title, content}
+	@inlinefmt{docbook, <sidebar><title>}
+	\title\
+	@inlinefmt{docbook, </title>}
+	\content\
+	@inlinefmt{docbook, </sidebar>}
+	@end macro
+	@end ifdocbook
+
+
+	@ifnotdocbook
+	@macro @sidebar{title, content}
+	@cartouche
+	@center @b{\title\}
+
+	\content\
+	@end cartouche
+	@end macro
+	@end ifnotdocbook
+
+But to use it you have to say
+
+	@sidebar{Title Here,
+	@include file-with-content
+	}
+
+which sorta sucks.
+
+TODO:
+Add a section explaining recursion from ground zero. Probably
+easiest to do it with factorial as the example. Explain that
+recursion needs a stopping condition. Thanks to
+Bill Duncan <bduncan@beachnet.org> for the suggestion.
diff --git a/gawk-5.0.1/doc/gawkworkflow.texi b/gawk-5.0.1/doc/gawkworkflow.texi
new file mode 100644
index 00000000000..65a6cc4cffd
--- /dev/null
+++ b/gawk-5.0.1/doc/gawkworkflow.texi
@@ -0,0 +1,2158 @@
+\input texinfo   @c -*-texinfo-*-
+@c vim: filetype=texinfo expandtab tabstop=4 shiftwidth=4
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename gawkworkflow.info
+@settitle GNU Awk Development Workflow
+@c %**end of header (This is for running Texinfo on a region.)
+
+@dircategory Text creation and manipulation
+@direntry
+* Gawk Work Flow: (gawkworkflow).                 Participating in @command{gawk} development.
+@end direntry
+@dircategory Individual utilities
+@direntry
+* Gawk Work Flow: (gawkworkflow)Overview.         Participating in @command{gawk} development.
+@end direntry
+
+@c With early 2014 texinfo.tex, restore PDF links and colors
+@tex
+\gdef\linkcolor{0.5 0.09 0.12} % Dark Red
+\gdef\urlcolor{0.5 0.09 0.12} % Also
+\global\urefurlonlylinktrue
+@end tex
+
+@set xref-automatic-section-title
+
+@c The following information should be updated here only!
+@c This sets the edition of the document, the version of gawk it
+@c applies to and all the info about who's publishing this edition
+
+@c These apply across the board.
+@set UPDATE-MONTH February, 2019
+
+@set TITLE Participating in @command{gawk} Development
+@set EDITION 0.72
+
+@iftex
+@set DOCUMENT booklet
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end iftex
+@ifinfo
+@set DOCUMENT Info file
+@set CHAPTER major node
+@set APPENDIX major node
+@set SECTION minor node
+@set SUBSECTION node
+@end ifinfo
+@ifhtml
+@set DOCUMENT Web page
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end ifhtml
+@ifdocbook
+@set DOCUMENT booklet
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end ifdocbook
+@ifxml
+@set DOCUMENT booklet
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end ifxml
+@ifplaintext
+@set DOCUMENT booklet
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end ifplaintext
+
+
+@ifnottex
+@ifnotdocbook
+@macro ii{text}
+@i{\text\}
+@end macro
+@end ifnotdocbook
+@end ifnottex
+
+@ifdocbook
+@macro ii{text}
+@inlineraw{docbook,<lineannotation>\text\</lineannotation>}
+@end macro
+@end ifdocbook
+
+@c For HTML, spell out email addresses, to avoid problems with
+@c address harvesters for spammers.
+@ifhtml
+@macro EMAIL{real,spelled}
+``\spelled\''
+@end macro
+@end ifhtml
+@ifnothtml
+@macro EMAIL{real,spelled}
+@email{\real\}
+@end macro
+@end ifnothtml
+
+
+@c merge the function and variable indexes into the concept index
+@ifinfo
+@synindex fn cp
+@synindex vr cp
+@end ifinfo
+@iftex
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end iftex
+@ifxml
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end ifxml
+@ifdocbook
+@synindex fn cp
+@synindex vr cp
+@end ifdocbook
+
+@c If "finalout" is commented out, the printed output will show
+@c black boxes that mark lines that are too long.  Thus, it is
+@c unwise to comment it out when running a master in case there are
+@c overfulls which are deemed okay.
+
+@iftex
+@finalout
+@end iftex
+
+@copying
+@docbook
+<para>Published by:</para>
+
+<literallayout class="normal">Free Software Foundation
+51 Franklin Street, Fifth Floor
+Boston, MA  02110-1301 USA
+Phone: +1-617-542-5942
+Fax: +1-617-542-2652
+Email: <email>gnu@@gnu.org</email>
+URL: <ulink url="http://www.gnu.org">http://www.gnu.org/</ulink></literallayout>
+
+<literallayout class="normal">Copyright &copy; 2017, 2018, 2019
+Free Software Foundation, Inc.
+All Rights Reserved.</literallayout>
+@end docbook
+
+@ifnotdocbook
+Copyright @copyright{} 2017, 2018, 2019
+Free Software Foundation, Inc.
+@end ifnotdocbook
+@sp 2
+
+This is Edition @value{EDITION} of @cite{@value{TITLE}}.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``GNU General Public License'', with the
+Front-Cover Texts being ``A GNU Manual'', and with the Back-Cover Texts
+as in (a) below.
+A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+
+@enumerate a
+@item
+The FSF's Back-Cover Text is: ``You have the freedom to
+copy and modify this GNU manual.''
+@end enumerate
+@end copying
+
+@c Comment out the "smallbook" for technical review.  Saves
+@c considerable paper.  Remember to turn it back on *before*
+@c starting the page-breaking work.
+
+@c 4/2002: Karl Berry recommends commenting out this and the
+@c `@setchapternewpage odd', and letting users use `texi2dvi -t'
+@c if they want to waste paper.
+@c @smallbook
+
+
+@c Uncomment this for the release.  Leaving it off saves paper
+@c during editing and review.
+@c @setchapternewpage odd
+
+@c @shorttitlepage @value{TITLE}
+@titlepage
+@title @value{TITLE}
+@subtitle Edition @value{EDITION}
+@subtitle @value{UPDATE-MONTH}
+@author Arnold D. Robbins
+
+@ifnotdocbook
+@c Include the Distribution inside the titlepage environment so
+@c that headings are turned off.  Headings on and off do not work.
+
+@page
+@vskip 0pt plus 1filll
+Published by:
+@sp 1
+
+Free Software Foundation @*
+51 Franklin Street, Fifth Floor @*
+Boston, MA  02110-1301 USA @*
+Phone: +1-617-542-5942 @*
+Fax: +1-617-542-2652 @*
+Email: @email{gnu@@gnu.org} @*
+URL: @uref{http://www.gnu.org/} @*
+
+@c ISBN x-xxxxxx-xx-x @*
+@sp 2
+@insertcopying
+@end ifnotdocbook
+@end titlepage
+
+@iftex
+@headings off
+@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @|
+@oddheading  @| @| @strong{@thischapter}@ @ @ @thispage
+@end iftex
+
+@ifnottex
+@ifnotxml
+@ifnotdocbook
+@node Top
+@top General Introduction
+@c Preface node should come right after the Top
+@c node, in `unnumbered' sections, then the first chapter.
+
+This file describes how to participate in software development for
+@uref{http://www.gnu.org/software/gawk, GNU Awk (@command{gawk})}.
+
+@insertcopying
+
+@end ifnotdocbook
+@end ifnotxml
+@end ifnottex
+
+@menu
+* Preface::                           Some introductory remarks.
+* Contributing::                      How to contribute to @command{gawk}
+                                      development.
+* Using Git::                         Getting started with Git.
+* Configuring git::                   Configuring Git.
+* Development without commit access:: How to work without commit access.
+* Development with commit access::    How to work with commit access.
+* General practices::                 How things should usually be done.
+* Repo Maintenance::                  Tips for keeping your repo clean.
+* Development Stuff::                 Things you need to know to be a
+                                      @command{gawk} developer.
+* Cheat Sheet::                       Git command summary.
+* Resources::                         Some further resources.
+* TODO::                              Stuff still to do.
+* Index::                             The index.
+
+@detailmenu
+* This Manual::                     How to use this manual.
+* Conventions::                     Typographical Conventions.
+* Acknowledgments::                 Acknowledgments.
+* Reviewers::                       A note to reviewers.
+* Push Pull::                       The push/pull software development model.
+* Repo Copies::                     What it means to have a copy of a repo.
+* Local Branches::                  How to best use local branches.
+* Branches are state::              Branches represent development state.
+* Repo State::                      The different branch types in the repo.
+* Local State::                     Managing local branches.
+* Remotes::                         What a ``remote'' is.
+* Cloning::                         Cloning the repo the first time.
+* Switching Branches::              Moving from one branch to another.
+* Starting A New Branch::           Starting a new branch for development.
+* Undoing a change::                Throwing away changes.
+* Updating::                        Keeping in sync with the upstream repo.
+* Rebasing::                        Rebasing A Local Branch.
+* Merge Conflicts::                 Dealing With Merge Conflicts.
+* Submitting Changes::              How to submit your changes.
+* Removing Branches::               Getting rid of unneeded branches.
+* Points to remember::              Things you need to keep in mind.
+* Initial setup::                   Getting started with commit access.
+* ssh clone::                       Cloning using an @samp{ssh://} URL.
+* Developing patches::              Developing patches.
+* Developing new features::         Developing new features.
+* Developing fixes::                Developing fixes.
+* Coding style::                    Where to read up on the coding style.
+* Doing paperwork::                 Legal stuff in order to contribute.
+* Tools::                           Tools to have on your system for
+                                    development.
+* GNU Tools::                       The GNU Autotools.
+* Compilers::                       A discussion of compilers that can be
+                                    used.
+* Debugging::                       Compiling for debugging.
+@end detailmenu
+@end menu
+
+@c @summarycontents
+@contents
+
+@node Preface
+@unnumbered Preface
+@c I saw a comment somewhere that the preface should describe the book itself,
+@c and the introduction should describe what the book covers.
+
+This @value{DOCUMENT} describes how to participate in development
+of GNU Awk (@command{gawk}).  GNU Awk is a Free Software project
+belonging to the Free Software Foundation's GNU project.
+
+@cindex Git Project
+The @value{DOCUMENT} focuses on participation in the project (that is,
+how to work most effectively if you wish to contribute to it) and
+also describes how to make use of the @uref{http://git-scm.org, Git}
+distributed source code management system for @command{gawk} development.
+
+You should be comfortable working with traditional UNIX-style
+tools and with the C language and standard library facilities.
+
+@menu
+* This Manual::                 How to use this manual.
+* Conventions::                 Typographical Conventions.
+* Acknowledgments::             Acknowledgments.
+* Reviewers::                   A note to reviewers.
+@end menu
+
+
+@node This Manual
+@unnumberedsec Using This Book
+
+This @value{DOCUMENT} has the following chapters and appendices:
+
+@itemize @bullet
+
+@item
+@ref{Contributing} describes how to start contributing to
+the @command{gawk} project.
+
+@item
+@ref{Using Git} introduces the Git distributed source code
+management system.
+
+@item
+@ref{Configuring git} describes some initial set-up you need to do
+before using Git seriously.
+
+@item
+@ref{Development without commit access} gets into the meat of the
+development workflow, describing how to work if you don't have
+commit access to the Savannah repository.
+
+@item
+@ref{Development with commit access} continues the discussion,
+covering what's different when you can commit directly to the
+Savannah repository.
+
+@item
+@ref{General practices} describes general development
+practices used by the @command{gawk} development team.
+
+@item
+@ref{Repo Maintenance} presents several different things
+you need to know about to keep your repo in good shape.
+
+@item
+@ref{Development Stuff} describes some important points you
+should be familiar with in order to participate in @command{gawk}
+development and presents some tools that may make your work easier.
+
+@item
+@ref{Cheat Sheet} provides a short ``cheat sheet'' summarizing
+all the Git commands referenced in this @value{DOCUMENT}.
+
+@item
+@ref{Resources} provides a few pointers to Internet
+resources for learning more about Git.
+
+@end itemize
+
+@node Conventions
+@unnumberedsec Typographical Conventions
+
+@cindex Texinfo
+This @value{DOCUMENT} is written in @uref{http://www.gnu.org/software/texinfo/, Texinfo},
+the GNU documentation formatting language.
+A single Texinfo source file is used to produce both the printed and online
+versions of the documentation.
+@ifnotinfo
+Because of this, the typographical conventions
+are slightly different than in other books you may have read.
+@end ifnotinfo
+@ifinfo
+This @value{SECTION} briefly documents the typographical conventions used in Texinfo.
+@end ifinfo
+
+Examples you would type at the command line are preceded by the common
+shell primary and secondary prompts, @samp{$} and @samp{>}.
+Input that you type is shown @kbd{like this}.
+Output from the command is preceded by the glyph ``@print{}''.
+This typically represents the command's standard output.
+Error messages and other output on the command's standard error are preceded
+by the glyph ``@error{}''.  For example:
+
+@example
+$ @kbd{echo hi on stdout}
+@print{} hi on stdout
+$ @kbd{echo hello on stderr 1>&2}
+@error{} hello on stderr
+@end example
+
+@ifnotinfo
+In the text, almost anything related to programming, such as command
+names, variable and function names, and string, numeric and regexp
+constants appear in @code{this font}. Code fragments appear in the same
+font and quoted, @samp{like this}.  Things that are replaced by the
+user or programmer appear in @var{this font}.  Options look like this:
+@option{-f}.  File names are indicated like this: @file{/path/to/ourfile}.
+Some things are emphasized @emph{like this}, and if a point needs to be
+made strongly, it is done @strong{like this}.  The first occurrence of
+a new term is usually its @dfn{definition} and appears in the same font
+as the previous occurrence of ``definition'' in this sentence.
+@end ifnotinfo
+
+Characters that you type at the keyboard look @kbd{like this}.  In particular,
+there are special characters called ``control characters.''  These are
+characters that you type by holding down both the @kbd{CONTROL} key and
+another key, at the same time.  For example, a @kbd{Ctrl-d} is typed
+by first pressing and holding the @kbd{CONTROL} key, next
+pressing the @kbd{d} key, and finally releasing both keys.
+
+@quotation NOTE
+Notes of interest look like this.
+@end quotation
+
+@quotation CAUTION
+Cautionary or warning notes look like this.
+@end quotation
+
+@node Acknowledgments
+@unnumberedsec Acknowledgments
+
+@cindex Kahrs, J@"urgen
+Thanks to J@"urgen Kahrs for his initial efforts to write a document like this.
+Although his prose has not survived, his material was helpful in preparing
+this @value{DOCUMENT}.
+
+@cindex Bernat, Yehezkel
+Thanks to Yehezkel Bernat for reviewing this document and
+in general for his good intentions.
+
+@strong{FIXME:} YOUR NAME HERE...
+
+@node Reviewers
+@unnumberedsec Notes to Reviewers
+
+Please let me know if anything is missing, or unclear.
+Real errors with respect Git commands and usage are
+very important as well.
+
+Spelling errors and typo fixes welcome, but not as important.
+
+@node Contributing
+@chapter How to Start Contributing
+
+@command{gawk} development is distributed. It's done using electronic
+mail (email) and via branches in the Git repo@footnote{Short for
+``repository''.} on @uref{http://savannah.gnu.org, Savannah}, the GNU
+project's source code management site.
+
+In this @value{CHAPTER} we use some Git terminology. If you're not at
+all familiar with Git, then skim this @value{CHAPTER} and come back
+after reading the rest of the @value{DOCUMENT}.
+
+@command{gawk} is similar to many other Free Software projects. To begin
+contributing, simply start!  Take a look at the @file{TODO} file in the
+distribution, see if there is something of interest to you, and ask on
+the @email{bug-gawk@@gnu.org} mailing list if anyone else is working
+on it. If not, then go for it!  (@xref{Development Stuff} for a discussion of some
+of the technical things you'll need to do. Here we describe the process
+in general.)
+
+Your contribution can be almost anything that is relevant for
+@command{gawk}, such as code fixes, documentation fixes, and/or new
+features.
+
+@quotation NOTE
+If possible, new features should be done using @command{gawk}'s extension
+mechanism. If you want to add a user-visible language change to the
+@command{gawk} core, you're going to have to convince the maintainer
+and other developers that it's really worthwile to do so.
+
+Changes that improve performance or portability, or that fix bugs,
+or that enable more things in extensions,
+will require less convincing, of course.
+@end quotation
+
+As you complete a task, submit patches for review to the
+@email{bug-gawk@@gnu.org} mailing list, where you'll be given feedback
+about your work.  Once your changes are acceptable, the maintainer will
+commit them to the Git repository.
+
+Over time, as the maintainer and development team gain confidence in your
+ability to contribute, you may be asked to join the private @command{gawk}
+developers' mailing list, and/or be granted commit access to the Git
+repository on Savannah.  This has happened to more than one person who
+just ``came out of the woodwork.''
+
+Until that happens, or if you don't want to join the list, you should
+continue to work with private branches and submission of patches to the
+mailing list.
+
+Once you have commit access, if you want to make a major change or add a
+major feature, where the patch(es) would be very large, it has become the
+practice to create a separate branch, based off of @code{master}, to host
+the feature. This way the maintainer can review it, and you can continue
+to improve it, until it's ready for integration into @code{master}.
+
+@cindex GitHub
+@quotation NOTE
+Because of the GNU project's requirements for signed paperwork for
+contributions, the @command{gawk} project will @strong{not} work
+with pull requests from @uref{http://github.com, GitHub} or any other
+Git-based software hosting service.  You must submit patches to the
+mailing list, and be willing to sign paperwork for large patches.
+@end quotation
+
+The @email{bug-gawk@@gnu.org} mailing list is not private. Anyone may
+send mail to it, and anyone may subscribe to it.  To subscribe,
+go to the list's @uref{https://lists.gnu.org/mailman/listinfo/bug-gawk,
+web page} and follow the instructions there.  If you plan to be involved
+long-term with @command{gawk} development, then you probably should
+subscribe to the list.
+
+@node Using Git
+@chapter Using Git
+
+This chapter provides an introduction to using Git. Our point is
+@emph{not} to rave about how wonderful Git is, nor to go into painful
+detail about how it works.  Rather we want to give you enough background
+to understand how to use Git effectively for bug fix and feature
+development and to interact (``play nicely'') with the development team.
+
+@menu
+* Push Pull::                   The push/pull software development model.
+* Repo Copies::                 What it means to have a copy of a repo.
+* Local Branches::              How to best use local branches.
+* Branches are state::          Branches represent development state.
+@end menu
+
+@node Push Pull
+@section The ``Push/Pull'' Model of Software Development
+
+Git is a powerful, distributed source code management system.  However,
+the way it's used for @command{gawk} development purposely does not take
+advantage of all its features.
+
+Instead, the model is rather simple, and in many ways much like more
+traditional distributed systems such as the @uref{http://www.nongnu.org/cvs,
+Concurrent Versions System} (CVS) or
+@uref{http://subversion.apache.org, Subversion} (SVN).
+
+The central idea can be termed ``push/pull.'' You @emph{pull} updates down from
+the central repository to your local copy, and if you have commit rights,
+you @emph{push} your changes or updates up to the central repository.
+
+Where Git does stand out is in its management of multiple branches of
+development. Git makes it very easy to set up a separate branch for
+use in fixing a bug or developing a feature.  You can then easily keep
+that branch up to date with respect to the main development branch(es),
+and eventually merge the changes from your branch into the main branch.
+
+Almost always Git does these merges for you without problem.  When there
+is a problem (a @dfn{merge conflict}), usually it is very easy for you
+to @dfn{resolve} them and then complete the merge.  We talk about this
+in more detail later (@pxref{Merge Conflicts}).
+
+@node Repo Copies
+@section How Git Stores Branches and Their Copies
+
+So how does Git work?@footnote{The following description is greatly
+simplified.}
+
+A repository consists of a collection of @dfn{branches}. Each branch
+represents the history of a collection of files and directories (a file
+@dfn{tree}). Each combined set of changes to this collection (files and
+directories added or deleted, and/or file contents changed) is termed
+a @dfn{commit}.
+
+When you first create a local copy of a remote repository (``clone
+the repo''), Git copies all of the original repository's branches to
+your local system.  The original remote repository is referred to as
+being @dfn{upstream}, and your local repo is @dfn{downstream} from it.
+Git distinguishes branches from the upstream repo by prefixing their
+names with @samp{origin/}.  Let's draw some pictures. @ref{savannah-repo}
+represents the state of the repo on Savannah:
+
+@page
+@float Figure,savannah-repo
+@caption{The Savannah @command{gawk} Repository}
+@smallexample
++======================+
+|       Branches       |
++======================+
+| master               |
++----------------------+
+| gawk-4.1-stable      |
++----------------------+
+| gawk-4.0-stable      |
++----------------------+
+| feature/fix-comments |
++----------------------+
+| ...                  |
++----------------------+
+@end smallexample
+@end float
+
+@cindex @code{git branch}
+After you clone the repo, on your local system you will have a single
+branch named @code{master} that's visible when you use @samp{git branch}
+to see your branches.
+
+@cindex @code{git clone}
+@example
+$ @kbd{git clone http://git.savannah.gnu.org/r/gawk.git}  @ii{Clone the repo}
+$ @kbd{cd gawk}                                           @ii{Change to local copy}
+$ @kbd{git branch}                                        @ii{See branch information}
+@print{} * master
+@end example
+
+@noindent
+The current branch is always indicated with a leading asterisk (@samp{*}).
+
+Pictorially, the local repo looks like @ref{your-repo} (you can ignore
+the @samp{T} column for the moment):
+
+@float Figure,your-repo
+@caption{Your Local @command{gawk} Repository}
+@smallexample
++===+======================++=============================+
+| T |    Local Branches    ||      Remote Branches        |
++===+======================++=============================+
+| X | master               || origin/master               |
++---+----------------------++-----------------------------+
+|   |                      || origin/gawk-4.1-stable      |
++---+----------------------++-----------------------------+
+|   |                      || origin/gawk-4.0-stable      |
++---+----------------------++-----------------------------+
+|   |                      || origin/feature/fix-comments |
++---+----------------------++-----------------------------+
+|   |                      || ...                         |
++---+----------------------++-----------------------------+
+@end smallexample
+@end float
+
+@noindent
+@cindex @code{origin/} branches
+@cindex branches, @code{origin/}
+Note that what is simply @code{gawk-4.1-stable} in the upstream repo
+is now referred to as @code{origin/gawk-4.1-stable}.  The @samp{origin/}
+branches are a snapshot of the state of the upstream repo. This is
+how Git allows you to see what changes you've made with respect to the
+upstream repo, without having to actually communicate with the upstream
+repo over the Internet.  (When files are identical, Git is smart enough
+to not have two separate physical copies on your local disk.)
+
+If you're working on a simple bug fix or change, you can do so directly
+in your local @code{master} branch. You can then commit your changes,
+and if you have access rights, push them upstream to the Savannah repo.
+(However, there is a process to follow. Please read the rest of
+this @value{DOCUMENT}.)
+
+@node Local Branches
+@section Local Branches
+
+@cindex local branches
+@cindex branches, local
+Let's talk about local branches in more detail.  (The terminology used
+here is my own, not official Git jargon.) There are two kinds of local
+branches:
+
+@table @dfn
+@item Tracking Branches
+@cindex tracking branches
+@cindex branches, tracking 
+@cindex @code{git checkout}
+Tracking branches track branches from the upstream repository.  You first
+create a tracking branch simply by checking out a branch from the
+upstream. You use the branch name without the leading @samp{origin/}
+prefix. For example, @samp{git checkout gawk-4.1-stable}.
+
+@cindex @code{git push}
+You can then work on this branch, making commitments to it as you wish.
+Once things are ready to move upstream, you simply use @samp{git push},
+and your changes will be pushed up to the main repo.@footnote{Assuming
+you have permission to do so, of course.}
+
+You should @strong{never} checkout a branch using the @samp{origin/}
+prefix.  Things will get very confused. Always work on local tracking
+branches.
+
+@item Purely Local Branches
+A @dfn{purely local branch} exists only on your system.  You may be developing
+some large new feature, or fixing a very difficult bug, or have a change
+for which paperwork has not yet been completed.
+
+In such a case, you would keep your changes on a local branch, and
+periodically synchronize it with @code{master} (or whichever upstream
+branch you started from).
+@end table
+
+This may seem somewhat abstract so far. We demonstrate with commands
+and branches in @ref{Development without commit access},
+later in this @value{DOCUMENT}.
+
+Let's say you have checked out a copy of @code{gawk-4.1-stable} and
+have created a purely local branch named @code{better-random}. Then
+our picture now looks like @ref{your-repo-2}, where the @samp{T} column
+indicates a tracking branch.
+
+@float Figure,your-repo-2
+@caption{Your Local @command{gawk} Repository With a Purely Local Branch}
+@smallexample
++===+======================++=============================+
+| T |   Local Branches     ||      Remote Branches        |
++===+======================++=============================+
+| X | master               || origin/master               |
++---+----------------------++-----------------------------+
+| X | gawk-4.1-stable      || origin/gawk-4.1-stable      |
++---+----------------------++-----------------------------+
+|   |                      || origin/gawk-4.0-stable      |
++---+----------------------++-----------------------------+
+|   |                      || origin/feature/fix-comments |
++---+----------------------++-----------------------------+
+|   |                      || ...                         |
++---+----------------------++-----------------------------+
+|   | better-random        ||                             |
++---+----------------------++-----------------------------+
+@end smallexample
+@end float
+
+@node Branches are state
+@section Branches Represent Development State
+
+Branches represent development state. At any given time, when you
+checkout a particular branch (or create a new one), you have a copy
+of the @command{gawk} source tree that you should be able to build
+and test.
+
+The following @value{SECTION}s describe the different branches
+in the @command{gawk} repository and what they are for, as well
+as how to use your own branches.
+
+@menu
+* Repo State::                  The different branch types in the repo.
+* Local State::                 Managing local branches.
+* Remotes::                     What a ``remote'' is.
+@end menu
+
+@node Repo State
+@subsection Branches in the Savannah Repository
+
+There are several kinds of branches in the Savannah repository.
+
+@table @dfn
+@cindex branches, dead
+@cindex dead branches
+@item Dead Branches
+Branches with the prefix @samp{dead-branches/} (such as
+@code{dead-branches/const}) hold code that was never merged into the
+main code base. For example, a feature which was started, but later
+deemed to be unwise to add.  These branches keep the code available,
+but they are not updated.
+
+@cindex branches, stable
+@cindex stable branches
+@item Stable Branches
+These branches are used for bug fixes to released versions
+of @command{gawk}.  Sometimes new development (i.e., user-visible
+changes) also occurs on these branches, although in a perfect world
+they would be used only for bug fixes.
+
+These branches have names like @code{gawk-4.1-stable},
+@code{gawk-4.0-stable}, and so on.  Once a release has been made from
+@code{master}, the previous stable branch is not updated. For example,
+once @command{gawk} 4.1.0 was released, no more work was done on
+@code{gawk-4.0-stable}.
+
+@cindex branch, main
+@cindex main branch
+@cindex branch, @code{master}
+@cindex @code{master} branch
+@item The Main Branch
+This is the @code{master} branch.  Here is where most new feature
+development takes place, and releases of new major versions are based
+off of this branch.
+
+Feature branches are typically based off this branch as well, and when
+the feature is deemed complete, merged back into it.
+
+@cindex branches, feature
+@cindex feature branches
+@item Feature Branches
+Often, a proposed new feature or code improvement is quite involved.
+It may take some time to perfect, or the @command{gawk} development team
+may not be convinced that the feature should be kept.
+
+For this purpose, the team uses branches prefixed with @samp{feature/}.
+This prefix is used even for code that simply improves the internals
+and does not make a user-visible change.
+
+Having large changes on separate branches makes it easier for members
+of the team to review the code, and also makes it easier to keep the
+changes up-to-date with respect to @code{master}, since Git excels at
+merging commits from one branch to another.
+@end table
+
+@node Local State
+@subsection Branches in Your Local Repository
+
+@cindex branches, purely local
+@cindex purely local branches
+Purely local branches are where you do your own development.
+You may use purely local branches because you don't have commit rights
+to the Savannah repo. You may also use them if you are doing some work
+that isn't ready for sharing with the rest of the team, or cannot be
+committed for some other reason.
+
+For example, for around a nine-month period, the maintainer kept a
+purely local branch for some contributed changes for which paperwork had
+not yet been completed.
+
+@node Remotes
+@subsection A Closer Look at Branch Naming
+
+@cindex @command{git branch} command, @option{-a} option
+Earlier, we said that Git maintains copies of the branches
+in the upstream repo, as well as manages your local branches.
+You can see all these branches with @samp{git branch -a}:
+
+@example
+$ @kbd{git branch -a}
+@print{}   gawk-4.1-stable
+@print{} * master
+@print{}   remotes/origin/HEAD -> origin/master
+@print{}   remotes/origin/dead-branches/async-events
+@print{}   @dots{}
+@print{}   remotes/origin/feature/api-mpfr
+@print{}   remotes/origin/feature/array-iface
+@print{}   remotes/origin/feature/fix-comments
+@print{}   @dots{}
+@end example
+
+You'll note that what we've referred to as @samp{origin/} branches
+appear in the output with an additional prefix: @samp{remotes/}.
+Up to this point, we've treated Git as if it allowed only a single
+upstream repository.  But in fact, you can configure it to use more
+than one.  All the known upstream repositories are grouped under
+the @samp{remotes/} prefix, with @code{remotes/origin} being the one
+from which you initially cloned your local repository.
+
+The ability to work with multiple upstream repositories is an
+advanced one; @command{gawk} development does not make use of it.
+The intent of this @value{SUBSECTION} is to explain the output
+from @samp{git branch -a}, nothing more.
+
+@node Configuring git
+@chapter Configuring Global Settings For Git
+
+@cindex configuration settings
+@cindex settings, configuration
+@cindex global configuration settings
+@cindex configuration settings, global
+Before starting to use Git, you should configure it with some important
+settings that won't change as you use Git.  You may configure options
+both globally, and on a per-repository basis.  Here, we discuss only
+global configuration settings.
+
+@cindex @code{git config}
+You can configure Git using either @samp{git config}, or by editing
+the relevant files with your favorite text editor.@footnote{You are
+required to use either Vim or Emacs, other text editors are not
+allowed.  Of course, reasonable developers wouldn't want to use
+any other editor anyway.}
+
+@cindex email address
+The first things to set are your email address and your real name:
+
+@cindex @code{user.name} configuration setting
+@cindex @code{user.email} configuration setting
+@cindex configuration setting, @code{user.name}
+@cindex configuration setting, @code{user.email}
+@example
+$ @kbd{git config --global user.name "J.P. Developer"}     @ii{Set full name}
+$ @kbd{git config --global user.email jpdev@@example.com}   @ii{Set email address}
+@end example
+
+Setting these two items are an absolute requirement.
+@strong{Note}: No aliases are allowed. If you can't supply your
+real name, you cannot contribute to the project. Other options that
+the @command{gawk} maintainer recommends that you use are:
+
+@cindex @code{push.default} configuration setting
+@cindex @code{pager.status} configuration setting
+@cindex configuration setting, @code{push.default}
+@cindex configuration setting, @code{pager.status}
+@example
+$ @kbd{git config --global push.default simple}    @ii{Only push current branch}
+$ @kbd{git config --global pager.status true}      @ii{Use pager for output of} git status
+@end example
+
+@cindex @file{.gitconfig} file
+The global settings are stored in the @file{.gitconfig} file in your
+home directory. The file looks like this:
+
+@example
+[user]
+        name = J.P. Developer
+        email = jpdev@@example.com
+[push]
+        default = simple
+[pager]
+        status = true
+@end example
+
+The @code{push.default=simple} setting ensures that older
+versions of Git only push the current branch up to the Savannah
+repo. This is the safest way to operate, and is the default
+in current Git versions.
+
+There may be other settings in your configuration file as well.
+Use @samp{git config} to see your settings:
+
+@example
+$ @kbd{git config --list}
+@print{} user.name=J.P. Developer
+@print{} user.email=jpdev@@example.com
+@print{} push.default=simple
+@end example
+
+Here are the @command{gawk} maintainer's settings:
+
+@example
+$ @kbd{git config --global --list}
+@print{} user.name=Arnold D. Robbins
+@print{} user.email=arnold@@@dots{}
+@print{} credential.helper=cache --timeout=3600
+@print{} push.default=simple
+@print{} color.ui=false
+@print{} core.autocrlf=input
+@print{} pager.status=true
+@print{} log.decorate=auto
+@end example
+
+Additional, per-project (``local'') settings are stored in
+each repo's @file{.git/config} file.
+
+@node Development without commit access
+@chapter Development Without Commit Access
+
+In this chapter we present step-by-step recipes for checking out
+and working with a local
+copy of the Savannah Git repo for @command{gawk}.
+The presentation is for when you do not have commit access
+to the Git repo, and so you cannot push your changes directly.
+
+@menu
+* Cloning::                     Cloning the repo the first time.
+* Switching Branches::          Moving from one branch to another.
+* Starting A New Branch::       Starting a new branch for development.
+* Undoing a change::            Throwing away changes.
+* Updating::                    Keeping in sync with the upstream repo.
+* Submitting Changes::          How to submit your changes.
+* Removing Branches::           Getting rid of unneeded branches.
+* Points to remember::          Things you need to keep in mind.
+@end menu
+
+@node Cloning
+@section Cloning The Repo
+
+@cindex @code{git clone}
+Clone the Savannah repo using @samp{git clone}. You may do so using
+either the native Git protocol, or using HTTP if you must go through a
+gateway or firewall that won't pass the Git protocol.
+
+@cindex URL, for cloning repositories
+To choose which method, you supply a @dfn{URL} for the repo when you
+clone it, as follows.
+
+@cindex URL, for @command{gawk} repository
+@cindex Repository, @command{gawk}, URL for
+@itemize @bullet
+@item
+Clone via the Git native protocol:
+
+@example
+$ @kbd{git clone git://git.savannah.gnu.org/gawk.git}     @ii{Clone the repo}
+@print{} ...
+$ @kbd{cd gawk}                                           @ii{Start working}
+@end example
+
+This will be faster, but not all firewalls pass the Git protocol
+on through.
+
+@item
+Clone via the HTTP protocol:
+
+@example
+$ @kbd{git clone http://git.savannah.gnu.org/r/gawk.git}  @ii{Clone the repo}
+@print{} ...
+$ @kbd{cd gawk}                                           @ii{Start working}
+@end example
+@end itemize
+
+@emph{You only need to clone the repo once.} From then on, you update its
+contents using other Git commands. For example, after coming back from
+your vacation in the Bahamas:
+
+@cindex @code{git pull}
+@example
+$ @kbd{cd gawk}               @ii{Move to the repo}
+$ @kbd{make distclean}        @ii{A good idea before updating}
+@print{} ...
+$ @kbd{git pull}              @ii{Update it}
+@end example
+
+To build, you should generally follow this recipe:
+
+@example
+$ @kbd{./bootstrap.sh && ./configure && make -j && make check}
+@end example
+
+@cindex @file{bootstrap.sh} script
+@quotation NOTE
+Unless you have installed all the tools described in @ref{GNU Tools},
+you @emph{must} run @command{./bootstrap.sh} every time you clone a repo,
+do a @samp{git pull} or checkout a different branch. (In the latter case,
+do @samp{make distclean} first.)  Otherwise things will get messy very
+quickly. The @command{bootstrap.sh} script ensures that all of the file
+time stamps are up to date so that it's not necessary to run the various
+configuration tools.
+@end quotation
+
+@node Switching Branches
+@section Switching Branches
+
+So far, we've been working in the default @code{master} branch.
+Let's check what's happening in the @code{gawk-4.1-stable} branch:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@example
+$ @kbd{make distclean}                                          @ii{Clean up}
+$ @kbd{git checkout gawk-4.1-stable}                            @ii{Checkout a different branch}
+@print{} ...
+$ @kbd{git pull}                                                @ii{Get up to date}
+@print{} ...
+$ @kbd{./bootstrap.sh && ./configure && make -j && make check}  @ii{Start working}
+@end example
+
+@node Starting A New Branch
+@section Starting A New Branch
+
+Let's say you want to work on a new feature. For example,
+you might decide to add Python syntax support.@footnote{Just joking.
+Please don't attempt this for real.} You should create a
+new branch on which to work.  First, switch back to @code{master}:
+
+@cindex @code{git checkout}
+@example
+$ @kbd{make distclean}
+$ @kbd{git checkout master}
+@end example
+
+Now, create a new branch. The easiest way to do that is
+with the @option{-b} option to @samp{git checkout}:
+
+@example
+$ @kbd{git checkout -b feature/python}
+@print{} ...
+@end example
+
+@cindex @file{ChangeLog} file
+@cindex committing changes
+You now do massive amounts of work in order to add Python syntax support.
+As you do each defined chunk of work, you update the @file{ChangeLog}
+file with your changes before @dfn{committing} them to the repo.
+
+@cindex @code{git status}
+Let's say you've added a new file @file{python.c} and updated several
+others. Use @samp{git status} to see what's changed:
+
+@example
+$ @kbd{git status}
+@print{} ...
+@end example
+
+@cindex @code{git diff}
+@cindex @code{git difftool}
+@cindex @command{meld} utility
+Before committing the current set of changes, you can use @samp{git diff}
+to view the changes. You may also use @samp{git difftool}@footnote{Don't
+run @samp{git difftool} in the background; it works interactively.} to run an
+external @command{diff} command, such as @command{meld} on GNU/Linux:
+
+@example
+$ @kbd{git diff}                           @ii{Regular built-in tool}
+$ @kbd{git difftool --tool=meld}           @ii{GUI diff tool}
+@end example
+
+@cindex @code{git add}
+When you're happy with the changes, use @samp{git add} to tell
+Git which of the changed and/or new files you wish to have ready to
+be committed:
+
+@example
+$ @kbd{git add ...}
+@end example
+
+@cindex @code{git status}
+Use @samp{git status} to see that your changes are scheduled for committing:
+
+@example
+$ @kbd{git status}
+@print{}
+@end example
+
+Now you can commit your changes to your branch:
+
+@cindex @code{git commit}
+@example
+$ @kbd{git commit}
+@end example
+
+@noindent
+@cindex @code{git log}
+Running @samp{git commit} causes Git to invoke an editor
+(typically from the @env{$EDITOR} environment variable)
+in which you can compose a commit message. Please supply a
+short message summarizing the commit. This message will be
+visible via @samp{git log}.
+
+@node Undoing a change
+@section Undoing A Change
+
+Should you need to undo a change that you have not yet
+committed (so that you can start over), you can do so on
+per-file basis by simply checking out the file again:
+
+@cindex @code{git checkout}
+@example
+git checkout awkgram.y      @ii{Undo changes to} awkgram.y@ii{. There is no output}
+@end example
+
+@cindex @code{git reset}
+To start over completely, use @samp{git reset --hard}.
+Note that this will @emph{throw away} all your changes, with no
+chance for recovery, so be sure you really want to do it.
+
+@node Updating
+@section Updating and Merging
+
+As you work on your branch, you will occasionally want to bring it
+up to date with respect to @code{master}.
+This @value{SECTION} discusses updating local branches
+and handling merge conflicts.
+
+@menu
+* Rebasing::                    Rebasing A Local Branch.
+* Merge Conflicts::             Dealing With Merge Conflicts.
+@end menu
+
+@node Rebasing
+@subsection Rebasing A Local Branch
+
+@cindex rebasing
+For purely local branches, bringing  your branch up to date is called
+@dfn{rebasing}, which causes the branch to look @emph{as if} you had
+started from the latest version of @code{master}.  The steps are as
+follows:
+
+@cindex @code{git rebase}
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@example
+$ @kbd{git checkout master}                @ii{Checkout} master
+$ @kbd{git pull}                           @ii{Update it}
+$ @kbd{git checkout feature/python}        @ii{Move back to new, purely local branch}
+$ @kbd{git rebase master}                  @ii{``Start over'' from current} master
+@end example
+
+@node Merge Conflicts
+@subsection Dealing With Merge Conflicts
+
+@cindex conflicts, from merging
+@cindex merge conflicts
+
+Sometimes, when merging from @code{master} into your branch, or from
+a branch into @code{master}, there will be @dfn{merge conflicts}.
+These are one or more areas within a file where there are conflicting
+sets of changes, and Git could not do the merge for you.
+In this case, the conflicted area will be delimited by the traditional
+conflict markers, @samp{<<<}, @samp{===} and @samp{>>>}.
+
+Your mission is then to edit the file and @dfn{resolve} the conflict
+by fixing the order of additions (such as in a @file{ChangeLog} file),
+or fixing the code to take new changes into account.
+
+Once you have done so, you tell Git that everything is OK using
+@samp{git add} and @samp{git commit}:
+
+@example
+$ @kbd{git checkout feature/python}        @ii{Move back to new, purely local branch}
+$ @kbd{git rebase master}                  @ii{``Start over'' from current} master
+@print{} ... Kaboom! Conflict. FIXME: Show real output here
+$ @kbd{gvim main.c}                        @ii{Edit the file and fix the problem}
+$ @kbd{git add main.c}                     @ii{Tell Git everything is OK now @dots{}}
+$ @kbd{git commit}                         @ii{@dots{} and it's settled}
+$ @kbd{git rebase --continue}              @ii{Continue the rebase}
+@end example
+
+The @command{git rebase --continue} then continues the process of
+rebasing the current branch that we started in @ref{Rebasing}.
+It's not necessary if you are  using @samp{git merge}
+(@pxref{Points to remember}).
+
+@node Submitting Changes
+@section Submitting Your Changes
+
+So now your feature is complete. You've added test cases for it to
+the test suite@footnote{You did do this, didn't you?}, you have
+@file{ChangeLog} entries that describe all the changes@footnote{You remembered this, right?},
+you have documented the new feature@footnote{You wouldn't neglect this, would you?},
+and everything works great. You're ready
+to submit the changes for review, and with any luck, inclusion into
+@command{gawk}.
+
+@cindex review, changes you made
+@cindex changes, submitting for review
+There are two ways to submit your changes for review.
+
+@table @emph
+@cindex generating a single patch
+@cindex patch, single, generation of
+@item Generate a single large patch
+To do this, simply compare your branch
+to the branch off which it is based:
+
+@cindex @code{git checkout}
+@cindex @code{git diff}
+@example
+$ @kbd{git checkout feature/python}
+$ @kbd{git diff master > /tmp/python.diff}
+@end example
+
+Mail the @file{python.diff} file to the appropriate mailing list
+along with a description of what you've changed and why.
+
+@cindex @code{git format-patch}
+@cindex generating multiple patches
+@cindex patches, multiple, generation of
+@item Generate a set of patches that in toto comprise your changes
+To do this, use @samp{git format-patch}:
+
+@cindex @code{git checkout}
+@example
+$ @kbd{git checkout feature/python}
+$ @kbd{git format-patch}
+@end example
+
+This creates a set of patch files, one per commit that isn't on the
+original branch.  Mail these patches, either separately, or as a set of
+attachments, to the appropriate mailing list along with a description
+of what you've changed and why.
+
+@end table
+
+Either way you choose to submit your changes, the @command{gawk}
+maintainer and development team will review your changes and provide feedback.
+If you have signed paperwork with the FSF for @command{gawk} and the maintainer
+approves your changes, he will apply the patch(es) and commit the changes.
+
+Which list should you send mail to?  If you are just starting to
+contribute, use @email{bug-gawk@@gnu.org}.  After making enough
+contributions, you may be invited to join the private @command{gawk}
+developers' mailing list. If you do so, then submit your changes to
+that list.
+
+If you make any substantial changes, you will need to assign copyright
+in those changes to the Free Software Foundation before the maintainer
+can commit those changes.  @xref{Doing paperwork}, for more information.
+
+@node Removing Branches
+@section Removing Branches
+
+@cindex removing branches
+@cindex branches, removing
+Once the maintainer has integrated your changes, you can get
+rid of your local branch:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git branch}
+@example
+$ @kbd{git checkout master}                 @ii{Move to upstream branch}
+$ @kbd{git pull}                            @ii{Update}
+$ @kbd{gvim ChangeLog ...}                  @ii{Verify your changes are in}
+$ @kbd{git branch -d feature/python}        @ii{Remove your local branch}
+@end example
+
+@node Points to remember
+@section Points to Remember
+
+There are some important points to remember:
+
+@itemize @bullet
+@item
+Always do a @samp{make distclean} before switching between branches.
+Things will get really confused if you don't.
+
+@item
+For upstream branches, @emph{always} work with tracking branches. @emph{Never}
+use @samp{git checkout origin/@var{whatever}}.  Git will happily let
+you do something like that, but it's just plain asking for trouble.
+
+@item
+Make sure your tracking branches are up-to-date before doing anything
+with them, particularly using them as the basis for a rebase
+or merge.  This typically means a three-step process:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@example
+$ @kbd{git checkout master}             @ii{Get to local copy}
+$ @kbd{git pull}                        @ii{Bring it up to date}
+$ @kbd{git checkout feature/python}     @ii{Go back to your branch}
+@end example
+
+@noindent
+You can then do the actual rebase:
+
+@cindex @code{git rebase}
+@example
+$ @kbd{git rebase master}               @ii{Now rebase your feature off of master}
+@end example
+
+@item
+Git always treats the currently checked-out branch as the object of
+operations.  For example, when comparing files with the regular
+@command{diff} command, the usage is @samp{diff @var{oldfile} @var{newfile}}.
+For @samp{git diff}, the current branch takes the place of @var{newfile}, thus:
+
+@cindex @code{git checkout}
+@cindex @code{git diff}
+@example
+$ @kbd{git checkout feature/python}
+$ @kbd{git diff master}                 @ii{Compare} master @ii{to current branch}
+@end example
+
+@noindent
+or if merging:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git merge}
+@example
+$ @kbd{git checkout master}             @ii{Checkout} master
+$ @kbd{git pull}                        @ii{Update tracking branch}
+$ @kbd{git merge feature/python}        @ii{Merge changes into} master
+@end example
+
+@end itemize
+
+@node Development with commit access
+@chapter Development With Commit Access
+
+This @value{CHAPTER} describes how to do development when you @emph{do}
+have commit access to the @command{gawk} repo on Savannah.
+
+@menu
+* Initial setup::                   Getting started with commit access.
+* ssh clone::                       Cloning using an @samp{ssh://} URL.
+* Developing patches::              Developing patches.
+* Developing new features::         Developing new features.
+* Developing fixes::                Developing fixes.
+@end menu
+
+@node Initial setup
+@section Initial Setup
+
+Congratulations!  After becoming a quality contributor to @command{gawk}
+development, you've been invited to join the private development list
+and to accept having commit access to the repo.
+
+@cindex Savannah, creating an account
+@cindex account, Savannah, creation of
+@cindex @code{ssh} key
+The first thing to do is to create an account on Savannah, choosing a
+unique user name. To do so, go to the @uref{http://savannah.gnu.org,
+Savannah home page} and click on the ``New User'' link.  The setup
+will include uploading of your @command{ssh} key, as per the instructions
+on the Savannah web page.
+
+After you've done all this, send email to the maintainer with your
+Savannah user name, and he will add you to the list of users who have
+commit access to the repo.
+
+@node ssh clone
+@section Cloning The Repo With An @command{ssh} URL
+
+In order to be able to commit changes to the repo, you must
+clone it using an @samp{ssh://} URL.
+Cloning the repo with @command{ssh} is similar to cloning
+with the Git protocol or with HTTP, but the URL is different:
+
+@cindex @code{git clone}
+@cindex URL, for @command{gawk} repository
+@cindex Repository, @command{gawk}, URL for
+@example
+$ @kbd{git clone ssh://yourname@@git.sv.gnu.org/srv/git/gawk.git}
+@print{} ...
+@end example
+
+Here, you should replace @samp{yourname} in the command with the user
+name you chose for use on Savannah.
+
+@node Developing patches
+@section Developing Patches
+
+The first part of developing a patch is the same as for developers
+without commit access:
+
+@enumerate 1
+@item
+Develop the code and test it.
+
+@item
+@cindex @file{ChangeLog} file
+Update the @file{ChangeLog}.
+
+@item
+@cindex documentation files
+@cindex @file{gawktexi.in} documentation
+@cindex @file{gawk.1} manual page
+If necessary, update the documentation: @file{doc/gawktexi.in}
+and/or @file{doc/gawk.1}.
+
+@cindex @code{git diff}
+@item
+Use @samp{git diff > mychange.diff} to create a patch file.
+
+@item
+Send it to the mailing list for discussion.
+
+@item
+Iterate until the patch is ready to be committed.
+@end enumerate
+
+However, now that you have commit access, you can commit the fix and push
+it up to the repo yourself!
+Let's assume you've made a bug fix directly on @code{master}.
+Here's how to commit your changes:
+
+@cindex @code{git diff}
+@cindex @code{git add}
+@cindex @code{git commit}
+@cindex @code{git push}
+@example
+$ @kbd{git diff}            @ii{Review the patch one more time}
+$ @kbd{git add @dots{}}         @ii{Add any files for committing}
+$ @kbd{git commit}          @ii{Commit the files. Include a commit message.}
+$ @kbd{git push}            @ii{Push the files up to the repo. Ta da!}
+@end example
+
+The first three steps are the same described earlier
+(@pxref{Starting A New Branch}).
+The @samp{git push} is what's new, and it updates the repo on
+Savannah.  Congratulations!
+
+As a courtesy, you should send a note to the mailing list indicating
+that you have pushed your change.
+
+@node Developing new features
+@section Developing New Features
+
+Developing a new feature can be easier once you have commit access
+to the repo.  First, create a new branch to hold your feature:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@example
+$ @kbd{git checkout master}                     @ii{Start from} master
+$ @kbd{git pull}                                @ii{Be sure to be up to date}
+$ @kbd{git checkout -b feature/python}          @ii{Create and switch to a new branch}
+@end example
+
+Now, you can develop as normal, adding new files if necessary (such as new tests),
+modifying code, updating the @file{ChangeLog} and documentation, and so on.
+
+You can share changes with the mailing list as diffs, as usual. However, especially
+for a large feature, it would be better to push your branch up to Savannah. Then,
+everyone else can simply pull it down to their local systems and review your
+changes at their leisure.
+
+To push your branch up initially:
+
+@cindex @code{git diff}
+@cindex @code{git add}
+@cindex @code{git commit}
+@cindex @code{git push}
+@example
+$ @kbd{git diff}                                @ii{Review your changes}
+$ @kbd{git add @dots{}}                             @ii{Add any files for committing}
+$ @kbd{git commit}                              @ii{Commit the files. Include a commit message}
+$ @kbd{git push -u origin feature/python}       @ii{Push the branch up to the repo}
+@end example
+
+When you use @samp{push -u origin}, Git helpfully converts
+your purely local branch into a tracking branch. It becomes
+as if the branch had originated from the upstream repo
+and you checked it out locally.
+
+@emph{You only need to do @samp{git push -u origin} once.}
+As you continue to work on your branch, the workflow simplifies
+into this:
+
+@cindex @code{git diff}
+@cindex @code{git add}
+@cindex @code{git commit}
+@cindex @code{git push}
+@example
+$ @kbd{git diff}                @ii{Review your changes}
+$ @kbd{git add @dots{}}             @ii{Add any files for committing}
+$ @kbd{git commit}              @ii{Commit the files}
+$ @kbd{git push}                @ii{Push your changes to the branch upstream}
+@end example
+
+@node Developing fixes
+@section Developing Fixes
+
+If you want to make a fix on @code{master} or on the current
+stable branch, you work the same way, by producing and discussing
+a diff on the mailing list.  Once it's approved, you can commit it
+yourself:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git add}
+@cindex @code{git commit}
+@cindex @code{git diff}
+@example
+$ @kbd{git checkout master}     @ii{Move to} master
+$ @kbd{git pull}                @ii{Make sure we're up to date with the maintainer}
+$ @kbd{gvim @dots{}}                @ii{Make any fixes, compile, test}
+$ @kbd{git diff}                @ii{Review your changes}
+$ @kbd{git add @dots{}}             @ii{Add any files for committing}
+$ @kbd{git commit}              @ii{Commit the files. Include a commit message.}
+@end example
+
+When you're ready to push your changes:
+
+@cindex @code{git pull}
+@cindex @code{git push}
+@example
+$ @kbd{git pull}                @ii{Download latest version; Git will merge}
+$ @kbd{gvim ...}                @ii{Resolve any merge conflicts with} git add @ii{and} git commit
+$ @kbd{git push}                @ii{Now you can push your changes upstream}
+@end example
+
+@xref{Merge Conflicts} for instructions on dealing with merge conflicts.
+
+@node General practices
+@chapter General Development Practices
+
+This @value{CHAPTER} discusses general practices for @command{gawk} development.
+The discussion here is mainly for developers with commit access to the
+Savannah repo.
+
+@table @dfn
+@cindex propagating fixes to other branches
+@cindex fixes, propagating to other branches
+@item Propagating Fixes
+Usually, bug fixes should be made on the current ``stable'' branch.
+Once a fix has been reviewed and approved, you can commit it and
+push it yourself.
+Typically, the maintainer then takes care to merge the fix to @code{master}
+and from there to any other branches. However, you are welcome to
+save him the time and do this yourself.
+
+@cindex directory ownership
+@cindex ownership of directories
+@item Directory ownership
+Some developers ``own'' certain parts of the tree, such as the @file{pc} and @file{vms} directories.
+They are allowed to commit changes to those directories without review by the mailing
+list, but changes that also touch the mainline code should be submitted for review.
+
+@item New feature development
+Unless you can convince the maintainer (and the other developers!) otherwise,
+you should @emph{always} start branches for new features from @code{master},
+and not from the current ``stable'' branch.
+
+Use @samp{checkout -b feature/@var{feature_name}} to create the initial branch.
+You may then elect to keep it purely local, or to push it up to Savannah for
+review, even if the feature is not yet totally ``ready for prime time.''
+@end table
+
+During development of a new feature, you will most likely wish to keep your
+feature branch up to date with respect to ongoing improvements in @code{master}.
+This is generally easy to do. There are two different mechanisms, and which
+one you use depends upon the nature of your new feature branch.
+
+@table @dfn
+@item As long as your branch is purely local
+You should use @samp{git rebase}
+to the keep the branch synchronized with the original branch from which it was forked:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git rebase}
+@example
+$ @kbd{git checkout master}             @ii{Move to} master
+$ @kbd{git pull}                        @ii{Bring it up to date}
+$ @kbd{git checkout feature/python}     @ii{Move to your new feature branch}
+$ @kbd{git rebase master}               @ii{Rebase from} master
+@end example
+
+@noindent
+The rebasing operation may require that you resolve conflicts
+(@pxref{Merge Conflicts}).
+Edit any conflicted files and resolve the problem(s). Compile and
+test your changes, then use @samp{git add}
+and @samp{git commit} to indicate resolution, and then use
+@samp{git rebase --continue} to continue the rebasing.
+Git is very good about providing short instructions on how to
+continue when such conflicts occur.
+
+@item Once the branch has been pushed up to Savannah
+You @emph{must} use @samp{git merge} to bring your feature branch up
+to date.  That flow looks like this:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git merge}
+@example
+$ @kbd{git checkout master}             @ii{Move to} master
+$ @kbd{git pull}                        @ii{Bring it up to date}
+$ @kbd{git checkout feature/python}     @ii{Move to your new feature branch}
+$ @kbd{git merge master}                @ii{Merge from} master
+@end example
+
+@noindent
+Here too, you may have to resolve any merge conflicts
+(@pxref{Merge Conflicts}).
+Once that's done, you can push the changes up to Savannah.
+
+When the changes on your branch are complete, usually the
+maintainer merges the branch to @code{master}. But
+there's really no magic involved, the merge is simply
+done in the other direction:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git merge}
+@example
+$ @kbd{git checkout feature/python}     @ii{Checkout feature branch}
+$ @kbd{git pull}                        @ii{Bring it up to date}
+$ @kbd{git checkout master}             @ii{Checkout} master
+$ @kbd{git pull}                        @ii{Bring it up to date}
+$ @kbd{git merge feature/python}        @ii{Merge from} feature/python @ii{into} master
+@end example
+
+If you've been keeping @samp{feature/python} in sync with
+@code{master}, then there should be no merge conflicts to
+resolve, and you can push the result to Savannah:
+
+@cindex @code{git push}
+@example
+$ @kbd{git push}                        @ii{Push up to Savannah}
+@end example
+
+Since @samp{feature/python} is no longer needed, it can be
+gotten rid of:
+
+@cindex @code{git branch}
+@cindex @code{git push}
+@example
+$ @kbd{git branch -d feature/python}                 @ii{Still on} master@ii{, delete feature branch}
+$ @kbd{git push -u origin --delete feature/python}   @ii{Delete the branch on Savannah}
+@end example
+
+The @samp{git push} command deletes the @code{feature/python}
+branch from the Savannah repo.
+
+@cindex @code{git fetch}
+@noindent
+Finally, you should send an email to developer's list describing
+what you've done so that everyone else can delete their
+copies of the branch and do a @samp{git fetch --prune}
+(@pxref{Repo Maintenance}).
+
+To update the other remaining development branches
+with the latest changes on @code{master}, use the
+@samp{helpers/update-branches.sh} script in the repo.
+
+@end table
+
+@node Repo Maintenance
+@chapter Keeping Your Repo Organized
+
+There are a few commands you should know about to help keep
+your local repo clean.
+
+@table @emph
+@cindex removing old branches
+@cindex old branches, removing
+@cindex branches, removing
+@item Removing old branches
+Developers add branches to the Savannah repo and when development
+on them is done, they
+get merged into @code{master}.  Then the branches on Savannah are
+deleted (as shown in @ref{General practices}).
+
+However, your local copies of those branches (labelled with the
+@samp{origin/} prefix) remain in your local repo. If you don't
+need them, then you can clean up your repo as follows.
+
+First, remove any related tracking branch you may have:
+
+@cindex @code{git pull}
+@cindex @code{git branch}
+@example
+$ @kbd{git pull}                                @ii{Get up to date}
+$ @kbd{git branch -d feature/merged-feature}    @ii{Remove tracking branch}
+@end example
+
+Then, ask Git to clean things up for you:
+
+@cindex @code{git fetch}
+@example
+$ @kbd{git fetch --prune}                       @ii{Remove unneeded branches}
+@end example
+
+@cindex removing cruft
+@cindex cruft, removing
+@item Removing cruft
+As Git works, occasional ``cruft'' collects in the repository.
+Git does occasionally clean this out on its own, but if you're
+concerned about disk usage, you can do so yourself
+using @samp{git gc} (short for ``garbage collect''). For
+example:
+
+@cindex @code{git gc}
+@example
+$ @kbd{du -s .}                               @ii{Check disk usage}
+@print{} 99188   .                            @ii{Almost 10 megabytes}
+$ @kbd{git gc}                                @ii{Collect garbage}
+@print{} Counting objects: 32114, done.
+@print{} Delta compression using up to 4 threads.
+@print{} Compressing objects: 100% (6370/6370), done.
+@print{} Writing objects: 100% (32114/32114), done.
+@print{} Total 32114 (delta 25655), reused 31525 (delta 25231)
+$ @kbd{du -s .}                               @ii{Check disk usage again}
+@print{} 75168   .                            @ii{Down to 7 megabytes}
+@end example
+
+@cindex renaming branches
+@cindex branches, renaming
+@item Renaming branches
+Occasionally you may want to rename a branch.@footnote{This discussion
+adopted from
+@uref{https://multiplestates.wordpress.com/2015/02/05/rename-a-local-and-remote-branch-in-git, here}.}
+If your branch is local and you are on it, us:
+
+@example
+$ @kbd{git branch -m feature/@var{new-name}}
+@end example
+
+@noindent
+Otherwise, use:
+
+@example
+$ @kbd{git branch -m feature/@var{old-name} feature/@var{new-name}}
+@end example
+
+You then need to fix the upstream repo.  This command does so,
+using an older syntax to simultaneously delete the old name and
+push the new name. You should be on the new branch:
+
+@example
+$ @kbd{git push origin :feature/@var{old-name} feature/@var{new-name}}
+@end example
+
+@quotation NOTE
+It is the leading @samp{:} in the first branch name that causes
+Git to delete the old name in the upstream repo. Don't omit it!
+@end quotation
+
+Finally, reset the upstream branch for the local branch
+with the new name:
+
+@example
+$ @kbd{git push -u origin feature/@var{new-name}}
+@end example
+
+@end table
+
+@node Development Stuff
+@chapter Development Stuff
+
+This @value{CHAPTER} discusses other things you need to know and/or do
+if you're going to participate seriously in @command{gawk} development.
+
+@menu
+* Coding style::                Where to read up on the coding style.
+* Doing paperwork::             Legal stuff in order to contribute.
+* Tools::                       Tools to have on your system for development.
+* Debugging::                   Compiling for debugging.
+@end menu
+
+@node Coding style
+@section Coding Style
+
+@cindex coding style
+You should read the discussion about adding code in the @command{gawk}
+documentation.
+@ifnothtml
+@xref{Additions, Additions, Making Additions to @command{gawk}, gawk, GAWK: Effective awk Programming},
+for a discussion of the general procedure.  In particular, pay attention to the
+coding style guidelines in 
+@ref{Adding Code, Adding Code, Adding New Features, gawk, GAWK: Effective awk Programming}.@footnote{Changes that don't follow the coding
+style guidelines won't be accepted. Period.}
+These two sections may also be found online, at
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Additions.html#Additions}, and
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Adding-Code.html#Adding-Code},
+respectively.
+@end ifnothtml
+@ifhtml
+See @uref{https://www.gnu.org/software/gawk/manual/html_node/Additions.html#Additions,
+the section @cite{Making Additions to @command{gawk}}}, in the online documentation
+for a discussion of the general procedure.  In particular, pay attention to the
+coding style guidelines in 
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Adding-Code.html#Adding-Code,
+the section @cite{Adding New Features}}, also in the online documentation.
+@end ifhtml
+
+@node Doing paperwork
+@section Assigning Copyrights to the FSF
+
+@cindex assigning copyright
+@cindex copyright, assignment
+For any change of more than just a few lines, you will need to assign
+copyright in (that is, ownership of) those changes to the Free Software
+Foundation.
+
+This is generally an easy thing to do. In particular, you can choose to
+use a version of the copyright assignment which assigns all your current
+@emph{and future} changes to @command{gawk} to the FSF.  This means
+that you only need to do the paperwork once, and from then on all your
+changes will automatically belong to the FSF. The maintainer recommends
+doing this.
+
+The maintainer will help you with this process once you have a
+contribution that warrants it.
+
+@node Tools
+@section Software Tools You Will Need
+
+@cindex software tools
+This @value{SECTION} discusses additional tools that you may need to
+install on your system in order to be in sync with what the @command{gawk}
+maintainer uses. It also discusses different C compiler options for use
+during code development, and how to compile @command{gawk} for debugging.
+
+@menu
+* GNU Tools::                   The GNU Autotools.
+* Compilers::                   A discussion of compilers that can be used.
+@end menu
+
+@node GNU Tools
+@subsection GNU Tools
+
+@cindex GNU software tools
+@cindex autotools
+If you expect to work with the configuration files and/or the
+@file{Makefile} files, you will need to install a number of other GNU
+tools. In general, you should be using the latest versions of the tools,
+or least the same ones that the maintainer himself uses. This helps
+minimize the differences that the maintainer has to resolve when merging
+changes, and in general avoids confusion and hassle.
+Similarly, you should install the latest GNU documentation tools as well.
+The tools are described in the following list:
+
+@table @command
+@cindex @command{autoconf}
+@cindex GNU @command{autoconf}
+@cindex @file{configure.ac} file
+@item autoconf
+GNU Autoconf processes the @file{configure.ac} files in order to
+generate the @file{configure} shell script and @file{config.h.in}
+input file. See @uref{https://www.gnu.org/software/autoconf/autoconf.html,
+the Autoconf home page} for more information.
+
+@cindex @command{automake}
+@cindex GNU @command{automake}
+@cindex @file{Makefile.am} file
+@item automake
+GNU Automake processes the @file{configure.ac} and @file{Makefile.am}
+files to produce @file{Makefile.in} files. See @uref{https://www.gnu.org/software/automake,
+the Automake home page} for more information.
+
+@cindex @command{gettext}
+@cindex GNU @command{gettext}
+@cindex @file{gawk.pot} file
+@item gettext
+GNU Gettext processes the @command{gawk} source code to produce the
+original @file{po/gawk.pot} message template file. Normally you
+should not need need to do this; the maintainer usually
+manages this task. See @uref{https://www.gnu.org/software/gettext,
+the Gettext home page} for more information.
+
+@cindex @command{libtool}
+@cindex GNU @command{libtool}
+@cindex extensions, @command{gawk}
+@item libtool
+GNU Libtool works with Autoconf and Automake to produce portable
+shared libraries. It is used for the extensions that ship with @command{gawk},
+whose code is in the @file{extensions} directory.
+See @uref{https://www.gnu.org/software/libtool, the Libtool home page}
+for more information.
+
+@cindex @command{makeinfo}
+@cindex GNU @command{makeinfo}
+@cindex @command{Texinfo}
+@cindex GNU Texinfo
+@item makeinfo
+The @command{makeinfo} command is used to build the Info versions of
+the documentation. You need to have the same version as the maintainer
+uses, so that when you make a change to the documentation, the corresponding
+change to the generated Info file will be minimal. @command{makeinfo} is
+part of GNU Texinfo. See @uref{https://www.gnu.org/software/texinfo,
+the Texinfo home page} for more information.
+
+@end table
+
+@node Compilers
+@subsection Compilers
+
+@cindex compilers
+@cindex GCC, the GNU Compiler Collection
+The default compiler for @command{gawk} development is GCC, the
+@uref{https://gcc.gnu.org, GNU Compiler Collection}.
+The default version of GCC is whatever is on the
+maintainer's personal GNU/Linux system, although he does try to build
+the latest released version if that is newer than what's
+on his system, and then occasionally test @command{gawk} with it.
+
+@cindex @command{clang} compiler
+He also attempts to test occasionally with @uref{https://clang.llvm.org/,
+@command{clang}}.  However, he uses whatever is the default for his
+GNU/Linux system, and does @emph{not} make an effort to build the current
+version for testing.
+
+Both GCC and @command{clang} are highly optimizing compilers that produce
+good code, but are very slow.  There are two other compilers that
+are faster, but that may not produce quite as good code.  However, they
+are both reasonable for doing development.
+
+@table @emph
+@cindex @command{tcc} compiler
+@cindex Tiny C compiler
+@item The Tiny C Compiler, @command{tcc}
+This compiler is @emph{very} fast, but it produces only mediocre code.
+It is capable of compiling @command{gawk}, and it does so well enough
+that @samp{make check} runs without errors.
+
+However, in the past the quality has varied, and the maintainer has
+had problems with it. He recommends using it for regular development,
+where fast compiles are important, but rebuilding with GCC before doing
+any commits, in case @command{tcc} has missed something.@footnote{This
+bit the maintainer once.}
+
+See @uref{http://www.tinycc.org, the project's home page} for
+some information. More information can be found in the project's
+@uref{http://repo.or.cz/tinycc.git, Git repository}. The maintainer builds
+from the @code{mob} branch for his work, but after updating it you should
+check that this branch still works to compile @command{gawk} before
+installing it.
+
+@cindex @command{pcc} compiler
+@cindex Portable C compiler
+@item The (Revived) Portable C Compiler
+This is an updated version of the venerable Unix Portable C Compiler,
+PCC.  It accepts ANSI C syntax and supports both older and modern
+architectures. It produces better code than @command{tcc} but is slower,
+although still much faster than GCC and @command{clang}.
+
+See @uref{http://pcc.ludd.ltu.se, the project's home page} for more
+information. See @uref{http://pcc.ludd.ltu.se/supported-platforms}
+for instructions about obtaining the code using CVS and building it.
+
+@cindex @command{pcc} compiler, Git mirror
+An alternative location for the source is the @command{gawk}
+maintainer's @uref{https://github.com/arnoldrobbins/pcc-revived,
+Git mirror} of the code.
+@end table
+
+@node Debugging
+@section Compiling For Debugging
+
+@cindex debugging, compiling for
+@cindex compiling for debugging
+If you wish to compile for debugging, you should use GCC.  After
+running @command{configure} but before running @command{make}, edit the
+@file{Makefile} and remove the @option{-O2} flag from the definition of
+@code{CFLAGS}.  Optionally, do the same for @file{extensions/Makefile}.
+Then run @command{make}.
+
+@cindex @file{.developing} file
+You can enable additional debugging code by creating a file
+named @file{.developing} in the @command{gawk} source code directory
+@emph{before} running @command{configure}.  Doing so enables additional
+conditionally-compiled debugging code within @command{gawk}, and adds
+additional warning and debugging options if compiling with GCC.
+
+@node Cheat Sheet
+@appendix Git Command Cheat Sheet
+
+This @value{APPENDIX} provides an alphabetical list of the Git commands
+cited in this @value{DOCUMENT}, along with brief descriptions of
+what the commands do.
+
+@cindex @code{git help}
+@cindex @option{--help} option for @command{git}
+@cindex @command{git} command, @option{--help} option
+Note that you may always use either @samp{git help @var{command}}
+or @samp{git @var{command} --help} to get short, man-page style
+help on how to use any given Git command.
+
+@table @code
+@item git add
+Add a file to the list of files to be committed.
+
+@item git branch
+View existing branches, or delete a branch.
+Most useful options: @option{-a} and @option{-d}.
+
+@item git checkout
+Checkout an existing branch, create a new branch, or checkout a file to
+reset it. Use the @option{-b} option to create and checkout a
+new branch in one operation.
+
+@item git clone
+Clone (make a new copy of) an existing repository. You generally
+only need to do this once.
+
+@item git commit
+Commit changes to files which have been staged for committing
+with @samp{git add}.
+This makes your changes permanent, @emph{in your local repository only}.
+To publish your changes to an upstream repo, you must use @samp{git push}.
+
+@item git config
+Display and/or change global and/or local configuration settings.
+
+@item git diff
+Show a unified-format diff of what's changed in the current directory
+as of the last commit.  It helps to have Git configured to use
+its builtin pager for reviewing diffs (@pxref{Configuring git}).
+
+@item git difftool
+Use a ``tool'' (usually a GUI-based program) to view differences,
+instead of the standard textual diff as you'd get from @samp{git diff}.
+
+@item git fetch
+Update your local copy of the upstream's branches. That is,
+update the various @samp{origin/} branches. This leaves your
+local tracking branches unchanged.
+With the @option{--prune} option, this removes any copies
+of stale @samp{origin/} branches.
+
+@item git format-patch
+Create a series of patch files, one per commit not on the
+original branch from which you started.
+
+@item git gc
+Run a ``garbage collection'' pass in the current repository.
+This can often reduce the space used in a large repo. For
+@command{gawk} it does not make that much difference.
+
+@item git help
+Print a man-page--style usage summary for a command.
+
+@item git log
+Show the current branch's commit log. This includes who
+made the commit, the date, and the commit message.
+Commits are shown from newest to oldest.
+
+@item git merge
+Merge changes from the named branch into the current one.
+
+@item git pull
+When in your local tracking branch @code{@var{xxx}},
+run @samp{git fetch}, and then merge from @code{origin/@var{xxx}}
+into @code{@var{xxx}}.
+
+@item git push
+Push commits from your local tracking branch @code{@var{xxx}}
+through @code{origin/@var{xxx}} and on to branch @code{@var{xxx}}
+in the upstream repo. Use @samp{git push -u origin --delete @var{xxx}} to delete
+an upstream branch. (Do so carefully!)
+
+@item git rebase
+Rebase the changes in the current purely local branch to
+look as if they had been made relative to the latest
+commit in the current upstream branch (typically @code{master}).
+This is how you keep your local, in-progress changes up-to-date
+with respect to the original branch from which they were started.
+
+@item git reset
+@cindex @code{git reset}, @option{--hard} option
+Restore the original state of the repo, especially with the
+@option{--hard} option.  Read up on this command, and use it carefully.
+
+@item git status
+Show the status of files that are scheduled to be committed,
+and those that have been modified but not yet scheduled for committing.
+Use @samp{git add} to schedule a file for committing.
+This command also lists untracked files.
+
+@end table
+
+@node Resources
+@appendix Git Resources
+
+@cindex @cite{Pro Git} book
+There are many Git resources available on the Internet.
+Start at the @uref{http://git-scm.org, Git Project home page}.
+In particular, the @uref{https://git-scm.com/book/en/v2,
+@cite{Pro Git} book} is available online.
+
+@cindex Savannah, using Git guide
+See also @uref{http://savannah.gnu.org/maintenance/UsingGit,
+the Savannah quick introduction to Git}.
+
+@node TODO
+@appendix Stuff Still To Do In This Document
+
+@itemize @bullet
+@item
+Fill out all examples with full output
+
+@end itemize
+
+@ifnotdocbook
+@node Index
+@unnumbered Index
+@end ifnotdocbook
+@printindex cp
+
+@bye
diff --git a/gawk-5.0.1/doc/general-program.eps b/gawk-5.0.1/doc/general-program.eps
new file mode 100644
index 00000000000..12497168113
--- /dev/null
+++ b/gawk-5.0.1/doc/general-program.eps
@@ -0,0 +1,153 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: general-program.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5c
+%%CreationDate: Thu Jan  6 17:36:07 2011
+%%BoundingBox: 0 0 269 58
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 58 moveto 0 0 lineto 269 0 lineto 269 58 lineto closepath clip newpath
+-194.8 247.1 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Polyline
+0 slj
+0 slc
+7.500 slw
+n 4961 3021 m 4706 3467 l 4965 3911 l 5478 3908 l 5733 3462 l 5474 3018 l
+
+ cp gs col0 s gr 
+% Polyline
+gs  clippath
+4544 3495 m 4695 3495 l 4695 3435 l 4544 3435 l 4544 3435 l 4664 3465 l 4544 3495 l cp
+eoclip
+n 4095 3465 m
+ 4680 3465 l gs col0 s gr gr
+
+% arrowhead
+n 4544 3495 m 4664 3465 l 4544 3435 l 4544 3495 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6164 3495 m 6315 3495 l 6315 3435 l 6164 3435 l 6164 3435 l 6284 3465 l 6164 3495 l cp
+eoclip
+n 5805 3465 m
+ 6300 3465 l gs col0 s gr gr
+
+% arrowhead
+n 6164 3495 m 6284 3465 l 6164 3435 l 6164 3495 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 6405 3150 m 6330 3150 6330 3704 75 arcto 4 {pop} repeat
+  6330 3779 7274 3779 75 arcto 4 {pop} repeat
+  7349 3779 7349 3225 75 arcto 4 {pop} repeat
+  7349 3150 6405 3150 75 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+% Polyline
+n 3165 3195 m 3105 3195 3105 3719 60 arcto 4 {pop} repeat
+  3105 3779 3992 3779 60 arcto 4 {pop} repeat
+  4052 3779 4052 3255 60 arcto 4 {pop} repeat
+  4052 3195 3165 3195 60 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+/Times-Roman ff 180.00 scf sf
+6525 3510 m
+gs 1 -1 sc (Results) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+3375 3510 m
+gs 1 -1 sc (Data) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+4860 3510 m
+gs 1 -1 sc (Program) col0 sh gr
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+%EOF
diff --git a/gawk-5.0.1/doc/general-program.fig b/gawk-5.0.1/doc/general-program.fig
new file mode 100644
index 00000000000..8ab42f3d150
--- /dev/null
+++ b/gawk-5.0.1/doc/general-program.fig
@@ -0,0 +1,25 @@
+#FIG 3.2  Produced by xfig version 3.2.5b
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 0 0 0 7
+	 4961 3021 4706 3467 4965 3911 5478 3908 5733 3462 5474 3018
+	 4961 3021
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 4095 3465 4680 3465
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5805 3465 6300 3465
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5
+	 7349 3779 7349 3150 6330 3150 6330 3779 7349 3779
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 4 0 0 5
+	 4052 3779 4052 3195 3105 3195 3105 3779 4052 3779
+4 0 0 50 -1 0 12 0.0000 4 150 630 6525 3510 Results\001
+4 0 0 50 -1 0 12 0.0000 4 150 420 3375 3510 Data\001
+4 0 0 50 -1 0 12 0.0000 4 195 750 4860 3510 Program\001
diff --git a/gawk-5.0.1/doc/general-program.pdf b/gawk-5.0.1/doc/general-program.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f4f7572c18ce9c03238fb926079cf6c04c8231a4
GIT binary patch
diff --git a/gawk-5.0.1/doc/general-program.png b/gawk-5.0.1/doc/general-program.png
new file mode 100644
index 0000000000000000000000000000000000000000..7737261f9ce64f3ed6045df82b12ac70b6afc44a
GIT binary patch
diff --git a/gawk-5.0.1/doc/general-program.txt b/gawk-5.0.1/doc/general-program.txt
new file mode 100644
index 00000000000..cb85c294586
--- /dev/null
+++ b/gawk-5.0.1/doc/general-program.txt
@@ -0,0 +1,4 @@
+                  _______
++------+         /       \         +---------+
+| Data | -----> < Program > -----> | Results |
++------+         \_______/         +---------+
diff --git a/gawk-5.0.1/doc/it/ChangeLog b/gawk-5.0.1/doc/it/ChangeLog
new file mode 100644
index 00000000000..2224bb7fbb4
--- /dev/null
+++ b/gawk-5.0.1/doc/it/ChangeLog
@@ -0,0 +1,145 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-06-06         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updated.
+
+2019-05-12         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updated.
+
+2019-04-27         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updated.
+
+2019-04-18         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updated.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.0: Release tar ball made.
+
+2019-04-12         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updated.
+
+2018-12-18         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawk.1: Updated.
+	* gawktexi.in: Updated.
+
+2018-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in, gawk.1, texinfo.tex: Remove execute permission.
+
+2018-07-29         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updates for NaN/Infinity and pty example
+
+2018-06-15         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updates.
+
+2018-06-06         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updates.
+
+2018-05-25         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updates.
+
+2018-05-14         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updates.
+	* texinfo.tex: Updated to current version.
+
+2018-05-12         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updates.
+
+2018-03-30         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updates.
+
+2018-03-11         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Updates modified month.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-02-17         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: More updates.
+
+2017-02-17         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawk.1: Synchronized with English version.
+
+2018-02-10         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: More updates.
+
+2018-01-26         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: More updates.
+
+2018-01-18         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: More updates.
+
+2017-12-07         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Synchronize with English original.
+
+2018-01-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in: Remove incorrect '*' on some declarations of
+	ext_id in sample extension code. Thanks to Panos Papadopoulos
+	<panos1962@gmail.com> for the report.
+	* texinfo.tex: Updated from GNULIB.
+
+2017-12-07         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawk.1: New file. (Italian translation of the man page.)
+
+2017-12-05         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Italian translation updated.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-10-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawktexi.in (EDITION): Update to 4.2. Also, remove all visible
+	references to http://awk.info; that site no longer exists.  
+
+2017-10-17         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Italian translation updated.
+
+2017-10-12         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Italian translation updated.
+
+2017-10-08         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Italian translation updated.
+
+2017-10-01         Antonio Giovanni Colombo   <azc100@gmail.com>
+
+	* gawktexi.in: Italian translation updated.
+
+2017-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog: created.
+
+	Italian translation of "The Gawk Manual", contributed
+	by Antonio Giovanni Colombo <azc100@gmail.com>
+	and Marco Curreli <marcocurreli@tiscali.it>.
diff --git a/gawk-5.0.1/doc/it/api-figura1.eps b/gawk-5.0.1/doc/it/api-figura1.eps
new file mode 100644
index 00000000000..93560797fc4
--- /dev/null
+++ b/gawk-5.0.1/doc/it/api-figura1.eps
@@ -0,0 +1,536 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: api-figura1.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5e
+%%CreationDate: Wed Jun 29 10:59:41 2016
+%%BoundingBox: 0 0 356 221
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/MyAppDict 100 dict dup begin def
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+% This junk string is used by the show operators
+/PATsstr 1 string def
+/PATawidthshow { 	% cx cy cchar rx ry string
+  % Loop over each character in the string
+  {  % cx cy cchar rx ry char
+    % Show the character
+    dup				% cx cy cchar rx ry char char
+    PATsstr dup 0 4 -1 roll put	% cx cy cchar rx ry char (char)
+    false charpath		% cx cy cchar rx ry char
+    /clip load PATdraw
+    % Move past the character (charpath modified the
+    % current point)
+    currentpoint			% cx cy cchar rx ry char x y
+    newpath
+    moveto			% cx cy cchar rx ry char
+    % Reposition by cx,cy if the character in the string is cchar
+    3 index eq {			% cx cy cchar rx ry
+      4 index 4 index rmoveto
+    } if
+    % Reposition all characters by rx ry
+    2 copy rmoveto		% cx cy cchar rx ry
+  } forall
+  pop pop pop pop pop		% -
+  currentpoint
+  newpath
+  moveto
+} bind def
+/PATcg {
+  7 dict dup begin
+    /lw currentlinewidth def
+    /lc currentlinecap def
+    /lj currentlinejoin def
+    /ml currentmiterlimit def
+    /ds [ currentdash ] def
+    /cc [ currentrgbcolor ] def
+    /cm matrix currentmatrix def
+  end
+} bind def
+% PATdraw - calculates the boundaries of the object and
+% fills it with the current pattern
+/PATdraw {			% proc
+  save exch
+    PATpcalc			% proc nw nh px py
+    5 -1 roll exec		% nw nh px py
+    newpath
+    PATfill			% -
+  restore
+} bind def
+% PATfill - performs the tiling for the shape
+/PATfill { % nw nh px py PATfill -
+  PATDict /CurrentPattern get dup begin
+    setfont
+    % Set the coordinate system to Pattern Space
+    PatternGState PATsg
+    % Set the color for uncolored pattezns
+    PaintType 2 eq { PATDict /PColor get PATsc } if
+    % Create the string for showing
+    3 index string		% nw nh px py str
+    % Loop for each of the pattern sources
+    0 1 Multi 1 sub {		% nw nh px py str source
+	% Move to the starting location
+	3 index 3 index		% nw nh px py str source px py
+	moveto			% nw nh px py str source
+	% For multiple sources, set the appropriate color
+	Multi 1 ne { dup PC exch get PATsc } if
+	% Set the appropriate string for the source
+	0 1 7 index 1 sub { 2 index exch 2 index put } for pop
+	% Loop over the number of vertical cells
+	3 index 		% nw nh px py str nh
+	{			% nw nh px py str
+	  currentpoint		% nw nh px py str cx cy
+	  2 index oldshow	% nw nh px py str cx cy
+	  YStep add moveto	% nw nh px py str
+	} repeat		% nw nh px py str
+    } for
+    5 { pop } repeat
+  end
+} bind def
+
+% PATkshow - kshow with the current pattezn
+/PATkshow {			% proc string
+  exch bind			% string proc
+  1 index 0 get			% string proc char
+  % Loop over all but the last character in the string
+  0 1 4 index length 2 sub {
+				% string proc char idx
+    % Find the n+1th character in the string
+    3 index exch 1 add get	% string proc char char+1
+    exch 2 copy			% strinq proc char+1 char char+1 char
+    % Now show the nth character
+    PATsstr dup 0 4 -1 roll put	% string proc chr+1 chr chr+1 (chr)
+    false charpath		% string proc char+1 char char+1
+    /clip load PATdraw
+    % Move past the character (charpath modified the current point)
+    currentpoint newpath moveto
+    % Execute the user proc (should consume char and char+1)
+    mark 3 1 roll		% string proc char+1 mark char char+1
+    4 index exec		% string proc char+1 mark...
+    cleartomark			% string proc char+1
+  } for
+  % Now display the last character
+  PATsstr dup 0 4 -1 roll put	% string proc (char+1)
+  false charpath		% string proc
+  /clip load PATdraw
+  neewath
+  pop pop			% -
+} bind def
+% PATmp - the makepattern equivalent
+/PATmp {			% patdict patmtx PATmp patinstance
+  exch dup length 7 add		% We will add 6 new entries plus 1 FID
+  dict copy			% Create a new dictionary
+  begin
+    % Matrix to install when painting the pattern
+    TilingType PATtcalc
+    /PatternGState PATcg def
+    PatternGState /cm 3 -1 roll put
+    % Check for multi pattern sources (Level 1 fast color patterns)
+    currentdict /Multi known not { /Multi 1 def } if
+    % Font dictionary definitions
+    /FontType 3 def
+    % Create a dummy encoding vector
+    /Encoding 256 array def
+    3 string 0 1 255 {
+      Encoding exch dup 3 index cvs cvn put } for pop
+    /FontMatrix matrix def
+    /FontBBox BBox def
+    /BuildChar {
+	mark 3 1 roll		% mark dict char
+	exch begin
+	Multi 1 ne {PaintData exch get}{pop} ifelse  % mark [paintdata]
+	  PaintType 2 eq Multi 1 ne or
+	  { XStep 0 FontBBox aload pop setcachedevice }
+	  { XStep 0 setcharwidth } ifelse
+	  currentdict		% mark [paintdata] dict
+	  /PaintProc load	% mark [paintdata] dict paintproc
+	end
+	gsave
+	  false PATredef exec true PATredef
+	grestore
+	cleartomark		% -
+    } bind def
+    currentdict
+  end				% newdict
+  /foo exch			% /foo newlict
+  definefont			% newfont
+} bind def
+% PATpcalc - calculates the starting point and width/height
+% of the tile fill for the shape
+/PATpcalc {	% - PATpcalc nw nh px py
+  PATDict /CurrentPattern get begin
+    gsave
+	% Set up the coordinate system to Pattern Space
+	% and lock down pattern
+	PatternGState /cm get setmatrix
+	BBox aload pop pop pop translate
+	% Determine the bounding box of the shape
+	pathbbox			% llx lly urx ury
+    grestore
+    % Determine (nw, nh) the # of cells to paint width and height
+    PatHeight div ceiling		% llx lly urx qh
+    4 1 roll				% qh llx lly urx
+    PatWidth div ceiling		% qh llx lly qw
+    4 1 roll				% qw qh llx lly
+    PatHeight div floor			% qw qh llx ph
+    4 1 roll				% ph qw qh llx
+    PatWidth div floor			% ph qw qh pw
+    4 1 roll				% pw ph qw qh
+    2 index sub cvi abs			% pw ph qs qh-ph
+    exch 3 index sub cvi abs exch	% pw ph nw=qw-pw nh=qh-ph
+    % Determine the starting point of the pattern fill
+    %(px, py)
+    4 2 roll				% nw nh pw ph
+    PatHeight mul			% nw nh pw py
+    exch				% nw nh py pw
+    PatWidth mul exch			% nw nh px py
+  end
+} bind def
+
+% Save the original routines so that we can use them later on
+/oldfill	/fill load def
+/oldeofill	/eofill load def
+/oldstroke	/stroke load def
+/oldshow	/show load def
+/oldashow	/ashow load def
+/oldwidthshow	/widthshow load def
+/oldawidthshow	/awidthshow load def
+/oldkshow	/kshow load def
+
+% These defs are necessary so that subsequent procs don't bind in
+% the originals
+/fill	   { oldfill } bind def
+/eofill	   { oldeofill } bind def
+/stroke	   { oldstroke } bind def
+/show	   { oldshow } bind def
+/ashow	   { oldashow } bind def
+/widthshow { oldwidthshow } bind def
+/awidthshow { oldawidthshow } bind def
+/kshow 	   { oldkshow } bind def
+/PATredef {
+  MyAppDict begin
+    {
+    /fill { /clip load PATdraw newpath } bind def
+    /eofill { /eoclip load PATdraw newpath } bind def
+    /stroke { PATstroke } bind def
+    /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def
+    /ashow { 0 0 null 6 3 roll PATawidthshow }
+    bind def
+    /widthshow { 0 0 3 -1 roll PATawidthshow }
+    bind def
+    /awidthshow { PATawidthshow } bind def
+    /kshow { PATkshow } bind def
+  } {
+    /fill   { oldfill } bind def
+    /eofill { oldeofill } bind def
+    /stroke { oldstroke } bind def
+    /show   { oldshow } bind def
+    /ashow  { oldashow } bind def
+    /widthshow { oldwidthshow } bind def
+    /awidthshow { oldawidthshow } bind def
+    /kshow  { oldkshow } bind def
+    } ifelse
+  end
+} bind def
+false PATredef
+% Conditionally define setcmykcolor if not available
+/setcmykcolor where { pop } {
+  /setcmykcolor {
+    1 sub 4 1 roll
+    3 {
+	3 index add neg dup 0 lt { pop 0 } if 3 1 roll
+    } repeat
+    setrgbcolor - pop
+  } bind def
+} ifelse
+/PATsc {		% colorarray
+  aload length		% c1 ... cn length
+    dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor
+  } ifelse } ifelse
+} bind def
+/PATsg {		% dict
+  begin
+    lw setlinewidth
+    lc setlinecap
+    lj setlinejoin
+    ml setmiterlimit
+    ds aload pop setdash
+    cc aload pop setrgbcolor
+    cm setmatrix
+  end
+} bind def
+
+/PATDict 3 dict def
+/PATsp {
+  true PATredef
+  PATDict begin
+    /CurrentPattern exch def
+    % If it's an uncolored pattern, save the color
+    CurrentPattern /PaintType get 2 eq {
+      /PColor exch def
+    } if
+    /CColor [ currentrgbcolor ] def
+  end
+} bind def
+% PATstroke - stroke with the current pattern
+/PATstroke {
+  countdictstack
+  save
+  mark
+  {
+    currentpoint strokepath moveto
+    PATpcalc				% proc nw nh px py
+    clip newpath PATfill
+    } stopped {
+	(*** PATstroke Warning: Path is too complex, stroking
+	  with gray) =
+    cleartomark
+    restore
+    countdictstack exch sub dup 0 gt
+	{ { end } repeat } { pop } ifelse
+    gsave 0.5 setgray oldstroke grestore
+  } { pop restore pop } ifelse
+  newpath
+} bind def
+/PATtcalc {		% modmtx tilingtype PATtcalc tilematrix
+  % Note: tiling types 2 and 3 are not supported
+  gsave
+    exch concat					% tilingtype
+    matrix currentmatrix exch			% cmtx tilingtype
+    % Tiling type 1 and 3: constant spacing
+    2 ne {
+	% Distort the pattern so that it occupies
+	% an integral number of device pixels
+	dup 4 get exch dup 5 get exch		% tx ty cmtx
+	XStep 0 dtransform
+	round exch round exch			% tx ty cmtx dx.x dx.y
+	XStep div exch XStep div exch		% tx ty cmtx a b
+	0 YStep dtransform
+	round exch round exch			% tx ty cmtx a b dy.x dy.y
+	YStep div exch YStep div exch		% tx ty cmtx a b c d
+	7 -3 roll astore			% { a b c d tx ty }
+    } if
+  grestore
+} bind def
+/PATusp {
+  false PATredef
+  PATDict begin
+    CColor PATsc
+  end
+} bind def
+
+% right30
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 32 16 true [ 32 0 0 -16 0 16 ]
+	{<00030003000c000c0030003000c000c0030003000c000c00
+	30003000c000c00000030003000c000c0030003000c000c0
+	030003000c000c0030003000c000c000>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P2 exch def
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 221 moveto 0 0 lineto 356 0 lineto 356 221 lineto closepath clip newpath
+-194.8 344.2 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Arc
+7.500 slw
+0 slc
+gs  clippath
+3599 4000 m 3567 4148 l 3626 4161 l 3658 4013 l 3658 4013 l 3603 4124 l 3599 4000 l cp
+eoclip
+n 5449.3 4471.5 1878.7 -70.5453 -169.8379 arcn
+gs col0 s gr
+ gr
+
+% arrowhead
+0 slj
+n 3599 4000 m 3603 4124 l 3658 4013 l 3599 4000 l  cp gs 0.00 setgray ef gr  col0 s
+% Arc
+gs  clippath
+4422 4004 m 4425 4155 l 4485 4154 l 4482 4003 l 4482 4003 l 4455 4124 l 4422 4004 l cp
+eoclip
+n 5539.0 4051.3 1087.6 -60.4713 175.3232 arcn
+gs col0 s gr
+ gr
+
+% arrowhead
+n 4422 4004 m 4455 4124 l 4482 4003 l 4422 4004 l  cp gs 0.00 setgray ef gr  col0 s
+% Arc
+gs  clippath
+4986 4010 m 5012 4159 l 5072 4149 l 5046 4000 l 5046 4000 l 5037 4124 l 4986 4010 l cp
+eoclip
+n 5628.8 3967.5 613.5 -36.7999 163.6698 arcn
+gs col0 s gr
+ gr
+
+% arrowhead
+n 4986 4010 m 5037 4124 l 5046 4000 l 4986 4010 l  cp gs 0.00 setgray ef gr  col0 s
+% Arc
+135.000 slw
+gs  clippath
+7736 3835 m 7756 3984 l 7907 3964 l 7887 3814 l 7841 3821 l 7828 3944 l 7782 3829 l cp
+eoclip
+n 6609.1 4056.9 1224.8 -93.9364 -4.5364 arc
+gs col0 s gr
+ gr
+
+% arrowhead
+7.500 slw
+n 7782 3829 m 7828 3944 l 7841 3821 l  col0 s
+% Polyline
+n 3105 4140 m 6660 4140 l 6660 5085 l 3105 5085 l
+ cp gs col0 s gr 
+% Polyline
+n 6660 4140 m 8730 4140 l 8730 5085 l 6660 5085 l
+ cp gs col7 0.50 shd ef gr gs col0 s gr 
+% Polyline
+n 5805 2610 m 6345 2610 l 6345 3690 l 5805 3690 l
+ cp gs col0 s gr 
+% Polyline
+n 5805 2835 m 6345 2835 l 6345 3015 l 5805 3015 l
+ cp gs col0 s gr 
+% Polyline
+n 5805 3195 m 6345 3195 l 6345 3375 l 5805 3375 l
+ cp gs col0 s gr 
+% Polyline
+n 5805 3510 m 6345 3510 l 6345 3690 l 5805 3690 l
+ cp gs col0 s gr 
+% Polyline
+n 3510 4140 m 3780 4140 l 3780 5085 l 3510 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 234.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4365 4140 m 4635 4140 l 4635 5085 l 4365 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 291.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4905 4140 m 5265 4140 l 5265 5085 l 4905 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 327.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+/Times-Roman ff 190.50 scf sf
+5985 2115 m
+gs 1 -1 sc (API) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+5895 2340 m
+gs 1 -1 sc (Struct) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+7020 5400 m
+gs 1 -1 sc (   Estensione) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+6525 2655 m
+gs 1 -1 sc (dl_load\(api_p, id\);) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+3195 5400 m
+gs 1 -1 sc (Memoria indirizzabile programma gawk) col0 sh gr
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+end
+%EOF
diff --git a/gawk-5.0.1/doc/it/api-figura1.fig b/gawk-5.0.1/doc/it/api-figura1.fig
new file mode 100644
index 00000000000..c2718c71c2e
--- /dev/null
+++ b/gawk-5.0.1/doc/it/api-figura1.fig
@@ -0,0 +1,40 @@
+#FIG 3.2  Produced by xfig version 3.2.5c
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5449.265 4471.471 6075 2700 4320 2970 3600 4140
+	1 1 1.00 60.00 120.00
+5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5538.971 4051.323 6075 3105 4725 3330 4455 4140
+	1 1 1.00 60.00 120.00
+5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5628.750 3967.500 6120 3600 5220 3510 5040 4140
+	1 1 1.00 60.00 120.00
+5 1 0 10 0 7 50 -1 -1 0.000 0 0 1 0 6609.079 4056.868 6525 2835 7560 3285 7830 3960
+	0 0 1.00 60.00 120.00
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3105 4140 6660 4140 6660 5085 3105 5085 3105 4140
+2 2 0 1 0 7 50 -1 10 0.000 0 0 -1 0 0 5
+	 6660 4140 8730 4140 8730 5085 6660 5085 6660 4140
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5805 2610 6345 2610 6345 3690 5805 3690 5805 2610
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5805 2835 6345 2835 6345 3015 5805 3015 5805 2835
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5805 3195 6345 3195 6345 3375 5805 3375 5805 3195
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 5805 3510 6345 3510 6345 3690 5805 3690 5805 3510
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 3510 4140 3780 4140 3780 5085 3510 5085 3510 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4365 4140 4635 4140 4635 5085 4365 5085 4365 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4905 4140 5265 4140 5265 5085 4905 5085 4905 4140
+4 0 0 50 -1 0 12 0.0000 4 135 270 5985 2115 API\001
+4 0 0 50 -1 0 12 0.0000 4 135 540 5895 2340 Struct\001
+4 0 0 50 -1 0 12 0.0000 4 135 1170 7020 5400    Estensione\001
+4 0 0 50 -1 0 12 0.0000 4 180 1710 6525 2655 dl_load(api_p, id);\001
+4 0 0 50 -1 0 12 0.0000 4 165 3240 3195 5400 Memoria indirizzabile programma gawk\001
diff --git a/gawk-5.0.1/doc/it/api-figura1.pdf b/gawk-5.0.1/doc/it/api-figura1.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f31e25a87bc774050b37fd0f4484ef95e1367303
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/api-figura1.png b/gawk-5.0.1/doc/it/api-figura1.png
new file mode 100644
index 0000000000000000000000000000000000000000..444c29767e6fc002ec8dcb283624f326f79841d3
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/api-figura1.txt b/gawk-5.0.1/doc/it/api-figura1.txt
new file mode 100644
index 00000000000..630e18f0c73
--- /dev/null
+++ b/gawk-5.0.1/doc/it/api-figura1.txt
@@ -0,0 +1,24 @@
+                   Struct (Struttura)
+                          API
+                         +---+
+                         |   |
+                         +---+
+         +---------------|   |
+         |               +---+      dl_load(api_p, id);
+         |               |   |  ___________________ 
+         |               +---+                     |
+         |     +---------|   |  __________________ |
+         |     |         +---+                    ||
+         |     |         |   |                    ||
+         |     |         +---+                    ||
+         |     |     +---|   |                    ||
+         |     |     |   +---+                  \ || /
+         |     |     |                           \  /
+         v     v     v                            \/
++-------+-+---+-+---+-+------------------+--------------------+
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOOOOOOOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOOOOOOOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOOOOOOOO|
++-------+-+---+-+---+-+------------------+--------------------+
+
+   Memoria indirizzabile programma gawk        Estensione
diff --git a/gawk-5.0.1/doc/it/api-figura2.eps b/gawk-5.0.1/doc/it/api-figura2.eps
new file mode 100644
index 00000000000..9920d3b9042
--- /dev/null
+++ b/gawk-5.0.1/doc/it/api-figura2.eps
@@ -0,0 +1,517 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: api-figura2.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5e
+%%CreationDate: Wed Jun 29 11:02:52 2016
+%%BoundingBox: 0 0 356 173
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/MyAppDict 100 dict dup begin def
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+% This junk string is used by the show operators
+/PATsstr 1 string def
+/PATawidthshow { 	% cx cy cchar rx ry string
+  % Loop over each character in the string
+  {  % cx cy cchar rx ry char
+    % Show the character
+    dup				% cx cy cchar rx ry char char
+    PATsstr dup 0 4 -1 roll put	% cx cy cchar rx ry char (char)
+    false charpath		% cx cy cchar rx ry char
+    /clip load PATdraw
+    % Move past the character (charpath modified the
+    % current point)
+    currentpoint			% cx cy cchar rx ry char x y
+    newpath
+    moveto			% cx cy cchar rx ry char
+    % Reposition by cx,cy if the character in the string is cchar
+    3 index eq {			% cx cy cchar rx ry
+      4 index 4 index rmoveto
+    } if
+    % Reposition all characters by rx ry
+    2 copy rmoveto		% cx cy cchar rx ry
+  } forall
+  pop pop pop pop pop		% -
+  currentpoint
+  newpath
+  moveto
+} bind def
+/PATcg {
+  7 dict dup begin
+    /lw currentlinewidth def
+    /lc currentlinecap def
+    /lj currentlinejoin def
+    /ml currentmiterlimit def
+    /ds [ currentdash ] def
+    /cc [ currentrgbcolor ] def
+    /cm matrix currentmatrix def
+  end
+} bind def
+% PATdraw - calculates the boundaries of the object and
+% fills it with the current pattern
+/PATdraw {			% proc
+  save exch
+    PATpcalc			% proc nw nh px py
+    5 -1 roll exec		% nw nh px py
+    newpath
+    PATfill			% -
+  restore
+} bind def
+% PATfill - performs the tiling for the shape
+/PATfill { % nw nh px py PATfill -
+  PATDict /CurrentPattern get dup begin
+    setfont
+    % Set the coordinate system to Pattern Space
+    PatternGState PATsg
+    % Set the color for uncolored pattezns
+    PaintType 2 eq { PATDict /PColor get PATsc } if
+    % Create the string for showing
+    3 index string		% nw nh px py str
+    % Loop for each of the pattern sources
+    0 1 Multi 1 sub {		% nw nh px py str source
+	% Move to the starting location
+	3 index 3 index		% nw nh px py str source px py
+	moveto			% nw nh px py str source
+	% For multiple sources, set the appropriate color
+	Multi 1 ne { dup PC exch get PATsc } if
+	% Set the appropriate string for the source
+	0 1 7 index 1 sub { 2 index exch 2 index put } for pop
+	% Loop over the number of vertical cells
+	3 index 		% nw nh px py str nh
+	{			% nw nh px py str
+	  currentpoint		% nw nh px py str cx cy
+	  2 index oldshow	% nw nh px py str cx cy
+	  YStep add moveto	% nw nh px py str
+	} repeat		% nw nh px py str
+    } for
+    5 { pop } repeat
+  end
+} bind def
+
+% PATkshow - kshow with the current pattezn
+/PATkshow {			% proc string
+  exch bind			% string proc
+  1 index 0 get			% string proc char
+  % Loop over all but the last character in the string
+  0 1 4 index length 2 sub {
+				% string proc char idx
+    % Find the n+1th character in the string
+    3 index exch 1 add get	% string proc char char+1
+    exch 2 copy			% strinq proc char+1 char char+1 char
+    % Now show the nth character
+    PATsstr dup 0 4 -1 roll put	% string proc chr+1 chr chr+1 (chr)
+    false charpath		% string proc char+1 char char+1
+    /clip load PATdraw
+    % Move past the character (charpath modified the current point)
+    currentpoint newpath moveto
+    % Execute the user proc (should consume char and char+1)
+    mark 3 1 roll		% string proc char+1 mark char char+1
+    4 index exec		% string proc char+1 mark...
+    cleartomark			% string proc char+1
+  } for
+  % Now display the last character
+  PATsstr dup 0 4 -1 roll put	% string proc (char+1)
+  false charpath		% string proc
+  /clip load PATdraw
+  neewath
+  pop pop			% -
+} bind def
+% PATmp - the makepattern equivalent
+/PATmp {			% patdict patmtx PATmp patinstance
+  exch dup length 7 add		% We will add 6 new entries plus 1 FID
+  dict copy			% Create a new dictionary
+  begin
+    % Matrix to install when painting the pattern
+    TilingType PATtcalc
+    /PatternGState PATcg def
+    PatternGState /cm 3 -1 roll put
+    % Check for multi pattern sources (Level 1 fast color patterns)
+    currentdict /Multi known not { /Multi 1 def } if
+    % Font dictionary definitions
+    /FontType 3 def
+    % Create a dummy encoding vector
+    /Encoding 256 array def
+    3 string 0 1 255 {
+      Encoding exch dup 3 index cvs cvn put } for pop
+    /FontMatrix matrix def
+    /FontBBox BBox def
+    /BuildChar {
+	mark 3 1 roll		% mark dict char
+	exch begin
+	Multi 1 ne {PaintData exch get}{pop} ifelse  % mark [paintdata]
+	  PaintType 2 eq Multi 1 ne or
+	  { XStep 0 FontBBox aload pop setcachedevice }
+	  { XStep 0 setcharwidth } ifelse
+	  currentdict		% mark [paintdata] dict
+	  /PaintProc load	% mark [paintdata] dict paintproc
+	end
+	gsave
+	  false PATredef exec true PATredef
+	grestore
+	cleartomark		% -
+    } bind def
+    currentdict
+  end				% newdict
+  /foo exch			% /foo newlict
+  definefont			% newfont
+} bind def
+% PATpcalc - calculates the starting point and width/height
+% of the tile fill for the shape
+/PATpcalc {	% - PATpcalc nw nh px py
+  PATDict /CurrentPattern get begin
+    gsave
+	% Set up the coordinate system to Pattern Space
+	% and lock down pattern
+	PatternGState /cm get setmatrix
+	BBox aload pop pop pop translate
+	% Determine the bounding box of the shape
+	pathbbox			% llx lly urx ury
+    grestore
+    % Determine (nw, nh) the # of cells to paint width and height
+    PatHeight div ceiling		% llx lly urx qh
+    4 1 roll				% qh llx lly urx
+    PatWidth div ceiling		% qh llx lly qw
+    4 1 roll				% qw qh llx lly
+    PatHeight div floor			% qw qh llx ph
+    4 1 roll				% ph qw qh llx
+    PatWidth div floor			% ph qw qh pw
+    4 1 roll				% pw ph qw qh
+    2 index sub cvi abs			% pw ph qs qh-ph
+    exch 3 index sub cvi abs exch	% pw ph nw=qw-pw nh=qh-ph
+    % Determine the starting point of the pattern fill
+    %(px, py)
+    4 2 roll				% nw nh pw ph
+    PatHeight mul			% nw nh pw py
+    exch				% nw nh py pw
+    PatWidth mul exch			% nw nh px py
+  end
+} bind def
+
+% Save the original routines so that we can use them later on
+/oldfill	/fill load def
+/oldeofill	/eofill load def
+/oldstroke	/stroke load def
+/oldshow	/show load def
+/oldashow	/ashow load def
+/oldwidthshow	/widthshow load def
+/oldawidthshow	/awidthshow load def
+/oldkshow	/kshow load def
+
+% These defs are necessary so that subsequent procs don't bind in
+% the originals
+/fill	   { oldfill } bind def
+/eofill	   { oldeofill } bind def
+/stroke	   { oldstroke } bind def
+/show	   { oldshow } bind def
+/ashow	   { oldashow } bind def
+/widthshow { oldwidthshow } bind def
+/awidthshow { oldawidthshow } bind def
+/kshow 	   { oldkshow } bind def
+/PATredef {
+  MyAppDict begin
+    {
+    /fill { /clip load PATdraw newpath } bind def
+    /eofill { /eoclip load PATdraw newpath } bind def
+    /stroke { PATstroke } bind def
+    /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def
+    /ashow { 0 0 null 6 3 roll PATawidthshow }
+    bind def
+    /widthshow { 0 0 3 -1 roll PATawidthshow }
+    bind def
+    /awidthshow { PATawidthshow } bind def
+    /kshow { PATkshow } bind def
+  } {
+    /fill   { oldfill } bind def
+    /eofill { oldeofill } bind def
+    /stroke { oldstroke } bind def
+    /show   { oldshow } bind def
+    /ashow  { oldashow } bind def
+    /widthshow { oldwidthshow } bind def
+    /awidthshow { oldawidthshow } bind def
+    /kshow  { oldkshow } bind def
+    } ifelse
+  end
+} bind def
+false PATredef
+% Conditionally define setcmykcolor if not available
+/setcmykcolor where { pop } {
+  /setcmykcolor {
+    1 sub 4 1 roll
+    3 {
+	3 index add neg dup 0 lt { pop 0 } if 3 1 roll
+    } repeat
+    setrgbcolor - pop
+  } bind def
+} ifelse
+/PATsc {		% colorarray
+  aload length		% c1 ... cn length
+    dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor
+  } ifelse } ifelse
+} bind def
+/PATsg {		% dict
+  begin
+    lw setlinewidth
+    lc setlinecap
+    lj setlinejoin
+    ml setmiterlimit
+    ds aload pop setdash
+    cc aload pop setrgbcolor
+    cm setmatrix
+  end
+} bind def
+
+/PATDict 3 dict def
+/PATsp {
+  true PATredef
+  PATDict begin
+    /CurrentPattern exch def
+    % If it's an uncolored pattern, save the color
+    CurrentPattern /PaintType get 2 eq {
+      /PColor exch def
+    } if
+    /CColor [ currentrgbcolor ] def
+  end
+} bind def
+% PATstroke - stroke with the current pattern
+/PATstroke {
+  countdictstack
+  save
+  mark
+  {
+    currentpoint strokepath moveto
+    PATpcalc				% proc nw nh px py
+    clip newpath PATfill
+    } stopped {
+	(*** PATstroke Warning: Path is too complex, stroking
+	  with gray) =
+    cleartomark
+    restore
+    countdictstack exch sub dup 0 gt
+	{ { end } repeat } { pop } ifelse
+    gsave 0.5 setgray oldstroke grestore
+  } { pop restore pop } ifelse
+  newpath
+} bind def
+/PATtcalc {		% modmtx tilingtype PATtcalc tilematrix
+  % Note: tiling types 2 and 3 are not supported
+  gsave
+    exch concat					% tilingtype
+    matrix currentmatrix exch			% cmtx tilingtype
+    % Tiling type 1 and 3: constant spacing
+    2 ne {
+	% Distort the pattern so that it occupies
+	% an integral number of device pixels
+	dup 4 get exch dup 5 get exch		% tx ty cmtx
+	XStep 0 dtransform
+	round exch round exch			% tx ty cmtx dx.x dx.y
+	XStep div exch XStep div exch		% tx ty cmtx a b
+	0 YStep dtransform
+	round exch round exch			% tx ty cmtx a b dy.x dy.y
+	YStep div exch YStep div exch		% tx ty cmtx a b c d
+	7 -3 roll astore			% { a b c d tx ty }
+    } if
+  grestore
+} bind def
+/PATusp {
+  false PATredef
+  PATDict begin
+    CColor PATsc
+  end
+} bind def
+
+% right30
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 32 16 true [ 32 0 0 -16 0 16 ]
+	{<00030003000c000c0030003000c000c0030003000c000c00
+	30003000c000c00000030003000c000c0030003000c000c0
+	030003000c000c0030003000c000c000>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P2 exch def
+
+% crosshatch45
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 20 20 true [ 20 0 0 -20 0 20 ]
+	{<8020004050102088201104400a02800401000a02
+	8011044020882040501080200040501020882011
+	04400a02800401000a0280110440208820405010>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P6 exch def
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 173 moveto 0 0 lineto 356 0 lineto 356 173 lineto closepath clip newpath
+-194.8 344.2 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Arc
+7.500 slw
+0 slc
+gs  clippath
+3662 4014 m 3567 4132 l 3613 4170 l 3708 4052 l 3708 4052 l 3610 4127 l 3662 4014 l cp
+eoclip
+n 5895.0 5917.5 2902.8 -37.7581 -142.2419 arcn
+gs col0 s gr
+ gr
+
+% arrowhead
+0 slj
+n 3662 4014 m 3610 4127 l 3708 4052 l 3662 4014 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 3105 4140 m 6660 4140 l 6660 5085 l 3105 5085 l
+ cp gs col0 s gr 
+% Polyline
+n 6660 4140 m 8730 4140 l 8730 5085 l 6660 5085 l
+ cp gs col7 0.50 shd ef gr gs col0 s gr 
+% Polyline
+n 3510 4140 m 3780 4140 l 3780 5085 l 3510 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 234.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4365 4140 m 4635 4140 l 4635 5085 l 4365 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 291.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4905 4140 m 5265 4140 l 5265 5085 l 4905 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 327.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7965 4140 m 8370 4140 l 8370 5085 l 7965 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 531.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+/Courier-Bold ff 190.50 scf sf
+3420 2880 m
+gs 1 -1 sc (register_ext_func\({ "chdir", do_chdir, 1 }\);) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+6840 5400 m
+gs 1 -1 sc (    Estensione) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+3195 5400 m
+gs 1 -1 sc (Memoria indirizzabile programma gawk) col0 sh gr
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+end
+%EOF
diff --git a/gawk-5.0.1/doc/it/api-figura2.fig b/gawk-5.0.1/doc/it/api-figura2.fig
new file mode 100644
index 00000000000..a8b5c47de40
--- /dev/null
+++ b/gawk-5.0.1/doc/it/api-figura2.fig
@@ -0,0 +1,26 @@
+#FIG 3.2  Produced by xfig version 3.2.5c
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 7 50 -1 -1 0.000 0 1 1 0 5895.000 5917.500 8190 4140 5940 3015 3600 4140
+	1 1 1.00 60.00 120.00
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3105 4140 6660 4140 6660 5085 3105 5085 3105 4140
+2 2 0 1 0 7 50 -1 10 0.000 0 0 -1 0 0 5
+	 6660 4140 8730 4140 8730 5085 6660 5085 6660 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 3510 4140 3780 4140 3780 5085 3510 5085 3510 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4365 4140 4635 4140 4635 5085 4365 5085 4365 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4905 4140 5265 4140 5265 5085 4905 5085 4905 4140
+2 2 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 5
+	 7965 4140 8370 4140 8370 5085 7965 5085 7965 4140
+4 0 0 50 -1 14 12 0.0000 4 180 3960 3420 2880 register_ext_func({ "chdir", do_chdir, 1 });\001
+4 0 0 50 -1 0 12 0.0000 4 135 1260 6840 5400     Estensione\001
+4 0 0 50 -1 0 12 0.0000 4 165 3240 3195 5400 Memoria indirizzabile programma gawk\001
diff --git a/gawk-5.0.1/doc/it/api-figura2.pdf b/gawk-5.0.1/doc/it/api-figura2.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..cadd4267171ee57ea97dcccbc10f68647062fba6
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/api-figura2.png b/gawk-5.0.1/doc/it/api-figura2.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbc46910737437ef4fdcbb9db4d6aa3e00b0374b
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/api-figura2.txt b/gawk-5.0.1/doc/it/api-figura2.txt
new file mode 100644
index 00000000000..a030fb5a25e
--- /dev/null
+++ b/gawk-5.0.1/doc/it/api-figura2.txt
@@ -0,0 +1,12 @@
+            register_ext_func({ "chdir", do_chdir, 1 });
+
+            +--------------------------------------------+
+            |                                            |
+            V                                            |
++-------+-+---+-+---+-+------------------+--------------+-+---+
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
++-------+-+---+-+---+-+------------------+--------------+-+---+
+
+   Memoria indirizzabile programma gawk        Estensione
diff --git a/gawk-5.0.1/doc/it/api-figura3.eps b/gawk-5.0.1/doc/it/api-figura3.eps
new file mode 100644
index 00000000000..daa3ba76b90
--- /dev/null
+++ b/gawk-5.0.1/doc/it/api-figura3.eps
@@ -0,0 +1,526 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: api-figura3.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5e
+%%CreationDate: Wed Jun 29 11:05:29 2016
+%%BoundingBox: 0 0 356 170
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/MyAppDict 100 dict dup begin def
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+% This junk string is used by the show operators
+/PATsstr 1 string def
+/PATawidthshow { 	% cx cy cchar rx ry string
+  % Loop over each character in the string
+  {  % cx cy cchar rx ry char
+    % Show the character
+    dup				% cx cy cchar rx ry char char
+    PATsstr dup 0 4 -1 roll put	% cx cy cchar rx ry char (char)
+    false charpath		% cx cy cchar rx ry char
+    /clip load PATdraw
+    % Move past the character (charpath modified the
+    % current point)
+    currentpoint			% cx cy cchar rx ry char x y
+    newpath
+    moveto			% cx cy cchar rx ry char
+    % Reposition by cx,cy if the character in the string is cchar
+    3 index eq {			% cx cy cchar rx ry
+      4 index 4 index rmoveto
+    } if
+    % Reposition all characters by rx ry
+    2 copy rmoveto		% cx cy cchar rx ry
+  } forall
+  pop pop pop pop pop		% -
+  currentpoint
+  newpath
+  moveto
+} bind def
+/PATcg {
+  7 dict dup begin
+    /lw currentlinewidth def
+    /lc currentlinecap def
+    /lj currentlinejoin def
+    /ml currentmiterlimit def
+    /ds [ currentdash ] def
+    /cc [ currentrgbcolor ] def
+    /cm matrix currentmatrix def
+  end
+} bind def
+% PATdraw - calculates the boundaries of the object and
+% fills it with the current pattern
+/PATdraw {			% proc
+  save exch
+    PATpcalc			% proc nw nh px py
+    5 -1 roll exec		% nw nh px py
+    newpath
+    PATfill			% -
+  restore
+} bind def
+% PATfill - performs the tiling for the shape
+/PATfill { % nw nh px py PATfill -
+  PATDict /CurrentPattern get dup begin
+    setfont
+    % Set the coordinate system to Pattern Space
+    PatternGState PATsg
+    % Set the color for uncolored pattezns
+    PaintType 2 eq { PATDict /PColor get PATsc } if
+    % Create the string for showing
+    3 index string		% nw nh px py str
+    % Loop for each of the pattern sources
+    0 1 Multi 1 sub {		% nw nh px py str source
+	% Move to the starting location
+	3 index 3 index		% nw nh px py str source px py
+	moveto			% nw nh px py str source
+	% For multiple sources, set the appropriate color
+	Multi 1 ne { dup PC exch get PATsc } if
+	% Set the appropriate string for the source
+	0 1 7 index 1 sub { 2 index exch 2 index put } for pop
+	% Loop over the number of vertical cells
+	3 index 		% nw nh px py str nh
+	{			% nw nh px py str
+	  currentpoint		% nw nh px py str cx cy
+	  2 index oldshow	% nw nh px py str cx cy
+	  YStep add moveto	% nw nh px py str
+	} repeat		% nw nh px py str
+    } for
+    5 { pop } repeat
+  end
+} bind def
+
+% PATkshow - kshow with the current pattezn
+/PATkshow {			% proc string
+  exch bind			% string proc
+  1 index 0 get			% string proc char
+  % Loop over all but the last character in the string
+  0 1 4 index length 2 sub {
+				% string proc char idx
+    % Find the n+1th character in the string
+    3 index exch 1 add get	% string proc char char+1
+    exch 2 copy			% strinq proc char+1 char char+1 char
+    % Now show the nth character
+    PATsstr dup 0 4 -1 roll put	% string proc chr+1 chr chr+1 (chr)
+    false charpath		% string proc char+1 char char+1
+    /clip load PATdraw
+    % Move past the character (charpath modified the current point)
+    currentpoint newpath moveto
+    % Execute the user proc (should consume char and char+1)
+    mark 3 1 roll		% string proc char+1 mark char char+1
+    4 index exec		% string proc char+1 mark...
+    cleartomark			% string proc char+1
+  } for
+  % Now display the last character
+  PATsstr dup 0 4 -1 roll put	% string proc (char+1)
+  false charpath		% string proc
+  /clip load PATdraw
+  neewath
+  pop pop			% -
+} bind def
+% PATmp - the makepattern equivalent
+/PATmp {			% patdict patmtx PATmp patinstance
+  exch dup length 7 add		% We will add 6 new entries plus 1 FID
+  dict copy			% Create a new dictionary
+  begin
+    % Matrix to install when painting the pattern
+    TilingType PATtcalc
+    /PatternGState PATcg def
+    PatternGState /cm 3 -1 roll put
+    % Check for multi pattern sources (Level 1 fast color patterns)
+    currentdict /Multi known not { /Multi 1 def } if
+    % Font dictionary definitions
+    /FontType 3 def
+    % Create a dummy encoding vector
+    /Encoding 256 array def
+    3 string 0 1 255 {
+      Encoding exch dup 3 index cvs cvn put } for pop
+    /FontMatrix matrix def
+    /FontBBox BBox def
+    /BuildChar {
+	mark 3 1 roll		% mark dict char
+	exch begin
+	Multi 1 ne {PaintData exch get}{pop} ifelse  % mark [paintdata]
+	  PaintType 2 eq Multi 1 ne or
+	  { XStep 0 FontBBox aload pop setcachedevice }
+	  { XStep 0 setcharwidth } ifelse
+	  currentdict		% mark [paintdata] dict
+	  /PaintProc load	% mark [paintdata] dict paintproc
+	end
+	gsave
+	  false PATredef exec true PATredef
+	grestore
+	cleartomark		% -
+    } bind def
+    currentdict
+  end				% newdict
+  /foo exch			% /foo newlict
+  definefont			% newfont
+} bind def
+% PATpcalc - calculates the starting point and width/height
+% of the tile fill for the shape
+/PATpcalc {	% - PATpcalc nw nh px py
+  PATDict /CurrentPattern get begin
+    gsave
+	% Set up the coordinate system to Pattern Space
+	% and lock down pattern
+	PatternGState /cm get setmatrix
+	BBox aload pop pop pop translate
+	% Determine the bounding box of the shape
+	pathbbox			% llx lly urx ury
+    grestore
+    % Determine (nw, nh) the # of cells to paint width and height
+    PatHeight div ceiling		% llx lly urx qh
+    4 1 roll				% qh llx lly urx
+    PatWidth div ceiling		% qh llx lly qw
+    4 1 roll				% qw qh llx lly
+    PatHeight div floor			% qw qh llx ph
+    4 1 roll				% ph qw qh llx
+    PatWidth div floor			% ph qw qh pw
+    4 1 roll				% pw ph qw qh
+    2 index sub cvi abs			% pw ph qs qh-ph
+    exch 3 index sub cvi abs exch	% pw ph nw=qw-pw nh=qh-ph
+    % Determine the starting point of the pattern fill
+    %(px, py)
+    4 2 roll				% nw nh pw ph
+    PatHeight mul			% nw nh pw py
+    exch				% nw nh py pw
+    PatWidth mul exch			% nw nh px py
+  end
+} bind def
+
+% Save the original routines so that we can use them later on
+/oldfill	/fill load def
+/oldeofill	/eofill load def
+/oldstroke	/stroke load def
+/oldshow	/show load def
+/oldashow	/ashow load def
+/oldwidthshow	/widthshow load def
+/oldawidthshow	/awidthshow load def
+/oldkshow	/kshow load def
+
+% These defs are necessary so that subsequent procs don't bind in
+% the originals
+/fill	   { oldfill } bind def
+/eofill	   { oldeofill } bind def
+/stroke	   { oldstroke } bind def
+/show	   { oldshow } bind def
+/ashow	   { oldashow } bind def
+/widthshow { oldwidthshow } bind def
+/awidthshow { oldawidthshow } bind def
+/kshow 	   { oldkshow } bind def
+/PATredef {
+  MyAppDict begin
+    {
+    /fill { /clip load PATdraw newpath } bind def
+    /eofill { /eoclip load PATdraw newpath } bind def
+    /stroke { PATstroke } bind def
+    /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def
+    /ashow { 0 0 null 6 3 roll PATawidthshow }
+    bind def
+    /widthshow { 0 0 3 -1 roll PATawidthshow }
+    bind def
+    /awidthshow { PATawidthshow } bind def
+    /kshow { PATkshow } bind def
+  } {
+    /fill   { oldfill } bind def
+    /eofill { oldeofill } bind def
+    /stroke { oldstroke } bind def
+    /show   { oldshow } bind def
+    /ashow  { oldashow } bind def
+    /widthshow { oldwidthshow } bind def
+    /awidthshow { oldawidthshow } bind def
+    /kshow  { oldkshow } bind def
+    } ifelse
+  end
+} bind def
+false PATredef
+% Conditionally define setcmykcolor if not available
+/setcmykcolor where { pop } {
+  /setcmykcolor {
+    1 sub 4 1 roll
+    3 {
+	3 index add neg dup 0 lt { pop 0 } if 3 1 roll
+    } repeat
+    setrgbcolor - pop
+  } bind def
+} ifelse
+/PATsc {		% colorarray
+  aload length		% c1 ... cn length
+    dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor
+  } ifelse } ifelse
+} bind def
+/PATsg {		% dict
+  begin
+    lw setlinewidth
+    lc setlinecap
+    lj setlinejoin
+    ml setmiterlimit
+    ds aload pop setdash
+    cc aload pop setrgbcolor
+    cm setmatrix
+  end
+} bind def
+
+/PATDict 3 dict def
+/PATsp {
+  true PATredef
+  PATDict begin
+    /CurrentPattern exch def
+    % If it's an uncolored pattern, save the color
+    CurrentPattern /PaintType get 2 eq {
+      /PColor exch def
+    } if
+    /CColor [ currentrgbcolor ] def
+  end
+} bind def
+% PATstroke - stroke with the current pattern
+/PATstroke {
+  countdictstack
+  save
+  mark
+  {
+    currentpoint strokepath moveto
+    PATpcalc				% proc nw nh px py
+    clip newpath PATfill
+    } stopped {
+	(*** PATstroke Warning: Path is too complex, stroking
+	  with gray) =
+    cleartomark
+    restore
+    countdictstack exch sub dup 0 gt
+	{ { end } repeat } { pop } ifelse
+    gsave 0.5 setgray oldstroke grestore
+  } { pop restore pop } ifelse
+  newpath
+} bind def
+/PATtcalc {		% modmtx tilingtype PATtcalc tilematrix
+  % Note: tiling types 2 and 3 are not supported
+  gsave
+    exch concat					% tilingtype
+    matrix currentmatrix exch			% cmtx tilingtype
+    % Tiling type 1 and 3: constant spacing
+    2 ne {
+	% Distort the pattern so that it occupies
+	% an integral number of device pixels
+	dup 4 get exch dup 5 get exch		% tx ty cmtx
+	XStep 0 dtransform
+	round exch round exch			% tx ty cmtx dx.x dx.y
+	XStep div exch XStep div exch		% tx ty cmtx a b
+	0 YStep dtransform
+	round exch round exch			% tx ty cmtx a b dy.x dy.y
+	YStep div exch YStep div exch		% tx ty cmtx a b c d
+	7 -3 roll astore			% { a b c d tx ty }
+    } if
+  grestore
+} bind def
+/PATusp {
+  false PATredef
+  PATDict begin
+    CColor PATsc
+  end
+} bind def
+
+% right30
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 32 16 true [ 32 0 0 -16 0 16 ]
+	{<00030003000c000c0030003000c000c0030003000c000c00
+	30003000c000c00000030003000c000c0030003000c000c0
+	030003000c000c0030003000c000c000>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P2 exch def
+
+% crosshatch45
+11 dict begin
+/PaintType 1 def
+/PatternType 1 def
+/TilingType 1 def
+/BBox [0 0 1 1] def
+/XStep 1 def
+/YStep 1 def
+/PatWidth 1 def
+/PatHeight 1 def
+/Multi 2 def
+/PaintData [
+  { clippath } bind
+  { 20 20 true [ 20 0 0 -20 0 20 ]
+	{<8020004050102088201104400a02800401000a02
+	8011044020882040501080200040501020882011
+	04400a02800401000a0280110440208820405010>}
+     imagemask } bind
+] def
+/PaintProc {
+	pop
+	exec fill
+} def
+currentdict
+end
+/P6 exch def
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 170 moveto 0 0 lineto 356 0 lineto 356 170 lineto closepath clip newpath
+-194.8 344.2 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Arc
+7.500 slw
+0 slc
+gs  clippath
+8019 4079 m 8138 4172 l 8175 4125 l 8056 4032 l 8056 4032 l 8132 4130 l 8019 4079 l cp
+eoclip
+n 6120.0 6627.7 3207.7 -129.1463 -50.8537 arc
+gs col0 s gr
+ gr
+
+% arrowhead
+0 slj
+n 8019 4079 m 8132 4130 l 8056 4032 l 8019 4079 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 3105 4140 m 6660 4140 l 6660 5085 l 3105 5085 l
+ cp gs col0 s gr 
+% Polyline
+n 6660 4140 m 8730 4140 l 8730 5085 l 6660 5085 l
+ cp gs col7 0.50 shd ef gr gs col0 s gr 
+% Polyline
+n 3510 4140 m 3780 4140 l 3780 5085 l 3510 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 234.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4365 4140 m 4635 4140 l 4635 5085 l 4365 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 291.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 4905 4140 m 5265 4140 l 5265 5085 l 4905 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P2 [16 0 0 -8 327.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+% Polyline
+n 7965 4140 m 8370 4140 l 8370 5085 l 7965 5085 l
+ cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
+15.00 15.00 sc P6 [16 0 0 -16 531.00 276.00] PATmp PATsp ef gr PATusp gs col0 s gr 
+/Courier-Bold ff 190.50 scf sf
+3240 3150 m
+gs 1 -1 sc (    chdir\("/path"\)) col0 sh gr
+/Courier-Bold ff 190.50 scf sf
+3330 3375 m
+gs 1 -1 sc (}) col0 sh gr
+/Courier-Bold ff 190.50 scf sf
+3375 2925 m
+gs 1 -1 sc (BEGIN {) col0 sh gr
+/Courier-Bold ff 190.50 scf sf
+6660 3150 m
+gs 1 -1 sc (\(*fnptr\)\(1\);) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+3150 5400 m
+gs 1 -1 sc (Memoria indirizzabile programma gawk) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+6930 5400 m
+gs 1 -1 sc (    Estensione) col0 sh gr
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+end
+%EOF
diff --git a/gawk-5.0.1/doc/it/api-figura3.fig b/gawk-5.0.1/doc/it/api-figura3.fig
new file mode 100644
index 00000000000..fae92940946
--- /dev/null
+++ b/gawk-5.0.1/doc/it/api-figura3.fig
@@ -0,0 +1,29 @@
+#FIG 3.2  Produced by xfig version 3.2.5c
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+5 1 0 1 0 7 50 -1 -1 0.000 0 0 1 0 6120.000 6627.656 4095 4140 6120 3420 8145 4140
+	1 1 1.00 60.00 120.00
+2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 3105 4140 6660 4140 6660 5085 3105 5085 3105 4140
+2 2 0 1 0 7 50 -1 10 0.000 0 0 -1 0 0 5
+	 6660 4140 8730 4140 8730 5085 6660 5085 6660 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 3510 4140 3780 4140 3780 5085 3510 5085 3510 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4365 4140 4635 4140 4635 5085 4365 5085 4365 4140
+2 2 0 1 0 7 50 -1 42 0.000 0 0 -1 0 0 5
+	 4905 4140 5265 4140 5265 5085 4905 5085 4905 4140
+2 2 0 1 0 7 50 -1 46 0.000 0 0 -1 0 0 5
+	 7965 4140 8370 4140 8370 5085 7965 5085 7965 4140
+4 0 0 50 -1 14 12 0.0000 4 180 1620 3240 3150     chdir("/path")\001
+4 0 0 50 -1 14 12 0.0000 4 165 90 3330 3375 }\001
+4 0 0 50 -1 14 12 0.0000 4 165 630 3375 2925 BEGIN {\001
+4 0 0 50 -1 14 12 0.0000 4 180 1080 6660 3150 (*fnptr)(1);\001
+4 0 0 50 -1 0 12 0.0000 4 165 3240 3150 5400 Memoria indirizzabile programma gawk\001
+4 0 0 50 -1 0 12 0.0000 4 135 1260 6930 5400     Estensione\001
diff --git a/gawk-5.0.1/doc/it/api-figura3.pdf b/gawk-5.0.1/doc/it/api-figura3.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..07f406bdc9f57388e5020ba5bab502475df80a76
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/api-figura3.png b/gawk-5.0.1/doc/it/api-figura3.png
new file mode 100644
index 0000000000000000000000000000000000000000..26ca6cd63e45d0bb39ad73453118624a88c34f56
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/api-figura3.txt b/gawk-5.0.1/doc/it/api-figura3.txt
new file mode 100644
index 00000000000..02791df569a
--- /dev/null
+++ b/gawk-5.0.1/doc/it/api-figura3.txt
@@ -0,0 +1,13 @@
+    BEGIN {
+        chdir("/path")                             (*fnptr)(1);
+    }
+            +--------------------------------------------+
+            |                                            |
+            |                                            V
++-------+-+---+-+---+-+------------------+--------------+-+---+
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
+|       |x|   |x|   |x|                  |OOOOOOOOOOOOOO|X|OOO|
++-------+-+---+-+---+-+------------------+--------------+-+---+
+
+   Memoria indirizzabile programma gawk        Estensione
diff --git a/gawk-5.0.1/doc/it/compila_originale.sh b/gawk-5.0.1/doc/it/compila_originale.sh
new file mode 100755
index 00000000000..06d53b930c4
--- /dev/null
+++ b/gawk-5.0.1/doc/it/compila_originale.sh
@@ -0,0 +1,16 @@
+
+#
+# builds the PDF version of the Gawk manual,
+# in the current directory
+#
+echo "Building the pdf version of the gawk manual"
+echo "in directory:"
+pwd
+echo "Beware, it can take a long time!"
+if [ -f "gawktexi.in" ]
+then
+	gawk -f sidebar.awk gawktexi.in  >gawk.texi
+fi
+# just in case, drop previous Index
+rm -f gawk.cps gawk.cp gawk.aux gawk.fn gawk.ky gawk.log gawk.pg
+texi2pdf  gawk.texi 
diff --git a/gawk-5.0.1/doc/it/compila_smallprint.sh b/gawk-5.0.1/doc/it/compila_smallprint.sh
new file mode 100755
index 00000000000..dd8d57f48f7
--- /dev/null
+++ b/gawk-5.0.1/doc/it/compila_smallprint.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# eventuali file di lavoro da elaborazioni precedenti
+rm -f gawk-it-17x24.pdf gawk-it.toc gawk-it.aux gawk-it.cp gawk-it.texi 2>/dev/null
+	
+sed '{
+   s/@example/@smallexample/g
+   s/@end example/@end smallexample/g
+  }' gawktexi.in > gawktexi-tmp.in
+
+awk -f sidebar.awk < gawktexi-tmp.in > gawk-it.texi
+
+texi2dvi -t "@set SMALLPRINT" -t "@set FOR_PRINT" -t @manuale -t "@include margini.texi" gawk-it.texi -o gawk-it-17x24.dvi
+
+dvipdfmx --dvipdfm -p 170mm,240mm  gawk-it-17x24.dvi
+
+awk -f sidebar.awk < gawktexi.in > gawk-it.texi
+
+rm gawktexi-tmp.in
diff --git a/gawk-5.0.1/doc/it/epsf.tex b/gawk-5.0.1/doc/it/epsf.tex
new file mode 100644
index 00000000000..847de77fb6d
--- /dev/null
+++ b/gawk-5.0.1/doc/it/epsf.tex
@@ -0,0 +1,653 @@
+%%% -*-TeX-*-
+%%% ====================================================================
+%%%  @TeX-file{
+%%%     author          = "Tom Rokicki",
+%%%     version         = "2.7.4",
+%%%     date            = "14 February 2011",
+%%%     time            = "15:44:06 MST",
+%%%     filename        = "epsf.tex",
+%%%     address         = "Tom Rokicki
+%%%                        Box 2081
+%%%                        Stanford, CA 94309
+%%%                        USA",
+%%%     telephone       = "+1 415 855 9989",
+%%%     checksum        = "29223 653 3100 27123",
+%%%     email           = "rokicki@cs.stanford.edu (Internet)",
+%%%     codetable       = "ISO/ASCII",
+%%%     copyright       = "This file is freely redistributable and
+%%%                        placed into the public domain by Tomas
+%%%                        Rokicki.",
+%%%     keywords        = "PostScript, TeX",
+%%%     license         = "public domain",
+%%%     supported       = "yes",
+%%%     abstract        = "This file contains macros to support the
+%%%                        inclusion of Encapsulated PostScript files
+%%%                        in TeX documents.",
+%%%     docstring       = "This file contains TeX macros to include an
+%%%                        Encapsulated PostScript graphic.  It works
+%%%                        by finding the bounding box comment,
+%%%                        calculating the correct scale values, and
+%%%                        inserting a vbox of the appropriate size at
+%%%                        the current position in the TeX document.
+%%%
+%%%                        To use, simply use
+%%%
+%%%                        \input epsf % somewhere early on in your TeX file
+%%%
+%%%                        % then where you want to insert a vbox for a figure:
+%%%                        \epsfbox{filename.ps}
+%%%
+%%%                        Alternatively, you can supply your own
+%%%                        bounding box by
+%%%
+%%%                        \epsfbox[0 0 30 50]{filename.ps}
+%%%
+%%%                        This will not read in the file, and will
+%%%                        instead use the bounding box you specify.
+%%%
+%%%                        The effect will be to typeset the figure as
+%%%                        a TeX box, at the point of your \epsfbox
+%%%                        command. By default, the graphic will have
+%%%                        its `natural' width (namely the width of
+%%%                        its bounding box, as described in
+%%%                        filename.ps). The TeX box will have depth
+%%%                        zero.
+%%%
+%%%                        You can enlarge or reduce the figure by
+%%%                        using
+%%%
+%%%                          \epsfxsize = <dimen> \epsfbox{filename.ps}
+%%%                        or
+%%%                          \epsfysize = <dimen> \epsfbox{filename.ps}
+%%%
+%%%                        instead. Then the width of the TeX box will
+%%%                        be \epsfxsize and its height will be scaled
+%%%                        proportionately (or the height will be
+%%%                        \epsfysize and its width will be scaled
+%%%                        proportionately).
+%%%
+%%%                        The width (and height) is restored to zero
+%%%                        after each use, so \epsfxsize or \epsfysize
+%%%                        must be specified before EACH use of
+%%%                        \epsfbox.
+%%%
+%%%                        A more general facility for sizing is
+%%%                        available by defining the \epsfsize macro.
+%%%                        Normally you can redefine this macro to do
+%%%                        almost anything.  The first parameter is
+%%%                        the natural x size of the PostScript
+%%%                        graphic, the second parameter is the
+%%%                        natural y size of the PostScript graphic.
+%%%                        It must return the xsize to use, or 0 if
+%%%                        natural scaling is to be used.  Common uses
+%%%                        include:
+%%%
+%%%                           \epsfxsize  % just leave the old value alone
+%%%                           0pt         % use the natural sizes
+%%%                           #1          % use the natural sizes
+%%%                           \hsize      % scale to full width
+%%%                           0.5#1       % scale to 50% of natural size
+%%%                           \ifnum #1 > \hsize \hsize \else #1\fi
+%%%                                       % smaller of natural, hsize
+%%%
+%%%                        If you want TeX to report the size of the
+%%%                        figure (as a message on your terminal when
+%%%                        it processes each figure), use
+%%%                        `\epsfverbosetrue'.
+%%%
+%%%                        If you only want to get the bounding box
+%%%                        extents, without producing any output boxes
+%%%                        or \special{}, then use \epsfgetbb{filename}.
+%%%                        The bounding box corner coordinates are saved
+%%%                        in the macros \epsfllx, \epsflly, \epsfurx,
+%%%                        and \epsfury in PostScript units of big
+%%%                        points.
+%%%
+%%%                        Revision history:
+%%%
+%%%                        ---------------------------------------------
+%%%                        epsf.tex macro file:
+%%%                        Originally written by Tomas Rokicki of
+%%%                        Radical Eye Software, 29 Mar 1989.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Don Knuth, 3 Jan 1990.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Tomas Rokicki, 18 Jul 1990.
+%%%                        Accept bounding boxes with no space after
+%%%                        the colon.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 03 Dec 1991 [2.0].
+%%%                        Add version number and date typeout.
+%%%
+%%%                        Use \immediate\write16 instead of \message
+%%%                        to ensure output on new line.
+%%%
+%%%                        Handle nested EPS files.
+%%%
+%%%                        Handle %%BoundingBox: (atend) lines.
+%%%
+%%%                        Do not quit when blank lines are found.
+%%%
+%%%                        Add a few percents to remove generation of
+%%%                        spurious blank space.
+%%%
+%%%                        Move \special output to
+%%%                        \epsfspecial{filename} so that other macro
+%%%                        packages can input this one, then change
+%%%                        the definition of \epsfspecial to match
+%%%                        another DVI driver.
+%%%
+%%%                        Move size computation to \epsfsetsize which
+%%%                        can be called by the user; the verbose
+%%%                        output of the bounding box and scaled width
+%%%                        and height happens here.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 05 May 1992 [2.1].
+%%%                        Wrap \leavevmode\hbox{} around \vbox{} with
+%%%                        the \special so that \epsffile{} can be
+%%%                        used inside \begin{center}...\end{center}
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 09 Dec 1992 [2.2].
+%%%                        Introduce \epsfshow{true,false} and
+%%%                        \epsfframe{true,false} macros; the latter
+%%%                        suppresses the insertion of the PostScript,
+%%%                        and instead just creates an empty box,
+%%%                        which may be handy for rapid prototyping.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 14 Dec 1992 [2.3].
+%%%                        Add \epsfshowfilename{true,false}.  When
+%%%                        true, and \epsfshowfalse is specified, the
+%%%                        PostScript file name will be displayed
+%%%                        centered in the figure box.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 20 June 1993 [2.4].
+%%%                        Remove non-zero debug setting of \epsfframemargin,
+%%%                        and change margin handling to preserve EPS image
+%%%                        size and aspect ratio, so that the actual
+%%%                        box is \epsfxsize+\epsfframemargin wide by
+%%%                        \epsfysize+\epsfframemargin high.
+%%%                        Reduce output of \epsfshowfilenametrue to
+%%%                        just the bare file name.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 13 July 1993 [2.5].
+%%%                        Add \epsfframethickness for control of
+%%%                        \epsfframe frame lines.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 02 July 1996 [2.6]
+%%%                        Add missing initialization \epsfatendfalse;
+%%%                        the lack of this resulted in the wrong
+%%%                        BoundingBox being picked up, mea culpa, sigh...
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 25 October 1996 [2.7]
+%%%                        Update to match changes in from dvips 5-600
+%%%                        distribution: new user-accessible macros:
+%%%                        \epsfclipon, \epsfclipoff, \epsfdrafton,
+%%%                        \epsfdraftoff, change \empty to \epsfempty.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 18 May 2002 [2.7.1]
+%%%                        Add write statements to echo input file
+%%%                        names.  Prior to that change, an error in
+%%%                        such a file could be quite hard to track
+%%%                        down: a long list of TeX page numbers could
+%%%                        suddenly be followed by ``TeX buffer
+%%%                        capacity'' exceeded, without any indication
+%%%                        of the file that was responsible.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 16 May 2003 [2.7.2]
+%%%                        Supply two critical percent characters that
+%%%                        were mistakenly omitted in version 2.7.1,
+%%%                        and resulted in a small amount of spurious
+%%%                        horizontal space.
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, 14 Feb 2011 [2.7.3]
+%%%                        Add previously-missing \space in rwi
+%%%                        assignments (bug reported 14-Feb-2011 by
+%%%                        Stefan Rueger <s.rueger@open.ac.uk>).
+%%%
+%%%                        ---------------------------------------------
+%%%                        Revised by Nelson H. F. Beebe
+%%%                        <beebe@math.utah.edu>, Karl Berry
+%%%                        <karl@freefriends.org>, and Robin Fairbairns
+%%%                        <Robin.Fairbairns@cl.cam.ac.uk>,
+%%%                        23 July 2005 [2.7.3]
+%%%                        Add critical \hbox{} wrapper in \epsfsetgraph
+%%%                        so that \epsfbox{} does not conflict with
+%%%                        LaTeX center environment when \epsfbox{} is
+%%%                        surrounded by other horizonal objects.
+%%%                        Improve macro readability by adding legal,
+%%%                        but invisible-in-typeset-output, spaces.
+%%%                        Ensure that verbose status reports come
+%%%                        inside (filename ...) list.
+%%%
+%%%                        ---------------------------------------------
+%%%                        The checksum field above contains a CRC-16
+%%%                        checksum as the first value, followed by
+%%%                        the equivalent of the standard UNIX wc
+%%%                        (word count) utility output of lines,
+%%%                        words, and characters.  This is produced by
+%%%                        Robert Solovay's checksum utility.",
+%%%  }
+%%% ====================================================================
+
+%\immediate \write16 {This is `epsf.tex' v2.0 <02 Dec 1991>}%
+%\immediate \write16 {This is `epsf.tex' v2.1 <05 May 1992>}%
+%\immediate \write16 {This is `epsf.tex' v2.2 <09 Dec 1992>}%
+%\immediate \write16 {This is `epsf.tex' v2.3 <14 Dec 1992>}%
+%\immediate \write16 {This is `epsf.tex' v2.4 <20 June 1993>}%
+%\immediate \write16 {This is `epsf.tex' v2.5 <13 July 1993>}%
+%\immediate \write16 {This is `epsf.tex' v2.6 <02 July 1996>}%
+%\immediate \write16 {This is `epsf.tex' v2.7 <25 October 1996>}%
+%\immediate \write16 {This is `epsf.tex' v2.7.1 <18 May 2002>}%
+%\immediate \write16 {This is `epsf.tex' v2.7.2 <16 May 2003>}%
+%\immediate \write16 {This is `epsf.tex' v2.7.3 <23 July 2005>}%
+\immediate \write16 {This is `epsf.tex' v2.7.4 <14 February 2011>}%
+%
+\newread \epsffilein    % file to \read
+\newif \ifepsfatend     % need to scan to LAST %%BoundingBox comment?
+\newif \ifepsfbbfound   % success?
+\newif \ifepsfdraft     % use draft mode?
+\newif \ifepsffileok    % continue looking for the bounding box?
+\newif \ifepsfframe     % frame the bounding box?
+\newif \ifepsfshow      % show PostScript file, or just bounding box?
+\epsfshowtrue          % default is to display PostScript file
+\newif \ifepsfshowfilename % show the file name if \epsfshowfalse specified?
+\newif \ifepsfverbose   % report what you're making?
+\newdimen \epsfframemargin % margin between box and frame
+\newdimen \epsfframethickness % thickness of frame rules
+\newdimen \epsfrsize    % vertical size before scaling
+\newdimen \epsftmp      % register for arithmetic manipulation
+\newdimen \epsftsize    % horizontal size before scaling
+\newdimen \epsfxsize    % horizontal size after scaling
+\newdimen \epsfysize    % vertical size after scaling
+\newdimen \pspoints     % conversion factor
+%
+\pspoints = 1bp        % Adobe points are `big'
+\epsfxsize = 0pt       % default value, means `use natural size'
+\epsfysize = 0pt       % ditto
+\epsfframemargin = 0pt % default value: frame box flush around picture
+\epsfframethickness = 0.4pt % TeX's default rule thickness
+%
+\def \epsfbox #1{%
+    \global \def \epsfllx {72}%
+    \global \def \epsflly {72}%
+    \global \def \epsfurx {540}%
+    \global \def \epsfury {720}%
+    \def \lbracket {[}%
+    \def \testit {#1}%
+    \ifx \testit \lbracket
+        \let \next = \epsfgetlitbb
+    \else
+        \let \next = \epsfnormal
+    \fi
+    \next{#1}%
+}%
+%
+% We use \epsfgetlitbb if the user specified an explicit bounding box,
+% and \epsfnormal otherwise.  Because \epsfgetbb can be called
+% separately to retrieve the bounding box, we move the verbose
+% printing the bounding box extents and size on the terminal to
+% \epsfstatus.  Therefore, when the user provided the bounding box,
+% \epsfgetbb will not be called, so we must call \epsfsetsize and
+% \epsfstatus ourselves.
+%
+\def \epsfgetlitbb #1#2 #3 #4 #5]#6{%
+   \epsfgrab #2 #3 #4 #5 .\\%
+   \epsfsetsize
+   \epsfstatus{#6}%
+   \epsfsetgraph{#6}%
+}%
+%
+\def \epsfnormal #1{%
+    \epsfgetbb{#1}%
+    \epsfsetgraph{#1}%
+}%
+%
+\def \epsfgetbb #1{%
+%
+%   The first thing we need to do is to open the
+%   PostScript file, if possible.
+%
+    \openin\epsffilein=#1
+    \immediate \write16 {(#1}%
+    \ifeof \epsffilein
+        \errmessage{Could not open file #1, ignoring it}%
+    \else                       %process the file
+        {%                      %start a group to contain catcode changes
+            % Make all special characters, except space, to be of type
+            % `other' so we process the file in almost verbatim mode
+            % (TeXbook, p. 344).
+            \chardef \other = 12%
+            \def \do ##1{\catcode`##1=\other}%
+            \dospecials
+            \catcode `\ = 10%
+            \epsffileoktrue        %true while we are looping
+            \epsfatendfalse        %[02-Jul-1996]: add forgotten initialization
+            \loop                  %reading lines from the EPS file
+                \read \epsffilein to \epsffileline
+                \ifeof \epsffilein %then no more input
+                \epsffileokfalse   %so set completion flag
+            \else                  %otherwise process one line
+                \expandafter \epsfaux \epsffileline :. \\%
+            \fi
+            \ifepsffileok
+            \repeat
+            \ifepsfbbfound
+            \else
+                \ifepsfverbose
+                    \immediate \write16 {No BoundingBox comment found in %
+                                         file #1; using defaults}%
+                \fi
+            \fi
+        }%                      %end catcode changes
+        \closein\epsffilein
+    \fi                         %end of file processing
+    \epsfsetsize                %compute size parameters
+    \epsfstatus{#1}%
+    \immediate \write16 {)}%
+}%
+%
+% Clipping control:
+\def \epsfclipon  {\def \epsfclipstring { clip}}%
+\def \epsfclipoff {\def \epsfclipstring {\ifepsfdraft \space clip\fi}}%
+\epsfclipoff % default for dvips is OFF
+%
+% The special that is emitted by \epsfsetgraph comes from this macro.
+% It is defined separately to allow easy customization by other
+% packages that first \input epsf.tex, then redefine \epsfspecial.
+% This macro is invoked in the lower-left corner of a box of the
+% width and height determined from the arguments to \epsffile, or
+% from the %%BoundingBox in the EPS file itself.
+%
+% This version is for dvips:
+\def \epsfspecial #1{%
+     \epsftmp=10\epsfxsize
+     \divide \epsftmp by \pspoints
+     \ifnum \epsfrsize = 0%
+       \relax
+       \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space
+		llx=\epsfllx\space
+		lly=\epsflly\space
+		urx=\epsfurx\space
+		ury=\epsfury\space
+		rwi=\number\epsftmp\space
+		\epsfclipstring
+               }%
+     \else
+       \epsfrsize=10\epsfysize
+       \divide \epsfrsize by \pspoints
+       \special{PSfile=\ifepsfdraft psdraft.ps\else#1\fi\space
+		llx=\epsfllx\space
+		lly=\epsflly\space
+		urx=\epsfurx\space
+		ury=\epsfury\space
+		rwi=\number\epsftmp\space
+		rhi=\number\epsfrsize
+		\epsfclipstring
+               }%
+     \fi
+}%
+%
+% \epsfframe macro adapted from the TeXbook, exercise 21.3, p. 223, 331.
+% but modified to set the box width to the natural width, rather
+% than the line width, and to include space for margins and rules
+\def \epsfframe #1%
+{%
+ % method for detecting latex suggested by Robin Fairbairns, May 2005.
+  \ifx \documentstyle \epsfundefined
+    \relax
+  \else
+%    \leavevmode                   % so we can put this inside
+                                  % a latex centered environment
+    % The \leavevmode breaks under plain when this is inside a box,
+    % because it forces the figure to be the entire \hsize.  On the
+    % other hand, we need the \leavevmode for it to work in LaTeX,
+    % because the {center} environment works by adjusting TeX's
+    % paragraph parameters.
+    %
+    % Compare the LaTeX sequence
+    % \begin{center}
+    %   \epsfbox{tip.eps}q
+    % \end{center}
+    % (needs the \leavevmode to put the q right next to the image)
+    %
+    % with the plain TeX sequence:
+    % \leftline{\vbox{\epsfbox{tip.eps}}q}
+    % (had the q all the way over to the right, when \leavevmode was used)
+  \fi
+  %
+  \setbox0 = \hbox{#1}%
+  \dimen0 = \wd0                                % natural width of argument
+  \advance \dimen0 by 2\epsfframemargin         % plus width of 2 margins
+  \advance \dimen0 by 2\epsfframethickness      % plus width of 2 rule lines
+  \relax
+  \hbox{%
+    \vbox
+    {%
+      \hrule height \epsfframethickness depth 0pt
+      \hbox to \dimen0
+      {%
+	\hss
+	\vrule width \epsfframethickness
+	\kern \epsfframemargin
+	\vbox {\kern \epsfframemargin \box0 \kern \epsfframemargin }%
+	\kern \epsfframemargin
+	\vrule width \epsfframethickness
+	\hss
+      }% end hbox
+      \hrule height 0pt depth \epsfframethickness
+    }% end vbox
+  }% end hbox
+  \relax
+}%
+%
+\def \epsfsetgraph #1%
+{%
+   %
+   % Make the vbox and stick in a \special that the DVI driver can
+   % parse.  \vfil and \hfil are used to place the \special origin at
+   % the lower-left corner of the vbox.  \epsfspecial can be redefined
+   % to produce alternate \special syntaxes.
+   %
+   \ifvmode \leavevmode \fi
+   \relax
+   \hbox{% so we can put this in \begin{center}...\end{center}
+     \ifepsfframe \expandafter \epsfframe \fi
+     {\vbox to\epsfysize
+     {%
+        \ifepsfshow
+            % output \special{} at lower-left corner of figure box
+            \vfil
+            \hbox to \epsfxsize{\epsfspecial{#1}\hfil}%
+        \else
+            \vfil
+            \hbox to\epsfxsize{%
+               \hss
+               \ifepsfshowfilename
+               {%
+                  \epsfframemargin=3pt % local change of margin
+                  \epsfframe{{\tt #1}}%
+               }%
+               \fi
+               \hss
+            }%
+            \vfil
+        \fi
+     }%
+   }}%
+   \relax
+   %
+   % Reset \epsfxsize and \epsfysize, as documented above.
+   %
+   \global \epsfxsize = 0pt
+   \global \epsfysize = 0pt
+}%
+%
+%   Now we have to calculate the scale and offset values to use.
+%   First we compute the natural sizes.
+%
+\def \epsfsetsize
+{%
+   \epsfrsize = \epsfury \pspoints
+   \advance \epsfrsize by -\epsflly \pspoints
+   \epsftsize = \epsfurx \pspoints
+   \advance \epsftsize by -\epsfllx \pspoints
+%
+%   If `epsfxsize' is 0, we default to the natural size of the picture.
+%   Otherwise we scale the graph to be \epsfxsize wide.
+%
+   \epsfxsize = \epsfsize{\epsftsize}{\epsfrsize}%
+   \ifnum \epsfxsize = 0
+      \ifnum \epsfysize = 0
+	\epsfxsize = \epsftsize
+        \epsfysize = \epsfrsize
+	\epsfrsize = 0pt
+%
+%   We have a sticky problem here:  TeX doesn't do floating point arithmetic!
+%   Our goal is to compute y = rx/t. The following loop does this reasonably
+%   fast, with an error of at most about 16 sp (about 1/4000 pt).
+%
+      \else
+	\epsftmp = \epsftsize
+        \divide \epsftmp by \epsfrsize
+	\epsfxsize = \epsfysize
+        \multiply \epsfxsize by \epsftmp
+	\multiply \epsftmp by \epsfrsize
+        \advance \epsftsize by -\epsftmp
+	\epsftmp = \epsfysize
+	\loop
+        \advance \epsftsize by \epsftsize
+        \divide \epsftmp by 2
+	\ifnum \epsftmp > 0
+	   \ifnum \epsftsize < \epsfrsize
+           \else
+	      \advance \epsftsize -\epsfrsize
+              \advance \epsfxsize \epsftmp
+           \fi
+	\repeat
+	\epsfrsize = 0pt
+      \fi
+   \else
+     \ifnum \epsfysize = 0
+       \epsftmp = \epsfrsize
+       \divide \epsftmp by \epsftsize
+       \epsfysize = \epsfxsize
+       \multiply \epsfysize by \epsftmp
+       \multiply \epsftmp by \epsftsize
+       \advance \epsfrsize by -\epsftmp
+       \epsftmp = \epsfxsize
+       \loop
+	 \advance \epsfrsize by \epsfrsize
+	 \divide \epsftmp by 2
+       \ifnum \epsftmp > 0
+	  \ifnum \epsfrsize < \epsftsize
+          \else
+	     \advance \epsfrsize by -\epsftsize
+             \advance \epsfysize by \epsftmp
+          \fi
+       \repeat
+       \epsfrsize = 0pt
+     \else
+       \epsfrsize = \epsfysize
+     \fi
+   \fi
+}%
+%
+% Issue some status messages if the user requested them
+%
+\def \epsfstatus #1{% arg = filename
+   \ifepsfverbose
+     \immediate \write16 {#1: BoundingBox:
+			  llx = \epsfllx \space lly = \epsflly \space
+			  urx = \epsfurx \space ury = \epsfury \space}%
+     \immediate \write16 {#1: scaled width = \the\epsfxsize \space
+			  scaled height = \the\epsfysize}%
+   \fi
+}%
+%
+%   We still need to define the tricky \epsfaux macro. This requires
+%   a couple of magic constants for comparison purposes.
+%
+{\catcode`\%=12 \global \let \epsfpercent=%\global \def \epsfbblit {%BoundingBox}}%
+\global \def \epsfatend{(atend)}%
+%
+%   So we're ready to check for `%BoundingBox:' and to grab the
+%   values if they are found.
+%
+%   If we find a line
+%
+%   %%BoundingBox: (atend)
+%
+%   then we ignore it, but set a flag to force parsing all of the
+%   file, so the last %%BoundingBox parsed will be the one used.  This
+%   is necessary, because EPS files can themselves contain other EPS
+%   files with their own %%BoundingBox comments.
+%
+%   If we find a line
+%
+%   %%BoundingBox: llx lly urx ury
+%
+%   then we save the 4 values in \epsfllx, \epsflly, \epsfurx, \epsfury.
+%   Then, if we have not previously parsed an (atend), we flag completion
+%   and can stop reading the file.  Otherwise, we must keep on reading
+%   to end of file so that we find the values on the LAST %%BoundingBox.
+\long \def \epsfaux#1#2:#3\\%
+{%
+   \def \testit {#2}%           % save second character up to just before colon
+   \ifx#1\epsfpercent           % then first char is percent (quick test)
+       \ifx \testit \epsfbblit  % then (slow test) we have %%BoundingBox
+            \epsfgrab #3 . . . \\%
+            \ifx \epsfllx\epsfatend % then ignore %%BoundingBox: (atend)
+                \global \epsfatendtrue
+            \else               % else found %%BoundingBox: llx lly urx ury
+                \ifepsfatend    % then keep parsing ALL %%BoundingBox lines
+                \else           % else stop after first one parsed
+                    \epsffileokfalse
+                \fi
+                \global \epsfbbfoundtrue
+            \fi
+       \fi
+   \fi
+}%
+%
+%   Here we grab the values and stuff them in the appropriate definitions.
+%
+\def \epsfempty {}%
+\def \epsfgrab #1 #2 #3 #4 #5\\{%
+   \global \def \epsfllx {#1}\ifx \epsfllx\epsfempty
+      \epsfgrab #2 #3 #4 #5 .\\\else
+   \global \def \epsflly {#2}%
+   \global \def \epsfurx {#3}\global \def \epsfury {#4}\fi
+}%
+%
+%   We default the epsfsize macro.
+%
+\def \epsfsize #1#2{\epsfxsize}%
+%
+%   Finally, another definition for compatibility with older macros.
+%
+\let \epsffile = \epsfbox
+\endinput
diff --git a/gawk-5.0.1/doc/it/flusso-elaborazione.eps b/gawk-5.0.1/doc/it/flusso-elaborazione.eps
new file mode 100644
index 00000000000..c9e4c938f84
--- /dev/null
+++ b/gawk-5.0.1/doc/it/flusso-elaborazione.eps
@@ -0,0 +1,420 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.12.8 (http://cairographics.org)
+%%CreationDate: Wed Dec 17 19:10:08 2014
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 0 -1 366 172
+%%EndComments
+%%BeginProlog
+save
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/pdfmark where { pop globaldict /?pdfmark /exec load put }
+    { globaldict begin /?pdfmark /pop load def /pdfmark
+    /cleartomark load def end } ifelse
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+%%EndProlog
+11 dict begin
+/FontType 42 def
+/FontName /DejaVuSans def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 63 /question put
+Encoding 65 /A put
+Encoding 69 /E put
+Encoding 73 /I put
+Encoding 78 /N put
+Encoding 80 /P put
+Encoding 83 /S put
+Encoding 97 /a put
+Encoding 98 /b put
+Encoding 99 /c put
+Encoding 100 /d put
+Encoding 101 /e put
+Encoding 105 /i put
+Encoding 108 /l put
+Encoding 110 /n put
+Encoding 111 /o put
+Encoding 114 /r put
+Encoding 116 /t put
+Encoding 117 /u put
+Encoding 122 /z put
+Encoding 236 /igrave put
+/CharStrings 22 dict dup begin
+/.notdef 0 def
+/I 1 def
+/n 2 def
+/i 3 def
+/z 4 def
+/a 5 def
+/l 6 def
+/o 7 def
+/e 8 def
+/A 9 def
+/c 10 def
+/r 11 def
+/d 12 def
+/t 13 def
+/question 14 def
+/N 15 def
+/S 16 def
+/igrave 17 def
+/E 18 def
+/b 19 def
+/P 20 def
+/u 21 def
+end readonly def
+/sfnts [
+<0001000000090080000300106376742000691d3900000ddc000001fe6670676d7134766a0000
+0fdc000000ab676c7966478ea3590000009c00000d4068656164f79ac5e70000108800000036
+686865610cb80669000010c000000024686d747864c10d12000010e4000000606c6f63610000
+a9f000001144000000646d61787004850671000011a800000020707265703b07f100000011c8
+0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec
+310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f2720629000100c9
+0000019305d50003002eb700af02011c00040410fc4bb0105458b9000000403859ec31002fec
+3001400d30054005500560058f059f05065d13331123c9caca05d5fa2b00000100ba00000464
+047b001300364019030900030e0106870e11b80cbc0a010208004e0d09080b461410fcec32f4
+ec31002f3ce4f4c4ec1112173930b46015cf1502015d0111231134262322061511231133153e
+013332160464b87c7c95acb9b942b375c1c602a4fd5c029e9f9ebea4fd870460ae6564ef0002
+00c100000179061400030007002b400e06be04b100bc020501080400460810fc3cec3231002f
+e4fcec30400b1009400950096009700905015d1333112311331523c1b8b8b8b80460fba00614
+e90000010058000003db04600009009d401a081102030203110708074208a900bc03a9050803
+01000401060a10dc4bb00b544bb00c545b58b90006ffc038594bb0135458b9000600403859c4
+32c411393931002fecf4ec304b5358071005ed071005ed592201404205021602260247024907
+050b080f0b18031b082b08200b36033908300b400140024503400440054308570359085f0b60
+01600266036004600562087f0b800baf0b1b5d005d1321150121152135012171036afd4c02b4
+fc7d02b4fd650460a8fcdb93a80325000002007bffe3042d047b000a002500bc4027191f0b17
+090e00a91706b90e1120861fba1cb923b8118c170c001703180d09080b1f030814452610fcec
+ccd4ec323211393931002fc4e4f4fcf4ec10c6ee10ee11391139123930406e301d301e301f30
+20302130223f27401d401e401f402040214022501d501e501f50205021502250277027851d87
+1e871f8720872185229027a027f0271e301e301f30203021401e401f40204021501e501f5020
+5021601e601f60206021701e701f70207021801e801f80208021185d015d0122061514163332
+363d01371123350e01232226353436332135342623220607353e0133321602bedfac816f99b9
+b8b83fbc88accbfdfb0102a79760b65465be5af3f00233667b6273d9b4294cfd81aa6661c1a2
+bdc0127f8b2e2eaa2727fc00000100c100000179061400030022b7009702010800460410fcec
+31002fec30400d10054005500560057005f00506015d13331123c1b8b80614f9ec0000020071
+ffe30475047b000b0017004a401306b91200b90cb8128c1809120f51031215451810fcecf4ec
+310010e4f4ec10ee3040233f197b007b067f077f087f097f0a7f0b7b0c7f0d7f0e7f0f7f107f
+117b12a019f01911015d012206151416333236353426273200111000232200111000027394ac
+ab9593acac93f00112feeef0f1feef011103dfe7c9c9e7e8c8c7e99cfec8feecfeedfec70139
+011301140138000000020071ffe3047f047b0014001b00704024001501098608880515a90105
+b90c01bb18b912b80c8c1c1b1502081508004b02120f451c10fcecf4ecc4111239310010e4f4
+ece410ee10ee10f4ee1112393040293f1d701da01dd01df01d053f003f013f023f153f1b052c
+072f082f092c0a6f006f016f026f156f1b095d71015d0115211e0133323637150e0123200011
+1000333200072e0123220607047ffcb20ccdb76ac76263d06bfef4fec70129fce20107b802a5
+889ab90e025e5abec73434ae2a2c0138010a01130143feddc497b4ae9e000002001000000568
+05d50002000a00c2404100110100040504021105050401110a030a0011020003030a07110504
+06110505040911030a08110a030a4200030795010381090509080706040302010009050a0b10
+d4c4173931002f3ce4d4ec1239304b5358071005ed0705ed071005ed0705ed071008ed071005
+ed071005ed071008ed5922b2200c01015d40420f010f020f070f080f005800760070008c0009
+07010802060309041601190256015802500c67016802780176027c0372047707780887018802
+800c980299039604175d005d090121013301230321032302bcfeee0225fe7be50239d288fd5f
+88d5050efd1903aefa2b017ffe81000000010071ffe303e7047b0019003f401b00860188040e
+860d880ab91104b917b8118c1a07120d004814451a10fce432ec310010e4f4ec10fef4ee10f5
+ee30400b0f1b101b801b901ba01b05015d01152e0123220615141633323637150e0123220011
+100021321603e74e9d50b3c6c6b3509d4e4da55dfdfed6012d010655a20435ac2b2be3cdcde3
+2b2baa2424013e010e0112013a230000000100ba0000034a047b001100304014060b0700110b
+03870eb809bc070a06080008461210fcc4ec3231002fe4f4ecc4d4cc11123930b450139f1302
+015d012e012322061511231133153e0133321617034a1f492c9ca7b9b93aba85132e1c03b412
+11cbbefdb20460ae66630505000000020071ffe3045a06140010001c003840191ab9000e14b9
+05088c0eb801970317040008024711120b451d10fcecf4ec323231002fece4f4c4ec10c4ee30
+b6601e801ea01e03015d0111331123350e012322021110003332160114163332363534262322
+0603a2b8b83ab17ccbff00ffcb7cb1fdc7a79292a8a89292a703b6025ef9eca8646101440108
+0108014461fe15cbe7e7cbcbe7e700010037000002f2059e0013003840190e05080f03a90011
+01bc08870a0b08090204000810120e461410fc3cc4fc3cc432393931002fecf43cc4ec321139
+3930b2af1501015d01112115211114163b01152322263511233533110177017bfe854b73bdbd
+d5a28787059efec28ffda0894e9a9fd202608f013e00000000020093000003b005f000030024
+0065402b241e0906040a1d13040014861388109517910083021d1a0d0905040a1e010d1c1a04
+1c05010300261a132510dc4bb00c5458b90013ffc03859c4fcecd4ec10ee1139391112391112
+3931002feef6fef4ee10cd11393917393001b679097a0a7a20035d2533152313233534363f01
+3e0135342623220607353e013332161514060f010e01070e01150187cbcbc5bf385a5a393383
+6c4fb3615ec167b8df485a582f27080606fefe01919a65825659355e31596e4643bc3938c29f
+4c8956562f3519153c340000000100c90000053305d500090079401e07110102010211060706
+4207020300af0805060107021c0436071c00040a10fcecfcec11393931002f3cec323939304b
+5358071004ed071004ed5922b21f0b01015d4030360238074802470769026607800207060109
+0615011a06460149065701580665016906790685018a0695019a069f0b105d005d1321011133
+1121011123c901100296c4fef0fd6ac405d5fb1f04e1fa2b04e1fb1f00010087ffe304a205f0
+0027007e403c0d0c020e0b021e1f1e080902070a021f1f1e420a0b1e1f0415010015a1149418
+9511049500942591118c281e0a0b1f1b0700221b190e2d071914222810dcc4ecfcece4111239
+393939310010e4f4e4ec10eef6ee10c6111739304b535807100eed11173907100eed11173959
+22b20f2901015db61f292f294f29035d01152e012322061514161f011e011514042122262735
+1e013332363534262f012e01353424333216044873cc5fa5b377a67ae2d7feddfee76aef807b
+ec72adbc879a7be2ca0117f569da05a4c53736807663651f192bd9b6d9e0302fd04546887e6e
+7c1f182dc0abc6e42600ffffffc7000001a6066610270016ff1d0000120600170000000100c9
+0000048b05d5000b002e401506950402950081089504ad0a05010907031c00040c10fcec32d4
+c4c431002fececf4ec10ee30b21f0d01015d132115211121152111211521c903b0fd1a02c7fd
+3902f8fc3e05d5aafe46aafde3aa0000000200baffe304a40614000b001c0038401903b90c0f
+09b918158c0fb81b971900121247180c06081a461d10fcec3232f4ec31002fece4f4c4ec10c6
+ee30b6601e801ea01e03015d013426232206151416333236013e013332001110022322262715
+23113303e5a79292a7a79292a7fd8e3ab17bcc00ffffcc7bb13ab9b9022fcbe7e7cbcbe7e702
+526461febcfef8fef8febc6164a80614000200c90000048d05d500080013003a401801951000
+95098112100a0802040005190d3f11001c09041410fcec32fcec11173931002ff4ecd4ec3040
+0b0f151f153f155f15af1505015d011133323635342623252132041514042b0111230193fe8d
+9a9a8dfe3801c8fb0101fefffbfeca052ffdcf92878692a6e3dbdde2fda8000200aeffe30458
+047b00130014003b401c030900030e0106870e118c0a01bc14b80c0d0908140b4e0208004615
+10fcecf439ec3231002fe4e432f4c4ec1112173930b46f15c01502015d131133111416333236
+3511331123350e0123222601aeb87c7c95adb8b843b175c1c801cf01ba02a6fd619f9fbea402
+7bfba0ac6663f003a800000100aa04f00289066600030031400901b400b3040344010410dcec
+310010f4ec30004bb009544bb00e545b58bd0004ffc000010004000400403811373859090123
+01016f011a99feba0666fe8a0176000200c100000179047b00030004002c400b04b800bf0204
+010800460510fcec3931002fece43040110404340444041006400650066006700608015d1333
+112313c1b8b85c0460fba0047b00013500b800cb00cb00c100aa009c01a600b8006600000071
+00cb00a002b20085007500b800c301cb0189022d00cb00a600f000d300aa008700cb03aa0400
+014a003300cb000000d9050200f4015400b4009c01390114013907060400044e04b4045204b8
+04e704cd0037047304cd04600473013303a2055605a60556053903c5021200c9001f00b801df
+007300ba03e9033303bc0444040e00df03cd03aa00e503aa0404000000cb008f00a4007b00b8
+0014016f007f027b0252008f00c705cd009a009a006f00cb00cd019e01d300f000ba018300d5
+009803040248009e01d500c100cb00f600830354027f00000333026600d300c700a400cd008f
+009a0073040005d5010a00fe022b00a400b4009c00000062009c0000001d032d05d505d505d5
+05f0007f007b005400a406b80614072301d300b800cb00a601c301ec069300a000d3035c0371
+03db0185042304a80448008f0139011401390360008f05d5019a061407230666017904600460
+0460047b009c00000277046001aa00e904600762007b00c5007f027b000000b4025205cd0066
+00bc00660077061000cd013b01850389008f007b0000001d00cd074a042f009c009c0000077d
+006f0000006f0335006a006f007b00ae00b2002d0396008f027b00f600830354063705f6008f
+009c04e10266008f018d02f600cd03440029006604ee00730000140000960000b70706050403
+0201002c2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c2010
+0720b00050b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920
+b8ffff5058041b0559b0051cb0032508e12d2c4b505820b0fd454459212d2cb002254560442d
+2c4b5358b00225b0022545445921212d2c45442d2cb00225b0022549b00525b005254960b020
+6368208a108a233a8a10653a2d00000100000002547a3935de785f0f3cf5001f080000000000
+c990133600000000c9901336f7d6fcae0d72095500000008000000010000000000010000076d
+fe1d00000de2f7d6fa510d7200010000000000000000000000000000001804cd0066025c00c9
+051200ba023900c10433005804e7007b023900c104e5007104ec00710579001004660071034a
+00ba0514007103230037043f009305fc00c9051400870239ffc7050e00c9051400ba04d300c9
+051200ae040000aa023900c100000000000000440000008c0000010400000154000002200000
+034c000003880000042c00000500000005fc00000694000007040000079c00000818000008f0
+0000099800000a9000000aa800000b0800000ba000000c2000000ca400000cf400000d400001
+000000180354002b0068000c000200100099000800000415021600080004b8028040fffbfe03
+fa1403f92503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105ef
+fe03ee9603ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a
+4105e45303e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d
+03d9bb03d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0
+fe03cffe03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4
+fe03c3fe03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe
+03b8b7bb05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b396
+03b2fe03b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a
+4105a9fa03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a0
+96039ffe039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe03
+97960d0597fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe0390
+8f5d0590bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625
+058a410389880b05891403880b03878625058764038685110586250385110384fe0383821105
+83fe0382110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037a
+fe0379fe03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe03
+6c21036bfe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03
+613a0360fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe03
+5554150555420354150353011005531803521403514a130551fe03500b034ffe034e4d10054e
+fe034d10034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe03469603
+45960344fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12
+033c3b0d053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b0536
+1003350b03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e1003
+2d09032c32032b2a25052b64032a2912052a25032912032827250528410327250326250b0526
+0f03250b0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c
+1142051cfe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe
+0314fe0313fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c
+0110050c16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503
+022d0503fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
+2b2b2b2b2b2b2b1d00>
+] def
+/f-0-0 currentdict end definefont pop
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 -1 366 172
+%%EndPageSetup
+q 0 -1 366 173 rectclip q
+0 g
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 141.949 130.645 m 182.324 90.27 l 222.703 130.645 l 182.324 171.023 l 141.949
+ 130.645 l S
+Q q
+0 171.344 366 -172 re W n
+-0.5 172.531 m -0.5 -1.469 l 366.5 -1.469 l 366.5 172.531 l -0.5 172.531
+ l 130.297 127.812 m 139.809 127.812 l 139.809 131.59 l 130.297 131.59 l
+ 137.855 129.703 l 130.297 127.812 l W n
+q
+0 171.344 366 -172 re W n
+[ 1 0 0 1 0 -0.65625 ] concat
+  q
+0 g
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 87.84 130.359 m 138.863 130.359 l S
+  Q
+Q
+Q q
+0 g
+130.297 127.812 m 137.855 129.703 l 130.297 131.59 l 130.297 127.812 l f*
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 130.297 127.812 m 137.855 129.703 l 130.297 131.59 l 130.297 127.812 l S
+Q q
+0 171.344 366 -172 re W n
+-0.5 172.531 m -0.5 -1.469 l 366.5 -1.469 l 366.5 172.531 l -0.5 172.531
+ l 269.188 127.812 m 278.699 127.812 l 278.699 131.59 l 269.188 131.59 l
+ 276.746 129.703 l 269.188 127.812 l W n
+q
+0 171.344 366 -172 re W n
+[ 1 0 0 1 0 -0.65625 ] concat
+  q
+0 g
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 226.734 130.359 m 277.754 130.359 l S
+  Q
+Q
+Q q
+0 g
+269.188 127.812 m 276.746 129.703 l 269.188 131.59 l 269.188 127.812 l f*
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 269.188 127.812 m 276.746 129.703 l 269.188 131.59 l 269.188 127.812 l S
+4.945 149.543 m 2.336 149.543 0.223 147.43 0.223 144.82 c 0.223 114.145
+ l 0.223 111.535 2.336 109.418 4.945 109.418 c 79.969 109.418 l 82.574 109.418
+ 84.691 111.535 84.691 114.145 c 84.691 144.82 l 84.691 147.43 82.574 149.543
+ 79.969 149.543 c 4.945 149.543 l S
+285.312 149.543 m 282.703 149.543 280.59 147.43 280.59 144.82 c 280.59 
+113.891 l 280.59 111.281 282.703 109.168 285.312 109.168 c 360.84 109.168
+ l 363.449 109.168 365.562 111.281 365.562 113.891 c 365.562 144.82 l 365.562
+ 147.43 363.449 149.543 360.84 149.543 c 285.312 149.543 l S
+Q q
+0 152.344 366 -132 re W n
+-95.199 152.273 m -95.199 20.82 l 457.016 20.82 l 457.016 152.273 l -95.199
+ 152.273 l 179.891 55.719 m 179.891 48.535 l 185.578 48.535 l 185.578 55.719
+ l 182.734 50.012 l 179.891 55.719 l W n
+q
+0 152.344 366 -132 re W n
+[ 1 0 0 1 0 -0.65625 ] concat
+  q
+0 g
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 182.734 88.453 m 182.734 49.906 l S
+  Q
+Q
+Q q
+21 171.344 293 -168 re W n
+21.961 170.488 m 21.961 3.996 l 313.367 3.996 l 313.367 170.488 l 21.961
+ 170.488 l 109.363 118.598 m 109.363 127.699 l 106.359 127.699 l 106.359
+ 118.598 l 107.859 125.832 l 109.363 118.598 l W n
+q
+21 171.344 293 -168 re W n
+[ 1 0 0 1 0 -0.65625 ] concat
+  q
+0 g
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 139.371 21.672 m 107.859 21.672 l 107.859 127.453 l S
+  Q
+Q
+Q q
+0 g
+109.57 118.301 m 107.684 125.859 l 105.793 118.301 l 109.57 118.301 l f*
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 109.57 118.301 m 107.684 125.859 l 105.793 118.301 l 109.57 118.301 l S
+BT
+10 0 0 10 4.1806 125.86455 Tm
+/f-0-0 1 Tf
+[(I)3(n)9(i)-14(z)-17(i)-13(a)-13(l)-13(i)-14(z)-17(z)-17(a)-12(z)-17(i)
+-14(o)-13(n)9(e)]TJ
+15.95277 1.22084 Td
+[(A)17(n)9(c)8(o)-13(r)-5(a)]TJ
+0.75418 -1.2125 Td
+[(d)10(a)-12(t)17(i)]TJ
+0.80832 -1.25 Td
+(?)Tj
+5.1 2.25 Td
+[(No)]TJ
+-3.89166 -6.45 Td
+[(S)10(\354)]TJ
+-4.27084 -5.57084 Td
+[(E)7(l)-14(a)-12(b)10(o)-14(r)-5(a)-12(z)-17(i)-14(o)-13(n)9(e)]TJ
+15.2625 11.0125 Td
+[(P)20(u)8(l)-13(i)-14(z)-17(i)-14(a)]TJ
+ET
+4.945 149.543 m 2.336 149.543 0.223 147.43 0.223 144.82 c 0.223 114.145
+ l 0.223 111.535 2.336 109.418 4.945 109.418 c 79.969 109.418 l 82.574 109.418
+ 84.691 111.535 84.691 114.145 c 84.691 144.82 l 84.691 147.43 82.574 149.543
+ 79.969 149.543 c 4.945 149.543 l S
+144.965 39.297 m 142.352 39.297 140.234 37.238 140.234 34.699 c 140.234
+ 4.848 l 140.234 2.309 142.352 0.25 144.965 0.25 c 220.035 0.25 l 222.648
+ 0.25 224.766 2.309 224.766 4.848 c 224.766 34.699 l 224.766 37.238 222.648
+ 39.297 220.035 39.297 c 144.965 39.297 l S
+180.824 49.602 m 182.715 42.043 l 184.605 49.602 l 180.824 49.602 l f*
+Q Q
+showpage
+%%Trailer
+end restore
+%%EOF
diff --git a/gawk-5.0.1/doc/it/flusso-elaborazione.fig b/gawk-5.0.1/doc/it/flusso-elaborazione.fig
new file mode 100644
index 00000000000..50c9a209d81
--- /dev/null
+++ b/gawk-5.0.1/doc/it/flusso-elaborazione.fig
@@ -0,0 +1,37 @@
+#FIG 3.2  Produced by xfig version 3.2.5c
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
+	 4819 3540 5460 4181 6101 3540 5460 2899 4819 3540
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 3960 3555 4770 3555
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 6165 3555 6975 3555
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5
+	 7020 3240 7020 3881 8369 3881 8369 3240 7020 3240
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5490 4230 5490 5040
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	1 1 1.00 60.00 120.00
+	 4905 5355 4275 5355 4275 3600
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 3915 3870 3915 3330 1935 3330 1935 3870 3915 3870
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 6345 5670 6345 4995 4950 4995 4950 5670 6345 5670
+4 0 0 50 -1 0 12 0.0000 4 135 450 5265 3885     ?\001
+4 0 0 50 -1 0 12 0.0000 4 135 180 6210 3465 No\001
+4 0 0 50 -1 0 12 0.0000 4 135 540 5265 3375 Ancora\001
+4 0 0 50 -1 0 12 0.0000 4 135 360 5265 3630 dati\001
+4 0 0 50 -1 0 12 0.0000 4 135 630 7290 3600 Pulizia\001
+4 0 0 50 -1 0 12 0.0000 4 135 1080 5130 5400 Elaborazione\001
+4 0 0 50 -1 0 12 0.0000 4 135 1440 2205 3645 Inizializzazione\001
+4 0 0 50 -1 0 12 0.0000 4 135 270 5535 4455 Si'\001
diff --git a/gawk-5.0.1/doc/it/flusso-elaborazione.pdf b/gawk-5.0.1/doc/it/flusso-elaborazione.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..e7fb8555656e2ad64da4f11abbc2b9ee97c76dc6
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/flusso-elaborazione.png b/gawk-5.0.1/doc/it/flusso-elaborazione.png
new file mode 100644
index 0000000000000000000000000000000000000000..4dc9590267dfade8959ea5541ded571633189e5f
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/flusso-elaborazione.txt b/gawk-5.0.1/doc/it/flusso-elaborazione.txt
new file mode 100644
index 00000000000..87a5b439234
--- /dev/null
+++ b/gawk-5.0.1/doc/it/flusso-elaborazione.txt
@@ -0,0 +1,11 @@
+                                _______
++------------------+           / Ancora\  No       +---------+
+| Inizializzazione | -------> <   dati  > -------> | Pulizia |
++------------------+    ^      \   ?   /           +---------+
+                        |       +--+--+
+                        |          | Sì
+                        |          |
+                        |          V
+                        |  +--------------+
+                        +--+ Elaborazione |
+                           +--------------+
diff --git a/gawk-5.0.1/doc/it/gawk.1 b/gawk-5.0.1/doc/it/gawk.1
new file mode 100644
index 00000000000..bcc0c596c62
--- /dev/null
+++ b/gawk-5.0.1/doc/it/gawk.1
@@ -0,0 +1,4271 @@
+.\"Traduzione di Giuseppe Guerrini <giusguerrini@racine.ra.it>
+.\"Novembre 1996 - da vers. 3.0.2
+.\"
+.\"Aggiornamento e revisione:
+.\"	Antonio Giovanni Colombo <azc100@gmail.com>
+.\"	Marco Curreli <marcocurreli@tiscali.it>
+.\"Febbraio 2014 - da versione 4.0.1e
+.\"Aggiornam. a gawk-4.1.2 di Antonio G. Colombo - Aprile 2015
+.\"Aggiornam. a gawk-4.1.3 di Marco Curreli - revis. A.G. Colombo - Giugno 2016
+.\"Aggiornam. a gawk-4.2.0 di A.G. Colombo - revis. M. Curreli - Dicembre 2017
+.\"Aggiornam. a gawk-4.2.1 di A.G. Colombo - revis. M. Curreli - Febbraio 2018
+.\"Aggiornam. a gawk-4.2.2 di A.G. Colombo - revis. M. Curreli - Dicembre 2018
+
+.ds PX \s-1POSIX\s+1
+.ds UX \s-1UNIX\s+1
+.ds GN \s-1GNU\s+1
+.ds AK \s-1AWK\s+1
+.ds EP \fIGAWK: Effective AWK Programming\fP
+.if !\n(.g \{\
+.	if !\w|\*(lq| \{\
+.		ds lq ``
+.		if \w'\(lq' .ds lq "\(lq
+.	\}
+.	if !\w|\*(rq| \{\
+.		ds rq ''
+.		if \w'\(rq' .ds rq "\(rq
+.	\}
+.\}
+.TH GAWK 1 "Nov 29 2018" "Free Software Foundation" "Utility Commands"
+.SH NOME
+gawk \- linguaggio per il riconoscimento e il trattamento di espressioni
+regolari
+.SH SINTASSI
+.B gawk
+[ opzioni in stile \*(PX o \*(GN ]
+.B \-f
+.I file di programma
+[
+.B \-\^\-
+] file .\|.\|.
+.br
+.B gawk
+[ opzioni in stile \*(PX o \*(GN ]
+[
+.B \-\^\-
+]
+.I testo del programma
+file .\|.\|.
+.SH DESCRIZIONE
+.I Gawk
+� l'implementazione nell'ambito del Progetto \*(GN del linguaggio di
+programmazione \*(AK .  Si attiene alla definizione del linguaggio descritta
+nello standard \*(PX 1003.1.
+Questa versione � basata a sua volta sulla descrizione contenuta in
+.IR "The AWK Programming Language" ,
+di Aho, Kernighan e Weinberger.
+.I Gawk
+fornisce le funzionalit� aggiuntive presenti nella versione corrente
+di
+.I awk
+ di Brian Kernighan e numerose estensioni specifiche di \*(GN.
+.PP
+La riga di comando contiene opzioni per
+.I gawk
+stesso, il testo del programma \*(AK (se non � stato fornito con le opzioni
+.B \-f
+o
+.BR \-i ),
+e valori da rendere disponibili
+nelle variabili \*(AK predefinite
+.B ARGC
+e
+.BR ARGV .
+.PP
+Quando
+.I gawk
+� invocato con l'opzione
+.BR \-\^\-profile ,
+inizia a raccogliere statistiche sul comportamento del programma
+durante l'esecuzione.
+.I Gawk
+in questa modalit� � pi� lento, e produce automaticamente un profilo di
+esecuzione nel file
+.B awkprof.out
+alla fine dell'esecuzione.
+Si veda l'opzione
+.B \-\^\-profile
+pi� avanti.
+.PP
+.I Gawk
+ha anche una capacit� integrata di debugging.  Una sessione interattiva di
+analisi degli errori (debug) pu� essere iniziata fornendo l'opzione
+.B \-\^\-debug
+sulla riga di comando.  In questa modalit� di esecuzione,
+.I gawk
+carica il
+codice sorgente di AWK e poi richiede l'inserimento di comandi di debug.
+.I Gawk
+pu� analizzare solo il sorgente di un programma AWK fornito tramite l'opzione
+.BR \-f .
+Il debugger � documentato in \*(EP.
+.SH FORMATO DELLE OPZIONI
+.PP
+Le opzioni di
+.I Gawk
+possono essere sia nella tradizionale forma a una lettera di \*(PX,
+sia nella forma estesa tipica di \*(GN.  Le opzioni \*(PX cominciano con un
+\*(lq\-\*(rq singolo, quelle in forma lunga cominciano con \*(lq\-\^\-\*(rq.
+Sono disponibili opzioni in forma lunga sia per le funzionalit� specifiche
+di \*(GN, sia per quelle previste da \*(PX.
+.PP
+Le opzioni specifiche di
+.I Gawk
+sono usate normalmente nella forma lunga.
+Gli argomenti delle opzioni in forma lunga possono essere uniti ad esse
+da un segno
+.BR =,
+senza spazi, oppure sono indicati nel successivo
+argomento della riga di comando.
+Le opzioni lunghe possono essere abbreviate, sempre che l'abbreviazione
+rimanga univoca.
+.PP
+In aggiunta, ogni opzione lunga ha una corrispondente opzione corta, in modo
+che la funzionalit� dell'opzione possa essere usata all'interno di script
+.B #!
+eseguibili.
+.SH OPZIONI
+.PP
+.I Gawk
+accetta le seguenti opzioni.
+Le opzioni standard sono elencate per prime, seguite dalle opzioni per le
+estensioni
+.IR gawk ,
+elencate nell'ordine alfabetico delle opzioni corte.
+.TP
+.PD 0
+.BI \-f " file_di_programma"
+.TP
+.PD
+.BI \-\^\-file " file_di_programma"
+Legge il sorgente del programma \*(AK dal file
+.IR file_di_programma ,
+invece che dal primo argomento della riga di comando.
+Si possono specificare pi� opzioni
+.B \-f
+(o
+.BR \-\^\-file ).
+.TP
+.PD 0
+.BI \-F " fs"
+.TP
+.PD
+.BI \-\^\-separatore_di_campo " fs"
+Usa
+.I fs
+come separatore di campo in input (il valore della variabile predefinita
+.BR FS ).
+.TP
+.PD 0
+\fB\-v\fI var\fB\^=\^\fIval\fR
+.TP
+.PD
+\fB\-\^\-assign \fIvar\fB\^=\^\fIval\fR
+Assegna il valore
+.I val
+alla variabile
+.IR var ,
+prima che inizi l'esecuzione del programma.
+Questi valori delle variabili sono messi a disposizione della regola
+.B BEGIN
+di un programma \*(AK.
+.TP
+.PD 0
+.B \-b
+.TP
+.PD
+.B \-\^\-characters\-as\-bytes
+Tratta tutti i dati in input come caratteri costituiti da un solo byte.  In
+altre parole, non presta alcuna attenzione alle informazioni sulla
+localizzazione quando tenta di elaborare stringhe come caratteri multibyte.
+L'opzione
+.B "\-\^\-posix"
+ignora questo comportamento.
+.bp
+.TP
+.PD 0
+.B \-c
+.TP
+.PD
+.B \-\^\-traditional
+Viene eseguito in modalit�
+.IR compatibile .
+In questa modalit�,
+.I gawk
+si comporta esattamente come
+.I awk
+di Brian Kernighan;
+non viene riconosciuta nessuna delle estensioni specifiche di \*(GN.
+.\" L'uso di
+.\" .B \-\^\-traditional
+.\" � da preferirsi alle altre forme di questa opzione.
+Si veda
+.BR "ESTENSIONI GNU" ,
+pi� avanti, per maggiori informazioni.
+.TP
+.PD 0
+.B \-C
+.TP
+.PD
+.B \-\^\-copyright
+Stampa sullo standard output la versione sintetica del messaggio di
+informazione sul copyright \*(GN ed esce senza segnalare errori.
+.TP
+.PD 0
+\fB\-d\fR[\fIfile\fR]
+.TP
+.PD
+\fB\-\^\-dump-variables\fR[\fB=\fIfile\fR]
+Stampa un lista ordinata di variabili globali, specificandone il tipo e il valore
+finale in
+.IR file .
+Se
+.I file
+non viene specificato,
+.I gawk
+usa un file chiamato
+.B awkvars.out
+nella directory corrente.
+.sp .5
+Avere una lista di tutte le variabili globali � un buon modo per cercare
+errori tipografici nei programmi.
+Quest'opzione potrebbe essere usata anche se si ha un grosso programma con 
+tantissime funzioni, e ci si vuole assicurare che le funzioni non usino
+inavvertitamente variabili globali che sono supposte essere locali
+(� facile commettere questo errore quando si usano nomi di variabili
+semplici come
+.BR i ,
+.BR j ,
+e cos� via).
+.TP
+.PD 0
+\fB\-D\fR[\fIfile\fR]
+.TP
+.PD
+\fB\-\^\-debug\fR[\fB=\fIfile\fR]
+Abilita il debugging di programmi \*(AK.
+Per default, l'analizzatore di errori [debugger] legge i comandi
+in maniera interattiva dalla tastiera (standard input).
+L'argomento opzionale
+.I file
+specifica un file contenente un elenco di comandi
+per il debugger da eseguire in maniera non interattiva.
+.TP
+.PD 0
+.BI "\-e " testo_del_programma
+.TP
+.PD
+.BI \-\^\-source " testo_del_programma"
+Usa
+.I testo_del_programma
+come codice sorgente del programma \*(AK.
+Quest'opzione permette di combinare in modo semplice funzioni di libreria
+(usate attraverso i file indicati dalle opzioni
+.B \-f
+e
+.BR \-i )
+con codice sorgente immesso sulla riga di comando.
+� rivolta principalmente a programmi  \*(AK di media e grande dimensione
+usati all'interno di script di shell.
+.TP
+.PD 0
+.BI "\-E " file
+.TP
+.PD
+.BI \-\^\-exec " file"
+Simile a
+.BR \-f ,
+comunque, quest'opzione � l'ultima ad essere elaborata.
+Dovrebbe essere usata con script
+.BR #! ,
+specialmente per applicazioni CGI [Common Gateway Interface], per evitare
+di passare opzioni o codice (!) sulla riga di comando
+da un URL.
+Quest'opzione disabilita gli assegnamenti di variabile da riga di comando.
+.TP
+.PD 0
+.B \-g
+.TP
+.PD
+.B \-\^\-gen\-pot
+Esamina e analizza il programma \*(AK, e genera un file in formato \*(GN
+.B \&.pot
+(Portable Object Template)
+sullo standard output con elementi relativi a tutte le stringhe localizzabili
+nel programma.  Il programma in s� non viene eseguito.
+Si veda la distribuzione \*(GN
+.I gettext
+per maggiori informazioni sui file
+.BR \&.pot .
+.TP
+.PD 0
+.B \-h
+.TP
+.PD
+.B \-\^\-help
+Scrive sullo standard output un riassunto abbastanza breve delle
+opzioni disponibili.
+(In linea con le convenzioni di codifica
+.IR "GNU Coding Standards" ,
+queste opzioni provocano un'uscita immediata e senza segnalazione di errore.
+.TP
+.PD 0
+.BI "\-i " include-file
+.TP
+.PD
+.BI \-\^\-include " include-file"
+Carica una libreria di sorgenti awk.
+Cerca la libreria usando la variabile d'ambiente
+.BR AWKPATH .
+Se la ricerca iniziale non va a buon fine, viene
+fatto un altro tentativo dopo aver aggiunto il suffisso
+.BR \&.awk .
+Il file verr� caricato solo una volta
+(cio� vengono ignorati i duplicati), e il codice non costituisce
+il sorgente del programma principale.
+.TP
+.PD 0
+.BI "\-l " lib
+.TP
+.PD
+.BI \-\^\-load " lib"
+Carica un'estensione
+.I gawk
+dalla libreria condivisa
+.IR lib .
+Cerca la libreria usando la variabile d'ambiente
+.BR AWKLIBPATH .
+Se la ricerca iniziale non va a buon fine, viene
+fatto un altro tentativo dopo aver aggiunto il suffisso della libreria
+condivisa predefinita per la piattaforma.
+La procedura di inizializzazione della libreria si suppone avere come nome
+.BR dl_load() .
+.TP
+.PD 0
+.BR "\-L " [ \fIvalore\fR ]
+.TP
+.PD
+.BR \-\^\-lint [ =\fIvalore\fR ]
+Emette messaggi d'avvertimento relativi a costrutti dubbi o non portabili
+su altre implementazioni di \*(AK.
+Con l'argomento opzionale
+.BR fatal ,
+gli avvertimenti lint sono considerati come errori fatali.
+Questo pu� essere drastico, ma incoragger� sicuramente
+lo sviluppo di programmi \*(AK pi� corretti.
+Con l'argomento opzionale
+.BR invalid ,
+vengono emessi solo gli avvertimenti relativi a quello che �
+effettivamente non valido (funzionalit� non ancora completamente implementata).
+.TP
+.PD 0
+.B \-M
+.TP
+.PD
+.B \-\^\-bignum
+Forza il calcolo con precisione arbitraria sui numeri.  Quest'opzione
+non ha effetto se
+.I gawk
+non � compilato per l'uso delle librerie GNU MPFR e MP.
+(In tal caso,
+.I gawk
+invia un messaggio di avvertimento.)
+.TP
+.PD 0
+.B \-n
+.TP
+.PD
+.B "\-\^\-non\-decimal\-data"
+Riconosce valori ottali ed esadecimali nei dati in input.
+.I "Usare quest'opzione con molta cautela!"
+.TP
+.PD 0
+.B \-N
+.TP
+.PD
+.B \-\^\-use\-lc\-numeric
+Forza
+.I gawk
+a usare il carattere di separazione decimale della localizzazione quando
+analizza i dati in input.  Sebbene lo standard POSIX richieda questo
+comportamento, e
+.I gawk
+faccia questo quando l'opzione
+.B \-\^\-posix
+� attiva, il comportamento predefinito � quello tradizionale di usare
+il punto come separatore decimale, anche per le localizzazioni in cui
+il carattere di separazione non � il punto.  Quest'opzione ignora il
+comportamento predefinito, senza il rigore draconiano dell'opzione
+.BR \-\^\-posix .
+.ig
+.\" Quest'opzione � lasciata intenzionalmente non documentata.
+.TP
+.PD 0
+.B "\-W nostalgia"
+.TP
+.PD
+.B \-\^\-nostalgia
+Fornisce momenti di nostalgia per gli utenti di
+.I awk
+di vecchia data.
+..
+.TP
+.PD 0
+\fB\-o\fR[\fIfile\fR]
+.TP
+.PD
+\fB\-\^\-pretty-print\fR[\fB=\fIfile\fR]
+Stampa una versione formattata graziosamente del programma su
+.IR file .
+Se non viene indicato un
+.IR file ,
+.I gawk
+usa un file di nome
+.B awkprof.out
+nella directory corrente.
+Sottintende
+.BR \-\^\-no\-optimize .
+.TP
+.PD 0
+.B \-O
+.TP
+.PD
+.B \-\^\-optimize
+Abilita le ottimizzazioni predefinite di
+.IR gawk
+nella rappresentazione interna del programma.
+Attualmente, questo comprende il semplice calcolo delle costanti.
+Quest'opzione � attiva in modo predefinito.
+.TP
+.PD 0
+\fB\-p\fR[\fIprof-file\fR]
+.TP
+.PD
+\fB\-\^\-profile\fR[\fB=\fIprof-file\fR]
+Inizia una sessione di "profiling", e invia i dati tracciati al file
+.IR prof-file .
+Quello predefinito �
+.BR awkprof.out .
+Il profilo contiene il numero di esecuzioni di ogni istruzione sul margine
+sinistro e il conteggio delle chiamate di funzione per ogni funzione definita
+dall'utente.
+Sottindende
+.BR \-\^\-no\-optimize .
+.TP
+.PD 0
+.B \-P
+.TP
+.PD
+.B \-\^\-posix
+Quest'opzione attiva la modalit� di
+.IR compatibilit� ,
+con le seguenti restrizioni aggiuntive:
+.RS
+.TP "\w'\(bu'u+1n"
+\(bu
+Le sequenze di protezione
+.B \ex
+non vengono riconosciute.
+.TP
+\(bu
+Non � possibile continuare le righe dopo
+.B ?
+e
+.BR : .
+.TP
+\(bu
+Non viene riconosciuto il sinonimo
+.B func
+per la parola chiave
+.BR function .
+.TP
+\(bu
+Non si possono usare gli operatori
+.B **
+e
+.B **=
+al posto di
+.B ^
+e
+.BR ^= .
+.RE
+.TP
+.PD 0
+.B \-r
+.TP
+.PD
+.B \-\^\-re\-interval
+Abilita l'uso di
+.I "espressioni di intervallo"
+nelle espressioni regolari
+(vedere
+.BR "Espressioni regolari" ,
+pi� avanti).
+Nel linguaggio \*(AK le espressioni di intervallo non sono
+mai state disponibili.  Lo standard \*(PX le ha aggiunte, per rendere
+.I awk
+ed
+.I egrep
+coerenti tra di loro.  Sono abilitate in modalit� predefinita, per� quest'opzione
+rimane per essere usata con l'opzione
+.BR \-\^\-traditional .
+.TP
+.PD 0
+.B \-s
+.TP
+.PD
+.B \-\^\-no\-optimize
+Disabilita le ottimizzazioni predefinite di
+.I gawk
+nella rappresentazione interna del programma.
+.TP
+.PD 0
+.B \-S
+.TP
+.PD
+.B \-\^\-sandbox
+Esegue
+.I gawk
+in modalit� "sandbox", disabilitando la funzione
+.BR system() ,
+la ridirezione dell'input con
+.BR getline ,
+la ridirezione sull'output con
+.BR print " e " printf ,
+e il caricamento delle estensioni dinamiche.
+L'esecuzione di comandi (tramite pipeline) � anch'essa disabilitata.
+Questo impedisce completamente l'accesso di uno script alle risorse locali,
+tranne che per i file specificati nella riga di comando.
+.TP
+.PD 0
+.B \-t
+.TP
+.PD
+.B \-\^\-lint\-old
+Emette messaggi d'avvertimento relativi a costrutti non portabili
+sulla versione originale di
+.I awk
+per \*(UX.
+.TP
+.PD 0
+.B \-V
+.TP
+.PD
+.B \-\^\-version
+Scrive sullo standard output la versione di questa particolare copia di
+.IR gawk .
+� utile principalmente per sapere se la copia di
+.I gawk
+attualmente installata � aggiornata
+rispetto a ci� che Free Software Foundation sta distribuendo.
+� utile anche quando si devono segnalare degli errori.
+(In linea con le convenzioni di codifica
+.IR "GNU Coding Standards" ,
+queste opzioni provocano un'uscita immediata e senza segnalazione
+di errore.)
+.TP
+.B \-\^\-
+Segnala la fine delle opzioni. � utile perch� permette di passare al programma
+\*(AK ulteriori argomenti [nomi di file] che iniziano con \*(lq\-\*(rq.
+Questo assicura una coerenza con le convenzioni di esame degli argomenti
+usato dalla maggior parte dei programmi \*(PX .
+.PP
+In modalit� compatibile, qualsiasi altra opzione � contrassegnata come non
+valida e viene ignorata.  Nell'uso normale, sempre che sia stato
+fornito il testo del programma, le opzioni sconosciute sono passate al programma
+\*(AK nel vettore
+.B ARGV
+per l'elaborazione.  Questo � particolarmente utile per eseguire i programmi
+\*(AK attraverso il meccanismo dell'interprete eseguibile
+.BR #! .
+.PP
+Per compatibilit� con \*(PX, si pu� usare l'opzione
+.BR \-W ,
+seguita dal nome di un'opzione lunga.
+.SH ESECUZIONE DEL PROGRAMMA AWK
+.PP
+Un programma \*(AK consiste di una sequenza di
+direttive opzionali,
+istruzioni di tipo criterio-azione
+e definizioni di funzione opzionali.
+.RS
+.PP
+\fB@include "\fInome_del_file\fB"
+.br
+\fB@load "\fInome_del_file\fB"
+.br
+\fIcriterio di ricerca\fB	{ \fIistruzioni di azione\fB }\fR
+.br
+\fBfunction \fInome\fB(\fIlista di parametri\fB) { \fIistruzioni\fB }\fR
+.RE
+.PP
+.I Gawk
+prima legge il codice del programma dal/dai
+.IR file_di_programma
+se specificato/i,
+dagli argomenti passati a
+.BR \-\^\-source ,
+o dal primo argomento sulla riga di comando che non sia un'opzione.
+Le opzioni
+.B \-f
+e
+.B \-\^\-source
+possono essere usate pi� volte nella riga di comando.
+.I Gawk
+legge il testo del programma come se tutti i
+.I file_di_programma
+e i testi sorgenti della riga di comando fossero concatenati.  Questo permette
+di realizzare librerie di funzioni \*(AK senza bisogno di includerle in ogni
+nuovo programma \*(AK che le usi; inoltre si possono combinare funzioni di
+libreria con programmi provenienti dalla riga di comando.
+.PP
+Oltre a ci�, le righe che iniziano con
+.B @include
+possono essere usate per includere altri file sorgenti nel programma,
+rendendo l'uso della libreria ancora pi� facile.  Questo � equivalente
+all'uso dell'opzione
+.BR \-i .
+.PP
+Le righe che iniziano con
+.B @load
+possono essere usate per caricare funzioni di estensione nel programma.  Questo �
+equivalente all'uso dell'opzione
+.BR \-l .
+.PP
+La variabile d'ambiente
+.B AWKPATH
+specifica il percorso lungo il quale cercare i file sorgenti
+indicati con le opzioni
+.B \-f
+e
+.BR \-i .
+Se questa variabile non esiste, il percorso predefinito �
+\fB"/usr/local/share/awk"\fR
+(la directory in questione pu� variare a seconda di come
+.I gawk
+� stato compilato e installato).
+Se un nome di file dato con l'opzione
+.B \-f
+contiene un carattere \*(lq/\*(rq, non viene eseguita nessuna ricerca
+sul percorso.
+.PP
+La variabile d'ambiente
+.B AWKLIBPATH
+specifica il percorso lungo il quale cercare i file sorgenti
+indicati con l'opzione
+.BR \-l ,
+Se questa variabile non esiste, il percorso predefinito �
+\fB"/usr/local/lib/gawk"\fR
+(la directory in questione pu� variare a seconda di come
+.I gawk
+� stato compilato e installato).
+.PP
+.I Gawk
+esegue i programmi \*(AK nell'ordine seguente.
+Per prima cosa,
+vengono effettuati tutti gli assegnamenti di variabile indicati dall'opzione
+.BR \-v .
+Successivamente,
+.I gawk
+compila il programma in un formato interno.
+Poi
+.I gawk
+esegue il codice nella regola/e
+.B BEGIN
+(se esistente/i),
+quindi procede con la lettura di ciascun file indicato nel vettore
+.B ARGV
+(fino a
+.BR ARGV[ARGC\-1] ).
+Se non ci  sono file indicati nella riga di comando,
+.I gawk
+legge dallo standard input.
+.PP
+Se un nome di file nella riga di comando ha la forma
+.IB var = val,
+� trattato come un assegnamento di variabile.  Alla variabile
+.I var
+sar� assegnato il valore
+.I val
+(questo accade dopo che ogni regola
+.B BEGIN
+� stata eseguita).
+L'assegnamento di variabili da riga di comando
+� utilissima per assegnare dinamicamente valori alle variabili
+che \*(AK usa per controllare come l'input � organizzato in campi e record.
+� utile inoltre per controllare variabili di stato
+quando siano necessari pi� passi di elaborazione su un singolo file di dati.
+.PP
+Se il valore di un particolare elemento di
+.B ARGV
+� la stringa vuota (\fB""\fR),
+.I gawk
+lo salta.
+.PP
+Per ogni file in input,
+se esiste una regola
+.BR BEGINFILE ,
+.I gawk
+esegue il codice associato
+prima di elaborare il contenuto del file.  Similarmente,
+.I gawk
+esegue
+il codice associato a
+.B ENDFILE
+dopo l'elaborazione del file.
+.PP
+Per ogni record in input,
+.I gawk
+controlla se c'� corrispondenza con qualche
+.I "criterio di ricerca"
+specificato nel programma \*(AK.
+Per ogni criterio di ricerca a cui un record corrisponde,
+.I gawk
+esegue
+.RI l' azione
+associata.  I criteri di ricerca sono verificati nell'ordine in cui appaiono nel programma.
+.PP
+Infine, dopo che sono esauriti i dati in input,
+.I gawk
+esegue il codice nelle regola/e
+.B END
+(se esistente/i),
+.SS Directory nella riga di comando
+.PP
+Secondo POSIX, i file indicati sulla riga di comando di
+.I awk
+devono essere file di testo.
+Se non lo sono il comportamento � ``indefinito''.  La maggior parte delle
+versioni di
+.I awk
+considerano una directory sulla riga di comando come un errore fatale.
+.PP
+A partire dalla versione 4.0 di
+.IR gawk ,
+una directory sulla riga di comando produce solo un messaggio di avvertimento,
+senza conseguenze.  Se sono date le opzioni
+.B \-\^\-posix
+o
+.B \-\^\-traditional
+.I gawk
+ritorna a trattare le directory sulla riga di comando come errore fatale.
+.SH VARIABILI, RECORD E CAMPI
+Le variabili di \*(AK sono dinamiche; iniziano a esistere
+la prima volta che vengono usate.  I loro valori sono numeri in virgola
+mobile, o stringhe, o entrambe le cose, a seconda di come sono usati la prima volta.
+Inoltre,
+.I gawk
+consente di avere variabili di tipo "espressione regolare".
+\*(AK ha anche vettori monodimensionali; i vettori multidimensionali
+possono essere simulati [da vettori monodimensionali].
+.I Gawk
+fornisce veri vettori di vettori; vedere
+.BR Vettori ,
+pi� avanti.  Al momento dell'esecuzione del programma sono impostate parecchie
+variabili predefinite; saranno descritte di volta in volta quando sar�
+necessario, ed elencate pi� avanti.
+.SS Record
+Normalmente i record sono separati dal carattere newline.  Si pu� controllare il
+modo in cui i record sono separati assegnando valori alla variabile predefinita
+.BR RS .
+Se
+.B RS
+contiene un qualsiasi carattere singolo, tale carattere separa i record.
+Altrimenti, se
+.B RS
+� un'espressione regolare, il testo nell'input che corrisponde a questa
+espressione regolare sar� il separatore di record.
+Tuttavia, nella modalit� compatibile
+� preso in considerazione solo il primo carattere della stringa risultante,
+come separatore.
+Se
+.B RS
+contiene la stringa nulla, i record sono separati da righe vuote.
+Quando
+.B RS
+contiene la stringa nulla, il carattere newline ha sempre la funzione
+di separatore di campo in aggiunta a quello indicato dalla variabile
+.BR FS ,
+quale che esso sia.
+.SS Campi
+.PP
+Ogni volta che
+.I gawk
+legge un record lo spezza in
+.IR campi ,
+usando il valore della variabile
+.B FS
+come separatore di campo.
+Se
+.B FS
+� un carattere singolo, i campi sono separati da quel carattere.
+Se
+.B FS
+� la stringa nulla, ogni singolo carattere diventa un
+campo a s�.
+Diversamente, si presume che
+.B FS
+sia un'espressione regolare
+completa.
+Nel caso particolare in cui
+.B FS
+sia un singolo spazio, i campi sono separati da sequenze di spazi, caratteri di
+tabulazione o newline.
+.BR NOTA :
+Il valore di
+.B IGNORECASE
+(vedi pi� avanti) influenza anche il modo in cui i campi sono spezzati quando
+.B FS
+� un'espressione regolare, e come i record vengano separati quando
+.B RS
+� un'espressione regolare.
+.PP
+Se alla variabile
+.B FIELDWIDTHS
+� assegnata una lista di numeri separati da spazi,
+ogni campo � considerato di larghezza fissa, e
+.I gawk
+spezza il record secondo le larghezze specificate.
+Ogni larghezza di campo pu� opzionalmente essere preceduta da
+un valore, separato da una virgola, che specifica il numero di
+caratteri da saltare prima di posizionarsi all'inizio del campo.
+Il valore di
+.B FS
+� ignorato.
+Assegnando un nuovo valore a
+.B FS
+o a
+.B FPAT
+si annulla l'effetto di
+.BR FIELDWIDTHS .
+.PP
+Similmente, se alla variabile
+.B FPAT
+� assegnata una stringa che rappresenta un'espressione regolare,
+ogni campo � composto di testo che corrisponde a quella espressione regolare.
+In questo caso, l'espressione regolare descrive i campi stessi, invece che il
+testo che separa i campi.
+Assegnando un nuovo valore a
+.B FS
+o a
+.B FIELDWIDTHS
+si annulla l'effetto di
+.BR FPAT .
+.PP
+Ogni campo nel record in input pu� essere individuato dalla sua posizione:
+.BR $1 ,
+.BR $2 ,
+e cos� via.
+.B $0
+� l'intero record.
+Non � necessario che i campi siano indicati da costanti:
+.RS
+.PP
+.ft B
+n = 5
+.br
+print $n
+.ft R
+.RE
+.PP
+stampa il quinto campo del record in input.
+.PP
+La variabile
+.B NF
+contiene il numero di campi nel record in input.
+.PP
+Riferimenti a campi inesistenti (cio� campi dopo
+.BR $NF )
+producono la stringa vuota.  Tuttavia, l'assegnamento ad un campo inesistente
+(per esempio
+.BR "$(NF+2) = 5" )
+provoca l'incremento del valore di
+.BR NF ,
+crea tutti i campi intermedi assegnando loro la stringa nulla, e fa s�
+che il valore di 
+.B $0
+sia ricalcolato utilizzando
+.B OFS
+per separare i campi.  Riferimenti a campi con indice negativo producono un
+errore fatale.  Il decremento di
+.B NF
+provoca la perdita dei campi di indice superiore al valore impostato, ed il
+ricalcolo di
+.BR $0 ,
+utilizzando
+.B OFS
+per separare i campi.
+.PP
+L'assegnamento di un valore a un campo esistente
+provoca la ricostruzione dell'intero record quando si faccia riferimento a
+.BR $0 .
+Analogamente, assegnare un valore a
+.B $0
+provoca una nuova divisione del record, creando nuovi
+valori per i suoi campi.
+.SS Variabili predefinite
+.PP
+Le variabili predefinite di
+.IR gawk " sono:
+.PP
+.TP "\w'\fBFIELDWIDTHS\fR'u+1n"
+.B ARGC
+Il numero di argomenti da riga di comando (non include le opzioni di
+.I gawk
+o il sorgente del programma).
+.TP
+.B ARGIND
+L'indice in
+.B ARGV
+del file correntemente in elaborazione.
+.TP
+.B ARGV
+Vettore degli argomenti della riga di comando.  Il vettore � indicizzato da
+0 ad
+.B ARGC
+\- 1.
+La modifica dinamica del contenuto di
+.B ARGV
+pu� controllare i file usati per i dati.
+.TP
+.B BINMODE
+Su sistemi non-POSIX, specifica l'uso della modalit� \*(lqbinaria\*(rq per tutti
+i file I/O.  I valori numerici 1, 2 e 3 specificano che i file di input, i file
+di output e tutti i file, rispettivamente, dovrebbero usare I/O binari.  I
+valori di stringa \fB"r"\fR e \fB"w"\fR specificano che i file di input e i file
+di output, rispettivamente, dovrebbero usare I/O binari.  I valori di stringa
+\fB"rw"\fR e \fB"wr"\fR specificano che tutti i file dovrebbero usare I/O
+binari.  Qualsiasi altro valore di stringa � trattato come \fB"rw"\fR, ma genera
+un messaggio di avvertimento.
+.TP
+.B CONVFMT
+Il formato di conversione dei numeri, quello predefinito � \fB"%.6g"\fR.
+.TP
+.B ENVIRON
+Un vettore contenente i valori dell'ambiente corrente.  Il vettore � indicizzato
+dalle variabili d'ambiente, e ogni elemento � il valore di quella variabile
+(per esempio, \fBENVIRON["HOME"]\fP potrebbe essere
+\fB"/home/arnold"\fR).
+.sp
+In modalit� POSIX,
+la modifica di questo vettore non ha effetto sull'ambiente ereditato dai
+programmi che
+.I gawk
+esegue per ridirezione o tramite la funzione
+.BR system() .
+Altrimenti,
+.I gawk
+aggiorna il suo ambiente reale in modo che i programmi che eredita vedano
+le modifiche.
+.TP
+.B ERRNO
+Se ha luogo un errore di sistema durante una ridirezione per una
+.BR getline ,
+o durante una lettura fatta con
+.BR getline ,
+oppure in una
+.BR close() ,
+.B ERRNO
+viene impostato a
+una stringa che descrive l'errore.
+Il valore � passibile di traduzione nelle localizzazioni diverse dall'inglese.
+Se la stringa in
+.B ERRNO
+corrisponde a un errore di sistema descritto nella variabile
+.IR errno (3) ,
+il corrispondente valore numerico pu� essere trovato in
+.B PROCINFO["errno"].
+Per errori non di sistema, l'elemento
+.B PROCINFO["errno"]
+varr� zero.
+.TP
+.B FIELDWIDTHS
+Una lista di dimensioni di campo separate da spazi. Se impostato,
+.I gawk
+suddivide l'input secondo campi di larghezza fissa, anzich� usare il valore
+della variabile
+.B FS
+come separatore di campo.
+Ogni larghezza di campo pu� opzionalmente essere preceduta da
+un valore, separato da una virgola, che specifica il numero di
+caratteri da saltare prima di posizionarsi all'inizio del campo.
+Si veda
+.BR Campi ,
+pi� sopra.
+.TP
+.B FILENAME
+Il nome del file di input corrente.
+Se non sono specificati file nella riga di comando, il valore di
+.B FILENAME
+� \*(lq\-\*(rq.
+Tuttavia,
+.B FILENAME
+� indefinito all'interno della regola
+.B BEGIN
+(a meno che non sia impostato da
+.BR getline ).
+.TP
+.B FNR
+Il numero di record corrente del file in input corrente.
+.TP
+.B FPAT
+Un'espressione regolare che descrive il contenuto dei
+campi in un record.
+Se impostato,
+.I gawk
+suddivide l'input in campi, dove i campi corrispondono
+all'espressione regolare, invece di usare il
+valore della variabile
+.B FS
+come separatore di campo.
+Si veda
+.BR Campi ,
+pi� sopra.
+.TP
+.B FS
+Il separatore di campo, quello predefinito � uno spazio.  Si veda
+.BR Campi ,
+pi� sopra.
+.TP
+.B FUNCTAB
+Un vettore i cui indici e i corrispondenti valori
+sono i nomi di tutte le funzioni definite dall'utente
+o funzioni di estensione presenti nel programma.
+.BR NOTA :
+Si pu� non usare l'istruzione
+.B delete
+applicandola al vettore
+.BR FUNCTAB .
+.TP
+.B IGNORECASE
+Controlla la sensibilit� alla distinzione tra maiuscole e minuscole
+in tutte le espressioni regolari e nelle operazioni sulle stringhe.  Se
+.B IGNORECASE
+ha un valore diverso da zero, il confronto di stringhe e
+la ricerca di corrispondenze nei criteri di ricerca,
+la separazione di campi tramite
+.B FS
+e
+.BR FPAT ,
+la separazione di record tramite
+.BR RS ,
+la ricerca di corrispondenze nelle espressioni regolari
+con
+.B ~
+e
+.BR !~ ,
+e le funzioni predefinite
+.BR gensub() ,
+.BR gsub() ,
+.BR index() ,
+.BR match() ,
+.BR patsplit() ,
+.BR split() ,
+e
+.B sub()
+ignoreranno tutti la differenza tra maiuscole e minuscole nelle
+operazioni con le espressioni regolari.
+.BR NOTA :
+.I Non
+ha effetto sugli indici dei vettori.
+Tuttavia, sulle funzioni
+.B asort()
+e
+.B asorti()
+ha effetto.
+.sp .5
+Cos�, se
+.B IGNORECASE
+� diverso da zero,
+.B /aB/
+corrisponde a tutte queste stringhe : \fB"ab"\fP, \fB"aB"\fP, \fB"Ab"\fP,
+e \fB"AB"\fP.
+Come per tutte le variabili di \*(AK, il valore iniziale di
+.B IGNORECASE
+� zero, cosicch� tutte le operazioni sulle espressioni regolari
+e su stringhe normalmente distinguono tra maiuscole e minuscole.
+.TP
+.B LINT
+Fornisce un controllo dinamico dell'opzione
+.B \-\^\-lint
+dall'interno di un programma \*(AK.
+Quando il valore � "vero",
+.I gawk
+stampa avvertimenti lint. Quando � "falso", no.
+Assegnando il valore di stringa \fB"fatal"\fP,
+gli avvertimenti lint sono considerati errori fatali, esattamente come
+.BR \-\^\-lint=fatal .
+Qualsiasi altro valore "vero" stampa solo avvertimenti.
+.TP
+.B NF
+Il numero di campi nel record corrente.
+.TP
+.B NR
+Il numero totale di record incontrati finora.
+.TP
+.B OFMT
+Il formato d'uscita per i numeri, quello predefinito � \fB"%.6g"\fR.
+.TP
+.B OFS
+Il separatore di campi in uscita, normalmente � uno spazio.
+.TP
+.B ORS
+Il separatore di record in uscita, normalmente
+la sequenza di fine linea ("\fInewline\fR").
+.TP
+.B PREC
+La precisione di lavoro di numeri a virgola mobile con precisione arbitraria,
+53 [bit] � il valore predefinito.
+.TP
+.B PROCINFO
+Gli elementi di questo vettore forniscono accesso alle informazioni
+sul programma  \*(AK in esecuzione.
+Su alcuni sistemi,
+ci possono essere elementi nel vettore, da \fB"gruppo1"\fP a
+\fB"gruppo\fIn\fB"\fR per qualsiasi
+.IR n ,
+che � il numero di gruppi supplementari che ha il processo.
+Usare l'operatore
+.B in
+per verificare la presenza di questi elementi.
+I seguenti elementi sono sicuramente disponibili:
+.RS
+.TP \w'\fBPROCINFO["strftime"]\fR'u+1n
+\fBPROCINFO["argv"]\fP
+Gli argomenti sulla riga di comando come sono visti da
+.I gawk
+a livello di linguaggio C.
+Gli indici partono dallo zero.
+.TP
+\fBPROCINFO["egid"]\fP
+Il valore della chiamata di sistema
+.IR getegid (2).
+.TP
+\fBPROCINFO["errno"]\fP
+Il valore di
+.IR errno (3)
+quando
+.B ERRNO
+� impostato al messaggio di errore associato.
+.TP
+\fBPROCINFO["euid"]\fP
+Il valore della chiamata di sistema
+.IR geteuid (2).
+.TP
+\fBPROCINFO["FS"]\fP
+\fB"FS"\fP se la separazione in campi con
+.B FS
+� attiva,
+\fB"FPAT"\fP se la separazione in campi con
+.B FPAT
+� attiva,
+\fB"FIELDWIDTHS"\fP se la separazione in campi con
+.B FIELDWIDTHS
+� attiva,
+o \fB"API"\fP se la separazione in campi con l'analizzatore di input API
+� attiva.
+.TP
+\fBPROCINFO["gid"]\fP
+Il valore della chiamata di sistema
+.IR getgid (2).
+.TP
+\fBPROCINFO["identifiers"]\fP
+Un sottovettore, avente come indici i nomi di tutti gli identificatori usati
+nel testo del programma AWK.
+I valori indicano quello che
+.I gawk
+conosce degli identificatori dopo aver finito di analizzare il programma;
+essi
+.I non
+sono aggiornati durante l'esecuzione del programma.
+Per ogni identificatore, il valore dell'elemento � uno fra questi:
+.RS
+.TP \w'\fB"extension"\fR'u+1n
+\fB"array"\fR
+L'identificatore � un vettore.
+.TP
+\fB"builtin"\fR
+L'identificatore � una funzione predefinita.
+.TP
+\fB"extension"\fR
+L'identificatore � una funzione di estensione caricata con
+.B @load
+o
+.BR \-l .
+.TP
+\fB"scalar"\fR
+L'identificatore � uno scalare.
+.TP
+\fB"untyped"\fR
+L'identificatore non � classificato (potrebbe essere usato come scalare
+o come vettore,
+.I gawk
+ancora non lo sa).
+.TP
+\fB"user"\fR
+L'identificatore � una funzione definita dall'utente.
+.RE
+.TP
+\fBPROCINFO["platform"]\fP
+Una stringa che indica la piattaforma sulla quale
+.I gawk
+� stato compilato.  Pu� essere una delle alternative seguenti:
+.RS
+.TP
+\fB"vms"\fR
+OpenVMS o Vax/VMS.
+.TP
+\fB"macosx"\fR
+Mac OS X.
+.TP
+\fB"cygwin"\fR, \fB"djgpp"\fR, \fB"mingw"\fR
+Microsoft Windows, avendo compilato in Cygwin, DJGPP, o MinGW, rispettivamente.
+.TP
+\fB"os2"\fR
+OS/2.
+.TP
+\fB"posix"\fR
+GNU/Linux e i sistemi Unix precedenti.
+.RE
+.TP
+\fBPROCINFO["pgrpid"]\fP
+Il process group ID del processo corrente.
+.TP
+\fBPROCINFO["pid"]\fP
+L'ID di processo del processo corrente.
+.TP
+\fBPROCINFO["ppid"]\fP
+Il process ID del "padre" [parent] del processo corrente.
+.TP
+\fBPROCINFO["strftime"]\fP
+La stringa di formato data/ora predefinita per
+.BR strftime() .
+.TP
+\fBPROCINFO["uid"]\fP
+Il valore della chiamata di sistema
+.IR getuid (2).
+.TP
+\fBPROCINFO["version"]\fP
+la versione di
+.IR gawk .
+.PP
+I seguenti elementi sono presenti se � disponibile il caricamento delle
+estensioni dinamiche.
+.TP
+\fBPROCINFO["api_major"]\fP
+La versione principale dell'estensione API.
+.TP
+\fBPROCINFO["api_minor"]\fP
+La versione secondaria dell'estensione API.
+.PP
+I seguenti elementi sono disponibili se il supporto MPFR � stato
+compilato in
+.IR gawk\^ :
+.TP
+\fBPROCINFO["gmp_version"]\fP
+La versione della libreria GNU MP usata per il supporto ai numeri
+con precisione arbitraria in
+.IR gawk .
+.TP
+\fBPROCINFO["mpfr_version"]\fP
+La versione della libreria GNU MPFR usata per il supporto ai numeri
+con precisione arbitraria in
+.IR gawk .
+.TP
+\fBPROCINFO["prec_max"]\fP
+La massima precisione supportata dalla libreria GNU MPFR per i
+numeri a virgola mobile con precisione arbitraria.
+.TP
+\fBPROCINFO["prec_min"]\fP
+La minima precisione supportata dalla libreria GNU MPFR per i
+numeri a virgola mobile con precisione arbitraria.
+.PP
+I seguenti elementi possono essere impostati da un programma per
+cambiare il comportamento di
+.IR gawk :
+.TP
+\fBPROCINFO["NONFATAL"]\fR
+Se presente, gli errori di I/O per tutte le ridirezioni
+diventano non fatali.
+.TP
+\fBPROCINFO["\fInome\fB", "NONFATAL"]\fR
+Rende gli errori relativi a
+.I nome
+non fatali.
+.TP
+\fBPROCINFO["\fIcomando\fB", "pty"]\fR
+Usa una pseudo-tty per una comunicazione bidirezionale con
+.I comando
+invece di impostare due "pipe" unidirezionali.
+.TP
+\fBPROCINFO["\fIinput\fB", "READ_TIMEOUT"]\fR
+Il tempo massimo a disposizione in millisecondi per leggere i dati da
+.IR input ,
+dove
+.I input
+� una stringa di ridirezione o un nome di file.  Un valore di zero o
+o minore di zero significa nessun limite di tempo.
+.TP
+\fBPROCINFO["\fIinput\^\fB", "RETRY"]\fR
+Se un errore di I/O non fatale si verifica leggendo dati da un file di
+.IR input ,
+e questo elemento di vettore esiste,
+.B getline
+restituisce \-2 invece di restituire il valore previsto di \-1
+e di configurare
+.I l'input
+in modo da non fornire ulteriori dati.
+Un errore di I/O non fatale si verifica quando
+.IR errno (3)
+ha il valore EAGAIN, EWOULDBLOCK, EINTR o ETIMEDOUT.
+Questo pu� tornare utile nel caso si utilizzi
+\fBPROCINFO["\fIinput\^\fB", "READ_TIMEOUT"]\fR
+o in situazioni in cui un descrittore di file � stato configurato in modo
+da non bloccarsi in caso di errore.
+.TP
+\fBPROCINFO["sorted_in"]\fP
+Se questo elemento esiste in
+.BR PROCINFO ,
+il suo valore controlla l'ordine in cui gli elementi del vettore
+sono attraversati nei cicli
+.BR for .
+I valori supportati sono
+\fB"@ind_str_asc"\fR,
+\fB"@ind_num_asc"\fR,
+\fB"@val_type_asc"\fR,
+\fB"@val_str_asc"\fR,
+\fB"@val_num_asc"\fR,
+\fB"@ind_str_desc"\fR,
+\fB"@ind_num_desc"\fR,
+\fB"@val_type_desc"\fR,
+\fB"@val_str_desc"\fR,
+\fB"@val_num_desc"\fR,
+e
+\fB"@unsorted"\fR.
+Il valore pu� essere anche il nome (come
+.IR stringa )
+di una qualsiasi funzione di confronto
+definita nel seguente modo:
+.sp
+.in +5m
+\fBfunction cmp_func(i1, v1, i2, v2)\fR
+.in -5m
+.sp
+dove
+.I i1
+e
+.I i2
+sono gli indici, e
+.I v1
+e
+.I v2
+sono i valori corrispondenti dei due elementi che si stanno confrontando.
+Dovrebbe restituire un numero minore, uguale o maggiore di 0, a seconda di come
+devono essere ordinati gli elementi del vettore.
+.TP
+.TP
+.B ROUNDMODE
+La modalit� di arrotondamento da usare per operazioni sui numeri con precisione
+arbitraria, quella predefinita � \fB"N"\fR (IEEE-754 roundTiesToEven mode).
+Sono accettati i valori
+\fB"N"\fR o \fB"n"\fR per roundTiesToEven,
+\fB"U"\fR o \fB"u"\fR per roundTowardPositive,
+\fB"D"\fR o \fB"d"\fR per roundTowardNegative,
+\fB"Z"\fR o \fB"z"\fR per roundTowardZero
+e, se la versione della libreria GNU MPFR in uso li supporta,
+\fB"A"\fR o \fB"a"\fR per arrotondamento lontano da zero (per eccesso).
+.TP
+.B RS
+Il separatore di record in input, normalmente "newline".
+.TP
+.B RT
+Il terminatore di record.
+.I Gawk
+pone
+.B RT
+uguale al testo in input che corrisponde al carattere o alla espressione
+regolare indicati in
+.BR RS .
+.TP
+.B RSTART
+L'indice del primo carattere trovato da
+.BR match() ,
+oppure 0 se non ci sono corrispondenze
+(questo implica che gli indici dei caratteri inizino da uno).
+.TP
+.B RLENGTH
+La lunghezza della stringa trovata da
+.BR match() ;
+oppure \-1 se non ci sono corrispondenze.
+.TP
+.B SUBSEP
+Il carattere usato per separare indici multipli negli elementi di un vettore,
+quello predefinito � \fB"\e034"\fR.
+.TP
+.B SYMTAB
+Un vettore i cui indici sono i nomi di tutti i vettori e le variabili 
+globali attualmente definite presenti nel programma.  Il vettore pu� essere
+usato per l'accesso indiretto in lettura e scrittura del valore di una
+variabile:
+.sp
+.ft B
+.nf
+.in +5m
+foo = 5
+SYMTAB["foo"] = 4
+print foo    # stampa 4
+.fi
+.ft R
+.in -5m
+.sp
+La funzione
+.B typeof()
+pu� essere usata per controllare se un elemento in
+.B SYMTAB
+� un vettore.
+Non � possibile usare l'istruzione
+.B delete
+per il vettore
+.B SYMTAB
+e neppure impostare elementi il cui indice non sia
+un nome di variabile.
+.TP
+.B TEXTDOMAIN
+Il dominio di testo del programma \*(AK ; usato per trovare le traduzioni
+localizzate delle stringhe del programma.
+.SS Vettori
+.PP
+I vettori hanno per indice un'espressione tra parentesi quadre
+.RB ( [ " e " ] ).
+Se l'espressione � formata da una lista di espressioni
+.RI ( expr ", " expr " .\|.\|.)"
+l'indice del vettore � una stringa ottenuta concatenando
+i valori (stringa) di ogni espressione, separati dal valore della
+variabile
+.BR SUBSEP .
+Questa modalit� � usata per simulare vettori multidimensionali.
+Per esempio:
+.PP
+.RS
+.ft B
+i = "A";\^ j = "B";\^ k = "C"
+.br
+x[i, j, k] = "hello, world\en"
+.ft R
+.RE
+.PP
+assegna la stringa \fB"hello,\ world\en"\fR all'elemento del vettore
+.B x
+che � indicizzato dalla stringa \fB"A\e034B\e034C"\fR.  In \*(AK, tutti i
+vettori sono associativi, cio� indicizzati da valori di tipo stringa.
+.PP
+L'operatore speciale
+.B in
+pu� essere usato per controllare se un vettore contiene un certo valore
+come indice.
+.PP
+.RS
+.ft B
+.nf
+if (val in vettore)
+	print vettore[val]
+.fi
+.ft
+.RE
+.PP
+Se il vettore ha indici multipli, si usi
+.BR "(i, j) in vettore" .
+.PP
+Il costrutto
+.B in
+pu� anche essere usato in un ciclo
+.B for
+per iterare su tutti gli elementi di un vettore.
+Comunque,  il costrutto
+.B "(i, j) in vettore"
+funziona solo nelle verifiche, non nei cicli
+.BR for .
+.PP
+Un elemento di un vettore pu� essere cancellato con l'istruzione
+.BR delete .
+L'istruzione
+.B delete
+pu� anche essere usata per cancellare l'intero contenuto di un vettore,
+basta specificare il nome del vettore stesso senza indici.
+.PP
+.I gawk
+supporta veri vettori multidimensionali.  Non richiede che
+tali vettori siano ``rettangolare'' come in C or C++.
+Per esempio:
+.sp
+.RS
+.ft B
+.nf
+a[1] = 5
+a[2][1] = 6
+a[2][2] = 7
+.fi
+.ft
+.RE
+.PP
+.BR NOTA :
+Si potrebbe aver necessit� di dire a
+.I gawk
+che un elemento di un vettore � in realt� un sottovettore per usarlo dove
+.I gawk
+si aspetta di trovare un vettore (come nel secondo argomento di
+.BR split() ).
+Si pu� fare questo creando un elemento nel sottovettore e cancellandolo
+poi con l'istruzione
+.BR delete .
+.SS Notazione e conversione delle variabili
+.PP
+Le variabili e i campi
+possono essere numeri (in virgola mobile), stringhe, o entrambe le cose.
+Possono anche essere espressioni regolari.
+Come sia interpretato il valore di una variabile dipende dal contesto.
+In un'espressione numerica, sar� trattato come un numero; usato come
+stringa, sar� trattato come tale.
+.PP
+Per far trattare una variabile come numero, le si sommi zero; per ottenere
+che venga trattata come come stringa, le si concateni la stringa nulla.
+.PP
+Le variabili non inizializzate hanno sia il valore numerico zero che il
+valore di stringa "" (la stringa nulla, o vuota).
+.PP
+Quando una stringa deve essere convertita in un numero, la conversione
+� compiuta con
+.IR strtod (3).
+I numeri sono convertiti a stringhe usando
+.IR sprintf (3)
+col valore di
+.B CONVFMT
+come stringa di formato
+ed il valore numerico della variabile come argomento.
+Tuttavia, anche se tutti i numeri in \*(AK sono in virgola mobile ("float"),
+i valori privi di decimali sono
+.I sempre
+convertiti in numeri interi.  Cos�, dati
+.PP
+.RS
+.ft B
+.nf
+CONVFMT = "%2.2f"
+a = 12
+b = a ""
+.fi
+.ft R
+.RE
+.PP
+la variabile
+.B b
+ha un valore di tipo stringa di \fB"12"\fR e non \fB"12.00"\fR.
+.PP
+.BR NOTA :
+Quando si opera in modalit� POSIX (come con l'opzione
+.BR \-\^\-posix ),
+bisogna fare attenzione che le impostazioni per la localizzazione possono
+interferire col modo in cui sono trattati i numeri decimali: il separatore
+decimale dei numeri che si forniscono a
+.I gawk
+deve essere conforme a quello che si aspetta la localizzazione in uso, che sia
+un punto (.) o una virgola (,).
+
+.I Gawk
+esegue i confronti nel modo seguente:
+Se due variabili sono numeriche, sono confrontate numericamente.
+Se una � numerica e l'altra � una stringa interpretabile come
+\*(lqstringa numerica,\*(rq
+sono pure confrontate numericamente.
+Negli altri casi, gli eventuali valori numerici sono convertiti in stringhe,
+ed � eseguito un confronto tra stringhe.
+Ovviamente, due stringhe sono confrontate come stringhe.
+.PP
+Si noti che le costanti stringa, come \fB"57"\fP,
+.I non
+sono stringhe numeriche, ma solo costanti stringa.  L'idea
+di \*(lqstringa numerica\*(rq si applica solo ai campi,
+all'input di
+.BR getline ,
+a
+.BR FILENAME ,
+agli elementi di
+.B ARGV
+di
+.BR ENVIRON ,
+ed agli elementi di un vettore creato da
+.B split()
+o da
+.B patsplit()
+che abbiano le caratteristiche di una stringa numerica.
+L'idea fondamentale � che i dati
+.IR "immessi dall'utente" ,
+e solo essi, se risultano essere numerici,
+saranno trattati come numeri.
+.SS Costanti ottali ed esadecimali
+Nel codice sorgente del programma si possono usare costanti ottali ed
+esadecimali in stile C.
+Per esempio, il valore ottale
+.B 011
+� uguale al decimale
+.BR 9 ,
+e il valore esadecimale
+.B 0x11
+� uguale al decimale 17.
+.SS Costanti di tipo stringa
+.PP
+Le costanti stringa in \*(AK sono sequenze di caratteri racchiusi tra
+doppi apici (come \fB"valore"\fR).  All'interno delle stringhe, sono riconosciute alcune
+.IR "sequenze di protezione" ,
+come in in C.  Queste sono:
+.PP
+.TP "\w'\fB\e\^\fIddd\fR'u+1n"
+.B \e\e
+Una barra inversa letterale.
+.TP
+.B \ea
+Il carattere \*(lqalert\*(rq; in genere il carattere \s-1ASCII\s+1 \s-1BEL\s+1.
+.TP
+.B \eb
+Tasto di cancellazione all'indietro (backspace).
+.TP
+.B \ef
+Salto pagina (form-feed).
+.TP
+.B \en
+Nuova riga (newline).
+.TP
+.B \er
+Ritorno carrello (CR).
+.TP
+.B \et
+Tabulazione orizzontale.
+.TP
+.B \ev
+Tabulazione verticale.
+.TP
+.BI \ex "\^cifre_esa"
+Il carattere rappresentato dalla stringa di cifre esadecimali
+dopo la
+.BR \ex .
+Fino a due
+cifre esadecimali che seguono sono considerate parte
+della sequenza di protezione.
+Per esempio, \fB"\ex1B"\fR � il carattere \s-1ASCII\s+1 \s-1ESC\s+1 (escape).
+.TP
+.BI \e ddd
+Il carattere rappresentato da una sequenza di 3 cifre ottali.
+Per esempio, \fB"\e033"\fR � il carattere \s-1ASCII\s+1 \s-1ESC\s+1 (escape).
+.TP
+.BI \e c
+Il carattere letterale
+.IR c\^ .
+.PP
+In modalit� compatibile, i caratteri rappresentati da sequenze di protezione
+ottali ed esadecimali sono trattati letteralmente, se usati in costanti
+costituite da espressioni regolari.  Cos�,
+.B /a\e52b/
+� equivalente a
+.BR /a\e*b/ .
+.SS "Costanti di tipo Regexp"
+Una costante di tipo espressione regolare � una sequenza di caratteri
+racchiusa tra barre (come
+.BR /valore/ ).
+Come stabilire una corrispondenza con un'espressione regolare �
+descritto in maniera pi� dettagliata pi� avanti; vedere
+.BR "Espressioni regolari" .
+.PP
+Le sequenze di protezione descritte sopra si possono usare anche
+all'interno di costanti che sono espressioni regolari
+(p.es.,
+.B "/[\ \et\ef\en\er\ev]/"
+corrisponde a tutti i caratteri non stampabili [bianchi]).
+.TP
+.I Gawk
+consente anche di usare costanti formate da espressioni regolari
+.IR "fortemente tipizzate" .
+I nome di tali costanti sono preceduti da un simbolo
+.B @
+(cos�:
+.BR @/valore/ ).
+Queste costanti possono essere assegnare a scalari (variabili,
+elementi di un vettore) e passate a funzione definite dall'utente.
+Le variabili il cui valore � stato assegnato in questo modo
+hanno come tipo quello di variabili di espressioni regolari.
+.SH CRITERI DI RICERCA E AZIONI
+\*(AK � un linguaggio che procede per righe.  Il criterio va a inizio riga,
+l'azione lo segue.  Le istruzioni dell'azione sono racchiuse tra
+.B {
+e
+.BR } .
+Sia il criterio che l'azione possono mancare ma, naturalmente, non entrambi.
+Se manca il criterio, l'azione � eseguita per ogni record in input.
+Omettere invece l'azione equivale a specificare
+.RS
+.PP
+.B "{ print }"
+.RE
+.PP
+ossia stampare l'intero record.
+.PP
+I commenti cominciano col carattere
+.BR # ,
+e continuano fino a fine riga.
+Si possono separare le istruzioni con righe vuote.
+Un'istruzione finisce normalmente alla fine della riga,
+a meno che non termini
+con una
+virgola,
+.BR { ,
+.BR ? ,
+.BR : ,
+.BR && ,
+o
+.BR || .
+Le istruzioni in righe terminanti con
+.B do
+o
+.B else
+continuano automaticamente alla riga successiva.
+Negli altri casi, una riga terminante con un  \*(lq\e\*(rq
+continua alla successiva, e il "newline" � ignorato.
+.PP
+Si possono scrivere pi� istruzioni sulla stessa riga separandole con
+\*(lq;\*(rq.
+Questo si applica sia alle istruzioni all'interno di un'azione (il caso pi�
+comune), sia ai gruppi criterio-azione stessi.
+.SS Criteri di ricerca
+I criteri di ricerca di \*(AK possono assumere le forme seguenti:
+.PP
+.RS
+.nf
+.B BEGIN
+.B END
+.B BEGINFILE
+.B ENDFILE
+.BI / "espressione regolare" /
+.I "espressione di relazione"
+.IB criterio " && " criterio
+.IB criterio " || " criterio
+.IB criterio " ? " criterio " : " criterio
+.BI ( criterio )
+.BI ! " criterio"
+.IB criterio1 ", " criterio2
+.fi
+.RE
+.PP
+.B BEGIN
+e
+.B END
+sono due tipi speciali di criteri di ricerca, che non dipendono
+dai dati in input.
+Le azioni di tutti i criteri di ricerca
+.B BEGIN
+sono unite insieme, come se tutte le istruzioni fossero
+scritte in un'unica regola
+.BR BEGIN ,
+e sono eseguite prima che sia letto qualsiasi input.
+Allo stesso modo, tutte le regole
+.B END
+sono fuse insieme, ed eseguite dopo che tutti i dati in input sono
+terminati o dopo che si � incontrata l'istruzione
+.BR exit .
+.B BEGIN
+e
+.B END
+non possono essere combinati con altri criteri in espressioni di ricerca.
+I criteri
+.B BEGIN
+e
+.B END
+devono necessariamente essere seguiti dall'indicazione di un'azione
+.PP
+.B BEGINFILE
+e
+.B ENDFILE
+sono altri criteri speciali il cui contenuto � eseguito
+prima della lettura del primo record di ogni file di input richiamato sulla riga
+di comando, e dopo la lettura dell'ultimo record di ognuno di questi file.
+All'interno della regola
+.B BEGINFILE
+il valore di
+.B ERRNO
+� una stringa vuota se il file � stato aperto con successo.
+Altrimenti, in caso di problemi col file il codice dovrebbe usare
+.B nextfile
+per saltarlo.  Se non lo fa,
+.I gawk
+emette il solito errore fatale per i file che non possono essere aperti.
+.PP
+Per i criteri del tipo
+.BI / "espressione regolare" /
+l'azione associata � eseguita per ogni record in input che corrisponde
+all'espressione regolare.
+Le espressioni regolari hanno la stessa forma di quelle di
+.IR egrep (1),
+e sono descritte pi� avanti.
+.PP
+In
+.RI un' "espressione relazionale"
+si pu� usare qualsiasi operatore definito nella sezione sulla azioni, pi�
+avanti.  Generalmente l'espressione relazionale � utilizzata per verificare se
+certi campi siano individuati da determinate espressioni regolari.
+.PP
+Gli operatori
+.BR && ,
+.BR || ,
+e
+.B !
+sono rispettivamente l'AND logico, l'OR logico e il NOT logico.  Come i loro
+equivalenti del linguaggio C, sono valutati solo il numero di operandi
+strettamente necessario a decidere il risultato, a partire da quello pi� a sinistra
+("short-circuit evaluation").  Sono usati per combinare espressioni di ricerca
+pi� semplici.  Come nella maggior parte dei linguaggi, si possono usare
+parentesi per cambiare l'ordine di valutazione.
+.PP
+L'operatore
+.B ?\^:
+� simile allo stesso operatore in C: se il primo criterio � vero,
+allora il criterio utilizzato per il test � il secondo, altrimenti
+� il terzo. Dei criteri secondo e terzo, ne � valutato sempre solo uno.
+.PP
+Un'espressione nella forma
+.IB criterio1 ", " criterio2
+� detta
+.IR "criterio intervallo" .
+Essa individua tutti i record a partire da quello che ha corrispondenza con
+.IR criterio1 ,
+fino a quello che corrisponde a
+.IR criterio2 ,
+compreso.  Non pu� essere combinata con alcun'altra espressione.
+.SS Espressioni regolari
+Le espressioni regolari sono del tipo esteso che si trova in
+.IR egrep .
+Sono composte da caratteri secondo le regole seguenti:
+.TP "\w'\fB[^\fIabc.\|.\|.\fB]\fR'u+2n"
+.I c
+Corrisponde al carattere (non speciale)
+.IR c .
+.TP
+.I \ec
+Corrisponde al carattere
+.I c
+considerato letteralmente.
+.TP
+.B .
+Corrisponde a qualsiasi carattere, 
+.I compreso
+"newline".
+.TP
+.B ^
+Corrisponde all'inizio di una stringa.
+.TP
+.B $
+Corrisponde alla fine di una stringa.
+.TP
+.BI [ abc.\|.\|. ]
+Una lista di caratteri: corrisponde a uno qualsiasi dei caratteri
+.IR abc.\|.\|. .
+Si possono includere intervalli di caratteri separandoli con un trattino.
+.TP
+\fB[^\fIabc.\|.\|.\fB]\fR
+Una lista di caratteri negata: corrisponde a qualsiasi carattere eccetto
+.IR abc.\|.\|. .
+.TP
+.IB r1 | r2
+Alternativa: corrisponde a
+.I r1
+oppure a
+.IR r2 .
+.TP
+.I r1r2
+Concatenazione: corrisponde a
+.IR r1 ,
+e poi
+.IR r2 .
+.TP
+.IB r +
+Corrisponde a una o pi�
+.IR r .
+.TP
+.IB r *
+Corrisponde a zero o pi�
+.IR r .
+.TP
+.IB r ?
+Corrisponde a zero o una
+.IR r .
+.TP
+.BI ( r )
+Raggruppamento: corrisponde a
+.IR r .
+.TP
+.PD 0
+.IB r { n }
+.TP
+.PD 0
+.IB r { n ,}
+.TP
+.PD
+.IB r { n , m }
+Uno o due numeri racchiusi tra parentesi graffe indicano una
+.IR "espressione di intervallo" .
+Se c'� un numero tra parentesi graffe, l'espressione regolare che precede
+.I r
+� ripetuta
+.I n
+volte. Se tra parentesi graffe ci sono due numeri separati da virgola,
+.I r
+� ripetuta da
+.I n
+ad
+.I m
+volte.
+Se c'� un numero seguito da una virgola,
+.I r
+� ripetuta almeno
+.I n
+volte.
+.TP
+.B \ey
+Corrisponde alla stringa vuota all'inizio o alla
+fine di una parola.
+.TP
+.B \eB
+Corrisponde alla stringa vuota all'interno di una parola.
+.TP
+.B \e<
+Corrisponde alla stringa vuota all'inizio di una parola.
+.TP
+.B \e>
+Corrisponde alla stringa vuota alla fine di una parola.
+.B \es
+Corrisponde a qualsiasi spazio vuoto.
+.TP
+.B \eS
+Corrisponde a qualsiasi carattere che non sia uno spazio vuoto.
+.TP
+.B \ew
+Corrisponde a un qualsiasi carattere che possa far parte di una parola, cio�
+lettere, numeri o trattino basso).
+.TP
+.B \eW
+Corrisponde a un qualsiasi carattere che non possa far parte di una parola.
+.TP
+.B \e`
+Corrisponde alla stringa vuota all'inizio di una stringa.
+.TP
+.B \e'
+Corrisponde alla stringa vuota alla fine di una stringa.
+.PP
+Le sequenze di protezione valide all'interno delle costanti stringa (vedere
+.BR "Costanti di tipo stringa" )
+sono ammesse anche nelle espressioni regolari.
+.PP
+Le 
+.I "classi di caratteri"
+sono una nuova funzionalit� introdotta nello standard \*(PX.  Una classe di
+caratteri � una speciale notazione per indicare liste di caratteri accomunati
+da uno specifico attributo, dove per� i caratteri veri e propri possono variare
+a seconda della nazione e del set di caratteri.  Per esempio, la nozione di
+"carattere alfabetico" valida negli Stati Uniti � diversa da quella valida in
+Francia.
+.PP
+Una classe di caratteri � ammessa solo
+.I all'interno
+delle parentesi quadre di una lista di caratteri di una espressione regolare.
+Le classi di caratteri si rappresentano con
+.BR [: ,
+una parola chiave indicante la classe, e
+.BR :] .
+Queste sono le classi di caratteri definite dallo standard \*(PX:
+.TP "\w'\fB[:alnum:]\fR'u+2n"
+.B [:alnum:]
+Caratteri alfanumerici.
+.TP
+.B [:alpha:]
+Caratteri alfabetici.
+.TP
+.B [:blank:]
+Caratteri "spazio" e "tab".
+.TP
+.B [:cntrl:]
+Caratteri di controllo.
+.TP
+.B [:digit:]
+Caratteri numerici.
+.TP
+.B [:graph:]
+Caratteri che siano sia stampabili che visibili
+(uno spazio � stampabile ma non visibile, mentre
+.B a
+� entrambe le cose).
+.TP
+.B [:lower:]
+Caratteri alfabetici minuscoli.
+.TP
+.B [:print:]
+Caratteri stampabili (cio� caratteri che non siano di controllo).
+.TP
+.B [:punct:]
+Caratteri di punteggiatura (cio� caratteri che non siano n� lettere,
+n� cifre, n� caratteri di controllo, n� caratteri di spaziatura).
+.TP
+.B [:space:]
+Caratteri di spaziatura (come lo spazio, "tab", "formfeed", per citarne solo
+alcuni).
+.TP
+.B [:upper:]
+Caratteri alfabetici maiuscoli.
+.TP
+.B [:xdigit:]
+Cifre esadecimali.
+.PP
+Per fare un esempio, prima dell'introduzione dello standard \*(PX
+si sarebbe dovuto scrivere
+.B /[A\-Za\-z0\-9]/
+per individuare caratteri alfanumerici.  Qualora il set di caratteri vigente
+avesse compreso altri caratteri alfanumerici, l'espressione non li avrebbe
+riconosciuti, e se il set di caratteri fosse rappresentato in modo diverso da
+\s-1ASCII\s+1, non sarebbero riconosciuti neanche i caratteri alfanumerici
+\s-1ASCII\s+1.
+Con le classi di caratteri \*(PX, si pu� scrivere
+.BR /[[:alnum:]]/ ,
+che trover� corrispondenza con
+i caratteri alfabetici e numerici previsti dal set di caratteri in uso,
+qualunque esso sia.
+.PP
+Nelle liste di caratteri possono comparire due sequenze speciali
+aggiuntive. Esse si applicano ai set di caratteri non \s-1ASCII\s+1, i quali
+possono comprendere sia simboli singoli (chiamati
+.IR "elementi di collazione" )
+rappresentati da pi� di un carattere, sia
+gruppi di caratteri tra loro equivalenti ai fini della
+.I collazione
+o dell'ordinamento.
+Per esempio, in francese una \*(lqe\*(rq semplice ed una
+\*(lqe"\h'-\w:e:u'\`\*(rq con l'accento grave sono equivalenti.
+.TP
+Simboli di collazione
+Un simbolo di collazione � un elemento di confronto costituito da pi�
+di un carattere racchiuso tra
+.B [.
+e
+.BR .] .
+Per esempio, se
+.B ch
+� un elemento di collazione, allora
+.B [[.ch.]]
+� l'espressione regolare che lo individua, mentre
+.B [ch]
+� un'espressione regolare che individua o il carattere
+.B c
+o il carattere
+.BR h .
+.TP
+Classi di Equivalenza
+Una classe di equivalenza � un nome, dipendente dalla localizzazione, associato
+a una lista di caratteri tra loro equivalenti.  Il nome � racchiuso tra
+.B [=
+e
+.BR =] .
+Per esempio, il nome
+.B e
+potrebbe essere usato per rappresentare globalmente i caratteri
+\*(lqe\*(rq, \*(lqe\h'-\w:e:u'\'\*(rq, ed \*(lqe\h'-\w:e:u'\`\*(rq.
+In questo caso,
+.B [[=e]]
+� un'espressione regolare compatibile con uno qualsiasi dei caratteri
+.BR e ,
+.BR � ,
+ed
+.BR � .
+.PP
+Queste funzionalit� sono molto apprezzabili quando la lingua
+corrente non � l'inglese.
+Le funzioni di libreria che
+.I gawk
+usa nella valutazione di espressioni regolari
+riconoscono attualmente solo le classi di caratteri \*(PX,
+non i simboli di collazione n� le classi di equivalenza.
+.PP
+Gli operatori
+.BR \ey ,
+.BR \eB ,
+.BR \e< ,
+.BR \e> ,
+.BR \ew ,
+.BR \eW ,
+.BR \e` ,
+ed
+.B \e'
+sono specifici di
+.IR gawk ;
+queste estensioni sono possibili grazie alle facilitazioni derivanti dall'uso
+della libreria "regexp" di \*(GN.
+.PP
+Quelle che seguono sono le opzioni della riga di comando
+che controllano come
+.I gawk
+interpreta i caratteri nelle espressioni regolari.
+.TP
+Nessuna opzione
+In assenza di indicazioni,
+.I gawk
+mette a disposizione tutte le facilitazioni caratteristiche delle espressioni
+regolari \*(PX e degli operatori \*(GN descritti pi� sopra.
+.TP
+.B \-\^\-posix
+Sono riconosciute solo le espressioni regolari \*(PX, non gli operatori \*(GN
+(per esempio,
+.B \ew
+individua il carattere
+.BR w ).
+.TP
+.B \-\^\-traditional
+Le espressioni regolari sono valutate secondo le regole del tradizionale
+.I awk
+per \*(UK.  Gli operatori \*(GN non hanno un significato speciale, e le
+espressioni di intervallo non sono disponibili.
+I caratteri descritti da sequenze ottali o esadecimali sono trattati
+letteralmente, anche se rappresentano metacaratteri di espressioni regolari.
+.TP
+.B \-\^\-re\-interval
+Sono permesse le espressioni di intervallo, anche se � stato specificato
+.BR \-\^\-traditional .
+.SS Azioni
+Le istruzioni di azione sono racchiuse tra parentesi graffe,
+.B {
+e
+.BR } .
+L'insieme delle istruzioni di azione � formato dalle solite istruzioni di
+assegnamento, condizionali e iterative presenti nella maggior parte
+dei linguaggi.  Gli operatori, le strutture di controllo e le istruzioni
+di input/output ricalcano quelli corrispondenti nel linguaggio C.
+.SS Operatori
+.PP
+Gli operatori di \*(AK, in ordine decrescente di precedenza, sono
+.PP
+.TP "\w'\fB*= /= %= ^=\fR'u+1n"
+.BR ( \&.\|.\|. )
+Raggruppamento
+.TP
+.B $
+Riferimento a campi.
+.TP
+.B "++ \-\^\-"
+Incremento e decremento, sia prefisso che suffisso.
+.TP
+.B ^
+Elevamento a potenza (si pu� anche usare \fB**\fR al suo posto, e \fB**=\fR
+nell'assegnamento con operatore).
+.TP
+.B "+ \- !"
+Pi� e meno unari, e negazione logica.
+.TP
+.B "* / %"
+Moltiplicazione, divisione e resto della divisione.
+.TP
+.B "+ \-"
+Addizione e sottrazione.
+.TP
+.I spazio
+Concatenazione di stringhe.
+.TP
+.B "|   |&"
+I/O proveniente dall'output di comandi [pipe] per
+.BR getline ,
+.BR print ,
+e
+.BR printf .
+.TP
+.B "< > <= >= == !="
+I normali operatori di relazione.
+.TP
+.B "~ !~"
+Corrispondenza tra espressioni regolari, e nessuna corrispondenza.
+.B NOTA:
+Non usare un'espressione regolare costante
+.RB ( /foo/ )
+come operando di sinistra di
+.B ~
+o
+.BR !~ .
+Usare un'espressione regolare solo come operando di destra.  L'espressione
+.BI "/foo/ ~ " exp
+equivale a richiedere \fB(($0 ~ /foo/) ~ \fIexp\fB)\fR.
+Di solito
+.I non
+� questo, quel che si vorrebbe.
+.TP
+.B in
+Controllo di appartenenza a un vettore.
+.TP
+.B &&
+AND logico.
+.TP
+.B ||
+OR logico.
+.TP
+.B ?:
+L'espressione condizionale in stile C.  Ha la forma
+.IB espressione1 " ? " espressione2 " : " espressione3\c
+\&.
+Se
+.I espressione1
+� vera, il valore dell'espressione �
+.IR espressione2 ,
+altrimenti �
+.IR espressione3 .
+Viene calcolata solo una delle due espressioni
+.I espressione2
+ed
+.I espressione3
+.
+.TP
+.B "= += \-= *= /= %= ^="
+Assegnamento. Sono permessi sia l'assegnamento assoluto
+.BI ( var " = " valore )
+che quello con operatore (le altre forme).
+.SS Istruzioni di controllo
+.PP
+Le istruzioni di controllo sono
+le seguenti:
+.PP
+.RS
+.nf
+\fBif (\fIcondizione\fB) \fIistruzione\fR [ \fBelse\fI istruzione \fR]
+\fBwhile (\fIcondizione\fB) \fIistruzione \fR
+\fBdo \fIistruzione \fBwhile (\fIcondizione\fB)\fR
+\fBfor (\fIespressione1\fB; \fIespressione2\fB; \fIespressione3\fB) \fIistruzione\fR
+\fBfor (\fIvar \fBin\fI vettore\fB) \fIistruzione\fR
+\fBbreak\fR
+\fBcontinue\fR
+\fBdelete \fIvettore\^\fB[\^\fIindice\^\fB]\fR
+\fBdelete \fIvettore\^\fR
+\fBexit\fR [ \fIespressione\fR ]
+\fB{ \fIistruzione \fB}
+\fBswitch (\fIespressione\fB) {
+\fBcase \fIvalore\fB|\fIespressione_regolare\fB : \fIistruzione
+\&.\^.\^.
+\fR[ \fBdefault: \fIistruzione \fR]
+\fB}\fR
+.fi
+.RE
+.SS "Istruzioni di I/O"
+.PP
+Le istruzioni di input/output sono le seguenti:
+.PP
+.TP "\w'\fBprintf \fIfmt, lista-espressioni\fR'u+1n"
+\fBclose(\fIfile \fR[\fB, \fIcome\fR]\fB)\fR
+Chiude un file, una pipe o un coprocesso.
+Il parametro facoltativo
+.I come
+dovrebbe essere usato solo per chiudere un'estremit� di una
+pipe bi-direzionale aperta con un coprocesso.
+Il valore dev'essere una stringa, o
+\fB"to"\fR o \fB"from"\fR.
+.TP
+.B getline
+Imposta
+.B $0
+usando la successiva riga di input; imposta
+.BR NF ,
+.BR NR ,
+.BR FNR ,
+.BR RT .
+.TP
+.BI "getline <" file
+Imposta
+.B $0
+usando la successiva riga di
+.IR file ;
+imposta
+.BR NF ,
+.BR RT .
+.TP
+.BI getline " variabile"
+Imposta
+.I variabile
+dalla successiva riga di input; imposta
+.BR NR ,
+.BR FNR ,
+.BR RT .
+.TP
+.BI getline " variabile" " <" file
+Imposta
+.I variabile
+dalla successiva riga di
+.IR file ;
+imposta
+.BR RT .
+.TP
+\fIcomando\fB | getline \fR[\fIvariabile\fR]
+Esegue
+.I comando
+dirigendo l'output [del comando] o in
+.B $0
+o in
+.IR variabile ,
+come sopra, e
+.BR RT .
+.TP
+\fIcomando\fB |& getline \fR[\fIvariabile\fR]
+Esegue
+.I comando
+come un coprocesso
+dirigendo l'output [del comando] o in
+.B $0
+o in
+.IR variabile ,
+come sopra, e
+.BR RT .
+I coprocessi sono un'estensione
+.IR gawk .
+.RI (il " comando
+pu� anche essere un socket.  Vedere la sottosezione
+.BR "Nomi di file speciali" ,
+pi� avanti.)
+.TP
+.B next
+Cessa l'elaborazione della riga di input corrente.  � letta la successiva,
+e l'elaborazione ricomincia dal primo criterio di ricerca del
+programma \*(AK.
+Se non ci sono pi� righe in input,
+.I gawk
+esegue i comandi delle regole
+.BR END ,
+se presenti.
+.TP
+.B "nextfile"
+Cessa l'elaborazione del file di input corrente.  La prossima riga
+sar� letta dal file di input successivo.  Sono aggiornati
+.B FILENAME
+e
+.BR ARGIND ,
+.B FNR
+� reimpostato a 1, e l'elaborazione riprende dal primo criterio di ricerca
+del programma \*(AK.
+Quando non ci sono pi� righe in input,
+.I gawk
+esegue i comandi delle regole
+.B ENDFILE
+ed
+.BR END ,
+se presenti.
+.TP
+.B print
+Stampa il record corrente.
+Alla fine della riga in output viene aggiunto il valore della variabile
+.BR ORS .
+.TP
+.BI print " lista-espressioni"
+Stampa le espressioni indicate.
+Ogni espressione � separata dal valore della variabile
+.BR OFS .
+La riga prodotta termina col valore della variabile
+.BR ORS .
+.TP
+.BI print " lista-espressioni" " >" file
+Stampa le espressioni indicate su
+.IR file .
+Ogni espressione � separata dal valore della variabile
+.BR OFS.
+La riga prodotta termina col valore della variabile
+.BR ORS .
+.TP
+.BI printf " fmt, lista-espressioni"
+Stampa secondo formato.
+Vedere \fBL'istruzione \fIprintf \fR, pi� avanti.
+.TP
+.BI printf " fmt, lista-espressioni" " >" file
+Stampa secondo formato su
+.IR file .
+.TP
+.BI system( riga-di-comando )
+Esegue il comando
+.IR riga-di-comando ,
+e ne restituisce il valore d'uscita.
+(pu� non essere disponibile sui sistemi non-\*(PX).
+Si veda \*(EP per tutti i dettagli sullo stato d'uscita.
+.TP
+\&\fBfflush(\fR[\fIfile\^\fR]\fB)\fR
+Scarica il contenuto di tutti i buffer associati ai file o alle pipe
+aperti in scrittura
+.IR file .
+Se
+.I file
+non � specificato
+o ha per valore la stringa nulla,
+l'operazione � eseguita su tutti i file e le pipe aperti in scrittura.
+.PP
+Sono permessi anche altri tipi di ridirezione in scrittura per
+.B print
+e
+.BR printf .
+.TP
+.BI "print .\|.\|. >>" " file"
+Aggiunge righe alla fine di
+.IR file .
+.TP
+.BI "print .\|.\|. |" " comando"
+Scrive su una pipe.
+.TP
+.BI "print .\|.\|. |&" " comando"
+Invia dati a un coprocesso o a un socket.
+(Vedere anche la sottosezione
+.BR "Nomi di file speciali" ,
+pi� avanti).
+.PP
+Il comando
+.B getline
+restituisce 1 se tutto va bene, zero in caso di fine file, e \-1 in caso di errore.
+Se il valore di
+.IR errno (3)
+indica che l'operazione di I/O pu� essere ritentata,
+e \fBPROCINFO["\fIinput\^\fP", "RETRY"]\fR
+� stato impostato, viene restituito il valore \-2 invece che \-1 e ulteriori
+chiamate a
+.B getline
+possono essere effettuate.
+A fronte di un errore
+.B ERRNO
+� impostato a una stringa che descrive il problema.
+.PP
+.BR NOTA :
+L'insuccesso nell'apertura di un socket bidirezionale genera un errore
+non fatale che viene restituito alla funzione chiamante.  Se si sta usando
+una pipe, un coprocesso, o un socket per alimentare la
+.BR getline ,
+o da
+.B print
+o
+.B printf
+all'interno di un ciclo, si
+.I deve
+usare
+.B close()
+per creare una nuova istanza del comando o del socket.
+\*(AK non chiude automaticamente pipe, socket, o coprocessi quando
+questi restituiscono EOF.
+.SS L'istruzione \fIprintf\fP\^
+.PP
+Le versioni di \*(AK dell'istruzione
+.B printf
+e della funzione
+.B sprintf()
+(vedi pi� avanti)
+accettano i seguenti
+formati di richiesta conversione:
+.TP "\w'\fB%g\fR, \fB%G\fR'u+2n"
+.BR "%a" "," " %A"
+Un numero a virgola mobile nel formato
+[\fB\-\fP]\fB0x\fIh\fB.\fIhhhh\fBp+\-\fIdd\fR
+(formato esadecimale a virgola mobile di C99).
+Per
+.BR %A ,
+si usano lettere maiuscole invece che lettere minuscole.
+.TP
+.B %c
+Un singolo carattere.
+Se l'argomento usato per
+.B %c
+� numerico, � considerato come un carattere e stampato.
+Altrimenti, si suppone che l'argomento sia una stringa, e ne � stampato
+solo il primo carattere.
+.TP
+.BR "%d" "," " %i"
+Un numero decimale (solo la sua parte intera).
+.TP
+.BR %e , " %E"
+Un numero in virgola mobile nella forma
+[\fB\-\fP]\fId\fB.\fIdddddd\^\fBe\fR[\fB+\-\fR]\fIdd\fR.
+Il formato
+.B %E
+usa
+.B E
+anzich�
+.BR e .
+.TP
+.BR %f , " %F"
+Un numero in virgola mobile nella forma
+[\fB\-\fP]\fIddd\fB.\fIdddddd\fR.
+Se la libreria di sistema lo supporta, il formato
+.B %F
+� pure disponibile.  Si comporta come
+.BR %f ,
+ma usa lettere maiuscole per i valori speciali \*(lqnon un numero\*(rq
+e \*(lqinfinito\*(rq. Se
+.B %F
+non � disponibile
+.I gawk
+usa
+.BR %f .
+.TP
+.BR %g , " %G"
+Usa la conversione
+.B %e
+o
+.BR %f ,
+(la pi� corta delle due), sopprimendo gli zeri non significativi.
+Il formato
+.B %G
+usa
+.B %E
+invece che
+.BR %e .
+.TP
+.B %o
+Un numero ottale senza segno (anche questo intero).
+.TP
+.PD
+.B %u
+Un numero decimale senza segno (pure questo intero).
+.TP
+.B %s
+Una stringa di caratteri.
+.TP
+.BR %x , " %X"
+Un numero esadecimale senza segno (un intero).
+Il formato
+.B %X
+usa
+.B ABCDEF
+invece di
+.BR abcdef .
+.TP
+.B %%
+Un singolo carattere
+.BR % ;
+non c'� alcuna conversione di argomenti.
+.PP
+Alcuni ulteriori parametri facoltativi possono comparire fra il
+.B %
+e la lettera che indica il tipo di visualizzazione richiesta:
+.TP
+.IB n $
+Usa l'argomento
+.IR n-esimo
+a questo punto della formattazione.
+Questo � detto uno
+.I "specificatore posizionale"
+ed
+� pensato per usato principalmente nelle versioni tradotte delle
+stringhe di formattazione, non nel testo originale [normalmente in inglese]
+di un programma AWK. Si tratta di un'estensione
+.I gawk
+.
+.TP
+.B \-
+L'espressione va allineata a sinistra all'interno del proprio campo.
+.TP
+.I spazio
+Nelle conversioni numeriche, inserire uno spazio prima dei valori positivi,
+e un segno "meno" prima di quelli negativi.
+.TP
+.B +
+Il segno "pi�" usato prima del modificatore di dimensione (vedi pi� avanti)
+indica che nelle conversioni numeriche il segno deve essere sempre presente,
+anche se il valore da riportare � positivo.
+.B +
+annulla l'effetto del modificatore "spazio".
+.TP
+.B #
+Usa una \*(lqforma alternativa\*(rq per alcune lettere di controllo.
+Associato a
+.BR %o ,
+aggiunge uno zero iniziale.
+Con
+.BR %x ,
+e
+.BR %X ,
+aggiunge all'inizio rispettivamente
+.B 0x
+o
+.B 0X
+in caso di
+valore diverso da zero.
+Con
+.BR %e ,
+.BR %E ,
+.B %f
+e
+.BR %F ,
+il risultato conterr� sempre il
+separatore decimale.
+Con
+.BR %g ,
+e
+.BR %G ,
+gli zeri in coda non sono rimossi dal risultato.
+.TP
+.B 0
+Uno
+.B 0
+(zero) iniziale svolge una funzione di flag,
+per indicare che l'output deve essere preceduto
+da zeri anzich� da spazi.
+Questo vale solo per i formati numerici in output..
+Questo flag ha effetto solo quando la larghezza del campo
+� maggiore di quella necessaria a contenere il valore da stampare.
+.TP
+.B '
+Un apice semplice chiede a
+.I gawk
+di inserire il separatore delle migliaia proprio della
+localizzazione, come pure di usare il separatore decimale
+proprio della localizzazione per i numeri in virgola mobile.
+� richiesto che la libreria C supporti correttamente la
+localizzazione e che questa sia stata definita correttamente.
+.TP
+.I ampiezza
+Il numero dovrebbe occupare questo numero di byte.  Il numero � normalmente
+preceduto da spazi.  In presenza del flag
+.BR 0 ,
+� invece preceduto da zeri.
+.TP
+.BI \&. prec
+Un numero indicante la precisione da utilizzare nella stampa.
+Con i formati
+.BR %e ,
+.BR %E ,
+.BR %f ,
+e
+.BR %F ,
+specifica il numero di cifre che dovranno comparire a destra del
+separatore decimale.
+Con i formati
+.BR %g ,
+e
+.BR %G ,
+specifica il massimo numero di cifre significative.
+Con i formati
+.BR %d ,
+.BR %i ,
+.BR %o ,
+.BR %u ,
+.BR %x ,
+e
+.BR %X ,
+specifica il numero minimo di
+cifre da stampare.  Per
+.BR %s ,
+specifica il massimo numero di caratteri
+della stringa che dovrebbero essere stampati.
+.PP
+La definizione dinamica di
+.I ampiezza
+e
+.I prec
+prevista dalle funzioni
+.B printf()
+dell'ISO C sono supportate.
+Un
+.B *
+al posto sia di
+.I ampiezza
+che di
+.I prec
+far� s� che i loro valori siano presi dalla
+lista degli argomenti di
+.B printf
+o
+.BR sprintf() .
+Per usare uno specificatore di posizione con una larghezza o una precisione
+dinamica inserire il
+.IB contatore $
+dopo il carattere
+.B *
+nella stringa di formattazione.
+Per esempio, \fB"%3$*2$.*1$s"\fP.
+.SS Nomi di file speciali
+.PP
+effettuando delle ridirezioni di
+.B print
+o
+.B printf
+in un file,
+o attraverso
+.B getline
+da un file,
+.I gawk
+riconosce internamente alcuni nomi di file speciali, che permettono
+di accedere a descrittori di file gi� aperti ereditati dal processo genitore di
+.IR gawk
+(la shell, solitamente).
+Questi nomi di file possono anche essere usati nella riga di comando per
+designare dei file di dati.  I nomi di file sono:
+.TP "\w'\fB/dev/stdout\fR'u+1n"
+.B \-
+Lo standard input.
+.TP
+.B /dev/stdin
+Lo standard input.
+.TP
+.B /dev/stdout
+Lo standard output.
+.TP
+.B /dev/stderr
+Lo standard error in output.
+.TP
+.BI /dev/fd/\^ n
+Il file associato al descrittore di file aperto
+.IR n .
+.PP
+Questi ultimi sono utili in particolare per i messaggi di errore. Per esempio:
+.PP
+.RS
+.ft B
+print "Ti � andata male!" > "/dev/stderr"
+.ft R
+.RE
+.PP
+laddove, per ottenere lo stesso effetto, si sarebbe stati costretti a scrivere
+.PP
+.RS
+.ft B
+print "Ti � andata male!" | "cat 1>&2"
+.ft R
+.RE
+.PP
+I seguenti nomi di file speciali si possono usare con l'operatore
+.B |&
+di coprocesso per creare connessioni di rete TCP/IP:
+.TP
+.PD 0
+.BI /inet/tcp/ lport / rhost / rport
+.TP
+.PD 0
+.BI /inet4/tcp/ lport / rhost / rport
+.TP
+.PD
+.BI /inet6/tcp/ lport / rhost / rport
+File per una connessione TCP/IP su una porta locale
+.I lport
+verso un
+host remoto
+.I rhost
+sulla porta remota
+.IR rport .
+Si usi la porta numero
+.B 0
+Per permettere al sistema di scegliere una porta.
+Si usi
+.B /inet4
+per richiedere una connessione IPv4,
+e
+.B /inet6
+per richiedere una connessione IPv6.
+Specificando semplicemente
+.B /inet
+usa quello predefinito del sistema (molto probabilmente sar� IPv4).
+.TP
+.PD 0
+.BI /inet/udp/ lport / rhost / rport
+.TP
+.PD 0
+.BI /inet4/udp/ lport / rhost / rport
+.TP
+.PD
+.BI /inet6/udp/ lport / rhost / rport
+Come sopra, ma usando porte UDP/IP invece che TCP/IP.
+.SS Funzioni numeriche
+.PP
+\*(AK ha le seguenti funzioni aritmetiche predefinite:
+.PP
+.TP "\w'\fBsrand(\fR[\fIespressione\^\fR]\fB)\fR'u+1n"
+.BI atan2( y , " x" )
+Restituisce l'arcotangente di
+.I y/x
+in radianti.
+.TP
+.BI cos( espressione )
+Restituisce il coseno di
+.IR espressione ,
+in radianti.
+.TP
+.BI exp( espressione )
+La funzione esponenziale.
+.TP
+.BI int( espressione )
+Troncamento a numero intero.
+.ig
+.TP
+.BI intdiv( numero ", " denominatore ", " risultato )
+I numeri
+.I numero
+e
+.I denominatore
+vengono troncati a numeri interi. Restituisce il quoziente di
+.I numero
+diviso per
+.I denominatore
+in \fIresult\fB["quotient"]\fR
+e il resto in
+in \fIresult\fB["remainder"]\fR.
+Questa � un'estensione
+.IR gawk ,
+utile in particolare quando si lavora con numeri
+molto grandi.
+..
+.TP
+.BI log( espressione )
+Logaritmo a base naturale.
+.TP
+.B rand()
+Restituisce un numero casuale
+.IR N ,
+tra zero e uno,
+tale che 0 \(<= \fIN\fP < 1.
+.TP
+.BI sin( espressione )
+Restituisce il seno di
+.IR espressione ,
+in radianti.
+.TP
+.BI sqrt( espressione )
+Restituisce la radice quadrata di
+.IR espressione .
+.TP
+\&\fBsrand(\fR[\fIespressione\^\fR]\fB)\fR
+usa
+.I espressione
+come nuovo seme per il generatore di numeri casuali.  Se
+.I espressione
+non � indicata, sar� utilizzata il tempo corrente, misurato in secondi dal 1970.
+Il valore restituito � il valore precedente
+del seme.
+.SS Funzioni di stringa
+.PP
+.I Gawk
+offre le seguenti funzioni di stringa predefinite:
+.PP
+.TP "\w'\fBsprintf(\^\fIfmt\fB\^, \fIlista-espressioni\^\fB)\fR'u+1n"
+\fBasort(\fIs \fR[\fB, \fId\fR [\fB, \fIcome\fR] ]\fB)\fR
+Restituisce il numero di elementi del
+vettore di partenza
+.IR s .
+Ordina
+i contenuti del vettore
+.I s
+usando le regole normali di
+.IR gawk
+per confrontare fra loro i
+valori, e sostituisce gli indici dei
+valori ordinati di
+.I s
+con la sequenza dei numeri interi
+a partire da 1.  Se viene specificato
+il vettore destinazione (facoltativo)
+.IR d ,
+dapprima
+il vettore
+.I s
+viene copiato in
+.IR d ,
+e poi viene ordinato
+.IR d ,
+senza modificare gli indici del
+vettore di partenza
+.IR s .
+La stringa facoltativa
+.I come
+controlla la direzione e il modo del confronto.
+Valori ammissibili per
+.I come
+sono
+quelli delle stringhe ammissibili per
+\fBPROCINFO["sorted_in"]\fR.
+Si pu� anche specificare il nome di una funzione di confronto
+definita dall'utente, come viene spiegato in
+\fBPROCINFO["sorted_in"]\fR.
+.TP "\w'\fBsprintf(\^\fIfmt\fB\^, \fIlista-espressioni\^\fB)\fR'u+1n"
+\fBasorti(\fIs \fR[\fB, \fId\fR [\fB, \fIcome\fR] ]\fB)\fR
+Restituisce il numero di elementi del
+vettore di partenza
+.IR s .
+Il comportamento � lo stesso di
+.BR asort() ,
+con la differenza che l'ordinamento � fatto usando gli
+.I indici
+del vettore, e non i valori.
+Fatto l'ordinamento, il vettore � indicizzato numericamente, e
+i valori sono quelli degli indici di partenza.
+I valori originali sono persi; quindi va utilizzato
+un secondo vettore se si vuole conservare il vettore di partenza.
+Lo scopo della stringa facoltativa
+.I come
+� lo stesso descritto in precedenza per
+.BR asort() .
+.TP
+\fBgensub(\fIr\fB, \fIs\fB, \fIh \fR[\fB, \fIt\fR]\fB)\fR
+Cerca nella stringa obiettivo
+.I t
+corrispondenze con l'espressione regolare
+.IR r .
+Se
+.I h
+� una stringa che inizia con
+.B g
+o
+.BR G ,
+tutte le corrispondenze con
+.I r
+sono sostituite con
+.IR s .
+Altrimenti,
+.I h
+� un numero che indica la particolare corrispondenza con
+.I r
+che si vuole sostituire.
+Se
+.I t
+non � specificata, � usato
+.B $0
+al suo posto.
+All'interno del testo di rimpiazzo
+.IR s
+si pu� utilizzare la sequenza
+.BI \e n\fR,
+dove
+.I n
+� una cifra tra 1 e 9, per indicare la parte di testo che corrisponde alla
+.IR n -esima
+sottoespressione tra parentesi.
+La sequenza
+.B \e0
+rappresenta tutto il testo corrispondente, e cos� pure il carattere
+.BR & .
+A differenza di
+.B sub()
+e
+.BR gsub() ,
+la stringa modificata � restituita come risultato della funzione, e
+la stringa obiettivo originale resta
+.IR inalterata .
+.TP "\w'\fBsprintf(\^\fIfmt\fB\^, \fIlista-espressioni\^\fB)\fR'u+1n"
+\fBgsub(\fIr\fB, \fIs \fR[\fB, \fIt\fR]\fB)\fR
+Per ogni sottostringa conforme all'espressione regolare
+.I r
+nella stringa
+.IR t ,
+sostituisce la stringa
+.IR s ,
+e restituisce il numero di sostituzioni.
+Se
+.I t
+non � specificata, usa
+.BR $0 .
+Una
+.B &
+nel testo di rimpiazzo � sostituita dal testo trovato corrispondente alla
+espressione regolare.
+Si usi
+.B \e&
+per indicare il carattere
+.BR &
+inteso letteralmente (va scritto come \fB"\e\e&"\fP;
+vedere \*(EP
+per una trattazione pi� completa delle regole sull'uso della "e commerciale" (ampersand)
+e delle barre inverse nel testo di rimpiazzo di
+.BR sub() ,
+.BR gsub() ,
+e
+.BR gensub() ).
+.TP
+.BI index( s , " t" )
+Restituisce la posizione della stringa
+.I t
+all'interno della stringa
+.IR s ,
+o zero se la stringa
+.I t
+non � presente.
+(Ci� implica che gli indici di una stringa di caratteri partono da 1.)
+� un errore fatale usare una costante generata da un'espressione regolare per
+.IR t .
+.TP
+\fBlength(\fR[\fIs\fR]\fB)
+Restituisce la lunghezza della stringa
+.IR s ,
+oppure la lunghezza di
+.B $0
+se
+.I s
+non � specificata.
+Come estensione non-standard, se si fornisce come argomento un vettore,
+.B length()
+restituisce il numero di elementi del vettore.
+.TP
+\fBmatch(\fIs\fB, \fIr \fR[\fB, \fIa\fR]\fB)\fR
+Restituisce la posizione in
+.I s
+in cui ricorre l'espressione regolare
+.IR r ,
+oppure zero se
+.I r
+non � presente, e imposta i valori di
+.B RSTART
+e
+.BR RLENGTH .
+Si noti che l'ordine degli argomenti � lo stesso in uso per l'operatore
+.BR ~ :
+.IB stringa " ~"
+.IR espressione-regolare .
+.ft R
+Se viene specificato il vettore
+.IR a ,
+.I a
+viene preventivamente svuotato e quindi i suoi elementi da 1 a
+.I n
+sono riempiti con le parti di
+.I s
+corrispondenti alle sottoespressioni
+fra parentesi presenti in
+.IR r .
+L'elemento di indice zero di
+.I a
+contiene la parte
+di
+.I s
+corrispondente all'intera espressione regolare
+.IR r .
+Gli indici
+\fBa[\fIn\^\fB, "inizio"]\fR,
+e
+\fBa[\fIn\^\fB, "lunghezza"]\fR
+contengono l'indice di inizio all'interno della stringa e la lunghezza,
+rispettivamente, di ogni sottostringa individuata.
+.TP
+\fBpatsplit(\fIs\fB, \fIa \fR[\fB, \fIr\fR [\fB, \fIseps\fR] ]\fB)\fR
+Suddivide la stringa
+.I s
+nel vettore
+.I a
+e il vettore dei separatori
+.I seps
+nell'espressione regolare
+.IR r ,
+e restituisce il numero dei campi.
+I valori di ogni elemento [del vettore] sono le parti di
+.I s
+che corrispondono a
+.IR r .
+Il valore di
+.BI seps[ i ]
+� il separatore (che potrebbe anche essere la stringa nulla) individuato
+davanti a
+.BI a[ i ]\fR.
+Il valore di
+.B seps[0]
+� il separatore iniziale (che potrebbe anche essere la stringa nulla).
+Se
+.I r
+� omesso,
+.B FPAT
+viene usato al suo posto.
+I vettori
+.I a
+e
+.I seps
+sono svuotati all'inizio dell'operazione.
+La suddivisione si comporta come la suddivisione in campi con
+.BR FPAT ,
+descritta sopra.
+.TP
+\fBsplit(\fIs\fB, \fIa \fR[\fB, \fIr\fR [\fB, \fIseps\fR] ]\fB)\fR
+Suddivide la stringa
+.I s
+nel vettore
+.I a
+e nel vettore di separatori
+.I seps
+individuati dall'espressione regolare
+.IR r ,
+e restituisce il numero di campi.  Se
+.I r
+� omessa, il separatore utilizzato �
+.BR FS .
+I vettori
+.I a
+e
+.I seps
+sono svuotati all'inizio dell'operazione.
+.BI seps[ i ]
+� il separatore di campo individuato da
+.I r
+tra
+.BI a[ i ]
+e
+.BI a[ i +1]\fR.
+Se
+.I r
+� uno spazio singolo, gli eventuali spazi bianchi all'inizio di
+.I s
+vengono messi nell'elemento extra del vettore
+.B seps[0]
+e gli spazi bianchi alla fine vanno nell'elemento extra del vettore
+.BI seps[ n ]\fR,
+dove
+.I n
+� il valore restituito da
+.BI split( s ", " a ", " r ", " seps )\fR.
+La suddivisione si comporta come la suddivisione in campi, descritta sopra.
+Nel caso particolare in cui
+.I r
+� una stringa composta da un unico carattere, quella stringa fa da separatore,
+anche se il carattere � un metacarattere di un'espressione regolare.
+.TP
+.BI sprintf( fmt , " lista-espressioni" )
+Stampa
+.I lista-espressioni
+secondo quanto specificato dal formato
+.IR fmt ,
+e restituisce la stringa risultante.
+.TP
+.BI strtonum( str )
+Esamina
+.IR str ,
+e ne restituisce il valore numerico.
+Se
+.I str
+inizia
+con uno
+.BR 0 ,
+� considerato
+un numero ottale.
+Se
+.I str
+inizia
+con uno
+.B 0x
+o
+.BR 0X ,
+� considerato
+un numero esadecimale.
+Altrimenti, viene interpretato come numero decimale.
+.TP
+\fBsub(\fIr\fB, \fIs \fR[\fB, \fIt\fR]\fB)\fR
+Si comporta come
+.BR gsub() ,
+ma � sostituita solo la prima sottostringa trovata.
+Viene restituito zero oppure uno.
+.TP
+\fBsubstr(\fIs\fB, \fIi \fR[\fB, \fIn\fR]\fB)\fR
+Restituisce una sottostringa, lunga al massimo
+.IR n -caratteri,
+di
+.I s
+a partire dalla posizione
+.IR i .
+Se
+.I n
+� omesso, � usato il resto di
+.IR s .
+.TP
+.BI tolower( str )
+Restituisce una copia della stringa
+.IR str ,
+con tutti i caratteri maiuscoli in
+.I str
+tradotti nei minuscoli corrispondenti.
+I caratteri non alfabetici restano invariati.
+.TP
+.BI toupper( str )
+Restituisce una copia della stringa
+.IR str ,
+con tutti i caratteri minuscoli di
+.I str
+tradotti nei maiuscoli corrispondenti.
+I caratteri non alfabetici restano invariati.
+.PP
+.I Gawk
+gestisce i caratteri multi-byte.  Ci� implica che
+.BR index() ,
+.BR length() ,
+.B substr()
+e
+.B match()
+lavorano in termini di caratteri, non di byte.
+.SS Funzioni di tempo
+Poich� uno dei principali campi di applicazione dei programmi \*(AK � l'elaborazione
+dei file di log contenenti informazioni relative alla data e all'ora [di un evento],
+.I gawk
+mette a disposizione le seguenti funzioni per ottenere data e ora
+e per formattarle come desiderato.
+.PP
+.TP "\w'\fBsystime()\fR'u+1n"
+\fBmktime(\fIdatespec\fR [\fB, \fIutc-flag\fR]\fB)\fR
+Traduce
+.I datespec
+In una marcatura temporale nello stesso formato restituito dalla funzione [del linguaggio C]
+.BR systime() ,
+e restituisce il risultato.
+Il parametro
+.I datespec
+� una stringa nella forma
+.IR "YYYY MM DD HH MM SS[ DST]" .
+Il contenuto della stringa consiste in sei o sette numeri che rappresentano rispettivamente:
+l'anno, incluso il secolo,
+il mese, da 1 a 12,
+il giorno del mese da 1 a 31,
+l'ora del giorno da 0 a 23,
+il minuto da 0 a 59,
+il secondo da 0 a 60,
+e un flag facoltativo riguardo all'ora legale.
+I valori di questi numeri non sono limitati agli intervalli sopra descritti;
+per esempio, un'ora di \-1 significa 1 ora prima di mezzanotte.
+Si suppone di lavorare con un calendario gregoriano dotato di anno 0,
+con l'anno 0 prima dell'anno 1 e l'anno \-1 prima dell'anno 0.
+Se il flag
+.I utc-flag
+� presente e diverso da zero e dalla stringa nulla,
+il tempo � supposto essere quello del fuso orario UTC
+[ora di Greenwich];
+altrimenti, si suppone che il tempo sia quello del
+fuso orario locale.
+Se il flag
+.I DST
+(daylight saving time - ora legale) � positivo,
+si suppone che ci si trovi in un periodo dell'anno in cui vige l'ora legale;
+se vale zero, l'ora � ritenuta essere quella standard [ora di Greenwich];
+se � negativa (questo � il comportamento predefinito),
+.B mktime()
+tenta di determinare se � in vigore l'ora legale
+nel momento specificato.
+Se
+.I datespec
+non contiene sufficienti elementi o se il tempo risultante
+� fuori intervallo,
+.B mktime()
+restituisce \-1.
+.TP
+\fBstrftime(\fR[\fIformat \fR[\fB, \fItimestamp\fR[\fB, \fIutc-flag\fR]]]\fB)\fR
+Formatta
+.I timestamp
+secondo quanto specificato in
+.IR format .
+Se
+.I utc-flag
+� presente e diversa da zero o dalla stringa nulla, il risultato
+� in UTC [ora di Greenwich], altrimenti il risultato � nell'ora locale.
+Il
+.I timestamp
+dovrebbe essere nella forma utilizzata da
+.BR systime() .
+Se
+.I timestamp
+� omesso, sono utilizzate la data e l'ora correnti.
+Se
+.I format
+� omesso, � assunto un formato equivalente a quello dell'output del comando
+.IR date (1).
+Il formato predefinito � disponibile in
+.BR PROCINFO["strftime"] .
+Vedere le specifiche per la funzione
+.B strftime()
+in ISO C per i formati di conversione che sono
+sicuramente disponibili.
+.TP
+.B systime()
+Restituisce l'ora corrente come numero di secondi a partire da:
+(1970-01-01 00:00:00 UTC sui sistemi \*(PX).
+.SS Funzioni di manipolazione dei bit
+.I Gawk
+prevede le seguenti funzioni di manipolazione dei bit.
+Sono realizzate dapprima convertendo valori in virgola mobile con precisione
+doppia in interi nel formato
+.BR uintmax_t ,
+eseguendo l'operazione indicata, e poi convertendo il risultato
+nuovamente in virgola mobile.
+.PP
+.BR NOTA :
+Se a una delle funzioni seguenti si forniscono operandi negativi,
+il risultato � un errore fatale.
+.PP
+Le funzioni sono:
+.TP "\w'\fBrshift(\fIval\fB, \fIcontatore\fB)\fR'u+2n"
+\fBand(\fIv1\fB, \fIv2 \fR[, ...]\fB)\fR
+Restituisce il risultato derivante dall'applicazione della funzione booleana
+AND bit per bit ai valori degli argomenti della lista degli argomenti.  Gli
+argomenti devono essere almeno due.
+.TP
+\fBcompl(\fIval\fB)\fR
+Restituisce il complemento bit per bit di
+.IR val .
+.TP
+\fBlshift(\fIval\fB, \fIcontatore\fB)\fR
+Restituisce il valore di
+.IR val ,
+spostato a sinistra di
+.I contatore
+bit.
+.TP
+\fBor(\fIv1\fB, \fIv2 \fR[, ...]\fB)\fR
+Restituisce il risultato dell'applicare la funzione booleana OR bit per bit ai valori degli argomenti della lista degli argomenti.
+Gli argomenti devono essere almeno due.
+.TP
+\fBrshift(\fIval\fB, \fIcontatore\fB)\fR
+Restituisce il valore di
+.IR val ,
+spostato a destra di
+.I contatore
+bit.
+.TP
+\fBxor(\fIv1\fB, \fIv2 \fR[, ...]\fB)\fR
+Restituisce il risultato derivante dall'applicazione della funzione booleana
+XOR bit per bit ai valori degli argomenti della lista degli argomenti.  Gli
+argomenti devono essere almeno due.
+.PP
+.SS Funzioni di tipo
+La funzione seguente va usata per vettori multidimensionali.
+.TP
+\fBisarray(\fIx\fB)\fR
+Restituisce "Vero" se
+.I x
+� un vettore, altrimenti restituisce "Falso".
+[0 e la stringa nulla significano "Falso". Qualsiasi altro valore sta per "Vero".]
+.PP
+� possibile conoscere il tipo di qualsiasi variabile o elemento di vettore
+con la seguente funzione:
+.TP
+\fBtypeof(\fIx\fB)\fR
+Return a string indicating the type of
+.IR x .
+The string will be one of
+\fB"array"\fP,
+\fB"number"\fP,
+\fB"regexp"\fP,
+\fB"string"\fP,
+\fB"strnum"\fP,
+or
+\fB"undefined"\fP.
+.SS Funzioni di internazionalizzazione
+Le seguenti funzioni possono essere usate all'interno di un programma AWK
+per tradurre stringhe in fase di esecuzione del programma.
+Per informazioni pi� complete, vedere \*(EP.
+.TP
+\fBbindtextdomain(\fIdirectory \fR[\fB, \fIdominio\fR]\fB)\fR
+Specifica la directory in cui
+.I gawk
+cerca i file
+.BR \&.gmo ,
+nel caso non si trovino
+o non si possano mettere nelle directory ``standard''
+(per esempio, in fase di test).
+Restituisce la directory a cui
+.I dominio
+� ``collegato''.
+.sp .5
+Il valore predefinito per
+.I dominio
+� il valore della variabile
+.BR TEXTDOMAIN .
+Se
+.I directory
+� impostato alla stringa nulla (\fB""\fR),
+.B bindtextdomain()
+restituisce il collegamento corrente per il
+dato
+.IR dominio .
+.TP
+\fBdcgettext(\fIstringa \fR[\fB, \fIdominio \fR[\fB, \fIcategoria\fR]]\fB)\fR
+Restituisce la traduzione della
+.I stringa
+nel dominio di testo
+.I dominio
+per la categoria di localizzazione
+.IR categoria .
+Il valore predefinito per
+.I dominio
+� il valore corrente della variabile
+.BR TEXTDOMAIN .
+Il valore predefinito per
+.I categoria
+� \fB"LC_MESSAGES"\fR.
+.sp .5
+Se si fornisce un valore per
+.IR categoria ,
+dev'essere una stringa uguale
+a una delle categorie di localizzazione note, come descritto
+in \*(EP.
+Occorre anche fornire un dominio di testo.  Si usi
+.B TEXTDOMAIN
+se ci si vuole servire del dominio corrente.
+.TP
+\fBdcngettext(\fIstringa1\fB, \fIstringa2\fB, \fInumero \fR[\fB, \fIdominio \fR[\fB, \fIcategory\fR]]\fB)\fR
+Restituisce la forma plurale in uso per
+.I numero
+nella traduzione di
+.I stringa1
+e
+.I stringa2
+nel
+dominio di testo
+.I dominio
+per la categoria di localizzazione
+.IR categoria .
+Il valore predefinito per
+.I dominio
+� il valore corrente della variabile
+.BR TEXTDOMAIN .
+Il valore predefinito per
+.I categoria
+� \fB"LC_MESSAGES"\fR.
+.sp .5
+Se si fornisce un valore per
+.IR categoria ,
+dev'essere una stringa uguale
+a una delle categorie di localizzazione note, come descritto
+in \*(EP.
+Occorre anche fornire un dominio di testo.  Si usi
+.B TEXTDOMAIN
+se ci si vuole servire del dominio corrente.
+.SH FUNZIONI DEFINITE DALL'UTENTE
+Le funzioni in \*(AK sono definite in questo modo:
+.PP
+.RS
+\fBfunction \fInome\fB(\fIlista-di-parametri\fB) { \fIistruzioni \fB}\fR
+.RE
+.PP
+Le funzioni vengono eseguite se chiamate dall'interno di espressioni,
+presenti sia all'interno di criteri di ricerca, che all'interno di azioni.
+I parametri forniti al momento della chiamata sono sostituiti
+ai parametri formali dichiarati nella funzione.
+I vettori sono passati per riferimento, le altre variabili per valore.
+.PP
+Poich� le funzioni non erano in origine previste nel linguaggio \*(AK,
+la gestione delle variabili locali � piuttosto goffa: sono dichiarate
+semplicemente come parametri in pi� nella lista dei parametri formali.
+Per convenzione, si usa separare le variabili locali dai veri parametri
+con qualche spazio in pi� nella lista. Per esempio:
+.PP
+.RS
+.ft B
+.nf
+function  f(p, q,     a, b)	# a e b sono variabili locali
+{
+	\&.\|.\|.
+}
+
+/abc/	{ .\|.\|. ; f(1, 2) ; .\|.\|. }
+.fi
+.ft R
+.RE
+.PP
+La parentesi di sinistra che indica una chiamata deve seguire immediatamente
+il nome della funzione chiamata, senza spazi in mezzo; questo per evitare
+l'ambiguit� sintattica con l'operatore di concatenazione [di stringhe].
+Questa restrizione non si applica alle funzioni predefinite elencate sopra.
+.PP
+Le funzioni possono chiamare a loro volta altre funzioni, e possono essere ricorsive.
+I parametri utilizzati come variabili locali sono inizializzati
+alla stringa nulla e al numero zero al momento dell'invocazione.
+.PP
+Si usi
+.BI return " expr"
+per restituire un valore da una funzione.  Il valore di ritorno � indefinito se
+non si fornisce alcun valore, o se la funzione ritorna automaticamente dopo aver
+eseguito l'ultima istruzione della funzione stessa, nella modalit� detta \*(lqfalling off\*(rq.
+.PP
+Come estensione
+.I gawk
+le funzioni possono essere chiamate indirettamente.  Per far ci� basta assegnare
+il nome della funzione da chiamare, in formato stringa, a una variabile.  Poi
+si usi la variabile come se fosse un nome di funzione, premettendole il segno
+.B @
+come si pu� vedere qui sotto:
+.RS
+.ft B
+.nf
+function mia_funzione()
+{
+	print "mia_funzione � stata chiamata"
+	\&.\|.\|.
+}
+
+{	.\|.\|.
+	nome_funzione = "mia_funzione"
+	@nome_funzione()	# chiamata tramite nome_funzione di mia_funzione
+	.\|.\|.
+}
+.fi
+.ft R
+.RE
+A partire dalla versione 4.1.2, questo vale per le funzioni definite
+dall'utente, per quelle predefinite e per le funzioni di estensione.
+.PP
+Se � stata data l'opzione
+.BR \-\^\-lint ,
+.I gawk
+avvertir� in caso di chiamate a funzioni indefinite al momento della
+valutazione sintattica del programma anzich� durante l'esecuzione.
+La chiamata di una funzione indefinita in fase di esecuzione
+� un errore fatale.
+.PP
+Si pu� usare la parola
+.B func
+al posto di
+.BR function .
+anche se questo modo di operare � deprecato.
+.SH CARICARE DINAMICAMENTE NUOVE FUNZIONI
+Si possono aggiungere dinamicamente nuove funzioni predefinite all'interpreter
+.I gawk
+con l'istruzione
+.BR @load .
+Una descrizione dettagliata non � possibile in questa pagina di manuale;
+vedere \*(EP.
+.SH SEGNALI
+Il profilo
+.I gawk
+riconosce due segnali.
+.B SIGUSR1
+provoca la scrittura di un profilo e dello stack delle chiamate a funzione nel
+file di profilazione, che ha per nome
+.BR awkprof.out ,
+o qualsiasi nome sia stato fornito specificando l'opzione
+.BR \-\^\-profile .
+Poi l'esecuzione del programma prosegue regolarmente.
+.B SIGHUP
+chiede a
+.I gawk
+di scrivere il profilo e lo stack delle chiamate a funzione e di terminare l'esecuzione del programma.
+.SH INTERNAZIONALIZZAZIONE
+.PP
+Le costanti di tipo stringa sono sequenze di caratteri racchiuse fra doppi
+apici.  In un ambiente dove non si parla inglese, � possibile segnare delle
+stringhe in un programma \*(AK per richiederne la traduzione nel linguaggio
+utilizzato in loco.  Tali stringhe sono precedute nel programma \*(AK da
+un carattere di sottolineatura (\*(lq_\*(rq).  Per esempio,,
+.sp
+.RS
+.ft B
+gawk 'BEGIN { print "hello, world" }'
+.RE
+.sp
+.ft R
+stampa sempre il messaggio
+.BR "hello, world" .
+Ma,
+.sp
+.RS
+.ft B
+gawk 'BEGIN { print _"hello, world" }'
+.RE
+.sp
+.ft R
+potrebbe invece stampare
+.B "bonjour, monde"
+se eseguito in Francia.
+.PP
+Parecchi passi sono necessari per produrre ed eseguire un programma \*(AK
+localizzabile.
+.TP "\w'4.'u+2n"
+1.
+Aggiungere un'azione
+.B BEGIN
+per assegnare un valore alla variabile
+.B TEXTDOMAIN
+per impostare il dominio del testo a un nome associato al programma in uso:
+.sp
+.in +5m
+.ft B
+BEGIN { TEXTDOMAIN = "mio_programma" }
+.ft R
+.in -5m
+.sp
+Ci� consente a
+.I gawk
+di trovare il file
+.B \&.gmo
+associato al vostro programma.
+Se non si fa ci�,
+.I gawk
+usa il dominio di testo associato ai
+.B messaggi
+il quale, molto probabilmente, non contiene
+le traduzioni necessarie al programma in uso.
+.TP
+2.
+Far precedere a tutte le stringhe da tradurre il carattere "_".
+.TP
+3.
+Se � il caso, usare le funzioni
+.B dcgettext()
+e/o
+.B bindtextdomain()
+nel programma, secondo necessit�.
+.TP
+4.
+Eseguite il comando
+.B "gawk \-\^\-gen\-pot \-f mio_programma.awk > mio_programma.pot"
+per generare un file
+.B \&.pot
+per il programma [questo file contiene i messaggi da tradurre e la
+struttura in cui inserire la traduzione]
+.TP
+5.
+Preparare delle traduzioni appropriate dei messaggi, e costruire [con make]
+il corrispondente file
+.B \&.gmo
+[che contiene messaggi e traduzioni in formato accessibile da gawk].
+.PP
+Le procedure da usare per la traduzione sono descritte in dettaglio in \*(EP.
+.SH COMPATIBILIT� POSIX
+Un obiettivo fondamentale di
+.I gawk
+� la compatibilit� con lo standard \*(PX, come pure con
+l'ultima versione di
+.IR awk
+scritta da Brian Kernighan.
+Per questa ragione
+.I gawk
+include le seguenti caratteristiche a disposizione dell'utente
+che non sono descritte nel libro di \*(AK,
+ma che fanno parte della versione di
+.I awk
+scritta da Brian Kernighan, e che sono incluse nello standard \*(PX.
+.PP
+Il libro indica che l'assegnazione delle variabili fornite sulla riga di
+comando � fatta subito prima che
+.I awk
+apra il primo file fra gli argomenti, il che avviene dopo che la
+regola
+.B BEGIN
+� stata eseguita.  Peraltro, in implementazioni precedenti, quando una tale
+assegnazione compariva prima di un nome di file, l'assegnazione sarebbe
+avvenuta 
+.I prima
+di eseguire la regola
+.BR BEGIN .
+Esistono applicazioni che dipendono da questa \*(lqfunzionalit�.\*(rq
+Quando
+.I awk
+� stato cambiato per corrispondere alla sua documentazione l'opzione
+.B \-v
+per assegnare valori alle variabili prima dell'inizio dell'esecuzione � stata aggiunta
+per tener conto delle applicazioni che dipendevano dal precedente comportamento.
+(Questa funzionalit� ha ottenuto l'approvazione sia dei Bell Laboratories
+che degli sviluppatori di \*(GN .)
+.PP
+Nella scansione degli argomenti,
+.I gawk
+usa l'opzione speciale \*(lq\-\^\-\*(rq per segnalare la fine degli
+argomenti.
+In modalit� compatibile, emette un messaggio e poi ignora le
+opzioni non disponibili.
+Nella modalit� normale di operazione, siffatti argomenti sono passati al programma \*(AK
+per essere trattati.
+.PP
+Il libro di \*(AK non definisce il valore restituito dalla funzione
+.BR srand() .
+Lo standard \*(PX
+richiede che restituisca il "seme" che � stato usato, per consentire di tener traccia
+delle sequenze di numeri casuali.  Pertanto
+.B srand()
+in
+.I gawk
+restituisce anche il suo "seme" corrente.
+.PP
+Altre funzionalit� sono:
+L'uso di opzioni
+.B \-f
+multiple (dalla versione MKS [Mortice Kern Systems] di
+.IR awk );
+il vettore
+.BR ENVIRON ;
+le sequenze di protezione
+.BR \ea ,
+e
+.B \ev
+(provenienti originalmente da
+.I gawk
+e poi riversate nella versione Bell Laboratories); le funzioni predefinite
+.B tolower()
+e
+.B toupper()
+(dalla versione Bell Laboratories); e le specifiche di conversione ISO C in
+.B printf
+(presenti per prime nella versione Bell Laboratories).
+.SH FUNZIONALIT� STORICHE
+C'� una caratteristica dell'implementazione storica di \*(AK che
+.I gawk
+supporta:
+� possibile chiamare la funzione predefinita
+.B length()
+non solo senza alcun argomento, ma perfino senza parentesi!
+Quindi,
+.RS
+.PP
+.ft B
+a = length	# Sant'Algol 60, Batman!
+.ft R
+.RE
+.PP
+equivale sia a
+.RS
+.PP
+.ft B
+a = length()
+.br
+a = length($0)
+.ft R
+.RE
+.PP
+Usare questa funzionalit� � una pratica deprecata, e
+.I gawk
+emette un messaggio di avvertimento se la si usa, qualora si sia specificato
+.B \-\^\-lint
+sulla riga di comando.
+.SH ESTENSIONI GNU
+.I Gawk
+ha fin troppe estensioni rispetto alla versione \*(PX di
+.IR awk .
+Esse sono descritte in questa sezione.  Tutte le estensioni qui descritte
+possono essere disabilitate
+invocando
+.I gawk
+con le opzioni
+.B \-\^\-traditional
+o
+.BR \-\^\-posix .
+.PP
+Le seguenti funzionalit� di
+.I gawk
+sono sono disponibili nella versione
+\*(PX di
+.IR awk .
+.\" Variabili d'ambiente e cose relative all'avvio programma
+.TP "\w'\(bu'u+1n"
+\(bu
+Non viene fatta una ricerca nelle librerie per file richiamati tramite l'opzione
+.BR \-f .
+Quindi la variabile d'ambiente
+.B AWKPATH
+non � speciale.
+.\" Problemi POSIX e di riconoscimento del linguaggio
+.TP
+\(bu
+Non c'� modo di includere dei file da programma (il meccanismo
+.RI gawk
+di
+.BR @include ).
+.TP
+\(bu
+Non c'� modo di aggiungere dinamicamente nuove funzioni
+scritte in C (meccanismo
+.B @load
+di
+.IR gawk ).
+.TP
+\(bu
+La sequenza di protezione
+.BR \ex .
+.TP
+\(bu
+La possibilit� di continuare delle righe dopo un
+.B ?
+e i
+.BR : .
+.TP
+\(bu
+Costanti ottali ed esadecimali nei programmi AWK.
+.\" Variabili speciali
+.TP
+\(bu
+Le variabili
+.BR ARGIND ,
+.BR BINMODE ,
+.BR ERRNO ,
+.BR LINT ,
+.BR PREC ,
+.BR ROUNDMODE ,
+.B  RT
+e
+.B  TEXTDOMAIN
+non sono speciali.
+.TP
+\(bu
+La variabile
+.B IGNORECASE
+e i suoi effetti collaterali non sono disponibili.
+.TP
+\(bu
+La variabile
+.B FIELDWIDTHS
+e la suddivisione in campi di larghezza fissa e variabile.
+.TP
+\(bu
+La variabile
+.B FPAT
+e la suddivisione in campi sulla base dei valori di un campo.
+.TP
+\(bu
+I vettori
+.BR FUNCTAB ,
+.BR SYMTAB ,
+e
+.B PROCINFO
+non sono disponibili.
+.\" Cose relative all'I/O
+.TP
+\(bu
+L'uso della variabile
+.B RS
+come espressione regolare.
+.TP
+\(bu
+I nomi di file speciali disponibili per ridirigere l'I/O non sono riconosciuti.
+.TP
+\(bu
+L'operatore
+.B |&
+utilizzabile per creare coprocessi.
+.TP
+\(bu
+I criteri di confronto speciali
+.B BEGINFILE
+e
+.B ENDFILE
+non sono disponibili.
+.\" Modifiche alle funzioni standard awk
+.TP
+\(bu
+La possibilit� di separare fra loro singoli caratteri usando la stringa nulla
+come valore per la variabile
+.BR FS ,
+e come terzo argomento nella funzione
+.BR split() .
+.TP
+\(bu
+Un quarto argomento opzionale per
+.B split()
+che riceva i testi da usare come separatori.
+.TP
+\(bu
+Il secondo argomento opzionale della funzione
+.BR close() .
+.TP
+\(bu
+Il terzo argomento opzionale della funzione
+.BR match() .
+.TP
+\(bu
+La possibilit� di usare specificatori posizionali con
+.B printf
+e
+.BR sprintf() .
+.TP
+\(bu
+La possibilit� di avere un vettore come argomento alla funzione
+.BR length() .
+.\" Nuove parole-chiave o modifiche a parole-chiave
+.\" (Dal 2012, queste sono comprese in POSIX)
+.\" .TP
+.\" \(bu
+.\" L'uso dell'istruzione
+.\" .BI delete " array"
+.\" per cancellare tutto il contenuto di un vettore.
+.\" .TP
+.\" \(bu
+.\" L'uso dell'istruzione
+.\" .B "nextfile"
+.\" per interrompere la lettura del file di input corrente.
+.\" Nuove funzioni
+.TP
+\(bu
+Le funzioni
+.BR and() ,
+.BR asort() ,
+.BR asorti() ,
+.BR bindtextdomain() ,
+.BR compl() ,
+.BR dcgettext() ,
+.BR dcngettext() ,
+.BR gensub() ,
+.BR lshift() ,
+.BR mktime() ,
+.BR or() ,
+.BR patsplit() ,
+.BR rshift() ,
+.BR strftime() ,
+.BR strtonum() ,
+.B systime()
+e
+.BR xor() .
+.\" Cose I18N
+.TP
+\(bu
+Stringhe traducibili in varie lingue.
+.TP
+\(bu
+Errore di I/O non-fatale.
+.TP
+\(bu
+I/O ritentabile.
+.PP
+Il libro \*(AK non definisce il valore restituito dalla funzione
+.BR close() .
+Invece la funzione
+.B close()
+di
+.I Gawk
+restituisce il valore ottenuto da
+.IR fclose (3)
+o
+.IR pclose (3)
+alla chiusura, rispettivamente, di un file di output o di una pipe.  Alla
+chiusura di una pipe di input viene restituito lo stato di uscita del processo.
+Il valore restituito � \-1 se il file, la pipe o il coprocesso in questione
+non sono stati aperti con una ridirezione.
+.PP
+Quando
+.I gawk
+� invocato con l'opzione
+.BR \-\^\-traditional ,
+se
+l'argomento
+.I fs
+all'opzione
+.B \-F
+� \*(lqt\*(rq,
+.B FS
+� impostato avendo come valore il carattere di tabulazione (<TAB>).
+Si noti che immettendo
+.B "gawk \-F\et \&.\|.\|."
+si chiede alla shell di preservare \*(lqt,\*(rq e non di passare
+\*(lq\et\*(rq all'opzione
+.BR \-F .
+Poich� questo � un caso speciale piuttosto antipatico, non � il comportamento
+predefinito.  Questo comportamento non viene seguito neppure quando si specifica
+.BR \-\^\-posix .
+Per ottenere che un carattere <TAB> faccia da delimitatore di campo, � meglio
+usare apici singoli:
+.BR "gawk \-F'\et' \&.\|.\|." .
+.ig
+.PP
+Se
+.I gawk
+� stato compilato richiedendo la possibilit� di far del debugging,
+sono accettate le seguenti opzioni addizionali:
+.TP
+.PD 0
+.B \-Y
+.TP
+.PD
+.B \-\^\-parsedebug
+Attiva l'output diagnostico di
+.IR yacc (1)
+o
+.IR bison (1)
+durante la fase di esame del programma.
+Quest'opzione dovrebbe interessare solo i manutentori di
+.IR gawk ,
+e pu� essere perfino assente da una particolare compilazione di
+.IR gawk .
+..
+.SH VARIABILI D'AMBIENTE
+La variabile d'ambiente
+.B AWKPATH
+pu� essere usata per fornire una lista di directory che
+.I gawk
+esamina alla ricerca di file coi nomi indicati tramite le opzioni
+.BR \-f ,
+.RB \-\^\-file ,
+.B \-i
+e
+.BR \-\^\-include ,
+e tramite la direttiva
+.BR @include .
+Se la ricerca iniziale non ha successo, una seconda ricerca �
+effettuata accodando
+.B \&.awk
+al nome del file indicato.
+.PP
+La variabile d'ambiente
+.B AWKLIBPATH
+pu� essere usata per fornire una lista di directory che
+.I gawk
+esamina alla ricerca di file coi nomi indicati tramite le opzioni
+.B \-l
+e
+.B \-\^\-load
+.
+.PP
+La variabile d'ambiente
+.B GAWK_READ_TIMEOUT
+pu� essere usata per specificare un tempo massimo
+in millisecondi per leggere input da un terminale, da una pipe
+o da una comunicazione bidirezionale, inclusi i socket.
+.PP
+Per le connessioni a un host remoto via socket,
+.B GAWK_SOCK_RETRIES
+controlla il numero di tentativi di lettura, e
+.B GAWK_MSEC_SLEEP
+l'intervallo fra un tentativo di lettura e l'altro.
+L'intervallo � in millisecondi.  Su sistemi che non supportano
+.IR usleep (3),
+il valore � arrotondato a un numero intero di secondi.
+.PP
+Se la variabile
+.B POSIXLY_CORRECT
+esiste nell'ambiente,
+.I gawk
+si comporta esattamente come se
+.B \-\^\-posix
+fosse stato specificato sulla riga di comando.
+Se
+.B \-\^\-lint
+� stato specificato,
+.I gawk
+emette un messaggio di avvertimento riguardo a questo.
+.SH STATO DI USCITA
+Se l'istruzione
+.B exit
+� usata avendo come parametro un valore,
+.I gawk
+termina restituendo
+il valore numerico in questione.
+.PP
+Altrimenti, se non sono stati riscontrati problemi in fase di esecuzione,
+.I gawk
+termina con il valore della costante C
+.BR EXIT_SUCCESS .
+Questo valore � normalmente zero.
+.PP
+In caso di errore,
+.I gawk
+termina con il valore della
+costante C
+.BR EXIT_FAILURE .
+Questo valore � normalmente uno.
+.PP
+Se
+.I gawk
+termina a causa di un errore fatale, il valore restituito � 2.  Su sistemi
+non-POSIX, questo valore pu� essere visualizzato come
+.BR EXIT_FAILURE .
+.SH INFORMAZIONE SULLA VERSIONE
+Questa pagina man documenta
+.IR gawk ,
+versione 4.2.
+.SH AUTORI
+La versione originale di \*(UX
+.I awk
+� stata progettata e implementata da Alfred Aho,
+Peter Weinberger, e Brian Kernighan dei Bell Laboratories.  Brian Kernighan
+continua a mantenere e migliorare il programma.
+.PP
+Paul Rubin e Jay Fenlason,
+della Free Software Foundation, hanno scritto
+.IR gawk ,
+in modo che fosse compatibile con la versione originale di
+.I awk
+distribuita con la Settima Edizione di \*(UX.
+John Woods ha contribuito con numerose correzioni di errori.
+David Trueman, con contribuzioni
+da Arnold Robbins, ha reso
+.I gawk
+compatibile con la nuova versione di \*(UX
+.IR awk .
+Arnold Robbins � il manutentore corrente.
+.PP
+Vedere \*(EP per una lista completa di contributori a
+.I gawk
+e alla sua documentazione.
+.PP
+Vedere il file
+.B README
+nella distribuzione
+.I gawk
+per informazioni aggiornate riguardo ai manutentori
+e per sapere per quali sistemi operativi gawk � disponibile.
+.PP
+Traduzione in italiano a cura di
+ILDP - Italian Linux Documentation Project
+.B http://www.pluto.it/ildp
+.SH SEGNALAZIONE DI ERRORI
+Se trovate un bug in
+.IR gawk ,
+siete pregati di inviare un messaggio di posta elettronica a
+.BR \%bug-gawk@gnu.org .
+Siete pregati di includere il vostro sistema operativo e la versione di
+.I gawk
+(da
+.BR "gawk \-\^\-version" ),
+quale compilatore C avete usato per compilarlo, e un programma di test
+con anche i dati, ridotti allo stretto necessario, per riprodurre il problema.
+.PP
+Prima di spedire un rapporto di errore fate quanto segue.  Per prima cosa,
+verificate che stiate usando l'ultima versione di
+.IR gawk .
+Molti bug (normalmente abbastanza difficili da incontrare) sono corretti in
+ogni nuova versione, e se la vostra versione � molto datata, il problema
+potrebbe essere gi� stato risolto.  Secondariamente, siete pregati di
+controllare se impostando la variabile d'ambiente
+.B LC_ALL
+a
+.B LC_ALL=C
+faccia s� che il problema scompaia.  Se cos� �, si tratta di un problema
+legato alla localizzazione, che pu� essere o meno un errore.
+Infine, siete pregati di leggere questa man page e il manuale di riferimento
+con attenzione, per assicurarvi che quello che voi ritenete essere un errore
+lo sia veramente, invece di essere solo un comportamento strano del linguaggio.
+.PP
+Qualsiasi cosa facciate,
+.B NON
+inviate un messaggio per segnalare l'errore a
+.BR comp.lang.awk .
+Anche se gli sviluppatori di
+.I gawk
+di tanto in tanto leggono questo forum, inviare qui messaggi di segnalazione
+di errore � una maniera poco affidabile per segnalare errori.  Siete invece
+pregati di usare l'indirizzo di posta elettronica scritto pi� sopra.
+Veramente!
+.PP
+Se state usando un sistema GNU/Linux o basato sulla distribuzione BSD,
+potreste rivolgervi a chi fornisce la vostra distribuzione software.
+Questo va bene, ma siete pregati di spedire una copia all'indirizzo email
+specificato, poich� non esiste alcune certezza che il vostro messaggio
+sia inoltrato al manutentore di
+.IR gawk .
+.PP
+Segnalare eventuali errori di traduzione a
+.IR ildp@pluto.it
+.SH ERRORI
+L'opzione
+.B \-F
+non � pi� necessaria, vista la possibilit� di assegnare variabili nella riga
+di comando; viene mantenuta solo per compatibilit� all'indietro.
+.SH VEDERE ANCHE
+.IR egrep (1),
+.IR sed (1),
+.IR getpid (2),
+.IR getppid (2),
+.IR getpgrp (2),
+.IR getuid (2),
+.IR geteuid (2),
+.IR getgid (2),
+.IR getegid (2),
+.IR getgroups (2),
+.IR printf (3),
+.IR strftime (3),
+.IR usleep (3)
+.PP
+.IR "The AWK Programming Language" ,
+Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger,
+Addison-Wesley, 1988.  ISBN 0-201-07981-X.
+.PP
+\*(EP,
+Edition 4.2, disponibile con il codice sorgente
+.IR gawk .
+La versione originale corrente di questo documento �
+disponibile online a:
+.BR https://www.gnu.org/software/gawk/manual .
+.PP
+La documentazione di
+.B gettext
+GNU � disponibile online a:
+.BR https://www.gnu.org/software/gettext .
+.SH ESEMPI
+.nf
+Stampa ed ordina i nomi di login di tutti gli utenti:
+
+.ft B
+	BEGIN	{ FS = ":" }
+		{ print $1 | "sort" }
+
+.ft R
+Conta le righe di un file:
+
+.ft B
+		{ nlines++ }
+	END	{ print nlines }
+
+.ft R
+Aggiunge il numero di riga all'inizio di ogni riga del file:
+
+.ft B
+	{ print FNR, $0 }
+
+.ft R
+Concatena e aggiunge numerazione (variazione sul tema):
+
+.ft B
+	{ print NR, $0 }
+
+.ft R
+Esegui un comando esterno per alcune linee di dati:
+
+.ft B
+	tail \-f access_log |
+	awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }'
+.ft R
+.fi
+.SH RICONOSCIMENTI
+Brian Kernighan
+ha fornito valida assistenza durante il test e la correzione degli errori.
+Lo ringraziamo.
+.SH COPYING PERMISSIONS
+Copyright \(co 1989, 1991, 1992, 1993, 1994, 1995, 1996,
+1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2007, 2009,
+2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+
+.SH PERMESSI DI COPIA
+Questa � una traduzione non ufficiale in italiano dei permessi di copia
+riportati nella precedente sezione "COPYING PERMISSIONS".  Non � una
+pubblicazione della Free Software Foundation, e non ha validit� legale per
+i termini di distribuzione della documentazione; solo il testo originale
+inglese ha tale validit�.
+.PP
+This is an unofficial translation into Italian of the above section "COPYING
+PERMISSIONS". It was not published by the Free Software Foundation, and does not
+legally state the distribution terms for this documentation; only
+the original English text does that. 
+.PP
+Copyright \(co 1989, 1991, 1992, 1993, 1994, 1995, 1996,
+1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 2007, 2009,
+2010, 2011, 2012, 2013, 2014, 2015, 2016
+Free Software Foundation, Inc.
+.PP
+� permesso stampare e distribuire copie letterali di questa pagina
+di manuale, a patto che il copyright e questa nota di autorizzazione
+siano conservate e presenti in ogni copia.
+.ig
+� permesso elaborare questo file con il programma troff e stampare il
+risultato, a patto che il documento stampato contenga una sezione
+identica a questa sui permessi di ristampa, tranne che per la rimozione di
+questo paragrafo (in quanto non rilevante per la pagina stampata).
+..
+.PP
+� permesso copiare e distribuire versioni modificate di questa
+pagina del manuale, sotto le condizioni poste per la copia letterale,
+a patto che l'intero lavoro derivato sia distribuito secondo permessi
+di stampa identici a questi.
+.PP
+� permesso copiare e distribuire traduzioni di questa pagina di
+manuale in un'altra lingua, sotto le condizioni poste sopra per le
+versioni modificate, salvo che quest'informazione sui
+permessi di copia e ristampa deve essere espressa in una traduzione
+approvata dalla Free Software Foundation.
diff --git a/gawk-5.0.1/doc/it/gawktexi.in b/gawk-5.0.1/doc/it/gawktexi.in
new file mode 100644
index 00000000000..158bc1a7d7e
--- /dev/null
+++ b/gawk-5.0.1/doc/it/gawktexi.in
@@ -0,0 +1,48105 @@
+\language=30
+\input texinfo   @c -*-texinfo-*-
+@c vim: filetype=texinfo
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename gawk-it.info
+@settitle Guida Utente di GNU Awk
+@documentlanguage it
+@c %**end of header (This is for running Texinfo on a region.)
+
+@dircategory Creazione e manipolazione di testi
+@direntry
+* Gawk: (gawk).                 Un linguaggio per scandire ed elaborare testi.
+@end direntry
+@dircategory Programmi di utilit@`a individuale
+@direntry
+* awk: (gawk)Avviare Gawk.                     Scansione e processo di testi.
+@end direntry
+
+@ifset FOR_PRINT
+@tex
+\gdef\xrefprintnodename#1{``#1''}
+@end tex
+@end ifset
+
+@ifclear FOR_PRINT
+@c With early 2014 texinfo.tex, restore PDF links and colors
+@tex
+\gdef\linkcolor{0.5 0.09 0.12} % Dark Red
+\gdef\urlcolor{0.5 0.09 0.12} % Also
+\global\urefurlonlylinktrue
+@end tex
+@end ifclear
+
+@ifnotdocbook
+@set BULLET @bullet{}
+@set MINUS @minus{}
+@end ifnotdocbook
+
+@ifdocbook
+@set BULLET
+@set MINUS
+@end ifdocbook
+
+@iftex
+@set VOLTE @times
+@end iftex
+@ifnottex
+@set VOLTE *
+@end ifnottex
+
+@c Let texinfo.tex give us full section titles
+@xrefautomaticsectiontitle on
+
+@c The following information should be updated here only!
+@c This sets the edition of the document, the version of gawk it
+@c applies to and all the info about who's publishing this edition
+
+@c These apply across the board.
+@set UPDATE-MONTH Maggio 2019
+@set VERSION 5.0
+@set PATCHLEVEL 1
+
+@c added Italian hyphenation stuff
+@hyphenation{ven-go-no o-met-te-re o-met-ten-do}
+
+@set GAWKINETTITLE TCP/IP Internetworking with @command{gawk}
+@ifset FOR_PRINT
+@set TITLE Programmare efficacemente in awk
+@end ifset
+@ifclear FOR_PRINT
+@set TITLE GAWK: Programmare efficacemente in AWK
+@end ifclear
+@set SUBTITLE Una Guida Utente per GNU Awk
+@set EDITION 5.0
+
+@iftex
+@set DOCUMENT libro
+@set CHAPTER capitolo
+@set APPENDIX appendice
+@set SECTION sezione
+@set SECTIONS sezioni
+@set SUBSECTION sottosezione
+@set SUBSECTIONS sottosezioni
+@ifclear SMALLPRINT
+@set DARKCORNER @inmargin{@image{lflashlight,1cm}, @image{rflashlight,1cm}}
+@end ifclear
+@ifset SMALLPRINT
+@set DARKCORNER @inmargin{@image{lflashlight,0.7cm}, @image{rflashlight,0.7cm}}
+@end ifset
+@set COMMONEXT (e.c.)
+@set PAGE pagina
+@end iftex
+@ifinfo
+@set DOCUMENT File Info
+@set CHAPTER nodo principale
+@set APPENDIX nodo principale
+@set SECTION nodo secondario
+@set SECTIONS nodi secondari
+@set SUBSECTION nodo
+@set SUBSECTIONS nodi
+@set DARKCORNER (a.b.)
+@set COMMONEXT (e.c.)
+@set PAGE videata
+@end ifinfo
+@ifhtml
+@set DOCUMENT Documento
+@set CHAPTER capitolo
+@set APPENDIX appendice
+@set SECTION sezione
+@set SECTIONS sezioni
+@set SUBSECTION sottosezione
+@set SUBSECTIONS sottosezioni
+@set DARKCORNER (a.b.)
+@set COMMONEXT (e.c.)
+@set PAGE videata
+@end ifhtml
+@ifdocbook
+@set DOCUMENT libro
+@set CHAPTER capitolo
+@set APPENDIX appendice
+@set SECTION sezione
+@set SECTIONS sezioni
+@set SUBSECTION sottosezione
+@set SUBSECTIONS sottosezioni
+@set DARKCORNER (a.b.)
+@set COMMONEXT (e.c.)
+@set PAGE pagina
+@end ifdocbook
+@ifxml
+@set DOCUMENT libro
+@set CHAPTER capitolo
+@set APPENDIX appendice
+@set SECTION sezione
+@set SECTIONS sezioni
+@set SUBSECTION sottosezione
+@set SUBSECTIONS sottosezioni
+@set DARKCORNER (a.b.)
+@set COMMONEXT (e.c.)
+@set PAGE pagina
+@end ifxml
+@ifplaintext
+@set DOCUMENT libro
+@set CHAPTER capitolo
+@set APPENDIX appendice
+@set SECTION sezione
+@set SECTIONS sezioni
+@set SUBSECTION sottosezione
+@set SUBSECTIONS sottosezioni
+@set DARKCORNER (a.b.)
+@set COMMONEXT (e.c.)
+@set PAGE pagina
+@end ifplaintext
+
+@ifdocbook
+@c empty on purpose
+@set PART1
+@set PART2
+@set PART3
+@set PART4
+@end ifdocbook
+
+@ifnotdocbook
+@set PART1 Parte I:@*
+@set PART2 Parte II:@*
+@set PART3 Parte III:@*
+@set PART4 Parte IV:@*
+@end ifnotdocbook
+
+@c some special symbols
+@iftex
+@set LEQ @math{@leq}
+@set PI @math{@pi}
+@end iftex
+@ifdocbook
+@set LEQ @inlineraw{docbook, &le;}
+@set PI @inlineraw{docbook, &pgr;}
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@set LEQ <=
+@set PI @i{pi}
+@end ifnotdocbook
+@end ifnottex
+
+@ifnottex
+@ifnotdocbook
+@macro ii{text}
+@i{\text\}
+@end macro
+@end ifnotdocbook
+@end ifnottex
+
+@ifdocbook
+@macro ii{text}
+@inlineraw{docbook,<lineannotation>\text\</lineannotation>}
+@end macro
+@end ifdocbook
+
+@ifclear FOR_PRINT
+@set FN nome-file
+@set FFN Nome-file
+@c for Italian plurals {FN}s
+@set FNS nomi-file
+@set FFNS Nomi-file
+@set DF file-dati
+@set DDF File-dati
+@set PVERSION versione
+@end ifclear
+@ifset FOR_PRINT
+@set FN nome-file
+@set FFN Nome-File
+@c for Italian plurals {FN}s
+@set FNS nomi-file
+@set FFNS Nomi-file
+@set DF file-dati
+@set DDF File-dati
+@set PVERSION Versione
+@end ifset
+
+@c For HTML, spell out email addresses, to avoid problems with
+@c address harvesters for spammers.
+@ifhtml
+@macro EMAIL{real,spelled}
+``\spelled\''
+@end macro
+@end ifhtml
+@ifnothtml
+@macro EMAIL{real,spelled}
+@email{\real\}
+@end macro
+@end ifnothtml
+
+@c Indexing macros
+@ifinfo
+
+@macro cindexawkfunc{name}
+@cindex @code{\name\}
+@end macro
+
+@macro cindexgawkfunc{name}
+@cindex @code{\name\}
+@end macro
+
+@end ifinfo
+
+@ifnotinfo
+
+@macro cindexawkfunc{name}
+@cindex @code{\name\()}, funzione
+@end macro
+
+@macro cindexgawkfunc{name}
+@cindex @code{\name\()}, funzione (@command{gawk})
+@end macro
+@end ifnotinfo
+
+@ignore
+Some comments on the layout for TeX.
+1. Use at least texinfo.tex 2016-02-05.07.
+@end ignore
+
+@c merge the function and variable indexes into the concept index
+@ifinfo
+@synindex fn cp
+@synindex vr cp
+@end ifinfo
+@iftex
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end iftex
+@ifxml
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end ifxml
+@ifdocbook
+@synindex fn cp
+@synindex vr cp
+@end ifdocbook
+
+@c If "finalout" is commented out, the printed output will show
+@c black boxes that mark lines that are too long.  Thus, it is
+@c unwise to comment it out when running a master in case there are
+@c overfulls which are deemed okay.
+
+@iftex
+@finalout
+@end iftex
+
+@copying
+@docbook
+<para>
+&ldquo;To boldly go where no man has gone before&rdquo;
+(&ldquo;Per arrivare l@`a dove nessun uomo @`e mai giunto prima&rdquo;)
+@`e un Marchio Registrato della Paramount Pictures Corporation.</para>
+
+<para>Titolo originale:</para>
+@b{Gawk: Effective AWK Programming}@*
+@i{A User's Guide for GNU Awk}
+
+<para>Published by:</para>
+<literallayout class="normal">Free Software Foundation
+51 Franklin Street, Fifth Floor -- Boston, MA  02110-1301 USA
+Tel.: +1-617-542-5942 Fax: +1-617-542-2652 Email: <email>gnu@@gnu.org</email>
+URL: <ulink url="https://www.gnu.org">https://www.gnu.org/</ulink></literallayout>
+
+<literallayout class="normal">Copyright &copy; 1989, 1991, 1992, 1993, 1996&ndash;2005, 2007, 2009&ndash;2019
+Free Software Foundation, Inc.
+All Rights Reserved.
+</literallayout>
+
+</para>Traduzione e revisione:<para>
+<literallayout class="normal">
+Antonio Giovanni Colombo -- <email>azc100(chiocciola)gmail(punto)com</email>
+Marco Curreli -- <email>marcocurreli(chiocciola)tiscali(punto)it</email>
+(Italian Linux Documentation Project (<ulink url="http://www.pluto.it/ildp">http://www.pluto.it/ildp/</ulink>)
+</literallayout>
+
+<para>Pubblicato da:</para>
+<literallayout class="normal">Free Software Foundation
+Email: <email>gnu@@gnu.org</email>
+URL: <ulink url="https://www.gnu.org">https://www.gnu.org/</ulink>
+
+e da:
+Italian Linux Documentation Project (ILDP)
+Email: <emailildp@@pluto.it
+URL: <ulink url="http://www.pluto.it/ildp">http://www.pluto.it/ildp/</ulink></literallayout>
+
+<literallayout class="normal">Copyright &copy; 2016&ndash;2019
+Free Software Foundation, Inc.
+All Rights Reserved.
+</literallayout>
+@end docbook
+
+@ifnotdocbook
+@iftex
+Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2019 @*
+Free Software Foundation, Inc.
+@end iftex
+@end ifnotdocbook
+@sp 2
+Questa @`e l'Edizione @value{EDITION} di @cite{@value{TITLE}: @value{SUBTITLE}},
+per la versione @value{VERSION}.@value{PATCHLEVEL} (o successiva)
+dell'implementazione GNU di AWK.
+@ifnottex
+@ifnotxml
+@ifnotdocbook
+(Titolo originale: @i{Gawk: Effective AWK Programming: A User's Guide for GNU Awk.)}
+@end ifnotdocbook
+@end ifnotxml
+@end ifnottex
+
+@`E garantito il permesso di copiare, distribuire e/o modificare questo
+documento seguendo i termini della Licenza per Documentazione Libera
+GNU, Versione 1.3 o ogni versione successiva pubblicata dalla Free
+Software Foundation; con le Sezioni Non Modificabili ``GNU General
+Public License'', con i testi di copertina ``Un Manuale GNU'', e con i
+testi di quarta di copertina come in (a) pi@`u avanti.
+@ifclear FOR_PRINT
+Una copia della licenza @`e acclusa nella sezione intitolata
+"Licenza per Documentazione Libera GNU".
+@end ifclear
+@ifset FOR_PRINT
+Una copia della licenza
+si pu@`o trovare in internet all'indirizzo
+@uref{https://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html,
+il sito web del Progetto GNU}.
+@end ifset
+
+@enumerate a
+@item
+Il testo di quarta di copertina della FSF @`e: ``@`E garantito il permesso di
+copiare e modificare questo manuale GNU.''
+@end enumerate
+@end copying
+
+@c Comment out the "smallbook" for technical review.  Saves
+@c considerable paper.  Remember to turn it back on *before*
+@c starting the page-breaking work.
+
+@c 4/2002: Karl Berry recommends commenting out this and the
+@c `@setchapternewpage odd', and letting users use `texi2dvi -t'
+@c if they want to waste paper.
+@c @smallbook
+
+
+@c Uncomment this for the release.  Leaving it off saves paper
+@c during editing and review.
+@setchapternewpage odd
+
+@shorttitlepage GNU Awk
+@titlepage
+@title @value{TITLE}
+@subtitle @value{SUBTITLE}
+@subtitle Edizione @value{EDITION}
+@subtitle @value{UPDATE-MONTH}
+@author Arnold D. Robbins
+
+@ifnotdocbook
+@c Include the Distribution inside the titlepage environment so
+@c that headings are turned off.  Headings on and off do not work.
+
+@page
+@vskip 0pt plus 1filll
+``To boldly go where no man has gone before''
+(``Per arrivare l@`a dove nessun uomo @`e mai giunto prima'')
+@`e un Marchio Registrato della Paramount Pictures Corporation. @*
+@c sorry, i couldn't resist
+@sp 1
+Titolo originale:@*
+@b{Gawk: Effective AWK Programming}@*
+@i{A User's Guide for GNU Awk}
+@sp 0
+Published by @strong{Free Software Foundation}@*
+51 Franklin Street, Fifth Floor -- Boston, MA  02110-1301 USA @*
+Tel.: +1-617-542-5942 -- Fax: +1-617-542-2652 -- Email: @email{gnu@@gnu.org} @*
+URL: @uref{https://www.gnu.org/}
+@sp 0
+@c This one is correct for gawk 3.1.0 from the FSF
+ISBN 1-882114-28-0
+@sp 0
+Copyright @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2018 @*
+Free Software Foundation, Inc.
+@sp 1
+Traduzione e revisione:@*
+Antonio Giovanni Colombo -- @email{azc100(chiocciola)gmail(punto)com}@*
+Marco Curreli -- @email{marcocurreli(chiocciola)tiscali(punto)it}@*
+(Italian Linux Documentation Project -- @uref{http://www.pluto.it/ildp})
+@sp 1
+Pubblicato da:
+Free Software Foundation@*
+Email: @email{gnu@@gnu.org}; URL: @uref{https://www.gnu.org/}
+
+e da:
+Italian Linux Documentation Project (ILDP)@*
+Email: @email{ildp@@pluto.it}; URL: @uref{http://www.pluto.it/ildp}
+
+@insertcopying
+@sp 1
+@end ifnotdocbook
+@end titlepage
+
+@c Thanks to Bob Chassell for directions on doing dedications.
+@iftex
+@headings off
+@page
+@w{ }
+@sp 9
+
+@ifclear SMALLPRINT
+@center @i{Ai miei genitori, per il loro amore, e per lo splendido esempio che mi hanno dato.}
+@sp 1
+@center @i{A mia moglie, Miriam, per avermi reso completo.
+Grazie per aver costruito la tua vita insieme a me.}
+@sp 1
+@center @i{Ai nostri figli, Chana, Rivka, Nachum e Malka, per aver arricchito le nostre vite in misura incalcolabile.}
+@end ifclear
+
+@ifset SMALLPRINT
+@center @i{Ai miei genitori, per il loro amore,}
+@center @i{ e per lo splendido esempio che mi hanno dato.}
+@sp 1
+@center @i{A mia moglie, Miriam, per avermi reso completo.} @*
+@center @i{ Grazie per aver costruito la tua vita insieme a me.}
+@sp 1
+@center @i{Ai nostri figli, Chana, Rivka, Nachum e Malka,}
+@center @i{per aver arricchito le nostre vite in misura incalcolabile.}
+@end ifset
+
+@sp 1
+@w{ }
+@page
+@w{ }
+@page
+@headings on
+@end iftex
+
+@docbook
+<dedication>
+<para>Ai miei genitori, per il loro amore, e per lo splendido
+esempio che mi hanno dato.</para>
+<para>A mia moglie Miriam, per avermi reso completo.
+Grazie per aver costruito la tua vita insieme con me.</para>
+<para>Ai nostri figli Chana, Rivka, Nachum e Malka,
+per aver arricchito le nostre vite in misura incalcolabile.</para>
+</dedication>
+@end docbook
+
+@iftex
+@headings off
+@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @|
+@oddheading  @| @| @strong{@thischapter}@ @ @ @thispage
+@end iftex
+
+@ifnottex
+@ifnotxml
+@ifnotdocbook
+@node Top
+@top Introduzione Generale
+@c Preface node should come right after the Top
+@c node, in `unnumbered' sections, then the chapter, `What is gawk'.
+@c Licensing nodes are appendices, they're not central to AWK.
+
+Questo file documenta @command{awk}, un programma che si pu@`o usare per
+selezionare dei record determinati in un file ed eseguire azioni su di essi.
+
+@noindent
+Copyright dell'edizione originale @copyright{} 1989, 1991, 1992, 1993, 1996--2005, 2007, 2009--2018 @*
+Free Software Foundation, Inc.
+
+@noindent
+Copyright dell'edizione italiana @copyright{} 2016 -- Free Software Foundation, Inc.
+
+
+@insertcopying
+
+@end ifnotdocbook
+@end ifnotxml
+@end ifnottex
+
+@menu
+* Introduzione3::                  Alcune parole gentili riguardo a questo
+                                   @value{DOCUMENT}.
+* Introduzione4::                  Ulteriori parole gentili.
+* Prefazione::                     Di cosa tratta questo @value{DOCUMENT};
+                                   breve storia e ringraziamenti.
+* Per iniziare::                   Un'introduzione elementare all'uso di
+                                   @command{awk}. Come eseguire un programma
+                                   @command{awk}. Sintassi della riga di
+                                   comando.
+* Invocare Gawk::                  Come eseguire @command{gawk}.
+* Espressioni regolari::           Tutto quel che c'@`e da sapere
+                                   sull'individuazione di stringhe tramite
+                                   espressioni regolari.
+* Leggere file::                   Come leggere file e manipolare campi.
+* Stampare::                       Come stampare usando @command{awk}.
+                                   Descrizione delle istruzioni @code{print} e
+                                   @code{printf}. @`E descritta inoltre la
+                                   ridirezione dell'output.
+* Espressioni::                    Le espressioni sono i componenti elementari
+                                   delle istruzioni.
+* Criteri di ricerca e azioni::    Panoramica sui criteri di ricerca e sulle
+                                   azioni.
+* Vettori::                        La descrizione e l'uso dei vettori. Sono
+                                   inoltre descritte le istruzioni di controllo
+                                   relative ai vettori.
+* Funzioni::                       Funzioni predefinite e definite dall'utente.
+* Funzioni di libreria::           Una libreria di funzioni di @command{awk}.
+* Programmi di esempio::           Molti programmi @command{awk} con
+                                   spiegazioni dettagliate.
+* Funzionalit@`a avanzate::          Roba per utenti sofisticati, propria di
+                                   @command{gawk}.
+* Internazionalizzazione::         Come far s@`{@dotless{i}} che @command{gawk} parli la
+                                   vostra lingua.
+* Debugger::                       Il debugger di @command{gawk}.
+* Spazi-dei-nomi::                      Come funzionano gli spazi-dei-nomi
+                                   (@dfn{spazi-dei-nomi}) in @command{gawk}.
+* Calcolo con precisione arbitraria:: Calcolo con precisione arbitraria in
+                                   @command{gawk}.
+* Estensioni dinamiche::           Aggiungere nuove funzioni predefinite di
+                                   @command{gawk}.
+* Storia del linguaggio::          L'evoluzione del linguaggio @command{awk}.
+* Installazione::                  Installare @command{gawk} in vari sistemi
+                                   operativi.
+* Note::                           Note riguardo ad aggiunte a @command{gawk}
+                                   e possibili futuri sviluppi.
+* Concetti fondamentali::          Velocissima introduzione alla
+                                   programmazione.
+* Glossario::                      Spiegazione di alcuni termini poco
+                                   familiari.
+* Copia::                          Il vostro diritto a copiare e distribuire
+                                   @command{gawk}.
+* Licenza per Documentazione Libera GNU (FDL):: La licenza per questo
+                                   @value{DOCUMENT}.
+* Indice analitico::               Indice dei concetti e delle variabili.
+
+@detailmenu
+* Storia::                              La storia di @command{gawk} e
+                                        @command{awk}.
+* Nomi::                                Che nome usare per trovare
+                                        @command{awk}.
+* Questo manuale::                      Uso di questo @value{DOCUMENT}.
+                                        Comprende esempi di file in input
+                                        utilizzabili.
+* Convenzioni::                         Convenzioni tipografiche.
+* Storia del manuale::                  Breve storia del progetto GNU e di
+                                        questo @value{DOCUMENT}.
+* Come contribuire::                    Un aiuto per la salvezza del mondo.
+* Ringraziamenti::                      Ringraziamenti.
+* Eseguire gawk::                       Come eseguire programmi
+                                        @command{gawk}; comprende la sintassi
+                                        della riga di comando.
+* Monouso::                             Eseguire un breve programma
+                                        @command{awk} di tipo usa-e-getta.
+* Leggere dal terminale::               Senza uso di file in input (input
+                                        immesso da tastiera).
+* Lunghi::                              Mettere programmi @command{awk}
+                                        permanenti in file.
+* @dfn{Script} eseguibili::             Preparare programmi @command{awk}
+                                        da eseguire come @dfn{script}.
+* Commenti::                            Aggiungere documentazione a programmi
+                                        @command{gawk}.
+* Protezione::                          Ulteriore discussione di problemi
+                                        connessi alle protezioni nella shell.
+* Doppi apici in DOS::                  Doppi apici in file .BAT Windows
+* File dati di esempio::                File di dati di esempio da usare nei
+                                        programmi @command{awk} illustrati in
+                                        questo @value{DOCUMENT}.
+* Molto semplice::                      Un esempio molto semplice.
+* Due regole::                          Un esempio meno semplice di programma
+                                        di una riga, che usa due regole.
+* Maggiore sofisticazione::             Un esempio pi@`u complesso.
+* Istruzioni/Righe::                    Suddividere o riunire istruzioni
+                                        su [una o pi@`u] righe.
+* Altre funzionalit@`a::                  Altre funzionalit@`a di @command{awk}.
+* Quando::                              Quando usare @command{gawk} e quando
+                                        usare altre cose.
+* Sommario dell'introduzione::          Sommario dell'introduzione.
+* Riga di comando::                     Come eseguire @command{awk}.
+* Opzioni::                             Opzioni sulla riga di comando e loro
+                                        significato.
+* Altri argomenti::                     Nomi dei file in input e assegnamento
+                                        di valori a variabili.
+* Specificare lo standard input::       Come specificare lo standard input
+                                        insieme ad altri file.
+* Variabili d'ambiente::                Le variabili d'ambiente usate da
+                                        @command{gawk}.
+* AWKPATH (Variabile)::                 Ricerca di programmi @command{awk}
+                                        in una lista di directory.
+* AWKLIBPATH (Variabile)::              Ricerca di librerie condivise
+                                        @command{awk} in una lista di
+                                        directory.
+* Altre variabili d'ambiente::          Le variabili d'ambiente.
+* Codice di ritorno::                   Il codice di ritorno all'uscita
+                                        da @command{gawk}.
+* Includere file::                      Come includere altri file nel
+                                        proprio programma.
+* Caricare librerie condivise::         Caricare librerie condivise nel
+                                        proprio programma.
+* Parti obsolete::                      Opzioni e/o funzionalit@`a obsolete.
+* Non documentato::                     Opzioni e funzionalit@`a non documentate.
+* Sommario invocazione::                Sommario di come eseguire
+                                        @command{awk}.
+* Uso di @dfn{regexp}::                 Come usare le espressioni regolari.
+* Sequenze di protezione::              Come scrivere caratteri non stampabili.
+* Operatori di espressioni regolari::   Operatori di espressioni regolari.
+* Dettagli sugli operatori di @dfn{regexp}:: Descrizione dettagliata.
+* Espressioni di intervallo::           Note sulle espressioni di intervallo.
+* Espressioni tra parentesi quadre::    Cosa possono contenere @samp{[...]}.
+* Pi@`u lungo da sinistra::               Quanto @`e lungo il testo individuato.
+* Espressioni regolari calcolate::      Usare @dfn{regexp} dinamiche.
+* Operatori di @dfn{regexp} GNU::       Operatori propri del software GNU.
+* Maiuscolo-Minuscolo::                 Fare confronti ignorando
+                                        maiuscolo/minuscolo.
+* Sommario espressioni regolari::       Sommario delle espressioni regolari.
+* Record::                              Controllare come i dati sono suddivisi
+                                        in record.
+* awk divisione record::                Divisione dei record con @command{awk}
+                                        standard.
+* gawk divisione record::               Divisione dei record con @command{gawk}.
+* Campi::                               Un'introduzione ai campi.
+* Campi non costanti::                  Numeri di campo variabili.
+* Cambiare i campi::                    Cambiare il contenuto di un campo.
+* Separatori di campo::                 I separatori di campo, e come
+                                        cambiarli.
+* Separatori di campo di default::      Come di solito sono separati i campi.
+* Separare campi con @dfn{regexp}::     Usare @dfn{regexp} come separatori.
+* Campi di un solo carattere::          Fare di ogni carattere un campo
+                                        separato.
+* Separatori campo da riga di comando:: Impostare @code{FS} dalla riga di
+                                        comando.
+* Campo intera riga::                   Fare di una riga intera un campo
+                                        solo.
+* Sommario sulla separazione campi::    Alcuni punti finali e una tavola di
+                                        sommario.
+* Dimensione costante::                 Leggere campi di larghezza costante.
+* Dati di lunghezza fissa::             Elaborare dati di lunghezza fissa.
+* Saltare campi intermedi::             Saltare campi intermedi.
+* Consentire dati a fine record::       Trattare dati opzionali a fine record.
+* Campi con dati a larghezza fissa::    Valore di campi con dati a larghezza
+                                        fissa.
+* Separazione in base al contenuto::    Definire campi dal loro contenuto.
+* Controllare la creazione di campi::   Controllare come @command{gawk} sta
+                                        dividendo i record.
+* Righe multiple::                      Record su righe multiple
+* Getline::                             Richiedere input usando @code{getline}.
+* Getline semplice::                    Usare @code{getline} senza argomenti.
+* Getline variabile::                   Usare @code{getline} in una variabile.
+* Getline file::                        Usare @code{getline} da un file.
+* Getline variabile file::              Usare @code{getline} in una variabile
+                                        da un file.
+* Getline @dfn{pipe}::                  Usare @code{getline} da una @dfn{pipe}.
+* Getline variabile @dfn{pipe}::        Usare @code{getline} in una variabile
+                                        da una @dfn{pipe}.
+* Getline coprocesso::                  Usare @code{getline} da un coprocesso.
+* Getline variabile coprocesso::        Usare @code{getline} in una variabile
+                                        da un coprocesso.
+* Note su getline::                     Cose importanti da sapere su
+                                        @code{getline}.
+* Sommario di getline::                 Sommario delle varianti di
+                                        @code{getline}.
+* Timeout in lettura::                  Leggere input entro un tempo limite.
+* Proseguire dopo errore in input::     Rielaborare input dopo certi errori.
+* Directory su riga di comando::        Cosa accade se si mette una directory
+                                        sulla riga di comando.
+* Sommario di Input::                   Sommario di Input.
+* Esercizi su Input::                   Esercizi.
+* Print::                               L'istruzione @code{print}.
+* Esempi su print::                     Semplici esempi di
+                                        istruzioni @code{print}.
+* Separatori di output::                I separatori di output e come
+                                        modificarli.
+* OFMT::                                Controllare l'output di numeri con
+                                        @code{print}.
+* Printf::                              L'istruzione @code{printf}.
+* Printf Fondamenti::                   Sintassi dell'istruzione
+                                        @code{printf}.
+* Lettere di controllo::                Lettere di controllo del formato.
+* Modificatori di formato::             Modificatori specifiche di formato.
+* Esempi su printf::                    Numerosi esempi.
+* Ridirezione::                         Come ridirigere l'output a diversi
+                                        file e @dfn{pipe}.
+* FD speciali::                         File speciali per I/O.
+* File speciali::                       Interpretazione @value{FNS} in
+                                        @command{gawk}. @command{gawk}
+                                        permette di accedere a descrittori di
+                                        file ereditati.
+* Altri file ereditati::                Accedere ad altri file aperti con
+                                        @command{gawk}.
+* Reti speciali::                       File speciali per comunicazioni con
+                                        la rete.
+* Avvertimenti speciali::               Cose a cui prestare attenzione.
+* Chiusura file e @dfn{pipe}::          Chiudere file in input e di output e
+                                        @dfn{pipe}.
+* Continuazione dopo errori::           Abilitare continuazione dopo errori
+                                        in output.
+* Sommario di Output::                  Sommario di Output.
+* Esercizi su Output::                  Esercizi.
+* Valori::                              Costanti, variabili ed espressioni
+                                        regolari.
+* Costanti::                            Costanti di tipo stringa, numeriche ed
+                                        espressioni regolari.
+* Costanti scalari::                    Costanti numeriche e stringhe.
+* Numeri non-decimali::                 Cosa sono i numeri ottali ed
+                                        esadecimali.
+* Costanti come espressioni regolari::  Costanti fornite tramite espressioni
+                                        regolari.
+* Usare le costanti @dfn{regexp}::      Quando e come usare una costante
+                                        specificata tramite espressioni
+                                        regolari
+* Costanti @dfn{regexp} normali::       Costanti @dfn{regexp} normali in
+                                        @command{awk}.
+* Costanti @dfn{regexp} forti::         Costanti @dfn{regexp} fortemente
+                                        tipizzate.
+* Variabili::                           Le variabili permettono di
+                                        definire valori da usare in seguito.
+* Usare variabili::                     Usare variabili nei propri programmi.
+* Opzioni di assegnamento::             Impostare variabili dalla riga di
+                                        comando, e un sommario della sintassi
+                                        della riga di comando.
+                                        Questo @`e un metodo di input avanzato.
+* Conversione::                         La conversione di stringhe in numeri
+                                        e viceversa.
+* Stringhe e numeri::                   Come @command{awk} converte tra
+                                        stringhe e numeri.
+* Localizzazione e conversioni::        Come la localizzazione pu@`o influire
+                                        sulle conversioni.
+* Tutti gli operatori::                 Gli operatori di @command{gawk}.
+* Operatori aritmetici::                Operazioni aritmetiche (@samp{+},
+                                        @samp{-}, etc.)
+* Concatenazione::                      Concatenazione di stringhe.
+* Operatori di assegnamento::           Cambiare il valore di una variabile
+                                        o di un campo.
+* Operatori di incremento::             Incrementare il valore numerico di una
+                                        variabile.
+* Valori e condizioni di verit@`a::       Determinare Vero/Falso.
+* Valori di verit@`a::                    Cosa @`e ``vero'' e cosa @`e ``falso''.
+* Tipi di variabile e confronti::       Come alle variabili si assegna il tipo
+                                        e l'effetto che questo ha sul confronto
+                                        di numeri e stringhe con @samp{<}, etc.
+* Tipi di variabile::                   Tipo stringa rispetto a tipo numero.
+* Operatori di confronto::              Gli operatori di confronto.
+* Confronto POSIX di stringhe::         Confronto tra stringhe usando le
+                                        regole POSIX.
+* Operatori booleani::                  Combinare espressioni di confronto
+                                        usando operatori booleani @samp{||}
+                                        (``or''), @samp{&&} (``and'') e
+                                        @samp{!} (``not'').
+* Espressioni condizionali::            Le espressioni condizionali scelgono
+                                        una tra due sottoespressioni, a
+                                        seconda del valore di una terza
+                                        sottoespressione.
+* Chiamate di funzione::                Una chiamata di funzione @`e
+                                        un'espressione.
+* Precedenza::                          Come si nidificano i vari operatori.
+* Localizzazioni::                      Come la localizzazione influenza la
+                                        gestione dati.
+* Sommario delle espressioni::          Sommario delle espressioni.
+* Panoramica sui criteri di ricerca::   Come scrivere un criterio di ricerca.
+* @dfn{regexp} come criteri di ricerca:: Espressioni regolari come criteri
+                                        di ricerca.
+* Espressioni come criteri di ricerca:: Qualsiasi espressione pu@`o servire da
+                                        criterio di ricerca.
+* Intervalli::                          Specificare intervalli di record con i
+                                        criteri di ricerca.
+* BEGIN/END::                           Specificare regole di inizio e fine
+                                        programma.
+* Usare BEGIN/END::                     Come e perch@'e usare regole BEGIN/END.
+* I/O e BEGIN/END::                     Problemi di I/O nelle regole BEGIN/END.
+* BEGINFILE/ENDFILE::                   Due condizioni speciali per controlli
+                                        avanzati.
+* Vuoto::                               Il criterio di ricerca vuoto, che
+                                        corrisponde a ogni record.
+* Usare variabili di shell::            Come usare variabili di shell in
+                                        @command{awk}.
+* Panoramica sulle azioni::             Cosa costituisce un'azione.
+* Istruzioni::                          Descrizione dettagliata delle varie
+                                        istruzioni di controllo.
+* Istruzione if::                       Eseguire in maniera condizionale
+                                        istruzioni @command{awk}.
+* Istruzione while::                    Eseguire il ciclo, finch@'e @`e
+                                        verificata una condizione.
+* Istruzione do::                       Eseguire l'azione specificata, continuare
+                                        a eseguire il ciclo
+                                        finch@'e @`e verificata una condizione.
+* Istruzione for::                      Un'altra istruzione iterativa, che
+                                        permette di specificare clausole
+                                        iniziali e di incremento.
+* Istruzione switch::                   Valutazione di quale insieme di
+                                        istruzioni eseguire, a seconda del
+                                        valore assunto da una variabile.
+* Istruzione break::                    Uscire subito dal ciclo pi@`u interno
+                                        in cui ci si trova.
+* Istruzione continue::                 Andare alla fine del ciclo pi@`u interno
+                                        in cui ci si trova.
+* Istruzione next::                     Smettere di elaborare il record
+                                        corrente.
+* Istruzione nextfile::                 Smettere di elaborare il file
+                                        corrente.
+* Istruzione exit::                     Interrompere l'esecuzione di @command{awk}.
+* Variabili predefinite::               Sommario delle variabili predefinite.
+* Variabili modificabili dall'utente::  Variabili predefinite modificabili per
+                                        controllare @command{awk}.
+* Variabili auto-assegnate::            Variabili predefinite con cui
+                                        @command{awk} fornisce informazioni.
+* ARGC e ARGV::                         Modi di usare @code{ARGC} e
+                                        @code{ARGV}.
+* Sommario criteri e azioni::           Sommario criteri e azioni.
+* Fondamenti sui vettori::              Informazioni di base sui vettori.
+* Introduzione ai vettori::             Introduzione ai vettori.
+* Visitare elementi::                   Come esaminare un elemento di un
+                                        vettore.
+* Impostare elementi::                  Come cambiare un elemento di un
+                                        vettore.
+* Esempio di vettore::                  Esempio semplice di vettore
+* Visitare un intero vettore::          Variazione dell'istruzione
+                                        @code{for}. Cicla attraverso gli
+                                        indici degli elementi contenuti in
+                                        un vettore.
+* Controllare visita::                  Controllare l'ordine in cui i vettori
+                                        sono visitati.
+* Indici numerici di vettore::          Come usare numeri come indici in
+                                        @command{awk}.
+* Indici non inizializzati::            Usare variabili non inizializzate
+                                        come indici.
+* Cancellazione::                       L'istruzione @code{delete} toglie un
+                                        elemento da un vettore.
+* Vettori multidimensionali::           Emulare vettori multidimensionali in
+                                        @command{awk}.
+* Visitare vettori multidimensionali::  Visitare vettori multidimensionali.
+* Vettori di vettori::                  Vettori multidimensionali veri.
+* Sommario dei vettori::                Sommario dei vettori.
+* Funzioni predefinite::                Riepilogo delle funzioni predefinite.
+* Chiamare funzioni predefinite::       Come chiamare funzioni predefinite.
+* Funzioni numeriche::                  Funzioni che trattano numeri, comprese
+                                        @code{int()}, @code{sin()}
+                                        e @code{rand()}.
+* Funzioni per stringhe::               Funzioni di manipolazione di stringhe,
+                                        come @code{split()}, @code{match()}
+                                        e @code{sprintf()}.
+* Dettagli ostici::                     Pi@`u di quel che si vorrebbe sapere su
+                                        @samp{\} e @samp{&} con @code{sub()},
+                                        @code{gsub()}, e @code{gensub()}.
+* Funzioni di I/O::                     Funzioni per i file e per i comandi
+                                        della shell.
+* Funzioni di tempo::                   Funzione per gestire marcature temporali.
+* Funzioni a livello di bit::           Funzioni per operazioni di
+                                         manipolazione bit.
+* Funzioni per i tipi::                 Funzioni per conoscere il tipo
+                                        di una variabile.
+* Funzioni di internazionalizzazione::  Funzioni per tradurre stringhe.
+* Funzioni definite dall'utente::       Descrizione dettagliata delle funzioni
+                                        definite dall'utente.
+* Sintassi delle definizioni::          Come scrivere definizioni e cosa
+                                        significano.
+* Esempio di funzione::                 Un esempio di definizione di
+                                        funzione e spiegazione della stessa.
+* Chiamata di una funzione::            Chiamare funzioni definite dall'utente.
+* Chiamare una funzione::               Non usare spazi.
+* Campo di validit@`a variabili::         Variabili locali e globali.
+* Parametri per valore/riferimento::    Passaggio parametri.
+* Precisazioni sulle funzioni::         Cose a cui prestare attenzione.
+* Istruzione return::                   Specificare il valore che una
+                                        funzione restituisce.
+* Variabili di tipo dinamico::          Come cambiare tipo a una variabile in
+                                        fase di esecuzione del programma.
+* Chiamate indirette::                  Scegliere la funzione da chiamare in
+                                        fase di esecuzione del programma.
+* Sommario delle funzioni::             Sommario delle funzioni.
+* Nomi di variabili di libreria::       Che nomi @`e meglio dare alle variabili
+                                        private globali nelle funzioni di
+                                        libreria
+* Funzioni di tipo generale::           Funzioni di uso generale.
+* Funzione strtonum::                   Da usare se non @`e disponibile la
+                                        funzione predefinita
+                                        @code{strtonum()}.
+* Funzione assert::                     Una funzione per controllare
+                                        affermazioni in programmi
+                                        @command{awk}.
+* Funzione round::                      Una funzione per eseguire
+                                        arrotondamenti se @code{sprintf()}
+                                        non lo fa correttamente.
+* Funzione random Cliff::               Il generatore Cliff di numeri casuali.
+* Funzioni ordinali::                   Funzioni per usare caratteri come
+                                        numeri e viceversa.
+* Funzione join::                       Una funzione per raccogliere un
+                                        vettore in una stringa.
+* Funzione getlocaltime::               Una funzione per ottenere data e
+                                        ora nel formato desiderato.
+* Funzione readfile::                   Una funzione per leggere un file
+                                        intero in un colpo solo.
+* Apici alla shell::                    Una funzione per passare stringhe
+                                        con apici alla shell.
+* Gestione File Dati::                  Funzioni for gestire file dati
+                                        specificati sulla riga di comando,
+* Funzione filetrans::                  Una funzione per gestire il passaggio
+                                        da un file in input al successivo.
+* Funzione rewind::                     Una funzione per rileggere il file
+                                        di input.
+* Controllo di file::                   Controllare che i file in input siano
+                                        accessibili.
+* File vuoti::                          Controllare se i file in input sono
+                                        vuoti.
+* Ignorare assegnamenti di variabili::  Trattare assegnamenti di variabili
+                                        come nomi di file.
+* Funzione getopt::                     Una funzione per trattare argomenti
+                                        presenti sulla riga di comando.
+* Funzioni Passwd::                     Funzioni per ottenete informazioni
+                                        sull'utente [da /etc/passwd].
+* Funzioni Group::                      Funzioni per ottenete informazioni
+                                        sul gruppo [da /etc/group].
+* Visitare vettori::                    Una funzione per visitare vettori
+                                        di vettori.
+* Sommario funzioni di libreria::       Sommario funzioni di libreria.
+* Esercizi con le librerie::            Esercizi.
+* Eseguire esempi::                     Come eseguire i programmi di esempio.
+* Cloni::                               Cloni di programmi di utilit@`a comuni.
+* Programma cut::                       Il programma di utilit@`a @command{cut}.
+* Programma egrep::                     Il programma di utilit@`a @command{egrep}.
+* Programma id::                        Il programma di utilit@`a @command{id}.
+* Programma split::                     Il programma di utilit@`a @command{split}.
+* Programma tee::                       Il programma di utilit@`a @command{tee}.
+* Programma uniq::                      Il programma di utilit@`a @command{uniq}.
+* Programma wc::                        Il programma di utilit@`a @command{wc}.
+* Programmi vari::                      Alcuni interessanti programmi in
+                                        @command{awk}
+* Programma dupword::                   Trovare parole duplicate in un
+                                        documento.
+* Programma alarm::                     Un programma di sveglia.
+* Programma translate::                 Un programma simile al comando di
+                                        utilit@`a @command{tr}.
+* Programma labels::                    Stampare etichette per lettere.
+* Programma utilizzo parole::           Un programma per produrre un contatore
+                                        dell'utilizzo di parole in un testo.
+* Programma riordino diario::           Eliminare righe doppie da un file di
+                                        cronologia.
+* Programma extract::                   Estrarre programmi da file sorgenti
+                                        Texinfo.
+* Programma sed semplice::              Un semplice editor di flusso.
+* Programma igawk::                     Un programma per fornire ad
+                                        @command{awk} la possibilit@`a di
+                                        includere file.
+* Programma anagram::                   Trovare anagrammi da una lista di
+                                        parole.
+* Programma signature::                 La gente fa cose stupefacenti se ha
+                                        troppo tempo libero.
+* Sommario dei programmi::              Sommario dei programmi.
+* Esercizi sui programmi::              Esercizi.
+* Dati non decimali::                   Consentire dati di input in base
+                                        diversa da 10.
+* Ordinamento di vettori::              Modi per controllare la visita di un
+                                        vettore e il suo ordinamento.
+* Controllare visita vettori::          Come usare PROCINFO["sorted_in"].
+* Funzioni di ordinamento di vettori::  Come usare @code{asort()} e
+                                        @code{asorti()}.
+* I/O bidirezionale::                   Comunicazione nei due sensi con un
+                                        altro processo.
+* Reti TCP/IP::                         Usare @command{gawk} per
+                                        programmazione di rete.
+* Profilare::                           Profilare i propri programmi
+                                        @command{awk}.
+* Sommario funzionalit@`a avanzate::    Sommario funzionalit@`a avanzate.
+* I18N e L10N::                         Internazionalizzazione e localiz.
+* Utilizzare @command{gettext}::        Come funziona GNU @code{gettext}.
+* I18N per programmatore::              Funzionalit@`a per il programmatore.
+* I18N per traduttore::                 Funzionalit@`a per il traduttore.
+* Estrazione di stringhe::              Estrarre stringhe marcate.
+* Ordinamento di printf::               Riordinare argomenti @code{printf}
+                                        [nelle stringhe da tradurre].
+* Portabilit@`a nell'I18N::              Problemi di portabilit@`a a livello di
+                                        @command{awk}.
+* Esempio I18N::                        Un semplice esempio di
+                                        internazionalizzazione.
+* Gawk internazionalizzato::            @command{gawk} stesso @`e
+                                        internazionalizzato.
+* Sommario I18N::                       Sommario sull'internazionalizzazione.
+* Debugging::                           Introduzione al debugger di
+                                        @command{gawk}.
+* Nozioni sul debug::                   Generalit@`a sul debug.
+* Terminologia nel debug::              Concetti fondamentali sul debug.
+* Debug di Awk::                        Il debug di @command{awk}.
+* Esempio di sessione di debug::        Esempio di sessione di debug di
+                                        @command{gawk}.
+* Invocazione del debugger::            Come avviare il debugger.
+* Trovare il bug::                      Trovare il bug.
+* Lista dei comandi di debug::          I principali comandi di debug.
+* Controllo dei breakpoint::            Controllo dei punti d'interruzione.
+* Controllo esecuzione debugger::       Controllo di esecuzione.
+* Vedere e modificare dati::            Vedere e modificare dati.
+* Stack di esecuzione::                 Lavorare con lo stack.
+* Informazioni sul debugger::           Ottenere informazioni sullo stato
+                                        del programma e del debugger.
+* Comandi vari del debugger::           Comandi vari del debugger.
+* Supporto per Readline::               Supporto per Readline.
+* Limitazioni::                         Limitazioni.
+* Sommario sul debug::                  Sommario sul debug.
+* Spazio-dei-nomi globale::             Lo spazio-dei-nomi globale in @command{awk}
+                                        standard.
+* Nomi qualificati::                    Come qualificare nomi con uno
+                                        spazio-dei-nomi.
+* Spazio-dei-nomi di default::          Lo spazio-dei-nomi di default.
+* Cambiare lo spazio-dei-nomi::         Come cambiare lo spazio-dei-nomi.
+* Regole per i nomi::                   Regole per assegnare nomi a uno
+                                        spazio-dei-nomi e ai suoi componenti.
+* Gestione interna dei nomi::           Come i nomi sono gestiti internamente.
+* Esempio di spazio-dei-nomi::          Esempio di codice che usa uno spazio-dei-nomi.
+* Spazio-dei-nomi e funzionalit@`a::      Lo spazio-dei-nomi e le altre funzionalit@`a
+                                        di @command{gawk}.
+* Sommario sugli spazi-dei-nomi::       Sommario sugli spazi-dei-nomi.
+* Aritmetica del computer::             Una rapida introduzione alla matematica del
+                                        computer.
+* Definizioni matematiche::             Altre cose da sapere.
+* Funzionalit@`a MPFR::                   Funzionalit@`a per il calcolo a
+                                        precisione arbitraria in @command{gawk}
+* Cautela col calcolo in VM::           Cose da sapere.
+* Inesattezza nei calcoli::             La matematica in virgola mobile non @`e
+                                        esatta.
+* Rappresentazioni inesatte::           Molti numeri non sono rappresentati
+                                        esattamente.
+* Confronti tra valori in VM::          Come confrontare valori in virgola mobile.
+* Gli errori si sommano::               Gli errori diventano sempre maggiori.
+* Ottenere la precisione::              Ottenere la precisione voluta.
+* Tentare di arrotondare::              Tentare di aggiungere bit di precisione e
+                                        arrotondare.
+* Impostare la precisione::             Impostare la precisione.
+* Impostare modo di arrotondare::       Impostare la modalit@`a di
+                                        arrotondamento.
+* Controllare disponibilit@`a MPFR::      Come controllare se MPFR @`e disponibile.
+* Interi a precisione arbitraria::      Aritmetica dei numeri interi a precisione
+                                        arbitraria con @command{gawk}.
+* Problemi virgola mobile POSIX::       Confronto tra standard e uso corrente.
+* Sommario virgola mobile::             Sommario della trattazione della
+                                        virgola mobile.
+* Introduzione alle estensioni::        Cos'@`e un'estensione.
+* Licenza delle estensioni::            tipo di licenza delle estensioni.
+* Panoramica sul meccanismo delle estensioni:: Come funziona a grandi linee.
+* Descrizione dell'estensione API:: Una descrizione completa dell'API.
+* Intro funzioni estensione API:: Introduzione alle funzioni dell'API.
+* Tipi di dati generali::               I tipi di dati.
+* Funzioni di allocazione memoria::     Funzioni per allocare memoria.
+* Funzioni di costruzione::             Funzioni per creare valori.
+* Funzioni di registrazione::           Funzioni per registrare cose con
+                                        @command{gawk}.
+* Funzioni di estensione::              Registrare funzioni di estensione.
+* Funzioni di exit callback::           Registrare una exit di callback.
+* Stringa di versione Estensioni::      Registrare una stringa di versione.
+* Analizzatori di input::               Registrare un analizzatore di input.
+* Processori di output::                Registrare un processore di output.
+* Processori bidirezionali::            Registrare un processore
+                                        bidirezionale.
+* Stampare messaggi::                   Stampare messaggi dalle estensioni.
+* Aggiornare @code{ERRNO}::             Funzioni per aggiornare @code{ERRNO}.
+* Richiedere valori::                   Come ottenere un valore.
+* Accedere ai parametri::               Funzioni per acceder ai parametri.
+* Accedere alla tabella simboli::       Funzioni per accedere alle variabili
+                                        globali.
+* Tabella simboli per nome::            Accedere e aggiornare variabili per nome.
+* Tabella simboli tramite cookie::      Accedere alle variabili per ``cookie''.
+* Valori nascosti::                     Creare e usare valori nascosti.
+* Manipolazione di vettori::            Funzioni per lavorare coi vettori.
+* Tipi di dati per i vettori::          Tipi dati per lavorare coi vettori.
+* Funzioni per i vettori::              Funzioni per lavorare coi vettori.
+* Appiattimento di vettori::            Come appiattire i vettori.
+* Creazione di vettori::                Come creare e popolare vettori.
+* Ridirezione API::                     Come accedere alla ridirezioni e
+                                        modificarle.
+* Variabili dell'estensione API::       Variabili fornite dall'API.
+* Versione dell'estensione::            Informazioni sulla versione API.
+* Versione estensione GMP/MPFR::        Informazioni sulla versione disponibile
+                                        di GMP ed MPFR.
+* Variabili informative di estens. API:: Variabili che forniscono informazioni
+                                        sull'invocazione di @command{gawk}.
+* Codice predefinito di un'estensione API:: Codice predefinito di interfaccia API.
+* Modifiche dalla versione API 1::      Modifiche dalla versione 1 dell'API.
+* Trovare le estensioni::               Come @command{gawk} trova le
+                                        estensioni compilate.
+* Esempio di estensione::               Esempio di codice C di un'estensione.
+* Descrizione interna file::            Quello che le nuove funzioni faranno.
+* Operazioni interne file::             Codice per gestire file all'interno.
+* Usare operazioni interne file::       Come usare un'estensione esterna.
+* Esempi di estensione::                Le estensioni di esempio incluse con
+                                        @command{gawk}.
+* Esempio di estensione funzioni file:: Funzioni relative ai file.
+* Esempio di estensione Fnmatch::       Un'interfaccia a @code{fnmatch()}.
+* Esempio di estensione Fork::          Un'interfaccia a @code{fork()} e
+                                        altre funzioni di processo.
+* Esempio di estensione Inplace::       Consentire modifica file input
+                                        nell'estensione.
+* Esempio di estensione Ord::           Conversioni di caratteri in valori
+                                        numerici e viceversa.
+* Esempio di estensione Readdir::       Un'interfaccia a @code{readdir()}.
+* Esempio di estensione Revout::        Invertire la stringa in output.
+* Esempio di estensione Rev2way::       Esempio di I/O bidirezionale.
+* Esempio di estensione Rwarray::       Scaricare e ricaricare un vettore.
+* Esempio di estensione Readfile::      Leggere un intero file in una stringa.
+* Esempio di estensione Time::          Un'interfaccia a @code{gettimeofday()}
+                                        e @code{sleep()}.
+* Esempio di estensione API Test::      Test per la API.
+* gawkextlib::                          Il progetto @code{gawkextlib}.
+* Sommario delle estensioni::           Sommario delle estensioni.
+* Esercizi sulle estensioni::           Esercizi.
+* V7/SVR3.1::                           Le principali differenze tra V7 e
+                                        System V Release 3.1.
+* SVR4::                                Differenze minori tra System V
+                                        Release 3.1 e 4.
+* POSIX::                               Nuove funzionalit@`a per lo standard
+                                        POSIX.
+* BTL::                                 Nuove funzionalit@`a dalla versione
+                                        di @command{awk} di Brian Kernighan.
+* POSIX/GNU::                           Le estensioni in @command{gawk} non
+                                        previste in @command{awk} POSIX.
+* Storia delle funzionalit@`a::           Storia delle funzionalit@`a di
+                                        @command{gawk}.
+* Estensioni comuni::                   Sommario Estensioni comuni.
+* Intervalli e localizzazione::         Come le localizzazioni influiscono
+                                        sugli intervalli delle espressioni
+                                        regolari.
+* Contributori::                        I maggiori contributori a
+                                        @command{gawk}.
+* Sommario della storia::               Sommario della storia.
+* Distribuzione di Gawk::               Contenuto della distribuzione di
+                                        @command{gawk}.
+* Scaricare::                           Come ottenere la distribuzione.
+* Scompattazione::                      Come estrarre la distribuzione.
+* Contenuti della distribuzione::       Cosa c'@`e nella distribuzione.
+* Installazione Unix::                  Installare @command{gawk} su
+                                        varie versioni di Unix.
+* Installazione veloce::                Compilare @command{gawk} sotto Unix.
+* File da usare a inizio sessione::     Funzioni di personalizzazione shell.
+* Ulteriori opzioni di configurazione:: Altre opzioni utilizzabili in fase
+                                        di compilazione.
+* Filosofia della configurazione::      Come si suppone che funzioni.
+* Installazione non-Unix::              Installazioni su altri Sistemi
+                                        Operativi.
+* Installazione su PC::                 Installare e compilare
+                                        @command{gawk} su Microsoft Windows.
+* Installazione binaria su PC::         Installare una distribuzione pronta
+                                        all'uso.
+* Compilazione su PC::                  Compilare @command{gawk} per
+                                        Windows32.
+* Uso su PC::                           Eseguire @command{gawk} su Windows32.
+* Cygwin::                              Compilare ed eseguire @command{gawk}
+                                        per Cygwin.
+* MSYS::                                Usare @command{gawk} nell'ambiente
+                                        MSYS.
+* Installazione su VMS::                Installare @command{gawk} su VMS.
+* Compilazione su VMS::                 Come compilare @command{gawk} su
+                                        VMS.
+* Estensioni dinamiche su VMS::         Compilare estensioni dinamiche
+                                        di @command{gawk} su VMS.
+* Dettagli installazione su VMS::       Come installare @command{gawk} su
+                                        VMS.
+* Esecuzione su VMS::                   Come eseguire @command{gawk} su VMS.
+* GNV su VMS::                          Il progetto GNV di VMS.
+* Vecchio Gawk su VMS::                 Una versione non aggiornata arriva
+                                        con alcune versioni di VMS.
+* Bug::                                 Notificare problemi e bug.
+* Indirizzo Bug::                       Dove notificare problemi.
+* Usenet::                              Dove non notificare problemi.
+* Manutentori::                         Manutentori di version non-*nix.
+* Altre versioni::                      Altre implementazioni di
+                                        @command{awk} liberamente
+                                        disponibili.
+* Sommario dell'installazione::         Sommario dell'installazione.
+* Modalit@`a di compatibilit@`a::           Come inibire alcune estensioni di
+                                        @command{gawk}.
+* Aggiunte::                            Fare aggiunte a @command{gawk}.
+* Accedere ai sorgenti::                Accedere al deposito sorgenti Git.
+* Aggiungere codice::                   Aggiungere codice al programma
+                                        principale @command{gawk}.
+* Nuovi sistemi::                       Rendere disponibile @command{gawk}
+                                        a un nuovo sistema operativo.
+* File derivati::                       Perch@'e i file ancillari sono tenuti
+                                        nel deposito @command{git}.
+* Future estensioni::                   Nuove funzionalit@`a che potranno
+                                        essere implementate in futuro.
+* Limitazioni dell'implementazione::    Alcune limitazioni
+                                        dell'implementazione.
+* Progetto delle estensioni::           Note di progetto sull'estensione API.
+* Problemi con le vecchie estensioni::  Problemi con la precedente
+                                        implementazione di estensioni.
+* Obiettivi delle estensioni::          Obiettivi del nuovo meccanismo.
+* Altre scelte progettuali per le estensioni:: Qualche altra scelta progettuale.
+* Futuri sviluppi delle estensioni::    Possibilit@`a di crescita futura.
+* Sommario delle note::                 Sommario delle note di
+                                        implementazione.
+* Fondamenti ad alto livello::          Una visione dall'alto.
+* Fondamenti sui tipi di dati::         Una velocissima introduzione ai tipi
+                                        di dati.
+@end detailmenu
+@end menu
+
+@c dedication for Info file
+@ifinfo
+Ai miei genitori, per il loro amore, e per lo splendido
+esempio che mi hanno dato.
+@sp 1
+A mia moglie Miriam, per avermi reso completo.
+Grazie per aver costruito la tua vita insieme a me.
+@sp 1
+Ai nostri figli Chana, Rivka, Nachum e Malka,
+per aver arricchito le nostre vite in misura incalcolabile.
+@end ifinfo
+
+@ifset SMALLPRINT
+@fonttextsize 10
+@end ifset
+
+@summarycontents
+@contents
+
+@ifset SMALLPRINT
+@fonttextsize 11
+@end ifset
+
+@node Introduzione3
+@unnumbered Introduzione alla Terza Edizione
+
+@c This bit is post-processed by a script which turns the chapter
+@c tag into a preface tag, and moves this stuff to before the title.
+@c Bleah.
+@docbook
+  <prefaceinfo>
+    <author>
+      <firstname>Michael</firstname>
+      <surname>Brennan</surname>
+      <!-- can't put mawk into command tags. sigh. -->
+      <affiliation><jobtitle>Autore di mawk</jobtitle></affiliation>
+    </author>
+    <date>Marzo 2001</date>
+   </prefaceinfo>
+@end docbook
+
+Arnold Robbins e io siamo buoni amici. Ci siamo conosciuti
+@c 11 years ago
+nel 1990 per un insieme di
+circostanze---e per il nostro linguaggio di programmazione preferito, AWK.
+Tutto era iniziato un paio d'anni prima.
+Avevo appena iniziato un nuovo lavoro e avevo notato un computer Unix scollegato
+che giaceva in un angolo.
+Nessuno sapeva come usarlo, tanto meno io.  Comunque,
+qualche giorno pi@`u tardi, stava funzionando, con
+me come @code{root} e solo e unico utente.
+Quel giorno, iniziai la transizione da statistico a programmatore Unix.
+
+In uno dei miei giri per biblioteche e librerie alla ricerca di libri sullo
+Unix, trovai il libro, dalla copertina grigia, su AWK, noto anche come @:
+Alfred V.@: Aho, Brian W.@: Kernighan e
+Peter J.@: Weinberger, @cite{The AWK Programming Language}, (Addison-Wesley,
+1988).  Il semplice paradigma di programmazione di AWK
+---trovare un'espressione di ricerca nell'input e di conseguenza compiere
+un'azione---riduceva spesso
+complesse e tediose manipolazioni di dati a poche righe di codice.  Ero
+entusiasta di cimentarmi nella programmazione in AWK.
+
+Ahim@`e, l'@command{awk} sul mio computer era una versione limitata del
+linguaggio descritto nel libro grigio.  Scoprii che il mio computer aveva il
+``vecchio @command{awk}'' mentre il libro descriveva il ``nuovo
+@command{awk}.''
+Imparai che non era un caso isolato; la vecchia versione si rifiutava di farsi da
+parte o di cedere il suo nome.  Se un sistema aveva un nuovo @command{awk},
+questo era chiamato invariabilmente @command{nawk}, e pochi sistemi lo avevano.
+Il miglior modo per ottenere un nuovo @command{awk} era quello di scaricare via
+@command{ftp} il codice sorgente di @command{gawk} da @code{prep.ai.mit.edu}.
+@command{gawk} era una versione del nuovo @command{awk} scritta da David Trueman
+e Arnold, e disponibile sotto la GNU General Public License.
+
+Per inciso, ora non @`e
+pi@`u cos@`{@dotless{i}} difficile trovare un nuovo @command{awk}.  @command{gawk} viene
+fornito con GNU/Linux, e si possono scaricare i binari e il codice sorgente per
+quasi tutti i sistemi; mia moglie usa @command{gawk} nella sua stazione di lavoro VMS.
+
+Il mio sistema Unix non era inizialmente collegato a una presa di corrente; a
+maggior ragione non era collegato a una rete.  Cos@`{@dotless{i}}, ignaro dell'esistenza di
+@command{gawk} e in generale della comunit@`a di Unix, e desiderando un nuovo
+@command{awk}, ne scrissi uno mio, chiamato @command{mawk}.  Prima di aver
+finito, scoprii l'esistenza di @command{gawk},
+ma era troppo tardi per fermarmi, cos@`{@dotless{i}} alla fine inviai un messaggio
+a un newsgroup @code{comp.sources}.
+
+Qualche giorno dopo ricevetti un cordiale messaggio di posta elettronica
+da Arnold che si presentava.
+Propose di scambiarci progetti e algoritmi, e
+alleg@`o una bozza dello standard POSIX, che mi permise di
+aggiornare @command{mawk} per includere le estensioni al linguaggio
+aggiunte dopo la pubblicazione di @cite{The AWK Programming Language}.
+
+Francamente, se i nostri ruoli fossero stati
+invertiti, io non sarei stato cos@`{@dotless{i}} disponibile e probabilmente non ci
+saremmo mai incontrati.  Sono felice che l'incontro sia avvenuto.
+Lui @`e un vero esperto tra gli esperti di AWK e una persona squisita.
+Arnold mette a disposizione della Free Software Foundation parti significative
+della sua esperienza e del suo tempo.
+
+Questo libro @`e il manuale di riferimento di @command{gawk}, ma sostanzialmente
+@`e un libro sulla programmazione in AWK che
+interesser@`a un vasto pubblico.
+@`E un riferimento completo al linguaggio AWK come definito dalla versione del
+1987 di Bell Laboratories e codificato nelle POSIX Utilities
+standard del 1992.
+
+D'altra parte, un programmatore AWK alle prime armi pu@`o studiare
+una quantit@`a di programmi pratici che permettono di apprezzare
+la potenza dei concetti di base di AWK:
+flusso di controllo guidato dai dati, ricerca di corrispondenze tramite
+espressioni regolari e vettori associativi.
+Chi desidera qualcosa di nuovo pu@`o provare l'interfaccia di @command{gawk}
+verso i protocolli di rete attraverso i file speciali @file{/inet}.
+
+I programmi in questo libro evidenziano come un programma AWK sia
+generalmente molto pi@`u piccolo e veloce da sviluppare
+di uno equivalente scritto in C.
+Di conseguenza, @`e spesso conveniente creare un prototipo di un
+algoritmo o di un progetto in AWK per arrivare a eseguirlo in breve tempo e
+scoprire prima i problemi che possono presentarsi. Spesso, l'efficienza di
+questa versione iniziale interpretata @`e sufficiente e il prototipo
+AWK diventa il prodotto finale.
+
+Il nuovo comando @command{pgawk} (profiling @command{gawk}) produce
+conteggi sull'esecuzione delle istruzioni del programma.
+Recentemente ho fatto un tentativo con un algoritmo che, a fronte di
+@ifnotdocbook
+@math{n}
+@end ifnotdocbook
+@ifdocbook
+@i{n}
+@end ifdocbook
+righe di input, produceva il risultato in un tempo
+@tex
+$\sim\! Cn^2$,
+@end tex
+@ifnottex
+@ifnotdocbook
+~ C n^2,
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>&sim; Cn<superscript>2</superscript></emphasis>
+@end docbook
+mentre in teoria
+avrebbe dovuto terminare in un tempo
+@tex
+$\sim\! Cn\log n$.
+@end tex
+@ifnottex
+@ifnotdocbook
+~ C n log n.
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>&sim; Cn log n</emphasis>
+@end docbook
+Dopo qualche minuto di attenta lettura
+del profilo in @file{awkprof.out}, ho ricondotto il problema a
+una singola riga di codice.  @command{pgawk} @`e una gradita integrazione
+ai miei strumenti di programmatore.
+
+Arnold ha condensato in questo libro oltre un decennio di esperienza nell'uso di
+programmi AWK e nello sviluppo di @command{gawk}.  Se si vuole usare
+AWK o imparare ad usarlo, @`e consigliabile leggere questo libro.
+
+@ifnotdocbook
+@cindex Brennan, Michael
+@display
+Michael Brennan
+Autore di @command{mawk}
+Marzo 2001
+@end display
+@end ifnotdocbook
+
+@node Introduzione4
+@unnumbered Introduzione alla Quarta Edizione
+
+@c This bit is post-processed by a script which turns the chapter
+@c tag into a preface tag, and moves this stuff to before the title.
+@c Bleah.
+@docbook
+  <prefaceinfo>
+    <author>
+      <firstname>Michael</firstname>
+      <surname>Brennan</surname>
+      <!-- can't put mawk into command tags. sigh. -->
+      <affiliation><jobtitle>Autore di mawk</jobtitle></affiliation>
+    </author>
+    <date>Ottobre 2014</date>
+   </prefaceinfo>
+@end docbook
+
+Ci sono cose che non cambiano.  Tredici anni fa scrivevo:
+``Se si vuole usare AWK o imparare ad usarlo, @`e consigliabile
+leggere questo libro.''
+Era vero allora e rimane vero anche oggi.
+
+Imparare a usare un linguaggio di programmazione richiede qualcosa di pi@`u
+che padroneggiarne la sintassi.  Occorre comprendere come
+usare le funzionalit@`a del linguaggio per risolvere problemi pratici di
+programmazione.  Uno dei punti pi@`u importanti di questo libro @`e che
+fornisce molti esempi che mostrano come utilizzare AWK.
+
+Altre cose, invece, cambiano. I nostri computer sono diventati molto pi@`u
+veloci e la loro memoria @`e molto pi@`u estesa.
+Per questa ragione, la velocit@`a di esecuzione e l'uso efficiente della
+memoria, caratteristiche di un linguaggio di livello elevato, hanno minore
+rilevanza.
+Scrivere un programma prototipo in AWK per poi riscriverlo in C per
+migliorare l'utilizzo delle risorse capita sempre meno, perch@'e sempre pi@`u
+spesso il prototipo @`e abbastanza veloce anche per essere messo in produzione.
+
+Naturalmente, ci sono tipi di calcoli che sono effettuati pi@`u agevolmente
+da programmi scritti in C o C++.
+Con @command{gawk} 4.1 e successive versioni, non @`e necessario
+decidere se scrivere un programma in AWK oppure in C/C++.  Si pu@`o scrivere
+buona parte del programma in AWK e le parti che richiedono
+specificamente il C/C++ possono essere scritte in C/C++ e quindi il tutto
+pu@`o essere eseguito come un programma unico, con il modulo @command{gawk}
+che carica dinamicamente il modulo C/C++ in fase di esecuzione.
+@c Chapter 16
+@iftex
+Il
+@end iftex
+@ref{Estensioni dinamiche},
+spiega la procedura in gran
+dettaglio, e, come prevedibile, riporta molti esempi che sono di aiuto per
+approfondire anche gli aspetti pi@`u complessi.
+
+@`E per me un piacere programmare in AWK ed @`e stato divertente (ri)leggere
+questo libro.  Penso che sar@`a lo stesso per voi.
+
+@ifnotdocbook
+@cindex Brennan, Michael
+@display
+Michael Brennan
+Autore di @command{mawk}
+Ottobre 2014
+@end display
+@end ifnotdocbook
+@node Prefazione
+@unnumbered Prefazione
+@c I saw a comment somewhere that the preface should describe the book itself,
+@c and the introduction should describe what the book covers.
+@c
+@c 12/2000: Chuck wants the preface & intro combined.
+
+@c This bit is post-processed by a script which turns the chapter
+@c tag into a preface tag, and moves this stuff to before the title.
+@c Bleah.
+@docbook
+  <prefaceinfo>
+    <author>
+      <firstname>Arnold</firstname>
+      <surname>Robbins</surname>
+      <affiliation><jobtitle>Nof Ayalon</jobtitle></affiliation>
+      <affiliation><jobtitle>Israel</jobtitle></affiliation>
+    </author>
+    <date>Febbraio 2015</date>
+   </prefaceinfo>
+@end docbook
+
+Lavorando con file di testo capita di dover eseguire alcuni tipi ripetitivi di
+operazioni. Si potrebbe voler estrarre alcune righe e scartare il resto, o fare
+modifiche laddove siano verificate certe condizioni, lasciando inalterato il
+resto del file.  Questi compiti risultano spesso pi@`u agevoli usando
+@command{awk}.  Il programma di utilit@`a @command{awk} interpreta un linguaggio
+di programmazione specializzato che rende facile eseguire semplici attivit@`a
+di riformattazione di dati.
+
+@cindex Brian Kernighan, @command{awk} di
+L'implementazione GNU di @command{awk} @`e chiamata @command{gawk}; se
+invocato con le opzioni o con le variabili d'ambiente appropriate,
+(@pxref{Opzioni}), @`e pienamente
+compatibile con le specifiche
+POSIX@footnote{Lo standard POSIX 2008 @`e accessibile in rete all'indirizzo
+@w{@url{https://pubs.opengroup.org/onlinepubs/9699919799/}.}}
+del linguaggio @command{awk}
+e con la versione Unix di @command{awk} mantenuta
+da Brian Kernighan.
+Ci@`o implica che tutti i programmi
+@command{awk} scritti correttamente dovrebbero funzionare con @command{gawk}.
+Perci@`o nella maggior parte dei casi non si distingue tra @command{gawk} e
+altre implementazioni di @command{awk}.
+
+@cindex @command{awk}, POSIX e, si veda anche POSIX @command{awk}
+@cindex @command{awk}, POSIX e
+@cindex POSIX, @command{awk} e
+@cindex @command{gawk}, @command{awk} e
+@cindex @command{awk}, @command{gawk} e
+@cindex @command{awk}, uso di
+Usando @command{awk} potete:
+
+@itemize @value{BULLET}
+@item
+Gestire piccole basi di dati personali
+
+@item
+Generare rapporti
+
+@item
+Validare dati
+
+@item
+Produrre indici ed effettuare altre operazioni per la preparazione di documenti
+
+@item
+Sperimentare algoritmi che possono essere adattati in seguito ad altri
+linguaggi per computer
+@end itemize
+
+@cindex @command{awk}, si veda anche @command{gawk}
+@cindex @command{gawk}, si veda anche @command{awk}
+@cindex @command{gawk}, uso di
+Inoltre,
+@command{gawk}
+fornisce strumenti che rendono facile:
+
+@itemize @value{BULLET}
+@item
+Estrarre frammenti di dati per l'elaborazione
+
+@item
+Ordinare dati
+
+@item
+Effettuare semplici comunicazioni di rete
+
+@item
+Creare il profilo di esecuzione ed effettuare il debug
+di programmi @command{awk}.
+
+@item
+Estendere il linguaggio con funzioni scritte in C o C++.
+@end itemize
+
+Questo @value{DOCUMENT} spiega il linguaggio @command{awk} e come lo si pu@`o
+usare efficacemente.  @`E richiesta una familiarit@`a coi comandi di sistema
+di base, come @command{cat} e @command{ls},@footnote{Questi programmi di
+utilit@`a sono disponibili sui sistemi conformi a POSIX, come pure sui sistemi
+tradizionali basati su Unix. Se si usa qualche altro sistema operativo, si
+deve comunque avere familiarit@`a con i concetti di ridirezione I/O e di
+@dfn{pipe}.} cos@`{@dotless{i}} come con le funzionalit@`a di base della shell, come la
+ridirezione, l'input/output (I/O) e le @dfn{pipe}.
+
+@cindex GNU @command{awk}, si veda @command{gawk}
+Implementazioni del linguaggio @command{awk} sono disponibili per diversi
+sistemi operativi di computer.  Questo @value{DOCUMENT}, oltre a descrivere il
+linguaggio @command{awk} in generale, descrive anche la specifica
+implementazione di @command{awk} chiamata @command{gawk} (che sta per
+``GNU @command{awk}'').  @command{gawk} funziona su una vasta gamma di sistemi
+Unix, dai PC basati su architettura Intel fino
+a sistemi di potenza molto maggiore.
+@command{gawk} @`e stato portato anche su Mac OS X,
+Microsoft Windows
+(tutte le versioni),
+e OpenVMS.@footnote{Qualche altro sistema operativo obsoleto su cui
+@command{gawk} era stato portato non @`e pi@`u mantenuto e il codice specifico
+per quei sistemi @`e stato rimosso.}
+
+@menu
+* Storia::                              La storia di @command{gawk} e
+                                        @command{awk}.
+* Nomi::                                Che nome usare per trovare
+                                        @command{awk}.
+* Questo manuale::                      Uso di questo @value{DOCUMENT}.
+                                        Comprende esempi di file in input
+                                        utilizzabili.
+* Convenzioni::                         Convenzioni tipografiche.
+* Storia del manuale::                  Breve storia del Progetto GNU e di
+                                        questo @value{DOCUMENT}.
+@ifset FOR_PRINT
+* Aggiornamenti::                       Come tenersi al corrente.
+@end ifset
+* Come contribuire::                    Un aiuto per la salvezza del mondo.
+* Ringraziamenti::                      Ringraziamenti.
+@end menu
+
+@node Storia
+@unnumberedsec La storia di @command{gawk} e @command{awk}
+@cindex ricetta per un linguaggio di programmazione
+@cindex linguaggio di programmazione, ricetta per un
+@cindex programmazione, ricetta per un linguaggio di
+@sidebar Ricetta per un linguaggio di programmazione
+
+@multitable {2 parti di} {1 parte di  @code{egrep}} {1 parte di  @code{snobol}}
+@item @tab 1 parte di  @code{egrep} @tab 1 parte di  @code{snobol}
+@item @tab 2 parti di @code{ed} @tab 3 parti di C
+@end multitable
+
+Mescolare bene tutte le parti usando @code{lex} e @code{yacc}.
+Preparare una concisa documentazione e distribuire.
+
+Dopo otto anni, aggiungere un'altra parte di @code{egrep} e altre due
+parti di C.  Documentare molto bene e distribuire.
+@end sidebar
+
+@cindex Aho, Alfred
+@cindex Weinberger, Peter
+@cindex Kernighan, Brian
+@cindex @command{awk}, storia di
+Il nome @command{awk} deriva dalle iniziali dei suoi progettisti: Alfred V.@:
+Aho, Peter J.@: Weinberger e Brian W.@: Kernighan.  La versione originale di
+@command{awk} fu scritta nel 1977 negli AT&T Bell Laboratories.
+Nel 1985, una nuova versione rese il linguaggio di programmazione
+pi@`u potente, introducendo le funzioni definite dall'utente, flussi di input
+multipli ed espressioni regolari calcolate.
+Questa nuova versione ebbe larga diffusione con Unix System V
+Release 3.1 (1987).
+La versione in System V Release 4 (1989) ha aggiunto alcune nuove funzionalit@`a
+e ha fatto pulizia nel comportamento di alcuni degli ``punti oscuri'' del
+linguaggio.  Le specifiche per @command{awk} nello standard POSIX Command
+Language and Utilities ha in seguito reso pi@`u chiaro il linguaggio.  Sia i
+progettisti di @command{gawk} che quelli dell'originale @command{awk} dei Bell
+Laboratories hanno collaborato alla formulazione delle specifiche POSIX.
+
+@cindex Rubin, Paul
+@cindex Fenlason, Jay
+@cindex Trueman, David
+Paul Rubin ha scritto @command{gawk}, nel 1986.
+Jay Fenlason l'ha completata, seguendo i consigli di Richard Stallman.
+Anche John Woods ha fornito parti del codice.  Nel 1988 e 1989, David Trueman,
+col mio aiuto, ha rivisto completamente @command{gawk} per la compatibilit@`a
+col pi@`u recente @command{awk}.
+Intorno al 1994, sono divenuto il manutentore principale.
+Lo sviluppo corrente @`e incentrato sulla correzione degli errori, sul
+miglioramento delle prestazioni, sulla conformit@`a agli standard e,
+occasionalmente, su nuove funzionalit@`a.
+
+Nel maggio 1997, J@"urgen Kahrs avvert@`{@dotless{i}} la necessit@`a di un accesso alla
+rete da @command{awk}, e con un piccolo aiuto da parte mia, cominci@`o ad
+aggiungere funzionalit@`a a @command{gawk} per fare questo.  A quel tempo,
+lui scrisse anche il grosso di
+@cite{@value{GAWKINETTITLE}}
+(un documento separato, disponibile come parte della distribuzione
+@command{gawk}).  Il suo codice alla fine venne integrato nella distribuzione
+principale di @command{gawk} con la versione 3.1 di @command{gawk}.
+
+John Haque ha riscritto la parte interna di @command{gawk}, mentre metteva a
+punto un debugger a livello di @command{awk}.  Questa versione divenne
+disponibile come @command{gawk} versione 4.0 nel 2011.
+
+@xref{Contributori}
+per un elenco completo di quelli che hanno fornito contributi importanti a
+@command{gawk}.
+
+@node Nomi
+@unnumberedsec Una rosa, con ogni altro nome...
+
+@cindex @command{awk}, nuovo e vecchio
+Il linguaggio @command{awk} si @`e evoluto nel corso degli anni.  Tutti i
+dettagli si trovano in @ref{Storia del linguaggio}.
+Il linguaggio descritto in questo @value{DOCUMENT}
+viene spesso citato come ``nuovo @command{awk}''.
+Per analogia, la versione originale di @command{awk} @`e citata
+come ``vecchio @command{awk}.''
+
+Su molti sistemi di uso corrente, eseguendo il programma di utilit@`a
+@command{awk}, si invoca qualche versione del nuovo
+@command{awk}.@footnote{Solo i sistemi Solaris usano ancora un
+vecchio @command{awk} per il programma di utilit@`a predefinito
+@command{awk}. Una versione pi@`u moderna di @command{awk} si trova
+nella directory @file{/usr/xpg6/bin} su questi sistemi.} Se
+il comando @command{awk} nel sistema in uso @`e il vecchio, il
+risultato che vedrete per il programma di test che segue @`e
+del tipo:
+
+@example
+$ @kbd{awk 1 /dev/null}
+@group
+@error{} awk: syntax error near line 1
+@error{} awk: bailing out near line 1
+@end group
+@end example
+
+@noindent
+Se questo @`e il caso, dovreste cercare una versione del nuovo @command{awk},
+o semplicemente installare @command{gawk}!
+
+All'interno di questo @value{DOCUMENT}, quando si fa riferimento a
+funzionalit@`a del linguaggio che dovrebbe essere disponibile in ogni
+implementazione completa di @command{awk} POSIX, viene usato il termine
+@command{awk}.  Quando si fa riferimento a una funzionalit@`a specifica
+dell'implementazione GNU, viene usato i termine @command{gawk}.
+
+@node Questo manuale
+@unnumberedsec Uso di questo @value{DOCUMENT}
+@cindex @command{awk}, descrizione dei termini
+
+Il termine @command{awk} si riferisce sia a uno specifico programma sia al
+linguaggio che si usa per dire al programma stesso cosa deve fare.  Quando dobbiamo
+essere precisi, chiamiamo il linguaggio ``il linguaggio @command{awk},''
+e il programma ``l'utilit@`a @command{awk}.''
+Questo @value{DOCUMENT} spiega
+sia come scrivere programmi nel linguaggio @command{awk} che come
+eseguire l'utilit@`a @command{awk}.
+Il termine ``programma @command{awk}'' si riferisce a un programma scritto
+dall'utente nel linguaggio di programmazione @command{awk}.
+
+@cindex @command{gawk}, @command{awk} e
+@cindex @command{awk}, @command{gawk} e
+@cindex POSIX @command{awk}
+In primo luogo, questo @value{DOCUMENT} spiega le funzionalit@`a di @command{awk}
+come definite nello standard POSIX, e lo fa nel contesto dell'implementazione
+@command{gawk}.  Oltre a questo, cerca anche di descrivere le differenze
+significative tra @command{gawk}
+e altre
+@ifclear FOR_PRINT
+implementazioni @command{awk}.@footnote{Tutte queste differenze
+si trovano nell'indice alla
+voce ``differenze tra @command{awk} e @command{gawk}.''}
+@end ifclear
+@ifset FOR_PRINT
+implementazioni @command{awk}.
+@end ifset
+Infine, vien fatta rilevare ogni funzionalit@`a di @command{gawk} non
+inclusa nello standard POSIX per @command{awk}.
+
+@ifnotinfo
+Questo @value{DOCUMENT} ha il difficile compito di essere sia una guida
+introduttiva che un manuale di riferimento.  I neofiti possono
+tranquillamente saltare i dettagli che sembrano loro troppo complessi.
+Possono anche ignorare i molti riferimenti incrociati, preparati avendo in
+mente gli utenti esperti e per le versioni Info e
+@uref{https://www.gnu.org/software/gawk/manual/, HTML}
+del @value{DOCUMENT}.
+@end ifnotinfo
+
+Ci sono dei riquadri
+sparsi in tutto il @value{DOCUMENT}.
+Aggiungono una spiegazione pi@`u completa su punti importanti, ma che
+probabilmente non sono di interesse in sede di prima lettura.
+@ifclear FOR_PRINT
+Si trovano tutti nell'indice analitico, alla voce ``sidebar.'' @c non c'e riquadro nell'indice analitico
+@end ifclear
+
+La maggior parte delle volte, gli esempi usano programmi @command{awk} completi.
+Alcune delle @value{SECTIONS} pi@`u avanzate mostrano solo la parte del programma
+@command{awk} che illustra il concetto che si sta descrivendo.
+
+Sebbene questo @value{DOCUMENT} sia destinato soprattutto alle persone che non
+hanno una precedente conoscenza di @command{awk}, esso contiene anche tante
+informazioni che anche gli esperti di @command{awk} troveranno utili.
+In particolare, dovrebbero essere d'interesse la descrizione di POSIX
+@command{awk} e i programmi di esempio
+@ifnottex
+in
+@end ifnottex
+@iftex
+nel
+@end iftex
+@ref{Funzioni di libreria} e
+@ifnotdocbook
+@ifnottex
+in
+@end ifnottex
+@end ifnotdocbook
+@iftex
+nel
+@end iftex
+@ref{Programmi di esempio}.
+
+Questo @value{DOCUMENT} @`e suddiviso in diverse parti, come segue:
+
+@c FULLXREF ON
+
+@itemize @value{BULLET}
+@item
+La Parte I descrive il linguaggio @command{awk} e il programma @command{gawk}
+nel dettaglio.
+Inizia con le nozioni di base, e continua con tutte le caratteristiche di
+@command{awk}.  Contiene i seguenti capitoli:
+
+@c nested
+@itemize @value{MINUS}
+@item
+@ref{Per iniziare},
+fornisce le nozioni minime indispensabili per iniziare a usare @command{awk}.
+
+@item
+@ref{Invocare Gawk},
+descrive come eseguire @command{gawk}, il significato delle sue
+opzioni da riga di comando e come trovare i file sorgenti del programma
+@command{awk}.
+
+@item
+@ref{Espressioni regolari},
+introduce le espressioni regolari in generale, e in particolare le variet@`a
+disponibili in @command{awk} POSIX e @command{gawk}.
+
+@item
+@ref{Leggere file},
+descrive come @command{awk} legge i dati inseriti dall'utente.
+Introduce i concetti di record e campi, e anche il
+comando @code{getline}.
+Contiene una prima descrizione della ridirezione I/O, e una breve descrizione
+dell'I/O di rete.
+
+@item
+@ref{Stampare},
+descrive come i programmi @command{awk} possono produrre output con
+@code{print} e @code{printf}.
+
+@item
+@ref{Espressioni},
+descrive le espressioni, che sono i componenti elementari di base
+per portare a termine la maggior parte delle operazioni in un programma.
+
+@item
+@ref{Criteri di ricerca e azioni},
+descrive come scrivere espressioni di ricerca per individuare corrispondenze nei
+record, le azioni da eseguire quando si @`e trovata una corrispondenza
+in un record, e le variabili predefinite di @command{awk} e
+@command{gawk}.
+
+@item
+@ref{Vettori},
+tratta dell'unica struttura di dati di @command{awk}: il vettore associativo.
+Vengono trattati anche l'eliminazione di elementi del vettore e di interi
+vettori, e l'ordinamento dei vettori in @command{gawk}.
+Il @value{CHAPTER} descrive inoltre come @command{gawk} fornisce vettori di
+vettori.
+
+@item
+@ref{Funzioni},
+descrive le funzioni predefinite fornite da @command{awk} e
+@command{gawk}, e spiega come definire funzioni personalizzate.  Viene
+anche spiegato come @command{gawk} permetta di invocare funzioni in
+maniera indiretta.
+@end itemize
+
+@item
+La Parte II illustra come usare @command{awk} e @command{gawk} per la
+risoluzione di problemi. Qui ci sono molti programmi da leggere e da cui imparare.
+Questa parte contiene i seguenti capitoli:
+
+@c nested
+@itemize @value{MINUS}
+@item
+@ref{Funzioni di libreria},
+fornisce diverse funzioni pensate per
+essere usate dai programmi scritti in @command{awk}.
+
+@item
+@ref{Programmi di esempio},
+fornisce molti programmi @command{awk} di esempio.
+@end itemize
+
+La lettura di questi due capitoli permette di capire come
+@command{awk} pu@`o risolvere problemi pratici.
+
+@item
+La Parte III si concentra sulle funzionalit@`a specifiche di @command{gawk}.
+Contiene i seguenti capitoli:
+
+@c nested
+@itemize @value{MINUS}
+@item
+@ref{Funzionalit@`a avanzate},
+descrive diverse funzionalit@`a avanzate.
+Di particolare rilevanza sono
+la capacit@`a di controllare l'ordine di visita dei vettori,
+quella di instaurare comunicazioni bidirezionali con altri processi,
+di effettuare connessioni di rete TCP/IP, e di
+profilare i propri programmi @command{awk}.
+
+@item
+@ref{Internazionalizzazione},
+descrive funzionalit@`a speciali per tradurre i messaggi
+di programma in diverse lingue in fase di esecuzione.
+
+@item
+@ref{Debugger}, descrive il debugger di @command{gawk}.
+
+@item
+@ref{Spazi-dei-nomi}, descrive come @command{gawk} permette
+che variabili e/o funzioni con lo stesso nome coesistano
+in distinti spazi-dei-nomi (@dfn{spazi-dei-nomi}).
+
+@item
+@ref{Calcolo con precisione arbitraria},
+illustra le capacit@`a di calcolo avanzate.
+
+@item
+@ref{Estensioni dinamiche},
+descrive come aggiungere nuove variabili e
+funzioni a @command{gawk} scrivendo estensioni in C o C++.
+@end itemize
+
+@item
+@ifclear FOR_PRINT
+La Parte IV contiene le appendici, il Glossario, e due licenze relative,
+rispettivamente, al codice sorgente di @command{gawk} e a questo
+@value{DOCUMENT}.  Contiene le seguenti appendici:
+@end ifclear
+
+@ifset FOR_PRINT
+La Parte IV contiene le seguenti appendici,
+che includono la  Licenza per Documentazione Libera GNU:
+@end ifset
+
+@itemize @value{MINUS}
+@item
+@ref{Storia del linguaggio},
+descrive l'evoluzione del linguaggio @command{awk} dalla sua prima versione
+fino a oggi.  Descrive anche come @command{gawk}
+ha acquisito nuove funzionalit@`a col passare del tempo.
+
+@item
+@ref{Installazione},
+descrive come ottenere @command{gawk}, come compilarlo
+sui sistemi compatibili con POSIX,
+e come compilarlo e usarlo su diversi sistemi
+non conformi allo standard POSIX.  Spiega anche come segnalare gli errori
+di @command{gawk} e dove si possono ottenere altre implementazioni
+di @command{awk} liberamente disponibili.
+
+@ifset FOR_PRINT
+@item
+@ref{Copia},
+presenta la licenza applicabile al codice sorgente @command{gawk}.
+@end ifset
+
+@ifclear FOR_PRINT
+@item
+@ref{Note},
+descrive come disabilitare le estensioni @command{gawk},
+come contribuire scrivendo del nuovo codice per @command{gawk},
+e alcune possibili direzioni per il futuro sviluppo di @command{gawk}.
+
+@item
+@ref{Concetti fondamentali},
+fornisce del materiale di riferimento a livello elementare per chi
+sia completamente digiuno di programmazione informatica.
+
+@item
+Il @ref{Glossario}, definisce quasi tutti i termini significativi
+usati all'interno di questo @value{DOCUMENT}.  Se si incontrano termini
+coi quali non si ha familiarit@`a, questo @`e il posto dove cercarli.
+
+@item
+@ref{Copia}, e
+@ref{Licenza per Documentazione Libera GNU (FDL)},
+presentano le licenze che si applicano, rispettivamente, al codice sorgente
+di @command{gawk} e a questo @value{DOCUMENT}.
+@end ifclear
+@end itemize
+@end itemize
+
+@ifset FOR_PRINT
+La versione di questo @value{DOCUMENT} distribuita con @command{gawk}
+contiene ulteriori appendici e altro materiale.
+Per ragioni di spazio, per questa edizione a stampa abbiamo tralasciato alcune
+delle appendici. Si possono trovare in rete ai seguenti indirizzi:
+
+@itemize @value{BULLET}
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Notes.html,
+L'appendice sulle note di implementazione}
+descrive come disabilitare le estensioni @command{gawk}, come contribuire
+scrivendo del nuovo codice per @command{gawk}, dove reperire informazioni
+su alcune possibili future direzioni dello sviluppo di @command{gawk}, e
+sulle decisioni di progetto che hanno influito sulle estensioni API.
+
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Basic-Concepts.html,
+L'appendice sui concetti fondamentali}
+fornisce del materiale di riferimento a livello elementare per chi sia completamente a
+digiuno di programmazione informatica.
+
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Glossary.html,
+Il Glossario}
+definisce la maggior parte, o quasi, dei termini significativi usati
+nel corso del libro.  Se si incontrano termini con cui non si ha familiarit@`a,
+questo @`e il posto dove cercarli.
+
+@item
+@uref{https://www.gnu.org/software/gawk/manual/html_node/GNU-Free-Documentation-License.html, la licenza GNU FDL}
+@`e la licenza che vale per questo @value{DOCUMENT}.
+@end itemize
+
+@c ok not to use CHAPTER / SECTION here
+Alcuni dei capitoli hanno sezioni con esercizi; queste sono anche
+state omesse dall'edizione a stampa ma sono disponibili online.
+@end ifset
+
+@c FULLXREF OFF
+
+@node Convenzioni
+@unnumberedsec Convenzioni tipografiche
+
+@cindex Texinfo
+Questo @value{DOCUMENT} @`e scritto in @uref{https://www.gnu.org/software/texinfo/, Texinfo},
+il linguaggio di formattazione della documentazione GNU.  Viene usato un unico
+file sorgente Texinfo per produrre sia la versione a stampa della documentazione
+sia quella online.
+@ifnotinfo
+A causa di ci@`o, le convenzioni tipografiche
+sono leggermente diverse da quelle presenti in altri libri che potete aver letto.
+@end ifnotinfo
+@ifinfo
+Questo @value{SECTION} documenta brevemente le convenzioni tipografiche usate in Texinfo.
+@end ifinfo
+
+Gli esempi da immettere sulla riga di comando sono preceduti dai
+comuni prompt di shell primario e secondario, @samp{$} e @samp{>}.
+L'input che si inserisce viene mostrato @kbd{in questo modo}.
+@c 8/2014: @print{} is stripped from the texi to make docbook.
+@ifclear FOR_PRINT
+L'output del comando @`e  preceduto dal glifo ``@print{}'', che
+in genere rappresenta lo standard output del comando.
+@end ifclear
+@ifset FOR_PRINT
+L'output del comando, normalmente il suo standard output, @`e stampato
+@code{in questo modo}.
+@end ifset
+Messaggi di errore e altri output sullo standard error del comando sono
+preceduti dal glifo ``@error{}''.  Per esempio:
+
+@example
+$ @kbd{echo ciao su stdout}
+@print{} ciao su stdout
+$ @kbd{echo salve su stderr 1>&2}
+@error{} salve su stderr
+@end example
+
+@ifnotinfo
+Nel testo, quasi tutto ci@`o che riguarda la programmazione,
+per esempio i nomi dei comandi,
+appare in @code{questo font}. I frammenti
+di codice appaiono nello stesso font e tra apici, @samp{in questo modo}.
+Ci@`o che viene sostituito dall'utente o dal programmatore
+appare in @var{questo font}.
+Le opzioni sono stampate cos@`{@dotless{i}}: @option{-f}.
+I @value{FNS} sono indicati in questo modo: @file{/percorso/al/file}.
+@ifclear FOR_PRINT
+Certe cose sono
+evidenziate @emph{in questo modo}, e se un punto dev'essere reso in modo pi@`u
+marcato, viene evidenziato @strong{in questo modo}.
+@end ifclear
+La prima occorrenza di un
+nuovo termine @`e usualmente la sua @dfn{definizione} e appare nello stesso
+font della precedente occorrenza di ``definizione'' in questa frase.
+@end ifnotinfo
+
+I caratteri che si battono sulla tastiera sono scritti come @kbd{questi}.  In
+particolare, ci sono caratteri speciali chiamati ``caratteri di controllo''.
+Questi sono caratteri che vengono battuti tenendo premuti il tasto
+@kbd{CONTROL} e un altro tasto contemporaneamente.
+Per esempio, @kbd{Ctrl-d} @`e battuto premendo e tenendo premuto il tasto
+@kbd{CONTROL}, poi premendo il tasto @kbd{d} e infine rilasciando entrambi i
+tasti.
+
+Per amor di brevit@`a, in questo @value{DOCUMENT}, la versione di Brian
+Kernighan di @command{awk} sar@`a citata come ``BWK @command{awk}.''
+(@xref{Altre versioni} per informazioni su questa e altre versioni.)
+
+@ifset FOR_PRINT
+@quotation NOTA
+Note interessanti sono stampate in questo modo.
+@end quotation
+
+@quotation ATTENZIONE
+Note di avviso o raccomandazioni di cautela sono stampate in questo modo.
+@end quotation
+@end ifset
+
+@c fakenode --- for prepinfo
+@unnumberedsubsec Angoli Bui
+@cindex Kernighan, Brian
+@quotation
+@i{Gli angoli bui sono essenzialmente frattali---per quanto vengano
+illuminati, ce n'@`e sempre uno pi@`u piccolo e pi@`u buio.}
+@author Brian Kernighan
+@end quotation
+
+@cindex a.b., si veda angolo buio
+@cindex angolo buio
+Fino allo standard POSIX (e @cite{@value{TITLE}}),
+molte caratteristiche di @command{awk} erano poco documentate o
+non documentate affatto.  Le descrizioni di queste caratteristiche
+(chiamate spesso ``angoli bui'') sono segnalate in questo @value{DOCUMENT} con
+@iftex
+il disegno di una torcia elettrica nel margine, come mostrato qui.
+@value{DARKCORNER}
+@end iftex
+@ifnottex
+``(a.b.)''.
+@end ifnottex
+@ifclear FOR_PRINT
+Appaiono anche nell'indice sotto la voce ``angolo buio.''
+@end ifclear
+
+Ma come osservato nella citazione d'apertura, ogni trattazione degli
+angoli bui @`e per definizione incompleta.
+
+@cindex e.c., si veda estensioni comuni
+Estensioni al linguaggio standard di @command{awk} disponibili in pi@`u di una
+implementazione di @command{awk} sono segnate
+@ifclear FOR_PRINT
+``@value{COMMONEXT},'' ed elencate nell'indice sotto ``estensioni comuni''
+e ``comuni, estensioni''.
+@end ifclear
+@ifset FOR_PRINT
+``@value{COMMONEXT}'' per ``estensioni comuni.''
+@end ifset
+
+@node Storia del manuale
+@unnumberedsec Breve storia del Progetto GNU e di questo @value{DOCUMENT}
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@cindex Stallman, Richard
+La Free Software Foundation (FSF) @`e un'organizzazione senza scopo di lucro
+dedita alla produzione e distribuzione di software liberamente distribuibile.
+@`E stata fondata da Richard M.@: Stallman, l'autore della prima versione
+dell'editor Emacs.  GNU Emacs @`e oggi la versione di Emacs pi@`u largamente usata.
+
+@cindex Progetto GNU
+@cindex GNU, Progetto
+@cindex GPL (General Public License)
+@cindex General Public License, si veda GPL
+@cindex documentazione, online
+Il Progetto GNU@footnote{GNU sta per ``GNU's Not Unix.''}
+@`e un progetto della Free Software
+Foundation in continuo sviluppo per creare un ambiente per computer completo, liberamente
+distribuibile, conforme allo standard POSIX.
+La FSF usa la GNU General Public License (GPL) per assicurare che
+il codice sorgente del loro software sia sempre
+disponibile all'utente finale.
+@ifclear FOR_PRINT
+Una copia della GPL @`e inclusa
+@ifnotinfo
+in questo @value{DOCUMENT}
+@end ifnotinfo
+per la consultazione
+(@pxref{Copia}).
+@end ifclear
+La GPL si applica al codice sorgente in linguaggio C per @command{gawk}.
+Per saperne di pi@`u sulla FSF e sul Progetto GNU,
+si veda @uref{https://www.gnu.org, la pagina principale del Progetto GNU}.
+Questo @value{DOCUMENT} si pu@`o leggere anche dal
+@uref{https://www.gnu.org/software/gawk/manual/, sito di GNU}.
+
+@ifclear FOR_PRINT
+Una shell, un editor (Emacs), compilatori ottimizzanti C, C++ e
+Objective-C altamente portabili, un debugger simbolico e dozzine di grandi e
+piccoli programmi di utilit@`a (come @command{gawk}), sono stati completati e
+sono liberamente disponibili.  Il kernel del sistema operativo GNU (noto come
+HURD), @`e stato rilasciato ma @`e ancora allo stato di sviluppo iniziale.
+
+@cindex Linux
+@cindex GNU/Linux
+@cindex sistemi operativi basati su BSD
+In attesa che il sistema operativo GNU venga pi@`u completatamente
+sviluppato, si dovrebbe prendere in considerazione l'uso di GNU/Linux, un
+sistema operativo liberamente distribuibile e basato su Unix disponibile
+per Intel, Power Architecture,
+Sun SPARC, IBM S/390, e altri
+sistemi.@footnote{La terminologia ``GNU/Linux'' @`e spiegata
+nel @ref{Glossario}.}
+Molte distribuzioni GNU/Linux sono
+scaricabili da internet.
+@end ifclear
+
+@ifnotinfo
+Il @value{DOCUMENT} @`e realmente libero---almeno, l'informazione che contiene
+@`e libera per chiunque---.  Il codice sorgente del @value{DOCUMENT}, leggibile
+elettronicamente, viene fornito con @command{gawk}.
+@ifclear FOR_PRINT
+(Dare un'occhiata alla Free Documentation
+License in @ref{Licenza per Documentazione Libera GNU (FDL)}.)
+@end ifclear
+@end ifnotinfo
+
+@cindex Close, Diane
+Il @value{DOCUMENT} in s@'e ha gi@`a avuto parecchie edizioni in passato.
+Paul Rubin ha scritto la prima bozza di @cite{The GAWK Manual};, che era
+lunga una quarantina di pagine.
+Diane Close e Richard Stallman l'hanno migliorata arrivando alla
+versione che era
+lunga una novantina di pagine, e descriveva solo la versione originale
+``vecchia'' di @command{awk}.
+Ho iniziato a lavorare con quella versione nell'autunno del 1988.
+Mentre ci stavo lavorando,
+la FSF ha pubblicato parecchie versioni preliminari, numerate 0.@var{x}).
+Nel 1996, l'edizione 1.0 fu rilasciata assieme a @command{gawk} 3.0.0.
+La FSF ha pubblicato le prime due edizioni col
+titolo @cite{GAWK: The GNU Awk User's Guide}.
+@ifset FOR_PRINT
+SSC ha pubblicato due edizioni del @value{DOCUMENT} col
+titolo @cite{Effective awk Programming}, e O'Reilly ha pubblicato
+la terza edizione nel 2001
+@end ifset
+
+Questa edizione mantiene la struttra di base delle edizioni precedenti.
+Per l'edizione FSF 4.0, il contenuto era stato accuratamente rivisto
+e aggiornato.  Tutti i riferimenti a versioni di @command{gawk} anteriori alla
+versione 4.0 sono stati eliminati.
+Di particolare interesse in quella edizione era l'aggiunta del @ref{Debugger}.
+
+Per l'edizione FSF
+@ifclear FOR_PRINT
+@value{EDITION},
+@end ifclear
+@ifset FOR_PRINT
+@value{EDITION}
+(la quarta edizione, come pubblicata da O'Reilly),
+@end ifset
+il contenuto @`e stato riorganizzato in parti,
+e le aggiunte pi@`u importanti sono
+@iftex
+il
+@end iftex
+@ref{Calcolo con precisione arbitraria}, e
+@iftex
+il
+@end iftex
+@ref{Estensioni dinamiche}.
+
+Questo @value{DOCUMENT} continuer@`a certamente ad evolversi.  Se si trovano
+errori nel @value{DOCUMENT}, si prega di segnalarli! @xref{Bug}
+per informazioni su come inviare le segnalazione di problemi elettronicamente.
+@ifset FOR_PRINT
+@node Restare aggiornati
+@unnumberedsec Come restare aggiornati
+
+Potreste avere una versione di @command{gawk} pi@`u recente di quella
+descritta qui.  Per vedere cosa @`e cambiato,
+dovreste prima guardare il file @file{NEWS} nella distribuzione di
+@command{gawk}, che fornisce un sommario ad alto livello dei
+cambiamenti in ciascuna versione.
+
+@`E poi possibile consultare la @uref{https://www.gnu.org/software/gawk/manual/,
+versione online} di questo @value{DOCUMENT} per informazioni su eventuali
+nuove funzionalit@`a.
+@end ifset
+
+@ifclear FOR_PRINT
+@node Come contribuire
+@unnumberedsec Come collaborare
+
+Come manutentore di GNU @command{awk}, un tempo pensai che sarei stato in grado
+di gestire una raccolta di programmi @command{awk} pubblicamente disponibili e
+avevo anche esortato a collaborare.  Rendere disponibili le cose su Internet
+aiuta a contenere la distribuzione @command{gawk} entro dimensioni gestibili.
+
+L'iniziale raccolta di materiale, cos@`{@dotless{i}} com'@`e, @`e tuttora disponibile
+su @uref{ftp://ftp.freefriends.org/arnold/Awkstuff}.
+
+Nella speranza di fare qualcosa di pi@`u generale, ho acuisito il dominio
+@code{awklang.org}.  A fine anno 2017 un volontario si @`e assunto il compito
+di gestirlo.
+
+Se qualcuno ha scritto un programma @command{awk} interessante, o
+un'estensione a @command{gawk} che vuole condividere col resto del mondo,
+@`e invitato a consultare la pagina @uref{http://www.awklang.org} e a usare
+il puntatore ``Contact''.
+
+Se qualcuno ha scritto un'estensione a @command{gawk}, si veda
+@ref{gawkextlib}.
+
+@end ifclear
+
+@node Ringraziamenti
+@unnumberedsec Ringraziamenti
+
+La bozza iniziale di @cite{The GAWK Manual} riportava i seguenti ringraziamenti:
+
+@quotation
+Molte persone devono essere ringraziate per la loro assistenza nella produzione
+di questo manuale.  Jay Fenlason ha contribuito con molte idee e programmi di
+esempio.  Richard Mlynarik e Robert Chassell hanno fatto utili osservazioni
+sulle bozze di questo manuale.  Lo scritto
+@cite{A Supplemental Document for AWK} di John W.@: Pierce, del
+Chemistry Department di UC San Diego, fa il punto su diverse questioni rilevanti
+sia per l'implementazione di @command{awk} che per questo manuale, che
+altrimenti ci sarebbero sfuggite.
+@end quotation
+
+@cindex Stallman, Richard
+Vorrei ringraziare Richard M.@: Stallman, per la sua visione di un mondo
+migliore e per il suo coraggio nel fondare la FSF e nel dare inizio al
+Progetto GNU.
+
+@ifclear FOR_PRINT
+Edizioni precedenti di questo @value{DOCUMENT} riportavano i seguenti
+ringraziamenti:
+@end ifclear
+@ifset FOR_PRINT
+La precedente edizione di questo @value{DOCUMENT} riportava
+i seguenti ringraziamenti:
+@end ifset
+
+@quotation
+Le seguenti persone (in ordine alfabetico)
+hanno inviato commenti utili riguardo alle diverse
+versioni di questo libro:
+Rick Adams,
+Dr.@: Nelson H.F. Beebe,
+Karl Berry,
+Dr.@: Michael Brennan,
+Rich Burridge,
+Claire Cloutier,
+Diane Close,
+Scott Deifik,
+Christopher (``Topher'') Eliot,
+Jeffrey Friedl,
+Dr.@: Darrel Hankerson,
+Michal Jaegermann,
+Dr.@: Richard J.@: LeBlanc,
+Michael Lijewski,
+Pat Rankin,
+Miriam Robbins,
+Mary Sheehan,
+e
+Chuck Toporek.
+
+@cindex Berry, Karl
+@cindex Chassell, Robert J.@:
+@c @cindex Texinfo
+Robert J.@: Chassell ha dato preziosissimi consigli
+sull'uso di Texinfo.
+Merita anche un particolare ringraziamento per avermi
+convinto a @emph{non} dare a questo @value{DOCUMENT}
+il titolo @cite{How to Gawk Politely}. [Un gioco di parole in inglese che pu@`o
+significare sia
+@cite{Come usare Gawk educatamente}
+che @cite{Come curiosare educatamente}].
+Karl Berry ha aiutato in modo significativo con la parte @TeX{} di Texinfo.
+
+@cindex Hartholz, Marshall
+@cindex Hartholz, Elaine
+@cindex Schreiber, Bert
+@cindex Schreiber, Rita
+Vorrei ringraziare Marshall ed Elaine Hartholz di Seattle e il Dr.@: Bert e Rita
+Schreiber di Detroit per i lunghi periodi di vacanza trascorsi in tutta
+tranquillit@`a in casa loro, che mi hanno permesso di fare importanti progressi
+nella scrittura di questo @value{DOCUMENT} e con lo stesso @command{gawk}.
+
+@cindex Hughes, Phil
+Phil Hughes di SSC
+ha contribuito in modo molto importante prestandomi il suo portatile col sistema
+GNU/Linux, non una volta, ma due, il che mi ha permesso di fare tantissimo lavoro
+mentre ero fuori casa.
+
+@cindex Trueman, David
+David Trueman merita un riconoscimento speciale; ha fatto un lavoro da sentinella
+durante lo sviluppo di @command{gawk} affinch@'e funzioni bene e senza errori.
+Sebbene non sia pi@`u impegnato con @command{gawk},
+lavorare con lui a questo progetto @`e stato un vero piacere.
+
+@cindex Drepper, Ulrich
+@cindex GNITS mailing list
+@cindex mailing list, GNITS
+Gli intrepidi membri della lista GNITS, con una particolare menzione per Ulrich
+Drepper, hanno fornito un aiuto prezioso e commenti per il progetto
+delle funzionalit@`a di internazionalizzazione.
+
+Chuck Toporek, Mary Sheehan, e Claire Cloutier della O'Reilly & Associates hanno
+fornito un'assistenza editoriale rilevante per questo @value{DOCUMENT} per la
+versione 3.1 di @command{gawk}.
+@end quotation
+
+@cindex Beebe, Nelson H.F.@:
+@cindex Buening, Andreas
+@cindex Collado, Manuel
+@cindex Colombo, Antonio
+@cindex Davies, Stephen
+@cindex Deifik, Scott
+@cindex Demaille, Akim
+@cindex G., Daniel Richard
+@cindex Guerrero, Juan Manuel
+@cindex Hankerson, Darrel
+@cindex Jaegermann, Michal
+@cindex Kahrs, J@"urgen
+@cindex Kasal, Stepan
+@cindex Malmberg, John E.
+@cindex Pitts, Dave
+@cindex Ramey, Chet
+@cindex Rankin, Pat
+@cindex Schorr, Andrew
+@cindex Vinschen, Corinna
+@cindex Zaretskii, Eli
+
+Dr.@: Nelson Beebe,
+Andreas Buening,
+Dr.@: Manuel Collado,
+Antonio Colombo,
+Stephen Davies,
+Scott Deifik,
+Akim Demaille,
+Daniel Richard G.,
+Juan Manuel Guerrero,
+Darrel Hankerson,
+Michal Jaegermann,
+J@"urgen Kahrs,
+Stepan Kasal,
+John Malmberg,
+Dave Pitts,
+Chet Ramey,
+Pat Rankin,
+Andrew Schorr,
+Corinna Vinschen,
+ed Eli Zaretskii
+(in ordine alfabetico)
+costituiscono l'attuale ``gruppo di lavoro sulla portabilit@`a'' di
+@command{gawk}.  Senza il loro duro lavoro e il loro aiuto,
+@command{gawk} non sarebbe stato neanche lontanamente il buon programma che @`e
+oggi.  @`E stato e continua a essere un piacere lavorare con questo gruppo
+di ottimi collaboratori.
+
+Notevoli contributi di codice e documentazione sono arrivati da
+parecchie persone. @xref{Contributori} per l'elenco completo.
+
+@ifset FOR_PRINT
+@cindex Oram, Andy
+Grazie ad Andy Oram della O'Reilly Media per aver iniziato
+la quarta edizione e per il suo aiuto in corso d'opera.
+Grazie a Jasmine Kwityn per il suo lavoro di revisione.
+@end ifset
+
+Grazie a Michael Brennan per le Prefazioni.
+
+@cindex Duman, Patrice
+@cindex Berry, Karl
+Grazie a Patrice Dumas per il nuovo programma @command{makeinfo}.
+Grazie a Karl Berry, che continua a lavorare per tenere
+aggiornato il linguaggio di marcatura Texinfo.
+
+@cindex Kernighan, Brian
+@cindex Brennan, Michael
+@cindex Day, Robert P.J.@:
+Robert P.J.@: Day, Michael Brennan e Brian Kernighan hanno gentilmente
+fatto da revisiori per l'edizione 2015 di questo @value{DOCUMENT}.  Le loro
+osservazioni hanno contribuito a migliorare la stesura finale.
+
+Vorrei ringraziare Brian Kernighan per la sua preziosa assistenza durante
+la fase di collaudo e di debug di @command{gawk} e
+per l'aiuto in corso d'opera e i consigli nel chiarire diversi punti sul
+linguaggio.  Non avremmo proprio fatto un cos@`{@dotless{i}} buon lavoro su @command{gawk} e
+sulla sua documentazione senza il suo aiuto.
+
+Brian @`e un fuoriclasse sia come programmatore che come autore di manuali
+tecnici.  @`E mio dovere ringraziarlo (una volta di pi@`u) per la sua costante
+amicizia e per essere stato per me un modello da seguire ormai da quasi
+30 anni!  Averlo come revisiore @`e per me un privilegio eccitante, ma @`e
+stata anche un'esperienza che mi ha fatto sentire molto piccolo@enddots{}
+
+@cindex Robbins, Miriam
+@cindex Robbins, Jean
+@cindex Robbins, Harry
+@cindex D-o
+Devo ringraziare la mia meravigliosa moglie, Miriam, per la sua pazienza nel
+corso delle molte versioni di questo progetto, per la correzione delle bozze e
+per aver condiviso con me il computer.
+Vorrei ringraziare i miei genitori per il loro amore, e per la gentilezza con cui
+mi hanno cresciuto ed educato.
+Infine, devo riconoscere la mia gratitudine a D-o, per le molte opportunit@`a
+che mi ha offerto, e anche per i doni che mi ha elargito, con cui trarre
+vantaggio da quelle opportunit@`a.
+@ifnotdocbook
+@sp 2
+@noindent
+Arnold Robbins @*
+Nof Ayalon @*
+Israel @*
+Febbraio 2015
+@end ifnotdocbook
+
+@ifnotinfo
+@part @value{PART1}Il Linguaggio @command{awk}
+@end ifnotinfo
+
+@ifdocbook
+@part Il Linguaggio @command{awk}
+
+La Parte I descrive il linguaggio @command{awk} e il programma @command{gawk}
+nel dettaglio.  Inizia con le nozioni di base, e continua con tutte le
+funzionalit@`a di @command{awk}.  Sono incluse anche molte, ma non tutte, le
+funzionalit@`a di @command{gawk}.  Questa parte contiene i
+seguenti capitoli:
+
+@itemize @value{BULLET}
+@item
+@ref{Per iniziare}
+
+@item
+@ref{Invocare Gawk}
+
+@item
+@ref{Espressioni regolari}
+
+@item
+@ref{Leggere file}
+
+@item
+@ref{Stampare}
+
+@item
+@ref{Espressioni}
+
+@item
+@ref{Modelli e azioni}
+
+@item
+@ref{Vettori}
+
+@item
+@ref{Funzioni}
+@end itemize
+@end ifdocbook
+@node Per iniziare
+@chapter Per iniziare con @command{awk}
+@c @cindex @dfn{script}, definizione di
+@c @cindex rule, definizione di
+@c @cindex program, definizione di
+@c @cindex basic function of @command{awk}
+@cindex @command{awk}, funzione di
+
+Il compito fondamentale di @command{awk} @`e quello di ricercare righe (o
+altre unit@`a di testo) in file che corrispondano a certi criteri di ricerca.
+Quando una riga corrisponde a uno dei criteri, @command{awk} esegue su
+quella riga le azioni specificate per quel criterio.  @command{awk} continua
+a elaborare righe in input in questo modo, finch@'e non raggiunge la fine delle
+righe nei file in input.
+
+@cindex @command{awk}, uso di
+@cindex linguaggi di programmazione@comma{} guidati-dai-dati/procedurali
+@cindex @command{awk}, programmi
+I programmi scritti in @command{awk} sono differenti dai programmi scritti
+nella maggior parte degli altri linguaggi,
+poich@'e i programmi @command{awk} sono @dfn{guidati dai dati} (ovvero,
+richiedono di descrivere i dati sui quali si vuole operare, e in seguito
+che cosa fare una volta che tali dati siano stati individuati).
+La maggior parte degli altri linguaggi sono @dfn{procedurali}; si deve
+descrivere, in maniera molto dettagliata, ogni passo che il programma
+deve eseguire.  Lavorando con linguaggi procedurali, solitamente @`e
+molto pi@`u difficile descrivere chiaramente i dati che il programma
+deve elaborare.
+Per questa ragione i programmi @command{awk} sono spesso piacevolmente
+facili da leggere e da scrivere.
+
+@cindex programma, definizione di
+@cindex regola, definizione di
+Quando si esegue @command{awk}, va specificato un
+@dfn{programma} @command{awk} che
+dice ad @command{awk} cosa fare.  Il programma consiste di una serie di
+@dfn{regole} (pu@`o anche contenere @dfn{definizioni di funzioni},
+una funzionalit@`a avanzata che per ora ignoreremo;
+@pxref{Funzioni definite dall'utente}).  Ogni regola specifica un
+criterio di ricerca e un'azione da effettuare
+una volta che viene trovato un record corrispondente.
+
+Sintatticamente, una regola consiste in un @dfn{criterio di ricerca}, seguito
+da una @dfn{azione}.
+L'azione @`e racchiusa tra parentesi graffe per separarla dal criterio di
+ricerca.
+Per separare regole, basta andare a capo.  Quindi un programma
+@command{awk} ha una struttura simile a questa:
+
+@example
+@var{criterio} @{ @var{azione} @}
+@var{criterio} @{ @var{azione} @}
+@dots{}
+@end example
+
+@menu
+* Eseguire gawk::               Come iniziare a eseguire programmi
+                                @command{gawk}; comprende la sintassi
+                                della riga di comando.
+* File dati di esempio::        File di dati di esempio da usare nei
+                                programmi @command{awk} illustrati in
+                                questo @value{DOCUMENT}.
+* Molto semplice::              Un esempio molto semplice.
+* Due regole::                  Un esempio meno semplice di programma
+                                di una riga, che usa due regole.
+* Maggiore sofisticazione::     Un esempio pi@`u complesso.
+* Istruzioni/Righe::            Suddividere o riunire istruzioni
+                                su [una o pi@`u] righe.
+* Altre funzionalit@`a::        Altre funzionalit@`a di @command{awk}.
+* Quando::                      Quando usare @command{gawk} e quando
+                                usare altre cose.
+* Sommario dell'introduzione::  Sommario dell'introduzione.
+@end menu
+
+@node Eseguire gawk
+@section Come iniziare a eseguire programmi @command{gawk}
+
+@cindex programmi @command{awk}, eseguire
+Ci sono vari modi di eseguire un programma @command{awk}.  Se il programma @`e
+corto, @`e pi@`u facile includerlo nel comando con cui si invoca @command{awk},
+cos@`{@dotless{i}}:
+
+@example
+awk '@var{programma}' @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@cindex riga di comando, formati
+Quando il programma @`e lungo, di solito @`e meglio metterlo in un file
+ed eseguirlo con un comando come questo:
+
+@example
+awk -f @var{file-di-programma} @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} si occupa di entrambe queste modalit@`a insieme
+a parecchie varianti di ciascuna di esse.
+
+@menu
+* Monouso::                             Eseguire un breve programma
+                                        @command{awk} di tipo usa-e-getta.
+* Leggere dal terminale::               Senza uso di file in input (input
+                                        immesso da tastiera).
+* Lunghi::                              Mettere programmi @command{awk}
+                                        permanenti in file.
+* @dfn{Script} eseguibili::             Preparare programmi @command{awk}
+                                        da eseguire come @dfn{script}.
+* Commenti::                            Aggiungere documentazione a programmi
+                                        @command{gawk}.
+* Protezione::                          Ulteriore discussione di problemi
+                                        connessi all'uso di apici nella shell.
+@end menu
+
+@node Monouso
+@subsection Eseguire un breve programma @command{awk} usa-e-getta
+
+Una volta acquisita familiarit@`a con @command{awk}, capiter@`a spesso di
+preparare semplici
+programmi nel momento in cui servono.  In questo caso si pu@`o scrivere
+il programma come primo argomento del comando @command{awk}, cos@`{@dotless{i}}:
+
+@example
+awk '@var{programma}' @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@noindent
+dove @var{programma} consiste in una serie di criteri di ricerca e di
+azioni, come descritto precedentemente.
+
+@cindex apice singolo (@code{'})
+@cindex @code{'} (apice singolo)
+Questo formato di comando chiede alla @dfn{shell}, ossia all'interpretatore
+dei comandi, di richiamare @command{awk} e di usare il @var{programma} per
+trattare record nei file in input.
+Il @var{programma} @`e incluso tra apici in modo che
+la shell non interpreti qualche carattere destinato ad @command{awk} come
+carattere speciale
+della shell.  Gli apici fanno inoltre s@`{@dotless{i}} che la shell tratti tutto il
+@var{programma} come un solo argomento per @command{awk}, e permettono che
+@var{programma} sia pi@`u lungo di una riga.
+
+@cindex shell, @dfn{script}
+@cindex programmi @command{awk}, eseguire, da @dfn{script} di shell
+Questo formato @`e utile anche per eseguire programmi @command{awk} di
+dimensioni piccole o medie da @dfn{script} di shell, perch@'e non richiede
+un file separato che contenga il programma @command{awk}.  Uno @dfn{script}
+di shell @`e pi@`u affidabile, perch@'e non ci sono altri file che possono
+venirsi a trovare fuori posto.
+
+Pi@`u avanti in questo capitolo,
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ifdocbook
+@value{SECTION}
+@end ifdocbook
+@ref{Molto semplice},
+si vedranno esempi di parecchi programmi,
+brevi, scritti sulla riga di comando.
+
+@node Leggere dal terminale
+@subsection Senza uso di file in input (input immesso da tastiera)
+
+@cindex standard input
+@cindex input, standard
+@cindex file in input, eseguire @command{awk} senza usarli
+Si pu@`o anche eseguire @command{awk} senza indicare alcun file in input.  Se
+si immette la seguente riga di comando:
+
+@example
+awk '@var{programma}'
+@end example
+
+@noindent
+@command{awk} prende come input del @var{programma} lo @dfn{standard input},
+che di solito significa qualsiasi cosa venga immesso dalla tastiera.
+Ci@`o prosegue finch@'e non si segnala una fine-file battendo @kbd{Ctrl-d}.
+(In sistemi operativi non-POSIX, il carattere di fine-file pu@`o essere diverso.)
+
+@cindex input, file in, si veda file in input
+@cindex file in input, eseguire @command{awk} senza usarli
+@cindex programmi @command{awk}, eseguire, senza file in input
+Per esempio, il seguente programma stampa un consiglio da amico
+(dalla @cite{Guida galattica per gli autostoppisti} di Douglas Adams ),
+per non lasciarsi spaventare dalle complessit@`a della programmazione per
+computer:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Non v\47allarmate!" @}'}
+@print{} Non v'allarmate!
+@end example
+
+@command{awk} esegue le istruzioni associate a @code{BEGIN} prima di leggere
+qualsiasi input.  Se non ci sono altre istruzioni nel proprio programma, come
+in questo caso, @command{awk} si ferma, invece di tentare di leggere input che
+non sa come elaborare.
+Il @samp{\47} @`e un modo straordinario (spiegato pi@`u avanti) per inserire un
+apice singolo nel programma, senza dover ricorrere a fastidiosi meccanismi
+di protezione della shell.
+
+@quotation NOTA
+Se si usa Bash come shell, si dovrebbe digitare il comando @samp{set +H} prima
+eseguire questo programma interattivamente, per non avere una cronologia dei
+comandi nello stile della C shell, che tratta il @samp{!} come un carattere
+speciale.  Si raccomanda di inserire quel comando nel proprio file di
+personalizzazione della shell.
+@end quotation
+
+Il seguente semplice programma @command{awk}
+emula il comando @command{cat}; ovvero copia qualsiasi cosa si
+batta sulla tastiera nel suo standard output (perch@'e succede @`e spiegato fra
+poco):
+
+@example
+$ @kbd{awk '@{ print @}'}
+@kbd{Ora @`e il tempo per tutti gli uomini buoni}
+@print{} Ora @`e il tempo per tutti gli uomini buoni
+@kbd{di venire in aiuto al loro paese.}
+@print{} di venire in aiuto al loro paese.
+@kbd{Or sono sedici lustri e sette anni, ...}
+@print{} Or sono sedici lustri e sette anni, ...
+@kbd{Cosa, io preoccupato?}
+@print{} Cosa, io preoccupato?
+@kbd{Ctrl-d}
+@end example
+
+@node Lunghi
+@subsection Eseguire programmi lunghi
+
+@cindex programmi @command{awk}, eseguire
+@cindex programmi @command{awk}, lunghi
+@cindex file, programmi @command{awk} in
+Talora i programmi @command{awk} sono molto lunghi.  In tali situazioni
+conviene mettere il programma in un file separato.  Per dire ad
+@command{awk} di usare quel file come programma, digitare:
+
+@example
+awk -f @var{file-sorgente} @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@cindex @option{-f}, opzione
+@cindex riga di comando, opzione @option{-f}
+L'opzione @option{-f} dice al comando @command{awk} di ottenere il programma
+@command{awk} dal file @var{file-sorgente} (@pxref{Opzioni}).
+Ogni @value{FN} pu@`o essere usato come @var{file-sorgente}.  Per esempio, si
+potrebbe mettere il programma:
+
+@example
+BEGIN @{ print \"Non v'allarmate!\" @}
+@end example
+
+@noindent
+nel file @file{consiglio}.  Allora questo comando:
+
+@example
+awk -f consiglio
+@end example
+
+@noindent
+equivale al comando:
+
+@example
+awk 'BEGIN @{ print \"Non v\47allarmate!\" @}'
+@end example
+
+@cindex protezione, nella riga di comando di @command{gawk}
+@noindent
+Questo @`e gi@`a stato spiegato prima
+(@pxref{Leggere dal terminale}).
+Si noti che normalmente non serve mettere apici singoli nel @value{FN} che si
+fornisce con @option{-f}, perch@'e di solito i @value{FNS} non contengono
+caratteri che sono speciali per la shell.  Si noti che in @file{consiglio},
+il programma @command{awk} non ha dei doppi apici che lo delimitano.  I
+doppi apici sono necessari solo per programmi scritti direttamente sulla riga
+di comando di @command{awk}.
+(Inoltre, se il programma si trova in un file, @`e possibile usare un apice
+singolo all'interno del programma, invece del magico @samp{\47}.)
+
+@cindex apice singolo (@code{'}), nella riga di comando di @command{gawk}
+@cindex @code{'} (apice singolo), nella riga di comando di @command{gawk}
+Per identificare chiaramente un file di programma @command{awk} come tale,
+si pu@`o aggiungere il suffisso @file{.awk} al @value{FN}.  Ci@`o non
+cambia l'esecuzione del programma @command{awk} ma semplifica
+la ``manutenzione''.
+
+@node @dfn{Script} eseguibili
+@subsection Programmi @command{awk} da eseguire come @dfn{script}
+@cindex programmi @command{awk}
+@cindex @code{#} (cancelletto), @code{#!} (@dfn{script} eseguibili)
+@cindex Unix, @dfn{script} @command{awk} e
+@cindex cancelletto (@code{#}), @code{#!} (@dfn{script} eseguibili)
+
+Una volta familiarizzato con @command{awk}, si potrebbero scrivere
+@dfn{script} che richiamano @command{awk}, usando il meccanismo di
+@dfn{script} @samp{#!}.  Ci@`o @`e
+possibile in molti sistemi operativi.@footnote{Il meccanismo @samp{#!}
+funziona nei sistemi
+GNU/Linux, in quelli basati su BSD e nei sistemi Unix a pagamento.}
+Per esempio, si potrebbe modificare il file @file{consiglio} e farlo divenire:
+
+@example
+#! /bin/awk -f
+
+BEGIN @{ print \"Non v'allarmate!\" @}
+@end example
+
+@noindent
+Dopo aver reso eseguibile questo file (con il comando @command{chmod}),
+digitare semplicemente @samp{consiglio}
+al prompt della shell e il sistema si preparer@`a a eseguire @command{awk}
+come se si fosse digitato @samp{awk -f consiglio}:
+
+@example
+$ @kbd{chmod +x consiglio}
+$ @kbd{consiglio}
+@print{} Non v'allarmate!
+@end example
+
+@noindent
+(Si suppone che la directory corrente sia tra quelle contenute nella variabile
+che indica il "percorso" di ricerca [solitamente @code{$PATH}].  In caso
+contrario si potrebbe aver bisogno di digitare @samp{./consiglio} nella
+shell.)
+
+@dfn{Script} @command{awk} autocontenuti sono utili se si vuol scrivere un
+programma che gli utenti possono richiamare senza dover essere informati che
+il programma @`e scritto in @command{awk}.
+
+@sidebar Comprendere @samp{#!}
+@cindex portabilit@`a, @code{#!} (@dfn{script} eseguibili)
+
+@command{awk} @`e un linguaggio @dfn{interpretato}.  Ci@`o significa che il
+comando @command{awk} legge il programma dell'utente e poi elabora i dati
+secondo le istruzioni contenute nel programma (diversamente da un linguaggio
+@dfn{compilato} come il C, dove il programma viene prima compilato in codice
+macchina che @`e eseguito direttamente dal processore del sistema).  Il
+programma di utilit@`a @command{awk} @`e perci@`o chiamato @dfn{interpretatore}.
+Molti linguaggi moderni sono interpretati.
+
+La riga che inizia con @samp{#!} lista l'intero @value{FN} di un
+interpretatore
+da richiamare, con degli argomenti opzionali che saranno passati a
+quell'interpretatore sulla riga di comando.  Il sistema operativo quindi
+richiama l'interpretatore con gli argomenti dati e con l'intera lista di
+argomenti con cui era stato invocato il programma.  Il primo argomento nella
+lista @`e l'intero @value{FN} del programma @command{awk}.  Il resto della lista
+degli argomenti contiene opzioni per  @command{awk}, oppure @value{DF}, o
+entrambi.  (Si noti che in molti sistemi @command{awk} pu@`o essere trovato in
+@file{/usr/bin} invece che in @file{/bin}.)
+
+Alcuni sistemi limitano la lunghezza del nome del programma interpretarore a
+32 caratteri.  Spesso, si pu@`o rimediare utilizzando un collegamento simbolico.
+
+Non si dovrebbero mettere altri argomenti oltre al primo nella riga @samp{#!}
+dopo il percorso del comando @command{awk}.  Non funziona.  Il sistema
+operativo tratta il resto della riga come un argomento solo, e lo passa ad
+@command{awk}.
+Cos@`{@dotless{i}} facendo il comportamento sar@`a poco chiaro; con ogni probabilit@`a un
+messaggio di errore di qualche tipo da @command{awk}.
+
+@cindex variabili @code{ARGC}/@code{ARGV}, portabilit@`a e
+@cindex portabilit@`a, variabile @code{ARGV}
+Infine, il valore di @code{ARGV[0]}
+@cindex angolo buio, @code{ARGV}, valore della variabile
+@cindex angolo buio, variabile @code{ARGV}, valore
+(@pxref{Variabili predefinite})
+pu@`o variare a seconda del sistema operativo.
+Alcuni sistemi ci mettono @samp{awk}, altri il nome completo del percorso
+di @command{awk} (ad. es. @file{/bin/awk}), e altri ancora mettono il nome
+dello @dfn{script} dell'utente (@samp{consiglio}).  @value{DARKCORNER}
+Non bisogna fidarsi del valore di @code{ARGV[0]}
+per ottenere il nome del proprio @dfn{script}.
+@end sidebar
+
+@node Commenti
+@subsection Documentare programmi @command{gawk}.
+@cindex @code{#} (cancelletto), commentare
+@cindex cancelletto (@code{#}), commentare
+@cindex commentare
+@cindex programmi @command{awk}, documentazione
+
+Un @dfn{commento} @`e del testo incluso in un programma per aiutare le
+persone che lo leggeranno; non @`e parte del programma eseguibile vero e
+proprio.  I commenti possono spiegare cosa fa il programma e come funziona.
+Quasi tutti i linguaggi di programmazione possono contenere commenti, poich@'e
+i programmi sono solitamente difficili da comprendere senza di essi.
+
+Nel linguaggio @command{awk}, un commento inizia con il segno del
+cancelletto (@samp{#}) e continua fino alla fine della riga.
+Il @samp{#} non deve necessariamente essere il primo carattere della riga.
+Il linguaggio @command{awk} ignora il resto di una riga dopo il carattere
+cancelletto.
+Per esempio, potremmo mettere quel che segue in @file{consiglio}:
+
+@example
+# Questo programma stampa uno scherzoso consiglio amichevole.
+# Aiuta a far passare la paura del computer agli utenti novelli.
+BEGIN    @{ print "Non v'allarmate!" @}
+@end example
+
+Si possono mettere dei commenti nei programmi @command{awk} usa-e-getta da
+digitare direttamente da tastiera, ma ci@`o solitmanete non serve molto; il
+fine di un commento @`e di aiutare l'utente o qualcun altro a comprendere il
+programma, quando lo rilegge in un secondo tempo.
+
+@cindex protezione, per piccoli programmi awk
+@cindex apice singolo (@code{'}), vs.@: apostrofo
+@cindex @code{'} (apice singolo), vs.@: apostrofo
+@quotation ATTENZIONE
+Come detto in
+@ref{Monouso},
+si possono includere programmi di dimensioni da piccole a medie tra apici
+singoli, per mantenere compatti i propri @dfn{script} di shell
+autocontenuti.  Nel far questo, @emph{non} bisogna inserire un apostrofo
+(ossia un apice singolo) in un commento, (o in qualsiasi altra parte del
+vostro programma).  La shell interpreta gli apici singoli come delimitatori
+di chiusura dell'intero programma.  Di conseguenza, solitamente la shell
+emette un messaggio riguardo ad apici presenti in numero dispari, e se
+@command{awk} viene comunque eseguito, @`e probabile che stampi strani
+messaggi di errori di sintassi.
+Per esempio, nel caso seguente:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Ciao" @} # un'idea brillante'}
+>
+@end example
+
+La shell considera il secondo apice singolo come delimitatore del testo
+precedente, e trova che un nuovo testo tra apici ha inizio verso la fine
+della riga di comando.  A causa di ci@`o emette una richiesta secondaria di
+input, e si mette in attesa di ulteriore input.
+Con il comando @command{awk} Unix, se si chiude l'ulteriore stringa tra
+apici singoli il risultato @`e il seguente:
+
+@example
+$ @kbd{awk '@{ print "Ciao" @} # un'idea brillante'}
+> @kbd{'}
+@error{} awk: fatale: non riesco ad aprire file `brillante'
+@error{}              in lettura (File o directory non esistente)
+@end example
+
+@cindex @code{\} (barra inversa)
+@cindex barra inversa (@code{\})
+Mettere una barra inversa prima dell'apice singolo in @samp{un'idea} non
+risolverebbe, poich@'e le barre inverse non sono speciali all'interno di apici
+singoli.
+La prossima @value{SUBSECTION} descrive le regole di protezione della shell.
+@end quotation
+
+@node Protezione
+@subsection Uso di apici nella shell.
+@cindex shell, uso di apici, regole per
+
+@menu
+* Doppi apici in DOS::              Passaggio di apici in file .BAT Windows.
+@end menu
+
+Per programmi @command{awk} di lunghezza da corta a media spesso conviene
+digitare il programma sulla riga di comando @command{awk}.
+La maniera migliore per farlo @`e racchiudere l'intero programma tra apici
+singoli.
+Questo vale sia che si digiti il programma interattivamente su
+richiesta della shell, sia che lo si scriva come parte di uno @dfn{script}
+di shell di maggiori dimensioni:
+
+@example
+awk '@var{testo del programma}' @var{input-file1} @var{input-file2} @dots{}
+@end example
+
+@cindex shell, uso di apici, regole per
+@cindex Bourne shell, uso di apici, regole per la
+Quando si lavora con la shell, non guasta avere una conoscenza
+di base sulle regole per l'uso di apici nella shell.  Le regole
+seguenti valgono solo per shell in stile Bourne (come Bash, la
+Bourne-Again shell).  Se si usa la C shell, si avranno regole differenti.
+
+Prima di immergerci nelle regole, introduciamo un concetto che ricorre
+in tutto questo @value{DOCUMENT}, che @`e quello della stringa @dfn{null},
+o vuota.
+
+La stringa nulla @`e una variabile, di tipo carattere, che non ha un valore.
+In altre parole, @`e vuota.  Nei programmi @command{awk} si scrive cos@`{@dotless{i}}:
+@code{""}.  Nella shell la si pu@`o scrivere usando apici sia singoli
+che doppi: @code{""} oppure @code{''}.  Sebbena la stringa nulla non contenga
+alcun carattere, essa esiste lo stesso.  Si consideri questo comando:
+
+@example
+$ @kbd{echo ""}
+@end example
+
+@noindent
+Qui, il comando @command{echo} riceve un solo argomento, anche se
+quell'argomento non contiene alcun carattere.  Nel resto di questo
+@value{DOCUMENT}, usiamo indifferentemente i termini @dfn{stringa nulla}
+e @dfn{stringa vuota}.  Ora, proseguiamo con le regole relative agli apici:
+
+
+@itemize @value{BULLET}
+@item
+Elementi tra apici possono essere concatenati con elementi non tra apici.
+La shell converte il tutto in un singolo argomento da passare
+al comando.
+
+@item
+Mettere una barra inversa (@samp{\}) prima di qualsiasi singolo carattere
+lo protegge.  La shell toglie la barra inversa e passa il carattere
+protetto al comando.
+
+@item
+@cindex @code{\} (barra inversa), nei comandi di shell
+@cindex barra inversa (@code{\}), nei comandi di shell
+@cindex apice singolo (@code{'}), nei comandi di shell
+@cindex @code{'} (apice singolo), nei comandi di shell
+Gli apici singoli proteggono qualsiasi cosa sia inclusa tra un apice di
+apertura e uno di chiusura.
+La shell non interpreta il testo protetto, il quale viene passato cos@`{@dotless{i}} com'@`e
+al comando.
+@`E @emph{impossibile} inserire un apice singolo in un testo racchiuso fra
+apici singoli.  Potete trovare in
+@ref{Commenti}
+un esempio di cosa succede se si prova a farlo.
+
+@item
+@cindex doppio apice (@code{"}), nei comandi shell
+@cindex @code{"} (doppio apice), nei comandi shell
+I doppi apici proteggono la maggior parte di quel che @`e racchiuso tra i
+doppi apici di apertura e quelli di chiusura.
+La shell effettua almeno la sostituzione di variabili e di comandi
+sul testo racchiuso tra doppi apici.
+Shell differenti possono fare ulteriori tipi di elaborazione
+sul testo racchiuso tra doppi apici.
+
+Poich@'e alcuni caratteri all'interno di un testo racchiuso tra doppi apici
+sono interpretati dalla shell, essi devono essere @dfn{protetti} all'interno
+del testo stesso.  Sono da tener presenti i caratteri
+@samp{$}, @samp{`}, @samp{\}, e @samp{"}, tutti i quali devono essere
+preceduti da una barra inversa quando ricorrono all'interno di un testo
+racchiuso tra doppi apici, per poter essere passati letteralmente al
+programma.  (La barra inversa viene tolta prima del passaggio al programma.)
+Quindi, l'esempio visto
+@ifnotinfo
+precedentemente
+@end ifnotinfo
+in @ref{Leggere dal terminale}:
+
+@example
+awk 'BEGIN @{ print "Non v\47allarmate!" @}'
+@end example
+
+@noindent
+si potrebbe scrivere invece cos@`{@dotless{i}}:
+
+@example
+$ @kbd{awk "BEGIN @{ print \"Non v'allarmate!\" @}"}
+@print{} Non v'allarmate!
+@end example
+
+@cindex apice singolo (@code{'}), con doppio apice
+@cindex @code{'} (apice singolo), con doppio apice
+Va notato che l'apice singolo non @`e speciale all'interno di un testo
+racchiuso tra doppi apici.
+
+@item
+Le stringhe nulle sono rimosse se presenti come parte di un argomento
+non-nullo sulla riga di comando, mentre oggetti esplicitamente nulli
+sono mantenuti come tali.
+Per esempio, per richiedere che il separatore di campo @code{FS} sia
+impostato alla stringa nulla, digitare:
+
+@example
+awk -F "" '@var{programma}' @var{file} # corretto
+@end example
+
+@noindent
+@cindex stringa nulla come argomento a @command{gawk}, protezione della
+Non @`e invece da usare:
+
+@example
+awk -F"" '@var{programma}' @var{file}  # errato!
+@end example
+
+@noindent
+Nel secondo caso, @command{awk} tenta di usare il nome del programma come
+valore di @code{FS}, e il primo @value{FN} come testo del programma!
+Ci@`o come minimo genera un errore di sintassi, e un comportamento confuso nel
+caso peggiore.
+@end itemize
+
+@cindex protezione, nella riga di comando di @command{gawk}, trucchi per la
+Mischiare apici singoli e doppi @`e difficile.  Occorre utilizzare
+trucchi della shell per gli apici, come questi:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo. <'"'"'>" @}'}
+@print{} Questo @`e un apice singolo. <'>
+@end example
+
+@noindent
+Questo programma stampa tre stringhe tra apici concatenate tra loro.
+La prima e la terza sono rinchiuse tra apici singoli, la seconda tra apici
+doppi.
+
+Quanto sopra pu@`o essere ``semplificato'' cos@`{@dotless{i}}:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo <'\''>" @}'}
+@print{} Questo @`e un apice singolo <'>
+@end example
+
+@noindent
+A voi la scelta del pi@`u leggibile dei due.
+
+Un'altra opzione @`e quella di usare doppi apici, proteggendo i doppi apici
+inclusi, a livello @command{awk}:
+
+@example
+$ @kbd{awk "BEGIN @{ print \"Questo @`e un apice singolo <'>\" @}"}
+@print{} Questo @`e un apice singolo <'>
+@end example
+
+@noindent
+Quest'opzione @`e fastidiosa anche perch@'e il doppio apice, la barra inversa e
+il simbolo del dollaro sono molto comuni nei programmi @command{awk} pi@`u
+avanzati.
+
+Una terza opzione @`e quella di usare le sequenze ottali equivalenti
+(@pxref{Sequenze di protezione})
+per i caratteri
+apice singolo e doppio, cos@`{@dotless{i}}:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{ print "Questo @`e un apice singolo <\47>" @}'}
+@print{} Questo @`e un apice singolo <'>
+$ @kbd{awk 'BEGIN @{ print "Questo @`e un doppio apice <\42>" @}'}
+@print{} Questo @`e un doppio apice <">
+@end group
+@end example
+
+@noindent
+Questo funziona bene, ma sai dovrebbe commentare chiaramente quel che
+il testo protetto significa.
+
+Una quarta possibilit@`a @`e di usare assegnamenti di variabili sulla riga di
+comando, cos@`{@dotless{i}}:
+
+@example
+@kbd{$ awk -v sq="'" 'BEGIN @{ print "Questo @`e un apice singolo <" sq ">" @}'}
+@print{} Questo @`e un apice singolo <'>
+@end example
+
+(Qui, le due stringhe costanti e il valore di @code{sq} sono concatenati in
+un'unica stringa che @`e stampata da @code{print}.)
+
+Se servono veramente sia gli apici singoli che quelli doppi nel proprio
+programma @command{awk}, @`e probabilmente meglio tenerlo in un file separato,
+dove la shell non interferisce, e si potr@`a scrivere quello che si vuole.
+
+@node Doppi apici in DOS
+@subsubsection Doppi apici in file .BAT Windows
+
+@ignore
+Date: Wed, 21 May 2008 09:58:43 +0200 (CEST)
+From: jeroen.brink@inter.NL.net
+Subject: (g)awk "contribution"
+To: arnold@skeeve.com
+Message-id: <42220.193.172.132.34.1211356723.squirrel@webmail.internl.net>
+
+Hello Arnold,
+
+maybe you can help me out. Found your email on the GNU/awk online manual
+pages.
+
+I've searched hard to figure out how, on Windows, to print double quotes.
+Couldn't find it in the Quotes area, nor on google or elsewhere. Finally i
+figured out how to do this myself.
+
+How to print all lines in a file surrounded by double quotes (on Windows):
+
+gawk "{ print \"\042\" $0 \"\042\" }" <file>
+
+Maybe this is a helpfull tip for other (Windows) gawk users. However, i
+don't have a clue as to where to "publish" this tip! Do you?
+
+Kind regards,
+
+Jeroen Brink
+@end ignore
+
+Sebbene questo @value{DOCUMENT} in generale si preoccupi solo di sistemi POSIX
+e della shell POSIX, il problema che stiamo per vedere emerge abbastanza
+spesso presso parecchi utenti, e per questo ne parliamo.
+
+@cindex Brink, Jeroen
+Le ``shell'' nei sistemi Microsoft Windows usano il carattere doppio apice
+per protezione, e rendono difficile o impossibile inserire un carattere
+doppio apice letterale in uno @dfn{script} scritto su una riga di comando.
+L'esempio che segue, per il quale ringraziamo Jeroen Brink, mostra come
+proteggere i doppi apici, con questo script di una sola riga, che stampa
+tutte le righe di un file, racchiudendole tra doppi apici:
+
+@example
+@{ print "\"" $0 "\"" @} @var{file}
+@end example
+
+@noindent
+In una riga di comando in ambiente MS-Windows lo @dfn{script} di una riga
+mostrato sopra pu@`o essere eseguito immettendo:
+
+@example
+gawk "@{ print \"\042\" $0 \"\042\" @}" @var{file}
+@end example
+
+In questo esempio, lo @samp{\042} @`e il codice ottale che rappresenta un
+doppio apice; @command{gawk} lo trasforma in un carattere doppio apice
+per poi scriverlo in output con l'istruzione @code{print}.
+
+In ambiente MS-Windows proteggere i doppi apici richiede questo
+espediente perch@'e occorre usare delle barre inverse per proteggere
+i doppi apici, ma le barre inverse non sono protette nella solita maniera;
+in effetti le barre inverse vanno raddoppiate o no a seconda che
+siano o non siano seguite da un doppio apice.
+La regola in ambiente MS-Windows per racchiudere tra doppi apici una
+stringa @`e la seguente:
+
+@enumerate
+@item
+Per ogni doppio apice presente nella stringa originale, sia @var{N} il
+numero di barre inverse presenti nella stringa prima di esso (@var{N}
+potrebbe anche valere zero).  Si rimpiazzino queste @var{N} barre inverse
+con @math{2@value{VOLTE}@var{N}+1} barre inverse
+
+@item
+Sia poi @var{N} il numero di barre inverse alla fine della stringa originale,
+(@var{N} potrebbe anche valere zero). Si rimpiazzino queste @var{N}
+barre inverse con @math{2@value{VOLTE}@var{N}} barre inverse
+
+@item
+La stringa cos@`{@dotless{i}} prodotta va racchiusa fra doppi apici.
+@end enumerate
+
+Quindi, per racchiudere fra doppi apici lo @dfn{script} di
+una riga @samp{@{ print "\"" $0 "\"" @}} del precedente esempio, si
+dovrebbe fare cos@`{@dotless{i}}:
+
+@example
+gawk "@{ print \"\\\"\" $0 \"\\\"\" @}" @var{file}
+@end example
+
+@noindent
+Comunque, usare la notazione @samp{\042} invece che @samp{\\\"} rimane sempre
+possibile, ed @'e di pi@`u facile lettura, perch@'e le barre inverse che non sono
+seguite da un doppio apice non hanno bisogno di essere duplicate.
+
+@node File dati di esempio
+@section @value{DDF} per gli esempi
+
+@cindex input file, esempi
+@cindex file di @code{mail-list}
+Molti degli esempi in questo @value{DOCUMENT} hanno come input due @value{DF}
+di esempio.  Il primo, @file{mail-list}, contiene una lista di nomi di
+persone, insieme ai loro indirizzi email e a informazioni riguardanti le
+persone stesse.
+Il secondo @value{DF}, di nome @file{inventory-shipped}, contiene
+informazioni riguardo a consegne mensili.  In entrambi i file,
+ogni riga @`e considerata come un @dfn{record}.
+
+Nel @file{mail-list}, ogni record contiene il nome di una persona,
+il suo numero di telefono, il suo indirizzo email, e un codice che indica
+la sua relazione con l'autore della lista.
+Le colonne sono allineate usando degli spazi.
+Una @samp{A} nell'ultima colonna indica che quella persona @`e un conoscente
+[Acquaintance].  Una @samp{F} nell'ultima colonna significa che quella
+persona @`e un amico [Friend].  Una @samp{R} vuol dire che quella persona @`e
+un parente [Relative]:
+
+@example
+@c system if test ! -d eg      ; then mkdir eg      ; fi
+@c system if test ! -d eg/lib  ; then mkdir eg/lib  ; fi
+@c system if test ! -d eg/data ; then mkdir eg/data ; fi
+@c system if test ! -d eg/prog ; then mkdir eg/prog ; fi
+@c system if test ! -d eg/misc ; then mkdir eg/misc ; fi
+@c file eg/data/mail-list
+Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+Anthony      555-3412     anthony.asserturo@@hotmail.com   A
+Becky        555-7685     becky.algebrarum@@gmail.com      A
+Bill         555-1675     bill.drowning@@hotmail.com       A
+Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
+Camilla      555-2912     camilla.infusarum@@skynet.be     R
+Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
+Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+Martin       555-6480     martin.codicibus@@hotmail.com    A
+Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@c endfile
+@end example
+
+@cindex file @code{inventory-shipped}
+Il @value{DF} @file{inventory-shipped} contiene
+informazioni sulle consegne effettuate durante l'anno.
+Ogni record contiene il mese, il numero di contenitori verdi spediti,
+il numero di scatole rosse spedite, il numero di borse arancione spedite,
+e il numero di pacchetti blu spediti, in quest'ordine.
+Ci sono 16 record, relativi ai dodici mesi dello scorso anno e ai primi
+quattro mesi dell'anno in corso.
+Una riga vuota separa i data relativi a ciascun anno:
+
+@example
+@c file eg/data/inventory-shipped
+Jan  13  25  15 115
+Feb  15  32  24 226
+Mar  15  24  34 228
+Apr  31  52  63 420
+May  16  34  29 208
+Jun  31  42  75 492
+Jul  24  34  67 436
+Aug  15  34  47 316
+Sep  13  55  37 277
+Oct  29  54  68 525
+Nov  20  87  82 577
+Dec  17  35  61 401
+
+Jan  21  36  64 620
+Feb  26  58  80 652
+Mar  24  75  70 495
+Apr  21  70  74 514
+@c endfile
+@end example
+
+Questi file di esempio sono inclusi nella distribuzione @command{gawk},
+nella directory @file{awklib/eg/data}.
+
+@node Molto semplice
+@section Alcuni esempi molto semplici
+
+I seguenti comandi eseguono un semplice programma @command{awk} che cerca
+nel file in input @file{mail-list} la stringa di caratteri @samp{li} (una
+sequenza di caratteri @`e solitamente chiamato una @dfn{stringa};
+il termine @dfn{stringa} @`e basato su un uso linguistico, del tipo
+``una stringa di perle'' o ``una stringa di luci decorative''):
+
+@example
+awk '/li/ @{ print $0 @}' mail-list
+@end example
+
+@noindent
+Quando si incontra una riga che contiene @samp{li}, la si stampa, perch@'e
+@w{@samp{print $0}} significa "stampa la riga corrente".  (Lo scrivere solo
+@samp{print} ha lo stesso significato, quindi avremmo anche potuto
+limitarci a fare cos@`{@dotless{i}}).
+
+Si sar@`a notato che delle barre (@samp{/}) delimitano la stringa @samp{li}
+nel programma @command{awk}.  Le barre indicano che @samp{li} @`e il
+modello da ricercare.  Questo tipo di notazione @`e definita come
+@dfn{espressione regolare}, e sar@`a trattata pi@`u avanti in maggior dettaglio
+@iftex
+(@pxrefil{Espressioni regolari}).
+@end iftex
+@ifnottex
+(@pxref{Espressioni regolari}).
+@end ifnottex
+Il modello pu@`o corrispondere anche solo a una parte di una parola.
+Ci sono
+apici singoli che racchiudono il programma @command{awk} in modo che la
+shell non interpreti alcuna parte di esso come un carattere speciale della
+shell.
+
+Questo @`e quello che il programma stampa:
+
+@example
+$ @kbd{awk '/li/ @{ print $0 @}' mail-list}
+@print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+@print{} Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
+@print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+@print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+@end example
+
+@cindex azioni, default
+@cindex criteri di ricerca, default
+In una regola @command{awk}, il criterio di selezione o l'azione possono
+essere omessi, ma non entrambi.  Se il criterio @`e omesso, l'azione viene
+applicata a @emph{ogni} riga dell'input.
+Se l'azione viene omessa, per default si stampano tutte le righe che
+sono individuate dal criterio di selezione.
+
+@cindex azioni, omesse
+Quindi, si potrebbe omettere l'azione (l'istruzione @code{print} e le
+graffe) nell'esempio precedente e il risultato sarebbe lo stesso:
+@command{awk} stampa tutte le righe che corrispondono al criterio di
+ricerca @samp{li}.  Per confronto, omettendo l'istruzione @code{print} ma
+lasciando le graffe si richiede un'azione nulla, che non fa nulla (cio@`e non
+stampa alcuna riga).
+
+@cindex programmi @command{awk}, esempi molto corti
+Molti programmi @command{awk} pratici sono lunghi solo una o due righe.
+Qui sotto troviamo una collezione di programmi utili e corti, per iniziare.
+Alcuni di questi programmi contengono elementi del linguaggio che non sono
+ancora stati spiegati.  (La descrizione del programma fornisce una buona
+idea di quel che si vuole ottenere, ma occorre leggere il resto del
+@value{DOCUMENT} per divenire esperti in @command{awk}!)
+Molti degli esempi usano un @value{DF} di nome @file{data}.  Questo serve solo
+a indicare la posizione del nome; se questi programmi devono venir usati per
+se stessi, sostituire i propri @value{FNS} al posto di @file{data}.
+Per futura memoria, si noti che spesso c'@`e pi@`u di un modo per fare qualcosa
+in @command{awk}.  In un altro momento, si potrebbe tornare a guardare questi
+esempi per vedere se si riescono a trovare modi differenti per fare le stesse
+cose mostrate qui appresso:
+
+@itemize @value{BULLET}
+@item
+Stampare ogni riga lunga pi@`u di 80 caratteri:
+
+@example
+awk 'length($0) > 80' data
+@end example
+
+L'unica regola presente ha un'espressione di relazione come modello
+e non ha azione---quindi applica l'azione di default, stampando il record.
+
+@item
+Stampare la lunghezza della riga in input pi@`u lunga:
+
+@example
+@group
+awk '@{ if (length($0) > max) max = length($0) @}
+     END @{ print max @}' data
+@end group
+@end example
+
+Il codice associato a @code{END} viene eseguito dopo che tutto
+l'input @`e stato letto; @`e l'altra faccia della medaglia di @code{BEGIN}.
+
+@cindex programma @command{expand}
+@cindex @command{expand}, programma
+@item
+Stampare la lunghezza della riga pi@`u lunga in @file{data}:
+
+@example
+expand data | awk '@{ if (x < length($0)) x = length($0) @}
+                   END @{ print "la lunghezza massima di una riga @`e" x @}'
+@end example
+
+Questo esempio @`e leggermente diverso da quello precedente:
+l'input @`e l'output del comando @command{expand}, che cambia i TAB
+in spazi, in modo che le larghezze confrontate siano quelle che sarebbero
+qualora le si stampasse, e non il numero dei caratteri di input su ogni
+riga.  [il carattere TAB occupa un byte nel file, ma pu@`o generare fino a
+otto spazi bianchi in fase di stampa.]
+
+@item
+Stampare ogni riga che abbia almeno un campo:
+
+@example
+awk 'NF > 0' data
+@end example
+
+Questa @`e una maniera facile per eliminare le righe vuote dal file (o
+piuttosto, per creare un nuovo file, simile al vecchio, ma nel quale le
+linee vuote sono state tolte).
+
+@item
+Stampare sette numeri casuali compresi tra 0 e 100, inclusi:
+
+@example
+awk 'BEGIN @{ for (i = 1; i <= 7; i++)
+                 print int(101 * rand()) @}'
+@end example
+
+@item
+Stampare il numero totale di byte usato da un @var{elenco-file}:
+
+@example
+ls -l @var{elenco-file} | awk '@{ x += $5 @}
+                         END @{ print "byte totali: " x @}'
+@end example
+
+@item
+Stampare il numero totale di kilobyte usati da @var{elenco-file}:
+
+@c Don't use \ continuation, not discussed yet
+@c Remember that awk does floating point division,
+@c no need for (x+1023) / 1024
+@example
+ls -l @var{elenco-file} | awk '@{ x += $5 @}
+   END @{ print "K-byte totali:", x / 1024 @}'
+@end example
+
+@item
+Stampare una lista in ordine alfabetico di tutti gli utenti del sistema
+[Unix]:
+
+@example
+awk -F: '@{ print $1 @}' /etc/passwd | sort
+@end example
+
+@item
+Contare le righe in un file:
+
+@example
+awk 'END @{ print NR @}' data
+@end example
+
+@item
+Stampare le righe pari nel @value{DF}:
+
+@example
+awk 'NR % 2 == 0' data
+@end example
+
+Se aveste usato invece l'espressione @samp{NR % 2 == 1},
+il programma avrebbe stampato le righe dispari.
+@end itemize
+
+@node Due regole
+@section Un esempio che usa due regole
+@cindex programmi @command{awk}
+
+Il programma @command{awk} legge il file in input una riga alla volta.
+Per ogni riga @command{awk} controlla la corrispondenza con ogni regola.
+Se viene trovata pi@`u di una corrispondenza, vengono eseguite altrettante
+azioni, nell'ordine in cui appaiono nel programma @command{awk}.
+Se non viene trovata nessuna corrispondenza, non viene eseguita alcuna azione.
+
+Dopo aver elaborato tutte le regole che hanno corrispondenza con la riga (e
+pu@'o darsi che nessuna corrisponda), @command{awk} legge la riga successiva.  Comunque
+@pxref{Istruzione next},
+@ifdocbook
+e @ref{Istruzione Nextfile}.)
+@end ifdocbook
+@ifnotdocbook
+e anche @pxref{Istruzione nextfile}.)
+@end ifnotdocbook
+Si prosegue cos@`{@dotless{i}} finch@'e il programma raggiunge la fine del file.
+Per esempio, il seguente programma @command{awk} contiene due regole:
+
+@example
+/12/  @{ print $0 @}
+/21/  @{ print $0 @}
+@end example
+
+@noindent
+La prima regola ha la stringa @samp{12} da cercare e
+@samp{print $0} come
+azione.  La seconda regola ha la
+stringa @samp{21} da cercare e ha ancora @samp{print $0} come azione.
+L'azione di ciascuna regola @`e racchiusa in una coppia di parentesi graffe.
+
+Questo programma stampa ogni riga che contiene la stringa
+@samp{12} @emph{oppure} la stringa @samp{21}.  Se una riga contiene entrambe
+le stringhe, @`e stampata due volte, una volta per ogni regola.
+
+Questo @`e ci@`o che capita se eseguiamo questo programma sui nostri @value{DF},
+@file{mail-list} e @file{inventory-shipped}:
+
+@example
+$ @kbd{awk '/12/ @{ print $0 @}}
+>      @kbd{/21/ @{ print $0 @}' mail-list inventory-shipped}
+@print{} Anthony      555-3412     anthony.asserturo@@hotmail.com   A
+@print{} Camilla      555-2912     camilla.infusarum@@skynet.be     R
+@print{} Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@print{} Jan  21  36  64 620
+@print{} Apr  21  70  74 514
+@end example
+
+@noindent
+Si noti che la riga che inizia con @samp{Jean-Paul}
+nel file @file{mail-list}
+@`e stata stampata due volte, una volta per ogni regola.
+
+@node Maggiore sofisticazione
+@section Un esempio pi@`u complesso
+
+Dopo aver imparato a eseguire alcuni semplici compiti, vediamo cosa possono
+fare i tipici programmi @command{awk}.
+Questo esempio mostra come @command{awk} pu@`o essere usato per riassumere,
+selezionare e riordinare l'output di un altro comando.  Sono usate
+funzionalit@`a di cui non si @`e ancora parlato, quindi non ci si deve preoccupare
+se alcuni dettagli risulteranno oscuri:
+
+@example
+ls -l | awk '$6 == "Nov" @{ somma += $5 @}
+             END @{ print somma @}'
+@end example
+
+@cindex comando @command{ls}
+Questo comando stampa il numero totale di byte in tutti i file contenuti
+nella directory corrente, la cui data di modifica @`e novembre (di qualsiasi
+anno).  La parte @w{@samp{ls -l}} dell'esempio @`e un comando di sistema che
+fornisce un elenco dei file in una directory, con anche la dimensione di
+ogni file e la data di ultima modifica.  Il suo output @`e del tipo:
+
+@example
+-rw-r--r--  1 arnold   user   1933 Nov  7 13:05 Makefile
+-rw-r--r--  1 arnold   user  10809 Nov  7 13:03 awk.h
+-rw-r--r--  1 arnold   user    983 Apr 13 12:14 awk.tab.h
+-rw-r--r--  1 arnold   user  31869 Jun 15 12:20 awkgram.y
+-rw-r--r--  1 arnold   user  22414 Nov  7 13:03 awk1.c
+-rw-r--r--  1 arnold   user  37455 Nov  7 13:03 awk2.c
+-rw-r--r--  1 arnold   user  27511 Dec  9 13:07 awk3.c
+-rw-r--r--  1 arnold   user   7989 Nov  7 13:03 awk4.c
+@end example
+
+@noindent
+@cindex continuazione di riga, nella C shell
+Il primo campo contiene le autorizzazioni di lettura/scrittura [r/w], il
+secondo il numero dei collegamenti al file [cio@`e il numero di nomi con cui
+il file @`e conosciuto], e il terzo campo identifica il proprietario del file.
+Il quarto campo identifica il gruppo a cui appartiene il file.
+Il quinto campo contiene la dimensione del file, in byte.
+Il sesto, settimo e ottavo campo contengono il mese, il giorno e l'ora,
+rispettivamente, in cui il file @`e stato modificato.  Infine, il nono campo
+contiene il @value{FN}.
+
+@c @cindex automatic initialization
+@cindex inizializzazione automatica
+L'espressione @samp{$6 == "Nov"} nel nostro programma @command{awk} controlla
+se il sesto campo dell'output di @w{@samp{ls -l}} corrisponda alla stringa
+@samp{Nov}.  Ogni volta che una riga ha la stringa
+@samp{Nov} come suo sesto campo, @command{awk} esegue l'azione
+@samp{somma += $5}.  Questo aggiunge il quinto campo (la dimensione del file)
+alla variabile @code{somma}.  Come risultato, quando @command{awk} ha finito
+di leggere tutte le righe in input, @code{somma} contiene la somma totale
+delle dimensioni dei file che corrispondono al criterio di ricerca.
+(Ci@`o funziona contando sul fatto che le variabili @command{awk} sono
+automaticamente inizializzate a zero.)
+
+Dopo che l'ultima riga dell'output di @command{ls} @`e stata elaborata, la
+regola @code{END} viene eseguita e viene stampato il valore di @code{somma}.
+In questo esempio, il valore di @code{somma} @`e 80600.
+
+Queste tecniche pi@`u avanzate di @command{awk} sono trattate in
+@value{SECTIONS}
+successive (@pxref{Panoramica sulle azioni}).  Prima di poter passare a una
+programmazione pi@`u avanzata con @command{awk}, @`e necessario sapere come
+@command{awk} interpreta i file in input e visualizza quelli in output.
+Modificando campi e usando l'istruzione @code{print} @`e possibile produrre
+dei rapporti molto utili ed esteticamente gradevoli.
+
+@node Istruzioni/Righe
+@section Istruzioni e righe in @command{awk}
+@cindex interruzioni di riga
+@cindex andare a capo
+
+Molto spesso, ogni riga di un programma @command{awk} @`e un'istruzione a s@'e
+stante o una regola isolata, come:
+
+@example
+awk '/12/  @{ print $0 @}
+     /21/  @{ print $0 @}' mail-list inventory-shipped
+@end example
+
+@cindex @command{gawk}, andare a capo
+Comunque, @command{gawk} ignora i ritorni a capo dopo ognuno di questi
+simboli e istruzioni:
+
+@example
+,    @{    ?    :    ||    &&    do    else
+@end example
+
+@noindent
+Un ritorno a capo in ogni altro punto del programma @`e considerato come la
+fine di un'istruzione.@footnote{Il @samp{?} e i @samp{:} elencati sopra sono
+usati nell'espressione condizionale in tre parti descritta in
+@ref{Espressioni condizionali}.
+Il cambio di riga dopo @samp{?} e i @samp{:} @`e un'estensione minore in
+@command{gawk}; specificando @option{--posix} come opzione
+(@pxref{Opzioni}), quest'estensione non @`e valida.}
+
+@cindex @code{\} (barra inversa), continuazione di riga e
+@cindex barra inversa (@code{\}), continuazione di riga e
+Volendo dividere una sola istruzione su due righe in un punto in cui
+andando a capo sarebbe considerata conclusa, @`e possibile @dfn{continuare}
+nella riga successiva terminando la prima riga con un carattere di
+barra inversa (@samp{\}).  La barra inversa dev'essere l'ultimo carattere
+sulla riga, per essere riconosciuto come un carattere di continuazione.
+Una barra inversa @`e consentita in ogni parte dell'istruzione, anche in mezzo
+a una stringa o a un'espressione regolare.  Per esempio:
+
+@example
+awk '/Questa espressione regolare @`e troppo lunga, quindi\
+ la continuiamo sulla riga seguente/ @{ print $1 @}'
+@end example
+
+@noindent
+@cindex portabilit@`a, continuazione di riga con barra inversa e
+Non abbiamo quasi mai usato la continuazione tramite barra inversa nei nostri
+programmi di esempio.  @command{gawk} non pone limiti alla lunghezza di
+una riga, quindi la continuazione tramite barra inversa non @`e mai strettamente
+necessaria; serve soltanto a migliorare la leggibilit@`a del programma.
+Per la stessa ragione, ma anche per amore di chiarezza, abbiamo tenuto
+concise molte istruzioni nei programmi presentati in questo @value{DOCUMENT}.
+La continuazione tramite barra inversa @`e molto utile quando il proprio
+programma @command{awk} si trova in un file sorgente separato, invece di
+essere immesso nella riga di comando.  Si noti anche che molte implementazioni
+di @command{awk} presentano delle differenze su dove @`e possibile usare
+la continuazione tramite barra inversa.  Per esempio, potrebbero non
+consentire di spezzare una costante di tipo stringa usando la continuazione
+tramite barra inversa.  Quindi, per ottenere la massima portabilit@`a dei
+propri programmi @command{awk}, @`e meglio non spezzare le righe nel
+mezzo di un'espressione regolare o di una stringa.
+@c 10/2000: gawk, mawk, and current bell labs awk allow it,
+@c solaris 2.7 nawk does not. Solaris /usr/xpg4/bin/awk does though!  sigh.
+
+@cindex comando @command{csh}
+@cindex barra inversa (@code{\}), continuazione di riga e, in @command{csh}
+@cindex @code{\} (barra inversa), continuazione di riga e, in @command{csh}
+@quotation ATTENZIONE
+@emph{la continuazione tramite barra inversa non funziona come sopra descritto
+nella C shell.}  Funziona per programmi @command{awk} contenuti in file e
+per programmi sulla riga di comando, @emph{ammesso} che si stia usando una
+shell conforme a POSIX, come la Unix Bourne shell o Bash.  Ma la C shell si
+comporta in maniera diversa!  In quel caso, occorre usare due barre inverse
+consecutive, in fondo alla riga.  Si noti anche che quando si usa la C shell
+@emph{ogni} andata a capo nel vostro programma @command{awk} deve essere
+indicata con una barra inversa. Per esempio:
+
+@example
+% @kbd{awk 'BEGIN @{ \}
+? @kbd{  print \\}
+? @kbd{      "ciao, mondo" \}
+? @kbd{@}'}
+@print{} ciao, mondo
+@end example
+
+@noindent
+Qui, il @samp{%} e il @samp{?} sono i prompt primario e secondario della
+C shell, analogamente a quelli usati nella shell standard @samp{$} e @samp{>}.
+
+Si confronti l'esempio precedente, come viene scritto in una shell conforme
+a POSIX:
+
+@example
+$ @kbd{awk 'BEGIN @{}
+>   @kbd{print \}
+>       @kbd{"ciao, mondo"}
+> @kbd{@}'}
+@print{} ciao, mondo
+@end example
+@end quotation
+
+@command{awk} @`e un linguaggio orientato alla riga.  L'azione relativa a ogni
+regola deve iniziare sulla stessa riga del criterio di selezione.  Per avere
+criterio di selezione e azione su righe separate, si
+@emph{deve} usare la continuazione tramite barra inversa; non si pu@`o fare
+diversamente.
+
+@cindex barra inversa (@code{\}), continuazione di riga, commenti e
+@cindex @code{\} (barra inversa), continuazione di riga, commenti e
+@cindex commenti, continuazione di riga con barra inversa e i
+Un'altra cosa da tener presente @`e che la continuazione tramite barra inversa e
+i commenti non possono essere frammisti.  Non appena @command{awk} incontra
+un @samp{#} che inizia un commento, ignora @emph{tutto} il resto della riga.
+Per esempio:
+
+@example
+@group
+$ @kbd{gawk 'BEGIN @{ print "Non allarmarti" # una amichevole \}
+> @kbd{               regola BEGIN}
+> @kbd{@}'}
+@error{} gawk: riga com.:2:              regola BEGIN
+@error{} gawk: riga com.:2:                     ^ syntax error
+@end group
+@end example
+
+@noindent
+In questo caso, parrebbe che la barra inversa continui il commento sulla riga
+successiva.  Invece, la combinazione barra inversa-ritorno a capo non viene
+per nulla notata, in quanto ``nascosta'' all'interno del commento.  Quindi,
+il @code{BEGIN} @`e marcato come errore di sintassi.
+
+@cindex istruzioni multiple
+@cindex @code{;} (punto e virgola), separare istruzioni nelle azioni
+@cindex punto e virgola (@code{;}), separare istruzioni nelle azioni
+@cindex @code{;} (punto e virgola), separare regole
+@cindex punto e virgola (@code{;}), separare regole
+Quando le istruzioni @command{awk} all'interno di una regola sono brevi, si
+potrebbe metterne pi@`u d'una su una riga sola.  Ci@`o @`e possibile separando le
+istruzioni con un punto e virgola (@samp{;}).
+Questo vale anche per le regole stesse.
+Quindi, il programma visto all'inizio di
+@ifnotinfo
+questa
+@end ifnotinfo
+@ifinfo
+questo
+@end ifinfo
+@value{SECTION}
+poteva essere scritto anche cos@`{@dotless{i}}:
+
+@example
+/12/ @{ print $0 @} ; /21/ @{ print $0 @}
+@end example
+
+@quotation NOTA BENE
+La possibilit@`a che pi@`u regole coesistano sulla stessa riga, se sono separate
+da un punto e virgola, non esisteva nel linguaggio @command{awk} originale;
+@`e stata aggiunta per congruenza con quanto @`e consentito per le istruzioni
+all'interno di un'azione.
+@end quotation
+
+@node Altre funzionalit@`a
+@section Altre funzionalit@`a di @command{awk}
+
+@cindex variabili
+Il linguaggio @command{awk} mette a disposizione un numero di variabili
+@dfn{built-in}, o @dfn{predefinite}, che il programma dell'utente pu@`o usare
+per ottenere informazioni da @command{awk}.  Ci sono pure altre variabili
+che il programma pu@`o impostare, per definire come @command{awk} deve
+gestire i dati.
+
+Inoltre, @command{awk} mette a disposizione parecchie funzioni predefinite
+[@dfn{built-in}] per effettuare calcoli di tipo comune e operazioni che
+agiscono sulle stringhe di caratteri.
+@command{gawk} mette a disposizione funzioni predefinite per gestire le
+marcature temporali, per effettuare manipolazioni a livello di bit, per
+tradurre stringhe al momento dell'esecuzione del programma
+(internazionalizzazione), per determinare qual @`e il tipo di una variabile,
+e per ordinare dei vettori.
+
+Nel seguito della presentazione del linguaggio @command{awk}, saranno
+introdotte molte delle variabili e parecchie funzioni.  Esse sono
+descritte sistematicamente in @ref{Variabili predefinite} e in
+@ref{Funzioni}.
+
+@node Quando
+@section Quando usare @command{gawk}
+
+@cindex @command{awk}, uso di
+Ora che abbiamo visto qualcosa di quel che @command{awk} @`e in grado di fare,
+ci si potr@`a chiedere come @command{awk} potrebbe tornare utile.  Usando
+programmi di utilit@`a, criteri di ricerca sofisticati, separatori
+di campo, istruzioni aritmetiche, e altri criteri di selezione, @`e possibile
+produrre degli output molto pi@`u complessi.  Il linguaggio @command{awk} @`e
+molto utile per fornire dei tabulati partendo da grandi quantit@`a di dati
+grezzi, per esempio riassumendo informazioni dall'output di altri
+programmi di utilit@`a come @command{ls}.
+(@xref{Maggiore sofisticazione}.)
+
+I programmi scritti con @command{awk} sono normalmente molto pi@`u
+corti dei loro equivalenti in altri linguaggi.  Ci@`o rende i programmi
+@command{awk} facili da comporre e da utilizzare.  Spesso i programmi
+@command{awk} possono essere scritti al volo a terminale, usati una volta sola
+e buttati via.  Poich@'e i programmi @command{awk} sono interpretati, si pu@`o
+evitare la (normalmente laboriosa) parte di compilazione nel ciclo tipico
+dello sviluppo software, ossia edita-compila-prova-correggi.
+
+@cindex Brian Kernighan, @command{awk} di
+In @command{awk} sono stati scritti programmi complessi, compreso un assembler
+completo, pluri-piattaforma per
+@ifclear FOR_PRINT
+@iftex
+microprocessori a 8-bit (@pxrefil{Glossario}, per maggiori informazioni),
+@end iftex
+@ifnottex
+microprocessori a 8-bit (@pxref{Glossario}, per maggiori informazioni),
+@end ifnottex
+@end ifclear
+@ifset FOR_PRINT
+microprocessori a 8-bit,
+@end ifset
+e un assembler di microcodice per un computer dedicato esclusivamente
+al linguaggio Prolog.
+Le possibilit@`a dell'originale @command{awk} erano messe a dura prova
+da programmi di questa complessit@`a, ma le versioni moderne sono pi@`u robuste.
+
+@cindex programmi @command{awk}, complessi
+Se capita di scrivere programmi @command{awk} pi@`u lunghi di, diciamo,
+qualche centinaio di righe, si potrebbe considerare la possibilit@`a di usare
+un linguaggio di programmazione differente da @command{awk}.
+La shell consente di ricercare stringhe ed espressioni regolari; inoltre
+consente di usare in maniera efficace i comandi di utilit@`a del sistema.
+Python offre un piacevole equilibrio tra la facilit@`a di una programmazione
+ad alto livello, e la possibilit@`a di interagire a livello di sistema
+operativo.@footnote{Altri linguaggi di @dfn{script} popolari comprendono Ruby
+e Perl.}
+
+@node Sommario dell'introduzione
+@section Sommario
+
+@c FIXME: Review this chapter for summary of builtin functions called.
+@itemize @value{BULLET}
+@item
+I programmi in @command{awk} consistono di coppie di
+@var{criterio di ricerca}--@var{azione}.
+
+@item
+Un'@var{azione} senza una @var{condizione di ricerca} viene sempre eseguita.
+L'@var{azione} di default per una condizione mancante @`e @samp{@{ print $0 @}}.
+
+@item
+Usare
+@samp{awk '@var{programma}' @var{file}}
+oppure
+@samp{awk -f @var{file-programma} @var{file}}
+per eseguire @command{awk}.
+
+@item
+Si pu@`o usare la notazione speciale @samp{#!} nella prima riga per creare
+programmi @command{awk} che siano eseguibili direttamente.
+
+@item
+I commenti nei programmi @command{awk} iniziano con @samp{#} e continuano
+fino alla fine della stessa riga.
+
+@item
+Prestare attenzione ai problemi con gli apici nei programmi @command{awk}
+che facciano parte di uno @dfn{script} della shell (o di un file .BAT di
+MS-Windows).
+
+@item
+Si pu@`o usare la continuazione tramite barra inversa per continuare righe di
+codice sorgente.  Le righe sono continuate automaticamente dopo i simboli
+virgola, parentesi aperta, punto interrogativo, punto e virgola,
+@samp{||}, @samp{&&}, @code{do} ed  @code{else}.
+@end itemize
+@node Invocare Gawk
+@chapter Eseguire @command{awk} e @command{gawk}
+
+Questo @value{CHAPTER} tratta di come eseguire @command{awk}, delle opzioni da
+riga di comando, sia quelle dello standard POSIX che quelle specifiche di
+@command{gawk}, e di cosa fanno @command{awk} e @command{gawk} con gli
+argomenti che non sono opzioni.
+Prosegue poi spiegando come @command{gawk} cerca i file sorgenti,
+leggendo lo standard input assieme ad altri file, le variabili d'ambiente di
+@command{gawk}, il codice di ritorno di @command{gawk}, l'uso dei file
+inclusi, e opzioni e/o funzionalit@`a obsolete e non documentate.
+
+Molte delle opzioni e funzionalit@`a qui descritte sono trattate con
+maggior dettaglio nei capitoli successivi del @value{DOCUMENT}; gli argomenti
+presenti in questo @value{CHAPTER} che al momento non interessano si possono
+tranquillamente saltare.
+
+@menu
+* Riga di comando::             Come eseguire @command{awk}.
+* Opzioni::                     Opzioni sulla riga di comando e loro
+                                significato.
+* Altri argomenti::             Nomi dei file in input e assegnamento di
+                                valori a variabili.
+* Specificare lo standard input:: Come specificare lo standard input insieme ad
+                                altri file.
+* Variabili d'ambiente::        Le variabili d'ambiente usate da
+                                @command{gawk}.
+* Codice di ritorno::           Il codice di ritorno all'uscita da
+                                @command{gawk}.
+* Includere file::              Come includere altri file nel proprio
+                                programma.
+* Caricare librerie condivise:: Caricare librerie condivise nel
+                                proprio programma.
+* Parti obsolete::              Opzioni e/o funzionalit@`a obsolete.
+* Non documentato::             Opzioni e funzionalit@`a non documentate.
+* Sommario invocazione::        Sommario invocazione.
+@end menu
+
+@node Riga di comando
+@section Come eseguire @command{awk}
+@cindex riga di comando, eseguire @command{awk} da
+@cindex @command{awk}, eseguire
+@cindex argomenti, riga di comando, eseguire @command{awk}
+@cindex opzioni sulla riga di comando, eseguire @command{awk}
+
+Ci sono due modi di eseguire @command{awk}: con un programma esplicito o con
+uno o pi@`u file di programma.  Qui @`e mostrata la sintassi di entrambi; le voci
+racchiuse tra [@dots{}] sono opzionali:
+
+@display
+@command{awk} [@var{opzioni}] @option{-f} @var{file_di _programma} [@option{--}] @var{file} @dots{}
+@command{awk} [@var{opzioni}] [@option{--}] @code{'@var{programma}'} @var{file} @dots{}
+@end display
+
+@cindex GNU, opzioni estese
+@cindex estese, opzioni
+@cindex opzioni estese
+In aggiunta alle tradizionali opzioni di una sola lettera in stile POSIX,
+@command{gawk} consente anche le opzioni estese GNU.
+
+@cindex angolo buio, invocare @command{awk}
+@cindex @dfn{lint}, controlli con programma vuoto
+@`E possibile invocare @command{awk} con un programma vuoto:
+
+@example
+awk '' file_dati_1 file_dati_2
+@end example
+
+@cindex @option{--lint}, opzione
+@cindex angolo buio, programmi vuoti
+@noindent
+Fare cos@`{@dotless{i}} ha comunque poco senso; @command{awk} termina
+silenziosamente quando viene fornito un programma vuoto.
+@value{DARKCORNER}
+Se @`e stato specificato @option{--lint} sulla riga di comando,
+@command{gawk} emette un avviso che avverte
+che il programma @`e vuoto.
+
+@node Opzioni
+@section Opzioni sulla riga di comando
+@cindex opzioni sulla riga di comando
+@cindex riga di comando, opzioni
+@cindex GNU, opzioni estese
+@cindex opzioni estese
+
+Le opzioni sono precedute da un trattino e consistono in un unico carattere.
+Le opzioni estese in stile GNU sono precedute da un doppio trattino e
+consistono in una parola
+chiave.  La parola chiave pu@`o essere abbreviata, a condizione che
+l'abbreviazione identifichi univocamente l'opzione.  Se l'opzione prevede un
+argomento, la parola chiave @`e immediatamente seguita da un segno di uguale
+(@samp{=}) e dal valore dell'argomento, oppure la parola chiave e il valore
+dell'argomento sono separati da spazi.
+Se un'opzione con un valore viene immessa pi@`u di una volta,
+l'ultimo valore @`e quello che conta.
+
+@cindex POSIX @command{awk}, opzioni estese GNU e
+Ogni opzione estesa di @command{gawk} ha una corrispondente opzione
+breve in stile POSIX.
+Le opzioni estese e brevi sono
+intercambiabili in tutti i contesti.
+L'elenco seguente descrive le opzioni richieste dallo standard POSIX:
+
+@table @code
+@item -F @var{fs}
+@itemx --field-separator @var{fs}
+@cindex @option{-F}, opzione
+@cindex @option{--field-separator}, opzione
+@cindex @code{FS}, variabile, l'opzione @code{--field-separator} e
+Imposta la variabile @code{FS} a @var{fs}
+(@pxref{Separatori di campo}).
+
+@item -f @var{file-sorgente}
+@itemx --file @var{file-sorgente}
+@cindex @option{-f}, opzione
+@cindex @option{--file}, opzione
+@cindex @command{awk}, programmi, collocazione dei
+Legge il sorgente del programma @command{awk} da @var{file-sorgente}
+anzich@'e prenderlo dal primo argomento che non @`e un'opzione.
+Quest'opzione pu@`o essere data pi@`u volte; il programma @command{awk}
+@`e formato dalla concatenazione del contenuto di ogni
+@var{file-sorgente} specificato.
+
+I file specificati dall'opzione @option{-f} sono considerati
+appartenere allo spazio-dei-nomi @samp{"awk" (@@namespace "awk")}
+a inizio programma. @xref{Cambiare lo spazio-dei-nomi}, per ulteriori
+informazioni.
+
+@item -v @var{var}=@var{val}
+@itemx --assign @var{var}=@var{val}
+@cindex @option{-v}, opzione
+@cindex @option{--assign}, opzione
+@cindex variabili, impostazione
+Imposta la variabile @var{var} al valore @var{val} @emph{prima} che inizi
+l'esecuzione del programma.  Tali valori di variabile sono disponibili
+all'interno della regola @code{BEGIN}
+(@pxref{Altri argomenti}).
+
+L'opzione @option{-v} pu@`o impostare una sola variabile per volta, ma pu@`o
+essere usata pi@`u di una volta, impostando ogni volta una variabile
+differente, in questo modo:
+@samp{awk @w{-v pippo=1} @w{-v pluto=2} @dots{}}.
+
+@cindex predefinite, variabili, opzione @code{-v}@comma{} impostare con
+@cindex variabili predefinite, impostare con opzione @code{-v}
+@quotation ATTENZIONE
+Usare @option{-v} per impostare valori di variabili predefinite
+pu@`o condurre a risultati sorprendenti.  @command{awk} reimposter@`a i
+valori di quelle variabili secondo le sue necessit@`a, anche ignorando
+eventuali valori iniziali che possono essere stati assegnati.
+@end quotation
+
+@item -W @var{gawk-opt}
+@cindex @option{-W}, opzione
+Fornisce un'opzione specifica dell'implementazione.  Questa @`e la convenzione
+POSIX per fornire opzioni specifiche dell'implementazione.
+Queste opzioni
+hanno anche una corrispondente opzione estesa scritta in stile GNU.
+Si noti che le opzioni estese possono essere abbreviate, sempre che
+le abbreviazioni siano univoche.
+L'elenco completo delle opzioni specifiche di @command{gawk} @`e riportato di
+seguito.
+
+@item --
+@cindex riga di comando, opzioni, fine delle
+@cindex opzioni sulla riga di comando, fine delle
+Segnale della fine delle opzioni da riga di comando.  I seguenti argomenti
+non sono trattati come opzioni anche se iniziano con @samp{-}.  Questa
+interpretazione di @option{--} segue le convenzioni POSIX per l'analisi degli
+argomenti.
+
+@cindex @code{-} (meno), nomi di file che iniziano con
+@cindex meno (@code{-}), nomi di file che iniziano con
+@`E utile se si hanno @value{FNS} che iniziano con @samp{-},
+o negli @dfn{script} di shell, se si hanno @value{FNS} che devono essere
+specificati dall'utente che potrebbero iniziare con @samp{-}.
+@`E utile anche per passare opzioni al programma @command{awk};
+si veda @ref{Funzione getopt}.
+@end table
+
+L'elenco che segue descrive le opzioni specifiche di @command{gawk}:
+
+@c Have to use @asis here to get docbook to come out right.
+@table @asis
+@item @option{-b}
+@itemx @option{--characters-as-bytes}
+@cindex @option{-b}, opzione
+@cindex @option{--characters-as-bytes}, opzione
+Fa s@`{@dotless{i}} che @command{gawk} tratti tutti i dati in input come caratteri di un solo
+byte.  In aggiunta, tutto l'output scritto con @code{print} o @code{printf}
+viene trattato come composto da caratteri contenuti in un solo byte.
+
+Normalmente, @command{gawk} segue lo standard POSIX e cerca di elaborare i suoi
+dati di input in accordo con la localizzazione corrente
+(@pxref{Localizzazioni}).
+Questo spesso pu@`o comportare la conversione di caratteri multibyte in
+caratteri estesi (internamente), e pu@`o
+creare problemi o confusione se i dati di input non contengono caratteri
+multibyte validi. Quest'opzione @`e una maniera facile di dire a @command{gawk}:
+``Gi@`u le mani dai miei dati!''.
+
+@item @option{-c}
+@itemx @option{--traditional}
+@cindex @option{-c}, opzione
+@cindex @option{--traditional}, opzione
+@cindex modalit@`a compatibile di (@command{gawk}), specificare
+Specifica la @dfn{modalit@`a di compatibilit@`a}, nella quale le estensioni GNU al
+linguaggio @command{awk} sono disabilitate; in questo modo @command{gawk} si
+comporta proprio come la versione di BWK @command{awk}.
+
+@xref{POSIX/GNU},
+che riassume le estensioni.
+@ifclear FOR_PRINT
+Si veda anche
+@ref{Modalit@`a di compatibilit@`a}.
+@end ifclear
+
+@item @option{-C}
+@itemx @option{--copyright}
+@cindex @option{-C}, opzione
+@cindex @option{--copyright}, opzione
+@cindex GPL (General Public License), stampare
+Stampa la versione ridotta della General Public License ed esce.
+
+@item @option{-d}[@var{file}]
+@itemx @option{--dump-variables}[@code{=}@var{file}]
+@cindex @option{-d}, opzione
+@cindex @option{--dump-variables}, opzione
+@cindex fornire una lista di tutte le variabili del programma
+@cindex @file{awkvars.out}, file
+@cindex file @file{awkvars.out}
+@cindex variabili globali, stampare una lista delle
+Stampa una lista ordinata di variabili globali, i loro tipi, e i valori finali
+in @var{file}.  Se non viene fornito alcun @var{file}, stampa questa lista
+in un file chiamato @file{awkvars.out} nella directory corrente.
+Non sono consentiti spazi tra @option{-d} e @var{file}, se
+@var{file} viene specificato.
+
+@cindex risoluzione di problemi, refusi@comma{} variabili globali
+@cindex problemi, risoluzione di, refusi@comma{} variabili globali
+Avere una lista di tutte le variabili globali @`e un buon modo per cercare
+refusi nei propri programmi.
+Si pu@`o usare quest'opzione anche se si ha un grosso programma con tantissime
+funzioni, e si vuol essere sicuri che le funzioni non usino
+inavvertitamente variabili globali che sarebbero dovute essere locali
+(questo @`e un errore particolarmente facile da fare con nomi di variabile
+semplici come @code{i}, @code{j}, etc.).
+
+@item @option{-D}[@var{file}]
+@itemx @option{--debug}[@code{=}@var{file}]
+@cindex @option{-D}, opzione
+@cindex @option{--debug}, opzione
+@cindex @command{awk}, debug, abilitare
+Abilita l'esecuzione del debug di programmi @command{awk}
+(@pxref{Debugging}).
+Per default, il debugger legge i comandi interattivamente dalla tastiera
+(standard input).
+L'argomento opzionale @var{file} consente di specificare un file con una lista
+di comandi per il debugger da eseguire in maniera non interattiva.
+Non sono consentiti spazi tra @option{-D} e @var{file}, se
+@var{file} viene indicato.
+
+@item @option{-e} @var{testo-del-programma}
+@itemx @option{--source} @var{testo-del-programma}
+@cindex @option{-e}, opzione
+@cindex @option{--source}, opzione
+@cindex codice sorgente, combinare
+Fornisce del codice sorgente nel @var{testo-del-programma}.
+Quest'opzione consente di combinare il codice sorgente contenuto in file
+col codice sorgente immesso sulla riga di comando.
+Questo @`e particolarmente utile quando si hanno funzioni di libreria che si
+vogliono usare dai programmi da riga di comando
+(@pxref{AWKPATH (Variabile)}).
+
+Si noti che @command{gawk} elabora ogni stringa come se fosse terminata
+da un carattere di ritorno a capo (anche se non @`e questo il caso).
+Ci@`o facilita la costruzione del programma completo.
+
+@quotation ATTENZIONE
+Prima della @value{PVERSION} 5.0, non era necessario
+che ogni @var{testo-di-programma} costituisse
+un'unit@`a sintattica completa.  P.es., il codice che segue
+funzionava:
+
+@example
+$ @kbd{gawk -e 'BEGIN @{ a = 5 ;' -e 'print a @}'}
+@print{} 5
+@end example
+
+@noindent
+Comunque ci@`o non @`e pi@`u possibile.  Se c'@`e qualche @dfn{script}
+che utilizza tale possibilit@`a, @`e necessario modificarlo.
+
+Il motivo di ci@`o @`e che ogni @var{testo-di-programma} @`e considerato
+appartenere allo spazio di nomi @samp{"awk" (@@namespace "awk")}
+a inizio programma. @xref{Cambiare lo spazio-dei-nomi}, per ulteriori
+informazioni.
+@end quotation
+
+@item @option{-E} @var{file}
+@itemx @option{--exec} @var{file}
+@cindex @option{-E}, opzione
+@cindex @option{--exec}, opzione
+@cindex @command{awk}, programmi, collocazione dei
+@cindex CGI, @command{awk} @dfn{script} per
+Simile a @option{-f}, legge il testo del programma @command{awk} da
+@var{file}.  Ci sono due differenze rispetto a @option{-f}:
+
+@itemize @value{BULLET}
+@item
+Quest'opzione fa terminare l'elaborazione delle opzioni; qualsiasi
+altra cosa sulla riga di comando viene inoltrata direttamente al programma
+@command{awk}.
+
+@item
+Le variabili da riga di comando della forma
+@samp{@var{var}=@var{value}} non sono ammesse.
+@end itemize
+
+Quest'opzione @`e particolarmente necessaria per le applicazioni World Wide Web
+CGI che passano argomenti attraverso le URL; l'uso di quest'opzione impedisce
+a un utente malintenzionato (o ad altri) di passare opzioni, assegnamenti o
+codice sorgente @command{awk} (con @option{-e}) all'applicazione
+CGI.@footnote{Per maggiori dettagli,
+si veda la Sezione 4.4 di @uref{http://www.ietf.org/rfc/rfc3875,
+RFC 3875}. Si veda anche
+@uref{https://lists.gnu.org/archive/html/bug-gawk/2014-11/msg00022.html,
+note esplicative spedite alla mailing list @command{gawk} bug}.}
+Quest'opzione dovrebbe essere usata
+con @dfn{script} @samp{#!}
+(@pxref{@dfn{Script} eseguibili}), in questo modo:
+
+@example
+#! /usr/local/bin/gawk -E
+
+@var{il programma awk @`e qui @dots{}}
+@end example
+
+@item @option{-g}
+@itemx @option{--gen-pot}
+@cindex @option{-g}, opzione
+@cindex @option{--gen-pot}, opzione
+@cindex portabilit@`a, generare file oggetto
+@cindex file oggetto portabili, generare
+Analizza il programma sorgente e
+genera un file GNU @command{gettext} @dfn{portable object template} sullo
+standard output per tutte le costanti di tipo stringa che sono state marcate
+come da tradurre.
+@xref{Internazionalizzazione},
+per informazioni su quest'opzione.
+
+@item @option{-h}
+@itemx @option{--help}
+@cindex @option{-h}, opzione
+@cindex @option{--help}, opzione
+@cindex GNU, opzioni estese, stampare una lista di
+@cindex opzioni, stampare una lista di
+@cindex stampa, lista di opzioni
+Stampa un messaggio sull'``uso'' riassumendo le opzioni brevi ed estese
+accettate da @command{gawk} ed esce.
+
+@item @option{-i} @var{file-sorgente}
+@itemx @option{--include} @var{file-sorgente}
+@cindex @option{-i}, opzione
+@cindex @option{--include}, opzione
+@cindex @command{awk}, programmi, collocazione dei
+Legge una libreria di sorgenti @command{awk} da @var{file-sorgente}.
+Quest'opzione @`e del tutto equivalente a usare la direttiva @code{@@include}
+all'interno del proprio programma.  @`E molto simile all'opzione
+@option{-f}, ma ci sono due differenze importanti.  Primo, quando viene usata
+l'opzione @option{-i}, il sorgente del programma non viene caricato se @`e
+stato caricato in precedenza, mentre con @option{-f}, @command{gawk} carica
+sempre il file.  Secondo, poich@'e quest'opzione @`e pensata per essere usata
+con librerie di codice, @command{gawk} non riconosce tali file come
+costituenti l'input del programma principale.  Cos@`{@dotless{i}}, dopo l'elaborazione di
+un argomento @option{-i}, @command{gawk} si aspetta di trovare il codice
+sorgente principale attraverso l'opzione @option{-f} o sulla riga di comando.
+
+I file specificati dall'opzione @option{-i} sono considerati
+appartenere allo spazio-dei-nomi @samp{"awk" (@@namespace "awk")}
+a inizio programma. @xref{Cambiare lo spazio-dei-nomi}, per ulteriori
+informazioni.
+
+@item @option{-l} @var{ext}
+@itemx @option{--load} @var{ext}
+@cindex @option{-l}, opzione
+@cindex @option{--load}, opzione
+@cindex caricare estensioni
+Carica un'estensione dinamica denominata @var{ext}.  Le estensioni sono
+memorizzate come librerie condivise di sistema.
+Quest'opzione ricerca la libreria usando la variabile d'ambiente
+@env{AWKLIBPATH}.  Il suffisso corretto per la piattaforma in uso verr@`a
+fornito per default, perci@`o non @`e necessario specificarlo nel nome
+dell'estensione.  La routine di inizializzazione dell'estensione dovrebbe
+essere denominata @code{dl_load()}.  Un'alternativa @`e quella di usare la
+direttiva @code{@@load} all'interno del programma per caricare una libreria
+condivisa.  Questa funzionalit@`a avanzata @`e descritta in dettaglio in
+@ref{Estensioni dinamiche}.
+
+@item @option{-L}[@var{valore}]
+@itemx @option{--lint}[@code{=}@var{valore}]
+@cindex @option{-l}, opzione
+@cindex @option{--lint}, opzione
+@cindex @dfn{lint}, controlli, emissione di avvertimenti
+@cindex avvertimenti, emissione di
+Emette messaggi d'avvertimento relativi a costrutti dubbi o non portabili ad
+altre implementazioni di @command{awk}.
+Non sono consentiti spazi tra @option{-L} e @var{valore}, se
+viene indicato il @var{valore}.
+Alcuni avvertimenti vengono emessi quando @command{gawk} legge preliminarmente
+il programma.  Altri vengono emessi quando il programma viene eseguito.
+Con l'argomento opzionale @samp{fatal}, gli avvertimenti @dfn{lint} sono
+considerati come errori gravi.  Potrebbe essere una misura drastica, per@`o il
+suo uso incoragger@`a certamente lo sviluppo di programmi @command{awk} pi@`u
+corretti.  Con l'argomento opzionale @samp{invalid}, vengono emessi solo gli
+avvertimenti relativi a quello che @`e effettivamente non valido (funzionalit@`a
+non ancora completamente implementata).  Con un argomento opzionale di
+@samp{no-ext}, gli avvertimenti relativi alle estensioni @command{gawk} sono
+disabilitati.
+
+Alcuni avvertimenti vengono stampati solo una volta, anche se i costrutti dubbi
+per i quali vengono emessi avvisi ricorrono diverse volte nel programma
+@command{awk}.  Perci@`o, nell'eliminazione dei problemi rilevati da
+@option{--lint}, bisogna porre attenzione a cercare tutte le occorrenze di ogni
+costrutto inappropriato.  Siccome i programmi @command{awk} generalmente sono
+brevi, questa non @`e un'operazione gravosa.
+
+@item @option{-M}
+@itemx @option{--bignum}
+@cindex @option{-M}, opzione
+@cindex @option{--bignum}, opzione
+Chiede il calcolo con precisione arbitraria sui numeri.  Quest'opzione non ha
+alcun effetto se @command{gawk} non @`e compilato per l'uso delle librerie GNU
+MPFR e MP
+(@pxref{Calcolo con precisione arbitraria}).
+
+@item @option{-n}
+@itemx @option{--non-decimal-data}
+@cindex @option{-n}, opzione
+@cindex @option{--non-decimal-data}, opzione
+@cindex esadecimali@comma{} valori, abilitare l'interpretazione di
+@cindex ottali@comma{} valori, abilitare l'interpretazione di
+@cindex risoluzione di problemi, opzione @code{--non-decimal-data}
+Abilita l'interpretazione automatica di valori ottali ed esadecimali
+nei dati di input
+(@pxref{Dati non decimali}).
+
+@quotation ATTENZIONE
+Quest'opzione pu@`o generare gravi malfunzionamenti nei vecchi programmi.
+Usare con cautela.  Si noti anche che
+quest'opzione potrebbe non essere pi@`u disponibile in una futura versione di
+@command{gawk}.
+@end quotation
+
+@item @option{-N}
+@itemx @option{--use-lc-numeric}
+@cindex @option{-N}, opzione
+@cindex @option{--use-lc-numeric}, opzione
+Forza l'uso del carattere di separazione decimale della localizzazione
+quando analizza i dati in input
+(@pxref{Localizzazioni}).
+
+@cindex stampa elegante
+@item @option{-o}[@var{file}]
+@itemx @option{--pretty-print}[@code{=}@var{file}]
+@cindex @option{-o}, opzione
+@cindex @option{--pretty-print}, opzione
+Consente la stampa di una versione formattata elegantemente dei programmi
+@command{awk}.  Implica l'opzione @option{--no-optimize}.
+Per default il programma di output viene creato in un file
+chiamato @file{awkprof.out} (@pxref{Profilare}).
+L'argomento opzionale @var{file} consente di specificare un
+@value{FN} differente per l'output.
+Non sono consentiti spazi tra @option{-o} e @var{file}, se
+@var{file} viene indicato.
+
+@quotation NOTA
+Nel passato, quest'opzione eseguiva anche il programma.
+Ora non @`e pi@`u cos@`{@dotless{i}}.
+@end quotation
+
+@item @option{-O}
+@itemx @option{--optimize}
+@cindex @option{--optimize}, opzione
+@cindex @option{-O}, opzione
+Abilita le ottimizzazioni di default nella rappresentazione interna del
+programma.  Attualmente, questo comprende solo delle semplificazioni nell'uso
+di costanti.
+
+Quest'ottimizzazione @`e abilitata per default.
+Quest'opzione rimane disponibile per compatibilit@`a all'indietro.
+Tuttavia pu@`o essere usata per annullare l'effetto di una precedente
+opzione @option{-s} (si veda pi@`u sotto in questa lista).
+
+@item @option{-p}[@var{file}]
+@itemx @option{--profile}[@code{=}@var{file}]
+@cindex @option{-p}, opzione
+@cindex @option{--profile}, opzione
+@cindex @command{awk}, profilazione, abilitare la
+Abilita la creazione del profilo di esecuzione di programmi @command{awk}
+(@pxref{Profilare}).
+Implicitamente viene forzata l'opzione @option{--no-optimize}.
+Per default, i profili vengono creati in un file chiamato @file{awkprof.out}.
+L'argomento opzionale @var{file} consente di specificare un altro
+@value{FN} per il file del profilo.
+Non sono consentiti spazi tra @option{-p} e @var{file}, se
+viene indicato un @var{file}.
+
+Il profilo contiene il numero di esecuzioni di ogni istruzione sul margine
+sinistro e il conteggio delle chiamate di funzione per ogni funzione.
+
+@item @option{-P}
+@itemx @option{--posix}
+@cindex @option{-P}, opzione
+@cindex @option{--posix}, opzione
+@cindex POSIX, modalit@`a
+@cindex @command{gawk}, estensioni@comma{} disabilitare
+Opera in modalit@`a POSIX rigorosa.  Disabilita tutte le estensioni di
+@command{gawk} (proprio come @option{--traditional}) e
+disabilita tutte le estensioni non consentite da POSIX.
+
+@xref{Estensioni comuni}, per un sommario delle estensioni
+di @command{gawk} che sono disabilitate da quest'opzione.
+Inoltre,
+vengono applicate le seguenti
+restrizioni:
+
+@itemize @value{BULLET}
+
+@cindex ritorno a capo
+@cindex spazi vuoti, ritorno a capo invece che
+@item
+I ritorni a capo non sono consentiti dopo @samp{?} o @samp{:}
+(@pxref{Espressioni condizionali}).
+
+
+@cindex @code{FS}, variabile, carattere TAB come
+@cindex variabile @code{FS}, carattere TAB come
+@item
+Specificando @samp{-Ft} sulla riga di comando non si imposta il valore
+della variabile @code{FS} a un singolo carattere TAB
+(@pxref{Separatori di campo}).
+
+@cindex localizzazione, separatore decimale della
+@cindex separatore decimale, carattere, specifico della localizzazione
+@item
+Il carattere di separatore decimale della localizzazione @`e usato per analizzare
+i dati di input
+(@pxref{Localizzazioni}).
+@end itemize
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex @option{--traditional}, opzione, e opzione @code{--posix}
+@cindex @option{--posix}, opzione, e opzione @code{--traditional}
+Se si forniscono entrambe le opzioni @option{--traditional} e @option{--posix}
+sulla riga di comando, @option{--posix} ha la precedenza.  Se vengono fornite
+entrambe le opzioni @command{gawk} emette un avviso.
+
+@item @option{-r}
+@itemx @option{--re-interval}
+@cindex @option{-r}, opzione
+@cindex @option{--re-interval}, opzione
+@cindex espressioni regolari, espressioni di intervallo e
+Consente le espressioni di intervallo
+(@pxref{Operatori di espressioni regolari})
+nelle espressioni regolari.
+Questo @`e ora il comportamento di default di @command{gawk}.
+Tuttavia, quest'opzione rimane (sia per retrocompatibilit@`a
+che per l'uso in combinazione con @option{--traditional}).
+
+@item @option{-s}
+@itemx @option{--no-optimize}
+@cindex @option{--no-optimize}, opzione
+@cindex opzione @option{--no-optimize}
+@cindex @option{-s}, opzione,
+@cindex opzione @option{-s}
+Disabilita le opzioni di ottimizzazione di default di @command{gawk}
+effettuate sulla rappresentazione interna del programma.
+
+@item @option{-S}
+@itemx @option{--sandbox}
+@cindex @option{-S}, opzione
+@cindex @option{--sandbox}, opzione
+@cindex sandbox, modalit@`a
+@cindex prova, modalit@`a di
+@cindex @code{ARGV}, vettore
+@cindex vettore @code{ARGV}
+Disabilita la funzione @code{system()},
+la ridirezione dell'input con @code{getline},
+la ridirezione dell'output con @code{print} e @code{printf},
+e le estensioni dinamiche.
+Inoltre, non consente di aggiungere nomi di file ad @code{ARGV} che
+non siano gi@`a presenti all'inizio dell'esecuzione di @command{gawk}.
+@`E particolarmente utile quando si vogliono eseguire @dfn{script} @command{awk}
+da sorgenti dubbie e si vuol essere ricuri che gli @dfn{script} non abbiano
+accesso al sistema (oltre al @value{DF} di input specificato).
+
+@item @option{-t}
+@itemx @option{--lint-old}
+@cindex @option{-L}, opzione
+@cindex @option{--lint-old}, opzione
+Avvisa su costrutti che non sono disponibili nella versione originale di
+@command{awk} dalla versione 7 di Unix
+(@pxref{V7/SVR3.1}).
+
+@item @option{-V}
+@itemx @option{--version}
+@cindex @option{-V}, opzione
+@cindex @option{--version}, opzione
+@cindex @command{gawk}, versioni di, informazioni su@comma{} stampa
+Stampa informazioni sulla versione di questa specifica copia di @command{gawk}.
+Consente di determinare se la copia di @command{gawk} in uso @`e aggiornata
+rispetto a quello che @`e attualmente in distribuzione da parte della Free
+Software Foundation.
+@`E utile anche per la segnalazione di bug
+(@pxref{Bug}).
+@end table
+
+Ogni altra opzione, se @`e stato specificato il testo di un programma
+@`e contrassegnata come non valida con un messaggio di avvertimento,
+altrimenti @`e ignorata.
+
+@cindex @option{-F}, opzione, opzione @option{-Ft} imposta @code{FS} a TAB
+In modalit@`a di compatibilit@`a, come caso particolare, se il valore di @var{fs}
+fornito all'opzione @option{-F} @`e @samp{t}, @code{FS} @`e impostata al carattere
+TAB (@code{"\t"}).  Questo @`e vero solo per @option{--traditional} e non
+per @option{--posix}
+(@pxref{Separatori di campo}).
+
+@cindex @option{-f}, opzione, usi multipli
+L'opzione @option{-f} pu@`o essere usata pi@`u di una volta nella riga di comando.
+In questo caso, @command{awk} legge il sorgente del suo programma da tutti i
+file indicati, come se fossere concatenati assieme a formare un unico grande
+file.
+Questo @`e utile per creare librerie di funzioni di @command{awk}.  Queste
+funzioni possono venir scritte una volta e in seguito recuperate da una
+posizione standard, invece di doverle includere in ogni singolo programma.
+L'opzione @option{-i} @`e simile in questo senso.
+(Come indicato in
+@ref{Sintassi delle definizioni},
+i nomi di funzione devono essere univoci).
+
+Con @command{awk} standard, le funzioni di libreria si possono ancora usare,
+anche se il  programma @`e immesso dalla tastiera,
+specificando @samp{-f /dev/tty}.  Dopo aver scritto il programma,
+premere @kbd{Ctrl-d} (il carattere di fine file) per terminarlo.
+(Si potrebbe anche usare @samp{-f -} per leggere il sorgente del programma
+dallo standard input, ma poi non si potr@`a usare lo standard input come sorgente
+di dati).
+
+Siccome @`e scomodo usare il meccanismo di @command{awk} standard per combinare
+file sorgenti e programmi @command{awk} da riga di comando, @command{gawk}
+fornisce l'opzione @option{-e}.  Questo non richiede di evitare l'uso dello
+standard input per immettere codice sorgente; consente di combinare
+facilmente codice sorgente da riga di comando e da libreria
+(@pxref{AWKPATH (Variabile)}).
+Come per @option{-f}, le opzioni @option{-e} e @option{-i}
+si possono usare pi@`u volte nella riga di comando.
+
+@cindex @option{-e}, opzione
+Se non sono specificate le opzioni @option{-f} o @option{-e},
+@command{gawk} usa il primo argomento diverso da un'opzione,
+presente sulla riga di comando, come testo del codice sorgente
+del programma.  Gli argomenti sulla riga di comando che si trovano
+dopo il testo del programma sono inseriti nel vettore @code{ARGV};
+@command{awk} @emph{non} continua ad analizzare la riga di comando
+alla ricerca di ulteriori opzioni.
+
+@cindex @env{POSIXLY_CORRECT}, variabile d'ambiente
+@cindex @dfn{lint}, controlli, variabile d'ambiente @env{POSIXLY_CORRECT}
+@cindex POSIX, modalit@`a
+Se la variabile d'ambiente @env{POSIXLY_CORRECT} esiste,
+@command{gawk} si comporta in modalit@`a POSIX rigorosa, esattamente come se
+fosse stata fornita l'opzione @option{--posix}.
+Molti programi GNU cercano questa variabile d'ambiente per eliminare
+estensioni che confliggono con POSIX, ma @command{gawk} si comporta in modo
+diverso: sopprime tutte le estensioni, anche quelle che non confliggono con
+POSIX, e funziona rigorosamente in modalit@`a POSIX.
+Se viene fornita l'opzione @option{--lint} sulla riga di comando e
+@command{gawk} passa alla modalit@`a POSIX a causa di @env{POSIXLY_CORRECT},
+viene emesso un messaggio di avvertimento indicando che @`e attiva la
+modalit@`a POSIX.  Normalmente questa variabile si imposta nel file di avvio
+della shell a livello utente.
+Per una shell compatibile con Bourne (come Bash), queste righe andranno
+aggiunte nel file @file{.profile} della directory "home" dell'utente:
+
+@example
+POSIXLY_CORRECT=true
+export POSIXLY_CORRECT
+@end example
+
+@cindex @command{csh}, comando, variabile d'ambiente @env{POSIXLY_CORRECT}
+Per una shell compatibile con C,@footnote{Non raccomandato.}
+questa riga andr@`a aggiunta nel file @file{.login} nella directory "home"
+dell'utente:
+
+@example
+setenv POSIXLY_CORRECT true
+@end example
+
+@cindex portabilit@`a, variabile d'ambiente @env{POSIXLY_CORRECT}
+Avere @env{POSIXLY_CORRECT} impostata non @`e raccomandato per l'uso quotidiano,
+ma @`e utile per provare la portabilit@`a dei programmi su altri
+ambienti.
+
+@node Altri argomenti
+@section Altri argomenti della riga di comando
+@cindex riga di comando, argomenti
+@cindex argomenti, riga di comando
+
+Qualsiasi altro argomento sulla riga di comando @`e trattato normalmente come
+file in input da elaborare nell'ordine con cui @`e specificato. Comunque, un
+argomento che ha la forma @code{@var{var}=@var{valore}}, assegna
+il valore @var{valore} alla variabile @var{var}---non specifica affatto
+un file.  (Si veda @ref{Opzioni di assegnamento}.)  Nel seguente esempio,
+@var{count=1} @`e un assegnamento di variabile, non un @value{FN}:
+
+@example
+awk -f programma.awk file1 count=1 file2
+@end example
+
+@cindex @command{gawk}, variabile @code{ARGIND} in
+@cindex @code{ARGIND}, variabile, argomenti da riga di comando
+@cindex @code{ARGV}, vettore, indicizzare all'interno di
+@cindex @code{ARGC}/@code{ARGV}, variabili, argomenti da riga di comando
+Tutti gli argomenti da riga di comando sono resi disponibili al programma
+@command{awk} nel vettore @code{ARGV} (@pxref{Variabili predefinite}).  Opzioni da
+riga di comando e il testo del programma (se presente) sono esclusi da
+@code{ARGV}.  Tutti gli altri argomenti, compresi gli assegnamenti di
+variabile, sono inclusi.  Come ogni elemento di @code{ARGV} viene elaborato,
+@command{gawk} imposta @code{ARGIND} all'indice in @code{ARGV}
+dell'elemento corrente.
+
+@c FIXME: One day, move the ARGC and ARGV node closer to here.
+La modifica di @code{ARGC} e @code{ARGV} nel proprio programma @command{awk}
+consente di controllare come @command{awk} elabora i file in input; questo @`e
+descritto pi@`u dettagliatamente in @ref{ARGC e ARGV}.
+
+@cindex file in input, assegnamenti di variabile e
+@cindex assegnamenti di variabile e file in input
+La distinzione tra argomenti che sono @value{FN} e argomenti di assegnamento
+di variabili vien fatta quando @command{awk} deve aprire il successivo file di
+input.
+A quel punto dell'esecuzione, controlla la variabile @value{FN} per vedere se
+@`e piuttosto un assegnamento di variabile; se cos@`{@dotless{i}} @`e, @command{awk} imposta la
+variabile invece di leggere un file.
+
+Dunque, le variabili ricevono effettivamente i valori loro assegnati dopo che
+tutti i file precedentemente specificati sono stati letti.  In particolare, i
+valori delle variabili assegnati in questo modo @emph{non} sono disponibili
+all'interno di una regola @code{BEGIN}
+(@pxref{BEGIN/END}),
+poich@'e tali regole vengono eseguite prima che @command{awk} cominci a
+esaminare la lista degli argomenti.
+
+@cindex angolo buio, sequenze di protezione
+I valori delle variabili dati sulla riga di comando sono elaborati per
+rimuovere sequenze di protezione (@pxref{Sequenze di protezione}).
+@value{DARKCORNER}
+
+In alcune implementazioni di @command{awk} molto vecchie, quando un
+assegnamento di variabile capitava prima di un qualsiasi @value{FN},
+l'assegnamento avveniva @emph{prima} che fosse stata eseguita la regola
+@code{BEGIN}.  Il comportamento di @command{awk} era in questo modo
+ambiguo; alcuni assegnamenti da riga di comando erano disponibili
+all'interno della regola @code{BEGIN}, mentre altri no.  Sfortunatamente,
+alcune applicazioni finivano per essere dipendenti da questa
+``funzionalit@`a''.  Quando @command{awk} fu modificato per essere pi@`u
+coerente, fu aggiunta l'opzione @option{-v} a beneficio delle
+applicazioni che dipendevano dal vecchio comportamento.
+
+La funzionalit@`a dell'assegnamento di variabile @`e molto utile per assegnare
+valori a variabili come @code{RS}, @code{OFS}, e @code{ORS}, che controllano i
+formati di input e di output, prima di effettuare la scansione dei @value{DF}.
+@`E utile anche per effettuare passaggi multipli su un o stesso
+@value{DF}.  Per esempio:
+
+@cindex file, passaggi multipli su
+@example
+awk 'pass == 1  @{ @var{pass 1 stuff} @}
+     pass == 2  @{ @var{pass 2 stuff} @}' pass=1 mydata pass=2 mydata
+@end example
+
+Una volta disponibile la funzionalit@`a per assegnare una variabile, l'opzione
+@option{-F} per impostare il valore di @code{FS} non @`e pi@`u strettamente
+necessaria.  Rimane per compatibilit@`a all'indietro.
+
+@node Specificare lo standard input
+@section Come specificare lo standard input insieme ad altri file
+
+Capita spesso di voler leggere lo standard input assieme ad altri file.
+Per esempio, leggere un file, leggere lo standard input derivante da una
+@dfn{pipe}, e poi leggere un altro file.
+
+Il modo di indicare lo standard input, con tutte le versioni di @command{awk},
+@`e quello di usare un segno meno o trattino da solo, @samp{-}.  Per esempio:
+
+@example
+@var{qualche_comando} | awk -f ilmioprogramma.awk file1 - file2
+@end example
+
+@noindent
+In questo caso, @command{awk} legge prima @file{file1}, poi legge
+l'output di  @var{qualche_comando}, e infile legge
+@file{file2}.
+
+Si pu@`o anche usare @code{"-"} per indicare lo standard input quando si leggono
+i file con @code{getline} (@pxref{Getline file}).
+E si pu@`o perfino usare @code{"-"} con l'opzione @option{-f} per
+leggere il sorgente del programma dallo standard input
+(@pxref{Opzioni}).
+
+In aggiunta, @command{gawk} consente di specificare il
+@value{FN} speciale @file{/dev/stdin}, sia sulla riga di comando che
+quando si usa @code{getline}.
+Anche qualche altra versione di @command{awk} include questa funzionalit@`a,
+ma non @`e standard.
+(Alcuni sistemi operativi prevedono un file @file{/dev/stdin}
+nel filesystem; comunque, @command{gawk} elabora sempre
+questo @value{FN} per conto suo [ossia non importa se il sistema
+operativo rende disponibile il file o no].)
+
+@node Variabili d'ambiente
+@section Le variabili d'ambiente usate da @command{gawk}
+@cindex variabili d'ambiente usate da @command{gawk}
+
+Diverse variabili d'ambiente influiscono sul comportamento
+di @command{gawk}.
+
+@menu
+* AWKPATH (Variabile)::         Ricerca di programmi @command{awk}
+                                in una lista di directory.
+* AWKLIBPATH (Variabile)::      Ricerca di librerie condivise
+                                @command{awk} su varie directory.
+* Altre variabili d'ambiente::  Le variabili d'ambiente.
+@end menu
+
+@node AWKPATH (Variabile)
+@subsection Ricerca di programmi @command{awk} in una lista di directory.
+@cindex @env{AWKPATH}, variabile d'ambiente
+@cindex directory, ricerca di file sorgente
+@cindex percorso di ricerca per file sorgente
+@cindex ricerca, percorso di, per file sorgente
+@cindex differenze tra @command{awk} e @command{gawk}, variabile d'ambiente @env{AWKPATH}
+@ifinfo
+Il precedente @value{SECTION} ha descritto come i file di programma di
+@command{awk} possono essere specificati sulla riga di comando con
+l'opzione @option{-f}.
+@end ifinfo
+Nella maggior parte delle implementazioni di @command{awk} si deve indicare il
+percorso completo di ogni file di programma, a meno che il file non
+sia nella directory corrente.  Con @command{gawk}, invece, se la
+variabile @value{FN} impostata con le opzioni @option{-f} o @option{-i} non
+contiene un separatore di directory @samp{/}, @command{gawk} cerca un file con
+quel nome in un elenco di directory (chiamato @dfn{percorso di ricerca}),
+scorrendole una per una.
+
+Il percorso di ricerca @`e una stringa di nomi di directory separati da due
+punti@footnote{Punti e virgola in MS-Windows.}.  @command{gawk} prende
+il percorso di ricerca dalla variabile d'ambiente @env{AWKPATH}.  Se questa
+variabile non esiste, o se ha un come valore la stringa nulla,
+@command{gawk} usa un percorso di default (descritto tra poco).
+
+La funzionalit@`a del percorso di ricerca @`e particolarmente utile per costruire
+librerie di funzioni di @command{awk}.  I file di libreria possono essere messi
+in una directory standard inclusa nel percorso di ricerca
+e richiamati sulla riga di comando con un
+@value{FN} breve.  Altrimenti, si dovrebbe scrivere l'intero @value{FN} per
+ciascun file.
+
+Usando l'opzione @option{-i}, o l'opzione @option{-f}, i programmi di
+@command{awk} scritti sulla riga di comando possono usare le funzionalit@`a
+contenute nei file di libreria di @command{awk}
+@iftex
+(@pxrefil{Funzioni di libreria}).
+@end iftex
+@ifnottex
+(@pxref{Funzioni di libreria}).
+@end ifnottex
+La ricerca del percorso non viene eseguita se @command{gawk} @`e in modalit@`a di
+compatibilit@`a, sia con l'opzione @option{--traditional} che con l'opzione
+@option{--posix}.
+@xref{Opzioni}.
+
+Se il file del codice sorgente non viene trovato con una prima ricerca,
+il percorso viene cercato di nuovo dopo aver aggiunto il suffisso
+@samp{.awk} al @value{FN}.
+
+Il meccanismo di ricerca del percorso di @command{gawk} @`e simile a quello
+della shell.
+(Si veda @uref{https://www.gnu.org/software/bash/manual/,
+@cite{The Bourne-Again SHell manual}}.)
+Un elemento nullo nel percorso indica la directory corrente.
+(Un elemento nullo @`e indicato iniziando o terminando il percorso con un segno
+di @samp{:} oppure mettendo due @samp{:} consecutivi [@samp{::}].)
+
+@quotation NOTA
+Per includere la directory corrente nel percorso di ricerca, si pu@`o
+aggiungere @file{.} come un elemento del percorso di ricerca, oppure
+inserire un elemento nullo.
+
+Diverse passate versioni di @command{gawk} avrebbero effettuato anche una
+ricerca esplicita nella directory corrente, prima o dopo aver esaminato il
+percorso di ricerca.  A partire dalla @value{PVERSION} 4.1.2, questo non
+vale pi@`u; se si desidera una ricerca nella directory corrente, @`e
+necessario aggiungere @file{.} esplicitamente, oppure aggiungendo un
+elemento nullo al percorso di ricerca.
+@end quotation
+
+Il valore di default di @env{AWKPATH} @`e
+@samp{.:/usr/local/share/awk}.@footnote{La versione di @command{gawk}
+che state usando potrebbe usare una directory diversa; ci@`o dipende da come
+@command{gawk} @`e stato compilato e installato.  La directory effettiva @`e il
+valore di @code{$(datadir)} generato quando @`e stato configurato
+@command{gawk}.  Non @`e comunque il caso di preoccuparsi per questo.}
+Poich@'e @file{.} @`e incluso all'inizio, @command{gawk} cerca dapprima nella
+directory corrente, e poi in @file{/usr/local/share/awk}.
+In pratica, questo vuol dire che solo raramente ci sar@`a bisogno di cambiare
+il valore di @env{AWKPATH}.
+
+@xref{File da usare a inizio sessione}, per informazioni su funzioni che possono
+essere di aiuto per gestire la variabile @env{AWKPATH}.
+
+@command{gawk} memorizza il valore del percorso di ricerca in uso in
+@code{ENVIRON["AWKPATH"]}.  Questo consente di aver accesso al valore del
+percorso di ricerca in uso all'interno di un programma @command{awk}.
+
+Sebbene la variabile @code{ENVIRON["AWKPATH"]} possa
+essere cambiata anche all'interno di
+un programma @command{awk}, questo non modifica il comportamento del
+programma in esecuzione.  Questo comportamento ha una sua logica: la variabile
+d'ambiente @env{AWKPATH} @`e usata per trovare i file sorgenti del programma; una
+volta che il programma @`e in esecuzione, tutti i file sono stati trovati,
+e @command{gawk} non ha pi@`u bisogno di usare @env{AWKPATH}.
+
+@node AWKLIBPATH (Variabile)
+@subsection Ricerca di librerie condivise @command{awk} su varie directory.
+@cindex @env{AWKLIBPATH}, variabile d'ambiente
+@cindex directory, ricerca di estensioni caricabili
+@cindex percorso di ricerca per estensioni
+@cindex differenze tra @command{awk} e @command{gawk}, variabile d'ambiente @code{AWKLIBPATH}
+
+La variabile d'ambiente @env{AWKLIBPATH} @`e simile alla variabile @env{AWKPATH},
+ma @`e usata per ricercare estensioni caricabili (memorizzate come
+librerie condivise di sistema) specificate con l'opzione @option{-l},
+anzich@'e file sorgenti.  Se l'estensione non viene trovata, il percorso viene
+cercato nuovamente dopo aver aggiunto il suffisso per la libreria condivisa
+appropriato per la piattaforma.  Per esempio, sui sistemi GNU/Linux viene usato
+il suffisso @samp{.so}.  Il percorso di ricerca specificato @`e usato anche
+attraverso la direttiva @code{@@load}
+(@pxref{Caricare librerie condivise}).
+
+Se la variabile d'ambiente @env{AWKLIBPATH} non esiste, o se ha come valore
+la stringa nulla, @command{gawk} usa un percorso di ricerca di default;
+questo normalmente vale @samp{/usr/local/lib/gawk}, anche se il suo valore
+pu@`o essere diverso, a seconda di come @`e stato installato @command{gawk}.
+
+@xref{File da usare a inizio sessione}, per informazioni su funzioni che possono
+essere di aiuto per gestire la variabile @env{AWKPATH}.
+
+@command{gawk} memorizza il valore del percorso di ricerca in uso in
+@code{ENVIRON["AWKLIBPATH"]}.  Questo consente di aver accesso al valore del
+percorso di ricerca in uso all'interno di un programma @command{awk}.
+
+Sebbene sia possibile modificare la variabile @code{ENVIRON["AWKLIBPATH"]}
+all'interno di un programma @command{awk}, la modifica non ha effetto
+sul comportamento del programma in esecuzione.
+Il motivo @`e chiaro: la variabile d'ambiente
+@env{AWKLIBPATH} @`e usata per trovare eventuali estensioni richieste, e
+queste sono caricate prima che il programma inizi l'esecuzione.  Dopo che
+il programma ha iniziato l'esecuzione, tutte le estensioni sono gi@`a state
+caricate, e @command{gawk} non ha pi@`u bisogno di usare la variabile d'ambiente
+@env{AWKLIBPATH}.
+
+@node Altre variabili d'ambiente
+@subsection Le variabili d'ambiente.
+
+Molte altre variabili d'ambiente influenzano il comportamento di
+@command{gawk}, ma esse sono pi@`u specializzate.  Quelle dell'elenco seguente
+sono quelle pi@`u utili agli utenti normali:
+
+@table @env
+@item GAWK_MSEC_SLEEP
+Specifica l'intervallo tra due tentativi di riconnessione,
+in millisecondi.  Sui sistemi che non prevedono
+la chiamata di sistema @code{usleep()},
+il valore @`e arrotondato a un numero intero di secondi .
+
+@item GAWK_READ_TIMEOUT
+Specifica per quanto tempo, in millisecondi, @command{gawk}
+aspetta l'input prima di emettere un messaggio di errore.
+
+@item GAWK_SOCK_RETRIES
+Controlla il numero di volte che @command{gawk} cerca di
+ristabilire una connessione bidirezionale TCP/IP (@dfn{socket}) prima di
+rinunciare a farlo.
+@xref{Reti TCP/IP}.
+Si noti che quando @`e attiva l'opzione di continuazione dopo errori di I/O
+(@pxref{Continuazione dopo errori}),
+@command{gawk} tenta di aprire un @dfn{socket} TCP/IP soltanto una volta.
+
+@item POSIXLY_CORRECT
+Provoca il passaggio di @command{gawk} alla modalit@`a di compatibilit@`a POSIX,
+disabilitando tutte le estensioni tradizionali e GNU.
+@xref{Opzioni}.
+@end table
+
+Le variabili d'ambiente nell'elenco che segue sono utili
+soprattutto agli sviluppatori di @command{gawk} per il collaudo e la messa
+a punto del programma.  Sono soggette a cambiamenti.  Le variabili sono:
+
+@table @env
+@item AWKBUFSIZE
+Questa variabile riguarda solo @command{gawk} installato su sistemi
+conformi a POSIX.
+Col valore di @samp{exact}, @command{gawk} usa la dimensione di ogni file di
+input come dimensione del buffer di memoria da allocare per I/O.  Altrimenti,
+il valore dovrebbe essere un numero, e @command{gawk} usa questo numero come
+dimensione del buffer da allocare.  (Quando questa variabile non @`e impostata,
+@command{gawk} usa la pi@`u piccola tra le dimensioni del file e la dimensione
+del blocco di ``default'', che normalmente @`e la dimensione del blocco I/O
+del filesystem).
+
+@item AWK_HASH
+Se questa variabile @`e impostata con un valore di @samp{gst}, @command{gawk}
+usa la funzione hash di GNU Smalltalk per gestire i vettori.
+Questa funzione pu@`o essere leggermente pi@`u veloce della funzione standard.
+@item AWKREADFUNC
+Se questa variabile esiste, @command{gawk} legge i file sorgenti una riga per
+volta, anzich@'e a blocchi.  Questa variabile @`e presente
+per problemi di debug su filesystem di sistemi operativi non POSIX,
+dove l'I/O @`e elaborato a record, non a blocchi.
+
+@item GAWK_MSG_SRC
+Se questa variabile esiste, @command{gawk} include il @value{FN} e il
+numero di riga all'interno del codice sorgente @command{gawk}
+dal quale sono stati generati i messaggi di avvertimento o
+i messaggi di errore grave.  Il suo intento @`e quello di aiutare a isolare
+l'origine di un messaggio, poich@'e ci possono essere pi@`u righe di codice che
+producono lo stesso messaggio di avvertimento o di errore.
+
+@item GAWK_LOCALE_DIR
+Specifica la posizione dei file oggetto compilati contenenti la traduzione dei
+messaggi emessi da @command{gawk} stesso. Questa variabile @`e passata alla
+funzione @code{bindtextdomain()} nella fase di partenza di @command{gawk}.
+
+@item GAWK_NO_DFA
+Se questa variabile esiste, @command{gawk} non usa il riconoscitore di
+espressioni regolari ASFD [automa a stati finiti deterministico] per i tipi di
+test di corrispondenza.  Questo pu@`o causare un rallentamento di @command{gawk}.
+Il suo intento @`e quello di aiutare a isolare le differenze tra i due
+riconoscitori di espressioni regolari che @command{gawk} usa internamente (non
+dovrebbero esserci differenze, ma a volte la teoria non coincide con la
+pratica).
+
+@item GAWK_STACKSIZE
+Specifica di quanto @command{gawk} dovrebbe accrescere il suo stack di
+valutazione interno, all'occorrenza.
+
+@item INT_CHAIN_MAX
+Specifica il numero massimo previsto di elementi che @command{gawk} mantiene
+su una catena hash per gestire i vettori indicizzati da numeri interi.
+
+@item STR_CHAIN_MAX
+Specifica il numero massimo previsto di elementi che @command{gawk} mantiene
+su una catena hash per gestire i vettori indicizzati da stringhe.
+
+@item TIDYMEM
+Se questa variabile esiste, @command{gawk} usa le chiamate di libreria
+@code{mtrace()} della @dfn{GNU C library} per aiutare a scoprire
+possibili sprechi di memoria.
+@end table
+
+@node Codice di ritorno
+@section Il codice di ritorno all'uscita da @command{gawk}
+
+@cindex codice di ritorno, di @command{gawk}
+@cindex stato d'uscita, di @command{gawk}
+Se l'istruzione @code{exit} viene usata con un valore
+(@pxref{Istruzione exit}), @command{gawk} termina l'esecuzione con il valore
+numerico specificato.
+
+Altrimenti, se non ci sono stati problemi durante l'esecuzione,
+@command{gawk} esce col valore della costante C
+@code{EXIT_SUCCESS}, che normalmente @`e zero.
+
+Se si verifica un errore, @command{gawk} esce col valore della
+costante C @code{EXIT_FAILURE}, che normalmente @`e uguale a uno.
+
+Se @command{gawk} esce a causa di un errore grave, il codice di ritorno
+@`e due.  Sui sistemi non POSIX questo valore pu@`o essere mappato
+a @code{EXIT_FAILURE}.
+
+@node Includere file
+@section Come includere altri file nel proprio programma
+
+@c Panos Papadopoulos <panos1962@gmail.com> contributed the original
+@c text for this section.
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+
+@cindex @code{@@include}, direttiva
+@cindex direttiva @code{@@include}
+@cindex includere file, direttiva @code{@@include}
+La direttiva @code{@@include} pu@`o essere usata per leggere file sorgenti
+di @command{awk} esterni.  Questo d@`a la possibilit@`a di suddividere file
+sorgenti di @command{awk} di grandi dimensioni in porzioni pi@`u piccole e pi@`u
+maneggevoli, e anche di riutilizzare codice @command{awk} di uso comune
+da diversi @dfn{script} @command{awk}.  In altre parole, si possono
+raggruppare funzioni di @command{awk} usate per eseguire determinati compiti
+all'interno di file esterni.  Questi  file possono essere usati proprio come
+librerie di funzioni, usando la direttiva @code{@@include} assieme alla
+variabile d'ambiente @env{AWKPATH}.  Si noti che i file sorgenti possono
+venire inclusi anche usando l'opzione @option{-i}.
+
+Vediamolo con un esempio.
+Iniziamo con due @dfn{script} @command{awk} (banali), che chiameremo
+@file{test1} e @file{test2}.  Questo @`e lo @dfn{script} @file{test1}:
+
+@example
+BEGIN @{
+    print "Questo @`e lo script test1."
+@}
+@end example
+
+@noindent
+e questo @`e @file{test2}:
+
+@example
+@@include "test1"
+BEGIN @{
+    print "Questo @`e lo script test2."
+@}
+@end example
+
+L'esecuzione di @command{gawk} con @file{test2}
+produce il seguente risultato:
+
+@example
+$ @kbd{gawk -f test2}
+@print{} Questo @`e lo script test1.
+@print{} Questo @`e lo script test2.
+@end example
+
+@command{gawk} esegue lo @dfn{script} @file{test2}, il quale include
+@file{test1}, usando la direttiva @code{@@include}.
+Cos@`{@dotless{i}}, per includere file sorgenti di @command{awk} esterni, basta usare
+@code{@@include} seguito dal nome del file da includere,
+racchiuso tra doppi apici.
+
+@quotation NOTA
+Si tenga presente che questo @`e un costrutto del linguaggio e che @value{FN}
+non pu@`o essere una variabile di tipo stringa, ma solo una costante di tipo
+letterale racchiusa tra doppi apici.
+@end quotation
+
+I file da includere possono essere nidificati; p.es., dato un terzo
+@dfn{script}, che chiameremo @file{test3}:
+
+@example
+@group
+@@include "test2"
+BEGIN @{
+    print "Questo @`e lo script test3."
+@}
+@end group
+@end example
+
+@noindent
+L'esecuzione di @command{gawk} con lo @dfn{script} @file{test3} produce i
+seguenti risultati:
+
+@example
+$ @kbd{gawk -f test3}
+@print{} Questo @`e lo script test1.
+@print{} Questo @`e lo script test2.
+@print{} Questo @`e lo script test3.
+@end example
+
+Il @value{FN}, naturalmente, pu@`o essere un nome di percorso.
+Per esempio:
+
+@example
+@@include "../funzioni_di_i_o"
+@end example
+
+@noindent
+e:
+
+@example
+@@include "/usr/awklib/network"
+@end example
+
+@noindent
+sono entrambi percorsi validi.  La variabile d'ambiente @env{AWKPATH} pu@`o
+rivestire grande importanza quando si usa @code{@@include}.  Le stesse
+regole per l'uso della variabile d'ambiente @env{AWKPATH} nelle ricerche
+da riga di comando
+(@pxref{AWKPATH (Variabile)}) si applicano anche a
+@code{@@include}.
+
+Questo @`e di grande aiuto nella costruzione di librerie di funzioni di
+@command{gawk}.  Se si ha uno @dfn{script} di grandi dimensioni contenente
+utili funzioni @command{awk} di uso comune, lo si pu@`o suddividere in file
+di libreria e mettere questi file in una directory dedicata.  In seguito si
+possono includere queste ``librerie'' usando il percorso completo dei
+file, o impostando opportunamente la variabile d'ambiente @env{AWKPATH} e
+quindi usando @code{@@include} con la sola parte del percorso completo che
+designa il file.  Naturalmente,
+si possono tenere i file di libreria in pi@`u di una directory;
+pi@`u @`e complesso l'ambiente di lavoro, pi@`u
+directory possono essere necessarie per organizzare i file da includere.
+
+Vista la possibilit@`a di specificare opzioni @option{-f} multiple, il
+meccanismo @code{@@include} non @`e strettamente necessario.
+Comunque, la direttiva @code{@@include} pu@`o essere d'aiuto nel costruire
+programmi @command{gawk} autosufficienti, riducendo cos@`{@dotless{i}} la necessit@`a
+di scrivere righe di comando complesse e tediose.
+In particolare, @code{@@include} @`e molto utile per scrivere @dfn{script} CGI
+eseguibili da pagine web.
+
+Le regole usate per trovare un file sorgente, descritte in
+@ref{AWKPATH (Variabile)}, valgono anche per i file
+caricati tramite @code{@@include}.
+
+Infine, i file inclusi con @code{@@include} sono considerati
+appartenere allo spazio-dei-nomi @samp{"awk" (@@namespace "awk")}
+a inizio programma. @xref{Cambiare lo spazio-dei-nomi}, per ulteriori
+informazioni.
+
+@node Caricare librerie condivise
+@section Caricare librerie condivise nel proprio programma
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+
+@cindex @code{@@load}, direttiva
+@cindex direttiva @code{@@load}
+@cindex caricare estensioni, direttiva @code{@@load}
+@cindex estensioni, caricamento, direttiva @code{@@load}
+La direttiva @code{@@load} pu@`o essere usata per leggere estensioni di
+@command{awk} esterne (memorizzate come librerie condivise di sistema).
+Questo consente di collegare del codice compilato che pu@`o offrire prestazioni
+migliori o dare l'accesso a funzionalit@`a estese non incluse nel linguaggio
+@command{awk}.  La variabile @env{AWKLIBPATH} viene usata per ricercare
+l'estensione.  Usare @code{@@load} @'e del tutto equivalente a usare l'opzione da
+riga di comando @option{-l}.
+
+Se l'estensione non viene trovata in @env{AWKLIBPATH}, viene effettuata
+un'altra ricerca dopo aver aggiunto al @value{FN} il suffisso della
+libreria condivisa comunemente in uso per la piattaforma corrente.  Per
+esempio, sui sistemi GNU/Linux viene usato il suffisso @samp{.so}:
+
+@example
+$ @kbd{gawk '@@load "ordchr"; BEGIN @{print chr(65)@}'}
+@print{} A
+@end example
+
+@noindent
+Questo equivale all'esempio seguente:
+
+@example
+@group
+$ @kbd{gawk -lordchr 'BEGIN @{print chr(65)@}'}
+@print{} A
+@end group
+@end example
+
+@noindent
+Per l'uso da riga di comando @`e pi@`u conveniente l'opzione @option{-l},
+ma @code{@@load} @`e utile da inserire all'interno di un file sorgente di
+@command{awk} che richieda l'accesso a un'estensione.
+
+@ref{Estensioni dinamiche}, descrive come scrivere estensioni (in C or C++)
+che possono essere caricate sia con @code{@@load} che con l'opzione
+@option{-l}.  @`E anche descritta l'estensione @code{ordchr}.
+
+@node Parti obsolete
+@section Opzioni e/o funzionalit@`a obsolete
+
+@c update this section for each release!
+
+@cindex opzioni deprecate
+@cindex funzionalit@`a deprecate
+@cindex obsolete, funzionalit@`a
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive funzionalit@`a o opzioni da riga di comando
+provenienti da precedenti versioni di @command{gawk} che non sono pi@`u
+disponibili nella versione corrente, o che sono ancora utilizzabili ma sono
+deprecate (ci@`o significa che @emph{non} saranno presenti nella prossima
+versione).
+
+I file speciali relativi ai processi @file{/dev/pid}, @file{/dev/ppid},
+@file{/dev/pgrpid} e @file{/dev/user} erano deprecati, ma ancora disponibili,
+in @command{gawk} 3.1.  A partire dalla @value{PVERSION} 4.0, non sono
+pi@`u interpretati da @command{gawk} in modo speciale (al loro posto usare
+invece @code{PROCINFO}; si veda @ref{Variabili auto-assegnate}).
+
+@ignore
+This @value{SECTION}
+is thus essentially a place holder,
+in case some option becomes obsolete in a future version of @command{gawk}.
+@end ignore
+
+@node Non documentato
+@section Opzioni e funzionalit@`a non documentate
+@cindex non documentate, funzionalit@`a
+@cindex funzionalit@`a non documentate
+@cindex Skywalker, Luke
+@cindex Kenobi, Obi-Wan
+@cindex jedi, cavalieri
+@cindex cavalieri jedi
+@quotation
+@i{Usa il codice sorgente, Luke!}
+@author Obi-Wan
+@end quotation
+
+@cindex conchiglie, mare
+@ifnotinfo
+Questa @value{SECTION} @`e stata lasciata intenzionalmente vuota.
+@end ifnotinfo
+@ifinfo
+Questo @value{SECTION} @`e stato lasciato intenzionalmente vuoto.
+@end ifinfo
+
+@ignore
+@c If these came out in the Info file or TeX document, then they wouldn't
+@c be undocumented, would they?
+
+@command{gawk} ha un'opzione non documentata:
+
+@table @code
+@item -W nostalgia
+@itemx --nostalgia
+Stampa il messaggio @samp{awk: bailing out near line 1} e termina
+con un errore grave.
+Quest'opzione @`e stata ispirata dal comportamento comune delle primissime
+versioni di @command{awk} Unix e da una maglietta [con la scritta].
+Il messaggio @emph{NON} viene tradotto in ambienti non inglesi.
+@c so there! nyah, nyah.
+@end table
+
+Le prime versioni di @command{awk} non richiedevano alcun separatore (a capo
+
+o @samp{;}) tra le regole nei programmi @command{awk}.  Quindi,
+era normale vedere programmi di una riga come:
+
+@example
+awk '@{ sum += $1 @} END @{ print sum @}'
+@end example
+
+@command{gawk} in realt@`a consente questo stile, ma la cosa non @`e
+documentata per non incoraggiare la pratica.  Il modo corretto per scrivere
+quel programma @`e uno dei
+seguenti:
+
+@example
+awk '@{ sum += $1 @} ; END @{ print sum @}'
+@end example
+
+@noindent
+oppure:
+
+@example
+awk '@{ sum += $1 @}
+     END @{ print sum @}' data
+@end example
+
+@noindent
+@xref{Istruzioni/Righe}, per una spiegazione pi@`u ampia.
+
+Si possono inserire righe bianche dopo @samp{;} nei cicli @code{for}.
+Questa sembre essere stata una funzionalit@`a a lungo non documentata in
+@command{awk} Unix.
+
+Analogamente, si possono usare istruzioni @code{print} o @code{printf}
+nelle parti @var{valore-iniziale} e @var{incremento} di un ciclo
+@code{for}.  Questa @`e un'altra funzionalit@`a a lungo non documentata in
+@command{awk} Unix.
+
+@command{gawk} consente di usare come nomi di parametro dei
+nomi di funzioni predefinite che facciano parte delle estensioni
+@command{gawk}, all'interno di funzioni definite dall'utente.
+Questo avviene per ``salvaguardare per il futuro'' vecchi programmi che
+utilizzino nomi di funzioni aggiunte da @command{gawk} dopo che questi
+programmi erano stati scritti.
+Le funzioni predefinite standard di command{awk}, per esempio
+@code{sin()} o @code{substr()} @emph{non} ammettono questa possibilit@`a.
+
+@`E possibile specificare in @code{printf} un modificatore @samp{P}
+fra le lettere di controllo dei numeri in virgola mobile, per
+utilizzare il risultato fornito dalle funzioni di libreria C
+per i valori NaN [Non un Numero] e Infinity [Infinito], invece dei
+valori speciali normalmente prodotti da @command{gawk}, come
+descritto in @ref{Problemi virgola mobile POSIX}.
+Questo serve principalmente nella fase di test delle componenti aggiunte.
+
+La funzione predefinita @code{typeof()}
+(@pxref{Funzioni per i tipi})
+accetta un nome di vettore, opzionale, come secondo argomento, il quale,
+se presente sar@`a svuotato degli eventuali contenuti, e riempito con
+alcune informazioni che descrivono l'implementazione interna della
+variabile.  Ci@`o pu@`o essere utile per il debug.  Per ora viene
+restituita una versione formato testo dei flag per le variabili di
+tipo scalare, e il tipo di implementazione interna per i vettori.
+Per quest'interfaccia sono possibili variazioni in futuro, e quindi
+i valori restituiti possono non rimanere fissi.
+
+Se non si @`e in modalit@`a POSIX o in modalit@`a compatibile, impostando
+code{LINENO} a un valore numerico, per mezzo dell'opzione @option{-v},
+@command{gawk} aggiunge il valore specificato al numero di riga del
+programma, nei messaggi di errore.  Ci@`o serve qualora il programma
+sia contenuto in uno @dfn{script} Bash,
+per far s@`{@dotless{i}} che il messaggio di errore
+rispecchi il numero di riga corrispondente nello @dfn{script} Bash, invece
+del numero di riga del programma @command{gawk} vero e proprio.
+Si veda l'esempio seguente:
+
+@example
+$ @kbd{gawk -v LINENO=10 'BEGIN @{ print("hi" @}'}
+@error{} gawk: riga com.:11: BEGIN @{ print("hi" @}
+@error{} gawk: riga com.:11:                    ^ syntax error
+@end example
+
+@end ignore
+
+@node Sommario invocazione
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+Per eseguire @command{awk} usare, o
+@samp{awk '@var{programma}' @var{file}}
+o
+@samp{awk -f @var{file-del-programma} @var{file}}.
+
+@item
+Le tre opzioni standard per tutte le versioni di @command{awk} sono
+@option{-f}, @option{-F} e @option{-v}.  @command{gawk} fornisce queste e
+molte altre, come pure le opzioni estese corrispondenti scritte in stile GNU.
+
+@item
+Gli argomenti da riga di comando che non sono opzioni sono trattati normalmente
+come @value{FNS}, a meno che non abbiano la forma @samp{@var{var}=@var{valore}};
+nel qual caso vengono riconosciuti come assegnamenti di variabile da eseguire
+in quel punto
+nell'elaborazione dell'input.
+
+@item
+Tutti gli argomenti da riga di comando che non sono opzioni, escluso il testo
+del programma, vengono messe nel vettore @code{ARGV}.  Modifiche a @code{ARGC}
+e @code{ARGV} influiscono su come @command{awk} elabora l'input.
+
+@item
+Si pu@`o usare un segno meno a s@'e stante (@samp{-}) per designare lo standard
+input sulla riga di comando.  @command{gawk} consente anche di usare il
+@value{FN} speciale @file{/dev/stdin}.
+
+
+@item
+@command{gawk} tiene conto di diverse variabili d'ambiente;
+@env{AWKPATH}, @env{AWKLIBPATH} e @env{POSIXLY_CORRECT} sono le
+pi@`u importanti.
+
+@item
+Lo stato d'uscita di @command{gawk} invia informazioni al programma che lo
+ha invocato.  Usare l'istruzione @code{exit} dall'interno di un programma
+@command{awk} per impostare il codice di ritorno.
+
+@item
+@command{gawk} consente di includere nel proprio programma file sorgenti di
+@command{awk} con la direttiva @code{@@include} o con le opzioni da riga di
+comando  @option{-i} e @option{-f}.
+
+@item
+@command{gawk} consente di caricare funzioni aggiuntive scritte in C
+o C++ con la direttiva @code{@@load} e/o con l'opzione @option{-l}
+(questa funzionalit@`a avanzata @`e descritta pi@`u avanti, in
+@ref{Estensioni dinamiche}).
+@end itemize
+@node Espressioni regolari
+@chapter Espressioni regolari
+@cindex @dfn{regexp}
+@cindex espressioni regolari
+
+Una @dfn{espressione regolare}, o @dfn{regexp}, @`e un modo per descrivere un
+insieme di stringhe.
+Poich@'e le espressioni regolari sono una parte fondamentale della
+programmazione in @command{awk}, il loro formato e il loro uso meritano un
+@value{CHAPTER} a s@'e stante.
+
+@cindex barra (@code{/}), per delimitare le espressioni regolari
+@cindex @code{/} (barra), per delimitare le espressioni regolari
+Un'espressione regolare racchiusa tra barre (@samp{/})
+@`e un modello di ricerca @command{awk} che individua tutti i record in input
+il cui testo corrisponde al modello stesso.
+L'espressione regolare pi@`u semplice @`e una sequenza di lettere o di numeri, o
+di entrambi.  Una tale @dfn{regexp} individua ogni stringa che contenga quella
+particolare sequenza.
+Quindi, la @dfn{regexp} @samp{pippo} individua ogni stringa che contenga
+@samp{pippo}.  In altre parole, al modello di ricerca @code{/pippo/} corrisponde
+ogni record in input che contiene i cinque caratteri consecutivi @samp{pippo}
+@emph{in qualsiasi parte} del record.  Altri tipi di @dfn{regexp} permettono
+di specificare classi di stringhe molto pi@`u complesse.
+
+@ifnotinfo
+All'inizio, gli esempi in questo @value{CHAPTER} sono semplici.
+Man mano che entriamo nei dettagli su
+come funzionano le espressioni regolari utilizzeremo formulazioni pi@`u
+complesse.
+@end ifnotinfo
+
+@menu
+* Uso di @dfn{regexp}::                 Come usare le espressioni regolari.
+* Sequenze di protezione::              Come scrivere caratteri non stampabili.
+* Operatori di espressioni regolari::   Operatori di espressioni regolari.
+* Espressioni tra parentesi quadre::    Cosa possono contenere @samp{[...]}.
+* Pi@`u lungo da sinistra::               Quanto @`e lungo il testo individuato.
+* Espressioni regolari calcolate::      Usare @dfn{regexp} dinamiche.
+* Operatori di @dfn{regexp} GNU::       Operatori propri del software GNU.
+* Maiuscolo-Minuscolo::                 Fare confronti ignorando
+                                        maiuscolo/minuscolo.
+* Sommario espressioni regolari::       Sommario delle espressioni regolari.
+@end menu
+
+@node Uso di @dfn{regexp}
+@section Uso di espressioni regolari
+
+@cindex criteri di ricerca, espressioni regolari usate come
+@cindex espressioni regolari, come criteri di ricerca
+Un'espressione regolare pu@`o essere usata come modello di ricerca
+racchiudendola tra barre.  L'espressione regolare @`e quindi confrontata
+con tutto il testo di ogni record (normalmente, basta che corrisponda a
+una parte qualsiasi del testo per risultare soddisfatta).  Per esempio,
+il seguente programma stampa il secondo campo di ogni record in cui compaia
+la stringa @samp{li}, in qualsiasi parte del record:
+
+@example
+$ @kbd{awk '/li/ @{ print $2 @}' mail-list}
+@print{} 555-5553
+@print{} 555-0542
+@print{} 555-6699
+@print{} 555-3430
+@end example
+
+@cindex espressioni regolari, operatori
+@cindex operatori, ricerca in stringhe
+@c @cindex operators, @code{~}
+@cindex ricerca in stringhe, operatori
+@cindex @code{~} (tilde), operatore @code{~}
+@cindex tilde (@code{~}), operatore @code{~}
+@cindex @code{!} (punto esclamativo), operatore @code{!~}
+@cindex punto esclamativo (@code{!}), operatore @code{!~}
+@c @cindex operatori, @code{!~}
+@cindex @code{if}, istruzione, uso di espressioni regolari in
+@cindex @code{while}, istruzione, uso di espressioni regolari in
+@cindex @code{do}-@code{while}, istruzione, uso di espressioni regolari in
+@c @cindex istruzione @code{if}
+@c @cindex istruzione @code{while}
+@c @cindex istruzione @code{do}
+Espressioni regolari possono anche essere usate in espressioni di confronto.
+Queste espressioni consentono di specificare le stringhe da riconoscere;
+non devono necessariamente comprendere l'intero record corrente.  I due
+operatori @samp{~} e @samp{!~} confrontano espressioni regolari.  Le
+espressioni che usano questi operatori possono essere usate come modelli di
+ricerca, o nelle istruzioni @code{if}, @code{while}, @code{for}, e @code{do}.
+(@xref{Istruzioni}.)
+Per esempio:
+
+@example
+@var{exp} ~ /@var{regexp}/
+@end example
+
+@noindent
+@`e verificata se l'espressione @var{exp} (intesa come stringa)
+corrisponde a @var{regexp}.  L'esempio che segue individua, o sceglie,
+tutti i record in input in cui la lettera maiuscola @samp{J} @`e presente da
+qualche parte nel primo campo:
+
+@example
+$ @kbd{awk '$1 ~ /J/' inventory-shipped}
+@print{} Jan  13  25  15 115
+@print{} Jun  31  42  75 492
+@print{} Jul  24  34  67 436
+@print{} Jan  21  36  64 620
+@end example
+
+Lo stesso risultato si pu@`o ottenere anche cos@`{@dotless{i}}:
+
+@example
+awk '@{ if ($1 ~ /J/) print @}' inventory-shipped
+@end example
+
+Il prossimo esempio chiede che l'espressione @var{exp}
+(intesa come stringa)
+@emph{NON} corrisponda a @var{regexp}:
+
+@example
+@var{exp} !~ /@var{regexp}/
+@end example
+
+L'esempio che segue individua o sceglie tutti i record in input il cui
+primo campo @emph{NON} contiene
+la lettera maiuscola @samp{J}:
+
+@example
+$ @kbd{awk '$1 !~ /J/' inventory-shipped}
+@print{} Feb  15  32  24 226
+@print{} Mar  15  24  34 228
+@print{} Apr  31  52  63 420
+@print{} May  16  34  29 208
+@dots{}
+@end example
+
+@cindex @dfn{regexp}, costanti
+@cindex costanti @dfn{regexp}
+@cindex espressioni regolari, costanti, si veda costanti @dfn{regexp}
+Quando una @dfn{regexp} @`e racchiusa tra barre, come @code{/pippo/}, la chiamiamo
+una @dfn{costante regexp}, proprio come @code{5.27} @`e una costante
+numerica e @code{"pippo"} @`e una costante [di tipo] stringa.
+
+@node Sequenze di protezione
+@section Sequenze di protezione
+
+@cindex sequenze di protezione, in stringhe
+@cindex barra inversa (@code{\}), in sequenze di protezione
+@cindex @code{\} (barra inversa), in sequenze di protezione
+Alcuni caratteri non possono essere inclusi letteralmente in costanti
+stringa (@code{"pippo"}) o in costanti @dfn{regexp} (@code{/pippo/}).
+Vanno invece rappresentati usando @dfn{sequenze di protezione},
+ossia sequenze di caratteri preceduti da una barra inversa (@samp{\}).
+Una sequenza di protezione pu@`o essere usata per includere un carattere di
+"doppio apice" in una costante stringa.  Poich@'e un semplice doppio apice
+termina la stringa, va usato @samp{\"} per richiedere che un doppio apice sia
+presente all'interno di una stringa.  Per esempio:
+
+@example
+$ @kbd{awk 'BEGIN @{ print "Egli le disse \"ciao!\"." @}'}
+@print{} Egli le disse "ciao!".
+@end example
+
+Lo stesso carattere di barra inversa @`e un altro carattere che non pu@`o essere
+incluso normalmente; occorre scrivere @samp{\\} per inserire una barra
+inversa nella stringa o @dfn{regexp}.  Quindi, la stringa costituita dai due
+caratteri @samp{"} e @samp{\} deve essere scritta come @code{"\"\\"}.
+
+Altre sequenze di protezione rappresentano caratteri non stampabili
+come TAB o il ritorno a capo.  Anche se @`e possibile immettere la maggior parte dei
+caratteri non stampabili direttamente in una costante stringa o
+@dfn{regexp}, essi possono non essere di facile comprensione.
+
+La seguente lista elenca
+tutte le sequenze di protezione usate in @command{awk} e
+cosa rappresentano.  Se non @`e detto altrimenti, tutte queste sequenze di
+protezione valgono sia per costanti stringa che per costanti @dfn{regexp}:
+
+@table @code
+@item \\
+Barra inversa letterale, @samp{\}.
+
+@c @cindex @command{awk} language, V.4 version
+@cindex @code{\} (barra inversa), @code{\a}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\a}, sequenza di protezione
+@item \a
+Il carattere ``campanello'', @kbd{Ctrl-g}, codice ASCII 7 (BEL).
+(Spesso genera qualche tipo di segnale sonoro udibile.)
+
+@cindex @code{\} (barra inversa), @code{\b}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\b}, sequenza di protezione
+@item \b
+Barra inversa, @kbd{Ctrl-h}, codice ASCII 8 (BS).
+
+@cindex @code{\} (barra inversa), @code{\f}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\f}, sequenza di protezione
+@item \f
+Nuova pagina, @kbd{Ctrl-l}, codice ASCII 12 (FF).
+
+@cindex @code{\} (barra inversa), @code{\n}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\n}, sequenza di protezione
+@item \n
+A-capo, @kbd{Ctrl-j}, codice ASCII 10 (LF).
+
+@cindex @code{\} (barra inversa), @code{\r}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\r}, sequenza di protezione
+@item \r
+Ritorno-a-capo, @kbd{Ctrl-m}, codice ASCII 13 (CR).
+
+@cindex @code{\} (barra inversa), @code{\t}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\t}, sequenza di protezione
+@item \t
+Tabulazione orizzontale, @kbd{Ctrl-i}, codice ASCII 9 (HT).
+
+@c @cindex @command{awk} language, V.4 version
+@cindex @code{\} (barra inversa), @code{\v}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\v}, sequenza di protezione
+@item \v
+Tabulazione verticale, @kbd{Ctrl-k}, codice ASCII 11 (VT).
+
+@cindex @code{\} (barra inversa), @code{\}@var{nnn}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\}@var{nnn}, sequenza di protezione
+@item \@var{nnn}
+Il valore ottale @var{nnn}, dove @var{nnn} pu@`o essere da 1 a 3 cifre ottali,
+tra @samp{0} e @samp{7}.  Per esempio, il codice per il carattere ASCII ESC
+(escape) @`e @samp{\033}.
+
+@c @cindex @command{awk} language, V.4 version
+@c @cindex @command{awk} language, POSIX version
+@cindex @code{\} (barra inversa), @code{\x}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\x}, sequenza di protezione
+@cindex comuni, estensioni@comma{} @code{\x}, sequenza di protezione
+@cindex estensioni comuni, @code{\x}, sequenza di protezione
+@item \x@var{hh}@dots{}
+Il valore esadecimale @var{hh}, dove @var{hh} indica una sequenza di cifre
+esadecimali (@samp{0}--@samp{9}, e @samp{A}--@samp{F}
+o @samp{a}--@samp{f}).  Dopo @samp{\x} @`e consentito un massimo di due cifre.
+Ogni ulteriore cifra esadecimale @`e considerata come una semplice
+lettera o numero.  @value{COMMONEXT}
+(La sequenza di protezione @samp{\x} non @`e permessa in POSIX awk.)
+
+@quotation ATTENZIONE
+In ISO C, la sequenza di protezione continua fino a raggiungere il primo
+carattere che non sia una cifra esadecimale.
+In passato, @command{gawk} avrebbe continuato ad aggiungere
+cifre esadecimali al valore finch@'e non trovava una cifra non esadecimale
+oppure fino a raggiungere la fine della stringa.
+Comunque usare pi@`u di due cifre esadecimali produceva risultati indefiniti.
+Dalla @value{PVERSION} 4.2,
+vengono elaborate solo due cifre.
+@end quotation
+
+@cindex @code{\} (barra inversa), @code{\/}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\/}, sequenza di protezione
+@item \/
+Una barra (necessario solo per costanti @dfn{regexp}).
+Questa sequenza si usa per inserire una costante @dfn{regexp}
+che contiene una barra
+(come @code{/.*:\/home\/[[:alnum:]]+:.*/}; la notazione @samp{[[:alnum:]]}
+verr@`a spiegata pi@`u avanti,
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Espressioni tra parentesi quadre}).
+Poich@'e una @dfn{regexp} @`e racchiusa tra
+barre, si deve proteggere ogni barra che sia parte dell'espressione, per dire
+ad @command{awk} di andare avanti a scandire il resto della @dfn{regexp}.
+
+@cindex @code{\} (barra inversa), @code{\"}, sequenza di protezione
+@cindex barra inversa (@code{\}), @code{\"}, sequenza di protezione
+@item \"
+Un doppio apice (necessario solo per costanti stringa).
+Questa sequenza si usa per inserire in una costante stringa il carattere
+doppio apice
+(come @code{"Egli le disse \"ciao!\"."}).
+Poich@'e la stringa @`e racchiusa tra
+doppi apici, si deve proteggere ogni doppio apice che sia parte della stringa
+per dire ad @command{awk} di andare avanti a elaborare il resto della stringa.
+@end table
+
+In @command{gawk}, parecchie altre sequenze di due caratteri inizianti con
+con una barra inversa hanno un significato speciale nelle @dfn{regexp}.
+@ref{Operatori di @dfn{regexp} GNU}.
+
+In una @dfn{regexp}, una barra inversa che preceda un carattere non presente
+nella lista precedente, e non elencato in
+@ref{Operatori di @dfn{regexp} GNU},
+significa che il carattere seguente dovrebbe essere preso letteralmente,
+anche se normalmente sarebbe un operatore di @dfn{regexp}.  Per esempio,
+@code{/a\+b/} individua i tre caratteri @samp{a+b}.
+
+@cindex barra inversa (@code{\}), in sequenze di protezione
+@cindex @code{\} (barra inversa), in sequenze di protezione
+@cindex portabilit@`a
+Per una completa portabilit@`a, non usare una barra inversa prima di qualsiasi
+carattere non incluso nella lista precedente, o che non sia un operatore.
+@c 11/2014: Moved so as to not stack sidebars
+@sidebar Barra inversa prima di un carattere normale
+@cindex portabilit@`a, barra inversa in sequenze di protezione
+@cindex POSIX @command{awk}, barre inverse in costanti stringa
+@cindex barra inversa (@code{\}), in sequenze di protezione, POSIX e
+@cindex @code{\} (barra inversa), in sequenze di protezione, POSIX e
+
+@cindex risoluzione di problemi, barra inversa prima di caratteri non speciali
+@cindex problemi, risoluzione di, barra inversa prima di caratteri non speciali
+Se si mette una barra inversa in una costante stringa prima di qualcosa che
+non sia uno dei caratteri elencati sopra, POSIX @command{awk} di proposito
+lascia indefinito il comportamento.  Ci sono due possibilit@`a:
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex Brian Kernighan, @command{awk} di
+@table @asis
+@item Togliere la barra inversa
+Questo @`e quel che sia BWK @command{awk} che @command{gawk} fanno.
+Per esempio, @code{"a\qc"} equivale a @code{"aqc"}.
+(Poich@'e questo @`e un errore che pu@`o capitare o non capitare con la stessa
+probabilit@`a, @command{gawk} lo segnala).
+Volendo usare come separatore di campo @samp{FS = @w{"[ \t]+\|[ \t]+"}}
+ossia delle barre verticali precedute e seguite da almeno uno spazio,
+occorre mettere due barre inverse nella stringa:
+@samp{FS = @w{"[ \t]+\\|[ \t]+"}}.)
+@c I did this!  This is why I added the warning.
+
+@cindex @command{gawk}, sequenze di protezione
+@cindex Unix @command{awk}, barre inverse in sequenze di protezione
+@cindex @command{mawk}, programma di utilit@`a
+@cindex programma di utilit@`a @command{mawk}
+@item Tenere la barra inversa cos@`{@dotless{i}} com'@`e.
+Alcune altre implementazioni di @command{awk} fanno questo.
+In quelle implementazioni, immettere @code{"a\qc"} equivale a immettere
+@code{"a\\qc"}.
+@end table
+@end sidebar
+Ricapitolando:
+
+@itemize @value{BULLET}
+@item
+Le sequenze di protezione nella lista di cui sopra sono sempre elaborate
+per prime, sia per le costanti stringa che per le costanti @dfn{regexp}.  Questo
+viene fatto quasi subito, non appena @command{awk} legge il programma.
+
+@item
+@command{gawk} elabora sia costanti @dfn{regexp} che @dfn{regexp} dinamiche
+(@pxref{Espressioni regolari calcolate}),
+per gli operatori speciali elencati in
+@ref{Operatori di @dfn{regexp} GNU}.
+
+@item
+Una barra inversa prima di ogni altro carattere richiede di trattare quel
+carattere letteralmente.
+@end itemize
+
+@sidebar Sequenze di protezione per metacaratteri
+@cindex metacaratteri, sequenze di protezione per
+
+Supponiamo che si usi una protezione ottale o esadecimale
+per rappresentare un metacarattere di @dfn{regexp}
+(si veda @ref{Operatori di espressioni regolari}).
+@command{awk} considera il carattere come un carattere letterale o
+come un operatore di @dfn{regexp}?
+
+@cindex angolo buio, sequenze di protezione, per metacaratteri
+Storicamente, tali caratteri erano considerati letteralmente.
+@value{DARKCORNER}
+Invece, lo standard POSIX richiede che siano considerati
+come metacaratteri veri e propri, e questo @`e ci@`o che @command{gawk} fa.
+In modalit@`a compatibile (@pxref{Opzioni}),
+@command{gawk} tratta i caratteri scritti come sequenze ottali ed esadecimali
+letteramente, quando sono usati in costanti @dfn{regexp}.  Quindi,
+@code{/a\52b/} equivale a @code{/a\*b/}.
+@end sidebar
+
+@node Operatori di espressioni regolari
+@section Operatori di espressioni regolari
+@cindex espressioni regolari, operatori
+@cindex metacaratteri in espressioni regolari
+
+@`E possibile inserire in espressioni regolari dei caratteri speciali,
+detti @dfn{operatori di espressioni regolari} o @dfn{metacaratteri}, per
+aumentarne il potere e la versatilit@`a.
+
+@menu
+* Dettagli sugli operatori di @dfn{regexp}::     Descrizione dettagliata.
+* Espressioni di intervallo::                    Note sulle espressioni di intervallo.
+@end menu
+
+@node Dettagli sugli operatori di @dfn{regexp}
+@subsection Operatori di @dfn{regexp} in @command{awk}
+
+Le sequenze di protezione descritte
+@ifnotinfo
+prima
+@end ifnotinfo
+in @ref{Sequenze di protezione}
+sono valide all'interno di una @dfn{regexp}.  Sono precedute da una @samp{\} e
+sono riconosciute e convertite nei caratteri reali corrispondenti nella
+primissima fase dell'elaborazione delle @dfn{regexp}.
+
+Ecco una lista dei metacaratteri.  Tutti i caratteri che non sono sequenze
+di protezione e che non sono elencati qui rappresentano se stessi:
+
+@c Use @asis so the docbook comes out ok. Sigh.
+@table @asis
+@cindex barra inversa (@code{\}), operatore @dfn{regexp}
+@cindex barra inversa (@code{\}), operatore @dfn{regexp}
+@cindex @code{\} (barra inversa), operatore @dfn{regexp}
+@item @code{\}
+Si usa per togliere il significato speciale a un carattere quando si effettuano
+confronti.  Per esempio, @samp{\$}
+individua il carattere @samp{$}.
+
+@cindex espressioni regolari, ancore nelle
+@cindex Texinfo, inizi di capitolo nei file
+@cindex @code{^} (circonflesso), operatore @dfn{regexp}
+@cindex circonflesso (@code{^}), operatore @dfn{regexp}
+@item @code{^}
+Si usa per indicare l'inizio di una stringa.  Per esempio, @samp{^@@chapter}
+individua @samp{@@chapter} all'inizio di una stringa e si pu@`o usare per
+identificare inizi di capitoli in file sorgenti Texinfo.
+Il simbolo @samp{^} @`e conosciuto come @dfn{@`ancora}, perch@'e @`ancora la ricerca
+solo all'inizio della stringa.
+
+@`E importante notare che @samp{^} non individua un inizio di riga
+(il punto subito dopo un ritorno a capo @samp{\n}) che si trovi all'interno
+di una stringa.  La condizione non @`e verificata nell'esempio seguente:
+
+@example
+if ("riga1\nRIGA 2" ~ /^R/) @dots{}
+@end example
+
+@cindex @code{$} (dollaro), operatore @dfn{regexp}
+@cindex dollaro (@code{$}), operatore @dfn{regexp}
+@item @code{$}
+Simile a @samp{^}, ma serve a indicare la fine di una stringa.
+Per esempio, @samp{p$}
+individua un record che termina con la lettera @samp{p}.  Il @samp{$} @`e
+un'@`ancora e non individua una fine di riga (il punto immediatamente prima
+di un carattere di ritorno a capo @samp{\n})
+contenuta in una stringa.
+La condizione nell'esempio seguente non @`e verificata:
+
+@example
+if ("riga1\nRIGA 2" ~ /1$/) @dots{}
+@end example
+
+@cindex @code{.} (punto), operatore @dfn{regexp}
+@cindex punto (@code{.}), operatore @dfn{regexp}
+@item @code{.} (punto)
+Individua un qualsiasi carattere,
+@emph{incluso} il carattere di ritorno a capo.  Per esempio, @samp{.P}
+individua ogni carattere in una stringa che sia seguito da una @samp{P}.
+Usando la concatenazione, si pu@`o formare un'espressione regolare come
+@samp{U.A}, che individua qualsiasi sequenza di tre caratteri che inizia con
+@samp{U} e finisce con @samp{A}.
+
+@cindex POSIX @command{awk}, uso del punto (@code{.})
+In modalit@`a POSIX stretta (@pxref{Opzioni}),
+@samp{.} non individua il carattere @sc{nul},
+ossia il carattere con tutti i bit uguali a zero.
+In altri contesti, @sc{nul} @`e solo un carattere qualsiasi.  Altre versioni
+di @command{awk} possono non essere in grado di individuare il carattere
+@sc{nul}.
+
+@cindex @code{[]} (parentesi quadre), operatore @dfn{regexp}
+@cindex parentesi quadre (@code{[]}), operatore @dfn{regexp}
+@cindex espressioni tra parentesi
+@cindex insiemi di caratteri, si veda anche espressioni tra parentesi quadre
+@cindex liste di caratteri, si veda espressioni tra parentesi quadre
+@cindex classi di caratteri, si veda espressioni tra parentesi quadre
+@item @code{[}@dots{}@code{]}
+Questa @`e chiamata una @dfn{espressione tra parentesi quadre}.@footnote{In
+altri testi, un'espressione tra parentesi quadre potrebbe essere
+definita come @dfn{insieme di caratteri}, @dfn{classe di caratteri} o
+ @dfn{lista di caratteri}.}
+Individua @emph{uno} qualsiasi dei caratteri racchiusi tra
+parentesi quadre.  Per esempio, @samp{[MVX]} individua uno qualsiasi
+dei caratteri @samp{M}, @samp{V}, o @samp{X} in una stringa.  Una spiegazione
+esauriente di quel che si pu@`o mettere all'interno di un'espressione tra
+parentesi quadre @`e data in
+@ref{Espressioni tra parentesi quadre}.
+
+@cindex espressioni tra parentesi quadre, complementate
+@item @code{[^}@dots{}@code{]}
+Questa @`e una @dfn{espressione tra parentesi quadre complementata}.  Il primo
+carattere dopo la @samp{[} @emph{deve} essere un @samp{^}.  Individua
+qualsiasi carattere
+@emph{tranne} quelli tra parentesi quadre.  Per esempio, @samp{[^awk]}
+individua qualsiasi carattere che non sia una @samp{a}, @samp{w}, o @samp{k}.
+
+@cindex @code{|} (barra verticale)
+@cindex barra verticale (@code{|})
+@item @code{|}
+Questo @`e un @dfn{operatore alternativa} ed @`e usato per specificare delle
+alternative.  La @samp{|} ha la precedenza pi@`u bassa tra tutti gli operatori
+di espressioni regolari.  Per esempio, @samp{^P|[aeiouy]} individua tutte le
+stringhe corrispondenti a @samp{^P} oppure a @samp{[aeiouy]}.  Ci@`o significa
+che individua qualsiasi stringa che inizi con @samp{P} o contenga (in
+qualsiasi posizione al suo interno) una vocale inglese minuscola.
+
+L'alternativa si applica alle @dfn{regexp} pi@`u ampie individuabili in ogni
+lato.
+
+@cindex @code{()} (parentesi), operatore @dfn{regexp}
+@cindex parentesi (@code{()}), operatore @dfn{regexp}
+@item @code{(}@dots{}@code{)}
+Le parentesi sono usate per raggruppare, sia nelle espressioni regolari sia
+in quelle aritmetiche.  Si possono usare per concatenare espressioni regolari
+che contengono l'operatore alternativa, @samp{|}.  Per esempio,
+@samp{@@(samp|code)\@{[^@}]+\@}} individua sia @samp{@@code@{pippo@}} sia
+@samp{@@samp@{pluto@}}.
+(Queste sono sequenze in linguaggio Texinfo per controllare la formattazione.
+Il significato di @samp{+} @`e
+spiegato pi@`u avanti in questa lista.)
+
+@cindex @code{*} (asterisco), operatore @code{*}, come operatore @dfn{regexp}
+@cindex asterisco (@code{*}), operatore @code{*}, come operatore @dfn{regexp}
+@item @code{*}
+Questo simbolo richiede che la precedente espressione regolare sia
+ripetuta tante volte quanto serve per trovare una corrispondenza.  Per
+esempio, @samp{ph*} applica il simbolo
+@samp{*} al carattere @samp{h} che lo precede immediatamente e ricerca
+corrispondenze costituite da una @samp{p} seguita da un numero qualsiasi di
+@samp{h}.  Viene individuata anche solo la @samp{p}, se non ci sono
+@samp{h}.
+
+Ci sono due sfumature da capire sul funzionamento di @samp{*}.
+Primo, @samp{*} tiene conto solo del singolo componente dell'espressione
+regolare che lo precede (p.es., in @samp{ph*} vale solo per @samp{h}).
+Per fare s@`{@dotless{i}} che @samp{*} si applichi a una sottoespressione pi@`u estesa,
+occorre metterla tra parentesi:
+@samp{(ph)*} individua @samp{ph}, @samp{phph}, @samp{phphph} e cos@`{@dotless{i}} via.
+
+Secondo, @samp{*} trova quante pi@`u ripetizioni siano possibili.  Se il testo
+da ricercare @`e @samp{phhhhhhhhhhhhhhooey}, @samp{ph*} individua tutte le
+@samp{h}.
+
+@cindex @code{+} (pi@`u), operatore @dfn{regexp}
+@cindex pi@`u (@code{+}), operatore @dfn{regexp}
+@item @code{+}
+Questo simbolo @`e simile a @samp{*}, tranne per il fatto che l'espressione
+precedente deve essere trovata almeno una volta.  Questo significa che
+@samp{wh+y} individuerebbe @samp{why} e @samp{whhy}, ma non @samp{wy}, mentre
+@samp{wh*y} li troverebbe tutti e tre.
+
+@cindex @code{?} (punto interrogativo), operatore @dfn{regexp}
+@cindex punto interrogativo (@code{?}), operatore @dfn{regexp}
+@item @code{?}
+Questo simbolo @`e simile a @samp{*}, tranne per il fatto che l'espressione che
+precede pu@`o essere trovata una volta sola oppure non trovata
+affatto.  Per esempio, @samp{fe?d}
+individua @samp{fed} e @samp{fd}, ma nient'altro.
+
+@cindex espressioni di intervallo, (@dfn{regexp})
+@item @code{@{}@var{n}@code{@}}
+@itemx @code{@{}@var{n}@code{,@}}
+@itemx @code{@{}@var{n}@code{,}@var{m}@code{@}}
+Uno o due numeri tra parentesi graffe rappresentano una
+@dfn{espressione di intervallo}.
+Se c'@`e un numero tra graffe, la @dfn{regexp} precedente @`e ripetuta
+@var{n} volte.
+Se ci sono due numeri separati da una virgola, la @dfn{regexp} precedente @`e
+ripetuta da @var{n} a @var{m} volte.
+Se c'@`e un numero seguito da una virgola, allora la @dfn{regexp} precedente
+@`e ripetuta almeno @var{n} volte:
+
+@table @code
+@item wh@{3@}y
+Riconosce @samp{whhhy}, ma non @samp{why} o @samp{whhhhy}.
+
+@item wh@{3,5@}y
+Riconosce soltanto @samp{whhhy}, @samp{whhhhy}, o @samp{whhhhhy}.
+
+@item wh@{2,@}y
+Riconosce @samp{whhy}, @samp{whhhy} e cos@`{@dotless{i}} via.
+@end table
+@end table
+
+@cindex precedenza, operatori @dfn{regexp}
+@cindex espressioni regolari, operatori, precedenza degli
+Nelle espressioni regolari, gli operatori @samp{*}, @samp{+}, e @samp{?},
+come pure le parentesi graffe @samp{@{} e @samp{@}},
+hanno
+la precedenza pi@`u alta, seguite dalla concatenazione, e poi da
+@samp{|}.
+Come nell'algebra, le parentesi possono cambiare il raggruppamento degli
+operatori.
+
+@cindex POSIX @command{awk}, espressioni regolari e
+@cindex @command{gawk}, espressioni regolari, precedenza
+In POSIX @command{awk} e @command{gawk}, gli operatori @samp{*}, @samp{+}
+e @samp{?} rappresentano se stessi quando non c'@`e nulla prima di essi
+nella @dfn{regexp}.  Per esempio, @code{/+/} individua un semplice segno
+pi@`u.  Tuttavia, molte altre versioni di @command{awk} trattano una
+tale notazione come un errore di sintassi.
+
+@node Espressioni di intervallo
+@subsection Alcune note sulle espressioni di intervallo
+
+@cindex POSIX @command{awk}, espressioni di intervallo in
+Le espressioni di intervallo non erano tradizionalmente disponibili in
+@command{awk}.  Sono state aggiunte come parte dello standard POSIX per
+rendere @command{awk} ed @command{egrep} coerenti tra di loro.
+
+@cindex @command{gawk}, espressioni di intervallo e
+In passato, poich@'e vecchi programmi possono usare @samp{@{} e @samp{@}} in
+costanti @dfn{regexp},
+@command{gawk} @emph{non} riconosceva espressioni di intervallo
+nelle @dfn{regexp}.
+
+Comunque, a partire dalla @value{PVERSION} 4.0,
+@command{gawk} riconosce espressioni di intervallo per default.
+Ci@`o accade perch@'e la compatibilit@`a con POSIX @`e ritenuta pi@`u
+importante da molti utenti @command{gawk} rispetto alla compatibilit@`a con
+dei vecchi programmi.
+
+Per programmi che usano @samp{@{} e @samp{@}} in costanti @dfn{regexp},
+@`e buona pratica proteggerli sempre con una barra inversa.  Allora le
+costanti @dfn{regexp} sono valide e si comportano come desiderato, usando
+qualsiasi versione di @command{awk}.@footnote{@`E meglio usare due barre inverse
+se si sta usando una costante stringa con un operatore @dfn{regexp} o una
+funzione.}
+
+Infine, quando @samp{@{} e @samp{@}} appaiono in costanti @dfn{regexp}
+in un modo non interpretabile come espressione di intervallo
+(come in @code{/q@{a@}/}), allora sono prese letteralmente.
+
+Come detto sopra, le espressioni di intervallo non erano tradizionalmente
+disponibili in @command{awk}.  Con la versione di Marzo 2019 di
+BWK @command{awk} sono (finalmente) disponibili.
+
+Ciononostante, non essendo state disponibili per parecchi decenni,
+@command{gawk} continua a non renderle disponibili quando viene
+eseguito in modalit@`a compatibile (@pxref{Opzioni}).
+
+@node Espressioni tra parentesi quadre
+@section Usare espressioni tra parentesi quadre
+@cindex espressioni tra parentesi quadre
+@cindex espressioni tra parentesi quadre, espressioni di intervallo
+@cindex espressioni di intervallo, (@dfn{regexp})
+@cindex elenchi di caratteri in espressioni regolari
+@cindex caratteri, elenchi di, in espressioni regolari
+@cindex espressioni regolari, elenchi di caratteri in
+
+Come detto sopra, un'espressione tra parentesi quadre individua qualsiasi
+carattere incluso tra le parentesi quadre aperta e chiusa.
+
+All'interno di un'espressione tra parentesi quadre, una
+@dfn{espressione di intervallo} @`e formata da due caratteri separati da un
+trattino.  Individua ogni singolo carattere compreso tra i due caratteri,
+ordinati secondo l'insieme di caratteri in uso nel sistema.  Per esempio,
+@samp{[0-9]} equivale a @samp{[0123456789]}.
+(Si veda @ref{Intervalli e localizzazione} per una spiegazione di come
+lo standard POSIX e @command{gawk} sono cambiati nel corso degli anni.
+La cosa ha un interesse principalmente storico.)
+
+Con la crescente popolarit@`a dello
+@uref{http://www.unicode.org, standard di caratteri Unicode},
+c'@`e un'ulteriore dettaglio da tenere in conto. Le sequenze di
+protezione ottali ed esadecimali utilizzabili per inserire
+valori all'interno di espressioni tra parentesi quadre
+sono considerate contenere solo caratteri
+che occupano un unico byte (caratteri il cui valore stia
+nell'intervallo 0--256).  Per individuare un intervallo di
+caratteri in cui i punti di inizio e fine dell'intervello
+abbiano valori maggiori di 256, occorre immettere direttamente
+le codifiche multi-byte dei caratteri in questione.
+
+@cindex @code{\} (barra inversa), in espressioni tra parentesi quadre
+@cindex barra inversa (@code{\}), in espressioni tra parentesi quadre
+@cindex @code{^} (circonflesso), in espressioni tra parentesi quadre
+@cindex circonflesso (@code{^}), in espressioni tra parentesi quadre
+@cindex @code{-} (meno), in espressioni tra parentesi quadre
+@cindex meno (@code{-}), in espressioni tra parentesi quadre
+Per includere uno dei caratteri @samp{\}, @samp{]}, @samp{-}, o @samp{^} in
+un'espressione tra parentesi quadre, occorre inserire un @samp{\} prima del
+carattere stesso.  Per esempio:
+
+@example
+[d\]]
+@end example
+
+@noindent
+individua sia @samp{d} che @samp{]}.
+Inoltre, se si mette una @samp{]} subito dopo la
+@samp{[} aperta, la parentesi quadra chiusa @`e considerata come uno dei
+caratteri da individuare.
+
+@cindex POSIX @command{awk}, espressioni tra parentesi quadre e
+@cindex espressioni regolari estese (ERE)
+@cindex ERE (espressioni regolari estese)
+@cindex @command{egrep}, programma di utilit@`a
+@cindex programma di utilit@`a @command{egrep}
+L'utilizzo di @samp{\} nelle espressioni tra parentesi quadre
+@`e compatibile con altre implementazioni di @command{awk} ed @`e anche richiesto
+da POSIX.
+Le espressioni regolari in @command{awk} sono un insieme pi@`u esteso delle
+specificazioni POSIX per le espressioni regolari estese (ERE).
+Le ERE POSIX sono basate sulle espressioni regolari accettate dal
+tradizionale programma di utilit@`a @command{egrep}.
+
+@cindex espressioni tra parentesi quadre, classi di caratteri
+@cindex POSIX @command{awk}, espressioni tra parentesi quadre e, classi di caratteri
+Le @dfn{classi di caratteri} sono una funzionalit@`a introdotta nello standard
+POSIX.  Una classe di caratteri @`e una particolare notazione per descrivere
+liste di caratteri cha hanno un attributo specifico, ma i caratteri
+veri e propri possono variare da paese a paese e/o
+da insieme di caratteri a insieme di caratteri.  Per esempio, la nozione di
+cosa sia un carattere alfabetico @`e diversa tra gli Stati Uniti e la Francia.
+
+Una classe di caratteri @`e valida solo in una @dfn{regexp} @emph{contenuta}
+tra le parentesi quadre di un'espressione tra parentesi quadre.  Le classi di
+caratteri consistono di @samp{[:},
+una parola chiave che segnala la classe, e @samp{:]}.  La
+@ref{tabella-caratteri-classe} elenca le classi di caratteri definite dallo
+standard POSIX.
+
+@float Tabella,tabella-caratteri-classe
+@caption{classi di caratteri POSIX}
+@multitable @columnfractions .15 .85
+@headitem Classe @tab Significato
+@item @code{[:alnum:]} @tab Caratteri alfanumerici.
+@item @code{[:alpha:]} @tab Caratteri alfabetici.
+@item @code{[:blank:]} @tab Caratteri spazio e TAB.
+@item @code{[:cntrl:]} @tab Caratteri di controllo.
+@item @code{[:digit:]} @tab Caratteri numerici.
+@item @code{[:graph:]} @tab Caratteri che sono stampabili e visibili.
+(Uno @dfn{spazio} @`e stampabile ma non visibile, mentre una @samp{a} @`e l'uno e
+l'altro.)
+@item @code{[:lower:]} @tab Caratteri alfabetici minuscoli.
+@item @code{[:print:]} @tab Caratteri stampabili (caratteri che non sono
+caratteri di controllo).
+@item @code{[:punct:]} @tab Caratteri di punteggiatura (caratteri che non
+sono lettere, cifre, caratteri di controllo, o caratteri di spazio).
+@item @code{[:space:]} @tab Caratteri di spazio (ovvero: @dfn{spazio}, TAB, avanzamento riga (@dfn{newline}), ritorno a capo (@dfn{carriage return}), avanzamento pagina (@dfn{formfeed}) e tabulazione verticale)
+@item @code{[:upper:]} @tab Caratteri alfabetici maiuscoli.
+@item @code{[:xdigit:]} @tab Caratteri che sono cifre esadecimali.
+@end multitable
+@end float
+
+Per esempio, prima dello standard POSIX, si doveva scrivere
+@code{/[A-Za-z0-9]/} per individuare i
+caratteri alfanumerici.  Se l'insieme
+di caratteri in uso comprendeva altri caratteri alfabetici, l'espressione
+non li avrebbe individuati.
+Con le classi di caratteri POSIX si pu@`o scrivere
+@code{/[[:alnum:]]/} per designare i caratteri alfabetici e numerici
+dell'insieme di caratteri in uso.
+
+@ignore
+From eliz@gnu.org  Fri Feb 15 03:38:41 2019
+Date: Fri, 15 Feb 2019 12:38:23 +0200
+From: Eli Zaretskii <eliz@gnu.org>
+To: arnold@skeeve.com
+CC: pengyu.ut@gmail.com, bug-gawk@gnu.org
+Subject: Re: [bug-gawk] Does gawk character classes follow this?
+
+> From: arnold@skeeve.com
+> Date: Fri, 15 Feb 2019 03:01:34 -0700
+> Cc: pengyu.ut@gmail.com, bug-gawk@gnu.org
+> 
+> I get the feeling that there's something really bothering you, but
+> I don't understand what.
+> 
+> Can you clarify, please?
+
+I thought I already did: we cannot be expected to provide a definitive
+description of what the named classes stand for, because the answer
+depends on various factors out of our control.
+@end ignore
+
+@c Thanks to
+@c Date: Tue, 01 Jul 2014 07:39:51 +0200
+@c From: Hermann Peifer <peifer@gmx.eu>
+Alcuni programmi di utilit@`a che cercano espressioni regolari prevedono
+una classe di caratteri, non standard,
+@samp{[:ascii:]}; @command{awk} non la prevede.  Tuttavia, @`e possibile ottenere
+lo stesso risultato utilizzando @samp{[\x00-\x7F]}.  Quest'espressione
+individua tutti i valori numerici tra zero e 127, che @`e l'intervallo definito
+dell'insieme di caratteri ASCII.  Usando una lista di caratteri che esclude
+(@samp{[^\x00-\x7F]}) si individuano tutti i caratteri mono-byte che non
+sono nell'intervallo ASCII.
+
+@quotation NOTA
+Alcune vecchie versioni Unix di @command{awk}
+trattano @code{[:blank:]} come @code{[:space:]}, individuando quindi
+pi@`u caratteri del dovuto.  Caveat Emptor! [Stia in guardia il compratore!].
+@end quotation
+
+@cindex espressioni tra parentesi quadre, elementi di collazione
+@cindex espressioni tra parentesi quadre, non-ASCII
+@cindex elementi di collazione
+In espressioni tra parentesi quadre possono apparire due ulteriori sequenze
+speciali.  Riguardano insiemi di caratteri non-ASCII, che possono avere
+simboli singoli (chiamati @dfn{elementi di collazione}) che sono rappresentati
+con pi@`u di un carattere.  Possono designare anche parecchi caratteri che sono
+equivalenti tra loro ai fini della @dfn{collazione}, o dell'ordinamento.
+(Per esempio, in francese, la semplice ``e'' e la sua versione con accento grave ``@`e''
+sono equivalenti).  Queste sequenze sono:
+
+@table @asis
+@cindex espressioni tra parentesi quadre, elementi di collazione
+@cindex elementi di collazione
+@item elementi di collazione
+Elementi di collazione multi-byte racchiusi fra
+@samp{[.} e @samp{.]}.  Per esempio, se @samp{ch} @`e un elemento di collazione,
+@samp{[[.ch.]]} @`e una @dfn{regexp} che individua questo elemento di
+collazione, mentre @samp{[ch]} @`e una @dfn{regexp} che individua le lettere
+@samp{c} o @samp{h}.
+
+@cindex espressioni tra parentesi quadre, classi di equivalenza
+@item classi di equivalenza
+Sono nomi, specifici a una particolare localizzazione, per una lista di
+caratteri equivalenti tra loro.  Il nome @`e racchiuso fra
+@samp{[=} e @samp{=]}.
+Per esempio, il nome @samp{e} potrebbe essere usato per designare
+``e'', ``@^e'', ``@`e'', e ``@'e''. In questo caso, @samp{[[=e=]]} @`e una @dfn{regexp}
+che corrisponde a @samp{e}, @samp{@^e}, @samp{@`e} e @samp{@'e}.
+@end table
+
+Queste funzionalit@`a sono molto utili in localizzazioni non inglesi.
+
+@cindex internazionalizzazione, localizzazione, classi di caratteri
+@cindex @command{gawk}, classi di caratteri e
+@cindex POSIX @command{awk}, espressioni tra parentesi quadre e, classi di caratteri
+@quotation ATTENZIONE
+Le funzioni di libreria che @command{gawk} usa per individuare le espressioni
+regolari per ora riconoscono solo le classi di caratteri POSIX;
+non riconoscono simboli di collazione o classi di equivalenza.
+@end quotation
+@c maybe one day ...
+
+In un'espressione tra parentesi quadre, una parentesi aperta (@samp{[})
+che non costituisca l'inizio della specificazione di una classe di
+caratteri, di simboli di collazione o di una classe di equivalenza
+@`e interpretata letteralmente.  Questo vale anche per @samp{.} e @samp{*}.
+
+@node Pi@`u lungo da sinistra
+@section Quanto @`e lungo il testo individuato?
+
+@cindex espressioni regolari, corrispondenza pi@`u a sinistra
+@c @cindex matching, leftmost longest
+Si consideri il caso seguente:
+
+@example
+echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'
+@end example
+
+Questo esempio usa la funzione @code{sub()} per modificare il record in input.
+(@code{sub()} sostituisce la prima ricorrenza in ogni testo individuato dal
+primo argomento con la stringa fornita come secondo argomento;
+@pxref{Funzioni per stringhe}.)  Qui, la @dfn{regexp} @code{/a+/} richiede
+``uno o pi@`u caratteri @samp{a},'' e il testo da sostituire @`e @samp{<A>}.
+
+L'input contiene quattro caratteri @samp{a}.
+Le espressioni regolari @command{awk} (e POSIX) individuano sempre
+la sequenza @emph{pi@`u lunga}, partendo da sinistra, di caratteri in input che
+corrispondono.  Quindi, tutti e quattro i caratteri @samp{a} sono
+rimpiazzati con @samp{<A>} in questo esempio:
+
+@example
+$ @kbd{echo aaaabcd | awk '@{ sub(/a+/, "<A>"); print @}'}
+@print{} <A>bcd
+@end example
+
+Per semplici test corrisponde/non corrisponde, la cosa ha poca importanza.
+Ma se si sta controllando un testo o si fanno sostituzioni usando le funzioni
+@code{match()}, @code{sub()}, @code{gsub()} e @code{gensub()},
+@`e invece molto importante.
+@ifinfo
+@xref{Funzioni per stringhe},
+Per maggiori informazioni su queste funzioni.
+@end ifinfo
+Tenere in conto questo principio @`e importante anche quando si suddividono
+record e campi usando delle @dfn{regexp} (@pxref{Record},
+e anche @pxref{Separatori di campo}).
+
+@node Espressioni regolari calcolate
+@section Usare @dfn{regexp} dinamiche
+
+@cindex espressioni regolari calcolate
+@cindex espressioni regolari dinamiche
+@cindex @code{~} (tilde), operatore @code{~}
+@cindex tilde (@code{~}), operatore @code{~}
+@cindex @code{!} (punto esclamativo), operatore @code{!~}
+@cindex punto esclamativo (@code{!}), operatore @code{!~}
+@c @cindex operators, @code{~}
+@c @cindex operators, @code{!~}
+L'espressione a destra di un operatore @samp{~} o @samp{!~} non deve
+necessariamente essere una costante @dfn{regexp} (cio@`e, una stringa di
+caratteri tra barre).  Pu@`o essere una qualsiasi
+espressione.  L'espressione @`e valutata e convertita in una stringa
+se necessario; il contenuto della stringa @`e poi usato come una @dfn{regexp}.
+Una @dfn{regexp} calcolata in questo modo @`e detta una @dfn{regexp dinamica}
+o una @dfn{regexp calcolata}:
+
+@example
+BEGIN @{ @dfn{regexp}_numerica = "[[:digit:]]+" @}
+$0 ~ @dfn{regexp}_numerica    @{ print @}
+@end example
+
+@noindent
+Questo @dfn{script} imposta @code{regexp_numerica} come una @dfn{regexp} che
+descrive una o pi@`u cifre, e poi controlla se un record in input corrisponde a
+questa regexp.
+
+@quotation NOTA
+Usando gli operatori @samp{~} e @samp{!~}, si tenga presente che c'@`e
+una differenza tra una costante @dfn{regexp} racchiusa tra barre e una
+costante stringa racchiusa tra doppi apici.
+Se si intende utilizzare una costante stringa, occorre comprendere che
+la stringa @`e, in sostanza, scandita @emph{due volte}: la prima volta quando
+@command{awk} legge il programma, e la seconda volta quando va a
+confrontare la stringa a sinistra dell'operatore con il modello che sta
+alla sua destra.  Questo vale per ogni espressione (come la
+@code{regexp_numerica}, vista nel precedente esempio), non solo per le
+costanti stringa.
+@end quotation
+
+@cindex costanti @dfn{regexp}, barre vs.@: doppi apici
+@cindex @code{\} (barra inversa), in costanti @dfn{regexp}
+@cindex barra inversa (@code{\}), in costanti @dfn{regexp}
+@cindex @code{"} (doppio apice), in costanti @dfn{regexp}
+@cindex doppio apice (@code{"}), in costanti @dfn{regexp}
+Che differenza fa la doppia scansione di una stringa?
+La risposta ha a che vedere con le sequenze di protezione e particolarmente
+con le barre inverse.  Per inserire una barra inversa in un'espressione
+regolare all'interno di una stringa, occorre inserire @emph{due} barre
+inverse.
+
+Per esempio, @code{/\*/} @`e una costante @dfn{regexp} per designare un @samp{*}
+letterale.
+@`E richiesta una sola barra inversa.  Per fare lo stesso con una stringa,
+occorre immettere @code{"\\*"}.  La prima barra inversa protegge la
+seconda in modo che la stringa in realt@`a contenga i
+due caratteri @samp{\} e @samp{*}.
+
+@cindex risoluzione di problemi, costanti @dfn{regexp} vs.@: costanti stringa
+@cindex problemi, risoluzione di, costanti @dfn{regexp} vs.@: costanti stringa
+@cindex costanti @dfn{regexp}, vs.@: costanti stringa
+@cindex costanti stringa, vs.@: costanti @dfn{regexp}
+Dato che si possono usare sia costanti @dfn{regexp} che costanti stringa per
+descrivere espressioni regolari, qual @`e da preferire?  La risposta @`e
+``costanti @dfn{regexp}'', per molti motivi:
+
+@itemize @value{BULLET}
+@item
+Le costanti stringa sono pi@`u complicate da scrivere e pi@`u difficili
+da leggere.  Usare costanti @dfn{regexp} rende i programmi
+meno inclini all'errore.  Non comprendere la differenza tra i due tipi di
+costanti @`e una fonte frequente di errori.
+
+@item
+@`E pi@`u efficiente usare costanti @dfn{regexp}. @command{awk} pu@`o accorgersi
+che @`e stata fornita una @dfn{regexp} e memorizzarla internamente in una forma
+che rende la ricerca di corrispondenze pi@`u efficiente.  Se si usa una costante
+stringa, @command{awk} deve prima convertire la stringa nel suo formato
+interno e quindi eseguire la ricerca di corrispondenze.
+
+@item
+Usare costanti @dfn{regexp} @`e la forma migliore; lascia comprendere
+chiaramente che si vuole una corrispondenza con una @dfn{regexp}.
+@end itemize
+
+@sidebar Usare @code{\n} in espressioni tra parentesi quadre in @dfn{regexp} dinamiche
+@cindex espressioni regolari dinamiche, contenenti dei ritorni a capo
+@cindex ritorno a capo, in @dfn{regexp} dinamiche
+
+Alcune delle prime versioni di @command{awk} non consentono di usare il
+carattere di ritorno a capo
+all'interno di un'espressione tra parentesi quadre in @dfn{regexp}
+dinamiche:
+
+@example
+$ @kbd{awk '$0 ~ "[ \t\n]"'}
+@error{} awk: newline in character class [
+@error{} ]...
+@error{}  source line number 1
+@error{}  context is
+@error{}        $0 ~ "[ >>>  \t\n]" <<<
+@end example
+
+@cindex ritorno a capo, in costanti @dfn{regexp}
+Ma un ritorno a capo in una costante @dfn{regexp} non d@`a alcun problema:
+
+@example
+$ @kbd{awk '$0 ~ /[ \t\n]/'}
+@kbd{ecco una riga di esempio}
+@print{} ecco una riga di esempio
+@kbd{Ctrl-d}
+@end example
+
+@command{gawk} non ha questo problema, e non dovrebbe accadere spesso
+in pratica, ma val la pena di notarlo a futura memoria.
+@end sidebar
+
+@node Operatori di @dfn{regexp} GNU
+@section Operatori @dfn{regexp} propri di @command{gawk}
+
+@c This section adapted (long ago) from the regex-0.12 manual
+
+@cindex espressioni regolari, operatori, @command{gawk}
+@cindex @command{gawk}, espressioni regolari, operatori
+@cindex operatori, specifici per GNU
+@cindex espressioni regolari, operatori, per parole
+@cindex parola, definizione in @dfn{regexp}
+Il software GNU che ha a che fare con espressioni regolari comprende alcuni
+operatori @dfn{regexp} aggiuntivi.  Questi
+operatori sono descritti in
+@ifnotinfo
+questa
+@end ifnotinfo
+@ifinfo
+questo
+@end ifinfo
+@value{SECTION} e sono specificamente
+per @command{gawk}; non sono disponibili in altre implementazioni di
+@command{awk}.
+La maggior parte degli operatori aggiuntivi riguarda l'identificazione di
+parole.  Ai nostri fini, una @dfn{parola} @`e una sequenza di uno o pi@`u lettere,
+cifre, o trattini bassi (@samp{_}):
+
+@table @code
+@c @cindex operatori, @code{\s} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\s}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\s}, operatore (@command{gawk})
+@item \s
+Corrisponde a ogni carattere bianco.
+Lo si pu@`o pensare come un'abbreviazione di
+@w{@samp{[[:space:]]}}.
+
+@c @cindex operatori, @code{\S} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\S}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\S}, operatore (@command{gawk})
+@item \S
+Corrisponde a ogni carattere che non @`e uno spazio bianco.
+Lo si pu@`o pensare come un'abbreviazione di
+@w{@samp{[^[:space:]]}}.
+
+@c @cindex operatori, @code{\w} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\w}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\w}, operatore (@command{gawk})
+@item \w
+Corrisponde a ogni carattere che componga una parola; ovvero, corrisponde a
+ogni lettera, cifra, o trattino basso.
+Lo si pu@`o pensare come un'abbreviazione di
+@w{@samp{[[:alnum:]_]}}.
+
+@c @cindex operatori, @code{\W} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\W}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\W}, operatore (@command{gawk})
+@item \W
+Corrisponde a ogni carattere che non @`e parte di una parola.
+Lo si pu@`o pensare come un'abbreviazione di
+@w{@samp{[^[:alnum:]_]}}.
+
+@c @cindex operatori, @code{\<} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\<}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\<}, operatore (@command{gawk})
+@item \<
+Individua la stringa nulla all'inizio di una parola.
+Per esempio, @code{/\<via/} individua @samp{via} ma non
+@samp{funivia}.
+
+@c @cindex operatori, @code{\>} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\>}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\>}, operatore (@command{gawk})
+@item \>
+Individua la stringa nulla alla fine di una parola.
+Per esempio, @code{/via\>/} individua @samp{via} ma non @samp{viadotto}.
+
+@c @cindex operatori, @code{\y} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\y}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\y}, operatore (@command{gawk})
+@cindex limite-di-parola, individuare il
+@item \y
+Individua la stringa nulla o alla fine o all'inizio di una parola.
+(cio@`e, il limite di una parola - @dfn{boundar@strong{y}} in inglese).
+Per esempio, @samp{\yradar?\y}
+individua sia @samp{rada} che @samp{radar}, come parole separate.
+
+@c @cindex operatori, @code{\B} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\B}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\B}, operatore (@command{gawk})
+@item \B
+Individua la stringa nulla che ricorre all'interno di una parola.
+Per esempio,
+@code{/\Bora\B/} individua @samp{Colorado}, ma non individua @samp{che ora @`e}.
+@samp{\B} @`e essenzialmente l'opposto di @samp{\y}.
+@end table
+
+@cindex buffer, operatori per
+@cindex espressioni regolari, operatori, per buffer
+@cindex operatori, ricerca in stringhe, per buffer
+Ci sono due altri operatori che operano sui buffer.  In Emacs un
+@dfn{buffer} @`e, naturalmente, un buffer di Emacs.  In altri programmi GNU,
+fra cui @command{gawk}, le routine di libreria delle @dfn{regexp} considerano
+come buffer l'intera stringa su cui effettuare il confronto.
+Gli operatori sono:
+
+@table @code
+@item \`
+@c @cindex operatori, @code{\`} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\`}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\`}, operatore (@command{gawk})
+Individua la stringa nulla che occorre all'inizio di un buffer
+(di una stringa)
+
+@c @cindex operatori, @code{\'} (@command{gawk})
+@cindex barra inversa (@code{\}), @code{\'}, operatore (@command{gawk})
+@cindex @code{\} (barra inversa), @code{\'}, operatore (@command{gawk})
+@item \'
+Individua la stringa nulla che occorre alla fine di un buffer
+(di una stringa)
+@end table
+
+@cindex @code{^} (circonflesso), operatore @dfn{regexp}
+@cindex circonflesso (@code{^}), operatore @dfn{regexp}
+@cindex @code{?} (punto interrogativo), operatore @dfn{regexp}
+@cindex punto interrogativo (@code{?}), operatore @dfn{regexp}
+Poich@'e @samp{^} e @samp{$} si riferiscono sempre all'inizio e alla
+fine di stringhe, questi operatori non aggiungono nuove funzionalit@`a
+ad @command{awk}.  Sono inclusi per compatibilit@`a con altro
+software GNU.
+
+@cindex @command{gawk}, operatore limite-di-parola
+@cindex limite-di-parola, operatore (@command{gawk})
+@cindex operatori, limite-di-parola (@command{gawk})
+In altro software GNU, l'operatore di limite-di-parola @`e @samp{\b}.  Questo,
+comunque, @`e in conflitto con la definizione, nel linguaggio @command{awk},
+di @samp{\b} come
+backspace, quindi @command{gawk} usa una lettera differente.
+Un metodo alternativo sarebbe stato di richiedere due barre inverse negli
+operatori GNU, ma questo @`e stato ritenuto troppo arzigogolato.  Il metodo
+corrente di usare @samp{\y} al posto del @samp{\b} di GNU sembra essere
+il male minore.
+
+@cindex espressioni regolari, @command{gawk}, opzioni sulla riga di comando
+@cindex @command{gawk}, opzioni sulla riga di comando, ed espressioni regolari
+Le varie opzioni sulla riga di comando
+(@pxref{Opzioni})
+controllano come @command{gawk} interpreta i caratteri nelle @dfn{regexp}:
+
+@table @asis
+@item Nessuna opzione
+Per default, @command{gawk} fornisce tutte le funzionalit@`a delle
+regexp POSIX e gli
+operatori @dfn{regexp} GNU
+@ifnotinfo
+predecentemente descritti.
+@end ifnotinfo
+@ifnottex
+@ifnotdocbook
+Sono descritti
+in @ref{Operatori di espressioni regolari}.
+@end ifnotdocbook
+@end ifnottex
+
+@item @code{--posix}
+Sono ammesse solo le @dfn{regexp} POSIX; gli operatori GNU non sono
+speciali (p.es., @samp{\w} individua una semplice lettera @samp{w}).
+Le espressioni di intervallo sono ammesse.
+
+@cindex Brian Kernighan, @command{awk} di
+@item @code{--traditional}
+Le @dfn{regexp} Unix tradizionali di @command{awk} sono ammesse.  Gli
+operatori GNU non sono speciali, e le espressioni
+di intervallo non sono ammesse.
+Le classi di caratteri POSIX (@samp{[[:alnum:]]}, etc.) sono ammesse,
+poich@'e BWK @command{awk} le prevede.
+I caratteri descritti usando sequenze di protezione ottali ed esadecimali sono
+trattati letteralmente, anche se rappresentano metacaratteri di @dfn{regexp}.
+
+@item @code{--re-interval}
+Sono consentite espressioni di intervallo in @dfn{regexp},
+se @option{--traditional} @`e stata specificata.
+Altrimenti, le espressioni di intervallo sono disponibili per default.
+@end table
+
+@node Maiuscolo-Minuscolo
+@section Fare confronti ignorando maiuscolo/minuscolo
+
+@cindex espressioni regolari, maiuscolo/minuscolo
+@cindex @dfn{regexp}, maiuscolo/minuscolo
+@cindex maiuscolo/minuscolo e @dfn{regexp}
+Il tipo di carattere (maiuscolo/minuscolo) @`e normalmente rilevante nelle
+espressioni regolari, sia nella ricerca di
+caratteri normali (cio@`e, non metacaratteri), sia all'interno di espressioni
+fra parentesi.  Quindi, una @samp{w} in un'espressione regolare individua
+solo una @samp{w} e non la corrispondente maiuscola @samp{W}.
+
+Il modo pi@`u semplice per richiedere una ricerca non sensibile al
+maiuscolo/minuscolo @`e di usare un'espressione tra parentesi quadre, per
+esempio @samp{[Ww]}.  Comunque, questo pu@`o essere pesante se si usa spesso,
+e pu@`o rendere le espressioni regolari di difficile lettura.
+Ci sono due alternative che potrebbero essere preferibili.
+
+Un modo per fare un confronto non sensibile a maiuscolo/minuscolo in un
+particolare punto del programma
+@`e di convertire i dati in un solo tipo (o minuscole o maiuscole),
+usando le funzioni di stringa
+predefinite @code{tolower()} o @code{toupper()} (che non
+abbiamo ancora introdotto;
+@pxref{Funzioni per stringhe}).
+Per esempio:
+
+@example
+tolower($1) ~ /foo/  @{ @dots{} @}
+@end example
+
+@noindent
+converte il primo campo in minuscole, prima di fare un confronto.
+Questo funziona in ogni @command{awk} conforme allo standard POSIX.
+
+@cindex @command{gawk}, espressioni regolari, differenza maiuscolo/minuscolo
+@cindex distinzione maiuscolo/minuscolo, @command{gawk}
+@cindex differenze tra @command{awk} e @command{gawk}, espressioni regolari
+@cindex @code{~} (tilde), operatore @code{~}
+@cindex tilde (@code{~}), operatore @code{~}
+@cindex @code{!} (punto esclamativo), operatore @code{!~}
+@cindex punto esclamativo (@code{!}), operatore @code{!~}
+@cindex @code{IGNORECASE}, variabile, con operatori @code{~} e @code{!~}
+@cindex @command{gawk}, variabile @code{IGNORECASE} in
+@c @cindex variables, @code{IGNORECASE}
+Un altro metodo, proprio di @command{gawk}, @`e di impostare la variabile
+@code{IGNORECASE} a un valore diverso da zero (@pxref{Variabili predefinite}).
+Quando @code{IGNORECASE} @`e diverso da zero, @emph{tutte} le operazioni con
+regexp e stringhe ignorano la distinzione maiuscolo/minuscolo.
+
+Il cambio del valore di @code{IGNORECASE} controlla dinamicamente la
+sensibilit@`a a maiuscolo/minuscolo del programma quando @`e in esecuzione.
+Il tipo di carattere (maiuscolo/minuscolo) @`e rilevante per default,
+poich@'e @code{IGNORECASE} (come la maggior parte delle variabili) @`e
+inizializzata a zero:
+
+@example
+x = "aB"
+if (x ~ /ab/) @dots{}   # questo test non risulter@`a verificato
+
+IGNORECASE = 1
+if (x ~ /ab/) @dots{}   # adesso sar@`a verificato
+@end example
+
+In generale, non @`e possibile usare @code{IGNORECASE} per rendere certe regole
+non sensibili a maiuscolo/minuscolo e altre regole invece s@`{@dotless{i}}, perch@'e non c'@`e
+una maniera diretta per impostare
+@code{IGNORECASE} solo per l'espressione di
+una particolare regola.@footnote{Programmatori esperti in C e C++ noteranno
+che questo @`e possible, usando qualcosa come
+@samp{IGNORECASE = 1 && /foObAr/ @{ @dots{} @}}
+e
+@samp{IGNORECASE = 0 || /foobar/ @{ @dots{} @}}.
+Comunque, questo @`e un po' tortuoso e non @`e raccomandato.}
+Per fare questo, si usino espressioni tra parentesi quadre oppure
+@code{tolower()}.  Comunque, una cosa che si pu@`o fare con @code{IGNORECASE}
+soltanto @`e di utilizzare o di ignorare la sensibilit@`a a maiuscolo/minuscolo
+per tutte le regole contemporaneamente.
+
+@code{IGNORECASE} @`e impostabile dalla riga di comando o in una regola
+@code{BEGIN} (@pxref{Altri argomenti}; e
+@pxref{Usare BEGIN/END}).
+Impostare @code{IGNORECASE} dalla riga di comando @`e un modo per rendere
+un programma insensibile a maiuscolo/minuscolo senza doverlo modificare.
+
+@c @cindex ISO 8859-1
+@c @cindex ISO Latin-1
+In localizzazioni multibyte, le equivalenze tra caratteri maiuscoli
+e minuscoli sono controllate usando i valori in formato esteso
+dell'insieme di caratteri della localizzazione.
+Prima della @value{PVERSION} 5.0, i caratteri che usano un solo byte
+erano confrontati usando l'insieme di caratteri ISO-8859-1 (ISO Latin-1).
+Tuttavia, a partire dalla @value{PVERSION} 5.0, i caratteri che usano
+un solo byte sono confrontati usando anche i valori dell'insieme di
+caratteri della localizzazione.@footnote{Se questo sembra oscuro,
+non c'@`e ragione di preoccuparsi; significa solo che @command{gawk} fa
+la cosa giusta.}
+
+Il valore di @code{IGNORECASE} non ha effetto se @command{gawk} @`e in
+modalit@`a compatibile (@pxref{Opzioni}).
+Il tipo di carattere (maiuscolo o minuscolo) @`e sempre rilevante in modalit@`a
+compatibile.
+
+@node Sommario espressioni regolari
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+Le espressioni regolari descrivono insiemi di stringhe da confrontare.
+In @command{awk}, le costanti @dfn{regexp} sono scritte racchiuse
+fra barre: @code{/}@dots{}@code{/}.
+
+@item
+Le costanti @dfn{regexp} possono essere usate da sole in modelli di ricerca e
+in espressioni condizionali, o come parte di espressioni di ricerca
+usando gli operatori @samp{~} e @samp{!~}.
+
+@item
+Le sequenze di protezione consentono di rappresentare caratteri non stampabili
+e consentono anche di rappresentare metacaratteri @dfn{regexp} come caratteri
+letterali per i quali cercare corrispondenze.
+
+@item
+Gli operatori @dfn{regexp} consentono raggruppamento, alternativa e
+ripetizione.
+
+@item
+Le espressioni tra parentesi quadre sono delle notazioni abbreviate per
+specificare insiemi di caratteri che possono avere corrispondenze in un
+punto particolare di una @dfn{regexp}.
+All'interno di espressioni tra parentesi quadre, le classi di caratteri POSIX
+consentono di specificare certi gruppi di caratteri in maniera indipendente
+dalla localizzazione.
+
+@item
+Le espressioni regolari individuano il testo pi@`u lungo possibile, a partire
+da sinistra nella stringa in esame.  Questo ha importanza nei casi in cui
+serve conoscere la lunghezza della corrispondenza, come nella sostituzione di
+testo e quando il separatore di record sia una @dfn{regexp}.
+
+@item
+Espressioni di ricerca possono usare @dfn{regexp} dinamiche, ossia, i valori
+delle stringhe sono considerato come espressioni regolari.
+
+@item
+La variabile @command{gawk} @code{IGNORECASE} consente di controllare la
+differenza maiuscolo/minuscolo nel confronto mediante @dfn{regexp}.  In altre
+versioni di @command{awk}, vanno usate invece le funzioni @code{tolower()} o
+@code{toupper()}.
+
+@end itemize
+
+@node Leggere file
+@chapter Leggere file in input
+
+@cindex leggere file in input
+@cindex file in input, leggere
+@cindex file in input
+@cindex @code{FILENAME}, variabile
+@cindex variabile @code{FILENAME}
+Nel tipico programma @command{awk},
+@command{awk} legge tutto l'input sia dallo standard input
+(per default @`e la tastiera, ma spesso @`e una @dfn{pipe} da un altro comando)
+o da file i cui nomi vengono specificati sulla riga di comando di
+@command{awk}.  Se si specificano file in input, @command{awk} li legge
+nell'ordine, elaborando tutti i dati di uno prima di passare al successivo.
+Il nome del file in input corrente si trova nella variabile predefinita
+@code{FILENAME}
+(@pxref{Variabili predefinite}).
+
+@cindex record
+@cindex campi
+L'input @`e letto in unit@`a chiamate @dfn{record}, e viene elaborato, secondo le
+regole del programma, un record alla volta.
+Per default, ogni record @`e una riga.  Ogni
+record @`e suddiviso automaticamente in "pezzi" chiamati @dfn{campi}.
+Questo rende pi@`u pratico far lavorare i programmi sulle parti di un record.
+
+@cindex @code{getline}, comando
+In rare occasioni, si potrebbe aver bisogno di usare il comando
+@code{getline}. Il comando  @code{getline} @`e utile sia perch@'e pu@`o procurare
+un input esplicito da un numero indeterminato di file, sia perch@'e non vanno
+specificati sulla riga di comando di @command{awk} i nomi dei file usati con
+getline (@pxref{Getline}).
+
+@menu
+* Record::                           Controllare come i dati sono suddivisi
+                                     in record.
+* Campi::                            Un'introduzione ai campi.
+* Campi non costanti::               Numeri di campo variabili.
+* Cambiare i campi::                 Cambiare il contenuto di un campo.
+* Separatori di campo::              I separatori di campo, e come
+                                     cambiarli.
+* Dimensione costante::              Leggere campi di larghezza costante.
+* Separazione in base al contenuto:: Definire campi dal loro contenuto.
+* Controllare la creazione di campi:: Controllare come @command{gawk} sta
+                                     dividendo i record.
+* Righe multiple::                   Leggere record che sono su pi@`u righe.
+* Getline::                          Leggere file sotto il controllo del
+                                     programma, usando la funzione
+                                     @code{getline}.
+* Timeout in lettura::               Leggere input entro un tempo limite.
+* Proseguire dopo errore in input::  Elaborare ulteriore input dopo certi
+                                     errori di I/O.
+* Directory su riga di comando::     Cosa succede mettendo una directory
+                                     sulla riga di comando.
+* Sommario di Input::                Sommario di Input.
+* Esercizi su Input::                Esercizi.
+@end menu
+
+@node Record
+@section Controllare come i dati sono suddivisi in record
+
+@cindex input, suddividere in record
+@cindex record, suddividere l'input in
+@cindex @code{NR}, variabile
+@cindex @code{FNR}, variabile
+@command{awk} suddivide l'input per il programma in record e campi.
+Tiene traccia del numero di record gi@`a letti dal
+file in input corrente.  Questo valore @`e memorizzato in una variabile
+predefinita chiamata @code{FNR} che @`e reimpostata a zero ogni volta che si
+inizia un nuovo file.  Un'altra variabile predefinita, @code{NR}, registra il
+numero totale di record in input gi@`a letti da tutti i @value{DF}.
+Il suo valore iniziale @`e zero ma non viene mai reimpostata a zero
+automaticamente.
+
+I record sono normalmente separati dal carattere di avanzamento riga
+(@dfn{newline}).  @`E possibile specificare come vanno separati i record
+assegnando un valore alla variabile predefinita @code{RS}.
+Se il valore di @code{RS} @`e costituto da un solo carattere, @`e quello
+il carattere che fa da separatore fra i record.
+Altrimenti (in @command{gawk}), @code{RS} @`e valutata come espressione
+regolare.  Questo meccanismo @`e spiegato pi@`u in dettaglio qui sotto.
+
+@menu
+* awk divisione record::       Come @command{awk} standard divide i record.
+* gawk divisione record::      Come @command{gawk} divide i record.
+@end menu
+
+@node awk divisione record
+@subsection Come @command{awk} standard divide i record.
+
+@cindex separatori di record
+@cindex record, separatori di
+I record sono separati da un carattere chiamato @dfn{separatore di record}.
+Per default, il separatore di record @`e il carattere di ritorno a capo.
+Questo @`e il motivo per cui i record sono, per default, righe singole.
+Per usare un diverso carattere come separatore di record
+basta assegnare quel carattere alla variabile predefinita @code{RS}.
+
+@cindex separatore di record, ritorno a capo come
+@cindex ritorno a capo, come separatore di record
+@cindex a capo, come separatore di record
+@cindex @code{RS}, variabile
+Come per ogni altra variabile,
+il valore di @code{RS} pu@`o essere cambiato nel programma @command{awk}
+con l'operatore di assegnamento, @samp{=}
+(@pxref{Operatori di assegnamento}).
+Il nuovo separatore di record dovrebbe essere racchiuso tra doppi apici,
+per indicare una costante di stringa.  Spesso il momento giusto per far questo
+@`e all'inizio dell'esecuzione, prima che sia elaborato qualsiasi input,
+in modo che il primo record sia letto col separatore appropriato.
+Per far ci@`o, si usa il criterio speciale @code{BEGIN}
+(@pxref{BEGIN/END}).
+Per esempio:
+
+@example
+awk 'BEGIN @{ RS = "u" @}
+     @{ print $0 @}' mail-list
+@end example
+
+@noindent
+cambia il valore di @code{RS} in @samp{u}, prima di leggere qualsiasi input.
+Il nuovo valore @`e una stringa il cui primo carattere @`e la lettera ``u''; come
+risultato, i record sono separati dalla lettera ``u''.  Poi viene letto il
+file in input, e la seconda regola nel programma @command{awk} (l'azione
+eseguita se non si specifica un criterio)
+stampa ogni record.  Poich@'e ogni istruzione @code{print} aggiunge
+un ritorno a capo alla fine del suo output, questo programma
+@command{awk} copia l'input con ogni @samp{u} trasformato in un
+ritorno a capo.
+Qui vediamo il risultato dell'esecuzione del programma sul file
+@file{mail-list}:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{ RS = "u" @}}
+>      @kbd{@{ print $0 @}' mail-list}
+@end group
+@print{} Amelia       555-5553     amelia.zodiac
+@print{} sq
+@print{} e@@gmail.com    F
+@print{} Anthony      555-3412     anthony.assert
+@print{} ro@@hotmail.com   A
+@print{} Becky        555-7685     becky.algebrar
+@print{} m@@gmail.com      A
+@print{} Bill         555-1675     bill.drowning@@hotmail.com       A
+@print{} Broderick    555-0542     broderick.aliq
+@print{} otiens@@yahoo.com R
+@print{} Camilla      555-2912     camilla.inf
+@print{} sar
+@print{} m@@skynet.be     R
+@print{} Fabi
+@print{} s       555-1234     fabi
+@print{} s.
+@print{} ndevicesim
+@print{} s@@
+@print{} cb.ed
+@print{}     F
+@print{} J
+@print{} lie        555-6699     j
+@print{} lie.perscr
+@print{} tabor@@skeeve.com   F
+@print{} Martin       555-6480     martin.codicib
+@print{} s@@hotmail.com    A
+@print{} Sam
+@print{} el       555-3430     sam
+@print{} el.lanceolis@@sh
+@print{} .ed
+@print{}         A
+@print{} Jean-Pa
+@print{} l    555-2127     jeanpa
+@print{} l.campanor
+@print{} m@@ny
+@print{} .ed
+@print{}      R
+@print{}
+@end example
+
+@noindent
+Si noti che la voce relativa al nome @samp{Bill} non @`e divisa.
+Nel @value{DF} originale
+(@pxref{File dati di esempio}),
+la riga appare in questo modo:
+
+@example
+Bill         555-1675     bill.drowning@@hotmail.com       A
+@end example
+
+@noindent
+Essa non contiene nessuna @samp{u}, per cui non c'@`e alcun motivo di dividere
+il record, diversamente dalle altre, che hanno una o pi@`u ricorrenze della
+@samp{u}. Infatti, questo record @`e trattato come parte del record precedente;
+il ritorno a capo che li separa nell'output @`e l'originale ritorno a capo nel
+@value{DF}, non quella aggiunta da @command{awk} quando ha stampato il record!
+
+@cindex separatori di record, cambiare i
+@cindex record, separatori di
+Un altro modo per cambiare il separatore di record @`e sulla riga di comando,
+usando la funzionalit@`a dell'assegnamento di variabile
+(@pxref{Altri argomenti}):
+
+@example
+awk '@{ print $0 @}' RS="u" mail-list
+@end example
+
+@noindent
+Questo imposta @code{RS} a @samp{u} prima di elaborare @file{mail-list}.
+
+Usando un carattere alfabetico come @samp{u} come separatore di record
+@`e molto probabile che si ottengano risultati strani.
+Usando un carattere insolito come @samp{/} @`e pi@`u probabile
+che si ottenga un comportamento corretto nella  maggioranza dei casi, ma non
+c'@`e nessuna garanzia.  La morale @`e: conosci i tuoi dati!
+
+@command{gawk} consente di usare per @code{RS} un'espressione regolare
+normale (descritta pi@`u avanti; @pxref{gawk divisione record}).
+Tuttavia, se l'espressione regolare @`e costituita da un singolo metacarattere,
+come p.es. @samp{.} che assegni il valore di @code{RS}, il metacarattere
+in questione non viene trattato come tale, ma viene usato letteralmente.
+Ci@`o viene fatto per compatibilit@`a all'indietro sia con il comando
+Unix @command{awk} che con lo standard POSIX.
+
+Quando si usano caratteri normali come separatore di record,
+c'@`e un caso insolito che capita quando @command{gawk}
+@`e reso completamente conforme a POSIX (@pxref{Opzioni}).
+In quel caso, la seguente (estrema) @dfn{pipeline} stampa un sorprendente
+@samp{1}:
+
+@example
+$ echo | gawk --posix 'BEGIN @{ RS = "a" @} ; @{ print NF @}'
+@print{} 1
+@end example
+
+C'@`e un solo campo, consistente in un ritorno a capo.  Il valore della
+variabile predefinita @code{NF} @`e il numero di campi nel record corrente.
+(Normalmente @command{gawk} tratta il ritorno a capo come uno spazio
+vuoto, stampando @samp{0} come risultato.  Anche molte altre versioni di
+@command{awk} agiscono in questo modo.)
+
+@cindex angolo buio, file in input
+Il raggiungimento della fine di un file in input fa terminare il record di
+input corrente, anche se l'ultimo carattere nel file non @`e il carattere in
+@code{RS}.  @value{DARKCORNER}
+
+@cindex stringa vuota
+@cindex stringa nulla
+@c @cindex strings, empty, see null strings
+La stringa nulla @code{""} (una stringa che non contiene alcun carattere)
+ha un significato particolare come
+valore di @code{RS}.  Significa che i record sono separati
+soltanto da una o pi@`u righe vuote.
+@xref{Righe multiple} per maggiori dettagli.
+
+Se si cambia il valore di @code{RS} nel mezzo di un'esecuzione di
+@command{awk}, il nuovo valore @`e usato per delimitare i record successivi, ma
+non riguarda il record in corso di elaborazione e neppure quelli gi@`a
+elaborati.
+
+@cindex @command{gawk}, variabile @code{RT} in
+@cindex @code{RT}, variabile
+@cindex record, fine dei
+@cindex differenze tra @command{awk} e @command{gawk}, separatori di record
+@cindex differenze tra @command{awk} e @command{gawk}, variabili @code{RS}/@code{RT}
+@cindex espressioni regolari, come separatori di record
+@cindex record, separatori di, espressioni regolari come
+@cindex separatori di record, espressioni regolari come
+Dopo che @`e stata determinata la fine di un record, @command{gawk}
+imposta la variabile @code{RT} al testo nell'input che corrisponde a
+@code{RS}.
+
+@node gawk divisione record
+@subsection Divisione dei record con @command{gawk}
+
+@cindex estensioni comuni, @code{RS} come espressione regolare
+@cindex comuni, estensioni@comma{} @code{RS} come espressione regolare
+Quando si usa @command{gawk},
+il valore di @code{RS} non @`e limitato a una stringa costituita da un solo
+carattere.  Se contiene pi@`u di un carattere, @`e considerato essere
+un'espressione regolare
+@iftex
+(@pxrefil{Espressioni regolari}). @value{COMMONEXT}
+@end iftex
+@ifnottex
+(@pxref{Espressioni regolari}). @value{COMMONEXT}
+@end ifnottex
+In generale, ogni record termina alla stringa pi@`u vicina che corrisponde
+all'espressione regolare; il record successivo inizia alla fine della stringa
+che corrisponde.  Questa regola generale @`e in realt@`a applicata anche nel caso
+normale, in cui @code{RS} contiene solo un ritorno a capo: un record
+termina all'inizio della prossima stringa che corrisponde (il prossimo
+ritorno a capo nell'input), e il record seguente inizia subito dopo la
+fine di questa stringa (al primo carattere della riga seguente).
+Il ritorno a capo, poich@'e corrisponde a @code{RS}, non appartiene a
+nessuno dei due record.
+
+Quando @code{RS} @`e un singolo carattere, @code{RT}
+contiene lo stesso singolo carattere.  Peraltro, quando @code{RS} @`e
+un'espressione regolare, @code{RT} contiene l'effettivo testo in input
+corrispondente all'espressione regolare.
+
+Se il file in input termina senza che vi sia un testo che corrisponda a
+@code{RS}, @command{gawk} imposta @code{RT} alla stringa nulla.
+
+Il seguente esempio illustra entrambe queste caratteristiche.
+In quest'esempio @code{RS} @`e impostato a un'espressione regolare che
+cerca sia un ritorno a capo che una serie di una o pi@`u lettere
+maiuscole con uno spazio vuoto opzionale iniziale e/o finale:
+
+@example
+@group
+$ @kbd{echo record 1 AAAA record 2 BBBB record 3 |}
+> @kbd{gawk 'BEGIN @{ RS = "\n|( *[[:upper:]]+ *)" @}}
+>             @kbd{@{ print "Record =", $0,"e RT = [" RT "]" @}'}
+@end group
+@print{} Record = record 1 e RT = [ AAAA ]
+@print{} Record = record 2 e RT = [ BBBB ]
+@print{} Record = record 3 e RT = [
+@print{} ]
+@end example
+
+@noindent
+Le parentesi quadre racchiudono il contenuto di @code{RT}, rendendo visibile
+lo spazio vuoto iniziale e quello finale.  L'ultimo valore di
+@code{RT} @`e un ritorno a capo.
+@xref{Programma sed semplice} per un esempio pi@`u utile
+su @code{RS} come espressione regolare e su @code{RT}.
+
+Se si imposta @code{RS} a un'espressione regolare che consente del testo
+finale opzionale, come @samp{RS = "abc(XYZ)?"} @`e possibile, per via di
+limitazioni dell'implementazione, che @command{gawk} possa trovare la parte
+iniziale dell'espressione regolare, ma non la parte finale, in modo
+particolare se il testo di input che potrebbe avere una corrispondenza con la
+parte finale @`e piuttosto lungo.  @command{gawk} cerca di evitare questo
+problema, ma al momento non ci sono garanzie che questo funzioni sempre.
+
+@quotation NOTA
+Si ricordi che in @command{awk}, i metacaratteri di ancoraggio @samp{^} e
+@samp{$} trovano l'inizio e la fine di una @emph{stringa}, e non l'inizio e la
+fine di una @emph{riga}.  Come risultato, qualcosa come
+@samp{RS = "^[[:upper:]]"} pu@`o  solo corrispondere all'inizio di un file.
+Questo perch@'e @command{gawk} vede il file in input come un'unica lunga stringa
+in cui possono essere presenti dei caratteri di ritorno a capo.
+@`E meglio perci@`o evitare metacaratteri di ancoraggio nel valore di @code{RS}.
+@end quotation
+
+@cindex @command{gawk}, variabile @code{RT} in
+@cindex @code{RT}, variabile
+@cindex variabile @code{RT}
+@cindex differenze tra @command{awk} e @command{gawk}, variabili @code{RS}/@code{RT}
+L'uso di @code{RS} come espressione regolare e la variabile @code{RT} sono
+estensioni @command{gawk}; non sono disponibili in
+modalit@`a compatibile
+(@pxref{Opzioni}).
+In modalit@`a compatibile, solo il primo carattere del valore di
+@code{RS} determina la fine del record.
+
+@sidebar @code{RS = "\0"} non @`e portabile
+@cindex portabilit@`a, file di dati come un unico record
+Ci sono casi in cui capita di dover trattare un intero @value{DF} come
+un record unico.  L'unico modo di far questo @`e quello di dare a @code{RS}
+un valore che non ricorre nel file in input.  Ci@`o @`e difficile da fare in modo
+generale, cos@`{@dotless{i}} che un programma possa
+funzionare con file in input arbitrari.
+
+Si potrebbe pensare che per i file di testo il carattere @sc{NUL}, che
+consiste di un carattere con tutti i bit uguali a zero, sia un buon valore da
+usare per @code{RS} in questo caso:
+
+@example
+BEGIN @{ RS = "\0" @}  # l'intero file diventa un record?
+@end example
+
+@cindex differenze tra @command{awk} e @command{gawk}, stringhe, memorizzazione
+@command{gawk} di fatto lo accetta, e usa il carattere @sc{NUL}
+come separatore di record.
+Questo funziona per certi file speciali, come @file{/proc/environ} su sistemi
+GNU/Linux, dove il carattere @sc{NUL} @`e di fatto un separatore di record..
+Comunque, quest'uso @emph{non} @`e portabile sulla maggior parte delle
+implementazioni di @command{awk}.
+
+@cindex angolo buio, stringhe, memorizzazione
+Quasi tutte le altre implementazioni di @command{awk} @footnote{Almeno quelle
+che ci sono note.} memorizzano internamente le stringhe come stringhe
+in stile C.  Le stringhe in stile C usano il carattere @sc{NUL} come
+terminatore di stringa.  In effetti, questo significa che
+@samp{RS = "\0"} @`e lo stesso di @samp{RS = ""}.
+@value{DARKCORNER}
+
+Capita che recenti versioni di @command{mawk} possano usare i carattere
+@sc{NUL} come separatore di record.  Comunque questo @`e un caso particolare:
+@command{mawk} non consente  di includere caratteri @sc{NUL} nelle stringhe.
+(Ci@`o potrebbe cambiare in una versione futura di @command{mawk}.)
+
+@cindex record, trattare file come un solo
+@cindex trattare un file come un solo record
+@cindex record unico, trattare un file come un
+@cindex unico record, trattare un file come un
+@xref{Funzione readfile} per un modo interessante di leggere
+file interi.  Se si usa  @command{gawk}, si veda
+@ref{Esempio di estensione Readfile} per un'altra opzione.
+@end sidebar
+
+@node Campi
+@section Un'introduzione ai campi
+
+@cindex esaminare i campi
+@cindex campi
+@cindex accesso ai campi
+@cindex campi, esame dei
+Quando @command{awk} legge un record in input, il record @`e
+automaticamente @dfn{analizzato} o separato da @command{awk} in "pezzi"
+chiamati @dfn{campi}.  Per default, i campi sono separati da
+@dfn{spazi vuoti}, come le parole in una riga stampata.
+Uno spazio vuoto in @command{awk} @`e qualsiasi stringa composta da uno o pi@`u
+spazi, segni di tabulazione o ritorni a capo;
+altri caratteri, come interruzione di pagina, tabulazione verticale, etc., che
+sono considerati spazi vuoti in altri linguaggi, @emph{non} sono considerati
+tali da @command{awk}.
+
+Lo scopo dei campi @`e quello di rendere pi@`u conveniente per l'utente far
+riferimento a questi frammenti dei record.  Non @`e  necessario usarli---si pu@`o
+operare sull'intero record, se si vuole---ma i campi sono ci@`o che rende
+cos@`{@dotless{i}} potenti dei semplici programmi @command{awk}.
+
+@cindex operatore di campo @code{$}
+@cindex @code{$} (dollaro), operatore di campo @code{$}
+@cindex dollaro (@code{$}), operatore di campo @code{$}
+@cindex operatore di campo, dollaro come
+Si usa il simbolo del dollaro (@samp{$})
+per far riferimento a un campo in un programma @command{awk},
+seguito dal numero del campo desiderato.  Quindi, @code{$1}
+si riferisce al primo campo, @code{$2} al secondo, e cos@`{@dotless{i}} via.
+(Diversamente che nelle shell Unix, i numeri di campo non sono limitati a una
+sola cifra; @code{$127} @`e il centoventisettesimo campo nel record.)
+Per esempio, supponiamo che la seguente sia una riga in input:
+
+@example
+Questo pare essere un esempio proprio carino.
+@end example
+
+@noindent
+Qui il primo campo, o @code{$1}, @`e @samp{Questo}, il secondo campo, o
+@code{$2}, @`e @samp{pare}, e via dicendo.  Si noti che l'ultimo campo,
+@code{$7}, @`e @samp{carino.}.  Poich@'e non ci sono spazi tra la
+@samp{o} e il @samp{.}, il punto @`e considerato parte del settimo
+campo.
+
+@cindex @code{NF}, variabile
+@cindex campi, numero dei
+@code{NF} @`e una variabile predefinita il cui valore @`e il numero di campi nel
+record corrente.  @command{awk} aggiorna automaticamente il valore di
+@code{NF} ogni volta che legge un record.  Indipendentemente da quanti campi
+ci possano essere, l'ultimo campo in un record pu@`o essere rappresentato da
+@code{$NF}. Cos@`{@dotless{i}}, @code{$NF} @`e lo stesso di @code{$7}, che @`e @samp{carino.}.
+Se si cerca di far riferimento a un campo oltre l'ultimo
+(come @code{$8} quando il record ha solo sette campi), si ottiene
+la stringa nulla.  (Se usato in un'operazione numerica si ottiene zero.)
+
+L'uso di @code{$0}, che sarebbe come un riferimento al campo ``numero zero'',
+@`e un caso particolare: rappresenta l'intero record in input.  Si usa quando
+non si @`e interessati a un campo specifico. Vediamo qualche altro esempio:
+
+@example
+$ @kbd{awk '$1 ~ /li/ @{ print $0 @}' mail-list}
+@print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+@print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+@end example
+
+@noindent
+Questo esempio stampa ogni record del file @file{mail-list} il cui primo campo
+contiene la stringa @samp{li}.
+
+Per converso, il seguente esempio cerca @samp{li} @emph{nell'intero record} e
+stampa il primo e l'ultimo campo di ogni record in input per cui @`e stata
+trovata una corrispondenza:
+
+@example
+$ @kbd{awk '/li/ @{ print $1, $NF @}' mail-list}
+@print{} Amelia F
+@print{} Broderick R
+@print{} Julie F
+@print{} Samuel A
+@end example
+
+@node Campi non costanti
+@section Numeri di campo variabili
+@cindex campi, numero dei
+@cindex numeri di campo
+
+Un numero di campo non @`e necessario che sia una costante.  Nel linguaggio
+@command{awk} si pu@`o usare qualsiasi espressione dopo @samp{$} per far
+riferimento a un campo.  Il valore dell'espressione specifica il numero di
+campo.  Se il valore @`e una stringa, piuttosto che un numero, viene convertito
+in un numero.  Consideriamo questo esempio:
+
+@example
+awk '@{ print $NR @}'
+@end example
+
+@noindent
+Ricordiamo che @code{NR} @`e il numero dei record letti fino a questo punto: uno
+nel primo record, due nel secondo, etc.  Cos@`{@dotless{i}} quest'esempio stampa il primo
+campo del primo record, il secondo campo del secondo record, e cos@`{@dotless{i}} via.
+Per il ventesimo record, @`e stampato il campo numero 20; molto probabilmente il
+record ha meno di 20 campi, perci@`o stampa una riga vuota.
+Questo @`e un altro esempio sull'uso di espressioni come numeri di campo:
+
+@example
+awk '@{ print $(2*2) @}' mail-list
+@end example
+
+@command{awk} calcola l'espressione @samp{(2*2)} e usa il suo valore come
+numero del campo da stampare.  Qui @samp{*} rappresenta la
+moltiplicazione, quindi l'espressione @samp{2*2} ha il valore quattro.  Le
+parentesi vengono usate affinch@'e la moltiplicazione sia eseguita prima
+dell'operazione @samp{$}; sono necessarie ogni volta che c'@`e un operatore
+binario@footnote{A un @dfn{operatore binario}, come @samp{*} per la
+moltiplicazione, servono due operandi.  La distinzione @`e necessaria poich@'e
+@command{awk} ha anche operatori unari (un operando) e ternari (tre
+operandi).}
+nell'espressione del numero di campo.  Questo esempio, dunque, stampa il
+tipo di relazione (il quarto campo) per ogni riga del file
+@file{mail-list}.  (Tutti gli operatori di @command{awk} sono elencati, in
+ordine decrescente di precedenza, in
+@ref{Precedenza}.)
+
+Se il numero di campo calcolato @`e zero, si ottiene l'intero record.
+Quindi, @samp{$(2-2)} ha lo stesso valore di @code{$0}.  Numeri di campo
+negativi non sono consentiti; tentare di far riferimento a uno di essi
+normalmente fa terminare il programma.  (Lo standard POSIX non chiarisce
+cosa succede quando si fa riferimento a un numero di campo negativo.
+@command{gawk} avvisa di questo e fa terminare il programma.  Altre
+implementazioni di @command{awk} possono comportarsi in modo diverso.)
+
+Come accennato in @ref{Campi},
+@command{awk} memorizza il numero di campi del record corrente nella variabile
+predefinita @code{NF} (@pxref{Variabili predefinite}).  Quindi,
+l'espressione @code{$NF} non @`e una funzionalit@`a speciale---@`e la diretta
+conseguenza della valutazione di @code{NF} e dell'uso di questo valore come
+numero di campo.
+
+@node Cambiare i campi
+@section Cambiare il contenuto di un campo
+
+@cindex campi, cambiare il contenuto dei
+Il contenuto di un campo, cos@`{@dotless{i}} come @`e visto da @command{awk}, pu@`o essere
+cambiato all'interno di un programma @command{awk}; questo cambia quello che
+@command{awk} percepisce come record in input corrente.  (Il reale file in
+input non viene toccato; @command{awk} non modifica @emph{mai} il file in
+input).
+Si consideri il seguente esempio e il suo output:
+
+@example
+$ @kbd{awk '@{ numero_pacchi = $3 ; $3 = $3 - 10}
+>        @kbd{print numero_pacchi, $3 @}' inventory-shipped}
+@print{} 25 15
+@print{} 32 22
+@print{} 24 14
+@dots{}
+@end example
+
+@noindent
+Il programma per prima cosa salva il valore originale del campo tre nella
+variabile @code{numero_pacchi}.
+Il segno @samp{-} rappresenta la sottrazione, cos@`{@dotless{i}} questo programma riassegna
+il campo tre, @code{$3}, come il valore originale del campo meno dieci:
+@samp{$3 - 10}.  (@xref{Operatori aritmetici}.)
+Poi stampa il valore originale e quello nuovo del campo tre.
+(Qualcuno nel magazzino ha fatto un errore ricorrente nell'inventariare le
+scatole rosse.)
+
+Perch@'e questo funzioni, il testo in @code{$3} deve poter essere riconosciuto
+come un numero; la stringa di caratteri dev'essere convertita in un numero
+affich@'e il computer possa eseguire operazioni aritmetiche su di essa.  Il
+numero che risulta dalla sottrazione viene nuovamente convertito in
+una stringa di caratteri che quindi diventa il campo tre.
+@xref{Conversione}.
+
+Quando il valore di un campo @`e cambiato (come percepito da @command{awk}), il
+testo del record in input viene ricalcolato per contenere il nuovo campo al
+posto di quello vecchio.  In altre parole, @code{$0} cambia per riflettere il
+campo modificato.  Questo programma
+stampa una copia del file in input, con 10 sottratto dal secondo campo di ogni
+riga:
+
+@example
+$ @kbd{awk '@{ $2 = $2 - 10; print $0 @}' inventory-shipped}
+@print{} Jan 3 25 15 115
+@print{} Feb 5 32 24 226
+@print{} Mar 5 24 34 228
+@dots{}
+@end example
+
+@`E possibile inoltre assegnare contenuti a campi che sono fuori
+intervallo.  Per esempio:
+
+@example
+$ @kbd{awk '@{ $6 = ($5 + $4 + $3 + $2)}
+> @kbd{       print $6 @}' inventory-shipped}
+@print{} 168
+@print{} 297
+@print{} 301
+@dots{}
+@end example
+
+@cindex aggiungere, campi
+@cindex campi, aggiungere
+@noindent
+Abbiamo appena creato @code{$6}, il cui valore @`e la somma dei campi
+@code{$2}, @code{$3}, @code{$4} e @code{$5}.  Il segno @samp{+}
+rappresenta l'addizione.  Per il file @file{inventory-shipped}, @code{$6}
+rappresenta il numero totale di pacchi spediti in un determinato mese.
+
+La creazione di un nuovo campo cambia la copia interna di @command{awk} nel
+record in input corrente, che @`e il valore di @code{$0}.  Cos@`{@dotless{i}}, se si scrive
+@samp{print $0} dopo aver aggiunto un campo, il record stampato include il
+nuovo campo, col numero di separatori di campo appropriati tra esso e i
+campi originariamente presenti.
+
+@cindex @code{OFS}, variabile
+@cindex output, separatore di campo, si veda @code{OFS}, variabile
+@cindex campo, separatori di, si veda anche @code{OFS}
+@cindex separatori di campo, si veda anche @code{OFS}
+Questa ridefinizione influenza ed @`e influenzata da
+@code{NF} (il numero dei campi; @pxref{Campi}).
+Per esempio, il valore di @code{NF} @`e impostato al numero del campo pi@`u
+elevato che @`e stato creato.
+Il formato preciso di @code{$0} @`e influenzato anche da una funzionalit@`a che
+non @`e ancora stata trattata: il @dfn{separatore di campo di output},
+@code{OFS}, usato per separare i campi (@pxref{Separatori di output}).
+
+Si noti, comunque, che il mero @emph{riferimento} a un campo fuori
+intervallo @emph{non} cambia il valore di @code{$0} o di @code{NF}.
+Far riferimento a un campo fuori intervallo produce solo una stringa nulla.
+Per esempio:
+
+@example
+if ($(NF+1) != "")
+    print "non @`e possibile"
+else
+    print "@`e tutto normale"
+@end example
+
+@noindent
+dovrebbe stampare @samp{@`e tutto normale}, perch@'e @code{NF+1} @`e certamente
+fuori intervallo.  (@xref{Istruzione if}
+per maggiori informazioni sulle istruzioni @code{if-else} di @command{awk}.
+@xref{Tipi di variabile e confronti}
+per maggiori informazioni sull'operatore @samp{!=}.)
+
+@`E importante notare che facendo un assegnamento a un campo esistente cambia
+il valore di @code{$0} ma non cambia il valore di @code{NF},
+anche qualora si assegni a un campo la stringa nulla.  Per esempio:
+
+@example
+$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""}
+>                       @kbd{print $0; print NF @}'}
+@print{} a::c:d
+@print{} 4
+@end example
+
+@noindent
+Il campo @`e ancora l@`{@dotless{i}}; ha solo un valore vuoto, delimitato dai due "due punti"
+tra @samp{a} e @samp{c}.
+Questo esempio mostra cosa succede se si crea un nuovo campo:
+
+@example
+$ @kbd{echo a b c d | awk '@{ OFS = ":"; $2 = ""; $6 = "nuovo"}
+>                       @kbd{print $0; print NF @}'}
+@print{} a::c:d::nuovo
+@print{} 6
+@end example
+
+@noindent
+Il campo intermedio, @code{$5}, @`e creato con un valore vuoto
+(indicato dalla seconda coppia di due punti (@code{:}) adiacenti),
+e @code{NF} @`e aggiornato col valore sei.
+
+@cindex angolo buio, variabile @code{NF}, decremento
+@cindex @code{NF}, variable, decremento
+Decrementando @code{NF} si eliminano i campi
+dopo il nuovo valore di @code{NF} e si ricalcola @code{$0}.
+@value{DARKCORNER}
+Vediamo un esempio:
+
+@example
+$ @kbd{echo a b c d e f | awk '@{ print "NF =", NF;}
+> @kbd{                          NF = 3; print $0 @}'}
+@print{} NF = 6
+@print{} a b c
+@end example
+
+@cindex portabilit@`a, variabile @code{NF}@comma{} decremento
+@quotation ATTENZIONE
+Alcune versioni di @command{awk} non
+ricostruiscono @code{$0} quando @code{NF} viene diminuito.
+Fino ad agosto 2018, fra queste c'era BWK @command{awk}; per fortuna
+da allora la sua versione funziona correttamente.
+@end quotation
+
+Infine, ci sono casi in cui conviene forzare
+@command{awk} a ricostruire l'intero record, usando i valori correnti
+dei campi e @code{OFS}.  Per far ci@`o, si usa
+l'apparentemente innocuo assegnamento:
+
+@example
+@group
+$1 = $1   # forza la ricostruzione del record
+print $0  # o qualsiasi altra cosa con $0
+@end group
+@end example
+
+@noindent
+Questo forza @command{awk} a ricostruire il record.  Aggiungere un commento
+rende tutto pi@`u chiaro, come abbiamo appena visto.
+
+C'@`e un rovescio della medaglia nella relazione tra @code{$0} e
+i campi.  Qualsiasi assegnamento a @code{$0} fa s@`{@dotless{i}} che il record sia
+rianalizzato (sintatticamente) e ridiviso in campi usando il valore
+@emph{corrente} di @code{FS}. Questo si applica anche a qualsiasi funzione
+predefinita che aggiorna @code{$0}, come @code{sub()} e @code{gsub()}
+(@pxref{Funzioni per stringhe}).
+
+@sidebar Comprendere @code{$0}
+
+@`E importante ricordare che @code{$0} @`e @emph{l'intero}
+record, esattamente com'@`e stato letto dall'input, compresi tutti gli spazi
+vuoti iniziali e finali, e l'esatto spazio vuoto (o altri caratteri) che
+separa i campi.
+
+@`E un errore comune tentare di cambiare il separatore di campo in un record
+semplicemente impostando @code{FS} e @code{OFS}, e poi
+aspettarsi che un semplice @samp{print} or @samp{print $0} stampi il record
+modificato.
+
+Questo non funziona, poich@'e non @`e stato fatto niente per cambiare quello
+stesso record.  Invece, si deve forzare la ricostruzione del record,
+tipicamente con un'istruzione come @samp{$1 = $1}, come descritto
+in precedenza.
+@end sidebar
+
+
+@node Separatori di campo
+@section Specificare come vengono separati i campi
+
+@menu
+* Separatori di campo di default::   Come di solito sono separati i campi.
+* Separare campi con @dfn{regexp}::  Usare @dfn{regexp} come separatori.
+* Campi di un solo carattere::       Fare di ogni carattere un campo
+                                     separato.
+* Separatori campo da riga di comando:: Assegnare @code{FS} dalla riga di
+                                     comando.
+* Campo intera riga::                Far s@`{@dotless{i}} che la riga intera sia un
+                                     campo solo.
+* Sommario sulla separazione campi:: Alcuni punti finali e una tavola di
+                                     sommario.
+@end menu
+
+@cindex @code{FS}, variabile
+@cindex campi, separare
+@cindex campo, separatori di
+Il @dfn{separatore di campo}, che @`e un carattere singolo o un'espressione
+regolare, controlla il modo in cui @command{awk} suddivide un record in input
+in campi.  @command{awk} fa una scansione del record in input per trovare i
+caratteri che individuano il separatore; i campi sono il testo compreso tra i
+separatori trovati.
+
+Nell'esempio che segue, usiamo il simbolo del punto elenco (@bullet{}) per
+rappresentare gli spazi nell'output.
+Se il separatore di campo @`e @samp{oo}, la seguente riga:
+
+@example
+moo goo gai pan
+@end example
+
+@noindent
+@`e suddivisa in tre campi: @samp{m}, @samp{@bullet{}g}, e
+@samp{@bullet{}gai@bullet{}pan}.
+Notare gli spazi iniziali nei valori del secondo e del terzo campo.
+
+@cindex risoluzione di problemi, @command{awk} usa @code{FS} anzich@'e @code{IFS}
+@cindex problemi, risoluzione di, @command{awk} usa @code{FS} anzich@'e @code{IFS}
+Il separatore di campo @`e rappresentato dalla variable predefinita @code{FS}.
+I programmatori di shell notino:  @command{awk} @emph{non} usa il
+nome @code{IFS} che @`e usato dalle shell conformi a POSIX (come
+la Unix Bourne shell, @command{sh}, o Bash).
+
+@cindex @code{FS}, variabile, cambiare il valore di una
+Il valore di @code{FS} si pu@`o cambiare nel programma @command{awk} con
+l'operatore di assegnamento, @samp{=} (@pxref{Operatori di assegnamento}).
+Spesso il momento giusto per far ci@`o @`e all'inizio dell'esecuzione
+prima che sia stato elaborato qualsiasi input, cos@`{@dotless{i}} che il primo record
+sia letto col separatore  appropriato.  Per far questo, si usa il modello di
+ricerca speciale
+@code{BEGIN}
+(@pxref{BEGIN/END}).
+Per esempio, qui impostiamo il valore di @code{FS} alla stringa
+@code{","}:
+
+@example
+awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}'
+@end example
+
+@cindex @code{BEGIN}, criterio di ricerca
+@noindent
+Data la riga in input:
+
+@example
+John Q. Smith, 29 Oak St., Walamazoo, MI 42139
+@end example
+
+@noindent
+questo programma @command{awk} estrae e stampa la stringa
+@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
+
+@cindex separatori di campo, scelta dei
+@cindex espressioni regolari, come separatori di campo
+@cindex separatori di campo, espressioni regolari come
+A volte i dati in input contengono caratteri separatori che non
+separano i campi nel modo in cui ci si sarebbe atteso.  Per esempio, il
+nome della persona dell'esempio che abbiamo appena usato potrebbe avere un
+titolo o un suffisso annesso, come:
+
+@example
+John Q. Smith, LXIX, 29 Oak St., Walamazoo, MI 42139
+@end example
+
+@noindent
+Lo stesso programma estrarrebbe @samp{@bullet{}LXIX} invece di
+@samp{@bullet{}29@bullet{}Oak@bullet{}St.}.
+Se ci si aspetta che il programma stampi l'indirizzo,
+si rimarr@`a sorpresi.  La morale @`e quella di scegliere la struttura dei dati
+e i caratteri di separazione attentamente per evitare questi problemi.
+(Se i dati non sono in una forma facile da elaborare, pu@`o darsi che
+si possano manipolare con un programma @command{awk} separato.)
+
+
+@node Separatori di campo di default
+@subsection Lo spazio vuoto normalmente separa i campi
+
+@cindex separatori di campo, spazi vuoti come
+@cindex spazi vuoti, come separatori di campo
+I campi sono separati normalmente da spazi vuoti
+(spazi, tabulazioni e ritorni a capo), non solo da spazi singoli.  Due spazi
+in una riga non delimitano un campo vuoto. Il valore di default del separatore
+di campo @code{FS} @`e una stringa contenente un singolo spazio, @w{@code{" "}}.
+Se @command{awk} interpretasse questo valore nel modo usuale, ogni carattere
+di spazio separerebbe campi, quindi due spazi in una riga creerebbero un campo
+vuoto tra di essi.  Il motivo per cui questo non succede @`e perch@'e un singolo
+spazio come valore di @code{FS} @`e un caso particolare: @`e preso per specificare
+il modo di default di delimitare i campi.
+
+Se @code{FS} @`e qualsiasi altro carattere singolo, come @code{","}, ogni
+ricorrenza di quel carattere separa due campi.  Due ricorrenze consecutive
+delimitano un campo vuoto.  Se il carattere si trova all'inizio o alla fine
+della riga, anche quello delimita un campo vuoto.  Il carattere di spazio @`e
+il solo carattere singolo che non segue queste
+regole.
+
+@node Separare campi con @dfn{regexp}
+@subsection Usare @dfn{regexp} come separatori di campo
+
+@cindex espressioni regolari, come separatori di campo
+@cindex separatori di campo, espressioni regolari come
+La precedente @value{SUBSECTION}
+ha illustrato l'uso di caratteri singoli o di stringhe semplici come
+valore di @code{FS}.
+Pi@`u in generale, il valore di @code{FS} pu@`o essere una stringa contenente
+qualsiasi espressione regolare.  Se questo @`e il caso, ogni corrispondenza nel
+record con l'espressione regolare separa campi.  Per esempio, l'assegnamento:
+
+@example
+FS = ", \t"
+@end example
+
+@noindent
+trasforma ogni parte di una riga in input che consiste di una virgola seguita
+da uno spazio e una tabulazione in un separatore di campo.
+@ifinfo
+(@samp{\t}
+@`e una @dfn{sequenza di protezione} che sta per un segno di tabulazione;
+@pxref{Sequenze di protezione},
+per l'elenco completo di sequenze di protezione simili.)
+@end ifinfo
+
+Per un esempio meno banale di espressione regolare, si provi a usare spazi
+singoli per separare campi nel modo in cui sono usate le virgole. @code{FS}
+pu@`o essere impostato a @w{@code{"[@ ]"}} (parentesi quadra sinistra, spazio,
+parentesi quadra destra).  Quest'espressione regolare corrisponde a uno spazio
+@iftex
+singolo e niente pi@`u.  (@pxrefil{Espressioni regolari}).
+@end iftex
+@ifnottex
+singolo e niente pi@`u.  (@pxref{Espressioni regolari}).
+@end ifnottex
+C'@`e una differenza importante tra i due casi di @samp{FS = @w{" "}}
+(uno spazio singolo) e @samp{FS = @w{"[ \t\n]+"}}
+(un'espressione regolare che individua uno o pi@`u spazi, tabulazioni o
+ritorni a capo).  Per entrambi i valori di @code{FS}, i campi sono
+separati da @dfn{serie} (ricorrenze adiacenti multiple) di spazi, tabulazioni
+e/o ritorni a capo.  Comunque, quando il valore di @code{FS} @`e
+@w{@code{" "}}, @command{awk} prima toglie lo spazio vuoto iniziale e finale
+dal record e poi stabilisce dove sono i campi.
+Per esempio, la seguente @dfn{pipeline} stampa @samp{b}:
+
+@example
+$ @kbd{echo ' a b c d ' | awk '@{ print $2 @}'}
+@print{} b
+@end example
+
+@noindent
+Invece la @dfn{pipeline} che segue stampa @samp{a} (notare lo spazio extra
+intorno a ogni lettera):
+
+@example
+$ @kbd{echo ' a  b  c  d ' | awk 'BEGIN @{ FS = "[ \t\n]+" @}}
+>                                  @kbd{@{ print $2 @}'}
+@print{} a
+@end example
+
+@noindent
+@c @cindex null strings
+@cindex stringa nulla
+@cindex stringa vuota, si veda stringa nulla
+In questo caso, il primo campo @`e nullo, o vuoto.
+Il taglio degli spazi vuoti iniziale e finale ha luogo anche
+ogniqualvolta @code{$0} @`e ricalcolato.
+Per esempio, si consideri questa @dfn{pipeline}:
+
+@example
+$ @kbd{echo '   a b c d' | awk '@{ print; $2 = $2; print @}'}
+@print{}    a b c d
+@print{} a b c d
+@end example
+
+@noindent
+La prima istruzione @code{print} stampa il record cos@`{@dotless{i}} come @`e stato letto,
+con lo spazio vuoto intatto.  L'assegnamento a @code{$2} ricostruisce
+@code{$0} concatenando insieme @code{$1} fino a @code{$NF},
+separati dal valore di @code{OFS} (che @`e uno spazio per default).
+Poich@'e lo spazio vuoto iniziale @`e stato ignorato quando si @`e trovato
+@code{$1}, esso non fa parte del nuovo @code{$0}.  Alla fine, l'ultima
+istruzione @code{print} stampa il nuovo @code{$0}.
+
+@cindex @code{FS}, contenente @code{^}
+@cindex @code{^} (circonflesso), in @code{FS}
+@cindex angolo buio, @code{^}, in @code{FS}
+C'@`e un'ulteriore sottigliezza da considerare quando si usano le espressioni
+regolari per separare i campi.
+Non @`e ben specificato nello standard POSIX, n@'e altrove, cosa
+significhi @samp{^} nella divisione dei campi.  Il @samp{^} cerca
+corrispondenze solo all'inizio dell'intero record?  Oppure ogni separatore di
+campo @`e una nuova stringa?  Di fatto versioni differenti di @command{awk}
+rispondono a questo quesito in modo diverso, e non si dovrebbe far affidamento
+su alcun comportamento specifico nei propri programmi.
+@value{DARKCORNER}
+
+@cindex Brian Kernighan, @command{awk} di
+Di sicuro, BWK @command{awk} individua con @samp{^}
+solo l'inizio del record.  Anche @command{gawk}
+funziona in questo modo. Per esempio:
+
+@example
+$ @kbd{echo 'xxAA  xxBxx  C' |}
+> @kbd{gawk -F '(^x+)|( +)' '@{ for (i = 1; i <= NF; i++)}
+> @kbd{                            printf "-->%s<--\n", $i @}'}
+@print{} --><--
+@print{} -->AA<--
+@print{} -->xxBxx<--
+@print{} -->C<--
+@end example
+
+@node Campi di un solo carattere
+@subsection Fare di ogni carattere un campo separato
+
+@cindex estensioni comuni, campi di un solo carattere
+@cindex comuni, estensioni, campi di un solo carattere
+@cindex differenze tra @command{awk} e @command{gawk}, campi di un solo carattere
+@cindex singolo carattere, campi
+@cindex campi di un solo carattere
+Ci sono casi in cui si abbia la necessit@`a di analizzare ciascun carattere di un
+record separatamente.  Questo si pu@`o fare in @command{gawk} semplicemente
+assegnando la stringa nulla (@code{""}) a @code{FS}. @value{COMMONEXT}
+In questo caso,
+ogni singolo carattere nel record diventa un campo separato.
+Per esempio:
+
+@example
+$ @kbd{echo a b | gawk 'BEGIN @{ FS = "" @}}
+>                  @kbd{@{}
+>                      @kbd{for (i = 1; i <= NF; i = i + 1)}
+>                          @kbd{print "Il campo", i, "@`e", $i}
+>                  @kbd{@}'}
+@print{} Il campo 1 @`e a
+@print{} Il campo 2 @`e
+@print{} Il campo 3 @`e b
+@end example
+
+@cindex angolo buio, @code{FS} come stringa nulla
+@cindex @code{FS}, variabile, come stringa nulla
+Tradizionalmente, il comportamento di @code{FS} quando @`e impostato a
+@code{""} non @`e stato definito.  In questo caso, la  maggior parte delle
+versioni UNIX di @command{awk} trattano l'intero record come se avesse un
+unico campo.
+@value{DARKCORNER}
+In modalit@`a di compatibilit@`a
+(@pxref{Opzioni}),
+se @code{FS} @`e la stringa nulla, anche @command{gawk}
+si comporta in questo modo.
+
+@node Separatori campo da riga di comando
+@subsection Impostare @code{FS} dalla riga di comando
+@cindex @option{-F}, opzione sulla riga di comando
+@cindex separatore di campo, specificare sulla riga di comando
+@cindex riga di comando, impostare @code{FS} sulla
+@cindex @code{FS}, variabile, impostare da riga di comando
+
+@code{FS} pu@`o essere impostata sulla riga di comando.  Per far questo si usa
+l'opzione @option{-F}.  Per esempio:
+
+@example
+awk -F, '@var{programma}' @var{i-file-di-input}
+@end example
+
+@noindent
+imposta @code{FS} al carattere @samp{,}.  Si noti che l'opzione richiede
+un carattere maiuscolo @samp{F} anzich@'e minuscolo @samp{f}.  Quest'ultima
+opzione (@option{-f}) serve a specificare il file contenente un programma
+@command{awk}.
+
+Il valore usato per l'argomento di @option{-F} @`e elaborato esattamente nello
+stesso modo degli assegnamenti alla variabile predefinita @code{FS}. Qualsiasi
+carattere speciale nel separatore di campo dev'essere protetto in modo
+appropriato.  Per esempio, per usare un @samp{\} come separatore di campo
+sulla riga di comando, si dovrebbe battere:
+
+@example
+# equivale a FS = "\\"
+awk -F\\\\ '@dots{}' file @dots{}
+@end example
+
+@noindent
+@cindex separatore di campo, @code{\} (barra inversa) come
+@cindex @code{\} (barra inversa), come separatore di campo
+@cindex barra inversa (@code{\}), come separatore di campo
+Poich@'e @samp{\} @`e usato nella shell per proteggere caratteri, a @command{awk}
+arriva @samp{-F\\}.  Quindi @command{awk} elabora @samp{\\} per caratteri di
+protezione (@pxref{Sequenze di protezione}), producendo alla fine
+un unico @samp{\} da usare come separatore di campo.
+
+@c @cindex historical features
+Come caso particolare, in modalit@`a di compatibilit@`a
+(@pxref{Opzioni}),
+se l'argomento di @option{-F} @`e @samp{t}, @code{FS} @`e impostato al
+carattere di tabulazione.  Se si immette @samp{-F\t} nella
+shell, senza che sia tra apici, @samp{\} viene cancellata,
+cos@`{@dotless{i}} @command{awk}
+conclude che si vuole realmente che i campi siano separati da tabulazioni e
+non da delle @samp{t}.  Si usi @samp{-v FS="t"} o @samp{-F"[t]"} sulla riga di
+comando se si vuole separare i campi con delle @samp{t}.
+Quando non si @`e in modalit@`a di compatibilit@`a si deve usare @samp{-F '\t'} per
+specificare che le tabulazioni separano i campi.
+
+Come esempio, usiamo un file di programma @command{awk} chiamato
+@file{edu.awk} che contiene il criterio di ricerca @code{/edu/} e l'azione
+@samp{print $1}:
+
+@example
+/edu/   @{ print $1 @}
+@end example
+
+Impostiamo inoltre @code{FS} al carattere @samp{-} ed eseguiamo il programma
+sul file @file{mail-list}.  Il seguente comando stampa un elenco dei nomi
+delle persone che lavorano all'universit@`a o che la frequentano, e le prime tre
+cifre dei loro numeri di telefono:
+
+@example
+$ @kbd{awk -F- -f edu.awk mail-list}
+@print{} Fabius       555
+@print{} Samuel       555
+@print{} Jean
+@end example
+
+@noindent
+Si noti la terza riga di output.  La terza riga
+nel file originale @`e simile a questa:
+
+@example
+Jean-Paul   555-2127  jeanpaul.campanorum@@nyu.edu   R
+@end example
+
+Il @samp{-} che fa parte del nome della persona @`e stato usato come
+separatore di campo, al posto del @samp{-} presente nel numero di telefono,
+che ci si aspettava venisse usato.
+Questo lascia intuire il motivo per cui si deve stare attenti nella scelta
+dei separatori di campo e di record.
+
+@cindex Unix @command{awk}, file di password, separatori di campo e
+Forse l'uso pi@`u comune di un solo carattere come separatore di campo avviene
+quando si elabora il file delle password di un sistema Unix.  Su molti sistemi
+Unix, ogni utente @`e descritto da un elemento nel file delle password del
+sistema, che contiene una riga singola per ogni utente.  In queste righe le
+informazioni sono separate da dei caratteri ":".  Il
+primo campo @`e il nome di login dell'utente e il secondo @`e la password
+dell'utente criptata o oscurata (una password oscurata @`e indicata dalla
+presenza di una sola @samp{x} nel secondo campo).  Una riga nel file delle
+password potrebbe essere simile a questa:
+
+@cindex Robbins, Arnold
+@example
+arnold:x:2076:10:Arnold Robbins:/home/arnold:/bin/bash
+@end example
+
+Il seguente programma esamina il file delle password di sistema e stampa le
+voci relative agli utenti il cui nome completo non @`e presente nel file:
+
+@example
+awk -F: '$5 == ""' /etc/passwd
+@end example
+
+@node Campo intera riga
+@subsection Fare di una riga intera un campo solo
+
+Occasionalmente, @`e utile trattare l'intera riga in input come un solo campo.
+Questo si pu@`o fare facilmente e in modo portabile semplicemente impostando
+@code{FS} a @code{"\n"} (un ritorno a capo).@footnote{Grazie ad
+Andrew Schorr per questo suggerimento.}
+
+@example
+awk -F'\n' '@var{programma}' @var{file @dots{}}
+@end example
+
+@noindent
+In questo caso, @code{$1} coincide con @code{$0}.
+
+
+@sidebar Cambiare @code{FS} non incide sui campi
+
+@cindex POSIX @command{awk}, separatori di campo e
+@cindex separatore di campo, POSIX e il
+Secondo lo standard POSIX, si suppone che @command{awk} si comporti
+come se ogni record sia stato diviso in campi nel momento in cui @`e stato
+letto.  In particolare, ci@`o vuol dire che se si cambia il valore di
+@code{FS} dopo che un record @`e stato letto, il valore dei campi (cio@'e
+la loro suddivisione) sar@`a ancora quello ottenuto usando il precedente
+valore di @code{FS}, non quello nuovo.
+
+@cindex angolo buio, separatori di campo
+@cindex @command{sed}, programma di utilit@`a
+@cindex programma di utilit@`a @command{sed}
+@cindex editori di flusso
+Comunque, molte delle pi@`u vecchie implementazioni di @command{awk} non
+funzionano in questo modo.  Invece, rimandano la divisione dei campi
+fino a quando si fa effettivamente riferimento a un campo.  I campi sono
+divisi usando il valore @emph{corrente} di @code{FS}!
+@value{DARKCORNER}
+Questo comportamento pu@`o essere di difficile
+identificazione.  Il seguente esempio illustra la differenza
+tra i due metodi. Lo @dfn{script}
+
+@example
+sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}'
+@end example
+
+@noindent
+normalmente stampa:
+
+@example
+@print{} root
+@end example
+
+@noindent
+su un'implementazione non standard di @command{awk}, mentre @command{gawk}
+stampa l'intera prima riga del file, qualcosa come:
+
+@example
+root:x:0:0:Root:/:
+@end example
+
+(Il comando @command{sed}@footnote{Il programma di utilit@`a @command{sed} @`e un
+``editore di flusso''.  Anche il suo comportamento @`e definito dallo standard
+POSIX.} appena visto stampa solo la prima riga di @file{/etc/passwd}.)
+@end sidebar
+
+@node Sommario sulla separazione campi
+@subsection Sommario sulla separazione dei campi
+
+@`E importante ricordare che quando si assegna una costante stringa
+come valore di @code{FS}, questa subisce una normale elaborazione di stringa
+da parte di @command{awk}.  Per esempio, con Unix @command{awk} e
+@command{gawk}, l'assegnamento @samp{FS = "\.."} assegna la stringa di
+caratteri @code{".."}
+a @code{FS} (la barra inversa @`e tolta).  Questo crea un'espressione regolare
+che significa ``i campi sono separati da ricorrenze di due caratteri
+qualsiasi''.  Se invece si vuole che i campi siano separati da un punto
+seguito da un qualsiasi carattere singolo, si deve usare @samp{FS = "\\.."}.
+
+Il seguente elenco riassume come i campi vengono divisi, in base al valore
+di @code{FS} (@samp{==} significa ``@`e uguale a''):
+
+@table @code
+@item FS == " "
+I campi sono separati da serie di spazi vuoti.  Gli spazi vuoti iniziale e
+finale sono ignorati.  Questo @`e il comportamento di default.
+
+@item FS == @var{qualsiasi altro carattere singolo}
+I campi sono separati da ogni ricorrenza del carattere.  Ricorrenze
+successive multiple delimitano campi vuoti, e lo stesso fanno le ricorrenze
+iniziali e finali del carattere.
+Il carattere pu@`o essere anche un metacarattere di espressione regolare, che
+non @`e necessario proteggere.
+
+@item FS == @var{espressione regolare}
+I campi sono separati da ricorrenze di caratteri che corrispondono alla
+@var{espressione regolare}.  Corrispondenze iniziali e finali della
+@dfn{regexp} delimitano campi vuoti.
+@item FS == ""
+Ogni sinngolo carattere nel record diventa un campo separato.
+(Questa @`e un'estensione comune; non @`e specificata dallo standard POSIX.)
+@end table
+
+@sidebar @code{FS} e @code{IGNORECASE}
+La variabile @code{IGNORECASE}
+(@pxref{Variabili modificabili dall'utente})
+influisce sulla divisione del campo @emph{solo} quando il valore di @code{FS}
+@`e un'espressione regolare.  Non ha nessun effetto quando @code{FS} @`e un
+singolo carattere, anche se quel carattere @`e una lettera.  Quindi, nel
+seguente codice:
+
+@example
+FS = "c"
+IGNORECASE = 1
+$0 = "aCa"
+print $1
+@end example
+
+@noindent
+L'output @`e @samp{aCa}.  Se si vuol veramente dividere i campi su un carattere
+alfabetico ignorandone il maiuscolo/minuscolo, si deve usare un'espressione
+regolare che lo far@`a in automatico (p.es., @samp{FS = "[c]"}).  In questo
+caso, @code{IGNORECASE} avr@`a effetto.
+@end sidebar
+
+
+@node Dimensione costante
+@section Leggere campi di larghezza costante
+
+
+@cindex campi di larghezza costante
+@cindex larghezza costante, campi di
+@cindex funzionalit@`a avanzate, campi di larghezza costante
+@c O'Reilly doesn't like it as a note the first thing in the section.
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} tratta una funzionalit@`a avanzata
+di @command{gawk}.  Se si @`e un utente alle prime armi di @command{awk},
+la si pu@`o saltare in prima lettura.
+
+@command{gawk} fornisce una funzionalit@`a per il trattamento di campi
+a larghezza fissa senza un separatore di campo distintivo.  Questa
+funzionalit@`a @`e trattata
+@ifnotinfo
+nelle seguenti
+@end ifnotinfo
+@ifinfo
+nei seguenti
+@end ifinfo
+@value{SUBSECTIONS}.
+
+@menu
+* Dati di lunghezza fissa::     Elaborare dati di lunghezza fissa.
+* Saltare campi intermedi::     Saltare campi intermedi.
+* Consentire dati a fine record:: Trattare dati opzionali a fine record.
+* Campi con dati a larghezza fissa:: Valore di campi con dati a larghezza
+                                     fissa.
+@end menu
+
+@node Dati di lunghezza fissa
+@subsection Elaborare dati di lunghezza fissa
+
+Un esempio di dati a lunghezza fissa pu@`o essere l'input per vecchi programmi
+Fortran dove dei numeri sono elencati uno dopo l'altro, o l'output di
+programmi che non prevedono che questo loro output sia dato in input ad
+altri programmi.
+
+Un esempio di quest'ultimo caso @`e una tabella dove tutte le colonne sono
+allineate usando un numero variabile di spazi e dove @emph{i campi vuoti
+sono solo spazi}.  Chiaramente, la normale divisione in campi di
+@command{awk} basata su @code{FS} non funziona bene in questa situazione.
+Sebbene un programma @command{awk} portabile possa usare una serie di
+chiamate @code{substr()} su @code{$0} (@pxref{Funzioni per stringhe}),
+questo @`e scomodo e inefficiente se il numero dei campi @`e elevato.
+
+@cindex risoluzione di problemi, errori fatali, specificare larghezza dei campi
+@cindex problemi, risoluzione di, errori fatali, specificare larghezza dei campi
+@cindex @command{w}, programma di utilit@`a
+@cindex programma di utilit@`a @command{w}
+@cindex @code{FIELDWIDTHS}, variabile
+@cindex @command{gawk}, variabile @code{FIELDWIDTHS} in
+La suddivisione di un record in input in campi a larghezza fissa viene
+specificata assegnando una stringa contenente numeri separati da spazi alla
+variabile predefinita @code{FIELDWIDTHS}.  Ogni numero specifica la larghezza
+del campo, @emph{comprese} le colonne tra i campi.  Se si vogliono ignorare le
+colonne tra i campi si pu@`o specificare la loro larghezza come un campo
+separato che verr@`a poi ignorato.
+@`E un errore fatale definire una larghezza di campo che abbia un valore
+negativo.
+
+I dati seguenti costituiscono un output del programma di utilit@`a
+Unix @command{w}.  @`E utile per spiegare l'uso di @code{FIELDWIDTHS}:
+
+@example
+@group
+ 10:06pm  up 21 days, 14:04,  23 users
+User     tty       login@  idle   JCPU   PCPU  what
+hzuo     ttyV0     8:58pm            9      5  vi p24.tex
+hzang    ttyV3     6:37pm    50                -csh
+eklye    ttyV5     9:53pm            7      1  em thes.tex
+dportein ttyV6     8:17pm  1:47                -csh
+gierd    ttyD3    10:00pm     1                elm
+dave     ttyD4     9:47pm            4      4  w
+brent    ttyp0    26Jun91  4:46  26:46   4:41  bash
+dave     ttyq4    26Jun9115days     46     46  wnewmail
+@end group
+@end example
+
+Il seguente programma prende l'input sopra mostrato, converte il tempo di
+inattivit@`a
+in numero di secondi, e stampa i primi due campi e il tempo di inattivit@`a
+calcolato:
+
+@example
+BEGIN  @{ FIELDWIDTHS = "9 6 10 6 7 7 35" @}
+NR > 2 @{
+    inat = $4
+    sub(/^ +/, "", inat)   # togli spazi prima del valore
+    if (inat == "")
+        inat = 0
+    if (inat ~ /:/) @{      # hh:mm
+        split(inat, t, ":")
+        inat = t[1] * 60 + t[2]
+    @}
+    if (inat ~ /days/)
+        inat *= 24 * 60 * 60
+
+    print $1, $2, inat
+@}
+@end example
+
+@quotation NOTA
+Questo programma usa diverse funzionalit@`a di @command{awk} non
+ancora trattate.
+@end quotation
+
+L'esecuzione del programma sui dati produce il seguente risultato:
+
+@example
+hzuo      ttyV0  0
+hzang     ttyV3  50
+eklye     ttyV5  0
+dportein  ttyV6  107
+gierd     ttyD3  1
+dave      ttyD4  0
+brent     ttyp0  286
+dave      ttyq4  1296000
+@end example
+
+Un altro esempio (forse pi@`u pratico) di dati di input con larghezza costante @`e
+l'input da un mazzo di schede elettorali.  In alcune parti degli Stati Uniti,
+i votanti marcano le loro scelte perforando delle schede elettroniche.
+
+Queste schede vengono poi elaborate per contare i voti espressi per ogni
+singolo candidato o su ogni determinato quesito.  Siccome un votante pu@`o
+scegliere di non votare su alcune questioni, qualsiasi colonna della scheda
+pu@`o essere vuota.  Un programma @command{awk} per elaborare tali dati potrebbe
+usare la funzionalit@`a @code{FIELDWIDTHS} per semplificare la lettura dei dati.
+(Naturalmente, riuscire a eseguire @command{gawk} su un sistema con lettori di
+schede @`e un'altra storia!)
+
+@node Saltare campi intermedi
+@subsection Saltare campi intermedi
+
+A partire dalla @value{PVERSION} 4.2, ogni specifica di una larghezza di campo
+pu@`o essere opzionalmente preceduta da un valore, delimitato da due punti
+(@code{:}), che indica il numero di caratteri da saltare prima dell'inizio del campo
+successivo.  Quindi, il programma precedente potrebbe essere riscritto per
+specificare @code{FIELDWIDTHS} in questo modo:
+
+@example
+BEGIN  @{ FIELDWIDTHS = "8 1:5 4:7 6 1:6 1:6 2:33" @}
+@end example
+
+In questo modo si eliminano alcuni degli spazi bianchi che separano fra
+loro i campo.  Dopo esser stato cos@`{@dotless{i}} modificato, il programma produce
+i risultati seguenti:
+
+@example
+hzang    ttyV3 50
+eklye    ttyV5 0
+dportein ttyV6 107
+gierd    ttyD3 1
+dave     ttyD4 0
+brent    ttyp0 286
+dave     ttyq4 1296000
+@end example
+
+@node Consentire dati a fine record
+@subsection Trattare dati opzionali a fine record
+
+A volte dati di larghezza fissa possono essere seguiti da ulteriori dati
+la cui lunghezza non @`e nota @dfn{a priori}.  Tali dati possono essere
+o non essere presenti, ma nel caso che lo siano dovrebbe essere possibile
+elaborarli all'interno di un programma @command{awk}.
+
+A partire dalla @value{PVERSION} 4.2, per consentire di designare
+``tutto il resto del record dopo i campi a lunghezza fissa''
+@command{gawk} prevede la possibilit@`a di aggiungere un carattere @samp{*}
+in fondo alla descrizione contenuta in @code{FIELDWIDTHS}.
+Ci pu@`o essere un solo carattere @samp{*}, e dev'essere l'ultimo carattere
+diverso da uno spazio in @code{FIELDWIDTHS}.
+Per esempio:
+
+@example
+$ @kbd{cat fw.awk}                        @ii{Visualizza il programma}
+@print{} BEGIN @{ FIELDWIDTHS = "2 2 *" @}
+@print{} @{ print NF, $1, $2, $3 @}
+$ @kbd{cat fw.in}                         @ii{Visualizza l'input dell'esempio}
+@print{} 1234abcdefghi
+$ @kbd{gawk -f fw.awk fw.in}              @ii{Esegui il programma}
+@print{} 3 12 34 abcdefghi
+@end example
+
+@node Campi con dati a larghezza fissa
+@subsection Valore di campi con dati a larghezza fissa
+
+Fin qui, tutto bene.  Ma cosa succede se non ci sono abbastanza dati
+rispetto a quelli che dovrebbero essere presenti in base alla descrizione
+contenuta in @code{FIELDWIDTHS}?  E invece cosa succede se i dati sono
+pi@`u di quelli previsti?
+
+Per molti anni, quel che succede in questi casi non era definito con
+esattezza.  A partire dalla @value{PVERSION} 4.2 le regole sono le seguenti:
+
+@table @asis
+@item Dati sufficienti per uno o pi@`u campi
+Per esempio, se @code{FIELDWIDTHS} @`e impostato a @code{"2 3 4"} e il record
+in input @`e @samp{aabbb}.  In questo caso, @code{NF} @`e impostato a due.
+
+@item Dati insufficienti per la specifica di un campo
+Per esempio, se @code{FIELDWIDTHS} @`e impostato a @code{"2 3 4"} e il record
+in input @`e @samp{aab}.  In questo caso, @code{NF} @`e impostato a due e
+il campo numero @code{$2} ha come valore @code{"b"}.  L'idea @`e che, anche se
+ci sono meno caratteri di quelli previsti, qualcosa @`e presente, e quindi il
+dato dovrebbe essere reso disponibile al programma.
+
+@item Troppi dati
+Per esempio, se @code{FIELDWIDTHS} @`e impostato a @code{"2 3 4"} e il record
+in input @`e @samp{aabbbccccddd}.  In questo caso, @code{NF} @`e impostato a
+tre e i caratteri in eccesso (@samp{ddd}) sono ignorati.  Se si vuole che
+@command{gawk} elabori i caratteri in pi@`u, si deve aggiungere un @samp{*}
+in fondo, nel valore di @code{FIELDWIDTHS}.
+
+@item Troppi dati, ma @`e stato specificato @samp{*}
+Per esempio, se @code{FIELDWIDTHS} @`e impostato a @code{"2 3 4 *"} e il record
+in input @`e @samp{aabbbccccddd}.  In questo caso, @code{NF} @`e impostato a
+quattro, e @code{$4} ha come valore @code{"ddd"}.
+
+@end table
+
+L'assegnazione di un valore a @code{FS} fa s@`{@dotless{i}} che @command{gawk} usi @code{FS}
+per separare nuovamente i campi.  Si pu@`o usare @samp{FS = FS} per ottenere
+questo effetto, senza dover conoscere il valore corrente di @code{FS}.
+Per vedere quale tipo di separazione sia in atto,
+si pu@`o usare @code{PROCINFO["FS"]}
+(@pxref{Variabili auto-assegnate}).
+Il suo valore @`e @code{"FS"} se si usa la normale separazione in campi,
+o @code{"FIELDWIDTHS"} se si usa la separazione in campi a larghezza fissa:
+
+@example
+if (PROCINFO["FS"] == "FS")
+    @var{separazione in campi normale}@dots{}
+else if  (PROCINFO["FS"] == "FIELDWIDTHS")
+    @var{separazione in campi a larghezza fissa}@dots{}
+else
+    @var{separazione dei campi in base al contenuto}@dots{} @ii{(si veda
+@ifnotinfo
+la @value{SECTION} successiva)}
+@end ifnotinfo
+@ifinfo
+il @value{SECTION} successivo)}
+@end ifinfo
+@end example
+
+Quest'informazione @`e utile quando si scrive una funzione che
+necessita di cambiare temporaneamente @code{FS} o @code{FIELDWIDTHS},
+leggere alcuni record, e poi ripristinare le impostazioni originali
+(@pxref{Funzioni Passwd},
+per un esempio di tale funzione).
+
+@node Separazione in base al contenuto
+@section Definire i campi in base al contenuto
+
+@c O'Reilly doesn't like it as a note the first thing in the section.
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} tratta una funzionalit@`a avanzata
+di @command{gawk}.  Se si @`e un utente alle prime armi di @command{awk},
+la si pu@`o saltare in prima lettura.
+
+@cindex funzionalit@`a avanzate, specificare il contenuto dei campi
+
+Normalmente, quando si usa @code{FS}, @command{gawk} definisce i campi come
+le parti del record che si trovano tra due separatori di campo.  In altre
+parole, @code{FS} definisce cosa un campo @emph{non @`e}, invece di cosa
+@emph{@`e}.
+Tuttavia, ci sono casi in cui effettivamente si ha bisogno di definire i campi
+in base a cosa essi sono, e non in base a cosa non sono.
+
+Il caso pi@`u emblematico @`e quello dei dati cosiddetti @dfn{comma-separated
+value} (CSV).  Molti fogli elettronici, per esempio, possono esportare i dati
+in file di testo, dove ogni record termina con un ritorno a capo e i campi
+sono separati tra loro da virgole. Se le virgole facessero solo da separatore
+fra i dati non ci sarebbero problemi.  Il problema sorge se uno dei campi
+contiene una virgola @emph{al suo interno}.
+In queste situazioni, la maggioranza dei programmi include il campo fra
+doppi apici.@footnote{Il formato CSV non ha avuto, per molti anni, una
+definizione standard formale.
+@uref{http://www.ietf.org/rfc/rfc4180.txt, RFC 4180}
+standardizza le pratiche pi@`u comuni.}
+Cos@`{@dotless{i}}, potremmo avere dei dati di questo tipo:
+
+@example
+@c file eg/misc/addresses.csv
+Robbins,Arnold,"1234 A Pretty Street, NE",MyTown,MyState,12345-6789,USA
+@c endfile
+@end example
+
+@cindex @command{gawk}, variabile @code{FPAT} in
+@cindex @code{FPAT}, variabile
+La variabile @code{FPAT} offre una soluzione per casi come questo.
+Il valore di @code{FPAT} dovrebbe essere una stringa formata da un'espressione
+regolare.  L'espressione regolare descrive il contenuto di ciascun campo.
+
+Nel caso dei dati CSV visti prima, ogni campo @`e ``qualsiasi cosa che non
+sia una virgola,'' oppure ``doppi apici, seguiti da qualsiasi cosa che non
+siano doppi apici, e doppi apici di chiusura''.  Se fosse scritta come una
+costante @dfn{regexp}
+@iftex
+(@pxrefil{Espressioni regolari}),
+@end iftex
+@ifnottex
+(@pxref{Espressioni regolari}),
+@end ifnottex
+sarebbe @code{/([^,]+)|("[^"]+")/}.
+Dovendola scrivere come stringa si devono proteggere i doppi apici,
+e quindi si deve scrivere:
+
+@example
+FPAT = "([^,]+)|(\"[^\"]+\")"
+@end example
+
+Come esempio pratico, si pu@`o vedere questo semplice programma che analizza
+e divide i dati:
+
+@example
+@c file eg/misc/simple-csv.awk
+@group
+BEGIN @{
+    FPAT = "([^,]+)|(\"[^\"]+\")"
+@}
+@end group
+
+@group
+@{
+    print "NF = ", NF
+    for (i = 1; i <= NF; i++) @{
+        printf("$%d = <%s>\n", i, $i)
+    @}
+@}
+@end group
+@c endfile
+@end example
+
+Eseguendolo, avendo in input la riga vista sopra, si ottiene:
+
+@example
+$ @kbd{gawk -f simple-csv.awk addresses.csv}
+NF =  7
+$1 = <Robbins>
+$2 = <Arnold>
+$3 = <"1234 A Pretty Street, NE">
+$4 = <MyTown>
+$5 = <MyState>
+$6 = <12345-6789>
+$7 = <USA>
+@end example
+
+Si noti la virgola contenuta nel valore del campo @code{$3}.
+
+Un semplice miglioramento se si elaborano dati CSV di questo tipo potrebbe
+essere quello di rimuovere i doppi apici, se presenti, con del codice di
+questo tipo:
+
+@example
+if (substr($i, 1, 1) == "\"") @{
+    len = length($i)
+    $i = substr($i, 2, len - 2) # Ottiene il testo tra doppi apici
+@}
+@end example
+
+Come per @code{FS}, la variabile @code{IGNORECASE}
+(@pxref{Variabili modificabili dall'utente}) ha effetto sulla separazione dei
+campi con @code{FPAT}.
+
+Se si assegna un valore a @code{FPAT} la divisione in campi non viene
+effettuata utilizzando @code{FS} o @code{FIELDWIDTHS}.
+
+@quotation NOTA
+Alcuni programmi esportano dei dati CSV che contengono dei ritorni a capo al
+loro interno in campi rinchiusi tra doppi apici.  @command{gawk} non @`e in
+grado di trattare questi dati.  Malgrado esista una specifica ufficiale
+per i dati CSV, non c'@`e molto da fare; il meccanismo  di @code{FPAT} fornisce
+una soluzione elegante per la maggioranza dei casi, e per gli sviluppatori di
+@command{gawk} ci@`o pu@`o bastare.
+@end quotation
+
+Come visto, l'espressione regolare usata per @code{FPAT} richiede
+che ogni campo contenga almeno un carattere.  Una semplice modifica
+(cambiare il primo @samp{+} con @samp{*}) permette che siano presenti dei
+campi vuoti:
+
+@example
+FPAT = "([^,]*)|(\"[^\"]+\")"
+@end example
+
+@c FIXME: 4/2015
+@c Consider use of FPAT = "([^,]*)|(\"[^\"]*\")"
+@c (star in latter part of value) to allow quoted strings to be empty.
+@c Per email from Ed Morton <mortoneccc@comcast.net>
+
+Infine, la funzione @code{patsplit()} rende la stessa funzionalit@`a disponibile
+per suddividere normali stringhe (@pxref{Funzioni per stringhe}).
+
+@node Controllare la creazione di campi
+@section Controllare come @command{gawk} sta dividendo i record
+
+@cindex @command{gawk}, separazione in campi e
+Come visto sopra, @command{gawk} fornisce tre metodi indipendenti per
+dividere i record in input in campi.  Il meccanismo utilizzato dipende da
+quale delle tre variabili---@code{FS}, @code{FIELDWIDTHS} o
+@code{FPAT}---@`e stato definito per ultimo.
+Inoltre, un analizzatore di input che utilizzi l'API (Application
+Programming Interface) pu@`o scegliere di modificare il meccanismo di
+analisi dei record; si veda @ref{Analizzatori di input} per ulteriori informazioni
+riguardo a questa funzionalit@`a.
+
+Per ripristinare la normale divisione in campi dopo aver fatto uso
+di @code{FIELDWIDTHS} e/o @code{FPAT}, @`e sufficiente assegnare un valore
+alla variabile @code{FS}.
+Si pu@`o usare @samp{FS = FS} per farlo, senza bisogno di conoscere il
+valore corrente di @code{FS}.
+
+Per determinare quale sia il tipo di divisione dei campi attiva al momento,
+si usi @code{PROCINFO["FS"]} (@pxref{Variabili auto-assegnate}).
+Il valore @`e @code{"FS"} se si usa la maniera normale di divisione dei campi,
+@code{"FIELDWIDTHS"} se si usa la divisione in campi di lunghezza fissa,
+oppure @code{"FPAT"} se si una la divisione in campi in base al contenuto:
+
+@example
+if (PROCINFO["FS"] == "FS")
+    @var{divisione normale in campi} @dots{}
+else if (PROCINFO["FS"] == "FIELDWIDTHS")
+    @var{divisione in campi a lunghezza fissa} @dots{}
+else if (PROCINFO["FS"] == "FPAT")
+    @var{divisione in campi in base al contenuto} @dots{}
+else
+    @var{divisione in campi da analizzatore di input API} @dots{}
+                                    @ii{(funzionalit@`a avanzata)}
+@end example
+
+Quest'informazione @`e utile se si sta scrivendo una funzione che
+deve cambiare provvisoriamente @code{FS} o @code{FIELDWIDTHS}, leggere alcuni
+record e poi ripristinare le inpostazioni originali.  Si veda
+(@pxref{Funzioni Passwd} per un esempio di una funzione di questo tipo.
+
+@node Righe multiple
+@section Record su righe multiple
+
+@cindex righe multiple, record su
+@cindex record multiriga
+@cindex input, record multiriga
+@cindex file, lettura dei record multiriga
+@cindex input, file in, si veda file in input
+In alcune banche-dati, una sola riga non pu@`o contenere in modo adeguato
+tutte le informazioni di una voce.  In questi casi si possono usare record
+multiriga.
+Il primo passo @`e quello di scegliere il formato dei dati.
+
+@cindex separatori di record, per record multiriga
+Una tecnica @`e quella di usare un carattere o una stringa non usuali per
+separare i record.  Per esempio, si pu@`o usare il carattere di interruzione di
+pagina (scritto @samp{\f} sia in @command{awk} che in C) per separarli,
+rendendo ogni record una pagina del file.  Per far ci@`o, basta impostare la
+variabile @code{RS} a @code{"\f"} (una stringa contenente il carattere di
+interruzione di pagina).  Si potrebbe ugualmente usare qualsiasi altro
+carattere, sempre che non faccia parte dei dati di un record.
+
+@cindex @code{RS}, variabile, record multiriga e
+Un'altra tecnica @`e quella di usare righe vuote per separare i record.
+Per una particolare
+convenzione, una stringa nulla come valore di @code{RS} indica che i record
+sono separati da una o pi@`u righe vuote.  Quando @code{RS} @`e impostato alla
+stringa nulla, ogni record termina sempre alla prima riga vuota che @`e stata
+trovata.  Il record successivo non inizia prima della successiva riga non
+vuota.  Indipendentemente dal numero di righe vuote presenti in successione,
+esse costituiscono sempre un unico separatore di record.
+(Le righe vuote devono essere completamente vuote; righe che contengono
+spazi bianchi @emph{non} sono righe vuote.)
+
+@cindex stringa pi@`u lunga da sinistra, individuare la
+@cindex individuare la stringa pi@`u lunga da sinistra
+Si pu@`o ottenere lo stesso effetto di @samp{RS = ""} assegnando la stringa
+@code{"\n\n+"} a @code{RS}.  Quest'espressione regolare individua
+il ritorno a capo alla fine del record e una o pi@`u righe vuote dopo il
+record.  In aggiunta, un'espressione regolare individua sempre la sequenza pi@`u
+lunga possibile quando una tale stringa sia presente.
+(@pxref{Pi@`u lungo da sinistra}).
+Quindi, il record successivo non inizia prima della successiva riga non
+vuota; indipendentemente dal numero di righe vuote presenti in una voce di
+banca-dati, esse sono considerate come un unico separatore di record.
+
+@cindex angolo buio, record multiriga
+Comunque, c'@`e una sostanziale differenza tra @samp{RS = ""} e @samp{RS =
+"\n\n+"}.  Nel primo caso, i ritorni a capo iniziali nel @value{DF} di
+input vengono ignorati, e se un file termina senza righe vuote aggiuntive dopo
+l'ultimo record, il ritorno a capo viene rimosso dal record.  Nel secondo
+caso, questa particolare elaborazione non viene fatta.
+@value{DARKCORNER}
+
+@cindex separatore di campo, nei record multiriga
+@cindex @code{FS}, nei record multiriga
+Ora che l'input @`e separato in record, il secondo passo @`e quello di separare i
+campi all'interno dei record.  Un modo per farlo @`e quello di dividere in
+campi ognuna delle righe in input
+nel modo solito.  Questo viene fatto per default tramite una
+speciale funzionalit@`a.  Quando @code{RS} @`e impostato alla stringa nulla
+@emph{e} @code{FS} @`e impostato a un solo carattere, il carattere di
+ritorno a capo agisce @emph{sempre} come separatore di campo.
+Questo in aggiunta a tutte le separazioni di campo che risultano da
+@code{FS}.
+
+@quotation NOTA
+Quando @code{FS} @`e la stringa nulla (@code{""}), o
+un'espressione regolare, questa particolare funzionalit@`a di @code{RS} non
+viene applicata; si applica al separatore di campo di default,
+che @`e costituito da un solo spazio:
+@samp{FS = @w{" "}}.
+
+Si noti che la formulazione della specifica POSIX implica che
+questa particolare funzionalit@`a dovrebbe valere anche quando
+@code{FS} sia un'espressione regolare.
+Tuttavia, Unix @command{awk} non si @`e mai comportato in questo
+modo, e neppure @command{gawk}.  Questo @`e fondamentalmente
+un errore nella specifica POSIX.
+@c Noted as of 4/2019; working to get the standard fixed.
+@end quotation
+
+La motivazione originale per questa particolare eccezione probabilmente era
+quella di prevedere un comportamento che fosse utile nel caso di default
+(cio@`e, @code{FS} uguale a @w{@code{" "}}).  Questa funzionalit@`a pu@`o
+costituire un problema se non si vuole che il carattere di ritorno a capo
+faccia da separatore tra i campi, perch@'e non c'@`e alcun modo per impedirlo.
+Tuttavia, si pu@`o aggirare il problema usando la funzione @code{split()}
+per spezzare i record manualmente.
+(@pxref{Funzioni per stringhe}).
+Se si ha un separatore di campo costituito da un solo carattere, si pu@`o
+aggirare la funzionalit@`a speciale in modo diverso, trasformando @code{FS}
+in un'espressione regolare contenente
+quel carattere singolo.  Per esempio, se il separatore di campo @`e
+un carattere di percentuale, al posto di
+@samp{FS = "%"}, si pu@`o usare @samp{FS = "[%]"}.
+
+Un altro modo per separare i campi @`e quello di
+mettere ciascun campo su una riga separata: per far questo basta impostare la
+variabile @code{FS} alla stringa @code{"\n"}.
+(Questo separatore di un solo carattere individua un singolo ritorno a capo.)
+Un esempio pratico di un @value{DF} organizzato in questo modo potrebbe essere
+un elenco di indirizzi, in cui delle righe vuote fungono da separatore fra
+record.  Si consideri un elenco di indirizzi in un file chiamato
+@file{indirizzi}, simile a questo:
+
+@example
+Jane Doe
+123 Main Street
+Anywhere, SE 12345-6789
+
+John Smith
+456 Tree-lined Avenue
+Smallville, MW 98765-4321
+@dots{}
+@end example
+
+@noindent
+Un semplice programma per elaborare questo file @`e il seguente:
+
+@example
+# addrs.awk --- semplice programma per una lista di indirizzi postali
+
+# I record sono separati da righe bianche
+# Ogni riga @`e un campo.
+BEGIN @{ RS = "" ; FS = "\n" @}
+
+@{
+      print "Il nome @`e:", $1
+      print "L'indirizzo @`e:", $2
+      print "Citt@`a e Stato sono:", $3
+      print ""
+@}
+@end example
+
+L'esecuzione del programma produce questo output:
+
+@example
+$ @kbd{awk -f addrs.awk addresses}
+@print{} Il nome @`e: Jane Doe
+@print{} L'indirizzo @`e: 123 Main Street
+@print{} Citt@`a e Stato sono: Anywhere, SE 12345-6789
+@print{}
+@print{} Il nome @`e: John Smith
+@print{} L'indirizzo @`e: 456 Tree-lined Avenue
+@print{} Citt@`a e Stato sono: Smallville, MW 98765-4321
+@print{}
+@dots{}
+@end example
+
+@xref{Programma labels}, per un programma pi@`u realistico per gestire
+elenchi di indirizzi.  Il seguente elenco riassume come sono divisi i record,
+a seconda del valore assunto da
+@ifinfo
+@code{RS}.
+(@samp{==} significa ``@`e uguale a.'')
+@end ifinfo
+@ifnotinfo
+@code{RS}:
+@end ifnotinfo
+
+@table @code
+@item RS == "\n"
+I record sono separati dal carattere di ritorno a capo (@samp{\n}).  In
+effetti, ogni riga nel @value{DF} @`e un record separato, comprese le righe
+vuote.  Questo @`e il comportamento di default.
+
+@item RS == @var{qualsiasi carattere singolo}
+I record sono separati da ogni ricorrenza del carattere specificato.  Pi@`u
+ricorrenze adiacenti delimitano record vuoti.
+
+@item RS == ""
+I record sono separati da una o pi@`u righe vuote.
+Quando @code{FS} @`e un carattere singolo,
+il carattere di ritorno a capo
+serve sempre come separatore di campo, in aggiunta a qualunque valore possa
+avere @code{FS}.  I ritorni a capo all'inizio e alla fine del file sono
+ignorati.
+
+@item RS == @var{regexp}
+I record sono separati da ricorrenze di caratteri corrispondenti a
+@var{regexp}.  Le corrispondenze iniziali e finali di
+@var{regexp} designano record vuoti.
+(Questa @`e un'estensione di @command{gawk}; non @`e specificata dallo
+standard POSIX.)
+@end table
+
+@cindex @command{gawk}, @code{RT} variabile in
+@cindex @code{RT}, variabile
+@cindex differenze tra @command{awk} e @command{gawk}, variabili @code{RS}/@code{RT}
+Se non @`e eseguito in modalit@`a di compatibilit@`a (@pxref{Opzioni}),
+@command{gawk} imposta @code{RT} al testo di input corrispondente
+al valore specificato da @code{RS}.
+Ma se al termine del file in input non @`e stato trovato un testo che
+corrisponde a @code{RS}, @command{gawk} imposta @code{RT} alla stringa nulla.
+
+@node Getline
+@section Richiedere input usando @code{getline}
+
+@cindex @code{getline}, comando, input esplicito con
+@cindex input esplicito
+Finora abbiamo ottenuto i dati di input dal flusso di input principale di
+@command{awk}: lo standard input (normalmente la tastiera, a volte
+l'output di un altro programma) o i
+file indicati sulla riga di comando.  Il linguaggio @command{awk} ha uno
+speciale comando predefinito chiamato @code{getline} che
+pu@`o essere usato per leggere l'input sotto il diretto controllo dell'utente.
+
+Il comando @code{getline} @`e usato in molti modi diversi e
+@emph{non} dovrebbe essere usato dai principianti.
+L'esempio che segue alla spiegazione del comando @code{getline}
+comprende del materiale che ancora non @`e stato trattato.  Quindi, @`e meglio
+tornare indietro e studiare il comando @code{getline} @emph{dopo} aver rivisto
+il resto
+@ifinfo
+di questo @value{DOCUMENT}
+@end ifinfo
+@ifhtml
+di questo @value{DOCUMENT}
+@end ifhtml
+@ifnotinfo
+@ifnothtml
+delle Parti I e II
+@end ifnothtml
+@end ifnotinfo
+e avere acquisito una buona conoscenza di come funziona @command{awk}.
+
+@cindex @command{gawk}, variabile @code{ERRNO} in
+@cindex @code{ERRNO}, variabile, con comando @command{getline}
+@cindex differenze tra @command{awk} e @command{gawk}, comando @code{getline}
+@cindex @code{getline}, comando, codice di ritorno
+@cindex @option{--sandbox}, opzione, ridirezione dell'input con @code{getline}
+
+Il comando @code{getline} restituisce 1 se trova un record e 0 se
+trova la fine del file.  Se si verifica qualche errore cercando di leggere
+un record, come un file che non pu@`o essere aperto, @code{getline}
+restituisce @minus{}1.  In questo caso, @command{gawk} imposta la variabile
+@code{ERRNO} a una stringa che descrive l'errore in questione.
+
+Se il messaggio di errore @code{ERRNO} indica che l'operazione di I/O pu@`o
+essere ritentata e la variabile @code{PROCINFO["@var{input}", "RETRY"]} @`e
+impostata a 1, @code{getline} restituisce un codice di ritorno @minus{}2
+invece che @minus{}1, e si pu@`o provare a chiamare ulterioriormente
+@code{getline}.  @xref{Proseguire dopo errore in input} per ulteriori
+informazioni riguardo a questa funzionalit@`a.
+
+Negli esempi seguenti, @var{comando} sta per un valore di stringa che
+rappresenta un comando della shell.
+
+@quotation NOTA
+Quando @`e stata specificata l'opzione @option{--sandbox} (@pxref{Opzioni}),
+la lettura di input da file, @dfn{pipe} e coprocessi non @`e possibile.
+@end quotation
+
+@menu
+* Getline semplice::             Usare @code{getline} senza argomenti.
+* Getline variabile::            Usare @code{getline} in una variabile.
+* Getline file::                 Usare @code{getline} da un file.
+* Getline variabile file::       Usare @code{getline} in una variabile da un
+                                 file.
+* Getline @dfn{pipe}::           Usare @code{getline} da una @dfn{pipe}.
+* Getline variabile @dfn{pipe}:: Usare @code{getline} in una variabile da una
+                                 @dfn{pipe}.
+* Getline coprocesso::           Usare @code{getline} da un coprocesso.
+* Getline variabile coprocesso:: Usare @code{getline} in una variabile da un
+                                 coprocesso.
+* Note su getline::              Cose importanti da sapere su @code{getline}.
+* Sommario di getline::          Sommario delle varianti di @code{getline}.
+@end menu
+
+@node Getline semplice
+@subsection Usare @code{getline} senza argomenti
+
+Il comando @code{getline} pu@`o essere usato senza argomenti per leggere l'input
+dal file in input corrente.  Tutto quel che fa in questo caso @`e leggere il
+record in input successivo e dividerlo in campi.  Questo @`e utile se @`e
+finita l'elaborarezione del record corrente, e si vogliono fare delle
+elaborazioni particolari sul record successivo @emph{proprio adesso}.
+Per esempio:
+
+@example
+# rimuovere il testo tra /* e */, compresi
+@{
+  if ((i = index($0, "/*")) != 0) @{
+     prima = substr($0, 1, i - 1)  # la parte iniziale della stringa
+     dopo = substr($0, i + 2)    # ... */ ...
+     j = index(dopo, "*/")       # */ @`e nella parte finale?
+     if (j > 0) @{
+         dopo = substr(dopo, j + 2)  # rimozione del commento
+     @} else @{
+         while (j == 0) @{
+           # passa ai record seguenti
+           if (getline <= 0) @{
+             print("Fine file inattesa o errore:", ERRNO) > "/dev/stderr"
+             exit
+          @}
+           # incrementare la riga usando la concatenazione di stringhe
+           dopo = dopo $0
+           j = index(dopo, "*/")   # @`e */ nella parte finale?
+           if (j != 0) @{
+             dopo = substr(dopo, j + 2)
+             break
+           @}
+        @}
+      @}
+      # incrementare la riga di output usando la concatenazione
+      # di stringhe
+      $0 = prima dopo
+  @}
+  print $0
+@}
+@end example
+
+@c 8/2014: Here is some sample input:
+@ignore
+mon/*comment*/key
+rab/*commen
+t*/bit
+horse /*comment*/more text
+part 1 /*comment*/part 2 /*comment*/part 3
+no comment
+@end ignore
+
+Questo programma @command{awk} cancella i commenti in stile C
+(@samp{/* @dots{} */}) dall'input.
+Usa diverse funzionalit@`a che non sono ancora state trattate, incluse la
+concatenazione di stringhe
+(@pxref{Concatenazione})
+e le funzioni predefinite @code{index()} e @code{substr()}
+(@pxref{Funzioni per stringhe}).
+Sostituendo @samp{print $0} con altre
+istruzioni, si possono effettuare elaborazioni pi@`u complesse sull'input
+decommentato, come ricercare corrispondenze di un'espressione regolare.
+(Questo programma ha un piccolo problema: non funziona se c'@`e pi@`u di un
+commento che inizia e finisce
+sulla stessa riga.)
+
+Questa forma del comando @code{getline} imposta @code{NF},
+@code{NR}, @code{FNR}, @code{RT} e il valore di @code{$0}.
+
+@quotation NOTA
+Il nuovo valore di @code{$0} @`e usato per verificare
+le espressioni di ricerca di ogni regola successiva.  Il valore originale
+di @code{$0} che ha attivato la regola che ha eseguito la @code{getline}
+viene perso.
+A differenza di @code{getline}, l'istruzione @code{next} legge un nuovo record
+ma inizia a elaborarlo normalmente, a partire dalla prima
+regola presente nel programma.  @xref{Istruzione next}.
+@end quotation
+
+@node Getline variabile
+@subsection Usare @code{getline} in una variabile
+@cindex @code{getline} in una variabile
+@cindex variabili, usare in comando @code{getline}
+
+Si pu@`o usare @samp{getline @var{var}} per leggere il record successivo
+in input ad @command{awk} nella variabile @var{var}.  Non vien fatta
+nessun'altra elaborazione.
+Per esempio, supponiamo che la riga successiva sia un commento o una stringa
+particolare, e la si voglia leggere senza innescare nessuna regola.  Questa
+forma di @code{getline} permette di leggere quella riga e memorizzarla in una
+variabile in modo che il ciclo principale di @command{awk} che "legge una riga
+e controlla ogni regola" non la veda affatto.
+L'esempio seguente inverte tra loro a due a due le righe in input:
+
+@example
+@group
+@{
+     if ((getline tmp) > 0) @{
+          print tmp
+          print $0
+     @} else
+          print $0
+@}
+@end group
+@end example
+
+@noindent
+Prende la seguente lista:
+
+@example
+wan
+tew
+free
+phore
+@end example
+
+@noindent
+e produce questo risultato:
+
+@example
+tew
+wan
+phore
+free
+@end example
+
+Il comando @code{getline} usato in questo modo imposta solo le variabili
+@code{NR}, @code{FNR} e @code{RT} (e, naturalmente, @var{var}).
+Il record non viene
+suddiviso in campi, e quindi i valori dei campi (compreso @code{$0}) e
+il valore di @code{NF} non cambiano.
+
+@node Getline file
+@subsection Usare @code{getline} da un file
+
+@cindex @code{getline} da un file
+@cindex input, ridirezione dell'
+@cindex ridirezione dell'input
+@cindex @code{<} (parentesi acuta sinistra), operatore @code{<} (I/O)
+@cindex parentesi acuta sinistra (@code{<}), operatore @code{<} (I/O)
+@cindex operatori di input/output
+Si usa @samp{getline < @var{file}} per leggere il record successivo da
+@var{file}.  Qui, @var{file} @`e un'espressione di tipo stringa che
+specifica il @value{FN}.  @samp{< @var{file}} @`e una cosidetta
+@dfn{ridirezione} perch@'e richiede che l'input provenga da un posto
+differente.  Per esempio, il seguente programma
+legge il suo record in input dal file @file{secondary.input} quando
+trova un primo campo con un valore uguale a 10 nel file in input
+corrente:
+
+@example
+@{
+    if ($1 == 10) @{
+         getline < "secondary.input"
+         print
+    @} else
+         print
+@}
+@end example
+
+Poich@'e non viene usato il flusso principale di input, i valori di @code{NR} e
+@code{FNR} restano immutati.  Comunque, il record in input viene diviso in
+modo normale, per cui vengono cambiati i valori di @code{$0} e degli altri
+campi, producendo un nuovo valore di @code{NF}.
+Viene impostato anche @code{RT}.
+
+@cindex POSIX @command{awk}, operatore @code{<} e
+@c Thanks to Paul Eggert for initial wording here
+Per lo standard POSIX, @samp{getline < @var{espressione}} @`e ambiguo se
+@var{espressione} contiene operatori che non sono all'interno di parentesi,
+ad esclusione di @samp{$}; per esempio, @samp{getline < dir "/" file} @`e
+ambiguo perch@'e l'operatore di concatenazione (non ancora trattato;
+@pxref{Concatenazione}) non @`e posto tra parentesi.
+Si dovrebbe scrivere invece @samp{getline < (dir "/" file)}, se il
+programma dev'essere portabile su tutte le implementazioni di @command{awk}.
+
+@node Getline variabile file
+@subsection Usare @code{getline} in una variabile da un file
+@cindex variabili, usare in comando @code{getline}
+
+Si usa @samp{getline @var{var} < @var{file}} per leggere l'input
+dal file
+@var{file}, e metterlo nella variabile @var{var}.  Come prima, @var{file}
+@`e un'espressione di tipo stringa che specifica il file dal quale
+legggere.
+
+In questa versione di @code{getline}, nessuna delle variabili predefinite @`e
+cambiata e il record non @`e diviso in campi.  La sola variabile cambiata @`e
+@var{var}.@footnote{Questo non @`e completamente vero. @code{RT} pu@`o essere
+cambiato se @code{RS} @`e un'espressione regolare.}
+Per esempio, il seguente programma copia tutti i file in input nell'output, ad
+eccezione dei record che dicono @w{@samp{@@include @var{nomefile}}}.
+Tale record @`e sostituito dal contenuto del file
+@var{nomefile}:
+
+@example
+@{
+     if (NF == 2 && $1 == "@@include") @{
+          while ((getline line < $2) > 0)
+               print line
+          close($2)
+     @} else
+          print
+@}
+@end example
+
+Si noti come il nome del file in input aggiuntivo non compaia all'interno del
+programma; @`e preso direttamente dai dati, e precisamente dal secondo campo
+della riga di @code{@@include}.
+
+La funzione @code{close()} viene chiamata per assicurarsi che se nell'input
+appaiono due righe @code{@@include} identiche, l'intero file specificato sia
+incluso ogni volta.
+@xref{Chiusura file e @dfn{pipe}}.
+
+Una carenza di questo programma @`e che non gestisce istruzioni
+@code{@@include} nidificate
+(cio@`e, istruzioni @code{@@include} contenute nei file inclusi)
+nel modo in cui ci si aspetta che funzioni un vero preelaboratore di macro.
+@xref{Programma igawk} per un programma
+che gestisce le istruzioni @code{@@include} nidificate.
+
+@node Getline @dfn{pipe}
+@subsection Usare @code{getline} da una @dfn{pipe}
+
+@c From private email, dated October 2, 1988. Used by permission, March 2013.
+@cindex Kernighan, Brian
+@quotation
+@i{L'onniscienza ha molti aspetti positivi.
+Se non si pu@`o ottenerla, l'attenzione ai dettagli pu@`o aiutare.}
+@author Brian Kernighan
+@end quotation
+
+@cindex @code{|} (barra verticale), operatore @code{|} (I/O)
+@cindex barra verticale (@code{|}), operatore @code{|} (I/O)
+@cindex input, @dfn{pipeline}
+@cindex @dfn{pipe}, input
+@cindex operatori, input/output
+L'output di un comando pu@`o anche essere convogliato in @code{getline}, usando
+@samp{@var{comando} | getline}.  In
+questo caso, la stringa @var{comando} viene eseguita come comando di shell e
+il suo output @`e passato ad @command{awk} per essere usato come input.
+Questa forma di @code{getline} legge un record alla volta dalla @dfn{pipe}.
+Per esempio, il seguente programma copia il suo input nel suo output,
+ad eccezione delle righe che iniziano con @samp{@@execute}, che sono
+sostituite dall'output prodotto dall'esecuzione del resto della riga
+costituito da un comando di shell.
+
+@example
+@group
+@{
+     if ($1 == "@@execute") @{
+          tmp = substr($0, 10)        # Rimuove "@@execute"
+          while ((tmp | getline) > 0)
+               print
+          close(tmp)
+     @} else
+          print
+@}
+@end group
+@end example
+
+@noindent
+La funzione @code{close()} viene chiamata per assicurarsi che, se appaiono
+nell'input due righe @samp{@@execute} identiche, il comando sia eseguito per
+ciascuna di esse.
+@ifnottex
+@ifnotdocbook
+@xref{Chiusura file e @dfn{pipe}}.
+@end ifnotdocbook
+@end ifnottex
+@c This example is unrealistic, since you could just use system
+Dato l'input:
+
+@example
+pippo
+pluto
+paperino
+@@execute who
+gastone
+@end example
+
+@noindent
+il programma potrebbe produrre:
+
+@cindex Robbins, Bill
+@cindex Robbins, Miriam
+@cindex Robbins, Arnold
+@example
+pippo
+pluto
+paperino
+arnold     ttyv0   Jul 13 14:22
+miriam     ttyp0   Jul 13 14:23     (murphy:0)
+bill       ttyp1   Jul 13 14:23     (murphy:0)
+gastone
+@end example
+
+@noindent
+Si osservi che questo programma ha eseguito @command{who} e stampato il
+risultato.  (Eseguendo questo programma, @`e chiaro che ciascun utente otterr@`a
+risultati diversi, a seconda di chi @`e collegato al sistema.)
+
+Questa variante di @code{getline} divide il record in campi, imposta il valore
+di @code{NF}, e ricalcola il valore di @code{$0}.  I valori di
+@code{NR} e @code{FNR} non vengono cambiati.
+Viene impostato @code{RT}.
+
+@cindex POSIX @command{awk}, operatore I/O @code{|} e
+@c Thanks to Paul Eggert for initial wording here
+Per lo standard POSIX, @samp{@var{espressione} | getline} @`e ambiguo se
+@var{espressione} contiene operatori che non sono all'interno di parentesi,
+ad esclusione di @samp{$}. Per esempio,
+@samp{@w{"echo "} "date" | getline} @`e ambiguo perch@'e
+l'operatore di concatenazione non @`e tra parentesi.  Si dovrebbe scrivere
+invece @samp{(@w{"echo "} "date") | getline}, se il programma dev'essere
+portabile su tutte le implementazioni di @command{awk}.
+
+@cindex Brian Kernighan, @command{awk} di
+@cindex @command{mawk}, programma di utilit@`a
+@cindex programma di utilit@`a @command{mawk}
+@quotation NOTA
+Sfortunatamente, @command{gawk} non ha un comportamento uniforme nel
+trattare un costrutto come @samp{@w{"echo "} "date" | getline}.
+La maggior parte delle versioni, compresa la versione corrente, lo tratta
+come @samp{@w{("echo "} "date") | getline}.
+(Questo @`e anche il comportamento di BWK @command{awk}.)
+Alcune versioni invece lo trattano come
+@samp{@w{"echo "} ("date" | getline)}.
+(Questo @`e il comportamento di @command{mawk}.)
+In breve, per evitare problemi, @`e @emph{sempre} meglio usare parentesi
+esplicite.
+@end quotation
+
+@node Getline variabile @dfn{pipe}
+@subsection Usare @code{getline} in una variabile da una @dfn{pipe}
+@cindex variabili, usare in comando @code{getline}
+
+Quando si usa @samp{@var{comando} | getline @var{var}},
+l'output di @var{comando} @`e inviato tramite una @dfn{pipe} a
+@code{getline} ad una variabile @var{var}.  Per esempio, il
+seguente programma legge la data e l'ora corrente nella variabile
+@code{current_time}, usando il programma di utilit@`a @command{date}, e poi lo
+stampa:
+
+@example
+BEGIN @{
+     "date" | getline current_time
+     close("date")
+     print "Report printed on " current_time
+@}
+@end example
+
+In questa versione di @code{getline}, nessuna delle variabili predefinite @`e
+cambiata e il record non @`e diviso in campi.  In ogni caso, @code{RT} viene
+impostato.
+
+@ifinfo
+@c Thanks to Paul Eggert for initial wording here
+Per lo standard POSIX, @samp{@var{espressione} | getline @var{var}} @`e ambiguo
+se @var{espressione} contiene operatori che non sono all'interno di parentesi
+ad esclusione di @samp{$}; per esempio,
+@samp{@w{"echo "} "date" | getline @var{var}} @`e ambiguo
+perch@'e l'operatore di concatenazione non @`e tra parentesi.  Si dovrebbe
+scrivere invece @samp{(@w{"echo "} "date") | getline @var{var}} se il
+programma dev'essere portabile su tutte le implementazioni di @command{awk}.
+@end ifinfo
+
+@node Getline coprocesso
+@subsection Usare @code{getline} da un coprocesso
+@cindex coprocessi, @code{getline} da
+@cindex @code{getline}, comando, coprocessi@comma{} usare dal
+@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
+@cindex barra verticale (@code{|}), operatore @code{|&} (I/O)
+@cindex operatori, input/output
+@cindex differenze tra @command{awk} e @command{gawk}, operatori di input/output
+
+Leggere dell'input in @code{getline} da una @dfn{pipe} @`e un'operazione
+unidirezionale.
+Il comando avviato con @samp{@var{comando} | getline} invia dati
+@emph{al} programma @command{awk}.
+
+Occasionalmente, si potrebbe avere la necessit@`a di inviare dei dati a un altro
+programma che li elabori, per poi leggere il risultato che esso genera.
+@command{gawk} permette di avviare un @dfn{coprocesso}, col quale sono
+possibili comunicazioni bidirezionali.  Questo vien fatto con l'operatore
+@samp{|&}.
+Tipicamente, dapprima si inviano dati al coprocesso e poi si leggono
+i risultati da esso prodotto, come mostrato di seguito:
+
+@example
+print "@var{some query}" |& "db_server"
+"db_server" |& getline
+@end example
+
+@noindent
+esso invia una richiesta a @command{db_server} e poi legge i risultati.
+
+I valori di @code{NR} e
+@code{FNR} non vengono cambiati,
+perch@'e non @`e cambiato il flusso principale.
+In ogni caso, il record @`e diviso in campi
+nel solito modo, cambiando cos@`{@dotless{i}} i valori di @code{$0}, degli altri campi,
+e di @code{NF} e @code{RT}.
+
+I coprocessi sono una funzionalit@`a avanzata.  Vengono trattati qui solo perch@'e
+@ifnotinfo
+questa @`e la
+@end ifnotinfo
+@ifinfo
+questo @`e il
+@end ifinfo
+@value{SECTION} su @code{getline}.
+@xref{I/O bidirezionale},
+dove i coprocessi vengono trattati pi@`u dettagliatamente.
+
+@node Getline variabile coprocesso
+@subsection Usare @code{getline} in una variabile da un coprocesso
+@cindex variabili, usare in comando @code{getline}
+
+Quando si usa @samp{@var{comando} |& getline @var{var}}, l'output dal
+coprocesso @var{comando} viene inviato tramite una @dfn{pipe} bidirezionale a
+@code{getline} e nella variabile @var{var}.
+
+In questa versione di @code{getline}, nessuna delle variabili predefinite
+viene cambiata e il record non viene diviso in campi.  La sola variabile che
+cambia @`e @var{var}.
+In ogni caso, @code{RT} viene impostato.
+
+@ifinfo
+I coprocessi sono una funzionalit@`a avanzata.  Vengono trattati qui solo perch@'e
+questo @`e il @value{SECTION} su @code{getline}.
+@xref{I/O bidirezionale},
+dove i coprocessi vengono trattati pi@`u dettagliatamente.
+@end ifinfo
+
+@node Note su getline
+@subsection Cose importanti da sapere riguardo a @code{getline}
+Qui sono elencate diverse considerazioni su @code{getline}
+da tener presenti:
+
+@itemize @value{BULLET}
+@item
+Quando @code{getline} cambia il valore di @code{$0} e @code{NF},
+@command{awk} @emph{non} salta automaticamente all'inizio del
+programma per iniziare a provare il nuovo record su ogni criterio di ricerca.
+Comunque, il nuovo record viene provato su ogni regola successiva.
+
+@cindex differenze tra @command{awk} e @command{gawk}, limitazioni di implementazione
+@cindex implementazione, problemi, @command{gawk}, limiti
+@cindex @command{awk}, implementazioni, limiti
+@cindex @command{gawk}, problemi di implementazioni, limiti
+@item
+Alcune tra le prime implementazioni di @command{awk} limitano a una sola il
+numero di @dfn{pipeline} che un programma @command{awk} pu@`o tenere aperte.
+In @command{gawk}, non c'@`e questo limite.
+Si possono aprire tante @dfn{pipeline} (e coprocessi) quante ne permette il
+sistema operativo in uso.
+
+@cindex effetti collaterali, variabile @code{FILENAME}
+@cindex @code{FILENAME}, variabile, impostare con @code{getline}
+@cindex angolo buio, variabile @code{FILENAME}
+@cindex @code{getline}, comando, variabile @code{FILENAME} e
+@cindex @code{BEGIN}, criterio di ricerca, @code{getline} e
+@item
+Un interessante effetto collaterale si ha se si usa @code{getline}, senza
+una ridirezione, all'interno di una regola @code{BEGIN}.  Poich@'e una
+@code{getline} non ridiretta legge dai @value{DF} specificati nella riga di
+comando, il primo comando @code{getline} fa s@`{@dotless{i}} che @command{awk} imposti
+il valore di @code{FILENAME}.  Normalmente, @code{FILENAME} non ha ancora un
+valore all'interno delle regole @code{BEGIN}, perch@'e non si @`e ancora
+iniziato a elaborare il
+@value{DF} della riga di comando.
+@value{DARKCORNER}
+(Si veda @ref{BEGIN/END};
+e @pxref{Variabili auto-assegnate}.)
+
+@item
+Usare @code{FILENAME} con @code{getline}
+(@samp{getline < FILENAME})
+pu@`o essere fonte di
+confusione.  @command{awk} apre un flusso separato di input, diverso dal
+file in input corrente.  Comunque, poich@'e non si usa una variabile,
+@code{$0} e @code{NF} vengono aggiornati.  Se si sta facendo questo, @`e
+probabilmente per sbaglio, e si dovrebbe rivedere quello che si sta cercando
+di fare.
+
+@item
+@ifdocbook
+La prossima @value{SECTION}
+@end ifdocbook
+@ifnotdocbook
+@ref{Sommario di getline},
+@end ifnotdocbook
+contiene una tabella che sintetizza le
+varianti di @code{getline} e le variabili da esse modificate.
+@`E degno di nota che le varianti che non usano la ridirezione
+possono far s@`{@dotless{i}} che @code{FILENAME} venga aggiornato se chiedono ad
+@command{awk} di iniziare a leggere un nuovo file in input.
+
+@item
+@cindex Moore, Duncan
+Se la variabile assegnata @`e un'espressione con effetti collaterali, versioni
+differenti di @command{awk} si comportano in modo diverso quando trovano la
+fine-del-file [EOF].  Alcune versioni non valutano l'espressione; molte
+versioni (compreso @command{gawk}) lo fanno.  Si veda un esempio, gentilmente
+fornito da Duncan Moore:
+
+@ignore
+Date: Sun, 01 Apr 2012 11:49:33 +0100
+From: Duncan Moore <duncan.moore@@gmx.com>
+@end ignore
+
+@example
+BEGIN @{
+    system("echo 1 > f")
+    while ((getline a[++c] < "f") > 0) @{ @}
+    print c
+@}
+@end example
+
+@noindent
+Qui l'effetto secondario @`e @samp{++c}.  Se viene trovata la fine del file
+@emph{prima} di assegnare l'elemento @code{a}, @code{c} @`e incrementato o no?
+
+@command{gawk} tratta @code{getline} come una chiamata di funzione, e valuta
+l'espressione @samp{a[++c]} prima di cercare di leggere da @file{f}.
+Comunque, alcune versioni di @command{awk} valutano l'espressione solo
+se c'@`e un valore di stringa da assegnare.
+@end itemize
+
+@node Sommario di getline
+@subsection Sommario delle varianti di @code{getline}
+@cindex @code{getline}, comando, varianti
+
+La @ref{tabella-varianti-getline}
+riassume le otto varianti di @code{getline},
+elencando le variabili predefinite che sono impostate da ciascuna di esse,
+e se la variante @`e standard o @`e un'estensione di @command{gawk}.
+Nota: per ogni variante, @command{gawk} imposta la variabile predefinita
+@code{RT}.
+
+@float Tabella,tabella-varianti-getline
+@caption{Varianti di @code{getline} e variabili impostate da ognuna}
+@multitable @columnfractions .33 .38 .27
+@headitem Variante @tab Effetto @tab @command{awk} / @command{gawk}
+@item @code{getline} @tab Imposta @code{$0}, @code{NF}, @code{FNR}, @code{NR}, e @code{RT} @tab @command{awk}
+@item @code{getline} @var{var} @tab Imposta @var{var}, @code{FNR}, @code{NR}, e @code{RT} @tab @command{awk}
+@item @code{getline <} @var{file} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{awk}
+@item @code{getline @var{var} < @var{file}} @tab Imposta @var{var} e @code{RT} @tab @command{awk}
+@item @var{comando} @code{| getline} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{awk}
+@item @var{comando} @code{| getline} @var{var} @tab Imposta @var{var} e @code{RT} @tab @command{awk}
+@item @var{comando} @code{|& getline} @tab Imposta @code{$0}, @code{NF}, e @code{RT} @tab @command{gawk}
+@item @var{comando} @code{|& getline} @var{var} @tab Imposta @var{var} e @code{RT} @tab @command{gawk}
+@end multitable
+@end float
+
+@node Timeout in lettura
+@section Leggere input entro un tempo limite
+@cindex tempo limite, leggere input
+@cindex @dfn{timeout}, si veda tempo limite
+
+@cindex differenze tra @command{awk} e @command{gawk}, tempo limite per lettura
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+
+Si pu@`o  specificare un tempo limite in millisecondi per leggere l'input dalla
+tastiera, da una @dfn{pipe} o da una comunicazione bidirezionale, compresi i
+@dfn{socket} TCP/IP.  Questo pu@`o essere fatto per input, per comando o per
+connessione, impostando un elemento speciale nel vettore @code{PROCINFO}
+(@pxref{Variabili auto-assegnate}):
+
+@example
+PROCINFO["nome_input", "READ_TIMEOUT"] = @var{tempo limite in millisecondi}
+@end example
+
+Se @`e impostato, @command{gawk} smette di attendere una risposta e restituisce
+insuccesso se non sono disponibili dati da leggere entro il limite di tempo
+specificato.  Per esempio, un cliente TCP pu@`o decidere di abbandonare se
+non riceve alcuna risposta dal server dopo un certo periodo di tempo:
+
+@example
+@group
+Service = "/inet/tcp/0/localhost/daytime"
+PROCINFO[Service, "READ_TIMEOUT"] = 100
+if ((Service |& getline) > 0)
+    print $0
+else if (ERRNO != "")
+    print ERRNO
+@end group
+@end example
+
+Qui vediamo come ottenere dati interattivamente dall'utente@footnote{Questo
+presuppone che lo standard input provenga dalla tastiera.} aspettando per
+non pi@`u di cinque secondi:
+
+@example
+PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 5000
+while ((getline < "/dev/stdin") > 0)
+    print $0
+@end example
+
+@command{gawk} termina l'operazione di lettura se l'input non
+arriva entro il periodo di tempo limite, restituisce insuccesso
+e imposta @code{ERRNO} a una stringa di valore adeguato.
+Un valore del tempo limite negativo o pari a zero equivale a non specificare
+affatto un tempo limite.
+
+Si pu@`o impostare un tempo limite anche per leggere dalla tastiera nel ciclo
+implicito che legge i record in input e li confronta coi criteri di ricerca,
+come:
+
+@example
+$ @kbd{gawk 'BEGIN @{ PROCINFO["-", "READ_TIMEOUT"] = 5000 @}}
+> @kbd{@{ print "You entered: " $0 @}'}
+@kbd{gawk}
+@print{} You entered: gawk
+@end example
+
+In questo caso, la mancata risposta entro cinque secondi d@`a luogo al seguente
+messaggio di errore:
+
+@example
+@c questo @`e l'output effettivo - Antonio
+@error{} gawk: riga com.:2: (FILENAME=- FNR=1) fatale: errore leggendo
+@error{}                         file in input `-': Connessione scaduta
+@end example
+
+Il tempo limite pu@`o essere impostato o cambiato in qualsiasi momento, e avr@`a
+effetto al tentativo successivo di leggere dal dispositivo di input.  Nel
+seguente esempio, partiamo con un valore di tempo limite di un secondo e
+lo riduciamo progressivamente di un decimo di secondo finch@'e l'attesa
+per l'input diventa illimitata.
+
+@example
+PROCINFO[Service, "READ_TIMEOUT"] = 1000
+while ((Service |& getline) > 0) @{
+    print $0
+    PROCINFO[Service, "READ_TIMEOUT"] -= 100
+@}
+@end example
+
+@quotation NOTA
+Non si deve dare per scontato che l'operazione di lettura si blocchi
+esattamente dopo che @`e stato stampato il decimo record.  @`E possibile che
+@command{gawk} legga e tenga in memoria i dati di pi@`u di un record
+la prima volta.  Per questo, cambiare il valore del tempo
+limite come nell'esempio appena visto non @`e molto utile.
+@end quotation
+
+Se l'elemento di @code{PROCINFO} non @`e presente e la variabile d'ambiente
+@env{GAWK_READ_TIMEOUT} esiste,
+@command{gawk} usa il suo valore per inizializzare il valore di tempo limite.
+L'uso esclusivo della variabile d'ambiente per specificare il tempo limite
+ha lo svantaggio di non essere
+adattabile per ogni comando o per ogni connessione.
+
+@command{gawk} considera errore un superamento di tempo limite anche se
+il tentativo di leggere dal dispositivo sottostante potrebbe riuscire
+in un tentativo successivo.  Questa @`e una limitazione, e inoltre
+significa che non @`e possibile usarlo per ottenere input multipli,
+provenienti da due o pi@`u sorgenti.  @xref{Proseguire dopo errore in input}
+per una modalit@`a che consente di tentare ulteriori operazioni di I/O.
+
+Assegnare un valore di tempo limite previene un blocco a tempo indeterminato
+legato a operazioni di lettura.  Si tenga per@`o presente che ci sono altre
+situazioni in cui @command{gawk} pu@`o restare bloccato in attesa che un
+dispositivo di input sia pronto.  Un cliente di rete a volte pu@`o impiegare
+molto tempo per stabilire una
+connessione prima di poter iniziare a leggere qualsiasi dato,
+oppure il tentativo di aprire un file speciale FIFO in lettura pu@`o bloccarsi
+indefinitamente in attesa che qualche altro processo lo apra in scrittura.
+
+@node Proseguire dopo errore in input
+@section Elaborare ulteriore input dopo certi errori di I/O
+@cindex proseguire dopo errore in input
+@cindex errore in input, possibilit@`a di proseguire
+
+@cindex differenze tra @command{awk} e @command{gawk}, proseguire dopo errore in input
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+
+Qualora @command{gawk} incontri un errore durante la lettura dell'input,
+per default @code{getline} ha come codice di ritorno @minus{}1, e i
+successivi tentativi di leggere dallo stesso file restituiscono una
+indicazione di fine-file.  @`E tuttavia possibile chiedere a
+@command{gawk} di consentire un ulteriore tentativo di lettura in presenza
+di certi errori, impostando uno speciale elemento del vettore
+@code{PROCINFO} (@pxref{Variabili auto-assegnate}):
+
+@example
+PROCINFO["@var{nome_input_file}", "RETRY"] = 1
+@end example
+
+Quando un tale elemento esiste, @command{gawk} controlla il valore della
+variabile di sistema
+(nel linguaggio C)
+@code{errno} quando si verifica un errore di I/O.
+Se @code{errno} indica che un ulteriore tentativo di lettura pu@`o
+terminare con successo, @code{getline} ha come codice di ritorno @minus{}2
+e ulteriori chiamate a @code{getline} possono terminare correttamente.
+Questo vale per i seguenti valori di @code{errno}: @code{EAGAIN},
+@code{EWOULDBLOCK}, @code{EINTR}, e @code{ETIMEDOUT}.
+
+Questa funzionalit@`a @`e utile quando si assegna un valore all'elemento
+@code{PROCINFO["@var{nome_input_file}", "READ_TIMEOUT"]} o in situazioni
+in cui un descrittore di file sia stato configurato per comportarsi in
+modo non bloccante.
+
+@node Directory su riga di comando
+@section Directory sulla riga di comando
+@cindex differenze tra @command{awk} e @command{gawk}, directory sulla riga di comando
+@cindex directory, riga di comando
+@cindex riga di comando, directory su
+
+Per lo standard POSIX, i file che compaiono sulla riga di comando di
+@command{awk} devono essere file di testo; @`e un errore fatale se non lo sono.
+La maggior parte delle versioni di @command{awk} genera un errore fatale
+quando trova una directory sulla riga di comando.
+
+Per default, @command{gawk} emette un avvertimento se c'@`e una directory sulla
+riga di comando, e in ogni caso la ignora.  Questo rende pi@`u facile usare
+metacaratteri di shell col proprio programma @command{awk}:
+
+@example
+$ @kbd{gawk -f whizprog.awk *} @ii{Le directory potrebbero far fallire il programma}
+@end example
+
+Se viene data una delle opzioni @option{--posix}
+o @option{--traditional}, @command{gawk} considera invece
+una directory sulla riga di comando come un errore fatale.
+
+@xref{Esempio di estensione Readdir} per un modo di trattare le directory
+come dati usabili da un programma @command{awk}.
+
+@sp 2
+@node Sommario di Input
+@section Sommario di Input
+
+@itemize @value{BULLET}
+@item
+L'input @`e diviso in record in base al valore di @code{RS}.
+Le possibilit@`a sono le seguenti:
+
+@multitable @columnfractions .28 .45 .40
+@headitem Valore di @code{RS} @tab Record separati da @dots{} @tab @command{awk} / @command{gawk}
+@item Un carattere singolo @tab Quel carattere @tab @command{awk}
+@item La stringa nulla (@code{""}) @tab Serie di due o pi@`u ritorni a capo @tab @command{awk}
+@item Un'espressione regolare @tab Testo corrispondente alla @dfn{regexp} @tab @command{gawk}
+@end multitable
+
+@item
+@code{FNR} indica quanti record sono stati letti dal file in input corrente;
+@code{NR} indica quanti record sono stati letti in totale.
+
+@item
+@command{gawk} imposta @code{RT} al testo individuato da @code{RS}.
+
+@item
+Dopo la divisione dell'input in record, @command{awk} divide
+i record in singoli campi, chiamati @code{$1}, @code{$2} e cos@`{@dotless{i}}
+via.  @code{$0} @`e l'intero record, e @code{NF} indica quanti campi
+contiene.  Il metodo di default per dividere i campi utilizza i
+caratteri di spazio vuoto.
+
+@item Si pu@`o far riferimento ai campi usando una variabile, come in @code{$NF}.
+Ai campi possono anche essere assegnati dei valori, e questo implica che il
+valore di @code{$0} sia ricalcolato se ad esso si fa riferimento in seguito.
+Fare un assegnamento a un campo con un numero maggiore di @code{NF} crea il
+campo e ricostruisce il record, usando @code{OFS} per separare i campi.
+Incrementare @code{NF} fa la stessa cosa.  Decrementare @code{NF} scarta dei
+campi e ricostruisce il record.
+
+@item
+Separare i campi @`e pi@`u complicato che separare i record.
+
+@multitable @columnfractions .40 .40 .20
+@headitem Valore del separatore di campo @tab Campi separati @dots{} @tab @command{awk} / @command{gawk}
+@item @code{FS == " "} @tab Da serie di spazi vuoti @tab @command{awk}
+@item @code{FS == @var{un solo carattere}} @tab Da quel carattere @tab @command{awk}
+@item @code{FS == @var{espr. reg.}} @tab Dal testo che corrisponde alla @dfn{regexp} @tab @command{awk}
+@item @code{FS == ""}  @tab Cos@`{@dotless{i}} ogni singolo carattere @`e un campo separato @tab @command{gawk}
+@item @code{FIELDWIDTHS == @var{lista di colonne}} @tab Basata sulla posizione del carattere @tab @command{gawk}
+@item @code{FPAT == @var{regexp}} @tab Dal testo attorno al testo corrispondente alla @dfn{regexp} @tab @command{gawk}
+@end multitable
+
+@item
+Usando @samp{FS = "\n"} l'intero record sar@`a un unico campo
+(nell'ipotesi che i record siano separati da caratteri di ritorno a capo).
+
+@item
+@code{FS} pu@`o essere impostato dalla riga di comando con l'opzione
+@option{-F}.
+Si pu@`o fare la stessa cosa usando un assegnamento di variabile da riga di
+comando.
+
+@item
+@code{PROCINFO["FS"]} permette di sapere come i campi sono separati.
+
+@item
+@code{getline} nelle sue diverse forme serve per leggere record aggiuntivi
+provenienti dal flusso di input di default, da un file, o da una @dfn{pipe}
+o da un coprocesso.
+
+@item
+@code{PROCINFO[@var{file}, "READ_TIMEOUT"]} si pu@`o usare per impostare un
+tempo limite alle operazioni di lettura da @var{file}.
+
+@item
+Le directory sulla riga di comando generano un errore fatale per
+@command{awk} standard;
+@command{gawk} le ignora se non @`e in modalit@`a POSIX.
+
+@end itemize
+
+@c EXCLUDE START
+@node Esercizi su Input
+@section Esercizi
+
+@enumerate
+@item
+Usando la variabile @code{FIELDWIDTHS} (@pxref{Dimensione costante}),
+scrivere un programma per leggere i dati delle elezioni, dove ogni record
+rappresenta i voti di un votante.  Trovare un modo per definire quali colonne
+sono associate a ogni quesito elettorale, e stampare i voti totali,
+comprese le astensioni, per ciascun quesito.
+@item
+La @ref{Getline semplice}, ha illustrato un programma per rimuovere i commenti
+in stile C (@samp{/* @dots{} */}) dall'input.  Quel programma
+non funziona se un commento termina in una riga e il successivo commento
+inizia nella stessa riga.
+Il problema si pu@`o risolvere con una semplice modifica.  Quale?
+
+@end enumerate
+@c EXCLUDE END
+
+@node Stampare
+@chapter Stampare in output
+
+@cindex stampare
+@cindex output, stampare, si veda stampare
+Una delle azioni che un programma fa pi@`u comunemente, @`e quella di produrre
+@dfn{stampe}, ossia scrivere in output l'input letto, tutto o in parte.
+Si pu@`o usare l'istruzione @code{print} per una stampa semplice, e l'istruzione
+@code{printf} per una formattazione dell'output pi@`u sofisticata.
+L'istruzione @code{print} non ha un limite al numero di elementi quando
+calcola @emph{quali} valori stampare.  Peraltro, con due eccezioni,
+non @`e possibile specificare @emph{come} stamparli: quante
+colonne, se usare una notazione esponenziale o no, etc.
+(Per le eccezioni, @pxref{Separatori di output} e
+la @ref{OFMT}.)
+Per stampare fornendo delle specifiche, @`e necessario usare
+l'istruzione @code{printf}
+(@pxref{Printf}).
+
+@cindex istruzione @code{print}
+@cindex istruzione @code{printf}
+Oltre alla stampa semplice e formattata, questo @value{CHAPTER}
+esamina anche le ridirezioni di I/O verso file e @dfn{pipe}, introduce
+i @value{FNS} speciali che @command{gawk} elabora internamente,
+e parla della funzione predefinita @code{close()}.
+
+@menu
+* Print::                       L'istruzione @code{print}.
+* Esempi su print::             Semplici esempi di
+                                istruzioni @code{print}.
+* Separatori di output::        I separatori di output e come
+                                modificarli.
+* OFMT::                        Controllare l'output di numeri con
+                                @code{print}.
+* Printf::                      l'istruzione @code{printf}.
+* Ridirezione::                 Come ridirigere l'output a diversi
+                                file e @dfn{pipe}.
+* FD speciali::                 I/O con FD [Descrittori File]
+                                speciali.
+* File speciali::               Interpretazione nomi file in
+                                @command{gawk}. @command{gawk}
+                                Permette di accedere a descrittori
+				file gi@`a aperti a inizio esecuzione
+* Chiusura file e @dfn{pipe}::  Chiudere file in input e di output e
+                                @dfn{pipe}.
+* Continuazione dopo errori::   Abilitare continuazione dopo errori
+                                in output.
+* Sommario di Output::          Sommario di Output.
+* Esercizi su Output::          Esercizi.
+@end menu
+
+@node Print
+@section L'istruzione @code{print}
+
+L'istruzione @code{print} si usa per produrre dell'output formattato in
+maniera semplice, standardizzata.  Si
+specificano solo le stringhe o i numeri
+da stampare, in una lista separata da virgole.  Questi elementi sono stampati,
+separati tra loro da spazi singoli, e alla fine viene stampato un
+ritorno a capo.  L'istruzione @`e simile a questa:
+
+@example
+print @var{elemento1}, @var{elemento2}, @dots{}
+@end example
+
+@noindent
+L'intera lista di elementi pu@`o opzionalmente essere racchiusa fra
+parentesi.  Le parentesi sono obbligatorie se qualche espressione presente
+in uno degli elementi usa l'operatore relazionale @samp{>}, che potrebbe
+essere confuso con una ridirezione dell'output (@pxref{Ridirezione}).
+
+Gli elementi da stampare possono essere stringhe costanti o numeri, campi
+del record corrente (come @code{$1}), variabili, o quasiasi espressione
+@command{awk}.  I valori numerici sono convertiti in stringhe prima di essere
+stampati.
+
+@cindex record, stampare
+@cindex righe, vuote, stampare
+@cindex testo, stampare
+Una semplice istruzione @samp{print} senza specificare elementi equivale a
+@samp{print $0}: stampa l'intero record corrente.  Per stampare una riga
+vuota, si usa @samp{print ""}.
+Per stampare un testo che non cambia, si usi come elemento una costante
+stringa, per esempio @w{@code{"Non v'allarmate"}}.  Dimenticandosi di mettere
+i doppi apici, il testo @`e preso per un'espressione @command{awk},
+e probabilmente verr@`a emesso un messaggio di errore.  Occorre tener presente
+che tra ogni coppia di elementi viene stampato uno spazio.
+
+Si noti che l'istruzione @code{print} @`e un'istruzione, e non
+un'espressione: non @`e possibile usarla nella parte modello [di ricerca] di
+un'istruzione @dfn{criterio di ricerca--azione}, per esempio.
+
+@node Esempi su print
+@section Esempi di istruzioni @code{print}
+
+Ogni istruzione @code{print} produce almeno una riga in output.  Comunque,
+non @`e limitata a una sola riga.  Se il valore di un elemento @`e una stringa
+che contiene un ritorno a capo, il ritorno a capo @`e stampato insieme al
+resto della stringa.  Una
+singola istruzione @code{print} pu@`o in questo modo generare un numero
+qualsiasi di righe.
+
+@cindex ritorno a capo, stampare un
+Quel che segue @`e un esempio di stampa di una stringa che contiene al suo
+interno dei
+@ifinfo
+ritorni a capo
+(la @samp{\n} @`e una sequenza di protezione, che si usa per rappresentare il
+carattere di ritorno a capo; @pxref{Sequenze di protezione}):
+@end ifinfo
+@ifhtml
+ritorni a capo
+(la @samp{\n} @`e una sequenza di protezione, che si usa per rappresentare il
+carattere di ritorno a capo; @pxref{Sequenze di protezione}):
+@end ifhtml
+@ifnotinfo
+@ifnothtml
+ritorni a capo:
+@end ifnothtml
+@end ifnotinfo
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{ print "riga uno\nriga due\nriga tre" @}'}
+@print{} riga uno
+@print{} riga due
+@print{} riga tre
+@end group
+@end example
+
+@cindex campi, stampare
+Il prossimo esempio, eseguito sul file @file{inventory-shipped},
+stampa i primi due campi di ogni record in input, separandoli con uno
+spazio:
+
+@example
+$ @kbd{awk '@{ print $1, $2 @}' inventory-shipped}
+@print{} Jan 13
+@print{} Feb 15
+@print{} Mar 15
+@dots{}
+@end example
+
+@cindex istruzione @code{print}, virgole, omettere
+@cindex debug, istruzione @code{print}@comma{} omissione virgole
+Un errore frequente usando l'istruzione @code{print} @`e quello di tralasciare
+la virgola tra due elementi.  Questo ha spesso come risultato la stampa di
+elementi attaccati tra loro, senza lo spazio di separazione.  Il motivo per
+cui ci@`o accade @`e che la scrittura di due
+espressioni di stringa in @command{awk} ne indica la concatenazione.  Qui si
+vede l'effetto dello stesso programma,
+senza le virgole:
+
+@example
+$ @kbd{awk '@{ print $1 $2 @}' inventory-shipped}
+@print{} Jan13
+@print{} Feb15
+@print{} Mar15
+@dots{}
+@end example
+
+@cindex @code{BEGIN}, criterio di ricerca, intestazioni, aggiungere
+Per chi non conosce il file @file{inventory-shipped} nessuno
+dei due output di esempio risulta molto comprensibile.  Una riga iniziale di
+intestazione li renderebbe pi@`u chiari.
+Aggiungiamo qualche intestazione alla nostra tabella dei mesi
+(@code{$1}) e dei contenitori verdi spediti (@code{$2}).  Lo facciamo usando
+una regola @code{BEGIN} (@pxref{BEGIN/END}) in modo che le intestazioni siano
+stampate una volta sola:
+
+@example
+awk 'BEGIN @{  print "Mese  Contenitori"
+              print "----- -----------" @}
+           @{  print $1, $2 @}' inventory-shipped
+@end example
+
+@noindent
+Una volta eseguito, il programma stampa questo:
+
+@example
+Mese  Contenitori
+----- -----------
+Jan 13
+Feb 15
+Mar 15
+@dots{}
+@end example
+
+@noindent
+Il solo problema, in effetti, @`e che le intestazioni e i dati della tabella
+non sono allineati!  Possiamo provvedere stampando alcuni spazi tra i due
+campi:
+
+@example
+@group
+awk 'BEGIN @{  print "Mese  Contenitori"
+              print "----- -----------" @}
+           @{ print $1, "     ", $2 @}' inventory-shipped
+@end group
+@end example
+
+@cindex istruzione @code{printf}, colonne@comma{} allineamento
+@cindex colonne, allineamento
+Allineare le colonne in questo modo pu@`o diventare piuttosto
+complicato, quando ci sono parecchie colonne da tenere allineate.  Contare gli
+spazi per due o tre colonne @`e semplice, ma oltre questo limite comincia a
+volerci molto tempo.  Ecco perch@'e @`e disponibile l'istruzione @code{printf}
+(@pxref{Printf});
+una delle possibilit@`a che offre @`e quella di allineare colonne di dati.
+
+@cindex continuazione di riga, in istruzione @code{print}
+@cindex istruzione @code{print}, continuazione di riga e
+@cindex @code{print}, istruzione, continuazione di riga e
+@quotation NOTA
+Si pu@`o continuare su pi@`u righe sia l'istruzione @code{print} che l'istruzione
+@code{printf} semplicemente mettendo un ritorno a capo dopo una virgola
+qualsiasi
+(@pxref{Istruzioni/Righe}).
+@end quotation
+
+@node Separatori di output
+@section I separatori di output e come modificarli
+
+@cindex variabile @code{OFS}
+Come detto sopra, un'istruzione @code{print} contiene una lista di elementi
+separati da virgole.  Nell'output, gli elementi sono solitamente separati
+da spazi singoli.  Non @`e detto tuttavia che debba sempre essere cos@`{@dotless{i}}; uno
+spazio singolo @`e semplicemente il valore di default.  Qualsiasi stringa di
+caratteri pu@`o essere usata come
+@dfn{separatore di campo in output} impostando la variabile
+predefinita @code{OFS}.  Il valore iniziale di questa variabile @`e
+la stringa @w{@code{" "}} (cio@`e, uno spazio singolo).
+
+L'output di un'istruzione @code{print} completa @`e detto un @dfn{record di
+output}.  Ogni istruzione @code{print} stampa un record di output, e alla fine
+ci aggiunge una stringa detta @dfn{separatore record in output} (o
+@code{ORS}).  Il valore iniziale di @code{ORS} @`e la stringa @code{"\n"}
+(cio@`e, un carattere di ritorno a capo).  Quindi, ogni istruzione
+@code{print} normalmente genera [almeno] una riga a s@'e stante.
+
+@cindex output, record
+@cindex separatore di record in output, si veda @code{ORS}, variabile
+@cindex @code{ORS}, variabile
+@cindex @code{BEGIN}, criterio di ricerca, variabili @code{OFS}/@code{ORS}, assegnare valori a
+Per cambiare il tipo di separazione in output di campi e record, si impostano
+valori differenti alle variabili @code{OFS} e @code{ORS}.  Il posto pi@`u
+indicato per farlo @`e nella regola @code{BEGIN}
+(@pxref{BEGIN/END}), in modo che l'assegnazione abbia effetto prima
+dell'elaborazione di ogni record in input.  Questi valori si possono
+anche impostare dalla riga di comando, prima della lista dei file in input,
+oppure usando l'opzione della riga di comando @option{-v}
+(@pxref{Opzioni}).
+L'esempio seguente stampa il primo e il secondo campo di ogni record in input,
+separati da un punto e virgola, con una riga vuota aggiunta dopo ogni
+ritorno a capo:
+
+
+@example
+$ @kbd{awk 'BEGIN @{ OFS = ";"; ORS = "\n\n" @}}
+>            @kbd{@{ print $1, $2 @}' mail-list}
+@print{} Amelia;555-5553
+@print{}
+@print{} Anthony;555-3412
+@print{}
+@print{} Becky;555-7685
+@print{}
+@print{} Bill;555-1675
+@print{}
+@print{} Broderick;555-0542
+@print{}
+@print{} Camilla;555-2912
+@print{}
+@print{} Fabius;555-1234
+@print{}
+@print{} Julie;555-6699
+@print{}
+@print{} Martin;555-6480
+@print{}
+@print{} Samuel;555-3430
+@print{}
+@print{} Jean-Paul;555-2127
+@print{}
+@end example
+
+Se il valore di @code{ORS} non contiene un ritorno a capo, l'output del
+programma viene scritto tutto su un'unica riga.
+
+@node OFMT
+@section Controllare l'output di numeri con @code{print}
+@cindex numerico, formato di output
+@cindex formati numerici di output
+Quando si stampano valori numerici con l'istruzione @code{print},
+@command{awk} converte internamente ogni numero in una stringa di caratteri
+e stampa quella stringa.  @command{awk} usa la funzione @code{sprintf()}
+per effettuare questa conversione
+(@pxref{Funzioni per stringhe}).
+Per ora, basta dire che la funzione @code{sprintf()}
+accetta una @dfn{specifica di formato} che indica come formattare
+i numeri (o le stringhe), e che ci sono svariati modi per formattare i
+numeri.  Le differenti specifiche di formato sono trattate pi@`u
+esaurientemente
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Lettere di controllo}.
+
+@cindexawkfunc{sprintf}
+@cindex @code{OFMT}, variabile
+@cindex output, specificatore di formato@comma{} @code{OFMT}
+La variabile predefinita @code{OFMT} contiene la specifica di formato
+che @code{print} usa con @code{sprintf()} per convertire un numero in
+una stringa per poterla stampare.
+Il valore di default di @code{OFMT} @`e @code{"%.6g"}.
+Il modo in cui @code{print} stampa i numeri si pu@`o cambiare
+fornendo una specifica di formato differente
+per il valore di @code{OFMT}, come mostrato nell'esempio seguente:
+
+@example
+$ @kbd{awk 'BEGIN @{}
+>   @kbd{OFMT = "%.0f"  # Stampa numeri come interi (arrotonda)}
+>   @kbd{print 17.23, 17.54 @}'}
+@print{} 17 18
+@end example
+
+@noindent
+@cindex angolo buio, variabile @code{OFMT}
+@cindex POSIX @command{awk}, variabile @code{OFMT} e
+@cindex variabile @code{OFMT}, POSIX @command{awk} e
+Per lo standard POSIX, il comportamento di @command{awk} @`e indefinito
+se @code{OFMT} contiene qualcosa di diverso da una specifica di conversione
+di un numero in virgola mobile.
+@value{DARKCORNER}
+
+@node Printf
+@section Usare l'istruzione @code{printf} per stampe sofisticate
+
+@cindex istruzione @code{printf}
+@cindex @code{printf}, istruzione
+@cindex output, formattato
+@cindex formattare l'output
+Per un controllo pi@`u ampio sul formato di output di quello fornito da
+@code{print}, si pu@`o usare @code{printf}.
+Con @code{printf} si pu@`o
+specificare lo spazio da utilizzare per ogni elemento, e anche le varie
+scelte di formattazione disponibile per i numeri (come la base da usare in
+output, se stampare con notazione esponenziale, se inserire un segno, e quante
+cifre stampare dopo il separatore decimale).
+
+@menu
+* Printf Fondamenti::         Sintassi dell'istruzione
+                              @code{printf}.
+* Lettere di controllo::      Lettere di controllo del formato.
+* Modificatori di formato::             Modificatori specifiche di formato.
+* Esempi su printf::          Numerosi esempi.
+@end menu
+
+@node Printf Fondamenti
+@subsection Sintassi dell'istruzione @code{printf}
+
+@cindex istruzione @code{printf}, sintassi dell'
+@cindex @code{printf}, sintassi dell'istruzione
+Una semplice istruzione @code{printf} @`e qualcosa di simile a questo:
+
+@example
+printf @var{formato}, @var{elemento1}, @var{elemento2}, @dots{}
+@end example
+
+@noindent
+Come nel caso di @code{print}, l'intera lista degli argomenti pu@`o
+opzionalmente essere racchiusa fra
+parentesi.  Anche qui, le parentesi sono obbligatorie se l'espressione di
+qualche elemento usa l'operatore
+relazionale @samp{>}, che potrebbe
+essere confuso con una ridirezione dell'output (@pxref{Ridirezione}).
+
+@cindex specificatori di formato
+La differenza tra @code{printf} e @code{print} @`e l'argomento @var{formato}.
+Questo @`e un'espressione il cui valore @`e visto come una stringa;
+specifica come scrivere in output ognuno degli altri argomenti.  @`E chiamata
+@dfn{stringa di formato}.
+
+La stringa di formato @`e molto simile a quella usata dalla funzione di
+libreria ISO C @code{printf()}.  Buona parte del @var{formato} @`e testo da
+stampare cos@`{@dotless{i}} come @`e scritto.
+All'interno di questo testo ci sono degli @dfn{specificatori di formato},
+uno per ogni elemento da stampare.
+Ogni specificatore di formato richiede di stampare l'elemento successivo
+nella lista degli argomenti
+in quella posizione del formato.
+
+L'istruzione @code{printf} non aggiunge in automatico un ritorno a capo
+al suo output.  Scrive solo quanto specificato dalla stringa di formato.
+Quindi, se serve un ritorno a capo, questo va incluso nella stringa di formato.
+Le variabili di separazione dell'output @code{OFS} e @code{ORS} non hanno
+effetto sulle istruzioni @code{printf}.
+Per esempio:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{}
+>    @kbd{ORS = "\nAHI!\n"; OFS = "+"}
+>    @kbd{msg = "Non v\47allarmate!"}
+>    @kbd{printf "%s\n", msg}
+> @kbd{@}'}
+@print{} Non v'allarmate!
+@end group
+@end example
+
+@noindent
+Qui, n@'e il @samp{+} n@'e l'esclamazione @samp{AHI!} compaiono nel messaggio
+in output.
+
+@node Lettere di controllo
+@subsection Lettere di controllo del formato
+@cindex istruzione @code{printf}, lettere di controllo del formato
+@cindex @code{printf}, istruzione, lettere di controllo del formato
+@cindex specificatori di formato, istruzione @code{printf}
+
+Uno specificatore di formato inizia col carattere @samp{%} e termina con
+una @dfn{lettera di controllo del formato}; e dice all'istruzione
+@code{printf} come stampare un elemento.  La lettera di controllo del
+formato specifica che @emph{tipo}
+di valore stampare.  Il resto dello specificatore di formato @`e costituito da
+@dfn{modificatori} opzionali che controllano @emph{come} stampare il valore,
+per esempio stabilendo la larghezza del campo.  Ecco una lista delle
+lettere di controllo del formato:
+
+@c @asis for docbook to come out right
+@table @asis
+@item @code{%a}, @code{%A}
+Un numero in virgola mobile scritto nella forma
+[@code{-}]@code{0x@var{h}.@var{hhhh}p+-@var{dd}}
+(formato esadecimale virgola mobile nel compilatore C99).
+Per @code{%A},
+si usano lettere maiuscole invece che lettere minuscole.
+
+@quotation NOTA
+Lo standard POSIX in vigore richiede il supporto di @code{%a}
+e di @code{%A} in @command{awk}.  Per quanto ci consta, oltre a
+@command{gawk}, la sola altra versione di @command{awk} che fornisce
+questo supporto @`e BWK @command{awk}.
+Se si usano questi formati, il programma in questione @`e quindi
+estremamente non-portabile!
+
+Inoltre, questi formati non sono disponibili su alcun sistema in cui
+la funzione di libreria C @code{printf()} utilizzata da @command{gawk}
+non li supporta.
+Al momento in cui questo libro @`e stato scritto, fra i sistemi su cui
+@`e stato portato @command{gawk}, il solo sistema noto che
+non li supporta @`e OpenVMS.
+@end quotation
+
+@item @code{%c}
+Stampa un numero come un carattere; quindi, @samp{printf "%c",
+65} stampa la lettera @samp{A}. L'output per un valore costituito da una
+stringa @`e il primo carattere della stringa stessa.
+
+@cindex angolo buio, caratteri di controllo del formato
+@cindex @command{gawk}, caratteri di controllo del formato
+@quotation NOTA
+Lo standard POSIX richiede che il primo carattere di una stringa sia stampato.
+In localizzazioni con caratteri multibyte, @command{gawk} tenta di
+convertire i primi byte della stringa in un carattere multibyte valido
+e poi di stampare la codifica multibyte di quel carattere.
+Analogamente, nella stampa di un valore numerico, @command{gawk} ammette che
+il valore appartenga all'intervallo numerico di valori che possono essere
+contenuti in un carattere multibyte.
+Se la conversione alla codifica multibyte non riesce, @command{gawk}
+usa gli ultimi otto bit della cifra (quelli meno significativi) come
+carattere da stampare.
+
+Altre versioni di @command{awk} generalmente si limitano a stampare
+il primo byte di una stringa o i valori numerici che possono essere
+rappresentati in un singolo byte (0--255).
+@value{DARKCORNER}
+@end quotation
+
+
+@item @code{%d}, @code{%i}
+Stampa un numero intero in base decimale.
+Le due lettere di controllo sono equivalenti.
+(La specificazione @samp{%i} @`e ammessa per compatibilit@`a con ISO C.)
+
+@item @code{%e}, @code{%E}
+Stampa un numero nella notazione scientifica (con uso di esponente).
+Per esempio:
+
+@example
+printf "%4.3e\n", 1950
+@end example
+
+@noindent
+stampa @samp{1.950e+03}, con un totale di quattro cifre significative, tre
+delle quali
+seguono il punto che separa la parte intera da quella decimale
+[in Italia si usa la virgola al posto del punto]
+(L'espressione @samp{4.3} rappresenta due modificatori,
+introdotti nella prossima @value{SUBSECTION}).
+@samp{%E} usa @samp{E} invece di @samp{e} nell'output.
+
+@item @code{%f}
+Stampa un numero in notazione in virgola mobile.
+Per esempio:
+
+@example
+printf "%4.3f", 1950
+@end example
+
+@noindent
+stampa @samp{1950.000}, con un minimo di quattro cifre significative, tre
+delle quali vengono dopo il punto decimale.
+(L'espressione @samp{4.3} rappresenta due modificatori,
+introdotti nella prossima @value{SUBSECTION}).
+
+In sistemi che implementano il formato in virgola mobile, come specificato
+dallo standard IEEE 754, il valore infinito negativo @`e rappresentato come
+@samp{-inf} o @samp{-infinity},
+e l'infinito positivo come
+@samp{inf} o @samp{infinity}.
+Il valore speciale ``not a number'' [non @`e un numero] viene scritto come
+@samp{-nan} o @samp{nan}
+(@pxref{Definizioni matematiche}).
+
+@item @code{%F}
+Come @samp{%f}, ma i valori di infinito e di ``not a number'' sono scritti
+in lettere maiuscole.
+
+Il formato @samp{%F} @`e un'estensione POSIX allo standard ISO C; non tutti
+i sistemi lo prevedono.  In tali casi,
+@command{gawk} usa il formato @samp{%f}.
+
+@item @code{%g}, @code{%G}
+Stampa un numero usando o la notazione scientifica o quella in virgola
+mobile, scegliendo la forma pi@`u concisa; se il risultato @`e stampato usando la
+notazione scientifica, @samp{%G} usa @samp{E} invece di @samp{e}.
+
+@item @code{%o}
+Stampa un numero intero in ottale, senza segno
+(@pxref{Numeri non-decimali}).
+
+@item @code{%s}
+Stampa una stringa.
+
+@item @code{%u}
+Stampa un numero intero decimale, senza segno.
+(Questo formato @`e poco usato, perch@'e tutti i numeri in @command{awk}
+sono in virgola mobile; @`e disponibile principalmente per compatibilit@`a col
+linguaggio C.)
+
+@item @code{%x}, @code{%X}
+Stampa un intero esadecimale senza segno;
+@samp{%X} usa le lettere da @samp{A} a @samp{F}
+invece che da @samp{a} a @samp{f}
+(@pxref{Numeri non-decimali}).
+
+@item @code{%%}
+Stampa un solo carattere @samp{%}.
+Questa notazione non serve per stampare alcun
+argomento e ignora eventuali modificatori.
+@end table
+
+@cindex angolo buio, caratteri di controllo del formato
+@cindex @command{gawk}, caratteri di controllo del formato
+@quotation NOTA
+Quando si usano lettere di controllo del formato per numeri interi
+per stampare valori esterni all'intervallo massimo disponibile nel
+linguaggio C per i numeri interi,
+@command{gawk} usa lo
+specificatore di formato @samp{%g}. Se si specifica l'opzione @option{--lint}
+sulla riga di comando (@pxref{Opzioni}), @command{gawk}
+emette un messaggio di avvertimento.  Altre versioni di @command{awk} possono
+stampare valori non validi, o comportarsi in modo completamente differente.
+@value{DARKCORNER}
+@end quotation
+
+@quotation NOTA
+Lo standard IEEE 754 per l'aritmetica in virgola mobile consente di
+avere valori speciali per rappresentare ``infinito'' (sia positivo che
+negativo) e valori che sono ``non numerici'' (NaN - [Not a Number]).
+
+L'input e l'output di tali valori avviene sotto forma di stringhe di
+testo.  Ci@`o pone dei problemi nel linguaggio @command{awk}, che
+esisteva gi@`a prima della definizione dello standard IEEE.  Dettagli
+ulteriori si possono trovare in @ref{Problemi virgola mobile POSIX};
+si prega di fare riferimento a quel testo.
+@end quotation
+
+@node Modificatori di formato
+@subsection Modificatori per specifiche di formato @code{printf}
+
+@cindex istruzione @code{printf}, modificatori
+@cindex @code{printf}, istruzione, modificatori
+@cindex modificatori@comma{} in specificatori di formato
+Una specifica di formato pu@`o anche includere dei @dfn{modificatori} che
+possono controllare che parte stampare del valore dell'elemento, e anche
+quanto spazio utilizzare per stamparlo.
+I modificatori sono posizionati tra il @samp{%} e la lettera che controlla
+il formato.
+Negli esempi seguenti verr@`a usato il simbolo del punto elenco ``@bullet{}'' per
+rappresentare
+spazi nell'output.  Questi sono i modificatori previsti, nell'ordine in
+cui possono apparire:
+
+@table @asis
+@cindex differenze tra @command{awk} e @command{gawk}, tra istruzioni @code{print} e @code{printf}
+@cindex istruzione @code{printf}, specificatori posizionali
+@cindex @code{printf}, istruzione, specificatori posizionali
+@c the code{} does NOT start a secondary
+@cindex specificatori posizionali, istruzione @code{printf}
+@item @code{@var{N}$}
+Una costante intera seguita da un @samp{$} @`e uno @dfn{specificatore posizionale}.
+Normalmente, le specifiche di formato sono applicate agli argomenti
+nell'ordine in cui appaiono nella stringa di formato.  Con uno specificatore
+posizionale, la specifica di formato @`e applicata a un argomento
+indicato per numero, invece che a quello che
+sarebbe il prossimo argomento nella lista.  Gli specificatori posizionali
+iniziano a contare partendo da uno.  Quindi:
+
+@example
+printf "%s %s\n", "Non", "v'allarmate"
+printf "%2$s %1$s\n", "v'allarmate", "Non"
+@end example
+
+@noindent
+stampa per due volte il famoso consiglio amichevole.
+
+A prima vista, questa funzionalit@`a non sembra di grande utilit@`a.
+Si tratta in effetti di un'estensione @command{gawk}, pensata per essere
+usata nella traduzione di messaggi emessi in fase di esecuzione.
+@xref{Ordinamento di printf},
+che descrive come e perch@'e usare specificatori posizionali.
+Per ora li possiamo ignorare.
+
+@item - @code{-} (Segno meno)
+Il segno meno, usato prima del modificatore di larghezza (si veda pi@`u avanti
+in questa lista),
+richiede di allineare a sinistra
+l'argomento mantenendo la larghezza specificata.  Normalmente, l'argomento
+@`e stampato allineato a destra, con la larghezza specificata. Quindi:
+
+@example
+printf "%-6s", "pippo"
+@end example
+
+@noindent
+stampa @samp{pippo@bullet{}}.
+
+@item @var{spazio}
+Applicabile a conversioni numeriche, richiede di inserire uno spazio prima
+dei valori positivi e un segno meno prima di quelli negativi.
+
+@item @code{+}
+Il segno pi@`u, usato prima del modificatore di larghezza (si veda pi@`u avanti
+in questa lista),
+richiede di mettere sempre un segno nelle conversioni numeriche, anche se
+il dato da formattare ha valore positivo.  Il @samp{+} prevale sul
+modificatore @dfn{spazio}.
+
+@item @code{#}
+Richiede di usare una ``forma alternativa'' per alcune lettere di controllo.
+Per @samp{%o}, preporre uno zero.
+Per @samp{%x} e @samp{%X}, preporre @samp{0x} o @samp{0X} se il
+numero @`e diverso da zero.
+Per @samp{%e}, @samp{%E}, @samp{%f}, e @samp{%F}, il risultato deve contenere
+sempre un separatore decimale.
+Per @code{%g} e @code{%G}, gli zeri finali non significativi non sono
+tolti dal numero stampato.
+
+@item @code{0}
+Uno @samp{0} (zero) iniziale serve a richiedere che l'output sia
+riempito con zeri (invece che con spazi), prima delle cifre significative.
+Questo si applica solo ai formati di output di tipo numerico.
+Questo @dfn{flag} ha un effetto solo se la larghezza del campo @`e maggiore
+di quella del valore da stampare.
+
+@item @code{'}
+Un carattere di apice singolo o un apostrofo @`e un'estensione POSIX allo
+standard ISO C.
+Indica che la parte intera di un valore in virgola mobile, o la parte intera
+di un valore decimale intero, ha un carattere di separazione delle migliaia.
+Ci@`o @`e applicabile solo alle localizzazioni che prevedono un tale carattere.
+Per esempio:
+
+@example
+$ @kbd{cat migliaia.awk}          @ii{Visualizza il programma sorgente}
+@print{} BEGIN @{ printf "%'d\n", 1234567 @}
+$ @kbd{LC_ALL=C gawk -f migliaia.awk}
+@print{} 1234567                   @ii{Risultato nella localizzazione} "C"
+$ @kbd{LC_ALL=en_US.UTF-8 gawk -f migliaia.awk}
+@print{} 1,234,567   @ii{Risultato nella localizzazione UTF inglese americana}
+@end example
+
+@noindent
+Per maggiori informazioni relative a localizzazioni e internazionalizzazioni,
+si veda @ref{Localizzazioni}.
+
+@quotation NOTA
+Il @dfn{flag} @samp{'} @`e una funzionalit@`a interessante, ma utilizza un
+carattere che @`e fonte di complicazioni, perch@'e risulta difficila da usare nei
+programmi scritti direttamente sulla riga di comando.  Per informazioni sui
+metodi appropriati per gestire la cosa, si veda @ref{Protezione}.
+@end quotation
+
+@item @var{larghezza}
+Questo @`e un numero che specifica la larghezza minima che deve occupare un
+campo.  L'inserimento di un numero tra il segno @samp{%} e il carattere
+di controllo del formato fa s@`{@dotless{i}} che il campo si espanda a quella larghezza.
+Il modo di default per fare questo @`e di aggiungere degli spazi a
+sinistra.  Per esempio:
+
+@example
+printf "%6s", "pippo"
+@end example
+
+@noindent
+stampa @samp{@bullet{}pippo}.
+
+il valore di @var{larghezza} indica la larghezza minima, non la massima.  Se
+il valore dell'elemento richiede pi@`u caratteri della @var{larghezza}
+specificata, questa pu@`o essere aumentata secondo necessit@`a.
+Quindi, per esempio:
+
+@example
+printf "%6s", "pippo-pluto"
+@end example
+
+@noindent
+stampa @samp{pippo-pluto}.
+
+Anteponendo un segno meno alla @var{larghezza} si richiede che l'output sia
+esteso con spazi a destra, invece che a sinistra.
+
+@item @code{.@var{precisione}}
+Un punto, seguito da una costante intera
+specifica la precisione da usare nella stampa.
+Il tipo di precisione varia a seconda della lettera di controllo:
+
+@table @asis
+@item @code{%d}, @code{%i}, @code{%o}, @code{%u}, @code{%x}, @code{%X}
+Minimo numero di cifre da stampare.
+
+@item @code{%e}, @code{%E}, @code{%f}, @code{%F}
+Numero di cifre alla destra del separatore decimale.
+
+@item @code{%g}, @code{%G}
+Massimo numero di cifre significative.
+
+@item @code{%s}
+Massimo numero di caratteri della stringa che possono essere stampati.
+@end table
+
+Quindi, l'istruzione:
+
+@example
+printf "%.4s", "foobar"
+@end example
+
+@noindent
+stampa @samp{foob}.
+@end table
+
+Le funzionalit@`a di @var{larghezza} e @var{precisione} dinamiche (cio@`e,
+@code{"%*.*s"}) disponibili nell'istruzione @code{printf} della libreria C sono
+utilizzabili.
+Invece che fornire esplicitamente una @var{larghezza} e/o una @var{precisione}
+nella stringa di formato, queste sono fornite come parte della lista degli
+argomenti.  Per esempio:
+
+@example
+w = 5
+p = 3
+s = "abcdefg"
+printf "%*.*s\n", w, p, s
+@end example
+
+@noindent
+equivale esattamente a:
+
+@example
+s = "abcdefg"
+printf "%5.3s\n", s
+@end example
+
+@noindent
+Entrambi i programmi stampano @samp{@w{@bullet{}@bullet{}abc}}.
+Versioni pi@`u datate di @command{awk} non consentivano questa possibilit@`a.
+Dovendo usare una di queste versioni, @`e possibile simulare questa
+funzionalit@`a usando la concatenazione per costruire una stringa di formato,
+come per esempio:
+
+@example
+w = 5
+p = 3
+s = "abcdefg"
+printf "%" w "." p "s\n", s
+@end example
+
+@noindent
+Questo codice non @`e di facile lettura, ma funziona.
+
+@c @cindex controlli @command @{lint}
+@cindex debug, errori fatali, @code{printf}, stringhe di formato
+@cindex POSIX @command{awk}, stringhe di formato @code{printf} e
+Chi programma in C probabilmente @`e abituato a specificare modificatori
+addizionali (@samp{h}, @samp{j}, @samp{l}, @samp{L}, @samp{t} e @samp{z}) nelle
+stringhe di formato di @code{printf}.  Questi modificatori non sono validi
+in @command{awk}.  La maggior parte della implementazioni di @command{awk} li
+ignora senza emettere messaggi.  Se si specifica l'opzione @option{--lint}
+sulla riga di comando (@pxref{Opzioni}), @command{gawk} emette un messaggio
+di avvertimento quando li si usa.  Se si specifica l'opzione @option{--posix},
+il loro uso genera un errore fatale.
+
+@node Esempi su printf
+@subsection Esempi d'uso di @code{printf}
+
+Il seguente semplice esempio mostra
+come usare @code{printf} per preparare una tabella allineata:
+
+@example
+awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list
+@end example
+
+@noindent
+Questo comando
+stampa i nomi delle persone (@code{$1}) nel file
+@file{mail-list} come una stringa di 10 caratteri allineati a sinistra.
+Stampa anche i numeri telefonici (@code{$2}) a fianco, sulla stessa riga.
+Il risultato @`e una tabella allineata, contenente due colonne, di nomi e numeri
+telefonici, come si pu@`o vedere qui:
+
+@example
+$ @kbd{awk '@{ printf "%-10s %s\n", $1, $2 @}' mail-list}
+@print{} Amelia     555-5553
+@print{} Anthony    555-3412
+@print{} Becky      555-7685
+@print{} Bill       555-1675
+@print{} Broderick  555-0542
+@print{} Camilla    555-2912
+@print{} Fabius     555-1234
+@print{} Julie      555-6699
+@print{} Martin     555-6480
+@print{} Samuel     555-3430
+@print{} Jean-Paul  555-2127
+@end example
+
+In questo caso, i numeri telefonici debbono essere stampati come stringhe,
+poich@'e includono un trattino.  Una stampa dei numeri telefonici come numeri
+semplici avrebbe visualizzato solo le prime tre cifre: @samp{555},
+e questo non sarebbe stato di grande utilit@`a.
+
+Non era necessario specificare una larghezza per i numeri telefonici poich@'e
+sono nell'ultima colonnna di ogni riga.  Non c'@`e bisogno di avere un
+allineamento di spazi dopo di loro.
+
+La tabella avrebbe potuto essere resa pi@`u leggibile aggiungendo
+intestazioni in cima
+alle colonne.  Questo si pu@`o fare usando una regola @code{BEGIN}
+(@pxref{BEGIN/END})
+in modo che le intestazioni siano stampate una sola volta, all'inizio del
+programma @command{awk}:
+
+@example
+awk 'BEGIN @{ print "Nome      Numero"
+             print "----      ------" @}
+           @{ printf "%-10s %s\n", $1, $2 @}' mail-list
+@end example
+
+L'esempio precedente usa sia l'istruzione @code{print} che l'istruzione
+@code{printf} nello stesso programma.  Si possono ottenere gli stessi
+risultati usando solo istruzioni @code{printf}:
+
+@example
+awk 'BEGIN @{ printf "%-10s %s\n", "Nome", "Numero"
+             printf "%-10s %s\n", "----", "------" @}
+           @{ printf "%-10s %s\n", $1, $2 @}' mail-list
+@end example
+
+@noindent
+Stampare ogni intestazione di colonna con la stessa specifica di formato
+usata per gli elementi delle colonne ci d@`a la certezza che le intestazioni
+sono allineate esattamente come le colonne.
+
+Il fatto che usiamo per tre volte la stessa specifica di formato si pu@`o
+evidenziare memorizzandola in una variabile, cos@`{@dotless{i}}:
+
+@example
+awk 'BEGIN @{ format = "%-10s %s\n"
+             printf format, "Nome", "Numero"
+             printf format, "----", "------" @}
+           @{ printf format, $1, $2 @}' mail-list
+@end example
+
+
+@node Ridirezione
+@section Ridirigere l'output di @code{print} e @code{printf}
+
+@cindex output, ridirezione
+@cindex ridirezione dell'output
+@cindex @option{--sandbox}, opzione, ridirezione dell'output con @code{print}, @code{printf}
+Finora, l'output di @code{print} e @code{printf} @`e stato diretto
+verso lo standard output,
+che di solito @`e lo schermo.  Sia @code{print} che @code{printf} possono
+anche inviare il loro output in altre direzioni.
+@`E quel che si chiama @dfn{ridirezione}.
+
+@quotation NOTA
+Quando si specifica @option{--sandbox} (@pxref{Opzioni}),
+la ridirezione dell'output verso file, @dfn{pipe} e coprocessi non @`e
+consentita.
+@end quotation
+
+Una ridirezione @`e posta dopo l'istruzione @code{print} o @code{printf}.
+Le ridirezioni in @command{awk} sono scritte come le ridirezioni nei
+comandi della shell, l'unica differenza @`e che si trovano all'interno di
+un programma @command{awk}.
+
+@c the commas here are part of the see also
+@cindex istruzione @code{print}, si veda anche ridirezione dell'output
+@cindex istruzione @code{printf}, si veda anche ridirezione dell'output
+Ci sono quattro forme di ridirezione dell'output:
+output scritto su un file,
+output aggiunto in fondo a un file,
+output che fa da input a un altro comando (usando una @dfn{pipe}) e
+output diretto a un coprocesso.
+Vengono descritti per l'istruzione @code{print},
+ma funzionano allo stesso modo per @code{printf}:
+
+@table @code
+@cindex @code{>} (parentesi acuta destra), operatore @code{>} (I/O)
+@cindex parentesi acuta destra (@code{>}), operatore @code{>} (I/O)
+@cindex operatori, input/output
+@item print @var{elementi} > @var{output-file}
+Questa ridirezione stampa gli elementi nel file di output chiamato
+@var{output-file}.  Il @value{FN} @var{output-file} pu@`o essere
+una qualsiasi espressione.  Il suo valore @`e trasformato in una stringa e
+quindi usato come
+@iftex
+@value{FN} (@pxrefil{Espressioni}).
+@end iftex
+@ifnottex
+@value{FN} (@pxref{Espressioni}).
+@end ifnottex
+Quando si usa questo tipo di ridirezione, il file @var{output-file} viene
+cancellato prima che su di esso sia stato scritto il primo record in uscita.
+Le successive scritture verso lo stesso file @var{output-file} non cancellano
+@var{output-file}, ma continuano ad aggiungervi record.
+(Questo comportamento @`e differente da quello delle ridirezioni usate negli
+script della shell.)
+Se @var{output-file} non esiste, viene creato.  Per esempio, ecco
+come un programma @command{awk} pu@`o scrivere una lista di nomi di persone
+su un file di nome @file{lista-nomi}, e una lista di numeri telefonici
+su un altro file di nome @file{lista-telefoni}:
+
+@example
+$ @kbd{awk '@{ print $2 > "lista-telefoni"}
+>        @kbd{print $1 > "lista-nomi" @}' mail-list}
+$ @kbd{cat lista-telefoni}
+@print{} 555-5553
+@print{} 555-3412
+@dots{}
+$ @kbd{cat lista-nomi}
+@print{} Amelia
+@print{} Anthony
+@dots{}
+@end example
+
+@noindent
+Ogni file in output contiene un nome o un numero su ogni riga.
+
+@cindex @code{>} (parentesi acuta destra), operatore @code{>>} (I/O)
+@cindex parentesi acuta destra (@code{>}), operatore @code{>>} (I/O)
+@item print @var{elementi} >> @var{output-file}
+Questa ridirezione stampa gli elementi in un file di output preesistente,
+di nome @var{output-file}.  La differenza tra questa ridirezione e quella
+con un solo @samp{>} @`e che il precedente contenuto (se esiste) di
+@var{output-file} non viene cancellato.  Invece, l'output di @command{awk} @`e
+aggiunto in fondo al file.
+Se @var{output-file} non esiste, viene creato.
+
+@cindex @code{|} (barra verticale), operatore @code{|} (I/O)
+@cindex @dfn{pipe}, output
+@cindex output, a @dfn{pipe}
+@item print @var{elementi} | @var{comando}
+@`E possibile inviare output a un altro programma usando una @dfn{pipe}
+invece di inviarlo a un file.   Questa ridirezione apre una @dfn{pipe} verso
+@var{comando}, e invia i valori di @var{elementi}, tramite questa
+@dfn{pipe}, a un altro processo creato per eseguire @var{comando}.
+
+L'argomento @var{comando}, verso cui @`e rivolta la ridirezione, @`e in realt@`a
+un'espressione
+@command{awk}.  Il suo valore @`e convertito in una stringa il cui contenuto
+costituisce un comando della shell che deve essere eseguito.  Per esempio,
+il seguente programma produce due file, una lista non ordinata di nomi di
+persone e una lista ordinata in ordine alfabetico inverso:
+
+@ignore
+10/2000:
+This isn't the best style, since COMMAND is assigned for each
+record.  It's done to avoid overfull hboxes in TeX.  Leave it
+alone for now and let's hope no-one notices.
+@end ignore
+
+@example
+@group
+awk '@{ print $1 > "nomi.non.ordinati"
+       comando = "sort -r > nomi.ordinati"
+       print $1 | comando @}' mail-list
+@end group
+@end example
+
+La lista non ordinata @`e scritta usando una ridirezione normale, mentre
+la lista ordinata @`e scritta inviando una @dfn{pipe} in input al programma
+di utilit@`a @command{sort}.
+
+Il prossimo esempio usa la ridirezione per inviare un messaggio alla
+mailing list @code{bug-sistema}.  Questo pu@`o tornare utile se si hanno
+problemi con uno @dfn{script} @command{awk} eseguito periodicamente per la
+manutenzione del sistema:
+
+@example
+report = "mail bug-sistema"
+print("Script awk in errore:", $0) | report
+print("al record numero", FNR, "di", NOME_FILE) | report
+close(report)
+@end example
+
+La funzione @code{close()} @`e stata chiamata perch@'e @`e una buona idea chiudere
+la @dfn{pipe} non appena tutto l'output da inviare alla @dfn{pipe} @`e stato
+inviato.  @xref{Chiusura file e @dfn{pipe}}
+per maggiori informazioni.
+
+Questo esempio illustra anche l'uso di una variabile per rappresentare
+un @var{file} o un @var{comando}; non @`e necessario usare sempre
+una costante stringa.  Usare una variabile @`e di solito una buona idea,
+perch@'e (se si vuole riusare lo stesso file o comando)
+@command{awk} richiede che il valore della stringa sia sempre scritto
+esattamente nello stesso modo.
+
+@cindex coprocessi
+@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
+@cindex operatori, input/output
+@cindex differenze tra @command{awk} e @command{gawk}, operatori di input/output
+@item print @var{elementi} |& @var{comando}
+Questa ridirezione stampa gli elementi nell'input di @var{comando}.
+La differenza tra questa ridirezione  e quella
+con la sola @samp{|} @`e che l'output da @var{comando}
+pu@`o essere letto tramite @code{getline}.
+Quindi, @var{comando} @`e un @dfn{coprocesso}, che lavora in parallelo al
+programma @command{awk}, ma @`e al suo servizio.
+
+Questa funzionalit@`a @`e un'estensione @command{gawk}, e non @`e disponibile in
+POSIX @command{awk}.
+@ifnotdocbook
+@xref{Getline coprocesso},
+per una breve spiegazione.
+@ref{I/O bidirezionale}
+per un'esposizione pi@`u esauriente.
+@end ifnotdocbook
+@ifdocbook
+@xref{Getline coprocesso}
+per una breve spiegazione.
+@xref{I/O bidirezionale}
+per un'esposizione pi@`u esauriente.
+@end ifdocbook
+@end table
+
+Ridirigere l'output usando @samp{>}, @samp{>>}, @samp{|} o @samp{|&}
+richiede al sistema di aprire un file, una @dfn{pipe} o un coprocesso solo se
+il particolare @var{file} o @var{comando} che si @`e specificato non @`e gi@`a
+stato utilizzato in scrittura dal programma o se @`e stato chiuso
+dopo l'ultima scrittura.
+
+@cindex debug, stampare
+@`E un errore comune usare la ridirezione @samp{>} per la prima istruzione
+@code{print} verso un file, e in seguito usare @samp{>>} per le successive
+scritture in output:
+
+@example
+# inizializza il file
+print "Non v'allarmate" > "guida.txt"
+@dots{}
+# aggiungi in fondo al file
+print "Evitate generatori di improbabilit@`a" >> "guide.txt"
+@end example
+
+@noindent
+Questo @`e il modo in cui le ridirezioni devono essere usate lavorando
+con la shell.  Ma in @command{awk} ci@`o non @`e necessario.  In casi di questo
+genere, un programma dovrebbe
+usare @samp{>} per tutte le istruzioni @code{print}, perch@'e il file di
+output @`e aperto una sola volta.
+(Usando sia @samp{>} che @samp{>>} nello stesso programma, l'output @`e prodotto
+nell'ordine atteso.
+Tuttavia il mischiare gli operatori per lo stesso file @`e sintomo di uno
+stile di programmazione inelegante, e pu@`o causare confusione in chi legge
+il programma.)
+
+@cindex differenze tra @command{awk} e @command{gawk}, limitazioni di implementazione
+@cindex problemi di implementazione, @command{gawk}, limitazioni
+@cindex @command{awk}, problemi di implementazione, @dfn{pipe}
+@cindex @command{gawk}, problemi di implementazione, @dfn{pipe}
+@ifnotinfo
+Come visto in precedenza
+(@pxref{Note su getline}),
+molte
+@end ifnotinfo
+@ifnottex
+@ifnotdocbook
+@ifnothtml
+Molte
+@end ifnothtml
+@end ifnotdocbook
+@end ifnottex
+tra le pi@`u vecchie implementazioni di
+@command{awk} limitano il numero di @dfn{pipeline} che un programma
+@command{awk} pu@`o mantenere aperte a una soltanto!  In @command{gawk}, non c'@`e
+un tale limite.  @command{gawk} consente a un programma di
+aprire tante @dfn{pipeline} quante ne consente il sistema operativo su cui
+viene eseguito.
+
+@sidebar Inviare @dfn{pipe} alla @command{sh}
+@cindex shell, inviare comandi tramite @dfn{pipe} alla
+
+Una maniera particolarmente efficace di usare la ridirezione @`e quella di
+preparare righe di comando da passare
+come @dfn{pipe} alla shell,
+@command{sh}.  Per esempio, si supponga di avere una lista di file provenienti
+da un sistema in cui tutti i
+@value{FNS} sono memorizzari in maiuscolo, e  di volerli rinominare
+in modo da avere nomi tutti in
+minuscolo.  Il seguente programma @`e
+sia semplice che efficiente:
+
+@c @cindex @command{mv} utility
+@example
+@{ printf("mv %s %s\n", $0, tolower($0)) | "sh" @}
+
+END @{ close("sh") @}
+@end example
+
+La funzione @code{tolower()} restituisce la stringa che gli viene passata
+come argomento con tutti i caratteri maiuscoli convertiti in minuscolo
+(@pxref{Funzioni per stringhe}).
+Il programma costruisce una lista di righe di comando,
+usando il programma di utilit@`a @command{mv} per rinominare i file.
+Poi invia la lista alla shell per l'elaborazione.
+
+@xref{Apici alla shell} per una funzione che pu@`o essere utile nel generare
+righe di comando da passare alla shell.
+@end sidebar
+
+@node FD speciali
+@section File speciali per flussi standard di dati pre-aperti
+@cindex standard input
+@cindex input, standard
+@cindex standard output
+@cindex output, standard
+@cindex errore, output
+@cindex standard error
+@cindex descrittori di file
+@cindex file, descrittori, si veda descrittori di file
+
+I programmi in esecuzione hanno convenzionalmente tre flussi di input e
+output a disposizione, gi@`a aperti per la lettura e la scrittura.
+Questi sono noti come
+lo @dfn{standard input}, lo @dfn{standard output} e lo @dfn{standard
+error output}.  A questi flussi aperti (e a tutti gli altri file aperti o
+@dfn{pipe}) si fa spesso riferimento usando il termine tecnico
+@dfn{descrittori di file} [FD].
+
+Questi flussi sono, per default, associati alla tastiera e allo schermo,
+ma spesso sono ridiretti, nella shell, utilizzando gli operatori
+@samp{<}, @samp{<<}, @samp{>}, @samp{>>}, @samp{>&} e @samp{|}.
+Lo standard error @`e tipicamente usato per scrivere messaggi di errore;
+la ragione per cui ci sono due flussi distinti,
+standard output e standard error, @`e per poterli ridirigere indipendentemente
+l'uno dall'altro.
+
+@cindex differenze tra @command{awk} e @command{gawk}, messaggi di errore
+@cindex gestione errori
+@cindex errori, gestione degli
+Nelle tradizionali implementazioni di @command{awk}, il solo modo per
+scrivere un messaggio di errore allo
+standard error in un programma @command{awk} @`e il seguente:
+
+@example
+print "Ho trovato un errore grave!" | "cat 1>&2"
+@end example
+
+@noindent
+Con quest'istruzione si apre una @dfn{pipeline} verso un comando della shell
+che @`e in grado di accedere al flusso di standard error che eredita dal
+processo @command{awk}.
+@c 8/2014: Mike Brennan says not to cite this as inefficient. So, fixed.
+Questo @`e molto poco elegante, e richiede anche di innescare un processo
+separato.  Per questo chi scrive programmi @command{awk} spesso
+non usa questo metodo.  Invece, invia i messaggi di errore allo
+schermo, in questo modo:
+
+@example
+print "Ho trovato un errore grave!" > "/dev/tty"
+@end example
+
+@noindent
+(@file{/dev/tty} @`e un file speciale fornito dal sistema operativo
+ed @`e connesso alla tastiera e allo schermo.  Rappresenta il
+``terminale'',@footnote{``tty'' in @file{/dev/tty} @`e un'abbreviazione di
+``TeleTYpe'' [telescrivente], un terminale seriale.} che nei sistemi odierni
+@`e una tastiera e uno schermo, e non una @dfn{console} seriale).
+Questo ha generalmente lo stesso effetto, ma non @`e sempre detto: sebbene il
+flusso di standard error sia solitamente diretto allo schermo, potrebbe
+essere stato
+ridiretto; se questo @`e il caso, scrivere verso lo schermo non serve.  In
+effetti, se @command{awk} @`e chiamato da un lavoro che non @`e eseguito
+interattivamente,
+pu@`o non avere a disposizione alcun terminale su cui scrivere.
+In quel caso, l'apertura di @file{/dev/tty} genera un errore.
+
+@command{gawk}, BWK @command{awk}, e @command{mawk} mettono a disposizione
+speciali @value{FNS} per accedere ai tre flussi standard.
+Se il @value{FN} coincide con uno di questi nomi speciali, quando
+@command{gawk} (o uno degli altri) ridirige l'input o l'output, usa
+direttamente il descrittore di file identificato dal @value{FN}.  Questi
+@value{FNS} sono gestiti cos@`{@dotless{i}} in tutti i sistemi operativi nei quali
+@command{gawk} @`e disponibile, e non solo in quelli che aderiscono allo
+standard POSIX:
+
+@cindex estensioni comuni, file speciale @code{/dev/stdin}
+@cindex estensioni comuni, file speciale @code{/dev/stdout}
+@cindex estensioni comuni, file speciale @code{/dev/stderr}
+@c @cindex comuni, estensioni@comma{} file speciale @code{/dev/stdin}
+@c @cindex comuni, estensioni@comma{} file speciale @code{/dev/stdout}
+@c @cindex comuni, estensioni@comma{} file speciale @code{/dev/stderr}
+@cindex nomi di file, flussi standard in @command{gawk}
+@cindex @code{/dev/@dots{}}, file speciali
+@cindex file, file speciali @code{/dev/@dots{}}
+@cindex @code{/dev/fd/@var{N}}, file speciali (in @command{gawk})
+@table @file
+@item /dev/stdin
+Lo standard input (descrittore di file 0).
+
+@item /dev/stdout
+Lo standard output (descrittore di file 1).
+
+@item /dev/stderr
+Lo standard error output (descrittore di file 2).
+@end table
+
+Usando questa funzionalit@`a
+la maniera corretta di scrivere un messaggio di errore diviene quindi:
+
+@example
+print "Ho trovato un errore grave!" > "/dev/stderr"
+@end example
+
+@cindex debug, doppio apice con nomi di file
+Si noti l'uso di doppi apici per racchiudere il @value{FN}.
+Come per ogni altra ridirezione, il valore dev'essere una stringa.
+@`E un errore comune omettere i doppi apici, il che conduce a
+risultati inattesi.
+
+@command{gawk} non tratta questi @value{FNS} come speciali quando opera
+in modalit@`a di compatibilit@`a POSIX.  Comunque, poich@'e BWK @command{awk}
+li prevede, @command{gawk} li ammette anche quando viene
+invocato con l'opzione @option{--traditional} (@pxref{Opzioni}).
+
+@node File speciali
+@section @value{FFNS} speciali in @command{gawk}
+@cindex @command{gawk}, nomi di file in
+
+Oltre all'accesso a standard input, standard output e standard error,
+@command{gawk} consente di accedere a ogni descrittore di file aperto.
+In pi@`u, ci sono dei @value{FNS} speciali riservati per accedere a
+reti TCP/IP.
+
+@menu
+* Altri file ereditati::        Accedere ad altri file aperti con
+                                @command{gawk}.
+* Reti speciali::               File speciali per comunicazioni con la rete.
+* Avvertimenti speciali::       Cose a cui prestare attenzione.
+@end menu
+
+@node Altri file ereditati
+@subsection Accedere ad altri file aperti con @command{gawk}
+
+Oltre ai valori speciali di @value{FNS}
+@code{/dev/stdin}, @code{/dev/stdout} e @code{/dev/stderr}
+gi@`a menzionati, @command{gawk} prevede una sintassi
+per accedere a ogni altro file aperto ereditato:
+
+@table @file
+@item /dev/fd/@var{N}
+Il file associato al descrittore di file @var{N}.  Il file indicato deve
+essere aperto dal programma che inizia l'esecuzione di @command{awk}
+(tipicamente la shell).  Se non sono state poste in essere iniziative
+speciali nella shell da cui @command{gawk} @`e stato invocato, solo i
+descrittori 0, 1, e 2 sono disponibili.
+@end table
+
+I @value{FNS} @file{/dev/stdin}, @file{/dev/stdout} e @file{/dev/stderr}
+sono essenzialmente alias per @file{/dev/fd/0}, @file{/dev/fd/1} e
+@file{/dev/fd/2}, rispettivamente. Comunque, i primi nomi sono pi@`u
+autoesplicativi.
+
+Si noti che l'uso di @code{close()} su un @value{FN} della forma
+@code{"/dev/fd/@var{N}"}, per numeri di descrittore di file
+oltre il due, effettivamente chiude il descrittore di file specificato.
+
+@node Reti speciali
+@subsection File speciali per comunicazioni con la rete
+@cindex reti, funzionalit@`a per
+@cindex TCP/IP, funzionalit@`a per
+
+I programmi @command{gawk}
+possono aprire una connessione bidirezionale
+TCP/IP, fungendo o da @dfn{client} o da @dfn{server}.
+Questo avviene usando uno speciale @value{FN} della forma:
+
+@example
+@file{/@var{tipo-rete}/@var{protocollo}/@var{porta-locale}/@var{host-remoto}/@var{porta-remota}}
+@end example
+
+Il @var{tipo-rete} pu@`o essere @samp{inet}, @samp{inet4} o @samp{inet6}.
+Il @var{protocollo} pu@`o essere @samp{tcp} o @samp{udp},
+e gli altri campi rappresentano gli altri dati essenziali
+necessari per realizzare una connessione di rete.
+Questi @value{FNS} sono usati con l'operatore @samp{|&} per comunicare
+con @w{un coprocesso}
+(@pxref{I/O bidirezionale}).
+Questa @`e una funzionalit@`a avanzata, qui riferita solo per completezza.
+Una spiegazione esauriente sar@`a fornita nella
+@ref{Reti TCP/IP}.
+
+@node Avvertimenti speciali
+@subsection Avvertimenti speciali sui @value{FNS}
+
+Sono qui elencate alcune cose da tener presente usando i
+@value{FNS} speciali forniti da @command{gawk}:
+
+@itemize @value{BULLET}
+@cindex modalit@`a compatibile di (@command{gawk}), nomi di file
+@cindex nomi di file, nella modalit@`a compatibile di @command{gawk}
+@item
+Il riconoscimento dei @value{FNS} per i tre file standard pre-aperti
+@`e disabilitato solo in modalit@`a POSIX.
+
+@item
+Il riconoscimento degli altri @value{FNS} speciali @`e disabilitato se
+@command{gawk} @`e in modalit@`a compatibile
+(o @option{--traditional} o @option{--posix};
+@pxref{Opzioni}).
+
+@item
+@command{gawk} interpreta @emph{sempre}
+questi @value{FNS} speciali.
+Per esempio, se si usa @samp{/dev/fd/4}
+per l'output, si scrive realmente sul descrittore di file 4, e non su un nuovo
+descrittore di file generato duplicando (con @code{dup()}) il descrittore
+file 4.  Solitamente questo non ha importanza; comunque, @`e importante
+@emph{non} chiudere alcun file correlato ai descrittori di file 0, 1 e 2.
+Se lo si fa, il comportamente risultante @`e imprevedibile.
+@end itemize
+
+@node Chiusura file e @dfn{pipe}
+@section Chiudere ridirezioni in input e in output
+@cindex output, file in, si veda file in output
+@cindex input, file in, chiusura
+@cindex output, file in, chiusura
+@cindex @dfn{pipe}, chiusura
+@cindex coprocessi, chiusura
+@cindex @code{getline}, comando, coprocessi@comma{} usare dal
+
+Se lo stesso @value{FN} o lo stesso comando di shell @`e usato con @code{getline}
+pi@`u di una volta durante l'esecuzione di un programma @command{awk}
+(@pxref{Getline}),
+il file viene aperto (o il comando viene eseguito) solo la prima volta.
+A quel punto, il primo record in input @`e letto da quel file o comando.
+La prossima volta che lo stesso file o comando @`e usato con @code{getline},
+un altro record @`e letto da esso, e cos@`{@dotless{i}} via.
+
+Analogamente, quando un file o una @dfn{pipe} sono aperti in output,
+@command{awk} ricorda
+il @value{FN} o comando a essi associato, e le successive
+scritture verso lo stesso file o comando sono accodate alle precedenti
+scritture.
+Il file o la @dfn{pipe} rimangono aperti fino al termine dell'esecuzione
+di @command{awk}.
+
+@cindexawkfunc{close}
+Questo implica che sono necessari dei passi speciali per rileggere nuovamente
+lo stesso file dall'inizio, o per eseguire di nuovo un comando di shell
+(invece che leggere ulteriore output dal precedente comando).  La funzione
+@code{close()} rende possibile fare queste cose:
+
+@example
+close(@var{NOME_FILE})
+@end example
+
+@noindent
+o:
+
+@example
+close(@var{comando})
+@end example
+
+l'argomento @var{NOME_FILE} o @var{comando} pu@`o essere qualsiasi espressione,
+il cui valore dev'essere @emph{esattamente} uguale alla stringa
+usata per aprire il file o eseguire il comando (spazi e altri caratteri
+``irrilevanti'' inclusi).  Per esempio, se si apre una @dfn{pipe} cos@`{@dotless{i}}:
+
+@example
+"sort -r nomi" | getline pippo
+@end example
+
+@noindent
+essa va chiusa in questo modo:
+
+@example
+close("sort -r nomi")
+@end example
+
+Una volta eseguita questa chiamata di funzione, la successiva @code{getline}
+da quel file o comando, o la successiva @code{print} o @code{printf} verso quel
+file o comando, riaprono il file o eseguono nuovamente il comando.
+Poich@'e l'espressione da usare per chiudere un file o una @dfn{pipeline} deve
+essere uguale all'espressione usata per aprire il file o eseguire il comando,
+@`e buona norma usare una variabile che contenga il @value{FN} o il comando.
+Il precedente esempio cambia come segue:
+
+@example
+@group
+sortcom = "sort -r nomi"
+sortcom | getline pippo
+@end group
+@group
+@dots{}
+close(sortcom)
+@end group
+@end example
+
+@noindent
+Questo aiuta a evitare nei programmi @command{awk} errori di battitura
+difficili da scoprire.  Queste sono alcune delle ragioni per cui @`e bene
+chiudere un file di output:
+
+@itemize @value{BULLET}
+@item
+Scrivere un file e rileggerlo in seguito all'interno dello stesso programma
+@command{awk}.  Occorre chiudere il file dopo aver finito di scriverlo, e poi
+iniziare a rileggerlo con @code{getline}.
+
+@item
+Per scrivere numerosi file, uno dopo l'altro, nello stesso programma
+@command{awk}.  Se i file non vengono chiusi, prima o poi @command{awk} pu@`o
+superare il limite di sistema per il numero di file aperti in un processo.
+@`E meglio chiudere ogni file quando il programma ha finito di scriverlo.
+
+@item
+Per terminare un comando.  Quando l'output @`e ridiretto usando una @dfn{pipe},
+il comando che legge la @dfn{pipe} normalmente continua a tentare di leggere
+input finch@'e la @dfn{pipe} rimane aperta.  Spesso questo vuol dire che
+il comando non pu@`o eseguire il compito a lui assegnato finch@'e la @dfn{pipe}
+non viene chiusa.  Per esempio, se l'output @`e ridiretto al programma
+@command{mail}, il messaggio non @`e effettivamente inviato finch@'e la @dfn{pipe}
+non viene chiusa.
+
+@item
+Eseguire lo stesso programma una seconda volta, con gli stessi argomenti.
+Questo non equivale a fornire ulteriore input alla prima esecuzione!
+
+Per esempio, si supponga che una programma invii tramite una @dfn{pipe}
+dell'output al programma @command{mail}.
+Se invia parecchie linee ridirigendole a questa @dfn{pipe} senza chiuderla,
+queste costituiscono un solo messaggio di parecchie righe.  Invece, se il
+programma chiude la @dfn{pipe} dopo ogni riga dell'output, allora ogni riga
+costituisce un messaggio separato.
+@end itemize
+
+@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{close()}
+@cindex portabilit@`a, funzione @code{close()}
+@cindex funzione @code{close()}, portabilit@`a
+@cindex @code{close()}, funzione, portabilit@`a
+Se si usano file in numero superiore a quelli che il sistema permette
+di mantenere aperti,
+@command{gawk} tenta di riutilizzare i file aperti disponibili fra
+i @value{DF}.  La possibilit@`a che @command{gawk} lo faccia dipende dalle
+funzionalit@`a del sistema operativo, e quindi non @`e detto che questo riesca
+sempre.  @`E quindi sia una buona pratica
+che un buon suggerimento per la portabilit@`a quello di usare sempre
+@code{close()} sui file, una volta che si @`e finito di operare su di essi.
+In effetti, se si usano molte @dfn{pipe}, @`e fondamentale che i comandi
+vengano chiusi, una volta finita la loro elaborazione.  Per esempio, si
+consideri qualcosa del tipo:
+
+@example
+@{
+    @dots{}
+    comando = ("grep " $1 " /qualche/file | un_mio_programma -q " $3)
+    while ((comando | getline) > 0) @{
+        @var{elabora output di} comando
+    @}
+    # qui serve close(comando)
+@}
+@end example
+
+Questo esempio crea una nuova @dfn{pipeline} a seconda dei dati contenuti in
+@emph{ogni} record.
+Senza la chiamata a @code{close()} indicata come commento, @command{awk}
+genera processi-figlio per eseguire i comandi, fino a che non finisce per
+esaurire i descrittori di file
+necessari per creare ulteriori @dfn{pipeline}.
+
+Sebbene ogni comando sia stato completato (come si deduce dal codice di
+fine-file restituito dalla @code{getline}), il processo-figlio non @`e
+terminato;@footnote{La terminologia tecnica @`e piuttosto macabra.
+Il processo-figlio terminato @`e chiamato ``zombie,'' e la pulizia alla fine
+dello stesso @`e chiamata ``reaping'' [mietitura].}
+@c Good old UNIX: give the marketing guys fits, that's the ticket
+inoltre, e questo @`e ci@`o che pi@`u ci interessa, il descrittore di file
+per la @dfn{pipe} non @`e chiuso e liberato finch@'e non si chiama
+@code{close()} o finch@'e il programma @command{awk} non termina.
+
+@code{close()} non fa nulla (e non emette messaggi) se le viene fornito come
+argomento una stringa che non rappresenta un file, una @dfn{pipe} o un
+coprocesso che sia stato aperto mediante una ridirezione.  In quel caso,
+@code{close()} restituisce un codice di ritorno negativo, che indica un
+errore. Inoltre, @command{gawk} imposta @code{ERRNO}
+a una stringa che indica il tipo di errore.
+
+Si noti anche che @samp{close(NOME_FILE)} non ha effetti ``magici'' sul ciclo
+implicito che legge ogni record dei file indicati nella riga di comando.
+Si tratta, con ogni probabilit@`a, della chiusura di un file che non era mai
+stato aperto con una ridirezione,
+e per questo @command{awk} silenziosamente non fa nulla, tranne impostare un
+codice di ritorno negativo.
+
+@cindex @code{|} (barra verticale), operatore @code{|&} (I/O), @dfn{pipe}@comma{} chiusura
+Quando si usa l'operatore @samp{|&} per comunicare con un coprocesso,
+@`e talora utile essere in grado di chiudere un lato della @dfn{pipe}
+bidirezionale, senza chiudere l'altro lato.
+Questo @`e possibile fornendo un secondo argomento a @code{close()}.
+Come in ogni altra invocazione di @code{close()},
+il primo argomento @`e il nome del comando o file speciale usato
+per iniziare il coprocesso.
+Il secondo argomento dovrebbe essere una stringa, con uno dei due valori
+@code{"to"} [a] oppure @code{"from"} [da].  Maiuscolo/minuscolo non fa
+differenza.  Poich@'e questa @`e una funzionalit@`a avanzata, la trattazione @`e
+rinviata alla
+@ref{I/O bidirezionale},
+che ne parla pi@`u dettagliatamente e fornisce un esempio.
+
+@sidebar Usare il codice di ritorno di @code{close()}
+@cindex angolo buio, funzione @code{close()}
+@cindex funzione @code{close()}, codice di ritorno
+@cindex @code{close()}, funzione, codice di ritorno
+@cindex codice di ritorno@comma{} funzione @code{close()}
+@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{close()}
+@cindex Unix @command{awk}, funzione @code{close()} e
+
+In molte versioni di Unix @command{awk}, la funzione @code{close()}
+@`e in realt@`a un'istruzione.
+@value{DARKCORNER}
+@`E un errore di sintassi tentare di usare il
+codice di ritorno da @code{close()}:
+
+@example
+comando = "@dots{}"
+comando | getline info
+retval = close(comando)  # errore di sintassi in parecchi Unix awk
+@end example
+
+@cindex @command{gawk}, variabile @code{ERRNO} in
+@cindex variabile @code{ERRNO}, con funzione @command{close()}
+@cindex @code{ERRNO}, variabile, con funzione @command{close()}
+@command{gawk} gestisce @code{close()} come una funzione.
+Il codice di ritorno @`e @minus{}1 se l'argomento designa un file
+che non era mai stato aperto con una ridirezione, o se c'@`e un problema di
+sistema nella chiusura del file o del processo.
+In tal caso, @command{gawk} imposta la variabile predefinita
+@code{ERRNO} a una stringa che descrive il problema.
+
+In @command{gawk}, a partire dalla @value{PVERSION} 4.2,
+quando si chiude una @dfn{pipe} o un coprocesso (in input o in output),
+il codice di ritorno @`e quello restituito dal comando,
+come descritto in @ref{table-close-pipe-return-values}.@footnote{Prima
+della @value{PVERSION} 4.2, il codice di ritorno dopo la chiusura di
+una @dfn{pipe} o di un coprocesso era una cifra di due byte (16-bit),
+contenente il valore restituito dalla chiamata di sistema @code{wait()}}.
+Altrimenti, @`e il codice di ritorno dalla chiamata alle funzione
+di sistema @code{close()} o alla funzione C @code{fclose()}
+se si sta chiudendo un file in input o in output, rispettivamente.
+Questo valore @`e zero se la chiusura riesce, o @minus{}1 se non riesce.
+
+@float Tabella,table-close-pipe-return-values
+@caption{Codici di ritorno dalla @code{close()} di una @dfn{pipe}}
+@multitable @columnfractions .50 .50
+@headitem Situazione @tab Valore restituito da @code{close()}
+@item Uscita normale dal comando @tab Il codice di ritorno del comando
+@item Uscita dal comando per @dfn{signal} @tab 256 + numero del segnale assassino
+@item Uscita dal comando per @dfn{signal} con @dfn{dump} @tab 512 + numero del segnale assassino
+@item Errore di qualsiasi tipo @tab @minus{}1
+@end multitable
+@end float
+
+Lo standard POSIX @`e molto generico; dice che @code{close()}
+restituisce zero se @`e terminata correttamente, e un valore diverso da zero
+nell'altro caso.  In generale,
+implementazioni differenti variano in quel che restituiscono chiudendo una
+@dfn{pipe}; quindi, il codice di ritorno non pu@`o essere usato in modo
+portabile.
+@value{DARKCORNER}
+In modalit@`a POSIX (@pxref{Opzioni}), @command{gawk} restituisce solo zero
+quando chiude una @dfn{pipe}.
+@end sidebar
+
+@node Continuazione dopo errori
+@section Abilitare continuazione dopo errori in output
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+
+In @command{awk} standard, l'output con @code{print} o @code{printf}
+a un file che non esiste, o qualche altro errore di I/O (come p.es.
+esaurire lo spazio disponibile su disco) @`e un errore fatale (termina
+l'esecuzione del programma).
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "ciao" > "/file/non/esistente" @}'}
+@error{} gawk: riga com.:1: fatale: non riesco a ri-dirigere a
+@error{}     `/file/non/esistente' (/file o directory non esistente)
+@end example
+
+@command{gawk} rende possibile accorgersi che c'@`e stato un errore,
+permettendo di tentare di rimediare, o almeno di stampare un messaggio
+di errore prima di terminare il programma.
+@`E possibile fare questo in due modi differenti:
+
+@itemize @bullet
+@item
+Per tutti i file in output, assegnando un valore qualsiasi a
+@code{PROCINFO["NONFATAL"]}.
+
+@item
+Specificamente per un solo file, assegnando un valore qualsiasi a
+@code{PROCINFO[@var{nome_file}, "NONFATAL"]}.
+@var{nome_file} @`e il nome del file per il quale
+si desidera che l'errore di output non faccia terminare il programma.
+@end itemize
+
+Una volta abilitata la continuazione dopo un errore di output, si dovr@`a
+controllare la variabile @code{ERRNO} dopo ogni istruzione
+@code{print} o @code{printf} diretta a quel file, per controllare che
+tutto sia andato a buon fine.  @`E anche una buona idea inizializzare
+@code{ERRNO} a zero prima di tentare l'operazione di scrittura.
+Per esempio:
+
+@example
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+> @kbd{    PROCINFO["NONFATAL"] = 1}
+> @kbd{    ERRNO = 0}
+> @kbd{    print "ciao" > "/file/non/esistente"}
+> @kbd{    if (ERRNO) @{}
+> @kbd{        print("Output non riuscito:", ERRNO) > "/dev/stderr"}
+> @kbd{        exit 1}
+> @kbd{    @}}
+> @kbd{@}'}
+@error{} Output non riuscito: No such file or directory
+@end example
+
+@command{gawk} non genera un errore fatale; permette invece
+al programma @command{awk} di rendersi conto del problema e di gestirlo.
+
+Questo meccanismo si applica anche allo standard output e allo standard error.
+Per lo standard output, si pu@`o usare @code{PROCINFO["-", "NONFATAL"]}
+o @code{PROCINFO["/dev/stdout", "NONFATAL"]}.
+Per lo standard error, occorre
+usare @code{PROCINFO["/dev/stderr", "NONFATAL"]}.
+
+Se si tenta di aprire un @dfn{socket} TCP/IP (@pxref{Reti TCP/IP}),
+@command{gawk} tenta di farlo per un certo numero di volte.
+La variabile d'ambiente @env{GAWK_SOCK_RETRIES}
+(@pxref{Altre variabili d'ambiente}) consente di alterare il numero di
+tentativi che @command{gawk} farebbe per default.  Tuttavia,
+una volta abilitata la continuazione dopo un errore di I/O per un certo
+@dfn{socket}, @command{gawk} si limita a un solo tentativo,
+lasciando al codice del programma @command{awk} il compito di gestire
+l'eventuale problema.
+
+@node Sommario di Output
+@section Sommario.
+
+@itemize @value{BULLET}
+@item
+L'istruzione @code{print} stampa una lista di espressioni separate da virgole.
+Le espressioni sono separate tra loro dal valore di @code{OFS} e completate
+dal valore di @code{ORS}.  @code{OFMT} fornisce il formato di conversione
+dei valori numerici per l'istruzione @code{print}.
+
+@item
+L'istruzione @code{printf} fornisce un controllo pi@`u preciso sull'output,
+con lettere di controllo del formato per diversi tipi di dati e vari
+modificatori
+che cambiano il comportamento delle lettere di controllo del formato.
+
+@item
+L'output sia di @code{print} che di @code{printf} pu@`o essere ridiretto a
+file, @dfn{pipe}, e coprocessi.
+
+@item
+@command{gawk} fornisce @value{FNS} speciali per accedere allo
+standard input, standard output e standard error, e per comunicazioni di rete.
+
+@item
+Usare @code{close()} per chiudere file aperti, @dfn{pipe} e ridirezioni a
+coprocessi.
+Per i coprocessi, @`e possibile chiudere anche soltanto una delle due
+direzioni di comunicazione.
+
+@item
+Normalmente se si verificano errori eseguendo istruzioni @code{print} o
+@code{printf}, questi causano la fine del programma.
+@command{gawk} consente di proseguire l'elaborazione anche in questo
+caso, o per un errore su qualsiasi file in output, o per un errore
+relativo a qualche file in particolare.
+Resta a carico del programma controllare se si sono verificati errori
+dopo l'esecuzione di ogni istruzione di output interessata.
+
+@end itemize
+
+@c EXCLUDE START
+@node Esercizi su Output
+@section Esercizi
+
+@enumerate
+@item
+Riscrivere il programma:
+
+@example
+awk 'BEGIN @{  print "Mese  Contenitori"
+              print "----- -----------" @}
+           @{  print $1, $2 @}' inventory-shipped
+@end example
+
+@noindent
+come
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Separatori di output}, usando un nuovo valore per @code{OFS}.
+
+@item
+Usare l'istruzione @code{printf} per allineare le intestazioni e i dati
+della tabella
+per il file di esempio @file{inventory-shipped} utilizzato nella @ref{Print}.
+
+@item
+Spiegare cosa succede se si dimenticano i doppi apici ridirigendo l'output,
+come nel caso che segue:
+
+@example
+BEGIN @{ print "Ho trovato un errore grave!" > /dev/stderr @}
+@end example
+
+@end enumerate
+@c EXCLUDE END
+
+
+@node Espressioni
+@chapter Espressioni
+@cindex espressioni
+
+Le espressioni sono i mattoni fondamentali dei modelli di ricerca e delle
+azioni di @command{awk}.  Un'espressione genera un valore che si
+pu@`o stampare, verificare o passare a una funzione.  Oltre a ci@`o, un'espressione
+pu@`o assegnare un nuovo valore a una variabile o a un campo usando un operatore
+di assegnamento.
+
+Un'espressione pu@`o servire come modello di ricerca o istruzione di azione a
+s@'e stante.  La maggior parte degli altri tipi di istruzione contengono una o
+pi@`u espressioni che specificano i dati sui quali operare.  Come in altri
+linguaggi, le espressioni in @command{awk} possono includere variabili,
+riferimenti a vettori e a costanti, e chiamate di funzione, come pure
+combinazioni tra questi usando diversi operatori.
+
+@menu
+* Valori::                        Costanti, variabili ed espressioni regolari.
+* Tutti gli operatori::           Gli operatori di @command{gawk}.
+* Valori e condizioni di verit@`a:: Determinare Vero/Falso.
+* Chiamate di funzione::       Una chiamata di funzione pu@`o essere
+                                  un'espressione.
+* Precedenza::                    Come si nidificano i vari operatori.
+* Localizzazioni::                Come la localizzazione influenza la
+                                  gestione dati.
+* Sommario delle espressioni::    Sommario delle espressioni.
+@end menu
+
+@node Valori
+@section Costanti, variabili e conversioni
+
+Le espressioni sono costruite a partire da valori e dalle operazioni eseguite
+su di essi. Questa @value{SECTION} descrive gli oggetti elementari
+che forniscono i valori usati nelle espressioni.
+
+@menu
+* Costanti::                       Costanti di tipo stringa, numeriche ed
+                                   espressioni regolari
+* Usare le costanti @dfn{regexp}:: Quando e come usare una costante
+                                   specificata tramite espressioni regolari
+* Variabili::                      Le variabili permettono di
+                                   definire valori da usare in seguito.
+* Conversione::                    La conversione di stringhe in numeri
+                                   e viceversa.
+@end menu
+
+@node Costanti
+@subsection Espressioni costanti
+
+@cindex costanti, tipi di
+
+Il tipo di espressione pi@`u semplice @`e una @dfn{costante}, che ha sempre lo
+stesso valore.  Ci sono tre tipi di costanti: numeriche, di stringa e di
+espressione regolare.
+
+Ognuna di esse si usa nel contesto appropriato quando occorre assegnare ai
+dati un valore che non dovr@`a essere cambiato.  Le costanti numeriche possono
+avere forme diverse, ma sono memorizzate internamente sempre allo stesso modo.
+
+@menu
+* Costanti scalari::            Costanti numeriche e stringhe.
+* Numeri non-decimali::         Cosa sono i numeri ottali ed esadecimali.
+* Costanti come espressioni regolari:: Costanti fornite tramite espressioni
+                                regolari.
+@end menu
+
+@node Costanti scalari
+@subsubsection Costanti numeriche e stringhe
+
+@cindex costanti numeriche
+@cindex numeriche, costanti
+Una @dfn{costante numerica} @`e un numero.  Questo numero pu@`o essere un
+numero intero, una frazione decimale o un numero in notazione scientifica
+(esponenziale).@footnote{La rappresentazione interna di tutti i numeri,
+compresi gli interi, usa numeri in virgola mobile a doppia precisione.
+Sui sistemi pi@`u moderni, questi sono nel formato standard IEEE 754.
+@xref{Calcolo con precisione arbitraria}, per maggiori informazioni.}
+Ecco alcuni esempi di costanti numeriche che hanno tutte lo stesso
+valore:
+
+@example
+105
+1.05e+2
+1050e-1
+@end example
+
+@cindex costanti stringa
+Una @dfn{costante stringa} @`e formata da una sequenza di caratteri racchiusi tra
+doppi apici.  Per esempio:
+
+@example
+"pappagallo"
+@end example
+
+@noindent
+@cindex differenze tra @command{awk} e @command{gawk}, stringhe
+@cindex stringhe, limitazioni della lunghezza
+rappresenta la stringa il cui contenuto @`e la parola @samp{pappagallo}.
+Le stringhe in
+@command{gawk} possono essere di qualsiasi lunghezza, e possono contenere
+tutti i possibili caratteri ASCII a otto bit, compreso il carattere ASCII
+@sc{nul} (carattere con codice zero).
+Altre implementazioni di @command{awk} possono avere difficolt@`a con alcuni
+particolari codici di carattere.
+
+Alcuni linguaggi di programmazione consentono la continuazione di stringhe
+lunghe su pi@`u righe, qualora una riga termini con una barra inversa.
+Per esempio in C:
+
+@example
+#include <stdio.h>
+
+int main()
+@{
+    printf "ciao, \
+mondo\n");
+    return 0;
+@}
+@end example
+
+@noindent
+In questo caso, il compilatore C rimuove sia la barra inversa che il
+carattere di avanzamento riga (@dfn{newline}),
+producendo una stringa che equivale ad aver immesso
+@samp{"ciao, mondo\n"}.  Ci@`o torna utile quando una stringa deve contenere
+una grande quantit@`a di testo.
+
+Lo standard POSIX afferma esplicitamente che
+il carattere di avanzamento riga
+non @`e consentito all'interno di costanti di tipo stringa.
+E in effetti, tutte le implementazioni di @command{awk} emettono un
+messaggio di errore se si tenta di utilizzarlo.  Per esempio:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "ciao, }
+> @kbd{mondo" @}'}
+@print{} gawk: riga com.:1: BEGIN @{ print "ciao,
+@print{} gawk: riga com.:1:                ^ stringa non terminata
+@print{} gawk: riga com.:1: BEGIN @{ print "ciao,
+@print{} gawk: riga com.:1:                ^ syntax error
+@end example
+
+@cindex angolo buio, stringhe, continuazione su pi@`u righe
+@cindex stringhe, continuazione su pi@`u righe
+@cindex differenze tra @command{awk} e @command{gawk}, stringhe
+Sebbene POSIX non definisca cosa succede usando un carattere
+protetto di avanzamento riga, come nell'esempio in linguaggio C
+visto sopra, tutte le versioni di @command{awk} consentono di
+farlo.  Sfortunatamente, quello che una particolare versione di
+@command{awk} fa con una tale stringa non @`e uniforme.
+@value{DARKCORNER} @command{gawk}, @command{mawk}, e
+OpenSolaris POSIX @command{awk} (@pxref{Altre versioni})
+tolgono sia la barra inversa che il carattere di
+avanzamento riga, come avviene nel linguaggio C:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "ciao, \}
+> @kbd{mondo" @}'}
+@print{} ciao, mondo
+@end example
+
+In modalit@`a POSIX (@pxref{Opzioni}), @command{gawk} non consente
+caratteri protetti di avanzamento riga.  Altrimenti, il
+comportamento @`e quello descritto sopra.
+
+BKW @command{awk} e BusyBox @command{awk}
+tolgono la barra inversa, ma lasciano indisturbato il carattere
+di avanzamento riga, che fa quindi parte della stringa:
+
+@example
+$ @kbd{nawk 'BEGIN @{ print "ciao, \}
+> @kbd{mondo" @}'}
+@print{} ciao,
+@print{} mondo
+@end example
+
+@node Numeri non-decimali
+@subsubsection Numeri ottali ed esadecimali
+@cindex ottali, numeri
+@cindex esadecimali, numeri
+@cindex numeri ottali
+@cindex numeri esadecimali
+
+In @command{awk}, tutti i numeri sono espressi nel sistema decimale (cio@`e a
+base 10).
+Molti altri linguaggi di programmazione consentono di specificare i numeri in
+altre basi, spesso in ottale (base 8) e in esadecimale (base 16).
+Nel sistema ottale i numeri hanno la sequenza 0, 1, 2, 3, 4, 5, 6, 7, 10, 11,
+12, e cos@`{@dotless{i}} via.  Come @samp{11} decimale @`e una volta 10 pi@`u 1, cos@`{@dotless{i}}
+@samp{11} ottale @`e una volta 8 pi@`u 1. Questo equivale a 9 nel sistema decimale.
+Nell'esadecimale ci sono 16 cifre. Poich@'e l'usuale sistema numerico decimale
+ha solo dieci cifre (@samp{0}--@samp{9}), le lettere da
+@samp{a} a @samp{f} rappresentano le cifre ulteriori.
+(normalmente @`e irrilevante se le lettere sono maiuscole o minuscole; gli
+esadecimali @samp{a} e @samp{A} hanno lo stesso valore).
+Cos@`{@dotless{i}}, @samp{11} esadecimale @`e 1 volta 16 pi@`u 1,
+il che equivale a 17 decimale.
+
+Guardando solamente un @samp{11} puro e semplice, non si capisce in quale base
+sia.  Cos@`{@dotless{i}}, in C, C++, e in altri linguaggi derivati da C,
+@c such as PERL, but we won't mention that....
+c'@`e una speciale notazione per esprimere la base.
+I numeri ottali iniziano con uno @samp{0},
+e i numeri esadecimali iniziano con uno @samp{0x} o @samp{0X}:
+
+@table @code
+@item 11
+Valore decimale 11
+
+@item 011
+11 ottale, valore decimale 9
+
+@item 0x11
+11 esadecimale, valore decimale 17
+@end table
+
+Quest'esempio mostra le differenze:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "%d, %d, %d\n", 011, 11, 0x11 @}'}
+@print{} 9, 11, 17
+@end example
+
+Poter usare costanti ottali ed esadecimali nei propri programmi @`e molto utile
+quando si lavora con dati che non possono essere rappresentati
+convenientemente come caratteri o come numeri regolari, come i dati binari di
+vario tipo.
+
+@cindex @command{gawk}, numeri ottali e
+@cindex @command{gawk}, numeri esadecimali e
+@command{gawk} permette l'uso di costanti ottali ed esadecimali nel testo di
+un programma.  Comunque, se numeri non-decimali sono presenti tra i dati in
+input, essi non sono trattati in maniera speciale; trattarli in modo speciale
+per default significherebbe che vecchi programmi @command{awk} produrrebbero
+risultati errati.
+(Se si vuole che i numeri siano trattati in maniera speciale, si deve
+specificare l'opzione da riga di comando
+@option{--non-decimal-data};
+@pxref{Dati non decimali}.)
+Se si devono gestire dati ottali o esadecimali,
+si pu@`o usare la funzione @code{strtonum()}
+(@pxref{Funzioni per stringhe})
+per convertire i dati in numeri.
+La maggior parte delle volte, le costanti ottali o esadecimali si usano quando
+si lavora con le funzioni predefinite di manipolazione di bit;
+si veda @ref{Funzioni a livello di bit}
+per maggiori informazioni.
+
+Diversamente da alcune tra le prime implementazioni di C, @samp{8} e @samp{9}
+non sono cifre valide nelle costanti ottali.  Per esempio, @command{gawk}
+tratta @samp{018} come un 18 decimale:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print "021 @`e", 021 ; print 018 @}'}
+@print{} 021 @`e 17
+@print{} 18
+@end example
+
+@cindex modalit@`a compatibile di (@command{gawk}), numeri ottali
+@cindex numeri ottali nella modalit@`a compatibile di (@command{gawk})
+@cindex modalit@`a compatibile di (@command{gawk}), numeri esadecimali
+@cindex numeri esadecimali nella modalit@`a compatibile di (@command{gawk})
+@cindex compatibile, modalit@`a (@command{gawk}), numeri ottali
+@cindex compatibile, modalit@`a (@command{gawk}), numeri esadecimali
+Le costanti ottali ed esadecimali nel codice sorgente sono un'estensione di
+@command{gawk}.  Se @command{gawk} @`e in modalit@`a compatibile
+(@pxref{Opzioni}),
+non sono disponibili.
+
+@sidebar La base di una costante non influisce sul suo valore
+
+Una volta che una costante numerica @`e stata
+convertita internamente in un numero [decimale],
+@command{gawk} non considera pi@`u
+la forma originale della costante; viene sempre usato il valore
+interno.  Questo ha delle precise conseguenze per la conversione dei
+numeri in stringhe:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "0x11 vale <%s>\n", 0x11 @}'}
+@print{} 0x11 vale <17>
+@end example
+@end sidebar
+
+@node Costanti come espressioni regolari
+@subsubsection Costanti fornite tramite espressioni regolari
+
+@cindex @dfn{regexp}, costanti
+@cindex costanti @dfn{regexp}
+@cindex @code{~} (tilde), operatore @code{~}
+@cindex tilde (@code{~}), operatore @code{~}
+@cindex @code{!} (punto esclamativo), operatore @code{!~}
+@cindex punto esclamativo (@code{!}), operatore @code{!~}
+Una @dfn{costante regexp} @`e la descrizione di un'espressione regolare
+delimitata
+da barre, come @code{@w{/^inizio e fine$/}}.  La maggior parte delle
+@dfn{regexp} usate nei programmi @command{awk} sono costanti, ma gli operatori
+di confronto @samp{~} e @samp{!~} possono confrontare anche @dfn{regexp}
+calcolate o dinamiche (che tipicamente sono solo stringhe ordinarie o
+variabili che contengono un'espressione regolare, ma potrebbero anche essere
+espressioni pi@`u complesse).
+
+@node Usare le costanti @dfn{regexp}
+@subsection Usare espressioni regolari come costanti
+
+Le costanti @dfn{regexp} sono costituite da testo che descrive un'espressione
+regolare, racchiusa fra barre (come p.e. @code{/la +risposta/}).
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} tratta del comportamento di tali costanti in
+POSIX @command{awk} e in @command{gawk}, e prosegue descrivendo le
+@dfn{costanti @dfn{regexp} fortemente tipizzate}, che sono
+un'estensione @command{gawk}.
+
+@menu
+* Costanti @dfn{regexp} normali:: Costanti @dfn{regexp} normali in
+                                @command{awk}.
+* Costanti @dfn{regexp} forti:: Costanti @dfn{regexp} fortemente tipizzate.
+@end menu
+
+@node Costanti @dfn{regexp} normali
+@subsubsection Costanti @dfn{regexp} normali in @command{awk}.
+
+@cindex angolo buio, costanti @dfn{regexp}
+Quand'@`e usata a destra degli operatori @samp{~} o @samp{!~},
+una costante @dfn{regexp} rappresenta semplicemente l'espressione regolare che
+dev'essere confrontata.  Comunque, le costanti @dfn{regexp} (come @code{/pippo/})
+possono essere usate come semplici espressioni.
+Quando una
+costante @dfn{regexp} compare da sola, ha lo stesso significato di quando
+compare in un criterio di ricerca (cio@`e @samp{($0 ~ /pippo/)}).
+@value{DARKCORNER}
+@xref{Espressioni come criteri di ricerca}.
+Ci@`o vuol dire che i due frammenti di codice seguenti:
+
+@example
+if ($0 ~ /barfly/ || $0 ~ /camelot/)
+    print "trovato"
+@end example
+
+@noindent
+e:
+
+@example
+if (/barfly/ || /camelot/)
+    print "trovato"
+@end example
+
+@noindent
+sono esattamente equivalenti.
+Una conseguenza piuttosto bizzarra di questa regola @`e che la seguente
+espressione booleana @`e valida, ma non fa quel che probabilmente l'autore
+si aspettava:
+
+@example
+# Notare che /pippo/ @`e alla @emph{sinistra} della ~
+if (/pippo/ ~ $1) print "trovato pippo"
+@end example
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex @command{gawk}, costanti @dfn{regexp} e
+@cindex costanti @dfn{regexp}, in @command{gawk}
+@noindent
+Questo codice ``ovviamente'' intende verificare se @code{$1} contiene
+l'espressione regolare @code{/pippo/}.  Ma in effetti l'espressione
+@samp{/pippo/ ~ $1} significa realmente @samp{($0 ~ /pippo/) ~ $1}.  In altre
+parole, prima confronta il record in input con l'espressione regolare
+@code{/pippo/}.  Il risultato @`e zero o uno, a seconda che il confronto dia esito
+positivo o negativo.  Questo risultato
+@`e poi confrontato col primo campo nel record.
+Siccome @`e improbabile che qualcuno voglia mai fare realmente questo genere di
+test, @command{gawk} emette un avvertimento quando vede questo costrutto in
+un programma.
+Un'altra conseguenza di questa regola @`e che l'istruzione di assegnamento:
+
+@example
+confronta = /pippo/
+@end example
+
+@noindent
+assegna zero o uno alla variabile @code{confronta}, a seconda
+del contenuto del record in input corrente.
+
+@cindex differenze tra @command{awk} e @command{gawk}, costanti @dfn{regexp}
+@cindex angolo buio, costanti @dfn{regexp}, come argomenti a funzioni definite dall'utente
+@cindexgawkfunc{gensub}
+@cindexawkfunc{sub}
+@cindexawkfunc{gsub}
+Le espressioni regolari costanti possono essere usate anche come primo
+argomento delle
+funzioni @code{gensub()}, @code{sub()}, e @code{gsub()}, come secondo argomento
+della funzione @code{match()},
+e come terzo argomento delle funzioni @code{split()} e @code{patsplit()}
+(@pxref{Funzioni per stringhe}).
+Le moderne implementazioni di @command{awk}, incluso @command{gawk}, permettono
+di usare come terzo argomento di @code{split()} una costante @dfn{regexp}, ma
+alcune implementazioni pi@`u vecchie non lo consentono.
+@value{DARKCORNER}
+Poich@'e alcune funzioni predefinite accettano costanti @dfn{regexp} come
+argomenti, pu@`o generare confusione l'uso di costanti @dfn{regexp} come
+argomenti di funzioni definite dall'utente
+(@pxref{Funzioni definite dall'utente}).  Per esempio:
+
+@example
+@group
+function mysub(modello, sostituzione, stringa, globale)
+@{
+    if (globale)
+        gsub(modello, sostituzione, stringa)
+    else
+        sub(modello, sostituzione, stringa)
+    return stringa
+@}
+@end group
+
+@group
+@{
+    @dots{}
+    text = "salve! salve a te!"
+    mysub(/salve/, "ciao", text, 1)
+    @dots{}
+@}
+@end group
+@end example
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+In quest'esempio, il programmatore vuol passare una costante @dfn{regexp} alla
+funzione definita dall'utente @code{mysub()}, che a sua volta la passa o a
+@code{sub()} o a @code{gsub()}.  Comunque, quel che realmente succede @`e che
+al parametro @code{modello} @`e assegnato un valore di uno o zero, a seconda
+che @code{$0} corrisponda a @code{/salve/} o no.
+@command{gawk} emette un avvertimento quando vede una costante @dfn{regexp}
+usata come parametro di una funzione definita dall'utente, poich@'e
+passare un valore vero/falso in questo modo probabilmente non @`e quello che
+si intendeva fare.
+
+@node Costanti @dfn{regexp} forti
+@subsubsection Costanti @dfn{regexp} fortemente tipizzate
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+
+Come visto
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ifdocbook
+@value{SECTION}
+@end ifdocbook
+precedente,
+le costanti @dfn{regexp} (@code{/@dots{}/}) hanno uno strano posto nel
+linguaggio @command{awk}.  In molti contesti, si comportano come
+un'espressione:
+@samp{$0 ~ /@dots{}/}. In altri contesti, denotano solo una @dfn{regexp} da
+individuare.  In nessun caso esse sono davvero ``cittadine di serie A'' del
+linguaggio. Ovvero, non @`e possibile definire una variabile scalare il cui
+tipo sia ``@dfn{regexp}'' nello stesso senso in cui si pu@`o definire una
+variabile che sia un numero o una stringa:
+
+@example
+num = 42        @ii{Variabile numerica}
+str = "hi"      @ii{Variabile di tipo stringa}
+re = /pippo/    @ii{Errore!}  re @ii{@`e il risultato di} $0 ~ /pippo/
+@end example
+
+Per alcuni casi di uso pi@`u avanzati,
+sarebbe bello poter avere costanti @dfn{regexp} che sono
+@dfn{fortemente tipizzate}; in altre parole, che sostituiscono
+una @dfn{regexp} utile per effettuare dei confronti,
+e non una semplice espressione regolare.
+
+@cindex valori, @dfn{regexp}
+@command{gawk} prevede questa funzionalit@`a.  Un'espressione regolare
+fortemente tipizzata @`e molto simile a un'espressione regolare normale,
+tranne per il fatto di essere preceduta dal simbolo @samp{@@}:
+
+@example
+re = @@/foo/     @ii{variabile @dfn{regexp} fortemente tipizzata}
+@end example
+
+Le variabili @dfn{regexp} fortemente tipizzate @emph{non possono} essere
+usate in ogni istruzione in cui compare un'espressione regolare normale.
+perch@'e ci@`o renderebbe il linguaggio ancora pi@`u fuorviante.
+Queste espressioni possono essere usate solo in alcuni contesti:
+
+@itemize @bullet
+@item
+Sul lato destro degli operatori @samp{~} e @samp{!~}:
+@samp{qualche_variabile ~ @@/foo/}
+(@pxref{Uso di @dfn{regexp}}).
+
+@item
+Nella parte @code{case} di un'istruzione @code{switch}
+(@pxref{Istruzione switch}).
+
+@item
+Come argomento in una delle funzioni predefinite che possono utilizzare
+costanti @dfn{regexp}:
+@code{gensub()},
+@code{gsub()},
+@code{match()},
+@code{patsplit()},
+@code{split()}
+e
+@code{sub()}
+(@pxref{Funzioni per stringhe}).
+
+@item
+Come parametro in una chiamata a una funzione definita dall'utente
+(@pxref{Funzioni definite dall'utente}).
+
+@item
+Sul lato destro di un assegnamento di variabile:
+@samp{qualche_variabile = @@/foo/}.
+In tal caso, @code{qualche_variabile} @`e di tipo @dfn{regexp}.
+Inoltre, @code{qualche_variabile}
+pu@`o essere usata con gli operatori @samp{~} e @samp{!~}, passata a una
+delle funzioni predefinite sopra elencate o passata come parametro
+a una funzione definita dall'utente.
+@end itemize
+
+Si pu@`o usare la funzione predefinita @code{typeof()}
+(@pxref{Funzioni per i tipi})
+per determinare se un parametro passato a una funzione
+@`e una variabile di tipo @dfn{regexp}.
+
+La vera efficacia di questa funzionalit@`a consiste nella capacit@`a di creare
+variabili il cui tipo @`e @dfn{regexp}.  Tali variabili possono essere passate
+a funzioni definite dall'utente, senza gli inconvenenti che si hanno usando
+espressioni regolari calcolate, a partire da stringhe o da costanti di tipo
+stringa.  Queste variabili possono anche essere passate utilizzando chiamate
+indirette a funzioni (@pxref{Chiamate indirette}) e alle funzioni predefinite
+che accettano costanti di tipo @dfn{regesp}.
+
+Quando sono usate per effettuare conversioni numeriche, le variabili
+@dfn{regexp} fortemente tipizzate vengono convertite alla cifra zero.
+Quando sono usate per effettuare conversioni a stringhe, vengono convertite
+al valore di stringa del testo della @dfn{regexp} originale.
+
+@node Variabili
+@subsection Variabili
+
+@cindex variabili definite dall'utente
+@cindex definite dall'utente, variabili
+Le @dfn{variabili} consentono di memorizzare valori in un certo punto di un
+programma, per usarli pi@`u tardi in un'altra parte del programma.  Le variabili
+possono essere gestite interamente all'interno del testo del programma, ma
+ad esse possono essere assegnati valori sulla riga di comando, in fase di
+invocazione di @command{awk}.
+
+@menu
+* Usare variabili::             Usare variabili nei propri programmi.
+* Opzioni di assegnamento::     Impostare variabili dalla riga di
+                                comando, e un sommario della sintassi
+                                della riga di comando.
+                                Questo @`e un metodo di input avanzato.
+@end menu
+
+@node Usare variabili
+@subsubsection Usare variabili in un programma
+
+Le variabili permettono di dare nomi ai valori e di far riferimento ad essi in
+un secondo momento.  Alcune variabili sono gi@`a state usate in molti degli
+esempi.
+Il nome di una variabile dev'essere una sequenza di lettere, cifre o trattini
+bassi, e non deve iniziare con una cifra.
+Qui, una @dfn{lettera} @`e una qualsiasi delle 52 lettere maiuscole e minuscole
+dell'alfabeto inglese.  Altri caratteri che possono essere definiti come
+lettere in localizzazioni non inglesi non sono validi nei nomi di variabile.
+Il maiuscolo o minuscolo sono significativi nei nomi di variabile;
+@code{a} e @code{A} sono variabili diverse.
+
+Un nome di variabile @`e un'espressione valida in se stessa; rappresenta il
+valore corrente della variabile.  I valori delle variabili possono essere
+modificati tramite @dfn{operatori di assegnamento}, @dfn{operatori di
+incremento} e @dfn{operatori di decremento}
+(@xref{Operatori di assegnamento}).
+Inoltre, le funzioni @code{sub()} e @code{gsub()} possono cambiare il valore
+di una variabile e le funzioni
+@code{match()}, @code{split()}, e @code{patsplit()} possono cambiare il
+contenuto dei loro parametri che sono
+costituiti da vettori
+(@pxref{Funzioni per stringhe}).
+
+@cindex variabili, predefinite
+@cindex variabili, inizializzazione
+Alcune variabili hanno un significato speciale predefinito, come @code{FS}
+(il separatore di campo) e @code{NF} (il numero di campi nel record di input
+corrente).  @xref{Variabili predefinite} per un elenco delle variabili
+predefinite.  Queste variabili predefinite possono essere usate e possono
+ricevere assegnamenti come tutte le altre variabili, ma i loro valori sono
+anche usati o cambiati automaticamente da @command{awk}.  Tutti i nomi delle
+variabili predefinite sono in caratteri maiuscoli.
+
+Alle variabili in @command{awk} possono essere assegnati valori numerici o
+valori di stringa.  Il tipo di valore che una variabile contiene pu@`o cambiare
+durante la vita di un programma.  Per default, le variabili sono inizializzate
+alla stringa nulla, che vale zero se viene convertita in un numero.  Non c'@`e
+alcuna
+necessit@`a di inizializzare esplicitamente una variabile in @command{awk},
+come invece occorre fare in C e nella maggior parte dei linguaggi
+tradizionali.
+
+@node Opzioni di assegnamento
+@subsubsection Assegnare una variabile dalla riga di comando
+@cindex variabili, assegnare da riga di comando
+@cindex riga di comando, variabili@comma{} assegnare da
+
+Si pu@`o impostare qualsiasi variabile @command{awk} includendo un
+@dfn{assegnamento di variabile} tra gli argomenti sulla riga di comando quando
+viene invocato @command{awk} (@pxref{Altri argomenti}).
+Tale assegnamento ha la seguente forma:
+
+@example
+@var{variabile}=@var{testo}
+@end example
+
+@cindex @option{-v}, opzione
+@noindent
+Con questo assegnamento, una variabile viene impostata o all'inizio
+dell'esecuzione di @command{awk} o tra la lettura di un file in input e il
+successivo file in input.
+Quando l'assegnamento @`e preceduto dall'opzione @option{-v},
+come nel seguente esempio:
+
+@example
+-v @var{variabile}=@var{testo}
+@end example
+
+@noindent
+la variabile @`e impostata proprio all'inizio, ancor prima che sia eseguita la
+regola @code{BEGIN}.  L'opzione @option{-v} e il suo assegnamento
+deve precedere tutti gli argomenti @value{FN}, e anche il testo del programma.
+(@xref{Opzioni} per maggiori informazioni sull'opzione
+@option{-v}.)
+In alternativa, l'assegnamento di variabile @`e effettuata in un momento
+determinato
+dalla posizione dell'opzione tra gli argomenti "file in input", cio@`e dopo
+l'elaborazione del precedente argomento "file in input".  Per esempio:
+
+@example
+awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list
+@end example
+
+@noindent
+stampa il valore del campo numero @code{n} per tutti i record in input.  Prima
+che venga letto il primo file, la riga di comando imposta la variabile @code{n}
+al valore quattro.  Questo fa s@`{@dotless{i}} che venga stampato il quarto campo delle righe
+del file @file{inventory-shipped}.  Dopo la fine del primo file, ma prima
+che inizi il secondo file, @code{n} viene impostato a due, e quindi poi
+viene stampato il secondo campo delle righe di @file{mail-list}:
+
+@example
+$ @kbd{awk '@{ print $n @}' n=4 inventory-shipped n=2 mail-list}
+@print{} 15
+@print{} 24
+@dots{}
+@print{} 555-5553
+@print{} 555-3412
+@dots{}
+@end example
+
+@cindex angolo buio, argomenti da riga di comando
+Gli argomenti da riga di comando sono resi disponibili dal programma
+@command{awk} nel vettore @code{ARGV} per poter essere esaminati esplicitamente
+(@pxref{ARGC e ARGV}).
+@command{awk} elabora i valori degli assegnamenti da riga di comando per
+sequenze di protezione
+(@pxref{Sequenze di protezione}).
+@value{DARKCORNER}
+
+Le variabili assegnate sulla riga di comando (sia tramite l'opzione
+@option{-v} che senza) sono trattate come stringhe.  Quando tali variabili
+sono usate come numeri, viene effettuata la normale conversione automatica
+da stringhe a numeri, e ogni cosa ``funziona come deve''.
+
+Peraltro, @command{gawk} supporta variabili di tipo ``regexp''.
+Si possono assegnare valori a variabili di questo tipo usando la
+sintassi seguente:
+
+@example
+gawk -v 're1=@/pippo|pluto/' '@dots{}' /percorso/al/file1 're2=@/ciao|salve/' /percorso/al/file2
+@end example
+
+@noindent
+Le costanti @dfn{regexp} fortemente tipizzate sono un'altra
+funzionalit@`a avanzata disponibile
+(@pxref{Costanti @dfn{regexp} forti}).
+Sono ricordate qui solo per completezza.
+
+@node Conversione
+@subsection Conversione di stringhe e numeri
+
+Le conversioni di numeri in stringhe e di stringhe in numeri sono generalmente
+semplici.  Ci possono essere delle sottigliezze che bisogna tenere presenti;
+questa @value{SECTION} tratta di quest'importante sfaccettatura di @command{awk}.
+
+@menu
+* Stringhe e numeri::         Come @command{awk} converte tra
+                              stringhe e numeri.
+* Localizzazione e conversioni:: Come la localizzazione pu@`o influire
+                              sulle conversioni.
+@end menu
+
+@node Stringhe e numeri
+@subsubsection Come @command{awk} converte tra stringhe e numeri
+
+@cindex conversione da stringhe a numeri
+@cindex stringhe, conversione
+@cindex numeri, conversione in stringhe
+@cindex conversione da numeri a stringhe
+Le stringhe sono convertite in numeri e i numeri sono convertiti in stringhe,
+se il contesto del programma @command{awk} lo richiede.  Per esempio, se il
+valore di @code{pippo} o @code{pluto} nell'espressione @samp{pippo + pluto}
+@`e una stringa, viene convertita in un numero prima di eseguire l'addizione.
+Se in una concatenazione di stringhe ci sono valori numerici, questi sono
+convertiti in stringhe.  Si consideri il seguente esempio:
+
+@example
+@group
+due = 2; tre = 3
+print (due tre) + 4
+@end group
+@end example
+
+@noindent
+Stampa il valore (numerico) di 27.  I valori numerici delle
+variabili @code{due} e @code{tre} sono convertiti in stringhe e
+concatenati insieme.  La stringa risultante @`e riconvertita nel
+numero 23, al quale poi viene aggiunto 4.
+
+@cindex stringa nulla, conversione da tipo numerico a tipo stringa
+@cindex conversione di tipo variabile
+@cindex variabile, conversione di tipo
+Se, per qualche ragione, si vuole forzare la conversione di un numero in
+una stringa, basta concatenare a quel numero la stringa nulla, @code{""}.
+Per forzare la conversione di una stringa in un numero, basta aggiungere zero
+a quella stringa.  Una stringa viene convertita in un numero interpretando
+qualsiasi prefisso numerico della stringa come numero:
+@code{"2.5"} si converte in 2.5, @code{"1e3"} si converte in 1000, e
+@code{"25fix"} ha un valore numerico di 25.
+Le stringhe che non possono essere interpretate come numeri validi vengono
+convertite al valore zero.
+
+@cindex @code{CONVFMT}, variabile
+Il modo esatto in cui i numeri sono convertiti in stringhe @`e controllato dalla
+variabile predefinita di @command{awk} @code{CONVFMT}
+(@pxref{Variabili predefinite}).  I numeri vengono convertiti usando la
+funzione @code{sprintf()}
+con @code{CONVFMT} come specificatore di formato
+(@pxref{Funzioni per stringhe}).
+
+Il valore di default di @code{CONVFMT} @`e @code{"%.6g"}, che crea un valore con
+un massimo di sei cifre significative.  Per alcune applicazioni potrebbe essere
+opportuno cambiare questo valore per ottenere una maggiore precisione.
+Sulla maggior parte delle macchine moderne
+normalmente bastano 17 cifre per esprimere esattamente il valore di un numero
+in virgola mobile.@footnote{Per casi eccezionali possono essere richieste fino
+a 752 cifre (!), non sembra che sia il caso di preoccuparsene qui.}
+
+@cindex angolo buio, variabile @code{CONVFMT}
+Si possono avere strani risultati se si imposta @code{CONVFMT} a una stringa
+che non indica a @code{sprintf()} come formattare i numeri in virgola mobile
+in un modo utile.  Per esempio, se ci si dimentica la @samp{%} nel formato,
+@command{awk} converte tutti i numeri alla stessa stringa costante.
+
+Come caso particolare, per un numero intero, il risultato della conversione
+a una stringa @`e @emph{sempre} un numero intero, indipendentemente da quale
+sia il valore di @code{CONVFMT}.  Dato il seguente fammento di codice:
+
+@example
+CONVFMT = "%2.2f"
+a = 12
+b = a ""
+@end example
+
+@noindent
+@code{b} ha valore @code{"12"}, non @code{"12.00"}.
+@value{DARKCORNER}
+
+@sidebar @command{awk} prima di POSIX usava @code{OFMT} per la conversione di stringhe
+@cindex POSIX @command{awk}, variabile @code{OFMT} e
+@cindex @code{OFMT}, variabile
+@cindex portabilit@`a, nuovo @command{awk} vs.@: vecchio @command{awk}
+@cindex @command{awk}, nuovo vs.@: vecchio, variabile @code{OFMT}
+Prima dello standard POSIX, @command{awk} usava il valore di @code{OFMT} per
+convertire i numeri in stringhe.  @code{OFMT} specifica il formato di output da
+usare per la stampa dei numeri con @code{print}.  @code{CONVFMT} fu introdotto
+per separare la semantica della conversione dalla semantica della stampa.  Sia
+@code{CONVFMT} che @code{OFMT} hanno lo stesso valore di dafault:
+@code{"%.6g"}.  Nella stragrande maggioranza dei casi, i vecchi programmi di
+@command{awk} non cambiano questo comportamento.
+@xref{Print} per maggiori informazioni sull'istruzione @code{print}.
+@end sidebar
+
+@node Localizzazione e conversioni
+@subsubsection Le localizzazioni possono influire sulle conversioni
+
+Il luogo dove si @`e pu@`o avere importanza quando si tratta di convertire numeri e
+stringhe.  La lingua e i caratteri---la @dfn{localizzazione}---possono
+influire sui formati numerici.  In particolare, per i programmi @command{awk},
+influiscono sui caratteri separatore decimale e separatore delle migliaia.
+La localizzazione @code{"C"}, e la maggior parte delle localizzazioni inglesi,
+usano il punto (@samp{.}) come separatore decimale e non prevedono un
+separatore delle
+migliaia.  Tuttavia, molte (se non la maggior parte) delle localizzazioni
+europee e non inglesi usano la virgola (@samp{,}) come separatore dei decimali.
+Le localizzazioni europee spesso usano o lo spazio o il punto come separatore
+delle migliaia, all'occorrenza.
+
+@cindex angolo buio, carattere di separazione dei decimali nelle localizzazioni
+Lo standard POSIX prevede che @command{awk} usi sempre il punto come separatore
+dei decimali nel codice sorgente del programma @command{awk}, e per
+gli assegnamenti di variabile da riga di comando (@pxref{Altri argomenti}).
+Tuttavia, nell'interpretazione dei dati in input, per l'output di
+@code{print} e @code{printf}, e per la conversione da numeri a stringhe,
+viene usato il
+separatore decimale locale.  @value{DARKCORNER} In ogni caso, i numeri nel
+codice sorgente e nei dati di input non possono avere un separatore delle
+migliaia.  Di seguito sono riportati alcuni esempi che illustrano la differenza
+di comportamento, su un sistema GNU/Linux:
+
+@example
+$ @kbd{export POSIXLY_CORRECT=1}                        @ii{Forzare aderenza a standard POSIX}
+$ @kbd{gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
+@print{} 3.14159
+$ @kbd{LC_ALL=en_DK.utf-8 gawk 'BEGIN @{ printf "%g\n", 3.1415927 @}'}
+@print{} 3,14159
+$ @kbd{echo 4,321 | gawk '@{ print $1 + 1 @}'}
+@print{} 5
+$ @kbd{echo 4,321 | LC_ALL=en_DK.utf-8 gawk '@{ print $1 + 1 @}'}
+@print{} 5,321
+@end example
+
+@noindent
+La localizzazione @code{en_DK.utf-8} @`e per l'inglese in Danimarca, dove
+le virgole fungono da separatore decimale.  Nella localizzazione @code{"C"}
+normale, @command{gawk} tratta @samp{4,321} come 4, mentre nella localizzazione
+danese @`e trattato come numero completo comprendente la parte frazionaria,
+4.321.
+
+Alcune delle prime versioni di @command{gawk} si conformavano completamente con
+quest'aspetto dello standard.  Tuttavia, molti utenti di localizzazioni non
+inglesi si lamentavano di questo comportamento, perch@'e i loro dati usavano il
+punto come separatore decimale, per cui fu ripristinato il comportamento di
+default che usava il punto come carattere di separazione decimale.  Si pu@`o
+usare l'opzione @option{--use-lc-numeric} (@pxref{Opzioni}) per forzare
+@command{gawk} a usare il carattere separatore decimale della localizzazione.
+(@command{gawk} usa il separatore decimale della localizzazione anche quando
+@`e in modalit@`a POSIX, o con l'opzione @option{--posix} o con la variabile
+d'ambiente @env{POSIXLY_CORRECT}, come appena visto.)
+
+@ref{table-locale-affects} descrive i casi in cui si usa il separatore decimale
+locale e quando si usa il punto.  Alcune di queste funzionalit@`a non sono state
+ancora descritte.
+
+@float Tabella,table-locale-affects
+@caption{Separatore decimale locale o punto}
+@multitable @columnfractions .15 .25 .45
+@headitem Funzione @tab Default @tab @option{--posix} o @option{--use-lc-numeric}
+@item @code{%'g} @tab Usa la localizzazione @tab Usa la localizzazione
+@item @code{%g} @tab Usa il punto @tab Usa la localizzazione
+@item Input @tab Usa il punto @tab Usa la localizzazione
+@item @code{strtonum()} @tab Usa il punto @tab Usa la localizzazione
+@end multitable
+@end float
+
+Infine, gli standard ufficiali correnti e la rappresentazione dei numeri
+in virgola mobile dello standard IEEE possono avere un effetto insolito ma
+importante sul modo in cui @command{gawk} converte alcuni valori di stringa
+speciali in numeri.  I dettagli sono illustrati in
+@ref{Problemi virgola mobile POSIX}.
+
+@node Tutti gli operatori
+@section Operatori: fare qualcosa coi valori
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} introduce gli @dfn{operatori} che fanno uso
+dei valori forniti da costanti e variabili.
+
+@menu
+* Operatori aritmetici::        Operazioni aritmetiche (@samp{+}, @samp{-},
+                                etc.)
+* Concatenazione::              Concatenazione di stringhe.
+* Operatori di assegnamento::   Cambiare il valore di una variabile o di un
+                                campo.
+* Operatori di incremento::     Incrementare il valore numerico di una
+                                variabile.
+@end menu
+
+@node Operatori aritmetici
+@subsection Operatori aritmetici
+@cindex aritmetici, operatori
+@cindex operatori aritmetici
+@c @cindex addition
+@c @cindex subtraction
+@c @cindex multiplication
+@c @cindex division
+@c @cindex remainder
+@c @cindex quotient
+@c @cindex exponentiation
+
+Il linguaggio @command{awk} usa i comuni operatori aritmetici nella valutazione
+delle espressioni.  Tutti questi operatori aritmetici seguono le normali regole
+di precedenza e funzionano come ci si aspetta.
+
+Il seguente esempio usa un file chiamato @file{grades}, che contiene
+una lista di nomi di studenti e anche i voti di tre verifiche per ogni studente
+(@`e una piccola classe):
+
+@example
+Pat   100 97 58
+Sandy  84 72 93
+Chris  72 92 89
+@end example
+
+@noindent
+Questo programma prende il file @file{grades} e stampa la media
+dei voti:
+
+@example
+$ @kbd{awk '@{ sum = $2 + $3 + $4 ; avg = sum / 3}
+>        @kbd{print $1, avg @}' grades}
+@print{} Pat 85
+@print{} Sandy 83
+@print{} Chris 84.3333
+@end example
+
+La lista seguente elenca gli operatori aritmetici in @command{awk},
+in ordine di precedenza, da quella pi@`u alta a quella pi@`u bassa:
+
+@table @code
+@cindex estensioni comuni, operatore @code{**}
+@cindex POSIX @command{awk}, operatori aritmetici e
+@item @var{x} ^ @var{y}
+@itemx @var{x} ** @var{y}
+Elevamento a potenza; @var{x} elevato alla potenza @var{y}.  @samp{2 ^ 3}
+ha il valore otto; la sequenza di caratteri @samp{**} equivale a
+@samp{^}. @value{COMMONEXT}
+
+@item - @var{x}
+Negazione.
+
+@item + @var{x}
+Pi@`u unario; l'espressione @`e convertita in un numero.
+
+@item @var{x} * @var{y}
+Moltiplicazione.
+
+@cindex risoluzione di problemi, divisione
+@cindex problemi, risoluzione di, divisione
+@cindex divisione
+@item @var{x} / @var{y}
+Divisione;  poich@'e tutti i numeri in @command{awk} sono numeri in virgola
+mobile, il risultato @emph{non} @`e arrotondato all'intero---@samp{3 / 4} ha il
+valore di 0.75.  (Un errore comune, specialmente tra i programmatori in C, @`e
+quello di dimenticare che @emph{tutti} i numeri in @command{awk} sono in virgola mobile,
+e che la divisione di costanti rappresentate da numeri interi produce un
+numero reale, non un numero intero.)
+
+@item @var{x} % @var{y}
+Resto della divisione; subito dopo questa lista, l'argomento viene
+ulteriormente dettagliato.
+
+@item @var{x} + @var{y}
+Addizione.
+
+@item @var{x} - @var{y}
+Sottrazione.
+@end table
+
+Il pi@`u e il meno unari hanno la stessa precedenza,
+gli operatori di moltiplicazione hanno tutti la stessa precedenza, e
+l'addizione e la sottrazione hanno la stessa precedenza.
+
+@cindex differenze tra @command{awk} e @command{gawk}, operazione di modulo-troncamento
+@cindex modulo-troncamento, operazione di
+Quando si calcola il resto di @samp{@var{x} % @var{y}},
+il quoziente @`e troncato all'intero e
+moltiplicato per @var{y}. Questo risultato @`e sottratto da @var{x};
+quest'operazione @`e nota anche come ``modulo''.  La seguente
+relazione @`e sempre verificata:
+
+@example
+b * int(a / b) + (a % b) == a
+@end example
+
+Un possibile effetto indesiderato di questa definizione di resto @`e che
+@samp{@var{x} % @var{y}} sia negativo se @var{x} @`e negativo.  Cos@`{@dotless{i}}:
+
+@example
+-17 % 8 = -1
+@end example
+
+In altre implementazioni di @command{awk} il segno del resto
+pu@`o essere dipendente dalla macchina.
+@c FIXME !!! what does posix say?
+
+@cindex portabilit@`a, operatore @code{**}
+@cindex @code{*} (asterisco), operatore @code{**}
+@cindex asterisco (@code{*}), operatore @code{**}
+@quotation NOTA
+Lo standard POSIX specifica solo l'uso di @samp{^}
+per l'elevamento a potenza.
+Per garantire la massima portabilit@`a @`e meglio non usare l'operatore @samp{**}.
+@end quotation
+
+@node Concatenazione
+@subsection Concatenazione di stringhe
+@cindex Kernighan, Brian
+@quotation
+@i{Allora ci era sembrata una buona idea.}
+@author Brian Kernighan
+@end quotation
+
+@cindex operatori di stringa
+@cindex stringa, operatori di
+@cindex concatenare
+C'@`e una sola operazione di stringa: la concatenazione.  Non ha un operatore
+specifico per rappresentarla.  Piuttosto, la concatenazione @`e effettuata
+scrivendo le espressioni l'una vicino all'altra, senza alcun operatore.
+Per esempio:
+
+@example
+$ @kbd{awk '@{ print "Campo numero uno: " $1 @}' mail-list}
+@print{} Campo numero uno: Amelia
+@print{} Campo numero uno: Anthony
+@dots{}
+@end example
+
+Senza lo spazio nella costante stringa dopo @samp{:}, la riga
+rimane unita.  Per esempio:
+
+@example
+$ @kbd{awk '@{ print "Campo numero uno:" $1 @}' mail-list}
+@print{} Campo numero uno:Amelia
+@print{} Campo numero uno:Anthony
+@dots{}
+@end example
+
+@cindex risoluzione di problemi, concatenazione di stringhe
+@cindex problemi, risoluzione di, concatenazione di stringhe
+Poich@'e la concatenazione di stringhe non ha un operatore esplicito, @`e spesso
+necessario assicurarsi che venga effettuata al momento giusto usando le
+parentesi per racchiudere gli elementi da concatenare.  Per esempio, ci si
+potrebbe aspettare che il
+seguente fammento di codice concateni @code{nome} e @code{file}:
+
+@example
+nome = "nome"
+file = "file"
+print "qualcosa di significativo" > nome file
+@end example
+
+@cindex Brian Kernighan, @command{awk} di
+@cindex @command{mawk}, programma di utilit@`a
+@cindex programma di utilit@`a @command{mawk}
+@noindent
+Questo produce un errore di sintassi in alcune versioni di
+@command{awk} per Unix.@footnote{Pu@`o capitare che BWK @command{awk},
+@command{gawk} e @command{mawk} lo interpretino nel modo giusto,
+ma non ci si dovrebbe fare affidamento.}
+@`E necessario usare la seguente sintassi:
+
+@example
+print "qualcosa di significativo" > (nome file)
+@end example
+
+@cindex ordine di valutazione, concatenazione
+@cindex valutazione, ordine di, concatenazione
+@cindex effetti collaterali
+Si dovrebbero usare le parentesi attorno alle concatenazioni in tutti i
+contesti non comuni, come, per esempio, sul lato destro di @samp{=}.
+Bisogna stare attenti
+al tipo di espressioni usate nella concatenazione di stringhe.  In particolare,
+l'ordine di valutazione di espressioni usate per la concatenazione non @`e
+definita nel linguaggio @command{awk}.  Si consideri quest'esempio:
+
+@example
+BEGIN @{
+    a = "Non"
+    print (a " " (a = "v'allarmate"))
+@}
+@end example
+
+@noindent
+Non @`e definito se il secondo assegnamento ad @code{a} debba avvenire
+prima o dopo il recupero del valore di @code{a} per produrre il
+valore concatenato.  Il risultato potrebbe essere sia @samp{Non v'allarmate},
+sia @samp{v'allarmate v'allarmate}.
+@c see test/nasty.awk for a worse example
+
+La precedenza della concatenazione, quando @`e in combinazione con altri
+operatori, @`e spesso controintuitiva.  Si consideri questo esempio:
+
+@ignore
+> To: bug-gnu-utils@@gnu.org
+> CC: arnold@@gnu.org
+> Subject: gawk 3.0.4 bug with {print -12 " " -24}
+> From: Russell Schulz <Russell_Schulz@locutus.ofB.ORG>
+> Date: Tue, 8 Feb 2000 19:56:08 -0700
+>
+> gawk 3.0.4 on NT gives me:
+>
+> prompt> cat bad.awk
+> BEGIN { print -12 " " -24; }
+>
+> prompt> gawk -f bad.awk
+> -12-24
+>
+> when I would expect
+>
+> -12 -24
+>
+> I have not investigated the source, or other implementations.  The
+> bug is there on my NT and DOS versions 2.15.6 .
+@end ignore
+
+@example
+$ @kbd{awk 'BEGIN @{ print -12 " " -24 @}'}
+@print{} -12-24
+@end example
+
+Quest'esempio, ``ovviamente'' concatena @minus{}12, uno spazio, e @minus{}24.
+Ma dov'@`e finito lo spazio?
+La risposta sta nella combinazione di precedenze di operatori e nelle regole di
+conversione automatica di @command{awk}.  Per ottenere il risultato desiderato,
+si deve scrivere il programma in questo modo:
+
+@example
+$ @kbd{awk 'BEGIN @{ print -12 " " (-24) @}'}
+@print{} -12 -24
+@end example
+
+Questo forza il trattamento, da parte di @command{awk}, del @samp{-} del
+@samp{-24} come operatore unario.  Altrimenti @`e analizzato in questo modo:
+
+@display
+    @minus{}12 (@code{"@ "} @minus{} 24)
+@result{} @minus{}12 (0 @minus{} 24)
+@result{} @minus{}12 (@minus{}24)
+@result{} @minus{}12@minus{}24
+@end display
+
+Come si @`e detto precedentemente,
+quando si usa la concatenazione insieme ad altri operatori, @`e necessario
+@emph{usare le parentesi}.  Altrimenti, non si pu@`o essere mai completamente
+certi di quel che si ottiene.
+
+@node Operatori di assegnamento
+@subsection Espressioni di assegnamento
+@cindex operatori di assegnamento
+@cindex assegnamento, operatori di
+@cindex espressioni di assegnamento
+@cindex @code{=} (uguale), operatore @code{=}
+@cindex uguale (@code{=}), operatore @code{=}
+Un @dfn{assegnamento} @`e un'espressione che memorizza un valore (generalmente
+diverso da quello che la variabile aveva in precedenza) in una variabile.
+Per esempio, si assegni il valore uno alla variabile @code{z}:
+
+@example
+z = 1
+@end example
+
+Dopo l'esecuzione di quest'espressione, la variabile @code{z} ha il valore
+uno.  Qualsiasi precedente valore di @code{z} prima dell'assegnamento
+viene dimenticato.
+
+Gli assegnamenti possono anche memorizzare valori di stringa.  Il seguente
+esempio memorizza
+il valore @code{"questo cibo @`e buono"} nella variabile @code{messaggio}:
+
+@example
+cosa = "cibo"
+predicato = "buono"
+messaggio = "questo " cosa " @`e " predicato
+@end example
+
+@noindent
+@cindex effetti collaterali, espressioni di assegnamento
+Quest'esempio illustra anche la concatenazione di stringhe.
+Il  segno @samp{=} @`e un @dfn{operatore di assegnamento}.  @`E il pi@`u semplice
+fra gli operatori di assegnamento perch@'e il valore dell'operando di destra
+@`e memorizzato invariato.
+La maggior parte degli operatori (addizione, concatenazione e cos@`{@dotless{i}} via) non
+fanno altro che calcolare un valore.  Se il valore non viene poi utilizzato non c'@`e alcun
+motivo per usare l'operatore.  Un operatore di assegnamento @`e differente;
+produce un valore; anche se poi non lo si usa, l'assegnamento svolge ancora
+una funzione alterando la variabile.  Chiamiamo questo
+un @dfn{effetto collaterale}.
+
+@cindex @dfn{lvalue/rvalue}
+@cindex @dfn{rvalue/lvalue}
+@cindex assegnamento, operatori di, @dfn{lvalue/rvalue}
+@cindex operatori di assegnamento
+L'operando di sinistra non dev'essere necessariamente una variabile
+(@pxref{Variabili}); pu@`o essere anche un campo
+(@pxref{Cambiare i campi}) o
+@iftex
+un elemento di un vettore (@pxrefil{Vettori}).
+@end iftex
+@ifnottex
+un elemento di un vettore (@pxref{Vettori}).
+@end ifnottex
+Questi operandi sono chiamati @dfn{lvalue}, il
+che significa che possono apparire sul lato sinistro di un operatore di
+assegnamento.  L'operando sul lato destro pu@`o essere qualsiasi espressione;
+produce un nuovo valore che l'assegnamento memorizza nella variabile, nel campo
+o nell'elemento di vettore specificati. Tali valori sono chiamati
+@dfn{rvalue}.
+
+@cindex variabili, tipi di
+@`E importante notare che le variabili @emph{non} hanno dei tipi permanenti.
+Il tipo di una variabile @`e semplicemente quello di qualsiasi valore le sia stato
+assegnato per ultimo.  Nel seguente frammento di programma, la variabile
+@code{pippo} ha dapprima un valore numerico, e in seguito un valore di stringa:
+
+@example
+@group
+pippo = 1
+print pippo
+@end group
+@group
+pippo = "pluto"
+print pippo
+@end group
+@end example
+
+@noindent
+Quando il secondo assegnamento d@`a a @code{pippo} un valore di stringa, il fatto
+che avesse precedentemente un valore numerico viene dimenticato.
+
+Ai valori di stringa che non iniziano con una cifra viene assegnato il valore
+numerico zero. Dopo l'esecuzione del seguente codice, il valore di @code{pippo} @`e
+cinque:
+
+@example
+pippo = "una stringa"
+pippo = pippo + 5
+@end example
+
+@quotation NOTA
+Usare una variabile sia come numero che come stringa pu@`o originare confusione
+e denota uno stile di programmazione scadente.  I due esempi precedenti
+illustrano come funziona @command{awk}, @emph{non} come si dovrebbero scrivere
+i programmi!
+@end quotation
+
+Un assegnamento @`e un'espressione, per cui ha un valore: lo stesso valore che
+le @`e stato assegnato.  Cos@`{@dotless{i}}, @samp{z = 1} @`e un'espressione col valore uno.
+Una conseguenza di ci@`o @`e che si possono scrivere pi@`u assegnamenti insieme,
+come:
+
+@example
+x = y = z = 5
+@end example
+
+@noindent
+Quest'esempio memorizza il valore cinque in tutte e tre le variabili,
+(@code{x}, @code{y} e @code{z}).
+Questo perch@'e il
+valore di @samp{z = 5}, che @`e cinque, @`e memorizzato in @code{y} e poi
+il valore di @samp{y = z = 5}, che @`e cinque, @`e memorizzato in @code{x}.
+
+Gli assegnamenti possono essere usati ovunque sia prevista un'espressione.  Per
+esempio, @`e valido scrivere @samp{x != (y = 1)} per impostare @code{y} a
+uno, e poi verificare se @code{x} @`e uguale a uno.  Per@`o questo stile rende i
+programmi difficili da leggere; una tale nidificazione di assegnamenti dovrebbe
+essere evitata, eccetto forse in un programma usa-e-getta.
+
+@cindex @code{+} (pi@`u), operatore @code{+=}
+@cindex pi@`u (@code{+}), operatore @code{+=}
+Accanto a @samp{=}, ci sono diversi altri operatori di assegnamento che
+eseguono calcoli col vecchio valore di una variabile.  Per esempio,
+l'operatore @samp{+=} calcola un nuovo valore aggiungendo il valore sul lato
+destro al vecchio valore di una variabile.  Cos@`{@dotless{i}}, il seguente assegnamento
+aggiunge cinque al valore di @code{pippo}:
+
+@example
+pippo += 5
+@end example
+
+@noindent
+Questo equivale a:
+
+@example
+pippo = pippo + 5
+@end example
+
+@noindent
+Si usi la notazione che rende pi@`u chiaro il significato del programma.
+
+Ci sono situazioni in cui usare @samp{+=} (o qualunque operatore di
+assegnamento) @emph{non} @`e la stessa cosa che ripetere semplicemente l'operando
+di sinistra nell'espressione di destra.  Per esempio:
+
+@cindex Rankin, Pat
+@example
+@group
+# Grazie a Pat Rankin per quest'esempio
+BEGIN  @{
+    pippo[rand()] += 5
+    for (x in pippo)
+       print x, pippo[x]
+@end group
+
+@group
+    pluto[rand()] = pluto[rand()] + 5
+    for (x in pluto)
+       print x, pluto[x]
+@}
+@end group
+@end example
+
+@cindex operatori di assegnamento, ordine di valutazione
+@cindex assegnamento, operatori di, ordine di valutazione
+@noindent
+@`E praticamente certo che gli indici di @code{pluto} siano differenti, perch@'e
+@code{rand()} restituisce valori differenti ogni volta che viene chiamata.
+(I vettori e la funzione @code{rand()} non sono ancora stati trattati.
+@iftex
+@xrefil{Vettori},
+@end iftex
+@ifnottex
+@xref{Vettori},
+@end ifnottex
+e
+@ifnotdocbook
+@pxref{Funzioni numeriche}
+@end ifnotdocbook
+@ifdocbook
+@ref{Funzioni numeriche}
+@end ifdocbook
+per maggiori informazioni.)
+Quest'esempio illustra un fatto importante riguardo agli operatori di
+assegnamento: l'espressione di sinistra viene valutata @emph{una volta sola}.
+
+Dipende dall'implementazione stabilire quale espressione valutare per
+prima, se quella di sinistra o quella di destra.
+Si consideri quest'esempio:
+
+@example
+i = 1
+a[i += 2] = i + 1
+@end example
+
+@noindent
+Il valore di @code{a[3]} potrebbe essere sia due sia quattro.
+
+La @ref{table-assign-ops} elenca gli operatori di assegnamento aritmetici.  In
+ogni caso, l'operando di destra @`e un'espressione il cui valore @`e convertito in
+un numero.
+
+@cindex @code{-} (meno), operatore @code{-=}
+@cindex meno (@code{-}), operatore @code{-=}
+@cindex @code{*} (asterisco), operatore @code{*=}
+@cindex asterisco (@code{*}), operatore @code{*=}
+@cindex @code{/} (barra), operatore @code{/=}
+@cindex barra (@code{/}), operatore @code{/=}
+@cindex @code{%} (percento), operatore @code{%=}
+@cindex percento (@code{%}), operatore @code{%=}
+@cindex @code{^} (circonflesso), operatore @code{^=}
+@cindex circonflesso (@code{^}), operatore @code{^=}
+@cindex @code{*} (asterisco), operatore  @code{**=}
+@cindex asterisco (@code{*}), operatore @code{**=}
+@float Tabella,table-assign-ops
+@caption{Operatori di assegnamento aritmetici}
+@multitable @columnfractions .30 .70
+@headitem Operatore @tab Effetto
+@item @var{lvalue} @code{+=} @var{incremento} @tab Aggiunge @var{incremento} al valore di @var{lvalue}.
+@item @var{lvalue} @code{-=} @var{decremento} @tab Sottrae @var{decremento} dal valore di @var{lvalue}.
+@item @var{lvalue} @code{*=} @var{coefficiente} @tab Moltiplica il valore di @var{lvalue} per @var{coefficiente}.
+@item @var{lvalue} @code{/=} @var{divisore} @tab Divide il valore di @var{lvalue} per @var{divisore}.
+@item @var{lvalue} @code{%=} @var{modulo} @tab Imposta @var{lvalue} al resto della sua divisione per @var{modulo}.
+@cindex estensioni comuni, operatore @code{**=}
+@cindex estensioni comuni@comma{} operatore @code{**=}
+@cindex @command{awk}, linguaggio, versione POSIX
+@cindex POSIX @command{awk}
+@item @var{lvalue} @code{^=} @var{esponente} @tab Eleva @var{lvalue} alla potenza @var{esponente}.
+@item @var{lvalue} @code{**=} @var{esponente} @tab Eleva @var{lvalue} alla potenza @var{esponente}. @value{COMMONEXT}
+@end multitable
+@end float
+
+@cindex POSIX @command{awk}, operatore  @code{**=} e
+@cindex portabilit@`a, operatore @code{**=}
+@quotation NOTA
+Soltanto l'operatore  @samp{^=} @`e definito da POSIX.
+Per avere la massima portabilit@`a, non usare l'operatore @samp{**=}.
+@end quotation
+
+@sidebar Ambiguit@`a sintattiche tra @samp{/=} e le espressioni regolari
+@cindex angolo buio, costanti @dfn{regexp}, operatore @code{/=} e
+@cindex @code{/} (barra), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
+@cindex barra (@code{/}), operatore @code{/=}, vs. costante @dfn{regexp} @code{/=@dots{}/}
+@cindex @dfn{regexp}, costanti, @code{/=@dots{}/}, operatore @code{/=} e
+
+@c derived from email from  "Nelson H. F. Beebe" <beebe@math.utah.edu>
+@c Date: Mon, 1 Sep 1997 13:38:35 -0600 (MDT)
+
+@cindex angolo buio, operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
+@cindex ambiguit@`a sintattica: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
+@cindex sintattica, ambiguit@`a: operatore @code{/=} vs. costante @dfn{regexp} @code{/=@dots{}/}
+@cindex @code{/=}, operatore, vs. costante @dfn{regexp} @code{/=@dots{}/}
+C'@`e un'ambiguit@`a sintattica tra l'operatore di assegnamento @code{/=}
+e le costanti @dfn{regexp} il cui primo carattere sia @samp{=}.
+@value{DARKCORNER}
+Questo @`e pi@`u evidente in alcune versioni commerciali di @command{awk}.
+Per esempio:
+
+@example
+$ @kbd{awk /==/ /dev/null}
+@error{} awk: syntax error at source line 1
+@error{}  context is
+@error{}         >>> /= <<<
+@error{} awk: bailing out at source line 1
+@end example
+
+@noindent
+Un espediente @`e:
+
+@example
+awk '/[=]=/' /dev/null
+@end example
+
+@command{gawk} non ha questo problema, e neppure lo hanno BWK @command{awk}
+e @command{mawk}.
+@end sidebar
+
+@node Operatori di incremento
+@subsection Operatori di incremento e di decremento
+
+@cindex incremento, operatori di
+@cindex operatori di decremento/incremento
+Gli @dfn{operatori di incremento} e @dfn{decremento} incrementano o riducono il
+valore di una variabile di uno.  Un operatore di assegnamento pu@`o fare la
+stessa cosa, per cui gli operatori di incremento non aggiungono funzionalit@`a
+al inguaggio @command{awk}; in ogni caso, sono delle convenienti abbreviazioni
+per operazioni molto comuni.
+
+@cindex effetti collaterali
+@cindex @code{+} (pi@`u), operatore @code{++}
+@cindex pi@`u (@code{+}), operatore @code{++}
+@cindex effetti collaterali, operatori di decremento/incremento
+L'operatore per aggiungere uno @`e @samp{++}.  Pu@`o essere usato per incrementare
+una variabile prima o dopo aver stabilito il suo valore.  Per @dfn{preincrementare}
+una variabile @code{v}, si scrive @samp{++v}.  Questo aggiunge uno al valore di
+@code{v}; questo nuovo valore @`e anche il valore dell'espressione.
+(L'espressione di assegnamento @samp{v += 1} @`e totalmente equivalente.)
+Scrivendo @samp{++} dopo la variabile si specifica un @dfn{postincremento}.
+Questo incrementa il valore della variabile nello stesso modo; la differenza @`e
+che il valore dell'espressione d'incremento @`e il @emph{vecchio} valore della
+variabile.  Cos@`{@dotless{i}}, se @code{pippo} ha il valore quattro, l'espressione
+@samp{pippo++} ha il valore quattro, ma cambia il valore di @code{pippo} in cinque.
+In altre parole, l'operatore restituisce il vecchio valore della variabile, ma
+con l'effetto collaterale di incrementarlo.
+
+Il postincremento @samp{pippo++} @`e quasi come scrivere @samp{(pippo += 1) - 1}.
+Non @`e perfettamente equivalente perch@'e tutti i numeri in @command{awk} sono in
+virgola mobile.  In virgola mobile, @samp{pippo + 1 - 1} non @`e necessariamente
+uguale a @code{pippo}, ma la differenza @`e molto piccola finch@'e si ha a che
+fare con numeri relativamente piccoli (inferiori a
+@iftex
+@math{10^{12}}).
+@end iftex
+@ifinfo
+10e12).
+@end ifinfo
+@ifnottex
+@ifnotinfo
+10@sup{12}).
+@end ifnotinfo
+@end ifnottex
+
+@cindex @code{$} (dollaro), incrementare campi e vettori
+@cindex dollaro (@code{$}), incrementare campi e vettori
+I campi di un record e gli elementi di un vettore vengono incrementati
+proprio come le
+variabili.  (Si deve usare @samp{$(i++)} quando si deve fare un riferimento a
+un campo e incrementare una variabile allo stesso tempo.  Le parentesi sono
+necessarie a causa della precedenza dell'operatore di riferimento @samp{$}.)
+
+@cindex decremento, operatori di
+L'operatore di decremento @samp{--} funziona proprio come @samp{++}, solo che
+sottrae uno anzich@'e aggiungerlo.  Come @samp{++}, si pu@`o usare prima di
+@dfn{lvalue}
+per predecrementare o dopo per postdecrementare.
+Quel che segue @`e un sommario delle espressioni di incremento e di
+decremento:
+
+@table @code
+@cindex @code{+} (pi@`u), operatore @code{++}
+@cindex pi@`u (@code{+}), operatore @code{++}
+@item ++@var{lvalue}
+Incrementa @var{lvalue}, restituendo il nuovo valore come
+valore dell'espressione.
+
+@item @var{lvalue}++
+Incrementa @var{lvalue}, restituendo il @emph{vecchio} valore di @var{lvalue}
+come valore dell'espressione.
+
+@cindex @code{-} (meno), operatore @code{--}
+@cindex meno (@code{-}), operatore @code{--}
+@item --@var{lvalue}
+Decrementa @var{lvalue},  restituendo il nuovo valore come
+valore dell'espressione.
+(Quest'espressione @`e come
+@samp{++@var{lvalue}}, ma invece di aggiungere, sottrae.)
+
+@item @var{lvalue}--
+Decrementa @var{lvalue}, restituendo il @emph{vecchio} valore di @var{lvalue}
+come valore dell'espressione.
+(Quest'espressione @`e come
+@samp{@var{lvalue}++}, ma invece di aggiungere, sottrae.)
+@end table
+
+@sidebar Ordine di valutazione degli operatori
+@cindex precedenza
+@cindex operatori, precedenza degli
+@cindex portabilit@`a, operatori
+@cindex valutazione, ordine di
+@cindex Marx, Groucho
+@quotation
+@i{Dottore, quando faccio cos@`{@dotless{i}} mi fa male!@*
+E allora non farlo!}
+@author Groucho Marx
+@end quotation
+
+@noindent
+Che cosa succede con qualcosa come questo?
+
+@example
+b = 6
+print b += b++
+@end example
+
+@noindent
+O con qualcosa di pi@`u strano ancora?
+
+@example
+b = 6
+b += ++b + b++
+print b
+@end example
+
+@cindex effetti collaterali
+In altre parole, quando hanno effetto i vari effetti collaterali previsti
+dagli operatori col suffisso (@samp{b++})? Quando gli effetti collaterali
+si verificano @`e @dfn{definito dall'implementazione}.
+Per dirla diversamente, questo @`e compito di ogni specifica versione di
+@command{awk}.  Il risultato del primo esempio pu@`o essere 12 o 13, e del
+secondo pu@`o essere 22 o 23.
+
+In breve, @`e sconsigliato fare cose come questa e, in ogni caso,
+ogni cosa che possa incidere sulla portabilit@`a.
+Si dovrebbero evitare cose come queste nei programmi.
+@c You'll sleep better at night and be able to look at yourself
+@c in the mirror in the morning.
+@end sidebar
+
+@node Valori e condizioni di verit@`a
+@section Valori e condizioni di verit@`a
+
+In certi contesti, i valori delle espressioni servono anche come
+``valori di verit@`a''; cio@`e, determinano quale sar@`a la direzione che il
+programma prender@`a durante la sua esecuzione. Questa
+@value{SECTION} descrive come @command{awk} definisce ``vero'' e ``falso''
+e come questi valori sono confrontati.
+
+@menu
+* Valori di verit@`a::            Cos'@`e ``vero'' e cos'@`e ``falso''.
+* Tipi di variabile e confronti:: Come alle variabili si assegna il tipo e
+                                l'effetto che questo ha sul confronto di
+                                numeri e stringhe con @samp{<}, etc.
+* Operatori booleani::          Combinare espressioni di confronto usando
+                                operatori booleani @samp{||} (``or''),
+                                @samp{&&} (``and'') e @samp{!} (``not'').
+* Espressioni condizionali::    Le espressioni condizionali scelgono una fra
+                                due sottoespressioni, a seconda del valore di
+                                una terza sottoespressione.
+@end menu
+
+@node Valori di verit@`a
+@subsection Vero e falso in @command{awk}
+@cindex valori di verit@`a
+@cindex logico, valore, vero/falso
+@cindex falso, valore logico (zero o stringa nulla)
+@cindex vero, valore logico (diverso da zero e da stringa nulla)
+
+@cindex nulle, stringhe
+Molti linguaggi di programmazione hanno una particolare rappresentazione per i
+concetti di ``vero'' e ``falso.''  Questi linguaggi usano normalmente le
+costanti speciali @code{true} e @code{false}, o forse i loro equivalenti
+maiuscoli.
+Per@`o @command{awk} @`e differente.
+Prende in prestito un concetto molto semplice di vero e falso dal linguaggio
+C.  In @command{awk}, ogni valore numerico diverso da zero @emph{oppure}
+ogni valore di stringa non vuota @`e vero.  Ogni altro valore (zero o la stringa
+nulla, @code{""}) @`e falso.  Il seguente programma stampa @samp{Uno strano
+valore di verit@`a} tre volte:
+
+@example
+BEGIN @{
+   if (3.1415927)
+       print "Uno strano valore di verit@`a"
+   if ("Ottanta e sette anni or sono")
+       print "Uno strano valore di verit@`a"
+   if (j = 57)
+       print "Uno strano valore di verit@`a"
+@}
+@end example
+
+@cindex angolo buio, @code{"0"} @`e effettivamente vero
+C'@`e una conseguenza sorprendente della regola ``non zero o non nullo'':
+la costante di stringa @code{"0"} sta effettivamente per vero, perch@'e
+@`e non nulla.
+@value{DARKCORNER}
+
+@node Tipi di variabile e confronti
+@subsection Tipi di variabile ed espressioni di confronto
+@quotation
+@i{La Guida galattica @`e infallibile. @`E la realt@`a, spesso, a essere inesatta.}
+@author Douglas Adams, @cite{Guida galattica per autostoppisti}
+@end quotation
+@c 2/2015: Antonio Colombo points out that this is really from
+@c The Restaurant at the End of the Universe. But I'm going to
+@c leave it alone.
+
+@cindex confronto, espressioni di
+@cindex espressioni di confronto
+@cindex espressioni, ricerca di corrispondenze, si veda espressioni di confronto
+@cindex individuazione, espressioni di, si veda espressioni di confronto
+@cindex relazionali, operatori, si veda espressioni di confronto
+@cindex operatori relazionali, si veda espressioni di confronto
+@cindex variabile, tipi di
+@cindex variabili, tipi di, espressioni di confronto e
+Diversamente che in altri linguaggi di programmazione, le variabili di
+@command{awk} non hanno un tipo fisso. Possono essere sia un numero che una
+stringa, a seconda del valore loro assegnato.
+Vediamo ora come viene assegnato il tipo a una variabile, e come @command{awk}
+le confronta.
+
+@menu
+* Tipi di variabile::           Tipo stringa rispetto a tipo numero.
+* Operatori di confronto::      Gli operatori di confronto.
+* Confronto POSIX di stringhe:: Confronto tra stringhe usando le
+                                regole POSIX.
+@end menu
+
+@node Tipi di variabile
+@subsubsection Tipo stringa rispetto a tipo numero
+
+Per gli elementi scalari in @command{awk} (variabili, elementi di
+vettore e campi), il tipo degli stessi viene attribuito @emph{dinamicamente}.
+Ci@`o significa che il tipo di un elemento pu@`o cambiare nel corso
+dell'esecuzione di un programma, da @dfn{untyped} (non ancora tipizzata),
+valore assunto prima che la variabile sia utilizzata,@footnote{@command{gawk}
+chiama queste variabili @dfn{unassigned} (non ancora assegnate), come si
+vede dall'esempio che segue.} a stringa oppure a numero, e in seguito
+da stringa a numero o da numero a stringa, nel prosieguo del programma.
+(@command{gawk} prevede anche degli scalari di tipo @dfn{regexp}, ma
+per ora possiamo ignorarli;
+@pxref{Costanti @dfn{regexp} forti}.)
+
+Non si pu@`o fare molto riguardo alle variabili di tipo @dfn{untyped},
+oltre a constatare che ancora non @`e stato loro attribuito un tipo.
+Il seguente programma confronta la variabile @code{a} con i valori
+@code{""} e @code{0}; il confronto d@`a esito positivo se alla
+variabile @code{a} non @`e mai stato assegnato un valore.
+L'esempio usa la funzione predefinita @code{typeof()}
+(non ancora trattata; @pxref{Funzioni per i tipi}) per
+visualizzare il tipo della variabile @code{a}:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print (a == "" && a == 0 ?}
+> @kbd{"a non ha un tipo" : "a ha un tipo!") ; print typeof(a) @}'}
+@print{} a non ha un tipo
+@print{} unassigned
+@end example
+
+Una variabile scalare diviene di tipo numerico quando le viene assegnato un
+valore numerico, per mezzo di una costante numerica, o tramite un'altra
+variabile scalare di tipo numerico:
+
+@example
+$ @kbd{gawk 'BEGIN @{ a = 42 ; print typeof(a)}
+> @kbd{b = a ; print typeof(b) @}'}
+number
+number
+@end example
+
+Analogamente, una variabile scalare diviene di tipo stringa quando le
+viene assegnato come valore una stringa, per mezzo di una costante stringa,
+o tramite un'altra variabile scalare di tipo stringa:
+
+@example
+$ @kbd{gawk 'BEGIN @{ a = "quarantadue" ; print typeof(a)}
+> @kbd{b = a ; print typeof(b) @}'}
+string
+string
+@end example
+
+Fin qui, tutto semplice e chiaro.  Cosa succede, per@`o, quando
+@command{awk} deve trattare dati forniti dall'utente?
+Il primo caso da considerare @`e quello dei campi di dati in input.
+Quale dovrebbe essere l'output del seguente programma?
+
+@example
+echo ciao | awk '@{ printf("%s %s < 42\n", $1,
+                           ($1 < 42 ? "@`e" : "non @`e")) @}'
+@end example
+
+@noindent
+Poich@'e @samp{ciao} @`e un dato di tipo alfabetico, @command{awk} pu@`o solo
+effettuare un confronto di tipo stringa.  Internamente, il numero @code{42}
+viene convertito in @code{"42"} e vengono confrontate le due stringhe di
+valore @code{"ciao"} e @code{"42"}.  Questo @`e il risultato:
+
+@example
+$ @kbd{echo ciao | awk '@{ printf("%s %s < 42\n", $1,}
+> @kbd{                           ($1 < 42 ? "@`e" : "non @`e")) @}'}
+@print{} ciao non @`e < 42
+@end example
+
+Tuttavia, cosa succede quando un dato utente @emph{assomiglia} a un
+numero?
+Da un lato, in realt@`a, il dato in input @`e formato da alcuni caratteri, non da
+valori numerici in formato binario.  Ma, d'altro lato, il dato sembra
+numerico, e @command{awk} dovrebbe davvero trattarlo come tale.  E in effetti
+questo @`e ci@`o che avviene:
+
+@example
+$ @kbd{echo 37 | awk '@{ printf("%s %s < 42\n", $1,}
+> @kbd{                           ($1 < 42 ? "@`e" : "non @`e")) @}'}
+@print{} 37 is < 42
+@end example
+
+Queste sono le regole seguite per determinare quando @command{awk}
+tratta dei dati in input come numeri, e quando li considera stringhe.
+
+@cindex numeriche, stringhe
+@cindex stringhe, numeriche
+@cindex POSIX @command{awk}, stringhe numeriche e
+Lo standard POSIX usa il concetto di @dfn{stringa numerica}, per dei dati
+in input che appaiono essere numerici.  Il @samp{37} nell'esempio precedente
+@`e una stringa numerica.  Quindi, qual @`e il tipo di una stringa numerica?
+Risposta: numerico.
+
+Il tipo di una variabile @`e importante perch@'e il tipo di due variabili
+determina il modo con cui le stesse vengono confrontate.
+La determinazione del tipo di variabile segue queste regole:
+
+@itemize @value{BULLET}
+@item
+Una costante numerica o il risultato di un'operazione numerica ha l'attributo
+@dfn{numeric}.
+
+@item
+Una costante di stringa o il risultato di un'operazione di stringa ha
+l'attributo @dfn{string}.
+
+@item
+Campi, input tramite @code{getline}, @code{FILENAME}, elementi di
+@code{ARGV}, elementi di @code{ENVIRON}, e gli elementi di un vettore
+creato da @code{match()}, @code{split()} e @code{patsplit()} che sono
+stringhe numeriche hanno l'attributo @dfn{strnum}.@footnote{Quindi, una
+stringa numerica POSIX e una variabile tipo @dfn{strnum} di @command{gawk}
+sono equivalenti.}
+Altrimenti, hanno l'attributo @dfn{string}.
+Anche le variabili non inizializzate hanno l'attributo @var{strnum}.
+
+@item
+Gli attributi si trasmettono attraverso gli assegnamenti ma non vengono
+cambiati da nessun uso.
+@c (Although a use may cause the entity to acquire an additional
+@c value such that it has both a numeric and string value, this leaves the
+@c attribute unchanged.)
+@c This is important but not relevant
+@end itemize
+
+L'ultima regola @`e particolarmente importante. Nel seguente programma,
+@code{a} @`e di tipo numerico, anche se viene usata in un secondo momento in
+un'operazione di stringa:
+
+@example
+BEGIN @{
+     a = 12.345
+     b = a " @`e un numero carino"
+     print b
+@}
+@end example
+
+Quando si confrontano due operandi, pu@`o essere usata sia il confronto come
+stringa che il confronto numerico, a seconda degli attributi degli operandi,
+secondo questa matrice simmetrica:
+
+@c thanks to Karl Berry, kb@cs.umb.edu, for major help with TeX tables
+@tex
+\centerline{
+\vbox{\bigskip % space above the table (about 1 linespace)
+% Because we have vertical rules, we can't let TeX insert interline space
+% in its usual way.
+\offinterlineskip
+%
+% Define the table template. & separates columns, and \cr ends the
+% template (and each row). # is replaced by the text of that entry on
+% each row. The template for the first column breaks down like this:
+%   \strut -- a way to make each line have the height and depth
+%             of a normal line of type, since we turned off interline spacing.
+%   \hfil -- infinite glue; has the effect of right-justifying in this case.
+%   #     -- replaced by the text (for instance, `STRNUM', in the last row).
+%   \quad -- about the width of an `M'. Just separates the columns.
+%
+% The second column (\vrule#) is what generates the vertical rule that
+% spans table rows.
+%
+% The doubled && before the next entry means `repeat the following
+% template as many times as necessary on each line' -- in our case, twice.
+%
+% The template itself, \quad#\hfil, left-justifies with a little space before.
+%
+\halign{\strut\hfil#\quad&\vrule#&&\quad#\hfil\cr
+	&&STRING	&NUMERIC	&STRNUM\cr
+% The \omit tells TeX to skip inserting the template for this column on
+% this particular row. In this case, we only want a little extra space
+% to separate the heading row from the rule below it.  the depth 2pt --
+% `\vrule depth 2pt' is that little space.
+\omit	&depth 2pt\cr
+% This is the horizontal rule below the heading. Since it has nothing to
+% do with the columns of the table, we use \noalign to get it in there.
+\noalign{\hrule}
+% Like above, this time a little more space.
+\omit	&depth 4pt\cr
+% The remaining rows have nothing special about them.
+STRING	&&string	&string		&string\cr
+NUMERIC	&&string	&numeric	&numeric\cr
+STRNUM  &&string	&numeric	&numeric\cr
+}}}
+@end tex
+@ifnottex
+@ifnotdocbook
+@verbatim
+        +----------------------------------------------
+        |       STRING          NUMERIC         STRNUM
+--------+----------------------------------------------
+        |
+STRING  |       string          string          string
+        |
+NUMERIC |       string          numeric         numeric
+        |
+STRNUM  |       string          numeric         numeric
+--------+----------------------------------------------
+@end verbatim
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<informaltable>
+<tgroup cols="4">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<colspec colname="3" align="left"/>
+<colspec colname="4" align="left"/>
+<thead>
+<row>
+<entry/>
+<entry>STRING</entry>
+<entry>NUMERIC</entry>
+<entry>STRNUM</entry>
+</row>
+</thead>
+
+<tbody>
+<row>
+<entry><emphasis role="bold">STRING</emphasis></entry>
+<entry>string</entry>
+<entry>string</entry>
+<entry>string</entry>
+</row>
+
+<row>
+<entry><emphasis role="bold">NUMERIC</emphasis></entry>
+<entry>string</entry>
+<entry>numeric</entry>
+<entry>numeric</entry>
+</row>
+
+<row>
+<entry><emphasis role="bold">STRNUM</emphasis></entry>
+<entry>string</entry>
+<entry>numeric</entry>
+<entry>numeric</entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+L'idea di base @`e che l'input dell'utente che appare come numerico---e
+@emph{solo} l'input dell'utente---dovrebbe essere trattato come numerico, anche
+se in realt@`a @`e un insieme di caratteri e quindi anche una stringa.
+Cos@`{@dotless{i}}, ad esempio, la costante di stringa @w{@code{" +3.14"}},
+quando appare nel codice sorgente di un programma,
+@`e una stringa---anche se sembra numerica---e non
+viene @emph{mai} trattato come numero
+ai fini di un confronto.
+
+In breve, quando un operando @`e una stringa ``pura'', come una costante di
+stringa, viene effettuato un confronto di stringa.  In caso contrario viene
+effettuato un confronto numerico.
+(La differenza principale tra un numero e uno @dfn{strnum} @`e che per gli
+@dfn{strnum} @command{gawk} conserva anche il valore originale della stringa
+che la variabile scalare aveva al momento in cui @`e stata letta.
+
+Questo punto merita di essere ulteriormente ribadito:
+l'input che appare essere un numero @emph{@`e} numerico.
+Tutto il resto dell'input @`e considerato essere una stringa.
+
+Cos@`{@dotless{i}}, la stringa in input di sei caratteri @w{@samp{ +3.14}}
+riceve l'attributo @dfn{strnum}. Al contrario, la stringa di sei caratteri
+@w{@code{" +3.14"}} che compaia nel testo di un programma rimane una
+costante di stringa.  I seguenti esempi stampano @samp{1} quando il confronto
+fra due diverse costanti @`e vero, altrimenti stampano @samp{0}:
+
+@c 22.9.2014: Tested with mawk and BWK awk, got same results.
+@example
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == " +3.14") @}'}    @ii{Vero}
+@print{} 1
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == "+3.14") @}'}     @ii{Falso}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == "3.14") @}'}      @ii{Falso}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($0 == 3.14) @}'}        @ii{Vero}
+@print{} 1
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == " +3.14") @}'}    @ii{Falso}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == "+3.14") @}'}     @ii{Vero}
+@print{} 1
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == "3.14") @}'}      @ii{Falso}
+@print{} 0
+$ @kbd{echo ' +3.14' | awk '@{ print($1 == 3.14) @}'}        @ii{Vero}
+@print{} 1
+@end example
+
+Per controllare il tipo di un campo in input (o di altro input immesso
+dall'utente, si pu@`o usare @code{typeof()}:
+
+@example
+$ @kbd{echo salve 37 | gawk '@{ print typeof($1), typeof($2) @}'}
+@print{} string strnum
+@end example
+
+@node Operatori di confronto
+@subsubsection Operatori di confronto
+
+Le @dfn{espressioni di confronto} confrontano stringhe o numeri per metterli in
+relazione tra di loro, come ad esempio nella relazione di uguaglianza.  Sono
+scritte usando @dfn{operatori di relazione}, che sono un superinsieme di quelli
+in C.  Sono descritti nella @ref{table-relational-ops}.
+
+@cindex @code{<} (parentesi acuta sinistra), operatore @code{<}
+@cindex parentesi acuta sinistra (@code{<}), operatore @code{<}
+@cindex @code{<} (parentesi acuta sinistra), operatore @code{<=}
+@cindex parentesi acuta sinistra (@code{<}), operatore @code{<=}
+@cindex @code{>} (parentesi acuta destra), operatore @code{>=}
+@cindex parentesi acuta destra (@code{>}), operatore @code{>=}
+@cindex @code{>} (parentesi acuta destra), operatore @code{>}
+@cindex parentesi acuta destra (@code{>}), operatore @code{>}
+@cindex @code{=} (uguale), operatore @code{==}
+@cindex uguale (@code{=}), operatore @code{==}
+@cindex @code{!} (punto esclamativo), operatore @code{!=}
+@cindex punto esclamativo (@code{!}), operatore @code{!=}
+@cindex @code{~} (tilde), operatore @code{~}
+@cindex tilde (@code{~}), operatore @code{~}
+@cindex @code{!} (punto esclamativo), operatore @code{!~}
+@cindex punto esclamativo (@code{!}), operatore @code{!~}
+@cindex @code{in}, operatore
+@float Tabella,table-relational-ops
+@caption{Operatori di relazione}
+@multitable @columnfractions .23 .77
+@headitem Espressione @tab Risultato
+@item @var{x} @code{<} @var{y} @tab Vero se @var{x} @`e minore di @var{y}
+@item @var{x} @code{<=} @var{y} @tab Vero se @var{x} @`e minore o uguale a @var{y}
+@item @var{x} @code{>} @var{y} @tab Vero se @var{x} @`e maggiore di @var{y}
+@item @var{x} @code{>=} @var{y} @tab Vero se @var{x} @`e maggiore o uguale a @var{y}
+@item @var{x} @code{==} @var{y} @tab Vero se @var{x} @`e uguale a @var{y}
+@item @var{x} @code{!=} @var{y} @tab Vero se @var{x} @`e diverso da @var{y}
+@item @var{x} @code{~} @var{y} @tab Vero se la stringa @var{x} corrisponde alla @dfn{regexp} rappresentata da @var{y}
+@item @var{x} @code{!~} @var{y} @tab Vero se la stringa @var{x} non corrisponde alla @dfn{regexp} rappresentata da @var{y}
+@item @var{indice} @code{in} @var{vettore} @tab Vero se il vettore @var{vettore} ha un elemento con indice @var{indice}
+@end multitable
+@end float
+
+Le espressioni di confronto valgono uno se sono vere e zero se false.
+Quando si confrontano operandi di tipi diversi, gli operandi numerici sono
+convertiti in stringhe usando il valore di @code{CONVFMT}
+(@pxref{Conversione}).
+
+Il confronto tra stringhe avviene
+confrontando il primo carattere di ciascuna stringa, poi il secondo carattere,
+e cos@`{@dotless{i}} via.  Quindi, @code{"10"} @`e minore di @code{"9"}.  Se vi sono due
+stringhe di cui una @`e il prefisso dell'altra, la stringa pi@`u corta @`e minore di
+quella pi@`u lunga.  Cos@`{@dotless{i}}, @code{"abc"} @`e minore di @code{"abcd"}.
+
+@cindex risoluzione di problemi, operatore @code{==}
+@cindex problemi, risoluzione di, operatore @code{==}
+@`E molto facile sbagliarsi scrivendo l'operatore @samp{==} e
+omettendo uno dei due caratteri @samp{=}.  Il risultato @`e sempre un codice
+@command{awk} valido, ma il programma non fa quel che si voleva:
+
+@example
+@group
+if (a = b)   # oops! dovrebbe essere == b
+   @dots{}
+else
+   @dots{}
+@end group
+@end example
+
+@noindent
+A meno che @code{b} non sia zero o la stringa nulla, la parte @code{if}
+del test ha sempre successo.  Poich@'e gli operatori sono molto simili,
+questo tipo di errore @`e molto difficile da individuare
+rileggendo il codice sorgente.
+
+Il seguente elenco di espressioni illustra il tipo di confronti
+che @command{awk} effettua e il risultato di ciascun confronto:
+
+@table @code
+@item 1.5 <= 2.0
+Confronto numerico (vero)
+
+@item "abc" >= "xyz"
+Confronto tra stringhe (falso)
+
+@item 1.5 != " +2"
+Confronto tra stringhe (vero)
+
+@item "1e2" < "3"
+Confronto tra stringhe (vero)
+
+@item a = 2; b = "2"
+@itemx a == b
+Confronto tra stringhe (vero)
+
+@item a = 2; b = " +2"
+@itemx a == b
+Confronto tra stringhe (falso)
+@end table
+
+In quest'esempio:
+
+@example
+$ @kbd{echo 1e2 3 | awk '@{ print ($1 < $2) ? "vero" : "falso" @}'}
+@print{} falso
+@end example
+
+@cindex espressioni di confronto, stringa vs.@: @dfn{regexp}
+@c @cindex string comparison vs.@: regexp comparison
+@c @cindex regexp comparison vs.@: string comparison
+@noindent
+il risultato @`e @samp{falso} perch@'e sia @code{$1} che @code{$2}
+sono immessi dall'utente.  Sono stringhe numeriche---quindi hanno entrambe
+l'attributo @dfn{strnum}, che richiede un confronto di tipo numerico.
+Lo scopo delle regole di confronto e dell'uso di stringhe numeriche @`e quello
+di cercare di produrre il comportamento "meno inaspettato possibile",
+pur "facendo la cosa giusta".
+
+I confronti di stringhe e i confronti di espressioni regolari sono molto
+diversi.  Per esempio:
+
+@example
+x == "att"
+@end example
+
+@noindent
+ha il valore uno, ossia @`e vero, se la variabile @code{x}
+@`e precisamente @samp{att}.  Al contrario:
+
+@example
+x ~ /att/
+@end example
+
+@noindent
+ha il valore uno se @code{x} contiene @samp{att}, come
+@code{"Oh, che matto che sono!"}.
+
+@cindex @code{~} (tilde), operatore @code{~}
+@cindex tilde (@code{~}), operatore @code{~}
+@cindex @code{!} (punto esclamativo), operatore @code{!~}
+@cindex punto esclamativo (@code{!}), operatore @code{!~}
+L'operando di destra degli operatori @samp{~} e @samp{!~} pu@`o essere sia una
+costante @dfn{regexp} (@code{/}@dots{}@code{/}) che un'espressione ordinaria.
+In quest'ultimo caso, il valore dell'espressione come stringa @`e usato come una
+@dfn{regexp} dinamica (@pxref{Uso di @dfn{regexp}}; e
+@pxref{Espressioni regolari calcolate}).
+
+@cindex @command{awk}, costanti @dfn{regexp} e
+@cindex costanti @dfn{regexp}
+@cindex @dfn{regexp}, costanti
+Un'espressione regolare costante tra due barre @`e di per s@'e anche
+un'espressione.  @code{/@var{regexp}/} @`e un'abbreviazione per la seguente
+espressione di confronto:
+
+@example
+$0 ~ /@var{regexp}/
+@end example
+
+Una particolare posizione dove @code{/pippo/} @emph{non} @`e un'abbreviazione di
+@samp{$0 ~ /pippo/} @`e quella in cui @`e l'operando di destra di @samp{~} o
+@samp{!~}.
+@xref{Usare le costanti @dfn{regexp}},
+dove questo punto @`e trattato in maggiore dettaglio.
+
+@node Confronto POSIX di stringhe
+@subsubsection Confronto tra stringhe usando l'ordine di collazione locale
+
+Lo standard POSIX diceva che il confronto di stringhe viene effettuato secondo
+l'@dfn{ordine di collazione} locale. Questo @`e l'ordine secondo il quale sono
+disposti i caratteri, come definito dalla localizzazione (per una trattazione
+pi@`u dettagliata, @pxref{Localizzazioni}).  Quest'ordine normalmente @`e molto
+diverso dal risultato ottenuto quando si esegue un confronto rigorosamente
+"carattere per carattere".@footnote{Tecnicamente, il confronto di stringhe
+dovrebbe funzionare come se le stringhe fossero confrontate usando la
+funzione @code{strcoll()} di C.}
+
+Poich@'e questo comportamento differisce sensibilmente dalla pratica corrente,
+@command{gawk} lo implementava solo quando eseguito in modalit@`a POSIX
+(@pxref{Opzioni}).
+Quest'esempio ilustra la differenza, in una localizzazione
+@code{en_US.UTF-8}:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf("ABC < abc = %s\n",}
+>                     @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
+@print{} ABC < abc = TRUE
+$ @kbd{gawk --posix 'BEGIN @{ printf("ABC < abc = %s\n",}
+>                             @kbd{("ABC" < "abc" ? "TRUE" : "FALSE")) @}'}
+@print{} ABC < abc = FALSE
+@end example
+Fortunatamente, dal mese di agosto 2016, un confronto basato sull'ordine
+di collazione locale non @`e pi@`u richiesto per gli operatori @code{==} e
+@code{!=}.@footnote{Si consulti il sito web
+@uref{http://austingroupbugs.net/view.php?id=1070,
+dell'Austin Group}.}  Tuttavia, un confronto basato sull'ordine di
+collazione locale @`e ancora richiesto per gli operatori @code{<},
+@code{<=}, @code{>} e @code{>=}.  POSIX, quindi, raccomanda quanto
+segue:
+
+@quotation
+Poich@'e l'operatore @code{==} controlla che se le stringhe sono identiche,
+e non se sono nell'ordine di collazione locale, le applicazioni che
+devono controllare se le stringhe sono nell'ordine di collazione locale
+possono usare:
+
+@example
+a <= b && a >= b
+@end example
+@end quotation
+
+A partire dalla @value{PVERSION} 4.2, @command{gawk} continua a usare
+l'ordine di collazione locale per @code{<}, @code{<=}, @code{>}
+e @code{>=} solo se eseguito nella modalit@`a POSIX.
+
+@ignore
+References: http://austingroupbugs.net/view.php?id=963
+and http://austingroupbugs.net/view.php?id=1070.
+@end ignore
+
+@node Operatori booleani
+@subsection Espressioni booleane
+@cindex @dfn{and}, operatore logico-booleano
+@cindex @dfn{or}, operatore logico-booleano
+@cindex @dfn{not}, operatore logico-booleano
+@cindex espressioni booleane
+@cindex booleane, espressioni
+@cindex operatori booleani, si veda espressioni booleane
+@cindex booleani, operatori, si veda espressioni booleane
+@cindex logici, operatori, si veda  espressioni booleane
+@cindex operatori logici, si veda espressioni booleane
+
+Un'@dfn{espressione booleana} @`e una combinazione di espressioni di confronto o
+espressioni di ricerca, che usa gli operatori booleani "or"
+(@samp{||}), "and" (@samp{&&}), e "not" (@samp{!}), facendo uso di
+parentesi per controllare le nidificazioni.  Il valore di verit@`a
+dell'espressione booleana @`e calcolato calcolando i valori di verit@`a delle
+espressioni componenti.  Le espressioni booleane sono conosciute anche come
+@dfn{espressioni logiche}.  I due termini sono equivalenti.
+
+Le espressioni booleane possono essere usate in tutti i casi in cui @`e possibile
+usare espressioni di confronto e di ricerca di corrispondenze.  Si possono
+usare nelle istruzioni @code{if}, @code{while}, @code{do} e @code{for}
+(@pxref{Istruzioni}).
+Hanno valori numerici (uno se vero, zero se falso) che entrano in gioco
+se il risultato di un'espressione booleana @`e memorizzato in una variabile o
+se @`e usato nei calcoli.
+
+Inoltre, ogni espressione booleana @`e anche un modello di ricerca valido, cos@`{@dotless{i}}
+se ne pu@`o usare uno come modello di ricerca per controllare l'esecuzione di
+regole.  Gli operatori booleani sono:
+
+@table @code
+@item @var{booleano1} && @var{booleano2}
+Vero se @var{booleano1} e @var{booleano2} sono entrambi veri.  Per esempio,
+la seguente istruzione stampa il record in input corrente se contiene
+sia @samp{edu} che @samp{li}:
+
+@example
+if ($0 ~ /edu/ && $0 ~ /li/) print
+@end example
+
+@cindex effetti collaterali, operatori booleani
+La sottoespressione @var{booleano2} viene valutata solo se @var{booleano1}
+@`e vero.  Questo pu@`o comportare una differenza laddove @var{booleano2} contenga
+espressioni che hanno effetti collaterali. Nel caso di @samp{$0 ~ /pippo/ &&
+($2 == pluto++)}, la variabile @code{pluto} non viene incrementata se non c'@`e
+nessuna sottostringa @samp{pippo} nel record.
+
+@item @var{booleano1} || @var{booleano2}
+Vero se almeno uno tra @var{booleano1} e @var{booleano2} @`e vero.
+Per esempio, la seguente istruzione stampa tutti i record dell'input che
+contengono @samp{edu} @emph{oppure}
+@samp{li}:
+
+@example
+if ($0 ~ /edu/ || $0 ~ /li/) print
+@end example
+
+La sottoespressione @var{booleano2} viene valutata solo se @var{booleano1}
+@`e falso.   Questo pu@`o comportare una differenza quando @var{booleano2} contiene
+espressioni che hanno effetti collaterali.
+(Perci@`o, questo confronto non individua mai i record che contengono sia
+@samp{edu} che @samp{li}: non appena @samp{edu} viene trovato,
+l'intero confronto @`e concluso positivamente.)
+
+@item ! @var{booleano}
+Vero se @var{booleano} @`e falso.  Per esempio,
+il seguente programma stampa @samp{nessuna home!} nel
+caso insolito che la variabile d'ambiente @env{HOME}
+non sia stata definita:
+
+@example
+BEGIN @{ if (! ("HOME" in ENVIRON))
+            print "nessuna home!" @}
+@end example
+
+(L'operatore @code{in} @`e descritto in
+@ref{Visitare elementi}.)
+@end table
+
+@cindex cortocircuito, operatori
+@cindex operatori di cortocircuito
+@cindex @code{&} (e commerciale), operatore @code{&&}
+@cindex e commerciale (@code{&}), operatore @code{&&}
+@cindex @code{|} (barra verticale), operatore @code{||}
+@cindex barra verticale (@code{|}), operatore @code{||}
+Gli operatori @samp{&&} e @samp{||} sono chiamati operatori di
+@dfn{cortocircuito} per il modo in cui funzionano.  La valutazione dell'intera
+espressione @`e  "cortocircuitata" se il risultato pu@`o gi@`a essere determinato
+prima di aver completato interamente la valutazione.
+
+@cindex continuazione di riga
+Le istruzioni che finiscono con @samp{&&} o @samp{||} si possono continuare
+semplicemente mettendo un ritorno a capo dopo di esse.  Per@`o non si pu@`o mettere
+un ritorno a capo @emph{prima} di questi operatori senza usare la
+continuazione tramite la barra inversa (@pxref{Istruzioni/Righe}).
+
+@cindex @code{!} (punto esclamativo), operatore @code{!}
+@cindex punto esclamativo (@code{!}), operatore @code{!}
+@cindex ritorno a capo
+@cindex variabili di tipo indicatore [@dfn{flag}]
+@cindex @dfn{flag} [indicatore], variabili
+Il valore reale di un'espressione che usa l'operatore @samp{!} @`e uno
+o zero, a seconda del valore di verit@`a dell'espressione a cui
+@`e applicato.
+L'operatore @samp{!} spesso @`e utile per cambiare il senso di una variabile
+indicatore [@dfn{flag}] da falso a vero e viceversa. Per esempio, il seguente
+programma @`e un modo per stampare righe poste tra due speciali righe
+delimitatrici:
+
+@example
+$1 == "START"   @{ pertinente = ! pertinente; next @}
+pertinente      @{ print @}
+$1 == "END"     @{ pertinente = ! pertinente; next @}
+@end example
+
+@noindent
+La variabile @code{pertinente}, cos@`{@dotless{i}} come tutte le variabili di @command{awk},
+@`e inizializzata a zero, che vale anche "falso".  Quando viene trovata
+una riga il cui primo campo @`e @samp{START}, il valore di @code{pertinente}
+viene commutato a vero, usando @samp{!}. La regola nella riga seguente stampa righe finch@'e
+@code{pertinente} resta vero.   Quando viene trovata una riga il cui primo
+campo @`e @samp{END}, @code{pertinente} viene nuovamente commutata a
+falso.@footnote{Questo programma ha un bug; stampa righe che iniziano con
+@samp{END}. Come si pu@`o risolvere?}
+
+@ignore
+Scott Deifik points out that this program isn't robust against
+bogus input data, but the point is to illustrate the use of `!',
+so we'll leave well enough alone.
+@end ignore
+
+Pi@`u comunemente, l'operatore @samp{!} viene usato nelle condizioni delle
+istruzioni @code{if} e @code{while}, dove ha pi@`u senso formulare espressioni
+logiche in negativo:
+
+@example
+if (! @var{qualche condizione} || @var{qualche altra condizione}) @{
+    @var{@dots{} fai un'operazione a piacere @dots{}}
+@}
+@end example
+
+@cindex @code{next}, istruzione
+@quotation NOTA
+L'istruzione @code{next} viene trattata in
+@ref{Istruzione next}.
+@code{next} dice ad @command{awk} di tralasciare il resto delle regole,
+leggere il record successivo, e iniziare a elaborare le regole partendo
+nuovamente dalla prima.
+Il motivo @`e quello di evitare di stampare le righe delimitatrici
+@samp{START} e @samp{END}.
+@end quotation
+
+@node Espressioni condizionali
+@subsection Espressioni condizionali
+@cindex condizionali, espressioni
+@cindex espressioni condizionali
+@cindex espressioni, selezionare
+
+Un'@dfn{espressione condizionale} @`e un tipo particolare di espressione che ha
+tre operandi.  Consente di usare il primo valore dell'espressione per
+scegliere una o l'altra delle due ulteriori espressioni.
+L'espressione condizionale in @command{awk} @`e la stessa di quella del
+linguaggio C, ovvero:
+
+@example
+@var{selettore} ? @var{espr-se-vero} : @var{espr-se-falso}
+@end example
+
+@noindent
+Ci sono tre sottoespressioni.  La prima, @var{selettore}, viene sempre
+calcolata per prima.  Se @`e "vera" (non zero o non nulla), viene poi calcolata
+@var{espr-se-vero} e il suo valore diventa il valore dell'intera espressione.
+Altrimenti, la seconda espressione che viene calcolata @`e @var{espr-se-falso}
+e il suo valore diventa il valore dell'intera espressione.
+Per esempio, la seguente espressione produce il valore assoluto di @code{x}:
+
+@example
+x >= 0 ? x : -x
+@end example
+
+@cindex effetti collaterali, espressioni condizionali
+Ogni volta che viene calcolata un'espressione condizionale, solo una delle
+espressioni @var{espr-se-vero} e @var{espr-se-falso} viene usata; l'altra
+@`e ignorata.  Questo @`e importante quando le espressioni hanno effetti
+collaterali.  Per esempio, quest'espressione condizionale esamina l'elemento
+@code{i} del vettore @code{a} o del vettore @code{b}, e incrementa @code{i}:
+
+@example
+x == y ? a[i++] : b[i++]
+@end example
+
+@noindent
+Questa istruzione garantisce che @code{i} sia incrementato una volta sola
+per ogni esecuzione dell'istruzione stessa, perch@'e ogni volta viene eseguita
+solo una delle due espressioni di incremento, mentre l'altra viene
+ignorata.
+@iftex
+@xrefil{Vettori},
+@end iftex
+@ifnottex
+@xref{Vettori},
+@end ifnottex
+per maggiori informazioni sui vettori.
+
+@cindex differenze tra @command{awk} e @command{gawk}, continuazione di riga
+@cindex continuazione di riga, @command{gawk}
+@cindex @command{gawk}, continuazione di riga in
+Come estensione minore di @command{gawk},
+un'istruzione che usa @samp{?:} si pu@`o continuare mettendo
+semplicemente un ritorno a capo dopo i due caratteri.
+Tuttavia, se si mette un ritorno a capo @emph{prima} dei due
+caratteri, la continuazione non funziona, se non si aggiunge anche la barra inversa
+(@pxref{Istruzioni/Righe}).
+Se viene specificata l'opzione @option{--posix}
+(@pxref{Opzioni}), quest'estensione @`e disabilitata.
+
+@node Chiamate di funzione
+@section Chiamate di funzione
+@cindex chiamata di funzione
+
+Una @dfn{funzione} @`e un nome per richiedere un particolare calcolo.
+Il nome permette di richiamare
+la funzione da qualsiasi punto del programma.
+Per esempio, la funzione @code{sqrt()} calcola la radice quadrata di un numero.
+
+@cindex funzioni predefinite
+Un certo numero di funzioni sono @dfn{predefinite}, ossia sono
+disponibili in ogni programma @command{awk}.  La funzione @code{sqrt()} @`e una
+di queste.  @xref{Funzioni predefinite} per un elenco di funzioni
+predefinite e per le loro rispettive descrizioni.  In aggiunta, l'utente pu@`o
+definire delle funzioni da usare nel proprio programma.
+@xref{Funzioni definite dall'utente}
+per istruzioni su come farlo.
+Infine, @command{gawk} permette di scrivere funzioni in C o in C++ che possono
+essere chiamate dal proprio programma (@pxref{Estensioni dinamiche}).
+
+@cindex argomenti, nelle chiamate di funzione
+Una funzione viene utilizzata invocandola tramite un'espressione di
+@dfn{chiamata di funzione}, che consiste nel nome della funzione seguito
+immediatamente da una lista di @dfn{argomenti} tra parentesi.  Gli argomenti
+sono espressioni che forniscono i materiali grezzi su cui opera la funzione.
+Quando ci sono pi@`u argomenti, questi sono separati da virgole.  Se
+non ci sono argomenti, basta scrivere @samp{()} dopo il nome della funzione.
+Gli esempi che seguono mostrano chiamate di funzione con e senza argomenti:
+
+@example
+sqrt(x^2 + y^2)        @ii{un argomento}
+atan2(y, x)            @ii{due argomenti}
+rand()                 @ii{nessun argomento}
+@end example
+
+@cindex risoluzione di problemi, sintassi della chiamata di funzione
+@cindex problemi, risoluzione di, sintassi della chiamata di funzione
+@quotation ATTENZIONE
+Non ci dev'essere nessuno spazio tra il nome della funzione e la parentesi
+aperta!  Un nome di funzione definita dall'utente pu@`o essere scambiata per
+il nome di una
+variabile: uno spazio renderebbe l'espressione simile alla concatenazione di
+una variabile con un'espressione racchiusa tra parentesi.
+Per le funzioni predefinite, lo spazio prima delle parentesi non crea problemi,
+ma @`e meglio non prendere l'abitudine di usare spazi per evitare errori con le
+funzioni definite dall'utente.
+@end quotation
+
+Ogni funzione richiede uno specifico numero di argomenti.
+Per esempio, la funzione @code{sqrt()} dev'essere chiamata con
+un solo argomento, il numero del quale si vuole estrarre la radice quadrata:
+
+@example
+sqrt(@var{argomento})
+@end example
+
+Alcune delle funzioni predefinite hanno uno o pi@`u argomenti opzionali.
+Se questi argomenti non vengono forniti, le funzioni
+usano un valore di default appropriato.
+@xref{Funzioni predefinite} per tutti i dettagli.  Se sono omessi argomenti
+in chiamate a funzioni definite dall'utente, tali argomenti sono considerati
+essere variabili locali. Il valore di tali variabili locali
+@`e  la stringa nulla se usate in un contesto che richiede una stringa
+di caratteri, e lo zero se @`e richiesto
+un valore numerico
+(@pxref{Funzioni definite dall'utente}).
+
+Come funzionalit@`a avanzata, @command{gawk} prevede la possibilit@`a di
+effettuare chiamate di funzione
+indirette, il che permette di scegliere la funzione da chiamare al momento
+dell'esecuzione, invece che nel momento in cui si scrive il codice sorgente
+del programma.
+Si rimanda la trattazione di questa funzionalit@`a
+a un secondo momento; si veda @ref{Chiamate indirette}.
+
+@cindex effetti collaterali, chiamate di funzione
+Come ogni altra espressione, la chiamata di funzione ha un valore, chiamato
+spesso @dfn{valore di ritorno}, che @`e calcolato dalla funzione
+in base agli argomenti dati.  In quest'esempio, il codice di ritorno
+di @samp{sqrt(@var{argomento})} @`e la radice quadrata di @var{argomento}.
+Il seguente programma legge numeri, un numero per riga, e stampa
+la radice quadrata di ciascuno:
+
+@example
+$ @kbd{awk '@{ print "La radice quadrata di", $1, "@`e", sqrt($1) @}'}
+@kbd{1}
+@print{} La radice quadrata di 1 @`e 1
+@kbd{3}
+@print{} La radice quadrata di 3 @`e 1.73205
+@kbd{5}
+@print{} La radice quadrata di 5 @`e 2.23607
+@kbd{Ctrl-d}
+@end example
+
+Una funzione pu@`o avere anche effetti collaterali, come assegnare
+valori a certe variabili o effettuare operazioni di I/O.
+Questo programma mostra come la funzione @code{match()}
+(@pxref{Funzioni per stringhe})
+cambia le variabili @code{RSTART} e @code{RLENGTH}:
+
+@example
+@{
+    if (match($1, $2))
+        print RSTART, RLENGTH
+    else
+        print "non uguali"
+@}
+@end example
+
+@noindent
+Qui vediamo un'esecuzione di esempio:
+
+@example
+$ @kbd{awk -f matchit.awk}
+@kbd{aaccdd  c+}
+@print{} 3 2
+@kbd{pippo     pluto}
+@print{} non uguali
+@kbd{abcdefg e}
+@print{} 5 1
+@end example
+
+@node Precedenza
+@section Precedenza degli operatori (Come si nidificano gli operatori)
+@cindex precedenza
+@cindex operatori, precedenza
+
+La @dfn{precedenza degli operatori} determina come gli operatori vengono
+raggruppati quando diversi operatori appaiono uno vicino all'altro in
+un'espressione.
+Per esempio, @samp{*} ha una precedenza pi@`u alta di @samp{+}; cos@`{@dotless{i}},
+@samp{a + b * c} moltiplica @code{b} e @code{c}, e poi aggiunge @code{a} al
+prodotto (ovvero esegue @samp{a + (b * c)}).
+
+La normale precedenza degli operatori pu@`o essere cambiata usando delle
+parentesi.  Si possono vedere le regole di precedenza come un modo per
+indicare dove si sarebbero dovute mettere delle parentesi.  Di fatto,
+@`e cosa saggia usare sempre le parentesi
+in presenza di una combinazione di operatori insolita, perch@'e altre persone
+che leggono il programma potrebbero non ricordare quale sia la precedenza
+in quel particolare caso.
+Anche dei programmatori esperti a volte dimenticano le regole esatte,
+il che porta a commettere errori.
+Usare esplicitamente le parentesi previene qualunque errore
+di questo tipo.
+
+Quando vengono usati insieme operatori con uguale precedenza, quello pi@`u a
+sinistra viene raggruppato per primo, ad eccezione degli operatori di
+assegnamento, condizionali e di elevamento a potenza, che vengono raggruppati
+nell'ordine opposto.
+Quindi, @samp{a - b + c} raggruppa come @samp{(a - b) + c} e
+@samp{a = b = c} raggruppa come @samp{a = (b = c)}.
+
+Normalmente la precedenza degli operatori unari di prefisso non ha importanza,
+perch@'e c'@`e un solo modo di interpretarli: prima il pi@`u interno.  Quindi,
+@samp{$++i} significa @samp{$(++i)} e
+@samp{++$x} significa @samp{++($x)}.  Tuttavia, quando un altro operatore segue
+l'operando, la precedenza degli operatori unari pu@`o avere importanza.
+@samp{$x^2} significa @samp{($x)^2}, ma @samp{-x^2} significa
+@samp{-(x^2)}, perch@'e @samp{-} ha precedenza pi@`u bassa rispetto a @samp{^},
+mentre @samp{$} ha precedenza pi@`u alta.
+Inoltre, gli operatori non possono essere combinati in modo tale da violare le
+regole di precedenza; per esempio, @samp{$$0++--} non @`e un'espressione valida
+perch@'e il primo @samp{$} ha precedenza pi@`u alta di
+@samp{++}; per evitare il problema l'espressione pu@`o essere scritta come
+@samp{$($0++)--}.
+
+Questa lista illustra gli operatori di @command{awk}, in ordine di precedenza
+dalla pi@`u alta alla pi@`u bassa:
+
+@c @asis for docbook to come out right
+@table @asis
+@item @code{(}@dots{}@code{)}
+Raggruppamento.
+
+@cindex @code{$} (dollaro), operatore di campo @code{$}
+@cindex dollaro (@code{$}), operatore di campo @code{$}
+@item @code{$}
+Riferimento a un campo.
+
+@cindex @code{+} (pi@`u), operatore @code{++}
+@cindex pi@`u (@code{+}), operatore @code{++}
+@cindex @code{-} (meno), operatore @code{--}
+@cindex meno (@code{-}), operatore @code{--}
+@item @code{++ --}
+Incremento, decremento.
+
+@cindex @code{^} (circonflesso), operatore @code{^}
+@cindex circonflesso (@code{^}), operatore @code{^}
+@cindex @code{*} (asterisco), operatore @code{**}
+@cindex asterisco (@code{*}), operatore @code{**}
+@item @code{^ **}
+Elevamento a potenza.  Questi operatori sono raggruppati da destra verso
+sinistra.
+
+@cindex @code{+} (pi@`u), operatore @code{+}
+@cindex pi@`u (@code{+}), operatore @code{+}
+@cindex @code{-} (meno), operatore @code{-}
+@cindex meno (@code{-}), operatore @code{-}
+@cindex @code{!} (punto esclamativo), operatore @code{!}
+@cindex punto esclamativo (@code{!}), operatore @code{!}
+@item @code{+ - !}
+Pi@`u, meno, ``not'' logico, unari.
+
+@cindex @code{*} (asterisco), operatore @code{*}, come operatore di moltiplicazione
+@cindex asterisco (@code{*}), operatore @code{*}, come operatore di moltiplicazione
+@cindex @code{/} (barra), operatore @code{/}
+@cindex barra (@code{/}), operatore @code{/}
+@cindex @code{%} (percento), operatore @code{%}
+@cindex percento (@code{%}), operatore @code{%}
+@item @code{* / %}
+Moltiplicazione, divisione, resto di una divisione.
+
+@cindex @code{+} (pi@`u), operatore @code{+}
+@cindex pi@`u (@code{+}), operatore @code{+}
+@cindex @code{-} (meno), operatore @code{-}
+@cindex meno (@code{-}), operatore @code{-}
+@item @code{+ -}
+Addizione, sottrazione.
+
+@item Concatenazione di stringhe
+Non c'@`e un simbolo speciale per la concatenazione.
+Gli operandi sono semplicemente scritti uno accanto all'altro.
+(@pxref{Concatenazione}).
+
+@cindex @code{<} (parentesi acuta sinistra), operatore @code{<}
+@cindex parentesi acuta sinistra (@code{<}), operatore @code{<}
+@cindex @code{<} (parentesi acuta sinistra), operatore @code{<=}
+@cindex parentesi acuta sinistra (@code{<}), operatore @code{<=}
+@cindex @code{>} (parentesi acuta destra), operatore @code{>=}
+@cindex parentesi acuta destra (@code{>}), operatore @code{>=}
+@cindex @code{>} (parentesi acuta destra), operatore @code{>}
+@cindex parentesi acuta destra (@code{>}), operatore @code{>}
+@cindex @code{=} (uguale), operatore @code{==}
+@cindex uguale (@code{=}), operatore @code{==}
+@cindex @code{!} (punto esclamativo), operatore @code{!=}
+@cindex punto esclamativo (@code{!}), operatore @code{!=}
+@cindex @code{>} (parentesi acuta destra), operatore @code{>>} (I/O)
+@cindex parentesi acuta destra (@code{>}), operatore @code{>>} (I/O)
+@cindex operatori, input/output
+@cindex @code{|} (barra verticale), operatore @code{|} (I/O)
+@cindex barra verticale (@code{|}), operatore @code{|} (I/O)
+@cindex operatori, input/output
+@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
+@cindex barra verticale (@code{|}), operatore @code{|&}  (I/O)
+@cindex operatori, input/output
+@item @code{< <= == != > >= >> | |&}
+Operatori relazionali e ridirezione.
+Gli operatori relazionali e le ridirezioni hanno lo stesso livello di
+precedenza.  I caratteri come @samp{>} servono sia come operatori relazionali
+che come ridirezioni; la distinzione tra i due significati dipende dal
+contesto.
+
+@cindex istruzione @code{print}, operatori I/O nell'
+@cindex istruzione @code{printf}, operatori I/O nell'
+Si noti che gli operatori di ridirezione I/O nelle istruzioni @code{print} e
+@code{printf} appartengono al livello dell'istruzione, non alle espressioni.
+La ridirezione non produce un'espressione che potrebbe essere l'operando di un
+altro operatore.  Di conseguenza, non ha senso usare un operatore di
+ridirezione vicino a un altro operatore con precedenza pi@`u bassa senza
+parentesi.  Tali combinazioni generano errori di sintassi
+(p.es., @samp{print pippo > a ? b : c}).
+Il modo corretto di scrivere quest'istruzione @`e @samp{print pippo > (a ? b : c)}.
+
+@cindex @code{~} (tilde), operatore @code{~}
+@cindex tilde (@code{~}), operatore @code{~}
+@cindex @code{!} (punto esclamativo), operatore @code{!~}
+@cindex punto esclamativo (@code{!}), operatore @code{!~}
+@item @code{~ !~}
+Corrispondenza, non corrispondenza.
+
+@cindex @code{in}, operatore
+@item @code{in}
+Appartenenza a un vettore.
+
+@cindex @code{&} (e commerciale), operatore @code{&&}
+@cindex e commerciale (@code{&}), operatore @code{&&}
+@item @code{&&}
+``and'' logico.
+
+@cindex @code{|} (barra verticale), operatore @code{||}
+@cindex barra verticale (@code{|}), operatore @code{||}
+@item @code{||}
+``or'' logico.
+
+@cindex @code{?} (punto interrogativo), operatore @code{?:}
+@cindex punto interrogativo (@code{?}), operatore @code{?:}
+@cindex @code{:} (due punti), operatore @code{?:}
+@cindex due punti (@code{:}), operatore @code{?:}
+@item @code{?:}
+Operatore condizionale.  Questo operatore raggruppa da destra verso sinistra.
+
+@cindex @code{+} (pi@`u), operatore @code{+=}
+@cindex pi@`u (@code{+}), operatore @code{+=}
+@cindex @code{-} (meno), operatore @code{-=}
+@cindex meno (@code{-}), operatore @code{-=}
+@cindex @code{*} (asterisco), operatore @code{*=}
+@cindex asterisco (@code{*}), operatore @code{*=}
+@cindex @code{*} (asterisco), operatore @code{**=}
+@cindex asterisco (@code{*}), operatore @code{**=}
+@cindex @code{/} (barra), operatore @code{/=}
+@cindex barra (@code{/}), operatore @code{/=}
+@cindex @code{%} (percento), operatore @code{%=}
+@cindex percento (@code{%}), operatore @code{%=}
+@cindex @code{^} (circonflesso), operatore @code{^=}
+@cindex circonflesso (@code{^}), operatore @code{^=}
+@item @code{= += -= *= /= %= ^= **=}
+Assegnamento.  Questi operatori raggruppano da destra verso sinistra.
+@end table
+
+@cindex POSIX @command{awk}, @code{**} e
+@cindex portabilit@`a, operatori, non in POSIX @command{awk}
+@quotation NOTA
+Gli operatori @samp{|&}, @samp{**} e @samp{**=} non sono definiti da POSIX.
+Per la massima portabilit@`a, @`e meglio non usarli.
+@end quotation
+
+@node Localizzazioni
+@section Il luogo fa la differenza
+@cindex localizzazione, definizione di
+
+I moderni sistemi prevedono la nozione di @dfn{localizzazione}: un modo per
+informare il sistema sulla serie di caratteri e sulla lingua locali.
+Lo standard ISO C definisce una localizzazione di default @code{"C"}, che @`e
+l'ambiente tipico a cui molti programmatori in C sono abituati.
+
+Un tempo, le impostazioni della localizzazione avevano influenza sulla
+ricerca di corrispondenze tramite @dfn{regexp}, ma ora non @`e pi@`u cos@`{@dotless{i}}
+(@pxref{Intervalli e localizzazione}).
+
+La localizzazione pu@`o influire sulla separazione dei record.  Per il caso
+normale di @samp{RS = "\n"}, la localizzazione @`e generalmente irrilevante.
+Per altri separatori di record di un solo carattere, impostare
+la variabile d'ambiente @samp{LC_ALL=C}
+garantisce una migliore efficienza nella lettura dei record.  Altrimenti,
+@command{gawk} dovrebbe fare diverse chiamate di funzione, @emph{per ogni
+carattere in input}, per determinare la fine del record.
+
+La localizzazione pu@`o influire sulla formattazione delle date e delle ore
+(@pxref{Funzioni di tempo}).  Per esempio, un modo comune per abbreviare la
+data 4 settembre 2015, negli Stati Uniti @`e ``9/4/15.''  In molti paesi
+dell'Europa, invece, l'abbreviazione @`e "4.9.15".  Quindi, la specifica di
+formato
+@code{%x} in una localizzazione @code{"US"} potrebbe produrre @samp{9/4/15},
+mentre in una localizzazione @code{"EUROPA"}, potrebbe produrre @samp{4.9.15}.
+
+Secondo  POSIX, anche il confronto tra stringhe @`e influenzato dalla
+localizzazione (come nelle espressioni regolari).  I dettagli sono descritti in
+@ref{Confronto POSIX di stringhe}.
+
+Infine, la localizzazione influenza il valore del separatore decimale
+usato quando @command{gawk} analizza i dati in input.  Questo @`e stato
+trattato nel dettaglio in @ref{Conversione}.
+
+@node Sommario delle espressioni
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+Le espressioni sono gli elementi base dei calcoli eseguiti nei programmi.
+Sono costruite a partire da costanti, variabili, chiamate di funzione e dalla
+combinazione di vari tipi di valori tramite operatori.
+
+@item
+@command{awk} fornisce tre tipi di costanti: numerica, di stringa e
+di @dfn{regexp}.  Le costanti numeriche in @command{gawk} si possono
+specificare nei sistemi ottale ed esadecimale (con base 8 e 16), e anche nel
+sistema decimale (base 10).  In alcuni contesti, una costante @dfn{regexp}
+isolata come @code{/pippo/} ha lo stesso significato di @samp{$0 ~ /pippo/}.
+
+@item
+Le variabili contengono valori che possono essere usati diverse volte nei
+calcoli. Un certo numero di variabili predefinite forniscono informazioni al
+programma @command{awk}, mentre altre permettono il controllo del comportamento
+di @command{awk}.
+
+@item
+I numeri sono automaticamente convertiti in stringhe, e le stringhe in numeri,
+a seconda delle necessit@`a di @command{awk}.  I valori numerici sono convertiti
+come se fossero formattati con @code{sprintf()} usando il formato contenuto in
+@code{CONVFMT}.  La localizzazione pu@`o influire sulle conversioni.
+
+@item
+In @command{awk} ci sono gli operatori aritmetici di uso comune (addizione,
+sottrazione, moltiplicazione, divisione, modulo), e il pi@`u e il meno unari.
+Ci sono anche operatori di confronto, operatori booleani, una verifica
+dell'esistenza di una chiave in
+un vettore, e operatori per la ricerca di corrispondenze con espressioni
+regolari.  La concatenazione di stringhe @`e effettuata mettendo due espressioni
+una vicino all'altra; non c'@`e nessun operatore esplicito.
+L'operatore con tre operandi @samp{?:} fornisce una verifica ``if-else''
+all'interno delle espressioni.
+
+@item
+Gli operatori di assegnamento forniscono delle comode forme brevi per le comuni
+operazioni aritmetiche.
+
+@item
+In @command{awk}, un valore @`e considerato vero se @`e diverso da zero
+@emph{oppure} non nullo. Altrimenti, il valore @`e falso.
+
+@item
+Il tipo di una variabile viene impostata a ogni assegnamento e pu@`o cambiare
+durante il suo ciclo di vita.  Il tipo determina il comportamento della
+variabile nei confronti (di tipo stringa o numerici).
+
+@item
+Le chiamate di funzione restituiscono un valore che pu@`o essere usato come parte
+di un'espressione pi@`u lunga.  Le espressioni usate per passare valori di
+parametro vengono valutate completamente prima di chiamare la funzione.
+@command{awk} fornisce funzioni predefinite e prevede quelle definite
+dall'utente; questo @`e descritto in
+@ref{Funzioni}.
+
+@item
+La precedenza degli operatori specifica l'ordine secondo il quale vengono
+effettuate le operazioni, a meno che quest'ordine non sia esplicitamente
+alterato
+tramite parentesi.  Le regole di precedenza degli operatori di @command{awk}
+sono compatibili con quelle del linguaggio C.
+
+@item
+La localizzazione pu@`o influire sul formato dei dati in uscita da un programma
+@command{awk}, e occasionalmente sul formato dei dati letti in input.
+
+@end itemize
+
+@node Criteri di ricerca e azioni
+@chapter Criteri di ricerca, azioni e variabili
+@cindex criteri di ricerca
+@cindex @dfn{pattern}, si veda criteri di ricerca
+@cindex espressione di ricerca
+
+Come gi@`a visto, ogni istruzione @command{awk} consiste di un criterio di
+ricerca [@dfn{pattern}] a cui @`e associata un'azione.  Questo @value{CHAPTER}
+descrive come specificare criteri e azioni, cosa @`e possibile
+fare tramite le azioni e quali sono le variabili predefinite in
+@command{awk}.
+
+Le regole @dfn{criterio di ricerca--azione} e le istruzioni che si possono
+dare all'interno delle azioni formano il nucleo centrale dei programmi
+scritti in @command{awk}.
+In un certo senso, tutto quanto si @`e visto finora costituisce le fondamenta
+sulle quali sono costruiti i programmi.  @`E giunto il momento di iniziare a
+costruire qualcosa di utile.
+
+@menu
+* Panoramica sui criteri di ricerca:: Come scrivere un criterio di ricerca.
+* Usare variabili di shell::   come usare variabili della shell in
+                                @command{awk}.
+* Panoramica sulle azioni::     Come scrivere un'azione.
+* Istruzioni::                  Descrizione dettagliata delle varie
+                                istruzioni di controllo.
+* Variabili predefinite::       Sommario delle variabili predefinite.
+* Sommario criteri e azioni::   Sommario di criteri di ricerca e azioni.
+@end menu
+
+@node Panoramica sui criteri di ricerca
+@section Elementi di un criterio di ricerca
+
+@menu
+* @dfn{regexp} come criteri di ricerca::  Usare espressioni regolari come
+                                          criteri di ricerca.
+* Espressioni come criteri di ricerca:: Qualsiasi espressione pu@`o servire da
+                                        criterio di ricerca.
+* Intervalli::                  Coppie di espressioni regolari per
+                                delimitare una ricerca.
+* BEGIN/END::                   Specificare regole di inizio e fine programma.
+* BEGINFILE/ENDFILE::           Due condizioni speciali per controlli avanzati.
+* Vuoto::                       Il criterio di ricerca vuoto, che
+                                corrisponde a ogni record.
+@end menu
+
+@cindex criteri di ricerca, tipi di
+I criteri di ricerca in @command{awk} controllano l'esecuzione di
+azioni: un'azione viene eseguita
+quando il criterio di ricerca associato ad essa @`e soddisfatto dal
+record in input corrente.
+La tabella seguente @`e un sommario dei tipi di criteri di ricerca in
+@command{awk}:
+
+@table @code
+@item /@var{espressione regolare}/
+Un'espressione regolare.  @`E verificata quando il testo di un
+record in input corrisponde all'espressione regolare.
+@iftex
+(@xrefIl{Espressioni regolari}.)
+@end iftex
+@ifnottex
+(@xref{Espressioni regolari}.)
+@end ifnottex
+
+@item @var{espressione}
+Una singola espressione.  @`E verificata quando il suo valore @`e
+diverso da zero (se di tipo numerico) o non nullo (se @`e una stringa).
+(@xref{Espressioni come criteri di ricerca}.)
+
+@item @var{inizio_interv}, @var{fine_interv}
+Una coppia di criteri di ricerca separati da una virgola, che specificano un
+@dfn{intervallo} di record.
+L'intervallo comprende sia il record iniziale che corrisponde a @var{inizio_interv}
+sia il record finale che corrisponde a @var{fine_interv}.
+(@xref{Intervalli}.)
+
+@item BEGIN
+@itemx END
+Criteri di ricerca speciali che consentono azioni di inizializzazione o
+di pulizia in un programma @command{awk}.
+(@xref{BEGIN/END}.)
+
+@item BEGINFILE
+@itemx ENDFILE
+Criteri di ricerca speciali che consentono azioni di inizializzazione o di
+pulizia da eseguire all'inizio o alla fine di ogni file in input.
+(@xref{BEGINFILE/ENDFILE}.)
+
+@item @var{vuoto}
+Il criterio di ricerca vuoto corrisponde a ciascun record in input.
+(@xref{Vuoto}.)
+@end table
+
+@node @dfn{regexp} come criteri di ricerca
+@subsection Espressioni regolari come criteri di ricerca
+@cindex criteri di ricerca, espressioni regolari come
+@cindex espressioni regolari, come criteri di ricerca
+
+Le espressioni regolari sono uno dei primi tipi di criteri di ricerca
+presentati in questo @value{DOCUMENT}.
+Questo tipo di criterio di ricerca @`e semplicemente una costante @dfn{regexp}
+posta nella parte @dfn{criterio di ricerca} di una regola.  Equivale a
+scrivere @samp{$0 ~ /@var{criterio di ricerca}/}.
+Il criterio di ricerca @`e verificato quando il record in input corrisponde
+alla @dfn{regexp}.
+Per esempio:
+
+@example
+/pippo|pluto|paperino/  @{ personaggi_Disney++ @}
+END            @{ print personaggi_Disney, "Personaggi Disney visti" @}
+@end example
+
+@node Espressioni come criteri di ricerca
+@subsection Espressioni come criteri di ricerca
+@cindex espressioni regolari, come criteri di ricerca
+@cindex criteri di ricerca, espressioni regolari come
+
+Qualsiasi espressione @command{awk} pu@`o essere usata come un criterio di
+ricerca @command{awk}.
+Il criterio di ricerca @`e verificato se il valore dell'espressione @`e diverso
+da zero (se @`e un numero), o non nullo (se @`e una stringa).
+L'espressione @`e ricalcolata ogni volta che la regola viene applicata a un
+nuovo record in input.  Se l'espressione usa campi come @code{$1}, il suo
+valore dipende direttamente dal contenuto del record in input appena letto;
+altrimenti, dipende solo da quel che @`e accaduto fino a quel momento durante
+l'esecuzione del programma @command{awk}.
+
+@cindex espressioni di confronto, come criteri di ricerca
+@cindex criteri di ricerca, espressioni di confronto come
+Le espressioni di confronto, che usano gli operatori di confronto descritti in
+@ref{Tipi di variabile e confronti},
+sono un tipo di criterio di ricerca usato frequentemente.
+Anche le @dfn{regexp}, verificate o non verificate, sono tipi di espressioni molto frequenti.
+L'operando a sinistra degli operatori @samp{~} e @samp{!~} @`e una stringa.
+L'operando di destra @`e un'espressione regolare costante delimitata da
+barre (@code{/@var{@dfn{regexp}}/}) o qualsiasi espressione il cui valore come
+stringa @`e usato come un'espressione regolare dinamica
+(@pxref{Espressioni regolari calcolate}).
+L'esempio seguente stampa il secondo campo di ogni record in input
+il cui primo campo sia esattamente @samp{li}:
+
+@cindex @code{/} (barra), criteri di ricerca e
+@cindex barra (@code{/}), criteri di ricerca e
+@cindex @code{~} (tilde), operatore @code{~}
+@cindex tilde (@code{~}), operatore @code{~}
+@cindex @code{!} (punto esclamativo), operatore @code{!~}
+@cindex punto esclamativo (@code{!}), operatore @code{!~}
+@example
+$ @kbd{awk '$1 == "li" @{ print $2 @}' mail-list}
+@end example
+
+@noindent
+(Il programma non stampa alcun output, perch@'e nessuna persona ha come nome esattamente @samp{li}.)
+Si veda la differenza con il seguente confronto di espressione regolare, che
+individua invece qualsiasi record il cui primo campo @emph{contenga} @samp{li}:
+
+@example
+$ @kbd{awk '$1 ~ /li/ @{ print $2 @}' mail-list}
+@print{} 555-5553
+@print{} 555-6699
+@end example
+
+@cindex @dfn{regexp}, costanti, come criteri di ricerca
+@cindex criteri di ricerca, costanti @dfn{regexp} come
+Una costante @dfn{regexp} usata come criterio di ricerca @`e anche un
+caso speciale di criterio di ricerca costituito da un'espressione.
+All'espressione @code{/li/} viene assegnato il valore uno se @samp{li}
+viene trovato nel record in input corrente. Quindi, come criterio di ricerca,
+@code{/li/} individua tutti i record che contengono la stringa @samp{li}.
+
+@cindex espressioni booleane, come criteri di ricerca
+@cindex criteri di ricerca, espressioni booleane come
+Anche le espressioni booleane sono frequentemente usate come criteri di
+ricerca.  Se un criterio di ricerca
+individua o no un record in input dipende dalla verifica delle
+sottoespressioni da cui @`e composto.
+Per esempio, il seguente comando stampa tutti i record in
+@file{mail-list} che contengono sia @samp{edu} che @samp{li}:
+
+@example
+$ @kbd{awk '/edu/ && /li/' mail-list}
+@print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+@end example
+
+Il seguente comando stampa tutti i record in
+@file{mail-list} che contengono @samp{edu} @emph{oppure} @samp{li}
+(o entrambi, naturalmente):
+
+@example
+$ @kbd{awk '/edu/ || /li/' mail-list}
+@print{} Amelia       555-5553     amelia.zodiacusque@@gmail.com    F
+@print{} Broderick    555-0542     broderick.aliquotiens@@yahoo.com R
+@print{} Fabius       555-1234     fabius.undevicesimus@@ucb.edu    F
+@print{} Julie        555-6699     julie.perscrutabor@@skeeve.com   F
+@print{} Samuel       555-3430     samuel.lanceolis@@shu.edu        A
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@end example
+
+Il seguente comando stampa tutti i record in
+@file{mail-list} che @emph{non} contengono la stringa @samp{li}:
+
+@example
+$ @kbd{awk '! /li/' mail-list}
+@print{} Anthony      555-3412     anthony.asserturo@@hotmail.com   A
+@print{} Becky        555-7685     becky.algebrarum@@gmail.com      A
+@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
+@group
+@print{} Martin       555-6480     martin.codicibus@@hotmail.com    A
+@print{} Jean-Paul    555-2127     jeanpaul.campanorum@@nyu.edu     R
+@end group
+@end example
+
+@cindex @code{BEGIN}, criterio di ricerca, criteri di ricerca booleani e
+@cindex @code{END}, criterio di ricerca, criteri di ricerca booleani e
+@cindex @code{BEGINFILE}, criterio di ricerca, criteri di ricerca booleani e
+@cindex @code{ENDFILE}, criterio di ricerca, criteri di ricerca booleani e
+Le sottoespressioni di un'operatore booleano in un criterio di ricerca possono
+essere espressioni regolari costanti, confronti, o qualsiasi altra espressione
+di @command{awk}.  Gli intervalli di ricerca
+non sono espressioni, e quindi non possono apparire all'interno di
+criteri di ricerca booleani.  Analogamente, i criteri di ricerca speciali
+@code{BEGIN}, @code{END}, @code{BEGINFILE} ed @code{ENDFILE},
+che non corrispondono ad alcun record in input, non sono espressioni e non
+possono essere usati all'interno di criteri di ricerca booleani.
+
+L'ordine di precedenza dei differenti operatori che possono essere usati nei
+criteri di ricerca @`e descritto in @ref{Precedenza}.
+
+@node Intervalli
+@subsection Specificare intervalli di record con i criteri di ricerca
+
+@cindex intervalli di ricerca
+@cindex criteri di ricerca, intervalli nei
+@cindex righe, individuare intervalli di
+@cindex @code{,} (virgola), negli intervalli di ricerca
+@cindex virgola (@code{,}), negli intervalli di ricerca
+Un @dfn{intervallo di ricerca} @`e composto da due criteri di ricerca
+separati da una virgola, nella forma
+@samp{@var{inizio_intervallo}, @var{fine_intervallo}}.  @`E usato per
+individuare
+una serie di record consecutivi nei file in input.  Il primo criterio di
+ricerca, @var{inizio_intervallo}, controlla dove inizia la serie di record,
+mentre @var{fine_intervallo} controlla dove finisce la serie stessa.
+L'esempio seguente:
+
+@example
+awk '$1 == "on", $1 == "off"' miofile
+@end example
+
+@noindent
+stampa ogni record in @file{miofile} incluso tra i due record che iniziano con
+@samp{on}/@samp{off}, estremi compresi.
+
+Un intervallo di ricerca inizia con la valutazione di
+@var{inizio_intervallo} per ogni record in input.  Quando un record soddisfa
+la condizione @var{inizio_intervallo}, l'intervallo di ricerca @`e
+@dfn{attivato} e l'intervallo di ricerca include anche quel
+record.  Finch@'e l'intervallo di ricerca rimane attivo,
+automaticamente vengono trovate corrispondenze in ogni record in input letto.
+L'intervallo di ricerca verifica anche @var{fine_intervallo} per ogni
+record in input; quando la verifica ha successo, il
+criterio di ricerca viene @dfn{disattivato} a partire dal record seguente.
+Quindi il criterio di ricerca torna a controllare
+@var{inizio_intervallo} per ogni nuovo record.
+
+@cindex @code{if}, istruzione, azioni@comma{} modificabili
+Il record che segnala l'inizio dell'intervallo
+di ricerca e quello che segnala la fine di quell'intervallo soddisfano
+@emph{entrambi} il criterio di ricerca.  Se non si vuole agire su tali record
+si possono scrivere istruzioni @code{if} nella parte @dfn{azione} della regola
+per distinguerli dai record che il programma @`e interessato a trattare.
+
+@`E possibile che un criterio di ricerca sia attivato e disattivato dallo
+stesso record.  Se il record soddisfa entrambe le condizioni, l'azione @`e
+eseguita solo su quel record.
+Per esempio, si supponga che ci sia un testo tra due separatori identici
+(p.es., il simbolo @samp{%}), ognuno dei quali sia su una riga a parte, che
+dovrebbero essere ignorati.  Un primo tentativo potrebbe essere quello di
+combinare un intervallo di ricerca che descrive il
+testo delimitato con l'istruzione
+@code{next}
+(non ancora introdotta, @pxref{Istruzione next}).
+Con quest'istruzione @command{awk} non effettua alcuna azione sul record
+corrente e inizia di nuovo a elaborare il successivo record in input.
+Un tale programma @`e simile a questo:
+
+@example
+/^%$/,/^%$/    @{ next @}
+               @{ print @}
+@end example
+
+@noindent
+@cindex righe, saltare tra delimitatori
+@c @cindex @dfn{flag} variables
+Questo programma non funziona, perch@'e l'intervallo di ricerca @`e sia attivato
+che disattivato dalla prima riga incontrata, quella costituita da un @samp{%}.
+Per ottenere l'effetto desiderato, si scriva il programma nella maniera che
+segue, utilizzando un @dfn{flag}:
+
+@cindex @code{!} (punto esclamativo), operatore @code{!}
+@cindex punto esclamativo (@code{!}), operatore @code{!}
+@example
+/^%$/     @{ ignora = ! ignora; next @}
+ignora == 1 @{ next @} # ignora righe quando `ignora' @`e impostato a 1
+@end example
+
+In un intervallo di ricerca, la virgola (@samp{,}) ha la
+precedenza pi@`u bassa tra tutti gli operatori (cio@`e, @`e l'ultima a essere
+valutata).  Il programma seguente tenta di combinare un intervallo di
+ricerca con un altro controllo, pi@`u semplice:
+
+@example
+echo Yes | awk '/1/,/2/ || /Yes/'
+@end example
+
+L'intenzione in questo programma @`e quello di esprimere le condizioni
+@samp{(/1/,/2/) || /Yes/}.
+Tuttavia, @command{awk} lo interpreta come se fosse
+@samp{/1/, (/2/ || /Yes/)}.
+Questo comportamento non pu@`o essere cambiato o evitato; gli intervalli di
+ricerca non si possono combinare con altri criteri di ricerca:
+
+@example
+$ @kbd{echo Yes | gawk '(/1/,/2/) || /Yes/'}
+@error{} gawk: riga com.:1: (/1/,/2/) || /Yes/
+@error{} gawk: riga com.:1:           ^ syntax error
+@end example
+
+@cindex intervalli di ricerca, continuazione di riga e
+@cindex angolo buio, intervalli di ricerca, continuazione di riga e
+Come punto di secondaria importanza, nonostante sia stilisticamente poco elegante,
+lo standard POSIX consente di andare a capo dopo la virgola
+in un intervallo di ricerca.  @value{DARKCORNER}
+@node BEGIN/END
+@subsection I criteri di ricerca speciali @code{BEGIN} ed @code{END}
+
+@cindex @code{BEGIN}, criterio di ricerca
+@cindex @code{END}, criterio di ricerca
+@cindex criterio di ricerca @code{END}
+Tutti i criteri di ricerca fin qui descritti servono a individuare dei record
+in input.
+I criteri di ricerca speciali @code{BEGIN} ed @code{END} non hanno questo scopo.
+Servono invece per effettuare azioni di inizializzazione o di pulizia nei
+programmi @command{awk}.
+Le regole @code{BEGIN} ed @code{END} devono prevedere azioni; non c'@`e
+un'azione di default per queste regole, perch@'e non c'@`e un record corrente
+quando sono invocate.
+Le regole @code{BEGIN} ed @code{END} sono spesso chiamate
+``blocchi @code{BEGIN} ed @code{END}'' da programmatori che usano @command{awk}
+da molto tempo.
+
+@menu
+* Usare BEGIN/END::             Come e perch@'e usare regole BEGIN/END.
+* I/O e BEGIN/END::             Problemi di I/O nelle regole BEGIN/END.
+@end menu
+
+@node Usare BEGIN/END
+@subsubsection Azioni di inizializzazione e pulizia
+
+@cindex @code{BEGIN}, criterio di ricerca
+@cindex criterio di ricerca @code{BEGIN}
+@cindex @code{END}, criterio di ricerca
+@cindex criterio di ricerca @code{END}
+Una regola @code{BEGIN} @`e eseguita solo una volta, prima che sia letto il
+primo record in input.  Analogamente, una regola @code{END} @`e eseguita
+solo una volta, dopo che tutto l'input @`e gi@`a stato letto.  Per esempio:
+
+@example
+$ @kbd{awk '}
+> @kbd{BEGIN @{ print "Analisi di \"li\"" @}}
+> @kbd{/li/  @{ ++n @}}
+> @kbd{END   @{ print "\"li\" @`e presente in", n, "record." @}' mail-list}
+@print{} Analisi di "li"
+@print{} "li" @`e presente in 4 record.
+@end example
+
+@cindex @code{BEGIN}, criterio di ricerca, operatori e
+@cindex @code{END}, criterio di ricerca, operatori e
+@cindex criterio di ricerca @code{END}, operatori e
+Questo programma trova il numero di record nel file in input
+@file{mail-list} che contengono la stringa @samp{li}.  La regola @code{BEGIN}
+stampa un titolo per il rapporto.  Non c'@`e bisogno di usare la regola
+@code{BEGIN} per inizializzare il contatore @code{n} a zero, poich@'e
+@command{awk} lo fa
+automaticamente (@pxref{Variabili}).
+La seconda regola incrementa la variabile @code{n} ogni volta che si legge
+un record che soddisfa il criterio di ricerca @samp{li}.  La regola @code{END}
+stampa il valore di @code{n} alla fine del programma.
+
+I criteri di ricerca speciali @code{BEGIN} ed @code{END} non possono essere
+usati negli intervalli,
+o con operatori booleani (in effetti, non possono essere combinati con nessun
+altro operatore).
+Un programma @command{awk} pu@`o avere molte regole @code{BEGIN} e/o @code{END}.
+Queste sono eseguite nell'ordine in cui compaiono nel programma: tutte le
+regole @code{BEGIN} a inizio programma e tutte le regole @code{END}
+a fine programma.
+Le regole @code{BEGIN} ed @code{END} possono apparire in qualsiasi
+posizione all'interno del programma.
+Questa funzionalit@`a @`e stata aggiunta nella versione 1987 di @command{awk} ed
+@`e inclusa nello standard POSIX.
+La versione originale (1978) di @command{awk} richiedeva che la regola
+@code{BEGIN} fosse posta all'inizio del programma, e la regola
+@code{END} alla fine del programma, e solo una regola per tipo era ammessa.
+Ci@`o non @`e pi@`u obbligatorio, ma @`e una buona idea continuare a seguire questo
+modello per migliorare l'organizzazione e la leggibilit@`a del programma.
+
+Regole multiple @code{BEGIN} ed @code{END} sono utili per scrivere funzioni
+di libreria, poich@'e ogni file di libreria pu@`o avere la sua propria regola
+@code{BEGIN} e/o @code{END} per fare la propria inizializzazione e/o pulizia.
+L'ordine in cui le funzioni di libreria sono menzionate nella riga dei comandi
+determina l'ordine in cui le rispettive regole @code{BEGIN} ed @code{END} sono
+eseguite.  Per questo motivi, occorre prestare attenzione nello scrivere tali
+regole nei file di libreria, in modo che non sia importante
+l'ordine in cui tali regole vengono eseguite.
+@xref{Opzioni} per maggiori informazioni sull'uso di funzioni di libreria.
+@iftex
+@xrefil{Funzioni di libreria},
+@end iftex
+@ifnottex
+@xref{Funzioni di libreria},
+@end ifnottex
+per parecchie utili funzioni di libreria.
+
+Se un programma @command{awk} ha solo regole @code{BEGIN} e nessun'altra
+regola, il programma esce dopo aver eseguito le regole
+@code{BEGIN}.@footnote{La versione originale di @command{awk} continuava a
+leggere e ignorare i record in input fino alla fine del file.}  Tuttavia, se
+una regola @code{END} esiste, l'intero input @`e letto, anche se non sono
+presenti altre regole nel programma.  Ci@`o viene fatto necessariamente
+per permettere che
+la regola @code{END} faccia uso  delle variabili @code{FNR} e @code{NR}.
+
+@node I/O e BEGIN/END
+@subsubsection Input/Output dalle regole @code{BEGIN} ed @code{END}
+
+@cindex input/output, dalle regole @code{BEGIN} ed @code{END}
+Ci sono parecchi punti (talora insidiosi) da tener presente se si fa dell'I/O
+all'interno di una regola @code{BEGIN} o @code{END}.
+Il primo ha a che fare con il valore di @code{$0} in una regola @code{BEGIN}.
+Poich@'e le regole @code{BEGIN} sono eseguite prima delle lettura di qualsiasi
+input, non c'@`e assolutamente alcun record in input, e quindi nessun campo,
+quando si eseguono delle regole @code{BEGIN}.  I riferimento a @code{$0} e ai
+campi restituiscono una stringa nulla o zero, a seconda del contesto.
+Un modo per assegnare un valore effettivo a @code{$0} @`e di eseguire un
+comando @code{getline} senza indicare una variabile (@pxref{Getline}).
+Un altro modo @`e semplicemente quello di assegnare un valore a @code{$0}.
+
+@cindex Brian Kernighan, @command{awk} di
+@cindex differenze tra @command{awk} e @command{gawk}, criteri di ricerca @code{BEGIN}/@code{END}
+@cindex POSIX @command{awk}, criteri di ricerca @code{BEGIN}/@code{END}
+@cindex @code{print}, istruzione, criteri di ricerca @code{BEGIN}/@code{END} e
+@cindex @code{BEGIN}, criterio di ricerca, istruzione @code{print} e
+@cindex @code{END}, criterio di ricerca, istruzione @code{print} e
+Il secondo punto @`e simile al primo, ma in direzione opposta.
+Tradizionalmente, pi@`u che altro per problemi di implementazione, @code{$0}
+e @code{NF} erano @emph{indefiniti} all'interno di una regola @code{END}.
+Lo standard POSIX prescrive che @code{NF} sia disponibile all'interno di una
+regola @code{END}.  Contiene il numero di campi dell'ultimo record in input.
+Probabilmente per una svista, lo standard non specifica che @`e reso
+disponibile anche @code{$0}, sebbene possa apparire logico che sia cos@`{@dotless{i}}.
+In effetti, BWK @command{awk}, @command{mawk} e @command{gawk} mantengono il
+valore di @code{$0} in modo che sia possibile usarlo all'interno delle regole
+@code{END}.  Occorre peraltro tener presente che alcune altre implementazioni
+e parecchie tra le versioni pi@`u vecchie di Unix @command{awk} non si
+comportano cos@`{@dotless{i}}.
+
+Il terzo punto @`e una conseguenza dei primi due.  Il significato di
+@samp{print}
+all'interno di una regola @code{BEGIN} o @code{END} @`e quello di sempre:
+@samp{print $0}.  Se @code{$0} @`e la stringa nulla, stampa una riga vuota.
+Molti programmatori di lungo corso di @command{awk} usano un semplice
+@samp{print} all'interno delle regole @code{BEGIN} ed @code{END},
+intendendo @samp{@w{print ""}}, contando sul fatto che @code{$0} sia una
+stringa nulla.  Sebbene questo funzioni solitamente con le regole
+@code{BEGIN}, @`e una pessima idea nelle regole @code{END},
+almeno in @command{gawk}.  @`E anche stilisticamente inelegante, perch@'e se
+serve una riga vuota in output, il programma dovrebbe stamparne
+una esplicitamente.
+
+@cindex @code{next}, istruzione, criteri di ricerca @code{BEGIN}/@code{END} e
+@cindex @code{nextfile}, istruzione, criteri di ricerca @code{BEGIN}/@code{END} e
+@cindex @code{BEGIN}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
+@cindex @code{END}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
+Per finire, le istruzioni @code{next} e @code{nextfile} non sono consentite
+all'interno di una regola @code{BEGIN}, perch@'e il ciclo implicito
+leggi-un-record-e-confrontalo-con-le-regole non @`e ancora iniziato.
+Analogamente, tali istruzioni non sono valide all'interno di una regola
+@code{END}, perch@'e tutto l'input @`e gi@`a stato letto.
+(@xref{Istruzione next} e
+@ifnotdocbook
+@pxref{Istruzione nextfile}.)
+@end ifnotdocbook
+@ifdocbook
+@ref{Istruzione nextfile}.)
+@end ifdocbook
+
+@node BEGINFILE/ENDFILE
+@subsection I criteri di ricerca speciali @code{BEGINFILE} ed @code{ENDFILE}
+@cindex @code{BEGINFILE}, criterio di ricerca
+@cindex @code{ENDFILE}, criterio di ricerca
+@cindex differenze tra @command{awk} e @command{gawk}, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE}
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+
+Due tipi speciali di criterio di ricerca, @code{BEGINFILE} ed @code{ENDFILE},
+forniscono
+degli ``agganci'' per intervenire durante il ciclo di elaborazione dei file
+specificati sulla riga di comando di @command{gawk}.
+Come con le regole @code{BEGIN} ed @code{END}
+@ifnottex
+@ifnotdocbook
+(@pxref{BEGIN/END}),
+@end ifnotdocbook
+@end ifnottex
+@iftex
+(si veda la @value{SECTION} precedente),
+@end iftex
+@ifdocbook
+(si veda la @value{SECTION} precedente),
+@end ifdocbook
+tutte le regole @code{BEGINFILE} in un programma sono riunite, mantenendole
+nell'ordine in cui sono lette da @command{gawk} e lo stesso viene fatto
+per tutte le regole @code{ENDFILE}.
+
+Il corpo delle regole @code{BEGINFILE} @`e eseguito subito prima che
+@command{gawk} legga il primo record da un file.  La variabile @code{FILENAME}
+@`e impostata al nome del file corrente e @code{FNR} @`e impostata a zero.
+
+La regola @code{BEGINFILE} d@`a la possibilit@`a di eseguire due compiti
+che sarebbe difficile o impossibile effettuare altrimenti:
+
+@itemize @value{BULLET}
+@item
+Si pu@`o verificare che il file sia leggibile.  Di solito, se un file presente
+nella riga dei comandi non pu@`o essere aperto in lettura, il programma
+@command{gawk} viene terminato.  Comunque, questo si pu@`o evitare, per poi
+passare a elaborare il file successivo specificato sulla riga dei comandi.
+
+@cindex @command{gawk}, variabile @code{ERRNO} in
+@cindex @code{ERRNO}, variabile, con criterio di ricerca @code{BEGINFILE}
+@cindex @code{nextfile}, istruzione, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE} e
+Questo controllo @`e fattibile controllando se la variabile @code{ERRNO} @`e
+diversa dalla stringa nulla; se @`e questo il caso, @command{gawk} non @`e
+riuscito ad aprire il file.  In questo caso il programma pu@`o eseguire
+un'istruzione @code{nextfile}
+(@pxref{Istruzione nextfile}).  In questo modo @command{gawk} salta
+completamente l'elaborazione di quel file.
+In caso contrario, @command{gawk} termina come al solito con un
+errore fatale.
+
+@item
+Se sono state scritte estensioni che modificano la gestione del record
+(tramite l'inserzione di un ``analizzatore di input'';
+@pxref{Analizzatori di input}), @`e possibile richiamarle
+a questo punto, prima che @command{gawk} inizi a elaborare il file.
+(Questa @`e una funzionalit@`a @emph{molto} avanzata, usata al momento solo dal
+@uref{https://sourceforge.net/projects/gawkextlib, progetto @code{gawkextlib}}.)
+@end itemize
+
+La regola @code{ENDFILE} @`e chiamata quando @command{gawk} ha finito di
+elaborare l'ultimo record di un file in input.  Per l'ultimo file in input,
+@`e chiamata prima di ogni regola @code{END}.
+La regola @code{ENDFILE} @`e eseguita anche per file in input vuoti.
+
+Normalmente, se si verifica un errore di lettura durante il normale
+ciclo di elaborazione dell'input,
+questo @`e considerato fatale (il programma termina).  Tuttavia, se @`e presente
+una regola @code{ENDFILE}, l'errore non @`e considerato fatale, ma viene
+impostato @code{ERRNO}.  Ci@`o permette di intercettare ed elaborare errori
+di I/O a livello di programma @command{awk}.
+
+@cindex @code{next}, istruzione, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE} e
+L'istruzione @code{next} (@pxref{Istruzione next}) non @`e permessa all'interno
+di una regola @code{BEGINFILE} o @code{ENDFILE}.  L'istruzione @code{nextfile}
+@`e consentita solo all'interno di una regola @code{BEGINFILE}, non all'interno
+di una regola @code{ENDFILE}.
+
+@cindex @code{getline}, comando, criteri di ricerca @code{BEGINFILE}/@code{ENDFILE} e
+L'istruzione @code{getline} (@pxref{Getline}) @`e limitata all'interno sia di
+@code{BEGINFILE} che di @code{ENDFILE}: solo le forme ridirette di
+di @code{getline} sono permesse.
+
+@code{BEGINFILE} ed @code{ENDFILE} sono estensioni @command{gawk}.
+In molte altre implementazioni di @command{awk} o se @command{gawk} @`e in
+modalit@`a compatibile (@pxref{Opzioni}), non sono regole speciali.
+
+@c FIXME: For 4.2 maybe deal with this?
+@ignore
+Date:     Tue, 17 May 2011 02:06:10 PDT
+From:     rankin@pactechdata.com (Pat Rankin)
+Message-Id: <110517015127.20240f4a@pactechdata.com>
+Subject:  BEGINFILE
+To:       arnold@skeeve.com
+
+     The documentation for BEGINFILE states that FNR is 0, which seems
+pretty obvious.  It doesn't mention what the value of $0 is, and that's
+not obvious.  I think setting it to null before starting the BEGINFILE
+action would be preferable to leaving whatever was there in the last
+record of the previous file.
+
+     ENDFILE can retain the last record in $0.  I guess it has to if
+the END rule's actions see that value too.  But the beginning of a new
+file doesn't just mean that the old one has been closed; the old file
+is being superseded, so leaving the old data around feels wrong to me.
+[If the user wants to keep it on hand, he or she can use an ENDFILE
+rule to grab it before moving on to the next file.]
+@end ignore
+
+@node Vuoto
+@subsection Il criterio di ricerca vuoto
+
+@cindex vuoto, criterio di ricerca
+@cindex criteri di ricerca vuoti
+Un criterio di ricerca vuoto (cio@`e omesso) corrisponde a
+@emph{ogni} record in input.  Per esempio, il programma:
+
+@example
+awk '@{ print $1 @}' mail-list
+@end example
+
+@noindent
+stampa il primo campo di ogni record.
+
+@node Usare variabili di shell
+@section Usare variabili di shell in programmi
+@cindex shell, variabili di
+@cindex programmi @command{awk}, variabili di shell in
+@c @cindex shell and @command{awk} interaction
+
+I programmi @command{awk} sono spesso usati come componenti di programmi pi@`u
+ampi, scritti in un linguaggio di shell.
+Per esempio, @`e molto comune usare una variabile di shell per
+specificare un criterio di ricerca che il programma @command{awk} deve poi
+individuare.
+Ci sono due modi per rendere disponibile il valore di una variabile di shell
+all'interno di un programma @command{awk}.
+
+@cindex shell, uso di doppio apice
+Un modo comune @`e quello di usare i doppi apici per sostituire il valore della
+variabile nel progamma @command{awk} contenuto nello @dfn{script}:
+
+Per esempio, si consideri il programma seguente:
+
+@example
+@group
+printf "Immettere il criterio di ricerca: "
+read criterio_di_ricerca
+awk "/$criterio_di_ricerca/ "'@{ num_trov++ @}
+     END @{ print num_trov, "occorrenze trovate" @}' /nome/file/dati
+@end group
+@end example
+
+@noindent
+Il programma @command{awk} consiste di due pezzi di testo tra apici
+che, concatenati insieme, formano il programma.
+La prima parte @`e tra doppi apici, per consentire la sostituzione della
+variabile di shell @code{criterio_di_ricerca} contenuta al loro interno.
+La seconda parte @`e racchiusa tra apici singoli.
+
+La sostituzione di variabile attraverso gli apici funziona, ma pu@`o
+facilmente generare difficolt@`a.  Richiede una buona comprensione delle
+regole per l'uso degli apici nella shell
+(@pxref{Protezione}),
+e spesso @`e difficile accoppiare i vari apici quando si legge il programma.
+
+Un metodo migliore @`e quello di usare la funzionalit@`a di assegnamento delle
+variabili di @command{awk}
+(@pxref{Opzioni di assegnamento})
+per assegnare il valore di una variabile di shell a una variabile
+di @command{awk}.
+Poi si possono usare @dfn{regexp} dinamiche come criterio di ricerca
+(@pxref{Espressioni regolari calcolate}).
+Quanto segue mostra come sarebbe l'esempio precedente usando questa tecnica:
+
+@example
+printf "Immettere il criterio di ricerca: "
+read criterio_di_ricerca
+awk -v crit="$criterio_di_ricerca" '$0 ~ crit @{ num_trov++ @}
+     END @{ print num_trov, "occorrenze trovate" @}' /nome/file/dati
+@end example
+
+@noindent
+Adesso il programma @command{awk} @`e solo una stringa tra apici semplici.
+L'assegnamento @samp{-v crit="$criterio_di_ricerca"} richiede ancora doppi
+apici, per il caso in cui uno spazio vuoto sia presente nel valore di
+@code{$criterio_di_ricerca}.
+La variabile @command{awk} @code{crit} potrebbe avere come nome anche
+@code{criterio_di_ricerca}, ma ci@`o potrebbe essere causa di confusione.
+Usare una variabile permette una maggiore flessibilit@`a, poich@'e la variabile
+pu@`o essere usata in ogni parte del
+programma---per stamparla, per indicizzare un vettore, o per qualsiasi altro
+scopo---senza che sia necessario l'artificio di doverla inserire usando gli
+apici.
+
+@node Panoramica sulle azioni
+@section Azioni
+@c @cindex action, definizione di
+@c @cindex curly braces
+@c @cindex action, curly braces
+@c @cindex action, separating statements
+@cindex azioni
+
+Un programma o @dfn{script} @command{awk} consiste in una serie di
+regole e definizioni di funzione frammiste tra loro.  (Le funzioni sono
+descritte pi@`u avanti.  @xref{Funzioni definite dall'utente}.)
+Una regola contiene un criterio di ricerca e un'azione; l'uno o l'altra
+(ma non tutt'e due) possono essere omessi.  Lo scopo di una @dfn{azione} @`e
+di specificare cosa deve fare @command{awk} quando si trova una corrispondenza
+con il criterio di ricerca.  Quindi, schematicamente, un programma
+@command{awk} @`e normalmente simile a questo:
+
+@display
+[@var{criterio di ricerca}]  @code{@{ @var{azione} @}}
+ @var{criterio di ricerca}  [@code{@{ @var{azione} @}}]
+@dots{}
+@code{function @var{nome}(@var{argomenti}) @{ @dots{} @}}
+@dots{}
+@end display
+
+@cindex @code{@{@}} (parentesi graffe), azioni e
+@cindex parentesi graffe (@code{@{@}}), azioni e
+@cindex separatori, per istruzioni in azioni
+@cindex a capo, separatore di istruzioni nelle azioni
+@cindex @code{;} (punto e virgola), separare istruzioni nelle azioni
+@cindex punto e virgola (@code{;}), separare istruzioni nelle azioni
+Un'azione consiste di una o pi@`u @dfn{istruzioni} @command{awk}, racchiuse
+fra parentesi graffe (@samp{@{@r{@dots{}}@}}).  Ogni istruzione specifica
+una cosa da fare.  Le istruzioni sono separate tra loro da dei ritorni a capo o
+da dei punti e virgola.
+Le parentesi graffe attorno a un'azione vanno usate anche se l'azione
+contiene una sola istruzione o se non contiene alcuna istruzione.
+Comunque, se si omette completamente l'azione, si possono omettere anche le
+parentesi graffe.  Un'azione omessa equivale a specificare
+@samp{@{ print $0 @}}:
+
+@example
+/pippo/  @{ @}     @ii{se si trova @code{pippo}, non fare nulla --- azione vuota}
+/pippo/          @ii{se si trova @code{pippo}, stampa il record --- azione omessa}
+@end example
+
+I seguenti tipi di istruzione sono disponibili in @command{awk}:
+
+@table @asis
+@cindex effetti collaterali delle istruzioni
+@cindex istruzioni, effetti collaterali delle
+@item Espressioni
+Servono per chiamare funzioni o assegnare valori a variabili
+@iftex
+(@pxrefil{Espressioni}).  L'esecuzione
+@end iftex
+@ifnottex
+(@pxref{Espressioni}).  L'esecuzione
+@end ifnottex
+di questo tipo di istruzione calcola semplicemente il valore dell'espressione.
+Ci@`o @`e utile quando l'espressione ha effetti collaterali
+(@pxref{Operatori di assegnamento}).
+
+@item Istruzioni di controllo
+Specificano il flusso di controllo dei programmi @command{awk}.
+Il linguaggio @command{awk} utilizza dei costrutti simili a quelli del C,
+(@code{if}, @code{for}, @code{while} e @code{do}), e anche alcune altre
+di tipo speciale (@pxref{Istruzioni}).
+
+@item Istruzioni composte
+Sono una o pi@`u istruzioni racchiuse tra parentesi graffe.  Un'istruzione
+composta
+@`e usata per riunire un gruppo di istruzioni all'interno di
+un'istruzione @code{if}, @code{while}, @code{do} o @code{for}.
+
+@item Istruzioni di input
+Usano il comando @code{getline}
+(@pxref{Getline}).
+In @command{awk} sono anche disponibili le istruzioni @code{next}
+(@pxref{Istruzione next})
+e @code{nextfile}
+(@pxref{Istruzione nextfile}).
+
+@item Istruzioni di output
+Come @code{print} e @code{printf}.
+@iftex
+@xrefIl{Stampare}.
+@end iftex
+@ifnottex
+@xref{Stampare}.
+@end ifnottex
+
+@item Istruzioni di cancellazione
+Per eliminare elementi di vettori.
+@xref{Cancellazione}.
+@end table
+
+@node Istruzioni
+@section Istruzioni di controllo nelle azioni
+@cindex istruzioni di controllo
+@cindex controllo, tramite istruzioni, in azioni
+@cindex azioni, istruzioni di controllo in
+
+Le @dfn{istruzioni di controllo}, come @code{if}, @code{while} e cos@`{@dotless{i}} via,
+regolano il flusso di esecuzione nei programmi @command{awk}.  Molte tra
+le istruzioni di controllo di @command{awk} sono modellate sulle
+corrispondenti istruzioni in C.
+@cindex istruzioni composte@comma{} istruzioni di controllo e
+@cindex composte, istruzioni@comma{} istruzioni di controllo e
+@cindex corpo, nelle azioni
+@cindex @code{@{@}} (parentesi graffe), istruzioni, raggruppare
+@cindex parentesi graffe (@code{@{@}}), istruzioni, raggruppare
+@cindex a capo, separatore di istruzioni nelle azioni
+@cindex @code{;} (punto e virgola), separare istruzioni nelle azioni
+@cindex punto e virgola (@code{;}), separare istruzioni nelle azioni
+Tutte le istruzioni di controllo iniziano con parole chiave speciali, come
+@code{if} e @code{while}, per distinguerle dalle semplici espressioni.
+Molte istruzioni di controllo contengono altre istruzioni.  Per esempio,
+l'istruzione @code{if} contiene un'altra istruzione che pu@`o essere eseguita
+oppure no.  Le istruzioni contenute sono chiamate @dfn{corpo}.
+Per includere pi@`u di un'istruzione nel corpo, queste vanno raggruppate
+in una sola @dfn{istruzione composta} tra parentesi graffe, e separate tra
+loro con dei ritorni a capo o dei punti e virgola.
+
+@menu
+* Istruzione if::               Eseguire in maniera condizionale
+                                istruzioni @command{awk}.
+* Istruzione while::            Eseguire il ciclo finch@'e @`e
+                                verificata una condizione.
+* Istruzione do::               Eseguire l'azione specificata, continuare
+                                a eseguire il ciclo
+                                finch@'e @`e verificata una condizione.
+* Istruzione for::              Un'altra istruzione iterativa, che
+                                permette di specificare clausole
+                                iniziali e di incremento.
+* Istruzione switch ::           Valutazione di quale insieme di
+                                 istruzioni eseguire, a seconda del
+                                 valore assunto da una variabile.
+* Istruzione break::             Uscire subito dal ciclo pi@`u interno
+                                 in cui ci si trova.
+* Istruzione continue::          Andare alla fine del ciclo pi@`u interno
+                                 in cui ci si trova.
+* Istruzione next::              Smettere di elaborare il record corrente.
+* Istruzione nextfile::          Smettere di elaborare il file corrente.
+* Istruzione exit::              Interrompere l'esecuzione di @command{awk}.
+@end menu
+
+@node Istruzione if
+@subsection L'istruzione @code{if}-@code{else}
+
+@cindex istruzione @code{if}
+@cindex @code{if}, istruzione
+L'istruzione @code{if}-@code{else} @`e quella che serve in @command{awk}
+per prendere decisioni.  @`E simile
+a questa:
+
+@display
+@code{if (@var{condizione}) @var{se-vera-fai}} [@code{else @var{se-falsa-fai}}]
+@end display
+
+@noindent
+La @var{condizione} @`e un'espressione che controlla quel che fa il resto
+dell'istruzione.  Se la @var{condizione} @`e vera, viene eseguita la
+parte @var{se-vera-fai}; altrimenti viene
+eseguita la parte @var{se-falsa-fai}.
+La parte @code{else} dell'istruzione @`e
+opzionale.  La condizione @`e considerata falsa se il suo valore @`e zero o
+la stringa nulla; altrimenti, la condizione @`e vera.
+Si consideri quanto segue:
+
+@example
+@group
+if (x % 2 == 0)
+    print "x @`e pari"
+else
+    print "x @`e dispari"
+@end group
+@end example
+
+In questo esempio, se l'espressione @samp{x % 2 == 0} @`e vera (cio@`e,
+se il valore di @code{x} @`e esattamente divisibile per due), allora viene
+eseguita la prima istruzione
+@code{print}; altrimenti, viene eseguita la seconda istruzione @code{print}.
+Se la parola chiave @code{else} sta sulla stessa riga di @var{se-vera-fai}
+e se @var{se-vera-fai} non @`e un'istruzione composta (cio@`e, non @`e racchiusa
+tra parentesi graffe), allora un punto e virgola deve separare
+@var{se-vera-fai} dalla parola chiave @code{else}.
+Per chiarire questo, l'esempio precedente si pu@`o riscrivere come:
+
+@example
+if (x % 2 == 0) print "x @`e pari"; else
+        print "x @`e dispari"
+@end example
+
+@noindent
+Se il @samp{;} @`e omesso, @command{awk} non pu@`o interpretare l'istruzione e
+segnala un errore di sintassi.  Non si dovrebbero scrivere programmi in
+questo modo, perch@'e a chi li legge potrebbe sfuggire la parola chiave
+@code{else} se non @`e la prima parola della riga.
+
+@node Istruzione while
+@subsection L'istruzione @code{while}
+@cindex @code{while}, istruzione
+@cindex istruzione @code{while}
+@cindex cicli
+@cindex cicli, @code{while}
+@cindex cicli, si veda anche @code{while}, istruzione
+
+Nella programmazione, un @dfn{ciclo} @`e una parte di un programma che pu@`o
+essere eseguita due o pi@`u volte consecutivamente.
+L'istruzione @code{while} @`e la pi@`u semplice istruzione iterativa in
+@command{awk}.  Esegue ripetutamente un'istruzione finch@'e una data
+condizione @`e vera.  Per esempio:
+
+@example
+while (@var{condizione})
+  @var{corpo-del-ciclo}
+@end example
+
+@cindex corpo, nei cicli
+@noindent
+@var{corpo-del-ciclo} @`e un'istruzione detta @dfn{corpo} del ciclo,
+e @var{condizione} @`e un'espressione che controlla per quante volte il ciclo
+deve continuare a essere ripetuto.
+La prima cosa che l'istruzione @code{while} fa @`e un controllo della
+@var{condizione}.
+Se la @var{condizione} @`e vera, viene eseguita l'istruzione
+@var{corpo-del-ciclo}.
+@ifinfo
+(La @var{condizione} @`e vera quando il suo valore
+@`e diverso da zero e non @`e la stringa nulla.)
+@end ifinfo
+Dopo che le istruzioni in @var{corpo-del-ciclo} sono state eseguite,
+@var{condizione} @`e controllata nuovamente, e se @`e ancora vera,
+@var{corpo-del-ciclo} viene eseguito ancora.  Questo processo @`e ripetuto
+finch@'e @var{condizione} rimane vera.  Se la @var{condizione} @`e falsa fin
+dall'inizio, il corpo del ciclo
+non viene eseguito per nulla, e @command{awk} continua con l'istruzione
+che viene dopo il ciclo.
+Questo esempio stampa i primi tre campi di ogni record in input, uno per
+riga:
+
+@example
+awk '
+@{
+    i = 1
+    while (i <= 3) @{
+        print $i
+        i++
+    @}
+@}' inventory-shipped
+@end example
+
+@noindent
+Il corpo di questo ciclo @`e un'istruzione composta racchiusa tra parentesi graffe,
+che contiene due istruzioni.
+Il ciclo funziona in questo modo: all'inizio, il valore di @code{i} @`e
+impostato a 1.
+Poi, l'istruzione @code{while} controlla se @code{i} @`e minore o uguale a
+tre.  Ci@`o @`e vero quando @code{i} @`e uguale a 1, quindi il campo
+@code{i}-esimo viene stampato.  Quindi l'istruzione @samp{i++} incrementa il
+valore di @code{i}
+e il ciclo viene ripetuto.  Il ciclo termina quando @code{i} assume il
+valore quattro.
+
+Un ritorno a capo non @`e richiesto tra la condizione e il corpo del ciclo;
+tuttavia, se lo si mette, il programma @`e di pi@`u facile comprensione,
+a meno che il corpo del ciclo non sia un'istruzione composta, oppure se @`e
+qualcosa di molto semplice.  Neppure il ritorno a capo dopo la parentesi graffa
+aperta che inizia l'istruzione composta @`e necessario, ma il
+programma @`e di lettura pi@`u difficile se lo si omette.
+
+@node Istruzione do
+@subsection L'istruzione @code{do}-@code{while}
+@cindex @code{do}-@code{while}
+@cindex cicli, @code{do}-@code{while}
+
+Il ciclo @code{do} @`e una variazione dell'istruzione di ciclo @code{while}.
+Il ciclo @code{do} esegue il @var{corpo-del-ciclo} una volta e poi ripete il
+@var{corpo-del-ciclo} finch@'e la @var{condizione} rimane vera.  @`E simile a questo:
+@example
+do
+  @var{corpo-del-ciclo}
+while (@var{condizione})
+@end example
+
+Anche se la @var{condizione} @`e falsa fin dall'inizio, il @var{corpo-del-ciclo}
+viene eseguito almeno una volta (e solo una volta, a meno che
+l'esecuzione di @var{corpo-del-ciclo}
+non renda vera la @var{condizione}).  Si confronti con il corrispondente
+@code{while}:
+
+@example
+while (@var{condizione})
+    @var{corpo-del-ciclo}
+@end example
+
+@noindent
+Quest'istruzione non esegue il @var{corpo-del-ciclo} neppure una volta, se
+la @var{condizione} @`e falsa fin dall'inizio.  Il seguente @`e un esempio di
+@code{do}:
+
+@example
+@{
+    i = 1
+    do @{
+        print $0
+        i++
+    @} while (i <= 10)
+@}
+@end example
+
+@noindent
+Questo programma stampa ogni record in input per 10 volte.  Non si tratta,
+peraltro, di un esempio molto realistico, perch@'e in questo caso un semplice
+@code{while} sarebbe sufficiente.  Questa osservazione riflette un'esperienza
+reale; solo occasionalmente @`e davvero necessario usare un @code{do}.
+
+@node Istruzione for
+@subsection L'istruzione @code{for}
+@cindex istruzione @code{for}
+@cindex @code{for}, istruzione
+@cindex cicli, @code{for}, iterativi
+
+L'istruzione @code{for} rende pi@`u agevole contare le iterazioni di un ciclo.
+La forma generale dell'istruzione @code{for} @`e simile a questa:
+
+@example
+for (@var{inizializzazione}; @var{condizione}; @var{incremento})
+  @var{corpo-del-ciclo}
+@end example
+
+@noindent
+La parti @var{inizializzazione}, @var{condizione} e @var{incremento} sono
+espressioni @command{awk} a piacere, e @var{corpo-del-ciclo} indica qualsiasi
+istruzione @command{awk}.
+
+L'istruzione @code{for} comincia con l'esecuzione di @var{inizializzazione}.
+Poi, finch@'e
+la @var{condizione} @`e vera, esegue ripetutamente @var{corpo-del-ciclo},
+e quindi @var{incremento}.  Tipicamente, @var{inizializzazione} imposta una
+variabile a zero o a uno, @var{incremento} aggiunge uno alla stessa e
+@var{condizione} ne confronta il valore rispetto al numero desiderato di
+iterazioni.
+Per esempio:
+
+@example
+awk '
+@{
+    for (i = 1; i <= 3; i++)
+        print $i
+@}' inventory-shipped
+@end example
+
+@noindent
+Questo programma stampa i primi tre campi di ogni record in input,
+mettendo un unico campo in una riga in output.
+
+Non @`e possibile impostare
+pi@`u di una variabile nella parte di
+@var{inizializzazione} senza usare un'istruzione di assegnamento multiplo,
+come @samp{x = y = 0}. Ci@`o ha senso solo se tutti i valori iniziali
+sono uguali.  (Ma @`e possibile inizializzare ulteriori variabili scrivendo
+i relativi assegnamenti come istruzioni separate @emph{prima} del ciclo
+@code{for}.)
+
+@c @cindex comma operator, not supported
+Lo stesso vale per la parte @var{incremento}. Se serve incrementare ulteriori
+variabili, questo va fatto con istruzioni separate alla fine del ciclo.
+L'espressione composta del linguaggio C, che usa l'operatore virgola [,]
+del C, sarebbe
+utile in questo contesto, ma non @`e
+prevista in @command{awk}.
+
+Molto spesso, @var{incremento} @`e un'espressione di incremento, come
+nell'esempio precedente.  Ma questo non @`e obbligatorio; pu@`o trattarsi di
+un'espressione qualsiasi.  Per esempio,
+la seguente istruzione stampa tutte le potenze di due comprese
+tra 1 e 100:
+
+@example
+for (i = 1; i <= 100; i *= 2)
+    print i
+@end example
+
+Se non @`e necessaria, ognuna delle tre espressioni fra
+parentesi che segue la parola chiave @code{for} pu@`o essere omessa.  Quindi,
+@w{@samp{for (; x > 0;)}} equivale a @w{@samp{while (x > 0)}}.  Se la
+@var{condizione} @`e omessa del tutto, @`e ritenuta sempre vera, producendo
+un @dfn{ciclo infinito} (cio@`e, un ciclo che non finisce mai).
+
+Molto spesso, un ciclo @code{for} @`e un'abbreviazione per un ciclo @code{while},
+come si pu@`o vedere qui:
+
+@example
+@var{inizializzazione}
+while (@var{condizione}) @{
+  @var{corpo-del-ciclo}
+  @var{incremento}
+@}
+@end example
+
+@cindex cicli, istruzione @code{continue} e
+@noindent
+La sola eccezione @`e quando l'istruzione @code{continue}
+(@pxref{Istruzione continue}) @`e usata
+all'interno del ciclo.  Se si modifica un'istruzione @code{for}
+sostituendola con un'istruzione @code{while}
+ci@`o pu@`o cambiare l'effetto dell'istruzione @code{continue} posta all'interno
+del ciclo.
+
+Il linguaggio @command{awk} ha un'istruzione @code{for} oltre all'istruzione
+@code{while} perch@'e un ciclo @code{for} @`e spesso pi@`u semplice da scrivere,
+e viene in mente pi@`u naturalmente.
+Contare il numero di iterazioni @`e
+molto frequente nei cicli.  Pu@`o essere pi@`u facile pensare a questo conto come
+parte del ciclo, piuttosto che come qualcosa da fare all'interno del ciclo.
+
+@cindex @code{in}, operatore
+@cindex operatore @code{in}
+Esiste una versione alternativa al ciclo @code{for}, per esaminare tutti
+gli indici di un vettore:
+
+@example
+for (i in vettore)
+    @var{fai qualcosa con} vettore[i]
+@end example
+
+@noindent
+@xref{Visitare un intero vettore}
+per maggiori informazioni su questa versione del ciclo @code{for}.
+
+@node Istruzione switch
+@subsection L'istruzione @code{switch}
+@cindex @code{switch}, istruzione
+@cindex @code{case}, parola chiave
+@cindex parola chiave @code{case}
+@cindex @code{default}, parola chiave
+@cindex parola chiave @code{default}
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+Se @command{gawk} @`e in modalit@`a compatibile (@pxref{Opzioni}),
+la funzionalit@`a non @`e disponibile.
+
+L'istruzione @code{switch} consente di valutare un'espressione e di
+eseguire istruzioni se il valore trovato corrisponde a uno dei @code{case} [casi] previsti.
+Le istruzioni @code{case} sono esaminate per cercare una corrispondenza
+nell'ordine in cui i casi sono definiti nel programma.  Se nessuno dei @code{case}
+corrisponde al valore dell'espressione, viene eseguita la sezione
+@code{default}, se @`e stata specificata.
+
+Ogni @code{case} contiene una singola costante, che pu@`o essere un numero,
+una stringa, o
+una @dfn{regexp}.  Viene valutata l'espressione @code{switch}, e poi la
+costante di ogni @code{case} viene confrontata
+di volta in volta con il valore risultante.
+Il tipo di costante determina quale sar@`a il confronto: per i tipi numerici o
+stringa si seguono le regole abituali.  Per una costante @dfn{regexp} viene
+effettuato un confronto tra l'espressione e il valore di tipo stringa
+dell'espressione originale.
+Il formato generale dell'istruzione @code{switch} @`e simile a questo:
+
+@example
+switch (@var{espressione}) @{
+case @var{valore o espressione regolare}:
+    @var{corpo-del-caso}
+default:
+    @var{corpo-del-default}
+@}
+@end example
+
+Il flusso di controllo
+dell'istruzione @code{switch} funziona come per il linguaggio C.  Una volta
+stabilita una corrispondenza con un dato caso, le istruzione che formano il
+corpo del caso sono eseguite, fino a che non venga trovata un'istruzione
+@code{break},
+@code{continue}, @code{next}, @code{nextfile} o @code{exit},
+o fino alla fine dell'istruzione @code{switch} medesima. Per esempio:
+
+@example
+while ((c = getopt(ARGC, ARGV, "aksx")) != -1) @{
+    switch (c) @{
+    case "a":
+        # stampa la dimensione di tutti i file
+        all_files = TRUE;
+        break
+    case "k":
+        BLOCK_SIZE = 1024       # in blocchi da 1 Kbyte
+        break
+    case "s":
+        # fa solo le somme
+        sum_only = TRUE
+        break
+    case "x":
+        # non esce dal filesystem
+        fts_flags = or(fts_flags, FTS_XDEV)
+        break
+    case "?":
+    default:
+        uso()
+        break
+    @}
+@}
+@end example
+
+Si noti che se nessuna delle istruzioni specificate qui arresta l'esecuzione
+di un'istruzione @code{case} per la quale @`e stata trovata una corrispondenza;
+l'esecuzione continua fino al successivo @code{case} finch@'e
+non viene interrotta. In questo esempio, il
+@code{case} per @code{"?"} esegue quello di @code{default}, che consiste nel
+chiamare una funzione di nome @code{uso()}.
+(La funzione @code{getopt()} qui chiamata @`e descritta in
+@ref{Funzione getopt}.)
+
+@node Istruzione break
+@subsection L'istruzione @code{break}
+@cindex @code{break}, istruzione
+@cindex istruzione @code{break}
+@cindex cicli, uscita
+@cindex cicli, istruzione @code{break} e
+
+L'istruzione @code{break} esce dal ciclo pi@`u interno @code{for},
+@code{while} o @code{do} dentro al quale si trova.  L'esempio seguente
+trova, se esiste, il divisore pi@`u piccolo di un dato numero intero, oppure
+dichiara che si tratta di un numero primo:
+
+@example
+@group
+# trova il divisore pi@`u piccolo di num
+@{
+    num = $1
+    for (divisore = 2; divisore * divisore <= num; divisore++) @{
+        if (num % divisore == 0)
+            break
+    @}
+@end group
+@group
+    if (num % divisore == 0)
+        printf "Il pi@`u piccolo divisore di %d @`e %d\n", num, divisore
+    else
+        printf "%d @`e un numero primo\n", num
+@}
+@end group
+@end example
+
+Quando il resto della divisione @`e zero nella prima istruzione @code{if},
+@command{awk} immediatamente esce, a causa del @dfn{break}, dal ciclo
+@code{for} in cui @`e contenuto.  Ci@`o vuol dire
+che @command{awk} prosegue immediatamente fino all'istruzione che viene dopo
+il ciclo, e continua l'elaborazione.  (L'istruzione @code{break} @`e molto
+differente dall'istruzione @code{exit},
+la quale termina l'intero programma @command{awk}.
+@xref{Istruzione exit}.)
+
+Il seguente programma mostra come la @var{condizione} di un'istruzione
+@code{for} o @code{while} potrebbe essere sostituita da un'istruzione
+@code{break} all'interno di un @code{if}:
+
+@example
+# trova il divisore pi@`u piccolo di num
+@{
+    num = $1
+    for (divisore = 2; ; divisore++) @{
+        if (num % divisore == 0) @{
+            printf "Il pi@`u piccolo divisore di %d @`e %d\n", num, divisore
+            break
+        @}
+        if (divisore * divisore > num) @{
+            printf "%d @`e un numero primo\n", num
+            break
+        @}
+    @}
+@}
+@end example
+
+L'istruzione @code{break} @`e usata anche per terminare l'esecuzione di
+un'istruzione @code{switch}.
+Questo argomento @`e trattato in @ref{Istruzione switch}.
+
+@c @cindex @code{break}, outside of loops
+@c @cindex historical features
+@c @cindex @command{awk} language, POSIX version
+@cindex POSIX @command{awk}, @code{break} e
+@cindex angolo buio, istruzione @code{break}
+@cindex @command{gawk}, istruzione @code{break} in
+@cindex Brian Kernighan, @command{awk} di
+L'istruzione @code{break} non ha significato se
+usata fuori dal corpo di un ciclo o di un'istruzione @code{switch}.
+Tuttavia, anche se la cosa non @`e mai stata documentata,
+le prime implementazioni di @command{awk} consideravano l'istruzione @code{break}
+esterna a un ciclo come un'istruzione @code{next}
+(@pxref{Istruzione next}).
+@value{DARKCORNER}
+Versioni recenti di BWK @command{awk} non consentono pi@`u un tale uso,
+e lo stesso fa @command{gawk}.
+
+@node Istruzione continue
+@subsection L'istruzione @code{continue}
+
+@cindex @code{continue}, istruzione
+@cindex istruzione @code{continue}
+Analogamente a @code{break}, l'istruzione @code{continue} @`e usata solo
+all'interno di cicli @code{for}, @code{while} e @code{do}.  L'istruzione
+ignora il resto del corpo del ciclo, facendo s@`{@dotless{i}} che la successiva iterazione
+del ciclo inizi immediatamente.  Questo comportamento @`e differente da quello
+di @code{break}, che esce completamente dal ciclo.
+
+L'istruzione @code{continue} in un ciclo @code{for} fa s@`{@dotless{i}} che @command{awk}
+ignori il resto del corpo del ciclo e prosegua l'esecuzione con l'espressione
+@var{incremento} dell'istruzione @code{for}.  Il seguente programma
+@`e un esempio di ci@`o:
+
+@example
+BEGIN @{
+     for (x = 0; x <= 20; x++) @{
+         if (x == 5)
+             continue
+         printf "%d ", x
+     @}
+     print ""
+@}
+@end example
+
+@noindent
+Questo programma stampa tutti i numeri da 0 a 20---tranne il 5, in cui
+l'istruzione @code{printf} @`e saltata.  Siccome l'incremento @samp{x++}
+non viene saltato, @code{x} non rimane fermo al valore 5.  Si confronti il ciclo
+@code{for} dell'esempio precedente con il seguente ciclo @code{while}:
+
+@example
+BEGIN @{
+     x = 0
+     while (x <= 20) @{
+         if (x == 5)
+             continue
+         printf "%d ", x
+         x++
+     @}
+     print ""
+@}
+@end example
+
+@noindent
+Questo programma inizia un ciclo infinito dopo che @code{x} ha assunto il
+valore 5, poich@'e l'istruzione di incremento (@samp{x++}) non @`e mai raggiunta.
+
+@c @cindex @code{continue}, fuori da un ciclo
+@c @cindex funzionalit@`a del passato
+@c @cindex linguaggio @command{awk}, versione POSIX
+@cindex POSIX @command{awk}, istruzione @code{continue} e
+@cindex angolo buio, istruzione @code{continue}
+@cindex @command{gawk}, istruzione @code{continue} in
+@cindex Brian Kernighan, @command{awk} di
+L'istruzione @code{continue} non ha un significato speciale se appare in
+un'istruzione @code{switch}, e non ha alcun significato se usata fuori dal
+corpo di un ciclo.  Le prime versioni di @command{awk} trattavano le
+istruzioni @code{continue} che erano fuori da un ciclo allo stesso modo con
+cui trattavano l'istruzione @code{break}
+fuori da un ciclo: come se fosse un'istruzione @code{next}
+@ifset FOR_PRINT
+(trattata nella @value{SECTION} seguente).
+@end ifset
+@ifclear FOR_PRINT
+(@pxref{Istruzione next}).
+@end ifclear
+@value{DARKCORNER}
+Versioni recenti di BWK @command{awk} non consentono pi@`u un tale uso,
+e lo stesso vale per @command{gawk}.
+
+@node Istruzione next
+@subsection L'istruzione @code{next}
+@cindex @code{next}, istruzione
+@cindex istruzione @code{next}
+
+L'istruzione @code{next} fa s@`{@dotless{i}} che @command{awk} termini immediatamente
+l'elaborazione del record corrente e proceda a elaborare il record successivo.
+Ci@`o vuol dire che nessuna delle eventuali regole successive viene eseguita
+per il record corrente e che il resto delle azioni presenti nella
+regola correntemente in esecuzione non viene eseguito.
+
+Si confronti quanto sopra con quel che fa la funzione @code{getline}
+(@pxref{Getline}).  Anch'essa fa s@`{@dotless{i}} che @command{awk} legga il record
+successivo immediatamente, ma non altera il flusso del controllo in alcun
+modo (cio@`e, il resto dell'azione in esecuzione prosegue con il nuovo record
+in input).
+
+@cindex @command{awk}, programmi, eseguire
+Al livello pi@`u alto, l'esecuzione di un programma @command{awk} @`e un ciclo
+che legge un record in input e quindi confronta il criterio di ricerca di
+ciascuna regola con il record stesso.  Se si vede questo ciclo come un
+@code{for} il cui corpo contiene le regole, l'istruzione @code{next} @`e analoga
+a un'istruzione @code{continue}.  Salta, cio@`e, alla fine del corpo di questo
+ciclo implicito
+ed esegue l'incremento (ovvero legge un altro record).
+
+Per esempio, si supponga che un programma @command{awk} agisca solo su record
+che hanno quattro campi, e che non dovrebbe terminare con un errore se trova
+dei record in input non validi.  Per evitare di complicare il resto del
+programma, si pu@`o scrivere una regola ``filtro'' a inizio programma, come
+mostrato in questo esempio:
+
+@example
+NF != 4 @{
+    printf("%s:%d: salto: NF != 4\n", FILENAME, FNR) > "/dev/stderr"
+    next
+@}
+@end example
+
+@noindent
+Siccome @`e presente un @code{next},
+le regole successive del programma non elaboreranno i record non validi.
+Il messaggio @`e ridiretto al flusso in output
+@dfn{standard error}, sul quale vanno scritti i messaggi di errore.
+Per maggiori dettagli, si veda
+@ref{File speciali}.
+
+Se l'istruzione @code{next} provoca il raggiungimento della fine del file
+in input, vengono eseguite le eventuali regole @code{END} presenti.
+@xref{BEGIN/END}.
+
+L'istruzione @code{next} non @`e consentita all'interno delle regole
+@code{BEGINFILE} ed @code{ENDFILE}.
+@xref{BEGINFILE/ENDFILE}.
+
+@c @cindex @command{awk} language, POSIX version
+@c @cindex @code{next}, inside a user-defined function
+@cindex @code{BEGIN}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
+@cindex @code{END}, criterio di ricerca, istruzioni @code{next}/@code{nextfile} e
+@cindex POSIX @command{awk}, istruzioni @code{next}/@code{nextfile} e
+@cindex @code{next}, istruzione, in funzioni definite dall'utente
+@cindex funzioni definite dall'utente, istruzioni @code{next}/@code{nextfile} e
+Secondo lo standard POSIX, il comportamento di @command{awk} @`e indefinito
+se @code{next} @`e usato in una regola @code{BEGIN} o @code{END}.
+@command{gawk} considera questo come un errore di sintassi. Sebbene POSIX
+non proibisca di usarlo,
+molte altre implementazioni di @command{awk} non consentono che l'istruzione
+@code{next} sia usata all'interno del corpo di funzioni.
+(@pxref{Funzioni definite dall'utente}).
+Come tutte le altre istruzioni @code{next}, un'istruzione @code{next} all'interno del
+corpo di una funzione legge il record successivo e inizia a elaborarlo
+a partire dalla prima regola del programma.
+
+@node Istruzione nextfile
+@subsection L'istruzione @code{nextfile}
+@cindex @code{nextfile}, istruzione
+@cindex istruzione @code{nextfile}
+
+L'istruzione @code{nextfile}
+@`e simile all'istruzione @code{next}.
+Tuttavia, invece di terminare l'elaborazione del record corrente, l'istruzione
+@code{nextfile} richiede ad @command{awk} di terminare di elaborare il
+@value{DF} corrente.
+
+Alla fine dell'esecuzione dell'istruzione @code{nextfile},
+@code{FILENAME} @`e
+aggiornato per contenere il nome del successivo @value{DF} elencato sulla riga
+di comando, @code{FNR} @`e reimpostato a uno, e l'elaborazione riparte con
+la prima regola del programma.
+Se l'istruzione @code{nextfile} raggiunge la fine dei file in input,
+vengono eseguite le eventuali regole @code{END} presenti.
+Un'eccezione a questo si ha se @code{nextfile} @`e invocata durante
+l'esecuzione di qualche istruzione all'interno di una regola @code{END};
+in questo caso, il programma viene terminato immediatamente.
+@xref{BEGIN/END}.
+
+L'istruzione @code{nextfile} @`e utile quando ci sono parecchi @value{DF} da
+elaborare, ma non @`e necessario elaborare ogni record in ogni file.
+Senza @code{nextfile},
+per passare al successivo @value{DF}, un programma
+dovrebbe continuare a leggere i record che non gli servono.  L'istruzione
+@code{nextfile} @`e una maniera molto pi@`u efficiente per ottenere lo stesso
+risultato.
+
+In @command{gawk}, l'esecuzione di @code{nextfile} produce ulteriori effetti:
+le eventuali regole @code{ENDFILE}
+sono eseguite se @command{gawk} non
+si trova correntemente all'interno di una regola @code{END} o
+@code{BEGINFILE}; @code{ARGIND} @`e
+incrementato e le eventuali regole @code{BEGINFILE} sono eseguite.
+(@code{ARGIND} non @`e stato ancora trattato.
+@xref{Variabili predefinite}.)
+
+In @command{gawk}, @code{nextfile} @`e utile all'interno di una regola
+@code{BEGINFILE} per evitare di elaborare un file che altrimenti causerebbe
+un errore fatale in @command{gawk}.
+In questo caso, le regole @code{ENDFILE} non vengono eseguite.
+@xref{BEGINFILE/ENDFILE}.
+
+Sebbene possa sembrare che @samp{close(FILENAME)} ottenga lo stesso
+risultato di @code{nextfile}, non @`e cos@`{@dotless{i}}.  @code{close()}
+pu@`o essere usato solo per chiudere file, @dfn{pipe} e coprocessi che siano
+stati aperti tramite ridirezioni.  Non ha niente a che vedere con
+l'elaborazione principale che
+@command{awk} fa dei file elencati in @code{ARGV}.
+
+@quotation NOTA
+Per molti anni, @code{nextfile} @`e stata
+un'estensione comune. A settembre 2012 si @`e deciso di
+includerla nello standard POSIX.
+Si veda @uref{http://austingroupbugs.net/view.php?id=607, il sito web dell'Austin Group}.
+@end quotation
+
+@cindex funzioni definite dall'utente, istruzioni @code{next}/@code{nextfile} e
+@cindex @code{nextfile}, in funzioni definite dall'utente
+@cindex Brian Kernighan, @command{awk} di
+@cindex @command{mawk}, programma di utilit@`a
+@cindex programma di utilit@`a @command{mawk}
+Le versioni correnti di BWK @command{awk} e @command{mawk}
+entrambe prevedono @code{nextfile}.  Tuttavia, non sono consentite istruzioni
+@code{nextfile} all'interno del corpo delle funzioni
+(@pxref{Funzioni definite dall'utente}).
+@command{gawk} lo permette; una @code{nextfile} all'interno del corpo di una
+funzione legge il primo record del file
+successivo e inizia l'elaborazione dello stesso
+a partire dalla prima regola del programma, esattamente come farebbe
+qualsiasi altra istruzione @code{nextfile}.
+
+@node Istruzione exit
+@subsection L'istruzione @code{exit}
+
+@cindex @code{exit}, istruzione
+@cindex istruzione @code{exit}
+L'istruzione @code{exit} fa s@`{@dotless{i}} che @command{awk} termini immediatamente
+l'esecuzione della regola corrente e che termini di elaborare l'input;
+qualsiasi input ancora da elaborare @`e ignorato.  L'istruzione @code{exit} @`e
+scritta come segue:
+
+@display
+@code{exit} [@var{codice di ritorno}]
+@end display
+
+@cindex @code{BEGIN}, criterio di ricerca, istruzione @code{exit} e
+@cindex criterio di ricerca @code{BEGIN}, istruzione @code{exit} e
+@cindex @code{END}, criterio di ricerca, istruzione @code{exit} e
+@cindex criterio di ricerca @code{END}, istruzione @code{exit} e
+Quando un'istruzione @code{exit} @`e eseguita all'interno di una regola @code{BEGIN},
+il programma termina completamente l'elaborazione.  Nessun record in input
+viene letto.  Tuttavia, se una regola @code{END} @`e presente, come parte
+dell'esecuzione dell'istruzione @code{exit},
+la regola @code{END} viene eseguita
+(@pxref{BEGIN/END}).
+Se @code{exit} @`e usata nel corpo di una regola @code{END},
+il programma termina immediatamente.
+
+Un'istruzione @code{exit} che non fa parte di una regola @code{BEGIN} o @code{END}
+termina l'esecuzione di qualsiasi ulteriore regola applicabile al record
+corrente, salta la lettura di qualsiasi record in input, ed esegue
+le eventuali regole @code{END}.  @command{gawk} salta anche le eventuali regole
+@code{ENDFILE}, che non vengono eseguite.
+
+In questo caso,
+se non si desidera che la regola @code{END} venga eseguita, si deve impostare
+una variabile a un valore diverso da zero, prima di invocare l'istruzione
+@code{exit} e controllarne il valore nella regola @code{END}.
+@xref{Funzione assert}
+per un esempio di questo tipo.
+
+@cindex angolo buio, istruzione @code{exit}
+Se si specifica un argomento all'istruzione @code{exit}, il suo valore @`e
+usato come codice di ritorno finale dell'elaborazione @command{awk}.  Se non
+viene specificato alcun argomento,
+@code{exit} fa terminare @command{awk} con un codice di ritorno di
+``successo''.
+Nel caso in cui un argomento
+sia specificato in una prima istruzione @code{exit} e poi @code{exit} sia
+chiamato una seconda volta all'interno di una regola @code{END} senza alcun
+argomento, @command{awk} usa il codice di ritorno specificato in precedenza.
+@value{DARKCORNER}
+@xref{Codice di ritorno} per maggiori informazioni.
+
+@cindex convenzioni di programmazione, istruzione @code{exit}
+Per esempio, si supponga che si sia verificata una condizione di errore
+difficile o impossibile da gestire.  Convenzionalmente, i programmi la
+segnalano terminando con un codice di ritorno diverso da zero.  Un programma
+@command{awk} pu@`o farlo usando un'istruzione @code{exit} con un argomento
+diverso da zero, come mostrato nell'esempio seguente:
+
+@example
+@group
+BEGIN @{
+    if (("date" | getline data_corrente) <= 0) @{
+      print "Non riesco a ottenere la data dal sistema" > "/dev/stderr"
+      exit 1
+    @}
+@end group
+@group
+    print "la data corrente @`e", data_corrente
+    close("date")
+@}
+@end group
+@end example
+
+@quotation NOTA
+Per una completa portabilit@`a, i codici di ritorno dovrebbero essere compresi
+tra zero e 126, estremi compresi.
+Valori negativi e valori maggiori o uguali a 127, possono non generare
+risultati coerenti tra loro in sistemi operativi diversi.
+@end quotation
+
+
+@node Variabili predefinite
+@section Variabili predefinite
+@cindex predefinite, variabili
+@cindex variabili predefinite
+
+La maggior parte delle variabili @command{awk} sono disponibili per essere
+usate dall'utente secondo le proprie esigenze;
+queste variabili non cambiano mai di valore a meno che il
+programma non assegni loro dei valori, e non hanno alcuna influenza sul
+programma a meno che non si decida di utilizzarle nel programma.
+Tuttavia, alcune variabili in @command{awk} hanno dei significati speciali
+predefiniti.
+@command{awk} tiene conto di alcune di queste automaticamente, in modo da
+rendere possibile la richiesta ad @command{awk} di fare certe cose nella
+maniera desiderata.  Altre variabili sono impostate automaticamente da
+@command{awk}, in modo da poter comunicare al programma in esecuzione
+informazioni sul modo di procedere interno di @command{awk}.
+
+@cindex @command{gawk}, variabili predefinite e
+Questa @value{SECTION} documenta tutte le variabili predefinite di
+@command{gawk}; molte di queste variabili sono anche documentate nei
+@value{CHAPTER} che descrivono le loro aree di influenza.
+
+@menu
+* Variabili modificabili dall'utente::  Variabili predefinite modificabili per
+                                controllare @command{awk}.
+* Variabili auto-assegnate::    Variabili predefinite con cui
+                                @command{awk} fornisce informazioni.
+* ARGC e ARGV::                 Modi di usare @code{ARGC} e @code{ARGV}.
+@end menu
+
+@node Variabili modificabili dall'utente
+@subsection Variabili predefinite modificabili per controllare @command{awk}
+@cindex variabili predefinite, modificabili dall'utente
+@cindex modificabili dall'utente, variabili
+
+La seguente @`e una lista alfabetica di variabili che @`e possibile modificare per
+controllare come @command{awk} gestisce alcuni compiti.
+
+Le variabili che sono specifiche di @command{gawk} sono contrassegnate da un
+cancelletto (@samp{#}).  Queste variabili sono estensioni @command{gawk}.
+In altre implementazioni di @command{awk}, o se @command{gawk} @`e eseguito in
+modalit@`a compatibile
+(@pxref{Opzioni}), non hanno un significato speciale.  (Eventuali eccezioni
+sono menzionate nella descrizione di ogni variabile.)
+
+@table @code
+@cindex @code{BINMODE}, variabile
+@cindex variabile @code{BINMODE}
+@cindex binario, input/output
+@cindex input/output binario
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{BINMODE}
+@item BINMODE #
+Su sistemi non-POSIX, questa variabile specifica l'uso della modalit@`a binaria
+per tutto l'I/O.  I valori numerici di uno, due o tre specificano che i file
+in input, i file di output o tutti i file, rispettivamente, devono usare I/O
+binario.
+Un valore numerico inferiore a zero @`e trattato come zero e un valore
+numerico maggiore di tre @`e trattato
+come tre.  Alternativamente, le stringhe @code{"r"} o @code{"w"} specificano
+che i file in input e i file in output,
+rispettivamente, devono usare
+I/O binario.  Una stringa @code{"rw"} o @code{"wr"} indica che tutti i file
+devono usare I/O binario.  Ogni altro valore di stringa @`e trattato come
+@code{"rw"}, ma @command{gawk} genera un messaggio di avvertimento.
+@code{BINMODE} @`e descritto in maggior
+dettaglio in @ref{Uso su PC}.  @command{mawk} (@pxref{Altre versioni})
+prevede questa variabile, ma consente solo valori numerici.
+
+@cindex @code{CONVFMT}, variabile
+@cindex variabile @code{CONVFMT}
+@cindex POSIX @command{awk}, variabile @code{CONVFMT} e
+@cindex numeri, conversione in stringhe
+@cindex stringhe, conversione in numeri
+@item @code{CONVFMT}
+Una stringa che controlla la conversione di numeri in
+stringhe (@pxref{Conversione}).
+In effetti @`e la stringa passata come primo argomento alla funzione
+@code{sprintf()}
+(@pxref{Funzioni per stringhe}).
+Il suo valore di default @`e @code{"%.6g"}.
+@code{CONVFMT} @`e stata introdotta dallo standard POSIX.
+
+@cindex @command{gawk}, variabile @code{FIELDWIDTHS} in
+@cindex @code{FIELDWIDTHS}, variabile
+@cindex variabile @code{FIELDWIDTHS}
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{FIELDWIDTHS}
+@cindex separatori di campo, variabile @code{FIELDWIDTHS} e
+@cindex campo, separatori di, variabile @code{FIELDWIDTHS} e
+@item FIELDWIDTHS #
+Una lista di posizioni di colonna, separate da spazi, per dire a
+@command{gawk}
+come dividere campi in input posti su colonne fisse.
+A partire dalla @value{PVERSION} 4.2, ogni lunghezza di campo pu@`o essere
+opzionalmente preceduta da un valore, separato da due punti (@code{:})
+che specifica il numero di caratteri da ignorare prima dell'inizio del campo.
+Assegnando un valore a @code{FIELDWIDTHS}, le variabili @code{FS} e
+@code{FPAT}
+@emph{non} vengono usate per effettuare la divisione in campi.
+@xref{Dimensione costante} per maggiori informazioni.
+
+@cindex @command{gawk}, variabile @code{FPAT} in
+@cindex @code{FPAT}, variabile
+@cindex variabile @code{FPAT}
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{FPAT}
+@cindex separatori di campo, variabile @code{FPAT} e
+@cindex campo, separatori di, variabile @code{FPAT} e
+@item FPAT #
+Un'espressione regolare (di tipo stringa) per dire a @command{gawk}
+di creare i campi utilizzando come delimitatore il testo che corrisponde
+all'espressione regolare.
+Assegnando un valore a @code{FPAT}
+le variabili @code{FS} e @code{FIELDWIDTHS}
+@emph{non} vengono usate per effettuare la divisione in campi.
+@xref{Separazione in base al contenuto} per maggiori informazioni.
+
+@cindex @code{FS}, variabile
+@cindex variabile @code{FS}
+@cindex campo, separatori di
+@cindex separatori di campo
+@item FS
+Il separatore dei campi in input (@pxref{Separatori di campo}).
+Il valore pu@`o essere una stringa di un solo carattere o un'espressione
+regolare composta da pi@`u caratteri che individua il separatore tra i campi
+dei record in input.  Se il suo valore
+@`e la stringa nulla (@code{""}),
+ogni singolo carattere del record costituisce un campo.
+(Questo comportamente @`e un'estensione @command{gawk}. POSIX @command{awk} non
+specifica il comportamento quando @code{FS} @`e la stringa nulla.
+Nonostante questo, alcune altre versioni di @command{awk} trattano @code{""}
+in modo speciale.)
+
+@cindex POSIX @command{awk}, variabile @code{FS} e
+Il valore di default @`e @w{@code{" "}}, una stringa consistente in un singolo
+spazio.  In via eccezionale, questo valore significa che qualsiasi sequenza
+di spazi, TAB, e/o ritorni a capo costituisce
+un solo separatore.
+Inoltre eventuali spazi, TAB e ritorni a capo all'inizio e alla fine
+del record in input vengono ignorati.
+
+Si pu@`o impostare il valore di @code{FS} sulla riga dei comandi usando
+l'opzione @option{-F}:
+
+@example
+awk -F, '@var{programma}' @var{file-in-input}
+@end example
+
+@cindex @command{gawk}, separatori di campo e
+Se @command{gawk} sta usando @code{FIELDWIDTHS} o @code{FPAT}
+per separare i campi,
+assegnare un valore a @code{FS} fa s@`{@dotless{i}} che @command{gawk} torni alla
+separazione dei campi normale, fatta utilizzando la variabile @code{FS}.
+Un modo semplice per fare questo
+@`e semplicemente quello di scrivere l'istruzione
+@samp{FS = FS}, aggiungendo magari un commento esplicativo.
+
+@cindex @command{gawk}, variabile @code{IGNORECASE} in
+@cindex @code{IGNORECASE}, variabile
+@cindex variabile @code{IGNORECASE}
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{IGNORECASE}
+@cindex maiuscolo/minuscolo, confronti tra stringhe e
+@cindex maiuscolo/minuscolo, @dfn{regexp} e
+@cindex espressioni regolari, maiuscolo/minuscolo
+@item IGNORECASE #
+Se la variabile @code{IGNORECASE} @`e diversa da zero o dalla stringa nulla,
+tutti i confronti tra stringhe
+e tutti i confronti tra espressioni regolari sono insensibili
+alle differenze maiuscolo/minuscolo.
+Questo vale per il confronto tra @dfn{regexp}
+usando @samp{~} e @samp{!~}, per le funzioni @code{gensub()},
+@code{gsub()}, @code{index()}, @code{match()}, @code{patsplit()},
+@code{split()} e @code{sub()},
+per la determinazione della fine record con @code{RS} e per la divisione
+in campi con @code{FS} e @code{FPAT}.
+Tuttavia, il valore di @code{IGNORECASE} @emph{non} influenza gli indici
+dei vettori
+e non influenza la separazione dei campi qualora si usi un separatore di campo
+costituito da un unico carattere.
+@xref{Maiuscolo-Minuscolo}.
+
+@cindex @command{gawk}, variabile @code{LINT} in
+@cindex @code{LINT}, variabile
+@cindex variabile @code{LINT}
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{LINT}
+@cindex @dfn{lint}, controlli
+@cindex controlli @dfn{lint}
+@item LINT #
+Quando questa variabile @`e vera (non uguale a zero e non uguale alla stringa
+nulla), @command{gawk} si comporta come se fosse stata specificata sulla
+riga di comando l'opzione @option{--lint}
+(@pxref{Opzioni}).
+Con un valore di @code{"fatal"}, gli avvertimenti di @dfn{lint} generano un errore
+fatale.
+Con un valore di @code{"invalid"}, sono inviati solo gli avvertimenti
+per cose che sono effettivamente non valide.  (Questa parte non funziona
+ancora perfettamente.)
+Ogni altro valore @dfn{vero} stampa avvertimenti non fatali.
+Se @code{LINT} ha per valore @dfn{falso} nessun avvertimento @dfn{lint} viene
+stampato.
+
+Questa variabile @`e un'estensione @command{gawk}.  Non ha un valore speciale
+per altre implementazioni di @command{awk}.  A differenza di altre variabili
+speciali, modificare il valore di @code{LINT} altera la produzione di
+avvertimenti @dfn{lint} anche se @command{gawk} @`e in modalit@`a compatibile.
+Analogamente a come le opzioni
+@option{--lint} e @option{--traditional} controllano in maniera indipendente
+diversi aspetti del comportamente di @command{gawk}, il controllo
+degli avvertimenti di @dfn{lint} durante l'esecuzione del programma @`e indipendente
+dall'implementazione @command{awk} in esecuzione.
+
+@cindex @code{OFMT}, variabile
+@cindex variabile @code{OFMT}
+@cindex numeri, conversione in stringhe
+@cindex stringhe, conversione in numeri
+@item OFMT
+@`E questa la stringa che controlla la conversione di numeri in
+stringhe (@pxref{Conversione}) quando li
+si stampa con l'istruzione
+@code{print}.  Funziona passandola
+ come primo argomento alla funzione @code{sprintf()}
+(@pxref{Funzioni per stringhe}).
+Il suo valore di default @`e @code{"%.6g"}.  Le prime versioni di @command{awk}
+usavano @code{OFMT} per specificare il formato da usare per convertire
+numeri in stringhe in espressioni generali; questo compito @`e ora svolto
+da @code{CONVFMT}.
+
+@cindex funzione @code{sprintf()}, variabile @code{OFMT} e
+@cindex @code{print}, istruzione, variabile @code{OFMT} e
+@cindex istruzione @code{print}, variabile @code{OFMT} e
+@cindex variabile @code{OFS}
+@cindex @code{OFS}, variabile
+@cindex campo, separatori di
+@cindex separatori di campo
+@item OFS
+@`E il separatore dei campi in output (@pxref{Separatori di output}).  @`E ci@`o
+che viene stampato in output per separare i campi stampati da un'istruzione @code{print}.
+Il suo valore di default @`e @w{@code{" "}}, una stringa costituita da un solo
+spazio.
+
+@cindex @code{ORS}, variabile
+@cindex variabile @code{ORS}
+@item ORS
+Il separatore dei record in output.  Viene stampato alla fine di ogni
+istruzione @code{print}.  Il suo valore di default @`e @code{"\n"},
+il carattere di ritorno a capo.
+(@xref{Separatori di output}.)
+
+@cindex @code{PREC}, variabile
+@cindex variabile @code{PREC}
+@item PREC #
+La precisione disponibile nei numeri in virgola mobile a precisione arbitraria,
+per default 53 bit (@pxref{Impostare la precisione}).
+
+@cindex @code{ROUNDMODE}, variabile
+@cindex variabile @code{ROUNDMODE}
+@item ROUNDMODE #
+La modalit@`a di arrotondamento da usare per operazioni aritmetiche a precisione
+arbitraria svolte sui numeri, per default @code{"N"}
+(@code{roundTiesToEven} nello standard
+IEEE 754; @pxref{Impostare modo di arrotondare}).
+
+@cindex @code{RS}, variabile
+@cindex variabile @code{RS}
+@cindex separatori di record
+@cindex record, separatori di
+@item @code{RS}
+Il separatore tra record in input.  Il suo valore di default @`e una stringa
+contenente il solo carattere di ritorno a capo, il che significa che un record in input
+consiste di una sola riga di testo.
+Il suo valore pu@`o essere anche la stringa nulla, nel qual caso i record sono
+separati da una o pi@`u righe vuote.
+Se invece @`e una @dfn{regexp}, i record sono separati da
+corrispondenze alla @dfn{regexp} nel testo in input.
+(@xref{Record}.)
+
+La possibilit@`a che @code{RS} sia un'espressione regolare
+@`e un'estensione @command{gawk}.
+In molte altre implementazioni @command{awk}, oppure
+se @command{gawk} @`e in modalit@`a compatibile
+(@pxref{Opzioni}),
+@`e usato solo il primo carattere del valore di @code{RS}.
+
+@cindex @code{SUBSEP}, variabile
+@cindex variabile @code{SUBSEP}
+@cindex separatori di indici
+@cindex indici, separatori di
+@item @code{SUBSEP}
+Il separatore di indici.  Ha il valore di default di
+@code{"\034"} ed @`e usato per separare le parti di cui sono composti gli indici
+di un vettore multidimensionale.  Quindi, l'espressione
+@samp{@w{pippo["A", "B"]}}
+in realt@`a accede a @code{pippo["A\034B"]}
+(@pxref{Vettori multidimensionali}).
+
+@cindex @command{gawk}, variabile @code{TEXTDOMAIN} in
+@cindex @code{TEXTDOMAIN}, variabile
+@cindex variabile @code{TEXTDOMAIN}
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{TEXTDOMAIN}
+@cindex internazionalizzazione, localizzazione
+@item TEXTDOMAIN #
+Usata per l'internazionalizzazione di programmi a livello di
+@command{awk}.  Imposta il dominio di testo (@dfn{text domain}) di default per costanti stringa
+marcate in maniera speciale nel codice sorgente, e anche per le funzioni
+@code{dcgettext()}, @code{dcngettext()} e @code{bindtextdomain()}
+@iftex
+(@pxrefil{Internazionalizzazione}).
+@end iftex
+@ifnottex
+(@pxref{Internazionalizzazione}).
+@end ifnottex
+Il valore di default di @code{TEXTDOMAIN} @`e @code{"messages"}.
+@end table
+
+@node Variabili auto-assegnate
+@subsection Variabili predefinite con cui @command{awk} fornisce informazioni
+
+@cindex predefinite, variabili, che forniscono informazioni
+@cindex variabili predefinite, che forniscono informazioni
+Quella che segue @`e una lista in ordine alfabetico di variabili che
+@command{awk} imposta automaticamente in determinate situazioni per
+fornire informazioni a un programma.
+
+Le variabili specifiche di @command{gawk} sono contrassegnate da un
+cancelletto (@samp{#}).  Queste variabili sono estensioni @command{gawk}.
+In altre implementazioni di @command{awk} o se @command{gawk} @`e in
+modalit@`a compatibile (@pxref{Opzioni}), non hanno un significato speciale:
+
+@c @asis for docbook
+@table @asis
+@cindex @code{ARGC}/@code{ARGV}, variabili
+@cindex argomenti, riga di comando
+@cindex riga di comando, argomenti
+@item @code{ARGC}, @code{ARGV}
+Gli argomenti della riga di comando disponibili ai programmi @command{awk}
+sono memorizzati in un vettore di nome
+@code{ARGV}.  @code{ARGC} @`e il numero di argomenti presenti sulla
+riga di comando.
+@xref{Altri argomenti}.
+A differenza di quasi tutti i vettori di @command{awk},
+@code{ARGV} @`e indicizzato da 0 a @code{ARGC} @minus{} 1.
+Lo si pu@`o vedere nell'esempio seguente:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{}
+>         @kbd{for (i = 0; i < ARGC; i++)}
+>             @kbd{print ARGV[i]}
+>      @kbd{@}' inventory-shipped mail-list}
+@print{} awk
+@print{} inventory-shipped
+@print{} mail-list
+@end group
+@end example
+
+@noindent
+@code{ARGV[0]} contiene @samp{awk}, @code{ARGV[1]}
+contiene @samp{inventory-shipped} e @code{ARGV[2]} contiene
+@samp{mail-list}.  Il valore di @code{ARGC} @`e tre, ossia uno in pi@`u
+dell'indice dell'ultimo elemento di @code{ARGV}, perch@'e gli elementi sono
+numerati a partire da zero.
+
+@cindex convenzioni di programmazione, variabili @code{ARGC}/@code{ARGV}
+I nomi @code{ARGC} e @code{ARGV}, come pure la convenzione di indicizzare
+il vettore da 0 a @code{ARGC} @minus{} 1, derivano dal modo in cui il
+linguaggio C accede agli argomenti presenti sulla riga di comando.
+
+@cindex angolo buio, valore di @code{ARGV[0]}
+Il valore di @code{ARGV[0]} pu@`o variare da sistema a sistema.
+Va anche notato che il programma @emph{non}
+@`e incluso in @code{ARGV}, e non sono incluse neppure le eventuali opzioni di
+@command{awk} specificate sulla riga di comando.
+@xref{ARGC e ARGV} per informazioni
+su come @command{awk} usa queste variabili.
+@value{DARKCORNER}
+
+@cindex @code{ARGIND}, variabile
+@cindex variabile @code{ARGIND}
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{ARGIND}
+@item @code{ARGIND #}
+L'indice in @code{ARGV} del file correntemente in elaborazione.
+Ogni volta che @command{gawk} apre un nuovo @value{DF} per elaborarlo, imposta
+@code{ARGIND} all'indice in @code{ARGV} del @value{FN}.
+Quando @command{gawk} sta elaborando i file in input, il confronto
+@samp{FILENAME == ARGV[ARGIND]} @`e sempre verificato.
+
+@cindex file, elaborazione@comma{} variabile @code{ARGIND} e
+Questa variabile @`e utile nell'elaborazione dei file; consente di stabilire
+a che punto ci si trova nella lista
+di @value{DF}, e anche di distinguere tra successive occorrenze dello stesso
+@value{FN} sulla riga dei comandi.
+
+@cindex nomi di file, distinguere
+Anche se @`e possibile modificare il valore di @code{ARGIND} all'interno del
+programma @command{awk}, @command{gawk} automaticamente lo imposta a un nuovo
+valore quando viene aperto il file successivo.
+
+@cindex @code{ENVIRON}, vettore
+@cindex vettore @code{ENVIRON}
+@cindex variabili d'ambiente, nel vettore @code{ENVIRON}
+@item @code{ENVIRON}
+Un vettore associativo contenente i valori delle variabili d'ambiente.
+Gli indici del vettore sono i nomi delle variabili d'ambiente; gli elementi
+sono i valori della specifica variabile d'ambiente.  Per esempio,
+@code{ENVIRON["HOME"]} potrebbe valere @code{/home/arnold}.
+
+Per POSIX @command{awk}, le modifiche a questo vettore non cambiano
+le variabili d'ambiente passate a qualsivoglia programma che @command{awk}
+pu@`o richiamare tramite una ridirezione
+o usando la funzione @code{system()}.
+
+Tuttavia, a partire dalla @value{PVERSION} 4.2, se non si @`e in
+modalit@`a compatibile POSIX, @command{gawk} aggiorna le proprie variabili
+d'ambiente, quando si modifica @code{ENVIRON}, e in questo modo sono
+modificate anche le variabili d'ambiente disponibili ai programmi richiamati.
+Un'attenzione speciale dovrebbe essere prestata alla modifica di
+@code{ENVIRON["PATH"]}, che @`e il percorso di ricerca usato per trovare
+i programmi eseguibili.
+
+Queste modifiche possono anche influire sul programma @command{gawk}, poich@'e
+alcune funzioni predefinite possono tener conto di certe
+variabili d'ambiente.
+L'esempio pi@`u notevole di una tale situazione @`e @code{mktime()}
+(@pxref{Funzioni di tempo})
+che, in molti sistemi, tiene conto del valore della
+variabile d'ambiente @env{TZ}.
+
+Alcuni sistemi operativi possono non avere variabili d'ambiente.
+In tali sistemi, il vettore @code{ENVIRON} @`e vuoto (tranne che per
+le variabili
+@w{@code{ENVIRON["AWKPATH"]}} e
+@w{@code{ENVIRON["AWKLIBPATH"]}} eventualmente presenti;
+@pxref{AWKPATH (Variabile)} e
+@ifdocbook
+@ref{AWKLIBPATH (Variabile)}).
+@end ifdocbook
+@ifnotdocbook
+@pxref{AWKLIBPATH (Variabile)}).
+@end ifnotdocbook
+
+@cindex @command{gawk}, variabile @code{ERRNO} in
+@cindex @code{ERRNO}, variabile
+@cindex variabile @code{ERRNO}
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{ERRNO}
+@cindex gestione errori, variabile @code{ERRNO} e
+@item @code{ERRNO #}
+Se si verifica un errore di sistema durante una ridirezione per @code{getline},
+durante una lettura per @code{getline} o durante un'operazione di
+@code{close()}, la variabile
+@code{ERRNO} contiene una stringa che descrive l'errore.
+
+Inoltre, @command{gawk} annulla @code{ERRNO} prima di aprire ogni
+file in input presente sulla riga di comando.  Questo consente di controllare
+se il file @`e accessibile
+all'interno di un criterio di ricerca @code{BEGINFILE}
+(@pxref{BEGINFILE/ENDFILE}).
+
+Per il resto, @code{ERRNO} si comporta analogamente alla variabile C
+@code{errno}.
+Tranne nel caso sopra accennato, @command{gawk} non annulla @emph{mai}
+@code{ERRNO} (lo imposta a zero o a @code{""}).  Quindi, ci si deve
+aspettare che il suo valore sia significativo solo quando un'operazione
+di I/O restituisce un valore che indica il fallimento dell'operazione, come
+per esempio quando @code{getline} restituisce @minus{}1.  Si @`e, naturalmente,
+liberi di annullarla prima di effettuare un'operazione di I/O.
+
+Se il valore di @code{ERRNO} corrisponde a un errore di sistema della
+variabile C @code{errno}, @code{PROCINFO["errno"]} sar@`a impostato al valore
+di @code{errno}.  Per errori non di sistema, @code{PROCINFO["errno"]} sar@`a
+impostata al valore zero.
+
+@cindex @code{FILENAME}, variabile
+@cindex variabile @code{FILENAME}
+@cindex angolo buio, variabile @code{FILENAME}
+@item @code{FILENAME}
+Il nome del file in input corrente.  Quando non ci sono @value{DF}
+sulla riga dei comandi, @command{awk} legge dallo standard input e
+@code{FILENAME} @`e impostato a @code{"-"}.  @code{FILENAME} cambia ogni
+volta che si legge un nuovo file
+@iftex
+(@pxrefil{Leggere file}).
+@end iftex
+@ifnottex
+(@pxref{Leggere file}).
+@end ifnottex
+All'interno di una
+regola @code{BEGIN}, il valore di @code{FILENAME} @`e @code{""}, perch@'e non si
+sta elaborando alcun file in input.@footnote{Alcune tra le prime implementazioni di Unix
+@command{awk} inizializzavano @code{FILENAME} a @code{"-"}, anche se
+vi erano @value{DF} da elaborare. Un tale comportamento era incorretto e
+non ci si dovrebbe poter contare nei programmi.}
+@value{DARKCORNER}  Si noti, tuttavia,
+che l'uso di @code{getline} (@pxref{Getline}) all'interno di una regola
+@code{BEGIN} pu@`o implicare l'assegnamento di un valore a @code{FILENAME}.
+
+@cindex @code{FNR}, variabile
+@cindex variabile @code{FNR}
+@item @code{FNR}
+Il numero del record corrente nel file corrente.  @command{awk} incrementa
+@code{FNR} ogni volta che legge un nuovo record (@pxref{Record}).
+@command{awk} imposta nuovamente a zero @code{FNR} ogni volta che inizia a
+leggere un nuovo file in input.
+
+@cindex @code{NF}, variabile
+@cindex variabile @code{NF}
+@item @code{NF}
+Il numero di campi nel corrente record in input.
+@code{NF} @`e impostato ogni volta che si legge un nuovo record,
+quando un nuovo campo viene creato,
+o quando si modifica @code{$0} (@pxref{Campi}).
+
+A differenza di molte altre variabili descritte in questa @value{SUBSECTION},
+l'assegnamento di un valore a @code{NF} pu@`o potenzialmente influenzare
+il funzionamento interno di @command{awk}.  In particolare, assegnamenti
+a @code{NF} si possono usare per aggiungere o togliere campi dal
+record corrente. @xref{Cambiare i campi}.
+
+@cindex @code{FUNCTAB}, vettore
+@cindex vettore @code{FUNCTAB}
+@cindex @command{gawk}, vettore @code{FUNCTAB} in
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{FUNCTAB}
+@item @code{FUNCTAB #}
+Un vettore i cui indici e i corrispondenti valori sono i nomi di tutte le
+funzioni predefinite, definite dall'utente ed estese, presenti nel programma.
+
+@quotation NOTA
+Il tentativo di usare l'istruzione @code{delete} per eliminare il vettore
+@code{FUNCTAB} genera un errore fatale.  Genera un errore fatale anche
+ogni tentativo di impostare un elemento di @code{FUNCTAB}.
+@end quotation
+
+@cindex @code{NR}, variabile
+@cindex variabile @code{NR}
+@item @code{NR}
+Il numero di record in input che @command{awk} ha elaborato dall'inizio
+dell'esecuzione del programma
+(@pxref{Record}).
+@command{awk} incrementa @code{NR} ogni volta che legge un nuovo record.
+
+@cindex @command{gawk}, vettore @code{PROCINFO} in
+@cindex @code{PROCINFO}, vettore
+@cindex vettore @code{PROCINFO}
+@cindex differenze tra @command{awk} e @command{gawk}, vettore @code{PROCINFO}
+@item @code{PROCINFO #}
+Gli elementi di questo vettore danno accesso a informazioni sul
+programma @command{awk} in esecuzione.
+I seguenti elementi (elencati in ordine alfabetico)
+sono sicuramente sempre disponibili:
+
+@table @code
+@item PROCINFO["argv"]
+@cindex argomenti, riga di comando
+@cindex riga di comando, argomenti
+Il vettore @code{PROCINFO["argv"]} contiene tutti gli argomenti della riga di
+comando (dopo che l'eventuale elaborazione di valutazione e ridirezione,
+nelle piattaforme in cui ci@`o debba essere fatto a cura del programma), con
+indici che vanno da 0 a @code{argc} @minus{} 1.  Per esempio,
+@code{PROCINFO["argv"][0]} conterr@`a il nome con cui @command{gawk} @`e stato
+richiamato.  Ecco un esempio di come si pu@`o usare questa funzionalit@`a:
+
+@example
+gawk '
+BEGIN @{
+        for (i = 0; i < length(PROCINFO["argv"]); i++)
+                print i, PROCINFO["argv"][i]
+@}'
+@end example
+
+Si tenga presente che questo vettore @`e diverso dal vettore standard
+@code{ARGV} il quale non include quegli argomenti della riga di comando
+che sono gi@`a stati elaborati da @command{gawk} (@pxref{ARGC e ARGV}).
+
+@cindex effettivo, @dfn{ID di gruppo} dell'utente di @command{gawk}
+@item PROCINFO["egid"]
+Il valore restituito dalla chiamata di sistema @code{getegid()}.
+
+@item PROCINFO["errno"]
+Il valore della variabile C @code{ERRNO} quando @code{ERRNO} @`e impostato
+al messaggio di errore a essa associato.
+
+@item PROCINFO["euid"]
+@cindex @dfn{ID effettivo} dell'utente di @command{gawk}
+Il valore restituito dalla chiamata di sistema @code{geteuid()}.
+
+@item PROCINFO["FS"]
+Questo elemento vale
+@code{"FS"} se @`e in uso la separazione in campi con @code{FS},
+@code{"FIELDWIDTHS"} se @`e in uso quella con @code{FIELDWIDTHS},
+@code{"FPAT"} se @`e in uso l'individuazione di campo con @code{FPAT}, o
+@code{"API"} se la divisione in campi @`e controllata da un analizzatore
+di input tramite API.
+
+@item PROCINFO["gid"]
+@cindex @dfn{ID di gruppo} dell'utente @command{gawk}
+Il valore restituito dalla chiamata di sistema @code{getgid()} .
+
+@item PROCINFO["identifiers"]
+@cindex programma, identificativi in un
+@cindex identificativi in un programma
+Un sottovettore, indicizzato dai nomi di tutti gli identificativi usati
+all'interno del programma @command{awk}.  Un @dfn{identificativo} @`e
+semplicemente il nome di una variabile
+(scalare o vettoriale), una funzione predefinita, una funzione definita
+dall'utente, o una funzione contenuta in un'estensione.
+Per ogni identificativo, il valore dell'elemento @`e uno dei seguenti:
+
+@table @code
+@item "array"
+L'identificativo @`e un vettore.
+
+@item "builtin"
+L'identificativo @`e una funzione predefinita.
+
+@item "extension"
+L'identificativo @`e una funzione in un'estensione caricata tramite
+@code{@@load} o con l'opzione @option{-l}.
+
+@item "scalar"
+L'identificativo @`e uno scalare.
+
+@item "untyped"
+L'identificativo non ha ancora un tipo (potrebbe essere usato come scalare o
+come vettore; @command{gawk} non @`e ancora in grado di dirlo).
+
+@item "user"
+L'identificativo @`e una funzione definita dall'utente.
+@end table
+
+@noindent
+I valori riportano ci@`o che @command{gawk} sa sugli identificativi
+dopo aver finito l'analisi iniziale del programma; questi valori @emph{non}
+vengono pi@`u aggiornati durante l'esecuzione del programma.
+
+@item PROCINFO["platform"]
+@cindex piattaforma di esecuzione
+Quest'elemento restituisce una stringa che indica la piattaforma
+per la quale @command{gawk} @`e stato compilato.  Il valore sar@`a
+uno dei seguenti:
+
+@c nested table
+@table @code
+@item "djgpp"
+@itemx "mingw"
+Microsoft Windows, utilizzando DJGPP o MinGW, rispettivamente.
+
+@item "os2"
+OS/2.
+
+@item "os390"
+OS/390.
+
+@item "posix"
+GNU/Linux, Cygwin, Mac OS X, e sistemi Unix tradizionali.
+
+@item "vms"
+OpenVMS o Vax/VMS.
+@end table
+
+@item PROCINFO["pgrpid"]
+@cindex @dfn{process group ID} del programma @command{gawk}
+Il @dfn{ID di gruppo del processo} del programma corrente.
+
+@item PROCINFO["pid"]
+@cindex @dfn{process ID} del programma @command{gawk}
+Il @dfn{process ID} del programma corrente.
+
+@item PROCINFO["ppid"]
+@cindex @dfn{parent process ID} del programma @command{gawk}
+Il @dfn{ID di processo del padre} del programma corrente.
+
+@item PROCINFO["strftime"]
+La stringa col formato di default usato per la funzione @code{strftime()}.
+Assegnando un nuovo valore a questo elemento si cambia quello di default.
+@xref{Funzioni di tempo}.
+
+@item PROCINFO["uid"]
+Il valore restituito dalla chiamata di sistema @code{getuid()}.
+
+@item PROCINFO["version"]
+@cindex versione di @command{gawk}
+@cindex @command{gawk}, versione di
+La versione di @command{gawk}.
+@end table
+
+I seguenti elementi addizionali del vettore
+sono disponibili per fornire informazioni sulle librerie MPFR e GMP,
+se la versione in uso di @command{gawk} consente il calcolo con precisione
+arbitraria
+(@pxref{Calcolo con precisione arbitraria}):
+
+@table @code
+@item PROCINFO["gmp_version"]
+@cindex versione della libreria GNU MP
+La versione della libreria GNU MP.
+
+@cindex versione della libreria GNU MPFR
+@item PROCINFO["mpfr_version"]
+La versione della libreria GNU MPFR.
+
+@item PROCINFO["prec_max"]
+@cindex precisione massima consentita dalla libreria MPFR
+La massima precisione consentita da MPFR.
+
+@item PROCINFO["prec_min"]
+@cindex precisione minima richiesta dalla libreria MPFR
+La precisione minima richiesta da MPFR.
+@end table
+
+I seguenti elementi addizionali del vettore
+sono disponibili per fornire
+informazioni sulla versione dell'estensione API, se la versione
+di @command{gawk} prevede il caricamento dinamico di funzioni di estensione
+@iftex
+(@pxrefil{Estensioni dinamiche}):
+@end iftex
+@ifnottex
+(@pxref{Estensioni dinamiche}):
+@end ifnottex
+
+@table @code
+@item PROCINFO["api_major"]
+@cindex versione dell'estensione API @command{gawk}
+@cindex estensione API, numero di versione
+La versione principale dell'estensione API.
+
+@item PROCINFO["api_minor"]
+La versione secondaria dell'estensione API.
+@end table
+
+@cindex gruppi supplementari Unix con @command{gawk}
+Su alcuni sistemi, ci possono essere elementi nel vettore, da @code{"group1"}
+fino a @code{"group@var{N}"}. @var{N} @`e il numero di
+gruppi supplementari che il processo [Unix] possiede.  Si usi l'operatore
+@code{in} per verificare la presenza di questi elementi
+(@pxref{Visitare elementi}).
+
+I seguenti elementi consentono di modificare il comportamento di
+@command{gawk}:
+
+@table @code
+@item PROCINFO["NONFATAL"]
+Se questo elemento esiste, gli errori di I/O per tutte le ridirezioni
+consentono la prosecuzione del programma.
+@xref{Continuazione dopo errori}.
+
+@item PROCINFO["@var{nome}", "NONFATAL"]
+Gli errori di I/O per il file @var{nome}
+consentono la prosecuzione del programma.
+@xref{Continuazione dopo errori}.
+
+@item PROCINFO["@var{comando}", "pty"]
+Per una comunicazione bidirezionale con @var{comando}, si usi una pseudo-tty
+invece di impostare una @dfn{pipe} bidirezionale.
+@xref{I/O bidirezionale} per ulteriori informazioni.
+
+@item PROCINFO["@var{input_name}", "READ_TIMEOUT"]
+Imposta un tempo limite per leggere dalla ridirezione di input @var{input_name}.
+@xref{Timeout in lettura} per ulteriori informazioni.
+
+@item PROCINFO["@var{input_name}", "RETRY"]
+Se durante la lettura del file  @var{input_name} si verifica un errore di I/O
+per il quale si pu@`o ritentare una lettura, e questo elemento di vettore
+esiste, @code{getline} d@`a come codice di ritorno @minus{}2 invece di
+seguire il comportamento di default, che consiste nel restituire @minus{}1
+e configurare @var{input_name} in modo che non fornisca pi@`u alcun dato.
+Un errore di I/O per cui si pu@`o ritentare una lettura in cui @code{errno}
+ha il valore @code{EAGAIN}, @code{EWOULDBLOCK}, @code{EINTR},
+o @code{ETIMEDOUT}.  Ci@`o pu@`o essere utile in associazione con l'elemento
+di vettore @code{PROCINFO["@var{input_name}", "READ_TIMEOUT"]}
+o in situazioni in cui un descrittore di file @`e stato configurato
+per comportarsi in modo da non bloccare l'elaborazione.
+@xref{Proseguire dopo errore in input} per ulteriori informazioni.
+
+@item PROCINFO["sorted_in"]
+Se questo elemento esiste in @code{PROCINFO}, il suo valore controlla
+l'ordine in cui gli indici dei vettori saranno elaborati nei cicli
+@samp{for (@var{indice} in @var{vettore})}.
+Questa @`e una funzionalit@`a avanzata, la cui descrizione completa sar@`a vista
+pi@`u avanti; si veda
+@ref{Controllare visita}.
+@end table
+
+@cindex @code{RLENGTH}, variabile
+@cindex variabile @code{RLENGTH}
+@item @code{RLENGTH}
+La lunghezza della sottostringa individuata dalla funzione
+@code{match()}
+(@pxref{Funzioni per stringhe}).
+@code{RLENGTH} viene impostata quando si richiama la funzione @code{match()}.
+Il suo
+valore @`e la lunghezza della stringa individuata, oppure @minus{}1 se non @`e
+stata trovata alcuna corrispondenza.
+
+@cindex @code{RSTART}, variabile
+@cindex variabile @code{RSTART}
+@item @code{RSTART}
+L'indice, in caratteri, da cui parte la sottostringa che @`e individuata dalla
+funzione @code{match()}
+(@pxref{Funzioni per stringhe}).
+@code{RSTART} viene impostata quando si richiama la funzione @code{match()}.
+Il suo
+valore @`e la posizione nella stringa da cui inizia la sottostringa
+individuata, oppure zero, se non @`e stata trovata alcuna corrispondenza.
+
+@cindex @command{gawk}, variabile @code{RT} in
+@cindex @code{RT}, variabile
+@cindex variabile @code{RT}
+@cindex differenze tra @command{awk} e @command{gawk}, variabili @code{RS}/@code{RT}
+@item @code{RT #}
+Il testo in input che corrisponde al testo individuato da @code{RS},
+il separatore di record.  Questa variabile viene impostata dopo aver letto
+ciascun record.
+
+@cindex @command{gawk}, vettore @code{SYMTAB} in
+@cindex @code{SYMTAB}, vettore
+@cindex vettore @code{SYMTAB}
+@cindex differenze tra @command{awk} e @command{gawk}, vettore @code{SYMTAB}
+@item @code{SYMTAB #}
+Un vettore i cui indici sono i nomi di tutte le variabili globali e i vettori
+definiti nel programma.  @code{SYMTAB} rende visibile al
+programmatore @command{awk} la tabella dei simboli di @command{gawk}.
+Viene preparata nella fase di analisi iniziale del programma @command{gawk}
+ed @`e completata prima di cominciare a eseguire il programma.
+
+Il vettore pu@`o essere usato per accedere indirettamente, in lettura o in
+scrittura, al valore di una variabile:
+
+@example
+pippo = 5
+SYMTAB["pippo"] = 4
+print pippo    # stampa 4
+@end example
+
+@noindent
+La funzione @code{isarray()} (@pxref{Funzioni per i tipi}) si pu@`o usare per
+controllare se un elemento in @code{SYMTAB} @`e un vettore.
+Inoltre, non @`e possibile usare l'istruzione @code{delete} con il vettore
+@code{SYMTAB}.
+
+Prima della @value{PVERSION} 5.0 di @command{gawk}, era possibile
+usare come indice per @code{SYMTAB} una stringa che non era un
+identificativo gi@`a esistente:
+
+@example
+SYMTAB["xxx"] = 5
+print SYMTAB["xxx"]
+@end example
+
+@noindent
+Ci@`o non @`e pi@`u possibile, e il farlo determina un errore
+fatale, perch@'e il poterlo fare era solo fonte di confusione.
+
+@cindex Schorr, Andrew
+Il vettore @code{SYMTAB} @`e pi@`u interessante di quel che sembra.  Andrew
+Schorr fa notare che effettivamente consente di ottenere dei puntatori ai dati
+in @command{awk}.  Si consideri quest'esempio:
+
+@example
+@group
+# Moltiplicazione indiretta di una qualsiasi variabile per un
+# numero a piacere e restituzione del risultato
+
+function multiply(variabile, numero)
+@{
+    return SYMTAB[variabile] *= numero
+@}
+@end group
+@end example
+
+@noindent
+Si potrebbe usare in questo modo:
+
+@example
+BEGIN @{
+    risposta = 10.5
+    multiply("risposta", 4)
+    print "La risposta @`e", risposta
+@}
+@end example
+
+@noindent
+Eseguendo, il risultato @`e:
+
+@example
+$ @kbd{gawk -f risposta.awk}
+@print{} La risposta @`e 42
+@end example
+
+@quotation NOTA
+Per evitare seri paradossi temporali,
+@footnote{Per non parlare dei grossi problemi di implementazione.}
+n@'e @code{FUNCTAB} n@'e @code{SYMTAB}
+sono disponibili come elementi all'interno del vettore @code{SYMTAB}.
+@end quotation
+@end table
+
+@sidebar Modificare @code{NR} e @code{FNR}
+@cindex @code{NR}, variabile, modifica di
+@cindex variabile @code{NR}, modifica di
+@cindex @code{FNR}, variabile, modifica di
+@cindex variabile @code{FNR}, modifica di
+@cindex angolo buio, variabili @code{FNR}/@code{NR}
+@command{awk} incrementa le variabili @code{NR} e @code{FNR}
+ogni volta che legge un record, invece che impostarle al valore assoluto del
+numero di record letti.  Ci@`o significa che un programma pu@`o
+modificare queste variabili e i valori cos@`{@dotless{i}} assegnati sono incrementati per
+ogni record.
+@value{DARKCORNER}
+Si consideri l'esempio seguente:
+
+@example
+$ @kbd{echo '1}
+> @kbd{2}
+> @kbd{3}
+> @kbd{4' | awk 'NR == 2 @{ NR = 17 @}}
+> @kbd{@{ print NR @}'}
+@print{} 1
+@print{} 17
+@print{} 18
+@print{} 19
+@end example
+
+@noindent
+Prima che @code{FNR} venisse aggiunto al linguaggio @command{awk}
+(@pxref{V7/SVR3.1}),
+molti programmi @command{awk} usavano questa modalit@`a per
+contare il numero di record in un file impostando a zero @code{NR} al cambiare
+di @code{FILENAME}.
+@end sidebar
+
+@node ARGC e ARGV
+@subsection Usare @code{ARGC} e @code{ARGV}
+@cindex @code{ARGC}/@code{ARGV}, variabili, come usarle
+@cindex variabili @code{ARGC}/@code{ARGV}, come usarle
+@cindex argomenti, riga di comando
+@cindex riga di comando, argomenti
+
+@iftex
+La
+@end iftex
+@ref{Variabili auto-assegnate}
+conteneva il programma seguente che visualizzava le informazioni contenute
+in @code{ARGC} e @code{ARGV}:
+
+@example
+@group
+$ @kbd{awk 'BEGIN @{}
+>        @kbd{for (i = 0; i < ARGC; i++)}
+>            @kbd{print ARGV[i]}
+>      @kbd{@}' inventory-shipped mail-list}
+@print{} awk
+@print{} inventory-shipped
+@print{} mail-list
+@end group
+@end example
+
+@noindent
+In questo esempio, @code{ARGV[0]} contiene @samp{awk}, @code{ARGV[1]}
+contiene @samp{inventory-shipped} e @code{ARGV[2]} contiene
+@samp{mail-list}.
+Si tenga presente che il nome del programma @command{awk}
+non @`e incluso in @code{ARGV}.
+Le altre opzioni della riga di comando, con i relativi argomenti,
+sono parimenti non presenti, compresi anche gli assegnamenti di
+variabile fatti tramite l'opzione @option{-v}
+(@pxref{Opzioni}).
+I normali assegnamenti di variabile sulla riga dei comandi @emph{sono}
+trattati come argomenti e quindi inseriti nel vettore @code{ARGV}.
+Dato il seguente programma in un file di nome @file{vediargomenti.awk}:
+
+@example
+BEGIN @{
+    printf "A=%d, B=%d\n", A, B
+    for (i = 0; i < ARGC; i++)
+        printf "\tARGV[%d] = %s\n", i, ARGV[i]
+@}
+END   @{ printf "A=%d, B=%d\n", A, B @}
+@end example
+
+@noindent
+la sua esecuzione produce il seguente risultato:
+
+@example
+$ @kbd{awk -v A=1 -f vediargomenti.awk B=2 /dev/null}
+@print{} A=1, B=0
+@print{}        ARGV[0] = awk
+@print{}        ARGV[1] = B=2
+@print{}        ARGV[2] = /dev/null
+@print{} A=1, B=2
+@end example
+
+Un programma pu@`o modificare @code{ARGC} e gli elementi di @code{ARGV}.
+Ogni volta che @command{awk} arriva alla fine di un file in input, usa
+il successivo elemento nel vettore @code{ARGV} come nome del successivo file
+in input.  Cambiando il contenuto di quella stringa, un programma
+pu@`o
+modificare la lista dei file che sono letti.
+Si usi @code{"-"} per rappresentare lo standard input.  Assegnando ulteriori
+elementi e incrementando @code{ARGC}
+verranno letti ulteriori file.
+
+Se il valore di @code{ARGC} viene diminuto, vengono ignorati i file in input
+posti alla fine della lista.  Memorizzando il valore originale di @code{ARGC}
+da qualche altra parte, un programma pu@`o gestire gli argomenti
+ignorati come se fossero qualcosa di diverso dai @value{FN}.
+
+Per eliminare un file che sia in mezzo alla lista, si imposti in @code{ARGV}
+la stringa nulla
+(@code{""}) al posto del nome del file in questione.  Come funzionalit@`a
+speciale, @command{awk} ignora valori di @value{FN} che siano stati
+rimpiazzati con la stringa nulla.
+Un'altra possibilit@`a @`e quella
+di usare l'istruzione @code{delete} per
+togliere elementi da @code{ARGV} (@pxref{Cancellazione}).
+
+Tutte queste azioni sono tipicamente eseguite nella regola @code{BEGIN},
+prima di iniziare l'elaborazione vera e propria dell'input.
+@xref{Programma split} e
+@ifnotdocbook
+@pxref{Programma tee}
+@end ifnotdocbook
+@ifdocbook
+@ref{Programma tee}
+@end ifdocbook
+per esempi
+su ognuno dei modi per togliere elementi dal vettore @code{ARGV}.
+
+Per passare direttamente delle opzioni a un programma scritto in
+@command{awk}, si devono terminare le opzioni di @command{awk} con
+@option{--} e poi inserire le opzioni destinate al programma @command{awk},
+come mostrato qui di seguito:
+
+@example
+awk -f mio_programma.awk -- -v -q file1 file2 @dots{}
+@end example
+
+Il seguente frammento di programma ispeziona @code{ARGV} per esaminare, e
+poi rimuovere, le opzioni sulla riga di comando viste sopra:
+
+@example
+BEGIN @{
+   for (i = 1; i < ARGC; i++) @{
+        if (ARGV[i] == "-v")
+            verbose = 1
+        else if (ARGV[i] == "-q")
+            debug = 1
+        else if (ARGV[i] ~ /^-./) @{
+            e = sprintf("%s: opzione non riconosciuta -- %c",
+                    ARGV[0], substr(ARGV[i], 2, 1))
+            print e > "/dev/stderr"
+        @} else
+            break
+        delete ARGV[i]
+    @}
+@}
+@end example
+
+@cindex differenze tra @command{awk} e @command{gawk}, variabili @code{ARGC}/@code{ARGV}
+Terminare le opzioni di @command{awk} con @option{--} non @`e
+necessario in @command{gawk}. A meno che non si specifichi @option{--posix},
+@command{gawk} inserisce, senza emettere messaggi, ogni opzione non
+riconosciuta
+nel vettore @code{ARGV} perch@'e sia trattata dal programma @command{awk}.
+Dopo aver trovato un'opzione non riconosciuta, @command{gawk} non cerca
+ulteriori opzioni, anche se ce ne fossero di riconoscibili.
+La riga dei comandi precedente sarebbe
+con @command{gawk}:
+
+@example
+gawk -f mio_programma.awk -q -v file1 file2 @dots{}
+@end example
+
+@noindent
+Poich@'e @option{-q} non @`e un'opzione valida per @command{gawk}, quest'opzione
+e l'opzione @option{-v} che segue sono passate al programma @command{awk}.
+(@xref{Funzione getopt} per una funzione di libreria @command{awk}
+che analizza le opzioni della riga di comando.)
+
+Nel progettare un programma, si dovrebbero scegliere opzioni che non
+siano in conflitto con quelle di @command{gawk}, perch@'e ogni opzioni
+accettata da @command{gawk} verr@`a elaborata prima di passare il resto
+della riga dei comandi al programma @command{awk}.
+Usare @samp{#!} con l'opzione @option{-E} pu@`o essere utile in questo caso
+(@pxref{@dfn{Script} eseguibili}
+e
+@ifnotdocbook
+@pxref{Opzioni}).
+@end ifnotdocbook
+@ifdocbook
+@ref{Opzioni}).
+@end ifdocbook
+
+@node Sommario criteri e azioni
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+Coppie @dfn{criterio di ricerca--azione} sono gli elementi base di un
+programma @command{awk}.  I criteri di ricerca possono essere espressioni
+normali, espressioni di intervallo, o costanti @dfn{regexp}; possono anche
+essere i criteri speciali @code{BEGIN}, @code{END},
+@code{BEGINFILE} o @code{ENDFILE}; o essere omessi.  L'azione viene eseguita
+se il record corrente soddisfa il criterio di ricerca.  Criteri di ricerca
+vuoti (omessi) corrispondono a
+tutti i record in input.
+
+@item
+L'I/O effettuato nelle azioni delle regole @code{BEGIN} ed @code{END}
+ha alcuni vincoli.
+Questo vale a maggior ragione per le regole @code{BEGINFILE} ed
+@code{ENDFILE}.  Queste ultime due forniscono degli ``agganci'' per interagire
+con l'elaborazione dei file fatta da @command{gawk},
+consentendo di risolvere situazioni che altrimenti genererebbero degli
+errori fatali (ad esempio per un file che non si @`e autorizzati
+a leggere).
+
+@item
+Le variabili di shell possono essere usate nei programmi @command{awk}
+prestando la dovuta attenzione all'uso degli apici.
+@`E pi@`u facile passare una variabile di shell ad
+@command{awk} usando l'opzione @option{-v} e una variabile @command{awk}.
+
+@item
+Le azioni sono formate da istruzioni racchiuse tra parentesi graffe.
+Le istruzioni sono composte da
+espressioni, istruzioni di controllo,
+istruzioni composte,
+istruzioni di input/output e istruzioni di cancellazione.
+
+@item
+Le istruzioni di controllo in @command{awk} sono @code{if}-@code{else},
+@code{while}, @code{for} e @code{do}-@code{while}.  @command{gawk}
+aggiunge l'istruzione @code{switch}.  Ci sono due tipi di istruzione
+@code{for}: uno per eseguire dei cicli, e l'altro per esaminare un vettore.
+
+@item
+Le istruzioni @code{break} e @code{continue} permettono di uscire
+velocemente da un ciclo, o di passare alla successiva iterazione dello
+stesso (o di uscire da un'istruzione @code{switch}).
+
+@item
+Le istruzioni @code{next} e @code{nextfile} permettono, rispettivamente,
+di passare al record successivo, ricominciando l'elaborazione dalla prima
+regola del programma, o di passare al successivo file in input, sempre
+ripartendo dalla prima regola del programma.
+
+@item
+L'istruzione @code{exit} termina il programma. Quando @`e eseguita
+dall'interno di un'azione (o nel corpo di una funzione), trasferisce
+il controlla alle eventuali istruzioni @code{END}. Se @`e eseguita nel corpo
+di un'istruzione @code{END}, il programma @`e terminato
+immediatamente.  @`E possibile specificare un valore numerico da usare come
+codice di ritorno di @command{awk}.
+
+@item
+Alcune variabili predefinite permettono di controllare @command{awk},
+principalmente per l'I/O.  Altre variabili trasmettono informazioni
+da @command{awk} al programma.
+
+@item
+I vettori @code{ARGC} e @code{ARGV} rendono disponibili al programma gli
+argomenti della riga di comando.  Una loro modifica all'interno di una regola
+@code{BEGIN} permette di controllare come @command{awk} elaborer@`a i @value{DF}
+in input.
+
+@end itemize
+
+@node Vettori
+@chapter Vettori in @command{awk}
+@cindex vettori
+
+Un @dfn{vettore} @`e una tabella di valori chiamati @dfn{elementi}.  Gli
+elementi di un vettore sono individuati dai loro @dfn{indici}.  Gli indici
+possono essere numeri o stringhe.
+
+Questo @value{CHAPTER} descrive come funzionano i vettori in @command{awk},
+come usare gli elementi di un vettore, come visitare tutti gli elementi
+di un vettore, e come rimuovere elementi da un vettore.
+Descrive anche come @command{awk} simula vettori multidimensionali,
+oltre ad alcuni aspetti meno ovvii sull'uso dei vettori.
+Il @value{CHAPTER} prosegue illustrando la funzionalit@`a di ordinamento dei
+vettori di @command{gawk}, e termina con una breve descrizione della capacit@`a
+di @command{gawk} di consentire veri vettori di vettori.
+
+@menu
+* Fondamenti sui vettori::      Informazioni di base sui vettori.
+* Indici numerici di vettore::  Come usare numeri come indici in
+                                @command{awk}.
+* Indici non inizializzati::    Usare variabili non inizializzate come indici.
+* Cancellazione::               L'istruzione @code{delete} toglie un elemento
+                                da un vettore.
+* Vettori multidimensionali::   Emulare vettori multidimensionali in
+                                @command{awk}.
+* Vettori di vettori::          Vettori multidimensionali veri.
+* Sommario dei vettori::        Sommario dei vettori.
+@end menu
+
+@node Fondamenti sui vettori
+@section Informazioni di base sui vettori
+
+Questa @value{SECTION} espone le nozioni fondamentali: elaborare gli elementi
+di un vettore uno alla volta, e visitare sequenzialmente tutti gli elementi
+di un vettore.
+
+@menu
+* Introduzione ai vettori::     Introduzione ai vettori
+* Visitare elementi::           Come esaminare un elemento di un vettore.
+* Impostare elementi::          Come cambiare un elemento di un vettore.
+* Esempio di vettore::          Esempio semplice di vettore
+* Visitare un intero vettore::  Variazione dell'istruzione @code{for}. Esegue
+                                un ciclo attraverso gli indici degli elementi
+                                contenuti in un vettore.
+* Controllare visita::          Controllare l'ordine in cui i vettori sono
+                                visitati.
+@end menu
+
+@node Introduzione ai vettori
+@subsection Introduzione ai vettori
+
+@cindex Wall, Larry
+@quotation
+@i{Visitare sequenzialmente un vettore associativo @`e come tentare di
+lapidare qualcuno usando una mitragliatrice Uzi carica.}
+@author Larry Wall
+@end quotation
+
+Il linguaggio @command{awk} mette a disposizione vettori monodimensionali per
+memorizzare gruppi di stringhe o di numeri correlati fra loro.  Ogni vettore di
+@command{awk} deve avere un nome.  I nomi dei vettori hanno la stessa sintassi
+dei nomi di variabile; qualsiasi nome valido di variabile potrebbe essere anche
+un valido nome di vettore.  Un nome per@`o non pu@`o essere usato in entrambi i
+modi (come vettore e come variabile) nello stesso programma @command{awk}.
+
+I vettori in @command{awk} assomigliano superficialmente ai vettori in altri
+linguaggi di programmazione, ma ci sono differenze fondamentali.  In
+@command{awk}, non @`e necessario specificare la dimensione di un vettore prima
+di iniziare a usarlo.  In pi@`u,  qualsiasi numero o stringa pu@`o essere usato
+come indice di un vettore, non solo numeri interi consecutivi.
+
+Nella maggior parte degli altri linguaggi, i vettori devono essere
+@dfn{dichiarati} prima dell'uso, specificando quanti elementi o componenti
+contengono.  In questi linguaggi, la dichiarazione causa l'allocazione, per
+questi elementi, di un blocco di memoria contiguo.
+Normalmente, un indice di un vettore dev'essere un intero non negativo.
+Per esempio, l'indice zero specifica il primo elemento nel vettore, che @`e
+effettivamente memorizzato all'inizio di un blocco di memoria.  L'indice uno
+specifica il secondo elemento, che @`e memorizzato subito dopo il primo elemento,
+e cos@`{@dotless{i}} via.  @`E impossibile aggiungere ulteriori elementi al vettore, perch@'e
+esso pu@`o contenere solo il numero di elementi dichiarato.
+(Alcuni linguaggi consentono indici iniziali e finali arbitrari---p.es.,
+@samp{15 .. 27}---per@`o la dimensione del vettore rimane fissa una volta che
+il vettore sia stato dichiarato.)
+
+@c 1/2015: Do not put the numeric values into @code. Array element
+@c values are no different than scalar variable values.
+Un vettore contiguo di quattro elementi potrebbe essere come quello in
+@ifnotdocbook
+@ref{vettore-elementi},
+@end ifnotdocbook
+@ifdocbook
+come mostrato in @inlineraw{docbook, <xref linkend="vettore-elementi"/>}:
+@end ifdocbook
+concettualmente, se i valori degli elementi sono 8, @code{"pippo"},
+@code{""} e 30.
+
+@ifnotdocbook
+@float Figura,vettore-elementi
+@caption{Un vettore contiguo}
+@ifset SMALLPRINT
+@center @image{vettore-elementi, 11cm, , Un vettore contiguo}
+@end ifset
+@ifclear SMALLPRINT
+@center @image{vettore-elementi, , , Un vettore contiguo}
+@end ifclear
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="vettore-elementi" float="0">
+<title>Un vettore contiguo</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="vettore-elementi.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+@noindent
+Vengono memorizzati solo i valori; gli indici sono definiti implicitamente
+dall'ordine dei valori. Qui, 8 @`e il valore il cui indice @`e zero, perch@'e 8
+appare nella posizione con zero elementi prima di essa.
+
+@cindex vettori, indicizzazione
+@cindex indicizzare i vettori
+@cindex associativi, vettori
+@cindex vettori associativi
+I vettori in @command{awk} non sono di questo tipo: sono invece
+@dfn{associativi}.
+Ci@`o significa che ogni vettore @`e un insieme di coppie, ognuna costituita
+da un indice e dal corrispondente valore dell'elemento del vettore:
+
+@ifnotdocbook
+@c extra empty column to indent it right
+@multitable @columnfractions .1 .1 .1
+@headitem @tab Indice @tab Valore
+@item @tab @code{3} @tab @code{30}
+@item @tab @code{1} @tab @code{"pippo"}
+@item @tab @code{0} @tab @code{8}
+@item @tab @code{2} @tab @code{""}
+@end multitable
+@end ifnotdocbook
+
+@docbook
+<informaltable>
+<tgroup cols="2">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<thead>
+<row>
+<entry>Indice</entry>
+<entry>Valore</entry>
+</row>
+</thead>
+
+<tbody>
+<row>
+<entry><literal>3</literal></entry>
+<entry><literal>30</literal></entry>
+</row>
+
+<row>
+<entry><literal>1</literal></entry>
+<entry><literal>"pippo"</literal></entry>
+</row>
+
+<row>
+<entry><literal>0</literal></entry>
+<entry><literal>8</literal></entry>
+</row>
+
+<row>
+<entry><literal>2</literal></entry>
+<entry><literal>""</literal></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+@noindent
+Le coppie sono elencate in ordine casuale perch@'e il loro ordinamento @`e
+irrilevante.@footnote{L'ordine potr@`a variare nelle diverse implementazioni
+di @command{awk}, che tipicamente usa tabelle @dfn{hash} per memorizzare
+elementi e valori del vettore.}
+
+Un vantaggio dei vettori associativi @`e che si possono aggiungere nuove coppie
+in qualsiasi momento.  Per esempio, supponiamo di aggiungere al vettore un
+decimo elemento il cui valore sia @w{@code{"numero dieci"}}.  Il risultato sar@`a:
+
+@ifnotdocbook
+@c extra empty column to indent it right
+@multitable @columnfractions .1 .1 .3
+@headitem @tab Indice @tab Valore
+@item @tab @code{10} @tab @code{"numero dieci"}
+@item @tab @code{3} @tab @code{30}
+@item @tab @code{1} @tab @code{"pippo"}
+@item @tab @code{0} @tab @code{8}
+@item @tab @code{2} @tab @code{""}
+@end multitable
+@end ifnotdocbook
+
+@docbook
+<informaltable>
+<tgroup cols="2">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<thead>
+<row>
+<entry>Indice</entry>
+<entry>Valore</entry>
+</row>
+</thead>
+<tbody>
+
+<row>
+<entry><literal>10</literal></entry>
+<entry><literal>"numero dieci"</literal></entry>
+</row>
+
+<row>
+<entry><literal>3</literal></entry>
+<entry><literal>30</literal></entry>
+</row>
+
+<row>
+<entry><literal>1</literal></entry>
+<entry><literal>"pippo"</literal></entry>
+</row>
+
+<row>
+<entry><literal>0</literal></entry>
+<entry><literal>8</literal></entry>
+</row>
+
+<row>
+<entry><literal>2</literal></entry>
+<entry><literal>""</literal></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+@noindent
+@cindex sparsi, vettori
+@cindex vettori sparsi
+Ora il vettore @`e @dfn{sparso}, il che significa semplicemente che non sono
+usati alcuni indici.  Ha gli elementi 0, 1, 2, 3 e 10, ma mancano gli
+elementi 4, 5, 6, 7, 8 e 9.
+
+Un'altra caratteristica dei vettori associativi @`e che gli indici non devono
+essere necessariamente interi non negativi.  Qualsiasi numero, o anche una
+stringa, pu@`o essere un indice.  Per esempio, il seguente @`e un vettore che
+traduce delle parole dall'inglese all'italiano:
+
+@ifnotdocbook
+@multitable @columnfractions .1 .1 .1
+@headitem @tab Indice @tab Valore
+@item @tab @code{"dog"} @tab @code{"cane"}
+@item @tab @code{"cat"} @tab @code{"gatto"}
+@item @tab @code{"one"} @tab @code{"uno"}
+@item @tab @code{1} @tab @code{"uno"}
+@end multitable
+@end ifnotdocbook
+
+@docbook
+<informaltable>
+<tgroup cols="2">
+<colspec colname="1" align="left"/>
+<colspec colname="2" align="left"/>
+<thead>
+<row>
+<entry>Indice</entry>
+<entry>Valore</entry>
+</row>
+</thead>
+<tbody>
+<row>
+<entry><literal>"dog"</literal></entry>
+<entry><literal>"cane"</literal></entry>
+</row>
+
+<row>
+<entry><literal>"cat"</literal></entry>
+<entry><literal>"gatto"</literal></entry>
+</row>
+
+<row>
+<entry><literal>"one"</literal></entry>
+<entry><literal>"uno"</literal></entry>
+</row>
+
+<row>
+<entry><literal>1</literal></entry>
+<entry><literal>"uno"</literal></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+@end docbook
+
+@noindent
+Qui abbiamo deciso di tradurre il numero uno sia nella forma letterale che in
+quella numerica, per illustrare che un singolo vettore pu@`o avere come indici
+sia numeri che stringhe.
+(In effetti, gli indici dei vettori sono sempre stringhe.
+Ci sono alcune sottigliezze su come funzionano i numeri quando sono usati come
+indici dei vettori; questo verr@`a trattato in maggior dettaglio nella
+@ref{Indici numerici di vettore}.)
+Qui sopra, il numero @code{1} non @`e tra doppi apici, perch@'e @command{awk}
+lo converte automaticamente in una stringa.
+
+@cindex @command{gawk}, variabile @code{IGNORECASE} in
+@cindex maiuscolo/minuscolo, distinzione, indici dei vettori e
+@cindex vettori, ordinamento, variabile @code{IGNORECASE} e
+@cindex @code{IGNORECASE}, variabile, indici dei vettori e
+@cindex variabile @code{IGNORECASE}, indici dei vettori e
+Il valore di @code{IGNORECASE} non ha alcun effetto sull'indicizzazione dei
+vettori.  Lo stesso valore di stringa usato per memorizzare un elemento di un
+vettore pu@`o essere usato per richiamarlo.
+Quando @command{awk} crea un vettore (p.es., con la funzione predefinita
+@code{split()}), gli indici di quel vettore sono numeri interi consecutivi
+a partire da uno.
+(@xref{Funzioni per stringhe}.)
+
+I vettori di @command{awk} sono efficienti: il tempo necessario per accedere a
+un elemento @`e indipendente dal numero di elementi nel vettore.
+
+@node Visitare elementi
+@subsection Come esaminare un elemento di un vettore
+@cindex vettori, esaminare elementi
+@cindex vettore, elementi di un
+@cindex elementi di un vettore
+
+Il modo principale di usare un vettore @`e quello di esaminare uno dei suoi
+elementi.  Un @dfn{riferimento al vettore} @`e un'espressione come questa:
+
+@example
+@var{vettore}[@var{espressione-indice}]
+@end example
+
+@noindent
+Qui, @var{vettore} @`e il nome di un vettore.  L'espressione
+@var{espressione-indice} @`e l'indice dell'elemento del vettore che si vuol
+esaminare.
+
+@c 1/2015: Having the 4.3 in @samp is a little iffy. It's essentially
+@c an expression though, so leave be. It's to early in the discussion
+@c to mention that it's really a string.
+Il valore del riferimento al vettore @`e il valore corrente di quell'elemento
+del vettore.  Per esempio, @code{pippo[4.3]} @`e un'espressione che richiama
+l'elemento del vettore @code{pippo} il cui indice @`e @samp{4.3}.
+
+@cindex vettori, elementi non assegnati
+@cindex elementi di vettore non assegnati
+@cindex elementi di vettore vuoti
+Un riferimento a un elemento di un vettore il cui indice non esiste ancora
+restituisce un valore uguale a @code{""}, la stringa nulla.  Questo comprende
+elementi a cui non @`e stato assegnato un valore ed elementi che sono stati
+eliminati (@pxref{Cancellazione}).
+
+@cindex elementi inesistenti di un vettore
+@cindex vettori, elementi che non esistono
+@quotation NOTA
+Un riferimento a un elemento inesistente crea @emph{automaticamente}
+quell'elemento di vettore, con la stringa nulla come valore.  (In certi casi,
+ci@`o @`e indesiderabile, perch@'e potrebbe sprecare memoria all'interno di
+@command{awk}.)
+
+I programmatori principianti di @command{awk} fanno spesso l'errore di
+verificare se un elemento esiste controllando se il valore @`e vuoto:
+
+@example
+# Verifica se "pippo" esiste in a:         @ii{Non corretto!}
+if (a["pippo"] != "") @dots{}
+@end example
+
+@noindent
+Questo @`e sbagliato per due motivi. Primo, @emph{crea} @code{a["pippo"]}
+se ancora non esisteva! Secondo, assegnare a un elemento di un vettore la
+stringa vuota come valore @`e un'operazione valida (anche se un po' insolita).
+@end quotation
+
+@c @cindex arrays, @code{in} operator and
+@cindex @code{in}, operatore, verificare se un elemento esiste in un vettore
+Per determinare se un elemento con un dato indice esiste in un vettore,
+si usi la seguente espressione:
+
+@example
+@var{indice} in @var{vettore}
+@end example
+
+@cindex effetti collaterali, indicizzazione di vettori
+@noindent
+Quest'espressione verifica se lo specifico indice @var{indice} esiste, senza
+l'effetto collaterale di creare quell'elemento nel caso che esso non sia
+presente.  L'espressione ha il valore uno (vero) se
+@code{@var{vettore}[@var{indice}]}
+esiste e zero (falso) se non esiste.
+@c (Qui usiamo @var{indx}, perch@'e @samp{index} @`e il nome di una funzione
+@c predefinita.)
+Per esempio, quest'istruzione verifica se il vettore @code{frequenze}
+contiene l'indice @samp{2}:
+
+@example
+@group
+if (2 in frequenze)
+    print "L'indice 2 @`e presente."
+@end group
+@end example
+
+Si noti che questo @emph{non} verifica se il vettore
+@code{frequenze} contiene un elemento il cui @emph{valore} @`e 2.
+Il solo modo far questo @`e quello di passare in rassegna tutti gli
+elementi.  Inoltre, questo @emph{non} crea @code{frequenze[2]}, mentre la
+seguente alternativa (non corretta) lo fa:
+
+@example
+@group
+if (frequenze[2] != "")
+    print "L'indice 2 @`e presente."
+@end group
+@end example
+
+@node Impostare elementi
+@subsection Assegnare un valore a elementi di un vettore
+@cindex vettori, elementi, assegnare valori
+@cindex elementi di vettori, assegnare valori
+
+Agli elementi di un vettore possono essere assegnati valori proprio come
+alle variabili di @command{awk}:
+
+@example
+@var{vettore}[@var{espressione-indice}] = @var{valore}
+@end example
+
+@noindent
+@var{vettore} @`e il nome di un vettore.  L'espressione
+@var{espressione-indice} @`e l'indice dell'elemento del vettore a cui @`e
+assegnato il valore.  L'espressione @var{valore} @`e il valore da assegnare
+a quell'elemento del vettore.
+
+@node Esempio di vettore
+@subsection Esempio semplice di vettore
+@cindex vettori, un esempio sull'uso
+
+Il seguente programma prende una lista di righe, ognuna delle quali inizia con
+un numero di riga, e le stampa in ordine di numero di riga.  I numeri di riga
+non sono ordinati al momento della lettura, ma sono invece in ordine sparso.
+Questo programma ordina le righe mediante la creazione di un vettore che usa
+i numeri di riga come indici.  Il programma stampa poi le righe
+ordinate secondo il loro numero.  @`E un programma molto semplice e non @`e in
+grado di gestire numeri ripetuti, salti di riga o righe che non
+iniziano con un numero:
+
+@example
+@c file eg/misc/arraymax.awk
+@{
+    if ($1 > massimo)
+        massimo = $1
+    vett[$1] = $0
+@}
+
+END @{
+    for (x = 1; x <= massimo; x++)
+        print vett[x]
+@}
+@c endfile
+@end example
+
+La prima regola tiene traccia del numero di riga pi@`u grande visto
+durante la lettura;
+memorizza anche ogni riga nel vettore @code{vett}, usando come indice
+il numero di riga.
+La seconda regola viene eseguita dopo che @`e stato letto tutto l'input, per
+stampare tutte le righe.
+Quando questo programma viene eseguito col seguente input:
+
+@example
+@group
+@c file eg/misc/arraymax.data
+5  Io sono l'uomo Cinque
+2  Chi sei?  Il nuovo numero due!
+4  . . . E quattro a terra
+1  Chi @`e il numero uno?
+3  Sei il tre.
+@c endfile
+@end group
+@end example
+
+@noindent
+Il suo output @`e:
+
+@example
+@group
+1  Chi @`e il numero uno?
+2  Chi sei?  Il nuovo numero due!
+3  Sei il tre.
+4  . . . E quattro a terra
+5  Io sono l'uomo Cinque
+@end group
+@end example
+
+Se un numero di riga appare pi@`u di una volta, l'ultima riga con quel dato
+numero prevale sulle altre.
+Le righe non presenti nel vettore
+si possono saltare con un semplice perfezionamento della
+regola @code{END} del programma, in questo modo:
+
+@example
+@group
+END @{
+    for (x = 1; x <= massimo; x++)
+        if (x in vett)
+            print vett[x]
+@}
+@end group
+@end example
+
+@node Visitare un intero vettore
+@subsection Visitare tutti gli elementi di un vettore
+@cindex elementi di vettori, visitare
+@cindex visitare vettori
+@cindex vettori, visitare
+@cindex cicli, @code{for}, visita di un vettore
+
+Nei programmi che usano vettori, @`e spesso necessario usare un ciclo che
+esegue un'azione su ciascun elemento di un vettore.  In altri linguaggi, dove
+i vettori sono contigui e gli indici sono limitati ai numeri interi
+non negativi,
+questo @`e facile: tutti gli indici validi possono essere visitati partendo
+dall'indice pi@`u basso  e arrivando a quello pi@`u alto.  Questa tecnica non
+@`e applicabile in @command{awk}, perch@'e qualsiasi numero o stringa pu@`o
+fare da indice in un vettore.  Perci@`o @command{awk} ha un tipo speciale di
+istruzione @code{for} per visitare un vettore:
+
+@example
+@group
+for (@var{variabile} in @var{vettore})
+    @var{corpo}
+@end group
+@end example
+
+@noindent
+@cindex @code{in}, operatore, uso in cicli
+@cindex operatore @code{in}, uso in cicli
+Questo ciclo esegue @var{corpo} una volta per ogni indice in @var{vettore} che
+il programma ha usato precedentemente, con la variabile @var{variabile}
+impostata a quell'indice.
+
+@cindex vettori, istruzione @code{for} e
+@cindex @code{for}, istruzione, esecuzione di cicli su un vettore
+Il seguente programma usa questa forma dell'istruzione @code{for}.  La
+prima regola visita i record in input e tiene nota di quali parole appaiono
+(almeno una volta) nell'input, memorizzando un 1 nel vettore @code{usate} con
+la parola come indice.  La seconda regola visita gli elementi di
+@code{usate} per trovare tutte le parole distinte che appaiono nell'input.
+Il programma stampa poi ogni parola che @`e pi@`u lunga di 10 caratteri e
+anche il numero di tali parole.
+@xref{Funzioni per stringhe}
+per maggiori informazioni sulla funzione predefinita @code{length()}.
+
+@example
+@group
+# Registra un 1 per ogni parola usata almeno una volta
+@{
+    for (i = 1; i <= NF; i++)
+        usate[$i] = 1
+@}
+@end group
+
+@group
+# Trova il numero di parole distinte lunghe pi@`u di 10 caratteri
+END @{
+    for (x in usate) @{
+        if (length(x) > 10) @{
+            ++numero_parole_lunghe
+            print x
+        @}
+    @}
+    print numero_parole_lunghe, "parole pi@`u lunghe di 10 caratteri"
+@}
+@end group
+@end example
+
+@noindent
+@xref{Programma utilizzo parole}
+per un esempio di questo tipo pi@`u dettagliato.
+
+@cindex vettori, elementi di, ordine di accesso da parte dell'operatore @code{in}
+@cindex elementi di vettori, ordine di accesso da parte dell'operatore @code{in}
+@cindex @code{in}, operatore, ordine di accesso dei vettori
+@cindex operatore @code{in}, ordine di accesso dei vettori
+L'ordine nel quale gli elementi del vettore sono esaminati da quest'istruzione
+@`e determinato dalla disposizione interna degli elementi del vettore all'interno
+di @command{awk} e nell'@command{awk} standard non pu@`o essere controllato
+o cambiato.  Questo pu@`o portare a dei problemi se vengono aggiunti nuovi
+elementi al @var{vettore} dall'istruzione eseguendo il corpo del ciclo;
+non @`e prevedibile se il ciclo @code{for} li potr@`a raggiungere.  Similmente,
+modificare @var{variabile} all'interno del ciclo potrebbe produrre strani
+risultati.  @`E meglio evitare di farlo.
+
+Di sicuro, @command{gawk} imposta la lista di elementi su cui eseguire
+l'iterazione prima che inizi il ciclo, e non la cambia in corso d'opera.
+Ma non tutte le versioni di @command{awk} fanno cos@`{@dotless{i}}. Si consideri questo
+programma, chiamato @file{vediciclo.awk}:
+
+@example
+BEGIN @{
+    a["questo"] = "questo"
+    a["@`e"] = "@`e"
+    a["un"] = "un"
+    a["ciclo"] = "ciclo"
+    for (i in a) @{
+        j++
+        a[j] = j
+        print i
+    @}
+@}
+@end example
+
+Ecco quel che accade quando viene eseguito con @command{gawk} (e @command{mawk}):
+
+@example
+$ @kbd{gawk -f vediciclo.awk}
+@print{} questo
+@print{} ciclo
+@print{} un
+@print{} @`e
+@end example
+
+Se si usa invece BWK @command{awk}:
+
+@example
+$ @kbd{nawk -f vediciclo.awk}
+@print{} ciclo
+@print{} questo
+@print{} @`e
+@print{} un
+@print{} 1
+@end example
+
+@node Controllare visita
+@subsection Visita di vettori in ordine predefinito con @command{gawk}
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SUBSECTION} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+
+Per default, quando un ciclo @code{for} visita un vettore, l'ordine
+@`e indeterminato, il che vuol dire che l'implementazione di @command{awk}
+determina l'ordine in cui il vettore viene attraversato.
+Quest'ordine normalmente @`e basato sull'implementazione interna dei vettori
+e varia da una versione di @command{awk} alla successiva.
+
+@cindex vettori, ordine di visita, controllo dell'
+@cindex controllare l'ordine di visita dei vettori
+Spesso, tuttavia, servirebbe fare qualcosa di semplice, come
+``visitare  il vettore confrontando gli indici in ordine crescente,''
+o ``visitare il vettore confrontando i valori in ordine decrescente.''
+@command{gawk} fornisce due meccanismi che permettono di farlo.
+
+@itemize @value{BULLET}
+@item
+Assegnare a @code{PROCINFO["sorted_in"]} un valore a scelta fra
+alcuni valori predefiniti.
+Si vedano pi@`u sotto i valori ammessi.
+
+@item
+Impostare @code{PROCINFO["sorted_in"]} al nome di una funzione definita
+dall'utente, da usare per il confronto tra gli elementi di un vettore. Questa
+funzionalit@`a avanzata verr@`a descritta in seguito in @ref{Ordinamento di vettori}.
+@end itemize
+
+@cindex @code{PROCINFO}, valori di @code{sorted_in}
+Sono disponibili i seguenti valori speciali per @code{PROCINFO["sorted_in"]}:
+
+@table @code
+@item "@@unsorted"
+Lasciare gli elementi del vettore in ordine arbitrario
+(questo @`e il comportamento di default di @command{awk}).
+
+@item "@@ind_str_asc"
+Ordinare in ordine crescente di indice, confrontando tra loro gli indici
+come stringhe; questo @`e l'ordinamento pi@`u normale.
+(Internamente, gli indici dei vettori sono sempre stringhe, per cui con
+@samp{a[2*5] = 1} l'indice @`e la stringa @code{"10"} e non il numero 10.)
+
+@item "@@ind_num_asc"
+Ordinare in ordine crescente di indice, ma nell'elaborazione gli indici vengono
+trattati come numeri.  Gli indici con valore non numerico verranno posizionati
+come se fossero uguali a zero.
+
+@item "@@val_type_asc"
+Ordinare secondo il valore degli elementi in ordine crescente (invece che in
+base agli indici).  L'ordinamento @`e in base al tipo assegnato all'elemento
+(@pxref{Tipi di variabile e confronti}).
+Tutti i valori numerici precedono tutti i valori di tipo stringa,
+che a loro volta vengono prima dei sottovettori.
+(I sottovettori non sono ancora stati descritti;
+@pxref{Vettori di vettori}.)
+
+@item "@@val_str_asc"
+Ordinare secondo il valore degli elementi in ordine crescente (invece che in
+base agli indici).  I valori scalari sono confrontati come stringhe.
+I sottovettori, se presenti, vengono per ultimi.
+
+@item "@@val_num_asc"
+Ordinare secondo il valore degli elementi in ordine crescente (invece che in
+base agli indici).  I valori scalari sono confrontati come numeri.
+I sottovettori, se presenti, vengono per ultimi.
+Quando i valori numerici coincidono, vengono usati i valori di tipo stringa
+per stabilire un ordinamento: ci@`o garantisce risultati coerenti tra differenti
+versioni della funzione C @code{qsort()},@footnote{Quando due elementi
+risultano uguali, la funzione C @code{qsort()} non garantisce
+che dopo l'ordinamento venga rispettato il loro ordine relativo originale.
+Usando il valore di stringa per stabilire un ordinamento univoco quando i
+valori numerici sono uguali assicura che il comportamento di @command{gawk}
+sia coerente in differenti ambienti.} che @command{gawk} usa internamente
+per effettuare l'ordinamento.
+
+@item "@@ind_str_desc"
+Ordinare come fa @code{"@@ind_str_asc"}, ma gli
+indici di tipo stringa sono ordinati dal pi@`u alto al pi@`u basso.
+
+@item "@@ind_num_desc"
+Ordinare come fa @code{"@@ind_num_asc"}, ma gli
+indici numerici sono ordinati dal pi@`u alto al pi@`u basso.
+
+@item "@@val_type_desc"
+Ordinare come fa @code{"@@val_type_asc"}, ma i valori
+degli elementi, a seconda del tipo, sono ordinati dal pi@`u alto al pi@`u basso.
+I sottovettori, se presenti, vengono per primi.
+
+@item "@@val_str_desc"
+Ordinare come fa @code{"@@val_str_asc"}, ma i valori degli
+elementi, trattati come stringhe, sono ordinati dal pi@`u alto al pi@`u basso.
+I sottovettori, se presenti, vengono per primi.
+
+@item "@@val_num_desc"
+Ordinare come fa @code{"@@val_num_asc"}, ma i valori degli
+elementi, trattati come numeri, sono ordinati dal pi@`u alto al pi@`u basso.
+I sottovettori, se presenti, vengono per primi.
+@end table
+
+L'ordine in cui il vettore @`e visitato viene determinato prima di iniziare
+l'esecuzione del ciclo @code{for}. Cambiare @code{PROCINFO["sorted_in"]}
+all'interno del corpo del ciclo non influisce sul ciclo stesso.
+Per esempio:
+
+@example
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+> @kbd{   a[4] = 4}
+> @kbd{   a[3] = 3}
+> @kbd{   for (i in a)}
+> @kbd{       print i, a[i]}
+> @kbd{@}'}
+@print{} 4 4
+@print{} 3 3
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+> @kbd{   PROCINFO["sorted_in"] = "@@ind_str_asc"}
+> @kbd{   a[4] = 4}
+> @kbd{   a[3] = 3}
+> @kbd{   for (i in a)}
+> @kbd{       print i, a[i]}
+> @kbd{@}'}
+@print{} 3 3
+@print{} 4 4
+@end example
+
+Quando si ordina un vettore in base al valore dei suoi elementi, se viene
+trovato un valore che @`e un sottovettore, questo @`e considerato pi@`u grande di
+qualsiasi stringa o valore numerico, indipendentemente da quel che contiene
+lo stesso sottovettore, e tutti i sottovettori sono trattati come se fossero
+l'uno uguale all'altro.  Il loro ordine reciproco @`e determinato dai loro
+indici, visti come stringhe.
+
+Di seguito sono elencati alcuni punti da tener presenti sulla visita
+ordinata dei vettori:
+
+@itemize @value{BULLET}
+@item
+Il valore di @code{PROCINFO["sorted_in"]} @`e globale. Cio@`e, ha effetto su tutti
+i cicli @code{for} relativi a qualsiasi vettore.  Se si deve cambiarlo
+all'interno del proprio codice, si dovrebbe vedere se era gi@`a stato
+definito in precedenza, e salvare il valore relativo, per ripristinarlo
+successivamente:
+
+@example
+@dots{}
+if ("sorted_in" in PROCINFO) @{
+    ordine_salvato = PROCINFO["sorted_in"]
+    PROCINFO["sorted_in"] = "@@val_str_desc" # o qualcos'altro
+@}
+@dots{}
+if (ordine_salvato)
+    PROCINFO["sorted_in"] = ordine_salvato
+@end example
+
+@item
+Come gi@`a accennato, l'ordine di visita di default del vettore
+@`e rappresentato da @code{"@@unsorted"}.  Si pu@`o ottenere il comportamento di
+default anche assegnando la stringa nulla a @code{PROCINFO["sorted_in"]} o
+semplicemente eliminando l'elemento @code{"sorted_in"} dal vettore
+@code{PROCINFO} con l'istruzione @code{delete}.
+(L'istruzione @code{delete} non @`e stata ancora descritta; @pxref{Cancellazione}.)
+@end itemize
+
+Inoltre, @command{gawk} fornisce funzioni predefinite per l'ordinamento
+dei vettori; si veda @ref{Funzioni di ordinamento di vettori}.
+
+@node Indici numerici di vettore
+@section Usare numeri per indicizzare i vettori
+
+@cindex numeri, come indici di vettore
+@cindex indici di vettori, numeri come
+@cindex vettori, indici numerici di
+@cindex variabile @code{CONVFMT}, indici di vettore e
+@cindex @code{CONVFMT}, variabile, indici di vettore e
+Un aspetto importante da ricordare riguardo ai vettori @`e che
+@emph{gli indici dei vettori sono sempre stringhe}.
+Quando un valore numerico @`e usato come indice,
+viene convertito in un valore di tipo stringa prima di essere usato per
+l'indicizzazione (@pxref{Conversione}).
+Ci@`o vuol dire che il valore della variabile predefinita @code{CONVFMT} pu@`o
+influire su come un programma ha accesso agli elementi di un vettore.
+Per esempio:
+
+@example
+xyz = 12.153
+dati[xyz] = 1
+CONVFMT = "%2.2f"
+if (xyz in dati)
+    printf "%s @`e in dati\n", xyz
+else
+    printf "%s non @`e in dati\n", xyz
+@end example
+
+@noindent
+Il risultato @`e @samp{12.15 non @`e in dati}.  La prima istruzione d@`a a
+@code{xyz} un valore numerico.  L'assegnamento a @code{dati[xyz]}
+indicizza @code{dati} col valore di tipo stringa @code{"12.153"}
+(usando il valore di conversione di default @code{CONVFMT}, @code{"%.6g"}).
+Quindi, all'elemento del vettore @code{dati["12.153"]} @`e assegnato il valore
+uno.  Il programma cambia poi
+il valore di @code{CONVFMT}.  La verifica @samp{(xyz in dati)} genera un nuovo
+valore di stringa da @code{xyz}---questa volta @code{"12.15"}---perch@'e il
+valore di @code{CONVFMT} consente solo due cifre decimali.  Questa
+verifica d@`a esito negativo, perch@'e @code{"12.15"} @`e diverso da @code{"12.153"}.
+
+@cindex convertire numeri interi che sono indici di vettore
+@cindex numeri interi, indici di vettore
+Secondo le regole di conversione
+(@pxref{Conversione}), i valori numerici interi
+vengono convertiti in stringhe sempre come interi, indipendentemente dal
+valore che potrebbe avere @code{CONVFMT}.  E infatti il caso
+seguente produce il risultato atteso:
+
+@example
+for (i = 1; i <= maxsub; i++)
+    @ii{fa qualcosa con} vettore[i]
+@end example
+
+La regola ``i valori numerici interi si convertono sempre in stringhe intere''
+ha un'altra conseguenza per l'indicizzazione dei vettori.
+Le costanti ottali ed esadecimali
+@ifnotdocbook
+(@pxref{Numeri non-decimali})
+@end ifnotdocbook
+@ifdocbook
+(trattate in @ref{Numeri non-decimali})
+@end ifdocbook
+vengono convertite internamente in numeri, e la loro forma originale
+non viene pi@`u ricordata.  Ci@`o significa, per esempio, che
+@code{vettore[17]},
+@code{vettore[021]} e
+@code{vettore[0x11]} fanno riferimento tutti allo stesso
+elemento!
+
+Come molte cose in @command{awk}, molto spesso le cose
+funzionano come ci si aspetta.  @`E utile comunque avere una
+conoscenza precisa delle regole applicate, poich@'e a volte possono avere
+effetti difficili da individuare sui programmi.
+
+@node Indici non inizializzati
+@section Usare variabili non inizializzate come indici
+
+@cindex variabili non inizializzate, come indici di vettore
+@cindex non inizializzate, variabili, come indici di vettore
+@cindex indici di vettore, variabili non inizializzate come
+@cindex vettori, indici, variabili non inizializzate come
+Supponiamo che sia necessario scrivere un programma
+per stampare i dati di input in ordine inverso.
+Un tentativo ragionevole per far ci@`o (con qualche dato di
+prova) potrebbe essere qualcosa di questo tipo:
+
+@example
+$ @kbd{echo 'riga 1}
+> @kbd{riga 2}
+> @kbd{riga 3' | awk '@{ l[righe] = $0; ++righe @}}
+> @kbd{END @{}
+>     @kbd{for (i = righe - 1; i >= 0; i--)}
+>        @kbd{print l[i]}
+> @kbd{@}'}
+@print{} riga 3
+@print{} riga 2
+@end example
+
+Sfortunatamente, la prima riga di dati in input non appare
+nell'output!
+
+A prima vista, verrebbe da dire che questo programma avrebbe dovuto
+funzionare.  La variabile @code{righe}
+non @`e inizializzata, e le variabili non inizializzate hanno il valore numerico
+zero.  Cos@`{@dotless{i}}, @command{awk} dovrebbe aver stampato il valore @code{l[0]}.
+
+Qui il problema @`e che gli indici per i vettori di @command{awk} sono
+@emph{sempre} stringhe. Le variabili non inizializzate, quando sono usate come
+stringhe, hanno il valore @code{""}, e non zero.  Quindi, @samp{riga 1}
+finisce per essere memorizzata in @code{l[""]}.
+La seguente variante del programma funziona correttamente:
+
+@example
+@{ l[righe++] = $0 @}
+END @{
+    for (i = righe - 1; i >= 0; i--)
+       print l[i]
+@}
+@end example
+
+Qui, @samp{++} forza @code{righe} a essere di tipo numerico, rendendo
+quindi il ``vecchio valore'' uno zero numerico. Questo viene poi convertito
+in @code{"0"} come l'indice del vettore.
+
+@cindex indici di vettore, stringhe nulle come
+@cindex nulle, stringhe, come indici di vettore
+@cindex stringhe nulle, come indici di vettore
+@cindex angolo buio, indici di vettori
+@cindex @dfn{lint}, controlli, indici di vettori
+@cindex controlli @dfn{lint}, indici di vettori
+Anche se la cosa pu@`o sembrare strana, la stringa nulla
+(@code{""}) @`e un indice di vettore valido.
+@value{DARKCORNER}
+Se viene fornita l'opzione @option{--lint} sulla riga di comando
+@pxref{Opzioni}), @command{gawk} avvisa quando la stringa nulla viene usata
+come indice.
+
+@node Cancellazione
+@section L'istruzione @code{delete}
+@cindex @code{delete}, istruzione
+@cindex istruzione @code{delete}
+@cindex eliminare elementi di vettori
+@cindex vettori, elementi, eliminazione di
+@cindex elementi di vettori, eliminazione di
+
+Per rimuovere un singolo elemento da un vettore si usa l'istruzione
+@code{delete}:
+
+@example
+delete @var{vettore}[@var{espressione-indice}]
+@end example
+
+Una volta che un elemento di un vettore @`e stato eliminato, il valore che aveva
+quell'elemento non @`e pi@`u disponibile. @`E come se quell'elemento non sia
+mai stato referenziato oppure come se non gli sia mai stato assegnato un
+valore.  Il seguente @`e un esempio di eliminazione di elementi da un vettore:
+
+@example
+for (i in frequenze)
+    delete frequenze[i]
+@end example
+
+@noindent
+Quest'esempio rimuove tutti gli elementi dal vettore @code{frequenze}.  Una
+volta che un elemento @`e stato eliminato, una successiva istruzione @code{for}
+che visiti il vettore non trover@`a quell'elemento, e l'uso dell'operatore
+@code{in} per controllare la presenza di quell'elemento restituisce zero (cio@`e
+falso):
+
+@example
+delete pippo[4]
+if (4 in pippo)
+    print "Questo non verr@`a mai stampato"
+@end example
+
+@cindex nulle, stringhe, eliminazione di elementi di un vettore e
+@cindex stringhe nulle, eliminazione di elementi di un vettore e
+@`E importante notare che eliminare un elemento @emph{non} @`e la stessa cosa
+che assegnargli un valore nullo (la stringa vuota, @code{""}).
+Per esempio:
+
+@example
+@group
+pippo[4] = ""
+if (4 in pippo)
+  print "Questa riga viene stampata, anche se pippo[4] @`e vuoto"
+@end group
+@end example
+
+@cindex @dfn{lint}, controlli, elementi di vettori
+@cindex controlli @dfn{lint}, elementi di vettori
+@cindex elementi di vettori, controlli @dfn{lint} per
+Non @`e un errore eliminare un elemento che non esiste.
+Tuttavia, se viene data l'opzione @option{--lint} sulla riga di comando
+(@pxref{Opzioni}),
+@command{gawk} emette un messaggio di avvertimento quando viene eliminato un
+elemento che non @`e presente in un vettore.
+
+@cindex comuni, estensioni, @code{delete} per eliminare interi vettori
+@cindex estensioni comuni@comma{} @code{delete} per eliminare interi vettori
+@cindex vettori, eliminare l'intero contenuto
+@cindex eliminare interi vettori
+@cindex @code{delete}, @var{vettore}
+@cindex differenze tra @command{awk} e @command{gawk}, elementi dei vettori, eliminazione
+Tutti gli elementi di un vettore possono essere eliminati con una singola
+istruzione omettendo l'indice nell'istruzione @code{delete},
+in questo modo:
+
+
+@example
+delete @var{vettore}
+@end example
+
+L'uso di questa versione dell'istruzione @code{delete} @`e circa tre volte pi@`u
+efficiente dell'equivalente ciclo che elimina gli elementi uno
+alla volta.
+
+Questa forma dell'istruzione @code{delete} @`e ammessa anche
+da BWK @command{awk} e da @command{mawk}, e anche da
+diverse altre implementazioni.
+
+@cindex Brian Kernighan, @command{awk} di
+@quotation NOTA
+Per molti anni, l'uso di @code{delete} senza un indice era un'estensione
+comune.  A settembre 2012 si @`e deciso di includerla nello
+standard POSIX.  Si veda @uref{http://austingroupbugs.net/view.php?id=544,
+il sito dell'Austin Group}.
+@end quotation
+
+@cindex portabilit@`a, eliminazione di elementi di un vettore
+@cindex Brennan, Michael
+La seguente istruzione fornisce un modo portabile, anche se non evidente,
+per svuotare un vettore:@footnote{Un ringraziamento a Michael
+Brennan per la segnalazione.}
+
+@example
+split("", vettore)
+@end example
+
+@cindex @code{split()}, funzione, eliminazione di elementi di vettori
+@cindex funzione @code{split()}, eliminazione di elementi di vettori
+La funzione @code{split()}
+(@pxref{Funzioni per stringhe})
+dapprima svuota il vettore indicato. La chiamata chiede di dividere
+la stringa nulla. Poich@'e non c'@`e nulla da dividere, la
+funzione si limita a svuotare il vettore e poi termina.
+
+@quotation ATTENZIONE
+L'eliminazione di tutti gli elementi di un vettore non cambia il suo tipo; non
+si pu@`o svuotare un vettore e poi usare il nome del vettore come scalare
+(cio@`e, come una variabile semplice). Per esempio, questo non @`e consentito:
+
+@example
+a[1] = 3
+delete a
+a = 3
+@end example
+@end quotation
+
+@node Vettori multidimensionali
+@section Vettori multidimensionali
+
+@menu
+* Visitare vettori multidimensionali::  Visitare vettori multidimensionali.
+@end menu
+
+@cindex indici di vettori multidimensionali
+@cindex vettori multidimensionali
+@cindex multidimensionali, vettori
+Un @dfn{vettore multidimensionale} @`e un vettore in cui un elemento @`e
+identificato da un insieme di indici invece che da un indice singolo.  Per
+esempio, un vettore bidimenisonale richiede due indici.  Il modo consueto (in
+molti linguaggi, compreso @command{awk}) per far riferimento a un elemento di
+un vettore multidimensionale chiamato @code{griglia} @`e con
+@code{griglia[@var{x},@var{y}]}.
+
+@cindex @code{SUBSEP}, variabile, vettori multidimensionali e
+@cindex variabile @code{SUBSEP}, vettori multidimensionali e
+I vettori multidimensionali sono resi disponibili in @command{awk} attraverso
+la concatenazione di pi@`u indici in una stringa;
+@command{awk} converte gli indici in stringhe
+(@pxref{Conversione}) e
+le concatena assieme, inserendo un separatore tra ognuna di loro.  Ne
+risulta una sola stringa che include i valori di ogni indice.  La
+stringa cos@`{@dotless{i}} composta viene usata come un singolo indice in un vettore
+ordinario monodimensionale.  Il separatore usato @`e il valore della variabile
+predefinita @code{SUBSEP}.
+
+Per esempio, supponiamo di valutare l'espressione @samp{pippo[5,12] = "valore"}
+quando il valore di @code{SUBSEP} @`e @code{"@@"}.  I numeri 5 e 12 vengono
+convertiti in stringhe che sono poi
+concatenate con un @samp{@@} tra di essi, dando @code{"5@@12"}; di conseguenza,
+l'elemento del vettore @code{pippo["5@@12"]} @`e impostato a @code{"valore"}.
+
+Una volta che il valore dell'elemento @`e memorizzato, @command{awk}
+ignora se sia stato memorizzato con un solo indice o con una
+serie di indici.  Le due espressioni @samp{pippo[5,12]} e
+@w{@samp{pippo[5 SUBSEP 12]}} sono sempre equivalenti.
+
+Il valore di default di @code{SUBSEP} @`e la stringa @code{"\034"},
+che contiene un carattere non stampabile che difficilmente appare in
+un programma di @command{awk} e nella maggior parte dei dati di input.
+Il vantaggio di scegliere un carattere improbabile discende dal fatto che i
+valori degli indici che contengono una stringa corrispondente a @code{SUBSEP}
+possono portare a stringhe risultanti ambigue.  Supponendo che
+@code{SUBSEP} valga @code{"@@"}, @w{@samp{pippo["a@@b", "c"]}} e
+@w{@samp{pippo["a", "b@@c"]}} risultano indistinguibili perch@'e entrambi
+sarebbero in realt@`a memorizzati come @samp{pippo["a@@b@@c"]}.
+
+@cindex @code{in}, operatore, verificare se un elemento esiste in un vettore multidimensionale
+Per verificare se una determinata sequenza di indici esiste in un vettore
+multidimensionale, si usa lo stesso operatore (@code{in}) che viene usato
+per i vettori monodimensionali.  Si scrive l'intera sequenza di indici tra
+parentesi, separati da virgole, come operando di sinistra:
+
+@example
+if ((@var{indice1}, @var{indice2}, @dots{}) in @var{vettore})
+    @dots{}
+@end example
+
+Qui vediamo un esempio, avendo in input un vettore bidimensionale
+di campi, ruota questo vettore di 90 gradi in senso orario e stampa il
+risultato.  Si suppone che tutte le righe in input contengano lo stesso
+numero di elementi:
+
+@example
+@{
+     if (max_nf < NF)
+          max_nf = NF
+     max_nr = NR
+     for (x = 1; x <= NF; x++)
+          vettore[x, NR] = $x
+@}
+
+END @{
+     for (x = 1; x <= max_nf; x++) @{
+          for (y = max_nr; y >= 1; --y)
+               printf("%s ", vettore[x, y])
+          printf("\n")
+     @}
+@}
+@end example
+
+@noindent
+Dato l'input:
+
+@example
+@group
+1 2 3 4 5 6
+2 3 4 5 6 1
+3 4 5 6 1 2
+4 5 6 1 2 3
+@end group
+@end example
+
+@noindent
+il programma produce il seguente output:
+
+@example
+@group
+4 3 2 1
+5 4 3 2
+6 5 4 3
+1 6 5 4
+2 1 6 5
+3 2 1 6
+@end group
+@end example
+
+@node Visitare vettori multidimensionali
+@subsection Visitare vettori multidimensionali
+
+Non c'@`e un'istruzione @code{for} particolare per visitare un
+vettore ``multidimensionale''. Non ce ne pu@`o essere una, perch@'e
+@command{awk} in realt@`a non ha
+vettori o elementi multidimensionali: c'@`e solo una modalit@`a
+multidimensionale per @emph{accedere} a un vettore.
+
+@cindex indici di vettori multidimensionali, visitare gli
+@cindex vettori, multidimensionali, visitare
+@cindex visitare vettori multidimensionali
+Comunque, se un programma ha un vettore al quale si accede sempre in
+modalit@`a multidimensionale, si pu@`o ottenere il risultato di visitarlo
+combinando l'istruzione di visita @code{for}
+(@pxref{Visitare un intero vettore}) con la funzione
+interna @code{split()}
+(@pxref{Funzioni per stringhe}).
+Si procede nel seguente modo:
+
+@example
+for (indice_combinato in vettore) @{
+    split(indice_combinato, indici_separati, SUBSEP)
+    @dots{}
+@}
+@end example
+
+@noindent
+Questo imposta la variabile @code{indice_combinato} a ogni
+concatenazione di indici contenuta nel vettore, e la suddivide
+nei singoli indici separandoli
+in corrispondenza del valore di
+@code{SUBSEP}.  I singoli indici diventano poi gli elementi
+del vettore @code{indici_separati}.
+
+Perci@`o, se un valore @`e stato precedentemente memorizzato in
+@code{vettore[1, "pippo"]}, esiste in @code{vettore} un elemento con indice
+@code{"1\034pippo"} (ricordare che il valore di default di @code{SUBSEP}
+@`e il carattere con codice ottale 034).
+Prima o poi, l'istruzione @code{for} trova quell'indice e fa un'iterazione
+con la variabile @code{indice_combinato} impostata a @code{"1\034pippo"}.
+Poi viene chiamata la funzione @code{split()} in questo modo:
+
+@example
+split("1\034pippo", indici_separati, "\034")
+@end example
+
+@noindent
+Il risultato @`e quello di impostare @code{indici_separati[1]} a @code{"1"} e
+@code{indici_separati[2]} a @code{"pippo"}.  Ecco fatto!
+La sequenza originale degli indici separati @`e ripristinata.
+
+
+@node Vettori di vettori
+@section Vettori di vettori
+@cindex vettori di vettori
+
+@command{gawk} migliora l'accesso ai vettori multidimensionali di
+@command{awk} standard e mette a disposizione dei veri vettori di vettori.
+Agli elementi di un sottovettore si fa riferimento tramite il loro indice
+racchiuso tra parentesi quadre, proprio come gli elementi del vettore
+principale.  Per esempio, quel che segue crea un sottovettore con due elementi
+all'indice @code{1} del vettore principale @code{a}:
+
+@example
+a[1][1] = 1
+a[1][2] = 2
+@end example
+
+Questo simula un vero vettore bidimensionale. Ogni elemento di un sottovettore
+pu@`o contenere un altro sottovettore come valore, che a sua volta pu@`o
+contenere anche ulteriori vettori. In questo modo, si possono creare vettori
+di tre o pi@`u dimensioni.
+Gli indici possono essere costituiti da qualunque espressione di
+@command{awk}, compresi dei
+valori scalari separati da virgole (cio@`e, un indice multidimensionale simulato
+di @command{awk}). Quindi, la seguente espressione @`e valida in
+@command{gawk}:
+
+@example
+a[1][3][1, "nome"] = "barney"
+@end example
+
+Ogni sottovettore e il vettore principale possono essere di diversa lunghezza.
+Di fatto, gli elementi di un vettore o un suo sottovettore non devono essere
+necessariamente tutti dello stesso tipo. Ci@`o significa che il vettore
+principale come anche uno qualsiasi dei suoi sottovettori pu@`o essere
+non rettangolare,
+o avere una struttura frastagliata. Si pu@`o assegnare un valore scalare
+all'indice @code{4} del vettore principale @code{a}, anche se @code{a[1]}
+@`e esso stesso un vettore e non uno scalare:
+
+@example
+a[4] = "Un elemento in un vettore frastagliato"
+@end example
+
+I termini @dfn{dimensione}, @dfn{riga} e @dfn{colonna} sono privi di
+significato quando sono applicati
+a questo tipo di vettore, ma d'ora in poi useremo ``dimensione'' per indicare
+il numero massimo di indici necessario per far riferimento a un elemento
+esistente. Il tipo di ogni elemento che @`e gi@`a stato assegnato non pu@`o essere
+cambiato assegnando un valore di tipo diverso. Prima si deve eliminare
+l'elemento corrente, per togliere completamente dalla memoria di
+@command{gawk} ogni riferimento a quell'indice:
+
+@example
+delete a[4]
+a[4][5][6][7] = "Un elemento in un vettore quadridimensionale"
+@end example
+
+@noindent
+Le due istruzioni rimuovono il valore scalare dall'indice @code{4} e
+inseriscono poi un
+sottovettore interno a tre indici contenente uno scalare. Si pu@`o anche
+eliminare un intero sottovettore o un sottovettore di sottovettori:
+
+@example
+delete a[4][5]
+a[4][5] = "Un elemento nel sottovettore a[4]"
+@end example
+
+Si deve per@`o ricordare che non @`e consentito eliminare il vettore principale
+@code{a} e poi usarlo come scalare.
+
+Le funzioni predefinite che accettano come argomenti dei vettori possono
+essere usate
+anche con i sottovettori. Per esempio, il seguente frammento di codice usa
+@code{length()} (@pxref{Funzioni per stringhe})
+per determinare il numero di elementi nel vettore principale @code{a}
+e nei suoi sottovettori:
+
+@example
+print length(a), length(a[1]), length(a[1][3])
+@end example
+
+@noindent
+Il risultato per il nostro vettore principale @code{a} @`e il seguente:
+
+@example
+2, 3, 1
+@end example
+
+@noindent
+L'espressione @samp{@var{indice} in @var{vettore}}
+(@pxref{Visitare elementi}) funziona allo stesso modo sia per
+i vettori regolari in stile @command{awk}
+che per i vettori di vettori. Per esempio, le espressioni @samp{1 in a},
+@samp{3 in a[1]} e @samp{(1, "nome") in a[1][3]} risultano tutte di valore
+uno (vero) per il nostro vettore @code{a}.
+
+L'istruzione @samp{for (elemento in vettore)} (@pxref{Visitare un intero vettore})
+pu@`o essere nidificata per visitare tutti gli
+elementi di un vettore di vettori che abbia una struttura rettangolare. Per
+stampare il contenuto (valori scalari) di un vettore di vettori bidimensionale
+(cio@`e nel quale ogni elemento di primo livello @`e esso stesso un
+vettore, non necessariamente di lunghezza uguale agli altri)
+si pu@`o usare il seguente codice:
+
+@example
+for (i in vettore)
+    for (j in vettore[i])
+        print vettore[i][j]
+@end example
+
+La funzione @code{isarray()} (@pxref{Funzioni per i tipi})
+permette di verificare se un elemento di un vettore @`e esso stesso un vettore:
+
+@example
+for (i in vettore) @{
+    if (isarray(vettore[i])) @{
+        for (j in vettore[i]) @{
+            print vettore[i][j]
+        @}
+    @}
+    else
+        print vettore[i]
+@}
+@end example
+
+Se la struttura di un vettore di vettori frastagliato @`e nota in anticipo,
+si pu@`o spesso trovare il modo per visitarlo usando istruzioni di controllo.
+Per esempio,
+il seguente codice stampa gli elementi del nostro vettore principale @code{a}:
+
+@example
+@group
+for (i in a) @{
+    for (j in a[i]) @{
+        if (j == 3) @{
+            for (k in a[i][j])
+                print a[i][j][k]
+@end group
+@group
+        @} else
+            print a[i][j]
+    @}
+@}
+@end group
+@end example
+
+@noindent
+@xref{Visitare vettori} per una funzione definita dall'utente che
+``visita'' un vettore di vettori di dimensioni arbitrarie.
+
+Si ricordi che un riferimento a un elemento di un vettore non
+inizializzato genera un elemento con valore uguale a @code{""}, la stringa
+nulla. Questo ha
+un'importante implicazione quando s'intende usare un sottovettore come
+argomento di una funzione, come illustrato nel seguente esempio:
+
+@example
+$ @kbd{gawk 'BEGIN @{ split("a b c d", b[1]); print b[1][1] @}'}
+@error{} gawk: riga com.:1: fatale: split: secondo argomento
+@error{}                                      non-vettoriale
+@end example
+
+Il modo per aggirare quest'ostacolo @`e quello di definire prima @code{b[1]}
+come vettore creando un indice arbitrario:
+
+@example
+$ @kbd{gawk 'BEGIN @{ b[1][1] = ""; split("a b c d", b[1]); print b[1][1] @}'}
+@print{} a
+@end example
+
+@node Sommario dei vettori
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+@command{awk} standard dispone di vettori associativi monodimensionali
+(vettori indicizzati da valori di tipo stringa).  Tutti i vettori sono
+associativi; gli indici numerici vengono convertiti automaticamente in
+stringhe.
+
+@item
+Agli elementi dei vettori si fa riferimento come
+@code{@var{vettore}[@var{indice}]}.  Fare riferimento a un elemento lo
+crea se questo non esiste ancora.
+
+@item
+Il modo corretto per vedere se un vettore ha un elemento con un dato indice
+@`e quello di usare l'operatore @code{in}: @samp{@var{indice} in @var{vettore}}.
+
+@item
+Si usa @samp{for (@var{indice} in @var{vettore}) @dots{}} per visitare
+ogni singolo elemento di un vettore. Nel corpo del ciclo,
+@var{indice} assume via via il valore dell'indice di ogni elemento del vettore.
+
+@item
+L'ordine in cui il ciclo @samp{for (@var{indice} in @var{vettore})}
+attraversa un vettore non @`e definito in POSIX @command{awk} e varia a seconda
+dell'implementazione.  @command{gawk} consente di controllare l'ordinamento
+di visita
+assegnando speciali valori predefiniti a @code{PROCINFO["sorted_in"]}.
+
+@item
+Si usa @samp{delete @var{vettore}[@var{indice}]} per eliminare un singolo
+elemento di un vettore.
+Per eliminare tutti gli elementi di un vettore,
+si usa @samp{delete @var{vettore}}.
+Quest'ultima funzionalit@`a @`e stata per molti anni un'estensione comune
+e ora @`e standard, ma potrebbe non essere disponibile in tutte le
+versioni commerciali di @command{awk}.
+
+@item
+@command{awk} standard simula vettori multidimensionali ammettendo pi@`u indici
+separati da virgole.  I loro valori sono concatenati in un'unica
+stringa, separati dal valore di @code{SUBSEP}.  Il modo di creazione
+dell'indice non viene immagazzinato; cos@`{@dotless{i}},
+cambiare @code{SUBSEP} potrebbe avere conseguenze inaspettate.  Si pu@`o usare
+@samp{(@var{sub1}, @var{sub2}, @dots{}) in @var{vettore}} per vedere se
+un certo indice multidimensionale esiste in @var{vettore}.
+
+@item
+@command{gawk} consente di avere a disposizione veri vettori di vettori.
+Si usa una coppia
+di parentesi quadre per ogni dimensione in tali vettori:
+@code{dati[riga][colonna]}, per esempio. Gli elementi del vettore possono
+poi essere valori scalari (numeri o stringhe) o altri vettori.
+
+@item
+Si usa la funzione predefinita @code{isarray()} per determinare se un elemento
+di un vettore @`e esso stesso un sottovettore.
+
+@end itemize
+
+@node Funzioni
+@chapter Funzioni
+
+@cindex funzioni predefinite
+@cindex predefinite, funzioni
+Questo @value{CHAPTER} descrive le funzioni predefinite di @command{awk},
+che sono di tre tipi: numeriche, di stringa, e di I/O.
+@command{gawk} mette a disposizione ulteriori tipi di funzioni
+per gestire valori che rappresentano marcature temporali, per manipolare bit, per
+ordinare vettori, per fornire informazioni sui tipi di variabile,
+per internazionalizzare e localizzare i programmi.@footnote{Per
+un'introduzione alle tematiche suddette, si pu@`o consultare l'articolo
+"Localizzazione dei programmi" nel
+@uref{http://www.pluto.it/files/journal/pj0404/l10n.html, sito pluto.it.}}
+
+Oltre alle funzioni predefinite, @command{awk} consente di
+scrivere nuove funzioni utilizzabili all'interno di un programma.
+La seconda met@`a di questo @value{CHAPTER} descrive le funzioni
+@dfn{definite dall'utente}.
+Vengono infine descritte le chiamate indirette a una funzione, un'estensione
+specifica di @command{gawk} che consente di stabilire durante l'esecuzione del
+programma quale funzione chiamare.
+
+@menu
+* Funzioni predefinite::            Riepilogo delle funzioni predefinite.
+* Funzioni definite dall'utente::   Descrizione dettagliata delle funzioni
+                                    definite dall'utente.
+* Chiamate indirette::              Scegliere la funzione da chiamare in
+                                    fase di esecuzione del programma.
+* Sommario delle funzioni::         Sommario delle funzioni.
+@end menu
+
+@node Funzioni predefinite
+@section Funzioni predefinite
+
+Le funzioni @dfn{predefinite} sono sempre disponibili per essere chiamate
+da un programma @command{awk}.  Questa @value{SECTION} definisce tutte le
+funzioni predefinite di @command{awk}; di alcune di queste si fa menzione
+in altre @value{SECTIONS},
+ma sono comunque riassunte anche qui per comodit@`a.
+
+@menu
+* Chiamare funzioni predefinite::  Come chiamare funzioni predefinite.
+* Funzioni numeriche::             Funzioni che trattano numeri, comprese
+                                   @code{int()}, @code{sin()} e @code{rand()}.
+* Funzioni per stringhe::          Funzioni di manipolazione di stringhe,
+                                   come @code{split()}, @code{match()}
+                                   e @code{sprintf()}.
+* Funzioni di I/O::                Funzioni per i file e per i comandi
+                                   della shell.
+* Funzioni di tempo::              Funzione per gestire marcature temporali.
+* Funzioni a livello di bit::      Funzioni per operazioni di
+                                   manipolazione bit.
+* Funzioni per i tipi::            Funzioni per informazioni sul tipo
+                                   di una variabile.
+* Funzioni di internazionalizzazione::  Funzioni per tradurre stringhe.
+@end menu
+
+@node Chiamare funzioni predefinite
+@subsection Chiamare funzioni predefinite
+
+Per chiamare una delle funzioni predefinite di @command{awk},
+si scrive il nome della funzione seguito dai suoi argomenti racchiusi
+tra parentesi.  Per esempio, @samp{atan2(y + z, 1)}
+@`e una chiamata alla funzione @code{atan2()} e ha due argomenti.
+
+@cindex convenzioni di programmazione, nelle chiamate di funzione
+@cindex spazio bianco, nelle chiamate di funzione
+La presenza di spazi bianchi tra il nome della funzione predefinita
+e la parentesi aperta @`e consentita, ma @`e buona norma quella di evitare
+di inserire spazi bianchi in quella posizione.
+Le funzioni definite dall'utente non consentono che vi siano spazi bianchi
+fra nome funzione e aperta parentesi,
+ed @`e pi@`u semplice evitare errori seguendo una semplice convenzione che
+resta sempre valida: non inserire spazi dopo il nome di una funzione.
+
+@cindex risoluzione di problemi, @command{gawk}, errori fatali@comma{} argomenti di funzione e
+@cindex problemi, risoluzione di, @command{gawk}, errori fatali@comma{} argomenti di funzione e
+@cindex @command{gawk}, argomenti di funzione e
+@cindex differenze tra @command{awk} e @command{gawk}, argomenti di funzione (@command{gawk})
+Ogni funzione predefinita accetta un certo numero di argomenti.
+In alcuni casi, gli argomenti possono essere omessi. I valori di default per
+gli argomenti omessi variano
+da funzione a funzione e sono descritti insieme a
+ciascuna funzione.  In alcune implementazioni di @command{awk}, gli
+eventuali argomenti in pi@`u specificati per le funzioni predefinite sono
+ignorati.  Tuttavia, in @command{gawk},
+@`e un errore fatale fornire argomenti in pi@`u a una funzione predefinita.
+
+Quando si richiama una funzione viene calcolato, prima di effettuare la
+chiamata, il valore assunto dalle espressioni che descrivono i parametri
+da passare alla funzione.
+Per esempio, nel seguente frammento di codice:
+
+@example
+i = 4
+j = sqrt(i++)
+@end example
+
+@cindex ordine di valutazione, funzioni
+@cindex funzioni predefinite, ordine di valutazione
+@cindex predefinite, funzioni, ordine di valutazione
+@noindent
+la variabile @code{i} @`e incrementata al valore cinque prima di chiamare
+la funzione @code{sqrt()} alla quale viene fornito come parametro il valore
+quattro.
+L'ordine di valutazione delle espressioni usate come parametri per la
+funzione @`e indefinito.  Per questo motivo, si deve evitare di scrivere
+programmi che presuppongono che i parametri siano valutati da sinistra a
+destra o da destra a sinistra.  Per esempio:
+
+@example
+i = 5
+j = atan2(++i, i *= 2)
+@end example
+
+Se l'ordine di valutazione @`e da sinistra a destra, @code{i} assume dapprima
+il valore 6, e quindi il valore 12, e la funzione @code{atan2()} @`e chiamata
+con i due argomenti 6 e 12.  Ma se l'ordine di valutazione @`e da destra a
+sinistra, @code{i} assume dapprima il valore 10, e poi il valore 11, e la
+funzione @code{atan2()} @`e chiamata con i due argomenti 11 e 10.
+
+@node Funzioni numeriche
+@subsection Funzioni numeriche
+@cindex funzioni numeriche
+@cindex numeriche, funzioni
+
+La seguente lista descrive tutte le
+funzioni predefinite che hanno a che fare con i numeri.
+I parametri opzionali sono racchiusi tra parentesi quadre@w{ ([ ]):}
+
+@c @asis for docbook
+@table @asis
+@item @code{atan2(@var{y}, @var{x})}
+@cindexawkfunc{atan2}
+@cindex arcotangente
+Restituisce l'arcotangente di @code{@var{y} / @var{x}} in radianti.
+Si pu@`o usare @samp{pi = atan2(0, -1)} per ottenere il valore di
+@value{PI} greco.
+
+@item @code{cos(@var{x})}
+@cindexawkfunc{cos}
+@cindex coseno
+Restituisce il coseno di @var{x}, con @var{x} in radianti.
+
+@item @code{exp(@var{x})}
+@cindexawkfunc{exp}
+@cindex esponenziale
+Restituisce l'esponenziale di @var{x} (@code{e ^ @var{x}}) o un messaggio
+di errore se @var{x} @`e fuori dall'intervallo consentito.
+L'intervallo entro il quale pu@`o variare @var{x}
+dipende dalla rappresentazione dei numeri in virgola mobile nella macchina in
+uso.
+
+@item @code{int(@var{x})}
+@cindexawkfunc{int}
+@cindex arrotondamento all'intero pi@`u vicino
+Restituisce l'intero pi@`u vicino a @var{x}, situato tra @var{x} e zero,
+troncato togliendo i decimali.
+Per esempio, @code{int(3)} @`e 3, @code{int(3.9)} @`e 3, @code{int(-3.9)}
+@`e @minus{}3, e @code{int(-3)} @`e ancora @minus{}3.
+
+@ifset INTDIV
+@item @code{intdiv0(@var{numeratore}, @var{denominatore}, @var{risultato})}
+@cindexawkfunc{intdiv0}
+@cindex funzione @code{intdiv0}
+Esegue una divisione tra numeri interi, simile alla funzione standard C
+@code{div}.  Dapprima, il @code{numeratore} e il
+@code{denominatore} vengono troncati, eliminando la parte decimale,
+per trasformarli in numeri interi.
+Il vettore @code{risultato} viene dapprima svuotato, e poi viene impostato
+l'elemento @code{risultato["quotient"]} al risultato della divisione
+@samp{numeratore / denominatore}, troncato a numero intero
+mediante l'eliminazione dei decimali,
+e viene impostato l'elemento @code{risultato["remainder"]} al
+risultato dell'operazione @samp{numeratore % denominatore}, troncato a
+numero intero allo stesso modo del risultato.
+Il tentativo di effettuare una divisione per zero provoca la fine del
+programma.  Questa funzione @`e
+rivolta principalmente a chi usa numeri interi di lunghezza arbitraria;
+consente di evitare la creazione di numeri in virgola mobile
+di precisione arbitaria usando la funzionalit@`a MPFR
+(@pxref{Interi a precisione arbitraria}).
+
+Questa funzione @`e un'estensione @code{gawk}.  Non @`e disponibile in
+modalit@`a compatibile (@pxref{Opzioni}).
+@end ifset
+
+@item @code{log(@var{x})}
+@cindexawkfunc{log}
+@cindex logaritmo
+Restituisce il logaritmo naturale di @var{x}, se @var{x} @`e positivo;
+altrimenti, restituisce @code{NaN} (``not a number'') sui sistemi che
+implementano lo standard IEEE 754.
+Inoltre, @command{gawk} stampa un messaggio di avvertimento qualora @code{x}
+sia negativo.
+
+@cindex Beebe, Nelson H.F.@:
+@item @code{rand()}
+@cindexawkfunc{rand}
+@cindex numeri casuali, funzioni @code{rand()}/@code{srand()}
+Restituisce un numero casuale.  I valori di @code{rand()} sono
+uniformemente distribuiti tra zero e uno.
+Il valore potrebbe essere zero ma non @`e mai uno.@footnote{La versione C di
+@code{rand()} in molti sistemi Unix genera notoriamente delle sequenze
+piuttosto mediocri di numeri casuali.  Tuttavia, non @`e scritto da nessuna
+parte che un'implementazione di @command{awk} debba necessariamente
+usare la funzione @code{rand()} del linguaggio C per implementare
+la versione @command{awk} di @code{rand()}.  In effetti, @command{gawk}
+ha usato per parecchi anni la funzione @code{random()} di BSD, che @`e
+notevolmente migliore di @code{rand()}, per generare dei numeri casuali.
+Dalla @value{PVERSION} 4.1.4, grazie al contributo di Nelson H.F.@:
+Beebe, @command{gawk} usa l'algoritmo di rimescolamento nella scatola
+di Bayes-Durham, che estende in maniera notevole il periodo dopo il
+quale i numeri si ripetono ed elimina le correlazioni a breve distanza
+e a lunga distanza che potrebbero esistere nel generatore originale
+di numeri casuali.}
+
+Spesso servono dei numeri casuali interi invece che frazionari.
+La seguente funzione definita dall'utente pu@`o essere usata per ottenere
+un numero casuale non negativo inferiore a @var{n}:
+
+@example
+function randint(n)
+@{
+    return int(n * rand())
+@}
+@end example
+
+@noindent
+La moltiplicazione produce un numero casuale maggiore o uguale a zero e
+minore di @code{n}.  Tramite @code{int()}, questo risultato diventa
+un intero tra zero e @code{n} @minus{} 1, estremi inclusi.
+
+Il seguente esempio usa una funzione simile per generate interi casuali
+fra uno e @var{n}.  Il programma stampa un numero casuale per
+ogni record in input:
+
+@example
+# funzione per simulare un tiro di dado.
+function roll(n) @{ return 1 + int(rand() * n) @}
+
+# Tira 3 dadi a sei facce e
+# stampa il numero di punti.
+@{
+    printf("%d punteggio\n", roll(6) + roll(6) + roll(6))
+@}
+@end example
+
+@cindex inizializzazione generazione di numeri casuali
+@cindex numeri casuali, inizializzazione generazione di
+@cindex numeri casuali, seme di
+@quotation ATTENZIONE
+Nella maggior parte delle implementazioni di @command{awk}, compreso
+@command{gawk},
+@code{rand()} inizia a generare numeri casuali partendo sempre
+dallo stesso numero, o @dfn{seme}, per ogni invocazione di
+@command{awk}.@footnote{@command{mawk}
+usa un seme differente ogni volta.}  @`E per questo motivo che
+un programma genera sempre gli stessi risultati ogni volta che lo si esegue.
+I numeri sono casuali all'interno di una singola esecuzione di @command{awk}
+ma "prevedibili" in ogni successiva esecuzione.
+Ci@`o torna utile in fase di test, ma se si desidera che
+un programma generi sequenze differenti di numeri casuali ogni volta
+che @`e chiamato, occorre impostare il seme a un valore che cambi
+per ogni esecuzione.  Per fare questo, @`e prevista la funzione @code{srand()}.
+@end quotation
+
+@item @code{sin(@var{x})}
+@cindexawkfunc{sin}
+@cindex seno
+Restituisce il seno di @var{x}, con @var{x} espresso in radianti.
+
+@item @code{sqrt(@var{x})}
+@cindexawkfunc{sqrt}
+@cindex radice quadrata
+Restituisce la radice quadrata positiva di @var{x}.
+@command{gawk} stampa un messaggio di avvertimento
+se @var{x} @`e un numero negativo.  Quindi, @code{sqrt(4)} vale 2.
+
+@item @code{srand(}[@var{x}]@code{)}
+@cindexawkfunc{srand}
+Imposta al valore @var{x} il numero di partenza, o seme,
+utilizzato per generare numeri casuali.
+
+Ogni seme genera una sequenza particolare di numeri casuali.@footnote{I
+numeri casuali generati da un computer non sono veramente casuali.
+Tecnicamente sono conosciuti come numeri @dfn{pseudo-casuali}.  Ci@`o vuol dire
+che, anche se i numeri in una sequenza sembrano casuali, @`e possibile
+in realt@`a generare la stessa sequenza di numeri casuali pi@`u e pi@`u volte.}
+Quindi, impostando il seme allo stesso valore una seconda volta,
+viene prodotta ancora la stessa sequenza di numeri casuali.
+
+@quotation ATTENZIONE
+Differenti implementazioni di @command{awk} usano internamente differenti
+generatori di numeri casuali.  Non si deve dare per scontato che lo stesso
+programma @command{awk}
+generi la stessa serie di numeri casuali se viene eseguito da differenti
+versioni di @command{awk}.
+@end quotation
+
+Se si omette l'argomento @var{x}, scrivendo @samp{srand()}, viene usato
+come seme la data e ora corrente.  @`E questo il modo per ottenere numeri
+casuali che sono veramente imprevedibili.
+
+Il valore restituito da @code{srand()} @`e quello del seme precedente.
+Questo per facilitare il monitoraggio dei semi, nel caso occorra riprodurre
+in maniera coerente delle sequenze di numeri casuali.
+
+POSIX non specifica quale debba essere il seme iniziale, che quindi varia
+a seconda delle implementazioni @command{awk}.
+@end table
+
+@node Funzioni per stringhe
+@subsection Funzioni di manipolazione di stringhe
+@cindex funzioni di manipolazione di stringhe
+
+Le funzioni in questa @value{SECTION} leggono o modificano il testo di
+una o pi@`u stringhe.
+
+@command{gawk} implementa la localizzazione
+(@pxref{Localizzazioni}) ed effettua
+ogni manipolazione di stringhe trattando ogni singolo @emph{carattere}, non
+ogni singolo @emph{byte}.
+Questa distinzione @`e particolarmente importante da comprendere per
+quelle localizzazioni in cui un singolo carattere pu@`o essere rappresentato
+da pi@`u di un byte.
+Quindi, per esempio, la funzione @code{length()} restituisce il numero di
+caratteri in una stringa, e non il numero di byte usato per rappresentare quei
+caratteri.  Allo stesso modo, @code{index()} restituisce indici di caratteri, e
+non indici di byte.
+
+@quotation ATTENZIONE
+Un certo numero di funzioni riguarda indici all'interno di stringhe.  Per
+queste funzioni, il primo carattere di una stringa @`e alla posizione
+(all'indice) uno.  Questo comportamento @`e differente da quello del C e dei
+linguaggi che da esso discendono, nei quali il primo carattere @`e alla posizione
+zero.  @`E importante ricordarlo quando si fanno calcoli sugli indici, in
+particolare se si ha familiarit@`a con il linguaggio C.
+@end quotation
+
+Nella lista seguente, i parametri opzionali sono racchiusi tra parentesi
+quadre@w{ ([ ]).}
+Parecchie funzioni operano sostituzioni in una stringa; la spiegazione
+completa di ci@`o @`e contenuta nella descrizione della funzione @code{sub()},
+che si trova quasi alla fine di questa lista, ordinata alfabeticamente.
+
+Le funzioni specifiche di @command{gawk} sono contrassegnate col simbolo
+del cancelletto (@samp{#}).  Tali funzioni non sono disponibili in modalit@`a
+compatibile (@pxref{Opzioni}):
+
+
+@menu
+* Dettagli ostici::        Pi@`u di quel che si vorrebbe sapere su @samp{\}
+                           e @samp{&} con @code{sub()}, @code{gsub()}, e
+                           @code{gensub()}.
+@end menu
+
+@c @asis for docbook
+@table @asis
+@item @code{asort(}@var{sorgente} [@code{,} @var{destinazione} [@code{,} @var{come} ] ]@code{) #}
+@itemx @code{asorti(}@var{sorgente} [@code{,} @var{destinazione} [@code{,} @var{come} ] ]@code{) #}
+@cindexgawkfunc{asorti}
+@cindex vettori, ordinamento dei
+@cindex ordinamento di vettori
+@cindex vettori, determinare il numero degli elementi
+@cindexgawkfunc{asort}
+@cindex ordinamento vettori per indici
+@cindex vettori, ordinamento per indici
+@cindex indici di vettori, ordinamento per
+Queste due funzioni sono abbastanza simili, e quindi sono descritte
+insieme.
+
+@quotation NOTA
+La seguente descrizione ignora il terzo argomento, @var{come}, perch@'e
+richiede la conoscenza di funzionalit@`a di cui non si @`e ancora parlato.  Per
+questo motivo la seguente trattazione @`e volutamente semplificata.  (In seguito
+l'argomento verr@`a trattato in maniera pi@`u esauriente; si veda @ref{Funzioni di
+ordinamento di vettori} per la descrizione completa.)
+@end quotation
+
+Entrambe le funzioni restituiscono il numero di elementi nel vettore @var{sorgente}.
+Con @command{asort()}, @command{gawk} ordina i valori di @var{sorgente}
+e rimpiazza gli indici dei valori ordinati di @var{sorgente} con
+numeri interi sequenziali, a partire da uno.  Se si specifica il vettore
+opzionale @var{destinazione},
+@var{sorgente} @`e copiato in @var{destinazione}.  @var{destinazione}
+viene quindi ordinato, lasciando immodificati gli indici di @var{sorgente}.
+
+@cindex @command{gawk}, variabile @code{IGNORECASE} in
+Nel confronto tra stringhe, la variabile @code{IGNORECASE} influenza
+l'ordinamento
+(@pxref{Funzioni di ordinamento di vettori}).  Se il vettore
+@var{sorgente} contiene sottovettori come valori
+(@pxref{Vettori di vettori}), questi saranno alla fine, dopo tutti i valori
+scalari.
+I sottovettori @emph{non} vengono ordinati ricorsivamente.
+
+Per esempio, se i contenuti del vettore @code{a} sono i seguenti:
+
+@example
+a["ultimo"] = "de"
+a["primo"] = "sac"
+a["mediano"] = "cul"
+@end example
+
+@noindent
+Una chiamata a @code{asort()}:
+
+@example
+asort(a)
+@end example
+
+@noindent
+genera i seguenti contenuti di @code{a}:
+
+@example
+@group
+a[1] = "cul"
+a[2] = "de"
+a[3] = "sac"
+@end group
+@end example
+
+La funzione @code{asorti()} si comporta in maniera simile ad @code{asort()};
+tuttavia l'ordinamento avviene in base agli @emph{indici}, e non in base ai
+valori.  Quindi, nell'esempio seguente, a partire dallo stesso insieme iniziale
+di indici e valori nel vettore @code{a}, la chiamata di @samp{asorti(a)}
+produrrebbe:
+
+@example
+a[1] = "mediano"
+a[2] = "primo"
+a[3] = "ultimo"
+@end example
+
+@item @code{gensub(@var{regexp}, @var{rimpiazzo}, @var{come}} [@code{, @var{obiettivo}}]@code{) #}
+@cindexgawkfunc{gensub}
+@cindex cercare e rimpiazzare in stringhe
+@cindex sostituzione in stringa
+Ricerca nella stringa @var{obiettivo} delle corrispondenze
+all'espressione regolare @var{regexp}.
+Se @var{come} @`e una stringa che inizia
+con @samp{g} o @samp{G} (abbreviazione di ``global''), sostituisce
+ogni occorrenza di @var{regexp} con la stringa
+@var{rimpiazzo}.  Altrimenti, @var{come} @`e visto come un numero che indica
+quale corrispondenza di @var{regexp} va rimpiazzata.  Valori numerici
+inferiori a uno vengono gestiti come se avessero il valore uno.
+Se non si specifica il nome dell'@var{obiettivo}, si
+opera su @code{$0}.  La funzione restituisce come risultato la stringa
+modificata, e la stringa originale di partenza @emph{non} viene modificata.
+
+@code{gensub()} @`e una funzione generale di sostituzione.  Mira a fornire
+pi@`u funzionalit@`a rispetto alle funzioni standard @code{sub()} e
+@code{gsub()}.
+
+@code{gensub()} prevede una funzionalit@`a ulteriore, non disponibile in
+@code{sub()} o @code{gsub()}: la possibilit@`a di specificare componenti di
+una @dfn{regexp} nel testo da sostituire.  Questo @`e fatto utilizzando delle
+parentesi nella @dfn{regexp} per designare i componenti, e quindi inserendo
+@samp{\@var{N}} nel testo di rimpiazzo, dove @var{N} @`e una cifra da 1 a 9.
+Per esempio:
+
+@example
+$ @kbd{gawk '}
+> @kbd{BEGIN @{}
+>      @kbd{a = "abc def"}
+>      @kbd{b = gensub(/(.+) (.+)/, "\\2 \\1", "g", a)}
+>      @kbd{print b}
+> @kbd{@}'}
+@print{} def abc
+@end example
+
+@noindent
+Come con @code{sub()}, occorre battere due barre inverse, per ottenerne
+una come componente della stringa.
+Nel testo di rimpiazzo, la sequenza @samp{\0} rappresenta l'intero testo
+corrispondente, e lo stesso vale per
+il carattere @samp{&}.
+
+Il seguente esempio mostra come @`e possibile usare il terzo argomento
+per controllare quale corrispondenza
+della @dfn{regexp} sia da modificare:
+
+@example
+$ @kbd{echo a b c a b c |}
+> @kbd{gawk '@{ print gensub(/a/, "AA", 2) @}'}
+@print{} a b c AA b c
+@end example
+
+In questo caso, @code{$0} @`e la stringa obiettivo di default.
+@code{gensub()} restituisce la nuova stringa come risultato, e questa
+@`e passata direttamente a @code{print} per essere stampata.
+
+@c @cindex avvertimenti automatici
+@c @cindex automatici, avvertimenti
+Se l'argomento @var{come} @`e una stringa che non inizia con @samp{g} o
+@samp{G}, o se @`e un numero minore o uguale a zero, si effettua solo una
+sostituzione.  Se @var{come} @`e zero, @command{gawk} emette
+un messaggio di avvertimento.
+
+Se @var{regexp} non viene trovata in @var{obiettivo}, il valore
+restituito da @code{gensub()}
+@`e il valore originale e non modificato di @var{obiettivo}.
+
+@item @code{gsub(@var{regexp}, @var{rimpiazzo}} [@code{, @var{obiettivo}}]@code{)}
+@cindexawkfunc{gsub}
+Ricerca in @var{obiettivo}
+@emph{tutte} le sottostringhe corrispondenti al criterio di ricerca, le
+pi@`u lunghe possibili partendo da sinistra, @emph{non sovrapposte tra loro},
+e le sostituisce con @var{rimpiazzo}.
+La lettera @samp{g} in @code{gsub()} significa
+``global'', e richiede di sostituire dappertutto.  Per esempio:
+
+@example
+@{ gsub(/Inghilterra/, "Regno Unito"); print @}
+@end example
+
+@noindent
+sostituisce tutte le occorrenze della stringa @samp{Inghilterra} con
+@samp{Regno Unito} in tutti i record in input.
+
+La funzione @code{gsub()} restituisce il numero di sostituzioni effettuate.
+Se la variabile da cercare e modificare (@var{obiettivo}) @`e omessa,
+viene usato l'intero record in input.
+Come in @code{sub()}, i caratteri @samp{&} e @samp{\} sono speciali,
+e il terzo argomento dev'essere modificabile.
+
+@item @code{index(@var{dove}, @var{cosa})}
+@cindexawkfunc{index}
+@cindex ricerca in stringhe
+@cindex trovare sottostringhe in una stringa
+Ricerca nella stringa @var{dove} la prima occorrenza della stringa @var{cosa},
+e restituisce la posizione in caratteri dell'inizio di quest'occorrenza nella
+stringa @var{dove}.  Si consideri il seguente esempio:
+
+@example
+$ @kbd{awk 'BEGIN @{ print index("noccioline", "oli") @}'}
+@print{} 6
+@end example
+
+@noindent
+Se @var{cosa} non viene trovato, @code{index()} restituisce zero.
+
+@cindex angolo buio, @dfn{regexp} come secondo argomento di @code{index()}
+In BWK @command{awk} e @command{gawk},
+@`e un errore fatale usare una costante @dfn{regexp} per @var{cosa}.
+Altre implementazioni lo consentono, considerando semplicemente
+la costante @dfn{regexp} come un'espressione che significa
+@samp{$0 ~ /@dfn{regexp}/}. @value{DARKCORNER}
+
+@item @code{length(}[@var{stringa}]@code{)}
+@cindexawkfunc{length}
+@cindex stringa, lunghezza di una
+@cindex lunghezza di una stringa
+Restituisce il numero di caratteri in @var{stringa}.  Se
+@var{stringa} @`e un numero, viene restituita la lunghezza della stringa
+di cifre che rappresenta quel numero.  Per esempio, @code{length("abcde")} @`e
+cinque.
+Invece, @code{length(15 * 35)} restituisce tre. In questo esempio,
+@iftex
+@math{15 @cdot 35 = 525},
+@end iftex
+@ifnottex
+@ifnotdocbook
+15 * 35 = 525,
+@end ifnotdocbook
+@end ifnottex
+@docbook
+15 &sdot; 35 = 525,
+@end docbook
+e 525 @`e quindi convertito alla stringa @code{"525"}, che @`e composta da
+tre caratteri.
+
+@cindex lunghezza di un record in input
+@cindex record in input, lunghezza di un
+Se non si specifica alcun argomento, @code{length()} restituisce la
+lunghezza di @code{$0}.
+
+@c @cindex historical features
+@cindex portabilit@`a, funzione @code{length()}
+@cindex POSIX @command{awk}, funzione @code{length()} e
+@quotation NOTA
+In alcune delle prime versioni di @command{awk}, la funzione @code{length()}
+poteva essere richiamata senza alcuna parentesi.  Farlo @`e considerata
+una cattiva abitudine, sebbene il POSIX standard 2008 lo consenta esplicitamente,
+per compatibilit@`a con la vecchia prassi.  Per garantire la massima
+portabilit@`a ai programmi, @`e meglio mettere sempre le parentesi.
+@end quotation
+
+@cindex angolo buio, funzione @code{length()}
+Se @code{length()} @`e chiamata con una variabile che non @`e stata usata,
+@command{gawk} considera la variabile come uno scalare.  Altre
+implementazioni di @command{awk} non assegnano nessun tipo alla variabile.
+@value{DARKCORNER}
+Si consideri:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
+@print{} 0
+@error{} gawk: riga com.:1: fatale: tentativo di usare
+@error{}                            scalare 'x' come vettore
+
+$ @kbd{nawk 'BEGIN @{ print length(x) ; x[1] = 1 @}'}
+@print{} 0
+@end example
+
+@noindent
+Se @option{--lint} @`e
+stato specificato sulla riga di comando, @command{gawk} emette un
+avvertimento a questo riguardo.
+
+@cindex estensioni comuni, @code{length()} applicato a un vettore
+@cindex comuni, estensioni@comma{} @code{length()} applicato a un vettore
+@cindex differenze tra @command{gawk} e @command{awk}, funzione @code{length()}
+@cindex numero di elementi di un vettore
+@cindex vettore, determinare il numero degli elementi
+In @command{gawk} e in parecchie altre implementazioni @command{awk},
+se l'argomento @`e un vettore, la funzione @code{length()} restituisce il numero
+di elementi nel vettore. @value{COMMONEXT}
+Ci@`o @`e meno utile di quel che sembra a prima vista, in quanto
+non @`e affatto detto che il vettore abbia come indici i numeri da 1 al
+numero di elementi che contiene.
+Se @option{--lint} @`e
+stato specificato sulla riga di comando,
+(@pxref{Opzioni}),
+@command{gawk} avvisa che l'uso di un vettore come argomento non
+@`e portabile.
+Se si specifica l'opzione @option{--posix}, l'uso di un vettore come
+argomento genera un errore fatale
+@iftex
+(@pxrefil{Vettori}).
+@end iftex
+@ifnottex
+(@pxref{Vettori}).
+@end ifnottex
+
+@item @code{match(@var{stringa}, @var{regexp}} [@code{, @var{vettore}}]@code{)}
+@cindexawkfunc{match}
+@cindex stringa, ricercare espressioni regolari in una
+@cindex ricerca @dfn{regexp} in stringhe
+Ricerca in @var{stringa} la
+sottostringa pi@`u lunga, a partire da sinistra, che corrisponde
+all'espressione regolare @var{regexp} e restituisce la posizione
+del carattere (indice) con cui inizia la sottostringa (uno, se
+la corrispondenza parte dall'inizio di @var{stringa}).  Se non viene
+trovata alcuna corrispondenza, restituisce zero.
+
+L'argomento @var{regexp} pu@`o essere sia una costante @dfn{regexp}
+(@code{/}@dots{}@code{/}) che una costante stringa (@code{"}@dots{}@code{"}).
+In quest'ultimo caso, la stringa @`e trattata come una @dfn{regexp}
+per la quale cercare una corrispondenza.
+@xref{Espressioni regolari calcolate} per una
+spiegazione sulla differenza tra le due forme e sulle loro
+implicazioni riguardo al modo per scrivere correttamente un programma.
+
+L'ordine dei primi due argomenti @`e l'opposto di molte altre funzioni che
+trattano stringhe e che hanno a che fare con espressioni regolari, come
+@code{sub()} e @code{gsub()}.  Potrebbe essere di aiuto ricordare che
+per @code{match()}, l'ordine @`e lo stesso che per l'operatore @samp{~} :
+@samp{@var{stringa} ~ @var{regexp}}.
+
+@cindex @code{RSTART}, variabile, funzione @code{match()} e
+@cindex variabile @code{RSTART}, funzione @code{match()} e
+@cindex @code{RLENGTH}, variabile, funzione @code{match()} e
+@cindex variabile @code{RLENGTH}, funzione @code{match()} e
+@cindex funzione @code{match()}, variabili @code{RSTART}/@code{RLENGTH}
+@cindex @code{match()}, funzione, variabili @code{RSTART}/@code{RLENGTH}
+La funzione @code{match()} imposta la  variabile predefinita @code{RSTART}
+all'indice.
+Imposta anche la variabile predefinita @code{RLENGTH} alla
+lunghezza in caratteri della sottostringa individuata.  Se non viene
+trovata alcuna corrispondenza, @code{RSTART} @`e impostata a zero, e
+@code{RLENGTH} a @minus{}1.
+
+Per esempio:
+
+@example
+@c file eg/misc/findpat.awk
+@{
+    if ($1 == "TROVA")
+        regexp = $2
+    else @{
+        dove = match($0, regexp)
+        if (dove != 0)
+            print "Corrispondenza di", regexp, "alla posiz.", \
+            dove, "in", $0
+       @}
+@}
+@c endfile
+@end example
+
+@noindent
+Questo programma ricerca delle righe che corrispondono all'espressione
+regolare contenuta nella variabile
+@code{regexp}.  Quest'espressione regolare pu@`o essere modificata.  Se la
+prima parola in una riga @`e @samp{TROVA}, @code{regexp} diventa la
+seconda parola su quella riga.  Quindi, dato:
+
+@example
+@c file eg/misc/findpat.data
+TROVA or+e
+Il mio programma corre
+ma non troppo velocemente
+TROVA Melvin
+JF+KM
+Questa riga appartiene a Reality Engineering Co.
+Melvin @`e passato da qui.
+@c endfile
+@end example
+
+@noindent
+@command{awk} stampa:
+
+@example
+Corrispondenza di or+e alla posiz. 19 in Il mio programma corre
+Corrispondenza di Melvin alla posiz. 1 in Melvin @`e passato da qui.
+@end example
+
+@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{match()}
+Se @var{vettore} esiste gi@`a, viene cancellato, e quindi l'elemento numero
+zero di @var{vettore} @`e impostato all'intera parte di @var{stringa}
+individuata da @var{regexp}.  Se @var{regexp} contiene parentesi,
+gli elementi aventi per indici numeri interi in @var{vettore} sono
+impostati per contenere ognuno la parte di @var{stringa} individuata dalla
+corrispondente sottoespressione delimitata da parentesi.
+Per esempio:
+
+@example
+$ @kbd{echo pippoooopaperpluttttttt |}
+> @kbd{gawk '@{ match($0, /(pippo+).+(plut*)/, vett)}
+>         @kbd{print vett[1], vett[2] @}'}
+@print{} pippoooo pluttttttt
+@end example
+
+Inoltre,
+sono disponibili indici multidimensionali che contengono
+la posizione di partenza e la lunghezza di ogni sottoespressione
+individuata:
+
+@example
+$ @kbd{echo pippoooopaperpluttttttt |}
+> @kbd{gawk '@{ match($0, /(pippo+).+(plut*)/, vett)}
+>           @kbd{print vett[1], vett[2]}
+>           @kbd{print vett[1, "start"], vett[1, "length"]}
+>           @kbd{print vett[2, "start"], vett[2, "length"]}
+> @kbd{@}'}
+@print{} pippoooo pluttttttt
+@print{} 1 8
+@print{} 14 10
+@end example
+
+Possono non esserci indici che individuino inizio e posizione
+per ogni sottoespressione
+fra parentesi, perch@'e non tutte potrebbero aver individuato del testo;
+quindi, andrebbero esaminati usando l'operatore @code{in}
+(@pxref{Visitare elementi}).
+
+@cindex risoluzione di problemi, funzione @code{match()}
+@cindex problemi, risoluzione di, funzione @code{match()}
+L'argomento @var{vettore} di @code{match()} @`e un'estensione
+@command{gawk}.  In modalit@`a compatibile
+(@pxref{Opzioni}),
+l'impiego di un terzo argomento causa un errore fatale.
+
+@item @code{patsplit(@var{stringa}, @var{vettore}} [@code{, @var{regexpdelim}} [@code{, @var{separatori}} ] ]@code{) #}
+@cindexgawkfunc{patsplit}
+@cindex dividere in un vettore una stringa
+@cindex creare un vettore da una stringa
+Divide
+@var{stringa} in pezzi (o ``campi'') definiti da @var{fieldpat}
+e memorizza i pezzi in @var{vettore} e le stringhe di separazione nel
+vettore @var{separatori}.  Il primo pezzo @`e memorizzato in
+@code{@var{vettore}[1]}, il secondo pezzo in @code{@var{vettore}[2]}, e
+cos@`{@dotless{i}} via.  Il terzo argomento, @var{regexpdelim}, @`e
+una @dfn{regexp} che descrive i campi in @var{stringa} (allo stesso modo in
+cui @code{FPAT} @`e una @dfn{regexp} che descrive i campi nei record
+in input).
+Pu@`o essere una costante @dfn{regexp} o una stringa.
+Se @var{regexpdelim} @`e omesso, viene usato il valore di @code{FPAT}.
+@code{patsplit()} restituisce il numero di elementi creati.
+@code{@var{separatori}[@var{i}]} @`e
+la stringa (che potrebbe anche essere la stringa nulla) dopo
+l'elemento @code{@var{vettore}[@var{i}]}.
+Il separatore iniziale (che potrebbe anche essere la stringa nulla)
+sar@`a in @code{@var{separatori}[0]}.
+Quindi, una @var{stringa} non nulla, con @var{n} campi avr@`a @var{n+1}
+separatori.  Una stringa nulla non avr@`a n@'e campi n@'e separatori.
+
+La funzione @code{patsplit()} divide delle stringhe in pezzi in modo
+simile a quello con cui le righe in input vengono divise in campi
+usando @code{FPAT}
+(@pxref{Separazione in base al contenuto}).
+
+Prima di dividere la stringa, @code{patsplit()} cancella ogni elemento che
+fosse eventualmente presente
+nei vettori @var{vettore} e @var{separatori}.
+
+@item @code{split(@var{stringa}, @var{vettore}} [@code{, @var{separacampo}} [@code{, @var{separatori}} ] ]@code{)}
+@cindexawkfunc{split}
+Divide @var{stringa} in pezzi separati da @var{separacampo}
+e memorizza i pezzi in @var{vettore} e le stringhe di separazione nel
+vettore @var{separatori}.  Il primo pezzo @`e memorizzato in
+@code{@var{vettore}[1]}, il secondo pezzo in @code{@var{vettore}[2]}, e
+cos@`{@dotless{i}} via.  Il valore della stringa specificata nel terzo argomento,
+@var{separacampo}, @`e una @dfn{regexp} che indica come dividere @var{stringa}
+(analogamente a come @code{FS} pu@`o essere un @dfn{regexp} che indica dove
+dividere i record in input).
+Se @var{separacampo} @`e omesso, si usa il valore di @code{FS}.
+@code{split()} restituisce il numero di elementi creati.
+@var{separatori} @`e un'estensione @command{gawk}, in cui
+@code{@var{separatori}[@var{i}]}
+@`e la stringa che separa @code{@var{vettore}[@var{i}]} e
+@code{@var{vettore}[@var{i}+1]}.
+Se @var{separacampo} @`e uno spazio bianco, ogni eventuale spazio bianco
+a inizio stringa viene messo in @code{@var{separatori}[0]} e ogni
+eventuale spazio bianco a fine stringa  viene messo in
+@code{@var{separatori}[@var{n}]}, dove @var{n} @`e il valore restituito da
+@code{split()} (cio@`e il numero di elementi in @var{vettore}).
+
+La funzione @code{split()} divide le stringhe in pezzi nello stesso
+modo in cui le righe in input sono divise in campi.  Per esempio:
+
+@example
+split("cul-de-sac", a, "-", separatori)
+@end example
+
+@noindent
+@cindex stringhe, divisione, esempio
+divide la stringa @code{"cul-de-sac"} in tre campi usando @samp{-} come
+separatore.  Il vettore @code{a} ha i seguenti contenuti:
+
+@example
+a[1] = "cul"
+a[2] = "de"
+a[3] = "sac"
+@end example
+
+e imposta il contenuto del vettore @code{separatori} come segue:
+
+@example
+seps[1] = "-"
+seps[2] = "-"
+@end example
+
+@noindent
+Il valore restituito da questa chiamata a @code{split()} @`e tre.
+
+@cindex differenze tra @command{awk} e @command{gawk}, funzione @code{split()}
+Come nella divisione in campi dei record in input, quando il valore di
+@var{separacampo} @`e @w{@code{" "}}, gli spazi bianchi a inizio e fine stringa
+vengono ignorati nell'assegnare valori agli elementi di @var{vettore} ma non nel
+vettore @var{separatori}, e gli elementi sono separati da uno o pi@`u spazi
+bianchi.  Inoltre, come nel caso della divisione dei record in input, se
+@var{separacampo} @`e la stringa nulla, ogni singolo carattere nella stringa
+costituisce un elemento del vettore.
+@value{COMMONEXT}
+Inoltre, se @var{separacampo} @`e una stringa costituita da un unico
+carattere, quella stringa fa da separatore, anche se il carattere
+in questione @`e un metacarattere usato nella espressioni regolari.
+
+Si noti, tuttavia, che @code{RS} non influisce sul comportamento di
+@code{split()}.
+Anche se @samp{RS = ""} fa s@`{@dotless{i}} che il carattere di ritorno a capo sia un
+separatore di campo,
+questo non influenza il modo in cui @code{split()} divide le stringhe.
+
+@cindex angolo buio, funzione @code{split()}
+Recenti implementazioni di @command{awk}, incluso @command{gawk},
+consentono che il terzo argomento sia una costante @dfn{regexp}
+(@w{@code{/}@dots{}@code{/}})
+o anche una stringa.  @value{DARKCORNER}
+Anche lo standard POSIX permette questo.
+@xref{Espressioni regolari calcolate} per la spiegazione della differenza
+tra l'uso di una costante stringa e l'uso di una costante @dfn{regexp},
+sulle loro implicazioni riguardo a come scrivere correttamente un programma.
+
+Prima di dividere la stringa, @code{split()} cancella ogni elemento
+eventualmente gi@`a presente
+nei vettori @var{vettore} e @var{separatori}.
+
+Se @var{stringa} @`e la stringa nulla, il vettore non ha elementi.
+(Quindi, in questo modo si pu@`o cancellare un intero vettore con una sola
+istruzione).
+@xref{Cancellazione}.)
+
+Se in @var{stringa} non viene trovato @var{separacampo} (ma la stringa
+non @`e la stringa nulla),
+@var{vettore} ha solo un elemento. Il valore di quell'elemento @`e la
+@var{stringa} originale.
+
+In modalit@`a POSIX (@pxref{Opzioni}), il quarto argomento non @`e disponibile.
+
+@item @code{sprintf(@var{formato}, @var{espressione1}, @dots{})}
+@cindexawkfunc{sprintf}
+@cindex formattare stringhe
+@cindex stringhe, formattazione
+Restituisce (senza stamparla) la stringa che @code{printf} avrebbe
+stampato con gli stessi argomenti
+(@pxref{Printf}).
+Per esempio:
+
+@example
+pival = sprintf("pi = %.2f (approx.)", 22/7)
+@end example
+
+@noindent
+assegna la stringa @w{@samp{pi = 3.14 (approx.)}} alla variabile @code{pival}.
+
+@cindexgawkfunc{strtonum}
+@cindex conversione di una stringa in un numero
+@cindex stringhe, conversione in numeri
+@item @code{strtonum(@var{stringa}) #}
+Esamina @var{stringa} e restituisce il suo valore numerico.  Se
+@var{stringa} inizia con la cifra @samp{0}, @code{strtonum()} presuppone
+che @var{stringa} sia un numero ottale. Se @var{stringa} inizia con
+@samp{0x} o @samp{0X}, @code{strtonum()} presuppone che @var{stringa} sia un
+numero esadecimale.
+Per esempio:
+
+@example
+$ @kbd{echo 0x11 |}
+> @kbd{gawk '@{ printf "%d\n", strtonum($1) @}'}
+@print{} 17
+@end example
+
+Usare la funzione @code{strtonum()} @emph{non} @`e lo stesso che aggiungere
+zero al valore di una stringa;
+la conversione automatica di stringhe in numeri
+si applica solo a dati decimali, non a quelli ottali o
+esadecimali.@footnote{Tranne nel caso si usi l'opzione
+@option{--non-decimal-data}, il che non @`e consigliato.
+@xref{Dati non decimali} per ulteriori informazioni.}
+
+Si noti anche che @code{strtonum()} usa il separatore decimale della
+localizzazione corrente per riconoscere i numeri
+(@pxref{Localizzazioni}).
+
+@item @code{sub(@var{regexp}, @var{rimpiazzo}} [@code{, @var{obiettivo}}]@code{)}
+@cindexawkfunc{sub}
+@cindex rimpiazzare in una stringa
+@cindex stringa, rimpiazzare in una
+Ricerca in @var{obiettivo}, che @`e visto come una stringa,
+la prima sottostringa pi@`u lunga possibile,
+a partire da sinistra, che corrisponde all'espressione regolare @var{regexp}.
+Modifica l'intera stringa sostituendo il testo individuato con
+@var{rimpiazzo}.
+La stringa cos@`{@dotless{i}} modificata diventa il nuovo valore di @var{obiettivo}.
+Restituisce il numero di sostituzioni fatte (zero o uno).
+
+L'argomento @var{regexp} pu@`o essere o una costante @dfn{regexp}
+(@code{/}@dots{}@code{/}) o una constante stringa (@code{"}@dots{}@code{"}).
+In quest'ultimo caso, la stringa @`e trattata come una @dfn{regexp}
+da individuare.
+@xref{Espressioni regolari calcolate} per la spiegazione della differenza tra
+le due forme, delle loro implicazioni riguardo al modo di scrivere
+correttamente un programma.
+
+Questa funzione @`e particolare perch@'e @var{obiettivo} non @`e semplicemente usato
+per calcolare un valore, e non basta che sia un'espressione qualsiasi:
+dev'essere una variabile, un campo, o un elemento di vettore in cui
+@code{sub()} possa memorizzare un valore modificato.  Se questo argomento @`e
+omesso, il comportamento di default @`e
+quello di usare e modificare
+@code{$0}.@footnote{Si noti che questo significa che il record sar@`a dapprima
+ricostruito, usando il valore di @code{OFS} se qualche campo @`e stato cambiato,
+e che i campi saranno aggiornati dopo la sostituzione, anche se l'operazione in
+s@'e non cambia il record (@`e una ``no-op'') come @samp{sub(/^/, "")}.}  Per
+esempio:
+
+@example
+str = "acqua, acqua dappertutto"
+sub(/cqu/, "vari", str)
+@end example
+
+@noindent
+modifica @code{stringa} facendola divenire
+@w{@samp{avaria, acqua dappertutto}},
+rimpiazzando l'occorrenza pi@`u lunga,
+a partire da sinistra, di @samp{cqu} con @samp{vari}.
+
+Se il carattere speciale @samp{&} compare in @var{rimpiazzo}, designa
+l'esatta sottostringa individuata da @var{regexp}.  (Se
+@dfn{regexp} pu@`o individuare pi@`u di una stringa, questa sottostringa
+pu@`o assumere valori diversi.)  Per esempio:
+
+@example
+@{ sub(/candidato/, "& e sua moglie"); print @}
+@end example
+
+@noindent
+cambia la prima occorrenza di @samp{candidato} a @samp{candidato
+e sua moglie} in ogni riga in input.
+Ecco un altro esempio:
+
+@example
+$ @kbd{awk 'BEGIN @{}
+>         @kbd{str = "daabaaa"}
+>         @kbd{sub(/a+/, "C&C", str)}
+>         @kbd{print str}
+> @kbd{@}'}
+@print{} dCaaCbaaa
+@end example
+
+@noindent
+questo mostra come @samp{&} possa rappresentare una stringa variabile
+e illustra anche la regola
+``a partire da sinistra, la pi@`u lunga'' nell'individuazione di @dfn{regexp}
+(@pxref{Pi@`u lungo da sinistra}).
+
+L'effetto di questo carattere speciale (@samp{&}) pu@`o essere neutralizzato
+anteponendogli una barra inversa nella stringa.  Come al solito, per
+inserire una barra inversa nella
+stringa, occorre scrivere due barre inverse.  Quindi, occorre scrivere
+@samp{\\&} in una costante stringa per includere un carattere @samp{&}
+nel rimpiazzo.
+Per esempio, quanto segue mostra come rimpiazzare il primo @samp{|} su
+ogni riga con un @samp{&}:
+
+@example
+@{ sub(/\|/, "\\&"); print @}
+@end example
+
+@cindex @code{sub()}, funzione, argomenti di
+@cindex funzione @code{sub()}, argomenti di
+@cindex @code{gsub()}, funzione, argomenti di
+@cindex funzione @code{gsub()}, argomenti di
+Come gi@`a accennato, il terzo argomento di @code{sub()} dev'essere
+una variabile, un campo, o un elemento di vettore.
+Alcune versioni di @command{awk} accettano come terzo argomento
+un'espressione che non @`e un @dfn{lvalue}.  In tal caso, @code{sub()}
+cerca ugualmente l'espressione e restituisce zero o uno, ma il risultato
+della sostituzione (se ce n'@`e uno) viene scartato perch@'e non c'@`e un posto
+dove memorizzarlo.  Tali versioni di @command{awk} accettano espressioni
+come le seguente:
+
+@example
+sub(/USA/, "Stati Uniti", "gli USA e il Canada")
+@end example
+
+@noindent
+@cindex risoluzione di problemi, funzioni @code{gsub()}/@code{sub()}
+@cindex problemi, risoluzione di, funzioni @code{gsub()}/@code{sub()}
+Per compatibilit@`a storica, @command{gawk} accetta un tale codice erroneo.
+Tuttavia, l'uso di qualsiasi altra espressione non modificabile
+come terzo parametro causa un errore fatale, e il programma
+non viene portato a termine.
+
+Infine, se la @var{regexp} non @`e una costante @dfn{regexp}, @`e convertita
+in una stringa, e quindi il valore di quella stringa @`e trattato come
+la @dfn{regexp} da individuare.
+
+@item @code{substr(@var{stringa}, @var{inizio}} [@code{, @var{lunghezza}} ]@code{)}
+@cindexawkfunc{substr}
+@cindex sottostringa
+Restituisce una sottostringa di @var{stringa} lunga @var{lunghezza} caratteri,
+iniziando dal carattere numero @var{inizio}.  Il primo carattere di una
+stringa @`e il carattere numero uno.@footnote{Questo @`e differente da
+C e C++, in cui il primo carattere ha il numero zero.}
+Per esempio, @code{substr("Washington", 5, 3)} restituisce @code{"ing"}.
+
+Se @var{lunghezza} non @`e presente, @code{substr()} restituisce l'intero
+suffisso di
+@var{stringa} a partire dal carattere numero @var{inizio}.  Per esempio,
+@code{substr("Washington", 5)} restituisce @code{"ington"}.  L'intero
+suffisso @`e restituito anche
+se @var{lunghezza} @`e maggiore del numero di caratteri disponibili
+nella stringa, a partire dal carattere @var{inizio}.
+
+@cindex Brian Kernighan, @command{awk} di
+Se @var{inizio} @`e minore di uno, @code{substr()} lo tratta come se
+fosse uno. (POSIX non specifica cosa fare in questo caso:
+BWK @command{awk} si comporta cos@`{@dotless{i}}, e quindi @command{gawk} fa lo stesso.)
+Se @var{inizio} @`e maggiore del numero di caratteri
+nella stringa, @code{substr()} restituisce la stringa nulla.
+Analogamente, se @var{lunghezza} @`e presente ma minore o uguale a zero,
+viene restituita la stringa nulla.
+
+@cindex risoluzione di problemi, funzione @code{substr()}
+@cindex problemi, risoluzione di, funzione @code{substr()}
+La stringa restituita da @code{substr()} @emph{non pu@`o} essere
+assegnata.  Quindi, @`e un errore tentare di modificare una porzione di
+una stringa, come si vede nel seguente esempio:
+
+@example
+stringa = "abcdef"
+# tentare di ottenere "abCDEf", non @`e possibile
+substr(stringa, 3, 3) = "CDE"
+@end example
+
+@noindent
+@`E anche un errore usare @code{substr()} come terzo argomento
+di @code{sub()} o @code{gsub()}:
+
+@example
+gsub(/xyz/, "pdq", substr($0, 5, 20))  # SBAGLIATO
+@end example
+
+@cindex portabilit@`a, funzione @code{substr()}
+(Alcune versioni commerciali di @command{awk} consentono un tale uso di
+@code{substr()}, ma un tale codice non @`e portabile.)
+
+Se si devono sostituire pezzi di una stringa,
+si combini @code{substr()}
+con una concatenazione di stringa, nel modo seguente:
+
+@example
+stringa = "abcdef"
+@dots{}
+stringa = substr(stringa, 1, 2) "CDE" substr(stringa, 6)
+@end example
+
+@cindex maiuscolo/minuscolo, conversione da/a
+@cindex stringhe, convertire maiuscolo/minuscolo
+@item @code{tolower(@var{stringa})}
+@cindexawkfunc{tolower}
+@cindex convertire stringa in minuscolo
+Restituisce una copia di @var{stringa}, con ogni carattere maiuscolo
+nella stringa rimpiazzato dal suo corrispondente carattere minuscolo.
+I caratteri non alfabetici non vengono modificati.  Per esempio,
+@code{tolower("MaIuScOlO MiNuScOlO 123")} restituisce
+@code{"maiuscolo minuscolo 123"}.
+
+@item @code{toupper(@var{stringa})}
+@cindexawkfunc{toupper}
+@cindex convertire stringa in maiuscolo
+Restituisce una copia di @var{stringa}, con ogni carattere minuscolo
+nella stringa rimpiazzato dal suo corrispondente carattere maiuscolo.
+I caratteri non alfabetici non vengono modificati.  Per esempio,
+@code{tolower("MaIuScOlO MiNuScOlO 123")} restituisce
+@code{"MAIUSCOLO MINUSCOLO 123"}.
+@end table
+
+@sidebar Individuare la stringa nulla
+@cindex individuare la stringa nulla
+@cindex stringa nulla, individuare la
+@cindex @code{*} (asterisco), operatore @code{*}, individuare la stringa nulla
+@cindex asterisco (@code{*}), operatore @code{*}, individuare la stringa nulla
+
+In @command{awk}, l'operatore @samp{*} pu@`o individuare la stringa nulla.
+Questo @`e particolarmente importante per le funzioni @code{sub()},
+@code{gsub()} e @code{gensub()}.  Per esempio:
+
+@example
+$ @kbd{echo abc | awk '@{ gsub(/m*/, "X"); print @}'}
+@print{} XaXbXcX
+@end example
+
+@noindent
+Sebbene questo sia abbastanza sensato, pu@`o suscitare una certa sorpresa.
+@end sidebar
+
+
+@node Dettagli ostici
+@subsubsection Ulteriori dettagli su @samp{\} e @samp{&} con @code{sub()}, @code{gsub()} e @code{gensub()}
+
+@cindex protezione caratteri nelle funzioni @code{gsub()}/@code{gensub()}/@code{sub()}
+@cindex funzione @code{sub()}, protezione caratteri
+@cindex @code{sub()}, funzione, protezione caratteri
+@cindex funzione @code{gsub()}, protezione caratteri
+@cindex @code{gsub()}, funzione, protezione caratteri
+@cindex funzione @code{gensub()} (@command{gawk}), protezione caratteri
+@cindex @code{gensub()}, funzione (@command{gawk}), protezione caratteri
+@cindex @code{\} (barra inversa), @code{gsub()}/@code{gensub()}/@code{sub()} funzioni e
+@cindex barra inversa (@code{\}), @code{gsub()}/@code{gensub()}/@code{sub()} funzioni e
+@cindex @code{&} (e commerciale), funzioni @code{gsub()}/@code{gensub()}/@code{sub()} e
+@cindex e commerciale (@code{&}), funzioni @code{gsub()}/@code{gensub()}/@code{sub()} e
+
+@quotation ATTENZIONE
+Si dice che questa sottosezione possa causare dei mal di testa.
+In prima lettura pu@`o essere benissimo saltata.
+@end quotation
+
+Quando si usa @code{sub()}, @code{gsub()} o @code{gensub()}, e si
+desidera includere delle
+barre inverse e delle "e commerciali" (@code{&}) nel testo da sostituire
+@`e necessario ricordare che ci sono parecchi livelli di
+@dfn{protezione caratteri} in gioco.
+
+Anzitutto, vi @`e il livello @dfn{lessicale}, quello in cui @command{awk}
+legge un programma e ne costruisce una copia interna da eseguire.
+Poi c'@`e il momento dell'esecuzione, quello in cui @command{awk}
+esamina effettivamente la stringa da sostituire, per determinare cosa
+fare.
+
+@cindex Brian Kernighan, @command{awk} di
+In entrambi i livelli, @command{awk} ricerca un dato insieme di caratteri
+che possono venire dopo una
+barra inversa.  A livello lessicale, cerca le sequenze di protezione
+elencate in @ref{Sequenze di protezione}.
+Quindi, per ogni @samp{\} che @command{awk} elabora al momento
+dell'esecuzione, occorre immetterne due a livello lessicale.
+Quando un carattere che non ha necessit@`a di una sequenza di protezione
+segue una @samp{\}, sia BWK @command{awk} che  @command{gawk} semplicemente
+rimuovono la @samp{\} stessa e
+mettono il carattere seguente nella stringa.  Quindi, per esempio,
+@code{"a\qb"} @`e trattato come se si fosse scritto @code{"aqb"}.
+
+Al momento dell'esecuzione, le varie funzioni gestiscono sequenze di
+@samp{\} e @samp{&} in maniera differente.  La situazione @`e (purtroppo)
+piuttosto complessa.
+Storicamente, le funzioni @code{sub()} e @code{gsub()} trattavano la
+sequenza di due caratteri @samp{\&} in maniera speciale; questa sequenza
+era rimpiazzata nel testo
+generato da un singolo carattere @samp{&}.  Ogni altra @samp{\} contenuta
+nella stringa @var{rimpiazzo} che non era posta prima di una @samp{&} era
+lasciata passare senza modifiche.
+Questo @`e illustrato nella @ref{table-sub-escapes}.
+
+@c Thank to Karl Berry for help with the TeX stuff.
+@float Tabella,table-sub-escapes
+@caption{Elaborazione storica delle sequenze di protezione per @code{sub()} e @code{gsub()}}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+     Immissione!@code{sub()} vede!@code{sub()} genera_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+     @code{\&}!       @code{&}!Il testo individuato_cr
+    @code{\\&}!      @code{\&}!Il carattere @samp{&}_cr
+   @code{\\\&}!      @code{\&}!Il carattere @samp{&}_cr
+  @code{\\\\&}!     @code{\\&}!I caratteri @samp{\&}_cr
+ @code{\\\\\&}!     @code{\\&}!I caratteri @samp{\&}_cr
+@code{\\\\\\&}!    @code{\\\&}!I caratteri @samp{\\&}_cr
+    @code{\\q}!      @code{\q}!I caratteri @samp{\q}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem Immissione @tab @code{sub()} vede @tab @code{sub()} genera
+@item @code{\&}      @tab @code{&}    @tab Il testo individuato
+@item @code{\\&}     @tab @code{\&}   @tab Il carattere @samp{&}
+@item @code{\\\&}    @tab @code{\&}   @tab Il carattere @samp{&}
+@item @code{\\\\&}   @tab @code{\\&}  @tab I caratteri @samp{\&}
+@item @code{\\\\\&}  @tab @code{\\&}  @tab I caratteri @samp{\&}
+@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\\&}
+@item @code{\\q}     @tab @code{\q}   @tab I caratteri @samp{\q}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+ Immissione      @code{sub()} vede    @code{sub()} genera
+ ---------------          -------------          ---------------
+     @code{\&}                  @code{&}                  Il testo individuato
+    @code{\\&}                 @code{\&}                  La lettera @samp{&}
+   @code{\\\&}                 @code{\&}                  La lettera @samp{&}
+  @code{\\\\&}                @code{\\&}                  Le lettere @samp{\&}
+ @code{\\\\\&}                @code{\\&}                  Le lettere @samp{\&}
+@code{\\\\\\&}               @code{\\\&}                  Le lettere @samp{\\&}
+    @code{\\q}                 @code{\q}                  Le lettere @samp{\q}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+@noindent
+Questa tabella mostra l'elaborazione a livello lessicale, in cui
+un numero dispari di barre inverse diventa un numero pari al momento
+dell'esecuzione,
+e mostra anche l'elaborazione in fase di esecuzione fatta da @code{sub()}.
+(Per amor di semplicit@`a le tavole che ancora seguono mostrano solo il caso
+di un numero pari di barre inverse immesso a livello lessicale.)
+
+Il problema con l'approccio storico @`e che non c'@`e modo di ottenere
+un carattere @samp{\} seguito dal testo individuato.
+
+Parecchie edizioni dello standard POSIX hanno provato a risolvere questo
+problema, senza riuscirci.  I dettagli sono irrilevanti in questo contesto.
+
+A un certo punto, il manutentore di @command{gawk} ha presentato una
+proposta per una revisione dello standard per tornare
+a regole che corrispondano pi@`u da vicino alla prassi originalmente seguita.
+Le regole proposte hanno dei casi speciali che rendono possibile
+produrre una @samp{\} prima del
+testo individuato. Questo si pu@`o vedere nella
+@ref{table-sub-proposed}.
+
+@float Tabella,table-sub-proposed
+@caption{Regole @command{gawk} per @code{sub()} e barra inversa}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+   Immissione!@code{sub()} vede!@code{sub()} genera_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+@code{\\\\\\&}!     @code{\\\&}!I caratteri @samp{\&}_cr
+@code{\\\\&}!     @code{\\&}!Il carattere @samp{\}, seguito dal testo individuato_cr
+  @code{\\&}!      @code{\&}!Il carattere @samp{&}_cr
+  @code{\\q}!      @code{\q}!I caratteri @samp{\q}_cr
+ @code{\\\\}!      @code{\\}!@code{\\}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem Immissione @tab @code{sub()} vede @tab @code{sub()} genera
+@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\&}
+@item @code{\\\\&}   @tab @code{\\&}  @tab Il carattere @samp{\}, seguito dal testo individuato
+@item @code{\\&}     @tab @code{\&}   @tab Il carattere @samp{&}
+@item @code{\\q}     @tab @code{\q}   @tab I caratteri @samp{\q}
+@item @code{\\\\}    @tab @code{\\}   @tab @code{\\}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+Immissione              @code{sub()} vede         @code{sub()} genera
+---------         ----------         ---------------
+@code{\\\\\\&}           @code{\\\&}            Il carattere @samp{\&}
+  @code{\\\\&}            @code{\\&}            Il carattere @samp{\}, seguito dal testo individuato
+    @code{\\&}             @code{\&}            Il carattere @samp{&}
+    @code{\\q}             @code{\q}            I caratteri @samp{\q}
+   @code{\\\\}             @code{\\}            @code{\\}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+In breve, al momento dell'esecuzione, ci sono ora tre sequenze speciali
+di caratteri (@samp{\\\&}, @samp{\\&}, e @samp{\&}) mentre tradizionalmente
+ce n'era una sola.  Tuttavia, come nel caso storico, ogni @samp{\} che
+non fa parte di una di queste tre sequenze non @`e speciale e appare
+nell'output cos@`{@dotless{i}} come @`e scritto.
+
+@command{gawk} 3.0 e 3.1 seguono queste regole per @code{sub()} e
+@code{gsub()}.  La revisione dello standard POSIX ha richiesto molto pi@`u tempo
+di quel che ci si attendeva.  Inoltre, la proposta del manutentore di
+@command{gawk} @`e andata persa durante il processo di standardizzazione.  Le
+regole finali risultanti sono un po' pi@`u semplici.  I risultati sono simili,
+tranne che in un caso.
+
+@cindex POSIX @command{awk}, funzioni @code{gsub()}/@code{sub()} e
+Le regole POSIX stabiliscono che @samp{\&} nella stringa di rimpiazzo
+produca il carattere @samp{&}, @samp{\\} produce il carattere @samp{\},
+e che @samp{\} seguito da qualsiasi carattere non @`e speciale; la @samp{\}
+@`e messa direttamente nell'output.
+Queste regole sono presentate nella @ref{table-posix-sub}.
+
+@float Tabella,table-posix-sub
+@caption{Regole POSIX per @code{sub()} e @code{gsub()}}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+   Immissione!@code{sub()} vede!@code{sub()} genera_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+@code{\\\\\\&}!     @code{\\\&}!I caratteri @samp{\&}_cr
+@code{\\\\&}!     @code{\\&}!Il carattere @samp{\}, seguito dal testo individuato_cr
+  @code{\\&}!      @code{\&}!Il carattere @samp{&}_cr
+  @code{\\q}!      @code{\q}!I caratteri @samp{\q}_cr
+ @code{\\\\}!      @code{\\}!@code{\}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitemImmissione @tab @code{sub()} vede @tab @code{sub()} genera
+@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\&}
+@item @code{\\\\&}   @tab @code{\\&}  @tab Il carattere @samp{\}, seguito dal testo individuato
+@item @code{\\&}     @tab @code{\&}   @tab I caratteri @samp{&}
+@item @code{\\q}     @tab @code{\q}   @tab I caratteri @samp{\q}
+@item @code{\\\\}    @tab @code{\\}   @tab @code{\}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+Immissione         @code{sub()} vede         @code{sub()} genera
+---------         ----------         ---------------
+@code{\\\\\\&}           @code{\\\&}            I caratteri @samp{\&}
+  @code{\\\\&}            @code{\\&}            Il carattere @samp{\}, seguito dal testo individuato
+    @code{\\&}             @code{\&}            Il carattere @samp{&}
+    @code{\\q}             @code{\q}            I caratteri @samp{\q}
+   @code{\\\\}             @code{\\}            @code{\}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+Il solo caso in cui la differenza @`e rilevante @`e l'ultimo: @samp{\\\\}
+@`e visto come @samp{\\} e produce @samp{\} invece che @samp{\\}.
+
+A partire dalla @value{PVERSION} 3.1.4, @command{gawk} ha seguito le regole
+POSIX quando si specifica @option{--posix} (@pxref{Opzioni}). Altrimenti, ha
+continuato a seguire le regole proposte [a POSIX], poich@'e questa @`e stato il
+comportamento seguito per parecchi anni.
+
+Quando la @value{PVERSION} 4.0.0 @`e stata rilasciata, il manutentore di
+@command{gawk}
+ha stabilito come default le regole POSIX, interrompendo cos@`{@dotless{i}} oltre
+un decennio di compatibilit@`a
+all'indietro.@footnote{Questa decisione si @`e dimostrata piuttosto avventata,
+anche se una nota in questa sezione avvertiva che la successiva versione
+principale di @command{gawk} avrebbe adottato le regole POSIX.}
+Inutile dire che questa non @`e stata una buona idea, e quindi dalla
+@value{PVERSION} 4.0.1, @command{gawk} ha ripreso il suo comportamento
+tradizionale, seguendo le regole POSIX solo quando si specifica l'opzione
+@option{--posix}.
+
+Le regole per @code{gensub()} sono molto pi@`u semplici. Al momento
+dell'esecuzione, quando @command{gawk} vede una @samp{\}, se il carattere
+seguente @`e una cifra,
+il testo individuato dalla corrispondente sottoespressione tra parentesi
+@`e inserito nell'output generato.  Altrimenti, qualsiasi carattere segua la
+@samp{\} viene inserito nel testo generato, mentre la @samp{\} va persa,
+come si vede nella @ref{table-gensub-escapes}.
+
+@float Tabella,table-gensub-escapes
+@caption{Elaborazione sequenze di protezione in @code{gensub()}}
+@tex
+\vbox{\bigskip
+% We need more characters for escape and tab ...
+\catcode`_ = 0
+\catcode`! = 4
+% ... since this table has lots of &'s and \'s, so we unspecialize them.
+\catcode`\& = \other \catcode`\\ = \other
+_halign{_hfil#!_qquad_hfil#!_qquad#_hfil_cr
+   Immissione!@code{gensub()} vede!@code{gensub()} genera_cr
+_hrulefill!_hrulefill!_hrulefill_cr
+      @code{&}!           @code{&}!Il testo individuato_cr
+    @code{\\&}!          @code{\&}!Il carattere @samp{&}_cr
+   @code{\\\\}!          @code{\\}!Il carattere @samp{\}_cr
+  @code{\\\\&}!         @code{\\&}!Il carattere @samp{\}, seguito dal testo individuato_cr
+@code{\\\\\\&}!        @code{\\\&}!I caratteri @samp{\&}_cr
+    @code{\\q}!          @code{\q}!Il carattere @samp{q}_cr
+}
+_bigskip}
+@end tex
+@ifdocbook
+@multitable @columnfractions .20 .20 .60
+@headitem Immissione @tab @code{gensub()} vede @tab @code{gensub()} genera
+@item @code{&}       @tab @code{&}    @tab Il testo individuato
+@item @code{\\&}     @tab @code{\&}   @tab Il carattere @samp{&}
+@item @code{\\\\}    @tab @code{\\}   @tab Il carattere @samp{\}
+@item @code{\\\\&}   @tab @code{\\&}  @tab Il carattere @samp{\}, seguito dal testo individuato
+@item @code{\\\\\\&} @tab @code{\\\&} @tab I caratteri @samp{\&}
+@item @code{\\q}     @tab  @code{\q}  @tab Il carattere @samp{q}
+@end multitable
+@end ifdocbook
+@ifnottex
+@ifnotdocbook
+@display
+ Immissione          @code{gensub()} vede         @code{gensub()} genera
+ ---------          -------------         ------------------
+      @code{&}                    @code{&}            Il testo individuato
+    @code{\\&}                   @code{\&}            Il carattere @samp{&}
+   @code{\\\\}                   @code{\\}            Il carattere @samp{\}
+  @code{\\\\&}                  @code{\\&}            Il carattere @samp{\}, seguito dal testo individuato
+@code{\\\\\\&}                 @code{\\\&}            I caratteri @samp{\&}
+    @code{\\q}                   @code{\q}            Il carattere @samp{q}
+@end display
+@end ifnotdocbook
+@end ifnottex
+@end float
+
+A causa della complessit@`a dell'elaborazione a livello lessicale e in fase
+di esecuzione, e dei casi speciali di @code{sub()} e @code{gsub()},
+si raccomanda l'uso di @command{gawk} e di @code{gensub()} quando ci siano
+da fare delle sostituzioni.
+
+@node Funzioni di I/O
+@subsection Funzioni di Input/Output
+@cindex input/output, funzioni di
+@cindex funzioni di input/output
+
+Le seguenti funzioni riguardano l'input/output (I/O).
+I parametri opzionali sono racchiusi tra parentesi quadre ([ ]):
+
+@table @asis
+@item @code{close(}@var{nome_file} [@code{,} @var{come}]@code{)}
+@cindexawkfunc{close}
+@cindex file, chiusura
+@cindex chiudere un file o un coprocesso
+Chiude il file @var{nome_file} in input o in output. Alternativamente,
+l'argomento pu@`o essere un comando della shell usato per creare un
+coprocesso, o per ridirigere
+verso o da una @dfn{pipe}; questo coprocesso o @dfn{pipe} viene chiuso.
+@xref{Chiusura file e @dfn{pipe}}
+per ulteriori informazioni.
+
+Quando si chiude un coprocesso, pu@`o talora essere utile chiudere dapprima
+un lato della @dfn{pipe} bidirezionale e quindi chiudere l'altro.
+Questo si pu@`o fare fornendo un secondo argomento a @code{close()}.
+Questo secondo argomento (@var{come})
+dovrebbe essere una delle due stringhe @code{"to"} o @code{"from"},
+che indicano quale lato della @dfn{pipe} chiudere.  La stringa pu@`o essere
+scritta indifferentemente in maiuscolo o in minuscolo.
+@xref{I/O bidirezionale},
+che tratta questa funzionalit@`a con maggior dettaglio e mostra un esempio.
+
+Si noti che il secondo argomento di @code{close()} @`e
+un'estensione @command{gawk}; non @`e disponibile in modalit@`a compatibile
+(@pxref{Opzioni}).
+
+@item @code{fflush(}[@var{nome_file}]@code{)}
+@cindexawkfunc{fflush}
+@cindex scrivere su disco i buffer di output contenuti in memoria
+Scrive su disco ogni output contenuto in memoria, associato con
+@var{nome_file}, che @`e o un
+file aperto in scrittura o un comando della shell che ridirige output a
+una @dfn{pipe} o a un coprocesso.
+
+@cindex buffer, scrivere su disco un
+@cindex memoria tampone, scrivere su disco
+@cindex output, bufferizzazione
+@cindex output, nella memoria tampone (buffer)
+Molti programmi di utilit@`a @dfn{bufferizzano} il loro output (cio@`e,
+accumulano in memoria record da scrivere in un file su disco o sullo
+schermo, fin quando non arriva il momento giusto per inviare i
+dati al dispositivo di output).
+Questo @`e spesso pi@`u efficiente che scrivere
+ogni particella di informazione non appena diventa disponibile.  Tuttavia,
+qualche volta @`e necessario forzare un programma a @dfn{svuotare}
+i suoi buffer (cio@`e, inviare l'informazione alla sua destinazione,
+anche se un buffer non @`e pieno).
+Questo @`e lo scopo della funzione @code{fflush()}; anche
+@command{gawk} scrive il suo output in un buffer, e la funzione @code{fflush()}
+forza @command{gawk} a svuotare i suoi buffer.
+
+@cindex estensioni comuni, funzione @code{fflush()}
+@cindex Brian Kernighan, @command{awk} di
+Brian Kernighan ha aggiunto @code{fflush()} al suo @command{awk} nell'aprile
+1992.  Per due decenni @`e rimasta un'estensione comune. A Dicembre
+2012 @`e stata accettata e inclusa nello standard POSIX.
+Si veda @uref{http://austingroupbugs.net/view.php?id=634, il sito Web dell'Austin Group}.
+
+POSIX standardizza @code{fflush()} come segue: se non c'@`e alcun
+argomento, o se l'argomento @`e la stringa nulla (@w{@code{""}}),
+@command{awk} svuota i buffer di @emph{tutti} i file in output e di
+@emph{tutte} le @dfn{pipe}.
+
+@quotation NOTA
+Prima della @value{PVERSION} 4.0.2, @command{gawk}
+avrebbe svuotato solo i buffer dello standard output se non era
+specificato alcun argomento,
+e svuotato tutti i buffer dei file in output e delle @dfn{pipe} se
+l'argomento era la stringa nulla.
+Questo @`e stato modificato per essere compatibile con l'@command{awk} di
+Kernighan, nella speranza che standardizzare questa
+funzionalit@`a in POSIX sarebbe stato pi@`u agevole (come poi @`e effettivamente
+successo).
+
+Con @command{gawk},
+si pu@`o usare @samp{fflush("/dev/stdout")} se si desidera solo svuotare i
+buffer dello standard output.
+@end quotation
+
+@c @cindex automatic warnings
+@c @cindex warnings, automatic
+@cindex risoluzione di problemi, funzione @code{fflush()}
+@cindex problemi, risoluzione di, funzione @code{fflush()}
+@code{fflush()} restituisce zero se il buffer @`e svuotato con successo;
+altrimenti, restituisce un valore diverso da zero. (@command{gawk}
+restituisce @minus{}1.)
+Nel caso in cui tutti i buffer vadano svuotati, il valore restituito @`e zero
+solo se tutti i buffer sono stati svuotati con successo.  Altrimenti,
+@`e @minus{}1, e @command{gawk} avvisa riguardo al @var{nome_file}
+che ha problemi.
+
+@command{gawk} invia anche un messaggio di avvertimento se si tenta di svuotare i
+buffer di un file o @dfn{pipe} che era stato aperto in lettura
+(p.es. con @code{getline}),
+o se @var{nome_file} non @`e un file, una @dfn{pipe}, o un coprocesso aperto.
+in tal caso, @code{fflush()} restituisce ancora @minus{}1.
+
+@c end the table to let the sidebar take up the full width of the page.
+@end table
+
+@sidebar Bufferizzazione interattiva e non interattiva
+@cindex bufferizzazione, interattiva vs.@: non interattiva
+
+A complicare ulteriormente le cose, i problemi di bufferizzazione possono
+peggiorare se il programma eseguito
+@`e @dfn{interattivo} (cio@`e, se
+comunica con un utente seduto davanti a una tastiera).@footnote{Un programma
+@`e interattivo se il suo standard output @`e connesso a un dispositivo
+terminale.  Ai giorni nostri, questo vuol dire davanti a uno
+schermo e a una tastiera.}
+
+@c Thanks to Walter.Mecky@dresdnerbank.de for this example, and for
+@c motivating me to write this section.
+I programmi interattivi normalmente @dfn{bufferizzano per riga} il loro
+output (cio@`e, scrivono in output una riga alla volta).  I programmi
+non-interattivi attendono di aver riempito un buffer, il che pu@`o voler dire
+anche parecchie righe di output.
+Ecco un esempio della differenza:
+
+@example
+$ @kbd{awk '@{ print $1 + $2 @}'}
+@kbd{1 1}
+@print{} 2
+@kbd{2 3}
+@print{} 5
+@kbd{Ctrl-d}
+@end example
+
+@noindent
+Ogni riga di output @`e stampata immediatamente. Si confronti questo
+comportamente con quello di questo esempio:
+
+@example
+$ @kbd{awk '@{ print $1 + $2 @}' | cat}
+@kbd{1 1}
+@kbd{2 3}
+@kbd{Ctrl-d}
+@print{} 2
+@print{} 5
+@end example
+
+@noindent
+In questo caso, nessun output viene stampato finch@'e non @`e stato battuto il
+@kbd{Ctrl-d}, perch@'e l'output @`e bufferizzato e inviato tramite
+@dfn{pipe} al comando @command{cat} in un colpo solo.
+@end sidebar
+
+@table @asis
+@item @code{system(@var{comando})}
+@cindexawkfunc{system}
+@cindex chiamare comandi di shell
+@cindex interagire con altri programmi
+Esegue il comando del sistema operativo @var{comando} e quindi
+ritorna al programma @command{awk}.
+Restituisce il codice di ritorno di @var{comando}.
+
+Per esempio, inserendo il seguente frammento di codice in un programma
+@command{awk}:
+
+@example
+END @{
+     system("date | mail -s 'awk completato' root")
+@}
+@end example
+
+@noindent
+all'amministratore di sistema viene inviato un messaggio di posta quando
+il programma @command{awk} termina di elaborare l'input e inizia
+l'elaborazione da eseguire alla fine dell'input.
+
+Si noti che la ridirezione di @code{print} o @code{printf} in una
+@dfn{pipe} @`e spesso sufficiente per ottenere lo stesso risultato.
+Se @`e necessario eseguire parecchi comandi, @`e pi@`u efficiente
+stamparli verso una @dfn{pipe} diretta alla shell:
+
+@example
+while (@var{ancora lavoro da fare})
+    print @var{comando} | "/bin/sh"
+close("/bin/sh")
+@end example
+
+@noindent
+@cindex risoluzione di problemi, funzione @code{system()}
+@cindex problemi, risoluzione di, funzione @code{system()}
+@cindex @option{--sandbox}, opzione, disabilitare la funzione @code{system()}
+@cindex opzione @option{--sandbox}, disabilitare la funzione @code{system()}
+Tuttavia, nel caso che il programma @command{awk} sia interattivo,
+@code{system()} @`e utile per eseguire grossi programmi autonomi,
+come ad esempio la shell o un programma di modifica testi.
+Alcuni sistemi operativi non consentono di implementare la funzione
+@code{system()}.
+Richiamare @code{system()} in sistemi in cui non @`e disponibile provoca
+un errore fatale.
+
+@quotation NOTA
+Quando si specifica l'opzione @option{--sandbox}, la funzione @code{system()} @`e
+disabilitata (@pxref{Opzioni}).
+@end quotation
+
+Nei sistemi aderenti allo standard POSIX, il codice di ritorno di un
+comando @`e un numero contenuto in 16 bit.  Il valore del codice di ritorno
+passato alla funzione C @code{exit()} alla fine del programma @`e contenuto
+negli 8 bit di valore pi@`u alto dei 16 bit (la met@`a sinistra) che compongono
+il numero.  I bit di valore pi@`u basso (la met@`a destra) indicano se il
+processo @`e stato terminato da un segnale (bit 7), e, se questo @`e il caso,
+il numero del segnale che ha provocato la terminazione (bit 0--6).
+
+Tradizionalmente, la funzione @code{system()} di @command{awk} si @`e
+semplicemente limitata a restituire il valore del codice di ritorno
+diviso per 256 (ossia la met@`a sinistra del numero di 16 bit, spostata
+a destra).  In una situazione normale questo equivale a utilizzare il
+codice di ritornodi @code{system()}, ma nel caso in cui il programma sia
+stato terminato da un segnale, il valore diventa un numero frazionale in
+virgola mobile.@footnote{In uno scambio di messaggi privato il Dr.@:
+Kernighan mi ha comunicato che questo modo di procedere @`e probabilmente
+errato.}  POSIX stabilisce che la chiamata a @code{system()} dall'interno
+di @command{awk} dovrebbe restituire l'intero valore a 16 bit.
+
+@command{gawk} si trova in qualche modo a met@`a strada.
+I valori del codice di ritorno sono descritti nella
+@ref{table-system-return-values}.
+
+@float Tabella,table-system-return-values
+@caption{Valori codici di ritorno da chiamata a @code{system()}}
+@multitable @columnfractions .40 .60
+@headitem Situazione @tab Valore codice di ritorno da @code{system()}
+@item @option{--traditional} @tab Valore dalla funzione C @code{system()}/256
+@item @option{--posix} @tab Valore dalla funzione C @code{system()}
+@item Uscita normale dal comando @tab Codice di ritorno del comando
+@item Terminazione da un segnale @tab 256 + numero segnale "assassino"
+@item Terminazione da un segnale con dump memoria @tab 512 + numero segnale "assassino"
+@item Qualsiasi tipo di errore @tab @minus{}1
+@end multitable
+@end float
+@end table
+
+A partire dalla versione di agosto 2018, BWK @command{awk} si comporta
+come @command{gawk} per il codice di ritorno della chiamata @code{system()}.
+
+@sidebar Controllare la bufferizzazione dell'output con @code{system()}
+@cindex buffer, scrivere su disco un
+@cindex bufferizzazione, dell'input/output
+@cindex output, bufferizzazione
+@cindex bufferizzazione, dell'output
+
+La funzione @code{fflush()} consente un controllo esplicito sulla
+bufferizzazione dell'output per singoli file e @dfn{pipe}.
+Tuttavia, il suo utilizzo non @`e portabile su molte delle meno recenti
+implementazioni di @command{awk}.  Un metodo alternativo per forzare la
+scrittura dell'output @`e una chiamata a
+@code{system()} che abbia come argomento la stringa nulla:
+
+@example
+system("")   # scrive l'output su disco
+@end example
+
+@noindent
+@command{gawk} tratta questo uso della funzione @code{system()} come un
+caso speciale, e si guarda bene dall'invocare la shell (o un altro
+interprete di comandi) con un comando nullo.
+Quindi, con @command{gawk}, questa maniera di procedere non @`e solo utile,
+ma @`e anche efficiente.
+Questo metodo dovrebbe funzionare anche con
+altre implementazioni di @command{awk}, ma non @`e detto che eviti una
+invocazione non necessaria della shell.  (Altre implementazioni potrebbero
+limitarsi a forzare la scrittura del buffer associato con lo
+standard output, e non necessariamente di tutto l'output bufferizzato.)
+
+Avendo in mente le attese di un programmatore, sarebbe sensato che
+@code{system()} forzi la scrittura su disco di tutto l'output disponibile.
+Il programma seguente:
+
+@example
+BEGIN @{
+     print "prima riga stampata"
+     system("echo system echo")
+     print "seconda riga stampata"
+@}
+@end example
+
+@noindent
+deve stampare:
+
+@example
+prima riga stampata
+system echo
+seconda riga stampata
+@end example
+
+@noindent
+e non:
+
+@example
+system echo
+prima riga stampata
+seconda riga stampata
+@end example
+
+Se @command{awk} non forzasse la scrittura dei suoi buffer prima di
+invocare @code{system()}, l'output sarebbe quest'ultimo (quello non voluto).
+@end sidebar
+
+@node Funzioni di tempo
+@subsection Funzioni per gestire marcature temporali
+@cindex funzioni di tempo
+
+@cindex marcature temporali
+@cindex data e ora, si veda marcature temporali
+@cindex @dfn{log} (registro), file di, marcature temporali nei
+@cindex registro (@dfn{log}), file di, marcature temporali nel
+@cindex file di registro (@dfn{log}), marcature temporali nei
+@cindex @command{gawk}, data e ora (marcature temporali)
+@cindex POSIX @command{awk}, marcature temporali e
+I programmi @command{awk} sono frequentemente usati per elaborare file di
+registro [file con estensione .log], che contengono l'informazione sulla data e
+l'ora (marcatura temporale) in cui un particolare record @`e stato registrato sul log.
+Molti programmi registrano questa informazione nel formato restituito
+dalla chiamata di sistema @code{time()}, la quale misura il numero di secondi
+trascorsi a partire da una certa data iniziale (Epoca).  Nei sistemi aderenti
+allo standard POSIX, questo @`e il numero di secondi a partire dal primo gennaio
+1970, ora di Greenwich (1970-01-01 00:00:00 UTC), senza includere i secondi
+@ifclear FOR_PRINT
+@iftex
+intercalari.@footnote{@xrefIl{Glossario},
+@end iftex
+@ifnottex
+intercalari.@footnote{@xref{Glossario},
+@end ifnottex
+in particolare le voci ``Epoca'' e ``UTC.''}
+@end ifclear
+@ifset FOR_PRINT
+intercalari.
+@end ifset
+Tutti i sistemi noti aderenti allo standard POSIX gestiscono le marcature
+temporali da 0 fino a
+@iftex
+@math{2^{31} - 1},
+@end iftex
+@ifinfo
+2^31 - 1,
+@end ifinfo
+@ifnottex
+@ifnotinfo
+2@sup{31} @minus{} 1,
+@end ifnotinfo
+@end ifnottex
+il che @`e sufficiente per rappresentare date e ore fino a inizio 2038
+(2038-01-19 03:14:07 UTC).  Molti sistemi supportano una maggiore estensione
+di date, compresi dei valori negativi per rappresentare delle date
+anteriori all'Epoca.
+
+@cindex @command{date}, programma di utilit@`a GNU
+@cindex programma di utilit@`a @command{date} GNU
+@cindex tempo, ottenerlo
+Per facilitare l'elaborazione di tali file di registro, e per produrre
+dei rapporti utili, @command{gawk} prevede le seguenti funzioni per
+lavorare con le marcature temporali.  Si tratta di estensioni @command{gawk};
+non sono previste nello standard POSIX.@footnote{Il comando di utilit@`a GNU
+@command{date} pu@`o fare anche molte delle cose qui descritte.   Pu@`o essere
+preferibile usarlo per semplici operazioni relative a data e ora in semplici
+script della shell.}  Tuttavia, anche versioni recenti di @command{mawk}
+(@pxref{Altre versioni}) prevedono queste funzioni.  I parametri opzionali
+sono racchiusi tra parentesi quadre ([ ]):
+
+@c @asis for docbook
+@table @asis
+@item @code{mktime(@var{specifiche_data}} [@code{, @var{utc-flag}} ]@code{)}
+@cindexgawkfunc{mktime}
+@cindex generare data e ora
+Trasforma @var{specifiche_data} in una marcatura temporale nello stesso formato
+restituito da @code{systime()}.  @`E simile alla funzione omonima
+in ISO C.  L'argomento, @var{specifiche_data}, @`e una stringa della forma
+@w{@code{"@var{AAAA} @var{MM} @var{GG} @var{HH} @var{MM} @var{SS} [@var{DST}]"}}.
+La stringa consiste di sei o sette numeri che rappresentano,
+rispettivamente,
+l'anno in quattro cifre, il mese da 1 a 12, il giorno del mese
+da 1 a 31, l'ora del giorno da 0 a 23, il minuto da 0 a
+59, il secondo da 0 a 60,@footnote{Occasionalmente ci sono dei
+minuti in un anno con un secondo intercalare, il che spiega perch@'e i
+secondi possono arrivare fino a 60.}
+e un'indicazione opzionale relativa all'ora legale.
+
+I valori di questi numeri possono non essere negli intervalli specificati; per
+esempio, un'ora di @minus{}1 sta a indicare 1 ora prima di mezzanotte.
+Viene adottato il calendario gregoriano con l'origine posta all'anno zero,
+con l'anno 0 che viene prima dell'anno 1 e l'anno @minus{}1 che viene prima
+dell'anno 0.  Se il flag @var{utc-flag} @`e specificato ed @`e diverso da zero
+e dalla stringa nulla, si suppone che l'ora sia quella del fuso orario UTC;
+altrimenti l'ora @`e considerata essere quella del fuso orario locale.  Se
+l'indicatore @var{DST}
+dell'ora legale @`e positivo, si presuppone che l'ora sia quella
+legale; se @`e 0, l'ora considerata @`e quella di Greenwich (standard time); se
+invece @`e negativo (questo @`e il default), @code{mktime()} tenta di
+determinare se @`e in vigore l'ora legale o no, nel momento specificato.
+
+Se @var{specifiche_data} non contiene elementi in numero sufficiente, o se
+la data e ora risultante sono fuori dall'intervallo previsto,
+@code{mktime()} restituisce @minus{}1.
+
+@cindex @command{gawk}, vettore @code{PROCINFO} in
+@cindex @code{PROCINFO}, vettore
+@cindex vettore @code{PROCINFO}
+@item @code{strftime(}[@var{formato} [@code{,} @var{data_e_ora} [@code{,} @var{utc}] ] ]@code{)}
+@cindexgawkfunc{strftime}
+@cindex formato stringa marcature temporali
+@cindex formato stringa data e ora
+@cindex data e ora, formato stringa
+@cindex marcature temporali, formato stringa
+Formatta la data e ora specificata da @var{data_e_ora} in base alle indicazioni
+contenute nella stringa @var{formato} e restituisce il risultato.
+@`E simile alla funzione omonima in ISO C.
+Se @var{utc} @`e presente ed @`e diverso da zero o dalla stringa nulla,
+il valore @`e formattato come UTC (Tempo Coordinato Universale,
+gi@`a noto come GMT o Tempo Medio di Greenwich).
+Altrimenti, il valore @`e formattato per il fuso orario locale.
+La stringa @var{data_e_ora} @`e nello stesso formato del valore restituito
+dalla funzione @code{systime()}.  Se non si specifica l'argomento
+@var{data_e_ora}, @command{gawk} usa l'ora del giorno corrente per la
+formattazione.
+Omettendo l'argomento @var{formato}, @code{strftime()} usa
+il valore di @code{PROCINFO["strftime"]} come stringa di formattazione
+(@pxref{Variabili predefinite}).
+Il valore di default della stringa @`e
+@code{@w{"%a %b %e %H:%M:%S %Z %Y"}}.  Questa stringa di formattazione
+produce lo stesso output del programma di utilit@`a equivalente
+@command{date}.
+Si pu@`o assegnare un nuovo valore a @code{PROCINFO["strftime"]} per
+modificare la formattazione di default; si veda
+la lista che segue per le varie direttive di formattazione.
+
+@item @code{systime()}
+@cindexgawkfunc{systime}
+@cindex marcature temporali
+@cindex data e ora, si veda marcature temporali
+@cindex data e ora corrente del sistema
+Restituisce l'ora corrente come numero di secondi a partire dall'Epoca
+del sistema.  Sui sistemi  aderenti allo standard POSIX, questo @`e il numero
+di secondi trascorsi a partire dal primo gennaio 1970, ora di Greenwich
+(1970-01-01 00:00:00 UTC), senza includere i secondi intercalari.
+@end table
+
+La funzione @code{systime()} consente di confrontare una marcatura temporale
+in un file di registro con la data e ora correnti.  In particolare, @`e facile
+determinare quanto tempo prima un particolare record @`e stato registrato.
+@`E anche possibile produrre record di registro usando il formato
+``secondi a partire dall'Epoca''.
+
+@cindex conversione di date in marcature temporali
+@cindex date, conversione in marcature temporali
+@cindex marcature temporali, conversione date nelle
+La funzione @code{mktime()} consente di convertire una rappresentazione in
+forma testuale di una data e ora in una marcatura temporale.
+Questo semplifica i confronti prima/dopo tra differenti date e ore, in
+particolare quando si abbia a che fare con date e ore provenienti da una
+fonte esterna, come un file di registro.
+
+La funzione @code{strftime()} permette di trasformare facilmente una marcatura
+temporale in un'informazione intelligibile.  @`E analoga come tipo alla funzione
+@code{sprintf()} (@pxref{Funzioni per stringhe}), nel senso che copia
+letteralmente ci@`o che non @`e una specifica di formato nella stringa che viene
+restituita, mentre sostituisce i valori di data e ora a seconda delle
+specifiche di formato contenute nella stringa @var{formato}.
+
+@cindex specificatori di formato, funzione @code{strftime()} di (@command{gawk})
+@cindex  formato, specificatori di, funzione @code{strftime()} di (@command{gawk})
+Per @code{strftime()} lo standard
+1999 ISO C@footnote{Sfortunatamente,
+non tutte le funzioni @code{strftime()} dei vari sistemi operativi
+ammettono tutte le conversioni qui elencate.}
+consente le seguenti specifiche di formattazione delle date:
+
+@table @code
+@item %a
+Il nome abbreviato del giorno della settimana nella lingua locale.
+
+@item %A
+Il nome completo del giorno della settimana nella lingua locale.
+
+@item %b
+Il nome abbreviato del mese dell'anno nella lingua locale.
+
+@item %B
+Il nome completo del mese dell'anno nella lingua locale.
+
+@item %c
+Il formato ``appropriato'' della rappresentazione della data e ora
+nella lingua locale.
+(Questo @`e @samp{%A %B %d %T %Y} per la localizzazione @code{"C"}.)
+
+@item %C
+La parte che designa il secolo nell'anno corrente.
+Si ottiene dividendo per 100 l'anno, e
+troncando verso il basso
+all'intero pi@`u vicino.
+
+@item %d
+Il giorno del mese come numero decimale (01--31).
+
+@item %D
+Equivale a specificare @samp{%m/%d/%y}.
+
+@item %e
+Il giorno del mese, preceduto da uno spazio se di tratta di una cifra sola.
+
+@item %F
+Equivale a specificare @samp{%Y-%m-%d}.
+Questo @`e il formato ISO 8601 della data.
+
+@item %g
+L'anno (ultime due cifre) ricavato prendendo il resto della divisione per 100
+dell'anno a cui appartiene la settimana, secondo ISO 8601, come numero decimale
+(00--99).  Per esempio, il primo gennaio 2012, fa parte della settimana 53 del
+2011.  Quindi, l'anno relativo al numero di settimana ISO di quella data @`e 2011
+(ossia 11), anche se la data in s@'e @`e nel 2012.  Analogamente, il 31 dicembre
+2012, @`e nella prima settimana del 2013.  Quindi, l'anno relativo al numero di
+settimana ISO di quella data @`e 2013 (ossia 13), anche se la data in s@'e @`e nel
+2012.
+
+@item %G
+L'anno intero relativo al numero di settimana ISO, come numero decimale.
+
+@item %h
+Equivalente a @samp{%b}.
+
+@item %H
+L'ora (in un orologio a 24 ore) come numero decimale (00--23).
+
+@item %I
+L'ora (in un orologio a 12 ore) come numero decimale (01--12).
+
+@item %j
+Il giorno dell'anno come numero decimale (001--366).
+
+@item %m
+Il mese come numero decimale (01--12).
+
+@item %M
+Il minuto come numero decimale (00--59).
+
+@item %n
+Un carattere di ritorno a capo (ASCII LF).
+
+@item %p
+L'equivalente nella lingua locale delle designazioni AM/PM
+(mattino/pomerigggio) associate a un orologio a 12 ore.
+
+@item %r
+L'ora locale nel formato a 12 ore.
+(Questo @`e @samp{%I:%M:%S %p} nella localizzazione @code{"C"}.)
+
+@item %R
+Equivalente a specificare @samp{%H:%M}.
+
+@item %S
+Il secondo come numero decimale (00--60).
+
+@item %t
+Un carattere di tabulazione [TAB].
+
+@item %T
+Equivalente a specificare @samp{%H:%M:%S}.
+
+@item %u
+Il numero del giorno della settimana come numero decimale (1--7).
+Luned@`{@dotless{i}} @`e il giorno numero 1.
+
+@item %U
+Il numero di settimana dell'anno (con la prima domenica dell'anno presa
+come primo giorno della prima settimana) come numero decimale (00--53).
+
+@c @cindex ISO 8601
+@item %V
+Il numero di settimana dell'anno (con il primo luned@`{@dotless{i}} dell'anno preso
+come primo giorno della prima settimana) come numero decimale (01--53).
+Il metodo per determinare il numero di settimana @`e quello specificato
+dallo standard ISO 8601.
+(In pratica: se la settimana che contiene il primo gennaio ha quattro o
+pi@`u giorni nel nuovo anno, allora
+@`e la settimana numero uno; altrimenti @`e l'ultima settimana
+[52 o 53] dell'anno
+precedente, e la settimana successiva @`e la settimana numero uno.)
+
+@item %w
+Il giorno della settimana come numero decimale (0--6).
+Domenica @`e il giorno zero.
+
+@item %W
+Il numero di settimana dell'anno (con il primo luned@`{@dotless{i}} come primo giorno
+della settimana numero uno)
+come numero decimale (00--53).
+
+@item %x
+Il formato ``appropriato'' della rappresentazione della data
+nella lingua locale.
+(Questo @`e @samp{%A %B %d %Y} nella localizzazione @code{"C"}.)
+
+@item %X
+Il formato ``appropriato'' della rappresentazione della data.
+(Questo @`e @samp{%T} nella localizzazione @code{"C"}.)
+
+@item %y
+L'anno modulo 100 (le ultime due cifre) come numero decimale (00--99).
+
+@item %Y
+L'anno come numero decimale (p.es., 2015).
+
+@c @cindex RFC 822
+@c @cindex RFC 1036
+@item %z
+La differenza di fuso orario [rispetto all'ora di Greenwich] in formato
+@samp{+@var{OOMM}} (p.es., il
+formato necessario per produrre intestazioni di data conformi agli standard
+RFC 822/RFC 1036).
+
+@item %Z
+Il nome o l'abbreviazione della zona di fuso orario (@dfn{time zone}); se il fuso
+orario non @`e determinabile, @`e impostata alla stringa nulla.
+
+@item %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH
+@itemx %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy
+``notazioni alternative'' di specifica
+in cui solo la seconda lettera (@samp{%c}, @samp{%C} e cos@`{@dotless{i}} via) @`e
+significativa.@footnote{Se questo risulta incomprensibile, non @`e il
+caso di preoccuparsi; queste notazioni hanno lo scopo di facilitare
+la ``internazionalizzazione'' dei programmi.
+Altre funzionalit@`a di internazionalizzazione sono descritte in
+@ref{Internazionalizzazione}.}
+(Queste facilitano la compatibilit@`a con il programma di utilit@`a
+POSIX @command{date}.)
+
+@item %%
+Un singolo carattere @samp{%}.
+@end table
+
+Se uno specificatore di conversione non @`e tra quelli elencati sopra, il
+comportamento @`e indefinito.@footnote{Questo @`e perch@'e ISO C lascia
+indefinito il comportamento della versione C di @code{strftime()} e
+@command{gawk} usa la versione di sistema di @code{strftime()},
+se disponibile.
+Tipicamente, lo specificatore di conversione "non previsto" non appare
+nella stringa risultante, o appare cos@`{@dotless{i}} come @`e scritto.}
+
+Per sistemi che non aderiscono completamente agli standard
+@command{gawk} utilizza una copia di
+@code{strftime()} dalla libreria C di GNU.
+Sono disponibili tutte le specifiche di formato sopra elencate.
+Se la detta versione @`e
+usata per compilare @command{gawk} (@pxref{Installazione}),
+sono disponibili anche le seguenti ulteriori specifiche di formato:
+
+@table @code
+@item %k
+L'ora (in un orologio a 24 ore) come numero decimale (0--23).
+I numeri di una sola cifra sono preceduti da uno spazio bianco.
+
+@item %l
+L'ora (in un orologio a 12 ore) come numero decimale (1--12).
+I numeri di una sola cifra sono preceduti da uno spazio bianco.
+
+@ignore
+@item %N
+Il nome dell'``Imperatore/Era''.
+Equivalente a @samp{%C}.
+
+@item %o
+L'anno dell'``Imperatore/Era''.
+Equivalente a @samp{%y}.
+@end ignore
+
+@item %s
+L'ora espressa in numero di secondi a partire dall'Epoca.
+
+@ignore
+@item %v
+La data in formato VMS (p.es., @samp{20-JUN-1991}).
+@end ignore
+@end table
+
+In aggiunta a ci@`o, le notazioni alternative sono riconosciute, ma al
+loro posto sono usate quelle normali.
+
+@cindex @code{date}, programma di utilit@`a POSIX
+@cindex programma di utilit@`a POSIX @code{date}
+@cindex POSIX @command{awk}, programma di utilit@`a @code{date} e
+Il seguente esempio @`e un'implementazione @command{awk} del
+programma di utilit@`a POSIX @command{date}.
+Normalmente, il programma di utilit@`a @command{date} stampa la
+data e l'ora corrente nel formato ben noto.  Tuttavia, se si
+specifica al comando un argomento che inizia con un @samp{+}, @command{date}
+copia i caratteri che non sono specifiche di formato nello standard output
+e interpreta l'ora corrente secondo gli specificatori di formato
+contenuti nella stringa.  Per esempio:
+
+@example
+$ @kbd{date '+Oggi @`e %A, %d %B %Y.'}
+@print{} Oggi @`e luned@`{@dotless{i}}, 22 settembre 2014.
+@end example
+
+Ecco la versione @command{gawk} del programma di utilit@`a @command{date}.
+@`E all'interno di uno @dfn{script} di shell
+per gestire l'opzione @option{-u},
+che richiede che @command{date} sia eseguito come se il fuso orario
+fosse impostato a UTC:
+
+@example
+#! /bin/sh
+#
+# date --- simula il comando POSIX 'date'
+
+case $1 in
+-u)  TZ=UTC0     # usare UTC
+     export TZ
+     shift ;;
+esac
+
+gawk 'BEGIN  @{
+    formato = PROCINFO["strftime"]
+    codice_di_ritorno = 0
+
+    if (ARGC > 2)
+        codice_di_ritorno = 1
+    else if (ARGC == 2) @{
+        formato = ARGV[1]
+        if (formato ~ /^\+/)
+            formato = substr(formato, 2)   # togli il + iniziale
+    @}
+    print strftime(formato)
+    exit codice_di_ritorno
+@}' "$@@"
+@end example
+
+@node Funzioni a livello di bit
+@subsection Funzioni per operazioni di manipolazione bit
+@cindex bit, funzioni per la manipolazione di
+@cindex manipolazione di bit, funzioni per la
+@cindex funzioni per la manipolazione di bit
+@cindex bit, operazioni sui
+@cindex AND, operazione sui bit
+@cindex OR, operazione sui bit
+@cindex XOR, operazione sui bit
+@cindex operazioni sui bit
+@quotation
+@i{Io posso spiegarlo per te, ma non posso capirlo per te.}
+@author Anonimo
+@end quotation
+
+Molti linguaggi consentono di eseguire operazioni @dfn{bit a bit}
+su due numeri interi.  In altre parole, l'operazione @`e eseguita
+su ogni successiva coppia di bit presi da ognuno dei due operandi.
+Tre operazioni comuni sono AND, OR e XOR bit a bit.
+Queste operazioni sono descritte nella @ref{table-bitwise-ops}.
+
+@c 11/2014: Postprocessing turns the docbook informaltable
+@c into a table. Hurray for scripting!
+@float Tabella,table-bitwise-ops
+@caption{Operazioni a livello di bit}
+@ifnottex
+@ifnotdocbook
+@display
+@verbatim
+             Operatore booleano
+          |  AND  |   OR  |  XOR
+          |---+---+---+---+---+---
+Operandi  | 0 | 1 | 0 | 1 | 0 | 1
+----------+---+---+---+---+---+---
+    0     | 0   0 | 0   1 | 0   1
+    1     | 0   1 | 1   1 | 1   0
+@end verbatim
+@end display
+@end ifnotdocbook
+@end ifnottex
+@tex
+\centerline{
+\vbox{\bigskip % space above the table (about 1 linespace)
+% Because we have vertical rules, we can't let TeX insert interline space
+% in its usual way.
+\offinterlineskip
+\halign{\strut\hfil#\quad\hfil  % operands
+        &\vrule#&\quad#\quad    % rule, 0 (of and)
+        &\vrule#&\quad#\quad    % rule, 1 (of and)
+        &\vrule#                % rule between and and or
+        &\quad#\quad            % 0 (of or)
+        &\vrule#&\quad#\quad    % rule, 1 (of of)
+        &\vrule#                % rule between or and xor
+        &\quad#\quad            % 0 of xor
+        &\vrule#&\quad#\quad    % rule, 1 of xor
+        \cr
+&\omit&\multispan{11}\hfil\bf Operatore booleano\hfil\cr
+\noalign{\smallskip}
+&     &\multispan3\hfil AND\hfil&&\multispan3\hfil  OR\hfil
+                           &&\multispan3\hfil XOR\hfil\cr
+\bf Operandi&&0&&1&&0&&1&&0&&1\cr
+\noalign{\hrule}
+\omit&height 2pt&&\omit&&&&\omit&&&&\omit\cr
+\noalign{\hrule height0pt}% without this the rule does not extend; why?
+0&&0&\omit&0&&0&\omit&1&&0&\omit&1\cr
+1&&0&\omit&1&&1&\omit&1&&1&\omit&0\cr
+}}}
+@end tex
+
+@docbook
+<informaltable>
+
+<tgroup cols="7" colsep="1">
+<colspec colname="c1"/>
+<colspec colname="c2"/>
+<colspec colname="c3"/>
+<colspec colname="c4"/>
+<colspec colname="c5"/>
+<colspec colname="c6"/>
+<colspec colname="c7"/>
+<spanspec spanname="optitle" namest="c2" nameend="c7" align="center"/>
+<spanspec spanname="andspan" namest="c2" nameend="c3" align="center"/>
+<spanspec spanname="orspan" namest="c4" nameend="c5" align="center"/>
+<spanspec spanname="xorspan" namest="c6" nameend="c7" align="center"/>
+
+<tbody>
+<row>
+<entry colsep="0"></entry>
+<entry spanname="optitle"><emphasis role="bold">Operatore booleano</emphasis></entry>
+</row>
+
+<row rowsep="1">
+<entry rowsep="0"></entry>
+<entry spanname="andspan">AND</entry>
+<entry spanname="orspan">OR</entry>
+<entry spanname="xorspan">XOR</entry>
+</row>
+
+<row rowsep="1">
+<entry ><emphasis role="bold">Operandi</emphasis></entry>
+<entry colsep="0">0</entry>
+<entry colsep="1">1</entry>
+<entry colsep="0">0</entry>
+<entry colsep="1">1</entry>
+<entry colsep="0">0</entry>
+<entry colsep="1">1</entry>
+</row>
+
+<row>
+<entry align="center">0</entry>
+<entry colsep="0">0</entry>
+<entry>0</entry>
+<entry colsep="0">0</entry>
+<entry>1</entry>
+<entry colsep="0">0</entry>
+<entry>1</entry>
+</row>
+
+<row>
+<entry align="center">1</entry>
+<entry colsep="0">0</entry>
+<entry>1</entry>
+<entry colsep="0">1</entry>
+<entry>1</entry>
+<entry colsep="0">1</entry>
+<entry>0</entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+@end docbook
+@end float
+
+@cindex bit, complemento a livello di
+@cindex complemento a livello di bit
+Come si vede, il risultato di un'operazione di AND @`e 1 solo quando
+@emph{entrambi} i bit sono 1.
+Il risultato di un'operazione di OR @`e 1 se @emph{almeno un} bit @`e 1.
+Il risultato di un'operazione di XOR @`e 1 se l'uno o l'altro
+bit @`e 1, ma non tutti e due.
+La successiva operazione @`e il @dfn{complemento}; il complemento di 1 @`e 0 e
+il complemento di 0 @`e 1. Quindi, quest'operazione ``inverte'' tutti i bit
+di un dato valore.
+
+@cindex bit, spostamento di
+@cindex spostamento a sinistra, bit a bit
+@cindex spostamento a destra, bit a bit
+@cindex spostamento, bit a bit
+Infine, due altre operazioni comuni consistono nello spostare i bit
+a sinistra o a destra.
+Per esempio, se si ha una stringa di bit @samp{10111001} e la si sposta
+a destra di tre bit, si ottiene @samp{00010111}.@footnote{Questo esempio
+presuppone che degli zeri riempiano le posizioni a sinistra.
+Per @command{gawk}, @`e sempre
+cos@`{@dotless{i}}, ma in alcuni linguaggi @`e possibile che le posizioni a sinistra
+siano riempite con degli uno.}
+Partendo nuovamente da @samp{10111001} e spostandolo a sinistra di tre
+bit, si ottiene @samp{11001000}.  La lista seguente descrive
+le funzioni predefinite di @command{gawk} che rendono disponibili
+le operazioni a livello di bit.
+I parametri opzionali sono racchiusi tra parentesi quadre ([ ]):
+
+@cindex @command{gawk}, operazioni a livello di bit in
+@table @asis
+@cindexgawkfunc{and}
+@cindex AND, operazione sui bit
+@item @code{and(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
+Restituisce l'AND bit a bit degli argomenti.
+Gli argomenti devono essere almeno due.
+
+@cindexgawkfunc{compl}
+@cindex complemento a livello di bit
+@item @code{compl(@var{val})}
+Restituisce il complemento bit a bit di @var{val}.
+
+@cindexgawkfunc{lshift}
+@cindex spostamento a sinistra
+@item @code{lshift(@var{val}, @var{contatore})}
+Restituisce il valore di @var{val}, spostato a sinistra di
+@var{contatore} bit.
+
+@cindexgawkfunc{or}
+@cindex OR, operazione sui bit
+@item @code{or(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
+Restituisce l'OR bit a bit degli argomenti.
+Gli argomenti devono essere almeno due.
+
+@cindexgawkfunc{rshift}
+@cindex spostamento a destra
+@item @code{rshift(@var{val}, @var{contatore})}
+Restituisce il valore di @var{val}, spostato a destra
+di @var{contatore} bit.
+
+@cindexgawkfunc{xor}
+@cindex XOR, operazione sui bit
+@item @code{xor(}@var{v1}@code{,} @var{v2} [@code{,} @dots{}]@code{)}
+Restituisce il XOR bit a bit degli argomenti.
+Gli argomenti devono essere almeno due.
+@end table
+
+@quotation ATTENZIONE
+A partire dalla versione di @command{gawk} @value{PVERSION} 4.2, gli operandi
+negativi non sono consentiti per nessuna di queste funzioni.  Un operando
+negativo produce un errore fatale.  Si veda la nota a lato
+``Attenzione. Non @`e tutto oro quel che luccica!'' per maggiori informazioni sul perch@'e.
+@end quotation
+
+Ecco una funzione definita dall'utente (@pxref{Funzioni definite dall'utente})
+che illustra l'uso di queste funzioni:
+
+@cindex @code{bits2str()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{bits2str()}
+@cindex @code{testbits.awk}, programma
+@cindex programma @code{testbits.awk}
+@example
+@group
+@c file eg/lib/bits2str.awk
+# bits2str --- decodifica un numero intero in una serie di 0/1 leggibili
+
+function bits2str(byte,        dati, maschera)
+@{
+    if (byte == 0)
+        return "0"
+
+    maschera = 1
+    for (; byte != 0; stringa = rshift(stringa, 1))
+        dati = (and(byte, maschera) ? "1" : "0") dati
+
+    while ((length(dati) % 8) != 0)
+        dati = "0" dati
+
+    return dati
+@}
+@c endfile
+@end group
+
+@c this is a hack to make testbits.awk self-contained
+@ignore
+@c file eg/prog/testbits.awk
+# bits2str --- turn an integer into readable ones and zeros
+
+function bits2str(bits,        data, mask)
+@{
+    if (bits == 0)
+        return "0"
+
+    mask = 1
+    for (; bits != 0; bits = rshift(bits, 1))
+        data = (and(bits, mask) ? "1" : "0") data
+
+    while ((length(data) % 8) != 0)
+        data = "0" data
+
+    return data
+@}
+@c endfile
+@end ignore
+@c file eg/prog/testbits.awk
+BEGIN @{
+    printf "123 = %s\n", bits2str(123)
+    printf "0123 = %s\n", bits2str(0123)
+    printf "0x99 = %s\n", bits2str(0x99)
+    comp = compl(0x99)
+    printf "compl(0x99) = %#x = %s\n", comp, bits2str(comp)
+    shift = lshift(0x99, 2)
+    printf "lshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
+    shift = rshift(0x99, 2)
+    printf "rshift(0x99, 2) = %#x = %s\n", shift, bits2str(shift)
+@}
+@c endfile
+@end example
+
+@noindent
+Questo programma produce il seguente output quando viene eseguito:
+
+@example
+$ @kbd{gawk -f testbits.awk}
+@print{} 123 = 01111011
+@print{} 0123 = 01010011
+@print{} 0x99 = 10011001
+@print{} compl(0x99) = 0x3fffffffffff66 =
+@print{} 00111111111111111111111111111111111111111111111101100110
+@print{} lshift(0x99, 2) = 0x264 = 0000001001100100
+@print{} rshift(0x99, 2) = 0x26 = 00100110
+@end example
+
+@cindex conversione da stringhe a numeri
+@cindex stringhe, conversione
+@cindex numeri, conversione in stringhe
+@cindex conversione da numeri a stringhe
+@cindex numeri, visti come stringhe di bit
+La funzione @code{bits2str()} trasforma un numero binario in una stringa.
+Inizializzando @code{maschera} a uno otteniamo
+un valore binario in cui il bit pi@`u a destra @`e impostato a
+uno.  Usando questa maschera,
+la funzione continua a controllare il bit pi@`u a destra.
+l'operazione di AND tra la maschera e il valore indica se il
+bit pi@`u a destra @`e uno oppure no. Se questo @`e il caso, un @code{"1"}
+@`e concatenato all'inizio della stringa.
+Altrimenti, @`e concatenato uno @code{"0"}.
+Il valore @`e quindi spostato a destra di un bit e il ciclo continua
+finch@'e non ci sono pi@`u bit.
+
+Se il valore iniziale @`e zero, viene restituito semplicemente uno @code{"0"}.
+Altrimenti, alla fine, al valore ottenuto vengono aggiunti degli zeri a
+sinistra, per arrivare a stringhe
+di lunghezza multipla di 8, ossia contenenti un numero intero di byte.
+Questo @`e tipico dei computer moderni.
+
+Il codice principale nella regola @code{BEGIN} mostra la differenza tra
+i valori decimale e ottale dello stesso numero.
+(@pxref{Numeri non-decimali}),
+e poi mostra i risultati delle funzioni
+@code{compl()}, @code{lshift()} e @code{rshift()}.
+
+@sidebar Attenzione. Non @`e tutto oro quel che luccica!
+
+In altri linguaggi, le operazioni "bit a bit" sono eseguite su valori interi,
+non su valori in virgola mobile.  Come regola generale, tali operazioni
+funzionano meglio se eseguite su interi senza segno.
+
+@command{gawk} tenta di trattare gli argomenti delle funzioni
+"bit a bit" come interi senza segno. Per questo motivo, gli argomenti negativi
+provocano un errore fatale.
+
+In una normale operazione, per tutte queste funzioni, prima il valore in virgola
+mobile a doppia precisione viene convertito nel tipo intero senza segno di C
+pi@`u ampio, poi viene eseguita l'operazione "bit a bit".  Se il risultato non
+pu@`o essere rappresentato esattamente come un tipo @code{double} di C,
+vengono rimossi i bit iniziali diversi da zero uno alla volta finch@'e
+non sono rappresentati esattamente.  Il risultato @`e poi nuovamente convertito
+in un tipo @code{double} di C.@footnote{Per essere pi@`u chiari,
+la conseguenza @`e che @command{gawk} pu@`o memorizzare solo un determinato
+intervallo di valori interi; i numeri al di fuori di questo intervallo vengono
+ridotti per rientrare all'interno dell'intervallo.}
+
+Comunque, quando si usa il calcolo con precisione arbitraria con l'opzione
+@option{-M} (@pxref{Calcolo con precisione arbitraria}), il risultato pu@`o
+essere diverso.  Questo @`e particolarmente evidente con la funzione @code{compl()}:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print compl(42) @}'}
+@print{} 9007199254740949
+$ @kbd{gawk -M 'BEGIN @{ print compl(42) @}'}
+@print{} -43
+@end example
+
+Quel che avviene diventa chiaro quando si stampano i risultati
+in notazione esadecimale:
+
+@example
+$ @kbd{gawk 'BEGIN @{ printf "%#x\n", compl(42) @}'}
+@print{} 0x1fffffffffffd5
+$ @kbd{gawk -M 'BEGIN @{ printf "%#x\n", compl(42) @}'}
+@print{} 0xffffffffffffffd5
+@end example
+
+Quando si usa l'opzione @option{-M}, nel dettaglio, @command{gawk} usa
+gli interi a precisione arbitraria di GNU MP che hanno almeno 64 bit di precisione.
+Quando non si usa l'opzione @option{-M}, @command{gawk} memorizza i valori
+interi come regolari valori in virgola mobile con doppia precisione, che
+mantengono solo 53 bit di precisione.  Inoltre, la libreria GNU MP tratta
+(o almeno sembra che tratti) il bit iniziale come un bit con segno;
+cos@`{@dotless{i}} il
+risultato con @option{-M} in questo caso @`e un numero negativo.
+
+In breve, usare @command{gawk} per qualsiasi tipo di operazione "bit a bit",
+tranne le pi@`u semplici, probabilmente @`e una cattiva idea; @dfn{caveat emptor}!
+
+@end sidebar
+
+@node Funzioni per i tipi
+@subsection Funzioni per conoscere il tipo di una variabile
+
+@command{gawk} prevede due funzioni che permettono di conoscere
+il tipo di una variabile.
+Questo @`e necessario per scrivere del codice che visiti ogni elemento di un
+vettore di vettori
+(@pxref{Vettori di vettori}) e in altri contesti.
+
+@table @code
+@cindexgawkfunc{isarray}
+@cindex scalare o vettore
+@item isarray(@var{x})
+Restituisce il valore 'vero' se @var{x} @`e un vettore. Altrimenti, restituisce
+'falso'.
+
+@cindexgawkfunc{typeof}
+@cindex variabile, tipo di una
+@cindex tipo di una variabile
+@item typeof(@var{x})
+Restituisce una delle stringhe seguenti, a seconda del tipo di @var{x}:
+
+@c nested table
+@table @code
+@item "array"
+@var{x} @`e un vettore.
+
+@item "regexp"
+@var{x} @`e una @dfn{regexp} fortemente tipizzata
+(@pxref{Costanti @dfn{regexp} forti}).
+
+@item "number"
+@var{x} @`e un numero.
+
+@item "string"
+@var{x} @`e una stringa.
+
+@item "strnum"
+@var{x} @`e un numero che ha avuto origine da un input dell'utente,
+come un campo o il risultato di una chiamata a @code{split()}.
+(Cio@`e, @var{x} ha l'attributo @dfn{strnum};
+@pxref{Tipi di variabile}.)
+
+@item "unassigned"
+@var{x} @`e una variabile scalare a cui non @`e ancora stato assegnato un valore.
+Per esempio:
+
+@example
+BEGIN @{
+    # crea a[1] ma non gli attribuisce alcun valore
+    a[1]
+    print typeof(a[1])  # non assegnato
+@}
+@end example
+
+@item "untyped"
+@var{x} non @`e stata usata per nulla; pu@`o diventare uno scalare o un
+vettore.  @`E anche possibile che il tipo sia differente, in differenti
+esecuzioni del medesimo programma!
+Per esempio:
+
+@example
+BEGIN @{
+    print "all'inizio, typeof(v) = ", typeof(v)
+
+    if ("FOO" in ENVIRON)
+        make_scalar(v)
+    else
+        make_array(v)
+
+    print "typeof(v) =", typeof(v)
+@}
+
+function make_scalar(p,    l) @{ l = p @}
+
+function make_array(p) @{ p[1] = 1 @}
+@end example
+
+@end table
+@end table
+
+@code{isarray()} torna utile in due occasioni. La prima @`e quando
+si visita un vettore multidimensionale: si pu@`o stabilire se un elemento @`e
+un vettore oppure no.  La seconda @`e all'interno del corpo di una funzione
+definita dall'utente (argomento non ancora trattato;
+@pxref{Funzioni definite dall'utente}), per determinare se un parametro
+@`e un vettore oppure no.
+
+@quotation NOTA
+Anche se si pu@`o usare @code{isarray()} a livello globale per controllare le
+variabili il farlo non ha alcun senso.  Si suppone infatti che chi scrive il
+programma sappia se una variabile @`e un vettore oppure no.
+@end quotation
+
+La funzione @code{typeof()} @`e generale; consente di determinare
+se una variabile o un parametro di funzione @`e uno scalare, (numero,
+stringa o @dfn{regexp} fortemente tipizzata), oppure un vettore.
+
+Normalmente, se si passa una variabile che non @`e stata mai usata
+a una funzione predefinita, la variabile stessa viene creata come
+variabile scalare di tipo non ancora assegnato (unassigned).
+Tuttavia, se si chiama @code{isarray()} e @code{typeof()} queste
+funzioni non cambiano gli argomenti che vengono passati loro da
+non ancora tipizzati (untyped) a non ancora assegnati (unassigned).
+
+@node Funzioni di internazionalizzazione
+@subsection Funzioni per tradurre stringhe
+@cindex @command{gawk}, funzioni di traduzione di stringhe
+@cindex funzioni di traduzione di stringhe
+@cindex traduzione di stringhe, funzioni di
+@cindex internazionalizzazione
+@cindex programmi @command{awk}, internazionalizzare
+
+@command{gawk} prevede strumenti per internazionalizzare i programmi
+@command{awk}.
+Questi sono costituiti dalle funzioni descritte nella lista seguente.
+Le descrizioni sono volutamente concise.
+@xref{Internazionalizzazione},
+per un'esposizione completa.
+I parametri opzionali sono racchiusi tra parentesi quadre ([ ]):
+
+@table @asis
+@cindexgawkfunc{bindtextdomain}
+@cindex impostare directory con catalogo messaggi tradotti
+@cindex messaggi tradotti, impostare directory con catalogo
+@item @code{bindtextdomain(@var{directory}} [@code{,} @var{dominio}]@code{)}
+Imposta la directory in cui
+@command{gawk} trova i file di traduzione dei messaggi, nel caso in cui
+non siano o non possano essere messi nelle directory ``standard''
+(p.es., durante la fase di test di un programma).
+Restituisce la directory alla quale @var{dominio} @`e ``connesso.''
+
+Il default per @var{dominio} @`e il valore di @code{TEXTDOMAIN}.
+Se @var{directory} @`e la stringa nulla (@code{""}),
+@code{bindtextdomain()} restituisce la connessione corrente per il
+@var{dominio} dato.
+
+@cindexgawkfunc{dcgettext}
+@cindex traduzione di stringhe
+@item @code{dcgettext(@var{stringa}} [@code{,} @var{dominio} [@code{,} @var{categoria}] ]@code{)}
+Restituisce la traduzione di @var{stringa} nel
+dominio linguistico @var{dominio} per la categoria di localizzazione
+@var{categoria}.
+Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
+Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
+
+@cindexgawkfunc{dcngettext}
+@item @code{dcngettext(@var{stringa1}, @var{stringa2}, @var{numero}} [@code{,} @var{dominio} [@code{,} @var{categoria}] ]@code{)}
+Restituisce la forma plurale usata per @var{numero} nella
+traduzione di @var{stringa1} e @var{stringa2} nel dominio di testo
+@var{dominio} per la categoria di localizzazione @var{categoria}.
+@var{stringa1} @`e la variante al singolare in inglese di un messaggio e
+@var{stringa2} @`e la variante al plurare in inglese dello stesso messaggio.
+Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
+Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
+@end table
+
+@node Funzioni definite dall'utente
+@section Funzioni definite dall'utente
+
+@cindex funzioni definite dall'utente
+@cindex utente, funzioni definite dall'
+Programmi @command{awk} complessi spesso possono essere semplificati
+definendo delle apposite funzioni personali.
+Le funzioni definite dall'utente sono richiamate allo stesso modo di quelle
+predefinite
+(@pxref{Chiamate di funzione}),
+ma dipende dall'utente la loro definizione
+(cio@`e, dire ad @command{awk} cosa dovrebbero fare queste funzioni).
+
+@menu
+* Sintassi delle definizioni::  Come scrivere definizioni e cosa
+                                significano.
+* Esempio di funzione::         Un esempio di definizione di
+                                funzione e spiegazione della stessa.
+* Chiamata di una funzione::    Chiamare funzioni definite dall'utente.
+* Precisazioni sulle funzioni:: Cose a cui prestare attenzione.
+* Istruzione return::           Specificare il valore che una
+                                funzione restituisce.
+* Variabili di tipo dinamico::  Come cambiare tipo a una variabile in
+                                fase di esecuzione del programma.
+@end menu
+
+@node Sintassi delle definizioni
+@subsection Come scrivere definizioni e cosa significano
+
+@quotation
+@i{Risponde al vero affermare che la sintassi di awk per la definizione
+di variabili locali @`e semplicemente atroce.}
+@author Brian Kernighan
+@end quotation
+
+@cindex funzioni, definizione di
+@cindex definizione di funzioni
+Definizioni di funzioni possono stare in una posizione qualsiasi tra le regole
+di un programma @command{awk}.  Quindi, la forma generale di un
+programma @command{awk} @`e estesa per
+permettere l'inclusione di regole @emph{e} la definizione di funzioni
+create dall'utente.
+Non @`e necessario che la definizione di una funzione sia posta prima
+del richiamo della stessa.  Questo dipende dal fatto che @command{awk}
+legge l'intero programma, prima di iniziare ad eseguirlo.
+
+La definizione di una funzione chiamata @var{nome} @`e simile a questa:
+
+@display
+@group
+@code{function} @var{nome}@code{(}[@var{lista-parametri}]@code{)}
+@code{@{}
+     @var{corpo-della-funzione}
+@code{@}}
+@end group
+@end display
+
+@cindex nomi di funzione
+@cindex funzioni, nomi di
+@cindex limitazioni nei nomi di funzione
+@cindex nomi di funzione, limitazioni nei
+@noindent
+Qui, @var{nome} @`e il nome della funzione da definire.  Un nome di funzione
+valido @`e come un nome di variabile valido: una sequenza di
+lettere, cifre e trattini bassi che non inizia con una cifra.
+Anche qui, solo le 52 lettere inglesi maiuscole e minuscole possono
+essere usate in un nome di funzione.
+All'interno di un singolo programma @command{awk}, un dato nome pu@`o essere
+usato una sola volta: per una variabile, o per un vettore,
+o per una funzione.
+
+@var{lista-parametri} @`e una lista opzionale degli argomenti della funzione
+e dei nomi delle variabili locali,
+separati da virgole.  Quando la funzione viene chiamata,
+i nomi degli argomenti sono usati per contenere il valore degli argomenti
+passati con la chiamata.
+
+Una funzione non pu@`o avere due parametri con lo stesso nome, e neanche un
+parametro con lo stesso nome della funzione stessa.
+
+@quotation ATTENZIONE
+Secondo lo standard POSIX, i parametri di funzione
+non possono avere lo stesso nome di una delle speciali variabili predefinite
+(@pxref{Variabili predefinite}), e un parametro di funzione non pu@`o avere
+lo stesso nome di un'altra funzione.
+Non tutte le versioni di @command{awk} applicano queste limitazioni.
+@command{gawk} applica solo la prima di queste restrizioni.
+Se viene specificata l'opzione @option{--posix} (@pxref{Opzioni}),
+anche la seconda restrizione viene applicata.
+@end quotation
+
+Le variabili locali si comportano come la stringa vuota
+se vengono utilizzate dove @`e richiesto il valore di una stringa,
+e valgono zero se utilizzate dove @`e richiesto un valore numerico.
+Questo @`e lo stesso comportamento delle variabili regolari a cui non sia
+stato ancora assegnato un valore.  (Ci sono ulteriori informazioni riguardo
+alle variabili locali;
+@pxref{Variabili di tipo dinamico}.)
+
+Il @var{corpo-della-funzione} @`e composto da istruzioni @command{awk}.
+Questa @`e la parte pi@`u importante della definizione, perch@'e dice quello che
+la funzione dovrebbe realmente
+@emph{fare}.  I nomi di argomento esistono per consentire al corpo della
+funzione di gestire gli argomenti;
+le variabili locali esistono per consentire al corpo della funzione di
+memorizzare dei valori temporanei.
+
+I nomi di argomento non sono sintatticamente distinti da quelli delle
+variabili locali.  Invece, il numero di argomenti forniti quando la
+funzione viene chiamata determina quanti degli argomenti passati sono delle
+variabili.  Quindi, se tre valori di argomento sono specificati, i primi
+tre nomi in @var{lista-parametri}
+sono degli argomenti e i rimanenti sono delle variabili locali.
+
+Ne consegue che se il numero di argomenti richiesto non @`e lo stesso in
+tutte le chiamate alla funzione, alcuni dei nomi in @var{lista-parametri}
+possono essere in alcuni casi degli argomenti e in altri casi
+delle variabili locali.  Un'altra angolatura da cui guardare questo fatto
+@`e che gli argomenti omessi assumono come valore di default la stringa nulla.
+
+@cindex convenzioni di programmazione, nella scrittura di funzioni
+@cindex funzioni, convenzioni di programmazione, nella scrittura di
+Solitamente, quando si scrive una funzione, si sa quanti nomi si intendono
+usare per gli argomenti e quanti si vogliono usare come variabili locali.
+@`E una convenzione in uso quella di aggiungere alcuni spazi extra tra gli
+argomenti e le variabili locali, per documentare come va utilizzata quella
+funzione.
+
+@cindex variabili nascoste
+@cindex nascondere valori di variabile
+Durante l'esecuzione del corpo della funzione, gli argomenti e i valori
+delle variabili locali
+nascondono, o @dfn{oscurano}, qualsiasi variabile dello stesso nome usata
+nel resto del programma.  Le variabili oscurate non sono accessibili
+nel corpo della funzione, perch@'e non c'@`e modo di accedere a esse
+mentre i loro nomi sono stati "occupati" dagli argomenti e dalla variabili
+locali.  Tutte le altre variabili usate nel programma @command{awk}
+possono essere accedute o impostate normalmente nel corpo della funzione.
+
+Gli argomenti e le variabili locali esistono solo finch@'e il corpo della
+funzione @`e in esecuzione.  Una volta che l'esecuzione @`e terminata,
+ritornano accessibili le variabili che erano oscurate
+durante l'esecuzione della funzione.
+
+@cindex ricorsive, funzioni
+@cindex funzioni ricorsive
+Il corpo della funzione pu@`o contenere espressioni che chiamano altre
+funzioni.  Tali espressioni possono perfino chiamare direttamente, o
+indirettamente tramite un'altra funzione, la funzione stessa.
+Quando questo succede, la funzione @`e detta @dfn{ricorsiva}.
+Il fatto che una funzione richiami se stessa @`e detto @dfn{ricorsione}.
+
+Tutte le funzioni predefinite restituiscono un valore al loro chiamante.
+Anche le funzioni definite dall'utente possono farlo, usando
+l'istruzione @code{return},
+che @`e descritta in dettaglio nella @ref{Istruzione return}.
+Molti dei successivi esempi in questa @value{SECTION} usano
+l'istruzione @code{return}.
+
+@cindex estensioni comuni, parola chiave @code{func}
+@c @cindex @command{awk} language, POSIX version
+@c @cindex POSIX @command{awk}
+@cindex POSIX @command{awk}, parola chiave @code{function} in
+In molte implementazioni di @command{awk}, compreso @command{gawk},
+la parola chiave @code{function} pu@`o essere
+abbreviata come @code{func}. @value{COMMONEXT}
+Tuttavia, POSIX specifica solo l'uso della parola chiave
+@code{function}.  Questo ha alcune implicazioni di carattere pratico.
+Se @command{gawk} @`e in modalit@`a POSIX-compatibile
+(@pxref{Opzioni}), la seguente
+istruzione @emph{non} definisce una funzione:
+
+@example
+func foo() @{ a = sqrt($1) ; print a @}
+@end example
+
+@noindent
+Invece, definisce una regola che, per ogni record, concatena il valore
+della variabile @samp{func} con il valore restituito dalla funzione @samp{foo}.
+Se la stringa risultante @`e diversa dalla stringa nulla, l'azione viene eseguita.
+Questo non @`e con ogni probabilit@`a quello che si desidera.
+(@command{awk} accetta questo input come
+sintatticamente valido, perch@'e le funzioni, nei programmi @command{awk}
+possono essere usate prima che siano state definite.@footnote{Questo
+programma in realt@`a non verr@`a eseguito, perch@'e @code{foo()} risulter@`a
+essere una funzione non definita.})
+
+@cindex portabilit@`a, nella definizione di funzioni
+Per essere certi che un programma @command{awk} sia portabile,
+va sempre usata la parola chiave
+@code{function} per definire una funzione.
+
+@node Esempio di funzione
+@subsection Un esempio di definizione di funzione
+@cindex esempio di definizione di funzione
+@cindex funzione, esempio di definizione di
+
+
+Ecco un esempio di funzione definita dall'utente, di nome
+@code{stampa_num()}, che
+ha come input un numero e lo stampa in un formato specifico:
+
+@example
+function stampa_num(numero)
+@{
+     printf "%6.3g\n", numero
+@}
+@end example
+
+@noindent
+Per comprenderne il funzionamento, ecco una regola @command{awk} che usa
+la funzione @code{stampa_num()}:
+
+@example
+$3 > 0     @{ stampa_num($3) @}
+@end example
+
+@noindent
+Questo programma stampa, nel nostro formato speciale, tutti i terzi campi
+nei record in input che
+contengono un numero positivo.  Quindi, dato il seguente input:
+
+@example
+ 1.2   3.4    5.6   7.8
+ 9.10 11.12 -13.14 15.16
+17.18 19.20  21.22 23.24
+@end example
+
+@noindent
+questo programma, usando la nostra funzione per formattare i risultati, stampa:
+
+@example
+   5.6
+  21.2
+@end example
+
+La funzione seguente cancella tutti gli elementi in un vettore
+(si ricordi che gli spazi bianchi in soprannumero stanno a indicare
+l'inizio della lista delle variabili locali):
+
+@example
+@group
+function cancella_vettore(a,    i)
+@{
+    for (i in a)
+        delete a[i]
+@}
+@end group
+@end example
+
+Quando si lavora con vettori, @`e spesso necessario cancellare
+tutti gli elementi in un vettore e ripartire con una nuova lista di elementi
+(@pxref{Cancellazione}).
+Invece di dover ripetere
+questo ciclo ogni volta che si deve cancellare
+un vettore, un programma pu@`o limitarsi a effettuare una chiamata
+a @code{cancella_vettore()}.
+(Questo garantisce la portabilit@`a.  L'uso di @samp{delete @var{vettore}}
+per cancellare
+il contenuto di un intero vettore @`e un'aggiunta relativamente
+recente@footnote{Verso la fine del 2012.}
+allo standard POSIX.)
+
+Quello che segue @`e un esempio di una funzione ricorsiva.  Prende come
+parametro di input una stringa e restituisce la stringa in ordine inverso.
+Le funzioni ricorsive devono sempre avere un test che interrompa la
+ricorsione.
+In questo caso, la ricorsione termina quando la stringa in input @`e
+gi@`a vuota:
+
+@c 8/2014: Thanks to Mike Brennan for the improved formulation
+@cindex @code{rev()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{rev()}
+@example
+function rev(stringa)
+@{
+    if (stringa == "")
+        return ""
+
+    return (rev(substr(stringa, 2)) substr(stringa, 1, 1))
+@}
+@end example
+
+Se questa funzione @`e in un file di nome @file{rev.awk}, si pu@`o provare
+cos@`{@dotless{i}}:
+
+@example
+$ @kbd{echo "Non v'allarmate!" |}
+> @kbd{gawk -e '@{ print rev($0) @}' -f rev.awk}
+@print{} !etamralla'v noN
+@end example
+
+La funzione C @code{ctime()} prende una marcatura temporale e la restituisce
+come una stringa,
+formattata come gi@`a sappiamo.
+Il seguente esempio usa la funzione predefinita @code{strftime()}
+(@pxref{Funzioni di tempo})
+per creare una versione @command{awk} di @code{ctime()}:
+
+@cindex @code{ctime()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{ctime()}
+@example
+@c file eg/lib/ctime.awk
+# ctime.awk
+#
+# versione awk della funzione C ctime(3)
+
+function ctime(ts,    format)
+@{
+    format = "%a %e %b %Y, %H.%M.%S, %Z"
+
+    if (ts == 0)
+        ts = systime()       # usare data e ora correnti per default
+    return strftime(format, ts)
+@}
+@c endfile
+@end example
+
+Si potrebbe pensare che la funzione @code{ctime()} possa usare
+@code{PROCINFO["strftime"]}
+come stringa di formato.  Sarebbe un errore, perch@'e si suppone che
+@code{ctime()} restituisca data e ora formattati in maniera standard,
+e qualche codice a livello utente potrebbe aver modificato in precedenza
+@code{PROCINFO["strftime"]}.
+
+@node Chiamata di una funzione
+@subsection Chiamare funzioni definite dall'utente
+
+@cindex funzioni definite dall'utente, chiamare
+@cindex chiamare funzioni definite dall'utente
+@dfn{Chiamare una funzione} significa richiedere l'esecuzione di una
+funzione, la quale svolge il compito per cui @`e stata scritta.
+La chiamata di una funzione @`e un'espressione e il suo valore @`e quello
+restituito dalla funzione.
+
+@menu
+* Chiamare una funzione::               Non usare spazi.
+* Campo di validit@`a variabili::         Variabili locali e globali.
+* Parametri per valore/riferimento::    Passaggio parametri.
+* Precisazioni sulle funzioni::         Cose a cui prestare attenzione.
+@end menu
+
+@node Chiamare una funzione
+@subsubsection Scrivere una chiamata di funzione
+
+Una chiamata di funzione consiste nel nome della funzione seguito dagli
+argomenti racchiusi tra parentesi.  Gli argomenti specificati nella chiamata
+sono costituiti da espressioni @command{awk}.  Ogni volta che si esegue una
+chiamata queste espressioni vengono ricalcolate, e i loro valori diventano gli
+argomenti passati alla funzione.  Per esempio, ecco una chiamata a
+@code{pippo()} con tre argomenti (il primo dei quali @`e una concatenazione di
+stringhe):
+
+@example
+pippo(x y, "perdere", 4 * z)
+@end example
+
+@quotation ATTENZIONE
+Caratteri bianchi (spazi e TAB) non sono permessi tra il nome della funzione e
+la parentesi aperta che apre la lista degli argomenti.  Se per errore si
+lasciano dei caratteri bianchi, @command{awk} li interpreterebbe come se
+s'intendesse concatenare una variabile con un'espressione tra parentesi.
+Tuttavia, poich@'e si @`e usato un nome di funzione e non un nome di variabile,
+verrebbe emesso un messaggio di errore.
+@end quotation
+
+@node Campo di validit@`a variabili
+@subsubsection Variabili locali e globali.
+
+@cindex variabili locali, in una funzione
+@cindex locali, variabili, per una funzione
+Diversamente da molti altri linguaggi, non c'@`e modo di
+rendere locale una variabile in un blocco @code{@{} @dots{} @code{@}} di
+@command{awk}, ma si pu@`o rendere locale una variabile di una funzione.  @`E
+buona norma farlo quando una variabile serve solo all'interno di quella
+particolare funzione.
+
+Per rendere locale una variabile per una funzione, basta dichiarare la
+variabile come argomento della funzione dopo gli argomenti richiesti dalla
+funzione (@pxref{Sintassi delle definizioni}).  Si consideri il seguente
+esempio, dove la variabile @code{i} @`e una variabile globale usata sia dalla
+funzione @code{pippo()} che dalla funzione @code{pluto()}:
+
+@example
+function pluto()
+@{
+    for (i = 0; i < 3; i++)
+        print "in pluto i=" i
+@}
+
+function pippo(j)
+@{
+    i = j + 1
+    print "in pippo i=" i
+    pluto()
+    print "in pippo i=" i
+@}
+
+BEGIN @{
+      i = 10
+      print "in BEGIN i=" i
+      pippo(0)
+      print "in BEGIN i=" i
+@}
+@end example
+
+L'esecuzione di questo @dfn{script} produce quanto segue, perch@'e la stessa
+variabile @code{i} @`e usata sia nelle
+funzioni @code{pippo()} e @code{pluto()} sia a livello della
+regola @code{BEGIN}:
+
+@example
+in BEGIN i=10
+in pippo i=1
+in pluto i=0
+in pluto i=1
+in pluto i=2
+in pippo i=3
+in BEGIN i=3
+@end example
+
+Se si vuole che @code{i} sia una variabile locale sia per
+@code{pippo()} che per @code{pluto()}, occorre procedere in questo modo
+(gli spazi extra prima della @code{i} sono una convenzione di codifica
+che serve a ricordare che @code{i} @`e una variabile locale, non
+un argomento):
+
+@example
+function pluto(    i)
+@{
+    for (i = 0; i < 3; i++)
+        print "in pluto i=" i
+@}
+
+function pippo(j,    i)
+@{
+    i = j + 1
+    print "in pippo i=" i
+    pluto()
+    print "in pippo i=" i
+@}
+
+BEGIN @{
+      i = 10
+      print "in BEGIN i=" i
+      pippo(0)
+      print "in BEGIN i=" i
+@}
+@end example
+
+L'esecuzione della versione corretta dello @dfn{script} produce il seguente
+output:
+
+@example
+in BEGIN i=10
+in pippo i=1
+in pluto i=0
+in pluto i=1
+in pluto i=2
+in pippo i=1
+in BEGIN i=10
+@end example
+
+Oltre a valori scalari (stringhe e numeri), si possono usare anche
+vettori locali.  Usando come parametro il nome di un vettore, @command{awk}
+lo considera come tale, e lo tratta come locale alla funzione.
+Inoltre, chiamate ricorsive creano nuovi vettori.
+Si consideri questo esempio:
+
+@example
+@group
+function qualche_funz(p1,      a)
+@{
+    if (p1++ > 3)
+        return
+@end group
+
+    a[p1] = p1
+
+    qualche_funz(p1)
+
+    printf("Al livello %d, indice %d %s trova in a\n",
+         p1, (p1 - 1), (p1 - 1) in a ? "si" : "non si")
+    printf("Al livello %d, indice %d %s trova in a\n",
+         p1, p1, p1 in a ? "si" : "non si")
+    print ""
+@}
+
+BEGIN @{
+    qualche_funz(1)
+@}
+@end example
+
+Quando viene eseguito, questo programma produce il seguente output:
+
+@example
+Al livello 4, indice 3 non si trova in a
+Al livello 4, indice 4 si trova in a
+
+Al livello 3, indice 2 non si trova in a
+Al livello 3, indice 3 si trova in a
+
+Al livello 2, indice 1 non si trova in a
+Al livello 2, indice 2 si trova in a
+@end example
+
+@node Parametri per valore/riferimento
+@subsubsection Passare parametri di funzione per valore o per riferimento
+
+In @command{awk}, quando si definisce una funzione, non c'@`e modo di
+dichiarare esplicitamente se gli argomenti sono passati @dfn{per valore}
+o @dfn{per riferimento}.
+
+Invece, il modo con cui i parametri sono passati @`e determinato
+durante l'esecuzione del programma,
+quando la funzione @`e chiamata, nel rispetto della regola seguente:
+se l'argomento @`e una variabile di tipo vettoriale, questa @`e passata
+per riferimento.  Altrimenti, l'argomento @`e passato per valore.
+
+@cindex chiamare per valore
+Passare un argomento per valore significa che quando una funzione @`e chiamata,
+le viene fornita una @emph{copia} del valore di quell'argomento.  Il chiamante
+pu@`o usare una variabile il cui valore calcolato viene passato come argomento, ma la
+funzione chiamata non la riconosce come variabile; riconosce solo il valore
+assunto dall'argomento.  Per esempio, scrivendo il seguente codice:
+
+@example
+pippo = "pluto"
+z = mia_funzione(pippo)
+@end example
+
+@noindent
+non si deve pensare che l'argomento passato a @code{mia_funzione()} sia ``la
+variabile @code{pippo}.''  Invece, @`e corretto considerare l'argomento come la
+stringa il cui valore @`e @code{"pluto"}.
+Se la funzione @code{mia_funzione()} altera i valori delle sue variabili
+locali, ci@`o non influisce su nessun'altra variabile.  Quindi, se
+@code{mia_funzione()} fa questo:
+
+@example
+@group
+function mia_funzione(stringa)
+@{
+   print stringa
+   stringa = "zzz"
+   print stringa
+@}
+@end group
+@end example
+
+@noindent
+cambiando cos@`{@dotless{i}} il valore della variabile che @`e il suo primo argomento, ossia
+@code{stringa}, il valore di @code{pippo} per il chiamante @emph{non} viene
+modificato.  Il ruolo svolto da @code{pippo} nella chiamata di
+@code{mia_funzione()} termina quando il suo valore (@code{"pluto"}) viene
+calcolato.  Se la variabile @code{stringa} esiste anche al di fuori di
+@code{mia_funzione()}, il corpo della funzione non pu@`o modificare questo valore
+esterno, perch@'e esso rimane oscurato durante l'esecuzione di
+@code{mia_funzione()} e non pu@`o quindi essere visto o modificato.
+
+@cindex chiamare per riferimento
+@cindex vettori, come parametri di funzione
+@cindex funzioni, vettori come parametri di
+Tuttavia, quando sono dei vettori a fungere da parametri alle funzioni, questi
+@emph{non} vengono copiati.  Invece, il vettore stesso @`e reso disponibile per
+essere manipolato direttamente dalla funzione.  Questo @`e quel che si dice
+solitamente una @dfn{chiamata per riferimento}.  Le modifiche effettuate su un
+vettore passato come parametro all'interno del corpo di una funzione
+@emph{sono} visibili all'esterno della funzione.
+
+@quotation NOTA
+Modificare un vettore passato come parametro all'interno di una funzione
+pu@`o essere molto pericoloso se non si sta attenti a quel che si sta facendo.
+Per esempio:
+
+@example
+function cambialo(vettore, ind, nvalore)
+@{
+     vettore[ind] = nvalore
+@}
+
+BEGIN @{
+    a[1] = 1; a[2] = 2; a[3] = 3
+    cambialo(a, 2, "due")
+    printf "a[1] = %s, a[2] = %s, a[3] = %s\n",
+            a[1], a[2], a[3]
+@}
+@end example
+
+@noindent
+stampa @samp{a[1] = 1, a[2] = due, a[3] = 3}, perch@'e
+@code{cambialo()} memorizza @code{"due"} nel secondo elemento di @code{a}.
+@end quotation
+
+@node Precisazioni sulle funzioni
+@subsubsection Cose a cui prestare attenzione
+
+@cindex indefinite, funzioni
+@cindex funzioni indefinite
+Alcune implementazioni di @command{awk} consentono di chiamare una
+funzione che non @`e stata definita.
+Viene solo emesso un messaggio che descrive il problema al momento
+dell'esecuzione, se il programma tenta di chiamare quella funzione.
+Per esempio:
+
+@example
+BEGIN @{
+    if (0)
+        pippo()
+    else
+        pluto()
+@}
+function pluto() @{ @dots{} @}
+# si noti che `pippo' non @`e definito
+@end example
+
+@noindent
+Poich@'e la condizione dell'istruzione @samp{if} non risulter@`a mai verificata
+in questo caso,
+non @`e un problema reale il fatto che
+che @code{pippo()} non sia stato definito.  Solitamente, tuttavia,
+@`e un problema se un programma chiama una funzione indefinita.
+
+@cindex @dfn{lint}, controlli, funzione indefinita
+@cindex controlli @dfn{lint} per funzione indefinita
+@cindex funzione indefinita, controlli @dfn{lint} per
+
+Se si specifica l'opzione @option{--lint}
+(@pxref{Opzioni}),
+@command{gawk} elenca le chiamate a funzioni indefinite.
+
+@cindex portabilit@`a, istruzione @code{next} in funzioni definite dall'utente
+@cindex @code{next}, istruzione, in funzioni definite dall'utente
+Alcune implementazione di @command{awk} emettono un messaggio di errore
+se si usa l'istruzione @code{next}
+o @code{nextfile}
+(@pxref{Istruzione next}, e
+@ifdocbook
+@ref{Istruzione nextfile})
+@end ifdocbook
+@ifnotdocbook
+@pxref{Istruzione nextfile})
+@end ifnotdocbook
+all'interno di una funzione definita dall'utente.
+@command{gawk} non ha questa limitazione.
+
+@`E possibile chiamare una funzione specificando parametri in pi@`u rispetto
+a quelli che la funzione si aspetta, come p.es.:
+
+@example
+function pippo(p1, p2)
+@{
+    @dots{}
+@}
+
+BEGIN @{
+    pippo(1, 2, 3, 4)
+@}
+@end example
+
+Fare questo, tuttavia, @`e una pratica sconsigliata.  La funzione chiamata
+potrebbe fare qualsiasi cosa con i valori ulteriori che le vengono passati,
+quindi @command{awk} calcola le espressioni richieste, per poi non
+utilizzarle affatto.
+
+@`E inoltre ancora pi@`u importante notare che una simile chiamata di funzione
+pu@`o essere causa di confusione per la persona che potrebbe leggere in
+seguito il programma in questione.@footnote{Questa persona potresti
+anche essere tu, dopo qualche tempo, e a quel punto ti domanderesti
+``cosa stavo pensando?!?''}
+I parametri di una funzione sono generalmente elementi dell'input che
+influenzano l'elaborazione eseguita dalla funzione.  Chiamare una funzione
+con pi@`u parametri del necessario potrebbe comunicare la falsa impressione
+che quei valori siano importanti per la funzione, mentre in realt@`a non
+lo sono affatto.
+
+Poich@'e questa pratica non @`e affatto raccomandabile, @command{gawk}
+manda @emph{sempre} un messaggio di avvertimento quando si trova a
+eseguire una tale chiamata di funzione.  (Se non si vuole ricevere
+il messaggio, occorre modificare il codice!  In fondo, non @`e
+corretto).
+
+@node Istruzione return
+@subsection L'istruzione @code{return}
+@cindex @code{return}, istruzione@comma{} in funzioni definite dall'utente
+@cindex istruzione @code{return}@comma{} in funzioni definite dall'utente
+
+Come visto in parecchi esempi precedenti,
+il corpo di una funzione definita dall'utente pu@`o contenere un'istruzione
+@code{return}.
+Quest'istruzione restituisce il controllo a quella parte del
+del programma @command{awk} che ha effettuato la chiamata.
+Pu@`o anche essere usata per restituire un valore da usare nel resto del
+programma @command{awk}.
+Questo @`e un esempio:
+
+@display
+@code{return} [@var{espressione}]
+@end display
+
+La parte @var{espressione} @`e opzionale.
+Probabilmente per una svista, POSIX non definisce qual @`e il valore
+restituito, se si omette @var{espressione}.  Tecnicamente parlando, questo
+rende il valore restituito indefinito, e quindi, indeterminato.
+In pratica, tuttavia, tutte le versioni di @command{awk} restituiscono
+semplicemente la stringa nulla, che vale zero se usata
+in un contesto che richiede un numero.
+
+Un'istruzione @code{return} senza una @var{espressione} @`e considerata presente
+alla fine di ogni definizione di funzione.
+Quindi, se il flusso di esecuzione raggiunge la fine del corpo della
+funzione, tecnicamente la funzione
+restituisce un valore indeterminato.
+In pratica, restituisce la stringa nulla.  @command{awk}
+@emph{non} emette alcun messaggio di avvertimento se si usa
+il valore restituito di una tale funzione.
+
+Talvolta pu@`o capitare di scrivere una funzione per quello che fa, non per
+quello che restituisce.  Una tale funzione corrisponde a una funzione
+@code{void} in C, C++, o Java, o a una @code{procedure} in Ada.
+Quindi, pu@`o essere corretto non
+restituire alcun valore; basta fare attenzione a non usare poi il
+valore restituito da una tale funzione.
+
+Quello che segue @`e un esempio di una funzione definita dall'utente
+che restituisce un valore che @`e
+il numero pi@`u alto presente tra gli elementi di un vettore:
+
+@example
+function massimo(vettore,   i, max)
+@{
+     for (i in vettore) @{
+          if (max == "" || vettore[i] > max)
+               max = vettore[i]
+     @}
+     return max
+@}
+@end example
+
+@cindex programmazione, convenzioni di, parametri di funzione
+@cindex convenzioni di programmazione, parametri di funzione
+@noindent
+La chiamata a @code{massimo()} ha un solo argomento, che @`e il nome di
+un vettore.  Le variabili locali @code{i} e @code{max} non vanno intese
+come argomenti; nulla vieta di passare pi@`u di un argomento
+a @code{massimo()} ma i risultati sarebbero strani.  Gli spazi extra prima
+di @code{i} nella lista dei parametri della funzione indicano che @code{i} e
+@code{max} sono variabili locali.
+@`E consigliabile seguire questa convenzione quando si definiscono delle funzioni.
+
+Il programma seguente usa la funzione @code{massimo()}.  Carica un vettore,
+richiama @code{massimo()}, e quindi elenca il numero massimo contenuto in
+quel vettore:
+
+@example
+function massimo(vettore,   i, max)
+@{
+     for (i in vettore) @{
+          if (max == "" || vettore[i] > max)
+               max = vettore[i]
+     @}
+     return max
+@}
+
+@group
+# Carica tutti i campi di ogni record in numeri.
+@{
+     for (i = 1; i <= NF; i++)
+          numeri[NR, i] = $i
+@}
+@end group
+
+END @{
+     print massimo(numeri)
+@}
+@end example
+
+Dato il seguente input:
+
+@example
+ 1 5 23 8 16
+44 3 5 2 8 26
+256 291 1396 2962 100
+-6 467 998 1101
+99385 11 0 225
+@end example
+
+@noindent
+il programma trova (come si pu@`o immaginare) che 99.385 @`e il
+valore pi@`u alto contenuto nel vettore.
+
+@node Variabili di tipo dinamico
+@subsection Funzioni e loro effetti sul tipo di una variabile
+
+@command{awk} @`e un linguaggio molto fluido.
+@`E possible che @command{awk} non sia in grado di stabilire se un
+identificativo rappresenta una variabile scalare o un vettore,
+prima dell'effettiva esecuzione di un programma.
+Ecco un esempio di programma commentato:
+
+@example
+function pippo(a)
+@{
+    a[1] = 1 # il parametro @`e un vettore
+@}
+
+BEGIN @{
+    b = 1
+    pippo(b) # non valido: errore fatale, tipi variabile in conflitto
+
+    pippo(x) # x non inizializzato, diventa un vettore dinamicamente
+    x = 1    # a questo punto, non permesso: errore in esecuzione
+@}
+@end example
+
+In questo esempio, la prima chiamata a @code{pippo()} genera
+un errore fatale, quindi @command{awk} non arriver@`a a segnalare il secondo
+errore.  Se si commenta la prima chiamata e si riesegue il
+programma, a quel punto @command{awk} terminer@`a con un messaggio
+relativo al secondo errore.
+Solitamente queste cose non causano grossi problemi, ma @`e bene
+esserne a conoscenza.
+
+@node Chiamate indirette
+@section Chiamate indirette di funzione
+
+@cindex indiretta, chiamata di funzione
+@cindex chiamata indiretta di funzione
+@cindex funzione, puntatori a
+@cindex puntatori a funzioni
+@cindex differenze tra @command{awk} e @command{gawk}, chiamata indiretta di funzione
+
+Questa sezione descrive un'estensione avanzata, specifica di @command{gawk}.
+
+Spesso pu@`o essere utile ritardare la scelta della funzione da chiamare
+fino al momento in cui il programma viene eseguito.
+Per esempio, potrebbero esserci diversi tipi di record in input, ciascuno
+dei quali dovrebbe essere elaborato in maniera differente.
+
+Solitamente, si userebbe una serie di istruzioni @code{if}-@code{else}
+per decidere quale funzione chiamare.  Usando la chiamata @dfn{indiretta}
+a una funzione, si pu@`o assegnare il nome della funzione da chiamare a
+una variabile di tipo stringa, e usarla per chiamare la funzione.
+Vediamo un esempio.
+
+Si supponga di avere un file con i punteggi ottenuti negli esami per i
+corsi che si stanno seguendo, e che si desideri ottenere la somma e la
+media dei punteggi ottenuti.
+Il primo campo @`e il nome del corso. I campi seguenti sono i nomi delle
+funzioni da chiamare per elaborare i dati, fino a un campo ``separatore''
+@samp{dati:}.  Dopo il separatore, fino alla fine del record,
+ci sono i vari risultati numerici di ogni test.
+
+Ecco il file iniziale:
+
+@example
+@c file eg/data/class_data1
+Biologia_101 somma media dati: 87.0 92.4 78.5 94.9
+Chimica_305 somma media dati: 75.2 98.3 94.7 88.2
+Inglese_401 somma media dati: 100.0 95.6 87.1 93.4
+@c endfile
+@end example
+
+Per elaborare i dati, si potrebbe iniziare a scrivere:
+
+@example
+@{
+    corso = $1
+    for (i = 2; $i != "dati:"; i++) @{
+        if ($i == "somma")
+            somma()   # elabora l'intero record
+        else if ($i == "media")
+            media()
+        @dots{}           # e cos@`{@dotless{i}} via
+    @}
+@}
+@end example
+
+@noindent
+Questo stile di programmazione funziona, ma pu@`o essere scomodo.
+Con la chiamata @dfn{indiretta} di funzione, si pu@`o richiedere a @command{gawk}
+di usare il @emph{valore} di una variabile come @emph{nome} della funzione da
+chiamare.
+
+@cindex @code{@@}, notazione per la chiamata indiretta di funzioni
+@cindex chiamata indiretta di funzioni, notazione @code{@@}
+La sintassi @`e simile a quella di una normale chiamata di funzione:
+un identificativo, seguito immediatamente da una parentesi aperta,
+qualche argomento, e una parentesi chiusa, con l'aggiunta di un carattere
+@samp{@@} all'inizio:
+
+@example
+quale_funzione = "somma"
+risultato = @@quale_funzione()   # chiamata della funzione somma()
+@end example
+
+Ecco un intero programma che elabora i dati mostrati sopra,
+usando la chiamata indiretta di funzioni:
+
+@example
+@c file eg/prog/indirectcall.awk
+# chiamataindiretta.awk --- esempio di chiamata indiretta di funzioni
+@c endfile
+@ignore
+@c file eg/prog/indirectcall.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# January 2009
+@c endfile
+@end ignore
+
+@c file eg/prog/indirectcall.awk
+# media --- calcola la media dei valori dei campi $primo - $ultimo
+
+function media(primo, ultimo,   somma, i)
+@{
+    somma = 0;
+    for (i = primo; i <= ultimo; i++)
+        somma += $i
+
+    return somma / (ultimo - primo + 1)
+@}
+
+# somma --- restituisce la somma dei valori dei campi $primo - $ultimo
+
+function somma(primo, ultimo,   totale, i)
+@{
+    max = 0;
+    for (i = primo; i <= ultimo; i++)
+        totale += $i
+
+    return totale
+@}
+@c endfile
+@end example
+
+Queste due funzioni presuppongono che si lavori con dei campi; quindi,
+i parametri @code{primo} e @code{ultimo} indicano da quale campo iniziare
+e fino a quale arrivare.
+Per il resto, eseguono i calcoli richiesti, che sono i soliti:
+
+@example
+@c file eg/prog/indirectcall.awk
+# Per ogni record,
+# stampa il nome del corso e le statistiche richieste
+@{
+    nome_corso = $1
+    gsub(/_/, " ", nome_corso)  # Rimpiazza _ con spazi
+
+    # trova campo da cui iniziare
+    for (i = 1; i <= NF; i++) @{
+        if ($i == "dati:") @{
+            inizio = i + 1
+            break
+        @}
+    @}
+
+    printf("%s:\n", nome_corso)
+    for (i = 2; $i != "dati:"; i++) @{
+        quale_funzione = $i
+        printf("\t%s: <%s>\n", $i, @@quale_funzione(inizio, NF) "")
+    @}
+    print ""
+@}
+@c endfile
+@end example
+
+Questo @`e il ciclo principale eseguito per ogni record.
+Stampa il nome del corso (con le
+lineette basse sostituite da spazi). Trova poi l'inizio dei dati veri
+e propri, salvandolo in @code{inizio}.
+L'ultima parte del codice esegue un ciclo per ogni nome di funzione
+(da @code{$2} fino al separatore, @samp{dati:}), chiamando la funzione
+il cui nome @`e specificato nel campo. La chiamata di funzione indiretta
+compare come parametro nella chiamata a @code{printf}.
+(La stringa di formattazione di @code{printf} usa @samp{%s} come
+specificatore di formato, affinch@'e sia possibile usare funzioni
+che restituiscano sia stringhe che numeri.  Si noti che il risultato
+della chiamata indiretta @`e concatenato con la stringa nulla, in modo da
+farlo considerare un valore di tipo stringa).
+
+Ecco il risultato dell'esecuzione del programma:
+
+@example
+$ @kbd{gawk -f chiamataindiretta.awk dati_dei_corsi}
+@print{} Biologia 101:
+@print{}     somma: <352.8>
+@print{}     media: <88.2>
+@print{}
+@print{} Chimica 305:
+@print{}     somma: <356.4>
+@print{}     media: <89.1>
+@print{}
+@print{} Inglese 401:
+@print{}     somma: <376.1>
+@print{}     media: <94.025>
+@end example
+
+La possibilit@`a di usare la chiamata indiretta di funzioni @`e pi@`u potente
+di quel che si possa pensare inizialmente.
+I linguaggi C e C++ forniscono ``puntatori di funzione'' che
+sono un metodo per chiamare una funzione scelta al momento dell'esecuzione.
+Uno dei pi@`u noti usi di questa funzionalit@`a @`e
+la funzione C @code{qsort()}, che ordina un vettore usando il famoso
+algoritmo noto come ``quicksort''
+(si veda @uref{https://en.wikipedia.org/wiki/Quicksort, l'articolo di Wikipedia}
+per ulteriori informazioni).  Per usare questa funzione, si specifica un
+puntatore a una funzione di confronto.  Questo meccanismo consente
+di ordinare dei dati arbitrari in una maniera arbitraria.
+
+Si pu@`o fare qualcosa di simile usando @command{gawk}, cos@`{@dotless{i}}:
+
+@example
+@c file eg/lib/quicksort.awk
+# quicksort.awk --- Algoritmo di quicksort, con funzione di confronto
+#                   fornita dall'utente
+@c endfile
+@ignore
+@c file eg/lib/quicksort.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# January 2009
+
+@c endfile
+@end ignore
+@c file eg/lib/quicksort.awk
+
+# quicksort --- Algoritmo di quicksort di C.A.R. Hoare.
+#               Si veda Wikipedia o quasi ogni libro
+#               che tratta di algoritmi o di informatica.
+@c endfile
+@ignore
+@c file eg/lib/quicksort.awk
+#
+# Adattato da B.W. Kernighan & D.M. Ritchie
+# The C Programming Language
+# (Englewood Cliffs, NJ: Prentice Hall, 1988)
+# Seconda Edizione, pagina 110
+@c endfile
+@end ignore
+@c file eg/lib/quicksort.awk
+
+function quicksort(dati, sinistra, destra, minore_di,    i, ultimo)
+@{
+    if (sinistra >= destra)  # non fa nulla se il vettore contiene
+        return               # meno di due elementi
+
+    quicksort_scambia(dati, sinistra, int((sinistra + destra) / 2))
+    ultimo = sinistra
+    for (i = sinistra + 1; i <= destra; i++)
+        if (@@minore_di(dati[i], dati[sinistra]))
+            quicksort_scambia(dati, ++ultimo, i)
+    quicksort_scambia(dati, sinistra, ultimo)
+    quicksort(dati, sinistra, ultimo - 1, minore_di)
+    quicksort(dati, ultimo + 1, destra, minore_di)
+@}
+
+# quicksort_scambia --- funzione ausiliaria per quicksort,
+#                       sarebbe meglio fosse nel programma principale
+
+function quicksort_scambia(dati, i, j,      salva)
+@{
+    salva = dati[i]
+    dati[i] = dati[j]
+    dati[j] = salva
+@}
+@c endfile
+@end example
+
+La funzione @code{quicksort()} riceve il vettore @code{dati}, gli
+indici iniziali e finali da ordinare
+(@code{sinistra} e @code{destra}), e il nome di una funzione che
+esegue un confronto ``minore di''.  Viene quindi eseguito
+l'algoritmo di quicksort.
+
+Per fare uso della funzione di ordinamento, torniamo all'esempio
+precedente.  La prima cosa da fare @`e di scrivere qualche funzione
+di confronto:
+
+@example
+@c file eg/prog/indirectcall.awk
+@group
+# num_min --- confronto numerico per minore di
+
+function num_min(sinistra, destra)
+@{
+    return ((sinistra + 0) < (destra + 0))
+@}
+@end group
+
+# num_magg_o_ug --- confronto numerico per maggiore o uguale
+
+function num_magg_o_ug(sinistra, destra)
+@{
+    return ((sinistra + 0) >= (destra + 0))
+@}
+@c endfile
+@end example
+
+La funzione @code{num_magg_o_ug()} serve per ottenere un ordinamento
+decrescente (dal numero pi@`u alto al pi@`u basso); quando @`e usato
+per eseguire un test per ``minore di'', in realt@`a fa l'opposto
+(maggiore o uguale a), il che conduce a ottenere dati ordinati
+in ordine decrescente.
+
+Poi serve una funzione di ordinamento.
+Come parametri ha i numeri del campo iniziale e di quello finale,
+e il nome della funzione di confronto.
+Costruisce un vettore con
+i dati e richiama appropriatamente @code{quicksort()}; quindi formatta i
+risultati mettendoli in un'unica stringa:
+
+@example
+@c file eg/prog/indirectcall.awk
+# ordina --- ordina i dati a seconda di `confronta'
+#             e li restituisce come un'unica stringa
+
+function ordina(primo, ultimo, confronta,      dati, i, risultato)
+@{
+    delete dati
+    for (i = 1; primo <= ultimo; primo++) @{
+        dati[i] = $primo
+        i++
+    @}
+
+    quicksort(dati, 1, i-1, confronta)
+
+    risultato = dati[1]
+    for (i = 2; i in dati; i++)
+        risultato = risultato " " dati[i]
+
+    return risultato
+@}
+@c endfile
+@end example
+
+Per finire, le due funzioni di ordinamento chiamano la funzione
+@code{ordina()}, passandole i nomi delle due funzioni di confronto:
+
+@example
+@c file eg/prog/indirectcall.awk
+@group
+# ascendente --- ordina i dati in ordine crescente
+#            e li restituisce sotto forma di stringa
+
+function ascendente(primo, ultimo)
+@{
+    return ordina(primo, ultimo, "num_min")
+@}
+@end group
+
+@group
+# discendente --- ordina i dati in ordine decrescente
+#            e li restituisce sotto forma di stringa
+
+function discendente(primo, ultimo)
+@{
+    return ordina(primo, ultimo, "num_magg_o_ug")
+@}
+@end group
+@c endfile
+@end example
+
+Ecco una versione estesa del @value{DF}:
+
+@example
+@c file eg/data/class_data2
+Biologia_101 somma media ordina discendente dati: 87.0 92.4 78.5 94.9
+Chimica_305 somma media ordina discendente dati: 75.2 98.3 94.7 88.2
+Inglese_401 somma media ordina discendente dati: 100.0 95.6 87.1 93.4
+@c endfile
+@end example
+
+Per finire, questi sono i risultati quando si esegue il programma
+in questa versione migliorata:
+
+@example
+$ @kbd{gawk -f quicksort.awk -f indirettacall.awk class_data2}
+@print{} Biologia 101:
+@print{}     somma: <352.8>
+@print{}     media: <88.2>
+@print{}     ascendente: <78.5 87.0 92.4 94.9>
+@print{}     discendente: <94.9 92.4 87.0 78.5>
+@print{}
+@print{} Chimica 305:
+@print{}     somma: <356.4>
+@print{}     media: <89.1>
+@print{}     ascendente: <75.2 88.2 94.7 98.3>
+@print{}     discendente: <98.3 94.7 88.2 75.2>
+@print{}
+@print{} Inglese 401:
+@print{}     somma: <376.1>
+@print{}     media: <94.025>
+@print{}     ascendente: <87.1 93.4 95.6 100.0>
+@print{}     discendente: <100.0 95.6 93.4 87.1>
+@end example
+
+Un altro esempio in cui le chiamate indirette di funzione sono utili
+@`e costituito dall'elaborazione di vettori.  La descrizione si pu@`o trovare
+@ref{Visitare vettori}.
+
+Occorre ricordarsi di anteporre il carattere @samp{@@} prima di una
+chiamata indiretta di funzione.
+
+A partire dalla @value{PVERSION} 4.1.2 di @command{gawk}, le chiamate
+indirette di funzione
+possono anche essere usate per chiamare funzioni predefinite e con
+funzioni di estensione
+(@pxref{Estensioni dinamiche}). Ci sono alcune limitazioni nel richiamare
+in maniera indiretta delle funzioni predefinite, come qui dettagliato:
+
+@itemize @value{BULLET}
+@item
+Non si pu@`o passare una costante @dfn{regexp} a una funzione predefinita
+effettuando una chiamata di funzione indiretta.@footnote{Questa
+limitazione potrebbe cambiare in una futura versione;
+per appurarlo, si controlli la documentazione che accompagna
+la versione in uso di @command{gawk}.}
+Quanto sopra vale per le funzioni
+@code{sub()}, @code{gsub()}, @code{gensub()}, @code{match()},
+@code{split()} e @code{patsplit()}.
+
+@item
+Nel chiamare @code{sub()} o @code{gsub()}, sono accettati solo due argomenti,
+poich@'e queste funzioni sono atipiche, in quanto aggiornano il loro terzo
+argomento.  Questo significa che verr@`a sempre aggiornato l'argomento di
+default, @code{$0}.
+@end itemize
+
+@command{gawk} fa del suo meglio per rendere efficiente la chiamata indiretta
+di funzioni.  Per esempio, nel ciclo seguente:
+
+@example
+for (i = 1; i <= n; i++)
+    @@quale_funzione()
+@end example
+
+@noindent
+@command{gawk} ricerca solo una volta quale funzione chiamare.
+
+@node Sommario delle funzioni
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+@command{awk} include delle funzioni predefinite e consente all'utente
+di definire le sue proprie funzioni.
+
+@item
+POSIX @command{awk} include tre tipi di funzioni predefinite: numeriche, di
+stringa, e di I/O.  @command{gawk} prevede funzioni per ordinare vettori, per
+lavorare con valori che rappresentano marcature temporali,
+per la manipolazione di bit,
+per determinare il tipo di una variabile (vettoriale piuttosto che scalare), e
+programmi per l'internazionalizzazione e la localizzazione.  @command{gawk}
+prevede anche parecchie estensioni ad alcune funzioni standard, tipicamente
+nella forma di ulteriori argomenti.
+
+@item
+Le funzioni accettano zero o pi@`u argomenti e restituiscono un valore.  Le
+espressioni che specificano il valore di ogni argomento sono valutate
+completamente prima della chiamata
+a una funzione.  L'ordine di valutazione di questi argomenti non @`e definito.
+Il valore restituito dalla funzione pu@`o essere ignorato.
+
+@item
+La gestione delle barre inverse in @code{sub()} e @code{gsub()} non @`e
+semplice.
+@`E pi@`u semplice nella funzione di @command{gawk} @code{gensub()},
+ma anche questa funzione richiede attenzione quando la si usa.
+
+@item
+Le funzioni definite dall'utente consentono importanti funzionalit@`a ma hanno
+anche alcune ineleganze sintattiche.  In una chiamata di funzione non si pu@`o
+inserire alcuno spazio tra il nome della funzione e la parentesi sinistra
+aperta che inizia la lista degli argomenti.  Inoltre, non c'@`e nessuna
+prescrizione per le variabili locali, e per questo la
+convenzione in uso @`e di aggiungere parametri extra, e di separarli visivamente
+dai parametri veri e propri inserendo degli spazi bianchi prima di essi.
+
+@item
+Le funzioni definite dall'utente possono chiamare altre
+funzioni definite dall'utente (oltre a quelle predefinite)
+e possono chiamare se stesse ricorsivamente.  I parametri di funzione
+``nascondono'' qualsiasi variabile globale che abbia lo stesso nome.
+Non si pu@`o usare il nome di una variabile riservata (p.es. @code{ARGC})
+come nome di un parametro in funzioni definite dall'utente.
+
+@item
+I valori scalari sono passati alle funzioni definite dall'utente
+per valore.  I parametri che sono dei vettori sono passati alle funzioni
+per riferimento; ogni modifica fatta dalla funzione a un parametro che
+sia un vettore @`e quindi visibile dopo aver eseguito quella funzione.
+
+@item
+L'istruzione @code{return} serve per tornare indietro da una funzione definita
+dall'utente.  Un'espressione opzionale diviene il valore restituito dalla
+funzione.  Una funzione pu@`o solo restituire valori di tipo scalare.
+
+@item
+Se una variabile che non @`e stata mai usata @`e passata a una funzione
+definita dall'utente, il modo con cui quella funzione elabora la variabile
+ne pu@`o determinare il tipo: o scalare o vettoriale.
+
+@item
+@command{gawk} consente la chiamata indiretta di funzioni usando una sintassi
+speciale.  Impostando una variabile al nome di una funzione, si pu@`o
+determinare al momento dell'esecuzione che funzione sar@`a chiamata in un certo
+punto del programma.  Questo equivale a usare un puntatore a una funzione nei
+linguaggi C e C++.
+
+@end itemize
+
+
+@ifnotinfo
+@part @value{PART2}Risoluzione di problemi con @command{awk}
+@end ifnotinfo
+
+@ifdocbook
+La Parte II mostra come usare @command{awk} e @command{gawk} per risolvere
+problemi.  Qui c'@`e il codice di molti programmi, da leggere e da cui si pu@`o
+imparare.  @`E composta dai seguenti capitoli:
+
+@itemize @value{BULLET}
+@item
+@ref{Funzioni di libreria}
+
+@item
+@ref{Programmi di esempio}
+@end itemize
+@end ifdocbook
+
+@node Funzioni di libreria
+@chapter Una libreria di funzioni @command{awk}
+@cindex libreria di funzioni @command{awk}
+@cindex funzioni di libreria
+@cindex funzioni definite dall'utente, libreria di
+
+@iftex
+La
+@end iftex
+@ref{Funzioni definite dall'utente} descrive come scrivere le proprie
+funzioni @command{awk} personali.  Scrivere funzioni @`e importante, perch@'e
+consente di incapsulare in un unico contenitore algoritmi e azioni di
+programma.  Semplifica la programmazione, rendendo lo sviluppo di un programma
+pi@`u gestibile, e rendendo i programmi pi@`u leggibili.
+
+@cindex Kernighan, Brian
+@cindex Plauger, P.J.@:
+Nel loro autorevole libro del 1976,
+@cite{Software Tools},@footnote{Purtroppo, a distanza di oltre 35 anni,
+molte delle
+lezioni impartite da questo libro devono ancora essere apprese da un gran
+numero di programmatori professionisti.}
+Brian Kernighan e P.J.@: Plauger hanno scritto:
+
+@quotation
+A programmare bene non s'impara dai concetti generali, ma vedendo come
+programmi complessi possono essere resi puliti, facili da leggere,
+facili da manutenere e modificare,
+strutturati in modo comprensibile, efficienti e affidabili,
+applicando il buon senso e delle buone pratiche di programmazione.
+Lo studio attento e l'imitazione di buoni programmi conduce a una migliore
+scrittura.
+@end quotation
+
+In effetti, loro reputavano quest'idea tanto importante da mettere questa
+frase sulla copertina del libro.  Poich@'e credo fermamente che la loro
+affermazione sia corretta, questo @value{CHAPTER} e
+@iftex
+il
+@end iftex
+@ref{Programmi di esempio}
+forniscono una corposa raccolta di codice da leggere e, si spera, da cui
+imparare.
+
+Questo @value{CHAPTER} illustra una libreria di utili funzioni @command{awk}.
+Molti dei programmi descritti nel seguito di questo @value{DOCUMENT}
+usano queste funzioni.
+Le funzioni sono illustrate progressivamente, dalla pi@`u semplice alla pi@`u
+complessa.
+
+@cindex Texinfo
+@iftex
+La
+@end iftex
+@ref{Programma extract}
+illustra un programma che si pu@`o usare per estrarre il codice sorgente
+degli esempi di funzioni di libreria e di programmi dal sorgente Texinfo
+di questo @value{DOCUMENT}.
+(Questo @`e gi@`a stato fatto durante la preparazione della distribuzione
+di @command{gawk}.)
+
+@ifclear FOR_PRINT
+Chi avesse scritto una o pi@`u funzioni @command{awk} utili e di uso
+generale, e volesse metterle a disposizione della comunit@`a degli utenti di
+@command{awk}, pu@`o leggere le informazioni contenute in
+@ref{Come contribuire}.
+@end ifclear
+
+@cindex portabilit@`a, programmi di esempio
+I programmi contenuti in questo @value{CHAPTER} e in
+@ref{Programmi di esempio},
+utilizzano anche le funzionalit@`a specifiche di @command{gawk}.
+Riscrivere questi programmi per implementazioni di @command{awk} diverse
+@`e piuttosto semplice:
+
+@itemize @value{BULLET}
+@item
+I messaggi di errore diagnostici sono inviati a @file{/dev/stderr}.
+Usare @samp{| "cat 1>&2"} al posto di @samp{> "/dev/stderr"} se il sistema
+in uso non ha un @file{/dev/stderr}, o se non @`e possibile usare
+@command{gawk}.
+
+@item
+Alcuni programmi usano @code{nextfile}
+(@pxref{Istruzione nextfile})
+per evitare di leggere gli input ancora non letti dal file in input corrente.
+
+@item
+@c 12/2000: Thanks to Nelson Beebe for pointing out the output issue.
+@cindex distinzione maiuscolo/minuscolo, programmi di esempio
+@cindex @code{IGNORECASE}, variabile, nei programmi di esempio
+@cindex variabile @code{IGNORECASE}, nei programmi di esempio
+Infine, alcuni dei programmi scelgono di ignorare la distinzione tra maiuscolo e
+minuscolo nei loro input, assegnando il valore uno a @code{IGNORECASE}.
+Si pu@`o ottenere quasi lo stesso effetto@footnote{I risultati non sono identici.
+L'output del record trasformato sar@`a tutto in minuscolo, mentre
+@code{IGNORECASE} preserva il contenuto originale del record in input.}
+aggiungendo la seguente regola
+all'inizio del programma:
+
+@example
+# ignora maiuscolo/minuscolo
+@{ $0 = tolower($0) @}
+@end example
+
+@noindent
+Inoltre, si verifichi che tutte le @dfn{regexp} e le costanti
+di tipo stringa usate nei confronti utilizzano solo lettere minuscole.
+@end itemize
+
+@menu
+* Nomi di variabili di libreria:: Che nomi @`e meglio dare alle variabili
+                                  private globali nelle funzioni di libreria.
+* Funzioni di tipo generale::    Funzioni di uso generale.
+* Gestione File Dati::           Funzioni per gestire file-dati specificati
+                                 sulla riga di comando.
+* Funzione getopt::              Una funzione per trattare argomenti presenti
+                                 sulla riga di comando.
+* Funzioni Passwd::              Funzioni per ottenete informazioni
+                                 sull'utente [da /etc/passwd].
+* Funzioni Group::               Funzioni per ottenete informazioni
+                                 sul gruppo [da /etc/group].
+* Visitare vettori::             Una funzione per visitare vettori di vettori.
+* Sommario funzioni di libreria:: Sommario funzioni di libreria
+* Esercizi con le librerie::     Esercizi.
+@end menu
+
+@node Nomi di variabili di libreria
+@section Dare un nome a variabili globali in funzioni di libreria
+
+@cindex nomi di vettore/variabile
+@cindex nomi di funzione
+@cindex questioni sui nomi permessi
+@cindex nomi permessi, questioni sui
+@cindex programmi @command{awk}, documentazione
+@cindex documentazione, di programmi @command{awk}
+Per come si @`e sviluppato il linguaggio @command{awk}, le variabili sono
+o @dfn{globali} (usabili dall'intero programma) o @dfn{locali} (usabili solo
+in una specifica funzione).  Non c'@`e uno stato intermedio analogo alle
+variabili @code{statiche} in C.
+
+@cindex variabili globali, per funzioni di libreria
+@cindex globali, variabili, per funzioni di libreria
+@cindex private, variabili
+@cindex variabili private
+Le funzioni di libreria hanno spesso necessit@`a di avere variabili globali da
+usare per conservare informazioni di stato tra successive chiamate alla
+funzione; per esempio, la variabile di @code{getopt()} @code{_opti}
+(@pxref{Funzione getopt}).
+Tali variabili vengono dette @dfn{private}, poich@'e le sole funzioni che
+devono usarle sono quelle della libreria.
+
+Quando si scrive una funzione di libreria, si dovrebbe cercare di scegliere per
+le variabili private dei nomi che non entrano in conflitto con nessuna delle
+variabili usate da un'altra funzione di libreria o dal programma principale di
+un utente.  Per esempio, un nome come @code{i} o @code{j} non @`e una buona
+scelta, perch@'e i programmi a livello utente usano spesso nomi di variabile come
+questi per le proprie elaborazioni.
+
+@cindex convenzioni di programmazione, nomi di variabili private
+@cindex programmazione, convenzioni di, nomi di variabili private
+I programmi di esempio mostrati in questo @value{CHAPTER} usano per le
+loro variabili private nomi che iniziano con un trattino basso(@samp{_}).
+Generalmente gli utenti
+non usano trattini bassi iniziali nei nomi di variabile, cos@`{@dotless{i}} questa convenzione
+riduce le possibilit@`a che il nome di variabile coincida con un nome usato
+nel programma dell'utente.
+
+@cindex @code{_} (trattino basso), nei nomi di variabili private
+@cindex trattino basso (@code{_}), nei nomi di variabili private
+Inoltre, parecchie funzioni di libreria usano un prefisso che suggerisce
+quale funzione o gruppo di funzioni usa quelle variabili; per esempio,
+@code{_pw_byname()} nelle routine che consultano la lista degli utenti
+(@pxref{Funzioni Passwd}).
+L'uso di questa convenzione viene raccomandata, poich@'e riduce ulteriormente la
+possibilit@`a di conflitti accidentali tra nomi di variabile.  Si noti che questa
+convenzione pu@`o anche essere usata per i nomi di variabile e per i nomi delle
+funzioni private.@footnote{Sebbene tutte le routine di libreria si sarebbero
+potute riscrivere usando questa convenzione, ci@`o non @`e stato fatto, per far
+vedere come lo stile di programmazione in @command{awk} si @`e evoluto e
+per fornire alcuni spunti per questa spiegazione.}
+
+Come nota finale sui nomi delle variabili, se una funzione rende
+disponibile una variabile globale per essere usata da un programma principale,
+@`e una buona convenzione quella di far iniziare i nomi di queste variabili con
+una lettera maiuscola; per esempio, @code{Opterr} e @code{Optind} di
+@code{getopt()}
+(@pxref{Funzione getopt}).
+La lettera maiuscola iniziale indica che la variabile @`e globale,
+mentre il fatto che
+il nome della variabile non @`e tutto in lettere maiuscole indica che la variabile
+non @`e una delle variabili predefinite di @command{awk}, come @code{FS}.
+
+@cindex @option{--dump-variables}, opzione, uso per funzioni di libreria
+@cindex opzione @option{--dump-variables}, uso per funzioni di libreria
+@`E importante anche che @emph{tutte} le variabili nelle funzioni di libreria
+che non abbiano la necessit@`a di essere
+conservate per tutta la durata del
+programma siano, di fatto, dichiarate
+come locali.@footnote{L'opzione da riga di comando di @command{gawk}
+@option{--dump-variables} @`e utile per verificare questo.} Se ci@`o non viene
+fatto, la variabile potrebbe essere usata accidentalmente nel programma
+dell'utente, conducendo a errori che sono molto difficili da scoprire:
+
+@example
+function lib_func(x, y,    l1, l2)
+@{
+    @dots{}
+    # qualche_var dovrebbe essere locale ma per una svista non lo @`e
+    @var{uso della variabile} qualche_var
+    @dots{}
+@}
+@end example
+
+@cindex vettori associativi, funzioni di libreria e
+@cindex libreria di funzioni @command{awk}, vettori associativi e
+@cindex funzioni, libreria di, vettori associativi e
+@cindex Tcl
+Una differente convenzione, comune nella comunit@`a Tcl, @`e quella di usare un
+solo vettore associativo che contiene i valori necessari alle funzioni di
+libreria, o ``package.''  Questo riduce significativamente il numero degli
+effettivi nomi globali in uso.  Per esempio, le funzioni descritte in
+@ref{Funzioni Passwd}
+potrebbero aver usato gli elementi di vettore
+@code{@w{PW_data["inizializzato"]}},
+@code{@w{PW_data["totale"]}}, @code{@w{PW_data["contatore"]}}, e
+@code{@w{PW_data["awklib"]}}, al posto di @code{@w{_pw_inizializzato}},
+@code{@w{_pw_totale}},
+@code{@w{_pw_awklib}} e
+@code{@w{_pw_contatore}}.
+
+Le convenzioni illustrate in questa @value{SECTION} sono esattamente
+quello che indica il termine: convenzioni. Non si @`e obbligati a scrivere
+i propri programmi in questo modo: @`e solo auspicabile che lo si faccia.
+
+A partire dalla @value{PVERSION} 5.0, @command{gawk} fornisce
+un meccanismo efficiente per risolvere i problemi descritti in
+questa sezione: gli spazi-dei-nomi (@dfn{spazi-dei-nomi}).
+Gli spazi-dei-nomi e il loro utilizzo sono descritti in dettaglio
+in @ref{Spazi-dei-nomi}.
+
+@node Funzioni di tipo generale
+@section Programmazione di tipo generale
+
+Questa @value{SECTION} illustra diverse funzioni che sono di uso generale nella
+programmazione.
+
+@menu
+* Funzione strtonum::           Da usare se non @`e disponibile la funzione
+                                predefinita @code{strtonum()}.
+* Funzione assert::             Una funzione per controllare affermazioni
+                                in programmi @command{awk}.
+* Funzione round::              Una funzione per eseguire arrotondamenti
+                                se @code{sprintf()} non lo fa correttamente.
+* Funzione random Cliff::       Il generatore Cliff di numeri casuali.
+* Funzioni ordinali::           Funzioni per usare caratteri come numeri
+                                e viceversa.
+* Funzione join::               Una funzione per fondere un vettore
+                                in una stringa.
+* Funzione getlocaltime::       Una funzione per ottenere data e ora nel
+                                formato desiderato.
+* Funzione readfile::           Una funzione per leggere un file intero in
+                                un colpo solo.
+* Apici alla shell::            Una funzione per passare stringhe
+                                con apici alla shell.
+@end menu
+
+@node Funzione strtonum
+@subsection Conversione di stringhe in numeri
+
+La funzione @code{strtonum()} (@pxref{Funzioni per stringhe})
+@`e un'estensione @command{gawk}.  La seguente funzione
+fornisce un'implementazione per altre versioni di @command{awk}:
+
+@example
+@c file eg/lib/strtonum.awk
+# mystrtonum --- converte stringhe in numeri
+
+@c endfile
+@ignore
+@c file eg/lib/strtonum.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# February, 2004
+# Revised June, 2014
+
+@c endfile
+@end ignore
+@c file eg/lib/strtonum.awk
+function mystrtonum(str,        ret, n, i, k, c)
+@{
+    if (str ~ /^0[0-7]*$/) @{
+        # ottale
+        n = length(str)
+        ret = 0
+        for (i = 1; i <= n; i++) @{
+            c = substr(str, i, 1)
+            # index() restituisce 0 se c non @`e nella stringa,
+            # e anche se c == "0"
+            k = index("1234567", c)
+
+            ret = ret * 8 + k
+        @}
+    @} else if (str ~ /^0[xX][[:xdigit:]]+$/) @{
+        # esadecimale
+        str = substr(str, 3)    # via 0x iniziale
+        n = length(str)
+        ret = 0
+        for (i = 1; i <= n; i++) @{
+            c = substr(str, i, 1)
+            c = tolower(c)
+            # index() restituisce 0 se c non @`e nella stringa,
+            # e anche se c == "0"
+            k = index("123456789abcdef", c)
+
+            ret = ret * 16 + k
+        @}
+    @} else if (str ~ \
+  /^[-+]?([0-9]+([.][0-9]*([Ee][0-9]+)?)?|([.][0-9]+([Ee][-+]?[0-9]+)?))$/) @{
+        # numero decimale, eventualmente in virgola mobile
+        ret = str + 0
+    @} else
+        ret = "NON-UN-NUMERO"
+
+    return ret
+@}
+
+# BEGIN @{     # dati per un test
+#     a[1] = "25"
+#     a[2] = ".31"
+#     a[3] = "0123"
+#     a[4] = "0xdeadBEEF"
+#     a[5] = "123.45"
+#     a[6] = "1.e3"
+#     a[7] = "1.32"
+#     a[8] = "1.32E2"
+#
+#     for (i = 1; i in a; i++)
+#         print a[i], strtonum(a[i]), mystrtonum(a[i])
+# @}
+@c endfile
+@end example
+
+La funzione cerca dapprima numeri ottali in stile C (base 8).
+Se la stringa in input corrisponde all'espressione regolare che descrive i
+numeri ottali, @code{mystrtonum()} esegue il ciclo per ogni carattere presente
+nella stringa.  Imposta @code{k} all'indice in @code{"1234567"} della cifra
+ottale corrente.
+Il codice di ritorno sar@`a lo stesso numero della cifra, o zero
+se il carattere non c'@`e, il che succeder@`a per ogni cifra @samp{0}.
+Questo si pu@`o fare, perch@'e il test di @dfn{regexp} nell'istruzione @code{if}
+assicura che vengano scelti per
+essere convertiti solo dei numeri ottali.
+
+Una logica simile si applica al codice che ricerca e converte un
+valore esadecimale, che inizia con @samp{0x} o @samp{0X}.
+L'uso di @code{tolower()} semplifica il calcolo per trovare
+il valore numerico corretto per ogni cifra esadecimale.
+
+Infine, se la stringa corrisponde alla (piuttosto complicata) @dfn{regexp} per
+un intero decimale regolare o per un numero in virgola mobile, il calcolo
+@samp{ret = str + 0} fa s@`{@dotless{i}} che @command{awk} converta il valore in un
+numero.
+
+@`E incluso un programma di verifica commentato, in modo che la funzione possa
+essere verificata con @command{gawk} e il risultato confrontato con la funzione
+predefinita @code{strtonum()}.
+
+@node Funzione assert
+@subsection Asserzioni
+
+@cindex asserzioni
+@cindex @code{assert()}, funzione (libreria C)
+@cindex funzione @code{assert()} (libreria C)
+@cindex libreria di funzioni @command{awk}, asserzioni
+@cindex funzioni, libreria di, asserzioni
+@cindex @command{awk}, asserzioni in programmi lunghi
+Quando si scrivono grossi programmi, spesso @`e utile sapere se
+una condizione o una serie di condizioni @`e verificata oppure no.
+Prima di procedere
+con un determinato calcolo, si fa un'affermazione su cosa si crede sia
+vero.  Tale affermazione @`e nota come
+@dfn{asserzione}.  Il linguaggio C fornisce un file di intestazione
+@code{<assert.h>} e una corrispondente macro @code{assert()} che un
+programmatore pu@`o utilizzare per fare asserzioni.
+Se l'asserzione risulta falsa, la macro @code{assert()} predispone la
+stampa di un messaggio diagnostico che descrive la condizione che
+sarebbe dovuta essere vera ma che non lo era, e poi fa terminare
+il programma.
+In C, l'uso di @code{assert()} @`e simile a questo:
+
+@example
+@group
+#include <assert.h>
+
+int myfunc(int a, double b)
+@{
+     assert(a <= 5 && b >= 17.1);
+     @dots{}
+@}
+@end group
+@end example
+
+Se l'asserzione @`e falsa, il programma stampa un messaggio simile a questo:
+
+@example
+prog.c:5: asserzione falsa: `a <= 5 && b >= 17.1'
+@end example
+
+@cindex @code{assert()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{assert()}
+Il linguaggio C rende possibile trasformare questa condizione in una stringa
+da
+usare per stampare il messaggio di diagnosi.  Ci@`o in @command{awk} non @`e
+possibile, per cui la funzione @code{assert()} scritta in @command{awk}
+richiede anche una descrizione
+della condizione da verificare, in formato stringa.
+La funzione @`e la seguente:
+
+@example
+@c file eg/lib/assert.awk
+# assert --- Verifica una condizione. Se questa @`e falsa esce.
+
+@c endfile
+@ignore
+@c file eg/lib/assert.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May, 1993
+
+@c endfile
+@end ignore
+@c file eg/lib/assert.awk
+function assert(condizione, stringa)
+@{
+    if (! condizione) @{
+        printf("%s:%d: asserzione falsa: %s\n",
+            FILENAME, FNR, stringa) > "/dev/stderr"
+        _assert_exit = 1
+        exit 1
+    @}
+@}
+
+@group
+END @{
+    if (_assert_exit)
+        exit 1
+@}
+@end group
+@c endfile
+@end example
+
+La funzione @code{assert()} verifica il parametro @code{condizione}. Se
+@`e falso, stampa un messaggio sullo standard error, usando il parametro
+@code{stringa} per descrivere la condizione non verificata.  Poi imposta la
+variabile @code{_assert_exit} a uno ed esegue l'istruzione @code{exit}.
+L'istruzione @code{exit} salta alla regola @code{END}. Se la regola  @code{END}
+trova vera la variabile @code{_assert_exit}, esce immediatamente.
+
+Lo scopo della verifica nella regola @code{END} @`e quello di evitare che venga
+eseguita qualsiasi altra eventuale regola @code{END}.
+Quando un'asserzione non @`e
+verificata, il programma dovrebbe uscire immediatamente.
+Se nessuna asserzione
+fallisce, @code{_assert_exit} @`e ancora falso quando la regola @code{END} @`e
+eseguita normalmente, e le eventuali altre regole @code{END} del programma
+vengono eseguite.
+Affinch@'e tutto questo funzioni correttamente, @file{assert.awk} dev'essere il
+primo file sorgente che viene letto da @command{awk}.
+La funzione pu@`o essere usata in un programma nel seguente modo:
+
+@example
+function miafunz(a, b)
+@{
+     assert(a <= 5 && b >= 17.1, "a <= 5 && b >= 17.1")
+     @dots{}
+@}
+@end example
+
+@noindent
+Se l'asserzione non @`e verificata, si vedr@`a un messaggio simile a questo:
+
+@example
+mydata:1357: asserzione falsa: a <= 5 && b >= 17.1
+@end example
+
+@cindex @code{END}, criterio di ricerca, funzione definita dall'utente @code{assert()} e
+@cindex criterio di ricerca @code{END}, funzione definita dall'utente @code{assert()} e
+C'@`e un piccolo problema con questa versione di @code{assert()}.
+Come visto, una regola @code{END} viene automaticamente aggiunta al programma
+che chiama @code{assert()}.  Normalmente, se un programma consiste
+solo di una regola @code{BEGIN}, i file in input e/o lo standard input non
+vengono letti. Tuttavia, ora che il programma ha una regola @code{END},
+@command{awk} tenta di leggere i @value{DF} in input o lo standard input
+(@pxref{Usare BEGIN/END}), provocando  molto probabilmente la sospensione del
+programma come se rimanesse in attesa di input.
+
+@cindex @code{BEGIN}, criterio di ricerca, funzione definita dall'utente @code{assert()} e
+@cindex criterio di ricerca @code{BEGIN}, funzione definita dall'utente @code{assert()} e
+C'@`e un modo per aggirare questo problema:
+assicurarsi che la regola @code{BEGIN} termini sempre
+con un'istruzione @code{exit}.
+
+@node Funzione round
+@subsection Arrotondamento di numeri
+
+@cindex arrotondare numeri
+@cindex numeri, arrotondamento di
+@cindex libreria di funzioni @command{awk}, arrotondamento di numeri
+@cindex funzioni, libreria di, arrotondamento di numeri
+@cindex @code{print}, istruzione, funzione @code{sprintf()} e
+@cindex istruzione @code{print}, funzione @code{sprintf()} e
+@cindex @code{printf}, istruzione, funzione @code{sprintf()} e
+@cindex istruzione @code{printf}, funzione @code{sprintf()} e
+@cindex @code{sprintf()}, funzione, istruzioni @code{print}/@code{printf} e
+@cindex funzione @code{sprintf()}, istruzioni @code{print}/@code{printf} e
+Il modo in cui @code{printf} e @code{sprintf()}
+(@pxref{Printf})
+effettuano l'arrotondamento spesso dipende dalla subroutine C @code{sprintf()}
+del sistema.  Su molte macchine, l'arrotondamento di @code{sprintf()} @`e
+@dfn{statistico}, il che significa che non sempre arrotonda un .5 finale per
+eccesso, contrariamente alle normali aspettative. Nell'arrotondamento
+statistico, .5 arrotonda alla cifra pari, anzich@'e sempre per eccesso, cos@`{@dotless{i}}
+1.5 arrotonda a 2 e 4.5 arrotonda a 4.  Ci@`o significa che se si sta usando un
+formato che fa arrotondamenti (p.es. @code{"%.0f"}), si dovrebbe controllare
+quello che fa il sistema che si sta usando.  La seguente funzione esegue un
+arrotondamento tradizionale; potrebbe essere utile nel caso in cui
+l'istruzione @code{printf}
+di @command{awk} che si sta usando faccia degli arrotondamenti statistici:
+
+@cindex @code{round()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{round()}
+@example
+@c file eg/lib/round.awk
+# round.awk --- effettua arrotondamento tradizionale
+@c endfile
+@ignore
+@c file eg/lib/round.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# August, 1996
+@c endfile
+@end ignore
+@c file eg/lib/round.awk
+
+function round(x,   ival, aval, frazione)
+@{
+   ival = int(x)    # parte intera, int() fa un troncamento
+
+   # vedere se c'@`e la parte frazionale
+   if (ival == x)   # nessuna parte frazionale
+      return ival   # nessun decimale
+
+   if (x < 0) @{
+      aval = -x     # valore assoluto
+      ival = int(aval)
+      frazione = aval - ival
+      if (frazione >= .5)
+         return int(x) - 1   # -2.5 --> -3
+      else
+         return int(x)       # -2.3 --> -2
+   @} else @{
+      frazione = x - ival
+      if (frazione >= .5)
+         return ival + 1
+      else
+         return ival
+   @}
+@}
+@c endfile
+@c don't include test harness in the file that gets installed
+@group
+# codice per testare, commentato
+# @{ print $0, round($0) @}
+@end group
+@end example
+
+@node Funzione random Cliff
+@subsection Il generatore di numeri casuali Cliff
+@cindex numeri casuali, generatore Cliff
+@cindex Cliff, generatore di numeri casuali
+@cindex casuali, numeri, generatore Cliff di
+@cindex funzioni, libreria di, numeri casuali Cliff
+
+Il
+@uref{http://mathworld.wolfram.com/CliffRandomNumberGenerator.html, generatore di numeri casuali Cliff}
+@`e un generatore di numeri casuali molto semplice che ``passa il test della sfera
+del rumore per la casualit@`a non mostrando di avere alcuna struttura.''
+@`E programmato in modo molto semplice, in meno di 10 righe di codice
+@command{awk}:
+
+@cindex @code{cliff_rand()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{cliff_rand()}
+@example
+@c file eg/lib/cliff_rand.awk
+# cliff_rand.awk --- generare numeri casuali con algoritmo di Cliff
+@c endfile
+@ignore
+@c file eg/lib/cliff_rand.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# December 2000
+@c endfile
+@end ignore
+@c file eg/lib/cliff_rand.awk
+
+BEGIN @{ _cliff_seme = 0.1 @}
+
+function cliff_rand()
+@{
+    _cliff_seme = (100 * log(_cliff_seme)) % 1
+    if (_cliff_seme < 0)
+        _cliff_seme = - _cliff_seme
+    return _cliff_seme
+@}
+@c endfile
+@end example
+
+Questo algoritmo richiede un ``seme'' iniziale di 0,1.  Ogni nuovo valore
+usa il seme corrente come input per il calcolo.
+Se la funzione predefinita @code{rand()}
+(@pxref{Funzioni numeriche})
+non @`e abbastanza casuale, si pu@`o tentare di usare al suo posto questa funzione.
+
+@node Funzioni ordinali
+@subsection Tradurre tra caratteri e numeri
+
+@cindex libreria di funzioni @command{awk}, valori di carattere come numeri
+@cindex funzioni, libreria di, valori di carattere come numeri
+@cindex carattere, valore come numero
+@cindex numeri, come valori di carattere
+Un'implementazione commerciale di @command{awk} fornisce una funzione
+predefinita @code{ord()}, che prende un carattere e restituisce il valore
+numerico per quel carattere nella rappresentazione dei caratteri
+di quella particolare macchina.  Se la
+stringa passata a @code{ord()} ha pi@`u di un carattere, viene usato solo il
+primo.
+
+L'inverso di questa funzione @`e @code{chr()} (dalla funzione con lo stesso nome
+in Pascal), che, dato un numero, restituisce il corrispondente carattere.
+Entrambe le funzioni si possono scrivere molto bene usando @command{awk};
+non vi @`e nessun reale motivo per inglobarle come funzioni predefinite
+@command{awk}:
+
+@cindex @code{ord()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{ord()}
+@cindex @code{chr()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{chr()}
+@cindex @code{_ord_init()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{_ord_init()}
+@example
+@c file eg/lib/ord.awk
+# ord.awk --- implementa ord e chr
+
+# Identificativi globali:
+#    _ord_:        valori numerici indicizzati da caratteri
+#    _ord_init:    funzione per inizializzare _ord_
+@c endfile
+@ignore
+@c file eg/lib/ord.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# 16 January, 1992
+# 20 July, 1992, revised
+@c endfile
+@end ignore
+@c file eg/lib/ord.awk
+
+BEGIN    @{ _ord_init() @}
+
+function _ord_init(    basso, alto, i, t)
+@{
+    basso = sprintf("%c", 7) # BEL @`e ascii 7
+    if (basso == "\a") @{     # ascii regolare
+        basso = 0
+        alto = 127
+    @} else if (sprintf("%c", 128 + 7) == "\a") @{
+        # ascii, con il primo bit a 1 (mark)
+        basso = 128
+        alto = 255
+    @} else @{        # ebcdic(!)
+        basso = 0
+        alto = 255
+    @}
+
+    for (i = basso; i <= alto; i++) @{
+        t = sprintf("%c", i)
+        _ord_[t] = i
+    @}
+@}
+@c endfile
+@end example
+
+@cindex serie di caratteri (codifiche dei caratteri da parte della macchina)
+@cindex ASCII
+@cindex EBCDIC
+@cindex Unicode
+@cindex bit di parit@`a (in ASCII)
+@cindex @dfn{mark}, bit di parit@`a (in ASCII)
+Alcune spiegazioni riguardo ai numeri usati da @code{_ord_init()}
+non guastano.
+La serie di caratteri pi@`u importante oggi in uso @`e nota come
+ASCII.@footnote{La situazione sta per@`o
+cambiando: molti sistemi usano Unicode, una serie di caratteri molto ampia
+che comprende ASCII al suo interno.
+Nei sistemi che supportano interamente Unicode,
+un carattere pu@`o occupare fino a 32 bit, facendo diventare
+i semplici test usati qui eccessivamente complessi.}
+Sebbene un byte a
+8 bit possa contenere 256 valori distinti (da 0 a 255), ASCII definisce solo i
+caratteri che usano i valori da 0 a 127.@footnote{ASCII
+@`e stato esteso in molti paesi per usare i valori da 128 a 255 includendo
+i caratteri specifici del paese.  Se il sistema in uso si avvale di queste
+estensioni, si pu@`o semplificare @code{_ord_init()} per eseguire un ciclo da
+0 a 255.}  Nel lontano passato,
+almeno un produttore di microcomputer
+@c Pr1me, blech
+ha usato ASCII, ma con una parit@`a di tipo @dfn{mark}, cio@`e con il bit pi@`u a
+sinistra sempre a 1.  Questo significa che su questi sistemi i caratteri
+ASCII hanno valori numerici da 128 a 255.
+Infine, i grandi elaboratori centrali usano la serie di caratteri EBCDIC, che
+prevede tutti i 256 valori.
+Ci sono altre serie di caratteri in uso su alcuni sistemi pi@`u vecchi, ma non
+vale la pena di considerarli:
+
+@example
+@c file eg/lib/ord.awk
+function ord(str,    c)
+@{
+    # solo il primo carattere @`e d'interesse
+    c = substr(str, 1, 1)
+    return _ord_[c]
+@}
+
+function chr(c)
+@{
+    # trasforma c in un numero aggiungendo uno 0
+    return sprintf("%c", c + 0)
+@}
+@c endfile
+
+#### programma di verifica ####
+# BEGIN @{
+#    for (;;) @{
+#        printf("immetti un carattere: ")
+#        if (getline var <= 0)
+#            break
+#        printf("ord(%s) = %d\n", var, ord(var))
+#    @}
+# @}
+@c endfile
+@end example
+
+Un ovvio miglioramento a queste funzioni @`e quello di spostare il codice per la
+funzione @code{@w{_ord_init}} nel corpo della regola @code{BEGIN}.
+Il programma @`e
+stato scritto inizialmente in questo modo per comodit@`a di sviluppo.
+C'@`e un ``programma di verifica'' in una regola @code{BEGIN}, per verificare
+la funzione.  @`E commentato, per poter essere eventualmente usato in produzione.
+
+@node Funzione join
+@subsection Trasformare un vettore in una sola stringa
+
+@cindex libreria di funzioni @command{awk}, trasformare vettori in stringhe
+@cindex funzioni, libreria di, trasformare vettori in stringhe
+@cindex stringhe, trasformare vettori in
+@cindex vettori, trasformare in stringhe
+Quando si fanno elaborazioni su stringhe, spesso @`e utile poter unire
+tutte le stringhe di un vettore in una lunga stringa.  La funzione seguente,
+@code{join()}, svolge questo compito.  Verr@`a utilizzata nel seguito in diversi
+programmi applicativi
+@iftex
+(@pxrefil{Programmi di esempio}).
+@end iftex
+@ifnottex
+(@pxref{Programmi di esempio}).
+@end ifnottex
+
+La buona progettazione di una funzione @`e importante; la funzione dev'essere
+generale, ma potrebbe anche avere un ragionevole comportamento di default.
+Viene chiamata con un vettore e anche con gli indici iniziale e finale degli
+elementi del vettore da riunire.
+Questo presuppone che gli indici del vettore
+siano numerici---una supposizione logica, dato che il vettore probabilmente @`e
+stato creato con @code{split()}
+(@pxref{Funzioni per stringhe}):
+
+@cindex @code{join()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{join()}
+@example
+@c file eg/lib/join.awk
+# join.awk --- trasforma un vettore in una stringa
+@c endfile
+@ignore
+@c file eg/lib/join.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/lib/join.awk
+
+function join(vettore, iniz, fine, separ,    risultato, i)
+@{
+    if (separ == "")
+       separ = " "
+    else if (separ == SUBSEP) # valore magico
+       separ = ""
+    risultato = vettore[iniz]
+    for (i = iniz + 1; i <= fine; i++)
+        risultato = risultato separ vettore[i]
+    return risultato
+@}
+@c endfile
+@end example
+
+Un ulteriore argomento opzionale @`e il separatore da usare quando si uniscono
+nuovamente le stringhe.  Se il chiamante fornisce un valore non nullo,
+@code{join()} usa quello; se non viene fornito,
+per default ha un valore nullo.
+In questo caso, @code{join()} usa uno spazio singolo come separatore
+di default
+per le stringhe.  Se il valore @`e uguale a @code{SUBSEP},
+@code{join()} unisce le stringhe senza un separatore tra di esse.
+@code{SUBSEP} serve come valore ``magico'' per indicare che potrebbe non esserci
+un separatore tra le stringhe componenti.@footnote{Sarebbe bello
+se @command{awk} avesse un operatore di assegnamento per la concatenazione.
+La mancanza di un esplicito operatore per la concatenazione rende le operazioni
+sulle stringhe pi@`u difficili di quanto potrebbero essere.}
+
+@node Funzione getlocaltime
+@subsection Gestione dell'ora del giorno
+
+@cindex libreria di funzioni @command{awk}, gestire ora del giorno (marcature temporali)
+@cindex funzioni, libreria di, gestione delle ore del giorno
+@cindex data e ora, formattate
+@cindex marcature temporali, formattate
+@cindex ora del giorno, gestire
+Le funzioni @code{systime()} e @code{strftime()} descritte nella
+@ref{Funzioni di tempo}
+forniscono la funzionalit@`a minima necessaria per visualizzare l'ora del giorno
+in una forma intelligibile.  Sebbene @code{strftime()} offra un'ampia gamma di
+formattazioni, i formati di controllo non sono facili da ricordare o
+intuitivamente ovvii quando si legge un programma.
+
+La seguente funzione, @code{getlocaltime()}, riempie un vettore fornito
+dall'utente con informazioni sul tempo preformattate.  Restituisce una stringa
+con data e ora corrente formattata come nel programma di utilit@`a @command{date}:
+
+@cindex @code{getlocaltime()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getlocaltime()}
+@example
+@c file eg/lib/gettime.awk
+# getlocaltime.awk --- ottiene l'ora del giorno in un formato usabile
+@c endfile
+@ignore
+@c file eg/lib/gettime.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain, May 1993
+#
+@c endfile
+@end ignore
+@c file eg/lib/gettime.awk
+
+# Restituisce una stringa nel formato dell'output di date(1)
+# Riempie l'argomento del vettore time con valori individuali:
+#    time["second"]       -- secondi (0 - 59)
+#    time["minute"]       -- minuti (0 - 59)
+#    time["hour"]         -- ore (0 - 23)
+#    time["althour"]      -- ore (0 - 12)
+#    time["monthday"]     -- giorno del mese (1 - 31)
+#    time["month"]        -- mese dell'anno (1 - 12)
+#    time["monthname"]    -- nome del mese
+#    time["shortmonth"]   -- nome breve del mese
+#    time["year"]         -- anno modulo 100 (0 - 99)
+#    time["fullyear"]     -- anno completo
+#    time["weekday"]      -- giorno della settimana (domenica = 0)
+#    time["altweekday"]   -- giorno della settimana (luned@`{@dotless{i}} = 0)
+#    time["dayname"]      -- nome del giorno della settimana
+#    time["shortdayname"] -- nome breve del giorno della settimana
+#    time["yearday"]      -- giorno dell'anno (0 - 365)
+#    time["timezone"]     -- abbreviazione del nome della zona di fuso orario
+#    time["ampm"]         -- designazione di AM o PM
+#    time["weeknum"]      -- numero della settimana, domenica primo giorno
+#    time["altweeknum"]   -- numero della settimana, luned@`{@dotless{i}} primmo giorno
+
+function getlocaltime(ora,    ret, adesso, i)
+@{
+    # ottiene data e ora una volta sola,
+    # evitando chiamate di sistema non necessarie
+    adesso = systime()
+
+    # restituisce l'output in stile date(1)
+@c  lun  8 giu 2015, 20.39.38, CEST
+@c "%a  %e %b  %Y  , %H.%M.%S, %Z"
+    ret = strftime("%a %e %b %Y, %H.%M.%S, %Z", adesso)
+
+    # clear out target array
+    delete time
+
+    # immette i valori, forzando i valori numerici
+    # a essere numerici aggiungendo uno 0
+    time["second"]       = strftime("%S", adesso) + 0
+    time["minute"]       = strftime("%M", adesso) + 0
+    time["hour"]         = strftime("%H", adesso) + 0
+    time["althour"]      = strftime("%I", adesso) + 0
+    time["monthday"]     = strftime("%d", adesso) + 0
+    time["month"]        = strftime("%m", adesso) + 0
+    time["monthname"]    = strftime("%B", adesso)
+    time["shortmonth"]   = strftime("%b", adesso)
+    time["year"]         = strftime("%y", adesso) + 0
+    time["fullyear"]     = strftime("%Y", adesso) + 0
+    time["weekday"]      = strftime("%w", adesso) + 0
+    time["altweekday"]   = strftime("%u", adesso) + 0
+    time["dayname"]      = strftime("%A", adesso)
+    time["shortdayname"] = strftime("%a", adesso)
+    time["yearday"]      = strftime("%j", adesso) + 0
+    time["timezone"]     = strftime("%Z", adesso)
+    time["ampm"]         = strftime("%p", adesso)
+    time["weeknum"]      = strftime("%U", adesso) + 0
+    time["altweeknum"]   = strftime("%W", adesso) + 0
+
+    return ret
+@}
+@c endfile
+@end example
+
+Gli indici di stringa sono pi@`u facili da usare e leggere rispetto ai
+vari formati
+richiesti da @code{strftime()}.  Il programma @code{alarm} illustrato in
+@ref{Programma alarm}
+usa questa funzione.
+Una progettazione pi@`u generica della funzione @code{getlocaltime()}
+avrebbe permesso all'utente di fornire un valore di data e ora
+opzionale da usare al posto della data/ora corrente.
+
+@node Funzione readfile
+@subsection Leggere un intero file in una sola volta
+
+Spesso @`e conveniente avere il contenuto di un intero file disponibile
+in memoria, visto
+come un'unica stringa. Un modo chiaro e semplice per far ci@`o potrebbe essere
+questo:
+
+@example
+function readfile1(file,    temp, contenuto)
+@{
+    if ((getline temp < file) < 0)
+        return
+
+    contenuto = temp RT
+    while ((getline temp < file) > 0)
+        contenuto = contenuto temp RT
+
+    close(file)
+    return contenuto
+@}
+@end example
+
+Questa funzione legge da @code{file} un record alla volta, ricostruendo
+l'intero contenuto del file nella variabile locale @code{contenuto}.
+Funziona, ma non @`e detto che sia efficiente.
+
+La funzione seguente, basata su un suggerimento di Denis Shirokov,
+legge l'intero contenuto del file in un colpo solo:
+
+@cindex @code{readfile()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{readfile()}
+@example
+@c file eg/lib/readfile.awk
+# readfile.awk --- legge un intero file in un colpo solo
+@c endfile
+@ignore
+@c file eg/lib/readfile.awk
+#
+# Idea originale di Denis Shirokov, cosmogen@@gmail.com, aprile 2013
+#
+@c endfile
+@end ignore
+@c file eg/lib/readfile.awk
+
+function readfile(file,     temp, salva_rs)
+@{
+    salva_rs = RS
+    RS = "^$"
+    getline temp < file
+    close(file)
+    RS = salva_rs
+
+    return temp
+@}
+@c endfile
+@end example
+
+Funziona impostando @code{RS} a @samp{^$}, un'espressione regolare che
+non trova nessuna corrispondenza se il file ha un contenuto.
+@command{gawk}
+legge i dati dal file contenuto in @code{temp}, tentando di trovare una
+corrispondenza con @code{RS}.
+La ricerca dopo ogni lettura non ha mai successo, ma termina
+rapidamente, e quindi @command{gawk} inserisce in
+@code{temp} l'intero contenuto del file.
+(@xref{Record} per informazioni su @code{RT} e @code{RS}.)
+
+Se @code{file} @`e vuoto, il codice di ritorno @`e la stringa vuota.
+Quindi, il codice chiamante pu@`o usare qualcosa simile a questo:
+
+@example
+contenuto = readfile("/qualche/percorso")
+if (length(contenuto) == 0)
+    # file vuoto @dots{}
+@end example
+
+La verifica serve a determinare se il file @`e vuoto o no. Una verifica
+equivalente potrebbe essere @samp{@w{contenuto == ""}}.
+
+@xref{Esempio di estensione Readfile} per una funzione di estensione
+anch'essa finalizzata a leggere un intero file in memoria.
+
+@node Apici alla shell
+@subsection Stringhe con apici da passare alla shell
+
+@c included by permission
+@ignore
+Date: Sun, 27 Jul 2014 17:16:16 -0700
+Message-ID: <CAKuGj+iCF_obaCLDUX60aSAgbfocFVtguG39GyeoNxTFby5sqQ@mail.gmail.com>
+Subject: Useful awk function
+From: Mike Brennan <mike@madronabluff.com>
+To: Arnold Robbins <arnold@skeeve.com>
+@end ignore
+
+Michael Brennan propone il seguente modello di programma,
+da lui usato spesso:
+
+@example
+#! /bin/sh
+
+awkp='
+   @dots{}
+   '
+
+@var{specifica_programma_da_eseguire} | awk "$awkp" | /bin/sh
+@end example
+
+Per esempio, un suo programma chiamato @command{flac-edit}@footnote{I
+file con suffisso @dfn{flac} contengono normalmente dei brani musicali.
+@command{metaflac} @`e un programma che permette di modificare
+le informazioni [@dfn{metadati}] contenute all'inizio di un file di tipo
+@dfn{flac}.} ha questa forma:
+
+@example
+$ @kbd{flac-edit -song="Whoope! That's Great" file.flac}
+@end example
+
+@command{flac-edit} genera in output il seguente @dfn{script}, da passare alla
+shell (@file{/bin/sh}) per essere eseguito:
+
+@example
+chmod +w file.flac
+metaflac --remove-tag=TITLE file.flac
+LANG=en_US.88591 metaflac --set-tag=TITLE='Whoope! That'"'"'s Great' file.flac
+chmod -w file.flac
+@end example
+
+Si noti la necessit@`a di gestire gli apici nello @dfn{script} da passare alla shell.
+La funzione
+@code{shell_quote()} li prepara nel formato richiesto.
+@code{SINGLE} @`e la stringa di un solo
+carattere @code{"'"} e @code{QSINGLE} @`e la stringa di tre caratteri
+@code{"\"'\""}:
+
+@example
+@c file eg/lib/shellquote.awk
+# shell_quote --- pone tra apici un argomento da passare alla shell
+@c endfile
+@ignore
+@c file eg/lib/shellquote.awk
+#
+# Michael Brennan
+# brennan@@madronabluff.com
+# September 2014
+@c endfile
+@end ignore
+@c file eg/lib/shellquote.awk
+
+function shell_quote(s,             # parametro
+    SINGLE, QSINGLE, i, X, n, ret)  # variabili locali
+@{
+    if (s == "")
+        return "\"\""
+
+    SINGLE = "\x27"       # apice singolo
+    QSINGLE = "\"\x27\""  # apice singolo incapsulato
+    n = split(s, X, SINGLE)
+
+    ret = SINGLE X[1] SINGLE
+    for (i = 2; i <= n; i++)
+        ret = ret QSINGLE SINGLE X[i] SINGLE
+
+    return ret
+@}
+@c endfile
+@end example
+
+@node Gestione File Dati
+@section Gestione di @value{DF}
+
+@cindex file, gestione di
+@cindex gestione di file
+@cindex libreria di funzioni @command{awk}, gestire file di dati
+@cindex funzioni, libreria di, gestire file di dati
+Questa @value{SECTION} presenta funzioni utili per gestire
+@value{DF} da riga di comando.
+
+@menu
+* Funzione filetrans::          Una funzione per gestire il passaggio da un
+                                file in input al successivo.
+* Funzione rewind::             Una funzione per rileggere il file in input.
+* Controllo di file::           Controllare che i file in input siano
+                                accessibili.
+* File vuoti::                  Controllare se i file in input sono vuoti.
+* Ignorare assegnamenti di variabili:: Trattare assegnamenti di variabili.
+                                     come nomi di file.
+@end menu
+
+@node Funzione filetrans
+@subsection Trovare i limiti dei @value{DF}
+
+@cindex file, gestione di, limiti dei file-dati
+@cindex file, inizializzazione e pulizia
+Ognuna delle regole @code{BEGIN} ed @code{END} viene eseguita esattamente
+solo una volta, rispettivamente all'inizio e alla fine del programma
+@command{awk} (@pxref{BEGIN/END}).
+Una volta noi (gli autori di @command{gawk}) siamo venuti in contatto
+con un utente che
+erroneamemnte pensava che le regole @code{BEGIN} venissero eseguite all'inizio
+di ogni @value{DF} e le regole @code{END} alla fine di ogni @value{DF}.
+
+Quando lo abbiamo informato che
+non era cos@`{@dotless{i}}, ci ha chiesto di aggiungere un nuovo criterio di ricerca speciale
+a @command{gawk}, chiamato @code{BEGIN_FILE} e @code{END_FILE}, che avesse il
+comportamento desiderato.  Ci ha fornito anche il codice per far questo.
+
+Non @`e stato necessario aggiungere a @command{gawk} questi criteri di ricerca
+speciali; il lavoro si pu@`o fare tranquillamente usando @command{awk}, come
+illustrato nel seguente programma di libreria.  @`E strutturato in modo da
+chiamare due funzioni fornite dall'utente, @code{a_inizio_file()} e
+@code{a_fine_file()}, all'inizio e alla fine di ogni @value{DF}.  Oltre a risolvere
+il problema in sole nove(!) righe di codice,
+questa soluzione @`e @emph{portabile}; il
+programma funziona con qualsiasi implementazione di @command{awk}:
+
+@example
+# transfile.awk
+#
+# Dare all'utente un aggancio per il passaggio
+# da un file in input a quello successivo
+#
+# L'utente deve fornire le funzioni a_inizio_file() ed a_fine_file()
+# ciascuna delle quali @`e invocata
+# quando il file, rispettivamente,
+# inizia e finisce.
+@c #
+@c # Arnold Robbins, arnold@@skeeve.com, Public Domain
+@c # January 1992
+
+FILENAME != _nome_file_vecchio @{
+    if (_nome_file_vecchio != "")
+        a_fine_file(_nome_file_vecchio)
+    _nome_file_vecchio = FILENAME
+    a_inizio_file(FILENAME)
+@}
+
+END @{ a_fine_file(FILENAME) @}
+@end example
+
+Questo file [transfile.awk] dev'essere caricato prima del programma
+``principale'' dell'utente,
+in modo che la regola ivi contenuta venga eseguita per prima.
+
+Questa regola dipende dalla variabile di @command{awk} @code{FILENAME}, che
+cambia automaticamente per ogni nuovo @value{DF}.  Il @value{FN} corrente viene
+salvato in una variabile privata, @code{_nome_file_vecchio}.  Se @code{FILENAME} non @`e
+uguale a @code{_nome_file_vecchio}, inizia l'elaborazioone di un nuovo @value{DF} ed
+@`e necessario chiamare @code{a_fine_file()} per il vecchio file.  Poich@'e
+@code{a_fine_file()} dovrebbe essere chiamato solo se un file @`e stato elaborato, il
+programma esegue prima un controllo per assicurarsi che @code{_nome_file_vecchio} non
+sia la stringa nulla.  Il programma assegna poi il valore corrente di
+@value{FN} a @code{_nome_file_vecchio} e chiama @code{a_inizio_file()} per il file.
+Poich@'e, come tutte le variabili di @command{awk}, @code{_nome_file_vecchio} @`e
+inizializzato alla stringa nulla, questa regola viene eseguita correttamente
+anche per il primo @value{DF}.
+
+Il programma contiene anche una regola @code{END} per completare l'elaborazione
+per l'ultimo file.  Poich@'e questa regola @code{END} viene prima di qualsiasi
+regola @code{END} contenuta nel programma ``principale'',
+@code{a_fine_file()} viene
+chiamata per prima.  Ancora una volta, l'utilit@`a di poter avere pi@`u regole
+@code{BEGIN} ed @code{END} dovrebbe risultare chiara.
+
+@cindex @code{a_inizio_file()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{a_inizio_file()}
+@cindex @code{a_fine_file()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{a_fine_file()}
+Se lo stesso @value{DF} compare due volte di fila sulla riga di comando,
+@code{a_fine_file()} e @code{a_inizio_file()} non vengono eseguite alla fine del primo
+passaggio e all'inizio del secondo passaggio.
+La versione seguente risolve il problema:
+
+@example
+@c file eg/lib/ftrans.awk
+# ftrans.awk --- gestisce il passaggio da un file dati al successivo
+#
+# L'utente deve fornire le funzioni a_inizio_file() ed a_fine_file()
+@c endfile
+@ignore
+@c file eg/lib/ftrans.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# November 1992
+@c endfile
+@end ignore
+@c file eg/lib/ftrans.awk
+
+FNR == 1 @{
+    if (_filename_ != "")
+        a_fine_file(_filename_)
+    _filename_ = FILENAME
+    a_inizio_file(FILENAME)
+@}
+
+END @{ a_fine_file(_filename_) @}
+@c endfile
+@end example
+
+@iftex
+La
+@end iftex
+@ref{Programma wc}
+mostra come utilizzare questa funzione di libreria e come ci@`o
+semplifichi la scrittura del programma principale.
+
+@sidebar Allora perch@'e @command{gawk} ha @code{BEGINFILE} e @code{ENDFILE}?
+
+Ci si chieder@`a, probabilmente: perch@'e, se le funzioni @code{a_inizio_file()} e
+@code{a_fine_file()} possono eseguire il compito, @command{gawk} prevede i
+criteri di
+ricerca @code{BEGINFILE} e @code{ENDFILE}?
+
+Buona domanda.  Normalmente, se @command{awk} non riesce ad aprire un file,
+questo fatto
+provoca un errore fatale immediato.  In tal caso, per una funzione definita
+dall'utente non vi @`e alcun modo di affrontare il problema, giacch@'e la
+chiamata verrebbe effettuata
+solo dopo aver aperto il file e letto il primo record.
+Quindi, la ragione principale di @code{BEGINFILE} @`e quella di dare un
+``aggancio'' per gestire i file che non posso essere elaborati.
+@code{ENDFILE} esiste per simmetria, e perch@'e consente facilmente
+una pulizia "file per file".  Per maggiori informazioni si faccia
+riferimento alla @ref{BEGINFILE/ENDFILE}.
+@end sidebar
+
+@node Funzione rewind
+@subsection Rileggere il file corrente
+
+@cindex file, leggere un
+@cindex file, rileggere un
+Un'altra richiesta per una nuova funzione predefinita @`e stata per
+una funzione per rileggere il file corrente.
+L'utente che l'ha richiesta non voleva dover usare @code{getline}
+(@pxref{Getline})
+all'interno di un ciclo.
+
+Comunque, se non si @`e nella regola @code{END}, @`e piuttosto facile
+fare in modo di chiudere il corrente file in input immediatamente
+e ricominciare a leggerlo dall'inizio.
+In mancanza di un nome migliore, chiameremo la funzione @code{rewind()}:
+
+@cindex @code{rewind()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{rewind()}
+@example
+@c file eg/lib/rewind.awk
+# rewind.awk --- ricarica il file corrente e ricomincia a leggerlo
+@c endfile
+@ignore
+@c file eg/lib/rewind.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# September 2000
+@c endfile
+@end ignore
+@c file eg/lib/rewind.awk
+
+function rewind(    i)
+@{
+    # sposta in alto i rimanenti argomenti
+    for (i = ARGC; i > ARGIND; i--)
+        ARGV[i] = ARGV[i-1]
+
+    # assicurarsi che gawk sappia raggiungerli
+    ARGC++
+
+    # fa s@`{@dotless{i}} che il file corrente sia il prossimo a essere letto
+    ARGV[ARGIND+1] = FILENAME
+
+    # do it
+    nextfile
+@}
+@c endfile
+@end example
+
+La funzione @code{rewind()} dipende dalla variabile @code{ARGIND}
+(@pxref{Variabili auto-assegnate}), che @`e specifica di @command{gawk}.  Dipende anche
+dalla parola chiave @code{nextfile} (@pxref{Istruzione nextfile}).
+Perci@`o, non si dovrebbe chiamarla da una regola @code{ENDFILE}.
+(Non sarebbe peraltro necessario, perch@'e @command{gawk} legge il file
+successivo non appena la regola @code{ENDFILE} finisce!)
+
+Occorre prestare attenzione quando si chiama @code{rewind()}.  Si pu@`o
+provocare una ricorsione infinita se non si sta attenti.  Ecco un
+esempio di uso:
+
+@example
+$ @kbd{cat dati}
+@print{} a
+@print{} b
+@print{} c
+@print{} d
+@print{} e
+
+$ cat @kbd{test.awk}
+@print{} FNR == 3 && ! riavvolto @{
+@print{}    riavvolto = 1
+@print{}    rewind()
+@print{} @}
+@print{}
+@print{} @{ print FILENAME, FNR, $0 @}
+
+$ @kbd{gawk -f rewind.awk -f test.awk dati }
+@print{} data 1 a
+@print{} data 2 b
+@print{} data 1 a
+@print{} data 2 b
+@print{} data 3 c
+@group
+@print{} data 4 d
+@print{} data 5 e
+@end group
+@end example
+
+@node Controllo di file
+@subsection Controllare che i @value{DF} siano leggibili
+
+@cindex risoluzione di problemi, leggibilit@`a file-dati
+@cindex leggibilit@`a, file-dati@comma{} controllare la
+@cindex file, non elaborare
+Normalmente, se si fornisce ad @command{awk} un @value{DF} che non @`e leggibile,
+il programma
+si arresta con un errore fatale.  Ci sono casi in cui sarebbe preferibile
+ignorare semplicemente questi file e proseguire.@footnote{Il criterio di
+ricerca speciale @code{BEGINFILE} (@pxref{BEGINFILE/ENDFILE}) fornisce un
+meccanismo alternativo per trattare i file che non sono leggibili.
+Tuttavia, il codice qui proposto fornisce una soluzione portabile.}
+Si pu@`o far questo facendo precedere il proprio programma @command{awk} dal
+seguente programma:
+
+@cindex @code{readable.awk}, programma
+@example
+@c file eg/lib/readable.awk
+# readable.awk --- file di libreria per saltare file non leggibili
+@c endfile
+@ignore
+@c file eg/lib/readable.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# October 2000
+# December 2010
+@c endfile
+@end ignore
+@c file eg/lib/readable.awk
+
+BEGIN @{
+    for (i = 1; i < ARGC; i++) @{
+        if (ARGV[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/ \
+            || ARGV[i] == "-" || ARGV[i] == "/dev/stdin")
+            continue    # assegnamento di variabile o standard input
+        else if ((getline aperdere < ARGV[i]) < 0) # file non leggibile
+            delete ARGV[i]
+        else
+            close(ARGV[i])
+    @}
+@}
+@c endfile
+@end example
+
+@cindex risoluzione di problemi, funzione @code{getline}
+@cindex comando @code{getline}, risoluzione di problemi
+@cindex @code{getline}, comando, risoluzione di problemi
+Questo codice funziona, perch@'e l'errore di @code{getline} non @`e fatale.
+Rimuovendo l'elemento da @code{ARGV} con @code{delete}
+si tralascia il file (perch@'e non @`e pi@`u nella lista).
+Si veda anche @ref{ARGC e ARGV}.
+
+Poich@'e per i nomi delle variabili @command{awk} si possono usare solo lettere
+dell'alfabeto inglese, di proposito il controllo con espressioni regolari
+non usa classi di
+carattere come @samp{[:alpha:]} e @samp{[:alnum:]}
+(@pxref{Espressioni tra parentesi quadre}).
+
+@node File vuoti
+@subsection Ricerca di file di lunghezza zero
+
+Tutte le implementazioni note di @command{awk} ignorano senza
+mandare alcun messaggio i file di
+lunghezza zero.  Questo @`e un effetto collaterale del ciclo implicito di
+@command{awk} "leggi un record e confrontalo con le regole": quando
+@command{awk} cerca di leggere un record da un file vuoto, riceve immediatamente
+un'indicazione di fine-file [@dfn{end-of-file}], chiude il file,
+e prosegue con il
+successivo @value{DF} presente nella riga di comando, @emph{senza}
+eseguire alcun codice
+di programma @command{awk} a livello di utente.
+
+Usando la variabile @code{ARGIND} di @command{gawk}
+(@pxref{Variabili predefinite}), @`e possibile accorgersi quando un @value{DF}
+@`e stato saltato.  Simile al file di libreria illustrato in
+@ref{Funzione filetrans}, il seguente file di libreria chiama una funzione
+di nome @code{zerofile()} che l'utente deve fornire.  Gli argomenti passati
+sono il @value{FN} e la posizione del file in @code{ARGV}:
+
+@cindex @code{zerofile.awk}, programma
+@example
+@c file eg/lib/zerofile.awk
+# zerofile.awk --- file di libreria per elaborare file in input vuoti
+@c endfile
+@ignore
+@c file eg/lib/zerofile.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# June 2003
+@c endfile
+@end ignore
+@c file eg/lib/zerofile.awk
+
+BEGIN @{ Argind = 0 @}
+
+ARGIND > Argind + 1 @{
+    for (Argind++; Argind < ARGIND; Argind++)
+        zerofile(ARGV[Argind], Argind)
+@}
+
+ARGIND != Argind @{ Argind = ARGIND @}
+
+END @{
+    if (ARGIND > Argind)
+        for (Argind++; Argind <= ARGIND; Argind++)
+            zerofile(ARGV[Argind], Argind)
+@}
+@c endfile
+@end example
+
+La variabile definita dall'utente @code{Argind} permette al programma
+@command{awk}
+di tracciare il suo percorso all'interno di @code{ARGV}.  Ogniqualvolta il
+programma rileva che @code{ARGIND} @`e maggiore di @samp{Argind + 1}, vuol dire
+che uno o pi@`u file vuoti sono stati tralasciati.  L'azione chiama poi
+@code{zerofile()} per ogni file che @`e stato saltato, incrementando
+ogni volta @code{Argind}.
+
+La regola @samp{Argind != ARGIND} tiene semplicemente aggiornato @code{Argind}
+nel caso che non ci siano file vuoti.
+
+Infine, la regola @code{END} prende in considerazione il caso di un qualsiasi
+file vuoto alla fine degli argomenti nella riga di comando.  Si noti che nella
+condizione del ciclo @code{for}, la verifica  usa l'operatore @samp{<=}, non
+@samp{<}.
+
+@node Ignorare assegnamenti di variabili
+@subsection Trattare assegnamenti di variabile come @value{FNS}
+
+@cindex assegnamenti di variabile, visti come nomi di file
+@cindex file, nomi di, assegnamenti di variabile visti come
+@cindex nomi di file, assegnamenti di variabile visti come
+Occasionalmente, potrebbe essere pi@`u opportuno che @command{awk} non elabori gli
+assegnamenti di variabile presenti sulla riga di comando
+(@pxref{Opzioni di assegnamento}).
+In particolare, se si ha un @value{FN} che contiene un carattere @samp{=},
+@command{awk} tratta il @value{FN} come un assegnamento e non lo elabora.
+
+Alcuni utenti hanno suggerito un'opzione aggiuntiva da riga di comando per
+@command{gawk} per disabilitare gli assegnamenti dati sulla riga di comando.
+Comunque, poche righe di codice di programmazione in un file di libreria
+hanno lo stesso effetto:
+
+@cindex @code{noassign.awk}, programma
+@cindex programma @code{noassign.awk}
+@example
+@c file eg/lib/noassign.awk
+# noassign.awk --- file di libreria per evitare la necessit@`a
+# di una speciale opzione per disabilitare gli assegnamenti da
+# riga di comando
+@c endfile
+@ignore
+@c file eg/lib/noassign.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# October 1999
+@c endfile
+@end ignore
+@c file eg/lib/noassign.awk
+
+function disable_assigns(argc, argv,    i)
+@{
+    for (i = 1; i < argc; i++)
+        if (argv[i] ~ /^[a-zA-Z_][a-zA-Z0-9_]*=.*/)
+            argv[i] = ("./" argv[i])
+@}
+
+BEGIN @{
+    if (Disabilita_variabili)
+        disable_assigns(ARGC, ARGV)
+@}
+@c endfile
+@end example
+
+Il programma va poi eseguito in questo modo:
+
+@example
+awk -v Disabilita_variabili=1 -f noassign.awk -f vostro_programma.awk *
+@end example
+
+La funzione esegue un ciclo che esamina ogni argomento.
+Antepone @samp{./} a
+qualsiasi argomento che abbia la forma di un assegnamento
+di variabile, trasformando cos@`{@dotless{i}} quell'argomento in un @value{FN}.
+
+L'uso di @code{Disabilita_variabili} consente di disabilitare assegnamenti di
+variabile dati sulla riga di comando al momento dell'invocazione,
+assegnando alla variabile un valore @dfn{vero}.
+Se non viene impostata la variabile @`e inizializzata a zero (cio@`e
+@dfn{falso}), e gli argomenti sulla riga di comando
+non vengono modificati.
+
+@node Funzione getopt
+@section Elaborare opzioni specificate sulla riga di comando
+
+@cindex libreria di funzioni @command{awk}, opzioni sulla riga di comando
+@cindex funzioni, libreria di, opzioni sulla riga di comando
+@cindex riga di comando, opzioni, elaborazione di
+@cindex opzioni sulla riga di comando, elaborazione di
+@cindex funzioni, libreria di, libreria C
+@cindex argomenti, elaborazione di
+La maggior parte dei programmi di utilit@`a su sistemi compatibili con POSIX
+prevedono opzioni presenti sulla riga di comando che possono essere usate per
+cambiare il modo in cui un programma si comporta.  @command{awk} @`e un esempio di
+tali programmi (@pxref{Opzioni}).
+Spesso le opzioni hanno degli @dfn{argomenti} (cio@`e, dati che servono al
+programma per eseguire correttamente le opzioni specificate
+sulla riga di comando).
+Per esempio, l'opzione @option{-F} di @command{awk} richiede di usare la stringa
+specificata
+come separatore di campo.  La prima occorrenza, sulla riga di comando, di
+@option{--} o di una stringa che non inizia con @samp{-} segnala la fine
+delle opzioni.
+
+@cindex @code{getopt()}, funzione (libreria C)
+@cindex funzione @code{getopt()} (libreria C)
+I moderni sistemi Unix hanno una funzione C chiamata @code{getopt()} per
+elaborare gli argomenti presenti
+sulla riga di comando.  Il programmatore fornisce una
+stringa che descrive le opzioni, ognuna delle quali consiste di
+una sola lettera.  Se un'opzione richiede un
+argomento, nella stringa l'opzione @`e seguita da due punti (@code{:}).
+A @code{getopt()} vengono anche
+passati il numero e i valori degli argomenti presenti sulla riga di comando
+e viene chiamata in un ciclo.
+@code{getopt()} scandisce gli argomenti della riga di comando cercando
+le lettere delle opzioni.
+A ogni passaggio del ciclo restituisce un carattere
+singolo che rappresenta la successiva lettera di opzione trovata, o @samp{?}
+se viene trovata un'opzione non prevista.
+Quando restituisce @minus{}1, non ci sono ulteriori
+opzioni da trattare sulla riga di comando.
+
+Quando si usa @code{getopt()}, le opzioni che non prevedono argomenti
+possono essere raggruppate.
+Inoltre, le opzioni che hanno argomenti richiedono obbligatoriamente che
+l'argomento sia specificato.
+L'argomento pu@`o seguire immediatamente la lettera
+dell'opzione, o pu@`o costituire un argomento separato sulla riga di comando.
+
+Dato un ipotetico  programma che ha tre opzioni sulla riga di comando,
+@option{-a}, @option{-b} e @option{-c}, dove
+@option{-b} richiede un argomento, tutti i seguenti sono modi validi per
+invocare il programma:
+
+@example
+programma -a -b pippo -c dati1 dati2 dati3
+programma -ac -bpippo -- dati1 dati2 dati3
+programma -acbpippo dati1 dati2 dati3
+@end example
+
+Si noti che quando l'argomento @`e raggruppato con la sua opzione,
+la parte rimanente
+dell'argomento @`e considerato come argomento dell'opzione.
+In quest'esempio, @option{-acbpippo} indica che tutte le opzioni
+@option{-a}, @option{-b} e @option{-c} sono presenti,
+e che @samp{pippo} @`e l'argomento dell'opzione @option{-b}.
+
+@code{getopt()} fornisce quattro variabili esterne a disposizione del
+programmatore:
+
+@table @code
+@item optind
+L'indice nel vettore dei valori degli argomenti (@code{argv}) dove si pu@`o
+trovare il primo argomento sulla riga di comando che non sia un'opzione.
+
+@item optarg
+Il valore (di tipo stringa) dell'argomento di un'opzione.
+
+@item opterr
+Solitamente @code{getopt()} stampa un messaggio di errore quando trova un'opzione
+non valida.  Impostando @code{opterr} a zero si disabilita questa funzionalit@`a.
+(un'applicazione potrebbe voler stampare un proprio messaggio di errore.)
+
+@item optopt
+La lettera che rappresenta l'opzione sulla riga di comando.
+@end table
+
+Il seguente frammento di codice C mostra come @code{getopt()} potrebbe
+elaborare gli argomenti della riga di comando per @command{awk}:
+
+@example
+int
+main(int argc, char *argv[])
+@{
+    @dots{}
+    /* stampa un appropriato messaggio */
+    opterr = 0;
+    while ((c = getopt(argc, argv, "v:f:F:W:")) != -1) @{
+        switch (c) @{
+        case 'f':    /* file */
+            @dots{}
+            break;
+        case 'F':    /* separatore di campo */
+            @dots{}
+            break;
+        case 'v':    /* assegnamento di variabile */
+            @dots{}
+            break;
+        case 'W':    /* estensione */
+            @dots{}
+            break;
+        case '?':
+        default:
+            messaggio_di_aiuto();
+            break;
+        @}
+    @}
+    @dots{}
+@}
+@end example
+
+Incidentalmente, @command{gawk} al suo interno usa la funzione GNU
+@code{getopt_long()} per elaborare sia le normali opzioni che quelle lunghe
+in stile GNU
+(@pxref{Opzioni}).
+
+L'astrazione fornita da @code{getopt()} @`e molto utile ed @`e piuttosto comoda
+anche nei programmi @command{awk}.  Di seguito si riporta una versione
+@command{awk} di @code{getopt()}.  Questa funzione mette in evidenza uno dei
+maggiori punti deboli di @command{awk}, che @`e quello di essere molto carente
+nella manipolazione di caratteri singoli.  Sono necessarie ripetute chiamate a
+@code{substr()} per accedere a caratteri singoli.
+(@pxref{Funzioni per stringhe}).@footnote{Questa funzione
+@`e stata scritta prima che @command{gawk} acquisisse la capacit@`a di
+dividere le stringhe in caratteri singoli usando @code{""} come separatore.
+@`E stata lasciata cos@`{@dotless{i}}, poich@'e l'uso di @code{substr()} @`e pi@`u portabile.}
+
+La spiegazione della funzione viene data
+man mano che si elencano i pezzi di codice che la compongono:
+
+@cindex @code{getopt()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getopt()}
+@example
+@c file eg/lib/getopt.awk
+# getopt.awk --- imita in awk la funzione di libreria C getopt(3)
+@c endfile
+@ignore
+@c file eg/lib/getopt.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+#
+# Initial version: March, 1991
+# Revised: May, 1993
+@c endfile
+@end ignore
+@c file eg/lib/getopt.awk
+
+# Variabili esterne:
+#    Optind -- indice in ARGV del primo argomento che non @`e un'opzione
+#    Optarg -- valore di tipo stringa dell'argomento dell'opzione corrente
+#    Opterr -- se diverso da zero, viene stampato un messaggio diagnostico
+#    Optopt -- lettera dell'opzione corrente
+
+# Restituisce:
+#    -1     alla fine delle opzioni
+#    "?"    per un'opzione non riconosciuta
+#    <c>    un carattere che rappresenta l'opzione corrente
+
+# Dati privati:
+#    _opti  -- indice in un'opzione multipla, p.es., -abc
+@c endfile
+@end example
+
+La funzione inizia con commenti che elencano e descrivono le variabili globali
+utilizzate, spiegano quali sono i codici di ritorno, il loro significato, e
+ogni altra variabile che @`e
+``esclusiva'' a questa funzione di libreria.  Tale
+documentazione @`e essenziale per qualsiasi programma, e in modo particolare per
+le funzioni di libreria.
+
+La funzione @code{getopt()} dapprima controlla che sia stata effettivamente
+chiamata con una stringa di opzioni (il parametro @code{opzioni}).  Se
+@code{opzioni} ha lunghezza zero, @code{getopt()} restituisce immediatamente
+@minus{}1:
+
+@cindex @code{getopt()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getopt()}
+@example
+@c file eg/lib/getopt.awk
+function getopt(argc, argv, opzioni,    unaopz, i)
+@{
+    if (length(opzioni) == 0)    # nessuna opzione specificata
+        return -1
+
+@group
+    if (argv[Optind] == "--") @{  # fatto tutto
+        Optind++
+        _opti = 0
+        return -1
+@end group
+    @} else if (argv[Optind] !~ /^-[^:[:space:]]/) @{
+        _opti = 0
+        return -1
+    @}
+@c endfile
+@end example
+
+Il successivo controllo cerca la fine delle opzioni.  Due trattini
+(@option{--}) marcano la fine delle opzioni da riga di comando, e lo stesso
+fa qualsiasi
+argomento sulla riga di comando che non inizi con @samp{-}.  @code{Optind} @`e
+usato per scorrere il vettore degli argomenti presenti sulla riga di comando;
+mantiene il suo valore attraverso chiamate successive a @code{getopt()}, perch@'e
+@`e una variabile globale.
+
+L'espressione regolare che viene usata, @code{@w{/^-[^:[:space:]/}},
+chiede di cercare un
+@samp{-} seguito da qualsiasi cosa che non sia uno spazio vuoto o un carattere
+di due punti (@code{:}).
+Se l'argomento corrente sulla riga di comando non corrisponde a
+quest'espressione regolare, vuol dire che non si tratta di un'opzione, e
+quindi viene terminata l'elaborazione delle opzioni. Continuando:
+
+@example
+@c file eg/lib/getopt.awk
+    if (_opti == 0)
+        _opti = 2
+    unaopz = substr(argv[Optind], _opti, 1)
+    Optopt = unaopz
+    i = index(opzioni, unaopz)
+    if (i == 0) @{
+        if (Opterr)
+            printf("%c -- opzione non ammessa\n", unaopz) > "/dev/stderr"
+        if (_opti >= length(argv[Optind])) @{
+            Optind++
+            _opti = 0
+        @} else
+            _opti++
+        return "?"
+    @}
+@c endfile
+@end example
+
+La variabile @code{_opti} tiene traccia della posizione nell'argomento
+della riga di comando correntemente in esame
+(@code{argv[Optind]}).  Se opzioni multiple sono
+raggruppate con un @samp{-} (p.es., @option{-abx}), @`e necessario
+restituirle all'utente una per volta.
+
+Se @code{_opti} @`e uguale a zero, viene impostato a due, ossia all'indice
+nella
+stringa del successivo carattere da esaminare (@samp{-}, che @`e alla
+posizione uno viene ignorato).
+La variabile @code{unaopz} contiene il carattere,
+ottenuto con @code{substr()}.  Questo @`e salvato in @code{Optopt} per essere
+usato dal programma principale.
+
+Se @code{unaopz} non @`e nella stringa delle opzioni @code{opzioni},
+si tratta di un'opzione
+non valida.  Se @code{Opterr} @`e diverso da zero, @code{getopt()} stampa un
+messaggio di errore sullo @dfn{standard error} che @`e simile al messaggio
+emesso dalla versione C di @code{getopt()}.
+
+Poich@'e l'opzione non @`e valida, @`e necessario tralasciarla e passare al successivo
+carattere di opzione.  Se @code{_opti} @`e maggiore o uguale alla lunghezza
+dell'argomento corrente della riga di comando, @`e necessario passare al
+successivo argomento, in modo che @code{Optind} venga incrementato e
+@code{_opti} sia reimpostato a zero.  In caso contrario, @code{Optind} viene
+lasciato com'@`e e @code{_opti} viene soltanto incrementato.
+
+In ogni caso, poich@'e l'opzione non @`e valida, @code{getopt()} restituisce
+@code{"?"}.  Il programma principale pu@`o esaminare @code{Optopt} se serve
+conoscere quale lettera di opzione @`e quella non valida. Proseguendo:
+
+@example
+@c file eg/lib/getopt.awk
+    if (substr(opzioni, i + 1, 1) == ":") @{
+        # ottiene un argomento di opzione
+        if (length(substr(argv[Optind], _opti + 1)) > 0)
+            Optarg = substr(argv[Optind], _opti + 1)
+        else
+            Optarg = argv[++Optind]
+        _opti = 0
+    @} else
+        Optarg = ""
+@c endfile
+@end example
+
+Se l'opzione richiede un argomento, la lettera di opzione @`e seguita da
+due punti (@code{:})
+nella stringa @code{opzioni}.  Se rimangono altri caratteri nell'argomento
+corrente sulla riga di comando (@code{argv[Optind]}), il resto di quella stringa
+viene assegnato a @code{Optarg}.  Altrimenti, viene usato il successivo
+argomento sulla riga di comando (@samp{-xFOO} piuttosto che
+@samp{@w{-x FOO}}). In
+entrambi i casi, @code{_opti} viene reimpostato a zero, perch@'e non ci sono altri
+caratteri da esaminare nell'argomento corrente sulla riga di comando.
+Continuando:
+
+@example
+@c file eg/lib/getopt.awk
+    if (_opti == 0 || _opti >= length(argv[Optind])) @{
+        Optind++
+        _opti = 0
+    @} else
+        _opti++
+    return unaopz
+@}
+@c endfile
+@end example
+
+Infine, se @code{_opti} @`e zero o maggiore della lunghezza dell'argomento
+corrente sulla riga di comando, significa che l'elaborazione di
+quest'elemento in @code{argv} @`e
+terminata, quindi @code{Optind} @`e incrementato per
+puntare al successivo elemento in @code{argv}.  Se nessuna delle condizioni @`e
+vera, viene incrementato solo @code{_opti}, cosicch@'e la successiva lettera di
+opzione pu@`o essere elaborata con la successiva chiamata a @code{getopt()}.
+
+La regola @code{BEGIN} inizializza sia @code{Opterr} che @code{Optind} a uno.
+@code{Opterr} viene impostato a uno, perch@'e il comportamento di default per
+@code{getopt()} @`e quello di stampare un messaggio diagnostico dopo aver visto
+un'opzione non valida.  @code{Optind} @`e impostato a uno, perch@'e non
+c'@`e alcun motivo
+per considerare il nome del programma, che @`e in @code{ARGV[0]}:
+
+@example
+@c file eg/lib/getopt.awk
+BEGIN @{
+    Opterr = 1    # il default @`e eseguire una diagnosi
+    Optind = 1    # salta ARGV[0]
+
+    # programma di controllo
+    if (_getopt_test) @{
+        while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
+            printf("c = <%c>, Optarg = <%s>\n",
+                                       _go_c, Optarg)
+        printf("argomenti che non sono opzioni:\n")
+        for (; Optind < ARGC; Optind++)
+            printf("\tARGV[%d] = <%s>\n",
+                                    Optind, ARGV[Optind])
+    @}
+@}
+@c endfile
+@end example
+
+Il resto della regola @code{BEGIN} @`e un semplice programma di controllo.  Qui
+sotto si riportano i risultati di
+due esecuzioni di prova
+del programma di controllo:
+
+@example
+$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -cbARG bax -x}
+@print{} c = <a>, Optarg = <>
+@print{} c = <c>, Optarg = <>
+@print{} c = <b>, Optarg = <ARG>
+@print{} argomenti che non sono opzioni:
+@print{}         ARGV[3] = <bax>
+@print{}         ARGV[4] = <-x>
+
+$ @kbd{awk -f getopt.awk -v _getopt_test=1 -- -a -x -- xyz abc}
+@print{} c = <a>, Optarg = <>
+@error{} x -- opzione non ammessa
+@print{} c = <?>, Optarg = <>
+@print{} argomenti che non sono opzioni:
+@print{}         ARGV[4] = <xyz>
+@print{}         ARGV[5] = <abc>
+@end example
+
+In entrambe le esecuzioni, il primo @option{--} fa terminare gli argomenti dati
+ad @command{awk}, in modo che @command{awk} non tenti di interpretare le opzioni
+@option{-a}, etc. come sue opzioni.
+
+@quotation NOTA
+Dopo che @code{getopt()} @`e terminato,
+il codice a livello utente deve eliminare tutti gli elementi
+di @code{ARGV} da
+1 a @code{Optind}, in modo che @command{awk} non tenti di elaborare le opzioni
+sulla riga di comando come @value{FNS}.
+@end quotation
+
+Usare @samp{#!} con l'opzione @option{-E} pu@`o essere d'aiuto per evitare
+conflitti tra le opzioni del proprio programma e quelle di @command{gawk},
+poich@'e l'opzione @option{-E} fa s@`{@dotless{i}} che @command{gawk} abbandoni
+l'elaborazione di ulteriori opzioni.
+(@pxref{@dfn{Script} eseguibili} e
+@ifnotdocbook
+@pxref{Opzioni}).
+@end ifnotdocbook
+@ifdocbook
+@ref{Opzioni}).
+@end ifdocbook
+
+Molti degli esempi presentati in
+@ref{Programmi di esempio},
+usano @code{getopt()} per elaborare i propri argomenti.
+
+@node Funzioni Passwd
+@section Leggere la lista degli utenti
+
+@cindex libreria di funzioni @command{awk}, leggere la lista degli utenti
+@cindex funzioni, libreria di, leggera la lista degli utenti
+@cindex utenti, leggere la lista degli
+@cindex lista degli utenti@comma{} leggere la
+@cindex @code{PROCINFO}, vettore
+@cindex vettore @code{PROCINFO}
+Il vettore @code{PROCINFO}
+(@pxref{Variabili predefinite})
+d@`a accesso ai numeri ID reale ed effettivo dell'utente e del gruppo e, se
+disponibili, alla serie di gruppi ulteriori a cui l'utente appartiene.
+Comunque, poich@'e questi sono numeri, non forniscono informazioni molto utili per
+l'utente medio.  Bisogna trovare un modo per reperire informazioni
+sull'utente associate con i numeri ID dell'utente e del gruppo.  Questa
+@value{SECTION} illustra una raccolta di funzioni per ottenere le informazioni
+dalla lista gli utenti.  @xref{Funzioni Group} per una raccolta di
+funzioni simili per ottenere informazioni dalla lista dei gruppi.
+
+@cindex @code{getpwent()}, funzione (libreria C)
+@cindex funzione @code{getpwent()} (libreria C)
+@cindex @code{getpwent()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getpwent()}
+@cindex utenti, informazioni riguardo agli, ottenere
+@cindex login, informazioni
+@cindex account, informazioni sugli
+@cindex password, file delle
+@cindex file delle password
+Lo standard POSIX non definisce il file dove sono mantenute le informazioni
+degli utenti.  Invece, fornisce il file d'intestazione @code{<pwd.h>}
+e diverse @dfn{subroutine} del linguaggio C per ottenere informazioni sugli
+utenti.  La funzione primaria @`e @code{getpwent()}, che sta per ``get password
+entry''.  La ``password'' proviene dal file originale della lista
+degli utenti, @file{/etc/passwd}, che contiene le informazioni sugli utenti
+assieme alle password criptate (da cui il nome).@footnote{Questo @`e
+vero per le versioni pi@`u antiche di Unix. In quelle pi@`u recenti,
+la @dfn{password} di ogni utente @`e stata trasferita nel file @file{/etc/shadow},
+un file non accessibile dall'utente normale. La struttura del file
+@file{/etc/passwd} @`e rimasta la stessa, ma al posto del campo @dfn{password}
+c'@`e una @code{x}.}
+
+@cindex @command{pwcat}, programma
+Sebbene un programma @command{awk} possa semplicemente leggere
+@file{/etc/passwd} direttamente, questo file pu@`o non contenere tutte le
+informazioni su tutti gli utenti del sistema.@footnote{Capita spesso che le
+informazioni sulla password siano memorizzate in una lista in rete.} Per
+essere sicuri di poter produrre una versione leggibile e completa della banca
+dati degli utenti, @`e necessario scrivere un piccolo programma in C che chiama
+@code{getpwent()}.  @code{getpwent()} viene definita in modo da restituire un
+puntatore a una @code{struct passwd}.  Ogni volta che viene chiamata,
+restituisce l'elemento successivo della lista.  Quando non ci sono pi@`u
+elementi, restituisce @code{NULL}, il puntatore nullo.  Quando accade ci@`o, il
+programma C dovrebbe chiamare @code{endpwent()} per chiudere la lista..
+Quel che segue @`e @command{pwcat}, un programma in C che ``concatena'' la
+lista delle password:
+
+@example
+@c file eg/lib/pwcat.c
+/*
+ * pwcat.c
+ *
+ * Genera una versione stampabile della lista delle password.
+ */
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+/*
+ * Arnold Robbins, arnold@@skeeve.com, May 1993
+ * Public Domain
+ * December 2010, move to ANSI C definition for main().
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+#include <stdio.h>
+#include <pwd.h>
+
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+#if defined (STDC_HEADERS)
+#include <stdlib.h>
+#endif
+
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+int
+main(int argc, char **argv)
+@{
+    struct passwd *p;
+
+    while ((p = getpwent()) != NULL)
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+#ifdef ZOS_USS
+        printf("%s:%ld:%ld:%s:%s\n",
+            p->pw_name, (long) p->pw_uid,
+            (long) p->pw_gid, p->pw_dir, p->pw_shell);
+#else
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+        printf("%s:%s:%ld:%ld:%s:%s:%s\n",
+            p->pw_name, p->pw_passwd, (long) p->pw_uid,
+            (long) p->pw_gid, p->pw_gecos, p->pw_dir, p->pw_shell);
+@c endfile
+@ignore
+@c file eg/lib/pwcat.c
+#endif
+@c endfile
+@end ignore
+@c file eg/lib/pwcat.c
+
+    endpwent();
+    return 0;
+@}
+@c endfile
+@end example
+
+Se non si conosce il linguaggio C, non @`e il caso di preoccuparsi.
+L'output di @command{pwcat} @`e la lista degli utenti, nel formato
+tradizionale del file @file{/etc/passwd} con campi separati da due punti (@code{:}).
+I campi sono:
+
+@table @asis
+@item Login name
+Il nome di login dell'utente.
+
+@item Encrypted password
+La password criptata dell'utente.  Pu@`o non essere disponibile su alcuni sistemi.
+
+@item User-ID
+L'ID numerico dell'utente.
+(Su alcuni sistemi, @`e un numero di formato @code{long} [32bit]
+del linguaggio C, e non nel formato @code{int} [16bit].
+Quindi, lo cambieremo in @code{long} per sicurezza.)
+
+@item Group-ID
+L'ID di gruppo numerico dell'utente.
+(Valgono le stesse considerazioni su @code{long} al posto di @code{int}.)
+
+@item Full name
+Il nome completo dell'utente, e talora altre informazioni associate
+all'utente.
+
+@item Home directory
+La directory di login (o ``home'') (nota ai programmatori di shell come
+@code{$HOME}).
+
+@item Login shell
+Il programma che viene eseguito quando l'utente effettua l'accesso.  Questo @`e
+comunemente una shell, come Bash.
+@end table
+
+Di seguito si riportano alcune righe di un possibile output di @command{pwcat}:
+
+@cindex Jacobs, Andrew
+@cindex Robbins, Arnold
+@cindex Robbins, Miriam
+@example
+$ @kbd{pwcat}
+@print{} root:x:0:1:Operator:/:/bin/sh
+@print{} nobody:x:65534:65534::/:
+@print{} daemon:x:1:1::/:
+@print{} sys:x:2:2::/:/bin/csh
+@print{} bin:x:3:3::/bin:
+@print{} arnold:x:2076:10:Arnold Robbins:/home/arnold:/bin/sh
+@print{} miriam:x:112:10:Miriam Robbins:/home/miriam:/bin/sh
+@print{} andy:x:113:10:Andy Jacobs:/home/andy:/bin/sh
+@dots{}
+@end example
+
+Dopo quest'introduzione, di seguito si riporta un gruppo di funzioni per
+ottenere informazioni sugli utenti.  Ci sono diverse funzioni, che
+corrispondono alle omonime funzioni C:
+
+@cindex @code{_pw_init()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{_pw_init()}
+@example
+@c file eg/lib/passwdawk.in
+# passwd.awk --- accedere alle informazioni del file delle password
+@c endfile
+@ignore
+@c file eg/lib/passwdawk.in
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+@c endfile
+@end ignore
+@c file eg/lib/passwdawk.in
+
+BEGIN @{
+    # modificare per adattarlo al sistema in uso
+    _pw_awklib = "/usr/local/libexec/awk/"
+@}
+
+function _pw_init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+@{
+    if (_pw_inizializzato)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    pwcat = _pw_awklib "pwcat"
+    while ((pwcat | getline) > 0) @{
+        _pw_byname[$1] = $0
+        _pw_byuid[$3] = $0
+        _pw_bycount[++_pw_totale] = $0
+    @}
+    close(pwcat)
+    _pw_contatore = 0
+    _pw_inizializzato = 1
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+@}
+@c endfile
+@end example
+
+@cindex @code{BEGIN}, criterio di ricerca, programma @code{pwcat}
+@cindex criterio di ricerca @code{BEGIN}, programma @code{pwcat}
+La regola @code{BEGIN} imposta una variabile privata col nome
+della directory in cui si
+trova @command{pwcat}.
+Poich@'e @`e destinata a essere usata da una routine di
+libreria di @command{awk}, si @`e scelto di metterla in
+@file{/usr/local/libexec/awk}; comunque, in un altro sistema potrebbe
+essere messa in una directory differente.
+
+La funzione @code{_pw_init()} mette tre copie delle informazioni sull'utente in
+tre vettori associativi.  I vettori sono indicizzati per nome-utente
+(@code{_pw_byname}), per numero di ID-utente (@code{_pw_byuid}), e per ordine di
+occorrenza (@code{_pw_bycount}).
+La variabile @code{_pw_inizializzato} @`e usata per
+efficienza, poich@'e in questo modo @code{_pw_init()}
+viene chiamata solo una volta.
+
+@cindex @code{PROCINFO}, vettore, verificare la divisione in campi
+@cindex vettore @code{PROCINFO}, verificare la divisione in campi
+@cindex @code{getline}, comando, funzione definita dall'utente, @code{_pw_init()}
+@cindex comando @code{getline}, funzione definita dall'utente, @code{_pw_init()}
+Poich@'e questa funzione usa @code{getline} per leggere informazioni da
+@command{pwcat}, dapprima salva i valori di @code{FS}, @code{RS} e @code{$0}.
+Annota nella variabile @code{using_fw} se la suddivisione in campi
+usando @code{FIELDWIDTHS} @`e attiva o no.
+Far questo @`e necessario, poich@'e queste funzioni potrebbero essere chiamate da
+qualsiai parte all'interno di un programma dell'utente, e l'utente pu@`o
+suddividere i record in campi a suo piacimento.
+Ci@`o rende possibile ripristinare il corretto meccanismo di suddivisione dei
+campi in un secondo momento.  La verifica pu@`o restituire solo @dfn{vero} per
+@command{gawk}.
+Il risultato pu@`o essere @dfn{falso} se si usa
+@code{FS} o @code{FPAT},
+o in qualche altra implementazione di @command{awk}.
+
+Il codice che controlla se si sta usando @code{FPAT}, utilizzando
+@code{using_fpat} e @code{PROCINFO["FS"]}, @`e simile.
+
+La parte principale della funzione usa un ciclo per leggere le righe della
+lista, suddividere le righe in campi, e poi memorizzare la riga
+all'interno di ogni vettore a seconda delle necessit@`a.  Quando il ciclo @`e
+completato, @code{@w{_pw_init()}} fa pulizia chiudendo la @dfn{pipe},
+impostando @code{@w{_pw_inizializzato}} a uno, e ripristinando @code{FS}
+(e @code{FIELDWIDTHS} o @code{FPAT}
+se necessario), @code{RS} e @code{$0}.
+L'uso di @code{@w{_pw_contatore}} verr@`a spiegato a breve.
+
+@cindex @code{getpwnam()}, funzione (libreria C)
+@cindex funzione @code{getpwnam()} (libreria C)
+La funzione @code{getpwnam()} ha un nome utente come argomento di tipo
+stringa. Se
+quell'utente @`e presente nella lista, restituisce la riga appropriata.
+Altrimenti, il riferimento a un elemento inesistente del vettore
+aggiunge al vettore stesso un elemento il cui valore @`e la stringa nulla:
+
+@cindex @code{getpwnam()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getpwnam()}
+@example
+@group
+@c file eg/lib/passwdawk.in
+function getpwnam(nome)
+@{
+    _pw_init()
+    return _pw_byname[nome]
+@}
+@c endfile
+@end group
+@end example
+
+@cindex @code{getpwuid()}, funzione (libreria C)
+@cindex funzione @code{getpwuid()} (libreria C)
+In modo simile, la funzione @code{getpwuid()} ha per argomento
+il numero ID di un utente.
+Se un utente con quel numero si trova nella lista, restituisce la riga
+appropriata. Altrimenti restituisce la stringa nulla:
+
+@cindex @code{getpwuid()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getpwuid()}
+@example
+@c file eg/lib/passwdawk.in
+function getpwuid(uid)
+@{
+    _pw_init()
+    return _pw_byuid[uid]
+@}
+@c endfile
+@end example
+
+@cindex @code{getpwent()}, funzione (libreria C)
+@cindex funzione @code{getpwent()} (libreria C)
+La funzione @code{getpwent()} scorre semplicemnte la lista, un elemento
+alla volta.  Usa @code{_pw_contatore} per tener traccia della posizione corrente
+nel vettore @code{_pw_bycount}:
+
+@cindex @code{getpwent()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getpwent()}
+@example
+@c file eg/lib/passwdawk.in
+function getpwent()
+@{
+    _pw_init()
+    if (_pw_contatore < _pw_totale)
+        return _pw_bycount[++_pw_contatore]
+    return ""
+@}
+@c endfile
+@end example
+
+@cindex @code{endpwent()}, funzione (libreria C)
+@cindex funzione @code{endpwent()} (libreria C)
+La funzione @code{@w{endpwent()}} reimposta @code{@w{_pw_contatore}} a zero,
+in modo che chiamate successive a @code{getpwent()} ricomincino da capo:
+
+@cindex @code{endpwent()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{endpwent()}
+@example
+@c file eg/lib/passwdawk.in
+function endpwent()
+@{
+    _pw_contatore = 0
+@}
+@c endfile
+@end example
+
+In questa serie di funzioni, il fatto che ogni subroutine chiami
+@code{@w{_pw_init()}}
+per inizializzare il vettore della lista utenti risponde a una precisa
+scelta progettuale.
+Il lavoro necessario per eseguire un processo separato che generi la
+lista degli utenti, e l'I/O per esaminarla, si ha solo se il programma
+principale dell'utente chiama effettivamente una di queste funzioni.
+Se questo
+file di libreria viene caricato assieme a un programma dell'utente, ma non
+viene mai chiamata nessuna delle routine, non c'@`e nessun lavoro aggiuntivo
+richiesto in fase di esecuzione.
+(L'alternativa @`e quella di spostare il corpo di @code{@w{_pw_init()}}
+all'interno di una regola @code{BEGIN}, che esegua sempre @command{pwcat}.
+Questo semplifica il codice ma richiede di eseguire un processo extra
+il cui risultato potrebbe non essere mai utilizzato dal programma.)
+
+A sua volta, chiamare ripetutamente @code{_pw_init()} non @`e troppo
+dispendioso, perch@'e la
+variabile @code{_pw_inizializzato} permette di evitare di leggere
+i dati relativi agli utenti pi@`u di una
+volta.  Se la preoccupazione @`e quella di minimizzare il tempo di
+esecuzione del programma @command{awk},
+il controllo di @code{_pw_inizializzato} potrebbe essere spostato
+al di fuori di @code{_pw_init()} e duplicato in tutte le altre funzioni.
+In pratica, questo non @`e necessario, poich@'e la maggior parte dei
+programmi di @command{awk}
+@`e I/O-bound@footnote{I programmi si distinguono tradizionalemente in
+CPU-bound e I/O-bound.  Quelli CPU-bound effettuano elaborazioni che non
+richiedono molta attivit@`a di I/O, come ad esempio la preparazione di una
+tavola di numeri primi.  Quelli I/O bound leggono dei file, ma richiedono
+poca attivit@`a di elaborazione per ogni record letto.},
+e una tale modifica complicherebbe inutilmente il codice.
+
+Il programma @command{id} in @ref{Programma id}
+usa queste funzioni.
+
+@node Funzioni Group
+@section Leggere la lista dei gruppi
+
+@cindex libreria di funzioni @command{awk}, leggere la lista dei gruppi
+@cindex funzioni, libreria di, leggere la lista dei gruppi
+@cindex gruppi, lista dei, leggere la
+@cindex lista dei gruppi, leggere la
+@cindex @code{PROCINFO}, vettore, appartenenza a gruppi e
+@cindex @code{getgrent()}, funzione (libreria C)
+@cindex funzione @code{getgrent()} (libreria C)
+@cindex @code{getgrent()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getgrent()}
+@cindex gruppi@comma{} informazioni su
+@cindex account, informazioni sugli
+@cindex gruppi, file dei
+@cindex file dei gruppi
+Molto di quel che @`e stato detto
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Funzioni Passwd}
+vale anche per la lista dei gruppi.  Sebbene questa sia tradizionalmente
+contenuta in
+un file ben noto (@file{/etc/group}) in un altrettanto noto formato,
+lo standard
+POSIX prevede solo una serie di routine della libreria C
+(@code{<grp.h>} e @code{getgrent()})
+per accedere a tali informazioni.
+Anche se il file suddetto @`e disponibile, potrebbe non contenere delle
+informazioni
+complete.  Perci@`o, come per la lista degli utenti, @`e necessario avere un
+piccolo programma in C che genera la lista dei gruppi come suo output.
+@command{grcat}, un programma in C che fornisce la lista dei gruppi,
+@`e il seguente:
+
+@cindex @command{grcat}, programma C
+@cindex programma C, @command{grcat}
+@example
+@c file eg/lib/grcat.c
+/*
+ * grcat.c
+ *
+ * Genera una versione stampabile della lista dei gruppi.
+ */
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+/*
+ * Arnold Robbins, arnold@@skeeve.com, May 1993
+ * Public Domain
+ * December 2010, move to ANSI C definition for main().
+ */
+
+/* Per OS/2, non fare nulla. */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined (STDC_HEADERS)
+#include <stdlib.h>
+#endif
+
+#ifndef HAVE_GETGRENT
+int main() { return 0; }
+#else
+@c endfile
+@end ignore
+@c file eg/lib/grcat.c
+#include <stdio.h>
+#include <grp.h>
+
+int
+main(int argc, char **argv)
+@{
+    struct group *g;
+    int i;
+
+    while ((g = getgrent()) != NULL) @{
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+#ifdef ZOS_USS
+        printf("%s:%ld:", g->gr_name, (long) g->gr_gid);
+#else
+@c endfile
+@end ignore
+@c file eg/lib/grcat.c
+        printf("%s:%s:%ld:", g->gr_name, g->gr_passwd,
+                                     (long) g->gr_gid);
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+#else
+        printf("%s:*:%ld:", g->gr_name, (long) g->gr_gid);
+#endif
+@c endfile
+@end ignore
+@c file eg/lib/grcat.c
+        for (i = 0; g->gr_mem[i] != NULL; i++) @{
+            printf("%s", g->gr_mem[i]);
+@group
+            if (g->gr_mem[i+1] != NULL)
+                putchar(',');
+        @}
+@end group
+        putchar('\n');
+    @}
+    endgrent();
+    return 0;
+@}
+@c endfile
+@ignore
+@c file eg/lib/grcat.c
+#endif /* HAVE_GETGRENT */
+@c endfile
+@end ignore
+@end example
+
+Ciascuna riga nella lista dei gruppi rappresenta un gruppo.  I campi sono
+separati da due punti (@code{:}) e rappresentano le seguenti informazioni:
+
+@table @asis
+@item Nome del gruppo
+Il nome del gruppo.
+
+@item Password del gruppo
+La password del gruppo criptata. In pratica, questo campo non viene mai usato;
+normalmente @`e vuoto o impostato a @samp{x}.
+
+@item Numero ID del gruppo
+Il numero ID del gruppo in formato numerico;
+l'associazione del nome al numero dev'essere univoca all'interno di questo file.
+(Su alcuni sistemi, @`e un numero nel formato @code{long} [32bit]
+del linguaggio C, e non nel formato @code{int} [16bit].
+Quindi, lo cambieremo in @code{long} per sicurezza.)
+
+@item Lista dei membri del gruppo
+Una lista di nomi utente separati da virgole.
+Questi utenti sono i membri del gruppo.
+I sistemi Unix moderni consentono agli utenti di appartenere a
+diversi gruppi simultaneamente.  Se il sistema in uso @`e uno di questi, ci sono
+elementi in  @code{PROCINFO} che vanno da @code{"group1"} fino a
+@code{"group@var{N}"} per quei numeri di ID di gruppo.
+(Si noti che @code{PROCINFO} @`e un'estensione @command{gawk};
+@pxref{Variabili predefinite}.)
+@end table
+
+Di seguito si riporta quel che @command{grcat} potrebbe produrre:
+
+@example
+$ @kbd{grcat}
+@print{} wheel:x:0:arnold
+@print{} nogroup:x:65534:
+@print{} daemon:x:1:
+@print{} kmem:x:2:
+@print{} staff:x:10:arnold,miriam,andy
+@print{} other:x:20:
+@dots{}
+@end example
+
+Qui ci sono le funzioni per ottenere informazioni relative alla lista dei
+gruppi.  Ce ne sono diverse, costruite sul modello delle omonime funzioni della
+libreria C:
+
+@cindex @code{getline}, comando, funzione definita dall'utente, @code{_gr_init()}
+@cindex comando @code{getline}, funzione definita dall'utente, @code{_gr_init()}
+@cindex @code{_gr_init()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{_gr_init()}
+@example
+@c file eg/lib/groupawk.in
+# group.awk --- funzioni per il trattamento del file dei gruppi
+@c endfile
+@ignore
+@c file eg/lib/groupawk.in
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+@c endfile
+@end ignore
+@c line break on _gr_init for smallbook
+@c file eg/lib/groupawk.in
+
+BEGIN @{
+    # Modificare in base alla struttura del proprio sistema
+    _gr_awklib = "/usr/local/libexec/awk/"
+@}
+
+function _gr_init(    oldfs, oldrs, olddol0, grcat,
+                             using_fw, using_fpat, n, a, i)
+@{
+    if (_gr_inizializzato)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    grcat = _gr_awklib "grcat"
+    while ((grcat | getline) > 0) @{
+        if ($1 in _gr_byname)
+            _gr_byname[$1] = _gr_byname[$1] "," $4
+        else
+            _gr_byname[$1] = $0
+        if ($3 in _gr_bygid)
+            _gr_bygid[$3] = _gr_bygid[$3] "," $4
+        else
+            _gr_bygid[$3] = $0
+
+        n = split($4, a, "[ \t]*,[ \t]*")
+        for (i = 1; i <= n; i++)
+            if (a[i] in _gr_groupsbyuser)
+                _gr_groupsbyuser[a[i]] = _gr_groupsbyuser[a[i]] " " $1
+            else
+                _gr_groupsbyuser[a[i]] = $1
+
+        _gr_bycount[++_gr_contatore] = $0
+    @}
+    close(grcat)
+    _gr_contatore = 0
+    _gr_inizializzato++
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+@}
+@c endfile
+@end example
+
+La regola @code{BEGIN} imposta una variabile privata con il nome della
+directory in cui si trova @command{grcat}.
+Poich@'e @`e destinata a essere usata da una routine di
+libreria di @command{awk}, si @`e scelto di metterla in
+@file{/usr/local/libexec/awk}; comunque, in un altro sistema potrebbe
+essere messa in una directory differente.
+
+Queste routine seguono le stesse linee generali delle routine per formare la
+lista degli utenti (@pxref{Funzioni Passwd}).
+La variabile @code{@w{_gr_inizializzato}} @`e usata per
+essere sicuri che la lista venga letta una volta sola.
+La funzione @code{@w{_gr_init()}} dapprima salva @code{FS},
+@code{RS} e
+@code{$0}, e poi imposta @code{FS} e @code{RS} ai valori da usare nel
+passare in rassegna le informazioni di gruppo.  Inoltre
+viene annotato se si stanno usando @code{FIELDWIDTHS} o @code{FPAT}, per
+poter poi
+ripristinare il meccanismo di suddivisione in campi appropriato.
+
+Le informazioni sui gruppi sono memorizzate in diversi vettori associativi.
+I vettori sono indicizzati per nome di gruppo (@code{@w{_gr_byname}}), per
+numero ID del gruppo (@code{@w{_gr_bygid}}), e per posizione nella lista
+(@code{@w{_gr_bycount}}).  C'@`e un vettore aggiuntivo indicizzato per nome utente
+(@code{@w{_gr_groupsbyuser}}), che @`e una lista, separata da spazi, dei
+gruppi ai quali ciascun utente appartiene.
+
+Diversamente dalla lista degli utenti, @`e possibile avere pi@`u record
+nella lista per lo stesso gruppo.  Questo @`e frequente quando un gruppo ha
+un gran numero di membri.  Un paio di tali voci potrebbero essere come queste:
+
+@example
+tvpeople:x:101:johnny,jay,arsenio
+tvpeople:x:101:david,conan,tom,joan
+@end example
+
+Per questo motivo, @code{_gr_init()} controlla se un nome di gruppo o un numero
+di ID di gruppo @`e stato gi@`a visto.  Se cos@`{@dotless{i}} fosse, i nomi utente vanno
+semplicemente concatenati con la precedente lista di utenti.@footnote{C'@`e un
+piccolo problema col codice appena illustrato.  Supponiamo che la prima volta
+non ci siano  nomi. Questo codice aggiunge i nomi con una virgola iniziale.
+Inoltre non controlla che ci sia un @code{$4}.}
+
+Infine, @code{_gr_init()} chiude la @dfn{pipe} a @command{grcat}, ripristina
+@code{FS} (e @code{FIELDWIDTHS} o @code{FPAT}, se necessario), @code{RS} e
+@code{$0}, inizializza @code{_gr_contatore} a zero
+(per essere usato pi@`u tardi), e rende @code{_gr_inizializzato} diverso da zero.
+
+@cindex @code{getgrnam()}, funzione (libreria C)
+@cindex funzione @code{getgrnam()} (libreria C)
+La funzione @code{getgrnam()} ha come argomento un nome di gruppo, e se quel
+gruppo esiste, viene restituito.
+
+Altrimenti, il riferimento a un elemento inesistente del vettore
+aggiunge al vettore stesso un elemento il cui valore @`e la stringa nulla:
+
+@cindex @code{getgrnam()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getgrnam()}
+@example
+@c file eg/lib/groupawk.in
+function getgrnam(group)
+@{
+    _gr_init()
+    return _gr_byname[group]
+@}
+@c endfile
+@end example
+
+@cindex @code{getgrgid()}, funzione (libreria C)
+@cindex funzione @code{getgrgid()} (libreria C)
+La funzione @code{getgrgid()} @`e simile; ha come argomento un numero ID di
+gruppo e controlla le informazioni assiciate con quell'ID di gruppo:
+
+@cindex @code{getgrgid()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getgrgid()}
+@example
+@c file eg/lib/groupawk.in
+function getgrgid(gid)
+@{
+    _gr_init()
+    return _gr_bygid[gid]
+@}
+@c endfile
+@end example
+
+@cindex @code{getgruser()}, funzione (libreria C)
+@cindex funzione @code{getgruser()} (libreria C)
+La funzione @code{getgruser()} non ha un equivalente in C. Ha come argomento un
+nome-utente e restituisce l'elenco dei gruppi di cui l'utente @`e membro:
+
+@cindex @code{getgruser()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getgruser()}
+@example
+@c file eg/lib/groupawk.in
+function getgruser(user)
+@{
+    _gr_init()
+    return _gr_groupsbyuser[user]
+@}
+@c endfile
+@end example
+
+@cindex @code{getgrent()}, funzione (libreria C)
+@cindex funzione @code{getgrent()} (libreria C)
+La funzione @code{getgrent()} scorre la lista un elemento alla volta.
+Usa @code{_gr_contatore} per ricordare la posizione corrente nella lista:
+
+@cindex @code{getgrent()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{getgrent()}
+@example
+@c file eg/lib/groupawk.in
+function getgrent()
+@{
+    _gr_init()
+    if (++_gr_contatore in _gr_bycount)
+        return _gr_bycount[_gr_contatore]
+@group
+    return ""
+@}
+@end group
+@c endfile
+@end example
+
+@cindex @code{endgrent()}, funzione (libreria C)
+@cindex funzione @code{endgrent()} (libreria C)
+La funzione @code{endgrent()} reimposta @code{_gr_contatore} a zero in modo che
+@code{getgrent()} possa ricominciare da capo:
+
+@cindex @code{endgrent()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{endgrent()}
+@example
+@c file eg/lib/groupawk.in
+function endgrent()
+@{
+    _gr_contatore = 0
+@}
+@c endfile
+@end example
+
+Come con le routine per la lista degli utenti, ogni funzione chiama
+@code{_gr_init()} per inizializzare i vettori.
+Cos@`{@dotless{i}} facendo si avr@`a il solo
+lavoro aggiuntivo di eseguire @command{grcat} se queste funzioni vengono
+usate (rispetto a spostare il corpo di @code{_gr_init()} all'interno della
+regola @code{BEGIN}).
+
+La maggior parte del lavoro consiste nell'ispezionare la lista e nel
+costruire i vari vettori associativi.  Le funzioni che l'utente chiama sono
+di per s@'e molto semplici, poich@'e si appoggiano sui vettori associativi di
+@command{awk} per fare il lavoro.
+
+Il programma @command{id} in @ref{Programma id}
+usa queste funzioni.
+
+@node Visitare vettori
+@section Attraversare vettori di vettori
+
+@iftex
+La
+@end iftex
+@ref{Vettori di vettori} trattava di come @command{gawk}
+mette a disposizione vettori di vettori.  In particolare, qualsiasi elemento di
+un vettore pu@`o essere uno scalare o un altro vettore. La funzione
+@code{isarray()} (@pxref{Funzioni per i tipi})
+permette di distinguere un vettore
+da uno scalare.
+La seguente funzione, @code{walk_array()}, attraversa ricorsivamente
+un vettore, stampando gli indici e i valori di ogni elemento.
+Viene chiamata col vettore e con una stringa che contiene il nome
+del vettore:
+
+@cindex @code{walk_array()}, funzione definita dall'utente
+@cindex funzione definita dall'utente, @code{walk_array()}
+@example
+@c file eg/lib/walkarray.awk
+function walk_array(vett, nome,      i)
+@{
+    for (i in vett) @{
+        if (isarray(vett[i]))
+            walk_array(vett[i], (nome "[" i "]"))
+        else
+            printf("%s[%s] = %s\n", nome, i, vett[i])
+    @}
+@}
+@c endfile
+@end example
+
+@noindent
+Funziona eseguendo un ciclo su ogni elemento del vettore. Se un dato elemento
+@`e esso stesso un vettore, la funzione chiama s@'e stessa ricorsivamente,
+passando il sottovettore e una nuova stringa che rappresenta l'indice corrente.
+In caso contrario, la funzione stampa semplicemente il nome, l'indice e il
+valore dell'elemento.
+Qui di seguito si riporta un programma principale che ne mostra l'uso:
+
+@example
+BEGIN @{
+    a[1] = 1
+    a[2][1] = 21
+    a[2][2] = 22
+    a[3] = 3
+    a[4][1][1] = 411
+    a[4][2] = 42
+
+    walk_array(a, "a")
+@}
+@end example
+
+Quando viene eseguito, il programma produce il seguente output:
+
+@example
+$ @kbd{gawk -f walk_array.awk}
+@print{} a[1] = 1
+@print{} a[2][1] = 21
+@print{} a[2][2] = 22
+@print{} a[3] = 3
+@print{} a[4][1][1] = 411
+@print{} a[4][2] = 42
+@end example
+
+La funzione appena illustrata stampa semplicemente il nome e il valore
+di ogni elemento costituito da un vettore scalare. Comunque @`e facile
+generalizzarla, passandole il nome di una funzione da chiamare
+quando si attraversa un vettore. La funzione modificata @`e simile a questa:
+
+@example
+@c file eg/lib/processarray.awk
+function process_array(vett, nome, elab, do_arrays,   i, nuovo_nome)
+@{
+    for (i in vett) @{
+        nuovo_nome = (nome "[" i "]")
+        if (isarray(vett[i])) @{
+            if (do_arrays)
+                @@elab(nuovo_nome, vett[i])
+            process_array(vett[i], nuovo_nome, elab, do_arrays)
+        @} else
+            @@elab(nuovo_nome, vett[i])
+    @}
+@}
+@c endfile
+@end example
+
+Gli argomenti sono i seguenti:
+
+@table @code
+@item vett
+Il vettore.
+
+@item nome
+Il nome del vettore (una stringa).
+
+@item elab
+Il nome della funzione da chiamare.
+
+@item do_arrays
+Se vale @dfn{vero}, la funzione pu@`o gestire elementi che sono sottovettori.
+@end table
+
+Se devono essere elaborati sottovettori, questo vien fatto prima di
+attraversarne altri.
+
+Quando viene eseguita con la seguente struttura, la funzione produce lo stesso
+risultato della precedente versione di @code{walk_array()}:
+
+@example
+BEGIN @{
+    a[1] = 1
+    a[2][1] = 21
+    a[2][2] = 22
+    a[3] = 3
+    a[4][1][1] = 411
+    a[4][2] = 42
+
+    process_array(a, "a", "do_print", 0)
+@}
+
+function do_print(nome, elemento)
+@{
+    printf "%s = %s\n", nome, elemento
+@}
+@end example
+
+@node Sommario funzioni di libreria
+@section Riassunto
+
+@itemize @value{BULLET}
+@item
+Leggere i programmi @`e un eccellente metodo per imparare la "buona
+programmazione".  Le funzioni e i programmi contenuti in questo @value{CHAPTER}
+e nel successivo si propongo questo obiettivo.
+
+@item
+Quando si scrivono funzioni di  libreria di uso generale, si deve stare attenti
+ai nomi da dare alle variabili globali, facendo in modo che non entrino in
+conflitto con le variabili di un programma dell'utente.
+
+@item
+Le funzioni descritte qui appartengono alle seguenti categorie:
+
+@c nested list
+@table @asis
+@item Problemi generali
+Conversione di numeri in stringhe, verifica delle asserzioni, arrotondamenti,
+generazione di numeri casuali, conversione di caratteri in numeri, unione di
+stringhe, ottenimento di informazioni su data e ora facilmente usabili,
+e lettura di un intero file in una volta sola
+
+@item Gestione dei @value{DF}
+Annotazione dei limiti di un @value{DF}, rilettura del file corrente,
+ricerca di
+file leggibili, ricerca di file di lunghezza zero, e trattamento degli
+assegnamenti di variabili fatti sulla riga comando come @value{FNS}
+
+@item Elaborazione di opzioni sulla riga di comando
+Una versione @command{awk} della funzione del C standard @code{getopt()}
+
+@item Lettura dei file degli utenti e dei gruppi
+Due serie di routine equivalenti alle versioni disponibili nella libreria
+del linguaggio C
+
+@item Attraversamento di vettori di vettori
+Due funzioni che attraversano un vettore di vettori fino in fondo
+@end table
+@c end nested list
+
+@end itemize
+
+@c EXCLUDE START
+@node Esercizi con le librerie
+@section Esercizi
+
+@enumerate
+@item
+@iftex
+Nella
+@end iftex
+@ifnottex
+In
+@end ifnottex
+@ref{File vuoti}, abbiamo illustrato il programma @file{zerofile.awk},
+che fa uso della variabile di @command{gawk} @code{ARGIND}.  Questo problema pu@`o
+essere risolto senza dipendere da @code{ARGIND}?  Se s@`{@dotless{i}}, come?
+
+@ignore
+# zerofile2.awk --- same thing, portably
+
+BEGIN @{
+    ARGIND = Argind = 0
+    for (i = 1; i < ARGC; i++)
+        Fnames[ARGV[i]]++
+
+@}
+FNR == 1 @{
+    while (ARGV[ARGIND] != FILENAME)
+        ARGIND++
+    Seen[FILENAME]++
+    if (Seen[FILENAME] == Fnames[FILENAME])
+        do
+            ARGIND++
+        while (ARGV[ARGIND] != FILENAME)
+@}
+ARGIND > Argind + 1 @{
+    for (Argind++; Argind < ARGIND; Argind++)
+        zerofile(ARGV[Argind], Argind)
+@}
+ARGIND != Argind @{
+    Argind = ARGIND
+@}
+END @{
+    if (ARGIND < ARGC - 1)
+        ARGIND = ARGC - 1
+    if (ARGIND > Argind)
+        for (Argind++; Argind <= ARGIND; Argind++)
+            zerofile(ARGV[Argind], Argind)
+@}
+@end ignore
+
+@item
+Come esercizio collegato, rivedere quel codice per gestire il caso in cui un
+valore contenuto in @code{ARGV} sia un assegnamento di variabile.
+
+@ignore
+@c June 13 2015: Antonio points out that this is answered in the text. Ooops.
+@item
+@ref{Visitare vettori} ha illustrato una funzione che ispezionava un vettore
+multidimensionale per stamparlo.  Comunque, ispezionare un vettore ed elaborare
+ogni elemento @`e un'operazione generica.  Generalizzare la funzione
+@code{walk_array()} agggiungendo un parametro aggiuntivo chiamato
+@code{elab}.
+
+Quindi, all'interno del ciclo, invece di stampare l'indice e il valore
+dell'elemento del vettore, usare la sintassi della chiamata indiretta a una
+funzione (@pxref{Chiamate indirette})
+su @code{elab}, passandole l'indice e il valore.
+
+Nel chiamare @code{walk_array()}, si passa il nome di una
+funzione definita dall'utente che aspetta di ricevere un indice e un valore
+per poi elaborare l'elemento.
+
+Verificare la nuova versione stampando il vettore; si dovrebbe ottenere un
+output identico a quello della versione originale.
+@end ignore
+
+@end enumerate
+@c EXCLUDE END
+
+@node Programmi di esempio
+@chapter Programmi utili scritti in @command{awk}
+@cindex @command{awk}, programmi, esempi di
+@cindex programmi @command{awk}, esempi di
+@cindex esempi di programmi @command{awk}
+
+@c FULLXREF ON
+@iftex
+Il
+@end iftex
+@ref{Funzioni di libreria},
+ha prospettato l'idea che la lettura di programmi scritti in un certo
+linguaggio possa aiutare a imparare quel linguaggio.  Questo
+@value{CHAPTER} ripropone lo stesso tema, presentando una miscellanea di
+programmi @command{awk} per il piacere di leggerli.
+@c FULLXREF OFF
+@ifnotinfo
+Ci sono tre @value{SECTIONS}.
+La prima spiega come eseguire i programmi descritti in questo
+@value{CHAPTER}.
+
+La seconda illustra la versione @command{awk}
+di parecchi comuni programmi di utilit@`a disponibili in POSIX.
+Si presuppone che si abbia gi@`a una certa familiarit@`a con questi programmi,
+e che quindi i problemi a loro legati siano facilmente comprensibili.
+Riscrivendo questi programmi in @command{awk},
+ci si pu@`o focalizzare sulle particolarit@`a di @command{awk} nella
+risoluzione dei problemi di programmazione.
+
+La terza sezione @`e una collezione di programmi interessanti.
+Essi mirano a risolvere un certo numero di differenti problemi di
+manipolazione e di gestione dati.  Molti dei programmi sono brevi, per
+evidenziare la capacit@`a di @command{awk} di fare molte cose usando solo
+poche righe di codice.
+@end ifnotinfo
+
+Molti di questi programmi usano le funzioni di libreria che sono state presentate
+@iftex
+nel
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Funzioni di libreria}.
+
+@menu
+* Eseguire esempi::             Come eseguire questi esempi.
+* Cloni::                       Cloni di programmi di utilit@`a comuni.
+* Programmi vari::              Alcuni interessanti programmi in
+                                @command{awk}.
+* Sommario dei programmi::      Sommario dei programmi.
+* Esercizi sui programmi::      Esercizi.
+@end menu
+
+@node Eseguire esempi
+@section Come eseguire i programmi di esempio.
+
+
+Per eseguire un dato programma, si procederebbe tipicamente cos@`{@dotless{i}}:
+
+@example
+awk -f @var{programma} -- @var{opzioni} @var{file}
+@end example
+
+@noindent
+Qui, @var{programma} @`e il nome del programma @command{awk} (p.es.
+@file{cut.awk}), @var{opzioni} sono le opzioni sulla riga di comando
+per il programma che iniziano con un @samp{-}, e @var{file} sono i
+@value{DF} in input.
+
+Se il sistema prevede il meccanismo @samp{#!} di specifica di un
+@dfn{interprete}
+(@pxref{@dfn{Script} eseguibili}),
+si pu@`o invece eseguire direttamente un programma:
+
+@example
+cut.awk -c1-8 i_miei_file > risultati
+@end example
+
+Se @command{awk} non @`e @command{gawk}, pu@`o invece essere necessario usare:
+
+@example
+cut.awk -- -c1-8 i_miei_file > risultati
+@end example
+
+@node Cloni
+@section Reinventare la ruota per divertimento e profitto
+@cindex programmi POSIX, implementazione in @command{awk}
+@cindex POSIX, programmi, implementazione in @command{awk}
+
+Questa @value{SECTION} presenta un certo numero di programmi di utilit@`a
+POSIX implementati in @command{awk}.  Riscrivere questi programmi in
+@command{awk} @`e spesso divertente,
+perch@'e gli algoritmi possono essere espressi molto chiaramente, e il codice
+@`e normalmente molto semplice e conciso.  Ci@`o @`e possibile perch@'e @command{awk}
+facilita molto le cose al programmatore.
+
+Va precisato che questi programmi non sono necessariamente scritti per
+sostituire le versioni installate sul sistema in uso.
+Inoltre, nessuno di questi programmi @`e del tutto aderente ai pi@`u recenti
+standard POSIX.  Questo non @`e un problema; il loro scopo
+@`e di illustrare la programmazione in linguaggio @command{awk} che serve nel
+``mondo reale''.
+
+I programmi sono presentati in ordine alfabetico.
+
+@menu
+* Programma cut::                 Il programma di utilit@`a @command{cut}.
+* Programma egrep::               Il programma di utilit@`a @command{egrep}.
+* Programma id::                  Il programma di utilit@`a @command{id}.
+* Programma split::               Il programma di utilit@`a @command{split}.
+* Programma tee::                 Il programma di utilit@`a @command{tee}.
+* Programma uniq::                Il programma di utilit@`a @command{uniq}.
+* Programma wc::                  Il programma di utilit@`a @command{wc}.
+@end menu
+
+@node Programma cut
+@subsection Ritagliare campi e colonne
+
+@cindex @command{cut}, programma di utilit@`a
+@cindex programma di utilit@`a @command{cut}
+@cindex campi, ritagliare
+@cindex colonne, ritagliare
+Il programma di utilit@`a @command{cut} seleziona, o ``taglia'' (@dfn{cut}),
+caratteri o campi dal suo standard input e li
+spedisce al suo standard output.
+I campi sono separati da caratteri TAB per default,
+ma @`e possibile fornire un'opzione dalla riga di comando per cambiare il campo
+@dfn{delimitatore} (cio@`e, il carattere che separa i campi). La definizione di
+campo di @command{cut} @`e meno generale di quella di @command{awk}.
+
+Un uso comune del comando @command{cut} potrebbe essere quello di estrarre
+i nomi degli utenti correntemente collegati al sistema, a partire
+dall'output del comando @command{who}.  Per esempio, la seguente
+pipeline genera una lista in ordine alfabetico, senza doppioni, degli utenti
+correntemente collegati al sistema:
+
+@example
+who | cut -c1-8 | sort | uniq
+@end example
+
+Le opzioni per @command{cut} sono:
+
+@table @code
+@item -c @var{lista}
+Usare @var{lista} come lista di caratteri da ritagliare.  Elementi
+all'interno della lista
+possono essere separati da virgole, e intervalli di caratteri possono essere
+separated da trattini.  La lista
+@samp{1-8,15,22-35} specifica i caratteri da 1 a 8, 15, e da 22 a 35.
+
+@item -f @var{lista}
+Usare @var{lista} come lista di campi da ritagliare.
+
+@item -d @var{delimitatore}
+Usare @var{delimitatore} come carattere che separa i campi invece del
+carattere TAB.
+
+@item -s
+Evita la stampa di righe che non contengono il delimitatore di campo.
+@end table
+
+L'implementazione @command{awk} del comando @command{cut} usa la funzione
+di libreria @code{getopt()}
+(@pxref{Funzione getopt})
+e la funzione di libreria @code{join()}
+(@pxref{Funzione join}).
+
+Il programma inizia con un commento che descrive le opzioni, le funzioni
+di libreria necessarie, e una funzione @code{sintassi()} che stampa un
+messaggio ed esce.  @code{sintassi()} @`e chiamato se si specificano degli
+argomenti non validi:
+
+@cindex @code{cut.awk}, programma
+@cindex programma @code{cut.awk}
+@example
+@c file eg/prog/cut.awk
+# cut.awk --- implementa cut in awk
+@c endfile
+@ignore
+@c file eg/prog/cut.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/cut.awk
+
+# Opzioni:
+#    -f lista    Ritagliare campi
+#    -d c        Carattere di delimitazione di campo
+#    -c lista    Ritagliare caratteri
+#
+#    -s          Sopprimere righe che non contengono il delimitatore
+#
+# Richiede le funzioni di libreria getopt() e join()
+
+@group
+function sintassi()
+@{
+    print("sintassi: cut [-f lista] [-d c] [-s] [file...]") > "/dev/stderr"
+    print("sintassi: cut [-c lista] [file...]") > "/dev/stderr"
+    exit 1
+@}
+@end group
+@c endfile
+@end example
+
+@cindex @code{BEGIN}, criterio di ricerca, eseguire programmi @command{awk} e
+@cindex criterio di ricerca @code{BEGIN}, eseguire programmi @command{awk} e
+@cindex @code{FS}, variabile, eseguire programmi @command{awk} e
+@cindex variabile @code{FS}, eseguire programmi @command{awk} e
+Subito dopo c'@`e una regola @code{BEGIN} che analizza le opzioni della riga
+di comando.
+Questa regola imposta @code{FS} a un solo carattere TAB, perch@'e quello @`e
+il separatore di campo di @command{cut} per default.
+La regola poi imposta il separatore di campo in output allo stesso valore
+del separatore di campo in input.  Un ciclo che usa @code{getopt()} esamina
+le opzioni della riga di comando.  Una e una sola delle variabili
+@code{per_campi} o @code{per_caratteri} @`e impostata a "vero", per indicare
+che l'elaborazione sar@`a fatta per campi o per caratteri, rispettivamente.
+Quando si ritaglia per caratteri, il separatore di campo in output @`e
+impostato alla stringa nulla:
+
+@example
+@c file eg/prog/cut.awk
+BEGIN @{
+    FS = "\t"    # default
+    OFS = FS
+    while ((c = getopt(ARGC, ARGV, "sf:c:d:")) != -1) @{
+        if (c == "f") @{
+            per_campi = 1
+            lista_campi = Optarg
+        @} else if (c == "c") @{
+            per_caratteri = 1
+            lista_campi = Optarg
+            OFS = ""
+        @} else if (c == "d") @{
+            if (length(Optarg) > 1) @{
+                printf("cut: usa il primo carattere di %s" \
+                       " come delimitatore\n", Optarg) > "/dev/stderr"
+                Optarg = substr(Optarg, 1, 1)
+            @}
+            fs = FS = Optarg
+            OFS = FS
+            if (FS == " ")    # mette specifica in formato awk
+                FS = "[ ]"
+        @} else if (c == "s")
+            sopprimi = 1
+        else
+            sintassi()
+    @}
+
+    # Toglie opzioni da riga di comando
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+@c endfile
+@end example
+
+@cindex separatori di campo, spazi come
+@cindex spazi come separatori di campo
+Nella scrittura del codice si deve porre particolare attenzione quando il
+delimitatore di campo @`e uno spazio.  Usare
+un semplice spazio (@code{@w{" "}}) come valore per @code{FS} @`e
+sbagliato: @command{awk} separerebbe i campi con serie di spazi,
+TAB, e/o ritorni a capo, mentre devono essere separati solo da uno spazio.
+Per far questo, salviamo il carattere di spazio originale nella variabile
+@code{fs} per un uso futuro; dopo aver impostato @code{FS} a @code{"[ ]"} non
+@`e possibile usarlo direttamente per vedere se il carattere delimitatore di
+campo @`e nella stringa.
+
+Si ricordi anche che dopo che si @`e finito di usare @code{getopt()}
+(come descritto nella @ref{Funzione getopt}),
+@`e necessario
+eliminare tutti gli elementi del vettore @code{ARGV} da 1 a @code{Optind},
+in modo che @command{awk} non tenti di elaborare le opzioni della riga di comando
+come @value{FNS}.
+
+Dopo aver elaborato le opzioni della riga di comando, il programma verifica
+che le opzioni siano coerenti.  Solo una tra le opzioni @option{-c}
+e @option{-f} dovrebbe essere presente, ed entrambe richiedono una lista di
+campi.  Poi il programma chiama
+@code{prepara_lista_campi()} oppure @code{prepara_lista_caratteri()} per
+preparare la lista dei campi o dei caratteri:
+
+@example
+@c file eg/prog/cut.awk
+    if (per_campi && per_caratteri)
+        sintassi()
+
+    if (per_campi == 0 && per_caratteri == 0)
+        per_campi = 1    # default
+
+@group
+    if (lista_campi == "") @{
+        print "cut: specificare lista per -c o -f" > "/dev/stderr"
+        exit 1
+    @}
+@end group
+
+    if (per_campi)
+        prepara_lista_campi()
+    else
+        prepara_lista_caratteri()
+@}
+@c endfile
+@end example
+
+@code{prepara_lista_campi()} pone la lista campi, usando la virgola come
+separatore, in un vettore.  Poi, per
+ogni elemento del vettore, controlla che esso non sia un intervallo.  Se @`e
+un intervallo, lo fa diventare un elenco.  La funzione controlla l'intervallo
+specificato, per assicurarsi che il primo numero sia minore del secondo.
+Ogni numero nella lista @`e aggiunto al vettore @code{lista_c}, che
+semplicemente elenca i campi che saranno stampati.  Viene usata la normale
+separazione in campi di @command{awk}.  Il programma lascia ad @command{awk}
+il compito di separare i campi:
+
+@example
+@c file eg/prog/cut.awk
+function prepara_lista_campi(        n, m, i, j, k, f, g)
+@{
+    n = split(lista_campi, f, ",")
+    j = 1    # indice in lista_c
+    for (i = 1; i <= n; i++) @{
+        if (index(f[i], "-") != 0) @{ # un intervallo
+            m = split(f[i], g, "-")
+@group
+            if (m != 2 || g[1] >= g[2]) @{
+                printf("cut: lista campi errata: %s\n",
+                                  f[i]) > "/dev/stderr"
+                exit 1
+            @}
+@end group
+            for (k = g[1]; k <= g[2]; k++)
+                lista_c[j++] = k
+        @} else
+            lista_c[j++] = f[i]
+    @}
+    ncampi = j - 1
+@}
+@c endfile
+@end example
+
+La funzione @code{prepara_lista_caratteri()} @`e pi@`u complicata di
+@code{prepara_lista_campi()}.
+L'idea qui @`e di usare la variabile di @command{gawk} @code{FIELDWIDTHS}
+(@pxref{Dimensione costante}),
+che descrive input a larghezza costante.  Quando si usa una lista di
+caratteri questo @`e proprio il nostro caso.
+
+Impostare @code{FIELDWIDTHS} @`e pi@`u complicato che semplicemente elencare
+i campi da stampare.  Si deve tener traccia dei campi da
+stampare e anche dei caratteri che li separano, che vanno saltati.
+Per esempio, supponiamo che si vogliano i caratteri da 1 a 8, 15,
+e da 22 a 35.  Per questo si specifica @samp{-c 1-8,15,22-35}.  Il valore che
+corrisponde a questo nella variabile @code{FIELDWIDTHS} @`e
+@code{@w{"8 6 1 6 14"}}.  Questi sono cinque campi, e quelli da stampare
+sono @code{$1}, @code{$3}, e @code{$5}.
+I campi intermedi sono @dfn{riempitivo} (@dfn{filler}),
+ossia @`e ci@`o che separa i dati che si desidera estrarre.
+@code{lista_c} lista i campi da stampare, e @code{t} traccia l'elenco
+completo dei campi, inclusi i riempitivi:
+
+@example
+@c file eg/prog/cut.awk
+function prepara_lista_caratteri(    campo, i, j, f, g, n, m, t,
+                          filler, ultimo, lungo)
+@{
+    campo = 1   # contatore totale campi
+    n = split(lista_campi, f, ",")
+    j = 1       # indice in lista_c
+    for (i = 1; i <= n; i++) @{
+        if (index(f[i], "-") != 0) @{ # intervallo
+            m = split(f[i], g, "-")
+            if (m != 2 || g[1] >= g[2]) @{
+                printf("cut: lista caratteri errata: %s\n",
+                               f[i]) > "/dev/stderr"
+                exit 1
+            @}
+            lungo = g[2] - g[1] + 1
+            if (g[1] > 1)  # calcola lunghezza del riempitivo
+                filler = g[1] - ultimo - 1
+            else
+                filler = 0
+@group
+            if (filler)
+                t[campo++] = filler
+@end group
+            t[campo++] = lungo  # lunghezza del campo
+            ultimo = g[2]
+            lista_c[j++] = campo - 1
+        @} else @{
+            if (f[i] > 1)
+                filler = f[i] - ultimo - 1
+            else
+                filler = 0
+            if (filler)
+                t[campo++] = filler
+            t[campo++] = 1
+            ultimo = f[i]
+            lista_c[j++] = campo - 1
+        @}
+    @}
+    FIELDWIDTHS = join(t, 1, campo - 1)
+    ncampi = j - 1
+@}
+@c endfile
+@end example
+
+Poi viene la regola che elabora i dati.  Se l'opzione @option{-s} @`e stata
+specificata, il flag @code{sopprimi}
+@`e vero.  La prima istruzione
+@code{if} accerta che il record in input abbia il separatore di
+campo.  Se @command{cut} sta elaborando dei campi, e @code{sopprimi} @`e vero,
+e il carattere di separazione dei campi non @`e presente nel record, il
+record @`e ignorato.
+
+Se il record @`e valido, @command{gawk} ha gi@`a separato i dati in campi,
+usando il carattere in @code{FS} o usando campi a lunghezza fissa
+e @code{FIELDWIDTHS}.  Il ciclo scorre attraverso la lista di campi che
+si dovrebbero stampare.  Il campo corrispondente @`e stampato se contiene dati.
+Se il campo successivo contiene pure dei dati, il carattere di separazione @`e
+scritto tra i due campi:
+
+@example
+@c file eg/prog/cut.awk
+@{
+    if (per_campi && sopprimi && index($0, fs) == 0)
+        next
+
+    for (i = 1; i <= ncampi; i++) @{
+        if ($lista_c[i] != "") @{
+            printf "%s", $lista_c[i]
+            if (i < ncampi && $lista_c[i+1] != "")
+                printf "%s", OFS
+        @}
+    @}
+    print ""
+@}
+@c endfile
+@end example
+
+Questa versione di @command{cut} utilizza la variabile @code{FIELDWIDTHS} di
+@command{gawk} per ritagliare in base alla posizione dei caratteri.  @`E
+possibile, in altre implementazioni di @command{awk} usare @code{substr()}
+(@pxref{Funzioni per stringhe}), ma
+la cosa @`e molto pi@`u complessa.
+La variabile @code{FIELDWIDTHS} fornisce una soluzione elegante al problema
+di suddividere la riga in input in singoli caratteri.
+
+
+@node Programma egrep
+@subsection Ricercare espressioni regolari nei file
+
+@cindex espressioni regolari, ricerca di
+@cindex ricercare, in file, espressioni regolari
+@cindex file, ricercare espressioni regolari nei
+@cindex @command{egrep}, programma di utilit@`a
+@cindex programma di utilit@`a @command{egrep}
+Il programma di utilit@`a @command{egrep} ricerca occorrenze di espressioni
+regolari all'interno di file.  Usa
+espressioni regolari che sono quasi identiche a quelle disponibili in
+@iftex
+@command{awk} (@pxrefil{Espressioni regolari}).
+@end iftex
+@ifnottex
+@command{awk} (@pxref{Espressioni regolari}).
+@end ifnottex
+Si richiama cos@`{@dotless{i}}:
+
+@display
+@command{egrep} [@var{opzioni}] @code{'@var{espressione}'} @var{file} @dots{}
+@end display
+
+@var{espressione} @`e un'espressione regolare.  Normalmente, l'espressione
+regolare @`e protetta da apici per impedire alla shell di espandere ogni
+carattere speciale come @value{FN}.
+Normalmente, @command{egrep} stampa le righe per cui @`e stata trovata una
+corrispondenza.  Se nella riga di comando si richiede di operare su pi@`u di un
+@value{FN}, ogni riga in output @`e preceduta dal nome del file, e dal segno
+due punti (@code{:}).
+
+Le opzioni di @command{egrep} sono le seguenti:
+
+@table @code
+@item -c
+Stampa un contatore delle righe che corrispondono al criterio di ricerca,
+e non le righe stesse.
+
+@item -s
+Funziona in silenzio.  Non si produce alcun output ma il codice di ritorno
+indica se il criterio di ricerca ha trovato almeno una corrispondenza.
+
+@item -v
+Inverte il senso del test. @command{egrep} stampa le righe che
+@emph{non} soddisfano il criterio di ricerca ed esce con successo se il
+criterio di ricerca non @`e soddisfatto.
+
+@item -i
+Ignora maiuscolo/minuscolo sia nel criterio di ricerca che nei dati in input.
+
+@item -l
+Stampa (elenca) solo i nomi dei file che corrispondono, e non le righe trovate.
+
+@item -e @var{espressione}
+Usa @var{espressione} come @dfn{regexp} da ricercare.  Il motivo per cui
+@`e prevista l'opzione @option{-e} @`e di
+permettere dei criteri di ricerca che
+inizino con un @samp{-}.
+@end table
+
+Questa versione usa la funzione di libreria @code{getopt()}
+(@pxref{Funzione getopt})
+e il programma di libreria che gestisce il passaggio da un file dati
+al successivo
+(@pxref{Funzione filetrans}).
+
+Il programma inizia con un commento descrittivo e poi c'@`e una regola
+@code{BEGIN}
+che elabora gli argomenti della riga di comando usando @code{getopt()}.
+L'opzione @option{-i} (ignora maiuscolo/minuscolo) @`e particolarmente facile
+da implementare con @command{gawk}; basta usare la variabile predefinita
+@code{IGNORECASE}
+(@pxref{Variabili predefinite}):
+
+@cindex @code{egrep.awk}, programma
+@cindex programma @code{egrep.awk}
+@example
+@c file eg/prog/egrep.awk
+# egrep.awk --- simula egrep in awk
+#
+@c endfile
+@ignore
+@c file eg/prog/egrep.awk
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+
+@c endfile
+@end ignore
+@c file eg/prog/egrep.awk
+# Opzioni:
+#    -c    conta le righe trovate
+#    -s    silenziosa: genera solo il codice di ritorno
+#    -v    inverte test, successo se @dfn{regexp} non presente
+#    -i    ignora maiuscolo/minuscolo
+#    -l    stampa solo nomi file
+#    -e    espressione da ricercare
+#
+# Richiede la funzione getopt() e il programma di libreria
+#   che gestisce il passaggio da un file dati al successivo
+
+BEGIN @{
+    while ((c = getopt(ARGC, ARGV, "ce:svil")) != -1) @{
+        if (c == "c")
+            conta_e_basta++
+        else if (c == "s")
+            non_stampare++
+        else if (c == "v")
+            inverti_test++
+        else if (c == "i")
+            IGNORECASE = 1
+        else if (c == "l")
+            solo_nomi_file++
+        else if (c == "e")
+            criterio_di_ricerca = Optarg
+        else
+            sintassi()
+    @}
+@c endfile
+@end example
+
+Nel seguito c'@`e il codice che gestisce il comportamento specifico di
+@command{egrep}.  Se non @`e fornito esplicitamente alcun criterio di ricerca
+tramite l'opzione @option{-e}, si usa il primo argomento sulla riga di
+comando che non sia un'opzione.
+Gli argomenti della riga di comando di @command{awk} fino ad
+@code{ARGV[Optind]} vengono cancellati,
+in modo che @command{awk} non tenti di elaborarli come file.  Se
+non @`e stato specificato alcun nome di file, si usa lo standard input, e se
+@`e presente pi@`u di un nome di file, lo si annota, in modo che i @value{FNS}
+vengano scritti prima di ogni riga di output corrispondente:
+
+@example
+@c file eg/prog/egrep.awk
+    if (criterio_di_ricerca == "")
+        criterio_di_ricerca = ARGV[Optind++]
+
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+    if (Optind >= ARGC) @{
+        ARGV[1] = "-"
+        ARGC = 2
+    @} else if (ARGC - Optind > 1)
+        servono_nomi_file++
+
+#    if (IGNORECASE)
+#        criterio_di_ricerca = tolower(criterio_di_ricerca)
+@}
+@c endfile
+@end example
+
+Le ultime due righe sono solo dei commenti, in quanto non necessarie in
+@command{gawk}.  Per altre versioni di
+@command{awk}, potrebbe essere necessario utilizzarle come istruzioni
+effettive (togliendo il "#").
+
+Il prossimo insieme di righe dovrebbe essere decommentato
+se non si sta usando @command{gawk}.
+Questa regola converte in minuscolo tutti i caratteri della riga in input,
+se @`e stata specificata l'opzione @option{-i}.@footnote{Inoltre, qui si
+introduce un errore subdolo; se una corrispondenza viene trovata, viene
+inviata in output la riga tradotta, non quella originale.}
+La regola @`e
+commentata perch@'e non @`e necessaria se si usa @command{gawk}:
+
+@example
+@c file eg/prog/egrep.awk
+#@{
+#    if (IGNORECASE)
+#        $0 = tolower($0)
+#@}
+@c endfile
+@end example
+
+La funzione @code{a_inizio_file()} @`e chiamata dalla regola in @file{ftrans.awk}
+quando ogni nuovo file viene elaborato.  In questo caso, non c'@`e molto da fare;
+ci si limita a inizializzare una variabile @code{contatore_file} a zero.
+@code{contatore_file} serve a ricordare quante righe nel file corrente
+corrispondono al criterio di ricerca.
+Scegliere come nome di parametro @code{da_buttare} indica che sappiamo che
+@code{a_inizio_file()} @`e chiamata con un parametro, ma che noi non siamo
+interessati al suo valore:
+
+@example
+@c file eg/prog/egrep.awk
+function a_inizio_file(da_buttare)
+@{
+    contatore_file = 0
+@}
+@c endfile
+@end example
+
+La funzione @code{endfile()} viene chiamata dopo l'elaborazione di ogni file.
+Ha influenza sull'output solo quando l'utente desidera un contatore del
+numero di righe che sono state individuate.  @code{non_stampare} @`e vero nel
+caso si desideri solo il codice di ritorno.
+@code{conta_e_basta} @`e vero se si desiderano solo i contatori
+delle righe trovate.  @command{egrep}
+quindi stampa i contatori solo se
+sia la stampa che il conteggio delle righe sono stati abilitati.
+Il formato di output deve tenere conto del numero di file sui quali si
+opera.  Per finire, @code{contatore_file} @`e aggiunto a @code{totale}, in
+modo da stabilire qual @`e il numero totale di righe che ha soddisfatto il
+criterio di ricerca:
+
+@example
+@c file eg/prog/egrep.awk
+function endfile(file)
+@{
+    if (! non_stampare && conta_e_basta) @{
+        if (servono_nomi_file)
+            print file ":" contatore_file
+        else
+            print contatore_file
+    @}
+
+@group
+    totale += contatore_file
+@}
+@end group
+@c endfile
+@end example
+
+Si potrebbero usare i criteri di ricerca speciali @code{BEGINFILE} ed
+@code{ENDFILE}
+(@pxref{BEGINFILE/ENDFILE}),
+ma in quel caso il programma funzionerebbe solo usando @command{gawk}.
+Inoltre, questo esempio @`e stato scritto prima che a @command{gawk} venissero
+aggiunti i criteri speciali @code{BEGINFILE} ed @code{ENDFILE}.
+
+La regola seguente fa il grosso del lavoro per trovare righe corrispondenti
+al criterio di ricerca fornito.  La variabile
+@code{corrisponde} @`e vera se la riga @`e individuata dal criterio di ricerca.
+Se l'utente chiede invece le righe che non corrispondono, il senso di
+@code{corrisponde} @`e invertito, usando l'operatore @samp{!}.
+@code{contatore_file} @`e incrementato con il valore di
+@code{corrisponde}, che vale uno o zero, a seconda che la corrispondenza sia
+stata trovata oppure no.  Se la riga non corrisponde, l'istruzione
+@code{next} passa ad esaminare il record successivo.
+
+Vengono effettuati anche altri controlli, ma soltanto se non
+si sceglie di contare le righe.  Prima di tutto, se l'utente desidera solo
+il codice di ritorno (@code{non_stampare} @`e vero), @`e sufficiente sapere
+che @emph{una} riga nel file corrisponde, e si pu@`o passare al file successivo
+usando @code{nextfile}.  Analogamente, se stiamo solo stampando @value{FNS},
+possiamo stampare il @value{FN}, e quindi saltare al file successivo con
+@code{nextfile}.
+Infine, ogni riga viene stampata, preceduta, se necessario, dal @value{FN} e
+dai due punti (@code{:}):
+
+@cindex @code{!} (punto esclamativo), operatore @code{!}
+@cindex punto esclamativo (@code{!}), operatore @code{!}
+@example
+@c file eg/prog/egrep.awk
+@{
+    corrisponde = ($0 ~ criterio_di_ricerca)
+    if (inverti_test)
+        corrisponde = ! corrisponde
+
+    contatore_file += corrisponde    # 1 o 0
+
+    if (! corrisponde)
+        next
+
+    if (! conta_e_basta) @{
+        if (non_stampare)
+            nextfile
+
+        if (solo_nomi_file) @{
+            print nome_file
+            nextfile
+        @}
+
+        if (servono_nomi_file)
+            print nome_file ":" $0
+        else
+            print
+    @}
+@}
+@c endfile
+@end example
+
+La regola @code{END} serve a produrre il codice di ritorno corretto.  Se
+non ci sono corrispondenze, il codice di ritorno @`e uno; altrimenti, @`e zero:
+
+@example
+@c file eg/prog/egrep.awk
+END @{
+    exit (totale == 0)
+@}
+@c endfile
+@end example
+
+La funzione @code{sintassi()} stampa un messaggio per l'utente, nel caso
+siano state specificate opzioni non valide, e quindi esce:
+
+@example
+@c file eg/prog/egrep.awk
+function sintassi()
+@{
+    print("sintassi: egrep [-csvil] [-e criterio_di_ricerca] [file ...]")\
+    	> "/dev/stderr"
+    print("\n\tegrep [-csvil] criterio_di_ricerca [file ...]") > "/dev/stderr"
+    exit 1
+@}
+@c endfile
+@end example
+
+
+@node Programma id
+@subsection Stampare informazioni sull'utente
+
+@cindex stampare informazioni utente
+@cindex utenti, informazioni riguardo agli, stampare
+@cindex @command{id}, programma di utilit@`a
+@cindex programma di utilit@`a @command{id}
+Il programma di utilit@`a @command{id} elenca i numeri identificativi (ID)
+reali ed effettivi di un utente, e l'insieme dei gruppi a cui l'utente
+appartiene, se ve ne sono.
+@command{id} stampa i numeri identificativi di utente e di gruppo solo se
+questi sono differenti da quelli reali.  Se possibile, @command{id} elenca
+anche i corrispondenti nomi di utente e di gruppo.
+L'output potrebbe essere simile a questo:
+
+@example
+$ @kbd{id}
+@print{} uid=1000(arnold) gid=1000(arnold) groups=1000(arnold),4(adm),7(lp),27(sudo)
+@end example
+
+@cindex @code{PROCINFO}, vettore, @dfn{process ID} di utente e di gruppo e
+@cindex vettore @code{PROCINFO}, @dfn{process ID} di utente e di gruppo e
+Questa informazione @`e parte di ci@`o che @`e reso disponibile dal vettore
+@code{PROCINFO} di @command{gawk} (@pxref{Variabili predefinite}).
+Comunque, il programma di utilit@`a @command{id} fornisce un output pi@`u
+comprensibile che non una semplice lista di numeri.
+
+Ecco una versione semplice di @command{id} scritta in @command{awk}.
+Usa le funzioni di libreria che riguardano il database degli utenti
+(@pxref{Funzioni Passwd})
+e le funzioni di libreria che riguardano il database dei gruppi
+(@pxref{Funzioni Group})
+contenute
+@iftex
+nel
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Funzioni di libreria}.
+
+Il programma @`e abbastanza semplice.  Tutto il lavoro @`e svolto nella regola
+@code{BEGIN}.  I numeri ID di utente e di gruppo sono ottenuti da
+@code{PROCINFO}.
+Il codice @`e ripetitivo.  La riga nel database degli utenti che descrive
+l'ID reale dell'utente @`e divisa in parti, separate tra loro da @samp{:}.
+Il nome @`e il primo campo.  Un codice analogo @`e usato per l'ID effettivo, e
+per i numeri che descrivono i gruppi:
+
+@cindex @code{id.awk}, programma
+@cindex programma @code{id.awk}
+@example
+@c file eg/prog/id.awk
+# id.awk --- implement id in awk
+#
+# Richiede funzioni di libreria per utente e gruppo
+@c endfile
+@ignore
+@c file eg/prog/id.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised February 1996
+# Revised May 2014
+# Revised September 2014
+
+@c endfile
+@end ignore
+@c file eg/prog/id.awk
+# l'output @`e:
+# uid=12(pippo) euid=34(pluto) gid=3(paperino) \
+# egid=5(paperina) groups=9(nove),2(due),1(uno)
+
+@group
+BEGIN @{
+    uid = PROCINFO["uid"]
+    euid = PROCINFO["euid"]
+    gid = PROCINFO["gid"]
+    egid = PROCINFO["egid"]
+@end group
+
+    printf("uid=%d", uid)
+    pw = getpwuid(uid)
+    stampa_primo_campo(pw)
+
+@group
+    if (euid != uid) @{
+        printf(" euid=%d", euid)
+        pw = getpwuid(euid)
+@end group
+@group
+        stampa_primo_campo(pw)
+    @}
+@end group
+
+    printf(" gid=%d", gid)
+    pw = getgrgid(gid)
+    stampa_primo_campo(pw)
+
+    if (egid != gid) @{
+        printf(" egid=%d", egid)
+        pw = getgrgid(egid)
+        stampa_primo_campo(pw)
+    @}
+
+    for (i = 1; ("group" i) in PROCINFO; i++) @{
+        if (i == 1)
+            printf(" gruppi=")
+        group = PROCINFO["group" i]
+        printf("%d", group)
+        pw = getgrgid(group)
+        stampa_primo_campo(pw)
+        if (("group" (i+1)) in PROCINFO)
+            printf(",")
+    @}
+
+    print ""
+@}
+
+function stampa_primo_campo(str,  a)
+@{
+    if (str != "") @{
+        split(str, a, ":")
+        printf("(%s)", a[1])
+    @}
+@}
+@c endfile
+@end example
+
+Il test incluso nel ciclo @code{for} @`e degno di nota.
+Ogni ulteriore gruppo nel vettore @code{PROCINFO} ha come indice da
+@code{"group1"} a @code{"group@var{N}"} dove il numero
+@var{N} @`e il numero totale di gruppi ulteriori).
+Tuttavia, non si sa quanti di questi gruppi ci siano per un dato utente.
+
+Questo ciclo inizia da uno, concatena il valore di ogni iterazione con
+@code{"group"}, e poi usando l'istruzione @code{in} verifica se quella
+chiave @`e nel vettore (@pxref{Visitare elementi}).  Quando @code{i} @`e
+incrementato oltre l'ultimo gruppo presente nel vettore, il ciclo termina.
+
+Il ciclo funziona correttamente anche se @emph{non} ci sono ulteriori
+gruppi; in quel caso la condizione risulta falsa fin dal primo controllo, e
+il corpo del ciclo non viene mai eseguito.
+
+La funzione @code{stampa_primo_campo()} semplicemente incapsula quelle parti di
+codice che vengono usate ripetutamente, rendendo il programma pi@`u conciso e
+ordinato.
+In particolare, inserendo in questa funzione il test per la stringa nulla
+consente di risparmiare parecchie righe di programma.
+
+
+@node Programma split
+@subsection Suddividere in pezzi un file grosso
+
+@c FIXME: One day, update to current POSIX version of split
+
+@cindex file, splitting
+@cindex @code{split}, programma di utilit@`a
+@cindex programma di utilit@`a @code{split}
+Il programma @command{split} divide grossi file di testo in pezzi pi@`u piccoli.
+La sua sintassi @`e la seguente:@footnote{Questo @`e la sintassi tradizionale.
+La versione POSIX del comando ha una sintassi differente, ma per lo scopo di
+questo programma @command{awk} la cosa non ha importanza.}
+
+@display
+@command{split} [@code{-@var{contatore}}] [@var{file}] [@var{prefisso}]
+@end display
+
+Per default,
+i file di output avranno nome @file{xaa}, @file{xab}, e cos@`{@dotless{i}} via. Ogni file
+contiene 1.000 righe, con la probabile
+eccezione dell'ultimo file. Per
+cambiare il numero di righe in ogni file, va indicato un numero sulla riga
+di comando, preceduto da un segno meno (p.es., @samp{-500} per file con 500
+righe ognuno invece che 1.000).  Per modificare i nomi dei file di output in
+qualcosa del tipo
+@file{miofileaa}, @file{miofileab}, e cos@`{@dotless{i}} via, va indicato un argomento
+ulteriore che specifica il prefisso del @value{FN}.
+
+Ecco una versione di @command{split} in @command{awk}. Usa le funzioni
+@code{ord()} e @code{chr()} descritte nella
+@ref{Funzioni ordinali}.
+
+Il programma dapprima imposta i suoi valori di default, e poi controlla che
+non siano stati specificati troppi argomenti.  Quindi esamina gli argomenti
+uno alla volta.  Il primo
+argomento potrebbe essere un segno meno seguito da un numero.  Poich@'e il
+numero in questione pu@`o apparire negativo, lo si fa diventare positivo, e
+viene usato per contare le righe.  Il nome del @value{DF} @`e per ora ignorato
+e l'ultimo argomento @`e usato come prefisso per i @value{FNS} in output:
+
+@cindex @code{split.awk}, programma di utilit@`a
+@cindex programma di utilit@`a @code{split.awk}
+@example
+@c file eg/prog/split.awk
+# split.awk --- comando split scritto in awk
+#
+# Richiede le funzioni di libreria ord() e chr()
+@c endfile
+@ignore
+@c file eg/prog/split.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised slightly, May 2014
+
+@c endfile
+@end ignore
+@c file eg/prog/split.awk
+# sintassi: split [-contatore] [file] [nome_in_output]
+
+BEGIN @{
+    outfile = "x"    # default
+    contatore = 1000
+    if (ARGC > 4)
+        sintassi()
+
+    i = 1
+    if (i in ARGV && ARGV[i] ~ /^-[[:digit:]]+$/) @{
+        contatore = -ARGV[i]
+        ARGV[i] = ""
+        i++
+    @}
+    # testa argv nel caso che si legga da stdin invece che da file
+    if (i in ARGV)
+        i++    # salta nome file-dati
+@group
+    if (i in ARGV) @{
+        outfile = ARGV[i]
+        ARGV[i] = ""
+    @}
+@end group
+@group
+    s1 = s2 = "a"
+    out = (outfile s1 s2)
+@}
+@end group
+@c endfile
+@end example
+
+La regola seguente fa il grosso del lavoro. @code{contatore_t}
+(contatore temporaneo) tiene conto di
+quante righe sono state stampate sul file di output finora.  Se questo
+numero supera il valore di @code{contatore}, @`e ora di chiudere il file
+corrente e di iniziare a scriverne uno nuovo.
+Le variabili @code{s1} e @code{s2} sono usate per creare i suffissi
+da apporre a @value{FN}.  Se entrambi  arrivano al valore @samp{z}, il file
+@`e troppo grosso.  Altrimenti, @code{s1} passa alla successiva lettera
+dell'alfabeto e @code{s2} ricomincia da @samp{a}:
+
+@c else on separate line here for page breaking
+@example
+@c file eg/prog/split.awk
+@{
+    if (++contatore_t > contatore) @{
+        close(out)
+        if (s2 == "z") @{
+            if (s1 == "z") @{
+                printf("split: %s @`e troppo grosso da suddividere\n",
+                       nome_file) > "/dev/stderr"
+                exit 1
+            @}
+            s1 = chr(ord(s1) + 1)
+            s2 = "a"
+        @}
+@group
+        else
+            s2 = chr(ord(s2) + 1)
+@end group
+        out = (outfile s1 s2)
+        contatore_t = 1
+    @}
+    print > out
+@}
+@c endfile
+@end example
+
+@noindent
+La funzione @code{sintassi()} stampa solo un messaggio di errore ed esce:
+
+@example
+@c file eg/prog/split.awk
+function sintassi()
+@{
+    print("sintassi: split [-num] [file] [nome_in_output]") > "/dev/stderr"
+    exit 1
+@}
+@c endfile
+@end example
+
+Questo programma @`e un po' approssimativo; conta sul fatto che @command{awk} chiuda
+automaticamente l'ultimo file invece di farlo in una regola @code{END}.
+Un altro presupposto del programma @`e che le lettere dell'alfabeto siano
+in posizioni consecutive nella codifica in uso, il che non @`e vero per i
+sistemi che usano la codifica EBCDIC.
+
+@ifset FOR_PRINT
+Si potrebbe pensare a come eliminare l'uso di
+@code{ord()} e @code{chr()}; la cosa si pu@`o fare in modo tale da risolvere
+anche il problema posto dalla codifica EBCDIC.
+@end ifset
+
+
+@node Programma tee
+@subsection Inviare l'output su pi@`u di un file
+
+@cindex file, multipli@comma{} duplicare l'output su
+@cindex output, duplicarlo su pi@`u file
+@cindex @code{tee}, programma di utilit@`a
+@cindex programma di utilit@`a @code{tee}
+Il programma @code{tee} @`e noto come @dfn{pipe fitting} (tubo secondario).
+@code{tee} copia il suo standard input al suo standard output e inoltre lo
+duplica scrivendo sui file indicati nella riga di comando.  La sua sintassi
+@`e la seguente:
+
+@display
+@command{tee} [@option{-a}] @var{file} @dots{}
+@end display
+
+L'opzione @option{-a} chiede a @code{tee} di aggiungere in fondo al file
+indicato, invece che riscriverlo dall'inizio.
+
+La regola @code{BEGIN} dapprima fa una copia di tutti gli argomenti presenti
+sulla riga di comando, in un vettore di nome @code{copia}.
+@code{ARGV[0]} non serve, e quindi non viene copiato.
+@code{tee} non pu@`o usare @code{ARGV} direttamente, perch@'e @command{awk} tenta
+di elaborare ogni @value{FN} in @code{ARGV} come dati in input.
+
+@cindex flag, variabili di tipo
+@cindex variabili di tipo indicatore [@dfn{flag}]
+Se il primo argomento @`e @option{-a}, la variabile flag
+@code{append} viene impostata a vero, e sia @code{ARGV[1]} che
+@code{copia[1]} vengono cancellati. Se @code{ARGC} @`e minore di due, nessun
+@value{FN} @`e stato fornito, e @code{tee} stampa un messaggio di sintassi ed
+esce.
+Infine, @command{awk} viene obbligato a leggere lo standard input
+impostando @code{ARGV[1]} al valore @code{"-"} e @code{ARGC} a due:
+
+@cindex @code{tee.awk}, programma di utilit@`a
+@cindex programma di utilit@`a @code{tee.awk}
+@example
+@c file eg/prog/tee.awk
+# tee.awk --- tee in awk
+#
+# Copia lo standard input a tutti i file di output indicati.
+# Aggiunge in fondo se viene data l'opzione -a.
+#
+@c endfile
+@ignore
+@c file eg/prog/tee.awk
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised December 1995
+
+@c endfile
+@end ignore
+@c file eg/prog/tee.awk
+BEGIN @{
+    for (i = 1; i < ARGC; i++)
+        copia[i] = ARGV[i]
+
+    if (ARGV[1] == "-a") @{
+        append = 1
+        delete ARGV[1]
+        delete copia[1]
+        ARGC--
+    @}
+    if (ARGC < 2) @{
+        print "sintassi: tee [-a] file ..." > "/dev/stderr"
+        exit 1
+    @}
+    ARGV[1] = "-"
+    ARGC = 2
+@}
+@c endfile
+@end example
+
+La seguente regola @`e sufficiente da sola a eseguire il lavoro.  Poich@'e non @`e
+presente alcun criterio di ricerca, la regola @`e eseguita per ogni riga di
+input.  Il corpo della regola si limita a stampare la riga su ogni file
+indicato nella riga di comando, e poi sullo standard output:
+
+@example
+@c file eg/prog/tee.awk
+@{
+    # spostare l'if fuori dal ciclo ne velocizza l'esecuzione
+    if (append)
+        for (i in copia)
+            print >> copia[i]
+    else
+        for (i in copia)
+            print > copia[i]
+    print
+@}
+@c endfile
+@end example
+
+@noindent
+@`E anche possibile scrivere il ciclo cos@`{@dotless{i}}:
+
+@example
+@group
+for (i in copia)
+    if (append)
+        print >> copia[i]
+@end group
+@group
+    else
+        print > copia[i]
+@end group
+@end example
+
+@noindent
+Questa forma @`e pi@`u concisa, ma anche meno efficiente.  L'@samp{if} @`e
+eseguito per ogni record e per ogni file di output.  Duplicando il corpo
+del ciclo, l'@samp{if} @`e eseguito solo una volta per ogni record in input.
+Se ci sono
+@var{N} record in input e @var{M} file di output, il primo metodo esegue solo
+@var{N} istruzioni @samp{if}, mentre il secondo esegue
+@var{N}@code{*}@var{M} istruzioni @samp{if}.
+
+Infine, la regola @code{END} fa pulizia, chiudendo tutti i file di output:
+
+@example
+@c file eg/prog/tee.awk
+END @{
+    for (i in copia)
+        close(copia[i])
+@}
+@c endfile
+@end example
+
+@node Programma uniq
+@subsection Stampare righe di testo non duplicate
+
+@c FIXME: One day, update to current POSIX version of uniq
+
+@cindex stampare righe di testo non duplicate
+@cindex testo@comma{} stampare, righe non duplicate di
+@cindex @command{uniq}, programma di utilit@`a
+@cindex programma di utilit@`a @command{uniq}
+Il programma di utilit@`a @command{uniq} legge righe di dati ordinati sul suo
+standard input, e per default rimuove righe duplicate.  In altre parole,
+stampa solo righe uniche; da cui il
+nome.  @command{uniq} ha diverse opzioni.  La sintassi @`e la seguente:
+
+@display
+@command{uniq} [@option{-udc} [@code{-@var{n}}]] [@code{+@var{n}}] [@var{file_input} [@var{file_output}]]
+@end display
+
+Le opzioni per @command{uniq} sono:
+
+@table @code
+@item -d
+Stampa solo righe ripetute (duplicate).
+
+@item -u
+Stampa solo righe non ripetute (uniche).
+
+@item -c
+Contatore righe. Quest'opzione annulla le opzioni @option{-d} e @option{-u}.
+Sia le righe ripetute che quelle non ripetute vengono contate.
+
+@item -@var{n}
+Salta @var{n} campi prima di confrontare le righe.  La definizione di campo
+@`e simile al default di @command{awk}: caratteri non bianchi, separati da
+sequenze di spazi e/o TAB.
+
+@item +@var{n}
+Salta @var{n} caratteri prima di confrontare le righe.  Eventuali campi
+specificati con @samp{-@var{n}} sono saltati prima.
+
+@item @var{file_input}
+I dati sono letti dal file in input specificato sulla riga di comando, invece
+che dallo standard input.
+
+@item @var{file_output}
+L'output generato @`e scritto sul file di output specificato, invece che sullo
+standard output.
+@end table
+
+Normalmente @command{uniq} si comporta come se siano state specificate entrambe
+le opzioni @option{-d} e @option{-u}.
+
+@command{uniq} usa la
+funzione di libreria @code{getopt()}
+(@pxref{Funzione getopt})
+e la funzione di libreria @code{join()}
+(@pxref{Funzione join}).
+
+Il programma inizia con una funzione @code{sintassi()} e poi con una breve
+spiegazione delle opzioni e del loro significato, sotto forma di commenti.
+La regola @code{BEGIN} elabora gli argomenti della riga di comando e le
+opzioni.  Viene usato un artificio per poter impiegare @code{getopt()} con
+opzioni della forma @samp{-25},
+trattando quest'opzione come la lettera di opzione @samp{2} con
+l'argomento @samp{5}. Se si specificano due o pi@`u cifre (@code{Optarg}
+sembra essere numerico), @code{Optarg} @`e concatenato con la cifra che
+costituisce l'opzione e poi al risultato @`e addizionato zero, per trasformarlo
+in un numero.  Se c'@`e solo una cifra nell'opzione, @code{Optarg} non @`e
+necessario.  In tal caso, @code{Optind} dev'essere decrementata, in modo che
+@code{getopt()} la elabori quando viene nuovamente richiamato.  Questo codice
+@`e sicuramente un po' intricato.
+
+Se non sono specificate opzioni, per default si stampano sia le righe
+ripetute che quelle non ripetute.  Il file di output, se specificato, @`e
+assegnato a @code{file_output}.  In precedenza, @code{file_output} @`e
+inizializzato allo standard output, @file{/dev/stdout}:
+
+@cindex @code{uniq.awk}, programma di utilit@`a
+@cindex programma di utilit@`a @code{uniq.awk}
+@example
+@c file eg/prog/uniq.awk
+@group
+# uniq.awk --- implementa uniq in awk
+#
+# Richiede le funzioni di libreria getopt() e join()
+@end group
+@c endfile
+@ignore
+@c file eg/prog/uniq.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/uniq.awk
+
+function sintassi()
+@{
+    print("sintassi: uniq [-udc [-n]] [+n] [ in [ out ]]") > "/dev/stderr"
+    exit 1
+@}
+
+# -c    contatore di righe. prevale su -d e -u
+# -d    solo righe ripetute
+# -u    solo righe non ripetute
+# -n    salta n campi
+# +n    salta n caratteri, salta prima eventuali campi
+
+BEGIN @{
+    contatore = 1
+    file_output = "/dev/stdout"
+    opts = "udc0:1:2:3:4:5:6:7:8:9:"
+    while ((c = getopt(ARGC, ARGV, opts)) != -1) @{
+        if (c == "u")
+            solo_non_ripetute++
+        else if (c == "d")
+            solo_ripetute++
+        else if (c == "c")
+            conta_record++
+        else if (index("0123456789", c) != 0) @{
+            # getopt() richiede argomenti per le opzioni
+            # questo consente di gestire cose come -5
+            if (Optarg ~ /^[[:digit:]]+$/)
+                contatore_file = (c Optarg) + 0
+            else @{
+                contatore_file = c + 0
+                Optind--
+            @}
+        @} else
+            sintassi()
+    @}
+
+@group
+    if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{
+        conta_caratteri = substr(ARGV[Optind], 2) + 0
+        Optind++
+    @}
+@end group
+
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+
+    if (solo_ripetute == 0 && solo_non_ripetute == 0)
+        solo_ripetute = solo_non_ripetute = 1
+
+    if (ARGC - Optind == 2) @{
+        file_output = ARGV[ARGC - 1]
+        ARGV[ARGC - 1] = ""
+    @}
+@}
+@c endfile
+@end example
+
+La funzione seguente, @code{se_sono_uguali()}, confronta la riga corrente,
+@code{$0}, con la riga precedente, @code{ultima}.  Gestisce il salto di
+campi e caratteri.  Se non sono stati richiesti n@'e contatori di campo n@'e
+contatori di carattere, @code{se_sono_uguali()} restituisce uno o zero a
+seconda del risultato di un semplice confronto tra le stringhe @code{ultima}
+e @code{$0}.
+
+In caso contrario, le cose si complicano.  Se devono essere saltati dei campi,
+ogni riga viene suddivisa in un vettore, usando @code{split()}
+(@pxref{Funzioni per stringhe}); i campi desiderati sono poi nuovamente uniti in
+un'unica riga usando @code{join()}.  Le righe ricongiunte vengono
+immagazzinate in @code{campi_ultima} e @code{campi_corrente}.  Se non ci
+sono campi da saltare, @code{campi_ultima} e @code{campi_corrente} sono
+impostati a @code{ultima} e @code{$0}, rispettivamente.  Infine, se
+occorre saltare dei caratteri, si usa @code{substr()} per eliminare i primi
+@code{conta_caratteri} caratteri in @code{campi_ultima} e
+@code{campi_corrente}.  Le due stringhe sono poi confrontare e
+@code{se_sono_uguali()} restituisce il risultato del confronto:
+
+@example
+@c file eg/prog/uniq.awk
+@group
+function se_sono_uguali(    n, m, campi_ultima, campi_corrente,\
+vettore_ultima, vettore_corrente)
+@{
+    if (contatore_file == 0 && conta_caratteri == 0)
+        return (ultima == $0)
+@end group
+
+    if (contatore_file > 0) @{
+        n = split(ultima, vettore_ultima)
+        m = split($0, vettore_corrente)
+        campi_ultima = join(vettore_ultima, contatore_file+1, n)
+        campi_corrente = join(vettore_corrente, contatore_file+1, m)
+    @} else @{
+        campi_ultima = ultima
+        campi_corrente = $0
+    @}
+    if (conta_caratteri) @{
+        campi_ultima = substr(campi_ultima, conta_caratteri + 1)
+        campi_corrente = substr(campi_corrente, conta_caratteri + 1)
+    @}
+@group
+
+    return (campi_ultima == campi_corrente)
+@}
+@end group
+@c endfile
+@end example
+
+Le due regole seguenti sono il corpo del programma.  La prima @`e eseguita solo
+per la prima riga dei dati.  Imposta @code{ultima} al record corrente
+@code{$0}, in modo che le righe di testo successive abbiano qualcosa con cui
+essere confrontate.
+
+La seconda regola fa il lavoro.  La variabile @code{uguale} vale uno o zero,
+a seconda del risultato del confronto effettuato in @code{se_sono_uguali()}.
+Se @command{uniq} sta contando le righe ripetute, e le righe sono uguali,
+viene incrementata la variabile @code{contatore}.
+Altrimenti, viene stampata la riga e azzerato @code{contatore},
+perch@'e le due righe non sono uguali.
+
+Se @command{uniq} non sta contando, e se le righe sono uguali,
+@code{contatore} @`e incrementato.
+Non viene stampato niente, perch@'e l'obiettivo @`e quello di rimuovere i duplicati.
+Altrimenti, se @command{uniq} sta contando le righe ripetute e viene trovata pi@`u
+di una riga, o se @command{uniq} sta contando le righe non ripetute
+e viene trovata solo una riga, questa riga viene stampata, e @code{contatore} @`e
+azzerato.
+
+Infine, una logica simile @`e usata nella regola @code{END} per stampare
+l'ultima riga di  dati in input:
+
+@example
+@c file eg/prog/uniq.awk
+NR == 1 @{
+    ultima = $0
+    next
+@}
+
+@{
+    uguale = se_sono_uguali()
+
+    if (conta_record) @{    # prevale su -d e -u
+        if (uguale)
+            contatore++
+        else @{
+            printf("%4d %s\n", contatore, ultima) > file_output
+            ultima = $0
+            contatore = 1    # reset
+        @}
+        next
+    @}
+
+    if (uguale)
+        contatore++
+    else @{
+        if ((solo_ripetute && contatore > 1) ||
+            (solo_non_ripetute && contatore == 1))
+                print ultima > file_output
+        ultima = $0
+        contatore = 1
+    @}
+@}
+
+END @{
+    if (conta_record)
+        printf("%4d %s\n", contatore, ultima) > file_output
+@group
+    else if ((solo_ripetute && contatore > 1) ||
+            (solo_non_ripetute && contatore == 1))
+        print ultima > file_output
+    close(file_output)
+@}
+@end group
+@c endfile
+@end example
+
+Incidentalmente, questo programma non segue la convenzione,
+raccomandabile, di assegnare alle variabili globali un nome
+con la lettera iniziale maiuscola.  Se lo si fosse fatto, il programma
+sarebbe stato un po' pi@`u semplice da comprendere.
+
+@ifset FOR_PRINT
+La logica per scegliere quali righe stampare rappresenta una @dfn{macchina a
+stati}, che @`e ``un dispositivo che pu@`o trovarsi in una tra un dato numero di
+condizioni stabili, a seconda della sua condizione precedente e del valore
+corrente dei suoi input.''@footnote{Questa @`e la definizione trovata
+cercando @code{define: state machine} in Google.}
+Brian Kernighan suggerisce che
+``un approccio alternativo alle macchine a stati @`e quello di mettere l'input
+in un vettore, e poi usare gli indici.  @`E quasi sempre pi@`u facile da
+programmare e, per molti input in cui si pu@`o usare questo metodo,
+altrettanto veloce.''  Si consideri come riscrivere la logica di questo
+programma per seguite questo suggerimento.
+@end ifset
+
+
+
+@node Programma wc
+@subsection Contare cose
+
+@c FIXME: One day, update to current POSIX version of wc
+
+@cindex contare
+@cindex file in input, contare elementi nel
+@cindex parole, contare le
+@cindex caratteri, contare i
+@cindex righe, contare le
+@cindex @command{wc}, programma di utilit@`a
+@cindex programma di utilit@`a @command{wc}
+Il programma di utilit@`a @command{wc} (@dfn{word count}, contatore di parole)
+conta righe, parole, e caratteri in uno o pi@`u file in input. La sua sintassi
+@`e la seguente:
+
+@display
+@command{wc} [@option{-lwc}] [@var{file} @dots{}]
+@end display
+
+Se nessun file @`e specificato sulla riga di comando, @command{wc} legge il suo
+standard input. Se ci sono pi@`u file, stampa anche il contatore totale di
+tutti i file.  Le opzioni e il loro significato sono i seguenti:
+
+@table @code
+@item -l
+Conta solo le righe.
+
+@item -w
+Conta solo le parole.
+Una ``parola'' @`e una sequenza contigua di caratteri non bianchi, separata da
+spazi e/o TAB.  Fortunatamente, questo @`e il modo normale in cui @command{awk}
+separa i campi nei suoi record in input.
+
+@item -c
+Conta solo i caratteri.
+@end table
+
+Implementare @command{wc} in @command{awk} @`e particolarmente elegante,
+perch@'e @command{awk} fa molto lavoro al posto nostro; divide le righe in
+parole (cio@`e, campi) e le conta, conta le righe (cio@`e, i record),
+e pu@`o facilmente dire quanto @`e lunga una riga.
+
+Questo programma usa la funzione di libreria @code{getopt()}
+(@pxref{Funzione getopt})
+e le funzioni di passaggio da un file all'altro
+(@pxref{Funzione filetrans}).
+
+Questa versione ha una differenza significativa rispetto alle versioni
+tradizionali di @command{wc}: stampa sempre i contatori rispettando l'ordine
+righe, parole e caratteri.  Le versioni tradizionali rilevano l'ordine in cui
+sono specificate le opzioni @option{-l}, @option{-w} e @option{-c} sulla riga
+di comando, e stampano i contatori in quell'ordine.
+
+La regola @code{BEGIN} si occupa degli argomenti.  La variabile
+@code{stampa_totale} @`e vera se pi@`u di un file @`e presente sulla
+riga di comando:
+
+@cindex @code{wc.awk}, programma di utilit@`a
+@cindex programma di utilit@`a @code{wc.awk}
+@example
+@c file eg/prog/wc.awk
+# wc.awk --- conta righe, parole, caratteri
+@c endfile
+@ignore
+@c file eg/prog/wc.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/wc.awk
+
+# Opzioni:
+#    -l    conta solo righe
+#    -w    conta solo parole
+#    -c    conta solo caratteri
+#
+# Il default @`e di contare righe, parole, caratteri
+#
+# Richiede le funzioni di libreria getopt()
+# e il programma di libreria che gestisce
+# il passaggio da un file dati al successivo
+
+BEGIN @{
+    # consente a getopt() di stampare un messaggio se si specificano
+    # opzioni non valide. Noi le ignoriamo
+    while ((c = getopt(ARGC, ARGV, "lwc")) != -1) @{
+        if (c == "l")
+            conta_righe = 1
+        else if (c == "w")
+            conta_parole = 1
+        else if (c == "c")
+            conta_caratteri = 1
+    @}
+    for (i = 1; i < Optind; i++)
+        ARGV[i] = ""
+
+    # se nessuna opzione @`e specificata, conta tutto
+    if (! conta_righe && ! conta_parole && ! conta_caratteri)
+        conta_righe = conta_parole = conta_caratteri = 1
+
+    stampa_totale = (ARGC - i > 1)
+@}
+@c endfile
+@end example
+
+La funzione @code{a_inizio_file()} @`e semplice; si limita ad azzerare i contatori
+di righe, parole e caratteri, e salva il valore corrente di @value{FN} in
+@code{nome_file}:
+
+@example
+@c file eg/prog/wc.awk
+function a_inizio_file(file)
+@{
+    righe = parole = caratteri = 0
+    nome_file = FILENAME
+@}
+@c endfile
+@end example
+
+La funzione @code{a_fine_file()} aggiunge i numeri del file corrente al totale
+di righe, parole, e caratteri.  Poi stampa i numeri relativi al file appena
+letto.  La funzione
+@code{a_inizio_file()} azzera i numeri relativi al @value{DF} seguente:
+
+@example
+@c file eg/prog/wc.awk
+function a_fine_file(file)
+@{
+    totale_righe += righe
+    totale_parole += parole
+    totale_caratteri += caratteri
+    if (conta_righe)
+        printf "\t%d", righe
+@group
+    if (conta_parole)
+        printf "\t%d", parole
+@end group
+    if (conta_caratteri)
+        printf "\t%d", caratteri
+    printf "\t%s\n", nome_file
+@}
+@c endfile
+@end example
+
+C'@`e una regola che viene eseguita per ogni riga. Aggiunge la lunghezza del record
+pi@`u uno, a @code{caratteri}.@footnote{Poich@'e @command{gawk} gestisce le
+localizzazioni in cui un carattere pu@`o occupare pi@`u di un byte, questo codice
+conta i caratteri, non i byte.}
+Aggiungere uno alla lunghezza del record
+@`e necessario, perch@'e il carattere di ritorno a capo, che separa i record
+(il valore di @code{RS}) non @`e parte del record stesso, e quindi non @`e
+incluso nella sua lunghezza.  Poi, @code{righe} @`e incrementata per ogni riga
+letta, e @code{parole} @`e incrementato con il valore @code{NF}, che @`e il
+numero di ``parole'' su questa riga:
+
+@example
+@c file eg/prog/wc.awk
+# per ogni riga...
+@{
+    caratteri += length($0) + 1    # aggiunge un ritorno a capo
+    righe++
+    parole += NF
+@}
+@c endfile
+@end example
+
+Infine, la regola @code{END} si limita a stampare i totali per tutti i file:
+
+@example
+@c file eg/prog/wc.awk
+END @{
+    if (stampa_totale) @{
+        if (conta_righe)
+            printf "\t%d", totale_righe
+        if (conta_parole)
+            printf "\t%d", totale_parole
+        if (conta_caratteri)
+            printf "\t%d", totale_caratteri
+        print "\ttotale"
+    @}
+@}
+@c endfile
+@end example
+
+@node Programmi vari
+@section Un paniere di programmi @command{awk}
+
+Questa @value{SECTION} @`e un ``paniere'' che contiene vari programmi.
+Si spera che siano interessanti e divertenti.
+
+@menu
+* Programma dupword::             Trovare parole duplicate in un documento.
+* Programma alarm::               Un programma di sveglia.
+* Programma translate::           Un programma simile al programma di utilit@`a
+                                  @command{tr}.
+* Programma labels::              Stampare etichette per lettere.
+* Programma utilizzo parole::     Un programma per produrre un contatore
+                                  dell'uso di parole in un testo.
+* Programma riordino diario::     Eliminare righe doppie da un file di
+                                  cronologia.
+* Programma extract ::            Estrarre programmi da file sorgenti Texinfo.
+* Programma sed semplice::        Un semplice editor di flusso.
+* Programma igawk::               Un programma per fornire ad
+                                  @command{awk} la possibilit@`a di includere
+				  file.
+* Programma anagram::             Trovare anagrammi da una lista di parole.
+* Programma signature::           La gente fa cose stupefacenti se ha troppo
+                                  tempo libero.
+@end menu
+
+@node Programma dupword
+@subsection Trovare parole duplicate in un documento
+
+@cindex parole duplicate, ricerca di
+@cindex ricerca di parole
+@cindex documenti@comma{} ricerca in
+Un errore comune quando si scrive un testo lungo @`e quello di ripetere
+accidentalmente delle parole.  Tipicamente lo si pu@`o vedere in testi del tipo
+``questo questo programma fa quanto segue@dots{}''  Quando il testo @`e pubblicato in rete, spesso
+le parole duplicate sono poste tra il termine di
+@iftex
+di
+@end iftex
+una riga e l'inizio di un'altra, il che rende difficile scoprirle.
+@c as here!
+
+Questo programma, @file{dupword.awk}, legge un file una riga alla volta
+e cerca le occorrenze adiacenti della stessa parola.  Conserva anche
+l'ultima parola di ogni riga (nella variabile @code{precedente}) per
+confrontarla con la prima parola sulla riga successiva.
+
+@cindex Texinfo
+Le prime due istruzioni fanno s@`{@dotless{i}} che la riga sia tutta in minuscolo,
+in modo che, per esempio, ``Il'' e ``il'' risultino essere la stessa parola.
+L'istruzione successiva sostituisce i caratteri che sono non alfanumerici e
+diversi dagli
+spazi bianchi con degli spazi, in modo che neppure la punteggiatura influenzi
+i confronti.
+I caratteri sono rimpiazzati da spazi in modo che i controlli di formattazione
+non creino parole prive di senso (p.es., l'espressione Texinfo
+@samp{@@code@{NF@}} diventa @samp{codeNF}, se ci si limita a eliminare la
+punteggiatura).  Il record @`e poi
+suddiviso di nuovo in campi, producendo cos@`{@dotless{i}} solo la lista delle parole
+presenti sulla riga, esclusi eventuali campi nulli.
+
+Se, dopo aver rimosso tutta la punteggiatura, non rimane alcun campo, il
+record corrente @`e saltato.  In caso contrario, il programma esegue il ciclo
+per ogni parola, confrontandola con quella che la precede:
+
+@cindex @code{dupword.awk}, programma
+@cindex programma @code{dupword.awk}
+@example
+@c file eg/prog/dupword.awk
+# dupword.awk --- trova parole duplicate in un testo
+@c endfile
+@ignore
+@c file eg/prog/dupword.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# December 1991
+# Revised October 2000
+
+@c endfile
+@end ignore
+@c file eg/prog/dupword.awk
+@{
+    $0 = tolower($0)
+    gsub(/[^[:alnum:][:blank:]]/, " ");
+    $0 = $0         # divide di nuovo in campi
+    if (NF == 0)
+        next
+    if ($1 == prec)
+        printf("%s:%d: duplicato %s\n",
+            nome_file, FNR, $1)
+    for (i = 2; i <= NF; i++)
+        if ($i == $(i-1))
+            printf("%s:%d: duplicato %s\n",
+                nome_file, FNR, $i)
+    prec = $NF
+@}
+@c endfile
+@end example
+
+@node Programma alarm
+@subsection Un programma di sveglia
+@cindex insonnia, cura per
+@cindex Robbins, Arnold
+@quotation
+@i{Nessuna cura contro l'insonnia @`e efficace quanto una sveglia che suona.}
+@author Arnold Robbins
+@end quotation
+@cindex Quanstrom, Erik
+@ignore
+Date: Sat, 15 Feb 2014 16:47:09 -0500
+Subject: Re: 9atom install question
+Message-ID: <l2jcvx6j6mey60xnrkb0hhob.1392500829294@email.android.com>
+From: Erik Quanstrom <quanstro@quanstro.net>
+To: Aharon Robbins <arnold@skeeve.com>
+
+yes.
+
+- erik
+
+Aharon Robbins <arnold@skeeve.com> wrote:
+
+>> sleep is for web developers.
+>
+>Can I quote you, in the gawk manual?
+>
+>Thanks,
+>
+>Arnold
+@end ignore
+@quotation
+@i{Il sonno @`e per sviluppatori web.}
+@author Erik Quanstrom
+@end quotation
+
+@cindex tempo, sveglia, programma di esempio
+@cindex sveglia, programma di esempio
+Il seguente programma @`e un semplice programma di ``sveglia''.
+Si pu@`o specificare un'ora del giorno e un messaggio opzionale.  All'ora
+specificata, il programma stampa il messaggio sullo standard output. Inoltre,
+si pu@`o specificare il numero di volte in cui il messaggio va ripetuto, e
+anche un intervallo di tempo (ritardo) tra ogni ripetizione.
+
+Questo programma usa la funzione @code{getlocaltime()}
+@iftex
+dalla
+@end iftex
+@ifnottex
+da
+@end ifnottex
+@ref{Funzione getlocaltime}.
+
+Tutto il lavoro @`e svolto nella regola @code{BEGIN}.  La prima parte @`e
+il controllo degli argomenti e l'impostazione dei valori di default:
+l'intervallo prima di ripetere, il contatore, e il messaggio da stampare.
+Se l'utente ha fornito un messaggio che non contiene il carattere ASCII BEL
+(noto come carattere ``campanello'', @code{"\a"}), questo viene aggiunto al
+messaggio.  (Su molti sistemi, stampare il carattere ASCII BEL genera un suono
+udibile.  Quindi, quando la sveglia suona, il sistema richiama l'attenzione
+su di s@'e nel caso che l'utente non stia guardando il computer.)
+Per amor di variet@`a, questo programma usa un'istruzione @code{switch}
+(@pxref{Istruzione switch}), ma l'elaborazione potrebbe anche essere fatta
+con una serie di istruzioni @code{if}-@code{else}.
+Ecco il programma:
+
+@cindex @code{alarm.awk}, programma
+@cindex programma @code{alarm.awk}
+@example
+@c file eg/prog/alarm.awk
+# alarm.awk --- impostare una sveglia
+#
+# Richiede la funzione di libreria getlocaltime()
+@c endfile
+@ignore
+@c file eg/prog/alarm.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised December 2010
+
+@c endfile
+@end ignore
+@c file eg/prog/alarm.awk
+# sintassi: alarm a_che_ora [ "messaggio" [ contatore [ ritardo ] ] ]
+
+BEGIN @{
+    # Controllo iniziale congruit@`a argomenti
+    sintassi1 = "sintassi: alarm a_che_ora ['messaggio' [contatore [ritardo]]]"
+    sintassi2 = sprintf("\t(%s) formato ora: ::= hh:mm", ARGV[1])
+
+    if (ARGC < 2) @{
+        print sintassi1 > "/dev/stderr"
+        print sintassi2 > "/dev/stderr"
+        exit 1
+    @}
+    switch (ARGC) @{
+    case 5:
+        ritardo = ARGV[4] + 0
+        # vai al caso seguente
+    case 4:
+        contatore = ARGV[3] + 0
+        # vai al caso seguente
+    case 3:
+        messaggio = ARGV[2]
+        break
+    default:
+        if (ARGV[1] !~ /[[:digit:]]?[[:digit:]]:[[:digit:]]@{2@}/) @{
+            print sintassi1 > "/dev/stderr"
+            print sintassi2 > "/dev/stderr"
+            exit 1
+        @}
+        break
+    @}
+
+    # imposta i valori di default per quando arriva l'ora desiderata
+    if (ritardo == 0)
+        ritardo = 180    # 3 minuti
+@group
+    if (contatore == 0)
+        contatore = 5
+@end group
+    if (messaggio == "")
+        messaggio = sprintf("\aAdesso sono le %s!\a", ARGV[1])
+    else if (index(message, "\a") == 0)
+        messaggio = "\a" messaggio "\a"
+@c endfile
+@end example
+
+La successiva @value{SECTION} di codice scompone l'ora specificata in ore e
+minuti, la converte (se @`e il caso) al formato 24-ore, e poi calcola il
+relativo numero di secondi dalla mezzanotte.  Poi trasforma l'ora corrente in
+un contatore dei secondi dalla
+mezzanotte.  La differenza tra i due @`e il tempo di attesa che deve passare
+prima di far scattare la sveglia:
+
+@example
+@c file eg/prog/alarm.awk
+    # scomponi ora della sveglia
+    split(ARGV[1], ore_minuti, ":")
+    ora = ore_minuti[1] + 0     # trasforma in numero
+    minuto = ore_minuti[2] + 0  # trasforma in numero
+
+    # ottiene ora corrente divisa in campi
+    getlocaltime(adesso)
+
+    # se l'ora desiderata @`e in formato 12-ore ed @`e nel pomeriggio
+    # (p.es., impostare `alarm 5:30' alle 9 del mattino
+    # vuol dire far suonare la sveglia alle 5:30 pomeridiane)
+    # aggiungere 12 all'ora richiesta
+    if (hour < 12 && adesso["hour"] > ora)
+        ora += 12
+
+    # imposta l'ora in secondi dalla mezzanotte
+    sveglia = (ora * 60 * 60) + (minuto * 60)
+
+    # ottieni l'ora corrente in secondi dalla mezzanotte
+    corrente = (now["hour"] * 60 * 60) + \
+               (now["minute"] * 60) + now["second"]
+
+    # quanto restare appisolati
+    sonno = sveglia - corrente
+    if (sonno <= 0) @{
+        print "alarm: l'ora @`e nel passato!" > "/dev/stderr"
+        exit 1
+    @}
+@c endfile
+@end example
+
+@cindex @command{sleep}, programma di utilit@`a
+@cindex programma di utilit@`a @command{sleep}
+Infine, il programma usa la funzione @code{system()}
+(@pxref{Funzioni di I/O})
+per chiamare il programma di utilit@`a @command{sleep}.  Il programma di utilit@`a
+@command{sleep} non fa altro che aspettare per il numero di secondi
+specificato.  Se il codice di ritorno restituito @`e diverso da zero, il
+programma suppone che @command{sleep} sia stato interrotto ed esce. Se
+@command{sleep} @`e terminato con un codice di ritorno corretto, (zero), il
+programma stampa il messaggio in un ciclo, utilizzando ancora @command{sleep}
+per ritardare per il numero di secondi necessario:
+
+@example
+@c file eg/prog/alarm.awk
+    # zzzzzz..... esci se sleep @`e interrotto
+    if (system(sprintf("sleep %d", sonno)) != 0)
+        exit 1
+
+    # @`e ora di avvisare!
+    command = sprintf("sleep %d", ritardo)
+    for (i = 1; i <= contatore; i++) @{
+        print messaggio
+        # se il comando sleep @`e interrotto, esci
+        if (system(command) != 0)
+            break
+    @}
+
+    exit 0
+@}
+@c endfile
+@end example
+
+@node Programma translate
+@subsection Rimpiazzare o eliminare caratteri
+
+@cindex caratteri, rimpiazzare
+@cindex rimpiazzare caratteri
+@cindex @command{tr}, programma di utilit@`a
+@cindex programma di utilit@`a @command{tr}
+Il programma di utilit@`a di sistema @command{tr} rimpiazza caratteri.  Per
+esempio, @`e spesso usato per trasformare lettere maiuscole in lettere minuscole
+in vista di ulteriori elaborazioni:
+
+@example
+@var{generare dei dati} | tr 'A-Z' 'a-z' | @var{elaborare dei dati} @dots{}
+@end example
+
+@command{tr} richiede due liste di caratteri.@footnote{Su alcuni sistemi
+pi@`u datati, incluso Solaris, la versione di sistema di @command{tr} pu@`o
+richiedere che le liste siano scritte come espressioni di intervallo,
+racchiuse in parentesi quadre
+(@samp{[a-z]}) e tra apici, per evitare che la shell effettui
+espansioni di @value{FN}.  Questo non @`e un miglioramento.}  Quando
+si elabora l'input, il primo carattere della prima lista @`e rimpiazzato con il
+primo carattere della seconda lista, il secondo carattere della prima lista @`e
+rimpiazzato con il secondo carattere della seconda lista, e cos@`{@dotless{i}} via.  Se ci
+sono pi@`u caratteri nella lista ``da'' che in quella ``a'', l'ultimo carattere
+della lista ``a'' @`e usato per i restanti caratteri della lista ``da''.
+
+In un lontano passato,
+@c early or mid-1989!
+un utente propose di aggiungere una funzione di traslitterazione a
+@command{gawk}.
+@c Wishing to avoid gratuitous new features,
+@c at least theoretically
+Il programma seguente @`e stato scritto per dimostrare che la traslitterazione
+di caratteri poteva essere fatta con una funzione definita dall'utente.
+Questo programma non @`e cos@`{@dotless{i}} completo come il programma di utilit@`a di sistema
+@command{tr}, ma svolge buona parte dello stesso lavoro.
+
+Il programma @command{translate} @`e stato scritto molto prima che @command{gawk}
+fosse in grado di separare ciascun carattere di una stringa in elementi
+distinti di un vettore.  Questo @`e il motivo per cui usa ripetutamente le
+funzioni predefinite @code{substr()}, @code{index()}, e @code{gsub()}
+(@pxref{Funzioni per stringhe}).
+Ci sono due funzioni.  La prima, @code{traduci_stringa()},
+richiede tre argomenti:
+
+@table @code
+@item da
+Una lista di caratteri da cui traslitterare
+
+@item a
+Una lista di caratteri a cui traslitterare
+
+@item stringa
+La stringa su cui effettuare la traslitterazione
+@end table
+
+I vettori associativi facilitano molto la parte di traslitterazione.
+@code{vettore_trad} contiene i caratteri ``a'', indicizzato dai
+caratteri ``da''.  Poi un semplice
+ciclo scandisce @code{da}, un carattere alla volta.  Per ogni carattere
+in @code{da}, se il carattere compare in @code{stringa}
+@`e rimpiazzato con il corrispondente carattere @code{a}.
+
+La funzione @code{traducilo()} chiama @code{traduci_stringa()}, usando @code{$0}
+come stringa.  Il programma principale imposta due variabili globali, @code{DA} e
+@code{A}, dalla riga di comando, e poi modifica @code{ARGV} in modo che
+@command{awk} legga dallo standard input.
+
+Infine, la regola di elaborazione si limita a chiamare @code{traducilo()}
+per ogni record:
+
+@cindex @code{translate.awk}, programma
+@cindex programma @code{translate.awk}
+@example
+@c file eg/prog/translate.awk
+# translate.awk --- fa cose simili al comando tr
+@c endfile
+@ignore
+@c file eg/prog/translate.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# August 1989
+# February 2009 - bug fix
+
+@c endfile
+@end ignore
+@c file eg/prog/translate.awk
+# Bug: non gestisce cose del tipo tr A-Z a-z; deve essere
+# descritto carattere per carattere.
+# Tuttavia, se `a' @`e pi@`u corto di `da',
+# l'ultimo carattere in `a' @`e usato per il resto di `da'.
+
+function traduci_stringa(da, a, stringa,     lf, lt, lstringa, vettore_trad,
+                        i, c, risultato)
+@{
+    lf = length(da)
+    lt = length(a)
+    lstringa = length(stringa)
+    for (i = 1; i <= lt; i++)
+        vettore_trad[substr(da, i, 1)] = substr(a, i, 1)
+    if (lt < lf)
+        for (; i <= lf; i++)
+            vettore_trad[substr(da, i, 1)] = substr(a, lt, 1)
+    for (i = 1; i <= lstringa; i++) @{
+        c = substr(stringa, i, 1)
+        if (c in vettore_trad)
+            c = vettore_trad[c]
+        risultato = risultato c
+    @}
+    return risultato
+@}
+
+function traducilo(da, a)
+@{
+    return $0 = traduci_stringa(da, a, $0)
+@}
+
+# programma principale
+BEGIN @{
+@group
+    if (ARGC < 3) @{
+        print "sintassi: translate da a" > "/dev/stderr"
+        exit
+    @}
+@end group
+    DA = ARGV[1]
+    A = ARGV[2]
+    ARGC = 2
+    ARGV[1] = "-"
+@}
+
+@{
+    traducilo(DA, A)
+    print
+@}
+@c endfile
+@end example
+
+@`E possibile effettuare la traslitterazione di caratteri in una funzione a
+livello utente, ma non @`e detto che sia efficiente, e noi (sviluppatori
+di @command{gawk}) abbiamo iniziato a prendere in considerazione l'aggiunta di una funzione.
+Tuttavia, poco dopo aver scritto questo programma, abbiamo saputo che Brian
+Kernighan aveva aggiunto le funzioni @code{toupper()} e @code{tolower()} alla
+sua versione di @command{awk} (@pxref{Funzioni per stringhe}).  Queste
+funzioni gestiscono la maggior parte dei casi in cui serva la traslitterazione
+di caratteri, e quindi abbiamo deciso di limitarci ad aggiungere le stesse
+funzioni a @command{gawk}, e di disinteressarci del resto.
+
+Un miglioramento ovvio a questo programma sarebbe di impostare il vettore
+@code{vettore_trad} solo una volta, in una regola @code{BEGIN}. Tuttavia, ci@`o
+presuppone che le liste ``da'' e ``a'' non cambino mai durante tutta
+l'esecuzione del programma.
+
+Un altro miglioramento ovvio @`e di consentire l'uso di intervalli, come
+@samp{a-z}, come consentito dal programma di utilit@`a @command{tr}.  Si pu@`o
+trarre ispirazione dal codice di @file{cut.awk} (@pxref{Programma cut}).
+
+
+@node Programma labels
+@subsection Stampare etichette per lettere
+
+@cindex stampare etichette per lettera
+@cindex etichette per lettera@comma{} stampare
+Ecco un programma ``del mondo-reale''@footnote{``Del mondo-reale'' @`e definito
+come ``un programma effettivamente usato per realizzare qualcosa''.}.
+Questo @dfn{script} legge elenchi di nomi e indirizzi, e genera etichette per
+lettera.  Ogni pagina di etichette contiene 20 etichette, su due file da 10
+etichette l'una.  Gli indirizzi non possono contenere pi@`u di cinque righe di
+dati.  Ogni indirizzo @`e separato dal successivo da una riga bianca.
+
+L'idea di base @`e di leggere dati per 20 etichette.  Ogni riga di ogni etichetta
+@`e immagazzinata nel vettore @code{riga}.  L'unica regola si occupa di riempire
+il vettore @code{riga} e di stampare la pagina dopo che sono state lette 20
+etichette.
+
+La regola @code{BEGIN} si limita a impostare @code{RS} alla stringa vuota, in
+modo che @command{awk} divida un record dal successivo quando incontra una riga
+bianca.
+(@pxref{Record}).
+Inoltre imposta @code{LIMITE_LINEE} a 100,
+perch@'e 100 @`e il massimo numero di righe sulla pagina
+@iftex
+(@math{20 @cdot 5 = 100}).
+@end iftex
+@ifnottex
+@ifnotdocbook
+(20 * 5 = 100).
+@end ifnotdocbook
+@end ifnottex
+@docbook
+(20 &sdot; 5 = 100).
+@end docbook
+
+Il grosso del lavoro @`e svolto nella funzione @code{stampa_pagina()}.
+Le righe che compongono le etichette sono immagazzinate sequenzialmente nel vettore
+@code{riga}.  Ma occorre stamparle in
+orizzontale: @code{riga[1]} a fianco di @code{riga[6]}, @code{riga[2]} a
+fianco di @code{riga[7]}, e cos@`{@dotless{i}} via.  Questo si pu@`o fare utilizzando due
+cicli.  Quello pi@`u esterno, controllato dalla variabile @code{i}, gestisce 10
+righe di dati, ovvero la stampa di due etichette una a fianco dell'altra.
+Il ciclo pi@`u interno
+controllato dalla variabile @code{j}, gestisce le singole righe che compongono
+ognuno degli indirizzi.
+Poich@'e @code{j} varia da 0 a 4, @samp{i+j} @`e la riga @code{j}-esima
+dell'indirizzo di sinistra, e @samp{i+j+5} @`e quella stampata alla sua destra.
+L'output @`e simile a quello mostrato qui sotto:
+
+@example
+riga 1          riga 6
+riga 2          riga 7
+riga 3          riga 8
+riga 4          riga 9
+riga 5          riga 10
+@dots{}
+@end example
+
+@noindent
+La stringa di formato per @code{printf} @samp{%-41s} allinea a
+sinistra i dati, e li stampa in un campo di lunghezza fissa.
+
+Come nota finale, un'ulteriore riga bianca extra viene stampata alle righe 21 e
+61, per mantenere entro i bordi l'output sulle etichette.  Ci@`o dipende dalla
+particolare marca di etichette in uso quando il programma @`e stato scritto.
+Si noti anche che ci sono due righe bianche a inizio pagina e due righe
+bianche a fine pagina.
+
+La regola @code{END} si occupa di stampare l'ultima pagina di
+etichette; @`e improbabile che il numero di indirizzi da stampare sia un
+multiplo esatto di 20:
+
+@cindex @code{labels.awk}, programma
+@cindex programma @code{labels.awk}
+@example
+@c file eg/prog/labels.awk
+# labels.awk --- stampare etichette per lettera
+@c endfile
+@ignore
+@c file eg/prog/labels.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# June 1992
+# December 2010, minor edits
+@c endfile
+@end ignore
+@c file eg/prog/labels.awk
+
+# Ogni etichetta @`e 5 righe di dati, qualcuna delle quali pu@`o essere bianca.
+# I fogli con le etichetta hanno 2 righe bianche in cima alla pagina e altre 2
+# a fine pagina.
+
+BEGIN    @{ RS = "" ; LIMITE_LINEE = 100 @}
+
+function stampa_pagina(    i, j)
+@{
+    if (NUMEROrighe <= 0)
+        return
+
+    printf "\n\n"        # in cima
+
+    for (i = 1; i <= NUMEROrighe; i += 10) @{
+        if (i == 21 || i == 61)
+            print ""
+        for (j = 0; j < 5; j++) @{
+            if (i + j > LIMITE_LINEE)
+                break
+            printf "   %-41s %s\n", riga[i+j], riga[i+j+5]
+        @}
+        print ""
+    @}
+
+    printf "\n\n"        # in fondo
+
+    delete riga
+@}
+
+# regola principale
+@{
+    if (contatore >= 20) @{
+        stampa_pagina()
+        contatore = 0
+        NUMEROrighe = 0
+    @}
+    n = split($0, a, "\n")
+    for (i = 1; i <= n; i++)
+        riga[++NUMEROrighe] = a[i]
+    for (; i <= 5; i++)
+        riga[++NUMEROrighe] = ""
+    contatore++
+@}
+
+END @{
+    stampa_pagina()
+@}
+@c endfile
+@end example
+
+@node Programma utilizzo parole
+@subsection Generare statistiche sulla frequenza d'uso delle parole
+
+@cindex parole, statistica utilizzo delle
+@cindex statistica utilizzo delle parole
+
+Quando si lavora con una grande quantit@`a di testo, pu@`o essere interessante
+sapere quanto spesso ricorrono le diverse parole.  Per esempio, un autore pu@`o
+fare un uso eccessivo di certe parole, e in questo caso si potrebbero
+trovare sinonimi da sostituire a
+parole che appaiono troppo spesso.
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SUBSECTION} spiega come
+scrivere un programma per contare le parole e presentare in un formato
+utile le informazioni relative alla loro frequenza.
+
+A prima vista, un programma come questo sembrerebbe essere sufficiente:
+
+@example
+# wordfreq-first-try.awk --- stampa lista frequenze utilizzo parole
+
+@{
+    for (i = 1; i <= NF; i++)
+        freq[$i]++
+@}
+
+@group
+END @{
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word]
+@}
+@end group
+@end example
+
+Il programma si affida al meccanismo con cui @command{awk} divide i campi per
+default, per suddividere ogni riga in ``parole'' e usa un vettore associativo
+di nome @code{freq}, che ha per indici le singole parole, per contare il
+numero di volte che ogni parola viene usata. Nella regola @code{END}, stampa i
+contatori.
+
+Questo programma ha parecchi problemi che lo rendono praticamente inutile
+su file di testo reali:
+
+@itemize @value{BULLET}
+@item
+Il linguaggio @command{awk} considera i caratteri maiuscoli e minuscoli come
+distinti (non equivalenti).  Quindi, ``barista'' e ``Barista'' sono
+considerate parole differenti.  Questo non @`e un comportamento auspicabile,
+perch@'e le parole iniziano con la lettera maiuscola se sono a inizio frase in
+un testo normale, e un analizzatore di frequenze dovrebbe ignorare la
+distinzione maiuscolo/minuscolo.
+
+@item
+Le parole sono individuate usando la convenzione @command{awk} secondo cui i
+campi sono separati solo da spazi bianchi.  Altri caratteri nell'input
+(tranne il ritorno a capo) non hanno alcun particolare significato per
+@command{awk}.  Questo significa che i segni di interpunzione sono visti come
+parte di una parola.
+
+@item
+L'output non @`e scritto in alcun ordine utile.  Si @`e probabilmente pi@`u
+interessati a sapere quali parole ricorrono pi@`u di frequente, o ad avere
+una tabella in ordine alfabetico che mostra quante volte ricorre ogni parola.
+@end itemize
+
+@cindex @command{sort}, programma di utilit@`a
+@cindex programma di utilit@`a @command{sort}
+Il primo problema si pu@`o risolvere usando @code{tolower()} per rimuovere la
+distinzione maiuscolo/minuscolo.  Il secondo problema si pu@`o risolvere usando
+@code{gsub()} per rimuovere i caratteri di interpunzione.  Infine, per
+risolvere il terzo problema si pu@`o usare il programma di utilit@`a
+@command{sort} per elaborare l'output dello @dfn{script} @command{awk}.  Ecco la
+nuova versione del programma:
+
+@cindex @code{wordfreq.awk}, programma
+@cindex programma @code{wordfreq.awk}
+@example
+@c file eg/prog/wordfreq.awk
+# wordfreq.awk --- stampa la lista con la frequenza delle parole
+
+@{
+    $0 = tolower($0)    # togli maiuscolo/minuscolo
+    # togli interpunzione
+    gsub(/[^[:alnum:]_[:blank:]]/, "", $0)
+    for (i = 1; i <= NF; i++)
+        freq[$i]++
+@}
+
+@c endfile
+END @{
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word]
+@}
+@end example
+
+La @dfn{regexp} @code{/[^[:alnum:]_[:blank:]]/} si poteva scrivere come
+@code{/[[:punct:]]/}, ma in questo modo il caratteri trattino basso sarebbe
+stato rimosso, mentre si desidera conservarlo.
+
+Supponendo di aver salvato questo programma in un file di nome
+@file{wordfreq.awk},
+e che i dati siano in @file{file1}, il seguente comando con @dfn{pipeline}:
+
+@example
+awk -f wordfreq.awk file1 | sort -k 2nr
+@end example
+
+@noindent
+produce una tabella delle parole che appaiono in @file{file1} in ordine
+descrescente di frequenza.
+
+Il programma @command{awk} da solo gestisce adeguatamente i dati e produce
+una tabella delle frequenza che non @`e ordinata.
+L'output di @command{awk} @`e poi messo in ordine dal programma di utilit@`a
+@command{sort} e stampato sullo schermo.
+
+Le opzioni passate a @command{sort}
+richiedono un ordinamento che usi come chiave il secondo campo di ogni riga
+in input (saltando il primo campo), che le chiavi di ordinamento siano
+trattate come quantit@`a numeriche
+(altrimenti @samp{15} sarebbe stampato prima di @samp{5}), e che l'ordinamento
+sia fatto in ordine decrescente (inverso).
+
+Il comando @command{sort} potrebbe anche essere richiamato dall'interno del
+programma, cambiando l'azione da fare nella regola @code{END} a:
+
+@example
+@c file eg/prog/wordfreq.awk
+END @{
+    sort = "sort -k 2nr"
+    for (word in freq)
+        printf "%s\t%d\n", word, freq[word] | sort
+    close(sort)
+@}
+@c endfile
+@end example
+
+Questa maniera di ordinare dev'essere usata su sistemi che non hanno delle
+vere e proprie @dfn{pipe} a livello di riga di comando (o di procedura di
+comandi).
+Si veda la documentazione generale riguardo al sistema operativo per maggiori
+informazioni su come usare il programma @command{sort}.
+
+@node Programma riordino diario
+@subsection Eliminare duplicati da un file non ordinato
+
+@cindex righe, duplicate@comma{} rimuovere
+@cindex rimuovere righe duplicate
+Il programma @command{uniq}
+(@pxref{Programma uniq})
+rimuove righe duplicate da dati @emph{ordinati}.
+
+Si supponga, tuttavia, di dover rimuovere righe duplicate da un @value{DF},
+ma di voler conservare l'ordine in cui le righe sono state scritte.  Un buon
+esempio di questo tipo potrebbe essere un file della cronologia dei comandi
+della shell.  Il file della cronologia dei comandi
+mantiene copia di tutti i comandi che sono stati dati, e non @`e
+insolito ripetere un comando molte volte di fila.  Occasionalmente si
+potrebbe voler compattare la cronologia togliendo le righe duplicate.
+Tuttavia sarebbe opportuno mantenere l'ordine originale dei comandi.
+
+Questo semplice programma fa questo.  Usa due vettori.  Il vettore @code{dati}
+ha come indice il testo di ogni riga.
+Per ogni riga, @code{dati[$0]} @`e incrementato di uno.
+Se una particolare riga non @`e stata ancora vista, @code{dati[$0]} @`e zero.
+In tal caso, il testo della riga @`e immagazzinato in @code{righe[contatore]}.
+Ogni elemento del vettore @code{righe} @`e un comando unico, e gli
+indici di @code{righe} indicano l'ordine in cui quelle righe sono state
+incontrate.
+La regola @code{END} stampa semplicemente le righe, in ordine:
+
+@cindex Rakitzis, Byron
+@cindex @code{histsort.awk}, programma
+@cindex programma @code{histsort.awk}
+@example
+@c file eg/prog/histsort.awk
+# histsort.awk --- compatta un file della cronologia dei comandi della shell
+# Grazie a Byron Rakitzis per l'idea generale
+@c endfile
+@ignore
+@c file eg/prog/histsort.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+@c endfile
+@end ignore
+@c file eg/prog/histsort.awk
+
+@group
+@{
+    if (dati[$0]++ == 0)
+        righe[++contatore] = $0
+@}
+@end group
+
+@group
+END @{
+    for (i = 1; i <= contatore; i++)
+        print righe[i]
+@}
+@end group
+@c endfile
+@end example
+
+Questo programma pu@`o essere un punto di partenza per generare altre
+informazioni utili.
+Per esempio, usando la seguente istruzione @code{print} nella regola
+@code{END} permette di sapere quante volte viene usato un certo comando:
+
+@example
+print dati[righe[i]], righe[i]
+@end example
+
+@noindent
+Questo si pu@`o fare perch@'e @code{dati[$0]} @`e incrementato ogni volta che una
+riga @`e stata trovata.
+
+@node Programma extract
+@subsection Estrarre programmi da un file sorgente Texinfo
+
+@cindex Texinfo, estrarre programma da file sorgente
+@cindex estrarre programma da file sorgente Texinfo
+@cindex file Texinfo, estrarre programma da
+@ifnotinfo
+Sia questo capitolo che il precedente
+(@ref{Funzioni di libreria})
+presentano un numero elevato di programmi @command{awk}.
+@end ifnotinfo
+@ifinfo
+I nodi
+@ref{Funzioni di libreria},
+e @ref{Programmi di esempio},
+sono nodi al livello pi@`u elevato, e
+contengono nodi che descrivono un numero elevato di programmi @command{awk}.
+@end ifinfo
+Se si vuole fare pratica con questi programmi, @`e fastidioso doverli
+digitare di nuovo manualmente.  @`E per questo che abbiamo pensato a un programma
+in grado di estrarre parti di un file in input Texinfo e metterli in file
+separati.
+
+@cindex Texinfo
+Questo @value{DOCUMENT} @`e scritto in @uref{https://www.gnu.org/software/texinfo/, Texinfo},
+il programma di formattazione di documenti del progetto GNU.
+Un solo file sorgente Texinfo pu@`o essere usato per produrre sia la
+documentazione stampata, usando @TeX{}, sia quella online.
+@ifnotinfo
+(Texinfo @`e esaurientemente documentato nel libro
+@cite{Texinfo---The GNU Documentation Format},
+disponibile alla Free Software Foundation,
+e anche @uref{https://www.gnu.org/software/texinfo/manual/texinfo/, online}.)
+@end ifnotinfo
+@ifinfo
+(Il linguaggio Texinfo @`e descritto esaurientemente, a partire da
+@inforef{Top, , Texinfo, texinfo,Texinfo---The GNU Documentation Format}.)
+@end ifinfo
+
+Per quel che ci riguarda, @`e sufficiente sapere tre cose riguardo ai file di
+input Texinfo:
+
+@itemize @value{BULLET}
+@item
+Il simbolo ``chiocciola'' (@samp{@@}) @`e speciale per
+Texinfo, proprio come la barra inversa (@samp{\}) lo @`e per il linguaggio C
+o per @command{awk}.  I simboli @samp{@@} sono rappresentati nel sorgente
+Texinfo come @samp{@@@@}.
+
+@item
+I commenti iniziano con @samp{@@c} o con @samp{@@comment}.
+Il programma di estrazione file funziona usando dei commenti speciali che
+sono posti all'inizio di una riga.
+
+@item
+Righe contenenti comandi @samp{@@group} e @samp{@@end group} racchiudono testi
+di esempio che non dovrebbero andare a cavallo di due pagine.
+(Sfortunatamente, @TeX{} non @`e sempre in grado di fare le cose in maniera
+esatta, e quindi va un po' aiutato).
+@end itemize
+
+Il programma seguente, @file{extract.awk}, legge un file sorgente Texinfo
+e fa due cose, basandosi sui commenti speciali.
+Dopo aver visto il commento @samp{@w{@@c system @dots{}}},
+esegue un comando, usando il testo del comando contenuto nella
+riga di controllo e passandolo alla funzione @code{system()}
+(@pxref{Funzioni di I/O}).
+Dopo aver trovato il commento @samp{@@c file @var{nome_file}}, ogni riga
+successiva @`e spedita al file @var{nome_file}, fino a che si trova un
+commento @samp{@@c endfile}.
+Le regole in @file{extract.awk} sono soddisfatte sia quando incontrano
+@samp{@@c} che quando incontrano @samp{@@comment} e quindi la parte
+@samp{omment} @`e opzionale.
+Le righe che contengono @samp{@@group} e @samp{@@end group} sono semplicemente
+ignorate.
+@file{extract.awk} usa la funzione di libreria @code{join()}
+(@pxref{Funzione join}).
+
+I programmi di esempio nel sorgente Texinfo online di @cite{@value{TITLE}}
+(@file{gawktexi.in}) sono stati tutti inseriti tra righe @samp{file} e righe
+@samp{endfile}.  La distribuzione di @command{gawk} usa una copia di
+@file{extract.awk} per estrarre i programmi di esempio e per installarne
+molti in una particolare directory dove @command{gawk} li pu@`o trovare.
+Il file Texinfo ha un aspetto simile a questo:
+
+@example
+@dots{}
+Questo programma ha una regola @@code@{BEGIN@}
+che stampa un messaggio scherzoso:
+
+@@example
+@@c file esempi/messages.awk
+BEGIN @@@{ print "Non v'allarmate!" @@@}
+@@c endfile
+@@end example
+
+Stampa anche qualche avviso conclusivo:
+
+@@example
+@@c file esempi/messages.awk
+END @@@{ print "Evitate sempre gli archeologi annoiati!" @@@}
+@@c endfile
+@@end example
+@dots{}
+@end example
+
+Il programma @file{extract.awk} inizia con l'impostare @code{IGNORECASE} a
+uno, in modo che un miscuglio di lettere maiuscole e minuscole nelle direttive
+non faccia differenza.
+
+La prima regola gestisce le chiamate a @code{system()}, controllando che sia
+stato fornito un comando (@code{NF} dev'essere almeno tre) e controllando
+anche che il comando termini con un codice di ritorno uguale a zero, che sta
+a significare che tutto @`e andato bene:
+
+@cindex @code{extract.awk}, programma
+@cindex programma @code{extract.awk}
+@example
+@c file eg/prog/extract.awk
+# extract.awk --- estrae file ed esegue programmi dal file Texinfo
+@c endfile
+@ignore
+@c file eg/prog/extract.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised September 2000
+@c endfile
+@end ignore
+@c file eg/prog/extract.awk
+
+BEGIN    @{ IGNORECASE = 1 @}
+
+/^@@c(omment)?[ \t]+system/ @{
+    if (NF < 3) @{
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e  ": riga `system' con formato errato")
+        print e > "/dev/stderr"
+        next
+    @}
+    $1 = ""
+    $2 = ""
+    stat = system($0)
+    if (stat != 0) @{
+        e = ("extract: " FILENAME ":" FNR)
+        e = (e ": attenzione: system ha restituito " stat)
+        print e > "/dev/stderr"
+    @}
+@}
+@c endfile
+@end example
+
+@noindent
+La variabile @code{e} @`e stata usata per far s@`{@dotless{i}} che la regola
+sia agevolemente contenuta nella @value{PAGE}.
+
+La seconda regola gestisce il trasferimento di dati in un file.  Verifica che
+nella direttiva sia stato fornito un @value{FN}.
+Se il nome del file non @`e quello del file corrente, il file
+corrente viene chiuso.  Mantenere aperto il file corrente finch@'e non si trova
+un nuovo nome file permette di usare la ridirezione @samp{>} per stampare i
+contenuti nel file, semplificando la gestione dei file aperti.
+
+Il ciclo @code{for} esegue il lavoro.  Legge  le righe usando @code{getline}
+(@pxref{Getline}).
+Se si raggiunge una fine-file inattesa, viene chiamata la funzione
+@code{@w{fine_file_inattesa()}}.  Se la riga @`e una riga ``endfile'',
+il ciclo viene abbandonato.
+Se la riga inizia con @samp{@@group} o @samp{@@end group}, la riga viene
+ignorata, e si passa a quella seguente.  Allo stesso modo, eventuali commenti
+all'interno degli esempi vengono ignorati.
+
+Il grosso del lavoro @`e nelle poche righe che seguono.  Se la riga non ha
+simboli @samp{@@}, il programma la pu@`o
+stampare cos@`{@dotless{i}} com'@`e.  Altrimenti, ogni @samp{@@} a inizio parola dev'essere
+eliminato.
+Per rimuovere i simboli @samp{@@}, la riga viene divisa nei singoli elementi
+del vettore @code{a}, usando la funzione @code{split()}
+(@pxref{Funzioni per stringhe}).
+Il simbolo @samp{@@} @`e usato come carattere di separazione.
+Ogni elemento del vettore @code{a} che risulti vuoto indica due caratteri
+@samp{@@} contigui nella riga originale.  Per ogni due elementi vuoti
+(@samp{@@@@} nel file originale), va inserito un solo simbolo @samp{@@} nel
+file in output.
+
+Una volta terminato di esaminare il vettore, viene chiamata la funzione @code{join()}
+specificando nella chiamata il valore di @code{SUBSEP}
+(@pxref{Vettori multidimensionali}),
+per riunire nuovamente i pezzi in una riga sola.
+La riga @`e poi stampata nel file di output:
+
+@example
+@c file eg/prog/extract.awk
+/^@@c(omment)?[ \t]+file/ @{
+    if (NF != 3) @{
+        e = ("extract: " FILENAME ":" FNR ": riga `file' con formato errato")
+        print e > "/dev/stderr"
+        next
+    @}
+    if ($3 != file_corrente) @{
+        if (file_corrente != "")
+            lista_file[file_corrente] = 1   # memorizza per chiudere dopo
+        file_corrente = $3
+    @}
+
+    for (;;) @{
+        if ((getline riga) <= 0)
+            fine_file_inattesa()
+        if (riga ~ /^@@c(omment)?[ \t]+endfile/)
+            break
+        else if (riga ~ /^@@(end[ \t]+)?group/)
+            continue
+        else if (riga ~ /^@@c(omment+)?[ \t]+/)
+            continue
+        if (index(riga, "@@") == 0) @{
+            print riga > file_corrente
+            continue
+        @}
+        n = split(riga, a, "@@")
+        # if a[1] == "", vuol dire riga che inizia per @@,
+        # non salvare un @@
+        for (i = 2; i <= n; i++) @{
+            if (a[i] == "") @{ # era un @@@@
+                a[i] = "@@"
+                if (a[i+1] == "")
+                    i++
+            @}
+        @}
+@group
+        print join(a, 1, n, SUBSEP) > file_corrente
+    @}
+@}
+@end group
+@c endfile
+@end example
+
+@`E importante notare l'uso della ridirezione @samp{>} .
+L'output fatto usando @samp{>} apre il file solo la prima volta; il file resta
+poi aperto, e ogni scrittura successiva @`e aggiunta in fondo al file.
+(@pxref{Ridirezione}).
+Ci@`o rende agevole mischiare testo del programma e commenti esplicativi
+(come @`e stato fatto qui) nello stesso file sorgente, senza nessun problema.
+Il file viene chiuso solo quando viene trovato un nuovo nome di
+@value{DF} oppure alla fine del file in input.
+
+Quando si incontra un nuovo @value{FN}, invece di chiudere il file,
+il programma memorizza il nome del file corrente in @code{lista_file}.
+Ci@`o rende possibile mischiare il codice per pi@`u di un file nel file
+sorgente Texinfo in input.  (Precedenti versioni di questo programma
+chiudevano @emph{davvero} il file.  Ma, a causa della ridirezione
+@samp{>}, un file le cui parti non erano tutte una di seguito all'altra
+finiva per contenere errori.)
+Una regola @code{END} effettua la chiusura di tutti i file aperti, quando
+l'elaborazione @`e stata completata:
+
+@example
+@c file eg/prog/extract.awk
+@group
+END @{
+    close(file_corrente)    # chiudi l'ultimo file
+    for (f in lista_file)   # chiudi tutti gli altri
+        close(f)
+@}
+@end group
+@c endfile
+@end example
+
+Per finire, la funzione @code{@w{fine_file_inattesa()}} stampa un
+appropriato messaggio di errore ed esce:
+
+@example
+@c file eg/prog/extract.awk
+@group
+function fine_file_inattesa()
+@{
+    printf("extract: %s:%d: fine-file inattesa, o errore\n",
+                     FILENAME, FNR) > "/dev/stderr"
+    exit 1
+@}
+@end group
+@c endfile
+@end example
+
+@node Programma sed semplice
+@subsection Un semplice editor di flusso
+
+@cindex @command{sed}, programma di utilit@`a
+@cindex programma di utilit@`a @command{sed}
+@cindex editori di flusso
+@cindex flusso, editori di
+Il programma di utilit@`a @command{sed} @`e un @dfn{editore di flusso},
+ovvero un programma che legge un flusso di dati, lo modifica, e scrive il file
+cos@`{@dotless{i}} modificato.
+@`E spesso usato per fare modifiche generalizzate a un grosso file, o a un
+flusso di dati generato da una @dfn{pipeline} di comandi.
+Sebbene @command{sed} sia un programma piuttosto complesso di suo, l'uso che
+se ne fa solitamente @`e di effettuare delle sostituzioni globali attraverso
+una @dfn{pipeline}:
+
+@example
+@var{comando1} < dati.originali | sed 's/vecchio/nuovo/g' | @var{comando2} > risultato
+@end example
+
+Qui, @samp{s/vecchio/nuovo/g} chiede a @command{sed} di ricercare la
+@dfn{regexp} @samp{vecchio} in ogni riga di input e di sostituirla
+dappertutto con il testo @samp{nuovo} (cio@`e, in tutte le occorrenze di
+ciascuna riga).  Questo @`e simile a quello che fa la funzione di @command{awk}
+@code{gsub()}
+(@pxref{Funzioni per stringhe}).
+
+Il programma seguente, @file{awksed.awk}, accetta almeno due argomenti dalla
+riga di comando: l'espressione da ricercare e il testo con cui rimpiazzarla.
+Ogni ulteriore argomento @`e considerato
+come un nome di @value{DF} da elaborare. Se non ne viene fornito alcuno, si
+usa lo standard input:
+
+@cindex Brennan, Michael
+@cindex @command{awksed.awk}, programma
+@cindex programma @command{awksed.awk}
+@c @cindex simple stream editor
+@c @cindex stream editor, simple
+@example
+@c file eg/prog/awksed.awk
+# awksed.awk --- fa s/pippo/pluto/g usando solo print
+#    Ringraziamenti a Michael Brennan per l'idea
+@c endfile
+@ignore
+@c file eg/prog/awksed.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# August 1995
+@c endfile
+@end ignore
+@c file eg/prog/awksed.awk
+
+function sintassi()
+@{
+    print "sintassi: awksed espressione rimpiazzo [file...]" > "/dev/stderr"
+    exit 1
+@}
+
+@group
+BEGIN @{
+    # valida argomenti
+    if (ARGC < 3)
+        sintassi()
+@end group
+
+    RS = ARGV[1]
+    ORS = ARGV[2]
+
+    # non usare argomenti come nomi di file
+    ARGV[1] = ARGV[2] = ""
+@}
+
+@group
+# guarda, mamma, senza mani!
+@{
+    if (RT == "")
+        printf "%s", $0
+    else
+        print
+@}
+@end group
+@c endfile
+@end example
+
+Il programma fa assegnamento sulla capacit@`a di @command{gawk} di avere come
+@code{RS} una @dfn{regexp},
+e anche sul fatto che @code{RT} viene impostato al testo che effettivamente
+delimita il record (@pxref{Record}).
+
+L'idea @`e di usare @code{RS} come espressione da ricercare.  @command{gawk}
+automaticamente imposta @code{$0} al testo che compare tra due corrispondenze
+all'espressione di ricerca.
+Questo @`e appunto il testo che vogliamo conservare inalterato.  Quindi,
+impostando @code{ORS} al testo che si vuole sostituire, una semplice
+istruzione @code{print} scrive il testo che si vuole mantenere, seguito dal
+testo che si vuole invece sostituire.
+
+C'@`e un problema in questo schema, ossia cosa fare se l'ultimo record
+non termina con un testo che corrisponde a @code{RS}.  Usando un'istruzione
+@code{print} incondizionatamente stampa il testo da sostituire, il che non
+@`e corretto.
+Tuttavia, se il file non termina con del testo che corrisponde a @code{RS},
+@code{RT} @`e impostata alla stringa nulla.  In tal caso, si pu@`o stampare
+@code{$0} usando @code{printf}
+(@pxref{Printf}).
+
+La regola @code{BEGIN} gestisce la preparazione, controllando che ci sia
+il numero giusto di argomenti e chiamando @code{sintassi()} se c'@`e un problema.
+Poi imposta @code{RS} e @code{ORS} dagli argomenti della riga di comando e
+imposta @code{ARGV[1]} e @code{ARGV[2]} alla stringa nulla, per impedire che
+vengano considerati dei @value{FNS}
+(@pxref{ARGC e ARGV}).
+
+La funzione @code{sintassi()} stampa un messaggio di errore ed esce.
+Per finire, l'unica regola gestisce lo schema di stampa delineato pi@`u sopra,
+usando @code{print} o @code{printf} come richiesto, a seconda del valore di
+@code{RT}.
+
+@node Programma igawk
+@subsection Una maniera facile per usare funzioni di libreria
+
+@cindex libreria di funzioni @command{awk}, programma di esempio per usare
+@cindex funzioni, librerie di, programma di esempio per usare
+@iftex
+Nella
+@end iftex
+@ifnottex
+In
+@end ifnottex
+@ref{Includere file}, abbiamo visto come @command{gawk} preveda la
+possibilit@`a di includere file.  Tuttavia, questa @`e un'estensione @command{gawk}.
+Questa @value{SECTION} evidenzia l'utilit@`a di rendere l'inclusione di
+file disponibile per @command{awk} standard, e mostra come farlo utilizzando
+una combinazione di programmazione di shell e di @command{awk}.
+
+Usare funzioni di libreria in @command{awk} pu@`o presentare molti vantaggi.
+Incoraggia il riutilizzo di codice e la scrittura di funzioni di tipo
+generale.  I programmi sono pi@`u snelli e quindi pi@`u comprensibili.
+Tuttavia, usare funzioni di libreria @`e facile solo in fase di scrittura di
+programmi @command{awk}; @`e invece complicato al momento di eseguirli,
+rendendo necessario specificare molte opzioni @option{-f}.  Se @command{gawk}
+non @`e disponibile, non lo sono neppure la variabile d'ambiente @env{AWKPATH} e
+la possibilit@`a di conservare funzioni @command{awk} in una directory di
+libreria (@pxref{Opzioni}).
+Sarebbe bello poter scrivere programmi nel modo seguente:
+
+@example
+# funzioni di libreria
+@@include getopt.awk
+@@include join.awk
+@dots{}
+
+# programma principale
+BEGIN @{
+    while ((c = getopt(ARGC, ARGV, "a:b:cde")) != -1)
+        @dots{}
+    @dots{}
+@}
+@end example
+
+Il programma seguente, @file{igawk.sh}, fornisce questo servizio.
+Simula la ricerca da parte di @command{gawk} della variabile d'ambiente
+@env{AWKPATH} e permette anche delle inclusioni @dfn{nidificate} (cio@`e,
+un file che @`e stato incluso tramite
+@code{@@include} pu@`o contenere ulteriori istruzioni @code{@@include}).
+@command{igawk} tenta di includere ogni file una volta sola, in modo che delle
+inclusioni nidificate non contengano accidentalmente una funzione di libreria
+pi@`u di una volta.
+
+@command{igawk} dovrebbe comportarsi esternamente proprio come @command{gawk}.
+Questo vuol dire che dovrebbe accettare sulla riga di comando tutti gli
+argomenti di @command{gawk}, compresa
+la capacit@`a di specificare pi@`u file
+sorgenti tramite l'opzione @option{-f}
+e la capacit@`a di mescolare istruzioni da riga di comando e file di sorgenti di
+libreria.
+
+Il programma @`e scritto usando il linguaggio della Shell POSIX
+(@command{sh}).@footnote{Una spiegazione dettagliata del linguaggio della
+@command{sh} non rientra negli intenti di questo libro.  Qualche spiegazione
+sommaria viene fornita, ma se si desidera una comprensione pi@`u dettagliata, si
+dovrebbe consultare un buon libro sulla programmazione della shell.}
+Il funzionamento @`e il seguente:
+
+@enumerate
+@item
+Esegue un ciclo attraverso gli argomenti, salvando tutto ci@`o che non si presenta come
+codice sorgente @command{awk}, per quando il programma espanso sar@`a eseguito.
+
+@item
+Per ogni argomento che rappresenta del codice @command{awk}, mette l'argomento
+in una variabile di shell che verr@`a espansa.  Ci sono due casi:
+
+@enumerate a
+@item
+Un testo letterale, fornito con l'opzione @option{-e} o @option{--source}.
+Questo testo viene aggiunto direttamente in fondo.
+
+@item
+@value{FNS} sorgenti, forniti con l'opzione @option{-f}.  Usiamo il trucchetto
+di aggiungere @samp{@@include @var{nome_file}} in fondo ai contenuti della
+variabile di shell.  Poich@'e il programma di inclusione dei file funziona
+allo stesso modo in cui funziona @command{gawk}, ne risulta che il file viene
+incluso nel programma al punto giusto.
+@end enumerate
+
+@item
+Esegue un programma (naturalmente @command{awk}) sui contenuti della variabile
+di shell per espandere le istruzioni
+@code{@@include}.  Il programma espanso @`e messo in una seconda variabile di
+shell.
+
+@item
+Esegue il programma espanso richiamando @command{gawk} e tutti gli altri
+argomenti originalmente forniti dall'utente sulla riga di comando (come p.es.
+dei nomi di @value{DF}).
+@end enumerate
+
+Questo programma usa variabili di shell in quantit@`a: per immagazzinare
+argomenti della riga di comando e
+il testo del programma @command{awk} che espander@`a il programma dell'utente,
+per il programma originale dell'utente e per il programma espanso.  Questo
+modo di procedere risolve potenziali
+problemi che potrebbero presentarsi se si usassero invece dei file temporanei,
+ma rende lo @dfn{script} un po' pi@`u complicato.
+
+La parte iniziale del programma attiva il tracciamento della shell se il primo
+argomento @`e @samp{debug}.
+
+La parte successiva esegue un ciclo che esamina ogni argomento della riga di
+comando.
+Ci sono parecchi casi da esaminare:
+
+@c @asis for docbook
+@table @asis
+@item @option{--}
+Quest'opzione termina gli argomenti per @command{igawk}.  Tutto quel che segue
+dovrebbe essere passato al programma @command{awk} dell'utente senza essere
+preso in considerazione.
+
+@item @option{-W}
+Questo indica che l'opzione successiva @`e propria di @command{gawk}.  Per
+facilitare l'elaborazione degli argomenti, l'opzione @option{-W} @`e aggiunta
+davanti agli argomenti rimanenti, e il
+ciclo continua.  (Questo @`e un trucco di programmazione della @command{sh}.
+Non @`e il caso di preoccuparsene se non si ha familiarit@`a con il comando
+@command{sh}.)
+
+@item @option{-v}, @option{-F}
+Queste opzioni sono conservate e lasciate da gestire a @command{gawk}.
+
+@item @option{-f}, @option{--file}, @option{--file=}, @option{-Wfile=}
+Il @value{FN} @`e aggiunto alla variabile di shell @code{programma}, insieme
+a un'istruzione @code{@@include}.
+Il programma di utilit@`a @command{expr} @`e usato per eliminare la parte
+iniziale dell'argomento (p.es., @samp{--file=}).
+(La sintassi tipica di @command{sh} richiederebbe di usare il comando
+@command{echo} e il programma di utilit@`a @command{sed} per far questo.
+Sfortunatamente, alcune versioni di @command{echo} valutano le sequenze
+di protezione contenute nei loro argomenti, e questo potrebbe finire per
+alterare il testo del programma.
+L'uso di @command{expr} evita questo problema.)
+
+@item @option{--source}, @option{--source=}, @option{-Wsource=}
+Il testo sorgente @`e aggiunto in fondo a @code{programma}.
+
+@item @option{--version}, @option{-Wversion}
+@command{igawk} stampa il proprio numero di versione, esegue
+@samp{gawk --version} per ottenere l'informazione relativa alla versione di
+@command{gawk}, ed esce.
+@end table
+
+Se nessuno degli argomenti
+@option{-f}, @option{--file}, @option{-Wfile}, @option{--source},
+o @option{-Wsource} @`e stato fornito, il primo argomento che non @`e un'opzione
+dovrebbe essere il programma @command{awk}.  Se non ci sono argomenti rimasti
+sulla riga di comando, @command{igawk} stampa un messaggio di errore ed esce.
+Altrimenti, il primo argomento @`e aggiunto in fondo a @code{programma}.
+In qualsiasi caso, dopo che gli argomenti sono stati elaborati,
+la variabile di shell
+@code{programma} contiene il testo completo del programma  originale
+@command{awk}.
+
+Il programma @`e il seguente:
+
+@cindex @code{igawk.sh}, programma
+@cindex programma @code{igawk.sh}
+@example
+@c file eg/prog/igawk.sh
+#! /bin/sh
+# igawk --- come gawk ma abilita l'uso di @@include
+@c endfile
+@ignore
+@c file eg/prog/igawk.sh
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# July 1993
+# December 2010, minor edits
+@c endfile
+@end ignore
+@c file eg/prog/igawk.sh
+
+if [ "$1" = debug ]
+then
+    set -x
+    shift
+fi
+
+# Un ritorno a capo letterale,
+# per formattare correttamente il testo del programma
+n='
+'
+
+# Inizializza delle variabili alla stringa nulla
+programma=
+opts=
+
+while [ $# -ne 0 ] # ciclo sugli argomenti
+do
+    case $1 in
+    --)     shift
+            break ;;
+
+    -W)     shift
+            # Il costrutto $@{x?'messaggio qui'@} stampa un
+            # messaggio diagnostico se $x @`e la stringa nulla
+            set -- -W"$@{@@?'manca operando'@}"
+            continue ;;
+
+    -[vF])  opts="$opts $1 '$@{2?'manca operando'@}'"
+            shift ;;
+
+    -[vF]*) opts="$opts '$1'" ;;
+
+    -f)     programma="$programma$n@@include $@{2?'manca operando'@}"
+            shift ;;
+
+    -f*)    f=$(expr "$1" : '-f\(.*\)')
+            programma="$programma$n@@include $f" ;;
+
+    -[W-]file=*)
+            f=$(expr "$1" : '-.file=\(.*\)')
+            programma="$programma$n@@include $f" ;;
+
+    -[W-]file)
+            programma="$programma$n@@include $@{2?'manca operando'@}"
+            shift ;;
+
+    -[W-]source=*)
+            t=$(expr "$1" : '-.source=\(.*\)')
+            programma="$programma$n$t" ;;
+
+    -[W-]source)
+            programma="$programma$n$@{2?'manca operando'@}"
+            shift ;;
+
+    -[W-]version)
+            echo igawk: version 3.0 1>&2
+            gawk --version
+            exit 0 ;;
+
+    -[W-]*) opts="$opts '$1'" ;;
+
+    *)      break ;;
+    esac
+    shift
+done
+
+if [ -z "$programma" ]
+then
+     programma=$@{1?'manca programma'@}
+     shift
+fi
+
+# A questo punto, `programma' contiene il programma.
+@c endfile
+@end example
+
+Il programma @command{awk} che elabora le direttive @code{@@include}
+@`e immagazzinato nella variabile di shell @code{progr_che_espande}.  Ci@`o serve
+a mantenere leggibile lo @dfn{script}.  Questo programma @command{awk} legge
+tutto il programma dell'utente, una riga per volta, usando @code{getline}
+(@pxref{Getline}).  I @value{FNS} in input e le istruzioni @code{@@include}
+sono gestiti usando una pila.  Man mano che viene trovata una @code{@@include},
+il valore corrente di @value{FN} @`e
+``spinto'' sulla pila e il file menzionato nella direttiva @code{@@include}
+diventa il @value{FN} corrente.  Man mano che un file @`e finito,
+la pila viene ``disfatta'', e il precedente file in input diventa nuovamente il
+file in input corrente.  Il processo viene iniziato ponendo il file originale
+come primo file sulla pila.
+
+La funzione @code{percorso()} trova qual @`e il percorso completo di un file.
+Simula il comportamento di @command{gawk} quando utilizza la variabile
+d'ambiente @env{AWKPATH}
+(@pxref{AWKPATH (Variabile)}).
+Se un @value{FN} contiene una @samp{/}, non viene effettuata la ricerca del
+percorso.  Analogamente, se il
+@value{FN} @`e @code{"-"}, viene usato senza alcuna modifica.  Altrimenti,
+il @value{FN} @`e concatenato col nome di ogni directory nella lista dei
+percorsi, e vien fatto un tentativo per aprire il @value{FN} cos@`{@dotless{i}} generato.
+Il solo modo di controllare se un file @`e leggibile da @command{awk} @`e di
+andare avanti e tentare di leggerlo con
+@code{getline}; questo @`e quel che
+@code{percorso()} fa.@footnote{In alcune versioni molto datate di
+@command{awk}, il test @samp{getline da_buttare < t} pu@`o ripetersi in un ciclo
+infinito se il file esiste ma @`e vuoto.}
+Se il file pu@`o essere letto, viene chiuso e viene restituito il valore di
+@value{FN}:
+
+@ignore
+An alternative way to test for the file's existence would be to call
+@samp{system("test -r " t)}, which uses the @command{test} utility to
+see if the file exists and is readable.  The disadvantage to this method
+is that it requires creating an extra process and can thus be slightly
+slower.
+@end ignore
+
+@example
+@c file eg/prog/igawk.sh
+progr_che_espande='
+
+function percorso(file,    i, t, da_buttare)
+@{
+    if (index(file, "/") != 0)
+        return file
+
+    if (file == "-")
+        return file
+
+    for (i = 1; i <= n_dir; i++) @{
+        t = (lista_percorsi[i] "/" file)
+@group
+        if ((getline da_buttare < t) > 0) @{
+            # found it
+            close(t)
+            return t
+        @}
+@end group
+    @}
+    return ""
+@}
+@c endfile
+@end example
+
+Il programma principale @`e contenuto all'interno di una regola @code{BEGIN}.
+La prima cosa che fa @`e di impostare il vettore @code{lista_percorsi} usato
+dalla funzione @code{percorso()}.  Dopo aver diviso la lista usando come
+delimitatore @samp{:}, gli elementi nulli sono sostituiti da @code{"."},
+che rappresenta la directory corrente:
+
+@example
+@c file eg/prog/igawk.sh
+BEGIN @{
+    percorsi = ENVIRON["AWKPATH"]
+    n_dir = split(percorsi, lista_percorsi, ":")
+    for (i = 1; i <= n_dir; i++) @{
+        if (lista_percorsi[i] == "")
+            lista_percorsi[i] = "."
+    @}
+@c endfile
+@end example
+
+La pila @`e inizializzata con @code{ARGV[1]}, che sar@`a @code{"/dev/stdin"}.
+Il ciclo principale viene subito dopo.  Le righe in input sono lette una dopo
+l'altra.  Righe che non iniziano con @code{@@include} sono stampate cos@`{@dotless{i}} come
+sono.
+Se la riga inizia con @code{@@include}, il @value{FN} @`e in @code{$2}.
+La funzione @code{percorso()} @`e chiamata per generare il percorso completo.
+Se questo non riesce, il programma stampa un messaggio di errore e continua.
+
+Subito dopo occorre controllare se il file sia gi@`a stato incluso.  Il vettore
+@code{gia_fatto} @`e indicizzato dal nome completo di ogni @value{FN} incluso
+e tiene traccia per noi di questa informazione.  Se un file viene visto pi@`u
+volte, viene stampato un messaggio di avvertimento.  Altrimenti il nuovo
+@value{FN} @`e aggiunto alla pila e l'elaborazione continua.
+
+Infine, quando @code{getline} giunge alla fine del file in input, il file
+viene chiuso, e la pila viene elaborata.  Quando @code{indice_pila} @`e minore
+di zero, il programma @`e terminato:
+
+@example
+@c file eg/prog/igawk.sh
+    indice_pila = 0
+    input[indice_pila] = ARGV[1] # ARGV[1] @`e il primo file
+
+    for (; indice_pila >= 0; indice_pila--) @{
+        while ((getline < input[indice_pila]) > 0) @{
+            if (tolower($1) != "@@include") @{
+                print
+                continue
+            @}
+            cammino = percorso($2)
+            if (cammino == "") @{
+                printf("igawk: %s:%d: non riesco a trovare %s\n",
+                    input[indice_pila], FNR, $2) > "/dev/stderr"
+                continue
+            @}
+            if (! (cammino in gia_fatto)) @{
+                gia_fatto[cammino] = input[indice_pila]
+                input[++indice_pila] = cammino  # aggiungilo alla pila
+            @} else
+                print $2, "incluso in", input[indice_pila],
+                    "era gi@`a incluso in",
+                    gia_fatto[cammino] > "/dev/stderr"
+        @}
+        close(input[indice_pila])
+    @}
+@}'  # l'apice chiude la variabile `progr_che_espande'
+
+programma_elaborato=$(gawk -- "$progr_che_espande" /dev/stdin << EOF
+$programma
+EOF
+)
+@c endfile
+@end example
+
+Il costrutto di shell @samp{@var{comando} << @var{marcatore}} @`e chiamato
+@dfn{here document} (@dfn{documento sul posto}).  Ogni riga presente nello
+script di shell fino al @var{marcatore} @`e passato in input a @var{comando}.
+La shell elabora i contenuti dell'@dfn{here document} sostituendo, dove serve,
+variabili e comandi (ed eventualmente altre cose, a seconda della shell
+in uso).
+
+Il costrutto di shell @samp{$(@dots{})} @`e chiamato @dfn{sostituzione di comando}.
+L'output del comando posto all'interno delle parentesi @`e sostituito
+nella riga di comando.
+Poich@'e il risultato @`e usato in un assegnamento di variabile,
+viene salvato come un'unica stringa di caratteri, anche se il risultato
+contiene degli spazi bianchi.
+
+Il programma espanso @`e salvato nella variabile @code{programma_elaborato}.
+Il tutto avviene secondo le fasi seguenti:
+
+@enumerate
+@item
+Si esegue @command{gawk} con il programma che gestisce le @code{@@include}
+(il valore della variabile di shell
+@code{progr_che_espande}) leggendo lo standard input.
+
+@item
+Lo standard input contiene il programma dell'utente,
+nella variabile di shell @code{programma}.
+L'input @`e passato a @command{gawk} tramite un @dfn{here document}.
+
+@item
+I risultati di questo processo sono salvati nella variabile di shell
+@code{programma_elaborato} usando la sostituzione di comando.
+@end enumerate
+
+L'ultima fase @`e la chiamata a @command{gawk} con il programma espanso,
+insieme alle opzioni originali e agli argomenti della riga di comando che
+l'utente aveva fornito:
+
+@example
+@c file eg/prog/igawk.sh
+eval gawk $opts -- '"$programma_elaborato"' '"$@@"'
+@c endfile
+@end example
+
+Il comando @command{eval} @`e una struttura della shell che riesegue
+l'elaborazione dei parametri della riga di comando.  Gli apici proteggono le
+parti restanti.
+
+Questa versione di @command{igawk} @`e la quinta versione di questo programma.
+Ci sono quattro semplificazioni migliorative:
+
+@itemize @value{BULLET}
+@item
+L'uso di @code{@@include} anche per i file specificati tramite l'opzione
+@option{-f} consente di semplificare di molto la preparazione del programma
+iniziale @command{awk}; tutta l'elaborazione delle istruzioni @code{@@include}
+pu@`o essere svolta in una sola volta.
+
+@item
+Non tentare di salvare la riga letta tramite @code{getline} all'interno della
+funzione @code{percorso()} quando si controlla se il file @`e accessibile
+per il successivo uso nel programma principale semplifica notevolmente
+le cose.
+
+@item
+Usare un ciclo di @code{getline} nella regola @code{BEGIN} rende possibile
+fare tutto in un solo posto.  Non @`e necessario programmare un ulteriore ciclo
+per elaborare le istruzioni @code{@@include} nidificate.
+
+@item
+Invece di salvare il programma espanso in un file temporaneo, assegnarlo a
+una variabile di shell evita alcuni potenziali problemi di sicurezza.
+Ci@`o per@`o ha lo svantaggio di basare lo @dfn{script} su funzionalit@`a del
+linguaggio @command{sh}, il che rende pi@`u difficile la comprensione a chi non
+abbia familiarit@`a con il comando
+@command{sh}.
+@end itemize
+
+Inoltre, questo programma dimostra come spesso valga la pena di utilizzare
+insieme la programmazione della @command{sh} e quella di @command{awk}.
+Solitamente, si pu@`o fare parecchio senza dover ricorrere alla programmazione
+di basso livello in C o C++, ed @`e spesso pi@`u facile fare certi tipi di
+manipolazioni di stringhe e argomenti  usando la shell, piuttosto che
+@command{awk}.
+
+Infine, @command{igawk} dimostra che non @`e sempre necessario aggiungere nuove
+funzionalit@`a a un programma; queste possono spesso essere aggiunte in
+cima.@footnote{@command{gawk}
+@`e in grado di elaborare istruzioni @code{@@include} al suo stesso interno, per
+permettere l'uso di programmi @command{awk} come @dfn{script} Web CGI.}
+
+
+@node Programma anagram
+@subsection Trovare anagrammi da una lista di parole
+
+@cindex anagrammi, trovare
+Un'interessante sfida per il programmatore @`e quella di cercare @dfn{anagrammi} in una
+lista di parole (come
+@file{/usr/share/dict/italian} presente in molti sistemi GNU/Linux).
+Una parola @`e un anagramma di un'altra se entrambe le parole contengono
+le stesse lettere
+(p.es., ``branzino'' e ``bronzina'').
+
+La Colonna 2, Problema C, della seconda edizione del libro di Jon Bentley
+@cite{Programming Pearls}, presenta un algoritmo elegante.
+L'idea @`e di assegnare a parole che sono anagrammi l'una dell'altra una
+firma comune, e poi di ordinare tutte le parole in base alla loro
+firma e di stamparle.
+Il Dr.@: Bentley fa notare che prendere tutte le lettere di ogni parola ed
+elencarle in ordine alfabetico produce queste firme comuni.
+
+Il programma seguente usa vettori di vettori per riunire
+parole con la stessa firma,  e l'ordinamento di vettori per stampare le
+parole trovate in ordine alfabetico:
+
+@cindex @code{anagram.awk}, programma
+@cindex programma @code{anagram.awk}
+@example
+@c file eg/prog/anagram.awk
+# anagram.awk --- Un'implementazione dell'algoritmo per trovare anagrammi
+#                 dalla seconda edizione
+#                 del libro di Jon Bentley "Programming Pearls".
+#                 Addison Wesley, 2000, ISBN 0-201-65788-0.
+#                 Colonna 2, Problema C, sezione 2.8, pp 18-20.
+@c endfile
+@ignore
+@c file eg/prog/anagram.awk
+#
+# Questo programma richiede gawk 4.0 o una versione successiva.
+# Funzionalit@`a di gawk richieste:
+#   - veri vettori multidimensionali
+#   - split() con separatore "" per separare ogni singolo carattere
+#   - le funzioni asort() e asorti()
+#
+# Vedere https://savannah.gnu.org/projects/gawk.
+#
+# Arnold Robbins
+# arnold@@skeeve.com
+# Public Domain
+# January, 2011
+@c endfile
+@end ignore
+@c file eg/prog/anagram.awk
+
+/'s$/   @{ next @}        # Salta i genitivi sassoni
+@c endfile
+@end example
+
+Il programma inizia con un'intestazione, e poi una regola per saltare
+i genitivi sassoni eventualmente contenuti nel file che contiene la lista di
+parole. La regola
+successiva costruisce la struttura dei dati.  Il primo indice del vettore
+@`e rappresentato dalla firma; il secondo @`e la parola stessa:
+
+@example
+@c file eg/prog/anagram.awk
+@{
+    chiave = da_parola_a_chiave($1)  # costruisce la firma
+    data[chiave][$1] = $1  # Immagazzina parola con questa firma
+@}
+@c endfile
+@end example
+
+La funzione @code{da_parola_a_chiave()} crea la firma.
+Divide la parola in lettere singole, mette in ordine alfabetico le lettere,
+e poi le rimette ancora insieme:
+
+@example
+@c file eg/prog/anagram.awk
+# da_parola_a_chiave --- divide parole in lettere, ordina e riunisce
+
+function da_parola_a_chiave(parola,     a, i, n, risultato)
+@{
+    n = split(parola, a, "")
+    asort(a)
+
+    for (i = 1; i <= n; i++)
+        risultato = risultato a[i]
+
+    return risultato
+@}
+@c endfile
+@end example
+
+Infine, la regola @code{END} percorre tutto il vettore e stampa
+le liste degli anagrammi.  L'output @`e poi passato al
+comando di sistema @command{sort} perch@'e altrimenti gli
+anagrammi sarebbero elencati in ordine arbitrario:
+
+@example
+@c file eg/prog/anagram.awk
+END @{
+    sort = "sort"
+    for (chiave in data) @{
+        # ordina parole con la stessa chiave
+        n_parole = asorti(data[chiave], parole)
+        if (n_parole == 1)
+            continue
+
+        # e stampa. Problema minore: uno spazio extra a fine di ogni riga
+        for (j = 1; j <= n_parole; j++)
+            printf("%s ", parole[j]) | sort
+        print "" | sort
+    @}
+    close(sort)
+@}
+@c endfile
+@end example
+
+Ecco una piccola parte dell'output quando il programma @`e eseguito:
+
+@example
+$ @kbd{gawk -f anagram.awk /usr/share/dict/italian | grep '^b'}
+@dots{}
+baraste bastare serbata
+barasti basarti
+baratro tabarro
+barattoli ribaltato tribolata
+barbieri birberia
+barche brache
+barcollerei corbelleria
+bare erba
+bareremmo brameremo
+barili librai
+@dots{}
+@end example
+
+
+@node Programma signature
+@subsection E ora per qualcosa di completamente differente
+
+@cindex @code{signature}, programma
+@cindex programma @code{signature}
+@cindex Brini, Davide
+Il programma seguente @`e stato scritto da Davide Brini
+@c (@email{dave_br@@gmx.com})
+ed @`e pubblicato sul @uref{http://backreference.org/2011/02/03/obfuscated-awk/,
+suo sito web}.
+Serve come sua firma nel gruppo Usenet @code{comp.lang.awk}.
+Questi sono i termini da lui stabiliti per il copyright:
+
+@quotation
+Copyright @copyright{} 2008 Davide Brini
+
+Copying and distribution of the code published in this page, with or without
+modification, are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+@end quotation
+
+Ecco il programma:
+
+@example
+@group
+awk 'BEGIN@{O="~"~"~";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),x-O@}'
+@end group
+@end example
+@c genera l'email del tizio:
+@c dave_br@gmx.com
+
+@cindex Johansen, Chris
+Viene lasciato al lettore il piacere di stabilire cosa fa il programma.
+(Se si @`e sull'orlo della disperazione nel tentativo di comprensione, si veda
+la spiegazione di Chris Johansen,
+che @`e contenuta nel file sorgente Texinfo di questo @value{DOCUMENT}.)
+
+@ignore
+To: "Arnold Robbins" <arnold@skeeve.com>
+Date: Sat, 20 Aug 2011 13:50:46 -0400
+Subject: The GNU Awk User's Guide, Section 13.3.11
+From: "Chris Johansen" <johansen@main.nc.us>
+Message-ID: <op.v0iw6wlv7finx3@asusodin.thrudvang.lan>
+
+Arnold, tu non mi conosci, ma c'@`e un sottile legame tra noi.  Mia moglie @`e
+Barbara A. Field, FAIA, GIT '65 (B. Arch.).
+
+Ho un paio di copie cartacee di "Effective Awk Programming" da
+anni, ed ora sto leggendo di nuovo la versione Kindle di "The GNU Awk User's
+Guide".  Quando sono arrivato alla sezione 13.3.11, ho riformattato e
+brevemente commentato lo @dfn{script} di firma di Davide Brin per comprenderne il funzionamento.
+
+Mi pare che questo possa avere un valore pedagogico come esempio
+(sia pure imperfetto) del significato di spazi bianchi e commenti, e un
+punto di partenza per una tale discussione.  Sicuramente ha aiutato _me_ a
+capire quel che succede.  Se vuoi
+usarlo, com'@`e o modificato, sentiti libero di farlo (a condizione di
+rispettare i vincoli posti da Davide, naturalmente, che credo siano stati
+da me rispettati).
+
+Se dovessi includere questa spiegazione in una futura edizione, la inserirei
+a una certa distanza dalla sezione 13.3.11, diciamo come una nota o come
+un'appendice, in modo da non rivelare immediatamente la soluzione dell'enigma.
+
+Cordiali saluti,
+--
+Chris Johansen {johansen at main dot nc dot us}
+  . . . collapsing the probability wave function, sending ripples of
+certainty through the space-time continuum.
+
+
+#! /usr/bin/gawk -f
+
+# Da "13.3.11 E ora per qualcosa di completamente differente"
+#   https://www.gnu.org/software/gawk/manual/html_node/Signature-Program.html#Signature-Program
+
+# Copyright @copyright{} 2008 Davide Brini
+
+# Copying and distribution of the code published in this page, with
+# or without modification, are permitted in any medium without
+# royalty provided the copyright notice and this notice are preserved.
+
+BEGIN {
+  O = "~" ~ "~";    #  1
+  o = "==" == "=="; #  1
+  o += +o;          #  2
+  x = O "" O;       # 11
+
+
+  while ( X++ <= x + o + o ) c = c "%c";
+
+  # O vale  1
+  # o vale  2
+  # x vale 11
+  # X vale 17
+  # c vale "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"
+
+  printf c,
+    ( x - O )*( x - O),                  # 100 d
+    x*( x - o ) - o,                     #  97 a
+    x*( x - O ) + x - O - o,             # 118 v
+    +x*( x - O ) - x + o,                # 101 e
+    X*( o*o + O ) + x - O,               #  95 _
+    X*( X - x ) - o*o,                   #  98 b
+    ( x + X )*o*o + o,                   # 114 r
+    x*( X - x ) - O - O,                 #  64 @
+    x - O + ( O + o + X + x )*( o + O ), # 103 g
+    X*X - X*( x - O ) - x + O,           # 109 m
+    O + X*( o*( o + O ) + O ),           # 120 x
+    +x + O + X*o,                        #  46 .
+    x*( x - o),                          #  99 c
+    ( o + X + x )*o*o - ( x - O - O ),   # 111 0
+    O + ( X - x )*( X + O ),             # 109 m
+    x - O                                #  10 \n
+}
+@end ignore
+
+@node Sommario dei programmi
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+I programmi illustrati in questo @value{CHAPTER}
+ripropongo la tesi secondo cui leggere programmi @`e una maniera eccellente
+per imparare a fare della buona programmazione.
+
+@item
+Usare @samp{#!} per rendere i programmi @command{awk} direttamente eseguibili
+ne rende pi@`u semplice l'uso.  In alternativa, si pu@`o invocare un
+programma usando @samp{awk -f @dots{}}.
+
+@item
+Reimplementare programmi POSIX standard in @command{awk} @`e un esercizio
+piacevole; il potere espressivo di @command{awk} consente di scrivere tali
+programmi usando relativamente poche righe di codice, nonostante i programmi
+risultanti siano funzionalmente completi e utilizzabili.
+
+@item
+Una delle debolezze della versione standard di @command{awk} riguarda il
+lavorare con singoli caratteri.  La possibilit@`a di usare @code{split()} con
+la stringa nulla come separatore pu@`o semplificare considerevolmente tale
+compito.
+
+@item
+Gli esempi proposti dimostrano l'utilit@`a delle funzioni di libreria introdotte
+@iftex
+nel
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Funzioni di libreria}
+per un numero (sia pur piccolo) di programmi reali.
+
+@item
+Oltre a reinventare la ruota POSIX, altri programmi risolvono una serie di
+problemi interessanti, come trovare delle parole duplicate in un testo,
+stampare etichette per lettere, e trovare anagrammi.
+
+@end itemize
+
+@c EXCLUDE START
+@node Esercizi sui programmi
+@section Esercizi
+
+@enumerate
+@item
+Riscrivere @file{cut.awk} (@pxref{Programma cut})
+usando @code{split()} con @code{""} come separatore.
+
+@item
+@iftex
+Nella
+@end iftex
+@ifnottex
+In
+@end ifnottex
+@ref{Programma egrep}, @`e detto che @samp{egrep -i} potrebbe essere
+simulato in versioni di @command{awk} che non prevedono @code{IGNORECASE}
+usando @code{tolower()} sulla riga e nei criteri di ricerca. In una nota a
+pi@`e di pagina @`e anche detto che questa soluzione ha un problema: in output
+viene scritta la riga tradotta (a lettere minuscole), e non quella originale.
+Risolvere questo problema.
+@c Exercise: Fix this, w/array and new line as key to original line
+
+@item
+La versione POSIX di @command{id} accetta opzioni che controllano quali
+informazioni stampare.  Modificare la versione @command{awk}
+(@pxref{Programma id}) per accettare gli stessi argomenti e funzionare allo
+stesso modo.
+
+@item
+Il programma @code{split.awk} (@pxref{Programma split}) presuppone che le
+lettere siano contigue nella codifica dei caratteri,
+il che non @`e vero per sistemi che usano la codifica EBCDIC.
+Risolvere questo problema.
+(Suggerimento: Considerare un modo diverso di analizzare l'alfabeto,
+senza appoggiarsi sulle funzioni @code{ord()} e @code{chr()}.)
+
+@item
+Nel programma @file{uniq.awk} (@pxref{Programma uniq}, la
+logica per scegliere quali righe stampare rappresenta una
+@dfn{macchina a stati},
+ossia ``un dispositivo che pu@`o essere in uno di un insieme di stati
+stabili, a seconda dello stato in cui si trovava in precedenza, e del
+valore corrente dei suoi
+input.''@footnote{Questo @`e la definizione trovata usando
+@code{define: state machine} come chiave di ricerca in Google.}
+Brian Kernighan suggerisce che
+``un approccio alternativo alle macchine a stati @`e di leggere tutto l'input
+e metterlo in un vettore, e quindi usare gli indici.  @`E quasi sempre pi@`u
+semplice da programmare, e per la maggior parte degli input in cui si pu@`o
+usare, altrettanto veloce in esecuzione.''  Riscrivere la logica del
+programma seguendo questa indicazione.
+
+
+@item
+Perch@'e il programma @file{wc.awk} (@pxref{Programma wc}) non pu@`o
+limitarsi a usare il valore di @code{FNR} nella funziona @code{a_fine_file()}?
+Suggerimento: Esaminare il codice
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Funzione filetrans}.
+
+@ignore
+@command{wc} can't just use the value of @code{FNR} in
+@code{endfile()}. If you examine the code in @ref{Filetrans Function},
+you will see that @code{FNR} has already been reset by the time
+@code{endfile()} is called.
+@end ignore
+
+@item
+La manipolazione di singoli caratteri nel programma @command{translate}
+(@pxref{Programma translate}) @`e farraginosa usando le funzione standard
+@command{awk}.  Poich@'e @command{gawk} pu@`o dividere stringhe in caratteri
+singoli usando come separatore @code{""}, come si potrebbe usare questa
+funzionalit@`a per semplificare il programma?
+
+@item
+Il programma @file{extract.awk} (@pxref{Programma extract}) @`e stato
+scritto prima che @command{gawk} avesse a disposizione la funzione
+@code{gensub()}.  Usarla per semplificare il codice.
+
+@item
+Si confronti la velocit@`a di esecuzione del programma @file{awksed.awk}
+(@pxref{Programma sed semplice}) con il pi@`u diretto:
+
+@example
+BEGIN @{
+    stringa = ARGV[1]
+    rimpiazzo = ARGV[2]
+    ARGV[1] = ARGV[2] = ""
+@}
+
+@{ gsub(stringa, rimpiazzo); print @}
+@end example
+
+@item
+Quali sono vantaggi e svantaggi di @file{awksed.awk} rispetto al vero
+programma di utilit@`a @command{sed}?
+
+@ignore
+  Advantage: egrep regexps
+             speed (?)
+  Disadvantage: no & in replacement text
+
+Others?
+@end ignore
+
+@item
+@iftex
+Nella
+@end iftex
+@ifnottex
+In
+@end ifnottex
+@ref{Programma igawk}, si @`e detto che non tentando di salvare la riga
+letta con @code{getline} nella funzione @code{percorso()}, mentre si
+controlla l'accessibilit@`a del file da usare nel programma principale,
+semplifica notevolmente le cose.  Quale problema @`e peraltro generato cos@`{@dotless{i}}
+facendo?
+@c answer, reading from "-" o /dev/stdin
+
+@cindex percorso di ricerca per file sorgente
+@cindex ricerca, percorso di, per file sorgente
+@cindex file sorgente, percorso di ricerca per
+@cindex directory, ricerca
+@item
+Come ulteriore esempio dell'idea che non sempre @`e necessario aggiungere
+nuove funzionalit@`a a un programma, si consideri l'idea di avere due file in
+una directory presente nel percorso di ricerca:
+
+@table @file
+@item default.awk
+Questo file contiene un insieme di funzioni di libreria di default, come
+@code{getopt()} e @code{assert()}.
+
+@item sito.awk
+Questo file contiene funzioni di libreria che sono specifiche di
+un sito o di un'installazione; cio@`e, funzioni sviluppate localmente.
+Mantenere due file separati consente a @file{default.awk} di essere
+modificato in seguito a nuove versioni di @command{gawk}, senza che
+l'amministratore di sistema debba ogni volta aggiornarlo aggiungendo le
+funzioni locali.
+@end table
+
+Un utente
+@c Karl Berry, karl@ileaf.com, 10/95
+ha suggerito che @command{gawk} venga modificato per leggere automaticamente
+questi file alla partenza.  Piuttosto, sarebbe molto semplice
+modificare @command{igawk} per farlo.  Poich@'e @command{igawk} @`e capace di
+elaborare direttive @code{@@include}
+nidificate, @file{default.awk} potrebbe contenere semplicemente la lista di
+direttive @code{@@include} con le funzioni di libreria desiderate.
+Fare questa modifica.
+
+@item
+Modificare @file{anagram.awk} (@pxref{Programma anagram}), per evitare di
+usare il programma di utilit@`a esterno @command{sort}.
+
+@end enumerate
+@c EXCLUDE END
+
+@ifnotinfo
+@part @value{PART3}Andare oltre @command{awk} con @command{gawk}
+@end ifnotinfo
+
+@ifdocbook
+La Parte III riguarda funzionalit@`a proprie di @command{gawk}.
+Contiene i seguenti capitoli:
+
+@itemize @value{BULLET}
+@item
+@ref{Spazi di nomi}
+
+@item
+@ref{Funzionalit@`a avanzate}
+
+@item
+@ref{Internazionalizzazione}
+
+@item
+@ref{Debugger}
+
+@item
+@ref{Calcolo con precisione arbitraria}
+
+@item
+@ref{Estensioni dinamiche}
+@end itemize
+@end ifdocbook
+
+@node Funzionalit@`a avanzate
+@chapter Funzionalit@`a avanzate di @command{gawk}
+@cindex @command{gawk}, funzionalit@`a avanzate
+@cindex avanzate, funzionalit@`a, di @command{gawk}
+@ignore
+Contributed by: Peter Langston <pud!psl@bellcore.bellcore.com>
+
+    Found in Steve English's "signature" line:
+
+"Write documentation as if whoever reads it is a violent psychopath
+who knows where you live."
+@end ignore
+@cindex Langston, Peter
+@cindex English, Steve
+@quotation
+@i{Scrivete la documentazione supponendo che chiunque la legger@`a sia uno psicopatico
+violento, che conosce il vostro indirizzo di casa.}
+@author Steve English, citato da Peter Langston
+@end quotation
+
+Questo @value{CHAPTER} tratta delle funzionalit@`a avanzate in @command{gawk}.
+@`E un po' come un ``pacco sorpresa'' di argomenti che non sono collegati tra di
+loro in altro modo.
+Per prima cosa, vediamo un'opzione da riga di comando che consente a
+@command{gawk} di riconoscere i numeri non-decimali nei dati in input, e non
+soltanto nei programmi @command{awk}.
+Poi vengono illustrate delle funzionalit@`a speciali di @command{gawk} per
+l'ordinamento di vettori.  Quindi viene trattato dettagliatamente l'I/O
+bidirezionale, di cui si @`e fatto cenno in precedenti parti di questo
+@value{DOCUMENT}, assieme ai fondamenti sulle reti TCP/IP.
+Infine, vediamo come @command{gawk}
+pu@`o tracciare il @dfn{profilo} di un programma @command{awk}, cos@`{@dotless{i}} che si
+possa ritoccarlo per migliorarne le prestazioni.
+
+@c FULLXREF ON
+Altre funzionalit@`a avanzate vengono trattate separatamente dedicando un
+@value{CHAPTER} per ciascuna di esse:
+
+@itemize @value{BULLET}
+@item
+@iftex
+Il
+@end iftex
+@ref{Internazionalizzazione}, parla di come internazionalizzare
+i propri programmi @command{awk}, in modo che parlino pi@`u lingue
+nazionali.
+
+@item
+@iftex
+Il
+@end iftex
+@ref{Debugger}, descrive il debugger dalla riga di comando disponibile
+all'interno di
+@command{gawk} per individuare errori nei programmi @command{awk}.
+
+@item
+@iftex
+Il
+@end iftex
+@ref{Calcolo con precisione arbitraria}, illustra come si pu@`o usare
+@command{gawk} per eseguire calcoli con precisione arbitraria.
+
+@item
+@iftex
+Il
+@end iftex
+@ref{Estensioni dinamiche},
+tratta della capacit@`a di aggiungere dinamicamente nuove funzioni predefinite a
+@command{gawk}.
+@end itemize
+@c FULLXREF OFF
+
+@menu
+* Dati non decimali::           Consentire dati di input non decimali.
+* Ordinamento di vettori::      Modi per controllare la visita di un vettore
+                                e il suo ordinamento.
+* I/O bidirezionale::           Comunicazione bidirezionale con un altro
+                                processo.
+* Reti TCP/IP::                 Usare @command{gawk} per programmazione di rete.
+* Profilare::                   Profilare i propri programmi @command{awk}.
+* Sommario funzionalit@`a avanzate:: Sommario delle funzionalit@`a avanzate.
+@end menu
+
+@node Dati non decimali
+@section Consentire dati di input non decimali
+@cindex opzione @option{--non-decimal-data}
+@c @cindex funzionalit@`a avanzate, dati di input non decimali
+@cindex input, dati non decimali
+@cindex costanti, non decimali
+
+Se si esegue @command{gawk} con l'opzione @option{--non-decimal-data},
+si possono avere valori in base diversa da dieci nei dati di input:
+
+@example
+$ @kbd{echo 0123 123 0x123 |}
+> @kbd{gawk --non-decimal-data '@{ printf "%d, %d, %d\n", $1, $2, $3 @}'}
+@print{} 83, 123, 291
+@end example
+
+Affinch@'e questa funzionalit@`a sia disponibile, i programmi devono essere
+scritti in modo che @command{gawk} tratti i dati come valori numerici:
+
+@example
+$ @kbd{echo 0123 123 0x123 | gawk '@{ print $1, $2, $3 @}'}
+@print{} 0123 123 0x123
+@end example
+
+@noindent
+L'istruzione @code{print} tratta le sue espressioni come se fossero stringhe.
+Sebbene i campi possano comportarsi come numeri, quando necessario,
+essi rimangono sempre stringhe, per cui @code{print} non cerca di elaborarli
+come se fossero numeri.  Si deve aggiungere zero a un campo affich@'e venga
+considerato come un numero.  Per esempio:
+
+@example
+$ @kbd{echo 0123 123 0x123 | gawk --non-decimal-data '}
+> @kbd{@{ print $1, $2, $3}
+>   @kbd{print $1 + 0, $2 + 0, $3 + 0 @}'}
+@print{} 0123 123 0x123
+@print{} 83 123 291
+@end example
+
+Poich@'e capita comunemente di avere dati di tipo decimale con degli zeri iniziali,
+e poich@'e l'uso di questa funzionalit@`a pu@`o portare a risultati inattesi, il
+comportamento di default @`e quello lasciarla disabilitata.  Se si vuole, la si
+deve richiedere esplicitamente.
+
+@cindex programmazione, convenzioni di, opzione @code{--non-decimal-data}
+@cindex @option{--non-decimal-data}, opzione, funzione @code{strtonum()} e
+@cindex @code{strtonum()}, funzione (@command{gawk}), opzione @code{--non-decimal-data} e
+@quotation ATTENZIONE
+@emph{L'uso di questa opzione non @`e consigliata.}
+Pu@`o provocare errori molto seri eseguendo vecchi programmi.
+Al suo posto @`e meglio usare la funzione @code{strtonum()} per convertire i dati
+(@pxref{Funzioni per stringhe}).
+Questo rende i programmi pi@`u facili da scrivere e pi@`u facili da leggere, e
+porta a risultati meno inattesi.
+
+Quest'opzione potrebbe sparire dalle versioni future di @command{gawk}.
+@end quotation
+
+@node Ordinamento di vettori
+@section Controllare la visita di un vettore e il suo ordinamento
+
+@command{gawk} permette di controllare l'ordine con cui un ciclo
+@samp{for (@var{indice} in @var{vettore})}
+attraversa un vettore.
+
+Inoltre, due funzioni predefinite, @code{asort()} e @code{asorti()},
+permettono di mettere in ordine i vettori sulla base, rispettivamente, dei
+valori e degli indici del vettore.  Queste due funzioni danno anche il
+controllo sui criteri in base ai quali riordinare gli elementi del vettore.
+
+@menu
+* Controllare visita vettori::  Come usare PROCINFO["sorted_in"].
+* Funzioni di ordinamento di vettori:: Come usare @code{asort()} e @code{asorti()}.
+@end menu
+
+@node Controllare visita vettori
+@subsection Controllare visita vettori
+
+Per default, l'ordine secondo il quale un ciclo @samp{for (@var{indice} in
+@var{vettore})} scorre un vettore non @`e definito; in genere si basa
+sull'implementazione interna dei vettori all'interno di @command{awk}.
+
+Spesso, tuttavia, si vorrebbe poter eseguire un ciclo sugli elementi in un
+determinato ordine scelto dall'utente programmatore.  Con @command{gawk}
+si pu@`o fare.
+
+@iftex
+La
+@end iftex
+@ref{Controllare visita} parla di come si possono assegnare valori speciali
+predefiniti a @code{PROCINFO["sorted_in"]} per controllare l'ordine secondo il
+quale @command{gawk} attraversa un vettore
+durante un ciclo @code{for}.
+
+Inoltre, il valore di @code{PROCINFO["sorted_in"]} pu@`o essere un nome di
+funzione.@footnote{Questo @`e il motivo per cui gli ordinamenti predefiniti
+iniziano con il carattere @samp{@@}, che non pu@`o essere usato in un
+identificativo.}
+Questo consente di scorrere un vettore sulla base di un qualsiasi criterio
+personalizzato. Gli elementi del vettore vengono ordinati in accordo col valore
+ritornato da questa funzione.  La funzione che fa il confronto dovrebbe essere
+definita con almeno quattro argomenti:
+
+@example
+function confronta(i1, v1, i2, v2)
+@{
+    @var{confronta gli elementi 1 e 2 in qualche modo}
+    @var{return < 0; 0; o > 0}
+@}
+@end example
+
+Qui, @code{i1} e @code{i2} sono gli indici, e @code{v1} e @code{v2}
+sono i corrispondenti valori dei due elementi che si stanno confrontando.
+@code{v1} oppure @code{v2}, o entrambi, possono essere vettori se il vettore
+che si sta visitando contiene sottovettori come valori.
+(@xref{Vettori di vettori} per maggiori informazioni sui sottovettori.)
+I tre possibili codici di ritorno sono interpretati nel seguente modo:
+
+@table @code
+@item confronta(i1, v1, i2, v2) < 0
+L'indice @code{i1} viene prima dell'indice @code{i2} durante l'avanzamento
+del ciclo.
+
+@item confronta(i1, v1, i2, v2) == 0
+Gli indici @code{i1} e @code{i2}
+sono equivalenti, ma l'ordine tra loro non @`e definito.
+
+@item confronta(i1, v1, i2, v2) > 0
+L'indice @code{i1} viene dopo l'indice @code{i2} durante l'avanzamento del
+ciclo.
+@end table
+
+La prima funzione di confronto pu@`o essere usata per scorrere un vettore
+secondo l'ordine numerico degli indici:
+
+@example
+@group
+function cfr_ind_num(i1, v1, i2, v2)
+@{
+     # confronto di indici numerici, ordine crescente
+     return (i1 - i2)
+@}
+@end group
+@end example
+
+La seconda funzione scorre un vettore secondo l'ordine delle stringhe
+dei valori degli elementi piuttosto che secondo gli indici:
+
+@example
+function cfr_val_str(i1, v1, i2, v2)
+@{
+    # confronto di valori di stringa, ordine crescente
+    v1 = v1 ""
+    v2 = v2 ""
+    if (v1 < v2)
+        return -1
+    return (v1 != v2)
+@}
+@end example
+
+La terza funzione di confronto restituisce dapprima tutti i numeri, e dopo
+questi le stringhe numeriche senza spazi iniziali o finali, durante
+l'avanzamento del ciclo:
+
+@example
+function cfr_val_num_str(i1, v1, i2, v2,   n1, n2)
+@{
+     # confronto mettendo i numeri prima dei valori di stringa,
+     # ordine crescente
+     n1 = v1 + 0
+     n2 = v2 + 0
+     if (n1 == v1)
+         return (n2 == v2) ? (n1 - n2) : -1
+     else if (n2 == v2)
+         return 1
+     return (v1 < v2) ? -1 : (v1 != v2)
+@}
+@end example
+
+Qui vediamo un programma principale che mostra come @command{gawk}
+si comporta usando ciascuna delle funzioni precedenti:
+
+@example
+BEGIN @{
+    data["uno"] = 10
+    data["due"] = 20
+    data[10] = "uno"
+    data[100] = 100
+    data[20] = "due"
+
+    f[1] = "cfr_ind_num"
+    f[2] = "cfr_val_str"
+    f[3] = "cfr_val_num_str"
+    for (i = 1; i <= 3; i++) @{
+        printf("Funzione di ordinamento: %s\n", f[i])
+        PROCINFO["sorted_in"] = f[i]
+        for (j in data)
+            printf("\tdata[%s] = %s\n", j, data[j])
+        print ""
+    @}
+@}
+@end example
+
+I risultati dell'esecuzione del programma sono questi:
+
+@example
+$ @kbd{gawk -f compdemo.awk}
+@print{} Funzione di ordinamento: cfr_ind_num @ii{Ordinamento per indice numerico}
+@print{}     data[uno] = 10
+@print{}     data[due] = 20      @ii{Entrambe le stringhe sono numericamente zero}
+@print{}     data[10] = uno
+@print{}     data[20] = due
+@print{}     data[100] = 100
+@print{}
+@print{} Funzione di ordinamento: cfr_val_str  @ii{Ordinamento per valore degli}
+@print{}                                         @ii{elementi come stringhe}
+@print{}     data[uno] = 10
+@print{}     data[100] = 100        @ii{La stringa 100 @`e minore della stringa 20}
+@print{}     data[due] = 20
+@print{}     data[20] = due
+@print{}     data[10] = uno
+@print{}
+@print{} Funzione di ordinamento: cfr_val_num_str  @ii{Ordinamento con tutti i}
+@print{}                        @ii{valori numerici prima di tutte le stringhe}
+@print{}     data[uno] = 10
+@print{}     data[due] = 20
+@print{}     data[100] = 100
+@print{}     data[20] = due
+@print{}     data[10] = uno
+@end example
+
+Si provi a ordinare gli elementi di un file delle password del sistema GNU/Linux
+in base al nome d'accesso dell'utente.  Il seguente programma ordina i record
+secondo una specifica posizione del campo e pu@`o essere usato per questo scopo:
+
+@example
+# passwd-sort.awk --- semplice programma per ordinare in base alla
+# posizione del campo
+# la posizione del campo @`e specificata dalla variabile globale POS
+
+function per_campo(i1, v1, i2, v2)
+@{
+    # confronto per valore, come stringa, e in ordine crescente
+    return v1[POS] < v2[POS] ? -1 : (v1[POS] != v2[POS])
+@}
+
+@{
+    for (i = 1; i <= NF; i++)
+        a[NR][i] = $i
+@}
+
+@group
+END @{
+    PROCINFO["sorted_in"] = "per_campo"
+@end 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 ? ":" : "")
+        print ""
+    @}
+@}
+@end example
+
+Il primo campo di ogni elemento del file delle password @`e il nome d'accesso
+dell'utente, e i campi sono separati tra loro da due punti (@code{:}).
+Ogni record definisce un sottovettore,
+con ogni campo come elemento nel sottovettore.
+L'esecuzione del programma produce
+il seguente output:
+
+@example
+$ @kbd{gawk -v POS=1 -F: -f sort.awk /etc/passwd}
+@print{} adm:x:3:4:adm:/var/adm:/sbin/nologin
+@print{} apache:x:48:48:Apache:/var/www:/sbin/nologin
+@print{} avahi:x:70:70:Avahi daemon:/:/sbin/nologin
+@dots{}
+@end example
+
+Il confronto normalmente dovrebbe restituire sempre lo stesso valore quando
+vien dato come argomento un preciso paio di elementi del vettore.  Se viene
+restituito un risultato non coerente, l'ordine @`e indefinito.  Questo
+comportamento pu@`o essere sfruttato per introdurre un ordinamento casuale in
+dati apparentemente ordinati:
+
+@example
+function ordina_a_caso(i1, v1, i2, v2)
+@{
+    # ordine casuale (attenzione: potrebbe non finire mai!)
+    return (2 - 4 * rand())
+@}
+@end example
+
+Come gi@`a accennato, l'ordine degli indici @`e arbitrario se due elementi
+risultano uguali.  Normalmente questo non @`e un problema, ma lasciare che
+elementi di uguale valore compaiano in ordine arbitrario pu@`o essere un
+problema, specialmente quando si confrontano valori di elementi di un elenco.
+L'ordine parziale di elementi uguali pu@`o cambiare quando il vettore viene
+visitato di nuovo, se nel vettore vengono aggiunti o rimossi elementi.  Un modo
+per superare l'ostacolo quando si confrontano elementi con valori uguali @`e
+quello di includere gli indici nelle regole di confronto.  Si noti che questo
+potrebbe rendere meno efficiente l'attraversamento del ciclo, per cui si
+consiglia di farlo solo se necessario.  Le seguenti funzioni di confronto
+impongono un ordine deterministico, e si basano sul fatto che gli indici
+(di stringa) di due elementi non sono mai uguali:
+@example
+function per_numero(i1, v1, i2, v2)
+@{
+    # confronto di valori numerici (e indici), ordine decrescente
+    return (v1 != v2) ? (v2 - v1) : (i2 - i1)
+@}
+
+@group
+function per_stringa(i1, v1, i2, v2)
+@{
+    # confronto di valori di stringa (e indici), ordine decrescente
+    v1 = v1 i1
+    v2 = v2 i2
+    return (v1 > v2) ? -1 : (v1 != v2)
+@}
+@end group
+@end example
+
+@c Avoid using the term ``stable'' when describing the unpredictable behavior
+@c if two items compare equal.  Usually, the goal of a "stable algorithm"
+@c is to maintain the original order of the items, which is a meaningless
+@c concept for a list constructed from a hash.
+
+Una funzione di confronto personalizzata spesso pu@`o semplificare
+l'attraversamento del
+ciclo ordinato, e il solo limite @`e il cielo, quando si va a progettare
+una funzione di questo tipo.
+
+Quando i confronti tra stringhe son fatti durante un'operazione di ordinamento,
+per valori di elementi che, uno o entrambi, non sono numeri, o per
+indici di elementi gestiti come stringhe, il valore di @code{IGNORECASE}
+(@pxref{Variabili predefinite}) controlla se
+i confronti trattano corrispondenti lettere maiuscole e minuscole
+come equivalenti o come distinte.
+
+Un'altra cosa da tenere a mente @`e che nel caso di sottovettori, i valori degli
+elementi possono essere a loro volta dei vettori; una funzione di confronto in
+produzione dovrebbe usare la funzione @code{isarray()}
+(@pxref{Funzioni per i tipi})
+per controllare ci@`o, e scegliere un ordinamento preciso per i sottovettori.
+
+Tutti gli ordinamenti basati su @code{PROCINFO["sorted_in"]}
+sono disabilitati in modalit@`a POSIX,
+perch@'e il vettore @code{PROCINFO} in questo caso non @`e speciale.
+
+Come nota a margine, si @`e visto che ordinare gli indici del vettore prima di
+scorrere il vettore porta a un incremento variabile dal 15% al 20% del tempo di
+esecuzione dei programmi @command{awk}. Per questo motivo l'attraversamento
+ordinato di vettori non @`e il default.
+
+@c The @command{gawk}
+@c maintainers believe that only the people who wish to use a
+@c feature should have to pay for it.
+
+@node Funzioni di ordinamento di vettori
+@subsection Ordinare valori e indici di un vettore con @command{gawk}
+
+@cindex vettori, ordinamento dei
+@cindexgawkfunc{asort}
+@cindex @code{asort()}, funzione (@command{gawk}), ordinamento di vettori
+@cindex funzione @code{asort()} (@command{gawk}), ordinamento di vettori
+@cindexgawkfunc{asorti}
+@cindex @code{asorti()}, funzione (@command{gawk}), ordinamento di vettori
+@cindex funzione @code{asorti()} (@command{gawk}), ordinamento di vettori
+@cindex @code{sort()}, funzione, ordinamento di vettori
+@cindex funzione @code{sort()}, ordinamento di vettori
+Nella maggior parte delle implementazioni di @command{awk}, ordinare un vettore
+richiede una funzione @code{sort()}.  Questo pu@`o essere istruttivo per provare
+diversi algoritmi di ordinamento, ma normalmente non @`e questo lo scopo del
+programma.  In @command{gawk} ci sono le funzioni predefinite @code{asort()} e
+@code{asorti()} (@pxref{Funzioni per stringhe}) per i vettori ordinati.
+Per esempio:
+
+@example
+@var{riempire il vettore} dati
+n = asort(dati)
+for (i = 1; i <= n; i++)
+    @var{fare qualcosa con} dati[i]
+@end example
+
+Dopo la chiamata ad @code{asort()}, il vettore @code{dati} @`e indicizzato da 1
+a @var{n}, il numero totale di elementi in @code{dati}.
+(Questo conteggio @`e il codice di ritorno di @code{asort()}).
+@code{dati[1]} @value{LEQ} @code{dati[2]} @value{LEQ} @code{dati[3]}, e cos@`{@dotless{i}}
+via.  Il confronto di default @`e basato sul tipo di elementi
+(@pxref{Tipi di variabile e confronti}).
+Tutti i valori numerici vengono prima dei valori di stringa,
+che a loro volta vengono prima di tutti i sottovettori.
+
+@cindex effetti collaterali, funzione @code{asort()}
+@cindex funzione @code{asort()}, effetti collaterali
+Un effetto collaterale rilevante nel chiamare @code{asort()} @`e che
+@emph{gli indici originali del vettore vengono persi irreparabilmente}.
+Poich@'e questo non sempre @`e opportuno, @code{asort()} accetta un
+secondo argomento:
+
+@example
+@var{populate the array} orig
+n = asort(orig, dest)
+for (i = 1; i <= n; i++)
+    @var{fai qualcosaa con} dest[i]
+@end example
+
+In questo caso, @command{gawk} copia il vettore @code{orig} nel vettore
+@code{dest} e ordina @code{dest}, distruggendo i suoi indici.
+Tuttavia il vettore @code{orig} non viene modificato.
+
+Spesso, ci@`o di cui si ha bisogno @`e di ordinare per i valori degli
+@emph{indici} invece che per i valori degli elementi.  Per far questo si usa la
+funzione @code{asorti()}.  L'interfaccia e il comportamento sono identici a
+quelli di @code{asort()}, solo che per l'ordinamento vengono usati i valori
+degli indici, che diventano i valori del vettore risultato:
+
+@example
+@{ orig[$0] = una_funz($0) @}
+
+END @{
+    n = asorti(orig, dest)
+    for (i = 1; i <= n; i++) @{
+        @ii{Lavora direttamente con gli indici ordinati:}
+        @var{fa qualcosa con} dest[i]
+        @dots{}
+        @ii{Accede al vettore originale attraverso gli indici ordinati:}
+        @var{fa qualcosa con} orig[dest[i]]
+    @}
+@}
+@end example
+
+Fin qui, tutto bene. Ora inizia la parte interessante.  Sia @code{asort()}
+che @code{asorti()} accettano un terzo argomento di stringa per controllare il
+confronto di elementi del vettore.  Quando abbiamo introdotto @code{asort()} e
+@code{asorti()} nella @ref{Funzioni per stringhe}, abbiamo ignorato questo terzo
+argomento; comunque, @`e giunto il momento di descrivere come questo argomento
+influenza queste due funzioni.
+
+Fondamentalmente, il terzo argomento specifica come dev'essere ordinato il
+vettore.  Ci sono due possibilit@`a.  Come per @code{PROCINFO["sorted_in"]},
+quest'argomento pu@`o essere uno degli argomenti predefiniti che @command{gawk}
+fornisce (@pxref{Controllare visita}), o pu@`o essere il nome di una funzione
+definita dall'utente (@pxref{Controllare visita vettori}).
+
+Nell'ultimo caso, @emph{la funzione pu@`o confrontare gli elementi in qualunque
+modo si voglia}, prendendo in considerazione solo gli indici, solo i valori,
+o entrambi.  Questo @`e estremamente potente.
+
+Una volta che il vettore @`e ordinato, @code{asort()} prende i @emph{valori} nel
+loro ordine finale e li usa per riempire il vettore risultato, mentre
+@code{asorti()} prende gli @emph{indici} nel loro ordine finale e li usa per
+riempire il vettore risultato.
+
+@cindex conteggio riferimenti, ordinamento vettori
+@quotation NOTA
+Copiare indici ed elementi non @`e dispendioso in termini di memoria.
+Internamente, @command{gawk} mantiene un @dfn{conteggio dei riferimenti} ai
+dati.  Per esempio, dopo che @code{asort()} copia il primo vettore nel
+secondo, in memoria c'@`e ancora una sola copia dei dati degli elementi
+del vettore originale, ed entrambi i vettori accedono all'unica copia di
+valori che esiste in memoria.
+@end quotation
+
+@c Document It And Call It A Feature. Sigh.
+@cindex @command{gawk}, variabile @code{IGNORECASE} in
+@cindex vettori, ordinamento, variabile @code{IGNORECASE} e
+@cindex @code{IGNORECASE}, variabile, funzioni di ordinamento dei vettori e
+@cindex variabile @code{IGNORECASE}, funzioni di ordinamento dei vettori e
+Poich@'e @code{IGNORECASE} influenza i confronti tra stringhe, il valore di
+@code{IGNORECASE} influisce anche sull'ordinamento sia con @code{asort()} che
+con @code{asorti()}.
+Si noti inoltre che l'ordinamento della localizzazione @emph{non} entra in
+gioco; i confronti sono basati solamente sul valore dei
+caratteri.@footnote{Ci@`o @`e vero perch@'e il confronto basato sulla localizzazione
+avviene solo quando si @`e in modalit@`a POSIX-compatibile, e poich@'e @code{asort()}
+e @code{asorti()} sono estensioni di @command{gawk}, esse non sono disponibili
+in quel caso.}
+
+L'esempio seguente mostra l'uso di una funzione di confronto usata con
+@code{asort()}.  La funzione di confronto, @code{confronta_in_minuscolo()},
+trasforma gli elementi da confrontare in lettere minuscole, in modo da avere
+confronti che non dipendono da maiuscolo/minuscolo.
+
+@example
+@group
+# confronta_in_minuscolo --- confronta stringhe ignorando maiuscolo/minuscolo
+
+function confronta_in_minuscolo(i1, v1, i2, v2,    l, r)
+@{
+    l = tolower(v1)
+@end group
+    r = tolower(v2)
+
+    if (l < r)
+        return -1
+    else if (l == r)
+        return 0
+    else
+        return 1
+@}
+@end example
+
+E questo programma pu@`o essere usato per provarla:
+
+@example
+# programma di test
+
+BEGIN @{
+    Letters = "abcdefghijklmnopqrstuvwxyz" \
+              "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    split(Letters, data, "")
+
+    asort(data, risultato, "confronta_in_minuscolo")
+
+    j = length(risultato) # numero elementi del vettore "risultato"
+    for (i = 1; i <= j; i++) @{
+        printf("%s", risultato[i])
+        if (i % (j/2) == 0)
+	    # a met@`a, la stampa del vettore va a capo
+            printf("\n")
+        else
+            printf(" ")
+    @}
+@}
+@end example
+
+Se si esegue il programma, si ottiene:
+
+@example
+$ @kbd{gawk -f confronta_in_minuscolo.awk}
+@print{} A a B b c C D d e E F f g G H h i I J j k K l L M m
+@print{} n N O o p P Q q r R S s t T u U V v w W X x y Y z Z
+@end example
+
+@node I/O bidirezionale
+@section Comunicazioni bidirezionali con un altro processo
+
+@c 8/2014. Neither Mike nor BWK saw this as relevant. Commenting it out.
+@ignore
+@cindex Brennan, Michael
+@cindex programmers, attractiveness of
+@smallexample
+@c Path: cssun.mathcs.emory.edu!gatech!newsxfer3.itd.umich.edu!news-peer.sprintlink.net!news-sea-19.sprintlink.net!news-in-west.sprintlink.net!news.sprintlink.net!Sprint!204.94.52.5!news.whidbey.com!brennan
+From: brennan@@whidbey.com (Mike Brennan)
+Newsgroups: comp.lang.awk
+Subject: Re: Learn the SECRET to Attract Women Easily
+Date: 4 Aug 1997 17:34:46 GMT
+@c Organization: WhidbeyNet
+@c Lines: 12
+Message-ID: <5s53rm$eca@@news.whidbey.com>
+@c References: <5s20dn$2e1@chronicle.concentric.net>
+@c Reply-To: brennan@whidbey.com
+@c NNTP-Posting-Host: asn202.whidbey.com
+@c X-Newsreader: slrn (0.9.4.1 UNIX)
+@c Xref: cssun.mathcs.emory.edu comp.lang.awk:5403
+
+On 3 Aug 1997 13:17:43 GMT, Want More Dates???
+<tracy78@@kilgrona.com> wrote:
+>Learn the SECRET to Attract Women Easily
+>
+>The SCENT(tm)  Pheromone Sex Attractant For Men to Attract Women
+
+The scent of awk programmers is a lot more attractive to women than
+the scent of perl programmers.
+--
+Mike Brennan
+@c brennan@@whidbey.com
+@end smallexample
+@end ignore
+
+@cindex funzionalit@`a avanzate, processi@comma{} comunicare con
+@cindex processi, comunicazioni bidirezionali con
+Spesso @`e utile poter
+inviare dati a un programma separato che
+li elabori e in seguito leggere il risultato.  Questo pu@`o essere sempre
+fatto con file temporanei:
+
+@example
+# Scrivere i dati per l'elaborazione
+filetemp = ("mieidati." PROCINFO["pid"])
+while (@var{non dipendente dai dati})
+    print @var{dati} | ("sottoprogramma > " filetemp)
+close("sottoprogramma > " filetemp)
+
+# Legge il risultato, rimuove filetemp quando ha finito
+while ((getline nuovidati < filetemp) > 0)
+    @var{elabora} nuovidati @var{secondo le esigenze}
+close(filetemp)
+system("rm " filetemp)
+@end example
+
+@noindent
+Questo funziona, ma non @`e elegante.  Tra le altre cose, richiede che il
+programma venga eseguito in una directory che non pu@`o essere condivisa tra gli
+utenti; per esempio, @file{/tmp} non pu@`o esserlo, poich@'e potrebbe accadere che
+un altro utente stia usando un file temporaneo con lo stesso
+nome.@footnote{Michael Brennan suggerisce l'uso di @command{rand()} per
+generare @value{FNS} unici. Questo @`e un punto valido; tuttavia, i file
+temporanei rimangono pi@`u difficili da usare delle @dfn{pipe} bidirezionali.} @c 8/2014
+
+@cindex coprocessi
+@cindex input/output bidirezionale
+@cindex @code{|} (barra verticale), operatore @code{|&} (I/O)
+@cindex barra verticale (@code{|}), operatore @code{|&} (I/O)
+@cindex @command{csh}, comando, operatore @code{|&}, confronto con
+@cindex comando @command{csh}, operatore @code{|&}, confronto con
+Comunque, con @command{gawk}, @`e possibile aprire una @dfn{pipe}
+@emph{bidirezionale}
+verso un altro processo.  Il secondo processo @`e chiamato @dfn{coprocesso},
+poich@'e viene eseguito in parallelo con @command{gawk}.  La connessione
+bidirezionale viene creata usando l'operatore @samp{|&} (preso in prestito
+dalla shell Korn, @command{ksh}):@footnote{Questo @`e molto diverso dallo stesso
+operatore nella C shell e in Bash.}
+
+@example
+do @{
+    print @var{dati} |& "sottoprogramma"
+    "sottoprogramma" |& getline risultato
+@} while (@var{ci sono ancora dati da elaborare})
+close("sottoprogramma")
+@end example
+
+La prima volta che viene eseguita un'operazione I/O usando l'operatore
+@samp{|&},
+@command{gawk} crea una @dfn{pipeline} bidirezionale verso un processo figlio
+che esegue l'altro programma.  L'output creato con @code{print} o con
+@code{printf} viene scritto nello standard input del programma, e il contenuto
+dello standard output del programma pu@`o essere letto dal programma
+@command{gawk} usando @code{getline}.
+Come accade coi processi avviati con @samp{|}, il sottoprogramma pu@`o
+essere un qualsiasi programma, o una @dfn{pipeline} di programmi, che pu@`o essere
+avviato dalla shell.
+
+Ci sono alcune avvertenze da tenere presenti:
+
+@itemize @value{BULLET}
+@item
+Per come funziona internamente @command{gawk}, lo standard error
+dei coprocessi va nello stesso posto dove va lo standard error del
+genitore @command{gawk}. Non @`e possibile leggere lo standard error del
+figlio separatamente.
+
+@cindex stalli
+@cindex abbracci mortali
+@cindex @dfn{deadlocks}, vedi stalli
+@cindex bufferizzazione, dell'input/output
+@cindex input/output, bufferizzazione
+@cindex @code{getline}, comando, stalli e
+@item
+La permanenza in memoria (bufferizzazione) dell'I/O del sottoprocesso potrebbe
+essere un problema.  @command{gawk} automaticamente scrive su disco tutto
+l'output spedito tramite la @dfn{pipe} al coprocesso.
+Tuttavia, se il coprocesso non scrive su disco il suo output,
+@command{gawk} potrebbe bloccarsi mentre esegue una @code{getline} per leggere
+il risultato del coprocesso.  Questo pu@`o portare a una situazione
+conosciuta come @dfn{stallo} (@dfn{deadlock}, abbraccio mortale), in cui ciascun
+processo rimane in attesa
+che l'altro processo faccia qualcosa.
+@end itemize
+
+@cindex @code{close()}, funzione, @dfn{pipe} bidirezionali e
+@cindex funzione @code{close()}, @dfn{pipe} bidirezionali e
+@`E possibile chiudere una @dfn{pipe} bidirezionale con un coprocesso solo in una
+direzione, fornendo un secondo argomento, @code{"to"} o @code{"from"}, alla
+funzione @code{close()} (@pxref{Chiusura file e @dfn{pipe}}).
+Queste stringhe dicono a @command{gawk} di chiudere la @dfn{pipe}, rispettivamente
+nella direzione che invia i dati al coprocesso e nella direzione che legge da
+esso.
+
+@cindex @command{sort}, programma di utilit@`a, coprocessi e
+@cindex programma di utilit@`a @command{sort}, coprocessi e
+Questo @`e particolarmente necessario per usare il programma di utilit@`a
+di sistema @command{sort} come parte di un coprocesso;
+@command{sort} deve leggere @emph{tutti} i dati di input
+prima di poter produrre un qualsiasi output.
+Il programma @command{sort} non riceve un'indicazione di fine-file
+(end-of-file) finch@'e @command{gawk} non chiude l'estremit@`a in scrittura della
+@dfn{pipe}.
+
+Una volta terminata la scrittura dei dati sul programma @command{sort},
+si pu@`o chiudere il lato @code{"to"} della @dfn{pipe}, e quindi iniziare a leggere
+i dati ordinati via @code{getline}.
+Per esempio:
+
+@example
+BEGIN @{
+    comando = "LC_ALL=C sort"
+    n = split("abcdefghijklmnopqrstuvwxyz", a, "")
+
+    for (i = n; i > 0; i--)
+        print a[i] |& comando
+    close(comando, "to")
+
+    while ((comando |& getline line) > 0)
+        print "ricevuto", line
+    close(comando)
+@}
+@end example
+
+Questo programma scrive le lettere dell'alfabeto in ordine inverso, uno per
+riga, attraverso la @dfn{pipe} bidirezionale verso @command{sort}.  Poi chiude la
+direzione di scrittura della @dfn{pipe}, in modo che @command{sort} riceva
+un'indicazione di fine-file.  Questo fa in modo che @command{sort} ordini i
+dati e scriva i dati ordinati nel programma @command{gawk}.  Una volta che
+tutti i dati sono stati letti, @command{gawk} termina il coprocesso ed esce.
+
+Come nota a margine, l'assegnamento @samp{LC_ALL=C} nel comando @command{sort}
+assicura che @command{sort} usi l'ordinamento tradizionale di Unix (ASCII).
+Ci@`o non @`e strettamente necessario in questo caso, ma @`e bene sapere come farlo.
+
+Occorre prestare attenzione quando si chiude il lato @code{"from"} di una
+@dfn{pipe} bidirezionale; in tal caso @command{gawk} attende che il
+processo-figlio termini, il che pu@`o causare lo stallo del programma
+@command{awk} in esecuzione.  (Per questo motivo, questa particolare
+funzionalit@`a @`e molto meno usata, in pratica, di quella che consente la
+possibilit@`a di chiudere il lato  @code{"to"} della @dfn{pipe}.)
+
+@quotation ATTENZIONE
+Normalmente,
+@`e un errore fatale (che fa terminare il programma @command{awk})
+scrivere verso il lato @code{"to"} di una @dfn{pipe} bidirezionale che
+@`e stata chiusa, e lo stesso vale se si legge dal lato @code{"from"}
+di una @dfn{pipe} bidirezionale che sia stata chiusa.
+
+@`E possibile impostare @code{PROCINFO["@var{comando}", "NONFATAL"]}
+per far s@`{@dotless{i}} che tali operazioni non provochino la fine del programma
+@command{awk}.  Se lo si fa, @`e necessario controllare il valore
+di @code{ERRNO} dopo ogni istruzione @code{print}, @code{printf},
+o @code{getline}.
+@xref{Continuazione dopo errori} per ulteriori informazioni.
+@end quotation
+
+@cindex @command{gawk}, vettore @code{PROCINFO} in
+@cindex @code{PROCINFO}, vettore, comunicazioni attraverso le @dfn{pty} e
+@cindex vettore @code{PROCINFO}, comunicazioni attraverso le @dfn{pty} e
+Per le comunicazioni bidirezionali si possono anche usare delle pseudo @dfn{tty}
+(@dfn{pty}) al posto delle @dfn{pipe}, se il sistema in uso le prevede.
+Questo vien fatto, a seconda del comando da usare, impostando un elemento
+speciale nel vettore @code{PROCINFO}
+(@pxref{Variabili auto-assegnate}),
+in questo modo:
+
+@example
+comando = "sort -nr"           # comando, salvato in una variabile
+PROCINFO[comando, "pty"] = 1   # aggiorna PROCINFO
+print @dots{} |& comando       # avvia la @dfn{pipe} bidirezionale
+@dots{}
+@end example
+
+@noindent
+Se il sistema in uso non ha le @dfn{pty}, o se tutte le @dfn{pty} del sistema
+sono in uso, @command{gawk} automaticamente torna a usare le @dfn{pipe}
+regolari.
+
+Usare le @dfn{pty} in genere evita i problemi di stallo del buffer descritti
+precedentemente, in cambio di un piccolo calo di prestazioni.  Ci@`o dipende
+dal fatto che la gestione delle @dfn{tty} @`e fatta una riga per volta.
+Su sistemi che hanno il comando @command{stdbuf} (parte del pacchetto
+@uref{https://www.gnu.org/software/coreutils/coreutils.html,
+GNU Coreutils}), si pu@`o usare tale programma, invece delle @dfn{pty}.
+
+Si noti anche che le @dfn{pty} non sono completamente trasparenti.
+Alcuni codici di controllo binari, come @kbd{Ctrl-d} per indicare la
+condizione di file-file, sono interpetati dal gestore di @dfn{tty}
+e non sono passati all'applicazione.
+
+@quotation ATTENZIONE
+In ultima analisi, i coprocessi danno adito alla possibilit@`a di uno
+@dfn{stallo} (deadlock) tra @command{gawk} e il programma in esecuzione
+nel coprocesso.  Ci@`o pu@`o succedere se si inviano ``troppi'' dati al
+coprocesso, prima di leggere dati inviati dallo stesso; entrambi i
+processi sono bloccati sulla scrittura dei dati, e nessuno dei due
+@`e disponibile a leggere quelli che sono gi@`a stati scritti dall'altro.
+Non c'@`e modo di evitare completamente una tale situazione; occorre una
+programmazione attenta, insieme alla conoscenza del comportamento del
+coprocesso.
+@end quotation
+
+@c From email send January 4, 2018.
+L'esempio seguente, preparato da Andrew Schorr, dimostra come
+l'utilizzo delle @dfn{pty} pu@`o servire a evitare situazioni
+di stallo connesse con i buffer
+
+Si supponga che @command{gawk} non sia in grado di sommare dei numeri.
+Si potrebbe usare un coprocesso per farlo.  Ecco un programma fin troppo
+semplice, che pu@`o svolgere tale funzione:
+
+@example
+$ @kbd{cat add.c}
+#include <stdio.h>
+
+int
+main(void)
+@{
+    int x, y;
+    while (scanf("%d %d", & x, & y) == 2)
+        printf("%d\n", x + y);
+    return 0;
+@}
+$ @kbd{cc -O add.c -o add}	@ii{Compilazione del programma}
+@end example
+
+Si potrebbe poi scrivere un programma @command{gawk} fin troppo semplice,
+per sommare dei numeri passandoli al coprocesso:
+
+@example
+$ @kbd{echo 1 2 |}
+> @kbd{gawk -v cmd=./add '@{ print |& cmd; cmd |& getline x; print x @}'}
+@end example
+
+E il programma andrebbe in stallo, poich@'e, @file{add.c} non chiama a sua
+volta @samp{setlinebuf(stdout)}. Il programma @command{add} si blocca.
+
+Ora, si provi invece con:
+
+@example
+$ @kbd{echo 1 2 |}
+> @kbd{gawk -v cmd=add 'BEGIN @{ PROCINFO[cmd, "pty"] = 1 @}}
+> @kbd{                 @{ print |& cmd; cmd |& getline x; print x @}'}
+@print{} 3
+@end example
+
+Usando una @dfn{pty}, @command{gawk} fa s@`{@dotless{i}} che la libreria di I/O
+determini di avere a che fare con una sessione interattiva, e quindi
+utilizzi per default una riga alla volta come buffer.
+E ora, magicamente, funziona!
+
+@node Reti TCP/IP
+@section Usare @command{gawk} per la programmazione di rete
+@cindex funzionalit@`a avanzate, programmazione di rete
+@cindex avanzate, funzionalit@`a, programmazione di rete
+@cindex reti, programmazione di
+@cindex TCP/IP
+@cindex @code{/inet/@dots{}}, file speciali (in @command{gawk})
+@cindex file speciali @code{/inet/@dots{}} (in @command{gawk})
+@cindex @code{/inet4/@dots{}}, file speciali (in @command{gawk})
+@cindex file speciali @code{/inet4/@dots{}} (in @command{gawk})
+@cindex @code{/inet6/@dots{}}, file speciali (in @command{gawk})
+@cindex file speciali @code{/inet6/@dots{}} (in @command{gawk})
+@cindex @code{EMRED}
+@ifnotdocbook
+@quotation
+@code{EMRED}:@*
+@ @ @ @ @i{A host is a host from coast to coast,@*
+@ @ @ @ and nobody talks to a host that's close,@*
+@ @ @ @ unless the host that isn't close@*
+@ @ @ @ is busy, hung, or dead.}
+
+@code{EMRED}:@*
+@ @ @ @ @i{Un computer @`e un computer lontano o vicino,@*
+@ @ @ @ e nessuno parla con un computer vicino,@*
+@ @ @ @ a meno che il computer lontano@*
+@ @ @ @ sia occupato, fuori linea, o spento.}
+@author Mike O'Brien (noto anche come Mr.@: Protocol)
+@end quotation
+@end ifnotdocbook
+
+@docbook
+<blockquote>
+<attribution>Mike O'Brien (aka Mr.&nbsp;Protocol)</attribution>
+<literallayout class="normal"><literal>EMRED</literal>:
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>A host is a host from coast to coast,</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>and no-one can talk to host that's close,</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>unless the host that isn't close</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;<emphasis>is busy, hung, or dead.</emphasis></literallayout>
+</blockquote>
+@end docbook
+
+Oltre a poter aprire una @dfn{pipeline} bidirezionale verso un coprocesso
+sullo stesso sistema
+(@pxref{I/O bidirezionale}),
+@`e possibile attivare una connessione bidirezionale verso un altro processo
+o verso un altro sistema attraverso una connessione di rete IP.
+
+Si pu@`o pensare a questo semplicemente come a una @dfn{pipeline} bidirezionale
+@emph{molto lunga} verso un coprocesso.
+Il modo in cui @command{gawk} stabilisce quando usare una rete TCP/IP @`e
+mediante il riconoscimento di speciali @value{FNS} che iniziano con
+@samp{/inet/}, con @samp{/inet4/} o con @samp{/inet6/}.
+
+La sintassi completa del @value{FN} speciale @`e
+@file{/@var{tipo-rete}/@var{protocollo}/@var{porta-locale}/@var{host-remoto}/@var{porta-remota}}.
+I componenti sono:
+
+@table @var
+@item tipo-rete
+Specifica il tipo di connessione a internet da stabilire.
+Si usa @samp{/inet4/} per usare solo IPv4, e
+@samp{/inet6/} per usare solo IPv6.
+Il semplice @samp{/inet/} (che usualmente @`e l'unica opzione) usa
+il tipo di default del sistema, quasi certamente IPv4.
+
+@item protocollo
+Il protocollo da usare sull'IP.  Questo dev'essere o @samp{tcp} o
+@samp{udp}, per una connessione IP rispettivamente TCP o UDP.
+TCP dovrebbe venir usato per la maggior parte delle applicazioni.
+
+@item porta-locale
+@cindex @code{getaddrinfo()}, funzione (libreria C)
+@cindex funzione @code{getaddrinfo()} (libreria C)
+Il numero di porta TCP o UDP da usare.  Si usa un numero di porta di valore
+@samp{0} quando si vuole che sia il sistema a scegliere una porta.
+Questo @`e quel che si dovrebbe fare quando si scrive un'applicazione
+cliente TCP o UDP.
+Si pu@`o usare anche un nome di un servizio noto, come @samp{smtp}
+o @samp{http}, nel qual caso @command{gawk} tenta di determinare
+il numero di porta predefinito usando la funzione C @code{getaddrinfo()}.
+
+@item host-remoto
+L'indirizzo IP o il nome di dominio completamente qualificato dell'host
+internet al quale ci si vuol connettere.
+
+@item porta-remota
+Il numero di porta TCP o UDP da usare sul particolare @var{host remoto}.
+Anche in questo caso, si usi @samp{0} se non ci sono preferenze,
+o alternativamente, un nome di servizio comunemente noto.
+@end table
+
+@cindex @command{gawk}, variabile @code{ERRNO} in
+@cindex @code{ERRNO}, variabile
+@cindex variabile @code{ERRNO}
+@quotation NOTA
+Un insuccesso nell'apertura di un socket bidirezionale dar@`a luogo alla
+segnalazione di un errore non fatale al codice chiamante.
+Il valore di @code{ERRNO} indica l'errore (@pxref{Variabili auto-assegnate}).
+@end quotation
+
+Si consideri il seguente esempio molto semplice:
+
+@example
+BEGIN @{
+    Servizio = "/inet/tcp/0/localhost/daytime"
+    Servizio |& getline
+    print $0
+    close(Servizio)
+@}
+@end example
+
+Questo programma legge la data e l'ora corrente dal server @code{daytime}
+TCP del sistema locale.
+Stampa poi il risultato e chiude la connessione.
+
+Poich@'e questo tema @`e molto ampio, l'uso di @command{gawk} per
+la programmazione TCP/IP viene documentata separatamente.
+@ifinfo
+Si veda
+@inforef{Top, , General Introduction, gawkinet, @value{GAWKINETTITLE}},
+@end ifinfo
+@ifnotinfo
+Si veda
+@uref{https://www.gnu.org/software/gawk/manual/gawkinet/,
+@cite{@value{GAWKINETTITLE}}},
+che fa parte della distribuzione @command{gawk},
+@end ifnotinfo
+per una introduzione e trattazione molto pi@`u completa e con molti
+esempi.
+
+@quotation NOTA
+@command{gawk} pu@`o aprire solo socket diretti. Al momento non c'@`e alcun modo
+per accedere ai servizi disponibili su Secure Socket Layer
+(SSL); questo comprende qualsiasi servizio web il cui URL inizia con
+@samp{https://}.
+@end quotation
+
+
+@node Profilare
+@section Profilare i propri programmi @command{awk}
+@cindex @command{awk}, programmi, profilare
+@cindex profilare programmi @command{awk}
+@cindex @code{awkprof.out}, file
+@cindex file @code{awkprof.out}
+
+@`E possibile tener traccia dell'esecuzione dei propri programmi @command{awk}.
+Ci@`o si pu@`o fare passando l'opzione @option{--profile} a @command{gawk}.
+Al termine dell'esecuzione, @command{gawk} crea un profilo del programma in un
+file chiamato @file{awkprof.out}.  A causa dell'attivit@`a di profilazione
+l'esecuzione del programma @`e pi@`u lenta fino al 45% rispetto al normale.
+
+@cindex @option{--profile}, opzione
+@cindex opzione @option{--profile}
+Come mostrato nel seguente esempio,
+l'opzione @option{--profile} pu@`o essere usata per cambiare il nome del file
+su cui @command{gawk} scriver@`a il profilo:
+
+@example
+gawk --profile=mioprog.prof -f mioprog.awk dati1 dati2
+@end example
+
+@noindent
+Nell'esempio precedente, @command{gawk} mette il profilo in
+@file{mioprog.prof} anzich@'e in @file{awkprof.out}.
+
+Vediamo ora una sessione d'esempio che mostra un semplice programma
+@command{awk}, i suoi dati in input, e il risultato dell'esecuzione di
+@command{gawk} con l'opzione @option{--profile}.  Innanzitutto, il
+programma @command{awk}:
+
+@example
+BEGIN @{ print "Prima regola BEGIN" @}
+
+END @{ print "Prima regola END" @}
+
+/pippo/ @{
+    print "trovato /pippo/, perbacco"
+    for (i = 1; i <= 3; i++)
+        sing()
+@}
+
+@{
+    if (/pippo/)
+        print "l'if @`e vero"
+    else
+        print "l'else @`e vero"
+@}
+
+BEGIN @{ print "Seconda regola BEGIN" @}
+
+END @{ print "Seconda regola END" @}
+
+function sing(    ignora)
+@{
+    print "Devo essere io!"
+@}
+@end example
+
+Questi sono i dati in input:
+
+@example
+pippo
+pluto
+paperino
+pippo
+cianfrusaglie
+@end example
+
+E questo @`e il file @file{awkprof.out} che @`e il risultato dell'esecuzione
+del profilatore di @command{gawk} su questo programma e sui dati (quest'esempio
+dimostra anche che i programmatori di @command{awk} a volte si alzano molto
+presto al mattino per lavorare):
+
+@cindex @code{BEGIN}, criterio di ricerca, profilazione e
+@cindex criterio di ricerca @code{BEGIN}, profilazione e
+@cindex @code{END}, criterio di ricerca, profilazione e
+@cindex criterio di ricerca @code{END}, profilazione e
+@example
+    # profilo gawk, creato Mon Sep 29 05:16:21 2014
+
+    # BEGIN regola(e)
+
+    BEGIN @{
+ 1  	print "Prima regola BEGIN"
+    @}
+
+    BEGIN @{
+ 1  	print "Seconda regola BEGIN"
+    @}
+
+    # Regola(e)
+
+ 5  /pippo/ @{ # 2
+ 2  	print "trovato /pippo/, perbacco"
+ 6  	for (i = 1; i <= 3; i++) @{
+ 6  		sing()
+    	@}
+    @}
+
+ 5  @{
+ 5  	if (/pippo/) @{ # 2
+ 2  		print "l'if @`e vero"
+ 3  	@} else @{
+ 3  		print "l'else @`e vero"
+    	@}
+    @}
+
+    # END regola(e)
+
+    END @{
+ 1  	print "Prima regola END"
+    @}
+
+    END @{
+ 1  	print "Seconda regola END"
+    @}
+
+
+    # Funzioni, in ordine alfabetico
+
+ 6  function sing(ignora)
+    @{
+ 6  	print "Devo essere io!"
+    @}
+@end example
+
+Quest'esempio illustra molte caratteristiche fondamentali dell'output
+della profilazione.
+Queste sono:
+
+@itemize @value{BULLET}
+@item
+Il programma viene stampato nell'ordine: regole @code{BEGIN},
+regole @code{BEGINFILE},
+regole criterio di ricerca--azione,
+regole @code{ENDFILE}, regole @code{END}, e funzioni, elencate
+in ordine alfabetico.
+Le regole @code{BEGIN} ed @code{END} multiple conservano le loro
+distinte identit@`a, cos@`{@dotless{i}} come le regole @code{BEGINFILE} ed @code{ENDFILE}
+multiple.
+
+@cindex criteri di ricerca, conteggi, in un profilo
+@item
+Le regole criterio di ricerca--azione hanno due conteggi.
+Il primo conteggio, a sinistra della regola, mostra quante volte
+il criterio di ricerca della regola @`e stato @emph{testato}.
+Il secondo conteggio, alla destra della parentesi graffa aperta,
+all'interno di un commento,
+mostra quante volte l'azione della regola @`e stata @emph{eseguita}.
+La differenza tra i due indica quante volte il criterio di ricerca della regola
+@`e stato valutato come falso.
+
+@item
+Analogamente,
+il conteggio per un'istruzione @code{if}-@code{else} mostra quante volte
+la condizione @`e stata testata.
+Alla destra della parentesi graffa sinistra aperta per il corpo di @code{if}
+c'@`e un conteggio che mostra quante volte la condizione @`e stata trovata vera.
+Il conteggio per @code{else} indica
+quante volte la verifica non ha avuto successo.
+
+@cindex cicli, conteggi per l'intestazione, in un profilo
+@item
+Il conteggio per un ciclo (come @code{for}
+o @code{while}) mostra quante volte il test del ciclo @`e stato eseguito.
+(Per questo motivo, non si pu@`o solamente guardare il conteggio sulla prima
+istruzione in una regola per determinare quante volte la regola @`e stata
+eseguita.  Se la prima istruzione @`e un ciclo, il conteggio @`e ingannevole.)
+
+@cindex funzioni definite dall'utente, conteggi@comma{} in un profilo
+@cindex definite dall'utente, funzioni, conteggi@comma{} in un profilo
+@item
+Per le funzioni definite dall'utente, il conteggio vicino alla parola chiave
+@code{function} indica quante volte la funzione @`e stata chiamata.
+I conteggi vicino alle istruzioni nel corpo mostrano quante volte
+quelle istruzioni sono state eseguite.
+
+@cindex @code{@{@}} (parentesi graffe)
+@cindex parentesi graffe (@code{@{@}})
+@item
+L'impaginazione usa lo stile ``K&R'' con le tabulazioni.
+Le parentesi graffe sono usate dappertutto, anche dove il corpo di un
+@code{if}, di un @code{else} o di un ciclo @`e formato da un'unica istruzione.
+
+@cindex @code{()} (parentesi), in un profilo
+@cindex parentesi (@code{()}), in un profilo
+@item
+Le parentesi vengono usate solo dov'@`e necessario, come si rileva dalla
+struttura del programma e dalle regole di precedenza.
+Per esempio, @samp{(3 + 5) * 4} significa sommare tre e cinque, quindi
+moltiplicare il totale per quattro.  Di contro, @samp{3 + 5 * 4} non ha
+parentesi, e significa @samp{3 + (5 * 4)}.
+Tuttavia, le parentesi inserite esplicitamente nel programma sorgente
+sono conservate come sono state scritte.
+
+@ignore
+@item
+All string concatenations are parenthesized too.
+(This could be made a bit smarter.)
+@end ignore
+
+@item
+Le parentesi vengono usate attorno agli argomenti di @code{print}
+e @code{printf} solo quando l'istruzione
+@code{print} o @code{printf} @`e seguita da una ridirezione.
+Similarmente, se
+l'oggetto di una ridirezione non @`e uno scalare, viene messo tra parentesi.
+
+@item
+@command{gawk} mette dei commenti iniziali
+davanti alle regole @code{BEGIN} ed @code{END},
+alle regole @code{BEGINFILE} ed @code{ENDFILE},
+alle regole criterio_di_ricerca--azione e alle funzioni.
+
+@end itemize
+
+La versione profilata del proprio programma potrebbe non apparire esattamente
+come quella scritta durante la stesura del programma.  Questo perch@'e
+@command{gawk} crea la versione profilata facendo una ``stampa elegante'' della
+sua rappresentazione interna del programma.  Un vantaggio di ci@`o @`e che
+@command{gawk} pu@`o produrre una rappresentazione standard.
+Inoltre, cose come:
+
+@example
+/pippo/
+@end example
+
+@noindent
+appaiono come:
+
+@example
+/pippo/   @{
+    print
+@}
+@end example
+
+@noindent
+che @`e corretto, ma probabilmente inatteso.
+(Se un programma usa sia @samp{print $0} che un semplice
+@samp{print}, tale differenza @`e mantenuta.)
+
+@cindex profilare programmi @command{awk}, dinamicamente
+@cindex @command{gawk}, programma, profilazione dinamica
+@cindex profilazione dinamica
+Oltre a creare profili una volta completato il programma,
+@command{gawk} pu@`o generare un profilo mentre @`e in esecuzione.
+Questo @`e utile se il proprio programma @command{awk} entra in un ciclo
+infinito e si vuol vedere cosa @`e stato eseguito.
+Per usare questa funzionalit@`a, bisogna eseguire @command{gawk} con l'opzione
+@option{--profile} in background:
+
+@example
+$ @kbd{gawk --profile -f mioprog &}
+[1] 13992
+@end example
+
+@cindex @command{kill}, comando@comma{} profilazione dinamica e
+@cindex comando @command{kill}@comma{} profilazione dinamica e
+@cindex @code{USR1}, segnale, per profilazione dinamica
+@cindex @code{SIGUSR1}, segnale, per profilazione dinamica
+@cindex segnali @code{USR1}/@code{SIGUSR1}, per profilazione
+@noindent
+La shell stampa un numero di job e il numero di ID del relativo processo;
+in questo caso, 13992.  Si usi il comando @command{kill} per inviare il
+segnale @code{USR1} a @command{gawk}:
+
+@example
+$ @kbd{kill -USR1 13992}
+@end example
+
+@noindent
+Come al solito, la versione profilata del programma @`e scritta nel file
+@file{awkprof.out}, o in un file differente se ne viene specificato uno
+con l'opzione @option{--profile}.
+
+Assieme al profilo regolare, come mostrato in precedenza, il file del profilo
+include una traccia di ogni funzione attiva:
+
+@example
+# `Stack' (Pila) Chiamate Funzione:
+
+#   3. paperino
+#   2. pluto
+#   1. pippo
+# -- main --
+@end example
+
+Si pu@`o inviare a @command{gawk} il segnale @code{USR1} quante volte si vuole.
+Ogni volta, il profilo e la traccia della chiamata alla funzione vengono
+aggiunte in fondo al file di profilo creato.
+
+@cindex @code{HUP}, segnale, per profilazione dinamica
+@cindex @code{SIGHUP}, segnale, per profilazione dinamica
+@cindex segnali @code{HUP}/@code{SIGHUP}, per profilazione
+Se si usa il segnale @code{HUP} invece del segnale @code{USR1}, @command{gawk}
+genera il profilo e la traccia della chiamata alla funzione ed esce.
+
+@cindex @code{INT}, segnale (MS-Windows)
+@cindex @code{SIGINT}, segnale (MS-Windows)
+@cindex segnali @code{INT}/@code{SIGINT} (MS-Windows)
+@cindex @code{QUIT}, segnale (MS-Windows)
+@cindex @code{SIGQUIT}, segnale (MS-Windows)
+@cindex segnali @code{QUIT}/@code{SIGQUIT} (MS-Windows)
+Quando @command{gawk} viene eseguito sui sistemi MS-Windows, usa i segnali
+@code{INT} e @code{QUIT} per generare il profilo, e nel
+caso del segnale @code{INT}, @command{gawk} esce.  Questo perch@'e
+questi sistemi non prevedono il comando @command{kill}, per cui gli unici
+segnali che si possono trasmettere a un programma sono quelli generati dalla
+tastiera.  Il segnale @code{INT} @`e generato dalle combinazioni di tasti
+@kbd{Ctrl-c} o @kbd{Ctrl-BREAK}, mentre il segnale
+@code{QUIT} @`e generato dalla combinazione di tasti @kbd{Ctrl-\}.
+
+@cindex stampa elegante
+Infine, @command{gawk} accetta anche un'altra opzione, @option{--pretty-print}.
+Quando viene chiamato in questo modo, @command{gawk} fa una ``stampa elegante''
+del programma nel file @file{awkprof.out}, senza conteggi sull'esecuzione.
+
+@quotation NOTA
+Una volta, l'opzione @option{--pretty-print} eseguiva anche il programma.
+Ora non pi@`u.
+@end quotation
+
+@cindex profilazione, differenza rispetto alla stampa elegante
+@cindex stampa elegante, differenza rispetto alla profilazione
+C'@`e una differenza significativa tra l'output creato durante la profilazione,
+e quello creato durante la stampa elegante.  L'output della stampa elegante
+preserva i commenti originali che erano nel programma, anche se la loro
+posizione pu@`o non corrispondere esattamente alle posizioni originali che
+avevano nel codice sorgente.  Tuttavia, nessun commento dovrebbe andare
+perso.  Inoltre, @command{gawk} fa del suo meglio
+per mantenere la distinzione tra commenti posti dopo delle istruzioni e
+commenti su righe a s@'e stanti.  Tuttavia, non sempre questo pu@`o avvenire
+in maniera perfetta.
+
+Comunque, per una precisa scelta progettuale, l'output della profilazione
+@emph{omette} i commenti del programma originale. Questo permette di
+concentrarsi sui dati del conteggio di esecuzione ed evita la tentazione di
+usare il profilatore per creare una stampa elegante.
+
+Oltre a ci@`o, l'output stampato in modo elegante non ha l'indentazione iniziale
+che ha l'output della profilazione. Questo rende agevole la stampa elegante
+del proprio codice una volta completato lo sviluppo, usando poi il risultato
+come versione finale del programma.
+
+Poich@'e la rappresentazione interna del programma @`e formattata per
+essere aderente al programma @command{awk} in questione, la profilazione
+e la stampa elegante (opzione @option{--pretty-print}) disabilitano
+automaticamente le optimizzazioni di default di @command{gawk}.
+
+La profilazione e la stampa elegante mantengono anche il formato originale
+delle costanti numeriche; se sono stati usati dei valori ottali o esadecimali
+nel codice sorgente, questi compariranno nell'output nello stesso
+formato con cui sono stati inseriti.
+
+@node Sommario funzionalit@`a avanzate
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+L'opzione @option{--non-decimal-data} fa s@`{@dotless{i}} che @command{gawk} tratti
+i dati di input che hanno l'aspetto ottale ed esadecimale come valori ottali ed
+esadecimali.  L'opzione dovrebbe essere usata con prudenza o non usata affatto;
+@`e preferibile l'uso di @code{strtonum()}.
+Si noti che quest'opzione potrebbe sparire nelle prossime versioni di
+@command{gawk}.
+
+@item
+Si pu@`o prendere il completo controllo dell'ordinamento nello scorrere il
+vettore con @samp{for (@var{indice} in @var{vettore})}, impostando
+@code{PROCINFO["sorted_in"]} al nome di una funzione definita dall'utente che
+fa il confronto tra elementi del vettore basandosi su indice e valore.
+
+@item
+Analogamente, si pu@`o fornire il nome di una funzione di confronto definita
+dall'utente come terzo argomento di @code{asort()} o di @command{asorti()} per
+controllare come queste funzioni ordinano i vettori. O si pu@`o fornire una delle
+stringhe di controllo predefinite che funzionano per
+@code{PROCINFO["sorted_in"]}.
+
+@item
+Si pu@`o usare l'operatore @samp{|&} per creare una @dfn{pipe} bidirezionale
+verso un coprocesso.  Si legge dal coprocesso con @code{getline}, ci si
+scrive sopra con @code{print} o con @code{printf}. Usare @code{close()}
+per bloccare il coprocesso completamente o, se necessario, chiudere le
+comunicazioni bidirezionali in una direzione.
+
+@item
+Usando degli speciali @value{FNS} con l'operatore @samp{|&}, si pu@`o aprire una
+connessione TCP/IP (o UDP/IP) verso host remoti su internet. @command{gawk}
+supporta sia IPv4 che IPv6.
+
+@item
+Si possono generare profili del proprio programma con i conteggi del numero
+di esecuzione di ogni singola
+istruzione. Questo pu@`o essere d'aiuto nel determinare quali parti del programma
+potrebbero portar via la maggior parte del tempo, consentendo cos@`{@dotless{i}} di
+aggiustarli pi@`u agevolmente.  Inviando il segnale @code{USR1} durante la
+profilazione @command{gawk} scrive il profilo, includendo la
+stack della chiamata alla funzione e prosegue nell'elaborazione.
+
+@item
+Si pu@`o anche fare solo una ``stampa elegante'' del programma.
+
+@end itemize
+@node Internazionalizzazione
+@chapter Internazionalizzazione con @command{gawk}
+
+Tanto tempo fa i produttori di computer
+scrivevano software che comunicava solo in inglese.
+Col passare del tempo, i venditori di hardware e di software si sono
+resi conto che se i loro sistemi avessero comunicato anche nelle lingue
+materne di paesi dove non si parlava inglese,
+ci@`o avrebbe avuto come risultato un incremento delle vendite.
+Per questo motivo, l'internazionalizzazione e la localizzazione
+di programmi e sistemi software @`e divenuta una pratica comune.
+
+@cindex internazionalizzazione, localizzazione
+@cindex @command{gawk}, internazionalizzazione e, si veda internazionalizzazione
+@cindex internazionalizzazione, localizzazione, @command{gawk} e
+Per molti anni la possibilit@`a di fornire l'internazionalizzazione
+era sostanzialmente limitata ai programmi scritti in C e C++.
+Questo @value{CHAPTER} descrive la libreria @dfn{ad hoc} utilizzata da
+@command{gawk}
+per l'internazionalizzazione e anche il modo in cui le funzionalit@`a che
+consentono l'internazionalizzazione sono rese disponibili da @command{gawk}
+a ogni programma scritto in @command{awk}.
+La disponibilit@`a dell'internazionalizzazione a livello di programma
+@command{awk} offre ulteriore flessibilit@`a agli sviluppatori di software:
+non sono pi@`u obbligati a scrivere in C o C++ quando l'internazionalizzazione
+@`e necessaria in un programma.
+
+@menu
+* I18N e L10N::               Internazionalizzazione e localizzazione.
+* Utilizzare @command{gettext}:: Come funziona il comando GNU @command{gettext}.
+* I18N per programmatore::    Funzionalit@`a per il programmatore.
+* I18N per traduttore::       Funzionalit@`a per il traduttore.
+* Esempio I18N::              Un semplice esempio di internazionalizzazione.
+* Gawk internazionalizzato::  Anche @command{gawk} @`e internazionalizzato.
+* Sommario I18N::             Sommario dell'internazionalizzazione.
+@end menu
+
+@node I18N e L10N
+@section Internazionalizzazione e localizzazione
+
+@cindex internazionalizzazione di programmi @command{awk}
+@cindex localizzazione, si veda internazionalizzazione@comma{} localizzazione
+@cindex localizzazione
+@dfn{Internazionalizzazione} significa scrivere (o modificare) un programma
+una volta sola,
+in maniera tale che possa usare pi@`u di una lingua senza
+bisogno di ulteriori modifiche al file sorgente.
+@dfn{Localizzazione}
+significa fornire i dati necessari perch@'e un programma
+internazionalizzato sia in grado di funzionare con una data lingua.
+Questi termini si riferiscono comunemente a funzionalit@`a quali la lingua
+usata per stampare messaggi di errore, quella usata per leggere
+risposte, e alle informazioni
+relative al modo di leggere e di stampare dati di tipo numerico o valutario.
+
+@node Utilizzare @command{gettext}
+@section Il comando GNU @command{gettext}
+
+@cindex internazionalizzare un programma
+@cindex @command{gettext}, libreria
+@cindex libreria @command{gettext}
+@command{gawk} usa il comando GNU @command{gettext} per rendere disponibili
+le proprie funzionalit@`a di internazionalizzazione.
+L'attenzione del comando GNU @command{gettext} @`e rivolta principalmente
+ai messaggi: stringhe di caratteri stampate da un programma, sia
+direttamente sia usando la formattazione prevista dalle istruzioni
+@code{printf} o @code{sprintf()}.@footnote{Per alcuni sistemi operativi,
+la relativa versione di @command{gawk}
+non supporta il comando GNU @command{gettext}.
+Per questo motivo, queste funzionalit@`a non sono disponibili nel caso
+si stia lavorando con uno di questi sistemi operativi. Siamo spiacenti.}
+
+@cindex portabilit@`a, libreria @command{gettext} e
+Quando si usa il comando GNU @command{gettext}, ogni applicazione ha il
+proprio @dfn{dominio di testo}.  Questo @`e un nome unico come,
+p.es., @samp{kpilot} o @samp{gawk},
+che identifica l'applicazione.
+Un'applicazione completa pu@`o avere pi@`u componenti: programmi scritti
+in C o C++, come pure @dfn{script} di @command{sh} o di @command{awk}.
+Tutti i componenti usano lo stesso dominio di testo.
+
+Per andare sul concreto, si supponga di scrivere un'applicazione
+chiamata @command{guide}.  L'internazionalizzazione per quest'applicazione
+pu@`o essere implementata seguendo nell'ordine i passi qui delineati:
+
+@enumerate
+@item
+Il programmatore esamina i sorgenti di tutti i componenti dell'applicazione
+@command{guide} e prende nota di ogni stringa che potrebbe aver bisogno
+di traduzione.
+Per esempio, @code{"`-F': option required"} @`e una stringa che sicuramente
+necessita di una traduzione.
+Una tabella che contenga stringhe che sono nomi di opzioni @emph{non}
+necessita di traduzione.
+(P.es., l'opzione di @command{gawk} @option{--profile}
+dovrebbe restare immutata, a prescindere dalla lingua locale).
+
+@cindex @code{textdomain()}, funzione (libreria C)
+@cindex funzione @code{textdomain()} (libreria C)
+@item
+Il programmatore indica il dominio di testo dell'applicazione
+(@command{"guide"}) alla libreria @command{gettext},
+chiamando la funzione @code{textdomain()}.
+
+@cindex @code{.pot}, file
+@cindex file @code{.pot}
+@cindex @dfn{portable object template} (.pot), file
+@cindex file, @dfn{portable object template} (.pot)
+@item
+I messaggi dell'applicazione che vanno tradotti sono estratti dal codice
+sorgente e messi in un file di tipo
+@dfn{portable object template}
+[modello di oggetto portabile]
+di nome @file{guide.pot},
+che elenca le stringhe e le relative traduzioni.
+Le traduzioni sono inizialmente vuote
+(esiste la struttura che definisce la stringa tradotta, ma la stringa
+tradotta @`e una stringa nulla).
+Il messaggio originale (normalmente in inglese) @`e utilizzato come chiave
+di riferimento per le traduzioni.
+
+@cindex @code{.po}, file
+@cindex file @code{.po}
+@cindex @dfn{portable object} file (.po)
+@cindex file, @dfn{portable object} (.po)
+@item
+Per ogni lingua per cui sia disponibile un traduttore, il file
+@file{guide.pot} @`e copiato in un file di tipo
+@dfn{portable object}
+[oggetto portabile]
+(dal suffisso @code{.po})
+e le traduzioni sono effettuate su quel file,
+che viene distribuito con l'applicazione.
+Per esempio, potrebbe esserci un file @file{it.po} per la traduzione italiana.
+
+@cindex @code{.gmo}, file
+@cindex file @code{.gmo}
+@cindex @dfn{message object} file (.mo)
+@cindex file, @dfn{message object} (.mo)
+@item
+Il file @file{.po} di ogni lingua @`e convertito in un formato binario,
+detto @dfn{message object} (file @file{.gmo}).
+Un file di tipo @dfn{message object} contiene i messaggi originali e le loro
+traduzioni in un formato binario che facilita il ritrovamento delle
+traduzioni quando l'applicazione viene eseguita.
+
+@item
+Quando @command{guide} @`e compilato e installato, i file binari contenenti le
+traduzioni sono installati in una directory standard.
+
+@cindex @code{bindtextdomain()}, funzione (libreria C)
+@cindex funzione @code{bindtextdomain()} (libreria C)
+@item
+Durante la fase di prova e sviluppo, @`e possibile chiedere a @command{gettext}
+di usare un file @file{.gmo} in una directory diversa da quella standard,
+usando la funzione @code{bindtextdomain()}.
+
+@cindex @code{.gmo}, file, specificare la directory di
+@cindex file @code{.gmo}, specificare la directory di
+@cindex @dfn{message object} file (.mo), specificare la directory di
+@cindex file, @dfn{message object} (.mo), specificare la directory di
+@item
+Quando viene eseguito, il programma @command{awk} @command{guide} cerca ogni
+stringa da tradurre facendo una chiamata a @code{gettext()}.  La stringa
+ricevuta in ritorno @`e la stringa tradotta, se @`e stata trovata, o la stringa
+originale, se una traduzione non @`e disponibile.
+
+@item
+Se necessario, @`e possibile procurarsi dei messaggi tradotti da un dominio di
+testo diverso da quello proprio dell'applicazione, senza dover altalenare fra
+questo secondo dominio e quello dell'applicazione.
+@end enumerate
+
+@cindex @code{gettext()}, funzione (libreria C)
+@cindex funzione @code{gettext()} (libreria C)
+In C (o C++), la marcatura della stringa la ricerca dinamica
+della traduzione si fanno inserendo ogni stringa da tradurre in una chiamata
+a @code{gettext()}:
+
+@example
+printf("%s", gettext("Don't Panic!\n"));
+@end example
+
+Gli strumenti software che estraggono messaggi dal codice sorgente
+individuano tutte le stringhe racchiuse nelle chiamate a @code{gettext()}.
+
+@cindex @code{_} (trattino basso), macro C
+@cindex trattino basso (@code{_}), macro C
+Gli sviluppatori del comando GNU @command{gettext}, riconoscendo che
+continuare a immettere @samp{gettext(@dots{})} @`e sia faticoso che poco
+elegante da vedere, usano la macro @samp{_} (un trattino basso) per
+facilitare la cosa:
+
+@example
+/* Nel file di intestazione standard: */
+#define _(str) gettext(str)
+
+/* Nel testo del programma: */
+printf("%s", _("Don't Panic!\n"));
+@end example
+
+@cindex internazionalizzazione, localizzazione, categorie di localizzazione
+@cindex @command{gettext}, libreria, categorie di localizzazione
+@cindex libreria @command{gettext}, categorie di localizzazione
+@cindex categorie di localizzazione
+@noindent
+Questo permette di ridurre la digitazione extra a solo tre caratteri per
+ogni stringa da tradurre e inoltre migliora di molto la leggibit@`a.
+
+Ci sono @dfn{categorie} di localizzazione per tipi diversi di informazioni
+legate a una particolare localizzazione.
+Le categorie di localizzazione note a @command{gettext} sono:
+
+@table @code
+@cindex @code{LC_MESSAGES}, categoria di localizzazione
+@cindex categoria di localizzazione @code{LC_MESSAGES}
+@item LC_MESSAGES
+Testo dei messaggi.  Questa @`e la categoria di default usata all'interno di
+@command{gettext}, ma @`e possibile specificarne esplicitamente una differente,
+se necessario.  (Questo non @`e quasi mai necessario.)
+
+@cindex ordinare caratteri in lingue differenti
+@cindex @code{LC_COLLATE}, categoria di localizzazione
+@cindex categoria di localizzazione @code{LC_COLLATE}
+@item LC_COLLATE
+Informazioni sull'ordinamento alfabetico (cio@`e, come caratteri diversi e/o
+gruppi di carattere sono ordinati in un dato linguaggio).
+@c ad esempio i vari caratteri accentati in italiano, vanno ordinati
+@c insieme alla loro lettera "principale" (e @`e @'e).
+
+@cindex @code{LC_CTYPE}, categoria di localizzazione
+@cindex categoria di localizzazione @code{LC_CTYPE}
+@item LC_CTYPE
+Informazioni sui singoli caratteri (alfabetico, numerico, maiuscolo
+o minuscolo, etc.), come pure sulla codifica dei caratteri.
+@ignore
+In June 2001 Bruno Haible wrote:
+- Description of LC_CTYPE: It determines both
+  1. character encoding,
+  2. character type information.
+  (For example, in both KOI8-R and ISO-8859-5 the character type information
+  is the same - cyrillic letters could as 'alpha' - but the encoding is
+  different.)
+@end ignore
+Quest'informazione @`e utilizzata per stabilire le classi di caratteri come
+definite nello standard POSIX, nelle espressioni regolari,
+come p. es. @code{/[[:alnum:]]/}
+(@pxref{Espressioni tra parentesi quadre}).
+
+@cindex informazioni di tipo monetario, localizzazione
+@cindex monete, simboli di, nella localizzazione
+@cindex simboli di monete, nella localizzazione
+@cindex monete, rappresentazioni di, nella localizzazione
+@cindex rappresentazioni di monete, nella localizzazione
+@cindex @code{LC_MONETARY}, categoria di localizzazione
+@cindex categoria di localizzazione @code{LC_MONETARY}
+@item LC_MONETARY
+Le informazioni di tipo monetario, quali il simbolo della moneta, e se
+il simbolo va prima o dopo il valore numerico.
+
+@cindex @code{LC_NUMERIC}, categoria di localizzazione
+@cindex categoria di localizzazione @code{LC_NUMERIC}
+@item LC_NUMERIC
+Informazioni di tipo numerico, quali il carattere da usare per separare le
+cifre decimali e quello per separare le migliaia.@footnote{Gli americani usano
+una virgola ogni tre cifre decimali, e un punto per separare la parte decimale
+di un numero, mentre molti europei (fra cui gli italiani) fanno esattamente
+l'opposto: 1,234.56 invece che 1.234,56.}
+
+@cindex tempo, localizzazione e
+@cindex date, informazioni relative alla localizzazione
+@cindex @code{LC_TIME}, categoria di localizzazione
+@cindex categoria di localizzazione @code{LC_TIME}
+@item LC_TIME
+Informazioni relative alle date e alle ore,
+come l'uso di ore nel formato a 12 ore oppure a 24 ore, il mese stampato
+prima o dopo il giorno in una data, le abbreviazioni dei mesi nella lingua
+locale, e cos@`{@dotless{i}} via.
+
+@cindex @code{LC_ALL}, categoria di localizzazione
+@cindex categoria di localizzazione @code{LC_ALL}
+@item LC_ALL
+Tutte le categorie viste sopra.  (Non molto utile nel contesto del comando
+@command{gettext}.)
+@end table
+
+@quotation NOTA
+@cindex @env{LANGUAGE}, variabile d'ambiente
+@cindex variabile d'ambiente @env{LANGUAGE}
+Come descritto in @ref{Localizzazioni}, le variabili d'ambiente
+che hanno lo stesso nome delle categorie di localizzazione
+(@env{LC_CTYPE}, @env{LC_ALL}, etc.) influenzano il comportamento di
+@command{gawk} (e quello di altri programmi di utilit@`a).
+
+Solitamente, queste variabili influenzano anche il modo con cui
+la libreria @code{gettext} trova le traduzioni.  Tuttavia, la
+variabile d'ambiente @env{LANGUAGE} prevale sulle variabili
+della famiglia @env{LC_@var{xxx}}.  Molti sistemi GNU/Linux possono
+aver definito questa variabile senza esplicitamente notificarlo
+all'utente, e questo potrebbe far s@`{@dotless{i}} che @command{gawk} non riesca a
+trovare le traduzioni corrette.  Se si incontra questa situazione,
+occorre controllare se la variabile d'ambiente @env{LANGUAGE} @`e
+definita, e, in questo caso, va usato il comando @command{unset}
+per rimuoverla.
+@end quotation
+
+Per il test di traduzioni dei messaggi inviati da @command{gawk} stesso, si pu@`o
+impostare la variabile d'ambiente @env{GAWK_LOCALE_DIR}.  Si veda la
+documentazione per la funzione C @code{bindtextdomain()}, e si veda anche
+@ref{Altre variabili d'ambiente}.
+
+@node I18N per programmatore
+@section Internazionalizzare programmi @command{awk}
+@cindex programmi @command{awk}, internazionalizzare
+@cindex internazionalizzazione di programmi @command{awk}
+
+@command{gawk} prevede le seguenti variabili per l'internazionalizzazione:
+
+@table @code
+@cindex @code{TEXTDOMAIN}, variabile
+@cindex variabile @code{TEXTDOMAIN}
+@item TEXTDOMAIN
+Questa variabile indica il dominio di testo dell'applicazione.
+Per compatibilit@`a con il comando GNU @command{gettext}, il valore di default
+@`e @code{"messages"}.
+
+@cindex internazionalizzazione, localizzazione, stringhe marcate
+@cindex stringhe, marcare per localizzazione
+@item _"questo @`e un messaggio da tradurre"
+Costanti di tipo stringa marcate con un trattino basso iniziale
+sono candidate per essere tradotte al momento dell'esecuzione del
+programma @command{gawk}.
+Costanti di tipo stringa non precedute da un trattino basso non
+verranno tradotte.
+@end table
+
+@command{gawk} fornisce le seguenti funzioni al servizio
+dell'internazionalizzazione:
+
+@table @code
+@cindexgawkfunc{dcgettext}
+@item @code{dcgettext(@var{string}} [@code{,} @var{dominio} [@code{,} @var{categoria}]]@code{)}
+Restituisce la traduzione di @var{stringa} nel
+dominio di testo @var{dominio} per la categoria di localizzazione @var{categoria}.
+Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
+Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
+
+Se si assegna un valore a @var{categoria}, dev'essere una stringa uguale a
+una delle categorie di localizzazione note, descritte
+@ifnotinfo
+nella precedente @value{SECTION}.
+@end ifnotinfo
+@ifinfo
+@ref{Utilizzare @command{gettext}}.
+@end ifinfo
+Si deve anche specificare un dominio di testo.  Si usi @code{TEXTDOMAIN} se
+si desidera usare il dominio corrente.
+
+@quotation ATTENZIONE
+L'ordine degli argomenti per la versione @command{awk}
+della funzione @code{dcgettext()} @`e differente, per una scelta di progetto,
+dall'ordine degli argomenti passati alla funzione C che ha lo stesso nome.
+L'ordine della versione @command{awk} @`e stato scelto per amore di
+semplicit@`a e per consentire di avere dei valori di default per gli
+argomenti che fossero il pi@`u possibile simili, come stile, a quello di
+@command{awk}.
+@end quotation
+
+@cindexgawkfunc{dcngettext}
+@item @code{dcngettext(@var{stringa1}, @var{stringa2}, @var{numero}} [@code{,} @var{dominio} [@code{,} @var{categoria}]]@code{)}
+Restituisce la forma, singolare o plurale, da usare a seconda del valore
+di @var{numero} per la
+traduzione di @var{stringa1} e @var{stringa2} nel dominio di testo
+@var{dominio} per la categoria di localizzazione @var{categoria}.
+@var{stringa1} @`e la variante al singolare in inglese di un messaggio,
+e @var{stringa2} @`e la variante al plurale in inglese dello stesso messaggio.
+Il valore di default per @var{dominio} @`e il valore corrente di @code{TEXTDOMAIN}.
+Il valore di default per @var{categoria} @`e @code{"LC_MESSAGES"}.
+
+Valgono le stesse osservazioni riguardo all'ordine degli argomenti
+fatte a proposito della funzione @code{dcgettext()}.
+
+@cindex @code{.gmo}, file, specificare la directory di
+@cindex file @code{.gmo}, specificare la directory di
+@cindex @dfn{message object} file (.mo), specificare la directory di
+@cindex file, @dfn{message object} (.mo), specificare la directory di
+@cindexgawkfunc{bindtextdomain}
+@item @code{bindtextdomain(@var{directory}} [@code{,} @var{dominio} ]@code{)}
+Cambia la directory nella quale
+@command{gettext} va a cercare i file @file{.gmo}, per il caso in cui questi
+non possano risiedere nelle posizioni standard
+(p.es., in fase di test).
+Restituisce la directory alla quale @var{dominio} @`e ``collegato''.
+
+Il @var{dominio} di default @`e il valore di @code{TEXTDOMAIN}.
+Se l'argomento @var{directory} @`e impostato alla stringa nulla (@code{""}),
+@code{bindtextdomain()} restituisce il collegamento corrente applicabile
+al @var{dominio} specificato.
+@end table
+
+Per usare queste funzionalit@`a in un programma @command{awk},
+va seguita la procedura qui indicata:
+
+@enumerate
+@cindex @code{BEGIN}, criterio di ricerca, variabile @code{TEXTDOMAIN} e
+@cindex criterio di ricerca @code{BEGIN}, variabile @code{TEXTDOMAIN} e
+@cindex @code{TEXTDOMAIN}, variabile, criterio di ricerca @code{BEGIN} e
+@cindex variabile @code{TEXTDOMAIN}, criterio di ricerca @code{BEGIN} e
+@item
+Impostare la variabile @code{TEXTDOMAIN} al dominio di testo del
+programma.  @`E meglio fare ci@`o all'interno di una regola @code{BEGIN}
+(@pxref{BEGIN/END}),
+ma si pu@`o anche fare dalla riga di comando, usando l'opzione @option{-v}
+(@pxref{Opzioni}):
+
+@example
+BEGIN @{
+    TEXTDOMAIN = "guide"
+    @dots{}
+@}
+@end example
+
+@cindex @code{_} (trattino basso), stringa traducibile
+@cindex trattino basso (@code{_}), stringa traducibile
+@item
+Marcare tutte le stringhe traducibili anteponendo loro un
+trattino basso (@samp{_}). Il trattino  @emph{deve} essere adiacente ai
+doppi apici di apertura della stringa.  Per esempio:
+
+@example
+print _"hello, world"
+x = _"you goofed"
+printf(_"Number of users is %d\n", nusers)
+@end example
+
+@item
+Se le stringhe da visualizzare sono create dinamicamente, @`e ancora possibile
+tradurle, usando la funzione predefinita @code{dcgettext()}:@footnote{I miei
+ringraziamenti a Bruno Haible per questo esempio.}
+
+@example
+if (assonnato)
+    messaggio = dcgettext("%d clienti mi scocciano\n", "adminprog")
+else
+    messaggio = dcgettext("mi diverto con %d clienti\n", "adminprog")
+printf(messaggio, numero_clienti)
+@end example
+
+In questo esempio, la chiamata a @code{dcgettext()} specifica un diverso
+dominio di testo (@code{"adminprog"}) in cui trovare il
+messaggio, ma usa la categoria di default @code{"LC_MESSAGES"}.
+
+Il precedente esempio funziona solo se @code{numero_clienti} @`e un numero maggiore
+di uno.
+Per questo esempio sarebbe pi@`u appropriato usare la funzione @code{dcngettext()}:
+
+@example
+if (assonnato)
+    messaggio = dcngettext("%d cliente mi scoccia\n",
+			   "%d clienti mi scocciano\n",
+			   numero_clienti, "adminprog")
+else
+    messaggio = dcngettext("mi diverto con %d cliente\n",
+			   "mi diverto con %d clienti\n",
+			   numero_clienti, "adminprog")
+printf(messaggio, numero_clienti)
+@end example
+
+
+@cindex @code{LC_MESSAGES}, categoria di localizzazione, funzione @code{bindtextdomain()} di (@command{gawk})
+@item
+In fase di sviluppo, si pu@`o scegliere di tenere il file @file{.gmo}
+in una directory a parte, solo per provarlo.  Ci@`o si fa
+con la funzione predefinita @code{bindtextdomain()}:
+
+@example
+BEGIN @{
+   TEXTDOMAIN = "guide"   # dominio di testo regolare
+   if (Testing) @{
+       # dove trovare il file in prova
+       bindtextdomain("testdir")
+       # joe si occupa del programma adminprog
+       bindtextdomain("../joe/testdir", "adminprog")
+   @}
+   @dots{}
+@}
+@end example
+
+@end enumerate
+
+@xref{Esempio I18N}
+per un programma di esempio che illustra i passi da seguire per creare
+e usare traduzioni nei programmi @command{awk}.
+
+@node I18N per traduttore
+@section Traduzione dei programmi @command{awk}
+
+@cindex @code{.po}, file
+@cindex file @code{.po}
+@cindex @dfn{portable object} file (.po)
+@cindex file, @dfn{portable object} (.po)
+Dopo aver marcato le stringhe che si desidera tradurre in un programma,
+queste vanno estratte per creare il file iniziale @file{.pot}.
+Durante la traduzione, @`e spesso utile modificare l'ordine nel quale
+gli argomenti passati a @code{printf} vengono stampati.
+
+L'opzione da riga di comando @option{--gen-pot} di @command{gawk} serve a
+estrarre i messaggi, ed @`e esposta qui di seguito.
+Dopo di che, verr@`a illustrata la possibilit@`a di modificare l'ordine
+in cui l'istruzione @code{printf} stampa gli argomenti che le sono passati
+in fase di esecuzione.
+
+@menu
+* Estrazione di stringhe::  Estrarre stringhe marcate.
+* Ordinamento di printf::   Riordinare argomenti @code{printf}
+* Portabilit@`a nell'I18N::   Problemi di portabilit@`a a livello di @command{awk}.
+@end menu
+
+@node Estrazione di stringhe
+@subsection Estrarre stringhe marcate
+@cindex stringhe, estrazione di
+@cindex @option{--gen-pot}, opzione
+@cindex opzione @option{--gen-pot}
+@cindex opzioni sulla riga di comando, estrazione stringhe
+@cindex riga di comando, opzioni, estrazione stringhe
+@cindex stringhe marcate, estrazione di (internazionalizzazione)
+@cindex marcate, estrazione di stringhe (internazionalizzazione)
+@cindex estrazione di stringhe marcate (internazionalizzazione)
+
+@cindex @option{--gen-pot}, opzione
+@cindex opzione @option{--gen-pot}
+Una volta che il programma @command{awk} funziona, e tutte le stringhe
+sono state marcate ed @`e stato impostato (e forse fissato) il dominio di
+testo, @`e ora di preparare le traduzioni.
+Per prima cosa, usando l'opzione di riga di comando @option{--gen-pot},
+si crea il file iniziale @file{.pot}:
+
+@example
+gawk --gen-pot -f guide.awk > guide.pot
+@end example
+
+@cindex @code{xgettext}, programma di utilit@`a
+@cindex programma di utilit@`a @code{xgettext}
+Quando viene chiamato specificando @option{--gen-pot}, @command{gawk} non
+esegue il programma.  Il programma viene esaminato come al solito, e tutte
+le stringhe che sono state marcate per essere tradotte vengono scritte nello
+standard output, nel formato di un file Portable Object di GNU
+@command{gettext}.
+L'output comprende anche quelle stringhe costanti che appaiono come primo
+argomento della funzione @code{dcgettext()} o come primo e secondo
+argomento della funzione @code{dcngettext()}.@footnote{Il comando di utilit@`a
+@command{xgettext} che fa parte del pacchetto distribuito come
+@command{gettext} @`e in grado di gestire i file di tipo @file{.awk}.}
+Il file @file{.pot} cos@`{@dotless{i}} generato
+andrebbe distribuito insieme al programma @command{awk}; i traduttori
+potranno eventualmente utilizzarlo per preparare delle traduzioni, le quali
+potranno a loro volta essere distribuite.
+@xref{Esempio I18N}
+per una lista esauriente dei passi necessari per creare e testare
+traduzioni per il programma @command{guide}.
+
+@node Ordinamento di printf
+@subsection Riordinare argomenti di @code{printf}
+
+@cindex @code{printf}, istruzione, specificatori di posizione
+@cindex istruzione @code{printf}, specificatori posizionali
+@cindex posizionali, specificatori, istruzione @code{printf}
+@cindex specificatori posizionali, istruzione @code{printf}
+Le stringhe di formattazione per @code{printf} e @code{sprintf()}
+(@pxref{Printf})
+hanno un problema speciale con le traduzioni.
+Si consideri il seguente esempio:@footnote{Questo esempio @`e preso in
+prestito dal manuale  del comando GNU @command{gettext}.}
+
+@example
+printf(_"String `%s' has %d characters\n",
+          string, length(string)))
+@end example
+
+Una possibile traduzione in italiano di questo messaggio potrebbe essere:
+
+@example
+"%d @`e la lunghezza della stringa `%s'\n"
+@end example
+
+Il problema dovrebbe essere ovvio: l'ordine delle specifiche di
+formattazione @`e differente da quello originale!
+@code{gettext()}, che pure pu@`o restituire la stringa tradotta
+in fase di esecuzione, non @`e in grado di cambiare l'ordine degli argomenti
+nella chiamata a @code{printf}.
+
+Per risolvere questo problema, gli specificatori di formato di @code{printf}
+possono avere un elemento in pi@`u, opzionale, detto @dfn{specificatore
+posizionale}.  Per esempio:
+
+@example
+"%2$d @`e la lunghezza della stringa `%1$s'\n"
+@end example
+
+Qui, lo specificatore posizionale consiste in un numero intero, che indica
+quale argomento utilizzare, seguito da un carattere @samp{$}.
+I numeri partono da uno, e la stringa di formattazione vera e propria
+@emph{non} @`e inclusa.  Quindi, nell'esempio seguente, @samp{stringa} @`e
+il primo argomento e @samp{length(stringa)} @`e il secondo:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>     @kbd{stringa = "Non v\47allarmate!"}
+>     @kbd{printf "%2$d caratteri compongono \"%1$s\"\n",}
+>                         @kbd{stringa, length(stringa)}
+> @kbd{@}'}
+@print{} 16 caratteri compongono "Non v\47allarmate!"
+@end example
+
+Se presenti, gli specificatori posizionali precedono, nella specifica di
+formato, i flag, la larghezza del campo e/o la precisione.
+
+Gli specificatori posizionali possono essere usati anche se si specifica una
+larghezza dinamica dei campi, e della capacit@`a di precisione:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>    @kbd{printf("%*.*s\n", 10, 20, "hello")}
+>    @kbd{printf("%3$*2$.*1$s\n", 20, 10, "hello")}
+> @kbd{@}'}
+@print{}      hello
+@print{}      hello
+@end example
+
+@quotation NOTA
+Se si usa @samp{*} con uno specificatore posizionale, il carattere @samp{*}
+viene per primo, seguito dal numero che indica la posizione, a sua volta
+seguito dal @samp{$}.
+Ci@`o pu@`o parere poco intuitivo.
+@end quotation
+
+@cindex istruzione @code{printf}, specificatori posizionali, frammisti a formati standard
+@cindex @code{printf}, istruzione, specificatori posizionali, frammisti a formati standard
+@cindex specificatori posizionali, istruzione @code{printf}, frammisti a formati standard
+@cindex formato, specificatori di, frammisti a specificatori posizionali non standard
+@cindex specificatori di formato, frammisti a specificatori posizionali non standard
+@command{gawk} non consente di mischiare specificatori di formato standard
+con altri contenenti degli specificatori posizionali in una stessa stringa di
+formato:
+
+@example
+@group
+$ @kbd{gawk 'BEGIN @{ printf "%d %3$s\n", 1, 2, "ciao" @}'}
+@error{} gawk: riga com.:1: fatale: `count$' va usato per tutti
+@error{}                             i formati o per nessuno
+@end group
+@end example
+
+@quotation NOTA
+Ci sono alcuni casi patologici in cui @command{gawk} potrebbe non inviare
+alcun messaggio diagnostico, anche quando sarebbe necessario.
+In tali casi, l'output pu@`o non essere quello atteso.
+Rimane sempre una pessima idea quella di tentare di mischiare i formati,
+anche se @command{gawk} non riesce ad accorgersene.
+@end quotation
+
+Sebbene gli specificatori posizionali possano essere usati direttamente nei
+programmi @command{awk}, il motivo per cui sono stati introdotti @`e perch@'e
+siano d'aiuto nel produrre traduzioni corrette della stringa di
+formattazione in lingue differenti da quella nella quale il programma @`e stato
+originariamente scritto.
+
+@node Portabilit@`a nell'I18N
+@subsection Problemi di portabilit@`a a livello di @command{awk}
+
+@cindex portabilit@`a, internazionalizzazione e
+@cindex internazionalizzazione, localizzazione, portabilit@`a e
+Le funzionalit@`a di internazionalizzazione di @command{gawk} sono state
+appositamente implementate per avere il minimo impatto possibile sulla
+portabilit@`a, verso altre versioni di @command{awk}, dei programmi
+@command{awk} che ne fanno uso.
+Si consideri questo programma:
+
+@example
+BEGIN @{
+    TEXTDOMAIN = "guide"
+    if (Test_Guide)   # da impostare tramite -v
+        bindtextdomain("/test/guide/messages")
+    print _"don't panic!"
+@}
+@end example
+
+@noindent
+Per il modo in cui @`e scritto, non funzioner@`a con altre versioni di
+@command{awk}.
+Tuttavia, @`e in realt@`a quasi portabile, e richiede modifiche minime:
+
+@itemize @value{BULLET}
+@cindex @code{TEXTDOMAIN}, variabile, portabilit@`a e
+@cindex variabile @code{TEXTDOMAIN}, portabilit@`a e
+@item
+Le assegnazioni di valori a @code{TEXTDOMAIN} non avranno effetto alcuno,
+perch@'e @code{TEXTDOMAIN} non @`e una variabile speciale in altre
+implementazioni di @command{awk}.
+
+@item
+Versioni Non-GNU di @command{awk} considerano le stringhe marcate
+come la concatenazione di una variabile di nome @code{_} con la stringa che
+viene subito dopo.@footnote{Questo @`e
+un buon materiale per una gara di ``Oscurit@`a @command{awk}''.}
+Tipicamente, la variabile @code{_} ha come valore la stringa nulla
+(@code{""}), il che produce come risultato la stringa
+originale.
+
+@item
+Definendo delle funzioni ``fittizie'' per sostituire @code{dcgettext()},
+@code{dcngettext()} e @code{bindtextdomain()}, il programma @command{awk}
+pu@`o essere reso eseguibile, ma
+tutti i messaggi verranno inviati nella lingua originale del programma.
+Per esempio:
+
+@cindex @code{bindtextdomain()}, funzione (@command{gawk}), portabilit@`a e
+@cindex funzione @code{bindtextdomain()} (@command{gawk}), portabilit@`a e
+@cindex @code{dcgettext()}, funzione (@command{gawk}), portabilit@`a e
+@cindex funzione @code{dcgettext()} (@command{gawk}), portabilit@`a e
+@cindex @code{dcngettext()}, funzione (@command{gawk}), portabilit@`a e
+@cindex funzione @code{dcngettext()} (@command{gawk}), portabilit@`a e
+@example
+@c file eg/lib/libintl.awk
+function bindtextdomain(dir, domain)
+@{
+    return dir
+@}
+
+function dcgettext(string, domain, category)
+@{
+    return string
+@}
+
+function dcngettext(string1, string2, number, domain, category)
+@{
+    return (number == 1 ? string1 : string2)
+@}
+@c endfile
+@end example
+
+@item
+L'uso di specificazioni posizionali in @code{printf} o
+@code{sprintf()} @emph{non} @`e portabile.
+Per supportare @code{gettext()} nella programmazione in linguaggio C,
+molte versioni C di @code{sprintf()} supportano specificatori posizionali.
+Ma la cosa funziona solo se nella chiamata di funzione sono stati specificati
+argomenti a sufficienza.  Molte
+versioni di @command{awk} passano i formati e gli argomenti di @code{printf},
+senza modificarli, alla funzione di libreria in linguaggio C @code{sprintf()},
+ma solo un formato e un argomento alla volta.  Quel che succede se si usa una
+specificazione posizionale resta indeterminato.
+Tuttavia, poich@'e le specificazioni posizionali sono usate principalmente
+per le stringhe di formattazione @emph{tradotte}, e poich@'e le versioni
+non-GNU di @command{awk} non utilizzano mai le stringhe tradotte, ci@`o non
+dovrebbe, in pratica, causare problemi.
+@end itemize
+
+@node Esempio I18N
+@section Un semplice esempio di internazionalizzazione.
+
+Vediamo ora un esempio dettagliato di come internazionalizzare e localizzare
+un semplice programma @command{awk}, usando come nostro programma sorgente
+originale il file @file{guide.awk}:
+
+@example
+@c file eg/prog/guide.awk
+BEGIN @{
+    TEXTDOMAIN = "guide"
+    bindtextdomain(".")  # per la fase di test
+    print _"Don't Panic"
+    print _"The Answer Is", 42
+    print "Pardon me, Zaphod who?"
+@}
+@c endfile
+@end example
+
+@noindent
+Eseguire @samp{gawk --gen-pot} per creare il file @file{.pot}:
+
+@example
+$ @kbd{gawk --gen-pot -f guide.awk > guide.pot}
+@end example
+
+@noindent
+Questo produce:
+
+@example
+@c file eg/data/guide.po
+#: guide.awk:4
+msgid "Don't Panic"
+msgstr ""
+
+#: guide.awk:5
+msgid "The Answer Is"
+msgstr ""
+
+@c endfile
+@end example
+
+Questo modello di @dfn{portable object} va salvato e riutilizzato per ogni
+lingua in cui l'applicazione viene tradotta.  La stringa @code{msgid} @`e
+seguita dalla stringa originale da tradurre, e la stringa @code{msgstr}
+conterr@`a la traduzione.
+
+@quotation NOTA
+Le stringhe non aventi come prefisso un trattino basso non sono inserite
+nel file @file{guide.pot}.
+@end quotation
+
+Successivamente, i messaggi devono essere tradotti.
+Questa @`e una traduzione in un ipotetico dialetto dell'inglese,
+chiamato ``Mellow'':@footnote{Forse sarebbe meglio chiamarlo
+``Hippy.'' Meglio non indagare oltre.}
+
+@example
+@group
+$ @kbd{cp guide.pot guide-mellow.po}
+@var{Aggiungere traduzioni al file} guide-mellow.po @dots{}
+@end group
+@end example
+
+@noindent
+Ecco le traduzioni:
+
+@example
+@c file eg/data/guide-mellow.po
+#: guide.awk:4
+msgid "Don't Panic"
+msgstr "Hey man, relax!"
+
+#: guide.awk:5
+msgid "The Answer Is"
+msgstr "Like, the scoop is"
+
+@c endfile
+@end example
+
+@cindex Linux
+@cindex GNU/Linux
+@quotation NOTA
+Le istruzione che seguono valgono per un ambiente GNU/Linux con la
+Libreria GNU C.  Fate attenzione!  I passi descritti possono
+variare col tempo, e la descrizione seguente pu@`o non essere accurata
+per tutte le distribuzione GNU/Linux, e la procedura pu@`o essere
+interamente differente per altri sistemi operativi.
+@end quotation
+
+Il passo successivo @`e di creare la directory che contenga il file binario
+con le traduzioni dei messaggi (file .mo [message object]) e
+creare in quella directory il file @file{guide.mo}.
+La directory ha un nome del tipo @file{@var{locale}/LC_MESSAGES}, dove
+@var{locale} @`e un nome di localizzazione noto alle routine C
+di @command{gettext}.
+
+Come sapere quale localizzazione usare?  Le routine C di @command{gettext}
+usano quattro variabili d'ambiente.  Esse sono, nell'ordine:
+@env{$LANGUAGE}, @env{$LC_ALL}, @env{$LANG}, e
+@env{$LC_MESSAGES}.@footnote{Pi@`u o meno... In effetti sembra che quando
+la variabile d'ambiente @env{$LC_ALL} @`e impostata al valore @samp{C},
+non viene effettuata alcuna traduzione.  Vai a capire...}
+Quindi, noi controlliamo il valore di @env{$LANGUAGE}:
+
+@example
+$ @kbd{echo $LANGUAGE}
+@print{} en_US.UTF-8
+@end example
+
+@noindent
+Il passo succesivo @`e creare le directory:
+
+@example
+$ @kbd{mkdir en_US.UTF-8 en_US.UTF-8/LC_MESSAGES}
+@end example
+
+@cindex @code{.po}, file, conversione in @code{.mo}
+@cindex file @code{.po}, conversione in @code{.mo}
+@cindex @code{.mo}, file, conversione da @code{.po}
+@cindex file @code{.mo}, conversione da @code{.po}
+@cindex @dfn{portable object} file (.po), conversione in @dfn{message object} file
+@cindex file, @dfn{portable object} (.po), conversione in @dfn{message object} file
+@cindex @dfn{message object} file (.mo), conversione da @dfn{portable object} file
+@cindex file, @dfn{message object} (.mo), conversione da @dfn{portable object} file
+@cindex @command{msgfmt}, programma di utilit@`a
+@cindex programma di utilit@`a @command{msgfmt}
+Il programma di utilit@`a @command{msgfmt} effettua la conversione del file
+leggibile, in formato testo, @file{.po} nel file, in formato binario,
+@file{.mo}.
+Per default, @command{msgfmt} crea un file di nome @file{messages}.
+A questo file dev'essere assegnato un nome appropriato, e va messo nella
+directory predisposta (usando l'opzione @option{-o}) in modo che
+@command{gawk} sia in grado di trovarlo:
+
+@example
+$ @kbd{msgfmt guide-mellow.po -o en_US.UTF-8/LC_MESSAGES/guide.mo}
+@end example
+
+Infine, eseguiamo il programma per provare se funziona:
+
+@example
+$ @kbd{gawk -f guide.awk}
+@print{} Hey man, relax!
+@print{} Like, the scoop is 42
+@print{} Pardon me, Zaphod who?
+@end example
+
+Se le tre funzioni che rimpiazzano @code{dcgettext()}, @code{dcngettext()},
+e @code{bindtextdomain()}
+(@pxref{Portabilit@`a nell'I18N})
+sono contenute in un file di nome @file{libintl.awk},
+@`e possibile eseguire @file{guide.awk} senza modificarlo, nel modo seguente:
+
+@example
+$ @kbd{gawk --posix -f guide.awk -f libintl.awk}
+@print{} Don't Panic
+@print{} The Answer Is 42
+@print{} Pardon me, Zaphod who?
+@end example
+
+@node Gawk internazionalizzato
+@section @command{gawk} stesso @`e internazionalizzato
+
+Il comando @command{gawk} stesso @`e stato internazionalizzato
+usando il pacchetto GNU @command{gettext}.
+(GNU @command{gettext} @`e descritto in
+maniera esauriente in
+@ifinfo
+@inforef{Top, , GNU @command{gettext} utilities, gettext, GNU @command{gettext} utilities}.)
+@end ifinfo
+@ifnotinfo
+@uref{https://www.gnu.org/software/gettext/manual/,
+@cite{GNU @command{gettext} utilities}}.)
+@end ifnotinfo
+Al momento in cui questo libro @`e stato scritto, la versione pi@`u recente di
+GNU @command{gettext} @`e
+@uref{ftp://ftp.gnu.org/gnu/gettext/gettext-0.19.8.1.tar.gz,
+@value{PVERSION} 0.19.8.1}.
+
+Se esiste una traduzione dei messaggi di @command{gawk},
+@command{gawk} invia messaggi, avvertimenti, ed errori fatali
+utilizzando la lingua locale.
+
+@node Sommario I18N
+@section Sommario
+@itemize @value{BULLET}
+@item
+Internazionalizzazione significa scrivere un programma in modo che
+possa interagire in molte lingue senza che sia necessario cambiare il codice
+sorgente.
+Localizzazione significa fornire i dati necessari perch@'e un programma
+internazionalizzato possa interagire usando una determinata lingua.
+
+@item
+@command{gawk} usa il comando GNU @command{gettext} per consentire
+l'internazionalizzazione e la localizzazione di programmi @command{awk}.
+Un dominio di testo di un programma identifica il programma, e consente di
+raggruppare tutti i messaggi e gli altri dati del programma in un solo posto.
+
+@item
+Si marcano le stringhe in un programma da tradurre preponendo loro un
+trattino basso.  Una volta fatto questo, queste stringhe sono estratte
+in un file @file{.pot}.  Questo file @`e copiato, per ogni lingua, in un file
+@file{.po} e i file @file{.po} sono
+compilati in file @file{.gmo} che saranno usati in fase di
+esecuzione del programma.
+
+@item
+@`E possibile usare specificazioni posizionali con le istruzioni
+@code{sprintf()} e @code{printf} per modificare la posizione del valore
+degli argomenti nelle stringhe di formato e nell'output.  Ci@`o @`e utile nella
+traduzione di stringhe di
+formattazione dei messaggi.
+
+@item
+Le funzionalit@`a di internazionalizzazione sono state progettate in modo
+da poter essere facilmente gestite in un programma @command{awk} standard.
+
+@item
+Anche il comando @command{gawk} @`e stato internazionalizzato e viene
+distribuito con traduzioni in molte lingue dei messaggi inviati in fase di
+esecuzione.
+
+@end itemize
+
+
+@node Debugger
+@chapter Effettuare il debug dei programmi @command{awk}
+@cindex debug dei programmi @command{awk}
+
+@c The original text for this chapter was contributed by Efraim Yawitz.
+
+Sarebbe bello se i programmi per il calcolatore funzionassero perfettamente la
+prima volta che vengono eseguiti, ma nella vita reale questo accade raramente,
+qualunque sia la complessit@`a dei programmi.  Perci@`o la maggior parte dei
+linguaggi di programmazione hanno a disposizione degli strumenti che facilitano
+la ricerca di errori (@dfn{debugging}) nei programmi, e @command{awk} non fa
+eccezione.
+
+Il @dfn{debugger} di @command{gawk} @`e di proposito costruito sul modello del
+debugger da riga di comando
+@uref{https://www.gnu.org/software/gdb/, GNU Debugger (GDB)}.
+Se si ha familiarit@`a con GDB, sar@`a facile imparare come usare @command{gawk}
+per eseguire il debug dei propri programmi.
+
+@menu
+* Debugging::                    Introduzione al debugger di @command{gawk}.
+* Esempio di sessione di debug:: Esempio di sessione di debug.
+* Lista dei comandi di debug::   Principali comandi di debug.
+* Supporto per Readline::        Supporto per Readline.
+* Limitazioni::                  Limitazioni e piani per il futuro.
+* Sommario sul debug::           Sommario sul debug.
+@end menu
+
+@node Debugging
+@section Introduzione al debugger di @command{gawk}
+
+Questa @value{SECTION}, dopo un'introduzione sul debug in generale, inizia
+la trattazione del debug in @command{gawk}.
+
+@menu
+* Nozioni sul debug::           Generalit@`a sul debug.
+* Terminologia nel debug::      Ulteriori nozioni sul debug.
+* Debug di Awk::                Eseguire il debug di Awk.
+@end menu
+
+@node Nozioni sul debug
+@subsection Generalit@`a sul debug
+
+(Se si sono usati dei debugger in altri linguaggi, si pu@`o andare direttamente
+alla @ref{Debug di Awk}.)
+
+Naturalmente, un programma di debug non pu@`o correggere gli errori al posto del
+programmatore, perch@'e non pu@`o sapere quello che il programmatore o gli utenti
+considerano un ``bug'' e non una ``funzionalit@`a''.  (Talvolta, anche noi umani
+abbiamo difficolt@`a nel determinarlo.)
+In quel caso, cosa ci si pu@`o aspettare da un tale strumento?  La risposta
+dipende dal linguaggio su cui si effettua il debug, comunque in generale ci si
+pu@`o attendere almeno questo:
+
+@cindex debugger, funzionalit@`a del
+@itemize @value{BULLET}
+@item
+La possibilit@`a di osservare l'esecuzione delle istruzioni di un programma una
+per una, dando al programmatore l'opportunit@`a di pensare a quel che accade a
+una scala temporale di secondi, minuti od ore, piuttosto che alla scala dei
+nanosecondi alla quale normalmente viene eseguito il codice.
+
+@item
+L'opportunit@`a, non solo di osservare passivamente le operazioni del progamma,
+ma di controllarlo e tentare diversi percorsi di esecuzione, senza dover
+modificare i file sorgenti.
+
+@item
+La possibilit@`a di vedere i valori o i dati nel programma in qualsiasi punto
+dell'esecuzione, e anche di cambiare i dati al volo, per vedere come questo
+influisca su ci@`o che accade dopo.  (Questo include spesso la capacit@`a di
+esaminare le strutture interne dei dati oltre alle variabili che
+sono state effettivamente definite nel codice del programma.)
+
+@item
+La possibilit@`a di ottenere ulteriori informazioni sullo stato del programma
+o anche sulle sue strutture interne.
+@end itemize
+
+Tutti questi strumenti sono di grande aiuto e permettono di usare l'abilit@`a
+che si possiede e la comprensione che si ha degli obiettivi del programma
+per trovare dove si verificano i problemi (o, in alternativa, per
+comprendere meglio la logica di un programma funzionante, di cui si sia
+l'autore, o anche di un programma scritto da altri).
+
+@node Terminologia nel debug
+@subsection Concetti fondamentali sul debug
+
+@cindex debugger, terminologia
+Prima di entrare nei dettagli, dobbiamo introdurre diversi
+importanti concetti che valgono per tutti i debugger.
+La seguente lista definisce i termini usati nel resto di
+questo @value{CHAPTER}:
+
+@table @dfn
+@cindex @dfn{stack} di chiamata (debugger)
+@cindex debugger, @dfn{stack} di chiamata
+@cindex debugger, pila di chiamata
+@cindex @dfn{stack frame} (debugger)
+@cindex debugger, @dfn{stack frame}
+@item Stack frame
+Durante la loro esecuzione i programmi normalmente chiamano delle funzioni.
+Una funzione pu@`o  a sua volta chiamarne un'altra, o pu@`o richiamare se stessa
+(ricorsione).  La
+catena di funzioni chiamate (il programma principale chiama A, che chiama B,
+che chiama C) pu@`o essere vista come una pila di funzioni in esecuzione: la
+funzione correntemente in esecuzione @`e quella in cima alla pila, e quando
+questa finisce (ritorna al chiamante),
+quella immediatamente sotto diventa la funzione
+attiva.  Tale pila (@dfn{stack}) @`e chiamata @dfn{call stack} (pila delle chiamate).
+
+Per ciascuna funzione della pila delle chiamate (@dfn{call stack}), il sistema
+mantiene un'area di dati che contiene i parametri della funzione, le variabili
+locali e i codici di ritorno, e anche ogni altra informazione ``contabile''
+necessaria per gestire la pila delle chiamate.  Quest'area di dati @`e chiamata
+@dfn{stack frame}.
+
+Anche @command{gawk} segue questo modello, e permette l'accesso alla pila
+delle chiamate e a ogni @dfn{stack frame}. @`E possibile esaminare la pila
+delle chiamate, e anche sapere da dove ciascuna funzione sulla pila @`e stata
+invocata.  I comandi che stampano la pila delle chiamate stampano anche le
+informazioni su ogni @dfn{stack frame} (come vedremo pi@`u avanti in dettaglio).
+
+@item Punto d'interruzione
+@cindex @dfn{breakpoint} (debugger)
+@cindex punto d'interruzione (debugger)
+@cindex debugger, @dfn{breakpoint}
+@cindex debugger, punto d'interruzione
+Durante le operazioni di debug, spesso si preferisce lasciare che il programma
+venga eseguito finch@'e non raggiunge un certo punto, e da quel punto in poi si
+continua l'esecuzione un'istruzione alla volta.  Il modo per farlo @`e quello di
+impostare un @dfn{punto d'interruzione} all'interno del programma.  Un punto
+d'interruzione @`e il punto dove l'esecuzione del programma  dovrebbe
+interrompersi (fermarsi), in modo da assumere il controllo dell'esecuzione del
+programma.  Si possono aggiungere e togliere quanti punti d'interruzione si
+vogliono.
+
+@item Punto d'osservazione
+@cindex @dfn{watchpoint} (debugger)
+@cindex punto d'interruzione (debugger)
+@cindex debugger, @dfn{watchpoint}
+@cindex debugger, punto d'interruzione
+Un punto d'osservazione @`e simile a un punto d'interruzione.  La differenza @`e
+che i punti d'interruzione sono orientati attorno al codice; fermano il
+programma quando viene raggiunto un certo punto nel codice.  Un punto
+d'osservazione, invece, fa fermare il programma quando @`e stato
+cambiato il @emph{valore di un dato}.  Questo @`e utile, poich@'e a volte succede
+che una variabile riceva un valore errato, ed @`e difficile rintracciare il punto
+dove ci@`o accade solo leggendo il codice sorgente.
+Usando un punto d'osservazione, si pu@`o fermare il programma in qualunque punto
+vi sia un'assegnazione di variabile, e di solito si individua il codice che
+genera l'errore abbastanza velocemente.
+@end table
+
+@node Debug di Awk
+@subsection Il debug di @command{awk}
+
+Il debug di un programma @command{awk} ha delle particolarit@`a proprie, che
+non sono presenti in programmi scritti in altri linguaggi.
+
+Prima di tutto, il fatto che i programmi @command{awk} ricevano generalmente
+l'input riga per riga da uno o pi@`u file e operino su tali righe usando regole
+specifiche, rende particolarmente agevole organizzare l'esame
+dell'esecuzione del programma facendo riferimento a tali regole.
+Come vedremo, ogni
+regola @command{awk} viene trattata quasi come una chiamata di funzione, col
+proprio specifico blocco di istruzioni.
+
+Inoltre, poich@'e @command{awk} @`e un linguaggio deliberatamente molto
+conciso, @`e facile perdere di vista tutto ci@`o che avviene ``dentro''
+ogni riga di codice @command{awk}.  Il debugger d@`a l'opportunit@`a di
+guardare le singole istruzioni primitive la cui esecuzione @`e innescata
+dai comandi di alto livello di @command{awk}.@footnote{Le ``istruzioni
+primitive'' sono quelle dallo stesso @command{gawk}; il debugger
+non permette di arrivare al livello delle istruzioni hardware della
+macchina.}
+
+@node Esempio di sessione di debug
+@section Esempio di sessione di debug di @command{gawk}
+@cindex esempio di sessione di debug
+@cindex debug, esempio di sessione
+
+Per illustrare l'uso di @command{gawk} come debugger, vediamo un esempio di
+sessione di debug.  Come esempio verr@`a usata un'implementazione @command{awk}
+(con errori)
+del comando POSIX @command{uniq} descritta in precedenza (@pxref{Programma
+uniq}).
+
+@menu
+* Invocazione del debugger::    Come far partire il debugger.
+* Trovare il bug::              Trovare il bug.
+@end menu
+
+@node Invocazione del debugger
+@subsection Come avviare il debugger
+@cindex avviare il debugger
+@cindex debugger, come avviarlo
+@cindex debugger, comandi del, si veda comando del debugger
+
+Per avviare il debugger in @command{gawk} si richiama il comando esattamente
+come al solito, specificando solo un'opzione aggiuntiva,
+@option{--debug}, o la corrispondente opzione breve @option{-D}.
+I file (o il file) che contengono
+il programma e ogni codice ulteriore sono immessi sulla riga di comando come
+argomenti a una o pi@`u opzioni @option{-f}. (@command{gawk} non @`e progettato per
+eseguire il debug di programmi scritti sulla riga di comando, ma solo per
+quello di programmi che risiedono su file.)
+Nel nostro caso, il debugger verr@`a invocato in questo modo:
+
+@example
+$ @kbd{gawk -D -f getopt.awk -f join.awk -f uniq.awk -1 file_di_input}
+@end example
+
+@noindent
+dove entrambi i file @file{getopt.awk} e @file{uniq.awk} sono in @env{$AWKPATH}.
+(Gli utenti esperti di GDB o debugger simili dovrebbero tener presente che
+questa sintassi @`e leggermente differente da quello che sono abituati a usare.
+Col debugger di @command{gawk}, si danno gli argomenti per eseguire il
+programma nella riga di comando al debugger piuttosto che come parte del
+comando @code{run} al prompt del debugger.)
+L'opzione @option{-1} @`e un'opzione per @file{uniq.awk}.
+
+@cindex debugger, prompt
+@cindex prompt del debugger
+Invece di eseguire direttamente il programma sul @file{file_di_input}, come
+@command{gawk} farebbe normalmente, il debugger semplicemente carica
+i file sorgenti del programma, li compila internamente, e poi mostra
+la riga d'invito:
+
+@example
+gawk>
+@end example
+
+@noindent
+da dove si possono impartire i comandi al debugger.  Sin qui non @`e
+stato ancora eseguito nessun codice.
+
+@node Trovare il bug
+@subsection Trovare il bug
+
+Poniamo di avere un problema usando una versione (difettosa) di
+@file{uniq.awk} in modalit@`a ``salta-campi'', perch@'e sembra non
+trovare le righe che sono identiche a condizione di saltare il primo
+campo, come:
+
+@example
+awk, ecco un programma meraviglioso!
+gawk, ecco un programma meraviglioso!
+@end example
+
+Questo potrebbe accadere se noi pensassimo (come in C) che i campi in un record
+siano numerati prendendo come base lo zero, per cui, invece di scrivere:
+
+@example
+campi_ultima = join(vettore_ultima, contatore_file+1, n)
+campi_corrente = join(vettore_corrente, contatore_file+1, m)
+@end example
+
+@noindent
+abbiamo scritto:
+
+@example
+campi_ultima = join(vettore_ultima, contatore_file, n)
+campi_corrente = join(vettore_corrente, contatore_file, m)
+@end example
+
+La prima cosa da fare quando si tenta di indagare su un problema come questo @`e
+quella di mettere un punto d'interruzione (@dfn{breakpoint}) nel programma, in modo
+da poterlo vedere  al lavoro e catturare quello che non va.  Una posizione
+ragionevole per un punto d'interruzione in @file{uniq.awk} @`e all'inizio della
+funzione @code{se_sono_uguali()}, che confronta la riga corrente con la precedente.
+Per impostare il punto d'interruzione, usare il comando @code{b} (@dfn{breakpoint}):
+
+@cindex debugger, impostare un punto d'interruzione
+@cindex @code{breakpoint}, comando del debugger
+@cindex comando del debugger, @code{breakpoint}
+@cindex @code{break}, comando del debugger
+@cindex comando del debugger, @code{break}
+@cindex @code{b}, comando del debugger
+@cindex comando del debugger, @code{b}
+@example
+gawk> @kbd{b se_sono_uguali}
+@print{} Breakpoint 1 impostato al file `uniq.awk', riga 63
+@end example
+
+Il debugger mostra il file e il numero di riga dove si trova il punto
+d'interruzione.  Ora bisogna immettere @samp{r} o @samp{run} e il programma
+viene eseguito fino al primo punto d'interruzione:
+
+@cindex debugger, eseguire il programma
+@cindex comando del debugger, @code{run}
+@cindex @code{run}, comando del debugger
+@example
+gawk> @kbd{r}
+@print{} Partenza del programma:
+@print{} Mi fermo in Rule ...
+@print{} Breakpoint 1, se_sono_uguali(n, m, campi_ultima, campi_corrente,
+@print{}                              vettore_ultima, vettore_corrente)
+@print{} a `uniq.awk':63
+@print{} 63          if (contatore_file == 0 && conta_caratteri == 0)
+gawk>
+@end example
+
+Ora possiamo osservare cosa accade all'interno del nostro programma.
+Prima di tutto, vediamo come siamo arrivati a questo punto.  Sulla riga di
+comando battiamo @samp{bt} (che sta per ``backtrace''), e il debugger risponde
+con un listato degli @dfn{stack frame} correnti:
+
+@cindex debugger, elementi pila, visualizzazione
+@cindex comando del debugger, @code{bt}
+@cindex @code{bt}, comando del debugger
+@cindex comando del debugger, @code{backtrace}
+@cindex @code{backtrace}, comando del debugger
+@example
+gawk> @kbd{bt}
+@print{} #0  se_sono_uguali(n, m, campi_ultima, campi_corrente,
+@print{}                    vettore_ultima, vettore_corrente)
+@print{} a `uniq.awk':63
+@print{} #1  in main() a `uniq.awk':88
+@end example
+
+Questo ci dice che la funzione @code{se_sono_uguali()} @`e stata chiamata
+dal programma principale alla riga 88 del file @file{uniq.awk}.  (Questo non
+sorprende, perch@'e @`e questa l'unica chiamata a @code{se_sono_uguali()} nel
+programma, per@`o in programmi
+pi@`u complessi, sapere chi ha chiamato una funzione e con quali parametri pu@`o
+essere la chiave per trovare l'origine del problema.)
+
+Ora che siamo in @code{se_sono_uguali()}, possiamo iniziare a guardare i valori di
+alcune variabili.  Immaginiamo di battere @samp{p n}
+(@code{p} sta per @dfn{print} [stampa]).  Ci aspetteremo di vedere il valore di
+@code{n}, un parametro di @code{se_sono_uguali()}.  In realt@`a, il debugger
+ci d@`a:
+
+@cindex comando del debugger, @code{print}
+@cindex @code{print}, comando del debugger
+@cindex comando del debugger, @code{p}
+@cindex @code{p}, comando del debugger
+@example
+gawk> @kbd{p n}
+@print{} n = untyped variable
+@end example
+
+@noindent
+In questo caso, @code{n} @`e una variabile locale non inizializzata, perch@'e la
+funzione @`e stata chiamata senza argomenti (@pxref{Chiamate di funzione}).
+
+Una variabile pi@`u utile da visualizzare potrebbe essere la seguente:
+
+@example
+gawk> @kbd{p $0}
+@print{} $0 = "gawk, ecco un programma meraviglioso!"
+@end example
+
+@noindent
+All'inizio questo potrebbe lasciare un tantino perplessi, perch@'e @`e la seconda
+riga dell'input del test.  Vediamo @code{NR}:
+
+@example
+gawk> @kbd{p NR}
+@print{} NR = 2
+@end example
+
+@noindent
+Come si pu@`o vedere, @code{se_sono_uguali()} @`e stata chiamata solo per la seconda
+riga del file.  Naturalmente, ci@`o accade perch@'e il nostro programma contiene
+una regola per @samp{NR == 1}:
+
+@example
+NR == 1 @{
+    ultima = $0
+    next
+@}
+@end example
+
+Bene, controlliamo che questa funzioni correttamente:
+
+@example
+gawk> @kbd{p ultima}
+@print{} ultima = "awk, ecco un programma meraviglioso!"
+@end example
+
+Tutto ci@`o che @`e stato fatto fin qui ha verificato che il programma funziona
+come previsto fino alla chiamata a @code{se_sono_uguali()} compresa; quindi
+il problema dev'essere all'interno di questa funzione.  Per indagare
+ulteriormente, iniziamo a ``scorrere una ad una'' le righe di
+@code{se_sono_uguali()}.  Cominciamo col battere @samp{n} (per ``next''
+[successivo]):
+
+@cindex comando del debugger, @code{n}
+@cindex @code{n}, comando del debugger
+@cindex comando del debugger, @code{next}
+@cindex @code{next}, comando del debugger
+@example
+@group
+gawk> @kbd{n}
+@print{} 66          if (contatore_file > 0) @{
+@end group
+@end example
+
+Questo ci dice che @command{gawk} ora @`e pronto per eseguire la riga 66, che
+decide se assegnare alle righe il trattamento speciale ``salta-campi''
+indicato dall'opzione sulla riga di comando @option{-1}.  (Si noti che abbiamo
+saltato da dov'eravamo prima, alla riga 63, a qui, perch@'e la condizione nella
+riga 63, @samp{if (contatore_file == 0 && conta_caratteri == 0)}, era falsa.)
+
+Continuando a scorrere le righe, ora raggiungiamo la divisione del record
+corrente e dell'ultimo:
+
+@example
+gawk> @kbd{n}
+@print{} 67              n = split(ultima, vettore_ultima)
+gawk> @kbd{n}
+@print{} 68              m = split($0, vettore_corrente)
+@end example
+
+A questo punto, potremmo stare a vedere in quante parti il nostro record
+@`e stato suddiviso, quindi proviamo a osservare:
+
+@example
+gawk> @kbd{p n m vettore_ultima vettore_corrente}
+@print{} n = 5
+@print{} m = untyped variable
+@print{} vettore_ultima = array, 5 elements
+@print{} vettore_corrente = untyped variable
+@end example
+
+@noindent
+(Il comando @code{p} pu@`o accettare pi@`u argomenti, analogamente
+all'istruzione di @command{awk} @code{print}.)
+
+Questo ci lascia piuttosto perplessi.  Tutto ci@`o che abbiamo trovato @`e che ci
+sono cinque elementi in @code{vettore_ultima}; @code{m} e @code{vettore_corrente} non hanno valori
+perch@'e siamo alla riga 68 che non @`e ancora stata eseguita.  Questa
+informazione @`e abbastanza utile (ora sappiamo che nessuna delle parole @`e stata
+lasciata fuori accidentalmente), ma sarebbe desiderabile vedere i valori
+del vettore.
+
+Una prima possibilit@`a @`e quella di usare degli indici:
+
+@cindex debugger, stampare singoli elementi di un vettore
+@cindex stampare singoli elementi di un vettore, nel debugger
+@example
+gawk> @kbd{p vettore_ultima[0]}
+@print{} "0" non presente nel vettore `vettore_ultima'
+@end example
+
+@noindent
+Oops!
+
+@example
+gawk> @kbd{p vettore_ultima[1]}
+@print{} vettore_ultima["1"] = "awk,"
+@end example
+
+Questo metodo sarebbe piuttosto lento per un vettore con 100 elementi, per cui
+@command{gawk} fornisce una scorciatoia (che fa venire in mente un altro
+linguaggio che non nominiamo):
+
+@cindex debugger, stampare tutti gli elementi di un vettore
+@cindex stampare tutti gli elementi di un vettore, nel debugger
+@example
+gawk> @kbd{p @@vettore_ultima}
+@print{} vettore_ultima["1"] = "awk,"
+@print{} vettore_ultima["2"] = "ecco"
+@print{} vettore_ultima["3"] = "un"
+@print{} vettore_ultima["4"] = "programma"
+@print{} vettore_ultima["5"] = "meraviglioso!"
+@end example
+
+Finora, sembra che tutto vada bene.  Facciamo un altro passo,
+o anche due:
+
+@example
+gawk> @kbd{n}
+@print{} 69              campi_ultima = join(vettore_ultima, contatore_file, n)
+gawk> @kbd{n}
+@print{} 70              campi_corrente = join(vettore_corrente, contatore_file, m)
+@end example
+
+Bene, eccoci arrivati al nostro errore (ci spiace di aver rovinato la
+sorpresa).
+Quel che avevamo in mente era di unire i campi a partire dal secondo per
+creare il record virtuale da confrontare, e se il primo campo aveva il numero
+zero, questo avrebbe funzionato.  Vediamo quel che abbiamo finora:
+
+@example
+gawk> @kbd{p campi_ultima campi_corrente}
+@print{} campi_ultima = "awk, ecco un programma meraviglioso!"
+@print{} campi_corrente = "gawk, ecco un programma meraviglioso!"
+@end example
+
+Ehi! queste frasi suonano piuttosto familiari!  Sono esattamente i nostri
+record di input originali, inalterati.  Pensandoci un po' (il cervello umano @`e
+ancora il miglior strumento di debug), ci si rende conto che eravamo fuori di
+uno!
+
+Usciamo dal debugger:
+
+@example
+gawk> @kbd{q}
+@print{} Il programma @`e in esecuzione. Esco comunque (y/n)? @kbd{y}
+@end example
+
+@noindent
+Quindi modifichiamo con un editore di testo:
+
+@example
+campi_ultima = join(vettore_ultima, contatore_file+1, n)
+campi_corrente = join(vettore_corrente, contatore_file+1, m)
+@end example
+
+@noindent
+e il problema @`e risolto!
+
+@node Lista dei comandi di debug
+@section I principali comandi di debug
+
+L'insieme dei comandi del debugger di @command{gawk} pu@`o essere diviso nelle
+seguenti categorie:
+
+@itemize @value{BULLET}
+
+@item
+Controllo di punti d'interruzione
+
+@item
+Controllo di esecuzione
+
+@item
+Vedere e modificare dati
+
+@item
+Lavorare con le pile
+
+@item
+Ottenere informazioni
+
+@item
+Comandi vari
+@end itemize
+
+@cindex debugger, ripetere dei comandi
+@cindex ripetere dei comandi, nel debugger
+Ciascuna di esse @`e trattata
+@ifnotinfo
+nelle seguenti
+@end ifnotinfo
+@ifinfo
+nei seguenti
+@end ifinfo
+@value{SUBSECTIONS}.
+Nelle descrizioni seguenti, i comandi che possono essere abbreviati
+mostrano l'abbreviazione su una seconda riga di descrizione.
+Un nome di comando del debugger pu@`o essere anche troncato se la parte gi@`a scritta
+non @`e ambigua. Il debugger ha la capacit@`a predefinita di ripetere
+automaticamente il precedente comando semplicemente battendo @kbd{Invio}.
+Questo vale per i comandi @code{list}, @code{next}, @code{nexti},
+@code{step}, @code{stepi} e @code{continue} quando sono eseguiti senza
+argomenti.
+
+@menu
+* Controllo dei breakpoint::       Controllo dei punti d'interruzione.
+* Controllo esecuzione debugger::  Controllo di esecuzione.
+* Vedere e modificare dati::       Vedere e modificare dati.
+* Stack di esecuzione::            Lavorare con le pile.
+* Informazioni sul debugger::      Ottenere informazioni sullo stato del
+                                   programma e del debugger.
+* Comandi vari del debugger::      Comandi vari del debugger.
+@end menu
+
+@node Controllo dei breakpoint
+@subsection Controllo dei punti d'interruzione
+
+Come abbiamo gi@`a visto, la prima cosa che si dovrebbe fare in una sessione di
+debug @`e quella di definire dei punti d'interruzione, poich@'e altrimenti il
+programma verr@`a eseguito come se non fosse sotto il debugger.  I comandi per
+controllare i punti d'interruzione sono:
+
+@table @asis
+@cindex comando del debugger, @code{b} (alias per @code{break})
+@cindex comando del debugger, @code{break}
+@cindex @code{break}, comando del debugger
+@cindex @code{b}, comando del debugger (alias per @code{break})
+@cindex impostare un punto d'interruzione
+@cindex breakpoint, impostare
+@cindex punto d'interruzione (breakpoint), impostare
+@item @code{break} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}] [@code{"@var{espressione}"}]
+@itemx @code{b} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}] [@code{"@var{espressione}"}]
+Senza argomenti, imposta un punto d'interruzione alla prossima istruzione
+da eseguire nello @dfn{stack frame} selezionato.
+Gli argomenti possono essere uno dei seguenti:
+
+@c @asis for docbook
+@c nested table
+@table @asis
+@item @var{n}
+Imposta un punto d'interruzione alla riga numero @var{n} nel file sorgente
+corrente.
+
+@item @var{nome-file}@code{:}@var{n}
+Imposta un punto d'interruzione alla riga numero @var{n} nel file sorgente
+@var{nome-file}.
+
+@item @var{funzione}
+Imposta un punto d'interruzione all'ingresso (la prima istruzione eseguibile)
+della funzione @var{funzione}.
+@end table
+
+A ogni punto d'interruzione @`e assegnato un numero che pu@`o essere usato per
+cancellarlo dalla lista dei punti d'interruzione usando il comando
+@code{delete}.
+
+Specificando un punto d'interruzione, si pu@`o fornire anche una condizione.
+Questa @`e
+un'espressione @command{awk} (racchiusa tra doppi apici) che il debugger
+valuta ogni volta che viene raggiunto quel punto d'interruzione. Se la
+condizione @`e vera, il debugger ferma l'esecuzione e rimane in attesa di un
+comando. Altrimenti, continua l'esecuzione del programma.
+
+@cindex comando del debugger, @code{clear}
+@cindex @code{clear}, comando del debugger
+@cindex cancellare punto d'interruzione, in una determinata posizione
+@cindex punto d'interruzione, cancellare in una determinata posizione
+@cindex breakpoint in una determinata posizione, cancellare
+@item @code{clear} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
+Senza argomenti, cancella ogni eventuale punto d'interruzione all'istruzione
+successiva
+da eseguirsi nello @dfn{stack frame} selezionato. Se il programma si ferma in
+un punto d'interruzione, quel punto d'interruzione viene cancellato in modo
+che il programma non si fermi pi@`u in quel punto.
+Gli argomenti possono essere uno tra i seguenti:
+
+@c nested table
+@table @asis
+@item @var{n}
+Cancella il punto (o i punti) d'interruzione impostato/i alla riga @var{n} nel
+file sorgente corrente.
+
+@item @var{nome-file}@code{:}@var{n}
+Cancella il punto (o i punti) d'interruzione impostato/i alla riga @var{n} nel
+file sorgente @var{nome-file}.
+
+@item @var{funzione}
+Cancella il punto (o i punti) d'interruzione impostato/i all'ingresso della
+funzione @var{funzione}.
+@end table
+
+@cindex comando del debugger, @code{condition}
+@cindex @code{condition}, comando del debugger
+@cindex condizione dei punti d'interruzione
+@item @code{condition} @var{n} @code{"@var{espressione}"}
+Aggiunge una condizione al punto d'interruzione o al punto d'osservazione
+esistente @var{n}. La condizione @`e un'espressione @command{awk}
+@emph{racchiusa tra doppi apici} che il debugger valuta ogni volta che viene
+raggiunto il punto d'interruzione o il punto d'osservazione. Se la condizione @`e
+vera, il debugger ferma l'esecuzione e attende l'immissione di un comando.
+Altrimenti, il debugger continua l'esecuzione del programma. Se l'espressione
+della condizione non viene specificata, tutte le condizioni esistenti vengono
+rimosse (cio@`e, il punto d'interruzione o di osservazione viene considerato
+incondizionato).
+
+@cindex comando del debugger, @code{d} (alias per @code{delete})
+@cindex comando del debugger, @code{delete}
+@cindex @code{delete}, comando del debugger
+@cindex @code{d}, comando del debugger (alias per @code{delete})
+@cindex cancellare punto d'interruzione, per numero
+@cindex punto d'interruzione, cancellare per numero
+@cindex breakpoint, cancellare per numero
+@item @code{delete} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+@itemx @code{d} [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+Cancella i punti d'interruzione specificati o un intervallo di punti
+d'interruzione. Se non vengono forniti argomenti, cancella tutti i
+punti d'interruzione esistenti.
+
+@cindex comando del debugger, @code{disable}
+@cindex @code{disable}, comando del debugger
+@cindex disabilitare punto d'interruzione
+@cindex punto d'interruzione, come disabilitare o abilitare
+@item @code{disable} [@var{n1 n2} @dots{} | @var{n}--@var{m}]
+Disabilita punti d'interruzione specificati o un intervallo di essi. Senza
+argomenti, disabilita tutti i punti d'interruzione.
+
+@cindex comando del debugger, @code{e} (alias per @code{enable})
+@cindex comando del debugger, @code{enable}
+@cindex @code{enable}, comando del debugger
+@cindex @code{e}, comando del debugger (alias per @code{enable})
+@cindex abilitare un punto d'interruzione
+@item @code{enable} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+@itemx @code{e} [@code{del} | @code{once}] [@var{n1 n2} @dots{}] [@var{n}--@var{m}]
+Abilita specifici punti d'interruzione o un intervallo di essi. Senza
+argomenti, abilita tutti i punti d'interruzione.
+Opzionalmente, si pu@`o specificare come abilitare i punti d'interruzione:
+
+@c nested table
+@table @code
+@item del
+Abilita dei punti d'interruzione @dfn{una tantum}, poi li cancella quando il
+programma si ferma in quel punto.
+
+@item once
+Abilita dei punti d'interruzione @dfn{una tantum}, poi li cancella quando il
+programma si ferma in quel punto.
+@end table
+
+@cindex comando del debugger, @code{ignore}
+@cindex @code{ignore}, comando del debugger
+@cindex ignorare un punto d'interruzione
+@item @code{ignore} @var{n} @var{contatore}
+Ignora il punto d'interruzione numero @var{n} le successive
+@var{contatore} volte in cui viene raggiunto.
+
+@cindex comando del debugger, @code{t} (alias per @code{tbreak})
+@cindex comando del debugger, @code{tbreak}
+@cindex @code{tbreak}, comando del debugger
+@cindex @code{t}, comando del debugger (alias per @code{tbreak})
+@cindex punto d'interruzione temporaneo
+@cindex temporaneo, punto d'interruzione
+@item @code{tbreak} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
+@itemx @code{t} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
+Imposta un punto d'interruzione temporaneo (abilitato solo per la prima volta
+che viene raggiunto).  Gli argomenti sono gli stessi di @code{break}.
+@end table
+
+@node Controllo esecuzione debugger
+@subsection Controllo di esecuzione
+
+Dopo che i punti d'interruzione sono pronti, si pu@`o iniziare l'esecuzione del
+programma, osservando il suo comportamento.  Ci sono pi@`u comandi per
+controllare l'esecuzione del programma di quelli visti nei precedenti esempi:
+
+@table @asis
+@cindex comando del debugger, @code{commands}
+@cindex @code{commands}, comando del debugger
+@cindex comando del debugger, @code{silent}
+@cindex @code{silent}, comando del debugger
+@cindex comando del debugger, @code{end}
+@cindex @code{end}, comando del debugger
+@cindex punto d'interruzione, comandi
+@cindex comandi da eseguire al punto d'interruzione
+@item @code{commands} [@var{n}]
+@itemx @code{silent}
+@itemx @dots{}
+@itemx @code{end}
+Imposta una lista di comandi da eseguire subito dopo l'arresto del programma in
+un punto d'interruzione o di osservazione. @var{n} @`e il numero del punto
+d'interruzione o di osservazione.  Se non si specifica un numero, viene usato
+l'ultimo numero che @`e stato specificato.  I comandi veri e propri seguono,
+a cominciare dalla riga successiva, e hanno termine col comando @code{end}.
+Se il comando @code{silent} @`e nella lista, i consueti messaggi sull'arresto del
+programma a un punto d'interruzione e la riga sorgente non vengono stampati.
+Qualsiasi comando nella lista che riprende l'esecuzione (p.es.,
+@code{continue}) pone fine alla lista (un @code{end} implicito), e i comandi
+successivi vengono ignorati.
+Per esempio:
+
+@example
+gawk> @kbd{commands}
+> @kbd{silent}
+> @kbd{printf "Un punto d'interruzione silenzioso; i = %d\n", i}
+> @kbd{info locals}
+> @kbd{set i = 10}
+> @kbd{continue}
+> @kbd{end}
+gawk>
+@end example
+
+@cindex comando del debugger, @code{c} (alias per @code{continue})
+@cindex comando del debugger, @code{continue}
+@cindex continuare esecuzione programma, nel debugger
+@cindex debugger, continuare esecuzione programma
+@cindex @code{continue}, comando del debugger
+@item @code{continue} [@var{contatore}]
+@itemx @code{c} [@var{contatore}]
+Riprende l'esecuzione del programma. Se si riparte da un punto d'interruzione
+e viene specificato @var{contatore}, il punto d'interruzione in quella
+posizione viene ignorato per le prossime @var{contatore} volte prima di
+fermarsi nuovamente.
+
+@cindex comando del debugger, @code{finish}
+@cindex @code{finish}, comando del debugger
+@item @code{finish}
+Esegue fino a quando lo stack frame selezionato completa l'esecuzione.
+Stampa il valore restituito.
+
+@cindex comando del debugger, @code{n} (alias per @code{next})
+@cindex comando del debugger, @code{next}
+@cindex @code{next}, comando del debugger
+@cindex @code{n}, comando del debugger (alias per @code{next})
+@cindex esecuzione di un solo passo, nel debugger
+@item @code{next} [@var{contatore}]
+@itemx @code{n} [@var{contatore}]
+Continua l'esecuzione alla successiva riga sorgente, saltando le chiamate di
+funzione.  L'argomento @var{contatore} controlla il numero di ripetizioni
+dell'azione, come in @code{step}.
+
+@cindex comando del debugger, @code{ni} (alias per @code{nexti})
+@cindex comando del debugger, @code{nexti}
+@cindex @code{nexti}, comando del debugger
+@cindex @code{ni}, comando del debugger (alias for @code{nexti})
+@item @code{nexti} [@var{contatore}]
+@itemx @code{ni} [@var{contatore}]
+Esegue una o @var{contatore} istruzioni, comprese le chiamate di funzione.
+
+@cindex comando del debugger, @code{return}
+@cindex @code{return}, comando del debugger
+@item @code{return} [@var{valore}]
+Cancella l'esecuzione di una chiamata di funzione. Se @var{valore} (una
+stringa o un numero) viene specificato, @`e usato come codice di ritorno della
+funzione. Se usato in un frame diverso da quello pi@`u interno (la funzione
+correntemente in esecuzione; cio@`e, il frame numero 0), ignora tutti i frame
+pi@`u interni di quello selezionato, e il chiamante del frame selezionato
+diventa il frame pi@`u interno.
+
+@cindex comando del debugger, @code{r} (alias per @code{run})
+@cindex comando del debugger, @code{run}
+@cindex @code{run}, comando del debugger
+@cindex @code{r}, comando del debugger (alias per @code{run})
+@item @code{run}
+@itemx @code{r}
+Avvia/riavvia l'esecuzione del programma. Quando il programma viene riavviato,
+il debugger mantiene i punti d'interruzione e di osservazione, la cronologia
+dei comandi, la visualizzazione automatica di variabili, e le opzioni del
+debugger.
+
+@cindex comando del debugger, @code{s} (alias per @code{step})
+@cindex comando del debugger, @code{step}
+@cindex @code{step}, comando del debugger
+@cindex @code{s}, comando del debugger (alias per @code{step})
+@item @code{step} [@var{contatore}]
+@itemx @code{s} [@var{contatore}]
+Continua l'esecuzione finch@'e il controllo non raggiunge una diversa riga del
+sorgente nello @dfn{stack frame} corrente, eseguendo ogni funzione chiamata
+all'interno della riga.  Se viene fornito l'argomento @var{contatore},
+esegue il numero di istruzioni specificate prima di fermarsi, a meno che non
+s'imbatta in un punto d'interruzione o di osservazione.
+
+@cindex comando del debugger, @code{si} (alias per @code{stepi})
+@cindex comando del debugger, @code{stepi}
+@cindex @code{stepi}, comando del debugger
+@cindex @code{si}, comando del debugger (alias per @code{stepi})
+@item @code{stepi} [@var{contatore}]
+@itemx @code{si} [@var{contatore}]
+Esegue una o @var{contatore} istruzioni, comprese le chiamate di funzione.
+(Per una spiegazione su cosa s'intende per ``istruzione'' in @command{gawk},
+si veda l'output mostrato sotto @code{dump} nella
+@ref{Comandi vari del debugger}.)
+
+@cindex comando del debugger, @code{u} (alias per @code{until})
+@cindex comando del debugger, @code{until}
+@cindex @code{until}, comando del debugger
+@cindex @code{u}, comando del debugger (alias per @code{until})
+@item @code{until} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
+@itemx @code{u} [[@var{nome-file}@code{:}]@var{n} | @var{funzione}]
+Senza argomenti, prosegue l'esecuzione finch@'e non viene raggiunta una riga
+dopo la riga corrente nello @dfn{stack frame} corrente.
+Se viene specificato un argomento,
+prosegue l'esecuzione finch@'e non viene raggiunto il punto specificato, o
+lo @dfn{stack frame} corrente non termina l'esecuzione.
+@end table
+
+@node Vedere e modificare dati
+@subsection Vedere e modificare dati
+
+I comandi per vedere e modificare variabili all'interno di @command{gawk} sono:
+
+@table @asis
+@cindex comando del debugger, @code{display}
+@cindex @code{display}, comando del debugger
+@item @code{display} [@var{var} | @code{$}@var{n}]
+Aggiunge la variabile @var{var} (o il campo @code{$@var{n}}) alla lista di
+visualizzazione.  Il valore della variabile o del campo @`e visualizzato ogni
+volta che il programma s'interrompe.
+Ogni variabile aggiunta alla lista @`e identificata da un numero univoco:
+
+@example
+gawk> @kbd{display x}
+@print{} 10: x = 1
+@end example
+
+@noindent
+La riga qui sopra mostra il numero di elemento assegnato, il nome della
+variabile e il suo
+valore corrente.  Se la variabile di display fa riferimento a un parametro di
+funzione, @`e cancellata silenziosamente dalla lista non appena l'esecuzione
+raggiunge un contesto dove la variabile con quel nome non esiste pi@`u.
+Senza argomenti, @code{display} mostra i valori correnti degli elementi della
+lista.
+
+@cindex comando del debugger, @code{eval}
+@cindex @code{eval}, comando del debugger
+@cindex valutare espressioni, nel debugger
+@item @code{eval "@var{istruzioni awk}"}
+Valuta @var{istruzioni awk} nel contesto del programma in esecuzione.
+Si pu@`o fare qualsiasi cosa che un programma @command{awk} farebbe: assegnare
+valori a variabili, chiamare funzioni, e cos@`{@dotless{i}} via.
+
+@quotation NOTA
+Non @`e possibile usare @code{eval} per valutare un'espressione che contenga
+una qualsiasi delle seguenti istruzioni:
+@code{exit},
+@code{getline},
+@code{next},
+@code{nextfile},
+o
+@code{return}.
+@end quotation
+
+@item @code{eval} @var{param}, @dots{}
+@itemx @var{istruzioni awk}
+@itemx @code{end}
+Questa forma di @code{eval} @`e simile alla precedente, solo che permette di
+definire
+``variabili locali'' che esistono nel contesto delle @var{istruzioni awk},
+invece di usare variabili o parametri di funzione gi@`a definiti nel programma.
+
+@cindex comando del debugger, @code{p} (alias per @code{print})
+@cindex comando del debugger, @code{print}
+@cindex @code{print}, comando del debugger
+@cindex @code{p}, comando del debugger (alias per @code{print})
+@cindex stampare variabili, nel debugger
+@item @code{print} @var{var1}[@code{,} @var{var2} @dots{}]
+@itemx @code{p} @var{var1}[@code{,} @var{var2} @dots{}]
+Stampa i valori di una o pi@`u variabili o campi di @command{gawk}.
+I campi devono essere indicizzati usando delle costanti:
+
+@example
+gawk> @kbd{print $3}
+@end example
+
+@noindent
+Questo stampa il terzo campo del record di input (se il campo specificato non
+esiste, stampa il @samp{campo nullo}). Una variabile pu@`o essere un elemento di
+un vettore, avente come indice una
+stringa di valore costante.  Per stampare
+il contenuto di un vettore, si deve anteporre il simbolo @samp{@@} al nome del
+vettore:
+
+@example
+gawk> @kbd{print @@a}
+@end example
+
+@noindent
+L'esempio stampa gli indici e i corrispondenti valori di tutti gli elementi
+del vettore @code{a}.
+
+@cindex comando del debugger, @code{printf}
+@cindex @code{printf}, comando del debugger
+@item @code{printf} @var{formato} [@code{,} @var{arg} @dots{}]
+Stampa un testo formattato. Il @var{formato} pu@`o includere sequenze di
+protezione, come @samp{\n}
+(@pxref{Sequenze di protezione}).
+Non viene stampato nessun ritorno a capo che non sia stato specificato
+esplicitamente.
+
+@cindex comando del debugger, @code{set}
+@cindex @code{set}, comando del debugger
+@cindex assegnare valori a variabili, nel debugger
+@item @code{set} @var{var}@code{=}@var{valore}
+Assegna un valore costante (numero o stringa) a una variabile o a un campo di
+@command{awk}.
+I valori di stringa devono essere racchiusi tra doppi apici
+(@code{"}@dots{}@code{"}).
+
+Si possono impostare anche delle variabili speciali di @command{awk}, come
+@code{FS}, @code{NF}, @code{NR}, e cos@`{@dotless{i}} via.
+
+@cindex comando del debugger, @code{w} (alias per @code{watch})
+@cindex comando del debugger, @code{watch}
+@cindex @code{watch}, comando del debugger
+@cindex @code{w}, comando del debugger (alias per @code{watch})
+@cindex impostare un punto d'osservazione
+@item @code{watch} @var{var} | @code{$}@var{n} [@code{"@var{espressione}"}]
+@itemx @code{w} @var{var} | @code{$}@var{n} [@code{"@var{espressione}"}]
+Aggiunge la variabile @var{var} (o il campo @code{$@var{n}}) alla lista dei
+punti d'osservazione.  Il debugger quindi interrompe il programma ogni volta
+che il valore della variabile o del campo cambia. A ogni elemento osservato
+viene assegnato un numero che pu@`o essere usato per cancellarlo dalla lista
+usando il comando @code{unwatch} [non-osservare pi@`u].
+
+Definendo un punto d'osservazione, si pu@`o anche porre una condizione, che @`e
+un'espressione @command{awk} (racchiusa tra doppi apici) che il debugger valuta
+ogni volta che viene raggiunto il punto d'osservazione.  Se la condizione @`e
+vera, il debugger interrompe l'esecuzione e rimane in attesa di un comando.
+Altrimenti, @command{gawk} prosegue nell'esecuzione del programma.
+
+@cindex comando del debugger, @code{undisplay}
+@cindex @code{undisplay}, comando del debugger
+@cindex interruzione visualizzazioni automatiche, nel debugger
+@item @code{undisplay} [@var{n}]
+Rimuove l'elemento numero @var{n} (o tutti gli elementi, se non vi sono
+argomenti) dalla lista delle visualizzazioni automatiche.
+
+@cindex comando del debugger, @code{unwatch}
+@cindex @code{unwatch}, comando del debugger
+@cindex cancellare punto d'osservazione
+@item @code{unwatch} [@var{n}]
+Rimuove l'elemento numero @var{n} (o tutti gli elementi, se non vi sono
+argomenti) dalla lista dei punti d'osservazione.
+
+@end table
+
+@node Stack di esecuzione
+@subsection Lavorare con lo stack
+
+Ogni volta che si esegue un programma che contiene chiamate di funzione,
+@command{gawk} mantiene una pila contenente la lista delle chiamate di funzione
+che hanno portato al punto in cui il programma si trova in ogni momento.  @`E
+possibile vedere a che punto si trova il programma, e anche muoversi
+all'interno della pila per vedere qual era lo stato delle cose nelle funzioni
+che hanno chiamato quella in cui ci si trova.  I comandi per far questo sono:
+
+@table @asis
+@cindex comando del debugger, @code{bt} (alias per @code{backtrace})
+@cindex comando del debugger, @code{backtrace}
+@cindex comando del debugger, @code{where} (alias per @code{backtrace})
+@cindex @code{backtrace}, comando del debugger
+@cindex @code{bt}, comando del debugger (alias per @code{backtrace})
+@cindex @code{where}, comando del debugger (alias per @code{backtrace})
+@cindex chiamate, @dfn{stack} (pila) delle, mostrare nel debugger
+@cindex @dfn{stack} (pila) delle chiamate, mostrare nel debugger
+@cindex pila (@dfn{stack}) delle chiamate, mostrare nel debugger
+@cindex tracciatura a ritroso, mostrare nel debugger
+@item @code{backtrace} [@var{contatore}]
+@itemx @code{bt} [@var{contatore}]
+@itemx @code{where} [@var{contatore}]
+Stampa a ritroso una traccia di tutte le chiamate di funzione (stack frame), o
+i dei @var{contatore} frame pi@`u interni se @var{contatore} > 0. Stampa i
+@var{contatore} frame pi@`u esterni se @var{contatore} < 0.  La tracciatura a
+ritroso mostra il nome e gli argomenti di ciascuna funzione, il sorgente
+@value{FN}, e il numero di riga.  L'alias @code{where} per @code{backtrace}
+viene mantenuto per i vecchi utenti di GDB che potrebbero essere abituati a
+quel comando.
+
+@cindex comando del debugger, @code{down}
+@cindex @code{down}, comando del debugger
+@item @code{down} [@var{contatore}]
+Sposta @var{contatore} (default 1) frame sotto la pila verso il frame pi@`u interno.
+Poi seleziona e stampa il frame.
+
+@cindex comando del debugger, @code{f} (alias per @code{frame})
+@cindex comando del debugger, @code{frame}
+@cindex @code{frame}, comando del debugger
+@cindex @code{f}, comando del debugger (alias per @code{frame})
+@item @code{frame} [@var{n}]
+@itemx @code{f} [@var{n}]
+Seleziona e stampa lo @dfn{stack frame} @var{n}.  Il frame 0 @`e quello
+correntemente in esecuzione, o il frame @dfn{pi@`u interno}, (chiamata di
+funzione); il frame 1 @`e il frame che ha chiamato quello pi@`u interno. Il frame
+col numero pi@`u alto @`e quello per il programma principale.  Le informazioni
+stampate comprendono il numero di frame, i nomi delle funzioni e degli
+argomenti, i file sorgenti e le righe sorgenti.
+
+@cindex comando del debugger, @code{up}
+@cindex @code{up}, comando del debugger
+@item @code{up} [@var{contatore}]
+Sposta @var{contatore} (default 1) frame sopra la pila verso il frame pi@`u
+esterno.  Poi seleziona e stampa il frame.
+@end table
+
+@node Informazioni sul debugger
+@subsection Ottenere informazioni sullo stato del programma e del debugger
+
+Oltre che vedere i valori delle variabili, spesso si ha necessit@`a di ottenere
+informazioni di altro tipo sullo stato del programma e dello stesso ambiente di
+debug.  Il debugger di @command{gawk} ha un comando che fornisce
+quest'informazione, chiamato convenientemente @code{info}.  @code{info}
+@`e usato con uno dei tanti argomenti che dicono esattamente quel che si vuol
+sapere:
+
+@table @asis
+@cindex comando del debugger, @code{i} (alias per @code{info})
+@cindex comando del debugger, @code{info}
+@cindex @code{info}, comando del debugger
+@cindex @code{i}, comando del debugger (alias per @code{info})
+@item @code{info} @var{cosa}
+@itemx @code{i} @var{cosa}
+Il valore di @var{cosa} dovrebbe essere uno dei seguenti:
+
+@c nested table
+@table @code
+@item args
+@cindex mostrare argomenti delle funzioni, nel debugger
+@cindex debugger, mostrare argomenti delle funzioni
+Elenca gli argomenti del frame selezionato.
+
+@item break
+@cindex mostrare punti d'interruzione, nel debugger
+@cindex debugger, mostrare punti d'interruzione
+Elenca tutti i punti d'interruzione attualmente impostati.
+
+@item display
+@cindex visualizzazioni automatiche, nel debugger
+@cindex debugger, visualizzazioni automatiche
+Elenca tutti gli elementi della lista delle visualizzazioni automatiche.
+
+@item frame
+@cindex descrizione degli @dfn{stack frame} delle chiamate, nel debugger
+@cindex debugger, descrizione degli @dfn{stack frame} delle chiamate
+D@`a una descrizione degli @dfn{stack frame} selezionati.
+
+@item functions
+@cindex elencare definizioni delle funzioni, nel debugger
+@cindex debugger, elencare definizioni delle funzioni
+Elenca tutte le definizioni delle funzioni compresi i @value{FNS} e
+i numeri di riga.
+
+@item locals
+@cindex mostrare variabili locali, nel debugger
+@cindex debugger, mostrare variabili locali
+Elenca le variabili locali dei frame selezionati.
+
+@item source
+@cindex mostrare il nome del file sorgente corrente, nel debugger
+@cindex debugger, mostrare il nome del file sorgente corrente
+Stampa il nome del file sorgente corrente.  Ogni volta che il programma si
+interrompe, il file sorgente corrente @`e il file che contiene l'istruzione
+corrente.  Quando il debugger viene avviato per la prima volta, il file
+sorgente corrente @`e il primo file incluso attraverso l'opzione @option{-f}.
+Il comando @samp{list @var{nome-file}:@var{numero-riga}} pu@`o essere usato in
+qualsiasi momento per cambiare il sorgente corrente.
+
+@item sources
+@cindex mostrare tutti i file sorgente, nel debugger
+@cindex debugger, mostrare tutti i file sorgenti
+Elenca tutti i sorgenti del programma.
+
+@item variables
+@cindex elencare tutte le variabili locali, nel debugger
+@cindex debugger, elencare tutte le variabili locali
+Elenca tutte le variabili locali.
+
+@item watch
+@cindex mostrare i punti d'osservazione, nel debugger
+@cindex debugger, mostrare i punti d'osservazione
+Elenca tutti gli elementi della lista dei punti d'osservazione.
+@end table
+@end table
+
+Ulteriori comandi permettono di avere il controllo sul debugger, la capacit@`a di
+salvare lo stato del debugger e la capacit@`a di eseguire comandi del debugger
+da un file.  I comandi sono:
+
+@table @asis
+@cindex comando del debugger, @code{o} (alias per @code{option})
+@cindex comando del debugger, @code{option}
+@cindex @code{option}, comando del debugger
+@cindex @code{o}, comando del debugger (alias per @code{option})
+@cindex visualizzare le opzioni del debugger
+@cindex debugger, opzioni del
+@item @code{option} [@var{nome}[@code{=}@var{valore}]]
+@itemx @code{o} [@var{nome}[@code{=}@var{valore}]]
+Senza argomenti, visualizza le opzioni del debugger disponibili e i loro valori
+correnti.  @samp{option @var{nome}} mostra il valore corrente dell'opzione
+cos@`{@dotless{i}} denominata.  @samp{option @var{nome}=@var{valore}} assegna
+un nuovo valore all'opzione.
+Le opzioni disponibili sono:
+
+@c nested table
+@c asis for docbook
+@table @asis
+@item @code{history_size}
+@cindex debugger, dimensione della cronologia
+Imposta il numero massimo di righe da mantenere nel file della cronologia
+@file{./.gawk_history}.  Il valore di default @`e 100.
+
+@item @code{listsize}
+@cindex debugger, numero di righe nella lista di default
+Specifica il numero di righe che @code{list} deve stampare. Il valore di
+default @`e 15.
+
+@item @code{outfile}
+@cindex ridirezionare l'output di @command{gawk}, nel debugger
+@cindex debugger, ridirezionare l'output di @command{gawk}
+Invia l'output di @command{gawk} in un file; l'output del debugger @`e
+visualizzato comunque anche
+nello standard output. Assegnare come valore stringa vuota (@code{""})
+reimposta l'output solo allo standard output.
+
+@item @code{prompt}
+@cindex debugger, prompt
+Cambia la riga per l'immissione dei comandi del debugger.  Il valore di
+default @`e @samp{@w{gawk> }}.
+
+@item @code{save_history} [@code{on} | @code{off}]
+@cindex debugger, file della cronologia
+Salva la cronologia dei comandi nel file @file{./.gawk_history}.
+L'impostazione di default @`e @code{on}.
+
+@item @code{save_options} [@code{on} | @code{off}]
+@cindex salvataggio opzioni, nel debugger
+@cindex debugger, salvataggio opzioni
+Salva le opzioni correnti nel file @file{./.gawkrc} all'uscita.
+L'impostazione di default @`e @code{on}.
+Le opzioni sono lette di nuovo all'avvio della sessione successiva.
+
+@item @code{trace} [@code{on} | @code{off}]
+@cindex istruzioni, tener traccia delle, nel debugger
+@cindex debugger, tener traccia delle istruzioni
+Attiva o disattiva il tracciamento delle istruzioni. L'impostazione di default
+@`e @code{off}.
+@end table
+
+@cindex debugger, salvare dei comandi su un file
+@cindex salvare dei comandi su un file, nel debugger
+@item @code{save} @var{nome-file}
+Salva i comandi eseguiti nella sessione corrente nel @value{FN} indicato,
+in modo da poterli ripetere in seguito usando il comando @command{source}.
+
+@item @code{source} @var{nome-file}
+@cindex debugger, leggere comandi da un file
+@cindex leggere comandi da un file, nel debugger
+Esegue comandi contenuti in un file; un errore in un comando non impedisce
+l'esecuzione dei comandi successivi.  In un file di comandi sono consentiti
+i commenti (righe che iniziano con @samp{#}).
+Le righe vuote vengono ignorate; esse @emph{non}
+ripetono l'ultimo comando.
+Non si pu@`o riavviare il programma mettendo pi@`u di un comando @code{run}
+nel file. Inoltre, la lista dei comandi pu@`o includere altri comandi
+@code{source}; in ogni caso, il debugger di @command{gawk} non richiama lo
+stesso file pi@`u di una volta per evitare ricorsioni infinite.
+
+Oltre al comando @code{source}, o al posto di esso, si possono usare le opzioni
+sulla riga di comando @option{-D @var{file}} o @option{--debug=@var{file}}
+per eseguire comandi da un file in maniera non interattiva
+(@pxref{Opzioni}).
+@end table
+
+@node Comandi vari del debugger
+@subsection Comandi vari del debugger
+
+Ci sono alcuni altri comandi che non rientrano nelle precedenti categorie,
+come i seguenti:
+
+@table @asis
+@cindex comando del debugger, @code{dump}
+@cindex @code{dump}, comando del debugger
+@item @code{dump} [@var{nome-file}]
+Riversa il @dfn{byte code} del programma nello standard output o nel file
+definito in @var{nome-file}.  Questo stampa una rappresentazione delle
+istruzioni interne che @command{gawk} esegue per implementare i comandi
+@command{awk} in un programma.  Ci@`o pu@`o essere molto istruttivo, come
+dimostra il seguente riversamento parziale del codice offuscato di
+Davide Brini (@pxref{Programma signature}):
+
+@c FIXME: This will need updating if num-handler branch is ever merged in.
+@smallexample
+@group
+gawk> @kbd{dump}
+@print{}        # BEGIN
+@print{}
+@print{} [  1:0xfcd340] Op_rule           : [in_rule = BEGIN] [source_file = brini.awk]
+@end group
+@print{} [  1:0xfcc240] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc2a0] Op_push_i         : "~" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc280] Op_match          :
+@print{} [  1:0xfcc1e0] Op_store_var      : O
+@print{} [  1:0xfcc2e0] Op_push_i         : "==" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc340] Op_push_i         : "==" [MALLOC|STRING|STRCUR]
+@print{} [  1:0xfcc320] Op_equal          :
+@print{} [  1:0xfcc200] Op_store_var      : o
+@print{} [  1:0xfcc380] Op_push           : o
+@print{} [  1:0xfcc360] Op_plus_i         : 0 [MALLOC|NUMCUR|NUMBER]
+@print{} [  1:0xfcc220] Op_push_lhs       : o [do_reference = true]
+@print{} [  1:0xfcc300] Op_assign_plus    :
+@print{} [   :0xfcc2c0] Op_pop            :
+@print{} [  1:0xfcc400] Op_push           : O
+@print{} [  1:0xfcc420] Op_push_i         : "" [MALLOC|STRING|STRCUR]
+@print{} [   :0xfcc4a0] Op_no_op          :
+@print{} [  1:0xfcc480] Op_push           : O
+@print{} [   :0xfcc4c0] Op_concat         : [expr_count = 3] [concat_flag = 0]
+@print{} [  1:0xfcc3c0] Op_store_var      : x
+@print{} [  1:0xfcc440] Op_push_lhs       : X [do_reference = true]
+@print{} [  1:0xfcc3a0] Op_postincrement  :
+@print{} [  1:0xfcc4e0] Op_push           : x
+@print{} [  1:0xfcc540] Op_push           : o
+@print{} [  1:0xfcc500] Op_plus           :
+@print{} [  1:0xfcc580] Op_push           : o
+@print{} [  1:0xfcc560] Op_plus           :
+@print{} [  1:0xfcc460] Op_leq            :
+@print{} [   :0xfcc5c0] Op_jmp_false      : [target_jmp = 0xfcc5e0]
+@print{} [  1:0xfcc600] Op_push_i         : "%c" [MALLOC|STRING|STRCUR]
+@print{} [   :0xfcc660] Op_no_op          :
+@print{} [  1:0xfcc520] Op_assign_concat  : c
+@print{} [   :0xfcc620] Op_jmp            : [target_jmp = 0xfcc440]
+@dots{}
+@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  :
+@group
+@print{} [      :0xfcc160] Op_no_op            :
+@print{} [      :0xfcc1a0] Op_after_endfile    :
+gawk>
+@end group
+@end smallexample
+
+@cindex comando del debugger, @code{exit}
+@cindex @code{exit}, comando del debugger
+@cindex uscire dal debugger
+@cindex debugger, uscire dal
+@item @code{exit}
+Esce dal debugger.
+Si veda la voce @samp{quit}, pi@`u avanti in quest'elenco.
+
+@cindex comando del debugger, @code{h} (alias per @code{help})
+@cindex comando del debugger, @code{help}
+@cindex @code{help}, comando del debugger
+@cindex @code{h}, comando del debugger (alias per @code{help})
+@item @code{help}
+@itemx @code{h}
+Stampa una lista di tutti i comandi del debugger di @command{gawk} con un breve
+sommario su come usarli.  @samp{help @var{comando}} stampa l'informazione sul
+comando @var{comando}.
+
+@cindex comando del debugger, @code{l} (alias per @code{list})
+@cindex comando del debugger, @code{list}
+@cindex @code{list}, comando del debugger
+@cindex @code{l}, comando del debugger (alias per @code{list})
+@item @code{list} [@code{-} | @code{+} | @var{n} | @var{nome-file}@code{:}@var{n} | @var{n}--@var{m} | @var{funzione}]
+@itemx @code{l} [@code{-} | @code{+} | @var{n} | @var{nome-file}@code{:}@var{n} | @var{n}--@var{m} | @var{funzione}]
+Stampa le righe specificate (per default 15) dal file sorgente corrente
+o il file chiamato @var{nome-file}. I possibili argomenti di @code{list}
+sono i seguenti:
+
+@c nested table
+@table @asis
+@item @code{-} (Meno)
+Stampa righe prima delle ultime righe stampate.
+
+@item @code{+}
+Stampa righe dopo le ultime righe stampate.
+@code{list} senza argomenti fa la stessa cosa.
+
+@item @var{n}
+Stampa righe centrate attorno alla riga numero @var{n}.
+
+@item @var{n}--@var{m}
+Stampa righe dalla numero @var{n} alla numero @var{m}.
+
+@item @var{nome-file}@code{:}@var{n}
+Stampa righe centrate attorno alla riga numero @var{n} nel file sorgente
+@var{nome-file}. Questo comando pu@`o cambiare il file sorgente corrente.
+
+@item @var{funzione}
+Stampa righe centrate attorno all'inizio della funzione @var{function}.
+Questo comando pu@`o cambiare il file sorgente corrente.
+@end table
+
+@cindex comando del debugger, @code{q} (alias per @code{quit})
+@cindex comando del debugger, @code{quit}
+@cindex @code{quit}, comando del debugger
+@cindex @code{q}, comando del debugger (alias per @code{quit})
+@cindex uscire dal debugger
+@cindex debugger, uscire dal
+@item @code{quit}
+@itemx @code{q}
+Esce dal debugger.  Fare il debug @`e divertente, ma noi tutti a volte
+dobbiamo far fronte ad altri impegni nella vita, e talvolta troviamo il bug
+e possiamo tranquillamente passare a quello successivo!  Come abbiamo visto
+prima, se si sta eseguendo un programma, il debugger avverte quando si batte
+@samp{q} o @samp{quit}, in modo da essere sicuri di voler realmente abbandonare
+il debug.
+
+@cindex comando del debugger, @code{trace}
+@cindex @code{trace}, comando del debugger
+@item @code{trace} [@code{on} | @code{off}]
+Abilita o disabilita la stampa continua delle istruzioni che si stanno per
+eseguire, assieme alle righe di @command{awk} che implementano.
+L'impostazione di default @`e @code{off}.
+
+@`E auspicabile che la maggior parte dei ``codici operativi'' (o ``opcode'')
+in queste istruzioni siano sufficientemente autoesplicativi, e l'uso di
+@code{stepi} e @code{nexti} mentre @code{trace} @`e abilitato li render@`a
+familiari.
+
+@end table
+
+@node Supporto per Readline
+@section Supporto per Readline
+@cindex completamento dei comandi, nel debugger
+@cindex debugger, completamento dei comandi nel
+@cindex espansione della cronologia, nel debugger
+@cindex debugger, espansione della cronologia
+
+Se @command{gawk} @`e compilato con
+@uref{http://cnswww.cns.cwru.edu/php/chet/readline/readline.html, la libreria
+GNU Readline}, ci si pu@`o avvantaggiare delle sue funzionalit@`a riguardanti il
+completamento dei comandi della libreria e l'espansione della cronologia.  Sono
+disponibili i seguenti tipi di completamento:
+
+@table @asis
+@item Completamentto dei comandi
+Nomi dei comandi.
+
+@item Completamento del @value{FN} del sorgente
+@value{FFNS} dei sorgenti. I relativi comandi sono
+@code{break},
+@code{clear},
+@code{list},
+@code{tbreak}
+e
+@code{until}.
+
+@item Completamento di argomento
+Argomenti di un comando non numerici.
+I relativi comandi sono @code{enable} e @code{info}.
+
+@item Completamento del nome di variabile
+Interessa i nomi delle variabili globali, e gli argomenti di funzione nel
+contesto corrente se
+il programma @`e in esecuzione.  I relativi comandi sono
+@code{display},
+@code{print},
+@code{set}
+e
+@code{watch}.
+
+@end table
+
+@node Limitazioni
+@section Limitazioni
+
+@cindex debugger, limitazioni
+@cindex limitazioni del debugger
+Si spera che il lettore trovi il debugger di @command{gawk} utile e piacevole
+da usare, ma come accade per ogni programma, specialmente nelle sue prime
+versioni, ha ancora delle limitazioni.  Quelle di cui @`e bene essere al corrente sono:
+
+@itemize @value{BULLET}
+@item
+Nella versione presente, il debugger non d@`a una spiegazione dettagliata
+dell'errore che
+si @`e commesso quando si immette qualcosa che il debugger ritiene sbagliato.
+La risposta invece @`e solamente @samp{syntax error}.  Quando si arriva a capire
+l'errore commesso, tuttavia, ci si sentir@`a come un vero guru.
+
+@item
+@c NOTE: no comma after the ref{} on purpose, due to following
+@c parenthetical remark.
+Se si studiano i ``dump'' dei codici operativi
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Comandi vari del debugger}
+(o se si ha gi@`a familiarit@`a con i comandi interni di @command{gawk}),
+ci si render@`a conto che gran parte della manipolaziona interna di dati
+in @command{gawk}, cos@`{@dotless{i}} come in molti interpreti, @`e fatta su di una pila.
+@code{Op_push}, @code{Op_pop}, e simili sono il pane quotidiano di
+gran parte del codice di @command{gawk}.
+
+Sfortunatamente, al momento, il debugger di @command{gawk} non consente
+di esaminare i contenuti della pila.
+Cio@`e, i risultati intermedi della valutazione delle espressioni sono sulla
+pila, ma non @`e possibile stamparli.  Invece, possono essere stampate solo
+quelle variabili che sono state definite nel programma.  Naturalmente, un
+espediente per cercare di rimediare @`e di usare pi@`u variabili esplicite in
+fase di debug e
+poi cambiarle di nuovo per ottenere un codice forse pi@`u difficile da
+comprendere, ma pi@`u ottimizzato.
+
+@item
+Non c'@`e alcun modo per guardare ``dentro'' al processo della compilazione delle
+espressioni regolari per vedere se corrispondono a quel che si intendeva.
+Come programmatore
+di @command{awk}, ci si aspetta che chi legge conosca il significato di
+@code{/[^[:alnum:][:blank:]]/}.
+
+@item
+Il debugger di @command{gawk} @`e progettato per essere usato eseguendo un
+programma (con tutti i suoi parametri) dalla riga di comando, come descritto
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Invocazione del debugger}. Non c'@`e alcun modo (al momento) di modificare
+o di ``entrare dentro'' l'esecuzione di un programma.
+Questo sembra ragionevole per un linguaggio che @`e usato principalmente per
+eseguire programmi piccoli e che non richiedono molto tempo di esecuzione.
+
+@item
+Il debugger di @command{gawk} accetta solo codice sorgente fornito con
+l'opzione @option{-f}.
+Se si sta usando uno @dfn{script} di shell che contiene un programma
+@command{awk} che fa parte della riga di comando, e si deve usare il debugge,
+si pu@`o scrivere lo @dfn{script} in un file temporaneo, e quindi usarlo come
+programma, tramite l'opzione @option{-f}.  Ci@`o si potrebbe fare nel modo
+seguente:
+
+@example
+cat << \EOF > /tmp/script.$$
+@dots{}                                  @ii{Qui c'@`e il programma da eseguire}
+EOF
+gawk -D -f /tmp/script.$$
+rm /tmp/script.$$
+@end example
+@end itemize
+
+@ignore
+@c 11/2016: This no longer applies after all the type cleanup work that's been done.
+C'@`e un altro punto che vale la pena di trattare.  I debugger convenzionali
+vengono eseguiti in un processo (e quindi in una parte di memoria)
+separato dal programma su cui eseguono il debug (il @dfn{debuggato}, se
+si vuole).
+
+Il debugger di @command{gawk} @`e diverso; @`e parte integrante di @command{gawk}.
+Ci@`o rende possibile, in rari casi, che @command{gawk} diventi un eccellente
+dimostratore del principio d'indeterminazione di Heisenberg, secondo il quale
+il solo atto di osservare una cosa pu@`o modificarla. Si consideri il seguente
+esempio:@footnote{Grazie a Hermann Peifer per quest'esempio.}
+
+@example
+$ @kbd{cat test.awk}
+@print{} @{ print typeof($1), typeof($2) @}
+$ @kbd{cat test.data}
+@print{} abc 123
+$ @kbd{gawk -f test.awk test.data}
+@print{} strnum strnum
+@end example
+
+Questo @`e quel che ci si aspetta: il campo data ha l'attributo STRNUM
+(@pxref{Tipi di variabile}).  Ora vediamo cosa accade quando questo programma
+viene eseguito sotto il debugger:
+
+@example
+$ @kbd{gawk -D -f test.awk test.data}
+gawk> @kbd{w $1}                    @ii{Imposta un punto d'osservazione su} $1
+@print{} Watchpoint 1: $1
+gawk> @kbd{w $2}                    @ii{Imposta il punto d'osservazione su} $2
+@print{} Watchpoint 2: $2
+gawk> @kbd{r}                       @ii{Avvia il programma}
+@print{} Partenza del programma:
+@print{} Mi fermo in Rule ...
+@print{} Watchpoint 1: $1           @ii{Scatta punto d'osservazione}
+@print{}   Old value: ""
+@print{}   New value: "abc"
+@print{} main() a `test.awk':1
+@print{} 1       @{ print typeof($1), typeof($2) @}
+gawk> @kbd{n}                       @ii{Prosegui @dots{}}
+@print{} Watchpoint 2: $2           @ii{Scatta punto d'osservazione}
+@print{}   Old value: ""
+@print{}   New value: "123"
+@print{} main() a `test.awk':1
+@print{} 1       @{ print typeof($1), typeof($2) @}
+gawk> @kbd{n}                       @ii{Prende il risultato da} typeof()
+@print{} strnum number              @ii{Il risultato per} $2 @ii{non @`e corretto}
+@c "normally" o "abnormally" @`e in inglese senza possibilit@`a di modifiche.
+@print{} Programma completato normally, valore in uscita: 0
+gawk> @kbd{quit}
+@end example
+
+In questo caso, la richiesta di confrontare il nuovo valore di @code{$2}
+con quello vecchio ha richiesto che @command{gawk} lo valutasse e
+stabilisse che era proprio un numero, e questo @`e riflesso nel risultato di
+@code{typeof()}.
+
+Casi come questi in cui il debugger non @`e trasparente rispetto all'esecuzione
+del programma dovrebbero essere rari.  Nel caso che se ne trovi uno, si
+prega di segnalarlo (@pxref{Bug}).
+@end ignore
+
+@ignore
+Look forward to a future release when these and other missing features may
+be added, and of course feel free to try to add them yourself!
+@end ignore
+
+@node Sommario sul debug
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+Raramente i programmi funzionano bene al primo colpo.  Trovare gli errori
+che contengono
+viene chiamato @dfn{debugging}, e un programma che aiuta a trovarli @`e un
+@dfn{debugger}.  @command{gawk} ha un debugger incorporato che funziona in
+modo molto simile al debugger GNU, GDB.
+
+@item
+I debugger possono eseguire il programma un'istruzione per volta, esaminare e
+cambiare i
+valori delle variabili e dei vettori, e fanno tante altre cose per
+permettere di comprendere cosa sta facendo effettivamente il programma in un
+dato momento (a differenza del comportamento atteso).
+
+@item
+Come la maggior parte dei debugger, il debugger di @command{gawk} funziona in
+termini di stack frame, e si possono inserire sia punti d'interruzione
+(interruzioni a un certo punto del codice) sia punti d'osservazione
+(interruzioni quando il valore di un dato cambia).
+
+@item
+La serie di comandi del debugger @`e abbastanza completa, e permette di
+monitorare i
+punti d'interruzione, l'esecuzione, la visualizzazione e la
+modifica dei dati, di lavorare con le pile, ottenere informazioni, e di
+svolgere altri compiti.
+
+@item
+Se la libreria GNU Readline @`e disponibile al momento della compilazione di
+@command{gawk}, viene usata dal debugger per fornire la cronologia della riga
+di comando e delle modifiche apportate durante il debug.
+
+@item
+Normalmente, il debugger non influenza il programma che sta controllando,
+ma questo pu@`o succedere occasionalmente.
+
+@end itemize
+
+@hyphenation{name-space name-spaces Name-space Name-spaces}
+@node Spazi-dei-nomi
+@chapter Spazi-dei-nomi in @command{gawk}
+
+Questo @value{CHAPTER} descrive una funzionalit@`a disponibile solo in
+@command{gawk}.
+
+@quotation ATTENZIONE
+La funzionalit@`a descritta in questo capitolo @`e nuova.  @`E certamente
+possibile, e perfino probabile, che ci siano degli angoli bui
+(se non dei bug), ancora presenti nell'implementazione.
+Chi ne trovasse, @`e pregato di notificarlo (@xref{Bug}).
+@end quotation
+
+@menu
+* Spazio-dei-nomi globale::             Lo spazio-dei-nomi globale in @command{awk}
+                                        standard.
+* Nomi qualificati::                    Come qualificare nomi con uno
+                                        spazio-dei-nomi.
+* Spazio-dei-nomi di default::          Lo spazio-dei-nomi di default.
+* Cambiare lo spazio-dei-nomi::         Come cambiare lo spazio-dei-nomi.
+* Regole per i nomi::                   Regole per assegnare nomi a uno
+                                        spazio-dei-nomi ai suoi componenti.
+* Gestione interna dei nomi::           Come i nomi sono gestiti internamente.
+* Esempio di spazio-dei-nomi::          Esempio di codice che usa uno spazio-dei-nomi.
+* Spazio-dei-nomi e funzionalit@`a::      Lo spazio-dei-nomi e le altre funzionalit@`a
+                                        di @command{gawk}.
+* Sommario sugli spazi-dei-nomi::      Sommario sugli spazi-dei-nomi.
+@end menu
+
+@node Spazio-dei-nomi globale
+@section Lo spazio-dei-nomi globale in @command{awk} standard
+
+@cindex spazio-dei-nomi, definizione
+@cindex spazio-dei-nomi, globale, in @command{awk} standard
+In @command{awk} standard, esiste un unico @dfn{spazio-dei-nomi} globale.
+Ci@`o significa che @emph{tutti} i nomi di funzione e i nomi di variabili 
+globali devono essere unici.
+Per esempio, due differenti file sorgenti di @command{awk},
+se usati insieme,
+non possono entrambi definire una funzione avente nome
+@code{min()}, o definire una variabile con lo stesso nome,
+usata come scalare in programma e come vettore in un altro.
+
+Questa situazione pu@`o essere accettabile se i programmi sono
+di dimensioni piccole, qualche centinaio di righe, o anche
+qualche migliaio, ma impedisce lo sviluppo di librerie riusabili
+contenenti funzioni di @command{awk}, e pu@`o far s@`{@dotless{i}} che file di
+librerie sviluppate in maniera indipendente fra loro possano
+incidentalmente entrare in conflitto con le variabili globali
+``private'' proprie di un'altra libreria
+(@pxref{Nomi di variabili di libreria}).
+
+@cindex pacchetto, definizione di
+@cindex modulo, definizione di
+Molti altri linguaggi di programmazione risolvono questo problema rendendo
+disponibile qualche tipo di controllo sullo spazio-dei-nomi: un modo per
+poter stabilire che ``questa funzione @`e nello spazio-dei-nomi @var{xxx},
+mentre quella funzione @`e nello spazio-dei-nomi @var{yyy}''.  (Naturalmente,
+in realt@`a c'@`e ancora un unico spazio-dei-nomi, quello composto da
+tutti gli spazi-dei-nomi, ma si spera che ci siano solo pochi spazi-dei-nomi
+in uso da parte di un determinato programma e, quindi, che la probabilit@`a
+di conflitti sia molto minore).
+Queste funzionalit@`a sono talore indicate col nome di
+@dfn{pacchetti} (@dfn{packages}) o @dfn{moduli} (@dfn{modules}).
+
+A partire dalla @value{PVERSION} 5.0, @command{gawk} fornisce un
+meccanismo semplice per mettere funzioni e variabili globali in
+spazi-dei-nomi separati fra loro.
+
+@node Nomi qualificati
+@section Nomi qualificati
+
+@cindex nome qualificato, definizione di
+@cindex qualificato, nome, definizione di
+@cindex spazio-dei-nomi, nomi qualificati
+@cindex @code{::}, spazio-dei-nomi, separatore
+@cindex nome del componente
+@cindex componente, nome del
+Un @dfn{nome qualificato} @`e un identificativo composto
+dal nome di uno spazio-dei-nomi, da un separatore di spazio-dei-nomi
+(i due caratteri @code{::}), e dal nome di un @dfn{componente}.
+Per esempio, ci potrebbe
+essere una funzione di nome @code{posix::getpid()}.  Qui, lo spazio-dei-nomi
+@`e @code{posix} e il nome della funzione all'interno dello the spazio-dei-nomi
+(il componente) @`e @code{getpid()}.  Lo spazio-dei-nomi e i nomi di componente
+sono separati da due caratteri ":".
+In un nome qualificato pu@`o essere presente un unico separatore.
+
+@quotation NOTA
+A differenza di come avviene in C++, la notazione @code{::} @emph{non @`e} un
+operatore.  Non @`e consentito inserire degli spazi di separazione fra il
+nome dello spazio-dei-nomi, la notazione @code{::}, e il nome del componente.
+@end quotation
+
+@cindex nome qualificato, uso del
+@`E necessario usare nomi qualificati, in uno spazio-dei-nomi, per accedere
+a variabili e funzioni in un altro spazio-dei-nomi.  Ci@`o @`e particolarmente
+importante quando si usano nomi di variabile come indici del vettore
+speciale @code{SYMTAB} (@pxref{Variabili auto-assegnate}),
+e quando si effettuano chiamate di funzione indirette
+(@pxref{Chiamate indirette}).
+
+@node Spazio-dei-nomi di default
+@section Lo spazio-dei-nomi di default
+
+@cindex spazio-dei-nomi, default
+@cindex spazio-dei-nomi, @code{awk}
+@cindex @code{awk}, spazio-dei-nomi
+Lo spazio-dei-nomi di default, ovviamente, @`e @code{awk}.
+Tutte le variabili predefinite di @command{awk} e di @command{gawk}
+sono in questo spazio-dei-nomi, e quindi hanno nomi qualificati come
+@code{awk::ARGC}, @code{awk::NF}, e cos@`{@dotless{i}} via.
+
+@cindex nomi in maiuscolo, spazio-dei-nomi dei
+Inoltre, anche se si sta utilizzando uno spazio-dei-nomi differente
+nel file sorgente correntemente in uso
+(@pxref{Cambiare lo spazio-dei-nomi}), @command{gawk}
+assegna tutti gli identificativi senza una qualifica che contengono
+solo lettere maiuscole allo spazio-dei-nomi @code{awk}.  Ci@`o rende
+possibile utilizzare facilmente le variabili globali proprie di
+@command{gawk} da spazi-dei-nomi differenti.
+Ci@`o rende anche pi@`u scorrevole il codice stesso.
+
+@node Cambiare lo spazio-dei-nomi
+@section Come cambiare lo spazio-dei-nomi
+
+@cindex spazio-dei-nomi, cambiare lo
+@cindex @code{@@namespace}, direttiva
+@cindex direttiva @code{@@namespace}
+Per impostare lo spazio-dei-nomi corrente, si usi una direttiva
+@code{@@namespace}
+al livello principale del programma interessato:
+
+@example
+@@namespace "passwd"
+
+BEGIN @{ @dots{} @}
+@dots{}
+@end example
+
+Dopo questa direttiva, tutti gli identificati semplici che non siano composti
+esclusivamente da lettere maiuscole sono assegnati allo
+spazio-dei-nomi @code{passwd}.
+
+@`E possibile cambiare lo spazio-dei-nomi pi@`u volte all'interno di
+un singolo file sorgente, sebbene ci@`o possa essere causa di
+confusione, se lo si fa troppe volte.
+
+@quotation NOTA
+L'assegnamento degli identificativi non qualificati a uno spazio-dei-nomi
+avviene nel momento in cui @command{gawk} analizza il programma, @emph{prima}
+di cominciare a eseguirlo.
+Non c'@`e quindi il concetto di uno spazio-dei-nomi ``corrente'' al momento
+dell'esecuzione del programma.
+Ci@`o va compreso e messo in conto in anticipo.
+@end quotation
+
+@cindex spazio-dei-nomi, implicito
+@cindex implicito, spazio-dei-nomi
+Ogni file sorgente designato dalle opzioni
+@option{-i} e @option{-f} inizia con una direttiva implicita
+@samp{@@namespace "awk"}.  Analogamente, ogni parte di codice
+immesso nella riga di comando, usando l'opzione @option{-e}
+ha la stessa implicita direttiva iniziale
+(@pxref{Opzioni}).
+
+@cindex spazio-dei-nomi corrente, cambiare e ripristinare
+@cindex corrente, spazio-dei-nomi, cambiare e ripristinare
+I file inclusi con la direttiva @code{@@include} (@pxref{Includere file})
+``cambiano'' (@dfn{push}) e ``ripristinano'' (@dfn{pop})
+lo spazio-dei-nomi corrente.  Ossia, ogni @code{@@include} salva
+lo spazio-dei-nomi corrente e inizia con una direttiva implicita
+@samp{@@namespace "awk"} che resta attiva finch@'e non si incontra una
+direttiva esplicita @code{@@namespace}.
+Quando @command{gawk} termina di elaborare il file incluso,
+lo spazio-dei-nomi salvato @`e ripristinato e l'elaborazione prosegue
+da dove era stata sospesa nel file originale.
+
+@cindex @code{@@namespace}, non riguarda @code{BEGIN}@comma{} @code{BEGINFILE}, @code{END}, ed @code{ENDFILE}
+@cindex @code{BEGIN}, regola, ordine di esecuzione non alterato da @code{@@namespace}
+@cindex @code{BEGINFILE}, regola, ordine di esecuzione non alterato da @code{@@namespace}
+@cindex @code{END}, regola, ordine di esecuzione non alterato da @code{@@namespace}
+@cindex @code{ENDFILE}, regola, ordine di esecuzione non alterato da @code{@@namespace}
+L'uso di @code{@@namespace} non ha influenza sull'ordine di esecuzione delle
+regole @code{BEGIN}, @code{BEGINFILE}, @code{END}, e @code{ENDFILE}.
+
+@node Regole per i nomi
+@section Regole per assegnare nomi a uno spazio-dei-nomi e ai suoi componenti
+
+@cindex nomi, regole per assegnare, agli spazi-dei-nomi e ai loro componenti
+@cindex spazio-dei-nomi, nomi, regole per assegnare
+@cindex componenti di uno spazio-dei-nomi, regole per assegnare i nomi
+Alcune regole vanno seguite nell'attribuire i nomi a uno spazio-dei-nomi
+e alle sue componenti.
+
+@itemize @bullet
+@item
+@`E un errore sintattico (@dfn{syntax error})
+usare nomi qualificati
+come nomi di parametri passati a una funzione.
+
+@item
+@`E un errore sintattico (@dfn{syntax error})
+usare una quasiasi parola riservata standard di @command{awk} (come
+@code{if} o @code{for}), o il nome di una qualsiasi funzione predefinita
+(come @code{sin()} o @code{gsub()}) come una qualsiasi delle parti di un nome
+nome qualificato.
+Quindi, il codice seguente produce un errore sintattico:
+
+@example
+@@namespace "example"
+
+function gsub(str, pat, result) @{ @dots{} @}
+@end example
+
+@item
+Fuori dallo spazio-dei-nomi @code{awk}, i nomi delle ulteriori funzioni
+predefinite disponibili in @command{gawk}
+(come @code{gensub()} o @code{strftime()}) @emph{possono}
+essere usate come nomi di componente.
+Lo stesso insieme di nomi pu@`o essere usato come nome di uno
+spazio-dei-nomi, sebbene farlo possa ingenerare confusione.
+
+@item
+Le ulteriori funzioni predefinite disponibili in @command{gawk} possono
+essere chiamate all'esterno dello spazio-dei-nomi @code{awk} utilizzando
+nomi qualificati. Per esempio, @code{awk::systime()}.
+Ecco un esempio abbastanza banale a dimostrazione di questa regola e
+della regola precedente:
+
+@example
+BEGIN @{
+    print "nello spazio-dei-nomi awk, systime() =", systime()
+@}
+
+@@namespace "testing"
+
+function systime()
+@{
+    print "nello spazio-dei-nomi testing, systime() =", awk::systime()
+@}
+
+BEGIN @{
+    systime()
+@}
+@end example
+
+@noindent
+
+Se lo si esegue, l'output prodotto @`e di questo tipo:
+
+@example
+$ @kbd{gawk -f systime.awk}
+@print{} nello spazio-dei-nomi awk, systime() = 1500488503
+@print{} nello spazio-dei-nomi testing, systime() = 1500488503
+@end example
+
+@item
+I nomi delle variabili predefinite di @command{gawk} possono essere usati:
+@code{NF::NR} @`e un nome valido, anche se non sembra una scelta di
+nomi molto utile.
+@end itemize
+
+@node Gestione interna dei nomi
+@section Come i nomi sono gestiti internamente
+
+@cindex nomi, gestione dei
+@cindex @code{awk} spazio-dei-nomi, memoria che contiene i nomi identificativi
+@cindex @code{awk} spazio-dei-nomi, utilizzo per chiamate indirette di funzione
+Per compatibilit@`a all'indietro, tutti gli identificatvi nello spazio-dei-nomi
+@code{awk} sono memorizzati internamente come identificativi senza qualifica
+(ossia, senza il prefisso @samp{awk::}).  Ci@`o ha importanza principalmente
+quando tali identificativi sono usati come indici per i vettori
+@code{SYMTAB}, @code{FUNCTAB}, e @code{PROCINFO["identifiers"]}
+(@pxref{Variabili auto-assegnate}), e quando sono usati per
+chiamate indirette di funzioni (@pxref{Chiamate indirette}).
+
+Nella codifica di programmi, per far riferimento a variabili e funzioni
+appartenenti allo spazio-dei-nomi @code{awk} da un altro spazio-dei-nomi
+@`e tuttavia necessario utilizzare il prefisso @samp{awk::}.
+Per esempio:
+
+@example
+@@namespace "awk"          @ii{Questo @`e lo spazio-dei-nomi di default}
+
+BEGIN @{
+    Titolo = "Il mio rapporto"   @ii{Il nome qualificato @`e} awk::Titolo
+@}
+
+@@namespace "rapporto"    @ii{Adesso lo spazio-dei-nomi @`e} rapporto
+
+function calcola()        @ii{Il nome vero di questa funzione @`e} rapporto::compute()
+@{
+    print awk::Titolo     @ii{Per stampare} SYMTAB["Titolo"]
+    @dots{}
+@}
+@end example
+
+@node Esempio di spazio-dei-nomi
+@section Esempio di codice che usa uno spazio-dei-nomi
+
+@cindex spazio-dei-nomi, esempio di codice
+L'esempio seguente @`e una versione riveduta dell'insieme di
+script sviluppati in @ref{Funzioni Passwd};
+l@`{@dotless{i}} si pu@`o trovare la descrizione del funzionamento del codice.
+
+Questa riformulazione, opera principalmente di Andrew Schorr,
+@`e piuttosto elegante.
+Tutte le funzioni e le variabili di implementazione
+sono nello spazio-dei-nomi @code{passwd}, mentre
+le funzioni principali di interfaccia sono
+definite nello spazio-dei-nomi @code{awk}.
+
+@example
+@c file eg/lib/ns_passwd.awk
+# ns_passwd.awk --- accedere alle informazioni del file delle password
+@c endfile
+@ignore
+@c file eg/lib/ns_passwd.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+#
+# Reworked for namespaces June 2017, with help from
+# Andrew J.@: Schorr, aschorr@@telemetry-investments.com
+@c endfile
+@end ignore
+@c file eg/lib/ns_passwd.awk
+
+@@namespace "passwd"
+
+BEGIN @{
+    # modificare per adattarlo al sistema in uso
+    Awklib = "/usr/local/libexec/awk/"
+@}
+
+function Init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+@{
+    if (Inizializzato)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    pwcat = Awklib "pwcat"
+    while ((pwcat | getline) > 0) @{
+        Byname[$1] = $0
+        Byuid[$3] = $0
+        Bycount[++Totale] = $0
+    @}
+    close(pwcat)
+    Contatore = 0
+    Inizializzato = 1
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+@}
+
+function awk::getpwnam(nome)
+@{
+    Init()
+    return Byname[nome]
+@}
+
+function awk::getpwuid(uid)
+@{
+    Init()
+    return Byuid[uid]
+@}
+
+function awk::getpwent()
+@{
+    Init()
+    if (Contatore < Totale)
+        return Bycount[++Contatore]
+    return ""
+@}
+
+function awk::endpwent()
+@{
+    Contatore = 0
+@}
+@c endfile
+@end example
+
+Come si pu@`o vedere, questa versione segue anche la convenzione menzionata in
+@ref{Nomi di variabili di libreria}, secondo la quale i nomi di funzione e
+le variabili globali iniziano con la lettera maiuscola.
+
+Quel che segue @`e un semplice programma di test.  Poich@'e @`e in un file
+separato, gli identificativi non qualificati saranno ricercati
+all'interno dello spazio-dei-nomi @code{awk}:
+
+@example
+BEGIN @{
+    while ((p = getpwent()) != "")
+        print p
+@}
+@end example
+
+@noindent
+
+Ecco cosa succede quando il programma viene eseguito:
+
+@example
+$ @kbd{gawk -f ns_passwd.awk -f testpasswd.awk}
+@print{} root:x:0:0:root:/root:/bin/bash
+@print{} daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
+@print{} bin:x:2:2:bin:/bin:/usr/sbin/nologin
+@print{} sys:x:3:3:sys:/dev:/usr/sbin/nologin
+@dots{}
+@end example
+
+@node Spazio-dei-nomi e funzionalit@`a
+@section Lo spazio-dei-nomi e le altre funzionalit@`a di @command{gawk}
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} tratta brevemente di come la funzionalit@`a spazio-dei-nomi
+interagisce con altre importanti funzionalit@`a di @command{gawk}.
+
+@cindex spazio-dei-nomi, interazione con la profilazione
+@cindex spazio-dei-nomi, interazione con la stampa elegante
+@cindex profilazione, interazione con spazio-dei-nomi
+@cindex stampa elegante, interazione con spazio-dei-nomi
+La profilazione e la stampa elegante (@pxref{Profilare}) sono state
+migliorate per trattare gli spazi-dei-nomi e le regole per assegnare nomi in
+uno spazio-dei-nomi @ref{Regole per i nomi}.
+In particolare, l'output tiene insieme le funzioni che appartengono
+allo stesso spazio-dei-nomi, e contiene delle direttive @code{@@namespace}
+davanti alle regole, a seconda delle necessit@`a.
+In questo modo i nomi dei componenti sono degli
+identificativi semplici, senza dover usare dappertutto degli
+identificativi qualificati.
+
+@cindex spazio-dei-nomi, interazioen con il debugger
+@cindex debugger, interazione con lo spazio-dei-nomi
+L'interazione con il debugger (@pxref{Debugging}) non @`e cambiata
+(almeno fino al momento in cui questo libro @`e stato scritto).
+Alcuni campi interni sono stati modificati per tener conto
+degli spazi-dei-nomi, e il comando @code{dump} del debugger
+@`e stato modificato per lo stesso motivo.
+
+@cindex spazio-dei-nomi, interazione con l'estensione API
+@cindex estensione API, interazione con lo spazio-dei-nomi
+@cindex API, estensione, interazione con lo spazio-dei-nomi
+L'estensione API (@pxref{Estensioni dinamiche}) ha sempre previsto
+di avere funzioni in uno spazio-dei-nomi differente, sebbene ci@`o
+non fosse stato ancora implementato.  Tuttavia, le routine di
+ricerca e di aggiornamento dei simbolo non prevedevano l'utilizzo
+di un spazio-dei-nomi.  Questo @`e stato corretto
+(@pxref{Tabella simboli per nome}).
+@xref{Esempio di estensione Inplace}, per un notevole esempio di
+un'estensione che sfrutta uno spazio-dei-nomi condiviso fra del
+codice scritto in C e del codice @command{awk}, che collaborano
+fra loro.
+
+@node Sommario dello Spazio-dei-nomi
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+@command{awk} standard fornisce un unico spazio-dei-nomi per tutti gli
+identificativi globali (scalari, vettori e funzioni).
+Ci@`o pu@`o essere limitante se si vogliono sviluppare librerie di
+funzioni riusabili, o gruppi di funzioni.
+
+@item
+@command{gawk} fornisce degli spazi-dei-nomi multipli, attraverso l'uso di
+nomi qualificati: nomi che consistono nel nome di uno spazio-dei-nomi,
+seguito da un separatore di spazio-dei-nomi (@code{::}), e da un nome di
+componente.  I nomi degli spazi-dei-nomi potrebbero ancora entrare in
+conflitto fra loro, ma questo capita in ogni linguaggio che fornisce
+spazi-dei-nomi, moduli, o pacchetti.
+
+@item
+Lo spazio-dei-nomi di default @`e @command{awk}.  Le regole per gli
+spazi-dei-nomi e per i nomi dei loro componenti sono descritte in
+@ref{Regole per i nomi}.  Le regole sono state progettate
+in modo da far s@`{@dotless{i}} che il codice che usa gli spazi-dei-nomi resti
+semplice da leggere e funzioni in maniera intuitiva, pur rendendo
+disponibile la potenza e la flessibilit@`a necessarie.
+
+@item
+Altre parti di @command{gawk} sono state estese come necessario per
+integrare gli spazi-dei-nomi nel loro funzionamento.
+Questo vale soprattutto per la profilazione / stampa elegante
+(@pxref{Profilare}) e per le funzionalit@`a relative alle
+estensioni (@pxref{Estensioni dinamiche}).
+
+@cindex spazio-dei-nomi, compatibilit@`a all'indietro
+@item
+Complessivamente, la funzionalit@`a spazio-dei-nomi @`e stata progettata e
+implementata avendo come preoccupazione quella di mantenere la compatibilit@`a
+all'indietro.  I programmi che non usano degli spazi-dei-nomi
+non dovrebbero avere alcuna differenza di comportamento quando sono eseguiti
+su una versione di @command{gawk} che abbia la funzionalit@`a spazio-dei-nomi.
+@end itemize
+
+@node Calcolo con precisione arbitraria
+@chapter Calcolo con precisione arbitraria con @command{gawk}
+@cindex precisione arbitraria
+@cindex precisione multipla
+@cindex precisione infinita
+@cindex virgola mobile, numeri in@comma{} precisione arbitraria
+
+In questo @value{CHAPTER} si introducono alcuni concetti base su come i
+computer
+eseguono i calcoli e si definiscono alcuni termini importanti.
+Si continua poi descrivendo il calcolo in virgola mobile,
+che @`e quello che @command{awk} usa per tutte le sue operazioni aritmetiche,
+e si prosegue con
+una trattazione del calcolo in virgola mobile con precisione arbitraria,
+una funzionalit@`a disponibile solo in @command{gawk}. Si passa poi a
+illustrare i numeri interi a precisione arbitraria e si conclude con una
+descrizione di alcuni punti sui quali @command{gawk} e lo standard POSIX non
+sono esattamente in accordo.
+
+@quotation NOTA
+La maggior parte degli utenti di @command{gawk} pu@`o saltare senza patemi
+d'animo
+questo capitolo. Tuttavia, se si vogliono eseguire calcoli scientifici con
+@command{gawk}, questo @`e il luogo adatto per imparare a farlo.
+@end quotation
+
+@menu
+* Aritmetica del computer::       Una rapida introduzione alla matematica del
+                                  computer.
+* Definizioni matematiche::       Definizione dei termini usati.
+* Funzionalit@`a MPFR::             Funzionalit@`a MPFR in @command{gawk}.
+* Cautela col calcolo in VM::     Cose da sapere.
+* Interi a precisione arbitraria:: Calcolo con numeri interi a precisione
+                                   arbitraria con @command{gawk}.
+* Controllare disponibilit@`a MPFR:: Come controllare se MPFR @`e disponibile.
+* Problemi virgola mobile POSIX::  Confronto tra standard e uso corrente.
+* Sommario virgola mobile::        Sommario della trattazione della
+                                   virgola mobile.
+@end menu
+
+@node Aritmetica del computer
+@section Una descrizione generale dell'aritmetica del computer
+
+Sinora, abbiamo avuto a che fare con dati come numeri o stringhe.  Ultimamente,
+comunque, i computer rappresentano ogni cosa in termini di @dfn{cifre binarie},
+o @dfn{bit}.  Una cifra decimale pu@`o assumere uno di 10 valori: da zero a
+nove.  Una cifra binaria pu@`o assumere uno di due valori: zero o uno.  Usando
+il sistema binario, i computer (e i programmi per computer) possono
+rappresentare e manipolare dati numerici e dati costituiti da caratteri.  In
+generale, tanti pi@`u bit @`e possibile usare per rappresentare una determinata
+cosa, tanto maggiore sar@`a l'intervallo dei possibili valori che essa potr@`a
+assumere.
+
+I moderni calcolatori possono eseguire calcoli numerici in almeno due modi, e
+spesso anche di pi@`u.  Ogni tipo di calcolo usa una diversa rappresentazione
+(organizzazione dei bit) dei numeri.  Le modalit@`a di calcolo che ci interessano
+sono:
+
+@table @asis
+@item Calcolo decimale
+Questo @`e il tipo di calcolo che s'impara alle scuole elementari, usando
+carta e penna (o anche una calcolatrice).  In teoria, i numeri possono avere un
+numero arbitrario di cifre su ambo i lati del separatore decimale, e il
+risultato di un'operazione @`e sempre esatto.
+
+Alcuni sistemi moderni possono eseguire calcoli decimali direttamente,
+tramite apposite istruzioni disponibili
+nell'hardware dell'elaboratore, ma normalmente si ha necessit@`a di una speciale
+libreria software che consenta di effettuare le operazioni desiderate.
+Ci sono anche librerie che svolgono i calcoli decimali interamente
+per via software.
+
+Anche se alcuni utenti si aspettano che @command{gawk} effettui delle
+operazioni usando numeri in base decimale,@footnote{Non sappiamo perch@'e se
+lo aspettino, ma @`e cos@`{@dotless{i}}.} non @`e questo quello che succede.
+
+@item La matematica coi numeri interi
+A scuola ci hanno insegnato che i valori interi erano quei numeri privi di una
+parte frazionaria, come 1, 42, o @minus{}17.
+Il vantaggio dei numeri interi @`e che essi rappresentano dei valori in maniera
+esatta.  Lo svantaggio @`e che i numeri rappresentabili sono limitati.
+
+@cindex senza segno, interi
+@cindex segno, interi senza
+@cindex interi senza segno
+Nei calcolatori, i valori interi sono di due tipi: @dfn{con segno} e
+@dfn{senza segno}.  I valori con segno possono essere negativi o positivi,
+mentre i valori senza segno sono sempre maggiori o uguali a zero.
+
+Nei sistemi informatici, il calcolo con valori interi @`e esatto, ma il possibile
+campo di variazione dei valori @`e limitato.  L'elaborazione con numeri interi @`e
+pi@`u veloce di quella con numeri in virgola mobile.
+
+@cindex virgola mobile, numeri in
+@cindex numeri in virgola mobile
+@item La matematica coi numeri in virgola mobile
+I numeri in virgola mobile rappresentano quelli che a scuola sono chiamati
+numeri ``reali'' (cio@`e, quelli che hanno una parte frazionaria, come
+3.1415927).  Il vantaggio dei numeri in virgola mobile @`e che essi possono
+rappresentare uno spettro di valori molto pi@`u ampio di quello rappresentato dai
+numeri interi.  Lo svantaggio @`e che ci sono numeri che essi non possono
+rappresentare in modo esatto.
+
+I computer moderni possono eseguire calcoli su valori in virgola mobile
+nell'hardware dell'elaboratore, entro un intervallo di valori limitato.
+Ci sono inoltre librerie di programmi che consentono calcoli, usando numeri in
+virgola mobile, di precisione arbitraria.
+
+@cindex virgola mobile, numeri in@comma{} precisione singola
+@cindex virgola mobile, numeri in@comma{} precisione doppia
+@cindex virgola mobile, numeri in@comma{} precisione arbitraria
+@cindex precisione singola
+@cindex precisione doppia
+@cindex precisione arbitraria
+@cindex singola, precisione
+@cindex doppia, precisione
+@cindex arbitraria, precisione
+POSIX @command{awk} usa numeri in virgola mobile a @dfn{doppia precisione},
+che possono gestire pi@`u cifre rispetto ai numeri in virgola mobile a
+@dfn{singola precisione}.  @command{gawk} ha inoltre funzionalit@`a, descritte
+in dettaglio pi@`u sotto, che lo mettono in grado di eseguire
+calcoli con i numeri in virgola mobile con precisione arbitraria.
+@end table
+
+I calcolatori operano con valori interi e in virgola mobile su diversi
+intervalli. I valori interi normalmente hanno una dimensione di 32 bit o 64 bit.
+I valori in virgola mobile a singola precisione occupano 32 bit, mentre i
+valori in virgola mobile a doppia precisione occupano 64 bit.
+(Esistono anche numeri in virgola mobile a precisione quadrupla.  Occupano
+128 bit, ma non sono disponibili in @command{awk}.)
+I valori in virgola mobile sono sempre con segno.  I possibili campi di
+variazione dei valori sono mostrati in @ref{table-numeric-ranges} e in
+@ref{table-floating-point-ranges}.
+
+@float Tabella,table-numeric-ranges
+@caption{Intervallo di valori per rappresentazioni di numeri interi}
+@multitable @columnfractions .34 .33 .33
+@headitem Rappresentazione @tab Valore minimo @tab Valore massimo
+@item Interi con segno a 32-bit @tab @minus{}2.147.483.648 @tab 2.147.483.647
+@item Interi senza segno a 32-bit @tab 0 @tab 4.294.967.295
+@item Interi con segno a 64-bit @tab @minus{}9.223.372.036.854.775.808 @tab 9.223.372.036.854.775.807
+@item Interi senza segno a 64-bit @tab 0 @tab 18.446.744.073.709.551.615
+@end multitable
+@end float
+
+@float Tabella,table-floating-point-ranges
+@caption{Intervallo di valori per rappresentazioni di numeri in virgola mobile}
+@multitable @columnfractions .34 .22 .22 .22
+@iftex
+@headitem Rappresentazione @tab @w{Valore positivo} @w{minimo} @w{diverso da zero} @tab @w{Valore finito} @w{minimo} @tab @w{Valore finito} @w{massimo}
+@end iftex
+@ifnottex
+@headitem Rappresentazione @tab Valore positivo minimo diverso da zero @tab Valore finito minimo @tab Valore finito massimo
+@end ifnottex
+@iftex
+@item @w{Virgola mobile, singola precis.} @tab @math{1,175494 @cdot 10^{-38}} @tab @math{-3,402823 @cdot 10^{38}} @tab @math{3,402823 @cdot 10^{38}}
+@item @w{Virgola mobile, doppia precis.} @tab @math{2,225074 @cdot 10^{-308}} @tab @math{-1,797693 @cdot 10^{308}} @tab @math{1,797693 @cdot 10^{308}}
+@item @w{Virgola mobile, quadrupla prec.} @tab @math{3,362103 @cdot 10^{-4932}} @tab @math{-1,189731 @cdot 10^{4932}} @tab @math{1,189731 @cdot 10^{4932}}
+@end iftex
+@ifinfo
+@item Virgola mobile, singola precis. @tab 1,175494e-38 @tab -3,402823e38 @tab 3,402823e38
+@item Virgola mobile, doppia precis. @tab 2,225074e-308 @tab -1,797693e308 @tab 1,797693e308
+@item Virgola mobile, quadrupla prec. @tab 3,362103e-4932 @tab -1,189731e4932 @tab 1,189731e4932
+@end ifinfo
+@ifnottex
+@ifnotinfo
+@item Virgola mobile, singola precis. @tab 1,175494@sup{-38} @tab -3,402823@sup{38} @tab 3,402823*10@sup{38}
+@item Virgola mobile, singola precis. @tab 2,225074@sup{-308} @tab -1,797693@sup{308} @tab 1,797693*10@sup{308}
+@item Virgola mobile, quadrupla prec. @tab 3,362103@sup{-4932} @tab -1,189731@sup{4932} @tab 1,189731@sup{4932}
+@end ifnotinfo
+@end ifnottex
+@end multitable
+@end float
+
+@node Definizioni matematiche
+@section Altre cose da sapere
+
+Il resto di questo @value{CHAPTER} usa un certo numero di termini. Di seguito
+vengono date alcune definizioni informali che dovrebbero essere utili
+per la lettura di questo documento:
+
+@table @dfn
+@item Accuratezza
+L'accuratezza del calcolo sui numeri in virgola mobile indica di quanto si
+avvicina il calcolo al valore reale (calcolato con carta e penna).
+
+@item Errore
+La differenza tra quello che il risultato di un calcolo ``dovrebbe dare''
+e quello che effettivamente d@`a.  @`E meglio minimizzare l'errore quanto pi@`u
+possibile.
+
+@item Esponente
+L'ordine di grandezza di un valore;
+alcuni bit in un valore in virgola mobile contengono l'esponente.
+
+@item Inf
+Un valore speciale che rappresenta l'infinito. Le operazioni tra un qualsiasi
+numero e l'infinito danno infinito.
+
+@item Mantissa
+Un valore in virgola mobile @`e formato dalla mantissa moltiplicata per 10
+alla potenza dell'esponente. Per esempio, in @code{1,2345e67},
+la mantissa @`e @code{1,2345}.
+
+@item Modalit@`a di arrotondamento
+Come i numeri vanno arrotondati, per eccesso o per difetto, quando necessario.
+Maggiori dettagli verranno forniti in seguito.
+
+@item NaN
+``Not a number'' (Non un Numero).@footnote{Grazie a Michael
+Brennan per questa descrizione, che abbiamo parafrasato, e per gli esempi.} Un
+valore speciale che risulta da un calcolo che non ha risposta come numero
+reale. In tal caso, i programmi possono o ricevere un'eccezione di virgola
+mobile, o restituire @code{NaN} come risultato. Lo standard IEEE 754
+consiglia che i sistemi restituiscano @code{NaN}. Alcuni esempi:
+
+@table @code
+@item sqrt(-1)
+La radice quadrata di @minus{}1 ha senso nell'insieme dei numeri complessi,
+ma non nell'insieme dei numeri reali,
+per cui il risultato @`e @code{NaN}.
+
+@item log(-8)
+Il logaritmo di @minus{}8 @`e fuori dal dominio di @code{log()},
+per cui il risultato @`e @code{NaN}.
+@end table
+
+@item Normalizzato (formato)
+Come la mantissa (vedi oltre in questa lista) @`e usualmente memorizzata. Il
+valore viene aggiustato in modo che il primo bit sia sempre uno,
+e in questo modo l'uno iniziale @`e supposto presente (per come viene
+generato il numero), ma non @`e memorizzato fisicamente.
+Questo fornisce un bit di precisione in pi@`u.
+
+@item Precisione
+Il numero di bit usati per rappresentare un numero in virgola mobile.
+Pi@`u sono i bit, e maggiore @`e l'intervallo di cifre che si possono
+rappresentare.
+Le precisioni binaria e decimale sono legate in modo approssimativo, secondo
+la formula:
+
+@display
+@iftex
+@math{prec = 3.322 @cdot dps}
+@end iftex
+@ifnottex
+@ifnotdocbook
+@var{prec} = 3.322 * @var{dps}
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>
+@end docbook
+@end display
+
+@noindent
+Qui, @emph{prec} indica la precisione binaria
+(misurata in bit) e @emph{dps} (abbreviazione di "decimal places")
+indica le cifre decimali.
+
+@item Stabilit@`a
+Dal@uref{https://en.wikipedia.org/wiki/Numerical_stability,
+l'articolo di Wikipedia sulla stabilit@`a numerica}:
+``I calcoli per i quali si pu@`o dimostrare che non amplificano gli errori di
+approssimazione sono chiamati @dfn{numericamente stabili}.''
+@end table
+
+Si veda @uref{https://en.wikipedia.org/wiki/Accuracy_and_precision,
+l'articolo di Wikipedia su accuratezza e precisione} per maggiori informazioni
+su questi due termini.
+
+Sui computer moderni, l'unit@`a di calcolo in virgola mobile usa la
+rappresentazione e le operazioni definite dallo standard IEEE 754.
+Tre dei tipi definiti nello standard IEEE 754 sono:
+32-bit singola precisione,
+64-bit doppia precisione e
+128-bit quadrupla precisione.
+Lo standard specifica anche formati a precisione estesa
+per consentire una maggiore precisione e campi di variazione degli esponenti
+pi@`u ampi.  (@command{awk} usa solo il formato a 64-bit doppia precisione.)
+
+@ref{table-ieee-formats} elenca la precisione e i valori di campo
+dell'esponente per i principali formati binari IEEE 754.
+
+@float Tabella,table-ieee-formats
+@caption{Valori per i principali formati IEEE}
+@multitable @columnfractions .20 .20 .20 .20 .20
+@headitem Nome @tab Bit totali @tab Precisione @tab Esponente minimo @tab Esponente massimo
+@item Singola @tab 32 @tab 24 @tab @minus{}126 @tab +127
+@item Doppia @tab 64 @tab 53 @tab @minus{}1022 @tab +1023
+@item Quadrupla @tab 128 @tab 113 @tab @minus{}16382 @tab +16383
+@end multitable
+@end float
+
+@quotation NOTA
+I numeri che descrivono la precisione includono la cifra 1 iniziale
+implicita, il che equivale ad avere un bit in pi@`u nella mantissa.
+@end quotation
+
+@node Funzionalit@`a MPFR
+@section Funzionalit@`a per il calcolo a precisione arbitraria in @command{gawk}
+
+Per default, @command{gawk} usa i valori in virgola mobile a doppia precisione
+disponibili nell'hardware del sistema su cui viene eseguito.
+Tuttavia, se @`e stato compilato in modo da includere questa funzionalit@`a
+ed @`e stata specificata
+l'opzione da riga di comando @option{-M}, @command{gawk} usa le librerie
+@uref{http://www.mpfr.org, GNU MPFR} e @uref{https://gmplib.org, GNU MP} (GMP)
+per effettuare calcoli sui numeri con una precisione arbitraria.
+Si pu@`o verificare se il supporto a MPFR @`e disponibile in questo modo:
+
+@example
+$ @kbd{gawk --version}
+@print{} GNU Awk 4.1.2, API: 1.1 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2)
+@print{} Copyright (C) 1989, 1991-2015 Free Software Foundation.
+@dots{}
+@end example
+
+@noindent
+(I numeri di versione visualizzati possono essere diversi. Non importa;
+l'importante @`e che siano presenti GNU MPFR e GNU MP
+nel testo restituito.)
+
+Inoltre, ci sono alcuni elementi disponibili nel vettore @code{PROCINFO}
+per fornire informazioni sulle librerie MPFR e GMP
+(@pxref{Variabili auto-assegnate}).
+
+La libreria MPFR d@`a un controllo accurato sulle precisioni e sulle modalit@`a di
+arrotondamento, e d@`a risultati correttamente arrotondati, riproducibili e
+indipendenti dalla piattaforma.  Con l'opzione da riga di comando @option{-M},
+tutti gli operatori aritmetici e le funzioni in virgola mobile possono
+produrre risultati a ogni livello di precisione supportato da MPFR.
+
+Due variabili predefinite, @code{PREC} e @code{ROUNDMODE},
+danno il controllo sulla precisione di elaborazione e sulla modalit@`a di
+arrotondamento.  La precisione e la modalit@`a di arrotondamento sono impostate
+a livello globale per ogni operazione da eseguire.
+@xref{Impostare la precisione} e
+@iftex
+la
+@end iftex
+@ref{Impostare modo di arrotondare}
+per maggiori informazioni.
+
+@node Cautela col calcolo in VM
+@section Calcolo in virgola mobile: @dfn{Caveat Emptor}!
+
+@quotation
+@i{L'ora di matematica @`e ostica!}
+@author Teen Talk Barbie, luglio 1992
+@end quotation
+
+Questa @value{SECTION} fornisce un quadro dettagliato dei problemi che
+si presentano quando si eseguono molti calcoli in virgola
+mobile.@footnote{C'@`e un saggio molto bello
+@uref{http://www.validlab.com/goldberg/paper.pdf, sul calcolo in
+virgola mobile} di David Goldberg, ``What Every Computer Scientist Should Know
+About Floating-Point Arithmetic,''
+@cite{ACM Computing Surveys} @strong{23}, 1 (1991-03): 5-48.  Vale la pena di
+leggerlo, se si @`e interessati a scendere nei dettagli, per@`o richiede delle
+conoscenze informatiche.}
+Le spiegazioni fornite valgono sia per il calcolo in virgola mobile
+effettuato direttamente dall'hardware del computer, sia per quello
+ottenuto tramite il software per la precisione arbitraria.
+
+@quotation ATTENZIONE
+Le informazioni fornite in questa sede sono deliberatamente di tipo generale.
+Se si devono eseguire calcoli complessi col computer, si dovrebbero prima
+ottenere ulteriori informazioni, e non basarsi solo su quanto qui detto.
+@end quotation
+
+@menu
+* Inesattezza nei calcoli::       La matematica in virgola mobile non @`e
+                                  esatta.
+* Ottenere la precisione::        Ottenere pi@`u precisione richiede qualche
+                                  sforzo.
+* Tentare di arrotondare::        Aggiungere cifre di precisione e arrotondare.
+* Impostare la precisione::       Come impostare la precisione.
+* Impostare modo di arrotondare:: Impostare le modalit@`a di arrotondamento.
+@end menu
+
+@node Inesattezza nei calcoli
+@subsection La matematica in virgola mobile non @`e esatta
+
+Le rappresentazioni e i calcoli con numeri in virgola mobile binari sono
+inesatti.  Semplici valori come  0,1 non possono essere rappresentati in modo
+preciso usando numeri in virgola mobile binari, e la limitata precisione dei
+numeri in virgola mobile significa che piccoli cambiamenti nell'ordine delle
+operazioni o la precisione di memorizzazione di operazioni
+intermedie pu@`o cambiare il
+risultato. Per rendere la situazione pi@`u difficile, nel calcolo in virgola
+mobile con precisione arbitraria, si pu@`o impostare la precisione prima di
+eseguire un calcolo, per@`o non si pu@`o sapere con certezza quale sar@`a
+il numero di cifre decimali esatte nel risultato finale.
+
+@menu
+* Rappresentazioni inesatte::   I numeri non sono rappresentati esattamente.
+* Confronti tra valori in VM::  Come confrontare valori in virgola mobile.
+* Gli errori si sommano::       Gli errori diventano sempre maggiori.
+@end menu
+
+@node Rappresentazioni inesatte
+@subsubsection Molti numeri non possono essere rappresentati esattamente
+
+Perci@`o, prima di iniziare a scrivere del codice, si dovrebbe pensare
+al risultato che si vuole effettivamente ottenere e a cosa realmente accade.
+Si considerino i due numeri nel seguente esempio:
+
+@example
+x = 0.875             # 1/2 + 1/4 + 1/8
+y = 0.425
+@end example
+
+Diversamente dal numero in @code{y}, il numero memorizzato in @code{x}
+@`e rappresentabile esattamente nel formato binario, perch@'e pu@`o essere
+scritto come somma finita di una o pi@`u frazioni i cui denominatori sono tutti
+multipli di due.
+Quando @command{gawk} legge un numero in virgola mobile dal sorgente di un
+programma, arrotonda automaticamente quel numero alla precisione, quale che
+sia, supportata dal computer in uso. Se si tenta di stampare il contenuto
+numerico di una variabile usando una stringa di formato in uscita di
+@code{"%.17g"}, il valore restituito pu@`o non essere lo stesso numero assegnato
+a quella variabile:
+
+@example
+$ @kbd{gawk 'BEGIN @{ x = 0.875; y = 0.425}
+> @kbd{              printf("%0.17g, %0.17g\n", x, y) @}'}
+@print{} 0.875, 0.42499999999999999
+@end example
+
+Spesso l'errore @`e talmente piccolo da non essere neppure notato, e se @`e stato
+notato, si pu@`o sempre specificare il grado di precisione si vuole nell'output.
+In genere questo @`e una stringa di formato come @code{"%.15g"} che, se usata
+nell'esempio precedente, d@`a luogo a un output identico all'input.
+
+@node Confronti tra valori in VM
+@subsubsection Fare attenzione quando si confrontano valori
+
+Poich@'e la rappresentazione interna del computer
+pu@`o discostarsi, sia pur di poco, dal valore
+esatto, confrontare dei valori in virgola mobile per vedere se sono esattamente
+uguali @`e generalmente una pessima idea.  Questo @`e un esempio in cui tale
+confronto non funziona come dovrebbe:
+
+@example
+$ @kbd{gawk 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
+@print{} 0
+@end example
+
+Il metodo generalmente seguito per confrontare valori in virgola mobile
+consiste nel controllare se la differenza tra loro @`e minore di un certo valore
+(chiamato @dfn{delta}, o @dfn{tolleranza}).  Quel che si deve decidere @`e qual
+@`e il valore minimo di delta
+adeguato.  Il codice per far ci@`o @`e qualcosa del genere:
+
+@example
+@group
+delta = 0.00001                 # per esempio
+differenza = abs(a - b)         # sottrazione dei due valori
+if (differenza < delta)
+    # va bene
+else
+    # non va bene
+@end group
+@end example
+
+@noindent
+(Si presuppone che sia stata definita in qualche altra parte del programma
+una semplice funzione di nome @code{abs()}.)  Se si scrive una funzione
+per confrontare dei valori con un valore dato @samp{delta}, si dovrebbe
+utilizzare la notazione @samp{differenza < abs(delta)} nel caso che
+a @samp{delta} venga assegnato un valore negativo.
+
+@node Gli errori si sommano
+@subsubsection Gli errori diventano sempre maggiori
+
+La perdita di accuratezza in un singolo calcolo con numeri in virgola mobile
+generalmente non dovrebbe destare preoccupazione.  Tuttavia, se si calcola un
+valore che @`e una sequenza di operazioni in virgola mobile, l'errore si pu@`o
+accumulare e influire sensibilmente sul risultato del calcolo stesso.
+Qui sotto vediamo un tentativo di calcolare il valore di @value{PI} usando
+una delle sue rappresentazioni
+come somma di una serie di numeri:
+
+@example
+BEGIN @{
+    x = 1.0 / sqrt(3.0)
+    n = 6
+    for (i = 1; i < 30; i++) @{
+        n = n * 2.0
+        x = (sqrt(x * x + 1) - 1) / x
+        printf("%.15f\n", n * x)
+    @}
+@}
+@end example
+
+Quando viene eseguito, gli errori iniziali si propagano nei calcoli
+successivi, facendo terminare il ciclo prematuramente dopo un tentativo di
+divisione per zero:
+
+@example
+$ @kbd{gawk -f pi.awk}
+@print{} 3.215390309173475
+@print{} 3.159659942097510
+@print{} 3.146086215131467
+@print{} 3.142714599645573
+@dots{}
+@print{} 3.224515243534819
+@print{} 2.791117213058638
+@print{} 0.000000000000000
+@error{} gawk: pi.awk:6: fatale: tentativo di dividere per zero
+@end example
+
+Ecco un altro esempio in cui l'inaccuratezza nelle rappresentazioni interne
+porta a un risultato inatteso:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>   @kbd{for (d = 1.1; d <= 1.5; d += 0.1)  # esegue il ciclo cinque volte (?)}
+>       @kbd{i++}
+>   @kbd{print i}
+> @kbd{@}'}
+@print{} 4
+@end example
+
+@node Ottenere la precisione
+@subsection Ottenere la precisione voluta
+
+Pu@`o il calcolo con precisione arbitraria dare risultati esatti? Non ci sono
+risposte facili. Le regole standard dell'algebra spesso non valgono
+nei calcoli con precisione arbitraria.
+Tra le altre cose, le leggi distributiva e associativa non sono rispettate
+completamente, e l'ordine dell'operazione pu@`o essere importante per
+il calcolo.
+Errori di arrotondamento, perdite di precisione che si accumulano, e
+valori molto vicini allo zero sono spesso causa di problemi.
+
+Quando @command{gawk} verifica l'eguaglianza delle espressioni
+@samp{0.1 + 12.2} e @samp{12.3} usando l'aritmetica a doppia precisione della
+macchina, decide che non sono uguali! (@xref{Confronti tra valori in VM}.)
+Si pu@`o ottenere il risultato cercato aumentando la precisione; 56 bit in
+questo caso sono sufficienti:
+
+@example
+$ @kbd{gawk -M -v PREC=56 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
+@print{} 1
+@end example
+
+Se aggiungere pi@`u bit @`e una buona cosa, aggiungerne ancora di pi@`u
+@`e meglio?
+Ecco cosa succede se si usa un valore di @code{PREC} ancora pi@`u alto:
+
+@example
+$ @kbd{gawk -M -v PREC=201 'BEGIN @{ print (0.1 + 12.2 == 12.3) @}'}
+@print{} 0
+@end example
+
+Non @`e un bug di @command{gawk} o della libreria MPFR.
+@`E facile dimenticare che il numero finito di bit usato per memorizzare il
+valore spesso @`e solo un'approssimazione dopo un opportuno arrotondamento.  Il
+test di uguaglianza riesce se e solo se @emph{tutti} i bit dei due operandi
+sono esattamente gli stessi. Poich@'e questo non @`e necessariamente vero dopo un
+calcolo in virgola mobile con una determinata precisione e con una modalit@`a di
+arrotondamento valida, un test di eguaglianza convenzionale potrebbe non
+riuscire. Invece, il test riesce confrontando i due numeri per vedere se la
+differenza tra di loro rientra in un delta accettabile.
+
+In applicazioni dove sono sufficienti fino a 15 cifre decimali,
+il calcolo in doppia precisione eseguito dall'hardware del computer
+pu@`o essere una buona soluzione,
+e in genere @`e pi@`u veloce.  Per@`o bisogna tener presente che ogni operazione in
+virgola mobile pu@`o subire un nuovo errore di arrotondamento con conseguenze
+catastrofiche, come si @`e visto nel precedente tentativo di calcolare il valore
+di @value{PI}.
+In tali casi una precisione supplementare pu@`o aumentare la stabilit@`a e
+l'accuratezza del calcolo.
+
+Oltre a ci@`o, bisogna tenere conto del fatto che
+addizioni ripetute non sono necessariamente equivalenti a una moltiplicazione
+nell'aritmetica in virgola mobile. Nell'esempio visto in
+@ref{Gli errori si sommano}:
+
+@example
+$ @kbd{gawk 'BEGIN @{}
+>   @kbd{for (d = 1.1; d <= 1.5; d += 0.1)  # ciclo eseguito cinque volte (?)}
+>       @kbd{i++}
+>   @kbd{print i}
+> @kbd{@}'}
+@print{} 4
+@end example
+
+@noindent
+non @`e detto che, scegliendo per @code{PREC} un valore arbitrariamente alto, si
+riesca a ottenere il risultato corretto. La riformulazione del problema in
+questione @`e spesso il modo corretto di comportari in tali situazioni.
+
+@node Tentare di arrotondare
+@subsection Tentare di aggiungere bit di precisione e arrotondare
+
+Invece dell'aritmetica in virgola mobile con precisione arbitraria,
+spesso tutto ci@`o di cui si ha bisogno @`e un aggiustamento della logica
+o di un diverso ordine delle operazioni nei calcoli.
+La stabilit@`a e l'accuratezza del calcolo di @value{PI}
+nel primo esempio possono essere migliorata usando la seguente semplice
+trasformazione algebrica:
+
+@example
+(sqrt(x * x + 1) - 1) / x @equiv{} x / (sqrt(x * x + 1) + 1)
+@end example
+
+@noindent
+Dopo aver fatto questo cambiamento, il programma converge verso
+@value{PI} in meno di 30 iterazioni:
+
+@example
+$ @kbd{gawk -f pi2.awk}
+@print{} 3.215390309173473
+@print{} 3.159659942097501
+@print{} 3.146086215131436
+@print{} 3.142714599645370
+@print{} 3.141873049979825
+@dots{}
+@print{} 3.141592653589797
+@print{} 3.141592653589797
+@end example
+
+@node Impostare la precisione
+@subsection Impostare la precisione
+
+@command{gawk} usa una precisione di lavoro a livello globale; non tiene
+traccia della precisione e accuratezza dei singoli numeri. Eseguendo
+un'operazione aritmetica o chiamando una funzione predefinita, il risultato
+viene arrotondato alla precisione di lavoro. La precisione di lavoro di default
+@`e di 53 bit, modificabile usando la variabile predefinita @code{PREC}. Si pu@`o
+anche impostare il valore a una delle stringhe predefinite (non importa se
+scritte in maiuscolo o minuscolo) elencate in
+@ref{table-predefined-precision-strings},
+per emulare un formato binario che segue lo standard IEEE 754.
+
+@float Tabella,table-predefined-precision-strings
+@caption{Stringhe di precisione predefinita per @code{PREC}}
+@multitable {@code{"double"}} {12345678901234567890123456789012345}
+@headitem @code{PREC} @tab formato binario IEEE 754
+@item @code{"half"} @tab 16-bit mezza precisione
+@item @code{"single"} @tab 32-bit singole precisione di base
+@item @code{"double"} @tab 64-bit doppia precisione di base
+@item @code{"quad"} @tab 128-bit quadrupla precisione di base
+@item @code{"oct"} @tab 256-bit ottupla precisione
+@end multitable
+@end float
+
+Il seguente esempio illustra gli effetti del cambiamento di precisione
+sulle operazioni aritmetiche:
+
+@example
+$ @kbd{gawk -M -v PREC=100 'BEGIN @{ x = 1.0e-400; print x + 0}
+>   @kbd{PREC = "double"; print x + 0 @}'}
+@print{} 1e-400
+@print{} 0
+@end example
+
+@quotation ATTENZIONE
+Diffidare delle costanti in virgola mobile! Quando si legge una costante in
+virgola mobile dal codice sorgente di un programma, @command{gawk} usa la
+precisione di default (quella del formato @code{double} di C), a meno che non
+venga richiesto, tramite la variabile speciale @code{PREC} fornita
+sulla riga di comando, di memorizzarla internamente come un numero MPFR.
+Cambiare la precisione tramite @code{PREC} nel testo del programma @emph{non}
+cambia la precisione di una costante.
+
+Se si deve rappresentare una costante in virgola mobile con una precisione
+maggiore di quella di default e non @`e possibile usare un assegnamento a
+@code{PREC} da riga di comando, si dovrebbe definire la costante o come
+stringa, o come numero razionale, ove possibile. L'esempio seguente illustra le
+differenze tra i diversi modi di stampare una costante in virgola mobile:
+
+@example
+$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 0.1) @}'}
+@print{} 0.1000000000000000055511151
+$ @kbd{gawk -M -v PREC=113 'BEGIN @{ printf("%0.25f\n", 0.1) @}'}
+@print{} 0.1000000000000000000000000
+$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", "0.1") @}'}
+@print{} 0.1000000000000000000000000
+$ @kbd{gawk -M 'BEGIN @{ PREC = 113; printf("%0.25f\n", 1/10) @}'}
+@print{} 0.1000000000000000000000000
+@end example
+@end quotation
+
+@node Impostare modo di arrotondare
+@subsection Impostare la modalit@`a di arrotondamento
+
+@cindex @code{ROUNDMODE}, variable
+@cindex variabile @code{ROUNDMODE}
+La variabile @code{ROUNDMODE} permette di controllare a livello di programma
+la modalit@`a di arrotondamento.
+La corrispondenza tra @code{ROUNDMODE} e le modalit@`a di arrotondamento IEEE
+@`e mostrata in @ref{table-gawk-rounding-modes}.
+
+@float Tabella,table-gawk-rounding-modes
+@caption{Modalit@`a di arrotondamento in @command{gawk} }
+@multitable @columnfractions .45 .30 .25
+@headitem Modalit@`a di arrotondamento @tab Nome IEEE @tab @code{ROUNDMODE}
+@item Arrotonda al pi@`u vicino, o a un numero pari @tab @code{roundTiesToEven} @tab @code{"N"} o @code{"n"}
+@item Arrotonda verso infinito @tab @code{roundTowardPositive} @tab @code{"U"} o @code{"u"}
+@item Arrotonda verso meno infinito @tab @code{roundTowardNegative} @tab @code{"D"} o @code{"d"}
+@item Arrotonda verso zero (troncamento) @tab @code{roundTowardZero} @tab @code{"Z"} o @code{"z"}
+@item Arrotonda lontano da zero (per eccesso) @tab @tab @code{"A"} o @code{"a"}
+@end multitable
+@end float
+
+@code{ROUNDMODE} ha @code{"N"} come valore di default, ovvero si usa la
+modalit@`a di arrotondamento IEEE 754 @code{roundTiesToEven}.
+In @ref{table-gawk-rounding-modes}, il valore @code{"A"} seleziona
+l'arrotondamento lontano da zero (per eccesso).
+Questo @`e applicabile solo se la versione in uso
+della libreria MPFR lo supporta; altrimenti, l'impostazione di @code{ROUNDMODE}
+ad @code{"A"} non ha alcun effetto.
+
+La modalit@`a di default @code{roundTiesToEven} @`e la pi@`u preferita, ma allo
+stesso tempo
+la meno intuitiva. Questo metodo fa la cosa ovvia per la maggior parte dei
+valori, arrotondandoli per eccesso o per difetto alla cifra pi@`u prossima.
+Per esempio, arrotondando 1.132 alle due cifre decimali si ottiene 1.13,
+e 1.157 viene arrotondato a 1.16.
+
+Tuttavia, se si deve arrotondare un valore posto esattamente a met@`a strada,
+le cose non funzionano come probabilmente si insegna a scuola.
+In questo caso, il numero @`e arrotondato alla cifra @emph{pari} pi@`u prossima.
+Cos@`{@dotless{i}} arrotondando 0.125 alle due cifre si arrotonda per difetto a 0.12,
+ma arrotondando 0.6875 alle tre cifre si arrotonda per eccesso a 0.688.
+Probabilmente ci si @`e gi@`a imbattuti in questa modalit@`a di arrotondamento
+usando @code{printf} per formattare numeri in virgola mobile.
+Per esempio:
+
+@example
+BEGIN @{
+    x = -4.5
+    for (i = 1; i < 10; i++) @{
+        x += 1.0
+        printf("%4.1f => %2.0f\n", x, x)
+    @}
+@}
+@end example
+
+@noindent
+produce il seguente output quando viene eseguito sul sistema
+dell'autore:@footnote{@`E possibile che l'output sia completamente diverso, se la
+libreria C presente nel sistema in uso non si conforma, per @code{printf},
+alla regola IEEE 754
+di arrotondamento al valore pari in caso di equidistanza.}
+
+@example
+-3.5 => -4
+-2.5 => -2
+-1.5 => -2
+-0.5 => 0
+ 0.5 => 0
+ 1.5 => 2
+ 2.5 => 2
+ 3.5 => 4
+ 4.5 => 4
+@end example
+
+La teoria che sta dietro alla regola
+@code{roundTiesToEven} @`e che gli arrotondamenti di
+valori equidistanti in eccesso e in difetto si distribuiscono pi@`u o meno
+uniformemente, con la possibile conseguenza che errori di arrotondamento
+ripetuti tendono ad annullarsi a vicenda.  Questa @`e la modalit@`a di
+arrotondamento di default per funzioni e operatori di calcolo secondo IEEE 754.
+@c January 2018. Thanks to nethox@gmail.com for the example.
+@sidebar Modalit@`a di arrotondamento e conversioni
+@`E importante comprendere che, insieme a @code{CONVFMT} e
+@code{OFMT}, la modalit@`a di arrotondamento ha effetto anche sul
+modo con cui i numeri sono convertiti in stringhe di caratteri.
+Per esempio,si consideri il seguente programma:
+
+@example
+BEGIN @{
+    pi = 3.1416
+    OFMT = "%.f"        # Stampa il valore come numero intero
+    print pi            # ROUNDMODE = "N" per default.
+    ROUNDMODE = "U"     # Ora si cambia ROUNDMODE
+    print pi
+@}
+@end example
+
+@noindent
+L'esecuzione di questo programma produce il seguente output:
+
+@example
+$ @kbd{gawk -M -f roundmode.awk}
+@print{} 3
+@print{} 4
+@end example
+@end sidebar
+
+Le altre modalit@`a di arrotondamento sono usate raramente.  Gli arrotondamenti
+verso l'infinito (@code{roundTowardPositive}) e verso il meno infinito
+(@code{roundTowardNegative}) vengono spesso usati per eseguire calcoli su
+intervalli, dove si adotta questa modalit@`a di arrotondamento per calcolare
+i limiti superiore e inferiore per l'intervallo di valori in uscita.
+La modalit@`a
+@code{roundTowardZero} pu@`o essere usata per convertire numeri in virgola mobile
+in numeri interi.  Quando si arrotonda lontano da zero (per eccesso), viene
+scelto il numero pi@`u vicino di grandezza maggiore o uguale al valore.
+
+Qualche esperto di analisi numerica dir@`a che la scelta dello stile di
+arrotondamento ha un grandissimo impatto sul risultato finale, e consiglier@`a
+di attendere sino al risultato finale dopo ogni arrotondamento. Invece,
+spesso si possono evitare problemi legati a errori di arrotondamento
+impostando all'inizio la precisione a un valore sufficientemente maggiore
+della precisione desiderata, in modo che il cumulo degli errori di
+arrotondamento non influisca sul
+risultato finale. Se si ha il dubbio che i risultati del calcolo contengano
+un'accumulazione di errori di arrotondamento, occorre, per accertare la cosa,
+controllare se si verifica una differenza significativa nell'output
+cambiando la modalit@`a di arrotondamento.
+
+@node Interi a precisione arbitraria
+@section Aritmetica dei numeri interi a precisione arbitraria con @command{gawk}
+@cindex numeri interi a precisione arbitraria
+@cindex interi a precisione arbitraria
+@cindex precisione arbitraria, interi a
+
+Quando viene specificata l'opzione @option{-M},
+@command{gawk} esegue tutti i calcoli sui numeri interi usando gli interi a
+precisione arbitraria della libreria GMP.  Qualsiasi numero che appaia come un
+intero in un sorgente o in un @value{DF} @`e memorizzato come intero a precisione
+arbitraria.  La dimensione del numero intero ha come limite solo la memoria
+disponibile.  Per esempio, il seguente programma calcola
+@iftex
+@math{5^{4^{3^{2}}}},
+@end iftex
+@ifinfo
+5^4^3^2,
+@end ifinfo
+@ifnottex
+@ifnotinfo
+5@sup{4@sup{3@sup{2}}},
+@end ifnotinfo
+@end ifnottex
+il cui risultato @`e oltre i limiti degli ordinari valori in virgola mobile a
+doppia precisione dei processori:
+
+@example
+$ @kbd{gawk -M 'BEGIN @{}
+>   @kbd{x = 5^4^3^2}
+>   @kbd{print "numero di cifre =", length(x)}
+>   @kbd{print substr(x, 1, 20), "...", substr(x, length(x) - 19, 20)}
+> @kbd{@}'}
+@print{} numero di cifre = 183231
+@print{} 62060698786608744707 ... 92256259918212890625
+@end example
+
+Se invece si dovesse calcolare lo stesso valore usando valori in virgola mobile
+con precisione arbitraria, la precisione necessaria per il risultato corretto
+(usando
+la formula
+@iftex
+@math{prec = 3.322 @cdot dps})
+sarebbe @math{3.322 @cdot 183231},
+@end iftex
+@ifnottex
+@ifnotdocbook
+@samp{prec = 3.322 * dps})
+sarebbe 3.322 x 183231,
+@end ifnotdocbook
+@end ifnottex
+@docbook
+<emphasis>prec</emphasis> = 3.322 &sdot; <emphasis>dps</emphasis>)
+would be
+<emphasis>prec</emphasis> = 3.322 &sdot; 183231,
+@end docbook
+o 608693.
+
+Il risultato di un'operazione aritmetica tra un intero e un valore in virgola
+mobile @`e un valore in virgola mobile con precisione uguale alla precisione di
+lavoro.  Il seguente programma calcola l'ottavo termine nella successione di
+Sylvester@footnote{Weisstein, Eric W.
+@cite{Sylvester's Sequence}. From MathWorld---A Wolfram Web Resource
+@w{(@url{http://mathworld.wolfram.com/SylvestersSequence.html}).}}
+usando una ricorrenza:
+
+@example
+$ @kbd{gawk -M 'BEGIN @{}
+>   @kbd{s = 2.0}
+>   @kbd{for (i = 1; i <= 7; i++)}
+>       @kbd{s = s * (s - 1) + 1}
+>   @kbd{print s}
+> @kbd{@}'}
+@print{} 113423713055421845118910464
+@end example
+
+Il risultato mostrato differisce dal numero effettivo,
+113.423.713.055.421.844.361.000.443,
+perch@'e la precisione di default di 53 bit non @`e suffciente per rappresentare
+esattamente il risultato in virgola mobile. Si pu@`o o aumentare la precisione
+(in questo caso bastano 100 bit), o sostituire la costante in virgola mobile
+@samp{2.0} con un intero, per eseguire tutti i calcoli usando l'aritmetica con
+gli interi per ottenere l'output corretto.
+
+A volte @command{gawk} deve convertire implicitamente un intero con precisione
+arbitraria in un valore in virgola mobile con precisione arbitraria.
+Ci@`o si rende necessario
+principalmente perch@'e la libreria MPFR non sempre prevede l'interfaccia
+necessaria per elaborare interi a precisione arbitraria o numeri di tipo
+eterogeneo come richiesto da un'operazione o funzione.  In tal caso, la
+precisione viene impostata al minimo valore necessario per una conversione
+esatta, e non viene usata la precisione di lavoro.  Se
+questo non @`e quello di cui si ha bisogno o che si vuole, si pu@`o ricorrere a un
+sotterfugio e convertire preventivamente l'intero in un valore in virgola
+mobile, come qui di seguito:
+
+@example
+gawk -M 'BEGIN @{ n = 13; print (n + 0.0) % 2.0 @}'
+@end example
+
+Si pu@`o evitare completamente questo passaggio specificando il numero come
+valore in virgola mobile fin dall'inizio:
+
+@example
+gawk -M 'BEGIN @{ n = 13.0; print n % 2.0 @}'
+@end example
+
+Si noti che, per questo specifico esempio, probabilmente @`e meglio
+semplicemente specificare:
+
+@example
+gawk -M 'BEGIN @{ n = 13; print n % 2 @}'
+@end example
+
+Dividendo due interi a precisione arbitraria con @samp{/} o con @samp{%}, il
+risultato @`e tipicamente un valore in virgola mobile con precisione arbitraria
+(a meno che il risultato non sia un numero intero esatto).
+@ifset INTDIV
+Per eseguire divisioni intere o calcolare moduli con interi a precisione
+arbitraria, usare la funzione predefinita
+@code{intdiv0()} (@pxref{Funzioni numeriche}).
+
+Si pu@`o simulare la funzione @code{intdiv0()} in @command{awk} standard
+usando questa funzione definita dall'utente:
+
+@example
+@c file eg/lib/intdiv0.awk
+# intdiv0 --- fa una divisione intera
+
+@c endfile
+@ignore
+@c file eg/lib/intdiv0.awk
+#
+# Arnold Robbins, arnold@@skeeve.com, Public Domain
+# July, 2014
+#
+# Name changed from div() to intdiv()
+# April, 2015
+#
+# Changed to intdiv0()
+# April, 2016
+
+@c endfile
+
+@end ignore
+@c file eg/lib/intdiv0.awk
+function intdiv0(numerator, denominator, result)
+@{
+    split("", result)
+
+    numerator = int(numerator)
+    denominator = int(denominator)
+    result["quotient"] = int(numerator / denominator)
+    result["remainder"] = int(numerator % denominator)
+
+    return 0.0
+@}
+@c endfile
+@end example
+
+Il seguente programma d'esempio, proposto da Katie Wasserman,
+usa @code{intdiv0()} per
+calcolare le cifre di @value{PI} al numero di cifre significative
+che si @`e scelto di impostare:
+
+@example
+@c file eg/prog/pi.awk
+@group
+# pi.awk --- calcola le cifre di pi
+@c endfile
+@c endfile
+@ignore
+@c file eg/prog/pi.awk
+#
+# Katie Wasserman, katie@@wass.net
+# August 2014
+@c endfile
+@end ignore
+@c file eg/prog/pi.awk
+
+BEGIN @{
+    cifre = 100000
+    due = 2 * 10 ^ cifre
+@end group
+    pi = due
+    for (m = cifre * 4; m > 0; --m) @{
+        d = m * 2 + 1
+        x = pi * m
+        intdiv0(x, d, risultato)
+        pi = risultato["quotient"]
+        pi = pi + due
+    @}
+    print pi
+@}
+@c endfile
+@end example
+
+@ignore
+Date: Wed, 20 Aug 2014 10:19:11 -0400
+To: arnold@skeeve.com
+From: Katherine Wasserman <katie@wass.net>
+Subject: Re: computation of digits of pi?
+
+Arnold,
+
+>The program that you sent to compute the digits of pi using div(). Is
+>that some standard algorithm that every math student knows? If so,
+>what's it called?
+
+It's not that well known but it's not that obscure either
+
+It's Euler's modification to Newton's method for calculating pi.
+
+Take a look at lines (23) - (25)  here: http://mathworld.wolfram.com/PiFormulas.htm
+
+The algorithm I wrote simply expands the multiply by 2 and works from
+the innermost expression outwards.  I used this to program HP calculators
+because it's quite easy to modify for tiny memory devices with smallish
+word sizes.
+
+http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899
+@end quotation
+
+-Katie
+@end ignore
+
+Quando gli fu chiesto dell'algoritmo usato, Katie rispose:
+
+@quotation
+Non @`e quello pi@`u noto ma nemmeno quello pi@`u incomprensibile.
+@`E la variante di Eulero al metodo di Newton  per il calcolo del Pi greco.
+Si vedano le righe (23) - (25) nel sito:
+@uref{http://mathworld.wolfram.com/PiFormulas.html}.
+
+L'algoritmo che ho scritto semplicemente espande il moltiplicare per 2 e
+lavora dall'espressione pi@`u interna verso l'esterno.  Ho usato questo per
+programmare delle calcolatrici HP perch@'e @`e piuttosto facile da adattare ai
+dispositivi di scarsa memoria con dimensioni di parola piuttosto piccole.
+Si veda
+@uref{http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899}.
+@end quotation
+@end ifset
+
+@node Controllare disponibilit@`a MPFR
+@section Come controllare se MPFR @`e disponibile
+
+@cindex MPFR, controllare se disponibile
+@cindex controllare disponibilit@`a MPFR
+Occasionalmente, potrebbe essere utile controllare se @command{gawk} sia stato
+chiamato specificando l'opzione @option{-M}, che consente di effettuare
+calcoli aritmetici di precisione arbitraria.
+Lo si pu@`o fare con la funzione seguente, messa a disposizione da
+Andrew Schorr:
+
+@example
+@c file eg/lib/have_mpfr.awk
+# precisione_matematica_sufficiente
+# --- restituisce "true" [vero]
+# se il numero di bit "n" di precisione richiesto
+# @`e disponibile per il programma
+@c endfile
+@ignore
+@c file eg/lib/have_mpfr.awk
+#
+# Andrew Schorr, aschorr@@telemetry-investments.com, Public Domain
+# May 2017
+@c endfile
+@end ignore
+@c file eg/lib/have_mpfr.awk
+
+function adequate_math_precision(n)
+@{
+    return (1 != (1+(1/(2^(n-1)))))
+@}
+@c endfile
+@end example
+
+Ecco un frammento di codice che invoca la funzione per controllare
+se l'aritmetica a precisione arbitraria @`e disponibile:
+
+@example
+BEGIN @{
+    # Quanti bit di precisione nella mantissa sono necessari
+    # perch@'e questo programma funzioni correttamente?
+    fpbits = 123
+
+    # Si spera che il programma sia stato invocato con MPFR abilitata.
+    # Se @`e questo il caso, le istruzioni seguenti dovrebbero configurare
+    # i calcoli al livello di precisione desiderato.
+    PREC = fpbits
+
+    if (! adequate_math_precision(fpbits)) @{
+        print("Errore: la precisione di calcolo disponibile non basta.\n" \
+              "Provare ancora specificando l'argomento -M?") > "/dev/stderr"
+        # Nota: pu@`o essere necessario impostare un flag a questo punto
+	#       per evitare di eseguire delle eventuali regole END
+        exit 1
+    @}
+@}
+@end example
+
+Occorre tener presente che @code{exit} eseguir@`a le regole @code{END},
+eventualmente contenute nel programma (@pxref{Istruzione exit}).
+
+@node Problemi virgola mobile POSIX
+@section Confronto tra standard e uso corrente
+
+Per diverso tempo, @command{awk} ha convertito le stringhe  dall'aspetto non
+numerico nel valore numerico zero, quando richiesto.  Per di pi@`u, la
+definizione originaria del linguaggio e lo standard POSIX originale prevedevano
+che @command{awk} riconoscesse solo i numeri decimali (base 10), e non i numeri
+ottali (base 8) o esadecimali (base 16).
+
+Le modifiche nel linguaggio degli standard POSIX 2001 e 2004 possono essere
+interpretate nel senso che @command{awk} debba fornire delle funzionalit@`a
+aggiuntive.  Queste sono:
+
+@itemize @value{BULLET}
+@item
+Interpretazione del valore dei dati in virgola mobile specificati in notazione
+esadecimale (p.es., @code{0xDEADBEEF}). (Da notare: valore dei dati letti,
+@emph{non} costanti facenti parte del codice sorgente.)
+
+@item
+Supporto per i valori in virgola mobile speciali IEEE 754 ``not a number''
+(NaN), pi@`u infinito (``inf'') e meno infinito (``@minus{}inf'').
+In particolare, il formato per questi valori @`e quello specificato dallo
+standard C ISO 1999, che non distingue maiuscole/minuscole e pu@`o consentire
+caratteri aggiuntivi dipendenti dall'implementazione dopo il @samp{nan}, e
+consentire o @samp{inf} o @samp{infinity}.
+@end itemize
+
+Il primo problema @`e che entrambe le modifiche sono deviazioni evidenti
+dalla prassi consolidata:
+
+@itemize @value{BULLET}
+@item
+Il manutentore di @command{gawk} crede che supportare i valori in virgola mobile
+esadecimali, nello specifico, sia sbagliato, e che non sia mai stata intenzione
+dell'autore originale di introdurlo nel linguaggio.
+
+@item
+Consentire che stringhe completamente alfabetiche abbiano valori numerici
+validi @`e anch'essa una deviazione molto marcata dalla prassi consolidata.
+@end itemize
+
+Il secondo problema @`e che il manutentore di @command{gawk} crede che questa
+interpretazione dello standard, che richiede una certa dimestichezza col
+linguaggio giuridico per essere compresa, non sempre @`e stata
+colta dai normali sviluppatori.  In altre parole, ``Sappiamo come siete
+arrivati sin qui, ma non pensiamo che questo sia il posto dove volete essere.''
+
+Recependo queste argomentazioni, e cercando nel contempo di assicurare la
+compatibilit@`a con le versioni precedenti dello standard, lo standard POSIX 2008
+ha aggiunto delle formulazioni esplicite per consentire l'uso da parte di
+@command{awk}, solo a richiesta, dei valori in virgola mobile esadecimali e
+dei valori speciali
+``@dfn{not a number}'' e infinito.
+
+Sebbene il manutentore di @command{gawk} continui a credere che introdurre
+queste funzionalit@`a sia sconsigliabile, ci@`o nonostante, sui sistemi che
+supportano i valori in virgola mobile IEEE, sembra giusto fornire
+@emph{qualche}
+possibilit@`a di usare i valori NaN e infinito.  La soluzione implementata
+in @command{gawk} @`e questa:
+
+@itemize @value{BULLET}
+@item
+Se @`e stata specificata l'opzione da riga di comando @option{--posix},
+@command{gawk} non
+interviene. I valori di stringa sono passati direttamente alla funzione
+@code{strtod()} della libreria di sistema, e se quest'ultima restituisce
+senza errori un valore numerico,
+esso viene usato.@footnote{L'avete voluto, tenetevelo.}
+Per definizione, i risultati non sono portabili su diversi sistemi;
+e sono anche piuttosto sorprendenti:
+
+@example
+$ @kbd{echo nanny | gawk --posix '@{ print $1 + 0 @}'}
+@print{} nan
+$ @kbd{echo 0xDeadBeef | gawk --posix '@{ print $1 + 0 @}'}
+@print{} 3735928559
+@end example
+
+@item
+Senza l'opzione @option{--posix}, @command{gawk} interpreta i quattro valori di stringa
+@samp{+inf},
+@samp{-inf},
+@samp{+nan}
+e
+@samp{-nan}
+in modo speciale, producendo i corrispondenti valori numerici speciali.
+Il segno iniziale serve per segnalare a @command{gawk} (e all'utente)
+che il valore @`e realmente numerico.  I numeri in virgola mobile esadecimali
+non sono consentiti (a meno di non usare anche @option{--non-decimal-data},
+che @emph{non} @`e consigliabile). Per esempio:
+
+@example
+$ @kbd{echo nanny | gawk '@{ print $1 + 0 @}'}
+@print{} 0
+$ @kbd{echo +nan | gawk '@{ print $1 + 0 @}'}
+@print{} +nan
+$ @kbd{echo 0xDeadBeef | gawk '@{ print $1 + 0 @}'}
+@print{} 0
+@end example
+
+@command{gawk} ignora la distinzione maiuscole/minuscole nei quattro valori
+speciali. Cos@`{@dotless{i}}, @samp{+nan} e @samp{+NaN} sono la stessa cosa.
+@end itemize
+
+Oltre a gestire l'input, @command{gawk} deve anche stampare valori
+``corretti'' in output, quando un valore sia NaN o infinito.
+A partire dalla @value{PVERSION} 4.2.2, per tali valori
+@command{gawk} stampa una delle quattro stringhe sopra descritte:
+@samp{+inf}, @samp{-inf}, @samp{+nan}, or @samp{-nan}.
+Analogamente,se usato in modalit@`a POSIX, @command{gawk} stampa il risultato
+della funzione C di sistema @code{printf()} usando la stringa di formato
+@code{%g} per il valore, quale che esso sia.
+
+@node Sommario virgola mobile
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+La maggior parte dell'aritmetica al calcolatore @`e fatta usando numeri interi
+oppure
+valori in virgola mobile.  L'@command{awk} standard usa valori in virgola mobile
+a doppia precisione.
+
+@item
+Nei primi anni '90 Barbie disse erroneamente, ``L'ora di matematica @`e
+ostica!''  Sebbene la matematica non sia ostica, l'aritmetica in virgola
+mobile non @`e proprio come la
+matematica ``carta e penna'', e bisogna prestare attenzione:
+
+@c nested list
+@itemize @value{MINUS}
+@item
+Non tutti i numeri possono essere rappresentati in modo esatto.
+
+@item
+Per confrontare dei valori bisognerebbe usare un delta, invece di farlo
+direttamente con @samp{==} e @samp{!=}.
+
+@item
+Gli errori si accumulano.
+
+@item
+Le operazioni non sempre sono esattamente associative o distributive.
+@end itemize
+
+@item
+Aumentare l'accuratezza pu@`o essere d'aiuto, ma non @`e una panacea.
+
+@item
+Spesso, aumentare la precisione e poi arrotondare al numero di cifre
+desiderato produce risultati soddisfacenti.
+
+@item
+Specificare l'opzione @option{-M} (o @option{--bignum}) per abilitare
+il calcolo MPFR.
+Usare @code{PREC} per impostare la precisione in bit, e
+@code{ROUNDMODE} per impostare la modalit@`a di arrotondamento tra quelle
+previste nello standard IEEE 754.
+
+@item
+Specificando l'opzione @option{-M}, @command{gawk} esegue calcoli su interi a precisione
+arbitraria usando la libreria GMP. In tal modo si ha una maggiore velocit@`a e
+una pi@`u efficiente allocazione dello spazio rispetto all'uso di MPFR per
+eseguire gli stessi calcoli.
+
+@item
+Ci sono diverse aree per quanto attiene ai numeri in virgola mobile in cui
+@command{gawk} @`e in disaccordo con lo standard POSIX.
+@`E importante averlo ben presente.
+
+@item
+In generale, non vi @`e alcun bisogno di essere eccessivamente diffidenti verso i
+risultati del calcolo in virgola mobile. La lezione da ricordare @`e che
+il calcolo in virgola mobile @`e sempre pi@`u complesso di quello che si fa con
+carta e penna.  Per trarre vantaggio dalla potenza del calcolo in virgola
+mobile, bisogna conoscere i suoi limiti e stare all'interno di essi.
+Per la maggior parte degli usi occasionali del calcolo in virgola mobile, si
+possono ottenere i risultati attesi semplicemente arrotondando la
+visualizzazione dei risultati finali al giusto numero di cifre decimali
+significative.
+
+@item
+Come consiglio generale, evitare di rappresentare dati numerici in maniera
+tale da far sembrare che la precisione sia maggiore di quella effettivamente
+necessaria.
+
+@end itemize
+
+@node Estensioni dinamiche
+@chapter Scrivere estensioni per @command{gawk}
+@cindex estensioni caricate dinamicamente
+@cindex dinamiche, estensioni
+
+@`E possibile aggiungere nuove funzioni, scritte in C o C++, a @command{gawk}
+usando librerie caricate dinamicamente.  Questa funzionalit@`a @`e disponibile
+su sistemi che supportano le funzioni C @code{dlopen()} e @code{dlsym()}.
+Questo @value{CHAPTER} descrive come creare estensioni usando codice scritto
+in C o C++.
+
+Chi @`e completamente digiuno di programmazione in C pu@`o tranquillamente
+saltare questo @value{CHAPTER}, ma potrebbe valer la pena di dare un'occhiata
+alla documentazione sulle estensioni che sono installate insieme a
+@command{gawk} (@pxref{Esempi di estensione}),
+e alle informazioni sul progetto @code{gawkextlib} (@pxref{gawkextlib}).
+Gli esempi di estensione sono automaticamente compilati e installati quando
+si installa @command{gawk}.
+
+@quotation NOTA
+Se si specifica l'opzione @option{--sandbox}, le estensioni non sono
+disponibili
+(@pxref{Opzioni}).
+@end quotation
+
+@menu
+* Introduzione alle estensioni:: Cos'@`e un'estensione.
+* Licenza delle estensioni::    Una nota riguardo al tipo di licenza.
+* Panoramica sul meccanismo delle estensioni:: Una panoramica sul meccanismo
+                                        delle estensioni.
+* Descrizione dell'estensione API:: Una descrizione completa dell'API.
+* Trovare le estensioni::       Come @command{gawk} trova le estensioni
+				compilate.
+* Esempio di estensione::       Esempio di codice C di un'estensione.
+* Esempi di estensione::        Le estensioni di esempio incluse con
+                                @command{gawk}.
+* gawkextlib::                  Il progetto @code{gawkextlib}.
+* Sommario delle estensioni::   Sommario delle estensioni.
+* Esercizi sulle estensioni::   Esercizi.
+@end menu
+
+@node Introduzione alle estensioni
+@section Cos'@`e un'estensione
+
+@cindex plug-in
+Un'@dfn{estensione} (talora chiamata @dfn{plug-in}) @`e un frammento di codice
+compilato esternamente che @command{gawk} pu@`o caricare in fase di esecuzione
+per ottenere funzionalit@`a ulteriori, che vanno ad aggiungersi a quelle di
+@command{gawk} descritte nel resto di questo @value{DOCUMENT}.
+
+Le estensioni sono utili perch@'e consentono (ovviamente) di estendere le
+funzionalit@`a di @command{gawk}.  Per esempio, possono permettere l'uso di
+@dfn{chiamate di sistema} (come @code{chdir()} per cambiare directory)
+e di altre routine di libreria C potenzialmente utili.  Come per la maggior
+parte del software, ``il cielo @`e il limite''; se si riesce a immaginare
+qualcosa che si vuol fare e che @`e possibile programmare in C o C++,
+si pu@`o scrivere un'estensione che lo faccia!
+
+Le estensioni sono scritte in C o C++, usando l'API (@dfn{Application
+Programming Interface}) definita per questo scopo dagli sviluppatori di
+@command{gawk}.  Il resto di questo @value{CHAPTER} descrive
+le possibilit@`a offerte dall'API e come usarle,
+e illustra una piccola estensione di esempio.  Inoltre, sono documentati
+gli esempi di estensione inclusi nella distribuzione di @command{gawk}
+e viene descritto il progetto @code{gawkextlib}.
+@ifclear FOR_PRINT
+@xref{Progetto delle estensioni}, per una disamina degli obiettivi e del
+progetto del meccanismo delle estensioni.
+@end ifclear
+@ifset FOR_PRINT
+Si veda @uref{https://www.gnu.org/software/gawk/manual/html_node/Extension-Design.html}
+per una disamina degli obiettivi e del
+progetto del meccanismo delle estensioni.
+@end ifset
+
+@node Licenza delle estensioni
+@section Tipo di licenza delle estensioni
+
+Ogni estensione dinamica dev'essere distribuita in base a una licenza che sia
+compatibile con la licenza GNU GPL (@pxref{Copia}).
+
+Per far sapere a @command{gawk} che la licenza @`e quella corretta,
+l'estensione deve definire il simbolo globale
+@code{plugin_is_GPL_compatibile}.  Se tale simbolo non @`e stato definito,
+@command{gawk} termina con un messaggio di errore fatale al momento del
+caricamente dell'estensione.
+
+Il tipo dichiarato per il suddetto simbolo dev'essere @code{int}.  Esso non
+deve tuttavia essere presente in ogni sezione allocata.
+Il controllo in essere si limita a constatare che quel simbolo esiste a
+livello globale.
+Qualcosa del genere pu@`o essere sufficiente:
+
+@example
+int plugin_is_GPL_compatible;
+@end example
+
+@node Panoramica sul meccanismo delle estensioni
+@section Una panoramica sul funzionamento ad alto livello
+
+La comunicazione tra
+@command{gawk} e un'estensione @`e bidirezionale.  Dapprima, quando
+un'estensione @`e caricata, @command{gawk} le passa un puntatore a una struttura
+(@code{struct}) i cui campi sono dei puntatori di funzione.
+@ifnotdocbook
+Questo si pu@`o vedere in @ref{figura-carica-estensione}.
+@end ifnotdocbook
+@ifdocbook
+Questo si pu@`o vedere in @inlineraw{docbook, <xref linkend="figura-carica-estensione"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figura,figura-carica-estensione
+@caption{Caricamento dell'estensione}
+@ifclear SMALLPRINT
+@center @image{api-figura1, , , Caricamento dell'estensione}
+@end ifclear
+@ifset SMALLPRINT
+@center @image{api-figura1, 11cm, , Caricamento dell'estensione}
+@end ifset
+
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figura-carica-estensione" float="0">
+<title>Caricamento dell'estensione</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="api-figura1.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+L'estensione @`e in grado di chiamare funzioni all'interno di @command{gawk}
+utilizzando questi puntatori a funzione, in fase di esecuzione, senza aver
+bisogno di accedere (in fase di compilazione), ai simboli di @command{gawk}.
+Uno di questi puntatori a funzione punta a una funzione che serve per
+``registrare'' nuove funzioni.
+@ifnotdocbook
+Questo @`e mostrato in @ref{figura-registrare-una-nuova-funzione}.
+@end ifnotdocbook
+@ifdocbook
+Questo @`e shown in @inlineraw{docbook, <xref linkend="figura-registrare-una-nuova-funzione"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figura,figura-registrare-una-nuova-funzione
+@caption{Registrare una nuova funzione}
+@ifclear SMALLPRINT
+@center @image{api-figura2, , , Registrare una nuova funzione}
+@end ifclear
+@ifset SMALLPRINT
+@center @image{api-figura2, 11cm , , Registrare una nuova funzione}
+@end ifset
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figura-registrare-una-nuova-funzione" float="0">
+<title>Registering a new function</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="api-figura2.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+Nella direzione opposta, l'estensione registra le sue nuove funzioni
+con @command{gawk} passando dei puntatori che puntano alle funzioni che
+implementano la nuova funzionalit@`a, (p.es. @code{do_chdir()}).  @command{gawk}
+associa il puntatore a funzione con un nome ed @`e in grado di chiamarlo in
+seguito, usando una convenzione di chiamata predefinita.
+@ifnotdocbook
+Questo @`e mostrato in @ref{figura-chiamata-nuova-funzione}.
+@end ifnotdocbook
+@ifdocbook
+Questo @`e mostrato in @inlineraw{docbook, <xref linkend="figura-chiamata-nuova-funzione"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figura,figura-chiamata-nuova-funzione
+@caption{Chiamata della nuova funzione}
+@ifclear SMALLPRINT
+@center @image{api-figura3, , , Chiamata della nuova funzione}
+@end ifclear
+@ifset SMALLPRINT
+@center @image{api-figura3,11cm , , Chiamata della nuova funzione}
+@end ifset
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figura-chiamata-nuova-funzione" float="0">
+<title>Chiamata della nuova funzione</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="api-figura3.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+La funzione @code{do_@var{xxx}()}, a sua volta, utilizza i puntatori a
+funzione nella struttura (@code{struct}) API per svolgere il proprio compito,
+come aggiornare variabili o vettori, stampare messaggi, impostare la
+variabile @code{ERRNO}, e cos@`{@dotless{i}} via.
+
+Delle macro di servizio rendono la chiamata effettuata utilizzando
+i puntatori simile a quella delle funzioni normali, in modo che il codice
+sorgente delle estensioni rimanga sufficientemente leggibile e comprensibile.
+
+Sebbene tutto ci@`o possa sembrare piuttosto complesso, il risultato @`e che il
+codice sorgente dell'estensione @`e abbastanza intuitivo da scrivere e da
+leggere.  Lo si pu@`o constatare nell'estensione di esempio
+@file{filefuncs.c}
+(@pxref{Esempio di estensione}), come pure nel codice @file{testext.c},
+che testa l'interfaccia di programmazione (API).
+
+Ecco alcuni ulteriori dettagli:
+
+@itemize @value{BULLET}
+@item
+L'API fornisce accesso ai valori delle variabili @command{gawk}
+@code{do_@var{xxx}}, che memorizzano opzioni della riga di comando come
+@code{do_lint}, @code{do_profiling}, e cos@`{@dotless{i}} via (@pxref{Variabili dell'estensione API}).
+Questi valori sono solo informativi: un'estensione non pu@`o modificarli
+all'interno di @command{gawk}.  Oltre a ci@`o, il tentativo di assegnare loro
+dei valori produce un errore quando l'estensione viene compilata.
+
+@item
+L'API fornisce anche i numeri che identificano la specifica versione di
+@command{gawk}, in modo che un'estensione possa controllare se il
+comando @command{gawk} che l'ha caricata @`e in grado di supportare le
+funzionalit@`a utilizzate nell'estensione.  (Discrepanze tra le versioni
+``non dovrebbero'' accadere, ma si sa come vanno @emph{queste} cose.)
+@xref{Versione dell'estensione} per ulteriori dettagli.
+@end itemize
+
+@node Descrizione dell'estensione API
+@section Una descrizione completa dell'API
+@cindex estensione, API
+@cindex API, estensione
+
+Il codice sorgente scritto in C o C++ per un'estensione deve includere il
+file di intestazione
+@file{gawkapi.h}, che dichiara le funzioni e definisce i tipi di dati
+usati per comunicare con @command{gawk}.
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+(non breve) @value{SECTION} descrive l'API in detttaglio.
+
+@menu
+* Intro funzioni estensione API::   Introduzione alle funzioni dell'API.
+* Tipi di dati generali::                 I tipi di dati.
+* Funzioni di allocazione memoria::       Funzioni per allocare memoria.
+* Funzioni di costruzione::               Funzioni per creare valori.
+* Funzioni di registrazione::             Funzioni per registrare cose con
+                                          @command{gawk}.
+* Stampare messaggi::                     Funzioni per stampare messaggi.
+* Aggiornare @code{ERRNO}::               Funzioni per aggiornare @code{ERRNO}.
+* Richiedere valori::                     Come ottenere un valore.
+* Accedere ai parametri::                 Funzioni per accedere ai parametri.
+* Accedere alla tabella simboli::         Funzioni per accedere alle variabili
+                                          globali
+* Manipolazione di vettori::              Funzioni per lavorare coi vettori.
+* Ridirezione API::                       Come accedere alla ridirezioni e
+                                          modificarle.
+* Variabili dell'estensione API::         Variabili fornite dall'API.
+* Codice predefinito di un'estensione API:: Codice predefinito di
+                                           interfaccia API.
+* Modifiche dalla versione API 1::        Modifiche dalla versione 1 dell'API.
+@end menu
+
+@node Intro funzioni estensione API
+@subsection Introduzione alle funzioni dell'API
+
+L'accesso a funzionalit@`a interne a @command{gawk} @`e effettuato
+con una chiamata che usa i puntatori a funzione resi disponibili
+all'estensione.
+
+Puntatori a funzioni API sono previsti per i seguenti tipi di operazioni:
+
+@itemize @value{BULLET}
+@item
+Allocare, riallocare e liberare memoria.
+
+@item
+Registrare funzioni. Si possono registrare:
+
+@c nested list
+@itemize @value{MINUS}
+@item
+Funzioni di estensione
+@item
+Funzioni ausiliarie di pulizia (@dfn{callbacks})
+@item
+Una stringa di caratteri che identifica la versione
+@item
+Funzioni per analizzare l'input
+@item
+Funzioni per modificare l'output
+@item
+Processori bidirezionali
+@end itemize
+
+Tutti questi elementi sono spiegati dettagliatamente nel resto di questo @value{CHAPTER}.
+
+@item
+Stampare messaggi fatali, di avvertimento e quelli generati dall'opzione
+``lint''.
+
+@item
+Modificare @code{ERRNO} o annullarne il valore.
+
+@item
+Accedere a parametri, compresa la possibilit@`a di definire come vettore
+un parametro ancora indefinito.
+
+@item
+Accedere alla "tabella dei simboli": procurarsi il valore di una variabile
+globale, crearne una nuova o modificarne una gi@`a esistente.
+
+@item
+Creare ed eliminare valori nascosti; ci@`o rende possibile usare un
+particolare valore per pi@`u di una variabile, e pu@`o migliorare parecchio
+le prestazioni.
+
+@item
+Manipolare vettori:
+
+@itemize @value{MINUS}
+@item
+Ritrovare il valore di elementi del vettore, aggiungerne di nuovi,
+cancellare e modificare elementi esistenti.
+
+@item
+Ottenere il numero di elementi presenti in un vettore
+
+@item
+Creare un nuovo vettore
+
+@item
+Cancellare un intero vettore
+
+@item
+Appiattire un vettore per poter facilmente eseguire un ciclo, in stile C,
+su tutti i suoi indici ed elementi
+@end itemize
+
+@item
+Accedere a ridirezioni e manipolarle.
+
+@end itemize
+
+Alcune osservazioni riguardo all'uso dell'API:
+
+@itemize @value{BULLET}
+@item
+I seguenti tipi di variabili, macro e/o funzioni sono resi disponibili
+nel file @file{gawkapi.h}.  Perch@'e siano utilizzabili, i rispettivi file di
+intestazione standard indicati devono essere stati specificati @emph{prima}
+di includere @file{gawkapi.h}.
+La lista delle macro e dei relativi file di intestazioni @`e contenuta
+in @ref{tabella-intestazioni-standard-api}.
+
+@float Tabella,tabella-intestazioni-standard-api
+@caption{File di intestazioni standard usati nell'API}
+@multitable {@code{memset()}, @code{memcpy()}} {@code{<sys/types.h>}}
+@headitem Elemento C @tab File d'intestazione
+@item @code{EOF} @tab @code{<stdio.h>}
+@item valori di @code{errno} @tab @code{<errno.h>}
+@item @code{FILE} @tab @code{<stdio.h>}
+@item @code{NULL} @tab @code{<stddef.h>}
+@item @code{memcpy()} @tab @code{<string.h>}
+@item @code{memset()} @tab @code{<string.h>}
+@item @code{size_t} @tab @code{<sys/types.h>}
+@item @code{struct stat} @tab @code{<sys/stat.h>}
+@end multitable
+@end float
+
+Per ragioni di portabilit@`a, specialmente per sistemi
+che non sono interamente aderenti agli standard, occorre assicurarsi di
+includere i file corretti nel modo corretto.  Questa richiesta mira
+a mantenere il file @file{gawkapi.h} ordinato, invece che farlo diventare
+un'accozzaglia di problemi di portabilit@`a, quale si pu@`o vedere in alcune
+parti del codice sorgente di @command{gawk}.
+
+@item
+Se l'estensione usa le funzionalit@`a MPFR, e si desidera ricevere valori
+numerici di precisione arbitraria da @command{gawk} e/o passare ad esso
+tali valori, si deve includere l'intestazione
+@code{<mpfr.h>} prima di includere @code{<gawkapi.h>}.
+
+@item
+Il file @file{gawkapi.h} pu@`o essere incluso pi@`u volte, senza conseguenze
+negative.  Tuttavia sarebbe meglio evitare di farlo, per uno
+stile di programmazione migliore.
+
+@item
+Sebbene l'API usi solo funzionalit@`a ISO C 90, c'@`e un'eccezione; le funzione
+``costruttrici'' usano la parola chiave @code{inline}.  Se il compilatore in
+uso non supporta questa parola chiave,  si dovrebbe specificare sulla
+riga di comando il parametro @samp{-Dinline=''} oppure usare gli strumenti
+Autotools GNU e includere un file
+@file{config.h} nel codice sorgente delle estensioni.
+
+@item
+Tutti i puntatori messi a disposizione da @command{gawk} puntano ad aree
+di memoria gestite da @command{gawk} e dovrebbero essere trattati
+dall'estensione come in sola lettura.  Le aree di memoria che contengono @emph{tutte} le stringhe passate a
+@command{gawk} dall'estensione @emph{devono} provenire da una chiamata a
+@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()},
+e sono gestite da @command{gawk} da quel punto in avanti.
+
+@item
+L'API definisce parecchie semplici strutture @code{struct} che mappano dei valori
+come sono visti da @command{awk}.  Un valore pu@`o essere un numero @code{double}
+(in virgola mobile, in doppia precisione), una stringa o un
+vettore (come @`e il caso per i vettori multidimensionali o nella creazione di
+un nuovo vettore).
+
+I valori di tipo stringa sono costituiti da un puntatore e da una lunghezza,
+poich@'e nella stringa possono essere presenti dei caratteri @sc{nul}
+(zeri binari, che normalmente marcano la fine di una stringa).
+
+@quotation NOTA
+Di proposito, @command{gawk} immagazzina le stringhe usando la codifica
+multibyte correntemente in uso (come definita dalle variabili d'ambiente
+@env{LC_@var{xxx}}) e non usando dei caratteri larghi (ovvero due byte per
+ogni carattere).  Ci@`o riflette il modo con cui @command{gawk} memorizza le
+stringhe internamente, e anche il modo in cui i caratteri sono
+verosimilmente letti dai file in input e scritti nei file in output.
+@end quotation
+
+@quotation NOTA
+I valori di una stringa passati a un'estensione da @command{gawk} hanno
+sempre un carattere @sc{nul} alla fine (come delimitatore).  Quindi @`e
+possibile usare senza inconvenienti tali valori di stringa per chiamare
+funzioni di libreria standard e routine di sistema.  Tuttavia, poich@'e
+@command{gawk} consente che all'interno di una stringa di dati possano
+essere presenti caratteri @sc{nul}, si dovrebbe controllare che la
+lunghezza di ogni stringa passata un'estensione coincida con il valore
+restituito dalla funzione @code{strlen()} per la stringa stessa.
+@end quotation
+
+@item
+Per ottenere un valore (p.es. quello di un parametro o quello di una
+variabile globale, oppure di un elemento di un vettore), l'estensione chiede
+un tipo specifico di variabile (numero, stringa,
+scalare, @dfn{value cookie} [si veda pi@`u avanti], vettore o ``undefined'').
+Quando la richiesta @`e
+``undefined,'' il valore restituito sar@`a quello originale della variabile in
+questione.
+
+In ogni caso, se la richiesta e il tipo effettivo della variabile non
+corrispondono, la funzione di accesso restituisce ``false'' e fornisce il
+tipo proprio della variabile, in modo che l'estensione possa, p.es.,
+stampare un messaggio di errore
+(del tipo ``ricevuto uno scalare, invece del vettore previsto'').
+
+@c This is documented in the header file and needs some expanding upon.
+@c The table there should be presented here
+@end itemize
+
+Si possono chiamare le funzioni dell'API usando i puntatori a funzione
+direttamente, ma l'interfaccia non @`e molto elegante.  Per permettere al
+codice sorgente delle estensioni di assomigliare di pi@`u a un codice normale,
+il file di intestazione @file{gawkapi.h} definisce parecchie
+macro da usare nel codice sorgente dell'estensione.
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} presenta le macro come se si trattasse di funzioni.
+
+@node Tipi di dati generali
+@subsection I tipi di dati di impiego generale
+
+@cindex Robbins, Arnold
+@cindex Ramey, Chet
+@quotation
+@i{Ho un vero rapporto di amore/odio con le @dfn{unioni}.}
+@author Arnold Robbins
+@end quotation
+
+@quotation
+@i{Questo @`e ci@`o che contraddistingue le @dfn{unioni}: il compilatore @`e
+in grado di accomodare le cose in modo da far coesistere amore e odio.}
+@author Chet Ramey
+@end quotation
+
+L'estensione API definisce un certo numero di semplici tipi di dato e
+strutture di uso generale.  Ulteriori strutture di dati, pi@`u specializzate,
+saranno introdotte
+@ifnotinfo
+nelle successive
+@end ifnotinfo
+@ifinfo
+nei successivi
+@end ifinfo
+@value{SECTIONS}, insieme alle funzioni che ne fanno uso.
+
+I tipi di dati e le strutture di uso generale sono le seguenti:
+
+@table @code
+@item typedef void *awk_ext_id_t;
+Un valore di questo tipo @`e trasmesso da @command{gawk} a un'estensione nel
+momento in cui viene caricata.  Tale valore dev'essere restituito
+a @command{gawk} come primo parametro di ogni funzione API.
+
+@item #define awk_const @dots{}
+Questa macro genera delle @samp{costanti} nel momento in cui si compila
+un'estensione, e non genera nulla quando si compila il comando @command{gawk}
+vero e proprio.  Ci@`o rende alcuni
+campi nelle strutture dei dati dell'API non alterabili dal codice sorgente
+dell'estensione, ma consente al comando @command{gawk} di usarle secondo
+necessit@`a.
+
+@item typedef enum awk_bool @{
+@itemx @ @ @ @ awk_false = 0,
+@itemx @ @ @ @ awk_true
+@itemx @} awk_bool_t;
+Un semplice tipo di variabile booleana.
+
+@item typedef struct awk_string @{
+@itemx @ @ @ @ char *str;@ @ @ @ @ /* dati veri e propri */
+@itemx @ @ @ @ size_t len;@ @ @ @ /* lunghezza degli stessi, in caratteri */
+@itemx @} awk_string_t;
+Questo rappresenta una stringa modificabile. @command{gawk} @`e responsabile
+per la gestione della memoria utilizzata, se ha fornito il valore della
+stringa.  Altrimenti, assume il possesso della memoria in questione.
+@emph{Questa memoria dev'essere resa disponibile chiamando una delle funzioni
+@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}!}
+
+Come gi@`a detto, la rappresentazione delle stringhe in memoria usa la codifica
+multibyte corrente.
+
+@item typedef enum @{
+@itemx @ @ @ @ AWK_UNDEFINED,
+@itemx @ @ @ @ AWK_NUMBER,
+@itemx @ @ @ @ AWK_STRING,
+@itemx @ @ @ @ AWK_REGEX,
+@itemx @ @ @ @ AWK_STRNUM,
+@itemx @ @ @ @ AWK_ARRAY,
+@itemx @ @ @ @ AWK_SCALAR,@ @ @ @ @ @ @ @ @ /* accesso opaco a una variabile */
+@itemx @ @ @ @ AWK_VALUE_COOKIE@ @ @ @ /* per aggiornare un valore
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ gi@`a creato */
+@itemx @} awk_valtype_t;
+L'elenco @code{enum} indica di che tipo @`e un certo valore.
+@`E usato nella seguente struttura @code{struct}.
+
+@item typedef struct awk_value @{
+@itemx @ @ @ @ awk_valtype_t   val_type;
+@itemx @ @ @ @ union @{
+@itemx @ @ @ @ @ @ @ @ awk_string_t@ @ @ @ @ @ @ s;
+@itemx @ @ @ @ @ @ @ @ awknum_t@ @ @ @ @ @ @ @ @ @ @ n;
+@itemx @ @ @ @ @ @ @ @ awk_array_t@ @ @ @ @ @ @ @ a;
+@itemx @ @ @ @ @ @ @ @ awk_scalar_t@ @ @ @ @ @ @ scl;
+@itemx @ @ @ @ @ @ @ @ awk_value_cookie_t@ vc;
+@itemx @ @ @ @ @} u;
+@itemx @} awk_value_t;
+Un ``valore di @command{awk}''.
+Il campo @code{val_type} indica che tipo di valore @code{union} contiene,
+e ogni campo @`e del tipo appropriato.
+
+@item #define str_value@ @ @ @ @ @ u.s
+@itemx #define strnum_value@ @ @ str_value
+@itemx #define regex_value@ @ @ @ str_value
+@itemx #define num_value@ @ @ @ @ @ u.n.d
+@itemx #define num_type@ @ @ @ @ @ @ u.n.type
+@itemx #define num_ptr@ @ @ @ @ @ @ @ u.n.ptr
+@itemx #define array_cookie@ @ @ u.a
+@itemx #define scalar_cookie@ @ u.scl
+@itemx #define value_cookie@ @ @ u.vc
+L'uso di queste macro rende pi@`u facile da seguire l'accesso ai campi di
+@code{awk_value_t}.
+
+@item enum AWK_NUMBER_TYPE @{
+@itemx @ @ @ @ AWK_NUMBER_TYPE_DOUBLE,
+@itemx @ @ @ @ AWK_NUMBER_TYPE_MPFR,
+@itemx @ @ @ @ AWK_NUMBER_TYPE_MPZ
+@itemx @};
+La lista @code{enum} @`e usata nella struttura seguente per definire
+il tipo di valore numerico con cui si ha a che fare.  Va dichiarata al
+livello pi@`u alto del file, in modo da poter essere usata sia con il
+linguaggio C++ che con il C.
+
+@item typedef struct awk_number @{
+@itemx @ @ @ @ double d;
+@itemx @ @ @ @ enum AWK_NUMBER_TYPE type;
+@itemx @ @ @ @ void *ptr;
+@itemx @} awk_number_t;
+Questo rappresenta un valore numerico.  Internamente, @command{gawk}
+memorizza ogni numero o come una variabile C di tipo @code{double},
+o come un numero intero GMP, o come un numero MPFR in virgola mobile
+di precisione arbitraria.  Per consentire alle estensioni di
+supportare valori numerici GMP ed MPFR, i valori numerici sono
+trasmessi utilizzando questa struttura.
+
+L'elemento in doppia-precisione @code{d} @`e sempre presente nei dati
+ricevuti da @command{gawk}.  Inoltre, esaminando il membro
+@code{type}, un'estensione @`e in grado di determinare se il membro puntato
+da @code{ptr} sia un numero intero GMP (tipo @code{mpz_ptr}), o un numero
+MPFR in virgola mobile (tipo @code{mpfr_ptr_t}), e trasformarlo a seconda
+delle necessit@`a.
+
+@item typedef void *awk_scalar_t;
+La variabili scalari possono essere rappresentate da un tipo opaco.  Questi
+valori sono ottenuti da @command{gawk} e in seguito gli vengono restituiti.
+Questo argomento @`e discusso in maniera generale nel testo che segue questa
+lista, e pi@`u in dettaglio
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Tabella simboli tramite cookie}.
+
+@item typedef void *awk_value_cookie_t;
+Un ``@dfn{value cookie}'' @`e un tipo di variabile opaca, e
+rappresenta un valore nascosto.
+Anche questo argomento @`e discusso in maniera generale nel testo che segue
+questa lista, e pi@`u in dettaglio
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Valori nascosti}.
+
+@end table
+
+I valori di tipo scalare in @command{awk} sono numeri, stringhe, @dfn{strnum}
+o @dfn{regexp} fortemente tipizzate.
+La struttura @code{awk_value_t} rappresenta valori.
+Il campo @code{val_type} indica cosa contiene @code{union}.
+
+Rappresentare numeri @`e facile: l'API usa una variabile C di tipo
+@code{double}.  Le stringhe richiedono
+uno sforzo maggiore.  Poich@'e
+@command{gawk} consente che le stringhe contengano dei byte @sc{nul}
+(a zeri binari) nel valore di una stringa, una stringa dev'essere
+rappresentata da una coppia di campi che contengono il puntatore al dato vero
+e proprio e la lunghezza della stringa.
+@`E questo @`e il tipo @code{awk_string_t}.
+
+Un valore di tipo @dfn{strnum} (stringa numerica) @`e rappresentato come una
+stringa e consiste di dati in input forniti dall'utente che appaiono essere
+numerici.
+Quando una funzione di estensione crea un valore di tipo @dfn{strnum}, il
+risultato @`e una stringa che viene marcata come immessa dall'utente.  La
+successiva analisi da parte di @command{gawk} servir@`a poi a determinare se
+la stringa appare essere un numero, e va quindi trattata come @dfn{strnum},
+invece che come una normale stringa di caratteri.
+
+Ci@`o @`e utile nei casi un cui una funzione di estensione desideri fare qualcosa
+di paragonabile alla funzione @code{split}, la quale imposta l'attributo
+di @dfn{strnum} agli elementi di vettore che crea.
+Per esempio, un'estensione che implementi la divisione di record CSV
+(Comma Separated Values, i cui elementi sono delimitati da virgole)
+potrebbe voler usare questa funzionalit@`a.  Un'altra situazione in cui ci@`o
+@`e utile @`e quello di una funzione che richieda campi-dati ad una banca di
+dati.  La funzione @code{PQgetvalue()} della banca dati PostgreSQ, per
+esempio, restituisce una stringa che pu@`o essere numerica o di tipo carattere,
+a seconda del contesto.
+
+I valori di @dfn{regexp} fortemente tipizzate
+(@pxref{Costanti @dfn{regexp} forti} non sono molto utili nelle funzioni di
+estensione.  Le funzioni di estensione possono stabilire di averli ricevuti,
+e crearne, attribuendo valori di tipo scalare.  In alternativa, @`e possibile
+esaminare il testo della @dfn{regexp} utilizzando campi @code{regex_value.str}
+e @code{regex_value.len}.
+
+Identificativi (cio@`e, nomi di variabili globali) possono essere
+associati sia a valori scalari che a vettori.  Inoltre, @command{gawk}
+consente veri vettori di vettori, in cui ogni singolo elemento di un vettore
+pu@`o a sua volta essere un vettore.  La spiegazione dei vettori @`e rinviata
+@iftex
+alla
+@end iftex
+@ifnottex
+a
+@end ifnottex
+@ref{Manipolazione di vettori}.
+
+La varie macro sopra elencate facilitano l'uso degli elementi delle
+@code{union} come se
+fossero campi in una struttura @code{struct}; @`e questa una pratica
+comunemente adottata
+nella scrittura di programmi in C.  Questo tipo di codice @`e pi@`u semplice da
+scrivere e da leggere, ma resta una responsabilit@`a @emph{del programmatore}
+assicurarsi che il campo @code{val_type} rifletta correttamente il tipo
+del valore contenuto nella struttura @code{awk_value_t}.
+
+Dal punti di vista concettuale, i primi tre campi dell'@code{union} (numero,
+stringa, e vettore) sono sufficienti per lavorare con i valori @command{awk}.
+Tuttavia, poich@'e l'API fornisce routine per ottenere e modificare
+il valore di una variabile scalare globale usando solo il nome della
+variabile, si ha qui una perdita di efficienza: @command{gawk} deve cercare
+la variabile ogni volta che questa @`e utilizzata e modificata.  Questo
+@`e un probelma reale, non solo un problema teorico.
+
+Per questo motivo, se si sa che una certa estensione passer@`a molto tempo
+a leggere e/o modificare il valore di una o pi@`u variabili scalari, si pu@`o
+ottenere uno @dfn{scalar cookie}@footnote{Si veda
+@uref{http://catb.org/jargon/html/C/cookie.html, la voce ``cookie''
+nello Jargon file}
+per una definizione di @dfn{cookie}, e
+@uref{http://catb.org/jargon/html/M/magic-cookie.html, la voce ``magic cookie''
+sempre nello Jargon file} per un bell'esempio.
+@ifclear FOR_PRINT
+Si veda anche la voce ``Cookie'' nel @ref{Glossario}.
+@end ifclear
+[@uref{http://jhanc.altervista.org/jargon/Intro.html, @`E disponibile in rete
+anche una traduzione italiana dello Jargon file}]
+}
+per quella variabile, e poi usare
+il @dfn{cookie} per ottenere il valore della variabile o per modificarne il
+valore.
+Il tipo @code{awk_scalar_t} contiene uno @dfn{scalar cookie}, e la macro
+@code{scalar_cookie} fornisce accesso al valore di quel tipo
+nella struttura @code{awk_value_t}.
+Dato uno @dfn{scalar cookie}, @command{gawk} pu@`o trovare o modificare
+direttamente il valore, come richiesto, senza bisogno di andarlo
+a cercare ogni volta.
+
+Il tipo @code{awk_value_cookie_t} e la macro @code{value_cookie} sono simili.
+Se si pensa di dover usare
+lo stesso @emph{valore} numerico o la stessa @emph{stringa} per una o pi@`u
+variabili, si pu@`o creare il valore una volta per tutte, mettendo da parte un
+@dfn{@dfn{value cookie}} per quel valore, e in seguito specificare quel
+@dfn{value cookie} quando si desidera impostare il valore di una variabile.
+Ci@`o consente di risparmiare spazio in memoria all'interno del processo
+di @command{gawk} e riduce il tempo richiesto per creare il valore.
+
+@node Funzioni di allocazione memoria
+@subsection Funzioni per allocare memoria e macro di servizio
+@cindex allocare memoria per estensioni
+@cindex estensioni, allocare memoria per
+@cindex memoria, allocare per estensioni
+
+L'API fornisce alcune funzioni per effettuare @dfn{allocazioni di memoria}
+che possono essere passate a @command{gawk}, e anche un certo numero di
+macro che possono tornare utili.
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SUBSECTION} le presenta come prototipi di funzione, nel modo
+con cui il codice dell'estensione potrebbe usarle:
+
+@table @code
+@item void *gawk_malloc(size_t size);
+Chiama la versione corretta di @code{malloc()} per allocare memoria,
+che pu@`o in seguito essere messa a disposizione di @command{gawk}.
+
+@item void *gawk_calloc(size_t nmemb, size_t size);
+Chiama la versione corretta di @code{calloc()} per allocare memoria che
+che pu@`o in seguito essere messa a disposizione di @command{gawk}.
+
+@item void *gawk_realloc(void *ptr, size_t size);
+Chiama la versione corretta di @code{realloc()} per allocare memoria
+che pu@`o in seguito essere messa a disposizione di @command{gawk}.
+
+@item void gawk_free(void *ptr);
+Chiama la versione corretta di @code{free()} per liberare memoria che
+era stata allocata con
+@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
+@end table
+
+L'API deve fornire queste funzioni perch@'e @`e possibile
+che un'estensione sia stata compilata e costruita usando una versione
+diversa della libreria C rispetto a quella usata per il programma eseguibile
+@command{gawk}.@footnote{Questo succede pi@`u spesso nei sistemi MS-Windows,
+ma pu@`o capitare anche in sistemi di tipo Unix.}
+Se @command{gawk} usasse la propria versione di @code{free()} per liberare
+della memoria acquisita tramite una differente versione di @code{malloc()},
+il risultato sarebbe molto probabilmente differente da quello atteso.
+
+Tre macro di utilit@`a possono essere usate per allocare memoria
+tramite @code{gawk_malloc()}, @code{gawk_calloc}, e
+@code{gawk_realloc()}.  Se l'allocazione non riesce, @command{gawk}
+termina l'esecuzione con un messaggio di errore fatale.
+Queste macro dovrebbero essere usate come se fossero dei richiami a
+procedure che non restituiscono un codice di ritorno:
+
+@table @code
+@item #define emalloc(pointer, type, size, message) @dots{}
+Gli argomenti per questa macro sono i seguenti:
+
+@c nested table
+@table @code
+@item pointer
+La variabile di tipo puntatore che punter@`a alla memoria allocata.
+
+@item type
+Il tipo della variabile puntatore.  Questo @`e usato per definire il tipo
+quando si chiama @code{gawk_malloc()}.
+
+@item size
+Il numero totale di byte da allocare.
+
+@item message
+Un messaggio da anteporre all'eventuale messaggio di errore fatale.
+Questo @`e solitamente il nome della funzione che sta usando la macro.
+@end table
+
+@noindent
+Per esempio, si potrebbe allocare il valore di una stringa cos@`{@dotless{i}}:
+
+@example
+@group
+awk_value_t risultato;
+char *message;
+const char greet[] = "Non v'allarmate!";
+
+emalloc(message, char *, sizeof(greet), "myfunc");
+strcpy(message, greet);
+make_malloced_string(message, strlen(message), & risultato);
+@end group
+@end example
+
+@sp 2
+@item #define ezalloc(pointer, type, size, message) @dots{}
+Questo @`e simile a @code{emalloc()}, ma chiama @code{gawk_calloc()}
+invece che @code{gawk_malloc()}.
+Gli argomenti sono gli stessi della macro @code{emalloc()}, ma
+questa macro garantisce che la memoria allocata sia inizializzata
+a zeri binari.
+
+@item #define erealloc(pointer, type, size, message) @dots{}
+Questo @`e simile a @code{emalloc()}, ma chiama @code{gawk_realloc()}
+invece che @code{gawk_malloc()}.
+Gli argomenti sono gli stessi della macro @code{emalloc()}.
+@end table
+
+Due ulteriori funzioni allocano oggetti MPFR e GMP per essere usati
+da funzioni di estensione che necessitino di creare e di
+restituire valori di questo tipo:
+
+@table @code
+@item void *get_mpfr_ptr();
+Alloca e inizializza un oggetto MPFR e restituisce un puntatore allo stesso.
+Se l'allocazione non riesce, @command{gawk} termina con un errore fatale
+``out of memory'' (memoria esaurita).  Se @command{gawk} era stato compilato
+senza il supporto MPFR, chiamare questa funzione genera un errore fatale.
+
+@item void *get_mpz_ptr();
+Alloca e inizializza un oggetto GMP e restituisce un puntatore allo stesso.
+Se l'allocazione non riesce, @command{gawk} termina con un errore fatale
+``out of memory'' (memoria esaurita).  Se @command{gawk} era stato compilato
+senza il supporto MPFR, chiamare questa funzione genera un errore fatale.
+@end table
+
+Entrambe queste funzioni restituiscono un codice di ritorno @samp{void *},
+poich@'e il file di intestazione @file{gawkapi.h} non dovrebbe avere dipendenze
+da @code{<mpfr.h>} (e @code{<gmp.h>},
+che @`e incluso da @code{<mpfr.h>}).  I codici di ritorno effettivamente
+restituiti sono di tipo @code{mpfr_ptr} e @code{mpz_ptr} rispettivamente,
+e si dovrebbero assegnare in maniera appropriata questi codici di ritorno
+prima di assegnare i risultati a variabili del tipo corretto.
+
+@node Funzioni di costruzione
+@subsection Funzioni per creare valori
+
+L'API fornisce varie funzioni di @dfn{costruzione} per creare
+valori di tipo stringa e di tipo numerico, e anche varie macro di utilit@`a.
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SUBSECTION} le presenta tutte come prototipi di funzione, nel
+modo in cui il codice sorgente di
+un'estensione le userebbe:
+
+@table @code
+@item static inline awk_value_t *
+@itemx make_const_string(const char *stringa, size_t lunghezza, awk_value_t *risultato);
+Questa funzione mette il valore di una stringa nella variabile
+@code{awk_value_t} puntata da @code{risultato}. La funzione presuppone che
+@code{stringa} sia una costante stringa C
+(o altri dati che formano una stringa), e automaticamente crea una
+@emph{copia} dei dati che sar@`a immagazzinata in @code{risultato}.
+Viene restituito il puntatore @code{risultato}.
+
+@item static inline awk_value_t *
+@itemx make_malloced_string(const char *stringa, size_t lunghezza, awk_value_t *risultato);
+Questa funzione mette il valore di una stringa nella variabile
+@code{awk_value_t} puntata da @code{risultato}. Si presuppone che
+@code{stringa} sia un valore @samp{char *}
+che punta a dati ottenuti in precedenza per mezzo di
+@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
+L'idea @`e che questi dati siano comunicati direttamente a @command{gawk},
+che se ne assume la responsabilit@`a.
+Viene restituito il puntatore @code{risultato}.
+
+@item static inline awk_value_t *
+@itemx make_null_string(awk_value_t *risultato);
+Questa funzione specializzata crea una stringa nulla (il valore ``undefined'')
+nella variabile @code{awk_value_t} puntata da @code{risultato}.
+Viene restituito il puntatore @code{risultato}.
+
+@item static inline awk_value_t *
+@itemx make_number(double num, awk_value_t *risultato);
+Questa funzione crea semplicemente un valore numerico nella variabile
+@code{awk_value_t}, puntata da @code{risultato}.
+
+@item static inline awk_value_t *
+@itemx make_number_mpz(void *mpz, awk_value_t *result);
+Questa funzione crea un valore di numero GMP in @code{result}.
+@code{mpz} deve provenire da una chiamata a @code{get_mpz_ptr()}
+(e quindi essere veramente del corrispondente tipo @code{mpz_ptr}).
+@command{gawk} assume la propriet@`a di questa memoria.
+
+@item static inline awk_value_t *
+@itemx make_number_mpfr(void *mpfr, awk_value_t *result);
+Questa funzione crea un valore di numero MPFR in @code{result}.
+@code{mpz} deve provenire da una chiamata a @code{get_mpfr_ptr()}
+(e quindi essere veramente del corrispondente tipo @code{mpfr_ptr}).
+@command{gawk} assume la propriet@`a di questa memoria.
+
+@item static inline awk_value_t *
+@itemx make_const_user_input(const char *stringa, size_t lunghezza, awk_value_t *risultato);
+Questa funzione @`e identica a @code{make_const_string()}, ma la stringa @`e
+marcata come input dell'utente, che dovr@`a essere trattata come @dfn{strnum}
+se il contenuto della stringa appare essere numerico.
+
+@item static inline awk_value_t *
+@itemx make_malloced_user_input(const char *stringa, size_t lunghezza, awk_value_t *risultato);
+Questa funzione @`e identica a @code{make_malloced_string()}, ma la stringa @`e
+marcata come input dell'utente, che dovr@`a essere trattata come @dfn{strnum}
+se il contenuto della stringa appare essere numerico.
+
+@item static inline awk_value_t *
+@itemx make_const_regex(const char *stringa, size_t lunghezza, awk_value_t *risultato);
+Questa funzione crea un valore di @dfn{regexp} fortemente tipizzata, allocando una
+copia della stringa.
+@code{stringa} @`e l'espressione regolare, di lunghezza @code{lunghezza}.
+
+@item static inline awk_value_t *
+@itemx make_malloced_regex(const char *stringa, size_t lunghezza, awk_value_t *risultato);
+Questa funzione crea un valore di @dfn{regexp} fortemente tipizzata.
+@code{stringa} @`e l'espressione regolare, di lunghezza @code{lunghezza}.
+Si aspetta che @code{stringa} sia un valore di tipo @samp{char *} che punta a
+dati ottenuti in precedenza tramite una chiamata a
+@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
+
+@end table
+
+@node Funzioni di registrazione
+@subsection Funzioni di registrazione
+@cindex registrazione di estensione
+@cindex estensione, registrazione di
+
+Questa @value{SECTION} descrive le funzioni dell'API per
+registrare parti di un'estensione con @command{gawk}.
+
+@menu
+* Funzioni di estensione::      Registrare funzioni di estensione.
+* Funzioni di exit callback::   Registrare una exit di callback.
+* Stringa di versione Estensioni:: Registrare una stringa di versione.
+* Analizzatori di input::       Registrare un analizzatore di input.
+* Processori di output::        Registrare un processore di output.
+* Processori bidirezionali::    Registrare un processore bidirezionale.
+@end menu
+
+@node Funzioni di estensione
+@subsubsection Registrare funzioni di estensione
+
+Le funzioni di estensione sono descritte dal seguente tracciato record:
+
+@example
+@group
+typedef struct awk_ext_func @{
+@ @ @ @ const char *nome;
+@ @ @ @ awk_value_t *(*const function)(int num_actual_args,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato,
+@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
+@ @ @ @ const size_t max_expected_args;
+@ @ @ @ const size_t min_required_args;
+@ @ @ @ awk_bool_t suppress_lint;
+@ @ @ @ void *data;        /* puntatore di tipo opaco
+@ @ @ @                    a ogni informazione ulteriore */
+@} awk_ext_func_t;
+@end group
+@end example
+
+I campi sono:
+
+@table @code
+@item const char *nome;
+Il nome della nuova funzione.
+Il codice sorgente a livello di @command{awk} richiama la funzione usando
+questo nome.
+Il nome @`e una normale stringa di caratteri del linguaggio C.
+
+I nomi di funzione devono rispettare le stesse regole che valgono per gli
+identificativi @command{awk}.
+Cio@`e, devono iniziare o con una lettera dell'alfabeto inglese o con un
+trattino basso, che possono essere seguiti da un numero qualsiasi di
+lettere, cifre o trattini bassi.
+L'uso di maiuscolo/minuscolo @`e significativo.
+
+@item awk_value_t *(*const function)(int num_actual_args,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct awk_ext_func *finfo);
+Questo @`e un puntatore alla funzione C che fornisce la funzionalit@`a per cui
+@`e stata scritta l'estensione.
+La funzione deve riempire l'area di memoria puntata da @code{*risultato} con
+un numero, con una stringa, oppure con una @dfn{regexp}.
+@command{gawk} diventa il proprietario di tutte le stringhe di memoria.
+Come gi@`a detto sopra, la stringa di memoria @emph{deve} essere stata ottenuta
+usando @code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}.
+
+L'argomento @code{num_actual_args} dice alla funzione scritta in C quanti
+parametri sono stati effettivamente passati dal codice chiamante all'interno
+di @command{awk}.
+
+La funzione deve restituire il valore di @code{risultato}.
+Questo @`e per utilit@`a del codice chiamante all'interno di
+@command{gawk}.
+
+@item size_t max_expected_args;
+Questo @`e il massimo numero di argomenti che la funzione si aspetta di
+ricevere.
+Se chiamata con un numero di argomenti maggiore di questo, e se @`e stato
+richiesto il controllo @dfn{lint}, @command{gawk} stampa un messaggio di
+avvertimento.  Per ulteriori informazioni, si veda la descrizione di
+@code{suppress_lint}, pi@`u avanti in questa lista.
+
+@item const size_t min_required_args;
+Questo @`e il minimo numero di argomenti che la funzione si aspetta di
+ricevere.
+Se @`e chiamata con un numero inferiore di argomenti, @command{gawk}
+stampa un messaggio di errore fatale ed esce.
+
+@item awk_bool_t suppress_lint;
+Questo @dfn{flag} dice a @command{gawk} di non stampare un messaggio
+@dfn{lint} se @`e stato richiesto un controllo @dfn{lint} e se sono stati
+forniti pi@`u argomenti di quelli attesi.  Una funzione di estensione pu@`o
+stabilire se @command{gawk} ha gi@`a stampato almeno uno di tali messaggi
+controllando se @samp{num_actual_args > finfo->max_expected_args}.
+In tal caso, se la funzione non desidera la stampa di ulteriori messaggi,
+dovrebbe impostare @code{finfo->suppress_lint} a @code{awk_true}.
+
+@item void *data;
+Questo @`e un puntatore di tipo opaco a tutti quei dati che una funzione
+di estensione desidera avere disponibili al momento della chiamata.
+Passando alla funzione di estensione la struttura @code{awk_ext_func_t}
+e avendo al suo interno questo puntatore disponibile, rende possibile
+scrivere un'unica funzione C o C++ che implementa pi@`u di una funzione
+di estensione a livello @command{awk}.
+@end table
+
+Una volta preparato un record che descrive l'estensione, la funzione di
+estensione va registrata con @command{gawk} usando questa funzione dell'API:
+
+@table @code
+@item awk_bool_t add_ext_func(const char *name_space, awk_ext_func_t *func);
+Questa funzione restituisce il valore @dfn{true} se ha successo,
+oppure @dfn{false} in caso contrario.
+Il parametro @code{name_space} indica lo spazio-dei-nomi in cui porre
+la funzione (@pxref{Spazi-dei-nomi}).
+Si usi una stringa vuota (@code{""}) o @code{"awk"} per porre la funzione
+nello spazio-dei-nomi @code{awk}, che @`e quello di default.
+Il puntatore @code{func} @`e l'indirizzo di una struttura
+@code{struct} che rappresenta la funzione stessa, come descritto sopra.
+
+@command{gawk} non modifica ci@`o che @`e puntato da @code{func}, ma la
+funzione di estensione stessa riceve questo puntatore e pu@`o modificarlo
+e farlo puntare altrove, quindi il puntatore non @`e stato dichiarato
+di tipo costante (@code{const}).
+@end table
+
+La combinazione di @code{min_required_args}, @code{max_expected_args},
+e @code{suppress_lint} pu@`o ingenerare confusione.  Ecco delle linee-guida
+sul da farsi.
+
+@table @asis
+@item Un numero qualsiasi di argomenti @`e valido
+Impostare @code{min_required_args} and @code{max_expected_args} a zero e
+impostare @code{suppress_lint} ad @code{awk_true}.
+
+@item Un numero minimo di argomenti @`e richiesto, ma non c'@`e un limite al numero massimo
+Impostare @code{min_required_args} al minimo richiesto.
+Impostare @code{max_expected_args} a zero e
+impostare @code{suppress_lint} ad @code{awk_true}.
+
+@item Un numero minino di argomenti @`e richiesto, ma c'@`e un limite al numero massimo
+Impostare @code{min_required_args} al minimo richiesto.
+Impostare @code{max_expected_args} al massimo atteso.
+Impostare @code{suppress_lint} ad @code{awk_false}.
+
+@item Un numero minino di argomenti @`e richiesto, ma c'@`e un numero massimo non superabile
+Impostare @code{min_required_args} al minimo richiesto.
+Impostare @code{max_expected_args} al massimo atteso.
+Impostare @code{suppress_lint} ad @code{awk_false}.
+Nella funzione di estensione, controllare che @code{num_actual_args} non
+ecceda @code{f->max_expected_args}.  Se il massimo @`e superato, stampare
+un messaggio di errore fatale.
+@end table
+
+@node Funzioni di exit callback
+@subsubsection Registrare una funzione @dfn{exit callback}
+
+Una funzione @dfn{exit callback} @`e una funzione che @command{gawk} invoca
+prima di completare l'esecuzione del programma.
+Siffatte funzioni sono utili se ci sono dei compiti generali di ``pulizia''
+che dovrebbero essere effettuati nell'estensione (come chiudere connessioni a
+un @dfn{database} o rilasciare altre risorse).
+Si pu@`o registrare una tale
+funzione con @command{gawk} per mezzo della seguente funzione:
+
+@table @code
+@item void awk_atexit(void (*funcp)(void *data, int exit_status),
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ void *arg0);
+I parametri sono:
+
+@c nested table
+@table @code
+@item funcp
+Un puntatore alla funzione da chiamare prima che @command{gawk} completi
+l'esecuzione. Il parametro @code{data}
+sar@`a il valore originale di @code{arg0}.
+Il parametro @code{exit_status} @`e il valore del codice di ritorno che
+@command{gawk} intende passare alla chiamata di sistema @code{exit()}
+(che termina l'esecuzione del programma).
+
+@item arg0
+Un puntatore a un'area dati privata che @command{gawk} mantiene perch@'e
+sia poi passata alla funzione puntata da @code{funcp}.
+@end table
+@end table
+
+Le funzioni @dfn{exit callback} sono chiamate in ordine inverso rispetto
+a quello con cui @`e stata fatta la registrazione con @command{gawk}
+(LIFO: Last In, First Out).
+
+@node Stringa di versione Estensioni
+@subsubsection Registrare una stringa di versione per un'estensione
+
+Si pu@`o registrare una stringa di versione che indica il nome e la versione
+di una data estensione a @command{gawk}, come segue:
+
+@table @code
+@item void register_ext_version(const char *version);
+Registra la stringa puntata da @code{version} con @command{gawk}.
+Si noti che @command{gawk} @emph{non} copia la stringa @code{version}, e
+quindi questa stringa non dovrebbe essere modificata.
+@end table
+
+@command{gawk} stampa tutte le stringhe con le versioni di estensione
+registrate, quando viene invocato specificando l'opzione @option{--version}.
+
+@node Analizzatori di input
+@subsubsection Analizzatori di input personalizzati
+@cindex personalizzato, analizzatore di input
+@cindex analizzatore di input personalizzato
+@cindex input, analizzatore di, personalizzato
+
+Per default, @command{gawk} legge file di testo come input.  Il valore della
+variabile @code{RS} @`e usato per determinare la fine di un record, e subito
+dopo la variabile @code{FS} (o @code{FIELDWIDTHS} o @code{FPAT}) viene usata
+per suddividerlo in campi
+@iftex
+(@pxrefil{Leggere file}).
+@end iftex
+@ifnottex
+(@pxref{Leggere file}).
+@end ifnottex
+Viene inoltre impostato il valore di @code{RT}
+(@pxref{Variabili predefinite}).
+
+Se lo si desidera, @`e possibile fornire un analizzatore di input
+personalizzato.  Il compito di un analizzatore di input @`e di restituire un
+record al codice di @command{gawk}, che poi lo elaborer@`a, accompagnato,
+se necessario, da indicatori del valore e della lunghezza dei dati da usare
+per @code{RT}.
+
+Per fornire un analizzatore personalizzato di input, occorre innanzitutto
+rendere disponibili due funzioni (dove @var{XXX} @`e un nome che fa da prefisso
+all'estensione intera):
+
+@table @code
+@item awk_bool_t @var{XXX}_can_take_file(const awk_input_buf_t *iobuf);
+Questa funzione esamina l'informazione disponibile in @code{iobuf}
+(che vedremo tra poco).  Basandosi su tale informazione,
+decide se l'analizzatore di input personalizzato andr@`a usato per questo file.
+Se questo @`e il caso, dovrebbe restituire @dfn{true}.  Altrimenti, restituir@`a
+@dfn{false}.  Nessuno stato (valori di variabili, etc.) dovrebbe venire
+modificato all'interno di @command{gawk}.
+
+@item awk_bool_t @var{XXX}_take_control_of(awk_input_buf_t *iobuf);
+Quando @command{gawk} decide di passare il controllo del file a questo
+analizzatore di input, richiamer@`a questa funzione.
+Questa funzione a sua volta deve assegnare un valore ad alcuni campi
+nella struttura @code{awk_input_buf_t} e assicurarsi che
+alcune condizioni siano verificate.  Dovrebbe poi restituire @dfn{true}.
+Se si verifica un errore di qualche tipo, i campi in questione non dovrebbero
+venire riempiti, e la funzione dovrebbe restituire @dfn{false}; in questo caso
+@command{gawk} non utilizzer@`a pi@`u l'analizzatore personalizzato di input.
+I dettagli sono descritti pi@`u avanti.
+@end table
+
+L'estensione dovrebbe raccogliere queste funzioni all'interno di una
+struttura @code{awk_input_parser_t}, simile a questa:
+
+@example
+@group
+typedef struct awk_input_parser @{
+    const char *nome;   /* nome dell'analizzatore */
+    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;   /* per uso
+                                                            di gawk */
+@} awk_input_parser_t;
+@end group
+@end example
+
+I campi sono:
+
+@table @code
+@item const char *nome;
+Il nome dell'analizzatore di input.  Questa @`e una normale stringa di caratteri
+del linguaggio C.
+
+@item awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
+Un puntatore alla funzione @code{@var{XXX}_can_take_file()}.
+
+@item awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
+Un puntatore alla funzione @code{@var{XXX}_take_control_of()}.
+
+@item awk_const struct input_parser *awk_const next;
+Questa struttura @`e per uso di  @command{gawk};
+per questo motivo @`e marcata @code{awk_const} in modo che l'estensione non
+possa modificarla.
+@end table
+
+I passi da seguire sono i seguenti:
+
+@enumerate
+@item
+Creare una variabile @code{static awk_input_parser_t} e inizializzarla
+adeguatamente.
+
+@item
+Quando l'estensione @`e caricata, registrare l'analizzatore personalizzato di
+input con @command{gawk} usando la funzione API @code{register_input_parser()}
+(descritta pi@`u sotto).
+@end enumerate
+
+La definizione di una struttura @code{awk_input_buf_t} @`e simile a questa:
+
+@example
+typedef struct awk_input @{
+    const char *nome;       /* nome file */
+    int fd;                 /* descrittore di file */
+#define INVALID_HANDLE (-1)
+    void *opaque;           /* area dati privata
+    			       per l'analizzatore di input */
+    int (*get_record)(char **out, struct awk_input *iobuf,
+                      int *errcode, char **rt_start, size_t *rt_len,
+                      const awk_fieldwidth_info_t **field_width);
+    ssize_t (*read_func)();
+    void (*close_func)(struct awk_input *iobuf);
+    struct stat sbuf;       /* buffer per stat */
+@} awk_input_buf_t;
+@end example
+
+I campi si possono dividere in due categorie: quelli che sono usati (almeno
+inizialmente) da @code{@var{XXX}_can_take_file()}, e quelli che sono usati da
+@code{@var{XXX}_take_control_of()}.  Il primo gruppo di campi, e il loro uso,
+@`e cos@`{@dotless{i}} definito:
+
+@table @code
+@item const char *nome;
+Il nome del file.
+
+@item int fd;
+Un descrittore di file per il file.  Se @command{gawk} riesce ad aprire
+il file, il valore di @code{fd} @emph{non} sar@`a uguale a
+@code{INVALID_HANDLE} [descrittore non valido].  In caso contrario,
+quello sar@`a il valore.
+
+@item struct stat sbuf;
+Se il descrittore di file @`e valido, @command{gawk} avr@`a riempito i campi di
+questa struttura invocando la chiamata di sistema @code{fstat()}.
+@end table
+
+La funzione @code{@var{XXX}_can_take_file()} dovrebbe esaminare i campi di
+cui sopra e decidere se l'analizzatore di input vada usato per il file.
+La decisione pu@`o dipendere da uno stato di @command{gawk} (il valore
+di una variabile definita in precedenza dall'estensione e impostata dal
+codice @command{awk}), dal nome del
+file, dal fatto che il descrittore di file sia valido o no,
+dalle informazioni contenute in @code{struct stat} o da una qualsiasi
+combinazione di questi fattori.
+
+Una volta che @code{@var{XXX}_can_take_file()} restituisce @dfn{true}, e
+@command{gawk} ha deciso di usare l'analizzatore personalizzato, viene
+chiamata la funzione @code{@var{XXX}_take_control_of()}.  Tale funzione
+si occupa di riempire il campo @code{get_record} oppure il campo
+@code{read_func} nella struttura @code{awk_input_buf_t}.  La funzione si
+assicura inoltre che @code{fd} @emph{not} sia impostato al valore
+@code{INVALID_HANDLE}.  L'elenco seguente descrive i campi che
+possono essere riempiti da @code{@var{XXX}_take_control_of()}:
+
+@table @code
+@item void *opaque;
+Questo campo @`e usato per contenere qualiasi informazione di stato sia
+necessaria per l'analizzatore di input
+riguardo a questo file.  Il campo @`e ``opaco'' per @command{gawk}.
+L'analizzatore di input non @`e obbligato a usare questo puntatore.
+
+@item int@ (*get_record)(char@ **out,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ struct@ awk_input *iobuf,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int *errcode,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ char **rt_start,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t *rt_len,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_fieldwidth_info_t **field_width);
+Questo puntatore a funzione dovrebbe puntare a una funzione che crea i record
+in input.  Tale funzione @`e il nucleo centrale dell'analizzatore di input.
+Il suo modo di operare @`e descritto nel testo che segue questo elenco.
+
+@item ssize_t (*read_func)();
+Questo puntatore a funzione dovrebbe puntare a una funzione che ha lo
+stesso comportamento della chiamata di sistema standard POSIX @code{read()}.
+@`E in alternativa al puntatore a @code{get_record}.  Il relativo comportamento
+@`e pure descritto nel testo che segue quest'elenco.
+
+@item void (*close_func)(struct awk_input *iobuf);
+Questo puntatore a funzione dovrebbe puntare a una funzione che fa
+la ``pulizia finale''.  Dovrebbe liberare ogni risorsa allocata da
+@code{@var{XXX}_take_control_of()}.  Pu@`o anche chiudere il file.  Se lo fa,
+dovrebbe impostare il campo @code{fd} a @code{INVALID_HANDLE}.
+
+Se @code{fd} @`e ancora diverso da @code{INVALID_HANDLE} dopo la chiamata a
+questa funzione, @command{gawk} invoca la normale chiamata di sistema
+@code{close()}.
+
+Avere una funzione di ``pulizia'' @`e opzionale.  Se l'analizzatore di input
+non ne ha bisogno, basta non impostare questo campo.  In questo caso,
+@command{gawk} invoca la normale chiamata di sistema @code{close()} per il
+descrittore di file, che, quindi, dovrebbe essere valido.
+@end table
+
+La funzione @code{@var{XXX}_get_record()} svolge il lavoro di creazione dei
+record in input.  I parametri sono i seguenti:
+
+@table @code
+@item char **out
+Questo @`e un puntatore a una variabile @code{char *} che @`e impostatata in modo
+da puntare al record.  @command{gawk} usa una sua copia locale dei dati,
+quindi l'estensione deve gestire la relativa area di memoria.
+
+@item struct awk_input *iobuf
+Questa @`e la struttura @code{awk_input_buf_t} per il file.  I campi dovrebbero
+essere usati per leggere i dati (@code{fd}) e per gestire lo stato privato
+(@code{opaque}), se necessario.
+
+@item int *errcode
+Se si verifica un errore, @code{*errcode} dovrebbe essere impostato a un
+valore appropriato tra quelli contenuti in @code{<errno.h>}.
+
+@item char **rt_start
+@itemx size_t *rt_len
+Se il concetto ``fine record'' @`e applicabile,
+@code{*rt_start} dovrebbe essere impostato per puntare ai dati da usare come
+@code{RT}, e @code{*rt_len} dovrebbe essere impostata alla lunghezza di quel
+campo.  In caso contrario, @code{*rt_len} dovrebbe essere impostata a zero.
+@command{gawk} usa una sua copia di questi dati, quindi l'estensione deve
+gestire tale memoria.
+
+@item const awk_fieldwidth_info_t **field_width
+Se @code{field_width} non @`e @code{NULL}, @code{*field_width} sar@`a
+inizializzato a @code{NULL}, e la funzione pu@`o impostarlo per puntare a una
+struttura che fornisca l'informazione sulla lunghezza del campo, che
+sar@`a utilizzata al posto di quella determinata dall'analizzatore di default
+del campo.  Si noti che questa struttura non sar@`a copiata da @command{gawk};
+inoltre essa deve rimanere disponibile almeno fino alla successiva chiamata a
+@code{get_record} o a @code{close_func}.  Si noti inoltre che
+@code{field_width} vale @code{NULL} quando @code{getline} sta assegnando
+i risultati a una variabile, e quindi un'analisi del campo non @`e necessaria.
+Se l'analizzatore imposta @code{*field_width},
+allora @command{gawk} usa questa descrizione per analizzare il record in
+input, e il valore di @code{PROCINFO["FS"]} sar@`a @code{"API"} finch@'e questo
+record rimane corrente come @code{$0}.
+La struttura dati @code{awk_fieldwidth_info_t} @`e descritta qui di seguito.
+@end table
+
+Il codice di ritorno @`e la lunghezza del buffer puntato da
+@code{*out} oppure @code{EOF}, se @`e stata raggiunta la fine del file o se
+si @`e verificato un errore.
+
+Poich@'e @code{errcode} @`e sicuramente un puntatore valido, non c'@`e
+bisogno di controllare che il valore sia @code{NULL}.  @command{gawk}
+imposta @code{*errcode} a zero, quindi non c'@`e bisogno di impostarlo, a meno
+che non si verifichi un errore.
+
+In presenza di un errore, la funzione dovrebbe restituire @code{EOF} e
+impostare @code{*errcode} a un valore maggiore di zero.  In questo caso, se
+@code{*errcode} non @`e uguale a zero, @command{gawk} automaticamente aggiorna
+la variabile @code{ERRNO} usando il valore contenuto in @code{*errcode}.
+(In generale, impostare @samp{*errcode = errno} dovrebbe essere la
+cosa giusta da fare.)
+
+Invece di fornire una funzione che restituisce un record in input,
+@`e possibile fornirne una che semplicemente legge dei byte, e lascia
+che sia @command{gawk} ad analizzare i dati per farne dei record.  In questo
+caso, i dati dovrebbero essere restituiti nella codifica multibyte propria
+della localizzazione corrente.
+Una siffatta funzione dovrebbe imitare il comportamento della chiamata di
+sistema @code{read()}, e riempire il puntatore @code{read_func} con
+il proprio indirizzo nella struttura @code{awk_input_buf_t}.
+
+Per default, @command{gawk} imposta il puntatore @code{read_func} in modo che
+punti alla chiamata di sistema @code{read()}.  In questo modo l'estensione
+non deve preoccuparsi di impostare esplicitamente questo campo.
+
+@quotation NOTA
+Occorre decidere per l'uno o per l'altro metodo: o una funzione che
+restituisce un record o una che restituisce dei dati grezzi.  Nel dettaglio,
+se si fornisce una funzione che prepara un record, @command{gawk} la
+invocher@`a, e non chiamer@`a mai la funzione che fa una lettura grezza.
+@end quotation
+
+@command{gawk} viene distribuito con un'estensione di esempio che legge
+delle directory, restituendo un record per ogni elemento contenuto nella
+directory (@pxref{Esempio di estensione Readdir}.  Questo codice sorgente pu@`o
+essere usato come modello per scrivere un analizzatore di input
+personalizzato.
+
+Quando si scrive un analizzatore di input, si dovrebbe progettare (e
+documentare) il modo con cui si suppone che interagisca con il codice
+@command{awk}.  Si pu@`o scegliere di utilizzarlo per tutte le letture, e
+intervenire solo quando @`e necessario, (come fa l'estensione di
+esempio @code{readdir}).  Oppure lo si pu@`o utilizzare a seconda del
+valore preso da una variabile @command{awk}, come fa l'estensione XML
+inclusa nel progetto @code{gawkextlib} (@pxref{gawkextlib}).
+In quest'ultimo caso, il codice in una regola @code{BEGINFILE}
+pu@`o controllare @code{FILENAME} ed @code{ERRNO} per decidere se
+attivare un analizzatore di input (@pxref{BEGINFILE/ENDFILE}) oppure no.
+
+Un analizzatore di input va registrato usando la seguente funzione:
+
+@table @code
+@item void register_input_parser(awk_input_parser_t *input_parser);
+Registra l'analizzatore di input puntato da @code{input_parser} con
+@command{gawk}.
+@end table
+
+Se si vuole ignorare il meccanismo di default per l'analisi dei campi
+per un determinato record, si deve riempire una struttura
+@code{awk_fieldwidth_info_t} che ha questo aspetto:
+
+@example
+typedef struct @{
+        awk_bool_t     use_chars; /* falso ==> usare byte */
+        size_t         nf;        /* numero di campi nel record (NF) */
+        struct awk_field_info @{
+                size_t skip;      /* da ignorare prima dell'inizio di un campo */
+                size_t len;       /* lunghezza del campo */
+        @} fields[1];              /* la dimensione effettiva dovrebbe essere nf */
+@} awk_fieldwidth_info_t;
+@end example
+
+I campi sono:
+
+@table @code
+@item awk_bool_t use_chars;
+Impostare ad @code{awk_true} se le lunghezze di campo sono specificate in
+unit@`a di caratteri potenzialmente multi-byte, oppure impostarlo a
+@code{awk_false} se le lunghezze sono espresse in numero di byte.
+L'efficienza del programma sar@`a maggiore utilizzando la dimensione in byte.
+
+@item size_t nf;
+Impostare al numero di campi nel record in input, cio@`e a @code{NF}.
+
+@item struct awk_field_info fields[nf];
+Questo @`e un vettore di lunghezza variabile la cui dimensione effettiva
+dovrebbe essere @code{nf}.
+Per ogni campo, l'elemento @code{skip} dovrebbe essere impostato al numero
+di caratteri o byte, come richiesto dal flag @code{use_chars},
+da saltare prima dell'inizio di questo campo.  L'elemento @code{len} fornisce
+la lunghezza del campo.  I valori in @code{fields[0]} forniscono l'informazione
+per @code{$1}, e cos@`{@dotless{i}} via, fino all'elemento @code{fields[nf-1]} che contiene
+l'informazione per @code{$NF}.
+@end table
+
+Una macro di utilit@`a @code{awk_fieldwidth_info_size(numfields)} @`e disponibile
+per calcolare la dimensione appropriata della struttura a lunghezza variabile
+@code{awk_fieldwidth_info_t} che contiene @code{numfields} campi.  Questa
+dimensione pu@`o essere usata come argomento per @code{malloc()} o in una
+struttura @dfn{union} per allocare spazio staticamente.
+Per un esempio si pu@`o vedere l'estensione di esempio @code{readdir_test}.
+
+@node Processori di output
+@subsubsection Registrare un processore di output
+@cindex personalizzato, processore di output
+@cindex processore di output personalizzato
+@cindex output, processore di, personalizzato
+
+@cindex processore di output
+@cindex output, processore di
+Un @dfn{processore di output} @`e l'immagine riflessa di un
+analizzatore di input.
+Consente a un'estensione di prendere il controllo dell'output
+indirizzato verso un file
+che sia stato aperto con gli operatori di ridirezione di I/O
+@samp{>} o @samp{>>} (@pxref{Ridirezione}).
+
+Il processore di output @`e molto simile, come struttura,
+all'analizzatore di input:
+
+@example
+typedef struct awk_output_wrapper @{
+    const char *nome;   /* nome del processore */
+    awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
+    awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
+    awk_const struct awk_output_wrapper *awk_const next; /* per gawk */
+@} awk_output_wrapper_t;
+@end example
+
+I campi sono i seguenti:
+
+@table @code
+@item const char *nome;
+Questo @`e il nome del processore di output.
+
+@item awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
+Questo @`e il puntatore a una funzione che esamina l'informazione contenuta
+nella struttura @code{awk_output_buf_t} puntata da @code{outbuf}.
+Dovrebbe restituire @dfn{true} se il processore di output vuole elaborare
+il file, e @dfn{false} in caso contrario.
+Nessuno stato (valori di variabili, etc.) dovrebbe essere modificato
+all'interno di @command{gawk}.
+
+@item awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
+La funzione puntata da questo campo viene chiamata quando @command{gawk}
+decide di consentire al processore di output di prendere il controllo del file.
+Dovrebbe riempire in maniera appropriata dei campi nella struttura
+@code{awk_output_buf_t}, come descritto sotto, e restituire @dfn{true} se
+ha successo, @dfn{false} in caso contrario.
+
+@item awk_const struct output_wrapper *awk_const next;
+Questa struttura @`e per uso di @command{gawk};
+per questo motivo @`e marcata @code{awk_const} in modo che l'estensione non
+possa modificarlo.
+@end table
+
+La struttura @code{awk_output_buf_t} @`e simile a questa:
+
+@example
+typedef struct awk_output_buf @{
+    const char *nome;   /* nome del file in output */
+    const char *modo;   /* argomento @dfn{mode} per fopen */
+    FILE *fp;           /* puntatore stdio file */
+    awk_bool_t redirected;  /* @dfn{true} se un processore @`e attivo */
+    void *opaque;       /* per uso del processore di output */
+    size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
+                FILE *fp, void *opaque);
+    int (*gawk_fflush)(FILE *fp, void *opaque);
+    int (*gawk_ferror)(FILE *fp, void *opaque);
+    int (*gawk_fclose)(FILE *fp, void *opaque);
+@} awk_output_buf_t;
+@end example
+
+Anche qui, l'estensione definir@`a le funzioni @code{@var{XXX}_can_take_file()}
+e @code{@var{XXX}_take_control_of()} che esaminano e aggiornano
+campi dati in @code{awk_output_buf_t}.
+I campi dati sono i seguenti:
+
+@table @code
+@item const char *nome;
+Il nome del file in output.
+
+@item const char *modo;
+La stringa @dfn{mode} (come sarebbe usata nel secondo argomento della
+chiamata di sistema @code{fopen()})
+con cui il file era stato aperto.
+
+@item FILE *fp;
+Il puntatore @code{FILE} da @code{<stdio.h>}. @command{gawk} apre il file
+prima di controllare se esiste un processore di output.
+
+@item awk_bool_t redirected;
+Questo campo dev'essere impostato a @dfn{true} dalla funzione
+@code{@var{XXX}_take_control_of()}.
+
+@item void *opaque;
+Questo puntatore @`e opaco per @command{gawk}. L'estensione dovrebbe usarlo
+per contenere un puntatore a qualsiasi dato privato associato al file.
+
+@item size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ FILE *fp, void *opaque);
+@itemx int (*gawk_fflush)(FILE *fp, void *opaque);
+@itemx int (*gawk_ferror)(FILE *fp, void *opaque);
+@itemx int (*gawk_fclose)(FILE *fp, void *opaque);
+Questi puntatori dovrebbero essere impostati per puntare a funzioni
+la cui azione sia equivalente a quella delle funzioni di @code{<stdio.h>},
+se questo @`e cio che si desidera.
+@command{gawk} usa questi puntatori a funzione per @emph{tutti} gli output.
+@command{gawk} inizializza i puntatori per puntare a funzioni interne
+``di passaggio'' che si limitano a chiamare le funzioni normali di
+@code{<stdio.h>}, e quindi un'estensione deve ridefinire solo le funzioni
+appropriate per fare il lavoro richiesto.
+@end table
+
+La funzione @code{@var{XXX}_can_take_file()} dovrebbe decidere in base ai
+campi @code{nome} e @code{modo}, e a ogni altro ulteriore indicatore di stato
+(p.es., valori di variabili @command{awk}) adatto allo scopo.
+
+Quando @command{gawk} chiama @code{@var{XXX}_take_control_of()}, la funzione
+dovrebbe riempire i rimanenti campi
+in modo opportuno, tranne che per @code{fp}, che dovrebbe essere usato
+normalmente.
+
+Il processore di output va registrato usando la seguente funzione:
+
+@table @code
+@item void register_output_wrapper(awk_output_wrapper_t *output_wrapper);
+Registra il processore di output puntato da @code{output_wrapper} con
+@command{gawk}.
+@end table
+
+@node Processori bidirezionali
+@subsubsection Registrare un processore bidirezionale
+@cindex personalizzato, processore bidirezionale
+@cindex processore bidirezionale personalizzato
+@cindex bidirezionale, processore  personalizzato
+
+Un @dfn{processore bidirezionale} combina un analizzatore di input e
+un processore di output per un I/O
+bidirezionale usando l'operatore @samp{|&} (@pxref{Ridirezione}).
+Le strutture @code{awk_input_parser_t} e @code{awk_output_buf_t}
+sono usate nella maniera gi@`a descritta precedentemente.
+
+Un processore bidirezionale @`e rappresentato dalla struttura seguente:
+
+@example
+typedef struct awk_two_way_processor @{
+    const char *nome;   /* nome del processore bidirezionale */
+    awk_bool_t (*can_take_two_way)(const char *nome);
+    awk_bool_t (*take_control_of)(const char *nome,
+                                  awk_input_buf_t *inbuf,
+                                  awk_output_buf_t *outbuf);
+    awk_const struct awk_two_way_processor *awk_const next;  /* per gawk */
+@} awk_two_way_processor_t;
+@end example
+
+I campi sono i seguenti:
+
+@table @code
+@item const char *nome;
+Il nome del processore bidirezionale.
+
+@item awk_bool_t (*can_take_two_way)(const char *nome);
+La funzione puntata da questo campo dovrebbe restituire @dfn{true} se
+vuole gestire l'I/O bidirezionale per questo @value{FN}.
+La funzione non dovrebbe modificare alcuno stato (valori di variabili, etc.)
+all'interno di @command{gawk}.
+
+@item awk_bool_t (*take_control_of)(const char *nome,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_input_buf_t *inbuf,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_output_buf_t *outbuf);
+La funzione puntata da questo campo dovrebbe riempire le strutture
+@code{awk_input_buf_t} e @code{awk_output_buf_t} puntate da @code{inbuf} e
+@code{outbuf}, rispettivamente.  Queste strutture sono gi@`a state descritte
+in precedenza.
+
+@item awk_const struct two_way_processor *awk_const next;
+Questa struttura @`e per uso di @command{gawk};
+per questo motivo @`e marcata @code{awk_const} in modo che l'estensione non
+possa modificarla.
+@end table
+
+Come per l'analizzatore di input e il processore di output, vanno fornite le
+funzione ``s@`{@dotless{i}}, ci penso io'' e ``per questo, fai tu'',
+@code{@var{XXX}_can_take_two_way()} e @code{@var{XXX}_take_control_of()}.
+
+Il processore bidirezionale va registrato usando la seguente funzione:
+
+@table @code
+@item void register_two_way_processor(awk_two_way_processor_t *two_way_processor);
+Registra il processore bidirezionale puntato da @code{two_way_processor} con
+@command{gawk}.
+@end table
+
+@node Stampare messaggi
+@subsection Stampare messaggi dalle estensioni
+@cindex stampare messaggi dalle estensioni
+@cindex messaggi, stampare dalle estensioni
+@cindex estensioni, stampare messaggi dalle
+
+@`E possibile stampare diversi tipi di messaggi di avvertimento da
+un'estensione, come qui spiegato.  Si noti che, per queste funzioni,
+si deve fornire l'ID di estensione ricevuto da @command{gawk}
+al momento in cui l'estensione @`e stata caricata:@footnote{Poich@'e l'API usa solo
+funzionalit@`a previste dal
+compilatore ISO C 90, non @`e possibile usare le macro di tipo variadico
+(che accettano un numero variabile di argomenti) disponibili nel compilatore
+ISO C 99, che nasconderebbero quel parametro. Un vero peccato!}
+
+@table @code
+@item void fatal(awk_ext_id_t id, const char *format, ...);
+Stampa un messaggio e poi @command{gawk} termina immediatamente l'esecuzione.
+
+@item void nonfatal(awk_ext_id_t id, const char *format, ...);
+Stampa un messaggio di errore non-fatale.
+
+@item void warning(awk_ext_id_t id, const char *format, ...);
+Stampa un messaggio di avvertimento.
+
+@item void lintwarn(awk_ext_id_t id, const char *format, ...);
+Stampa un messaggio di avvertimento ``lint''.  Normalmente questo equivale a
+stampare un messaggio di avvertimento, ma se @command{gawk} era stato
+invocato specificando l'opzione @samp{--lint=fatal},
+gli avvertimenti di @dfn{lint} diventano messaggi di errore fatali.
+@end table
+
+Tutte queste funzioni sono per il resto simili alla famiglia di funzioni
+@code{printf()} del linguaggio C, dove il parametro @code{format} @`e una
+stringa contenente dei caratteri normali e delle istruzioni di formattazione,
+mischiati tra loro.
+
+@node Aggiornare @code{ERRNO}
+@subsection Funzioni per aggiornare @code{ERRNO}
+
+Le seguenti funzioni consentono l'aggiornamento della variabile
+@code{ERRNO}:
+
+@table @code
+@item void update_ERRNO_int(int errno_val);
+Imposta @code{ERRNO} alla stringa equivalente del codice di errore
+in @code{errno_val}.  Il valore dovrebbe essere uno dei codici di errore
+definiti in @code{<errno.h>}, e @command{gawk} lo trasforma in una stringa
+(qualora possibile, tradotta) usando la funzione C @code{strerror()}.
+
+@item void update_ERRNO_string(const char *string);
+Imposta @code{ERRNO} direttamente usando il valore della stringa specificata.
+@command{gawk} fa una copia del valore di @code{stringa}.
+
+@item void unset_ERRNO(void);
+Annulla il valore di @code{ERRNO}.
+@end table
+
+@node Richiedere valori
+@subsection Richiedere valori
+
+Tutte le funzioni che restituiscono valori da @command{gawk}
+funzionano allo stesso modo.  Si fornisce un campo @code{awk_valtype_t}
+per indicare il tipo di valore che ci si aspetta.  Se il valore disponibile
+corrisponde a quello richiesto, la funzione restituisce @dfn{true} e riempie
+il campo del risultato @code{awk_value_t}.
+Altrimenti, la funzione restituisce @dfn{false}, e il campo @code{val_type}
+indica il tipo di valore disponibile.
+A quel punto si pu@`o, a seconda di quel che richiede la situazione,
+stampare un messaggio di errore oppure ripetere la
+richiesta specificando il tipo di valore che risulta disponibile.  Questo
+comportamento @`e riassunto nella
+@ref{table-value-types-returned}.
+
+@float Tabella,table-value-types-returned
+@caption{Tipi di valori restituiti dall'API}
+@docbook
+<informaltable>
+<tgroup cols="8">
+  <colspec colname="c1"/>
+  <colspec colname="c2"/>
+  <colspec colname="c3"/>
+  <colspec colname="c4"/>
+  <colspec colname="c5"/>
+  <colspec colname="c6"/>
+  <colspec colname="c7"/>
+  <colspec colname="c8"/>
+  <spanspec spanname="hspan" namest="c3" nameend="c8" align="center"/>
+  <thead>
+    <row><entry></entry><entry spanname="hspan"><para>Tipo di valore reale</para></entry></row>
+    <row>
+      <entry></entry>
+      <entry></entry>
+      <entry><para>Stringa</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>Numero</para></entry>
+      <entry><para>Regexp</para></entry>
+      <entry><para>Vettore</para></entry>
+      <entry><para>Indefinito</para></entry>
+    </row>
+  </thead>
+  <tbody>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Stringa</emphasis></para></entry>
+      <entry><para>Stringa</para></entry>
+      <entry><para>Stringa</para></entry>
+      <entry><para>Stringa</para></entry>
+      <entry><para>Stringa</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Strnum</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Numero</emphasis></para></entry>
+      <entry><para>Numero</para></entry>
+      <entry><para>Numero</para></entry>
+      <entry><para>Numero</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry><para><emphasis role="bold">Tipo</emphasis></para></entry>
+      <entry><para><emphasis role="bold">Regexp</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>Regexp</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry><para><emphasis role="bold">Richiesto</emphasis></para></entry>
+      <entry><para><emphasis role="bold">Vettore</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>Vettore</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Scalare</emphasis></para></entry>
+      <entry><para>Scalare</para></entry>
+      <entry><para>Scalare</para></entry>
+      <entry><para>Scalare</para></entry>
+      <entry><para>Scalare</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">Indefinito</emphasis></para></entry>
+      <entry><para>Stringa</para></entry>
+      <entry><para>Strnum</para></entry>
+      <entry><para>Numero</para></entry>
+      <entry><para>Regexp</para></entry>
+      <entry><para>Vettore</para></entry>
+      <entry><para>Indefinito</para></entry>
+    </row>
+    <row>
+      <entry></entry>
+      <entry><para><emphasis role="bold">@dfn{Value cookie}</emphasis></para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+      <entry><para>false</para></entry>
+    </row>
+  </tbody>
+</tgroup>
+</informaltable>
+@end docbook
+
+@ifnotplaintext
+@ifnotdocbook
+@multitable @columnfractions .50 .50
+@headitem @tab Tipo di valore reale
+@end multitable
+@c 10/2014: Thanks to Karl Berry for this bit to reduce the space:
+@tex
+\vglue-1.1\baselineskip
+@end tex
+@c @multitable @columnfractions .166 .166 .198 .15 .15 .166
+@ifclear SMALLPRINT
+@multitable {Richiesto} {Indefinito} {Numero} {Numero} {Scalar} {Regexp} {Vettore} {Indefinito}
+@headitem @tab @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Vettore @tab Indefinito
+@item @tab @b{Stringa} @tab Stringa @tab Stringa @tab Stringa @tab Stringa @tab false @tab false
+@item @tab @b{Strnum} @tab false @tab Strnum @tab Strnum @tab false @tab false @tab false
+@item @tab @b{Numero} @tab Numero @tab Numero @tab Numero @tab false @tab false @tab false
+@item @b{Tipo} @tab @b{Regexp} @tab false @tab false @tab false @tab Regexp @tab false @tab false
+@item @b{Richiesto} @tab @b{Vettore} @tab false @tab false @tab false @tab false @tab Vettore @tab false
+@item @tab @b{Scalar} @tab Scalar @tab Scalar @tab Scalar @tab Scalar @tab false @tab false
+@item @tab @b{Indefinito} @tab Stringa @tab Strnum @tab Numero @tab Regexp @tab Vettore @tab Indefinito
+@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false
+@end multitable
+@end ifclear
+
+@ifset SMALLPRINT
+@smallformat
+@multitable {Richiesto} {Value cookie} {Num.} {Num.} {Scal.} {Regexp} {Vett.} {Indef.}
+@headitem @tab @tab String @tab Strn. @tab Num. @tab Regexp @tab Vett. @tab Indef.
+@item @tab @b{Stringa} @tab String @tab String @tab String @tab String @tab false @tab false
+@item @tab @b{Strnum} @tab false @tab Strn. @tab Strn. @tab false @tab false @tab false
+@item @tab @b{Numero} @tab Num. @tab Num. @tab Num. @tab false @tab false @tab false
+@item @b{Tipo} @tab @b{Regexp} @tab false @tab false @tab false @tab Regexp @tab false @tab false
+@item @b{Richiesto} @tab @b{Vettore} @tab false @tab false @tab false @tab false @tab Vett. @tab false
+@item @tab @b{Scalar} @tab Scal. @tab Scal. @tab Scal. @tab Scal. @tab false @tab false
+@item @tab @b{Indefinito} @tab String @tab Strn. @tab Num. @tab Regexp @tab Vett. @tab Indef.
+@item @tab @b{Value cookie} @tab false @tab false @tab false @tab false @tab false @tab false
+@end multitable
+@end smallformat
+@end ifset
+@end ifnotdocbook
+@end ifnotplaintext
+@ifplaintext
+@verbatim
+                        +-------------------------------------------------------+
+                        |                   Tipo di valore reale:               |
+                        +--------+--------+--------+--------+-------+-----------+
+                        | Stringa| Strnum | Numero | Regexp |Vettore| Indefinito|
++-----------+-----------+--------+--------+--------+--------+-------+-----------+
+|           | Stringa   | Stringa| Stringa| Stringa| Stringa| false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Strnum    | false  | Strnum | Strnum | false  | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Numero    | Numero | Numero | Numero | false  | false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Regexp    | false  | false  | false  | Regexp | false | false     |
+|   Tipo    +-----------+--------+--------+--------+--------+-------+-----------+
+|Richiesto: | Vettore   | false  | false  | false  | false  |Vettore| false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Scalare   | Scalare| Scalare| Scalare| Scalare| false | false     |
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Indefinito| Stringa| Strnum | Numero | Regexp |Vettore| Indefinito|
+|           +-----------+--------+--------+--------+--------+-------+-----------+
+|           | Value-    | false  | false  | false  | false  | false | false     |
+|           | Cookie    |        |        |        |        |       |           |
++-----------+-----------+--------+--------+--------+--------+-------+-----------+
+@end verbatim
+@end ifplaintext
+@end float
+
+@node Accedere ai parametri
+@subsection Accedere ai parametri e aggiornarli
+
+Due funzioni consentono di accedere agli argomenti (parametri)
+passati all'estensione. Esse sono:
+
+@table @code
+@item awk_bool_t get_argument(size_t count,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
+Riempie la struttura @code{awk_value_t} puntata da @code{risultato}
+con l'argomento numero @code{count}.  Restituisce @dfn{true} se il tipo
+dell'argomento corrisponde
+a quello specificato in @code{wanted}, e @dfn{false} in caso contrario.
+In quest'ultimo caso,
+@code{risultato@w{->}val_type} indica il tipo effettivo dell'argomento
+(@pxref{table-value-types-returned}).  La numerazione degli argomenti parte
+da zero: il primo
+argomento @`e il numero zero, il secondo @`e il numero uno, e cos@`{@dotless{i}} via.
+@code{wanted} indica il tipo di valore atteso.
+
+@item awk_bool_t set_argument(size_t count, awk_array_t array);
+Converte un parametro di tipo indefinito in un vettore; ci@`o permette la
+chiamata per riferimento per i vettori.  Restituisce @dfn{false} se @code{count} @`e troppo elevato,
+o se il tipo di argomento @`e diverso da @dfn{undefined}.
+@xref{Manipolazione di vettori}
+per ulteriori informazioni riguardo alla creazione di vettori.
+@end table
+
+@node Accedere alla tabella simboli
+@subsection Accedere alla Tabella dei simboli
+@cindex accedere alle variabili globali dalle estensioni
+@cindex variabili globali, accesso dalle estensioni
+@cindex estensioni, accesso alle variabili globali
+
+Due insiemi di routine permettono di accedere alle variabili globali,
+e un insieme consente di creare e rilasciare dei valori nascosti.
+
+@menu
+* Tabella simboli per nome::            Accedere alle variabili per nome.
+* Tabella simboli tramite cookie::      Accedere alle variabili per ``cookie''.
+* Valori nascosti::                     Creare e usare valori nascosti.
+@end menu
+
+@node Tabella simboli per nome
+@subsubsection Accedere alle variabili per nome e aggiornarle
+
+Le routine che seguono permettono di raggiungere e aggiornare
+le variabili globali a livello di @command{awk} per nome.  Nel gergo dei
+compilatori, gli identificativi di vario tipo sono noti come @dfn{simboli},
+da cui il prefisso ``sym'' nei nomi delle routine.  La struttura di dati che
+contiene informazioni sui simboli @`e chiamata @dfn{Tabella dei simboli}
+(@dfn{Symbol table}).
+Le funzioni sono le seguenti:
+
+@table @code
+@item awk_bool_t sym_lookup(const char *nome,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
+Riempie la struttura @code{awk_value_t} puntata da @code{risultato}
+con il valore della variabile il cui nome @`e nella stringa @code{nome},
+che @`e una normale stringa di caratteri C.
+@code{wanted} indica il tipo di valore atteso.
+La funzione restituisce @dfn{true} se il tipo effettivo della variabile @`e quello
+specificato in @code{wanted}, e @dfn{false} in caso contrario.
+In quest'ultimo caso, @code{risultato>val_type} indica il tipo effettivo
+della variabile
+(@pxref{table-value-types-returned}).
+
+@item awk_bool_t sym_lookup_ns(const char *nome,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const char *name_space,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
+Simile a @code{sym_lookup()}, ma il parametro @code{name_space} consente di
+specificare a quale spazio-di-nomi appartiene @code{nome}.
+@code{name_space} non pu@`o essere la stringa nulla (@code{NULL}).
+Se vale @code{""} o @code{"awk"}, allora @code{nome} @`e cercato nello
+spazio-di-nomi di default, ossia @code{awk}.
+
+Note that @code{namespace} is a C++ keyword. For interoperability with C++,
+you should avoid using that identifier in C code.
+
+@item awk_bool_t sym_update(const char *nome, awk_value_t *valore);
+Aggiorna la variabile il cui nome @`e contenuto nella stringa @code{nome},
+che @`e una normale stringa di caratteri C.
+La variabile @`e aggiunta alla Tabella dei simboli di @command{gawk},
+se non @`e gi@`a presente.  Restituisce @dfn{true} se tutto @`e andato bene, e
+@dfn{false} in caso contrario.
+
+La modifica del tipo (da scalare a vettoriale o viceversa) di una variabile
+gi@`a esistente @emph{non} @`e consentito, e questa routine non pu@`o neppure
+essere usata per aggiornare un vettore.
+Questa routine non pu@`o essere usata per modificare nessuna delle variabili
+predefinite (come @code{ARGC} o @code{NF}).
+@end table
+
+Un'estensione pu@`o andare a cercare il valore delle variabili speciali di
+@command{gawk}.
+Tuttavia, con l'eccezione del vettore @code{PROCINFO}, un'estensione
+non pu@`o cambiare alcuna di queste variabili.
+
+@node Tabella simboli tramite cookie
+@subsubsection Accedere alle variabili per ``cookie'' e aggiornarle
+
+Uno @dfn{scalar cookie} @`e un puntatore nascosto (@dfn{opaque handle}) che
+fornisce accesso a una
+variabile globale o a un vettore. Si tratta di un'ottimizzazione, per evitare
+di ricercare variabili nella Tabella dei simboli di @command{gawk} ogni volta
+che un accesso @`e necessario.  Questo
+argomento @`e gi@`a stato trattato in precedenza, nella
+@ref{Tipi di dati generali}.
+
+@need 1500
+Le funzioni seguenti servono per gestire gli @dfn{scalar cookie}:
+
+@table @code
+@item awk_bool_t sym_lookup_scalar(awk_scalar_t cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
+Ottiene il valore corrente di uno @dfn{scalar cookie}.
+Una volta ottenuto lo @dfn{scalar cookie} usando @code{sym_lookup()}, si
+pu@`o usare questa funzione per accedere al valore della variabile in modo
+pi@`u efficiente.
+Restituisce @dfn{false} se il valore non @`e disponibile.
+
+@item awk_bool_t sym_update_scalar(awk_scalar_t cookie, awk_value_t *valore);
+Aggiorna il valore associato con uno @dfn{scalar cookie}.
+Restituisce @dfn{false} se il nuovo valore non @`e del tipo
+@code{AWK_STRING}, @code{AWK_STRNUM}, @code{AWK_REGEX} o @code{AWK_NUMBER}.
+Anche in questo caso, le variabili predefinite non possono essere aggiornate.
+@end table
+
+Non @`e immediatamente evidente come si lavora con gli @dfn{scalar cookie} o
+quale sia la loro vera @i{ragion d'essere}.  In teoria, le routine
+@code{sym_lookup()} e @code{sym_update()} sono tutto ci@`o che occorre per
+lavorare con le variabili.  Per esempio, ci potrebbe essere un codice che
+ricerca il valore di una variabile, valuta una condizione, e potrebbe
+poi cambiare il valore della variabile a seconda dei risultati della
+valutazione in modo simile a questo:
+
+@example
+/*  do_magic --- fai qualcosa di veramente grande */
+
+static awk_value_t *
+do_magic(int nargs, awk_value_t *risultato)
+@{
+    awk_value_t valore;
+
+    if (   sym_lookup("MAGIC_VAR", AWK_NUMBER, & valore)
+        && qualche_condizione(valore.num_valore)) @{
+            valore.num_valore += 42;
+            sym_update("MAGIC_VAR", & valore);
+    @}
+
+    return make_number(0.0, risultato);
+@}
+@end example
+
+@noindent
+Questo codice sembra (ed @`e) semplice e immediato.  Qual @`e il problema?
+
+Beh, si consideri cosa succede se un qualche codice a livello di @command{awk}
+associato con l'estensione richiama la funzione @code{magic()}
+(implementata in linguaggio C da @code{do_magic()}), una volta per ogni
+record, mentre si stanno elaborando
+file contenenti migliaia o milioni di record.
+La variabile @code{MAGIC_VAR} viene ricercata nella Tabella dei simboli una o due
+volte per ogni richiamo della funzione!
+
+La ricerca all'interno della Tabella dei simboli @`e in realt@`a una pura perdita
+di tempo; @`e molto pi@`u efficiente
+ottenere un @dfn{value cookie} che rappresenta la variabile, e usarlo per
+ottenere il valore della variabile e aggiornarlo a seconda della
+necessit@`a.@footnote{La differenza @`e misurabile e indubbiamente reale.
+Fidatevi.}
+
+Quindi, la maniera per usare i valori-cookie @`e la seguente.  Per prima
+cosa, la variabile di estensione va messa nella Tabella dei simboli di
+@command{gawk} usando @code{sym_update()}, come al solito.  Poi si deve ottenere
+uno @dfn{scalar cookie} per la
+variabile usando @code{sym_lookup()}:
+
+@example
+@group
+static awk_scalar_t magic_var_cookie;    /* cookie per MAGIC_VAR */
+
+static void
+inizializza_estensione()
+@{
+    awk_value_t valore;
+@end group
+
+    /* immettere il valore iniziale */
+    sym_update("MAGIC_VAR", make_number(42.0, & valore));
+
+    /* ottenere il @dfn{value cookie} */
+    sym_lookup("MAGIC_VAR", AWK_SCALAR, & valore);
+
+    /* salvarlo per dopo */
+    magic_var_cookie = valore.scalar_cookie;
+    @dots{}
+@}
+@end example
+
+Dopo aver fatto questo, si usino le routine descritte in questa @value{SECTION}
+per ottenere e modificare
+il valore usando il @dfn{value cookie}.  Quindi, @code{do_magic()} diviene ora
+qualcosa del tipo:
+
+@example
+/*  do_magic --- fai qualcosa di veramente grande */
+
+static awk_value_t *
+do_magic(int nargs, awk_value_t *risultato)
+@{
+    awk_value_t valore;
+
+    if (   sym_lookup_scalar(magic_var_cookie, AWK_NUMBER, & valore)
+        && qualche_condizione(valore.num_valore)) @{
+            valore.num_valore += 42;
+            sym_update_scalar(magic_var_cookie, & valore);
+    @}
+    @dots{}
+
+    return make_number(0.0, risultato);
+@}
+@end example
+
+@quotation NOTA
+Il codice appena visto omette il controllo di eventuali errori, per
+amor di semplicit@`a.  Il codice dell'estensione dovrebbe essere pi@`u complesso
+e controllare attentamente i valori
+restituiti dalle funzioni dell'API.
+@end quotation
+
+@node Valori nascosti
+@subsubsection Creare e usare valori nascosti
+
+Le routine in questa @value{SECTION} permettono di creare e rilasciare
+valori nascosti.  Come gli @dfn{scalar cookie}, in teoria i valori nascosti
+non sono necessari.  Si possono creare numeri e stringhe usando
+le funzioni descritte
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Funzioni di costruzione}.  Si possono poi assegnare
+quei valori a delle variabili usando @code{sym_update()}
+o @code{sym_update_scalar()}, come si preferisce.
+
+Tuttavia, si pu@`o comprendere l'utilit@`a di avere dei valori nascosti
+se si pone mente al fatto che la memoria di @emph{ogni} valore di stringa
+@emph{deve} essere ottenuta tramite @code{gawk_malloc()},
+@code{gawk_calloc()} o @code{gawk_realloc()}.
+Se ci sono 20 variabili, e tutte hanno per valore la stessa stringa,
+si devono creare 20 copie identiche della stringa.@footnote{I valori
+numerici creano molti meno problemi, in quanto richiedono solo una variabile
+C @code{double} (8 byte) per contenerli.  Naturalmente, valori di tipo
+GMP ed MPFR usano @emph{molta} pi@`u memoria.}
+
+Chiaramente @`e pi@`u efficiente, se possibile, creare il valore una sola volta,
+e fare in modo che @command{gawk} utilizzi quell'unico valore per molte
+variabili.  Questo @`e ci@`o che la routine in
+@ifnotinfo
+questa
+@end ifnotinfo
+@ifinfo
+questo
+@end ifinfo
+@value{SECTION} permette
+di fare.  Le funzioni sono le seguenti:
+
+@table @code
+@item awk_bool_t create_value(awk_value_t *valore, awk_value_cookie_t *risultato);
+Crea una stringa o un valore numerico nascosti, da @code{valore}, in
+vista di un successivo assegnamento di valore.  Sono consentiti solo valori di
+tipo @code{AWK_NUMBER}, @code{AWK_REGEX} ed @code{AWK_STRING}.
+Ogni altro tipo @`e rifiutato.
+Il tipo @code{AWK_UNDEFINED} potrebbe essere consentito, ma in questo caso
+l'efficienza del programma ne soffrirebbe.
+
+@item awk_bool_t release_value(awk_value_cookie_t vc);
+Libera la memoria associata con un @dfn{value cookie} ottenuto mediante
+@code{create_value()}.
+@end table
+
+Si usano i @dfn{value cookie} in modo dimile a quello con cui si usano gli
+@dfn{scalar cookie}.
+Nella routine di inizializzazione dell'estensione, si crea il
+@dfn{value cookie}:
+
+@example
+static awk_value_cookie_t answer_cookie;  /* static @dfn{value cookie} */
+
+static void
+inizializza_estensione()
+@{
+    awk_value_t value;
+    char *long_string;
+    size_t long_string_len;
+
+    /* codice precedente */
+    @dots{}
+    /* @dots{} riempire long_string e long_string_len @dots{} */
+    make_malloced_string(long_string, long_string_len, & value);
+    create_value(& value, & answer_cookie);    /* creare cookie */
+    @dots{}
+@}
+@end example
+
+Una volta che il valore @`e creato, si pu@`o usare come valore per un numero
+qualsiasi di variabili:
+
+@example
+static awk_value_t *
+do_magic(int nargs, awk_value_t *risultato)
+@{
+    awk_value_t new_value;
+
+    @dots{}    /* come in precedenza */
+
+    value.val_type = AWK_VALUE_COOKIE;
+    value.value_cookie = answer_cookie;
+    sym_update("VAR1", & value);
+    sym_update("VAR2", & value);
+    @dots{}
+    sym_update("VAR100", & value);
+    @dots{}
+@}
+@end example
+
+@noindent
+Usare @dfn{value cookie} in questo modo permette di risparmiare parecchia
+memoria, poich@'e tutte le variabili da @code{VAR1} a @code{VAR100} condividono
+lo stesso valore.
+
+Ci si potrebbe chiedere, ``Questa condivisione crea problemi?
+Cosa succede se il codice @command{awk} assegna un nuovo valore a @code{VAR1};
+sono modificate anche tutte le altre variabili?''
+
+Buona domanda! La risposta @`e che no, non @`e un problema.
+Internamente, @command{gawk} usa
+@dfn{un contatore dei riferimenti alle stringhe}.  Questo significa
+che molte variabili possono condividere lo stesso valore di tipo stringa,
+e @command{gawk} mantiene traccia del loro uso.  Quando il valore di
+una variabile viene modificato, @command{gawk} semplicemente diminuisce di
+uno il contatore dei riferimenti del vecchio valore, e aggiorna la variabile
+perch@'e usi il nuovo valore.
+
+Infine, come parte della pulizia al termine del programma
+(@pxref{Funzioni di exit callback})
+si deve liberare ogni valore nascosto che era stato creato, usando
+la funzione @code{release_value()}.
+
+@node Manipolazione di vettori
+@subsection Manipolazione di vettori
+@cindex vettori, manipolazione nelle estensioni
+@cindex estensioni, manipolazione di vettori nelle
+
+La struttura di dati primaria@footnote{D'accordo, l'unica struttura di dati.}
+in @command{awk} @`e il vettore associativo
+@iftex
+(@pxrefil{Vettori}).
+@end iftex
+@ifnottex
+(@pxref{Vettori}).
+@end ifnottex
+Le estensioni devono essere in grado di manipolare vettori @command{awk}.
+L'API fornisce varie strutture di dati per lavorare con vettori,
+funzioni per lavorare con singoli elementi di un vettore, e funzioni per
+lavorare con interi vettori.  @`E prevista anche la possibilit@`a di
+``appiattire'' un vettore in modo da rendere facile a un programma scritto in
+C la ``visita'' di tutti gli elementi del vettore.
+Le strutture dati per i vettori sono facilmente integrabili con le
+strutture dati per variabili scalari, per facilitare sia l'elaborazione, sia
+la creazione di @dfn{veri} vettori di vettori (@pxref{Tipi di dati generali}).
+
+@menu
+* Tipi di dati per i vettori::    Tipi dati per lavorare coi vettori.
+* Funzioni per i vettori::        Funzioni per lavorare coi vettori.
+* Appiattimento di vettori::      Come appiattire i vettori.
+* Creazione di vettori::          Come creare e popolare vettori.
+@end menu
+
+@node Tipi di dati per i vettori
+@subsubsection Tipi di dati per i vettori
+
+I tipi di dato associati con i vettori sono i seguenti:
+
+@table @code
+@item typedef void *awk_array_t;
+Se si richiede il valore di una variabile contenuta in un vettore, si ottiene
+un valore del tipo @code{awk_array_t}. Questo valore @`e
+@dfn{opaco}@footnote{@`E anche un
+``cookie,'' ma gli sviluppatori di @command{gawk} hanno preferito non abusare
+di questo termine.} per l'estensione; identifica in maniera univoca il
+vettore ma pu@`o solo essere usato come parametro di una funzione dell'API,
+o essere ricevuto da una funzione dell'API.  Questo @`e molto simile al modo
+in cui i valori @samp{FILE *} sono usati con le routine di libreria di
+@code{<stdio.h>}.
+
+@item typedef struct awk_element @{
+@itemx @ @ @ @ /* puntatore di servizio
+@itemx @ @ @ @    a lista collegata, non usato da gawk */
+@itemx @ @ @ @ struct awk_element *next;
+@itemx @ @ @ @ enum @{
+@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DEFAULT = 0,@ @ /* impostato da gawk */
+@itemx @ @ @ @ @ @ @ @ AWK_ELEMENT_DELETE = 1@ @ @ @ /* impostato dall'estensione */
+@itemx @ @ @ @ @} flags;
+@itemx @ @ @ @ awk_value_t    index;
+@itemx @ @ @ @ awk_value_t    value;
+@itemx @} awk_element_t;
+@code{awk_element_t} @`e un elemento di vettore ``appiattito''.
+@command{awk} produce un vettore di questo tipo all'interno della struttura
+@code{awk_flat_array_t} (si veda poco pi@`u avanti).
+Singoli elementi di vettore possono essere marcati per essere cancellati.
+Nuovi elementi del vettore devono essere aggiunti individualmente, uno per
+volta, usando una funzione API apposita.  I campi sono i seguenti:
+
+@c nested table
+@table @code
+@item struct awk_element *next;
+Questo puntatore @`e presente come ausilio a chi scrive un'estensione.
+Permette a un'estensione di creare una lista collegata (@dfn{linked list}) di
+nuovi elementi che possono essere aggiunti a un vettore con un
+singolo ciclo che percorre tutta la lista.
+
+@item enum @{ @dots{} @} flags;
+Un insieme di valori di flag che passano informazione tra l'estensione
+e @command{gawk}.  Per ora c'@`e solo un flag disponibile:
+@code{AWK_ELEMENT_DELETE}.
+Se lo si imposta, @command{gawk} elimina l'elemento in questione dal vettore
+originale, dopo che il vettore ``appiattito'' @`e stato rilasciato.
+
+@item index
+@itemx value
+L'indice e il valore di un elemento, rispettivamente.
+@emph{Tutta} la memoria puntata da @code{index} e @code{valore} appartiene
+a @command{gawk}.
+@end table
+
+@item typedef struct awk_flat_array @{
+@itemx @ @ @ @ awk_const void *awk_const opaque1;@ @ @ @ /* per uso di gawk */
+@itemx @ @ @ @ awk_const void *awk_const opaque2;@ @ @ @ /* per uso di gawk */
+@itemx @ @ @ @ awk_const size_t count;@ @ @ @ @ /* quanti elementi nel vettore */
+@itemx @ @ @ @ awk_element_t elements[1];@ @ /* saranno ``appiattiti'' */
+@itemx @} awk_flat_array_t;
+Questo @`e un vettore appiattito. Quando un'estensione ottiene da
+@command{gawk} questa struttura, il vettore @code{elements} ha una dimensione
+reale di @code{count} elementi.
+I puntatori @code{opaque1} e @code{opaque2} sono per uso di @command{gawk};
+come tali, sono marcati come @code{awk_const} in modo che l'estensione non
+possa modificarli.
+@end table
+
+@node Funzioni per i vettori
+@subsubsection Funzioni per lavorare coi vettori
+
+Le funzioni seguenti permettono di gestire singoli elementi di un vettore:
+
+@table @code
+@item awk_bool_t get_element_count(awk_array_t a_cookie, size_t *count);
+Per il vettore rappresentato da @code{a_cookie}, restituisce in @code{*count}
+il numero di elementi in esso contenuti.  Ogni sottovettore @`e conteggiato come
+se fosse un solo elemento.
+Restituisce @dfn{false} se si verifica un errore.
+
+@item awk_bool_t get_array_element(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t *const index,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t wanted,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_value_t *risultato);
+Per il vettore rappresentato da @code{a_cookie}, restituisce in @code{*risultato}
+il valore dell'elemento il cui indice @`e @code{index}.
+@code{wanted} specifica il tipo di valore che si vuole ritrovare.
+Restituisce @dfn{false} se @code{wanted} non coincide con il tipo di dato o
+se @code{index} non @`e nel vettore (@pxref{table-value-types-returned}).
+
+Il valore per @code{index} pu@`o essere numerico, nel qual caso @command{gawk}
+lo converte in una stringa. Usare valori non interi @`e possibile, ma
+richiede di comprendere il modo con cui tali valori sono convertiti in stringhe
+(@pxref{Conversione}); per questo motivo, @`e meglio usare numeri interi.
+
+Come per @emph{tutte} le stringhe passate a @command{gawk} da
+un'estensione, la memoria che contiene il valore della stringa con chiave
+@code{index} deve essere stata acquisita utilizzando le funzioni
+@code{gawk_malloc()}, @code{gawk_calloc()} o @code{gawk_realloc()}, e
+@command{gawk} rilascer@`a (al momento opportuno) la relativa memoria.
+
+@item awk_bool_t set_array_element(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const index,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const@ awk_value_t *const value);
+Nel vettore rappresentato da @code{a_cookie}, crea o modifica
+l'elemento il cui indice @`e contenuto in @code{index}.
+I vettori @code{ARGV} ed @code{ENVIRON} non possono essere modificati,
+mentre il vettore @code{PROCINFO} @`e modificabile.
+
+@item awk_bool_t set_array_element_by_elem(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_element_t element);
+Come @code{set_array_element()}, ma prende l'indice @code{index} e
+il valore @code{value} da @code{element}. Questa @`e una macro di utilit@`a.
+
+@item awk_bool_t del_array_element(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_value_t* const index);
+Elimina dal vettore, rappresentato da @code{a_cookie}, l'elemento con
+l'indice specificato.
+Restituisce @dfn{true} se l'elemento @`e stato rimosso o @dfn{false} se
+l'elemento non era presente nel vettore.
+@end table
+
+Le seguenti funzioni operano sull'intero vettore:
+
+@table @code
+@item awk_array_t create_array(void);
+Crea un nuovo vettore a cui si possono aggiungere elementi.
+@xref{Creazione di vettori} per una trattazione su come
+creare un nuovo vettore e aggiungervi elementi.
+
+@item awk_bool_t clear_array(awk_array_t a_cookie);
+Svuota il vettore rappresentato da @code{a_cookie}.
+Restituisce @dfn{false} in presenza di qualche tipo di problema, @dfn{true}
+in caso contrario.  Il vettore non viene eliminato ma, dopo aver chiamato
+questa funzione, resta privo di elementi.  Questo equivale a usare
+l'istruzione @code{delete} (@pxref{Cancellazione}).
+
+@item awk_bool_t flatten_array_typed(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_flat_array_t **data,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t index_type,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_valtype_t value_type);
+Per il vettore rappresentato da @code{a_cookie}, crea una struttura
+@code{awk_flat_array_t} e la riempie con indici e valori del tipo richiesto.
+Imposta il puntatore il cui indirizzo @`e passato in @code{data} per puntare a
+questa struttura.
+Restituisce @dfn{true} se tutto va bene o @dfn{false} in caso contrario.
+@ifset FOR_PRINT
+Si veda la prossima @value{SECTION}
+@end ifset
+@ifclear FOR_PRINT
+@xref{Appiattimento di vettori},
+@end ifclear
+per una trattazione su come appiattire un vettore per poterci lavorare.
+
+@item awk_bool_t flatten_array(awk_array_t a_cookie, awk_flat_array_t **data);
+Per il vettore rappresentato da @code{a_cookie}, crea una struttura
+@code{awk_flat_array_t} e la riempie con indici di tipo @code{AWK_STRING} e
+valori @code{AWK_UNDEFINED}.
+Questa funzione @`e resa obsoleta da @code{flatten_array_typed()}.
+@`E fornita come macro, e mantenuta per convenienza e per compatibilit@`a a
+livello di codice sorgente con la precedente versione dell'API.
+
+@item awk_bool_t release_flattened_array(awk_array_t a_cookie,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ awk_flat_array_t *data);
+Quando si @`e finito di lavorare con un vettore appiattito, si liberi la
+memoria usando questa funzione.  Occorre fornire sia il cookie del vettore
+originale, sia l'indirizzo della struttura da liberare,
+@code{awk_flat_array_t}.
+La funzione restituisce @dfn{true} se tutto va bene, @dfn{false} in caso contrario.
+@end table
+
+@node Appiattimento di vettori
+@subsubsection Lavorare con tutti gli elementi di un vettore
+
+@dfn{Appiattire} un vettore vuol dire creare una struttura che
+rappresenta l'intero vettore in modo da facilitare la visita
+dell'intero vettore da parte del codice in C .  Parte del codice in
+@file{extension/testext.c} fa questo, ed @`e anche un bell'esempio
+di come utilizzare l'API.
+
+Questa parte del codice sorgente sar@`a descritta un po' per volta.
+Ecco, per iniziare, lo @dfn{script} @command{gawk} che richiama l'estensione di test:
+
+@example
+@@load "testext"
+BEGIN @{
+    n = split("blacky rusty sophie raincloud lucky", pets)
+    printf("pets ha %d elementi\n", length(pets))
+    ret = dump_array_and_delete("pets", "3")
+    printf("dump_array_and_delete(pets) ha restituito %d\n", ret)
+    if ("3" in pets)
+      printf("dump_array_and_delete() NON ha rimosso l'indice \"3\"!\n")
+    else
+      printf("dump_array_and_delete() ha rimosso l'indice \"3\"!\n")
+    print ""
+@}
+@end example
+
+@noindent
+Questo codice crea un vettore usando la funzione @code{split()}
+(@pxref{Funzioni per stringhe})
+e poi chiama @code{dump_array_and_delete()}.  Questa funzione ricerca
+il vettore il cui nome @`e passato come primo argomento, ed
+elimina l'elemento il cui indice @`e passato come secondo argomento.
+Il codice @command{awk} stampa poi il valore restituito e controlla che
+l'elemento sia stato effettivamente cancellato.  Ecco il codice C che
+costituisce la funzione
+@code{dump_array_and_delete()}.  @`E stato leggermente modificato per facilitare
+l'esposizione.
+
+La prima parte dichiara variabili, imposta il codice di ritorno di default
+in @code{risultato}, e controlla che la funzione
+sia stata chiamata con il numero corretto di argomenti:
+
+@example
+static awk_value_t *
+dump_array_and_delete(int nargs, awk_value_t *risultato)
+@{
+    awk_value_t valore, valore2, valore3;
+    awk_flat_array_t *flat_array;
+    size_t count;
+    char *nome;
+    int i;
+
+    assert(risultato != NULL);
+    make_number(0.0, risultato);
+
+    if (nargs != 2) @{
+        printf("dump_array_and_delete: nargs errato "
+               "(%d dovrebbe essere 2)\n", nargs);
+        goto out;
+    @}
+@end example
+
+La funzione poi prosegue un passo per volta, come segue.  Il primo passo @`e
+ricuperare il nome del vettore, passato come primo argomento, seguito dal
+vettore stesso. Se una di queste operazioni non riesce, viene stampato un
+messaggio di errore e si ritorna al chiamante:
+
+@example
+    /* trasforma in un vettore piatto il vettore
+    passato come argomento e lo stampa */
+    if (get_argument(0, AWK_STRING, & value)) @{
+        nome = valore.str_value.str;
+        if (sym_lookup(nome, AWK_array, & value2))
+            printf("dump_array_and_delete: sym_lookup di %s effettuato\n",
+                   nome);
+        else @{
+            printf("dump_array_and_delete: sym_lookup di %s non riuscito\n",
+                   nome);
+            goto out;
+        @}
+    @} else @{
+        printf("dump_array_and_delete: get_argument(0) non riuscito\n");
+        goto out;
+    @}
+@end example
+
+Per controllo, e per assicurarsi che il codice C veda
+lo stesso numero di elementi del codice @command{awk},
+il secondo passo @`e quello di ottenere il numero di elementi nel vettore
+e stamparlo:
+
+@example
+    if (! get_element_count(valore2.array_cookie, & count)) @{
+        printf("dump_array_and_delete: get_element_count non riuscito\n");
+        goto out;
+    @}
+
+    printf("dump_array_and_delete: il vettore in input ha %lu elementi\n",
+           (unsigned long) count);
+@end example
+
+Il terzo passo @`e quello di appiattire il vettore, e quindi
+controllare che il numero di elementi nella struttura @code{awk_flat_array_t}
+sia uguale a quello appena trovato:
+
+@example
+    if (! flatten_array_typed(valore2.array_cookie, & flat_array,
+                              AWK_STRING, AWK_UNDEFINED)) @{
+        printf("dump_array_and_delete: non sono riuscito ad appiattire \
+il vettore\n");
+        goto out;
+    @}
+
+    if (flat_array->count != count) @{
+        printf("dump_array_and_delete: flat_array->count (%lu)"
+               " != count (%lu)\n",
+                (unsigned long) flat_array->count,
+                (unsigned long) count);
+        goto out;
+    @}
+@end example
+
+Il quarto passo @`e ritrovare l'indice dell'elemento
+da eliminare, che era stato passato come secondo argomento.
+Va tenuto presente che i contatori di argomenti passati a @code{get_argument()}
+partono da zero, e che quindi il secondo argomento @`e quello numero uno:
+
+@example
+    if (! get_argument(1, AWK_STRING, & value3)) @{
+        printf("dump_array_and_delete: get_argument(1) non riuscito\n");
+        goto out;
+    @}
+@end example
+
+Il quinto passo @`e quello in cui si fa il ``vero lavoro''.  La funzione esegue
+un ciclo su ogni elemento nel vettore, stampando i valori degli indici e
+degli elementi. Inoltre, dopo aver trovato, tramite l'indice, l'elemento
+che si vorrebbe eliminare, la funzione imposta il @dfn{bit}
+@code{AWK_ELEMENT_DELETE} nel campo @code{flags}
+dell'elemento.  Quando il vettore @`e stato interamente percorso, @command{gawk}
+visita il vettore appiattito, ed elimina ogni elemento in cui il relativo
+@dfn{bit} della flag sia impostato:
+
+@example
+    for (i = 0; i < flat_array->count; i++) @{
+        printf("\t%s[\"%.*s\"] = %s\n",
+            nome,
+            (int) flat_array->elements[i].index.str_value.len,
+            flat_array->elements[i].index.str_value.str,
+            valrep2str(& flat_array->elements[i].valore));
+
+        if (strcmp(valore3.str_value.str,
+                 flat_array->elements[i].index.str_value.str) == 0) @{
+           flat_array->elements[i].flags |= AWK_ELEMENT_DELETE;
+           printf("dump_array_and_delete: ho marcato l'elemento \"%s\" "
+                 "per eliminazione\n",
+              flat_array->elements[i].index.str_value.str);
+        @}
+    @}
+@end example
+
+Il sesto passo @`e liberare il vettore appiattito. Questo segnala a
+@command{gawk} che l'estensione non sta pi@`u usando il vettore,
+e che dovrebbe eliminare gli elementi marcati per l'eliminazione.
+@command{gawk} libera anche ogni area di memoria che era stata allocata,
+e quindi non si dovrebbe pi@`u usare il puntatore (@code{flat_array} in
+questo codice) dopo aver chiamato @code{release_flattened_array()}:
+
+@example
+    if (! release_flattened_array(valore2.array_cookie, flat_array)) @{
+        printf("dump_array_and_delete: non riesco a liberare \
+il vettore appiattito\n");
+        goto out;
+    @}
+@end example
+
+Infine, poich@'e tutto @`e andato bene, la funzione imposta il codice di ritorno
+a "successo", e lo restituisce quando esce:
+
+@example
+@group
+    make_number(1.0, risultato);
+out:
+    return risultato;
+@}
+@end group
+@end example
+
+Ecco l'output ottenuto eseguendo questa parte del test:
+
+@example
+pets ha 5 elementi
+dump_array_and_delete: sym_lookup di pets effettuato
+dump_array_and_delete: il vettore in input ha 5 elementi
+        pets["1"] = "blacky"
+        pets["2"] = "rusty"
+        pets["3"] = "sophie"
+dump_array_and_delete: ho marcato l'elemento "3" per eliminazione
+        pets["4"] = "raincloud"
+        pets["5"] = "lucky"
+dump_array_and_delete(pets) ha restituito 1
+dump_array_and_delete() ha rimosso l'indice "3"!
+@end example
+
+@node Creazione di vettori
+@subsubsection Come creare e popolare vettori
+
+Oltre a lavorare con vettori creati da codice @command{awk}, si possono
+creare vettori a cui aggiungere elementi secondo le esigenze, che poi
+il codice @command{awk} pu@`o utilizzare e manipolare.
+
+Ci sono due punti importanti da tener presente quando di creano vettori dal
+codice di un'estensione:
+
+@itemize @value{BULLET}
+@item
+Il vettore appena creato deve essere subito messo nella Tabella dei simboli di
+@command{gawk}.  Solo dopo aver fatto questo @`e possibile aggiungere elementi
+al vettore.
+
+@ignore
+Strictly speaking, this is required only
+for arrays that will have subarrays as elements; however it is
+a good idea to always do this.  This restriction may be relaxed
+in a subsequent revision of the API.
+@end ignore
+
+Analogamente, se si installa un nuovo vettore come sottovettore di
+un vettore gi@`a esistente,
+occorre prima aggiungere il nuovo vettore al suo "genitore" per poter poi
+aggiungere degli elementi allo stesso.
+
+Quindi, il modo giusto per costruire un vettore @`e di lavorare ``dall'alto
+verso il basso''.  Creare il vettore, e subito aggiungerlo alla Tabella dei
+simboli di @command{gawk} usando @code{sym_update()}, o installarlo come
+elemento in un vettore gi@`a esistente usando @code{set_array_element()}.
+Un esempio di codice @`e fornito pi@`u sotto.
+
+@item
+Per come funziona internamente @command{gawk}, dopo aver usato
+@code{sym_update()} per definire un vettore
+in @command{gawk}, si deve innanzitutto ricuperare il @dfn{cookie}
+del vettore dal valore passato a @command{sym_update()}, in questo modo:
+
+@example
+awk_value_t val;
+awk_array_t new_array;
+
+new_array = create_array();
+val.val_type = AWK_ARRAY;
+val.array_cookie = new_array;
+
+/* aggiunge il vettore alla Tabella dei simboli */
+sym_update("array", & val);
+
+new_array = val.array_cookie;    /* QUESTO @`E OBBLIGATORIO */
+@end example
+
+Se si sta installando un vettore come sottovettore, occorre anche
+ricuperare il @dfn{cookie} del vettore dopo aver chiamato @code{set_element()}.
+@end itemize
+
+Il seguente codice C @`e una semplice estensione di test per creare un vettore
+con due elementi normali e con un sottovettore.  Le direttive iniziali
+@code{#include} e le solite dichiarazione di variabili sono state omesse per
+amor di brevit@`a
+(@pxref{Codice predefinito di un'estensione API}).
+Il primo passo @`e creare un nuovo vettore e poi aggiungerlo alla
+Tabella dei simboli:
+
+@example
+@ignore
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+static const gawk_api_t *api;   /* per far funzionare le macro di utilit@`a */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "testarray extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+
+@end ignore
+/* create_new_array --- creare un vettore denominato */
+
+static void
+create_new_array()
+@{
+    awk_array_t a_cookie;
+    awk_array_t sottovettore;
+    awk_value_t index, valore;
+
+    a_cookie = create_array();
+    valore.val_type = AWK_array;
+    valore.array_cookie = a_cookie;
+
+    if (! sym_update("new_array", & value))
+        printf("create_new_array: sym_update(\"nuovo_vettore\") \
+non riuscito!\n");
+    a_cookie = valore.array_cookie;
+@end example
+
+@noindent
+Si noti come @code{a_cookie} @`e reimpostato dal campo @code{array_cookie}
+nella struttura @code{valore}.
+
+Il secondo passo aggiunge due elementi normali a @code{nuovo_vettore}:
+
+@example
+    (void) make_const_string("salve", 5, & index);
+    (void) make_const_string("mondo", 5, & value);
+    if (! set_array_element(a_cookie, & index, & value)) @{
+        printf("fill_in_array: set_array_element non riuscito\n");
+        return;
+    @}
+
+    (void) make_const_string("risposta", 8, & index);
+    (void) make_number(42.0, & value);
+    if (! set_array_element(a_cookie, & index, & value)) @{
+        printf("fill_in_array: set_array_element non riuscito\n");
+        return;
+    @}
+@end example
+
+Il terzo passo @`e creare il sottovettore e aggiungerlo al vettore:
+
+@example
+    (void) make_const_string("sottovettore", 12, & index);
+    sottovettore = create_array();
+    valore.val_type = AWK_array;
+    valore.array_cookie = subarray;
+    if (! set_array_element(a_cookie, & index, & value)) @{
+        printf("fill_in_array: set_array_element non riuscito\n");
+        return;
+    @}
+    sottovettore = valore.array_cookie;
+@end example
+
+Il passo finale @`e di aggiungere al sottovettore un suo proprio elemento:
+
+@example
+    (void) make_const_string("pippo", 5, & index);
+    (void) make_const_string("pluto", 5, & value);
+    if (! set_array_element(sottovettore, & index, & value)) @{
+        printf("fill_in_array: set_array_element non riuscito\n");
+        return;
+    @}
+@}
+@ignore
+static awk_ext_func_t func_table[] = @{
+    @{ NULL, NULL, 0 @}
+@};
+
+/* init_testarray --- funzione ulteriore di inizializzazione */
+
+static awk_bool_t init_testarray(void)
+@{
+    create_new_array();
+
+    return awk_true;
+@}
+
+static awk_bool_t (*init_func)(void) = init_testarray;
+
+dl_load_func(func_table, testarray, "")
+@end ignore
+@end example
+
+Ecco uno @dfn{script} di esempio che carica l'estensione
+e quindi stampa il valore di tutti gli elementi del vettore,
+invocando nuovamente se stessa nel caso che un particolare
+elemento sia a sua volta un vettore:
+
+@example
+@@load "subarray"
+
+function dumparray(nome, vettore,     i)
+@{
+    for (i in vettore)
+        if (isarray(vettore[i]))
+            dumparray(nome "[\"" i "\"]", vettore[i])
+        else
+            printf("%s[\"%s\"] = %s\n", nome, i, vettore[i])
+@}
+
+BEGIN @{
+    dumparray("new_array", new_array);
+@}
+@end example
+
+Ecco il risultato dell'esecuzione dello @dfn{script}:
+
+@example
+$ @kbd{AWKLIBPATH=$PWD gawk -f subarray.awk}
+@print{} new_array["sottovettore"]["pippo"] = pluto
+@print{} new_array["salve"] = mondo
+@print{} new_array["risposta"] = 42
+@end example
+
+@noindent
+(@xref{Trovare le estensioni} per ulteriori dettagli sulla
+variabile d'ambiente @env{AWKLIBPATH}.)
+
+@node Ridirezione API
+@subsection Accedere alle ridirezioni e modificarle
+
+La seguente funzione consente alle estensioni di accedere e di manipolare
+delle ridirezioni.
+
+@table @code
+@item awk_bool_t get_file(const char *nome,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ size_t name_len,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const char *tipofile,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ int fd,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_input_buf_t **ibufp,
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ const awk_output_buf_t **obufp);
+Ricerca il file @code{nome} nella tabella interna di ridirezione di
+@command{gawk}.
+Se @code{nome} @`e @code{NULL} o @code{name_len} @`e zero, restituisce
+i dati del file in input correntemente aperto il cui nome @`e memorizzato in
+@code{FILENAME}.
+(Questa chiamata non usa l'argomento @code{filetype}, che, quindi, pu@`o essere
+lasciato indefinito).
+Se il file non @`e gi@`a aperto, tenta di aprirlo.
+L'argomento @code{filetype} deve terminare con uno zero binario, e dovrebbe
+dovrebbe avere uno di questi valori:
+
+@table @code
+@item ">"
+Un file aperto in output.
+
+@item ">>"
+Un file aperto in output, record aggiunti a fine file,
+dopo quelli gi@`a esistenti [@dfn{append}].
+
+@item "<"
+Un file aperto in input.
+
+@item "|>"
+Una @dfn{pipe} aperta in output.
+
+@item "|<"
+Una @dfn{pipe} aperta in input.
+
+@item "|&"
+Un coprocesso bidirezionale.
+@end table
+
+In caso di errore, restituisce il valore @code{awk_false}.
+Altrimenti, restituisce
+@code{awk_true}, insieme a ulteriori informazioni sulla ridirezione
+nei puntatori @code{ibufp} e @code{obufp}.
+Per ridirezioni di input il valore @code{*ibufp} non dovrebbe essere
+@code{NULL}, mentre @code{*obufp} dovrebbe essere @code{NULL}.
+
+Per ridirezioni di input,
+il valore di @code{*ibufp} dovrebbe essere non-@code{NULL}, e @code{*obufp}
+dovrebbe essere @code{NULL}.
+Per ridirezioni di output,
+il valore di @code{*obufp} dovrebbe essere non-@code{NULL}, e @code{*ibufp}
+dovrebbe essere @code{NULL}.
+Per coprocessi bidirezionali, ognuno dei due
+valori dovrebbe essere non-@code{NULL}.
+
+Normalmente, l'estensione @`e interessata a @code{(*ibufp)->fd}
+e/o @code{fileno((*obufp)->fp)}.  Se il file non @`e gi@`a
+aperto, e l'argomento @code{fd} non @`e negativo, @command{gawk}
+user@`a quel descrittore di file invece di aprire il file nella
+maniera solita.  Se l'@code{fd} non @`e negativo, ma il file esiste gi@`a,
+@command{gawk} ignora l'@code{fd} e restituisce il file esistente.  @`E
+responsabilit@`a del chiamante notare che n@'e l'@code{fd} nella struttura
+restituita @code{awk_input_buf_t}, n@'e l'@code{fd} nella struttura restituita
+@code{awk_output_buf_t} contiene il valore richiesto.
+
+Si noti che fornire un descrittore di file @emph{non} @`e al momento supportato
+per le @dfn{pipe}.  Tuttavia, l'utilizzo di un descrittore di file
+dovrebbe essere possibile per @dfn{socket} in input, output,
+aggiunta-a-fine-file (append), e bidirezionale (coprocessi).
+Se @code{filetype} @`e bidirezionale, @command{gawk} presuppone che sia un
+@dfn{socket}!  Si noti che nel caso
+bidirezionale i descrittori di file in input e output possono essere
+differenti.
+Per essere sicuri che tutto sia andato bene, si deve controllare che uno dei due
+corrisponda alla richiesta.
+@end table
+
+Si prevede che questa funzione API verr@`a usata per parallelizzare l'I/O
+e rendere disponibile una libreria per i @dfn{socket}.
+
+@node Variabili dell'estensione API
+@subsection Variabili fornite dall'API
+
+L'API fornisce due insiemi di variabili.  Il primo insieme contiene
+informazioni sulla versione dell'API (sia la versione dell'estensione
+compilata, che quella di @command{gawk}).  Il secondo
+insieme contiene informazioni su come @command{gawk} @`e stato invocato.
+
+@menu
+* Versione dell'estensione::    Informazioni sulla versione API.
+* Versione estensione GMP/MPFR:: Informazioni sulla versione disponibile
+                                 di GMP ed MPFR.
+* Variabili informative di estens. API:: Variabili che forniscono informationi
+                                 sull'invocazione di @command{gawk}.
+@end menu
+
+@node Versione dell'estensione
+@subsubsection Costanti e variabili della versione dell'API
+@cindex API, versione dell'estensione
+@cindex versione dell'estensione API @command{gawk}
+@cindex estensione @command{gawk}, versione API
+
+L'API fornisce sia un numero di versione ``principale'' che uno ``secondario''.
+Le versioni dell'API sono disponibili al momento della compilazione, come
+definizioni per il preprocessore C, a supporto della compilazione
+condizionale, e come elencazione di costanti per facilitare il debug:
+
+@float Tabella,gawk-api-version
+@caption{Costanti delle versioni API gawk}
+@multitable {@b{API Version}} {@code{gawk_api_major_version}} {@code{GAWK_API_MAJOR_VERSION}}
+@headitem versione API @tab Definiz. Preprocessore C @tab Costante di elenco
+@item Major @tab @code{gawk_api_major_version} @tab @code{GAWK_API_MAJOR_VERSION}
+@item Minor @tab @code{gawk_api_minor_version} @tab @code{GAWK_API_MINOR_VERSION}
+@end multitable
+@end float
+
+La versione secondaria aumenta quando nuove funzioni sono aggiunte all'API.
+Tali nuove funzioni sono sempre aggiunte alla fine della struttura
+@code{struct} dell'API.
+
+La versione principale aumenta (e la versione secondaria torna a zero) se
+qualche tipo di dati cambia dimensione o si modifica l'ordine dei campi, o se
+qualcuna delle funzioni esistenti cambia il livello di versione.
+
+Pu@`o capitare che un'estensione sia stata compilata con una versione
+dell'API ma caricata da una versione di @command{gawk} che ne usa una
+differente.  Per questo motivo, la versione principale e quella secondaria
+dell'API della versione in uso di @command{gawk} sono incluse nella
+struttura @code{struct} dell'API come costanti intere in sola lettura:
+
+@table @code
+@item api->major_version
+La versione principale di @command{gawk} in esecuzione.
+
+@item api->minor_version
+La versione secondaria di @command{gawk} in esecuzione.
+@end table
+
+Dipende dall'estensione decidere se ci sono incompatibilit@`a con l'API.
+Tipicamente, basta un controllo di questo tipo:
+
+@example
+if (   api->major_version != GAWK_API_MAJOR_VERSION
+    || api->minor_version < GAWK_API_MINOR_VERSION) @{
+        fprintf(stderr, "estensione_pippo: discordanza di versione \
+con gawk!\n");
+        fprintf(stderr, "\tLa mia versione (%d, %d), versione gawk \
+(%d, %d)\n",
+                GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION,
+                api->major_version, api->minor_version);
+        exit(1);
+@}
+@end example
+
+Questo codice @`e incluso nella macro generica @code{dl_load_func()}
+presente in @file{gawkapi.h} (trattata
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Codice predefinito di un'estensione API}).
+
+@node Versione estensione GMP/MPFR
+@subsubsection Informazioni sulla versione disponibile di GMP ed MPFR
+
+L'API include anche informazioni sulle versioni di GMP ed MPFR con cui
+il comando @command{gawk} in esecuzione @`e stato compilato (se disponibile).
+Queste sono incluse nella struttura @code{struct} dell'API come costanti intere
+in sola lettura:
+
+@table @code
+@item api->gmp_major_version
+La versione principale della libreria GMP usata per compilare @command{gawk}.
+
+@item api->gmp_minor_version
+La versione secondaria della libreria GMP usata per compilare @command{gawk}.
+
+@item api->mpfr_major_version
+La versione principale della libreria MPFR usata per compilare @command{gawk}.
+
+@item api->mpfr_minor_version
+La versione secondaria della libreria MPFR usata per compilare @command{gawk}.
+@end table
+
+Questi campi hanno un valore di zero se @command{gawk} @`e stato compilato
+senza supporto MPFR.
+
+Si pu@`o controllare se le versioni di MPFR e GMP dell'utente corrispondono
+a quelle contenute in @command{gawk} con le seguenti macro:
+
+@table @code
+@item check_mpfr_version(extension)
+La @code{extension} @`e l'ID dell'estensione, passato a tutte le altre macro
+e funzioni definite in @file{gawkapi.h}.  Se il file di intestazione
+@code{<mpfr.h>} non @`e stato incluso, questa macro verr@`a definita in
+modo da non fare nulla.
+
+Se invece il predetto file @`e stato incluso, questa macro confronta
+le versioni principale e secondaria di MPFR e GMP con quelle delle
+librerie in uso da parte dell'utente.  Se queste ultime sono pi@`u
+recenti di quelle di @command{gawk}, stampa un messaggio di
+errore fatale ed esce.
+
+La macro @code{dl_load_func()} (trattata
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Codice predefinito di un'estensione API})
+chiama @code{check_mpfr_version()}.
+@end table
+
+@node Variabili informative di estens. API
+@subsubsection Variabili informative
+@cindex API, variabili informative dell'estensione
+@cindex variabili informative dell'API
+@cindex estensione API, variabili informative
+
+L'API fornisce accesso a parecchie variabili che descrivono
+se le opzioni della riga di comando corrispondenti sono state specificate
+quando @command{gawk} @`e stato chiamato.  Le variabili sono:
+
+@table @code
+@item do_debug
+Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--debug}.
+
+@item do_lint
+Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--lint}.
+
+@item do_mpfr
+Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--bignum}.
+
+@item do_profile
+Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--profile}.
+
+@item do_sandbox
+Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--sandbox}.
+
+@item do_traditional
+Questa variabile @`e @dfn{true} se @command{gawk} @`e stato invocato con l'opzione @option{--traditional}.
+@end table
+
+Il valore di @code{do_lint} pu@`o cambiare se il codice @command{awk}
+modifica la variabile predefinita @code{LINT} (@pxref{Variabili predefinite}).
+Gli altri valori non dovrebbero cambiare durante l'esecuzione.
+
+@node Codice predefinito di un'estensione API
+@subsection Codice predefinito di interfaccia API
+
+Come gi@`a detto (@pxref{Panoramica sul meccanismo delle estensioni}),
+le definizioni di funzioni qui presentate sono in realt@`a delle macro.
+Per usare queste macro, l'estensione deve fornire una piccola quantit@`a di
+codice predefinito (variabili e
+funzioni) nella parte iniziale del file sorgente, usando dei nomi
+standard, come descritto qui sotto.  Il codice predefinito in questione @`e
+anche descritto nel file di intestazione @file{gawkapi.h}:
+
+@example
+@group
+/* Codice predefinito: */
+int plugin_is_GPL_compatible;
+
+static gawk_api_t *const api;
+@end group
+static awk_ext_id_t ext_id;
+static const char *ext_version = NULL; /* o @dots{} = "qualche stringa" */
+
+static awk_ext_func_t func_table[] = @{
+    @{ "name", do_name, 1, 0, awk_false, NULL @},
+    /* @dots{} */
+@};
+
+/* O: */
+
+static awk_bool_t (*init_func)(void) = NULL;
+
+/* OPPURE: */
+
+static awk_bool_t
+init_mia_estensione(void)
+@{
+    @dots{}
+@}
+
+static awk_bool_t (*init_func)(void) = init_mia_estensione;
+
+dl_load_func(func_table, qualche_nome, "name_space_in_quotes")
+@end example
+
+Queste variabili e funzioni sono:
+
+@table @code
+@item int plugin_is_GPL_compatible;
+Qui si dichiara che l'estensione @`e compatibile con
+@ifclear FOR_PRINT
+la licenza GNU GPL (@pxref{Copia}).
+
+@end ifclear
+@ifset FOR_PRINT
+la licenza GNU GPL.
+@end ifset
+Se l'estensione non ha questa variabile, non verr@`a caricata da @command{gawk}
+(@pxref{Licenza delle estensioni}).
+
+@item static gawk_api_t *const api;
+Questa variabile globale @code{static} dovrebbe essere impostata per
+puntare al puntatore
+@code{gawk_api_t} che @command{gawk} passa alla funzione (dell'estensione)
+@code{dl_load()}.  Questa variabile @`e usata da tutte le macro.
+
+@item static awk_ext_id_t ext_id;
+Questa variabile globale @code{static} dovrebbe essere impostata al valore
+@code{awk_ext_id_t} che @command{gawk} passa alla funzione @code{dl_load()}.
+Questa variabile @`e usata da tutte le macro.
+
+@item static const char *ext_version = NULL; /* o @dots{} = "qualche stringa" */
+Questa variabile globale @code{static} dovrebbe essere impostata
+a @code{NULL} oppure puntare a una stringa che contiene il nome e la
+versione dell'estensione.
+
+@item static awk_ext_func_t func_table[] = @{ @dots{} @};
+Questo @`e un vettore di una o pi@`u strutture @code{awk_ext_func_t},
+come descritto in precedenza (@pxref{Funzioni di estensione}).
+Pu@`o essere usato in seguito per pi@`u chiamate a
+@code{add_ext_func()}.
+
+@c Use @var{OR} for docbook
+@item static awk_bool_t (*init_func)(void) = NULL;
+@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @var{OR}
+@itemx static awk_bool_t init_mia_estensione(void) @{ @dots{} @}
+@itemx static awk_bool_t (*init_func)(void) = init_mia_estensione;
+Se qualche lavoro di inizializzazione @`e necessario, si dovrebbe definire una
+funzione all'uopo (crea variabili, apre file, etc.)
+e poi definire il puntatore @code{init_func} che punti alla funzione
+stessa.
+La funzione dovrebbe restituire @code{awk_@dfn{false}} se non va a buon fine
+o @code{awktrue} se tutto va bene.
+
+Se un'inizializzazione non @`e necessaria, si definisca il puntatore e
+lo si inizializzi a @code{NULL}.
+
+@item dl_load_func(func_table, qualche_nome, "nome_spazio_tra_doppi_apici")
+Questa macro genera una funzione @code{dl_load()} che far@`a
+tutte le inizializzazioni necessarie.
+@end table
+
+Lo scopo di tutte le variabili e dei vettori @`e di far s@`{@dotless{i}} che la
+funzione @code{dl_load()} (richiamata dalla macro @code{dl_load_func()})
+faccia tutto il lavoro standard necessario, qui descritto:
+
+@enumerate 1
+@item
+Controlla le versioni dell'API.  Se la versione principale dell'estensione
+non corrisponde a quella di @command{gawk} o se la versione secondaria
+dell'estensione @`e maggiore di quella di @command{gawk}, stampa un messaggio
+di errore fatale ed esce.
+
+@item
+Controlla le versioni di MPFR e GMP. Se non sono allo stesso livello con
+quelle in uso localmente, stampa un messaggio
+di errore fatale ed esce.
+
+@item
+Carica le funzioni definite in @code{func_table}.
+Se qualche caricamento non riesce, stampa un messaggio di
+avvertimento ma continua l'esecuzione.
+
+@item
+Se il puntatore @code{init_func} non @`e @code{NULL}, chiama la
+funzione da esso puntata.  Se questa restituisce @code{awk_false}, stampa un
+messaggio di avvertimento.
+
+@item
+Se @code{ext_version} non @`e @code{NULL}, registra la
+stringa di versione con @command{gawk}.
+@end enumerate
+
+@node Modifiche dalla versione API 1
+@subsection Modifiche dalla versione 1 dell'API
+
+La versione API corrente @emph{non} @`e compatibile a livello binario con la
+versione 1 dell'API.
+Le funzioni di estensione vanno ricompilate per poterle usare con la versione
+corrente di @command{gawk}.
+
+Fortunatamente, fatti salvi alcuni possibili avvertimenti a livello di
+compilazione, l'API rimane compatibile a livello di codice sorgente con la
+precedente versione API.  Le differenze pi@`u rilevanti sono gli ulteriori
+campi nella struttura @code{awk_ext_func_t}, e l'aggiunta del terzo argomento
+nella funzione di implementazione in linguaggio C.
+(@pxref{Funzioni di estensione}).
+
+Quella che segue @`e una lista di singole funzionalit@`a che sono
+state modificate nella versione 2 rispetto alla versione 1 dell'API:
+
+@itemize @bullet
+
+@item
+I valori numerici possono ora essere anche di tipo MPFR/MPZ
+(@pxref{Tipi di dati generali}).
+
+@item
+Ci sono nuovi tipi di stringa: @code{AWK_REGEX} e @code{AWK_STRNUM}
+(@pxref{Tipi di dati generali}).
+
+@item
+@`E disponibile la nuova macro @code{ezalloc()}
+(@pxref{Funzioni di allocazione memoria}).
+
+@item
+La struttura @code{awk_ext_func_t} @`e stata modificata.  Invece del
+parametro @code{num_expected_args}, ha ora i due parametri
+@code{max_expected} e @code{min_required}
+(@pxref{Funzioni di estensione}).
+
+@item
+In @code{get_record()}, un analizzatore di input pu@`o ora specificare
+l'ampiezza dei campi
+(@pxref{Analizzatori di input}).
+
+@item
+Le estensioni possono ora inviare messaggi di errore non fatali
+(@pxref{Stampare messaggi}).
+
+@item
+Quando di appiattisce un vettore, si pu@`o ora specificare il tipo
+dell'indice e quello dei valori
+(@pxref{Funzioni per i vettori}).
+
+@item
+C'@`e una nuova API, @code{get_file()}
+(@pxref{Ridirezione API}).
+@end itemize
+
+@node Trovare le estensioni
+@section Come @command{gawk} trova le estensioni compilate
+@cindex estensioni, percorso di ricerca per
+@cindex estensioni, come trovarle
+@cindex trovare le estensioni
+@cindex percorso di ricerca per estensioni
+
+Le estensioni compilate vanno installate in una directory dove
+@command{gawk} possa trovarle.  Se @command{gawk} @`e configurato e
+installato nella maniera di default, la directory dove trovare le
+estensioni @`e @file{/usr/local/lib/gawk}.  Si pu@`o anche specificare un
+percorso di ricerca contenente una lista di directory da esaminare per la
+ricerca di estensioni compilate.
+@xref{AWKLIBPATH (Variabile)} per ulteriori dettagli.
+
+@node Esempio di estensione
+@section Esempio: alcune funzioni per i file
+@cindex estensione, esempio
+@cindex esempio di estensione
+
+@quotation
+@i{In qualunque posto vai, l@`a tu sei.}
+@author Buckaroo Banzai
+@end quotation
+
+@c It's enough to show chdir and stat, no need for fts
+
+Due utili funzioni che non sono in @command{awk} sono @code{chdir()} (per
+permettere a un programma @command{awk} di cambiare directory di lavoro) e
+@code{stat()}
+(per far s@`{@dotless{i}} che un programma @command{awk} possa raccogliere informazioni
+su un dato file).
+Per illustrare l'azione dell'API, questa @value{SECTION} fornisce
+queste funzioni a @command{gawk} in un'estensione.
+
+@menu
+* Descrizione interna file::    Quello che le nuove funzioni faranno
+* Operazioni interne file::     Codice per gestire file all'interno
+* Usare operazioni interne file:: Come usare un'estensione esterna
+@end menu
+
+@node Descrizione interna file
+@subsection Usare @code{chdir()} e @code{stat()}
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} mostra come usare le nuove funzioni a
+livello di @command{awk} una volta che siano state integrate nell'interprete
+del programma @command{gawk} in esecuzione.  Usare @code{chdir()} @`e molto
+semplice.  Richiede un solo argomento, la nuova directory su cui
+posizionarsi:
+
+@example
+@@load "filefuncs"
+@dots{}
+newdir = "/home/arnold/funstuff"
+ret = chdir(newdir)
+if (ret < 0) @{
+    printf("non riesco a passare a %s: %s\n", newdir, ERRNO) > "/dev/stderr"
+    exit 1
+@}
+@dots{}
+@end example
+
+Il valore restituito @`e negativo se la chiamata a @code{chdir()} non @`e riuscita,
+ed @code{ERRNO} (@pxref{Variabili predefinite}) @`e impostato a una stringa
+che descrive l'errore.
+
+Usare @code{stat()} @`e un po' pi@`u complicato.  La funzione scritta in C
+@code{stat()} riempie una struttura che ha una certa quantit@`a di informazioni.
+La maniera corretta per immagazzinarle in @command{awk} @`e quella di riempire
+un vettore associativo con le informazioni appropriate:
+
+@c broke printf for page breaking
+@example
+file = "/home/arnold/.profile"
+ret = stat(file, fdata)
+if (ret < 0) @{
+    printf("non @`e stato possibile eseguire @command{stat} per %s: %s\n",
+             file, ERRNO) > "/dev/stderr"
+    exit 1
+@}
+printf("dimensione di %s @`e %d byte\n", file, fdata["size"])
+@end example
+
+La funzione @code{stat()} svuota sempre il vettore che contiene i dati,
+anche nel caso che la chiamata a @code{stat()} non riesca.  I seguenti
+elementi vengono restituiti dalla funzione:
+
+@table @code
+@item "name"
+Il nome del file oggetto della chiamata a @code{stat()}.
+
+@item "dev"
+@itemx "ino"
+I numeri di @dfn{device} e di @dfn{inode}, rispettivamente.
+
+@item "mode"
+Il modo del file, in formato numerico. Questo include sia il tipo di file che
+i suoi permessi di accesso.
+
+@item "nlink"
+Il numero di collegamenti fisici del file (stesso file con diversi nomi).
+
+@item "uid"
+@itemx "gid"
+Gli identificativi di utente e di gruppo del possessore del file.
+
+@item "size"
+La dimensione in byte del file.
+
+@item "blocks"
+Il numero di blocchi su disco realmente occupati dal file.  Questo pu@`o non
+essere
+proporzionale alla dimensione del file se il file ha delle lacune
+[ossia se solo alcune parti del file esistono veramente, il resto
+non @`e ancora stato riempito].
+
+@item "atime"
+@itemx "mtime"
+@itemx "ctime"
+La data e ora dell'ultimo accesso, modifica, e aggiornamento dell'@dfn{inode},
+rispettivamente.  Questi sono delle marcature temporali numeriche
+(misurate in secondi dal
+01 gennaio 1970), che possono essere formattate dalla funzione
+@code{strftime()}
+(@pxref{Funzioni di tempo}).
+
+@item "pmode"
+La modalit@`a stampabile (``printable mode'') del file.
+Questo @`e una stringa che rappresenta
+il tipo del file e i permessi di accesso, come sono visualizzati da
+@samp{ls -l}---per esempio, @code{"drwxr-xr-x"}.
+
+@item "type"
+Una stringa stampabile che descrive il tipo di file.  Il valore @`e uno dei
+seguenti:
+
+@table @code
+@item "blockdev"
+@itemx "chardev"
+Il file @`e un dispositico a blocchi o a caratteri (``file speciale'').
+
+@ignore
+@item "door"
+The file is a Solaris ``door'' (special file used for
+interprocess communications).
+@end ignore
+
+@item "directory"
+Il file @`e una directory.
+
+@item "fifo"
+Il file @`e una @dfn{pipe} denominata (nota anche come FIFO [First In First
+Out]).
+
+@item "file"
+Il file @`e un file normale.
+
+@item "@dfn{socket}"
+Il file @`e un @dfn{socket} @code{AF_UNIX} (``Unix domain'') nel
+filesystem.
+
+@item "symlink"
+Il file @`e un collegamento simbolico.
+@end table
+
+@c 5/2013: Thanks to Corinna Vinschen for this information.
+@item "devbsize"
+La dimensione di un blocco per l'elemento indicizzato da @code{"blocks"}.
+Questa informazione @`e derivata dalla costante @code{DEV_BSIZE}
+definita in @code{<sys/param.h>} nella maggior parte dei sistemi,
+o dalla costante @code{S_BLKSIZE} in @code{<sys/stat.h>} nei sistemi BSD.
+Per alcuni altri sistemi il valore si basa su una conoscenza @dfn{a priori}
+delle caratteristiche di un particolare sistema.
+Se non si riesce a determinare il valore, viene
+restituito quello di default, che @`e 512.
+@end table
+
+Possono essere presenti diversi altri elementi, a seconda del
+sistema operativo e del tipo di file.
+Si pu@`o controllarne la presenza dal programma @command{awk} per mezzo
+dell'operatore @code{in}
+(@pxref{Visitare elementi}):
+
+@table @code
+@item "blksize"
+La dimensione preferita di un blocco per effettuare operazioni di I/O sul file.
+Questo campo non @`e presente nella struttura C @code{stat} di tutti i sistemi
+che rispettano lo standard POSIX.
+
+@item "linkval"
+Se il file @`e un collegamento simbolico, questo elemento @`e il nome del
+file puntato dal collegamento simbolico (cio@`e, il valore del collegamento).
+
+@item "rdev"
+@itemx "major"
+@itemx "minor"
+Se il file @`e un dispositivo a blocchi o a caratteri, questi valori
+rappresentano il numero del dispositivo e, rispettivamente, le componenti
+principale e secondaria di quel numero.
+@end table
+
+@node Operazioni interne file
+@subsection Codice C per eseguire @code{chdir()} e @code{stat()}
+
+Questo @`e il codice C per queste estensioni.@footnote{La versione qui
+presentata @`e
+lievemente modificata per amor di semplicit@`a.  Si veda @file{extension/filefuncs.c}
+nella distribuzione @command{gawk} per la versione completa.}
+
+Il file include alcuni file di intestazione standard, e poi il file di
+intestazione @file{gawkapi.h}, che fornisce le definizioni dell'API.
+A queste seguono le dichiarazioni di variabili, necessarie
+per usare le macro dell'API e il codice predefinito
+(@pxref{Codice predefinito di un'estensione API}):
+
+@example
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#include "gawkfts.h"
+#include "stack.h"
+
+static const gawk_api_t *api;    /* per consentire il funzionamento
+                                    delle macro di utilit@`a */
+static awk_ext_id_t ext_id;
+static awk_bool_t init_filefuncs(void);
+static awk_bool_t (*init_func)(void) = init_filefuncs;
+static const char *ext_version = "filefuncs extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+@end example
+
+@cindex programmazione, convenzioni di, estensioni @command{gawk}
+@cindex estensioni @command{gawk}, convenzioni di programmazione
+Per convenzione, per una funzione @command{awk} di nome @code{pippo()},
+la funzione C che la implementa @`e chiamata @code{do_pippo()}.  La funzione
+dovrebbe avere due argomenti.  Il primo @`e un numero @code{int}, chiamato
+@code{nargs}, che rappresenta il numero di argomenti passato alla funzione.
+Il secondo @`e un puntatore a una struttura @code{awk_value_t}, normalmente
+chiamata @code{risultato}:
+
+@example
+@group
+/*  do_chdir --- fornisce funzione chdir()
+                 caricata dinamicamente per gawk */
+
+static awk_value_t *
+do_chdir(int nargs, awk_value_t *risultato, struct awk_ext_func *non_usata)
+@end group
+@{
+    awk_value_t newdir;
+    int ret = -1;
+
+    assert(risultato != NULL);
+@end example
+
+La variabile @code{newdir}
+rappresenta la nuova directory nella quale cambiare, che @`e ottenuta
+tramite la funzione @code{get_argument()}.  Si noti che il primo argomento @`e
+quello numero zero.
+
+Se l'argomento @`e stato trovato con successo, la funzione invoca la chiamata di
+sistema @code{chdir()}.  In caso contrario, se la @code{chdir()} non riesce,
+viene aggiornata la variabile @code{ERRNO}:
+
+@example
+    if (get_argument(0, AWK_STRING, & newdir)) @{
+        ret = chdir(newdir.str_value.str);
+        if (ret < 0)
+            update_ERRNO_int(errno);
+    @}
+@end example
+
+Infine, la funzione restituisce il codice di ritorno da @code{chdir} a
+livello di @command{awk}:
+
+@example
+    return make_number(ret, risultato);
+@}
+@end example
+
+L'estensione @code{stat()} @`e pi@`u impegnativa.  Dapprima abbiamo
+una funzione che trasforma la stringa di autorizzazione numerica
+(@dfn{mode}) in una rappresentazione stampabile
+(p.es., il codice ottale @code{0644} diviene @samp{-rw-r--r--}). Questa
+parte @`e qui omessa per brevit@`a.
+
+@example
+/* format_mode --- trasforma il campo @dfn{mode} di @dfn{stat}
+                   in qualcosa di leggibile */
+
+static char *
+format_mode(unsigned long fmode)
+@{
+    @dots{}
+@}
+@end example
+
+Viene poi una funzione per leggere dei collegamenti simbolici, anche questa
+omessa per brevit@`a:
+
+@example
+/* read_symlink --- legge un collegamento simbolico in un buffer
+   allocato.
+   @dots{} */
+
+static char *
+read_symlink(const char *fname, size_t bufsize, ssize_t *linksize)
+@{
+    @dots{}
+@}
+@end example
+
+Due funzioni ausiliarie semplificano l'immissione di valori nel
+vettore che conterr@`a il risultato della chiamata a @code{stat()}:
+
+@example
+/* array_set --- imposta un elemento di un vettore */
+
+static void
+array_set(awk_array_t vettore, const char *sub, awk_value_t *valore)
+@{
+    awk_value_t index;
+
+    set_array_element(vettore,
+                      make_const_string(sub, strlen(sub), & index),
+                      valore);
+
+@}
+
+/* array_set_numeric --- imposta un elemento di un vettore con un
+   numero */
+
+static void
+array_set_numeric(awk_array_t vettore, const char *sub, double num)
+@{
+    awk_value_t tmp;
+
+    array_set(vettore, sub, make_number(num, & tmp));
+@}
+@end example
+
+La seguente funzione fa il grosso del lavoro per riempire il vettore dei
+risultati @code{awk_array_t} con valori ottenuti
+da una @code{struct stat} valida.  Questo lavoro @`e fatto in una funzione
+separata per supportare sia la funzione
+@code{stat()} per @command{gawk}, che l'estensione @code{fts()},
+che @`e inclusa nello stesso file, ma non
+ @`e mostrata qui
+(@pxref{Esempio di estensione funzioni file}).
+
+La prima parte della funzione @`e la dichiarazione delle variabili,
+compresa una tabella per tradurre i tipi di file in stringhe:
+
+@example
+/* fill_stat_array --- fa il lavoro di riempire un
+                       vettore con informazioni da stat */
+
+static int
+fill_stat_array(const char *nome, awk_array_t vettore, struct stat *sbuf)
+@{
+    char *pmode;    /* @dfn{mode} stampabile */
+    const char *type = "unknown";
+    awk_value_t tmp;
+    static struct ftype_map @{
+        unsigned int mask;
+        const char *type;
+    @} ftype_map[] = @{
+        @{ S_IFREG, "file" @},
+        @{ S_IFBLK, "blockdev" @},
+        @{ S_IFCHR, "chardev" @},
+        @{ S_IFDIR, "directory" @},
+#ifdef S_IFSOCK
+        @{ S_IFSOCK, "socket" @},
+#endif
+#ifdef S_IFIFO
+        @{ S_IFIFO, "fifo" @},
+#endif
+#ifdef S_IFLNK
+        @{ S_IFLNK, "symlink" @},
+#endif
+#ifdef S_IFDOOR /* Stranezza Solaris */
+        @{ S_IFDOOR, "door" @},
+#endif
+    @};
+    int j, k;
+@end example
+
+Il vettore di destinazione @`e svuotato di elementi, e poi il codice riempie
+i vari elementi prendendoli dai valori presenti in @code{struct stat}:
+@example
+    /* svuota il vettore */
+    clear_array(vettore);
+
+    /* riempie il vettore */
+    array_set(vettore, "name", make_const_string(nome, strlen(nome),
+                                               & tmp));
+    array_set_numeric(vettore, "dev", sbuf->st_dev);
+    array_set_numeric(vettore, "ino", sbuf->st_ino);
+    array_set_numeric(vettore, "mode", sbuf->st_mode);
+    array_set_numeric(vettore, "nlink", sbuf->st_nlink);
+    array_set_numeric(vettore, "uid", sbuf->st_uid);
+    array_set_numeric(vettore, "gid", sbuf->st_gid);
+    array_set_numeric(vettore, "size", sbuf->st_size);
+    array_set_numeric(vettore, "blocks", sbuf->st_blocks);
+    array_set_numeric(vettore, "atime", sbuf->st_atime);
+    array_set_numeric(vettore, "mtime", sbuf->st_mtime);
+    array_set_numeric(vettore, "ctime", sbuf->st_ctime);
+
+    /* per dispositivi a blocchi o carattere, aggiunge rdev,
+       e il numero principale e secondario */
+    if (S_ISBLK(sbuf->st_mode) || S_ISCHR(sbuf->st_mode)) @{
+        array_set_numeric(vettore, "rdev", sbuf->st_rdev);
+        array_set_numeric(vettore, "major", major(sbuf->st_rdev));
+        array_set_numeric(vettore, "minor", minor(sbuf->st_rdev));
+    @}
+@end example
+
+@noindent
+L'ultima parte della funzione fa alcune aggiunte selettive
+al vettore di destinazione, a seconda che siano disponibili o no
+certi campi e/o il tipo del file.  Viene poi restituito zero, per indicare che
+tutto @`e andato bene:
+
+@example
+@group
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+    array_set_numeric(vettore, "blksize", sbuf->st_blksize);
+#endif
+@end group
+
+    pmode = format_mode(sbuf->st_mode);
+    array_set(vettore, "pmode", make_const_string(pmode, strlen(pmode),
+                                                & tmp));
+
+    /* per collegamenti simbolici, si aggiunge un campo linkval */
+    if (S_ISLNK(sbuf->st_mode)) @{
+        char *buf;
+        ssize_t linksize;
+
+        if ((buf = read_symlink(nome, sbuf->st_size,
+                    & linksize)) != NULL)
+            array_set(vettore, "linkval",
+                      make_malloced_string(buf, linksize, & tmp));
+        else
+            warning(ext_id, _("stat: non riesco a leggere il \
+collegamento simbolico `%s'"),
+                    nome);
+    @}
+
+    /* aggiunge il tipo di campo */
+   type = "unknown";   /* non dovrebbe succedere */
+   for (j = 0, k = sizeof(ftype_map)/sizeof(ftype_map[0]); j < k; j++) @{
+       if ((sbuf->st_mode & S_IFMT) == ftype_map[j].mask) @{
+           type = ftype_map[j].type;
+           break;
+       @}
+   @}
+
+   array_set(vettore, "type", make_const_string(type, strlen(type), & tmp));
+
+   return 0;
+@}
+@end example
+
+Del terzo argomento passato a @code{stat()} non si era ancora parlato.
+Questo argomento @`e opzionale.  Se presente, dice a @code{do_stat()} di
+usare la chiamata di sistema @code{stat()} invece della chiamata di sistema
+@code{lstat()}.  Questo avviene attraverso un puntatore a funzione:
+@code{statfunc}.
+@code{statfunc} @`e inizializzato per puntare a @code{lstat()} (invece che a
+@code{stat()}) per ottenere le informazioni relative al file, nel caso che
+il file in questione sia un
+collegamento simbolico.  Tuttavia, se il terzo argomento @`e specificato,
+@code{statfunc} viene modificato in modo da puntare a @code{stat()}.
+
+Ecco la funzione @code{do_stat()}, che inizia con la dichiarazione delle
+variabili e un controllo degli argomenti passati dal chiamante:
+
+@example
+/* do_stat --- fornisce una funzione stat() per gawk */
+
+static awk_value_t *
+do_stat(int nargs, awk_value_t *risultato, struct awk_ext_func *non_usata)
+@{
+    awk_value_t file_param, array_param;
+    char *nome;
+    awk_array_t vettore;
+    int ret;
+    struct stat sbuf;
+    /* per default si usa lstat() */
+    int (*statfunc)(const char *path, struct stat *sbuf) = lstat;
+
+    assert(risultato != NULL);
+@end example
+
+A questo punto inizia l'elaborazione vera e propria.  Per prima cosa, la
+funzione esamina gli argomenti.
+Poi, ottiene le informazioni relative al file.  Se la funzione chiamata
+(@code{lstat()} o @code{stat()}) restituisce un errore, il codice imposta
+@code{ERRNO} e torna al chiamante:
+
+@example
+    /* file @`e il primo argomento,
+       il vettore per contenere i risultati @`e il secondo */
+    if (   ! get_argument(0, AWK_STRING, & file_param)
+        || ! get_argument(1, AWK_ARRAY, & array_param)) @{
+        warning(ext_id, _("stat: parametri errati"));
+        return make_number(-1, risultato);
+    @}
+
+    if (nargs == 3) @{
+        statfunc = stat;
+    @}
+
+    nome = file_param.str_value.str;
+    vettore = array_param.array_cookie;
+
+    /* svuota sempre il vettore all'inizio */
+    clear_array(vettore);
+
+    /* chiama stat per il file;
+       in caso di errore,
+       imposta ERRNO e ritorna */
+    ret = statfunc(nome, & sbuf);
+@group
+    if (ret < 0) @{
+        update_ERRNO_int(errno);
+        return make_number(ret, risultato);
+    @}
+@end group
+@end example
+
+Il lavoro noioso @`e svolto da @code{fill_stat_array()}, visto in
+precedenza.  Alla fine, la funzione restituisce il codice di ritorno
+impostato da @code{fill_stat_array()}:
+
+@example
+@group
+    ret = fill_stat_array(nome, vettore, & sbuf);
+
+    return make_number(ret, risultato);
+@}
+@end group
+@end example
+
+Infine, @`e necessario fornire la ``colla'' che aggrega
+le nuove funzioni a @command{gawk}.
+
+L'estensione @code{filefuncs} comprende anche una funzione
+@code{fts()}, qui omessa
+(@pxref{Esempio di estensione funzioni file}).
+@`E anche prevista una funzione di
+inizializzazione:
+
+@example
+/* init_filefuncs --- routine di initializazione */
+
+static awk_bool_t
+init_filefuncs(void)
+@{
+    @dots{}
+@}
+@end example
+
+Siamo quasi alla fine.  Serve un vettore di strutture @code{awk_ext_func_t}
+per caricare ogni funzione in @command{gawk}:
+
+@example
+static awk_ext_func_t func_table[] = @{
+    @{ "chdir", do_chdir, 1, 1, awk_false, NULL @},
+    @{ "stat",  do_stat, 3, 2, awk_false, NULL @},
+    @dots{}
+@};
+@end example
+
+Ogni estensione deve avere una routine di nome @code{dl_load()} per caricare
+tutto ci@`o che occorre caricare.  La cosa pi@`u semplice @`e di usare la macro
+@code{dl_load_func()} in @code{gawkapi.h}:
+
+@example
+/* definizione della funzione dl_load()
+   usando la macro standard */
+
+dl_load_func(func_table, filefuncs, "")
+@end example
+
+Abbiamo finito!
+
+@node Usare operazioni interne file
+@subsection Integrare le estensioni
+
+@cindex @command{gawk}, aggiungere funzionalit@`a a
+@cindex funzionalit@`a, aggiungere a @command{gawk}
+@cindex aggiungere funzionalit@`a a @command{gawk}
+Dopo aver scritto il codice, dev'essere possibile aggiungerlo in fase
+di esecuzione all'interprete @command{gawk}.  Per prima cosa, il codice
+va compilato.  Supponendo che le funzioni siano in
+un file di nome @file{filefuncs.c}, e che @var{idir} sia la posizione
+del file di intestazione @file{gawkapi.h},
+i seguenti passi@footnote{In pratica, si potrebbe decidere di usare
+i comandi GNU Autotools (Automake, Autoconf, Libtool, e @command{gettext})
+per configurare e costruire le librerie necessarie.  L'esposizione di come
+ci@`o pu@`o essere fatto esula dal tema di questo @value{DOCUMENT}.
+@xref{gawkextlib} per i puntatori a siti Internet che permettono di accedere
+a questi strumenti.} creano una libreria condivisa GNU/Linux:
+
+@example
+$ @kbd{gcc -fPIC -shared -DHAVE_CONFIG_H -c -O -g -I@var{idir} filefuncs.c}
+$ @kbd{gcc -o filefuncs.so -shared filefuncs.o}
+@end example
+
+Una volta creata la libreria, questa viene caricata usando la parola
+chiave @code{@@load}:
+
+@example
+# file testff.awk
+@@load "filefuncs"
+
+BEGIN @{
+    "pwd" | getline curdir  # salva la directory corrente
+    close("pwd")
+
+    chdir("/tmp")
+    system("pwd")   # verifica l'avvenuto cambio di directory
+    chdir(curdir)   # torna indietro
+
+    print "Info per testff.awk"
+    ret = stat("testff.awk", data)
+    print "ret =", ret
+    for (i in data)
+        printf "data[\"%s\"] = %s\n", i, data[i]
+    print "testff.awk modified:",
+        strftime("%m %d %Y %H:%M:%S", data["mtime"])
+
+    print "\nInfo per JUNK"
+    ret = stat("JUNK", data)
+    print "ret =", ret
+    for (i in data)
+        printf "data[\"%s\"] = %s\n", i, data[i]
+    print "JUNK modified:", strftime("%m %d %Y %H:%M:%S", data["mtime"])
+@}
+@end example
+
+La variabile d'ambiente @env{AWKLIBPATH} dice a
+@command{gawk} dove @`e possibile trovare le estensioni (@pxref{Trovare le estensioni}).
+La variabile viene impostata alla directory corrente, e quindi viene eseguito
+il programma:
+
+@example
+$ @kbd{AWKLIBPATH=$PWD gawk -f testff.awk}
+@print{} /tmp
+@print{} Info per testff.awk
+@print{} ret = 0
+@print{} data["blksize"] = 4096
+@print{} data["devbsize"] = 512
+@print{} data["mtime"] = 1412004710
+@print{} data["mode"] = 33204
+@print{} data["type"] = file
+@print{} data["dev"] = 2053
+@print{} data["gid"] = 1000
+@print{} data["ino"] = 10358899
+@print{} data["ctime"] = 1412004710
+@print{} data["blocks"] = 8
+@print{} data["nlink"] = 1
+@print{} data["name"] = testff.awk
+@print{} data["atime"] = 1412004716
+@print{} data["pmode"] = -rw-rw-r--
+@print{} data["size"] = 666
+@print{} data["uid"] = 1000
+@print{} testff.awk modified: 09 29 2014 18:31:50
+@print{}
+@print{} Info per JUNK
+@print{} ret = -1
+@print{} JUNK modified: 01 01 1970 02:00:00
+@end example
+
+@node Esempi di estensione
+@section Le estensioni di esempio incluse nella distribuzione @command{gawk}
+@cindex estensioni distribuite con @command{gawk}
+
+Questa @value{SECTION} fornisce una breve panoramica degli esempi di
+estensione inclusi nella distribuzione di @command{gawk}.  Alcune di esse
+sono destinate per l'uso in produzione (p.es., le estensioni
+@code{filefuncs}, @code{readdir}, e
+@code{inplace}).  Altre sono state scritte principalmente per mostrare come
+si usa l'estensione API.
+
+@menu
+* Esempio di estensione funzioni file:: L'esempio che usa funzioni file.
+* Esempio di estensione Fnmatch::       Un'interfaccia a @code{fnmatch()}.
+* Esempio di estensione Fork::          Un'interfaccia a @code{fork()} e
+                                        altre funzioni di processo.
+* Esempio di estensione Inplace::       Consentire modifica diretta dei file.
+* Esempio di estensione Ord::           Conversioni a valore e a stringa di
+                                        caratteri.
+* Esempio di estensione Readdir::       Un'interfaccia a @code{readdir()}.
+* Esempio di estensione Revout::        Semplice post-processore per
+                                        invertire la stringa in output.
+* Esempio di estensione Rev2way::       Processore bidirezionale per
+                                        invertire la stringa in output.
+* Esempio di estensione Rwarray:: Serializzare il vettore in un
+                                        file.
+* Esempio di estensione Readfile::      Leggere un intero file in una stringa.
+* Esempio di estensione Time::          Un'interfaccia a @code{gettimeofday()}
+                                      e @code{sleep()}.
+* Esempio di estensione API Test::    Test per la API.
+@end menu
+
+@node Esempio di estensione funzioni file
+@subsection Funzioni relative ai file
+
+L'estensione @code{filefuncs} include tre funzioni diverse, come descritto sotto.
+L'uso @`e il seguente:
+
+@table @asis
+@item @code{@@load "filefuncs"}
+Questo @`e il modo per caricare l'estensione.
+
+@cindex @code{chdir()}, estensione
+@cindex estensione @code{chdir()}
+@item @code{risultato = chdir("/qualche/directory")}
+La funzione @code{chdir()} invoca a sua volta la chiamata di sistema
+@code{chdir()} per cambiare la directory corrente.  Restituisce zero
+se tutto va bene o un valore minore di zero in caso di errore.
+In quest'ultimo caso, viene aggiornata la variabile @code{ERRNO}.
+
+@cindex @code{stat()}, estensione
+@cindex estensione @code{stat()}
+@item @code{risultato = stat("/qualche/percorso", statdata} [@code{, follow}]@code{)}
+La funzione @code{stat()} invoca a sua volta la chiamata di sistema
+@code{stat()}.
+Restituisce zero se tutto va bene o un valore minore di zero in caso di
+errore.
+In quest'ultimo caso, viene aggiornata la variabile @code{ERRNO}.
+
+Per default, viene usata la chiamata di sistema @code{lstat()}.
+Tuttavia, se alla funzione viene passato un terzo argomento, questa invoca
+invece @code{stat()}.
+
+In tutti i casi, il vettore @code{statdata} viene preventivamente svuotato.
+Quando la chiamata a @code{stat()} riesce, viene riempito il vettore
+@code{statdata} con le informazioni ottenute dal fileystem, come segue:
+
+@multitable @columnfractions .15 .50 .20
+@headitem Indice @tab Campo in @code{struct stat} @tab Tipo file
+@item @code{"name"} @tab Il @value{FN} @tab Tutti
+@item @code{"dev"} @tab @code{st_dev} @tab Tutti
+@item @code{"ino"} @tab @code{st_ino} @tab Tutti
+@item @code{"mode"} @tab @code{st_mode} @tab Tutti
+@item @code{"nlink"} @tab @code{st_nlink} @tab Tutti
+@item @code{"uid"} @tab @code{st_uid} @tab Tutti
+@item @code{"gid"} @tab @code{st_gid} @tab Tutti
+@item @code{"size"} @tab @code{st_size} @tab Tutti
+@item @code{"atime"} @tab @code{st_atime} @tab Tutti
+@item @code{"mtime"} @tab @code{st_mtime} @tab Tutti
+@item @code{"ctime"} @tab @code{st_ctime} @tab Tutti
+@item @code{"rdev"} @tab @code{st_rdev} @tab Dispositivi
+@item @code{"major"} @tab @code{st_major} @tab Dispositivi
+@item @code{"minor"} @tab @code{st_minor} @tab Dispositivi
+@item @code{"blksize"} @tab @code{st_blksize} @tab Tutti
+@item @code{"pmode"} @tab Una versione leggibile del valore dell'autorizzazione,
+come quello stampato dal comando
+@command{ls} (per esempio, @code{"-rwxr-xr-x"}) @tab Tutti
+@item @code{"linkval"} @tab Il valore del collegamento simbolico @tab
+Collegamenti simbolici
+@item @code{"type"} @tab Il tipo del file in formato stringa---pu@`o essere
+@code{"file"},
+@code{"blockdev"},
+@code{"chardev"},
+@code{"directory"},
+@code{"socket"},
+@code{"fifo"},
+@code{"symlink"},
+@code{"door"}
+o
+@code{"unknown"}
+(non tutti i sistemi supportano tutti i tipi file) @tab Tutti
+@end multitable
+
+@cindex @code{fts()}, estensione
+@cindex estensione @code{fts()}
+@item @code{flags = or(FTS_PHYSICAL, ...)}
+@itemx @code{risultato = fts(pathlist, flags, filedata)}
+Percorre gli alberi di file elencati in @code{pathlist} e riempie il vettore
+@code{filedata}, come descritto qui di seguito.  @code{flags} @`e l'operazione
+@dfn{OR} @dfn{bit} a @dfn{bit} di parecchi valori predefiniti, pure descritti
+pi@`u sotto.
+Restituisce zero in assenza di errori, in caso contrario restituisce @minus{}1.
+@end table
+
+La funzione @code{fts()} invoca a sua volta la routine di libreria C
+@code{fts()} per percorrere gerarchie di file.  Invece di restituire i dati
+relativi ai file uno per volta in sequenza,
+riempie un vettore multidimensionale con i dati di ogni file e directory
+che risiedono nelle gerarchie richieste.
+
+Gli argomenti sono i seguenti:
+
+@table @code
+@item pathlist
+Un vettore di @value{FNS}.  Sono usati i valori dei singoli elementi;
+gli indici che puntano a tali valori vengono ignorati.
+
+@item flags
+Questo dovrebbe essere l'@dfn{OR} @dfn{bit} a @dfn{bit} di uno o pi@`u dei
+seguenti valori dei flag costanti predefiniti.
+Almeno uno dei due flag @code{FTS_LOGICAL}
+o @code{FTS_PHYSICAL} dev'essere impostato; in caso contrario
+@code{fts()} restituisce una segnalazione di errore e imposta @code{ERRNO}.
+I flag sono:
+
+@c nested table
+@table @code
+@item FTS_LOGICAL
+Passa in rassegna i file in modo ``logico'', e quindi l'informazione restituita
+per un collegamento simbolico @`e quella relativa al file puntato, e non al
+collegamento simbolico stesso.  Questo flag @`e mutuamente esclusivo con
+@code{FTS_PHYSICAL}.
+
+@item FTS_PHYSICAL
+Passa in rassegna i file in modo ``fisico'', e quindi l'informazione restituita
+per un collegamento simbolico @`e quella relativa al collegamento simbolico
+stesso.  Questo flag @`e mutuamente esclusivo con @code{FTS_LOGICAL}.
+
+@item FTS_NOCHDIR
+Per migliorare le prestazioni, la routine di libreria C @code{fts()}
+cambia directory mentre percorre una gerarchia di file.  Questo flag
+disabilita quell'ottimizzazione.
+
+@item FTS_COMFOLLOW
+Si accede al file puntato da un collegamento simbolico esistente in @code{pathlist},
+anche se @code{FTS_LOGICAL} non @`e stato impostato.
+
+@item FTS_SEEDOT
+Per default, la routine di libreria C @code{fts()} non restituisce
+informazioni per i file
+@file{"."} (punto) e @file{".."} (punto-punto).  Quest'opzione richiede
+l'informazione anche per @file{".."}.  (L'estensione ritorna sempre
+l'informazione per @file{"."}; maggiori dettagli pi@`u sotto.)
+
+@item FTS_XDEV
+Mentre si percorre un filesystem, non passare mai a un filesystem montato
+diverso da quello in cui si opera.
+@c Pu@`o succedere nel caso di collegamenti simbolici, che contengono un nome di file
+@c che si trova da tutt'altra parte
+@c lrwxrwxrwx 1 root root 6 ago  6  2015 /aca -> /d/aca
+@c /d/aca:
+@c /dev/sda6       115234344 15648380  93709280  15% /d
+@c / (e il collegamento simbolico /aca)
+@c /dev/sda1        37308224 13573368  21816644  39% /
+@end table
+
+@item filedata
+Il vettore @code{filedata} contiene i risultati.
+La funzione @code{fts()} lo svuota all'inizio.  In seguito viene creato
+un elemento in @code{filedata} per ogni elemento in @code{pathlist}.
+L'indice @`e il nome della directory o del file specificato in @code{pathlist}.
+L'elemento puntato da questo indice @`e a sua volta un vettore.  Ci sono due
+casi:
+
+@c nested table
+@table @emph
+@item Il percorso @`e un file
+In questo caso, il vettore contiene due o tre elementi:
+
+@c doubly nested table
+@table @code
+@item "path"
+Il percorso completo di questo file, a partire dalla directory radice (``root'')
+indicata nel vettore @code{pathlist}.
+
+@item "stat"
+Questo elemento @`e esso stesso un vettore, contenente le stesse informazioni
+fornite dalla funzione @code{stat()} vista in precedenza a proposito del suo
+argomento
+@code{statdata}.  L'elemento pu@`o non essere presente se la chiamata
+di sistema @code{stat()} per il file non @`e riuscita.
+
+@item "error"
+Se qualche tipo di errore si verifica durante l'elaborazione, il vettore
+conterr@`a anche un elemento con chiave @code{"error"}, che @`e una stringa
+che descrive l'errore.
+@end table
+
+@item Il percorso @`e una directory
+In questo caso, nel vettore viene creato un elemento per ogni elemento
+contenuto nella directory.  Se un elemento della directory @`e un
+file, l'azione del programma @`e la stessa descritta sopra per un file.
+Se invece la directory contiene delle sottodirectory, l'elemento creato
+nel vettore @`e (ricorsivamente) a sua volta un vettore che descrive la
+sottodirectory.  Se fra i flag @`e stato
+specificato il flag @code{FTS_SEEDOT},
+ci sar@`a anche un elemento di nome
+@code{".."}.  Questo elemento sar@`a un vettore contenente i dati restituiti
+da un'invocazione di @code{stat()}.
+
+Inoltre, ci sar@`a un elemento il cui indice @`e @code{"."}.
+Questo elemento @`e un vettore contenente gli stessi due o tre elementi che
+sono messi a disposizione per un file: @code{"path"}, @code{"stat"},
+ed @code{"error"}.
+@end table
+@end table
+
+La funzione @code{fts()} restituisce zero in assenza di errori.
+in caso contrario, restituisce @minus{}1.
+
+@quotation NOTA
+L'estensione @code{fts()} non imita esattamente l'interfaccia fornita dalla
+routine di libreria C @code{fts()}, ma sceglie di fornire un'interfaccia
+basata sui vettori associativi, che @`e pi@`u adeguata per l'uso da parte di un
+programma @command{awk}.  Questo
+implica la mancanza di una funzione di
+confronto, poich@'e @command{gawk} gi@`a
+prevede la possibilit@`a di mettere facilmente nell'ordine desiderato gli
+elementi di un vettore.
+Anche se un'interfaccia modellata su @code{fts_read()} avrebbe potuto essere
+fornita, @`e sembrato pi@`u naturale mettere a disposizione un vettore
+multidimensionale, che rappresenta la gerarchia dei file e le informazioni
+relative a ognuno di essi.
+@end quotation
+
+Si veda il file @file{test/fts.awk} nella distribuzione di @command{gawk}
+per un esempio di uso dell'estensione @code{fts()}.
+
+@node Esempio di estensione Fnmatch
+@subsection Un'interfaccia a @code{fnmatch()}
+
+Quest'estensione fornisce un'interfaccia per utilizzare la funzione di
+libreria C @code{fnmatch()}.  Si usa cos@`{@dotless{i}}:
+
+@table @code
+@item @@load "fnmatch"
+@`E questo il modo per caricare l'estensione.
+
+@cindex @code{fnmatch()}, estensione
+@cindex estensione @code{fnmatch()}
+@item risultato = fnmatch(pattern, stringa, flags)
+Il valore restituito @`e zero se tutto va bene, oppure @code{FNM_NOMATCH}
+se la funzione non ha trovato alcuna corrispondenza, o
+un valore differente, diverso da zero, se si @`e verificato un errore.
+@end table
+
+Oltre a rendere disponibile la funzione @code{fnmatch()}, l'estensione
+di @code{fnmatch} definisce una costante (@code{FNM_NOMATCH}), e un vettore
+con dei valori di flag, di nome @code{FNM}.
+
+Gli argomenti per @code{fnmatch()} sono:
+
+@table @code
+@item pattern
+L'espressione regolare con cui confrontare @value{FN}
+
+@item stringa
+La stringa @value{FN}
+
+@item flags
+Pu@`o valere zero o essere l'@dfn{OR} @dfn{bit} a @dfn{bit} di uno o pi@`u flag
+nel vettore @code{FNM}
+@end table
+
+I flag sono i seguenti:
+
+@multitable @columnfractions .40 .60
+@headitem Elemento del vettore @tab Flag corrispondente definito da @code{fnmatch()}
+@item @code{FNM["CASEFOLD"]} @tab @code{FNM_CASEFOLD}
+@item @code{FNM["FILE_NAME"]} @tab @code{FNM_FILE_NAME}
+@item @code{FNM["LEADING_DIR"]} @tab @code{FNM_LEADING_DIR}
+@item @code{FNM["NOESCAPE"]} @tab @code{FNM_NOESCAPE}
+@item @code{FNM["PATHNAME"]} @tab @code{FNM_PATHNAME}
+@item @code{FNM["PERIOD"]} @tab @code{FNM_PERIOD}
+@end multitable
+
+Ecco un esempio:
+
+@example
+@@load "fnmatch"
+@dots{}
+flags = or(FNM["PERIOD"], FNM["NOESCAPE"])
+if (fnmatch("*.a", "pippo.c", flags) == FNM_NOMATCH)
+    print "nessuna corrispondenza"
+@end example
+
+@node Esempio di estensione Fork
+@subsection Un'interfaccia a @code{fork()}, @code{wait()}, e @code{waitpid()}
+
+L'estensione @code{fork} mette a disposizione tre funzioni, come segue:
+
+@table @code
+@item @@load "fork"
+Questo @`e il modo per caricare l'estensione.
+
+@cindex @code{fork()}, estensione
+@cindex estensione @code{fork()}
+@item pid = fork()
+Questa funzione crea un nuovo processo. Il valore restituito @`e zero nel
+processo ``figlio'' e il numero che identifica il nuovo processo
+(@dfn{pid}) nel processo ``padre'', o @minus{}1
+in caso di errore. In quest'ultimo caso, @code{ERRNO} indica il problema.
+Nel processo figlio, gli elementi @code{PROCINFO["pid"]} e
+@code{PROCINFO["ppid"]} vengono aggiornati per riflettere i valori corretti.
+
+@cindex @code{waitpid()}, estensione
+@cindex estensione @code{waitpid()}
+@item ret = waitpid(pid)
+Questa funzione ha un unico argomento numerico, l'identificativo del processo
+di cui aspettare l'esito. Il codice di ritorno @`e quello restituito dalla
+chiamata di sistema @code{waitpid()}.
+
+@cindex @code{wait()}, estensione
+@cindex estensione @code{wait()}
+@item ret = wait()
+Questa funzione attende che il primo processo ``figlio'' termini.
+Il valore restituito @`e quello della chiamata di sistema @code{wait()}.
+@end table
+
+Non c'@`e una funzione corrispondente alla chiamata di sistema @code{exec()}.
+
+Ecco un esempio:
+
+@example
+@@load "fork"
+@dots{}
+if ((pid = fork()) == 0)
+    print "salve dal processo figlio"
+else
+    print "salve dal processo padre"
+@end example
+
+@node Esempio di estensione Inplace
+@subsection Consentire la modifica in loco dei file
+
+@cindex @code{inplace}, estensione
+@cindex estensione @code{inplace()}
+L'estensione @code{inplace} svolge un lavoro simile a quello
+dell'opzione @option{-i} nel programma di utilit@`a GNU @command{sed},
+che svolge delle funzioni di modifica ``al volo'' su ogni file in input.
+Viene usato il file @file{inplace.awk}, caricato dinamicamente, per richiamare
+l'estensione in maniera corretta:
+
+@example
+@c file eg/lib/inplace.awk
+@group
+# inplace --- carica e richiama l'estensione inplace.
+@c endfile
+@ignore
+@c file eg/lib/inplace.awk
+#
+# Copyright (C) 2013, 2017 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+# Andrew J. Schorr, aschorr@@telemetry-investments.com
+# January 2013
+@c endfile
+@end ignore
+@c file eg/lib/inplace.awk
+
+@@load "inplace"
+
+# @`E buona cosa impostare INPLACE_SUFFIX in modo da fare
+# una copia di backup.
+# Per esempio, si potrebbe impostare INPLACE_SUFFIX a .bak
+# sulla riga di comando, o in una regola BEGIN.
+
+# Per default, ogni file specificato sulla riga di comando
+# verr@`a modificato sovrascrivendo il file originale.
+# Ma @`e possibile evitarlo specificando l'argomento inplace=0
+# davanti al nome del file che non si desidera elaborare in questo modo.
+
+# Si pu@`o poi abilitare di nuovo l'aggiornamento diretto del file
+# sulla riga di comando, specificando inplace=1 prima del file
+# che si vuole modificare direttamente.
+
+# N.B. La funzione inplace_end() @`e invocata nelle regole
+# BEGINFILE ed END, in modo che ogni eventuale azione
+# in una regola ENDFILE sar@`a ridiretta come previsto.
+@end group
+
+@group
+BEGIN @{
+    inplace = 1         # abilitato per default
+@}
+@end group
+
+@group
+BEGINFILE @{
+    if (_inplace_filename != "")
+        inplace_end(_inplace_filename, INPLACE_SUFFIX)
+    if (inplace)
+        inplace_begin(_inplace_filename = FILENAME, INPLACE_SUFFIX)
+    else
+        _inplace_filename = ""
+@}
+@end group
+
+@group
+
+END @{
+    if (_inplace_filename != "")
+        inplace_end(_inplace_filename, INPLACE_SUFFIX)
+@}
+@end group
+@c endfile
+@end example
+
+Per ogni file elaborato, l'estensione ridirige lo
+standard output verso un file temporaneo definito in modo da avere lo stesso
+proprietario e le stesse autorizzazioni del file originale.  Dopo che il file
+@`e stato elaborato, l'estensione riporta lo standard output alla sua
+destinazione originale.
+Se @code{INPLACE_SUFFIX} non @`e una stringa vuota, il file originale @`e
+collegato a un @value{FN} di backup, creato aggiungendo il
+suffisso al nome originale.
+Infine, il file temporaneo @`e rinominato in modo da essere lo stesso del
+@value{FN} originario.
+
+Si noti che l'uso di questa funzionalit@`a pu@`o essere controllato
+specificando @samp{inplace=0} sulla riga di comando, prima del nome del file
+che non dovrebbe essere elaborato come appena descritto.  Si pu@`o richiedere
+ancora l'aggiornamento diretto di un file, specificando l'argomento
+@samp{inplace=1} davanti al nome del file da elaborare in maniera diretta.
+
+La variabile @code{_inplace_filename} serve per tener traccia del nome del
+file corrente, in modo da non eseguire la funzione @code{inplace_end()} prima
+di aver elaborato il primo file.
+
+Se si verifica un errore, l'estensione emette un messaggio di errore fatale
+per terminare l'elaborazione immediatamente, senza danneggiare il
+file originale.
+
+Ecco alcuni semplici esempi:
+
+@example
+$ @kbd{gawk -i inplace '@{ gsub(/pippo/, "pluto") @}; @{ print @}' file1 file2 file3}
+@end example
+
+Per mantenere una copia di backup del file originale, si provi a fare cos@`{@dotless{i}}:
+
+@example
+$ @kbd{gawk -i inplace -v INPLACE_SUFFIX=.bak '@{ gsub(/pippo/, "pluto") @}}
+> @kbd{@{ print @}' file1 file2 file3}
+@end example
+
+Si noti che, anche se l'estensione tenta di mantenere il proprietario e i
+permessi di accesso del file originario, non viene tentata la copia degli
+ulteriori permessi di accesso
+(@dfn{ACL - Access Control Lists}) del file originale.
+
+Se il programma termina prima del previsto, come potrebbe succedere se riceve
+dal sistema un segnale non gestito, pu@`o lasciare come residuo un file
+temporaneo.
+
+@node Esempio di estensione Ord
+@subsection Caratteri e valori numerici: @code{ord()} e @code{chr()}
+
+L'estensione @code{ordchr} aggiunge due funzioni, di nome
+@code{ord()} e @code{chr()}, come segue:
+
+@table @code
+@item @@load "ordchr"
+Questo @`e il modo per caricare l'estensione.
+
+@cindex @code{ord()}, estensione
+@cindex estensione @code{ord()}
+@item numero = ord(stringa)
+Restituisce il valore numerico del primo carattere in @code{stringa}.
+
+@cindex @code{Chr}, estensione
+@cindex estensione @code{chr()}
+@item char = chr(number)
+Restituisce una stringa il cui primo carattere @`e quello rappresentato
+da @code{number}.
+@end table
+
+Queste funzioni sono ispirate alle funzioni del linguaggio Pascal
+dallo stesso nome.  Ecco un esempio:
+
+@example
+@@load "ordchr"
+@dots{}
+printf("Il valore numerico di 'A' @`e %d\n", ord("A"))
+printf("Il valore come stringa di 65 @`e %s\n", chr(65))
+@end example
+
+@node Esempio di estensione Readdir
+@subsection Leggere directory
+
+L'estensione @code{readdir} aggiunge un analizzatore di input
+per esaminare directory.
+L'uso @`e il seguente:
+
+@cindex @code{readdir}, estensione
+@cindex estensione @code{readdir()}
+@example
+@@load "readdir"
+@end example
+
+Quando quest'estensione @`e in uso, invece che saltare le
+directory presenti sulla riga di comando, (o accedute tramite @code{getline}),
+queste sono lette, e ogni elemento della directory @`e restituito come
+un record.
+
+Il record consiste di tre campi. I primi due sono il numero di @dfn{inode} e
+il @value{FN}, separati fra loro da una barra.
+Nei sistemi in cui l'elemento di directory contiene il tipo del file,
+il record ha un terzo campo (pure separato da una barra), composto da una
+sola lettera, che indica il tipo del file.  Le lettere e i tipi di file a cui
+corrispondono sono mostrate in @ref{table-readdir-file-types}.
+
+@float Tabella,table-readdir-file-types
+@caption{Tipi file restituiti dall'estensione @code{readdir}}
+@multitable @columnfractions .1 .9
+@headitem Lettera @tab Tipo di file
+@item @code{b} @tab Dispositivo a blocchi
+@item @code{c} @tab Dispositivo a caratteri
+@item @code{d} @tab Directory
+@item @code{f} @tab File normale
+@item @code{l} @tab Collegamento simbolico
+@item @code{p} @tab @dfn{pipe} con nome (FIFO)
+@item @code{s} @tab @dfn{socket}
+@item @code{u} @tab Tutto il resto (sconosciuto)
+@end multitable
+@end float
+
+Nei sistemi che non contengono l'informazione sul tipo del file, il terzo
+campo @`e sempre @samp{u}.
+
+@quotation NOTA
+Nei sistemi GNU/Linux, ci sono fileystem che non supportano il campo
+@code{d_type} (si veda la pagina di manuale @i{readdir}(3)), e in questo caso
+il tipo di file @`e sempre @samp{u}.  Si pu@`o usare l'estensione
+@code{filefuncs} per chiamare @code{stat()} e ottenere l'informazione
+corretta sul tipo di file.
+@end quotation
+
+Ecco un esempio:
+
+@example
+@@load "readdir"
+@dots{}
+BEGIN @{ FS = "/" @}
+@{ print "@value{FN} @`e", $2 @}
+@end example
+
+@node Esempio di estensione Revout
+@subsection Invertire la stringa in output
+
+L'estensione @code{revoutput} aggiunge un semplice processore
+di output che inverte i caratteri di ogni riga in output.  Serve a dimostrare
+come @`e possibile scrivere un processore di output, anche se pu@`o essere
+a prima vista vagamente divertente.
+Ecco un esempio:
+
+@cindex @code{revoutput}, estensione
+@cindex estensione @code{revoutput()}
+@example
+@@load "revoutput"
+
+BEGIN @{
+    REVOUT = 1
+    print "non v'allarmate" > "/dev/stdout"
+@}
+@end example
+
+L'output di questo programma @`e @samp{etamralla'v non}.
+
+@node Esempio di estensione Rev2way
+@subsection Esempio di I/O bidirezionale
+
+L'estensione @code{revtwoway} aggiunge un semplice processore
+bidirezionale che inverte i caratteri di ogni riga che riceve, per farla
+poi rileggere dal programma @command{awk}.  Il motivo per cui @`e stata scritta
+@`e quello di mostrare come si scrive un processore bidirezionale, anche se pu@`o
+sembrare un programma vagamente divertente.
+Il seguente esempio mostra come usarlo:
+
+@cindex @code{revtwoway}, estensione
+@cindex estensione @code{revtwoway()}
+@example
+@@load "revtwoway"
+
+BEGIN @{
+    cmd = "/specchio/magico"
+    print "non v'allarmate" |& cmd
+    cmd |& getline risultato
+    print risultato
+    close(cmd)
+@}
+@end example
+
+L'output di questo programma
+@ifnotinfo
+anche in questo caso @`e:
+@end ifnotinfo
+@ifinfo
+@`e:
+@end ifinfo
+@samp{etamralla'v non}.
+
+@node Esempio di estensione Rwarray
+@subsection Scaricare e ricaricare un vettore
+
+L'estensione @code{rwarray} aggiunge due funzioni,
+di nome @code{writea()} e @code{reada()}, come segue:
+
+@table @code
+@item @@load "rwarray"
+Questo @`e il modo per caricare l'estensione.
+
+@cindex @code{writea()}, estensione
+@cindex estensione @code{writea()}
+@item ret = writea(file, vettore)
+Questa funzione ha come argomento una stringa, che @`e il nome del file
+sul quale scaricare il vettore, e il vettore stesso @`e il secondo argomento.
+@code{writea()} @`e in grado di gestire vettori di vettori.  Restituisce il
+valore uno se completa il lavoro o zero se non va a buon fine.
+
+@cindex @code{reada()}, estensione
+@cindex estensione @code{reada()}
+@item ret = reada(file, vettore)
+@code{reada()} @`e la funzione inversa di @code{writea()};
+legge il file il cui nome @`e fornito come primo argomento, riempiendo il
+vettore il cui nome @`e il secondo argomento. Il vettore viene preventivamente
+svuotato.
+Anche in questo caso, il valore restituito @`e uno se tutto va bene o zero se
+la funzione non va a buon fine.
+@end table
+
+Il vettore creato da @code{reada()} @`e identico a quello scritto da
+@code{writea()} nel senso che i contenuti sono gli stessi. Tuttavia,
+per come @`e strutturata la funzione, l'ordine di attraversamento del vettore
+ricreato @`e quasi certamente differente da quello del vettore originale.
+Poich@'e l'ordine di attraversamento di un vettore @`e, per default, indefinito
+in @command{awk}, questo non @`e (tecnicamente) un problema.  Se serve che
+l'attraversamento del vettore avvenga in un ordine preciso, si possono usare
+le funzionalit@`a di ordinamento di un vettore disponibili in @command{gawk}
+(@pxref{Ordinamento di vettori}).
+
+Il file contiene dati in formato binario.  Tutti i valori interi sono scritti
+in @dfn{network byte order}@footnote{Cio@`e, nella maniera con cui sarebbero
+normalmente scritti in un testo, con le cifre pi@`u significative del
+numero contenute nella parte sinistra, e quelle meno significative
+nella parte destra della rappresentazione binaria del numero.}.
+Tuttavia, i valori in virgola mobile a doppia precisione sono scritti come
+dati binari nativi.  Quindi, vettori che contengono solo dati in formato
+stringa possono essere scaricati da un sistema con un certo ordine di byte
+e ripristinati su un sistema con un ordine di byte differente, anche se
+un test al riguardo non @`e mai stato fatto.
+
+Ecco un esempio:
+
+@example
+@@load "rwarray"
+@dots{}
+ret = writea("scaricato.bin", vettore)
+@dots{}
+ret = reada("scaricato.bin", vettore)
+@end example
+
+@node Esempio di estensione Readfile
+@subsection Leggere un intero file in una stringa
+
+L'estensione @code{readfile} aggiunge una sola funzione
+di nome @code{readfile()}, e un analizzatore di input:
+
+@table @code
+@item @@load "readfile"
+Questo @`e il modo per caricare l'estensione.
+
+@cindex @code{readfile()}, estensione
+@cindex estensione @code{readfile()}
+@item risultato = readfile("/qualche/persorso")
+L'argomento @`e il nome del file da leggere.  Il valore restituito @`e una
+stringa contenente l'intero contenuto del file richiesto.  In caso di errore,
+la funzione restituisce la stringa vuota e imposta @code{ERRNO}.
+
+@item BEGIN @{ PROCINFO["readfile"] = 1 @}
+Inoltre, l'estensione aggiunge un analizzatore di input che @`e attivato se
+l'elemento @code{PROCINFO["readfile"]} esiste.
+Quando l'analizzatore @`e attivato, ogni file in input @`e restituito interamente
+come @code{$0}.
+La variabile @code{RT} @`e impostata alla stringa nulla.
+@end table
+
+Ecco un esempio:
+
+@example
+@@load "readfile"
+@dots{}
+contents = readfile("/percorso/del/file");
+if (contents == "" && ERRNO != "") @{
+    print("problema in lettura file", ERRNO) > "/dev/stderr"
+    ...
+@}
+@end example
+
+@node Esempio di estensione Time
+@subsection Funzioni dell'estensione time
+
+L'estensione @code{time} aggiunge due funzioni, di nome
+@code{gettimeofday()} e @code{sleep()}, come segue:
+
+@table @code
+@item @@load "time"
+Questo @`e il modo per caricare l'estensione.
+
+@cindex @code{gettimeofday()}, estensione
+@cindex estensione @code{gettimeofday()}
+@item ora_corrente = gettimeofday()
+Restituisce il numero di secondi trascorsi dalle ore 00:00 del giorno
+01/01/1970 UTC come valore in virgola mobile.
+Se questa informazione non @`e disponibile nella piattaforma in uso,
+restituisce @minus{}1 e imposta @code{ERRNO}.  Il valore fornito dovrebbe
+avere la precisione di una frazione di
+secondo, ma la precisione effettiva pu@`o variare a seconda della
+piattaforma.
+Se la chiamata di sistema standard C @code{gettimeofday()} @`e disponibile
+nella piattaforma in uso, questo @`e il valore restituito.  In caso contrario,
+se si sta lavorando con MS-Windows, la chiamata di sistema @`e fatta a
+@code{GetSystemTimeAsFileTime()}.
+
+@cindex @code{sleep()}, estensione
+@cindex estensione @code{sleep()}
+@item risultato = sleep(@var{secondi})
+Il programma @command{gawk} resta inattivo (dorme) per i @var{secondi}
+specificati.  Se @var{secondi} ha un valore negativo,
+o la chiamata di sistema non riesce, restituisce @minus{}1 e imposta @code{ERRNO}.
+In caso contrario, restituisce zero dopo aver lasciato trascorrere
+la quantit@`a di tempo indicata.
+Si noti che @var{secondi} pu@`o essere un numero in virgola mobile (non solo un
+numero intero).
+Dettagli di implementazione: a seconda della disponibilit@`a nel sistema in uso,
+questa funzione tenta di usare @code{nanosleep()} o @code{select()} per
+ottenere il tempo di attesa richiesto.
+@end table
+
+@node Esempio di estensione API Test
+@subsection Test per la API
+@cindex @code{testext}, estensione
+@cindex estensione @code{testext()}
+
+L'estensione @code{testext} controlla la funzionalit@`a di
+parti dell'estensione API che non sono utilizzate negli altri esempi.
+Il file @file{extension/testext.c}
+contiene sia il codice C per l'estensione che il codice @command{awk}
+(tra i commenti del codice C) per eseguire i test.  L'ambiente di test
+estrae il codice sorgente @command{awk} ed esegue i test.  Si veda il file
+sorgente per maggiori informazioni.
+
+@node gawkextlib
+@section Il progetto @code{gawkextlib}
+@cindex @code{gawkextlib}, estensioni
+@cindex estensioni, @code{gawkextlib}
+@cindex estensioni, dove trovarle
+
+@cindex @code{gawkextlib}, progetto
+@cindex progetto @code{gawkextlib}
+Il progetto @uref{https://sourceforge.net/projects/gawkextlib/, @code{gawkextlib}}
+fornisce varie estensioni per @command{gawk}, compresa una per
+l'elaborazione dei file XML.  Questa @`e un'evoluzione del progetto noto come
+@command{xgawk} (XML @command{gawk}).
+
+Le estensioni sono parecchie.  Alcune delle pi@`u interessanti sono:
+
+@itemize @value{BULLET}
+@item
+Estensione @code{abort}.  Consente di uscire immediatamente dal programma
+@command{awk} senza eseguire le regole @code{END}.
+
+@item
+Estensione @code{json}.
+Permette di serializzare un vettore multidimensionale trasformandolo in
+una stringa in formato JSON (JavaScript Object Notation), di effettuare
+l'operazione inversa, de-serializzando una stringa JSON, generando
+un vettore @command{gawk}.
+
+@item
+Estensione libreria MPFR.
+Fornisce accesso a varie funzioni MPFR non previste dal supporto nativo
+di MPFR disponibile in @command{gawk}
+
+@item
+Estensione Select.  Fornisce delle funzionalit@`a, appoggiandosi sulla
+chiamata di sistema @code{select()}.
+
+@item
+Estensione analizzatore XML, usando la libreria di analisi XML
+@uref{https://expat.sourceforge.net, Expat}
+@end itemize
+
+@cindex @command{git}, programma di utilit@`a
+@cindex programma di utilit@`a @command{git}
+Si pu@`o scaricare il codice del progetto @code{gawkextlib}
+usando il codice sorgente mantenuto tramite
+@uref{https://git-scm.com, Git}.
+Il comando per farlo @`e il seguente:
+
+@example
+git clone git://git.code.sf.net/p/gawkextlib/code gawkextlib-code
+@end example
+
+@cindex RapidJson, libreria per analizzare JSON
+@cindex JSON, RapidJson, libreria per analizzare
+Occorre che sia installata la libreria di analisi JSON
+per poter generare e usare l'estensione @code{json}.
+
+@cindex Expat, libreria per analizzare XML
+@cindex XML, Expat, libreria per analizzare
+Per poter compilare e usare l'estensione XML, @`e necessario installare
+la libreria di analisi XML @uref{https://expat.sourceforge.net, Expat}.
+
+Inoltre, @`e necessario installare gli strumenti GNU Autotools
+(@uref{https://www.gnu.org/software/autoconf, Autoconf},
+@uref{https://www.gnu.org/software/automake, Automake},
+@uref{https://www.gnu.org/software/libtool, Libtool}
+e
+@uref{https://www.gnu.org/software/gettext, GNU @command{gettext}}).
+
+La semplice procedura per compilare e testare @code{gawkextlib} @`e la seguente.
+Dapprima, occorre compilare e installare @command{gawk}:
+
+@example
+cd .../percorso/del/sorgente/gawk
+./configure --prefix=/tmp/newgawk   @ii{Installa in /tmp/newgawk per ora}
+make && make check                  @ii{Compila e controlla che tutto sia a posto}
+make install                        @ii{Installa gawk}
+@end example
+
+Poi, dal sito @url{https://sourceforge.net/projects/gawkextlib/files} si deve
+scaricare @code{gawkextlib} e le estensioni che si vogliono installare.
+Il file @file{README} del sito spiega come compilare il codice.  Se si @`e
+installato @command{gawk} in una posizione non-standard, occorre
+specificare @code{./configure --with-gawk=@var{/percorso/del/programma/gawk}}
+per far s@`{@dotless{i}} che venga trovato.
+Pu@`o essere necessario usare il programma di utilit@`a @command{sudo}
+per installare sia @command{gawk} che @code{gawkextlib}, a seconda di come
+funziona il sistema su cui si lavora.
+
+Chi scrive un'estensione e desidera condividerla con altri utenti
+@command{gawk}, pu@`o prendere in considerazione l'idea di farlo attraverso
+il progetto @code{gawkextlib}.
+Si veda il sito web del progetto per maggiori informazioni.
+
+@node Sommario delle estensioni
+@section Sommario
+
+@itemize @value{BULLET}
+@item
+Si possono scrivere estensioni (dette anche @dfn{plug-in})
+per @command{gawk}
+nel linguaggio C o C++ usando l'interfaccia di programmazione applicativa
+(API) definita dagli sviluppatori di
+@command{gawk}.
+
+@item
+Le estensioni devono avere una licenza compatibile con la
+GNU General Public License (GPL), e devono dichiararlo definendo un'apposita
+variabile di nome
+@code{plugin_is_GPL_compatibile}.
+
+@item
+La comunicazione tra @command{gawk} e un'estensione @`e bidirezionale.
+@command{gawk} passa all'estensione una struttura (@code{struct}) che contiene
+vari campi di dati e puntatori a funzione.  L'estensione pu@`o poi chiamare
+funzioni all'interno di @command{gawk} tramite dei puntatori a funzioni
+per svolgere alcuni compiti.
+
+@item
+Uno di questi compiti @`e di ``registrare'' il nome e l'implementazione di
+nuove funzioni a livello di @command{awk} con @command{gawk}.
+L'implementazione ha la forma di un puntatore del linguaggio C,
+cui @`e associato un dato livello di versione.
+Per convenzione, le funzioni di implementazione hanno nome
+@code{do_@var{XXXX}()} per una funzione a livello di @command{awk} di nome
+@code{@var{XXXX}()}.
+
+@item
+L'API @`e definita in un file di intestazione di nome @file{gawkapi.h}.
+Occorre includere alcuni file di intestazione standard @emph{prima} di
+includere tale intestazione nel codice sorgente.
+
+@item
+Vengono forniti dei puntatori a funzioni dell'API per i seguenti tipi di
+operazioni:
+
+@itemize @value{BULLET}
+@item
+Allocare, riallocare, e liberare memoria
+
+@item
+Registrare funzioni (si possono registrare
+funzioni di estensione,
+funzioni ausiliarie di pulizia (@dfn{callbacks}),
+una stringa di versione,
+degli analizzatori di input,
+dei processori di output,
+e dei processori bidirezionali)
+
+@item
+Stampare messaggi fatali, non fatali, di avvertimento, e avvertimenti ``lint''
+
+@item
+Aggiornare @code{ERRNO} o annullarlo
+
+@item
+Accedere a parametri, come pure convertire un parametro di tipo non definito
+in un vettore
+
+@item
+Accedere alla tabella dei simboli (ricuperare il valore di una
+variabile globale, crearne una nuova o modificarne una esistente)
+
+@item
+Creare e rilasciare valori nascosti; questo consente di usare in modo
+efficiente lo stesso valore per pi@`u variabili e pu@`o migliorare di molto le
+prestazioni del programma
+
+@item
+Manipolare vettori
+(ricuperare, aggiungere, cancellare e modificare elementi;
+ottenere il numero di elementi in un vettore;
+creare un nuovo vettore;
+svuotare un vettore;
+e
+appiattire un vettore per poterlo percorrere facilmente con un ciclo in
+stile C, visitando tutti i suoi indici ed elementi)
+@end itemize
+
+@item
+L'API definisce diversi tipi di dati standard per rappresentare
+valori di variabili, elementi di vettore e vettori presenti in @command{awk}.
+
+@item
+L'API fornisce funzioni di servizio per definire dei valori.
+Sono anche disponibili funzioni di gestione della memoria, per assicurare
+la compatibilit@`a fra memoria allocata da @command{gawk} e memoria allocata da
+un'estensione.
+
+@item
+@emph{Tutta} la memoria passata da @command{gawk} a un'estensione dev'essere
+considerata come in sola lettura dall'estensione.
+
+@item
+@emph{Tutta} la memoria passata da un'estensione a @command{gawk} deve
+essere ottenuta dalle funzioni di allocazione della memoria previste
+dall'API.  @command{gawk} @`e responsabile per la gestione di quella memoria e
+la libera quando @`e il momento per farlo.
+
+@item
+L'API fornisce informazioni sulla versione di @command{gawk} in
+esecuzione, in modo che un'estensione possa verificare la propria compatibilit@`a
+con la versione di @command{gawk} da cui @`e stata caricata.
+
+@item
+@`E pi@`u facile iniziare a programmare una nuova estensione usando il
+codice predefinito descritto in questo @value{CHAPTER}.  Alcune macro nel
+file di intestazione @file{gawkapi.h}  rendono la cosa pi@`u agevole.
+
+@item
+La distribuzione di @command{gawk} comprende un numero di piccoli ma utili
+esempi di estensione. Il progetto @code{gawkextlib} include diverse altre
+estensioni, di maggiori dimensioni.
+Per chi desideri scrivere un'estensione e metterla a disposizione della
+comunit@`a degli utenti di @command{gawk}, il progetto @code{gawkextlib}
+@`e il posto adatto per farlo.
+
+@end itemize
+
+@c EXCLUDE START
+@node Esercizi sulle estensioni
+@section Esercizi
+
+@enumerate
+@item
+Aggiungere funzioni per rendere disponibili chiamate di sistema come
+@code{chown()}, @code{chmod()} e @code{umask()} nelle estensioni che
+operano con i file viste
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Operazioni interne file}.
+
+@c Idea from comp.lang.awk, February 2015
+@item
+Scrivere un analizzatore di input che stampi un prompt se l'input proviene
+da un dispositivo che sia un ``terminale''.  Si pu@`o usare la funzione
+@code{isatty()} per sapere se il file in input @`e un terminale.
+(Suggerimento: questa funzione
+normalmente usa parecchie risorse quando @`e richiamata; si tenti di chiamarla
+una volta sola.)
+Il contenuto del prompt dovrebbe provenire da una variabile che sia possibile
+impostare a livello di codice @command{awk}.
+Si pu@`o inviare il prompt allo standard error. Tuttavia,
+per ottenere risultati migliori, @`e meglio aprire un nuovo descrittore di file
+(o puntatore a un file)
+sul file @file{/dev/tty} e stampare il prompt su quel file, nel caso
+in cui lo standard error sia stato ridiretto.
+
+Perch@'e lo standard error @`e una scelta migliore dello
+standard output per scrivere il prompt?
+Quale meccanismo di lettura andrebbe sostituito, quello che legge un record
+o quello che legge dei semplici byte?
+
+@item
+(Difficile.)
+Come si potrebbero gestire degli insiemi di nomi (@dfn{spazi-dei-nomi})
+in @command{gawk}, in modo
+che i nomi di funzione presenti in estensioni differenti non siano in conflitto
+tra loro?
+Chi riesce a trovare uno schema di buona qualit@`a @`e pregato di contattare il
+manutentore di @command{gawk}, per metterlo al corrente.
+
+@item
+Si scriva uno @dfn{script} di shell che funga da interfaccia per
+l'estensione ``inplace'', vista
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Esempio di estensione Inplace},
+in modo che il comportamento sia simile a quello del comando @samp{sed -i}.
+
+@end enumerate
+@c EXCLUDE END
+
+@ifnotinfo
+@part @value{PART4}Appendici
+@end ifnotinfo
+
+@ifdocbook
+
+@ifclear FOR_PRINT
+La Parte IV contiene le appendici (come pure le due licenze che proteggono
+il codice sorgente di @command{gawk} e questo @value{DOCUMENT},
+rispettivamente) e inoltre il Glossario:
+@end ifclear
+
+@ifset FOR_PRINT
+La Parte IV contiene tre appendici, l'ultima delle quali @`e la licenza
+che protegge il codice sorgente di @command{gawk}:
+@end ifset
+
+@itemize @value{BULLET}
+@item
+@ref{Storia del linguaggio}
+
+@item
+@ref{Installazione}
+
+@ifclear FOR_PRINT
+@item
+@ref{Note}
+
+@item
+@ref{Concetti fondamentali}
+
+@item
+@ref{Glossario}
+@end ifclear
+
+@item
+@ref{Copia}
+
+@ifclear FOR_PRINT
+@item
+@ref{Licenza per Documentazione Libera GNU (FDL)}
+@end ifclear
+@end itemize
+@end ifdocbook
+
+@node Storia del linguaggio
+@appendix L'evoluzione del linguaggio @command{awk}
+
+Questo @value{DOCUMENT} descrive l'implementazione GNU di @command{awk}
+conforme alle specifiche POSIX.  Molti degli utenti di lunga data di
+@command{awk} hanno imparato a programmare in @command{awk} usando
+l'implementazione originale di @command{awk} presente nella versione 7 di
+Unix.  (Questa versione @`e servita da base per la versione Berkeley Unix di
+@command{awk}, attraverso la versione 4.3BSD-Reno.  Successive versioni di
+Berkeley Unix e, per un certo periodo, alcuni sistemi derivati da
+4.4BSD-Lite, hanno usato varie versioni di @command{gawk} come loro
+@command{awk}.)  Questo @value{CHAPTER} descrive in breve l'evoluzione
+del linguaggio @command{awk}, facendo riferimento ad altre parti del
+@value{DOCUMENT} dove si possono trovare ulteriori informazioni.
+
+@ifset FOR_PRINT
+Per amor di brevit@`a, sono state omesse in questa edizione informazioni
+sulla storia delle funzionalit@`a di @command{gawk}.  Si possono trovare nella
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Feature-History.html,
+documentazione online}.
+@end ifset
+
+@menu
+* V7/SVR3.1::                   Le principali differenze tra V7 e System V
+                                Release 3.1.
+* SVR4::                        Differenze minori tra System V
+                                Release 3.1 e 4.
+* POSIX::                       Nuove funzionalit@`a per lo standard POSIX.
+* BTL::                         Nuove funzionalit@`a dalla versione
+                                di @command{awk} di Brian Kernighan.
+* POSIX/GNU::                   Le estensioni in @command{gawk} non
+                                previste in @command{awk} POSIX.
+* Storia delle funzionalit@`a::   La storia delle funzionalit@`a di
+                                @command{gawk}.
+* Estensioni comuni::           Sommario Estensioni comuni.
+* Intervalli e localizzazione:: Come le localizzazioni influiscono sugli
+                                intervalli delle espressioni regolari.
+* Contributori::                I maggiori contributori a @command{gawk}.
+* Sommario della storia::       Sommario della storia.
+@end menu
+
+@node V7/SVR3.1
+@appendixsec Differenze importanti tra V7 e System V Release 3.1
+@cindex @command{awk}, versioni di
+@cindex @command{awk}, versioni di, differenze tra V7 e SVR3.1
+
+Il liguaggio @command{awk} si @`e evoluto considerevolmente tra Unix versione
+7 (1978) e la nuova implementazione disponibile a partire da Unix System V
+Release 3.1 (1987).  Questa @value{SECTION} riassume le differenze e indica
+dove @`e possibile trovare ulteriori dettagli:
+
+@itemize @value{BULLET}
+@item
+La necessit@`a di inserire @samp{;} per separare pi@`u regole su una riga
+(@pxref{Istruzioni/Righe})
+
+@item
+Funzioni definite dall'utente e istruzione @code{return}
+(@pxref{Funzioni definite dall'utente})
+
+@item
+L'istruzione @code{delete} (@pxref{Cancellazione})
+
+@item
+L'istruzione @code{do}-@code{while}
+(@pxref{Istruzione do})
+
+@item
+Le funzioni predefinite @code{atan2()}, @code{cos()}, @code{sin()}, @code{rand()} e
+@code{srand()} (@pxref{Funzioni numeriche})
+
+@item
+Le funzioni predefinite @code{gsub()}, @code{sub()} e @code{match()}
+(@pxref{Funzioni per stringhe})
+
+@item
+Le funzioni predefinite @code{close()} e @code{system()}
+(@pxref{Funzioni di I/O})
+
+@item
+Le variabili predefinite @code{ARGC}, @code{ARGV}, @code{FNR}, @code{RLENGTH},
+@code{RSTART} e @code{SUBSEP} (@pxref{Variabili predefinite})
+
+@item
+Possibilit@`a di modificare @code{$0} (@pxref{Cambiare i campi})
+
+@item
+L'espressione condizionale che fa uso dell'operatore ternario @samp{?:}
+(@pxref{Espressioni condizionali})
+
+@item
+L'espressione @samp{@var{indice} in @var{vettore}} esterna alle istruzioni
+@code{for} (@pxref{Visitare elementi})
+
+@item
+L'operatore esponenziale @samp{^}
+(@pxref{Operatori aritmetici}) e il relativo operatore di assegnamento
+@samp{^=} (@pxref{Operatori di assegnamento})
+
+@item
+Precedenze tra operatori compatibili con quelle del linguaggio C, che
+rendono non funzionanti alcuni vecchi programmi @command{awk} (@pxref{Precedenza})
+
+@item
+La possibilit@`a di usare @dfn{regexp} come valori di @code{FS}
+(@pxref{Separatori di campo}) e come
+terzo argomento per la funzione @code{split()}
+(@pxref{Funzioni per stringhe}), invece di usare solo il primo carattere
+di @code{FS}
+
+@item
+@dfn{Regexp} dinamiche come operandi degli operatori @samp{~} e @samp{!~}
+(@pxref{Espressioni regolari calcolate})
+
+@item
+Le sequenze di protezione @samp{\b}, @samp{\f} e @samp{\r}
+(@pxref{Sequenze di protezione})
+
+@item
+La ridirezione dell'input per la funzione @code{getline}
+(@pxref{Getline})
+
+@item
+La possibilit@`a di avere pi@`u regole @code{BEGIN} ed @code{END}
+(@pxref{BEGIN/END})
+
+@item
+Vettori multidimensionali
+(@pxref{Vettori multidimensionali})
+@end itemize
+
+@node SVR4
+@appendixsec Differenze tra le versioni System V Release 3.1 e SVR4
+
+@cindex @command{awk}, versioni di, differenze tra SVR3.1 e SVR4
+La versione per Unix System V Release 4 (1989) di @command{awk} ha aggiunto
+queste funzionalit@`a (alcune delle quali introdotte da @command{gawk}):
+
+@itemize @value{BULLET}
+@item
+Il vettore @code{ENVIRON} (@pxref{Variabili predefinite})
+@c gawk and MKS awk
+
+@item
+La possibilit@`a di specificare pi@`u opzioni @option{-f} sulla riga di comando
+(@pxref{Opzioni})
+@c MKS awk
+@c Mortice Kern Systems, ditta produttrice di una versione commerciale di awk
+
+@item
+L'opzione @option{-v} per assegnare variabili prima di iniziare
+l'esecuzione del programma
+(@pxref{Opzioni})
+@c GNU, Bell Laboratories & MKS together
+
+@item
+La notazione @option{--} per indicare la fine delle opzioni sulla riga di
+comando
+
+@item
+Le sequenze di protezione @samp{\a}, @samp{\v} e @samp{\x}
+(@pxref{Sequenze di protezione})
+@c GNU, for ANSI C compat
+
+@item
+Un codice di ritorno definito per la funzione predefinita @code{srand()}
+(@pxref{Funzioni numeriche})
+
+@item
+Le funzioni predefinite per stringhe @code{toupper()} e @code{tolower()}
+per la conversione maiuscolo/minuscolo
+(@pxref{Funzioni per stringhe})
+
+@item
+Una specificazione pi@`u accurata per la lettera @samp{%c} di controllo del
+formato nella funzione @code{printf}
+(@pxref{Lettere di controllo})
+
+@item
+La capacit@`a di decidere dinamicamente la larghezza di un campo e la
+precisione da usare (@code{"%*.*d"}) nella lista degli argomenti passati a
+@code{printf} e @code{sprintf()}
+(@pxref{Lettere di controllo})
+
+@item
+L'uso di costanti @dfn{regexp}, p.es. @code{/pippo/}, come espressioni,
+che equivalgono a usare l'operatore di ricerca di una
+corrispondenza, p.es. @samp{$0 ~ /pippo/}
+(@pxref{Usare le costanti @dfn{regexp}})
+
+@item
+Gestione di sequenze di protezione nell'assegnamento di variabili
+effettuato tramite la riga di comando
+(@pxref{Opzioni di assegnamento})
+@end itemize
+
+@node POSIX
+@appendixsec Differenze tra versione SVR4 e POSIX di @command{awk}
+@cindex @command{awk}, versioni di, differenze tra SVR4 e POSIX @command{awk}
+@cindex POSIX @command{awk}, differenze tra versioni @command{awk}
+
+Lo standard POSIX Command Language and Utilities per @command{awk} (1992)
+ha introdotto le seguenti modifiche al linguaggio:
+
+@itemize @value{BULLET}
+@item
+L'uso dell'opzione @option{-W} per opzioni specifiche a una data
+implementazione
+(@pxref{Opzioni})
+
+@item
+L'uso di @code{CONVFMT} per controllare la conversione di numeri
+in stringhe (@pxref{Conversione})
+
+@item
+Il concetto di stringa numerica e regole di confronto pi@`u precise da seguire
+al riguardo (@pxref{Tipi di variabile e confronti})
+
+@item
+L'uso di variabili predefinite come nomi di parametri delle funzioni @`e vietato
+(@pxref{Sintassi delle definizioni})
+
+@item
+Una documentazione pi@`u completa di molte tra le funzionalit@`a del linguaggio
+precedentemente non documentate
+@end itemize
+
+Nel 2012, un certo numero di estensioni che erano gi@`a comunemente
+disponibili da parecchi anni sono state finalmente aggiunte allo standard
+POSIX.  Ecco l'elenco:
+
+@itemize @value{BULLET}
+@item
+La funzione predefinita @code{fflush()} per forzare la scrittura dei buffer
+in output
+(@pxref{Funzioni di I/O})
+
+@item
+L'istruzione @code{nextfile}
+(@pxref{Istruzione nextfile})
+
+@item
+La possibilit@`a di eliminare completamente un vettore con l'istruzione
+@samp{delete @var{vettore}}
+(@pxref{Cancellazione})
+
+@end itemize
+
+@xref{Estensioni comuni} per una lista delle estensioni comuni
+non previste nello standard POSIX.
+
+Lo standard POSIX 2008 @`e reperibile online a:
+@url{http://www.opengroup.org/onlinepubs/9699919799/}.
+
+
+@node BTL
+@appendixsec Estensioni nell'@command{awk} di Brian Kernighan
+
+@cindex @command{awk}, versioni di, si veda anche Brian Kernighan, @command{awk} di
+@cindex estensioni, Brian Kernighan @command{awk}
+@cindex Brian Kernighan, @command{awk} di, estensioni
+@cindex Kernighan, Brian
+Brian Kernighan
+ha reso disponibile la sua versione nel suo sito.
+(@pxref{Altre versioni}).
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive estensioni comuni disponibili per la
+prima volta nella sua versione di @command{awk}:
+
+@itemize @value{BULLET}
+@item
+Gli operatori @samp{**} e @samp{**=}
+(@pxref{Operatori aritmetici}
+e
+@ref{Operatori di assegnamento})
+
+@item
+L'uso di @code{func} come abbreviazione di @code{function}
+(@pxref{Sintassi delle definizioni})
+
+@item
+La funzione predefinita @code{fflush()} per forzare la scrittura dei buffer
+in output
+(@pxref{Funzioni di I/O})
+
+@ignore
+@item
+The @code{SYMTAB} array, that allows access to @command{awk}'s internal symbol
+table. This feature was never documented for his @command{awk}, largely because
+it is somewhat shakily implemented. For instance, you cannot access arrays
+or array elements through it
+@end ignore
+@end itemize
+
+@xref{Estensioni comuni} per una lista completa delle estensioni
+disponibile nel suo @command{awk}.
+
+@node POSIX/GNU
+@appendixsec Estensioni di @command{gawk} non in POSIX @command{awk}
+
+@cindex modalit@`a compatibile di (@command{gawk}), estensioni nella
+@cindex estensioni nella modalit@`a compatibile di (@command{gawk})
+@cindex estensioni, in @command{gawk}, non in POSIX @command{awk}
+@cindex POSIX, estensioni @command{gawk} non incluse in
+L'implementazione GNU di @command{gawk} aggiunge molte funzionalit@`a.
+Queste possono essere disabilitate completamente sia con l'opzione
+@option{--traditional} che con l'opzione
+@option{--posix}
+(@pxref{Opzioni}).
+
+Alcune funzionalit@`a sono state introdotte e successivamente tolte
+con il passare del tempo.
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION}
+sintetizza le ulteriori funzionalit@`a rispetto a POSIX @command{awk} che sono
+presenti nella versione corrente di @command{gawk}.
+
+@itemize @value{BULLET}
+
+@item
+Ulteriori variabili predefinite:
+
+@itemize @value{MINUS}
+@item
+Le variabili
+@code{ARGIND},
+@code{BINMODE},
+@code{ERRNO},
+@code{FIELDWIDTHS},
+@code{FPAT},
+@code{IGNORECASE},
+@code{LINT},
+@code{PROCINFO},
+@code{RT}
+e
+@code{TEXTDOMAIN}
+(@pxref{Variabili predefinite})
+@end itemize
+
+@item
+File speciali verso cui ridirigere l'I/O:
+
+@itemize @value{MINUS}
+@item
+I file @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr} e i
+@value{FNS} speciali @file{/dev/fd/@var{N}}
+(@pxref{File speciali})
+
+@item
+I file speciali @file{/inet}, @file{/inet4} e @file{/inet6} per
+interagire con la rete TCP/IP usando @samp{|&} per specificare quale
+versione usare del protocollo IP
+(@pxref{Reti TCP/IP})
+@end itemize
+
+@item
+Differenze e/o aggiunte al linguaggio:
+
+@itemize @value{MINUS}
+@item
+La sequenza di protezione @samp{\x}
+(@pxref{Sequenze di protezione})
+
+@item
+Supporto completo per @dfn{regexp} sia POSIX che GNU
+@iftex
+(@pxrefil{Espressioni regolari})
+@end iftex
+@ifnottex
+(@pxref{Espressioni regolari})
+@end ifnottex
+
+@item
+La possibilit@`a che @code{FS} e il terzo
+argomento di @code{split()} siano la stringa nulla
+(@pxref{Campi di un solo carattere})
+
+@item
+La possibilit@`a che @code{RS} sia una @dfn{regexp}
+(@pxref{Record})
+
+@item
+La possibilit@`a di usare costanti ottali ed esadecimali nei programmi
+scritti in @command{awk}
+(@pxref{Numeri non-decimali})
+
+@item
+L'operatore @samp{|&} per poter effettuare I/O bidirezionale verso un
+coprocesso
+(@pxref{I/O bidirezionale})
+
+@item
+Chiamate indirette di funzione
+(@pxref{Chiamate indirette})
+
+@item
+La possibilit@`a di ignorare directory specificate sulla riga di comando,
+emettendo un messaggio di avvertimento
+(@pxref{Directory su riga di comando})
+
+@item
+Errori in output usando @code{print} e @code{printf} non provocano
+necessariamente la fine del programma
+(@pxref{Continuazione dopo errori})
+@end itemize
+
+@item
+Nuove parole chiave:
+
+@itemize @value{MINUS}
+@item
+I criteri di ricerca speciali @code{BEGINFILE} ed @code{ENDFILE}
+(@pxref{BEGINFILE/ENDFILE})
+
+@item
+L'istruzione @code{switch}
+(@pxref{Istruzione switch})
+@end itemize
+
+@item
+Differenze in funzioni standard di @command{awk}:
+
+@itemize @value{MINUS}
+@item
+Il secondo argomento opzionale di @code{close()} che consente di chiudere
+un solo lato dell'I/O di una @dfn{pipe} bidirezionale aperta verso un
+coprocesso (@pxref{I/O bidirezionale})
+
+@item
+Aderenza allo standard POSIX per le funzioni @code{gsub()} e @code{sub()}
+se @`e stata specificata l'opzione @option{--posix}
+
+@item
+La funzione @code{length()} accetta come argomento il nome di un vettore
+e restituisce il numero di elementi nel vettore
+(@pxref{Funzioni per stringhe})
+
+@item
+Il terzo argomento opzionale della funzione @code{match()}
+per contenere eventuali sottoespressioni individuate all'interno di una
+@dfn{regexp}
+(@pxref{Funzioni per stringhe})
+
+@item
+Specificatori posizionali nei formati di @code{printf} per facilitare
+le traduzioni di messaggi
+(@pxref{Ordinamento di printf})
+
+@item
+L'aggiunta di un quarto argomento opzionale alla funzione @code{split()},
+per designare un vettore che contenga il testo dei separatori di campo
+(@pxref{Funzioni per stringhe})
+@end itemize
+
+@item
+Ulteriori funzioni presenti solo in @command{gawk}:
+
+@itemize @value{MINUS}
+@item
+Le funzioni @code{gensub()}, @code{patsplit()} e @code{strtonum()}
+per una gestione di testi pi@`u potente
+(@pxref{Funzioni per stringhe})
+
+@item
+Le funzioni @code{asort()} e @code{asorti()} per l'ordinamento di vettori
+(@pxref{Ordinamento di vettori})
+
+@item
+Le funzioni @code{mktime()}, @code{systime()} e @code{strftime()}
+per lavorare con date e ore
+(@pxref{Funzioni di tempo})
+
+@item
+Le funzioni
+@code{and()},
+@code{compl()},
+@code{lshift()},
+@code{or()},
+@code{rshift()}
+e
+@code{xor()}
+per la manipolazione a livello di bit
+(@pxref{Funzioni a livello di bit})
+@c In 4.1, and(), or() and xor() grew the ability to take > 2 arguments
+
+@item
+La funzione @code{isarray()} per controllare se una variabile @`e un vettore
+oppure no
+(@pxref{Funzioni per i tipi})
+
+@item
+Le funzioni @code{bindtextdomain()}, @code{dcgettext()}
+e @code{dcngettext()} per l'internazionalizzazione
+(@pxref{I18N per programmatore})
+
+@ifset INTDIV
+@item
+La funzione @code{intdiv0()} per effettuare divisioni a numeri interi e
+ottenere il resto della divisione
+(@pxref{Funzioni numeriche})
+@end ifset
+@end itemize
+
+@item
+Modifiche e/o aggiunte alle opzioni della riga di comando:
+
+@itemize @value{MINUS}
+@item
+La variabile d'ambiente @env{AWKPATH} per specificare un percorso di ricerca
+per l'opzione @option{-f} della riga di comando
+(@pxref{Opzioni})
+
+@item
+La variabile d'ambiente @env{AWKLIBPATH} per specificare un percorso di ricerca
+per l'opzione @option{-l} della riga di comando
+(@pxref{Opzioni})
+
+@item
+Le opzioni brevi
+@option{-b},
+@option{-c},
+@option{-C},
+@option{-d},
+@option{-D},
+@option{-e},
+@option{-E},
+@option{-g},
+@option{-h},
+@option{-i},
+@option{-l},
+@option{-L},
+@option{-M},
+@option{-n},
+@option{-N},
+@option{-o},
+@option{-O},
+@option{-p},
+@option{-P},
+@option{-r},
+@option{-s},
+@option{-S},
+@option{-t}
+e
+@option{-V}
+. Inoltre, la
+possibilit@`a di usare opzioni in formato lungo (stile GNU) che iniziano
+con @option{--}
+e le opzioni lunghe
+@option{--assign},
+@option{--bignum},
+@option{--characters-as-bytes},
+@option{--copyright},
+@option{--debug},
+@option{--dump-variables},
+@option{--exec},
+@option{--field-separator},
+@option{--file},
+@option{--gen-pot},
+@option{--help},
+@option{--include},
+@option{--lint},
+@option{--lint-old},
+@option{--load},
+@option{--non-decimal-data},
+@option{--optimize},
+@option{--no-optimize},
+@option{--posix},
+@option{--pretty-print},
+@option{--profile},
+@option{--re-interval},
+@option{--sandbox},
+@option{--source},
+@option{--traditional},
+@option{--use-lc-numeric},
+and
+@option{--version}
+(@pxref{Opzioni}).
+@end itemize
+
+@c       new ports
+
+@item
+Il supporto per i seguenti sistemi obsoleti @`e stato rimosso dal codice
+sorgente e dalla documentazione di @command{gawk} @value{PVERSION} 4.0:
+
+@c nested table
+@itemize @value{MINUS}
+@item
+Amiga
+
+@item
+Atari
+
+@item
+BeOS
+
+@item
+Cray
+
+@item
+MIPS RiscOS
+
+@item
+MS-DOS con il compilatore Microsoft
+
+@item
+MS-Windows con il compilatore Microsoft
+
+@item
+NeXT
+
+@item
+SunOS 3.x, Sun 386 (Road Runner)
+
+@item
+Tandem (non-POSIX)
+
+@item
+Compilatore pre-standard VAX C per VAX/VMS
+
+@item
+GCC per VAX e Alpha non @`e stato verificato da parecchio tempo.
+
+@end itemize
+
+@item
+Il supporto per i seguenti sistemi obsoleti @`e stato rimosso dal codice
+di @command{gawk} @value{PVERSION} 4.1:
+
+@c nested table
+@itemize @value{MINUS}
+@item
+Ultrix
+@end itemize
+
+@item
+Il supporto per i seguenti sistemi obsoleti @`e stato rimosso dal codice
+sorgente e dalla documentazione di
+@command{gawk} @value{PVERSION} 4.2:
+
+@c nested table
+@itemize @value{MINUS}
+@item
+MirBSD
+
+@item
+GNU/Linux su Alpha
+@end itemize
+
+@end itemize
+
+@c XXX ADD MORE STUFF HERE
+
+
+@c This does not need to be in the formal book.
+@ifclear FOR_PRINT
+@node Storia delle funzionalit@`a
+@appendixsec Storia delle funzionalit@`a di @command{gawk}
+
+@ignore
+See the thread:
+https://groups.google.com/forum/#!topic/comp.lang.awk/SAUiRuff30c
+This motivated me to add this section.
+@end ignore
+
+@ignore
+I've tried to follow this general order, esp.@: for the 3.0 and 3.1 sections:
+       variables
+       special files
+       language changes (e.g., hex constants)
+       differences in standard awk functions
+       new gawk functions
+       new keywords
+       new command-line options
+       behavioral changes
+       extension API changes
+       new / deprecated / removed ports
+       installation time stuff
+Within each category, be alphabetical.
+@end ignore
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive le funzionalit@`a in @command{gawk}
+in aggiunta a quelle di POSIX @command{awk},
+nell'ordine in cui sono state rese disponibili in @command{gawk}.
+
+La versione 2.10 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
+
+@itemize @value{BULLET}
+@item
+La variabile d'ambiente @env{AWKPATH} per specificare un percorso di ricerca
+per l'opzione @option{-f} della riga di comando
+(@pxref{Opzioni})
+
+@item
+La variabile @code{IGNORECASE} e i suoi effetti
+(@pxref{Maiuscolo-Minuscolo}).
+
+@item
+I file @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr} e i
+@value{FNS} speciali @file{/dev/fd/@var{N}}
+(@pxref{File speciali})
+@end itemize
+
+La versione 2.13 di @command{gawk} ha ha introdotto le seguenti funzionalit@`a:
+
+@itemize @value{BULLET}
+@item
+La variabile @code{FIELDWIDTHS} e i suoi effetti
+(@pxref{Dimensione costante}).
+
+@item
+Le funzioni predefinite @code{systime()} e @code{strftime()} per ottenere
+e stampare data e ora
+(@pxref{Funzioni di tempo}).
+
+@item
+Ulteriori opzioni dalla riga di comando
+(@pxref{Opzioni}):
+
+@itemize @value{MINUS}
+@item
+L'opzione @option{-W lint} per fornire controlli su possibili errori e per
+la portabilit@`a, sia a livello di codice sorgente che in fase di esecuzione.
+
+@item
+L'opzione @option{-W compat} per inibire le estensioni GNU.
+
+@item
+L'opzione @option{-W posix} per richiedere una stretta aderenza allo
+standard POSIX.
+@end itemize
+@end itemize
+
+La versione 2.14 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
+
+@itemize @value{BULLET}
+@item
+L'istruzione @code{next file} per passare immediatamente al successivo
+@value{DF} (@pxref{Istruzione nextfile}).
+@end itemize
+
+La versione 2.15 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
+
+@itemize @value{BULLET}
+@item
+Nuove variabili (@pxref{Variabili predefinite}):
+
+@itemize @value{MINUS}
+@item
+@code{ARGIND}, che permette di controllare la posizione di @code{FILENAME}
+nel vettore @code{ARGV}.
+
+@item
+@code{ERRNO}, che contiene il messaggio di errore del sistema quando
+@code{getline} restituisce @minus{}1 o @code{close()} non termina con successo.
+@end itemize
+
+@item
+I @value{FNS} speciali @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}
+e @file{/dev/user}. Questo supporto @`e stato rimosso in seguito.
+
+@item
+La possibilit@`a di cancellare un intero vettore in una sola istruzione
+con @samp{delete @var{vettore}}
+(@pxref{Cancellazione}).
+
+@item
+Modifiche nelle opzioni della riga di comando
+(@pxref{Opzioni}):
+
+@itemize @value{MINUS}
+@item
+La possibilit@`a di usare opzioni in formato lungo (in stile GNU) che iniziano
+con @option{--}.
+
+@item
+L'opzione @option{--source} per combinare codice sorgente immesso nella riga
+di comando e codice sorgente proveniente da file di libreria.
+@end itemize
+@end itemize
+
+La versione 3.0 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
+
+@itemize @value{BULLET}
+@item
+Variabili nuove o modificate:
+
+@itemize @value{MINUS}
+@item
+@code{IGNORECASE} modificato, diventa applicabile al confronto tra stringhe,
+come pure alle operazioni su @dfn{regexp}
+(@pxref{Maiuscolo-Minuscolo}).
+
+@item
+@code{RT}, che contiene il testo in input che @`e stato individuato da @code{RS}
+(@pxref{Record}).
+@end itemize
+
+@item
+Supporto completo sia per le @dfn{regexp} POSIX sia per quelle GNU
+@iftex
+(@pxrefil{Espressioni regolari}).
+@end iftex
+@ifnottex
+(@pxref{Espressioni regolari}).
+@end ifnottex
+
+@item
+La funzione @code{gensub()} per migliorare la manipolazione di testi
+(@pxref{Funzioni per stringhe}).
+
+@item
+La funzione @code{strftime()} prevede un formato di data e ora di default,
+in modo da poter essere chiamata senza alcun argomento.
+(@pxref{Funzioni di tempo}).
+
+@item
+La possibilit@`a che @code{FS} e il terzo argomento della funzione
+@code{split()} siano delle stringhe nulle
+(@pxref{Campi di un solo carattere}).
+
+@item
+La possibilit@`a che @code{RS} sia una @dfn{regexp}
+(@pxref{Record}).
+
+@item
+L'istruzione @code{next file} @`e diventata @code{nextfile}
+(@pxref{Istruzione nextfile}).
+
+@item
+La funzione @code{fflush()} di
+BWK @command{awk}
+(BWK allora lavorava ai Bell Laboratories;
+@pxref{Funzioni di I/O}).
+
+@item
+Nuove opzioni della riga di comando:
+
+@itemize @value{MINUS}
+@item
+L'opzione @option{--lint-old} per
+ottenere messaggi relativi a costrutti non disponibili
+nell'implementazione di @command{awk} per Unix Version 7
+(@pxref{V7/SVR3.1}).
+
+@item
+L'opzione @option{-m} da BWK @command{awk}.  (Brian lavorava
+ancora ai Bell Laboratories all'epoca.)  Quest'opzione @`e stata in seguito
+rimossa, sia dal suo @command{awk} che da @command{gawk}.
+
+@item
+L'opzione @option{--re-interval} per consentire di specificare
+espressioni di intervallo nelle @dfn{regexp}
+(@pxref{Operatori di espressioni regolari}).
+
+@item
+L'opzione @option{--traditional} aggiunta come maniera pi@`u intuitiva
+per richiedere l'opzione
+@option{--compat} (@pxref{Opzioni}).
+@end itemize
+
+@item
+L'uso di GNU Autoconf per controllare il processo di configurazione
+(@pxref{Installazione veloce}).
+
+@item
+Supporto per Amiga.
+Questo supporto @`e stato rimosso in seguito.
+
+@end itemize
+
+La versione 3.1 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
+
+@itemize @value{BULLET}
+@item
+Nuove variabili
+(@pxref{Variabili predefinite}):
+
+@itemize @value{MINUS}
+@item
+@code{BINMODE}, per sistemi non aderenti allo standard POSIX,
+che consente I/O binario per file in input e/o output
+(@pxref{Uso su PC}).
+
+@item
+@code{LINT}, che controlla dinamicamente gli avvertimenti emessi da @dfn{lint}.
+
+@item
+@code{PROCINFO}, un vettore che fornisce informazioni correlate con il
+processo in esecuzione.
+
+@item
+@code{TEXTDOMAIN}, per impostare il dominio testuale in cui internazionalizzare
+un'applicazione (@pxref{Internazionalizzazione}).
+@end itemize
+
+@item
+La possibilit@`a di usare costanti ottali ed esadecimali nel codice
+sorgente di programmi @command{awk}.
+(@pxref{Numeri non-decimali}).
+
+@item
+L'operatore @samp{|&} per effettuare I/O bidirezionale verso un
+coprocesso
+(@pxref{I/O bidirezionale}).
+
+@item
+I file speciali @file{/inet} per interagire con reti TCP/IP usando @samp{|&}
+(@pxref{Reti TCP/IP}).
+
+@item
+Il secondo argomento opzionale della funzione @code{close()} per permettere di
+chiudere uno dei lati di una @dfn{pipe} bidirezionale aperta con un coprocesso
+(@pxref{I/O bidirezionale}).
+
+@item
+Il terzo argomento opzionale della funzione @code{match()} per
+avere a disposizione le diverse sottoespressioni individuate all'interno
+di una @dfn{regexp}
+(@pxref{Funzioni per stringhe}).
+
+@item
+Specificatori posizionali nelle stringhe di formato di @code{printf} per
+facilitare la traduzione di messaggi
+(@pxref{Ordinamento di printf}).
+
+@item
+Alcune nuove funzioni predefinite:
+
+@itemize @value{MINUS}
+@item
+Le funzioni @code{asort()} e @code{asorti()} per l'ordinamento di vettori
+(@pxref{Ordinamento di vettori}).
+
+@item
+Le funzioni @code{bindtextdomain()}, @code{dcgettext()} e @code{dcngettext()}
+per l'internationalizzazione
+(@pxref{I18N per programmatore}).
+
+@item
+La funzione @code{extension()} e la possibilit@`a di aggiungere
+nuove funzioni predefinite dinamicamente
+@iftex
+(@pxrefil{Estensioni dinamiche}).
+@end iftex
+@ifnottex
+(@pxref{Estensioni dinamiche}).
+@end ifnottex
+
+@item
+La funzione @code{mktime()} per generare date e ore
+(@pxref{Funzioni di tempo}).
+
+@item
+Le funzioni @code{and()}, @code{or()}, @code{xor()}, @code{compl()},
+@code{lshift()}, @code{rshift()} e @code{strtonum()}
+(@pxref{Funzioni a livello di bit}).
+@end itemize
+
+@item
+@cindex @code{next file} statement
+Il supporto per @samp{next file} scritto come due parole @`e stato rimosso
+completamente
+(@pxref{Istruzione nextfile}).
+
+@item
+Ulteriori opzioni sulla riga di comando
+(@pxref{Opzioni}):
+
+@itemize @value{MINUS}
+@item
+L'opzione @option{--dump-variables} per stampare una lista di tutte le
+variabili globali.
+
+@item
+L'opzione @option{--exec}, da usare in @dfn{script} CGI [Common Gateway Interface].
+
+@item
+L'opzione della riga di comando @option{--gen-po} e l'uso di un trattino
+basso a inizio stringa, per segnalare stringhe che dovrebbero essere tradotte
+(@pxref{Estrazione di stringhe}).
+
+@item
+L'opzione @option{--non-decimal-data} per consentire di avere dati in input
+di tipo non decimale
+(@pxref{Dati non decimali}).
+
+@item
+L'opzione @option{--profile} e @command{pgawk}, la
+versione profilatrice di @command{gawk}, per produrre profili di esecuzione
+di programmi @command{awk}
+(@pxref{Profilare}).
+
+@item
+L'opzione @option{--use-lc-numeric} per richiedere a @command{gawk}
+di usare il carattere di separazione decimale proprio della localizzazione
+nell'elaborazione dei dati in input
+(@pxref{Conversione}).
+@end itemize
+
+@item
+L'uso di GNU Automake a supporto della standardizzazione del processo
+di configurazione
+(@pxref{Installazione veloce}).
+
+@item
+L'uso di GNU @command{gettext} per i messaggi emessi da @command{gawk}
+(@pxref{Gawk internazionalizzato}).
+
+@item
+Supporto per BeOS. Rimosso in seguito.
+
+@item
+Supporto per Tandem. Rimosso in seguito.
+
+@item
+La versione per Atari ufficialmente non @`e pi@`u supportata e in seguito
+@`e stata completamente rimossa.
+
+@item
+Modifiche al codice sorgente per usare definizioni di funzione secondo lo
+stile di codifica dello standard ISO C.
+
+@item
+Aderenza alla specifica POSIX per le funzioni @code{sub()} e @code{gsub()}
+(@pxref{Dettagli ostici}).
+
+@item
+La funzione @code{length()} @`e stata estesa per accettare un vettore come
+argomento, e restituire in tal caso il numero di elementi nel vettore
+(@pxref{Funzioni per stringhe}).
+
+@item
+La funzione @code{strftime()} accetta un terzo argomento per
+dare la possibilit@`a di stampare data e ora nel formato UTC
+(@pxref{Funzioni di tempo}).
+@end itemize
+
+La versione 4.0 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
+
+@itemize @value{BULLET}
+
+@item
+Aggiunta di variabili:
+
+@itemize @value{MINUS}
+@item
+@code{FPAT}, che permette di specificare una @dfn{regexp} che individua
+i campi, invece che individuare il separatore tra i campi
+(@pxref{Separazione in base al contenuto}).
+
+@item
+Se esiste l'elemento di vettore @code{PROCINFO["sorted_in"]}, il ciclo
+@samp{for(indice in pippo)} ordina
+gli indici, prima di iniziare il ciclo. Il valore di questo elemento
+permette di controllare l'ordinamento degli indici prima di iniziare il
+ciclo che li visita tutti
+(@pxref{Controllare visita}).
+
+@item
+@code{PROCINFO["strftime"]}, che contiene la stringa di formato
+di default per @code{strftime()}
+(@pxref{Funzioni di tempo}).
+@end itemize
+
+@item
+I file speciali @file{/dev/pid}, @file{/dev/ppid}, @file{/dev/pgrpid}
+e @file{/dev/user} sono stati rimossi.
+
+@item
+Il supporto per IPv6 @`e stato aggiunto attraverso il file speciale
+@file{/inet6}.
+Il file speciale @file{/inet4} consente di operare con IPv4 e @file{/inet}
+opera con il default di sistema, che probabilmente @`e IPv4
+(@pxref{Reti TCP/IP}).
+
+@item
+L'uso delle sequenze di protezione @samp{\s} e @samp{\S} nelle espressioni
+regolari
+(@pxref{Operatori di @dfn{regexp} GNU}).
+
+@item
+Le espressioni di intervallo sono consentite per default nelle espressioni
+regolari
+(@pxref{Operatori di espressioni regolari}).
+
+@item
+La classi di caratteri POSIX sono consentite anche se si @`e specificata
+l'opzione @option{--traditional}
+(@pxref{Operatori di espressioni regolari}).
+
+@item
+@code{break} e @code{continue} non sono pi@`u consentiti fuori da un ciclo,
+anche se si @`e specificata l'opzione @option{--traditional}
+(@pxref{Istruzione break} e anche la
+@ref{Istruzione continue}).
+
+@item
+@code{fflush()}, @code{nextfile} e @samp{delete @var{array}}
+sono consentite anche se @`e stata specificata l'opzione @option{--posix} o
+@option{--traditional}, poich@'e questi costrutti sono ora inclusi
+nello standard POSIX.
+
+@item
+Un terzo argomento opzionale per le funzioni @code{asort()} e @code{asorti()}
+permette di specificare il tipo di ordinamento desiderato
+(@pxref{Funzioni per stringhe}).
+
+@item
+Il comportamento di @code{fflush()} @`e stato modificato per corrispondere
+a quello di BWK @command{awk}
+e per lo standard POSIX; ora sia @samp{fflush()} che @samp{fflush("")}
+forzano la scrittura di tutte le ridirezioni in output aperte
+(@pxref{Funzioni di I/O}).
+
+@item
+La funzione @code{isarray()}
+determina se un elemento @`e un vettore oppure no
+per rendere possibile la visita di vettori di vettori
+(@pxref{Funzioni per i tipi}).
+
+@item
+La funzione @code{patsplit()} che
+fornisce le stesse funzionalit@`a di @code{FPAT}, per suddividere delle stringhe
+(@pxref{Funzioni per stringhe}).
+
+@item
+Un quarto argomento opzionale per la funzione @code{split()},
+che indica un vettore destinato a contenere i valori dei separatori
+(@pxref{Funzioni per stringhe}).
+
+@item
+Vettori di vettori
+(@pxref{Vettori di vettori}).
+
+@item
+I criteri di ricerca speciali @code{BEGINFILE} ed @code{ENDFILE}
+(@pxref{BEGINFILE/ENDFILE}).
+
+@item
+Chiamate indirette di funzioni
+(@pxref{Chiamate indirette}).
+
+@item
+Le istruzioni @code{switch} / @code{case} sono disponibili per default
+(@pxref{Istruzione switch}).
+
+@item
+Modifiche nelle opzioni della riga di comando
+(@pxref{Opzioni}):
+
+@itemize @value{MINUS}
+@item
+Le opzioni @option{-b} e @option{--characters-as-bytes},
+che impediscono che @command{gawk} tratti l'input come composto da una
+stringa di caratteri multibyte.
+
+@item
+Rimozione delle opzioni ridondanti (in notazione lunga) @option{--compat},
+@option{--copyleft} e @option{--usage}.
+
+@item
+L'opzione @option{--gen-po} @`e stata finalmente rinominata
+@option{--gen-pot} per correttezza.
+
+@item
+L'opzione @option{--sandbox} che disabilita alcune funzionalit@`a [per operare
+in un ambiente "protetto"].
+
+@item
+Tutte le opzioni in notazione lunga hanno acquisito opzioni corrispondenti
+in notazione breve, per poter essere usate negli @dfn{script} di shell @samp{#!}.
+@end itemize
+
+@item
+I nomi di directory che appaiono sulla riga di comando generano adesso
+un messaggio di errore, ma non interrompono l'elaborazione, a meno che non
+siano state specificate le opzioni @option{--posix} o @option{--traditional}
+(@pxref{Directory su riga di comando}).
+
+@item
+Il codice interno di @command{gawk} @`e stato riscritto, aggiungendo la
+versione per il debug @command{dgawk},
+con un possibile miglioramento nei tempi di esecuzione
+@iftex
+(@pxrefil{Debugger}).
+@end iftex
+@ifnottex
+(@pxref{Debugger}).
+@end ifnottex
+
+@item
+In aderenza agli standard di codifica GNU, le estensioni dinamiche devono
+definire un simbolo globale che indica che sono compatibili con la
+licenza GPL
+(@pxref{Licenza delle estensioni}).
+
+@item
+In modalit@`a POSIX, i confronti tra stringhe usano le funzioni di
+libreria @code{strcoll()} / @code{wcscoll()}
+(@pxref{Confronto POSIX di stringhe}).
+
+@item
+L'opzione per usare @dfn{socket} in maniera @dfn{raw} (nativa) @`e stata
+rimossa, perch@'e non era mai stata implementata
+(@pxref{Reti TCP/IP}).
+
+@item
+Intervalli nella forma @samp{[d-h]} sono elaborati come se fossero scritti
+nella localizzazione C, a prescindere da che tipo di @dfn{regexp} @`e usata,
+anche se era stata specificata l'opzione
+@option{--posix}
+(@pxref{Intervalli e localizzazione}).
+
+@item
+@`E stato rimosso il supporto per i seguenti sistemi:
+
+@itemize @value{MINUS}
+@item
+Atari
+
+@item
+Amiga
+
+@item
+BeOS
+
+@item
+Cray
+
+@item
+MIPS RiscOS
+
+@item
+MS-DOS col Compilatore Microsoft
+
+@item
+MS-Windows col Compilatore Microsoft
+
+@item
+NeXT
+
+@item
+SunOS 3.x, Sun 386 (Road Runner)
+
+@item
+Tandem (non-POSIX)
+
+@item
+Compilatore pre-standard VAX C per VAX/VMS
+@end itemize
+@end itemize
+
+La versione 4.1 di @command{gawk} ha introdotto le seguenti funzionalit@`a:
+
+@itemize @value{BULLET}
+
+@item
+Tre nuovi vettori:
+@code{SYMTAB}, @code{FUNCTAB} e @code{PROCINFO["identifiers"]}
+(@pxref{Variabili auto-assegnate}).
+
+@item
+I tre comandi eseguibili @command{gawk}, @command{pgawk} e @command{dgawk},
+sono diventati uno solo, con il solo nome @command{gawk}.  Di conseguenza
+le opzioni sulla riga di comando sono state modificate.
+
+@item
+Modifiche delle opzioni da riga di comando
+(@pxref{Opzioni}):
+
+@itemize @value{MINUS}
+@item
+L'opzione @option{-D} attiva il debugger.
+
+@item
+Le opzioni @option{-i} e @option{--include}
+caricano dei file di libreria @command{awk}.
+
+@item
+Le opzioni @option{-l} e @option{--load} caricano estensioni dinamiche
+compilate.
+
+@item
+Le opzioni @option{-M} e @option{--bignum} abilitano la libreria MPFR per
+il calcolo con un numero arbitrario di cifre significative.
+
+@item
+L'opzione @option{-o} serve solo a ottenere in output una stampa formattata
+elegantemente del programma da eseguire.
+
+@item
+L'opzione @option{-p} @`e usata per "profilare" l'esecuzione del programma.
+
+@item
+L'opzione @option{-R} @`e stata rimossa.
+@end itemize
+
+@item
+Supporto per il calcolo ad alta precisione con MPFR
+(@pxref{Calcolo con precisione arbitraria}).
+
+@item
+Le funzioni @code{and()}, @code{or()} e @code{xor()} sono state modificate
+per ammettere un numero qualsiasi di argomenti, con un minimo di due
+(@pxref{Funzioni a livello di bit}).
+
+
+@item
+L'interfaccia che rende possibile l'estensione dinamica @`e stata rifatta
+completamente
+@iftex
+(@pxrefil{Estensioni dinamiche}).
+@end iftex
+@ifnottex
+(@pxref{Estensioni dinamiche}).
+@end ifnottex
+
+@item
+La funzione @code{getline} ridiretta @`e stata resa possibile all'interno di
+@code{BEGINFILE} ed @code{ENDFILE}
+(@pxref{BEGINFILE/ENDFILE}).
+
+@item
+Il comando @code{where} @`e stato aggiunto al debugger
+(@pxref{Stack di esecuzione}).
+
+@item
+Il supporto per Ultrix @`e stato rimosso.
+
+@end itemize
+
+La versione 4.2 di @command{gawk} ha introdotto le seguenti modifiche:
+
+@itemize @bullet
+@item
+Differenze apportate alle variabili d'ambiente (@code{ENVIRON}) sono
+riflesse in quelle rese disponibili a @command{gawk} e in quelle di
+programmi che siano da esso richiamati.
+@xref{Variabili auto-assegnate}.
+
+@item
+@code{FIELDWIDTHS} @`e stato migliorato per consentire di saltare dei
+caratteri prima di assegnare il valore di un campo
+(@pxref{Separazione in base al contenuto}).
+
+@item
+Il vettore @code{PROCINFO["argv"]}.
+@xref{Variabili auto-assegnate}.
+
+@item
+Il numero massimo di cifre esadecimali consentito nelle sequenze di
+protezione @samp{\x} @`e ora limitato a due.
+@xref{Sequenze di protezione}.
+
+@item
+Costanti @dfn{regexp} forti nella forma @samp{@@/@dots{}/}
+(@pxref{Costanti @dfn{regexp} forti}).
+
+@item
+Le funzioni a livello di bit sono state modificate. Se si
+forniscono argomenti negativi, viene generato un errore fatale.
+(@pxref{Funzioni a livello di bit}).
+
+@ifset INTDIV
+@item
+La funzione @code{intdiv0()}.
+@xref{Funzioni numeriche}.
+@end ifset
+
+@item
+La funzione @code{mktime()} ora accetta un secondo argomento opzionale
+(@pxref{Funzioni di tempo}).
+
+@item
+La funzione @code{typeof()} (@pxref{Funzioni per i tipi}).
+
+@item
+Le ottimizzazioni sono abilitate per default.  Si usi @option{-s} /
+@option{--no-optimize} per non effettuare ottimizzazioni.
+
+@item
+Per molti anni, lo standard POSIX richiedeva che la separazione dei campi
+di un record fosse fatta per default
+quando si incontrano spazi e TAB, e questo @`e il comportamento di
+@command{gawk} se si specifica l'opzione @option{--posix}.  Dal 2013
+il comportamento originario @`e stato ripristinato, e ora
+il default per separare i campi con l'opzione @option{--posix} ammette
+anche il ritorno a capo come separatore di campi.
+
+@item
+Continuazione dopo errori [non fatali] con @code{print} e @code{printf}.
+@xref{Continuazione dopo errori}.
+
+@item
+Possibilit@`a di tentare di nuovo l'I/O in input
+attraverso @code{PROCINFO[@var{input-file}, "RETRY"]};
+(@pxref{Proseguire dopo errore in input}).
+
+@item
+Modifiche all'opzione @option{--pretty-print}
+(@pxref{Profilare}):
+
+@c nested table
+@itemize @value{MINUS}
+@item
+L'opzione @option{--pretty-print} non esegue pi@`u il programma @command{awk}
+come in precedenza.
+
+@item
+I commenti nel programma sorgente sono conservati e inseriti nel file
+in output.
+
+@item
+Parentesi esplicite [anche se non strettamente necessarie] nelle espressioni
+in input sono mantenute nell'output generato.
+@end itemize
+
+@item
+Miglioramenti all'API per l'estensione
+(@pxref{Estensioni dinamiche}):
+
+@c nested
+@itemize @value{MINUS}
+@item
+La funzione @code{get_file()} @`e in grado di accedere
+a ridirezioni in fase di @dfn{open}.
+
+@item
+La funzione @code{nonfatal()} per generare messaggi di errore non fatali
+(che non provocano la fine del programma).
+
+@item
+Supporto per i numeri scritti per essere usati tramite GMP ed MPFR.
+
+@item
+Gli analizzatori di input possono ora prevalere sul meccanismo di
+analisi dei campi, specificando delle posizioni precise.
+@end itemize
+
+@item
+Dei file per iniziare una sessione sono inclusi nella distribuzione
+e installati da @samp{make install}
+(@pxref{File da usare a inizio sessione}).
+
+@item
+Il programma @command{igawk} e la relativa pagina di manuale non
+sono pi@`u installati quando si compila @command{gawk} [il programma
+non @`e pi@`u necessario].
+@xref{Programma igawk}.
+
+@item
+Il supporto per MirBSD @`e stato rimosso.
+
+@item
+Il supporto per GNU/Linux sull'architettura Alpha @`e stato rimosso.
+
+@end itemize
+
+La @value{PVERSION} 5.0 ha aggiunto le seguenti funzionalit@`a:
+
+@itemize
+@item
+L'elemento di vettore @code{PROCINFO["platform"]}, che permette di
+scrivere del codice che tiene conto di piattaforma / sistema operativo.
+@end itemize
+
+@c XXX ADD MORE STUFF HERE
+@end ifclear
+
+@node Estensioni comuni
+@appendixsec Sommario Estensioni Comuni
+
+@cindex estensioni, Brian Kernighan @command{awk}
+@cindex estensioni, @command{mawk}
+La tabella seguente dettaglia le estensioni comuni supportate
+da @command{gawk}, da Brian Kernighan @command{awk} e da @command{mawk},
+le tre versioni liberamente disponibili pi@`u usate di @command{awk}
+(@pxref{Altre versioni}).
+
+@multitable {File speciale @file{/dev/stderr}} {BWK @command{awk} } {@command{mawk}} {@command{gawk}} {Standard attuale}
+@headitem Funzionalit@`a @tab BWK @command{awk} @tab @command{mawk} @tab @command{gawk} @tab Standard attuale
+@item Sequenza di protezione @samp{\x} @tab X @tab X @tab X @tab
+@item Stringa nulla come @code{FS} @tab X @tab X @tab X @tab
+@item File speciale @file{/dev/stdin} @tab X @tab X @tab X @tab
+@item File speciale @file{/dev/stdout} @tab X @tab X @tab X @tab
+@item File speciale @file{/dev/stderr} @tab X @tab X @tab X @tab
+@item @code{delete} senza indici @tab X @tab X @tab X @tab X
+@item Funzione @code{fflush()} @tab X @tab X @tab X @tab X
+@item @code{length()} di un vettore @tab X @tab X @tab X @tab
+@item Istruzione @code{nextfile} @tab X @tab X @tab X @tab X
+@item Operatori @code{**} e @code{**=} @tab X @tab @tab X @tab
+@item Parola chiave @code{func} @tab X @tab @tab X @tab
+@item Variabile @code{BINMODE} @tab @tab X @tab X @tab
+@item @code{RS} come @dfn{regexp} @tab @tab X @tab X @tab
+@item Funzioni gestione data/ora @tab @tab X @tab X @tab
+@end multitable
+
+@node Intervalli e localizzazione
+@appendixsec Intervalli @dfn{regexp} e localizzazione: una lunga e triste storia
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} descrive la storia confusionaria degli intervalli
+all'interno di espressioni regolari, le loro relazioni con la localizzazione,
+e l'effetto da ci@`o determinato su diverse versioni di @command{gawk}.
+
+Gli strumenti originali Unix aventi a che fare con espressioni regolari
+stabilivano che intervalli di caratteri (come @samp{[a-z]}) individuavano
+un carattere qualsiasi tra il primo carattere dell'intervallo e l'ultimo
+carattere dello stesso, entrambi inclusi.  L'ordinamento era basato sul
+valore numerico di ogni carattere come era rappresentato all'interno
+del computer, nell'insieme di caratteri proprio di ogni macchina.
+Quindi, su sistemi che adottano la codifica ASCII, @samp{[a-z]} individua
+tutte le lettere minuscole, e solo
+quelle, in quanto i valori numerici che rappresentano le lettere dalla
+@samp{a} fino alla @samp{z} sono contigui.  (In un sistema che adotta la
+codifica EBCDIC, l'intervallo @samp{[a-z]} comprende anche ulteriori
+caratteri non alfabetici.)
+
+Quasi tutti i testi di introduzione allo Unix spiegavano che le espressioni
+di intervallo funzionavano in questo modo, e in particolare insegnavano che
+la maniera ``corretta'' per individuare le lettere minuscole era con
+@samp{[a-z]} e che @samp{[A-Z]} era il modo ``corretto'' per individuare le
+lettere maiuscole.
+E, in effetti, era proprio cos@`{@dotless{i}}.@footnote{E la vita era semplice.}
+
+Lo standard POSIX 1992 introduceva l'idea di localizzazione
+(@pxref{Localizzazioni}).
+Poich@'e molte localizzazioni comprendono altre lettere, oltre alle 26
+lettere dell'alfabeto inglese, lo standard POSIX introduceva le classi
+di carattere (@pxref{Espressioni tra parentesi quadre}) per permettere
+l'individuazione di differenti insiemi di caratteri, in aggiunta a quelli
+tradizionali presenti nell'insieme di caratteri ASCII.
+
+Tuttavia, lo standard @emph{ha modificato} l'interpretazione delle
+espressioni di intervallo.
+Nelle localizzazioni @code{"C"} e @code{"POSIX"},
+un'espressione di intervallo come
+@samp{[a-dx-z]} @`e ancora equivalente a @samp{[abcdxyz]}, secondo l'ordine
+della codifica ASCII.
+Ma in tutte le altre localizzazioni l'ordinamento @`e basato su quel che
+si chiama @dfn{ordine di collazione}.
+
+Cosa vuol dire?
+In molte localizzazioni, le lettere @samp{A} e @samp{a} vengono entrambe
+prima di @samp{B}.
+In altre parole, queste localizzazioni ordinano i caratteri nel modo in cui
+sono ordinati in un dizionario,
+e @samp{[a-dx-z]} non @`e detto che equivalga a @samp{[abcdxyz]};
+invece, potrebbe essere equivalente a @samp{[ABCXYabcdxyz]}, per fare un
+esempio.
+
+Su questo punto @`e opportuno insistere: molta documentazione afferma che
+si dovrebbe usare @samp{[a-z]} per identificare un carattere minuscolo.
+Ma su sistemi con localizzazioni
+non-ASCII, un tale intervallo potrebbe includere tutti i caratteri maiuscoli
+tranne @samp{A} o @samp{Z}!  Questo ha continuato a essere una fonte di
+equivoci perfino nel ventunesimo secolo.
+
+Per dare un'idea del tipo di problemi, l'esempio seguente usa la funzione
+@code{sub()}, che effettua una sostituzione di testo all'interno di una
+stringa (@pxref{Funzioni per stringhe}).  Qui, l'idea @`e quella di rimuovere
+i caratteri maiuscoli a fine stringa:
+
+@example
+$ @kbd{echo qualcosa1234abc | gawk-3.1.8 '@{ sub("[A-Z]*$", ""); print @}'}
+@print{} qualcosa1234a
+@end example
+
+@noindent
+Questo non @`e l'output che ci si aspettava, perch@'e, il @samp{bc} alla fine di
+@samp{qualcosa1234abc} non dovrebbe essere individuato da @samp{[A-Z]*}.
+Un tale risultato dipende dalle impostazioni di localizzazione (e quindi
+potrebbe non succedere sul sistema che si sta usando).
+
+@cindex Unicode
+Considerazioni simili valgono per altri intervalli.  Per esempio, @samp{["-/]}
+@`e perfettamente valido in ASCII, ma non @`e valido in molte localizzazioni
+Unicode, p.es. in @code{en_US.UTF-8}.
+
+Il codice delle prime versioni di @command{gawk} per individuare le
+@dfn{regexp} non teneva conto della localizzazione, e quindi gli
+intervalli potevano essere interpretati in maniera tradizionale.
+
+Quando @command{gawk} ha iniziato a usare metodi di ricerca di @dfn{regexp}
+che tengono conto della localizzazione, sono iniziati i problemi;
+a maggior ragione in quanto sia GNU/Linux che i venditori di versioni
+commerciali di Unix
+avevano iniziato a implementare localizzazioni non-ASCII,
+@emph{adottandole per default}.  La domanda che forse si udiva pi@`u spesso
+era del tipo: ``Perch@'e @samp{[A-Z]} individua lettere minuscole?!?''
+
+@cindex Berry, Karl
+Questa situazione @`e in essere da circa 10 anni, se non di pi@`u, e
+il manutentore di @command{gawk} si @`e stufato di continuare a spiegare che
+@command{gawk} stava semplicemente implementando quelli che sono gli
+standard, e che il problema stava nella localizzazione dell'utente.  Nella
+fase di sviluppo della @value{PVERSION} 4.0, @command{gawk} @`e stato modificato
+in modo da trattare sempre gli
+intervalli "come si faceva prima di POSIX", a meno che non si specifichi
+l'opzione @option{--posix} (@pxref{Opzioni}).@footnote{Ed
+@`e cos@`{@dotless{i}} che @`e nata la Campagna per l'Interpretazione Razionale degli
+Intervalli (in inglese, RRI [@dfn{Rational Range Interpretation}]).
+Un certo
+numero di strumenti GNU hanno gi@`a implementato questa modifica, o
+lo faranno presto.  Grazie a Karl Berry per aver coniato la frase
+``Rational Range Interpretation''.}
+
+Fortunatamente, un po' prima del rilascio definitivo della versione 4.0 di
+@command{gawk}, il manutentore ha appreso che lo standard 2008 aveva
+modificato la definizione di intervallo, e che, al di fuori delle
+localizzazioni @code{"C"} e @code{"POSIX"}, il significato di espressione
+di intervallo era ora
+@emph{indefinito}.@footnote{Si veda
+@uref{http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05, lo standard}
+e
+@uref{http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap09.html#tag_21_09_03_05, le motivazioni}.}
+
+Adottando questo simpatico termine tecnico, lo standard permette agli
+implementatori di implementare gli intervalli nella maniera che preferiscono.
+Il manutentore di @command{gawk} ha deciso di implementare la regola pre-POSIX
+sia per l'individuazione di default delle @dfn{regexp} sia quando si
+specificano le opzioni @option{--traditional} o @option{--posix}.
+In ogni caso @command{gawk} aderisce allo standard POSIX.
+
+@node Contributori
+@appendixsec I principali contributori a @command{gawk}
+@cindex @command{gawk}, lista di contributori a
+@quotation
+@i{Riconoscere sempre il merito, se un merito va riconosciuto.}
+@author Anonimo
+@end quotation
+
+Questa @value{SECTION} elenca le persone che hanno maggiormente contribuito
+allo sviluppo di @command{gawk} e/o alla stesura di questo @value{DOCUMENT},
+in ordine approssimativamente cronologico:
+
+@itemize @value{BULLET}
+@item
+@cindex Aho, Alfred
+@cindex Weinberger, Peter
+@cindex Kernighan, Brian
+Il Dr.@: Alfred V.@: Aho,
+il Dr.@: Peter J.@: Weinberger, e
+il Dr.@: Brian W.@: Kernighan, tutti dei Bell Laboratories,
+hanno progettato e implementato @command{awk} per Unix,
+da cui @command{gawk} trae la maggioranza delle sue funzionalit@`a.
+
+@item
+@cindex Rubin, Paul
+Paul Rubin,
+autore del progetto e dell'implementazione iniziale del 1986, ha
+scritto la prima bozza (di circa 40 pagine) di questo @value{DOCUMENT}.
+
+@item
+@cindex Fenlason, Jay
+Jay Fenlason
+ha completato l'implementazione iniziale.
+
+@item
+@cindex Close, Diane
+Diane Close
+ha rivisto la prima bozza di questo @value{DOCUMENT}, portandolo alla
+lunghezza di circa 90 pagine.
+
+@item
+@cindex Stallman, Richard
+Richard Stallman
+ha aiutato a completare l'implementazione e la bozza iniziale di questo
+@value{DOCUMENT}.
+@`E anche il fondatore della FSF e del progetto GNU.
+
+@item
+@cindex Woods, John
+John Woods
+ha scritto porzioni di codice (volti principalmente alla correzione di
+errori) nella versione iniziale di @command{gawk}.
+
+@item
+@cindex Trueman, David
+Nel 1988,
+David Trueman
+si @`e fatto carico della manutenzione principale di @command{gawk},
+rendendolo compatibile col ``nuovo'' @command{awk} e
+migliorandone parecchio la velocit@`a di esecuzione.
+
+@item
+@cindex Kwok, Conrad
+@cindex Garfinkle, Scott
+@cindex Williams, Kent
+Conrad Kwok,
+Scott Garfinkle
+e
+Kent Williams
+hanno per primi portato il programma all'ambiente MS-DOS, usando varie
+versioni del compilatore MSC.
+
+@item
+@cindex Rankin, Pat
+Pat Rankin
+ha portato il programma all'ambiente VMS, preparando anche la relativa
+documentazione.
+
+@item
+@cindex Peterson, Hal
+Hal Peterson
+@`e stato di aiuto nel portare @command{gawk} nei sistemy Cray.
+(L'ambiente Cray non @`e pi@`u supportato.)
+
+@item
+@cindex Rommel, Kai Uwe
+Kai Uwe Rommel
+ha portato per primo il programma all'ambiente OS/2, preparando anche
+la relativa documentazione.
+
+@item
+@cindex Jaegermann, Michal
+Michal Jaegermann
+ha portato il programma all'ambiente Atari, preparando anche la relativa
+documentazione.
+(L'ambiente Atari non @`e pi@`u supportato.)
+Michal continua a effettuare controlli di portabilit@`a,
+e ha molto contribuito a consentire a @command{gawk}
+di funzionare su sistemi diversi da quelli a 32 bit.
+
+@item
+@cindex Fish, Fred
+Fred Fish
+ha portato il programma all'ambiente Amiga, preparando anche la relativa
+documentazione.
+(Purtroppo Fred non @`e pi@`u tra noi, e questo ambiente non @`e pi@`u supportato.)
+
+@item
+@cindex Deifik, Scott
+Scott Deifik
+si @`e occupato in passato della manutenzione per MS-DOS usando
+il compilatore DJGPP.
+
+@item
+@cindex Zaretskii, Eli
+Eli Zaretskii
+si occupa della manutenzione della versione per MS-Windows, nell'ambiente
+MinGW.
+
+@item
+@cindex Grigera, Juan
+Juan Grigera
+@`e autore di una versione di @command{gawk} per sistemi Windows32.
+(Questa versione non @`e pi@`u supportata.)
+
+
+@item
+@cindex Hankerson, Darrel
+Per molti anni, il
+Dr.@: Darrel Hankerson
+ha fatto da coordinatore per le varie versioni che giravano su diverse
+piattaforme PC e ha creato distribuzioni binarie per vari sistemi operativi
+che girano sui PC.
+Il suo aiuto @`e stato importante per mantenere aggiornata la documentazione
+per le diverse piattaforme PC.
+
+@item
+@cindex Zoulas, Christos
+Christos Zoulas
+ha scritto la funzione predefinita @code{extension()} per aggiungere
+dinamicamente nuove funzioni.
+(Questa funzionalit@`a @`e divenuta obsoleta a partire da @command{gawk} 4.1.)
+
+@item
+@cindex Kahrs, J@"urgen
+J@"urgen Kahrs
+ha scritto la prima versione del codice per interagire con la rete
+TCP/IP, con la relativa documentazione, e fornito le ragioni per l'aggiunta
+dell'operatore @samp{|&}.
+
+@item
+@cindex Davies, Stephen
+Stephen Davies
+ha portato per la prima volta il programma all'ambiente Tandem, preparando
+anche la relativa documentazione.
+(Tuttavia, questa versione non @`e pi@`u supportata.)
+Stephen @`e anche stato determinante nel lavoro iniziale per integrare il codice
+interno di gestione dei byte nel
+complesso del codice di @command{gawk}.
+Inoltre, ha svolto molto del lavoro necessario per far s@`{@dotless{i}} che usando
+l'opzione @option{--pretty-print} i commenti venissero conservati e
+stampati nell'output.
+
+@item
+@cindex Woehlke, Matthew
+Matthew Woehlke
+ha migliorato l'aderenza allo standard POSIX nei sistemi Tandem che
+implementano lo standard.
+
+@item
+@cindex Brown, Martin
+Martin Brown
+ha portato il programma all'ambiente BeOS, preparando anche la relativa
+documentazione.
+(L'ambiente BeOS non @`e pi@`u supportato.)
+
+@item
+@cindex Peters, Arno
+Arno Peters
+ha fatto il lavoro iniziale necessario per consentire alla configurazione
+di @command{gawk} di usare GNU Automake e GNU @command{gettext}.
+
+@item
+@cindex Broder, Alan J.@:
+Alan J.@: Broder
+ha scritto la prima versione della funzione @code{asort()} e anche
+il codice per gestire il terzo argomento opzionale della funzione
+@code{match()}.
+
+@item
+@cindex Buening, Andreas
+Andreas Buening
+ha aggiornato la versione di @command{gawk} per OS/2.
+
+@item
+@cindex Hasegawa, Isamu
+Isamu Hasegawa,
+dell'IBM in Giappone, ha contribuito con il supporto per i caratteri multibyte.
+
+@item
+@cindex Benzinger, Michael
+Michael Benzinger ha sviluppato il codice iniziale per l'istruzione
+@code{switch}.
+
+@item
+@cindex McPhee, Patrick
+Patrick T.J.@: McPhee ha sviluppato il codice per il caricamento
+dinamico negli ambienti Windows32.
+(Questa funzionalit@`a non @`e pi@`u supportata.)
+
+@item
+@cindex Wallin, Anders
+Anders Wallin ha aiutato a continuare il supporto della versione VMS
+di @command{gawk} per parecchi anni.
+
+@item
+@cindex Gordon, Assaf
+Assaf Gordon ha contribuito il codice iniziale per implementare
+l'opzione @option{--sandbox}.
+
+@item
+@cindex Haque, John
+John Haque @`e autore dei seguenti contributi:
+
+@itemize @value{MINUS}
+@item
+Le modifiche per convertire @command{gawk}
+in un interprete di codice a livello di byte, compreso il debugger
+
+@item
+L'aggiunta di veri vettori di vettori
+
+@item
+Le modifiche ulteriori per il supporto del calcolo a precisione
+arbitraria
+
+@item
+Il testo iniziale di
+@ref{Calcolo con precisione arbitraria}
+
+@item
+Il lavoro per unificare le tre varianti del programma @command{gawk},
+in vista della versione 4.1
+
+@item
+I miglioramenti alla gestione interna dei vettori per i vettori i cui
+indici sono dei numeri interi
+
+@item
+A John, insieme a Pat Rankin, si devono i miglioramenti alla funzionalit@`a
+di ordinamento dei vettori.
+@end itemize
+
+@cindex Papadopoulos, Panos
+@item
+Panos Papadopoulos ha scritto il testo originale per
+@ref{Includere file}.
+
+@item
+@cindex Yawitz, Efraim
+Efraim Yawitz ha scritto il testo originale per il @ref{Debugger}.
+
+@item
+@cindex Schorr, Andrew
+Lo sviluppo dell'estensione API rilasciata per la prima volta con
+@command{gawk} 4.1 @`e stata principalmente guidata da
+Arnold Robbins e Andrew Schorr, con notevoli contributi dal
+resto del team di sviluppo.
+
+@cindex Malmberg, John
+@item
+John Malmberg ha apportato miglioramenti significativi alla versione
+OpenVMS e alla relativa documentazione.
+
+@item
+@cindex Colombo, Antonio
+Antonio Giovanni Colombo ha riscritto diversi esempi, che non erano pi@`u
+attuali, contenuti nei primi capitoli, e gliene sono estremamente grato.
+Ha inoltre preparato con Marco Curreli e mantiene la traduzione in
+italiano di questo libro.
+
+@item
+@cindex Curreli, Marco
+Marco Curreli, insieme con Antonio Colombo, ha tradotto questo
+@value{DOCUMENT} in italiano.  @`E ora incluso nella distribuzione
+di @command{gawk}.
+
+@item
+@cindex Guerrero, Juan Manuel
+Juan Manuel Guerrero ha preso in carico la manutenzione dellla
+versione DJGPP di @command{gawk}.
+
+@item
+@cindex Robbins, Arnold
+Arnold Robbins
+ha lavorato su @command{gawk} dal 1988, dapprima
+aiutando David Trueman e in seguito, dal 1994 circa, come
+manutentore principale.
+@end itemize
+
+@node Sommario della storia
+@appendixsec Sommario
+
+@itemize @value{BULLET}
+@item
+Il linguaggio @command{awk} si @`e evoluto col passare degli anni. La prima
+versione risale a Unix V7, circa 1978.  Nel 1987, per la versione Unix
+System V Release 3.1, sono state fatte al linguaggio delle modifiche
+importanti, inclusa la possibilit@`a di avere funzioni definite dall'utente.
+Ulteriori modifiche sono state fatte per la versione System V Release 4, nel
+1989.
+Dopo di allora, sono state apportate ulteriori modifiche minori,
+per implementare lo standard POSIX.
+
+@item
+L'@command{awk} di Brian Kernighan prevede un piccolo numero di estensioni
+implementate di comune accordo con altre versioni di @command{awk}.
+
+@item
+@command{gawk} prevede un elevato numero di estensioni rispetto
+a POSIX @command{awk}.
+Queste estensioni possono essere disabilitate specificando l'opzione
+@option{--traditional} o @option{--posix}.
+
+@item
+L'interazione tra localizzazioni POSIX e individuazione di @dfn{regexp}
+in @command{gawk} @`e stata causa di malintesi nel corso degli anni.  Oggi
+@command{gawk} implementa l'Interpretazione Razionale degli Intervalli
+(@dfn{Rational Range Interpretation}), dove
+intervalli nella forma @samp{[a-z]} individuano @emph{solo} i caratteri
+numericamente compresi tra
+@samp{a} e @samp{z} nella rappresentazione nativa dei caratteri in quella
+particolare macchina.  Normalmente quella in uso @`e quella ASCII,
+ma pu@`o essere EBCDIC sui sistemi IBM S/390.
+
+@item
+Molte persone hanno contribuito allo sviluppo di @command{gawk} nel corso
+degli anni.  Spero che l'elenco fornito in questo @value{CHAPTER} sia
+esauriente e attribuisca il giusto riconoscimento quando questo @`e dovuto.
+
+@end itemize
+
+@node Installazione
+@appendix Installare @command{gawk}
+
+@c last two commas are part of see also
+@cindex sistemi operativi, si veda anche GNU/Linux@comma{} sistemi operativi per PC@comma{} Unix
+@cindex @command{gawk}, installare
+@cindex installare @command{gawk}
+Quest'appendice contiene istruzioni per installare @command{gawk} sulle
+varie piattaforme supportate dagli sviluppatori.  Lo sviluppatore
+principale supporta GNU/Linux (e Unix), mentre le altre piattaforme sono
+sono curate da altri sviluppatori.
+@xref{Bug}
+per gli indirizzi di posta elettronica di chi effettua la manutenzione
+della versione specifica di una particolare piattaforma.
+
+@menu
+* Distribuzione di Gawk::      Contenuto della distribuzione di @command{gawk}.
+* Installazione Unix::         Installare @command{gawk} su varie versioni
+                               di Unix.
+* Installazione non-Unix::     Installazioni su altri Sistemi Operativi.
+* Bug::                        Notificare problemi e bug.
+* Altre versioni::             Altre implementazioni di @command{awk}
+                               liberamente disponibili.
+* Sommario dell'installazione:: Sommario dell'installazione.
+@end menu
+
+@node Distribuzione di Gawk
+@appendixsec La distribuzione di @command{gawk}
+@cindex codice sorgente di @command{gawk}
+@cindex sorgente, codice, @command{gawk}
+
+Questa @value{SECTION} spiega come ottenere la distribuzione
+di @command{gawk}, come scompattarla, e cosa @`e contenuto nei vari file
+e nelle sottodirectory risultanti.
+
+@menu
+* Scaricare::                           Come ottenere la distribuzione.
+* Scompattazione::                      Come estrarre la distribuzione.
+* Contenuti della distribuzione::       Cosa c'@`e nella distribuzione.
+@end menu
+
+@node Scaricare
+@appendixsubsec Ottenere la distribuzione di @command{gawk}
+@cindex @command{gawk}, codice sorgente@comma{} ottenere il
+@cindex codice sorgente di @command{gawk}, ottenere il
+Ci sono due modi per ottenere del software GNU:
+
+@itemize @value{BULLET}
+@item
+Copiarlo da qualcuno che ce l'abbia gi@`a.
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@item
+Ottenere @command{gawk}
+dal sito Internet
+@code{ftp.gnu.org}, nella directory @file{/gnu/gawk}.
+@`E possibile accedere al sito sia via @command{ftp} anonimo che via @code{http}.
+Se si dispone del programma @command{wget}, si pu@`o utilizzarlo digitando un
+comando simile a questo:
+
+@example
+wget https://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+@end example
+@end itemize
+
+L'archivio che contiene il software GNU @`e disponibile in vari cloni
+(@dfn{mirror}) in tutto il mondo.
+La lista aggiornata dei siti clone @`e disponibile nel
+@uref{https://www.gnu.org/order/ftp.html, sito web principale della FSF}.
+Si tenti di usare uno dei siti-clone; dovrebbero essere meno trafficati, ed @`e
+possibile che ce ne sia uno pi@`u vicino.
+
+Si pu@`o anche scaricare la distribuzione del sorgente di @command{gawk}
+dal deposito Git ufficiale; per maggiori informazioni, si veda
+@ref{Accedere ai sorgenti}.
+
+@node Scompattazione
+@appendixsubsec Scompattare la distribuzione
+@command{gawk} @`e distribuito sotto forma di parecchi file @code{tar}
+compressi con differenti programmi di compressione: @command{gzip},
+@command{bzip2}
+e @command{xz}. Per amor di semplicit@`a, il resto di queste istruzioni
+presuppone che si stia usando quella compressa col programma GNU Gzip
+(@command{gzip}).
+
+Una volta che si ha a disposizione la distribuzione (p.es.,
+@file{gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz}),
+va usato @code{gzip} per scompattare il file e quindi @code{tar} per estrarne i
+file.  Si pu@`o usare la seguente @dfn{pipe} per produrre la distribuzione
+@command{gawk}:
+
+@example
+gzip -d -c gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz | tar -xvpf -
+@end example
+
+In un sistema che abbia la versione GNU di @command{tar}, si
+pu@`o far effettuare la scompattazione direttamente a @command{tar}:
+
+@example
+tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+@end example
+
+@noindent
+L'estrazione dei file dall'archivio
+crea una directory di nome @file{gawk-@value{VERSION}.@value{PATCHLEVEL}}
+nella directory corrente.
+
+Il @value{FN} della distribuzione @`e nella forma
+@file{gawk-@var{V}.@var{R}.@var{P}.tar.gz}.
+La @var{V} rappresenta la versione maggiore di @command{gawk},
+la @var{R} rappresenta il rilascio corrente della versione @var{V}, e
+la @var{P} rappresenta un @dfn{patch level}, che sta a indicare che
+correzioni a errori minori sono state incluse nel rilascio.
+Il @dfn{patch level} corrente @`e @value{PATCHLEVEL}, ma quando ci si procura
+una distribuzione, andr@`a ottenuta quella con il livello pi@`u alto di
+versione, rilascio e @dfn{patch}.
+(Si noti, comunque, che livelli di @dfn{patch} maggiori o uguali a 60
+denotano versioni ``beta'', ossia versioni non destinate a essere usate
+in produzione; non si dovrebbero utilizzare tali versioni, se non si @`e
+disposti a sperimentare.)
+Se non si sta usando un sistema Unix o GNU/Linux, i modi per ottenere
+e scompattare la distribuzione di @command{gawk} sono differenti.
+Si dovrebbe sentire un esperto di quel sistema.
+
+@node Contenuti della distribuzione
+@appendixsubsec Contenuti della distribuzione @command{gawk}
+@cindex @command{gawk}, distribuzione di
+@cindex distribuzione di @command{gawk}
+
+La distribuzione di @command{gawk} contiene un certo numero di file
+sorgente in C, di file di documentazione, di sottodirectory, e di file
+utilizzati durante il processo di configurazione
+(@pxref{Installazione Unix}),
+come pure parecchie sottodirectory relative a diversi sistemi operativi
+non-Unix:
+
+@table @asis
+@item Vari file @samp{.c}, @samp{.y} e @samp{.h}
+Questi file contengono il codice sorgente vero e proprio di @command{gawk}.
+@end table
+
+@table @file
+@item support/*
+Intestazioni C e file sorgente per routine che @command{gawk}
+usa, ma che non sono parte della sua funzionalit@`a
+fondamentale.  Per esempio, analisi di argomenti, controlli
+di corrispondenze di espressioni regolari, e routine per
+generare numeri casuali sono tutti mantenuti qui.
+
+@item ABOUT-NLS
+Un file contenente informazioni sul comando GNU @command{gettext} e
+sulle traduzioni.
+
+@item AUTHORS
+Un file con alcune informazioni su chi ha scritto @command{gawk}.
+Esiste solo per placare i pedanti della Free Software Foundation.
+
+@item README
+@itemx README_d/README.*
+File descrittivi: vari @file{README} ("leggimi") per @command{gawk} sotto Unix e per
+tutte le varie altre combinazioni hardware e software.
+
+@item INSTALL
+Un file che fornisce una panoramica sul processo di configurazione e installazione.
+
+@item ChangeLog
+Una lista dettagliata delle modifiche apportate al codice sorgente,
+ai problemi risolti e ai miglioramenti introdotti.
+
+@item ChangeLog.0
+Una lista meno recente di modifiche al codice sorgente.
+
+@item NEWS
+Una lista di modifiche a @command{gawk} a partire dall'ultimo rilascio
+o @dfn{patch}.
+
+@item NEWS.0
+Una lista meno recente di modifiche a @command{gawk}.
+
+@item COPYING
+La @dfn{GNU General Public License}.
+
+@item POSIX.STD
+Una descrizione di comportamenti nello standard POSIX per @command{awk} che
+sono lasciati indefiniti, o ai quali @command{gawk} non pu@`o conformarsi
+pienamente, come pure una lista di specifiche che lo standard POSIX dovrebbe
+contenere, ma che non sono presenti.
+
+@cindex intelligenza artificiale, @command{gawk} e
+@cindex @command{gawk} e l'intelligenza artificiale
+@item doc/awkforai.txt
+Puntatori alla bozza originale di un breve articolo
+che spiega perch@'e @command{gawk} @`e un linguaggio adatto alla
+programmazione nel campo dell'intelligenza artificiale (AI).
+
+@item doc/bc_notes
+Una breve descrizione della struttura interna a livello di byte di
+@command{gawk} [``byte code''].
+
+@item doc/README.card
+@itemx doc/ad.block
+@itemx doc/awkcard.in
+@itemx doc/cardfonts
+@itemx doc/colors
+@itemx doc/macros
+@itemx doc/no.colors
+@itemx doc/setter.outline
+Il sorgente @command{troff} per una scheda di riferimento a cinque colori
+di @command{awk}.
+Per ottenere la versione a colori @`e richiesta una versione recente di
+@command{troff}, come la versione GNU di @command{troff} (@command{groff}).
+Si veda il file @file{README.card} per istruzioni su come comportarsi se @`e
+disponibile solo una versione pi@`u vecchia di @command{troff}.
+
+@item doc/gawk.1
+Il sorgente @command{troff} di una pagina di manuale [@dfn{man}]
+che descrive @command{gawk}.
+Questa pagina @`e distribuita a beneficio degli utenti Unix.
+
+@cindex Texinfo
+@item doc/gawktexi.in
+@itemx doc/sidebar.awk
+Il file sorgente Texinfo di questo @value{DOCUMENT}.
+Dovrebbe venire elaborato da @file{doc/sidebar.awk}
+prima di essere elaborato con @command{texi2dvi} o @command{texi2pdf}
+per produrre un documento stampato, o
+con @command{makeinfo} per produrre un file Info o HTML.
+Il @file{Makefile} si occupa di questa elaborazione e produce
+la versione stampabile tramite i comandi
+@command{texi2dvi} o @command{texi2pdf}.
+
+@item doc/gawk.texi
+Il file prodotto elaborando @file{gawktexi.in}
+tramite @file{sidebar.awk}.
+
+@item doc/gawk.info
+Il file Info generato per questo @value{DOCUMENT}.
+
+@item doc/gawkinet.texi
+Il file sorgente Texinfo per
+@ifinfo
+@inforef{Top, , Introduzione generale, gawkinet, @value{GAWKINETTITLE}}.
+@end ifinfo
+@ifnotinfo
+@cite{@value{GAWKINETTITLE}}.
+@end ifnotinfo
+Dovrebbe venire elaborato con @TeX{}
+(tramite @command{texi2dvi} o @command{texi2pdf})
+per produrre un documento stampato o
+con @command{makeinfo} per produrre un file Info o HTML.
+
+@item doc/gawkinet.info
+Il file Info generato per
+@cite{@value{GAWKINETTITLE}}.
+
+@item doc/igawk.1
+Il sorgente @command{troff} per una pagina di manuale relativa al
+programma @command{igawk} descritto
+@ifnottex
+in
+@end ifnottex
+@iftex
+nella
+@end iftex
+@ref{Programma igawk}.
+(Poich@'e @command{gawk} prevede ora internamente l'uso della direttiva
+@code{@@include},
+n@'e @command{igawk} n@'e @file{igawk.1} sono effettivamente installati.)
+
+@item doc/it/*
+File per la traduzione italiana di questo @value{DOCUMENT}, preparata e
+contribuita da Antonio Colombo e Marco Curreli.
+
+@item doc/Makefile.in
+Il file in input usato durante la procedura di configurazione per
+generare l'effettivo @file{Makefile} da usare per creare la documentazione.
+
+@item Makefile.am
+@itemx */Makefile.am
+File usati dal software GNU Automake per generare
+il file @file{Makefile.in} usato da Autoconf e dallo @dfn{script}
+@command{configure}.
+
+@item Makefile.in
+@itemx aclocal.m4
+@itemx bisonfix.awk
+@itemx config.guess
+@itemx configh.in
+@itemx configure.ac
+@itemx configure
+@itemx custom.h
+@itemx depcomp
+@itemx install-sh
+@itemx missing_d/*
+@itemx mkinstalldirs
+@itemx m4/*
+Questi file e sottodirectory sono usati per configurare e compilare
+@command{gawk} per vari sistemi Unix.  L'uso di molti tra questi file @`e spiegato
+@iftex
+nella
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Installazione Unix}. I rimanenti hanno una funzione di supporto
+per l'infrastruttura.
+
+@item po/*
+La directory @file{po} contiene la traduzione in varie lingue
+dei messaggi emessi da @command{gawk}.
+
+@item awklib/extract.awk
+@itemx awklib/Makefile.am
+@itemx awklib/Makefile.in
+@itemx awklib/eg/*
+La directory @file{awklib} contiene una copia di @file{extract.awk}
+(@pxref{Programma extract}),
+che pu@`o essere usato per estrarre i programmi di esempio dal file sorgente
+Texinfo di questo @value{DOCUMENT}. Contiene anche un file
+@file{Makefile.in}, che
+@command{configure} usa per generare un @file{Makefile}.
+@file{Makefile.am} @`e usato da GNU Automake per creare @file{Makefile.in}.
+Le funzioni di libreria descritte
+@iftex
+nel
+@end iftex
+@ifnottex
+in
+@end ifnottex
+@ref{Funzioni di libreria},
+sono incluse come file pronti per l'uso nella distribuzione @command{gawk}.
+Essi sono installati come parte della procedura di installazione.
+I rimanenti programmi contenuti in questo @value{DOCUMENT} sono disponibili
+nelle appropriate sottodirectory di @file{awklib/eg}.
+
+@item extension/*
+Il codice sorgente, le pagine di manuale, e i file di infrastruttura per
+gli esempi di estensione incluse con @command{gawk}.
+@xref{Estensioni dinamiche}, per ulteriori dettagli.
+
+@item extras/*
+Ulteriori file, non-essenziali.  Al momento, questa directory contiene
+alcuni file da eseguire al momento di iniziare una sessione,
+da installare nella directory @file{/etc/profile.d}
+per essere di aiuto nella gestione delle variabili d'ambiente
+@env{AWKPATH} e @env{AWKLIBPATH}.
+@xref{File da usare a inizio sessione}, per ulteriori informazioni.
+
+@item posix/*
+File necessari per compilare @command{gawk} su sistemi conformi allo
+standard POSIX.
+
+@item pc/*
+File necessari per compilare @command{gawk} sotto MS-Windows
+(@pxref{Installazione su PC} per i dettagli).
+
+@item vms/*
+File necessari per compilare @command{gawk} sotto Vax/VMS e OpenVMS
+(@pxref{Installazione su VMS} per i dettagli).
+
+@item test/*
+Una serie di test per
+@command{gawk}.  Si pu@`o usare @samp{make check} dalla directory principale
+di @command{gawk} per provare se la serie di test funziona con la
+versione in uso di @command{gawk}.
+Se @command{gawk} supera senza errori @samp{make check}, si pu@`o essere
+sicuri che sia stato installato e configurato correttamente su un dato
+sistema.
+@end table
+
+@node Installazione Unix
+@appendixsec Compilare e installare @command{gawk} su sistemi di tipo Unix
+
+Normalmente, si pu@`o compilare e installare @command{gawk} immettendo
+solo un paio di comandi.  Comunque, se si ci si trova in un sistema
+insolito, pu@`o essere necessario
+dover configurare @command{gawk} per quel dato sistema.
+
+@menu
+* Installazione veloce::              Compilare @command{gawk} sotto Unix.
+* File da usare a inizio sessione::   Funzioni di personalizzazione della
+                                      shell.
+* Ulteriori opzioni di configurazione:: Altre opzioni utilizzabili in fase di
+                                        compilazione.
+* Filosofia della configurazione::    Come si suppone che tutto funzioni.
+@end menu
+
+@node Installazione veloce
+@appendixsubsec Compilare @command{gawk} per sistemi di tipo Unix
+
+Questi normali passi di installazione dovrebbero essere sufficienti in
+tutti i moderni sistemi in commercio derivati da Unix, ossia
+GNU/Linux, sistemi basati su BSD, e l'ambiente Cygwin sotto MS-Windows.
+
+Dopo aver estratto la distribuzione di @command{gawk}, posizionarsi con
+@command{cd} nella directory
+@file{gawk-@value{VERSION}.@value{PATCHLEVEL}}.  Come per la maggior parte dei
+programmi GNU, occorre configurare @command{gawk} per il sistema in uso,
+eseguendo il programma @command{configure}.  Questo programma @`e
+uno @dfn{script} della shell Bourne, che @`e stato generato automaticamente
+usando il comando GNU Autoconf.
+@ifnotinfo
+(Il software Autoconf @`e
+descritto in dettaglio in
+@cite{Autoconf---Generating Automatic Configuration Scripts},
+che pu@`o essere trovato in rete sul sito
+@uref{https://www.gnu.org/software/autoconf/manual/index.html,
+della Free Software Foundation}.)
+@end ifnotinfo
+@ifinfo
+(Il software Autoconf @`e descritto in dettaglio a partire da
+@inforef{Top, , Autoconf, autoconf,Autoconf---Generating Automatic Configuration Scripts}.)
+@end ifinfo
+
+Per configurare @command{gawk} basta eseguire @command{configure}:
+
+@example
+sh ./configure
+@end example
+
+Questo produce i file @file{Makefile} e @file{config.h} adatti al sistema
+in uso.
+Il file @file{config.h} descrive varie situazioni relative al sistema in uso.
+@`E possibile modificare il @file{Makefile} per
+cambiare la variabile @code{CFLAGS}, che controlla
+le opzioni di riga di comando da passare al compilatore C (come i livelli
+di ottimizzazione o la richiesta di generare informazioni per il @dfn{debug}).
+
+In alternativa, si possono specificare dei valori a piacere per
+molte delle variabili di @command{make} sulla riga di comando,
+come @code{CC} e @code{CFLAGS}, quando
+ si chiama il programma
+@command{configure}:
+
+@example
+CC=cc CFLAGS=-g sh ./configure
+@end example
+
+@noindent
+Si veda il file @file{INSTALL} nella distribuzione di @command{gawk} per
+tutti i dettagli.
+
+Dopo aver eseguito @command{configure} ed eventualmente modificato
+@file{Makefile},
+va dato il comando:
+
+@example
+make
+@end example
+
+@noindent
+Poco dopo, si dovrebbe avere a disposizione una versione eseguibile
+di @command{gawk}.
+Questo @`e tutto!
+Per verificare se @command{gawk} funziona correttamente,
+va dato il comando @samp{make check}.  Tutti i test dovrebbero terminare con
+successo.
+Se questi passi non producono il risultato desiderato, o se qualche
+test fallisce, controllare i file nella directory @file{README_d}
+per determinare se quello che @`e capitato @`e un problema noto.
+Se il problema capitato non @`e descritto l@`{@dotless{i}},
+inviare una segnalazione di @dfn{bug} (@pxref{Bug}).
+
+Naturalmente, dopo aver compilato @command{gawk}, verosimilmente
+andr@`a installato.  Per fare ci@`o, occorre eseguire il comando
+@samp{make install}, disponendo delle autorizzazioni necessarie.
+Come acquisirle varia da sistema a sistema, ma su molti sistemi si pu@`o
+usare il comando @command{sudo} per ottenerle.  Il comando da immettere
+diventa in questo caso @samp{sudo make install}. @`E probabile che sia
+necessario fornire una password, ed essere stati messi nella lista degli
+utenti che possono utilizzare il comando @command{sudo}.
+
+@node File da usare a inizio sessione
+@appendixsubsec File di inizializzazione della shell
+
+La distribuzione contiene i file da usare a inizio sessione
+@file{gawk.sh} e
+@file{gawk.csh}, che contengono funzioni che possono essere di aiuto
+nel gestire le variabili d'ambiente
+@env{AWKPATH} e @env{AWKLIBPATH}.
+Su un sistema Fedora GNU/Linux, questi file dovrebbero essere installati
+nella directory @file{/etc/profile.d};
+su altre piattaforme, la posizione corretta pu@`o essere differente.
+
+@table @command
+
+@cindex @command{gawkpath_default}, funzione della shell
+@cindex funzione della shell @command{gawkpath_default}
+@item gawkpath_default
+Ripristina la variabile d'ambiente @env{AWKPATH} al suo valore di default.
+
+@cindex @command{gawkpath_prepend}, funzione della shell
+@cindex funzione della shell @command{gawkpath_prepend}
+@item gawkpath_prepend
+Aggiunge l'argomento all'inizio della variabile d'ambiente @env{AWKPATH}.
+
+@cindex @command{gawkpath_append}, funzione della shell
+@cindex funzione della shell @command{gawkpath_append}
+@item gawkpath_append
+Aggiunge l'argomento alla fine della variabile d'ambiente @env{AWKPATH}.
+
+@cindex @command{gawklibpath_default}, funzione della shell
+@cindex funzione della shell @command{gawklibpath_default}
+@item gawklibpath_default
+Reimposta la variabile d'ambiente @env{AWKLIBPATH} al suo valore di default.
+
+@cindex @command{gawklibpath_prepend}, funzione della shell
+@cindex funzione della shell @command{gawklibpath_prepend}
+@item gawklibpath_prepend
+Aggiunge l'argomento all'inizio della variabile d'ambiente
+@env{AWKLIBPATH}.
+
+@cindex @command{gawklibpath_append}, funzione della shell
+@cindex funzione della shell @command{gawklibpath_append}
+@item gawklibpath_append
+Aggiunge l'argomento alla fine della variabile d'ambiente
+@env{AWKLIBPATH}.
+
+@end table
+
+
+@node Ulteriori opzioni di configurazione
+@appendixsubsec Ulteriori opzioni di configurazione
+@cindex @command{gawk}, configurazione, opzioni di
+@cindex configurazione di @command{gawk}, opzioni di
+
+Ci sono parecchie altre opzioni che si possono utilizzare sulla riga
+di comando di @command{configure}
+quando si compila @command{gawk} a partire dai sorgenti, tra cui:
+
+@table @code
+
+@cindex @option{--disable-extensions}, opzione di configurazione
+@cindex opzione di configurazione @code{--disable-extensions}
+@item --disable-extensions
+Disabilita il meccanismo delle estensioni all'interno di
+@command{gawk}.  Specificando quest'opzione non @`e possibile
+utilizzare estensioni dinamiche.  Inoltre si disabilita la
+configurazione e la generazione delle estensioni di esempio nella
+directory @file{extension}.
+
+Questo @`e utile quando si genera @command{gawk} per essere eseguito
+su un'altra piattaforma.
+L'azione di default @`e di controllare dinamicamente se le estensioni
+possono essere configurate e compilate.
+
+@cindex @option{--disable-lint}, opzione di configurazione
+@cindex opzione di configurazione @code{--disable-lint}
+@item --disable-lint
+Disabilitare i controlli @dfn{lint} all'interno di @command{gawk}.  Le opzioni
+@option{--lint} e @option{--lint-old}
+(@pxref{Opzioni})
+sono accettate, ma non fanno nulla, e non emettono alcun messaggio di
+avvertimento.
+Analogamente, se si imposta la variabile @code{LINT}
+(@pxref{Variabili modificabili dall'utente})
+questa non ha alcun effetto sul programma @command{awk} in esecuzione.
+
+Se si specifica l'opzione del compilatore GNU Compiler Collection (GCC) che
+elimina il codice non eseguito, quest'opzione riduce di quasi
+23K byte la dimensione del programma eseguibile @command{gawk}
+su sistemi GNU/Linux x86_64.  I risultati su altri sistemi e con
+altri compilatori sono probabilmente diversi.
+L'uso di questa opzione pu@`o apportare qualche piccolo miglioramento nei
+tempi di esecuzione di un programma.
+
+@quotation ATTENZIONE
+Se si usa quest'opzione alcuni dei test di funzionalit@`a non avranno successo.
+Quest'opzione potr@`a essere rimossa in futuro.
+@end quotation
+
+@cindex @option{--disable-mpfr}, opzione di configurazione
+@cindex opzione di configurazione @code{--disable-mpfr}
+@item --disable-mpfr
+Non effettuare il controllo delle librerie MPFR e GMP.
+Ci@`o pu@`o essere utile principalmente per gli sviluppatori,
+per assicurarsi che tutto funzioni regolarmente nel caso in cui
+il supporto MPFR non sia disponibile.
+
+@cindex @option{--disable-nls}, opzione di configurazione
+@cindex opzione di configurazione @code{--disable-nls}
+@item --disable-nls
+Non attivare la traduzione automatica dei messaggi.
+Ci@`o normalmente non @`e consigliabile, ma pu@`o apportare qualche lieve
+miglioramento nei tempi di esecuzione di un programma.
+
+@cindex @option{--enable-versioned-extension-dir}, opzione di configurazione
+@cindex opzione di configuzazione @code{--enable-versioned-extension-dir}
+@item --enable-versioned-extension-dir
+Usare una directory con l'indicazione della versione per le estensioni.
+Il nome della directory conterr@`a la versione principale e quella
+secondaria dell'API.  Ci@`o consente la presenza, nello stesso sistema,
+di pi@`u di una versione dell'API, senza che fra di esse sorgano dei
+conflitti legati all'una o all'altra versione.
+
+@end table
+
+Si usi il comando @samp{./configure --help} per ottenere la lista completa
+delle opzioni disponibili in @command{configure}.
+
+@node Filosofia della configurazione
+@appendixsubsec Il processo di configurazione
+
+@cindex @command{gawk}, configurazione di
+@cindex configurazione di @command{gawk}
+Questa @value{SECTION} interessa solo a chi abbia un minimo di familiarit@`a con
+il linguaggio C e con i sistemi operativi di tipo Unix.
+
+Il codice sorgente di @command{gawk}, in generale, cerca di aderire, nei limiti
+del possibile, a degli standard formali.  Ci@`o significa che @command{gawk} usa
+routine di libreria che sono specificate nello standard ISO C e nello standard
+POSIX per le interfacce dei sistemi operativi.  Il codice sorgente di
+@command{gawk} richiede l'uso di un compilatore ISO C (standard 1990).
+
+Molti sistemi Unix non aderiscono completamente n@'e allo standard ISO n@'e a
+quello POSIX.  La sottodirectory @file{missing_d} nella distribuzione di
+@command{gawk} contiene delle versioni sostitutive per quelle funzioni che pi@`u
+frequentemente risultano essere non disponibili.
+
+Il file @file{config.h} creato da @command{configure} contiene definizioni che
+elencano funzionalit@`a del particolare sistema operativo nel quale si tenta di
+compilare @command{gawk}.  Le tre cose descritte da questo file sono: quali
+file di intestazione sono disponibili, in modo da poterli includere correttamente,
+quali funzioni (presumibilmente) standard sono realmente disponibili nelle
+librerie C, e varie informazioni assortite riguardo al sistema operativo
+corrente.  Per esempio, pu@`o non esserci l'elemento @code{st_blksize} nella
+struttura @code{stat}.  In questo caso, @samp{HAVE_STRUCT_STAT_ST_BLKSIZE} @`e
+indefinito.
+
+@cindex @code{custom.h}, file
+@`E possible che il compilatore C del sistema in uso "tragga in inganno"
+@command{configure}.  Pu@`o succedere nel caso in cui non viene restituito
+un errore se una funzione di libreria non @`e disponibile.  Per superare questo
+problema, si pu@`o modificare il file @file{custom.h}.  Basta usare una direttiva
+@samp{#ifdef} appropriata per il sistema corrente, e definire, tramite
+@code{#define}, tutte le costanti che @command{configure} avrebbe dovuto
+definire, ma non @`e riuscito a farlo, oppure, usando @code{#undef} annullare le
+costanti che @command{configure} ha definito, ma non avrebbe dovuto farlo.  Il
+file @file{custom.h}  @`e automaticamente incluso dal file @file{config.h}.
+
+@`E anche possibile che il programma @command{configure} generato da Autoconf non
+funzioni in un dato sistema per una ragione differente.  Se c'@`e un problema, si
+tenga presente che il file @file{configure.ac} @`e quello preso in input da
+Autoconf.  @`E possibile modificare questo file e generare una nuova versione di
+@command{configure} che funzioni sul sistema corrente (@pxref{Bug} per
+informazioni su come segnalare problemi nella configurazione di
+@command{gawk}).  Lo stesso meccanismo si pu@`o usare per inviare aggiornamenti
+al file @file{configure.ac} e/o a @file{custom.h}.
+
+@node Installazione non-Unix
+@appendixsec Installazione su altri Sistemi Operativi
+
+Questa @value{SECTION} descrive come installare @command{gawk} su
+vari sistemi non-Unix.
+
+@menu
+* Installazione su PC::         Installare e compilare @command{gawk}
+                                su Microsoft Windows.
+* Installazione su VMS::        Installare @command{gawk} su VMS.
+@end menu
+
+@node Installazione su PC
+@appendixsubsec Installazione su MS-Windows
+
+@cindex PC, @command{gawk} su sistemi operativi
+@cindex sistemi operativi per PC, @command{gawk} su
+@cindex installare @command{gawk} su sistemi operativi per PC
+Questa @value{SECTION} tratta dell'installazione e uso di @command{gawk}
+su macchine con architettura Intel che eseguono qualsiasi versione di
+MS-Windows.
+In questa @value{SECTION}, il termine ``Windows32''
+si riferisce a una qualsiasi versione di Microsoft Windows
+95/98/ME/NT/2000/XP/Vista/7/8/10.
+
+Si veda anche il file @file{README_d/README.pc} nella distribuzione.
+
+@menu
+* Installazione binaria su PC:: Installare una distribuzione pronta
+                                all'uso.
+* Compilazione su PC::          Compilare @command{gawk} per Windows32.
+* Uso su PC::                   Eseguire @command{gawk} su Windows32.
+* Cygwin::                      Compilare ed eseguire @command{gawk}
+                                per Cygwin.
+* MSYS::                        Usare @command{gawk} nell'ambiente MSYS.
+@end menu
+
+@node Installazione binaria su PC
+@appendixsubsubsec Installare una distribuzione predisposta per sistemi MS-Windows
+
+La sola distribuzione binaria predisposta supportata per i sistem MS-Windows
+@`e quella messa a disposizione da Eli Zaretskii
+@uref{https://sourceforge.net/projects/ezwinports/, progetto ``ezwinports''}.
+Si parta da l@`{@dotless{i}} per installare il comando @command{gawk} precompilato.
+
+@node Compilazione su PC
+@appendixsubsubsec Compilare @command{gawk} per sistemi operativi di PC
+
+@command{gawk} pu@`o essere compilato per Windows32, usando MinGW
+(per Windows32).
+Il file @file{README_d/README.pc} nella distribuzione @command{gawk}
+contiene ulteriori annotazioni, e il file @file{pc/Makefile} contiene
+informazioni importanti sulle opzioni di compilazione.
+
+@cindex compilare @command{gawk} per MS-Windows
+Per compilare @command{gawk} per Windows32, occorre copiare i file
+dalla directory @file{pc} (@emph{tranne} il file @file{ChangeLog}) alla
+directory che contiene il resto dei sorgenti di @command{gawk}, e quindi
+chiamare @command{make}, specificando il nome appropriato di obiettivo come
+argomento, per generare @command{gawk}.  Il @file{Makefile} copiato dalla
+directory @file{pc} contiene una sezione di configurazione con commenti, e pu@`o
+essere necessario modificarlo perch@'e funzioni con il programma di utilit@`a
+@command{make} corrente.
+
+Il @file{Makefile} contiene un certo numero di alternative, che permettono di
+generare @command{gawk} per diverse
+versioni MS-DOS e Windows32.  Se il comando @command{make} @`e richiamato senza
+specificare alcun argomento viene stampata una lista delle alternative
+disponibili.  Per esempio,
+per generare un codice binario di @command{gawk} nativo per MS-Windows
+usando gli strumenti MinGW, scrivere @samp{make mingw32}.
+
+@node Uso su PC
+@appendixsubsubsec Usare @command{gawk} su sistemi operativi PC
+@cindex PC, @command{gawk} su sistemi operativi
+@cindex sistemi operativi PC, @command{gawk} su
+
+Sotto MS-Windows, l'ambiente MinGW consente di usare
+sia l'operatore @samp{|&} che le operazioni su rete TCP/IP
+(@pxref{Reti TCP/IP}).
+L'ambiente DJGPP non consente di usare @samp{|&}.
+
+@cindex percorso di ricerca
+@cindex percorso di ricerca per file sorgente
+@cindex @command{gawk}, versione MS-Windows di
+@cindex @code{;} (punto e virgola), @env{AWKPATH} variabile e
+@cindex punto e virgola (@code{;}), @env{AWKPATH} variabile e
+@cindex @env{AWKPATH}, variabile d'ambiente
+@cindex variabile d'ambiente @env{AWKPATH}
+Le versioni MS-Windows di @command{gawk} ricercano i file di
+programma come descritto in @ref{AWKPATH (Variabile)}.  Comunque, gli elementi
+della variabile @env{AWKPATH} sono separati tra di loro da un punto e virgola
+(anzich@'e da due punti (@code{:})).
+Se @env{AWKPATH} @`e non impostata o ha per valore la stringa nulla, il percorso
+di ricerca di default @`e @samp{@w{.;c:/lib/awk;c:/gnu/lib/awk}}.
+
+@cindex estensioni comuni, variabile @code{BINMODE}
+@c @cindex extensions, common@comma{} @code{BINMODE} variable
+@cindex differenze tra @command{awk} e @command{gawk}, variabile @code{BINMODE}
+@cindex @code{BINMODE}, variabile
+@cindex variabile @code{BINMODE}
+Sotto MS-Windows,
+@command{gawk} (come molti altri programmi di trattamento testi) converte
+automaticamente la stringa di fine riga @samp{\r\n} in @samp{\n} leggendo dall'input
+e @samp{\n} in @samp{\r\n} scrivendo sull'output.
+La variabile speciale @code{BINMODE} @value{COMMONEXT} permette di controllare
+come avvengono queste conversioni, ed @`e interpretata come segue:
+
+@itemize @value{BULLET}
+@item
+Se @code{BINMODE} @`e @code{"r"} o uno,
+la modalit@`a binaria @`e impostata
+in lettura (cio@`e, nessuna conversione in lettura).
+
+@item
+Se @code{BINMODE} @`e @code{"w"} o due,
+la modalit@`a binaria @`e impostata
+in scrittura (cio@`e, nessuna conversione in scrittura).
+
+@item
+Se @code{BINMODE} @`e @code{"rw"} o @code{"wr"} o tre,
+la modalit@`a binaria @`e impostata sia in lettura che in scrittura.
+
+@item
+@code{BINMODE=@var{stringa-non-nulla}} equivale a specificare
+@samp{BINMODE=3} (cio@`e, nessuna conversione in
+lettura e scrittura).  Tuttavia, @command{gawk} emette un messaggio di
+avviso se la stringa non @`e @code{"rw"} o @code{"wr"}.
+@end itemize
+
+@noindent
+La modalit@`a di trattamento dello standard input e standard output sono
+impostate una volta sola
+(dopo aver letto la riga di comando, ma prima di iniziare a elaborare
+qualsiasi programma @command{awk}).
+L'impostazione di @code{BINMODE} per standard input o
+standard output va fatta usando
+un'appropriata opzione @samp{-v BINMODE=@var{N}} sulla riga di comando.
+@code{BINMODE} @`e impostato nel momento in cui un file o @dfn{pipe} @`e aperto
+e non pu@`o essere cambiato in corso di elaborazione.
+
+Su sistemi compatibili con POSIX, il valore di queta variabile non ha
+alcun effetto.  Pertanto, se si pensa che un dato programma sar@`a eseguito
+su parecchi sistemi differenti, e che sia necessario usare
+@code{BINMODE}, @`e possibile impostarlo semplicemente (nel programma
+o sulla riga di comando) incondizionatamente, senza preoccuparsi del
+sistema operativo sotto il quale il programma viene eseguito.
+
+Il nome @code{BINMODE} @`e stato scelto in analogia con @command{mawk}
+(@pxref{Altre versioni}).
+@command{mawk} e @command{gawk} gestiscono @code{BINMODE} in maniera simile;
+tuttavia, @command{mawk} prevede un'opzione @samp{-W BINMODE=@var{N}} e una
+variabile d'ambiente che pu@`o impostare @code{BINMODE}, @code{RS}, e @code{ORS}.
+I file @file{binmode[1-3].awk} (nella directory @file{gnu/lib/awk} in alcune
+delle distribuzioni binarie gi@`a predisposte) sono stati inclusi per rendere
+disponibile l'opzione di @command{mawk} @samp{-W BINMODE=@var{N}}.  Questi
+possono essere modificati o ignorati; in particolare, quale sia l'impostazione
+di @code{RS} che d@`a meno ``sorprese'' rimane una questione aperta.
+@command{mawk} usa @samp{RS = "\r\n"} se si imposta la modalit@`a binaria in
+lettura, il che @`e appropriato per file che abbiano i caratteri di fine riga in
+stile MS-DOS.
+
+Per chiarire, gli esempi seguenti impostano la modalit@`a binaria in
+scrittura per lo standard output e altri file, e impostano @code{ORS} in modo
+da ottenere la fine riga ``normale'' in stile MS-DOS:
+
+@example
+gawk -v BINMODE=2 -v ORS="\r\n" @dots{}
+@end example
+
+@noindent
+o:
+
+@example
+gawk -v BINMODE=w -f binmode2.awk @dots{}
+@end example
+
+@noindent
+Questi comandi danno lo stesso risultato dell'opzione
+@samp{-W BINMODE=2} in @command{mawk}.
+Quanto segue modifica il separatore di record a @code{"\r\n"} e imposta
+la modalit@`a binaria in lettura, senza modificare le letture da standard input:
+
+@example
+gawk -v RS="\r\n" -e "BEGIN @{ BINMODE = 1 @}" @dots{}
+@end example
+
+@noindent
+o:
+
+@example
+gawk -f binmode1.awk @dots{}
+@end example
+
+@noindent
+Usando i caratteri di protezione appropriati, nel primo
+esempio l'impostazione di @code{RS} pu@`o essere spostata in una regola
+@code{BEGIN}.
+
+@node Cygwin
+@appendixsubsubsec Usare @command{gawk} in ambiente Cygwin
+@cindex compilare @command{gawk} per Cygwin
+@cindex Cygwin, compilare @command{gawk} per
+
+@command{gawk} pu@`o essere compilato e usato ``cos@`{@dotless{i}} com'@`e'' sotto MS-Windows se
+si opera all'interno dell'ambiente @uref{http://www.cygwin.com, Cygwin}.
+Questo ambiente consente un'eccellente simulazione di GNU/Linux, con l'uso di
+Bash, GCC, GNU Make, e altri programmi GNU.  La compilazione e l'installazione
+per Cygwin @`e la stessa usata nei sistemi di tipo Unix:
+
+@example
+tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+cd gawk-@value{VERSION}.@value{PATCHLEVEL}
+./configure
+make && make check
+@end example
+
+In confronto a un sistema GNU/Linux sulla stessa macchina, l'esecuzione
+del passo di @samp{configure} sotto Cygwin richiede molto pi@`u tempo.
+Tuttavia si conclude regolarmente, e poi @samp{make} funziona come ci si
+aspetta.
+
+Le versioni pi@`u recenti di Cygwin aprono tutti i file in modalit@`a binaria.
+Ci@`o implica che si dovrebbe usare @samp{RS = "\r?\n"} per riuscire a
+gestire file di testo MS-Windows in formato standard, in cui ogni riga
+termina con i due caratteri di ritorno a capo e avanzamento riga.
+
+L'ambiente Cygwin consente l'utilizzo sia dell'operatore @samp{|&}
+che di reti TCP/IP (@pxref{Reti TCP/IP}).
+
+@node MSYS
+@appendixsubsubsec Usare @command{gawk} in ambiente MSYS
+
+Nell'ambiente MSYS sotto MS-Windows, @command{gawk} automaticamente usa la
+modalit@`a binaria per leggere e scrivere file.  Non @`e quindi necessario usare la
+variabile @code{BINMODE}.
+
+Questo pu@`o causare problemi con altri componenti di tipo Unix che sono stati
+resi disponibile in MS-Windows, che si aspettano che @command{gawk} faccia
+automaticamente la conversione di @code{"\r\n"}, mentre cos@`{@dotless{i}} non @`e.
+
+@node Installazione su VMS
+@appendixsubsec Compilare e installare @command{gawk} su Vax/VMS e OpenVMS
+
+@c based on material from Pat Rankin <rankin@eql.caltech.edu>
+@c now rankin@pactechdata.com
+@c now r.pat.rankin@gmail.com
+
+@cindex @command{gawk}, versione VMS di
+@cindex installare @command{gawk} su VMS
+@cindex VMS, installare @command{gawk} su
+Questa @value{SUBSECTION} descrive come compilare e installare @command{gawk}
+sotto VMS.  Il termine classico ``VMS'' @`e usato qui anche per designare
+OpenVMS.
+
+@menu
+* Compilazione su VMS::           Come compilare @command{gawk} su VMS.
+* Estensioni dinamiche su VMS::   Compilare estensioni dinamiche
+                                  di @command{gawk} su VMS.
+* Dettagli installazione su VMS:: Come installare @command{gawk} su VMS.
+* Esecuzione su VMS::             Come eseguire @command{gawk} su VMS.
+* GNV su VMS::                       Il progetto VMS GNV.
+* Vecchio Gawk su VMS::           Una versione non aggiornata arriva
+                                  con alcune versioni di VMS.
+@end menu
+
+@node Compilazione su VMS
+@appendixsubsubsec Compilare @command{gawk} su VMS
+@cindex compilare @command{gawk} per VMS
+@cindex VMS, compilare @command{gawk} per
+
+Per compilare @command{gawk} sotto VMS, esiste una procedura di comandi
+@code{DCL} che esegue tutti i comandi @code{CC} e @code{LINK} necessari. C'@`e
+anche un @file{Makefile} da usare con i programmi di utilit@`a @code{MMS} e
+@code{MMK}.  A partire della directory che contiene i file sorgente, si usi:
+
+@example
+$ @kbd{@@[.vms]vmsbuild.com}
+@end example
+
+@noindent
+o:
+
+@example
+$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms gawk}
+@end example
+
+@noindent
+o:
+
+@example
+$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms gawk}
+@end example
+
+Il comando @command{MMK} @`e un quasi-clone, a codice aperto e gratuito, di
+@command{MMS}, che gestisce in maniera migliore i volumi ODS-5 con @value{FNS}
+a caratteri maiuscoli e minuscoli.  @command{MMK} @`e disponibile da
+@uref{https://github.com/endlesssoftware/mmk}.
+
+Avendo a che fare con volumi ODS-5 e con l'analisi sintattica estesa abilitata,
+il nome del parametro che specifica l'obiettivo pu@`o dover essere scritto
+digitando esattamente le lettere maiuscole e minuscole.
+
+@command{gawk} @`e stato testato sotto VAX/VMS 7.3 e Alpha/VMS 7.3-1 usando il
+compilatore Compaq C V6.4, e sotto Alpha/VMS 7.3, Alpha/VMS 7.3-2, e IA64/VMS
+8.3.  Le compilazioni pi@`u recenti hanno usato il compilatore HP C V7.3 su Alpha
+VMS 8.3 e su VMS 8.4, sia Alpha che IA64, hanno usato il compilatore HP C
+7.3.@footnote{L'architettura IA64 @`e anche nota come ``Itanium''.}
+
+@xref{GNV su VMS} per informazioni su come compilare
+@command{gawk} come un kit PCSI compatible con il prodotto GNV.
+
+@node Estensioni dinamiche su VMS
+@appendixsubsubsec Compilare estensioni dinamiche di @command{gawk} in VMS
+
+Le estensioni che sono state rese disponibile su VMS possono essere
+costruite dando uno dei comandi seguenti:
+
+@example
+$ @kbd{MMS/DESCRIPTION=[.vms]descrip.mms extensions}
+@end example
+
+@noindent
+o:
+
+@example
+$ @kbd{MMK/DESCRIPTION=[.vms]descrip.mms extensions}
+@end example
+
+@command{gawk} usa @code{AWKLIBPATH} come una variabile d'ambiente
+oppure come un nome logico per trovare le estensioni dinamiche.
+
+Le estensioni dinamiche devono essere compilate con le stesse opzioni del
+compilatore usate per compilare @command{gawk} riguardanti numeri in virgola
+mobile, dimensione dei puntatori e trattamento dei nomi simbolici.  I computer
+con architettura Alpha e Itanium dovrebbero usare i numeri in virgola mobile
+col formato IEEE.  La dimensione dei puntatori @`e 32 bit, e il trattamento dei nomi
+simbolici dovrebbe richiedere il rispetto esatto di maiuscole/minuscole, con le
+abbreviazioni CRC per simboli pi@`u lunghi di 32 bit.
+
+Per Alpha e Itanium:
+
+@example
+/nome=(as_is,short)
+/float=ieee/ieee_mode=denorm_results
+@end example
+
+Per VAX:
+
+@example
+/nome=(as_is,short)
+@end example
+
+Le macro da usare al momento della compilazione devono essere definite prima di
+includere il primo file di intestazione proveniente da VMS, come segue:
+
+@example
+#if (__CRTL_VER >= 70200000) && !defined (__VAX)
+#define _LARGEFILE 1
+#endif
+
+#ifndef __VAX
+#ifdef __CRTL_VER
+#if __CRTL_VER >= 80200000
+#define _USE_STD_STAT 1
+#endif
+#endif
+#endif
+@end example
+
+Se si scrivono delle estensioni utente da eseguire su VMS, vanno fornite anche
+queste definizioni.  Il file @file{config.h} creato quando si compila
+@command{gawk} su VMS lo fa gi@`a; se invece si usa qualche altro file simile,
+occorre ricordarsi di includerlo prima di qualsiasi file di intestazione
+proveniente da VMS.
+
+@node Dettagli installazione su VMS
+@appendixsubsubsec Installare @command{gawk} su VMS
+
+Per usare @command{gawk}, tutto ci@`o che serve @`e un comando ``esterno'', che @`e
+un simbolo @code{DCL} il cui valore inizia col segno del dollaro.
+Per esempio:
+
+@example
+$ @kbd{GAWK :== $disk1:[gnubin]gawk}
+@end example
+
+@noindent
+Si sostituisca la posizione corrente di @command{gawk.exe} a
+@samp{$disk1:[gnubin]}.  Il simbolo dovrebbe essere posto nel file
+@file{login.com} di ogni utente che desideri eseguire @command{gawk},
+in modo che sia definito ogni volta che l'utente inizia una sessione.
+Alternativamente, il simbolo pu@`o essere messo nella procedura di sistema
+@file{sylogin.com},
+in modo da permettere a tutti gli utenti di eseguire @command{gawk}.
+
+Se @command{gawk} @`e stato installato da un kit PCSI nell'albero di
+directory @file{GNV$GNU:}, il programma avr@`a come nome
+@file{GNV$GNU:[bin]gnv$gawk.exe}, e il file di aiuto sar@`a chiamato
+@file{GNV$GNU:[vms_help]gawk.hlp}.
+
+Il kit PCSI installa anche un file @file{GNV$GNU:[vms_bin]gawk_verb.cld}
+che pu@`o essere usato per aggiungere @command{gawk} e @command{awk}
+alla lista dei comandi DCL.
+
+Per farlo solo nella sessione corrente si pu@`o usare:
+
+@example
+$ @kbd{set command gnv$gnu:[vms_bin]gawk_verb.cld}
+@end example
+
+Oppure il sistemista VMS pu@`o usare @file{GNV$GNU:[vms_bin]gawk_verb.cld} per
+aggiungere @command{gawk} e @command{awk} alla tabella @samp{DCLTABLES}
+valida per tutto il sistema.
+
+La sintassi DCL @`e documentata nel file @file{gawk.hlp}.
+
+In alternativa, l'elemento @file{gawk.hlp} pu@`o essere caricato in una
+libreria di aiuto VMS:
+
+@example
+$ @kbd{LIBRARY/HELP sys$help:helplib [.vms]gawk.hlp}
+@end example
+
+@noindent
+(Una libreria specifica dell'installazione potrebbe venir usata invece
+della libreria standard VMS library @samp{HELPLIB}.)  Dopo aver installato
+il testo di aiuto, il comando:
+
+@example
+$ @kbd{HELP GAWK}
+@end example
+
+@noindent
+fornisce informazioni sia sull'implementazione di @command{gawk}
+sia sul linguaggio di programmazione @command{awk}.
+
+Il nome logico @samp{AWK_LIBRARY} pu@`o designare una posizione di default per i
+file di programma @command{awk}.  Riguardo all'opzione @option{-f}, se il
+@value{FN} specificato non contiene un dispositivo o un percorso di directory,
+@command{gawk} cerca dapprima nella directory corrente, poi nella directory
+specificata dalla traduzione di @samp{AWK_LIBRARY} se il file non @`e stato
+trovato.  Se, dopo aver cercato in entrambe queste directory, il file non @`e
+ancora stato trovato, @command{gawk} appone il suffisso @samp{.awk} al
+@value{FN} e ritenta la ricerca del file.  Se @samp{AWK_LIBRARY} non @`e
+definita, si usa per essa il valore di default @samp{SYS$LIBRARY:}.
+
+@node Esecuzione su VMS
+@appendixsubsubsec Eseguire @command{gawk} su VMS
+
+L'elaborazione della riga di comando e le convenzioni per proteggere i
+caratteri sono significativamente differenti in VMS, e quindi gli esempi
+presenti in questo @value{DOCUMENT} o provenienti da altre fonti necessitano
+piccole modifiche.  Le modifiche, tuttavia, @emph{sono} veramente piccole, e
+tutti i programmi @command{awk} dovrebbero funzionare correttamente.
+
+Ecco un paio di semplici test:
+
+@example
+$ @kbd{gawk -- "BEGIN @{print ""Hello, World!""@}"}
+$ @kbd{gawk -"W" version}
+! ma anche -"W version" o "-W version"
+@end example
+
+@noindent
+Si noti che il testo con caratteri maiuscoli e misti maiuscoli/minuscoli
+dev'essere incluso tra doppi apici.
+
+La versione VMS di @command{gawk} comprende un'interfaccia in stile @code{DCL},
+oltre a quella originale, di tipo shell (si veda il file di aiuto per ulteriori
+dettagli).  Un effetto indesiderato della duplice analisi della riga
+di comando @`e che se c'@`e solo un unico parametro (come nel programma con le
+righe contenenti doppi apici), il comando diviene ambiguo.  Per evitare questo
+inconveniente, il flag, normalmente non necessario, @option{--} @`e necessario
+per forzare un esame dei parametri in stile Unix, piuttosto che nella modalit@`a
+@code{DCL}.  Se qualsiasi altra opzione preceduta dal segno @option{-} (o pi@`u
+parametri, per esempio, pi@`u @value{DF} in input) @`e presente, non c'@`e ambiguit@`a,
+e l'opzione @option{--} pu@`o essere omessa.
+
+@cindex codice di ritorno, di @command{gawk}, in VMS
+@cindex exit, codice di ritorno, di @command{gawk}, in VMS
+Il valore di @code{exit} @`e un valore in stile Unix e viene trasformato in
+un codice di ritorno VMS all'uscita del programma.
+
+I bit di severit@`a di VMS saranno impostati a partire dal valore dell'istruzione
+@code{exit}.  Un errore grave @`e indicato da 1, e VMS imposta la condizione
+@code{ERROR}.  Un errore fatale @`e indicato da 2, e VMS imposta la condizione
+@code{FATAL}.  Ogni altro valore imposta la condizione @code{SUCCESS}.  Il
+valore d'uscita @`e codificato per aderire agli standard di codifica VMS e avr@`a
+un @code{C_FACILITY_NO} di @code{0x350000} con il codice costante @code{0xA000}
+aggiunto al numero spostato a sinistra di 3 bit per far posto al codice di
+severit@`a.
+
+Per estrarre il codice reale di ritorno dell'istruzione @code{exit}
+di @command{gawk} dalla condizione impostata da VMS, si usi:
+
+@example
+unix_status = (vms_status .and. %x7f8) / 8
+@end example
+
+@noindent
+Un programma C che usa @code{exec()} per chiamare @command{gawk}
+ricever@`a il valore originale della exit in stile Unix.
+
+Precedenti versioni di @command{gawk} per VMS consideravano un
+codice di ritorno a Unix di 0 come 1, un errore come 2,
+un errore fatale come 4, e tutti
+gli altri valori erano restituiti immodificati.  Questa era una violazione
+rispetto alle specifiche di codifica delle condizioni di uscita di VMS.
+
+@cindex numeri in virgola mobile, VAX/VMS
+@cindex VAX/VMS, numeri in virgola mobile,
+L'aritmetica in virgola mobile VAX/VMS usa un arrotondamento statistico.
+@xref{Funzione round}.
+
+VMS restituisce data e ora in formato GMT, a meno che non siano stati impostati
+i nomi logici @code{SYS$TIMEZONE_RULE} o @code{TZ}.  Precedenti versioni di
+VMS, come VAX/VMS 7.3, non impostano questi nomi logici.
+
+@c @cindex directory search
+@c @cindex path, search
+@cindex percorso di ricerca
+@cindex percorso di ricerca per file sorgente
+Il percorso di ricerca di default, nella ricerca dei file di programma per
+@command{awk} specificati dall'opzione @option{-f}, @`e
+@code{"SYS$DISK:[],AWK_LIBRARY:"}.  Il nome logico @env{AWKPATH} pu@`o essere
+usato per sostituire questo di default.  Il formato di @env{AWKPATH} @`e una lista
+di directory, separate da virgola.  Nel definirla, il valore dovrebbe essere
+incluso tra doppi apici, in modo che consenta una sola traduzione, e non una
+lista di ricerca multitraduzione @code{RMS}.
+
+@cindex ridirezione in VMS
+
+Questa restrizione vale anche se si esegue @command{gawk} sotto GNV,
+in quanto la ridirezione @`e sempre verso un comando DCL.
+
+Se si ridirigono dati verso un comando o un programma di utilit@`a VMS,
+l'implementazione corrente richiede la creazione di un comando VMS esterno che
+esegua un file di comandi, prima di invocare @command{gawk}.
+(Questa restrizione potrebbe essere rimossa in una futura versione di
+@command{gawk} per VMS.)
+
+Senza un tale file di comandi, i dati in input saranno presenti anche
+in output, prima dei dati di output veri e propri.
+
+Ci@`o consente la simulazione di comandi POSIX non disponibili in VMS
+o l'uso di programmi di utilit@`a GNV.
+
+L'esempio seguente mostra come ridirigere dati da @command{gawk} verso il
+comando VMS @command{sort}.
+
+@example
+$ sort = "@@device:[dir]vms_gawk_sort.com"
+@end example
+
+Il file di comandi deve avere il formato dell'esempio seguente.
+
+La prima riga serve a evitare che i dati in input siano presenti anche
+nell'output.  Dev'essere nel formato mostrato nell'esempio.
+
+La riga seguente crea un comando esterno che prevale sul comando esterno
+superiore, che serve a prevenire una ricorsione infinita di file di comandi.
+
+Il penultimo comando ridirige @code{sys$input} su @code{sys$command},
+per poter ottenere i dati che sono ridiretti verso il comando.
+
+L'ultima riga esegue il comando vero e proprio.  Dev'essere l'ultimo
+comando, perch@'e i dati ridiretti da @command{gawk} saranno letti
+quando il file di comandi finisce di essere eseguito.
+
+@example
+$!'f$verify(0,0)'
+$ sort := sort
+$ define/user sys$input sys$command:
+$ sort sys$input: sys$output:
+@end example
+
+
+@node GNV su VMS
+@appendixsubsubsec Il progetto VMS GNV
+
+Il pacchetto VMS GNV fornisce un ambiente di sviluppo simile
+a POSIX tramite una collezione di strumenti @dfn{open source}.
+Il @command{gawk} presente nel pacchetto base GNV @`e una vecchia versione.
+Attualmente, il progetto GNV @`e in fase di riorganizzazione, con l'obiettivo
+di offrire pacchetti PCSI separati per ogni componente.
+Si veda @w{@uref{https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/}.}
+
+La procedura normale per compilare @command{gawk} produce un programma
+adatto a essere usato con GNV.
+
+Il file @file{vms/gawk_build_steps.txt} nella distribuzione documenta
+la procedura per compilare un pacchetto PCSI compatible con GNV.
+
+@ignore
+@c The VMS POSIX product, also known as POSIX for OpenVMS, is long defunct
+@c and building gawk for it has not been tested in many years, but these
+@c old instructions might still work if anyone is still using it.
+
+@node VMS POSIX
+@appendixsubsubsec Compilare e usare @command{gawk} su VMS POSIX
+
+Le istruzioni appena viste vanno ignorate, sebbene @file{vms/gawk.hlp}
+dovrebbe ancora essere reso disponibile in una libreria di aiuto.
+L'albero del codice sorgente dovrebbe essere scompattato in un sottosistema
+contenitore di file, e non nel normale @dfn{filesystem} VMS.
+Occorre accertarsi che i due @dfn{script}, @file{configure} e
+@file{vms/posix-cc.sh}, siano eseguibile; si usi @samp{chmod +x} per farlo,
+se necessario.  Poi vanno eseguiti i seguenti due comandi:
+
+@example
+psx> @kbd{CC=vms/posix-cc.sh configure}
+psx> @kbd{make CC=c89 gawk}
+@end example
+
+@noindent
+Il primo comando costruisce i file @file{config.h} e @file{Makefile},
+a partire da dei modelli, usando uno @dfn{script} per fare s@`{@dotless{i}} che il
+compilatore C soddisfi le aspettative di @command{configure}.  Il secondo
+comando compila e collega @command{gawk} chiamando direttamente il
+compilatore C; gli eventuali messaggi di @command{make} che dicono di non
+riuscire a ridefinire @code{CC} vanno ignorati.  @command{configure}
+impiega molto tempo a completarsi, ma in compenso continua a fornire
+messaggi che permettono di seguirne l'avanzamento.
+
+Questo @`e stato testato con VAX/VMS V6.2, VMS POSIX V2.0, e DEC C V5.2.
+
+Una volta installato, @command{gawk} funziona come ogni altro programma
+di utilit@`a della shell.  A differenza della normale versione VMS di
+@command{gawk}, neesuna manipolazione speciale della riga di comando @`e
+necessaria nell'ambiente VMS POSIX.
+@end ignore
+
+@node Vecchio Gawk su VMS
+@appendixsubsubsec Vecchia versione di @command{gawk} su sistemi VMS
+
+
+@c Thanks to "gerard labadie" <gerard.labadie@gmail.com>
+
+Alcune versioni di VMS includono una vecchia versione di @command{gawk}.
+Per utilizzarla, occorre definire un simbolo, come segue:
+
+@example
+$ @kbd{gawk :== $sys$common:[syshlp.examples.tcpip.snmp]gawk.exe}
+@end example
+
+La versione appare essere la @value{PVERSION} 2.15.6, che @`e molto vecchia.
+Si raccomanda di compilare e usare la versione corrente.
+
+@node Bug
+@appendixsec Segnalazione di problemi e bug
+@cindex archeologi
+@quotation
+@i{Non c'@`e niente di pi@`u pericoloso di un archeologo annoiato.}
+@author Douglas Adams, @cite{Guida galattica per autostoppisti}
+@end quotation
+@c the radio show, not the book. :-)
+
+@cindex debug, @command{gawk}, segnalare bug
+@cindex risoluzione problemi @command{gawk}, segnalare bug
+Se si incontrano problemi con @command{gawk} o se si ritiene di aver trovato un
+bug, si raccomanda di segnalarlo agli sviluppatori;
+non c'@`e un impegno preciso a intervenire, ma c'@`e una buona possibilit@`a che ci
+si sforzi di risolverlo.
+
+@menu
+* Indirizzo Bug::               Dove inviare le segnalazioni.
+* Usenet::                      Dove non inviare le segnalazioni.
+* Manutentori::                 Manutentori di version non-*nix.
+@end menu
+
+@node Indirizzo Bug
+@appendixsubsec Segnalare Bug
+
+Prima di segnalare un bug, occorre assicurarsi che sia davvero un bug.
+Per prima cosa, si deve verificare se si sta usando l'ultima versione di
+@command{gawk}.
+Molti bug (di solito difficili da scoprire) sono corretti in ogni nuova
+versione, e se la versione in uso @`e piuttosto datata, il problema pu@`o
+essere stato risolto nel frattempo.
+
+In secondo luogo, si dovrebbe controllare se, con l'impostare la variabile
+@env{LC_ALL} come @code{LC_ALL=C} produce il funzionamento atteso da parte
+del programma.  Se @`e questo il caso, il problema dipende dalla
+localizzazione, e pu@`o non essere veramente un bug.
+
+In terzo luogo, va riletta attentamente la documentazione,
+per controllare se dice che @`e possibile
+fare quel che si sta tentando di fare.  Se non @`e chiaro se sia possibile
+fare quella particolare cosa o no, occorre segnalarlo; in questo caso si tratta
+di un bug nella documentazione!
+
+Infine, prima
+di segnalare un bug o di tentare di risolverlo personalmente, si tenti
+di isolarlo preparando un programma @command{awk} il pi@`u piccolo possibile, con
+un @value{DF} in input che possa riprodurre il problema.  Dopo averlo fatto, si
+spedisca il programma e il @value{DF}, insieme a informazioni sul tipo di
+sistema Unix in uso, il compilatore usato per compilare @command{gawk}, e i
+risultati esatti che @command{gawk} ha prodotto.  Inoltre andrebbe specificato
+cosa ci si aspettava che il programma facesse; questo @`e di aiuto per decidere
+se il problema @`e un problema di documentazione.
+
+@`E importante includere il numero di versione di @command{gawk} in uso.
+Questa informazione si pu@`o ottenere con il comando @samp{gawk --version}.
+
+@cindex @code{bug-gawk@@gnu.org} indirizzo per la segnalazione dei bug
+@cindex email, indirizzo per segnalare bug, @code{bug-gawk@@gnu.org}
+@cindex indirizzo email per segnalare bug, @code{bug-gawk@@gnu.org}
+@cindex bug, segnalare, indirizzo email, @code{bug-gawk@@gnu.org}
+@cindex segnalare bug, indirizzo email, @code{bug-gawk@@gnu.org}
+Una volta pronta la descrizione precisa del problema, si spedisca un messaggio
+di posta elettronica a @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
+
+I manutentori di @command{gawk} sono i destinatari, e riceveranno la
+segnalazione di errore.  Sebbene sia possibile spedire messaggi direttamente ai
+manutentori, @`e preferibile usare l'indirizzo sopra fornito perch@'e quella
+mailing list rimane in archivio presso il Progetto GNU.  @emph{Tutti i messaggi
+devono essere in inglese. @`E questo il solo linguaggio che tutti i manutentori
+conoscono.} Inoltre, occorre accertarsi di spedire tutti i messaggi in formato
+@emph{testo}, e non (o non soltanto) in formato HTML.
+
+@quotation NOTA
+Molte distribuzioni di GNU/Linux e i vari sistemi operativi basati su
+BSD hanno un loro proprio canale per segnalare i bug.  Se si segnala un
+bug usando il canale della distribuzione, una copia del messaggio andrebbe
+inviata anche a @EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
+
+Questo per due ragioni.  La prima @`e che, sebbene alcune distribuzioni inoltrino
+i messaggi sui problemi ``verso l'alto'' alla mailing list GNU, molte non lo
+fanno, e quindi c'@`e una buona probabilit@`a che i manutentori di @command{gawk}
+non vedano affatto il messaggio relativo al bug!  La seconda ragione @`e che la
+posta diretta alla mailing list GNU @`e archiviata, e il poter disporre di ogni
+cosa all'interno del progetto GNU consente di avere a disposizione tutte le
+informazioni rilevanti senza dover dipendere da altre organizzazioni.
+@end quotation
+
+Suggerimenti non correlati a bug sono pure sempre benvenuti.  Se si hanno
+domande riguardo a qualcosa di non chiaro nella documentazione o a proposito
+di funzionalit@`a oscure, si scriva alla mailing list dei bug; si prover@`a
+a essere di aiuto nei limiti del possibile.
+
+Si tenga presente: Si chiede di seguire le
+@uref{https://gnu.org/philosophy/kind-communication.html,
+@dfn{GNU Kind Communication Guidelines}
+-- Linee guida GNU per una comunicazione gentile}
+nella corrispondenza con la lista
+(e anche in quella fuori dalla lista).
+
+@node Usenet
+@appendixsubsec Non segnalare bug a USENET!
+
+@quotation
+@c Date: Sun, 17 May 2015 19:50:14 -0400
+@c From: Chet Ramey <chet.ramey@case.edu>
+@c Reply-To: chet.ramey@case.edu
+@c Organization: ITS, Case Western Reserve University
+@c To: Aharon Robbins <arnold@skeeve.com>
+@c CC: chet.ramey@case.edu
+Ho iniziato a ignorare Usenet un paio di anni fa, e non me ne sono mai
+pentito.  @`E come quando si parla di sport alla radio---ci si sente
+pi@`u intelligenti per aver lasciato perdere.
+@author Chet Ramey
+@end quotation
+
+@cindex @code{comp.lang.awk} gruppo di discussione
+@cindex newsgroup @code{comp.lang.awk}
+@cindex gruppo di discussione @code{comp.lang.awk}
+Siete pregati di @emph{non} provare a notificare bug di @command{gawk}
+scrivendo al gruppo di discussione Usenet/Internet @code{comp.lang.awk}.
+Sebbene alcuni degli sviluppatori di @command{gawk} leggano talora i
+messaggi di questo gruppo di discussione, il manutentore principale di
+@command{gawk} non lo fa pi@`u.  Quindi @`e praticamente certo che un
+messaggio inviato l@`a @emph{non} sia da lui letto.
+
+Analogamente, segnalando bug o ponendo domande in @dfn{forum} online
+come @uref{https://stackoverflow.com/, Stack Overflow}) si pu@`o
+ottenere una risposta, ma non dai manutentori di @command{gawk},
+che non dedicano tempo ai @dfn{forum} online.  La procedura qui
+descritta @`e la sola maniera ufficialmente riconosciuta
+per notificare problemi. Davvero!
+
+@ignore
+And another one:
+
+Date: Thu, 11 Jun 2015 09:00:56 -0400
+From: Chet Ramey <chet.ramey@case.edu>
+
+My memory was imperfect.  Back in June 2009, I wrote:
+
+"That's the nice thing about open source, right?  You can take your ball
+and run to another section of the playground.  Then, if you like mixing
+metaphors, you can throw rocks from there."
+@end ignore
+
+@node Manutentori
+@appendixsubsec Notificare problemi per versioni non-Unix
+
+Se si riscontrano bug in una delle versioni non-Unix di @command{gawk}, una
+copia del messaggio inviato alla mailing list dei bug andrebbe spedita alla
+persona che si occupa di quella versione.  I manutentori sono elencati nella
+lista seguente, come pure nel file @file{README} nella distribuzione
+@command{gawk}.  Le informazioni nel file @file{README} dovrebbero essere
+considerate come le pi@`u aggiornate, se risultano in conflitto con questo
+@value{DOCUMENT}.
+
+Le persone che si occupano delle varie versioni di @command{gawk} sono:
+
+@c put the index entries outside the table, for docbook
+@cindex Buening, Andreas
+@cindex Malmberg, John E.
+@cindex Pitts, Dave
+@cindex G., Daniel Richard
+@cindex Robbins, Arnold
+@cindex Zaretskii, Eli
+@cindex Guerrero, Juan Manuel
+@ifset SMALLPRINT
+@multitable {MS-Windows} {123456789012345678901234567890123456789001234567890}
+@end ifset
+@ifclear SMALLPRINT
+@multitable {MS-Windows con MinGW} {123456789012345678901234567890123456789001234567890}
+@end ifclear
+@item Unix e sistemi POSIX @tab Arnold Robbins, @EMAIL{arnold@@skeeve.com,arnold at skeeve dot com}
+
+@item MS-DOS with DJGPP @tab Juan Manuel Guerrero, @EMAIL{juan.guerrero@@gmx.de, juan dot guerrero at gmx dot de}
+
+@item MS-Windows con MinGW @tab Eli Zaretskii, @EMAIL{eliz@@gnu.org,eliz at gnu dot org}
+
+@c Leave this in the document on purpose.
+@c OS/2 is not mentioned anywhere else though.
+@item OS/2 @tab Andreas Buening, @EMAIL{andreas.buening@@nexgo.de,andreas dot buening at nexgo dot de}
+
+@item VMS @tab John Malmberg, @EMAIL{wb8tyw@@qsl.net,wb8tyw at qsl.net}
+
+@item z/OS (OS/390) @tab Daniel Richard G.@: @EMAIL{skunk@@iSKUNK.ORG,skunk at iSKUNK.ORG}
+@item  @tab Dave Pitts (Maintainer Emeritus), @EMAIL{dpitts@@cozx.com,dpitts at cozx dot com}
+@end multitable
+
+Se il problema riscontrato @`e riproducibile anche sotto Unix,
+si dovrebbe spedire una copia del messaggio anche alla mailing list
+@EMAIL{bug-gawk@@gnu.org,bug-gawk at gnu dot org}.
+
+La versione generata usando gli strumenti DJGPP non @`e pi@`u supportata;
+il codice relativo rester@`a nella distribuzione ancora per qualche tempo,
+nel caso che qualche volontario desideri prenderla in carico.
+Se questo non dovesse succedere, la parte di codice relativa questa
+versione sar@`a rimossa dalla distribuzione.
+
+@node Altre versioni
+@appendixsec Altre implementazioni di @command{awk} liberamente disponibili
+@cindex @command{awk}, implementazioni di
+@cindex implementazioni di @command{awk}
+@ignore
+From: emory!amc.com!brennan (Michael Brennan)
+Subject: C++ comments in awk programs
+To: arnold@gnu.ai.mit.edu (Arnold Robbins)
+Date: Wed, 4 Sep 1996 08:11:48 -0700 (PDT)
+
+@end ignore
+@cindex Brennan, Michael
+@ifnotdocbook
+@quotation
+@i{@`E piuttosto divertente mettere commenti simili nel vostro codice awk:}@*
+@ @ @ @ @ @ @code{// Funzionano i commenti in stile C++? Risposta: s@`{@dotless{i}}! certo}
+@author Michael Brennan
+@end quotation
+@end ifnotdocbook
+
+@docbook
+<blockquote><attribution>Michael Brennan</attribution>
+<literallayout><emphasis>
+@`E piuttosto divertente mettere commenti simili nel vostro codice awk.
+</emphasis>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<literal>
+// Funzionano i commenti in stile C++? Risposta: s@`{@dotless{i}}! certo
+</literal></literallayout>
+</blockquote>
+@end docbook
+
+Ci sono alcune altre implementazioni di @command{awk} disponibili
+gratuitamente.
+Questa @value{SECTION} descrive in breve dove @`e possibile trovarle:
+
+@table @asis
+@cindex Kernighan, Brian
+@cindex sorgente, codice, Brian Kernighan @command{awk}
+@cindex codice sorgente, Brian Kernighan @command{awk}
+@cindex @command{awk}, versioni di, si veda anche Brian Kernighan, @command{awk} di
+@cindex Brian Kernighan, @command{awk} di, codice sorgente
+@item Unix @command{awk}
+Brian Kernighan, uno degli sviluppatori originali di Unix @command{awk},
+ha reso disponibile liberamente la sua implementazione di @command{awk}.
+Pu@`o essere scaricata da GitHub:
+@example
+git clone git://github.com/onetrueawk/awk bwkawk
+@end example
+
+@noindent
+Questo comando crea una copia del deposito @uref{https://git-scm.com, Git}
+in una directory chiamata @file{bwkawk}.  Se si omette l'ultimo argomento
+della riga di comando @command{git}, la copia del deposito @`e creata in una
+directory di nome @file{awk}.
+
+Questa versione richiede un compilatore ISO C (standard 1990); il compilatore
+C contenuto in GCC (la collezione di compilatori GNU) @`e pi@`u che sufficiente.
+
+Per eseguire la compilazione, si rivedano le impostazioni nel file
+@file{makefile}, e quindi si richiami semplicemente @command{make}.
+Si noti che il risultato della compilazione ha come nome
+@command{a.out}; questo file va rinominato in maniera adeguata.
+
+@xref{Estensioni comuni}
+per una lista di estensioni in questo @command{awk} che non sono in
+POSIX @command{awk}.
+
+Incidentalmente, Dan Bornstein ha creato un deposito Git che contiene tutte le
+versioni di BWK @command{awk} che @`e riuscito a trovare.  @`E disponibile in
+@uref{git://github.com/danfuzz/one-true-awk}.
+
+@cindex Brennan, Michael
+@cindex @command{mawk}, programma di utilit@`a
+@cindex programma di utilit@`a @command{mawk}
+@cindex codice sorgente, @command{mawk}
+@item @command{mawk}
+Michael Brennan ha scritto un'implementazione indipendente di @command{awk},
+di nome @command{mawk}.  @`E disponibile sotto la licenza
+@ifclear FOR_PRINT
+GPL (@pxref{Copia}),
+@end ifclear
+@ifset FOR_PRINT
+GPL,
+@end ifset
+proprio come @command{gawk}.
+
+Il sito di distribuzione originale di @command{mawk} non contiene pi@`u
+il codice sorgente.  Una copia @`e disponibile in
+@uref{http://www.skeeve.com/gawk/mawk1.3.3.tar.gz}.
+
+Dal 2009 @`e Thomas Dickey a occuparsi della manutenzione di @command{mawk}.
+Le informazioni di base sono disponibili nella
+@uref{http://www.invisible-island.net/mawk, pagine web del progetto}.
+Il puntatore URL da cui scaricare @`e
+@url{http://invisible-island.net/datafiles/release/mawk.tar.gz}.
+
+Una volta scaricato,
+per scompattare questo file pu@`o essere usato @command{gunzip}.
+L'installazione @`e simile a quella di @command{gawk}
+(@pxref{Installazione Unix}).
+
+@xref{Estensioni comuni}
+per una lista di estensioni in @command{mawk} che non sono in POSIX @command{awk}.
+
+@item @command{mawk} 2.0
+Nel 2016, Michael Brennan ha iniziato nuovamente lo sviluppo di @command{mawk}.
+Le sue versioni di sviluppo sono disponibili tramite Git dalla pagina GitHub
+@uref{https://github.com/mikebrennan000/mawk-2, del progetto}.
+
+@cindex Sumner, Andrew
+@cindex @command{awka}, compilatore per @command{awk}
+@cindex compilatore per @command{awk}, @command{awka}
+@cindex sorgente, codice, @command{awka}
+@cindex codice sorgente di @command{awka}
+@item @command{awka}
+Scritto da Andrew Sumner,
+@command{awka} traduce i programmi @command{awk} in C, li compila,
+e prepara il codice eseguibile usando una libreria di funzioni che
+implementano le funzionalit@`a di base di @command{awk}.
+Comprende anche un certo numero di estensioni.
+
+Il traduttore di @command{awk} @`e rilasciato sotto la licenza GPL, e la
+relativa libreria sotto la licenza LGPL.
+
+Per ottenere @command{awka}, si visiti
+il sito @url{https://sourceforge.net/projects/awka}.
+@c You can reach Andrew Sumner at @email{andrew@@zbcom.net}.
+@c andrewsumner@@yahoo.net
+
+Il progetto sembra essere stato congelato; non ci sono state modifiche nel
+codice sorgente dal 2001 circa.
+
+@cindex Beebe, Nelson H.F.@:
+@cindex @command{pawk} (versione con profilazione di Brian Kernighan @command{awk})
+@cindex codice sorgente, @command{pawk}
+@cindex sorgente, codice, @command{pawk}
+@item @command{pawk}
+Nelson H.F.@: Beebe all'Universit@`a dello Utah ha modificato
+BWK @command{awk} per fornire informazioni di temporizzazione e profilazione.
+Questo @`e differente dall'usare @command{gawk} con l'opzione @option{--profile}
+(@pxref{Profilare})
+nel senso che fornisce un profilo basato sul consumo di CPU, non sul
+numero di esecuzioni di una data riga di codice.
+Sia pu@`o trovare sia in
+@uref{ftp://ftp.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}
+che in
+@uref{http://www.math.utah.edu/pub/pawk/pawk-20030606.tar.gz}.
+
+@item BusyBox @command{awk}
+@cindex BusyBox Awk
+@cindex codice sorgente, BusyBox Awk
+@cindex sorgente, codice, BusyBox Awk
+BusyBox @`e un programma distribuito con licenza GPL che fornisce versioni
+ridotte di parecchie piccole applicazioni, all'interno di un singolo modulo
+eseguibile.  @`E stato ideato per sistemi
+integrati.
+Include un'implementazione completa di POSIX @command{awk}.  Quando lo si
+compila occorre prestare attenzione a non eseguire @samp{make install}, perch@'e
+in questo modo si andrebbero a sostituire copie di altre applicazioni nella
+directory @file{/usr/local/bin} del sistema corrente.  Per ulteriori
+informazioni, si veda @uref{https://busybox.net, la pagina principale del progetto}.
+
+@cindex OpenSolaris
+@cindex Solaris, versione POSIX @command{awk}
+@cindex codice sorgente, Solaris @command{awk}
+@cindex sorgente, codice, Solaris @command{awk}
+@item POSIX @command{awk} per OpenSolaris
+Le versioni di @command{awk} in @file{/usr/xpg4/bin} e @file{/usr/xpg6/bin} su
+Solaris sono @dfn{grosso modo} conformi allo standard POSIX.  Sono basate sul
+comando @command{awk} preparato per i PC dalla ditta Mortice Kern.  @`E stato
+possibile compilare e far funzionare questo codice sotto GNU/Linux dopo 1--2
+ore di lavoro.  Rendere questo codice pi@`u generalmente portabile (usando gli
+strumenti GNU Autoconf e/o Automake) richiederebbe ulteriore lavoro, che non @`e
+stato fin qui compiuto, almeno per quel che risulta a chi scrive.
+
+@cindex Illumos
+@cindex Illumos, @command{awk} conforme a POSIX e
+@cindex codice sorgente, Illumos @command{awk}
+@cindex sorgente, codice, Illumos @command{awk}
+Il codice sorgente era un tempo disponibile dal sito web OpenSolaris.
+Tuttavia, il progetto @`e terminato, e il sito web chiuso.  Fortunatamente,
+il progetto
+@uref{https://wiki.illumos.org/display/illumos/illumos+Home, Illumos}
+mette a disposizione questa implementazione.  Si possono vedere i singoli file in
+@uref{https://github.com/joyent/illumos-joyent/blob/master/usr/src/cmd/awk_xpg4}.
+
+@cindex @command{goawk}
+@cindex Go, implementazione di @command{awk}
+@cindex sorgente, @command{goawk}
+@cindex @command{goawk}, sorgente di
+@cindex linguaggio di programmazione, Go
+@item @command{goawk}
+Questo @`e un interpretatore di @command{awk} scritto nel
+@uref{https://golang.org/, Linguaggio di programmazion Go}.
+Implementa POSIX @command{awk}, con alcune estensioni minori.
+Il codice sorgente @`e disponibile in @uref{https://github.com/benhoyt/goawk}.
+L'autore ha scritto un buon
+@uref{https://benhoyt.com/writings/goawk/, articolo}
+che descrive l'implementazione.
+
+@cindex @command{jawk}
+@cindex Java, implementazione di @command{awk}
+@cindex implementazione Java di @command{awk}
+@cindex codice sorgente, @command{jawk}
+@cindex sorgente, codice, @command{jawk}
+@item @command{jawk}
+Questo @`e un interprete per @command{awk} scritto in Java.  Dichiara di
+essere un interprete completo, anche se, poich@'e usa funzionalit@`a di Java
+per l'I/O e per la ricerca di @dfn{regexp}, il linguaggio che supporta
+@`e differente da @command{awk} POSIX.
+Ulteriori informazioni sono disponibili sulla
+@uref{https://jawk.sourceforge.net, pagina principale del progetto}.
+
+@item Libmawk
+@cindex @command{libmawk}
+@cindex codice sorgente, @command{libmawk}
+@cindex sorgente, codice, @command{libmawk}
+Questo @`e un interprete @command{awk} incorporabile, derivato da
+@command{mawk}. Per ulteriori informazioni, si veda
+@uref{http://repo.hu/projects/libmawk/}.
+
+@cindex codice sorgente, interpretatore @command{awk} incorporabile
+@cindex Neacsu, Mircea
+@item @command{awk} incorporabile di Mircea Neacsu
+@item incorporabile, @command{awk}, di Mircea Neacsu
+Mircea Neacsu ha creato un interpretatore @command{awk}
+incorporabile, basato su BWK @command{awk}.  @`E disponibile
+nel sito @uref{https://github.com/neacsum/awk}.
+
+@item @code{pawk}
+@cindex codice sorgente, @command{pawk} (versione Python)
+@cindex sorgente, codice, @command{pawk} (versione Python)
+@cindex @code{pawk}, implementazione simile ad @command{awk} per Python
+Questo @`e un modulo Python che intende introdurre funzionalit@`a di tipo
+@command{awk} in Python.  Si veda @uref{https://github.com/alecthomas/pawk} per
+ulteriori informazioni.  (Questo programma non @`e correlato con la versione
+modificata da Nelson Beebe di BWK @command{awk}, descritta prima.)
+
+@item @w{QSE @command{awk}}
+@cindex QSE @command{awk}
+@cindex codice sorgente, QSE @command{awk}
+@cindex sorgente, codice, QSE @command{awk}
+Questo @`e un interprete di @command{awk} incorporabile.  Per ulteriori
+informazioni, si veda
+@uref{https://code.google.com/p/qse/}. @c e @uref{http://awk.info/?tools/qse}.
+
+@item @command{QTawk}
+@cindex QuikTrim Awk
+@cindex codice sorgente, QuikTrim Awk
+@cindex sorgente, codice, QuikTrim Awk
+Questa @`e un'implementazione indipendente di @command{awk} distribuita con la
+licenza GPL. Ha un gran numero di estensioni rispetto ad @command{awk}
+standard, e pu@`o non essere sintatticamente compatibile al 100% con esso.  Si
+veda @uref{http://www.quiktrim.org/QTawk.html} per ulteriori informazioni,
+compreso il manuale.  Il puntatore per scaricare QuikTrim non punta all'ultima
+versione: si veda @uref{http://www.quiktrim.org/#AdditionalResources} per un
+puntatore alla versione corrente.
+
+Il progetto sembra essere fermo; non ci sono nuove versioni del codice
+a partire dal 2014 circa.
+
+@item Altre versioni
+Si veda anche [in inglese] la sezione ``Versions and implementations''
+della voce di
+@uref{https://en.wikipedia.org/wiki/Awk_language#Versions_and_implementations,
+Wikipedia} su @command{awk} per informazioni su ulteriori versioni.
+
+@end table
+
+@node Sommario dell'installazione
+@appendixsec Sommario
+
+@itemize @value{BULLET}
+@item
+La distribuzione di @command{gawk} @`e disponibile dal sito principale
+di distribuzione del Progetto GNU
+@code{ftp.gnu.org}.  La maniera canonica per scaricarlo e installarlo @`e:
+
+@example
+wget https://ftp.gnu.org/gnu/gawk/gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+tar -xvpzf gawk-@value{VERSION}.@value{PATCHLEVEL}.tar.gz
+cd gawk-@value{VERSION}.@value{PATCHLEVEL}
+./configure && make && make check
+@end example
+
+@quotation NOTA
+A causa degli URL di tipo @samp{https://}, pu@`o essere necessario
+specificare l'opzione @option{--no-check-certificate} a @command{wget}
+per poter scaricare il file.
+@end quotation
+
+@item
+@command{gawk} pu@`o essere installato anche su sistemi non-POSIX.  I sistemi
+correntemente supportati sono MS-Windows, usando
+MSYS, DJGPP, MinGW, e Cygwin,
+@c OS/2,
+e sia Vax/VMS che OpenVMS.  Le istruzioni per ognuno di questi sistemi sono
+incluse in questa @value{APPENDIX}.
+
+@item
+Le segnalazioni di errori (bug) dovrebbero essere spedite tramite email a
+@email{bug-gawk@@gnu.org}.  Le segnalazioni di errore dovrebbero essere scritte
+in inglese e dovrebbero specificare la versione di @command{gawk} in uso, come
+@`e stata compilata, un breve programma e un @value{DF} che permettono di
+riprodurre il problema.
+
+@item
+Ci sono alcune altre implementazioni di @command{awk} disponibili
+gratuitamente.  Molte rispettano lo standard POSIX; altre un po' meno.
+
+@end itemize
+
+
+@ifclear FOR_PRINT
+@node Note
+@appendix Note di implementazione
+@cindex @command{gawk}, problemi di implementazione
+@cindex problemi di implementazione, @command{gawk}
+
+Quest'appendice contiene informazioni che interessano soprattutto le persone
+che aggiornano e mantengono @command{gawk}.  L'intero contenuto si applica
+specificatamente a @command{gawk} e non ad altre implementazioni.
+
+@menu
+* Modalit@`a di compatibilit@`a:: Come inibire alcune estensioni di
+                                @command{gawk}.
+* Aggiunte::                    Fare aggiunte a @command{gawk}.
+* Future estensioni::           Nuove funzionalit@`a che potranno
+                                essere implementate in futuro.
+* Limitazioni dell'implementazione:: Alcune limitazioni
+                                dell'implementazione.
+* Progetto delle estensioni::   Note di progetto sull'estensione API.
+* Sommario delle note::         Sommario delle note di
+                                implementazione.
+@end menu
+
+@node Modalit@`a di compatibilit@`a
+@appendixsec Compatibilit@`a all'indietro e debug
+@cindex @command{gawk}, problemi di implementazione, compatibilit@`a all'indietro
+@cindex @command{gawk}, problemi di implementazione, debug
+@cindex risoluzione di problemi, @command{gawk}
+@cindex problemi, risoluzione di, @command{gawk}
+@cindex problemi di implementazione@comma{} @command{gawk}, debug
+
+@xref{POSIX/GNU},
+per un compendio delle estensioni GNU per il linguaggio e il programma
+@command{awk}.  Tutte queste funzionalit@`a possono essere inibite invocando
+@command{gawk} con l'opzione @option{--traditional} o con l'opzione
+@option{--posix}.
+
+Se @command{gawk} @`e stato compilato per il debug con @samp{-DDEBUG}, @`e
+possibile specificare un'ulteriore opzione sulla riga di comando:
+
+@table @code
+@item -Y
+@itemx --parsedebug
+Stampa l'informazione contenuta nella pila di analisi, durante la fase di
+analisi iniziale del programma.
+@end table
+
+Quest'opzione @`e utile solo a chi sviluppa @command{gawk} e non all'utente
+occasionale.  @`E probabile che non sia neppure disponibile nella versione di
+@command{gawk} che si sta usando, perch@'e rallenta l'esecuzione del programma.
+
+@node Aggiunte
+@appendixsec Fare aggiunte a @command{gawk}
+
+Se si desidera migliorare @command{gawk} in maniera significativa, c'@`e la
+massima libert@`a di farlo.  @`E questo lo scopo del software libero; il codice
+sorgente @`e disponibile, ed @`e possibile modificarlo a piacere
+(@pxref{Copia}).
+
+@ifnotinfo
+Questa
+@end ifnotinfo
+@ifinfo
+Questo
+@end ifinfo
+@value{SECTION} tratta di come @`e possibile modificare @command{gawk},
+ed espone alcune considerazioni che si dovrebbero tenere presenti.
+
+@menu
+* Accedere ai sorgenti::        Accedere al deposito dei sorgenti Git.
+* Aggiungere codice::           Aggiungere codice al programma
+                                principale @command{gawk}.
+* Nuovi sistemi::               Portare @command{gawk} su un nuovo sistema
+                                operativo.
+* File derivati::               Perch@'e i file derivati sono tenuti
+                                nel deposito @command{git}.
+@end menu
+
+@node Accedere ai sorgenti
+@appendixsubsec Accedere al deposito dei sorgenti Git di @command{gawk}
+
+Poich@'e @command{gawk} @`e Software Libero, il codice sorgente @`e sempre
+disponibile.
+@iftex
+La
+@end iftex
+@ref{Distribuzione di Gawk} descrive come scaricare e installare
+le versioni ufficiali rilasciate di @command{gawk}.
+
+@cindex @command{git}, programma di utilit@`a
+@cindex programma di utilit@`a @command{git}
+Peraltro, se si intende modificare @command{gawk} e mettere a disposizione le
+modifiche, @`e preferibile lavorare sulla versione in via di sviluppo.  Per far
+ci@`o @`e necessario accedere al deposito del codice sorgente di @command{gawk}.
+Il codice @`e mantenuto usando il @uref{https://git-scm.com, sistema distribuito
+di controllo delle versioni Git}.  Sar@`a necessario installarlo se non @`e gi@`a
+presente nel sistema.  Quando @command{git} @`e disponibile, va usato il comando:
+
+@example
+git clone https://git.savannah.gnu.org/gawk.git
+@end example
+
+@noindent
+Questo comando scarica in locale una copia esatta del deposito dei
+sorgenti di @command{gawk}.  Se si sta usando un @dfn{firewall}
+che non consente l'uso del protocollo nativo di Git, @`e possibile accedere
+ugualmente al deposito usando il comando:
+
+@example
+git clone http://git.savannah.gnu.org/r/gawk.git
+@end example
+
+Una volta modificato il sorgente, @`e posibile usare @samp{git diff} per
+produrre una @dfn{patch}, e spedirla al manutentore di @command{gawk}; si veda
+@ref{Bug}, per come farlo.
+
+In passato era disponibile un'interfaccia Git--CVS
+utilizzabile da persone che non avevano a disposizione Git.  Purtroppo,
+quest'interfaccia non funziona pi@`u, ma si potrebbe avere maggior fortuna usando
+un sistema di controllo versioni pi@`u moderno, come Bazaar, che @`e dotato di
+un'estensione Git per lavorare con depositi di sorgenti Git.
+
+@node Aggiungere codice
+@appendixsubsec Aggiungere nuove funzionalit@`a
+
+@cindex @command{gawk}, aggiungere funzionalit@`a a
+@cindex funzionalit@`a, aggiungere a @command{gawk}
+@cindex aggiungere funzionalit@`a a @command{gawk}
+Ognuno @`e libero di aggiungere tutte le nuove funzionalit@`a che vuole a
+@command{gawk}.  Comunque, se si desidera che tali modifiche siano incorporate
+nella distribuzione di @command{gawk}, ci sono parecchi passi da fare per
+rendere possibile la loro inclusione:
+
+@enumerate 1
+@item
+Prima di inserire la nuova funzionalit@`a all'interno di @command{gawk},
+prendere in considerazione la possibilit@`a di scriverla sotto forma di
+estensione  (@pxref{Estensioni dinamiche}).
+Se ci@`o non @`e possibile, continuare con i passi rimanenti descritti in questa
+lista.
+
+@item
+Essere disposti a firmare un documento liberatorio appropriato.
+Se l'FSF deve poter distribuire le modifiche, queste vanno dichiarate
+di pubblico dominio, tramite la firma di un documento apposito, oppure
+attribuendo il copyright delle modifiche all'FSF.
+Entrambe queste azioni sono semplici da fare, e @emph{molte} persone gi@`a
+l'hanno fatto.  Se ci sono domande da fare, mettersi in contatto con me
+(@pxref{Bug}),
+oppure @EMAIL{assign@@gnu.org,assign chiocciola gnu punto org}.
+
+@item
+Utilizzare l'ultima versione.
+@`E molto pi@`u semplice per me integrare modifiche se sono basate sull'ultima
+versione disponibile di @command{gawk} o, meglio ancora, sull'ultimo codice
+sorgente presente nel deposito Git.  Se la versione di @command{gawk} @`e molto
+vecchia, potrei non essere affatto in grado di integrare le modifiche.
+(@xref{Scaricare},
+per informazioni su come ottenere l'ultima versione di @command{gawk}.)
+
+@item
+@ifnotinfo
+Seguire gli @cite{Standard di codifica GNU}.
+@end ifnotinfo
+@ifinfo
+Si veda @inforef{Top, , Version, standards, Standard di Codifica GNU}.
+@end ifinfo
+Questo documento descrive come dovrebbe essere scritto il software GNU.
+Se non lo si @`e letto, @`e bene farlo, preferibilmente @emph{prima}
+di iniziare a modificare @command{gawk}.
+(Gli @cite{Standard di codifica GNU} sono disponibili nel sito web del
+@uref{https://www.gnu.org/prep/standards/, Progetto GNU}.
+Sono disponibili anche versioni in formato Texinfo, Info, e DVI.)
+
+@cindex @command{gawk}, stile di codifica in
+@item
+Usare lo stile di codifica @command{gawk}.
+Il codice sorgente in C di @command{gawk} segue le istruzioni dello
+@cite{Standard di codifica GNU}, con qualche piccola eccezione.  Il codice @`e
+formattato usando lo stile tradizionale ``K&R'', in particolare per ci@`o che
+riguarda il posizionamento delle parentesi graffe e l'uso del carattere TAB.
+In breve, le regole di codifica per @command{gawk}
+sono le seguenti:
+
+@itemize @value{BULLET}
+@item
+Usare intestazioni di funzione (prototipi) in stile ANSI/ISO quando
+si definiscono delle funzioni.
+
+@item
+Mettere il nome della funzione all'inizio della riga in cui la si sta definendo.
+
+@item
+Usare @samp{#elif} invece di nidificare istruzioni @samp{#if} all'interno
+di un'istruzione @samp{#else}.
+
+@item
+Mettere il tipo di codice di ritorno della funzione, anche se @`e @code{int},
+sulla riga immediatamente sopra quella che contiene il nome e gli argomenti
+della funzione.
+
+@item
+Mettere degli spazi attorno alle parentesi usate nelle strutture di controllo
+(@code{if}, @code{while}, @code{for}, @code{do}, @code{switch}
+e @code{return}).
+
+@item
+Non mettere spazi davanti alle parentesi usate nelle chiamate di funzione.
+
+@item
+Mettere spazi attorno a tutti gli operatori C e dopo le virgole,
+nelle chiamate di funzione.
+
+@item
+Non usare l'operatore @dfn{virgola} per produrre degli effetti collaterali
+multipli, tranne che nelle parti di inizializzazione e incremento dei cicli
+@code{for}, e nel corpo delle macro.
+
+@item
+Usare dei caratteri TAB per l'indentazione, e non dei semplici spazi.
+
+@item
+Usare lo stile ``K&R'' per formattare le parti di programma incluse fra
+parentesi graffe.
+
+@item
+Usare confronti con @code{NULL} e @code{'\0'} per le condizioni
+contenute nelle istruzioni @code{if}, @code{while} e @code{for}, e anche
+nelle varie clausole @code{case} delle istruzioni @code{switch}, invece
+del semplice puntatore o il semplice valore del carattere.
+
+@item
+Usare i valori @code{true} e @code{false} per le variabili @code{booleane},
+la costante simbolica @code{NULL} per i valori dei puntatori,
+e la costante carattere @code{'\0'} quando @`e il caso, invece dei valori @code{1}
+e @code{0}.
+
+@item
+Fornire un commento descrittivo di una riga per ogni funzione.
+
+@item
+Non usare la funzione @code{alloca()} per allocare memoria dalla @dfn{stack}.
+Il farlo genera dei problemi di portabilit@`a che non giustificano il vantaggio
+secondario di non doversi preoccupare di liberare la memoria.  Usare invece
+@code{malloc()} e @code{free()}.
+
+@item
+Non usare confronti nella forma @samp{! strcmp(a, b)} o simili.
+Come disse una volta Henry Spencer, ``@code{strcmp()} non @`e una funzione
+booleana!''  Usare invece @samp{strcmp(a, b) == 0}.
+
+@item
+Per aggiungere nuovi valori a @dfn{flag} binari, usare costanti esadecimali
+esplicite (@code{0x001}, @code{0x002}, @code{0x004}, etc.) invece che
+spostare di un bit a sinistra in incrementi successivi
+(@samp{(1<<0)}, @samp{(1<<1)}, etc.).
+@end itemize
+
+@quotation NOTA
+Qualora fossi costretto a riformattare completamente il codice per
+farlo aderire allo stile di codifica usato in @command{gawk}, potrei anche
+decidere di ignorare del tutto le modifiche proposte.
+@end quotation
+
+@cindex Texinfo
+@item
+Aggiornare la documentazione.
+Insieme col nuovo codice, fornire nuove sezioni e/o capitoli per questo
+@value{DOCUMENT}.  Per quanto possibile, usare il formato Texinfo, invece
+di fornire soltanto del testo ASCII non formattato (sebbene un semplice testo
+sia gi@`a meglio che nessuna documentazione).  Le convenzioni da seguire in
+@cite{@value{TITLE}} sono elencate dopo la parole chiave @samp{@@bye} alla fine
+del file sorgente Texinfo.  Se possibile, aggiornare anche la pagina di manuale
+in formato @command{man}.
+
+Si dovr@`a anche firmare un documento liberatorio relativo alle
+modifiche apportate alla documentazione.
+
+@cindex @command{git}, programma di utilit@`a
+@cindex programma di utilit@`a @command{git}
+@item
+Inviare le modifiche come file di differenze nel formato contestuale unificato.
+Usare @samp{diff -u -r -N} per confrontare i sorgenti originali dell'albero
+di sorgenti @command{gawk} con la versione proposta.
+Si raccomanda di usare la versione GNU di @command{diff} o, ancora meglio,
+@samp{git diff} o @samp{git format-patch}.
+Per inviare le modifiche proposte spedire l'output prodotto da @command{diff}.
+(@xref{Bug}, per l'indirizzo di posta elettronica.)
+
+L'uso di questo formato rende semplice per me l'applicazione delle modifiche
+alla versione principale del sorgente di @command{gawk} (usando il programma di
+utilit@`a @code{patch}).  Se invece tocca a me applicare le modifiche a mano,
+con un editor di testo, potrei decidere di non farlo, specialmente
+se le modifiche sono molte.
+
+@item
+Includere una descrizione da aggiungere al file @file{ChangeLog} riguardo alla
+modifica da voi proposta.  Questo serve a minimizzare l'attivit@`a a me
+richiesta, rendendo pi@`u facile per me l'accettazione delle modifiche, che
+diventa pi@`u semplice se si include anche questa parte nel file di differenze
+(nel formato @dfn{diff}).
+@end enumerate
+
+Sebbene questa possa sembrare una richiesta molto esigente, si tenga presente
+che, anche se il nuovo codice non @`e opera mia, tocca poi a me manutenerlo e
+correggere eventuali errori.  Se non @`e possibile per me farlo senza perderci
+troppo tempo, potrei anche lasciar perdere la modifica.
+
+@node Nuovi sistemi
+@appendixsubsec Portare @command{gawk} su un nuovo Sistema Operativo
+@cindex portabilit@`a, @command{gawk}
+@cindex sistemi operativi, portare @command{gawk} su altri
+
+@cindex portare @command{gawk}
+Se si vuol portare @command{gawk} su di un nuovo sistema operativo, sono
+necessari parecchi passi:
+
+@enumerate 1
+@item
+Seguire le linee-guida contenute
+@ifinfo
+in @ref{Aggiungere codice},
+@end ifinfo
+@ifnotinfo
+nella precedente @value{SECTION}
+@end ifnotinfo
+relative allo stile di codifica, all'invio delle differenze proposte, etc.
+
+@item
+Essere disposti a firmare un documento liberatorio appropriato.
+Se l'FSF deve poter distribuire le modifiche, queste vanno dichiarate
+di pubblico dominio, tramite la firma di un documento apposito, oppure
+attribuendo il copyright delle modifiche all'FSF.
+Entrambe queste azioni sono semplici da fare, e @emph{molte} persone gi@`a
+l'hanno fatto.  Se ci sono domande da fare, scrivere a me
+oppure all'indirizzo @email{gnu@@gnu.org}.
+
+@item
+Nel realizzare un @dfn{port}, tener presente che il codice
+deve coesistere pacificamente con il resto di @command{gawk} e con le
+versioni per altri sistemi operativi.
+Evitare modifiche non necessarie alla parte di codice che @`e indipendente
+dal sistema operativo.  Se possibile, evitare di disseminare @samp{#ifdef},
+utili solo per il proprio @dfn{port}, all'interno del codice sorgente.
+
+Se le modifiche necessarie per un particolare sistema coinvolgono una parte
+troppo rilevante del codice, @`e probabile che io non le accetti.
+In questo caso si possono, naturalmente, distribuire le modifiche per
+proprio conto, basta che si rispettino i vincoli della GPL
+(@pxref{Copia}).
+
+@item
+Un certo numero di file che fanno parte della distribuzione di @command{gawk}
+sono mantenuti da terze persone e non dagli sviluppatori di @command{gawk}.
+Quindi, non si dovrebbero cambiare, se non per ragioni molto
+valide; vale a dire, modifiche a questi file non sono impossibili, ma
+le modifiche a questi file saranno controllate con estrema attenzione.
+Questi file sono tutti quelli contenuti nella directory @file{support}
+presente nella distribuzione di @command{gawk}.  Vedere direttamente l@`a.
+
+@item
+Un certo numero di altri file sono prodotti dagli Autotool [comandi di
+configurazione] di GNU (Autoconf, Automake, e GNU @command{gettext}).
+Neppure questi file dovrebbero essere modificati, se non per ragioni molto
+valide.  I file sono
+@file{ABOUT-NLS},
+@file{config.guess},
+@file{config.rpath},
+@file{config.sub},
+@file{depcomp},
+@file{INSTALL},
+@file{install-sh},
+@file{missing},
+@file{mkinstalldirs},
+e
+@file{ylwrap}.
+
+@item
+Essere disponibili a continuare a manutenere il @dfn{port}.
+I sistemi operativi non-Unix sono supportati da volontari che tengono
+aggiornato il codice necessario per compilare ed eseguire @command{gawk}
+nei loro sistemi.  Se nessuno @`e disponibile a tener aggiornato un @dfn{port},
+questo diventa non pi@`u supportato, e pu@`o essere necessario rimuoverlo dalla
+distribuzione.
+
+@item
+Fornire un appropriato file @file{gawkmisc.???}.
+Ogni @dfn{port} ha il proprio @file{gawkmisc.???} che implementa alcune
+funzioni specifiche per quel sistema operativo.  Questa @`e una soluzione pi@`u
+pulita, rispetto a una quantit@`a di @samp{#ifdef} sparsi nel codice.  Il file
+@file{gawkmisc.c} nella directory principale dei sorgenti include gli
+appropriati file @file{gawkmisc.???} da ogni sottodirectory.  Anche
+quest'ultimo file va aggiornato.
+
+Ogni file @file{gawkmisc.???} del @dfn{port} ha un suffisso esplicativo
+del tipo di macchina o del sistema operativo in questione---per esempio,
+@file{pc/gawkmisc.pc} e @file{vms/gawkmisc.vms}. L'uso di suffissi distinti
+invece di un semplice @file{gawkmisc.c}, rende possibile spostare file da
+una sottodirectory propria del @dfn{port} nella sottodirectory principale,
+senza cancellare incidentalmente il file @file{gawkmisc.c} vero e proprio.
+(Al momento, questo rappresenta un problema solo per i @dfn{port} ai
+sistemi operativi dei PC.)
+
+@item
+Fornire un @file{Makefile} e ogni altro file sorgente o di intestazione in C
+che sia necessario per il proprio sistema operativo.  Tutto il codice dovrebbe
+stare in una sottodirectory a parte, il cui nome sia lo stesso, o
+sia indicativo, del proprio sistema operativo o del tipo di computer.
+Se possibile, tentare di strutturare il codice in modo che non sia necessario
+spostare file dalla propria sottodirectory nella directory principale del
+codice sorgente.  Se ci@`o non @`e possibile, evitare nel modo pi@`u assoluto di
+usare nomi per i file che siano duplicati di nomi di file presenti nella
+directory principale del codice sorgente.
+
+@item
+Aggiornare la documentazione.
+Scrivere una sezione (o pi@`u sezioni) per questo @value{DOCUMENT}
+che descriva i passi di installazione e compilazione necessari per compilare
+e/o installare @command{gawk} per il sistema desiderato.
+@end enumerate
+
+Seguire queste indicazioni facilita molto l'integrazione delle
+modifiche in @command{gawk} e la loro felice coesistenza con il codice di
+altri sistemi operativi gi@`a presenti.
+
+Nel codice che viene fornito e tenuto aggiornato, si possono
+tranquillamente usare uno stile di codifica e una disposizione delle
+parentesi graffe di proprio gradimento.
+
+@node File derivati
+@appendixsubsec Perch@'e i file generati sono tenuti in Git
+
+@cindex Git, uso per il codice sorgente di @command{gawk}
+@c From emails written March 22, 2012, to the gawk developers list.
+
+Se si esaminano i sorgenti di @command{gawk} nel deposito Git
+si noter@`a che sono inclusi file generati automaticamente dagli strumenti
+dell'infrastruttura GNU, come @file{Makefile.in} generato da Automake e
+anche @file{configure} proveniente da Autoconf.
+
+Questo comportamento @`e differente da quello di molti progetti di
+Libero Software che non memorizzano i file derivati, per mantenere pi@`u
+sgombro il deposito Git, rendendo cos@`{@dotless{i}} pi@`u facile comprendere quali sono le
+modifiche sostanziali confrontando differenti versioni, nel tentativo di
+capire cosa @`e cambiato tra una modifica e la precedente.
+
+Tuttavia, ci sono parecchie ragioni per le quali il manutentore di
+@command{gawk} preferisce mantenere ogni cosa nel deposito Git.
+
+Innanzitutto, perch@'e in questo modo @`e facile generare completamente ogni
+data versione, senza doversi preoccupare di avere a disposizione altri
+strumenti (pi@`u vecchi, probabilmente obsoleti, e in qualche caso
+perfino impossibili da trovare).
+
+Come esempio estremo, se solo si pensa di tentare di compilare, diciamo, la
+versione Unix V7 di @command{awk}, ci si accorge che non solo @`e necessario
+scaricare e ricompilare la versione V7 del comando @command{yacc} per farlo, ma
+anche che serve la versione V7 del comando @command{lex}.  E quest'ultima @`e
+praticamente impossibile farla funzionare in un sistema GNU/Linux dei giorni
+nostri.@footnote{Ci abbiamo provato. @`E stata un'esperienza dolorosa.}
+
+(Oppure, diciamo che la versione 1.2 di @command{gawk} richiede il comando
+@command{bison} come funzionava nel 1989, e non @`e presente il file
+@file{awkgram.c} [generato tramite @command{bison}] nel deposito Git.  Che cosa
+ci garantisce di riuscire a trovare quella versione di @command{bison}? O che
+@emph{quella} riesca a generarlo?)
+
+Se il deposito Git comprende tutti i file derivati,
+@`e facile, dopo averli scaricati, ricostruire il programma.  (Oppure @`e @emph{pi@`u
+facile}, a seconda di quanto si vuole risalire indietro nel tempo).
+
+E qui arriviamo alla seconda (e pi@`u valida) ragione per cui tutti i file
+devono essere proprio nel deposito Git.  Domandiamoci a chi ci si rivolge:
+agli sviluppatori di @command{gawk}, oppure a un utilizzatore che intende
+solo scaricare una data versione e provarla?
+
+Il manutentore di @command{gawk} desidera che per tutti gli utenti
+@command{awk} interessati sia possibile limitarsi a clonare il deposito sul
+proprio computer, selezionare la variante che lo interessa e costruirla.  Senza
+doversi preoccupare di avere a disposizione le versioni corrette degli Autotool
+GNU.@footnote{Ecco un programma GNU che (secondo noi) @`e estremamente difficile
+da estrarre dal deposito Git e compilare.  Per esempio, in un vecchio (ma
+ancora funzionante) PowerPC Macintosh, con il sistema operativo Mac Os X 10.5,
+@`e stato necessario scaricare e compilare una tonnellata di software,
+incominciando dallo stesso programma Git, per riuscire a lavorare con l'ultima
+versione del codice.  Non @`e un'esperienza piacevole e, specie sui vecchi
+sistemi, @`e una notevole perdita di tempo.
+
+Neppure partire dall'ultimo archivio @command{tar} compresso @`e stata una
+passeggiata: i manutentori avevano eliminato i file compressi in formato
+@file{.gz} e @file{.bz2} sostituendoli con file di tipo @file{.tar.xz}.
+Bisognava quindi per prima cosa scaricare e compilare @command{xz}}.
+A questo serve il file @file{bootstrap.sh}.  Va a "toccare"
+[tramite il comando @command{touch}] vari altri file nell'ordine richiesto
+in modo che
+
+@example
+# La formula canonica per compilare il software GNU:
+./bootstrap.sh && ./configure && make
+@end example
+
+@noindent
+tutto @emph{funzioni senza problemi}.
+
+Questo @`e estremamente importante per i rami
+@code{master} e @code{gawk-@var{X}.@var{Y}-stable}.
+
+Inoltre, il manutentore di @command{gawk} potrebbe sostenere che
+ci@`o @`e importante anche per gli sviluppatori di @command{gawk}.  Tentando di
+scaricare il ramo @code{xgawk}@footnote{Un ramo (non pi@`u presente) creato da
+uno degli altri sviluppatori, e che non includeva i file generati.} per
+compilarlo, non ci riusc@`{@dotless{i}}.  (Mancava il file @file{ltmain.sh}, ed egli non
+aveva idea di come crearlo, e c'erano anche ulteriori problemi.)
+
+La cosa lo lasci@`o in uno stato di frustrazione @emph{estrema}.  Riguardo a quel
+ramo, il manutentore @`e in una posizione non differente da quella di un utente
+generico che voglia tentare di compilare @code{gawk-4.1-stable} o @code{master}
+dal deposito Git.
+
+Quindi, il manutentore ritiene che sia non solo importante, ma cruciale, che
+per ogni dato ramo la formula canonica evocata prima
+@emph{funzioni senza problemi}.
+
+@c Added 9/2014:
+Una terza ragione per avere tutti i file @`e che senza di essi, usare @samp{git
+bisect} per tentare di trovare quale modifica ha introdotto un errore diventa
+estremamente difficile.  Il manutentore ha tentato di farlo su un altro
+progetto che richiede di eseguire @dfn{script} di inizializzazione allo scopo
+di creare lo @dfn{script} @command{configure} e cos@`{@dotless{i}} via; @`e stata un'esperienza
+veramente dolorosa.  Se invece il deposito Git contiene tutto il necessario,
+usare @command{git bisect} al suo interno @`e molto facile.
+
+@c So - that's my reasoning and philosophy.
+
+Quali sono, quindi, alcune delle conseguenze e/o delle cose da fare?
+
+@enumerate 1
+@item
+Non importa se ci sono file differenti nei diversi rami
+prodotti da versioni differenti degli Autotool.
+
+@enumerate A
+@item
+Spetta al manutentore integrarli tra loro, e se ne occuper@`a lui.
+
+@item
+@`E facile per lui eseguire @samp{git diff x y > /tmp/diff1 ; gvim /tmp/diff1}
+per rimuovere le differenze che non sono rilevanti ai fini della revisione
+del codice sorgente.
+@end enumerate
+
+@item
+Sarebbe sicuramente d'aiuto se tutti usassero le stesse versioni degli Autotool
+GNU che lui usa, che in generale sono le ultime versioni rilasciate di
+Automake,
+Autoconf,
+@command{bison},
+GNU @command{gettext}
+e
+Libtool.
+
+@ignore
+If it would help if I sent out an ``I just upgraded to version x.y
+of tool Z'' kind of message to this list, I can do that.  Up until
+now it hasn't been a real issue since I'm the only one who's been
+dorking with the configuration machinery.
+@end ignore
+
+@c @enumerate A
+@c @item
+Installare a partire dal sorgente @`e abbastanza facile.  @`E il modo con cui il
+manutentore ha lavorato per anni (e ancora lavora).
+Egli aveva @file{/usr/local/bin} all'inizio del suo @env{PATH} e dava i
+seguenti comandi:
+
+@example
+wget https://ftp.gnu.org/gnu/@var{package}/@var{package}-@var{x}.@var{y}.@var{z}.tar.gz
+tar -xpzvf @var{package}-@var{x}.@var{y}.@var{z}.tar.gz
+cd @var{package}-@var{x}.@var{y}.@var{z}
+./configure && make && make check
+make install    # come utente root
+@end example
+
+@quotation NOTA
+A causa degli URL di tipo @samp{https://}, pu@`o essere necessario
+specificare l'opzione @option{--no-check-certificate} a @command{wget}
+per poter scaricare il file.
+@end quotation
+
+@c @item
+@ignore
+These days the maintainer uses Ubuntu 12.04 which is medium current, but
+he is already doing the above for Automake, Autoconf, and @command{bison}.
+@end ignore
+
+@ignore
+(C. Rant: Recent Linux versions with GNOME 3 really suck. What
+    are all those people thinking?  Fedora 15 was such a bust it drove
+    me to Ubuntu, but Ubuntu 11.04 and 11.10 are totally unusable from
+    a UI perspective. Bleah.)
+@end ignore
+@c @end enumerate
+
+@ignore
+@item
+If someone still feels really strongly about all this, then perhaps they
+can have two branches, one for their development with just the clean
+changes, and one that is buildable (xgawk and xgawk-buildable, maybe).
+Or, as I suggested in another mail, make commits in pairs, the first with
+the "real" changes and the second with "everything else needed for
+ building".
+@end ignore
+@end enumerate
+
+La maggior parte del testo precedente fa parte di messaggi scritti
+originalmente dal manutentore agli altri sviluppatori @command{gawk}.
+Da uno degli sviluppatori @`e stata avanzata l'obiezione
+``@dots{} che chi scarica il sorgente da Git
+non @`e un utente finale''.
+
+Tuttavia, questo non @`e esatto.  Ci sono ``utenti avanzati di @command{awk}''
+che possono installare @command{gawk} (usando la formula canonica vista sopra)
+ma che non conoscono il linguaggio C.  Quindi, i rami pi@`u rilevanti
+dovrebbero essere sempre compilabili.
+
+@`E stato proposto poi di lanciare ogni notte uno @dfn{script} tramite il
+programma di utilit@`a @command{cron} per creare archivi in formato @command{tar}
+contenenti tutto ``il codice sorgente.''  Il problema in questo caso @`e che
+ci sono differenti alberi di sorgenti, che corrispondono ai vari rami!
+Quindi gli archivi notturni in questione non sono una risposta valida, anche
+per il fatto che il deposito Git pu@`o rimanere senza alcuna modifica
+significativa per settimane intere.
+
+Fortunatamente, il server Git pu@`o rispondere a questa esigenza.  Per ogni
+dato ramo chiamato @var{nome-ramo}, basta usare:
+
+@example
+wget https://git.savannah.gnu.org/cgit/gawk.git/snapshot/gawk-@var{nome-ramo}.tar.gz
+@end example
+
+@noindent
+per ottenere una copia utilizzabile del ramo in questione.
+
+@node Future estensioni
+@appendixsec Probabili estensioni future
+@ignore
+From emory!scalpel.netlabs.com!lwall Tue Oct 31 12:43:17 1995
+Return-Path: <emory!scalpel.netlabs.com!lwall>
+Message-Id: <9510311732.AA28472@scalpel.netlabs.com>
+To: arnold@skeeve.atl.ga.us (Arnold D. Robbins)
+Subject: Re: May I quote you?
+In-Reply-To: Your message of "Tue, 31 Oct 95 09:11:00 EST."
+             <m0tAHPQ-00014MC@skeeve.atl.ga.us>
+Date: Tue, 31 Oct 95 09:32:46 -0800
+From: Larry Wall <emory!scalpel.netlabs.com!lwall>
+
+: Greetings. I am working on the release of gawk 3.0. Part of it will be a
+: thoroughly updated manual. One of the sections deals with planned future
+: extensions and enhancements.  I have the following at the beginning
+: of it:
+:
+: @cindex PERL
+: @cindex Wall, Larry
+: @display
+: @i{AWK is a language similar to PERL, only considerably more elegant.} @*
+: Arnold Robbins
+: @sp 1
+: @i{Hey!} @*
+: Larry Wall
+: @end display
+:
+: Before I actually release this for publication, I wanted to get your
+: permission to quote you.  (Hopefully, in the spirit of much of GNU, the
+: implied humor is visible... :-)
+
+I think that would be fine.
+
+Larry
+@end ignore
+@cindex Perl
+@cindex Wall, Larry
+@cindex Robbins, Arnold
+@quotation
+@i{AWK @`e un linguaggio simile a PERL, solo che @`e notevolmente pi@`u elegante.}
+@author Arnold Robbins
+@end quotation
+
+@quotation
+@i{Hey!}
+@author Larry Wall
+@end quotation
+
+Il file @file{TODO} nel ramo @code{master} del deposito Git di @command{gawk}
+contiene un elenco di possibili futuri miglioramenti.  Alcuni di questi
+riguardano il codice sorgente, e altri possibili nuove funzionalit@`a.
+Consultare quel file per esaminare la lista.
+@xref{Aggiunte},
+se si @`e interessati a intraprendere qualcuno dei progetti col@`a elencati.
+
+@node Limitazioni dell'implementazione
+@appendixsec Alcune limitazioni dell'implementazione
+
+La tabella seguente specifica i limiti di @command{gawk} in un sistema di
+tipo Unix (sebbene anche tra questi ci potrebbero essere variazioni).  Altri
+sistemi operativi possono avere limiti differenti.
+
+@multitable @columnfractions .40 .60
+@headitem Caratteristica @tab Limiti
+@item Caratteri in una classe di caratteri @tab 2^(numero di bit per byte)
+@item Lunghezza di un record in input @tab @code{MAX_INT}
+@item Lunghezza di un record in output @tab Illimitata
+@item Lunghezza di una riga di codice sorgente @tab Illimitata
+@item Numero di campi in un record @tab @code{MAX_LONG}
+@item Numero di ridirezioni di file @tab Illimitata
+@item Numero di record in input in un singolo file @tab @code{MAX_LONG}
+@item Numero totale di record in input @tab @code{MAX_LONG}
+@item Numero di ridirezioni via @dfn{pipe} @tab min(numero processi per utente, numero di file aperti)
+@item Valori numerici @tab Numeri in virgola mobile in doppia precisione (se non si usa la funzionalit@`a MPFR)
+@item Dimensione di un campo @tab @code{MAX_INT}
+@item Dimensione di una stringa letterale @tab @code{MAX_INT}
+@item Dimensione di una stringa di @dfn{printf} @tab @code{MAX_INT}
+@end multitable
+
+@node Progetto delle estensioni
+@appendixsec Note di progetto dell'estensione API
+
+Questa @value{SECTION} documenta l'architettura dell'estensione API,
+inclusa una trattazione sommaria della progettazione e dei problemi che
+andavano risolti.
+
+La prima versione delle estensioni per @command{gawk} @`e stata sviluppata
+a met@`a degli anni '90, e distribuita con la versione 3.1 di @command{gawk},
+verso la fine degli anni '90.
+Il meccanismo e l'architettura sono rimasti gli stessi per quasi 15 anni,
+fino al 2012.
+
+Il vecchio meccanismo delle estensioni usava tipi di dati e funzioni dello
+stesso @command{gawk}, con un ``abile trucco'' per installare le funzioni
+di estensione.
+
+La distribuzione @command{gawk} conteneva alcuni esempi di estensioni, solo
+poche delle quali erano realmente utili.  Tuttavia era chiaro fin da
+principio che il meccanismo di estensione era un'aggiunta improvvisata, e
+non era realmente ben concepito.
+
+@menu
+* Problemi con le vecchie estensioni::  Problemi col vecchio meccanismo.
+* Obiettivi delle estensioni::          Obiettivi del nuovo meccanismo.
+* Altre scelte progettuali per le estensioni:: Qualche altra scelta progettuale.
+* Futuri sviluppi delle estensioni::    Possibilit@`a di crescita futura.
+@end menu
+
+@node Problemi con le vecchie estensioni
+@appendixsubsec Problemi con le vecchie estensioni
+
+Il vecchio meccanismo delle estensioni presentava parecchi problemi:
+
+@itemize @value{BULLET}
+@item
+Dipendeva eccessivamente dalla struttura interna di @command{gawk}.  Ogni volta
+che la struttura @code{NODE}@footnote{Una struttura di dati fondamentale
+all'interno di @command{gawk}.} veniva modificata, ogni estensione doveva
+essere ricompilata.  Inoltre, la scrittura di estensioni richiedeva una
+certa familiarit@`a con le funzioni interne di @command{gawk}.  Esisteva
+un po' di documentazione in questo @value{DOCUMENT}, ma era ridotta al minimo.
+
+@item
+Per poter utilizzare servizi di @command{gawk} da un'estensione era necessario
+disporre di funzionalit@`a del @dfn{linker}
+normalmente disponibili in ambiente di tipo Unix, ma non implementate
+nei sistemi MS-Windows; chi voleva utilizzare estensioni in
+MS-Windows doveva aggiungerle al modulo eseguibile di @command{gawk},
+anche se MS-Windows supporta il caricamento dinamico di oggetti condivisi.
+
+@item
+L'API di tanto in tanto veniva modificata, in parallelo ai cambiamenti di
+@command{gawk}; nessuna compatibilit@`a tra le versioni @`e stata mai prevista o
+resa disponibile.
+@end itemize
+
+Nonostante questi inconvenienti, gli sviluppatori del progetto @command{xgawk}
+si basarono su @command{gawk} per sviluppare parecchie estensioni
+significative.  Inoltre, migliorarono le capacit@`a, in @command{gawk}, di
+includere file e di accedere a oggetti condivisi.
+
+Una nuova API @`e rimasta un desiderio per lungo tempo, ma solo nel 2012
+il manutentore di @command{gawk} e gli sviluppatori di @command{xgawk}
+iniziarono finalmente a lavorare insieme.  Ulteriori informazioni riguardanti
+il progetto @command{xgawk} sono forniti nella @ref{gawkextlib}.
+
+@node Obiettivi delle estensioni
+@appendixsubsec Obiettivi per un nuovo meccanismo
+
+Alcuni obiettivi per la nuova API sono:
+
+@itemize @value{BULLET}
+@item
+L'API dovrebbe essere indipendente dalla struttura interna di @command{gawk}.
+Le modifiche alla struttura interna di @command{gawk} dovrebbero essere
+irrilevanti per chi scrive una funzione di estensione.
+
+@item
+L'API dovrebbe consentire una compatibilit@`a @emph{binaria} [ossia a livello
+di codice eseguibile, e non solo a livello di codice sorgente] tra diverse
+versioni di @command{gawk}, se la stessa API rimane invariata.
+
+@item
+L'API dovrebbe consentire che le estensioni scritte in C o C++ abbiano
+all'incirca la stessa ``struttura'', per il codice awk,
+di quella che hanno le funzioni di @command{awk}.  Questo vuol dire che le
+estensioni dovrebbero avere:
+
+@itemize @value{MINUS}
+@item
+La capacit@`a di accedere ai parametri delle funzioni.
+
+@item
+La capacit@`a di trasformare un parametro indefinito in un vettore
+(chiamata per riferimento [@dfn{by reference}]).
+
+@item
+La capacit@`a di creare, leggere e aggiornare variabili globali.
+
+@item
+Un accesso facile a tutti gli elementi di un vettore simultaneamente
+(``appiattimento del vettore'') in modo da poter visitare tutti gli elementi
+del vettore in una maniera semplice per un programma scritto in C.
+
+@item
+La capacit@`a di creare vettori (compresi i veri "vettori di vettori" di
+@command{gawk}).
+@end itemize
+@end itemize
+
+Alcuni ulteriori obiettivi rilevanti sono:
+
+@itemize @value{BULLET}
+@item
+L'API dovrebbe usare solo funzionalit@`a disponibili nella specifica ISO C 90, in
+modo da consentire estensioni scritte con una vasta gamma di compilatori C e
+C++.  L'intestazione dovrebbe includere le appropriate direttive
+@samp{#ifdef __cplusplus} e @samp{extern "C"}, in modo da poter utilizzare un
+compilatore C++.  (Se si usa C++, il sistema operativo in uso dev'essere in
+grado di invocare dei costruttori e dei distruttori, poich@'e @command{gawk} @`e un
+programma scritto in C.  Al momento in cui queste note sono scritte, la cosa
+non @`e stata verificata).
+
+@item
+Il meccanismo API non dovrebbe aver bisogno di accedere ai simboli di
+@command{gawk}@footnote{I @dfn{simboli} sono le variabili e le funzioni
+definite all'interno di @command{gawk}.  Accedere a questi simboli da parte
+di codice esterno a @command{gawk} caricato dinamicamente al momento
+dell'esecuzione @`e problematico in ambiente MS-Windows.} da parte del
+@dfn{linker} statico, usato in fase di compilazione, o di quello dinamico,
+in modo da rendere possibile la creazione di estensioni che funzionino anche
+in ambiente MS-Windows.
+@end itemize
+
+In fase di sviluppo, @`e apparso evidente che dovevano essere disponibili alle
+estensioni anche altre funzionalit@`a, che sono state
+successivamente implementate:
+
+@itemize @value{BULLET}
+@item
+Le estensioni dovrebbero essere in grado di agganciarsi al meccanismo di
+ridirezione dell'I/O di @command{gawk}.  In particolare, gli sviluppatori di
+@command{xgawk} hanno programmato un cosiddetto ``gancio aperto'' (@dfn{open
+hook}) per gestire autonomamente la lettura dei record.  In fase di sviluppo,
+questo meccanismo @`e stato generalizzato, per consentire alle estensioni di
+agganciarsi sia all'elaborazione dell'input, che a quella dell'output, nonch@'e
+all'I/O bidirezionale.
+
+@item
+Un'estensione dovrebbe poter rendere disponibile una funzione di ``call back''
+(richiamo) per effettuare operazioni di pulizia all'uscita di @command{gawk}.
+
+@item
+Un'estensione dovrebbe poter rendere disponibile una stringa di versione
+cos@`{@dotless{i}} che l'opzione @option{--version}
+di @command{gawk} possa informare anche sulle versioni delle estensioni.
+@end itemize
+
+Il vincolo di evitare di accedere ai simboli di @command{gawk} pu@`o parere a
+prima vista piuttosto difficile da rispettare.
+
+Un tipo di architettura, apparentemente usato da Perl e Ruby e forse da altri
+programmi, potrebbe consistere nel mettere il codice principale di
+@command{gawk} in una libreria, limitando il programma di utilit@`a
+@command{gawk} a una piccola funzione @code{main()} in C che richiamerebbe
+dinamicamente la libreria.
+
+Questo inverte i ruoli del programma principale e della sua estensione, e
+complica sia la compilazione che l'installazione, trasformando la semplice
+copia del programma eseguibile @command{gawk} da un sistema all'altro (o da una
+posizione all'altra all'interno dello stesso sistema) in un'operazione ad alto
+rischio.
+
+Pat Rankin ha suggerito la soluzione che @`e stata adottata.
+@xref{Panoramica sul meccanismo delle estensioni}, per maggiori dettagli.
+
+@node Altre scelte progettuali per le estensioni
+@appendixsubsec Altre scelte progettuali
+
+Per una scelta progettuale arbitraria, le estensioni possono accedere ai valori
+delle variabili e dei vettori predefiniti (come @code{ARGV} e @code{FS}), ma
+non possono modificarli, con la sola eccezione di @code{PROCINFO}.
+
+Il motivo di questa scelta @`e di impedire a una funzione di estensione di
+alterare il flusso di un programma @command{awk} togliendogli il controllo.
+Mentre una vera funzione di @command{awk} pu@`o fare quel che vuole, a
+discrezione del programmatore, una funzione di estensione dovrebbe fornire un
+servizio, o rendere disponibile un'API C da utilizzare all'interno di
+@command{awk}, senza interferire con le variabili @code{FS} o @code{ARGC} e
+@code{ARGV}.
+
+Inoltre, diverrebbe facile avviarsi su un sentiero scivoloso.  Quante
+funzionalit@`a di @command{gawk} dovrebbero essere disponibili alle estensioni?
+Devono poter usare @code{getline}?  Oppure richiamare @code{gsub()} o compilare
+espressioni regolari?  Oppure richiamare funzioni interne di @command{awk}?
+(@emph{Questo} potrebbe creare molta confusione.)
+
+Per evitare questi problemi, gli sviluppatori di @command{gawk} hanno scelto di
+iniziare con le funzionalit@`a pi@`u semplici e di base, che sono comunque
+veramente utili.
+
+Sebbene @command{gawk} consenta cose interessanti come l'MPFR,
+e vettori indicizzati internamente con numeri interi,
+un'altra decisione @`e stata quella di non rendere disponibili all'API queste
+funzionalit@`a, per amor di semplicit@`a e per restare fedeli alla tradizionale
+semantica di @command{awk}.  (In effetti, i vettori indicizzati internamente
+con numeri interi sono talmente trasparenti che non sono neppure documentati!)
+
+In pi@`u, tutte le funzioni nell'API controllano che i puntatori ai parametri
+passati loro in input non siano @code{NULL}.  Se lo sono, viene emesso un
+messaggio di errore.  (@`E bene che il codice di estensione verifichi
+che i puntatori ricevuti da @command{gawk} non siano @code{NULL}.  Ci@`o non
+dovrebbe succedere, ma gli sviluppatori di @command{gawk} sono solo degli
+esseri umani, e capita anche a loro di commettere degli errori, di tanto in
+tanto.)
+
+Col tempo, l'API si svilupper@`a certamente; gli sviluppatori di @command{gawk}
+si aspettano che questo avvenga in base alle necessit@`a degli utenti.  Per ora,
+l'API disponbile sembra fornire un insieme di funzionalit@`a minimo, eppure
+potente, per creare estensioni.
+
+@node Futuri sviluppi delle estensioni
+@appendixsubsec Possibilit@`a di sviluppo futuro
+
+L'API pu@`o ancora essere ampliata, in due modi:
+
+@itemize @value{BULLET}
+@item
+@command{gawk} passa un ``identificativo di estensione'' all'estensione in fase
+di caricamente dell'estensione.  L'estensione a sua volta restituisce questo
+identificativo a @command{gawk} a ogni chiamata di funzione.  Questo meccanismo
+consente a @command{gawk} di identificare l'estensione che lo chiama, se la
+cosa dovesse risultare necessaria.
+
+@item
+Analogamente, l'estensione passa uno ``spazio-dei-nomi'' a @command{gawk}
+in fase di registrazione di ogni funzione estesa.  Questo @`e fatto in vista di
+un possibile futuro meccanismo per raggruppare funzioni di estensione, e per
+evitare in questo modo possibili conflitti nei nomi di funzione.
+@end itemize
+
+Naturalmente, al momento in cui queste righe sono state scritte, nessuna
+decisione @`e stata presa riguardo ai punti sopra descritti.
+
+@node Sommario delle note
+@appendixsec Sommario
+
+@itemize @value{BULLET}
+@item
+Le estensioni di @command{gawk} possono essere disabilitata sia con
+l'opzione @option{--traditional} che con l'opzione @option{--posix}.
+L'opzione @option{--parsedebug} @`e disponibile se @command{gawk} @`e stato
+compilato con @samp{-DDEBUG}.
+
+@item
+Il codice sorgente di @command{gawk} @`e conservato in un deposito Git
+pubblicamente accessibile.  Tutti possono scaricarlo e visualizzare il
+codice sorgente.
+
+@item
+I contributi a @command{gawk} sono benvenuti. Seguire le istruzioni
+delineate in questo @value{CHAPTER} render@`a pi@`u agevole integrare
+i contributi degli utenti nel codice principale.
+Questo vale sia per il contributo di nuove funzionalit@`a che per il
+@dfn{porting} a ulteriori sistemi operativi.
+
+@item
+@command{gawk} ha alcuni limiti: generalmente quelli imposti
+dall'architettura hardware della macchina.
+
+@item
+La progettazione dell'estensione API @`e volta a risolvere alcuni problemi
+riscontrati nel precedente meccanismo di estensione, ad abilitare
+funzionalit@`a richieste dal progetto @code{xgawk}, e a fornire una
+compatibilit@`a binaria in futuro.
+
+@item
+Il precedente meccanismo di estensione non @`e pi@`u supportato
+ed @`e stato rimosso dal codice sorgente nella
+@value{PVERSION} 4.2.
+
+@end itemize
+
+
+@node Concetti fondamentali
+@appendix Concetti fondamentali di programmazione
+@cindex programmazione, concetti di
+@cindex programmazione, concetti di
+
+Quest'@value{APPENDIX} si propone di definire alcuni dei concetti
+e termini fondamentali usati nel resto di questo @value{DOCUMENT}.
+Poich@'e questo @value{DOCUMENT} @`e dedicato ad @command{awk},
+e non riguarda la programmazione al computer in generale, la trattazione
+@`e necessariamente piuttosto generica e semplificata.
+(Se serve qualcosa di pi@`u approfondito, ci sono molti
+altri testi introduttivi che si possono consultare.)
+
+@menu
+* Fondamenti ad alto livello::  Una visione dall'alto.
+* Fondamenti sui tipi di dati:: Una velocissima introduzione ai tipi di dati.
+@end menu
+
+@node Fondamenti ad alto livello
+@appendixsec Quel che fa un programma
+
+@cindex elaborazione dati
+Al livello pi@`u fondamentale, il compito di un programma @`e di elaborare
+alcuni dati in input e produrre dei risultati.
+@ifnotdocbook
+Si veda la @ref{figura-generica-flusso}.
+@end ifnotdocbook
+@ifdocbook
+Si veda la @inlineraw{docbook, <xref linkend="figura-generica-flusso"/>}.
+@end ifdocbook
+
+@ifnotdocbook
+@float Figura,figura-generica-flusso
+@caption{Flusso generico di un programma}
+@ifclear SMALLPRINT
+@center @image{programma-generico, , , Flusso generico di un programma}
+@end ifclear
+@ifset SMALLPRINT
+@center @image{programma-generico, 11cm, , Flusso generico di un programma}
+@end ifset
+@end float
+@end ifnotdocbook
+
+@docbook
+<figure id="figura-generica-flusso" float="0">
+<title>Flusso generico di un programma</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="programma-generico.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+@cindex programmi compilati
+@cindex programmi interpretati
+Il ``programma'' nella figura pu@`o essere sia un programma
+compilato@footnote{I programmi compilati sono normalmente scritti
+in linguaggi di programmazione di livello pi@`u basso, come C, C++, o Ada,
+e quindi tradotti, o @dfn{compilati}, in una forma che
+il computer pu@`o eseguire direttamente.}
+(come @command{ls}),
+sia un programma @dfn{interpretato}.  In quest'ultimo caso, un programma
+direttamente eseguibile dal computer, come @command{awk}, legge il
+programma, e quindi usa le istruzioni in esso contenute per elaborare i dati.
+
+@cindex programmazione, passi fondamentali
+Quando si scrive un programma, esso @`e composto normalmente
+dai seguenti insiemi di istruzioni di base,
+@ifnotdocbook
+come si vede nella @ref{figura-flusso-elaborazione}:
+@end ifnotdocbook
+@ifdocbook
+come si vede nella @inlineraw{docbook, <xref linkend="figura-flusso-elaborazione"/>}:
+@end ifdocbook
+
+@ifnotdocbook
+@float Figura,figura-flusso-elaborazione
+@caption{Fasi di un programma generico}
+@ifclear SMALLPRINT
+@center @image{flusso-elaborazione, , , Fasi di un programma generico}
+@end ifclear
+@ifset SMALLPRINT
+@center @image{flusso-elaborazione, 11cm , , Fasi di un programma generico}
+@end ifset
+@end float
+@end ifnotdocbook
+
+@docbook
+<figura id="figura-flusso-elaborazione" float="0">
+<title>Fasi di un programma generico</title>
+<mediaobject>
+<imageobject role="web"><imagedata fileref="flusso-elaborazione.png" format="PNG"/></imageobject>
+</mediaobject>
+</figure>
+@end docbook
+
+@table @asis
+@item Inizializzazione
+Queste sono le cose da fare prima di iniziare la reale elaborazione dei
+dati, per esempio controllare gli argomenti con cui @`e stato invocato il
+programma, inizializzare dei dati di cui si potr@`a aver bisogno per la
+successiva elaborazione, e cos@`{@dotless{i}} via.
+Questa fase corrisponde alla regola @code{BEGIN} di @command{awk}
+(@pxref{BEGIN/END}).
+
+Nella preparazione di una torta, questa fase corrisponde a quella di
+tirar fuori tutti i contenitori in cui mischiare gli ingredienti, e la
+teglia in cui cuocerla, e nell'assicurarsi di avere a disposizione tutti gli
+ingredienti necessari.
+
+@item Elaborazione
+Questa fase @`e quella in cui si svolge il lavoro vero e proprio.  Il programma
+legge i dati, raggruppati in ``pezzi logici'', e li elabora secondo necessit@`a.
+
+In quasi tutti i linguaggi di programmazione, la lettura dei dati va gestita
+manualmente, controllando dopo ogni lettura se @`e
+rimasto ancora qualcosa d'altro da leggere.  Il paradigma @dfn{criterio di
+ricerca--azione} di @command{awk}
+@iftex
+(@pxrefil{Per iniziare})
+@end iftex
+@ifnottex
+(@pxref{Per iniziare})
+@end ifnottex
+gestisce automaticamente la parte di lettura dati.
+
+Nella preparazione di una torta, l'elaborazione corrisponde all'attivit@`a
+vera e propria: rompere le uova, mescolare la farina, l'acqua e gli altri
+ingredienti, e quindi mettere la torta a cuocere nel forno.
+
+@item Pulizia
+Una volta elaborati tutti i dati, ci sono attivit@`a da svolgere prima di aver
+finito.  Questa fase corrisponde alla regola @code{END} di @command{awk}.
+(@pxref{BEGIN/END}).
+
+Dopo che la torta @`e stata tirata fuori dal forno, va fatta raffreddare e
+avvolta in una pellicola trasparente per evitare che qualcuno la assaggi,
+e inoltre vanno lavati i contenitori e le posate.
+@end table
+
+@cindex Algoritmi
+Un @dfn{algoritmo} @`e la descrizione dettagliata della procedura necessaria per
+svolgere un compito o per elaborare dati.  Lo si pu@`o paragonare alla ricetta
+per preparare una torta.  I programmi sono il modo con cui un
+algoritmo viene eseguito da un computer.
+Spesso @`e compito del programmatore sia sviluppare un algoritmo, sia
+programmarlo.
+
+@cindex record
+@cindex campi
+I ``pezzi logici'' nominati precedentemente sono chiamati @dfn{record}
+(registrazioni), in analogia con le registrazioni del personale di una ditta,
+degli studenti di una scuola, o dei pazienti di un dottore.
+Ogni record @`e composto di molte parti, per esempio nome, cognome, data di
+nascita, indirizzo, e cos@`{@dotless{i}} via.  Le parti di cui @`e composto un record sono
+chiamate @dfn{campi} del record.
+
+L'atto di leggere i dati @`e noto come @dfn{input}, e quello di generare
+risultati @`e, come facilmente prevedibile, chiamato @dfn{output}.  Spesso i due
+sono riuniti sotto il nome di ``input/output'' e, ancor pi@`u spesso, con
+l'abbreviazione ``I/O''.  (In inglese ``input'' e ``output'' sono spesso usati
+come verbi, nel gergo informatico, al posto di leggere e scrivere.)
+
+@cindex guidato-dai-dati, linguaggio di programmazione
+@cindex linguaggio di programmazione, guidato dai dati
+@command{awk} gestisce la lettura dei dati, come anche la divisione in
+record e campi.  Lo scopo del programma dell'utente @`e di dire ad @command{awk}
+cosa fare con i dati.  Questo vien fatto descrivendo @dfn{modelli} da
+ricercare nei dati e @dfn{azioni} da eseguire qualora si siano trovati questi
+modelli.  Questa caratteristica dei programmi @command{awk}, di essere
+@dfn{guidati-dai-dati}, di solito li rende pi@`u facili sia da scrivere che da
+leggere.
+
+@node Fondamenti sui tipi di dati
+@appendixsec Valore dei dati in un computer
+
+@cindex variabili
+In un programma si tiene traccia di informazioni e valori in contenitori
+chiamati @dfn{variabili}.  Una variabile @`e solo un nome per designare un certo
+valore, come @code{nome}, @code{cognome}, @code{indirizzo}, e cos@`{@dotless{i}} via.
+@command{awk} ha molte variabili predefinite, e ha dei nomi speciali per
+designare il record in input corrente e i campi che compongono il record
+stesso.  Si possono inoltre raggruppare molti valori associati tra di loro
+sotto un unico nome, utilizzando un vettore.
+
+@cindex valori numerici
+@cindex valori tipo stringa
+@cindex valori scalari
+@cindex scalari, valori
+I dati, in particolare in @command{awk}, possono avere valori numerici, come 42
+o 3.1415927, o avere come valore delle stringhe.  Un valore di tipo stringa @`e
+essenzialmente qualsiasi cosa che non sia un numero, per esempio un nome.  Le
+stringhe sono talora chiamate @dfn{dati di tipo carattere}, poich@'e memorizzano
+i singoli caratteri che le formano.  Le singole variabili, come pure le
+variabili numeriche e di tipo stringa, sono definite come valori
+@dfn{scalari}.  Raggruppamenti di valori, come i vettori, non sono scalari.
+
+@iftex
+La
+@end iftex
+@ref{Aritmetica del computer}, ha fornito un'introduzione di base ai tipi
+numerici (interi e in virgola mobile) e a come questi sono usati in un computer.
+Si consiglia di rileggere quelle informazioni, comprese le numerose avvertente
+l@`a esposte.
+
+@cindex stringa nulla
+Mentre @`e probabile che ci si sia abituati all'idea di un numero senza un valore
+(cio@`e, allo zero), richiede un po' pi@`u di riflessione abituarsi all'idea di
+dati di tipo carattere a lunghezza zero.  Nonostante ci@`o, questo tipo di dato
+esiste.  @`E chiamato @dfn{stringa nulla}.  La stringa nulla @`e un dato di tipo
+carattere che non ha un valore.  In altre parole, @`e vuoto.  Si scrive cos@`{@dotless{i}} nei
+programmi @command{awk}: @code{""}.
+
+Gli esseri umani sono abituati a usare il sistema decimale, cio@`e a base 10.
+In base 10, i numeri vanno da 0 a 9, e poi ``vengono riportati'' nella
+colonna
+@iftex
+colonna successiva.
+(Chi si ricorda la scuola elementare? @math{42 = 4 volte 10 + 2}.)
+@end iftex
+@ifnottex
+colonna successiva.
+(Chi si ricorda la scuola elementare? 42 = 4 x 10 + 2.)
+@end ifnottex
+
+Ma esistono anche altre basi per i numeri.  I computer normalmente usano
+la base 2 o @dfn{binaria}, la base 8 o @dfn{ottale}, e la base 16 o
+@dfn{esadecimale}.  Nella numerazione binaria, ogni colonna rappresenta il
+doppio del valore della colonna alla sua destra.  Ogni colonna pu@`o contenere
+solo uno 0 o un 1.
+@iftex
+Quindi, il numero binario 1010 rappresenta @math{(1 volta 8) + (0 volte 4)
++ (1 volta 2) + (0 volte 1)}, ossia il numero decimale 10.
+@end iftex
+@ifnottex
+Quindi, il numero binario 1010 rappresenta (1 x 8) + (0 x 4)
++ (1 x 2) + (0 x 1), ossia il numero decimale 10.
+@end ifnottex
+Le numerazioni ottale ed
+esadecimale sono trattate pi@`u ampiamente
+@ifnottex
+in
+@end ifnottex
+@iftex
+nella
+@end iftex
+@ref{Numeri non-decimali}.
+
+Al livello pi@`u basso possibile, i computer memorizzano i valori come gruppi di
+cifre binarie, o @dfn{bit}.  I computer moderni raggruppano i bit in gruppi di
+otto, detti @dfn{byte}.  Applicazioni avanzate talora hanno necessit@`a di
+manipolare i bit direttamente, e @command{gawk} @`e dotato di apposite funzioni.
+
+I programmi sono scritti nei linguaggi di programmazione.  Esistono centinaia,
+se non migliaia, di linguaggi di programmazione.  Uno dei pi@`u diffusi @`e il
+linguaggio di programmazione C.  Il linguaggio C ha esercitato un'influsso
+molto forte nella progettazione del linguaggio @command{awk}.
+
+@cindex Kernighan, Brian
+@cindex Ritchie, Dennis
+Ci sono state parecchie versioni di C.  La prima @`e spesso designata come
+``K&R'' C, dalle iniziali di Brian Kernighan e Dennis Ritchie,
+gli autori del primo libro sul C.  (Dennis Ritchie ha creato il linguaggio,
+e Brian Kernighan @`e stato uno dei creatori di @command{awk}.)
+
+A met@`a degli anni '80 @`e iniziato uno sforzo rivolto a produrre uno
+standard internazionale per il C.  Questo lavoro ha raggiunto un punto di
+arrivo nel 1989 con la produzione dello standard ANSI per il C.
+Questo standard @`e diventato uno standard ISO nel 1990.
+Nel 1999, uno standard ISO C revisionato @`e stato approvato e pubblicato.
+Dove @`e opportuno, POSIX @command{awk} @`e compatible con lo standard
+ISO C del 1999.
+
+
+@node Glossario
+@unnumbered Glossario
+
+@table @asis
+@item Abbraccio mortale
+La situazione in cui due processi che comunicano tra loro sono entrambi bloccati, in
+attesa che l'altro processo faccia qualcosa.
+
+@cindex Ada, linguaggio di programmazione
+@cindex linguaggio di programmazione, Ada
+@item Ada
+Un linguaggio di programmazione originalmente definito dal Department of
+Defense U.S.A.@: per la programmazione integrata. @`E stato progettato per
+favorire dei buoni metodi da seguire nell'ingegneria del software.
+
+@item Ambiente
+Si veda ``Variabili d'ambiente''.
+
+@item @`Ancora
+I metacaratteri @dfn{regexp} @samp{^} e @samp{$}, che richiedono che la
+corrispondenza che si sta cercando si trovi all'inizio o alla fine di una
+stringa, rispettivamente.
+
+@cindex angolo buio
+@item Angolo buio
+Un'area del linguaggio le cui specifiche spesso non erano (o ancora non
+sono) chiare, col risultato di ottenere un comportamente inatteso o non
+desiderabile.
+Tali aree sono segnalate in questo @value{DOCUMENT} con
+@iftex
+il disegno di una torcia a margine
+@end iftex
+@ifnottex
+``(a.b.)'' nel testo
+@end ifnottex
+e sono riportate nell'indice analitico sotto la voce ``angolo buio''.
+
+@cindex ANSI
+@item ANSI
+L'American National Standards Institute.  Questo ente produce
+parecchi standard, e tra questi gli standard per i linguaggi di
+programmazione C e C++.
+Questi standard spesso diventano anche internazionali. Si veda anche
+``ISO''.
+
+@item Argomento
+Un argomento pu@`o essere due cose differenti.  Pu@`o essere un'opzione o un
+@value{FN} passato a un comando mentre lo si invoca dalla riga dei comandi,
+oppure pu@`o essere qualcosa passato a una @dfn{funzione} all'interno di un
+programma, per esempio all'interno di @command{awk}.
+
+In quest'ultimo caso, un argomento pu@`o essere passato a una funzione in
+due modi.  Nel primo modo @`e passato come valore alla funzione chiamata,
+ossia una copia del valore della variabile @`e reso disponibile alla funzione
+chiamata, ma la variabile originale non pu@`o essere modificata dalla
+funzione stessa.  Nel secondo modo l'argomento @`e passato per riferimento,
+ossia un puntatore alla variabile in questione @`e passato alla funzione, che
+pu@`o quindi modificarla direttamente.  In @command{awk} le variabili scalari
+sono passate per valore, e i vettori sono passati per riferimento.
+Si veda ``Passaggio per valore/riferimento''.
+
+@item Arrotondamento
+Arrotondare il risultato di un'operazione aritmetica pu@`o essere difficile.
+C'@`e pi@`u di un modo di arrotondare, e in @command{gawk} @`e possibile scegliere
+quale metodo dovrebbe essere usato all'interno di un programma.
+@xref{Impostare modo di arrotondare}.
+
+@item Assegnamento
+Un'espressione @command{awk} che cambia il valore di qualche variabile o
+dato oggetto di @command{awk}.  Un oggetto a cui si pu@`o assegnare un valore
+@`e detto un @dfn{lvalue}.  I valori
+assegnati sono chiamati @dfn{rvalue}.
+@xref{Operatori di assegnamento}.
+
+@cindex Spencer, Henry
+@cindex @command{sed}, programma di utilit@`a
+@cindex programma di utilit@`a @command{sed}
+@cindex incredibile assembler (@command{aaa}) scritto in @command{awk}
+@item Assembler incredibilmente scritto in @command{awk}
+Henry Spencer dell'Universit@`a di Toronto ha scritto un assembler adatto a
+molti diversi hardware, usando solo @dfn{script} @command{sed} e
+@command{awk}.  @`E lungo migliaia di righe, e include
+la descrizione dell'hardware di
+numerosi micro-computer a 8 bit.  @`E un
+buon esempio di programma per cui sarebbe stato
+meglio utilizzare un altro linguaggio.
+@c Si pu@`o scaricare da @uref{http://awk.info/?awk100/aaa}.
+
+@item Asserzione
+Un'istruzione in un programma che afferma che una condizione @`e verificata in
+un dato punto di un programma.
+Utile per ragionare su come si suppone funzioni un programma.
+
+@item Azione
+Una serie di istruzioni @command{awk} associate a una regola.  Se
+l'espressione di ricerca della regola individua un record in input,
+@command{awk} esegue su quel record l'azione relativa.  Le azioni sono
+sempre racchiuse tra parentesi graffe.
+(@xref{Panoramica sulle azioni}).
+
+@item Bash
+La versione GNU della shell standard
+@ifnotinfo
+(il @b{B}ourne-@b{A}gain @b{SH}ell).
+@end ifnotinfo
+@ifinfo
+(il Bourne-Again SHell).
+@end ifinfo
+Si veda anche ``Bourne Shell''.
+
+@item Binario
+Notazione a base due, che usa le cifre @code{0}--@code{1}. Poich@'e
+i circuiti elettronici funzionano ``naturalmente'' in base 2
+(basta pensare a Off/On), ogni cosa all'interno di un computer @`e
+calcolata usando la base 2. Ciascuna cifra rappresenta la presenza
+(o l'assenza) di una potenza di 2 ed @`e chiamata un @dfn{bit}.
+Cos@`{@dotless{i}}, per esempio, il numero in base due @code{10101} rappresenta il
+numero in base decimale 21,
+@iftex
+(@math{(1 volta 16) + (1 volta 4) + (1 volta 1)}).
+@end iftex
+@ifnottex
+((1 x 16) + (1 x 4) + (1 x 1)).
+@end ifnottex
+
+Poich@'e i numeri in base due diventano rapidamente molto lunghi
+sia da leggere che da scrivere, normalmente li si unisce a gruppi di tre
+(ossia, sono visti come numeri ottali) o a gruppi di quattro (ossia, sono
+visti come numeri esadecimali).  Non c'@`e un modo diretto per inserire
+numeri a base due in un programma C. Se necessario, tali numeri vengono
+solitamente inseriti come numeri ottali o esadecimali.
+Il numero di cifre in base due contenuto nei registri usati per
+rappresentare i numeri interi all'interno dei computer @`e un'indicazione
+approssimativa della potenza di calcolo del computer stesso.  La maggior
+parte dei computer oggi usa 64 bit per rappresentare i numeri interi nei
+registri di calcolo, ma registri a 32 bit, 16 bit e 8 bit sono stati
+largamente in uso in passato.
+@xref{Numeri non-decimali}.
+
+@cindex McIlroy, Doug
+@cindex biscotto della fortuna
+@item Biscotto della fortuna
+Una particolare perla di saggezza, segno, detto o ricordo
+prodotto da (o presentato a) un programma. (Con vivi ringraziamenti al Prof.
+Doug McIlroy).
+@ignore
+From: Doug McIlroy <doug@cs.dartmouth.edu>
+Date: Sat, 13 Oct 2012 19:55:25 -0400
+To: arnold@skeeve.com
+Subject: Re: origin of the term "cookie"?
+
+I believe the term "cookie", for a more or less inscrutable
+saying or crumb of information, was injected into Unix
+jargon by Bob Morris, who used the word quite frequently.
+It had no fixed meaning as it now does in browsers.
+
+The word had been around long before it was recognized in
+the 8th edition glossary (earlier editions had no glossary):
+
+cookie   a peculiar goodie, token, saying or remembrance
+returned by or presented to a program. [I would say that
+"returned by" would better read "produced by", and assume
+responsibility for the inexactitude.]
+
+Doug McIlroy
+
+From: Doug McIlroy <doug@cs.dartmouth.edu>
+Date: Sun, 14 Oct 2012 10:08:43 -0400
+To: arnold@skeeve.com
+Subject: Re: origin of the term "cookie"?
+
+> Can I forward your email to Eric Raymond, for possible addition to the
+> Jargon File?
+
+Sure. I might add that I don't know how "cookie" entered Morris's
+vocabulary. Certainly "values of beta give rise to dom!" (see google)
+was an early, if not the earliest Unix cookie.  The fact that it was
+found lying around on a model 37 teletype (which had Greek beta in
+its type box) suggests that maybe it was seen to be like milk and
+cookies laid out for Santa Claus. Morris was wont to make such
+connections.
+
+Doug
+@end ignore
+
+@item Bit
+Abbreviazione di ``Binary Digit'' [cifra binaria].
+Tutti i valori nella memoria di un computer sono rappresentati nella forma di
+cifre binarie: valori che sono zero o uno.
+Gruppi di bit possono essere interpretati differentemente---come numeri
+interi, numeri in virgola mobile, dati di tipo carattere, indirizzi di altri
+oggetti contenuti in memoria, o altri dati ancora.
+@command{awk} permette di lavorare con numeri in virgola mobile e stringhe.
+@command{gawk} permette di manipolare bit con le funzioni predefinite
+descritte
+@ifnottex
+in
+@end ifnottex
+@iftex
+nella
+@end iftex
+@ref{Funzioni a livello di bit}.
+
+I computer sono spesso definiti dal numero di bit che usano per rappresentare
+valori interi.  Molti sistemi sono a 32-bit, ma i sistemi a 64-bit sono sempre
+pi@`u numerosi, mentre i sistemi a 16-bit [e quelli a 8-bit] sono praticamente
+scomparsi.
+
+@item Bourne Shell
+La shell standard (@file{/bin/sh}) in Unix e nei sistemi derivati da Unix,
+Originariamente scritto da Steven R.@: Bourne dei Bell Laboratories.
+Molte shell (Bash, @command{ksh}, @command{pdksh}, @command{zsh}) sono
+generalmente compatibili con la Bourne shell, anche quando offrono ulteriori
+funzionalit@`a.
+
+@item C
+Il linguaggio di programmazione di sistema con cui @`e scritta la maggior parte
+del software GNU.  Il linguaggio di programmazione @command{awk} ha una
+sintassi simile a quella del C, e
+questo @value{DOCUMENT} puntualizza, quando serve, le somiglianze esistenti
+fra @command{awk} e C.
+
+In generale, @command{gawk} tenta di essere ragionevolmente simile alla
+versione 1990 del C ISO.
+
+@item C Shell
+La C Shell (@command{csh} o la sua versione migliorata @command{tcsh}) @`e una
+shell Unix creata da Bill Joy verso la fine degli anni '70.  La C shell si
+differenzia dalla altre shell per le sue funzionalit@`a interattive, e per lo
+stile complessivo, che @`e abbastanza simile a quello del linguaggio C.
+La C shell non @`e compatibile all'indietro con la Bourne Shell, e per questo
+motivo un'attenzione speciale @`e necessaria se si convertono alla C shell
+degli @dfn{script} scritti per altre shell Unix, in particolare per ci@`o che
+concerne la gestione delle variabili di shell.
+Si veda anche ``Bourne Shell''.
+
+@item C++
+Un linguaggio di programmazione molto diffuso, orientato agli oggetti,
+derivato dal C.
+
+@item Campo
+Quando @command{awk} legge un record in input, suddivide il record in parti
+separate da spazi vuoti (o da una @dfn{regexp} che individua il separatore,
+modificabile reimpostando la variabile predefinita @code{FS}).  Tali parti
+sono dette campi.  Se le parti sono di lunghezza fissa, si pu@`o usare la
+variabile predefinita @code{FIELDWIDTHS} per descriverne le lunghezze.
+Se si desidera specificare i contenuti dei campi, piuttosto che il separatore
+fra i campi, si pu@`o usare la variabile predefinita @code{FPAT} per farlo.
+(@xref{Separatori di campo},
+@iftex
+la
+@end iftex
+@ref{Dimensione costante},
+e
+@iftex
+la
+@end iftex
+@ref{Separazione in base al contenuto}).
+
+@cindex ASCII
+@cindex ISO 8859-1
+@cindex ISO Latin-1
+@cindex caratteri (codifiche macchina di caratteri)
+@cindex insiemi di caratteri (codifiche macchina di caratteri)
+@cindex Unicode
+@item Caratteri
+L'insieme di codici numerici usati da un computer per rappresentare i
+caratteri (lettere, numeri, segni d'interpunzione, etc.) di un particolare
+paese o localit@`a. L'insieme di caratteri pi@`u comunemente in uso oggi @`e
+l'ASCII (American Standard Code for Information Interchange).  Molti paesi
+europei usano un'estensione dell'ASCII
+nota come ISO-8859-1 (ISO Latin-1).
+L'insieme di caratteri @uref{http://www.unicode.org, Unicode} sta guadagnando
+popolarit@`a e affermandosi come standard, e il suo uso @`e particolarmente esteso
+nei sistemi GNU/Linux.
+
+@cindex Kernighan, Brian
+@cindex Bentley, Jon
+@cindex @command{chem}, programma di utilit@`a
+@cindex programma di utilit@`a @command{chem}
+@item CHEM
+Un preprocessore per @command{pic} che legge descrizioni di molecole
+e produce l'input a @command{pic} che serve a disegnarle.
+@`E stato scritto in @command{awk}
+da Brian Kernighan e Jon Bentley, ed @`e disponibile in
+@uref{http://netlib.org/typesetting/chem}.
+
+@item Classe di caratteri
+Si veda ``Espressione tra parentesi quadre''.
+
+@cindex programmi compilati
+@item Compilatore
+Un programma che traduce codici sorgente scritti in qualche linguaggio
+in codici eseguibili su un particolare computer.  Il codice oggetto risultante
+pu@`o quindi essere eseguito direttamente dal computer.
+Si veda anche ``Interprete''.
+
+@item Concatenazione
+Concatenare due stringhe significa unirle, producendo una nuova stringa.
+Per esempio, la stringa @samp{pippo} concatenata con
+la stringa @samp{pluto} produce la stringa @samp{pippopluto}.
+(@xref{Concatenazione}).
+
+@item Contatore di riferimenti
+Un meccanismo interno di @command{gawk} per minimizzare la quantit@`a di
+memoria necessaria per contenere il valore delle variabili di tipo
+stringa.  Se il valore assunto da una variabile @`e usato in pi@`u di un
+posto nel programma, solo una copia del valore stesso @`e tenuta in
+memoria, e il contatore di riferimenti ad esso associato @`e aumentato di
+uno quando lo stesso valore @`e usato da un'ulteriore variabile, e diminuito
+di uno quando la variabile relativa non @`e pi@`u utilizzata.  Quando il
+contatore di riferimenti va a zero, la parte di memoria utilizzata per
+contenere il valore della variuabile @`e liberato.
+
+@item Coprocesso
+Un programma subordinato con il quale @`e possibile una comunicazione
+bidirezionale dal programma principale.
+
+@item Dati oggetto
+Sono costituiti da numeri e stringhe di caratteri.  I numeri sono convertiti
+in stringhe e viceversa, a seconda delle necessit@`a.
+(@xref{Conversione}).
+
+@item Debugger
+Un programma che serve agli sviluppatori per rimuovere ``bug'' (de-bug) dai
+loro programmi.
+
+@item Dominio di testo
+Un nome unico che identifica un'applicazione.
+Usato per raggruppare messaggi che sono tradotti in fase di esecuzione
+nel linguaggio locale.
+
+@item Doppia precisione
+Una rappresentazione di numeri all'interno del computer che ha una parte
+espressa sotto forma di frazione.  I numeri a doppia precisione hanno pi@`u
+cifre decimali che quelli a singola precisione, ma le operazioni che la
+usano consumano pi@`u risorse di quelle
+eseguite in singola precisione.  La doppia precisione @`e il formato con cui
+@command{awk} memorizza i valori numerici.  Nel linguaggio C @`e il tipo di
+dati detto @code{double}.
+
+@item Editore di flusso
+Un programma che legge record da un flusso in input e li elabora uno o
+pi@`u alla volta.  Questo @`e diverso da quel che farebbe un programma batch
+il quale potrebbe leggere completamente i file in input, prima di
+iniziare a fare alcunch@'e, ed @`e diverso anche da un programma interattivo, che
+richiede input dall'utente [tipicamente, una riga alla volta].
+
+@item Effetto collaterale
+Un effetto collaterale ha luogo quando un'espressione ha un effetto ulteriore,
+invece di produrre solo un valore.  Espressioni di assegnamento,
+incremento e decremento, e invocazioni di funzioni hanno effetti collaterali.
+(@xref{Operatori di assegnamento}).
+
+@cindex epoch, definizione di
+@item Epoca [Inizio del tempo in Unix]
+la data usata come ``inizio del tempo'' per i campi che contengono date.
+I valori del tempo nella maggior parte dei dei sistemi sono rappresentati
+in numero di secondi trascorsi dall'Epoca, con funzioni di libreria
+che consentono di convertire tali valori nei formati normali di data e ora.
+
+L'Epoca nei sistemi Unix e POSIX parte dal primo gennaio 1970 alle ore
+00:00:00 UTC.
+Si veda anche ``GMT'' e ``UTC''.
+
+@item Esadecimale
+Notazione per l'aritmetica in base 16, che usa le cifre @code{0}--@code{9} e
+le lettere @code{A}--@code{F}, con @samp{A}
+che rappresenta 10, @samp{B} che rappresenta 11, e cos@`{@dotless{i}} via, fino a
+@samp{F} per 15.
+I numeri esadecimali sono scritti in C prefissandoli con @samp{0x},
+per indicarne la base.
+@iftex
+Quindi, @code{0x12} @`e 18 (@math{(1 volta 16) + 2}).
+@end iftex
+@ifnottex
+Quindi, @code{0x12} @`e 18 ((1 x 16) + 2).
+@end ifnottex
+@xref{Numeri non-decimali}.
+
+@item Espressione booleana
+Cos@`{@dotless{i}} detta dal nome del matematico inglese George Boole.
+Si veda anche ``Espressione logica''.
+
+@item Espressione condizionale
+Un'espressione che usa l'operatore ternario @samp{?:}, come p.es.
+@samp{@var{expr1} ? @var{expr2} : @var{expr3}}.  Dell'espressione
+@var{expr1} viene calcolato il valore; se risulta verificata, il valore
+dell'intera espressione diviene quello di @var{expr2}; altrimenti il valore @`e
+quello di @var{expr3}.  In ogni caso, solo una delle due espressioni
+@var{expr2} e @var{expr3}
+viene calcolata. (@xref{Espressioni condizionali}).
+
+@item Espressione di confronto
+Una relazione che @`e vera o falsa, del tipo di @samp{a < b}.
+Espressioni di confronto sono usate nelle istruzioni
+@code{if}, @code{while}, @code{do}, @code{for}
+e nelle espressioni di ricerca per scegliere quale record in input elaborare.
+(@xref{Tipi di variabile e confronti}).
+
+@item Espressione di intervallo
+Una parte di un'espressione regolare che permette di specificare
+corrispondenze multiple di qualche parte della @dfn{regexp}.  Le espressioni di
+intervallo non erano originariamente ammesse nei programmi @command{awk}.
+
+@item Espressione di ricerca [@dfn{pattern}]
+@itemx (detta anche "criterio di ricerca" o "modello di ricerca")
+Le espressioni di ricerca individuano per @command{awk} a quali record in
+input sono applicabili determinate
+regole.
+
+Un'espressione di ricerca [pattern] @`e un'espressione condizionale specifica
+che viene confrontata con ogni record
+in input.  Se la corrispondenza esiste, si dice che il modello @dfn{individua}
+il record in input.  Una tipica espressione di ricerca potrebbe confrontare
+il record in input con un'espressione regolare.
+(@xref{Panoramica sui criteri di ricerca}).
+
+@item Espressione logica
+Un'espressione che usa gli operatori logici AND, OR e NOT,
+scritti come @samp{&&}, @samp{||}, e @samp{!} in @command{awk}.
+Spesso chiamate espressioni booleane, dal nome del matematico che per primo
+ha sistematizzato questo tipo di logica matematica.
+
+@item Espressione regolare
+un'espressione regolare (abbreviabile come ``@dfn{regexp}'') @`e un modello che
+descrive un assieme di stringhe, potenzialmente illimitato.  Per esempio
+l'espressione regolare
+@samp{R.*xp} corrisponde a qualsiasi stringa che inizia con la lettera
+@samp{R} e termina con le lettere @samp{xp}.  In @command{awk}, le espressioni
+regolari sono usate nei modelli [pattern] e nelle espressioni condizionali.
+Le espressioni regolari possono contenere sequenze di protezione.
+@iftex
+(@xrefil{Espressioni regolari}).
+@end iftex
+@ifnottex
+(@xref{Espressioni regolari}).
+@end ifnottex
+
+@item Espressione regolare calcolata
+Si veda ``Espressioni regolari dinamiche''.
+
+@item Espressione regolare costante
+Un'espressione regolare costante @`e un'espressione regolare scritta tra barre,
+come @code{/pippo/}.  A una tale espressione viene assegnato un valore quando
+si scrive un programma @command{awk} e non pu@`o essere modificata in fase di
+esecuzione del programma. (@xref{Uso di @dfn{regexp}}.)
+
+@item Espressione regolare dinamica
+Un'espressione regolare dinamica @`e un'espressione regolare scritta come
+un'espressione normale.  Potrebbe essere una costante stringa, come
+@code{"pippo"}, ma potrebbe anche essere un'espressione il cui valore @`e variabile
+(@xref{Espressioni regolari calcolate}).
+
+@item Espressione tra parentesi quadre
+All'interno di una @dfn{espressione regolare}, un'espressione racchiusa
+fra parentesi quadre sta a indicare che un singolo carattere appartiene
+a una specifica classe di caratteri.  Un'espressione tra parentesi quadre
+pu@`o contenere una lista di uno o pi@`u caratteri, come @samp{[abc]}, un
+intervallo di caratteri, come @samp{[A-Z]}, o un nome, delimitato da
+@samp{:}, che designa un insieme di caratteri conosciuto, come
+@samp{[:digit:]}.  La forma di espressione tra parentesi quadre
+racchiusa tra @samp{:} @`e indipendente dalla rappresentazione binaria dei
+caratteri stessi, che potrebbe utilizzare le codifiche ASCII, EBCDIC, o
+Unicode, a seconda dell'architettura del computer, e della localizzazione.
+Si veda anche ``Espressioni regolari''.
+
+@item Espressione tra parentesi quadre complementata
+La negazione di una @dfn{espressione tra parentesi quadre}.  Tutto ci@`o che
+@emph{non} @`e descritto da una data espressione tra parentesi quadre.
+Il simbolo @samp{^} precede l'espressione tra parentesi quadre che viene
+negata.  Per esempio: @samp{[^[:digit:]]}
+designa qualsiasi carattere che non sia una cifra. @samp{[^bad]}
+designa qualsiasi carattere che non sia una delle lettere @samp{b}, @samp{a},
+o @samp{d}.
+Si veda ``Espressione tra parentesi quadre''.
+
+@item Estensione
+Una funzionalit@`a aggiunta o una modifica a un linguaggio di programmazione
+o a un programma di utilit@`a, non definita dallo standard di quel linguaggio
+o di quel programma di utilit@`a.
+@command{gawk} ha molte estensioni rispetto al POSIX @command{awk} (fin
+troppe).
+
+@item FDL
+Free Documentation License. Si veda ``Licenza Documentazione Libera''.
+
+@item File speciale
+Un @value{FN} interpretato internamente da @command{gawk}, invece che
+gestito direttamente dal sistema operativo in cui viene eseguito
+@command{gawk}---per esempio, @file{/dev/stderr}.
+(@xref{File speciali}).
+
+@item Flag [Indicatore]
+Una variabile [di tipo booleano] che, se verificata, indica la presenza o
+l'assenza di qualche condizione.
+
+@item Formato
+Le stringhe di formato controllano il modo in cui le funzioni
+@code{strftime()}, @code{sprintf()} e l'istruzione @code{printf} visualizzano
+l'output che producono.  Inoltre, le conversioni da numeri a stringhe sono
+controllate dalle stringhe di formato contenute nelle variabili predefinite
+@code{CONVFMT} e @code{OFMT}. (@xref{Lettere di controllo}).
+
+@cindex formattatore incredibilmente duttile (@command{awf})
+@cindex programma @command{awf} (formattatore incredibilmente duttile)
+@item Formattatore incredibilmente duttile (@command{awf})
+Henry Spencer all'Universit@`a di Toronto ha scritto un formattatore che
+accetta un ampio sottoassieme dei comandi di formattazione @samp{nroff -ms}
+e @samp{nroff -man} usando
+@command{awk} e @command{sh}.
+@c Si pu@`o scaricare da @uref{http://awk.info/?tools/awf}.
+
+@item Fortran
+Abbreviazione di FORmula TRANslator (traduttore di formule), @`e uno dei primi
+linguaggi di programmazione, pensato per il calcolo scientifico.
+@`E stato ideato da John Backus ed @`e disponibile a partire dal 1957.  @`E ancora
+in uso ai giorni nostri.
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@cindex Stallman, Richard
+@item Free Software Foundation
+Un'organizzazione senza fini di lucro dedicata alla
+produzione e distribuzione di software liberamente distribuibile.
+@`E stata fondata da Richard M.@: Stallman, l'autore dell'originale editor
+Emacs.  GNU Emacs @`e la versione di Emacs maggiormente usata oggigiorno.
+
+@item FSF
+Si veda ``Free Software Foundation''.
+
+@item Funzione
+Una parte di un programma @command{awk} che si pu@`o chiamare da qualsiasi
+punto del programma, per eseguire un compito.  @command{awk} ha parecchie
+funzioni predefinite.
+Gli utenti possono definire essi stessi delle funzioni in qualsiasi parte
+del programma.  Le funzioni possono essere ricorsive, ossia possono
+chiamare se stesse.
+@iftex
+@xrefil{Funzioni}.
+@end iftex
+@ifnottex
+@xref{Funzioni}.
+@end ifnottex
+In @command{gawk} @`e anche possibile avere funzioni condivise tra diversi
+programmi, incluse secondo necessit@`a usando la direttiva
+@code{@@include}
+(@pxref{Includere file}).
+In @command{gawk} il nome della funzione da chiamare pu@`o essere generato
+in fase di esecuzione, ossia in maniera dinamica.
+L'estensione API di @command{gawk} fornisce funzioni di costruzione
+(@pxref{Funzioni di costruzione}).
+
+@item Funzioni predefinite
+Il linguaggio @command{awk} fornisce funzioni predefinite, che compiono
+calcoli vari, di tipo numerico, di input/output e di tipo carattere. Esempi
+sono @code{sqrt()} ([square root], la  radice quadrata di un numero) e
+@code{substr()} (che estrae una sottostringa da una stringa).
+@command{gawk} fornisce funzioni per la gestione di data e ora,
+le operazioni a livello di bit, l'ordinamento di
+vettori, il controllo di tipo [di variabile] e la traduzione di stringhe
+in fase di esecuzione di progranna.
+(@xref{Funzioni predefinite}).
+
+@item @command{gawk}
+L'implementazione GNU di @command{awk}.
+
+@cindex GPL (General Public License)
+@cindex General Public License (GPL)
+@cindex GNU General Public License
+@item General Public License
+Un documento che descrive le condizioni alle quali @command{gawk} e i suoi
+file sorgenti possono essere distribuiti.  (@xref{Copia}).
+
+@item GMT
+``Greenwich Mean Time''.
+Il termine tradizionalmente usato per UTC.
+@`E la datazione usata internamente dai sistemi Unix e POSIX.
+Si veda anche ``Epoca'' e ``UTC''.
+
+@cindex FSF (Free Software Foundation)
+@cindex Free Software Foundation (FSF)
+@cindex Progetto GNU
+@item GNU
+``GNU's not Unix'' (GNU non @`e Unix).
+Un progetto della Free Software Foundation, ancora in corso, che mira a creare
+un ambiente di calcolo completo, liberamente distribuibile, aderente allo
+standard POSIX.
+
+@item GNU/Linux
+Una variante del sistema GNU che usa il kernel Linux,
+invece del kernel proprio della Free Software Foundation, noto come Hurd.
+Il kernel Linux @`e un clone di Unix stabile, efficiente, completo di tutte le
+funzionalit@`a, ed @`e stato portato su varie architetture hardware.
+@`E molto diffuso su sistemi del tipo dei Personal Computer, ma funziona bene
+anche in parecchi altri computer.
+Il codice sorgente del kernel Linux @`e disponibile nei termini della GNU General
+Public License, la qual cosa @`e forse il suo aspetto pi@`u rilevante.
+
+@item GPL
+Si veda ``General Public License''.
+
+@item Graffe
+I caratteri @samp{@{} e @samp{@}}.  Le parentesi graffe sono usate in
+@command{awk} per delimitare azioni, istruzioni composte, e il codice che
+costituisce le funzioni.
+
+@item Guidato dai dati
+Una descrizione dei programmi @command{awk}, nei quali si specifica quali sono
+i dati che si vogliono elaborare, e cosa fare quando si trovano tali dati.
+
+@item I/O
+Abbreviazione per ``Input/Output,'' ovvero il trasferimento di dati da e verso
+un programma in esecuzione.
+
+@item Individuazione
+L'azione che consiste nel confrontare una stringa con un'espressione regolare.
+Se la @dfn{regexp} descrive qualcosa che @`e contenuto nella stringa, si dice che
+la @dfn{individua}.
+
+@item Internazionalizzazione
+La procedura con cui si scrive o si modifica un programma
+in modo che possa inviare messaggi in lingue differenti, senza richiedere
+ulteriori modifiche al codice sorgente.
+
+@item Intero
+Un numero intero, cio@`e un numero che non ha una parte frazionaria.
+
+@cindex programmi interpretati
+@item Interprete
+Un programma che accetta come input del codice sorgente, e usa le
+istruzione contenute nello stesso per elaborare dati e fornire risultati.
+@command{awk} @`e tipicamente (ma non sempre) implementato come un interprete.
+Si veda anche ``Compilatore''.
+
+@item Intervallo (nelle righe di input)
+Una sequenza di righe consecutive nel/nei file in input.  Un'espressione di
+ricerca pu@`o specificare intervalli di righe di input da far elaborare ad
+@command{awk} oppure pu@`o specificare singole righe.
+(@xref{Panoramica sui criteri di ricerca}).
+
+@cindex ISO
+@item ISO
+Acronimo di International Organization for Standardization.
+Questo ente elabora degli standard internazionali in vari settori, inclusi i
+linguaggi di programmazione, come il C e il C++.
+In ambito informatico, standard importanti come quelli per il C, C++, e POSIX
+sono allo stesso tempo standard nazionali americani e standard internazionali
+ISO.
+In questo @value{DOCUMENT} lo Standard C @`e chiamato ``ISO C''.
+Si veda @uref{https://www.iso.org/iso/home/about.htm, il sito web ISO} per
+ulteriori informazioni sul nome dell'ente e sul suo acronimo di tre lettere,
+che rimane lo stesso in tutte le lingue.
+
+@item Istruzione
+Un'espressione all'interno di un programma @command{awk} nella parte
+"azione" di una regola @dfn{criterio di ricerca--azione}, o all'interno
+di una funzione @command{awk}.  Un'espressione pu@`o essere un assegnamento
+di variabile, un'operazione su un vettore, un ciclo, etc.
+
+@item Istruzione composta
+Una serie di istruzioni @command{awk}, racchiuse tra parentesi graffe.
+Le istruzioni composte possono essere nidificate [possono esserci pi@`u livelli
+di parentesi graffe].
+(@xref{Istruzioni}).
+
+@item Istruzione di controllo
+Un'istruzione di controllo @`e un'istruzione per eseguire una data operazione
+o un insieme di operazioni all'interno di un programma @command{awk},
+se una determinata condizione @`e verificata.
+Istruzioni di controllo sono: @code{if}, @code{for}, @code{while}, e @code{do}
+(@pxref{Istruzioni}).
+
+@cindex Java, linguaggio di programmazione
+@cindex linguaggio di programmazione, Java
+@item Java
+Un moderno linguaggio di programmazione originalmente sviluppato da Sun
+Microsystems (ora Oracle) che prevede la programmazione orientata agli
+oggetti.  Sebbene normalmente sia implementato compilando le istruzioni
+per una macchina virtuale standard (la JVM---Java Virtual Machine) il
+linguaggio pu@`o essere compilato per essere eseguito in maniera nativa.
+
+@item Korn Shell
+La Korn Shell (@command{ksh}) @`e una shell Unix sviluppata da David Korn,
+presso i Bell Laboratories, nei primi anni '80.  La Korn shell @`e
+compatibile all'indietro con la Bourne shell e comprende molte funzionalit@`a
+presenti nella C Shell.
+Si veda anche ``Bourne Shell''.
+
+@item LDL
+Si veda ``Licenza Documentazione Libera''.
+
+@cindex LGPL (Lesser General Public License)
+@cindex Lesser General Public License (LGPL)
+@cindex GNU Lesser General Public License
+@item Lesser General Public License
+Questo documento descrive i termini nei quali possono essere distribuiti
+degli archivi contenenti librerie in formato eseguibile o oggetti condivisi,
+e il relativo codice sorgente.
+
+@item LGPL
+Si veda ``Lesser General Public License''.
+
+@item Licenza Documentazione Libera
+Questo documento descrive i termini in base ai quali questo @value{DOCUMENT}
+@`e pubblicato e pu@`o essere copiato.
+(@xref{Licenza per Documentazione Libera GNU (FDL)}).
+
+@item Linguaggio @command{awk}
+Il linguaggio in cui i programmi @command{awk} sono scritti.
+
+@item Linux
+Si veda ``GNU/Linux''.
+
+@item Lista di caratteri
+Si veda ``Espressione tra parentesi quadre''.
+
+@item Localizzazioni
+La funzionalit@`a che fornisce i dati necessari perch@'e un programma
+internazionalizzato interagisca con l'utente in un particolare linguaggio.
+
+@item @dfn{Lvalue}
+[left-value, ossia valore a sinistra] Un'espressione che pu@`o stare alla
+sinistra di un operatore di assegnamento.
+Nella maggior parte dei linguaggi, gli @dfn{lvalue} possono essere variabili o
+elementi di un vettore.  In @command{awk}, un designatore di campo pu@`o anche
+essere usato come un @dfn{lvalue}.
+
+@item Marcatura temporale
+Un valore nel formato ``secondi a partire dall'epoch'' usato dai sistemi Unix
+e POSIX.  Usato per le funzioni @command{gawk}
+@code{mktime()}, @code{strftime()}, e @code{systime()}.
+Si veda anche ``Epoca,'' ``GMT,'' e ``UTC''.
+
+@item Metacaratteri
+Caratteri usati all'interno di una @dfn{regexp} e che non rappresentano se
+stessi.
+Servono invece per rappresentare operazioni con espressioni regolari, come
+per esempio delle ripetizioni, dei raggruppamenti, o delle alternanze.
+
+@item Nidificazione
+Una nidificazione si riscontra dove l'informazione @`e organizzata a strati,
+o dove degli oggetti contengono altri oggetti simili.
+In @command{gawk} la direttiva @code{@@include}
+pu@`o essere nidificata. La nidificazione ``naturale'' delle operazioni
+aritmetiche e logiche pu@`o essere modificato attraverso l'uso di parentesi.
+(@pxref{Precedenza}).
+
+@item No-op
+Un'operazione che non fa nulla.
+
+@item Numero
+Un dato oggetto il cui valore @`e numerico. Le implementazioni di @command{awk}
+usano numeri in virgola mobile in doppia precisione per rappresentare i numeri.
+Le primissime implementazioni di @command{awk} usavano numeri in virgola mobile
+in singola precisione.
+
+@item Numero in virgola mobile
+Spesso descritto, in termini matematici, come un numero ``razionale'' o reale,
+@`e soltanto un numero che pu@`o avere una parte frazionaria.
+Si veda anche ``Doppia precisione'' e ``Singola precisione''.
+
+@item Operatori di espressioni regolari
+Si veda ``Metacaratteri''.
+
+@item Ottale
+Notazione avente come base 8, nella quale le cifre sono @code{0}--@code{7}.
+I numeri ottali in C sono scritti premettendo uno @samp{0},
+per indicare la base.
+@iftex
+Quindi, @code{013} @`e 11 (@math{(1 volta 8) + 3}).
+@end iftex
+@ifnottex
+Quindi, @code{013} @`e 11 ((1 x 8) + 3).
+@end ifnottex
+@xref{Numeri non-decimali}.
+
+@item Parentesi Graffe
+Si veda ``Graffe''.
+
+@item Parola chiave
+nel linguaggio @command{awk}, una parola chiave (keyword) @`e una parola
+che ha un significato speciale.  Queste parole sono riservate e non possono
+essere usate come nomi di variabili.
+
+Le parole chiave di @command{gawk} sono:
+@code{BEGIN},
+@code{BEGINFILE},
+@code{END},
+@code{ENDFILE},
+@code{break},
+@code{case},
+@code{continue},
+@code{default},
+@code{delete},
+@code{do@dots{}while},
+@code{else},
+@code{exit},
+@code{for@dots{}in},
+@code{for},
+@code{function},
+@code{func},
+@code{if},
+@code{next},
+@code{nextfile},
+@code{switch},
+e
+@code{while}.
+
+@item PEBKAC
+Un acronimo inglese che descrive qual @`e probabilmente la causa pi@`u frequente
+di problemi nell'uso di un computer.  (@dfn{Problem Exists Between Keyboard and
+Chair} [il problema si trova tra la tastiera e la sedia].)
+
+@item Percorso di ricerca
+In @command{gawk}, una lista di directory in cui cercare file contenenti del
+codice sorgente per @command{awk}.
+Nella shell, una lista di directory in cui ricercare un programma eseguibile.
+
+@item Plug-in
+Si veda ``Estensione''.
+
+@item POSIX
+Il nome di una serie di standard che specificano l'interfaccia di un Sistema
+Operativo Portabile (Portable Operating System).  La ``IX'' specifica
+che questi standard sono stati originati dallo Unix.
+Lo standard pi@`u rilevante per gli utenti @command{awk} @`e lo
+@cite{IEEE Standard for Information Technology, Standard 1003.1-2008}.
+Lo standard POSIX 2008 pu@`o essere trovato in rete all'indirizzo:
+@url{http://pubs.opengroup.org/onlinepubs/9699919799/}.
+
+@item Precedenza
+L'ordine in cui le operazioni sono eseguite quando si usano degli operatori
+se non si stabiliscono precedenze per mezzo di parentesi.
+
+@item Private
+Variabili e/o funzioni che sono riservate all'uso esclusivo di funzioni di
+libreria, e non per il programma principale @command{awk}.  Un'attenzione
+particolare va prestata quando si desigano tali variabili e funzioni.
+(@xref{Nomi di variabili di libreria}).
+
+@item Programma @command{awk}
+Un programma @command{awk} consiste in una serie di @dfn{espressioni di
+ricerca} e @dfn{azioni}, che formano delle @dfn{regole}.  Per ogni record in
+input a un progranna, le regole del programma sono elaborate nell'ordine in
+cui sono scritte.  I programmi
+@command{awk} possono anche contenere definizioni di funzioni.
+
+@item Record
+Si veda ``Record in input'' e ``Record in output''.
+
+@item Record in input
+Una singola parte di dati letta da @command{awk}.  Solitamente, un
+record in input di @command{awk} consiste in una riga di testo.
+(@xref{Record}).
+
+@item Record in output
+Un singolo pezzo di dati scritto da @command{awk}.  Solitamente, un
+record in output di @command{awk} consiste di una o pi@`u righe di testo.
+@xref{Record}.
+
+@item Ricorsione
+Quando una funzione chiama se stessa, direttamente o indirettamente.
+Se questo @`e chiaro, si pu@`o passare a leggere la definizione successiva.
+Altrimenti, si veda la voce ``Ricorsione''.
+
+@item @dfn{regexp}
+Si veda ``Espressione regolare''.
+
+@item Regola
+Un segmento di un programma @command{awk} che specifica come trattare singoli
+record in input.  Una regola consiste in una @dfn{espressione di ricerca} e in
+una @dfn{azione}.
+@command{awk} legge un record in input; poi, per ogni regola, se il record in
+input soddisfa l'espressione di ricerca della regola, @command{awk} esegue
+l'azione specificata dalla regola.
+Altrimenti, la regola non ha alcun effetto su quel record in input.
+
+@item Ridirezione
+Ridirezione significa ricevere input da quaclosa che non sia il flusso dello
+standard input, o dirigere output a qualcosa di diverso dal flusso dello
+standard output.
+
+Si pu@`o ridirigere input all'istruzione @code{getline} usando gli operatori
+@samp{<}, @samp{|}, e @samp{|&}.
+Si pu@`o ridirigere l'output delle istruzioni @code{print} e @code{printf} verso
+un file o un comando di sistema, usando gli operatori @samp{>}, @samp{>>},
+@samp{|}, e @samp{|&}.
+(@xref{Getline},
+e @ref{Ridirezione}).
+
+@item @dfn{Rvalue}
+[right-value, ossia valore a destra] Un valore che pu@`o apparire alla destra
+di un operatore di assegnazione.
+In @command{awk}, essenzialmente ogni espressione ha un valore.
+Ognuno di questi valori @`e un @dfn{rvalue}.
+
+@item Scalare
+Un valore singolo, sia numerico che di tipo stringa.
+Le variabili normali sono scalari; i vettori e le funzioni non lo sono.
+
+@item Scorciatoia
+La natura degli operatori logici @command{awk} @samp{&&} e @samp{||}.
+Se il valore dell'intera espressione in cui sono contenuti @`e determinabile
+valutando solo una parte iniziale dell'espressione, la parte seguente non @`e
+presa in considerazione.
+(@xref{Operatori booleani}).
+
+@item @dfn{Script} @command{awk}
+Un altro nome per designare un programma @command{awk}.
+
+@item @command{sed}
+Si veda ``Editore di flusso''.
+
+@item Seme
+Il valore iniziale, o il punto di partenza, di una sequenza di numeri casuali.
+
+@item Sequenze di protezione
+Una speciale sequenza di caratteri usata per descrivere caratteri non
+stampabili, come @samp{\n} (ritorno a capo) o @samp{\033} per il carattere
+ASCII ESC (Escape). (@xref{Sequenze di protezione}).
+
+@item Shell
+Il programma che interpreta i comandi nei sistemi Unix e in quelli che
+rispettano lo standard POSIX.
+La shell funziona sia interattivamente che come un linguaggio di
+programmazione, che elabora file sequenziali, detti @dfn{script} di shell.
+
+@item Singola precisione
+Una rappresentazione di numeri all'interno del computer che ha una parte
+espressa sotto forma di frazione.  I numeri a singola precisione hanno meno
+cifre significative di quelli a doppia precisione, ma le operazioni relative
+richiedono talora meno risorse elaborative da parte del computer.
+Questo tipo di numero @`e quello usato da alcune tra le prime versioni di
+@command{awk} per memorizzare valori numerici.  Nel linguaggio C, sono numeri
+di tipo @code{float}.
+
+@item Spazio
+Il carattere generato premendo la barra spaziatrice sulla tastiera.
+
+@item Spazio vuoto
+Una sequenza di spazi, TAB, o caratteri di ritorno a capo presenti in un
+record in input o in una stringa.
+
+@item Stringa
+Un dato che consiste in una sequenza di caratteri, come @samp{Io sono una
+stringa}.  Le costanti stringa sono scritte tra doppi apici nel linguaggio
+@command{awk} e possono contenere sequenze di protezione
+(@xref{Sequenze di protezione}).
+
+@item Stringa nulla
+Una stringa che non contiene alcun carattere.  @`E rappresentabile
+esplicitamente nei programmi @command{awk} mettendo due caratteri di
+doppio apice uno dietro all'altro (@code{""}).  La si pu@`o inserire nei dati
+in input mettendo due separatori di campo uno dietro all'altro.
+
+@item Stringa vuota
+Si veda ``Stringa nulla''.
+
+@item Tab
+Il carattere generato premendo il tasto @kbd{TAB} sulla tastiera.
+Normalmente pu@`o generare sino a otto spazi in output.
+
+@cindex Linux
+@cindex GNU/Linux
+@cindex Unix
+@cindex sistemi operativi basati su BSD
+@cindex NetBSD
+@cindex FreeBSD
+@cindex OpenBSD
+@item Unix
+Un sistema operativo per computer originalmente sviluppato nei primi anni '70
+presso gli AT&T Bell Laboratories.  Inizialmente si diffuse nelle universit@`a
+di tutto il mondo e in seguito si estese agli ambienti del mondo del lavoro
+come un sistema per lo sviluppo del software e come server di rete.
+Ci sono parecchie versioni di Unix a pagamento, come pure parecchi sistemi
+operativi modellati su Unix e il cui codice sorgente @`e liberamente
+disponibile. (come GNU/Linux, @uref{http://www.netbsd.org, NetBSD},
+@uref{https://www.freebsd.org, FreeBSD}, e
+@uref{http://www.openbsd.org, OpenBSD}).
+
+@item UTC
+L'abbreviazione comune per ``Universal Coordinated Time'' (tempo coordinato
+universale).  Questa @`e l'ora standard di Greenwich, (UK), usata come tempo
+di riferimento per i calcoli relativi a marcature temporali.
+Si veda anche ``Epoca'' e ``GMT''.
+
+@item Variabile
+Un nome per designare un valore. In @command{awk}, le variabili possono
+essere degli scalari o dei vettori.
+
+@item Variabili d'ambiente
+Una collezione di stringhe, in formato @samp{@var{nome}=@var{valore}}, che
+ogni programma ha a disposizione.  Gli utenti in generale assegnano valori
+alle variabili d'ambiente per fornire informazioni a vari programmi.
+Esempi tipici sono le variabili d'ambiente @env{HOME} e @env{PATH}.
+
+@item Variabili predefinite
+@code{ARGC},
+@code{ARGV},
+@code{CONVFMT},
+@code{ENVIRON},
+@code{FILENAME},
+@code{FNR},
+@code{FS},
+@code{NF},
+@code{NR},
+@code{OFMT},
+@code{OFS},
+@code{ORS},
+@code{RLENGTH},
+@code{RSTART},
+@code{RS},
+e
+@code{SUBSEP}
+sono le variabili con un significato speciale in @command{awk}.
+In pi@`u,
+@code{ARGIND},
+@code{BINMODE},
+@code{ERRNO},
+@code{FIELDWIDTHS},
+@code{FPAT},
+@code{IGNORECASE},
+@code{LINT},
+@code{PROCINFO},
+@code{RT},
+e
+@code{TEXTDOMAIN}
+sono le variabili con un significato speciale in @command{gawk}.
+Se i loro valori sono modificati, il contesto di esecuzione di @command{awk}
+cambia.
+(@xref{Variabili predefinite}).
+
+@item Vettore
+Un raggruppamento di molti valori con uno stesso nome.
+La maggior parte dei linguaggi fornisce solo vettori sequenziali.
+@command{awk} fornisce vettori associativi.
+
+@item Vettore associativo
+Un vettore i cui indici possono essere numeri o stringhe, e non solamente
+interi sequenziali compresi in un intervallo prestabilito.
+
+@end table
+
+@end ifclear
+
+@c The GNU General Public License.
+
+@node Copia
+@unnumbered Licenza Pubblica Generale GNU (GPL)
+@ifnotdocbook
+@center Versione 3, 29 Giugno 2007
+@end ifnotdocbook
+@docbook
+<subtitle>Versione 3, 29 Giugno 2007</subtitle>
+@end docbook
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{https://fsf.org/}
+
+This is an unofficial translation of the GNU General Public License into
+Italian. It was not published by the Free Software Foundation, and does not
+legally state the distribution terms for software that uses the GNU GPL---only
+the original English text of the GNU GPL does that. However, we hope that this
+translation will help Italian speakers understand the GNU GPL better.
+
+Questa @`e una traduzione non ufficiale in italiano della GNU General Public
+License. Questa traduzione non @`e stata pubblicata dalla Free Software
+Foundation, e non stabilisce i termini legali di distribuzione del software
+che usa la GNU GPL.  Soltanto la versione originale in inglese della GNU GPL
+fa ci@`o. Ciononostante, speriamo che questa traduzione possa aiutare gli utenti
+di lingua italiana a comprendere un po' meglio la GNU GPL.
+
+A chiunque @`e permesso copiare e ridistribuire copie esatte di questo documento
+di licenza, ma non @`e in alcun modo consentito apportarvi modifiche.
+@end display
+
+@c fakenode --- for prepinfo
+@heading Preambolo
+
+La GNU General Public License @`e una licenza libera e basata su copyleft per
+software e altri tipi di opere.
+
+Le licenze della maggior parte del software e di altre opere materiali sono
+pensate per togliere la libert@`a di condividere e modificare tali opere. Al
+contrario, la GNU General Public License ha l'obiettivo di garantire la
+libert@`a di condividere e modificare tutte le versioni di un programma e di
+fare in modo che esso rimanga software libero per tutti gli utenti. Noi, Free
+Software Foundation, usiamo la GNU General Public License per la maggior parte
+del nostro software; essa viene applicata anche a qualunque altro software
+rilasciato dall'autore sotto questa licenza. Chiunque pu@`o utilizzare questa
+licenza per i suoi programmi.
+
+Quando parliamo di software libero (free software), ci riferiamo al concetto
+di libert@`a, non al prezzo. Le nostre General Public License sono progettate
+per garantire che chiunque abbia la libert@`a di distribuire copie di software
+libero (anche dietro pagamento di un prezzo, se lo desidera), che chiunque
+riceva o possa ricevere il codice sorgente se lo vuole, che chiunque possa
+apportare modifiche al software o utilizzarne delle porzioni in altri software
+liberi, e che chiunque sappia che ha il diritto di fare tutte queste cose col
+software libero.
+
+Per proteggere i vostri diritti, abbiamo la necessit@`a di impedire che altri vi
+neghino questi diritti o vi obblighino a rinunciarvi. Pertanto, chiunque
+distribuisce o modifica software rilasciato con questa licenza assume dei
+precisi doveri: il dovere di rispettare la libert@`a degli altri.
+
+Per esempio, chi distribuisce copie di un programma rilasciato sotto questa
+licenza, sia gratis che dietro pagamento di un prezzo, e' obbligato a
+riconoscere a chi riceve il software esattamente gli stessi diritti che ha
+ricevuto. Deve garantire che chi riceva il software abbia o possa avere
+accesso al codice sorgente. E deve chiaramente far conoscere ai destinatari
+del software queste condizioni, cos@`{@dotless{i}} che essi conoscano quali sono i loro
+diritti.
+
+Gli sviluppatori che usano la GNU GPL proteggono i vostri diritti in due modi:
+(1) Rivendicando il copyright sul software, e (2) offrendovi questa licenza
+che vi garantisce il diritto legale di copiarlo e/o di modificarlo.
+
+Al fine di proteggere gli sviluppatori e gli autori, la GPL spiega chiaramente
+che non c'@`e nessuna garanzia per questo software libero. Nell'interesse degli
+utenti e degli autori, la GPL impone che le versioni modificate del software
+vengano esplicitamente marcate come ``modificate'', in maniera tale che
+eventuali problemi non vengano erroneamente attribuiti agli autori delle
+versioni precedenti.
+
+Alcuni dispositivi sono progettati per negare agli utenti l'installazione o
+l'esecuzione di versioni modificate del software che gira sugli stessi, anche
+se il costruttore si riserva la possibilit@`a di farlo. Ci@`o @`e fondamentalmente
+incompatibile con l'obiettivo di garantire la libert@`a degli utenti di
+modificare il software. Una ripetizione sistematica di tali abusi avviene nel
+campo dei dispositivi per usi individuali, e ci@`o rende questi abusi ancora pi@`u
+inaccettabili. Pertanto, abbiamo realizzato questa versione della GPL al fine
+di proibire queste pratiche. Se problemi simili dovessero sorgere in altri
+ambiti, saremo pronti ad estendere queste misure a questi nuovi ambiti in
+versioni future della GPL, nella maniera che si render@`a necessaria per
+difendere la libert@`a degli utenti.
+
+In conclusione, tutti i programmi sono costantemente minacciati dai brevetti
+sul software. Gli Stati non dovrebbero permettere ai brevetti sul software di
+limitare lo sviluppo e l'utilizzo di software per computer, ma nei Paesi in
+cui ci@`o avviene noi vogliamo evitare in particolare il pericolo che i brevetti
+sul software applicati ad un programma libero possano renderlo, a tutti gli
+effetti, proprietario. Per impedire ci@`o, la GPL assicura che non @`e possibile
+utilizzare i brevetti sul software per rendere un programma non libero.
+
+I termini e le condizioni esatte per la copia, la distribuzione e la modifica
+del software sono riportate di seguito.
+
+@c fakenode --- for prepinfo
+@heading TERMINI E CONDIZIONI
+
+@enumerate 0
+@item Definizioni
+
+``Questa Licenza'' si riferisce alla versione 3 della GNU General Public
+License.
+
+``Copyright'' indica anche leggi simili al copyright che riguardano altri tipi
+di opere, come le maschere per la produzione di semiconduttori.
+
+``Il Programma'' indica qualunque opera che sia soggetta a copyright e che sia
+rilasciata sotto questa Licenza. I detentori della licenza sono indicati come
+``tu'' o ``voi''. Licenziatari e destinatari possono essere individui o
+organizzazioni.
+
+``Modificare'' un'opera significa copiare o adattare tutta o parte dell'opera in
+una maniera che richieda un permesso di copyright, e non indica la semplice
+azione di fare una esatta copia dell'opera. L'opera risultante viene chiamata
+``versione modificata'' dell'opera precedente, oppure viene detta opera ``basata
+sulla'' opera precedente.
+
+Una ``opera coperta da questa licenza'' indica il Programma originale non
+modificato oppure un'opera basata sul Programma.
+
+``Propagare'' un'opera significa fare qualunque cosa con essa che, in mancanza
+di un esplicito permesso, ti renda direttamente o indirettamente perseguibile
+per violazione secondo le vigenti normative sul copyright, ad eccezione della
+semplice esecuzione del Programma su un computer o della modifica di una copia
+privata. La Propagazione include la copia, la distribuzione (con o senza
+modifiche), la messa a disposizione al pubblico e, in alcuni stati, altre
+attivit@`a simili e connesse.
+
+``Distribuire'' un'opera indica qualunque forma di propagazione che permetta a
+terze parti di effettuare o ricevere delle copie. La mera interazione con un
+utente attraverso una rete di computer, senza che ci sia alcun trasferimento
+di una copia, non @`e considerata ``Distribuzione''.
+
+Una interfaccia utente interattiva fornisce delle ``Adeguate Informazioni
+Legali'' soltanto nel caso in cui include una apposita funzionalit@`a, resa
+adeguatamente visibile, che (1) visualizzi un'adeguata informazione di
+copyright, e (2) informi l'utente che non c'@`e alcuna garanzia sull'opera
+(eccetto nel caso in cui delle garanzie sono espressamente fornite), dica che
+il licenziatario pu@`o distribuire l'opera utilizzando questa Licenza, indichi
+come @`e possibile prendere visione di una copia di questa Licenza. Se
+l'interfaccia presenta una lista di comandi o di opzioni, come per esempio un
+men@`u, una delle opzioni fornite nella lista deve rispettare questa condizione.
+
+@item Codice Sorgente
+
+Il ``codice sorgente'' di un'opera indica la forma pi@`u indicata dell'opera per
+effettuare modifiche su di essa. Il ``codice oggetto'' indica qualunque forma
+dell'opera che non sia codice sorgente.
+
+Una ``Interfaccia Standard'' @`e una interfaccia che risponde ad uno standard
+ufficiale definito da un ente di standardizzazione riconosciuto o, nel caso di
+interfacce specifiche per un particolare linguaggio di programmazione, una
+interfaccia che @`e largamente utilizzata dagli sviluppatori per sviluppare in
+tale linguaggio.
+
+Le ``Librerie di Sistema'' di un eseguibile includono qualsiasi cosa, eccetto
+l'opera nel suo insieme, che (a) sia inclusa nella normale forma di
+pacchettizzazione di un ``Componente Principale'', ma che non @`e parte di quel
+Componente Principale, e (b) che serva solo a consentire l'uso dell'opera con
+quel Componente Principale, o per implementare una Interfaccia Standard per la
+quale esista una implementazione disponibile al pubblico in forma sorgente. Un
+``Componente Principale'', in questo contesto, @`e un componente essenziale
+(kernel, gestore di finestre eccetera) dello specifico sistema operativo
+(ammesso che ce ne sia uno) sul quale l'eseguibile esegue, o un compilatore
+utilizzato per produrre il programma, o un interprete di codice oggetto
+utilizzato per eseguire il programma.
+
+Il ``Sorgente Corrispondente'' per un'opera in forma di codice oggetto @`e il
+codice sorgente necessario per generare, installare e (per un programma
+eseguibile) eseguire il codice oggetto e per modificare l'opera, inclusi gli
+script per controllare le suddette attivit@`a di generazione, installazione ed
+esecuzione. Non sono incluse le Librerie di Sistema usate dal programma, o gli
+strumenti di utilit@`a generica o i programmi liberamente accessibili che sono
+utilizzati, senza modifiche, per portare a termine le suddette attivit@`a ma che
+non fanno parte dell'opera. Per esempio, il sorgente corrispondente include i
+file con le definizioni delle interfacce associati ai file sorgente
+dell'opera, e il codice sorgente delle librerie condivise e sottoprogrammi
+collegati dinamicamente specificatamente necessari per il programma, ad
+esempio a causa di stretta comunicazione dati o di controllo di flusso tra
+questi sottoprogrammi e altre parti del programma.
+
+Il Sorgente Corrispondente non include qualunque cosa che l'utente possa
+rigenerare automaticamente da altre parti del Sorgente Corrispondente stesso.
+
+Il Sorgente Corrispondente di un'opera in forma di codice sorgente @`e l'opera
+stessa.
+
+@item Principali Diritti
+
+Tutti i diritti garantiti da questa Licenza sono garantiti per la durata del
+copyright sul Programma, e sono irrevocabili ammesso che le suddette
+condizioni siano rispettate. Questa Licenza afferma esplicitamente il tuo
+permesso illimitato di eseguire il Programma non modificato. Il risultato
+dell'esecuzione di un programma coperto da questa Licenza @`e a sua volta
+coperto da questa Licenza solo se il risultato stesso, a causa del suo
+contenuto, @`e un'opera coperta da questa Licenza. Questa Licenza riconosce il
+tuo diritto all'uso legittimo o altri diritti equivalenti, come stabilito
+dalla legislazione sul copyright.
+
+Puoi creare, eseguire e propagare programmi coperti da questa Licenza che tu
+non distribuisci, senza alcuna condizione fino a quando la tua Licenza rimane
+valida. Puoi distribuire opere coperte da questa Licenza ad altri al solo
+scopo di ottenere che essi facciano delle modifiche al programma
+esclusivamente per te, o che ti forniscano dei servizi per l'esecuzione di
+queste opere, ammesso che tu rispetti i termini di questa Licenza nel
+distribuire tutto il materiale per il quale non detieni il copyright. Coloro i
+quali creano o eseguono per conto tuo un programma coperto da questa Licenza
+lo fanno esclusivamente in tua vece, sotto la tua direzione e il tuo
+controllo, in maniera tale che sia proibito a costoro effettuare copie di
+materiale di cui detieni il copyright al di fuori della relazione che
+intrattengono nei tuoi confronti.
+
+Distribuire opere coperte da licenza in qualunque altra circostanza @`e
+consentito soltanto alle condizioni espresse in seguito. Non @`e consentito
+sottolicenziare le opere: la sezione 10 lo rende non necessario.
+
+@item Protezione dei diritti legali degli utenti dalle leggi anti-elusione
+
+Nessun programma protetto da questa Licenza pu@`o essere considerato parte di
+una misura tecnologica di restrizione che sottosta ad alcuna delle leggi che
+soddisfano l'articolo 11 del ``WIPO copyright treaty'' adottato il 20 Dicembre
+1996, o a simili leggi che proibiscono o limitano l'elusione di tali misure
+tecnologiche di restrizione.
+
+Quando distribuisci un programma coperto da questa Licenza, rifiuti tutti i
+poteri legali atti a proibire l'elusione di misure tecnologiche di restrizione
+ammesso che tale elusione sia effettuata nell'esercizio dei diritti garantiti
+da questa Licenza riguardo al programma coperto da questa Licenza, e rinunci
+all'intenzione di limitare l'operativit@`a o la modifica del programma per far
+valere, contro i diritti degli utenti del programma, diritti legali tuoi o di
+terze parti che impediscano l'elusione di misure tecnologiche di restrizione.
+
+@item Distribuzione di Copie Esatte
+
+Ti @`e permesso distribuire copie esatte del codice sorgente del Programma come
+lo hai ricevuto, con qualunque mezzo, ammesso che tu aggiunga in maniera
+appropriata su ciascuna copia una appropriata nota di copyright; che tu lasci
+intatti tutti gli avvisi che affermano che questa Licenza e tutte le clausole
+non-permissive aggiunte in accordo con la sezione 7 sono valide per il codice
+che distribuisci; che tu lasci intatti tutti gli avvisi circa l'assenza di
+garanzia; che tu fornisca a tutti i destinatari una copia di questa Licenza
+assieme al Programma.
+
+Puoi richiedere il pagamento di un prezzo o di nessun prezzo per ciascuna
+copia che distribuisci, e puoi offrire supporto o garanzia a pagamento.
+
+@item Distribuzione di Versioni modificate del sorgente
+
+Puoi distribuire un'opera basata sul Programma, o le modifiche per produrla a
+partire dal Programma, nella forma di codice sorgente secondo i termini della
+sezione 4, ammesso che tu rispetti anche tutte le seguenti condizioni:
+
+@enumerate a
+@item
+L'opera deve recare con s@`e delle informazioni adeguate che affermino che tu
+l'hai modificata, indicando la data di modifica.
+
+@item
+L'opera deve recare informazioni adeguate che affermino che essa @`e rilasciata
+sotto questa Licenza e sotto le condizioni aggiuntive secondo quanto indicato
+dalla Sezione 7. Questa condizione modifica la condizione espressa alla
+sezione 4 di ``lasciare intatti tutti gli avvisi''.
+
+@item
+Devi rilasciare l'intera opera, nel suo complesso, sotto questa Licenza a
+chiunque venga in possesso di una copia di essa. Questa Licenza sar@`a pertanto
+applicata, assieme ad eventuali clausole aggiunte in osservanza della Sezione
+7, all'opera nel suo complesso, a tutte le sue parti, indipendentemente da
+come esse siano pacchettizzate. Questa Licenza nega il permesso di licenziare
+l'opera in qualunque altro modo, ma non rende nullo un tale permesso ammesso
+che tu lo abbia ricevuto separatamente.
+
+@item
+Se l'opera ha delle interfacce utente interattive, ciascuna deve mostrare
+delle Adeguate Informazioni Legali; altrimenti, se il Programma ha delle
+interfacce interattive che non visualizzano delle Adeguate Informazioni
+Legali, il tuo programma non @`e obbligato a visualizzarle.
+@end enumerate
+
+La giustapposizione di un'opera coperta da questa Licenza assieme ad altre
+opere separate e indipendenti, che non sono per loro natura estensioni del
+Programma, e che non sono combinate con esso a formare un altro programma pi@`u
+grande, dentro o in uno stesso supporto di memorizzazione a lungo termine o di
+distribuzione, @`e semplicemente detto ``aggregato'' se la raccolta e il suo
+copyright non sono utilizzati per limitare l'accesso o i diritti legali degli
+utenti della raccolta stessa oltre ci@`o che ciascun singolo programma consente.
+L'inclusione di un programma coperto da questa Licenza in un aggregato non
+comporta l'applicazione di questa Licenza alle altre parti dell'aggregato.
+
+@item Distribuzione in formato non-sorgente
+
+Puoi distribuire un programma coperto da questa Licenza in formato di codice
+oggetto secondo i termini delle sezioni 4 e 5, ammesso che tu fornisca anche
+il Sorgente Corrispondente in formato comprensibile da un computer sotto i
+termini di questa stessa Licenza, in uno dei seguenti modi:
+
+@enumerate a
+@item
+Distribuendo il codice oggetto in, o contenuto in, un prodotto fisico (inclusi
+i mezzi fisici di distribuzione), accompagnato dal Sorgente Corrispondente su
+un supporto fisico duraturo comunemente utilizzato per lo scambio di software.
+
+@item
+Distribuendo il codice oggetto in, o contenuto in, un prodotto fisico (inclusi
+i mezzi fisici di distribuzione), accompagnato da un'offerta scritta, valida
+per almeno tre anni e valida per tutto il tempo durante il quale tu offri
+ricambi o supporto per quel modello di prodotto, di fornire a chiunque
+possieda il codice oggetto (1) una copia del Sorgente Corrispondente di tutto
+il software contenuto nel prodotto che @`e coperto da questa Licenza, su un
+supporto fisico duraturo comunemente utilizzato per lo scambio di software, ad
+un prezzo non superiore al costo ragionevole per effettuare fisicamente tale
+distribuzione del sorgente, oppure (2) accesso alla copia del Sorgente
+Corrispondente attraverso un server di rete senza alcun costo aggiuntivo.
+
+@item
+Distribuendo copie singole del codice oggetto assieme ad una copia
+dell'offerta scritta di fornire il Sorgente Corrispondente. Questa possibilit@`a
+@`e permessa soltanto occasionalmente e per fini non commerciali, e solo se tu
+hai ricevuto il codice oggetto assieme ad una tale offerta, in accordo alla
+sezione 6b.
+
+@item
+Distribuendo il codice oggetto mediante accesso da un luogo designato (gratis
+o dietro pagamento di un prezzo), e offrendo un accesso equivalente al
+Sorgente Corrispondente alla stessa maniera a partire dallo stesso luogo senza
+costi aggiuntivi. Non devi obbligare i destinatari a copiare il Sorgente
+Corrispondente assieme al codice oggetto. Se il luogo dal quale copiare il
+codice oggetto @`e un server di rete, il Sorgente Corrispondente pu@`o trovarsi su
+un server differente (gestito da te o da terze parti) che fornisca
+funzionalit@`a equivalenti per la copia, a patto che tu fornisca delle
+indicazioni chiare accanto al codice oggetto che indichino dove trovare il
+Sorgente Corrispondente. Indipendentemente da quale server ospiti il Sorgente
+Corrispondente, tu rimani obbligato ad assicurare che esso rimanga disponibile
+per tutto il tempo necessario a soddisfare queste condizioni.
+
+@item
+Distribuendo il codice oggetto mediante trasmissione peer-to-peer, a patto che
+tu informi gli altri peer circa il luogo in cui il codice oggetto e il
+Sorgente Corrispondente sono gratuitamente offerti al pubblico secondo i
+termini della sezione 6d.
+
+@end enumerate
+
+Una porzione separabile del codice oggetto, il cui sorgente @`e escluso dal
+Sorgente Corrispondente e trattato come Libreria di Sistema, non deve essere
+obbligatoriamente inclusa nella distribuzione del codice oggetto del
+programma.
+
+Un ``Prodotto Utente'' @`e un (1) ``prodotto consumer'', cio@`e qualunque propriet@`a
+personale tangibile che @`e normalmente utilizzata per scopi personali,
+familiari o domestici, oppure (2) qualunque cosa progettata o venduta per
+essere utilizzata in ambiente domestico. Nella classificazione di un prodotto
+come ``prodotto consumer'', i casi dubbi andranno risolti in favore dell'ambito
+di applicazione. Per un dato prodotto ricevuto da un dato utente, ``normalmente
+utilizzato'' si riferisce ad un uso tipico o comune di quella classe di
+prodotti, indipendentemente dallo stato dell'utente specifico o dal modo in
+cui l'utente specifico utilizza, o si aspetta o ci si aspetta che utilizzi, il
+prodotto. Un prodotto @`e un ``prodotto consumer'' indipendentemente dal fatto che
+abbia usi commerciali, industriali o diversi da quelli ``consumer'', a meno che
+questi usi non rappresentino il solo modo utile di utilizzare il prodotto in
+questione.
+
+Le ``Informazioni di Installazione'' per un Prodotto Utente sono i metodi, le
+procedure, le chiavi di autorizzazioni o altre informazioni necessarie per
+installare ed eseguire versioni modificate di un programma coperto da questa
+Licenza all'interno di un Prodotto Utente, a partire da versioni modificate
+dei suoi Sorgenti Corrispondenti. Tali informazioni devono essere sufficienti
+ad assicurare che il funzionamento del codice oggetto modificato non sia in
+nessun caso proibito o ostacolato per il solo fatto che sono state apportate
+delle modifiche.
+
+Se distribuisci un codice oggetto secondo le condizioni di questa sezione in,
+o assieme, o specificatamente per l'uso in o con un Prodotto Utente, e la
+distribuzione avviene come parte di una transazione nella quale il diritto di
+possesso e di uso del Prodotto Utente viene trasferito al destinatario per
+sempre o per un periodo prefissato (indipendentemente da come la transazione
+sia caratterizzata), il Sorgente Corrispondente distribuito secondo le
+condizioni di questa sezione deve essere accompagnato dalle Informazioni di
+Installazione. Questa condizione non @`e richiesta se n@`e tu n@`e una terza parte
+ha la possibilit@`a di installare versioni modificate del codice oggetto sul
+Prodotto Utente (per esempio, se il programma @`e installato su una ROM)
+
+La condizione che richiede di fornire delle Informazioni di Installazione non
+implica che venga fornito supporto, garanzia o aggiornamenti per un programma
+che @`e stato modificato o installato dal destinatario, o per il Prodotto Utente
+in cui esso @`e stato modificato o installato. L'accesso ad una rete pu@`o essere
+negato se le modifiche apportate impattano materialmente sull'operativit@`a
+della rete o se violano le regole e i protocolli di comunicazione attraverso
+la rete.
+
+Il Sorgente Corrispondente distribuito, e le Informazioni di Installazione
+fornite, in accordo con questa sezione, devono essere in un formato che sia
+pubblicamente documentato (e con una implementazione pubblicamente disponibile
+in formato di codice sorgente), e non devono richiedere speciali password o
+chiavi per essere spacchettate, lette o copiate.
+
+@item Condizioni Aggiuntive
+
+Le ``Condizioni Aggiuntive'' sono condizioni che completano le condizioni di
+questa Licenza permettendo delle eccezioni a una o pi@`u delle condizioni sopra
+elencate. Le condizioni aggiuntive che sono applicabili all'intero Programma
+devono essere considerate come se fossero incluse in questa Licenza, a patto
+che esse siano valide secondo le normative vigenti. Se alcune condizioni
+aggiuntive fanno riferimento soltanto ad alcune parti del Programma, quelle
+parti possono essere utilizzate separatamente sotto le stesse condizioni, ma
+l'intero Programma rimane sottoposto a questa Licenza senza riferimento ad
+alcuna condizione aggiuntiva.
+
+Quando distribuisci una copia di un programma coperto da questa Licenza, puoi,
+a tua discrezione, eliminare qualunque condizione aggiuntiva dalla copia, o da
+parte di essa. (Le Condizioni Aggiuntive possono essere scritte in maniera
+tale da richiedere la loro rimozione in certi casi di modifica del Programma).
+Puoi aggiungere Condizioni Aggiuntive su materiale, aggiunto da te ad un'opera
+coperta da questa Licenza, per il quale hai o puoi garantire un'adeguata
+licenza di copyright.
+
+Indipendentemente da qualunque altra condizione di questa Licenza, e per il
+materiale che aggiungi ad un'opera coperta da questa Licenza, puoi (se
+autorizzato dai legittimi detentori del copyright per il suddetto materiale)
+aggiungere alle condizioni di questa Licenza delle condizioni che:
+
+@enumerate a
+@item
+Negano la garanzia o limitano la responsabilit@`a del Programma in maniera
+differente da quanto riportato nelle sezioni 15 e 16 di questa Licenza; oppure
+
+@item
+Richiedono il mantenimento di specifiche e circostanziate informative legali o
+di note di attribuzione ad autori nel materiale o assieme alle Adeguate
+Informazioni Legali mostrate dal Programma che lo contiene; oppure
+
+@item
+Proibiscono di fornire informazioni errate o ingannevoli sull'origine e la
+provenienza del materiale in oggetto, o richiedono che versioni modificate di
+tale materiale siano appositamente marcate in maniera differente rispetto alla
+versione originale; oppure
+
+@item
+Limitano l'utilizzo per scopi pubblicitari del nome dei detentori del
+copyright o degli autori del materiale; oppure
+
+@item
+Rifiutano di garantire diritti secondo le leggi sulla propriet@`a intellettuale
+circa l'uso di nomi, marchi di fabbrica o similari; oppure
+
+@item
+Richiedono l'indennizzo dei detentori del copyright o degli autori del
+materiale in oggetto da parte di chi distribuisce il materiale (o versioni
+modificate dello stesso) con impegni contrattuali circa la responsabilit@`a nei
+confronti del destinatario, per qualunque responsabilit@`a che questi impegni
+contrattuali dovessero imporre direttamente ai suddetti detentori del
+copyright e autori.
+@end enumerate
+
+Tutte le altre condizioni addizionali non-permissive sono considerate
+``ulteriori restrizioni'', secondo il significato specificato alla sezione 10.
+Se il Programma o parti di esso contengono, all'atto della ricezione dello
+stesso, informative che specificano che esso @`e soggetto a questa Licenza
+assieme ad una condizione che @`e una ``ulteriore restrizione'', puoi rimuovere
+quest'ultima condizione. Se un documento di licenza contiene ulteriori
+restrizioni ma permette di rilicenziare o distribuire il Programma con questa
+Licenza, puoi aggiungere al Programma del materiale coperto dalle condizioni
+di quel documento di licenza, a patto che le ulteriori restrizioni non
+compaiano nelle versioni rilicenziate o ridistribuite.
+
+Se aggiungi ad un Programma coperto da questa Licenza delle condizioni
+aggiuntive in accordo con questa sezione, devi aggiungere anche, nei file
+sorgenti corrispondenti, un avviso che riassuma le condizioni aggiuntive
+applicate a quei file, ovvero un avviso che specifichi dove @`e possibile
+trovare copia delle condizioni aggiunte.
+
+Tutte le Condizioni aggiuntive, permissive o non-permissive, devono essere
+espresse nella forma di una licenza scritta e separata, o espresse
+esplicitamente come eccezioni; in entrambi i casi valgono le condizioni
+succitate.
+
+@item Cessazione di Licenza
+
+Non puoi propagare o modificare un programma coperto da questa Licenza in
+maniera diversa da quanto espressamente consentito da questa Licenza.
+Qualunque tentativo di propagare o modificare altrimenti il Programma @`e nullo,
+e provoca l'immediata cessazione dei diritti garantiti da questa Licenza
+(compresi tutte le eventuali licenze di brevetto garantite ai sensi del terzo
+paragrafo della sezione 11).
+
+In ogni caso, se cessano tutte le violazioni di questa Licenza, allora la tua
+licenza da parte di un dato detentore del copyright viene ripristinata (a) in
+via cautelativa, a meno che e fino a quando il detentore del copyright non
+cessa esplicitamente e definitivamente la tua licenza, e (b) in via permanente
+se il detentore del copyright non ti notifica in alcun modo la violazione
+entro 60 giorni dalla cessazione della licenza.
+
+Inoltre, la tua licenza da parte di un dato detentore del copyright viene
+ripristinata in maniera permanente se il detentore del copyright ti notifica
+la violazione in maniera adeguata, se questa @`e la prima volta che ricevi una
+notifica di violazione di questa Licenza (per qualunque Programma) dallo
+stesso detentore di copyright, e se rimedi alla violazione entro 30 giorni
+dalla data di ricezione della notifica di violazione.
+
+La cessazione dei tuoi diritti come specificato in questa sezione non provoca
+la cessazione delle licenze di terze parti che abbiano ricevuto copie o
+diritti da te secondo questa Licenza. Se i tuoi diritti cessano e non sono
+ristabiliti in via permanente, non hai diritto di ricevere nuove licenze per
+lo stesso materiale, secondo quanto stabilito nella sezione 10.
+
+@item L'ottenimento di copie non richiede l'accettazione della Licenza
+
+Non sei obbligato ad accettare i termini di questa Licenza al solo fine di
+ottenere o eseguire una copia del Programma. Similmente, propagazioni
+collaterali di un Programma coperto da questa Licenza che occorrono come
+semplice conseguenza dell'utilizzo di trasmissioni peer-to-peer per la
+ricezione di una copia non richiedono l'accettazione della Licenza. In ogni
+caso, solo e soltanto questa Licenza ti garantiscono il permesso di propagare
+e modificare qualunque programma coperto da questa Licenza. Queste azioni
+violano le leggi sul copyright nel caso in cui tu non accetti questa Licenza.
+Pertanto, modificando o propagando un programma coperto da questa Licenza,
+indichi implicitamente la tua accettazione della Licenza.
+
+@item Licenza Automatica per i successivi destinatari
+
+Ogni qual volta distribuisci un programma coperto da questa Licenza, il
+destinatario riceve automaticamente una licenza, dal detentore originario del
+copyright, di eseguire, modificare e propagare il programma, nel rispetto di
+questa Licenza. Non sei ritenuto responsabile del rispetto di questa Licenza
+da parte di terze parti.
+
+Una ``transazione d'entit@`a'' @`e una transazione che trasferisce il controllo di
+una organizzazione, o sostanzialmente di tutti i suoi beni, che suddivide una
+organizzazione o che fonde pi@`u organizzazioni. Se la propagazione di un
+programma coperto da questa Licenza @`e conseguente ad una transazione di
+entit@`a, ciascuna parte che ha ruolo nella transazione e che riceve una copia
+del programma riceve allo stesso tempo qualsiasi licenza sul programma che i
+predecessori della parte possedevano o potevano rilasciare nel rispetto del
+paragrafo precedente, e in pi@`u il diritto di possesso del Sorgente
+Corrispondente del programma dal predecessore in interesse, se il predecessore
+lo possiede o se pu@`o ottenerlo senza troppe difficolt@`a.
+
+Non puoi imporre nessuna ulteriore restrizione sull'esercizio dei diritti
+garantiti o affermati da questa Licenza. Per esempio, non puoi imporre un
+prezzo di licenza, una royalty, o altri costi per l'esercizio dei diritti
+garantiti da questa Licenza, a non puoi dar corso ad una controversia (ivi
+incluse le controversie incrociate o la difesa in cause legali) affermando che
+siano stati violati dei brevetti a causa della produzione, dell'uso, della
+vendita, della messa in vendita o dell'importazione del Programma o di sue
+parti.
+
+@item Brevetti
+
+Un ``contribuente'' @`e un detentore di copyright che autorizza l'uso secondo
+questa Licenza di un Programma o di un'opera basata sul Programma. L'opera
+cos@`{@dotless{i}} licenziata viene chiamata ``versione del contribuente''.
+
+I ``diritti essenziali di brevetto'' da parte di un contribuente sono tutti i
+diritti di brevetto che appartengono o che sono controllati dal contribuente,
+che siano gi@`a acquisiti o che saranno acquisiti in futuro, che possano essere
+violati in qualche maniera, consentita da questa Licenza, generando,
+modificando o vendendo la versione del contribuente, ma non includono i
+diritti che possano essere violati soltanto come conseguenza di ulteriori
+modifiche alla versione del contribuente. In relazione a questa definizione,
+il termine ``controllo'' include il diritto di garantire sottolicenze di
+brevetto in maniera consistente con le condizioni di questa Licenza.
+
+Ciascun contribuente ti garantisce la licenza di brevetto sui diritti
+essenziali di brevetto del contribuente stesso non-esclusiva, valida in tutto
+il mondo, esente da royalty, di creare, usare, vendere, offrire in vendita,
+importare e altrimenti eseguire, modificare e propagare i contenuti della
+versione del contribuente.
+
+Nei tre paragrafi successivi, con ``licenza di brevetto'' si intende qualunque
+accordo o contratto, comunque denominato, di non rivendicazione di un brevetto
+(come per esempio un permesso esplicito di utilizzare un brevetto o un accordo
+di rinuncia alla persecuzione per violazione di brevetto). ``Garantire'' una
+tale licenza di brevetto ad una parte significa portare a termine un tale
+accordo o contratto di non rivendicazione di brevetto contro la parte.
+
+Se distribuisci un programma coperto da questa Licenza, confidando
+consapevolmente su una licenza di brevetto, e il Sorgente Corrispondente per
+il programma non @`e reso disponibile per la copia, senza alcun onere aggiuntivo
+e comunque nel rispetto delle condizioni di questa Licenza, attraverso un
+server di rete pubblicamente accessibile o tramite altri mezzi facilmente
+accessibili, allora devi (1) fare in modo che il Sorgente Corrispondente sia
+reso disponibile come sopra, oppure (2) fare in modo di rinunciare ai benefici
+della licenza di brevetto per quel particolare programma, oppure (3)
+adoperarti, in maniera consistente con le condizioni di questa Licenza, per
+estendere la licenza di brevetto a tutti i destinatari successivi. ``Confidare
+consapevolmente'' significa che tu sei attualmente cosciente che, eccettuata la
+licenza di brevetto, la distribuzione da parte tua di un programma protetto da
+questa Licenza in un paese, o l'utilizzo in un paese del programma coperto da
+questa Licenza da parte di un destinatario, pu@`o violare uno o pi@`u brevetti in
+quel paese che tu hai ragione di ritenere validi.
+
+Se, come conseguenza o in connessione con una singola transazione o con un
+dato accordo, distribuisci, o fai in modo di distribuire, un programma coperto
+da questa Licenza, e garantisci una licenza di brevetto per alcune delle parti
+che ricevono il Programma autorizzandole ad utilizzare, propagare, modificare
+o distribuire una specifica copia del Programma, allora la licenza di brevetto
+che fornisci @`e automaticamente estesa a tutti i destinatari del Programma
+coperto da questa Licenza e delle opere basate sul Programma.
+
+Una licenza di brevetto @`e ``discriminatoria'' se non include nell'ambito della
+sua copertura, proibisce l'esercizio, o @`e vincolata al non-esercizio di uno o
+pi@`u dei diritti che sono specificatamente garantiti da questa Licenza. Non
+puoi distribuire un Programma coperto da questa Licenza se sei parte di un
+accordo con una terza parte la cui attivit@`a comprende la distribuzione di
+software, secondo il quale tu sei costretto ad un pagamento alla parte terza
+in funzione della tua attivit@`a di distribuzione del Programma, e in
+conseguenza del quale la parte terza garantisce, a qualunque delle parti che
+riceveranno il Programma da te, una licenza di brevetto discriminatoria (a)
+assieme a copie del Programma coperto da questa Licenza distribuite da te (o
+ad altre copie fatte da codeste copie), oppure (b) principalmente per e in
+connessione con specifici prodotti o raccolte di prodotti che contengono il
+Programma, a meno che l'accordo non sia stato stipulato, o le licenze di
+brevetto non siano state rilasciate, prima del 28 Marzo 2007.
+
+Nessuna parte di questa Licenza pu@`o essere interpretata come atta ad escludere
+o limitare gli effetti di qualunque altra licenza o altri meccanismi di difesa
+dalla violazione che possano altrimenti essere resi disponibili dalla
+normativa vigente in materia di brevetti.
+
+@item Nessuna resa di libert@`a altrui
+
+Se ti vengono imposte delle condizioni (da un ordine giudiziario, da un
+accordo o da qualunque altra eventualit@`a) che contraddicono le condizioni di
+questa Licenza, non sei in nessun modo esonerato dal rispetto delle condizioni
+di questa Licenza. Se non puoi distribuire un Programma coperto da questa
+Licenza per sottostare simultaneamente agli obblighi derivanti da questa
+Licenza e ad altri obblighi pertinenti, allora non puoi distribuire il
+Programma per nessun motivo. Per esempio, se accetti delle condizioni che ti
+obbligano a richiedere il pagamento di una royalty per le distribuzioni
+successivamente effettuate da coloro ai quali hai distribuito il Programma,
+l'unico modo per soddisfare sia queste condizioni che questa Licenza @`e evitare
+del tutto la distribuzione del Programma.
+
+@item Utilizzo con la GNU Affero General Public License
+
+Indipendentemente da qualunque altra condizione espressa da questa Licenza,
+hai il permesso di collegare o combinare qualunque Programma coperto da questa
+Licenza con un'opera rilasciata sotto la versione 3 della licenza GNU Affero
+General Public License, ottenendo un singolo Programma derivato, e di
+distribuire il Programma risultante. Le condizioni di questa Licenza
+continuano a valere per le parti riguardanti il Programma che sono coperte da
+questa Licenza, mentre le condizioni speciali della GNU Affero General Public
+License, sezione 13, riguardanti l'interazione mediante rete, saranno
+applicate al Programma cos@`{@dotless{i}} risultante.
+
+@item Versioni rivedute di questa Licenza
+
+La Free Software Foundation pu@`o pubblicare delle versioni rivedute e/o delle
+nuove versioni della GNU General Public License di tanto in tanto. Tali
+versioni saranno simili, nello spirito, alla presente versione, ma potranno
+differire nei dettagli al fine di affrontare nuovi problemi e nuove
+situazioni.
+
+A ciascuna versione viene assegnato un numero identificativo di versione. Se
+il Programma specifica che si applica a s@`e stesso una certa versione della GNU
+General Public License, ``o qualunque altra versione successiva'', hai la
+possibilit@`a di sottostare alle condizioni di quella specifica versione o di
+qualunque altra versione successiva pubblicata dalla Free Software Foundation.
+Se il Programma non specifica un numero di versione della GNU General Public
+License, puoi scegliere qualunque versione della GNU General Public License
+pubblicata dalla Free Software Foundation.
+
+Se il Programma specifica che un sostituto o un procuratore pu@`o decidere quali
+versioni future della GNU General Public License posso essere utilizzate,
+allora tale scelta di accettazione di una data versione ti autorizza, in
+maniera permanente, ad utilizzare quella versione della Licenza per il
+Programma.
+
+Versioni successive della Licenza possono garantire diritti aggiuntivi o
+leggermente differenti. Ad ogni modo, nessun obbligo aggiuntivo viene imposto
+agli autori o ai detentori di copyright come conseguenza della tua scelta di
+adottare una versione successiva della Licenza.
+
+@item Rinuncia alla Garanzia
+
+NON C'@`E NESSUNA GARANZIA PER IL PROGRAMMA, PER QUANTO CONSENTITO DALLE
+VIGENTI NORMATIVE. ECCETTO QUANDO ALTRIMENTI STABILITO PER ISCRITTO, I
+DETENTORI DEL COPYRIGHT E/O LE ALTRE PARTI FORNISCONO IL PROGRAMMA ``COS@`I COME
+@`E'' SENZA GARANZIA DI ALCUN TIPO, N@'E ESPRESSA N@'E IMPLICITA, INCLUSE, MA NON
+LIMITATE A, LE GARANZIE DI COMMERCIABILIT@`A O DI UTILIZZABILIT@`A PER UN
+PARTICOLARE SCOPO. L'INTERO RISCHIO CONCERNENTE LA QUALIT@`A E LE PRESTAZIONI
+DEL PROGRAMMA @`E DEL LICENZIATARIO. SE IL PROGRAMMA DOVESSE RISULTARE
+DIFETTOSO, IL LICENZIATARIO SI ASSUME I COSTI DI MANUTENZIONE, RIPARAZIONE O
+CORREZIONE.
+
+@item Limitazione di Responsabilit@`a
+
+IN NESSUN CASO, A MENO CHE NON SIA RICHIESTO DALLA NORMATIVA VIGENTE O
+CONCORDATO PER ISCRITTO, I DETENTORI DEL COPYRIGHT, O QUALUNQUE ALTRA PARTE
+CHE MODIFICA E/O DISTRIBUISCE IL PROGRAMMA SECONDO LE CONDIZIONI PRECEDENTI,
+POSSONO ESSERE RITENUTI RESPONSABILI NEI CONFRONTI DEL LICENZIATARIO PER
+DANNI, INCLUSO QUALUNQUE DANNEGGIAMENTO GENERICO, SPECIALE, INCIDENTALE O
+CONSEQUENZIALE DOVUTO ALL'USO O ALL'IMPOSSIBILIT@`A D'USO DEL PROGRAMMA
+(INCLUSI, MA NON LIMITATI A, LE PERDITE DI DATI, LA CORRUZIONE DI DATI, LE
+PERDITE SOSTENUTE DAL LICENZIATARIO O DA TERZE PARTI O L'IMPOSSIBILIT@`A DEL
+PROGRAMMA A FUNZIONARE ASSIEME AD ALTRI PROGRAMMI), ANCHE NEL CASO IN CUI IL
+DETENTORE O LE ALTRE PARTI SIANO STATI AVVISATI CIRCA LA POSSIBILIT@`A DI TALI
+DANNEGGIAMENTI.
+
+@item Interpretazione delle Sezioni 15 e 16
+
+Se la dichiarazione di garanzia e la limitazione di responsabilit@`a fornite
+precedentemente non hanno effetto legale in un paese a causa delle loro
+condizioni, le corti di giustizia devono applicare la norma locale che pi@`u si
+avvicini al rifiuto assoluto di qualsivoglia responsabilit@`a civile relativa al
+Programma, a meno che una garanzia o una assunzione di responsabilit@`a scritta
+non accompagni una copia del programma ottenuta dietro pagamento.
+@end enumerate
+
+@c fakenode --- for prepinfo
+@heading FINE DEI TERMINI E DELLE CONDIZIONI
+
+@c fakenode --- for prepinfo
+@heading Come applicare queste condizioni di Licenza ai vostri programmi
+
+Se sviluppi un nuovo programma, e vuoi che esso sia della massima utilit@`a, il
+modo migliore @`e renderlo software libero in modo che chiunque possa
+ridistribuirlo e modificarlo secondo i termini di questa Licenza.
+
+Per fare ci@`o, allega le seguenti note informative al programma. Il modo
+migliore @`e inserirle all'inizio di ciascun file sorgente, al fine di rimarcare
+adeguatamente la mancanza di garanzia; ciascun file dovrebbe inoltre contenere
+la dichiarazione di copyright e un riferimento al posto in cui @`e possibile
+ottenere la versione completa delle note informative.
+
+@smallexample
+@var{<una riga con nome del programma e breve descrizione di ci@`o che fa.>}
+Copyright (C) @var{<anno>} @var{<nome dell'autore>}
+
+Questo software @`e libero; lo puoi distribuire e/o modificare alle condizioni
+stabilite nella 'GNU General Public License' pubblicata dalla Free Software
+Foundation; fai riferimento alla versione 3 della Licenza, o (a tua scelta)
+a una qualsiasi versione successiva.
+
+Questo programma @`e distribuito con la speranza che sia utile, ma SENZA
+ALCUNA GARANZIA; senza neppure la garanzia implicita di COMMERCIABILIT@`A o
+IDONEIT@`A AD UN PARTICOLARE SCOPO. Si veda la 'GNU General Public License' per
+ulteriori dettagli.
+
+Dovresti aver ricevuto una copia della GNU General Public License assieme a
+questo programma; se non @`e cos@`{@dotless{i}}, vedere
+@url{https://www.gnu.org/licenses/}.
+@end smallexample
+
+Inoltre, aggiungi le informazioni necessarie a contattarti via posta ordinaria
+o via posta elettronica.
+
+Se il programma interagisce mediante terminale, fai in modo che visualizzi,
+quando viene avviato in modalit@`a interattiva, un breve messaggio come quello
+che segue:
+
+@smallexample
+@var{<programma>} Copyright (C) @var{<anno>} @var{<nome dell'autore>}
+Questo programma non ha ALCUNA GARANZIA; per dettagli usare il comando
+@samp{show w}.
+Questo @`e software libero, e ognuno @`e libero di ridistribuirlo
+sotto certe condizioni; usare il comando @samp{show c} per i dettagli.
+@end smallexample
+
+Gli ipotetici comandi @samp{show w} e @samp{show c} devono visualizzare le parti
+corrispondenti della GNU General Public License. Naturalmente i comandi del
+tuo programma potrebbero essere differenti; per una interfaccia di tipo GUI,
+dovresti usare un bottone ``About'' o ``Info''.
+
+Devi inoltre fare in modo che il tuo datore di lavoro (se lavori come
+programmatore presso terzi) o la tua scuola, eventualmente, firmino una
+``rinuncia al copyright'' sul programma, se necessario. Per maggiori
+informazioni su questo punto, e su come applicare e rispettare la GNU GPL,
+consultare la pagina @url{https://www.gnu.org/licenses/}.
+
+La GNU General Public License non consente di incorporare il programma
+all'interno di software proprietario. Se il tuo programma @`e una libreria di
+funzioni, potresti ritenere pi@`u opportuno consentire il collegamento tra
+software proprietario e la tua libreria. Se @`e questo ci@`o che vuoi, allora
+utilizza la GNU Lesser General Public License anzich@'e questa Licenza, ma prima
+leggi @url{https://www.gnu.org/philosophy/why-not-lgpl.html}.
+
+@ifclear FOR_PRINT
+@c The GNU Free Documentation License.
+@node Licenza per Documentazione Libera GNU (FDL)
+@unnumbered Licenza per Documentazione Libera GNU (FDL)
+@ifnotdocbook
+@center Versione 1.3, 3 Novembre 2008
+@end ifnotdocbook
+
+@docbook
+<subtitle>Versione 1.3, 3 Novembre 2008 </subtitle>
+@end docbook
+
+@cindex FDL (Free Documentation License)
+@cindex Free Documentation License (FDL)
+@cindex GNU Free Documentation License
+
+@c This file is intended to be included within another document,
+@c hence no sectioning command or @node.
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{https://fsf.org}
+
+This is an unofficial translation of the GNU Free Documentation License into
+Italian. It was not published by the Free Software Foundation, and does not
+legally state the distribution terms for software that uses the GNU FDL---only
+the original English text of the GNU FDL does that. However, we hope that this
+translation will help Italian speakers understand the GNU FDL better.
+
+Questa @`e una traduzione non ufficiale della GNU Free Documentation License
+in italiano. Non @`e una pubblicazione della Free Software Foundation, e non
+ha validit@`a legale per i termini di distribuzione della documentazione che
+usa la GNU FDL; solo il testo originale inglese della GNU FDL ha tale
+validit@`a. Comunque, speriamo che questa traduzione aiuti chi parla
+italiano a comprendere meglio la GNU FDL.
+
+A chiunque @`e permesso copiare e ridistribuire copie esatte di questo documento
+di licenza, ma non @`e in alcun modo consentito apportarvi modifiche.
+
+@end display
+
+@enumerate 0
+@item
+PREAMBOLO
+
+Lo scopo di questa licenza @`e di rendere @dfn{liberi} un manuale, un testo o
+altri documenti funzionali e utili, nel senso di assicurare a tutti la
+libert@`a effettiva di copiarli e ridistribuirli, con o senza modifiche, con
+o senza fini di lucro. In secondo luogo questa licenza prevede per autori
+ed editori il modo per ottenere il giusto riconoscimento del proprio
+lavoro, preservandoli dall'essere considerati responsabili per modifiche
+apportate da altri.
+
+Questa licenza garantisce il ``copyleft'': questo significa che i lavori che
+derivano dal documento originale devono essere ugualmente liberi. @`E il
+complemento alla Licenza Pubblica Generale GNU, che @`e una licenza di tipo
+``copyleft'' pensata per il software libero.
+
+Questa licenza @`e stata progettata appositamente per l'uso con manuali di
+software libero, perch@'e il software libero ha bisogno di documentazione
+libera: un programma libero dovrebbe accompagnarsi a manuali che
+forniscano le stesse libert@`a del software. Questa licenza non @`e limitata
+alla manualistica del software; pu@`o essere utilizzata per ogni testo che
+tratti un qualsiasi argomento e al di l@`a dell'avvenuta pubblicazione
+cartacea. Si raccomanda l'uso di questa licenza principalmente per opere
+che abbiano fini didattici o per manuali.
+
+@item
+APPLICABILIT@`A E DEFINIZIONI
+
+Questa licenza si applica a qualsiasi manuale o altra opera, su ogni tipo
+di supporto, che contenga la nota, posta dal detentore del copyright, che
+attesti la possibilit@`a di distribuzione secondo i termini di questa
+licenza. Tale nota permette universalmente, senza pagamento di diritti e
+senza limiti di durata di utilizzare il lavoro secondo le condizioni qui
+specificate. Con ``documento'', nel seguito ci si riferisce a qualsiasi
+manuale o opera. Ogni fruitore @`e un destinatario della licenza ed @`e ad
+esso che si fa riferimento. Si conviene che la licenza viene accettata se
+si copia, modifica o distribuisce il lavoro in una maniera tale da
+richiedere il permesso secondo le leggi sul copyright.
+
+Una ``versione modificata'' del documento @`e ogni opera contenente il
+documento stesso o parte di esso, sia riprodotto alla lettera che con
+modifiche, oppure traduzioni in un'altra lingua.
+
+Una ``sezione secondaria'' @`e un'appendice cui si fa riferimento o una
+premessa del documento e riguarda esclusivamente il rapporto dell'editore
+o dell'autore del documento con l'argomento generale del documento stesso
+(o argomenti affini) e non contiene nulla che possa essere compreso
+nell'argomento principale. (Perci@`o, se il documento @`e in parte un manuale
+di matematica, una sezione secondaria non pu@`o contenere spiegazioni di
+matematica). Il rapporto con l'argomento pu@`o essere un tema collegato
+storicamente con il soggetto principale o con soggetti affini, o essere
+costituito da argomentazioni legali, commerciali, filosofiche, etiche o
+politiche pertinenti.
+
+Le ``sezioni non modificabili'' sono alcune sezioni secondarie i cui titoli
+sono esplicitamente elencati come titoli delle sezioni non modificabili
+nella nota che indica che il documento @`e realizzato sotto questa licenza.
+Se una sezione non rientra nella precedente definizione di sezione
+secondaria, allora non @`e permesso che venga definita come non
+modificabile. Il documento pu@`o anche non contenere sezioni non
+modificabili. Se nel documento non vengono indicate sezioni non
+modificabili, allora significa che non ve ne sono.
+
+I ``testi di copertina'' sono dei brevi brani di testo che sono elencati,
+nella prima o quarta pagina di copertina, nella nota che indica che il
+documento @`e rilasciato sotto questa licenza. Il testo sulla prima di
+copertina pu@`o essere composto al massimo di 5 parole mentre quello sulla
+quarta di copertina pu@`o essere al massimo di 25 parole.
+
+Una copia ``trasparente'' indica una copia leggibile da un calcolatore,
+codificata in un formato le cui specifiche sono disponibili pubblicamente,
+tale che il suo contenuto possa essere modificato in modo semplice con
+generici editor di testi o (per immagini composte da pixel) con generici
+editor di immagini o (per i disegni) con qualche editor di disegni
+ampiamente diffuso; la copia deve essere adatta al trattamento per la
+formattazione o per la conversione in una variet@`a di formati atti alla
+successiva formattazione. Una copia fatta in un formato di file, per il
+resto trasparente, i cui marcatori o assenza di tali sono stati progettati
+per intralciare o scoraggiare modifiche future da parte dei lettori non @`e
+trasparente. Un formato immagine non @`e trasparente se viene usato per
+rappresentare una notevole quantit@`a di testo. Una copia non ``trasparente''
+viene detta ``opaca''.
+
+Esempi di formati adatti per copie trasparenti sono l'@sc{ASCII} puro senza
+marcatori, il formato di ingresso per Texinfo, il formato di ingresso per
+La@TeX{}, @acronym{SGML} o @acronym{XML} accoppiati ad una @acronym{DTD}
+pubblica e disponibile, e i formati conformi agli standard @acronym{HTML}
+semplice, Postscript e @acronym{PDF} progettati per essere modificati
+manualmente. Esempio di formati immagine trasparenti includono il
+@acronym{PNG}, @acronym{XCF} e @acronym{JPG}. I formati opachi includono i
+formati proprietari che possono essere letti e modificati solo con word
+processor proprietari, @acronym{SGML} o @acronym{XML} per cui non @`e in
+genere disponibile la @acronym{DTD} o gli strumenti per il trattamento, e i
+formati @acronym{HTML}, Postscript e @acronym{PDF} generati automaticamente
+da qualche word processor esclusivamente come output.
+
+La ``pagina del titolo'' di un libro stampato indica la pagina del titolo
+stessa, pi@`u qualche pagina seguente per quanto necessario a contenere in
+modo leggibile, il materiale che la licenza prevede che compaia nella
+pagina del titolo. Per opere in formati in cui non sia contemplata
+esplicitamente la pagina del titolo, con ``pagina del titolo'' si intende il
+testo prossimo al titolo dell'opera, precedente l'inizio del corpo del
+testo.
+
+Il termine ``editore'' indica qualunque persona o entit@`a che distribuisce al
+pubblico copie del documento.
+
+Una sezione ``Intitolata XYZ'' significa una sottosezione con nome del
+documento il cui titolo sia precisamente XYZ o che contenga XYZ in
+parentesi dopo il testo che traduce XYZ in un'altra lingua (in questo caso
+XYZ sta per uno specifico nome di sezione menzionato sotto, come per i
+``Riconoscimenti'', ``Dediche'', ``Approvazioni'', o ``Storia''). Secondo questa
+definizione, ``preservare il titolo'' di tale sezione quando si modifica il
+documento, significa che essa rimane una sezione ``Intitolata XYZ''.
+
+Il Documento pu@`o includere dei limiti alla garanzia accanto alla nota
+affermante l'applicazione di questa licenza al documento. Questi limiti
+alla garanzia sono da considerare da includere come riferimento a questa
+licenza, ma solo per quanto riguarda le limitazioni alla garanzia: ogni
+altra implicazione che questi limiti alla garanzia possono avere @`e da
+considerarsi nulla e non ha effetto sul significato di questa licenza.
+
+@item
+COPIE LETTERALI
+
+Si pu@`o copiare e distribuire il documento con qualsiasi mezzo, con o senza
+fini di lucro, purch@'e tutte le copie contengano questa licenza, le note di
+copyright e l'avviso che questa licenza si applica al documento, e che non
+si aggiungano altre condizioni al di fuori di quelle della licenza stessa.
+Non si possono usare misure tecniche per impedire o controllare la lettura
+o la produzione di copie successive alle copie che si producono o
+distribuiscono. Si possono comunque accettare compensi per la copiatura.
+Se si distribuiscono un numero sufficiente di copie si devono seguire
+anche le condizioni della sezione 3.
+
+Alle stesse condizioni sopra menzionate si possono prestare copie e
+mostrarle pubblicamente.
+
+@item
+COPIARE IN NOTEVOLI QUANTIT@`A
+
+Se si pubblicano a mezzo stampa (o in formati che tipicamente posseggono
+copertine) pi@`u di 100 copie del documento, e la nota della licenza
+richiede uno o pi@`u testi di copertina, si devono includere nelle copie, in
+modo chiaro e leggibile, tutti i testi di copertina indicati: il testo
+della prima di copertina in prima di copertina e il testo di quarta di
+copertina in quarta di copertina. Ambedue devono identificare l'editore
+che pubblica il documento. La prima di copertina deve presentare il titolo
+completo con tutte le parole che lo compongono egualmente visibili ed
+evidenti. Si pu@`o aggiungere altro materiale alle copertine. Il copiare con
+modifiche limitate alle sole copertine, purch@'e si preservino il titolo e
+le altre condizioni viste in precedenza, @`e considerato alla stregua di
+copiare alla lettera.
+
+Se il testo richiesto per le copertine @`e troppo voluminoso per essere
+riprodotto in modo leggibile, se ne pu@`o mettere una prima parte (per
+quanto ragionevolmente pu@`o stare) in copertina, e continuare il resto
+nelle pagine immediatamente seguenti.
+
+Se si pubblicano o distribuiscono copie opache del documento in numero
+superiore a 100, si deve anche includere una copia trasparente leggibile
+da un calcolatore in ogni copia oppure menzionare in ogni copia opaca un
+indirizzo di rete di calcolatori pubblicamente accessibile che utilizzi un
+protocollo di rete standard pubblico, da cui si possa scaricare
+liberamente una copia trasparente completa del documento, senza materiale
+aggiuntivo. Se si adotta quest'ultima opzione, si deve prestare la giusta
+attenzione, nel momento in cui si inizia la distribuzione in quantit@`a
+elevata di copie opache, ad assicurarsi che la copia trasparente rimanga
+accessibile all'indirizzo stabilito fino ad almeno un anno dopo l'ultima
+distribuzione (direttamente o attraverso distributori o rivenditori) di
+quell'edizione al pubblico.
+
+@`E caldamente consigliato, bench@'e non obbligatorio, contattare l'autore del
+documento prima di distribuirne un numero considerevole di copie, per
+metterlo in grado di fornire una versione aggiornata del documento.
+
+@item
+MODIFICHE
+
+Si possono copiare e distribuire versioni modificate del documento
+rispettando le condizioni delle precedenti sezioni 2 e 3, purch@'e la
+versione modificata sia realizzata seguendo questa stessa licenza, con la
+versione modificata che svolga il ruolo del ``documento'', cos@`{@dotless{i}} da estendere
+la licenza sulla distribuzione e la modifica a chiunque ne possieda una
+copia. Inoltre nelle versioni modificate si deve:
+
+@enumerate A
+@item
+Usare nella pagina del titolo (e nelle copertine se ce ne sono) un titolo
+diverso da quello del documento, e da quelli di versioni precedenti (che
+devono essere elencati nella sezione storia del documento ove presenti).
+Si pu@`o usare lo stesso titolo di una versione precedente se l'editore di
+quella versione originale ne ha dato il permesso.
+
+@item
+Elencare nella pagina del titolo, come autori, una o pi@`u persone o gruppi
+responsabili in qualit@`a di autori delle modifiche nella versione
+modificata, insieme ad almeno cinque tra i principali autori del documento
+(tutti gli autori principali se sono meno di cinque), a meno che questi
+non abbiano acconsentito a liberarvi da quest'obbligo.
+
+@item
+Dichiarare nella pagina del titolo il nome dell'editore della versione
+modificata in qualit@`a di editore.
+
+@item
+Conservare tutte le note di copyright
+del documento originale.
+
+@item
+Aggiungere un'appropriata nota di copyright per
+le modifiche di seguito alle altre note di copyright.
+
+@item
+Includere, immediatamente dopo la nota di copyright, una nota di licenza
+che dia pubblicamente il permesso di usare la versione modificata nei
+termini di questa licenza, nella forma mostrata nell'Addendum alla fine di
+questo testo.
+
+@item
+Preservare in tale nota di licenza l'elenco completo di sezioni non
+modificabili e testi di copertina richiesti come previsto dalla licenza
+del documento.
+
+@item
+Includere una copia non modificata di questa licenza.
+
+@item
+Conservare la sezione intitolata ``Storia'', e il suo titolo, e aggiungere
+a questa un elemento che riporti almeno il titolo, l'anno, i nuovi autori,
+e gli editori della versione modificata come figurano nella pagina del
+titolo. Se non ci sono sezioni intitolate ``Storia'' nel documento,
+crearne una che riporti il titolo, gli autori, gli editori del documento
+come figurano nella pagina del titolo, quindi aggiungere un elemento che
+descriva la versione modificata come detto in precedenza.
+
+@item
+Conservare l'indirizzo in rete riportato nel documento, se c'@`e, al fine
+del pubblico accesso ad una copia trasparente, e possibilmente l'indirizzo
+in rete per le precedenti versioni su cui ci si @`e basati. Questi possono
+essere collocati nella sezione ``Storia''. Si pu@`o omettere un indirizzo di
+rete per un'opera pubblicata almeno quattro anni prima del documento
+stesso, o se l'originario editore della versione cui ci si riferisce ne d@`a
+il permesso.
+
+@item
+In ogni sezione di ``Ringraziamenti'' o ``Dediche'', si conservi il titolo
+della sezione, e all'interno della sezione tutta la sostanza e il tono di
+ognuno dei ringraziamenti ai contributori e/o le dediche ivi contenute.
+
+@item
+Si conservino inalterate le sezioni non modificabili del documento, nei
+propri testi e nei propri titoli. I numeri della sezione o equivalenti non
+sono considerati parte del titolo della sezione.
+
+@item
+Si cancelli ogni sezione intitolata ``Approvazioni''. Tale sezione non pu@`o
+essere inclusa nella versione modificata.
+
+@item
+Non si cambi il titolo di sezioni esistenti in ``Approvazioni'' o in modo
+tale che si possa creare confusione con i titoli di sezioni non
+modificabili.
+
+@item
+Si conservino tutti i limiti alla garanzia.
+@end enumerate
+
+
+
+Se la versione modificata comprende nuove sezioni di primaria
+importanza o appendici che ricadono in ``sezioni secondarie'', e non
+contengono materiale copiato dal documento, si ha facolt@`a di rendere non
+modificabili quante sezioni si voglia. Per fare ci@`o si aggiunga il loro
+titolo alla lista delle sezioni non modificabili nella nota di licenza
+della versione modificata. Questi titoli devono essere distinti dai titoli
+di ogni altra sezione.
+
+Si pu@`o aggiungere una sezione intitolata ``Approvazioni'', a patto che non
+contenga altro che le approvazioni alla versione modificata prodotte da
+vari soggetti--per esempio, affermazioni di revisione o che il testo @`e
+stato approvato da una organizzazione come la definizione normativa di uno
+standard.
+
+Si pu@`o aggiungere un brano fino a cinque parole come testo di prima di
+copertina e un brano fino a 25 parole come testo di quarta di copertina,
+alla fine dell'elenco dei testi di copertina nella versione modificata.
+Solamente un brano del testo di prima di copertina e uno del testo di
+quarta di copertina possono essere aggiunti (anche con adattamenti) da
+ciascuna persona o organizzazione. Se il documento include gi@`a un testo di
+copertina per la stessa copertina, precedentemente aggiunto o adattato da
+qualunque fruitore o dalla stessa organizzazione nel nome della quale si
+agisce, non se ne pu@`o aggiungere un altro, ma si pu@`o rimpiazzare il
+vecchio ottenendo l'esplicita autorizzazione dall'editore precedente che
+aveva aggiunto il testo di copertina.
+
+L'autore/i e l'editore/i del documento non danno, tramite questa licenza,
+il permesso di usare i loro nomi per pubblicizzare o asserire, anche
+implicitamente, la loro approvazione di ogni versione modificata.
+
+@item
+COMBINAZIONE DI DOCUMENTI
+
+Si pu@`o combinare il documento con altri pubblicati con questa licenza,
+seguendo i termini definiti nella precedente sezione 4 per le versioni
+modificate, a patto che si includa l'insieme di tutte le sezioni non
+modificabili di tutti i documenti originali, senza modifiche, e si
+elenchino tutte come sezioni non modificabili della combinazione di
+documenti nella licenza della stessa, mantenendo tutti i limiti alla
+garanzia.
+
+Nella combinazione @`e necessaria una sola copia di questa licenza, e pi@`u
+sezioni non modificabili possono essere rimpiazzate da una singola copia
+se identiche. Se ci sono pi@`u sezioni non modificabili con lo stesso nome
+ma contenuti differenti, si renda unico il titolo di ciascuna sezione
+aggiungendovi, alla fine e tra parentesi, il nome dell'autore o editore
+della sezione, se noti, o altrimenti un numero distintivo. Si facciano gli
+stessi aggiustamenti ai titoli delle sezioni nell'elenco delle sezioni non
+modificabili nella nota di copyright della combinazione.
+
+Nella combinazione si devono unire le varie sezioni intitolate ``Storia''
+nei vari documenti originali di partenza per formare una unica sezione
+intitolata ``Storia''; allo stesso modo si unisca ogni sezione intitolata
+``Ringraziamenti'', e ogni sezione intitolata ``Dediche''. Si devono eliminare
+tutte le sezioni intitolate ``Approvazioni''.
+
+@item
+RACCOLTE DI DOCUMENTI
+
+Si pu@`o produrre una raccolta che consista del documento e di altri
+documenti rilasciati sotto questa licenza, e rimpiazzare le singole copie
+di questa licenza nei vari documenti con una sola inclusa nella raccolta,
+solamente se si seguono le regole fissate da questa licenza per le copie
+alla lettera come se si applicassero a ciascun documento.
+
+Si pu@`o estrarre un singolo documento da tale raccolta e distribuirlo
+separatamente sotto questa licenza, solo se si inserisce una copia di
+questa licenza nel documento estratto e se si seguono tutte le altre
+regole fissate da questa licenza per le copie alla lettera del documento.
+
+@item
+AGGREGAZIONE A LAVORI INDIPENDENTI
+
+Un'unione del documento o sue derivazioni con altri documenti o lavori
+separati o indipendenti, all'interno di, o a formare un, archivio o un
+supporto, per la memorizzazione o la distribuzione, viene chiamato un
+``aggregato'' se il copyright risultante dall'unione non viene usato per
+limitare i diritti legali degli utilizzatori oltre a ci@`o che viene
+permesso dai singoli lavori. Quando il documento viene incluso in un
+aggregato, questa licenza non si applica ad altri lavori nell'aggregato
+che non siano essi stessi dei lavori derivati dal documento.
+
+Se le esigenze del testo di copertina della sezione 3 sono applicabili a
+queste copie del documento allora, se il documento @`e inferiore alla met@`a
+dell'intero aggregato i testi di copertina del documento possono essere
+piazzati in copertine che delimitano il documento all'interno
+dell'aggregato, o dell'equivalente elettronico delle copertine se il
+documento @`e in un formato elettronico. Altrimenti devono apparire nella
+copertina dell'intero aggregato.
+
+@item
+TRADUZIONE
+
+La traduzione @`e considerata un tipo di modifica, di conseguenza si possono
+distribuire traduzioni del documento nei termini della sezione 4.
+Rimpiazzare sezioni non modificabili con traduzioni richiede un
+particolare permesso da parte dei detentori del copyright, ma @`e possibile
+includere la traduzione di parti o di tutte le sezioni non modificabili in
+aggiunta alle versioni originali di queste sezioni. @`E possibile includere
+una traduzione di questa licenza, di tutte le avvertenze del documento e
+di tutti i limiti di garanzia, a condizione che si includa anche la
+versione originale in inglese della licenza completa, comprese le
+avvertenze e limitazioni di garanzia. In caso di discordanza tra la
+traduzione e la versione originale inglese di questa licenza o avvertenza
+o limitazione di garanzia, prevale sempre la versione originale inglese.
+
+Se una sezione del documento viene titolata ``Riconoscimenti'', ``Dediche'', o
+``Storia'', il requisito (sezione 4) di preservare il titolo (sezione 1)
+richieder@`a tipicamente il cambiamento del titolo.
+
+@item
+CESSAZIONE DELLA LICENZA
+
+Non si pu@`o sublicenziare il documento, copiarlo, modificarlo, o
+distribuirlo al di fuori dei termini espressamente previsti da questa
+licenza. Ogni altro tentativo di applicare una licenza al documento,
+copiarlo, modificarlo, o distribuirlo @`e nullo e pone fine automaticamente
+ai diritti previsti da questa licenza.
+
+In ogni caso, se cessano tutte le violazioni di questa Licenza, allora la
+specifica licenza di un particolare detentore del copyright viene
+ripristinata (a) in via provvisoria, a meno che e fino a quando il
+detentore del copyright non faccia estinguere esplicitamente e
+definitivamente la licenza, e (b) in via permanente se il detentore del
+copyright non notifica in alcun modo la violazione entro 60 giorni dalla
+cessazione della licenza.
+
+Inoltre, la licenza di un dato detentore del copyright viene ripristinata
+in maniera permanente se quest'ultimo notifica la violazione in maniera
+adeguata, se si tratta della prima volta che si riceve una notifica di
+violazione della licenza (per qualsiasi opera) dallo stesso detentore di
+copyright, e se la violazione viene corretta entro 30 giorni dalla data di
+ricezione della notifica di violazione.
+
+La cessazione dei diritti come specificato in questa sezione non provoca
+la cessazione delle licenze di terze parti che abbiano ricevuto copie o
+diritti secondo questa licenza. Se i diritti sono cessati e non sono stati
+ristabiliti in via permanente, la ricezione di una copia dello stesso
+materiale, in tutto o in parte, non d@`a alcun diritto ad utilizzarlo.
+
+@item
+REVISIONI FUTURE DI QUESTA LICENZA
+
+La Free Software Foundation pu@`o occasionalmente pubblicare versioni nuove
+o rivedute della Licenza per Documentazione Libera GNU. Le nuove versioni
+saranno simili nello spirito alla versione attuale ma potrebbero
+differirne in qualche dettaglio per affrontare nuovi problemi e concetti.
+Si veda @uref{https://www.gnu.org/copyleft/}.
+
+Ad ogni versione della licenza viene dato un numero che la distingue. Se
+il documento specifica che si riferisce ad una versione particolare della
+licenza ``o ogni versione successiva'', si ha la possibilit@`a di seguire
+termini e condizioni sia della versione specificata che di ogni versione
+successiva pubblicata (non come bozza) dalla Free Software Foundation. Se
+il documento non specifica un numero di versione particolare di questa
+licenza, si pu@`o scegliere ogni versione pubblicata (non come bozza) dalla
+Free Software Foundation. Se il documento specifica che un delegato pu@`o
+decidere quale futura versione di questa licenza pu@`o essere utilizzata,
+allora la dichiarazione pubblica di accettazione della versione, da parte
+del delegato, autorizza in maniera permanente a scegliere tale versione
+per il documento.
+
+@item
+CAMBIO DI LICENZA
+
+Il termine ``sito per la collaborazione massiva multiautore'' (o ``sito
+MMC'')
+indica qualsiasi server web che pubblica opere sottoponibili a copyright e
+fornisce a chiunque appositi strumenti per modificare tali opere. Un wiki
+pubblico modificabile da chiunque @`e un esempio di server in questione. Una
+``collaborazione massiva multiautore'' (o ``MMC'') contenuta nel sito indica
+un qualunque insieme di opere sottoponibili a copyright pubblicate sul
+sito MMC.
+
+Il termine ``CC-BY-SA'' indica la licenza Creative Commons Attribution-Share
+Alike 3.0 pubblicata dalla Creative Commons Corporation, un'organizzazione
+senza fini di lucro con sede principale a San Francisco, California, come
+anche le future versioni di tale licenza pubblicate dalla stessa
+organizzazione.
+
+``Incorporare'' significa pubblicare o ripubblicare un documento in tutto o
+in parte, come parte di un altro documento.
+
+Una MMC @`e ``qualificata a cambiare questa licenza'' se ha adottato questa
+licenza e se tutte le opere precedentemente pubblicate con questa licenza
+altrove rispetto alla MMC e successivamente incorporate del tutto o in
+parte nella MMC (1) non hanno testo di copertina o sezioni invarianti e
+(2) sono state incorporate prima del 1@sup{o} novembre 2008.
+
+L'operatore di un sito MMC pu@`o ripubblicare un MMC contenuto nel sito con
+una CC-BY-SA nello stesso sito in qualsiasi momento prima del 1@sup{o} agosto
+2009, da parte di una MMC qualificata a cambiare questa licenza.
+
+@end enumerate
+
+@c fakenode --- for prepinfo
+@unnumberedsec ADDENDUM: Come usare questa licenza per i vostri documenti
+
+Per applicare questa licenza ad un documento che si @`e scritto, si includa
+una copia della licenza nel documento e si inserisca la seguente nota di
+copyright appena dopo la pagina del titolo:
+
+@smallexample
+@group
+  Copyright (C) @var{<anno>} @var{<il vostro nome>}
+  @`E permesso copiare, distribuire e/o modificare questo documento
+  seguendo i termini della ``Licenza per documentazione libera GNU'', versione 1.3
+  o ogni versione successiva pubblicata dalla Free Software Foundation;
+  senza sezioni non modificabili, senza testi di prima di copertina e di quarta di copertina.
+  Una copia della licenza @`e inclusa nella sezione intitolata
+  ``Licenza per la documentazione libera GNU''.
+@end group
+@end smallexample
+
+Se ci sono sezioni non modificabili, testi di prima di copertina e di
+quarta di copertina, scrivere nella parte ``with@dots{} di copertina'' il testo seguente:
+
+@smallexample
+@group
+    con le seguenti sezioni non modificabili @var{lista dei loro titoli},
+    con i seguenti testi di prima di copertina @var{elenco},
+    e con i seguenti testi di quarta di copertina @var{elenco},
+@end group
+@end smallexample
+
+Se esistono delle sezioni non modificabili ma non i testi di copertina, o
+qualche altra combinazione dei tre elementi sopra riportati, fondere
+assieme le due alternative in modo da conformarsi alla situazione descritta.
+
+Se il vostro documento contiene esempi non banali di programma in codice
+sorgente si raccomanda di rilasciare gli esempi contemporaneamente
+applicandovi anche una licenza di software libero di vostra scelta, come
+per esempio la Licenza Pubblica Generica GNU, al fine di permetterne l'uso
+come software libero.
+
+@end ifclear
+
+@ifnotdocbook
+@node Indice analitico
+@unnumbered Indice analitico
+@end ifnotdocbook
+@printindex cp
+
+@bye
+
+Unresolved Issues:
+------------------
+1. From ADR.
+
+   Robert J. Chassell points out that awk programs should have some indication
+   of how to use them.  It would be useful to perhaps have a "programming
+   style" section of the manual that would include this and other tips.
+
+Consistency issues:
+	/.../ regexps are in @code, not @samp
+	".." strings are in @code, not @samp
+	no @print before @dots
+	values of expressions in the text (@code{x} has the value 15),
+		should be in roman, not @code
+	Use   TAB   and not   tab
+	Use   ESC   and not   ESCAPE
+	Use   space and not   blank	to describe the space bar's character
+	The term "blank" is thus basically reserved for "blank lines" etc.
+	To make dark corners work, the @value{DARKCORNER} has to be outside
+		closing `.' of a sentence and after (pxref{...}).
+	Make sure that each @value{DARKCORNER} has an index entry, and
+		also that each `@cindex dark corner' has an @value{DARKCORNER}.
+	" " should have an @w{} around it
+	Use "non-" only with language names or acronyms, or the words bug and option and null
+	Use @command{ftp} when talking about anonymous ftp
+	Use uppercase and lowercase, not "upper-case" and "lower-case"
+		or "upper case" and "lower case"
+	Use "single precision" and "double precision", not "single-precision" or "double-precision"
+	Use alphanumeric, not alpha-numeric
+	Use POSIX-compliant, not POSIX compliant
+	Use --foo, not -Wfoo when describing long options
+	Use "Bell Laboratories", but not "Bell Labs".
+	Use "behavior" instead of "behaviour".
+	Use "coprocess" instead of "co-process".
+	Use "zeros" instead of "zeroes".
+	Use "nonzero" not "non-zero".
+	Use "runtime" not "run time" or "run-time".
+	Use "command-line" as an adjective and "command line" as a noun.
+	Use "online" not "on-line".
+	Use "whitespace" not "white space".
+	Use "Input/Output", not "input/output". Also "I/O", not "i/o".
+	Use "lefthand"/"righthand", not "left-hand"/"right-hand".
+	Use "workaround", not "work-around".
+	Use "startup"/"cleanup", not "start-up"/"clean-up"
+	Use "filesystem", not "file system"
+	Use @code{do}, and not @code{do}-@code{while}, except where
+		actually discussing the do-while.
+	Use "versus" in text and "vs." in index entries
+	Use @code{"C"} for the C locale, not ``C'' or @samp{C}.
+	The words "a", "and", "as", "between", "for", "from", "in", "of",
+		"on", "that", "the", "to", "with", and "without",
+		should not be capitalized in @chapter, @section etc.
+		"Into" and "How" should.
+	Search for @dfn; make sure important items are also indexed.
+	"e.g." should always be followed by a comma.
+	"i.e." should always be followed by a comma.
+	The numbers zero through ten should be spelled out, except when
+		talking about file descriptor numbers. > 10 and < 0, it's
+		ok to use numbers.
+	For most cases, do NOT put a comma before "and", "or" or "but".
+		But exercise taste with this rule.
+	Don't show the awk command with a program in quotes when it's
+		just the program.  I.e.
+
+			{
+				....
+			}
+
+		not
+			awk '{
+				...
+			}'
+
+	Do show it when showing command-line arguments, data files, etc, even
+		if there is no output shown.
+
+	Use numbered lists only to show a sequential series of steps.
+
+	Use @code{xxx} for the xxx operator in indexing statements, not @samp.
+	Use MS-Windows not MS Windows
+	Use MS-DOS not MS DOS
+	Use an empty set of parentheses after built-in and awk function names.
+	Use "multiFOO" without a hyphen.
+	Use "time zone" as two words, not "timezone".
+
+Date: Wed, 13 Apr 94 15:20:52 -0400
+From: rms@gnu.org (Richard Stallman)
+To: gnu-prog@gnu.org
+Subject: A reminder: no pathnames in GNU
+
+It's a GNU convention to use the term "file name" for the name of a
+file, never "pathname".  We use the term "path" for search paths,
+which are lists of file names.  Using it for a single file name as
+well is potentially confusing to users.
+
+So please check any documentation you maintain, if you think you might
+have used "pathname".
+
+Note that "file name" should be two words when it appears as ordinary
+text.  It's ok as one word when it's a metasyntactic variable, though.
+
+------------------------
+ORA uses filename, thus the macro.
+
+Suggestions:
+------------
+
+Better sidebars can almost sort of be done with:
+
+	@ifdocbook
+	@macro @sidebar{title, content}
+	@inlinefmt{docbook, <sidebar><title>}
+	\title\
+	@inlinefmt{docbook, </title>}
+	\content\
+	@inlinefmt{docbook, </sidebar>}
+	@end macro
+	@end ifdocbook
+
+
+	@ifnotdocbook
+	@macro @sidebar{title, content}
+	@cartouche
+	@center @b{\title\}
+
+	\content\
+	@end cartouche
+	@end macro
+	@end ifnotdocbook
+
+But to use it you have to say
+
+	@sidebar{Title Here,
+	@include file-with-content
+	}
+
+which sorta sucks.
+
+TODO:
+Add a section explaining recursion from ground zero. Probably
+easiest to do it with factorial as the example. Explain that
+recursion needs a stopping condition. Thanks to
+Bill Duncan <bduncan@beachnet.org> for the suggestion.
diff --git a/gawk-5.0.1/doc/it/lflashlight-small.xpic b/gawk-5.0.1/doc/it/lflashlight-small.xpic
new file mode 100644
index 00000000000..94ae774641f
--- /dev/null
+++ b/gawk-5.0.1/doc/it/lflashlight-small.xpic
@@ -0,0 +1,20 @@
+#! /usr/X11R6/bin/xpic
+80 48 160 80 8
+1 75 144 48 160 56 0 0
+2
+ 160 48 144 56
+1 76 112 48 136 56 0 0
+2
+ 112 56 136 48
+1 77 112 72 136 80 0 0
+2
+ 112 72 136 80
+5 78 128 48 144 80 0 0
+136 64 8 16
+3 79 80 56 112 72 0 0
+1 80 144 64 160 64 0 0
+2
+ 144 64 160 64
+1 81 144 72 160 80 0 0
+2
+ 144 72 160 80
diff --git a/gawk-5.0.1/doc/it/lflashlight.eps b/gawk-5.0.1/doc/it/lflashlight.eps
new file mode 100644
index 00000000000..fdb8cf31814
--- /dev/null
+++ b/gawk-5.0.1/doc/it/lflashlight.eps
@@ -0,0 +1,135 @@
+%!
+%%Creator: arnold@skeeve (Aharon Robbins)
+%%Title: rflashlight.small.xpic (xpic)
+%%CreationDate: Tue Dec 12 09:51:27 2000
+%%Pages: 1
+%%BoundingBox: 0 0 72 28.8
+%	(in inches) at 0 0, width 1, height 0.4
+%%EndComments
+% Prolog for xpic to PostScript converter
+% Author: Mark Moraes
+% $Header: x2ps.pro,v 1.2 88/03/19 16:50:09 moraes Exp 
+%	%d D - change style SOLID, DOTTED, SHORT-DASH, LONG-DASH, DOT-DASH
+%	%s F - change font to fontname
+%	%d S - change size (font size in points)
+%	(%s) rj %d t - text right just. (%d is TOPLINE, MIDLINE, BOTLINE)
+%	(%s) lj %d t - text left just. (%d is TOPLINE, MIDLINE, BOTLINE)
+%	(%s) ce %d t - text centered (%d is TOPLINE, MIDLINE, BOTLINE)
+%	%d %d l - lineto
+%	%d %d m - moveto
+%	%d %d s - spline segment
+%	x - flush line, spline
+%	<wid> <ht> <x> <y> b - box
+%	<wid> <ht> <x> <y> e - ellipse
+%	%d ss - setscale
+%	%d W - change linewidth
+%	getpagesize - gets the values of PAGEHEIGHT and PAGEWIDTH
+%	%d %d flip - translate by %d, PAGEHEIGHT - %d (this 
+%		transforms to X windows coordinates)
+save 50 dict begin /xpic exch def
+/StartXpic {newpath 0 0 moveto [] 0 setdash 0 setgray 1 setlinecap} def
+% Set defaults
+/fontname /Times-Roman def
+/ptsize 12 def
+% halign has the values for MIDLINE, TOPLINE, BOTLINE
+/halign 3 array def
+/s {rcurveto} def
+/x {stroke} def
+/l {lineto} def
+/m {moveto} def
+/b {
+	/ury exch def /urx exch def /lly exch def /llx exch def 
+	llx lly moveto urx lly lineto urx ury lineto 
+	llx ury lineto llx lly lineto stroke
+} def
+/mtrx matrix def
+/e {
+	/yc exch def /xc exch def /yrad exch def /xrad exch def
+	xc xrad add yc moveto
+	/savematrix mtrx currentmatrix def
+	xc yc translate
+	xrad yrad scale
+	0 0 1 0 360 arc
+	savematrix setmatrix stroke
+} def
+% The next three take the text string, and moveto the right horiz. position
+% leaving the string on the stack.
+/lj {} def
+/rj {dup stringwidth pop neg 0 rmoveto} def
+/ce {dup stringwidth pop 2 div neg 0 rmoveto} def
+% And this is invoked after one of the three above, and 
+% computes the vert. pos, and then displays the string.
+/t {halign exch get 0 exch rmoveto show newpath} def
+% Store an array of patterns in /styles - a pattern is an array consisting 
+% of an array and an offset. Corresp to xpic patterns
+% solid, dotted, short-dashed, long-dashed, dot-dashed
+/styles [ [] 0 ] [ [1 3] 0 ] [ [4 4] 0 ] [ [8 4] 0 ] [ [1 4 4 4] 0 ]
+	5 array astore def
+% change style to arg.
+/D {stroke styles exch get aload pop setdash newpath} def
+/W {stroke 0.5 mul setlinewidth newpath} def
+% fontbox takes a fontname off the stack, and returns an array
+% containing the values of the bottom line of the bounding box, the
+% mid line of the bounding box, and the top line of the bounding box
+% of that font, taken from the baseline, scaled to a font of size 1
+/fontbox {
+	findfont dup /FontMatrix get /fm exch def /FontBBox get aload pop
+	/ytop exch def pop /ybot exch def pop
+	/ymid ytop ybot sub 2 div def
+	0 ybot fm dtransform exch pop % botline
+	dup neg exch % midline - this works better than (ytop-ybot)/2!
+	0 ytop fm dtransform exch pop exch %topline
+	% now in the order midline, topline, botline.
+	3 array astore
+} def
+% select font
+/F {
+	dup /fontname exch def fontbox
+	/thisfontbox exch def SF 
+} def
+% set point size
+/S {/ptsize exch def SF} def
+% actually set font
+/SF {
+	fontname findfont ptsize curscale div scalefont setfont
+	thisfontbox aload pop
+	1 1 3 {
+		pop ptsize mul curscale div neg 3 1 roll
+	} for
+	halign astore pop
+} def
+% sets the scale to 72 / n, where n is on the stack, and stores the value
+% in curscale for font scaling
+/curscale 1 def
+/getpagesize{newpath clippath pathbbox /pageheight exch def 
+	/pagewidth exch def pop pop newpath} def
+/flip{pageheight exch sub translate} def
+/ss {/curscale exch 72 exch div dup dup scale def} def
+/land {90 rotate} def
+StartXpic
+%%EndProlog
+80 ss
+0.5 W
+0 D
+80 32 m
+64 24 l
+x
+32 24 m
+56 32 l
+x
+32 8 m
+56 0 l
+x
+8 16 56 16 e
+0 24 32 8 b
+64 16 m
+80 16 l
+x
+64 8 m
+80 0 l
+x
+%%Trailer
+showpage
+% Trailer for xpic to PostScript converter
+% $Header: x2ps.tra,v 1.2 89/07/02 15:59:53 moraes Exp $
+xpic end restore
diff --git a/gawk-5.0.1/doc/it/lflashlight.pdf b/gawk-5.0.1/doc/it/lflashlight.pdf
new file mode 100644
index 00000000000..4432fdd0973
--- /dev/null
+++ b/gawk-5.0.1/doc/it/lflashlight.pdf
@@ -0,0 +1,56 @@
+%PDF-1.3
+%�쏢
+6 0 obj
+<</Length 7 0 R/Filter /FlateDecode>>
+stream
+x�U�A!E�=EO����n���������51�P���)D$[�l;p�
+>���3~ �E�*����Xp��Z)IwZyB�Ț��l�jF�B�3fI��a�V
�H�T�M��V��*�R����j��owU���4�E��
��Im�t�>��1Ҫ��O>endstream
+endobj
+7 0 obj
+168
+endobj
+5 0 obj
+<</Type/Page/MediaBox [0 0 72 28.8]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ExtGState 8 0 R
+>>
+/Contents 6 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+5 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+>>
+endobj
+4 0 obj
+<</Type/ExtGState/Name/R4/TR/Identity/OPM 1/SM 0.02>>
+endobj
+8 0 obj
+<</R4
+4 0 R>>
+endobj
+2 0 obj
+<</Producer(GNU Ghostscript 7.07)>>endobj
+xref
+0 9
+0000000000 65535 f 
+0000000471 00000 n 
+0000000617 00000 n 
+0000000412 00000 n 
+0000000519 00000 n 
+0000000272 00000 n 
+0000000015 00000 n 
+0000000253 00000 n 
+0000000588 00000 n 
+trailer
+<< /Size 9 /Root 1 0 R /Info 2 0 R
+>>
+startxref
+667
+%%EOF
diff --git a/gawk-5.0.1/doc/it/margini.texi b/gawk-5.0.1/doc/it/margini.texi
new file mode 100644
index 00000000000..67b251925d9
--- /dev/null
+++ b/gawk-5.0.1/doc/it/margini.texi
@@ -0,0 +1,7 @@
+@tex
+\global\bindingoffset = 4.6mm
+@end tex
+
+@c \global\topskip = 0mm
+@c \global\baselineskip = 0mm
+@c \global\parskip = 0mm
diff --git a/gawk-5.0.1/doc/it/programma-generico.eps b/gawk-5.0.1/doc/it/programma-generico.eps
new file mode 100644
index 00000000000..db87944db33
--- /dev/null
+++ b/gawk-5.0.1/doc/it/programma-generico.eps
@@ -0,0 +1,228 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: cairo 1.12.8 (http://cairographics.org)
+%%CreationDate: Wed Dec 17 19:11:08 2014
+%%Pages: 1
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%BoundingBox: 0 -1 265 57
+%%EndComments
+%%BeginProlog
+save
+50 dict begin
+/q { gsave } bind def
+/Q { grestore } bind def
+/cm { 6 array astore concat } bind def
+/w { setlinewidth } bind def
+/J { setlinecap } bind def
+/j { setlinejoin } bind def
+/M { setmiterlimit } bind def
+/d { setdash } bind def
+/m { moveto } bind def
+/l { lineto } bind def
+/c { curveto } bind def
+/h { closepath } bind def
+/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
+      0 exch rlineto 0 rlineto closepath } bind def
+/S { stroke } bind def
+/f { fill } bind def
+/f* { eofill } bind def
+/n { newpath } bind def
+/W { clip } bind def
+/W* { eoclip } bind def
+/BT { } bind def
+/ET { } bind def
+/pdfmark where { pop globaldict /?pdfmark /exec load put }
+    { globaldict begin /?pdfmark /pop load def /pdfmark
+    /cleartomark load def end } ifelse
+/BDC { mark 3 1 roll /BDC pdfmark } bind def
+/EMC { mark /EMC pdfmark } bind def
+/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
+/Tj { show currentpoint cairo_store_point } bind def
+/TJ {
+  {
+    dup
+    type /stringtype eq
+    { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
+  } forall
+  currentpoint cairo_store_point
+} bind def
+/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
+    cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
+/Tf { pop /cairo_font exch def /cairo_font_matrix where
+      { pop cairo_selectfont } if } bind def
+/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
+      /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
+      /cairo_font where { pop cairo_selectfont } if } bind def
+/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
+      cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
+/g { setgray } bind def
+/rg { setrgbcolor } bind def
+/d1 { setcachedevice } bind def
+%%EndProlog
+11 dict begin
+/FontType 42 def
+/FontName /DroidSansFallback def
+/PaintType 0 def
+/FontMatrix [ 1 0 0 1 0 0 ] def
+/FontBBox [ 0 0 0 0 ] def
+/Encoding 256 array def
+0 1 255 { Encoding exch /.notdef put } for
+Encoding 68 /D put
+Encoding 80 /P put
+Encoding 82 /R put
+Encoding 97 /a put
+Encoding 103 /g put
+Encoding 105 /i put
+Encoding 108 /l put
+Encoding 109 /m put
+Encoding 111 /o put
+Encoding 114 /r put
+Encoding 115 /s put
+Encoding 116 /t put
+Encoding 117 /u put
+/CharStrings 14 dict dup begin
+/.notdef 0 def
+/D 1 def
+/a 2 def
+/t 3 def
+/i 4 def
+/P 5 def
+/r 6 def
+/o 7 def
+/g 8 def
+/m 9 def
+/R 10 def
+/s 11 def
+/u 12 def
+/l 13 def
+end readonly def
+/sfnts [
+<000100000009008000030010637674200000000000000498000000026670676db02159b00000
+049c00000007676c7966cf60e9770000009c000003fc68656164eb09793d000004a400000036
+68686561021600ec000004dc00000024686d747807ac012f00000500000000386c6f63610000
+1d50000005380000003c6d617870006802310000057400000020707265708014882900000594
+000000120002004b000000b500b700030007000037331523373335234b6a6a0d4f4fb7b70d9d
+000000020019000000a000b70008001100003335333216151406232715333236353426231933
+272d2f2a171422211f1fb72f2b2d30a38f242424230000000002000cfffe0074008c00170022
+0000332723062322263534373735342623220727363332161515270706061514163332363563
+04010f1b13153a170d0e11130816161a18171217110b0b1113131515132a0201080f0f0a110c
+16185e4301010e0d0b0b1413000000010004fffe005200a90015000037150623222635352335
+37373315331523151416333252090d12121414090d232309080a13110415164f0a0a1d20114f
+0d0c000200140000002f00bd000b000f0000371406232226353436333216072335332f070706
+0707060707021717ae07070707080707b6890000000200190000008600b7000a001300003715
+23353332161514062327333236353426232330172d20202221131019151515144747b71b1b1b
+1f141213111200000001001600000061008c000f000037072623220615152335331733363332
+610308060f14171203011015098b150118154a89191c0002000efffe0086008c000b00170000
+3734363332161514062322263734262322061514163332360e211b1a22211b1b216012121212
+121212124522252621232425221a1a1a1a1a1b1b000000030005ffc30080008c00250031003e
+0000371507161514062322270615141633333216151406232226353437263534372635343633
+321717342623220615141633323607232206151416333236353426801908191608020b090a16
+151522221b1a1e0c10181a170b07070d0d0d0c0d0d0c0d0e160d0e101017170b890e030b1014
+1801070a05051312181713131a08050e0e0a0a1c1719032b0e0f0f0f0e0e0e4d0c0c0b0b0e0e
+0a08000000010016000000d1008c002100003335342623220615152335342623220615152335
+3317333633321733363332161515ba0d0c1111170d0d1011171204010c1a1e09010d1d161658
+111017164c581110161c47891215171719195a00000200190000009400b7000c001500003715
+233533321615140717232727333236353426232330172c212024321b2c1d1515141317144c4c
+b71a1a240d524c13121111100001000bfffe0068008c001f000037351633323635342e023534
+36333217072623220615141e0215140623220b16130f0f0b2d0d1917151408140e0c0d0a2e0d
+1a1a1a06150b0a0a080915110c11140a12090808080914120c13150000010015fffe00810089
+0013000033272306232226353533151416333236353533156f04010c1b1717160e0d12121712
+14191959581011171b478900000100160000002d00c300030000332335332d1717c300000000
+0000b0002cb000212d000001000000024f5c133ce3d25f0f3cf5000b010000000000c3477867
+00000000c79972b4ffe9ffbc011f010b00000009000200010000000000010000010bffbc0000
+012bffe9fff6011f00010000000000000000000000000000000e0100004b00af00190088000c
+005700040042001400940019006600160094000e0085000500e50016009700190074000b0097
+001500420016000000000000002400000060000000c8000001080000014000000180000001b4
+00000200000002ac000003080000034c000003a8000003e4000003fc00010000000e00e80027
+0105001800020010002f0001000000040012000500014bb0c8514bb007535a58b9000101ff85
+8d59000000>
+] def
+/f-0-0 currentdict end definefont pop
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 0 -1 265 57
+%%EndPageSetup
+q 0 -1 265 58 rectclip q
+0 g
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 114.254 56.309 m 98.195 28.215 l 114.508 0.246 l 146.82 0.434 l 162.883
+ 28.527 l 146.57 56.496 l 114.254 56.309 l S
+Q q
+26 56.719 170 -57 re W n
+26.316 83.094 m 26.316 -25.965 l 195.043 -25.965 l 195.043 83.094 l 26.316
+ 83.094 l 83.664 24.711 m 89.629 24.711 l 89.629 31.816 l 83.664 31.816 
+l 88.406 28.266 l 83.664 24.711 l W n
+q
+26 56.719 170 -57 re W n
+[ 1 0 0 1 0 -0.28125 ] concat
+  q
+0 g
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 65.922 28.547 m 89.035 28.547 l S
+  Q
+Q
+Q q
+0 g
+87.988 26.449 m 95.547 28.34 l 87.988 30.23 l 87.988 26.449 l f*
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 88.047 26.359 m 93.973 28.25 l 88.047 30.141 l 88.047 26.359 l S
+Q q
+0 56.719 265 -57 re W n
+-3.438 57.5 m -3.438 -0.5 l 265.562 -0.5 l 265.562 57.5 l -3.438 57.5 l
+ 190.031 26.449 m 199.543 26.449 l 199.543 30.23 l 190.031 30.23 l 197.59
+ 28.34 l 190.031 26.449 l W n
+q
+0 56.719 265 -57 re W n
+[ 1 0 0 1 0 -0.28125 ] concat
+  q
+0 g
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 167.418 28.621 m 198.598 28.621 l S
+  Q
+Q
+Q q
+0 g
+190.031 26.449 m 197.59 28.34 l 190.031 30.23 l 190.031 26.449 l f*
+0.4724 w
+0 J
+0 j
+[] 0.0 d
+10 M 190.031 26.449 m 197.59 28.34 l 190.031 30.23 l 190.031 26.449 l S
+205.215 48.18 m 202.605 48.18 200.488 46.066 200.488 43.457 c 200.488 13.285
+ l 200.488 10.676 202.605 8.562 205.215 8.562 c 259.953 8.562 l 262.559 
+8.562 264.676 10.676 264.676 13.285 c 264.676 43.457 l 264.676 46.066 262.559
+ 48.18 259.953 48.18 c 205.215 48.18 l S
+BT
+10 0 0 10 21.9375 24.9167 Tm
+/f-0-0 1 Tf
+[(D)-4(a)31(t)28(i)]TJ
+8.1875 -0.05 Td
+[(P)16(r)23(o)16(g)19(r)24(a)31(m)19(m)20(a)]TJ
+11.2375 0.1 Td
+[(R)27(i)8(s)16(u)27(l)8(t)27(a)32(t)27(i)]TJ
+ET
+205.215 48.18 m 202.605 48.18 200.488 46.066 200.488 43.457 c 200.488 13.285
+ l 200.488 10.676 202.605 8.562 205.215 8.562 c 259.953 8.562 l 262.559 
+8.562 264.676 10.676 264.676 13.285 c 264.676 43.457 l 264.676 46.066 262.559
+ 48.18 259.953 48.18 c 205.215 48.18 l S
+4.965 47.805 m 2.355 47.805 0.238 45.691 0.238 43.082 c 0.238 12.91 l 0.238
+ 10.301 2.355 8.188 4.965 8.188 c 59.703 8.188 l 62.309 8.188 64.426 10.301
+ 64.426 12.91 c 64.426 43.082 l 64.426 45.691 62.309 47.805 59.703 47.805
+ c 4.965 47.805 l S
+Q Q
+showpage
+%%Trailer
+end restore
+%%EOF
diff --git a/gawk-5.0.1/doc/it/programma-generico.fig b/gawk-5.0.1/doc/it/programma-generico.fig
new file mode 100644
index 00000000000..e87f6e3b745
--- /dev/null
+++ b/gawk-5.0.1/doc/it/programma-generico.fig
@@ -0,0 +1,25 @@
+#FIG 3.2  Produced by xfig version 3.2.5c
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5805 3465 6300 3465
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 4 0 0 5
+	 4052 3779 4052 3195 3105 3195 3105 3779 4052 3779
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+	 7695 3825 7695 3195 6300 3195 6300 3825 7695 3825
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 4095 3465 4680 3465
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 0 0 0 7
+	 5490 3915 5745 3456 5475 3006 4950 3015 4695 3474 4965 3924
+	 5490 3915
+4 0 0 50 -1 0 12 0.0000 4 135 360 3375 3510 Dati\001
+4 0 0 50 -1 0 12 0.0000 4 165 810 4860 3510 Programma\001
+4 0 0 50 -1 0 12 0.0000 4 135 810 6525 3510 Risultati\001
diff --git a/gawk-5.0.1/doc/it/programma-generico.pdf b/gawk-5.0.1/doc/it/programma-generico.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..d5c751aff7a87588397f1a5e9bafa317e049b580
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/programma-generico.png b/gawk-5.0.1/doc/it/programma-generico.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a877907b9b85e2d90fc9206747e0a405cfda492
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/programma-generico.txt b/gawk-5.0.1/doc/it/programma-generico.txt
new file mode 100644
index 00000000000..1f6e512439c
--- /dev/null
+++ b/gawk-5.0.1/doc/it/programma-generico.txt
@@ -0,0 +1,4 @@
+                  _________
++------+         /         \         +-----------+
+| Dati | -----> < Programma > -----> | Risultati |
++------+         \_________/         +-----------+
diff --git a/gawk-5.0.1/doc/it/rflashlight-small.xpic b/gawk-5.0.1/doc/it/rflashlight-small.xpic
new file mode 100644
index 00000000000..9e78a3f55e4
--- /dev/null
+++ b/gawk-5.0.1/doc/it/rflashlight-small.xpic
@@ -0,0 +1,26 @@
+#! /usr/X11R6/bin/xpic
+80 48 160 80 8
+5 36 96 48 112 80 0 0
+104 64 8 16
+1 37 104 48 128 56 0 0
+2
+ 104 48 128 56
+1 38 104 72 128 80 0 0
+2
+ 104 80 128 72
+2 39 128 56 128 72 0 0
+2
+ 128 56 128 72
+3 40 128 56 160 72 0 0
+1 41 80 72 80 72 0 0
+2
+ 80 72 80 72
+1 42 80 72 96 80 0 0
+2
+ 80 80 96 72
+1 43 80 64 96 64 0 0
+2
+ 80 64 96 64
+1 45 80 48 96 56 0 0
+2
+ 96 56 80 48
diff --git a/gawk-5.0.1/doc/it/rflashlight.eps b/gawk-5.0.1/doc/it/rflashlight.eps
new file mode 100644
index 00000000000..28cb7e258ab
--- /dev/null
+++ b/gawk-5.0.1/doc/it/rflashlight.eps
@@ -0,0 +1,141 @@
+%!
+%%Creator: arnold@skeeve (Aharon Robbins)
+%%Title: flashlight.small.xpic (xpic)
+%%CreationDate: Tue Oct 24 14:41:28 2000
+%%Pages: 1
+%%BoundingBox: 0 0 72 28.8
+%	(in inches) at 0 0, width 1, height 0.4
+%%EndComments
+% Prolog for xpic to PostScript converter
+% Author: Mark Moraes
+% $Header: x2ps.pro,v 1.2 88/03/19 16:50:09 moraes Exp 
+%	%d D - change style SOLID, DOTTED, SHORT-DASH, LONG-DASH, DOT-DASH
+%	%s F - change font to fontname
+%	%d S - change size (font size in points)
+%	(%s) rj %d t - text right just. (%d is TOPLINE, MIDLINE, BOTLINE)
+%	(%s) lj %d t - text left just. (%d is TOPLINE, MIDLINE, BOTLINE)
+%	(%s) ce %d t - text centered (%d is TOPLINE, MIDLINE, BOTLINE)
+%	%d %d l - lineto
+%	%d %d m - moveto
+%	%d %d s - spline segment
+%	x - flush line, spline
+%	<wid> <ht> <x> <y> b - box
+%	<wid> <ht> <x> <y> e - ellipse
+%	%d ss - setscale
+%	%d W - change linewidth
+%	getpagesize - gets the values of PAGEHEIGHT and PAGEWIDTH
+%	%d %d flip - translate by %d, PAGEHEIGHT - %d (this 
+%		transforms to X windows coordinates)
+save 50 dict begin /xpic exch def
+/StartXpic {newpath 0 0 moveto [] 0 setdash 0 setgray 1 setlinecap} def
+% Set defaults
+/fontname /Times-Roman def
+/ptsize 12 def
+% halign has the values for MIDLINE, TOPLINE, BOTLINE
+/halign 3 array def
+/s {rcurveto} def
+/x {stroke} def
+/l {lineto} def
+/m {moveto} def
+/b {
+	/ury exch def /urx exch def /lly exch def /llx exch def 
+	llx lly moveto urx lly lineto urx ury lineto 
+	llx ury lineto llx lly lineto stroke
+} def
+/mtrx matrix def
+/e {
+	/yc exch def /xc exch def /yrad exch def /xrad exch def
+	xc xrad add yc moveto
+	/savematrix mtrx currentmatrix def
+	xc yc translate
+	xrad yrad scale
+	0 0 1 0 360 arc
+	savematrix setmatrix stroke
+} def
+% The next three take the text string, and moveto the right horiz. position
+% leaving the string on the stack.
+/lj {} def
+/rj {dup stringwidth pop neg 0 rmoveto} def
+/ce {dup stringwidth pop 2 div neg 0 rmoveto} def
+% And this is invoked after one of the three above, and 
+% computes the vert. pos, and then displays the string.
+/t {halign exch get 0 exch rmoveto show newpath} def
+% Store an array of patterns in /styles - a pattern is an array consisting 
+% of an array and an offset. Corresp to xpic patterns
+% solid, dotted, short-dashed, long-dashed, dot-dashed
+/styles [ [] 0 ] [ [1 3] 0 ] [ [4 4] 0 ] [ [8 4] 0 ] [ [1 4 4 4] 0 ]
+	5 array astore def
+% change style to arg.
+/D {stroke styles exch get aload pop setdash newpath} def
+/W {stroke 0.5 mul setlinewidth newpath} def
+% fontbox takes a fontname off the stack, and returns an array
+% containing the values of the bottom line of the bounding box, the
+% mid line of the bounding box, and the top line of the bounding box
+% of that font, taken from the baseline, scaled to a font of size 1
+/fontbox {
+	findfont dup /FontMatrix get /fm exch def /FontBBox get aload pop
+	/ytop exch def pop /ybot exch def pop
+	/ymid ytop ybot sub 2 div def
+	0 ybot fm dtransform exch pop % botline
+	dup neg exch % midline - this works better than (ytop-ybot)/2!
+	0 ytop fm dtransform exch pop exch %topline
+	% now in the order midline, topline, botline.
+	3 array astore
+} def
+% select font
+/F {
+	dup /fontname exch def fontbox
+	/thisfontbox exch def SF 
+} def
+% set point size
+/S {/ptsize exch def SF} def
+% actually set font
+/SF {
+	fontname findfont ptsize curscale div scalefont setfont
+	thisfontbox aload pop
+	1 1 3 {
+		pop ptsize mul curscale div neg 3 1 roll
+	} for
+	halign astore pop
+} def
+% sets the scale to 72 / n, where n is on the stack, and stores the value
+% in curscale for font scaling
+/curscale 1 def
+/getpagesize{newpath clippath pathbbox /pageheight exch def 
+	/pagewidth exch def pop pop newpath} def
+/flip{pageheight exch sub translate} def
+/ss {/curscale exch 72 exch div dup dup scale def} def
+/land {90 rotate} def
+StartXpic
+%%EndProlog
+80 ss
+0.5 W
+0 D
+8 16 24 16 e
+24 32 m
+48 24 l
+x
+24 0 m
+48 8 l
+x
+48 24 m
+0 0 0 -5.33333 0 -16 s
+x
+48 24 80 8 b
+0 8 m
+0 8 l
+x
+0 0 m
+16 8 l
+x
+0 16 m
+16 16 l
+x
+16 24 m
+0 32 l
+x
+%%Trailer
+showpage
+% Trailer for xpic to PostScript converter
+% $Header: x2ps.tra,v 1.2 89/07/02 15:59:53 moraes Exp $
+xpic end restore
diff --git a/gawk-5.0.1/doc/it/rflashlight.pdf b/gawk-5.0.1/doc/it/rflashlight.pdf
new file mode 100644
index 00000000000..72c8561e177
--- /dev/null
+++ b/gawk-5.0.1/doc/it/rflashlight.pdf
@@ -0,0 +1,57 @@
+%PDF-1.3
+%�쏢
+6 0 obj
+<</Length 7 0 R/Filter /FlateDecode>>
+stream
+x�E�Q� ��9'pBQ�+���eYR�%��'(]���a�5�Za��U������fO�yF�zD�E�SH|FN)�,h������S?i�Wk��*ڞ%H!F���Ю�M��\m���
+2��m���
+�t��g��H�����XTR��쬊�>@��2{�M�WV����'E�endstream
+endobj
+7 0 obj
+175
+endobj
+5 0 obj
+<</Type/Page/MediaBox [0 0 72 28.8]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ExtGState 8 0 R
+>>
+/Contents 6 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+5 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+>>
+endobj
+4 0 obj
+<</Type/ExtGState/Name/R4/TR/Identity/OPM 1/SM 0.02>>
+endobj
+8 0 obj
+<</R4
+4 0 R>>
+endobj
+2 0 obj
+<</Producer(GNU Ghostscript 7.07)>>endobj
+xref
+0 9
+0000000000 65535 f 
+0000000478 00000 n 
+0000000624 00000 n 
+0000000419 00000 n 
+0000000526 00000 n 
+0000000279 00000 n 
+0000000015 00000 n 
+0000000260 00000 n 
+0000000595 00000 n 
+trailer
+<< /Size 9 /Root 1 0 R /Info 2 0 R
+>>
+startxref
+674
+%%EOF
diff --git a/gawk-5.0.1/doc/it/sidebar.awk b/gawk-5.0.1/doc/it/sidebar.awk
new file mode 100644
index 00000000000..d1f3efc3239
--- /dev/null
+++ b/gawk-5.0.1/doc/it/sidebar.awk
@@ -0,0 +1,67 @@
+# sidebar.awk --- add support for sidebars, other stuff to gawk.texi
+
+# Copyright (C) 2013, 2016 the Free Software Foundation, Inc.
+# 
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+# 
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+BEGIN {
+	print "% ****************************************************"
+	print "% * DO NOT MODIFY THIS FILE!!!!                      *"
+	print "% * It was generated from gawktexi.in by sidebar.awk *"
+	print "% * Edit gawktexi.in instead.                        *"
+	print "% ****************************************************"
+}
+
+/^@sidebar/ {
+	sub(/^@sidebar[ \t]+/, "", $0)
+	title = $0
+	body = ""
+	collecting = 1
+	next
+}
+
+/^@end[ \t]+sidebar[ \t]*$/ {
+	collecting = 0
+	printf "@cindex sidebar, %s\n", title
+	printf "@ifdocbook\n"
+		printf "@docbook\n"
+		printf "<sidebar><title>%s</title>\n", title
+		printf "@end docbook\n"
+			print  body
+		print ""
+		printf "@docbook\n"
+		printf "</sidebar>\n"
+		printf "@end docbook\n"
+	printf "@end ifdocbook\n\n"
+
+	printf "@ifnotdocbook\n"
+		printf "@cartouche\n"
+		printf "@center @b{%s}\n\n", title
+			print  body
+		printf "@end cartouche\n"
+	printf "@end ifnotdocbook\n"
+	body = ""
+	next
+}
+
+collecting == 1 {
+	body = body RS $0
+	next
+}
+
+{ print }
diff --git a/gawk-5.0.1/doc/it/texinfo.tex b/gawk-5.0.1/doc/it/texinfo.tex
new file mode 100644
index 00000000000..2ae6710a2e2
--- /dev/null
+++ b/gawk-5.0.1/doc/it/texinfo.tex
@@ -0,0 +1,11760 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+% 
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2018-03-10.14}
+%
+% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+% 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018
+% Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software: you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation, either version 3 of the
+% License, or (at your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program.  If not, see <https://www.gnu.org/licenses/>.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. This Exception is an additional permission under section 7
+% of the GNU General Public License, version 3 ("GPLv3").
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   https://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or
+%   https://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or
+%   https://www.gnu.org/software/texinfo/ (the Texinfo home page)
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is https://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+% LaTeX's \typeout.  This ensures that the messages it is used for
+% are identical in format to the corresponding ones from latex/pdflatex.
+\def\typeout{\immediate\write17}%
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexraggedright=\raggedright
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexsp=\sp
+\let\ptexstar=\*
+\let\ptexsup=\sup
+\let\ptext=\t
+\let\ptextop=\top
+{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putworderror\undefined     \gdef\putworderror{error}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+%
+% added for Italian
+\gdef\putwordla{la}
+\gdef\putwordLa{La}
+\gdef\putwordsivedail{si veda il}
+\gdef\putwordSivedail{Si veda il}
+% Produces article before Section names
+\def\refla#1{\putwordla{} \xrefX[#1,,,,,,,]}
+\def\refLa#1{\putwordLa{} \xrefX[#1,,,,,,,]}
+% Produces article before Chapter names
+\def\pxrefil#1{\putwordsivedail{} \xrefX[#1,,,,,,,]}
+\def\pxrefIl#1{\putwordSivedail{} \xrefX[#1,,,,,,,]}
+\def\xrefil#1{\putwordsivedail{} \xrefX[#1,,,,,,,]}
+\def\xrefIl#1{\putwordSivedail{} \xrefX[#1,,,,,,,]}
+
+% Give the space character the catcode for a space.
+\def\spaceisspace{\catcode`\ =10\relax}
+
+% Likewise for ^^M, the end of line character.
+\def\endlineisspace{\catcode13=10\relax}
+
+\chardef\dashChar  = `\-
+\chardef\slashChar = `\/
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
+}%
+
+% @errormsg{MSG}.  Do the index-like expansions on MSG, but if things
+% aren't perfect, it's not the end of the world, being an error message,
+% after all.
+% 
+\def\errormsg{\begingroup \indexnofonts \doerrormsg}
+\def\doerrormsg#1{\errmessage{#1}}
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+% Output routine
+%
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt }
+
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong  \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Output a mark which sets \thischapter, \thissection and \thiscolor.
+% We dump everything together because we only have one kind of mark.
+% This works because we only use \botmark / \topmark, not \firstmark.
+%
+% A mark contains a subexpression of the \ifcase ... \fi construct.
+% \get*marks macros below extract the needed part using \ifcase.
+%
+% Another complication is to let the user choose whether \thischapter
+% (\thissection) refers to the chapter (section) in effect at the top
+% of a page, or that at the bottom of a page.
+
+% \domark is called twice inside \chapmacro, to add one
+% mark before the section break, and one after.
+%   In the second call \prevchapterdefs is the same as \lastchapterdefs,
+% and \prevsectiondefs is the same as \lastsectiondefs.
+%   Then if the page is not broken at the mark, some of the previous
+% section appears on the page, and we can get the name of this section
+% from \firstmark for @everyheadingmarks top.
+%   @everyheadingmarks bottom uses \botmark.
+%
+% See page 260 of The TeXbook.
+\def\domark{%
+  \toks0=\expandafter{\lastchapterdefs}%
+  \toks2=\expandafter{\lastsectiondefs}%
+  \toks4=\expandafter{\prevchapterdefs}%
+  \toks6=\expandafter{\prevsectiondefs}%
+  \toks8=\expandafter{\lastcolordefs}%
+  \mark{%
+                   \the\toks0 \the\toks2  % 0: marks for @everyheadingmarks top
+      \noexpand\or \the\toks4 \the\toks6  % 1: for @everyheadingmarks bottom
+    \noexpand\else \the\toks8             % 2: color marks
+  }%
+}
+
+% \gettopheadingmarks, \getbottomheadingmarks,
+% \getcolormarks - extract needed part of mark.
+%
+% \topmark doesn't work for the very first chapter (after the title
+% page or the contents), so we use \firstmark there -- this gets us
+% the mark with the chapter defs, unless the user sneaks in, e.g.,
+% @setcolor (or @url, or @link, etc.) between @contents and the very
+% first @chapter.
+\def\gettopheadingmarks{%
+  \ifcase0\topmark\fi
+  \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
+}
+\def\getbottomheadingmarks{\ifcase1\botmark\fi}
+\def\getcolormarks{\ifcase2\topmark\fi}
+
+% Avoid "undefined control sequence" errors.
+\def\lastchapterdefs{}
+\def\lastsectiondefs{}
+\def\lastsection{}
+\def\prevchapterdefs{}
+\def\prevsectiondefs{}
+\def\lastcolordefs{}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\txipagewidth \newdimen\txipageheight
+
+% Main output routine.
+%
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument.
+% \shipout a vbox for a single page, adding an optional header, footer,
+% cropmarks, and footnote.  This also causes index entries for this page
+% to be written to the auxiliary files.
+%
+\def\onepageout#1{%
+  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Common context changes for both heading and footing.
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \def\commmonheadfootline{\let\hsize=\txipagewidth \texinfochars}
+  %
+  % Retrieve the information for the headings from the marks in the page,
+  % and call Plain TeX's \makeheadline and \makefootline, which use the
+  % values in \headline and \footline.
+  %
+  % This is used to check if we are on the first page of a chapter.
+  \ifcase1\topmark\fi
+  \let\prevchaptername\thischaptername
+  \ifcase0\firstmark\fi
+  \let\curchaptername\thischaptername
+  %
+  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+  \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
+  %
+  \ifx\curchaptername\prevchaptername
+    \let\thischapterheading\thischapter
+  \else
+    % \thischapterheading is the same as \thischapter except it is blank
+    % for the first page of a chapter.  This is to prevent the chapter name 
+    % being shown twice.
+    \def\thischapterheading{}%
+  \fi
+  %
+  \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}%
+  \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}%
+  %
+  {%
+    % Set context for writing to auxiliary files like index files.
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \indexdummies         % don't expand commands in the output.
+    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
+               % the page break happens to be in the middle of an example.
+               % We don't want .vr (or whatever) entries like this:
+               % \entry{{\indexbackslash }acronym}{32}{\code {\acronym}}
+               % "\acronym" won't work when it's read back in;
+               % it needs to be
+               % {\code {{\backslashcurfont }acronym}
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+      %
+      \ifcropmarks \vbox to \outervsize\bgroup
+        \hsize = \outerhsize
+        \vskip-\topandbottommargin
+        \vtop to0pt{%
+          \line{\ewtop\hfil\ewtop}%
+          \nointerlineskip
+          \line{%
+            \vbox{\moveleft\cornerthick\nstop}%
+            \hfill
+            \vbox{\moveright\cornerthick\nstop}%
+          }%
+          \vss}%
+        \vskip\topandbottommargin
+        \line\bgroup
+          \hfil % center the page within the outer (page) hsize.
+          \ifodd\pageno\hskip\bindingoffset\fi
+          \vbox\bgroup
+      \fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingyyy.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 24pt
+        \unvbox\footlinebox
+      \fi
+      %
+      \ifcropmarks
+          \egroup % end of \vbox\bgroup
+        \hfil\egroup % end of (centering) \line\bgroup
+        \vskip\topandbottommargin plus1fill minus1fill
+        \boxmaxdepth = \cornerthick
+        \vbox to0pt{\vss
+          \line{%
+            \vbox{\moveleft\cornerthick\nsbot}%
+            \hfill
+            \vbox{\moveright\cornerthick\nsbot}%
+          }%
+          \nointerlineskip
+          \line{\ewbot\hfil\ewbot}%
+        }%
+      \egroup % \vbox from first cropmarks clause
+      \fi
+    }% end of \shipout\vbox
+  }% end of group with \indexdummies
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+% Main part of page, including any footnotes
+\def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1\relax \unvbox#1\relax
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+
+% Argument parsing
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+% For example, \def\foo{\parsearg\fooxxx}.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\argtorun{#2}%
+  \begingroup
+    \obeylines
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    \argremovecomment #1\comment\ArgTerm%
+  }%
+}
+
+% First remove any @comment, then any @c comment.  Also remove a @texinfoc
+% comment (see \scanmacro for details).  Pass the result on to \argcheckspaces.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argremovetexinfoc #1\texinfoc\ArgTerm}
+\def\argremovetexinfoc#1\texinfoc#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+%    @end itemize  @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+
+% \parseargdef - define a command taking an argument on the line
+%
+% \parseargdef\foo{...}
+%	is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+  \obeyspaces
+  \gdef\obeyedspace{ }
+
+  % Make each space character in the input produce a normal interword
+  % space in the output.  Don't allow a line break at this space, as this
+  % is used only in environments like @example, where each line of input
+  % should produce a line of output anyway.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex.  It's used like this:
+%
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as environments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At run-time, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
+  \else
+    \badenverr
+  \fi
+}
+
+% Environment mismatch, #1 expected:
+\def\badenverr{%
+  \errhelp = \EMsimple
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    outside of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
+  \else
+    % The general wording of \badenverr may not be ideal.
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
+  \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\unskip\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off  says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+  \def\temp{#1}%
+  \ifx\temp\onword \plainfrenchspacing
+  \else\ifx\temp\offword \plainnonfrenchspacing
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
+  \fi\fi
+}
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  \startsavinginserts
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  \addgroupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+
+\def\addgroupbox{
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \txipageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\txipageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+}
+
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+\parseargdef\need{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @include FILE -- \input text of FILE.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
+  \def\thisfile{#1}%
+  {%
+    \makevalueexpandable  % we want to expand any @value in FILE.
+    \turnoffactive        % and allow special characters in the expansion
+    \indexnofonts         % Allow `@@' and other weird things in file names.
+    \wlog{texinfo.tex: doing @include of #1^^J}%
+    \edef\temp{\noexpand\input #1 }%
+    %
+    % This trickery is to read FILE outside of a group, in case it makes
+    % definitions, etc.
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+  \catcode`\`=\other
+  \catcode`\'=\other
+}
+
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
+%
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\centersub\centerH
+  \else
+    \let\centersub\centerV
+  \fi
+  \centersub{\hfil \ignorespaces#1\unskip \hfil}%
+  \let\centersub\relax % don't let the definition persist, just in case
+}
+\def\centerH#1{{%
+  \hfil\break
+  \advance\hsize by -\leftskip
+  \advance\hsize by -\rightskip
+  \line{#1}%
+  \break
+}}
+%
+\newcount\centerpenalty
+\def\centerV#1{%
+  % The idea here is the same as in \startdefun, \cartouche, etc.: if
+  % @center is the first thing after a section heading, we need to wipe
+  % out the negative parskip inserted by \sectionheading, but still
+  % prevent a page break here.
+  \centerpenalty = \lastpenalty
+  \ifnum\centerpenalty>10000 \vskip\parskip \fi
+  \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
+  \line{\kern\leftskip #1\kern\rightskip}%
+}
+
+% @sp n   outputs n lines of vertical space
+%
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+
+\def\c{\begingroup \catcode`\^^M=\active%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\cxxx}
+{\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}}
+%
+\let\comment\c
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent  {\restorefirstparagraphindent \indent}%
+  \gdef\noindent{\restorefirstparagraphindent \noindent}%
+  \global\everypar = {\kern -\parindent \restorefirstparagraphindent}%
+}
+%
+\gdef\restorefirstparagraphindent{%
+  \global\let\indent = \ptexindent
+  \global\let\noindent = \ptexnoindent
+  \global\everypar = {}%
+}
+
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% @setfilename INFO-FILENAME - ignored
+\let\setfilename=\comment
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newbox\boxB
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+%
+% For LuaTeX
+%
+
+\newif\iftxiuseunicodedestname
+\txiuseunicodedestnamefalse % For pdfTeX etc.
+
+\ifx\luatexversion\thisisundefined
+\else
+  % Use Unicode destination names
+  \txiuseunicodedestnametrue
+  % Escape PDF strings with converting UTF-16 from UTF-8
+  \begingroup
+    \catcode`\%=12
+    \directlua{
+      function UTF16oct(str)
+        tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377')
+        for c in string.utfvalues(str) do
+          if c < 0x10000 then
+            tex.sprint(
+              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o',
+                            (c / 256), (c % 256)))
+          else
+            c = c - 0x10000
+            local c_hi = c / 1024 + 0xd800
+            local c_lo = c % 1024 + 0xdc00
+            tex.sprint(
+              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o',
+                            (c_hi / 256), (c_hi % 256),
+                            (c_lo / 256), (c_lo % 256)))
+          end
+        end
+      end
+    }
+  \endgroup
+  \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}}
+  % Escape PDF strings without converting
+  \begingroup
+    \directlua{
+      function PDFescstr(str)
+        for c in string.bytes(str) do
+          if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then
+            tex.sprint(
+              string.format(string.char(0x5c) .. string.char(0x25) .. '03o',
+                            c))
+          else
+            tex.sprint(string.char(c))
+          end
+        end
+      end
+    }
+  \endgroup
+  \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}}
+  \ifnum\luatexversion>84
+    % For LuaTeX >= 0.85
+    \def\pdfdest{\pdfextension dest}
+    \let\pdfoutput\outputmode
+    \def\pdfliteral{\pdfextension literal}
+    \def\pdfcatalog{\pdfextension catalog}
+    \def\pdftexversion{\numexpr\pdffeedback version\relax}
+    \let\pdfximage\saveimageresource
+    \let\pdfrefximage\useimageresource
+    \let\pdflastximage\lastsavedimageresourceindex
+    \def\pdfendlink{\pdfextension endlink\relax}
+    \def\pdfoutline{\pdfextension outline}
+    \def\pdfstartlink{\pdfextension startlink}
+    \def\pdffontattr{\pdfextension fontattr}
+    \def\pdfobj{\pdfextension obj}
+    \def\pdflastobj{\numexpr\pdffeedback lastobj\relax}
+    \let\pdfpagewidth\pagewidth
+    \let\pdfpageheight\pageheight
+    \edef\pdfhorigin{\pdfvariable horigin}
+    \edef\pdfvorigin{\pdfvariable vorigin}
+  \fi
+\fi
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as being undefined.
+\ifx\pdfoutput\thisisundefined
+\else
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places.  Thus, we have to
+% double any backslashes.  Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e.  Not good.
+% 
+% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
+% related messages.  The final outcome is that it is up to the TeX user
+% to double the backslashes and otherwise make the string valid, so
+% that's what we do.  pdftex 1.30.0 (ca.2005) introduced a primitive to
+% do this reliably, so we use it.
+
+% #1 is a control sequence in which to do the replacements,
+% which we \xdef.
+\def\txiescapepdf#1{%
+  \ifx\pdfescapestring\thisisundefined
+    % No primitive available; should we give a warning or log?
+    % Many times it won't matter.
+    \xdef#1{#1}%
+  \else
+    % The expandable \pdfescapestring primitive escapes parentheses,
+    % backslashes, and other special chars.
+    \xdef#1{\pdfescapestring{#1}}%
+  \fi
+}
+\def\txiescapepdfutfsixteen#1{%
+  \ifx\pdfescapestrutfsixteen\thisisundefined
+    % No UTF-16 converting macro available.
+    \txiescapepdf{#1}%
+  \else
+    \xdef#1{\pdfescapestrutfsixteen{#1}}%
+  \fi
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found.  (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+  %
+  % Color manipulation macros using ideas from pdfcolor.tex,
+  % except using rgb instead of cmyk; the latter is said to render as a
+  % very dark gray on-screen and a very dark halftone in print, instead
+  % of actual black. The dark red here is dark enough to print on paper as
+  % nearly black, but still distinguishable for online viewing.  We use
+  % black by default, though.
+  \def\rgbDarkRed{0.50 0.09 0.12}
+  \def\rgbBlack{0 0 0}
+  %
+  % rg sets the color for filling (usual text, etc.);
+  % RG sets the color for stroking (thin rules, e.g., normal _'s).
+  \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
+  %
+  % Set color, and create a mark which defines \thiscolor accordingly,
+  % so that \makeheadline knows which color to restore.
+  \def\setcolor#1{%
+    \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
+    \domark
+    \pdfsetcolor{#1}%
+  }
+  %
+  \def\maincolor{\rgbBlack}
+  \pdfsetcolor{\maincolor}
+  \edef\thiscolor{\maincolor}
+  \def\lastcolordefs{}
+  %
+  \def\makefootline{%
+    \baselineskip24pt
+    \line{\pdfsetcolor{\maincolor}\the\footline}%
+  }
+  %
+  \def\makeheadline{%
+    \vbox to 0pt{%
+      \vskip-22.5pt
+      \line{%
+        \vbox to8.5pt{}%
+        % Extract \thiscolor definition from the marks.
+        \getcolormarks
+        % Typeset the headline with \maincolor, then restore the color.
+        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+      }%
+      \vss
+    }%
+    \nointerlineskip
+  }
+  %
+  %
+  \pdfcatalog{/PageMode /UseOutlines}
+  %
+  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+  \def\dopdfimage#1#2#3{%
+    \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+    \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+    %
+    % pdftex (and the PDF format) support .pdf, .png, .jpg (among
+    % others).  Let's try in that order, PDF first since if
+    % someone has a scalable image, presumably better to use that than a
+    % bitmap.
+    \let\pdfimgext=\empty
+    \begingroup
+      \openin 1 #1.pdf \ifeof 1
+        \openin 1 #1.PDF \ifeof 1
+          \openin 1 #1.png \ifeof 1
+            \openin 1 #1.jpg \ifeof 1
+              \openin 1 #1.jpeg \ifeof 1
+                \openin 1 #1.JPG \ifeof 1
+                  \errhelp = \nopdfimagehelp
+                  \errmessage{Could not find image file #1 for pdf}%
+                \else \gdef\pdfimgext{JPG}%
+                \fi
+              \else \gdef\pdfimgext{jpeg}%
+              \fi
+            \else \gdef\pdfimgext{jpg}%
+            \fi
+          \else \gdef\pdfimgext{png}%
+          \fi
+        \else \gdef\pdfimgext{PDF}%
+        \fi
+      \else \gdef\pdfimgext{pdf}%
+      \fi
+      \closein 1
+    \endgroup
+    %
+    % without \immediate, ancient pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifdim \wd0 >0pt width \pdfimagewidth \fi
+      \ifdim \wd2 >0pt height \pdfimageheight \fi
+      \ifnum\pdftexversion<13
+         #1.\pdfimgext
+       \else
+         {#1.\pdfimgext}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  %
+  \def\setpdfdestname#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \indexnofonts
+    \makevalueexpandable
+    \turnoffactive
+    \iftxiuseunicodedestname
+      \ifx \declaredencoding \latone
+        % Pass through Latin-1 characters.
+        % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode.
+      \else
+        \ifx \declaredencoding \utfeight
+          % Pass through Unicode characters.
+        \else
+          % Use ASCII approximations in destination names.
+          \passthroughcharsfalse
+        \fi
+      \fi
+    \else
+      % Use ASCII approximations in destination names.
+      \passthroughcharsfalse
+    \fi
+    \def\pdfdestname{#1}%
+    \txiescapepdf\pdfdestname
+  }}
+  %
+  \def\setpdfoutlinetext#1{{%
+    \indexnofonts
+    \makevalueexpandable
+    \turnoffactive
+    \ifx \declaredencoding \latone
+      % The PDF format can use an extended form of Latin-1 in bookmark
+      % strings.  See Appendix D of the PDF Reference, Sixth Edition, for
+      % the "PDFDocEncoding".
+      \passthroughcharstrue
+      % Pass through Latin-1 characters.
+      %   LuaTeX: Convert to Unicode
+      %   pdfTeX: Use Latin-1 as PDFDocEncoding
+      \def\pdfoutlinetext{#1}%
+    \else
+      \ifx \declaredencoding \utfeight
+        \ifx\luatexversion\thisisundefined
+          % For pdfTeX  with UTF-8.
+          % TODO: the PDF format can use UTF-16 in bookmark strings,
+          % but the code for this isn't done yet.
+          % Use ASCII approximations.
+          \passthroughcharsfalse
+          \def\pdfoutlinetext{#1}%
+        \else
+          % For LuaTeX with UTF-8.
+          % Pass through Unicode characters for title texts.
+          \passthroughcharstrue
+          \def\pdfoutlinetext{#1}%
+        \fi
+      \else
+        % For non-Latin-1 or non-UTF-8 encodings.
+        % Use ASCII approximations.
+        \passthroughcharsfalse
+        \def\pdfoutlinetext{#1}%
+      \fi
+    \fi
+    % LuaTeX: Convert to UTF-16
+    % pdfTeX: Use Latin-1 as PDFDocEncoding
+    \txiescapepdfutfsixteen\pdfoutlinetext
+  }}
+  %
+  \def\pdfmkdest#1{%
+    \setpdfdestname{#1}%
+    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+  }
+  %
+  % used to mark target names; must be expandable.
+  \def\pdfmkpgn#1{#1}
+  %
+  % by default, use black for everything.
+  \def\urlcolor{\rgbBlack}
+  \def\linkcolor{\rgbBlack}
+  \def\endlink{\setcolor{\maincolor}\pdfendlink}
+  %
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by 1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  %
+  % #1 is the section text, which is what will be displayed in the
+  % outline by the pdf viewer.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node text,
+  % which might be empty if this toc entry had no corresponding node.
+  % #4 is the page number
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worth the trouble, since most documents are normally structured.
+    \setpdfoutlinetext{#1}
+    \setpdfdestname{#3}
+    \ifx\pdfdestname\empty
+      \def\pdfdestname{#4}%
+    \fi
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\partentry##1##2##3##4{}% ignore parts in the outlines
+      \def\numchapentry##1##2##3##4{%
+	\def\thischapnum{##2}%
+	\def\thissecnum{0}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsecentry##1##2##3##4{%
+	\advancenumber{chap\thischapnum}%
+	\def\thissecnum{##2}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+	\advancenumber{sec\thissecnum}%
+	\def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+	\advancenumber{subsec\thissubsecnum}%
+      }%
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \readdatafile{toc}%
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      %
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      %
+      % TODO this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Too
+      % much work for too little return.  Just use the ASCII equivalents
+      % we use for the index sort strings.
+      % 
+      \indexnofonts
+      \setupdatafile
+      % We can have normal brace characters in the PDF outlines, unlike
+      % Texinfo index files.  So set that up.
+      \def\{{\lbracecharliteral}%
+      \def\}{\rbracecharliteral}%
+      \catcode`\\=\active \otherbackslash
+      \input \tocreadfilename
+    \endgroup
+  }
+  {\catcode`[=1 \catcode`]=2
+   \catcode`{=\other \catcode`}=\other
+   \gdef\lbracecharliteral[{]%
+   \gdef\rbracecharliteral[}]%
+  ]
+  %
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \addtokens{\filename}{\PP}%
+      \advance\filenamelength by 1
+    \fi
+    \nextsp}
+  \def\getfilename#1{%
+    \filenamelength=0
+    % If we don't expand the argument now, \skipspaces will get
+    % snagged on things like "@value{foo}".
+    \edef\temp{#1}%
+    \expandafter\skipspaces\temp|\relax
+  }
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  % make a live url in pdf output.
+  \def\pdfurl#1{%
+    \begingroup
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      %
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
+      % do we want to go so far as to use \indexnofonts instead of just
+      % special-casing \var here?
+      \def\var##1{##1}%
+      %
+      \leavevmode\setcolor{\urlcolor}%
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+    \endgroup}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \setcolor{\linkcolor}#1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+  % non-pdf mode
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\setcolor = \gobble
+  \let\pdfsetcolor = \gobble
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
+
+%
+% For XeTeX
+%
+\ifx\XeTeXrevision\thisisundefined
+\else
+  %
+  % XeTeX version check
+  %
+  \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1
+    % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307.
+    % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941).
+    % For avoiding PDF destination name replacement, we use this special
+    % instead of xdvipdfmx's command line option `-C 0x0010'.
+    \special{dvipdfmx:config C 0x0010}
+    % XeTeX 0.99995+ comes with xdvipdfmx 20160307+.
+    % It can handle Unicode destination names for PDF.
+    \txiuseunicodedestnametrue
+  \else
+    % XeTeX < 0.99996 (TeX Live < 2016) cannot use the
+    % `dvipdfmx:config' special.
+    % So for avoiding PDF destination name replacement,
+    % xdvipdfmx's command line option `-C 0x0010' is necessary.
+    %
+    % XeTeX < 0.99995 can not handle Unicode destination names for PDF
+    % because xdvipdfmx 20150315 has a UTF-16 conversion issue.
+    % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
+    \txiuseunicodedestnamefalse
+  \fi
+  %
+  % Color support
+  %
+  \def\rgbDarkRed{0.50 0.09 0.12}
+  \def\rgbBlack{0 0 0}
+  %
+  \def\pdfsetcolor#1{\special{pdf:scolor [#1]}}
+  %
+  % Set color, and create a mark which defines \thiscolor accordingly,
+  % so that \makeheadline knows which color to restore.
+  \def\setcolor#1{%
+    \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
+    \domark
+    \pdfsetcolor{#1}%
+  }
+  %
+  \def\maincolor{\rgbBlack}
+  \pdfsetcolor{\maincolor}
+  \edef\thiscolor{\maincolor}
+  \def\lastcolordefs{}
+  %
+  \def\makefootline{%
+    \baselineskip24pt
+    \line{\pdfsetcolor{\maincolor}\the\footline}%
+  }
+  %
+  \def\makeheadline{%
+    \vbox to 0pt{%
+      \vskip-22.5pt
+      \line{%
+        \vbox to8.5pt{}%
+        % Extract \thiscolor definition from the marks.
+        \getcolormarks
+        % Typeset the headline with \maincolor, then restore the color.
+        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+      }%
+      \vss
+    }%
+    \nointerlineskip
+  }
+  %
+  % PDF outline support
+  %
+  % Emulate pdfTeX primitive
+  \def\pdfdest name#1 xyz{%
+    \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}%
+  }
+  %
+  \def\setpdfdestname#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \indexnofonts
+    \makevalueexpandable
+    \turnoffactive
+    \iftxiuseunicodedestname
+      % Pass through Unicode characters.
+    \else
+      % Use ASCII approximations in destination names.
+      \passthroughcharsfalse
+    \fi
+    \def\pdfdestname{#1}%
+    \txiescapepdf\pdfdestname
+  }}
+  %
+  \def\setpdfoutlinetext#1{{%
+    \turnoffactive
+    % Always use Unicode characters in title texts.
+    \def\pdfoutlinetext{#1}%
+    % For XeTeX, xdvipdfmx converts to UTF-16.
+    % So we do not convert.
+    \txiescapepdf\pdfoutlinetext
+  }}
+  %
+  \def\pdfmkdest#1{%
+    \setpdfdestname{#1}%
+    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+  }
+  %
+  % by default, use black for everything.
+  \def\urlcolor{\rgbBlack}
+  \def\linkcolor{\rgbBlack}
+  \def\endlink{\setcolor{\maincolor}\pdfendlink}
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    \setpdfoutlinetext{#1}
+    \setpdfdestname{#3}
+    \ifx\pdfdestname\empty
+      \def\pdfdestname{#4}%
+    \fi
+    %
+    \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A
+      << /S /GoTo /D (\pdfdestname) >> >> }%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      %
+      % For XeTeX, counts of subentries are not necessary.
+      % Therefore, we read toc only once.
+      %
+      % We use node names as destinations.
+      \def\partentry##1##2##3##4{}% ignore parts in the outlines
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{1}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{2}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{3}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{4}{##3}{##4}}%
+      %
+      \let\appentry\numchapentry%
+      \let\appsecentry\numsecentry%
+      \let\appsubsecentry\numsubsecentry%
+      \let\appsubsubsecentry\numsubsubsecentry%
+      \let\unnchapentry\numchapentry%
+      \let\unnsecentry\numsecentry%
+      \let\unnsubsecentry\numsubsecentry%
+      \let\unnsubsubsecentry\numsubsubsecentry%
+      %
+      % For XeTeX, xdvipdfmx converts strings to UTF-16.
+      % Therefore, the encoding and the language may not be considered.
+      %
+      \indexnofonts
+      \setupdatafile
+      % We can have normal brace characters in the PDF outlines, unlike
+      % Texinfo index files.  So set that up.
+      \def\{{\lbracecharliteral}%
+      \def\}{\rbracecharliteral}%
+      \catcode`\\=\active \otherbackslash
+      \input \tocreadfilename
+    \endgroup
+  }
+  {\catcode`[=1 \catcode`]=2
+   \catcode`{=\other \catcode`}=\other
+   \gdef\lbracecharliteral[{]%
+   \gdef\rbracecharliteral[}]%
+  ]
+
+  \special{pdf:docview << /PageMode /UseOutlines >> }
+  % ``\special{pdf:tounicode ...}'' is not necessary
+  % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it.
+  % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315,
+  % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings.
+  % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
+%
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \addtokens{\filename}{\PP}%
+      \advance\filenamelength by 1
+    \fi
+    \nextsp}
+  \def\getfilename#1{%
+    \filenamelength=0
+    % If we don't expand the argument now, \skipspaces will get
+    % snagged on things like "@value{foo}".
+    \edef\temp{#1}%
+    \expandafter\skipspaces\temp|\relax
+  }
+  % make a live url in pdf output.
+  \def\pdfurl#1{%
+    \begingroup
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      %
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
+      % do we want to go so far as to use \indexnofonts instead of just
+      % special-casing \var here?
+      \def\var##1{##1}%
+      %
+      \leavevmode\setcolor{\urlcolor}%
+      \special{pdf:bann << /Border [0 0 0]
+        /Subtype /Link /A << /S /URI /URI (#1) >> >>}%
+    \endgroup}
+  \def\endlink{\setcolor{\maincolor}\special{pdf:eann}}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \special{pdf:bann << /Border [0 0 0]
+      /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}%
+    \setcolor{\linkcolor}#1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+%
+  %
+  % @image support
+  %
+  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+  \def\doxeteximage#1#2#3{%
+    \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+    \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+    %
+    % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among
+    % others).  Let's try in that order, PDF first since if
+    % someone has a scalable image, presumably better to use that than a
+    % bitmap.
+    \let\xeteximgext=\empty
+    \begingroup
+      \openin 1 #1.pdf \ifeof 1
+        \openin 1 #1.PDF \ifeof 1
+          \openin 1 #1.png \ifeof 1
+            \openin 1 #1.jpg \ifeof 1
+              \openin 1 #1.jpeg \ifeof 1
+                \openin 1 #1.JPG \ifeof 1
+                  \errmessage{Could not find image file #1 for XeTeX}%
+                \else \gdef\xeteximgext{JPG}%
+                \fi
+              \else \gdef\xeteximgext{jpeg}%
+              \fi
+            \else \gdef\xeteximgext{jpg}%
+            \fi
+          \else \gdef\xeteximgext{png}%
+          \fi
+        \else \gdef\xeteximgext{PDF}%
+        \fi
+      \else \gdef\xeteximgext{pdf}%
+      \fi
+      \closein 1
+    \endgroup
+    %
+    \def\xetexpdfext{pdf}%
+    \ifx\xeteximgext\xetexpdfext
+      \XeTeXpdffile "#1".\xeteximgext ""
+    \else
+      \def\xetexpdfext{PDF}%
+      \ifx\xeteximgext\xetexpdfext
+        \XeTeXpdffile "#1".\xeteximgext ""
+      \else
+        \XeTeXpicfile "#1".\xeteximgext ""
+      \fi
+    \fi
+    \ifdim \wd0 >0pt width \xeteximagewidth \fi
+    \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
+  }
+\fi
+
+
+%
+\message{fonts,}
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+% can get a sort of poor man's double spacing by redefining this.
+\def\baselinefactor{1}
+%
+\newdimen\textleading
+\def\setleading#1{%
+  \dimen0 = #1\relax
+  \normalbaselineskip = \baselinefactor\dimen0
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% PDF CMaps.  See also LaTeX's t1.cmap.
+%
+% do nothing with this by default.
+\expandafter\let\csname cmapOT1\endcsname\gobble
+\expandafter\let\csname cmapOT1IT\endcsname\gobble
+\expandafter\let\csname cmapOT1TT\endcsname\gobble
+
+% if we are producing pdf, and we have \pdffontattr, then define cmaps.
+% (\pdffontattr was introduced many years ago, but people still run
+% older pdftex's; it's easy to conditionalize, so we do.)
+\ifpdf \ifx\pdffontattr\thisisundefined \else
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1IT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1TT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+\fi\fi
+
+
+% Set the font macro #1 to the font named \fontprefix#2.
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
+% Example:
+% #1 = \textrm
+% #2 = \rmshape
+% #3 = 10
+% #4 = \mainmagstep
+% #5 = OT1
+%
+\def\setfont#1#2#3#4#5{%
+  \font#1=\fontprefix#2#3 scaled #4
+  \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+%
+% (end of cmaps)
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\thisisundefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               % where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt.  (The default in Texinfo.)
+%
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1095}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defsl\slshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\ttfont=\deftt \let\bffont = \defbf
+\let\ttslfont=\defttsl \let\slfont=\defsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for math mode superscripts (7pt).
+\def\sevennominalsize{7pt}
+\setfont\sevenrm\rmshape{7}{1000}{OT1}
+\setfont\seventt\ttshape{10}{700}{OT1TT}
+\setfont\sevenbf\bfshape{10}{700}{OT1}
+\setfont\sevenit\itshape{7}{1000}{OT1IT}
+\setfont\sevensl\slshape{10}{700}{OT1}
+\setfont\sevensf\sfshape{10}{700}{OT1}
+\setfont\sevensc\scshape{10}{700}{OT1}
+\setfont\seventtsl\ttslshape{10}{700}{OT1TT}
+\font\seveni=cmmi7
+\font\sevensy=cmsy7
+\def\sevenecsize{0700}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+\def\chapecsize{1728}
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+\def\sececsize{1440}
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+\def\ssececsize{1200}
+
+% Reduced fonts for @acronym in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+\def\reducedecsize{1000}
+
+\textleading = 13.2pt % line spacing for 11pt CM
+\textfonts            % reset the current fonts
+\rm
+} % end of 11pt text font size definitions, \definetextfontsizexi
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit.  This is for the GNU
+% Press printing of the Emacs 22 manual.  Maybe other manuals in the
+% future.  Used with @smallbook, which sets the leading to 12pt.
+%
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1000}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defsl\slshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\ttfont=\deftt \let\bffont = \defbf
+\let\slfont=\defsl \let\ttslfont=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for math mode superscripts (7pt).
+\def\sevennominalsize{7pt}
+\setfont\sevenrm\rmshape{7}{1000}{OT1}
+\setfont\seventt\ttshape{10}{700}{OT1TT}
+\setfont\sevenbf\bfshape{10}{700}{OT1}
+\setfont\sevenit\itshape{7}{1000}{OT1IT}
+\setfont\sevensl\slshape{10}{700}{OT1}
+\setfont\sevensf\sfshape{10}{700}{OT1}
+\setfont\sevensc\scshape{10}{700}{OT1}
+\setfont\seventtsl\ttslshape{10}{700}{OT1TT}
+\font\seveni=cmmi7
+\font\sevensy=cmsy7
+\def\sevenecsize{0700}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+\def\chapecsize{1440}
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12
+\font\secsy=cmsy10 scaled \magstep1
+\def\sececsize{1200}
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+\def\ssececsize{1000}
+
+% Reduced fonts for @acronym in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+\def\reducedecsize{0900}
+
+\divide\parskip by 2  % reduce space between paragraphs
+\textleading = 12pt   % line spacing for 10pt CM
+\textfonts            % reset the current fonts
+\rm
+} % end of 10pt text font size definitions, \definetextfontsizex
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+
+% We provide the user-level command
+%   @fonttextsize 10
+% (or 11) to redefine the text font size.  pt is assumed.
+%
+\def\xiword{11}
+\def\xword{10}
+\def\xwordpt{10pt}
+%
+\parseargdef\fonttextsize{%
+  \def\textsizearg{#1}%
+  %\wlog{doing @fonttextsize \textsizearg}%
+  %
+  % Set \globaldefs so that documents can use this inside @tex, since
+  % makeinfo 4.8 does not support it, but we need it nonetheless.
+  %
+ \begingroup \globaldefs=1
+  \ifx\textsizearg\xword \definetextfontsizex
+  \else \ifx\textsizearg\xiword \definetextfontsizexi
+  \else
+    \errhelp=\EMsimple
+    \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+  \fi\fi
+ \endgroup
+}
+
+%
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname #1font\endcsname  % change the current font
+}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.
+% We don't bother to reset \scriptscriptfont; awaiting user need.
+%
+\def\resetmathfonts{%
+  \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont
+  \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont
+  \textfont\ttfam=\ttfont \textfont\sffam=\sffont
+  %
+  % Fonts for superscript.  Note that the 7pt fonts are used regardless
+  % of the current font size.
+  \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy
+  \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl
+  \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt
+  \scriptfont\sffam=\sevensf
+}
+
+%
+
+% The font-changing commands (all called \...fonts) redefine the meanings
+% of \STYLEfont, instead of just \STYLE.  We do this because \STYLE needs
+% to also set the current \fam for math mode.  Our \STYLE (e.g., \rm)
+% commands hardwire \STYLEfont to set the current font.
+%
+% The fonts used for \ifont are for "math italics"  (\itfont is for italics
+% in regular text).  \syfont is also used in math mode only.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used
+% in, e.g., the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+
+\def\assignfonts#1{%
+  \expandafter\let\expandafter\rmfont\csname #1rm\endcsname
+  \expandafter\let\expandafter\itfont\csname #1it\endcsname
+  \expandafter\let\expandafter\slfont\csname #1sl\endcsname
+  \expandafter\let\expandafter\bffont\csname #1bf\endcsname
+  \expandafter\let\expandafter\ttfont\csname #1tt\endcsname
+  \expandafter\let\expandafter\smallcaps\csname #1sc\endcsname
+  \expandafter\let\expandafter\sffont  \csname #1sf\endcsname
+  \expandafter\let\expandafter\ifont   \csname #1i\endcsname
+  \expandafter\let\expandafter\syfont  \csname #1sy\endcsname
+  \expandafter\let\expandafter\ttslfont\csname #1ttsl\endcsname
+}
+
+\newif\ifrmisbold
+
+% Select smaller font size with the current style.  Used to change font size
+% in, e.g., the LaTeX logo and acronyms.  If we are using bold fonts for
+% normal roman text, also use bold fonts for roman text in the smaller size.
+\def\switchtolllsize{%
+   \expandafter\assignfonts\expandafter{\lllsize}%
+   \ifrmisbold
+     \let\rmfont\bffont
+   \fi
+   \csname\curfontstyle\endcsname
+}%
+
+\def\switchtolsize{%
+   \expandafter\assignfonts\expandafter{\lsize}%
+   \ifrmisbold
+     \let\rmfont\bffont
+   \fi
+   \csname\curfontstyle\endcsname
+}%
+
+\def\definefontsetatsize#1#2#3#4#5{%
+\expandafter\def\csname #1fonts\endcsname{%
+  \def\curfontsize{#1}%
+  \def\lsize{#2}\def\lllsize{#3}%
+  \csname rmisbold#5\endcsname
+  \assignfonts{#1}%
+  \resetmathfonts
+  \setleading{#4}%
+}}
+
+\definefontsetatsize{text}   {reduced}{smaller}{\textleading}{false}
+\definefontsetatsize{title}  {chap}   {subsec} {27pt}  {true}
+\definefontsetatsize{chap}   {sec}    {text}   {19pt}  {true}
+\definefontsetatsize{sec}    {subsec} {reduced}{17pt}  {true}
+\definefontsetatsize{ssec}   {text}   {small}  {15pt}  {true}
+\definefontsetatsize{reduced}{small}  {smaller}{10.5pt}{false}
+\definefontsetatsize{small}  {smaller}{smaller}{10.5pt}{false}
+\definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false}
+
+\def\titlefont#1{{\titlefonts\rm #1}}
+\let\subsecfonts = \ssecfonts
+\let\subsubsecfonts = \ssecfonts
+
+% Define these just so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+% --karl, 24jan03.
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+
+\message{markup,}
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
+% define and register \INITMACRO to be called on markup style changes.
+% \INITMACRO can check \currentmarkupstyle for the innermost
+% style.
+
+\let\currentmarkupstyle\empty
+
+\def\setupmarkupstyle#1{%
+  \def\currentmarkupstyle{#1}%
+  \markupstylesetup
+}
+
+\let\markupstylesetup\empty
+
+\def\defmarkupstylesetup#1{%
+  \expandafter\def\expandafter\markupstylesetup
+    \expandafter{\markupstylesetup #1}%
+  \def#1%
+}
+
+% Markup style setup for left and right quotes.
+\defmarkupstylesetup\markupsetuplq{%
+  \expandafter\let\expandafter \temp
+    \csname markupsetuplq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
+}
+
+\defmarkupstylesetup\markupsetuprq{%
+  \expandafter\let\expandafter \temp
+    \csname markupsetuprq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
+}
+
+{
+\catcode`\'=\active
+\catcode`\`=\active
+
+\gdef\markupsetuplqdefault{\let`\lq}
+\gdef\markupsetuprqdefault{\let'\rq}
+
+\gdef\markupsetcodequoteleft{\let`\codequoteleft}
+\gdef\markupsetcodequoteright{\let'\codequoteright}
+}
+
+\let\markupsetuplqcode \markupsetcodequoteleft
+\let\markupsetuprqcode \markupsetcodequoteright
+%
+\let\markupsetuplqexample \markupsetcodequoteleft
+\let\markupsetuprqexample \markupsetcodequoteright
+%
+\let\markupsetuplqkbd     \markupsetcodequoteleft
+\let\markupsetuprqkbd     \markupsetcodequoteright
+%
+\let\markupsetuplqsamp \markupsetcodequoteleft
+\let\markupsetuprqsamp \markupsetcodequoteright
+%
+\let\markupsetuplqverb \markupsetcodequoteleft
+\let\markupsetuprqverb \markupsetcodequoteright
+%
+\let\markupsetuplqverbatim \markupsetcodequoteleft
+\let\markupsetuprqverbatim \markupsetcodequoteright
+
+% Allow an option to not use regular directed right quote/apostrophe
+% (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
+% The undirected quote is ugly, so don't make it the default, but it
+% works for pasting with more pdf viewers (at least evince), the
+% lilypond developers report.  xpdf does work with the regular 0x27.
+%
+\def\codequoteright{%
+  \ifmonospace
+    \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+      \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+        '%
+      \else \char'15 \fi
+    \else \char'15 \fi
+   \else
+     '%
+   \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+%
+\def\codequoteleft{%
+  \ifmonospace
+    \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+      \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+        % [Knuth] pp. 380,381,391
+        % \relax disables Spanish ligatures ?` and !` of \tt font.
+        \relax`%
+      \else \char'22 \fi
+    \else \char'22 \fi
+   \else
+     \relax`%
+   \fi
+}
+
+% Commands to set the quote options.
+% 
+\parseargdef\codequoteundirected{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxicodequoteundirected\endcsname
+      = t%
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxicodequoteundirected\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
+  \fi\fi
+}
+%
+\parseargdef\codequotebacktick{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxicodequotebacktick\endcsname
+      = t%
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxicodequotebacktick\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
+  \fi\fi
+}
+
+% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
+\def\noligaturesquoteleft{\relax\lq}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Font commands.
+
+% #1 is the font command (\sl or \it), #2 is the text to slant.
+% If we are in a monospaced environment, however, 1) always use \ttsl,
+% and 2) do not add an italic correction.
+\def\dosmartslant#1#2{%
+  \ifusingtt 
+    {{\ttsl #2}\let\next=\relax}%
+    {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
+  \next
+}
+\def\smartslanted{\dosmartslant\sl}
+\def\smartitalic{\dosmartslant\it}
+
+% Output an italic correction unless \next (presumed to be the following
+% character) is such as not to need one.
+\def\smartitaliccorrection{%
+  \ifx\next,%
+  \else\ifx\next-%
+  \else\ifx\next.%
+  \else\ifx\next\.%
+  \else\ifx\next\comma%
+  \else\ptexslash
+  \fi\fi\fi\fi\fi
+  \aftersmartic
+}
+
+% Unconditional use \ttsl, and no ic.  @var is set to this for defuns.
+\def\ttslanted#1{{\ttsl #1}}
+
+% @cite is like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
+
+\def\aftersmartic{}
+\def\var#1{%
+  \let\saveaftersmartic = \aftersmartic
+  \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
+  \smartslanted{#1}%
+}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @b, explicit bold.  Also @strong.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+  \def\plainfrenchspacing{%
+    \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m
+    \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m
+    \def\endofsentencespacefactor{1000}% for @. and friends
+  }
+  \def\plainnonfrenchspacing{%
+    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+    \def\endofsentencespacefactor{3000}% for @. and friends
+  }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+% @t, explicit typewriter.
+\def\t#1{%
+  {\tt \rawbackslash \plainfrenchspacing #1}%
+  \null
+}
+
+% @samp.
+\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
+
+% @indicateurl is \samp, that is, with quotes.
+\let\indicateurl=\samp
+
+% @code (and similar) prints in typewriter, but with spaces the same
+% size as normal in the surrounding text, without hyphenation, etc.
+% This is a subroutine for that.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \plainfrenchspacing
+    #1%
+  }%
+  \null % reset spacefactor to 1000
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% (But see \codedashfinish below.)
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+%
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash. -- rms.
+{
+  \catcode`\-=\active \catcode`\_=\active
+  \catcode`\'=\active \catcode`\`=\active
+  \global\let'=\rq \global\let`=\lq  % default definitions
+  %
+  \global\def\code{\begingroup
+    \setupmarkupstyle{code}%
+    % The following should really be moved into \setupmarkupstyle handlers.
+    \catcode\dashChar=\active  \catcode\underChar=\active
+    \ifallowcodebreaks
+     \let-\codedash
+     \let_\codeunder
+    \else
+     \let-\normaldash
+     \let_\realunder
+    \fi
+    % Given -foo (with a single dash), we do not want to allow a break
+    % after the hyphen.
+    \global\let\codedashprev=\codedash
+    %
+    \codex
+  }
+  %
+  \gdef\codedash{\futurelet\next\codedashfinish}
+  \gdef\codedashfinish{%
+    \normaldash % always output the dash character itself.
+    % 
+    % Now, output a discretionary to allow a line break, unless
+    % (a) the next character is a -, or
+    % (b) the preceding character is a -.
+    % E.g., given --posix, we do not want to allow a break after either -.
+    % Given --foo-bar, we do want to allow a break between the - and the b.
+    \ifx\next\codedash \else
+      \ifx\codedashprev\codedash 
+      \else \discretionary{}{}{}\fi
+    \fi
+    % we need the space after the = for the case when \next itself is a
+    % space token; it would get swallowed otherwise.  As in @code{- a}.
+    \global\let\codedashprev= \next
+  }
+}
+\def\normaldash{-}
+%
+\def\codex #1{\tclose{#1}\endgroup}
+
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__.  This is bad.
+% @allowcodebreaks provides a document-level way to turn breaking at -
+% and _ on and off.
+%
+\newif\ifallowcodebreaks  \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\keywordtrue
+    \allowcodebreakstrue
+  \else\ifx\txiarg\keywordfalse
+    \allowcodebreaksfalse
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
+  \fi\fi
+}
+
+% For @command, @env, @file, @option quotes seem unnecessary,
+% so use \code rather than \samp.
+\let\command=\code
+\let\env=\code
+\let\file=\code
+\let\option=\code
+
+% @uref (abbreviation for `urlref') aka @url takes an optional
+% (comma-separated) second argument specifying the text to display and
+% an optional third arg as text to display instead of (rather than in
+% addition to) the url itself.  First (mandatory) arg is the url.
+
+% TeX-only option to allow changing PDF output to show only the second
+% arg (if given), and not the url (which is then just the link target).
+\newif\ifurefurlonlylink
+
+% The main macro is \urefbreak, which allows breaking at expected
+% places within the url.  (There used to be another version, which
+% didn't support automatic breaking.)
+\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
+\let\uref=\urefbreak
+%
+\def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
+\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}% look for second arg
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        % For pdfTeX and LuaTeX
+        \ifurefurlonlylink
+          % PDF plus option to not display url, show just arg
+          \unhbox0             
+        \else
+          % PDF, normally display both arg and url for consistency,
+          % visibility, if the pdf is eventually used to print, etc.
+          \unhbox0\ (\urefcode{#1})%
+        \fi
+      \else
+        \ifx\XeTeXrevision\thisisundefined
+          \unhbox0\ (\urefcode{#1})% DVI, always show arg and url
+        \else
+          % For XeTeX
+          \ifurefurlonlylink
+            % PDF plus option to not display url, show just arg
+            \unhbox0             
+          \else
+            % PDF, normally display both arg and url for consistency,
+            % visibility, if the pdf is eventually used to print, etc.
+            \unhbox0\ (\urefcode{#1})%
+          \fi
+        \fi
+      \fi
+    \else
+      \urefcode{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% Allow line breaks around only a few characters (only).
+\def\urefcatcodes{%
+  \catcode`\&=\active \catcode`\.=\active
+  \catcode`\#=\active \catcode`\?=\active
+  \catcode`\/=\active
+}
+{
+  \urefcatcodes
+  %
+  \global\def\urefcode{\begingroup
+    \setupmarkupstyle{code}%
+    \urefcatcodes
+    \let&\urefcodeamp
+    \let.\urefcodedot
+    \let#\urefcodehash
+    \let?\urefcodequest
+    \let/\urefcodeslash
+    \codex
+  }
+  %
+  % By default, they are just regular characters.
+  \global\def&{\normalamp}
+  \global\def.{\normaldot}
+  \global\def#{\normalhash}
+  \global\def?{\normalquest}
+  \global\def/{\normalslash}
+}
+
+% we put a little stretch before and after the breakable chars, to help
+% line breaking of long url's.  The unequal skips make look better in
+% cmtt at least, especially for dots.
+\def\urefprestretchamount{.13em}
+\def\urefpoststretchamount{.1em}
+\def\urefprestretch{\urefprebreak \hskip0pt plus\urefprestretchamount\relax}
+\def\urefpoststretch{\urefpostbreak \hskip0pt plus\urefprestretchamount\relax}
+%
+\def\urefcodeamp{\urefprestretch \&\urefpoststretch}
+\def\urefcodedot{\urefprestretch .\urefpoststretch}
+\def\urefcodehash{\urefprestretch \#\urefpoststretch}
+\def\urefcodequest{\urefprestretch ?\urefpoststretch}
+\def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
+{
+  \catcode`\/=\active
+  \global\def\urefcodeslashfinish{%
+    \urefprestretch \slashChar
+    % Allow line break only after the final / in a sequence of
+    % slashes, to avoid line break between the slashes in http://.
+    \ifx\next/\else \urefpoststretch \fi
+  }
+}
+
+% One more complication: by default we'll break after the special
+% characters, but some people like to break before the special chars, so
+% allow that.  Also allow no breaking at all, for manual control.
+% 
+\parseargdef\urefbreakstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\wordnone
+    \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
+  \else\ifx\txiarg\wordbefore
+    \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak}
+  \else\ifx\txiarg\wordafter
+    \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak}
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
+  \fi\fi\fi
+}
+\def\wordafter{after}
+\def\wordbefore{before}
+\def\wordnone{none}
+
+\urefbreakstyle after
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \ifx\XeTeXrevision\thisisundefined
+    \let\email=\uref
+  \else
+    \def\email#1{\doemail#1,,\finish}
+    \def\doemail#1,#2,#3\finish{\begingroup
+      \unsepspaces
+      \pdfurl{mailto:#1}%
+      \setbox0 = \hbox{\ignorespaces #2}%
+      \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+      \endlink
+    \endgroup}
+  \fi
+\fi
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\txiarg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\txiarg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct'.
+\kbdinputstyle distinct
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
+
+\def\xkey{\key}
+\def\kbdsub#1#2#3\par{%
+  \def\one{#1}\def\three{#3}\def\threex{??}%
+  \ifx\one\xkey\ifx\threex\three \key{#2}%
+  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+}
+
+% definition of @key that produces a lozenge.  Doesn't adjust to text size.
+%\setfont\keyrm\rmshape{8}{1000}{OT1}
+%\font\keysy=cmsy9
+%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+%  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+%    \vbox{\hrule\kern-0.4pt
+%     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+%    \kern-0.4pt\hrule}%
+%  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+
+% definition of @key with no lozenge.  If the current font is already
+% monospace, don't change it; that way, we respect @kbdinputstyle.  But
+% if it isn't monospace, then use \tt.
+%
+\def\key#1{{\setupmarkupstyle{key}%
+  \nohyphenation
+  \ifmonospace\else\tt\fi
+  #1}\null}
+
+% @clicksequence{File @click{} Open ...}
+\def\clicksequence#1{\begingroup #1\endgroup}
+
+% @clickstyle @arrow   (by default)
+\parseargdef\clickstyle{\def\click{#1}}
+\def\click{\arrow}
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\switchtolsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+  \null % reset \spacefactor=1000
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\plainfrenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+  \null % reset \spacefactor=1000
+}
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode`\_ = \active
+  \gdef\mathunderscore{%
+    \catcode`\_=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
+% Another complication: we want \\ (and @\) to output a math (or tt) \.
+% FYI, plain.tex uses \\ as a temporary control sequence (for no
+% particular reason), but this is not advertised and we don't care.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \ifmmode\else % only go into math if not in math mode already
+    \tex
+    \mathunderscore
+    \let\\ = \mathbackslash
+    \mathactive
+    % make the texinfo accent commands work in math mode
+    \let\"=\ddot
+    \let\'=\acute
+    \let\==\bar
+    \let\^=\hat
+    \let\`=\grave
+    \let\u=\breve
+    \let\v=\check
+    \let\~=\tilde
+    \let\dotaccent=\dot
+    % have to provide another name for sup operator
+    \let\mathopsup=\sup
+  $\expandafter\finishmath\fi
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \catcode`' = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+    \let' = \ptexquoteright
+  }
+}
+
+% for @sub and @sup, if in math mode, just do a normal sub/superscript.
+% If in text, use math to place as sub/superscript, but switch
+% into text mode, with smaller fonts.  This is a different font than the
+% one used for real math sub/superscripts (8pt vs. 7pt), but let's not
+% fix it (significant additions to font machinery) until someone notices.
+%
+\def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi}
+\def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}%
+%
+\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
+\def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%
+
+% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
+% Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
+% except specified as a normal braced arg, so no newlines to worry about.
+% 
+\def\outfmtnametex{tex}
+%
+\long\def\inlinefmt#1{\doinlinefmt #1,\finish}
+\long\def\doinlinefmt#1,#2,\finish{%
+  \def\inlinefmtname{#1}%
+  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
+}
+% 
+% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if
+% FMTNAME is tex, else ELSE-TEXT.
+\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish}
+\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{%
+  \def\inlinefmtname{#1}%
+  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi
+}
+%
+% For raw, must switch into @tex before parsing the argument, to avoid
+% setting catcodes prematurely.  Doing it this way means that, for
+% example, @inlineraw{html, foo{bar} gets a parse error instead of being
+% ignored.  But this isn't important because if people want a literal
+% *right* brace they would have to use a command anyway, so they may as
+% well use a command to get a left brace too.  We could re-use the
+% delimiter character idea from \verb, but it seems like overkill.
+% 
+\long\def\inlineraw{\tex \doinlineraw}
+\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
+\def\doinlinerawtwo#1,#2,\finish{%
+  \def\inlinerawname{#1}%
+  \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
+  \endgroup % close group opened by \tex.
+}
+
+% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set.
+%
+\long\def\inlineifset#1{\doinlineifset #1,\finish}
+\long\def\doinlineifset#1,#2,\finish{%
+  \def\inlinevarname{#1}%
+  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax
+  \else\ignorespaces#2\fi
+}
+
+% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set.
+%
+\long\def\inlineifclear#1{\doinlineifclear #1,\finish}
+\long\def\doinlineifclear#1,#2,\finish{%
+  \def\inlinevarname{#1}%
+  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi
+}
+
+
+\message{glyphs,}
+% and logos.
+
+% @@ prints an @, as does @atchar{}.
+\def\@{\char64 }
+\let\atchar=\@
+
+% @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
+\def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}}
+\def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}}
+\let\{=\lbracechar
+\let\}=\rbracechar
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \ptexc
+\let\dotaccent = \ptexdot
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \ptext
+\let\ubaraccent = \ptexb
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
+  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{%
+     \ifx\textnominalsize\xwordpt
+       % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX.
+       % Revert to plain's \scriptsize, which is 7pt.
+       \count255=\the\fam $\fam\count255 \scriptstyle A$%
+     \else
+       % For 11pt, we can use our lllsize.
+       \switchtolllsize A%
+     \fi
+     }%
+     \vss
+  }}%
+  \kern-.15em
+  \TeX
+}
+
+% Some math mode symbols.  Define \ensuremath to switch into math mode
+% unless we are already there.  Expansion tricks may not be needed here,
+% but safer, and can't hurt.
+\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
+\def\ensuredmath#1{$\relax#1$}
+%
+\def\bullet{\ensuremath\ptexbullet}
+\def\geq{\ensuremath\ge}
+\def\leq{\ensuremath\le}
+\def\minus{\ensuremath-}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em.  So do
+% whichever is larger.
+%
+\def\dots{%
+  \leavevmode
+  \setbox0=\hbox{...}% get width of three periods
+  \ifdim\wd0 > 1.5em
+    \dimen0 = \wd0
+  \else
+    \dimen0 = 1.5em
+  \fi
+  \hbox to \dimen0{%
+    \hskip 0pt plus.25fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \dots
+  \spacefactor=\endofsentencespacefactor
+}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, they should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
+\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\ttfont \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{%
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbol don't have to have the
+  % font installed.
+  %
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  %
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  %
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
+% Glyphs from the EC fonts.  We don't use \let for the aliases, because
+% sometimes we redefine the original macro, and the alias should reflect
+% the redefinition.
+%
+% Use LaTeX names for the Icelandic letters.
+\def\DH{{\ecfont \char"D0}} % Eth
+\def\dh{{\ecfont \char"F0}} % eth
+\def\TH{{\ecfont \char"DE}} % Thorn
+\def\th{{\ecfont \char"FE}} % thorn
+%
+\def\guillemetleft{{\ecfont \char"13}}
+\def\guillemotleft{\guillemetleft}
+\def\guillemetright{{\ecfont \char"14}}
+\def\guillemotright{\guillemetright}
+\def\guilsinglleft{{\ecfont \char"0E}}
+\def\guilsinglright{{\ecfont \char"0F}}
+\def\quotedblbase{{\ecfont \char"12}}
+\def\quotesinglbase{{\ecfont \char"0D}}
+%
+% This positioning is not perfect (see the ogonek LaTeX package), but
+% we have the precomposed glyphs for the most common cases.  We put the
+% tests to use those glyphs in the single \ogonek macro so we have fewer
+% dummy definitions to worry about for index entries, etc.
+%
+% ogonek is also used with other letters in Lithuanian (IOU), but using
+% the precomposed glyphs for those is not so easy since they aren't in
+% the same EC font.
+\def\ogonek#1{{%
+  \def\temp{#1}%
+  \ifx\temp\macrocharA\Aogonek
+  \else\ifx\temp\macrochara\aogonek
+  \else\ifx\temp\macrocharE\Eogonek
+  \else\ifx\temp\macrochare\eogonek
+  \else
+    \ecfont \setbox0=\hbox{#1}%
+    \ifdim\ht0=1ex\accent"0C #1%
+    \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
+    \fi
+  \fi\fi\fi\fi
+  }%
+}
+\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
+\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
+\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
+\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
+%
+% Use the European Computer Modern fonts (cm-super in outline format)
+% for non-CM glyphs.  That is ec* for regular text and tc* for the text
+% companion symbols (LaTeX TS1 encoding).  Both are part of the ec
+% package and follow the same conventions.
+% 
+\def\ecfont{\etcfont{e}}
+\def\tcfont{\etcfont{t}}
+%
+\def\etcfont#1{%
+  % We can't distinguish serif/sans and italic/slanted, but this
+  % is used for crude hacks anyway (like adding French and German
+  % quotes to documents typeset with CM, where we lose kerning), so
+  % hopefully nobody will notice/care.
+  \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
+  \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
+  \ifmonospace
+    % typewriter:
+    \font\thisecfont = #1ctt\ecsize \space at \nominalsize
+  \else
+    \ifx\curfontstyle\bfstylename
+      % bold:
+      \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
+    \else
+      % regular:
+      \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+    \fi
+  \fi
+  \thisecfont
+}
+
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\switchtolllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\thisisundefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+% Quotes.
+\chardef\quotedblleft="5C
+\chardef\quotedblright=`\"
+\chardef\quoteleft=`\`
+\chardef\quoteright=`\'
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% @setcontentsaftertitlepage used to do an implicit @contents or
+% @shortcontents after @end titlepage, but it is now obsolete.
+\def\setcontentsaftertitlepage{%
+  \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo
+              command; move your @contents command if you want the contents
+              after the title page.}}%
+\def\setshortcontentsaftertitlepage{%
+  \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo
+              command; move your @shortcontents and @contents commands if you 
+              want the contents after the title page.}}%
+
+\parseargdef\shorttitlepage{%
+  \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+  \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % Most title ``pages'' are actually two pages long, with space
+    % at the top of the second.  We don't want the ragged left on the second.
+    \let\oldpage = \page
+    \def\page{%
+      \iffinishedtitlepage\else
+	 \finishtitlepage
+      \fi
+      \let\page = \oldpage
+      \page
+      \null
+    }%
+}
+
+\def\Etitlepage{%
+    \iffinishedtitlepage\else
+	\finishtitlepage
+    \fi
+    % It is important to do the page break before ending the group,
+    % because the headline and footline are only empty inside the group.
+    % If we use the new definition of \page, we always get a blank page
+    % after the title page, which we certainly don't want.
+    \oldpage
+  \endgroup
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+}
+
+\def\finishtitlepage{%
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+% Settings used for typesetting titles: no hyphenation, no indentation,
+% don't worry much about spacing, ragged right.  This should be used
+% inside a \vbox, and fonts need to be set appropriately first. \par should
+% be specified before the end of the \vbox, since a vbox is a group.
+% 
+\def\raggedtitlesettings{%
+  \rm
+  \hyphenpenalty=10000
+  \parindent=0pt
+  \tolerance=5000
+  \ptexraggedright
+}
+
+% Macros to be used within @titlepage:
+
+\let\subtitlerm=\rmfont
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \vbox{\titlefonts \raggedtitlesettings #1\par}%
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\secfonts\rm \leftline{#1}}%
+  \fi
+}
+
+
+% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make \makeheadline and \makefootline in Plain TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\txipageheight by -12pt
+  \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+% @evenheadingmarks top     \thischapter <- chapter at the top of a page
+% @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
+%
+% The same set of arguments for:
+%
+% @oddheadingmarks
+% @evenfootingmarks
+% @oddfootingmarks
+% @everyheadingmarks
+% @everyfootingmarks
+
+% These define \getoddheadingmarks, \getevenheadingmarks,
+% \getoddfootingmarks, and \getevenfootingmarks, each to one of
+% \gettopheadingmarks, \getbottomheadingmarks.
+%
+\def\evenheadingmarks{\headingmarks{even}{heading}}
+\def\oddheadingmarks{\headingmarks{odd}{heading}}
+\def\evenfootingmarks{\headingmarks{even}{footing}}
+\def\oddfootingmarks{\headingmarks{odd}{footing}}
+\parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1}
+                          \headingmarks{odd}{heading}{#1} }
+\parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1}
+                          \headingmarks{odd}{footing}{#1} }
+% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
+\def\headingmarks#1#2#3 {%
+  \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
+  \global\expandafter\let\csname get#1#2marks\endcsname \temp
+}
+
+\everyheadingmarks bottom
+\everyfootingmarks bottom
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\parseargdef\headings{\csname HEADINGS#1\endcsname}
+
+\def\headingsoff{% non-global headings elimination
+  \evenheadline={\hfil}\evenfootline={\hfil}%
+   \oddheadline={\hfil}\oddfootline={\hfil}%
+}
+
+\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
+\HEADINGSoff  % it's the default
+
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\thisisundefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemindicate{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil\relax
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    %
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablecheck{table}%
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablecheck{ftable}%
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
+}
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  %
+  % Try typesetting the item mark so that if the document erroneously says
+  % something like @itemize @samp (intending @table), there's an error
+  % right away at the @itemize.  It's not the best error message in the
+  % world, but it's better than leaving it to the @item.  This means if
+  % the user wants an empty mark, they have to say @w{} not just @w.
+  \def\itemcontents{#1}%
+  \setbox0 = \hbox{\itemcontents}%
+  %
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  %
+  \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   %
+   \ifinner\else
+     \vadjust{\penalty 1200}% not good to break after first line of item.
+   \fi
+   % We can be in inner vertical mode in a footnote, although an
+   % @itemize looks awful there.
+  }%
+  \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% multitable-only commands.
+% 
+% @headitem starts a heading row, which we typeset in bold.  Assignments
+% have to be global since we are inside the implicit group of an
+% alignment entry.  \everycr below resets \everytab so we don't have to
+% undo it ourselves.
+\def\headitemfont{\b}% for people to use in the template row; not changeable
+\def\headitem{%
+  \checkenv\multitable
+  \crcr
+  \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
+  \global\everytab={\bf}% can't use \headitemfont since the parsing differs
+  \the\everytab % for the first item
+}%
+%
+% default for tables with no headings.
+\let\headitemcrhook=\relax
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we again encounter the problem the 1sp was intended to solve.
+%					--karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
+  \vskip\parskip
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
+  %
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}% Reset from possible headitem.
+      \global\colcount=0 % Reset the column counter.
+      %
+      % Check for saved footnotes, etc.:
+      \checkinserts
+      %
+      % Perhaps a \nobreak, then reset:
+      \headitemcrhook
+      \global\let\headitemcrhook=\relax
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup &%
+    \global\advance\colcount by 1
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the user has set preamble in terms of percent of \hsize we will
+      % use that dimension as the width of the column, and the \leftskip
+      % will keep entries from bumping into each other.  Table will start at
+      % left margin and final column will justify at right margin.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+	% The first column will be indented with the surrounding text.
+	\advance\hsize by\leftskip
+      \else
+	\ifsetpercent \else
+	  % If user has not set preamble in terms of percent of \hsize
+	  % we will advance \hsize by \multitablecolspace.
+	  \advance\hsize by \multitablecolspace
+	\fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+% Test to see if parskip is larger than space between lines of
+% table. If not, do nothing.
+%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+                                      % than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+                                      % than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+  % Scan in ``verbatim'' mode:
+  \obeylines
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the command name as a string, e.g., `ifinfo'.
+    %
+    % Define a command to find the next `@end #1'.
+    \long\def\doignoretext##1^^M@end #1{%
+      \doignoretextyyy##1^^M@#1\_STOP_}%
+    %
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty			% Nothing found.
+    \let\next\doignoretextzzz
+  \else					% Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy		% ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
+  \fi
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0	% We have just found the outermost @end.
+    \let\next\enddoignore
+  \else				% Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+  % Ignore anything after the last `@end #1'; this matters in verbatim
+  % environments, where otherwise the newline after an ignored conditional
+  % would result in a blank line in the output.
+  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+  \catcode`\-=\active \catcode`\_=\active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\normaldash \let_\normalunderscore
+  }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file.  This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+% 
+% Unfortunately, this has the consequence that when _ is in the *value*
+% of an @set, it does not print properly in the roman fonts (get the cmr
+% dot accent at position 126 instead).  No fix comes to mind, and it's
+% been this way since 2003 or earlier, so just ignore it.
+% 
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% Like \expandablevalue, but completely expandable (the \message in the
+% definition above operates at the execution level of TeX).  Used when
+% writing to auxiliary files, due to the expansion that \write does.
+% If flag is undefined, pass through an unexpanded @value command: maybe it 
+% will be set by the time it is read back in.
+%
+% NB flag names containing - or _ may not work here.
+\def\dummyvalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \noexpand\value{#1}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% Used for @value's in index entries to form the sort key: expand the @value
+% if possible, otherwise sort late.
+\def\indexnofontsvalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    ZZZZZZZ
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+% 
+% To get the special treatment we need for `@end ifset,' we call
+% \makecond and then redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end executes the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written
+% without the @) is in fact defined.  We can only feasibly check at the
+% TeX level, so something like `mathcode' is going to considered
+% defined even though it is not a Texinfo command.
+% 
+\makecond{ifcommanddefined}
+\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
+%
+\def\doifcmddefined#1#2{{%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname #2\endcsname\relax
+      #1% If not defined, \let\next as above.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifcmddefinedfail{\doignore{ifcommanddefined}}
+
+% @ifcommandnotdefined CMD ... handled similar to @ifclear above.
+\makecond{ifcommandnotdefined}
+\def\ifcommandnotdefined{%
+  \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}
+\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}
+
+% Set the `txicommandconditionals' variable, so documents have a way to
+% test if the @ifcommand...defined conditionals are available.
+\set txicommandconditionals
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named IX.
+% It automatically defines \IXindex such that
+% \IXindex ...rest of line... puts an entry in the index IX.
+% It also defines \IXindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is IX.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \expandafter\chardef\csname#1indfile\endcsname=0
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \expandafter\chardef\csname#1indfile\endcsname=0
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+% The default indices:
+\newindex{cp}%      concepts,
+\newcodeindex{fn}%  functions,
+\newcodeindex{vr}%  variables,
+\newcodeindex{tp}%  types,
+\newcodeindex{ky}%  keys
+\newcodeindex{pg}%  and programs.
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  \requireopenindexfile{#3}%
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all index macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is the two-letter name of the index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
+\def\doindexxxx #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
+\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
+
+
+% Used when writing an index entry out to an index file to prevent
+% expansion of Texinfo commands that can appear in an index entry.
+%
+\def\indexdummies{%
+  \escapechar = `\\     % use backslash in output files.
+  \definedummyletter\@%
+  \definedummyletter\ %
+  %
+  % For texindex which always views { and } as separators.
+  \def\{{\lbracechar{}}%
+  \def\}{\rbracechar{}}%
+  %
+  % Do the redefinitions.
+  \definedummies
+}
+
+% Used for the aux and toc files, where @ is the escape character.
+%
+\def\atdummies{%
+  \definedummyletter\@%
+  \definedummyletter\ %
+  \definedummyletter\{%
+  \definedummyletter\}%
+  %
+  % Do the redefinitions.
+  \definedummies
+  \otherbackslash
+}
+
+% \definedummyword defines \#1 as \string\#1\space, thus effectively
+% preventing its expansion.  This is used only for control words,
+% not control letters, because the \space would be incorrect for
+% control characters, but is needed to separate the control word
+% from whatever follows.
+%
+% These can be used both for control words that take an argument and
+% those that do not.  If it is followed by {arg} in the input, then
+% that will dutifully get written to the index (or wherever).
+%
+% For control letters, we have \definedummyletter, which omits the
+% space.
+%
+\def\definedummyword  #1{\def#1{\string#1\space}}%
+\def\definedummyletter#1{\def#1{\string#1}}%
+\let\definedummyaccent\definedummyletter
+
+% Called from \indexdummies and \atdummies, to effectively prevent
+% the expansion of commands.
+%
+\def\definedummies{%
+  %
+  \let\commondummyword\definedummyword
+  \let\commondummyletter\definedummyletter
+  \let\commondummyaccent\definedummyaccent
+  \commondummiesnofonts
+  %
+  \definedummyletter\_%
+  \definedummyletter\-%
+  %
+  % Non-English letters.
+  \definedummyword\AA
+  \definedummyword\AE
+  \definedummyword\DH
+  \definedummyword\L
+  \definedummyword\O
+  \definedummyword\OE
+  \definedummyword\TH
+  \definedummyword\aa
+  \definedummyword\ae
+  \definedummyword\dh
+  \definedummyword\exclamdown
+  \definedummyword\l
+  \definedummyword\o
+  \definedummyword\oe
+  \definedummyword\ordf
+  \definedummyword\ordm
+  \definedummyword\questiondown
+  \definedummyword\ss
+  \definedummyword\th
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword\bf
+  \definedummyword\gtr
+  \definedummyword\hat
+  \definedummyword\less
+  \definedummyword\sf
+  \definedummyword\sl
+  \definedummyword\tclose
+  \definedummyword\tt
+  %
+  \definedummyword\LaTeX
+  \definedummyword\TeX
+  %
+  % Assorted special characters.
+  \definedummyword\atchar
+  \definedummyword\arrow
+  \definedummyword\bullet
+  \definedummyword\comma
+  \definedummyword\copyright
+  \definedummyword\registeredsymbol
+  \definedummyword\dots
+  \definedummyword\enddots
+  \definedummyword\entrybreak
+  \definedummyword\equiv
+  \definedummyword\error
+  \definedummyword\euro
+  \definedummyword\expansion
+  \definedummyword\geq
+  \definedummyword\guillemetleft
+  \definedummyword\guillemetright
+  \definedummyword\guilsinglleft
+  \definedummyword\guilsinglright
+  \definedummyword\lbracechar
+  \definedummyword\leq
+  \definedummyword\mathopsup
+  \definedummyword\minus
+  \definedummyword\ogonek
+  \definedummyword\pounds
+  \definedummyword\point
+  \definedummyword\print
+  \definedummyword\quotedblbase
+  \definedummyword\quotedblleft
+  \definedummyword\quotedblright
+  \definedummyword\quoteleft
+  \definedummyword\quoteright
+  \definedummyword\quotesinglbase
+  \definedummyword\rbracechar
+  \definedummyword\result
+  \definedummyword\sub
+  \definedummyword\sup
+  \definedummyword\textdegree
+  %
+  % We want to disable all macros so that they are not expanded by \write.
+  \macrolist
+  \let\value\dummyvalue
+  %
+  \normalturnoffactive
+}
+
+% \commondummiesnofonts: common to \definedummies and \indexnofonts.
+% Define \commondummyletter, \commondummyaccent and \commondummyword before
+% using.  Used for accents, font commands, and various control letters.
+%
+\def\commondummiesnofonts{%
+  % Control letters and accents.
+  \commondummyletter\!%
+  \commondummyaccent\"%
+  \commondummyaccent\'%
+  \commondummyletter\*%
+  \commondummyaccent\,%
+  \commondummyletter\.%
+  \commondummyletter\/%
+  \commondummyletter\:%
+  \commondummyaccent\=%
+  \commondummyletter\?%
+  \commondummyaccent\^%
+  \commondummyaccent\`%
+  \commondummyaccent\~%
+  \commondummyword\u
+  \commondummyword\v
+  \commondummyword\H
+  \commondummyword\dotaccent
+  \commondummyword\ogonek
+  \commondummyword\ringaccent
+  \commondummyword\tieaccent
+  \commondummyword\ubaraccent
+  \commondummyword\udotaccent
+  \commondummyword\dotless
+  %
+  % Texinfo font commands.
+  \commondummyword\b
+  \commondummyword\i
+  \commondummyword\r
+  \commondummyword\sansserif
+  \commondummyword\sc
+  \commondummyword\slanted
+  \commondummyword\t
+  %
+  % Commands that take arguments.
+  \commondummyword\abbr
+  \commondummyword\acronym
+  \commondummyword\anchor
+  \commondummyword\cite
+  \commondummyword\code
+  \commondummyword\command
+  \commondummyword\dfn
+  \commondummyword\dmn
+  \commondummyword\email
+  \commondummyword\emph
+  \commondummyword\env
+  \commondummyword\file
+  \commondummyword\image
+  \commondummyword\indicateurl
+  \commondummyword\inforef
+  \commondummyword\kbd
+  \commondummyword\key
+  \commondummyword\math
+  \commondummyword\option
+  \commondummyword\pxref
+  \commondummyword\ref
+  \commondummyword\samp
+  \commondummyword\strong
+  \commondummyword\tie
+  \commondummyword\U
+  \commondummyword\uref
+  \commondummyword\url
+  \commondummyword\var
+  \commondummyword\verb
+  \commondummyword\w
+  \commondummyword\xref
+}
+
+% For testing: output @{ and @} in index sort strings as \{ and \}.
+\newif\ifusebracesinindexes
+
+\let\indexlbrace\relax
+\let\indexrbrace\relax
+
+{\catcode`\@=0
+\catcode`\\=13
+  @gdef@backslashdisappear{@def\{}}
+}
+
+{
+\catcode`\<=13
+\catcode`\-=13
+\catcode`\`=13
+  \gdef\indexnonalnumdisappear{%
+    \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else
+      % @set txiindexlquoteignore makes us ignore left quotes in the sort term.
+      % (Introduced for FSFS 2nd ed.)
+      \let`=\empty
+    \fi
+    %
+    \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else
+      \backslashdisappear
+    \fi
+    %
+    \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else
+      \def-{}%
+    \fi
+    \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else
+      \def<{}%
+    \fi
+    \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else
+      \def\@{}%
+    \fi
+  }
+
+  \gdef\indexnonalnumreappear{%
+    \useindexbackslash
+    \let-\normaldash
+    \let<\normalless
+    \def\@{@}%
+  }
+}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+  % Accent commands should become @asis.
+  \def\commondummyaccent##1{\let##1\asis}%
+  % We can just ignore other control letters.
+  \def\commondummyletter##1{\let##1\empty}%
+  % All control words become @asis by default; overrides below.
+  \let\commondummyword\commondummyaccent
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  \def\_{\normalunderscore}%
+  \def\-{}% @- shouldn't affect sorting
+  %
+  \uccode`\1=`\{ \uppercase{\def\{{1}}%
+  \uccode`\1=`\} \uppercase{\def\}{1}}%
+  \let\lbracechar\{%
+  \let\rbracechar\}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\DH{DZZ}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\TH{TH}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\dh{dzz}%
+  \def\exclamdown{!}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  \def\o{o}%
+  \def\questiondown{?}%
+  \def\ss{ss}%
+  \def\th{th}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.  \defglyph gives the control sequence a
+  % definition that removes the {} that follows its use.
+  \defglyph\atchar{@}%
+  \defglyph\arrow{->}%
+  \defglyph\bullet{bullet}%
+  \defglyph\comma{,}%
+  \defglyph\copyright{copyright}%
+  \defglyph\dots{...}%
+  \defglyph\enddots{...}%
+  \defglyph\equiv{==}%
+  \defglyph\error{error}%
+  \defglyph\euro{euro}%
+  \defglyph\expansion{==>}%
+  \defglyph\geq{>=}%
+  \defglyph\guillemetleft{<<}%
+  \defglyph\guillemetright{>>}%
+  \defglyph\guilsinglleft{<}%
+  \defglyph\guilsinglright{>}%
+  \defglyph\leq{<=}%
+  \defglyph\lbracechar{\{}%
+  \defglyph\minus{-}%
+  \defglyph\point{.}%
+  \defglyph\pounds{pounds}%
+  \defglyph\print{-|}%
+  \defglyph\quotedblbase{"}%
+  \defglyph\quotedblleft{"}%
+  \defglyph\quotedblright{"}%
+  \defglyph\quoteleft{`}%
+  \defglyph\quoteright{'}%
+  \defglyph\quotesinglbase{,}%
+  \defglyph\rbracechar{\}}%
+  \defglyph\registeredsymbol{R}%
+  \defglyph\result{=>}%
+  \defglyph\textdegree{o}%
+  %
+  % We need to get rid of all macros, leaving only the arguments (if present).
+  % Of course this is not nearly correct, but it is the best we can do for now.
+  % makeinfo does not expand macros in the argument to @deffn, which ends up
+  % writing an index entry, and texindex isn't prepared for an index sort entry
+  % that starts with \.
+  %
+  % Since macro invocations are followed by braces, we can just redefine them
+  % to take a single TeX argument.  The case of a macro invocation that
+  % goes to end-of-line is not handled.
+  %
+  \macrolist
+  \let\value\indexnofontsvalue
+}
+\def\defglyph#1#2{\def#1##1{#2}} % see above
+
+
+
+
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+% TODO: Two-level index?  Operation index?
+
+% Workhorse for all indexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+  \iflinks
+  {%
+    \requireopenindexfile{#1}%
+    % Store the main index entry text (including the third arg).
+    \toks0 = {#2}%
+    % If third arg is present, precede it with a space.
+    \def\thirdarg{#3}%
+    \ifx\thirdarg\empty \else
+      \toks0 = \expandafter{\the\toks0 \space #3}%
+    \fi
+    %
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \safewhatsit\dosubindwrite
+  }%
+  \fi
+}
+
+% Check if an index file has been opened, and if not, open it.
+\def\requireopenindexfile#1{%
+\ifnum\csname #1indfile\endcsname=0
+  \expandafter\newwrite \csname#1indfile\endcsname
+  \edef\suffix{#1}%
+  % A .fls suffix would conflict with the file extension for the output
+  % of -recorder, so use .f1s instead.
+  \ifx\suffix\indexisfl\def\suffix{f1}\fi
+  % Open the file
+  \immediate\openout\csname#1indfile\endcsname \jobname.\suffix
+  % Using \immediate above here prevents an object entering into the current 
+  % box, which could confound checks such as those in \safewhatsit for
+  % preceding skips.
+  \typeout{Writing index file \jobname.\suffix}%
+\fi}
+\def\indexisfl{fl}
+
+% Output \ as {\indexbackslash}, because \ is an escape character in
+% the index files.
+\let\indexbackslash=\relax
+{\catcode`\@=0 \catcode`\\=\active
+  @gdef@useindexbackslash{@def\{{@indexbackslash}}}
+}
+
+% Definition for writing index entry text.
+\def\sortas#1{\ignorespaces}%
+
+% Definition for writing index entry sort key.  Should occur at the at
+% the beginning of the index entry, like
+%     @cindex @sortas{september} \september
+% The \ignorespaces takes care of following space, but there's no way
+% to remove space before it.
+{
+\catcode`\-=13
+\gdef\indexwritesortas{%
+  \begingroup
+  \indexnonalnumreappear
+  \indexwritesortasxxx}
+\gdef\indexwritesortasxxx#1{%
+  \xdef\indexsortkey{#1}\endgroup}
+}
+
+
+% Write the entry in \toks0 to the index file.
+%
+\def\dosubindwrite{%
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+  \fi
+  %
+  % Remember, we are within a group.
+  \indexdummies % Must do this here, since \bf, etc expand at this stage
+  \useindexbackslash % \indexbackslash isn't defined now so it will be output 
+                     % as is; and it will print as backslash.
+  % The braces around \indexbrace are recognized by texindex.
+  %
+  % Get the string to sort by, by processing the index entry with all
+  % font commands turned off.
+  {\indexnofonts
+   \def\lbracechar{{\indexlbrace}}%
+   \def\rbracechar{{\indexrbrace}}%
+   \let\{=\lbracechar
+   \let\}=\rbracechar
+   \indexnonalnumdisappear
+   \xdef\indexsortkey{}%
+   \let\sortas=\indexwritesortas
+   \edef\temp{\the\toks0}%
+   \setbox\dummybox = \hbox{\temp}% Make sure to execute any \sortas
+   \ifx\indexsortkey\empty
+     \xdef\indexsortkey{\temp}%
+     \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi
+   \fi
+  }%
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\indexsortkey}{\noexpand\folio}{\the\toks0}}%
+  }%
+  \temp
+}
+\newbox\dummybox % used above
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero.  The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{\ifhmode
+  #1%
+ \else
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \whatsitskip = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \whatsitpenalty = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\whatsitskip glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\whatsitskip
+  \fi
+  %
+  #1%
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\whatsitskip
+  \fi
+\fi}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \plainfrenchspacing
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+  %
+  % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 12
+  % See comment in \requireopenindexfile.
+  \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi
+  \openin 1 \jobname.\indexname s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+    \typeout{No file \jobname.\indexname s.}%
+  \else
+    \catcode`\\ = 0
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \thisline
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\ttbackslash}%
+      \let\indexlbrace\{   % Likewise, set these sequences for braces
+      \let\indexrbrace\}   % used in the sort key.
+      \begindoublecolumns
+      \let\dotheinsertentrybox\dotheinsertentryboxwithpenalty
+      %
+      % Read input from the index file line by line.
+      \loopdo
+        \ifeof1 \else
+          \read 1 to \nextline
+        \fi
+        %
+        \indexinputprocessing
+        \thisline
+        %
+        \ifeof1\else
+        \let\thisline\nextline
+      \repeat
+      %%
+      \enddoublecolumns
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+\def\loopdo#1\repeat{\def\body{#1}\loopdoxxx}
+\def\loopdoxxx{\let\next=\relax\body\let\next=\loopdoxxx\fi\next}
+
+\def\indexinputprocessing{%
+  \ifeof1
+    \let\firsttoken\relax
+  \else
+    \edef\act{\gdef\noexpand\firsttoken{\getfirsttoken\nextline}}%
+    \act
+  \fi
+}
+\def\getfirsttoken#1{\expandafter\getfirsttokenx#1\endfirsttoken}
+\long\def\getfirsttokenx#1#2\endfirsttoken{\noexpand#1}
+
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13
+\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13
+\catcode`\$=3
+\gdef\initialglyphs{%
+  % Some changes for non-alphabetic characters.  Using the glyphs from the
+  % math fonts looks more consistent than the typewriter font used elsewhere
+  % for these characters.
+  \def\indexbackslash{\math{\backslash}}%
+  \let\\=\indexbackslash
+  %
+  % Can't get bold backslash so don't use bold forward slash
+  \catcode`\/=13
+  \def/{{\secrmnotbold \normalslash}}%
+  \def-{{\normaldash\normaldash}}% en dash `--'
+  \def^{{\chapbf \normalcaret}}%
+  \def~{{\chapbf \normaltilde}}%
+  \def\_{%
+     \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }%
+  \def|{$\vert$}%
+  \def<{$\less$}%
+  \def>{$\gtr$}%
+  \def+{$\normalplus$}%
+}}
+
+\def\initial{%
+  \bgroup
+  \initialglyphs
+  \initialx
+}
+
+\def\initialx#1{%
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  % The glue before the bonus allows a little bit of space at the
+  % bottom of a column to reduce an increase in inter-line spacing.
+  \nobreak
+  \vskip 0pt plus 5\baselineskip
+  \penalty -300 
+  \vskip 0pt plus -5\baselineskip
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus 1\baselineskip
+  \leftline{\secfonts \kern-0.05em \secbf #1}%
+  % \secfonts is inside the argument of \leftline so that the change of
+  % \baselineskip will not affect any glue inserted before the vbox that
+  % \leftline creates.
+  % Do our best not to break after the initial.
+  \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
+  \egroup % \initialglyphs
+}
+
+\newdimen\entryrightmargin
+\entryrightmargin=0pt
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+\def\entry{%
+  \begingroup
+    %
+    % For pdfTeX and XeTeX.
+    % The redefinition of \domark stops marks being added in \pdflink to 
+    % preserve coloured links across page boundaries.  Otherwise the marks
+    % would get in the way of \lastbox in \insertentrybox.
+    \let\domark\relax
+    %
+    % Start a new paragraph if necessary, so our assignments below can't
+    % affect previous text.
+    \par
+    %
+    % No extra space above this paragraph.
+    \parskip = 0in
+    %
+    % When reading the text of entry, convert explicit line breaks
+    % from @* into spaces.  The user might give these in long section
+    % titles, for instance.
+    \def\*{\unskip\space\ignorespaces}%
+    \def\entrybreak{\hfil\break}% An undocumented command
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\entrybreak{\unskip\space\ignorespaces}%
+\def\doentry{%
+    % Save the text of the entry
+    \global\setbox\boxA=\hbox\bgroup
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+      % Not absorbing as a macro argument reduces the chance of problems
+      % with catcodes occurring.
+}
+{\catcode`\@=11
+\gdef\finishentry#1{%
+    \egroup % end box A
+    \dimen@ = \wd\boxA % Length of text of entry
+    \global\setbox\boxA=\hbox\bgroup\unhbox\boxA
+    % #1 is the page number.
+    %
+    % Get the width of the page numbers, and only use
+    % leaders if they are present.
+    \global\setbox\boxB = \hbox{#1}%
+    \ifdim\wd\boxB = 0pt
+      \null\nobreak\hfill\ %
+    \else
+      %
+      \null\nobreak\indexdotfill % Have leaders before the page number.
+      %
+      \ifpdf
+        \pdfgettoks#1.%
+        \hskip\skip\thinshrinkable\the\toksA
+      \else
+        \ifx\XeTeXrevision\thisisundefined
+          \hskip\skip\thinshrinkable #1%
+        \else
+          \pdfgettoks#1.%
+          \hskip\skip\thinshrinkable\the\toksA
+        \fi
+      \fi
+    \fi
+    \egroup % end \boxA
+    \ifdim\wd\boxB = 0pt
+      \global\setbox\entrybox=\vbox{\unhbox\boxA}%
+    \else
+    \global\setbox\entrybox=\vbox\bgroup
+      % We want the text of the entries to be aligned to the left, and the
+      % page numbers to be aligned to the right.
+      %
+      \parindent = 0pt
+      \advance\leftskip by 0pt plus 1fil
+      \advance\leftskip by 0pt plus -1fill
+      \rightskip = 0pt plus -1fil
+      \advance\rightskip by 0pt plus 1fill
+      % Cause last line, which could consist of page numbers on their own
+      % if the list of page numbers is long, to be aligned to the right.
+      \parfillskip=0pt plus -1fill
+      %
+      \advance\rightskip by \entryrightmargin
+      % Determine how far we can stretch into the margin.
+      % This allows, e.g., "Appendix H  GNU Free Documentation License" to
+      % fit on one line in @letterpaper format.
+      \ifdim\entryrightmargin>2.1em
+        \dimen@i=2.1em
+      \else
+        \dimen@i=0em
+      \fi
+      \advance \parfillskip by 0pt minus 1\dimen@i
+      %
+      \dimen@ii = \hsize
+      \advance\dimen@ii by -1\leftskip
+      \advance\dimen@ii by -1\entryrightmargin
+      \advance\dimen@ii by 1\dimen@i
+      \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line
+      \ifdim\dimen@ > 0.8\dimen@ii   % due to long index text
+        % Try to split the text roughly evenly.  \dimen@ will be the length of 
+        % the first line.
+        \dimen@ = 0.7\dimen@
+        \dimen@ii = \hsize
+        \ifnum\dimen@>\dimen@ii
+          % If the entry is too long (for example, if it needs more than
+          % two lines), use all the space in the first line.
+          \dimen@ = \dimen@ii
+        \fi
+        \advance\leftskip by 0pt plus 1fill % ragged right
+        \advance \dimen@ by 1\rightskip
+        \parshape = 2 0pt \dimen@ 0em \dimen@ii
+        % Ideally we'd add a finite glue at the end of the first line only,
+        % instead of using \parshape with explicit line lengths, but TeX
+        % doesn't seem to provide a way to do such a thing.
+        %
+        % Indent all lines but the first one.
+        \advance\leftskip by 1em
+        \advance\parindent by -1em
+      \fi\fi
+      \indent % start paragraph
+      \unhbox\boxA
+      %
+      % Do not prefer a separate line ending with a hyphen to fewer lines.
+      \finalhyphendemerits = 0
+      %
+      % Word spacing - no stretch
+      \spaceskip=\fontdimen2\font minus \fontdimen4\font
+      %
+      \linepenalty=1000  % Discourage line breaks.
+      \hyphenpenalty=5000  % Discourage hyphenation.
+      %
+      \par % format the paragraph
+    \egroup % The \vbox
+    \fi
+  \endgroup
+  \dotheinsertentrybox
+}}
+
+\newskip\thinshrinkable
+\skip\thinshrinkable=.15em minus .15em
+
+\newbox\entrybox
+\def\insertentrybox{%
+  \ourunvbox\entrybox
+}
+
+% default definition
+\let\dotheinsertentrybox\insertentrybox
+
+% Use \lastbox to take apart vbox box by box, and add each sub-box
+% to the current vertical list.
+\def\ourunvbox#1{%
+\bgroup % for local binding of \delayedbox
+  % Remove the last box from box #1
+  \global\setbox#1=\vbox{%
+    \unvbox#1%
+    \unskip % remove any glue
+    \unpenalty
+    \global\setbox\interbox=\lastbox
+  }%
+  \setbox\delayedbox=\box\interbox
+  \ifdim\ht#1=0pt\else
+    \ourunvbox#1 % Repeat on what's left of the box
+    \nobreak
+  \fi
+  \box\delayedbox
+\egroup
+}
+\newbox\delayedbox
+\newbox\interbox
+
+% Used from \printindex.  \firsttoken should be the first token
+% after the \entry.  If it's not another \entry, we are at the last
+% line of a group of index entries, so insert a penalty to discourage
+% widowed index entries.
+\def\dotheinsertentryboxwithpenalty{%
+  \ifx\firsttoken\isentry
+  \else
+    \penalty 9000
+  \fi
+  \insertentrybox
+}
+\def\isentry{\entry}%
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+% The filll stretch here overpowers both the fil and fill stretch to push
+% the page number to the right.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll}
+
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+      #2
+    \else
+      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+    \fi
+  \fi
+  \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11  % private names
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+% Use inside an output routine to save \topmark and \firstmark
+\def\savemarks{%
+  \global\savedtopmark=\expandafter{\topmark }%
+  \global\savedfirstmark=\expandafter{\firstmark }%
+}
+\newtoks\savedtopmark
+\newtoks\savedfirstmark
+
+% Set \topmark and \firstmark for next time \output runs.
+% Can't be run from withinside \output (because any material
+% added while an output routine is active, including 
+% penalties, is saved for after it finishes).  The page so far
+% should be empty, otherwise what's on it will be thrown away.
+\def\restoremarks{%
+  \mark{\the\savedtopmark}%
+  \bgroup\output = {%
+    \setbox\dummybox=\box\PAGE
+  }abc\eject\egroup
+  % "abc" because output routine doesn't fire for a completely empty page.
+  \mark{\the\savedfirstmark}%
+}
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % If not much space left on page, start a new page.
+  \ifdim\pagetotal>0.8\vsize\vfill\eject\fi
+  %
+  % Grab any single-column material above us.
+  \output = {%
+    %
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+    \savemarks
+  }%
+  \eject % run that output routine to set \partialpage
+  \restoremarks
+  %
+  % We recover the two marks that the last output routine saved in order
+  % to propagate the information in marks added around a chapter heading,
+  % which could be otherwise be lost by the time the final page is output.
+  %
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Double the \vsize as well.
+  \advance\vsize by -\ht\partialpage
+  \vsize = 2\vsize
+  %
+  % For the benefit of balancing columns
+  \advance\baselineskip by 0pt plus 0.5pt
+}
+
+% The double-column output routine for all double-column pages except
+% the last, which is done by \balancecolumns.
+%
+\def\doublecolumnout{%
+  %
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@
+  \global\advance\vsize by 2\ht\partialpage
+  \onepageout\pagesofar
+  \unvbox\PAGE
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\txipagewidth{\box0\hfil\box2}%
+}
+
+
+% Finished with with double columns.
+\def\enddoublecolumns{%
+  % The following penalty ensures that the page builder is exercised
+  % _before_ we change the output routine.  This is necessary in the
+  % following situation:
+  %
+  % The last section of the index consists only of a single entry.
+  % Before this section, \pagetotal is less than \pagegoal, so no
+  % break occurs before the last section starts.  However, the last
+  % section, consisting of \initial and the single \entry, does not
+  % fit on the page and has to be broken off.  Without the following
+  % penalty the page builder will not be exercised until \eject
+  % below, and by that time we'll already have changed the output
+  % routine to the \balancecolumns version, so the next-to-last
+  % double-column page will be processed with \balancecolumns, which
+  % is wrong:  The two columns will go to the main vertical list, with
+  % the broken-off section in the recent contributions.  As soon as
+  % the output routine finishes, TeX starts reconsidering the page
+  % break.  The two columns and the broken-off section both fit on the
+  % page, because the two columns now take up only half of the page
+  % goal.  When TeX sees \eject from below which follows the final
+  % section, it invokes the new output routine that we've set after
+  % \balancecolumns below; \onepageout will try to fit the two columns
+  % and the final section into the vbox of \txipageheight (see
+  % \pagebody), causing an overfull box.
+  %
+  % Note that glue won't work here, because glue does not exercise the
+  % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+  \penalty0
+  %
+  \output = {%
+    % Split the last of the double-column material.
+    \savemarks
+    \balancecolumns
+  }%
+  \eject % call the \output just set
+  \ifdim\pagetotal=0pt
+    % Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.
+    \global\output = {\onepageout{\pagecontents\PAGE}}%
+    %
+    \endgroup % started in \begindoublecolumns
+    \restoremarks
+    % Leave the double-column material on the current page, no automatic
+    % page break.
+    \box\balancedcolumns
+    %
+    % \pagegoal was set to the doubled \vsize above, since we restarted
+    % the current page.  We're now back to normal single-column
+    % typesetting, so reset \pagegoal to the normal \vsize.
+    \global\vsize = \txipageheight %
+    \pagegoal = \txipageheight %
+  \else
+    % We had some left-over material.  This might happen when \doublecolumnout
+    % is called in \balancecolumns.  Try again.
+    \expandafter\enddoublecolumns
+  \fi
+}
+\newbox\balancedcolumns
+\setbox\balancedcolumns=\vbox{shouldnt see this}%
+%
+% Only called for the last of the double column material.  \doublecolumnout 
+% does the others.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \ifdim\dimen@<5\baselineskip
+    % Don't split a short final column in two.
+    \setbox2=\vbox{}%
+    \global\setbox\balancedcolumns=\vbox{\pagesofar}%
+  \else
+    \divide\dimen@ by 2 % target to split to
+    \dimen@ii = \dimen@
+    \splittopskip = \topskip
+    % Loop until left column is at least as high as the right column.
+    {%
+      \vbadness = 10000
+      \loop
+        \global\setbox3 = \copy0
+        \global\setbox1 = \vsplit3 to \dimen@
+      \ifdim\ht1<\ht3
+        \global\advance\dimen@ by 1pt
+      \repeat
+    }%
+    % Now the left column is in box 1, and the right column in box 3.
+    %
+    % Check whether the left column has come out higher than the page itself.  
+    % (Note that we have doubled \vsize for the double columns, so
+    % the actual height of the page is 0.5\vsize).
+    \ifdim2\ht1>\vsize
+      % It appears that we have been called upon to balance too much material.
+      % Output some of it with \doublecolumnout, leaving the rest on the page.
+      \setbox\PAGE=\box0
+      \doublecolumnout
+    \else
+      % Compare the heights of the two columns.
+      \ifdim4\ht1>5\ht3
+        % Column heights are too different, so don't make their bottoms
+        % flush with each other.
+        \setbox2=\vbox to \ht1 {\unvbox3\vfill}%
+        \setbox0=\vbox to \ht1 {\unvbox1\vfill}%
+      \else
+        % Make column bottoms flush with each other.
+        \setbox2=\vbox to\ht1{\unvbox3\unskip}%
+        \setbox0=\vbox to\ht1{\unvbox1\unskip}%
+      \fi
+      \global\setbox\balancedcolumns=\vbox{\pagesofar}%
+    \fi
+  \fi
+  %
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% Let's start with @part.
+\outer\parseargdef\part{\partzzz{#1}}
+\def\partzzz#1{%
+  \chapoddpage
+  \null
+  \vskip.3\vsize  % move it down on the page a bit
+  \begingroup
+    \noindent \titlefonts\rm #1\par % the text
+    \let\lastnode=\empty      % no node to associate with
+    \writetocentry{part}{#1}{}% but put it in the toc
+    \headingsoff              % no headline or footline on the part page
+    % This outputs a mark at the end of the page that clears \thischapter
+    % and \thissection, as is done in \startcontents.
+    \let\pchapsepmacro\relax
+    \chapmacro{}{Yomitfromtoc}{}%
+    \chapoddpage
+  \endgroup
+}
+
+% \unnumberedno is an oxymoron.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines these (using marks) as the number+name, number
+% and name of the chapter.  Page headings and footings can use
+% these.  @section does likewise.
+\def\thischapter{}
+\def\thischapternum{}
+\def\thischaptername{}
+\def\thissection{}
+\def\thissectionnum{}
+\def\thissectionname{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achieve this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unnlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
+  \else
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
+  \fi
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unnlevel
+      \chardef\unnlevel = \absseclevel
+    \fi
+  \else
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+	\errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unnlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unnlevel = 3
+    \fi
+  \fi
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+	\unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
+  \else
+    \if \headtype A%
+      \ifcase\absseclevel
+	  \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+	  \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
+  \fi
+  \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  % \putwordChapter can contain complex things in translations.
+  \toks0=\expandafter{\putwordChapter}%
+  \message{\the\toks0 \space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
+%
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  % \putwordAppendix can contain complex things in translations.
+  \toks0=\expandafter{\putwordAppendix}%
+  \message{\the\toks0 \space \appendixletter}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+% normally unnmhead0 calls unnumberedzzz:
+\outer\parseargdef\unnumbered{\unnmhead0{#1}}
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+% 
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+% normally calls appendixsectionzzz:
+\outer\parseargdef\appendixsection{\apphead1{#1}}
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+% normally calls unnumberedseczzz:
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+% 
+% normally calls numberedsubseczzz:
+\outer\parseargdef\numberedsubsec{\numhead2{#1}}
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+% normally calls appendixsubseczzz:
+\outer\parseargdef\appendixsubsec{\apphead2{#1}}
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+% normally calls unnumberedsubseczzz:
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+% 
+% normally numberedsubsubseczzz:
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally appendixsubsubseczzz:
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally unnumberedsubsubseczzz:
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+\def\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  \vbox{\chapfonts \raggedtitlesettings #1\par}%
+  \nobreak\bigskip \nobreak
+  \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+% Parameter controlling skip before chapter headings (if needed)
+\newskip\chapheadingskip
+
+% Define plain chapter starts, and page on/off switching for it.
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+
+% Start a new page
+\def\chappager{\par\vfill\supereject}
+
+% \chapoddpage - start on an odd page for a new chapter
+% Because \domark is called before \chapoddpage, the filler page will
+% get the headings for the next chapter, which is wrong.  But we don't
+% care -- we just disable all headings on the filler page.
+\def\chapoddpage{%
+  \chappager
+  \ifodd\pageno \else
+    \begingroup
+      \headingsoff
+      \null
+      \chappager
+    \endgroup
+  \fi
+}
+
+\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% \chapmacro - Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+% Not used for @heading series.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yappendixkeyword{Yappendix}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+%
+\def\chapmacro#1#2#3{%
+  \expandafter\ifx\thisenv\titlepage\else
+    \checkenv{}% chapters, etc., should not start inside an environment.
+  \fi
+  % FIXME: \chapmacro is currently called from inside \titlepage when
+  % \setcontentsaftertitlepage to print the "Table of Contents" heading, but
+  % this should probably be done by \sectionheading with an option to print
+  % in chapter size.
+  %
+  % Insert the first mark before the heading break (see notes for \domark).
+  \let\prevchapterdefs=\lastchapterdefs
+  \let\prevsectiondefs=\lastsectiondefs
+  \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
+                        \gdef\thissection{}}%
+  %
+  \def\temptype{#2}%
+  \ifx\temptype\Ynothingkeyword
+    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{\thischaptername}}%
+  \else\ifx\temptype\Yomitfromtockeyword
+    \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{}}%
+  \else\ifx\temptype\Yappendixkeyword
+    \toks0={#1}%
+    \xdef\lastchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\appendixletter}%
+      % \noexpand\putwordAppendix avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
+                                 \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \else
+    \toks0={#1}%
+    \xdef\lastchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\the\chapno}%
+      % \noexpand\putwordChapter avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
+                                 \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \fi\fi\fi
+  %
+  % Output the mark.  Pass it through \safewhatsit, to take care of
+  % the preceding space.
+  \safewhatsit\domark
+  %
+  % Insert the chapter heading break.
+  \pchapsepmacro
+  %
+  % Now the second mark, after the heading break.  No break points
+  % between here and the heading.
+  \let\prevchapterdefs=\lastchapterdefs
+  \let\prevsectiondefs=\lastsectiondefs
+  \domark
+  %
+  {%
+    \chapfonts \rm
+    \let\footnote=\errfootnoteheading % give better error message
+    %
+    % Have to define \lastsection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\lastsection{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
+    \nobreak % Avoid page breaks at the interline glue.
+    \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
+
+
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text of the title,
+% #2 is the section level (sec/subsec/subsubsec),
+% #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc),
+% #4 is the section number.
+%
+\def\seckeyword{sec}
+%
+\def\sectionheading#1#2#3#4{%
+  {%
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
+    %
+    % It is ok for the @heading series commands to appear inside an
+    % environment (it's been historically allowed, though the logic is
+    % dubious), but not the others.
+    \ifx\temptype\Yomitfromtockeyword\else
+      \checkenv{}% non-@*heading should not be in an environment.
+    \fi
+    \let\footnote=\errfootnoteheading
+    %
+    % Switch to the right set of fonts.
+    \csname #2fonts\endcsname \rm
+    %
+    % Insert first mark before the heading break (see notes for \domark).
+    \let\prevsectiondefs=\lastsectiondefs
+    \ifx\temptype\Ynothingkeyword
+      \ifx\sectionlevel\seckeyword
+        \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
+                              \gdef\thissection{\thissectionname}}%
+      \fi
+    \else\ifx\temptype\Yomitfromtockeyword
+      % Don't redefine \thissection.
+    \else\ifx\temptype\Yappendixkeyword
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\lastsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \else
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\lastsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \fi\fi\fi
+    %
+    % Go into vertical mode.  Usually we'll already be there, but we
+    % don't want the following whatsit to end up in a preceding paragraph
+    % if the document didn't happen to have a blank line.
+    \par
+    %
+    % Output the mark.  Pass it through \safewhatsit, to take care of
+    % the preceding space.
+    \safewhatsit\domark
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
+    %
+    % Now the second mark, after the heading break.  No break points
+    % between here and the heading.
+    \global\let\prevsectiondefs=\lastsectiondefs
+    \domark
+    %
+    % Only insert the space after the number if we have a section number.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\lastsection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \lastsection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\lastsection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\lastsection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+    %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chapmacro.
+    \donoderef{#3}%
+    %
+    % Interline glue will be inserted when the vbox is completed.
+    % That glue will be a valid breakpoint for the page, since it'll be
+    % preceded by a whatsit (usually from the \donoderef, or from the
+    % \writetocentry if there was no node).  We don't want to allow that
+    % break, since then the whatsits could end up on page n while the
+    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
+    \nobreak
+    %
+    % Output the actual section heading.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
+  }%
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)  However, when a paragraph is not started next
+  % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out
+  % or the negative glue will cause weirdly wrong output, typically
+  % obscuring the section heading with something else.
+  \vskip-\parskip
+  %
+  % This is so the last item on the main vertical list is a known
+  % \penalty > 10000, so \startdefun, etc., can recognize the situation
+  % and do the needful.
+  \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      {\atdummies
+       \edef\temp{%
+         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+       \temp
+      }%
+    \fi
+  \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdf
+    \global\pdfmakepagedesttrue
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+    \else
+      \global\pdfmakepagedesttrue
+    \fi
+  \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care.  This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+  \catcode`\"=\active
+  \catcode`\$=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
+  \catcode`\\=\active
+  \catcode`\^=\active
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+  \setupdatafile
+  \activecatcodes
+  \input \tocreadfilename
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege@matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \raggedbottom              % Worry more about breakpoints than the bottom.
+    \entryrightmargin=\contentsrightmargin % Don't use the full line length.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref.  We always output on
+% \jobname.toc even if this is redefined.
+%
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+  \startcontents{\putwordTOC}%
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\partentry = \shortpartentry
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  %
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Parts, in the main contents.  Replace the part number, which doesn't
+% exist, with an empty box.  Let's hope all the numbers have the same width.
+% Also ignore the page number, which is conventionally not printed.
+\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
+\def\partentry#1#2#3#4{%
+  % Add stretch and a bonus for breaking the page before the part heading.
+  % This reduces the chance of the page being broken immediately after the
+  % part heading, before a following chapter heading.
+  \vskip 0pt plus 5\baselineskip
+  \penalty-300
+  \vskip 0pt plus -5\baselineskip
+  \dochapentry{\numeralbox\labelspace#1}{}%
+}
+%
+% Parts, in the short toc.
+\def\shortpartentry#1#2#3#4{%
+  \penalty-300
+  \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
+  \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
+}
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     % Move the page numbers slightly to the right
+     \advance\entryrightmargin by -0.05em
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @tex ... @end tex    escapes into raw TeX temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain @ character.
+
+\envdef\tex{%
+  \setupmarkupstyle{tex}%
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \catcode `\`=\other
+  \catcode `\'=\other
+  %
+  % ' is active in math mode (mathcode"8000).  So reset it, and all our
+  % other math active characters (just in case), to plain's definitions.
+  \mathactive
+  %
+  % Inverse of the list at the beginning of the file.
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\/=\ptexslash
+  \let\sp=\ptexsp
+  \let\*=\ptexstar
+  %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode
+  \let\t=\ptext
+  \expandafter \let\csname top\endcsname=\ptextop  % we've made it outer
+  \let\frenchspacing=\plainfrenchspacing
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      \ifnum\lastpenalty<10000
+        % Penalize breaking before the environment, because preceding text
+        % often leads into it.
+        \penalty100
+      \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\def\afterenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \lskip=\leftskip \rskip=\rightskip
+  \leftskip=0pt\rightskip=0pt % we want these *outside*.
+  \cartinner=\hsize \advance\cartinner by-\lskip
+  \advance\cartinner by-\rskip
+  \cartouter=\hsize
+  \advance\cartouter by 18.4pt	% allow for 3pt kerns on either
+				% side, and for 6pt waste from
+				% each corner char, and rule thickness
+  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+  %
+  % If this cartouche directly follows a sectioning command, we need the
+  % \parskip glue (backspaced over by default) or the cartouche can
+  % collide with the section heading.
+  \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi
+  %
+  \setbox\groupbox=\vbox\bgroup
+      \baselineskip=0pt\parskip=0pt\lineskip=0pt
+      \carttop
+      \hbox\bgroup
+	  \hskip\lskip
+	  \vrule\kern3pt
+	  \vbox\bgroup
+	      \kern3pt
+	      \hsize=\cartinner
+	      \baselineskip=\normbskip
+	      \lineskip=\normlskip
+	      \parskip=\normpskip
+	      \vskip -\parskip
+	      \comment % For explanation, see the end of def\group.
+}
+\def\Ecartouche{%
+              \ifhmode\par\fi
+	      \kern3pt
+	  \egroup
+	  \kern3pt\vrule
+	  \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \addgroupbox
+  \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\newdimen\nonfillparindent
+\def\nonfillstart{%
+  \aboveenvbreak
+  \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  % Turn off paragraph indentation but redefine \indent to emulate
+  % the normal \indent.
+  \nonfillparindent=\parindent
+  \parindent = 0pt
+  \let\indent\nonfillindent
+  %
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \let\exdent=\nofillexdent
+}
+
+\begingroup
+\obeyspaces
+% We want to swallow spaces (but not other tokens) after the fake
+% @indent in our nonfill-environments, where spaces are normally
+% active and set to @tie, resulting in them not being ignored after
+% @indent.
+\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
+\gdef\nonfillindentcheck{%
+\ifx\temp %
+\expandafter\nonfillindentgobble%
+\else%
+\leavevmode\nonfillindentbox%
+\fi%
+}%
+\endgroup
+\def\nonfillindentgobble#1{\nonfillindent}
+\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    % end paragraph for sake of leading, in case document has no blank
+    % line.  This is redundant with what happens in \aboveenvbreak, but
+    % we need to do it before changing the fonts, and it's inconvenient
+    % to change the fonts afterward.
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it in one command.  #1 is the env name, #2 the definition.
+\def\makedispenvdef#1#2{%
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two environment synonyms (#1 and #2) for an environment.
+\def\maketwodispenvdef#1#2#3{%
+  \makedispenvdef{#1}{#3}%
+  \makedispenvdef{#2}{#3}%
+}
+%
+% @lisp: indented, narrowed, typewriter font;
+% @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvdef{lisp}{example}{%
+  \nonfillstart
+  \tt\setupmarkupstyle{example}%
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenvdef{display}{%
+  \nonfillstart
+  \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenvdef{format}{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \advance\leftskip by 0pt plus 1fill\relax
+  \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @raggedright does more-or-less normal line breaking but no right
+% justification.  From plain.tex.  Don't stretch around special
+% characters in urls in this environment, since the stretch at the right
+% should be enough.
+\envdef\raggedright{%
+  \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax
+  \def\urefprestretchamount{0pt}%
+  \def\urefpoststretchamount{0pt}%
+}
+\let\Eraggedright\par
+
+\envdef\raggedleft{%
+  \parindent=0pt \leftskip0pt plus2em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedleft\par
+
+\envdef\raggedcenter{%
+  \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedcenter\par
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\makedispenvdef{quotation}{\quotationstart}
+%
+\def\quotationstart{%
+  \indentedblockstart % same as \indentedblock, but increase right margin too.
+  \ifx\nonarrowing\relax
+    \advance\rightskip by \lispnarrowing
+  \fi
+  \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\thisisundefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallquotation{\Equotation}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
+}
+
+% @indentedblock is like @quotation, but indents only on the left and
+% has no optional argument.
+% 
+\makedispenvdef{indentedblock}{\indentedblockstart}
+%
+\def\indentedblockstart{%
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+}
+
+% Keep a nonzero parskip for the environment, since we're doing normal filling.
+%
+\def\Eindentedblock{%
+  \par
+  {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallindentedblock{\Eindentedblock}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+  % Don't do the quotes -- if we do, @set txicodequoteundirected and
+  % @set txicodequotebacktick will not have effect on @verb and
+  % @verbatim, and ?` and !` ligatures won't get disabled.
+  %\do\`\do\'%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \setupmarkupstyle{verb}%
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion.
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+% We typeset each line of the verbatim in an \hbox, so we can handle
+% tabs.  The \global is in case the verbatim line starts with an accent,
+% or some other command that starts with a begin-group.  Otherwise, the
+% entire \verbbox would disappear at the corresponding end-group, before
+% it is typeset.  Meanwhile, we can't have nested verbatim commands
+% (can we?), so the \global won't be overwriting itself.
+\newbox\verbbox
+\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
+%
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
+      \divide\dimen\verbbox by\tabw
+      \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
+      \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
+      \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
+    }%
+  }
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \tt % easiest (and conventionally used) font for verbatim
+  % The \leavevmode here is for blank lines.  Otherwise, we would
+  % never \starttabox and the \egroup would end verbatim mode.
+  \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
+  \tabexpand
+  \setupmarkupstyle{verbatim}%
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count.
+  % Must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters.  Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    \indexnofonts       % Allow `@@' and other weird things in file names.
+    \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
+    \input #1
+    \afterenvbreak
+  }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+    \defunpenalty=10003 % Will keep this @deffn together with the
+                        % following @def command, see below.
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \printdefunline, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    %
+    % As a further refinement, we avoid "club" headers by signalling
+    % with penalty of 10003 after the very first @deffn in the
+    % sequence (see above), and penalty of 10002 after any following
+    % @def command.
+    \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+  \begingroup
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil\relax
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty\defunpenalty  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
+  \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remaining is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) }
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \doingtypefnfalse    % distinguish typed functions from all else
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
+
+\newif\ifdoingtypefn       % doing typed function?
+\newif\ifrettypeownline    % typeset return type on its own line?
+
+% @deftypefnnewline on|off says whether the return type of typed functions
+% are printed on their own line.  This affects @deftypefn, @deftypefun,
+% @deftypeop, and @deftypemethod.
+% 
+\parseargdef\deftypefnnewline{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxideftypefnnl\endcsname
+      = \empty
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxideftypefnnl\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @txideftypefnnl value `\temp',
+                must be on|off}%
+  \fi\fi
+}
+
+% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \doingtypefntrue
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+% Types:
+
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  \par
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % Determine if we are typesetting the return type of a typed function
+  % on a line by itself.
+  \rettypeownlinefalse
+  \ifdoingtypefn  % doing a typed function specifically?
+    % then check user option for putting return type on its own line:
+    \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else
+      \rettypeownlinetrue
+    \fi
+  \fi
+  %
+  % How we'll format the category name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.  We'll always have at
+  % least two.
+  \tempnum = 2
+  %
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  %
+  % If doing a return type on its own line, we'll have another line.
+  \ifrettypeownline
+    \advance\tempnum by 1
+    \def\maybeshapeline{0in \hsize}%
+  \else
+    \def\maybeshapeline{}%
+  \fi
+  %
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  %
+  % The final paragraph shape:
+  \parshape \tempnum  0in \dimen0  \maybeshapeline  \defargsindent \dimen2
+  %
+  % Put the category name at the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% text of the return type
+    \ifx\temp\empty\else
+      \tclose{\temp}% typeset the return type
+      \ifrettypeownline
+        % put return type on its own line; prohibit line break following:
+        \hfil\vadjust{\nobreak}\break  
+      \else
+        \space  % type on same line, so just followed by a space
+      \fi
+    \fi           % no return type
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \rmfont
+  %
+  \boldbrax
+  % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+  % use sl by default (not ttsl),
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  We used to recommend @var for that, so
+  % leave the code in, but it's strange for @var to lead to typewriter.
+  % Nowadays we recommend @code, since the difference between a ttsl hyphen
+  % and a tt hyphen is pretty tiny.  @code also disables ?` !`.
+  \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
+  #1%
+  \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
+
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+% these should not use \errmessage; the glibc manual, at least, actually
+% has such constructs (when documenting function pointers).
+\def\badparencount{%
+  \message{Warning: unbalanced parentheses in @def...}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \message{Warning: unbalanced square brackets in @def...}%
+  \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\thisisundefined
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
+
+% alias because \c means cedilla in @tex or @math
+\let\texinfoc=\c
+
+\newcount\savedcatcodeone
+\newcount\savedcatcodetwo
+
+% Used at the time of macro expansion.
+% Argument is macro body with arguments substituted
+\def\scanmacro#1{%
+  \newlinechar`\^^M
+  \def\xeatspaces{\eatspaces}%
+  %
+  % Temporarily undo catcode changes of \printindex.  Set catcode of @ to
+  % 0 so that @-commands in macro expansions aren't printed literally when 
+  % formatting an index file, where \ is used as the escape character.
+  \savedcatcodeone=\catcode`\@
+  \savedcatcodetwo=\catcode`\\
+  \catcode`\@=0
+  \catcode`\\=\active
+  %
+  % Process the macro body under the current catcode regime.
+  \scantokens{#1@texinfoc}%
+  %
+  \catcode`\@=\savedcatcodeone
+  \catcode`\\=\savedcatcodetwo
+  %
+  % The \texinfoc is to remove the \newlinechar added by \scantokens, and
+  % can be noticed by \parsearg.
+  %   We avoid surrounding the call to \scantokens with \bgroup and \egroup
+  % to allow macros to open or close groups themselves.
+}
+
+% Used for copying and captions
+\def\scanexp#1{%
+  \expandafter\scanmacro\expandafter{#1}%
+}
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+
+% List of all defined macros in the form
+%    \commondummyword\macro1\commondummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+     \toks0 = \expandafter{\macrolist\commondummyword#1}%
+     \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \
+% to recognize macro arguments; this is the job of \mbodybackslash.
+%
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion.  Must do this non-globally, to
+% confine the change to the current group.
+%
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+%
+\def\scanctxt{% used as subroutine
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\~=\other
+  \passthroughcharstrue
+}
+
+\def\scanargctxt{% used for copying and captions, not macros.
+  \scanctxt
+  \catcode`\@=\other
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{% used for @macro definitions
+  \scanctxt
+  \catcode`\ =\other
+  \catcode`\@=\other
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\^^M=\other
+  \usembodybackslash
+}
+
+% Used when scanning braced macro arguments.  Note, however, that catcode
+% changes here are ineffectual if the macro invocation was nested inside
+% an argument to another Texinfo command.
+\def\macroargctxt{%
+  \scanctxt
+  \catcode`\ =\active
+  \catcode`\^^M=\other
+  \catcode`\\=\active
+}
+
+\def\macrolineargctxt{% used for whole-line arguments without braces
+  \scanctxt
+  \catcode`\{=\other
+  \catcode`\}=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+%
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\margbackslash#1{\char`\#1 }
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}% now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0\relax
+  \else
+     \expandafter\parsemargdef \argl;%
+     \if\paramno>256\relax
+       \ifx\eTeXversion\thisisundefined
+         \errhelp = \EMsimple
+         \errmessage{You need eTeX to compile a file with macros with more than 256 arguments}
+       \fi
+     \fi
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     \addtomacrolist{\the\macname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\parseargdef\unmacro{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\commondummyword\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx #1\relax
+    % remove this
+  \else
+    \noexpand\commondummyword \noexpand#1%
+  \fi
+}
+
+% \getargs -- Parse the arguments to a @macro line.  Set \macname to
+% the name of the macro, and \argl to the braced argument list.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname#1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+% This made use of the feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+
+% Parse the optional {params} list to @macro or @rmacro.
+% Set \paramno to the number of arguments,
+% and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a
+% three-param macro.)  Define \macarg.BLAH for each BLAH in the params
+% list to some hook where the argument is to be expanded.  If there are
+% less than 10 arguments that hook is to be replaced by ##N where N
+% is the position in that list, that is to say the macro arguments are to be
+% defined `a la TeX in the macro body.  
+%
+% That gets used by \mbodybackslash (above).
+%
+% If there are 10 or more arguments, a different technique is used: see
+% \parsemmanyargdef.
+%
+\def\parsemargdef#1;{%
+  \paramno=0\def\paramlist{}%
+  \let\hash\relax
+  % \hash is redefined to `#' later to get it into definitions
+  \let\xeatspaces\relax
+  \parsemargdefxxx#1,;,%
+  \ifnum\paramno<10\relax\else
+    \paramno0\relax
+    \parsemmanyargdef@@#1,;,% 10 or more arguments
+  \fi
+}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% \parsemacbody, \parsermacbody
+%
+% Read recursive and nonrecursive macro bodies. (They're different since
+% rec and nonrec macros end differently.)
+% 
+% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro 
+% body to be transformed.
+% Set \macrobody to the body of the macro, and call \defmacro.
+%
+{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+
+% Make @ a letter, so that we can make private-to-Texinfo macro names.
+\edef\texiatcatcode{\the\catcode`\@}
+\catcode `@=11\relax
+
+%%%%%%%%%%%%%% Code for > 10 arguments only   %%%%%%%%%%%%%%%%%%
+
+% If there are 10 or more arguments, a different technique is used, where the
+% hook remains in the body, and when macro is to be expanded the body is
+% processed again to replace the arguments.
+%
+% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
+% argument N value and then \edef the body (nothing else will expand because of
+% the catcode regime under which the body was input).
+%
+% If you compile with TeX (not eTeX), and you have macros with 10 or more
+% arguments, no macro can have more than 256 arguments (else error).
+%
+% In case that there are 10 or more arguments we parse again the arguments
+% list to set new definitions for the \macarg.BLAH macros corresponding to
+% each BLAH argument. It was anyhow needed to parse already once this list
+% in order to count the arguments, and as macros with at most 9 arguments
+% are by far more frequent than macro with 10 or more arguments, defining
+% twice the \macarg.BLAH macros does not cost too much processing power.
+\def\parsemmanyargdef@@#1,{%
+  \if#1;\let\next=\relax
+  \else 
+    \let\next=\parsemmanyargdef@@
+    \edef\tempb{\eatspaces{#1}}%
+    \expandafter\def\expandafter\tempa
+       \expandafter{\csname macarg.\tempb\endcsname}%
+    % Note that we need some extra \noexpand\noexpand, this is because we
+    % don't want \the  to be expanded in the \parsermacbody  as it uses an
+    % \xdef .
+    \expandafter\edef\tempa
+      {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
+    \advance\paramno by 1\relax
+  \fi\next}
+
+
+\let\endargs@\relax
+\let\nil@\relax
+\def\nilm@{\nil@}%
+\long\def\nillm@{\nil@}%
+
+% This macro is expanded during the Texinfo macro expansion, not during its
+% definition.  It gets all the arguments' values and assigns them to macros
+% macarg.ARGNAME
+%
+% #1 is the macro name
+% #2 is the list of argument names
+% #3 is the list of argument values
+\def\getargvals@#1#2#3{%
+  \def\macargdeflist@{}%
+  \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.
+  \def\paramlist{#2,\nil@}%
+  \def\macroname{#1}%
+  \begingroup
+  \macroargctxt
+  \def\argvaluelist{#3,\nil@}%
+  \def\@tempa{#3}%
+  \ifx\@tempa\empty
+    \setemptyargvalues@
+  \else
+    \getargvals@@
+  \fi
+}
+\def\getargvals@@{%
+  \ifx\paramlist\nilm@
+      % Some sanity check needed here that \argvaluelist is also empty.
+      \ifx\argvaluelist\nillm@
+      \else
+        \errhelp = \EMsimple
+        \errmessage{Too many arguments in macro `\macroname'!}%
+      \fi
+      \let\next\macargexpandinbody@
+  \else
+    \ifx\argvaluelist\nillm@
+       % No more arguments values passed to macro.  Set remaining named-arg
+       % macros to empty.
+       \let\next\setemptyargvalues@
+    \else
+      % pop current arg name into \@tempb
+      \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%
+      \expandafter\@tempa\expandafter{\paramlist}%
+       % pop current argument value into \@tempc
+      \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%
+      \expandafter\@tempa\expandafter{\argvaluelist}%
+       % Here \@tempb is the current arg name and \@tempc is the current arg value.
+       % First place the new argument macro definition into \@tempd
+       \expandafter\macname\expandafter{\@tempc}%
+       \expandafter\let\csname macarg.\@tempb\endcsname\relax
+       \expandafter\def\expandafter\@tempe\expandafter{%
+         \csname macarg.\@tempb\endcsname}%
+       \edef\@tempd{\long\def\@tempe{\the\macname}}%
+       \push@\@tempd\macargdeflist@
+       \let\next\getargvals@@
+    \fi
+  \fi
+  \next
+}
+
+\def\push@#1#2{%
+  \expandafter\expandafter\expandafter\def
+  \expandafter\expandafter\expandafter#2%
+  \expandafter\expandafter\expandafter{%
+  \expandafter#1#2}%
+}
+
+% Replace arguments by their values in the macro body, and place the result
+% in macro \@tempa.
+% 
+\def\macvalstoargs@{%
+  %  To do this we use the property that token registers that are \the'ed
+  % within an \edef  expand only once. So we are going to place all argument
+  % values into respective token registers.
+  %
+  % First we save the token context, and initialize argument numbering.
+  \begingroup
+    \paramno0\relax
+    % Then, for each argument number #N, we place the corresponding argument
+    % value into a new token list register \toks#N
+    \expandafter\putargsintokens@\saveparamlist@,;,%
+    % Then, we expand the body so that argument are replaced by their
+    % values. The trick for values not to be expanded themselves is that they
+    % are within tokens and that tokens expand only once in an \edef .
+    \edef\@tempc{\csname mac.\macroname .body\endcsname}%
+    % Now we restore the token stack pointer to free the token list registers
+    % which we have used, but we make sure that expanded body is saved after
+    % group.
+    \expandafter
+  \endgroup
+  \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
+  }
+
+% Define the named-macro outside of this group and then close this group. 
+% 
+\def\macargexpandinbody@{% 
+  \expandafter
+  \endgroup
+  \macargdeflist@
+  % First the replace in body the macro arguments by their values, the result
+  % is in \@tempa .
+  \macvalstoargs@
+  % Then we point at the \norecurse or \gobble (for recursive) macro value
+  % with \@tempb .
+  \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname
+  % Depending on whether it is recursive or not, we need some tailing
+  % \egroup .
+  \ifx\@tempb\gobble
+     \let\@tempc\relax
+  \else
+     \let\@tempc\egroup
+  \fi
+  % And now we do the real job:
+  \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%
+  \@tempd
+}
+
+\def\putargsintokens@#1,{%
+  \if#1;\let\next\relax
+  \else
+    \let\next\putargsintokens@
+    % First we allocate the new token list register, and give it a temporary
+    % alias \@tempb .
+    \toksdef\@tempb\the\paramno
+    % Then we place the argument value into that token list register.
+    \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname
+    \expandafter\@tempb\expandafter{\@tempa}%
+    \advance\paramno by 1\relax
+  \fi
+  \next
+}
+
+% Trailing missing arguments are set to empty.
+% 
+\def\setemptyargvalues@{%
+  \ifx\paramlist\nilm@
+    \let\next\macargexpandinbody@
+  \else
+    \expandafter\setemptyargvaluesparser@\paramlist\endargs@
+    \let\next\setemptyargvalues@
+  \fi
+  \next
+}
+
+\def\setemptyargvaluesparser@#1,#2\endargs@{%
+  \expandafter\def\expandafter\@tempa\expandafter{%
+    \expandafter\def\csname macarg.#1\endcsname{}}%
+  \push@\@tempa\macargdeflist@
+  \def\paramlist{#2}%
+}
+
+% #1 is the element target macro
+% #2 is the list macro
+% #3,#4\endargs@ is the list value
+\def\pop@#1#2#3,#4\endargs@{%
+   \def#1{#3}%
+   \def#2{#4}%
+}
+\long\def\longpop@#1#2#3,#4\endargs@{%
+   \long\def#1{#3}%
+   \long\def#2{#4}%
+}
+
+
+%%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%%
+
+
+% This defines a Texinfo @macro or @rmacro, called by \parsemacbody.
+%    \macrobody has the body of the macro in it, with placeholders for
+% its parameters, looking like "\xeatspaces{\hash 1}".
+%    \paramno is the number of parameters
+%    \paramlist is a TeX parameter text, e.g. "#1,#2,#3,"
+% There are four cases: macros of zero, one, up to nine, and many arguments.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in: @include reads the file inside a group.
+%
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifnum\paramno=1
+    \def\xeatspaces##1{##1}%
+    % This removes the pair of braces around the argument.  We don't
+    % use \eatspaces, because this can cause ends of lines to be lost
+    % when the argument to \eatspaces is read, leading to line-based
+    % commands like "@itemize" not being read correctly.
+  \else
+    \let\xeatspaces\relax % suppress expansion
+  \fi
+  \ifcase\paramno
+  % 0
+    \expandafter\xdef\csname\the\macname\endcsname{%
+      \bgroup
+        \noexpand\spaceisspace
+        \noexpand\endlineisspace
+        \noexpand\expandafter % skip any whitespace after the macro name.
+        \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+    \expandafter\xdef\csname\the\macname @@@\endcsname{%
+      \egroup
+      \noexpand\scanmacro{\macrobody}}%
+  \or % 1
+    \expandafter\xdef\csname\the\macname\endcsname{%
+       \bgroup
+       \noexpand\braceorline
+       \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+    \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+      \egroup
+      \noexpand\scanmacro{\macrobody}%
+      }%
+  \else % at most 9
+    \ifnum\paramno<10\relax
+      % @MACNAME sets the context for reading the macro argument
+      % @MACNAME@@ gets the argument, processes backslashes and appends a 
+      % comma.
+      % @MACNAME@@@ removes braces surrounding the argument list.
+      % @MACNAME@@@@ scans the macro body with arguments substituted.
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \bgroup
+        \noexpand\expandafter  % This \expandafter skip any spaces after the
+        \noexpand\macroargctxt % macro before we change the catcode of space.
+        \noexpand\expandafter
+        \expandafter\noexpand\csname\the\macname @@\endcsname}%
+      \expandafter\xdef\csname\the\macname @@\endcsname##1{%
+          \noexpand\passargtomacro
+          \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
+      \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname @@@@\endcsname\paramlist{%
+          \egroup\noexpand\scanmacro{\macrobody}}%
+    \else % 10 or more:
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\getargvals@{\the\macname}{\argl}%
+      }%
+      \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
+      \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
+    \fi
+  \fi}
+
+\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+{\catcode`\@=0 \catcode`\\=13  % We need to manipulate \ so use @ as escape
+@catcode`@_=11  % private names
+@catcode`@!=11  % used as argument separator
+
+% \passargtomacro#1#2 -
+% Call #1 with a list of tokens #2, with any doubled backslashes in #2
+% compressed to one.
+%
+% This implementation works by expansion, and not execution (so we cannot use 
+% \def or similar).  This reduces the risk of this failing in contexts where 
+% complete expansion is done with no execution (for example, in writing out to 
+% an auxiliary file for an index entry).
+% 
+% State is kept in the input stream: the argument passed to
+% @look_ahead, @gobble_and_check_finish and @add_segment is
+%
+% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN  (... rest of input)
+%
+% where:
+% THE_MACRO - name of the macro we want to call
+% ARG_RESULT - argument list we build to pass to that macro
+% PENDING_BS - either a backslash or nothing
+% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next
+
+@gdef@passargtomacro#1#2{%
+  @add_segment #1!{}@relax#2\@_finish\%
+}
+@gdef@_finish{@_finishx} @global@let@_finishx@relax
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 used to look ahead
+%
+% If the next token is not a backslash, process the rest of the argument; 
+% otherwise, remove the next token.
+@gdef@look_ahead#1!#2#3#4{%
+  @ifx#4\%
+   @expandafter@gobble_and_check_finish 
+  @else
+   @expandafter@add_segment
+  @fi#1!{#2}#4#4%
+}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 should be a backslash, which is gobbled.
+% #5 looks ahead
+%
+% Double backslash found.  Add a single backslash, and look ahead.
+@gdef@gobble_and_check_finish#1!#2#3#4#5{%
+  @add_segment#1\!{}#5#5%
+}
+
+@gdef@is_fi{@fi}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 is input stream until next backslash
+%
+% Input stream is either at the start of the argument, or just after a 
+% backslash sequence, either a lone backslash, or a doubled backslash.  
+% NEXT_TOKEN contains the first token in the input stream: if it is \finish, 
+% finish; otherwise, append to ARG_RESULT the segment of the argument up until
+% the next backslash.  PENDING_BACKSLASH contains a backslash to represent
+% a backslash just before the start of the input stream that has not been
+% added to ARG_RESULT.
+@gdef@add_segment#1!#2#3#4\{%
+@ifx#3@_finish
+  @call_the_macro#1!%
+@else
+  % append the pending backslash to the result, followed by the next segment
+  @expandafter@is_fi@look_ahead#1#2#4!{\}@fi
+  % this @fi is discarded by @look_ahead.
+  % we can't get rid of it with \expandafter because we don't know how 
+  % long #4 is.
+}
+
+% #1 - THE_MACRO
+% #2 - ARG_RESULT
+% #3 discards the res of the conditional in @add_segment, and @is_fi ends the 
+% conditional.
+@gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}}
+
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% \braceorline MAC is used for a one-argument macro MAC.  It checks
+% whether the next non-whitespace character is a {.  It sets the context
+% for reading the argument (slightly different in the two cases).  Then,
+% to read the argument, in the whole-line case, it then calls the regular
+% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC.
+% 
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup
+    \macroargctxt
+    \expandafter\passargtomacro
+  \else
+    \macrolineargctxt\expandafter\parsearg
+  \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Make them active and then expand them all to nothing.
+%
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \addtomacrolist{#1}%
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{%
+  \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
+  \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \lastsection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+  \pdfmkdest{#1}%
+  \iflinks
+    {%
+      \requireauxfile
+      \atdummies  % preserve commands, but don't expand them
+      % match definition in \xrdef, \refx, \xrefX.
+      \def\value##1{##1}%
+      \edef\writexrdef##1##2{%
+	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+	  ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\lastsection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
+    }%
+  \fi
+}
+
+% @xrefautosectiontitle on|off says whether @section(ing) names are used
+% automatically in xrefs, if the third arg is not explicitly specified.
+% This was provided as a "secret" @set xref-automatic-section-title
+% variable, now it's official.
+% 
+\parseargdef\xrefautomaticsectiontitle{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETxref-automatic-section-title\endcsname
+      = \empty
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETxref-automatic-section-title\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
+                must be on|off}%
+  \fi\fi
+}
+
+% 
+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref{\putwordsee{} \xrefXX}
+\def\xref{\putwordSee{} \xrefXX}
+\def\ref{\xrefXX}
+
+\def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX}
+\def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]}
+%
+\newbox\toprefbox
+\newbox\printedrefnamebox
+\newbox\infofilenamebox
+\newbox\printedmanualbox
+%
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  %
+  % Get args without leading/trailing spaces.
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%
+  %
+  \def\infofilename{\ignorespaces #4}%
+  \setbox\infofilenamebox = \hbox{\infofilename\unskip}%
+  %
+  \def\printedmanual{\ignorespaces #5}%
+  \setbox\printedmanualbox  = \hbox{\printedmanual\unskip}%
+  %
+  % If the printed reference name (arg #3) was not explicitly given in
+  % the @xref, figure out what we want to use.
+  \ifdim \wd\printedrefnamebox = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
+      % Not auto section-title: use node name inside the square brackets.
+      \def\printedrefname{\ignorespaces #1}%
+    \else
+      % Auto section-title: use chapter/section title inside
+      % the square brackets if we have it.
+      \ifdim \wd\printedmanualbox > 0pt
+        % It is in another manual, so we don't have it; use node name.
+        \def\printedrefname{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We (should) know the real title if we have the xref values.
+          \def\printedrefname{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printedrefname{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % Make link in pdf output.
+  \ifpdf
+    % For pdfTeX and LuaTeX
+    {\indexnofonts
+     \makevalueexpandable
+     \turnoffactive
+     % This expands tokens, so do it after making catcode changes, so _
+     % etc. don't get their TeX definitions.  This ignores all spaces in
+     % #4, including (wrongly) those in the middle of the filename.
+     \getfilename{#4}%
+     %
+     % This (wrongly) does not take account of leading or trailing
+     % spaces in #1, which should be ignored.
+     \setpdfdestname{#1}%
+     %
+     \ifx\pdfdestname\empty
+       \def\pdfdestname{Top}% no empty targets
+     \fi
+     %
+     \leavevmode
+     \startlink attr{/Border [0 0 0]}%
+     \ifnum\filenamelength>0
+       goto file{\the\filename.pdf} name{\pdfdestname}%
+     \else
+       goto name{\pdfmkpgn{\pdfdestname}}%
+     \fi
+    }%
+    \setcolor{\linkcolor}%
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+    \else
+      % For XeTeX
+      {\indexnofonts
+       \makevalueexpandable
+       \turnoffactive
+       % This expands tokens, so do it after making catcode changes, so _
+       % etc. don't get their TeX definitions.  This ignores all spaces in
+       % #4, including (wrongly) those in the middle of the filename.
+       \getfilename{#4}%
+       %
+       % This (wrongly) does not take account of leading or trailing
+       % spaces in #1, which should be ignored.
+       \setpdfdestname{#1}%
+       %
+       \ifx\pdfdestname\empty
+         \def\pdfdestname{Top}% no empty targets
+       \fi
+       %
+       \leavevmode
+       \ifnum\filenamelength>0
+         % With default settings,
+         % XeTeX (xdvipdfmx) replaces link destination names with integers.
+         % In this case, the replaced destination names of
+         % remote PDFs are no longer known.  In order to avoid a replacement,
+         % you can use xdvipdfmx's command line option `-C 0x0010'.
+         % If you use XeTeX 0.99996+ (TeX Live 2016+),
+         % this command line option is no longer necessary
+         % because we can use the `dvipdfmx:config' special.
+         \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
+           << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}%
+       \else
+         \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
+           << /S /GoTo /D (\pdfdestname) >> >>}%
+       \fi
+      }%
+      \setcolor{\linkcolor}%
+    \fi
+  \fi
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \def\value##1{##1}%
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  %
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  \iffloat distinguishes them by
+  % \Xthisreftitle being set to a magic string.
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd\printedrefnamebox = 0pt
+      \refx{#1-snt}{}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % If the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME".
+    \ifdim \wd\printedmanualbox > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
+  \else
+    % node/anchor (non-float) references.
+    % 
+    % If we use \unhbox to print the node names, TeX does not insert
+    % empty discretionaries after hyphens, which means that it will not
+    % find a line break at a hyphen in a node names.  Since some manuals
+    % are best written with fairly long node names, containing hyphens,
+    % this is a loss.  Therefore, we give the text of the node name
+    % again, so it is as if TeX is seeing it for the first time.
+    % 
+    \ifdim \wd\printedmanualbox > 0pt
+      % Cross-manual reference with a printed manual name.
+      % 
+      \crossmanualxref{\cite{\printedmanual\unskip}}%
+    %
+    \else\ifdim \wd\infofilenamebox > 0pt
+      % Cross-manual reference with only an info filename (arg 4), no
+      % printed manual name (arg 5).  This is essentially the same as
+      % the case above; we output the filename, since we have nothing else.
+      % 
+      \crossmanualxref{\code{\infofilename\unskip}}%
+    %
+    \else
+      % Reference within this manual.
+      %
+      % _ (for example) has to be the character _ for the purposes of the
+      % control sequence corresponding to the node, but it has to expand
+      % into the usual \leavevmode...\vrule stuff for purposes of
+      % printing. So we \turnoffactive for the \refx-snt, back on for the
+      % printing, back off for the \refx-pg.
+      {\turnoffactive
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via the macro below so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+      % Add a , if xref followed by a space
+      \if\space\noexpand\tokenafterxref ,%
+      \else\ifx\	\tokenafterxref ,% @TAB
+      \else\ifx\*\tokenafterxref ,%   @*
+      \else\ifx\ \tokenafterxref ,%   @SPACE
+      \else\ifx\
+                \tokenafterxref ,%    @NL
+      \else\ifx\tie\tokenafterxref ,% @tie
+      \fi\fi\fi\fi\fi\fi
+    \fi\fi
+  \fi
+  \endlink
+\endgroup}
+
+% Output a cross-manual xref to #1.  Used just above (twice).
+% 
+% Only include the text "Section ``foo'' in" if the foo is neither
+% missing or Top.  Thus, @xref{,,,foo,The Foo Manual} outputs simply
+% "see The Foo Manual", the idea being to refer to the whole manual.
+% 
+% But, this being TeX, we can't easily compare our node name against the
+% string "Top" while ignoring the possible spaces before and after in
+% the input.  By adding the arbitrary 7sp below, we make it much less
+% likely that a real node name would have the same width as "Top" (e.g.,
+% in a monospaced font).  Hopefully it will never happen in practice.
+% 
+% For the same basic reason, we retypeset the "Top" at every
+% reference, since the current font is indeterminate.
+% 
+\def\crossmanualxref#1{%
+  \setbox\toprefbox = \hbox{Top\kern7sp}%
+  \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%
+  \ifdim \wd2 > 7sp  % nonempty?
+    \ifdim \wd2 = \wd\toprefbox \else  % same as Top?
+      \putwordSection{} ``\printedrefname'' \putwordin{}\space
+    \fi
+  \fi
+  #1%
+}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME.  SUFFIX 
+% is output afterwards if non-empty.
+\def\refx#1#2{%
+  \requireauxfile
+  {%
+    \indexnofonts
+    \otherbackslash
+    \def\value##1{##1}%
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        {\toks0 = {#1}% avoid expansion of possibly-complex value
+         \message{\linenumber Undefined cross reference `\the\toks0'.}}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.  Define a control 
+% sequence for a cross-reference target (we prepend XR to the control sequence 
+% name to avoid collisions).  The value is the page number.  If this is a float 
+% type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  {% Expand the node or anchor name to remove control sequences.
+   % \turnoffactive stops 8-bit characters being changed to commands
+   % like @'e.  \refx does the same to retrieve the value in the definition.
+    \indexnofonts
+    \turnoffactive
+    \def\value##1{##1}%
+    \xdef\safexrefname{#1}%
+  }%
+  %
+  \bgroup
+    \expandafter\gdef\csname XR\safexrefname\endcsname{#2}%
+  \egroup
+  % We put the \gdef inside a group to avoid the definitions building up on 
+  % TeX's save stack, which can cause it to run out of space for aux files with 
+  % thousands of lines.  \gdef doesn't use the save stack, but \csname does
+  % when it defines an unknown control sequence as \relax. 
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR\safexrefname\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    %
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+      {\safexrefname}}%
+  \fi
+}
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate at the beginning of the file.
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% Used when writing to the aux file, or when using data from it.
+\def\requireauxfile{%
+  \iflinks
+    \tryauxfile
+    % Open the new aux file.  TeX will close it automatically at exit.
+    \immediate\openout\auxfile=\jobname.aux
+  \fi
+  \global\let\requireauxfile=\relax   % Only do this once.
+}
+
+% Read the last existing aux file, if any.  No error if none exists.
+%
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readdatafile{aux}%
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
+\def\setupdatafile{%
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
+  % supported in the main text, it doesn't seem desirable.  Furthermore,
+  % that is not enough: for node names that actually contain a ^
+  % character, we would end up writing a line like this: 'xrdef {'hat
+  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+  % argument, and \hat is not an expandable control sequence.  It could
+  % all be worked out, but why?  Either we support ^^ or we don't.
+  %
+  % The other change necessary for this was to define \auxhat:
+  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+  % and then to call \auxhat in \setq.
+  %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % This is to support \ in node names and titles, since the \
+  % characters end up in a \csname.  It's easier than
+  % leaving it active and making its active definition an actual \
+  % character.  What I don't understand is why it works in the *value*
+  % of the xrdef.  Seems like it should be a catcode12 \, and that
+  % should not typeset properly.  But it works, so I'm moving on for
+  % now.  --karl, 15jan04.
+  \catcode`\\=\other
+  %
+  % @ is our escape character in .aux files, and we need braces.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+  \setupdatafile
+  \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for Info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+\gdef\dofootnote{%
+  \insert\footins\bgroup
+  %
+  % Nested footnotes are not supported in TeX, that would take a lot
+  % more work.  (\startsavinginserts does not suffice.)
+  \let\footnote=\errfootnotenest
+  %
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\txipagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  %
+  % Invoke rest of plain TeX footnote routine.
+  \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+\def\errfootnotenest{%
+  \errhelp=\EMsimple
+  \errmessage{Nested footnotes not supported in texinfo.tex,
+    even though they work in makeinfo; sorry}
+}
+
+\def\errfootnoteheading{%
+  \errhelp=\EMsimple
+  \errmessage{Footnotes in chapters, sections, etc., are not supported}
+}
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarly, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+%
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from https://ctan.org/texarchive/macros/texinfo/texinfo/doc/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\thisisundefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+  \else \ifx\centersub\centerV
+    % for @center @image, we need a vbox so we can have our vertical space
+    \imagevmodetrue
+    \vbox\bgroup % vbox has better behavior than vtop herev
+  \fi\fi
+  %
+  \ifimagevmode
+    \nobreak\medskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below.
+    \nobreak\vskip\parskip
+    \nobreak
+  \fi
+  %
+  % Leave vertical mode so that indentation from an enclosing
+  %  environment such as @quotation is respected.
+  % However, if we're at the top level, we don't want the
+  %  normal paragraph indentation.
+  % On the other hand, if we are in the case of @center @image, we don't
+  %  want to start a paragraph, which will create a hsize-width box and
+  %  eradicate the centering.
+  \ifx\centersub\centerV\else \noindent \fi
+  %
+  % Output the image.
+  \ifpdf
+    % For pdfTeX and LuaTeX <= 0.80
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+      % For epsf.tex
+      % \epsfbox itself resets \epsf?size at each figure.
+      \setbox0 = \hbox{\ignorespaces #2}%
+        \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+      \setbox0 = \hbox{\ignorespaces #3}%
+        \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+      \epsfbox{#1.eps}%
+    \else
+      % For XeTeX
+      \doxeteximage{#1}{#2}{#3}%
+    \fi
+  \fi
+  %
+  \ifimagevmode
+    \medskip  % space after a standalone image
+  \fi  
+  \ifx\centersub\centerV \egroup \fi
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
+    %
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      %
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
+      %
+      {%
+        % This magic value for \lastsection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        %
+        \edef\lastsection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+        \appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
+      %
+      % caption text.
+      \appendtomacro\captionline{\scanexp\thiscaption}%
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \requireauxfile
+        \atdummies
+        %
+        \ifx\thisshortcaption\empty
+          \def\gtemp{\thiscaption}%
+        \else
+          \def\gtemp{\thisshortcaption}%
+        \fi
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+          \ifx\gtemp\empty \else : \gtemp \fi}}%
+      }%
+    \fi
+  \egroup  % end of \vtop
+  %
+  \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \lastsection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
+
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
+
+
+\message{localization,}
+
+% For single-language documents, @documentlanguage is usually given very
+% early, just after @documentencoding.  Single argument is the language
+% (de) or locale (de_DE) abbreviation.
+%
+{
+  \catcode`\_ = \active
+  \globaldefs=1
+\parseargdef\documentlanguage{%
+  \tex % read txi-??.tex file in plain TeX.
+    % Read the file by the name they passed if it exists.
+    \let_ = \normalunderscore  % normal _ character for filename test
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \documentlanguagetrywithoutunderscore #1_\finish
+    \else
+      \globaldefs = 1  % everything in the txi-LL files needs to persist
+      \input txi-#1.tex
+    \fi
+    \closein 1
+  \endgroup % end raw TeX
+}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+%
+\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
+  \openin 1 txi-#1.tex
+  \ifeof 1
+    \errhelp = \nolanghelp
+    \errmessage{Cannot read language file txi-#1.tex}%
+  \else
+    \globaldefs = 1  % everything in the txi-LL files needs to persist
+    \input txi-#1.tex
+  \fi
+  \closein 1
+}
+}% end of special _ catcode
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  Putting it in the current
+directory should work if nowhere else does.}
+
+% This macro is called from txi-??.tex files; the first argument is the
+% \language name to set (without the "\lang@" prefix), the second and
+% third args are \{left,right}hyphenmin.
+%
+% The language names to pass are determined when the format is built.
+% See the etex.log file created at that time, e.g.,
+% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
+%
+% With TeX Live 2008, etex now includes hyphenation patterns for all
+% available languages.  This means we can support hyphenation in
+% Texinfo, at least to some extent.  (This still doesn't solve the
+% accented characters problem.)
+%
+\catcode`@=11
+\def\txisetlanguage#1#2#3{%
+  % do not set the language if the name is undefined in the current TeX.
+  \expandafter\ifx\csname lang@#1\endcsname \relax
+    \message{no patterns for #1}%
+  \else
+    \global\language = \csname lang@#1\endcsname
+  \fi
+  % but there is no harm in adjusting the hyphenmin values regardless.
+  \global\lefthyphenmin = #2\relax
+  \global\righthyphenmin = #3\relax
+}
+
+% XeTeX and LuaTeX can handle Unicode natively.
+% Their default I/O uses UTF-8 sequences instead of a byte-wise operation.
+% Other TeX engines' I/O (pdfTeX, etc.) is byte-wise.
+%
+\newif\iftxinativeunicodecapable
+\newif\iftxiusebytewiseio
+
+\ifx\XeTeXrevision\thisisundefined
+  \ifx\luatexversion\thisisundefined
+    \txinativeunicodecapablefalse
+    \txiusebytewiseiotrue
+  \else
+    \txinativeunicodecapabletrue
+    \txiusebytewiseiofalse
+  \fi
+\else
+  \txinativeunicodecapabletrue
+  \txiusebytewiseiofalse
+\fi
+
+% Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex
+% for non-UTF-8 (byte-wise) encodings.
+%
+\def\setbytewiseio{%
+  \ifx\XeTeXrevision\thisisundefined
+  \else
+    \XeTeXdefaultencoding "bytes"  % For subsequent files to be read
+    \XeTeXinputencoding "bytes"  % For document root file
+    % Unfortunately, there seems to be no corresponding XeTeX command for
+    % output encoding.  This is a problem for auxiliary index and TOC files.
+    % The only solution would be perhaps to write out @U{...} sequences in
+    % place of non-ASCII characters.
+  \fi
+
+  \ifx\luatexversion\thisisundefined
+  \else
+    \directlua{
+    local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub
+    local function convert_char (char)
+      return utf8_char(byte(char))
+    end
+
+    local function convert_line (line)
+      return gsub(line, ".", convert_char)
+    end
+
+    callback.register("process_input_buffer", convert_line)
+
+    local function convert_line_out (line)
+      local line_out = ""
+      for c in string.utfvalues(line) do
+         line_out = line_out .. string.char(c)
+      end
+      return line_out
+    end
+
+    callback.register("process_output_buffer", convert_line_out)
+    }
+  \fi
+
+  \txiusebytewiseiotrue
+}
+
+
+% Helpers for encodings.
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \global\catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz}
+\def\documentencodingzzz#1{%
+  %
+  % Encoding being declared for the document.
+  \def\declaredencoding{\csname #1.enc\endcsname}%
+  %
+  % Supported encodings: names converted to tokens in order to be able
+  % to compare them with \ifx.
+  \def\ascii{\csname US-ASCII.enc\endcsname}%
+  \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+  \def\latone{\csname ISO-8859-1.enc\endcsname}%
+  \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+  \def\utfeight{\csname UTF-8.enc\endcsname}%
+  %
+  \ifx \declaredencoding \ascii
+     \asciichardefs
+  %
+  \else \ifx \declaredencoding \lattwo
+     \iftxinativeunicodecapable
+       \setbytewiseio
+     \fi
+     \setnonasciicharscatcode\active
+     \lattwochardefs
+  %
+  \else \ifx \declaredencoding \latone
+     \iftxinativeunicodecapable
+       \setbytewiseio
+     \fi
+     \setnonasciicharscatcode\active
+     \latonechardefs
+  %
+  \else \ifx \declaredencoding \latnine
+     \iftxinativeunicodecapable
+       \setbytewiseio
+     \fi
+     \setnonasciicharscatcode\active
+     \latninechardefs
+  %
+  \else \ifx \declaredencoding \utfeight
+     \iftxinativeunicodecapable
+       % For native Unicode handling (XeTeX and LuaTeX)
+       \nativeunicodechardefs
+     \else
+       % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX)
+       \setnonasciicharscatcode\active
+       % since we already invoked \utfeightchardefs at the top level
+       % (below), do not re-invoke it, otherwise our check for duplicated
+       % definitions gets triggered.  Making non-ascii chars active is
+       % sufficient.
+     \fi
+  %
+  \else
+    \message{Ignoring unknown document encoding: #1.}%
+  %
+  \fi % utfeight
+  \fi % latnine
+  \fi % latone
+  \fi % lattwo
+  \fi % ascii
+  %
+  \ifx\XeTeXrevision\thisisundefined
+  \else
+    \ifx \declaredencoding \utfeight
+    \else
+      \ifx \declaredencoding \ascii
+      \else
+        \message{Warning: XeTeX with non-UTF-8 encodings cannot handle %
+        non-ASCII characters in auxiliary files.}%
+      \fi
+    \fi
+  \fi
+}
+
+% emacs-page
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing, sorry: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+
+\def\gdefchar#1#2{%
+\gdef#1{%
+   \ifpassthroughchars
+     \string#1%
+   \else
+     #2%
+   \fi
+}}
+
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+  \gdefchar^^a0{\tie}
+  \gdefchar^^a1{\exclamdown}
+  \gdefchar^^a2{{\tcfont \char162}} % cent
+  \gdefchar^^a3{\pounds{}}
+  \gdefchar^^a4{{\tcfont \char164}} % currency
+  \gdefchar^^a5{{\tcfont \char165}} % yen
+  \gdefchar^^a6{{\tcfont \char166}} % broken bar
+  \gdefchar^^a7{\S}
+  \gdefchar^^a8{\"{}}
+  \gdefchar^^a9{\copyright{}}
+  \gdefchar^^aa{\ordf}
+  \gdefchar^^ab{\guillemetleft{}}
+  \gdefchar^^ac{\ensuremath\lnot}
+  \gdefchar^^ad{\-}
+  \gdefchar^^ae{\registeredsymbol{}}
+  \gdefchar^^af{\={}}
+  %
+  \gdefchar^^b0{\textdegree}
+  \gdefchar^^b1{$\pm$}
+  \gdefchar^^b2{$^2$}
+  \gdefchar^^b3{$^3$}
+  \gdefchar^^b4{\'{}}
+  \gdefchar^^b5{$\mu$}
+  \gdefchar^^b6{\P}
+  \gdefchar^^b7{\ensuremath\cdot}
+  \gdefchar^^b8{\cedilla\ }
+  \gdefchar^^b9{$^1$}
+  \gdefchar^^ba{\ordm}
+  \gdefchar^^bb{\guillemetright{}}
+  \gdefchar^^bc{$1\over4$}
+  \gdefchar^^bd{$1\over2$}
+  \gdefchar^^be{$3\over4$}
+  \gdefchar^^bf{\questiondown}
+  %
+  \gdefchar^^c0{\`A}
+  \gdefchar^^c1{\'A}
+  \gdefchar^^c2{\^A}
+  \gdefchar^^c3{\~A}
+  \gdefchar^^c4{\"A}
+  \gdefchar^^c5{\ringaccent A}
+  \gdefchar^^c6{\AE}
+  \gdefchar^^c7{\cedilla C}
+  \gdefchar^^c8{\`E}
+  \gdefchar^^c9{\'E}
+  \gdefchar^^ca{\^E}
+  \gdefchar^^cb{\"E}
+  \gdefchar^^cc{\`I}
+  \gdefchar^^cd{\'I}
+  \gdefchar^^ce{\^I}
+  \gdefchar^^cf{\"I}
+  %
+  \gdefchar^^d0{\DH}
+  \gdefchar^^d1{\~N}
+  \gdefchar^^d2{\`O}
+  \gdefchar^^d3{\'O}
+  \gdefchar^^d4{\^O}
+  \gdefchar^^d5{\~O}
+  \gdefchar^^d6{\"O}
+  \gdefchar^^d7{$\times$}
+  \gdefchar^^d8{\O}
+  \gdefchar^^d9{\`U}
+  \gdefchar^^da{\'U}
+  \gdefchar^^db{\^U}
+  \gdefchar^^dc{\"U}
+  \gdefchar^^dd{\'Y}
+  \gdefchar^^de{\TH}
+  \gdefchar^^df{\ss}
+  %
+  \gdefchar^^e0{\`a}
+  \gdefchar^^e1{\'a}
+  \gdefchar^^e2{\^a}
+  \gdefchar^^e3{\~a}
+  \gdefchar^^e4{\"a}
+  \gdefchar^^e5{\ringaccent a}
+  \gdefchar^^e6{\ae}
+  \gdefchar^^e7{\cedilla c}
+  \gdefchar^^e8{\`e}
+  \gdefchar^^e9{\'e}
+  \gdefchar^^ea{\^e}
+  \gdefchar^^eb{\"e}
+  \gdefchar^^ec{\`{\dotless i}}
+  \gdefchar^^ed{\'{\dotless i}}
+  \gdefchar^^ee{\^{\dotless i}}
+  \gdefchar^^ef{\"{\dotless i}}
+  %
+  \gdefchar^^f0{\dh}
+  \gdefchar^^f1{\~n}
+  \gdefchar^^f2{\`o}
+  \gdefchar^^f3{\'o}
+  \gdefchar^^f4{\^o}
+  \gdefchar^^f5{\~o}
+  \gdefchar^^f6{\"o}
+  \gdefchar^^f7{$\div$}
+  \gdefchar^^f8{\o}
+  \gdefchar^^f9{\`u}
+  \gdefchar^^fa{\'u}
+  \gdefchar^^fb{\^u}
+  \gdefchar^^fc{\"u}
+  \gdefchar^^fd{\'y}
+  \gdefchar^^fe{\th}
+  \gdefchar^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+  % Encoding is almost identical to Latin1.
+  \latonechardefs
+  %
+  \gdefchar^^a4{\euro{}}
+  \gdefchar^^a6{\v S}
+  \gdefchar^^a8{\v s}
+  \gdefchar^^b4{\v Z}
+  \gdefchar^^b8{\v z}
+  \gdefchar^^bc{\OE}
+  \gdefchar^^bd{\oe}
+  \gdefchar^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+  \gdefchar^^a0{\tie}
+  \gdefchar^^a1{\ogonek{A}}
+  \gdefchar^^a2{\u{}}
+  \gdefchar^^a3{\L}
+  \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}}
+  \gdefchar^^a5{\v L}
+  \gdefchar^^a6{\'S}
+  \gdefchar^^a7{\S}
+  \gdefchar^^a8{\"{}}
+  \gdefchar^^a9{\v S}
+  \gdefchar^^aa{\cedilla S}
+  \gdefchar^^ab{\v T}
+  \gdefchar^^ac{\'Z}
+  \gdefchar^^ad{\-}
+  \gdefchar^^ae{\v Z}
+  \gdefchar^^af{\dotaccent Z}
+  %
+  \gdefchar^^b0{\textdegree{}}
+  \gdefchar^^b1{\ogonek{a}}
+  \gdefchar^^b2{\ogonek{ }}
+  \gdefchar^^b3{\l}
+  \gdefchar^^b4{\'{}}
+  \gdefchar^^b5{\v l}
+  \gdefchar^^b6{\'s}
+  \gdefchar^^b7{\v{}}
+  \gdefchar^^b8{\cedilla\ }
+  \gdefchar^^b9{\v s}
+  \gdefchar^^ba{\cedilla s}
+  \gdefchar^^bb{\v t}
+  \gdefchar^^bc{\'z}
+  \gdefchar^^bd{\H{}}
+  \gdefchar^^be{\v z}
+  \gdefchar^^bf{\dotaccent z}
+  %
+  \gdefchar^^c0{\'R}
+  \gdefchar^^c1{\'A}
+  \gdefchar^^c2{\^A}
+  \gdefchar^^c3{\u A}
+  \gdefchar^^c4{\"A}
+  \gdefchar^^c5{\'L}
+  \gdefchar^^c6{\'C}
+  \gdefchar^^c7{\cedilla C}
+  \gdefchar^^c8{\v C}
+  \gdefchar^^c9{\'E}
+  \gdefchar^^ca{\ogonek{E}}
+  \gdefchar^^cb{\"E}
+  \gdefchar^^cc{\v E}
+  \gdefchar^^cd{\'I}
+  \gdefchar^^ce{\^I}
+  \gdefchar^^cf{\v D}
+  %
+  \gdefchar^^d0{\DH}
+  \gdefchar^^d1{\'N}
+  \gdefchar^^d2{\v N}
+  \gdefchar^^d3{\'O}
+  \gdefchar^^d4{\^O}
+  \gdefchar^^d5{\H O}
+  \gdefchar^^d6{\"O}
+  \gdefchar^^d7{$\times$}
+  \gdefchar^^d8{\v R}
+  \gdefchar^^d9{\ringaccent U}
+  \gdefchar^^da{\'U}
+  \gdefchar^^db{\H U}
+  \gdefchar^^dc{\"U}
+  \gdefchar^^dd{\'Y}
+  \gdefchar^^de{\cedilla T}
+  \gdefchar^^df{\ss}
+  %
+  \gdefchar^^e0{\'r}
+  \gdefchar^^e1{\'a}
+  \gdefchar^^e2{\^a}
+  \gdefchar^^e3{\u a}
+  \gdefchar^^e4{\"a}
+  \gdefchar^^e5{\'l}
+  \gdefchar^^e6{\'c}
+  \gdefchar^^e7{\cedilla c}
+  \gdefchar^^e8{\v c}
+  \gdefchar^^e9{\'e}
+  \gdefchar^^ea{\ogonek{e}}
+  \gdefchar^^eb{\"e}
+  \gdefchar^^ec{\v e}
+  \gdefchar^^ed{\'{\dotless{i}}}
+  \gdefchar^^ee{\^{\dotless{i}}}
+  \gdefchar^^ef{\v d}
+  %
+  \gdefchar^^f0{\dh}
+  \gdefchar^^f1{\'n}
+  \gdefchar^^f2{\v n}
+  \gdefchar^^f3{\'o}
+  \gdefchar^^f4{\^o}
+  \gdefchar^^f5{\H o}
+  \gdefchar^^f6{\"o}
+  \gdefchar^^f7{$\div$}
+  \gdefchar^^f8{\v r}
+  \gdefchar^^f9{\ringaccent u}
+  \gdefchar^^fa{\'u}
+  \gdefchar^^fb{\H u}
+  \gdefchar^^fc{\"u}
+  \gdefchar^^fd{\'y}
+  \gdefchar^^fe{\cedilla t}
+  \gdefchar^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+%
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions.  It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+%
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+  \ifx #1\relax
+    \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+  \else
+    \expandafter #1%
+  \fi
+}
+
+% Give non-ASCII bytes the active definitions for processing UTF-8 sequences
+\begingroup
+  \catcode`\~13
+  \catcode`\$12
+  \catcode`\"12
+
+  % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp
+  % substituting ~ and $ with a character token of that value.
+  \def\UTFviiiLoop{%
+    \global\catcode\countUTFx\active
+    \uccode`\~\countUTFx
+    \uccode`\$\countUTFx
+    \uppercase\expandafter{\UTFviiiTmp}%
+    \advance\countUTFx by 1
+    \ifnum\countUTFx < \countUTFy
+      \expandafter\UTFviiiLoop
+    \fi}
+
+  % For bytes other than the first in a UTF-8 sequence.  Not expected to
+  % be expanded except when writing to auxiliary files.
+  \countUTFx = "80
+  \countUTFy = "C2
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $\fi}}%
+  \UTFviiiLoop
+
+  \countUTFx = "C2
+  \countUTFy = "E0
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $%
+        \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}%
+  \UTFviiiLoop
+
+  \countUTFx = "E0
+  \countUTFy = "F0
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $%
+        \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}%
+  \UTFviiiLoop
+
+  \countUTFx = "F0
+  \countUTFy = "F4
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $%
+        \else\expandafter\UTFviiiFourOctets\expandafter$\fi
+        }}%
+  \UTFviiiLoop
+\endgroup
+
+\def\globallet{\global\let} % save some \expandafter's below
+
+% @U{xxxx} to produce U+xxxx, if we support it.
+\def\U#1{%
+  \expandafter\ifx\csname uni:#1\endcsname \relax
+    \iftxinativeunicodecapable
+      % All Unicode characters can be used if native Unicode handling is
+      % active.  However, if the font does not have the glyph,
+      % letters are missing.
+      \begingroup
+        \uccode`\.="#1\relax
+        \uppercase{.}
+      \endgroup
+    \else
+      \errhelp = \EMsimple	
+      \errmessage{Unicode character U+#1 not supported, sorry}%
+    \fi
+  \else
+    \csname uni:#1\endcsname
+  \fi
+}
+
+% These macros are used here to construct the name of a control
+% sequence to be defined.
+\def\UTFviiiTwoOctetsName#1#2{%
+  \csname u8:#1\string #2\endcsname}%
+\def\UTFviiiThreeOctetsName#1#2#3{%
+  \csname u8:#1\string #2\string #3\endcsname}%
+\def\UTFviiiFourOctetsName#1#2#3#4{%
+  \csname u8:#1\string #2\string #3\string #4\endcsname}%
+
+% For UTF-8 byte sequences (TeX, e-TeX and pdfTeX),
+% provide a definition macro to replace a Unicode character;
+% this gets used by the @U command
+%
+\begingroup
+  \catcode`\"=12
+  \catcode`\<=12
+  \catcode`\.=12
+  \catcode`\,=12
+  \catcode`\;=12
+  \catcode`\!=12
+  \catcode`\~=13
+  \gdef\DeclareUnicodeCharacterUTFviii#1#2{%
+    \countUTFz = "#1\relax
+    \begingroup
+      \parseXMLCharref
+    
+      % Give \u8:... its definition.  The sequence of seven \expandafter's
+      % expands after the \gdef three times, e.g.
+      %
+      % 1.  \UTFviiTwoOctetsName B1 B2
+      % 2.  \csname u8:B1 \string B2 \endcsname
+      % 3.  \u8: B1 B2  (a single control sequence token)
+      %
+      \expandafter\expandafter
+      \expandafter\expandafter
+      \expandafter\expandafter
+      \expandafter\gdef       \UTFviiiTmp{#2}%
+      % 
+      \expandafter\ifx\csname uni:#1\endcsname \relax \else
+       \message{Internal error, already defined: #1}%
+      \fi
+      %
+      % define an additional control sequence for this code point.
+      \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp
+    \endgroup}
+  %
+  % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp
+  % to the corresponding UTF-8 sequence.
+  \gdef\parseXMLCharref{%
+    \ifnum\countUTFz < "A0\relax
+      \errhelp = \EMsimple
+      \errmessage{Cannot define Unicode char value < 00A0}%
+    \else\ifnum\countUTFz < "800\relax
+      \parseUTFviiiA,%
+      \parseUTFviiiB C\UTFviiiTwoOctetsName.,%
+    \else\ifnum\countUTFz < "10000\relax
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}%
+    \else
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiA!%
+      \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}%
+    \fi\fi\fi
+  }
+
+  % Extract a byte from the end of the UTF-8 representation of \countUTFx.
+  % It must be a non-initial byte in the sequence.
+  % Change \uccode of #1 for it to be used in \parseUTFviiiB as one
+  % of the bytes.
+  \gdef\parseUTFviiiA#1{%
+    \countUTFx = \countUTFz
+    \divide\countUTFz by 64
+    \countUTFy = \countUTFz  % Save to be the future value of \countUTFz.
+    \multiply\countUTFz by 64
+    
+    % \countUTFz is now \countUTFx with the last 5 bits cleared.  Subtract
+    % in order to get the last five bits.
+    \advance\countUTFx by -\countUTFz
+
+    % Convert this to the byte in the UTF-8 sequence.
+    \advance\countUTFx by 128
+    \uccode `#1\countUTFx
+    \countUTFz = \countUTFy}
+
+  % Used to put a UTF-8 byte sequence into \UTFviiiTmp
+  % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8
+  %    sequence.
+  % #2 is one of the \UTFviii*OctetsName macros.
+  % #3 is always a full stop (.)
+  % #4 is a template for the other bytes in the sequence.  The values for these
+  %    bytes is substituted in here with \uppercase using the \uccode's.
+  \gdef\parseUTFviiiB#1#2#3#4{%
+    \advance\countUTFz by "#10\relax
+    \uccode `#3\countUTFz
+    \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% provide a definition macro that sets a catcode to `other' non-globally
+%
+\def\DeclareUnicodeCharacterNativeOther#1#2{%
+  \catcode"#1=\other
+}
+
+% https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M
+% U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)
+% U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)
+% U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A
+% U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B
+% 
+% Many of our renditions are less than wonderful, and all the missing
+% characters are available somewhere.  Loading the necessary fonts
+% awaits user request.  We can't truly support Unicode without
+% reimplementing everything that's been done in LaTeX for many years,
+% plus probably using luatex or xetex, and who knows what else.
+% We won't be doing that here in this simple file.  But we can try to at
+% least make most of the characters not bomb out.
+%
+\def\unicodechardefs{%
+  \DeclareUnicodeCharacter{00A0}{\tie}%
+  \DeclareUnicodeCharacter{00A1}{\exclamdown}%
+  \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent
+  \DeclareUnicodeCharacter{00A3}{\pounds{}}%
+  \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency
+  \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen
+  \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar
+  \DeclareUnicodeCharacter{00A7}{\S}%
+  \DeclareUnicodeCharacter{00A8}{\"{ }}%
+  \DeclareUnicodeCharacter{00A9}{\copyright{}}%
+  \DeclareUnicodeCharacter{00AA}{\ordf}%
+  \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}%
+  \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}%
+  \DeclareUnicodeCharacter{00AD}{\-}%
+  \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}%
+  \DeclareUnicodeCharacter{00AF}{\={ }}%
+  %
+  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}%
+  \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%
+  \DeclareUnicodeCharacter{00B2}{$^2$}%
+  \DeclareUnicodeCharacter{00B3}{$^3$}%
+  \DeclareUnicodeCharacter{00B4}{\'{ }}%
+  \DeclareUnicodeCharacter{00B5}{$\mu$}%
+  \DeclareUnicodeCharacter{00B6}{\P}%
+  \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}%
+  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}%
+  \DeclareUnicodeCharacter{00B9}{$^1$}%
+  \DeclareUnicodeCharacter{00BA}{\ordm}%
+  \DeclareUnicodeCharacter{00BB}{\guillemetright{}}%
+  \DeclareUnicodeCharacter{00BC}{$1\over4$}%
+  \DeclareUnicodeCharacter{00BD}{$1\over2$}%
+  \DeclareUnicodeCharacter{00BE}{$3\over4$}%
+  \DeclareUnicodeCharacter{00BF}{\questiondown}%
+  %
+  \DeclareUnicodeCharacter{00C0}{\`A}%
+  \DeclareUnicodeCharacter{00C1}{\'A}%
+  \DeclareUnicodeCharacter{00C2}{\^A}%
+  \DeclareUnicodeCharacter{00C3}{\~A}%
+  \DeclareUnicodeCharacter{00C4}{\"A}%
+  \DeclareUnicodeCharacter{00C5}{\AA}%
+  \DeclareUnicodeCharacter{00C6}{\AE}%
+  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}%
+  \DeclareUnicodeCharacter{00C8}{\`E}%
+  \DeclareUnicodeCharacter{00C9}{\'E}%
+  \DeclareUnicodeCharacter{00CA}{\^E}%
+  \DeclareUnicodeCharacter{00CB}{\"E}%
+  \DeclareUnicodeCharacter{00CC}{\`I}%
+  \DeclareUnicodeCharacter{00CD}{\'I}%
+  \DeclareUnicodeCharacter{00CE}{\^I}%
+  \DeclareUnicodeCharacter{00CF}{\"I}%
+  %
+  \DeclareUnicodeCharacter{00D0}{\DH}%
+  \DeclareUnicodeCharacter{00D1}{\~N}%
+  \DeclareUnicodeCharacter{00D2}{\`O}%
+  \DeclareUnicodeCharacter{00D3}{\'O}%
+  \DeclareUnicodeCharacter{00D4}{\^O}%
+  \DeclareUnicodeCharacter{00D5}{\~O}%
+  \DeclareUnicodeCharacter{00D6}{\"O}%
+  \DeclareUnicodeCharacter{00D7}{\ensuremath\times}%
+  \DeclareUnicodeCharacter{00D8}{\O}%
+  \DeclareUnicodeCharacter{00D9}{\`U}%
+  \DeclareUnicodeCharacter{00DA}{\'U}%
+  \DeclareUnicodeCharacter{00DB}{\^U}%
+  \DeclareUnicodeCharacter{00DC}{\"U}%
+  \DeclareUnicodeCharacter{00DD}{\'Y}%
+  \DeclareUnicodeCharacter{00DE}{\TH}%
+  \DeclareUnicodeCharacter{00DF}{\ss}%
+  %
+  \DeclareUnicodeCharacter{00E0}{\`a}%
+  \DeclareUnicodeCharacter{00E1}{\'a}%
+  \DeclareUnicodeCharacter{00E2}{\^a}%
+  \DeclareUnicodeCharacter{00E3}{\~a}%
+  \DeclareUnicodeCharacter{00E4}{\"a}%
+  \DeclareUnicodeCharacter{00E5}{\aa}%
+  \DeclareUnicodeCharacter{00E6}{\ae}%
+  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}%
+  \DeclareUnicodeCharacter{00E8}{\`e}%
+  \DeclareUnicodeCharacter{00E9}{\'e}%
+  \DeclareUnicodeCharacter{00EA}{\^e}%
+  \DeclareUnicodeCharacter{00EB}{\"e}%
+  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}%
+  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}%
+  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}%
+  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}%
+  %
+  \DeclareUnicodeCharacter{00F0}{\dh}%
+  \DeclareUnicodeCharacter{00F1}{\~n}%
+  \DeclareUnicodeCharacter{00F2}{\`o}%
+  \DeclareUnicodeCharacter{00F3}{\'o}%
+  \DeclareUnicodeCharacter{00F4}{\^o}%
+  \DeclareUnicodeCharacter{00F5}{\~o}%
+  \DeclareUnicodeCharacter{00F6}{\"o}%
+  \DeclareUnicodeCharacter{00F7}{\ensuremath\div}%
+  \DeclareUnicodeCharacter{00F8}{\o}%
+  \DeclareUnicodeCharacter{00F9}{\`u}%
+  \DeclareUnicodeCharacter{00FA}{\'u}%
+  \DeclareUnicodeCharacter{00FB}{\^u}%
+  \DeclareUnicodeCharacter{00FC}{\"u}%
+  \DeclareUnicodeCharacter{00FD}{\'y}%
+  \DeclareUnicodeCharacter{00FE}{\th}%
+  \DeclareUnicodeCharacter{00FF}{\"y}%
+  %
+  \DeclareUnicodeCharacter{0100}{\=A}%
+  \DeclareUnicodeCharacter{0101}{\=a}%
+  \DeclareUnicodeCharacter{0102}{\u{A}}%
+  \DeclareUnicodeCharacter{0103}{\u{a}}%
+  \DeclareUnicodeCharacter{0104}{\ogonek{A}}%
+  \DeclareUnicodeCharacter{0105}{\ogonek{a}}%
+  \DeclareUnicodeCharacter{0106}{\'C}%
+  \DeclareUnicodeCharacter{0107}{\'c}%
+  \DeclareUnicodeCharacter{0108}{\^C}%
+  \DeclareUnicodeCharacter{0109}{\^c}%
+  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}%
+  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}%
+  \DeclareUnicodeCharacter{010C}{\v{C}}%
+  \DeclareUnicodeCharacter{010D}{\v{c}}%
+  \DeclareUnicodeCharacter{010E}{\v{D}}%
+  \DeclareUnicodeCharacter{010F}{d'}%
+  %
+  \DeclareUnicodeCharacter{0110}{\DH}%
+  \DeclareUnicodeCharacter{0111}{\dh}%
+  \DeclareUnicodeCharacter{0112}{\=E}%
+  \DeclareUnicodeCharacter{0113}{\=e}%
+  \DeclareUnicodeCharacter{0114}{\u{E}}%
+  \DeclareUnicodeCharacter{0115}{\u{e}}%
+  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}%
+  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}%
+  \DeclareUnicodeCharacter{0118}{\ogonek{E}}%
+  \DeclareUnicodeCharacter{0119}{\ogonek{e}}%
+  \DeclareUnicodeCharacter{011A}{\v{E}}%
+  \DeclareUnicodeCharacter{011B}{\v{e}}%
+  \DeclareUnicodeCharacter{011C}{\^G}%
+  \DeclareUnicodeCharacter{011D}{\^g}%
+  \DeclareUnicodeCharacter{011E}{\u{G}}%
+  \DeclareUnicodeCharacter{011F}{\u{g}}%
+  %
+  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}%
+  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}%
+  \DeclareUnicodeCharacter{0122}{\cedilla{G}}%
+  \DeclareUnicodeCharacter{0123}{\cedilla{g}}%
+  \DeclareUnicodeCharacter{0124}{\^H}%
+  \DeclareUnicodeCharacter{0125}{\^h}%
+  \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}%
+  \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}%
+  \DeclareUnicodeCharacter{0128}{\~I}%
+  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}%
+  \DeclareUnicodeCharacter{012A}{\=I}%
+  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}%
+  \DeclareUnicodeCharacter{012C}{\u{I}}%
+  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}%
+  \DeclareUnicodeCharacter{012E}{\ogonek{I}}%
+  \DeclareUnicodeCharacter{012F}{\ogonek{i}}%
+  %
+  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}%
+  \DeclareUnicodeCharacter{0131}{\dotless{i}}%
+  \DeclareUnicodeCharacter{0132}{IJ}%
+  \DeclareUnicodeCharacter{0133}{ij}%
+  \DeclareUnicodeCharacter{0134}{\^J}%
+  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}%
+  \DeclareUnicodeCharacter{0136}{\cedilla{K}}%
+  \DeclareUnicodeCharacter{0137}{\cedilla{k}}%
+  \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}%
+  \DeclareUnicodeCharacter{0139}{\'L}%
+  \DeclareUnicodeCharacter{013A}{\'l}%
+  \DeclareUnicodeCharacter{013B}{\cedilla{L}}%
+  \DeclareUnicodeCharacter{013C}{\cedilla{l}}%
+  \DeclareUnicodeCharacter{013D}{L'}% should kern
+  \DeclareUnicodeCharacter{013E}{l'}% should kern
+  \DeclareUnicodeCharacter{013F}{L\U{00B7}}%
+  %
+  \DeclareUnicodeCharacter{0140}{l\U{00B7}}%
+  \DeclareUnicodeCharacter{0141}{\L}%
+  \DeclareUnicodeCharacter{0142}{\l}%
+  \DeclareUnicodeCharacter{0143}{\'N}%
+  \DeclareUnicodeCharacter{0144}{\'n}%
+  \DeclareUnicodeCharacter{0145}{\cedilla{N}}%
+  \DeclareUnicodeCharacter{0146}{\cedilla{n}}%
+  \DeclareUnicodeCharacter{0147}{\v{N}}%
+  \DeclareUnicodeCharacter{0148}{\v{n}}%
+  \DeclareUnicodeCharacter{0149}{'n}%
+  \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}%
+  \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}%
+  \DeclareUnicodeCharacter{014C}{\=O}%
+  \DeclareUnicodeCharacter{014D}{\=o}%
+  \DeclareUnicodeCharacter{014E}{\u{O}}%
+  \DeclareUnicodeCharacter{014F}{\u{o}}%
+  %
+  \DeclareUnicodeCharacter{0150}{\H{O}}%
+  \DeclareUnicodeCharacter{0151}{\H{o}}%
+  \DeclareUnicodeCharacter{0152}{\OE}%
+  \DeclareUnicodeCharacter{0153}{\oe}%
+  \DeclareUnicodeCharacter{0154}{\'R}%
+  \DeclareUnicodeCharacter{0155}{\'r}%
+  \DeclareUnicodeCharacter{0156}{\cedilla{R}}%
+  \DeclareUnicodeCharacter{0157}{\cedilla{r}}%
+  \DeclareUnicodeCharacter{0158}{\v{R}}%
+  \DeclareUnicodeCharacter{0159}{\v{r}}%
+  \DeclareUnicodeCharacter{015A}{\'S}%
+  \DeclareUnicodeCharacter{015B}{\'s}%
+  \DeclareUnicodeCharacter{015C}{\^S}%
+  \DeclareUnicodeCharacter{015D}{\^s}%
+  \DeclareUnicodeCharacter{015E}{\cedilla{S}}%
+  \DeclareUnicodeCharacter{015F}{\cedilla{s}}%
+  %
+  \DeclareUnicodeCharacter{0160}{\v{S}}%
+  \DeclareUnicodeCharacter{0161}{\v{s}}%
+  \DeclareUnicodeCharacter{0162}{\cedilla{T}}%
+  \DeclareUnicodeCharacter{0163}{\cedilla{t}}%
+  \DeclareUnicodeCharacter{0164}{\v{T}}%
+  \DeclareUnicodeCharacter{0165}{\v{t}}%
+  \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}%
+  \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}%
+  \DeclareUnicodeCharacter{0168}{\~U}%
+  \DeclareUnicodeCharacter{0169}{\~u}%
+  \DeclareUnicodeCharacter{016A}{\=U}%
+  \DeclareUnicodeCharacter{016B}{\=u}%
+  \DeclareUnicodeCharacter{016C}{\u{U}}%
+  \DeclareUnicodeCharacter{016D}{\u{u}}%
+  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}%
+  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}%
+  %
+  \DeclareUnicodeCharacter{0170}{\H{U}}%
+  \DeclareUnicodeCharacter{0171}{\H{u}}%
+  \DeclareUnicodeCharacter{0172}{\ogonek{U}}%
+  \DeclareUnicodeCharacter{0173}{\ogonek{u}}%
+  \DeclareUnicodeCharacter{0174}{\^W}%
+  \DeclareUnicodeCharacter{0175}{\^w}%
+  \DeclareUnicodeCharacter{0176}{\^Y}%
+  \DeclareUnicodeCharacter{0177}{\^y}%
+  \DeclareUnicodeCharacter{0178}{\"Y}%
+  \DeclareUnicodeCharacter{0179}{\'Z}%
+  \DeclareUnicodeCharacter{017A}{\'z}%
+  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}%
+  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}%
+  \DeclareUnicodeCharacter{017D}{\v{Z}}%
+  \DeclareUnicodeCharacter{017E}{\v{z}}%
+  \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}%
+  %
+  \DeclareUnicodeCharacter{01C4}{D\v{Z}}%
+  \DeclareUnicodeCharacter{01C5}{D\v{z}}%
+  \DeclareUnicodeCharacter{01C6}{d\v{z}}%
+  \DeclareUnicodeCharacter{01C7}{LJ}%
+  \DeclareUnicodeCharacter{01C8}{Lj}%
+  \DeclareUnicodeCharacter{01C9}{lj}%
+  \DeclareUnicodeCharacter{01CA}{NJ}%
+  \DeclareUnicodeCharacter{01CB}{Nj}%
+  \DeclareUnicodeCharacter{01CC}{nj}%
+  \DeclareUnicodeCharacter{01CD}{\v{A}}%
+  \DeclareUnicodeCharacter{01CE}{\v{a}}%
+  \DeclareUnicodeCharacter{01CF}{\v{I}}%
+  %
+  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}%
+  \DeclareUnicodeCharacter{01D1}{\v{O}}%
+  \DeclareUnicodeCharacter{01D2}{\v{o}}%
+  \DeclareUnicodeCharacter{01D3}{\v{U}}%
+  \DeclareUnicodeCharacter{01D4}{\v{u}}%
+  %
+  \DeclareUnicodeCharacter{01E2}{\={\AE}}%
+  \DeclareUnicodeCharacter{01E3}{\={\ae}}%
+  \DeclareUnicodeCharacter{01E6}{\v{G}}%
+  \DeclareUnicodeCharacter{01E7}{\v{g}}%
+  \DeclareUnicodeCharacter{01E8}{\v{K}}%
+  \DeclareUnicodeCharacter{01E9}{\v{k}}%
+  %
+  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}%
+  \DeclareUnicodeCharacter{01F1}{DZ}%
+  \DeclareUnicodeCharacter{01F2}{Dz}%
+  \DeclareUnicodeCharacter{01F3}{dz}%
+  \DeclareUnicodeCharacter{01F4}{\'G}%
+  \DeclareUnicodeCharacter{01F5}{\'g}%
+  \DeclareUnicodeCharacter{01F8}{\`N}%
+  \DeclareUnicodeCharacter{01F9}{\`n}%
+  \DeclareUnicodeCharacter{01FC}{\'{\AE}}%
+  \DeclareUnicodeCharacter{01FD}{\'{\ae}}%
+  \DeclareUnicodeCharacter{01FE}{\'{\O}}%
+  \DeclareUnicodeCharacter{01FF}{\'{\o}}%
+  %
+  \DeclareUnicodeCharacter{021E}{\v{H}}%
+  \DeclareUnicodeCharacter{021F}{\v{h}}%
+  %
+  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}%
+  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}%
+  \DeclareUnicodeCharacter{0228}{\cedilla{E}}%
+  \DeclareUnicodeCharacter{0229}{\cedilla{e}}%
+  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}%
+  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}%
+  %
+  \DeclareUnicodeCharacter{0232}{\=Y}%
+  \DeclareUnicodeCharacter{0233}{\=y}%
+  \DeclareUnicodeCharacter{0237}{\dotless{j}}%
+  %
+  \DeclareUnicodeCharacter{02DB}{\ogonek{ }}%
+  %
+  % Greek letters upper case
+  \DeclareUnicodeCharacter{0391}{{\it A}}%
+  \DeclareUnicodeCharacter{0392}{{\it B}}%
+  \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}%
+  \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}%
+  \DeclareUnicodeCharacter{0395}{{\it E}}%
+  \DeclareUnicodeCharacter{0396}{{\it Z}}%
+  \DeclareUnicodeCharacter{0397}{{\it H}}%
+  \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}%
+  \DeclareUnicodeCharacter{0399}{{\it I}}%
+  \DeclareUnicodeCharacter{039A}{{\it K}}%
+  \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}%
+  \DeclareUnicodeCharacter{039C}{{\it M}}%
+  \DeclareUnicodeCharacter{039D}{{\it N}}%
+  \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}%
+  \DeclareUnicodeCharacter{039F}{{\it O}}%
+  \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}%
+  \DeclareUnicodeCharacter{03A1}{{\it P}}%
+  %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma
+  \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}%
+  \DeclareUnicodeCharacter{03A4}{{\it T}}%
+  \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}%
+  \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}%
+  \DeclareUnicodeCharacter{03A7}{{\it X}}%
+  \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}%
+  \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}%
+  %
+  % Vowels with accents
+  \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}%
+  \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}%
+  \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}%
+  \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}%
+  \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}%
+  \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}%
+  %
+  % Standalone accent
+  \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}%
+  %
+  % Greek letters lower case
+  \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}%
+  \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}%
+  \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}%
+  \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}%
+  \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}%
+  \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}%
+  \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}%
+  \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}%
+  \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}%
+  \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}%
+  \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}%
+  \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}%
+  \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}%
+  \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}%
+  \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron
+  \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}%
+  \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}%
+  \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}%
+  \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}%
+  \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}%
+  \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}%
+  \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}%
+  \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}%
+  \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}%
+  \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}%
+  %
+  % More Greek vowels with accents
+  \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}%
+  \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}%
+  \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}%
+  \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}%
+  \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}%
+  %
+  % Variant Greek letters
+  \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}%
+  \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}%
+  \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}%
+  %
+  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}%
+  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}%
+  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}%
+  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}%
+  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}%
+  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}%
+  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}%
+  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}%
+  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}%
+  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}%
+  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}%
+  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}%
+  %
+  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}%
+  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}%
+  %
+  \DeclareUnicodeCharacter{1E20}{\=G}%
+  \DeclareUnicodeCharacter{1E21}{\=g}%
+  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}%
+  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}%
+  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}%
+  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}%
+  \DeclareUnicodeCharacter{1E26}{\"H}%
+  \DeclareUnicodeCharacter{1E27}{\"h}%
+  %
+  \DeclareUnicodeCharacter{1E30}{\'K}%
+  \DeclareUnicodeCharacter{1E31}{\'k}%
+  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}%
+  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}%
+  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}%
+  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}%
+  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}%
+  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}%
+  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}%
+  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}%
+  \DeclareUnicodeCharacter{1E3E}{\'M}%
+  \DeclareUnicodeCharacter{1E3F}{\'m}%
+  %
+  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}%
+  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}%
+  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}%
+  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}%
+  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}%
+  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}%
+  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}%
+  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}%
+  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}%
+  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}%
+  %
+  \DeclareUnicodeCharacter{1E54}{\'P}%
+  \DeclareUnicodeCharacter{1E55}{\'p}%
+  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}%
+  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}%
+  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}%
+  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}%
+  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}%
+  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}%
+  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}%
+  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}%
+  %
+  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}%
+  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}%
+  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}%
+  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}%
+  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}%
+  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}%
+  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}%
+  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}%
+  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}%
+  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}%
+  %
+  \DeclareUnicodeCharacter{1E7C}{\~V}%
+  \DeclareUnicodeCharacter{1E7D}{\~v}%
+  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}%
+  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}%
+  %
+  \DeclareUnicodeCharacter{1E80}{\`W}%
+  \DeclareUnicodeCharacter{1E81}{\`w}%
+  \DeclareUnicodeCharacter{1E82}{\'W}%
+  \DeclareUnicodeCharacter{1E83}{\'w}%
+  \DeclareUnicodeCharacter{1E84}{\"W}%
+  \DeclareUnicodeCharacter{1E85}{\"w}%
+  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}%
+  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}%
+  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}%
+  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}%
+  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}%
+  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}%
+  \DeclareUnicodeCharacter{1E8C}{\"X}%
+  \DeclareUnicodeCharacter{1E8D}{\"x}%
+  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}%
+  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}%
+  %
+  \DeclareUnicodeCharacter{1E90}{\^Z}%
+  \DeclareUnicodeCharacter{1E91}{\^z}%
+  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}%
+  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}%
+  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}%
+  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}%
+  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}%
+  \DeclareUnicodeCharacter{1E97}{\"t}%
+  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}%
+  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}%
+  %
+  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}%
+  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}%
+  %
+  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}%
+  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}%
+  \DeclareUnicodeCharacter{1EBC}{\~E}%
+  \DeclareUnicodeCharacter{1EBD}{\~e}%
+  %
+  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}%
+  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}%
+  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}%
+  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}%
+  %
+  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}%
+  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}%
+  %
+  \DeclareUnicodeCharacter{1EF2}{\`Y}%
+  \DeclareUnicodeCharacter{1EF3}{\`y}%
+  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}%
+  %
+  \DeclareUnicodeCharacter{1EF8}{\~Y}%
+  \DeclareUnicodeCharacter{1EF9}{\~y}%
+  %
+  % Punctuation
+  \DeclareUnicodeCharacter{2013}{--}%
+  \DeclareUnicodeCharacter{2014}{---}%
+  \DeclareUnicodeCharacter{2018}{\quoteleft{}}%
+  \DeclareUnicodeCharacter{2019}{\quoteright{}}%
+  \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}%
+  \DeclareUnicodeCharacter{201C}{\quotedblleft{}}%
+  \DeclareUnicodeCharacter{201D}{\quotedblright{}}%
+  \DeclareUnicodeCharacter{201E}{\quotedblbase{}}%
+  \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}%
+  \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}%
+  \DeclareUnicodeCharacter{2022}{\bullet{}}%
+  \DeclareUnicodeCharacter{202F}{\thinspace}%
+  \DeclareUnicodeCharacter{2026}{\dots{}}%
+  \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}%
+  \DeclareUnicodeCharacter{203A}{\guilsinglright{}}%
+  %
+  \DeclareUnicodeCharacter{20AC}{\euro{}}%
+  %
+  \DeclareUnicodeCharacter{2192}{\expansion{}}%
+  \DeclareUnicodeCharacter{21D2}{\result{}}%
+  %
+  % Mathematical symbols
+  \DeclareUnicodeCharacter{2200}{\ensuremath\forall}%
+  \DeclareUnicodeCharacter{2203}{\ensuremath\exists}%
+  \DeclareUnicodeCharacter{2208}{\ensuremath\in}%
+  \DeclareUnicodeCharacter{2212}{\minus{}}%
+  \DeclareUnicodeCharacter{2217}{\ast}%
+  \DeclareUnicodeCharacter{221E}{\ensuremath\infty}%
+  \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}%
+  \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}%
+  \DeclareUnicodeCharacter{2229}{\ensuremath\cap}%
+  \DeclareUnicodeCharacter{2261}{\equiv{}}%
+  \DeclareUnicodeCharacter{2264}{\ensuremath\leq}%
+  \DeclareUnicodeCharacter{2265}{\ensuremath\geq}%
+  \DeclareUnicodeCharacter{2282}{\ensuremath\subset}%
+  \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}%
+  %
+  \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}%
+  \DeclareUnicodeCharacter{2032}{\ensuremath\prime}%
+  \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}%
+  \DeclareUnicodeCharacter{2111}{\ensuremath\Im}%
+  \DeclareUnicodeCharacter{2113}{\ensuremath\ell}%
+  \DeclareUnicodeCharacter{2118}{\ensuremath\wp}%
+  \DeclareUnicodeCharacter{211C}{\ensuremath\Re}%
+  \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}%
+  \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}%
+  \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}%
+  \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}%
+  \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}%
+  \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}%
+  \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}%
+  \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}%
+  \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}%
+  \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}%
+  \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}%
+  \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}%
+  \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}%
+  \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}%
+  \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}%
+  \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}%
+  \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}%
+  \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}%
+  \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}%
+  \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}%
+  \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}%
+  \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}%
+  \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}%
+  \DeclareUnicodeCharacter{2202}{\ensuremath\partial}%
+  \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}%
+  \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}%
+  \DeclareUnicodeCharacter{2209}{\ensuremath\notin}%
+  \DeclareUnicodeCharacter{220B}{\ensuremath\owns}%
+  \DeclareUnicodeCharacter{220F}{\ensuremath\prod}%
+  \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}%
+  \DeclareUnicodeCharacter{2211}{\ensuremath\sum}%
+  \DeclareUnicodeCharacter{2213}{\ensuremath\mp}%
+  \DeclareUnicodeCharacter{2218}{\ensuremath\circ}%
+  \DeclareUnicodeCharacter{221A}{\ensuremath\surd}%
+  \DeclareUnicodeCharacter{221D}{\ensuremath\propto}%
+  \DeclareUnicodeCharacter{2220}{\ensuremath\angle}%
+  \DeclareUnicodeCharacter{2223}{\ensuremath\mid}%
+  \DeclareUnicodeCharacter{2228}{\ensuremath\vee}%
+  \DeclareUnicodeCharacter{222A}{\ensuremath\cup}%
+  \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}%
+  \DeclareUnicodeCharacter{222E}{\ensuremath\oint}%
+  \DeclareUnicodeCharacter{223C}{\ensuremath\sim}%
+  \DeclareUnicodeCharacter{2240}{\ensuremath\wr}%
+  \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}%
+  \DeclareUnicodeCharacter{2245}{\ensuremath\cong}%
+  \DeclareUnicodeCharacter{2248}{\ensuremath\approx}%
+  \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}%
+  \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}%
+  \DeclareUnicodeCharacter{2260}{\ensuremath\neq}%
+  \DeclareUnicodeCharacter{226A}{\ensuremath\ll}%
+  \DeclareUnicodeCharacter{226B}{\ensuremath\gg}%
+  \DeclareUnicodeCharacter{227A}{\ensuremath\prec}%
+  \DeclareUnicodeCharacter{227B}{\ensuremath\succ}%
+  \DeclareUnicodeCharacter{2283}{\ensuremath\supset}%
+  \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}%
+  \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}%
+  \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}%
+  \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}%
+  \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}%
+  \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}%
+  \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}%
+  \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}%
+  \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}%
+  \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}%
+  \DeclareUnicodeCharacter{2299}{\ensuremath\odot}%
+  \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}%
+  \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}%
+  \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}%
+  \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}%
+  \DeclareUnicodeCharacter{22A8}{\ensuremath\models}%
+  \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}%
+  \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}%
+  \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}%
+  \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}%
+  \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}%
+  \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}%
+  \DeclareUnicodeCharacter{22C6}{\ensuremath\star}%
+  \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}%
+  \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}%
+  \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}%
+  \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}%
+  \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}%
+  \DeclareUnicodeCharacter{2322}{\ensuremath\frown}%
+  \DeclareUnicodeCharacter{2323}{\ensuremath\smile}%
+  %
+  \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}%
+  \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}%
+  \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}%
+  \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}%
+  \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}%
+  \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}%
+  \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}%
+  \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}%
+  \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}%
+  \DeclareUnicodeCharacter{266D}{\ensuremath\flat}%
+  \DeclareUnicodeCharacter{266E}{\ensuremath\natural}%
+  \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}%
+  \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}%
+  \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}%
+  \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}%
+  \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}%
+  \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}%
+  \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}%
+  \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}%
+  \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}%
+  \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}%
+  \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}%
+  \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}%
+  \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}%
+  \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}%
+  \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}%
+  \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}%
+  \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}%
+  \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}%
+  %
+  \global\mathchardef\checkmark="1370% actually the square root sign
+  \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}%
+}% end of \unicodechardefs
+
+% UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command)
+% It makes the setting that replace UTF-8 byte sequence.
+\def\utfeightchardefs{%
+  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii
+  \unicodechardefs
+}
+
+% Whether the active definitions of non-ASCII characters expand to
+% non-active tokens with the same character code.  This is used to
+% write characters literally, instead of using active definitions for
+% printing the correct glyphs.
+\newif\ifpassthroughchars
+\passthroughcharsfalse
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% provide a definition macro to replace/pass-through a Unicode character
+%
+\def\DeclareUnicodeCharacterNative#1#2{%
+  \catcode"#1=\active
+  \def\dodeclareunicodecharacternative##1##2##3{%
+    \begingroup
+      \uccode`\~="##2\relax
+      \uppercase{\gdef~}{%
+        \ifpassthroughchars
+          ##1%
+        \else
+          ##3%
+        \fi
+      }
+    \endgroup
+  }
+  \begingroup
+    \uccode`\.="#1\relax
+    \uppercase{\def\UTFNativeTmp{.}}%
+    \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}%
+  \endgroup
+}
+
+% Native Unicode handling (XeTeX and LuaTeX) character replacing definition.
+% It activates the setting that replaces Unicode characters.
+\def\nativeunicodechardefs{%
+  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative
+  \unicodechardefs
+}
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% make the character token expand
+% to the sequences given in \unicodechardefs for printing.
+\def\DeclareUnicodeCharacterNativeAtU#1#2{%
+  \def\UTFAtUTmp{#2}
+  \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp
+}
+
+% @U command definitions for native Unicode handling (XeTeX and LuaTeX).
+\def\nativeunicodechardefsatu{%
+  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU
+  \unicodechardefs
+}
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+   \relax
+}
+
+% define all Unicode characters we know about, for the sake of @U.
+\iftxinativeunicodecapable
+  \nativeunicodechardefsatu
+\else
+  \utfeightchardefs
+\fi
+
+
+% Make non-ASCII characters printable again for compatibility with
+% existing Texinfo documents that may use them, even without declaring a
+% document encoding.
+%
+\setnonasciicharscatcode \other
+
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be very finicky about underfull hboxes, either.
+\hbadness = 6666
+
+% Following George Bush, get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \txipageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \txipagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+    % if we don't reset these, they will remain at "1 true in" of
+    % whatever layout pdftex was dumped with.
+    \pdfhorigin = 1 true in
+    \pdfvorigin = 1 true in
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+      \special{papersize=#8,#7}%
+    \else
+      \pdfpageheight #7\relax
+      \pdfpagewidth #8\relax
+      % XeTeX does not have \pdfhorigin and \pdfvorigin.
+    \fi
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{607.2pt}{6in}% that's 46 lines
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {-.2in}{0in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+  \parskip = 1.5pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.4in}{4.8in}%
+                    {-.2in}{-.4in}%
+                    {0pt}{14pt}%
+                    {9in}{6in}%
+  %
+  \lispnarrowing = 0.25in
+  \tolerance = 700
+  \contentsrightmargin = 0pt
+  \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{673.2pt}{160mm}% that's 51 lines
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+  % Aggiunto formato 17x24, comunemente usato per i testi scientifici.
+\def\manuale{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.0pt
+  %
+  \internalpagesizes{190mm}{120mm}%
+                    {\voffset}{0mm}%
+                    {\hoffset}{0mm}%
+                    {\bindingoffset}{4.6mm}%
+                    {240mm}{170mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \hfuzz = 1.2pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1\relax
+  \advance\dimen0 by \voffset
+  \advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  \advance\dimen2 by 1in % reference point is 1 inch from left edge of page
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+% Default value of \hfuzz, for suppressing warnings about overfull hboxes.
+\hfuzz = 1pt
+
+
+\message{and turning on texinfo input format.}
+
+\def^^L{\par} % remove \outer, so ^L can appear in an @comment
+
+% DEL is a comment character, in case @c does not suffice.
+\catcode`\^^? = 14
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other \def\normaldoublequote{"}
+\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
+\catcode`\+=\other \def\normalplus{+}
+\catcode`\<=\other \def\normalless{<}
+\catcode`\>=\other \def\normalgreater{>}
+\catcode`\^=\other \def\normalcaret{^}
+\catcode`\_=\other \def\normalunderscore{_}
+\catcode`\|=\other \def\normalverticalbar{|}
+\catcode`\~=\other \def\normaltilde{~}
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Set catcodes for Texinfo file
+
+% Active characters for printing the wanted glyph.
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+%
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde
+\chardef\hatchar=`\^
+\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+\let\realunder=_
+
+\catcode`\|=\active \def|{{\tt\char124}}
+
+\chardef \less=`\<
+\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless
+\chardef \gtr=`\>
+\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr
+\catcode`\+=\active \def+{{\tt \char 43}}
+\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+\catcode`\-=\active \let-=\normaldash
+
+
+% used for headline/footline in the output routine, in case the page
+% breaks in the middle of an @tex block.
+\def\texinfochars{%
+  \let< = \activeless
+  \let> = \activegtr
+  \let~ = \activetilde 
+  \let^ = \activehat
+  \markupsetuplqdefault \markupsetuprqdefault 
+  \let\b = \strong
+  \let\i = \smartitalic
+  % in principle, all other definitions in \tex have to be undone too.
+}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+  \normalturnoffactive
+  \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In Texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active  % @ for escape char from now on.
+
+% Print a typewriter backslash.  For math mode, we can't simply use
+% \backslashcurfont: the story here is that in math mode, the \char
+% of \backslashcurfont ends up printing the roman \ from the math symbol
+% font (because \char in math mode uses the \mathcode, and plain.tex
+% sets \mathcode`\\="026E).  Hence we use an explicit \mathchar,
+% which is the decimal equivalent of "715c (class 7, e.g., use \fam;
+% ignored family value; char position "5C).  We can't use " for the
+% usual hex value because it has already been made active.
+
+@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}}
+@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents.
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.  We switch back and forth between these.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+%
+{@catcode`- = @active
+ @gdef@normalturnoffactive{%
+   @passthroughcharstrue
+   @let-=@normaldash
+   @let"=@normaldoublequote
+   @let$=@normaldollar %$ font-lock fix
+   @let+=@normalplus
+   @let<=@normalless
+   @let>=@normalgreater
+   @let^=@normalcaret
+   @let_=@normalunderscore
+   @let|=@normalverticalbar
+   @let~=@normaltilde
+   @let\=@ttbackslash
+   @markupsetuplqdefault
+   @markupsetuprqdefault
+   @unsepspaces
+ }
+}
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have @fixbackslash turn them back on.
+@catcode`+=@other @catcode`@_=@other
+
+% \enablebackslashhack - allow file to begin `\input texinfo'
+%
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+% If the file did not have a `\input texinfo', then it is turned off after
+% the first line; otherwise the first `\' in the file would cause an error.
+% This is used on the very last line of this file, texinfo.tex.
+% We also use @c to call @fixbackslash, in case ends of lines are hidden.
+{
+@catcode`@^=7
+@catcode`@^^M=13@gdef@enablebackslashhack{%
+  @global@let\ = @eatinput%
+  @catcode`@^^M=13%
+  @def@c{@fixbackslash@c}%
+  % Definition for the newline at the end of this file.
+  @def ^^M{@let^^M@secondlinenl}%
+  % Definition for a newline in the main Texinfo file.
+  @gdef @secondlinenl{@fixbackslash}%
+  % In case the first line has a whole-line command on it
+  @let@originalparsearg@parsearg
+  @def@parsearg{@fixbackslash@originalparsearg}
+}}
+
+{@catcode`@^=7 @catcode`@^^M=13%
+@gdef@eatinput input texinfo#1^^M{@fixbackslash}}
+
+% Emergency active definition of newline, in case an active newline token
+% appears by mistake.
+{@catcode`@^=7 @catcode13=13%
+@gdef@enableemergencynewline{%
+  @gdef^^M{%
+    @par%
+    %<warning: active newline>@par%
+}}}
+
+
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @ttbackslash @fi
+  @catcode13=5 % regular end of line
+  @enableemergencynewline
+  @let@c=@texinfoc
+  @let@parsearg@originalparsearg
+  % Also turn back on active characters that might appear in the input
+  % file name, in case not using a pre-dumped format.
+  @catcode`+=@active
+  @catcode`@_=@active
+  %
+  % If texinfo.cnf is present on the system, read it.
+  % Useful for site-wide @afourpaper, etc.  This macro, @fixbackslash, gets
+  % called at the beginning of every Texinfo file.  Not opening texinfo.cnf
+  % directly in this file, texinfo.tex, makes it possible to make a format
+  % file for Texinfo.
+  %
+  @openin 1 texinfo.cnf
+  @ifeof 1 @else @input texinfo.cnf @fi
+  @closein 1
+}
+
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These (along with & and #) are made active for url-breaking, so need
+% active definitions as the normal characters.
+@def@normaldot{.}
+@def@normalquest{?}
+@def@normalslash{/}
+
+% These look ok in all fonts, so just make them not special.
+% @hashchar{} gets its own user-level command, because of #line.
+@catcode`@& = @other @def@normalamp{&}
+@catcode`@# = @other @def@normalhash{#}
+@catcode`@% = @other @def@normalpercent{%}
+
+@let @hashchar = @normalhash
+
+@c Finally, make ` and ' active, so that txicodequoteundirected and
+@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we
+@c don't make ` and ' active, @code will not get them as active chars.
+@c Do this last of all since we use ` in the previous @catcode assignments.
+@catcode`@'=@active
+@catcode`@`=@active
+@markupsetuplqdefault
+@markupsetuprqdefault
+
+@c Local variables:
+@c eval: (add-hook 'before-save-hook 'time-stamp)
+@c page-delimiter: "^\\\\message\\|emacs-page"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@enablebackslashhack
diff --git a/gawk-5.0.1/doc/it/txi-it.tex b/gawk-5.0.1/doc/it/txi-it.tex
new file mode 100644
index 00000000000..ba3bf6a5fdb
--- /dev/null
+++ b/gawk-5.0.1/doc/it/txi-it.tex
@@ -0,0 +1,84 @@
+% $Id: txi-it.tex 5191 2013-02-23 00:11:18Z karl $
+% txi-it.tex -- Italian translations for texinfo.tex
+%
+% Copyright 1999, 2007, 2008 Free Software Foundation.
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 3 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+\txisetlanguage{italian}{2}{2}
+
+\plainfrenchspacing
+
+\gdef\putwordAppendix{Appendice}
+\gdef\putwordChapter{Capitolo}
+\gdef\putwordfile{file}
+\gdef\putwordin{in}
+\gdef\putwordIndexIsEmpty{(L'indice \'e vuoto)}
+\gdef\putwordIndexNonexistent{(L'indice non esiste)}
+\gdef\putwordInfo{Info}
+\gdef\putwordInstanceVariableof{Variabile di istanza di}
+\gdef\putwordMethodon{Metodo di}
+\gdef\putwordNoTitle{Nessun titolo}
+\gdef\putwordof{di}
+\gdef\putwordon{su}
+\gdef\putwordpage{pagina}
+\gdef\putwordsection{sezione}
+\gdef\putwordSection{Sezione}
+\gdef\putwordsee{si veda la}
+\gdef\putwordSee{Si veda la}
+\gdef\putwordShortTOC{Sommario abbreviato}
+\gdef\putwordTOC{Sommario}
+%
+\gdef\putwordMJan{Gennaio}
+\gdef\putwordMFeb{Febbraio}
+\gdef\putwordMMar{Marzo}
+\gdef\putwordMApr{Aprile}
+\gdef\putwordMMay{Maggio}
+\gdef\putwordMJun{Giugno}
+\gdef\putwordMJul{Luglio}
+\gdef\putwordMAug{Agosto}
+\gdef\putwordMSep{Settembre}
+\gdef\putwordMOct{Ottobre}
+\gdef\putwordMNov{Novembre}
+\gdef\putwordMDec{Dicembre}
+%
+\gdef\putwordDefmac{Macro}
+\gdef\putwordDefspec{Forma speciale}
+\gdef\putwordDefvar{Variabile}
+\gdef\putwordDefopt{Opzione}
+\gdef\putwordDeffunc{Funzione}
+
+\gdef\putwordla{la}
+\gdef\putwordLa{La}
+\gdef\putwordsivedail{si veda il}
+\gdef\putwordSivedail{Si veda il}
+% Produces article before Section names
+\def\refla#1{\putwordla{} \xrefX[#1,,,,,,,]}
+\def\refLa#1{\putwordLa{} \xrefX[#1,,,,,,,]}
+% Produces article before Chapter names
+\def\pxrefil#1{\putwordsivedail{} \xrefX[#1,,,,,,,]}
+\def\pxrefIl#1{\putwordSivedail{} \xrefX[#1,,,,,,,]}
+\def\xrefil#1{\putwordsivedail{} \xrefX[#1,,,,,,,]}
+\def\xrefIl#1{\putwordSivedail{} \xrefX[#1,,,,,,,]}
+
+% Produces Day Month Year style of output.
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+% ultimo aggiornamento: 19 febbraio 2015 21:11
diff --git a/gawk-5.0.1/doc/it/vettore-elementi.eps b/gawk-5.0.1/doc/it/vettore-elementi.eps
new file mode 100644
index 00000000000..87979fb8fd9
--- /dev/null
+++ b/gawk-5.0.1/doc/it/vettore-elementi.eps
@@ -0,0 +1,159 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: vettore-elementi.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5e
+%%CreationDate: Mon Feb  9 17:13:19 2015
+%%For: marco@casa1 (Marco)
+%%BoundingBox: 0 0 383 76
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 76 moveto 0 0 lineto 383 0 lineto 383 76 lineto closepath clip newpath
+-203.3 199.4 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Polyline
+0 slj
+0 slc
+7.500 slw
+n 4455 1980 m 4455 2700 l 4455 2655 l
+ 4455 2700 l gs col0 s gr 
+% Polyline
+n 6075 1980 m
+ 6075 2700 l gs col0 s gr 
+% Polyline
+n 7425 1980 m
+ 7425 2700 l gs col0 s gr 
+/Courier-Bold ff 190.50 scf sf
+3735 2340 m
+gs 1 -1 sc (8) col0 sh gr
+/Courier-Bold ff 190.50 scf sf
+6795 2340 m
+gs 1 -1 sc ("") col0 sh gr
+/Courier-Bold ff 190.50 scf sf
+7875 2340 m
+gs 1 -1 sc (30) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+3735 3150 m
+gs 1 -1 sc (0) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+5175 3150 m
+gs 1 -1 sc (1) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+6795 3150 m
+gs 1 -1 sc (2) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+7875 3150 m
+gs 1 -1 sc (3) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+8730 2340 m
+gs 1 -1 sc (Valore) col0 sh gr
+/Times-Roman ff 190.50 scf sf
+8730 3150 m
+gs 1 -1 sc (Indice) col0 sh gr
+/Courier-Bold ff 190.50 scf sf
+5175 2340 m
+gs 1 -1 sc ("pippo") col0 sh gr
+% here ends figure;
+% 
+% here starts figure with depth 40
+% Polyline
+0 slj
+0 slc
+7.500 slw
+n 3240 1980 m 8415 1980 l 8415 2700 l 3240 2700 l
+ cp gs col0 s gr 
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+%EOF
diff --git a/gawk-5.0.1/doc/it/vettore-elementi.fig b/gawk-5.0.1/doc/it/vettore-elementi.fig
new file mode 100644
index 00000000000..37f3449c518
--- /dev/null
+++ b/gawk-5.0.1/doc/it/vettore-elementi.fig
@@ -0,0 +1,27 @@
+#FIG 3.2  Produced by xfig version 3.2.5c
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5
+	 3240 1980 8415 1980 8415 2700 3240 2700 3240 1980
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
+	 4455 1980 4455 2700 4455 2655 4455 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 6075 1980 6075 2700
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+	 7425 1980 7425 2700
+4 0 0 50 -1 14 12 0.0000 4 135 90 3735 2340 8\001
+4 0 0 50 -1 14 12 0.0000 4 45 180 6795 2340 ""\001
+4 0 0 50 -1 14 12 0.0000 4 135 180 7875 2340 30\001
+4 0 0 50 -1 0 12 0.0000 4 135 90 3735 3150 0\001
+4 0 0 50 -1 0 12 0.0000 4 135 90 5175 3150 1\001
+4 0 0 50 -1 0 12 0.0000 4 135 90 6795 3150 2\001
+4 0 0 50 -1 0 12 0.0000 4 135 90 7875 3150 3\001
+4 0 0 50 -1 0 12 0.0000 4 135 540 8730 2340 Valore\001
+4 0 0 50 -1 0 12 0.0000 4 135 540 8730 3150 Indice\001
+4 0 0 50 -1 14 12 0.0000 4 165 630 5175 2340 "pippo"\001
diff --git a/gawk-5.0.1/doc/it/vettore-elementi.pdf b/gawk-5.0.1/doc/it/vettore-elementi.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..cfec8760d7e5f3e19d15f3eaefa44766c3e3769e
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/vettore-elementi.png b/gawk-5.0.1/doc/it/vettore-elementi.png
new file mode 100644
index 0000000000000000000000000000000000000000..87ef434d5e43a2087b4a1c74d17d259807f8b7df
GIT binary patch
diff --git a/gawk-5.0.1/doc/it/vettore-elementi.txt b/gawk-5.0.1/doc/it/vettore-elementi.txt
new file mode 100644
index 00000000000..5d7efb8321f
--- /dev/null
+++ b/gawk-5.0.1/doc/it/vettore-elementi.txt
@@ -0,0 +1,4 @@
++---------+---------+--------+---------+
+|    8    |  "pippo"  |   ""   |    30   |    @r{Value}
++---------+---------+--------+---------+
+     0         1         2         3        @r{Index}
diff --git a/gawk-5.0.1/doc/lflashlight-small.xpic b/gawk-5.0.1/doc/lflashlight-small.xpic
new file mode 100644
index 00000000000..94ae774641f
--- /dev/null
+++ b/gawk-5.0.1/doc/lflashlight-small.xpic
@@ -0,0 +1,20 @@
+#! /usr/X11R6/bin/xpic
+80 48 160 80 8
+1 75 144 48 160 56 0 0
+2
+ 160 48 144 56
+1 76 112 48 136 56 0 0
+2
+ 112 56 136 48
+1 77 112 72 136 80 0 0
+2
+ 112 72 136 80
+5 78 128 48 144 80 0 0
+136 64 8 16
+3 79 80 56 112 72 0 0
+1 80 144 64 160 64 0 0
+2
+ 144 64 160 64
+1 81 144 72 160 80 0 0
+2
+ 144 72 160 80
diff --git a/gawk-5.0.1/doc/lflashlight.eps b/gawk-5.0.1/doc/lflashlight.eps
new file mode 100644
index 00000000000..fdb8cf31814
--- /dev/null
+++ b/gawk-5.0.1/doc/lflashlight.eps
@@ -0,0 +1,135 @@
+%!
+%%Creator: arnold@skeeve (Aharon Robbins)
+%%Title: rflashlight.small.xpic (xpic)
+%%CreationDate: Tue Dec 12 09:51:27 2000
+%%Pages: 1
+%%BoundingBox: 0 0 72 28.8
+%	(in inches) at 0 0, width 1, height 0.4
+%%EndComments
+% Prolog for xpic to PostScript converter
+% Author: Mark Moraes
+% $Header: x2ps.pro,v 1.2 88/03/19 16:50:09 moraes Exp 
+%	%d D - change style SOLID, DOTTED, SHORT-DASH, LONG-DASH, DOT-DASH
+%	%s F - change font to fontname
+%	%d S - change size (font size in points)
+%	(%s) rj %d t - text right just. (%d is TOPLINE, MIDLINE, BOTLINE)
+%	(%s) lj %d t - text left just. (%d is TOPLINE, MIDLINE, BOTLINE)
+%	(%s) ce %d t - text centered (%d is TOPLINE, MIDLINE, BOTLINE)
+%	%d %d l - lineto
+%	%d %d m - moveto
+%	%d %d s - spline segment
+%	x - flush line, spline
+%	<wid> <ht> <x> <y> b - box
+%	<wid> <ht> <x> <y> e - ellipse
+%	%d ss - setscale
+%	%d W - change linewidth
+%	getpagesize - gets the values of PAGEHEIGHT and PAGEWIDTH
+%	%d %d flip - translate by %d, PAGEHEIGHT - %d (this 
+%		transforms to X windows coordinates)
+save 50 dict begin /xpic exch def
+/StartXpic {newpath 0 0 moveto [] 0 setdash 0 setgray 1 setlinecap} def
+% Set defaults
+/fontname /Times-Roman def
+/ptsize 12 def
+% halign has the values for MIDLINE, TOPLINE, BOTLINE
+/halign 3 array def
+/s {rcurveto} def
+/x {stroke} def
+/l {lineto} def
+/m {moveto} def
+/b {
+	/ury exch def /urx exch def /lly exch def /llx exch def 
+	llx lly moveto urx lly lineto urx ury lineto 
+	llx ury lineto llx lly lineto stroke
+} def
+/mtrx matrix def
+/e {
+	/yc exch def /xc exch def /yrad exch def /xrad exch def
+	xc xrad add yc moveto
+	/savematrix mtrx currentmatrix def
+	xc yc translate
+	xrad yrad scale
+	0 0 1 0 360 arc
+	savematrix setmatrix stroke
+} def
+% The next three take the text string, and moveto the right horiz. position
+% leaving the string on the stack.
+/lj {} def
+/rj {dup stringwidth pop neg 0 rmoveto} def
+/ce {dup stringwidth pop 2 div neg 0 rmoveto} def
+% And this is invoked after one of the three above, and 
+% computes the vert. pos, and then displays the string.
+/t {halign exch get 0 exch rmoveto show newpath} def
+% Store an array of patterns in /styles - a pattern is an array consisting 
+% of an array and an offset. Corresp to xpic patterns
+% solid, dotted, short-dashed, long-dashed, dot-dashed
+/styles [ [] 0 ] [ [1 3] 0 ] [ [4 4] 0 ] [ [8 4] 0 ] [ [1 4 4 4] 0 ]
+	5 array astore def
+% change style to arg.
+/D {stroke styles exch get aload pop setdash newpath} def
+/W {stroke 0.5 mul setlinewidth newpath} def
+% fontbox takes a fontname off the stack, and returns an array
+% containing the values of the bottom line of the bounding box, the
+% mid line of the bounding box, and the top line of the bounding box
+% of that font, taken from the baseline, scaled to a font of size 1
+/fontbox {
+	findfont dup /FontMatrix get /fm exch def /FontBBox get aload pop
+	/ytop exch def pop /ybot exch def pop
+	/ymid ytop ybot sub 2 div def
+	0 ybot fm dtransform exch pop % botline
+	dup neg exch % midline - this works better than (ytop-ybot)/2!
+	0 ytop fm dtransform exch pop exch %topline
+	% now in the order midline, topline, botline.
+	3 array astore
+} def
+% select font
+/F {
+	dup /fontname exch def fontbox
+	/thisfontbox exch def SF 
+} def
+% set point size
+/S {/ptsize exch def SF} def
+% actually set font
+/SF {
+	fontname findfont ptsize curscale div scalefont setfont
+	thisfontbox aload pop
+	1 1 3 {
+		pop ptsize mul curscale div neg 3 1 roll
+	} for
+	halign astore pop
+} def
+% sets the scale to 72 / n, where n is on the stack, and stores the value
+% in curscale for font scaling
+/curscale 1 def
+/getpagesize{newpath clippath pathbbox /pageheight exch def 
+	/pagewidth exch def pop pop newpath} def
+/flip{pageheight exch sub translate} def
+/ss {/curscale exch 72 exch div dup dup scale def} def
+/land {90 rotate} def
+StartXpic
+%%EndProlog
+80 ss
+0.5 W
+0 D
+80 32 m
+64 24 l
+x
+32 24 m
+56 32 l
+x
+32 8 m
+56 0 l
+x
+8 16 56 16 e
+0 24 32 8 b
+64 16 m
+80 16 l
+x
+64 8 m
+80 0 l
+x
+%%Trailer
+showpage
+% Trailer for xpic to PostScript converter
+% $Header: x2ps.tra,v 1.2 89/07/02 15:59:53 moraes Exp $
+xpic end restore
diff --git a/gawk-5.0.1/doc/lflashlight.pdf b/gawk-5.0.1/doc/lflashlight.pdf
new file mode 100644
index 00000000000..4432fdd0973
--- /dev/null
+++ b/gawk-5.0.1/doc/lflashlight.pdf
@@ -0,0 +1,56 @@
+%PDF-1.3
+%�쏢
+6 0 obj
+<</Length 7 0 R/Filter /FlateDecode>>
+stream
+x�U�A!E�=EO����n���������51�P���)D$[�l;p�
+>���3~ �E�*����Xp��Z)IwZyB�Ț��l�jF�B�3fI��a�V
�H�T�M��V��*�R����j��owU���4�E��
��Im�t�>��1Ҫ��O>endstream
+endobj
+7 0 obj
+168
+endobj
+5 0 obj
+<</Type/Page/MediaBox [0 0 72 28.8]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ExtGState 8 0 R
+>>
+/Contents 6 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+5 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+>>
+endobj
+4 0 obj
+<</Type/ExtGState/Name/R4/TR/Identity/OPM 1/SM 0.02>>
+endobj
+8 0 obj
+<</R4
+4 0 R>>
+endobj
+2 0 obj
+<</Producer(GNU Ghostscript 7.07)>>endobj
+xref
+0 9
+0000000000 65535 f 
+0000000471 00000 n 
+0000000617 00000 n 
+0000000412 00000 n 
+0000000519 00000 n 
+0000000272 00000 n 
+0000000015 00000 n 
+0000000253 00000 n 
+0000000588 00000 n 
+trailer
+<< /Size 9 /Root 1 0 R /Info 2 0 R
+>>
+startxref
+667
+%%EOF
diff --git a/gawk-5.0.1/doc/macros b/gawk-5.0.1/doc/macros
new file mode 100644
index 00000000000..59fca2064fd
--- /dev/null
+++ b/gawk-5.0.1/doc/macros
@@ -0,0 +1,211 @@
+.\" SSC Reference card macros
+.\"
+.\" Copyright (C) 1996, 2012 Specialized System Consultants Inc. (SSC)
+.\" 
+.\" These macros are free software; you can redistribute them and/or modify
+.\" them under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 3 of the License, or
+.\" (at your option) any later version.
+.\" 
+.\" These macros are distributed in the hope that it will be useful,
+.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+.\" GNU General Public License for more details.
+.\" 
+.\" You should have received a copy of the GNU General Public License
+.\" along with this program; if not, write to the Free Software
+.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+.\"
+.\"	Generic SSC "card" macros
+.\"     based on lots of other macros
+.\"     Last update: 4-25-91 ph
+.\"     attempting to get margins in the boxes Aug  3 09:43:48 PDT 1994
+.ll 3i		\" length of text line
+.lt 3.2i	\" length of title line 
+.de BT	\" bottom of page trap
+.sp |8.2i		\" go to where we put footer
+.ie \\n(CL=1 \{\
+.	nr CL 2
+.tl ''\\*(CD\\n+(PN''	\" footer is just page number
+.	po 4i		\" go to second column
+.TP			\" print header if any
+\}
+.el \{\
+.	nr CL 1
+.tl ''\\*(CD\\n+(PN''	\" footer is just page number
+.	po .5i		\" go to first column
+.	bp		\" force a new page (which will force header)
+.	TP
+\}
+..
+.de TP	\" top of page
+.\" .sp |.2i
+.sp |0
+.\" put page header stuff here 
+.\" for example: .tl ''WOW!''
+.\".sp
+..
+.\" .wh 8.1i BT 		\" set bottom of column trap
+.nf			\" don't fill lines
+.nh			\" no hyphenation
+.nr CL 1		\" start with column = 1
+.po .5i			\" offset for first column
+.vs 9			\" line spacing
+.ps 8			\" point size
+.de ST	\" set tabs to normal places
+.ta .2i .78i 1.2i 1.7i	\" set tabs 
+..
+.ig
+    From: bryang@chinet.chi.il.us (Bryan Glennon)
+    Box macro.  Do a .mk z where the box is to start, and a .eb
+    where it is to end.  Optional argument is a title to be centered
+    within the top box line.
+   
+    Usage:
+   
+     .mk z
+     Text, etc to be boxed...
+     .eb "Optional title goes here"
+    
+     ~or~
+   
+     .mk z
+     Text, etc to be boxed...
+     .eb 
+   
+   
+    Some explanation:
+     The macro name is eb <.de eb>.  First thing we do is to go up on line
+     <.sp -1> and turn off fill mode <.nf>.  Now it gets interesting: the
+    .ie is the if/else construct.  We check the number of arguments provided
+    to the macro <\\n(.$> and if it is greater than 0 (meaning we have a title),
+    we do the rest of the .ie line, as follows:
+   
+                         \h'-.5n'     - move left one-half of an n
+                         \L'|\\nzu-1' - draw a vertical line <\L> to the 
+                                        absolute position (|) given by \\nzu-1,
+                                        which is the position set with the .mk 
+                                        command into register z <\\nz> in base 
+                                        units <u> minus 1.
+    \l'(\\n(.lu+1n-\w'\\$1'u/2u)\(ul' - Draw a horizontal line <\l> with length
+                                        equal to the current line length 
+                                        <\\n(.l> in base units <u> plus the 
+                                        space required for an 'n' <1n>, minus 
+                                        the width <\w> of the title string 
+                                        <\\$1> in base units <u> divided by 2 
+                                        <in base units <u>>.  Draw the line 
+                                        using the underline character, <\(ul>.
+             \v'.3m'\|\\$1\|\v'-.3m' -  Move down the page 3/10 of an m,
+                                        <\v'.3m'>, output a 1/6 of an m space
+                                        <\|>, output the title <\\$1>, another
+                                        1/6 of an m space <\|>, and then move
+                                        up the page 3/10 of an m <\v'-.3m'>.
+                         \l'...\(ul' -  Draw the second part of the line, just
+                                        like the corresponding left half done
+                                        before.
+                       \L'-|\\nzu+1' -  Draw a verticle line <\L> going down
+                                        the absolute distance <-|> from where 
+                                        the macro was given to where the start 
+                                        point was marked <\\nz> in base units
+                                        <u> plus one line <+1>
+                     \l'|0u-.5n\(ul' -  Draw a horizontal line to the absolute
+                                        position (|0) when the macro was 
+                                        invoked, minus half an n <-.5n> using
+                                        the underline character <\(ul>.
+   
+       The .el beings the else part, which is identical to the above, except
+       the string dosen't get printed.  This makes the printing of the top
+       line much easier: just draw a line <\l> with width equal to the
+       current line plus the witdh of an n <\\n(.l+1n> using the underline
+       character <.\(ul>.
+..
+.de ES	\" start "text in a box"
+.mk z
+.in +.5n
+.ll -.5n
+.sp 1.3
+..
+.de EB	\" end "text in a box" -- optional box title as argument
+.sp -.6
+.nf
+.in -.5n
+.ll +.5n
+.ie \\n(.$\
+\L'|\\nzu'\
+\l'(\\n(.lu-\w'\\$1'u)/2u-.33m\(ul'\
+\v'.3m'\|\\$1\|\v'-.3m'\
+\l'(\\n(.lu-\w'\\$1'u)/2u\(ul'\
+\L'-|\\nzu'\
+\l'|0u\(ul'
+.el \h'-.5n'\L'|\\nzu-1'\l'\\n(.lu+1n\(ul'\L'-|\\nzu+1'\l'|0u-.5n\(ul'
+.in 0
+..
+.de SL	\" draw single line (works in non-fill mode only)
+.sp -.8
+.ti 0
+\l'\\n(.lu\(ul'
+..
+.de Hl \" draw horizontal line
+.br
+.ti 0
+\l'\\n(.lu-\\n(.iu'
+.br
+..
+.de DL	\" draw double line (works in non-fill mode only)
+.sp -.8
+.ti 0
+\l'\\n(.lu\(ul'
+.sp -.8
+.ti 0
+\l'\\n(.lu\(ul'
+..
+.ST
+.nr PN 0 1	\" sets starting page number and auto-increment
+.\" must define page header (if any) before here
+.TP
+.ds 3) \|\v'3p'\s+5\z\(sq\s0\v'-3p'\h'1.25p'\v'-.5p'3\v'.5p'\h'2p'
+.\" old one .ds 2) \h'-1.5p'\v'1p'\s+4\z\(ci\s0\v'-1p'\h'3.25p'2
+.ds 2) \|\v'-2.4p'\D'c.095id'\h'-5.15p'\v'2.4p'2\h'1.9p'
+.ds dC \v'1p'\s+5\(bu\s0\v'-1p'\" for development commands
+.ds tC \s+2\(dm\s0\" (for DWB) should be a triangle
+.ds tP \s+2\(dm\s0\" (for other text processing) should be a triangle
+.\" various trademark symbols
+.ds Tm \v'-0.5m'\s8TM\s0\v'0.5m'
+.ds Ts \v'-0.5m'\s4TM\s0\v'0.5m'
+.ig ++
+.\" mount Serifa fonts
+.fp 5 SR
+.fp 6 SB
+.fp 4 Si
+.++
+.\" other assorted junk
+.lg 0
+.\" Fl requires extended version of troff
+.de Fl \" draw fat horizontal line
+.br
+.ti 0
+.ruw 1.5p
+\l'\\n(.lu-\\n(.iu'
+.br
+.ruw
+..
+.de Bx \" box for keys in text
+\\$3\&\|\&\c
+\s-3\(br\|\fH\v'.18n'\\$1\v'-.18n\fP\|\(br\l'|0\(rn'\l'|0\(ul'\&\s0\|\\$2
+..
+.de Fn	\" function name - left justified, gray background
+.\" bold with gray for function name
+.ns
+.br
+\ 
+.ns
+.br
+\!! gsave ( ) stringwidth neg 0 rmoveto
+\!! /Serifa-Bold findfont 8 scalefont setfont
+\!! (\\$1) dup stringwidth pop 6 gsave dup 0 exch rlineto neg exch 0 rlineto
+\!! 0 exch rlineto closepath .9 setgray fill grestore show
+\!! grestore
+.nf
+.rs
+..
+.rs
diff --git a/gawk-5.0.1/doc/no.colors b/gawk-5.0.1/doc/no.colors
new file mode 100644
index 00000000000..b4fa397c5eb
--- /dev/null
+++ b/gawk-5.0.1/doc/no.colors
@@ -0,0 +1,31 @@
+.\" AWK Reference Card --- Arnold Robbins, arnold@skeeve.com
+.\" This file is for troff which does not know what to do
+.\" with literal Poscript and cannot use the macros from 'colors'.
+.\"
+.\" Copyright (C) 1996 Free Software Foundation, Inc.
+.\" 
+.\" Permission is granted to make and distribute verbatim copies of
+.\" this reference card provided the copyright notice and this permission
+.\" notice are preserved on all copies.
+.\" 
+.\" Permission is granted to process this file through troff and print the
+.\" results, provided the printed document carries copying permission
+.\" notice identical to this one except for the removal of this paragraph
+.\" (this paragraph not being relevant to the printed reference card).
+.\" 
+.\" Permission is granted to copy and distribute modified versions of this
+.\" reference card under the conditions for verbatim copying, provided that
+.\" the entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\" 
+.\" Permission is granted to copy and distribute translations of this
+.\" reference card into another language, under the above conditions for
+.\" modified versions, except that this permission notice may be stated in
+.\" a translation approved by the Foundation.
+.\"
+.ds CR
+.ds CG
+.ds CL
+.ds CB
+.ds CD
+.ds CX
diff --git a/gawk-5.0.1/doc/process-flow.eps b/gawk-5.0.1/doc/process-flow.eps
new file mode 100644
index 00000000000..81b937bac61
--- /dev/null
+++ b/gawk-5.0.1/doc/process-flow.eps
@@ -0,0 +1,191 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: process-flow.fig
+%%Creator: fig2dev Version 3.2 Patchlevel 5c
+%%CreationDate: Thu Jan  6 17:25:09 2011
+%%BoundingBox: 0 0 367 174
+%Magnification: 1.0000
+%%EndComments
+%%BeginProlog
+/$F2psDict 200 dict def
+$F2psDict begin
+$F2psDict /mtrx matrix put
+/col-1 {0 setgray} bind def
+/col0 {0.000 0.000 0.000 srgb} bind def
+/col1 {0.000 0.000 1.000 srgb} bind def
+/col2 {0.000 1.000 0.000 srgb} bind def
+/col3 {0.000 1.000 1.000 srgb} bind def
+/col4 {1.000 0.000 0.000 srgb} bind def
+/col5 {1.000 0.000 1.000 srgb} bind def
+/col6 {1.000 1.000 0.000 srgb} bind def
+/col7 {1.000 1.000 1.000 srgb} bind def
+/col8 {0.000 0.000 0.560 srgb} bind def
+/col9 {0.000 0.000 0.690 srgb} bind def
+/col10 {0.000 0.000 0.820 srgb} bind def
+/col11 {0.530 0.810 1.000 srgb} bind def
+/col12 {0.000 0.560 0.000 srgb} bind def
+/col13 {0.000 0.690 0.000 srgb} bind def
+/col14 {0.000 0.820 0.000 srgb} bind def
+/col15 {0.000 0.560 0.560 srgb} bind def
+/col16 {0.000 0.690 0.690 srgb} bind def
+/col17 {0.000 0.820 0.820 srgb} bind def
+/col18 {0.560 0.000 0.000 srgb} bind def
+/col19 {0.690 0.000 0.000 srgb} bind def
+/col20 {0.820 0.000 0.000 srgb} bind def
+/col21 {0.560 0.000 0.560 srgb} bind def
+/col22 {0.690 0.000 0.690 srgb} bind def
+/col23 {0.820 0.000 0.820 srgb} bind def
+/col24 {0.500 0.190 0.000 srgb} bind def
+/col25 {0.630 0.250 0.000 srgb} bind def
+/col26 {0.750 0.380 0.000 srgb} bind def
+/col27 {1.000 0.500 0.500 srgb} bind def
+/col28 {1.000 0.630 0.630 srgb} bind def
+/col29 {1.000 0.750 0.750 srgb} bind def
+/col30 {1.000 0.880 0.880 srgb} bind def
+/col31 {1.000 0.840 0.000 srgb} bind def
+
+end
+
+/cp {closepath} bind def
+/ef {eofill} bind def
+/gr {grestore} bind def
+/gs {gsave} bind def
+/sa {save} bind def
+/rs {restore} bind def
+/l {lineto} bind def
+/m {moveto} bind def
+/rm {rmoveto} bind def
+/n {newpath} bind def
+/s {stroke} bind def
+/sh {show} bind def
+/slc {setlinecap} bind def
+/slj {setlinejoin} bind def
+/slw {setlinewidth} bind def
+/srgb {setrgbcolor} bind def
+/rot {rotate} bind def
+/sc {scale} bind def
+/sd {setdash} bind def
+/ff {findfont} bind def
+/sf {setfont} bind def
+/scf {scalefont} bind def
+/sw {stringwidth} bind def
+/tr {translate} bind def
+/tnt {dup dup currentrgbcolor
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add
+  4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
+  bind def
+/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
+  4 -2 roll mul srgb} bind def
+/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
+/$F2psEnd {$F2psEnteredState restore end} def
+
+/pageheader {
+save
+newpath 0 174 moveto 0 0 lineto 367 0 lineto 367 174 lineto closepath clip newpath
+-161.1 355.1 translate
+1 -1 scale
+$F2psBegin
+10 setmiterlimit
+0 slj 0 slc
+ 0.06299 0.06299 sc
+} bind def
+/pagefooter {
+$F2psEnd
+restore
+} bind def
+%%EndProlog
+pageheader
+%
+% Fig objects follow
+%
+% 
+% here starts figure with depth 50
+% Polyline
+0 slj
+0 slc
+7.500 slw
+n 4819 3540 m 5460 4181 l 6101 3540 l 5460 2899 l 4819 3540 l
+ cp gs col0 s gr 
+% Polyline
+gs  clippath
+4634 3585 m 4785 3585 l 4785 3525 l 4634 3525 l 4634 3525 l 4754 3555 l 4634 3585 l cp
+eoclip
+n 3960 3555 m
+ 4770 3555 l gs col0 s gr gr
+
+% arrowhead
+n 4634 3585 m 4754 3555 l 4634 3525 l 4634 3585 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+gs  clippath
+6839 3585 m 6990 3585 l 6990 3525 l 6839 3525 l 6839 3525 l 6959 3555 l 6839 3585 l cp
+eoclip
+n 6165 3555 m
+ 6975 3555 l gs col0 s gr gr
+
+% arrowhead
+n 6839 3585 m 6959 3555 l 6839 3525 l 6839 3585 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 2644 3240 m 2569 3240 2569 3802 75 arcto 4 {pop} repeat
+  2569 3877 3835 3877 75 arcto 4 {pop} repeat
+  3910 3877 3910 3315 75 arcto 4 {pop} repeat
+  3910 3240 2644 3240 75 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+% Polyline
+n 7095 3240 m 7020 3240 7020 3806 75 arcto 4 {pop} repeat
+  7020 3881 8294 3881 75 arcto 4 {pop} repeat
+  8369 3881 8369 3315 75 arcto 4 {pop} repeat
+  8369 3240 7095 3240 75 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+% Polyline
+gs  clippath
+5460 4904 m 5460 5055 l 5520 5055 l 5520 4904 l 5520 4904 l 5490 5024 l 5460 4904 l cp
+eoclip
+n 5490 4230 m
+ 5490 5040 l gs col0 s gr gr
+
+% arrowhead
+n 5460 4904 m 5490 5024 l 5520 4904 l 5460 4904 l  cp gs 0.00 setgray ef gr  col0 s
+% Polyline
+n 5028 5067 m 4953 5067 4953 5550 75 arcto 4 {pop} repeat
+  4953 5625 5905 5625 75 arcto 4 {pop} repeat
+  5980 5625 5980 5142 75 arcto 4 {pop} repeat
+  5980 5067 5028 5067 75 arcto 4 {pop} repeat
+ cp gs col0 s gr 
+% Polyline
+gs  clippath
+4305 3736 m 4305 3585 l 4245 3585 l 4245 3736 l 4245 3736 l 4275 3616 l 4305 3736 l cp
+eoclip
+n 4905 5355 m 4275 5355 l
+ 4275 3600 l gs col0 s gr gr
+
+% arrowhead
+n 4305 3736 m 4275 3616 l 4245 3736 l 4305 3736 l  cp gs 0.00 setgray ef gr  col0 s
+/Times-Roman ff 180.00 scf sf
+5265 3375 m
+gs 1 -1 sc (More) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+5265 3630 m
+gs 1 -1 sc (Data) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+5265 3885 m
+gs 1 -1 sc (    ?) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+6210 3465 m
+gs 1 -1 sc (No) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+5535 4455 m
+gs 1 -1 sc (Yes) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+2745 3645 m
+gs 1 -1 sc (Initialization) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+7290 3600 m
+gs 1 -1 sc (Clean Up) col0 sh gr
+/Times-Roman ff 180.00 scf sf
+5130 5400 m
+gs 1 -1 sc (Process) col0 sh gr
+% here ends figure;
+pagefooter
+showpage
+%%Trailer
+%EOF
diff --git a/gawk-5.0.1/doc/process-flow.fig b/gawk-5.0.1/doc/process-flow.fig
new file mode 100644
index 00000000000..b66131374d0
--- /dev/null
+++ b/gawk-5.0.1/doc/process-flow.fig
@@ -0,0 +1,37 @@
+#FIG 3.2  Produced by xfig version 3.2.5b
+Landscape
+Center
+Metric
+A4      
+100.00
+Single
+-2
+1200 2
+2 3 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 6
+	 4819 3540 5460 4181 6101 3540 5460 2899 4819 3540 4819 3540
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 3960 3555 4770 3555
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 6165 3555 6975 3555
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5
+	 2569 3240 2569 3877 3910 3877 3910 3240 2569 3240
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5
+	 7020 3240 7020 3881 8369 3881 8369 3240 7020 3240
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+	1 1 1.00 60.00 120.00
+	 5490 4230 5490 5040
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 5 0 0 5
+	 4953 5067 4953 5625 5980 5625 5980 5067 4953 5067
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3
+	1 1 1.00 60.00 120.00
+	 4905 5355 4275 5355 4275 3600
+4 0 0 50 -1 0 12 0.0000 4 150 480 5265 3375 More\001
+4 0 0 50 -1 0 12 0.0000 4 150 420 5265 3630 Data\001
+4 0 0 50 -1 0 12 0.0000 4 150 270 5265 3885     ?\001
+4 0 0 50 -1 0 12 0.0000 4 150 270 6210 3465 No\001
+4 0 0 50 -1 0 12 0.0000 4 150 330 5535 4455 Yes\001
+4 0 0 50 -1 0 12 0.0000 4 150 1035 2745 3645 Initialization\001
+4 0 0 50 -1 0 12 0.0000 4 195 810 7290 3600 Clean Up\001
+4 0 0 50 -1 0 12 0.0000 4 150 690 5130 5400 Process\001
diff --git a/gawk-5.0.1/doc/process-flow.pdf b/gawk-5.0.1/doc/process-flow.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..3ff5f9e8e6ed65074741452c6033c86fe3911be9
GIT binary patch
diff --git a/gawk-5.0.1/doc/process-flow.png b/gawk-5.0.1/doc/process-flow.png
new file mode 100644
index 0000000000000000000000000000000000000000..97f467f4fb0c0e7039e7097b5ba2a4003cf1ecfc
GIT binary patch
diff --git a/gawk-5.0.1/doc/process-flow.txt b/gawk-5.0.1/doc/process-flow.txt
new file mode 100644
index 00000000000..d729638596d
--- /dev/null
+++ b/gawk-5.0.1/doc/process-flow.txt
@@ -0,0 +1,11 @@
+                              ______
++----------------+           / More \  No       +----------+
+| Initialization | -------> <  Data  > -------> | Clean Up |
++----------------+    ^      \   ?  /           +----------+
+                      |       +--+-+
+                      |          | Yes
+                      |          |
+                      |          V
+                      |     +---------+
+                      +-----+ Process |
+                            +---------+
diff --git a/gawk-5.0.1/doc/rflashlight-small.xpic b/gawk-5.0.1/doc/rflashlight-small.xpic
new file mode 100644
index 00000000000..9e78a3f55e4
--- /dev/null
+++ b/gawk-5.0.1/doc/rflashlight-small.xpic
@@ -0,0 +1,26 @@
+#! /usr/X11R6/bin/xpic
+80 48 160 80 8
+5 36 96 48 112 80 0 0
+104 64 8 16
+1 37 104 48 128 56 0 0
+2
+ 104 48 128 56
+1 38 104 72 128 80 0 0
+2
+ 104 80 128 72
+2 39 128 56 128 72 0 0
+2
+ 128 56 128 72
+3 40 128 56 160 72 0 0
+1 41 80 72 80 72 0 0
+2
+ 80 72 80 72
+1 42 80 72 96 80 0 0
+2
+ 80 80 96 72
+1 43 80 64 96 64 0 0
+2
+ 80 64 96 64
+1 45 80 48 96 56 0 0
+2
+ 96 56 80 48
diff --git a/gawk-5.0.1/doc/rflashlight.eps b/gawk-5.0.1/doc/rflashlight.eps
new file mode 100644
index 00000000000..28cb7e258ab
--- /dev/null
+++ b/gawk-5.0.1/doc/rflashlight.eps
@@ -0,0 +1,141 @@
+%!
+%%Creator: arnold@skeeve (Aharon Robbins)
+%%Title: flashlight.small.xpic (xpic)
+%%CreationDate: Tue Oct 24 14:41:28 2000
+%%Pages: 1
+%%BoundingBox: 0 0 72 28.8
+%	(in inches) at 0 0, width 1, height 0.4
+%%EndComments
+% Prolog for xpic to PostScript converter
+% Author: Mark Moraes
+% $Header: x2ps.pro,v 1.2 88/03/19 16:50:09 moraes Exp 
+%	%d D - change style SOLID, DOTTED, SHORT-DASH, LONG-DASH, DOT-DASH
+%	%s F - change font to fontname
+%	%d S - change size (font size in points)
+%	(%s) rj %d t - text right just. (%d is TOPLINE, MIDLINE, BOTLINE)
+%	(%s) lj %d t - text left just. (%d is TOPLINE, MIDLINE, BOTLINE)
+%	(%s) ce %d t - text centered (%d is TOPLINE, MIDLINE, BOTLINE)
+%	%d %d l - lineto
+%	%d %d m - moveto
+%	%d %d s - spline segment
+%	x - flush line, spline
+%	<wid> <ht> <x> <y> b - box
+%	<wid> <ht> <x> <y> e - ellipse
+%	%d ss - setscale
+%	%d W - change linewidth
+%	getpagesize - gets the values of PAGEHEIGHT and PAGEWIDTH
+%	%d %d flip - translate by %d, PAGEHEIGHT - %d (this 
+%		transforms to X windows coordinates)
+save 50 dict begin /xpic exch def
+/StartXpic {newpath 0 0 moveto [] 0 setdash 0 setgray 1 setlinecap} def
+% Set defaults
+/fontname /Times-Roman def
+/ptsize 12 def
+% halign has the values for MIDLINE, TOPLINE, BOTLINE
+/halign 3 array def
+/s {rcurveto} def
+/x {stroke} def
+/l {lineto} def
+/m {moveto} def
+/b {
+	/ury exch def /urx exch def /lly exch def /llx exch def 
+	llx lly moveto urx lly lineto urx ury lineto 
+	llx ury lineto llx lly lineto stroke
+} def
+/mtrx matrix def
+/e {
+	/yc exch def /xc exch def /yrad exch def /xrad exch def
+	xc xrad add yc moveto
+	/savematrix mtrx currentmatrix def
+	xc yc translate
+	xrad yrad scale
+	0 0 1 0 360 arc
+	savematrix setmatrix stroke
+} def
+% The next three take the text string, and moveto the right horiz. position
+% leaving the string on the stack.
+/lj {} def
+/rj {dup stringwidth pop neg 0 rmoveto} def
+/ce {dup stringwidth pop 2 div neg 0 rmoveto} def
+% And this is invoked after one of the three above, and 
+% computes the vert. pos, and then displays the string.
+/t {halign exch get 0 exch rmoveto show newpath} def
+% Store an array of patterns in /styles - a pattern is an array consisting 
+% of an array and an offset. Corresp to xpic patterns
+% solid, dotted, short-dashed, long-dashed, dot-dashed
+/styles [ [] 0 ] [ [1 3] 0 ] [ [4 4] 0 ] [ [8 4] 0 ] [ [1 4 4 4] 0 ]
+	5 array astore def
+% change style to arg.
+/D {stroke styles exch get aload pop setdash newpath} def
+/W {stroke 0.5 mul setlinewidth newpath} def
+% fontbox takes a fontname off the stack, and returns an array
+% containing the values of the bottom line of the bounding box, the
+% mid line of the bounding box, and the top line of the bounding box
+% of that font, taken from the baseline, scaled to a font of size 1
+/fontbox {
+	findfont dup /FontMatrix get /fm exch def /FontBBox get aload pop
+	/ytop exch def pop /ybot exch def pop
+	/ymid ytop ybot sub 2 div def
+	0 ybot fm dtransform exch pop % botline
+	dup neg exch % midline - this works better than (ytop-ybot)/2!
+	0 ytop fm dtransform exch pop exch %topline
+	% now in the order midline, topline, botline.
+	3 array astore
+} def
+% select font
+/F {
+	dup /fontname exch def fontbox
+	/thisfontbox exch def SF 
+} def
+% set point size
+/S {/ptsize exch def SF} def
+% actually set font
+/SF {
+	fontname findfont ptsize curscale div scalefont setfont
+	thisfontbox aload pop
+	1 1 3 {
+		pop ptsize mul curscale div neg 3 1 roll
+	} for
+	halign astore pop
+} def
+% sets the scale to 72 / n, where n is on the stack, and stores the value
+% in curscale for font scaling
+/curscale 1 def
+/getpagesize{newpath clippath pathbbox /pageheight exch def 
+	/pagewidth exch def pop pop newpath} def
+/flip{pageheight exch sub translate} def
+/ss {/curscale exch 72 exch div dup dup scale def} def
+/land {90 rotate} def
+StartXpic
+%%EndProlog
+80 ss
+0.5 W
+0 D
+8 16 24 16 e
+24 32 m
+48 24 l
+x
+24 0 m
+48 8 l
+x
+48 24 m
+0 0 0 -5.33333 0 -16 s
+x
+48 24 80 8 b
+0 8 m
+0 8 l
+x
+0 0 m
+16 8 l
+x
+0 16 m
+16 16 l
+x
+16 24 m
+0 32 l
+x
+%%Trailer
+showpage
+% Trailer for xpic to PostScript converter
+% $Header: x2ps.tra,v 1.2 89/07/02 15:59:53 moraes Exp $
+xpic end restore
diff --git a/gawk-5.0.1/doc/rflashlight.pdf b/gawk-5.0.1/doc/rflashlight.pdf
new file mode 100644
index 00000000000..72c8561e177
--- /dev/null
+++ b/gawk-5.0.1/doc/rflashlight.pdf
@@ -0,0 +1,57 @@
+%PDF-1.3
+%�쏢
+6 0 obj
+<</Length 7 0 R/Filter /FlateDecode>>
+stream
+x�E�Q� ��9'pBQ�+���eYR�%��'(]���a�5�Za��U������fO�yF�zD�E�SH|FN)�,h������S?i�Wk��*ڞ%H!F���Ю�M��\m���
+2��m���
+�t��g��H�����XTR��쬊�>@��2{�M�WV����'E�endstream
+endobj
+7 0 obj
+175
+endobj
+5 0 obj
+<</Type/Page/MediaBox [0 0 72 28.8]
+/Rotate 0/Parent 3 0 R
+/Resources<</ProcSet[/PDF]
+/ExtGState 8 0 R
+>>
+/Contents 6 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages /Kids [
+5 0 R
+] /Count 1
+>>
+endobj
+1 0 obj
+<</Type /Catalog /Pages 3 0 R
+>>
+endobj
+4 0 obj
+<</Type/ExtGState/Name/R4/TR/Identity/OPM 1/SM 0.02>>
+endobj
+8 0 obj
+<</R4
+4 0 R>>
+endobj
+2 0 obj
+<</Producer(GNU Ghostscript 7.07)>>endobj
+xref
+0 9
+0000000000 65535 f 
+0000000478 00000 n 
+0000000624 00000 n 
+0000000419 00000 n 
+0000000526 00000 n 
+0000000279 00000 n 
+0000000015 00000 n 
+0000000260 00000 n 
+0000000595 00000 n 
+trailer
+<< /Size 9 /Root 1 0 R /Info 2 0 R
+>>
+startxref
+674
+%%EOF
diff --git a/gawk-5.0.1/doc/setter.outline b/gawk-5.0.1/doc/setter.outline
new file mode 100644
index 00000000000..37e5cbfa3a9
--- /dev/null
+++ b/gawk-5.0.1/doc/setter.outline
@@ -0,0 +1,77 @@
+%!PS-Adobe-3.0
+% SSC Reference card typesetter outline / cut marks
+%
+% Copyright (C) 1996, Specialized System Consultants Inc. (SSC)
+% 
+% This file is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 2 of the License, or
+% (at your option) any later version.
+% 
+% This file is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+% GNU General Public License for more details.
+% 
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+%
+%! page cut marks and stuff for Pocket References - 10-26-88 - ph
+%! modified to move the cut marks onto the page
+%! center a string
+/inch {72 mul} def
+/cshow  % stk: string 
+	% center string in space (space us variable)
+	{
+	dup stringwidth pop	% get length of string
+	space exch sub 2 div	% compute initial space needed
+	0 rmoveto		% move over
+	show
+	} def
+
+/flashme
+{	/space 612 def
+	0 0 0 setrgbcolor	% always print this stuff
+
+	/Helvetica findfont 12 scalefont setfont
+	gsave
+% for groff (I hope)
+	-6 -6 translate
+	0.2 setlinewidth
+
+	0.25 inch 10.5 inch moveto
+	0.5 inch 10.5 inch lineto
+	.75 inch 10.75 inch moveto
+	.75 inch 11 inch lineto
+	stroke
+
+	0.25 inch 2 inch moveto
+	0.5 inch 2 inch lineto
+	.75 inch 1.75 inch moveto
+	.75 inch 1.50 inch lineto
+	stroke
+	4.25 inch 11 inch moveto
+	4.25 inch 10.75 inch lineto
+	stroke
+
+	4.25 inch 1.75 inch moveto	
+	4.25 inch 1.5 inch lineto
+	stroke
+
+	7.75 inch 1.5 inch moveto
+	7.75 inch 1.75 inch lineto
+	8 inch 2 inch moveto
+	8.25 inch 2 inch lineto
+	stroke
+
+	7.75 inch 11 inch moveto
+	7.75 inch 10.75 inch lineto
+	8 inch 10.5 inch moveto
+	8.25 inch 10.5 inch lineto
+	stroke
+	grestore
+	} def
+
+% actually do something
+
diff --git a/gawk-5.0.1/doc/sidebar.awk b/gawk-5.0.1/doc/sidebar.awk
new file mode 100644
index 00000000000..d1f3efc3239
--- /dev/null
+++ b/gawk-5.0.1/doc/sidebar.awk
@@ -0,0 +1,67 @@
+# sidebar.awk --- add support for sidebars, other stuff to gawk.texi
+
+# Copyright (C) 2013, 2016 the Free Software Foundation, Inc.
+# 
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+# 
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+BEGIN {
+	print "% ****************************************************"
+	print "% * DO NOT MODIFY THIS FILE!!!!                      *"
+	print "% * It was generated from gawktexi.in by sidebar.awk *"
+	print "% * Edit gawktexi.in instead.                        *"
+	print "% ****************************************************"
+}
+
+/^@sidebar/ {
+	sub(/^@sidebar[ \t]+/, "", $0)
+	title = $0
+	body = ""
+	collecting = 1
+	next
+}
+
+/^@end[ \t]+sidebar[ \t]*$/ {
+	collecting = 0
+	printf "@cindex sidebar, %s\n", title
+	printf "@ifdocbook\n"
+		printf "@docbook\n"
+		printf "<sidebar><title>%s</title>\n", title
+		printf "@end docbook\n"
+			print  body
+		print ""
+		printf "@docbook\n"
+		printf "</sidebar>\n"
+		printf "@end docbook\n"
+	printf "@end ifdocbook\n\n"
+
+	printf "@ifnotdocbook\n"
+		printf "@cartouche\n"
+		printf "@center @b{%s}\n\n", title
+			print  body
+		printf "@end cartouche\n"
+	printf "@end ifnotdocbook\n"
+	body = ""
+	next
+}
+
+collecting == 1 {
+	body = body RS $0
+	next
+}
+
+{ print }
diff --git a/gawk-5.0.1/doc/statist.eps b/gawk-5.0.1/doc/statist.eps
new file mode 100644
index 00000000000..1e1f09fa6c6
--- /dev/null
+++ b/gawk-5.0.1/doc/statist.eps
@@ -0,0 +1,557 @@
+%!PS-Adobe-2.0
+%%Creator: gnuplot 3.7 patchlevel 0.1
+%%CreationDate: Sun Jan  7 14:23:12 2001
+%%DocumentFonts: (atend)
+%%BoundingBox: 50 50 554 770
+%%Orientation: Portrait
+%%Pages: (atend)
+%%EndComments
+/gnudict 256 dict def
+gnudict begin
+/Color true def
+/Solid false def
+/gnulinewidth 5.000 def
+/userlinewidth gnulinewidth def
+/vshift -46 def
+/dl {10 mul} def
+/hpt_ 31.5 def
+/vpt_ 31.5 def
+/hpt hpt_ def
+/vpt vpt_ def
+/M {moveto} bind def
+/L {lineto} bind def
+/R {rmoveto} bind def
+/V {rlineto} bind def
+/vpt2 vpt 2 mul def
+/hpt2 hpt 2 mul def
+/Lshow { currentpoint stroke M
+  0 vshift R show } def
+/Rshow { currentpoint stroke M
+  dup stringwidth pop neg vshift R show } def
+/Cshow { currentpoint stroke M
+  dup stringwidth pop -2 div vshift R show } def
+/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def
+  /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def
+/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }
+ {pop pop pop Solid {pop []} if 0 setdash} ifelse } def
+/BL { stroke gnulinewidth 2 mul setlinewidth } def
+/AL { stroke gnulinewidth 2 div setlinewidth } def
+/UL { gnulinewidth mul /userlinewidth exch def } def
+/PL { stroke userlinewidth setlinewidth } def
+/LTb { BL [] 0 0 0 DL } def
+/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def
+/LT0 { PL [] 1 0 0 DL } def
+/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def
+/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def
+/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def
+/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def
+/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def
+/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def
+/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def
+/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def
+/Pnt { stroke [] 0 setdash
+   gsave 1 setlinecap M 0 0 V stroke grestore } def
+/Dia { stroke [] 0 setdash 2 copy vpt add M
+  hpt neg vpt neg V hpt vpt neg V
+  hpt vpt V hpt neg vpt V closepath stroke
+  Pnt } def
+/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V
+  currentpoint stroke M
+  hpt neg vpt neg R hpt2 0 V stroke
+  } def
+/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M
+  0 vpt2 neg V hpt2 0 V 0 vpt2 V
+  hpt2 neg 0 V closepath stroke
+  Pnt } def
+/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M
+  hpt2 vpt2 neg V currentpoint stroke M
+  hpt2 neg 0 R hpt2 vpt2 V stroke } def
+/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M
+  hpt neg vpt -1.62 mul V
+  hpt 2 mul 0 V
+  hpt neg vpt 1.62 mul V closepath stroke
+  Pnt  } def
+/Star { 2 copy Pls Crs } def
+/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M
+  0 vpt2 neg V  hpt2 0 V  0 vpt2 V
+  hpt2 neg 0 V  closepath fill } def
+/TriUF { stroke [] 0 setdash vpt 1.12 mul add M
+  hpt neg vpt -1.62 mul V
+  hpt 2 mul 0 V
+  hpt neg vpt 1.62 mul V closepath fill } def
+/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M
+  hpt neg vpt 1.62 mul V
+  hpt 2 mul 0 V
+  hpt neg vpt -1.62 mul V closepath stroke
+  Pnt  } def
+/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M
+  hpt neg vpt 1.62 mul V
+  hpt 2 mul 0 V
+  hpt neg vpt -1.62 mul V closepath fill} def
+/DiaF { stroke [] 0 setdash vpt add M
+  hpt neg vpt neg V hpt vpt neg V
+  hpt vpt V hpt neg vpt V closepath fill } def
+/Pent { stroke [] 0 setdash 2 copy gsave
+  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+  closepath stroke grestore Pnt } def
+/PentF { stroke [] 0 setdash gsave
+  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+  closepath fill grestore } def
+/Circle { stroke [] 0 setdash 2 copy
+  hpt 0 360 arc stroke Pnt } def
+/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def
+/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450  arc } bind def
+/C1 { BL [] 0 setdash 2 copy        moveto
+       2 copy  vpt 0 90 arc closepath fill
+               vpt 0 360 arc closepath } bind def
+/C2 { BL [] 0 setdash 2 copy moveto
+       2 copy  vpt 90 180 arc closepath fill
+               vpt 0 360 arc closepath } bind def
+/C3 { BL [] 0 setdash 2 copy moveto
+       2 copy  vpt 0 180 arc closepath fill
+               vpt 0 360 arc closepath } bind def
+/C4 { BL [] 0 setdash 2 copy moveto
+       2 copy  vpt 180 270 arc closepath fill
+               vpt 0 360 arc closepath } bind def
+/C5 { BL [] 0 setdash 2 copy moveto
+       2 copy  vpt 0 90 arc
+       2 copy moveto
+       2 copy  vpt 180 270 arc closepath fill
+               vpt 0 360 arc } bind def
+/C6 { BL [] 0 setdash 2 copy moveto
+      2 copy  vpt 90 270 arc closepath fill
+              vpt 0 360 arc closepath } bind def
+/C7 { BL [] 0 setdash 2 copy moveto
+      2 copy  vpt 0 270 arc closepath fill
+              vpt 0 360 arc closepath } bind def
+/C8 { BL [] 0 setdash 2 copy moveto
+      2 copy vpt 270 360 arc closepath fill
+              vpt 0 360 arc closepath } bind def
+/C9 { BL [] 0 setdash 2 copy moveto
+      2 copy  vpt 270 450 arc closepath fill
+              vpt 0 360 arc closepath } bind def
+/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill
+       2 copy moveto
+       2 copy vpt 90 180 arc closepath fill
+               vpt 0 360 arc closepath } bind def
+/C11 { BL [] 0 setdash 2 copy moveto
+       2 copy  vpt 0 180 arc closepath fill
+       2 copy moveto
+       2 copy  vpt 270 360 arc closepath fill
+               vpt 0 360 arc closepath } bind def
+/C12 { BL [] 0 setdash 2 copy moveto
+       2 copy  vpt 180 360 arc closepath fill
+               vpt 0 360 arc closepath } bind def
+/C13 { BL [] 0 setdash  2 copy moveto
+       2 copy  vpt 0 90 arc closepath fill
+       2 copy moveto
+       2 copy  vpt 180 360 arc closepath fill
+               vpt 0 360 arc closepath } bind def
+/C14 { BL [] 0 setdash 2 copy moveto
+       2 copy  vpt 90 360 arc closepath fill
+               vpt 0 360 arc } bind def
+/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill
+               vpt 0 360 arc closepath } bind def
+/Rec   { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+       neg 0 rlineto closepath } bind def
+/Square { dup Rec } bind def
+/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def
+/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def
+/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def
+/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def
+/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill
+       exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def
+/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill
+       2 copy vpt Square fill
+       Bsquare } bind def
+/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def
+/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def
+/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill
+       Bsquare } bind def
+/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill
+       Bsquare } bind def
+/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def
+/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+       2 copy vpt Square fill Bsquare } bind def
+/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill
+       2 copy exch vpt sub exch vpt Square fill Bsquare } bind def
+/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def
+/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def
+/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def
+/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def
+/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def
+/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def
+/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def
+/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def
+/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def
+/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def
+/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def
+/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def
+/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def
+/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def
+/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def
+/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def
+/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def
+/DiaE { stroke [] 0 setdash vpt add M
+  hpt neg vpt neg V hpt vpt neg V
+  hpt vpt V hpt neg vpt V closepath stroke } def
+/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M
+  0 vpt2 neg V hpt2 0 V 0 vpt2 V
+  hpt2 neg 0 V closepath stroke } def
+/TriUE { stroke [] 0 setdash vpt 1.12 mul add M
+  hpt neg vpt -1.62 mul V
+  hpt 2 mul 0 V
+  hpt neg vpt 1.62 mul V closepath stroke } def
+/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M
+  hpt neg vpt 1.62 mul V
+  hpt 2 mul 0 V
+  hpt neg vpt -1.62 mul V closepath stroke } def
+/PentE { stroke [] 0 setdash gsave
+  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+  closepath stroke grestore } def
+/CircE { stroke [] 0 setdash 
+  hpt 0 360 arc stroke } def
+/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def
+/DiaW { stroke [] 0 setdash vpt add M
+  hpt neg vpt neg V hpt vpt neg V
+  hpt vpt V hpt neg vpt V Opaque stroke } def
+/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M
+  0 vpt2 neg V hpt2 0 V 0 vpt2 V
+  hpt2 neg 0 V Opaque stroke } def
+/TriUW { stroke [] 0 setdash vpt 1.12 mul add M
+  hpt neg vpt -1.62 mul V
+  hpt 2 mul 0 V
+  hpt neg vpt 1.62 mul V Opaque stroke } def
+/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M
+  hpt neg vpt 1.62 mul V
+  hpt 2 mul 0 V
+  hpt neg vpt -1.62 mul V Opaque stroke } def
+/PentW { stroke [] 0 setdash gsave
+  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat
+  Opaque stroke grestore } def
+/CircW { stroke [] 0 setdash 
+  hpt 0 360 arc Opaque stroke } def
+/BoxFill { gsave Rec 1 setgray fill grestore } def
+end
+%%EndProlog
+%%Page: 1 1
+gnudict begin
+gsave
+50 50 translate
+0.100 0.100 scale
+0 setgray
+newpath
+(Helvetica) findfont 140 scalefont setfont
+1.000 UL
+LTb
+574 280 M
+63 0 V
+4165 0 R
+-63 0 V
+490 280 M
+(-0.3) Rshow
+574 1245 M
+63 0 V
+4165 0 R
+-63 0 V
+-4249 0 R
+(-0.2) Rshow
+574 2209 M
+63 0 V
+4165 0 R
+-63 0 V
+-4249 0 R
+(-0.1) Rshow
+574 3174 M
+63 0 V
+4165 0 R
+-63 0 V
+-4249 0 R
+(0) Rshow
+574 4138 M
+63 0 V
+4165 0 R
+-63 0 V
+-4249 0 R
+(0.1) Rshow
+574 5103 M
+63 0 V
+4165 0 R
+-63 0 V
+-4249 0 R
+(0.2) Rshow
+574 6067 M
+63 0 V
+4165 0 R
+-63 0 V
+-4249 0 R
+(0.3) Rshow
+574 7032 M
+63 0 V
+4165 0 R
+-63 0 V
+-4249 0 R
+(0.4) Rshow
+574 280 M
+0 63 V
+0 6689 R
+0 -63 V
+574 140 M
+(-10) Cshow
+1631 280 M
+0 63 V
+0 6689 R
+0 -63 V
+0 -6829 R
+(-5) Cshow
+2688 280 M
+0 63 V
+0 6689 R
+0 -63 V
+0 -6829 R
+(0) Cshow
+3745 280 M
+0 63 V
+0 6689 R
+0 -63 V
+0 -6829 R
+(5) Cshow
+4802 280 M
+0 63 V
+0 6689 R
+0 -63 V
+0 -6829 R
+(10) Cshow
+1.000 UL
+LTb
+574 280 M
+4228 0 V
+0 6752 V
+-4228 0 V
+574 280 L
+2688 2209 M
+(p\(m1=m2\) =0.0863798346775753) Lshow
+2688 1245 M
+(p\(v1=v2\) =0.31647637745891) Lshow
+1.000 UL
+LT0
+4151 6899 M
+(sample 1) Rshow
+4235 6899 M
+399 0 V
+574 3174 M
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 1 V
+43 2 V
+43 4 V
+42 8 V
+43 13 V
+43 24 V
+42 41 V
+43 65 V
+43 101 V
+43 146 V
+42 205 V
+43 271 V
+43 340 V
+42 404 V
+43 450 V
+43 470 V
+43 452 V
+42 390 V
+43 288 V
+43 153 V
+42 0 V
+43 -153 V
+43 -288 V
+42 -390 V
+43 -452 V
+43 -470 V
+43 -450 V
+42 -404 V
+43 -340 V
+43 -271 V
+42 -205 V
+43 -146 V
+43 -101 V
+43 -65 V
+42 -41 V
+43 -24 V
+43 -13 V
+42 -8 V
+43 -4 V
+43 -2 V
+42 -1 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+1.000 UL
+LT1
+4151 6759 M
+(sample 2) Rshow
+4235 6759 M
+399 0 V
+574 3174 M
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 1 V
+43 1 V
+43 1 V
+42 3 V
+43 4 V
+43 6 V
+42 9 V
+43 13 V
+43 19 V
+42 27 V
+43 37 V
+43 51 V
+43 66 V
+42 85 V
+43 106 V
+43 130 V
+42 155 V
+43 179 V
+43 201 V
+43 219 V
+42 231 V
+43 236 V
+43 229 V
+42 214 V
+43 187 V
+43 149 V
+42 104 V
+43 52 V
+43 -3 V
+43 -57 V
+42 -109 V
+43 -154 V
+43 -189 V
+42 -216 V
+43 -231 V
+43 -235 V
+43 -231 V
+42 -217 V
+43 -199 V
+43 -177 V
+42 -152 V
+43 -127 V
+43 -104 V
+42 -83 V
+43 -65 V
+43 -49 V
+43 -36 V
+42 -26 V
+43 -19 V
+43 -12 V
+42 -9 V
+43 -6 V
+43 -3 V
+43 -3 V
+42 -1 V
+43 -1 V
+43 -1 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+43 0 V
+43 0 V
+42 0 V
+43 0 V
+stroke
+grestore
+end
+showpage
+%%Trailer
+%%DocumentFonts: Helvetica
+%%Pages: 1
diff --git a/gawk-5.0.1/doc/statist.jpg b/gawk-5.0.1/doc/statist.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..92428f257344dc6de71f04bf67676ce45189c2d6
GIT binary patch
diff --git a/gawk-5.0.1/doc/statist.pdf b/gawk-5.0.1/doc/statist.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..2122a33ab46087dc73aa5aced984375de1831ada
GIT binary patch
diff --git a/gawk-5.0.1/doc/texinfo.tex b/gawk-5.0.1/doc/texinfo.tex
new file mode 100644
index 00000000000..192284cccc1
--- /dev/null
+++ b/gawk-5.0.1/doc/texinfo.tex
@@ -0,0 +1,11689 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+% 
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2019-03-03.15}
+
+%
+% Copyright 1985, 1986, 1988, 1990-2019 Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software: you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation, either version 3 of the
+% License, or (at your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program.  If not, see <https://www.gnu.org/licenses/>.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. This Exception is an additional permission under section 7
+% of the GNU General Public License, version 3 ("GPLv3").
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   https://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or
+%   https://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or
+%   https://www.gnu.org/software/texinfo/ (the Texinfo home page)
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is https://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+% LaTeX's \typeout.  This ensures that the messages it is used for
+% are identical in format to the corresponding ones from latex/pdflatex.
+\def\typeout{\immediate\write17}%
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexraggedright=\raggedright
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexsp=\sp
+\let\ptexstar=\*
+\let\ptexsup=\sup
+\let\ptext=\t
+\let\ptextop=\top
+{\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putworderror\undefined     \gdef\putworderror{error}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined       \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined   \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+
+% Give the space character the catcode for a space.
+\def\spaceisspace{\catcode`\ =10\relax}
+
+% Likewise for ^^M, the end of line character.
+\def\endlineisspace{\catcode13=10\relax}
+
+\chardef\dashChar  = `\-
+\chardef\slashChar = `\/
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+  Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+  ap-pen-dix bit-map bit-maps
+  data-base data-bases eshell fall-ing half-way long-est man-u-script
+  man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+  par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+  spell-ing spell-ings
+  stand-alone strong-est time-stamp time-stamps which-ever white-space
+  wide-spread wrap-around
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\thisisundefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines16
+}%
+
+% @errormsg{MSG}.  Do the index-like expansions on MSG, but if things
+% aren't perfect, it's not the end of the world, being an error message,
+% after all.
+% 
+\def\errormsg{\begingroup \indexnofonts \doerrormsg}
+\def\doerrormsg#1{\errmessage{#1}}
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+% Output routine
+%
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt }
+
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Output a mark which sets \thischapter, \thissection and \thiscolor.
+% We dump everything together because we only have one kind of mark.
+% This works because we only use \botmark / \topmark, not \firstmark.
+%
+% A mark contains a subexpression of the \ifcase ... \fi construct.
+% \get*marks macros below extract the needed part using \ifcase.
+%
+% Another complication is to let the user choose whether \thischapter
+% (\thissection) refers to the chapter (section) in effect at the top
+% of a page, or that at the bottom of a page.
+
+% \domark is called twice inside \chapmacro, to add one
+% mark before the section break, and one after.
+%   In the second call \prevchapterdefs is the same as \currentchapterdefs,
+% and \prevsectiondefs is the same as \currentsectiondefs.
+%   Then if the page is not broken at the mark, some of the previous
+% section appears on the page, and we can get the name of this section
+% from \firstmark for @everyheadingmarks top.
+%   @everyheadingmarks bottom uses \botmark.
+%
+% See page 260 of The TeXbook.
+\def\domark{%
+  \toks0=\expandafter{\currentchapterdefs}%
+  \toks2=\expandafter{\currentsectiondefs}%
+  \toks4=\expandafter{\prevchapterdefs}%
+  \toks6=\expandafter{\prevsectiondefs}%
+  \toks8=\expandafter{\currentcolordefs}%
+  \mark{%
+                   \the\toks0 \the\toks2  % 0: marks for @everyheadingmarks top
+      \noexpand\or \the\toks4 \the\toks6  % 1: for @everyheadingmarks bottom
+    \noexpand\else \the\toks8             % 2: color marks
+  }%
+}
+
+% \gettopheadingmarks, \getbottomheadingmarks,
+% \getcolormarks - extract needed part of mark.
+%
+% \topmark doesn't work for the very first chapter (after the title
+% page or the contents), so we use \firstmark there -- this gets us
+% the mark with the chapter defs, unless the user sneaks in, e.g.,
+% @setcolor (or @url, or @link, etc.) between @contents and the very
+% first @chapter.
+\def\gettopheadingmarks{%
+  \ifcase0\the\savedtopmark\fi
+  \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
+}
+\def\getbottomheadingmarks{\ifcase1\botmark\fi}
+\def\getcolormarks{\ifcase2\the\savedtopmark\fi}
+
+% Avoid "undefined control sequence" errors.
+\def\currentchapterdefs{}
+\def\currentsectiondefs{}
+\def\currentsection{}
+\def\prevchapterdefs{}
+\def\prevsectiondefs{}
+\def\currentcolordefs{}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\txipagewidth \newdimen\txipageheight
+
+% Main output routine.
+%
+\chardef\PAGE = 255
+\newtoks\defaultoutput
+\defaultoutput = {\savetopmark\onepageout{\pagecontents\PAGE}}
+\output=\expandafter{\the\defaultoutput}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% When outputting the double column layout for indices, an output routine
+% is run several times, which hides the original value of \topmark.  This
+% can lead to a page heading being output and duplicating the chapter heading
+% of the index.  Hence, save the contents of \topmark at the beginning of
+% the output routine.  The saved contents are valid until we actually
+% \shipout a page.
+%
+% (We used to run a short output routine to actually set \topmark and 
+% \firstmark to the right values, but if this was called with an empty page 
+% containing whatsits for writing index entries, the whatsits would be thrown 
+% away and the index auxiliary file would remain empty.)
+%
+\newtoks\savedtopmark
+\newif\iftopmarksaved
+\topmarksavedtrue
+\def\savetopmark{%
+  \iftopmarksaved\else
+    \global\savedtopmark=\expandafter{\topmark}%
+    \global\topmarksavedtrue
+  \fi
+}
+
+% \onepageout takes a vbox as an argument.
+% \shipout a vbox for a single page, adding an optional header, footer
+% and footnote.  This also causes index entries for this page to be written
+% to the auxiliary files.
+%
+\def\onepageout#1{%
+  \hoffset=\normaloffset
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Retrieve the information for the headings from the marks in the page,
+  % and call Plain TeX's \makeheadline and \makefootline, which use the
+  % values in \headline and \footline.
+  %
+  % This is used to check if we are on the first page of a chapter.
+  \ifcase1\the\savedtopmark\fi
+  \let\prevchaptername\thischaptername
+  \ifcase0\firstmark\fi
+  \let\curchaptername\thischaptername
+  %
+  \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+  %
+  \ifx\curchaptername\prevchaptername
+    \let\thischapterheading\thischapter
+  \else
+    % \thischapterheading is the same as \thischapter except it is blank
+    % for the first page of a chapter.  This is to prevent the chapter name 
+    % being shown twice.
+    \def\thischapterheading{}%
+  \fi
+  %
+  % Common context changes for both heading and footing.
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \def\commmonheadfootline{\let\hsize=\txipagewidth \texinfochars}
+  %
+  \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}%
+  %
+  \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
+  \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}%
+  %
+  {%
+    % Set context for writing to auxiliary files like index files.
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \indexdummies         % don't expand commands in the output.
+    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
+               % the page break happens to be in the middle of an example.
+               % We don't want .vr (or whatever) entries like this:
+               % \entry{{\indexbackslash }acronym}{32}{\code {\acronym}}
+               % "\acronym" won't work when it's read back in;
+               % it needs to be
+               % {\code {{\backslashcurfont }acronym}
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingyyy.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 24pt
+        \unvbox\footlinebox
+      \fi
+      %
+    }%
+  }%
+  \global\topmarksavedfalse
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+% Main part of page, including any footnotes
+\def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1\relax \unvbox#1\relax
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+
+% Argument parsing
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+% For example, \def\foo{\parsearg\fooxxx}.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+  \def\argtorun{#2}%
+  \begingroup
+    \obeylines
+    \spaceisspace
+    #1%
+    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    \argremovecomment #1\comment\ArgTerm%
+  }%
+}
+
+% First remove any @comment, then any @c comment.  Also remove a @texinfoc
+% comment (see \scanmacro for details).  Pass the result on to \argcheckspaces.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argremovetexinfoc #1\texinfoc\ArgTerm}
+\def\argremovetexinfoc#1\texinfoc#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+%    @end itemize  @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+  \def\temp{#3}%
+  \ifx\temp\empty
+    % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+    \let\temp\finishparsearg
+  \else
+    \let\temp\argcheckspaces
+  \fi
+  % Put the space token in:
+  \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarly, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+
+% \parseargdef - define a command taking an argument on the line
+%
+% \parseargdef\foo{...}
+%	is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+\def\parseargdef#1{%
+  \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+  \def#2{\parsearg#1}%
+  \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+  \obeyspaces
+  \gdef\obeyedspace{ }
+
+  % Make each space character in the input produce a normal interword
+  % space in the output.  Don't allow a line break at this space, as this
+  % is used only in environments like @example, where each line of input
+  % should produce a line of output anyway.
+  %
+  \gdef\sepspaces{\obeyspaces\let =\tie}
+
+  % If an index command is used in an @example environment, any spaces
+  % therein should become regular spaces in the raw index file, not the
+  % expansion of \tie (\leavevmode \penalty \@M \ ).
+  \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex.  It's used like this:
+%
+%   \envdef\foo{...}
+%   \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo.  \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches.  The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as environments; they don't open a group.  (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At run-time, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+  \def\temp{#1}%
+  \ifx\thisenv\temp
+  \else
+    \badenverr
+  \fi
+}
+
+% Environment mismatch, #1 expected:
+\def\badenverr{%
+  \errhelp = \EMsimple
+  \errmessage{This command can appear only \inenvironment\temp,
+    not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+  \ifx#1\empty
+    outside of any environment%
+  \else
+    in environment \expandafter\string#1%
+  \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+  \if 1\csname iscond.#1\endcsname
+  \else
+    % The general wording of \badenverr may not be ideal.
+    \expandafter\checkenv\csname#1\endcsname
+    \csname E#1\endcsname
+    \endgroup
+  \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\unskip\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off  says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+  \def\temp{#1}%
+  \ifx\temp\onword \plainfrenchspacing
+  \else\ifx\temp\offword \plainnonfrenchspacing
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @frenchspacing option `\temp', must be on|off}%
+  \fi\fi
+}
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+  \ifnum\catcode`\^^M=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  \startsavinginserts
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it.  Thus, space below is not quite equal to space
+% above.  But it's pretty close.
+\def\Egroup{%
+    % To get correct interline space between the last line of the group
+    % and the first line afterwards, we have to propagate \prevdepth.
+    \endgraf % Not \par, as it may have been set to \lisppar.
+    \global\dimen1 = \prevdepth
+  \egroup           % End the \vtop.
+  \addgroupbox
+  \prevdepth = \dimen1
+  \checkinserts
+}
+
+\def\addgroupbox{
+  % \dimen0 is the vertical size of the group's box.
+  \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+  % \dimen2 is how much space is left on the page (more or less).
+  \dimen2 = \txipageheight   \advance\dimen2 by -\pagetotal
+  % if the group doesn't fit on the current page, and it's a big big
+  % group, force a page break.
+  \ifdim \dimen0 > \dimen2
+    \ifdim \pagetotal < \vfilllimit\txipageheight
+      \page
+    \fi
+  \fi
+  \box\groupbox
+}
+
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+\parseargdef\need{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+  \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.  Not documented, written for gawk manual.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @include FILE -- \input text of FILE.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+  \pushthisfilestack
+  \def\thisfile{#1}%
+  {%
+    \makevalueexpandable  % we want to expand any @value in FILE.
+    \turnoffactive        % and allow special characters in the expansion
+    \indexnofonts         % Allow `@@' and other weird things in file names.
+    \wlog{texinfo.tex: doing @include of #1^^J}%
+    \edef\temp{\noexpand\input #1 }%
+    %
+    % This trickery is to read FILE outside of a group, in case it makes
+    % definitions, etc.
+    \expandafter
+  }\temp
+  \popthisfilestack
+}
+\def\filenamecatcodes{%
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \catcode`-=\other
+  \catcode`\`=\other
+  \catcode`\'=\other
+}
+
+\def\pushthisfilestack{%
+  \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+  \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+  \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+  the stack of filenames is empty.}}
+%
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+  \ifhmode
+    \let\centersub\centerH
+  \else
+    \let\centersub\centerV
+  \fi
+  \centersub{\hfil \ignorespaces#1\unskip \hfil}%
+  \let\centersub\relax % don't let the definition persist, just in case
+}
+\def\centerH#1{{%
+  \hfil\break
+  \advance\hsize by -\leftskip
+  \advance\hsize by -\rightskip
+  \line{#1}%
+  \break
+}}
+%
+\newcount\centerpenalty
+\def\centerV#1{%
+  % The idea here is the same as in \startdefun, \cartouche, etc.: if
+  % @center is the first thing after a section heading, we need to wipe
+  % out the negative parskip inserted by \sectionheading, but still
+  % prevent a page break here.
+  \centerpenalty = \lastpenalty
+  \ifnum\centerpenalty>10000 \vskip\parskip \fi
+  \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi
+  \line{\kern\leftskip #1\kern\rightskip}%
+}
+
+% @sp n   outputs n lines of vertical space
+%
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+
+\def\c{\begingroup \catcode`\^^M=\active%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\cxxx}
+{\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}}
+%
+\let\comment\c
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent  {\restorefirstparagraphindent \indent}%
+  \gdef\noindent{\restorefirstparagraphindent \noindent}%
+  \global\everypar = {\kern -\parindent \restorefirstparagraphindent}%
+}
+%
+\gdef\restorefirstparagraphindent{%
+  \global\let\indent = \ptexindent
+  \global\let\noindent = \ptexnoindent
+  \global\everypar = {}%
+}
+
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% @setfilename INFO-FILENAME - ignored
+\let\setfilename=\comment
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newbox\boxB
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+%
+% For LuaTeX
+%
+
+\newif\iftxiuseunicodedestname
+\txiuseunicodedestnamefalse % For pdfTeX etc.
+
+\ifx\luatexversion\thisisundefined
+\else
+  % Use Unicode destination names
+  \txiuseunicodedestnametrue
+  % Escape PDF strings with converting UTF-16 from UTF-8
+  \begingroup
+    \catcode`\%=12
+    \directlua{
+      function UTF16oct(str)
+        tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377')
+        for c in string.utfvalues(str) do
+          if c < 0x10000 then
+            tex.sprint(
+              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o',
+                            (c / 256), (c % 256)))
+          else
+            c = c - 0x10000
+            local c_hi = c / 1024 + 0xd800
+            local c_lo = c % 1024 + 0xdc00
+            tex.sprint(
+              string.format(string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o' ..
+                            string.char(0x5c) .. string.char(0x25) .. '03o',
+                            (c_hi / 256), (c_hi % 256),
+                            (c_lo / 256), (c_lo % 256)))
+          end
+        end
+      end
+    }
+  \endgroup
+  \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}}
+  % Escape PDF strings without converting
+  \begingroup
+    \directlua{
+      function PDFescstr(str)
+        for c in string.bytes(str) do
+          if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then
+            tex.sprint(
+              string.format(string.char(0x5c) .. string.char(0x25) .. '03o',
+                            c))
+          else
+            tex.sprint(string.char(c))
+          end
+        end
+      end
+    }
+  \endgroup
+  \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}}
+  \ifnum\luatexversion>84
+    % For LuaTeX >= 0.85
+    \def\pdfdest{\pdfextension dest}
+    \let\pdfoutput\outputmode
+    \def\pdfliteral{\pdfextension literal}
+    \def\pdfcatalog{\pdfextension catalog}
+    \def\pdftexversion{\numexpr\pdffeedback version\relax}
+    \let\pdfximage\saveimageresource
+    \let\pdfrefximage\useimageresource
+    \let\pdflastximage\lastsavedimageresourceindex
+    \def\pdfendlink{\pdfextension endlink\relax}
+    \def\pdfoutline{\pdfextension outline}
+    \def\pdfstartlink{\pdfextension startlink}
+    \def\pdffontattr{\pdfextension fontattr}
+    \def\pdfobj{\pdfextension obj}
+    \def\pdflastobj{\numexpr\pdffeedback lastobj\relax}
+    \let\pdfpagewidth\pagewidth
+    \let\pdfpageheight\pageheight
+    \edef\pdfhorigin{\pdfvariable horigin}
+    \edef\pdfvorigin{\pdfvariable vorigin}
+  \fi
+\fi
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set).  So we test for \relax and 0 as well as being undefined.
+\ifx\pdfoutput\thisisundefined
+\else
+  \ifx\pdfoutput\relax
+  \else
+    \ifcase\pdfoutput
+    \else
+      \pdftrue
+    \fi
+  \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places.  Thus, we have to
+% double any backslashes.  Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e.  Not good.
+% 
+% See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and
+% related messages.  The final outcome is that it is up to the TeX user
+% to double the backslashes and otherwise make the string valid, so
+% that's what we do.  pdftex 1.30.0 (ca.2005) introduced a primitive to
+% do this reliably, so we use it.
+
+% #1 is a control sequence in which to do the replacements,
+% which we \xdef.
+\def\txiescapepdf#1{%
+  \ifx\pdfescapestring\thisisundefined
+    % No primitive available; should we give a warning or log?
+    % Many times it won't matter.
+    \xdef#1{#1}%
+  \else
+    % The expandable \pdfescapestring primitive escapes parentheses,
+    % backslashes, and other special chars.
+    \xdef#1{\pdfescapestring{#1}}%
+  \fi
+}
+\def\txiescapepdfutfsixteen#1{%
+  \ifx\pdfescapestrutfsixteen\thisisundefined
+    % No UTF-16 converting macro available.
+    \txiescapepdf{#1}%
+  \else
+    \xdef#1{\pdfescapestrutfsixteen{#1}}%
+  \fi
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found.  (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+  %
+  % Color manipulation macros using ideas from pdfcolor.tex,
+  % except using rgb instead of cmyk; the latter is said to render as a
+  % very dark gray on-screen and a very dark halftone in print, instead
+  % of actual black. The dark red here is dark enough to print on paper as
+  % nearly black, but still distinguishable for online viewing.  We use
+  % black by default, though.
+  \def\rgbDarkRed{0.50 0.09 0.12}
+  \def\rgbBlack{0 0 0}
+  %
+  % rg sets the color for filling (usual text, etc.);
+  % RG sets the color for stroking (thin rules, e.g., normal _'s).
+  \def\pdfsetcolor#1{\pdfliteral{#1 rg  #1 RG}}
+  %
+  % Set color, and create a mark which defines \thiscolor accordingly,
+  % so that \makeheadline knows which color to restore.
+  \def\setcolor#1{%
+    \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
+    \domark
+    \pdfsetcolor{#1}%
+  }
+  %
+  \def\maincolor{\rgbBlack}
+  \pdfsetcolor{\maincolor}
+  \edef\thiscolor{\maincolor}
+  \def\currentcolordefs{}
+  %
+  \def\makefootline{%
+    \baselineskip24pt
+    \line{\pdfsetcolor{\maincolor}\the\footline}%
+  }
+  %
+  \def\makeheadline{%
+    \vbox to 0pt{%
+      \vskip-22.5pt
+      \line{%
+        \vbox to8.5pt{}%
+        % Extract \thiscolor definition from the marks.
+        \getcolormarks
+        % Typeset the headline with \maincolor, then restore the color.
+        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+      }%
+      \vss
+    }%
+    \nointerlineskip
+  }
+  %
+  %
+  \pdfcatalog{/PageMode /UseOutlines}
+  %
+  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+  \def\dopdfimage#1#2#3{%
+    \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+    \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+    %
+    % pdftex (and the PDF format) support .pdf, .png, .jpg (among
+    % others).  Let's try in that order, PDF first since if
+    % someone has a scalable image, presumably better to use that than a
+    % bitmap.
+    \let\pdfimgext=\empty
+    \begingroup
+      \openin 1 #1.pdf \ifeof 1
+        \openin 1 #1.PDF \ifeof 1
+          \openin 1 #1.png \ifeof 1
+            \openin 1 #1.jpg \ifeof 1
+              \openin 1 #1.jpeg \ifeof 1
+                \openin 1 #1.JPG \ifeof 1
+                  \errhelp = \nopdfimagehelp
+                  \errmessage{Could not find image file #1 for pdf}%
+                \else \gdef\pdfimgext{JPG}%
+                \fi
+              \else \gdef\pdfimgext{jpeg}%
+              \fi
+            \else \gdef\pdfimgext{jpg}%
+            \fi
+          \else \gdef\pdfimgext{png}%
+          \fi
+        \else \gdef\pdfimgext{PDF}%
+        \fi
+      \else \gdef\pdfimgext{pdf}%
+      \fi
+      \closein 1
+    \endgroup
+    %
+    % without \immediate, ancient pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifdim \wd0 >0pt width \pdfimagewidth \fi
+      \ifdim \wd2 >0pt height \pdfimageheight \fi
+      \ifnum\pdftexversion<13
+         #1.\pdfimgext
+       \else
+         {#1.\pdfimgext}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  %
+  \def\setpdfdestname#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \indexnofonts
+    \makevalueexpandable
+    \turnoffactive
+    \iftxiuseunicodedestname
+      \ifx \declaredencoding \latone
+        % Pass through Latin-1 characters.
+        % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode.
+      \else
+        \ifx \declaredencoding \utfeight
+          % Pass through Unicode characters.
+        \else
+          % Use ASCII approximations in destination names.
+          \passthroughcharsfalse
+        \fi
+      \fi
+    \else
+      % Use ASCII approximations in destination names.
+      \passthroughcharsfalse
+    \fi
+    \def\pdfdestname{#1}%
+    \txiescapepdf\pdfdestname
+  }}
+  %
+  \def\setpdfoutlinetext#1{{%
+    \indexnofonts
+    \makevalueexpandable
+    \turnoffactive
+    \ifx \declaredencoding \latone
+      % The PDF format can use an extended form of Latin-1 in bookmark
+      % strings.  See Appendix D of the PDF Reference, Sixth Edition, for
+      % the "PDFDocEncoding".
+      \passthroughcharstrue
+      % Pass through Latin-1 characters.
+      %   LuaTeX: Convert to Unicode
+      %   pdfTeX: Use Latin-1 as PDFDocEncoding
+      \def\pdfoutlinetext{#1}%
+    \else
+      \ifx \declaredencoding \utfeight
+        \ifx\luatexversion\thisisundefined
+          % For pdfTeX  with UTF-8.
+          % TODO: the PDF format can use UTF-16 in bookmark strings,
+          % but the code for this isn't done yet.
+          % Use ASCII approximations.
+          \passthroughcharsfalse
+          \def\pdfoutlinetext{#1}%
+        \else
+          % For LuaTeX with UTF-8.
+          % Pass through Unicode characters for title texts.
+          \passthroughcharstrue
+          \def\pdfoutlinetext{#1}%
+        \fi
+      \else
+        % For non-Latin-1 or non-UTF-8 encodings.
+        % Use ASCII approximations.
+        \passthroughcharsfalse
+        \def\pdfoutlinetext{#1}%
+      \fi
+    \fi
+    % LuaTeX: Convert to UTF-16
+    % pdfTeX: Use Latin-1 as PDFDocEncoding
+    \txiescapepdfutfsixteen\pdfoutlinetext
+  }}
+  %
+  \def\pdfmkdest#1{%
+    \setpdfdestname{#1}%
+    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+  }
+  %
+  % used to mark target names; must be expandable.
+  \def\pdfmkpgn#1{#1}
+  %
+  % by default, use black for everything.
+  \def\urlcolor{\rgbBlack}
+  \def\linkcolor{\rgbBlack}
+  \def\endlink{\setcolor{\maincolor}\pdfendlink}
+  %
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by 1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  %
+  % #1 is the section text, which is what will be displayed in the
+  % outline by the pdf viewer.  #2 is the pdf expression for the number
+  % of subentries (or empty, for subsubsections).  #3 is the node text,
+  % which might be empty if this toc entry had no corresponding node.
+  % #4 is the page number
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    % Generate a link to the node text if that exists; else, use the
+    % page number.  We could generate a destination for the section
+    % text in the case where a section has no node, but it doesn't
+    % seem worth the trouble, since most documents are normally structured.
+    \setpdfoutlinetext{#1}
+    \setpdfdestname{#3}
+    \ifx\pdfdestname\empty
+      \def\pdfdestname{#4}%
+    \fi
+    %
+    \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      % Read toc silently, to get counts of subentries for \pdfoutline.
+      \def\partentry##1##2##3##4{}% ignore parts in the outlines
+      \def\numchapentry##1##2##3##4{%
+	\def\thischapnum{##2}%
+	\def\thissecnum{0}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsecentry##1##2##3##4{%
+	\advancenumber{chap\thischapnum}%
+	\def\thissecnum{##2}%
+	\def\thissubsecnum{0}%
+      }%
+      \def\numsubsecentry##1##2##3##4{%
+	\advancenumber{sec\thissecnum}%
+	\def\thissubsecnum{##2}%
+      }%
+      \def\numsubsubsecentry##1##2##3##4{%
+	\advancenumber{subsec\thissubsecnum}%
+      }%
+      \def\thischapnum{0}%
+      \def\thissecnum{0}%
+      \def\thissubsecnum{0}%
+      %
+      % use \def rather than \let here because we redefine \chapentry et
+      % al. a second time, below.
+      \def\appentry{\numchapentry}%
+      \def\appsecentry{\numsecentry}%
+      \def\appsubsecentry{\numsubsecentry}%
+      \def\appsubsubsecentry{\numsubsubsecentry}%
+      \def\unnchapentry{\numchapentry}%
+      \def\unnsecentry{\numsecentry}%
+      \def\unnsubsecentry{\numsubsecentry}%
+      \def\unnsubsubsecentry{\numsubsubsecentry}%
+      \readdatafile{toc}%
+      %
+      % Read toc second time, this time actually producing the outlines.
+      % The `-' means take the \expnumber as the absolute number of
+      % subentries, which we calculated on our first read of the .toc above.
+      %
+      % We use the node names as the destinations.
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{% count is always zero
+        \dopdfoutline{##1}{}{##3}{##4}}%
+      %
+      % PDF outlines are displayed using system fonts, instead of
+      % document fonts.  Therefore we cannot use special characters,
+      % since the encoding is unknown.  For example, the eogonek from
+      % Latin 2 (0xea) gets translated to a | character.  Info from
+      % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+      %
+      % TODO this right, we have to translate 8-bit characters to
+      % their "best" equivalent, based on the @documentencoding.  Too
+      % much work for too little return.  Just use the ASCII equivalents
+      % we use for the index sort strings.
+      % 
+      \indexnofonts
+      \setupdatafile
+      % We can have normal brace characters in the PDF outlines, unlike
+      % Texinfo index files.  So set that up.
+      \def\{{\lbracecharliteral}%
+      \def\}{\rbracecharliteral}%
+      \catcode`\\=\active \otherbackslash
+      \input \tocreadfilename
+    \endgroup
+  }
+  {\catcode`[=1 \catcode`]=2
+   \catcode`{=\other \catcode`}=\other
+   \gdef\lbracecharliteral[{]%
+   \gdef\rbracecharliteral[}]%
+  ]
+  %
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \addtokens{\filename}{\PP}%
+      \advance\filenamelength by 1
+    \fi
+    \nextsp}
+  \def\getfilename#1{%
+    \filenamelength=0
+    % If we don't expand the argument now, \skipspaces will get
+    % snagged on things like "@value{foo}".
+    \edef\temp{#1}%
+    \expandafter\skipspaces\temp|\relax
+  }
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  % make a live url in pdf output.
+  \def\pdfurl#1{%
+    \begingroup
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      %
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
+      % do we want to go so far as to use \indexnofonts instead of just
+      % special-casing \var here?
+      \def\var##1{##1}%
+      %
+      \leavevmode\setcolor{\urlcolor}%
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+    \endgroup}
+  % \pdfgettoks - Surround page numbers in #1 with @pdflink.  #1 may
+  % be a simple number, or a list of numbers in the case of an index
+  % entry.
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \setcolor{\linkcolor}#1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+  % non-pdf mode
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\setcolor = \gobble
+  \let\pdfsetcolor = \gobble
+  \let\pdfmakeoutlines = \relax
+\fi  % \ifx\pdfoutput
+
+%
+% For XeTeX
+%
+\ifx\XeTeXrevision\thisisundefined
+\else
+  %
+  % XeTeX version check
+  %
+  \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1
+    % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307.
+    % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941).
+    % For avoiding PDF destination name replacement, we use this special
+    % instead of xdvipdfmx's command line option `-C 0x0010'.
+    \special{dvipdfmx:config C 0x0010}
+    % XeTeX 0.99995+ comes with xdvipdfmx 20160307+.
+    % It can handle Unicode destination names for PDF.
+    \txiuseunicodedestnametrue
+  \else
+    % XeTeX < 0.99996 (TeX Live < 2016) cannot use the
+    % `dvipdfmx:config' special.
+    % So for avoiding PDF destination name replacement,
+    % xdvipdfmx's command line option `-C 0x0010' is necessary.
+    %
+    % XeTeX < 0.99995 can not handle Unicode destination names for PDF
+    % because xdvipdfmx 20150315 has a UTF-16 conversion issue.
+    % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
+    \txiuseunicodedestnamefalse
+  \fi
+  %
+  % Color support
+  %
+  \def\rgbDarkRed{0.50 0.09 0.12}
+  \def\rgbBlack{0 0 0}
+  %
+  \def\pdfsetcolor#1{\special{pdf:scolor [#1]}}
+  %
+  % Set color, and create a mark which defines \thiscolor accordingly,
+  % so that \makeheadline knows which color to restore.
+  \def\setcolor#1{%
+    \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}%
+    \domark
+    \pdfsetcolor{#1}%
+  }
+  %
+  \def\maincolor{\rgbBlack}
+  \pdfsetcolor{\maincolor}
+  \edef\thiscolor{\maincolor}
+  \def\currentcolordefs{}
+  %
+  \def\makefootline{%
+    \baselineskip24pt
+    \line{\pdfsetcolor{\maincolor}\the\footline}%
+  }
+  %
+  \def\makeheadline{%
+    \vbox to 0pt{%
+      \vskip-22.5pt
+      \line{%
+        \vbox to8.5pt{}%
+        % Extract \thiscolor definition from the marks.
+        \getcolormarks
+        % Typeset the headline with \maincolor, then restore the color.
+        \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+      }%
+      \vss
+    }%
+    \nointerlineskip
+  }
+  %
+  % PDF outline support
+  %
+  % Emulate pdfTeX primitive
+  \def\pdfdest name#1 xyz{%
+    \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}%
+  }
+  %
+  \def\setpdfdestname#1{{%
+    % We have to set dummies so commands such as @code, and characters
+    % such as \, aren't expanded when present in a section title.
+    \indexnofonts
+    \makevalueexpandable
+    \turnoffactive
+    \iftxiuseunicodedestname
+      % Pass through Unicode characters.
+    \else
+      % Use ASCII approximations in destination names.
+      \passthroughcharsfalse
+    \fi
+    \def\pdfdestname{#1}%
+    \txiescapepdf\pdfdestname
+  }}
+  %
+  \def\setpdfoutlinetext#1{{%
+    \turnoffactive
+    % Always use Unicode characters in title texts.
+    \def\pdfoutlinetext{#1}%
+    % For XeTeX, xdvipdfmx converts to UTF-16.
+    % So we do not convert.
+    \txiescapepdf\pdfoutlinetext
+  }}
+  %
+  \def\pdfmkdest#1{%
+    \setpdfdestname{#1}%
+    \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+  }
+  %
+  % by default, use black for everything.
+  \def\urlcolor{\rgbBlack}
+  \def\linkcolor{\rgbBlack}
+  \def\endlink{\setcolor{\maincolor}\pdfendlink}
+  %
+  \def\dopdfoutline#1#2#3#4{%
+    \setpdfoutlinetext{#1}
+    \setpdfdestname{#3}
+    \ifx\pdfdestname\empty
+      \def\pdfdestname{#4}%
+    \fi
+    %
+    \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A
+      << /S /GoTo /D (\pdfdestname) >> >> }%
+  }
+  %
+  \def\pdfmakeoutlines{%
+    \begingroup
+      %
+      % For XeTeX, counts of subentries are not necessary.
+      % Therefore, we read toc only once.
+      %
+      % We use node names as destinations.
+      \def\partentry##1##2##3##4{}% ignore parts in the outlines
+      \def\numchapentry##1##2##3##4{%
+        \dopdfoutline{##1}{1}{##3}{##4}}%
+      \def\numsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{2}{##3}{##4}}%
+      \def\numsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{3}{##3}{##4}}%
+      \def\numsubsubsecentry##1##2##3##4{%
+        \dopdfoutline{##1}{4}{##3}{##4}}%
+      %
+      \let\appentry\numchapentry%
+      \let\appsecentry\numsecentry%
+      \let\appsubsecentry\numsubsecentry%
+      \let\appsubsubsecentry\numsubsubsecentry%
+      \let\unnchapentry\numchapentry%
+      \let\unnsecentry\numsecentry%
+      \let\unnsubsecentry\numsubsecentry%
+      \let\unnsubsubsecentry\numsubsubsecentry%
+      %
+      % For XeTeX, xdvipdfmx converts strings to UTF-16.
+      % Therefore, the encoding and the language may not be considered.
+      %
+      \indexnofonts
+      \setupdatafile
+      % We can have normal brace characters in the PDF outlines, unlike
+      % Texinfo index files.  So set that up.
+      \def\{{\lbracecharliteral}%
+      \def\}{\rbracecharliteral}%
+      \catcode`\\=\active \otherbackslash
+      \input \tocreadfilename
+    \endgroup
+  }
+  {\catcode`[=1 \catcode`]=2
+   \catcode`{=\other \catcode`}=\other
+   \gdef\lbracecharliteral[{]%
+   \gdef\rbracecharliteral[}]%
+  ]
+
+  \special{pdf:docview << /PageMode /UseOutlines >> }
+  % ``\special{pdf:tounicode ...}'' is not necessary
+  % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it.
+  % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315,
+  % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings.
+  % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753).
+%
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \addtokens{\filename}{\PP}%
+      \advance\filenamelength by 1
+    \fi
+    \nextsp}
+  \def\getfilename#1{%
+    \filenamelength=0
+    % If we don't expand the argument now, \skipspaces will get
+    % snagged on things like "@value{foo}".
+    \edef\temp{#1}%
+    \expandafter\skipspaces\temp|\relax
+  }
+  % make a live url in pdf output.
+  \def\pdfurl#1{%
+    \begingroup
+      % it seems we really need yet another set of dummies; have not
+      % tried to figure out what each command should do in the context
+      % of @url.  for now, just make @/ a no-op, that's the only one
+      % people have actually reported a problem with.
+      %
+      \normalturnoffactive
+      \def\@{@}%
+      \let\/=\empty
+      \makevalueexpandable
+      % do we want to go so far as to use \indexnofonts instead of just
+      % special-casing \var here?
+      \def\var##1{##1}%
+      %
+      \leavevmode\setcolor{\urlcolor}%
+      \special{pdf:bann << /Border [0 0 0]
+        /Subtype /Link /A << /S /URI /URI (#1) >> >>}%
+    \endgroup}
+  \def\endlink{\setcolor{\maincolor}\special{pdf:eann}}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \special{pdf:bann << /Border [0 0 0]
+      /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}%
+    \setcolor{\linkcolor}#1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+%
+  %
+  % @image support
+  %
+  % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+  \def\doxeteximage#1#2#3{%
+    \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+    \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+    %
+    % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among
+    % others).  Let's try in that order, PDF first since if
+    % someone has a scalable image, presumably better to use that than a
+    % bitmap.
+    \let\xeteximgext=\empty
+    \begingroup
+      \openin 1 #1.pdf \ifeof 1
+        \openin 1 #1.PDF \ifeof 1
+          \openin 1 #1.png \ifeof 1
+            \openin 1 #1.jpg \ifeof 1
+              \openin 1 #1.jpeg \ifeof 1
+                \openin 1 #1.JPG \ifeof 1
+                  \errmessage{Could not find image file #1 for XeTeX}%
+                \else \gdef\xeteximgext{JPG}%
+                \fi
+              \else \gdef\xeteximgext{jpeg}%
+              \fi
+            \else \gdef\xeteximgext{jpg}%
+            \fi
+          \else \gdef\xeteximgext{png}%
+          \fi
+        \else \gdef\xeteximgext{PDF}%
+        \fi
+      \else \gdef\xeteximgext{pdf}%
+      \fi
+      \closein 1
+    \endgroup
+    %
+    \def\xetexpdfext{pdf}%
+    \ifx\xeteximgext\xetexpdfext
+      \XeTeXpdffile "#1".\xeteximgext ""
+    \else
+      \def\xetexpdfext{PDF}%
+      \ifx\xeteximgext\xetexpdfext
+        \XeTeXpdffile "#1".\xeteximgext ""
+      \else
+        \XeTeXpicfile "#1".\xeteximgext ""
+      \fi
+    \fi
+    \ifdim \wd0 >0pt width \xeteximagewidth \fi
+    \ifdim \wd2 >0pt height \xeteximageheight \fi \relax
+  }
+\fi
+
+
+%
+\message{fonts,}
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+% can get a sort of poor man's double spacing by redefining this.
+\def\baselinefactor{1}
+%
+\newdimen\textleading
+\def\setleading#1{%
+  \dimen0 = #1\relax
+  \normalbaselineskip = \baselinefactor\dimen0
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% PDF CMaps.  See also LaTeX's t1.cmap.
+%
+% do nothing with this by default.
+\expandafter\let\csname cmapOT1\endcsname\gobble
+\expandafter\let\csname cmapOT1IT\endcsname\gobble
+\expandafter\let\csname cmapOT1TT\endcsname\gobble
+
+% if we are producing pdf, and we have \pdffontattr, then define cmaps.
+% (\pdffontattr was introduced many years ago, but people still run
+% older pdftex's; it's easy to conditionalize, so we do.)
+\ifpdf \ifx\pdffontattr\thisisundefined \else
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1IT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+%
+% \cmapOT1TT
+  \begingroup
+    \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+    \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+    }\endgroup
+  \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+    \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+  }%
+\fi\fi
+
+
+% Set the font macro #1 to the font named \fontprefix#2.
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit).
+% Example:
+% #1 = \textrm
+% #2 = \rmshape
+% #3 = 10
+% #4 = \mainmagstep
+% #5 = OT1
+%
+\def\setfont#1#2#3#4#5{%
+  \font#1=\fontprefix#2#3 scaled #4
+  \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+%
+% (end of cmaps)
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\thisisundefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               % where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt.  (The default in Texinfo.)
+%
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1095}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defsl\slshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\ttfont=\deftt \let\bffont = \defbf
+\let\ttslfont=\defttsl \let\slfont=\defsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for math mode superscripts (7pt).
+\def\sevennominalsize{7pt}
+\setfont\sevenrm\rmshape{7}{1000}{OT1}
+\setfont\seventt\ttshape{10}{700}{OT1TT}
+\setfont\sevenbf\bfshape{10}{700}{OT1}
+\setfont\sevenit\itshape{7}{1000}{OT1IT}
+\setfont\sevensl\slshape{10}{700}{OT1}
+\setfont\sevensf\sfshape{10}{700}{OT1}
+\setfont\sevensc\scshape{10}{700}{OT1}
+\setfont\seventtsl\ttslshape{10}{700}{OT1TT}
+\font\seveni=cmmi7
+\font\sevensy=cmsy7
+\def\sevenecsize{0700}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+\def\chapecsize{1728}
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+\def\sececsize{1440}
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+\def\ssececsize{1200}
+
+% Reduced fonts for @acronym in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+\def\reducedecsize{1000}
+
+\textleading = 13.2pt % line spacing for 11pt CM
+\textfonts            % reset the current fonts
+\rm
+} % end of 11pt text font size definitions, \definetextfontsizexi
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit.  This is for the GNU
+% Press printing of the Emacs 22 manual.  Maybe other manuals in the
+% future.  Used with @smallbook, which sets the leading to 12pt.
+%
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1000}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defsl\slshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\ttfont=\deftt \let\bffont = \defbf
+\let\slfont=\defsl \let\ttslfont=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for math mode superscripts (7pt).
+\def\sevennominalsize{7pt}
+\setfont\sevenrm\rmshape{7}{1000}{OT1}
+\setfont\seventt\ttshape{10}{700}{OT1TT}
+\setfont\sevenbf\bfshape{10}{700}{OT1}
+\setfont\sevenit\itshape{7}{1000}{OT1IT}
+\setfont\sevensl\slshape{10}{700}{OT1}
+\setfont\sevensf\sfshape{10}{700}{OT1}
+\setfont\sevensc\scshape{10}{700}{OT1}
+\setfont\seventtsl\ttslshape{10}{700}{OT1TT}
+\font\seveni=cmmi7
+\font\sevensy=cmsy7
+\def\sevenecsize{0700}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\titleecsize{2074}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+\def\chapecsize{1440}
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12
+\font\secsy=cmsy10 scaled \magstep1
+\def\sececsize{1200}
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+\def\ssececsize{1000}
+
+% Reduced fonts for @acronym in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+\def\reducedecsize{0900}
+
+\divide\parskip by 2  % reduce space between paragraphs
+\textleading = 12pt   % line spacing for 10pt CM
+\textfonts            % reset the current fonts
+\rm
+} % end of 10pt text font size definitions, \definetextfontsizex
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1}  % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+
+% We provide the user-level command
+%   @fonttextsize 10
+% (or 11) to redefine the text font size.  pt is assumed.
+%
+\def\xiword{11}
+\def\xword{10}
+\def\xwordpt{10pt}
+%
+\parseargdef\fonttextsize{%
+  \def\textsizearg{#1}%
+  %\wlog{doing @fonttextsize \textsizearg}%
+  %
+  % Set \globaldefs so that documents can use this inside @tex, since
+  % makeinfo 4.8 does not support it, but we need it nonetheless.
+  %
+ \begingroup \globaldefs=1
+  \ifx\textsizearg\xword \definetextfontsizex
+  \else \ifx\textsizearg\xiword \definetextfontsizexi
+  \else
+    \errhelp=\EMsimple
+    \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+  \fi\fi
+ \endgroup
+}
+
+%
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+  \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+  \csname #1font\endcsname  % change the current font
+}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.
+% We don't bother to reset \scriptscriptfont; awaiting user need.
+%
+\def\resetmathfonts{%
+  \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont
+  \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont
+  \textfont\ttfam=\ttfont \textfont\sffam=\sffont
+  %
+  % Fonts for superscript.  Note that the 7pt fonts are used regardless
+  % of the current font size.
+  \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy
+  \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl
+  \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt
+  \scriptfont\sffam=\sevensf
+}
+
+%
+
+% The font-changing commands (all called \...fonts) redefine the meanings
+% of \STYLEfont, instead of just \STYLE.  We do this because \STYLE needs
+% to also set the current \fam for math mode.  Our \STYLE (e.g., \rm)
+% commands hardwire \STYLEfont to set the current font.
+%
+% The fonts used for \ifont are for "math italics"  (\itfont is for italics
+% in regular text).  \syfont is also used in math mode only.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower).  These relative commands are used
+% in, e.g., the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+
+\def\assignfonts#1{%
+  \expandafter\let\expandafter\rmfont\csname #1rm\endcsname
+  \expandafter\let\expandafter\itfont\csname #1it\endcsname
+  \expandafter\let\expandafter\slfont\csname #1sl\endcsname
+  \expandafter\let\expandafter\bffont\csname #1bf\endcsname
+  \expandafter\let\expandafter\ttfont\csname #1tt\endcsname
+  \expandafter\let\expandafter\smallcaps\csname #1sc\endcsname
+  \expandafter\let\expandafter\sffont  \csname #1sf\endcsname
+  \expandafter\let\expandafter\ifont   \csname #1i\endcsname
+  \expandafter\let\expandafter\syfont  \csname #1sy\endcsname
+  \expandafter\let\expandafter\ttslfont\csname #1ttsl\endcsname
+}
+
+\newif\ifrmisbold
+
+% Select smaller font size with the current style.  Used to change font size
+% in, e.g., the LaTeX logo and acronyms.  If we are using bold fonts for
+% normal roman text, also use bold fonts for roman text in the smaller size.
+\def\switchtolllsize{%
+   \expandafter\assignfonts\expandafter{\lllsize}%
+   \ifrmisbold
+     \let\rmfont\bffont
+   \fi
+   \csname\curfontstyle\endcsname
+}%
+
+\def\switchtolsize{%
+   \expandafter\assignfonts\expandafter{\lsize}%
+   \ifrmisbold
+     \let\rmfont\bffont
+   \fi
+   \csname\curfontstyle\endcsname
+}%
+
+\def\definefontsetatsize#1#2#3#4#5{%
+\expandafter\def\csname #1fonts\endcsname{%
+  \def\curfontsize{#1}%
+  \def\lsize{#2}\def\lllsize{#3}%
+  \csname rmisbold#5\endcsname
+  \assignfonts{#1}%
+  \resetmathfonts
+  \setleading{#4}%
+}}
+
+\definefontsetatsize{text}   {reduced}{smaller}{\textleading}{false}
+\definefontsetatsize{title}  {chap}   {subsec} {27pt}  {true}
+\definefontsetatsize{chap}   {sec}    {text}   {19pt}  {true}
+\definefontsetatsize{sec}    {subsec} {reduced}{17pt}  {true}
+\definefontsetatsize{ssec}   {text}   {small}  {15pt}  {true}
+\definefontsetatsize{reduced}{small}  {smaller}{10.5pt}{false}
+\definefontsetatsize{small}  {smaller}{smaller}{10.5pt}{false}
+\definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false}
+
+\def\titlefont#1{{\titlefonts\rm #1}}
+\let\subsecfonts = \ssecfonts
+\let\subsubsecfonts = \ssecfonts
+
+% Define these just so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+% --karl, 24jan03.
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+
+\message{markup,}
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
+% define and register \INITMACRO to be called on markup style changes.
+% \INITMACRO can check \currentmarkupstyle for the innermost
+% style.
+
+\let\currentmarkupstyle\empty
+
+\def\setupmarkupstyle#1{%
+  \def\currentmarkupstyle{#1}%
+  \markupstylesetup
+}
+
+\let\markupstylesetup\empty
+
+\def\defmarkupstylesetup#1{%
+  \expandafter\def\expandafter\markupstylesetup
+    \expandafter{\markupstylesetup #1}%
+  \def#1%
+}
+
+% Markup style setup for left and right quotes.
+\defmarkupstylesetup\markupsetuplq{%
+  \expandafter\let\expandafter \temp
+    \csname markupsetuplq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
+}
+
+\defmarkupstylesetup\markupsetuprq{%
+  \expandafter\let\expandafter \temp
+    \csname markupsetuprq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
+}
+
+{
+\catcode`\'=\active
+\catcode`\`=\active
+
+\gdef\markupsetuplqdefault{\let`\lq}
+\gdef\markupsetuprqdefault{\let'\rq}
+
+\gdef\markupsetcodequoteleft{\let`\codequoteleft}
+\gdef\markupsetcodequoteright{\let'\codequoteright}
+}
+
+\let\markupsetuplqcode \markupsetcodequoteleft
+\let\markupsetuprqcode \markupsetcodequoteright
+%
+\let\markupsetuplqexample \markupsetcodequoteleft
+\let\markupsetuprqexample \markupsetcodequoteright
+%
+\let\markupsetuplqkbd     \markupsetcodequoteleft
+\let\markupsetuprqkbd     \markupsetcodequoteright
+%
+\let\markupsetuplqsamp \markupsetcodequoteleft
+\let\markupsetuprqsamp \markupsetcodequoteright
+%
+\let\markupsetuplqverb \markupsetcodequoteleft
+\let\markupsetuprqverb \markupsetcodequoteright
+%
+\let\markupsetuplqverbatim \markupsetcodequoteleft
+\let\markupsetuprqverbatim \markupsetcodequoteright
+
+% Allow an option to not use regular directed right quote/apostrophe
+% (char 0x27), but instead the undirected quote from cmtt (char 0x0d).
+% The undirected quote is ugly, so don't make it the default, but it
+% works for pasting with more pdf viewers (at least evince), the
+% lilypond developers report.  xpdf does work with the regular 0x27.
+%
+\def\codequoteright{%
+  \ifmonospace
+    \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+      \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+        '%
+      \else \char'15 \fi
+    \else \char'15 \fi
+   \else
+     '%
+   \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+%
+\def\codequoteleft{%
+  \ifmonospace
+    \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+      \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+        % [Knuth] pp. 380,381,391
+        % \relax disables Spanish ligatures ?` and !` of \tt font.
+        \relax`%
+      \else \char'22 \fi
+    \else \char'22 \fi
+   \else
+     \relax`%
+   \fi
+}
+
+% Commands to set the quote options.
+% 
+\parseargdef\codequoteundirected{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxicodequoteundirected\endcsname
+      = t%
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxicodequoteundirected\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}%
+  \fi\fi
+}
+%
+\parseargdef\codequotebacktick{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxicodequotebacktick\endcsname
+      = t%
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxicodequotebacktick\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}%
+  \fi\fi
+}
+
+% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
+\def\noligaturesquoteleft{\relax\lq}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Font commands.
+
+% #1 is the font command (\sl or \it), #2 is the text to slant.
+% If we are in a monospaced environment, however, 1) always use \ttsl,
+% and 2) do not add an italic correction.
+\def\dosmartslant#1#2{%
+  \ifusingtt 
+    {{\ttsl #2}\let\next=\relax}%
+    {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}%
+  \next
+}
+\def\smartslanted{\dosmartslant\sl}
+\def\smartitalic{\dosmartslant\it}
+
+% Output an italic correction unless \next (presumed to be the following
+% character) is such as not to need one.
+\def\smartitaliccorrection{%
+  \ifx\next,%
+  \else\ifx\next-%
+  \else\ifx\next.%
+  \else\ifx\next\.%
+  \else\ifx\next\comma%
+  \else\ptexslash
+  \fi\fi\fi\fi\fi
+  \aftersmartic
+}
+
+% Unconditional use \ttsl, and no ic.  @var is set to this for defuns.
+\def\ttslanted#1{{\ttsl #1}}
+
+% @cite is like \smartslanted except unconditionally use \sl.  We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection}
+
+\def\aftersmartic{}
+\def\var#1{%
+  \let\saveaftersmartic = \aftersmartic
+  \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}%
+  \smartslanted{#1}%
+}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @b, explicit bold.  Also @strong.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+  \def\plainfrenchspacing{%
+    \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m
+    \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m
+    \def\endofsentencespacefactor{1000}% for @. and friends
+  }
+  \def\plainnonfrenchspacing{%
+    \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+    \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+    \def\endofsentencespacefactor{3000}% for @. and friends
+  }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+% @t, explicit typewriter.
+\def\t#1{%
+  {\tt \rawbackslash \plainfrenchspacing #1}%
+  \null
+}
+
+% @samp.
+\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
+
+% @indicateurl is \samp, that is, with quotes.
+\let\indicateurl=\samp
+
+% @code (and similar) prints in typewriter, but with spaces the same
+% size as normal in the surrounding text, without hyphenation, etc.
+% This is a subroutine for that.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \plainfrenchspacing
+    #1%
+  }%
+  \null % reset spacefactor to 1000
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% (But see \codedashfinish below.)
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+%
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash. -- rms.
+{
+  \catcode`\-=\active \catcode`\_=\active
+  \catcode`\'=\active \catcode`\`=\active
+  \global\let'=\rq \global\let`=\lq  % default definitions
+  %
+  \global\def\code{\begingroup
+    \setupmarkupstyle{code}%
+    % The following should really be moved into \setupmarkupstyle handlers.
+    \catcode\dashChar=\active  \catcode\underChar=\active
+    \ifallowcodebreaks
+     \let-\codedash
+     \let_\codeunder
+    \else
+     \let-\normaldash
+     \let_\realunder
+    \fi
+    % Given -foo (with a single dash), we do not want to allow a break
+    % after the hyphen.
+    \global\let\codedashprev=\codedash
+    %
+    \codex
+  }
+  %
+  \gdef\codedash{\futurelet\next\codedashfinish}
+  \gdef\codedashfinish{%
+    \normaldash % always output the dash character itself.
+    % 
+    % Now, output a discretionary to allow a line break, unless
+    % (a) the next character is a -, or
+    % (b) the preceding character is a -.
+    % E.g., given --posix, we do not want to allow a break after either -.
+    % Given --foo-bar, we do want to allow a break between the - and the b.
+    \ifx\next\codedash \else
+      \ifx\codedashprev\codedash 
+      \else \discretionary{}{}{}\fi
+    \fi
+    % we need the space after the = for the case when \next itself is a
+    % space token; it would get swallowed otherwise.  As in @code{- a}.
+    \global\let\codedashprev= \next
+  }
+}
+\def\normaldash{-}
+%
+\def\codex #1{\tclose{#1}\endgroup}
+
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__.  This is bad.
+% @allowcodebreaks provides a document-level way to turn breaking at -
+% and _ on and off.
+%
+\newif\ifallowcodebreaks  \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\keywordtrue
+    \allowcodebreakstrue
+  \else\ifx\txiarg\keywordfalse
+    \allowcodebreaksfalse
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}%
+  \fi\fi
+}
+
+% For @command, @env, @file, @option quotes seem unnecessary,
+% so use \code rather than \samp.
+\let\command=\code
+\let\env=\code
+\let\file=\code
+\let\option=\code
+
+% @uref (abbreviation for `urlref') aka @url takes an optional
+% (comma-separated) second argument specifying the text to display and
+% an optional third arg as text to display instead of (rather than in
+% addition to) the url itself.  First (mandatory) arg is the url.
+
+% TeX-only option to allow changing PDF output to show only the second
+% arg (if given), and not the url (which is then just the link target).
+\newif\ifurefurlonlylink
+
+% The main macro is \urefbreak, which allows breaking at expected
+% places within the url.  (There used to be another version, which
+% didn't support automatic breaking.)
+\def\urefbreak{\begingroup \urefcatcodes \dourefbreak}
+\let\uref=\urefbreak
+%
+\def\dourefbreak#1{\urefbreakfinish #1,,,\finish}
+\def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}% look for second arg
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        % For pdfTeX and LuaTeX
+        \ifurefurlonlylink
+          % PDF plus option to not display url, show just arg
+          \unhbox0             
+        \else
+          % PDF, normally display both arg and url for consistency,
+          % visibility, if the pdf is eventually used to print, etc.
+          \unhbox0\ (\urefcode{#1})%
+        \fi
+      \else
+        \ifx\XeTeXrevision\thisisundefined
+          \unhbox0\ (\urefcode{#1})% DVI, always show arg and url
+        \else
+          % For XeTeX
+          \ifurefurlonlylink
+            % PDF plus option to not display url, show just arg
+            \unhbox0             
+          \else
+            % PDF, normally display both arg and url for consistency,
+            % visibility, if the pdf is eventually used to print, etc.
+            \unhbox0\ (\urefcode{#1})%
+          \fi
+        \fi
+      \fi
+    \else
+      \urefcode{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% Allow line breaks around only a few characters (only).
+\def\urefcatcodes{%
+  \catcode`\&=\active \catcode`\.=\active
+  \catcode`\#=\active \catcode`\?=\active
+  \catcode`\/=\active
+}
+{
+  \urefcatcodes
+  %
+  \global\def\urefcode{\begingroup
+    \setupmarkupstyle{code}%
+    \urefcatcodes
+    \let&\urefcodeamp
+    \let.\urefcodedot
+    \let#\urefcodehash
+    \let?\urefcodequest
+    \let/\urefcodeslash
+    \codex
+  }
+  %
+  % By default, they are just regular characters.
+  \global\def&{\normalamp}
+  \global\def.{\normaldot}
+  \global\def#{\normalhash}
+  \global\def?{\normalquest}
+  \global\def/{\normalslash}
+}
+
+\def\urefcodeamp{\urefprebreak \&\urefpostbreak}
+\def\urefcodedot{\urefprebreak .\urefpostbreak}
+\def\urefcodehash{\urefprebreak \#\urefpostbreak}
+\def\urefcodequest{\urefprebreak ?\urefpostbreak}
+\def\urefcodeslash{\futurelet\next\urefcodeslashfinish}
+{
+  \catcode`\/=\active
+  \global\def\urefcodeslashfinish{%
+    \urefprebreak \slashChar
+    % Allow line break only after the final / in a sequence of
+    % slashes, to avoid line break between the slashes in http://.
+    \ifx\next/\else \urefpostbreak \fi
+  }
+}
+
+% By default we'll break after the special characters, but some people like to 
+% break before the special chars, so allow that.  Also allow no breaking at 
+% all, for manual control.
+% 
+\parseargdef\urefbreakstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\wordnone
+    \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak}
+  \else\ifx\txiarg\wordbefore
+    \def\urefprebreak{\urefallowbreak}\def\urefpostbreak{\nobreak}
+  \else\ifx\txiarg\wordafter
+    \def\urefprebreak{\nobreak}\def\urefpostbreak{\urefallowbreak}
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @urefbreakstyle setting `\txiarg'}%
+  \fi\fi\fi
+}
+\def\wordafter{after}
+\def\wordbefore{before}
+\def\wordnone{none}
+
+% Allow a ragged right output to aid breaking long URL's.  Putting stretch in 
+% between characters of the URL doesn't look good.
+\def\urefallowbreak{%
+  \hskip 0pt plus 1fil\relax
+  \allowbreak
+  \hskip 0pt plus -1fil\relax
+}
+
+\urefbreakstyle after
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \ifx\XeTeXrevision\thisisundefined
+    \let\email=\uref
+  \else
+    \def\email#1{\doemail#1,,\finish}
+    \def\doemail#1,#2,#3\finish{\begingroup
+      \unsepspaces
+      \pdfurl{mailto:#1}%
+      \setbox0 = \hbox{\ignorespaces #2}%
+      \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+      \endlink
+    \endgroup}
+  \fi
+\fi
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+  \def\txiarg{#1}%
+  \ifx\txiarg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\txiarg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\txiarg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle setting `\txiarg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct'.
+\kbdinputstyle distinct
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+\def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}}
+
+\def\xkey{\key}
+\def\kbdsub#1#2#3\par{%
+  \def\one{#1}\def\three{#3}\def\threex{??}%
+  \ifx\one\xkey\ifx\threex\three \key{#2}%
+  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+  \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+}
+
+% definition of @key that produces a lozenge.  Doesn't adjust to text size.
+%\setfont\keyrm\rmshape{8}{1000}{OT1}
+%\font\keysy=cmsy9
+%\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+%  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+%    \vbox{\hrule\kern-0.4pt
+%     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+%    \kern-0.4pt\hrule}%
+%  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+
+% definition of @key with no lozenge.  If the current font is already
+% monospace, don't change it; that way, we respect @kbdinputstyle.  But
+% if it isn't monospace, then use \tt.
+%
+\def\key#1{{\setupmarkupstyle{key}%
+  \nohyphenation
+  \ifmonospace\else\tt\fi
+  #1}\null}
+
+% @clicksequence{File @click{} Open ...}
+\def\clicksequence#1{\begingroup #1\endgroup}
+
+% @clickstyle @arrow   (by default)
+\parseargdef\clickstyle{\def\click{#1}}
+\def\click{\arrow}
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+  {\switchtolsize #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+  \null % reset \spacefactor=1000
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+  {\plainfrenchspacing #1}%
+  \def\temp{#2}%
+  \ifx\temp\empty \else
+    \space ({\unsepspaces \ignorespaces \temp \unskip})%
+  \fi
+  \null % reset \spacefactor=1000
+}
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+  \catcode`\_ = \active
+  \gdef\mathunderscore{%
+    \catcode`\_=\active
+    \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+  }
+}
+% Another complication: we want \\ (and @\) to output a math (or tt) \.
+% FYI, plain.tex uses \\ as a temporary control sequence (for no
+% particular reason), but this is not advertised and we don't care.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \ifmmode\else % only go into math if not in math mode already
+    \tex
+    \mathunderscore
+    \let\\ = \mathbackslash
+    \mathactive
+    % make the texinfo accent commands work in math mode
+    \let\"=\ddot
+    \let\'=\acute
+    \let\==\bar
+    \let\^=\hat
+    \let\`=\grave
+    \let\u=\breve
+    \let\v=\check
+    \let\~=\tilde
+    \let\dotaccent=\dot
+    % have to provide another name for sup operator
+    \let\mathopsup=\sup
+  $\expandafter\finishmath\fi
+}
+\def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \catcode`' = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+    \let' = \ptexquoteright
+  }
+}
+
+% for @sub and @sup, if in math mode, just do a normal sub/superscript.
+% If in text, use math to place as sub/superscript, but switch
+% into text mode, with smaller fonts.  This is a different font than the
+% one used for real math sub/superscripts (8pt vs. 7pt), but let's not
+% fix it (significant additions to font machinery) until someone notices.
+%
+\def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi}
+\def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}%
+%
+\def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi}
+\def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}%
+
+% @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}.
+% Ignore unless FMTNAME == tex; then it is like @iftex and @tex,
+% except specified as a normal braced arg, so no newlines to worry about.
+% 
+\def\outfmtnametex{tex}
+%
+\long\def\inlinefmt#1{\doinlinefmt #1,\finish}
+\long\def\doinlinefmt#1,#2,\finish{%
+  \def\inlinefmtname{#1}%
+  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi
+}
+% 
+% @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if
+% FMTNAME is tex, else ELSE-TEXT.
+\long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish}
+\long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{%
+  \def\inlinefmtname{#1}%
+  \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi
+}
+%
+% For raw, must switch into @tex before parsing the argument, to avoid
+% setting catcodes prematurely.  Doing it this way means that, for
+% example, @inlineraw{html, foo{bar} gets a parse error instead of being
+% ignored.  But this isn't important because if people want a literal
+% *right* brace they would have to use a command anyway, so they may as
+% well use a command to get a left brace too.  We could re-use the
+% delimiter character idea from \verb, but it seems like overkill.
+% 
+\long\def\inlineraw{\tex \doinlineraw}
+\long\def\doinlineraw#1{\doinlinerawtwo #1,\finish}
+\def\doinlinerawtwo#1,#2,\finish{%
+  \def\inlinerawname{#1}%
+  \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi
+  \endgroup % close group opened by \tex.
+}
+
+% @inlineifset{VAR, TEXT} expands TEXT if VAR is @set.
+%
+\long\def\inlineifset#1{\doinlineifset #1,\finish}
+\long\def\doinlineifset#1,#2,\finish{%
+  \def\inlinevarname{#1}%
+  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax
+  \else\ignorespaces#2\fi
+}
+
+% @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set.
+%
+\long\def\inlineifclear#1{\doinlineifclear #1,\finish}
+\long\def\doinlineifclear#1,#2,\finish{%
+  \def\inlinevarname{#1}%
+  \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi
+}
+
+
+\message{glyphs,}
+% and logos.
+
+% @@ prints an @, as does @atchar{}.
+\def\@{\char64 }
+\let\atchar=\@
+
+% @{ @} @lbracechar{} @rbracechar{} all generate brace characters.
+\def\lbracechar{{\ifmonospace\char123\else\ensuremath\lbrace\fi}}
+\def\rbracechar{{\ifmonospace\char125\else\ensuremath\rbrace\fi}}
+\let\{=\lbracechar
+\let\}=\rbracechar
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \ptexc
+\let\dotaccent = \ptexdot
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \ptext
+\let\ubaraccent = \ptexb
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
+  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence.  (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo.  Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+  L\kern-.36em
+  {\setbox0=\hbox{T}%
+   \vbox to \ht0{\hbox{%
+     \ifx\textnominalsize\xwordpt
+       % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX.
+       % Revert to plain's \scriptsize, which is 7pt.
+       \count255=\the\fam $\fam\count255 \scriptstyle A$%
+     \else
+       % For 11pt, we can use our lllsize.
+       \switchtolllsize A%
+     \fi
+     }%
+     \vss
+  }}%
+  \kern-.15em
+  \TeX
+}
+
+% Some math mode symbols.  Define \ensuremath to switch into math mode
+% unless we are already there.  Expansion tricks may not be needed here,
+% but safer, and can't hurt.
+\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
+\def\ensuredmath#1{$\relax#1$}
+%
+\def\bullet{\ensuremath\ptexbullet}
+\def\geq{\ensuremath\ge}
+\def\leq{\ensuremath\le}
+\def\minus{\ensuremath-}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em.  So do
+% whichever is larger.
+%
+\def\dots{%
+  \leavevmode
+  \setbox0=\hbox{...}% get width of three periods
+  \ifdim\wd0 > 1.5em
+    \dimen0 = \wd0
+  \else
+    \dimen0 = 1.5em
+  \fi
+  \hbox to \dimen0{%
+    \hskip 0pt plus.25fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus1fil
+    .\hskip 0pt plus.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \dots
+  \spacefactor=\endofsentencespacefactor
+}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, they should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
+\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\ttfont \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{%
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that.  The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math.  Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+  % We set the font at each command, rather than predefining it in
+  % \textfonts and the other font-switching commands, so that
+  % installations which never need the symbol don't have to have the
+  % font installed.
+  %
+  % There is only one designed size (nominal 10pt), so we always scale
+  % that to the current nominal size.
+  %
+  % By the way, simply using "at 1em" works for cmr10 and the like, but
+  % does not work for cmbx10 and other extended/shrunken fonts.
+  %
+  \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+  %
+  \ifx\curfontstyle\bfstylename
+    % bold:
+    \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+  \else
+    % regular:
+    \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+  \fi
+  \thiseurofont
+}
+
+% Glyphs from the EC fonts.  We don't use \let for the aliases, because
+% sometimes we redefine the original macro, and the alias should reflect
+% the redefinition.
+%
+% Use LaTeX names for the Icelandic letters.
+\def\DH{{\ecfont \char"D0}} % Eth
+\def\dh{{\ecfont \char"F0}} % eth
+\def\TH{{\ecfont \char"DE}} % Thorn
+\def\th{{\ecfont \char"FE}} % thorn
+%
+\def\guillemetleft{{\ecfont \char"13}}
+\def\guillemotleft{\guillemetleft}
+\def\guillemetright{{\ecfont \char"14}}
+\def\guillemotright{\guillemetright}
+\def\guilsinglleft{{\ecfont \char"0E}}
+\def\guilsinglright{{\ecfont \char"0F}}
+\def\quotedblbase{{\ecfont \char"12}}
+\def\quotesinglbase{{\ecfont \char"0D}}
+%
+% This positioning is not perfect (see the ogonek LaTeX package), but
+% we have the precomposed glyphs for the most common cases.  We put the
+% tests to use those glyphs in the single \ogonek macro so we have fewer
+% dummy definitions to worry about for index entries, etc.
+%
+% ogonek is also used with other letters in Lithuanian (IOU), but using
+% the precomposed glyphs for those is not so easy since they aren't in
+% the same EC font.
+\def\ogonek#1{{%
+  \def\temp{#1}%
+  \ifx\temp\macrocharA\Aogonek
+  \else\ifx\temp\macrochara\aogonek
+  \else\ifx\temp\macrocharE\Eogonek
+  \else\ifx\temp\macrochare\eogonek
+  \else
+    \ecfont \setbox0=\hbox{#1}%
+    \ifdim\ht0=1ex\accent"0C #1%
+    \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
+    \fi
+  \fi\fi\fi\fi
+  }%
+}
+\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
+\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
+\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
+\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
+%
+% Use the European Computer Modern fonts (cm-super in outline format)
+% for non-CM glyphs.  That is ec* for regular text and tc* for the text
+% companion symbols (LaTeX TS1 encoding).  Both are part of the ec
+% package and follow the same conventions.
+% 
+\def\ecfont{\etcfont{e}}
+\def\tcfont{\etcfont{t}}
+%
+\def\etcfont#1{%
+  % We can't distinguish serif/sans and italic/slanted, but this
+  % is used for crude hacks anyway (like adding French and German
+  % quotes to documents typeset with CM, where we lose kerning), so
+  % hopefully nobody will notice/care.
+  \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
+  \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
+  \ifmonospace
+    % typewriter:
+    \font\thisecfont = #1ctt\ecsize \space at \nominalsize
+  \else
+    \ifx\curfontstyle\bfstylename
+      % bold:
+      \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize
+    \else
+      % regular:
+      \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+    \fi
+  \fi
+  \thisecfont
+}
+
+% @registeredsymbol - R in a circle.  The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{\switchtolllsize R}%
+               \hfil\crcr\Orb}}%
+    }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+%  Textures 1.7.7 (preloaded format=plain 93.10.14)  (68K)  16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\thisisundefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+% Quotes.
+\chardef\quotedblleft="5C
+\chardef\quotedblright=`\"
+\chardef\quoteleft=`\`
+\chardef\quoteright=`\'
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% @setcontentsaftertitlepage used to do an implicit @contents or
+% @shortcontents after @end titlepage, but it is now obsolete.
+\def\setcontentsaftertitlepage{%
+  \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo
+              command; move your @contents command if you want the contents
+              after the title page.}}%
+\def\setshortcontentsaftertitlepage{%
+  \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo
+              command; move your @shortcontents and @contents commands if you 
+              want the contents after the title page.}}%
+
+\parseargdef\shorttitlepage{%
+  \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+  \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+  % Open one extra group, as we want to close it in the middle of \Etitlepage.
+  \begingroup
+    \parindent=0pt \textfonts
+    % Leave some space at the very top of the page.
+    \vglue\titlepagetopglue
+    % No rule at page bottom unless we print one at the top with @title.
+    \finishedtitlepagetrue
+    %
+    % Most title ``pages'' are actually two pages long, with space
+    % at the top of the second.  We don't want the ragged left on the second.
+    \let\oldpage = \page
+    \def\page{%
+      \iffinishedtitlepage\else
+	 \finishtitlepage
+      \fi
+      \let\page = \oldpage
+      \page
+      \null
+    }%
+}
+
+\def\Etitlepage{%
+    \iffinishedtitlepage\else
+	\finishtitlepage
+    \fi
+    % It is important to do the page break before ending the group,
+    % because the headline and footline are only empty inside the group.
+    % If we use the new definition of \page, we always get a blank page
+    % after the title page, which we certainly don't want.
+    \oldpage
+  \endgroup
+  %
+  % Need this before the \...aftertitlepage checks so that if they are
+  % in effect the toc pages will come out with page numbers.
+  \HEADINGSon
+}
+
+\def\finishtitlepage{%
+  \vskip4pt \hrule height 2pt width \hsize
+  \vskip\titlepagebottomglue
+  \finishedtitlepagetrue
+}
+
+% Settings used for typesetting titles: no hyphenation, no indentation,
+% don't worry much about spacing, ragged right.  This should be used
+% inside a \vbox, and fonts need to be set appropriately first. \par should
+% be specified before the end of the \vbox, since a vbox is a group.
+% 
+\def\raggedtitlesettings{%
+  \rm
+  \hyphenpenalty=10000
+  \parindent=0pt
+  \tolerance=5000
+  \ptexraggedright
+}
+
+% Macros to be used within @titlepage:
+
+\let\subtitlerm=\rmfont
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\parseargdef\title{%
+  \checkenv\titlepage
+  \vbox{\titlefonts \raggedtitlesettings #1\par}%
+  % print a rule at the page bottom also.
+  \finishedtitlepagefalse
+  \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+  \checkenv\titlepage
+  {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+  \def\temp{\quotation}%
+  \ifx\thisenv\temp
+    \def\quotationauthor{#1}% printed in \Equotation.
+  \else
+    \checkenv\titlepage
+    \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+    {\secfonts\rm \leftline{#1}}%
+  \fi
+}
+
+
+% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make \makeheadline and \makefootline in Plain TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\txipageheight by -12pt
+  \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+% @evenheadingmarks top     \thischapter <- chapter at the top of a page
+% @evenheadingmarks bottom  \thischapter <- chapter at the bottom of a page
+%
+% The same set of arguments for:
+%
+% @oddheadingmarks
+% @evenfootingmarks
+% @oddfootingmarks
+% @everyheadingmarks
+% @everyfootingmarks
+
+% These define \getoddheadingmarks, \getevenheadingmarks,
+% \getoddfootingmarks, and \getevenfootingmarks, each to one of
+% \gettopheadingmarks, \getbottomheadingmarks.
+%
+\def\evenheadingmarks{\headingmarks{even}{heading}}
+\def\oddheadingmarks{\headingmarks{odd}{heading}}
+\def\evenfootingmarks{\headingmarks{even}{footing}}
+\def\oddfootingmarks{\headingmarks{odd}{footing}}
+\parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1}
+                          \headingmarks{odd}{heading}{#1} }
+\parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1}
+                          \headingmarks{odd}{footing}{#1} }
+% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
+\def\headingmarks#1#2#3 {%
+  \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
+  \global\expandafter\let\csname get#1#2marks\endcsname \temp
+}
+
+\everyheadingmarks bottom
+\everyfootingmarks bottom
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\parseargdef\headings{\csname HEADINGS#1\endcsname}
+
+\def\headingsoff{% non-global headings elimination
+  \evenheadline={\hfil}\evenfootline={\hfil}%
+   \oddheadline={\hfil}\oddfootline={\hfil}%
+}
+
+\def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting
+\HEADINGSoff  % it's the default
+
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapterheading\hfil\folio}}
+\global\oddheadline={\line{\thischapterheading\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\thisisundefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemindicate{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil\relax
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  However, if
+    % what follows is an environment such as @example, there will be no
+    % \parskip glue; then the negative vskip we just inserted would
+    % cause the example and the item to crash together.  So we use this
+    % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+    % \parskip glue after all.  Section titles are handled this way also.
+    %
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+  \let\itemindex\gobble
+  \tablecheck{table}%
+}
+\envdef\ftable{%
+  \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+  \tablecheck{ftable}%
+}
+\envdef\vtable{%
+  \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+  \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+  \ifnum \the\catcode`\^^M=\active
+    \endgroup
+    \errmessage{This command won't work in this context; perhaps the problem is
+      that we are \inenvironment\thisenv}%
+    \def\next{\doignore{#1}}%
+  \else
+    \let\next\tablex
+  \fi
+  \next
+}
+\def\tablex#1{%
+  \def\itemindicate{#1}%
+  \parsearg\tabley
+}
+\def\tabley#1{%
+  {%
+    \makevalueexpandable
+    \edef\temp{\noexpand\tablez #1\space\space\space}%
+    \expandafter
+  }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+  \aboveenvbreak
+  \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+  \ifnum 0#2>0 \tableindent=#2\mil \fi
+  \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+  \itemmax=\tableindent
+  \advance \itemmax by -\itemmargin
+  \advance \leftskip by \tableindent
+  \exdentamount=\tableindent
+  \parindent = 0pt
+  \parskip = \smallskipamount
+  \ifdim \parskip=0pt \parskip=2pt \fi
+  \let\item = \internalBitem
+  \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  %
+  % Try typesetting the item mark so that if the document erroneously says
+  % something like @itemize @samp (intending @table), there's an error
+  % right away at the @itemize.  It's not the best error message in the
+  % world, but it's better than leaving it to the @item.  This means if
+  % the user wants an empty mark, they have to say @w{} not just @w.
+  \def\itemcontents{#1}%
+  \setbox0 = \hbox{\itemcontents}%
+  %
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  %
+  \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+  \advance\itemno by 1  % for enumerations
+  {\let\par=\endgraf \smallbreak}% reasonable place to break
+  {%
+   % If the document has an @itemize directly after a section title, a
+   % \nobreak will be last on the list, and \sectionheading will have
+   % done a \vskip-\parskip.  In that case, we don't want to zero
+   % parskip, or the item text will crash with the heading.  On the
+   % other hand, when there is normal text preceding the item (as there
+   % usually is), we do want to zero parskip, or there would be too much
+   % space.  In that case, we won't have a \nobreak before.  At least
+   % that's the theory.
+   \ifnum\lastpenalty<10000 \parskip=0in \fi
+   \noindent
+   \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+   %
+   \ifinner\else
+     \vadjust{\penalty 1200}% not good to break after first line of item.
+   \fi
+   % We can be in inner vertical mode in a footnote, although an
+   % @itemize looks awful there.
+  }%
+  \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1.  We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% multitable-only commands.
+% 
+% @headitem starts a heading row, which we typeset in bold.  Assignments
+% have to be global since we are inside the implicit group of an
+% alignment entry.  \everycr below resets \everytab so we don't have to
+% undo it ourselves.
+\def\headitemfont{\b}% for people to use in the template row; not changeable
+\def\headitem{%
+  \checkenv\multitable
+  \crcr
+  \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings
+  \global\everytab={\bf}% can't use \headitemfont since the parsing differs
+  \the\everytab % for the first item
+}%
+%
+% default for tables with no headings.
+\let\headitemcrhook=\relax
+%
+% A \tab used to include \hskip1sp.  But then the space in a template
+% line is not enough.  That is bad.  So let's go back to just `&' until
+% we again encounter the problem the 1sp was intended to solve.
+%					--karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab  % insert after every tab.
+%
+\envdef\multitable{%
+  \vskip\parskip
+  \startsavinginserts
+  %
+  % @item within a multitable starts a normal row.
+  % We use \def instead of \let so that if one of the multitable entries
+  % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+  % \endtemplate) expanding \doitemize.
+  \def\item{\crcr}%
+  %
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  %
+  \everycr = {%
+    \noalign{%
+      \global\everytab={}% Reset from possible headitem.
+      \global\colcount=0 % Reset the column counter.
+      %
+      % Check for saved footnotes, etc.:
+      \checkinserts
+      %
+      % Perhaps a \nobreak, then reset:
+      \headitemcrhook
+      \global\let\headitemcrhook=\relax
+    }%
+  }%
+  %
+  \parsearg\domultitable
+}
+\def\domultitable#1{%
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup &%
+    \global\advance\colcount by 1
+    \multistrut
+    \vtop{%
+      % Use the current \colcount to find the correct column width:
+      \hsize=\expandafter\csname col\the\colcount\endcsname
+      %
+      % In order to keep entries from bumping into each other
+      % we will add a \leftskip of \multitablecolspace to all columns after
+      % the first one.
+      %
+      % If a template has been used, we will add \multitablecolspace
+      % to the width of each template entry.
+      %
+      % If the user has set preamble in terms of percent of \hsize we will
+      % use that dimension as the width of the column, and the \leftskip
+      % will keep entries from bumping into each other.  Table will start at
+      % left margin and final column will justify at right margin.
+      %
+      % Make sure we don't inherit \rightskip from the outer environment.
+      \rightskip=0pt
+      \ifnum\colcount=1
+	% The first column will be indented with the surrounding text.
+	\advance\hsize by\leftskip
+      \else
+	\ifsetpercent \else
+	  % If user has not set preamble in terms of percent of \hsize
+	  % we will advance \hsize by \multitablecolspace.
+	  \advance\hsize by \multitablecolspace
+	\fi
+       % In either case we will make \leftskip=\multitablecolspace:
+      \leftskip=\multitablecolspace
+      \fi
+      % Ignoring space at the beginning and end avoids an occasional spurious
+      % blank line, when TeX decides to break the line at the space before the
+      % box from the multistrut, so the strut ends up on a line by itself.
+      % For example:
+      % @multitable @columnfractions .11 .89
+      % @item @code{#}
+      % @tab Legal holiday which is valid in major parts of the whole country.
+      % Is automatically provided with highlighting sequences respectively
+      % marking characters.
+      \noindent\ignorespaces##\unskip\multistrut
+    }\cr
+}
+\def\Emultitable{%
+  \crcr
+  \egroup % end the \halign
+  \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+  \def\multistrut{\strut}% just use the standard line spacing
+  %
+  % Compute \multitablelinespace (if not defined by user) for use in
+  % \multitableparskip calculation.  We used define \multistrut based on
+  % this, but (ironically) that caused the spacing to be off.
+  % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+% Test to see if parskip is larger than space between lines of
+% table. If not, do nothing.
+%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+                                      % than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt % to keep parskip somewhat smaller
+                                      % than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed.  They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested.  But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+  \expandafter\let\csname #1\endcsname = \relax
+  \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+  % Scan in ``verbatim'' mode:
+  \obeylines
+  \catcode`\@ = \other
+  \catcode`\{ = \other
+  \catcode`\} = \other
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \spaceisspace
+  %
+  % Count number of #1's that we've seen.
+  \doignorecount = 0
+  %
+  % Swallow text until we reach the matching `@end #1'.
+  \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+  \obeylines %
+  %
+  \gdef\dodoignore#1{%
+    % #1 contains the command name as a string, e.g., `ifinfo'.
+    %
+    % Define a command to find the next `@end #1'.
+    \long\def\doignoretext##1^^M@end #1{%
+      \doignoretextyyy##1^^M@#1\_STOP_}%
+    %
+    % And this command to find another #1 command, at the beginning of a
+    % line.  (Otherwise, we would consider a line `@c @ifset', for
+    % example, to count as an @ifset for nesting.)
+    \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+    %
+    % And now expand that command.
+    \doignoretext ^^M%
+  }%
+}
+
+\def\doignoreyyy#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty			% Nothing found.
+    \let\next\doignoretextzzz
+  \else					% Found a nested condition, ...
+    \advance\doignorecount by 1
+    \let\next\doignoretextyyy		% ..., look for another.
+    % If we're here, #1 ends with ^^M\ifinfo (for example).
+  \fi
+  \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+  \ifnum\doignorecount = 0	% We have just found the outermost @end.
+    \let\next\enddoignore
+  \else				% Still inside a nested condition.
+    \advance\doignorecount by -1
+    \let\next\doignoretext      % Look for the next @end.
+  \fi
+  \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+  % Ignore anything after the last `@end #1'; this matters in verbatim
+  % environments, where otherwise the newline after an ignored conditional
+  % would result in a blank line in the output.
+  \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  {%
+    \makevalueexpandable
+    \def\temp{#2}%
+    \edef\next{\gdef\makecsname{SET#1}}%
+    \ifx\temp\empty
+      \next{}%
+    \else
+      \setzzz#2\endsetzzz
+    \fi
+  }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+  {%
+    \makevalueexpandable
+    \global\expandafter\let\csname SET#1\endcsname=\relax
+  }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+  \catcode`\-=\active \catcode`\_=\active
+  %
+  \gdef\makevalueexpandable{%
+    \let\value = \expandablevalue
+    % We don't want these characters active, ...
+    \catcode`\-=\other \catcode`\_=\other
+    % ..., but we might end up with active ones in the argument if
+    % we're called from @code, as @code{@value{foo-bar_}}, though.
+    % So \let them to their normal equivalents.
+    \let-\normaldash \let_\normalunderscore
+  }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file.  This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+% 
+% Unfortunately, this has the consequence that when _ is in the *value*
+% of an @set, it does not print properly in the roman fonts (get the cmr
+% dot accent at position 126 instead).  No fix comes to mind, and it's
+% been this way since 2003 or earlier, so just ignore it.
+% 
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% Like \expandablevalue, but completely expandable (the \message in the
+% definition above operates at the execution level of TeX).  Used when
+% writing to auxiliary files, due to the expansion that \write does.
+% If flag is undefined, pass through an unexpanded @value command: maybe it 
+% will be set by the time it is read back in.
+%
+% NB flag names containing - or _ may not work here.
+\def\dummyvalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \noexpand\value{#1}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% Used for @value's in index entries to form the sort key: expand the @value
+% if possible, otherwise sort late.
+\def\indexnofontsvalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    ZZZZZZZ
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+% 
+% To get the special treatment we need for `@end ifset,' we call
+% \makecond and then redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+  {%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname SET#2\endcsname\relax
+      #1% If not set, redefine \next.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end executes the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @ifcommandisdefined CMD ... @end executes the `...' if CMD (written
+% without the @) is in fact defined.  We can only feasibly check at the
+% TeX level, so something like `mathcode' is going to considered
+% defined even though it is not a Texinfo command.
+% 
+\makecond{ifcommanddefined}
+\def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}}
+%
+\def\doifcmddefined#1#2{{%
+    \makevalueexpandable
+    \let\next=\empty
+    \expandafter\ifx\csname #2\endcsname\relax
+      #1% If not defined, \let\next as above.
+    \fi
+    \expandafter
+  }\next
+}
+\def\ifcmddefinedfail{\doignore{ifcommanddefined}}
+
+% @ifcommandnotdefined CMD ... handled similar to @ifclear above.
+\makecond{ifcommandnotdefined}
+\def\ifcommandnotdefined{%
+  \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}}
+\def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}}
+
+% Set the `txicommandconditionals' variable, so documents have a way to
+% test if the @ifcommand...defined conditionals are available.
+\set txicommandconditionals
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named IX.
+% It automatically defines \IXindex such that
+% \IXindex ...rest of line... puts an entry in the index IX.
+% It also defines \IXindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is IX.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \expandafter\chardef\csname#1indfile\endcsname=0
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \expandafter\chardef\csname#1indfile\endcsname=0
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+% The default indices:
+\newindex{cp}%      concepts,
+\newcodeindex{fn}%  functions,
+\newcodeindex{vr}%  variables,
+\newcodeindex{tp}%  types,
+\newcodeindex{ky}%  keys
+\newcodeindex{pg}%  and programs.
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  \requireopenindexfile{#3}%
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all index macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is the two-letter name of the index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx}
+\def\doindexxxx #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx}
+\def\docodeindexxxx #1{\doind{\indexname}{\code{#1}}}
+
+
+% Used when writing an index entry out to an index file to prevent
+% expansion of Texinfo commands that can appear in an index entry.
+%
+\def\indexdummies{%
+  \escapechar = `\\     % use backslash in output files.
+  \definedummyletter\@%
+  \definedummyletter\ %
+  %
+  % For texindex which always views { and } as separators.
+  \def\{{\lbracechar{}}%
+  \def\}{\rbracechar{}}%
+  %
+  % Do the redefinitions.
+  \definedummies
+}
+
+% Used for the aux and toc files, where @ is the escape character.
+%
+\def\atdummies{%
+  \definedummyletter\@%
+  \definedummyletter\ %
+  \definedummyletter\{%
+  \definedummyletter\}%
+  %
+  % Do the redefinitions.
+  \definedummies
+  \otherbackslash
+}
+
+% \definedummyword defines \#1 as \string\#1\space, thus effectively
+% preventing its expansion.  This is used only for control words,
+% not control letters, because the \space would be incorrect for
+% control characters, but is needed to separate the control word
+% from whatever follows.
+%
+% These can be used both for control words that take an argument and
+% those that do not.  If it is followed by {arg} in the input, then
+% that will dutifully get written to the index (or wherever).
+%
+% For control letters, we have \definedummyletter, which omits the
+% space.
+%
+\def\definedummyword  #1{\def#1{\string#1\space}}%
+\def\definedummyletter#1{\def#1{\string#1}}%
+\let\definedummyaccent\definedummyletter
+
+% Called from \indexdummies and \atdummies, to effectively prevent
+% the expansion of commands.
+%
+\def\definedummies{%
+  %
+  \let\commondummyword\definedummyword
+  \let\commondummyletter\definedummyletter
+  \let\commondummyaccent\definedummyaccent
+  \commondummiesnofonts
+  %
+  \definedummyletter\_%
+  \definedummyletter\-%
+  %
+  % Non-English letters.
+  \definedummyword\AA
+  \definedummyword\AE
+  \definedummyword\DH
+  \definedummyword\L
+  \definedummyword\O
+  \definedummyword\OE
+  \definedummyword\TH
+  \definedummyword\aa
+  \definedummyword\ae
+  \definedummyword\dh
+  \definedummyword\exclamdown
+  \definedummyword\l
+  \definedummyword\o
+  \definedummyword\oe
+  \definedummyword\ordf
+  \definedummyword\ordm
+  \definedummyword\questiondown
+  \definedummyword\ss
+  \definedummyword\th
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword\bf
+  \definedummyword\gtr
+  \definedummyword\hat
+  \definedummyword\less
+  \definedummyword\sf
+  \definedummyword\sl
+  \definedummyword\tclose
+  \definedummyword\tt
+  %
+  \definedummyword\LaTeX
+  \definedummyword\TeX
+  %
+  % Assorted special characters.
+  \definedummyword\atchar
+  \definedummyword\arrow
+  \definedummyword\bullet
+  \definedummyword\comma
+  \definedummyword\copyright
+  \definedummyword\registeredsymbol
+  \definedummyword\dots
+  \definedummyword\enddots
+  \definedummyword\entrybreak
+  \definedummyword\equiv
+  \definedummyword\error
+  \definedummyword\euro
+  \definedummyword\expansion
+  \definedummyword\geq
+  \definedummyword\guillemetleft
+  \definedummyword\guillemetright
+  \definedummyword\guilsinglleft
+  \definedummyword\guilsinglright
+  \definedummyword\lbracechar
+  \definedummyword\leq
+  \definedummyword\mathopsup
+  \definedummyword\minus
+  \definedummyword\ogonek
+  \definedummyword\pounds
+  \definedummyword\point
+  \definedummyword\print
+  \definedummyword\quotedblbase
+  \definedummyword\quotedblleft
+  \definedummyword\quotedblright
+  \definedummyword\quoteleft
+  \definedummyword\quoteright
+  \definedummyword\quotesinglbase
+  \definedummyword\rbracechar
+  \definedummyword\result
+  \definedummyword\sub
+  \definedummyword\sup
+  \definedummyword\textdegree
+  %
+  % We want to disable all macros so that they are not expanded by \write.
+  \macrolist
+  \let\value\dummyvalue
+  %
+  \normalturnoffactive
+}
+
+% \commondummiesnofonts: common to \definedummies and \indexnofonts.
+% Define \commondummyletter, \commondummyaccent and \commondummyword before
+% using.  Used for accents, font commands, and various control letters.
+%
+\def\commondummiesnofonts{%
+  % Control letters and accents.
+  \commondummyletter\!%
+  \commondummyaccent\"%
+  \commondummyaccent\'%
+  \commondummyletter\*%
+  \commondummyaccent\,%
+  \commondummyletter\.%
+  \commondummyletter\/%
+  \commondummyletter\:%
+  \commondummyaccent\=%
+  \commondummyletter\?%
+  \commondummyaccent\^%
+  \commondummyaccent\`%
+  \commondummyaccent\~%
+  \commondummyword\u
+  \commondummyword\v
+  \commondummyword\H
+  \commondummyword\dotaccent
+  \commondummyword\ogonek
+  \commondummyword\ringaccent
+  \commondummyword\tieaccent
+  \commondummyword\ubaraccent
+  \commondummyword\udotaccent
+  \commondummyword\dotless
+  %
+  % Texinfo font commands.
+  \commondummyword\b
+  \commondummyword\i
+  \commondummyword\r
+  \commondummyword\sansserif
+  \commondummyword\sc
+  \commondummyword\slanted
+  \commondummyword\t
+  %
+  % Commands that take arguments.
+  \commondummyword\abbr
+  \commondummyword\acronym
+  \commondummyword\anchor
+  \commondummyword\cite
+  \commondummyword\code
+  \commondummyword\command
+  \commondummyword\dfn
+  \commondummyword\dmn
+  \commondummyword\email
+  \commondummyword\emph
+  \commondummyword\env
+  \commondummyword\file
+  \commondummyword\image
+  \commondummyword\indicateurl
+  \commondummyword\inforef
+  \commondummyword\kbd
+  \commondummyword\key
+  \commondummyword\math
+  \commondummyword\option
+  \commondummyword\pxref
+  \commondummyword\ref
+  \commondummyword\samp
+  \commondummyword\strong
+  \commondummyword\tie
+  \commondummyword\U
+  \commondummyword\uref
+  \commondummyword\url
+  \commondummyword\var
+  \commondummyword\verb
+  \commondummyword\w
+  \commondummyword\xref
+}
+
+% This does nothing, but for a time it was recommended to use
+% \usebracesinindexestrue to be able to use braces in index entries.
+
+\let\indexlbrace\relax
+\let\indexrbrace\relax
+
+{\catcode`\@=0
+\catcode`\\=13
+  @gdef@backslashdisappear{@def\{}}
+}
+
+{
+\catcode`\<=13
+\catcode`\-=13
+\catcode`\`=13
+  \gdef\indexnonalnumdisappear{%
+    \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax\else
+      % @set txiindexlquoteignore makes us ignore left quotes in the sort term.
+      % (Introduced for FSFS 2nd ed.)
+      \let`=\empty
+    \fi
+    %
+    \expandafter\ifx\csname SETtxiindexbackslashignore\endcsname\relax\else
+      \backslashdisappear
+    \fi
+    %
+    \expandafter\ifx\csname SETtxiindexhyphenignore\endcsname\relax\else
+      \def-{}%
+    \fi
+    \expandafter\ifx\csname SETtxiindexlessthanignore\endcsname\relax\else
+      \def<{}%
+    \fi
+    \expandafter\ifx\csname SETtxiindexatsignignore\endcsname\relax\else
+      \def\@{}%
+    \fi
+  }
+
+  \gdef\indexnonalnumreappear{%
+    \useindexbackslash
+    \let-\normaldash
+    \let<\normalless
+    \def\@{@}%
+  }
+}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+  % Accent commands should become @asis.
+  \def\commondummyaccent##1{\let##1\asis}%
+  % We can just ignore other control letters.
+  \def\commondummyletter##1{\let##1\empty}%
+  % All control words become @asis by default; overrides below.
+  \let\commondummyword\commondummyaccent
+  \commondummiesnofonts
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  \def\ { }%
+  \def\@{@}%
+  \def\_{\normalunderscore}%
+  \def\-{}% @- shouldn't affect sorting
+  %
+  \uccode`\1=`\{ \uppercase{\def\{{1}}%
+  \uccode`\1=`\} \uppercase{\def\}{1}}%
+  \let\lbracechar\{%
+  \let\rbracechar\}%
+  %
+  % Non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\DH{DZZ}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\TH{TH}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\dh{dzz}%
+  \def\exclamdown{!}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\ordf{a}%
+  \def\ordm{o}%
+  \def\o{o}%
+  \def\questiondown{?}%
+  \def\ss{ss}%
+  \def\th{th}%
+  %
+  \def\LaTeX{LaTeX}%
+  \def\TeX{TeX}%
+  %
+  % Assorted special characters.  \defglyph gives the control sequence a
+  % definition that removes the {} that follows its use.
+  \defglyph\atchar{@}%
+  \defglyph\arrow{->}%
+  \defglyph\bullet{bullet}%
+  \defglyph\comma{,}%
+  \defglyph\copyright{copyright}%
+  \defglyph\dots{...}%
+  \defglyph\enddots{...}%
+  \defglyph\equiv{==}%
+  \defglyph\error{error}%
+  \defglyph\euro{euro}%
+  \defglyph\expansion{==>}%
+  \defglyph\geq{>=}%
+  \defglyph\guillemetleft{<<}%
+  \defglyph\guillemetright{>>}%
+  \defglyph\guilsinglleft{<}%
+  \defglyph\guilsinglright{>}%
+  \defglyph\leq{<=}%
+  \defglyph\lbracechar{\{}%
+  \defglyph\minus{-}%
+  \defglyph\point{.}%
+  \defglyph\pounds{pounds}%
+  \defglyph\print{-|}%
+  \defglyph\quotedblbase{"}%
+  \defglyph\quotedblleft{"}%
+  \defglyph\quotedblright{"}%
+  \defglyph\quoteleft{`}%
+  \defglyph\quoteright{'}%
+  \defglyph\quotesinglbase{,}%
+  \defglyph\rbracechar{\}}%
+  \defglyph\registeredsymbol{R}%
+  \defglyph\result{=>}%
+  \defglyph\textdegree{o}%
+  %
+  % We need to get rid of all macros, leaving only the arguments (if present).
+  % Of course this is not nearly correct, but it is the best we can do for now.
+  % makeinfo does not expand macros in the argument to @deffn, which ends up
+  % writing an index entry, and texindex isn't prepared for an index sort entry
+  % that starts with \.
+  %
+  % Since macro invocations are followed by braces, we can just redefine them
+  % to take a single TeX argument.  The case of a macro invocation that
+  % goes to end-of-line is not handled.
+  %
+  \macrolist
+  \let\value\indexnofontsvalue
+}
+\def\defglyph#1#2{\def#1##1{#2}} % see above
+
+
+
+
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{%
+  \iflinks
+  {%
+    %
+    \requireopenindexfile{#1}%
+    \edef\writeto{\csname#1indfile\endcsname}%
+    %
+    \def\indextext{#2}%
+    \safewhatsit\doindwrite
+  }%
+  \fi
+}
+
+% Check if an index file has been opened, and if not, open it.
+\def\requireopenindexfile#1{%
+\ifnum\csname #1indfile\endcsname=0
+  \expandafter\newwrite \csname#1indfile\endcsname
+  \edef\suffix{#1}%
+  % A .fls suffix would conflict with the file extension for the output
+  % of -recorder, so use .f1s instead.
+  \ifx\suffix\indexisfl\def\suffix{f1}\fi
+  % Open the file
+  \immediate\openout\csname#1indfile\endcsname \jobname.\suffix
+  % Using \immediate above here prevents an object entering into the current 
+  % box, which could confound checks such as those in \safewhatsit for
+  % preceding skips.
+  \typeout{Writing index file \jobname.\suffix}%
+\fi}
+\def\indexisfl{fl}
+
+% Output \ as {\indexbackslash}, because \ is an escape character in
+% the index files.
+\let\indexbackslash=\relax
+{\catcode`\@=0 \catcode`\\=\active
+  @gdef@useindexbackslash{@def\{{@indexbackslash}}}
+}
+
+% Definition for writing index entry sort key.
+{
+\catcode`\-=13
+\gdef\indexwritesortas{%
+  \begingroup
+  \indexnonalnumreappear
+  \indexwritesortasxxx}
+\gdef\indexwritesortasxxx#1{%
+  \xdef\indexsortkey{#1}\endgroup}
+}
+
+% Given index entry text like "aaa @subentry bbb @sortas{ZZZ}":
+%   * Set \bracedtext to "{aaa}{bbb}"
+%   * Set \fullindexsortkey to "aaa @subentry ZZZ"
+%
+\def\splitindexentry#1{%
+  \gdef\fullindexsortkey{}%
+  \xdef\bracedtext{}%
+  \def\sep{}%
+  \expandafter\doindexsegment#1\subentry\finish\subentry
+}
+
+% append the results from the next segment
+\def\doindexsegment#1\subentry{%
+  \def\segment{#1}%
+  \ifx\segment\isfinish
+  \else
+    %
+    % Fully expand the segment, throwing away any @sortas directives, and 
+    % trim spaces.
+    \def\sortas##1{}%
+    \edef\trimmed{\segment}%
+    \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
+    %
+    \xdef\bracedtext{\bracedtext{\trimmed}}%
+    %
+    % Get the string to sort by.  Process the segment with all
+    % font commands turned off.
+    \bgroup
+      \let\sortas\indexwritesortas
+      \indexnofonts
+      % The braces around the commands are recognized by texindex.
+      \def\lbracechar{{\indexlbrace}}%
+      \def\rbracechar{{\indexrbrace}}%
+      \let\{=\lbracechar
+      \let\}=\rbracechar
+      %
+      \let\indexsortkey\empty
+      % Execute the segment and throw away the typeset output.  This executes
+      % any @sortas commands in this segment.
+      \setbox\dummybox = \hbox{\segment}%
+      \ifx\indexsortkey\empty{%
+        \indexnonalnumdisappear
+        \xdef\trimmed{\segment}%
+        \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}%
+        \xdef\indexsortkey{\trimmed}%
+        \ifx\indexsortkey\empty\xdef\indexsortkey{ }\fi
+      }\fi
+      %
+      % Append to \fullindexsortkey.
+      \edef\tmp{\gdef\noexpand\fullindexsortkey{%
+                  \fullindexsortkey\sep\indexsortkey}}%
+      \tmp
+    \egroup
+    \def\sep{\subentry}%
+    %
+    \expandafter\doindexsegment
+  \fi
+}
+\def\isfinish{\finish}%
+
+\let\subentry\relax
+
+% Write the entry in \toks0 to the index file.
+%
+\def\doindwrite{%
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+  \fi
+  %
+  % Remember, we are within a group.
+  \indexdummies % Must do this here, since \bf, etc expand at this stage
+  \useindexbackslash % \indexbackslash isn't defined now so it will be output 
+                     % as is; and it will print as backslash.
+  %
+  % Split the entry into primary entry and any subentries, and get the index 
+  % sort key.
+  \splitindexentry\indextext
+  %
+  % Set up the complete index entry, with both the sort key and
+  % the original text, including any font commands.  We write
+  % three arguments to \entry to the .?? file (four in the
+  % subentry case), texindex reduces to two when writing the .??s
+  % sorted result.
+  %
+  \edef\temp{%
+    \write\writeto{%
+      \string\entry{\fullindexsortkey}{\noexpand\folio}\bracedtext}%
+  }%
+  \temp
+}
+\newbox\dummybox % used above
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again.  Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero.  The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode.  We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip.  \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip.  The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{\ifhmode
+  #1%
+ \else
+  % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+  \whatsitskip = \lastskip
+  \edef\lastskipmacro{\the\lastskip}%
+  \whatsitpenalty = \lastpenalty
+  %
+  % If \lastskip is nonzero, that means the last item was a
+  % skip.  And since a skip is discardable, that means this
+  % -\whatsitskip glue we're inserting is preceded by a
+  % non-discardable item, therefore it is not a potential
+  % breakpoint, therefore no \nobreak needed.
+  \ifx\lastskipmacro\zeroskipmacro
+  \else
+    \vskip-\whatsitskip
+  \fi
+  %
+  #1%
+  %
+  \ifx\lastskipmacro\zeroskipmacro
+    % If \lastskip was zero, perhaps the last item was a penalty, and
+    % perhaps it was >=10000, e.g., a \nobreak.  In that case, we want
+    % to re-insert the same penalty (values >10000 are used for various
+    % signals); since we just inserted a non-discardable item, any
+    % following glue (such as a \parskip) would be a breakpoint.  For example:
+    %   @deffn deffn-whatever
+    %   @vindex index-whatever
+    %   Description.
+    % would allow a break between the index-whatever whatsit
+    % and the "Description." paragraph.
+    \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+  \else
+    % On the other hand, if we had a nonzero \lastskip,
+    % this make-up glue would be preceded by a non-discardable item
+    % (the whatsit from the \write), so we must insert a \nobreak.
+    \nobreak\vskip\whatsitskip
+  \fi
+\fi}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \plainfrenchspacing
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+  %
+  % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 12
+  % See comment in \requireopenindexfile.
+  \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi
+  \openin 1 \jobname.\indexname s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+    \typeout{No file \jobname.\indexname s.}%
+  \else
+    \catcode`\\ = 0
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \thisline
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\ttbackslash}%
+      \let\indexlbrace\{   % Likewise, set these sequences for braces
+      \let\indexrbrace\}   % used in the sort key.
+      \begindoublecolumns
+      \let\dotheinsertentrybox\dotheinsertentryboxwithpenalty
+      %
+      % Read input from the index file line by line.
+      \loopdo
+        \ifeof1 \else
+          \read 1 to \nextline
+        \fi
+        %
+        \indexinputprocessing
+        \thisline
+        %
+        \ifeof1\else
+        \let\thisline\nextline
+      \repeat
+      %%
+      \enddoublecolumns
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+\def\loopdo#1\repeat{\def\body{#1}\loopdoxxx}
+\def\loopdoxxx{\let\next=\relax\body\let\next=\loopdoxxx\fi\next}
+
+\def\indexinputprocessing{%
+  \ifeof1
+    \let\firsttoken\relax
+  \else
+    \edef\act{\gdef\noexpand\firsttoken{\getfirsttoken\nextline}}%
+    \act
+  \fi
+}
+\def\getfirsttoken#1{\expandafter\getfirsttokenx#1\endfirsttoken}
+\long\def\getfirsttokenx#1#2\endfirsttoken{\noexpand#1}
+
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+{\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13
+\catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13
+\catcode`\$=3
+\gdef\initialglyphs{%
+  % Some changes for non-alphabetic characters.  Using the glyphs from the
+  % math fonts looks more consistent than the typewriter font used elsewhere
+  % for these characters.
+  \def\indexbackslash{\math{\backslash}}%
+  \let\\=\indexbackslash
+  %
+  % Can't get bold backslash so don't use bold forward slash
+  \catcode`\/=13
+  \def/{{\secrmnotbold \normalslash}}%
+  \def-{{\normaldash\normaldash}}% en dash `--'
+  \def^{{\chapbf \normalcaret}}%
+  \def~{{\chapbf \normaltilde}}%
+  \def\_{%
+     \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }%
+  \def|{$\vert$}%
+  \def<{$\less$}%
+  \def>{$\gtr$}%
+  \def+{$\normalplus$}%
+}}
+
+\def\initial{%
+  \bgroup
+  \initialglyphs
+  \initialx
+}
+
+\def\initialx#1{%
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  % The glue before the bonus allows a little bit of space at the
+  % bottom of a column to reduce an increase in inter-line spacing.
+  \nobreak
+  \vskip 0pt plus 5\baselineskip
+  \penalty -300 
+  \vskip 0pt plus -5\baselineskip
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus 1\baselineskip
+  \leftline{\secfonts \kern-0.05em \secbf #1}%
+  % \secfonts is inside the argument of \leftline so that the change of
+  % \baselineskip will not affect any glue inserted before the vbox that
+  % \leftline creates.
+  % Do our best not to break after the initial.
+  \nobreak
+  \vskip .33\baselineskip plus .1\baselineskip
+  \egroup % \initialglyphs
+}
+
+\newdimen\entryrightmargin
+\entryrightmargin=0pt
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin.  It is used for index
+% and table of contents entries.  The paragraph is indented by \leftskip.
+%
+\def\entry{%
+  \begingroup
+    %
+    % For pdfTeX and XeTeX.
+    % The redefinition of \domark stops marks being added in \pdflink to 
+    % preserve coloured links across page boundaries.  Otherwise the marks
+    % would get in the way of \lastbox in \insertentrybox.
+    \let\domark\relax
+    %
+    % Start a new paragraph if necessary, so our assignments below can't
+    % affect previous text.
+    \par
+    %
+    % No extra space above this paragraph.
+    \parskip = 0in
+    %
+    % When reading the text of entry, convert explicit line breaks
+    % from @* into spaces.  The user might give these in long section
+    % titles, for instance.
+    \def\*{\unskip\space\ignorespaces}%
+    \def\entrybreak{\hfil\break}% An undocumented command
+    %
+    % Swallow the left brace of the text (first parameter):
+    \afterassignment\doentry
+    \let\temp =
+}
+\def\entrybreak{\unskip\space\ignorespaces}%
+\def\doentry{%
+    % Save the text of the entry
+    \global\setbox\boxA=\hbox\bgroup
+    \bgroup % Instead of the swallowed brace.
+      \noindent
+      \aftergroup\finishentry
+      % And now comes the text of the entry.
+      % Not absorbing as a macro argument reduces the chance of problems
+      % with catcodes occurring.
+}
+{\catcode`\@=11
+\gdef\finishentry#1{%
+    \egroup % end box A
+    \dimen@ = \wd\boxA % Length of text of entry
+    \global\setbox\boxA=\hbox\bgroup\unhbox\boxA
+    % #1 is the page number.
+    %
+    % Get the width of the page numbers, and only use
+    % leaders if they are present.
+    \global\setbox\boxB = \hbox{#1}%
+    \ifdim\wd\boxB = 0pt
+      \null\nobreak\hfill\ %
+    \else
+      %
+      \null\nobreak\indexdotfill % Have leaders before the page number.
+      %
+      \ifpdf
+        \pdfgettoks#1.%
+        \hskip\skip\thinshrinkable\the\toksA
+      \else
+        \ifx\XeTeXrevision\thisisundefined
+          \hskip\skip\thinshrinkable #1%
+        \else
+          \pdfgettoks#1.%
+          \hskip\skip\thinshrinkable\the\toksA
+        \fi
+      \fi
+    \fi
+    \egroup % end \boxA
+    \ifdim\wd\boxB = 0pt
+      \global\setbox\entrybox=\vbox{\unhbox\boxA}%
+    \else
+    \global\setbox\entrybox=\vbox\bgroup
+      % We want the text of the entries to be aligned to the left, and the
+      % page numbers to be aligned to the right.
+      %
+      \parindent = 0pt
+      \advance\leftskip by 0pt plus 1fil
+      \advance\leftskip by 0pt plus -1fill
+      \rightskip = 0pt plus -1fil
+      \advance\rightskip by 0pt plus 1fill
+      % Cause last line, which could consist of page numbers on their own
+      % if the list of page numbers is long, to be aligned to the right.
+      \parfillskip=0pt plus -1fill
+      %
+      \advance\rightskip by \entryrightmargin
+      % Determine how far we can stretch into the margin.
+      % This allows, e.g., "Appendix H  GNU Free Documentation License" to
+      % fit on one line in @letterpaper format.
+      \ifdim\entryrightmargin>2.1em
+        \dimen@i=2.1em
+      \else
+        \dimen@i=0em
+      \fi
+      \advance \parfillskip by 0pt minus 1\dimen@i
+      %
+      \dimen@ii = \hsize
+      \advance\dimen@ii by -1\leftskip
+      \advance\dimen@ii by -1\entryrightmargin
+      \advance\dimen@ii by 1\dimen@i
+      \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line
+      \ifdim\dimen@ > 0.8\dimen@ii   % due to long index text
+        % Try to split the text roughly evenly.  \dimen@ will be the length of 
+        % the first line.
+        \dimen@ = 0.7\dimen@
+        \dimen@ii = \hsize
+        \ifnum\dimen@>\dimen@ii
+          % If the entry is too long (for example, if it needs more than
+          % two lines), use all the space in the first line.
+          \dimen@ = \dimen@ii
+        \fi
+        \advance\leftskip by 0pt plus 1fill % ragged right
+        \advance \dimen@ by 1\rightskip
+        \parshape = 2 0pt \dimen@ 0em \dimen@ii
+        % Ideally we'd add a finite glue at the end of the first line only,
+        % instead of using \parshape with explicit line lengths, but TeX
+        % doesn't seem to provide a way to do such a thing.
+        %
+        % Indent all lines but the first one.
+        \advance\leftskip by 1em
+        \advance\parindent by -1em
+      \fi\fi
+      \indent % start paragraph
+      \unhbox\boxA
+      %
+      % Do not prefer a separate line ending with a hyphen to fewer lines.
+      \finalhyphendemerits = 0
+      %
+      % Word spacing - no stretch
+      \spaceskip=\fontdimen2\font minus \fontdimen4\font
+      %
+      \linepenalty=1000  % Discourage line breaks.
+      \hyphenpenalty=5000  % Discourage hyphenation.
+      %
+      \par % format the paragraph
+    \egroup % The \vbox
+    \fi
+  \endgroup
+  \dotheinsertentrybox
+}}
+
+\newskip\thinshrinkable
+\skip\thinshrinkable=.15em minus .15em
+
+\newbox\entrybox
+\def\insertentrybox{%
+  \ourunvbox\entrybox
+}
+
+% default definition
+\let\dotheinsertentrybox\insertentrybox
+
+% Use \lastbox to take apart vbox box by box, and add each sub-box
+% to the current vertical list.
+\def\ourunvbox#1{%
+\bgroup % for local binding of \delayedbox
+  % Remove the last box from box #1
+  \global\setbox#1=\vbox{%
+    \unvbox#1%
+    \unskip % remove any glue
+    \unpenalty
+    \global\setbox\interbox=\lastbox
+  }%
+  \setbox\delayedbox=\box\interbox
+  \ifdim\ht#1=0pt\else
+    \ourunvbox#1 % Repeat on what's left of the box
+    \nobreak
+  \fi
+  \box\delayedbox
+\egroup
+}
+\newbox\delayedbox
+\newbox\interbox
+
+% Used from \printindex.  \firsttoken should be the first token
+% after the \entry.  If it's not another \entry, we are at the last
+% line of a group of index entries, so insert a penalty to discourage
+% widowed index entries.
+\def\dotheinsertentryboxwithpenalty{%
+  \ifx\firsttoken\isentry
+  \else
+    \penalty 9000
+  \fi
+  \insertentrybox
+}
+\def\isentry{\entry}%
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+% The filll stretch here overpowers both the fil and fill stretch to push
+% the page number to the right.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1filll}
+
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+      #2
+    \else
+      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+    \fi
+  \fi
+  \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11  % private names
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % If not much space left on page, start a new page.
+  \ifdim\pagetotal>0.8\vsize\vfill\eject\fi
+  %
+  % Grab any single-column material above us.
+  \output = {%
+    \savetopmark
+    %
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \advance\vsize by -\ht\partialpage
+  \vsize = 2\vsize
+  %
+  % For the benefit of balancing columns
+  \advance\baselineskip by 0pt plus 0.5pt
+}
+
+% The double-column output routine for all double-column pages except
+% the last, which is done by \balancecolumns.
+%
+\def\doublecolumnout{%
+  %
+  \savetopmark
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@
+  \global\advance\vsize by 2\ht\partialpage
+  \onepageout\pagesofar % empty except for the first time we are called
+  \unvbox\PAGE
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\txipagewidth{\box0\hfil\box2}%
+}
+
+
+% Finished with with double columns.
+\def\enddoublecolumns{%
+  % The following penalty ensures that the page builder is exercised
+  % _before_ we change the output routine.  This is necessary in the
+  % following situation:
+  %
+  % The last section of the index consists only of a single entry.
+  % Before this section, \pagetotal is less than \pagegoal, so no
+  % break occurs before the last section starts.  However, the last
+  % section, consisting of \initial and the single \entry, does not
+  % fit on the page and has to be broken off.  Without the following
+  % penalty the page builder will not be exercised until \eject
+  % below, and by that time we'll already have changed the output
+  % routine to the \balancecolumns version, so the next-to-last
+  % double-column page will be processed with \balancecolumns, which
+  % is wrong:  The two columns will go to the main vertical list, with
+  % the broken-off section in the recent contributions.  As soon as
+  % the output routine finishes, TeX starts reconsidering the page
+  % break.  The two columns and the broken-off section both fit on the
+  % page, because the two columns now take up only half of the page
+  % goal.  When TeX sees \eject from below which follows the final
+  % section, it invokes the new output routine that we've set after
+  % \balancecolumns below; \onepageout will try to fit the two columns
+  % and the final section into the vbox of \txipageheight (see
+  % \pagebody), causing an overfull box.
+  %
+  % Note that glue won't work here, because glue does not exercise the
+  % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+  \penalty0
+  %
+  \output = {%
+    % Split the last of the double-column material.
+    \savetopmark
+    \balancecolumns
+  }%
+  \eject % call the \output just set
+  \ifdim\pagetotal=0pt
+    % Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.
+    \global\output=\expandafter{\the\defaultoutput}
+    %
+    \endgroup % started in \begindoublecolumns
+    % Leave the double-column material on the current page, no automatic
+    % page break.
+    \box\balancedcolumns
+    %
+    % \pagegoal was set to the doubled \vsize above, since we restarted
+    % the current page.  We're now back to normal single-column
+    % typesetting, so reset \pagegoal to the normal \vsize.
+    \global\vsize = \txipageheight %
+    \pagegoal = \txipageheight %
+  \else
+    % We had some left-over material.  This might happen when \doublecolumnout
+    % is called in \balancecolumns.  Try again.
+    \expandafter\enddoublecolumns
+  \fi
+}
+\newbox\balancedcolumns
+\setbox\balancedcolumns=\vbox{shouldnt see this}%
+%
+% Only called for the last of the double column material.  \doublecolumnout 
+% does the others.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \ifdim\dimen@<7\baselineskip
+    % Don't split a short final column in two.
+    \setbox2=\vbox{}%
+    \global\setbox\balancedcolumns=\vbox{\pagesofar}%
+  \else
+    % double the leading vertical space
+    \advance\dimen@ by \topskip
+    \advance\dimen@ by-\baselineskip
+    \divide\dimen@ by 2 % target to split to
+    \dimen@ii = \dimen@
+    \splittopskip = \topskip
+    % Loop until left column is at least as high as the right column.
+    {%
+      \vbadness = 10000
+      \loop
+        \global\setbox3 = \copy0
+        \global\setbox1 = \vsplit3 to \dimen@
+      \ifdim\ht1<\ht3
+        \global\advance\dimen@ by 1pt
+      \repeat
+    }%
+    % Now the left column is in box 1, and the right column in box 3.
+    %
+    % Check whether the left column has come out higher than the page itself.  
+    % (Note that we have doubled \vsize for the double columns, so
+    % the actual height of the page is 0.5\vsize).
+    \ifdim2\ht1>\vsize
+      % It appears that we have been called upon to balance too much material.
+      % Output some of it with \doublecolumnout, leaving the rest on the page.
+      \setbox\PAGE=\box0
+      \doublecolumnout
+    \else
+      % Compare the heights of the two columns.
+      \ifdim4\ht1>5\ht3
+        % Column heights are too different, so don't make their bottoms
+        % flush with each other.
+        \setbox2=\vbox to \ht1 {\unvbox3\vfill}%
+        \setbox0=\vbox to \ht1 {\unvbox1\vfill}%
+      \else
+        % Make column bottoms flush with each other.
+        \setbox2=\vbox to\ht1{\unvbox3\unskip}%
+        \setbox0=\vbox to\ht1{\unvbox1\unskip}%
+      \fi
+      \global\setbox\balancedcolumns=\vbox{\pagesofar}%
+    \fi
+  \fi
+  %
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% Let's start with @part.
+\outer\parseargdef\part{\partzzz{#1}}
+\def\partzzz#1{%
+  \chapoddpage
+  \null
+  \vskip.3\vsize  % move it down on the page a bit
+  \begingroup
+    \noindent \titlefonts\rm #1\par % the text
+    \let\lastnode=\empty      % no node to associate with
+    \writetocentry{part}{#1}{}% but put it in the toc
+    \headingsoff              % no headline or footline on the part page
+    % This outputs a mark at the end of the page that clears \thischapter
+    % and \thissection, as is done in \startcontents.
+    \let\pchapsepmacro\relax
+    \chapmacro{}{Yomitfromtoc}{}%
+    \chapoddpage
+  \endgroup
+}
+
+% \unnumberedno is an oxymoron.  But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number".  We avoid collisions with chapter
+% numbers by starting them at 10000.  (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines these (using marks) as the number+name, number
+% and name of the chapter.  Page headings and footings can use
+% these.  @section does likewise.
+\def\thischapter{}
+\def\thischapternum{}
+\def\thischaptername{}
+\def\thissection{}
+\def\thissectionnum{}
+\def\thissectionname{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achieve this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unnlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+  % Compute the abs. sec. level:
+  \absseclevel=#2
+  \advance\absseclevel by \secbase
+  % Make sure \absseclevel doesn't fall outside the range:
+  \ifnum \absseclevel < 0
+    \absseclevel = 0
+  \else
+    \ifnum \absseclevel > 3
+      \absseclevel = 3
+    \fi
+  \fi
+  % The heading type:
+  \def\headtype{#1}%
+  \if \headtype U%
+    \ifnum \absseclevel < \unnlevel
+      \chardef\unnlevel = \absseclevel
+    \fi
+  \else
+    % Check for appendix sections:
+    \ifnum \absseclevel = 0
+      \edef\chapheadtype{\headtype}%
+    \else
+      \if \headtype A\if \chapheadtype N%
+	\errmessage{@appendix... within a non-appendix chapter}%
+      \fi\fi
+    \fi
+    % Check for numbered within unnumbered:
+    \ifnum \absseclevel > \unnlevel
+      \def\headtype{U}%
+    \else
+      \chardef\unnlevel = 3
+    \fi
+  \fi
+  % Now print the heading:
+  \if \headtype U%
+    \ifcase\absseclevel
+	\unnumberedzzz{#3}%
+    \or \unnumberedseczzz{#3}%
+    \or \unnumberedsubseczzz{#3}%
+    \or \unnumberedsubsubseczzz{#3}%
+    \fi
+  \else
+    \if \headtype A%
+      \ifcase\absseclevel
+	  \appendixzzz{#3}%
+      \or \appendixsectionzzz{#3}%
+      \or \appendixsubseczzz{#3}%
+      \or \appendixsubsubseczzz{#3}%
+      \fi
+    \else
+      \ifcase\absseclevel
+	  \chapterzzz{#3}%
+      \or \seczzz{#3}%
+      \or \numberedsubseczzz{#3}%
+      \or \numberedsubsubseczzz{#3}%
+      \fi
+    \fi
+  \fi
+  \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered.  Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v.  By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+  % section resetting is \global in case the chapter is in a group, such
+  % as an @include file.
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\chapno by 1
+  %
+  % Used for \float.
+  \gdef\chaplevelprefix{\the\chapno.}%
+  \resetallfloatnos
+  %
+  % \putwordChapter can contain complex things in translations.
+  \toks0=\expandafter{\putwordChapter}%
+  \message{\the\toks0 \space \the\chapno}%
+  %
+  % Write the actual heading.
+  \chapmacro{#1}{Ynumbered}{\the\chapno}%
+  %
+  % So @section and the like are numbered underneath this chapter.
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz
+%
+\def\appendixzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\appendixno by 1
+  \gdef\chaplevelprefix{\appendixletter.}%
+  \resetallfloatnos
+  %
+  % \putwordAppendix can contain complex things in translations.
+  \toks0=\expandafter{\putwordAppendix}%
+  \message{\the\toks0 \space \appendixletter}%
+  %
+  \chapmacro{#1}{Yappendix}{\appendixletter}%
+  %
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+% normally unnmhead0 calls unnumberedzzz:
+\outer\parseargdef\unnumbered{\unnmhead0{#1}}
+\def\unnumberedzzz#1{%
+  \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+    \global\advance\unnumberedno by 1
+  %
+  % Since an unnumbered has no number, no prefix for figures.
+  \global\let\chaplevelprefix = \empty
+  \resetallfloatnos
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}%
+  \message{(\the\toks0)}%
+  %
+  \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+  %
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+  \let\centerparametersmaybe = \centerparameters
+  \unnmhead0{#1}%
+  \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+% 
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+% normally calls appendixsectionzzz:
+\outer\parseargdef\appendixsection{\apphead1{#1}}
+\def\appendixsectionzzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+% normally calls unnumberedseczzz:
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}}
+\def\unnumberedseczzz#1{%
+  \global\subsecno=0 \global\subsubsecno=0  \global\advance\secno by 1
+  \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+% 
+% normally calls numberedsubseczzz:
+\outer\parseargdef\numberedsubsec{\numhead2{#1}}
+\def\numberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+% normally calls appendixsubseczzz:
+\outer\parseargdef\appendixsubsec{\apphead2{#1}}
+\def\appendixsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+% normally calls unnumberedsubseczzz:
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}}
+\def\unnumberedsubseczzz#1{%
+  \global\subsubsecno=0  \global\advance\subsecno by 1
+  \sectionheading{#1}{subsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+% 
+% normally numberedsubsubseczzz:
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}}
+\def\numberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynumbered}%
+                 {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally appendixsubsubseczzz:
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}}
+\def\appendixsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Yappendix}%
+                 {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% normally unnumberedsubsubseczzz:
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}}
+\def\unnumberedsubsubseczzz#1{%
+  \global\advance\subsubsecno by 1
+  \sectionheading{#1}{subsubsec}{Ynothing}%
+                 {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+\def\majorheading{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+  \vbox{\chapfonts \raggedtitlesettings #1\par}%
+  \nobreak\bigskip \nobreak
+  \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+  \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+% Parameter controlling skip before chapter headings (if needed)
+\newskip\chapheadingskip
+
+% Define plain chapter starts, and page on/off switching for it.
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+
+% Start a new page
+\def\chappager{\par\vfill\supereject}
+
+% \chapoddpage - start on an odd page for a new chapter
+% Because \domark is called before \chapoddpage, the filler page will
+% get the headings for the next chapter, which is wrong.  But we don't
+% care -- we just disable all headings on the filler page.
+\def\chapoddpage{%
+  \chappager
+  \ifodd\pageno \else
+    \begingroup
+      \headingsoff
+      \null
+      \chappager
+    \endgroup
+  \fi
+}
+
+\parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% \chapmacro - Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+% Not used for @heading series.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yappendixkeyword{Yappendix}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+%
+\def\chapmacro#1#2#3{%
+  \expandafter\ifx\thisenv\titlepage\else
+    \checkenv{}% chapters, etc., should not start inside an environment.
+  \fi
+  % Insert the first mark before the heading break (see notes for \domark).
+  \let\prevchapterdefs=\currentchapterdefs
+  \let\prevsectiondefs=\currentsectiondefs
+  \gdef\currentsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
+                        \gdef\thissection{}}%
+  %
+  \def\temptype{#2}%
+  \ifx\temptype\Ynothingkeyword
+    \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{\thischaptername}}%
+  \else\ifx\temptype\Yomitfromtockeyword
+    \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+                          \gdef\thischapter{}}%
+  \else\ifx\temptype\Yappendixkeyword
+    \toks0={#1}%
+    \xdef\currentchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\appendixletter}%
+      % \noexpand\putwordAppendix avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
+                                 \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \else
+    \toks0={#1}%
+    \xdef\currentchapterdefs{%
+      \gdef\noexpand\thischaptername{\the\toks0}%
+      \gdef\noexpand\thischapternum{\the\chapno}%
+      % \noexpand\putwordChapter avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
+                                 \noexpand\thischapternum:
+                                 \noexpand\thischaptername}%
+    }%
+  \fi\fi\fi
+  %
+  % Output the mark.  Pass it through \safewhatsit, to take care of
+  % the preceding space.
+  \safewhatsit\domark
+  %
+  % Insert the chapter heading break.
+  \pchapsepmacro
+  %
+  % Now the second mark, after the heading break.  No break points
+  % between here and the heading.
+  \let\prevchapterdefs=\currentchapterdefs
+  \let\prevsectiondefs=\currentsectiondefs
+  \domark
+  %
+  {%
+    \chapfonts \rm
+    \let\footnote=\errfootnoteheading % give better error message
+    %
+    % Have to define \currentsection before calling \donoderef, because the
+    % xref code eventually uses it.  On the other hand, it has to be called
+    % after \pchapsepmacro, or the headline will change too soon.
+    \gdef\currentsection{#1}%
+    %
+    % Only insert the separating space if we have a chapter/appendix
+    % number, and don't print the unnumbered ``number''.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unnchap}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+      \def\toctype{omit}%
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+      \def\toctype{app}%
+    \else
+      \setbox0 = \hbox{#3\enspace}%
+      \def\toctype{numchap}%
+    \fi\fi\fi
+    %
+    % Write the toc entry for this chapter.  Must come before the
+    % \donoderef, because we include the current node name in the toc
+    % entry, and \donoderef resets it to empty.
+    \writetocentry{\toctype}{#1}{#3}%
+    %
+    % For pdftex, we have to write out the node definition (aka, make
+    % the pdfdest) after any page break, but before the actual text has
+    % been typeset.  If the destination for the pdf outline is after the
+    % text, then jumping from the outline may wind up with the text not
+    % being visible, for instance under high magnification.
+    \donoderef{#2}%
+    %
+    % Typeset the actual heading.
+    \nobreak % Avoid page breaks at the interline glue.
+    \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+  \advance\rightskip by 3\rightskip
+  \leftskip = \rightskip
+  \parfillskip = 0pt
+}
+
+
+% Section titles.  These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text of the title,
+% #2 is the section level (sec/subsec/subsubsec),
+% #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc),
+% #4 is the section number.
+%
+\def\seckeyword{sec}
+%
+\def\sectionheading#1#2#3#4{%
+  {%
+    \def\sectionlevel{#2}%
+    \def\temptype{#3}%
+    %
+    % It is ok for the @heading series commands to appear inside an
+    % environment (it's been historically allowed, though the logic is
+    % dubious), but not the others.
+    \ifx\temptype\Yomitfromtockeyword\else
+      \checkenv{}% non-@*heading should not be in an environment.
+    \fi
+    \let\footnote=\errfootnoteheading
+    %
+    % Switch to the right set of fonts.
+    \csname #2fonts\endcsname \rm
+    %
+    % Insert first mark before the heading break (see notes for \domark).
+    \let\prevsectiondefs=\currentsectiondefs
+    \ifx\temptype\Ynothingkeyword
+      \ifx\sectionlevel\seckeyword
+        \gdef\currentsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
+                              \gdef\thissection{\thissectionname}}%
+      \fi
+    \else\ifx\temptype\Yomitfromtockeyword
+      % Don't redefine \thissection.
+    \else\ifx\temptype\Yappendixkeyword
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\currentsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \else
+      \ifx\sectionlevel\seckeyword
+        \toks0={#1}%
+        \xdef\currentsectiondefs{%
+          \gdef\noexpand\thissectionname{\the\toks0}%
+          \gdef\noexpand\thissectionnum{#4}%
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
+                                     \noexpand\thissectionname}%
+        }%
+      \fi
+    \fi\fi\fi
+    %
+    % Go into vertical mode.  Usually we'll already be there, but we
+    % don't want the following whatsit to end up in a preceding paragraph
+    % if the document didn't happen to have a blank line.
+    \par
+    %
+    % Output the mark.  Pass it through \safewhatsit, to take care of
+    % the preceding space.
+    \safewhatsit\domark
+    %
+    % Insert space above the heading.
+    \csname #2headingbreak\endcsname
+    %
+    % Now the second mark, after the heading break.  No break points
+    % between here and the heading.
+    \global\let\prevsectiondefs=\currentsectiondefs
+    \domark
+    %
+    % Only insert the space after the number if we have a section number.
+    \ifx\temptype\Ynothingkeyword
+      \setbox0 = \hbox{}%
+      \def\toctype{unn}%
+      \gdef\currentsection{#1}%
+    \else\ifx\temptype\Yomitfromtockeyword
+      % for @headings -- no section number, don't include in toc,
+      % and don't redefine \currentsection.
+      \setbox0 = \hbox{}%
+      \def\toctype{omit}%
+      \let\sectionlevel=\empty
+    \else\ifx\temptype\Yappendixkeyword
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{app}%
+      \gdef\currentsection{#1}%
+    \else
+      \setbox0 = \hbox{#4\enspace}%
+      \def\toctype{num}%
+      \gdef\currentsection{#1}%
+    \fi\fi\fi
+    %
+    % Write the toc entry (before \donoderef).  See comments in \chapmacro.
+    \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+    %
+    % Write the node reference (= pdf destination for pdftex).
+    % Again, see comments in \chapmacro.
+    \donoderef{#3}%
+    %
+    % Interline glue will be inserted when the vbox is completed.
+    % That glue will be a valid breakpoint for the page, since it'll be
+    % preceded by a whatsit (usually from the \donoderef, or from the
+    % \writetocentry if there was no node).  We don't want to allow that
+    % break, since then the whatsits could end up on page n while the
+    % section is on page n+1, thus toc/etc. are wrong.  Debian bug 276000.
+    \nobreak
+    %
+    % Output the actual section heading.
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
+          \hangindent=\wd0  % zero if no section number
+          \unhbox0 #1}%
+  }%
+  % Add extra space after the heading -- half of whatever came above it.
+  % Don't allow stretch, though.
+  \kern .5 \csname #2headingskip\endcsname
+  %
+  % Do not let the kern be a potential breakpoint, as it would be if it
+  % was followed by glue.
+  \nobreak
+  %
+  % We'll almost certainly start a paragraph next, so don't let that
+  % glue accumulate.  (Not a breakpoint because it's preceded by a
+  % discardable item.)  However, when a paragraph is not started next
+  % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out
+  % or the negative glue will cause weirdly wrong output, typically
+  % obscuring the section heading with something else.
+  \vskip-\parskip
+  %
+  % This is so the last item on the main vertical list is a known
+  % \penalty > 10000, so \startdefun, etc., can recognize the situation
+  % and do the needful.
+  \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this.  The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything.  This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+  \edef\writetoctype{#1}%
+  \ifx\writetoctype\omitkeyword \else
+    \iftocfileopened\else
+      \immediate\openout\tocfile = \jobname.toc
+      \global\tocfileopenedtrue
+    \fi
+    %
+    \iflinks
+      {\atdummies
+       \edef\temp{%
+         \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+       \temp
+      }%
+    \fi
+  \fi
+  %
+  % Tell \shipout to create a pdf destination on each page, if we're
+  % writing pdf.  These are used in the table of contents.  We can't
+  % just write one on every page because the title pages are numbered
+  % 1 and 2 (the page numbers aren't printed), and so are the first
+  % two pages of the document.  Thus, we'd have two destinations named
+  % `1', and two named `2'.
+  \ifpdf
+    \global\pdfmakepagedesttrue
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+    \else
+      \global\pdfmakepagedesttrue
+    \fi
+  \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care.  This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+  \catcode`\"=\active
+  \catcode`\$=\active
+  \catcode`\<=\active
+  \catcode`\>=\active
+  \catcode`\\=\active
+  \catcode`\^=\active
+  \catcode`\_=\active
+  \catcode`\|=\active
+  \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+  \setupdatafile
+  \activecatcodes
+  \input \tocreadfilename
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+  % If @setchapternewpage on, and @headings double, the contents should
+  % start on an odd page, unlike chapters.  Thus, we maintain
+  % \contentsalignmacro in parallel with \pagealignmacro.
+  % From: Torbjorn Granlund <tege@matematik.su.se>
+  \contentsalignmacro
+  \immediate\closeout\tocfile
+  %
+  % Don't need to put `Contents' or `Short Contents' in the headline.
+  % It is abundantly clear what they are.
+  \chapmacro{#1}{Yomitfromtoc}{}%
+  %
+  \savepageno = \pageno
+  \begingroup                  % Set up to handle contents files properly.
+    \raggedbottom              % Worry more about breakpoints than the bottom.
+    \entryrightmargin=\contentsrightmargin % Don't use the full line length.
+    %
+    % Roman numerals for page numbers.
+    \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref.  We always output on
+% \jobname.toc even if this is redefined.
+%
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+  \startcontents{\putwordTOC}%
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+    \ifeof 1 \else
+      \pdfmakeoutlines
+    \fi
+    \closein 1
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+  \startcontents{\putwordShortTOC}%
+    %
+    \let\partentry = \shortpartentry
+    \let\numchapentry = \shortchapentry
+    \let\appentry = \shortchapentry
+    \let\unnchapentry = \shortunnchapentry
+    % We want a true roman here for the page numbers.
+    \secfonts
+    \let\rm=\shortcontrm \let\bf=\shortcontbf
+    \let\sl=\shortcontsl \let\tt=\shortconttt
+    \rm
+    \hyphenpenalty = 10000
+    \advance\baselineskip by 1pt % Open it up a little.
+    \def\numsecentry##1##2##3##4{}
+    \let\appsecentry = \numsecentry
+    \let\unnsecentry = \numsecentry
+    \let\numsubsecentry = \numsecentry
+    \let\appsubsecentry = \numsecentry
+    \let\unnsubsecentry = \numsecentry
+    \let\numsubsubsecentry = \numsecentry
+    \let\appsubsubsecentry = \numsecentry
+    \let\unnsubsubsecentry = \numsecentry
+    \openin 1 \tocreadfilename\space
+    \ifeof 1 \else
+      \readtocfile
+    \fi
+    \closein 1
+    \vfill \eject
+    \contentsalignmacro % in case @setchapternewpage odd is in effect
+  \endgroup
+  \lastnegativepageno = \pageno
+  \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  %
+  % We'd like to right-justify chapter numbers, but that looks strange
+  % with appendix letters.  And right-justifying numbers and
+  % left-justifying letters looks strange when there is less than 10
+  % chapters.  Have to read the whole toc once to know how many chapters
+  % there are before deciding ...
+  \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Parts, in the main contents.  Replace the part number, which doesn't
+% exist, with an empty box.  Let's hope all the numbers have the same width.
+% Also ignore the page number, which is conventionally not printed.
+\def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}}
+\def\partentry#1#2#3#4{%
+  % Add stretch and a bonus for breaking the page before the part heading.
+  % This reduces the chance of the page being broken immediately after the
+  % part heading, before a following chapter heading.
+  \vskip 0pt plus 5\baselineskip
+  \penalty-300
+  \vskip 0pt plus -5\baselineskip
+  \dochapentry{\numeralbox\labelspace#1}{}%
+}
+%
+% Parts, in the short toc.
+\def\shortpartentry#1#2#3#4{%
+  \penalty-300
+  \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip
+  \shortchapentry{{\bf #1}}{\numeralbox}{}{}%
+}
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+  % We use M since it's probably the widest letter.
+  \setbox0 = \hbox{\putwordAppendix{} M}%
+  \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\hskip.7em#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     % Move the page numbers slightly to the right
+     \advance\entryrightmargin by -0.05em
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @tex ... @end tex    escapes into raw TeX temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain @ character.
+
+\envdef\tex{%
+  \setupmarkupstyle{tex}%
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \catcode `\`=\other
+  \catcode `\'=\other
+  %
+  % ' is active in math mode (mathcode"8000).  So reset it, and all our
+  % other math active characters (just in case), to plain's definitions.
+  \mathactive
+  %
+  % Inverse of the list at the beginning of the file.
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\noindent=\ptexnoindent
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\/=\ptexslash
+  \let\sp=\ptexsp
+  \let\*=\ptexstar
+  %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode
+  \let\t=\ptext
+  \expandafter \let\csname top\endcsname=\ptextop  % we've made it outer
+  \let\frenchspacing=\plainfrenchspacing
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      \ifnum\lastpenalty<10000
+        % Penalize breaking before the environment, because preceding text
+        % often leads into it.
+        \penalty100
+      \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\def\afterenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz and
+  % \sectionheading, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty<10000 \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+  \ifhmode\par\fi  % can't be in the midst of a paragraph.
+  \startsavinginserts
+  \lskip=\leftskip \rskip=\rightskip
+  \leftskip=0pt\rightskip=0pt % we want these *outside*.
+  \cartinner=\hsize \advance\cartinner by-\lskip
+  \advance\cartinner by-\rskip
+  \cartouter=\hsize
+  \advance\cartouter by 18.4pt	% allow for 3pt kerns on either
+				% side, and for 6pt waste from
+				% each corner char, and rule thickness
+  \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+  %
+  % If this cartouche directly follows a sectioning command, we need the
+  % \parskip glue (backspaced over by default) or the cartouche can
+  % collide with the section heading.
+  \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi
+  %
+  \setbox\groupbox=\vbox\bgroup
+      \baselineskip=0pt\parskip=0pt\lineskip=0pt
+      \carttop
+      \hbox\bgroup
+	  \hskip\lskip
+	  \vrule\kern3pt
+	  \vbox\bgroup
+	      \kern3pt
+	      \hsize=\cartinner
+	      \baselineskip=\normbskip
+	      \lineskip=\normlskip
+	      \parskip=\normpskip
+	      \vskip -\parskip
+	      \comment % For explanation, see the end of def\group.
+}
+\def\Ecartouche{%
+              \ifhmode\par\fi
+	      \kern3pt
+	  \egroup
+	  \kern3pt\vrule
+	  \hskip\rskip
+      \egroup
+      \cartbot
+  \egroup
+  \addgroupbox
+  \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\newdimen\nonfillparindent
+\def\nonfillstart{%
+  \aboveenvbreak
+  \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  % Turn off paragraph indentation but redefine \indent to emulate
+  % the normal \indent.
+  \nonfillparindent=\parindent
+  \parindent = 0pt
+  \let\indent\nonfillindent
+  %
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+  \let\exdent=\nofillexdent
+}
+
+\begingroup
+\obeyspaces
+% We want to swallow spaces (but not other tokens) after the fake
+% @indent in our nonfill-environments, where spaces are normally
+% active and set to @tie, resulting in them not being ignored after
+% @indent.
+\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
+\gdef\nonfillindentcheck{%
+\ifx\temp %
+\expandafter\nonfillindentgobble%
+\else%
+\leavevmode\nonfillindentbox%
+\fi%
+}%
+\endgroup
+\def\nonfillindentgobble#1{\nonfillindent}
+\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+%    @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+  \ifx\SETdispenvsize\smallword
+    % end paragraph for sake of leading, in case document has no blank
+    % line.  This is redundant with what happens in \aboveenvbreak, but
+    % we need to do it before changing the fonts, and it's inconvenient
+    % to change the fonts afterward.
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+\def\setsmalldispenv{%
+  \ifx\SETdispenvsize\nosmallword
+  \else
+    \ifnum \lastpenalty=10000 \else \endgraf \fi
+    \smallexamplefonts \rm
+  \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it in one command.  #1 is the env name, #2 the definition.
+\def\makedispenvdef#1#2{%
+  \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}%
+  \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}%
+  \expandafter\let\csname E#1\endcsname \afterenvbreak
+  \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two environment synonyms (#1 and #2) for an environment.
+\def\maketwodispenvdef#1#2#3{%
+  \makedispenvdef{#1}{#3}%
+  \makedispenvdef{#2}{#3}%
+}
+%
+% @lisp: indented, narrowed, typewriter font;
+% @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvdef{lisp}{example}{%
+  \nonfillstart
+  \tt\setupmarkupstyle{example}%
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenvdef{display}{%
+  \nonfillstart
+  \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenvdef{format}{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \advance\leftskip by 0pt plus 1fill\relax
+  \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @raggedright does more-or-less normal line breaking but no right
+% justification.  From plain.tex.
+\envdef\raggedright{%
+  \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax
+}
+\let\Eraggedright\par
+
+\envdef\raggedleft{%
+  \parindent=0pt \leftskip0pt plus2em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedleft\par
+
+\envdef\raggedcenter{%
+  \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedcenter\par
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.  We keep \parskip nonzero in general, since
+% we're doing normal filling.  So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\makedispenvdef{quotation}{\quotationstart}
+%
+\def\quotationstart{%
+  \indentedblockstart % same as \indentedblock, but increase right margin too.
+  \ifx\nonarrowing\relax
+    \advance\rightskip by \lispnarrowing
+  \fi
+  \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+  \par
+  \ifx\quotationauthor\thisisundefined\else
+    % indent a bit.
+    \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+  \fi
+  {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallquotation{\Equotation}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+  \def\temp{#1}%
+  \ifx\temp\empty \else
+    {\bf #1: }%
+  \fi
+}
+
+% @indentedblock is like @quotation, but indents only on the left and
+% has no optional argument.
+% 
+\makedispenvdef{indentedblock}{\indentedblockstart}
+%
+\def\indentedblockstart{%
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+  \else
+    \let\nonarrowing = \relax
+  \fi
+}
+
+% Keep a nonzero parskip for the environment, since we're doing normal filling.
+%
+\def\Eindentedblock{%
+  \par
+  {\parskip=0pt \afterenvbreak}%
+}
+\def\Esmallindentedblock{\Eindentedblock}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+  % Don't do the quotes -- if we do, @set txicodequoteundirected and
+  % @set txicodequotebacktick will not have effect on @verb and
+  % @verbatim, and ?` and !` ligatures won't get disabled.
+  %\do\`\do\'%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \setupmarkupstyle{verb}%
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion.
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+% We typeset each line of the verbatim in an \hbox, so we can handle
+% tabs.  The \global is in case the verbatim line starts with an accent,
+% or some other command that starts with a begin-group.  Otherwise, the
+% entire \verbbox would disappear at the corresponding end-group, before
+% it is typeset.  Meanwhile, we can't have nested verbatim commands
+% (can we?), so the \global won't be overwriting itself.
+\newbox\verbbox
+\def\starttabbox{\global\setbox\verbbox=\hbox\bgroup}
+%
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab
+      \divide\dimen\verbbox by\tabw
+      \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw
+      \advance\dimen\verbbox by\tabw  % advance to next multiple of \tabw
+      \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox
+    }%
+  }
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+  \let\nonarrowing = t%
+  \nonfillstart
+  \tt % easiest (and conventionally used) font for verbatim
+  % The \leavevmode here is for blank lines.  Otherwise, we would
+  % never \starttabbox and the \egroup would end verbatim mode.
+  \def\par{\leavevmode\egroup\box\verbbox\endgraf}%
+  \tabexpand
+  \setupmarkupstyle{verbatim}%
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count.
+  % Must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters.  Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+  % We really want {...\end verbatim} in the body of the macro, but
+  % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+    \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+  {%
+    \makevalueexpandable
+    \setupverbatim
+    {%
+      \indexnofonts       % Allow `@@' and other weird things in file names.
+      \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}%
+      \edef\tmp{\noexpand\input #1 }
+      \expandafter
+    }\tmp
+    \afterenvbreak
+  }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+  \begingroup
+    \parindent = 0pt  % paragraph indentation looks wrong on title page
+    \scanexp\copyingtext
+  \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+  \ifnum\lastpenalty<10000
+    \medbreak
+    \defunpenalty=10003 % Will keep this @deffn together with the
+                        % following @def command, see below.
+  \else
+    % If there are two @def commands in a row, we'll have a \nobreak,
+    % which is there to keep the function description together with its
+    % header.  But if there's nothing but headers, we need to allow a
+    % break somewhere.  Check specifically for penalty 10002, inserted
+    % by \printdefunline, instead of 10000, since the sectioning
+    % commands also insert a nobreak penalty, and we don't want to allow
+    % a break between a section heading and a defun.
+    %
+    % As a further refinement, we avoid "club" headers by signalling
+    % with penalty of 10003 after the very first @deffn in the
+    % sequence (see above), and penalty of 10002 after any following
+    % @def command.
+    \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+    %
+    % Similarly, after a section heading, do not allow a break.
+    % But do insert the glue.
+    \medskip  % preceded by discardable penalty, so not a breakpoint
+  \fi
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+  % First, check whether we are in the right environment:
+  \checkenv#1%
+  %
+  % As above, allow line break if we have multiple x headers in a row.
+  % It's not a great place, though.
+  \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+  %
+  % And now, it's time to reuse the body of the original defun:
+  \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+  \begingroup
+    % call \deffnheader:
+    #1#2 \endheader
+    % common ending:
+    \interlinepenalty = 10000
+    \advance\rightskip by 0pt plus 1fil\relax
+    \endgraf
+    \nobreak\vskip -\parskip
+    \penalty\defunpenalty  % signal to \startdefun and \dodefunx
+    % Some of the @defun-type tags do not enable magic parentheses,
+    % rendering the following check redundant.  But we don't optimize.
+    \checkparencounts
+  \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remaining is to define \deffnheader.
+%
+\def\makedefun#1{%
+  \expandafter\let\csname E#1\endcsname = \Edefun
+  \edef\temp{\noexpand\domakedefun
+    \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+  \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader { (defn. of \deffnheader) }
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+  \envdef#1{%
+    \startdefun
+    \doingtypefnfalse    % distinguish typed functions from all else
+    \parseargusing\activeparens{\printdefunline#3}%
+  }%
+  \def#2{\dodefunx#1}%
+  \def#3%
+}
+
+\newif\ifdoingtypefn       % doing typed function?
+\newif\ifrettypeownline    % typeset return type on its own line?
+
+% @deftypefnnewline on|off says whether the return type of typed functions
+% are printed on their own line.  This affects @deftypefn, @deftypefun,
+% @deftypeop, and @deftypemethod.
+% 
+\parseargdef\deftypefnnewline{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETtxideftypefnnl\endcsname
+      = \empty
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETtxideftypefnnl\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @txideftypefnnl value `\temp',
+                must be on|off}%
+  \fi\fi
+}
+
+% \dosubind {index}{topic}{subtopic}
+%
+% If SUBTOPIC is present, precede it with a space, and call \doind.
+% (At some time during the 20th century, this made a two-level entry in an 
+% index such as the operation index.  Nobody seemed to notice the change in 
+% behaviour though.)
+\def\dosubind#1#2#3{%
+  \def\thirdarg{#3}%
+  \ifx\thirdarg\empty
+    \doind{#1}{#2}%
+  \else
+    \doind{#1}{#2\space#3}%
+  \fi
+}
+
+% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+  \dosubind{fn}{\code{#3}}{#1}%
+  \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{fn}{\code{#4}}{#1}%
+  \doingtypefntrue
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+  \dosubind{vr}{\code{#4}}{#1}%
+  \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+% Types:
+
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+  \doind{tp}{\code{#2}}%
+  \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+  \par
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \advance\leftskip by -\defbodyindent
+  %
+  % Determine if we are typesetting the return type of a typed function
+  % on a line by itself.
+  \rettypeownlinefalse
+  \ifdoingtypefn  % doing a typed function specifically?
+    % then check user option for putting return type on its own line:
+    \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else
+      \rettypeownlinetrue
+    \fi
+  \fi
+  %
+  % How we'll format the category name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \def\temp{#1}%
+  \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+  %
+  % Figure out line sizes for the paragraph shape.  We'll always have at
+  % least two.
+  \tempnum = 2
+  %
+  % The first line needs space for \box0; but if \rightskip is nonzero,
+  % we need only space for the part of \box0 which exceeds it:
+  \dimen0=\hsize  \advance\dimen0 by -\wd0  \advance\dimen0 by \rightskip
+  %
+  % If doing a return type on its own line, we'll have another line.
+  \ifrettypeownline
+    \advance\tempnum by 1
+    \def\maybeshapeline{0in \hsize}%
+  \else
+    \def\maybeshapeline{}%
+  \fi
+  %
+  % The continuations:
+  \dimen2=\hsize  \advance\dimen2 by -\defargsindent
+  %
+  % The final paragraph shape:
+  \parshape \tempnum  0in \dimen0  \maybeshapeline  \defargsindent \dimen2
+  %
+  % Put the category name at the right margin.
+  \noindent
+  \hbox to 0pt{%
+    \hfil\box0 \kern-\hsize
+    % \hsize has to be shortened this way:
+    \kern\leftskip
+    % Intentionally do not respect \rightskip, since we need the space.
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \exdentamount=\defbodyindent
+  {%
+    % defun fonts. We use typewriter by default (used to be bold) because:
+    % . we're printing identifiers, they should be in tt in principle.
+    % . in languages with many accents, such as Czech or French, it's
+    %   common to leave accents off identifiers.  The result looks ok in
+    %   tt, but exceedingly strange in rm.
+    % . we don't want -- and --- to be treated as ligatures.
+    % . this still does not fix the ?` and !` ligatures, but so far no
+    %   one has made identifiers using them :).
+    \df \tt
+    \def\temp{#2}% text of the return type
+    \ifx\temp\empty\else
+      \tclose{\temp}% typeset the return type
+      \ifrettypeownline
+        % put return type on its own line; prohibit line break following:
+        \hfil\vadjust{\nobreak}\break  
+      \else
+        \space  % type on same line, so just followed by a space
+      \fi
+    \fi           % no return type
+    #3% output function name
+  }%
+  {\rm\enskip}% hskip 0.5 em of \rmfont
+  %
+  \boldbrax
+  % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name.  This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable.  Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+  % use sl by default (not ttsl),
+  % tt for the names.
+  \df \sl \hyphenchar\font=0
+  %
+  % On the other hand, if an argument has two dashes (for instance), we
+  % want a way to get ttsl.  We used to recommend @var for that, so
+  % leave the code in, but it's strange for @var to lead to typewriter.
+  % Nowadays we recommend @code, since the difference between a ttsl hyphen
+  % and a tt hyphen is pretty tiny.  @code also disables ?` !`.
+  \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
+  #1%
+  \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\[=\active \catcode`\]=\active
+  \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+  \activeparens
+  \global\let(=\lparen \global\let)=\rparen
+  \global\let[=\lbrack \global\let]=\rbrack
+  \global\let& = \&
+
+  \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+  \gdef\magicamp{\let&=\amprm}
+}
+\let\ampchar\&
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+  \ifampseen
+    % At the first level, print parens in roman,
+    % otherwise use the default font.
+    \ifnum \parencount=1 \rm \fi
+  \else
+    % The \sf parens (in \boldbrax) actually are a little bolder than
+    % the contained text.  This is especially needed for [ and ] .
+    \sf
+  \fi
+}
+\def\infirstlevel#1{%
+  \ifampseen
+    \ifnum\parencount=1
+      #1%
+    \fi
+  \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+  \global\advance\parencount by 1
+  {\parenfont(}%
+  \infirstlevel \bfafterword
+}
+\def\clnr{%
+  {\parenfont)}%
+  \infirstlevel \sl
+  \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+  \global\advance\brackcount by 1
+  {\bf[}%
+}
+\def\rbrb{%
+  {\bf]}%
+  \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+  \ifnum\parencount=0 \else \badparencount \fi
+  \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+% these should not use \errmessage; the glibc manual, at least, actually
+% has such constructs (when documenting function pointers).
+\def\badparencount{%
+  \message{Warning: unbalanced parentheses in @def...}%
+  \global\parencount=0
+}
+\def\badbrackcount{%
+  \message{Warning: unbalanced square brackets in @def...}%
+  \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\thisisundefined
+  \newwrite\macscribble
+  \def\scantokens#1{%
+    \toks0={#1}%
+    \immediate\openout\macscribble=\jobname.tmp
+    \immediate\write\macscribble{\the\toks0}%
+    \immediate\closeout\macscribble
+    \input \jobname.tmp
+  }
+\fi
+
+% alias because \c means cedilla in @tex or @math
+\let\texinfoc=\c
+
+\newcount\savedcatcodeone
+\newcount\savedcatcodetwo
+
+% Used at the time of macro expansion.
+% Argument is macro body with arguments substituted
+\def\scanmacro#1{%
+  \newlinechar`\^^M
+  \def\xeatspaces{\eatspaces}%
+  %
+  % Temporarily undo catcode changes of \printindex.  Set catcode of @ to
+  % 0 so that @-commands in macro expansions aren't printed literally when 
+  % formatting an index file, where \ is used as the escape character.
+  \savedcatcodeone=\catcode`\@
+  \savedcatcodetwo=\catcode`\\
+  \catcode`\@=0
+  \catcode`\\=\active
+  %
+  % Process the macro body under the current catcode regime.
+  \scantokens{#1@texinfoc}%
+  %
+  \catcode`\@=\savedcatcodeone
+  \catcode`\\=\savedcatcodetwo
+  %
+  % The \texinfoc is to remove the \newlinechar added by \scantokens, and
+  % can be noticed by \parsearg.
+  %   We avoid surrounding the call to \scantokens with \bgroup and \egroup
+  % to allow macros to open or close groups themselves.
+}
+
+% Used for copying and captions
+\def\scanexp#1{%
+  \expandafter\scanmacro\expandafter{#1}%
+}
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+
+% List of all defined macros in the form
+%    \commondummyword\macro1\commondummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+     \toks0 = \expandafter{\macrolist\commondummyword#1}%
+     \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+%   \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+  \expandafter\let
+  \csname#1\expandafter\endcsname
+  \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \
+% to recognize macro arguments; this is the job of \mbodybackslash.
+%
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion.  Must do this non-globally, to
+% confine the change to the current group.
+%
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+%
+\def\scanctxt{% used as subroutine
+  \catcode`\"=\other
+  \catcode`\+=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\~=\other
+  \passthroughcharstrue
+}
+
+\def\scanargctxt{% used for copying and captions, not macros.
+  \scanctxt
+  \catcode`\@=\other
+  \catcode`\\=\other
+  \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{% used for @macro definitions
+  \scanctxt
+  \catcode`\ =\other
+  \catcode`\@=\other
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\^^M=\other
+  \usembodybackslash
+}
+
+% Used when scanning braced macro arguments.  Note, however, that catcode
+% changes here are ineffectual if the macro invocation was nested inside
+% an argument to another Texinfo command.
+\def\macroargctxt{%
+  \scanctxt
+  \catcode`\ =\active
+  \catcode`\^^M=\other
+  \catcode`\\=\active
+}
+
+\def\macrolineargctxt{% used for whole-line arguments without braces
+  \scanctxt
+  \catcode`\{=\other
+  \catcode`\}=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+%
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\margbackslash#1{\char`\#1 }
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}% now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0\relax
+  \else
+     \expandafter\parsemargdef \argl;%
+     \if\paramno>256\relax
+       \ifx\eTeXversion\thisisundefined
+         \errhelp = \EMsimple
+         \errmessage{You need eTeX to compile a file with macros with more than 256 arguments}
+       \fi
+     \fi
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     \addtomacrolist{\the\macname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\parseargdef\unmacro{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\commondummyword\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx #1\relax
+    % remove this
+  \else
+    \noexpand\commondummyword \noexpand#1%
+  \fi
+}
+
+% \getargs -- Parse the arguments to a @macro line.  Set \macname to
+% the name of the macro, and \argl to the braced argument list.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname#1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+% This made use of the feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+
+% Parse the optional {params} list to @macro or @rmacro.
+% Set \paramno to the number of arguments,
+% and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a
+% three-param macro.)  Define \macarg.BLAH for each BLAH in the params
+% list to some hook where the argument is to be expanded.  If there are
+% less than 10 arguments that hook is to be replaced by ##N where N
+% is the position in that list, that is to say the macro arguments are to be
+% defined `a la TeX in the macro body.  
+%
+% That gets used by \mbodybackslash (above).
+%
+% If there are 10 or more arguments, a different technique is used: see
+% \parsemmanyargdef.
+%
+\def\parsemargdef#1;{%
+  \paramno=0\def\paramlist{}%
+  \let\hash\relax
+  % \hash is redefined to `#' later to get it into definitions
+  \let\xeatspaces\relax
+  \parsemargdefxxx#1,;,%
+  \ifnum\paramno<10\relax\else
+    \paramno0\relax
+    \parsemmanyargdef@@#1,;,% 10 or more arguments
+  \fi
+}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% \parsemacbody, \parsermacbody
+%
+% Read recursive and nonrecursive macro bodies. (They're different since
+% rec and nonrec macros end differently.)
+% 
+% We are in \macrobodyctxt, and the \xdef causes backslashshes in the macro 
+% body to be transformed.
+% Set \macrobody to the body of the macro, and call \defmacro.
+%
+{\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+{\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{%
+\xdef\macrobody{\eatcr{#1}}\endgroup\defmacro}}%
+
+% Make @ a letter, so that we can make private-to-Texinfo macro names.
+\edef\texiatcatcode{\the\catcode`\@}
+\catcode `@=11\relax
+
+%%%%%%%%%%%%%% Code for > 10 arguments only   %%%%%%%%%%%%%%%%%%
+
+% If there are 10 or more arguments, a different technique is used, where the
+% hook remains in the body, and when macro is to be expanded the body is
+% processed again to replace the arguments.
+%
+% In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the
+% argument N value and then \edef the body (nothing else will expand because of
+% the catcode regime under which the body was input).
+%
+% If you compile with TeX (not eTeX), and you have macros with 10 or more
+% arguments, no macro can have more than 256 arguments (else error).
+%
+% In case that there are 10 or more arguments we parse again the arguments
+% list to set new definitions for the \macarg.BLAH macros corresponding to
+% each BLAH argument. It was anyhow needed to parse already once this list
+% in order to count the arguments, and as macros with at most 9 arguments
+% are by far more frequent than macro with 10 or more arguments, defining
+% twice the \macarg.BLAH macros does not cost too much processing power.
+\def\parsemmanyargdef@@#1,{%
+  \if#1;\let\next=\relax
+  \else 
+    \let\next=\parsemmanyargdef@@
+    \edef\tempb{\eatspaces{#1}}%
+    \expandafter\def\expandafter\tempa
+       \expandafter{\csname macarg.\tempb\endcsname}%
+    % Note that we need some extra \noexpand\noexpand, this is because we
+    % don't want \the  to be expanded in the \parsermacbody  as it uses an
+    % \xdef .
+    \expandafter\edef\tempa
+      {\noexpand\noexpand\noexpand\the\toks\the\paramno}%
+    \advance\paramno by 1\relax
+  \fi\next}
+
+
+\let\endargs@\relax
+\let\nil@\relax
+\def\nilm@{\nil@}%
+\long\def\nillm@{\nil@}%
+
+% This macro is expanded during the Texinfo macro expansion, not during its
+% definition.  It gets all the arguments' values and assigns them to macros
+% macarg.ARGNAME
+%
+% #1 is the macro name
+% #2 is the list of argument names
+% #3 is the list of argument values
+\def\getargvals@#1#2#3{%
+  \def\macargdeflist@{}%
+  \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion.
+  \def\paramlist{#2,\nil@}%
+  \def\macroname{#1}%
+  \begingroup
+  \macroargctxt
+  \def\argvaluelist{#3,\nil@}%
+  \def\@tempa{#3}%
+  \ifx\@tempa\empty
+    \setemptyargvalues@
+  \else
+    \getargvals@@
+  \fi
+}
+\def\getargvals@@{%
+  \ifx\paramlist\nilm@
+      % Some sanity check needed here that \argvaluelist is also empty.
+      \ifx\argvaluelist\nillm@
+      \else
+        \errhelp = \EMsimple
+        \errmessage{Too many arguments in macro `\macroname'!}%
+      \fi
+      \let\next\macargexpandinbody@
+  \else
+    \ifx\argvaluelist\nillm@
+       % No more arguments values passed to macro.  Set remaining named-arg
+       % macros to empty.
+       \let\next\setemptyargvalues@
+    \else
+      % pop current arg name into \@tempb
+      \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}%
+      \expandafter\@tempa\expandafter{\paramlist}%
+       % pop current argument value into \@tempc
+      \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}%
+      \expandafter\@tempa\expandafter{\argvaluelist}%
+       % Here \@tempb is the current arg name and \@tempc is the current arg value.
+       % First place the new argument macro definition into \@tempd
+       \expandafter\macname\expandafter{\@tempc}%
+       \expandafter\let\csname macarg.\@tempb\endcsname\relax
+       \expandafter\def\expandafter\@tempe\expandafter{%
+         \csname macarg.\@tempb\endcsname}%
+       \edef\@tempd{\long\def\@tempe{\the\macname}}%
+       \push@\@tempd\macargdeflist@
+       \let\next\getargvals@@
+    \fi
+  \fi
+  \next
+}
+
+\def\push@#1#2{%
+  \expandafter\expandafter\expandafter\def
+  \expandafter\expandafter\expandafter#2%
+  \expandafter\expandafter\expandafter{%
+  \expandafter#1#2}%
+}
+
+% Replace arguments by their values in the macro body, and place the result
+% in macro \@tempa.
+% 
+\def\macvalstoargs@{%
+  %  To do this we use the property that token registers that are \the'ed
+  % within an \edef  expand only once. So we are going to place all argument
+  % values into respective token registers.
+  %
+  % First we save the token context, and initialize argument numbering.
+  \begingroup
+    \paramno0\relax
+    % Then, for each argument number #N, we place the corresponding argument
+    % value into a new token list register \toks#N
+    \expandafter\putargsintokens@\saveparamlist@,;,%
+    % Then, we expand the body so that argument are replaced by their
+    % values. The trick for values not to be expanded themselves is that they
+    % are within tokens and that tokens expand only once in an \edef .
+    \edef\@tempc{\csname mac.\macroname .body\endcsname}%
+    % Now we restore the token stack pointer to free the token list registers
+    % which we have used, but we make sure that expanded body is saved after
+    % group.
+    \expandafter
+  \endgroup
+  \expandafter\def\expandafter\@tempa\expandafter{\@tempc}%
+  }
+
+% Define the named-macro outside of this group and then close this group. 
+% 
+\def\macargexpandinbody@{% 
+  \expandafter
+  \endgroup
+  \macargdeflist@
+  % First the replace in body the macro arguments by their values, the result
+  % is in \@tempa .
+  \macvalstoargs@
+  % Then we point at the \norecurse or \gobble (for recursive) macro value
+  % with \@tempb .
+  \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname
+  % Depending on whether it is recursive or not, we need some tailing
+  % \egroup .
+  \ifx\@tempb\gobble
+     \let\@tempc\relax
+  \else
+     \let\@tempc\egroup
+  \fi
+  % And now we do the real job:
+  \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}%
+  \@tempd
+}
+
+\def\putargsintokens@#1,{%
+  \if#1;\let\next\relax
+  \else
+    \let\next\putargsintokens@
+    % First we allocate the new token list register, and give it a temporary
+    % alias \@tempb .
+    \toksdef\@tempb\the\paramno
+    % Then we place the argument value into that token list register.
+    \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname
+    \expandafter\@tempb\expandafter{\@tempa}%
+    \advance\paramno by 1\relax
+  \fi
+  \next
+}
+
+% Trailing missing arguments are set to empty.
+% 
+\def\setemptyargvalues@{%
+  \ifx\paramlist\nilm@
+    \let\next\macargexpandinbody@
+  \else
+    \expandafter\setemptyargvaluesparser@\paramlist\endargs@
+    \let\next\setemptyargvalues@
+  \fi
+  \next
+}
+
+\def\setemptyargvaluesparser@#1,#2\endargs@{%
+  \expandafter\def\expandafter\@tempa\expandafter{%
+    \expandafter\def\csname macarg.#1\endcsname{}}%
+  \push@\@tempa\macargdeflist@
+  \def\paramlist{#2}%
+}
+
+% #1 is the element target macro
+% #2 is the list macro
+% #3,#4\endargs@ is the list value
+\def\pop@#1#2#3,#4\endargs@{%
+   \def#1{#3}%
+   \def#2{#4}%
+}
+\long\def\longpop@#1#2#3,#4\endargs@{%
+   \long\def#1{#3}%
+   \long\def#2{#4}%
+}
+
+
+%%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%%
+
+
+% This defines a Texinfo @macro or @rmacro, called by \parsemacbody.
+%    \macrobody has the body of the macro in it, with placeholders for
+% its parameters, looking like "\xeatspaces{\hash 1}".
+%    \paramno is the number of parameters
+%    \paramlist is a TeX parameter text, e.g. "#1,#2,#3,"
+% There are four cases: macros of zero, one, up to nine, and many arguments.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in: @include reads the file inside a group.
+%
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifnum\paramno=1
+    \def\xeatspaces##1{##1}%
+    % This removes the pair of braces around the argument.  We don't
+    % use \eatspaces, because this can cause ends of lines to be lost
+    % when the argument to \eatspaces is read, leading to line-based
+    % commands like "@itemize" not being read correctly.
+  \else
+    \let\xeatspaces\relax % suppress expansion
+  \fi
+  \ifcase\paramno
+  % 0
+    \expandafter\xdef\csname\the\macname\endcsname{%
+      \bgroup
+        \noexpand\spaceisspace
+        \noexpand\endlineisspace
+        \noexpand\expandafter % skip any whitespace after the macro name.
+        \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+    \expandafter\xdef\csname\the\macname @@@\endcsname{%
+      \egroup
+      \noexpand\scanmacro{\macrobody}}%
+  \or % 1
+    \expandafter\xdef\csname\the\macname\endcsname{%
+       \bgroup
+       \noexpand\braceorline
+       \expandafter\noexpand\csname\the\macname @@@\endcsname}%
+    \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+      \egroup
+      \noexpand\scanmacro{\macrobody}%
+      }%
+  \else % at most 9
+    \ifnum\paramno<10\relax
+      % @MACNAME sets the context for reading the macro argument
+      % @MACNAME@@ gets the argument, processes backslashes and appends a 
+      % comma.
+      % @MACNAME@@@ removes braces surrounding the argument list.
+      % @MACNAME@@@@ scans the macro body with arguments substituted.
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \bgroup
+        \noexpand\expandafter  % This \expandafter skip any spaces after the
+        \noexpand\macroargctxt % macro before we change the catcode of space.
+        \noexpand\expandafter
+        \expandafter\noexpand\csname\the\macname @@\endcsname}%
+      \expandafter\xdef\csname\the\macname @@\endcsname##1{%
+          \noexpand\passargtomacro
+          \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}%
+      \expandafter\xdef\csname\the\macname @@@\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname @@@@\endcsname\paramlist{%
+          \egroup\noexpand\scanmacro{\macrobody}}%
+    \else % 10 or more:
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\getargvals@{\the\macname}{\argl}%
+      }%
+      \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody
+      \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble
+    \fi
+  \fi}
+
+\catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+{\catcode`\@=0 \catcode`\\=13  % We need to manipulate \ so use @ as escape
+@catcode`@_=11  % private names
+@catcode`@!=11  % used as argument separator
+
+% \passargtomacro#1#2 -
+% Call #1 with a list of tokens #2, with any doubled backslashes in #2
+% compressed to one.
+%
+% This implementation works by expansion, and not execution (so we cannot use 
+% \def or similar).  This reduces the risk of this failing in contexts where 
+% complete expansion is done with no execution (for example, in writing out to 
+% an auxiliary file for an index entry).
+% 
+% State is kept in the input stream: the argument passed to
+% @look_ahead, @gobble_and_check_finish and @add_segment is
+%
+% THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN  (... rest of input)
+%
+% where:
+% THE_MACRO - name of the macro we want to call
+% ARG_RESULT - argument list we build to pass to that macro
+% PENDING_BS - either a backslash or nothing
+% NEXT_TOKEN - used to look ahead in the input stream to see what's coming next
+
+@gdef@passargtomacro#1#2{%
+  @add_segment #1!{}@relax#2\@_finish\%
+}
+@gdef@_finish{@_finishx} @global@let@_finishx@relax
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 used to look ahead
+%
+% If the next token is not a backslash, process the rest of the argument; 
+% otherwise, remove the next token.
+@gdef@look_ahead#1!#2#3#4{%
+  @ifx#4\%
+   @expandafter@gobble_and_check_finish 
+  @else
+   @expandafter@add_segment
+  @fi#1!{#2}#4#4%
+}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 should be a backslash, which is gobbled.
+% #5 looks ahead
+%
+% Double backslash found.  Add a single backslash, and look ahead.
+@gdef@gobble_and_check_finish#1!#2#3#4#5{%
+  @add_segment#1\!{}#5#5%
+}
+
+@gdef@is_fi{@fi}
+
+% #1 - THE_MACRO ARG_RESULT
+% #2 - PENDING_BS
+% #3 - NEXT_TOKEN
+% #4 is input stream until next backslash
+%
+% Input stream is either at the start of the argument, or just after a 
+% backslash sequence, either a lone backslash, or a doubled backslash.  
+% NEXT_TOKEN contains the first token in the input stream: if it is \finish, 
+% finish; otherwise, append to ARG_RESULT the segment of the argument up until
+% the next backslash.  PENDING_BACKSLASH contains a backslash to represent
+% a backslash just before the start of the input stream that has not been
+% added to ARG_RESULT.
+@gdef@add_segment#1!#2#3#4\{%
+@ifx#3@_finish
+  @call_the_macro#1!%
+@else
+  % append the pending backslash to the result, followed by the next segment
+  @expandafter@is_fi@look_ahead#1#2#4!{\}@fi
+  % this @fi is discarded by @look_ahead.
+  % we can't get rid of it with \expandafter because we don't know how 
+  % long #4 is.
+}
+
+% #1 - THE_MACRO
+% #2 - ARG_RESULT
+% #3 discards the res of the conditional in @add_segment, and @is_fi ends the 
+% conditional.
+@gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}}
+
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% \braceorline MAC is used for a one-argument macro MAC.  It checks
+% whether the next non-whitespace character is a {.  It sets the context
+% for reading the argument (slightly different in the two cases).  Then,
+% to read the argument, in the whole-line case, it then calls the regular
+% \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC.
+% 
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup
+    \macroargctxt
+    \expandafter\passargtomacro
+  \else
+    \macrolineargctxt\expandafter\parsearg
+  \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Make them active and then expand them all to nothing.
+%
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+  {%
+    \expandafter\let\obeyedspace=\empty
+    \addtomacrolist{#1}%
+    \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+  }%
+  \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{%
+  \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references.  The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross,  ,  , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node.  #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+  \ifx\lastnode\empty\else
+    \setref{\lastnode}{#1}%
+    \global\let\lastnode=\empty
+  \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \currentsection,
+%                 or the anchor name.
+% 2) NAME-snt   - section number and type, passed as the SNT arg, or
+%                 empty for anchors.
+% 3) NAME-pg    - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat.  In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof   - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+  \pdfmkdest{#1}%
+  \iflinks
+    {%
+      \requireauxfile
+      \atdummies  % preserve commands, but don't expand them
+      % match definition in \xrdef, \refx, \xrefX.
+      \def\value##1{##1}%
+      \edef\writexrdef##1##2{%
+	\write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+	  ##1}{##2}}% these are parameters of \writexrdef
+      }%
+      \toks0 = \expandafter{\currentsection}%
+      \immediate \writexrdef{title}{\the\toks0 }%
+      \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+      \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout
+    }%
+  \fi
+}
+
+% @xrefautosectiontitle on|off says whether @section(ing) names are used
+% automatically in xrefs, if the third arg is not explicitly specified.
+% This was provided as a "secret" @set xref-automatic-section-title
+% variable, now it's official.
+% 
+\parseargdef\xrefautomaticsectiontitle{%
+  \def\temp{#1}%
+  \ifx\temp\onword
+    \expandafter\let\csname SETxref-automatic-section-title\endcsname
+      = \empty
+  \else\ifx\temp\offword
+    \expandafter\let\csname SETxref-automatic-section-title\endcsname
+      = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @xrefautomaticsectiontitle value `\temp',
+                must be on|off}%
+  \fi\fi
+}
+
+% 
+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref{\putwordsee{} \xrefXX}
+\def\xref{\putwordSee{} \xrefXX}
+\def\ref{\xrefXX}
+
+\def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX}
+\def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]}
+%
+\newbox\toprefbox
+\newbox\printedrefnamebox
+\newbox\infofilenamebox
+\newbox\printedmanualbox
+%
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  %
+  % Get args without leading/trailing spaces.
+  \def\printedrefname{\ignorespaces #3}%
+  \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}%
+  %
+  \def\infofilename{\ignorespaces #4}%
+  \setbox\infofilenamebox = \hbox{\infofilename\unskip}%
+  %
+  \def\printedmanual{\ignorespaces #5}%
+  \setbox\printedmanualbox  = \hbox{\printedmanual\unskip}%
+  %
+  % If the printed reference name (arg #3) was not explicitly given in
+  % the @xref, figure out what we want to use.
+  \ifdim \wd\printedrefnamebox = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax
+      % Not auto section-title: use node name inside the square brackets.
+      \def\printedrefname{\ignorespaces #1}%
+    \else
+      % Auto section-title: use chapter/section title inside
+      % the square brackets if we have it.
+      \ifdim \wd\printedmanualbox > 0pt
+        % It is in another manual, so we don't have it; use node name.
+        \def\printedrefname{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We (should) know the real title if we have the xref values.
+          \def\printedrefname{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printedrefname{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % Make link in pdf output.
+  \ifpdf
+    % For pdfTeX and LuaTeX
+    {\indexnofonts
+     \makevalueexpandable
+     \turnoffactive
+     % This expands tokens, so do it after making catcode changes, so _
+     % etc. don't get their TeX definitions.  This ignores all spaces in
+     % #4, including (wrongly) those in the middle of the filename.
+     \getfilename{#4}%
+     %
+     % This (wrongly) does not take account of leading or trailing
+     % spaces in #1, which should be ignored.
+     \setpdfdestname{#1}%
+     %
+     \ifx\pdfdestname\empty
+       \def\pdfdestname{Top}% no empty targets
+     \fi
+     %
+     \leavevmode
+     \startlink attr{/Border [0 0 0]}%
+     \ifnum\filenamelength>0
+       goto file{\the\filename.pdf} name{\pdfdestname}%
+     \else
+       goto name{\pdfmkpgn{\pdfdestname}}%
+     \fi
+    }%
+    \setcolor{\linkcolor}%
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+    \else
+      % For XeTeX
+      {\indexnofonts
+       \makevalueexpandable
+       \turnoffactive
+       % This expands tokens, so do it after making catcode changes, so _
+       % etc. don't get their TeX definitions.  This ignores all spaces in
+       % #4, including (wrongly) those in the middle of the filename.
+       \getfilename{#4}%
+       %
+       % This (wrongly) does not take account of leading or trailing
+       % spaces in #1, which should be ignored.
+       \setpdfdestname{#1}%
+       %
+       \ifx\pdfdestname\empty
+         \def\pdfdestname{Top}% no empty targets
+       \fi
+       %
+       \leavevmode
+       \ifnum\filenamelength>0
+         % With default settings,
+         % XeTeX (xdvipdfmx) replaces link destination names with integers.
+         % In this case, the replaced destination names of
+         % remote PDFs are no longer known.  In order to avoid a replacement,
+         % you can use xdvipdfmx's command line option `-C 0x0010'.
+         % If you use XeTeX 0.99996+ (TeX Live 2016+),
+         % this command line option is no longer necessary
+         % because we can use the `dvipdfmx:config' special.
+         \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
+           << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}%
+       \else
+         \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A
+           << /S /GoTo /D (\pdfdestname) >> >>}%
+       \fi
+      }%
+      \setcolor{\linkcolor}%
+    \fi
+  \fi
+  {%
+    % Have to otherify everything special to allow the \csname to
+    % include an _ in the xref name, etc.
+    \indexnofonts
+    \turnoffactive
+    \def\value##1{##1}%
+    \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+      \csname XR#1-title\endcsname
+  }%
+  %
+  % Float references are printed completely differently: "Figure 1.2"
+  % instead of "[somenode], p.3".  \iffloat distinguishes them by
+  % \Xthisreftitle being set to a magic string.
+  \iffloat\Xthisreftitle
+    % If the user specified the print name (third arg) to the ref,
+    % print it instead of our usual "Figure 1.2".
+    \ifdim\wd\printedrefnamebox = 0pt
+      \refx{#1-snt}{}%
+    \else
+      \printedrefname
+    \fi
+    %
+    % If the user also gave the printed manual name (fifth arg), append
+    % "in MANUALNAME".
+    \ifdim \wd\printedmanualbox > 0pt
+      \space \putwordin{} \cite{\printedmanual}%
+    \fi
+  \else
+    % node/anchor (non-float) references.
+    % 
+    % If we use \unhbox to print the node names, TeX does not insert
+    % empty discretionaries after hyphens, which means that it will not
+    % find a line break at a hyphen in a node names.  Since some manuals
+    % are best written with fairly long node names, containing hyphens,
+    % this is a loss.  Therefore, we give the text of the node name
+    % again, so it is as if TeX is seeing it for the first time.
+    % 
+    \ifdim \wd\printedmanualbox > 0pt
+      % Cross-manual reference with a printed manual name.
+      % 
+      \crossmanualxref{\cite{\printedmanual\unskip}}%
+    %
+    \else\ifdim \wd\infofilenamebox > 0pt
+      % Cross-manual reference with only an info filename (arg 4), no
+      % printed manual name (arg 5).  This is essentially the same as
+      % the case above; we output the filename, since we have nothing else.
+      % 
+      \crossmanualxref{\code{\infofilename\unskip}}%
+    %
+    \else
+      % Reference within this manual.
+      %
+      % _ (for example) has to be the character _ for the purposes of the
+      % control sequence corresponding to the node, but it has to expand
+      % into the usual \leavevmode...\vrule stuff for purposes of
+      % printing. So we \turnoffactive for the \refx-snt, back on for the
+      % printing, back off for the \refx-pg.
+      {\turnoffactive
+       % Only output a following space if the -snt ref is nonempty; for
+       % @unnumbered and @anchor, it won't be.
+       \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+       \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+      }%
+      % output the `[mynode]' via the macro below so it can be overridden.
+      \xrefprintnodename\printedrefname
+      %
+      % But we always want a comma and a space:
+      ,\space
+      %
+      % output the `page 3'.
+      \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+      % Add a , if xref followed by a space
+      \if\space\noexpand\tokenafterxref ,%
+      \else\ifx\	\tokenafterxref ,% @TAB
+      \else\ifx\*\tokenafterxref ,%   @*
+      \else\ifx\ \tokenafterxref ,%   @SPACE
+      \else\ifx\
+                \tokenafterxref ,%    @NL
+      \else\ifx\tie\tokenafterxref ,% @tie
+      \fi\fi\fi\fi\fi\fi
+    \fi\fi
+  \fi
+  \endlink
+\endgroup}
+
+% Output a cross-manual xref to #1.  Used just above (twice).
+% 
+% Only include the text "Section ``foo'' in" if the foo is neither
+% missing or Top.  Thus, @xref{,,,foo,The Foo Manual} outputs simply
+% "see The Foo Manual", the idea being to refer to the whole manual.
+% 
+% But, this being TeX, we can't easily compare our node name against the
+% string "Top" while ignoring the possible spaces before and after in
+% the input.  By adding the arbitrary 7sp below, we make it much less
+% likely that a real node name would have the same width as "Top" (e.g.,
+% in a monospaced font).  Hopefully it will never happen in practice.
+% 
+% For the same basic reason, we retypeset the "Top" at every
+% reference, since the current font is indeterminate.
+% 
+\def\crossmanualxref#1{%
+  \setbox\toprefbox = \hbox{Top\kern7sp}%
+  \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}%
+  \ifdim \wd2 > 7sp  % nonempty?
+    \ifdim \wd2 = \wd\toprefbox \else  % same as Top?
+      \putwordSection{} ``\printedrefname'' \putwordin{}\space
+    \fi
+  \fi
+  #1%
+}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+\def\Yappendix{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% \refx{NAME}{SUFFIX} - reference a cross-reference string named NAME.  SUFFIX 
+% is output afterwards if non-empty.
+\def\refx#1#2{%
+  \requireauxfile
+  {%
+    \indexnofonts
+    \otherbackslash
+    \def\value##1{##1}%
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname XR#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        {\toks0 = {#1}% avoid expansion of possibly-complex value
+         \message{\linenumber Undefined cross reference `\the\toks0'.}}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.  Define a control 
+% sequence for a cross-reference target (we prepend XR to the control sequence 
+% name to avoid collisions).  The value is the page number.  If this is a float 
+% type, we have more work to do.
+%
+\def\xrdef#1#2{%
+  {% Expand the node or anchor name to remove control sequences.
+   % \turnoffactive stops 8-bit characters being changed to commands
+   % like @'e.  \refx does the same to retrieve the value in the definition.
+    \indexnofonts
+    \turnoffactive
+    \def\value##1{##1}%
+    \xdef\safexrefname{#1}%
+  }%
+  %
+  \bgroup
+    \expandafter\gdef\csname XR\safexrefname\endcsname{#2}%
+  \egroup
+  % We put the \gdef inside a group to avoid the definitions building up on 
+  % TeX's save stack, which can cause it to run out of space for aux files with 
+  % thousands of lines.  \gdef doesn't use the save stack, but \csname does
+  % when it defines an unknown control sequence as \relax. 
+  %
+  % Was that xref control sequence that we just defined for a float?
+  \expandafter\iffloat\csname XR\safexrefname\endcsname
+    % it was a float, and we have the (safe) float type in \iffloattype.
+    \expandafter\let\expandafter\floatlist
+      \csname floatlist\iffloattype\endcsname
+    %
+    % Is this the first time we've seen this float type?
+    \expandafter\ifx\floatlist\relax
+      \toks0 = {\do}% yes, so just \do
+    \else
+      % had it before, so preserve previous elements in list.
+      \toks0 = \expandafter{\floatlist\do}%
+    \fi
+    %
+    % Remember this xref in the control sequence \floatlistFLOATTYPE,
+    % for later use in \listoffloats.
+    \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+      {\safexrefname}}%
+  \fi
+}
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate at the beginning of the file.
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% Used when writing to the aux file, or when using data from it.
+\def\requireauxfile{%
+  \iflinks
+    \tryauxfile
+    % Open the new aux file.  TeX will close it automatically at exit.
+    \immediate\openout\auxfile=\jobname.aux
+  \fi
+  \global\let\requireauxfile=\relax   % Only do this once.
+}
+
+% Read the last existing aux file, if any.  No error if none exists.
+%
+\def\tryauxfile{%
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \readdatafile{aux}%
+    \global\havexrefstrue
+  \fi
+  \closein 1
+}
+
+\def\setupdatafile{%
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
+  % supported in the main text, it doesn't seem desirable.  Furthermore,
+  % that is not enough: for node names that actually contain a ^
+  % character, we would end up writing a line like this: 'xrdef {'hat
+  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+  % argument, and \hat is not an expandable control sequence.  It could
+  % all be worked out, but why?  Either we support ^^ or we don't.
+  %
+  % The other change necessary for this was to define \auxhat:
+  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+  % and then to call \auxhat in \setq.
+  %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % This is to support \ in node names and titles, since the \
+  % characters end up in a \csname.  It's easier than
+  % leaving it active and making its active definition an actual \
+  % character.  What I don't understand is why it works in the *value*
+  % of the xrdef.  Seems like it should be a catcode12 \, and that
+  % should not typeset properly.  But it works, so I'm moving on for
+  % now.  --karl, 15jan04.
+  \catcode`\\=\other
+  %
+  % @ is our escape character in .aux files, and we need braces.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+  \setupdatafile
+  \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for Info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+\gdef\dofootnote{%
+  \insert\footins\bgroup
+  %
+  % Nested footnotes are not supported in TeX, that would take a lot
+  % more work.  (\startsavinginserts does not suffice.)
+  \let\footnote=\errfootnotenest
+  %
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\txipagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  %
+  % Invoke rest of plain TeX footnote routine.
+  \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+\def\errfootnotenest{%
+  \errhelp=\EMsimple
+  \errmessage{Nested footnotes not supported in texinfo.tex,
+    even though they work in makeinfo; sorry}
+}
+
+\def\errfootnoteheading{%
+  \errhelp=\EMsimple
+  \errmessage{Footnotes in chapters, sections, etc., are not supported}
+}
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished.  Otherwise, the insertion
+% would be lost.
+% Similarly, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes.  --kasal, 16nov03.
+%
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+  \ifx \insert\ptexinsert
+    \let\insert\saveinsert
+  \else
+    \let\checkinserts\relax
+  \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+  \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+  \afterassignment\next
+  % swallow the left brace
+  \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+  \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+    {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+  \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials  %  ;-)
+  \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+  \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+  \next
+}
+\def\newsaveinsX #1{%
+  \csname newbox\endcsname #1%
+  \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+    \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from https://ctan.org/texarchive/macros/texinfo/texinfo/doc/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\thisisundefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  \def\xprocessmacroarg{\eatspaces}% in case we are being used via a macro
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+  \else \ifx\centersub\centerV
+    % for @center @image, we need a vbox so we can have our vertical space
+    \imagevmodetrue
+    \vbox\bgroup % vbox has better behavior than vtop herev
+  \fi\fi
+  %
+  \ifimagevmode
+    \nobreak\medskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below.
+    \nobreak\vskip\parskip
+    \nobreak
+  \fi
+  %
+  % Leave vertical mode so that indentation from an enclosing
+  %  environment such as @quotation is respected.
+  % However, if we're at the top level, we don't want the
+  %  normal paragraph indentation.
+  % On the other hand, if we are in the case of @center @image, we don't
+  %  want to start a paragraph, which will create a hsize-width box and
+  %  eradicate the centering.
+  \ifx\centersub\centerV\else \noindent \fi
+  %
+  % Output the image.
+  \ifpdf
+    % For pdfTeX and LuaTeX <= 0.80
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+      % For epsf.tex
+      % \epsfbox itself resets \epsf?size at each figure.
+      \setbox0 = \hbox{\ignorespaces #2}%
+        \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+      \setbox0 = \hbox{\ignorespaces #3}%
+        \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+      \epsfbox{#1.eps}%
+    \else
+      % For XeTeX
+      \doxeteximage{#1}{#2}{#3}%
+    \fi
+  \fi
+  %
+  \ifimagevmode
+    \medskip  % space after a standalone image
+  \fi  
+  \ifx\centersub\centerV \egroup \fi
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc.  We don't actually implement floating yet, we always include the
+% float "here".  But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc.  Can't contain commas.  If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label.  Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored.  It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+  \let\thiscaption=\empty
+  \let\thisshortcaption=\empty
+  %
+  % don't lose footnotes inside @float.
+  %
+  % BEWARE: when the floats start float, we have to issue warning whenever an
+  % insert appears inside a float which could possibly float. --kasal, 26may04
+  %
+  \startsavinginserts
+  %
+  % We can't be used inside a paragraph.
+  \par
+  %
+  \vtop\bgroup
+    \def\floattype{#1}%
+    \def\floatlabel{#2}%
+    \def\floatloc{#3}% we do nothing with this yet.
+    %
+    \ifx\floattype\empty
+      \let\safefloattype=\empty
+    \else
+      {%
+        % the floattype might have accents or other special characters,
+        % but we need to use it in a control sequence name.
+        \indexnofonts
+        \turnoffactive
+        \xdef\safefloattype{\floattype}%
+      }%
+    \fi
+    %
+    % If label is given but no type, we handle that as the empty type.
+    \ifx\floatlabel\empty \else
+      % We want each FLOATTYPE to be numbered separately (Figure 1,
+      % Table 1, Figure 2, ...).  (And if no label, no number.)
+      %
+      \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+      \global\advance\floatno by 1
+      %
+      {%
+        % This magic value for \currentsection is output by \setref as the
+        % XREFLABEL-title value.  \xrefX uses it to distinguish float
+        % labels (which have a completely different output format) from
+        % node and anchor labels.  And \xrdef uses it to construct the
+        % lists of floats.
+        %
+        \edef\currentsection{\floatmagic=\safefloattype}%
+        \setref{\floatlabel}{Yfloat}%
+      }%
+    \fi
+    %
+    % start with \parskip glue, I guess.
+    \vskip\parskip
+    %
+    % Don't suppress indentation if a float happens to start a section.
+    \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption:    Foo 1.1
+% @float Foo & @caption{Cap}:     Foo: Cap
+% @float Foo & no caption:        Foo
+% @float ,lbl & Caption{Cap}:     1.1: Cap
+% @float ,lbl & no caption:       1.1
+% @float & @caption{Cap}:         Cap
+% @float & no caption:
+%
+\def\Efloat{%
+    \let\floatident = \empty
+    %
+    % In all cases, if we have a float type, it comes first.
+    \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+    %
+    % If we have an xref label, the number comes next.
+    \ifx\floatlabel\empty \else
+      \ifx\floattype\empty \else % if also had float type, need tie first.
+        \appendtomacro\floatident{\tie}%
+      \fi
+      % the number.
+      \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+    \fi
+    %
+    % Start the printed caption with what we've constructed in
+    % \floatident, but keep it separate; we need \floatident again.
+    \let\captionline = \floatident
+    %
+    \ifx\thiscaption\empty \else
+      \ifx\floatident\empty \else
+        \appendtomacro\captionline{: }% had ident, so need a colon between
+      \fi
+      %
+      % caption text.
+      \appendtomacro\captionline{\scanexp\thiscaption}%
+    \fi
+    %
+    % If we have anything to print, print it, with space before.
+    % Eventually this needs to become an \insert.
+    \ifx\captionline\empty \else
+      \vskip.5\parskip
+      \captionline
+      %
+      % Space below caption.
+      \vskip\parskip
+    \fi
+    %
+    % If have an xref label, write the list of floats info.  Do this
+    % after the caption, to avoid chance of it being a breakpoint.
+    \ifx\floatlabel\empty \else
+      % Write the text that goes in the lof to the aux file as
+      % \floatlabel-lof.  Besides \floatident, we include the short
+      % caption if specified, else the full caption if specified, else nothing.
+      {%
+        \requireauxfile
+        \atdummies
+        %
+        \ifx\thisshortcaption\empty
+          \def\gtemp{\thiscaption}%
+        \else
+          \def\gtemp{\thisshortcaption}%
+        \fi
+        \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+          \ifx\gtemp\empty \else : \gtemp \fi}}%
+      }%
+    \fi
+  \egroup  % end of \vtop
+  %
+  \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+  \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use.  Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+  \ifx#1\relax
+      % Haven't seen this figure type before.
+      \csname newcount\endcsname #1%
+      %
+      % Remember to reset this floatno at the next chap.
+      \expandafter\gdef\expandafter\resetallfloatnos
+        \expandafter{\resetallfloatnos #1=0 }%
+  \fi
+  \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value.  We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1".  We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref.  That is, the magic
+% \currentsection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string.  If so, #2 will be the
+% (safe) float type for this float.  We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+  \def\temp{#1}%
+  \def\iffloattype{#2}%
+  \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+  \def\floattype{#1}% floattype
+  {%
+    % the floattype might have accents or other special characters,
+    % but we need to use it in a control sequence name.
+    \indexnofonts
+    \turnoffactive
+    \xdef\safefloattype{\floattype}%
+  }%
+  %
+  % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+  \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+    \ifhavexrefs
+      % if the user said @listoffloats foo but never @float foo.
+      \message{\linenumber No `\safefloattype' floats to list.}%
+    \fi
+  \else
+    \begingroup
+      \leftskip=\tocindent  % indent these entries like a toc
+      \let\do=\listoffloatsdo
+      \csname floatlist\safefloattype\endcsname
+    \endgroup
+  \fi
+}
+
+% This is called on each entry in a list of floats.  We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file.  We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+  % Can't fully expand XR#1-lof because it can contain anything.  Just
+  % pass the control sequence.  On the other hand, XR#1-pg is just the
+  % page number, and we want to fully expand that so we can get a link
+  % in pdf output.
+  \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+  %
+  % use the same \entry macro we use to generate the TOC and index.
+  \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+  \writeentry
+}}
+
+
+\message{localization,}
+
+% For single-language documents, @documentlanguage is usually given very
+% early, just after @documentencoding.  Single argument is the language
+% (de) or locale (de_DE) abbreviation.
+%
+{
+  \catcode`\_ = \active
+  \globaldefs=1
+\parseargdef\documentlanguage{%
+  \tex % read txi-??.tex file in plain TeX.
+    % Read the file by the name they passed if it exists.
+    \let_ = \normalunderscore  % normal _ character for filename test
+    \openin 1 txi-#1.tex
+    \ifeof 1
+      \documentlanguagetrywithoutunderscore #1_\finish
+    \else
+      \globaldefs = 1  % everything in the txi-LL files needs to persist
+      \input txi-#1.tex
+    \fi
+    \closein 1
+  \endgroup % end raw TeX
+}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+%
+\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
+  \openin 1 txi-#1.tex
+  \ifeof 1
+    \errhelp = \nolanghelp
+    \errmessage{Cannot read language file txi-#1.tex}%
+  \else
+    \globaldefs = 1  % everything in the txi-LL files needs to persist
+    \input txi-#1.tex
+  \fi
+  \closein 1
+}
+}% end of special _ catcode
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  Putting it in the current
+directory should work if nowhere else does.}
+
+% This macro is called from txi-??.tex files; the first argument is the
+% \language name to set (without the "\lang@" prefix), the second and
+% third args are \{left,right}hyphenmin.
+%
+% The language names to pass are determined when the format is built.
+% See the etex.log file created at that time, e.g.,
+% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
+%
+% With TeX Live 2008, etex now includes hyphenation patterns for all
+% available languages.  This means we can support hyphenation in
+% Texinfo, at least to some extent.  (This still doesn't solve the
+% accented characters problem.)
+%
+\catcode`@=11
+\def\txisetlanguage#1#2#3{%
+  % do not set the language if the name is undefined in the current TeX.
+  \expandafter\ifx\csname lang@#1\endcsname \relax
+    \message{no patterns for #1}%
+  \else
+    \global\language = \csname lang@#1\endcsname
+  \fi
+  % but there is no harm in adjusting the hyphenmin values regardless.
+  \global\lefthyphenmin = #2\relax
+  \global\righthyphenmin = #3\relax
+}
+
+% XeTeX and LuaTeX can handle Unicode natively.
+% Their default I/O uses UTF-8 sequences instead of a byte-wise operation.
+% Other TeX engines' I/O (pdfTeX, etc.) is byte-wise.
+%
+\newif\iftxinativeunicodecapable
+\newif\iftxiusebytewiseio
+
+\ifx\XeTeXrevision\thisisundefined
+  \ifx\luatexversion\thisisundefined
+    \txinativeunicodecapablefalse
+    \txiusebytewiseiotrue
+  \else
+    \txinativeunicodecapabletrue
+    \txiusebytewiseiofalse
+  \fi
+\else
+  \txinativeunicodecapabletrue
+  \txiusebytewiseiofalse
+\fi
+
+% Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex
+% for non-UTF-8 (byte-wise) encodings.
+%
+\def\setbytewiseio{%
+  \ifx\XeTeXrevision\thisisundefined
+  \else
+    \XeTeXdefaultencoding "bytes"  % For subsequent files to be read
+    \XeTeXinputencoding "bytes"  % For document root file
+    % Unfortunately, there seems to be no corresponding XeTeX command for
+    % output encoding.  This is a problem for auxiliary index and TOC files.
+    % The only solution would be perhaps to write out @U{...} sequences in
+    % place of non-ASCII characters.
+  \fi
+
+  \ifx\luatexversion\thisisundefined
+  \else
+    \directlua{
+    local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub
+    local function convert_char (char)
+      return utf8_char(byte(char))
+    end
+
+    local function convert_line (line)
+      return gsub(line, ".", convert_char)
+    end
+
+    callback.register("process_input_buffer", convert_line)
+
+    local function convert_line_out (line)
+      local line_out = ""
+      for c in string.utfvalues(line) do
+         line_out = line_out .. string.char(c)
+      end
+      return line_out
+    end
+
+    callback.register("process_output_buffer", convert_line_out)
+    }
+  \fi
+
+  \txiusebytewiseiotrue
+}
+
+
+% Helpers for encodings.
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \global\catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+   \count255=128
+   \loop\ifnum\count255<256
+      \catcode\count255=#1\relax
+      \advance\count255 by 1
+   \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz}
+\def\documentencodingzzz#1{%
+  %
+  % Encoding being declared for the document.
+  \def\declaredencoding{\csname #1.enc\endcsname}%
+  %
+  % Supported encodings: names converted to tokens in order to be able
+  % to compare them with \ifx.
+  \def\ascii{\csname US-ASCII.enc\endcsname}%
+  \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+  \def\latone{\csname ISO-8859-1.enc\endcsname}%
+  \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+  \def\utfeight{\csname UTF-8.enc\endcsname}%
+  %
+  \ifx \declaredencoding \ascii
+     \asciichardefs
+  %
+  \else \ifx \declaredencoding \lattwo
+     \iftxinativeunicodecapable
+       \setbytewiseio
+     \fi
+     \setnonasciicharscatcode\active
+     \lattwochardefs
+  %
+  \else \ifx \declaredencoding \latone
+     \iftxinativeunicodecapable
+       \setbytewiseio
+     \fi
+     \setnonasciicharscatcode\active
+     \latonechardefs
+  %
+  \else \ifx \declaredencoding \latnine
+     \iftxinativeunicodecapable
+       \setbytewiseio
+     \fi
+     \setnonasciicharscatcode\active
+     \latninechardefs
+  %
+  \else \ifx \declaredencoding \utfeight
+     \iftxinativeunicodecapable
+       % For native Unicode handling (XeTeX and LuaTeX)
+       \nativeunicodechardefs
+     \else
+       % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX)
+       \setnonasciicharscatcode\active
+       % since we already invoked \utfeightchardefs at the top level
+       % (below), do not re-invoke it, otherwise our check for duplicated
+       % definitions gets triggered.  Making non-ascii chars active is
+       % sufficient.
+     \fi
+  %
+  \else
+    \message{Ignoring unknown document encoding: #1.}%
+  %
+  \fi % utfeight
+  \fi % latnine
+  \fi % latone
+  \fi % lattwo
+  \fi % ascii
+  %
+  \ifx\XeTeXrevision\thisisundefined
+  \else
+    \ifx \declaredencoding \utfeight
+    \else
+      \ifx \declaredencoding \ascii
+      \else
+        \message{Warning: XeTeX with non-UTF-8 encodings cannot handle %
+        non-ASCII characters in auxiliary files.}%
+      \fi
+    \fi
+  \fi
+}
+
+% emacs-page
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing, sorry: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+
+\def\gdefchar#1#2{%
+\gdef#1{%
+   \ifpassthroughchars
+     \string#1%
+   \else
+     #2%
+   \fi
+}}
+
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+  \gdefchar^^a0{\tie}
+  \gdefchar^^a1{\exclamdown}
+  \gdefchar^^a2{{\tcfont \char162}} % cent
+  \gdefchar^^a3{\pounds{}}
+  \gdefchar^^a4{{\tcfont \char164}} % currency
+  \gdefchar^^a5{{\tcfont \char165}} % yen
+  \gdefchar^^a6{{\tcfont \char166}} % broken bar
+  \gdefchar^^a7{\S}
+  \gdefchar^^a8{\"{}}
+  \gdefchar^^a9{\copyright{}}
+  \gdefchar^^aa{\ordf}
+  \gdefchar^^ab{\guillemetleft{}}
+  \gdefchar^^ac{\ensuremath\lnot}
+  \gdefchar^^ad{\-}
+  \gdefchar^^ae{\registeredsymbol{}}
+  \gdefchar^^af{\={}}
+  %
+  \gdefchar^^b0{\textdegree}
+  \gdefchar^^b1{$\pm$}
+  \gdefchar^^b2{$^2$}
+  \gdefchar^^b3{$^3$}
+  \gdefchar^^b4{\'{}}
+  \gdefchar^^b5{$\mu$}
+  \gdefchar^^b6{\P}
+  \gdefchar^^b7{\ensuremath\cdot}
+  \gdefchar^^b8{\cedilla\ }
+  \gdefchar^^b9{$^1$}
+  \gdefchar^^ba{\ordm}
+  \gdefchar^^bb{\guillemetright{}}
+  \gdefchar^^bc{$1\over4$}
+  \gdefchar^^bd{$1\over2$}
+  \gdefchar^^be{$3\over4$}
+  \gdefchar^^bf{\questiondown}
+  %
+  \gdefchar^^c0{\`A}
+  \gdefchar^^c1{\'A}
+  \gdefchar^^c2{\^A}
+  \gdefchar^^c3{\~A}
+  \gdefchar^^c4{\"A}
+  \gdefchar^^c5{\ringaccent A}
+  \gdefchar^^c6{\AE}
+  \gdefchar^^c7{\cedilla C}
+  \gdefchar^^c8{\`E}
+  \gdefchar^^c9{\'E}
+  \gdefchar^^ca{\^E}
+  \gdefchar^^cb{\"E}
+  \gdefchar^^cc{\`I}
+  \gdefchar^^cd{\'I}
+  \gdefchar^^ce{\^I}
+  \gdefchar^^cf{\"I}
+  %
+  \gdefchar^^d0{\DH}
+  \gdefchar^^d1{\~N}
+  \gdefchar^^d2{\`O}
+  \gdefchar^^d3{\'O}
+  \gdefchar^^d4{\^O}
+  \gdefchar^^d5{\~O}
+  \gdefchar^^d6{\"O}
+  \gdefchar^^d7{$\times$}
+  \gdefchar^^d8{\O}
+  \gdefchar^^d9{\`U}
+  \gdefchar^^da{\'U}
+  \gdefchar^^db{\^U}
+  \gdefchar^^dc{\"U}
+  \gdefchar^^dd{\'Y}
+  \gdefchar^^de{\TH}
+  \gdefchar^^df{\ss}
+  %
+  \gdefchar^^e0{\`a}
+  \gdefchar^^e1{\'a}
+  \gdefchar^^e2{\^a}
+  \gdefchar^^e3{\~a}
+  \gdefchar^^e4{\"a}
+  \gdefchar^^e5{\ringaccent a}
+  \gdefchar^^e6{\ae}
+  \gdefchar^^e7{\cedilla c}
+  \gdefchar^^e8{\`e}
+  \gdefchar^^e9{\'e}
+  \gdefchar^^ea{\^e}
+  \gdefchar^^eb{\"e}
+  \gdefchar^^ec{\`{\dotless i}}
+  \gdefchar^^ed{\'{\dotless i}}
+  \gdefchar^^ee{\^{\dotless i}}
+  \gdefchar^^ef{\"{\dotless i}}
+  %
+  \gdefchar^^f0{\dh}
+  \gdefchar^^f1{\~n}
+  \gdefchar^^f2{\`o}
+  \gdefchar^^f3{\'o}
+  \gdefchar^^f4{\^o}
+  \gdefchar^^f5{\~o}
+  \gdefchar^^f6{\"o}
+  \gdefchar^^f7{$\div$}
+  \gdefchar^^f8{\o}
+  \gdefchar^^f9{\`u}
+  \gdefchar^^fa{\'u}
+  \gdefchar^^fb{\^u}
+  \gdefchar^^fc{\"u}
+  \gdefchar^^fd{\'y}
+  \gdefchar^^fe{\th}
+  \gdefchar^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+  % Encoding is almost identical to Latin1.
+  \latonechardefs
+  %
+  \gdefchar^^a4{\euro{}}
+  \gdefchar^^a6{\v S}
+  \gdefchar^^a8{\v s}
+  \gdefchar^^b4{\v Z}
+  \gdefchar^^b8{\v z}
+  \gdefchar^^bc{\OE}
+  \gdefchar^^bd{\oe}
+  \gdefchar^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+  \gdefchar^^a0{\tie}
+  \gdefchar^^a1{\ogonek{A}}
+  \gdefchar^^a2{\u{}}
+  \gdefchar^^a3{\L}
+  \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}}
+  \gdefchar^^a5{\v L}
+  \gdefchar^^a6{\'S}
+  \gdefchar^^a7{\S}
+  \gdefchar^^a8{\"{}}
+  \gdefchar^^a9{\v S}
+  \gdefchar^^aa{\cedilla S}
+  \gdefchar^^ab{\v T}
+  \gdefchar^^ac{\'Z}
+  \gdefchar^^ad{\-}
+  \gdefchar^^ae{\v Z}
+  \gdefchar^^af{\dotaccent Z}
+  %
+  \gdefchar^^b0{\textdegree{}}
+  \gdefchar^^b1{\ogonek{a}}
+  \gdefchar^^b2{\ogonek{ }}
+  \gdefchar^^b3{\l}
+  \gdefchar^^b4{\'{}}
+  \gdefchar^^b5{\v l}
+  \gdefchar^^b6{\'s}
+  \gdefchar^^b7{\v{}}
+  \gdefchar^^b8{\cedilla\ }
+  \gdefchar^^b9{\v s}
+  \gdefchar^^ba{\cedilla s}
+  \gdefchar^^bb{\v t}
+  \gdefchar^^bc{\'z}
+  \gdefchar^^bd{\H{}}
+  \gdefchar^^be{\v z}
+  \gdefchar^^bf{\dotaccent z}
+  %
+  \gdefchar^^c0{\'R}
+  \gdefchar^^c1{\'A}
+  \gdefchar^^c2{\^A}
+  \gdefchar^^c3{\u A}
+  \gdefchar^^c4{\"A}
+  \gdefchar^^c5{\'L}
+  \gdefchar^^c6{\'C}
+  \gdefchar^^c7{\cedilla C}
+  \gdefchar^^c8{\v C}
+  \gdefchar^^c9{\'E}
+  \gdefchar^^ca{\ogonek{E}}
+  \gdefchar^^cb{\"E}
+  \gdefchar^^cc{\v E}
+  \gdefchar^^cd{\'I}
+  \gdefchar^^ce{\^I}
+  \gdefchar^^cf{\v D}
+  %
+  \gdefchar^^d0{\DH}
+  \gdefchar^^d1{\'N}
+  \gdefchar^^d2{\v N}
+  \gdefchar^^d3{\'O}
+  \gdefchar^^d4{\^O}
+  \gdefchar^^d5{\H O}
+  \gdefchar^^d6{\"O}
+  \gdefchar^^d7{$\times$}
+  \gdefchar^^d8{\v R}
+  \gdefchar^^d9{\ringaccent U}
+  \gdefchar^^da{\'U}
+  \gdefchar^^db{\H U}
+  \gdefchar^^dc{\"U}
+  \gdefchar^^dd{\'Y}
+  \gdefchar^^de{\cedilla T}
+  \gdefchar^^df{\ss}
+  %
+  \gdefchar^^e0{\'r}
+  \gdefchar^^e1{\'a}
+  \gdefchar^^e2{\^a}
+  \gdefchar^^e3{\u a}
+  \gdefchar^^e4{\"a}
+  \gdefchar^^e5{\'l}
+  \gdefchar^^e6{\'c}
+  \gdefchar^^e7{\cedilla c}
+  \gdefchar^^e8{\v c}
+  \gdefchar^^e9{\'e}
+  \gdefchar^^ea{\ogonek{e}}
+  \gdefchar^^eb{\"e}
+  \gdefchar^^ec{\v e}
+  \gdefchar^^ed{\'{\dotless{i}}}
+  \gdefchar^^ee{\^{\dotless{i}}}
+  \gdefchar^^ef{\v d}
+  %
+  \gdefchar^^f0{\dh}
+  \gdefchar^^f1{\'n}
+  \gdefchar^^f2{\v n}
+  \gdefchar^^f3{\'o}
+  \gdefchar^^f4{\^o}
+  \gdefchar^^f5{\H o}
+  \gdefchar^^f6{\"o}
+  \gdefchar^^f7{$\div$}
+  \gdefchar^^f8{\v r}
+  \gdefchar^^f9{\ringaccent u}
+  \gdefchar^^fa{\'u}
+  \gdefchar^^fb{\H u}
+  \gdefchar^^fc{\"u}
+  \gdefchar^^fd{\'y}
+  \gdefchar^^fe{\cedilla t}
+  \gdefchar^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+%
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions.  It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+%
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+   \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+  \ifx #1\relax
+    \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+  \else
+    \expandafter #1%
+  \fi
+}
+
+% Give non-ASCII bytes the active definitions for processing UTF-8 sequences
+\begingroup
+  \catcode`\~13
+  \catcode`\$12
+  \catcode`\"12
+
+  % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp
+  % substituting ~ and $ with a character token of that value.
+  \def\UTFviiiLoop{%
+    \global\catcode\countUTFx\active
+    \uccode`\~\countUTFx
+    \uccode`\$\countUTFx
+    \uppercase\expandafter{\UTFviiiTmp}%
+    \advance\countUTFx by 1
+    \ifnum\countUTFx < \countUTFy
+      \expandafter\UTFviiiLoop
+    \fi}
+
+  % For bytes other than the first in a UTF-8 sequence.  Not expected to
+  % be expanded except when writing to auxiliary files.
+  \countUTFx = "80
+  \countUTFy = "C2
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $\fi}}%
+  \UTFviiiLoop
+
+  \countUTFx = "C2
+  \countUTFy = "E0
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $%
+        \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}%
+  \UTFviiiLoop
+
+  \countUTFx = "E0
+  \countUTFy = "F0
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $%
+        \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}%
+  \UTFviiiLoop
+
+  \countUTFx = "F0
+  \countUTFy = "F4
+  \def\UTFviiiTmp{%
+    \gdef~{%
+        \ifpassthroughchars $%
+        \else\expandafter\UTFviiiFourOctets\expandafter$\fi
+        }}%
+  \UTFviiiLoop
+\endgroup
+
+\def\globallet{\global\let} % save some \expandafter's below
+
+% @U{xxxx} to produce U+xxxx, if we support it.
+\def\U#1{%
+  \expandafter\ifx\csname uni:#1\endcsname \relax
+    \iftxinativeunicodecapable
+      % All Unicode characters can be used if native Unicode handling is
+      % active.  However, if the font does not have the glyph,
+      % letters are missing.
+      \begingroup
+        \uccode`\.="#1\relax
+        \uppercase{.}
+      \endgroup
+    \else
+      \errhelp = \EMsimple	
+      \errmessage{Unicode character U+#1 not supported, sorry}%
+    \fi
+  \else
+    \csname uni:#1\endcsname
+  \fi
+}
+
+% These macros are used here to construct the name of a control
+% sequence to be defined.
+\def\UTFviiiTwoOctetsName#1#2{%
+  \csname u8:#1\string #2\endcsname}%
+\def\UTFviiiThreeOctetsName#1#2#3{%
+  \csname u8:#1\string #2\string #3\endcsname}%
+\def\UTFviiiFourOctetsName#1#2#3#4{%
+  \csname u8:#1\string #2\string #3\string #4\endcsname}%
+
+% For UTF-8 byte sequences (TeX, e-TeX and pdfTeX),
+% provide a definition macro to replace a Unicode character;
+% this gets used by the @U command
+%
+\begingroup
+  \catcode`\"=12
+  \catcode`\<=12
+  \catcode`\.=12
+  \catcode`\,=12
+  \catcode`\;=12
+  \catcode`\!=12
+  \catcode`\~=13
+  \gdef\DeclareUnicodeCharacterUTFviii#1#2{%
+    \countUTFz = "#1\relax
+    \begingroup
+      \parseXMLCharref
+    
+      % Give \u8:... its definition.  The sequence of seven \expandafter's
+      % expands after the \gdef three times, e.g.
+      %
+      % 1.  \UTFviiTwoOctetsName B1 B2
+      % 2.  \csname u8:B1 \string B2 \endcsname
+      % 3.  \u8: B1 B2  (a single control sequence token)
+      %
+      \expandafter\expandafter
+      \expandafter\expandafter
+      \expandafter\expandafter
+      \expandafter\gdef       \UTFviiiTmp{#2}%
+      % 
+      \expandafter\ifx\csname uni:#1\endcsname \relax \else
+       \message{Internal error, already defined: #1}%
+      \fi
+      %
+      % define an additional control sequence for this code point.
+      \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp
+    \endgroup}
+  %
+  % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp
+  % to the corresponding UTF-8 sequence.
+  \gdef\parseXMLCharref{%
+    \ifnum\countUTFz < "A0\relax
+      \errhelp = \EMsimple
+      \errmessage{Cannot define Unicode char value < 00A0}%
+    \else\ifnum\countUTFz < "800\relax
+      \parseUTFviiiA,%
+      \parseUTFviiiB C\UTFviiiTwoOctetsName.,%
+    \else\ifnum\countUTFz < "10000\relax
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}%
+    \else
+      \parseUTFviiiA;%
+      \parseUTFviiiA,%
+      \parseUTFviiiA!%
+      \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}%
+    \fi\fi\fi
+  }
+
+  % Extract a byte from the end of the UTF-8 representation of \countUTFx.
+  % It must be a non-initial byte in the sequence.
+  % Change \uccode of #1 for it to be used in \parseUTFviiiB as one
+  % of the bytes.
+  \gdef\parseUTFviiiA#1{%
+    \countUTFx = \countUTFz
+    \divide\countUTFz by 64
+    \countUTFy = \countUTFz  % Save to be the future value of \countUTFz.
+    \multiply\countUTFz by 64
+    
+    % \countUTFz is now \countUTFx with the last 5 bits cleared.  Subtract
+    % in order to get the last five bits.
+    \advance\countUTFx by -\countUTFz
+
+    % Convert this to the byte in the UTF-8 sequence.
+    \advance\countUTFx by 128
+    \uccode `#1\countUTFx
+    \countUTFz = \countUTFy}
+
+  % Used to put a UTF-8 byte sequence into \UTFviiiTmp
+  % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8
+  %    sequence.
+  % #2 is one of the \UTFviii*OctetsName macros.
+  % #3 is always a full stop (.)
+  % #4 is a template for the other bytes in the sequence.  The values for these
+  %    bytes is substituted in here with \uppercase using the \uccode's.
+  \gdef\parseUTFviiiB#1#2#3#4{%
+    \advance\countUTFz by "#10\relax
+    \uccode `#3\countUTFz
+    \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% provide a definition macro that sets a catcode to `other' non-globally
+%
+\def\DeclareUnicodeCharacterNativeOther#1#2{%
+  \catcode"#1=\other
+}
+
+% https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M
+% U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block)
+% U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)
+% U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A
+% U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B
+% 
+% Many of our renditions are less than wonderful, and all the missing
+% characters are available somewhere.  Loading the necessary fonts
+% awaits user request.  We can't truly support Unicode without
+% reimplementing everything that's been done in LaTeX for many years,
+% plus probably using luatex or xetex, and who knows what else.
+% We won't be doing that here in this simple file.  But we can try to at
+% least make most of the characters not bomb out.
+%
+\def\unicodechardefs{%
+  \DeclareUnicodeCharacter{00A0}{\tie}%
+  \DeclareUnicodeCharacter{00A1}{\exclamdown}%
+  \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent
+  \DeclareUnicodeCharacter{00A3}{\pounds{}}%
+  \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency
+  \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen
+  \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar
+  \DeclareUnicodeCharacter{00A7}{\S}%
+  \DeclareUnicodeCharacter{00A8}{\"{ }}%
+  \DeclareUnicodeCharacter{00A9}{\copyright{}}%
+  \DeclareUnicodeCharacter{00AA}{\ordf}%
+  \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}%
+  \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}%
+  \DeclareUnicodeCharacter{00AD}{\-}%
+  \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}%
+  \DeclareUnicodeCharacter{00AF}{\={ }}%
+  %
+  \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}%
+  \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}%
+  \DeclareUnicodeCharacter{00B2}{$^2$}%
+  \DeclareUnicodeCharacter{00B3}{$^3$}%
+  \DeclareUnicodeCharacter{00B4}{\'{ }}%
+  \DeclareUnicodeCharacter{00B5}{$\mu$}%
+  \DeclareUnicodeCharacter{00B6}{\P}%
+  \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}%
+  \DeclareUnicodeCharacter{00B8}{\cedilla{ }}%
+  \DeclareUnicodeCharacter{00B9}{$^1$}%
+  \DeclareUnicodeCharacter{00BA}{\ordm}%
+  \DeclareUnicodeCharacter{00BB}{\guillemetright{}}%
+  \DeclareUnicodeCharacter{00BC}{$1\over4$}%
+  \DeclareUnicodeCharacter{00BD}{$1\over2$}%
+  \DeclareUnicodeCharacter{00BE}{$3\over4$}%
+  \DeclareUnicodeCharacter{00BF}{\questiondown}%
+  %
+  \DeclareUnicodeCharacter{00C0}{\`A}%
+  \DeclareUnicodeCharacter{00C1}{\'A}%
+  \DeclareUnicodeCharacter{00C2}{\^A}%
+  \DeclareUnicodeCharacter{00C3}{\~A}%
+  \DeclareUnicodeCharacter{00C4}{\"A}%
+  \DeclareUnicodeCharacter{00C5}{\AA}%
+  \DeclareUnicodeCharacter{00C6}{\AE}%
+  \DeclareUnicodeCharacter{00C7}{\cedilla{C}}%
+  \DeclareUnicodeCharacter{00C8}{\`E}%
+  \DeclareUnicodeCharacter{00C9}{\'E}%
+  \DeclareUnicodeCharacter{00CA}{\^E}%
+  \DeclareUnicodeCharacter{00CB}{\"E}%
+  \DeclareUnicodeCharacter{00CC}{\`I}%
+  \DeclareUnicodeCharacter{00CD}{\'I}%
+  \DeclareUnicodeCharacter{00CE}{\^I}%
+  \DeclareUnicodeCharacter{00CF}{\"I}%
+  %
+  \DeclareUnicodeCharacter{00D0}{\DH}%
+  \DeclareUnicodeCharacter{00D1}{\~N}%
+  \DeclareUnicodeCharacter{00D2}{\`O}%
+  \DeclareUnicodeCharacter{00D3}{\'O}%
+  \DeclareUnicodeCharacter{00D4}{\^O}%
+  \DeclareUnicodeCharacter{00D5}{\~O}%
+  \DeclareUnicodeCharacter{00D6}{\"O}%
+  \DeclareUnicodeCharacter{00D7}{\ensuremath\times}%
+  \DeclareUnicodeCharacter{00D8}{\O}%
+  \DeclareUnicodeCharacter{00D9}{\`U}%
+  \DeclareUnicodeCharacter{00DA}{\'U}%
+  \DeclareUnicodeCharacter{00DB}{\^U}%
+  \DeclareUnicodeCharacter{00DC}{\"U}%
+  \DeclareUnicodeCharacter{00DD}{\'Y}%
+  \DeclareUnicodeCharacter{00DE}{\TH}%
+  \DeclareUnicodeCharacter{00DF}{\ss}%
+  %
+  \DeclareUnicodeCharacter{00E0}{\`a}%
+  \DeclareUnicodeCharacter{00E1}{\'a}%
+  \DeclareUnicodeCharacter{00E2}{\^a}%
+  \DeclareUnicodeCharacter{00E3}{\~a}%
+  \DeclareUnicodeCharacter{00E4}{\"a}%
+  \DeclareUnicodeCharacter{00E5}{\aa}%
+  \DeclareUnicodeCharacter{00E6}{\ae}%
+  \DeclareUnicodeCharacter{00E7}{\cedilla{c}}%
+  \DeclareUnicodeCharacter{00E8}{\`e}%
+  \DeclareUnicodeCharacter{00E9}{\'e}%
+  \DeclareUnicodeCharacter{00EA}{\^e}%
+  \DeclareUnicodeCharacter{00EB}{\"e}%
+  \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}%
+  \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}%
+  \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}%
+  \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}%
+  %
+  \DeclareUnicodeCharacter{00F0}{\dh}%
+  \DeclareUnicodeCharacter{00F1}{\~n}%
+  \DeclareUnicodeCharacter{00F2}{\`o}%
+  \DeclareUnicodeCharacter{00F3}{\'o}%
+  \DeclareUnicodeCharacter{00F4}{\^o}%
+  \DeclareUnicodeCharacter{00F5}{\~o}%
+  \DeclareUnicodeCharacter{00F6}{\"o}%
+  \DeclareUnicodeCharacter{00F7}{\ensuremath\div}%
+  \DeclareUnicodeCharacter{00F8}{\o}%
+  \DeclareUnicodeCharacter{00F9}{\`u}%
+  \DeclareUnicodeCharacter{00FA}{\'u}%
+  \DeclareUnicodeCharacter{00FB}{\^u}%
+  \DeclareUnicodeCharacter{00FC}{\"u}%
+  \DeclareUnicodeCharacter{00FD}{\'y}%
+  \DeclareUnicodeCharacter{00FE}{\th}%
+  \DeclareUnicodeCharacter{00FF}{\"y}%
+  %
+  \DeclareUnicodeCharacter{0100}{\=A}%
+  \DeclareUnicodeCharacter{0101}{\=a}%
+  \DeclareUnicodeCharacter{0102}{\u{A}}%
+  \DeclareUnicodeCharacter{0103}{\u{a}}%
+  \DeclareUnicodeCharacter{0104}{\ogonek{A}}%
+  \DeclareUnicodeCharacter{0105}{\ogonek{a}}%
+  \DeclareUnicodeCharacter{0106}{\'C}%
+  \DeclareUnicodeCharacter{0107}{\'c}%
+  \DeclareUnicodeCharacter{0108}{\^C}%
+  \DeclareUnicodeCharacter{0109}{\^c}%
+  \DeclareUnicodeCharacter{010A}{\dotaccent{C}}%
+  \DeclareUnicodeCharacter{010B}{\dotaccent{c}}%
+  \DeclareUnicodeCharacter{010C}{\v{C}}%
+  \DeclareUnicodeCharacter{010D}{\v{c}}%
+  \DeclareUnicodeCharacter{010E}{\v{D}}%
+  \DeclareUnicodeCharacter{010F}{d'}%
+  %
+  \DeclareUnicodeCharacter{0110}{\DH}%
+  \DeclareUnicodeCharacter{0111}{\dh}%
+  \DeclareUnicodeCharacter{0112}{\=E}%
+  \DeclareUnicodeCharacter{0113}{\=e}%
+  \DeclareUnicodeCharacter{0114}{\u{E}}%
+  \DeclareUnicodeCharacter{0115}{\u{e}}%
+  \DeclareUnicodeCharacter{0116}{\dotaccent{E}}%
+  \DeclareUnicodeCharacter{0117}{\dotaccent{e}}%
+  \DeclareUnicodeCharacter{0118}{\ogonek{E}}%
+  \DeclareUnicodeCharacter{0119}{\ogonek{e}}%
+  \DeclareUnicodeCharacter{011A}{\v{E}}%
+  \DeclareUnicodeCharacter{011B}{\v{e}}%
+  \DeclareUnicodeCharacter{011C}{\^G}%
+  \DeclareUnicodeCharacter{011D}{\^g}%
+  \DeclareUnicodeCharacter{011E}{\u{G}}%
+  \DeclareUnicodeCharacter{011F}{\u{g}}%
+  %
+  \DeclareUnicodeCharacter{0120}{\dotaccent{G}}%
+  \DeclareUnicodeCharacter{0121}{\dotaccent{g}}%
+  \DeclareUnicodeCharacter{0122}{\cedilla{G}}%
+  \DeclareUnicodeCharacter{0123}{\cedilla{g}}%
+  \DeclareUnicodeCharacter{0124}{\^H}%
+  \DeclareUnicodeCharacter{0125}{\^h}%
+  \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}%
+  \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}%
+  \DeclareUnicodeCharacter{0128}{\~I}%
+  \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}%
+  \DeclareUnicodeCharacter{012A}{\=I}%
+  \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}%
+  \DeclareUnicodeCharacter{012C}{\u{I}}%
+  \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}%
+  \DeclareUnicodeCharacter{012E}{\ogonek{I}}%
+  \DeclareUnicodeCharacter{012F}{\ogonek{i}}%
+  %
+  \DeclareUnicodeCharacter{0130}{\dotaccent{I}}%
+  \DeclareUnicodeCharacter{0131}{\dotless{i}}%
+  \DeclareUnicodeCharacter{0132}{IJ}%
+  \DeclareUnicodeCharacter{0133}{ij}%
+  \DeclareUnicodeCharacter{0134}{\^J}%
+  \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}%
+  \DeclareUnicodeCharacter{0136}{\cedilla{K}}%
+  \DeclareUnicodeCharacter{0137}{\cedilla{k}}%
+  \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}%
+  \DeclareUnicodeCharacter{0139}{\'L}%
+  \DeclareUnicodeCharacter{013A}{\'l}%
+  \DeclareUnicodeCharacter{013B}{\cedilla{L}}%
+  \DeclareUnicodeCharacter{013C}{\cedilla{l}}%
+  \DeclareUnicodeCharacter{013D}{L'}% should kern
+  \DeclareUnicodeCharacter{013E}{l'}% should kern
+  \DeclareUnicodeCharacter{013F}{L\U{00B7}}%
+  %
+  \DeclareUnicodeCharacter{0140}{l\U{00B7}}%
+  \DeclareUnicodeCharacter{0141}{\L}%
+  \DeclareUnicodeCharacter{0142}{\l}%
+  \DeclareUnicodeCharacter{0143}{\'N}%
+  \DeclareUnicodeCharacter{0144}{\'n}%
+  \DeclareUnicodeCharacter{0145}{\cedilla{N}}%
+  \DeclareUnicodeCharacter{0146}{\cedilla{n}}%
+  \DeclareUnicodeCharacter{0147}{\v{N}}%
+  \DeclareUnicodeCharacter{0148}{\v{n}}%
+  \DeclareUnicodeCharacter{0149}{'n}%
+  \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}%
+  \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}%
+  \DeclareUnicodeCharacter{014C}{\=O}%
+  \DeclareUnicodeCharacter{014D}{\=o}%
+  \DeclareUnicodeCharacter{014E}{\u{O}}%
+  \DeclareUnicodeCharacter{014F}{\u{o}}%
+  %
+  \DeclareUnicodeCharacter{0150}{\H{O}}%
+  \DeclareUnicodeCharacter{0151}{\H{o}}%
+  \DeclareUnicodeCharacter{0152}{\OE}%
+  \DeclareUnicodeCharacter{0153}{\oe}%
+  \DeclareUnicodeCharacter{0154}{\'R}%
+  \DeclareUnicodeCharacter{0155}{\'r}%
+  \DeclareUnicodeCharacter{0156}{\cedilla{R}}%
+  \DeclareUnicodeCharacter{0157}{\cedilla{r}}%
+  \DeclareUnicodeCharacter{0158}{\v{R}}%
+  \DeclareUnicodeCharacter{0159}{\v{r}}%
+  \DeclareUnicodeCharacter{015A}{\'S}%
+  \DeclareUnicodeCharacter{015B}{\'s}%
+  \DeclareUnicodeCharacter{015C}{\^S}%
+  \DeclareUnicodeCharacter{015D}{\^s}%
+  \DeclareUnicodeCharacter{015E}{\cedilla{S}}%
+  \DeclareUnicodeCharacter{015F}{\cedilla{s}}%
+  %
+  \DeclareUnicodeCharacter{0160}{\v{S}}%
+  \DeclareUnicodeCharacter{0161}{\v{s}}%
+  \DeclareUnicodeCharacter{0162}{\cedilla{T}}%
+  \DeclareUnicodeCharacter{0163}{\cedilla{t}}%
+  \DeclareUnicodeCharacter{0164}{\v{T}}%
+  \DeclareUnicodeCharacter{0165}{\v{t}}%
+  \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}%
+  \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}%
+  \DeclareUnicodeCharacter{0168}{\~U}%
+  \DeclareUnicodeCharacter{0169}{\~u}%
+  \DeclareUnicodeCharacter{016A}{\=U}%
+  \DeclareUnicodeCharacter{016B}{\=u}%
+  \DeclareUnicodeCharacter{016C}{\u{U}}%
+  \DeclareUnicodeCharacter{016D}{\u{u}}%
+  \DeclareUnicodeCharacter{016E}{\ringaccent{U}}%
+  \DeclareUnicodeCharacter{016F}{\ringaccent{u}}%
+  %
+  \DeclareUnicodeCharacter{0170}{\H{U}}%
+  \DeclareUnicodeCharacter{0171}{\H{u}}%
+  \DeclareUnicodeCharacter{0172}{\ogonek{U}}%
+  \DeclareUnicodeCharacter{0173}{\ogonek{u}}%
+  \DeclareUnicodeCharacter{0174}{\^W}%
+  \DeclareUnicodeCharacter{0175}{\^w}%
+  \DeclareUnicodeCharacter{0176}{\^Y}%
+  \DeclareUnicodeCharacter{0177}{\^y}%
+  \DeclareUnicodeCharacter{0178}{\"Y}%
+  \DeclareUnicodeCharacter{0179}{\'Z}%
+  \DeclareUnicodeCharacter{017A}{\'z}%
+  \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}%
+  \DeclareUnicodeCharacter{017C}{\dotaccent{z}}%
+  \DeclareUnicodeCharacter{017D}{\v{Z}}%
+  \DeclareUnicodeCharacter{017E}{\v{z}}%
+  \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}%
+  %
+  \DeclareUnicodeCharacter{01C4}{D\v{Z}}%
+  \DeclareUnicodeCharacter{01C5}{D\v{z}}%
+  \DeclareUnicodeCharacter{01C6}{d\v{z}}%
+  \DeclareUnicodeCharacter{01C7}{LJ}%
+  \DeclareUnicodeCharacter{01C8}{Lj}%
+  \DeclareUnicodeCharacter{01C9}{lj}%
+  \DeclareUnicodeCharacter{01CA}{NJ}%
+  \DeclareUnicodeCharacter{01CB}{Nj}%
+  \DeclareUnicodeCharacter{01CC}{nj}%
+  \DeclareUnicodeCharacter{01CD}{\v{A}}%
+  \DeclareUnicodeCharacter{01CE}{\v{a}}%
+  \DeclareUnicodeCharacter{01CF}{\v{I}}%
+  %
+  \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}%
+  \DeclareUnicodeCharacter{01D1}{\v{O}}%
+  \DeclareUnicodeCharacter{01D2}{\v{o}}%
+  \DeclareUnicodeCharacter{01D3}{\v{U}}%
+  \DeclareUnicodeCharacter{01D4}{\v{u}}%
+  %
+  \DeclareUnicodeCharacter{01E2}{\={\AE}}%
+  \DeclareUnicodeCharacter{01E3}{\={\ae}}%
+  \DeclareUnicodeCharacter{01E6}{\v{G}}%
+  \DeclareUnicodeCharacter{01E7}{\v{g}}%
+  \DeclareUnicodeCharacter{01E8}{\v{K}}%
+  \DeclareUnicodeCharacter{01E9}{\v{k}}%
+  %
+  \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}%
+  \DeclareUnicodeCharacter{01F1}{DZ}%
+  \DeclareUnicodeCharacter{01F2}{Dz}%
+  \DeclareUnicodeCharacter{01F3}{dz}%
+  \DeclareUnicodeCharacter{01F4}{\'G}%
+  \DeclareUnicodeCharacter{01F5}{\'g}%
+  \DeclareUnicodeCharacter{01F8}{\`N}%
+  \DeclareUnicodeCharacter{01F9}{\`n}%
+  \DeclareUnicodeCharacter{01FC}{\'{\AE}}%
+  \DeclareUnicodeCharacter{01FD}{\'{\ae}}%
+  \DeclareUnicodeCharacter{01FE}{\'{\O}}%
+  \DeclareUnicodeCharacter{01FF}{\'{\o}}%
+  %
+  \DeclareUnicodeCharacter{021E}{\v{H}}%
+  \DeclareUnicodeCharacter{021F}{\v{h}}%
+  %
+  \DeclareUnicodeCharacter{0226}{\dotaccent{A}}%
+  \DeclareUnicodeCharacter{0227}{\dotaccent{a}}%
+  \DeclareUnicodeCharacter{0228}{\cedilla{E}}%
+  \DeclareUnicodeCharacter{0229}{\cedilla{e}}%
+  \DeclareUnicodeCharacter{022E}{\dotaccent{O}}%
+  \DeclareUnicodeCharacter{022F}{\dotaccent{o}}%
+  %
+  \DeclareUnicodeCharacter{0232}{\=Y}%
+  \DeclareUnicodeCharacter{0233}{\=y}%
+  \DeclareUnicodeCharacter{0237}{\dotless{j}}%
+  %
+  \DeclareUnicodeCharacter{02DB}{\ogonek{ }}%
+  %
+  % Greek letters upper case
+  \DeclareUnicodeCharacter{0391}{{\it A}}%
+  \DeclareUnicodeCharacter{0392}{{\it B}}%
+  \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}%
+  \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}%
+  \DeclareUnicodeCharacter{0395}{{\it E}}%
+  \DeclareUnicodeCharacter{0396}{{\it Z}}%
+  \DeclareUnicodeCharacter{0397}{{\it H}}%
+  \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}%
+  \DeclareUnicodeCharacter{0399}{{\it I}}%
+  \DeclareUnicodeCharacter{039A}{{\it K}}%
+  \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}%
+  \DeclareUnicodeCharacter{039C}{{\it M}}%
+  \DeclareUnicodeCharacter{039D}{{\it N}}%
+  \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}%
+  \DeclareUnicodeCharacter{039F}{{\it O}}%
+  \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}%
+  \DeclareUnicodeCharacter{03A1}{{\it P}}%
+  %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma
+  \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}%
+  \DeclareUnicodeCharacter{03A4}{{\it T}}%
+  \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}%
+  \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}%
+  \DeclareUnicodeCharacter{03A7}{{\it X}}%
+  \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}%
+  \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}%
+  %
+  % Vowels with accents
+  \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}%
+  \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}%
+  \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}%
+  \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}%
+  \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}%
+  \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}%
+  %
+  % Standalone accent
+  \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}%
+  %
+  % Greek letters lower case
+  \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}%
+  \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}%
+  \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}%
+  \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}%
+  \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}%
+  \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}%
+  \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}%
+  \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}%
+  \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}%
+  \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}%
+  \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}%
+  \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}%
+  \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}%
+  \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}%
+  \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron
+  \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}%
+  \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}%
+  \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}%
+  \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}%
+  \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}%
+  \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}%
+  \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}%
+  \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}%
+  \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}%
+  \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}%
+  %
+  % More Greek vowels with accents
+  \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}%
+  \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}%
+  \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}%
+  \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}%
+  \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}%
+  %
+  % Variant Greek letters
+  \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}%
+  \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}%
+  \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}%
+  %
+  \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}%
+  \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}%
+  \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}%
+  \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}%
+  \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}%
+  \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}%
+  \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}%
+  \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}%
+  \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}%
+  \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}%
+  \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}%
+  \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}%
+  %
+  \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}%
+  \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}%
+  %
+  \DeclareUnicodeCharacter{1E20}{\=G}%
+  \DeclareUnicodeCharacter{1E21}{\=g}%
+  \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}%
+  \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}%
+  \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}%
+  \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}%
+  \DeclareUnicodeCharacter{1E26}{\"H}%
+  \DeclareUnicodeCharacter{1E27}{\"h}%
+  %
+  \DeclareUnicodeCharacter{1E30}{\'K}%
+  \DeclareUnicodeCharacter{1E31}{\'k}%
+  \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}%
+  \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}%
+  \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}%
+  \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}%
+  \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}%
+  \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}%
+  \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}%
+  \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}%
+  \DeclareUnicodeCharacter{1E3E}{\'M}%
+  \DeclareUnicodeCharacter{1E3F}{\'m}%
+  %
+  \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}%
+  \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}%
+  \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}%
+  \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}%
+  \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}%
+  \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}%
+  \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}%
+  \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}%
+  \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}%
+  \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}%
+  %
+  \DeclareUnicodeCharacter{1E54}{\'P}%
+  \DeclareUnicodeCharacter{1E55}{\'p}%
+  \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}%
+  \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}%
+  \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}%
+  \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}%
+  \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}%
+  \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}%
+  \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}%
+  \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}%
+  %
+  \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}%
+  \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}%
+  \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}%
+  \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}%
+  \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}%
+  \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}%
+  \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}%
+  \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}%
+  \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}%
+  \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}%
+  %
+  \DeclareUnicodeCharacter{1E7C}{\~V}%
+  \DeclareUnicodeCharacter{1E7D}{\~v}%
+  \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}%
+  \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}%
+  %
+  \DeclareUnicodeCharacter{1E80}{\`W}%
+  \DeclareUnicodeCharacter{1E81}{\`w}%
+  \DeclareUnicodeCharacter{1E82}{\'W}%
+  \DeclareUnicodeCharacter{1E83}{\'w}%
+  \DeclareUnicodeCharacter{1E84}{\"W}%
+  \DeclareUnicodeCharacter{1E85}{\"w}%
+  \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}%
+  \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}%
+  \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}%
+  \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}%
+  \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}%
+  \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}%
+  \DeclareUnicodeCharacter{1E8C}{\"X}%
+  \DeclareUnicodeCharacter{1E8D}{\"x}%
+  \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}%
+  \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}%
+  %
+  \DeclareUnicodeCharacter{1E90}{\^Z}%
+  \DeclareUnicodeCharacter{1E91}{\^z}%
+  \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}%
+  \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}%
+  \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}%
+  \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}%
+  \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}%
+  \DeclareUnicodeCharacter{1E97}{\"t}%
+  \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}%
+  \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}%
+  %
+  \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}%
+  \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}%
+  %
+  \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}%
+  \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}%
+  \DeclareUnicodeCharacter{1EBC}{\~E}%
+  \DeclareUnicodeCharacter{1EBD}{\~e}%
+  %
+  \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}%
+  \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}%
+  \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}%
+  \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}%
+  %
+  \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}%
+  \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}%
+  %
+  \DeclareUnicodeCharacter{1EF2}{\`Y}%
+  \DeclareUnicodeCharacter{1EF3}{\`y}%
+  \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}%
+  %
+  \DeclareUnicodeCharacter{1EF8}{\~Y}%
+  \DeclareUnicodeCharacter{1EF9}{\~y}%
+  %
+  % Punctuation
+  \DeclareUnicodeCharacter{2013}{--}%
+  \DeclareUnicodeCharacter{2014}{---}%
+  \DeclareUnicodeCharacter{2018}{\quoteleft{}}%
+  \DeclareUnicodeCharacter{2019}{\quoteright{}}%
+  \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}%
+  \DeclareUnicodeCharacter{201C}{\quotedblleft{}}%
+  \DeclareUnicodeCharacter{201D}{\quotedblright{}}%
+  \DeclareUnicodeCharacter{201E}{\quotedblbase{}}%
+  \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}%
+  \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}%
+  \DeclareUnicodeCharacter{2022}{\bullet{}}%
+  \DeclareUnicodeCharacter{202F}{\thinspace}%
+  \DeclareUnicodeCharacter{2026}{\dots{}}%
+  \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}%
+  \DeclareUnicodeCharacter{203A}{\guilsinglright{}}%
+  %
+  \DeclareUnicodeCharacter{20AC}{\euro{}}%
+  %
+  \DeclareUnicodeCharacter{2192}{\expansion{}}%
+  \DeclareUnicodeCharacter{21D2}{\result{}}%
+  %
+  % Mathematical symbols
+  \DeclareUnicodeCharacter{2200}{\ensuremath\forall}%
+  \DeclareUnicodeCharacter{2203}{\ensuremath\exists}%
+  \DeclareUnicodeCharacter{2208}{\ensuremath\in}%
+  \DeclareUnicodeCharacter{2212}{\minus{}}%
+  \DeclareUnicodeCharacter{2217}{\ast}%
+  \DeclareUnicodeCharacter{221E}{\ensuremath\infty}%
+  \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}%
+  \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}%
+  \DeclareUnicodeCharacter{2229}{\ensuremath\cap}%
+  \DeclareUnicodeCharacter{2261}{\equiv{}}%
+  \DeclareUnicodeCharacter{2264}{\ensuremath\leq}%
+  \DeclareUnicodeCharacter{2265}{\ensuremath\geq}%
+  \DeclareUnicodeCharacter{2282}{\ensuremath\subset}%
+  \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}%
+  %
+  \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}%
+  \DeclareUnicodeCharacter{2032}{\ensuremath\prime}%
+  \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}%
+  \DeclareUnicodeCharacter{2111}{\ensuremath\Im}%
+  \DeclareUnicodeCharacter{2113}{\ensuremath\ell}%
+  \DeclareUnicodeCharacter{2118}{\ensuremath\wp}%
+  \DeclareUnicodeCharacter{211C}{\ensuremath\Re}%
+  \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}%
+  \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}%
+  \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}%
+  \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}%
+  \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}%
+  \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}%
+  \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}%
+  \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}%
+  \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}%
+  \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}%
+  \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}%
+  \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}%
+  \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}%
+  \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}%
+  \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}%
+  \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}%
+  \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}%
+  \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}%
+  \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}%
+  \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}%
+  \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}%
+  \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}%
+  \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}%
+  \DeclareUnicodeCharacter{2202}{\ensuremath\partial}%
+  \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}%
+  \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}%
+  \DeclareUnicodeCharacter{2209}{\ensuremath\notin}%
+  \DeclareUnicodeCharacter{220B}{\ensuremath\owns}%
+  \DeclareUnicodeCharacter{220F}{\ensuremath\prod}%
+  \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}%
+  \DeclareUnicodeCharacter{2211}{\ensuremath\sum}%
+  \DeclareUnicodeCharacter{2213}{\ensuremath\mp}%
+  \DeclareUnicodeCharacter{2218}{\ensuremath\circ}%
+  \DeclareUnicodeCharacter{221A}{\ensuremath\surd}%
+  \DeclareUnicodeCharacter{221D}{\ensuremath\propto}%
+  \DeclareUnicodeCharacter{2220}{\ensuremath\angle}%
+  \DeclareUnicodeCharacter{2223}{\ensuremath\mid}%
+  \DeclareUnicodeCharacter{2228}{\ensuremath\vee}%
+  \DeclareUnicodeCharacter{222A}{\ensuremath\cup}%
+  \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}%
+  \DeclareUnicodeCharacter{222E}{\ensuremath\oint}%
+  \DeclareUnicodeCharacter{223C}{\ensuremath\sim}%
+  \DeclareUnicodeCharacter{2240}{\ensuremath\wr}%
+  \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}%
+  \DeclareUnicodeCharacter{2245}{\ensuremath\cong}%
+  \DeclareUnicodeCharacter{2248}{\ensuremath\approx}%
+  \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}%
+  \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}%
+  \DeclareUnicodeCharacter{2260}{\ensuremath\neq}%
+  \DeclareUnicodeCharacter{226A}{\ensuremath\ll}%
+  \DeclareUnicodeCharacter{226B}{\ensuremath\gg}%
+  \DeclareUnicodeCharacter{227A}{\ensuremath\prec}%
+  \DeclareUnicodeCharacter{227B}{\ensuremath\succ}%
+  \DeclareUnicodeCharacter{2283}{\ensuremath\supset}%
+  \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}%
+  \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}%
+  \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}%
+  \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}%
+  \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}%
+  \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}%
+  \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}%
+  \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}%
+  \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}%
+  \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}%
+  \DeclareUnicodeCharacter{2299}{\ensuremath\odot}%
+  \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}%
+  \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}%
+  \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}%
+  \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}%
+  \DeclareUnicodeCharacter{22A8}{\ensuremath\models}%
+  \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}%
+  \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}%
+  \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}%
+  \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}%
+  \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}%
+  \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}%
+  \DeclareUnicodeCharacter{22C6}{\ensuremath\star}%
+  \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}%
+  \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}%
+  \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}%
+  \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}%
+  \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}%
+  \DeclareUnicodeCharacter{2322}{\ensuremath\frown}%
+  \DeclareUnicodeCharacter{2323}{\ensuremath\smile}%
+  %
+  \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}%
+  \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}%
+  \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}%
+  \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}%
+  \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}%
+  \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}%
+  \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}%
+  \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}%
+  \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}%
+  \DeclareUnicodeCharacter{266D}{\ensuremath\flat}%
+  \DeclareUnicodeCharacter{266E}{\ensuremath\natural}%
+  \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}%
+  \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}%
+  \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}%
+  \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}%
+  \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}%
+  \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}%
+  \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}%
+  \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}%
+  \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}%
+  \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}%
+  \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}%
+  \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}%
+  \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}%
+  \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}%
+  \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}%
+  \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}%
+  \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}%
+  \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}%
+  %
+  \global\mathchardef\checkmark="1370% actually the square root sign
+  \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}%
+}% end of \unicodechardefs
+
+% UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command)
+% It makes the setting that replace UTF-8 byte sequence.
+\def\utfeightchardefs{%
+  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii
+  \unicodechardefs
+}
+
+% Whether the active definitions of non-ASCII characters expand to
+% non-active tokens with the same character code.  This is used to
+% write characters literally, instead of using active definitions for
+% printing the correct glyphs.
+\newif\ifpassthroughchars
+\passthroughcharsfalse
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% provide a definition macro to replace/pass-through a Unicode character
+%
+\def\DeclareUnicodeCharacterNative#1#2{%
+  \catcode"#1=\active
+  \def\dodeclareunicodecharacternative##1##2##3{%
+    \begingroup
+      \uccode`\~="##2\relax
+      \uppercase{\gdef~}{%
+        \ifpassthroughchars
+          ##1%
+        \else
+          ##3%
+        \fi
+      }
+    \endgroup
+  }
+  \begingroup
+    \uccode`\.="#1\relax
+    \uppercase{\def\UTFNativeTmp{.}}%
+    \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}%
+  \endgroup
+}
+
+% Native Unicode handling (XeTeX and LuaTeX) character replacing definition.
+% It activates the setting that replaces Unicode characters.
+\def\nativeunicodechardefs{%
+  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative
+  \unicodechardefs
+}
+
+% For native Unicode handling (XeTeX and LuaTeX),
+% make the character token expand
+% to the sequences given in \unicodechardefs for printing.
+\def\DeclareUnicodeCharacterNativeAtU#1#2{%
+  \def\UTFAtUTmp{#2}
+  \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp
+}
+
+% @U command definitions for native Unicode handling (XeTeX and LuaTeX).
+\def\nativeunicodechardefsatu{%
+  \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU
+  \unicodechardefs
+}
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+   \relax
+}
+
+% Define all Unicode characters we know about.  This makes UTF-8 the default
+% input encoding and allows @U to work.
+\iftxinativeunicodecapable
+  \nativeunicodechardefsatu
+\else
+  \utfeightchardefs
+\fi
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be very finicky about underfull hboxes, either.
+\hbadness = 6666
+
+% Following George Bush, get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \txipageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \txipagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+    % if we don't reset these, they will remain at "1 true in" of
+    % whatever layout pdftex was dumped with.
+    \pdfhorigin = 1 true in
+    \pdfvorigin = 1 true in
+  \else
+    \ifx\XeTeXrevision\thisisundefined
+      \special{papersize=#8,#7}%
+    \else
+      \pdfpageheight #7\relax
+      \pdfpagewidth #8\relax
+      % XeTeX does not have \pdfhorigin and \pdfvorigin.
+    \fi
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{607.2pt}{6in}% that's 46 lines
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {-.2in}{0in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+  \parskip = 1.5pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.4in}{4.8in}%
+                    {-.2in}{-.4in}%
+                    {0pt}{14pt}%
+                    {9in}{6in}%
+  %
+  \lispnarrowing = 0.25in
+  \tolerance = 700
+  \contentsrightmargin = 0pt
+  \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{673.2pt}{160mm}% that's 51 lines
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1\relax
+  \advance\dimen0 by \voffset
+  \advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  \advance\dimen2 by 1in % reference point is 1 inch from left edge of page
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+% Default value of \hfuzz, for suppressing warnings about overfull hboxes.
+\hfuzz = 1pt
+
+
+\message{and turning on texinfo input format.}
+
+\def^^L{\par} % remove \outer, so ^L can appear in an @comment
+
+% DEL is a comment character, in case @c does not suffice.
+\catcode`\^^? = 14
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other \def\normaldoublequote{"}
+\catcode`\$=\other \def\normaldollar{$}%$ font-lock fix
+\catcode`\+=\other \def\normalplus{+}
+\catcode`\<=\other \def\normalless{<}
+\catcode`\>=\other \def\normalgreater{>}
+\catcode`\^=\other \def\normalcaret{^}
+\catcode`\_=\other \def\normalunderscore{_}
+\catcode`\|=\other \def\normalverticalbar{|}
+\catcode`\~=\other \def\normaltilde{~}
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Set catcodes for Texinfo file
+
+% Active characters for printing the wanted glyph.
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+%
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde
+\chardef\hatchar=`\^
+\catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+\let\realunder=_
+
+\catcode`\|=\active \def|{{\tt\char124}}
+
+\chardef \less=`\<
+\catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless
+\chardef \gtr=`\>
+\catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr
+\catcode`\+=\active \def+{{\tt \char 43}}
+\catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+\catcode`\-=\active \let-=\normaldash
+
+
+% used for headline/footline in the output routine, in case the page
+% breaks in the middle of an @tex block.
+\def\texinfochars{%
+  \let< = \activeless
+  \let> = \activegtr
+  \let~ = \activetilde 
+  \let^ = \activehat
+  \markupsetuplqdefault \markupsetuprqdefault 
+  \let\b = \strong
+  \let\i = \smartitalic
+  % in principle, all other definitions in \tex have to be undone too.
+}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+  \normalturnoffactive
+  \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont  % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In Texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active  % @ for escape char from now on.
+
+% Print a typewriter backslash.  For math mode, we can't simply use
+% \backslashcurfont: the story here is that in math mode, the \char
+% of \backslashcurfont ends up printing the roman \ from the math symbol
+% font (because \char in math mode uses the \mathcode, and plain.tex
+% sets \mathcode`\\="026E).  Hence we use an explicit \mathchar,
+% which is the decimal equivalent of "715c (class 7, e.g., use \fam;
+% ignored family value; char position "5C).  We can't use " for the
+% usual hex value because it has already been made active.
+
+@def@ttbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}}
+@let@backslashchar = @ttbackslash % @backslashchar{} is for user documents.
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.  We switch back and forth between these.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+%
+{@catcode`- = @active
+ @gdef@normalturnoffactive{%
+   @passthroughcharstrue
+   @let-=@normaldash
+   @let"=@normaldoublequote
+   @let$=@normaldollar %$ font-lock fix
+   @let+=@normalplus
+   @let<=@normalless
+   @let>=@normalgreater
+   @let^=@normalcaret
+   @let_=@normalunderscore
+   @let|=@normalverticalbar
+   @let~=@normaltilde
+   @let\=@ttbackslash
+   @markupsetuplqdefault
+   @markupsetuprqdefault
+   @unsepspaces
+ }
+}
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have @fixbackslash turn them back on.
+@catcode`+=@other @catcode`@_=@other
+
+% \enablebackslashhack - allow file to begin `\input texinfo'
+%
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+% If the file did not have a `\input texinfo', then it is turned off after
+% the first line; otherwise the first `\' in the file would cause an error.
+% This is used on the very last line of this file, texinfo.tex.
+% We also use @c to call @fixbackslash, in case ends of lines are hidden.
+{
+@catcode`@^=7
+@catcode`@^^M=13@gdef@enablebackslashhack{%
+  @global@let\ = @eatinput%
+  @catcode`@^^M=13%
+  @def@c{@fixbackslash@c}%
+  % Definition for the newline at the end of this file.
+  @def ^^M{@let^^M@secondlinenl}%
+  % Definition for a newline in the main Texinfo file.
+  @gdef @secondlinenl{@fixbackslash}%
+  % In case the first line has a whole-line command on it
+  @let@originalparsearg@parsearg
+  @def@parsearg{@fixbackslash@originalparsearg}
+}}
+
+{@catcode`@^=7 @catcode`@^^M=13%
+@gdef@eatinput input texinfo#1^^M{@fixbackslash}}
+
+% Emergency active definition of newline, in case an active newline token
+% appears by mistake.
+{@catcode`@^=7 @catcode13=13%
+@gdef@enableemergencynewline{%
+  @gdef^^M{%
+    @par%
+    %<warning: active newline>@par%
+}}}
+
+
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @ttbackslash @fi
+  @catcode13=5 % regular end of line
+  @enableemergencynewline
+  @let@c=@texinfoc
+  @let@parsearg@originalparsearg
+  % Also turn back on active characters that might appear in the input
+  % file name, in case not using a pre-dumped format.
+  @catcode`+=@active
+  @catcode`@_=@active
+  %
+  % If texinfo.cnf is present on the system, read it.
+  % Useful for site-wide @afourpaper, etc.  This macro, @fixbackslash, gets
+  % called at the beginning of every Texinfo file.  Not opening texinfo.cnf
+  % directly in this file, texinfo.tex, makes it possible to make a format
+  % file for Texinfo.
+  %
+  @openin 1 texinfo.cnf
+  @ifeof 1 @else @input texinfo.cnf @fi
+  @closein 1
+}
+
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These (along with & and #) are made active for url-breaking, so need
+% active definitions as the normal characters.
+@def@normaldot{.}
+@def@normalquest{?}
+@def@normalslash{/}
+
+% These look ok in all fonts, so just make them not special.
+% @hashchar{} gets its own user-level command, because of #line.
+@catcode`@& = @other @def@normalamp{&}
+@catcode`@# = @other @def@normalhash{#}
+@catcode`@% = @other @def@normalpercent{%}
+
+@let @hashchar = @normalhash
+
+@c Finally, make ` and ' active, so that txicodequoteundirected and
+@c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}.  If we
+@c don't make ` and ' active, @code will not get them as active chars.
+@c Do this last of all since we use ` in the previous @catcode assignments.
+@catcode`@'=@active
+@catcode`@`=@active
+@markupsetuplqdefault
+@markupsetuprqdefault
+
+@c Local variables:
+@c eval: (add-hook 'before-save-hook 'time-stamp)
+@c page-delimiter: "^\\\\message\\|emacs-page"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@enablebackslashhack
diff --git a/gawk-5.0.1/doc/wordlist b/gawk-5.0.1/doc/wordlist
new file mode 100644
index 00000000000..d844d3f2d25
--- /dev/null
+++ b/gawk-5.0.1/doc/wordlist
@@ -0,0 +1,2004 @@
+AA
+AAAA
+ABC
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ABCXYabcdxyz
+ACLs
+ACM
+ADR
+AF
+ANDing
+API
+API's
+APIs
+ARG
+ARGC
+ARGIND
+ARGV
+AWK
+AWK's
+AWKBUFSIZE
+AWKLIBPATH
+AWKPATH
+AWKREADFUNC
+Acknowledgements
+Adams's
+AdditionalResources
+Affero
+Aharon
+Aho
+Akim
+Anders
+Andreas
+Argind
+Assaf
+Attractant
+Autoconf
+Automake
+Autotools
+Avahi
+Awk
+Awklib
+Awkstuff
+Ayalon
+BBBB
+BEGINFILE
+BEL
+BINMODE
+BLKSIZE
+BSIZE
+BTL
+BWK
+Banzai
+BeOS
+Bentley's
+Benzinger
+Bitwise
+Bleah
+Bornstein
+Bourne
+Breakpoint
+Brin's
+Brini
+Brini's
+Broder
+Broderick
+Buening
+Burridge
+BusyBox
+Bycount
+Byname
+Byuid
+CAKuGj
+CASEFOLD
+CC
+CDE
+CEST
+CFLAGS
+CGI
+CHEM
+CMP
+COMFOLLOW
+COMMONEXT
+CONFIG
+CONVFMT
+CRC
+CRTL
+CSV
+CTYPE
+Callback
+Cc
+Chana
+ChangeLog
+Chassell
+Chet
+Christos
+CliffRandomNumberGenerator
+Cloutier
+Cn
+Collado
+Constant's
+Coprocess
+Coprocesses
+Coreutils
+Corinna
+Ctrl
+Curreli
+Cygwin
+DARKCORNER
+DCL
+DCLTABLES
+DD
+DDEBUG
+DDF
+DEV
+DF
+DFA
+DGAWK
+DHAVE
+DIR
+DJGPP
+DK
+DST
+DTD
+DVI
+Datafile
+Davide
+Davide's
+Decrement
+Decrementing
+Deifik
+Demaille
+Dinline
+Drepper
+Duman
+Dupword
+EAGAIN
+EBCDIC
+EC
+EINTR
+EMISTERED
+EMRED
+EMX
+ENDFILE
+ENVIRON
+EOF
+EREs
+ERRNO
+ESC
+EST
+ETIMEDOUT
+EWOULDBLOCK
+EY
+Eberhard
+Ec
+Ee
+Efraim
+Eggert
+Egrep
+Emptor
+Executables
+Exp
+Expat
+Ey
+FAIA
+FD
+FDL
+FF
+FFN
+FHS
+FIELDWIDTHS
+FILENAME
+FIXME
+FN
+FNM
+FNR
+FOO
+FORmula
+FP
+FPAT
+FS
+FSF
+FSF's
+FTS
+FULLXREF
+FUNCTAB
+Fabi
+Fabius
+Fenlason
+Filename
+Filetrans
+Fnames
+Fnmatch
+Formatter
+Formfeed
+Fortran
+FreeBSD
+Friedl
+GAWKINETTITLE
+GCC
+GCC's
+GDB
+GETGRENT
+GMP
+GMT
+GNITS
+GNU's
+GNV
+GPL
+GR
+Garfinkle
+GetSystemTimeAsFileTime
+Getline
+Getlocaltime
+Getopt
+GitHub
+Grigera
+Groucho
+GyeoNxTFby
+Gzip
+HELPLIB
+HH
+HHMM
+HT
+HUP
+HURD
+Haible
+Hankerson
+Haque
+Hartholz
+Hasegawa
+Hermann
+Hitchhiker's
+Hoare's
+Hurd
+Hurray
+IA
+IFBLK
+IFCHR
+IFDIR
+IFDOOR
+IFIFO
+IFLNK
+IFMT
+IFREG
+IFSOCK
+IGNORECASE
+INPLACE
+INT
+INTDIV
+IPv
+ISBLK
+ISBN
+ISCHR
+ISLNK
+Igawk
+Illumos
+Incrementing
+Inf
+Init
+Inited
+Inplace
+InstallingGNVPackages
+Internetworking
+Isamu
+Itanium
+JCPU
+JF
+JPG
+JSON
+JVM
+Jaegermann
+Jeroen
+Johansen
+Johansen's
+KOI
+Kahrs
+Kai
+Kasal
+Kenobi
+Kernighan
+Kernighan's
+Korn
+Kwityn
+Kwok
+LARGEFILE
+LC
+LDFLAGS
+LEQ
+LF
+LGPL
+LIBS
+LXIX
+Langston
+LeBlanc
+Libmawk
+Libtool
+Lijewski
+Lvalue
+MALLOC
+MAXLINES
+MC
+MERCHANTABILITY
+MINGW
+MIPS
+MKS
+MMC
+MMK
+MMS
+MP
+MPFR
+MPZ
+MSC
+MSEC
+MSG
+MSYS
+MVX
+MW
+Makefile
+Makefiles
+Malka
+Malmberg
+MathWorld
+McIlroy
+McPhee
+Mecky
+Metacharacters
+MiXeD
+Michal
+Microsystems
+MinGW
+MirBSD
+Mlynarik
+Mortice
+Multiauthor
+Multicharacter
+Multiscanning
+MyState
+MyTown
+NF
+NL
+NLS
+NNTP
+NOCHDIR
+NOESCAPE
+NOMATCH
+NR
+NT
+NUMCUR
+NaN
+Nachum
+NeXT
+NetBSD
+Newsreader
+Nextfile
+Nlines
+Nof
+Nonalphabetic
+Nonconstant
+Nondecimal
+Nonduplicated
+Noninteractive
+Nonoption
+O'Reilly
+ODS
+OFMT
+OFS
+OI
+OM
+OMF
+ORG
+ORS
+OU
+OV
+Obi
+Od
+Oe
+Om
+Ooops
+Op
+OpenBSD
+OpenSolaris
+OpenVMS
+Ops
+Optarg
+Opterr
+Optind
+Optopt
+Oram
+Ord
+Ou
+Oy
+PASSWD
+PATCHLEVEL
+PATHNAME
+PCPU
+PCSI
+PDF
+PEBKAC
+PNG
+POS
+POSIX
+POSIXLY
+PP
+PQgetvalue
+PREC
+PROCINFO
+PVERSION
+PW
+PWD
+Panos
+Papadopoulos
+Parsers
+Passwd
+Peifer
+PiFormulas
+Plauger
+Plugin
+PostScript
+PostgreSQL
+Postprocessing
+PowerPC
+Pr
+Pre
+Preopened
+Preprocessor
+Prestandard
+Printf
+Prolog
+QSE
+QSINGLE
+QTawk
+Quanstrom
+Quicksort
+QuikTrim
+RANLIB
+README
+REGEX
+RELICENSING
+REVOUT
+RLENGTH
+RMS
+ROUNDMODE
+RRI
+RSTART
+RT
+Rakitzis
+Ramey
+RapidJson
+Readdir
+Readfile
+Readline
+Redirections
+Redis
+Regex
+Regexp
+Regexps
+Reimplementing
+Retryable
+Revout
+RiscOS
+Ritchie
+Rivka
+Rvalue
+SA
+SAUiRuff
+SEEDOT
+SHell
+SIGHUP
+SIGINT
+SIGQUIT
+SIGUSR
+SPARC
+SRC
+SS
+SSC
+SSL
+STACKSIZE
+STAT
+STD
+STDC
+STR
+STRCUR
+STRNUM
+STRUCT
+SUBSEP
+SVR
+SYMTAB
+SYS
+Schorr
+Schreiber
+Sed
+Sep
+Sheehan
+Shirokov
+Significand
+Skywalker
+Smalltalk
+Smallville
+Solaris
+Stallman
+Stepan
+Stewartson's
+Strnum
+Strtonum
+Subarrays
+Sublicensing
+SunOS
+SylvestersSequence
+TABs
+TCP
+TEXTDOMAIN
+TIDYMEM
+TODO
+TRANslator
+TZ
+Tcl
+Texinfo
+Timestamp
+Topher
+Toporek
+Trueman
+UC
+UDP
+UI
+UNIXROOT
+USR
+UTC
+UTF
+Ubuntu
+Ulrich
+Ultrix
+Unary
+Uncomment
+Uniq
+Uwe
+VER
+VMS
+VT
+Vax
+Versioning
+Vinschen
+WIPO
+Walamazoo
+Wallin
+Wasserman
+Watchpoint
+Wc
+Weinberger
+Weinberger's
+Weisstein
+Wfile
+Wfoo
+WhidbeyNet
+Whitespace
+Whoope
+Wikipedia
+Woehlke
+Wsource
+Wversion
+Ww
+XCF
+XDEV
+XP
+XXX
+XXXX
+XYZ
+XaXbXcX
+Xref
+YYYY
+Yawitz
+Za
+Zaphod
+Zaretskii
+Zaretskii's
+Zcrtdll
+Zeichen
+Zeichenkette
+Zlinker
+Zmt
+Zomf
+Zoulas
+Zstack
+aB
+aCa
+aIt
+aSAgbfocFVtguG
+aaa
+aaaabcd
+aab
+aabbb
+aabbbccccddd
+aaccdd
+ab
+abCDEf
+abc
+abcca
+abcd
+abcde
+abcdef
+abcdefg
+abcdefghi
+abcdefghijklmnopqrstuvwxyz
+abcdxyz
+abs
+abx
+ac
+acbfoo
+acknowledgements
+aclocal
+addrs
+adm
+adminprog
+aeiouy
+ai
+aka
+aksx
+alast
+alecthomas
+algebrar
+algebrarum
+aline
+aliq
+aliquotiens
+alloca
+allskip
+alnum
+althour
+altweekday
+altweeknum
+amc
+amelia
+ampm
+andreas
+andrew
+andrewsumner
+andspan
+andy
+anthony
+apache
+api
+appendixsec
+appendixsubsec
+appendixsubsubsec
+approx
+aqb
+aqc
+ar
+arctangent
+arg
+argc
+args
+argv
+arnold
+arr
+arraydump
+arraymax
+arsenio
+asc
+aschorr
+ascii
+asis
+asn
+asort
+asorti
+asserturo
+asusodin
+atan
+atexit
+atime
+atl
+austingroupbugs
+autoconf
+automake
+autotools
+avahi
+aval
+avg
+awf
+awk
+awka
+awkcard
+awkforai
+awkgram
+awklang
+awklib
+awknum
+awkp
+awkprof
+awks
+awksed
+awkvars
+babbly
+babery
+bable
+backreference
+backtrace
+bak
+barney
+barrrrr
+basedefs
+baselineskip
+bax
+baz
+bc
+bcd
+bduncan
+beachnet
+becky
+beebe
+beginfile
+begpat
+behaviour
+bellcore
+benhoyt
+beslab
+bf
+bfoo
+bignum
+bigskip
+bindtextdomain
+binmode
+bisonfix
+bitwise
+blabber
+blabbers
+blabby
+blacky
+blat
+blech
+bletch
+blksize
+blockdev
+blockquote
+blocksize
+bool
+boolean
+boundar
+br
+brabble
+brabbles
+branchname
+breakpoint
+brennan
+brent
+brini
+broderick
+bt
+btl
+buening
+buf
+bufsize
+buildable
+builtin
+busybox
+bwk
+bwkawk
+bycount
+bygid
+byname
+byuid
+bz
+bzip
+cAsE
+callback
+callbacks
+calloc
+caltech
+camelot
+camilla
+campanor
+campanorum
+cardfonts
+cartouche
+catb
+catcode
+cb
+cbARG
+cc
+cd
+cde
+cdot
+ce
+centerline
+cgi
+cgit
+cgiwrap
+ch
+changeit
+charcount
+chardev
+charlist
+chdir
+chem
+chet
+chien
+chmod
+chown
+chr
+cinaP
+cinap
+cindex
+cindexawkfunc
+cindexgawkfunc
+clast
+cld
+cline
+cmd
+cmp
+cns
+cnswww
+cntrl
+co
+codeNF
+codesets
+codicib
+codicibus
+col
+colname
+colsep
+colspec
+columnfractions
+colwidth
+com
+comcast
+commandline
+commen
+comp
+compat
+compdemo
+compl
+conan
+concat
+config
+configh
+const
+coprocess
+coprocess's
+coprocesses
+copyediting
+copyleft
+copyrightable
+coreutils
+cos
+cosmogen
+counterintuitive
+cozx
+cp
+cplusplus
+cr
+cron
+csh
+cssun
+csv
+csvil
+ctime
+cul
+curdir
+curfile
+cwru
+cygwin
+cyrillic
+dCaaCbaaa
+daabaaa
+danfuzz
+dartmouth
+datadir
+datafile
+datafiles
+datespec
+dave
+david
+dayname
+db
+dcgettext
+dcngettext
+dd
+ddd
+de
+deallocations
+debuggee
+debugger's
+decommented
+decrement
+decrementing
+def
+del
+delarray
+delim
+delorie
+denorm
+depcomp
+desc
+descrip
+deserialize
+designator
+dest
+destructors
+detailmenu
+dev
+devbsize
+dfa
+dfn
+dgawk
+dict
+diff
+diffs
+digts
+dimensioned
+dir
+dircategory
+direntry
+distributable
+div
+djgpp
+dl
+dlload
+dlopen
+dlsym
+dn
+docbook
+dom
+dont
+dorking
+doug
+dpitts
+dportein
+dps
+dresdnerbank
+drwxr
+dtect
+dumparray
+duncan
+dup
+dupword
+dvi
+dx
+ebcdic
+eca
+edu
+eg
+egid
+egrep
+eklye
+el
+elem
+elif
+eliz
+elled
+emalloc
+embeddable
+emory
+emph
+emptor
+emxomfar
+en
+encodings
+enddots
+endfile
+endgrent
+endif
+endlesssoftware
+endpat
+endpwent
+enrichening
+enum
+env
+environ
+eof
+eql
+equiv
+erealloc
+erik
+errcode
+errno
+esac
+esp
+etre
+eu
+euid
+eval
+evenheading
+exe
+execl
+executables
+exepack
+exitval
+exp
+expat
+expr
+ext
+extenders
+extern
+ezalloc
+ezwinports
+fPIC
+fabi
+fabius
+fakenode
+fclose
+fcount
+fd
+fdata
+fe
+ferror
+fffffffffff
+fffffffffffd
+fflush
+fi
+fieldlist
+fieldpat
+fieldsep
+fieldwidth
+fifo
+filedata
+filefuncs
+filelist
+filename
+filenames
+fileno
+fileref
+filesystem
+filesystem's
+filesystems
+filetype
+filll
+finalout
+findpat
+finfo
+finx
+firstname
+flac
+flist
+fmode
+fn
+fname
+fnmatch
+fo
+foObAr
+foo
+foo's
+foob
+foobar
+foooo
+foooobazbarrrrr
+fopen
+formatter
+formatters
+formfeed
+fp
+fpat
+fpath
+fpbits
+fprintf
+fr
+freebsd
+freefriends
+freq
+fs
+fsf
+fstat
+ftrans
+fts
+ftype
+fullyear
+func
+funcp
+funcs
+funstuff
+fw
+fwrite
+ga
+gai
+gatech
+gawkapi
+gawkextlib
+gawkfts
+gawkinet
+gawklibpath
+gawkmisc
+gawkpath
+gawkrc
+gawktexi
+gcc
+gdb
+gdef
+ge
+gecos
+gen
+gensub
+gerard
+getaddrinfo
+getegid
+geteuid
+getgid
+getgrent
+getgrgid
+getgrnam
+getgruser
+getline
+getlocaltime
+getopt
+getpid
+getpwent
+getpwnam
+getpwuid
+gettext
+gettime
+gettimeofday
+getuid
+gid
+gierd
+github
+gmail
+gmo
+gmp
+gmplib
+gmx
+gnubin
+gnv
+goawk
+golang
+goldberg
+goodie
+goto
+gr
+grcat
+grep
+groff
+groupawk
+groupsbyuser
+grp
+gst
+gsub
+guerrero
+gunzip
+gvim
+gz
+gzip
+halign
+hankedr
+hardcoded
+hboxes
+headitem
+helpfull
+helplib
+hfil
+hh
+hhhh
+hhob
+histsort
+hlp
+hobbes
+hodge
+hotmail
+hpmuseum
+hrule
+hrulefill
+hspan
+htm
+html
+http
+https
+hu
+hzang
+hzuo
+iCF
+iSKUNK
+ibufp
+idir
+idx
+ieee
+ietf
+ifclear
+ifdef
+ifdocbook
+ifhtml
+ifinfo
+ifndef
+ifnotdocbook
+ifnothtml
+ifnotinfo
+ifnotplaintext
+ifnottex
+ifnotxml
+ifplaintext
+ifset
+iftex
+ifxml
+igawk
+iggy
+ileaf
+illumos
+imagedata
+imageobject
+implementers
+implementors
+inbuf
+incrementing
+ind
+indirectcall
+indx
+inelegancies
+inet
+inexactitude
+inf
+infodir
+inforef
+informaltable
+infusarum
+ing
+ington
+init
+inited
+initializations
+inline
+inlinefmt
+inlineraw
+inmargin
+ino
+inode
+inplace
+inputfile
+insertcopying
+int
+intdiv
+interline
+internl
+interprocess
+io
+iobuf
+isarray
+isatty
+iso
+ist
+itd
+itemx
+ith
+ival
+iw
+jawk
+jcvx
+jeanpa
+jeanpaul
+jedi
+jeroen
+jmp
+joan
+jobtitle
+joe
+johansen
+johnny
+joyent
+json
+juan
+julie
+karl
+katie
+kb
+kbd
+kilgrona
+kmem
+kpilot
+ksh
+labadie
+lan
+lanceolis
+lang
+lawyering
+lc
+ld
+ldquo
+le
+lefthand
+len
+leq
+lex
+lf
+lflashlight
+lgcc
+lgpl
+lhs
+li
+libexec
+libexecdir
+libintl
+libmawk
+libtool
+licensors
+lineannotation
+lineno
+linespace
+linkcolor
+linkend
+linksize
+linkval
+lintwarn
+linux
+listsize
+literallayout
+localhost
+locutus
+loopcheck
+lordchr
+lp
+lshift
+lstat
+lt
+ltarget
+ltmain
+lu
+lvalue
+lvalues
+lwall
+lwc
+madronabluff
+maintainer's
+makeinfo
+malloc
+malloced
+mandir
+matcher
+matchers
+matchit
+mathcs
+mathworld
+mawk
+maxelt
+maxsub
+mbfw
+mbprintf
+mediaobject
+mem
+memcpy
+memset
+metacharacter
+metacharacters
+metaflac
+metasyntactic
+mey
+mikebrennan
+min
+mingw
+miriam
+misc
+mit
+mk
+mkdir
+mkinstalldirs
+mktime
+mmk
+mms
+mo
+mon
+monthday
+monthname
+moore
+mortoneccc
+mpfr
+mpz
+msg
+msgfmt
+msgid
+msgstr
+mtime
+mtrace
+multiFOO
+multibyte
+multicharacter
+multiflag
+multiline
+multispan
+multitable
+multitranslation
+murphy
+mv
+mydata
+myfile
+myfileaa
+myfileab
+myfiles
+myfunc
+myprint
+myprog
+mystrtonum
+mysub
+nInfo
+nLINE
+nOUCH
+nameend
+namespace
+namespaces
+namest
+nan
+nanosleep
+naptime
+nargs
+nawk
+nboxes
+nbsp
+nc
+ncustomers
+nd
+ndash
+ndevicesim
+ndirs
+ne
+netbsd
+nethox
+netlabs
+netlib
+newdata
+newdir
+newgawk
+newsxfer
+nexgo
+nextfile
+nexti
+nf
+nfields
+ni
+nline
+nlink
+nls
+nmatches
+nmemb
+nmsu
+nnn
+noalign
+noassign
+nogroup
+noindent
+nologin
+nonalphabetic
+nonalphanumeric
+nonblank
+nonchangeable
+noncommercially
+nonconstant
+nondecimal
+nonformat
+nonhexadecimal
+nonintegral
+noninteractive
+noninteractively
+nonmatching
+nonnegative
+nonnumeric
+nonobvious
+nonoption
+nonoverlapping
+nonportable
+nonprintable
+nonprinting
+nonproduction
+nonquoted
+nonrectangular
+nonrepeated
+nonspecial
+nonwhitespace
+noone
+nr
+nroff
+ns
+nul
+num
+numfields
+nums
+nusers
+nvalue
+nwords
+ny
+nyah
+nyu
+obaCLDUX
+obufp
+oct
+octuple
+oddheading
+ofB
+offinterlineskip
+ok
+olddol
+oldfilename
+oldfs
+oldrs
+omment
+onetrueawk
+onlinepubs
+oo
+op
+opcodes
+openbsd
+opengroup
+ops
+optarg
+opterr
+opti
+optind
+optitle
+optopt
+ord
+ordchr
+org
+orig
+orspan
+os
+otiens
+ourfile
+ourne
+outbuf
+outfile
+outname
+outputfile
+overfulls
+pactechdata
+panos
+para
+param
+parameterized
+parsedebug
+parser's
+parsers
+passwd
+passwdawk
+pathlist
+pathname
+pathnames
+pathto
+patsplit
+pawk
+pc
+pdf
+pdksh
+pdq
+peifer
+pengyu
+perl
+perscr
+perscrutabor
+pgawk
+pgr
+pgrpid
+ph
+phhhhhhhhhhhhhhooey
+phore
+php
+phph
+phphph
+pic
+pid
+pival
+plugin
+pm
+pmode
+png
+po
+podge
+portably
+posix
+postfix
+postincrement
+pp
+ppid
+pr
+pre
+prec
+precedences
+precisions
+prefaceinfo
+preformatted
+preopened
+prepend
+prepended
+prepending
+prepends
+prepinfo
+preprocessor
+prev
+princeton
+printf
+printindex
+printpage
+priori
+proc
+processarray
+profiler
+prog
+progfile
+pseudorandom
+psl
+psx
+pt
+ptr
+pty
+ptys
+pud
+punct
+putchar
+pw
+pwcat
+pwd
+pxref
+qb
+qc
+qquad
+qse
+qsl
+qsort
+quanstro
+quicksort
+quiktrim
+quux
+rab
+radians
+raincloud
+raison
+ramey
+rand
+randint
+rankin
+rapidjson
+rdev
+rdquo
+reada
+readdir
+readfile
+readline
+realloc
+recomputation
+reddit
+redir
+redirections
+reenable
+regcomp
+regex
+regexec
+regexp
+regexps
+reimplementing
+relationals
+relicensing
+reparsed
+repl
+repo
+representable
+resplit
+ret
+retargetable
+retitle
+retval
+revoutput
+revtwoway
+rfc
+rflashlight
+righthand
+rm
+rms
+ro
+roundTiesToAway
+roundTiesToEven
+roundTowardNegative
+roundTowardPositive
+roundTowardZero
+roundmode
+rowsep
+rpath
+rshift
+rsort
+rt
+ru
+runnable
+runtime
+rvalues
+rw
+rwarray
+rwxr
+sam
+samp
+samuel
+sar
+savannah
+sbcglobal
+sbin
+sbuf
+sc
+scanf
+scl
+scm
+scottd
+sdot
+searchlist
+sed
+sep
+seps
+setchapternewpage
+setenv
+setfilename
+setlinebuf
+settitle
+sf
+shar
+shellquote
+shortdayname
+shorthands
+shortmonth
+shorttitlepage
+showargs
+shu
+si
+signedness
+significand
+sim
+sizeof
+skeeve
+skynet
+slrn
+smallbook
+smallexample
+smallskip
+smtp
+snmp
+snobol
+solaris
+sophie
+sortcom
+sourceforge
+sp
+spanname
+spanspec
+spawnl
+sprintf
+sprintlink
+sq
+sqQ
+sqrt
+srand
+src
+ssize
+stackoverflow
+stackptr
+standalone
+stat
+statdata
+statfunc
+std
+stdbuf
+stddef
+stderr
+stdin
+stdlib
+stdout
+stepi
+str
+stranslate
+strcmp
+strcoll
+strcpy
+strerror
+strftime
+strlen
+strnum
+strnums
+strtod
+strtonum
+struct
+subarray
+subarrays
+subdirectories
+subdirectory
+subexpression
+subexpressions
+sublicense
+sublicenses
+subscripting
+substr
+substring
+substrings
+subsubsection
+subunit
+sudo
+summarycontents
+superset
+svil
+sylogin
+sym
+symlink
+syncodeindex
+synindex
+sys
+syshlp
+systime
+t'noD
+t'nod
+tAHPQ
+tARGV
+tabor
+tarball
+tarballs
+tbody
+tbreak
+tchars
+tcount
+tcp
+tcpip
+tcsh
+tdata
+teardown
+tegrep
+tempfile
+testarray
+testbits
+testdir
+testext
+testff
+testpasswd
+tew
+tex
+texi
+texindex
+texinfo
+textdomain
+tgroup
+th
+thead
+thes
+thischapter
+thisopt
+thispage
+thrudvang
+timestamp
+timestamps
+titlepage
+tlines
+tm
+tmp
+tmy
+tolower
+toupper
+tr
+traceback
+tracy
+transfile
+troff
+trunc
+tst
+ttotal
+tty
+ttyD
+ttyV
+ttyp
+ttyq
+ttyv
+tvpeople
+twords
+txt
+typedef
+typeof
+tyw
+ucb
+udc
+udp
+uid
+ulink
+umask
+umb
+umich
+un
+unary
+uncommented
+undef
+undevicesimus
+undisplay
+unduplicated
+unformatted
+unhandled
+unicode
+uniq
+unistd
+unix
+unnumberedsec
+unnumberedsubsec
+unparenthesized
+unredirected
+unsetting
+unspecialize
+untyped
+unwatch
+unwritable
+uref
+urefurlonlylinktrue
+urgen
+url
+urlcolor
+usebracesinindexestrue
+usenet
+username
+usernames
+usleep
+usr
+ut
+utah
+utc
+utf
+utils
+vF
+val
+validlab
+valrep
+valtype
+var
+variadic
+vbox
+vc
+vec
+versa
+versioned
+vglue
+vio
+vms
+vmsbuild
+vr
+vrule
+vskip
+waitpid
+walkarray
+washington
+wass
+watchpoint
+watchpoints
+wb
+wc
+wcscoll
+webmail
+weeknum
+wget
+wh
+whhhhhy
+whhhhy
+whhhy
+whhy
+whidbey
+whitespace
+whizprog
+wiki
+wikipedia
+wildcard
+wildcards
+wlv
+wnewmail
+wordfreq
+wr
+writea
+www
+wy
+xA
+xDEADBEEF
+xDeadBeef
+xFOO
+xX
+xaa
+xab
+xalloc
+xbd
+xdeadBEEF
+xdigit
+xfcc
+xfcd
+xffffffffffffffd
+xgawk
+xgettext
+xnrkb
+xor
+xorspan
+xp
+xpg
+xpzvf
+xr
+xrat
+xref
+xrefautomaticsectiontitle
+xrefprintnodename
+xvpf
+xvpzf
+xxAA
+xxBxx
+xxx
+xyz
+xyzzy
+xz
+yabber
+yacc
+yballs
+yearday
+ylwrap
+yourprog
+yxaay
+yyy
+zA
+zbcom
+zerofile
+zodiacusque
+zsh
+zzz
+zzzzzz
diff --git a/gawk-5.0.1/doc/wordlist2 b/gawk-5.0.1/doc/wordlist2
new file mode 100644
index 00000000000..7bf7ad369ab
--- /dev/null
+++ b/gawk-5.0.1/doc/wordlist2
@@ -0,0 +1,186 @@
+Autoconf
+Automake
+Autotools
+Awk
+Bernat
+CFLAGS
+ChangeLog
+Ctrl
+FIXME
+FSF
+FSF's
+Gettext
+GitHub
+ISBN
+Kahrs
+Libtool
+Makefile
+PCC
+PDF
+Rebase
+Rebasing
+Repo
+SVN
+TODO
+Texinfo
+Uncomment
+UsingGit
+Workflow
+Yehezkel
+ac
+apache
+api
+arnold
+arnoldrobbins
+async
+autoconf
+autocrlf
+automake
+autotools
+awk
+awkgram
+builtin
+cd
+cindex
+com
+config
+const
+cp
+cvs
+cz
+da
+detailmenu
+dfn
+diff
+diffs
+difftool
+dircategory
+direntry
+distclean
+docbook
+du
+dvi
+elled
+emph
+en
+env
+evenheading
+expandtab
+filetype
+filll
+finalout
+fn
+gawktexi
+gawkworkflow
+gc
+gcc
+gdef
+gettext
+gitconfig
+github
+gvim
+html
+http
+https
+iface
+ifdocbook
+ifhtml
+ifinfo
+ifnotdocbook
+ifnothtml
+ifnotinfo
+ifnottex
+ifnotxml
+ifplaintext
+iftex
+ifxml
+inlineraw
+insertcopying
+jpdev
+kbd
+labelled
+libtool
+lineannotation
+linkcolor
+listinfo
+literallayout
+llvm
+ltu
+ludd
+maintainer's
+makeinfo
+mpfr
+multiplestates
+mychange
+newfile
+noindent
+nongnu
+oddheading
+oldfile
+org
+ourfile
+overfulls
+para
+pc
+pcc
+po
+printindex
+pt
+pxref
+rebase
+rebasing
+regexp
+repo
+repo's
+samp
+savannah
+scm
+se
+setchapternewpage
+setfilename
+settitle
+shiftwidth
+shorttitlepage
+smallbook
+smallexample
+sp
+srv
+ssh
+stderr
+stdout
+summarycontents
+sv
+syncodeindex
+synindex
+tabstop
+tcc
+tex
+texi
+texinfo
+thischapter
+thispage
+tinycc
+titlepage
+tmp
+toto
+ui
+ulink
+unnumberedsec
+upstream's
+uref
+urefurlonlylinktrue
+urgen
+url
+urlcolor
+var
+vms
+vr
+vskip
+wordpress
+workflow
+worthwile
+www
+xref
+xxx
+xxxxxx
+yourname
diff --git a/gawk-5.0.1/doc/wordlist3 b/gawk-5.0.1/doc/wordlist3
new file mode 100644
index 00000000000..62e3e6136e0
--- /dev/null
+++ b/gawk-5.0.1/doc/wordlist3
@@ -0,0 +1,247 @@
+AB
+ABCDEF
+API
+ARGC
+ARGIND
+ARGV
+AWK
+AWKLIBPATH
+AWKPATH
+Ab
+Aho
+BEGINFILE
+BEL
+BINMODE
+CGI
+CONVFMT
+Coprocesses
+Cygwin
+DD
+DJGPP
+DST
+EAGAIN
+EINTR
+ENDFILE
+ERRNO
+ESC
+ETIMEDOUT
+EWOULDBLOCK
+FIELDWIDTHS
+FNR
+FPAT
+FS
+FUNCTAB
+Fenlason
+GMP
+HH
+IGNORECASE
+IPv
+ISBN
+LC
+Localizable
+MKS
+MPFR
+MSEC
+MinGW
+NF
+NR
+OFMT
+OFS
+ORS
+OpenVMS
+PREC
+PROCINFO
+RLENGTH
+ROUNDMODE
+RSTART
+RT
+Regexp
+Retryable
+SIGHUP
+SIGUSR
+SS
+SUBSEP
+SYMTAB
+TEXTDOMAIN
+TP
+Trueman
+UTC
+Weinberger
+YYYY
+Za
+aB
+ab
+abc
+abcdef
+alnum
+api
+argv
+arnold
+asc
+asort
+asorti
+atan
+awk
+awkprof
+awkvars
+bignum
+bindtextdomain
+builtin
+ch
+cmd
+cmp
+cntrl
+comp
+compl
+coprocess
+coprocesses
+cos
+cygwin
+datespec
+dcgettext
+dcngettext
+dd
+ddd
+dddddd
+denom
+desc
+dev
+djgpp
+dl
+ds
+eB
+eS
+eW
+ea
+eb
+ec
+ef
+egid
+egrep
+en
+er
+errno
+euid
+ev
+ew
+exp
+expr
+ey
+fclose
+fd
+fflush
+fmt
+foo
+formfeed
+fs
+func
+gen
+gensub
+getegid
+geteuid
+getgid
+getgroups
+getline
+getpgrp
+getpid
+getppid
+gettext
+getuid
+gid
+gmo
+gmp
+gsub
+hhhh
+html
+https
+ind
+inet
+int
+intdiv
+isarray
+lang
+lc
+localizable
+logdir
+lport
+lq
+lshift
+macosx
+metacharacter
+metacharacters
+min
+mingw
+mktime
+monde
+mpfr
+multibyte
+myfunc
+myhome
+myprog
+nextfile
+nlines
+nmap
+nonsignificant
+nonwhitespace
+num
+org
+os
+parsedebug
+patsplit
+pclose
+pgrpid
+pid
+posix
+ppid
+pre
+prec
+printf
+pty
+punct
+rand
+regex
+regexp
+resplit
+rhost
+roundTiesToEven
+roundTowardNegative
+roundTowardPositive
+roundTowardZero
+rport
+rq
+rshift
+rw
+sed
+seps
+sprintf
+srand
+stderr
+stdin
+stdout
+str
+strftime
+strnum
+strtod
+strtonum
+subarray
+substr
+systime
+tcp
+tolower
+toupper
+typeof
+udp
+uid
+uintmax
+usleep
+usr
+utc
+val
+var
+vars
+vms
+wr
+www
+xdigit
+xor
+zero'th
diff --git a/gawk-5.0.1/eval.c b/gawk-5.0.1/eval.c
new file mode 100644
index 00000000000..8acfba0fd2d
--- /dev/null
+++ b/gawk-5.0.1/eval.c
@@ -0,0 +1,1786 @@
+/*
+ * eval.c - gawk bytecode interpreter
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+extern double pow(double x, double y);
+extern double modf(double x, double *yp);
+extern double fmod(double x, double y);
+NODE **fcall_list = NULL;
+long fcall_count = 0;
+int currule = 0;
+IOBUF *curfile = NULL;		/* current data file */
+bool exiting = false;
+
+int (*interpret)(INSTRUCTION *);
+#define MAX_EXEC_HOOKS	10
+static int num_exec_hook = 0;
+static Func_pre_exec pre_execute[MAX_EXEC_HOOKS];
+static Func_post_exec post_execute = NULL;
+
+extern void frame_popped();
+
+int OFSlen;
+int ORSlen;
+int OFMTidx;
+int CONVFMTidx;
+
+static NODE *node_Boolean[2];
+
+/* This rather ugly macro is for VMS C */
+#ifdef C
+#undef C
+#endif
+#define C(c) ((char)c)
+/*
+ * This table is used by the regexp routines to do case independent
+ * matching. Basically, every ascii character maps to itself, except
+ * uppercase letters map to lower case ones. This table has 256
+ * entries, for ISO 8859-1. Note also that if the system this
+ * is compiled on doesn't use 7-bit ascii, casetable[] should not be
+ * defined to the linker, so gawk should not load.
+ *
+ * Do NOT make this array static, it is used in several spots, not
+ * just in this file.
+ *
+ * 6/2004:
+ * This table is also used for IGNORECASE for == and !=, and index().
+ * Although with GLIBC, we could use tolower() everywhere and RE_ICASE
+ * for the regex matcher, precomputing this table once gives us a
+ * performance improvement.  I also think it's better for portability
+ * to non-GLIBC systems.  All the world is not (yet :-) GNU/Linux.
+ */
+#if 'a' == 97	/* it's ascii */
+char casetable[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	/* ' '     '!'     '"'     '#'     '$'     '%'     '&'     ''' */
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	/* '('     ')'     '*'     '+'     ','     '-'     '.'     '/' */
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	/* '0'     '1'     '2'     '3'     '4'     '5'     '6'     '7' */
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	/* '8'     '9'     ':'     ';'     '<'     '='     '>'     '?' */
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	/* '@'     'A'     'B'     'C'     'D'     'E'     'F'     'G' */
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	/* 'H'     'I'     'J'     'K'     'L'     'M'     'N'     'O' */
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	/* 'P'     'Q'     'R'     'S'     'T'     'U'     'V'     'W' */
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	/* 'X'     'Y'     'Z'     '['     '\'     ']'     '^'     '_' */
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	/* '`'     'a'     'b'     'c'     'd'     'e'     'f'     'g' */
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	/* 'h'     'i'     'j'     'k'     'l'     'm'     'n'     'o' */
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	/* 'p'     'q'     'r'     's'     't'     'u'     'v'     'w' */
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	/* 'x'     'y'     'z'     '{'     '|'     '}'     '~' */
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+
+	/* Latin 1: */
+	/*
+	 * 4/2019: This is now overridden; in single byte locales
+	 * we call load_casetable from main and it fills in the values
+	 * based on the current locale. In particular, we want LC_ALL=C
+	 * to work correctly for values >= 0200.
+	 */
+	C('\200'), C('\201'), C('\202'), C('\203'), C('\204'), C('\205'), C('\206'), C('\207'),
+	C('\210'), C('\211'), C('\212'), C('\213'), C('\214'), C('\215'), C('\216'), C('\217'),
+	C('\220'), C('\221'), C('\222'), C('\223'), C('\224'), C('\225'), C('\226'), C('\227'),
+	C('\230'), C('\231'), C('\232'), C('\233'), C('\234'), C('\235'), C('\236'), C('\237'),
+	C('\240'), C('\241'), C('\242'), C('\243'), C('\244'), C('\245'), C('\246'), C('\247'),
+	C('\250'), C('\251'), C('\252'), C('\253'), C('\254'), C('\255'), C('\256'), C('\257'),
+	C('\260'), C('\261'), C('\262'), C('\263'), C('\264'), C('\265'), C('\266'), C('\267'),
+	C('\270'), C('\271'), C('\272'), C('\273'), C('\274'), C('\275'), C('\276'), C('\277'),
+	C('\340'), C('\341'), C('\342'), C('\343'), C('\344'), C('\345'), C('\346'), C('\347'),
+	C('\350'), C('\351'), C('\352'), C('\353'), C('\354'), C('\355'), C('\356'), C('\357'),
+	C('\360'), C('\361'), C('\362'), C('\363'), C('\364'), C('\365'), C('\366'), C('\327'),
+	C('\370'), C('\371'), C('\372'), C('\373'), C('\374'), C('\375'), C('\376'), C('\337'),
+	C('\340'), C('\341'), C('\342'), C('\343'), C('\344'), C('\345'), C('\346'), C('\347'),
+	C('\350'), C('\351'), C('\352'), C('\353'), C('\354'), C('\355'), C('\356'), C('\357'),
+	C('\360'), C('\361'), C('\362'), C('\363'), C('\364'), C('\365'), C('\366'), C('\367'),
+	C('\370'), C('\371'), C('\372'), C('\373'), C('\374'), C('\375'), C('\376'), C('\377'),
+};
+#elif defined(USE_EBCDIC)
+char casetable[] = {
+ /*00  NU    SH    SX    EX    PF    HT    LC    DL */
+      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ /*08              SM    VT    FF    CR    SO    SI */
+      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ /*10  DE    D1    D2    TM    RS    NL    BS    IL */
+      0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ /*18  CN    EM    CC    C1    FS    GS    RS    US */
+      0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
+ /*20  DS    SS    FS          BP    LF    EB    EC */
+      0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ /*28              SM    C2    EQ    AK    BL       */
+      0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
+ /*30              SY          PN    RS    UC    ET */
+      0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+ /*38                    C3    D4    NK          SU */
+      0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
+ /*40  SP                                           */
+      0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+ /*48             CENT    .     <     (     +     | */
+      0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
+ /*50   &                                           */
+      0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ /*58               !     $     *     )     ;     ^ */
+      0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ /*60   -     /                                     */
+      0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ /*68               |     ,     %     _     >     ? */
+      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
+ /*70                                               */
+      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ /*78         `     :     #     @     '     =     " */
+      0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
+ /*80         a     b     c     d     e     f     g */
+      0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ /*88   h     i           {                         */
+      0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
+ /*90         j     k     l     m     n     o     p */
+      0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ /*98   q     r           }                         */
+      0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
+ /*A0         ~     s     t     u     v     w     x */
+      0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
+ /*A8   y     z                       [             */
+      0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
+ /*B0                                               */
+      0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
+ /*B8                                 ]             */
+      0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
+ /*C0   {     A     B     C     D     E     F     G */
+      0xC0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+ /*C8   H     I                                     */
+      0x88, 0x89, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+ /*D0   }     J     K     L     M     N     O     P */
+      0xD0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ /*D8   Q     R                                     */
+      0x98, 0x99, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
+ /*E0   \           S     T     U     V     W     X */
+      0xE0, 0xE1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
+ /*E8   Y     Z                                     */
+      0xA8, 0xA9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+ /*F0   0     1     2     3     4     5     6     7 */
+      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+ /*F8   8     9                                     */
+      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
+};
+#else
+#include "You lose. You will need a translation table for your character set."
+#endif
+
+#undef C
+
+/* load_casetable --- for a non-ASCII locale, redo the table */
+
+void
+load_casetable(void)
+{
+#if defined(LC_CTYPE)
+	int i;
+	static bool loaded = false;
+
+	if (loaded || do_traditional)
+		return;
+
+	loaded = true;
+
+#ifndef USE_EBCDIC
+	/* use of isalpha is ok here (see is_alpha in awkgram.y) */
+	for (i = 0200; i <= 0377; i++) {
+		if (isalpha(i) && islower(i) && i != toupper(i))
+			casetable[i] = toupper(i);
+		else
+			casetable[i] = i;
+	}
+#endif
+#endif
+}
+
+/*
+ * This table maps node types to strings for debugging.
+ * KEEP IN SYNC WITH awk.h!!!!
+ */
+
+static const char *const nodetypes[] = {
+	"Node_illegal",
+	"Node_val",
+	"Node_regex",
+	"Node_dynregex",
+	"Node_var",
+	"Node_var_array",
+	"Node_var_new",
+	"Node_param_list",
+	"Node_func",
+	"Node_ext_func",
+	"Node_builtin_func",
+	"Node_array_ref",
+	"Node_array_tree",
+	"Node_array_leaf",
+	"Node_dump_array",
+	"Node_arrayfor",
+	"Node_frame",
+	"Node_instruction",
+	"Node_final --- this should never appear",
+	NULL
+};
+
+
+/*
+ * This table maps Op codes to strings.
+ * KEEP IN SYNC WITH awk.h!!!!
+ */
+
+static struct optypetab {
+	char *desc;
+	char *operator;
+} optypes[] = {
+	{ "Op_illegal", NULL },
+	{ "Op_times", " * " },
+	{ "Op_times_i", " * " },
+	{ "Op_quotient", " / " },
+	{ "Op_quotient_i", " / " },
+	{ "Op_mod", " % " },
+	{ "Op_mod_i", " % " },
+	{ "Op_plus", " + " },
+	{ "Op_plus_i", " + " },
+	{ "Op_minus", " - " },
+	{ "Op_minus_i", " - " },
+	{ "Op_exp", " ^ " },
+	{ "Op_exp_i", " ^ " },
+	{ "Op_concat", " " },
+	{ "Op_line_range", NULL },
+	{ "Op_cond_pair", ", " },
+	{ "Op_subscript", "[]" },
+	{ "Op_sub_array", "[]" },
+	{ "Op_preincrement", "++" },
+	{ "Op_predecrement", "--" },
+	{ "Op_postincrement", "++" },
+	{ "Op_postdecrement", "--" },
+	{ "Op_unary_minus", "-" },
+	{ "Op_unary_plus", "+" },
+	{ "Op_field_spec", "$" },
+	{ "Op_not", "! " },
+	{ "Op_assign", " = " },
+	{ "Op_store_var", " = " },
+	{ "Op_store_sub", " = " },
+	{ "Op_store_field", " = " },
+	{ "Op_assign_times", " *= " },
+	{ "Op_assign_quotient", " /= " },
+	{ "Op_assign_mod", " %= " },
+	{ "Op_assign_plus", " += " },
+	{ "Op_assign_minus", " -= " },
+	{ "Op_assign_exp", " ^= " },
+	{ "Op_assign_concat", " " },
+	{ "Op_and", " && " },
+	{ "Op_and_final", NULL },
+	{ "Op_or", " || " },
+	{ "Op_or_final", NULL },
+	{ "Op_equal", " == " },
+	{ "Op_notequal", " != " },
+	{ "Op_less", " < " },
+	{ "Op_greater", " > " },
+	{ "Op_leq", " <= " },
+	{ "Op_geq", " >= " },
+	{ "Op_match", " ~ " },
+	{ "Op_match_rec", NULL },
+	{ "Op_nomatch", " !~ " },
+	{ "Op_rule", NULL },
+	{ "Op_K_case", "case" },
+	{ "Op_K_default", "default" },
+	{ "Op_K_break", "break" },
+	{ "Op_K_continue", "continue" },
+	{ "Op_K_print", "print" },
+	{ "Op_K_print_rec", "print" },
+	{ "Op_K_printf", "printf" },
+	{ "Op_K_next", "next" },
+	{ "Op_K_exit", "exit" },
+	{ "Op_K_return", "return" },
+	{ "Op_K_return_from_eval", "return" },
+	{ "Op_K_delete", "delete" },
+	{ "Op_K_delete_loop", NULL },
+	{ "Op_K_getline_redir", "getline" },
+	{ "Op_K_getline", "getline" },
+	{ "Op_K_nextfile", "nextfile" },
+	{ "Op_K_namespace", "@namespace" },
+	{ "Op_builtin", NULL },
+	{ "Op_sub_builtin", NULL },
+	{ "Op_ext_builtin", NULL },
+	{ "Op_in_array", " in " },
+	{ "Op_func_call", NULL },
+	{ "Op_indirect_func_call", NULL },
+	{ "Op_push", NULL },
+	{ "Op_push_arg", NULL },
+	{ "Op_push_arg_untyped", NULL },
+	{ "Op_push_i", NULL },
+	{ "Op_push_re", NULL },
+	{ "Op_push_array", NULL },
+	{ "Op_push_param", NULL },
+	{ "Op_push_lhs", NULL },
+	{ "Op_subscript_lhs", "[]" },
+	{ "Op_field_spec_lhs", "$" },
+	{ "Op_no_op", NULL },
+	{ "Op_pop", NULL },
+	{ "Op_jmp", NULL },
+	{ "Op_jmp_true", NULL },
+	{ "Op_jmp_false", NULL },
+	{ "Op_get_record", NULL },
+	{ "Op_newfile", NULL },
+	{ "Op_arrayfor_init", NULL },
+	{ "Op_arrayfor_incr", NULL },
+	{ "Op_arrayfor_final", NULL },
+	{ "Op_var_update", NULL },
+	{ "Op_var_assign", NULL },
+	{ "Op_field_assign", NULL },
+	{ "Op_subscript_assign", NULL },
+	{ "Op_after_beginfile", NULL },
+	{ "Op_after_endfile", NULL },
+	{ "Op_func", NULL },
+	{ "Op_comment", NULL },
+	{ "Op_exec_count", NULL },
+	{ "Op_breakpoint", NULL },
+	{ "Op_lint", NULL },
+	{ "Op_atexit", NULL },
+	{ "Op_stop", NULL },
+	{ "Op_token", NULL },
+	{ "Op_symbol", NULL },
+	{ "Op_list", NULL },
+	{ "Op_K_do", "do" },
+	{ "Op_K_for", "for" },
+	{ "Op_K_arrayfor", "for" },
+	{ "Op_K_while", "while" },
+	{ "Op_K_switch", "switch" },
+	{ "Op_K_if", "if" },
+	{ "Op_K_else", "else" },
+	{ "Op_K_function", "function" },
+	{ "Op_cond_exp", NULL },
+	{ "Op_parens", NULL },
+	{ "Op_final --- this should never appear", NULL },
+	{ NULL, NULL },
+};
+
+/* nodetype2str --- convert a node type into a printable value */
+
+const char *
+nodetype2str(NODETYPE type)
+{
+	static char buf[40];
+
+	if (type >= Node_illegal && type <= Node_final)
+		return nodetypes[(int) type];
+
+	sprintf(buf, _("unknown nodetype %d"), (int) type);
+	return buf;
+}
+
+/* opcode2str --- convert an opcode type into a printable value */
+
+const char *
+opcode2str(OPCODE op)
+{
+	if (op >= Op_illegal && op < Op_final)
+		return optypes[(int) op].desc;
+	fatal(_("unknown opcode %d"), (int) op);
+	return NULL;
+}
+
+/* op2str --- convert an opcode type to corresponding operator or keyword */
+
+const char *
+op2str(OPCODE op)
+{
+	if (op >= Op_illegal && op < Op_final) {
+		if (optypes[(int) op].operator != NULL)
+			return optypes[(int) op].operator;
+		else
+			fatal(_("opcode %s not an operator or keyword"),
+					optypes[(int) op].desc);
+	} else
+		fatal(_("unknown opcode %d"), (int) op);
+	return NULL;
+}
+
+
+/* flags2str --- make a flags value readable */
+
+const char *
+flags2str(int flagval)
+{
+	static const struct flagtab values[] = {
+		{ MALLOC, "MALLOC" },
+		{ STRING, "STRING" },
+		{ STRCUR, "STRCUR" },
+		{ NUMCUR, "NUMCUR" },
+		{ NUMBER, "NUMBER" },
+		{ USER_INPUT, "USER_INPUT" },
+		{ INTLSTR, "INTLSTR" },
+		{ NUMINT, "NUMINT" },
+		{ INTIND, "INTIND" },
+		{ WSTRCUR, "WSTRCUR" },
+		{ MPFN,	"MPFN" },
+		{ MPZN,	"MPZN" },
+		{ NO_EXT_SET, "NO_EXT_SET" },
+		{ NULL_FIELD, "NULL_FIELD" },
+		{ ARRAYMAXED, "ARRAYMAXED" },
+		{ HALFHAT, "HALFHAT" },
+		{ XARRAY, "XARRAY" },
+		{ NUMCONSTSTR, "NUMCONSTSTR" },
+		{ REGEX, "REGEX" },
+		{ 0,	NULL },
+	};
+
+	return genflags2str(flagval, values);
+}
+
+/* genflags2str --- general routine to convert a flag value to a string */
+
+const char *
+genflags2str(int flagval, const struct flagtab *tab)
+{
+	static char buffer[BUFSIZ];
+	char *sp;
+	int i, space_left, space_needed;
+
+	sp = buffer;
+	space_left = BUFSIZ;
+	for (i = 0; tab[i].name != NULL; i++) {
+		if ((flagval & tab[i].val) != 0) {
+			/*
+			 * note the trick, we want 1 or 0 for whether we need
+			 * the '|' character.
+			 */
+			space_needed = (strlen(tab[i].name) + (sp != buffer));
+			if (space_left <= space_needed)
+				fatal(_("buffer overflow in genflags2str"));
+
+			if (sp != buffer) {
+				*sp++ = '|';
+				space_left--;
+			}
+			strcpy(sp, tab[i].name);
+			/* note ordering! */
+			space_left -= strlen(sp);
+			sp += strlen(sp);
+		}
+	}
+
+	*sp = '\0';
+	return buffer;
+}
+
+/* posix_compare --- compare strings using strcoll */
+
+static int
+posix_compare(NODE *s1, NODE *s2)
+{
+	int ret = 0;
+	char save1, save2;
+	size_t l = 0;
+
+	save1 = s1->stptr[s1->stlen];
+	s1->stptr[s1->stlen] = '\0';
+
+	save2 = s2->stptr[s2->stlen];
+	s2->stptr[s2->stlen] = '\0';
+
+	if (gawk_mb_cur_max == 1) {
+		if (strlen(s1->stptr) == s1->stlen && strlen(s2->stptr) == s2->stlen)
+			ret = strcoll(s1->stptr, s2->stptr);
+		else {
+			char b1[2], b2[2];
+			char *p1, *p2;
+			size_t i;
+
+			if (s1->stlen < s2->stlen)
+				l = s1->stlen;
+			else
+				l = s2->stlen;
+
+			b1[1] = b2[1] = '\0';
+			for (i = ret = 0, p1 = s1->stptr, p2 = s2->stptr;
+			     ret == 0 && i < l;
+			     p1++, p2++) {
+				b1[0] = *p1;
+				b2[0] = *p2;
+				ret = strcoll(b1, b2);
+			}
+		}
+		/*
+		 * Either worked through the strings or ret != 0.
+		 * In either case, ret will be the right thing to return.
+		 */
+	}
+#if ! defined(__DJGPP__)
+	else {
+		/* Similar logic, using wide characters */
+		(void) force_wstring(s1);
+		(void) force_wstring(s2);
+
+		if (wcslen(s1->wstptr) == s1->wstlen && wcslen(s2->wstptr) == s2->wstlen)
+			ret = wcscoll(s1->wstptr, s2->wstptr);
+		else {
+			wchar_t b1[2], b2[2];
+			wchar_t *p1, *p2;
+			size_t i;
+
+			if (s1->wstlen < s2->wstlen)
+				l = s1->wstlen;
+			else
+				l = s2->wstlen;
+
+			b1[1] = b2[1] = L'\0';
+			for (i = ret = 0, p1 = s1->wstptr, p2 = s2->wstptr;
+			     ret == 0 && i < l;
+			     p1++, p2++) {
+				b1[0] = *p1;
+				b2[0] = *p2;
+				ret = wcscoll(b1, b2);
+			}
+		}
+		/*
+		 * Either worked through the strings or ret != 0.
+		 * In either case, ret will be the right thing to return.
+		 */
+	}
+#endif
+
+	s1->stptr[s1->stlen] = save1;
+	s2->stptr[s2->stlen] = save2;
+	return ret;
+}
+
+
+/* cmp_nodes --- compare two nodes, returning negative, 0, positive */
+
+int
+cmp_nodes(NODE *t1, NODE *t2, bool use_strcmp)
+{
+	int ret = 0;
+	size_t len1, len2;
+	int l, ldiff;
+
+	if (t1 == t2)
+		return 0;
+
+	(void) fixtype(t1);
+	(void) fixtype(t2);
+
+	if ((t1->flags & NUMBER) != 0 && (t2->flags & NUMBER) != 0)
+		return cmp_numbers(t1, t2);
+
+	(void) force_string(t1);
+	(void) force_string(t2);
+	len1 = t1->stlen;
+	len2 = t2->stlen;
+	ldiff = len1 - len2;
+	if (len1 == 0 || len2 == 0)
+		return ldiff;
+
+	if (do_posix && ! use_strcmp)
+		return posix_compare(t1, t2);
+
+	l = (ldiff <= 0 ? len1 : len2);
+	if (IGNORECASE) {
+		const unsigned char *cp1 = (const unsigned char *) t1->stptr;
+		const unsigned char *cp2 = (const unsigned char *) t2->stptr;
+		char save1 = t1->stptr[t1->stlen];
+		char save2 = t2->stptr[t2->stlen];
+
+
+		if (gawk_mb_cur_max > 1) {
+			t1->stptr[t1->stlen] = t2->stptr[t2->stlen] = '\0';
+			ret = strncasecmpmbs((const unsigned char *) cp1,
+					     (const unsigned char *) cp2, l);
+			t1->stptr[t1->stlen] = save1;
+			t2->stptr[t2->stlen] = save2;
+		} else {
+			/* Could use tolower() here; see discussion above. */
+			for (ret = 0; l-- > 0 && ret == 0; cp1++, cp2++)
+				ret = casetable[*cp1] - casetable[*cp2];
+		}
+	} else
+		ret = memcmp(t1->stptr, t2->stptr, l);
+
+	ret = ret == 0 ? ldiff : ret;
+	return ret;
+}
+
+/* push_frame --- push a frame NODE onto stack */
+
+static void
+push_frame(NODE *f)
+{
+	static long max_fcall;
+
+	/* NB: frame numbering scheme as in GDB. frame_ptr => frame #0. */
+
+	fcall_count++;
+	if (fcall_list == NULL) {
+		max_fcall = 10;
+		emalloc(fcall_list, NODE **, (max_fcall + 1) * sizeof(NODE *), "push_frame");
+	} else if (fcall_count == max_fcall) {
+		max_fcall *= 2;
+		erealloc(fcall_list, NODE **, (max_fcall + 1) * sizeof(NODE *), "push_frame");
+	}
+
+	if (fcall_count > 1)
+		memmove(fcall_list + 2, fcall_list + 1, (fcall_count - 1) * sizeof(NODE *));
+	fcall_list[1] = f;
+}
+
+
+/* pop_frame --- pop off a frame NODE*/
+
+static void
+pop_frame()
+{
+	if (fcall_count > 1)
+		memmove(fcall_list + 1, fcall_list + 2, (fcall_count - 1) * sizeof(NODE *));
+	fcall_count--;
+	assert(fcall_count >= 0);
+	if (do_debug)
+		frame_popped();
+}
+
+
+/* dump_fcall_stack --- print a backtrace of the awk function calls */
+
+void
+dump_fcall_stack(FILE *fp)
+{
+	NODE *f, *func;
+	long i = 0, k = 0;
+
+	if (fcall_count == 0)
+		return;
+	fprintf(fp, _("\n\t# Function Call Stack:\n\n"));
+
+	/* current frame */
+	func = frame_ptr->func_node;
+	fprintf(fp, "\t# %3ld. %s\n", k++, func->vname);
+
+	/* outer frames except main */
+	for (i = 1; i < fcall_count; i++) {
+		f = fcall_list[i];
+		func = f->func_node;
+		fprintf(fp, "\t# %3ld. %s\n", k++, func->vname);
+	}
+
+	fprintf(fp, "\t# %3ld. -- main --\n", k);
+}
+
+
+/* set_IGNORECASE --- update IGNORECASE as appropriate */
+
+void
+set_IGNORECASE()
+{
+	static bool warned = false;
+
+	if ((do_lint_extensions || do_traditional) && ! warned) {
+		warned = true;
+		lintwarn(_("`IGNORECASE' is a gawk extension"));
+	}
+
+	if (do_traditional)
+		IGNORECASE = false;
+   	else
+		IGNORECASE = boolval(IGNORECASE_node->var_value);
+	set_RS();	/* set_RS() calls set_FS() if need be, for us */
+}
+
+/* set_BINMODE --- set translation mode (OS/2, DOS, others) */
+
+void
+set_BINMODE()
+{
+	static bool warned = false;
+	char *p;
+	NODE *v = fixtype(BINMODE_node->var_value);
+
+	if ((do_lint_extensions || do_traditional) && ! warned) {
+		warned = true;
+		lintwarn(_("`BINMODE' is a gawk extension"));
+	}
+	if (do_traditional)
+		BINMODE = TEXT_TRANSLATE;
+	else if ((v->flags & NUMBER) != 0) {
+		BINMODE = get_number_si(v);
+		/* Make sure the value is rational. */
+		if (BINMODE < TEXT_TRANSLATE)
+			BINMODE = TEXT_TRANSLATE;
+		else if (BINMODE > BINMODE_BOTH)
+			BINMODE = BINMODE_BOTH;
+	} else if ((v->flags & STRING) != 0) {
+		p = v->stptr;
+
+		/*
+		 * Allow only one of the following:
+		 * "0", "1", "2", "3",
+		 * "r", "w", "rw", "wr"
+		 * ANYTHING ELSE goes to 3. So there.
+		 */
+		switch (v->stlen) {
+		case 1:
+			switch (p[0]) {
+			case '0':
+			case '1':
+			case '2':
+			case '3':
+				BINMODE = p[0] - '0';
+				break;
+			case 'r':
+				BINMODE = BINMODE_INPUT;
+				break;
+			case 'w':
+				BINMODE = BINMODE_OUTPUT;
+				break;
+			default:
+				BINMODE = BINMODE_BOTH;
+				goto bad_value;
+				break;
+			}
+			break;
+		case 2:
+			switch (p[0]) {
+			case 'r':
+				BINMODE = BINMODE_BOTH;
+				if (p[1] != 'w')
+					goto bad_value;
+				break;
+			case 'w':
+				BINMODE = BINMODE_BOTH;
+				if (p[1] != 'r')
+					goto bad_value;
+				break;
+			}
+			break;
+		default:
+	bad_value:
+			lintwarn(_("BINMODE value `%s' is invalid, treated as 3"), p);
+			break;
+		}
+	} else
+		BINMODE = 3;		/* shouldn't happen */
+}
+
+/* set_OFS --- update OFS related variables when OFS assigned to */
+
+void
+set_OFS()
+{
+	static bool first = true;
+	size_t new_ofs_len;
+
+	if (first)	/* true when called from init_vars() in main() */
+		first = false;
+	else {
+		/* rebuild $0 using OFS that was current when $0 changed */
+		if (! field0_valid) {
+			get_field(UNLIMITED - 1, NULL);
+			rebuild_record();
+		}
+	}
+
+	/*
+	 * Save OFS value for use in building record and in printing.
+	 * Can't just have OFS point into the OFS_node since it's
+	 * already updated when we come into this routine, and we need
+	 * the old value to rebuild the record (see above).
+	 */
+	OFS_node->var_value = force_string(OFS_node->var_value);
+	new_ofs_len = OFS_node->var_value->stlen;
+
+	if (OFS == NULL)
+		emalloc(OFS, char *, new_ofs_len + 1, "set_OFS");
+	else if (OFSlen < new_ofs_len)
+		erealloc(OFS, char *, new_ofs_len + 1, "set_OFS");
+
+	memcpy(OFS, OFS_node->var_value->stptr, OFS_node->var_value->stlen);
+	OFSlen = new_ofs_len;
+	OFS[OFSlen] = '\0';
+}
+
+/* set_ORS --- update ORS related variables when ORS assigned to */
+
+void
+set_ORS()
+{
+	ORS_node->var_value = force_string(ORS_node->var_value);
+	ORS = ORS_node->var_value->stptr;
+	ORSlen = ORS_node->var_value->stlen;
+}
+
+/* fmt_ok --- is the conversion format a valid one? */
+
+NODE **fmt_list = NULL;
+static int fmt_ok(NODE *n);
+static int fmt_index(NODE *n);
+
+static int
+fmt_ok(NODE *n)
+{
+	NODE *tmp = force_string(n);
+	const char *p = tmp->stptr;
+
+#if ! defined(PRINTF_HAS_F_FORMAT) || PRINTF_HAS_F_FORMAT != 1
+	static const char float_formats[] = "efgEG";
+#else
+	static const char float_formats[] = "efgEFG";
+#endif
+#if defined(HAVE_LOCALE_H)
+	static const char flags[] = " +-#'";
+#else
+	static const char flags[] = " +-#";
+#endif
+
+	// We rely on the caller to zero-terminate n->stptr.
+
+	if (*p++ != '%')
+		return 0;
+	while (*p && strchr(flags, *p) != NULL)	/* flags */
+		p++;
+	while (*p && isdigit((unsigned char) *p))	/* width - %*.*g is NOT allowed */
+		p++;
+	if (*p == '\0' || (*p != '.' && ! isdigit((unsigned char) *p)))
+		return 0;
+	if (*p == '.')
+		p++;
+	while (*p && isdigit((unsigned char) *p))	/* precision */
+		p++;
+	if (*p == '\0' || strchr(float_formats, *p) == NULL)
+		return 0;
+	if (*++p != '\0')
+		return 0;
+	return 1;
+}
+
+/* fmt_index --- track values of OFMT and CONVFMT to keep semantics correct */
+
+static int
+fmt_index(NODE *n)
+{
+	int ix = 0;
+	static int fmt_num = 4;
+	static int fmt_hiwater = 0;
+	char save;
+
+	if (fmt_list == NULL)
+		emalloc(fmt_list, NODE **, fmt_num*sizeof(*fmt_list), "fmt_index");
+	n = force_string(n);
+
+	save = n->stptr[n->stlen];
+	n->stptr[n->stlen] = '\0';
+
+	while (ix < fmt_hiwater) {
+		if (cmp_nodes(fmt_list[ix], n, true) == 0)
+			return ix;
+		ix++;
+	}
+
+	/* not found */
+	if (do_lint && ! fmt_ok(n))
+		lintwarn(_("bad `%sFMT' specification `%s'"),
+			    n == CONVFMT_node->var_value ? "CONV"
+			  : n == OFMT_node->var_value ? "O"
+			  : "", n->stptr);
+
+	n->stptr[n->stlen] = save;
+
+	if (fmt_hiwater >= fmt_num) {
+		fmt_num *= 2;
+		erealloc(fmt_list, NODE **, fmt_num * sizeof(*fmt_list), "fmt_index");
+	}
+	fmt_list[fmt_hiwater] = dupnode(n);
+	return fmt_hiwater++;
+}
+
+/* set_OFMT --- track OFMT correctly */
+
+void
+set_OFMT()
+{
+	OFMTidx = fmt_index(OFMT_node->var_value);
+	OFMT = fmt_list[OFMTidx]->stptr;
+}
+
+/* set_CONVFMT --- track CONVFMT correctly */
+
+void
+set_CONVFMT()
+{
+	CONVFMTidx = fmt_index(CONVFMT_node->var_value);
+	CONVFMT = fmt_list[CONVFMTidx]->stptr;
+}
+
+/* set_LINT --- update LINT as appropriate */
+
+void
+set_LINT()
+{
+#ifndef NO_LINT
+	int old_lint = do_lint;
+	NODE *n = fixtype(LINT_node->var_value);
+
+	/* start with clean defaults */
+	lintfunc = r_warning;
+	do_flags &= ~(DO_LINT_ALL|DO_LINT_INVALID);
+
+	if ((n->flags & STRING) != 0) {
+		const char *lintval;
+		size_t lintlen;
+
+		lintval = n->stptr;
+		lintlen = n->stlen;
+		if (lintlen > 0) {
+			if (lintlen == 7 && strncmp(lintval, "invalid", 7) == 0)
+				do_flags |= DO_LINT_INVALID;
+			else if (lintlen == 6 && strncmp(lintval, "no-ext", 6) == 0)
+				do_flags &= ~DO_LINT_EXTENSIONS;
+			else {
+				do_flags |= DO_LINT_ALL;
+				if (lintlen == 5 && strncmp(lintval, "fatal", 5) == 0)
+					lintfunc = r_fatal;
+			}
+		}
+	} else {
+		if (! iszero(n))
+			do_flags |= DO_LINT_ALL;
+	}
+
+	/* explicitly use warning() here, in case lintfunc == r_fatal */
+	if (old_lint != do_lint && old_lint && ! do_lint)
+		warning(_("turning off `--lint' due to assignment to `LINT'"));
+
+	/* inform plug-in api of change */
+	update_ext_api();
+#endif /* ! NO_LINT */
+}
+
+/* set_TEXTDOMAIN --- update TEXTDOMAIN variable when TEXTDOMAIN assigned to */
+
+void
+set_TEXTDOMAIN()
+{
+	NODE *tmp;
+
+	tmp = TEXTDOMAIN_node->var_value = force_string(TEXTDOMAIN_node->var_value);
+	TEXTDOMAIN = tmp->stptr;
+	/*
+	 * Note: don't call textdomain(); this value is for
+	 * the awk program, not for gawk itself.
+	 */
+}
+
+/* update_ERRNO_int --- update the value of ERRNO based on argument */
+
+void
+update_ERRNO_int(int errcode)
+{
+	char *cp;
+
+	update_PROCINFO_num("errno", errcode);
+	if (errcode) {
+		cp = strerror(errcode);
+		cp = gettext(cp);
+	} else
+		cp = "";
+	unref(ERRNO_node->var_value);
+	ERRNO_node->var_value = make_string(cp, strlen(cp));
+}
+
+/* update_ERRNO_string --- update ERRNO */
+
+void
+update_ERRNO_string(const char *string)
+{
+	update_PROCINFO_num("errno", 0);
+	unref(ERRNO_node->var_value);
+	size_t len = strlen(string);
+#if defined(USE_EBCDIC) && defined(ELIDE_IBM_ERROR_CODE)
+	// skip over leading IBM error code
+	// N.B. This code is untested
+	if (isupper(string[0]) && isupper(string[1])) {
+		while (*string && *string != ' ')
+			string++;
+
+		while (*string && *string == ' ')
+			string++;
+
+		len = strlen(string);
+		if (string[len-1] == '.')
+			len--;	// remove the final '.'
+	}
+#endif
+	ERRNO_node->var_value = make_string(string, len);
+}
+
+/* unset_ERRNO --- eliminate the value of ERRNO */
+
+void
+unset_ERRNO(void)
+{
+	update_PROCINFO_num("errno", 0);
+	unref(ERRNO_node->var_value);
+	ERRNO_node->var_value = dupnode(Nnull_string);
+}
+
+/* update_NR --- update the value of NR */
+
+void
+update_NR()
+{
+#ifdef HAVE_MPFR
+	if (is_mpg_number(NR_node->var_value))
+		(void) mpg_update_var(NR_node);
+	else
+#endif
+	if (NR_node->var_value->numbr != NR) {
+		unref(NR_node->var_value);
+		NR_node->var_value = make_number(NR);
+	}
+}
+
+/* update_NF --- update the value of NF */
+
+void
+update_NF()
+{
+	long l;
+
+	l = get_number_si(NF_node->var_value);
+	if (NF == -1 || l != NF) {
+		if (NF == -1)
+			(void) get_field(UNLIMITED - 1, NULL); /* parse record */
+		unref(NF_node->var_value);
+		NF_node->var_value = make_number(NF);
+	}
+}
+
+/* update_FNR --- update the value of FNR */
+
+void
+update_FNR()
+{
+#ifdef HAVE_MPFR
+	if (is_mpg_number(FNR_node->var_value))
+		(void) mpg_update_var(FNR_node);
+	else
+#endif
+	if (FNR_node->var_value->numbr != FNR) {
+		unref(FNR_node->var_value);
+		FNR_node->var_value = make_number(FNR);
+	}
+}
+
+
+NODE *frame_ptr;        /* current frame */
+STACK_ITEM *stack_ptr = NULL;
+STACK_ITEM *stack_bottom;
+STACK_ITEM *stack_top;
+static unsigned long STACK_SIZE = 256;    /* initial size of stack */
+int max_args = 0;       /* maximum # of arguments to printf, print, sprintf,
+                         * or # of array subscripts, or adjacent strings
+                         * to be concatenated.
+                         */
+NODE **args_array = NULL;
+
+/* grow_stack --- grow the size of runtime stack */
+
+/* N.B. stack_ptr points to the topmost occupied location
+ *      on the stack, not the first free location.
+ */
+
+STACK_ITEM *
+grow_stack()
+{
+	STACK_SIZE *= 2;
+	erealloc(stack_bottom, STACK_ITEM *, STACK_SIZE * sizeof(STACK_ITEM), "grow_stack");
+	stack_top = stack_bottom + STACK_SIZE - 1;
+	stack_ptr = stack_bottom + STACK_SIZE / 2;
+	return stack_ptr;
+}
+
+/*
+ * r_get_lhs:
+ * This returns a POINTER to a node pointer (var's value).
+ * used to store the var's new value.
+ */
+
+NODE **
+r_get_lhs(NODE *n, bool reference)
+{
+	bool isparam = false;
+
+	if (n->type == Node_param_list) {
+		isparam = true;
+		n = GET_PARAM(n->param_cnt);
+	}
+
+	switch (n->type) {
+	case Node_var_array:
+		fatal(_("attempt to use array `%s' in a scalar context"),
+				array_vname(n));
+	case Node_array_ref:
+		if (n->orig_array->type == Node_var_array)
+			fatal(_("attempt to use array `%s' in a scalar context"),
+					array_vname(n));
+		if (n->orig_array->type != Node_var) {
+			n->orig_array->type = Node_var;
+			n->orig_array->var_value = dupnode(Nnull_string);
+		}
+		/* fall through */
+	case Node_var_new:
+		n->type = Node_var;
+		n->var_value = dupnode(Nnull_string);
+		break;
+
+	case Node_var:
+		break;
+
+	default:
+		cant_happen();
+	}
+
+	if (do_lint && reference && var_uninitialized(n))
+		lintwarn((isparam ?
+			_("reference to uninitialized argument `%s'") :
+			_("reference to uninitialized variable `%s'")),
+				n->vname);
+	return & n->var_value;
+}
+
+
+/* r_get_field --- get the address of a field node */
+
+NODE **
+r_get_field(NODE *n, Func_ptr *assign, bool reference)
+{
+	long field_num;
+	NODE **lhs;
+
+	if (assign)
+		*assign = NULL;
+	if (do_lint) {
+		if ((fixtype(n)->flags & NUMBER) == 0) {
+			lintwarn(_("attempt to field reference from non-numeric value"));
+			if (n->stlen == 0)
+				lintwarn(_("attempt to field reference from null string"));
+		}
+	}
+
+	(void) force_number(n);
+	field_num = get_number_si(n);
+
+	if (field_num < 0)
+		fatal(_("attempt to access field %ld"), field_num);
+
+	if (field_num == 0 && field0_valid) {		/* short circuit */
+		lhs = &fields_arr[0];
+		if (assign)
+			*assign = reset_record;
+	} else
+		lhs = get_field(field_num, assign);
+	if (do_lint && reference && ((*lhs)->flags & NULL_FIELD) != 0)
+		lintwarn(_("reference to uninitialized field `$%ld'"),
+			      field_num);
+	return lhs;
+}
+
+
+/*
+ * calc_exp_posint --- calculate x^n for positive integral n,
+ * using exponentiation by squaring without recursion.
+ */
+
+static AWKNUM
+calc_exp_posint(AWKNUM x, long n)
+{
+	AWKNUM mult = 1;
+
+	while (n > 1) {
+		if ((n % 2) == 1)
+			mult *= x;
+		x *= x;
+		n /= 2;
+	}
+	return mult * x;
+}
+
+/* calc_exp --- calculate x1^x2 */
+
+AWKNUM
+calc_exp(AWKNUM x1, AWKNUM x2)
+{
+	long lx;
+
+	if ((lx = x2) == x2) {		/* integer exponent */
+		if (lx == 0)
+			return 1;
+		return (lx > 0) ? calc_exp_posint(x1, lx)
+				: 1.0 / calc_exp_posint(x1, -lx);
+	}
+	return (AWKNUM) pow((double) x1, (double) x2);
+}
+
+
+/* setup_frame --- setup new frame for function call */
+
+static INSTRUCTION *
+setup_frame(INSTRUCTION *pc)
+{
+	NODE *r = NULL;
+	NODE *m, *f, *fp;
+	NODE **sp = NULL;
+	int pcount, arg_count, i, j;
+
+	f = pc->func_body;
+	pcount = f->param_cnt;
+	fp = f->fparms;
+	arg_count = (pc + 1)->expr_count;
+
+	if (pcount > 0) {
+		ezalloc(sp, NODE **, pcount * sizeof(NODE *), "setup_frame");
+	}
+
+	/* check for extra args */
+	if (arg_count > pcount) {
+		warning(
+			_("function `%s' called with more arguments than declared"),
+       			f->vname);
+		do {
+			r = POP();
+			if (r->type == Node_val)
+				DEREF(r);
+		} while (--arg_count > pcount);
+	}
+
+	for (i = 0, j = arg_count - 1; i < pcount; i++, j--) {
+		getnode(r);
+		memset(r, 0, sizeof(NODE));
+		sp[i] = r;
+
+		if (i >= arg_count) {
+			/* local variable */
+			r->type = Node_var_new;
+			r->vname = fp[i].param;
+			continue;
+		}
+
+		m = PEEK(j); /* arguments in reverse order on runtime stack */
+
+		if (m->type == Node_param_list)
+			m = GET_PARAM(m->param_cnt);
+
+		/* $0 needs to be passed by value to a function */
+		if (m == fields_arr[0]) {
+			DEREF(m);
+			m = dupnode(m);
+		}
+
+		switch (m->type) {
+		case Node_var_new:
+		case Node_var_array:
+			r->type = Node_array_ref;
+			r->orig_array = r->prev_array = m;
+			break;
+
+		case Node_array_ref:
+			r->type = Node_array_ref;
+			r->orig_array = m->orig_array;
+			r->prev_array = m;
+			break;
+
+		case Node_var:
+			/* Untyped (Node_var_new) variable as param became a
+			 * scalar during evaluation of expression for a
+			 * subsequent param.
+			 */
+			r->type = Node_var;
+			r->var_value = dupnode(Nnull_string);
+			break;
+
+		case Node_val:
+			r->type = Node_var;
+			r->var_value = m;
+			break;
+
+		default:
+			cant_happen();
+		}
+		r->vname = fp[i].param;
+	}
+
+	stack_adj(-arg_count);	/* adjust stack pointer */
+
+	if (pc->opcode == Op_indirect_func_call) {
+		r = POP();	/* indirect var */
+		DEREF(r);
+	}
+
+	frame_ptr->vname = source;	/* save current source */
+
+	if (do_profile || do_debug)
+		push_frame(frame_ptr);
+
+	/* save current frame in stack */
+	PUSH(frame_ptr);
+
+	/* setup new frame */
+	getnode(frame_ptr);
+	frame_ptr->type = Node_frame;
+	frame_ptr->stack = sp;
+	frame_ptr->prev_frame_size = (stack_ptr - stack_bottom); /* size of the previous stack frame */
+	frame_ptr->func_node = f;
+	frame_ptr->vname = NULL;
+	frame_ptr->reti = pc; /* on return execute pc->nexti */
+
+	return f->code_ptr;
+}
+
+
+/* restore_frame --- clean up the stack and update frame */
+
+static INSTRUCTION *
+restore_frame(NODE *fp)
+{
+	NODE *r;
+	NODE **sp;
+	int n;
+	NODE *func;
+	INSTRUCTION *ri;
+
+	func = frame_ptr->func_node;
+	n = func->param_cnt;
+	sp = frame_ptr->stack;
+
+	for (; n > 0; n--) {
+		r = *sp++;
+		if (r->type == Node_var)     /* local variable */
+			DEREF(r->var_value);
+		else if (r->type == Node_var_array)     /* local array */
+			assoc_clear(r);
+		freenode(r);
+	}
+
+	if (frame_ptr->stack != NULL)
+		efree(frame_ptr->stack);
+	ri = frame_ptr->reti;     /* execution in calling frame
+	                           * resumes from ri->nexti.
+	                           */
+	freenode(frame_ptr);
+	if (do_profile || do_debug)
+		pop_frame();
+
+	/* restore frame */
+	frame_ptr = fp;
+	/* restore source */
+	source = fp->vname;
+	fp->vname = NULL;
+
+	return ri->nexti;
+}
+
+
+/* free_arrayfor --- free 'for (var in array)' related data */
+
+static inline void
+free_arrayfor(NODE *r)
+{
+	if (r->for_list != NULL) {
+		NODE *n;
+		size_t num_elems = r->for_list_size;
+		NODE **list = r->for_list;
+		while (num_elems > 0) {
+			n = list[--num_elems];
+			unref(n);
+		}
+		efree(list);
+	}
+	freenode(r);
+}
+
+
+/*
+ * unwind_stack --- pop items off the run-time stack;
+ *	'n' is the # of items left in the stack.
+ */
+
+INSTRUCTION *
+unwind_stack(long n)
+{
+	NODE *r;
+	INSTRUCTION *cp = NULL;
+	STACK_ITEM *sp;
+
+	if (stack_empty())
+		return NULL;
+
+	sp = stack_bottom + n;
+
+	if (stack_ptr < sp)
+		return NULL;
+
+	while ((r = POP()) != NULL) {
+		switch (r->type) {
+		case Node_frame:
+			cp = restore_frame(r);
+			break;
+		case Node_arrayfor:
+			free_arrayfor(r);
+			break;
+		case Node_val:
+			DEREF(r);
+			break;
+		case Node_instruction:
+			freenode(r);
+			break;
+		default:
+			/*
+			 * Check `exiting' and don't produce an error for
+			 * cases like:
+			 *	func     _fn0() { exit }
+			 *	BEGIN { ARRAY[_fn0()] }
+			 */
+			if (in_main_context() && ! exiting)
+				fatal(_("unwind_stack: unexpected type `%s'"),
+						nodetype2str(r->type));
+			/* else
+				* Node_var_array,
+				* Node_param_list,
+				* Node_var (e.g: trying to use scalar for array)
+				* Node_regex/Node_dynregex
+				* ?
+			 */
+			break;
+		}
+
+		if (stack_ptr < sp)
+			break;
+	}
+	return cp;
+}
+
+
+/* pop_fcall --- pop off the innermost frame */
+#define pop_fcall()	unwind_stack(frame_ptr->prev_frame_size)
+
+/* pop the run-time stack */
+#define pop_stack()	(void) unwind_stack(0)
+
+
+static inline bool
+eval_condition(NODE *t)
+{
+	if (t == node_Boolean[false])
+		return false;
+
+	if (t == node_Boolean[true])
+		return true;
+
+	return boolval(t);
+}
+
+typedef enum {
+	SCALAR_EQ_NEQ,
+	SCALAR_RELATIONAL
+} scalar_cmp_t;
+
+/* cmp_scalars -- compare two nodes on the stack */
+
+static inline int
+cmp_scalars(scalar_cmp_t comparison_type)
+{
+	NODE *t1, *t2;
+	int di;
+
+	t2 = POP_SCALAR();
+	t1 = TOP();
+	if (t1->type == Node_var_array) {
+		DEREF(t2);
+		fatal(_("attempt to use array `%s' in a scalar context"), array_vname(t1));
+	}
+	di = cmp_nodes(t1, t2, comparison_type == SCALAR_EQ_NEQ);
+	DEREF(t1);
+	DEREF(t2);
+	return di;
+}
+
+/* op_assign --- assignment operators excluding = */
+
+static void
+op_assign(OPCODE op)
+{
+	NODE **lhs;
+	NODE *t1, *t2;
+	AWKNUM x = 0.0, x1, x2;
+
+	lhs = POP_ADDRESS();
+	t1 = *lhs;
+	x1 = force_number(t1)->numbr;
+
+	t2 = TOP_SCALAR();
+	x2 = force_number(t2)->numbr;
+	DEREF(t2);
+
+	switch (op) {
+	case Op_assign_plus:
+		x = x1 + x2;
+		break;
+	case Op_assign_minus:
+		x = x1 - x2;
+		break;
+	case Op_assign_times:
+		x = x1 * x2;
+		break;
+	case Op_assign_quotient:
+		if (x2 == (AWKNUM) 0) {
+			decr_sp();
+			fatal(_("division by zero attempted in `/='"));
+		}
+		x = x1 / x2;
+		break;
+	case Op_assign_mod:
+		if (x2 == (AWKNUM) 0) {
+			decr_sp();
+			fatal(_("division by zero attempted in `%%='"));
+		}
+#ifdef HAVE_FMOD
+		x = fmod(x1, x2);
+#else   /* ! HAVE_FMOD */
+		(void) modf(x1 / x2, &x);
+		x = x1 - x2 * x;
+#endif  /* ! HAVE_FMOD */
+		break;
+	case Op_assign_exp:
+		x = calc_exp((double) x1, (double) x2);
+		break;
+	default:
+		break;
+	}
+
+	if (t1->valref == 1 && t1->flags == (MALLOC|NUMCUR|NUMBER)) {
+		/* optimization */
+		t1->numbr = x;
+	} else {
+		unref(t1);
+		t1 = *lhs = make_number(x);
+	}
+
+	UPREF(t1);
+	REPLACE(t1);
+}
+
+/* PUSH_CODE --- push a code onto the runtime stack */
+
+void
+PUSH_CODE(INSTRUCTION *cp)
+{
+	NODE *r;
+	getnode(r);
+	r->type = Node_instruction;
+	r->code_ptr = cp;
+	PUSH(r);
+}
+
+/* POP_CODE --- pop a code off the runtime stack */
+
+INSTRUCTION *
+POP_CODE()
+{
+	NODE *r;
+	INSTRUCTION *cp;
+	r = POP();
+	cp = r->code_ptr;
+	freenode(r);
+	return cp;
+}
+
+
+/*
+ * Implementation of BEGINFILE and ENDFILE requires saving an execution
+ * state and the ability to return to that state. The state is
+ * defined by the instruction triggering the BEGINFILE/ENDFILE rule, the
+ * run-time stack, the rule and the source file. The source line is available in
+ * the instruction and hence is not considered a part of the execution state.
+ */
+
+
+typedef struct exec_state {
+	struct exec_state *next;
+
+	INSTRUCTION *cptr;  /* either getline (Op_K_getline) or the
+	                     * implicit "open-file, read-record" loop (Op_newfile).
+	                     */
+
+	int rule;           /* rule for the INSTRUCTION */
+
+	long stack_size;    /* For this particular usage, it is sufficient to save
+	                     * only the size of the call stack. We do not
+	                     * store the actual stack pointer to avoid problems
+	                     * in case the stack gets realloc-ed.
+	                     */
+
+	const char *source; /* source file for the INSTRUCTION */
+} EXEC_STATE;
+
+static EXEC_STATE exec_state_stack;
+
+/* push_exec_state --- save an execution state on stack */
+
+static void
+push_exec_state(INSTRUCTION *cp, int rule, char *src, STACK_ITEM *sp)
+{
+	EXEC_STATE *es;
+
+	emalloc(es, EXEC_STATE *, sizeof(EXEC_STATE), "push_exec_state");
+	es->rule = rule;
+	es->cptr = cp;
+	es->stack_size = (sp - stack_bottom) + 1;
+	es->source = src;
+	es->next = exec_state_stack.next;
+	exec_state_stack.next = es;
+}
+
+
+/* pop_exec_state --- pop one execution state off the stack */
+
+static INSTRUCTION *
+pop_exec_state(int *rule, char **src, long *sz)
+{
+	INSTRUCTION *cp;
+	EXEC_STATE *es;
+
+	es = exec_state_stack.next;
+	if (es == NULL)
+		return NULL;
+	cp = es->cptr;
+	if (rule != NULL)
+		*rule = es->rule;
+	if (src != NULL)
+		*src = (char *) es->source;
+	if (sz != NULL)
+		*sz = es->stack_size;
+	exec_state_stack.next = es->next;
+	efree(es);
+	return cp;
+}
+
+
+/* register_exec_hook --- add exec hooks in the interpreter. */
+
+int
+register_exec_hook(Func_pre_exec preh, Func_post_exec posth)
+{
+	int pos = 0;
+
+	/*
+	 * multiple post-exec hooks aren't supported. post-exec hook is mainly
+	 * for use by the debugger.
+	 */
+
+	if (! preh || (post_execute && posth))
+		return false;
+
+	if (num_exec_hook == MAX_EXEC_HOOKS)
+		return false;
+
+	/*
+	 * Add to the beginning of the array but do not displace the
+	 * debugger hook if it exists.
+	 */
+	if (num_exec_hook > 0) {
+		pos = !! do_debug;
+		if (num_exec_hook > pos)
+			memmove(pre_execute + pos + 1, pre_execute + pos,
+					(num_exec_hook - pos) * sizeof (preh));
+	}
+	pre_execute[pos] = preh;
+	num_exec_hook++;
+
+	if (posth)
+		post_execute = posth;
+
+	return true;
+}
+
+
+/* interpreter routine when not debugging */
+#include "interpret.h"
+
+/* interpreter routine with exec hook(s). Used when debugging and/or with MPFR. */
+#define r_interpret h_interpret
+#define EXEC_HOOK 1
+#include "interpret.h"
+#undef EXEC_HOOK
+#undef r_interpret
+
+
+void
+init_interpret()
+{
+	long newval;
+
+	if ((newval = getenv_long("GAWK_STACKSIZE")) > 0)
+		STACK_SIZE = newval;
+
+	emalloc(stack_bottom, STACK_ITEM *, STACK_SIZE * sizeof(STACK_ITEM), "grow_stack");
+	stack_ptr = stack_bottom - 1;
+	stack_top = stack_bottom + STACK_SIZE - 1;
+
+	/* initialize frame pointer */
+	getnode(frame_ptr);
+	frame_ptr->type = Node_frame;
+	frame_ptr->stack = NULL;
+	frame_ptr->func_node = NULL;	/* in main */
+	frame_ptr->vname = NULL;
+
+	/* initialize true and false nodes */
+	node_Boolean[false] = make_number(0.0);
+	node_Boolean[true] = make_number(1.0);
+	if (! is_mpg_number(node_Boolean[false])) {
+		node_Boolean[false]->flags |= NUMINT;
+		node_Boolean[true]->flags |= NUMINT;
+	}
+
+	/*
+	 * Select the interpreter routine. The version without
+	 * any exec hook support (r_interpret) is faster by about
+	 * 5%, or more depending on the opcodes.
+	 */
+
+	if (num_exec_hook > 0)
+		interpret = h_interpret;
+	else
+		interpret = r_interpret;
+}
+
diff --git a/gawk-5.0.1/ext.c b/gawk-5.0.1/ext.c
new file mode 100644
index 00000000000..d0e97b879c3
--- /dev/null
+++ b/gawk-5.0.1/ext.c
@@ -0,0 +1,268 @@
+/*
+ * ext.c - Builtin function that links external gawk functions and related
+ *	   utilities.
+ *
+ * Christos Zoulas, Thu Jun 29 17:40:41 EDT 1995
+ * Arnold Robbins, update for 3.1, Mon Nov 23 12:53:39 EST 1998
+ */
+
+/*
+ * Copyright (C) 1995 - 2001, 2003-2014, 2016-2018,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+extern SRCFILE *srcfiles;
+
+#ifdef DYNAMIC
+
+#include <dlfcn.h>
+
+#define INIT_FUNC	"dl_load"
+
+/* load_ext --- load an external library */
+
+void
+load_ext(const char *lib_name)
+{
+	int (*install_func)(const gawk_api_t *const, awk_ext_id_t);
+	void *dl;
+	int flags = RTLD_LAZY;
+	int *gpl_compat;
+
+	if (do_sandbox)
+		fatal(_("extensions are not allowed in sandbox mode"));
+
+	if (do_traditional || do_posix)
+		fatal(_("-l / @load are gawk extensions"));
+
+	if (lib_name == NULL)
+		fatal(_("load_ext: received NULL lib_name"));
+
+	if ((dl = dlopen(lib_name, flags)) == NULL)
+		fatal(_("load_ext: cannot open library `%s' (%s)"), lib_name,
+		      dlerror());
+
+	/* Per the GNU Coding standards */
+	gpl_compat = (int *) dlsym(dl, "plugin_is_GPL_compatible");
+	if (gpl_compat == NULL)
+		fatal(_("load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"),
+				lib_name, dlerror());
+
+	install_func = (int (*)(const gawk_api_t *const, awk_ext_id_t))
+				dlsym(dl, INIT_FUNC);
+	if (install_func == NULL)
+		fatal(_("load_ext: library `%s': cannot call function `%s' (%s)"),
+				lib_name, INIT_FUNC, dlerror());
+
+	if (install_func(& api_impl, NULL /* ext_id */) == 0)
+		warning(_("load_ext: library `%s' initialization routine `%s' failed"),
+				lib_name, INIT_FUNC);
+}
+
+/* make_builtin --- register name to be called as func with a builtin body */
+
+awk_bool_t
+make_builtin(const char *name_space, const awk_ext_func_t *funcinfo)
+{
+	NODE *symbol, *f;
+	INSTRUCTION *b;
+	const char *name = funcinfo->name;
+	int count = funcinfo->max_expected_args;
+	const char *install_name;
+
+	if (name == NULL || *name == '\0')
+		fatal(_("make_builtin: missing function name"));
+
+	if (! is_valid_identifier(name))
+		return awk_false;
+
+	assert(name_space != NULL);
+	if (name_space[0] == '\0' || strcmp(name_space, awk_namespace) == 0) {
+		if (check_special(name) >= 0)
+			fatal(_("make_builtin: can't use gawk built-in `%s' as function name"), name);
+
+		f = lookup(name);
+		install_name = estrdup(name, strlen(name));
+	} else {
+		if (! is_valid_identifier(name_space))
+			return awk_false;
+
+		if (check_special(name_space) >= 0)
+			fatal(_("make_builtin: can't use gawk built-in `%s' as namespace name"), name_space);
+		if (check_special(name) >= 0)
+			fatal(_("make_builtin: can't use gawk built-in `%s' as function name"), name);
+
+		size_t len = strlen(name_space) + 2 + strlen(name) + 1;
+		char *buf;
+		emalloc(buf, char *, len, "make_builtin");
+		sprintf(buf, "%s::%s", name_space, name);
+		install_name = buf;
+
+		f = lookup(install_name);
+	}
+
+	if (f != NULL) {
+		// found it, but it shouldn't be there if we want to install this function
+		if (f->type == Node_func) {
+			/* user-defined function */
+			fatal(_("make_builtin: can't redefine function `%s'"), name);
+		} else if (f->type == Node_ext_func) {
+			/* multiple extension() calls etc. */
+			if (do_lint)
+				lintwarn(_("make_builtin: function `%s' already defined"), name);
+			return awk_false;
+		} else
+			/* variable name etc. */
+			fatal(_("make_builtin: function name `%s' previously defined"), name);
+	}
+
+	if (count < 0)
+		fatal(_("make_builtin: negative argument count for function `%s'"),
+				name);
+
+	b = bcalloc(Op_symbol, 1, 0);
+	b->extfunc = funcinfo->function;
+	b->c_function = (awk_ext_func_t *) funcinfo;
+
+	/* NB: extension sub must return something */
+
+	symbol = install_symbol(install_name, Node_ext_func);
+	symbol->code_ptr = b;
+	track_ext_func(name);
+	return awk_true;
+}
+
+/* get_argument --- get the i'th argument of a dynamically linked function */
+
+NODE *
+get_argument(int i)
+{
+	NODE *t;
+	int arg_count;
+	INSTRUCTION *pc;
+
+	pc = TOP()->code_ptr;		/* Op_ext_builtin instruction */
+	arg_count = pc->expr_count;	/* # of arguments supplied */
+
+	if (i < 0 || i >= arg_count)
+		return NULL;
+
+	t = PEEK(arg_count - i);
+	if (t->type == Node_param_list)
+		t = GET_PARAM(t->param_cnt);
+
+	if (t->type == Node_array_ref) {
+		if (t->orig_array->type == Node_var) {
+			/* already a scalar, can no longer use it as array */
+			t->type = Node_var;
+			t->var_value = Nnull_string;
+			return t;
+		}
+		return t->orig_array; 	/* Node_var_new or Node_var_array */
+	}
+	if (t->type == Node_var)	/* See Case Node_var in setup_frame(), eval.c */
+		return Nnull_string;
+	/* Node_var_new, Node_var_array or Node_val */
+	return t;
+}
+
+
+/*
+ * get_actual_argument --- get the i'th scalar or array argument of a
+ *	dynamically linked function.
+ */
+
+NODE *
+get_actual_argument(NODE *t, int i, bool want_array)
+{
+	char *fname;
+	INSTRUCTION *pc;
+
+	pc = TOP()->code_ptr;	/* Op_ext_builtin instruction */
+	fname = (pc + 1)->func_name;
+
+	if (t->type == Node_var_new) {
+		if (want_array)
+			return force_array(t, false);
+		else {
+			t->type = Node_var;
+			t->var_value = dupnode(Nnull_string);
+			return t->var_value;
+		}
+	}
+
+	if (want_array) {
+		if (t->type != Node_var_array)
+			fatal(_("function `%s': argument #%d: attempt to use scalar as an array"),
+				fname, i + 1);
+	} else {
+		if (t->type != Node_val)
+			fatal(_("function `%s': argument #%d: attempt to use array as a scalar"),
+				fname, i + 1);
+	}
+	assert(t->type == Node_var_array || t->type == Node_val);
+	return t;
+}
+
+#else
+
+/* load_ext --- dummy version if extensions not available */
+
+void
+load_ext(const char *lib_name)
+{
+	fatal(_("dynamic loading of libraries is not supported"));
+}
+#endif
+
+/* close_extensions --- execute extension cleanup routines */
+
+void
+close_extensions()
+{
+	SRCFILE *s;
+
+	if (srcfiles == NULL)
+		return;
+
+	for (s = srcfiles->next; s != srcfiles; s = s->next)
+		if (s->stype == SRC_EXTLIB && s->fini_func)
+               	        (*s->fini_func)();
+}
+
+/* is_valid_identifier --- return true if name is a valid simple identifier */
+
+bool
+is_valid_identifier(const char *name)
+{
+	const char *sp = name;
+	int c;
+
+	if (! is_letter(*sp))
+		return false;
+
+	for (sp++; (c = *sp++) != '\0';) {
+		if (! is_identchar(c))
+			return false;
+	}
+
+	return true;
+}
diff --git a/gawk-5.0.1/extension/ABOUT-NLS b/gawk-5.0.1/extension/ABOUT-NLS
new file mode 100644
index 00000000000..15514263f9d
--- /dev/null
+++ b/gawk-5.0.1/extension/ABOUT-NLS
@@ -0,0 +1,1379 @@
+1 Notes on the Free Translation Project
+***************************************
+
+Free software is going international!  The Free Translation Project is a
+way to get maintainers of free software, translators, and users all
+together, so that free software will gradually become able to speak many
+languages.  A few packages already provide translations for their
+messages.
+
+   If you found this 'ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU 'gettext' internally,
+itself available at your nearest GNU archive site.  But you do _not_
+need to install GNU 'gettext' prior to configuring, installing or using
+this package with messages translated.
+
+   Installers will find here some useful hints.  These notes also
+explain how users should proceed for getting the programs to use the
+available translations.  They tell how people wanting to contribute and
+work on translations can contact the appropriate team.
+
+1.1 INSTALL Matters
+===================
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language.  Most such
+packages use GNU 'gettext'.  Other packages have their own ways to
+internationalization, predating GNU 'gettext'.
+
+   By default, this package will be installed to allow translation of
+messages.  It will automatically detect whether the system already
+provides the GNU 'gettext' functions.  Installers may use special
+options at configuration time for changing the default behaviour.  The
+command:
+
+     ./configure --disable-nls
+
+will _totally_ disable translation of messages.
+
+   When you already have GNU 'gettext' installed on your system and run
+configure without an option for your new package, 'configure' will
+probably detect the previously built and installed 'libintl' library and
+will decide to use it.  If not, you may have to to use the
+'--with-libintl-prefix' option to tell 'configure' where to look for it.
+
+   Internationalized packages usually have many 'po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language.  Unless
+translations have been forbidden at 'configure' time by using the
+'--disable-nls' switch, all available translations are installed
+together with the package.  However, the environment variable 'LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+'LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+1.2 Using This Package
+======================
+
+As a user, if your language has been installed for this package, you
+only have to set the 'LANG' environment variable to the appropriate
+'LL_CC' combination.  If you happen to have the 'LC_ALL' or some other
+'LC_xxx' environment variables set, you should unset them before setting
+'LANG', otherwise the setting of 'LANG' will not have the desired
+effect.  Here 'LL' is an ISO 639 two-letter language code, and 'CC' is
+an ISO 3166 two-letter country code.  For example, let's suppose that
+you speak German and live in Germany.  At the shell prompt, merely
+execute 'setenv LANG de_DE' (in 'csh'), 'export LANG; LANG=de_DE' (in
+'sh') or 'export LANG=de_DE' (in 'bash').  This can be done from your
+'.login' or '.profile' file, once and for all.
+
+   You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries.  For
+example, 'de_AT' is used for Austria, and 'pt_BR' for Brazil.  The
+country code serves to distinguish the dialects.
+
+   The locale naming convention of 'LL_CC', with 'LL' denoting the
+language and 'CC' denoting the country, is the one use on systems based
+on GNU libc.  On other systems, some variations of this scheme are used,
+such as 'LL' or 'LL_CC.ENCODING'.  You can get the list of locales
+supported by your system for your language by running the command
+'locale -a | grep '^LL''.
+
+   Not all programs have translations for all languages.  By default, an
+English message is shown in place of a nonexistent translation.  If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+'LANGUAGE'.  GNU 'gettext' gives preference to 'LANGUAGE' over 'LANG'
+for the purpose of message handling, but you still need to have 'LANG'
+set to the primary language; this is required by other parts of the
+system libraries.  For example, some Swedish users who would rather read
+translations in German than English for when Swedish is not available,
+set 'LANGUAGE' to 'sv:de' while leaving 'LANG' to 'sv_SE'.
+
+   Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from 'no' to 'nb' recently (in 2003).  During the
+transition period, while some message catalogs for this language are
+installed under 'nb' and some older ones under 'no', it's recommended
+for Norwegian users to set 'LANGUAGE' to 'nb:no' so that both newer and
+older translations are used.
+
+   In the 'LANGUAGE' environment variable, but not in the 'LANG'
+environment variable, 'LL_CC' combinations can be abbreviated as 'LL' to
+denote the language's main dialect.  For example, 'de' is equivalent to
+'de_DE' (German as spoken in Germany), and 'pt' to 'pt_PT' (Portuguese
+as spoken in Portugal) in this context.
+
+1.3 Translating Teams
+=====================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list.  The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+'http://translationproject.org/', in the "Teams" area.
+
+   If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+'-request' appended.  For example, speakers of Swedish can send a
+message to 'sv-request@li.org', having this message body:
+
+     subscribe
+
+   Keep in mind that team members are expected to participate _actively_
+in translations, or at solving translational difficulties, rather than
+merely lurking around.  If your team does not exist yet and you want to
+start one, or if you are unsure about what to do or how to get started,
+please write to 'coordinator@translationproject.org' to reach the
+coordinator for all translator teams.
+
+   The English team is special.  It works at improving and uniformizing
+the terminology in use.  Proven linguistic skills are praised more than
+programming skills, here.
+
+1.4 Available Packages
+======================
+
+Languages are not equally supported in all packages.  The following
+matrix shows the current state of internationalization, as of Jun 2014.
+The matrix shows, in regard of each package, for which languages PO
+files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+     Ready PO files       af am an ar as ast az be bg bn bn_IN bs ca crh cs
+                        +---------------------------------------------------+
+     a2ps               |                       []                []     [] |
+     aegis              |                                                   |
+     anubis             |                                                   |
+     aspell             |                []                       []     [] |
+     bash               |                          []             []     [] |
+     bfd                |                                                   |
+     binutils           |                                         []        |
+     bison              |                                                   |
+     bison-runtime      |                []                                 |
+     buzztrax           |                                                [] |
+     ccd2cue            |                                                   |
+     ccide              |                                                   |
+     cflow              |                                                   |
+     clisp              |                                                   |
+     coreutils          |                                         []     [] |
+     cpio               |                                                   |
+     cppi               |                                                   |
+     cpplib             |                                         []        |
+     cryptsetup         |                                                [] |
+     datamash           |                                                   |
+     denemo             |                                         []     [] |
+     dfarc              |                                         []        |
+     dialog             |       []                                []     [] |
+     dico               |                                                   |
+     diffutils          |                                                [] |
+     dink               |                                         []        |
+     direvent           |                                                   |
+     doodle             |                                                [] |
+     dos2unix           |                                                   |
+     dos2unix-man       |                                                   |
+     e2fsprogs          |                                         []     [] |
+     enscript           |                                         []        |
+     exif               |                                                [] |
+     fetchmail          |                                         []     [] |
+     findutils          |                                                [] |
+     flex               |                                         []        |
+     freedink           |                                         []     [] |
+     fusionforge        |                                                   |
+     gas                |                                                   |
+     gawk               |                                         []        |
+     gcal               |                                         []        |
+     gcc                |                                                   |
+     gdbm               |                                                   |
+     gettext-examples   | []             []        []             []     [] |
+     gettext-runtime    |                          []             []     [] |
+     gettext-tools      |                          []             []        |
+     gjay               |                                                   |
+     glunarclock        |                []        []                    [] |
+     gnubiff            |                                                [] |
+     gnubik             |          []                                       |
+     gnucash            |          ()              ()             []        |
+     gnuchess           |                                                   |
+     gnulib             |                                                [] |
+     gnunet             |                                                   |
+     gnunet-gtk         |                                                   |
+     gold               |                                                   |
+     gphoto2            |                                                [] |
+     gprof              |                          []                       |
+     gramadoir          |                                                   |
+     grep               |                          []             []     [] |
+     grub               |                                         []        |
+     gsasl              |                                                   |
+     gss                |                                                   |
+     gst-plugins-bad    |                                                [] |
+     gst-plugins-base   |                          []             []     [] |
+     gst-plugins-good   |                          []             []     [] |
+     gst-plugins-ugly   |                          []             []     [] |
+     gstreamer          |                []        []             []     [] |
+     gtick              |                                                [] |
+     gtkam              |                       []                       [] |
+     gtkspell           | []             []     []                []     [] |
+     guix               |                                                   |
+     guix-packages      |                                                   |
+     gutenprint         |                                         []        |
+     hello              |                                         []        |
+     help2man           |                                                   |
+     help2man-texi      |                                                   |
+     hylafax            |                                                   |
+     idutils            |                                                   |
+     iso_15924          |                                                [] |
+     iso_3166           | []          []        [] [] []  []   [] [] []  [] |
+     iso_3166_2         |                                                   |
+     iso_4217           |                                                [] |
+     iso_639            |             [] []     [] [] []  []      [] []  [] |
+     iso_639_3          |                []                          []     |
+     iso_639_5          |                                                   |
+     jwhois             |                                                   |
+     kbd                |                                                [] |
+     klavaro            |          []              [] []          []     [] |
+     latrine            |                                                   |
+     ld                 |                          []                       |
+     leafpad            |                       [] []             []     [] |
+     libc               |                          []             []     [] |
+     libexif            |                       ()                          |
+     libextractor       |                                                   |
+     libgnutls          |                                                [] |
+     libgphoto2         |                                                [] |
+     libgphoto2_port    |                                                [] |
+     libgsasl           |                                                   |
+     libiconv           |                          []                    [] |
+     libidn             |                                                [] |
+     liferea            |          []    []                       []     [] |
+     lilypond           |                                         []     [] |
+     lordsawar          |                                         []        |
+     lprng              |                                                   |
+     lynx               |                                         []     [] |
+     m4                 |                                                [] |
+     mailfromd          |                                                   |
+     mailutils          |                                                   |
+     make               |                                                [] |
+     man-db             |                                         []     [] |
+     man-db-manpages    |                                                   |
+     midi-instruments   |          []                             []     [] |
+     minicom            |                                                [] |
+     mkisofs            |                                                [] |
+     myserver           |                                                [] |
+     nano               |                          []             []     [] |
+     opcodes            |                                                   |
+     parted             |                                                [] |
+     pies               |                                                   |
+     popt               |                                                [] |
+     procps-ng          |                                                   |
+     procps-ng-man      |                                                   |
+     psmisc             |                                                [] |
+     pspp               |                                         []        |
+     pushover           |                                                [] |
+     pwdutils           |                                                   |
+     pyspread           |                                                   |
+     radius             |                                         []        |
+     recode             |                       []                []     [] |
+     recutils           |                                                   |
+     rpm                |                                                   |
+     rush               |                                                   |
+     sarg               |                                                   |
+     sed                |                []                       []     [] |
+     sharutils          |                                                [] |
+     shishi             |                                                   |
+     skribilo           |                                                   |
+     solfege            |                                                [] |
+     solfege-manual     |                                                   |
+     spotmachine        |                                                   |
+     sudo               |                                         []     [] |
+     sudoers            |                                         []     [] |
+     sysstat            |                                                [] |
+     tar                |                          []             []     [] |
+     texinfo            |                                         []     [] |
+     texinfo_document   |                                         []        |
+     tigervnc           |                          []                       |
+     tin                |                                                   |
+     tin-man            |                                                   |
+     tracgoogleappsa... |                                                   |
+     trader             |                                                   |
+     util-linux         |                                                [] |
+     ve                 |                                                   |
+     vice               |                                                   |
+     vmm                |                                                   |
+     vorbis-tools       |                                                [] |
+     wastesedge         |                                                   |
+     wcd                |                                                   |
+     wcd-man            |                                                   |
+     wdiff              |                                         []     [] |
+     wget               |                                                [] |
+     wyslij-po          |                                                   |
+     xboard             |                                                   |
+     xdg-user-dirs      | []    []    [] []     [] []     []      [] []  [] |
+     xkeyboard-config   |                          []             []     [] |
+                        +---------------------------------------------------+
+                          af am an ar as ast az be bg bn bn_IN bs ca crh cs
+                           4  0  2  5  3 11   0  8 23  3   3    1 54  4  73
+
+                          da  de  el en en_GB en_ZA eo es et eu fa fi  fr
+                        +--------------------------------------------------+
+     a2ps               | []  []  []     []         [] [] []       []  []  |
+     aegis              | []  []                       []              []  |
+     anubis             | []  []                       []          []  []  |
+     aspell             | []  []         []         [] []          []  []  |
+     bash               |                           [] []              []  |
+     bfd                | []                           []          []  []  |
+     binutils           |                              []          []  []  |
+     bison              | []  []  []                [] [] []       []  []  |
+     bison-runtime      | []  []  []                [] [] []       []  []  |
+     buzztrax           | []  []                                   []  []  |
+     ccd2cue            | []  []                                       []  |
+     ccide              | []  []                    [] []          []  []  |
+     cflow              | []  []                    []             []  []  |
+     clisp              | []  []     []                []              []  |
+     coreutils          | []  []                       [] []           []  |
+     cpio               | []  []                       []          []  []  |
+     cppi               | []  []                    []             []  []  |
+     cpplib             | []  []                    [] []          []  []  |
+     cryptsetup         | []  []                       []          []  []  |
+     datamash           | []  []                    []                 []  |
+     denemo             | []                                               |
+     dfarc              | []  []                    [] []          []  []  |
+     dialog             | []  []  []                [] []    [] [] []  []  |
+     dico               | []  []                                   []  []  |
+     diffutils          | []  []  []                [] []              []  |
+     dink               | []  []                    [] []          []  []  |
+     direvent           | []  []                    []                 []  |
+     doodle             | []  []                    []             []      |
+     dos2unix           | []  []                    [] []              []  |
+     dos2unix-man       |     []                       []              []  |
+     e2fsprogs          | []  []                    [] []              []  |
+     enscript           | []  []         []         []             []  []  |
+     exif               | []  []                    [] []          []  []  |
+     fetchmail          | []  ()  []     []         [] []              []  |
+     findutils          | []  []  []                [] [] []       []  []  |
+     flex               | []  []                    [] []          []  []  |
+     freedink           | []  []  []                [] []    []    []  []  |
+     fusionforge        |     []                       []              []  |
+     gas                |                              []          []  []  |
+     gawk               | []  []                       []          []  []  |
+     gcal               | []  []                       []              []  |
+     gcc                |     []                       []                  |
+     gdbm               | []  []                    []             []  []  |
+     gettext-examples   | []  []  []                [] []          []  []  |
+     gettext-runtime    | []  []                    [] []          []  []  |
+     gettext-tools      | []  []                       []          []  []  |
+     gjay               |     []                    []             []  []  |
+     glunarclock        | []  []                    []             []  []  |
+     gnubiff            |     ()                    []             []  ()  |
+     gnubik             | []  []                    []             []  []  |
+     gnucash            | []  ()  ()     ()            ()          ()  ()  |
+     gnuchess           |     []                    [] []              []  |
+     gnulib             | []  []                    [] [] []       []  []  |
+     gnunet             |                              []                  |
+     gnunet-gtk         |     []                                           |
+     gold               |                              []          []  []  |
+     gphoto2            | []  ()                    []                 []  |
+     gprof              | []  []                    [] []          []  []  |
+     gramadoir          | []  []                    []             []  []  |
+     grep               | []  []                    [] [] []       []  []  |
+     grub               | []  []                       []          []  []  |
+     gsasl              | []  []                    []             []  []  |
+     gss                | []  []                    []             []  []  |
+     gst-plugins-bad    | []  []                                           |
+     gst-plugins-base   | []  []  []                   []          []  []  |
+     gst-plugins-good   | []  []  []                   []    []    []  []  |
+     gst-plugins-ugly   | []  []  []                [] []    []    []  []  |
+     gstreamer          | []  []  []                   []    []    []  []  |
+     gtick              | []  ()                    []             []  []  |
+     gtkam              | []  ()                    [] []          []  []  |
+     gtkspell           | []  []  []                [] []    []    []  []  |
+     guix               | []                        []                     |
+     guix-packages      |                                                  |
+     gutenprint         | []  []                                   []  []  |
+     hello              | []  []  []                [] [] []       []  []  |
+     help2man           | []  []  []                [] []          []  []  |
+     help2man-texi      |     []                       []              []  |
+     hylafax            |     []                       []                  |
+     idutils            | []  []                    []             []  []  |
+     iso_15924          | []  ()                    [] []    ()    []  ()  |
+     iso_3166           | []  ()  []                [] [] [] ()    []  ()  |
+     iso_3166_2         | []  ()                             ()        ()  |
+     iso_4217           | []  ()  []                   [] [] ()    []  ()  |
+     iso_639            | []  ()                    [] []    ()    []  ()  |
+     iso_639_3          |     ()                             ()        ()  |
+     iso_639_5          |     ()                             ()        ()  |
+     jwhois             |     []                    [] []          []  []  |
+     kbd                | []  []  []                [] []              []  |
+     klavaro            | []  []  []                [] []    []        []  |
+     latrine            | []  ()                    []             []      |
+     ld                 | []                           []          []  []  |
+     leafpad            | []  []  []                [] []    []    []  []  |
+     libc               | []  []                       []          []  []  |
+     libexif            | []  []         ()            []              []  |
+     libextractor       |     []                                           |
+     libgnutls          |     []                    []             []  []  |
+     libgphoto2         | []  ()                                       []  |
+     libgphoto2_port    | []  ()                       []    []    []  []  |
+     libgsasl           | []  []                    []             []  []  |
+     libiconv           | []  []                    [] [] []       []  []  |
+     libidn             | []  []                    []             []  []  |
+     liferea            | []  ()  []                   []    []    []  []  |
+     lilypond           | []  []  []                [] []              []  |
+     lordsawar          | []  []                                           |
+     lprng              |                                                  |
+     lynx               | []  []                    []    []       []  []  |
+     m4                 | []  []  []                []             []  []  |
+     mailfromd          |                                              []  |
+     mailutils          |     []                       []          []  []  |
+     make               | []  []                       []          []  []  |
+     man-db             | []  []                    []                 []  |
+     man-db-manpages    |     []                                       []  |
+     midi-instruments   | []  []  []                [] [] []    [] []  []  |
+     minicom            | []  []                       []          []  []  |
+     mkisofs            |                           []             []  []  |
+     myserver           |     []                    []             []  []  |
+     nano               | []  []                    [] []    []    []  []  |
+     opcodes            | []  []                       []          []  []  |
+     parted             | []  []                                       []  |
+     pies               |     []                                           |
+     popt               | []  []                    [] []          []  []  |
+     procps-ng          |     []                                       []  |
+     procps-ng-man      |     []                                       []  |
+     psmisc             | []  []  []                []       []    []  []  |
+     pspp               |     []                       []              []  |
+     pushover           |     ()                    [] []              []  |
+     pwdutils           | []  []                                       []  |
+     pyspread           | []  []                                       []  |
+     radius             |                              []              []  |
+     recode             | []  []  []                [] []          []  []  |
+     recutils           |     []                       []          []  []  |
+     rpm                | []  []                    []             []  []  |
+     rush               |     []                                   []  []  |
+     sarg               | []                                           []  |
+     sed                | []  []  []                [] [] []       []  []  |
+     sharutils          |     []                    []    []           []  |
+     shishi             |     []                                   []  []  |
+     skribilo           | []                                           []  |
+     solfege            | []  []                    [] [] []    [] []  []  |
+     solfege-manual     |     []                    [] [] []           []  |
+     spotmachine        | []  []                    []             []      |
+     sudo               | []  []                    [] []          []  []  |
+     sudoers            | []  []  []                []             []  []  |
+     sysstat            | []  []                    [] []          []  []  |
+     tar                | []  []                    [] [] []       []  []  |
+     texinfo            | []  []                    [] []              []  |
+     texinfo_document   |     []                    [] []              []  |
+     tigervnc           | []  []  []                []             []  []  |
+     tin                | []  []                          []           []  |
+     tin-man            |                []                                |
+     tracgoogleappsa... | []  []                    []             []  []  |
+     trader             | []  []         []         []             []  []  |
+     util-linux         | []  []                       []              []  |
+     ve                 |     []                    [] []          []  []  |
+     vice               | ()  ()                                       ()  |
+     vmm                |     []                                   []      |
+     vorbis-tools       | []  []                    []                 []  |
+     wastesedge         | []                                           ()  |
+     wcd                |     []                    [] []          []      |
+     wcd-man            |     []                                           |
+     wdiff              | []  []                    [] [] []       []  []  |
+     wget               |     []                    [] [] []       []  []  |
+     wyslij-po          |     []                    []             []  []  |
+     xboard             | []  []                       []              []  |
+     xdg-user-dirs      | []  []  []                [] [] [] [] [] []  []  |
+     xkeyboard-config   | []  []  []                [] []          []  []  |
+                        +--------------------------------------------------+
+                          da  de  el en en_GB en_ZA eo es et eu fa fi  fr
+                          120 130 32  1   6     0   94 95 22 13  4 103 136
+
+                          ga gd gl gu he hi hr hu hy ia id is it ja ka kk
+                        +-------------------------------------------------+
+     a2ps               |                   []          []    [] []       |
+     aegis              |                                     []          |
+     anubis             |                   [] []       []    []          |
+     aspell             | []                []          []    [] []       |
+     bash               |                               []    [] []       |
+     bfd                |                               []       []       |
+     binutils           |                               []    [] []       |
+     bison              |                   []                            |
+     bison-runtime      | []    []          [] []    [] []    [] []       |
+     buzztrax           |                                                 |
+     ccd2cue            |                      []                         |
+     ccide              |                   [] []                         |
+     cflow              | []                []          []                |
+     clisp              |                                                 |
+     coreutils          |                      []             [] []       |
+     cpio               | []                [] []       []    [] []       |
+     cppi               |       []          [] []             [] []       |
+     cpplib             |                               []       []       |
+     cryptsetup         |                                     []          |
+     datamash           |                                                 |
+     denemo             |                                     []          |
+     dfarc              |                   [] []             []          |
+     dialog             | [] [] []          [] []    [] [] [] [] []       |
+     dico               |                                                 |
+     diffutils          |                      []       []    [] []       |
+     dink               |                      []                         |
+     direvent           |                      []                         |
+     doodle             | []                                  []          |
+     dos2unix           |                      []                []       |
+     dos2unix-man       |                                                 |
+     e2fsprogs          |                               []                |
+     enscript           | []                []          []                |
+     exif               |       []          []          [] [] [] []       |
+     fetchmail          |                               []    [] []       |
+     findutils          | []    []          [] []       []    [] []       |
+     flex               | []                                              |
+     freedink           |                   [] []       []    []          |
+     fusionforge        |                                                 |
+     gas                |                               []                |
+     gawk               |                               []    () []       |
+     gcal               |                                                 |
+     gcc                |                                                 |
+     gdbm               |                                                 |
+     gettext-examples   | []    []          [] []       []    [] []       |
+     gettext-runtime    | []    []          [] []       []    [] []       |
+     gettext-tools      |                               []    [] []       |
+     gjay               |       []                                        |
+     glunarclock        | []    []          [] []       []    []          |
+     gnubiff            |                      []       []    ()          |
+     gnubik             |       []          []                []          |
+     gnucash            |          () () ()    ()             () []       |
+     gnuchess           |                                                 |
+     gnulib             | []    []             []             [] []       |
+     gnunet             |                                                 |
+     gnunet-gtk         |                                                 |
+     gold               |                               []    []          |
+     gphoto2            |                      []       []    [] []       |
+     gprof              | []                   []       []    []          |
+     gramadoir          | []                   []       []                |
+     grep               | []    []          [] []       []    [] []       |
+     grub               |       []             []             []          |
+     gsasl              | []                [] []       []    []          |
+     gss                | []                [] []       []    []          |
+     gst-plugins-bad    |                      []                         |
+     gst-plugins-base   |       []          [] []       []                |
+     gst-plugins-good   |       []          [] []       []    [] []       |
+     gst-plugins-ugly   |       []          [] []       []    [] []       |
+     gstreamer          |       []          [] []       []    []          |
+     gtick              | []    []             []       []    []          |
+     gtkam              |                      []       [] [] [] []       |
+     gtkspell           | []    []    []    [] [] []    [] [] [] []       |
+     guix               |                                                 |
+     guix-packages      |                                                 |
+     gutenprint         |       []             []             []          |
+     hello              | []    []          [] []       []                |
+     help2man           |                   []                [] []       |
+     help2man-texi      |                                                 |
+     hylafax            |                               []                |
+     idutils            |                      []       []                |
+     iso_15924          |       []             []    [] [] [] []          |
+     iso_3166           | []    [] [] [] [] [] []    [] [] [] [] []    [] |
+     iso_3166_2         |                               []    []          |
+     iso_4217           |                   [] []       [] [] [] []       |
+     iso_639            | []    [] []       [] []       [] [] [] []       |
+     iso_639_3          |       []                            []          |
+     iso_639_5          |                                                 |
+     jwhois             |       []             []       []    []          |
+     kbd                |                      []       []    []          |
+     klavaro            |       []          [] []             []       [] |
+     latrine            |                      []                         |
+     ld                 | []                            []    [] []       |
+     leafpad            | []    []    []    [] []       []    [] ()       |
+     libc               |       []          []          []    [] []       |
+     libexif            |                                     []          |
+     libextractor       |                                                 |
+     libgnutls          |                                     []          |
+     libgphoto2         |                                     [] []       |
+     libgphoto2_port    |                                     [] []       |
+     libgsasl           | []                   []       []    []          |
+     libiconv           | []    []          [] []       []    [] []       |
+     libidn             |                   [] []       []    []          |
+     liferea            |       []    []       []             [] []       |
+     lilypond           |                                     []          |
+     lordsawar          |                                                 |
+     lprng              |                               []                |
+     lynx               |                      []       []    [] []       |
+     m4                 | []    []          []          []       []       |
+     mailfromd          |                                                 |
+     mailutils          |                                                 |
+     make               |                   []          []    [] []       |
+     man-db             |                               []       []       |
+     man-db-manpages    |                               []       []       |
+     midi-instruments   |       []    []    [] [] []    [] [] [] []       |
+     minicom            |                      []       []       []       |
+     mkisofs            |                               []    []          |
+     myserver           |                                     []          |
+     nano               | []    []             []             [] []       |
+     opcodes            | []                            []    []          |
+     parted             |       []                      []    [] []       |
+     pies               |                                                 |
+     popt               | []    [] []       [] []    [] [] [] [] []       |
+     procps-ng          |                                                 |
+     procps-ng-man      |                                                 |
+     psmisc             |                   [] []       []    []          |
+     pspp               |       []                               []       |
+     pushover           |                                     []          |
+     pwdutils           |                               []                |
+     pyspread           |                                                 |
+     radius             |                               []                |
+     recode             | []    []    []    [] []       []    []          |
+     recutils           |                                                 |
+     rpm                |                               []                |
+     rush               |       []                                        |
+     sarg               |                                                 |
+     sed                | []    []          [] []       []    [] []       |
+     sharutils          |                                                 |
+     shishi             |                                                 |
+     skribilo           |                      []                         |
+     solfege            |       []                            []          |
+     solfege-manual     |                                                 |
+     spotmachine        |                                                 |
+     sudo               |       []          []                [] []       |
+     sudoers            |                   []                [] []       |
+     sysstat            |                      []       []       []       |
+     tar                | []                [] []       []    [] []       |
+     texinfo            |                   []          []    []          |
+     texinfo_document   |                      []             []          |
+     tigervnc           |                                                 |
+     tin                |                                                 |
+     tin-man            |                                                 |
+     tracgoogleappsa... |       []    []    [] []                         |
+     trader             |                   [] []                         |
+     util-linux         |                                        []       |
+     ve                 |                                     []          |
+     vice               |                      ()             ()          |
+     vmm                |                                                 |
+     vorbis-tools       |                   []          []                |
+     wastesedge         |                                     ()          |
+     wcd                |                                                 |
+     wcd-man            |                                                 |
+     wdiff              |       []             []             []          |
+     wget               |                      []             [] []       |
+     wyslij-po          |       []          []          []                |
+     xboard             |                                                 |
+     xdg-user-dirs      | [] [] [] [] [] [] [] []    [] [] [] [] []    [] |
+     xkeyboard-config   |       []             []       []    [] []       |
+                        +-------------------------------------------------+
+                          ga gd gl gu he hi hr hu hy ia id is it ja ka kk
+                          35  2 47  4  8  2 53 69  2  6 80 11 86 58  0  3
+
+                          kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl
+                        +--------------------------------------------------+
+     a2ps               |                                  []          []  |
+     aegis              |                                              []  |
+     anubis             |                                  []    []    []  |
+     aspell             |                            []                []  |
+     bash               |                                        []    []  |
+     bfd                |                                                  |
+     binutils           |                                                  |
+     bison              |                                              []  |
+     bison-runtime      |          []    [] []             []    []    []  |
+     buzztrax           |                                                  |
+     ccd2cue            |                                                  |
+     ccide              |                   []                         []  |
+     cflow              |                                              []  |
+     clisp              |                                              []  |
+     coreutils          |                                        []    []  |
+     cpio               |                                              []  |
+     cppi               |                                                  |
+     cpplib             |                                              []  |
+     cryptsetup         |                                              []  |
+     datamash           |                                        []    []  |
+     denemo             |                                                  |
+     dfarc              |                      []                      []  |
+     dialog             |       []       [] []             []    []    []  |
+     dico               |                                                  |
+     diffutils          |                   []                   []    []  |
+     dink               |                                              []  |
+     direvent           |                                              []  |
+     doodle             |                                              []  |
+     dos2unix           |                                        []    []  |
+     dos2unix-man       |                                              []  |
+     e2fsprogs          |                                              []  |
+     enscript           |                                              []  |
+     exif               |                   []                         []  |
+     fetchmail          |                                              []  |
+     findutils          |                                        []    []  |
+     flex               |                                              []  |
+     freedink           |                                        []    []  |
+     fusionforge        |                                                  |
+     gas                |                                                  |
+     gawk               |                                              []  |
+     gcal               |                                                  |
+     gcc                |                                                  |
+     gdbm               |                                                  |
+     gettext-examples   |          []       []             [] [] []    []  |
+     gettext-runtime    |    []                                        []  |
+     gettext-tools      |    []                                            |
+     gjay               |                                                  |
+     glunarclock        |                   []                         []  |
+     gnubiff            |                                              []  |
+     gnubik             |                                        []    []  |
+     gnucash            | () ()          () ()          ()       () () []  |
+     gnuchess           |                                        []    []  |
+     gnulib             |                                              []  |
+     gnunet             |                                                  |
+     gnunet-gtk         |                                                  |
+     gold               |                                                  |
+     gphoto2            |                                              []  |
+     gprof              |                                  []          []  |
+     gramadoir          |                                              []  |
+     grep               |                                        []    []  |
+     grub               |                []                      []    []  |
+     gsasl              |                                              []  |
+     gss                |                                                  |
+     gst-plugins-bad    |                                        []    []  |
+     gst-plugins-base   |                   []                   []    []  |
+     gst-plugins-good   |                [] []                   []    []  |
+     gst-plugins-ugly   |                   []             [] [] []    []  |
+     gstreamer          |                []                            []  |
+     gtick              |                                              []  |
+     gtkam              |                                        []    []  |
+     gtkspell           |          []    [] []       []    []    []    []  |
+     guix               |                                                  |
+     guix-packages      |                                                  |
+     gutenprint         |                                              []  |
+     hello              |                   []                   []    []  |
+     help2man           |                                        []        |
+     help2man-texi      |                                                  |
+     hylafax            |                                              []  |
+     idutils            |                                              []  |
+     iso_15924          |                () []                         []  |
+     iso_3166           | [] [] []       () [] [] []    []       []    []  |
+     iso_3166_2         |                ()                            []  |
+     iso_4217           |                () []                   []    []  |
+     iso_639            | [] []          () []    []    []             []  |
+     iso_639_3          | []             ()             []                 |
+     iso_639_5          |                ()                                |
+     jwhois             |                   []                         []  |
+     kbd                |                                              []  |
+     klavaro            |                                        []    []  |
+     latrine            |                                                  |
+     ld                 |                                                  |
+     leafpad            |    []    []    [] []                         []  |
+     libc               |    []                                        []  |
+     libexif            |                                              []  |
+     libextractor       |                                              []  |
+     libgnutls          |                                  []          []  |
+     libgphoto2         |                                              []  |
+     libgphoto2_port    |                                              []  |
+     libgsasl           |                                              []  |
+     libiconv           |                []                            []  |
+     libidn             |                                              []  |
+     liferea            |                [] []                         []  |
+     lilypond           |                                              []  |
+     lordsawar          |                                                  |
+     lprng              |                                                  |
+     lynx               |                                              []  |
+     m4                 |                                              []  |
+     mailfromd          |                                                  |
+     mailutils          |                                                  |
+     make               |    []                                        []  |
+     man-db             |                                              []  |
+     man-db-manpages    |                                              []  |
+     midi-instruments   |    [] []       []          []    []       [] []  |
+     minicom            |                                        []        |
+     mkisofs            |                                              []  |
+     myserver           |                                                  |
+     nano               |                                  []    []    []  |
+     opcodes            |                                              []  |
+     parted             |                                              []  |
+     pies               |                                                  |
+     popt               | [] []             []                   []    []  |
+     procps-ng          |                                                  |
+     procps-ng-man      |                                                  |
+     psmisc             |                                              []  |
+     pspp               |                []                            []  |
+     pushover           |                                                  |
+     pwdutils           |                                              []  |
+     pyspread           |                                                  |
+     radius             |                                              []  |
+     recode             |                                        []    []  |
+     recutils           |                                              []  |
+     rpm                |                                              []  |
+     rush               |                                              []  |
+     sarg               |                                                  |
+     sed                |                                        []    []  |
+     sharutils          |                                              []  |
+     shishi             |                                                  |
+     skribilo           |                                                  |
+     solfege            |                                        []    []  |
+     solfege-manual     |                                              []  |
+     spotmachine        |                                              []  |
+     sudo               |                                        []    []  |
+     sudoers            |                                        []    []  |
+     sysstat            |                                        []    []  |
+     tar                |          []                            []    []  |
+     texinfo            |                                              []  |
+     texinfo_document   |                                              []  |
+     tigervnc           |                                              []  |
+     tin                |                                                  |
+     tin-man            |                                                  |
+     tracgoogleappsa... |                   []                   []    []  |
+     trader             |                                        []        |
+     util-linux         |                                              []  |
+     ve                 |                                              []  |
+     vice               |                                              []  |
+     vmm                |                                              []  |
+     vorbis-tools       |                                              []  |
+     wastesedge         |                                              []  |
+     wcd                |                                              []  |
+     wcd-man            |                                              []  |
+     wdiff              |                                              []  |
+     wget               |                                        []    []  |
+     wyslij-po          |                                              []  |
+     xboard             |                                              []  |
+     xdg-user-dirs      | [] [] [] []    [] [] [] []    []       []    []  |
+     xkeyboard-config   |    []          []                            []  |
+                        +--------------------------------------------------+
+                          kn ko ku ky lg lt lv mk ml mn mr ms mt nb ne nl
+                           5 11  4  6  0 13 22  3  3  3  4 11  2 40  1 124
+
+                          nn or os pa pl  ps pt pt_BR ro ru rw sk sl sq sr
+                        +--------------------------------------------------+
+     a2ps               |             []     []  []   [] []       []    [] |
+     aegis              |                        []      []                |
+     anubis             |             []                 []             [] |
+     aspell             |             []         []   [] []    [] []    [] |
+     bash               |             []                 []    [] []    [] |
+     bfd                |                                []                |
+     binutils           |                                []             [] |
+     bison              |             []         []                     [] |
+     bison-runtime      |             []     []  []   [] []       [] [] [] |
+     buzztrax           |                                                  |
+     ccd2cue            |                        []                        |
+     ccide              |             []                 []             [] |
+     cflow              |             []                                [] |
+     clisp              |                                []                |
+     coreutils          |             []                 []       []    [] |
+     cpio               |             []                 []             [] |
+     cppi               |             []         []                     [] |
+     cpplib             |                        []      []             [] |
+     cryptsetup         |             []                                [] |
+     datamash           |                        []                     [] |
+     denemo             |                                                  |
+     dfarc              |             []         []                     [] |
+     dialog             |             []         []   [] []    [] []    [] |
+     dico               |             []                                   |
+     diffutils          |             []                                [] |
+     dink               |                                                  |
+     direvent           |             []         []                        |
+     doodle             |                                            [] [] |
+     dos2unix           |             []         []      []             [] |
+     dos2unix-man       |             []         []                        |
+     e2fsprogs          |             []                                   |
+     enscript           |             []         []   [] []       []    [] |
+     exif               |             []         []   [] []    []       [] |
+     fetchmail          |             []                 []          []    |
+     findutils          |             []         []      []       []    [] |
+     flex               |             []         []   [] []             [] |
+     freedink           |             []         []      []       []    [] |
+     fusionforge        |                                                  |
+     gas                |                                                  |
+     gawk               |             []                                   |
+     gcal               |                                                  |
+     gcc                |                                                  |
+     gdbm               |             []         []                     [] |
+     gettext-examples   |             []     []  []   [] []    [] []    [] |
+     gettext-runtime    | []          []     []  []   [] []    [] []    [] |
+     gettext-tools      |             []         []   [] []    [] []    [] |
+     gjay               |                                               [] |
+     glunarclock        |             []         []   []       [] []    [] |
+     gnubiff            |                                               [] |
+     gnubik             |             []         []               []    [] |
+     gnucash            |             ()         ()   () ()             [] |
+     gnuchess           |                        []                     [] |
+     gnulib             |             []         []      []       []    [] |
+     gnunet             |                                                  |
+     gnunet-gtk         |                                                  |
+     gold               |                                                  |
+     gphoto2            |             []         []   [] []             [] |
+     gprof              |                        []   [] []             [] |
+     gramadoir          |                                      []       [] |
+     grep               |             []         []      []    [] []    [] |
+     grub               |             []         []      []       []    [] |
+     gsasl              |             []                       []       [] |
+     gss                |             []              []       []       [] |
+     gst-plugins-bad    |             []         []      []             [] |
+     gst-plugins-base   |             []         []      []    [] []    [] |
+     gst-plugins-good   |             []         []   [] []    [] []    [] |
+     gst-plugins-ugly   |             []         []   [] []    [] []    [] |
+     gstreamer          |             []         []   [] []    [] []    [] |
+     gtick              |             []         []      []    []       [] |
+     gtkam              |          [] []         []      []    []       [] |
+     gtkspell           |             []     []  []   [] []    [] [] [] [] |
+     guix               |                                                  |
+     guix-packages      |                                                  |
+     gutenprint         |                                      [] []       |
+     hello              |             []         []      []    [] []    [] |
+     help2man           |             []         []      []             [] |
+     help2man-texi      |             []                                   |
+     hylafax            |                                                  |
+     idutils            |             []                 []             [] |
+     iso_15924          |             []     ()       [] []       []    [] |
+     iso_3166           | [] []    [] []     ()  []   [] [] [] [] [] [] [] |
+     iso_3166_2         |             []     ()                         [] |
+     iso_4217           | []          []     ()       [] [] []    []    [] |
+     iso_639            |    []    [] []     ()       [] [] [] [] []    [] |
+     iso_639_3          |          []        ()                            |
+     iso_639_5          |                    ()                         [] |
+     jwhois             |             []         []   []                [] |
+     kbd                |             []                 []                |
+     klavaro            |          [] []         []      []       []       |
+     latrine            |                        []                        |
+     ld                 |                                                  |
+     leafpad            | []    []    []     []  []      []    [] []    [] |
+     libc               |             []                 []    []          |
+     libexif            |             []         ()            []          |
+     libextractor       |             []                                   |
+     libgnutls          |             []                                   |
+     libgphoto2         |             []                                   |
+     libgphoto2_port    |             []         []      []    []       [] |
+     libgsasl           |             []              []       []       [] |
+     libiconv           |             []         []            [] []    [] |
+     libidn             |             []         []                     [] |
+     liferea            |             []     []  []   [] ()    []    []    |
+     lilypond           |                                                  |
+     lordsawar          |                                                  |
+     lprng              |             []                                   |
+     lynx               |                        []      []                |
+     m4                 |             []         []   [] []             [] |
+     mailfromd          |             []                                   |
+     mailutils          |             []                                   |
+     make               |             []         []      []                |
+     man-db             |             []                 []             [] |
+     man-db-manpages    |             []                 []             [] |
+     midi-instruments   |             []     []  []   [] []    [] []    [] |
+     minicom            |             []         []   [] []                |
+     mkisofs            |             []                 []             [] |
+     myserver           |                                         []    [] |
+     nano               |             []         []   [] []       []    [] |
+     opcodes            |                                                  |
+     parted             |             []         []      []    [] []    [] |
+     pies               |             []                                   |
+     popt               |             []     []  []      []       []    [] |
+     procps-ng          |             []                                   |
+     procps-ng-man      |             []                                   |
+     psmisc             |             []         []      []             [] |
+     pspp               |             []                 []                |
+     pushover           |                                                  |
+     pwdutils           |             []                                   |
+     pyspread           | []                     []                        |
+     radius             |             []                 []                |
+     recode             |             []     []  []   [] []    [] []    [] |
+     recutils           |                                               [] |
+     rpm                |             []                                   |
+     rush               |             []         []                     [] |
+     sarg               |                        []      []                |
+     sed                |             []     []  []   [] []    [] []    [] |
+     sharutils          |             []         []                     [] |
+     shishi             |             []                                [] |
+     skribilo           |                                                  |
+     solfege            |             []         []      []                |
+     solfege-manual     |             []         []                        |
+     spotmachine        |                        []                     [] |
+     sudo               |             []         []      []    [] []    [] |
+     sudoers            |             []         []               []    [] |
+     sysstat            |             []         []      []    []       [] |
+     tar                |             []         []      []       []    [] |
+     texinfo            |             []         []      []                |
+     texinfo_document   |             []         []                        |
+     tigervnc           |                        []                        |
+     tin                |                                []                |
+     tin-man            |                                                  |
+     tracgoogleappsa... |             []         []      []             [] |
+     trader             |                                []                |
+     util-linux         |             []         []                        |
+     ve                 |             []         []                     [] |
+     vice               |                                                  |
+     vmm                |                                                  |
+     vorbis-tools       |             []                          []    [] |
+     wastesedge         |                                                  |
+     wcd                |                                                  |
+     wcd-man            |                                                  |
+     wdiff              |             []         []      []       []    [] |
+     wget               |             []         []      []    []          |
+     wyslij-po          | []          []         []                     [] |
+     xboard             |             []                 []             [] |
+     xdg-user-dirs      | [] []    [] []  [] []  []   [] []    [] [] [] [] |
+     xkeyboard-config   |             []         []      []       []       |
+                        +--------------------------------------------------+
+                          nn or os pa pl  ps pt pt_BR ro ru rw sk sl sq sr
+                           7  3  1  6 114  1 12  83   32 80  3 38 45  7 94
+
+                          sv sw ta te tg th tr uk  ur vi  wa wo zh_CN zh_HK
+                        +---------------------------------------------------+
+     a2ps               | []             [] [] []     []                    |
+     aegis              |                             []                    |
+     anubis             | []                [] []     []                    |
+     aspell             |                      []     []  []     []         |
+     bash               | []                   []     []         []         |
+     bfd                |                      []     []                    |
+     binutils           | []                   []     []                    |
+     bison              | []                   []     []         []         |
+     bison-runtime      | []             [] [] []     []         []         |
+     buzztrax           | []                          []         []         |
+     ccd2cue            |                      []     []         []         |
+     ccide              | []                   []     []         []         |
+     cflow              | []                   []     []         []         |
+     clisp              |                                                   |
+     coreutils          | []                   []     []         []         |
+     cpio               | []                [] []     []         []         |
+     cppi               | []                   []     []         []         |
+     cpplib             | []                [] []     []         []         |
+     cryptsetup         |                      []     []         []         |
+     datamash           | []                   []     []                    |
+     denemo             |                                                   |
+     dfarc              |                             []                    |
+     dialog             | [] []          []           []  []     []         |
+     dico               |                      []                           |
+     diffutils          | []                [] []     []         []         |
+     dink               |                                                   |
+     direvent           |                      []     []                    |
+     doodle             | []                          []                    |
+     dos2unix           | []                   []     []         []         |
+     dos2unix-man       | []                   []                []         |
+     e2fsprogs          | []                   []     []         []         |
+     enscript           | []                [] []     []                    |
+     exif               | []                [] []     []         []         |
+     fetchmail          | []                []        []         []         |
+     findutils          | []                [] []     []         []         |
+     flex               | []                []        []         []         |
+     freedink           |                []           []                    |
+     fusionforge        |                                                   |
+     gas                |                      []                           |
+     gawk               | []                          []                    |
+     gcal               | []                []                              |
+     gcc                | []                                     []         |
+     gdbm               |                      []     []                    |
+     gettext-examples   | []                [] []     []         []    []   |
+     gettext-runtime    | []                [] []     []         []    []   |
+     gettext-tools      | []                [] []     []         []         |
+     gjay               |                []           []                    |
+     glunarclock        | []                          []  []     []         |
+     gnubiff            | []                          []                    |
+     gnubik             | []                   []     []         []         |
+     gnucash            |       () ()              () ()         []         |
+     gnuchess           |                      []     []                    |
+     gnulib             | []                   []     []         []         |
+     gnunet             |                                                   |
+     gnunet-gtk         |                                                   |
+     gold               |                      []     []                    |
+     gphoto2            | []                   []     []         []         |
+     gprof              | []                [] []     []                    |
+     gramadoir          | []                          []         []         |
+     grep               | []             []    []     []         []         |
+     grub               | []                [] []     []                    |
+     gsasl              | []                   []     []         []         |
+     gss                | []                          []         []         |
+     gst-plugins-bad    | []                   []     []         []         |
+     gst-plugins-base   | []                [] []     []         []         |
+     gst-plugins-good   | []                [] []     []         []         |
+     gst-plugins-ugly   | []                [] []     []         []         |
+     gstreamer          | []                [] []     []         []         |
+     gtick              |                      []     []         []         |
+     gtkam              | []                   []     []         []         |
+     gtkspell           | []             [] [] []     []  []     []    []   |
+     guix               |                             []                    |
+     guix-packages      |                                                   |
+     gutenprint         |                   [] []     []         []         |
+     hello              | []             [] [] []     []         []         |
+     help2man           |                      []     []         []         |
+     help2man-texi      |                      []                           |
+     hylafax            |                             []                    |
+     idutils            |                      []     []         []         |
+     iso_15924          | []             () [] []     ()         []         |
+     iso_3166           | []       []    () [] []     ()  []     []    []   |
+     iso_3166_2         |                () [] []     ()         []         |
+     iso_4217           | []             () [] []     ()         []    []   |
+     iso_639            | []    [] []    () [] []     ()  []     []    []   |
+     iso_639_3          |       []       () [] []     ()                    |
+     iso_639_5          |                ()    []     ()                    |
+     jwhois             | []                []        []         []         |
+     kbd                |                      []     []         []         |
+     klavaro            | []                   []  [] []     []  []         |
+     latrine            |                             []         []         |
+     ld                 | []                [] []     []         []         |
+     leafpad            | []             [] [] []     []         []         |
+     libc               | []                [] []     []         []         |
+     libexif            |                             []         ()         |
+     libextractor       |                      []     []                    |
+     libgnutls          | []                   []     []         []         |
+     libgphoto2         |                      []     []                    |
+     libgphoto2_port    | []                   []     []         []         |
+     libgsasl           | []                   []     []         []         |
+     libiconv           | []                   []     []  []     []         |
+     libidn             | ()                   []     []         []         |
+     liferea            | []                [] []     []         []         |
+     lilypond           |                             []                    |
+     lordsawar          |                                                   |
+     lprng              |                             []                    |
+     lynx               | []                [] []     []                    |
+     m4                 | []                          []         []         |
+     mailfromd          |                      []     []                    |
+     mailutils          |                             []                    |
+     make               | []                   []     []         []         |
+     man-db             |                             []         []         |
+     man-db-manpages    |                                        []         |
+     midi-instruments   | []             [] [] []     []         []         |
+     minicom            | []                          []                    |
+     mkisofs            |                      []     []         []         |
+     myserver           |                             []                    |
+     nano               | []                   []     []         []         |
+     opcodes            |                      []     []         []         |
+     parted             | []                [] []     []         []         |
+     pies               |                      []     []                    |
+     popt               | []    []       [] [] []     []         []         |
+     procps-ng          |                      []     []                    |
+     procps-ng-man      |                      []                           |
+     psmisc             | []                   []     []         []         |
+     pspp               |                   [] []                []         |
+     pushover           | []                                                |
+     pwdutils           | []                          []                    |
+     pyspread           |                      []                           |
+     radius             |                      []     []                    |
+     recode             | []                []        []         []         |
+     recutils           | []                   []     []                    |
+     rpm                | []                   []     []         []         |
+     rush               |                      []     []                    |
+     sarg               |                                                   |
+     sed                | []                [] []     []         []         |
+     sharutils          |                      []     []         []         |
+     shishi             |                             []         []         |
+     skribilo           | []                                                |
+     solfege            |                   []        []         []         |
+     solfege-manual     |                   []                              |
+     spotmachine        | []                   []     []                    |
+     sudo               |                   [] []     []         []         |
+     sudoers            |                      []     []         []         |
+     sysstat            | []                [] []     []         []         |
+     tar                | []                [] []     []         []         |
+     texinfo            |                   [] []     []                    |
+     texinfo_document   |                      []                           |
+     tigervnc           | []                   []                           |
+     tin                |                                        []         |
+     tin-man            |                                                   |
+     tracgoogleappsa... | []             []    []     []         []         |
+     trader             | []                                                |
+     util-linux         |                      []     []         []         |
+     ve                 | []                   []     []         []         |
+     vice               | ()                ()                              |
+     vmm                |                                                   |
+     vorbis-tools       | []                          []                    |
+     wastesedge         |                                                   |
+     wcd                |                      []     []         []         |
+     wcd-man            |                      []                           |
+     wdiff              | []                   []     []         []         |
+     wget               |                      []     []         []         |
+     wyslij-po          |                      []     []                    |
+     xboard             |                      []                           |
+     xdg-user-dirs      | []    [] []    [] [] []     []         []    []   |
+     xkeyboard-config   | []                [] []     []                    |
+                        +---------------------------------------------------+
+                          sv sw ta te tg th tr uk  ur vi  wa wo zh_CN zh_HK
+                          91  1  4  3  0 13 50 113  1 126  7  1  95     7
+
+                          zh_TW
+                        +-------+
+     a2ps               |       | 30
+     aegis              |       |  9
+     anubis             |       | 19
+     aspell             |       | 28
+     bash               |  []   | 21
+     bfd                |       |  9
+     binutils           |       | 12
+     bison              |  []   | 18
+     bison-runtime      |  []   | 38
+     buzztrax           |       |  8
+     ccd2cue            |       |  8
+     ccide              |       | 17
+     cflow              |       | 15
+     clisp              |       | 10
+     coreutils          |       | 20
+     cpio               |       | 20
+     cppi               |       | 17
+     cpplib             |  []   | 19
+     cryptsetup         |       | 13
+     datamash           |       | 11
+     denemo             |       |  4
+     dfarc              |       | 16
+     dialog             |  []   | 42
+     dico               |       |  6
+     diffutils          |       | 21
+     dink               |       |  9
+     direvent           |       | 10
+     doodle             |       | 12
+     dos2unix           |  []   | 18
+     dos2unix-man       |       |  9
+     e2fsprogs          |       | 14
+     enscript           |       | 21
+     exif               |       | 26
+     fetchmail          |       | 19
+     findutils          |       | 28
+     flex               |  []   | 19
+     freedink           |       | 23
+     fusionforge        |       |  3
+     gas                |       |  5
+     gawk               |       | 12
+     gcal               |       |  7
+     gcc                |       |  4
+     gdbm               |       | 10
+     gettext-examples   |  []   | 40
+     gettext-runtime    |  []   | 34
+     gettext-tools      |  []   | 24
+     gjay               |       |  8
+     glunarclock        |  []   | 27
+     gnubiff            |       |  9
+     gnubik             |       | 19
+     gnucash            |  ()   |  7
+     gnuchess           |       | 10
+     gnulib             |       | 23
+     gnunet             |       |  1
+     gnunet-gtk         |       |  1
+     gold               |       |  7
+     gphoto2            |  []   | 19
+     gprof              |       | 21
+     gramadoir          |       | 14
+     grep               |  []   | 31
+     grub               |       | 21
+     gsasl              |  []   | 19
+     gss                |       | 17
+     gst-plugins-bad    |       | 14
+     gst-plugins-base   |       | 27
+     gst-plugins-good   |       | 32
+     gst-plugins-ugly   |       | 34
+     gstreamer          |  []   | 31
+     gtick              |       | 19
+     gtkam              |       | 24
+     gtkspell           |  []   | 48
+     guix               |       |  3
+     guix-packages      |       |  0
+     gutenprint         |       | 15
+     hello              |  []   | 30
+     help2man           |       | 18
+     help2man-texi      |       |  5
+     hylafax            |       |  5
+     idutils            |       | 14
+     iso_15924          |  []   | 23
+     iso_3166           |  []   | 58
+     iso_3166_2         |       |  9
+     iso_4217           |  []   | 28
+     iso_639            |  []   | 46
+     iso_639_3          |       | 10
+     iso_639_5          |       |  2
+     jwhois             |  []   | 20
+     kbd                |       | 16
+     klavaro            |       | 30
+     latrine            |       |  7
+     ld                 |  []   | 15
+     leafpad            |  []   | 40
+     libc               |  []   | 24
+     libexif            |       |  9
+     libextractor       |       |  5
+     libgnutls          |       | 13
+     libgphoto2         |       |  9
+     libgphoto2_port    |  []   | 19
+     libgsasl           |       | 18
+     libiconv           |  []   | 29
+     libidn             |       | 17
+     liferea            |       | 29
+     lilypond           |       | 11
+     lordsawar          |       |  3
+     lprng              |       |  3
+     lynx               |       | 19
+     m4                 |  []   | 22
+     mailfromd          |       |  4
+     mailutils          |       |  6
+     make               |       | 19
+     man-db             |       | 14
+     man-db-manpages    |       |  9
+     midi-instruments   |  []   | 43
+     minicom            |  []   | 17
+     mkisofs            |       | 13
+     myserver           |       |  9
+     nano               |  []   | 29
+     opcodes            |       | 12
+     parted             |  []   | 21
+     pies               |       |  4
+     popt               |  []   | 36
+     procps-ng          |       |  5
+     procps-ng-man      |       |  4
+     psmisc             |  []   | 22
+     pspp               |       | 13
+     pushover           |       |  6
+     pwdutils           |       |  8
+     pyspread           |       |  6
+     radius             |       |  9
+     recode             |       | 31
+     recutils           |       |  9
+     rpm                |  []   | 13
+     rush               |       | 10
+     sarg               |       |  4
+     sed                |  []   | 34
+     sharutils          |       | 12
+     shishi             |       |  7
+     skribilo           |       |  4
+     solfege            |       | 19
+     solfege-manual     |       |  9
+     spotmachine        |       | 10
+     sudo               |       | 24
+     sudoers            |       | 20
+     sysstat            |       | 22
+     tar                |  []   | 30
+     texinfo            |       | 17
+     texinfo_document   |       | 11
+     tigervnc           |       | 11
+     tin                |  []   |  7
+     tin-man            |       |  1
+     tracgoogleappsa... |  []   | 22
+     trader             |       | 11
+     util-linux         |       | 12
+     ve                 |       | 14
+     vice               |       |  1
+     vmm                |       |  3
+     vorbis-tools       |       | 13
+     wastesedge         |       |  2
+     wcd                |       |  8
+     wcd-man            |       |  3
+     wdiff              |  []   | 23
+     wget               |       | 19
+     wyslij-po          |       | 14
+     xboard             |       |  9
+     xdg-user-dirs      |  []   | 68
+     xkeyboard-config   |  []   | 27
+                        +-------+
+       90 teams           zh_TW
+      166 domains          42    2748
+
+   Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect.  This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+   For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and distributed
+as such by its maintainer.  There might be an observable lag between the
+mere existence a PO file and its wide availability in a distribution.
+
+   If Jun 2014 seems to be old, you may fetch a more recent copy of this
+'ABOUT-NLS' file on most GNU archive sites.  The most up-to-date matrix
+with full percentage details can be found at
+'http://translationproject.org/extra/matrix.html'.
+
+1.5 Using 'gettext' in new packages
+===================================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU 'gettext' in your
+package.  Of course you have to respect the GNU Lesser General Public
+License which covers the use of the GNU 'gettext' library.  This means
+in particular that even non-free programs can use 'libintl' as a shared
+library, whereas only free software can use 'libintl' as a static
+library or use modified versions of 'libintl'.
+
+   Once the sources are changed appropriately and the setup can handle
+the use of 'gettext' the only thing missing are the translations.  The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project.  Therefore the information given above
+applies also for every other Free Software Project.  Contact
+'coordinator@translationproject.org' to make the '.pot' files available
+to the translation teams.
diff --git a/gawk-5.0.1/extension/AUTHORS b/gawk-5.0.1/extension/AUTHORS
new file mode 100644
index 00000000000..fa9e7fe1f29
--- /dev/null
+++ b/gawk-5.0.1/extension/AUTHORS
@@ -0,0 +1,13 @@
+  Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+  
+  Copying and distribution of this file, with or without modification,
+  are permitted in any medium without royalty provided the copyright
+  notice and this notice are preserved.
+
+Gawk was written by Paul Rubin, and finished by Paul Finlason and
+Richard Stallman.
+
+David Trueman and Arnold Robbins took it over, with David doing most
+of the work to make it compatible with new awk.
+
+Circa 1994, Arnold Robbins took over maintenance.
diff --git a/gawk-5.0.1/extension/COPYING b/gawk-5.0.1/extension/COPYING
new file mode 100644
index 00000000000..94a9ed024d3
--- /dev/null
+++ b/gawk-5.0.1/extension/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/gawk-5.0.1/extension/ChangeLog b/gawk-5.0.1/extension/ChangeLog
new file mode 100644
index 00000000000..3d83f77e06c
--- /dev/null
+++ b/gawk-5.0.1/extension/ChangeLog
@@ -0,0 +1,13 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.1 to the list. Ooops.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/extension/ChangeLog.0 b/gawk-5.0.1/extension/ChangeLog.0
new file mode 100644
index 00000000000..f13a7ebd26a
--- /dev/null
+++ b/gawk-5.0.1/extension/ChangeLog.0
@@ -0,0 +1,91 @@
+Mon May 23 22:03:46 2011  John Haque      <j.eh@mchsi.com>
+
+	* testarg.awk, testarg.c: Updated.
+
+Thu Mar 31 22:58:19 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* filefuncs.c (do_stat): Fix a comment. Also in doc.
+
+Thu Jan 13 20:37:02 2011  Andrew J. Schorr   <aschorr@telemetry-investments.com>
+
+	* filefuncs.c (do_stat): Malloc the buffer to read the contents
+	of the link. From mail of June 21, 2005.
+
+Sun Jan  2 21:08:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* filefuncs.c: Synched with code in gawk.texi, copyright dates
+	updated.
+
+Sat Dec 18 20:22:44 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* pcext.def: Removed, since we don't support MSFT compilers.
+
+Wed Nov 24 20:08:13 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* arrayparm.c, dl.c, filefuncs.c, fork.c, ordchr.c, readfile.c,
+	rwarray.c, testarg.c, xreadlink.c: Define `plugin_is_GPL_compatible'
+	per GNU Coding standards.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Mon May 18 21:31:34 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* rwarray.c (write_value, read_value): Use htonl / ntohl to write /
+	read the code for double / string.  Test read-in code for != 0
+	to handle stuff written before this change.
+
+Sat May 16 22:52:34 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* rwarray.c (do_reada, read_elem, read_value): Made the code
+	actually work.
+
+Fri May 15 16:01:06 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* rwarray.c, rwarray.awk: New files.
+	* steps: Updated.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Sun Jun 26 09:03:32 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* filefuncs.c (do_stat): Check return value from readlink()
+	for error. Pass in `sizeof(buf) - 1' to leave room for trailing
+	zero byte. From: Glenn Zazulia <gnu@t1.zazu.com>.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+Mon Jun 21 17:02:37 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	More from John Haque.
+
+	* testarg.c, testarg.awk: New files.
+	* arrayparm.c (do_mkarray): Change call of `get_curfunc_parm_count'
+	to `get_curfunc_arg_count'.
+	* filefuncs.c (do_chdir, do_stat): Ditto.
+	* fork.c (do_fork, do_waitpid): Ditto.
+	* ordchr.c (do_ord, do_chr): Ditto.
+	* readfile.c (do_readfile): Ditto.
+	* steps: Updated.
+
+Mon Jun 14 14:01:16 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	ChangeLog started.
+
+	Changes from John Haque and ADR to rationalize extension functions.
+
+	* extension/filefuncs.c: Revised for new functionality. See
+	corresponding entry in main ChangeLog.
diff --git a/gawk-5.0.1/extension/ChangeLog.1 b/gawk-5.0.1/extension/ChangeLog.1
new file mode 100644
index 00000000000..3f19c4a680f
--- /dev/null
+++ b/gawk-5.0.1/extension/ChangeLog.1
@@ -0,0 +1,1696 @@
+2019-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c: Change to use stat when dir info is 'u'. Bump version.
+	* readdir_test.c: Ditto.
+	* readdir.3am: Document same.
+
+2019-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace.c (do_inplace_end): Fix error message to use inplace::end.
+	Thanks to Jean-Philippe Guerard
+	<jean-philippe.guerard@xn--tigreray-i1a.org> for the report.
+
+2018-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (distclean-local): Remove .deps directory.
+
+2018-09-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.in, aclocal.m4, configure: Regenerated, using
+	Automake 1.16.1.
+
+2018-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* .gitignore: Ignore libtool itself.
+
+2018-03-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.3am, filefuncs.c, fnmatch.3am, fnmatch.c,
+	fork.3am, fork.c, inplace.3am, inplace.c, intdiv.c,
+	ordchr.3am, ordchr.c, readdir.3am, readdir.c, readdir_test.c,
+	readfile.3am, readfile.c, revoutput.3am, revoutput.c,
+	revtwoway.3am, revtwoway.c, rwarray.3am, rwarray.c,
+	rwarray0.c, testext.c, time.3am, time.c: Update copyright year.
+
+2018-03-07  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.am (SUBDIRS): Add po.
+	* configure.ac (AC_CONFIG_FILES): Add po/Makefile.in.
+	* ABOUT-NLS: Updated.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-02-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Restore checking for PPC Macintosh before
+	checking for MPFR. See README_d/README.macosx for info.
+
+2018-02-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Remove checking for PPC Macintosh before
+	checking for MPFR. Installing a newer compiler on that
+	system allows things to work.
+
+2018-02-17         Michal Jaegermann     <michal.jnn@gmail.com>.
+
+	* filefuncs.3am, filefuncs.c, fnmatch.3am, revoutput.3am,
+	revtwoway.3am: Spelling and typo fixes.
+
+2018-02-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add stuff for finding gettext. Helps in
+	finding MPFR on some systems.
+
+2018-02-11         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* intdiv.c (do_intdiv): Print a warning about loss of precision if
+	MPFR arguments are received when not compiled with MPFR support.
+
+2018-02-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.3am: Fix some typos.
+
+2018-02-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac (pkgextensiondir): This must be set to
+	'${libdir}/gawk'${EXTENSIONDIR} to match gawk's value.
+	The previous value of '${pkglibdir}'${EXTENSIONDIR} was incorrect,
+	because it was putting the extensions in the gawk-extensions
+	libdir subdirectory, instead of the gawk subdirectory.
+
+2018-02-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.3am, fnmatch.3am, fork.3am, inplace.3am,
+	ordchr.3am, readdir.3am, readfile.3am, revoutput.3am,
+	revtwoway.3am, rwarray.3am, time.3am: Add vim modeline at the
+	bottom to set the file type for syntax coloring.
+
+2018-02-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (FTS_SKIP): New constant.
+	(process): Additional arg skipset. When true (based on if
+	FTS_SKIP was passed) and at level 0, use fts_set to set
+	FTS_SKIP on the directory.
+
+2018-01-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* compile, config.guess, config.rpath, config.sub,
+	depcomp: Updated from GNULIB.
+
+2018-01-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c, fnmatch.c, fork.c, inplace.c, intdiv.c, ordchr.c,
+	readdir.c, readdir_test.c, readfile.c, revoutput.c, revtwoway.c,
+	rwarray.c, rwarray0.c, testext.c, time.c: Remove incorrect '*'
+	on declarations of ext_id in sample extension code. Thanks to
+	Panos Papadopoulos <panos1962@gmail.com> for the report.
+
+2017-12-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (fmod): Put AC_SEARCH_LIBS before the call
+	to AC_CHECK_FUNCS and put fmod back into that list. Finally
+	causes config.h to have the correct check for HAVE_FMOD.
+	Thanks again to Michal Jaegermann <michal.jnn@gmail.com>.
+
+2017-12-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	More configuration fixes, mainly for Fedora. Thanks to
+	Michal Jaegermann <michal.jnn@gmail.com> for the reports
+	and for validating.
+
+	* configure.ac (AC_HEADER_MAJOR): Comment out, no longer works.
+	(sys/sysmacros.h, sys/mkdev.h): Check for header existence.
+	(fmod): Check with AC_SEARCH_LIBs instead of AC_CHECK_FUNCS.
+	* filefuncs.c: Rework header inclusion checks and order so
+	that we get the `major' macro without warnings on Fedora.
+	* fnmatch.c: Ditto.
+
+2017-12-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkfts.c (fts_safe_changedir): Add check for path not null
+	before trying to open it. Thanks to Michal Jaegermann
+	<michal.jnn@gmail.com> for the report.
+
+2017-12-24          Michal Jaegermann    <michal.jnn@gmail.com>
+
+	* intdiv.c: Fix compilation for MPFR 2.4.1.
+
+2017-12-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add support for the --enable-versioned-dir option
+	in the main configure program.
+
+2017-12-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add --disable-mpfr to be in sync with main
+	configure.ac and revise checking for MPFR appropriately.
+	* ext_custom.h: Use bug reporting address instead of my
+	personal address for reports of changes to this file.
+
+2017-10-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray.c (do_writea): Fix description in comment.
+	(write_array): Free the flattened array if writing an element fails.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-09-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray.c: Increase the version.
+
+2017-09-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c: Move include of <sys/stat.h> to after include
+	of <sys/sysmacros.h> to (try to) avoid a Fedora compilation
+	warning. Update copyright year.
+
+2017-09-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray.c: Update copyright year.
+
+2017-09-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray.c: Add support for writing/reading undefined values.
+
+2017-08-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fnmatch.c: Use the right autoconf goop to get the major
+	and minor macros out of <sys/sysmacros.h>. Thanks to
+	David Kaspar <dkaspar@redhat.com> for the report.
+
+2017-08-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (ntdiv_la_LIBADD): Add -lm for Solaris systems,
+	per report from Nelson H.F. Beebe.
+
+2017-08-21         Daniel Richard G.     <skunk@iSKUNK.ORG>
+
+	* configure: Regenerated after update to m4/arch.m4.
+
+2017-08-19         Eli Zaretskii         <eliz@gnu.org>
+
+	* testext.c (test_get_file): Don't remove outfile from the Gawk
+	script, as that fails on MS-Windows.
+
+2017-08-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Bump associated gawk version.
+
+2017-08-11         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* intdiv.c: No need to include <gmp.h> explicitly, since <mpfr.h>
+	does this for us.
+
+2017-08-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* intdiv.c (init_intdiv): Remove function, since dl_load_func now
+	calls check_mpfr_version automatically.
+	(init_func): Initialize to NULL instead of init_intdiv.
+
+2017-08-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Update copyright year.
+
+2017-07-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace.c: Move functions into "inplace" namespace and simplify
+	the names. Update all error messages accordingly.
+
+2017-07-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c (init_test_ext): Add installation of a variable and a
+	function in a namespace, and test using them.
+	(do_test_function): New function.
+	(ns_test_func): New function entry for it.
+
+2017-06-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makfile.am (intdiv_la_LIBADD): Add LIBMPFR for Cygwin.
+	Thanks to Eli Zaretskii for the tip that this is necessary.
+
+2017-06-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* rwarray.c (read_value): Use malloc instead of calloc, since
+	we immediately overwrite the buffer with data from the file.
+	* rwarray0.c (read_value): Ditto.
+
+2017-06-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readfile.c (read_file_to_buffer): Use emalloc instead of ezalloc,
+	since there's no need to initialize the memory to zero before 
+	overwriting it with the file's contents.
+
+2017-06-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* filefuncs.c (do_fts): Replace emalloc+memset with ezalloc.
+	* readfile.c (read_file_to_buffer): Ditto.
+	* rwarray.c (read_value): Replace gawk_malloc+memset with gawk_calloc.
+	* gawkfts.c (fts_open): Replace malloc+memset with calloc.
+	* rwarray0.c (read_value): Ditto.
+
+2017-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* intdiv.c (func_table): Function is now named intdiv.
+
+2017-04-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* intdiv.c (do_intdiv): On division by zero, return -1 and issue a
+	warning instead of throwing a fatal error.
+
+2017-04-13         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* intdiv.c (do_intdiv): On a division by zero fatal error, there's
+	no need to clear the numerator and denominator and add a fake return.
+
+2017-04-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Alphabetize function list in AC_CHECK_FUNCS.
+	* intdiv.c: Add descriptive comments to some functions.
+	(do_intdiv): Make division by zero fatal in MPFR case.
+
+2017-04-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace.c (inplace_end): Correct the function name in the
+	wrong argument count error message. Thanks to Dan Neilsen
+	for the report.
+
+2017-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c: Minor edits.
+	* readdir_test.c: Same minor edits, update copyright year,
+	bump version of extension in case this ever becomes the real one.
+
+2017-03-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c (dir_get_record): Add additional parameter to make types
+	match and remove compiler warning.
+	* readfile.c (readfile_get_record): Ditto.
+	* revtwoway.c (rev2way_get_record): Ditto.
+
+2017-03-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir_test.c (open_directory_t): Replace field_width array
+	with new awk_fieldwidth_info_t structure. Wrap it in a union so
+	we can allocate the proper size.
+	(dir_get_record): Update field_width type from
+	'const awk_input_field_info_t **' to 'const awk_fieldwidth_info_t **'.
+	Update new fieldwidth parsing info appropriately.
+	(dir_take_control_of): Populate new fieldwidth parsing structure
+	with initial values.
+
+2017-03-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir_test.c (open_directory_t): Update field_width type from an
+	array of integers to an array of awk_input_field_info_t.
+	(dir_get_record): Ditto.
+	(dir_take_control_of): Ditto.
+
+2017-03-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (pkgextension_LTLIBRARIES): Remove testext.la, since it
+	does not make sense to install this library.
+	(noinst_LTLIBRARIES): New variable containing list of libraries to
+	build for testing purposes only. These libraries will not be installed.
+	Initially, it contains only testext.la.
+	(testext_la_LDFLAGS): Add "-rpath /foo" to convince automake/libtool
+	to build a shared version of this library. Since it is not being
+	installed, automake cannot use the final destination directory to
+	determine -rpath by itself. The value doesn't matter.
+
+2017-03-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir_test.c: Test extension using new get_record field_width
+	parsing feature.
+	* Makefile.am (noinst_LTLIBRARIES): Add readdir_test.la.
+	(readdir_test_la_*): Configure building of new extension library.
+
+2017-01-21  Eli Zaretskii  <eliz@gnu.org>
+
+	* testext.c (getuid) [__MINGW32__]: New function, mirrors what
+	pc/getid.c does in Gawk.
+	* rwarray.c [__MINGW32__]: Include stdint.h, otherwise using
+	uint32_t causes compilation errors.
+	* inplace.c (_XOPEN_SOURCE): Define to 1, not to nothing.  MinGW
+	system headers assume that if this is defined, it must have a
+	numeric value.
+
+2017-01-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* intdiv.c: New extension to demonstrate how to implement intdiv
+	using the new extended-precision math API.
+	* Makefile.am (pkgextension_LTLIBRARIES): Add intdiv.la.
+	(intdiv_la_SOURCES, intdiv_la_LDFLAGS, intdiv_la_LIBADD): Add support
+	for new intdiv library.
+	* configure.ac (AC_CHECK_FUNCS): Check for fmod needed by intdiv.
+	(GNUPG_CHECK_MPFR): Add check for MPFR support.
+
+2016-12-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c (valrep2str): Update for new API types.
+
+2016-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c: Update func_table again.
+
+2016-12-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c: Update do_xxx to match new API. Update func_table.
+	* fnmatch.c: Ditto.
+	* fork.c: Ditto.
+	* inplace.c: Ditto.
+	* ordchr.c: Ditto.
+	* readdir.c: Ditto.
+	* readfile.c: Ditto.
+	* revoutput.c: Ditto.
+	* revtwoway.c: Ditto.
+	* rwarray.c: Ditto.
+	* rwarray0.c: Ditto.
+	* testext.c: Ditto.
+	* time.c: Ditto.
+
+2016-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (func_table): Adjust ordering of min and max
+	for stat.
+
+2016-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add minimum required and maximum expected number of arguments
+	to the API.
+
+	* filefuncs.c: Update with max expected value. Remove lint
+	checks since that's now done by gawk.
+	* fnmatch.c: Ditto.
+	* fork.c: Ditto.
+	* inplace.c: Ditto.
+	* ordchr.c: Ditto.
+	* readdir.c: Ditto.
+	* readfile.c: Ditto.
+	* rwarray.c: Ditto.
+	* rwarray0.c: Ditto.
+	* testext.c: Ditto.
+	* time.c: Ditto.
+
+2016-12-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* rwarray.c: Adjust to read and write strnum values.
+	(write_value): When writing a string value, code should use htonl.
+	There are now 3 string types: string, strnum, and regex.
+	(read_value): Support 3 string types: string, strnum, and regex.
+
+2016-11-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray.c: Restore read comparion of major and minor versions
+	to use !=.
+
+2016-11-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray.c: Adjust to read and write regexes also.
+
+2016-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* General: Remove trailing whitespace from all relevant files.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-07-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace.c (do_inplace_begin): Flush stdout at the start to
+	try to avoid flushing problems on some obscure BSD systems.
+	* revtwoway.c (gawk_getdtablesize): Renamed from getdtablesize.
+	(getdtablesize): New macro. Avoids problems on FreeBSD 10
+	where configure didn't work correctly. Thanks to Nelson Beebe.
+	Update copyright year.
+
+2016-05-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* filefuncs.c (func_table): Update "stat" to indicate that the
+	max # of expected args is 3, not 2.
+
+2016-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (do_statvfs): Define out f_fsid on AIX.
+
+2016-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c: Add statvfs function. Undocumented for now.
+	* configure.ac: Add appropriate stuff to check for statvfs.
+	* configure, configh.in: Regenerated.
+
+2015-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add ext_custom.h so that it will be
+	included in the distribution tarballs.
+
+2015-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Make change of 2015-10-26 actually work.
+
+	* ext_custom.h: New file. Move _DEFAULT_SOURCE dance to here.
+	* configure.ac: Add call to AH_BOTTOM.
+	* configure: Regenerate.
+
+2015-11-15         Ville Skytta          <ville.skytta@iki.fi>
+
+	* fnmatch.3am, fork.3am, inplace.3am, ordchr.3am, readdir.3am,
+	readfile.3am, revoutput.3am, revtwoway.3am, rwarray.3am,
+	time.3am: Fix troff markup to avoid warnings.
+
+2015-10-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.h.in: Turn on _DEFAULT_SOURCE for very recent
+	GLIBC.  Thanks to Michal Jaegermann <michal.jnn@gmail.com>
+	for the report.
+
+2015-08-28	Daniel Richard G.	<skunk@iSKUNK.ORG>
+
+	* rwarray.c: Removed z/OS-specific code that is no longer needed due
+	to improvements in Gawk's general Autotools support.
+	* Makefile.am, configure.ac: Make use of the AC_ZOS_USS macro so
+	that this sub-project can support that platform as well.
+	* gawkfts.h, readdir.c: Use a proper platform cpp symbol to guard
+	z/OS-specific code, and eliminate the z/OS-specific use of "long"
+	inode numbers as "long long" works perfectly well there.
+
+2015-08-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* revoutput.c (init_revoutput): Don't install REVOUT if it's
+	there already. Makes the extension usable with -v.
+	* revoutput.3am: Add a BUGS section.
+
+2015-06-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* inplace.3am (BUGS): Document that ACLs are not preserved, and
+	a temporary file may be left behind if the program is killed by
+	a signal.
+
+2015-06-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* inplace.3am: Document new inplace variable to control whether
+	inplace editing is active.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Updated by autoupdate.
+
+2015-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am, filefuncs.c, inplace.3am, inplace.c:
+	Update copyright years.
+
+2015-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c: Move test for deferred variables here.
+
+2015-03-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure: Updated to libtool 2.4.6.
+
+2015-03-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace.3am (SYNOPSIS): Updated to not show the contents
+	of the extension.
+	(BUGS): Removed.
+
+2015-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace.c (do_inplace_begin): Jump through more hoops to satisfy
+	a newer version of clang.
+	* inplace.3am (BUGS): Add new section and documentation.
+
+2015-02-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add rwarray0.c to the list.
+
+2015-02-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c: Punctuation fix.
+
+2015-01-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Infrastructure updates.
+
+	Automake 1.15. Libtool 2.4.5.
+
+	* configure.ac: Remove gettext macros.
+
+2015-01-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c (var_test): Adjust for PROCINFO now being there.
+
+2015-01-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* testext.c (test_deferred): New function to help with testing
+	of deferred variable instantiation.
+	(do_get_file): Remove unused variable array.
+	(func_table): Add test_deferred.
+
+2015-01-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* testext.c (test_get_file): Fix error message.
+	(do_get_file): Implement new function providing low-level access
+	to the get_file API.
+	(func_table): Add "get_file" -> do_get_file.
+	(init_testext): If TESTEXT_QUIET has been set to a numeric value,
+	return quietly.
+
+2015-01-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* testext.c (test_get_file): The get_file hook no longer takes a
+	typelen argument.
+
+2015-01-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Remove the select extension, since it will be part of gawkextlib.
+	* select.c, siglist.h: Deleted.
+	* Makefile.am (pkgextension_LTLIBRARIES): Remove select.la.
+	(select_la_SOURCES, select_la_LDFLAGS, select_la_LIBADD): Remove.
+	(EXTRA_DIST): Remove siglist.h.
+	* configure.ac (AC_CHECK_HEADERS): Remove signal.h.
+	(AC_CHECK_FUNCS): Remove fcntl, kill, sigaction, and sigprocmask.
+
+2014-12-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Remove the errno extension, since it is now part of gawkextlib.
+	* errno.c, errlist.h: Deleted.
+	* Makefile.am (pkgextension_LTLIBRARIES): Remove errno.la.
+	(errno_la_SOURCES, errno_la_LDFLAGS, errno_la_LIBADD): Remove.
+	(EXTRA_DIST): Remove errlist.h.
+
+2014-12-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readfile.c (read_file_to_buffer): Do not waste a byte at the end of
+	a string.
+	* rwarray.c (read_value): Ditto.
+	* rwarray0.c (read_value): Ditto.
+
+2014-11-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace.c (do_inplace_begin): Jump through hoops to silence
+	GCC warnings about return value of chown.
+
+2014-11-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (do_input_fd): New function to return the input file
+	descriptor associated with a file/command.
+	(do_output_fd): New function to return the output file descriptor
+	associated with a file/command.
+	(func_table): Add new functions "input_fd" and "output_fd".
+	* testext.c (test_get_file): Do not use __func__, since it is a C99
+	feature, and gawk does not assume C99.
+
+2014-11-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* errno.c (do_errno2name, do_name2errno): Remove unused variable 'str'.
+	* select.c (do_signal): Remove unused variable 'override'.
+	(grabfd): New helper function to map a gawk file to the appropriate
+	fd for use in the arguments to selectd.
+	(do_select): get_file has 3 new arguments and returns info about both
+	the input and output buf.
+	(do_set_non_blocking): Support changes to get_file API.
+	* testext.c (test_get_file): New test function to check that extension
+	file creation via the get_file API is working.
+
+2014-11-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (set_retry): New function to set PROCINFO[<name>, "RETRY"].
+	(do_set_non_blocking): If called with a file name as opposed to a file
+	descriptor, call the set_retry function to configure PROCINFO to tell
+	io.c to retry I/O for temporary failures.
+
+2014-10-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (uninstall-so): Remove *.lib too, per suggestion
+	from Andreas Buening.
+
+2014-10-12         KO Myung-Hun          <komh78@gmail.com>
+
+	Fixes for OS/2:
+
+	* Makefile.am (uninstall-so): Remove *.dll and *.a, also.
+
+2014-10-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace.c (do_inplace_begin): Use a cast to void in front
+	of the second call to chown to avoid compiler warnings from clang.
+
+2014-09-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c: Minor edits to sync with documentation.
+	* testext.c: Add test to get PROCINFO, expected to fail.
+
+2014-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (RM): Define for makes that don't have it,
+	such as on OpenBSD.  Thanks to Jeremie Courreges-Anglas
+	<jca@wxcvbn.org> for the report.
+
+2014-06-13         Paul Gortmaker        <paul.gortmaker@windriver.com>
+
+	* Makefile.am (uninstall-so): Came across below bug while cross
+	compiling, and changed both install-data-hook and uninstall-so
+	to use $(DESTDIR) on v4.1.1 before seeing most of the fix in
+	gawk-4.1.1-3-g976f73ab0356; here we ensure uninstall-so also
+	uses the $(DESTDIR) prefix on its use of pkgextensiondir.
+
+2014-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (install-data-hook): Use $(DESTDIR) when removing
+	the .la files. Thanks to Lars Wendler <polynomial-c@gentoo.org>
+	for the report and fix.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Bump version before release.
+
+2014-04-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* time.c: Include <time.h> unconditionally to get declaration
+	of nanosleep on Linux. Avoids a warning. Thanks to Michal
+	Jaegermann.
+
+2014-03-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Remove -Wextra to avoid killing compilations
+	on older versions of gcc. Thanks to Antonio Diaz Diaz for
+	the report.
+
+2014-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add AC_HEADER_TIME and AC_HEADER_DIRENT, and
+	rearrange order of macros some. May help on older systems.
+
+2014-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readfile.c: Add an input parser that works off of
+	PROCINFO["readfile"].
+	* readfile.3am: Document same.
+
+2014-03-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkfts.c (MAXPATHLEN): Add a default definition. Thanks to
+	Antonio Diaz Dian and Nelson H.F. Beebe.
+	* readdir.c (PATH_MAX): Add a default definition. Thanks to
+	Nelson H.F. Beebe.
+
+2014-03-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* filefuncs.c (read_symlink, do_fts): Replace free with gawk_free.
+	* inplace.c (at_exit, do_inplace_end): Ditto.
+	* readdir.c (dir_close): Ditto.
+	* readfile.c (do_readfile): Ditto.
+	* revtwoway.c (close_two_proc_data): Ditto.
+	* rwarray.c (read_elem): Replace realloc with gawk_realloc.
+	(read_value): Replace malloc and free with gawk_malloc and gawk_free.
+	* testext.c (try_modify_environ): Replace free with gawk_free.
+
+2014-02-12         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* time.c: Better hack for nanosleep bug based on feedback from HP.
+
+2013-12-29         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* filefuncs.c: Fix compile on VMS.
+	* time.c: Fix compile on VMS.
+
+2013-12-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkfts.c: Wrap include of <sys/param.h> in HAVE_SYS_PARAM_H,
+	as I should have done to start with.  For VMS.
+
+2013-12-29         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawkdirfd.h: Adjust include for VMS.
+	* filefuncs.c: Make it compile on VMS.
+	* fnmatch.c: Make it compile on VMS.
+
+2013-12-21         Mike Frysinger        <vapier@gentoo.org>
+
+	* configure.ac: Remove MirBSD and OS/390 hack to create
+	do-nothing Makefile. Should be handled by configure in the
+	parent directory.
+
+2013-12-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure, aclocal.m4: Updated to automake 1.13.4 and
+	libtool 2.4.2.418.
+
+2013-11-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (uninstall-so, uninstall-recursive): Remove the
+	.so files. Keeps make distcheck happy.
+
+2013-11-17  Dmitry V. Levin  <ldv@altlinux.org>
+
+	* Makefile.am (dist_man_MANS): Add inplace.3am.
+
+2013-10-23  Michael Haubenwallner <michael.haubenwallner@salomon.at>
+
+	Fix portability for AIX.
+
+	* inplace.c (_XOPEN_SOURCE): Define when not defined yet.
+	(_XOPEN_SOURCE_EXTENDED): Ditto. Needs to define a number.
+
+2013-08-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Clean up some warnings from -Wextra.
+
+	* gawkfts.c (fts_set): Add cast to void for sp.
+	* inplace.c (at_exit): Add cast to void for data and exit_status.
+	* readdir.c (ftype): Add cast to void for dirname.
+	(dir_get_record): Assign NULL to *rt_start.
+	* revtwoway.c (rev2way_get_record): Add cast to void for errcode.
+	(rev2way_fwrite): Add cast to void for fp.
+	(rev2way_take_control_of): Add cast to void for name.
+	* testext.c (test_array_param, test_scalar, test_scalar_reserved,
+	test_indirect_vars): Add cast to void for nargs.
+
+2013-08-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkdirfd.h: Include ../nonposix.h to get FAKE_FD_VALUE.
+
+2013-08-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c: Change _WIN32 to __MINGW32__ globally, per
+	Eli Zaretskii.
+
+2013-08-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (do_fts): Add a version for _WIN32 that prints a
+	"not supported" fatal message.  This is slightly better than the
+	"fts not found" which is otherwise produced.
+
+2013-07-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkdirfd.h (FAKE_FD_VALUE): Move definition up in the file to give
+	clean compile on MinGW.
+
+2013-07-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac (AC_CHECK_FUNCS): Check for fcntl.
+	* select.c (set_non_blocking): Check that fcntl and O_NONBLOCK are
+	available.
+
+2013-07-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (signal_handler): On platforms lacking sigaction, reset
+	the signal handler each time a signal is trapped to protect in case
+	the system resets it to default.
+
+2013-07-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (signal_result): New function to set result string from
+	signal function and detect when we need to roll back.
+	(do_signal): Now takes an optional 3rd override argument.  Instead
+	of returning -1 or 0, we now return information about the previously
+	installed signal handler: default, ignore, trap, or unknown.  An
+	empty string is returned on error.  If it is an unknown handler,
+	and override is not non-zero, we roll back the handler and return "".
+
+2013-07-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (set_non_blocking): Do not attempt F_SETFL if F_GETFL fails.
+	(do_set_non_blocking): Add support for case when called with a single
+	"" argument.
+
+2013-07-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (do_signal): If sigaction is unavailable, fall back to
+	signal and hope that it does the right thing.
+
+2013-07-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac (AC_CHECK_FUNCS): Add kill and sigprocmask.
+	* select.c (get_signal_number): Change error messages since now may
+	be called by "kill" as well as "select_signal".
+	(do_signal): Add a lint warning if there are more than 2 args.
+	(do_kill): Add new function to send a signal.
+	(do_select): Support platforms where sigprocmask is not available.
+	There will be a race condition on such platforms, but that is not
+	easily avoided.
+
+2013-07-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (do_select): Now that the API flatten_array call has been
+	patched to ensure that the index values are strings, we can remove
+	the code to check for the AWK_NUMBER case.
+
+2013-07-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (do_select): Do not treat a numeric command value as a
+	file descriptor unless the command type is empty.
+
+2013-07-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add errlist.h and siglist.h.
+
+2013-07-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (set_non_blocking): New helper function to call fcntl.
+	(do_set_non_blocking): Add support for the case where there's a single
+	integer fd argument.
+
+2013-07-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* select.c (do_set_non_blocking): Implement new set_non_blocking
+	function.
+	(func_table): Add set_non_blocking.
+
+2013-07-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* errlist.h: New file containing a list of all the errno values I could
+	find.
+	* errno.c: Implement a new errno extension providing strerror,
+	errno2name, and name2errno.
+	* Makefile.am (pkgextension_LTLIBRARIES): Add errno.la.
+	(errno_la_SOURCES, errno_la_LDFLAGS, errno_la_LIBADD): Build new errno
+	extension.
+	* select.c (ext_version): Fix version string.
+	* siglist.h: Update to newest glibc version.
+
+2013-07-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* siglist.h: New file copied from glibc to provide a mapping between
+	signal number and name.
+	* select.c: Add a new "select_signal" function and provide support
+	for trapping signals.
+	(do_select): Add support for a 5th argument to contain an array
+	of returned signals.  Improve the argument processing, and add
+	better warning messages.
+
+2013-06-30         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (pkgextension_LTLIBRARIES): Add select.la.
+	(select_la_SOURCES, select_la_LDFLAGS, select_la_LIBADD): Build new
+	select extension.
+	* configure.ac (AC_CHECK_HEADERS): Add signal.h.
+	(AC_CHECK_FUNCS): Add sigaction.
+	* select.c: Implement the new select extension.
+
+2013-06-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (AC_HEADER_MAJOR): New macro added.
+	Add check for limits.h header.
+	* filefuncs.c: Add the right stuff to get the major/minor macros.
+	* readdir.c: Add include of limits.h appropriately wrapped.
+
+	Thanks to ICHII Takashi <ichii386@schweetheart.jp> for the reports
+	and pointers.
+
+2013-06-01  Eli Zaretskii  <eliz@gnu.org>
+
+	* filefuncs.c [_WIN32]: Define WIN32_LEAN_AND_MEAN before
+	including windows.h.
+
+	* readdir.c [__MINGW32__]: Define WIN32_LEAN_AND_MEAN before
+	including windows.h.
+
+	* filefuncs.c [HAVE_GETSYSTEMTIMEASFILETIME]: Define
+	WIN32_LEAN_AND_MEAN before including windows.h.
+
+2013-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add <sys/param.h> header check.
+	* filefuncs.c: Include <sys/param.h> if there.
+	(device_blocksize): New function.
+	(fill_stat_array): Call it.
+
+2013-05-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (AC_STRUCT_ST_BLKSIZE): Replaced with call to
+	AC_CHECK_MEMBERS.
+	* filefuncs.c (fill_stat_array): Change test from ifdef
+	HAVE_ST_BLKSIZE to HAVE_STRUCT_STAT_ST_BLKSIZE.
+
+2013-05-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkdirfd.h [FAKE_FD_VALUE]: Copied here from ../gawkapi.h.
+
+2013-05-16         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (install-data-hook): Remove .la files installed by
+	Automake.  Leaves less clutter, if not (yet) less noise.
+
+2013-05-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (fill_stat_array): For _WIN32 use a blocksize of
+	4096 for the "blksize" element, per Eli Zaretskii.
+
+	* configure.ac [AC_STRUCT_ST_BLKSIZE]: Add call that was missing.
+	ARGH!!!!
+
+2013-05-14  Eli Zaretskii  <eliz@gnu.org>
+
+	* rwarray.c [__MINGW32__]: Include winsock2.h instead of
+	arpa/inet.h.
+
+	* readdir.c [__MINGW32__]: Include windows.h.
+	Include gawkapi.h before gawkdirfd.h, since the former defines
+	FAKE_FD_VALUE needed by the latter.
+	(ftype): Accept an additional argument, the directory that is
+	being read.  Callers changed.
+	[!DT_BLK]: Produce the file's type by calling 'stat' on it, if the
+	dirent structure doesn't provide that.
+	(get_inode): New function, to produce inode values on MS-Windows.
+	(dir_get_record): Use it.
+
+	* inplace.c (chown, link) [__MINGW32__]: Redirect to existing
+	library functions.
+	(mkstemp) [__MINGW32__]: New function, for MinGW, which doesn't
+	have it in its library.
+	(do_inplace_end) [__MINGW32__]: Remove the old file before
+	renaming the new, since 'rename' on Windows cannot overwrite
+	existing files.
+
+	* gawkdirfd.h (ENOTSUP): Define to ENOSYS if not already defined.
+	(DIR_TO_FD): If not defined yet, define to FAKE_FD_VALUE.
+
+	* filefuncs.c (get_inode) [_WIN32]: New function, produces the
+	file index used on Windows as its inode.
+	(fill_stat_array) [_WIN32]: Use it.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Update copyright.
+	For z/OS: If uname output is OS/390, just blast the Makefile,
+	same as for MirBSD.
+
+2013-04-17         Corinna Vinschen      <vinschen@redhat.com>
+
+	* Makefile.am (MY_LIBS): Use $(LTLIBINTL) since we use libtool,
+	not LIBINTL.
+
+2013-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c, fnmatch.c, fork.c, ordchr.c, readdir.c, readfile.c,
+	revoutput.c, revtwoway.c, rwarray.c, rwarray0.c, stack.c, stack.h,
+	testext.c, time.c: Update copyright year.
+
+	Update to automake 1.13.1:
+
+	* configure, Makefile.in, aclocal.m4: Regenerated.
+
+2013-03-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkdirfd.h: Improve test for doing own dirfd function. Needed
+	for IRIX.
+
+2013-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add AC_OUTPUT_COMMANDS that drops in a do-nothing
+	Makefile for MirBSD, since the extensions can't be built on MirBSD.
+	* configure: Regenerated.
+	* Makefile.am (check-for-shared-lib-support): Update comment some.
+	* gawkfts.c (MAX): Provide for systems that don't (Solaris).
+
+2013-03-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (fill_stat_array): Adjust computation for block
+	count for WIN32 systems after consultation with Eli Zaretskii.
+
+2013-02-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (check-recursive, all-recursive): Make dependant upon
+	check-for-shared-lib-support.
+	(check-for-shared-lib-support): New target. If gawk doesn't have the
+	API built-in, don't try to build.
+
+2013-02-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fnmatch.c: Pull in versions of C routine from missing_d
+	if the native system doesn't provide them.
+
+2013-02-11         Eli Zaretskii	<eliz@gnu.org>
+
+	* filefuncs.c (S_ISLNK, lstat, readlink, S_IRGRP, S_IWGRP, S_IXGRP,
+	S_IROTH, S_IWOTH, S_IXOTH, S_ISUID, S_ISGID, S_ISVTX, major, minor):
+	Define if needed.
+	(fill_stat_array, init_filefuncs, func_table): Fix for Win 32.
+	* time.c: Port to Win 32.
+
+2013-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkdirfd.h: New file.
+	* Makeile.am (filefuncs_la_SOURCES, readdir_la_SOURCES): Use it.
+	* gawkfts.c, readdir.c: Include gawkdirfd.h.
+	* configure.ac (AC_USE_SYSTEM_EXTENSIONS): Added.
+	(GAWK_FUNC_DIRFD, GAWK_PREREQ_DIRFD): New calls.
+	(.developing): Fix check.
+	* alocal.m4: Updated.
+	* configure: Regenerated.
+	* gawkdirfd.h: Fixed for Mac OS X also.
+
+2013-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkfts.c: Make include of <limits.h> be unconditional.
+
+2013-01-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Improve portability. We hope.
+
+	* gawkfts.c (S_ISREG): Define macro if not defined.
+	(_BSD_SOURCE): Define for use with c99 compiler driver.
+	* inplace.c (S_ISREG): Define macro if not defined.
+	(_XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED): Define for use with c99
+	compiler driver.
+	* filefuncs.c (_BSD_SOURCE): Define for use with c99 compiler driver.
+	* readfile.c (_BSD_SOURCE): Define for use with c99 compiler driver.
+	* revtwoway.c (_BSD_SOURCE): Define for use with c99 compiler driver.
+
+2013-01-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readfile.c (do_readfile): Free `text' if read fails. Thanks to
+	cppcheck.
+	* inplace.c (do_inplace_begin): Check chown return value in an if
+	to shut up compiler warning.
+
+2013-01-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace.3am: New file.
+	* filefuncs.3am, fnmatch.3am, fork.3am, ordchr.3am, readdir.3am,
+	readfile.3am, revoutput.3am, revtwoway.3am, rwarray.3am,
+	time.3am: Update copyright dates, add reference to inplace(3am).
+
+	* inplace.c (do_inplace_begin): Remove unused variable `p'.
+
+2013-01-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* inplace.c (do_inplace_begin): No need to get the 2nd suffix argument,
+	since it is not currently used in this function.
+
+2013-01-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* inplace.c: New extension to implement in-place editing.
+	* Makefile.am: Add inplace extension.
+
+2012-12-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.3am, fnmatch.3am: Predefined variables are no
+	longer constants.
+	* filefuncs.c (init_filefuncs): Use sym_update() instead of
+	sym_constant().
+	* fnmatch.c (init_fnmatch): Ditto.
+	* testext.c (init_testext): Ditto.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-12-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c (test_indirect_vars): New test and awk code.
+
+2012-12-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add README.fts.
+
+2012-11-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c readdir.c, revoutput.c, revtwoway.c, rwarray.c,
+	rwarray0.c, testext.c: Use awk_true and awk_false instead of 1 and 0.
+
+2012-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* bindarr.c, fileop.c, sparr.c: Make them compile.
+	* steps: Reinstated and updated.
+	* testsparr.awk: Add call to extension().
+
+2011-05-03         John Haque     <j.eh@mchsi.com>
+
+	* fileop.c, record.awk, testrecord.sh: New files.
+	* steps: Updated.
+
+2011-05-02         John Haque     <j.eh@mchsi.com>
+
+	* bindarr.c, dbarray.awk, testdbarray.awk: New files.
+	* steps: Updated.
+
+2011-04-24         John Haque     <j.eh@mchsi.com>
+
+	* spec_array.c, spec_array.h, sparr.c, testsparr.awk: New files.
+	* steps: Updated.
+
+2012-11-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (do_stat): Optional third argument indicates to
+	use stat(2) instead of lstat(2).
+	* filefuncs.3am: Document same.
+
+2012-11-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c: Simplify code to always print file type and not
+	use stat().
+	* readdir.3am: Document same.
+
+2012-11-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c: In awk code, use printf(...) instead of the form
+	without parentheses everywhere. This makes Nelson happy.
+
+2012-11-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	Bug fix for filesystems without d_type in directory entry.
+
+	* readdir.c (open_directory_t): Add more fields for path.
+	(ftype): Take open_directory_t argument. Build the full path
+	for lstat. Adjust calls.
+	(dir_close): Free the storage.
+	(dir_take_control_of): Allocate storage for the path.
+
+2012-11-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Add check for $srcdir/.developing as in
+	the main directory's configure.ac.
+
+2012-11-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray.3am: Minor edits.
+
+2012-10-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dist_man_MANS): Update the list.
+
+2012-10-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* revtwoway.3am: Clean up example.
+	* revtwoway.c: Minor cleanup (add translation calls).
+
+2012-10-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* revtwoway.3am: New file.
+
+2012-10-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (do_stat): Always clear the array.
+
+2012-10-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c, revoutput.c, revtwoway.c: Adjust for name change
+	of IOBUF_PUBLIC to awk_input_buf_t. Additional sanitizing in
+	revoutput.c to use `revoutput' everywhere instead of `revout'.
+	* revoutput.3am: New file.
+	* filefuncs.3am, fnmatch.3am, fork.3am, ordchr.3am, readdir.3am,
+	readfile.3am, rwarray.3am, time.3am: Add ref to revoutput(3am).
+
+2012-10-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* textext.c (try_modify_environ): Save array cookie in a separate
+	variable so it isn't clobbered. Thanks to Andrew Schorr, by way
+	of valgrind, for finding the bug.
+
+2012-09-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c (try_modify_environ): New function and test.
+	(var_test): Modified ARGC test, added additional.
+	(test_scalar_reserved): New function and test.
+	(try_modify_environ): Don't print count of ENVIRON elements.
+
+2012-09-13         Dave Pitts            <dpitts@cozx.com>
+
+	* gawkfts.c: Add defines and ifdefs for z/OS.
+	* gawkfts.h: Add defines and ifdefs for z/OS. Fix // comments.
+	* readdir.c (dir_get_record): Adjust sprintf format for z/OS.
+	* rwarray.c: Add defines and ifdefs for z/OS. Fix // comments.
+
+2012-09-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c (do_readdir_do_ftype): Set ERRNO for bad arguments.
+	* readdir.3a: Document same, minor fixes.
+
+2012-09-07         Akim Demaille         <akim@lrde.epita.fr>
+
+	* extension/gawkfts.h (__THROW): Define if it is not.
+	Copied from getopt.h.
+	* extension/gawkfts.c (fts_alloc): Since FTSENT.fts_statp is
+	defined as a struct stat*, use that type for casts instead of
+	the undefined __fts_stat_t type.
+
+2012-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c, readdir.3am: Change argument to readdir_do_ftype()
+	to be a string. Update the doc accordingly.
+	* gawkfts.h: Add explanatory comment before defines of API
+	names towards the end. Thanks to Eli Zaretskii for the suggestion.
+
+2012-08-28         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir.c: Have three states, 0, 1, 2 for never, fallback, and
+	always.
+	* readdir.3am: Adjust appropriately.
+
+2012-08-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Make fts work everywhere by using our own source.
+
+	* README.fts, gawkfts.c, gawkfts.h, fts.3: New files.
+	* Makefile.am (filefuncs_la_SOURCES, EXTRA_DIST): Adjust.
+	* configure.ac: Remove check for fts.h and fts_XXX functions.
+	* filefuncs.c: Remove various ifdefs, change includes around.
+
+2012-08-28         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am: Rename man_MANS to dist_man_MANS to include the man
+	pages in the distribution tarball.
+
+2012-08-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac (AC_SYS_LARGEFILE): Added. Needed for consistency
+	with gawk, to get the same size struct stat everywhere.
+	* filefuncs.c, fnmatch.c, fork.c, ordchr.c, readdir.c, readfile.c,
+	revoutput.c, revtwoway.c, rwarray.c, rwarray0.c, testext.c,
+	time.c: Move include of config.h to top (or add it!)
+
+2012-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c, fnmatch.c, fork.c, ordchr.c, readdir.c, readfile.c,
+	revoutput.c, revtwoway.c, rwarray.c, rwarray0.c, testext.c,
+	time.c: Add ext_version string.
+
+2012-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* revoutwoway.c: New testing extension for two way processor.
+	* Makefile.am: Build revtwoway extension.
+	* readdir.c: Fix to fall back to stat if d_type is 'u' and
+	do_ftype is one.
+	* readdir.3am: Revise doc that some GNU/Linux filesystems
+	don't support d_type.
+
+2012-08-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* revoutput.c: New testing extension for output wrapper.
+	* Makefile.am: Build revoutput extension.
+
+2012-08-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Add fts() to filefuncs.
+
+	* filefuncs.3am: Update doc.
+	* filefuncs.c: Lots of new code.
+	* configure.ac: Add checks for appropriate headers and functions.
+	* stack.h, stack.c: New files.
+	* Makefile.am: Update list of files.
+
+	* readdir.c (dir_can_take_file): Use members in iobuf.
+	* rwarray.c (do_writea): Initialize fp to NULL.
+
+	* filefuncs.3am, fnmatch.3am, fork.3am, ordchr.3am, readdir.3am,
+	readfile.3am, rwarray.3am, time.3am: Updated.
+
+2012-08-03         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir.c (dir_get_record): Fix for systems where ino_t is
+	64 bit even on 32 bit systems (cygwin).
+
+2012-08-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (man_MANS): Add man page files so that they
+	get installed.
+	* rwarray.3am: New file.
+	* fnmatch.3am, fork.3am, time.3am: Revised.
+
+2012-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray0.c: Renamed from rwarray.c.
+	* rwarray.c: New file using stdio instead of system calls,
+	works on cygwin.
+
+2012-07-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ABOUT-NLS: New file.
+	* Makefile.am, configure.ac: Revised for gettext.
+
+	* fork.3am, readdir.3am, time.3am: New files.
+	* filefuncs.3am, fnmatch.3am, ordchr.3am, readfile.3am: Revised.
+
+2012-07-29         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir.c (dir_get_record): Adjust to new interface for RT.
+
+2012-07-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c (dir_take_control_of): Print error message and
+	set ERRNO if failure. Adjust count of max digits.
+
+2012-07-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (*_la_LIBADD): Need to link with $(LIBINTL) for
+	gettext to work on platforms where it is not included in libc.
+
+2012-07-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir.c (dir_get_record): Need to set errno to 0 before calling
+	readdir, since readdir sets errno only on failure, not on EOF.
+
+2012-07-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir.c (dir_get_record): If readdir fails, set errcode.  Otherwise,
+	don't bother to set errcode.
+
+2012-07-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c (dir_take_control_of): Fix typo for case where
+	we don't have fopendir (e.g., Mac OS X 10.5).
+
+2012-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* configure.ac: Extremely crude hack to get the value of
+	ENABLE_NLS so that gettext will work in extensions.
+
+	* readdir.c (dir_get_record): Call set_RT.
+	(dir_can_take_file): Make parameter const.
+
+	* testext.c (valrep2str): Add AWK_VALUE_COOKIE.
+
+	* readdir.c: Add readdir_do_ftype function for systems without
+	dirent->d_type.  Clean up buffer handling.
+
+2012-07-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir.c (dir_get_record): No need to set *errcode to 0.
+	(dir_take_control_of): Remove some paranoia -- no need to test for
+	NULL iobuf, and no need to check dir_can_take_file again.
+
+2012-07-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.c: New file.
+	* Makefile.am (readdir): New extension.
+
+	* time.c: Fix all calls to update_ERRNO_string.
+
+	* filefuncs.c, fnmatch.c, fork.c, ordchr.c, readfile.c, rwarray.c,
+	time.c: Translate strings.
+
+2012-07-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.3am, fnmatch.3am, ordchr.3am, readfile.3am:
+	new files.
+
+2012-07-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fnmatch.c: Simplify flag table.
+
+2012-07-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c (test_scalar): New function and new tests.
+	(init_testext): Add a new variable.
+
+2012-07-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (fill_stat_array): New function to do the work
+	for stat.
+	(do_stat): Call it.
+
+2012-07-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fnmatch.c: New file.
+	* Makefile.am: Build fnmatch extension.
+	* configure.ac: Look for fnmatch.h and fnmatch function.
+
+	* fnmatch.c (init_fnmatch): Use sym_constant for FNM_NOMATCH.
+	* testext.c (dl_load): Use sym_constant for answer_num.
+
+	* testext.c (init_testext): Move extra code to here.
+	(init_func): Change to point to init_testext.
+	(dl_load): Deleted.
+	(dl_load_func): Use the macro.
+
+2012-07-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (array_set, do_stat): Use make_const_string.
+	* fork.c (array_set_numeric): Ditto.
+	* ordchr.c (do_chr): Ditto.
+	* readfile.c (do_readfile): Use make_null_string, make_malloced_string.
+	* rwarray.c (read_elem): Ditto.
+	* testext.c (valrep2str): Add case for AWK_SCALAR.
+	(test_array_elem): Duplicate strings coming from gawk before passing
+	them back in.
+
+	All files: Add null 'init_func' file pointer for dl_load_func
+	to work.
+
+2012-07-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (do_readfile): Return "" and set ERRNO on error
+	instead of returning -1. Per suggestion from Andrew Schorr.
+
+2012-07-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (array_set): Adjust for change in set_array_element API.
+	* fork.c (array_set_numeric): Ditto.
+	* rwarray.c (read_array): Use set_array_element_by_elem.
+	(read_value): Add a cast to silence a compiler warning.
+	* testext.c (test_array_elem): Adjust for change in set_array_element
+	API.
+	(fill_in_array): Ditto. Change parameter name to new_array.
+
+2012-06-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ordchr.c (do_ord, do_chr): Improve argument checking and
+	lint messages.
+
+2012-06-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Remove *.awk.
+	* rwarray.awk: Moved to test directory.
+
+2012-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Enable rwarray extension.
+	* rwarray.c: Redone to use new API.
+	* rwarray.awk: Revamped for new version.
+
+2012-06-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c (test_array_elem): Add a subarray.
+	(test_array_flatten): Removed: Tests done elsewhere.
+
+2012-06-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c (fill_in_array): New function.
+	(create_new_array): Most code moved into fill_in_array.
+	(test_array_param): New function.
+
+2012-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c (dump_array_and_delete): Renamed from dump_array.
+	Get second parameter which is index to delete. Update awk test.
+
+2012-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (do_chdir): Change element use to match change types.
+	* fork.c (array_set_numeric): Ditto.
+	* testext.c (valrep2str): New function.
+	(test_array_elem): Add AWK_UNDEFINED for `wanted'. Use valrep2str.
+	Adjust use of element index.
+	(dump_array): Renamed from `dump_procinfo' and implemented.
+	(func_table): Updated.
+
+2012-06-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (do_chdir, do_stat): Add assert(result != NULL).
+	* fork.c (do_fork, do_waitpid, do_wait): Ditto.
+	* ordchr.c (do_ord, do_chr): Ditto.
+	* readfile.c (do_readfile): Ditto.
+	* time.c (do_gettimeofday, do_sleep): Ditto.
+	* testext.c (All functions): Ditto. Clean up initial testing and use
+	make_number to make default return value up front.
+	(create_new_array, test_array_flatten): New functions.
+	(test_array_elem): Implemented.
+	(at_exit1): Don't printa actual pointer value: not portable.
+	(dl_load): Load up an array also.
+
+2012-06-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* time.c (RETURN): Remove obsolete define.
+	(do_sleep): Change update_ERRNO_str argument to request translation.
+
+2012-06-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Revise API:
+
+	* filefuncs.c (do_chdir): Replace get_curfunc_param with get_argument.
+	(format_mode): Use unsigned masks.
+	(do_stat): Replace get_curfunc_param with get_argument.
+	* fork.c (do_fork): Rearrange arg order in call to sym_lookup
+	(do_waitpid): Replace get_curfunc_param with get_argument.
+	* ordchr.c (do_ord, do_chr): Replace get_curfunc_param with get_argument.
+	* readfile.c (do_readfile): Replace get_curfunc_param with get_argument.
+	* time.c (do_sleep): Replace get_curfunc_param with get_argument.
+	Replace set_ERRNO with update_ERRNO_str for no way to sleep case.
+
+	Work on testext.c:
+
+	* Makefile.am: Add stuff to make testext. Remove doit and steps
+	from EXTRA_DIST.
+	* testext.c: Fill in many of the test routines. Still more to do.
+	Fix up test scripts for each routine.
+	* time.c (do_sleep): Fix use of get_argument to be boolean.
+
+2012-06-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am: Add time extension.
+	* configure.ac: To support time extension, check for some headers
+	and functions that are needed.
+	* time.c: New file implementing sleep and gettimeofday.
+
+2012-06-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am: Remove comment referring to deleted test extensions
+	arrayparm, dl (zaxxon) and testarg.
+
+2012-06-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* arrayparm.c, dl.c, doit, foo.awk, steps, testarg.awk, testarg.c,
+	testarrayparm.awk, testff.awk, testfork.awk, testordchr.awk: Remove
+	unused (obsolete) files.
+
+2012-06-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (do_stat): Make `type' const char *.
+
+	* testext.c: Functions renamed, some of them filled in. Corresponding
+	awk code for each test added inline.
+
+2012-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.c: New file. Outline of tests for extension API.
+
+2012-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c: Further cleanup and condensation of code into tables.
+	* fork.c, ordchr.c, readfile.c: Update copyright, general cleanup.
+
+2012-05-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.c (array_set_numeric): Don't return a value from
+	a void function.
+
+2012-05-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (AM_CPPFLAGS): Use $(srcdir) to work properly when
+	built outside the source directory.
+	* configure.ac (INSTALL): Set location manually since autoconf was
+	not specifying the proper path for install-sh.
+	* filefuncs2.c, ordchr2.c, readfile2.c: Deleted.
+	* filefuncs.c: Install filefuncs2.c and patch for recent API changes.
+	* ordchr.c: Install ordchr2.c and patch for recent API changes.
+	* readfile.c: Install readfile2.c and patch for recent API changes.
+	* fork.c: Port to new API.
+
+2012-05-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* configure.ac: New file to run configure with libtool support
+	in this subdirectory.
+	* Makefile.am: Some changes related to running automake in this
+	directory.
+	* AUTHORS, COPYING, INSTALL, NEWS, README: Added files to make automake
+	happy.
+	* aclocal.m4, configure, configh.in: Added autoconf files.
+	* build-aux, m4: New subdirectories for autoconf stuff.
+
+2012-05-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs2.c: New file implementing chdir and stat using the
+	new interface.
+
+	Everything else is temporarily broken.
+
+2012-05-13         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* filefuncs.c (array_set): Add a comment discussing the use of unref
+	on the value returned by assoc_lookup.
+
+2012-05-13         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* xreadlink.[ch]: Remove unused files.
+
+2012-05-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Sweeping change: Use `bool', `true', and `false' everywhere.
+
+2012-04-11         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* filefuncs.c (array_set): New function to set an array element.
+	(do_set): Use new array_set function to reduce code duplication and
+	to make sure the memory management is handled properly.
+
+2012-04-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* filefuncs.c: Remove unnecessary #include <sys/sysmacros.h>.
+	(read_symlink): New function to read symbolic links more robustly.
+	(do_stat): Use read_symlink instead of readlink.
+	* fork.c (do_wait): new function.
+	(dlload): Call make_builtin to add "wait" function.
+
+2012-04-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* fork.c (do_fork): Test whether PROCINFO_node exists before updating
+	the pid values.  And do so properly using make_number.
+	* readfile.c (do_readfile): Function should be static.
+
+2012-04-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* filefuncs.c (do_chdir, do_stat): Replace update_ERRNO() with
+	update_ERRNO_int(errno).
+	* fork.c (do_fork, do_waitpid): Ditto.
+	* readfile.c (do_readfile): Ditto.
+	* rwarray.c (do_writea, do_reada): Ditto.
+
+2012-03-25         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am: Major cleanup.  Use libtool options -module and
+	-avoid-version to create the modules properly without my local hack
+	to override the default behavior.
+
+2012-03-25         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* .gitignore: New file to ignore files created by libtool (including
+	binaries and associated metadata).
+
+2012-03-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (INCLUDES): Remove -I$(top_srcdir)/intl.
+
+2012-03-20         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am: New file to build and install shared libraries.
+	* arrayparm.c (do_mkarray): Get it to compile by removing 2nd arg
+	to assoc_clear.
+	* filefuncs.c (do_stat): Ditto.
+
+2011-08-31         John Haque     <j.eh@mchsi.com>
+
+	* arrayparm.c, filefuncs.c, fork.c, ordchr.c, readfile.c,
+	rwarray.c, testarg.c: Updated.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/extension/INSTALL b/gawk-5.0.1/extension/INSTALL
new file mode 100644
index 00000000000..2099840756e
--- /dev/null
+++ b/gawk-5.0.1/extension/INSTALL
@@ -0,0 +1,370 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
+Inc.
+
+   Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.  This file is offered as-is,
+without warranty of any kind.
+
+Basic Installation
+==================
+
+   Briefly, the shell command `./configure && make && make install'
+should configure, build, and install this package.  The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.  Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below.  The lack of an optional feature in a given package is not
+necessarily a bug.  More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+   The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.
+
+     Running `configure' might take a while.  While running, it prints
+     some messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package, generally using the just-built uninstalled binaries.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.  When installing into a prefix owned by root, it is
+     recommended that the package be configured and built as a regular
+     user, and only the `make install' phase executed with root
+     privileges.
+
+  5. Optionally, type `make installcheck' to repeat any self-tests, but
+     this time using the binaries in their final installed location.
+     This target does not install anything.  Running this target as a
+     regular user, particularly if the prior `make install' required
+     root privileges, verifies that the installation completed
+     correctly.
+
+  6. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+  7. Often, you can also type `make uninstall' to remove the installed
+     files again.  In practice, not all packages have tested that
+     uninstallation works correctly, even though it is required by the
+     GNU Coding Standards.
+
+  8. Some packages, particularly those that use Automake, provide `make
+     distcheck', which can by used by developers to test that all other
+     targets like `make install' and `make uninstall' work correctly.
+     This target is generally not run by end users.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you can use GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.  This
+is known as a "VPATH" build.
+
+   With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory.  After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+   On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor.  Like
+this:
+
+     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+                 CPP="gcc -E" CXXCPP="g++ -E"
+
+   This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+   By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc.  You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.  In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+   The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+   The first method involves providing an override variable for each
+affected directory.  For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'.  Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated.  The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the `DESTDIR' variable.  For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names.  The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters.  On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+   Some packages offer the ability to configure how verbose the
+execution of `make' will be.  For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
+Particular systems
+==================
+
+   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+   HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved.  Use GNU `make'
+instead.
+
+   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
+a workaround.  If GNU CC is not installed, it is therefore recommended
+to try
+
+     ./configure CC="cc"
+
+and if that doesn't work, try
+
+     ./configure CC="cc -nodtk"
+
+   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
+directory contains several dysfunctional programs; working variants of
+these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
+in your `PATH', put it _after_ `/usr/bin'.
+
+   On Haiku, software installed for all users goes in `/boot/common',
+not `/usr/local'.  It is recommended to use the following options:
+
+     ./configure --prefix=/boot/common
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS
+     KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf limitation.  Until the limitation is lifted, you can use
+this workaround:
+
+     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+     Print a summary of the options unique to this package's
+     `configure', and exit.  The `short' variant lists options used
+     only in the top level, while the `recursive' variant lists options
+     also present in any nested packages.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+     Use DIR as the installation prefix.  *note Installation Names::
+     for more details, including other options available for fine-tuning
+     the installation locations.
+
+`--no-create'
+`-n'
+     Run the configure checks, but stop before creating any output
+     files.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
diff --git a/gawk-5.0.1/extension/Makefile.am b/gawk-5.0.1/extension/Makefile.am
new file mode 100644
index 00000000000..f8be8d2b691
--- /dev/null
+++ b/gawk-5.0.1/extension/Makefile.am
@@ -0,0 +1,157 @@
+#
+# extension/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 1995-2006, 2012-2015, 2017 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+## Process this file with automake to produce Makefile.in.
+
+AM_CPPFLAGS = -I$(srcdir)/..
+
+# This variable insures that aclocal runs
+# correctly after changing configure.ac
+ACLOCAL_AMFLAGS = -I m4 -I ../m4
+
+# For some make's, e.g. OpenBSD, that don't define this
+RM = rm -f
+
+# Note: rwarray does not currently compile.
+
+pkgextension_LTLIBRARIES =	\
+	filefuncs.la	\
+	fnmatch.la	\
+	fork.la		\
+	inplace.la	\
+	intdiv.la	\
+	ordchr.la	\
+	readdir.la	\
+	readfile.la	\
+	revoutput.la	\
+	revtwoway.la	\
+	rwarray.la	\
+	time.la
+
+noinst_LTLIBRARIES =	\
+	readdir_test.la	\
+	testext.la
+
+MY_MODULE_FLAGS = -module -avoid-version -no-undefined
+# On Cygwin, gettext requires that we link with -lintl 
+MY_LIBS = $(LTLIBINTL)
+
+filefuncs_la_SOURCES  = filefuncs.c stack.h stack.c gawkfts.h \
+			gawkfts.c gawkdirfd.h
+filefuncs_la_LDFLAGS  = $(MY_MODULE_FLAGS)
+filefuncs_la_LIBADD   = $(MY_LIBS)
+
+fnmatch_la_SOURCES    = fnmatch.c
+fnmatch_la_LDFLAGS    = $(MY_MODULE_FLAGS)
+fnmatch_la_LIBADD     = $(MY_LIBS)
+
+fork_la_SOURCES       = fork.c
+fork_la_LDFLAGS       = $(MY_MODULE_FLAGS)
+fork_la_LIBADD        = $(MY_LIBS)
+
+inplace_la_SOURCES    = inplace.c
+inplace_la_LDFLAGS    = $(MY_MODULE_FLAGS)
+inplace_la_LIBADD     = $(MY_LIBS)
+
+# On Cygwin, intdiv has to be linked with the MPFR and GMP libraries.
+# Solaris in addition wants the math library.
+intdiv_la_SOURCES     = intdiv.c
+intdiv_la_LDFLAGS     = $(MY_MODULE_FLAGS)
+intdiv_la_LIBADD      = $(MY_LIBS) $(LIBMPFR) -lm
+
+ordchr_la_SOURCES     = ordchr.c
+ordchr_la_LDFLAGS     = $(MY_MODULE_FLAGS)
+ordchr_la_LIBADD      = $(MY_LIBS)
+
+readdir_la_SOURCES    = readdir.c gawkdirfd.h
+readdir_la_LDFLAGS    = $(MY_MODULE_FLAGS)
+readdir_la_LIBADD     = $(MY_LIBS)
+
+readfile_la_SOURCES   = readfile.c
+readfile_la_LDFLAGS   = $(MY_MODULE_FLAGS)
+readfile_la_LIBADD    = $(MY_LIBS)
+
+revoutput_la_SOURCES  = revoutput.c
+revoutput_la_LDFLAGS  = $(MY_MODULE_FLAGS)
+revoutput_la_LIBADD   = $(MY_LIBS)
+
+revtwoway_la_SOURCES  = revtwoway.c
+revtwoway_la_LDFLAGS  = $(MY_MODULE_FLAGS)
+revtwoway_la_LIBADD   = $(MY_LIBS)
+
+rwarray_la_SOURCES    = rwarray.c
+rwarray_la_LDFLAGS    = $(MY_MODULE_FLAGS)
+rwarray_la_LIBADD     = $(MY_LIBS)
+
+time_la_SOURCES       = time.c
+time_la_LDFLAGS       = $(MY_MODULE_FLAGS)
+time_la_LIBADD        = $(MY_LIBS)
+
+# N.B. Becaues we are not installing testext, we must specify -rpath in
+# LDFLAGS to get automake to build a shared library, since it needs
+# an installation path.
+testext_la_SOURCES    = testext.c
+testext_la_LDFLAGS    = $(MY_MODULE_FLAGS) -rpath /foo
+testext_la_LIBADD     = $(MY_LIBS)
+
+# N.B. Because we are not installing readdir_test, we must specify -rpath in
+# LDFLAGS to get automake to build a shared library, since it needs
+# an installation path.
+readdir_test_la_SOURCES = readdir_test.c
+readdir_test_la_LDFLAGS = $(MY_MODULE_FLAGS) -rpath /foo
+readdir_test_la_LIBADD  = $(MY_LIBS)
+
+install-data-hook:
+	for i in $(pkgextension_LTLIBRARIES) ; do \
+		$(RM) $(DESTDIR)$(pkgextensiondir)/$$i ; \
+	done
+
+# Keep the uninstall check working:
+uninstall-so:
+	$(RM) $(DESTDIR)$(pkgextensiondir)/*.so
+	$(RM) $(DESTDIR)$(pkgextensiondir)/*.dll
+	$(RM) $(DESTDIR)$(pkgextensiondir)/*.a
+	$(RM) $(DESTDIR)$(pkgextensiondir)/*.lib
+
+uninstall-recursive: uninstall-so
+
+EXTRA_DIST = build-aux/config.rpath  \
+	ChangeLog \
+	ChangeLog.0 \
+	ChangeLog.1 \
+	ext_custom.h \
+	fts.3 \
+	m4 \
+	README.fts \
+	rwarray0.c
+
+dist_man_MANS = \
+	filefuncs.3am fnmatch.3am fork.3am inplace.3am \
+	ordchr.3am readdir.3am readfile.3am revoutput.3am \
+	revtwoway.3am rwarray.3am time.3am
+
+# gettext requires this
+SUBDIRS = po 
+
+distclean-local:
+	rm -fr .deps
diff --git a/gawk-5.0.1/extension/Makefile.in b/gawk-5.0.1/extension/Makefile.in
new file mode 100644
index 00000000000..13d8ffd61f7
--- /dev/null
+++ b/gawk-5.0.1/extension/Makefile.in
@@ -0,0 +1,1385 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# extension/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 1995-2006, 2012-2015, 2017 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/../m4/arch.m4 \
+	$(top_srcdir)/../m4/mpfr.m4 $(top_srcdir)/m4/codeset.m4 \
+	$(top_srcdir)/m4/dirfd.m4 $(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkgextensiondir)" \
+	"$(DESTDIR)$(man3dir)"
+LTLIBRARIES = $(noinst_LTLIBRARIES) $(pkgextension_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1)
+filefuncs_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_filefuncs_la_OBJECTS = filefuncs.lo stack.lo gawkfts.lo
+filefuncs_la_OBJECTS = $(am_filefuncs_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+filefuncs_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(filefuncs_la_LDFLAGS) $(LDFLAGS) -o $@
+fnmatch_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_fnmatch_la_OBJECTS = fnmatch.lo
+fnmatch_la_OBJECTS = $(am_fnmatch_la_OBJECTS)
+fnmatch_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(fnmatch_la_LDFLAGS) $(LDFLAGS) -o $@
+fork_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_fork_la_OBJECTS = fork.lo
+fork_la_OBJECTS = $(am_fork_la_OBJECTS)
+fork_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(fork_la_LDFLAGS) $(LDFLAGS) -o $@
+inplace_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_inplace_la_OBJECTS = inplace.lo
+inplace_la_OBJECTS = $(am_inplace_la_OBJECTS)
+inplace_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(inplace_la_LDFLAGS) $(LDFLAGS) -o $@
+intdiv_la_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1)
+am_intdiv_la_OBJECTS = intdiv.lo
+intdiv_la_OBJECTS = $(am_intdiv_la_OBJECTS)
+intdiv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(intdiv_la_LDFLAGS) $(LDFLAGS) -o $@
+ordchr_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_ordchr_la_OBJECTS = ordchr.lo
+ordchr_la_OBJECTS = $(am_ordchr_la_OBJECTS)
+ordchr_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(ordchr_la_LDFLAGS) $(LDFLAGS) -o $@
+readdir_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_readdir_la_OBJECTS = readdir.lo
+readdir_la_OBJECTS = $(am_readdir_la_OBJECTS)
+readdir_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(readdir_la_LDFLAGS) $(LDFLAGS) -o $@
+readdir_test_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_readdir_test_la_OBJECTS = readdir_test.lo
+readdir_test_la_OBJECTS = $(am_readdir_test_la_OBJECTS)
+readdir_test_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(readdir_test_la_LDFLAGS) $(LDFLAGS) \
+	-o $@
+readfile_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_readfile_la_OBJECTS = readfile.lo
+readfile_la_OBJECTS = $(am_readfile_la_OBJECTS)
+readfile_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(readfile_la_LDFLAGS) $(LDFLAGS) -o $@
+revoutput_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_revoutput_la_OBJECTS = revoutput.lo
+revoutput_la_OBJECTS = $(am_revoutput_la_OBJECTS)
+revoutput_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(revoutput_la_LDFLAGS) $(LDFLAGS) -o $@
+revtwoway_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_revtwoway_la_OBJECTS = revtwoway.lo
+revtwoway_la_OBJECTS = $(am_revtwoway_la_OBJECTS)
+revtwoway_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(revtwoway_la_LDFLAGS) $(LDFLAGS) -o $@
+rwarray_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_rwarray_la_OBJECTS = rwarray.lo
+rwarray_la_OBJECTS = $(am_rwarray_la_OBJECTS)
+rwarray_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(rwarray_la_LDFLAGS) $(LDFLAGS) -o $@
+testext_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_testext_la_OBJECTS = testext.lo
+testext_la_OBJECTS = $(am_testext_la_OBJECTS)
+testext_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(testext_la_LDFLAGS) $(LDFLAGS) -o $@
+time_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
+am_time_la_OBJECTS = time.lo
+time_la_OBJECTS = $(am_time_la_OBJECTS)
+time_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(time_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/filefuncs.Plo \
+	./$(DEPDIR)/fnmatch.Plo ./$(DEPDIR)/fork.Plo \
+	./$(DEPDIR)/gawkfts.Plo ./$(DEPDIR)/inplace.Plo \
+	./$(DEPDIR)/intdiv.Plo ./$(DEPDIR)/ordchr.Plo \
+	./$(DEPDIR)/readdir.Plo ./$(DEPDIR)/readdir_test.Plo \
+	./$(DEPDIR)/readfile.Plo ./$(DEPDIR)/revoutput.Plo \
+	./$(DEPDIR)/revtwoway.Plo ./$(DEPDIR)/rwarray.Plo \
+	./$(DEPDIR)/stack.Plo ./$(DEPDIR)/testext.Plo \
+	./$(DEPDIR)/time.Plo
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(filefuncs_la_SOURCES) $(fnmatch_la_SOURCES) \
+	$(fork_la_SOURCES) $(inplace_la_SOURCES) $(intdiv_la_SOURCES) \
+	$(ordchr_la_SOURCES) $(readdir_la_SOURCES) \
+	$(readdir_test_la_SOURCES) $(readfile_la_SOURCES) \
+	$(revoutput_la_SOURCES) $(revtwoway_la_SOURCES) \
+	$(rwarray_la_SOURCES) $(testext_la_SOURCES) $(time_la_SOURCES)
+DIST_SOURCES = $(filefuncs_la_SOURCES) $(fnmatch_la_SOURCES) \
+	$(fork_la_SOURCES) $(inplace_la_SOURCES) $(intdiv_la_SOURCES) \
+	$(ordchr_la_SOURCES) $(readdir_la_SOURCES) \
+	$(readdir_test_la_SOURCES) $(readfile_la_SOURCES) \
+	$(revoutput_la_SOURCES) $(revtwoway_la_SOURCES) \
+	$(rwarray_la_SOURCES) $(testext_la_SOURCES) $(time_la_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+man3dir = $(mandir)/man3
+NROFF = nroff
+MANS = $(dist_man_MANS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	cscope distdir distdir-am dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)configh.in
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \
+	$(srcdir)/configh.in $(top_srcdir)/build-aux/ar-lib \
+	$(top_srcdir)/build-aux/compile \
+	$(top_srcdir)/build-aux/config.guess \
+	$(top_srcdir)/build-aux/config.rpath \
+	$(top_srcdir)/build-aux/config.sub \
+	$(top_srcdir)/build-aux/depcomp \
+	$(top_srcdir)/build-aux/install-sh \
+	$(top_srcdir)/build-aux/ltmain.sh \
+	$(top_srcdir)/build-aux/missing ABOUT-NLS AUTHORS COPYING \
+	ChangeLog INSTALL NEWS README build-aux/ChangeLog \
+	build-aux/ar-lib build-aux/compile build-aux/config.guess \
+	build-aux/config.rpath build-aux/config.sub build-aux/depcomp \
+	build-aux/install-sh build-aux/ltmain.sh build-aux/missing
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMPFR = @LIBMPFR@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgextensiondir = @pkgextensiondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AM_CPPFLAGS = -I$(srcdir)/..
+
+# This variable insures that aclocal runs
+# correctly after changing configure.ac
+ACLOCAL_AMFLAGS = -I m4 -I ../m4
+
+# For some make's, e.g. OpenBSD, that don't define this
+RM = rm -f
+
+# Note: rwarray does not currently compile.
+pkgextension_LTLIBRARIES = \
+	filefuncs.la	\
+	fnmatch.la	\
+	fork.la		\
+	inplace.la	\
+	intdiv.la	\
+	ordchr.la	\
+	readdir.la	\
+	readfile.la	\
+	revoutput.la	\
+	revtwoway.la	\
+	rwarray.la	\
+	time.la
+
+noinst_LTLIBRARIES = \
+	readdir_test.la	\
+	testext.la
+
+MY_MODULE_FLAGS = -module -avoid-version -no-undefined
+# On Cygwin, gettext requires that we link with -lintl 
+MY_LIBS = $(LTLIBINTL)
+filefuncs_la_SOURCES = filefuncs.c stack.h stack.c gawkfts.h \
+			gawkfts.c gawkdirfd.h
+
+filefuncs_la_LDFLAGS = $(MY_MODULE_FLAGS)
+filefuncs_la_LIBADD = $(MY_LIBS)
+fnmatch_la_SOURCES = fnmatch.c
+fnmatch_la_LDFLAGS = $(MY_MODULE_FLAGS)
+fnmatch_la_LIBADD = $(MY_LIBS)
+fork_la_SOURCES = fork.c
+fork_la_LDFLAGS = $(MY_MODULE_FLAGS)
+fork_la_LIBADD = $(MY_LIBS)
+inplace_la_SOURCES = inplace.c
+inplace_la_LDFLAGS = $(MY_MODULE_FLAGS)
+inplace_la_LIBADD = $(MY_LIBS)
+
+# On Cygwin, intdiv has to be linked with the MPFR and GMP libraries.
+# Solaris in addition wants the math library.
+intdiv_la_SOURCES = intdiv.c
+intdiv_la_LDFLAGS = $(MY_MODULE_FLAGS)
+intdiv_la_LIBADD = $(MY_LIBS) $(LIBMPFR) -lm
+ordchr_la_SOURCES = ordchr.c
+ordchr_la_LDFLAGS = $(MY_MODULE_FLAGS)
+ordchr_la_LIBADD = $(MY_LIBS)
+readdir_la_SOURCES = readdir.c gawkdirfd.h
+readdir_la_LDFLAGS = $(MY_MODULE_FLAGS)
+readdir_la_LIBADD = $(MY_LIBS)
+readfile_la_SOURCES = readfile.c
+readfile_la_LDFLAGS = $(MY_MODULE_FLAGS)
+readfile_la_LIBADD = $(MY_LIBS)
+revoutput_la_SOURCES = revoutput.c
+revoutput_la_LDFLAGS = $(MY_MODULE_FLAGS)
+revoutput_la_LIBADD = $(MY_LIBS)
+revtwoway_la_SOURCES = revtwoway.c
+revtwoway_la_LDFLAGS = $(MY_MODULE_FLAGS)
+revtwoway_la_LIBADD = $(MY_LIBS)
+rwarray_la_SOURCES = rwarray.c
+rwarray_la_LDFLAGS = $(MY_MODULE_FLAGS)
+rwarray_la_LIBADD = $(MY_LIBS)
+time_la_SOURCES = time.c
+time_la_LDFLAGS = $(MY_MODULE_FLAGS)
+time_la_LIBADD = $(MY_LIBS)
+
+# N.B. Becaues we are not installing testext, we must specify -rpath in
+# LDFLAGS to get automake to build a shared library, since it needs
+# an installation path.
+testext_la_SOURCES = testext.c
+testext_la_LDFLAGS = $(MY_MODULE_FLAGS) -rpath /foo
+testext_la_LIBADD = $(MY_LIBS)
+
+# N.B. Because we are not installing readdir_test, we must specify -rpath in
+# LDFLAGS to get automake to build a shared library, since it needs
+# an installation path.
+readdir_test_la_SOURCES = readdir_test.c
+readdir_test_la_LDFLAGS = $(MY_MODULE_FLAGS) -rpath /foo
+readdir_test_la_LIBADD = $(MY_LIBS)
+EXTRA_DIST = build-aux/config.rpath  \
+	ChangeLog \
+	ChangeLog.0 \
+	ChangeLog.1 \
+	ext_custom.h \
+	fts.3 \
+	m4 \
+	README.fts \
+	rwarray0.c
+
+dist_man_MANS = \
+	filefuncs.3am fnmatch.3am fork.3am inplace.3am \
+	ordchr.3am readdir.3am readfile.3am revoutput.3am \
+	revtwoway.3am rwarray.3am time.3am
+
+
+# gettext requires this
+SUBDIRS = po 
+all: config.h
+	$(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+config.h: stamp-h1
+	@test -f $@ || rm -f stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
+
+stamp-h1: $(srcdir)/configh.in $(top_builddir)/config.status
+	@rm -f stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/configh.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f config.h stamp-h1
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+install-pkgextensionLTLIBRARIES: $(pkgextension_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(pkgextension_LTLIBRARIES)'; test -n "$(pkgextensiondir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgextensiondir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgextensiondir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkgextensiondir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkgextensiondir)"; \
+	}
+
+uninstall-pkgextensionLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkgextension_LTLIBRARIES)'; test -n "$(pkgextensiondir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkgextensiondir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkgextensiondir)/$$f"; \
+	done
+
+clean-pkgextensionLTLIBRARIES:
+	-test -z "$(pkgextension_LTLIBRARIES)" || rm -f $(pkgextension_LTLIBRARIES)
+	@list='$(pkgextension_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+filefuncs.la: $(filefuncs_la_OBJECTS) $(filefuncs_la_DEPENDENCIES) $(EXTRA_filefuncs_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(filefuncs_la_LINK) -rpath $(pkgextensiondir) $(filefuncs_la_OBJECTS) $(filefuncs_la_LIBADD) $(LIBS)
+
+fnmatch.la: $(fnmatch_la_OBJECTS) $(fnmatch_la_DEPENDENCIES) $(EXTRA_fnmatch_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(fnmatch_la_LINK) -rpath $(pkgextensiondir) $(fnmatch_la_OBJECTS) $(fnmatch_la_LIBADD) $(LIBS)
+
+fork.la: $(fork_la_OBJECTS) $(fork_la_DEPENDENCIES) $(EXTRA_fork_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(fork_la_LINK) -rpath $(pkgextensiondir) $(fork_la_OBJECTS) $(fork_la_LIBADD) $(LIBS)
+
+inplace.la: $(inplace_la_OBJECTS) $(inplace_la_DEPENDENCIES) $(EXTRA_inplace_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(inplace_la_LINK) -rpath $(pkgextensiondir) $(inplace_la_OBJECTS) $(inplace_la_LIBADD) $(LIBS)
+
+intdiv.la: $(intdiv_la_OBJECTS) $(intdiv_la_DEPENDENCIES) $(EXTRA_intdiv_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(intdiv_la_LINK) -rpath $(pkgextensiondir) $(intdiv_la_OBJECTS) $(intdiv_la_LIBADD) $(LIBS)
+
+ordchr.la: $(ordchr_la_OBJECTS) $(ordchr_la_DEPENDENCIES) $(EXTRA_ordchr_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(ordchr_la_LINK) -rpath $(pkgextensiondir) $(ordchr_la_OBJECTS) $(ordchr_la_LIBADD) $(LIBS)
+
+readdir.la: $(readdir_la_OBJECTS) $(readdir_la_DEPENDENCIES) $(EXTRA_readdir_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(readdir_la_LINK) -rpath $(pkgextensiondir) $(readdir_la_OBJECTS) $(readdir_la_LIBADD) $(LIBS)
+
+readdir_test.la: $(readdir_test_la_OBJECTS) $(readdir_test_la_DEPENDENCIES) $(EXTRA_readdir_test_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(readdir_test_la_LINK)  $(readdir_test_la_OBJECTS) $(readdir_test_la_LIBADD) $(LIBS)
+
+readfile.la: $(readfile_la_OBJECTS) $(readfile_la_DEPENDENCIES) $(EXTRA_readfile_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(readfile_la_LINK) -rpath $(pkgextensiondir) $(readfile_la_OBJECTS) $(readfile_la_LIBADD) $(LIBS)
+
+revoutput.la: $(revoutput_la_OBJECTS) $(revoutput_la_DEPENDENCIES) $(EXTRA_revoutput_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(revoutput_la_LINK) -rpath $(pkgextensiondir) $(revoutput_la_OBJECTS) $(revoutput_la_LIBADD) $(LIBS)
+
+revtwoway.la: $(revtwoway_la_OBJECTS) $(revtwoway_la_DEPENDENCIES) $(EXTRA_revtwoway_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(revtwoway_la_LINK) -rpath $(pkgextensiondir) $(revtwoway_la_OBJECTS) $(revtwoway_la_LIBADD) $(LIBS)
+
+rwarray.la: $(rwarray_la_OBJECTS) $(rwarray_la_DEPENDENCIES) $(EXTRA_rwarray_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(rwarray_la_LINK) -rpath $(pkgextensiondir) $(rwarray_la_OBJECTS) $(rwarray_la_LIBADD) $(LIBS)
+
+testext.la: $(testext_la_OBJECTS) $(testext_la_DEPENDENCIES) $(EXTRA_testext_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(testext_la_LINK)  $(testext_la_OBJECTS) $(testext_la_LIBADD) $(LIBS)
+
+time.la: $(time_la_OBJECTS) $(time_la_DEPENDENCIES) $(EXTRA_time_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(time_la_LINK) -rpath $(pkgextensiondir) $(time_la_OBJECTS) $(time_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filefuncs.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fnmatch.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fork.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gawkfts.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inplace.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intdiv.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ordchr.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readdir.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readdir_test.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readfile.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/revoutput.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/revtwoway.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rwarray.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testext.Plo@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Plo@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+install-man3: $(dist_man_MANS)
+	@$(NORMAL_INSTALL)
+	@list1=''; \
+	list2='$(dist_man_MANS)'; \
+	test -n "$(man3dir)" \
+	  && test -n "`echo $$list1$$list2`" \
+	  || exit 0; \
+	echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \
+	$(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \
+	{ for i in $$list1; do echo "$$i"; done;  \
+	if test -n "$$list2"; then \
+	  for i in $$list2; do echo "$$i"; done \
+	    | sed -n '/\.3[a-z]*$$/p'; \
+	fi; \
+	} | while read p; do \
+	  if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; echo "$$p"; \
+	done | \
+	sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
+	sed 'N;N;s,\n, ,g' | { \
+	list=; while read file base inst; do \
+	  if test "$$base" = "$$inst"; then list="$$list $$file"; else \
+	    echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \
+	    $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst" || exit $$?; \
+	  fi; \
+	done; \
+	for i in $$list; do echo "$$i"; done | $(am__base_list) | \
+	while read files; do \
+	  test -z "$$files" || { \
+	    echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man3dir)'"; \
+	    $(INSTALL_DATA) $$files "$(DESTDIR)$(man3dir)" || exit $$?; }; \
+	done; }
+
+uninstall-man3:
+	@$(NORMAL_UNINSTALL)
+	@list=''; test -n "$(man3dir)" || exit 0; \
+	files=`{ for i in $$list; do echo "$$i"; done; \
+	l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \
+	  sed -n '/\.3[a-z]*$$/p'; \
+	} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^3][0-9a-z]*$$,3,;x' \
+	      -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
+	dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(LTLIBRARIES) $(MANS) config.h
+installdirs: installdirs-recursive
+installdirs-am:
+	for dir in "$(DESTDIR)$(pkgextensiondir)" "$(DESTDIR)$(man3dir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+	clean-pkgextensionLTLIBRARIES mostlyclean-am
+
+distclean: distclean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+		-rm -f ./$(DEPDIR)/filefuncs.Plo
+	-rm -f ./$(DEPDIR)/fnmatch.Plo
+	-rm -f ./$(DEPDIR)/fork.Plo
+	-rm -f ./$(DEPDIR)/gawkfts.Plo
+	-rm -f ./$(DEPDIR)/inplace.Plo
+	-rm -f ./$(DEPDIR)/intdiv.Plo
+	-rm -f ./$(DEPDIR)/ordchr.Plo
+	-rm -f ./$(DEPDIR)/readdir.Plo
+	-rm -f ./$(DEPDIR)/readdir_test.Plo
+	-rm -f ./$(DEPDIR)/readfile.Plo
+	-rm -f ./$(DEPDIR)/revoutput.Plo
+	-rm -f ./$(DEPDIR)/revtwoway.Plo
+	-rm -f ./$(DEPDIR)/rwarray.Plo
+	-rm -f ./$(DEPDIR)/stack.Plo
+	-rm -f ./$(DEPDIR)/testext.Plo
+	-rm -f ./$(DEPDIR)/time.Plo
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-local distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-man install-pkgextensionLTLIBRARIES
+	@$(NORMAL_INSTALL)
+	$(MAKE) $(AM_MAKEFLAGS) install-data-hook
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man: install-man3
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+		-rm -f ./$(DEPDIR)/filefuncs.Plo
+	-rm -f ./$(DEPDIR)/fnmatch.Plo
+	-rm -f ./$(DEPDIR)/fork.Plo
+	-rm -f ./$(DEPDIR)/gawkfts.Plo
+	-rm -f ./$(DEPDIR)/inplace.Plo
+	-rm -f ./$(DEPDIR)/intdiv.Plo
+	-rm -f ./$(DEPDIR)/ordchr.Plo
+	-rm -f ./$(DEPDIR)/readdir.Plo
+	-rm -f ./$(DEPDIR)/readdir_test.Plo
+	-rm -f ./$(DEPDIR)/readfile.Plo
+	-rm -f ./$(DEPDIR)/revoutput.Plo
+	-rm -f ./$(DEPDIR)/revtwoway.Plo
+	-rm -f ./$(DEPDIR)/rwarray.Plo
+	-rm -f ./$(DEPDIR)/stack.Plo
+	-rm -f ./$(DEPDIR)/testext.Plo
+	-rm -f ./$(DEPDIR)/time.Plo
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-man uninstall-pkgextensionLTLIBRARIES
+
+uninstall-man: uninstall-man3
+
+.MAKE: $(am__recursive_targets) all install-am install-data-am \
+	install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+	am--depfiles am--refresh check check-am clean clean-cscope \
+	clean-generic clean-libtool clean-noinstLTLIBRARIES \
+	clean-pkgextensionLTLIBRARIES cscope cscopelist-am ctags \
+	ctags-am dist dist-all dist-bzip2 dist-gzip dist-lzip \
+	dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \
+	distclean-compile distclean-generic distclean-hdr \
+	distclean-libtool distclean-local distclean-tags \
+	distcleancheck distdir distuninstallcheck dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-data-hook install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-man3 \
+	install-pdf install-pdf-am install-pkgextensionLTLIBRARIES \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs installdirs-am maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am uninstall-man \
+	uninstall-man3 uninstall-pkgextensionLTLIBRARIES
+
+.PRECIOUS: Makefile
+
+
+install-data-hook:
+	for i in $(pkgextension_LTLIBRARIES) ; do \
+		$(RM) $(DESTDIR)$(pkgextensiondir)/$$i ; \
+	done
+
+# Keep the uninstall check working:
+uninstall-so:
+	$(RM) $(DESTDIR)$(pkgextensiondir)/*.so
+	$(RM) $(DESTDIR)$(pkgextensiondir)/*.dll
+	$(RM) $(DESTDIR)$(pkgextensiondir)/*.a
+	$(RM) $(DESTDIR)$(pkgextensiondir)/*.lib
+
+uninstall-recursive: uninstall-so
+
+distclean-local:
+	rm -fr .deps
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/extension/NEWS b/gawk-5.0.1/extension/NEWS
new file mode 100644
index 00000000000..b3b2e56f29d
--- /dev/null
+++ b/gawk-5.0.1/extension/NEWS
@@ -0,0 +1,7 @@
+   Copyright (C) 2012 Free Software Foundation, Inc.
+   
+   Copying and distribution of this file, with or without modification,
+   are permitted in any medium without royalty provided the copyright
+   notice and this notice are preserved.
+
+Extensions now build separately.
diff --git a/gawk-5.0.1/extension/README b/gawk-5.0.1/extension/README
new file mode 100644
index 00000000000..aa40470039a
--- /dev/null
+++ b/gawk-5.0.1/extension/README
@@ -0,0 +1,10 @@
+  Copyright (C) 2005, 2006, 2007, 2009, 2010, 2011, 2012
+  Free Software Foundation, Inc.
+  
+  Copying and distribution of this file, with or without modification,
+  are permitted in any medium without royalty provided the copyright
+  notice and this notice are preserved.
+
+README:
+
+This directory contain the standard bundled extensions for GNU Awk.
diff --git a/gawk-5.0.1/extension/README.fts b/gawk-5.0.1/extension/README.fts
new file mode 100644
index 00000000000..b8b948c4e04
--- /dev/null
+++ b/gawk-5.0.1/extension/README.fts
@@ -0,0 +1,68 @@
+Wed Aug 29 22:34:24 IDT 2012
+============================
+
+Portability is a myth, a chimera. Like the pot of gold at the end of
+the rainbow, it's always looks like it is just within your reach, but
+in fact, it is seldom, if ever, truly acheivable.
+
+It all started when trying to get the extensions to work on my aged
+PowerPC Macbook G4 running Mac OS X 10.5.  That machine is wonderful,
+since it is neither an Intel architecture machine nor is it GNU/Linux;
+two criteria that are becoming increasingly harder to meet over 10%
+into the 21st century.
+
+The readdir extension didn't work. Furthermore, GDB showed that in gawk
+itself, struct stat had one size and layout, while inside the readdir
+code, it had another.
+
+This turned out to be due to the large file nonsense foisted off upon
+us by POSIX. The main gawk configure.ac had AC_SYS_LARGEFILE but the
+extensions' configure.ac did not.  OK - a one line fix, rebuild, and
+everything is OK.  Right?
+
+Of course not.
+
+Everything was OK on my 64-bit GNU/Linux Intel system, but lo and behold,
+I compiled on a 32-bit GNU/Linux system and suddenly the fts tests
+stopped working. A look at the config.log reveals:
+
+	<fts.h> cannot be used with -D_FILE_OFFSET_BITS==64
+
+Why? Who knows. The comment in the file itself is cryptic:
+
+	/* The fts interface is incompatible with the LFS interface which
+	   transparently uses the 64-bit file access functions.  */
+	#ifdef __USE_FILE_OFFSET64
+	# error "<fts.h> cannot be used with -D_FILE_OFFSET_BITS==64"
+	#endif
+
+It purports to be English, but says nothing intelligible, and the man
+page sheds no light, either.
+
+Fortunately, the source for fts from NetBSD is reasonably legible,
+freely available, and has a usable license.
+
+So, I try to just plug it in directly.  Everything compiles, nothing
+works. There is shared library / weird linker dark voodoo crap going on.
+
+*I* am not a powerful enough Jedi to get around it, and I think it has
+more to do with the Dark Side of the Force than with the Light Side. So
+gawkfts.h now has:
+
+	#define fts_children gawk_fts_children
+	#define fts_close gawk_fts_close
+	#define fts_open gawk_fts_open
+	#define fts_read gawk_fts_read
+	#define fts_set gawk_fts_set
+
+to rename things, and it all compiles and works.
+
+The Plan 9 guys got it right when they threw eveything out and started
+over again. I sure wish I could.
+
+On the bright side, this is stuff that would have had to be done anyway
+for at least MinGW, and maybe for some other systems. So it's not wasted
+effort. But it sure is sad that it's necessary.
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/extension/aclocal.m4 b/gawk-5.0.1/extension/aclocal.m4
new file mode 100644
index 00000000000..582a4adbee3
--- /dev/null
+++ b/gawk-5.0.1/extension/aclocal.m4
@@ -0,0 +1,1214 @@
+# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Copyright (C) 2002-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.16.1], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# Copyright (C) 2011-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_AR([ACT-IF-FAIL])
+# -------------------------
+# Try to determine the archiver interface, and trigger the ar-lib wrapper
+# if it is needed.  If the detection of archiver interface fails, run
+# ACT-IF-FAIL (default is to abort configure with a proper error message).
+AC_DEFUN([AM_PROG_AR],
+[AC_BEFORE([$0], [LT_INIT])dnl
+AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl
+AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([ar-lib])dnl
+AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false])
+: ${AR=ar}
+
+AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],
+  [AC_LANG_PUSH([C])
+   am_cv_ar_interface=ar
+   AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])],
+     [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([am_ar_try])
+      if test "$ac_status" -eq 0; then
+        am_cv_ar_interface=ar
+      else
+        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
+        AC_TRY_EVAL([am_ar_try])
+        if test "$ac_status" -eq 0; then
+          am_cv_ar_interface=lib
+        else
+          am_cv_ar_interface=unknown
+        fi
+      fi
+      rm -f conftest.lib libconftest.a
+     ])
+   AC_LANG_POP([C])])
+
+case $am_cv_ar_interface in
+ar)
+  ;;
+lib)
+  # Microsoft lib, so override with the ar-lib wrapper script.
+  # FIXME: It is wrong to rewrite AR.
+  # But if we don't then we get into trouble of one sort or another.
+  # A longer-term fix would be to have automake use am__AR in this case,
+  # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
+  # similar.
+  AR="$am_aux_dir/ar-lib $AR"
+  ;;
+unknown)
+  m4_default([$1],
+             [AC_MSG_ERROR([could not determine $AR interface])])
+  ;;
+esac
+AC_SUBST([AR])dnl
+])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  AS_CASE([$CONFIG_FILES],
+          [*\'*], [eval set x "$CONFIG_FILES"],
+          [*], [set x $CONFIG_FILES])
+  shift
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
+  do
+    # Strip MF so we end up with the name of the file.
+    am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`AS_DIRNAME(["$am_mf"])`
+    am_filepart=`AS_BASENAME(["$am_mf"])`
+    AM_RUN_LOG([cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles]) || am_rc=$?
+  done
+  if test $am_rc -ne 0; then
+    AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).])
+  fi
+  AS_UNSET([am_dirpart])
+  AS_UNSET([am_filepart])
+  AS_UNSET([am_mf])
+  AS_UNSET([am_rc])
+  rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES([CC])],
+		  [m4_define([AC_PROG_CC],
+			     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES([CXX])],
+		  [m4_define([AC_PROG_CXX],
+			     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES([OBJC])],
+		  [m4_define([AC_PROG_OBJC],
+			     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+		  [_AM_DEPENDENCIES([OBJCXX])],
+		  [m4_define([AC_PROG_OBJCXX],
+			     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+	@echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+  AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+      ['0:this is the am__doit target'],
+      [AS_CASE([$s],
+          [BSD], [am__include='.include' am__quote='"'],
+          [am__include='include' am__quote=''])])
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+	&& test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004-2018 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([../m4/arch.m4])
+m4_include([../m4/mpfr.m4])
+m4_include([m4/codeset.m4])
+m4_include([m4/dirfd.m4])
+m4_include([m4/gettext.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/intlmacosx.m4])
+m4_include([m4/lcmessage.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
+m4_include([m4/nls.m4])
+m4_include([m4/po.m4])
+m4_include([m4/progtest.m4])
diff --git a/gawk-5.0.1/extension/build-aux/ChangeLog b/gawk-5.0.1/extension/build-aux/ChangeLog
new file mode 100644
index 00000000000..f7abc792e56
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/ChangeLog
@@ -0,0 +1,218 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.0: Release tar ball made.
+
+2019-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2019-03-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2019-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2019-02-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.rpath, config.sub: Updated from GNULIB.
+
+2018-12-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2018-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-11-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2018-11-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2018-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2018-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2018-08-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2018-08-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-06-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-05-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated from GNULIB.
+
+2018-05-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Update from GNULIB.
+
+2018-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated from GNULIB.
+
+2018-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub, install-sh: Updated from GNULIB.
+
+2018-03-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ar-lib, compile, config.guess, config.sub, depcomp,
+	install-sh, ltmain.sh: Updated.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated.
+
+2018-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated.
+
+2018-01-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated.
+
+2017-12-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub, depcomp, install-sh: Updated
+	from GNULIB.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Updated.
+
+2017-09-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ar-lib, compile, config.guess, config.sub, depcomp: Updated.
+
+2017-08-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2017-08-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated from GNULIB.
+
+2017-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Update to latest from GNULIB.
+
+2017-03-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Updated again.
+
+2017-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.rpath, config.sub, install-sh:
+	Sync with GNULIB.
+
+2017-01-04         Arnold Robbins        <arnold@skeeve.com>
+
+	* config.guess, config.sub, compile, depcomp: Sync from latest
+	in GNULIB.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-07-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Update from GNULIB. Again.
+
+2016-06-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sub: Update from GNULIB.
+
+2016-06-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub: Get latest from Gnulib master.
+
+2016-02-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.rpath, config.sub: Update to latest
+	from GNULIB.
+
+2015-09-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub, config.rpath: Updated.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-03-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.sub, ltmain.sh: Updated, from libtool 2.4.6.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess, config.rpath, config.sub, depcomp,
+	install-sh: Updated.
+
+2013-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.guess: Updated.
+
+2013-12-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ltmain.sh: Updated to libtool 2.4.2.418.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-04-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* missing: Updated from Automake 1.13.1.
+
+2012-07-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.rpath: New file.
+
+2012-05-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* ar-lib, config.guess, config.sub, depcomp, install-sh, ltmain.sh,
+	missing: New files related to autoconf and libtool.
diff --git a/gawk-5.0.1/extension/build-aux/ar-lib b/gawk-5.0.1/extension/build-aux/ar-lib
new file mode 100755
index 00000000000..0baa4f60760
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/ar-lib
@@ -0,0 +1,270 @@
+#! /bin/sh
+# Wrapper for Microsoft lib.exe
+
+me=ar-lib
+scriptversion=2012-03-01.08; # UTC
+
+# Copyright (C) 2010-2018 Free Software Foundation, Inc.
+# Written by Peter Rosin <peda@lysator.liu.se>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+
+# func_error message
+func_error ()
+{
+  echo "$me: $1" 1>&2
+  exit 1
+}
+
+file_conv=
+
+# func_file_conv build_file
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+	# lazily determine how to convert abs files
+	case `uname -s` in
+	  MINGW*)
+	    file_conv=mingw
+	    ;;
+	  CYGWIN*)
+	    file_conv=cygwin
+	    ;;
+	  *)
+	    file_conv=wine
+	    ;;
+	esac
+      fi
+      case $file_conv in
+	mingw)
+	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+	  ;;
+	cygwin)
+	  file=`cygpath -m "$file" || echo "$file"`
+	  ;;
+	wine)
+	  file=`winepath -w "$file" || echo "$file"`
+	  ;;
+      esac
+      ;;
+  esac
+}
+
+# func_at_file at_file operation archive
+# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
+# for each of them.
+# When interpreting the content of the @FILE, do NOT use func_file_conv,
+# since the user would need to supply preconverted file names to
+# binutils ar, at least for MinGW.
+func_at_file ()
+{
+  operation=$2
+  archive=$3
+  at_file_contents=`cat "$1"`
+  eval set x "$at_file_contents"
+  shift
+
+  for member
+  do
+    $AR -NOLOGO $operation:"$member" "$archive" || exit $?
+  done
+}
+
+case $1 in
+  '')
+     func_error "no command.  Try '$0 --help' for more information."
+     ;;
+  -h | --h*)
+    cat <<EOF
+Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
+
+Members may be specified in a file named with @FILE.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "$me, version $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test $# -lt 3; then
+  func_error "you must specify a program, an action and an archive"
+fi
+
+AR=$1
+shift
+while :
+do
+  if test $# -lt 2; then
+    func_error "you must specify a program, an action and an archive"
+  fi
+  case $1 in
+    -lib | -LIB \
+    | -ltcg | -LTCG \
+    | -machine* | -MACHINE* \
+    | -subsystem* | -SUBSYSTEM* \
+    | -verbose | -VERBOSE \
+    | -wx* | -WX* )
+      AR="$AR $1"
+      shift
+      ;;
+    *)
+      action=$1
+      shift
+      break
+      ;;
+  esac
+done
+orig_archive=$1
+shift
+func_file_conv "$orig_archive"
+archive=$file
+
+# strip leading dash in $action
+action=${action#-}
+
+delete=
+extract=
+list=
+quick=
+replace=
+index=
+create=
+
+while test -n "$action"
+do
+  case $action in
+    d*) delete=yes  ;;
+    x*) extract=yes ;;
+    t*) list=yes    ;;
+    q*) quick=yes   ;;
+    r*) replace=yes ;;
+    s*) index=yes   ;;
+    S*)             ;; # the index is always updated implicitly
+    c*) create=yes  ;;
+    u*)             ;; # TODO: don't ignore the update modifier
+    v*)             ;; # TODO: don't ignore the verbose modifier
+    *)
+      func_error "unknown action specified"
+      ;;
+  esac
+  action=${action#?}
+done
+
+case $delete$extract$list$quick$replace,$index in
+  yes,* | ,yes)
+    ;;
+  yesyes*)
+    func_error "more than one action specified"
+    ;;
+  *)
+    func_error "no action specified"
+    ;;
+esac
+
+if test -n "$delete"; then
+  if test ! -f "$orig_archive"; then
+    func_error "archive not found"
+  fi
+  for member
+  do
+    case $1 in
+      @*)
+        func_at_file "${1#@}" -REMOVE "$archive"
+        ;;
+      *)
+        func_file_conv "$1"
+        $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
+        ;;
+    esac
+  done
+
+elif test -n "$extract"; then
+  if test ! -f "$orig_archive"; then
+    func_error "archive not found"
+  fi
+  if test $# -gt 0; then
+    for member
+    do
+      case $1 in
+        @*)
+          func_at_file "${1#@}" -EXTRACT "$archive"
+          ;;
+        *)
+          func_file_conv "$1"
+          $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
+          ;;
+      esac
+    done
+  else
+    $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
+    do
+      $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
+    done
+  fi
+
+elif test -n "$quick$replace"; then
+  if test ! -f "$orig_archive"; then
+    if test -z "$create"; then
+      echo "$me: creating $orig_archive"
+    fi
+    orig_archive=
+  else
+    orig_archive=$archive
+  fi
+
+  for member
+  do
+    case $1 in
+    @*)
+      func_file_conv "${1#@}"
+      set x "$@" "@$file"
+      ;;
+    *)
+      func_file_conv "$1"
+      set x "$@" "$file"
+      ;;
+    esac
+    shift
+    shift
+  done
+
+  if test -n "$orig_archive"; then
+    $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
+  else
+    $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
+  fi
+
+elif test -n "$list"; then
+  if test ! -f "$orig_archive"; then
+    func_error "archive not found"
+  fi
+  $AR -NOLOGO -LIST "$archive" || exit $?
+fi
diff --git a/gawk-5.0.1/extension/build-aux/compile b/gawk-5.0.1/extension/build-aux/compile
new file mode 100755
index 00000000000..99e50524b3b
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/compile
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""	$nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+	# lazily determine how to convert abs files
+	case `uname -s` in
+	  MINGW*)
+	    file_conv=mingw
+	    ;;
+	  CYGWIN*)
+	    file_conv=cygwin
+	    ;;
+	  *)
+	    file_conv=wine
+	    ;;
+	esac
+      fi
+      case $file_conv/,$2, in
+	*,$file_conv,*)
+	  ;;
+	mingw/*)
+	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+	  ;;
+	cygwin/*)
+	  file=`cygpath -m "$file" || echo "$file"`
+	  ;;
+	wine/*)
+	  file=`winepath -w "$file" || echo "$file"`
+	  ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+	-o)
+	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
+	  eat=1
+	  case $2 in
+	    *.o | *.[oO][bB][jJ])
+	      func_file_conv "$2"
+	      set x "$@" -Fo"$file"
+	      shift
+	      ;;
+	    *)
+	      func_file_conv "$2"
+	      set x "$@" -Fe"$file"
+	      shift
+	      ;;
+	  esac
+	  ;;
+	-I)
+	  eat=1
+	  func_file_conv "$2" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-I*)
+	  func_file_conv "${1#-I}" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-l)
+	  eat=1
+	  func_cl_dashl "$2"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-l*)
+	  func_cl_dashl "${1#-l}"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-L)
+	  eat=1
+	  func_cl_dashL "$2"
+	  ;;
+	-L*)
+	  func_cl_dashL "${1#-L}"
+	  ;;
+	-static)
+	  shared=false
+	  ;;
+	-Wl,*)
+	  arg=${1#-Wl,}
+	  save_ifs="$IFS"; IFS=','
+	  for flag in $arg; do
+	    IFS="$save_ifs"
+	    linker_opts="$linker_opts $flag"
+	  done
+	  IFS="$save_ifs"
+	  ;;
+	-Xlinker)
+	  eat=1
+	  linker_opts="$linker_opts $2"
+	  ;;
+	-*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+	  func_file_conv "$1"
+	  set x "$@" -Tp"$file"
+	  shift
+	  ;;
+	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+	  func_file_conv "$1" mingw
+	  set x "$@" "$file"
+	  shift
+	  ;;
+	*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+  icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as 'compile cc -o foo foo.c'.
+	# So we strip '-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gawk-5.0.1/extension/build-aux/config.guess b/gawk-5.0.1/extension/build-aux/config.guess
new file mode 100755
index 00000000000..79d1317f52b
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/config.guess
@@ -0,0 +1,1645 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright 1992-2019 Free Software Foundation, Inc.
+
+timestamp='2019-03-04'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2019 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+    : "${TMPDIR=/tmp}"
+    # shellcheck disable=SC2039
+    { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+	{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+	{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+	{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+    dummy=$tmp/dummy
+    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+	,,)    echo "int x;" > "$dummy.c"
+	       for driver in cc gcc c89 c99 ; do
+		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+		       CC_FOR_BUILD="$driver"
+		       break
+		   fi
+	       done
+	       if test x"$CC_FOR_BUILD" = x ; then
+		   CC_FOR_BUILD=no_compiler_found
+	       fi
+	       ;;
+	,,*)   CC_FOR_BUILD=$CC ;;
+	,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+    esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case "$UNAME_SYSTEM" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	set_cc_for_build
+	cat <<-EOF > "$dummy.c"
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`"
+
+	# If ldd exists, use it to detect musl libc.
+	if command -v ldd >/dev/null && \
+		ldd --version 2>&1 | grep -q ^musl
+	then
+	    LIBC=musl
+	fi
+	;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    "/sbin/$sysctl" 2>/dev/null || \
+	    "/usr/sbin/$sysctl" 2>/dev/null || \
+	    echo unknown)`
+	case "$UNAME_MACHINE_ARCH" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine="${arch}${endian}"-unknown
+		;;
+	    *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently (or will in the future) and ABI.
+	case "$UNAME_MACHINE_ARCH" in
+	    earm*)
+		os=netbsdelf
+		;;
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# Determine ABI tags.
+	case "$UNAME_MACHINE_ARCH" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "$UNAME_VERSION" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "$machine-${os}${release}${abi-}"
+	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
+	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
+	exit ;;
+    *:MidnightBSD:*:*)
+	echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
+	exit ;;
+    *:SolidBSD:*:*)
+	echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
+	exit ;;
+    *:MirBSD:*:*)
+	echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
+	exit ;;
+    *:Sortix:*:*)
+	echo "$UNAME_MACHINE"-unknown-sortix
+	exit ;;
+    *:Redox:*:*)
+	echo "$UNAME_MACHINE"-unknown-redox
+	exit ;;
+    mips:OSF1:*.*)
+        echo mips-dec-osf1
+        exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE=alpha ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE=alpha ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE=alphaev5 ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE=alphaev56 ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE=alphapca56 ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE=alphapca57 ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE=alphaev6 ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE=alphaev67 ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE=alphaev68 ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE=alphaev69 ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE=alphaev7 ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE=alphaev79 ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`"
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo "$UNAME_MACHINE"-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo "$UNAME_MACHINE"-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix"$UNAME_RELEASE"
+	exit ;;
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`"
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux"$UNAME_RELEASE"
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	set_cc_for_build
+	SUN_ARCH=i386
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH=x86_64
+	    fi
+	fi
+	echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`"
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos"$UNAME_RELEASE"
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos"$UNAME_RELEASE"
+		;;
+	    sun4)
+		echo sparc-sun-sunos"$UNAME_RELEASE"
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos"$UNAME_RELEASE"
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint"$UNAME_RELEASE"
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint"$UNAME_RELEASE"
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint"$UNAME_RELEASE"
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint"$UNAME_RELEASE"
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint"$UNAME_RELEASE"
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint"$UNAME_RELEASE"
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten"$UNAME_RELEASE"
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten"$UNAME_RELEASE"
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix"$UNAME_RELEASE"
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix"$UNAME_RELEASE"
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix"$UNAME_RELEASE"
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+	  dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos"$UNAME_RELEASE"
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ]
+	then
+	    if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \
+	       [ "$TARGET_BINARY_INTERFACE"x = x ]
+	    then
+		echo m88k-dg-dgux"$UNAME_RELEASE"
+	    else
+		echo m88k-dg-dguxbcs"$UNAME_RELEASE"
+	    fi
+	else
+	    echo i586-dg-dgux"$UNAME_RELEASE"
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`"
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+	fi
+	echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		set_cc_for_build
+		sed 's/^		//' << EOF > "$dummy.c"
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+	else
+		IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
+	fi
+	echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd"$UNAME_RELEASE"   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+	case "$UNAME_MACHINE" in
+	    9000/31?)            HP_ARCH=m68000 ;;
+	    9000/[34]??)         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "$sc_cpu_version" in
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "$sc_kernel_bits" in
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "$HP_ARCH" = "" ]; then
+		    set_cc_for_build
+		    sed 's/^		//' << EOF > "$dummy.c"
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ "$HP_ARCH" = hppa2.0w ]
+	then
+	    set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH=hppa2.0w
+	    else
+		HP_ARCH=hppa64
+	    fi
+	fi
+	echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux"$HPUX_REV"
+	exit ;;
+    3050*:HI-UX:*:*)
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo "$UNAME_MACHINE"-unknown-osf1mk
+	else
+	    echo "$UNAME_MACHINE"-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi"$UNAME_RELEASE"
+	exit ;;
+    *:BSD/OS:*:*)
+	echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
+	exit ;;
+    arm:FreeBSD:*:*)
+	UNAME_PROCESSOR=`uname -p`
+	set_cc_for_build
+	if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_PCS_VFP
+	then
+	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi
+	else
+	    echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf
+	fi
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case "$UNAME_PROCESSOR" in
+	    amd64)
+		UNAME_PROCESSOR=x86_64 ;;
+	    i386)
+		UNAME_PROCESSOR=i586 ;;
+	esac
+	echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+	exit ;;
+    i*:CYGWIN*:*)
+	echo "$UNAME_MACHINE"-pc-cygwin
+	exit ;;
+    *:MINGW64*:*)
+	echo "$UNAME_MACHINE"-pc-mingw64
+	exit ;;
+    *:MINGW*:*)
+	echo "$UNAME_MACHINE"-pc-mingw32
+	exit ;;
+    *:MSYS*:*)
+	echo "$UNAME_MACHINE"-pc-msys
+	exit ;;
+    i*:PW*:*)
+	echo "$UNAME_MACHINE"-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case "$UNAME_MACHINE" in
+	    x86)
+		echo i586-pc-interix"$UNAME_RELEASE"
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix"$UNAME_RELEASE"
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix"$UNAME_RELEASE"
+		exit ;;
+	esac ;;
+    i*:UWIN*:*)
+	echo "$UNAME_MACHINE"-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-pc-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`"
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`"
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC"
+	exit ;;
+    *:Minix:*:*)
+	echo "$UNAME_MACHINE"-unknown-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    arm*:Linux:*:*)
+	set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
+	    else
+		echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    cris:Linux:*:*)
+	echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+	exit ;;
+    crisv32:Linux:*:*)
+	echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
+	exit ;;
+    e2k:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    frv:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    hexagon:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    i*86:Linux:*:*)
+	echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+	exit ;;
+    ia64:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    k1om:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    m32r*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    m68*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	set_cc_for_build
+	IS_GLIBC=0
+	test x"${LIBC}" = xgnu && IS_GLIBC=1
+	sed 's/^	//' << EOF > "$dummy.c"
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#undef mips64
+	#undef mips64el
+	#if ${IS_GLIBC} && defined(_ABI64)
+	LIBCABI=gnuabi64
+	#else
+	#if ${IS_GLIBC} && defined(_ABIN32)
+	LIBCABI=gnuabin32
+	#else
+	LIBCABI=${LIBC}
+	#endif
+	#endif
+
+	#if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa64r6
+	#else
+	#if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa32r6
+	#else
+	#if defined(__mips64)
+	CPU=mips64
+	#else
+	CPU=mips
+	#endif
+	#endif
+	#endif
+
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	MIPS_ENDIAN=el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	MIPS_ENDIAN=
+	#else
+	MIPS_ENDIAN=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`"
+	test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+	;;
+    mips64el:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-"$LIBC"
+	exit ;;
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-"$LIBC"
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-"$LIBC"
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
+	  PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
+	  *)    echo hppa-unknown-linux-"$LIBC" ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-"$LIBC"
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-"$LIBC"
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-"$LIBC"
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-"$LIBC"
+	exit ;;
+    riscv32:Linux:*:* | riscv64:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
+	exit ;;
+    sh64*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    sh*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    tile*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    vax:Linux:*:*)
+	echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
+	exit ;;
+    x86_64:Linux:*:*)
+	echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo "$UNAME_MACHINE"-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo "$UNAME_MACHINE"-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo "$UNAME_MACHINE"-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo "$UNAME_MACHINE"-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    i*86:*DOS:*:*)
+	echo "$UNAME_MACHINE"-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:*)
+	UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
+	else
+		echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
+	else
+		echo "$UNAME_MACHINE"-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configure will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv"$UNAME_RELEASE"  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos"$UNAME_RELEASE"
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv"$UNAME_RELEASE"
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo "$UNAME_MACHINE"-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel@ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo "$UNAME_MACHINE"-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green@stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux"$UNAME_RELEASE"
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv"$UNAME_RELEASE"
+	else
+		echo mips-unknown-sysv"$UNAME_RELEASE"
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux"$UNAME_RELEASE"
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody"$UNAME_RELEASE"
+	exit ;;
+    *:Rhapsody:*:*)
+	echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+		# On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+		if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+		       (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		       grep IS_PPC >/dev/null
+		then
+		    UNAME_PROCESSOR=powerpc
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
+	echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = x86; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-*:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    NSR-*:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    NSV-*:NONSTOP_KERNEL:*:*)
+	echo nsv-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    NSX-*:NONSTOP_KERNEL:*:*)
+	echo nsx-tandem-nsk"$UNAME_RELEASE"
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	# shellcheck disable=SC2154
+	if test "$cputype" = 386; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo "$UNAME_MACHINE"-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux"$UNAME_RELEASE"
+	exit ;;
+    *:DragonFly:*:*)
+	echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`"
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "$UNAME_MACHINE" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`"
+	exit ;;
+    i*86:rdos:*:*)
+	echo "$UNAME_MACHINE"-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo "$UNAME_MACHINE"-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo "$UNAME_MACHINE"-unknown-esx
+	exit ;;
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
+	exit ;;
+    *:Unleashed:*:*)
+	echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
+	exit ;;
+esac
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+  "4"
+#else
+  ""
+#endif
+  ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+  struct utsname un;
+
+  uname(&un);
+  if (strncmp(un.version, "V2", 2) == 0) {
+    printf ("i386-sequent-ptx2\n"); exit (0);
+  }
+  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+    printf ("i386-sequent-ptx1\n"); exit (0);
+  }
+  printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+  printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+  printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) /* >= ULTRIX4 */
+  printf ("mips-dec-ultrix4\n"); exit (0);
+#else
+#if defined(ULTRIX3) || defined(ultrix3) || defined(SIGLOST)
+  printf ("mips-dec-ultrix3\n"); exit (0);
+#endif
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case "$UNAME_MACHINE:$UNAME_SYSTEM" in
+    mips:Linux | mips64:Linux)
+	# If we got here on MIPS GNU/Linux, output extra information.
+	cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+	;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+and
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM  = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/gawk-5.0.1/extension/build-aux/config.rpath b/gawk-5.0.1/extension/build-aux/config.rpath
new file mode 100755
index 00000000000..be202c1a9e7
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/config.rpath
@@ -0,0 +1,684 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+#   Copyright 1996-2019 Free Software Foundation, Inc.
+#   Taken from GNU libtool, 2001
+#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+#   This file is free software; the Free Software Foundation gives
+#   unlimited permission to copy and/or distribute it, with or without
+#   modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+#   than 256 bytes, otherwise the compiler driver will dump core. The only
+#   known workaround is to choose shorter directory names for the build
+#   directory and/or the installation directory.
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# Code taken from libtool.m4's _LT_CC_BASENAME.
+
+for cc_temp in $CC""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's _LT_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+  wl='-Wl,'
+else
+  case "$host_os" in
+    aix*)
+      wl='-Wl,'
+      ;;
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      ;;
+    hpux9* | hpux10* | hpux11*)
+      wl='-Wl,'
+      ;;
+    irix5* | irix6* | nonstopux*)
+      wl='-Wl,'
+      ;;
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+        ecc*)
+          wl='-Wl,'
+          ;;
+        icc* | ifort*)
+          wl='-Wl,'
+          ;;
+        lf95*)
+          wl='-Wl,'
+          ;;
+        nagfor*)
+          wl='-Wl,-Wl,,'
+          ;;
+        pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+          wl='-Wl,'
+          ;;
+        ccc*)
+          wl='-Wl,'
+          ;;
+        xl* | bgxl* | bgf* | mpixl*)
+          wl='-Wl,'
+          ;;
+        como)
+          wl='-lopt='
+          ;;
+        *)
+          case `$CC -V 2>&1 | sed 5q` in
+            *Sun\ F* | *Sun*Fortran*)
+              wl=
+              ;;
+            *Sun\ C*)
+              wl='-Wl,'
+              ;;
+          esac
+          ;;
+      esac
+      ;;
+    newsos6)
+      ;;
+    *nto* | *qnx*)
+      ;;
+    osf3* | osf4* | osf5*)
+      wl='-Wl,'
+      ;;
+    rdos*)
+      ;;
+    solaris*)
+      case $cc_basename in
+        f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+          wl='-Qoption ld '
+          ;;
+        *)
+          wl='-Wl,'
+          ;;
+      esac
+      ;;
+    sunos4*)
+      wl='-Qoption ld '
+      ;;
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      wl='-Wl,'
+      ;;
+    sysv4*MP*)
+      ;;
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      wl='-Wl,'
+      ;;
+    unicos*)
+      wl='-Wl,'
+      ;;
+    uts4*)
+      ;;
+  esac
+fi
+
+# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  # Set some defaults for GNU ld with shared library support. These
+  # are reset later if shared libraries are not supported. Putting them
+  # here allows them to be overridden if necessary.
+  # Unlike libtool, we use -rpath here, not --rpath, since the documented
+  # option of GNU ld is called -rpath, not --rpath.
+  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  case "$host_os" in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+        ld_shlibs=no
+      fi
+      ;;
+    amigaos*)
+      case "$host_cpu" in
+        powerpc)
+          ;;
+        m68k)
+          hardcode_libdir_flag_spec='-L$libdir'
+          hardcode_minus_L=yes
+          ;;
+      esac
+      ;;
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    cygwin* | mingw* | pw32* | cegcc*)
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    haiku*)
+      ;;
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      ;;
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    netbsd*)
+      ;;
+    solaris*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+        ld_shlibs=no
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+          ld_shlibs=no
+          ;;
+        *)
+          if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+            hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+          else
+            ld_shlibs=no
+          fi
+          ;;
+      esac
+      ;;
+    sunos4*)
+      hardcode_direct=yes
+      ;;
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+  esac
+  if test "$ld_shlibs" = no; then
+    hardcode_libdir_flag_spec=
+  fi
+else
+  case "$host_os" in
+    aix3*)
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes; then
+        # Neither direct hardcoding nor static linking is supported with a
+        # broken collect2.
+        hardcode_direct=unsupported
+      fi
+      ;;
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+        # On IA64, the linker does run time linking by default, so we don't
+        # have to do anything special.
+        aix_use_runtimelinking=no
+      else
+        aix_use_runtimelinking=no
+        # Test if we are trying to use run time linking or normal
+        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+        # need to do runtime linking.
+        case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+          for ld_flag in $LDFLAGS; do
+            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+              aix_use_runtimelinking=yes
+              break
+            fi
+          done
+          ;;
+        esac
+      fi
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      if test "$GCC" = yes; then
+        case $host_os in aix4.[012]|aix4.[012].*)
+          collect2name=`${CC} -print-prog-name=collect2`
+          if test -f "$collect2name" && \
+            strings "$collect2name" | grep resolve_lib_name >/dev/null
+          then
+            # We have reworked collect2
+            :
+          else
+            # We have old collect2
+            hardcode_direct=unsupported
+            hardcode_minus_L=yes
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_libdir_separator=
+          fi
+          ;;
+        esac
+      fi
+      # Begin _LT_AC_SYS_LIBPATH_AIX.
+      echo 'int main () { return 0; }' > conftest.c
+      ${CC} ${LDFLAGS} conftest.c -o conftest
+      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      if test -z "$aix_libpath"; then
+        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      fi
+      if test -z "$aix_libpath"; then
+        aix_libpath="/usr/lib:/lib"
+      fi
+      rm -f conftest.c conftest
+      # End _LT_AC_SYS_LIBPATH_AIX.
+      if test "$aix_use_runtimelinking" = yes; then
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+      else
+        if test "$host_cpu" = ia64; then
+          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+        else
+          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        fi
+      fi
+      ;;
+    amigaos*)
+      case "$host_cpu" in
+        powerpc)
+          ;;
+        m68k)
+          hardcode_libdir_flag_spec='-L$libdir'
+          hardcode_minus_L=yes
+          ;;
+      esac
+      ;;
+    bsdi[45]*)
+      ;;
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      libext=lib
+      ;;
+    darwin* | rhapsody*)
+      hardcode_direct=no
+      if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    dgux*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    freebsd2.[01]*)
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    freebsd* | dragonfly*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    hpux9*)
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      ;;
+    hpux10*)
+      if test "$with_gnu_ld" = no; then
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        hardcode_direct=yes
+        # hardcode_minus_L: Not really in the search PATH,
+        # but as the default location of the library.
+        hardcode_minus_L=yes
+      fi
+      ;;
+    hpux11*)
+      if test "$with_gnu_ld" = no; then
+        hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator=:
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct=no
+            ;;
+          *)
+            hardcode_direct=yes
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+        esac
+      fi
+      ;;
+    irix5* | irix6* | nonstopux*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    netbsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    newsos6)
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    *nto* | *qnx*)
+      ;;
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+        hardcode_direct=yes
+        if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+          hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+        else
+          case "$host_os" in
+            openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+              hardcode_libdir_flag_spec='-R$libdir'
+              ;;
+            *)
+              hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+              ;;
+          esac
+        fi
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      ;;
+    osf3*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    osf4* | osf5*)
+      if test "$GCC" = yes; then
+        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+        # Both cc and cxx compiler support -rpath directly
+        hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+    solaris*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      ;;
+    sunos4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    sysv4)
+      case $host_vendor in
+        sni)
+          hardcode_direct=yes # is this really true???
+          ;;
+        siemens)
+          hardcode_direct=no
+          ;;
+        motorola)
+          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+          ;;
+      esac
+      ;;
+    sysv4.3*)
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        ld_shlibs=yes
+      fi
+      ;;
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      ;;
+    sysv5* | sco3.2v5* | sco5v6*)
+      hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+      hardcode_libdir_separator=':'
+      ;;
+    uts4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    *)
+      ld_shlibs=no
+      ;;
+  esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
+# Unlike libtool.m4, here we don't care about _all_ names of the library, but
+# only about the one the linker finds when passed -lNAME. This is the last
+# element of library_names_spec in libtool.m4, or possibly two of them if the
+# linker has special search rules.
+library_names_spec=      # the last element of library_names_spec in libtool.m4
+libname_spec='lib$name'
+case "$host_os" in
+  aix3*)
+    library_names_spec='$libname.a'
+    ;;
+  aix[4-9]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  amigaos*)
+    case "$host_cpu" in
+      powerpc*)
+        library_names_spec='$libname$shrext' ;;
+      m68k)
+        library_names_spec='$libname.a' ;;
+    esac
+    ;;
+  beos*)
+    library_names_spec='$libname$shrext'
+    ;;
+  bsdi[45]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  cygwin* | mingw* | pw32* | cegcc*)
+    shrext=.dll
+    library_names_spec='$libname.dll.a $libname.lib'
+    ;;
+  darwin* | rhapsody*)
+    shrext=.dylib
+    library_names_spec='$libname$shrext'
+    ;;
+  dgux*)
+    library_names_spec='$libname$shrext'
+    ;;
+  freebsd[23].*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  freebsd* | dragonfly*)
+    library_names_spec='$libname$shrext'
+    ;;
+  gnu*)
+    library_names_spec='$libname$shrext'
+    ;;
+  haiku*)
+    library_names_spec='$libname$shrext'
+    ;;
+  hpux9* | hpux10* | hpux11*)
+    case $host_cpu in
+      ia64*)
+        shrext=.so
+        ;;
+      hppa*64*)
+        shrext=.sl
+        ;;
+      *)
+        shrext=.sl
+        ;;
+    esac
+    library_names_spec='$libname$shrext'
+    ;;
+  interix[3-9]*)
+    library_names_spec='$libname$shrext'
+    ;;
+  irix5* | irix6* | nonstopux*)
+    library_names_spec='$libname$shrext'
+    case "$host_os" in
+      irix5* | nonstopux*)
+        libsuff= shlibsuff=
+        ;;
+      *)
+        case $LD in
+          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+          *) libsuff= shlibsuff= ;;
+        esac
+        ;;
+    esac
+    ;;
+  linux*oldld* | linux*aout* | linux*coff*)
+    ;;
+  linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    library_names_spec='$libname$shrext'
+    ;;
+  knetbsd*-gnu)
+    library_names_spec='$libname$shrext'
+    ;;
+  netbsd*)
+    library_names_spec='$libname$shrext'
+    ;;
+  newsos6)
+    library_names_spec='$libname$shrext'
+    ;;
+  *nto* | *qnx*)
+    library_names_spec='$libname$shrext'
+    ;;
+  openbsd*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  os2*)
+    libname_spec='$name'
+    shrext=.dll
+    library_names_spec='$libname.a'
+    ;;
+  osf3* | osf4* | osf5*)
+    library_names_spec='$libname$shrext'
+    ;;
+  rdos*)
+    ;;
+  solaris*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sunos4*)
+    library_names_spec='$libname$shrext$versuffix'
+    ;;
+  sysv4 | sysv4.3*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sysv4*MP*)
+    library_names_spec='$libname$shrext'
+    ;;
+  sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+    library_names_spec='$libname$shrext'
+    ;;
+  tpf*)
+    library_names_spec='$libname$shrext'
+    ;;
+  uts4*)
+    library_names_spec='$libname$shrext'
+    ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Format of library name prefix.
+libname_spec="$escaped_libname_spec"
+
+# Library names that the linker finds when passed -lNAME.
+library_names_spec="$escaped_library_names_spec"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/gawk-5.0.1/extension/build-aux/config.sub b/gawk-5.0.1/extension/build-aux/config.sub
new file mode 100755
index 00000000000..f53af5a2da7
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/config.sub
@@ -0,0 +1,1798 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright 1992-2019 Free Software Foundation, Inc.
+
+timestamp='2019-01-05'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2019 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo "$1"
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+
+# Separate into logical components for further validation
+case $1 in
+	*-*-*-*-*)
+		echo Invalid configuration \`"$1"\': more than four components >&2
+		exit 1
+		;;
+	*-*-*-*)
+		basic_machine=$field1-$field2
+		os=$field3-$field4
+		;;
+	*-*-*)
+		# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+		# parts
+		maybe_os=$field2-$field3
+		case $maybe_os in
+			nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \
+			| linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
+			| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+			| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+			| storm-chaos* | os2-emx* | rtmk-nova*)
+				basic_machine=$field1
+				os=$maybe_os
+				;;
+			android-linux)
+				basic_machine=$field1-unknown
+				os=linux-android
+				;;
+			*)
+				basic_machine=$field1-$field2
+				os=$field3
+				;;
+		esac
+		;;
+	*-*)
+		# A lone config we happen to match not fitting any pattern
+		case $field1-$field2 in
+			decstation-3100)
+				basic_machine=mips-dec
+				os=
+				;;
+			*-*)
+				# Second component is usually, but not always the OS
+				case $field2 in
+					# Prevent following clause from handling this valid os
+					sun*os*)
+						basic_machine=$field1
+						os=$field2
+						;;
+					# Manufacturers
+					dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+					| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+					| unicom* | ibm* | next | hp | isi* | apollo | altos* \
+					| convergent* | ncr* | news | 32* | 3600* | 3100* \
+					| hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+					| ultra | tti* | harris | dolphin | highlevel | gould \
+					| cbm | ns | masscomp | apple | axis | knuth | cray \
+					| microblaze* | sim | cisco \
+					| oki | wec | wrs | winbond)
+						basic_machine=$field1-$field2
+						os=
+						;;
+					*)
+						basic_machine=$field1
+						os=$field2
+						;;
+				esac
+			;;
+		esac
+		;;
+	*)
+		# Convert single-component short-hands not valid as part of
+		# multi-component configurations.
+		case $field1 in
+			386bsd)
+				basic_machine=i386-pc
+				os=bsd
+				;;
+			a29khif)
+				basic_machine=a29k-amd
+				os=udi
+				;;
+			adobe68k)
+				basic_machine=m68010-adobe
+				os=scout
+				;;
+			alliant)
+				basic_machine=fx80-alliant
+				os=
+				;;
+			altos | altos3068)
+				basic_machine=m68k-altos
+				os=
+				;;
+			am29k)
+				basic_machine=a29k-none
+				os=bsd
+				;;
+			amdahl)
+				basic_machine=580-amdahl
+				os=sysv
+				;;
+			amiga)
+				basic_machine=m68k-unknown
+				os=
+				;;
+			amigaos | amigados)
+				basic_machine=m68k-unknown
+				os=amigaos
+				;;
+			amigaunix | amix)
+				basic_machine=m68k-unknown
+				os=sysv4
+				;;
+			apollo68)
+				basic_machine=m68k-apollo
+				os=sysv
+				;;
+			apollo68bsd)
+				basic_machine=m68k-apollo
+				os=bsd
+				;;
+			aros)
+				basic_machine=i386-pc
+				os=aros
+				;;
+			aux)
+				basic_machine=m68k-apple
+				os=aux
+				;;
+			balance)
+				basic_machine=ns32k-sequent
+				os=dynix
+				;;
+			blackfin)
+				basic_machine=bfin-unknown
+				os=linux
+				;;
+			cegcc)
+				basic_machine=arm-unknown
+				os=cegcc
+				;;
+			convex-c1)
+				basic_machine=c1-convex
+				os=bsd
+				;;
+			convex-c2)
+				basic_machine=c2-convex
+				os=bsd
+				;;
+			convex-c32)
+				basic_machine=c32-convex
+				os=bsd
+				;;
+			convex-c34)
+				basic_machine=c34-convex
+				os=bsd
+				;;
+			convex-c38)
+				basic_machine=c38-convex
+				os=bsd
+				;;
+			cray)
+				basic_machine=j90-cray
+				os=unicos
+				;;
+			crds | unos)
+				basic_machine=m68k-crds
+				os=
+				;;
+			da30)
+				basic_machine=m68k-da30
+				os=
+				;;
+			decstation | pmax | pmin | dec3100 | decstatn)
+				basic_machine=mips-dec
+				os=
+				;;
+			delta88)
+				basic_machine=m88k-motorola
+				os=sysv3
+				;;
+			dicos)
+				basic_machine=i686-pc
+				os=dicos
+				;;
+			djgpp)
+				basic_machine=i586-pc
+				os=msdosdjgpp
+				;;
+			ebmon29k)
+				basic_machine=a29k-amd
+				os=ebmon
+				;;
+			es1800 | OSE68k | ose68k | ose | OSE)
+				basic_machine=m68k-ericsson
+				os=ose
+				;;
+			gmicro)
+				basic_machine=tron-gmicro
+				os=sysv
+				;;
+			go32)
+				basic_machine=i386-pc
+				os=go32
+				;;
+			h8300hms)
+				basic_machine=h8300-hitachi
+				os=hms
+				;;
+			h8300xray)
+				basic_machine=h8300-hitachi
+				os=xray
+				;;
+			h8500hms)
+				basic_machine=h8500-hitachi
+				os=hms
+				;;
+			harris)
+				basic_machine=m88k-harris
+				os=sysv3
+				;;
+			hp300)
+				basic_machine=m68k-hp
+				;;
+			hp300bsd)
+				basic_machine=m68k-hp
+				os=bsd
+				;;
+			hp300hpux)
+				basic_machine=m68k-hp
+				os=hpux
+				;;
+			hppaosf)
+				basic_machine=hppa1.1-hp
+				os=osf
+				;;
+			hppro)
+				basic_machine=hppa1.1-hp
+				os=proelf
+				;;
+			i386mach)
+				basic_machine=i386-mach
+				os=mach
+				;;
+			vsta)
+				basic_machine=i386-pc
+				os=vsta
+				;;
+			isi68 | isi)
+				basic_machine=m68k-isi
+				os=sysv
+				;;
+			m68knommu)
+				basic_machine=m68k-unknown
+				os=linux
+				;;
+			magnum | m3230)
+				basic_machine=mips-mips
+				os=sysv
+				;;
+			merlin)
+				basic_machine=ns32k-utek
+				os=sysv
+				;;
+			mingw64)
+				basic_machine=x86_64-pc
+				os=mingw64
+				;;
+			mingw32)
+				basic_machine=i686-pc
+				os=mingw32
+				;;
+			mingw32ce)
+				basic_machine=arm-unknown
+				os=mingw32ce
+				;;
+			monitor)
+				basic_machine=m68k-rom68k
+				os=coff
+				;;
+			morphos)
+				basic_machine=powerpc-unknown
+				os=morphos
+				;;
+			moxiebox)
+				basic_machine=moxie-unknown
+				os=moxiebox
+				;;
+			msdos)
+				basic_machine=i386-pc
+				os=msdos
+				;;
+			msys)
+				basic_machine=i686-pc
+				os=msys
+				;;
+			mvs)
+				basic_machine=i370-ibm
+				os=mvs
+				;;
+			nacl)
+				basic_machine=le32-unknown
+				os=nacl
+				;;
+			ncr3000)
+				basic_machine=i486-ncr
+				os=sysv4
+				;;
+			netbsd386)
+				basic_machine=i386-pc
+				os=netbsd
+				;;
+			netwinder)
+				basic_machine=armv4l-rebel
+				os=linux
+				;;
+			news | news700 | news800 | news900)
+				basic_machine=m68k-sony
+				os=newsos
+				;;
+			news1000)
+				basic_machine=m68030-sony
+				os=newsos
+				;;
+			necv70)
+				basic_machine=v70-nec
+				os=sysv
+				;;
+			nh3000)
+				basic_machine=m68k-harris
+				os=cxux
+				;;
+			nh[45]000)
+				basic_machine=m88k-harris
+				os=cxux
+				;;
+			nindy960)
+				basic_machine=i960-intel
+				os=nindy
+				;;
+			mon960)
+				basic_machine=i960-intel
+				os=mon960
+				;;
+			nonstopux)
+				basic_machine=mips-compaq
+				os=nonstopux
+				;;
+			os400)
+				basic_machine=powerpc-ibm
+				os=os400
+				;;
+			OSE68000 | ose68000)
+				basic_machine=m68000-ericsson
+				os=ose
+				;;
+			os68k)
+				basic_machine=m68k-none
+				os=os68k
+				;;
+			paragon)
+				basic_machine=i860-intel
+				os=osf
+				;;
+			parisc)
+				basic_machine=hppa-unknown
+				os=linux
+				;;
+			pw32)
+				basic_machine=i586-unknown
+				os=pw32
+				;;
+			rdos | rdos64)
+				basic_machine=x86_64-pc
+				os=rdos
+				;;
+			rdos32)
+				basic_machine=i386-pc
+				os=rdos
+				;;
+			rom68k)
+				basic_machine=m68k-rom68k
+				os=coff
+				;;
+			sa29200)
+				basic_machine=a29k-amd
+				os=udi
+				;;
+			sei)
+				basic_machine=mips-sei
+				os=seiux
+				;;
+			sequent)
+				basic_machine=i386-sequent
+				os=
+				;;
+			sps7)
+				basic_machine=m68k-bull
+				os=sysv2
+				;;
+			st2000)
+				basic_machine=m68k-tandem
+				os=
+				;;
+			stratus)
+				basic_machine=i860-stratus
+				os=sysv4
+				;;
+			sun2)
+				basic_machine=m68000-sun
+				os=
+				;;
+			sun2os3)
+				basic_machine=m68000-sun
+				os=sunos3
+				;;
+			sun2os4)
+				basic_machine=m68000-sun
+				os=sunos4
+				;;
+			sun3)
+				basic_machine=m68k-sun
+				os=
+				;;
+			sun3os3)
+				basic_machine=m68k-sun
+				os=sunos3
+				;;
+			sun3os4)
+				basic_machine=m68k-sun
+				os=sunos4
+				;;
+			sun4)
+				basic_machine=sparc-sun
+				os=
+				;;
+			sun4os3)
+				basic_machine=sparc-sun
+				os=sunos3
+				;;
+			sun4os4)
+				basic_machine=sparc-sun
+				os=sunos4
+				;;
+			sun4sol2)
+				basic_machine=sparc-sun
+				os=solaris2
+				;;
+			sun386 | sun386i | roadrunner)
+				basic_machine=i386-sun
+				os=
+				;;
+			sv1)
+				basic_machine=sv1-cray
+				os=unicos
+				;;
+			symmetry)
+				basic_machine=i386-sequent
+				os=dynix
+				;;
+			t3e)
+				basic_machine=alphaev5-cray
+				os=unicos
+				;;
+			t90)
+				basic_machine=t90-cray
+				os=unicos
+				;;
+			toad1)
+				basic_machine=pdp10-xkl
+				os=tops20
+				;;
+			tpf)
+				basic_machine=s390x-ibm
+				os=tpf
+				;;
+			udi29k)
+				basic_machine=a29k-amd
+				os=udi
+				;;
+			ultra3)
+				basic_machine=a29k-nyu
+				os=sym1
+				;;
+			v810 | necv810)
+				basic_machine=v810-nec
+				os=none
+				;;
+			vaxv)
+				basic_machine=vax-dec
+				os=sysv
+				;;
+			vms)
+				basic_machine=vax-dec
+				os=vms
+				;;
+			vxworks960)
+				basic_machine=i960-wrs
+				os=vxworks
+				;;
+			vxworks68)
+				basic_machine=m68k-wrs
+				os=vxworks
+				;;
+			vxworks29k)
+				basic_machine=a29k-wrs
+				os=vxworks
+				;;
+			xbox)
+				basic_machine=i686-pc
+				os=mingw32
+				;;
+			ymp)
+				basic_machine=ymp-cray
+				os=unicos
+				;;
+			*)
+				basic_machine=$1
+				os=
+				;;
+		esac
+		;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+	# Here we handle the default manufacturer of certain CPU types.  It is in
+	# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		cpu=hppa1.1
+		vendor=winbond
+		;;
+	op50n)
+		cpu=hppa1.1
+		vendor=oki
+		;;
+	op60c)
+		cpu=hppa1.1
+		vendor=oki
+		;;
+	ibm*)
+		cpu=i370
+		vendor=ibm
+		;;
+	orion105)
+		cpu=clipper
+		vendor=highlevel
+		;;
+	mac | mpw | mac-mpw)
+		cpu=m68k
+		vendor=apple
+		;;
+	pmac | pmac-mpw)
+		cpu=powerpc
+		vendor=apple
+		;;
+
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		cpu=m68000
+		vendor=att
+		;;
+	3b*)
+		cpu=we32k
+		vendor=att
+		;;
+	bluegene*)
+		cpu=powerpc
+		vendor=ibm
+		os=cnk
+		;;
+	decsystem10* | dec10*)
+		cpu=pdp10
+		vendor=dec
+		os=tops10
+		;;
+	decsystem20* | dec20*)
+		cpu=pdp10
+		vendor=dec
+		os=tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		cpu=m68k
+		vendor=motorola
+		;;
+	dpx2*)
+		cpu=m68k
+		vendor=bull
+		os=sysv3
+		;;
+	encore | umax | mmax)
+		cpu=ns32k
+		vendor=encore
+		;;
+	elxsi)
+		cpu=elxsi
+		vendor=elxsi
+		os=${os:-bsd}
+		;;
+	fx2800)
+		cpu=i860
+		vendor=alliant
+		;;
+	genix)
+		cpu=ns32k
+		vendor=ns
+		;;
+	h3050r* | hiux*)
+		cpu=hppa1.1
+		vendor=hitachi
+		os=hiuxwe2
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		cpu=m68000
+		vendor=hp
+		;;
+	hp9k3[2-9][0-9])
+		cpu=m68k
+		vendor=hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		cpu=hppa1.1
+		vendor=hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		cpu=hppa1.0
+		vendor=hp
+		;;
+	i*86v32)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		os=sysv32
+		;;
+	i*86v4*)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		os=sysv4
+		;;
+	i*86v)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		os=sysv
+		;;
+	i*86sol2)
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		os=solaris2
+		;;
+	j90 | j90-cray)
+		cpu=j90
+		vendor=cray
+		os=${os:-unicos}
+		;;
+	iris | iris4d)
+		cpu=mips
+		vendor=sgi
+		case $os in
+		    irix*)
+			;;
+		    *)
+			os=irix4
+			;;
+		esac
+		;;
+	miniframe)
+		cpu=m68000
+		vendor=convergent
+		;;
+	*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		cpu=m68k
+		vendor=atari
+		os=mint
+		;;
+	news-3600 | risc-news)
+		cpu=mips
+		vendor=sony
+		os=newsos
+		;;
+	next | m*-next)
+		cpu=m68k
+		vendor=next
+		case $os in
+		    openstep*)
+		        ;;
+		    nextstep*)
+			;;
+		    ns2*)
+		      os=nextstep2
+			;;
+		    *)
+		      os=nextstep3
+			;;
+		esac
+		;;
+	np1)
+		cpu=np1
+		vendor=gould
+		;;
+	op50n-* | op60c-*)
+		cpu=hppa1.1
+		vendor=oki
+		os=proelf
+		;;
+	pa-hitachi)
+		cpu=hppa1.1
+		vendor=hitachi
+		os=hiuxwe2
+		;;
+	pbd)
+		cpu=sparc
+		vendor=tti
+		;;
+	pbb)
+		cpu=m68k
+		vendor=tti
+		;;
+	pc532)
+		cpu=ns32k
+		vendor=pc532
+		;;
+	pn)
+		cpu=pn
+		vendor=gould
+		;;
+	power)
+		cpu=power
+		vendor=ibm
+		;;
+	ps2)
+		cpu=i386
+		vendor=ibm
+		;;
+	rm[46]00)
+		cpu=mips
+		vendor=siemens
+		;;
+	rtpc | rtpc-*)
+		cpu=romp
+		vendor=ibm
+		;;
+	sde)
+		cpu=mipsisa32
+		vendor=sde
+		os=${os:-elf}
+		;;
+	simso-wrs)
+		cpu=sparclite
+		vendor=wrs
+		os=vxworks
+		;;
+	tower | tower-32)
+		cpu=m68k
+		vendor=ncr
+		;;
+	vpp*|vx|vx-*)
+		cpu=f301
+		vendor=fujitsu
+		;;
+	w65)
+		cpu=w65
+		vendor=wdc
+		;;
+	w89k-*)
+		cpu=hppa1.1
+		vendor=winbond
+		os=proelf
+		;;
+	none)
+		cpu=none
+		vendor=none
+		;;
+	leon|leon[3-9])
+		cpu=sparc
+		vendor=$basic_machine
+		;;
+	leon-*|leon[3-9]-*)
+		cpu=sparc
+		vendor=`echo "$basic_machine" | sed 's/-.*//'`
+		;;
+
+	*-*)
+		# shellcheck disable=SC2162
+		IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+		;;
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+		cpu=$basic_machine
+		vendor=pc
+		;;
+	# These rules are duplicated from below for sake of the special case above;
+	# i.e. things that normalized to x86 arches should also default to "pc"
+	pc98)
+		cpu=i386
+		vendor=pc
+		;;
+	x64 | amd64)
+		cpu=x86_64
+		vendor=pc
+		;;
+	# Recognize the basic CPU types without company name.
+	*)
+		cpu=$basic_machine
+		vendor=unknown
+		;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+	# Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+	# some cases the only manufacturer, in others, it is the most popular.
+	craynv-unknown)
+		vendor=cray
+		os=${os:-unicosmp}
+		;;
+	c90-unknown | c90-cray)
+		vendor=cray
+		os=${os:-unicos}
+		;;
+	fx80-unknown)
+		vendor=alliant
+		;;
+	romp-unknown)
+		vendor=ibm
+		;;
+	mmix-unknown)
+		vendor=knuth
+		;;
+	microblaze-unknown | microblazeel-unknown)
+		vendor=xilinx
+		;;
+	rs6000-unknown)
+		vendor=ibm
+		;;
+	vax-unknown)
+		vendor=dec
+		;;
+	pdp11-unknown)
+		vendor=dec
+		;;
+	we32k-unknown)
+		vendor=att
+		;;
+	cydra-unknown)
+		vendor=cydrome
+		;;
+	i370-ibm*)
+		vendor=ibm
+		;;
+	orion-unknown)
+		vendor=highlevel
+		;;
+	xps-unknown | xps100-unknown)
+		cpu=xps100
+		vendor=honeywell
+		;;
+
+	# Here we normalize CPU types with a missing or matching vendor
+	dpx20-unknown | dpx20-bull)
+		cpu=rs6000
+		vendor=bull
+		os=${os:-bosx}
+		;;
+
+	# Here we normalize CPU types irrespective of the vendor
+	amd64-*)
+		cpu=x86_64
+		;;
+	blackfin-*)
+		cpu=bfin
+		os=linux
+		;;
+	c54x-*)
+		cpu=tic54x
+		;;
+	c55x-*)
+		cpu=tic55x
+		;;
+	c6x-*)
+		cpu=tic6x
+		;;
+	e500v[12]-*)
+		cpu=powerpc
+		os=$os"spe"
+		;;
+	mips3*-*)
+		cpu=mips64
+		;;
+	ms1-*)
+		cpu=mt
+		;;
+	m68knommu-*)
+		cpu=m68k
+		os=linux
+		;;
+	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+		cpu=s12z
+		;;
+	openrisc-*)
+		cpu=or32
+		;;
+	parisc-*)
+		cpu=hppa
+		os=linux
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		cpu=i586
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+		cpu=i686
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		cpu=i686
+		;;
+	pentium4-*)
+		cpu=i786
+		;;
+	pc98-*)
+		cpu=i386
+		;;
+	ppc-* | ppcbe-*)
+		cpu=powerpc
+		;;
+	ppcle-* | powerpclittle-*)
+		cpu=powerpcle
+		;;
+	ppc64-*)
+		cpu=powerpc64
+		;;
+	ppc64le-* | powerpc64little-*)
+		cpu=powerpc64le
+		;;
+	sb1-*)
+		cpu=mipsisa64sb1
+		;;
+	sb1el-*)
+		cpu=mipsisa64sb1el
+		;;
+	sh5e[lb]-*)
+		cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+		;;
+	spur-*)
+		cpu=spur
+		;;
+	strongarm-* | thumb-*)
+		cpu=arm
+		;;
+	tx39-*)
+		cpu=mipstx39
+		;;
+	tx39el-*)
+		cpu=mipstx39el
+		;;
+	x64-*)
+		cpu=x86_64
+		;;
+	xscale-* | xscalee[bl]-*)
+		cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+		;;
+
+	# Recognize the canonical CPU Types that limit and/or modify the
+	# company names they are paired with.
+	cr16-*)
+		os=${os:-elf}
+		;;
+	crisv32-* | etraxfs*-*)
+		cpu=crisv32
+		vendor=axis
+		;;
+	cris-* | etrax*-*)
+		cpu=cris
+		vendor=axis
+		;;
+	crx-*)
+		os=${os:-elf}
+		;;
+	neo-tandem)
+		cpu=neo
+		vendor=tandem
+		;;
+	nse-tandem)
+		cpu=nse
+		vendor=tandem
+		;;
+	nsr-tandem)
+		cpu=nsr
+		vendor=tandem
+		;;
+	nsv-tandem)
+		cpu=nsv
+		vendor=tandem
+		;;
+	nsx-tandem)
+		cpu=nsx
+		vendor=tandem
+		;;
+	s390-*)
+		cpu=s390
+		vendor=ibm
+		;;
+	s390x-*)
+		cpu=s390x
+		vendor=ibm
+		;;
+	tile*-*)
+		os=${os:-linux-gnu}
+		;;
+
+	*)
+		# Recognize the canonical CPU types that are allowed with any
+		# company name.
+		case $cpu in
+			1750a | 580 \
+			| a29k \
+			| aarch64 | aarch64_be \
+			| abacus \
+			| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+			| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+			| alphapca5[67] | alpha64pca5[67] \
+			| am33_2.0 \
+			| amdgcn \
+			| arc | arceb \
+			| arm  | arm[lb]e | arme[lb] | armv* \
+			| avr | avr32 \
+			| asmjs \
+			| ba \
+			| be32 | be64 \
+			| bfin | bs2000 \
+			| c[123]* | c30 | [cjt]90 | c4x \
+			| c8051 | clipper | craynv | csky | cydra \
+			| d10v | d30v | dlx | dsp16xx \
+			| e2k | elxsi | epiphany \
+			| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+			| h8300 | h8500 \
+			| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+			| hexagon \
+			| i370 | i*86 | i860 | i960 | ia16 | ia64 \
+			| ip2k | iq2000 \
+			| k1om \
+			| le32 | le64 \
+			| lm32 \
+			| m32c | m32r | m32rle \
+			| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+			| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+			| m88110 | m88k | maxq | mb | mcore | mep | metag \
+			| microblaze | microblazeel \
+			| mips | mipsbe | mipseb | mipsel | mipsle \
+			| mips16 \
+			| mips64 | mips64eb | mips64el \
+			| mips64octeon | mips64octeonel \
+			| mips64orion | mips64orionel \
+			| mips64r5900 | mips64r5900el \
+			| mips64vr | mips64vrel \
+			| mips64vr4100 | mips64vr4100el \
+			| mips64vr4300 | mips64vr4300el \
+			| mips64vr5000 | mips64vr5000el \
+			| mips64vr5900 | mips64vr5900el \
+			| mipsisa32 | mipsisa32el \
+			| mipsisa32r2 | mipsisa32r2el \
+			| mipsisa32r6 | mipsisa32r6el \
+			| mipsisa64 | mipsisa64el \
+			| mipsisa64r2 | mipsisa64r2el \
+			| mipsisa64r6 | mipsisa64r6el \
+			| mipsisa64sb1 | mipsisa64sb1el \
+			| mipsisa64sr71k | mipsisa64sr71kel \
+			| mipsr5900 | mipsr5900el \
+			| mipstx39 | mipstx39el \
+			| mmix \
+			| mn10200 | mn10300 \
+			| moxie \
+			| mt \
+			| msp430 \
+			| nds32 | nds32le | nds32be \
+			| nfp \
+			| nios | nios2 | nios2eb | nios2el \
+			| none | np1 | ns16k | ns32k | nvptx \
+			| open8 \
+			| or1k* \
+			| or32 \
+			| orion \
+			| picochip \
+			| pdp10 | pdp11 | pj | pjl | pn | power \
+			| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+			| pru \
+			| pyramid \
+			| riscv | riscv32 | riscv64 \
+			| rl78 | romp | rs6000 | rx \
+			| score \
+			| sh | shl \
+			| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+			| sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+			| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+			| sparclite \
+			| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+			| spu \
+			| tahoe \
+			| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+			| tron \
+			| ubicom32 \
+			| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+			| vax \
+			| visium \
+			| w65 \
+			| wasm32 | wasm64 \
+			| we32k \
+			| x86 | x86_64 | xc16x | xgate | xps100 \
+			| xstormy16 | xtensa* \
+			| ymp \
+			| z8k | z80)
+				;;
+
+			*)
+				echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+				exit 1
+				;;
+		esac
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+	digital*)
+		vendor=dec
+		;;
+	commodore*)
+		vendor=cbm
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x$os != x ]
+then
+case $os in
+	# First match some system type aliases that might get confused
+	# with valid system types.
+	# solaris* is a basic system type, with this one exception.
+	auroraux)
+		os=auroraux
+		;;
+	bluegene*)
+		os=cnk
+		;;
+	solaris1 | solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	solaris)
+		os=solaris2
+		;;
+	unixware*)
+		os=sysv4.2uw
+		;;
+	gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# es1800 is here to avoid being matched by es* (a different OS)
+	es1800*)
+		os=ose
+		;;
+	# Some version numbers need modification
+	chorusos*)
+		os=chorusos
+		;;
+	isc)
+		os=isc2.2
+		;;
+	sco6)
+		os=sco5v6
+		;;
+	sco5)
+		os=sco3.2v5
+		;;
+	sco4)
+		os=sco3.2v4
+		;;
+	sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		;;
+	sco3.2v[4-9]* | sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		;;
+	scout)
+		# Don't match below
+		;;
+	sco*)
+		os=sco3.2v2
+		;;
+	psos*)
+		os=psos
+		;;
+	# Now accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST end in a * to match a version number.
+	# sysv* is not here because it comes later, after sysvr4.
+	gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\
+	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+	     | sym* | kopensolaris* | plan9* \
+	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+	     | aos* | aros* | cloudabi* | sortix* \
+	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+	     | knetbsd* | mirbsd* | netbsd* \
+	     | bitrig* | openbsd* | solidbsd* | libertybsd* \
+	     | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \
+	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+	     | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \
+	     | chorusrdb* | cegcc* | glidix* \
+	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+	     | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \
+	     | linux-newlib* | linux-musl* | linux-uclibc* \
+	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+	     | interix* | uwin* | mks* | rhapsody* | darwin* \
+	     | openstep* | oskit* | conix* | pw32* | nonstopux* \
+	     | storm-chaos* | tops10* | tenex* | tops20* | its* \
+	     | os2* | vos* | palmos* | uclinux* | nucleus* \
+	     | morphos* | superux* | rtmk* | windiss* \
+	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	qnx*)
+		case $cpu in
+		    x86 | i*86)
+			;;
+		    *)
+			os=nto-$os
+			;;
+		esac
+		;;
+	hiux*)
+		os=hiuxwe2
+		;;
+	nto-qnx*)
+		;;
+	nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	sim | xray | os68k* | v88r* \
+	    | windows* | osx | abug | netware* | os9* \
+	    | macos* | mpw* | magic* | mmixware* | mon960* | lnews*)
+		;;
+	linux-dietlibc)
+		os=linux-dietlibc
+		;;
+	linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	lynx*178)
+		os=lynxos178
+		;;
+	lynx*5)
+		os=lynxos5
+		;;
+	lynx*)
+		os=lynxos
+		;;
+	mac*)
+		os=`echo "$os" | sed -e 's|mac|macos|'`
+		;;
+	opened*)
+		os=openedition
+		;;
+	os400*)
+		os=os400
+		;;
+	sunos5*)
+		os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+		;;
+	sunos6*)
+		os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+		;;
+	wince*)
+		os=wince
+		;;
+	utek*)
+		os=bsd
+		;;
+	dynix*)
+		os=bsd
+		;;
+	acis*)
+		os=aos
+		;;
+	atheos*)
+		os=atheos
+		;;
+	syllable*)
+		os=syllable
+		;;
+	386bsd)
+		os=bsd
+		;;
+	ctix* | uts*)
+		os=sysv
+		;;
+	nova*)
+		os=rtmk-nova
+		;;
+	ns2)
+		os=nextstep2
+		;;
+	nsk*)
+		os=nsk
+		;;
+	# Preserve the version number of sinix5.
+	sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	sinix*)
+		os=sysv4
+		;;
+	tpf*)
+		os=tpf
+		;;
+	triton*)
+		os=sysv3
+		;;
+	oss*)
+		os=sysv3
+		;;
+	svr4*)
+		os=sysv4
+		;;
+	svr3)
+		os=sysv3
+		;;
+	sysvr4)
+		os=sysv4
+		;;
+	# This must come after sysvr4.
+	sysv*)
+		;;
+	ose*)
+		os=ose
+		;;
+	*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+		os=mint
+		;;
+	zvmoe)
+		os=zvmoe
+		;;
+	dicos*)
+		os=dicos
+		;;
+	pikeos*)
+		# Until real need of OS specific support for
+		# particular features comes up, bare metal
+		# configurations are quite functional.
+		case $cpu in
+		    arm*)
+			os=eabi
+			;;
+		    *)
+			os=elf
+			;;
+		esac
+		;;
+	nacl*)
+		;;
+	ios)
+		;;
+	none)
+		;;
+	*-eabi)
+		;;
+	*)
+		echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $cpu-$vendor in
+	score-*)
+		os=elf
+		;;
+	spu-*)
+		os=elf
+		;;
+	*-acorn)
+		os=riscix1.2
+		;;
+	arm*-rebel)
+		os=linux
+		;;
+	arm*-semi)
+		os=aout
+		;;
+	c4x-* | tic4x-*)
+		os=coff
+		;;
+	c8051-*)
+		os=elf
+		;;
+	clipper-intergraph)
+		os=clix
+		;;
+	hexagon-*)
+		os=elf
+		;;
+	tic54x-*)
+		os=coff
+		;;
+	tic55x-*)
+		os=coff
+		;;
+	tic6x-*)
+		os=coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=tops20
+		;;
+	pdp11-*)
+		os=none
+		;;
+	*-dec | vax-*)
+		os=ultrix4.2
+		;;
+	m68*-apollo)
+		os=domain
+		;;
+	i386-sun)
+		os=sunos4.0.2
+		;;
+	m68000-sun)
+		os=sunos3
+		;;
+	m68*-cisco)
+		os=aout
+		;;
+	mep-*)
+		os=elf
+		;;
+	mips*-cisco)
+		os=elf
+		;;
+	mips*-*)
+		os=elf
+		;;
+	or32-*)
+		os=coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=sysv3
+		;;
+	sparc-* | *-sun)
+		os=sunos4.1.1
+		;;
+	pru-*)
+		os=elf
+		;;
+	*-be)
+		os=beos
+		;;
+	*-ibm)
+		os=aix
+		;;
+	*-knuth)
+		os=mmixware
+		;;
+	*-wec)
+		os=proelf
+		;;
+	*-winbond)
+		os=proelf
+		;;
+	*-oki)
+		os=proelf
+		;;
+	*-hp)
+		os=hpux
+		;;
+	*-hitachi)
+		os=hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=sysv
+		;;
+	*-cbm)
+		os=amigaos
+		;;
+	*-dg)
+		os=dgux
+		;;
+	*-dolphin)
+		os=sysv3
+		;;
+	m68k-ccur)
+		os=rtu
+		;;
+	m88k-omron*)
+		os=luna
+		;;
+	*-next)
+		os=nextstep
+		;;
+	*-sequent)
+		os=ptx
+		;;
+	*-crds)
+		os=unos
+		;;
+	*-ns)
+		os=genix
+		;;
+	i370-*)
+		os=mvs
+		;;
+	*-gould)
+		os=sysv
+		;;
+	*-highlevel)
+		os=bsd
+		;;
+	*-encore)
+		os=bsd
+		;;
+	*-sgi)
+		os=irix
+		;;
+	*-siemens)
+		os=sysv4
+		;;
+	*-masscomp)
+		os=rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=uxpv
+		;;
+	*-rom68k)
+		os=coff
+		;;
+	*-*bug)
+		os=coff
+		;;
+	*-apple)
+		os=macos
+		;;
+	*-atari*)
+		os=mint
+		;;
+	*-wrs)
+		os=vxworks
+		;;
+	*)
+		os=none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+case $vendor in
+	unknown)
+		case $os in
+			riscix*)
+				vendor=acorn
+				;;
+			sunos*)
+				vendor=sun
+				;;
+			cnk*|-aix*)
+				vendor=ibm
+				;;
+			beos*)
+				vendor=be
+				;;
+			hpux*)
+				vendor=hp
+				;;
+			mpeix*)
+				vendor=hp
+				;;
+			hiux*)
+				vendor=hitachi
+				;;
+			unos*)
+				vendor=crds
+				;;
+			dgux*)
+				vendor=dg
+				;;
+			luna*)
+				vendor=omron
+				;;
+			genix*)
+				vendor=ns
+				;;
+			clix*)
+				vendor=intergraph
+				;;
+			mvs* | opened*)
+				vendor=ibm
+				;;
+			os400*)
+				vendor=ibm
+				;;
+			ptx*)
+				vendor=sequent
+				;;
+			tpf*)
+				vendor=ibm
+				;;
+			vxsim* | vxworks* | windiss*)
+				vendor=wrs
+				;;
+			aux*)
+				vendor=apple
+				;;
+			hms*)
+				vendor=hitachi
+				;;
+			mpw* | macos*)
+				vendor=apple
+				;;
+			*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+				vendor=atari
+				;;
+			vos*)
+				vendor=stratus
+				;;
+		esac
+		;;
+esac
+
+echo "$cpu-$vendor-$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/gawk-5.0.1/extension/build-aux/depcomp b/gawk-5.0.1/extension/build-aux/depcomp
new file mode 100755
index 00000000000..65cbf7093a1
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2018 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='	'
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gawk-5.0.1/extension/build-aux/install-sh b/gawk-5.0.1/extension/build-aux/install-sh
new file mode 100755
index 00000000000..8175c640fe6
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/install-sh
@@ -0,0 +1,518 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2018-03-11.20; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab='	'
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
+
+    -o) chowncmd="$chownprog $2"
+        shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
+
+    -T) is_target_a_directory=never;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --) shift
+        break;;
+
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename.
+    if test -d "$dst"; then
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
+      fi
+      dstdir=$dst
+      dstbase=`basename "$src"`
+      case $dst in
+	*/) dst=$dst$dstbase;;
+	*)  dst=$dst/$dstbase;;
+      esac
+      dstdir_status=0
+    else
+      dstdir=`dirname "$dst"`
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  case $dstdir in
+    */) dstdirslash=$dstdir;;
+    *)  dstdirslash=$dstdir/;;
+  esac
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
+            # here however when possible just to lower collision chance.
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # Because "mkdir -p" follows existing symlinks and we likely work
+            # directly in world-writeable /tmp, make sure that the '$tmpdir'
+            # directory is successfully created first before we actually test
+            # 'mkdir -p' feature.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      set -f
+      set fnord $dstdir
+      shift
+      set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=${dstdirslash}_inst.$$_
+    rmtmp=${dstdirslash}_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       set +f &&
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gawk-5.0.1/extension/build-aux/ltmain.sh b/gawk-5.0.1/extension/build-aux/ltmain.sh
new file mode 100644
index 00000000000..147d758abcb
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/ltmain.sh
@@ -0,0 +1,11156 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+##               by inline-source v2014-01-03.01
+
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.6 Debian-2.4.6-0.1"
+package_revision=2.4.6
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+#   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
+fi
+
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test set = \"\${$_G_var+set}\"; then
+          save_$_G_var=\$$_G_var
+          $_G_var=C
+	  export $_G_var
+	  _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+	  _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
+	fi"
+done
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp	$nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+    test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+    _G_progs_list=$1
+    _G_check_func=$2
+    _G_PATH=${3-"$PATH"}
+
+    _G_path_prog_max=0
+    _G_path_prog_found=false
+    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+    for _G_dir in $_G_PATH; do
+      IFS=$_G_save_IFS
+      test -z "$_G_dir" && _G_dir=.
+      for _G_prog_name in $_G_progs_list; do
+        for _exeext in '' .EXE; do
+          _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+          func_executable_p "$_G_path_prog" || continue
+          case `"$_G_path_prog" --version 2>&1` in
+            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+            *)     $_G_check_func $_G_path_prog
+		   func_path_progs_result=$func_check_prog_result
+		   ;;
+          esac
+          $_G_path_prog_found && break 3
+        done
+      done
+    done
+    IFS=$_G_save_IFS
+    test -z "$func_path_progs_result" && {
+      echo "no acceptable sed could be found in \$PATH" >&2
+      exit 1
+    }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+  for _G_i in 1 2 3 4 5 6 7; do
+    _G_sed_script=$_G_sed_script$nl$_G_sed_script
+  done
+  echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+  _G_sed_script=
+
+  func_check_prog_sed ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo '' >> conftest.nl
+      "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+  rm -f conftest.sed
+  SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+  func_check_prog_grep ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    _G_path_prog_max=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo 'GREP' >> conftest.nl
+      "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+  GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables.  These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
+
+: ${CP="cp -f"}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+
+
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
+
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
+
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
+
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same.  If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion.  Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+  s/$_G_bs4/&\\
+/g
+  s/^$_G_bs2$_G_dollar/$_G_bs&/
+  s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+  s/\n//g"
+
+
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
+
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
+
+# By convention, finish your script with:
+#
+#    exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
+
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
+
+# Make sure we have an absolute progpath for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
+     progdir=`cd "$progdir" && pwd`
+     progpath=$progdir/$progname
+     ;;
+  *)
+     _G_IFS=$IFS
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS=$_G_IFS
+       test -x "$progdir/$progname" && break
+     done
+     IFS=$_G_IFS
+     test -n "$progdir" || progdir=`pwd`
+     progpath=$progdir/$progname
+     ;;
+esac
+
+
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
+
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
+
+opt_dry_run=false
+opt_quiet=false
+opt_verbose=false
+
+# Categories 'all' and 'none' are always available.  Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
+
+# By default, display warnings according to 'opt_warning_types'.  Set
+# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
+
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
+
+
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
+
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
+
+
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
+{
+    $debug_cmd
+
+    test -t 1 && {
+      # COLORTERM and USE_ANSI_COLORS environment variables take
+      # precedence, because most terminfo databases neglect to describe
+      # whether color sequences are supported.
+      test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+      if test 1 = "$USE_ANSI_COLORS"; then
+        # Standard ANSI escape sequences
+        tc_reset='[0m'
+        tc_bold='[1m';   tc_standout='[7m'
+        tc_red='[31m';   tc_green='[32m'
+        tc_blue='[34m';  tc_cyan='[36m'
+      else
+        # Otherwise trust the terminfo database after all.
+        test -n "`tput sgr0 2>/dev/null`" && {
+          tc_reset=`tput sgr0`
+          test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+          tc_standout=$tc_bold
+          test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+          test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+          test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+          test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+          test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+        }
+      fi
+    }
+
+    require_term_colors=:
+}
+
+
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+  # We should try to minimise forks, especially on Windows where they are
+  # unreasonably slow, so skip the feature probes when bash or zsh are
+  # being used:
+  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+    : ${_G_HAVE_ARITH_OP="yes"}
+    : ${_G_HAVE_XSI_OPS="yes"}
+    # The += operator was introduced in bash 3.1
+    case $BASH_VERSION in
+      [12].* | 3.0 | 3.0*) ;;
+      *)
+        : ${_G_HAVE_PLUSEQ_OP="yes"}
+        ;;
+    esac
+  fi
+
+  # _G_HAVE_PLUSEQ_OP
+  # Can be empty, in which case the shell is probed, "yes" if += is
+  # useable or anything else if it does not work.
+  test -z "$_G_HAVE_PLUSEQ_OP" \
+    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+    && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_append ()
+  {
+    $debug_cmd
+
+    eval "$1+=\$2"
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_append ()
+  {
+    $debug_cmd
+
+    eval "$1=\$$1\$2"
+  }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+  eval 'func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1+=\\ \$func_quote_for_eval_result"
+  }'
+else
+  func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1=\$$1\\ \$func_quote_for_eval_result"
+  }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE.  For example:
+#
+#   func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+    $debug_cmd
+
+    eval _G_current_value='`$ECHO $'$1'`'
+    _G_delim=`expr "$2" : '\(.\)'`
+
+    case $_G_delim$_G_current_value$_G_delim in
+      *"$2$_G_delim"*) ;;
+      *) func_append "$@" ;;
+    esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+  test -z "$_G_HAVE_ARITH_OP" \
+    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+    && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+  eval 'func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=$(( $* ))
+  }'
+else
+  func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=`expr "$@"`
+  }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  # If this shell supports suffix pattern removal, then use it to avoid
+  # forking. Hide the definitions single quotes in case the shell chokes
+  # on unsupported syntax...
+  _b='func_basename_result=${1##*/}'
+  _d='case $1 in
+        */*) func_dirname_result=${1%/*}$2 ;;
+        *  ) func_dirname_result=$3        ;;
+      esac'
+
+else
+  # ...otherwise fall back to using sed.
+  _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+  _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
+      if test "X$func_dirname_result" = "X$1"; then
+        func_dirname_result=$3
+      else
+        func_append func_dirname_result "$2"
+      fi'
+fi
+
+eval 'func_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+    $debug_cmd
+
+    '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+    '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    _G_infix=$1; shift
+    _G_indent=$_G_infix
+    _G_prefix="$progname: $_G_infix: "
+    _G_message=$*
+
+    # Strip color escape sequences before counting printable length
+    for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+    do
+      test -n "$_G_tc" && {
+        _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+        _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+      }
+    done
+    _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes
+
+    func_echo_infix_1_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_infix_1_IFS
+      $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+      _G_prefix=$_G_indent
+    done
+    IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    $debug_cmd
+
+    func_error "$*"
+    exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $debug_cmd
+
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+  test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=${#1}
+  }'
+else
+  func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+  }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    $debug_cmd
+
+    _G_directory_path=$1
+    _G_dir_list=
+
+    if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
+
+      # Protect directory names starting with '-'
+      case $_G_directory_path in
+        -*) _G_directory_path=./$_G_directory_path ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$_G_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        _G_dir_list=$_G_directory_path:$_G_dir_list
+
+        # If the last portion added has no slash in it, the list is done
+        case $_G_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
+      done
+      _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
+
+      func_mkdir_p_IFS=$IFS; IFS=:
+      for _G_dir in $_G_dir_list; do
+	IFS=$func_mkdir_p_IFS
+        # mkdir can fail with a 'File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$_G_dir" 2>/dev/null || :
+      done
+      IFS=$func_mkdir_p_IFS
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$_G_directory_path" || \
+        func_fatal_error "Failed to create '$1'"
+    fi
+}
+
+
+# func_mktempdir [BASENAME]
+# -------------------------
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, BASENAME is the basename for that directory.
+func_mktempdir ()
+{
+    $debug_cmd
+
+    _G_template=${TMPDIR-/tmp}/${1-$progname}
+
+    if test : = "$opt_dry_run"; then
+      # Return a directory name, but don't create it in dry-run mode
+      _G_tmpdir=$_G_template-$$
+    else
+
+      # If mktemp works, use that first and foremost
+      _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$_G_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        _G_tmpdir=$_G_template-${RANDOM-0}$$
+
+        func_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$_G_tmpdir"
+        umask $func_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$_G_tmpdir" || \
+        func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
+    fi
+
+    $ECHO "$_G_tmpdir"
+}
+
+
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
+{
+    $debug_cmd
+
+    # These SED scripts presuppose an absolute path with a trailing slash.
+    _G_pathcar='s|^/\([^/]*\).*$|\1|'
+    _G_pathcdr='s|^/[^/]*||'
+    _G_removedotparts=':dotsl
+		s|/\./|/|g
+		t dotsl
+		s|/\.$|/|'
+    _G_collapseslashes='s|/\{1,\}|/|g'
+    _G_finalslash='s|/*$|/|'
+
+    # Start from root dir and reassemble the path.
+    func_normal_abspath_result=
+    func_normal_abspath_tpath=$1
+    func_normal_abspath_altnamespace=
+    case $func_normal_abspath_tpath in
+      "")
+        # Empty path, that just means $cwd.
+        func_stripname '' '/' "`pwd`"
+        func_normal_abspath_result=$func_stripname_result
+        return
+        ;;
+      # The next three entries are used to spot a run of precisely
+      # two leading slashes without using negated character classes;
+      # we take advantage of case's first-match behaviour.
+      ///*)
+        # Unusual form of absolute path, do nothing.
+        ;;
+      //*)
+        # Not necessarily an ordinary path; POSIX reserves leading '//'
+        # and for example Cygwin uses it to access remote file shares
+        # over CIFS/SMB, so we conserve a leading double slash if found.
+        func_normal_abspath_altnamespace=/
+        ;;
+      /*)
+        # Absolute path, do nothing.
+        ;;
+      *)
+        # Relative path, prepend $cwd.
+        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+        ;;
+    esac
+
+    # Cancel out all the simple stuff to save iterations.  We also want
+    # the path to end with a slash for ease of parsing, so make sure
+    # there is one (and only one) here.
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+    while :; do
+      # Processed it all yet?
+      if test / = "$func_normal_abspath_tpath"; then
+        # If we ascended to the root using ".." the result may be empty now.
+        if test -z "$func_normal_abspath_result"; then
+          func_normal_abspath_result=/
+        fi
+        break
+      fi
+      func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcar"`
+      func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcdr"`
+      # Figure out what to do with it
+      case $func_normal_abspath_tcomponent in
+        "")
+          # Trailing empty path component, ignore it.
+          ;;
+        ..)
+          # Parent dir; strip last assembled component from result.
+          func_dirname "$func_normal_abspath_result"
+          func_normal_abspath_result=$func_dirname_result
+          ;;
+        *)
+          # Actual path component, append it.
+          func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+          ;;
+      esac
+    done
+    # Restore leading double-slash if one was found on entry.
+    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+    $debug_cmd
+
+    $opt_quiet || func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+    $debug_cmd
+
+    func_relative_path_result=
+    func_normal_abspath "$1"
+    func_relative_path_tlibdir=$func_normal_abspath_result
+    func_normal_abspath "$2"
+    func_relative_path_tbindir=$func_normal_abspath_result
+
+    # Ascend the tree starting from libdir
+    while :; do
+      # check if we have found a prefix of bindir
+      case $func_relative_path_tbindir in
+        $func_relative_path_tlibdir)
+          # found an exact match
+          func_relative_path_tcancelled=
+          break
+          ;;
+        $func_relative_path_tlibdir*)
+          # found a matching prefix
+          func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+          func_relative_path_tcancelled=$func_stripname_result
+          if test -z "$func_relative_path_result"; then
+            func_relative_path_result=.
+          fi
+          break
+          ;;
+        *)
+          func_dirname $func_relative_path_tlibdir
+          func_relative_path_tlibdir=$func_dirname_result
+          if test -z "$func_relative_path_tlibdir"; then
+            # Have to descend all the way to the root!
+            func_relative_path_result=../$func_relative_path_result
+            func_relative_path_tcancelled=$func_relative_path_tbindir
+            break
+          fi
+          func_relative_path_result=../$func_relative_path_result
+          ;;
+      esac
+    done
+
+    # Now calculate path; take care to avoid doubling-up slashes.
+    func_stripname '' '/' "$func_relative_path_result"
+    func_relative_path_result=$func_stripname_result
+    func_stripname '/' '/' "$func_relative_path_tcancelled"
+    if test -n "$func_stripname_result"; then
+      func_append func_relative_path_result "/$func_stripname_result"
+    fi
+
+    # Normalisation. If bindir is libdir, return '.' else relative path.
+    if test -n "$func_relative_path_result"; then
+      func_stripname './' '' "$func_relative_path_result"
+      func_relative_path_result=$func_stripname_result
+    fi
+
+    test -n "$func_relative_path_result" || func_relative_path_result=.
+
+    :
+}
+
+
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+#   i) func_quote_for_eval_result
+#      double-quoted, suitable for a subsequent eval
+#  ii) func_quote_for_eval_unquoted_result
+#      has all characters that are still active within double
+#      quotes backslashified.
+func_quote_for_eval ()
+{
+    $debug_cmd
+
+    func_quote_for_eval_unquoted_result=
+    func_quote_for_eval_result=
+    while test 0 -lt $#; do
+      case $1 in
+        *[\\\`\"\$]*)
+	  _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+        *)
+          _G_unquoted_arg=$1 ;;
+      esac
+      if test -n "$func_quote_for_eval_unquoted_result"; then
+	func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+      else
+        func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+      fi
+
+      case $_G_unquoted_arg in
+        # Double-quote args containing shell metacharacters to delay
+        # word splitting, command substitution and variable expansion
+        # for a subsequent eval.
+        # Many Bourne shells cannot handle close brackets correctly
+        # in scan sets, so we specify it separately.
+        *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+          _G_quoted_arg=\"$_G_unquoted_arg\"
+          ;;
+        *)
+          _G_quoted_arg=$_G_unquoted_arg
+	  ;;
+      esac
+
+      if test -n "$func_quote_for_eval_result"; then
+	func_append func_quote_for_eval_result " $_G_quoted_arg"
+      else
+        func_append func_quote_for_eval_result "$_G_quoted_arg"
+      fi
+      shift
+    done
+}
+
+
+# func_quote_for_expand ARG
+# -------------------------
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    $debug_cmd
+
+    case $1 in
+      *[\\\`\"]*)
+	_G_arg=`$ECHO "$1" | $SED \
+	    -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        _G_arg=$1 ;;
+    esac
+
+    case $_G_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        _G_arg=\"$_G_arg\"
+        ;;
+    esac
+
+    func_quote_for_expand_result=$_G_arg
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_stripname ()
+  {
+    $debug_cmd
+
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary variable first.
+    func_stripname_result=$3
+    func_stripname_result=${func_stripname_result#"$1"}
+    func_stripname_result=${func_stripname_result%"$2"}
+  }'
+else
+  func_stripname ()
+  {
+    $debug_cmd
+
+    case $2 in
+      .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+      *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+    esac
+  }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    func_quote_for_expand "$_G_cmd"
+    eval "func_notquiet $func_quote_for_expand_result"
+
+    $opt_dry_run || {
+      eval "$_G_cmd"
+      _G_status=$?
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    $opt_quiet || {
+      func_quote_for_expand "$_G_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    $opt_dry_run || {
+      eval "$_G_user_locale
+	    $_G_cmd"
+      _G_status=$?
+      eval "$_G_safe_locale"
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_tr_sh
+# ----------
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+    $debug_cmd
+
+    case $1 in
+    [0-9]* | *[!a-zA-Z0-9_]*)
+      func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+      ;;
+    * )
+      func_tr_sh_result=$1
+      ;;
+    esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $debug_cmd
+
+    $opt_verbose && func_echo "$*"
+
+    :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+    $debug_cmd
+
+    # CATEGORY must be in the warning_categories list!
+    case " $warning_categories " in
+      *" $1 "*) ;;
+      *) func_internal_error "invalid warning category '$1'" ;;
+    esac
+
+    _G_category=$1
+    shift
+
+    case " $opt_warning_types " in
+      *" $_G_category "*) $warning_func ${1+"$@"} ;;
+    esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+    $debug_cmd
+
+    printf '%s\n%s\n' "$1" "$2" \
+      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false.  Use it like this:
+#
+#  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+    $debug_cmd
+
+    test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# Set a version string for this script.
+scriptversion=2014-01-07.03; # UTC
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary@gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+#   #!/bin/sh
+#   . relative/path/to/funclib.sh
+#   . relative/path/to/options-parser
+#   scriptversion=1.0
+#   func_options ${1+"$@"}
+#   eval set dummy "$func_options_result"; shift
+#   ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# warranty; '.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'.  Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+       --debug        enable verbose shell tracing
+   -W, --warnings=CATEGORY
+                      report the warnings falling in CATEGORY [all]
+   -v, --verbose      verbosely report processing
+       --version      print version information and exit
+   -h, --help         print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+       'all'          show all warnings
+       'none'         turn off all the warnings
+       'error'        warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# to the main code.  A hook is just a named list of of function, that can
+# be run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+    $debug_cmd
+
+    func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not accept hook functions." ;;
+    esac
+
+    eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+    $debug_cmd
+
+    eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It is assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+    esac
+
+    eval _G_hook_fns=\$$1_hooks; shift
+
+    for _G_hook in $_G_hook_fns; do
+      eval $_G_hook '"$@"'
+
+      # store returned options list back into positional
+      # parameters for next 'cmd' execution.
+      eval _G_hook_result=\$${_G_hook}_result
+      eval set dummy "$_G_hook_result"; shift
+    done
+
+    func_quote_for_eval ${1+"$@"}
+    func_run_hooks_result=$func_quote_for_eval_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'.  Like this:
+#
+#    my_options_prep ()
+#    {
+#        $debug_cmd
+#
+#        # Extend the existing usage message.
+#        usage_message=$usage_message'
+#      -s, --silent       don'\''t print informational messages
+#    '
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_options_prep_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_options_prep my_options_prep
+#
+#
+#    my_silent_option ()
+#    {
+#        $debug_cmd
+#
+#        # Note that for efficiency, we parse as many options as we can
+#        # recognise in a loop before passing the remainder back to the
+#        # caller on the first unrecognised argument we encounter.
+#        while test $# -gt 0; do
+#          opt=$1; shift
+#          case $opt in
+#            --silent|-s) opt_silent=: ;;
+#            # Separate non-argument short options:
+#            -s*)         func_split_short_opt "$_G_opt"
+#                         set dummy "$func_split_short_opt_name" \
+#                             "-$func_split_short_opt_arg" ${1+"$@"}
+#                         shift
+#                         ;;
+#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
+#          esac
+#        done
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_silent_option_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_parse_options my_silent_option
+#
+#
+#    my_option_validation ()
+#    {
+#        $debug_cmd
+#
+#        $opt_silent && $opt_verbose && func_fatal_help "\
+#    '--silent' and '--verbose' options are mutually exclusive."
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_option_validation_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_validate_options my_option_validation
+#
+# You'll alse need to manually amend $usage_message to reflect the extra
+# options you parse.  It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
+{
+    $debug_cmd
+
+    func_options_prep ${1+"$@"}
+    eval func_parse_options \
+        ${func_options_prep_result+"$func_options_prep_result"}
+    eval func_validate_options \
+        ${func_parse_options_result+"$func_parse_options_result"}
+
+    eval func_run_hooks func_options \
+        ${func_validate_options_result+"$func_validate_options_result"}
+
+    # save modified positional parameters for caller
+    func_options_result=$func_run_hooks_result
+}
+
+
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters.  If a hook function modifies that list, and
+# needs to propogate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning.
+func_hookable func_options_prep
+func_options_prep ()
+{
+    $debug_cmd
+
+    # Option defaults:
+    opt_verbose=false
+    opt_warning_types=
+
+    func_run_hooks func_options_prep ${1+"$@"}
+
+    # save modified positional parameters for caller
+    func_options_prep_result=$func_run_hooks_result
+}
+
+
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
+{
+    $debug_cmd
+
+    func_parse_options_result=
+
+    # this just eases exit handling
+    while test $# -gt 0; do
+      # Defer to hook functions for initial option parsing, so they
+      # get priority in the event of reusing an option name.
+      func_run_hooks func_parse_options ${1+"$@"}
+
+      # Adjust func_parse_options positional parameters to match
+      eval set dummy "$func_run_hooks_result"; shift
+
+      # Break out of the loop if we already parsed every option.
+      test $# -gt 0 || break
+
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --debug|-x)   debug_cmd='set -x'
+                      func_echo "enabling shell trace mode"
+                      $debug_cmd
+                      ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                      set dummy --warnings none ${1+"$@"}
+                      shift
+		      ;;
+
+        --warnings|--warning|-W)
+                      test $# = 0 && func_missing_arg $_G_opt && break
+                      case " $warning_categories $1" in
+                        *" $1 "*)
+                          # trailing space prevents matching last $1 above
+                          func_append_uniq opt_warning_types " $1"
+                          ;;
+                        *all)
+                          opt_warning_types=$warning_categories
+                          ;;
+                        *none)
+                          opt_warning_types=none
+                          warning_func=:
+                          ;;
+                        *error)
+                          opt_warning_types=$warning_categories
+                          warning_func=func_fatal_error
+                          ;;
+                        *)
+                          func_fatal_error \
+                             "unsupported warning category: '$1'"
+                          ;;
+                      esac
+                      shift
+                      ;;
+
+        --verbose|-v) opt_verbose=: ;;
+        --version)    func_version ;;
+        -\?|-h)       func_usage ;;
+        --help)       func_help ;;
+
+	# Separate optargs to long options (plugins may need this):
+	--*=*)        func_split_equals "$_G_opt"
+	              set dummy "$func_split_equals_lhs" \
+                          "$func_split_equals_rhs" ${1+"$@"}
+                      shift
+                      ;;
+
+       # Separate optargs to short options:
+        -W*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        # Separate non-argument short options:
+        -\?*|-h*|-v*|-x*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "-$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        --)           break ;;
+        -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
+        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+      esac
+    done
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    func_parse_options_result=$func_quote_for_eval_result
+}
+
+
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
+{
+    $debug_cmd
+
+    # Display all warnings if -W was not given.
+    test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
+
+    func_run_hooks func_validate_options ${1+"$@"}
+
+    # Bail if the options were screwed!
+    $exit_cmd $EXIT_FAILURE
+
+    # save modified positional parameters for caller
+    func_validate_options_result=$func_run_hooks_result
+}
+
+
+
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
+
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    $debug_cmd
+
+    eval \$ECHO \""Usage: $usage"\"
+    eval \$ECHO \""$fatal_help"\"
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
+func_help ()
+{
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message"
+    exit 0
+}
+
+
+# func_missing_arg ARGNAME
+# ------------------------
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $debug_cmd
+
+    func_error "Missing argument for '$1'."
+    exit_cmd=exit
+}
+
+
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=${1%%=*}
+      func_split_equals_rhs=${1#*=}
+      test "x$func_split_equals_lhs" = "x$1" \
+        && func_split_equals_rhs=
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+      func_split_equals_rhs=
+      test "x$func_split_equals_lhs" = "x$1" \
+        || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+  }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_arg=${1#??}
+      func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+      func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+  }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+    exit 0
+}
+
+
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
+{
+    $debug_cmd
+
+    eval \$ECHO \""Usage: $usage"\"
+    echo
+    $SED -n 's|^# ||
+        /^Written by/{
+          x;p;x
+        }
+	h
+	/^Written by/q' < "$progpath"
+    echo
+    eval \$ECHO \""$usage_message"\"
+}
+
+
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $debug_cmd
+
+    printf '%s\n' "$progname $scriptversion"
+    $SED -n '
+        /(C)/!b go
+        :more
+        /\./!{
+          N
+          s|\n# | |
+          b more
+        }
+        :go
+        /^# Written by /,/# warranty; / {
+          s|^# ||
+          s|^# *$||
+          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+          p
+        }
+        /^# Written by / {
+          s|^# ||
+          p
+        }
+        /^warranty; /q' < "$progpath"
+
+    exit $?
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
+
+
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
+{
+    $debug_cmd
+
+    $warning_func ${1+"$@"}
+}
+
+
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+       --config             show all configuration variables
+       --debug              enable verbose shell tracing
+   -n, --dry-run            display commands without modifying any files
+       --features           display basic configuration information and exit
+       --mode=MODE          use operation mode MODE
+       --no-warnings        equivalent to '-Wnone'
+       --preserve-dup-deps  don't remove duplicate dependency libraries
+       --quiet, --silent    don't print informational messages
+       --tag=TAG            use configuration variables from tag TAG
+   -v, --verbose            print more informational messages than default
+       --version            print version information
+   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
+   -h, --help, --help-all   print short, long, or detailed help message
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
+{
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+       clean           remove files from the build directory
+       compile         compile a source file into a libtool object
+       execute         automatically set library path, then run a program
+       finish          complete the installation of libtool libraries
+       install         install libraries or executables
+       link            create a library or an executable
+       uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+       host-triplet:   $host
+       shell:          $SHELL
+       compiler:       $LTCC
+       compiler flags: $LTCFLAGS
+       linker:         $LD (gnu? $with_gnu_ld)
+       version:        $progname (GNU libtool) 2.4.6
+       automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+       autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool@gnu.org>.
+GNU libtool home page: <http://www.gnu.org/s/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+    exit 0
+}
+
+
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_lo2o ()
+  {
+    case $1 in
+      *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+      *   ) func_lo2o_result=$1               ;;
+    esac
+  }'
+
+  # func_xform LIBOBJ-OR-SOURCE
+  # ---------------------------
+  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+  # suffix to a '.lo' libtool-object suffix.
+  eval 'func_xform ()
+  {
+    func_xform_result=${1%.*}.lo
+  }'
+else
+  # ...otherwise fall back to using sed.
+  func_lo2o ()
+  {
+    func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+  }
+
+  func_xform ()
+  {
+    func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+  }
+fi
+
+
+# func_fatal_configuration ARG...
+# -------------------------------
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func__fatal_error ${1+"$@"} \
+      "See the $PACKAGE documentation for more information." \
+      "Fatal configuration error."
+}
+
+
+# func_config
+# -----------
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+
+# func_features
+# -------------
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test yes = "$build_libtool_libs"; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test yes = "$build_old_libs"; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+
+# func_enable_tag TAGNAME
+# -----------------------
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+    # Global variable:
+    tagname=$1
+
+    re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+    re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+    sed_extractcf=/$re_begincf/,/$re_endcf/p
+
+    # Validate tagname.
+    case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+        func_fatal_error "invalid tag name: $tagname"
+        ;;
+    esac
+
+    # Don't test for the "default" C tag, as we know it's
+    # there but not specially marked.
+    case $tagname in
+        CC) ;;
+    *)
+        if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	  taglist="$taglist $tagname"
+
+	  # Evaluate the configuration.  Be careful to quote the path
+	  # and the sed script, to avoid splitting on whitespace, but
+	  # also don't use non-portable quotes within backquotes within
+	  # quotes we have to do it in 2 steps:
+	  extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	  eval "$extractedcf"
+        else
+	  func_error "ignoring unknown tag $tagname"
+        fi
+        ;;
+    esac
+}
+
+
+# func_check_version_match
+# ------------------------
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+    if test "$package_revision" != "$macro_revision"; then
+      if test "$VERSION" != "$macro_version"; then
+        if test -z "$macro_version"; then
+          cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+        else
+          cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+        fi
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+      fi
+
+      exit $EXIT_MISMATCH
+    fi
+}
+
+
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+    $debug_mode
+
+    # Option defaults:
+    opt_config=false
+    opt_dlopen=
+    opt_dry_run=false
+    opt_help=false
+    opt_mode=
+    opt_preserve_dup_deps=false
+    opt_quiet=false
+
+    nonopt=
+    preserve_args=
+
+    # Shorthand for --mode=foo, only valid as the first argument
+    case $1 in
+    clean|clea|cle|cl)
+      shift; set dummy --mode clean ${1+"$@"}; shift
+      ;;
+    compile|compil|compi|comp|com|co|c)
+      shift; set dummy --mode compile ${1+"$@"}; shift
+      ;;
+    execute|execut|execu|exec|exe|ex|e)
+      shift; set dummy --mode execute ${1+"$@"}; shift
+      ;;
+    finish|finis|fini|fin|fi|f)
+      shift; set dummy --mode finish ${1+"$@"}; shift
+      ;;
+    install|instal|insta|inst|ins|in|i)
+      shift; set dummy --mode install ${1+"$@"}; shift
+      ;;
+    link|lin|li|l)
+      shift; set dummy --mode link ${1+"$@"}; shift
+      ;;
+    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+      shift; set dummy --mode uninstall ${1+"$@"}; shift
+      ;;
+    esac
+
+    # Pass back the list of options.
+    func_quote_for_eval ${1+"$@"}
+    libtool_options_prep_result=$func_quote_for_eval_result
+}
+func_add_hook func_options_prep libtool_options_prep
+
+
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
+{
+    $debug_cmd
+
+    # Perform our own loop to consume as many options as possible in
+    # each iteration.
+    while test $# -gt 0; do
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --dry-run|--dryrun|-n)
+                        opt_dry_run=:
+                        ;;
+
+        --config)       func_config ;;
+
+        --dlopen|-dlopen)
+                        opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+                        shift
+                        ;;
+
+        --preserve-dup-deps)
+                        opt_preserve_dup_deps=: ;;
+
+        --features)     func_features ;;
+
+        --finish)       set dummy --mode finish ${1+"$@"}; shift ;;
+
+        --help)         opt_help=: ;;
+
+        --help-all)     opt_help=': help-all' ;;
+
+        --mode)         test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_mode=$1
+                        case $1 in
+                          # Valid mode arguments:
+                          clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+                          # Catch anything else as an error
+                          *) func_error "invalid argument for $_G_opt"
+                             exit_cmd=exit
+                             break
+                             ;;
+                        esac
+                        shift
+                        ;;
+
+        --no-silent|--no-quiet)
+                        opt_quiet=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                        opt_warning=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-verbose)
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --silent|--quiet)
+                        opt_quiet=:
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --tag)          test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_tag=$1
+                        func_append preserve_args " $_G_opt $1"
+                        func_enable_tag "$1"
+                        shift
+                        ;;
+
+        --verbose|-v)   opt_quiet=false
+                        opt_verbose=:
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+	# An option not handled by this hook function:
+        *)		set dummy "$_G_opt" ${1+"$@"};	shift; break  ;;
+      esac
+    done
+
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    libtool_parse_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_parse_options libtool_parse_options
+
+
+
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+    # save first non-option argument
+    if test 0 -lt $#; then
+      nonopt=$1
+      shift
+    fi
+
+    # preserve --debug
+    test : = "$debug_cmd" || func_append preserve_args " --debug"
+
+    case $host in
+      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+        # don't eliminate duplications in $postdeps and $predeps
+        opt_duplicate_compiler_generated_deps=:
+        ;;
+      *)
+        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+        ;;
+    esac
+
+    $opt_help || {
+      # Sanity checks first:
+      func_check_version_match
+
+      test yes != "$build_libtool_libs" \
+        && test yes != "$build_old_libs" \
+        && func_fatal_configuration "not configured to build any kind of library"
+
+      # Darwin sucks
+      eval std_shrext=\"$shrext_cmds\"
+
+      # Only execute mode is allowed to have -dlopen flags.
+      if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+        func_error "unrecognized option '-dlopen'"
+        $ECHO "$help" 1>&2
+        exit $EXIT_FAILURE
+      fi
+
+      # Change the help message to a mode-specific one.
+      generic_help=$help
+      help="Try '$progname --help --mode=$opt_mode' for more information."
+    }
+
+    # Pass back the unparsed argument list
+    func_quote_for_eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_validate_options libtool_validate_options
+
+
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+  $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_p file
+# True iff FILE is a libtool '.la' library or '.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool '.la' library or '.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if 'file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case $lalib_p_line in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test yes = "$lalib_p"
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    test -f "$1" &&
+      $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $debug_cmd
+
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$sp$nl
+      eval cmd=\"$cmd\"
+      IFS=$save_ifs
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# 'FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $debug_cmd
+
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case $lt_sysroot:$1 in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result='='$func_stripname_result
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $debug_cmd
+
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with '--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=$1
+    if test yes = "$build_libtool_libs"; then
+      write_lobj=\'$2\'
+    else
+      write_lobj=none
+    fi
+
+    if test yes = "$build_old_libs"; then
+      write_oldobj=\'$3\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "$write_libobj"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $debug_cmd
+
+  func_convert_core_file_wine_to_w32_result=$1
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $debug_cmd
+
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result"; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $debug_cmd
+
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $debug_cmd
+
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $debug_cmd
+
+  if test -z "$2" && test -n "$1"; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  '$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result=$1
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $debug_cmd
+
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  '$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result=$3
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $debug_cmd
+
+  case $4 in
+  $1 ) func_to_host_path_result=$3$func_to_host_path_result
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via '$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $debug_cmd
+
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $debug_cmd
+
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result=$1
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result=$func_convert_core_msys_to_w32_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result=$func_cygpath_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_file_result=$1
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result=$func_cygpath_result
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via '$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $debug_cmd
+
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd=func_convert_path_$func_stripname_result
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $debug_cmd
+
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result=$1
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result=$func_convert_core_msys_to_w32_result
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result=$func_cygpath_result
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $debug_cmd
+
+  func_to_host_path_result=$1
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result=$func_cygpath_result
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+  $debug_cmd
+
+  func_dll_def_p_tmp=`$SED -n \
+    -e 's/^[	 ]*//' \
+    -e '/^\(;.*\)*$/d' \
+    -e 's/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p' \
+    -e q \
+    "$1"`
+  test DEF = "$func_dll_def_p_tmp"
+}
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $debug_cmd
+
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg=$arg
+	arg_mode=normal
+	;;
+
+      target )
+	libobj=$arg
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify '-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs=$IFS; IFS=,
+	  for arg in $args; do
+	    IFS=$save_ifs
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS=$save_ifs
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg=$srcfile
+	  srcfile=$arg
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with '-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj=$func_basename_result
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from '$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test yes = "$build_libtool_libs" \
+	  || func_fatal_configuration "cannot build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name '$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname=$func_basename_result
+    xdir=$func_dirname_result
+    lobj=$xdir$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test yes = "$build_old_libs"; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test no = "$compiler_c_o"; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+      lockfile=$output_obj.lock
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test yes = "$need_locks"; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test warn = "$need_locks"; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test yes = "$build_libtool_libs"; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test no != "$pic_mode"; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test warn = "$need_locks" &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test yes = "$suppress_opt"; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test yes = "$build_old_libs"; then
+      if test yes != "$pic_mode"; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test yes = "$compiler_c_o"; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test warn = "$need_locks" &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support '-c' and '-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test no != "$need_locks"; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a '.o' file suitable for static linking
+  -static           only build a '.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to '-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the '--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the 'install' or 'cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  use a list of object files found in FILE to specify objects
+  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with '-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in '.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
+
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode '$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try '$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test : = "$opt_help"; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    $SED '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $debug_cmd
+
+    # The first argument is the command name.
+    cmd=$nonopt
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "'$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "'$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "'$file' was not linked with '-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir=$func_dirname_result
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir=$func_dirname_result
+	;;
+
+      *)
+	func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir=$absdir
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic=$magic
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file=$progdir/$program
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file=$progdir/$program
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if $opt_dry_run; then
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    else
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd=\$cmd$args
+    fi
+}
+
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $debug_cmd
+
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "'$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument '$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and '=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_quiet && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the '-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the '$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the '$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $debug_cmd
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac
+    then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=false
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=: ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test X-m = "X$prev" && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the '$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=:
+    if $isdir; then
+      destdir=$dest
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir=$func_dirname_result
+      destname=$func_basename_result
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "'$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "'$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic=$magic
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "'$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir=$func_dirname_result
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking '$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname=$1
+	  shift
+
+	  srcname=$realname
+	  test -n "$relink_command" && srcname=${realname}T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme=$stripme
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  os2*)
+	    case $realname in
+	    *_dll.a)
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try 'ln -sf' first, because the 'ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib=$destdir/$realname
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name=$func_basename_result
+	instname=$dir/${name}i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile=$destdir/$destname
+	else
+	  func_basename "$file"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest=$destfile
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to '$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test yes = "$build_old_libs"; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile=$destdir/$destname
+	else
+	  func_basename "$file"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=.exe
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script '$wrapper'"
+
+	  finalize=:
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "'$lib' has not been installed in '$libdir'"
+	      finalize=false
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test no = "$fast_install" && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if $finalize; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file=$func_basename_result
+	        outputname=$tmpdir/$file
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_quiet || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink '$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file=$outputname
+	      else
+	        func_warning "cannot relink '$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name=$func_basename_result
+
+      # Set up the ranlib parameters.
+      oldlib=$destdir/$name
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run '$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $debug_cmd
+
+    my_outputname=$1
+    my_originator=$2
+    my_pic_p=${3-false}
+    my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms=${my_outputname}S.c
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist=$output_objdir/$my_outputname.nm
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test yes = "$dlself"; then
+	  func_verbose "generating symbol list for '$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols=$output_objdir/$outputname.exp
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from '$dlprefile'"
+	  func_basename "$dlprefile"
+	  name=$func_basename_result
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname"; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename=$func_basename_result
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename"; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  func_show_eval '$RM "${nlist}I"'
+	  if test -n "$global_symbol_to_import"; then
+	    eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+  for (; symbol->name; ++symbol)
+    {"
+	    $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+	    echo >> "$output_objdir/$my_dlsyms" "\
+    }
+}"
+	  fi
+	  echo >> "$output_objdir/$my_dlsyms" "\
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{ {\"$my_originator\", (void *) 0},"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+  {\"@INIT@\", (void *) &lt_syminit},"
+	  fi
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    $my_pic_p && pic_flag_for_symtable=" $pic_flag"
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj=$output_objdir/${my_outputname}S.$objext
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for '$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $debug_cmd
+
+  win32_libid_type=unknown
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      case $nm_interface in
+      "MS dumpbin")
+	if func_cygming_ms_implib_p "$1" ||
+	   func_cygming_gnu_implib_p "$1"
+	then
+	  win32_nmres=import
+	else
+	  win32_nmres=
+	fi
+	;;
+      *)
+	func_to_tool_file "$1" func_convert_file_msys_to_w32
+	win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	  $SED -n -e '
+	    1,100{
+		/ I /{
+		    s|.*|import|
+		    p
+		    q
+		}
+	    }'`
+	;;
+      esac
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $debug_cmd
+
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $debug_cmd
+
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive that possess that section. Heuristic: eliminate
+    # all those that have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $debug_cmd
+
+  if func_cygming_gnu_implib_p "$1"; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1"; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $debug_cmd
+
+    f_ex_an_ar_dir=$1; shift
+    f_ex_an_ar_oldlib=$1
+    if test yes = "$lock_old_archive_extraction"; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test yes = "$lock_old_archive_extraction"; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $debug_cmd
+
+    my_gentop=$1; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=
+    my_xlib=
+    my_xabs=
+    my_xdir=
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib=$func_basename_result
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir=$my_gentop/$my_xlib_u
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  func_basename "$darwin_archive"
+	  darwin_base_archive=$func_basename_result
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches; do
+	      func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+	      cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      func_extract_an_archive "`pwd`" "$darwin_base_archive"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result=$my_oldobjs
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory where it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ that is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options that match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test yes = "$fast_install"; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	\$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
+/* declarations of non-ANSI functions */
+#if defined __MINGW32__
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined __CYGWIN__
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined other_platform || defined ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined _MSC_VER
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+#elif defined __MINGW32__
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined __CYGWIN__
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined other platforms ... */
+#endif
+
+#if defined PATH_MAX
+# define LT_PATHMAX PATH_MAX
+#elif defined MAXPATHLEN
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+  defined __OS2__
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free (stale); stale = 0; } \
+} while (0)
+
+#if defined LT_DEBUGWRAPPER
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test yes = "$fast_install"; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  int rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, (size_t) argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (STREQ (argv[i], dumpscript_opt))
+	{
+EOF
+	    case $host in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (STREQ (argv[i], debug_opt))
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (STREQ (argv[i], ltwrapper_option_prefix))
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  size_t tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = (size_t) (q - p);
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (STREQ (str, pat))
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    size_t len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      size_t orig_value_len = strlen (orig_value);
+      size_t add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      size_t len = strlen (new_value);
+      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[--len] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $debug_cmd
+
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+    $debug_cmd
+
+    case " $compile_command " in
+    *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+      suncc_use_cstd_abi=no
+      ;;
+    *)
+      suncc_use_cstd_abi=yes
+      ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $debug_cmd
+
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # what system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll that has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    os2dllname=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=false
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module=$wl-single_module
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test yes != "$build_libtool_libs" \
+	  && func_fatal_configuration "cannot build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg=$1
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir=$arg
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  $preload || {
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=:
+	  }
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test no = "$dlself"; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test dlprefiles = "$prev"; then
+	      dlself=yes
+	    elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test dlfiles = "$prev"; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols=$arg
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file '$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex=$arg
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir=$arg
+	  prev=
+	  continue
+	  ;;
+	mllvm)
+	  # Clang does not use LLVM to link, so we can simply discard any
+	  # '-mllvm $arg' options when doing the link step.
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test none = "$pic_object" &&
+		   test none = "$non_pic_object"; then
+		  func_fatal_error "cannot find name of object for '$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir=$func_dirname_result
+
+		if test none != "$pic_object"; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object=$xdir$pic_object
+
+		  if test dlfiles = "$prev"; then
+		    if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test dlprefiles = "$prev"; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg=$pic_object
+		fi
+
+		# Non-PIC object.
+		if test none != "$non_pic_object"; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object=$xdir$non_pic_object
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test none = "$pic_object"; then
+		    arg=$non_pic_object
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object=$pic_object
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir=$func_dirname_result
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "'$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file '$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	os2dllname)
+	  os2dllname=$arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex=$arg
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release=-$arg
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test rpath = "$prev"; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds=$arg
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg=$arg
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "'-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test X-export-symbols = "X$arg"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between '-L' and '$1'"
+	  else
+	    func_fatal_error "need path for '-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of '$dir'"
+	  dir=$absdir
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test X-lc = "X$arg" || test X-lm = "X$arg"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test X-lc = "X$arg" && continue
+	    ;;
+	  esac
+	elif test X-lc_r = "X$arg"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -mllvm)
+	prev=mllvm
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module=$wl-multi_module
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "'-no-install' is ignored for $host"
+	  func_warning "assuming '-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -os2dllname)
+	prev=os2dllname
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) func_append xrpath " $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs=$IFS; IFS=,
+	for flag in $args; do
+	  IFS=$save_ifs
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS=$save_ifs
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs=$IFS; IFS=,
+	for flag in $args; do
+	  IFS=$save_ifs
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS=$save_ifs
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # -fstack-protector*   stack protector flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -specs=*             GCC specs files
+      # -stdlib=*            select c++ std lib with clang
+      # -fsanitize=*         Clang/GCC memory and address sanitizer
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+      -specs=*|-fsanitize=*)
+        func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      -Z*)
+        if test os2 = "`expr $host : '.*\(os2\)'`"; then
+          # OS/2 uses -Zxxx to specify OS/2-specific options
+	  compiler_flags="$compiler_flags $arg"
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  case $arg in
+	  -Zlinker | -Zstack)
+	    prev=xcompiler
+	    ;;
+	  esac
+	  continue
+        else
+	  # Otherwise treat like 'Some other compiler flag' below
+	  func_quote_for_eval "$arg"
+	  arg=$func_quote_for_eval_result
+        fi
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test none = "$pic_object" &&
+	     test none = "$non_pic_object"; then
+	    func_fatal_error "cannot find name of object for '$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir=$func_dirname_result
+
+	  test none = "$pic_object" || {
+	    # Prepend the subdirectory the object is found in.
+	    pic_object=$xdir$pic_object
+
+	    if test dlfiles = "$prev"; then
+	      if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test dlprefiles = "$prev"; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg=$pic_object
+	  }
+
+	  # Non-PIC object.
+	  if test none != "$non_pic_object"; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object=$xdir$non_pic_object
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test none = "$pic_object"; then
+	      arg=$non_pic_object
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object=$pic_object
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir=$func_dirname_result
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "'$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test dlfiles = "$prev"; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test dlprefiles = "$prev"; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg=$func_quote_for_eval_result
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the '$prevarg' option requires an argument"
+
+    if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname=$func_basename_result
+    libobjs_save=$libobjs
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    # Definition is injected by LT_CONFIG during libtool generation.
+    func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
+    func_dirname "$output" "/" ""
+    output_objdir=$func_dirname_result$objdir
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test lib = "$linkmode"; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=false
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test lib,link = "$linkmode,$pass"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs=$tmp_deplibs
+      fi
+
+      if test lib,link = "$linkmode,$pass" ||
+	 test prog,scan = "$linkmode,$pass"; then
+	libs=$deplibs
+	deplibs=
+      fi
+      if test prog = "$linkmode"; then
+	case $pass in
+	dlopen) libs=$dlfiles ;;
+	dlpreopen) libs=$dlprefiles ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test lib,dlpreopen = "$linkmode,$pass"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs=$dlprefiles
+      fi
+      if test dlopen = "$pass"; then
+	# Collect dlpreopened libraries
+	save_deplibs=$deplibs
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=false
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test prog,link = "$linkmode,$pass"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test lib = "$linkmode"; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test lib != "$linkmode" && test prog != "$linkmode"; then
+	    func_warning "'-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test lib = "$linkmode"; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib=$searchdir/lib$name$search_ext
+	      if test -f "$lib"; then
+		if test .la = "$search_ext"; then
+		  found=:
+		else
+		  found=false
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if $found; then
+	    # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll=$l
+		  done
+		  if test "X$ll" = "X$old_library"; then # only static version available
+		    found=false
+		    func_dirname "$lib" "" "."
+		    ladir=$func_dirname_result
+		    lib=$ladir/$old_library
+		    if test prog,link = "$linkmode,$pass"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  else
+	    # deplib doesn't seem to be a libtool library
+	    if test prog,link = "$linkmode,$pass"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test prog,link = "$linkmode,$pass"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test lib = "$linkmode"; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test conv = "$pass" && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test conv = "$pass"; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test scan = "$pass"; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "'-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test link = "$pass"; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test conv = "$pass"; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=false
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=:
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=:
+		;;
+	      esac
+	      if $valid_a_lib; then
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      else
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test link != "$pass"; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test conv = "$pass"; then
+	    deplibs="$deplib $deplibs"
+	  elif test prog = "$linkmode"; then
+	    if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=:
+	  continue
+	  ;;
+	esac # case $deplib
+
+	$found || test -f "$lib" \
+	  || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "'$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir=$func_dirname_result
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test lib,link = "$linkmode,$pass" ||
+	   test prog,scan = "$linkmode,$pass" ||
+	   { test prog != "$linkmode" && test lib != "$linkmode"; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test conv = "$pass"; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for '$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps; then
+		case "$tmp_libs " in
+		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+		esac
+	      fi
+	      func_append tmp_libs " $deplib"
+	    done
+	  elif test prog != "$linkmode" && test lib != "$linkmode"; then
+	    func_fatal_error "'$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test yes = "$prefer_static_libs" ||
+	     test built,no = "$prefer_static_libs,$installed"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib=$l
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for '$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test dlopen = "$pass"; then
+	  test -z "$libdir" \
+	    && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
+	  if test -z "$dlname" ||
+	     test yes != "$dlopen_support" ||
+	     test no = "$build_libtool_libs"
+	  then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of '$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir=$ladir
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname=$func_basename_result
+
+	# Find the relevant object directory and library name.
+	if test yes = "$installed"; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library '$lib' was moved."
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    libdir=$abs_ladir
+	  else
+	    dir=$lt_sysroot$libdir
+	    absdir=$lt_sysroot$libdir
+	  fi
+	  test yes = "$hardcode_automatic" && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir=$ladir/$objdir
+	    absdir=$abs_ladir/$objdir
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test dlpreopen = "$pass"; then
+	  if test -z "$libdir" && test prog = "$linkmode"; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
+	  fi
+	  case $host in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test lib = "$linkmode"; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test prog,link = "$linkmode,$pass"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test prog = "$linkmode" && test link != "$pass"; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=false
+	  if test no != "$link_all_deplibs" || test -z "$library_names" ||
+	     test no = "$build_libtool_libs"; then
+	    linkalldeplibs=:
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if $linkalldeplibs; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test prog,link = "$linkmode,$pass"; then
+	  if test -n "$library_names" &&
+	     { { test no = "$prefer_static_libs" ||
+	         test built,yes = "$prefer_static_libs,$installed"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
+	      # Make sure the rpath contains only unique directories.
+	      case $temp_rpath: in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if $alldeplibs &&
+	     { test pass_all = "$deplibs_check_method" ||
+	       { test yes = "$build_libtool_libs" &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test built = "$use_static_libs" && test yes = "$installed"; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test no = "$use_static_libs" || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc* | *os2*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test no = "$installed"; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule=$dlpremoduletest
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
+	    echo
+	    if test prog = "$linkmode"; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test lib = "$linkmode" &&
+	     test yes = "$hardcode_into_libs"; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname=$1
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname=$dlname
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc* | *os2*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix=-$major
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname=$realname
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot=$soname
+	    func_basename "$soroot"
+	    soname=$func_basename_result
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from '$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for '$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test prog = "$linkmode" || test relink != "$opt_mode"; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test no = "$hardcode_direct"; then
+		add=$dir/$linklib
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+		  *-*-sysv4*uw2*) add_dir=-L$dir ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir=-L$dir ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we cannot
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library"; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add=$dir/$old_library
+			fi
+		      elif test -n "$old_library"; then
+			add=$dir/$old_library
+		      fi
+		    fi
+		esac
+	      elif test no = "$hardcode_minus_L"; then
+		case $host in
+		*-*-sunos*) add_shlibpath=$dir ;;
+		esac
+		add_dir=-L$dir
+		add=-l$name
+	      elif test no = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test yes = "$hardcode_direct" &&
+	         test no = "$hardcode_direct_absolute"; then
+		add=$dir/$linklib
+	      elif test yes = "$hardcode_minus_L"; then
+		add_dir=-L$absdir
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add=-l$name
+	      elif test yes = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test yes != "$lib_linked"; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test prog = "$linkmode"; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test yes != "$hardcode_direct" &&
+		 test yes != "$hardcode_minus_L" &&
+		 test yes = "$hardcode_shlibpath_var"; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test prog = "$linkmode" || test relink = "$opt_mode"; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test yes = "$hardcode_direct" &&
+	       test no = "$hardcode_direct_absolute"; then
+	      add=$libdir/$linklib
+	    elif test yes = "$hardcode_minus_L"; then
+	      add_dir=-L$libdir
+	      add=-l$name
+	    elif test yes = "$hardcode_shlibpath_var"; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add=-l$name
+	    elif test yes = "$hardcode_automatic"; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib"; then
+		add=$inst_prefix_dir$libdir/$linklib
+	      else
+		add=$libdir/$linklib
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir=-L$libdir
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add=-l$name
+	    fi
+
+	    if test prog = "$linkmode"; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test prog = "$linkmode"; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test unsupported != "$hardcode_direct"; then
+	    test -n "$old_library" && linklib=$old_library
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test yes = "$build_libtool_libs"; then
+	  # Not a shared library
+	  if test pass_all != "$deplibs_check_method"; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system cannot link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test yes = "$module"; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** 'nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test no = "$build_old_libs"; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test lib = "$linkmode"; then
+	  if test -n "$dependency_libs" &&
+	     { test yes != "$hardcode_into_libs" ||
+	       test yes = "$build_old_libs" ||
+	       test yes = "$link_static"; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs=$temp_deplibs
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test no != "$link_all_deplibs"; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path=$deplib ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of '$dir'"
+		    absdir=$dir
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names"; then
+		    for tmp in $deplibrary_names; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl"; then
+		      depdepl=$absdir/$objdir/$depdepl
+		      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+		      func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path=-L$absdir/$objdir
+		  ;;
+		esac
+		else
+		  eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "'$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "'$deplib' seems to be moved"
+
+		  path=-L$absdir
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test link = "$pass"; then
+	if test prog = "$linkmode"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs=$newdependency_libs
+      if test dlpreopen = "$pass"; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test dlopen != "$pass"; then
+	test conv = "$pass" || {
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	}
+
+	if test prog,link = "$linkmode,$pass"; then
+	  vars="compile_deplibs finalize_deplibs"
+	else
+	  vars=deplibs
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+
+      # Add Sun CC postdeps if required:
+      test CXX = "$tagname" && {
+        case $host_os in
+        linux*)
+          case `$CC -V 2>&1 | sed 5q` in
+          *Sun\ C*) # Sun C++ 5.9
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+
+        solaris*)
+          func_cc_basename "$CC"
+          case $func_cc_basename_result in
+          CC* | sunCC*)
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+        esac
+      }
+
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=
+	  ;;
+	esac
+	if test -n "$i"; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test prog = "$linkmode"; then
+      dlfiles=$newdlfiles
+    fi
+    if test prog = "$linkmode" || test lib = "$linkmode"; then
+      dlprefiles=$newdlprefiles
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "'-l' and '-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "'-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "'-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "'-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "'-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "'-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs=$output
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form 'libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test no = "$module" \
+	  && func_fatal_help "libtool library '$output' must begin with 'lib'"
+
+	if test no != "$need_lib_prefix"; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test pass_all != "$deplibs_check_method"; then
+	  func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test no = "$dlself" \
+	|| func_warning "'-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test 1 -lt "$#" \
+	&& func_warning "ignoring multiple '-rpath's for a libtool library"
+
+      install_libdir=$1
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test yes = "$build_libtool_libs"; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a '.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "'-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "'-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs=$IFS; IFS=:
+	set dummy $vinfo 0 0 0
+	shift
+	IFS=$save_ifs
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to '-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major=$1
+	  number_minor=$2
+	  number_revision=$3
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # that has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|freebsd-elf|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age=$number_minor
+	    revision=$number_revision
+	    ;;
+	  freebsd-aout|qnx|sunos)
+	    current=$number_major
+	    revision=$number_minor
+	    age=0
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age=$number_minor
+	    revision=$number_minor
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type '$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current=$1
+	  revision=$2
+	  age=$3
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT '$current' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION '$revision' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE '$age' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE '$age' is greater than the current interface number '$current'"
+	  func_fatal_error "'$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+          # On Darwin other compilers
+          case $CC in
+              nagfor*)
+                  verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+                  ;;
+              *)
+                  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+                  ;;
+          esac
+	  ;;
+
+	freebsd-aout)
+	  major=.$current
+	  versuffix=.$current.$revision
+	  ;;
+
+	freebsd-elf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
+	  ;;
+
+	irix | nonstopux)
+	  if test no = "$lt_irix_increment"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring=$verstring_prefix$major.$revision
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test 0 -ne "$loop"; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring=$verstring_prefix$major.$iface:$verstring
+	  done
+
+	  # Before this point, $major must not contain '.'.
+	  major=.$major
+	  versuffix=$major.$revision
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=.$current.$age.$revision
+	  verstring=$current.$age.$revision
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test 0 -ne "$loop"; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring=$verstring:$iface.0
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":$current.0"
+	  ;;
+
+	qnx)
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sco)
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sunos)
+	  major=.$current
+	  versuffix=.$current.$revision
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 file systems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix=-$major
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type '$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring=0.0
+	    ;;
+	  esac
+	  if test no = "$need_version"; then
+	    versuffix=
+	  else
+	    versuffix=.0.0
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test yes,no = "$avoid_version,$need_version"; then
+	  major=
+	  versuffix=
+	  verstring=
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test yes = "$allow_undefined"; then
+	  if test unsupported = "$allow_undefined_flag"; then
+	    if test yes = "$build_old_libs"; then
+	      func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+	      build_libtool_libs=no
+	    else
+	      func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+	    fi
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag=$no_undefined_flag
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" :
+      func_append libobjs " $symfileobj"
+      test " " = "$libobjs" && libobjs=
+
+      if test relink != "$opt_mode"; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+	       if test -n "$precious_files_regex"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles=$dlfiles
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles=$dlprefiles
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test yes = "$build_libtool_libs"; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test yes = "$build_libtool_need_lc"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=
+	versuffix=
+	major=
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=
+		    ;;
+		  esac
+		fi
+		if test -n "$i"; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i"; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib"; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test yes = "$want_nocaseglob"; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib=$potent_lib
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+			*) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib"; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib"; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib"; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib=$potent_lib # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib"; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib"; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	    for i in $predeps $postdeps; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test none = "$deplibs_check_method"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test yes = "$droppeddeps"; then
+	  if test yes = "$module"; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** 'nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test no = "$build_old_libs"; then
+	      oldlibs=$output_objdir/$libname.$libext
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test no = "$allow_undefined"; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test no = "$build_old_libs"; then
+		oldlibs=$output_objdir/$libname.$libext
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs=$new_libs
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test yes = "$build_libtool_libs"; then
+	# Remove $wl instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test yes = "$hardcode_into_libs"; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath=$finalize_rpath
+	  test relink = "$opt_mode" || rpath=$compile_rpath$rpath
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs=$libdir
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir=$hardcode_libdirs
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath=$finalize_shlibpath
+	test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname=$1
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname=$realname
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib=$output_objdir/$realname
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols=$output_objdir/$libname.uexp
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    func_dll_def_p "$export_symbols" || {
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols=$export_symbols
+	      export_symbols=
+	      always_export_symbols=yes
+	    }
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for '$libname.la'"
+	    export_symbols=$output_objdir/$libname.exp
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs=$IFS; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS=$save_ifs
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test yes = "$try_normal_branch" \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=$output_objdir/$output_la.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS=$save_ifs
+	    if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols=$export_symbols
+	  test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands, which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs=$tmp_deplibs
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test yes = "$compiler_needs_object" &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop=$output_objdir/${outputname}x
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test relink = "$opt_mode"; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test yes = "$module" && test -n "$module_cmds"; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test : != "$skipped_export" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+	    output=$output_objdir/$output_la.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+	    output=$output_objdir/$output_la.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test yes = "$compiler_needs_object"; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-$k.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test -z "$objlist" ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test 1 -eq "$k"; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-$k.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-$k.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\$concat_cmds$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    ${skipped_export-false} && {
+	      func_verbose "generating symbol list for '$libname.la'"
+	      export_symbols=$output_objdir/$libname.exp
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    }
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs=$IFS; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS=$save_ifs
+	      $opt_quiet || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test relink = "$opt_mode"; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS=$save_ifs
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          ${skipped_export-false} && {
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols=$export_symbols
+	      test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands, which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  }
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test yes = "$module" && test -n "$module_cmds"; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop=$output_objdir/${outputname}x
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs=$IFS; IFS='~'
+	for cmd in $cmds; do
+	  IFS=$sp$nl
+	  eval cmd=\"$cmd\"
+	  IFS=$save_ifs
+	  $opt_quiet || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test relink = "$opt_mode"; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS=$save_ifs
+
+	# Restore the uninstalled library and exit
+	if test relink = "$opt_mode"; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test yes = "$module" || test yes = "$export_dynamic"; then
+	  # On all known operating systems, these are identical.
+	  dlname=$soname
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "'-l' and '-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "'-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "'-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "'-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "'-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object '$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj=$output
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # if reload_cmds runs $LD directly, get rid of -Wl from
+      # whole_archive_flag_spec and hope we can get by with turning comma
+      # into space.
+      case $reload_cmds in
+        *\$LD[\ \$]*) wl= ;;
+      esac
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
+	else
+	  gentop=$output_objdir/${obj}x
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
+
+      # Create the old-style object.
+      reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
+
+      output=$obj
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      test yes = "$build_libtool_libs" || {
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      }
+
+      if test -n "$pic_flag" || test default != "$pic_mode"; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output=$libobj
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "'-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "'-release' is ignored for programs"
+
+      $preload \
+	&& test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+	&& func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test CXX = "$tagname"; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " $wl-bind_at_load"
+	      func_append finalize_command " $wl-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs=$new_libs
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs=$libdir
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir=$hardcode_libdirs
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath=$rpath
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs=$libdir
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir=$hardcode_libdirs
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath=$rpath
+
+      if test -n "$libobjs" && test yes = "$build_old_libs"; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" false
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=:
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=false
+        ;;
+      *cygwin* | *mingw* )
+        test yes = "$build_libtool_libs" || wrappers_required=false
+        ;;
+      *)
+        if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+          wrappers_required=false
+        fi
+        ;;
+      esac
+      $wrappers_required || {
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command=$compile_command$compile_rpath
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.$objext"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
+	fi
+
+	exit $exit_status
+      }
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test yes = "$no_install"; then
+	# We don't need to create a wrapper script.
+	link_command=$compile_var$compile_command$compile_rpath
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      case $hardcode_action,$fast_install in
+        relink,*)
+	  # Fast installation is not supported
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+
+	  func_warning "this platform does not like uninstalled shared libraries"
+	  func_warning "'$output' will be relinked during installation"
+	  ;;
+        *,yes)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+          ;;
+	*,no)
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+          ;;
+	*,needless)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=
+          ;;
+      esac
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource=$output_path/$objdir/lt-$output_name.c
+	    cwrapper=$output_path/$output_name.exe
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host"; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      case $build_libtool_libs in
+        convenience)
+	  oldobjs="$libobjs_save $symfileobj"
+	  addlibs=$convenience
+	  build_libtool_libs=no
+	  ;;
+	module)
+	  oldobjs=$libobjs_save
+	  addlibs=$old_convenience
+	  build_libtool_libs=no
+          ;;
+	*)
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  $preload && test -f "$symfileobj" \
+	    && func_append oldobjs " $symfileobj"
+	  addlibs=$old_convenience
+	  ;;
+      esac
+
+      if test -n "$addlibs"; then
+	gentop=$output_objdir/${outputname}x
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop=$output_objdir/${outputname}x
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop=$output_objdir/${outputname}x
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase=$func_basename_result
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj"; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test -z "$oldobjs"; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test yes = "$build_old_libs" && old_library=$libname.$libext
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test yes = "$hardcode_automatic"; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test yes = "$installed"; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output=$output_objdir/${outputname}i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name=$func_basename_result
+		func_resolve_sysroot "$deplib"
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "'$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs=$newdependency_libs
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "'$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles=$newdlfiles
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "'$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles=$newdlprefiles
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles=$newdlfiles
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles=$newdlprefiles
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test -n "$bindir"; then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result/$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that cannot go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test no,yes = "$installed,$need_relink"; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+  func_mode_link ${1+"$@"}
+fi
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $debug_cmd
+
+    RM=$nonopt
+    files=
+    rmforce=false
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic=$magic
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=: ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir=$func_dirname_result
+      if test . = "$dir"; then
+	odir=$objdir
+      else
+	odir=$dir/$objdir
+      fi
+      func_basename "$file"
+      name=$func_basename_result
+      test uninstall = "$opt_mode" && odir=$dir
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test clean = "$opt_mode"; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif $rmforce; then
+	continue
+      fi
+
+      rmfiles=$file
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case $opt_mode in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" && test none != "$pic_object"; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" && test none != "$non_pic_object"; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test clean = "$opt_mode"; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+	    if test yes = "$fast_install" && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name"; then
+	      func_append rmfiles " $odir/lt-$noexename.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the $objdir's in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+  func_mode_uninstall ${1+"$@"}
+fi
+
+test -z "$opt_mode" && {
+  help=$generic_help
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode '$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# where we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/gawk-5.0.1/extension/build-aux/missing b/gawk-5.0.1/extension/build-aux/missing
new file mode 100755
index 00000000000..f62bbae306c
--- /dev/null
+++ b/gawk-5.0.1/extension/build-aux/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2013-10-28.13; # UTC
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try '$0 --help' for more information"
+  exit 1
+fi
+
+case $1 in
+
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
+
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
+
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gawk-5.0.1/extension/configh.in b/gawk-5.0.1/extension/configh.in
new file mode 100644
index 00000000000..c398eb2662a
--- /dev/null
+++ b/gawk-5.0.1/extension/configh.in
@@ -0,0 +1,232 @@
+/* configh.in.  Generated from configure.ac by autoheader.  */
+
+/* the name of the file descriptor member of DIR */
+#undef DIR_FD_MEMBER_NAME
+
+#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+
+
+/* Define to 1 if translation of program messages to the user's native
+   language is requested. */
+#undef ENABLE_NLS
+
+/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
+   CoreFoundation framework. */
+#undef HAVE_CFLOCALECOPYCURRENT
+
+/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
+   the CoreFoundation framework. */
+#undef HAVE_CFPREFERENCESCOPYAPPVALUE
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+   */
+#undef HAVE_DCGETTEXT
+
+/* Define to 1 if you have the declaration of `dirfd', and to 0 if you don't.
+   */
+#undef HAVE_DECL_DIRFD
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you have the `dirfd' function. */
+#undef HAVE_DIRFD
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the `fdopendir' function. */
+#undef HAVE_FDOPENDIR
+
+/* Define to 1 if you have the `fmod' function. */
+#undef HAVE_FMOD
+
+/* Define to 1 if you have the `fnmatch' function. */
+#undef HAVE_FNMATCH
+
+/* Define to 1 if you have the <fnmatch.h> header file. */
+#undef HAVE_FNMATCH_H
+
+/* Define to 1 if you have the `getdtablesize' function. */
+#undef HAVE_GETDTABLESIZE
+
+/* Define to 1 if you have the `GetSystemTimeAsFileTime' function. */
+#undef HAVE_GETSYSTEMTIMEASFILETIME
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if you have the iconv() function and it works. */
+#undef HAVE_ICONV
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have fully functional mpfr and gmp libraries. */
+#undef HAVE_MPFR
+
+/* Define to 1 if you have the `nanosleep' function. */
+#undef HAVE_NANOSLEEP
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the `select' function. */
+#undef HAVE_SELECT
+
+/* Define to 1 if you have the `statvfs' function. */
+#undef HAVE_STATVFS
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if `st_blksize' is a member of `struct stat'. */
+#undef HAVE_STRUCT_STAT_ST_BLKSIZE
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/mkdev.h> header file. */
+#undef HAVE_SYS_MKDEV_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/statvfs.h> header file. */
+#undef HAVE_SYS_STATVFS_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/sysmacros.h> header file. */
+#undef HAVE_SYS_SYSMACROS_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Enable extensions on AIX 3, Interix.  */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris.  */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions on HP NonStop.  */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable general extensions on Solaris.  */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+
+
+/* Version number of package */
+#undef VERSION
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to 1 if on MINIX. */
+#undef _MINIX
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+   this defined. */
+#undef _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#undef _POSIX_SOURCE
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+#include "ext_custom.h"
diff --git a/gawk-5.0.1/extension/configure b/gawk-5.0.1/extension/configure
new file mode 100755
index 00000000000..c5dc3be1cd1
--- /dev/null
+++ b/gawk-5.0.1/extension/configure
@@ -0,0 +1,17822 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for GNU Awk Bundled Extensions 5.0.1.
+#
+# Report bugs to <bug-gawk@gnu.org>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and bug-gawk@gnu.org
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='GNU Awk Bundled Extensions'
+PACKAGE_TARNAME='gawk-extensions'
+PACKAGE_VERSION='5.0.1'
+PACKAGE_STRING='GNU Awk Bundled Extensions 5.0.1'
+PACKAGE_BUGREPORT='bug-gawk@gnu.org'
+PACKAGE_URL='http://www.gnu.org/software/gawk-extensions/'
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+gt_needs=
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+LIBMPFR
+pkgextensiondir
+LT_SYS_LIBRARY_PATH
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+LIBTOOL
+ac_ct_AR
+AR
+POSUB
+LTLIBINTL
+LIBINTL
+INTLLIBS
+LTLIBICONV
+LIBICONV
+INTL_MACOSX_LIBS
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+XGETTEXT_EXTRA_OPTIONS
+MSGMERGE
+XGETTEXT_015
+XGETTEXT
+GMSGFMT_015
+MSGFMT_015
+GMSGFMT
+MSGFMT
+GETTEXT_MACRO_VERSION
+USE_NLS
+SED
+EGREP
+GREP
+CPP
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_dependency_tracking
+enable_mpfr
+enable_nls
+with_gnu_ld
+enable_rpath
+with_libiconv_prefix
+with_libintl_prefix
+enable_largefile
+enable_static
+enable_shared
+with_pic
+enable_fast_install
+with_aix_soname
+with_sysroot
+enable_libtool_lock
+with_mpfr
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP
+LT_SYS_LIBRARY_PATH'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures GNU Awk Bundled Extensions 5.0.1 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/gawk-extensions]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of GNU Awk Bundled Extensions 5.0.1:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
+  --disable-mpfr          do not check for MPFR
+  --disable-nls           do not use Native Language Support
+  --disable-rpath         do not hardcode runtime library paths
+  --disable-largefile     omit support for large files
+  --enable-static[=PKGS]  build static libraries [default=no]
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
+  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
+  --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
+  --without-libintl-prefix     don't search for libintl in includedir and libdir
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
+  --with-mpfr=DIR         look for the mpfr and gmp libraries in DIR
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <bug-gawk@gnu.org>.
+GNU Awk Bundled Extensions home page: <http://www.gnu.org/software/gawk-extensions/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+GNU Awk Bundled Extensions configure 5.0.1
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_header_compiler=yes
+else
+  ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## ------------------------------- ##
+## Report this to bug-gawk@gnu.org ##
+## ------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
+# ----------------------------------------------------
+# Tries to find if the field MEMBER exists in type AGGR, after including
+# INCLUDES, setting cache variable VAR accordingly.
+ac_fn_c_check_member ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+$as_echo_n "checking for $2.$3... " >&6; }
+if eval \${$4+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$5
+int
+main ()
+{
+static $2 ac_aggr;
+if (sizeof ac_aggr.$3)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$4=yes"
+else
+  eval "$4=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$4
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_member
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by GNU Awk Bundled Extensions $as_me 5.0.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+gt_needs="$gt_needs "
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in build-aux "$srcdir"/build-aux; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+
+am__api_version='1.16'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+	# -L didn't work.
+	set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+	&& test "$*" != "X conftest.file $srcdir/configure"; then
+
+	# If neither matched, then we have a broken ls.  This can happen
+	# if, for instance, CONFIG_SHELL is bash and it inherits a
+	# broken ls alias from the environment.  This has actually
+	# happened.  Such a system could not be considered "sane".
+	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+	@$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gawk-extensions'
+ VERSION='5.0.1'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar  pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+$as_echo_n "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+	@echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+  { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+   (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }
+  case $?:`cat confinc.out 2>/dev/null` in #(
+  '0:this is the am__doit target') :
+    case $s in #(
+  BSD) :
+    am__include='.include' am__quote='"' ;; #(
+  *) :
+    am__include='include' am__quote='' ;;
+esac ;; #(
+  *) :
+     ;;
+esac
+  if test "$am__include" != "#"; then
+    _am_result="yes ($s style)"
+    break
+  fi
+done
+rm -f confinc.* confmf.*
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+$as_echo "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+  ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default"
+if test "x$ac_cv_header_minix_config_h" = xyes; then :
+  MINIX=yes
+else
+  MINIX=
+fi
+
+
+  if test "$MINIX" = yes; then
+
+$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h
+
+
+$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h
+
+
+$as_echo "#define _MINIX 1" >>confdefs.h
+
+  fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5
+$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; }
+if ${ac_cv_safe_to_define___extensions__+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#         define __EXTENSIONS__ 1
+          $ac_includes_default
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_safe_to_define___extensions__=yes
+else
+  ac_cv_safe_to_define___extensions__=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5
+$as_echo "$ac_cv_safe_to_define___extensions__" >&6; }
+  test $ac_cv_safe_to_define___extensions__ = yes &&
+    $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h
+
+  $as_echo "#define _ALL_SOURCE 1" >>confdefs.h
+
+  $as_echo "#define _GNU_SOURCE 1" >>confdefs.h
+
+  $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
+
+  $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for z/OS USS compilation" >&5
+$as_echo_n "checking for z/OS USS compilation... " >&6; }
+if ${ac_cv_zos_uss+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+if test "OS/390" = "`uname`"
+then
+  ac_cv_zos_uss=yes
+else
+  ac_cv_zos_uss=no
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_zos_uss}" >&5
+$as_echo "${ac_cv_zos_uss}" >&6; }
+if test "x$ac_cv_zos_uss" = "xyes"
+then
+    ac_zos_uss_cc_id=unknown
+  echo " $CC " | $EGREP ' (/bin/)?c89[ |_]' >/dev/null && ac_zos_uss_cc_id=c89
+  echo " $CC " | $EGREP ' (/bin/)?c99[ |_]' >/dev/null && ac_zos_uss_cc_id=xlc
+  echo " $CC " | $EGREP ' (/bin/)?cc[ |_]'  >/dev/null && ac_zos_uss_cc_id=cc
+  echo " $CC " | $EGREP ' (/bin/)?xlc[ |_]' >/dev/null && ac_zos_uss_cc_id=xlc
+  echo " $CC " | $EGREP ' (/bin/)?xlC[ |_]' >/dev/null && ac_zos_uss_cc_id=xlc++
+  echo " $CC " | $EGREP ' (/bin/)?xlc\+\+[ |_]' >/dev/null && ac_zos_uss_cc_id=xlc++
+  test "x$GCC" = "xyes" && ac_zos_uss_cc_id=gcc
+    CPPFLAGS="$CPPFLAGS -D_ALL_SOURCE -D_OPEN_SYS_UNLOCKED_EXT"
+  test "$ac_zos_uss_cc_id" != xlc++ && CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600"
+  case "$ac_zos_uss_cc_id" in
+  c89)
+                                        if test -n "$_C89_OPTIONS"
+    then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: CC = $CC" >&5
+$as_echo "$as_me: CC = $CC" >&6;}
+      { $as_echo "$as_me:${as_lineno-$LINENO}: _C89_OPTIONS = $_C89_OPTIONS" >&5
+$as_echo "$as_me: _C89_OPTIONS = $_C89_OPTIONS" >&6;}
+    else
+      as_fn_error $? "c89-setup-required
+To build GNU Awk using \"c89\", please set
+
+    _C89_OPTIONS=\"-W c,langlvl(stdc99,libext),haltonmsg(CCN3296)\"
+
+in your environment, and reconfigure. (The above flags cannot be specified
+in CFLAGS/CPPFLAGS, due to the parentheses.)" "$LINENO" 5
+    fi
+    ;;
+  gcc)
+        ;;
+  cc)
+    as_fn_error $? "cc-invalid
+The z/OS \"cc\" compiler does not build GNU Awk correctly.
+
+If the \"xlc\" or \"c89\" compiler is available, please set CC accordingly
+and reconfigure. (\"xlc\" is the recommended compiler on z/OS.)" "$LINENO" 5
+    ;;
+  xlc*)
+        CFLAGS="$CFLAGS -qlanglvl=stdc99:libext"
+        cat >zos-cc <<EOF
+#!/bin/sh
+#
+# This wrapper script addresses two annoying peculiarities of the IBM
+# xlc/c99 compiler on z/OS:
+#
+# 1. Missing header files are considered warnings by default rather
+#    than fatal errors;
+#
+# 2. Include directories specified with -I are searched _after_ the
+#    system include directories (for #include<> directives) rather
+#    than before.
+#
+# This script allows the code and the build system to assume standard
+# compiler behavior.
+#
+
+PS4='zos-cc: '
+REAL_CC="$CC"
+
+set -x
+\$REAL_CC -qhaltonmsg=CCN3296 -qnosearch "\$@" -qsearch=/usr/include
+EOF
+    chmod +x zos-cc
+    { $as_echo "$as_me:${as_lineno-$LINENO}: wrapping $CC with zos-cc to obtain standard behavior" >&5
+$as_echo "$as_me: wrapping $CC with zos-cc to obtain standard behavior" >&6;}
+    CC="`pwd`/zos-cc"
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized compiler environment" >&5
+$as_echo "$as_me: WARNING: unrecognized compiler environment" >&2;}
+    ;;
+  esac
+fi # ac_cv_zos_uss = yes
+
+
+INSTALL="$ac_aux_dir/install-sh -c"
+export INSTALL
+
+SKIP_MPFR=no
+# Check whether --enable-mpfr was given.
+if test "${enable_mpfr+set}" = set; then :
+  enableval=$enable_mpfr; if test "$enableval" = no
+	then
+		SKIP_MPFR=yes
+	fi
+
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
+$as_echo_n "checking whether NLS is requested... " >&6; }
+    # Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then :
+  enableval=$enable_nls; USE_NLS=$enableval
+else
+  USE_NLS=yes
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+$as_echo "$USE_NLS" >&6; }
+
+
+
+
+      GETTEXT_MACRO_VERSION=0.19
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGFMT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$MSGFMT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+    ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
+$as_echo "$MSGFMT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_GMSGFMT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $GMSGFMT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
+$as_echo "$GMSGFMT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+    *) MSGFMT_015=$MSGFMT ;;
+  esac
+
+  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+    *) GMSGFMT_015=$GMSGFMT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_XGETTEXT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$XGETTEXT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+    ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
+$as_echo "$XGETTEXT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+    rm -f messages.po
+
+    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+    *) XGETTEXT_015=$XGETTEXT ;;
+  esac
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MSGMERGE+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case "$MSGMERGE" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&5
+          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
+            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+    ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
+$as_echo "$MSGMERGE" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+        test -n "$localedir" || localedir='${datadir}/locale'
+
+
+    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+
+
+  ac_config_commands="$ac_config_commands po-directories"
+
+
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+      while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+        ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${acl_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$acl_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+        test "$with_gnu_ld" != no && break
+        ;;
+      *)
+        test "$with_gnu_ld" != yes && break
+        ;;
+      esac
+    fi
+  done
+  IFS="$acl_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${acl_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes
+  ;;
+*)
+  acl_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
+$as_echo "$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+                                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
+$as_echo_n "checking for shared library run path origin... " >&6; }
+if ${acl_cv_rpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
+$as_echo "$acl_cv_rpath" >&6; }
+  wl="$acl_cv_wl"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+    # Check whether --enable-rpath was given.
+if test "${enable_rpath+set}" = set; then :
+  enableval=$enable_rpath; :
+else
+  enable_rpath=yes
+fi
+
+
+
+
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+                                    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5
+$as_echo_n "checking for 64-bit host... " >&6; }
+if ${gl_cv_solaris_64bit+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef _LP64
+sixtyfour bits
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "sixtyfour bits" >/dev/null 2>&1; then :
+  gl_cv_solaris_64bit=yes
+else
+  gl_cv_solaris_64bit=no
+fi
+rm -f conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5
+$as_echo "$gl_cv_solaris_64bit" >&6; }
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS= 	}"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then :
+  withval=$with_libiconv_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+
+fi
+
+      LIBICONV=
+  LTLIBICONV=
+  INCICONV=
+  LIBICONV_PREFIX=
+      HAVE_LIBICONV=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='iconv '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+              else
+                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'iconv'; then
+                  LIBICONV_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
+$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
+if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <CoreFoundation/CFPreferences.h>
+int
+main ()
+{
+CFPreferencesCopyAppValue(NULL, NULL)
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  gt_cv_func_CFPreferencesCopyAppValue=yes
+else
+  gt_cv_func_CFPreferencesCopyAppValue=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
+$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+
+$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h
+
+  fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
+$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
+if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <CoreFoundation/CFLocale.h>
+int
+main ()
+{
+CFLocaleCopyCurrent();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  gt_cv_func_CFLocaleCopyCurrent=yes
+else
+  gt_cv_func_CFLocaleCopyCurrent=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     LIBS="$gt_save_LIBS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
+$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
+  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+
+$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h
+
+  fi
+  INTL_MACOSX_LIBS=
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+  fi
+
+
+
+
+
+
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+    case " $gt_needs " in
+    *" need-formatstring-macros "*) gt_api_version=3 ;;
+    *" need-ngettext "*) gt_api_version=2 ;;
+    *) gt_api_version=1 ;;
+  esac
+  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+    if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+
+
+        if test $gt_api_version -ge 3; then
+          gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+'
+        else
+          gt_revision_test_code=
+        fi
+        if test $gt_api_version -ge 2; then
+          gt_expression_test_code=' + * ngettext ("", "", 0)'
+        else
+          gt_expression_test_code=
+        fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
+$as_echo_n "checking for GNU gettext in libc... " >&6; }
+if eval \${$gt_func_gnugettext_libc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$gt_func_gnugettext_libc=yes"
+else
+  eval "$gt_func_gnugettext_libc=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$gt_func_gnugettext_libc
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+
+        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+
+
+
+
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCICONV; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
+$as_echo_n "checking for iconv... " >&6; }
+if ${am_cv_func_iconv+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+           iconv(cd,NULL,NULL,NULL,NULL);
+           iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+             iconv(cd,NULL,NULL,NULL,NULL);
+             iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+      LIBS="$am_save_LIBS"
+    fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
+$as_echo "$am_cv_func_iconv" >&6; }
+  if test "$am_cv_func_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
+$as_echo_n "checking for working iconv... " >&6; }
+if ${am_cv_func_iconv_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+                  am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        if test "$cross_compiling" = yes; then :
+  case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+
+int
+main ()
+{
+int result = 0;
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 1;
+        iconv_close (cd_utf8_to_88591);
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\263";
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 2;
+        iconv_close (cd_ascii_to_88591);
+      }
+  }
+  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304";
+        static char buf[2] = { (char)0xDE, (char)0xAD };
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = 1;
+        char *outptr = buf;
+        size_t outbytesleft = 1;
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+          result |= 4;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          result |= 8;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    result |= 16;
+  return result;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+  am_cv_func_iconv_works=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+        test "$am_cv_func_iconv_works" = no || break
+      done
+      LIBS="$am_save_LIBS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
+$as_echo "$am_cv_func_iconv_works" >&6; }
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+
+$as_echo "#define HAVE_ICONV 1" >>confdefs.h
+
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
+$as_echo_n "checking how to link with libiconv... " >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
+$as_echo "$LIBICONV" >&6; }
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+
+
+
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; then :
+  withval=$with_libintl_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+
+fi
+
+      LIBINTL=
+  LTLIBINTL=
+  INCINTL=
+  LIBINTL_PREFIX=
+      HAVE_LIBINTL=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='intl '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+                                    if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+                        if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                                    if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                                    if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$acl_hardcode_direct" = yes; then
+                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+              else
+                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = 'intl'; then
+                  LIBINTL_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = 'intl'; then
+                  LIBINTL_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
+$as_echo_n "checking for GNU gettext in libintl... " >&6; }
+if eval \${$gt_func_gnugettext_libintl+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+                        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$gt_func_gnugettext_libintl=yes"
+else
+  eval "$gt_func_gnugettext_libintl=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+                        if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+
+int
+main ()
+{
+
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  LIBINTL="$LIBINTL $LIBICONV"
+                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                 eval "$gt_func_gnugettext_libintl=yes"
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"
+fi
+eval ac_res=\$$gt_func_gnugettext_libintl
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+        fi
+
+                                        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+                    LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+
+
+    if test -n "$INTL_MACOSX_LIBS"; then
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+                LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+      fi
+    fi
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+
+$as_echo "#define ENABLE_NLS 1" >>confdefs.h
+
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
+$as_echo_n "checking whether to use NLS... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
+$as_echo "$USE_NLS" >&6; }
+  if test "$USE_NLS" = "yes"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
+$as_echo_n "checking where the gettext function comes from... " >&6; }
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
+$as_echo "$gt_source" >&6; }
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
+$as_echo_n "checking how to link with libintl... " >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
+$as_echo "$LIBINTL" >&6; }
+
+  for element in $INCINTL; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+      fi
+
+
+$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h
+
+
+$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h
+
+    fi
+
+        POSUB=po
+  fi
+
+
+
+    INTLLIBS="$LIBINTL"
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for nl_langinfo and CODESET" >&5
+$as_echo_n "checking for nl_langinfo and CODESET... " >&6; }
+if ${am_cv_langinfo_codeset+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <langinfo.h>
+int
+main ()
+{
+char* cs = nl_langinfo(CODESET); return !cs;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  am_cv_langinfo_codeset=yes
+else
+  am_cv_langinfo_codeset=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_langinfo_codeset" >&5
+$as_echo "$am_cv_langinfo_codeset" >&6; }
+  if test $am_cv_langinfo_codeset = yes; then
+
+$as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
+
+  fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5
+$as_echo_n "checking for LC_MESSAGES... " >&6; }
+if ${gt_cv_val_LC_MESSAGES+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <locale.h>
+int
+main ()
+{
+return LC_MESSAGES
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  gt_cv_val_LC_MESSAGES=yes
+else
+  gt_cv_val_LC_MESSAGES=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_val_LC_MESSAGES" >&5
+$as_echo "$gt_cv_val_LC_MESSAGES" >&6; }
+  if test $gt_cv_val_LC_MESSAGES = yes; then
+
+$as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h
+
+  fi
+
+
+ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default"
+if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_STAT_ST_BLKSIZE 1
+_ACEOF
+
+
+fi
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar lib "link -lib"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar lib "link -lib"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5
+$as_echo_n "checking the archiver ($AR) interface... " >&6; }
+if ${am_cv_ar_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+   am_cv_ar_interface=ar
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int some_variable = 0;
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
+  (eval $am_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+        am_cv_ar_interface=ar
+      else
+        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5'
+        { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5
+  (eval $am_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+        if test "$ac_status" -eq 0; then
+          am_cv_ar_interface=lib
+        else
+          am_cv_ar_interface=unknown
+        fi
+      fi
+      rm -f conftest.lib libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5
+$as_echo "$am_cv_ar_interface" >&6; }
+
+case $am_cv_ar_interface in
+ar)
+  ;;
+lib)
+  # Microsoft lib, so override with the ar-lib wrapper script.
+  # FIXME: It is wrong to rewrite AR.
+  # But if we don't then we get into trouble of one sort or another.
+  # A longer-term fix would be to have automake use am__AR in this case,
+  # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something
+  # similar.
+  AR="$am_aux_dir/ar-lib $AR"
+  ;;
+unknown)
+  as_fn_error $? "could not determine $AR interface" "$LINENO" 5
+  ;;
+esac
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then :
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
+$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
+if ${ac_cv_sys_largefile_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+	 # IRIX 6.2 and later do not support large files by default,
+	 # so use the C compiler's -n32 option if that helps.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 CC="$CC -n32"
+	 if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_largefile_CC=' -n32'; break
+fi
+rm -f core conftest.err conftest.$ac_objext
+	 break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
+$as_echo "$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  if test $ac_cv_sys_file_offset_bits = unknown; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+;;
+esac
+rm -rf conftest*
+  fi
+
+
+fi
+
+# Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_static=no
+fi
+
+
+
+
+
+
+
+
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.6'
+macro_revision='2.4.6'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case $ECHO in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi
+fi
+
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM=$NM
+else
+  lt_nm_to_check=${ac_tool_prefix}nm
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS=$lt_save_ifs
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break 2
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break 2
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS=$lt_save_ifs
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols -headers"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring=ABCD
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test 17 != "$i" # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n "$lt_cv_sys_max_cmd_len"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test yes != "$GCC"; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test 0 -eq "$ac_status"; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test 0 -ne "$ac_status"; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test no = "$lt_cv_ar_at_file"; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  bitrig* | openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test ia64 = "$host_cpu"; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS=conftstm.$ac_objext
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test yes = "$pipe_works"; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+   if test yes = "$GCC"; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE=32
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE=64
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test yes != "$lt_cv_cc_needs_belf"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS=$SAVE_CFLAGS
+  fi
+  ;;
+*-*solaris*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*|x86_64-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD=${LD-ld}_sol2
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks=$enable_libtool_lock
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test yes != "$lt_cv_path_mainfest_tool"; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "$LT_MULTI_MODULE"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+    fi
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for lt_pkg in $withval; do
+	IFS=$lt_save_ifs
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test set != "${COLLECT_NAMES+set}"; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac
+fi
+
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC=$CC
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test yes = "$GCC"; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test yes = "$GCC"; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test yes = "$lt_cv_prog_compiler_static_works"; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test no = "$ld_shlibs"; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct=no
+	hardcode_direct_absolute=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      export_dynamic_flag_spec='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=/usr/lib:/lib
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' $wl-bernotok'
+	  allow_undefined_flag=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS=$save_LDFLAGS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+	link_all_deplibs=no
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs=yes
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec='$wl-E'
+	else
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='$wl-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test no = "$ld_shlibs" && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test yes = "$GCC"; then
+  case $host_os in
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary...
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo = "/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test yes = "$hardcode_automatic"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$hardcode_direct" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test yes != "$enable_dlopen"; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen=load_add_on
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen=LoadLibrary
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+    # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+
+    lt_cv_dlopen=dyld
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test no = "$lt_cv_dlopen"; then
+    enable_dlopen=no
+  else
+    enable_dlopen=yes
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS=$LDFLAGS
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS=$LIBS
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test yes = "$lt_cv_dlopen_self"; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test yes = "$cross_compiling"; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report what library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test no = "$can_build_shared" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test yes = "$enable_shared" && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test yes = "$enable_shared" || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC=$lt_save_CC
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+pkgextensiondir='${libdir}/gawk'${EXTENSIONDIR}
+
+
+if test "$GCC" = yes
+then
+	CFLAGS="$CFLAGS -Wall"	# Don't add -Wextra, hurts older gcc
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for special development options" >&5
+$as_echo_n "checking for special development options... " >&6; }
+if test -f $srcdir/../.developing
+then
+	if test "$GCC" = yes
+	then
+		CFLAGS="$CFLAGS -Wall -fno-builtin -g3 -gdwarf-2"
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+for ac_header in fnmatch.h limits.h sys/mkdev.h sys/param.h sys/select.h \
+		sys/statvfs.h sys/sysmacros.h sys/time.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+  as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$as_ac_Header=yes"
+else
+  eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_opendir+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_opendir+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+  ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
+$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
+if ${ac_cv_header_time+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_time=yes
+else
+  ac_cv_header_time=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
+$as_echo "$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
+
+$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
+
+fi
+
+
+case `uname -m` in
+*'Power Macintosh'*)
+	: ;;
+*)
+	case $SKIP_MPFR in
+	no)
+
+# Check whether --with-mpfr was given.
+if test "${with_mpfr+set}" = set; then :
+  withval=$with_mpfr; _do_mpfr=$withval
+else
+  _do_mpfr=yes
+fi
+
+
+  if test "$_do_mpfr" != "no" ; then
+     if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+     fi
+
+        _mpfr_save_libs=$LIBS
+        _combo="-lmpfr -lgmp"
+        LIBS="$LIBS $_combo"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mpfr via \"$_combo\" is present and usable" >&5
+$as_echo_n "checking whether mpfr via \"$_combo\" is present and usable... " >&6; }
+
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+#include <stdio.h>
+#include <mpfr.h>
+#include <gmp.h>
+
+int
+main ()
+{
+
+mpfr_t p;
+mpz_t z;
+mpfr_init(p);
+mpz_init(z);
+mpfr_printf("%Rf%Zd", p, z);
+mpfr_clear(p);
+mpz_clear(z);
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  _found_mpfr=yes
+else
+  _found_mpfr=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_found_mpfr" >&5
+$as_echo "$_found_mpfr" >&6; }
+
+        LIBS=$_mpfr_save_libs
+
+        if test $_found_mpfr = yes ; then
+
+$as_echo "#define HAVE_MPFR 1" >>confdefs.h
+
+           LIBMPFR=$_combo
+
+           break
+        fi
+
+     unset _mpfr_save_libs
+     unset _combo
+     unset _found_mpfr
+  fi
+
+		;;
+	esac
+	;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing fmod" >&5
+$as_echo_n "checking for library containing fmod... " >&6; }
+if ${ac_cv_search_fmod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char fmod ();
+int
+main ()
+{
+return fmod ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' m; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_fmod=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_fmod+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_fmod+:} false; then :
+
+else
+  ac_cv_search_fmod=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_fmod" >&5
+$as_echo "$ac_cv_search_fmod" >&6; }
+ac_res=$ac_cv_search_fmod
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+for ac_func in fdopendir fmod fnmatch getdtablesize \
+		gettimeofday nanosleep select statvfs \
+		GetSystemTimeAsFileTime
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+  for ac_func in dirfd
+do :
+  ac_fn_c_check_func "$LINENO" "dirfd" "ac_cv_func_dirfd"
+if test "x$ac_cv_func_dirfd" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DIRFD 1
+_ACEOF
+
+fi
+done
+
+  ac_fn_c_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include <sys/types.h>
+      #include <dirent.h>
+"
+if test "x$ac_cv_have_decl_dirfd" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_DIRFD $ac_have_decl
+_ACEOF
+
+  if test $ac_cv_have_decl_dirfd = no; then
+    HAVE_DECL_DIRFD=0
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether dirfd is a macro" >&5
+$as_echo_n "checking whether dirfd is a macro... " >&6; }
+if ${gl_cv_func_dirfd_macro+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <dirent.h>
+#ifdef dirfd
+ dirent_header_defines_dirfd
+#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "dirent_header_defines_dirfd" >/dev/null 2>&1; then :
+  gl_cv_func_dirfd_macro=yes
+else
+  gl_cv_func_dirfd_macro=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_dirfd_macro" >&5
+$as_echo "$gl_cv_func_dirfd_macro" >&6; }
+
+  # Use the replacement only if we have no function or macro with that name.
+  if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no; then
+    if test $ac_cv_have_decl_dirfd = yes; then
+      # If the system declares dirfd already, let's declare rpl_dirfd instead.
+      REPLACE_DIRFD=1
+    fi
+  fi
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get the file descriptor associated with an open DIR*" >&5
+$as_echo_n "checking how to get the file descriptor associated with an open DIR*... " >&6; }
+if ${gl_cv_sys_dir_fd_member_name+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+      dirfd_save_CFLAGS=$CFLAGS
+      for ac_expr in d_fd dd_fd; do
+
+        CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+           #include <sys/types.h>
+           #include <dirent.h>
+int
+main ()
+{
+DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  dir_fd_found=yes
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+        CFLAGS=$dirfd_save_CFLAGS
+        test "$dir_fd_found" = yes && break
+      done
+      test "$dir_fd_found" = yes || ac_expr=no_such_member
+
+      gl_cv_sys_dir_fd_member_name=$ac_expr
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_sys_dir_fd_member_name" >&5
+$as_echo "$gl_cv_sys_dir_fd_member_name" >&6; }
+  if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
+
+cat >>confdefs.h <<_ACEOF
+#define DIR_FD_MEMBER_NAME $gl_cv_sys_dir_fd_member_name
+_ACEOF
+
+  fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+
+ac_config_headers="$ac_config_headers config.h:configh.in"
+
+
+
+ac_config_files="$ac_config_files Makefile po/Makefile.in"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by GNU Awk Bundled Extensions $as_me 5.0.1, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-gawk@gnu.org>.
+GNU Awk Bundled Extensions home page: <http://www.gnu.org/software/gawk-extensions/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+GNU Awk Bundled Extensions config.status 5.0.1
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+    # from automake < 1.5.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
+nm_file_list_spec \
+lt_cv_truncate_bin \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:configh.in" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  # TODO: see whether this extra hack can be removed once we start
+  # requiring Autoconf 2.70 or later.
+  case $CONFIG_FILES in #(
+  *\'*) :
+    eval set x "$CONFIG_FILES" ;; #(
+  *) :
+    set x $CONFIG_FILES ;; #(
+  *) :
+     ;;
+esac
+  shift
+  # Used to flag and report bootstrapping failures.
+  am_rc=0
+  for am_mf
+  do
+    # Strip MF so we end up with the name of the file.
+    am_mf=`$as_echo "$am_mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile which includes
+    # dependency-tracking related rules and includes.
+    # Grep'ing the whole file directly is not great: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+      || continue
+    am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$am_mf" : 'X\(//\)[^/]' \| \
+	 X"$am_mf" : 'X\(//\)$' \| \
+	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$am_mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$am_mf" : 'X\(//\)$' \| \
+	 X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$am_mf" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    { echo "$as_me:$LINENO: cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles" >&5
+   (cd "$am_dirpart" \
+      && sed -e '/# am--include-marker/d' "$am_filepart" \
+        | $MAKE -f - am--depfiles) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } || am_rc=$?
+  done
+  if test $am_rc -ne 0; then
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+    for automatic dependency tracking.  Try re-running configure with the
+    '--disable-dependency-tracking' option to at least be able to build
+    the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+  { am_dirpart=; unset am_dirpart;}
+  { am_filepart=; unset am_filepart;}
+  { am_mf=; unset am_mf;}
+  { am_rc=; unset am_rc;}
+  rm -f conftest-deps.mk
+}
+ ;;
+    "po-directories":C)
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        # Treat a directory as a PO directory if and only if it has a
+        # POTFILES.in file. This allows packages to have multiple PO
+        # directories under different names or in different locations.
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          gt_tab=`printf '\t'`
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          # Compute POFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+          # Compute UPDATEPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+          # Compute DUMMYPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+          # Compute GMOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          GMOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and where our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain=$ac_aux_dir/ltmain.sh
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/gawk-5.0.1/extension/configure.ac b/gawk-5.0.1/extension/configure.ac
new file mode 100644
index 00000000000..f4f458cd330
--- /dev/null
+++ b/gawk-5.0.1/extension/configure.ac
@@ -0,0 +1,130 @@
+dnl
+dnl configure.ac --- autoconf input file for gawk
+dnl
+dnl Copyright (C) 2012-2018 the Free Software Foundation, Inc.
+dnl
+dnl This file is part of GAWK, the GNU implementation of the
+dnl AWK Programming Language.
+dnl
+dnl GAWK is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl GAWK is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+dnl
+
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT([GNU Awk Bundled Extensions],[5.0.1],[bug-gawk@gnu.org],[gawk-extensions])
+
+AC_PREREQ([2.69])
+
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_AUX_DIR([build-aux])
+
+AM_INIT_AUTOMAKE([1.15 -Wall -Werror])
+
+
+AC_USE_SYSTEM_EXTENSIONS
+AC_ZOS_USS
+
+INSTALL="$ac_aux_dir/install-sh -c"
+export INSTALL
+
+SKIP_MPFR=no
+AC_ARG_ENABLE([mpfr],
+	[AS_HELP_STRING([--disable-mpfr],[do not check for MPFR])],
+	if test "$enableval" = no
+	then
+		SKIP_MPFR=yes
+	fi
+)
+
+dnl Set the programming language for checks. Fortunately,
+dnl this only needs to be set once, since everything is in C.
+AC_LANG([C])
+
+dnl initialize GNU gettext
+dnl this seems to help with finding MPFR on some systems, too.
+AM_GNU_GETTEXT([external])
+AM_GNU_GETTEXT_VERSION([0.19.7])
+AM_LANGINFO_CODESET
+gt_LC_MESSAGES
+
+dnl checks for structure members
+AC_CHECK_MEMBERS([struct stat.st_blksize])
+
+AM_PROG_AR
+AC_SYS_LARGEFILE
+AC_DISABLE_STATIC
+LT_INIT
+dnl AC_PROG_INSTALL
+
+dnl use the same definition as the main configure script.
+dnl EXTENSIONDIR is exported if it was set there.
+dnl N.B. We must use ${libdir}/gawk instead of $pkglibdir because $pkglibdir
+dnl is set to ${libdir}/gawk-extensions, which is not what we want.
+AC_SUBST([pkgextensiondir], ['${libdir}/gawk'${EXTENSIONDIR}])
+
+if test "$GCC" = yes
+then
+	CFLAGS="$CFLAGS -Wall"	# Don't add -Wextra, hurts older gcc
+fi
+
+AC_MSG_CHECKING([for special development options])
+if test -f $srcdir/../.developing
+then
+	if test "$GCC" = yes
+	then
+		CFLAGS="$CFLAGS -Wall -fno-builtin -g3 -gdwarf-2"
+	fi
+	AC_MSG_RESULT([yes])
+else
+	AC_MSG_RESULT([no])
+fi
+
+AC_CHECK_HEADERS(fnmatch.h limits.h sys/mkdev.h sys/param.h sys/select.h \
+		sys/statvfs.h sys/sysmacros.h sys/time.h)
+
+AC_HEADER_DIRENT
+dnl 12/2017: AC_HEADER_MAJOR no longer works on recent Fedora / GLIBC.
+dnl Instead we just check for the headers in the call above.
+dnl AC_HEADER_MAJOR
+AC_HEADER_TIME
+
+dnl check for mpfr support
+case `uname -m` in
+*'Power Macintosh'*)
+	: ;;
+*)
+	case $SKIP_MPFR in
+	no)	GNUPG_CHECK_MPFR
+		;;
+	esac
+	;;
+esac
+
+AC_SEARCH_LIBS(fmod, m)
+AC_CHECK_FUNCS(fdopendir fmod fnmatch getdtablesize \
+		gettimeofday nanosleep select statvfs \
+		GetSystemTimeAsFileTime)
+
+GAWK_FUNC_DIRFD
+GAWK_PREREQ_DIRFD
+
+dnl checks for compiler characteristics
+AC_C_INLINE
+
+AC_CONFIG_HEADERS([config.h:configh.in])
+AH_BOTTOM([#include "ext_custom.h"])
+
+AC_CONFIG_FILES(Makefile po/Makefile.in)
+AC_OUTPUT
diff --git a/gawk-5.0.1/extension/ext_custom.h b/gawk-5.0.1/extension/ext_custom.h
new file mode 100644
index 00000000000..b192f8f5b0c
--- /dev/null
+++ b/gawk-5.0.1/extension/ext_custom.h
@@ -0,0 +1,37 @@
+/*
+ * ext_custom.h
+ *
+ * This file is for use on systems where Autoconf isn't quite able to
+ * get things right. It is appended to the bottom of config.h by configure,
+ * in order to override definitions from Autoconf that are erroneous. See
+ * the manual for more information.
+ *
+ * If you make additions to this file for your system, please send
+ * the information to bug-gawk@gnu.org.
+ */
+
+/* 
+ * Copyright (C) 2015 the Free Software Foundation, Inc.
+ * 
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ * 
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/* From Michal Jaegermann for bleeding edge GLIBC. */
+#if defined _GNU_SOURCE && !defined _DEFAULT_SOURCE
+# define _DEFAULT_SOURCE
+#endif
diff --git a/gawk-5.0.1/extension/filefuncs.3am b/gawk-5.0.1/extension/filefuncs.3am
new file mode 100644
index 00000000000..571fdea9c0d
--- /dev/null
+++ b/gawk-5.0.1/extension/filefuncs.3am
@@ -0,0 +1,378 @@
+.TH FILEFUNCS 3am "Feb 21 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+filefuncs \- provide some file related functionality to gawk
+.SH SYNOPSIS
+.ft CW
+@load "filefuncs"
+.sp
+result = chdir("/some/directory")
+.sp
+result = stat("/some/path", statdata [, follow])
+.sp
+flags = or(FTS_PHYSICAL, ...)
+.br
+result = fts(pathlist, flags, filedata)
+.ft R
+.SH DESCRIPTION
+The
+.I filefuncs
+extension adds several functions that provide access to
+file-related facilities.
+.SS chdir()
+The
+.B chdir()
+function is a direct hook to the
+.IR chdir (2)
+system call to change the current directory.
+It returns zero
+upon success or less than zero upon error.
+In the latter case it updates
+.BR ERRNO .
+.SS stat()
+The
+.B stat()
+function provides a hook into the
+.IR stat (2)
+system call.
+It returns zero
+upon success or less than zero upon error.
+In the latter case it updates
+.BR ERRNO .
+By default, it uses
+.IR lstat (2).
+However, if passed a third argument, it uses
+.IR stat (2),
+instead.
+.PP
+In all cases, it clears the
+.B statdata
+array.
+When the call is successful,
+.B stat()
+fills the
+.B statdata
+array with information retrieved from the filesystem, as follows:
+.TP
+\fBstatdata["name"]\fP
+The name of the file.
+.TP
+\fBstatdata["dev"]\fP
+Corresponds to the
+.I st_dev
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["ino"]\fP
+Corresponds to the
+.I st_ino
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["mode"]\fP
+Corresponds to the
+.I st_mode
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["nlink"]\fP
+Corresponds to the
+.I st_nlink
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["uid"]\fP
+Corresponds to the
+.I st_uid
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["gid"]\fP
+Corresponds to the
+.I st_gid
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["size"]\fP
+Corresponds to the
+.I st_size
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["atime"]\fP
+Corresponds to the
+.I st_atime
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["mtime"]\fP
+Corresponds to the
+.I st_mtime
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["ctime"]\fP
+Corresponds to the
+.I st_ctime
+field in the
+.IR "struct stat" .
+.TP
+\fBstatdata["rdev"]\fP
+Corresponds to the
+.I st_rdev
+field in the
+.IR "struct stat" .
+This element is only present for device files.
+.TP
+\fBstatdata["major"]\fP
+Corresponds to the
+.I st_major
+field in the
+.IR "struct stat" .
+This element is only present for device files.
+.TP
+\fBstatdata["minor"]\fP
+Corresponds to the
+.I st_minor
+field in the
+.IR "struct stat" .
+This element is only present for device files.
+.TP
+\fBstatdata["blksize"]\fP
+Corresponds to the
+.I st_blksize
+field in the
+.IR "struct stat" ,
+if this field is present on your system.
+(It is present on all modern systems that we know of.)
+.TP
+\fBstatdata["pmode"]\fP
+A human-readable version of the mode value, such as printed by
+.IR ls (1).
+For example, \fB"-rwxr-xr-x"\fP.
+.TP
+\fBstatdata["linkval"]\fP
+If the named file is a symbolic link, this element will exist
+and its value is the value of the symbolic link (where the
+symbolic link points to).
+.TP
+\fBstatdata["type"]\fP
+The type of the file as a string. One of
+\fB"file"\fP,
+\fB"blockdev"\fP,
+\fB"chardev"\fP,
+\fB"directory"\fP,
+\fB"socket"\fP,
+\fB"fifo"\fP,
+\fB"symlink"\fP,
+\fB"door"\fP,
+or
+\fB"unknown"\fP.
+Not all systems support all file types.
+.SS fts()
+The
+.B fts()
+function provides a hook to the
+.IR fts (3)
+set of routines for traversing file hierarchies.
+Instead of returning data about one file at a time in a stream,
+it fills in a multi-dimensional array with data about each file and
+directory encountered in the requested hierarchies.
+.PP
+The arguments are as follows:
+.TP
+.B pathlist
+An array of filenames.  The element values are used; the index values are ignored.
+.TP
+.B flags
+This should be the bitwise OR of one or more of the following
+predefined flag values.  At least one of
+.B FTS_LOGICAL
+or
+.B FTS_PHYSICAL
+must be provided; otherwise
+.B fts()
+returns an error value and sets
+.BR ERRNO .
+.RS
+.TP
+.B FTS_LOGICAL
+Do a ``logical'' file traversal, where the information returned for
+a symbolic link refers to the linked-to file, and not to the
+symbolic link itself.
+This flag is mutually exclusive with
+.BR FTS_PHYSICAL .
+.TP
+.B FTS_PHYSICAL
+Do a ``physical'' file traversal, where the information returned for
+a symbolic link refers to the symbolic link itself.
+This flag is mutually exclusive with
+.BR FTS_LOGICAL .
+.TP
+.B FTS_NOCHDIR
+As a performance optimization, the
+.IR fts (3)
+routines change directory as they traverse a file hierarchy.
+This flag disables that optimization.
+.TP
+.B FTS_COMFOLLOW
+Immediately follow a symbolic link named in
+.BR pathlist ,
+whether or not
+.B FTS_LOGICAL
+is set.
+.TP
+.B FTS_SEEDOT
+By default, the
+.IR fts (3)
+routines do not return entries for ``.'' and ``..''.
+This option causes entries for ``..'' to also be included.
+(The AWK extension always includes an entry for ``.'', see below.)
+.TP
+.B FTS_XDEV
+During a traversal, do not cross onto a different mounted filesystem.
+.TP
+.B FTS_SKIP
+When set, causes top level directories to not be descended into.
+.RE
+.TP
+.B filedata
+The
+.B filedata
+array is first cleared.
+Then,
+.B fts()
+creates an element in
+.B filedata
+for every element in
+.BR pathlist .
+The index is the name of the directory or file given in
+.BR pathlist .
+The element for this index is itself an array.
+There are two cases.
+.RS
+.TP
+The path is a file.
+In this case, the array contains two or three elements:
+.RS
+.TP
+\fB"path"\fP
+The full path to this file, starting from the ``root'' that was given
+in the
+.B pathlist
+array.
+.TP
+\fB"stat"\fP
+This element is itself an array, containing the same information as provided
+by the
+.B stat()
+function described earlier for its
+.B statdata
+argument.
+The element may not be present if
+.IR stat (2)
+for the file failed.
+.TP
+\fB"error"\fP
+If some kind of error was encountered, the array will also
+contain an element named \fB"error"\fP, which is a string describing the error.
+.RE
+.TP
+The path is a directory.
+In this case, the array contains one element for each entry in the directory.
+If an entry is a file, that element is as for files, just described.
+If the entry is a directory, that element is (recursively), an array describing
+the subdirectory.
+If
+.B FTS_SEEDOT
+was provided in the flags, then there will also be an element named
+\fB".."\fP.  This element will be an array containing the data
+as provided by
+.BR stat() .
+.sp
+In addition, there will be an element whose index is \fB"."\fP.
+This element is an array containing the same two or three elements
+as for a file:
+\fB"path"\fP,
+\fB"stat"\fP,
+and
+\fB"error"\fP.
+.RE
+.PP
+The
+.B fts()
+function returns 0 if there were no errors. Otherwise it returns \-1.
+.SH NOTES
+The AWK
+.B fts()
+extension does not exactly mimic the interface of the
+.IR fts (3)
+routines, choosing instead to provide an interface that is based
+on associative arrays, which should be more comfortable to use from
+an AWK program.  This includes the lack of a comparison function, since
+.I gawk
+already provides powerful array sorting facilities.  While an
+.IR fts_read() \-like
+interface could have been provided, this felt less natural than
+simply creating a multi-dimensional array to represent the file
+hierarchy and its information.
+.PP
+Nothing prevents AWK code from changing the predefined
+.BI FTS_ xx
+values, but doing so may cause strange results when
+the changed values are passed to
+.BR fts() .
+.SH BUGS
+There are many more file-related functions for which AWK
+interfaces would be desirable.
+.PP
+It's not clear why I thought adding
+.B FTS_SKIP
+was a good idea.
+.SH EXAMPLE
+See
+.B test/fts.awk
+in the
+.I gawk
+distribution for an example.
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR fnmatch (3am),
+.IR fork (3am),
+.IR inplace (3am),
+.IR ordchr (3am),
+.IR readdir (3am),
+.IR readfile (3am),
+.IR revoutput (3am),
+.IR rwarray (3am),
+.IR time (3am).
+.PP
+.IR chdir (2),
+.IR fts (3),
+.IR stat (2).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/filefuncs.c b/gawk-5.0.1/extension/filefuncs.c
new file mode 100644
index 00000000000..1ea25dbcac2
--- /dev/null
+++ b/gawk-5.0.1/extension/filefuncs.c
@@ -0,0 +1,935 @@
+/*
+ * filefuncs.c - Builtin functions that provide initial minimal iterface
+ *		 to the file system.
+ *
+ * Arnold Robbins, update for 3.1, Mon Nov 23 12:53:39 EST 1998
+ * Arnold Robbins and John Haque, update for 3.1.4, applied Mon Jun 14 13:55:30 IDT 2004
+ * Arnold Robbins and Andrew Schorr, revised for new extension API, May 2012.
+ * Arnold Robbins, add fts(), August 2012
+ * Arnold Robbins, add statvfs(), November 2015
+ */
+
+/*
+ * Copyright (C) 2001, 2004, 2005, 2010-2018
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _BSD_SOURCE
+
+#ifdef __VMS
+#if (__CRTL_VER >= 70200000) && !defined (__VAX)
+#define _LARGEFILE 1
+#endif
+
+#ifndef __VAX
+#ifdef __CRTL_VER
+#if __CRTL_VER >= 80200000
+#define _USE_STD_STAT 1
+#endif
+#endif
+#endif
+#define _POSIX_C_SOURCE 1
+#define _XOPEN_SOURCE 1
+#include <stat.h>
+#ifndef S_ISVTX
+#define S_ISVTX (0)
+#endif
+#ifndef major
+#define major(s) (s)
+#endif
+#ifndef minor
+#define minor(s) (0)
+#endif
+#include <unixlib.h>
+#endif
+
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif /* HAVE_SYS_PARAM_H */
+
+#if HAVE_SYS_SYSMACROS_H
+#include <sys/sysmacros.h>
+#elif HAVE_SYS_MKDEV_H
+#include <sys/mkdev.h>
+#endif /* HAVE_SYS_MKDEV_H */
+
+#include <sys/types.h>
+
+#include <sys/stat.h>
+
+#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS)
+#include <sys/statvfs.h>
+#endif
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#include "gawkfts.h"
+#include "stack.h"
+
+#ifndef S_IFLNK
+#define lstat stat
+#define S_ISLNK(s) 0
+#define readlink(f,b,bs) (-1)
+#endif
+
+#ifdef __MINGW32__
+#define S_IRGRP S_IRUSR
+#define S_IWGRP S_IWUSR
+#define S_IXGRP S_IXUSR
+#define S_IROTH S_IRUSR
+#define S_IWOTH S_IWUSR
+#define S_IXOTH S_IXUSR
+#define S_ISUID 0
+#define S_ISGID 0
+#define S_ISVTX 0
+#define major(s) (s)
+#define minor(s) (0)
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+/* get_inode --- get the inode of a file */
+static long long
+get_inode(const char *fname)
+{
+	HANDLE fh;
+	BY_HANDLE_FILE_INFORMATION info;
+
+	fh = CreateFile(fname, 0, 0, NULL, OPEN_EXISTING,
+			FILE_FLAG_BACKUP_SEMANTICS, NULL);
+	if (fh == INVALID_HANDLE_VALUE)
+		return 0;
+	if (GetFileInformationByHandle(fh, &info)) {
+		long long inode = info.nFileIndexHigh;
+
+		inode <<= 32;
+		inode += info.nFileIndexLow;
+		return inode;
+	}
+	return 0;
+}
+#endif
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static awk_bool_t init_filefuncs(void);
+static awk_bool_t (*init_func)(void) = init_filefuncs;
+static const char *ext_version = "filefuncs extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+
+/*  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)
+{
+	awk_value_t newdir;
+	int ret = -1;
+
+	assert(result != NULL);
+
+	if (get_argument(0, AWK_STRING, & newdir)) {
+		ret = chdir(newdir.str_value.str);
+		if (ret < 0)
+			update_ERRNO_int(errno);
+	}
+
+	return make_number(ret, result);
+}
+
+/* format_mode --- turn a stat mode field into something readable */
+
+static char *
+format_mode(unsigned long fmode)
+{
+	static char outbuf[12];
+	static struct ftype_map {
+		unsigned int mask;
+		int charval;
+	} ftype_map[] = {
+		{ S_IFREG, '-' },	/* redundant */
+		{ S_IFBLK, 'b' },
+		{ S_IFCHR, 'c' },
+		{ S_IFDIR, 'd' },
+#ifdef S_IFSOCK
+		{ S_IFSOCK, 's' },
+#endif
+#ifdef S_IFIFO
+		{ S_IFIFO, 'p' },
+#endif
+#ifdef S_IFLNK
+		{ S_IFLNK, 'l' },
+#endif
+#ifdef S_IFDOOR	/* Solaris weirdness */
+		{ S_IFDOOR, 'D' },
+#endif /* S_IFDOOR */
+	};
+	static struct mode_map {
+		unsigned int mask;
+		int rep;
+	} map[] = {
+		{ S_IRUSR, 'r' }, { S_IWUSR, 'w' }, { S_IXUSR, 'x' },
+		{ S_IRGRP, 'r' }, { S_IWGRP, 'w' }, { S_IXGRP, 'x' },
+		{ S_IROTH, 'r' }, { S_IWOTH, 'w' }, { S_IXOTH, 'x' },
+	};
+	static struct setuid_map {
+		unsigned int mask;
+		int index;
+		int small_rep;
+		int big_rep;
+	} setuid_map[] = {
+		{ S_ISUID, 3, 's', 'S' }, /* setuid bit */
+		{ S_ISGID, 6, 's', 'l' }, /* setgid without execute == locking */
+		{ S_ISVTX, 9, 't', 'T' }, /* the so-called "sticky" bit */
+	};
+	int i, j, k;
+
+	strcpy(outbuf, "----------");
+
+	/* first, get the file type */
+	i = 0;
+	for (j = 0, k = sizeof(ftype_map)/sizeof(ftype_map[0]); j < k; j++) {
+		if ((fmode & S_IFMT) == ftype_map[j].mask) {
+			outbuf[i] = ftype_map[j].charval;
+			break;
+		}
+	}
+
+	/* now the permissions */
+	for (j = 0, k = sizeof(map)/sizeof(map[0]); j < k; j++) {
+		i++;
+		if ((fmode & map[j].mask) != 0)
+			outbuf[i] = map[j].rep;
+	}
+
+	i++;
+	outbuf[i] = '\0';
+
+	/* tweaks for the setuid / setgid / sticky bits */
+	for (j = 0, k = sizeof(setuid_map)/sizeof(setuid_map[0]); j < k; j++) {
+		if (fmode & setuid_map[j].mask) {
+			if (outbuf[setuid_map[j].index] == 'x')
+				outbuf[setuid_map[j].index] = setuid_map[j].small_rep;
+			else
+				outbuf[setuid_map[j].index] = setuid_map[j].big_rep;
+		}
+	}
+
+	return outbuf;
+}
+
+/* read_symlink --- read a symbolic link into an allocated buffer.
+   This is based on xreadlink; the basic problem is that lstat cannot be relied
+   upon to return the proper size for a symbolic link.  This happens,
+   for example, on GNU/Linux in the /proc filesystem, where the symbolic link
+   sizes are often 0. */
+
+#ifndef SIZE_MAX
+# define SIZE_MAX ((size_t) -1)
+#endif
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+#define MAXSIZE (SIZE_MAX < SSIZE_MAX ? SIZE_MAX : SSIZE_MAX)
+
+static char *
+read_symlink(const char *fname, size_t bufsize, ssize_t *linksize)
+{
+	if (bufsize)
+		bufsize += 2;
+	else
+		bufsize = BUFSIZ * 2;
+
+	/* Make sure that bufsize >= 2 and within range */
+	if (bufsize > MAXSIZE || bufsize < 2)
+		bufsize = MAXSIZE;
+
+	while (1) {
+		char *buf;
+
+		emalloc(buf, char *, bufsize, "read_symlink");
+		if ((*linksize = readlink(fname, buf, bufsize)) < 0) {
+			/* On AIX 5L v5.3 and HP-UX 11i v2 04/09, readlink
+			   returns -1 with errno == ERANGE if the buffer is
+			   too small.  */
+			if (errno != ERANGE) {
+				gawk_free(buf);
+				return NULL;
+			}
+		}
+		/* N.B. This test is safe because bufsize must be >= 2 */
+		else if ((size_t)*linksize <= bufsize-2) {
+			buf[*linksize] = '\0';
+			return buf;
+		}
+		gawk_free(buf);
+		if (bufsize <= MAXSIZE/2)
+			bufsize *= 2;
+		else if (bufsize < MAXSIZE)
+			bufsize = MAXSIZE;
+		else
+			return NULL;
+	}
+	return NULL;
+}
+
+
+/* device_blocksize --- try to figure out units of st_blocks */
+
+static int
+device_blocksize()
+{
+	/* some of this derived from GNULIB stat-size.h */
+#if defined(DEV_BSIZE)
+	/* <sys/param.h>, most systems */
+	return DEV_BSIZE;
+#elif defined(S_BLKSIZE)
+	/* <sys/stat.h>, BSD systems */
+	return S_BLKSIZE;
+#elif defined hpux || defined __hpux__ || defined __hpux
+	return 1024;
+#elif defined _AIX && defined _I386
+	/* AIX PS/2 counts st_blocks in 4K units.  */
+	return 4 * 1024;
+#elif defined __MINGW32__
+	return 1024;
+#else
+	return 512;
+#endif
+}
+
+/* array_set --- set an array element */
+
+static void
+array_set(awk_array_t array, const char *sub, awk_value_t *value)
+{
+	awk_value_t index;
+
+	set_array_element(array,
+			make_const_string(sub, strlen(sub), & index),
+			value);
+
+}
+
+/* array_set_numeric --- set an array element with a number */
+
+static void
+array_set_numeric(awk_array_t array, const char *sub, double num)
+{
+	awk_value_t tmp;
+
+	array_set(array, sub, make_number(num, & tmp));
+}
+
+/* fill_stat_array --- do the work to fill an array with stat info */
+
+static int
+fill_stat_array(const char *name, awk_array_t array, struct stat *sbuf)
+{
+	char *pmode;	/* printable mode */
+	const char *type = "unknown";
+	awk_value_t tmp;
+	static struct ftype_map {
+		unsigned int mask;
+		const char *type;
+	} ftype_map[] = {
+		{ S_IFREG, "file" },
+		{ S_IFBLK, "blockdev" },
+		{ S_IFCHR, "chardev" },
+		{ S_IFDIR, "directory" },
+#ifdef S_IFSOCK
+		{ S_IFSOCK, "socket" },
+#endif
+#ifdef S_IFIFO
+		{ S_IFIFO, "fifo" },
+#endif
+#ifdef S_IFLNK
+		{ S_IFLNK, "symlink" },
+#endif
+#ifdef S_IFDOOR	/* Solaris weirdness */
+		{ S_IFDOOR, "door" },
+#endif /* S_IFDOOR */
+	};
+	int j, k;
+
+	/* empty out the array */
+	clear_array(array);
+
+	/* fill in the array */
+	array_set(array, "name", make_const_string(name, strlen(name), & tmp));
+	array_set_numeric(array, "dev", sbuf->st_dev);
+#ifdef __MINGW32__
+	array_set_numeric(array, "ino", (double)get_inode (name));
+#else
+	array_set_numeric(array, "ino", sbuf->st_ino);
+#endif
+	array_set_numeric(array, "mode", sbuf->st_mode);
+	array_set_numeric(array, "nlink", sbuf->st_nlink);
+	array_set_numeric(array, "uid", sbuf->st_uid);
+	array_set_numeric(array, "gid", sbuf->st_gid);
+	array_set_numeric(array, "size", sbuf->st_size);
+#ifdef __MINGW32__
+	array_set_numeric(array, "blocks", (sbuf->st_size + 4095) / 4096);
+#else
+	array_set_numeric(array, "blocks", sbuf->st_blocks);
+#endif
+	array_set_numeric(array, "atime", sbuf->st_atime);
+	array_set_numeric(array, "mtime", sbuf->st_mtime);
+	array_set_numeric(array, "ctime", sbuf->st_ctime);
+
+	/* for block and character devices, add rdev, major and minor numbers */
+	if (S_ISBLK(sbuf->st_mode) || S_ISCHR(sbuf->st_mode)) {
+		array_set_numeric(array, "rdev", sbuf->st_rdev);
+		array_set_numeric(array, "major", major(sbuf->st_rdev));
+		array_set_numeric(array, "minor", minor(sbuf->st_rdev));
+	}
+
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+	array_set_numeric(array, "blksize", sbuf->st_blksize);
+#elif defined(__MINGW32__)
+	array_set_numeric(array, "blksize", 4096);
+#endif /* HAVE_STRUCT_STAT_ST_BLKSIZE */
+
+	/* the size of a block for st_blocks */
+	array_set_numeric(array, "devbsize", device_blocksize());
+
+	pmode = format_mode(sbuf->st_mode);
+	array_set(array, "pmode", make_const_string(pmode, strlen(pmode), & tmp));
+
+	/* for symbolic links, add a linkval field */
+	if (S_ISLNK(sbuf->st_mode)) {
+		char *buf;
+		ssize_t linksize;
+
+		if ((buf = read_symlink(name, sbuf->st_size,
+					& linksize)) != NULL)
+			array_set(array, "linkval", make_malloced_string(buf, linksize, & tmp));
+		else
+			warning(ext_id, _("stat: unable to read symbolic link `%s'"), name);
+	}
+
+	/* add a type field */
+	type = "unknown";	/* shouldn't happen */
+	for (j = 0, k = sizeof(ftype_map)/sizeof(ftype_map[0]); j < k; j++) {
+		if ((sbuf->st_mode & S_IFMT) == ftype_map[j].mask) {
+			type = ftype_map[j].type;
+			break;
+		}
+	}
+
+	array_set(array, "type", make_const_string(type, strlen(type), & tmp));
+
+	return 0;
+}
+
+/* do_stat --- provide a stat() function for gawk */
+
+static awk_value_t *
+do_stat(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t file_param, array_param;
+	char *name;
+	awk_array_t array;
+	int ret;
+	struct stat sbuf;
+	int (*statfunc)(const char *path, struct stat *sbuf) = lstat;	/* default */
+
+	assert(result != NULL);
+
+	/* file is first arg, array to hold results is second */
+	if (   ! get_argument(0, AWK_STRING, & file_param)
+	    || ! get_argument(1, AWK_ARRAY, & array_param)) {
+		warning(ext_id, _("stat: bad parameters"));
+		return make_number(-1, result);
+	}
+
+	if (nargs == 3) {
+		statfunc = stat;
+	}
+
+	name = file_param.str_value.str;
+	array = array_param.array_cookie;
+
+	/* always empty out the array */
+	clear_array(array);
+
+	/* stat the file; if error, set ERRNO and return */
+	ret = statfunc(name, & sbuf);
+	if (ret < 0) {
+		update_ERRNO_int(errno);
+		return make_number(ret, result);
+	}
+
+	ret = fill_stat_array(name, array, & sbuf);
+
+	return make_number(ret, result);
+}
+
+#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS)
+
+/* do_statvfs --- provide a statvfs() function for gawk */
+
+static awk_value_t *
+do_statvfs(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t file_param, array_param;
+	char *name;
+	awk_array_t array;
+	int ret;
+	struct statvfs vfsbuf;
+
+	assert(result != NULL);
+
+	/* file is first arg, array to hold results is second */
+	if (   ! get_argument(0, AWK_STRING, & file_param)
+	    || ! get_argument(1, AWK_ARRAY, & array_param)) {
+		warning(ext_id, _("stat: bad parameters"));
+		return make_number(-1, result);
+	}
+
+	name = file_param.str_value.str;
+	array = array_param.array_cookie;
+
+	/* always empty out the array */
+	clear_array(array);
+
+	/* stat the file; if error, set ERRNO and return */
+	ret = statvfs(name, & vfsbuf);
+	if (ret < 0) {
+		update_ERRNO_int(errno);
+		return make_number(ret, result);
+	}
+
+	array_set_numeric(array, "bsize", vfsbuf.f_bsize);	/* filesystem block size */
+	array_set_numeric(array, "frsize", vfsbuf.f_frsize);	/* fragment size */
+	array_set_numeric(array, "blocks", vfsbuf.f_blocks);	/* size of fs in f_frsize units */
+	array_set_numeric(array, "bfree", vfsbuf.f_bfree);	/* # free blocks */
+	array_set_numeric(array, "bavail", vfsbuf.f_bavail);	/* # free blocks for unprivileged users */
+	array_set_numeric(array, "files", vfsbuf.f_files);	/* # inodes */
+	array_set_numeric(array, "ffree", vfsbuf.f_ffree);	/* # free inodes */
+	array_set_numeric(array, "favail", vfsbuf.f_favail);	/* # free inodes for unprivileged users */
+#ifndef _AIX
+	array_set_numeric(array, "fsid", vfsbuf.f_fsid);	/* filesystem ID */
+#endif
+	array_set_numeric(array, "flag", vfsbuf.f_flag);	/* mount flags */
+	array_set_numeric(array, "namemax", vfsbuf.f_namemax);	/* maximum filename length */
+
+
+	return make_number(ret, result);
+}
+#endif
+
+/* init_filefuncs --- initialization routine */
+
+static awk_bool_t
+init_filefuncs(void)
+{
+	int errors = 0;
+	int i;
+	awk_value_t value;
+
+#ifndef __MINGW32__
+	/* at least right now, only FTS needs initializing */
+	static struct flagtab {
+		const char *name;
+		int value;
+	} opentab[] = {
+#define ENTRY(x)	{ #x, x }
+		ENTRY(FTS_COMFOLLOW),
+		ENTRY(FTS_LOGICAL),
+		ENTRY(FTS_NOCHDIR),
+		ENTRY(FTS_PHYSICAL),
+		ENTRY(FTS_SEEDOT),
+		ENTRY(FTS_XDEV),
+		ENTRY(FTS_SKIP),
+		{ NULL, 0 }
+	};
+
+	for (i = 0; opentab[i].name != NULL; i++) {
+		(void) make_number(opentab[i].value, & value);
+		if (! sym_update(opentab[i].name, & value)) {
+			warning(ext_id, _("fts init: could not create variable %s"),
+					opentab[i].name);
+			errors++;
+		}
+	}
+#endif
+	return errors == 0;
+}
+
+#ifdef __MINGW32__
+/*  do_fts --- walk a hierarchy and fill in an array */
+
+/*
+ * Usage from awk:
+ *	flags = or(FTS_PHYSICAL, ...)
+ *	result = fts(pathlist, flags, filedata)
+ */
+
+static awk_value_t *
+do_fts(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	fatal(ext_id, _("fts is not supported on this system"));
+
+	return NULL;	/* for the compiler */
+}
+
+#else /* __MINGW32__ */
+
+static int fts_errors = 0;
+
+/* fill_stat_element --- fill in stat element of array */
+
+static void
+fill_stat_element(awk_array_t element_array, const char *name, struct stat *sbuf)
+{
+	awk_value_t index, value;
+	awk_array_t stat_array;
+
+	stat_array = create_array();
+	if (stat_array == NULL) {
+		warning(ext_id, _("fill_stat_element: could not create array"));
+		fts_errors++;
+		return;
+	}
+	fill_stat_array(name, stat_array, sbuf);
+	(void) make_const_string("stat", 4, & index);
+	value.val_type = AWK_ARRAY;
+	value.array_cookie = stat_array;
+	if (! set_array_element(element_array, & index, & value)) {
+		warning(ext_id, _("fill_stat_element: could not set element"));
+		fts_errors++;
+	}
+}
+
+/* fill_path_element --- fill in path element of array */
+
+static void
+fill_path_element(awk_array_t element_array, const char *path)
+{
+	awk_value_t index, value;
+
+	(void) make_const_string("path", 4, & index);
+	(void) make_const_string(path, strlen(path), & value);
+	if (! set_array_element(element_array, & index, & value)) {
+		warning(ext_id, _("fill_path_element: could not set element"));
+		fts_errors++;
+	}
+}
+
+/* fill_error_element --- fill in error element of array */
+
+static void
+fill_error_element(awk_array_t element_array, const int errcode)
+{
+	awk_value_t index, value;
+	const char *err = strerror(errcode);
+
+	(void) make_const_string("error", 5, & index);
+	(void) make_const_string(err, strlen(err), & value);
+	if (! set_array_element(element_array, & index, & value)) {
+		warning(ext_id, _("fill_error_element: could not set element"));
+		fts_errors++;
+	}
+}
+
+/* fill_default_elements --- fill in stat and path elements */
+
+static void
+fill_default_elements(awk_array_t element_array, const FTSENT *const fentry, awk_bool_t bad_ret)
+{
+	/* full path */
+	fill_path_element(element_array, fentry->fts_path);
+
+	/* stat info */
+	if (! bad_ret) {
+		fill_stat_element(element_array,
+				fentry->fts_name,
+				fentry->fts_statp);
+	}
+
+	/* error info */
+	if (bad_ret || fentry->fts_errno != 0) {
+		fill_error_element(element_array, fentry->fts_errno);
+	}
+}
+
+/* process --- process the hierarchy */
+
+static void
+process(FTS *hierarchy, awk_array_t destarray, int seedot, int skipset)
+{
+	FTSENT *fentry;
+	awk_value_t index, value;
+	awk_array_t element_array, newdir_array, dot_array;
+	awk_bool_t bad_ret = awk_false;
+
+	/* path is full path,  pathlen is length thereof */
+	/* name is name in directory, namelen is length thereof */
+	while ((fentry = fts_read(hierarchy)) != NULL) {
+		bad_ret = awk_false;
+
+		switch (fentry->fts_info) {
+		case FTS_D:
+			/* directory */
+
+			if (skipset && fentry->fts_level == 0)
+				fts_set(hierarchy, fentry, FTS_SKIP);
+
+			/* create array to hold entries */
+			/* this will be empty if doing FTS_SKIP */
+			newdir_array = create_array();
+			if (newdir_array == NULL) {
+				warning(ext_id, _("fts-process: could not create array"));
+				fts_errors++;
+				break;
+			}
+
+			/* store new directory in its parent directory */
+			(void) make_const_string(fentry->fts_name, fentry->fts_namelen, & index);
+			value.val_type = AWK_ARRAY;
+			value.array_cookie = newdir_array;
+			if (! set_array_element(destarray, & index, & value)) {
+				warning(ext_id, _("fts-process: could not set element"));
+				fts_errors++;
+				break;
+			}
+			newdir_array = value.array_cookie;
+
+			/* push current directory */
+			stack_push(destarray);
+
+			/* new directory becomes current */
+			destarray = newdir_array;
+			break;
+
+		case FTS_DNR:
+		case FTS_DC:
+		case FTS_ERR:
+		case FTS_NS:
+			/* error */
+			bad_ret = awk_true;
+			/* fall through */
+
+		case FTS_NSOK:
+		case FTS_SL:
+		case FTS_SLNONE:
+		case FTS_F:
+		case FTS_DOT:
+			/* if see dot, skip "." */
+			if (seedot && strcmp(fentry->fts_name, ".") == 0)
+				break;
+
+			/*
+			 * File case.
+			 * destarray is the directory we're reading.
+			 * step 1: create new empty array
+			 */
+			element_array = create_array();
+			if (element_array == NULL) {
+				warning(ext_id, _("fts-process: could not create array"));
+				fts_errors++;
+				break;
+			}
+
+			/* step 2: add element array to parent array */
+			(void) make_const_string(fentry->fts_name, fentry->fts_namelen, & index);
+			value.val_type = AWK_ARRAY;
+			value.array_cookie = element_array;
+			if (! set_array_element(destarray, & index, & value)) {
+				warning(ext_id, _("fts-process: could not set element"));
+				fts_errors++;
+				break;
+			}
+
+			/* step 3: fill in path, stat, error elements */
+			fill_default_elements(element_array, fentry, bad_ret);
+			break;
+
+		case FTS_DP:
+			/* create "." subarray */
+			dot_array = create_array();
+
+			/* add it to parent */
+			(void) make_const_string(".", 1, & index);
+			value.val_type = AWK_ARRAY;
+			value.array_cookie = dot_array;
+			if (! set_array_element(destarray, & index, & value)) {
+				warning(ext_id, _("fts-process: could not set element"));
+				fts_errors++;
+				break;
+			}
+
+			/* fill it in with path, stat, error elements */
+			fill_default_elements(dot_array, fentry, bad_ret);
+
+			/* now pop the parent directory off the stack */
+			if (! stack_empty()) {
+				/* pop stack */
+				destarray = stack_pop();
+			}
+
+			break;
+
+		case FTS_DEFAULT:
+			/* nothing to do */
+			break;
+		}
+	}
+}
+
+/*  do_fts --- walk a hierarchy and fill in an array */
+
+/*
+ * Usage from awk:
+ *	flags = or(FTS_PHYSICAL, ...)
+ *	result = fts(pathlist, flags, filedata)
+ */
+
+static awk_value_t *
+do_fts(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t pathlist, flagval, dest;
+	awk_flat_array_t *path_array = NULL;
+	char **pathvector = NULL;
+	FTS *hierarchy;
+	int flags;
+	size_t i, count;
+	int ret = -1;
+	static const int mask = (
+		  FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOCHDIR | FTS_PHYSICAL
+		| FTS_SEEDOT | FTS_XDEV | FTS_SKIP);
+
+	assert(result != NULL);
+	fts_errors = 0;		/* ensure a fresh start */
+
+	if (nargs > 3)
+		lintwarn(ext_id, _("fts: called with incorrect number of arguments, expecting 3"));
+
+	if (! get_argument(0, AWK_ARRAY, & pathlist)) {
+		warning(ext_id, _("fts: bad first parameter"));
+		update_ERRNO_int(EINVAL);
+		goto out;
+	}
+
+	if (! get_argument(1, AWK_NUMBER, & flagval)) {
+		warning(ext_id, _("fts: bad second parameter"));
+		update_ERRNO_int(EINVAL);
+		goto out;
+	}
+
+	if (! get_argument(2, AWK_ARRAY, & dest)) {
+		warning(ext_id, _("fts: bad third parameter"));
+		update_ERRNO_int(EINVAL);
+		goto out;
+	}
+
+	/* flatten pathlist */
+	if (! flatten_array(pathlist.array_cookie, & path_array)) {
+		warning(ext_id, _("fts: could not flatten array\n"));
+		goto out;
+	}
+
+	/* check the flags first, before the array flattening */
+
+	/* get flags */
+	flags = flagval.num_value;
+
+	/* enforce physical or logical but not both, and not no_stat */
+	if ((flags & (FTS_PHYSICAL|FTS_LOGICAL)) == 0
+	    || (flags & (FTS_PHYSICAL|FTS_LOGICAL)) == (FTS_PHYSICAL|FTS_LOGICAL)) {
+		update_ERRNO_int(EINVAL);
+		goto out;
+	}
+	if ((flags & FTS_NOSTAT) != 0) {
+		flags &= ~FTS_NOSTAT;
+		if (do_lint)
+			lintwarn(ext_id, _("fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."));
+	}
+	flags &= mask;	/* turn off anything else */
+
+	/* make pathvector */
+	count = path_array->count + 1;
+	ezalloc(pathvector, char **, count * sizeof(char *), "do_fts");
+
+	/* fill it in */
+	count--;	/* ignore final NULL at end of vector */
+	for (i = 0; i < count; i++)
+		pathvector[i] = path_array->elements[i].value.str_value.str;
+
+
+	/* clear dest array */
+	if (! clear_array(dest.array_cookie)) {
+		warning(ext_id, _("fts: clear_array() failed\n"));
+		goto out;
+	}
+
+	/* let's do it! */
+	if ((hierarchy = fts_open(pathvector, flags, NULL)) != NULL) {
+		process(hierarchy, dest.array_cookie, (flags & FTS_SEEDOT) != 0, (flags & FTS_SKIP) != 0);
+		fts_close(hierarchy);
+
+		if (fts_errors == 0)
+			ret = 0;
+	} else
+		update_ERRNO_int(errno);
+
+out:
+	if (pathvector != NULL)
+		gawk_free(pathvector);
+	if (path_array != NULL)
+		(void) release_flattened_array(pathlist.array_cookie, path_array);
+
+	return make_number(ret, result);
+}
+#endif	/* ! __MINGW32__ */
+
+static awk_ext_func_t func_table[] = {
+	{ "chdir",	do_chdir, 1, 1, awk_false, NULL },
+	{ "stat",	do_stat, 3, 2, awk_false, NULL },
+#ifndef __MINGW32__
+	{ "fts",	do_fts, 3, 3, awk_false, NULL },
+#endif
+#if defined(HAVE_SYS_STATVFS_H) && defined(HAVE_STATVFS)
+	{ "statvfs",	do_statvfs, 2, 2, awk_false, NULL },
+#endif
+};
+
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, filefuncs, "")
diff --git a/gawk-5.0.1/extension/fnmatch.3am b/gawk-5.0.1/extension/fnmatch.3am
new file mode 100644
index 00000000000..c9e2b82d962
--- /dev/null
+++ b/gawk-5.0.1/extension/fnmatch.3am
@@ -0,0 +1,126 @@
+.TH FNMATCH 3am "Feb 21 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+fnmatch \- compare a string against a filename wildcard
+.SH SYNOPSIS
+.ft CW
+@load "fnmatch"
+.sp
+result = fnmatch(pattern, string, flags)
+.ft R
+.SH DESCRIPTION
+The
+.I fnmatch
+extension provides an AWK interface to the
+.IR fnmatch (3)
+routine.  It adds a single function named
+.BR fnmatch() ,
+one predefined variable
+.RB ( FNM_NOMATCH ),
+and an array of flag values named
+.BR FNM .
+.PP
+The first argument is the filename wildcard to match, the second
+is the filename string, and the third is either zero,
+or the bitwise OR of one or more of the flags in the
+.B FNM
+array.
+.PP
+The return value is zero on success,
+.B FNM_NOMATCH
+if the string did not match the pattern, or
+a different non-zero value if an error occurred.
+.PP
+The flags are follows:
+.TP
+\fBFNM["CASEFOLD"]\fP
+Corresponds to the
+.B FNM_CASEFOLD
+flag as defined in
+.IR fnmatch (3).
+.TP
+\fBFNM["FILE_NAME"]\fP
+Corresponds to the
+.B FNM_FILE_NAME
+flag as defined in
+.IR fnmatch (3).
+.TP
+\fBFNM["LEADING_DIR"]\fP
+Corresponds to the
+.B FNM_LEADING_DIR
+flag as defined in
+.IR fnmatch (3).
+.TP
+\fBFNM["NOESCAPE"]\fP
+Corresponds to the
+.B FNM_NOESCAPE
+flag as defined in
+.IR fnmatch (3).
+.TP
+\fBFNM["PATHNAME"]\fP
+Corresponds to the
+.B FNM_PATHNAME
+flag as defined in
+.IR fnmatch (3).
+.TP
+\fBFNM["PERIOD"]\fP
+Corresponds to the
+.B FNM_PERIOD
+flag as defined in
+.IR fnmatch (3).
+.PP
+.SH NOTES
+Nothing prevents AWK code from changing the predefined
+variable
+.BR FNM_NOMATCH ,
+but doing so may cause strange results.
+.\" .SH BUGS
+.SH EXAMPLE
+.ft CW
+.nf
+@load "fnmatch"
+\&...
+flags = or(FNM["PERIOD"], FNM["NOESCAPE"])
+if (fnmatch("*.a", "foo.c", flags) == FNM_NOMATCH)
+	print "no match"
+.fi
+.ft R
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fork (3am),
+.IR inplace (3am),
+.IR ordchr (3am),
+.IR readdir (3am),
+.IR readfile (3am),
+.IR revoutput (3am),
+.IR rwarray (3am),
+.IR time (3am).
+.PP
+.IR fnmatch (3).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/fnmatch.c b/gawk-5.0.1/extension/fnmatch.c
new file mode 100644
index 00000000000..bf7d124feb4
--- /dev/null
+++ b/gawk-5.0.1/extension/fnmatch.c
@@ -0,0 +1,209 @@
+/*
+ * fnmatch.c - Provide an interface to fnmatch(3) routine
+ *
+ * Arnold Robbins
+ * arnold@skeeve.com
+ * Written 7/2012
+ */
+
+/*
+ * Copyright (C) 2012, 2013, 2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/stat.h>
+
+#if HAVE_SYS_SYSMACROS_H
+#include <sys/sysmacros.h>
+#elif HAVE_SYS_MKDEV_H
+#include <sys/mkdev.h>
+#endif /* HAVE_SYS_MKDEV_H */
+
+#include <sys/types.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#ifdef __VMS
+#define __iswctype iswctype
+#define __btowc btowc
+#endif
+
+#define _GNU_SOURCE	1	/* use GNU extensions if they're there */
+#ifdef HAVE_FNMATCH_H
+#include <fnmatch.h>
+#else
+#ifdef __VMS
+#include "fnmatch.h"	/* version that comes with gawk */
+#else
+#include "../missing_d/fnmatch.h"	/* version that comes with gawk */
+#endif
+#define HAVE_FNMATCH_H
+#endif
+
+#ifndef HAVE_FNMATCH
+#ifdef __VMS
+#include "fnmatch.c"	/* ditto */
+#else
+#include "../missing_d/fnmatch.c"	/* ditto */
+#endif
+#define HAVE_FNMATCH
+#endif
+
+/* Provide GNU extensions as no-ops if not defined */
+#ifndef FNM_CASEFOLD
+#define FNM_CASEFOLD	0
+#endif
+#ifndef FNM_LEADING_DIR
+#define FNM_LEADING_DIR	0
+#endif
+#ifndef FNM_FILE_NAME
+#define FNM_FILE_NAME	0
+#endif
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "fnmatch extension: version 1.0";
+
+static awk_bool_t init_fnmatch(void);
+static awk_bool_t (*init_func)(void) = init_fnmatch;
+
+int plugin_is_GPL_compatible;
+
+
+/* do_fnmatch --- implement the fnmatch interface */
+
+static awk_value_t *
+do_fnmatch(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+#ifdef HAVE_FNMATCH_H
+	static int flags_mask =
+		FNM_CASEFOLD    | FNM_FILE_NAME |
+		FNM_LEADING_DIR | FNM_NOESCAPE |
+		FNM_PATHNAME    | FNM_PERIOD ;
+#endif
+	awk_value_t pattern, string, flags;
+	int int_flags, retval;
+
+	make_number(-1.0, result);	/* default return */
+
+#ifdef HAVE_FNMATCH
+	if (! get_argument(0, AWK_STRING, & pattern)) {
+		warning(ext_id, _("fnmatch: could not get first argument"));
+		goto out;
+	}
+
+	if (! get_argument(1, AWK_STRING, & string)) {
+		warning(ext_id, _("fnmatch: could not get second argument"));
+		goto out;
+	}
+
+	if (! get_argument(2, AWK_NUMBER, & flags)) {
+		warning(ext_id, _("fnmatch: could not get third argument"));
+		goto out;
+	}
+
+	int_flags = flags.num_value;
+	int_flags &= flags_mask;
+
+	retval = fnmatch(pattern.str_value.str,
+			string.str_value.str, int_flags);
+	make_number((double) retval, result);
+
+out:
+#else
+	fatal(ext_id, _("fnmatch is not implemented on this system\n"));
+#endif
+	return result;
+}
+
+#define ENTRY(x)	{ #x, FNM_##x }
+
+static struct fnmflags {
+	const char *name;
+	int value;
+} flagtable[] = {
+	ENTRY(CASEFOLD),
+	ENTRY(FILE_NAME),
+	ENTRY(LEADING_DIR),
+	ENTRY(NOESCAPE),
+	ENTRY(PATHNAME),
+	ENTRY(PERIOD),
+	{ NULL, 0 }
+};
+
+/* init_fnmatch --- load array with flags */
+
+static awk_bool_t
+init_fnmatch(void)
+{
+	int errors = 0;
+#ifdef HAVE_FNMATCH
+	awk_value_t index, value, the_array;
+	awk_array_t new_array;
+	int i;
+
+	if (! sym_update("FNM_NOMATCH", make_number(FNM_NOMATCH, & value))) {
+		warning(ext_id, _("fnmatch init: could not add FNM_NOMATCH variable"));
+		errors++;
+	}
+
+	new_array = create_array();
+	for (i = 0; flagtable[i].name != NULL; i++) {
+		(void) make_const_string(flagtable[i].name,
+				strlen(flagtable[i].name), & index);
+		(void) make_number(flagtable[i].value, & value);
+		if (! set_array_element(new_array, & index, & value)) {
+			warning(ext_id, _("fnmatch init: could not set array element %s"),
+					flagtable[i].name);
+			errors++;
+		}
+	}
+
+	the_array.val_type = AWK_ARRAY;
+	the_array.array_cookie = new_array;
+
+	if (! sym_update("FNM", & the_array)) {
+		warning(ext_id, _("fnmatch init: could not install FNM array"));
+		errors++;
+	}
+
+#endif
+	return errors == 0;
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "fnmatch", do_fnmatch, 3, 3, awk_false, NULL },
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, fnmatch, "")
diff --git a/gawk-5.0.1/extension/fork.3am b/gawk-5.0.1/extension/fork.3am
new file mode 100644
index 00000000000..31daa24022b
--- /dev/null
+++ b/gawk-5.0.1/extension/fork.3am
@@ -0,0 +1,99 @@
+.TH FORK 3am "Feb 02 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+fork, wait, waitpid \- basic process management
+.SH SYNOPSIS
+.ft CW
+@load "fork"
+.sp
+pid = fork()
+.sp
+ret = waitpid(pid)
+.sp
+ret = wait();
+.ft R
+.SH DESCRIPTION
+The
+.I fork
+extension adds three functions, as follows.
+.TP
+.B fork()
+This function creates a new process. The return value is the zero
+in the child and the process-id number of the child in the parent,
+or \-1 upon error. In the latter case,
+.B ERRNO
+indicates the problem.
+In the child, \fBPROCINFO["pid"]\fP and \fBPROCINFO["ppid"]\fP
+are updated to reflect the correct values.
+.TP
+.B waitpid()
+This function takes a numeric argument, which is the process-id to
+wait for. The return value is that of the
+.IR waitpid (2)
+system call.
+.TP
+.B wait()
+This function waits for the first child to die.
+The return value is that of the
+.IR wait (2)
+system call.
+.\" .SH NOTES
+.SH BUGS
+There is no corresponding
+.B exec()
+function.
+.PP
+The interfaces could be enhanced to provide more facilities,
+including pulling out the various bits of the return status.
+.SH EXAMPLE
+.ft CW
+.nf
+@load "fork"
+\&...
+if ((pid = fork()) == 0)
+    print "hello from the child"
+else
+    print "hello from the parent"
+.fi
+.ft R
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fnmatch (3am),
+.IR inplace (3am),
+.IR ordchr (3am),
+.IR readdir (3am),
+.IR readfile (3am),
+.IR revoutput (3am),
+.IR rwarray (3am),
+.IR time (3am).
+.PP
+.IR fork (2),
+.IR wait (2),
+.IR waitpid (2).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/fork.c b/gawk-5.0.1/extension/fork.c
new file mode 100644
index 00000000000..6fa6f0fa197
--- /dev/null
+++ b/gawk-5.0.1/extension/fork.c
@@ -0,0 +1,152 @@
+/*
+ * fork.c - Provide fork and waitpid functions for gawk.
+ *
+ * Revised 6/2004
+ * Revised 5/2012 for new extension API.
+ */
+
+/*
+ * Copyright (C) 2001, 2004, 2011, 2012, 2013, 2018
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "fork extension: version 1.0";
+static awk_bool_t (*init_func)(void) = NULL;
+
+int plugin_is_GPL_compatible;
+
+
+/* array_set --- set an array element */
+
+static void
+array_set_numeric(awk_array_t array, const char *sub, double num)
+{
+	awk_value_t index, value;
+
+	set_array_element(array,
+		make_const_string(sub, strlen(sub), & index),
+		make_number(num, & value));
+
+}
+
+/*  do_fork --- provide dynamically loaded fork() builtin for gawk */
+
+static awk_value_t *
+do_fork(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	int ret = -1;
+
+	assert(result != NULL);
+
+	ret = fork();
+
+	if (ret < 0)
+		update_ERRNO_int(errno);
+	else if (ret == 0) {
+		/* update PROCINFO in the child, if the array exists */
+		awk_value_t procinfo;
+
+		if (sym_lookup("PROCINFO", AWK_ARRAY, & procinfo)) {
+			if (procinfo.val_type != AWK_ARRAY) {
+				if (do_lint)
+					lintwarn(ext_id, _("fork: PROCINFO is not an array!"));
+			} else {
+				array_set_numeric(procinfo.array_cookie, "pid", getpid());
+				array_set_numeric(procinfo.array_cookie, "ppid", getppid());
+			}
+		}
+	}
+
+	/* Set the return value */
+	return make_number(ret, result);
+}
+
+/*  do_waitpid --- provide dynamically loaded waitpid() builtin for gawk */
+
+static awk_value_t *
+do_waitpid(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t pid;
+	int ret = -1;
+	int options = 0;
+
+	assert(result != NULL);
+
+	if (get_argument(0, AWK_NUMBER, &pid)) {
+		options = WNOHANG|WUNTRACED;
+		ret = waitpid(pid.num_value, NULL, options);
+		if (ret < 0)
+			update_ERRNO_int(errno);
+	}
+
+	/* Set the return value */
+	return make_number(ret, result);
+}
+
+
+/*  do_wait --- provide dynamically loaded wait() builtin for gawk */
+
+static awk_value_t *
+do_wait(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	int ret;
+
+	assert(result != NULL);
+
+	ret = wait(NULL);
+	if (ret < 0)
+		update_ERRNO_int(errno);
+
+	/* Set the return value */
+	return make_number(ret, result);
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "fork", do_fork, 0, 0, awk_false, NULL },
+	{ "waitpid", do_waitpid, 1, 1, awk_false, NULL },
+	{ "wait", do_wait, 0, 0, awk_false, NULL },
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, fork, "")
diff --git a/gawk-5.0.1/extension/fts.3 b/gawk-5.0.1/extension/fts.3
new file mode 100644
index 00000000000..9131d04fbe1
--- /dev/null
+++ b/gawk-5.0.1/extension/fts.3
@@ -0,0 +1,773 @@
+.\"	$NetBSD: fts.3,v 1.30 2011/03/30 16:29:26 jruoho Exp $
+.\"
+.\" Copyright (c) 1989, 1991, 1993, 1994
+.\"	The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)fts.3	8.5 (Berkeley) 4/16/94
+.\"
+.Dd March 30, 2011
+.Dt FTS 3
+.Os
+.Sh NAME
+.Nm fts ,
+.Nm fts_open ,
+.Nm fts_read ,
+.Nm fts_children ,
+.Nm fts_set ,
+.Nm fts_close
+.Nd traverse a file hierarchy
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In sys/types.h
+.In sys/stat.h
+.In fts.h
+.Ft FTS *
+.Fo fts_open
+.Fa "char * const *path_argv"
+.Fa "int options"
+.Fa "int (*compar)(const FTSENT **, const FTSENT **)"
+.Fc
+.Ft FTSENT *
+.Fn fts_read "FTS *ftsp"
+.Ft FTSENT *
+.Fn fts_children "FTS *ftsp" "int options"
+.Ft int
+.Fn fts_set "FTS *ftsp" "FTSENT *f" "int options"
+.Ft int
+.Fn fts_close "FTS *ftsp"
+.Sh DESCRIPTION
+The
+.Nm
+functions are provided for traversing
+.Ux
+file hierarchies.
+A simple overview is that the
+.Fn fts_open
+function returns a
+.Dq handle
+on a file hierarchy, which is then supplied to
+the other
+.Nm
+functions.
+The function
+.Fn fts_read
+returns a pointer to a structure describing one of the files in the file
+hierarchy.
+The function
+.Fn fts_children
+returns a pointer to a linked list of structures, each of which describes
+one of the files contained in a directory in the hierarchy.
+In general, directories are visited two distinguishable times; in pre-order
+(before any of their descendants are visited) and in post-order (after all
+of their descendants have been visited).
+Files are visited once.
+It is possible to walk the hierarchy
+.Dq logically
+(ignoring symbolic links)
+or physically (visiting symbolic links), order the walk of the hierarchy or
+prune and/or re-visit portions of the hierarchy.
+.Pp
+Two structures are defined (and typedef'd) in the include file
+.In fts.h .
+The first is
+.Fa FTS ,
+the structure that represents the file hierarchy itself.
+The second is
+.Fa FTSENT ,
+the structure that represents a file in the file
+hierarchy.
+Normally, an
+.Fa FTSENT
+structure is returned for every file in the file
+hierarchy.
+In this manual page,
+.Dq file
+and
+.Dq Fa FTSENT No structure
+are generally
+interchangeable.
+The
+.Fa FTSENT
+structure contains at least the following fields, which are
+described in greater detail below:
+.Bd -literal -offset 2n
+typedef struct _ftsent {
+	u_short fts_info;		/* flags for FTSENT structure */
+	char *fts_accpath;		/* access path */
+	char *fts_path;			/* root path */
+	short fts_pathlen;		/* strlen(fts_path) */
+	char *fts_name;			/* file name */
+	short fts_namelen;		/* strlen(fts_name) */
+	short fts_level;		/* depth (\-1 to N) */
+	int fts_errno;			/* file errno */
+	long fts_number;		/* local numeric value */
+	void *fts_pointer;		/* local address value */
+	struct ftsent *fts_parent;	/* parent directory */
+	struct ftsent *fts_link;	/* next file structure */
+	struct ftsent *fts_cycle;	/* cycle structure */
+	struct stat *fts_statp;		/* stat(2) information */
+} FTSENT;
+.Ed
+.Pp
+These fields are defined as follows:
+.Bl -tag -width "fts_namelen"
+.It Fa fts_info
+One of the following flags describing the returned
+.Fa FTSENT
+structure and
+the file it represents.
+With the exception of directories without errors
+.Pq Dv FTS_D ,
+all of these
+entries are terminal, that is, they will not be revisited, nor will any
+of their descendants be visited.
+.Bl  -tag -width FTS_DEFAULT
+.It Dv FTS_D
+A directory being visited in pre-order.
+.It Dv FTS_DC
+A directory that causes a cycle in the tree.
+(The
+.Fa fts_cycle
+field of the
+.Fa FTSENT
+structure will be filled in as well).
+.It Dv FTS_DEFAULT
+Any
+.Fa FTSENT
+structure that represents a file type not explicitly described
+by one of the other
+.Fa fts_info
+values.
+.It Dv FTS_DNR
+A directory which cannot be read.
+This is an error return, and the
+.Fa fts_errno
+field will be set to indicate what caused the error.
+.It Dv FTS_DOT
+A file named
+.Ql \&.
+or
+.Ql ..
+which was not specified as a file name to
+.Fn fts_open
+(see
+.Dv FTS_SEEDOT ) .
+.It Dv FTS_DP
+A directory being visited in post-order.
+The contents of the
+.Fa FTSENT
+structure will be unchanged from when
+it was returned in pre-order, i.e., with the
+.Fa fts_info
+field set to
+.Dv FTS_D .
+.It Dv FTS_ERR
+This is an error return, and the
+.Fa fts_errno
+field will be set to indicate what caused the error.
+.It Dv FTS_F
+A regular file.
+.It Dv FTS_NS
+A file for which no
+.Xr stat 2
+information was available.
+The contents of the
+.Fa fts_statp
+field are undefined.
+This is an error return, and the
+.Fa fts_errno
+field will be set to indicate what caused the error.
+.It Dv FTS_NSOK
+A file for which no
+.Xr stat 2
+information was requested.
+The contents of the
+.Fa fts_statp
+field are undefined.
+.It Dv FTS_SL
+A symbolic link.
+.It Dv FTS_SLNONE
+A symbolic link with a non-existent target.
+The contents of the
+.Fa fts_statp
+field reference the file characteristic information for the symbolic link
+itself.
+.It Dv FTS_W
+A whiteout object.
+.El
+.It Fa fts_accpath
+A path for accessing the file from the current directory.
+.It Fa fts_path
+The path for the file relative to the root of the traversal.
+This path contains the path specified to
+.Fn fts_open
+as a prefix.
+.It Fa fts_pathlen
+The length of the string referenced by
+.Fa fts_path .
+.It Fa fts_name
+The name of the file.
+.It Fa fts_namelen
+The length of the string referenced by
+.Fa fts_name .
+.It Fa fts_level
+The depth of the traversal, numbered from \-1 to N, where this file
+was found.
+The
+.Fa FTSENT
+structure representing the parent of the starting point (or root)
+of the traversal is numbered \-1, and the
+.Fa FTSENT
+structure for the root
+itself is numbered 0.
+.It Fa fts_errno
+Upon return of a
+.Fa FTSENT
+structure from the
+.Fn fts_children
+or
+.Fn fts_read
+functions, with its
+.Fa fts_info
+field set to
+.Dv FTS_DNR ,
+.Dv FTS_ERR
+or
+.Dv FTS_NS ,
+the
+.Fa fts_errno
+field contains the value of the external variable
+.Va errno
+specifying the cause of the error.
+Otherwise, the contents of the
+.Fa fts_errno
+field are undefined.
+.It Fa fts_number
+This field is provided for the use of the application program and is
+not modified by the
+.Nm
+functions.
+It is initialized to 0.
+.It Fa fts_pointer
+This field is provided for the use of the application program and is
+not modified by the
+.Nm
+functions.
+It is initialized to
+.Dv NULL .
+.It Fa fts_parent
+A pointer to the
+.Fa FTSENT
+structure referencing the file in the hierarchy
+immediately above the current file, i.e., the directory of which this
+file is a member.
+A parent structure for the initial entry point is provided as well,
+however, only the
+.Fa fts_level ,
+.Fa fts_number
+and
+.Fa fts_pointer
+fields are guaranteed to be initialized.
+.It Fa fts_link
+Upon return from the
+.Fn fts_children
+function, the
+.Fa fts_link
+field points to the next structure in the
+.Dv NULL Ns -terminated
+linked list of directory members.
+Otherwise, the contents of the
+.Fa fts_link
+field are undefined.
+.It Fa fts_cycle
+If a directory causes a cycle in the hierarchy (see
+.Dv FTS_DC ) ,
+either because
+of a hard link between two directories, or a symbolic link pointing to a
+directory, the
+.Fa fts_cycle
+field of the structure will point to the
+.Fa FTSENT
+structure in the hierarchy that references the same file as the current
+.Fa FTSENT
+structure.
+Otherwise, the contents of the
+.Fa fts_cycle
+field are undefined.
+.It Fa fts_statp
+A pointer to
+.Xr stat 2
+information for the file.
+.El
+.Pp
+A single buffer is used for all of the paths of all of the files in the
+file hierarchy.
+Therefore, the
+.Fa fts_path
+and
+.Fa fts_accpath
+fields are guaranteed to be
+.Dv NULL Ns -terminated
+.Em only
+for the file most recently returned by
+.Fn fts_read .
+To use these fields to reference any files represented by other
+.Fa FTSENT
+structures will require that the path buffer be modified using the
+information contained in that
+.Fa FTSENT
+structure's
+.Fa fts_pathlen
+field.
+Any such modifications should be undone before further calls to
+.Fn fts_read
+are attempted.
+The
+.Fa fts_name
+field is always
+.Dv NULL Ns -terminated .
+.Sh FTS_OPEN
+The
+.Fn fts_open
+function takes a pointer to an array of character pointers naming one
+or more paths which make up a logical file hierarchy to be traversed.
+The array must be terminated by a
+.Dv NULL
+pointer.
+.Pp
+There are
+a number of options, at least one of which (either
+.Dv FTS_LOGICAL
+or
+.Dv FTS_PHYSICAL )
+must be specified.
+The options are selected by
+.Em or Ns 'ing
+the following values:
+.Bl -tag -width "FTS_COMFOLLOW "
+.It Dv FTS_COMFOLLOW
+This option causes any symbolic link specified as a root path to be
+followed immediately whether or not
+.Dv FTS_LOGICAL
+is also specified.
+.It Dv FTS_LOGICAL
+This option causes the
+.Nm
+routines to return
+.Fa FTSENT
+structures for the targets of symbolic links
+instead of the symbolic links themselves.
+If this option is set, the only symbolic links for which
+.Fa FTSENT
+structures
+are returned to the application are those referencing non-existent files.
+Either
+.Dv FTS_LOGICAL
+or
+.Dv FTS_PHYSICAL
+.Em must
+be provided to the
+.Fn fts_open
+function.
+.It Dv FTS_NOCHDIR
+As a performance optimization, the
+.Nm
+functions change directories as they walk the file hierarchy.
+This has the side-effect that an application cannot rely on being
+in any particular directory during the traversal.
+The
+.Dv FTS_NOCHDIR
+option turns off this optimization, and the
+.Nm
+functions will not change the current directory.
+Note that applications should not themselves change their current directory
+and try to access files unless
+.Dv FTS_NOCHDIR
+is specified and absolute
+pathnames were provided as arguments to
+.Fn fts_open .
+.It Dv FTS_NOSTAT
+By default, returned
+.Fa FTSENT
+structures reference file characteristic information (the
+.Fa statp
+field) for each file visited.
+This option relaxes that requirement as a performance optimization,
+allowing the
+.Nm
+functions to set the
+.Fa fts_info
+field to
+.Dv FTS_NSOK
+and leave the contents of the
+.Fa statp
+field undefined.
+.It Dv FTS_PHYSICAL
+This option causes the
+.Nm
+routines to return
+.Fa FTSENT
+structures for symbolic links themselves instead
+of the target files they point to.
+If this option is set,
+.Fa FTSENT
+structures for all symbolic links in the
+hierarchy are returned to the application.
+Either
+.Dv FTS_LOGICAL
+or
+.Dv FTS_PHYSICAL
+.Em must
+be provided to the
+.Fn fts_open
+function.
+.It Dv FTS_SEEDOT
+By default, unless they are specified as path arguments to
+.Fn fts_open ,
+any files named
+.Ql \&.
+or
+.Ql ..
+encountered in the file hierarchy are ignored.
+This option causes the
+.Nm
+routines to return
+.Fa FTSENT
+structures for them.
+.It Dv FTS_WHITEOUT
+Return whiteout entries, which are normally hidden.
+.It Dv FTS_XDEV
+This option prevents
+.Nm
+from descending into directories that have a different device number
+than the file from which the descent began.
+.El
+.Pp
+The argument
+.Fn compar
+specifies a user-defined function which may be used to order the traversal
+of the hierarchy.
+It
+takes two pointers to pointers to
+.Fa FTSENT
+structures as arguments and
+should return a negative value, zero, or a positive value to indicate
+if the file referenced by its first argument comes before, in any order
+with respect to, or after, the file referenced by its second argument.
+The
+.Fa fts_accpath ,
+.Fa fts_path
+and
+.Fa fts_pathlen
+fields of the
+.Fa FTSENT
+structures may
+.Em never
+be used in this comparison.
+If the
+.Fa fts_info
+field is set to
+.Dv FTS_NS
+or
+.Dv FTS_NSOK ,
+the
+.Fa fts_statp
+field may not either.
+If the
+.Fn compar
+argument is
+.Dv NULL ,
+the directory traversal order is in the order listed in
+.Fa path_argv
+for the root paths, and in the order listed in the directory for
+everything else.
+.Sh FTS_READ
+The
+.Fn fts_read
+function returns a pointer to an
+.Fa FTSENT
+structure describing a file in
+the hierarchy.
+Directories (that are readable and do not cause cycles) are visited at
+least twice, once in pre-order and once in post-order.
+All other files are visited at least once.
+(Hard links between directories that do not cause cycles or symbolic
+links to symbolic links may cause files to be visited more than once,
+or directories more than twice.)
+.Pp
+If all the members of the hierarchy have been returned,
+.Fn fts_read
+returns
+.Dv NULL
+and sets the external variable
+.Va errno
+to 0.
+If an error unrelated to a file in the hierarchy occurs,
+.Fn fts_read
+returns
+.Dv NULL
+and sets
+.Va errno
+appropriately.
+If an error related to a returned file occurs, a pointer to an
+.Fa FTSENT
+structure is returned, and
+.Va errno
+may or may not have been set (see
+.Fa fts_info ) .
+.Pp
+The
+.Fa FTSENT
+structures returned by
+.Fn fts_read
+may be overwritten after a call to
+.Fn fts_close
+on the same file hierarchy stream, or, after a call to
+.Fn fts_read
+on the same file hierarchy stream unless they represent a file of type
+directory, in which case they will not be overwritten until after a call to
+.Fn fts_read
+after the
+.Fa FTSENT
+structure has been returned by the function
+.Fn fts_read
+in post-order.
+.Sh FTS_CHILDREN
+The
+.Fn fts_children
+function returns a pointer to an
+.Fa FTSENT
+structure describing the first entry in a
+.Dv NULL Ns -terminated
+linked list of the files in the directory represented by the
+.Fa FTSENT
+structure most recently returned by
+.Fn fts_read .
+The list is linked through the
+.Fa fts_link
+field of the
+.Fa FTSENT
+structure, and is ordered by the user-specified comparison function, if any.
+Repeated calls to
+.Fn fts_children
+will recreate this linked list.
+.Pp
+As a special case, if
+.Fn fts_read
+has not yet been called for a hierarchy,
+.Fn fts_children
+will return a pointer to the files in the logical directory specified to
+.Fn fts_open ,
+i.e., the arguments specified to
+.Fn fts_open .
+Otherwise, if the
+.Fa FTSENT
+structure most recently returned by
+.Fn fts_read
+is not a directory being visited in pre-order,
+or the directory does not contain any files,
+.Fn fts_children
+returns
+.Dv NULL
+and sets
+.Va errno
+to zero.
+If an error occurs,
+.Fn fts_children
+returns
+.Dv NULL
+and sets
+.Va errno
+appropriately.
+.Pp
+The
+.Fa FTSENT
+structures returned by
+.Fn fts_children
+may be overwritten after a call to
+.Fn fts_children ,
+.Fn fts_close
+or
+.Fn fts_read
+on the same file hierarchy stream.
+.Pp
+.Em Option
+may be set to the following value:
+.Bl -tag -width "FTS_COMFOLLOW "
+.It Dv FTS_NAMEONLY
+Only the names of the files are needed.
+The contents of all the fields in the returned linked list of structures
+are undefined with the exception of the
+.Fa fts_name
+and
+.Fa fts_namelen
+fields.
+.El
+.Sh FTS_SET
+The function
+.Fn fts_set
+allows the user application to determine further processing for the
+file
+.Fa f
+of the stream
+.Fa ftsp .
+The
+.Fn fts_set
+function
+returns 0 on success, and \-1 if an error occurs.
+.Em Option
+must be set to one of the following values:
+.Bl -tag -width "FTS_COMFOLLOW "
+.It Dv FTS_AGAIN
+Re-visit the file; any file type may be re-visited.
+The next call to
+.Fn fts_read
+will return the referenced file.
+The
+.Fa fts_stat
+and
+.Fa fts_info
+fields of the structure will be reinitialized at that time,
+but no other fields will have been changed.
+This option is meaningful only for the most recently returned
+file from
+.Fn fts_read .
+Normal use is for post-order directory visits, where it causes the
+directory to be re-visited (in both pre and post-order) as well as all
+of its descendants.
+.It Dv FTS_FOLLOW
+The referenced file must be a symbolic link.
+If the referenced file is the one most recently returned by
+.Fn fts_read ,
+the next call to
+.Fn fts_read
+returns the file with the
+.Fa fts_info
+and
+.Fa fts_statp
+fields reinitialized to reflect the target of the symbolic link instead
+of the symbolic link itself.
+If the file is one of those most recently returned by
+.Fn fts_children ,
+the
+.Fa fts_info
+and
+.Fa fts_statp
+fields of the structure, when returned by
+.Fn fts_read ,
+will reflect the target of the symbolic link instead of the symbolic link
+itself.
+In either case, if the target of the symbolic link does not exist the
+fields of the returned structure will be unchanged and the
+.Fa fts_info
+field will be set to
+.Dv FTS_SLNONE .
+.Pp
+If the target of the link is a directory, the pre-order return, followed
+by the return of all of its descendants, followed by a post-order return,
+is done.
+.It Dv FTS_SKIP
+No descendants of this file are visited.
+The file may be one of those most recently returned by either
+.Fn fts_children
+or
+.Fn fts_read .
+.El
+.Sh FTS_CLOSE
+The
+.Fn fts_close
+function closes a file hierarchy stream
+.Fa ftsp
+and restores the current directory to the directory from which
+.Fn fts_open
+was called to open
+.Fa ftsp .
+The
+.Fn fts_close
+function
+returns 0 on success, and \-1 if an error occurs.
+.Sh ERRORS
+The function
+.Fn fts_open
+may fail and set
+.Va errno
+for any of the errors specified for the library functions
+.Xr open 2
+and
+.Xr malloc 3 .
+.Pp
+The function
+.Fn fts_close
+may fail and set
+.Va errno
+for any of the errors specified for the library functions
+.Xr chdir 2
+and
+.Xr close 2 .
+.Pp
+The functions
+.Fn fts_read
+and
+.Fn fts_children
+may fail and set
+.Va errno
+for any of the errors specified for the library functions
+.Xr chdir 2 ,
+.Xr malloc 3 ,
+.Xr opendir 3 ,
+.Xr readdir 3
+and
+.Xr stat 2 .
+.Pp
+In addition,
+.Fn fts_children ,
+.Fn fts_open
+and
+.Fn fts_set
+may fail and set
+.Va errno
+as follows:
+.Bl -tag -width Er
+.It Bq Er EINVAL
+The options were invalid.
+.El
+.Sh SEE ALSO
+.Xr find 1 ,
+.Xr chdir 2 ,
+.Xr stat 2 ,
+.Xr qsort 3 ,
+.Xr symlink 7
+.Sh STANDARDS
+The
+.Nm
+utility was expected to be included in the
+.St -p1003.1-88
+revision.
+But twenty years later, it still was not included in the
+.St -p1003.1-2008
+revision.
diff --git a/gawk-5.0.1/extension/gawkdirfd.h b/gawk-5.0.1/extension/gawkdirfd.h
new file mode 100644
index 00000000000..d1edf65f036
--- /dev/null
+++ b/gawk-5.0.1/extension/gawkdirfd.h
@@ -0,0 +1,57 @@
+/* dirfd.c -- return the file descriptor associated with an open DIR*
+
+   Copyright (C) 2001, 2006, 2008-2013 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* Written by Jim Meyering. */
+
+/* Modified for gawk */
+
+#include <config.h>
+
+#ifndef ENOTSUP
+# define ENOTSUP ENOSYS
+#endif
+
+/*
+ * This is for fake directory file descriptors on systems that don't
+ * allow to open() a directory.
+ *
+ * Including a header from the main gawk source to share the definition
+ * of FAKE_FD_VALUE is the least of all evils that I can see.
+ *
+ * Unlike the main gawk code base, this include is NOT dependant
+ * upon MinGW or EMX.
+ */
+#ifndef __VMS
+#include "../nonposix.h"
+#else
+#include "nonposix.h"
+#endif
+
+#ifndef DIR_TO_FD
+# define DIR_TO_FD(d) (FAKE_FD_VALUE)
+#endif
+
+#if !defined(HAVE_DIRFD) && (!defined(HAVE_DECL_DIRFD) || HAVE_DECL_DIRFD == 0)
+int
+dirfd (DIR *dir_p)
+{
+  int fd = DIR_TO_FD (dir_p);
+  if (fd == -1)
+    errno = ENOTSUP;
+  return fd;
+}
+#endif /* HAVE_DIRFD */
diff --git a/gawk-5.0.1/extension/gawkfts.c b/gawk-5.0.1/extension/gawkfts.c
new file mode 100644
index 00000000000..c7fbc17d2f0
--- /dev/null
+++ b/gawk-5.0.1/extension/gawkfts.c
@@ -0,0 +1,1262 @@
+/*	$NetBSD: fts.c,v 1.44 2012/03/14 00:25:19 christos Exp $	*/
+
+/*-
+ * Copyright (c) 1990, 1993, 1994
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if 0
+static char sccsid[] = "@(#)fts.c	8.6 (Berkeley) 8/14/94";
+#else
+/* __RCSID("$NetBSD: fts.c,v 1.44 2012/03/14 00:25:19 christos Exp $"); */
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _BSD_SOURCE
+
+#include <limits.h>
+/* #include "namespace.h" */
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#else
+#include <stdio.h>
+#endif
+#include <sys/stat.h>
+
+#include <assert.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "gawkfts.h"
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "gawkdirfd.h"
+
+#if ! defined(S_ISREG) && defined(S_IFREG)
+#define	S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif
+
+/*
+#if ! HAVE_NBTOOL_CONFIG_H
+#define	HAVE_STRUCT_DIRENT_D_NAMLEN
+#endif
+*/
+
+#ifndef MAX
+static int MAX(int x, int y)
+{
+	if (x > y)
+		return x;
+
+	return y;
+}
+#endif
+
+
+static FTSENT	*fts_alloc(FTS *, const char *, size_t);
+static FTSENT	*fts_build(FTS *, int);
+static void	 fts_free(FTSENT *);
+static void	 fts_lfree(FTSENT *);
+static void	 fts_load(FTS *, FTSENT *);
+static size_t	 fts_maxarglen(char * const *);
+static size_t	 fts_pow2(size_t);
+static int	 fts_palloc(FTS *, size_t);
+static void	 fts_padjust(FTS *, FTSENT *);
+static FTSENT	*fts_sort(FTS *, FTSENT *, size_t);
+static unsigned short fts_stat(FTS *, FTSENT *, int);
+static int	 fts_safe_changedir(const FTS *, const FTSENT *, int,
+    const char *);
+
+#if defined(ALIGNBYTES) && defined(ALIGN)
+#define	FTS_ALLOC_ALIGNED	1
+#else
+#undef	FTS_ALLOC_ALIGNED
+#endif
+
+#ifndef ftsent_namelen_truncate
+#define ftsent_namelen_truncate(a)	\
+    ((a) > UINT_MAX ? UINT_MAX : (unsigned int)(a))
+#endif
+#ifndef ftsent_pathlen_truncate
+#define ftsent_pathlen_truncate(a) \
+    ((a) > UINT_MAX ? UINT_MAX : (unsigned int)(a))
+#endif
+#ifndef fts_pathlen_truncate
+#define fts_pathlen_truncate(a)	\
+    ((a) > UINT_MAX ? UINT_MAX : (unsigned int)(a))
+#endif
+#ifndef fts_nitems_truncate
+#define fts_nitems_truncate(a) \
+    ((a) > UINT_MAX ? UINT_MAX : (unsigned int)(a))
+#endif
+
+#define	ISDOT(a)	(a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
+
+#define	CLR(opt)	(sp->fts_options &= ~(opt))
+#define	ISSET(opt)	(sp->fts_options & (opt))
+#define	SET(opt)	(sp->fts_options |= (opt))
+
+#define	CHDIR(sp, path)	(!ISSET(FTS_NOCHDIR) && chdir(path))
+#define	FCHDIR(sp, fd)	(!ISSET(FTS_NOCHDIR) && fchdir(fd))
+
+/* fts_build flags */
+#define	BCHILD		1		/* fts_children */
+#define	BNAMES		2		/* fts_children, names only */
+#define	BREAD		3		/* fts_read */
+
+#ifndef DTF_HIDEW
+#undef FTS_WHITEOUT
+#endif
+
+#define _DIAGASSERT(expression)
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN	1024	/* a guess */
+#endif
+
+FTS *
+fts_open(char * const *argv, int options,
+    int (*compar)(const FTSENT **, const FTSENT **))
+{
+	FTS *sp;
+	FTSENT *p, *root;
+	size_t nitems;
+	FTSENT *parent, *tmp = NULL;	/* pacify gcc */
+	size_t len;
+
+	_DIAGASSERT(argv != NULL);
+
+	/* Options check. */
+	if (options & ~FTS_OPTIONMASK) {
+		errno = EINVAL;
+		return (NULL);
+	}
+
+	/* Allocate/initialize the stream */
+	if ((sp = calloc(1, (unsigned int)sizeof(FTS))) == NULL)
+		return (NULL);
+	sp->fts_compar = compar;
+	sp->fts_options = options;
+
+	/* Logical walks turn on NOCHDIR; symbolic links are too hard. */
+	if (ISSET(FTS_LOGICAL))
+		SET(FTS_NOCHDIR);
+
+	/*
+	 * Start out with 1K of path space, and enough, in any case,
+	 * to hold the user's paths.
+	 */
+	if (fts_palloc(sp, MAX(fts_maxarglen(argv), MAXPATHLEN)))
+		goto mem1;
+
+	/* Allocate/initialize root's parent. */
+	if ((parent = fts_alloc(sp, "", 0)) == NULL)
+		goto mem2;
+	parent->fts_level = FTS_ROOTPARENTLEVEL;
+
+	/* Allocate/initialize root(s). */
+	for (root = NULL, nitems = 0; *argv; ++argv, ++nitems) {
+		/* Don't allow zero-length paths. */
+		if ((len = strlen(*argv)) == 0) {
+			errno = ENOENT;
+			goto mem3;
+		}
+
+		if ((p = fts_alloc(sp, *argv, len)) == NULL)
+			goto mem3;
+		p->fts_level = FTS_ROOTLEVEL;
+		p->fts_parent = parent;
+		p->fts_accpath = p->fts_name;
+		p->fts_info = fts_stat(sp, p, ISSET(FTS_COMFOLLOW));
+
+		/* Command-line "." and ".." are real directories. */
+		if (p->fts_info == FTS_DOT)
+			p->fts_info = FTS_D;
+
+		/*
+		 * If comparison routine supplied, traverse in sorted
+		 * order; otherwise traverse in the order specified.
+		 */
+		if (compar) {
+			p->fts_link = root;
+			root = p;
+		} else {
+			p->fts_link = NULL;
+			if (root == NULL)
+				tmp = root = p;
+			else {
+				tmp->fts_link = p;
+				tmp = p;
+			}
+		}
+	}
+	if (compar && nitems > 1)
+		root = fts_sort(sp, root, nitems);
+
+	/*
+	 * Allocate a dummy pointer and make fts_read think that we've just
+	 * finished the node before the root(s); set p->fts_info to FTS_INIT
+	 * so that everything about the "current" node is ignored.
+	 */
+	if ((sp->fts_cur = fts_alloc(sp, "", 0)) == NULL)
+		goto mem3;
+	sp->fts_cur->fts_link = root;
+	sp->fts_cur->fts_info = FTS_INIT;
+
+	/*
+	 * If using chdir(2), grab a file descriptor pointing to dot to insure
+	 * that we can get back here; this could be avoided for some paths,
+	 * but almost certainly not worth the effort.  Slashes, symbolic links,
+	 * and ".." are all fairly nasty problems.  Note, if we can't get the
+	 * descriptor we run anyway, just more slowly.
+	 */
+#ifndef O_CLOEXEC
+#define O_CLOEXEC 0
+#endif
+	if (!ISSET(FTS_NOCHDIR)) {
+		if ((sp->fts_rfd = open(".", O_RDONLY | O_CLOEXEC, 0)) == -1)
+			SET(FTS_NOCHDIR);
+	}
+
+	if (nitems == 0)
+		fts_free(parent);
+
+	return (sp);
+
+mem3:	fts_lfree(root);
+	fts_free(parent);
+mem2:	free(sp->fts_path);
+mem1:	free(sp);
+	return (NULL);
+}
+
+static void
+fts_load(FTS *sp, FTSENT *p)
+{
+	size_t len;
+	char *cp;
+
+	_DIAGASSERT(sp != NULL);
+	_DIAGASSERT(p != NULL);
+
+	/*
+	 * Load the stream structure for the next traversal.  Since we don't
+	 * actually enter the directory until after the preorder visit, set
+	 * the fts_accpath field specially so the chdir gets done to the right
+	 * place and the user can access the first node.  From fts_open it's
+	 * known that the path will fit.
+	 */
+	len = p->fts_pathlen = p->fts_namelen;
+	memmove(sp->fts_path, p->fts_name, len + 1);
+	if ((cp = strrchr(p->fts_name, '/')) && (cp != p->fts_name || cp[1])) {
+		len = strlen(++cp);
+		memmove(p->fts_name, cp, len + 1);
+		p->fts_namelen = ftsent_namelen_truncate(len);
+	}
+	p->fts_accpath = p->fts_path = sp->fts_path;
+	sp->fts_dev = p->fts_dev;
+}
+
+int
+fts_close(FTS *sp)
+{
+	FTSENT *freep, *p;
+	int saved_errno = 0;
+
+	_DIAGASSERT(sp != NULL);
+
+	/*
+	 * This still works if we haven't read anything -- the dummy structure
+	 * points to the root list, so we step through to the end of the root
+	 * list which has a valid parent pointer.
+	 */
+	if (sp->fts_cur) {
+		if (sp->fts_cur->fts_flags & FTS_SYMFOLLOW)
+			(void)close(sp->fts_cur->fts_symfd);
+		for (p = sp->fts_cur; p->fts_level >= FTS_ROOTLEVEL;) {
+			freep = p;
+			p = p->fts_link ? p->fts_link : p->fts_parent;
+			fts_free(freep);
+		}
+		fts_free(p);
+	}
+
+	/* Free up child linked list, sort array, path buffer. */
+	if (sp->fts_child)
+		fts_lfree(sp->fts_child);
+	if (sp->fts_array)
+		free(sp->fts_array);
+	free(sp->fts_path);
+
+	/* Return to original directory, save errno if necessary. */
+	if (!ISSET(FTS_NOCHDIR)) {
+		if (fchdir(sp->fts_rfd) == -1)
+			saved_errno = errno;
+		(void)close(sp->fts_rfd);
+	}
+
+	/* Free up the stream pointer. */
+	free(sp);
+	if (saved_errno) {
+		errno = saved_errno;
+		return -1;
+	}
+
+	return 0;
+}
+
+#if !defined(__FTS_COMPAT_TAILINGSLASH)
+
+/*
+ * Special case of "/" at the end of the path so that slashes aren't
+ * appended which would cause paths to be written as "....//foo".
+ */
+#define	NAPPEND(p)							\
+	(p->fts_path[p->fts_pathlen - 1] == '/'				\
+	    ? p->fts_pathlen - 1 : p->fts_pathlen)
+
+#else /* !defined(__FTS_COMPAT_TAILINGSLASH) */
+
+/*
+ * compatibility with the old behaviour.
+ *
+ * Special case a root of "/" so that slashes aren't appended which would
+ * cause paths to be written as "//foo".
+ */
+
+#define	NAPPEND(p)							\
+	(p->fts_level == FTS_ROOTLEVEL && p->fts_pathlen == 1 &&	\
+	    p->fts_path[0] == '/' ? 0 : p->fts_pathlen)
+
+#endif /* !defined(__FTS_COMPAT_TAILINGSLASH) */
+
+FTSENT *
+fts_read(FTS *sp)
+{
+	FTSENT *p, *tmp;
+	int instr;
+	char *t;
+	int saved_errno;
+
+	_DIAGASSERT(sp != NULL);
+
+	/* If finished or unrecoverable error, return NULL. */
+	if (sp->fts_cur == NULL || ISSET(FTS_STOP))
+		return (NULL);
+
+	/* Set current node pointer. */
+	p = sp->fts_cur;
+
+	/* Save and zero out user instructions. */
+	instr = p->fts_instr;
+	p->fts_instr = FTS_NOINSTR;
+
+	/* Any type of file may be re-visited; re-stat and re-turn. */
+	if (instr == FTS_AGAIN) {
+		p->fts_info = fts_stat(sp, p, 0);
+		return (p);
+	}
+
+	/*
+	 * Following a symlink -- SLNONE test allows application to see
+	 * SLNONE and recover.  If indirecting through a symlink, have
+	 * keep a pointer to current location.  If unable to get that
+	 * pointer, follow fails.
+	 */
+	if (instr == FTS_FOLLOW &&
+	    (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
+		p->fts_info = fts_stat(sp, p, 1);
+		if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
+			if ((p->fts_symfd = open(".", O_RDONLY | O_CLOEXEC, 0))
+			    == -1) {
+				p->fts_errno = errno;
+				p->fts_info = FTS_ERR;
+			} else
+				p->fts_flags |= FTS_SYMFOLLOW;
+		}
+		return (p);
+	}
+
+	/* Directory in pre-order. */
+	if (p->fts_info == FTS_D) {
+		/* If skipped or crossed mount point, do post-order visit. */
+		if (instr == FTS_SKIP ||
+		    (ISSET(FTS_XDEV) && p->fts_dev != sp->fts_dev)) {
+			if (p->fts_flags & FTS_SYMFOLLOW)
+				(void)close(p->fts_symfd);
+			if (sp->fts_child) {
+				fts_lfree(sp->fts_child);
+				sp->fts_child = NULL;
+			}
+			p->fts_info = FTS_DP;
+			return (p);
+		}
+
+		/* Rebuild if only read the names and now traversing. */
+		if (sp->fts_child && ISSET(FTS_NAMEONLY)) {
+			CLR(FTS_NAMEONLY);
+			fts_lfree(sp->fts_child);
+			sp->fts_child = NULL;
+		}
+
+		/*
+		 * Cd to the subdirectory.
+		 *
+		 * If have already read and now fail to chdir, whack the list
+		 * to make the names come out right, and set the parent errno
+		 * so the application will eventually get an error condition.
+		 * Set the FTS_DONTCHDIR flag so that when we logically change
+		 * directories back to the parent we don't do a chdir.
+		 *
+		 * If haven't read do so.  If the read fails, fts_build sets
+		 * FTS_STOP or the fts_info field of the node.
+		 */
+		if (sp->fts_child) {
+			if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) {
+				p->fts_errno = errno;
+				p->fts_flags |= FTS_DONTCHDIR;
+				for (p = sp->fts_child; p; p = p->fts_link)
+					p->fts_accpath =
+					    p->fts_parent->fts_accpath;
+			}
+		} else if ((sp->fts_child = fts_build(sp, BREAD)) == NULL) {
+			if (ISSET(FTS_STOP))
+				return (NULL);
+			return (p);
+		}
+		p = sp->fts_child;
+		sp->fts_child = NULL;
+		goto name;
+	}
+
+	/* Move to the next node on this level. */
+next:	tmp = p;
+	if ((p = p->fts_link) != NULL) {
+		fts_free(tmp);
+
+		/*
+		 * If reached the top, return to the original directory, and
+		 * load the paths for the next root.
+		 */
+		if (p->fts_level == FTS_ROOTLEVEL) {
+			if (FCHDIR(sp, sp->fts_rfd)) {
+				SET(FTS_STOP);
+				return (NULL);
+			}
+			fts_load(sp, p);
+			return (sp->fts_cur = p);
+		}
+
+		/*
+		 * User may have called fts_set on the node.  If skipped,
+		 * ignore.  If followed, get a file descriptor so we can
+		 * get back if necessary.
+		 */
+		if (p->fts_instr == FTS_SKIP)
+			goto next;
+		if (p->fts_instr == FTS_FOLLOW) {
+			p->fts_info = fts_stat(sp, p, 1);
+			if (p->fts_info == FTS_D && !ISSET(FTS_NOCHDIR)) {
+				if ((p->fts_symfd =
+				    open(".", O_RDONLY | O_CLOEXEC, 0)) == -1) {
+					p->fts_errno = errno;
+					p->fts_info = FTS_ERR;
+				} else
+					p->fts_flags |= FTS_SYMFOLLOW;
+			}
+			p->fts_instr = FTS_NOINSTR;
+		}
+
+name:		t = sp->fts_path + NAPPEND(p->fts_parent);
+		*t++ = '/';
+		memmove(t, p->fts_name, (size_t)(p->fts_namelen + 1));
+		return (sp->fts_cur = p);
+	}
+
+	/* Move up to the parent node. */
+	p = tmp->fts_parent;
+	fts_free(tmp);
+
+	if (p->fts_level == FTS_ROOTPARENTLEVEL) {
+		/*
+		 * Done; free everything up and set errno to 0 so the user
+		 * can distinguish between error and EOF.
+		 */
+		fts_free(p);
+		errno = 0;
+		return (sp->fts_cur = NULL);
+	}
+
+	/* Nul terminate the pathname. */
+	sp->fts_path[p->fts_pathlen] = '\0';
+
+	/*
+	 * Return to the parent directory.  If at a root node or came through
+	 * a symlink, go back through the file descriptor.  Otherwise, cd up
+	 * one directory.
+	 */
+	if (p->fts_level == FTS_ROOTLEVEL) {
+		if (FCHDIR(sp, sp->fts_rfd)) {
+			SET(FTS_STOP);
+			return (NULL);
+		}
+	} else if (p->fts_flags & FTS_SYMFOLLOW) {
+		if (FCHDIR(sp, p->fts_symfd)) {
+			saved_errno = errno;
+			(void)close(p->fts_symfd);
+			errno = saved_errno;
+			SET(FTS_STOP);
+			return (NULL);
+		}
+		(void)close(p->fts_symfd);
+	} else if (!(p->fts_flags & FTS_DONTCHDIR) &&
+	    fts_safe_changedir(sp, p->fts_parent, -1, "..")) {
+		SET(FTS_STOP);
+		return (NULL);
+	}
+	p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
+	return (sp->fts_cur = p);
+}
+
+/*
+ * Fts_set takes the stream as an argument although it's not used in this
+ * implementation; it would be necessary if anyone wanted to add global
+ * semantics to fts using fts_set.  An error return is allowed for similar
+ * reasons.
+ */
+/* ARGSUSED */
+int
+fts_set(FTS *sp, FTSENT *p, int instr)
+{
+	(void) sp;	/* silence warnings */
+	_DIAGASSERT(sp != NULL);
+	_DIAGASSERT(p != NULL);
+
+	if (instr && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
+	    instr != FTS_NOINSTR && instr != FTS_SKIP) {
+		errno = EINVAL;
+		return (1);
+	}
+	p->fts_instr = instr;
+	return (0);
+}
+
+FTSENT *
+fts_children(FTS *sp, int instr)
+{
+	FTSENT *p;
+	int fd;
+
+	_DIAGASSERT(sp != NULL);
+
+	if (instr && instr != FTS_NAMEONLY) {
+		errno = EINVAL;
+		return (NULL);
+	}
+
+	/* Set current node pointer. */
+	p = sp->fts_cur;
+
+	/*
+	 * Errno set to 0 so user can distinguish empty directory from
+	 * an error.
+	 */
+	errno = 0;
+
+	/* Fatal errors stop here. */
+	if (ISSET(FTS_STOP))
+		return (NULL);
+
+	/* Return logical hierarchy of user's arguments. */
+	if (p->fts_info == FTS_INIT)
+		return (p->fts_link);
+
+	/*
+	 * If not a directory being visited in pre-order, stop here.  Could
+	 * allow FTS_DNR, assuming the user has fixed the problem, but the
+	 * same effect is available with FTS_AGAIN.
+	 */
+	if (p->fts_info != FTS_D /* && p->fts_info != FTS_DNR */)
+		return (NULL);
+
+	/* Free up any previous child list. */
+	if (sp->fts_child)
+		fts_lfree(sp->fts_child);
+
+	if (instr == FTS_NAMEONLY) {
+		SET(FTS_NAMEONLY);
+		instr = BNAMES;
+	} else
+		instr = BCHILD;
+
+	/*
+	 * If using chdir on a relative path and called BEFORE fts_read does
+	 * its chdir to the root of a traversal, we can lose -- we need to
+	 * chdir into the subdirectory, and we don't know where the current
+	 * directory is, so we can't get back so that the upcoming chdir by
+	 * fts_read will work.
+	 */
+	if (p->fts_level != FTS_ROOTLEVEL || p->fts_accpath[0] == '/' ||
+	    ISSET(FTS_NOCHDIR))
+		return (sp->fts_child = fts_build(sp, instr));
+
+	if ((fd = open(".", O_RDONLY, 0)) == -1)
+		return (sp->fts_child = NULL);
+	sp->fts_child = fts_build(sp, instr);
+	if (fchdir(fd)) {
+		(void)close(fd);
+		return (NULL);
+	}
+	(void)close(fd);
+	return (sp->fts_child);
+}
+
+/*
+ * This is the tricky part -- do not casually change *anything* in here.  The
+ * idea is to build the linked list of entries that are used by fts_children
+ * and fts_read.  There are lots of special cases.
+ *
+ * The real slowdown in walking the tree is the stat calls.  If FTS_NOSTAT is
+ * set and it's a physical walk (so that symbolic links can't be directories),
+ * we can do things quickly.  First, if it's a 4.4BSD file system, the type
+ * of the file is in the directory entry.  Otherwise, we assume that the number
+ * of subdirectories in a node is equal to the number of links to the parent.
+ * The former skips all stat calls.  The latter skips stat calls in any leaf
+ * directories and for any files after the subdirectories in the directory have
+ * been found, cutting the stat calls by about 2/3.
+ */
+static FTSENT *
+fts_build(FTS *sp, int type)
+{
+	struct dirent *dp;
+	FTSENT *p, *head;
+	size_t nitems;
+	FTSENT *cur, *tail;
+	DIR *dirp;
+	void *oldaddr;
+	size_t dnamlen;
+	int cderrno, descend, level, nlinks, saved_errno, nostat, doadjust;
+	size_t len, maxlen;
+#ifdef FTS_WHITEOUT
+	int oflag;
+#endif
+	char *cp = NULL;	/* pacify gcc */
+
+	_DIAGASSERT(sp != NULL);
+
+	/* Set current node pointer. */
+	cur = sp->fts_cur;
+
+	/*
+	 * Open the directory for reading.  If this fails, we're done.
+	 * If being called from fts_read, set the fts_info field.
+	 */
+#if 0 /* def FTS_WHITEOUT */
+	if (ISSET(FTS_WHITEOUT))
+		oflag = DTF_NODUP|DTF_REWIND;
+	else
+		oflag = DTF_HIDEW|DTF_NODUP|DTF_REWIND;
+#else
+#define	__opendir2(path, flag) opendir(path)
+#endif
+	if ((dirp = __opendir2(cur->fts_accpath, oflag)) == NULL) {
+		if (type == BREAD) {
+			cur->fts_info = FTS_DNR;
+			cur->fts_errno = errno;
+		}
+		return (NULL);
+	}
+
+	/*
+	 * Nlinks is the number of possible entries of type directory in the
+	 * directory if we're cheating on stat calls, 0 if we're not doing
+	 * any stat calls at all, -1 if we're doing stats on everything.
+	 */
+	if (type == BNAMES) {
+		nlinks = 0;
+		nostat = 1;
+	} else if (ISSET(FTS_NOSTAT) && ISSET(FTS_PHYSICAL)) {
+		nlinks = cur->fts_nlink - (ISSET(FTS_SEEDOT) ? 0 : 2);
+		nostat = 1;
+	} else {
+		nlinks = -1;
+		nostat = 0;
+	}
+
+#ifdef notdef
+	(void)printf("nlinks == %d (cur: %d)\n", nlinks, cur->fts_nlink);
+	(void)printf("NOSTAT %d PHYSICAL %d SEEDOT %d\n",
+	    ISSET(FTS_NOSTAT), ISSET(FTS_PHYSICAL), ISSET(FTS_SEEDOT));
+#endif
+	/*
+	 * If we're going to need to stat anything or we want to descend
+	 * and stay in the directory, chdir.  If this fails we keep going,
+	 * but set a flag so we don't chdir after the post-order visit.
+	 * We won't be able to stat anything, but we can still return the
+	 * names themselves.  Note, that since fts_read won't be able to
+	 * chdir into the directory, it will have to return different path
+	 * names than before, i.e. "a/b" instead of "b".  Since the node
+	 * has already been visited in pre-order, have to wait until the
+	 * post-order visit to return the error.  There is a special case
+	 * here, if there was nothing to stat then it's not an error to
+	 * not be able to stat.  This is all fairly nasty.  If a program
+	 * needed sorted entries or stat information, they had better be
+	 * checking FTS_NS on the returned nodes.
+	 */
+	cderrno = 0;
+	if (nlinks || type == BREAD) {
+		if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) {
+			if (nlinks && type == BREAD)
+				cur->fts_errno = errno;
+			cur->fts_flags |= FTS_DONTCHDIR;
+			descend = 0;
+			cderrno = errno;
+		} else
+			descend = 1;
+	} else
+		descend = 0;
+
+	/*
+	 * Figure out the max file name length that can be stored in the
+	 * current path -- the inner loop allocates more path as necessary.
+	 * We really wouldn't have to do the maxlen calculations here, we
+	 * could do them in fts_read before returning the path, but it's a
+	 * lot easier here since the length is part of the dirent structure.
+	 *
+	 * If not changing directories set a pointer so that can just append
+	 * each new name into the path.
+	 */
+	len = NAPPEND(cur);
+	if (ISSET(FTS_NOCHDIR)) {
+		cp = sp->fts_path + len;
+		*cp++ = '/';
+	}
+	len++;
+	maxlen = sp->fts_pathlen - len;
+
+#if defined(__FTS_COMPAT_LEVEL)
+	if (cur->fts_level == SHRT_MAX) {
+		(void)closedir(dirp);
+		cur->fts_info = FTS_ERR;
+		SET(FTS_STOP);
+		errno = ENAMETOOLONG;
+		return (NULL);
+	}
+#endif
+
+	level = cur->fts_level + 1;
+
+	/* Read the directory, attaching each entry to the `link' pointer. */
+	doadjust = 0;
+	for (head = tail = NULL, nitems = 0; (dp = readdir(dirp)) != NULL;) {
+
+		if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name))
+			continue;
+
+#if defined(HAVE_STRUCT_DIRENT_D_NAMLEN)
+		dnamlen = dp->d_namlen;
+#else
+		dnamlen = strlen(dp->d_name);
+#endif
+		if ((p = fts_alloc(sp, dp->d_name, dnamlen)) == NULL)
+			goto mem1;
+		if (dnamlen >= maxlen) {	/* include space for NUL */
+			oldaddr = sp->fts_path;
+			if (fts_palloc(sp, dnamlen + len + 1)) {
+				/*
+				 * No more memory for path or structures.  Save
+				 * errno, free up the current structure and the
+				 * structures already allocated.
+				 */
+mem1:				saved_errno = errno;
+				if (p)
+					fts_free(p);
+				fts_lfree(head);
+				(void)closedir(dirp);
+				errno = saved_errno;
+				cur->fts_info = FTS_ERR;
+				SET(FTS_STOP);
+				return (NULL);
+			}
+			/* Did realloc() change the pointer? */
+			if (oldaddr != sp->fts_path) {
+				doadjust = 1;
+				if (ISSET(FTS_NOCHDIR))
+					cp = sp->fts_path + len;
+			}
+			maxlen = sp->fts_pathlen - len;
+		}
+
+#if defined(__FTS_COMPAT_LENGTH)
+		if (len + dnamlen >= USHRT_MAX) {
+			/*
+			 * In an FTSENT, fts_pathlen is an unsigned short
+			 * so it is possible to wraparound here.
+			 * If we do, free up the current structure and the
+			 * structures already allocated, then error out
+			 * with ENAMETOOLONG.
+			 */
+			fts_free(p);
+			fts_lfree(head);
+			(void)closedir(dirp);
+			cur->fts_info = FTS_ERR;
+			SET(FTS_STOP);
+			errno = ENAMETOOLONG;
+			return (NULL);
+		}
+#endif
+		p->fts_level = level;
+		p->fts_pathlen = ftsent_pathlen_truncate(len + dnamlen);
+		p->fts_parent = sp->fts_cur;
+
+#ifdef FTS_WHITEOUT
+		if (dp->d_type == DT_WHT)
+			p->fts_flags |= FTS_ISW;
+#endif
+
+		if (cderrno) {
+			if (nlinks) {
+				p->fts_info = FTS_NS;
+				p->fts_errno = cderrno;
+			} else
+				p->fts_info = FTS_NSOK;
+			p->fts_accpath = cur->fts_accpath;
+		} else if (nlinks == 0
+#ifdef DT_DIR
+		    || (nostat &&
+		    dp->d_type != DT_DIR && dp->d_type != DT_UNKNOWN)
+#endif
+		    ) {
+			p->fts_accpath =
+			    ISSET(FTS_NOCHDIR) ? p->fts_path : p->fts_name;
+			p->fts_info = FTS_NSOK;
+		} else {
+			/* Build a file name for fts_stat to stat. */
+			if (ISSET(FTS_NOCHDIR)) {
+				p->fts_accpath = p->fts_path;
+				memmove(cp, p->fts_name,
+				        (size_t)(p->fts_namelen + 1));
+			} else
+				p->fts_accpath = p->fts_name;
+			/* Stat it. */
+			p->fts_info = fts_stat(sp, p, 0);
+
+			/* Decrement link count if applicable. */
+			if (nlinks > 0 && (p->fts_info == FTS_D ||
+			    p->fts_info == FTS_DC || p->fts_info == FTS_DOT))
+				--nlinks;
+		}
+
+		/* We walk in directory order so "ls -f" doesn't get upset. */
+		p->fts_link = NULL;
+		if (head == NULL)
+			head = tail = p;
+		else {
+			tail->fts_link = p;
+			tail = p;
+		}
+		++nitems;
+	}
+	(void)closedir(dirp);
+
+	/*
+	 * If had to realloc the path, adjust the addresses for the rest
+	 * of the tree.
+	 */
+	if (doadjust)
+		fts_padjust(sp, head);
+
+	/*
+	 * If not changing directories, reset the path back to original
+	 * state.
+	 */
+	if (ISSET(FTS_NOCHDIR)) {
+		if (len == sp->fts_pathlen || nitems == 0)
+			--cp;
+		*cp = '\0';
+	}
+
+	/*
+	 * If descended after called from fts_children or after called from
+	 * fts_read and nothing found, get back.  At the root level we use
+	 * the saved fd; if one of fts_open()'s arguments is a relative path
+	 * to an empty directory, we wind up here with no other way back.  If
+	 * can't get back, we're done.
+	 */
+	if (descend && (type == BCHILD || !nitems) &&
+	    (cur->fts_level == FTS_ROOTLEVEL ?
+	    FCHDIR(sp, sp->fts_rfd) :
+	    fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) {
+		cur->fts_info = FTS_ERR;
+		SET(FTS_STOP);
+		return (NULL);
+	}
+
+	/* If didn't find anything, return NULL. */
+	if (!nitems) {
+		if (type == BREAD)
+			cur->fts_info = FTS_DP;
+		return (NULL);
+	}
+
+	/* Sort the entries. */
+	if (sp->fts_compar && nitems > 1)
+		head = fts_sort(sp, head, nitems);
+	return (head);
+}
+
+static unsigned short
+fts_stat(FTS *sp, FTSENT *p, int follow)
+{
+	FTSENT *t;
+	dev_t dev;
+	ino_t ino;
+	struct stat *sbp, sb;
+	int saved_errno;
+
+	_DIAGASSERT(sp != NULL);
+	_DIAGASSERT(p != NULL);
+
+	/* If user needs stat info, stat buffer already allocated. */
+	sbp = ISSET(FTS_NOSTAT) ? &sb : p->fts_statp;
+
+#ifdef FTS_WHITEOUT
+	/* check for whiteout */
+	if (p->fts_flags & FTS_ISW) {
+		if (sbp != &sb) {
+			memset(sbp, '\0', sizeof (*sbp));
+			sbp->st_mode = S_IFWHT;
+		}
+		return (FTS_W);
+	}
+#endif
+
+	/*
+	 * If doing a logical walk, or application requested FTS_FOLLOW, do
+	 * a stat(2).  If that fails, check for a non-existent symlink.  If
+	 * fail, set the errno from the stat call.
+	 */
+	if (ISSET(FTS_LOGICAL) || follow) {
+		if (stat(p->fts_accpath, sbp)) {
+			saved_errno = errno;
+			if (!lstat(p->fts_accpath, sbp)) {
+				errno = 0;
+				return (FTS_SLNONE);
+			}
+			p->fts_errno = saved_errno;
+			goto err;
+		}
+	} else if (lstat(p->fts_accpath, sbp)) {
+		p->fts_errno = errno;
+err:		memset(sbp, 0, sizeof(*sbp));
+		return (FTS_NS);
+	}
+
+	if (S_ISDIR(sbp->st_mode)) {
+		/*
+		 * Set the device/inode.  Used to find cycles and check for
+		 * crossing mount points.  Also remember the link count, used
+		 * in fts_build to limit the number of stat calls.  It is
+		 * understood that these fields are only referenced if fts_info
+		 * is set to FTS_D.
+		 */
+		dev = p->fts_dev = sbp->st_dev;
+		ino = p->fts_ino = sbp->st_ino;
+		p->fts_nlink = sbp->st_nlink;
+
+		if (ISDOT(p->fts_name))
+			return (FTS_DOT);
+
+		/*
+		 * Cycle detection is done by brute force when the directory
+		 * is first encountered.  If the tree gets deep enough or the
+		 * number of symbolic links to directories is high enough,
+		 * something faster might be worthwhile.
+		 */
+		for (t = p->fts_parent;
+		    t->fts_level >= FTS_ROOTLEVEL; t = t->fts_parent)
+			if (ino == t->fts_ino && dev == t->fts_dev) {
+				p->fts_cycle = t;
+				return (FTS_DC);
+			}
+		return (FTS_D);
+	}
+	if (S_ISLNK(sbp->st_mode))
+		return (FTS_SL);
+	if (S_ISREG(sbp->st_mode))
+		return (FTS_F);
+	return (FTS_DEFAULT);
+}
+
+static FTSENT *
+fts_sort(FTS *sp, FTSENT *head, size_t nitems)
+{
+	FTSENT **ap, *p;
+
+	_DIAGASSERT(sp != NULL);
+	_DIAGASSERT(head != NULL);
+
+	/*
+	 * Construct an array of pointers to the structures and call qsort(3).
+	 * Reassemble the array in the order returned by qsort.  If unable to
+	 * sort for memory reasons, return the directory entries in their
+	 * current order.  Allocate enough space for the current needs plus
+	 * 40 so don't realloc one entry at a time.
+	 */
+	if (nitems > sp->fts_nitems) {
+		FTSENT **new;
+
+		new = realloc(sp->fts_array, sizeof(FTSENT *) * (nitems + 40));
+		if (new == 0)
+			return (head);
+		sp->fts_array = new;
+		sp->fts_nitems = fts_nitems_truncate(nitems + 40);
+	}
+	for (ap = sp->fts_array, p = head; p; p = p->fts_link)
+		*ap++ = p;
+	qsort((void *)sp->fts_array, nitems, sizeof(FTSENT *),
+		(int (*)(const void *, const void *))sp->fts_compar);
+	for (head = *(ap = sp->fts_array); --nitems; ++ap)
+		ap[0]->fts_link = ap[1];
+	ap[0]->fts_link = NULL;
+	return (head);
+}
+
+static FTSENT *
+fts_alloc(FTS *sp, const char *name, size_t namelen)
+{
+	FTSENT *p;
+#if defined(FTS_ALLOC_ALIGNED)
+	size_t len;
+#endif
+
+	_DIAGASSERT(sp != NULL);
+	_DIAGASSERT(name != NULL);
+
+#if defined(FTS_ALLOC_ALIGNED)
+	/*
+	 * The file name is a variable length array and no stat structure is
+	 * necessary if the user has set the nostat bit.  Allocate the FTSENT
+	 * structure, the file name and the stat structure in one chunk, but
+	 * be careful that the stat structure is reasonably aligned.  Since the
+	 * fts_name field is declared to be of size 1, the fts_name pointer is
+	 * namelen + 2 before the first possible address of the stat structure.
+	 */
+	len = sizeof(FTSENT) + namelen;
+	if (!ISSET(FTS_NOSTAT))
+		len += sizeof(*(p->fts_statp)) + ALIGNBYTES;
+	if ((p = malloc(len)) == NULL)
+		return (NULL);
+
+	if (!ISSET(FTS_NOSTAT))
+		p->fts_statp = (struct stat *)ALIGN(
+		    (unsigned long)(p->fts_name + namelen + 2));
+#else
+	if ((p = malloc(sizeof(FTSENT) + namelen)) == NULL)
+		return (NULL);
+
+	if (!ISSET(FTS_NOSTAT))
+		if ((p->fts_statp = malloc(sizeof(*(p->fts_statp)))) == NULL) {
+			free(p);
+			return (NULL);
+		}
+#endif
+
+        if (ISSET(FTS_NOSTAT))
+                p->fts_statp = NULL;
+
+	/* Copy the name plus the trailing NULL. */
+	memmove(p->fts_name, name, namelen + 1);
+
+	p->fts_namelen = ftsent_namelen_truncate(namelen);
+	p->fts_path = sp->fts_path;
+	p->fts_errno = 0;
+	p->fts_flags = 0;
+	p->fts_instr = FTS_NOINSTR;
+	p->fts_number = 0;
+	p->fts_pointer = NULL;
+	return (p);
+}
+
+static void
+fts_free(FTSENT *p)
+{
+#if !defined(FTS_ALLOC_ALIGNED)
+	if (p->fts_statp)
+		free(p->fts_statp);
+#endif
+	free(p);
+}
+
+static void
+fts_lfree(FTSENT *head)
+{
+	FTSENT *p;
+
+	/* XXX: head may be NULL ? */
+
+	/* Free a linked list of structures. */
+	while ((p = head) != NULL) {
+		head = head->fts_link;
+		fts_free(p);
+	}
+}
+
+static size_t
+fts_pow2(size_t x)
+{
+
+	x--;
+	x |= x>>1;
+	x |= x>>2;
+	x |= x>>4;
+	x |= x>>8;
+	x |= x>>16;
+#if LONG_BIT > 32
+	x |= x>>32;
+#endif
+#if LONG_BIT > 64
+	x |= x>>64;
+#endif
+	x++;
+	return (x);
+}
+
+/*
+ * Allow essentially unlimited paths; find, rm, ls should all work on any tree.
+ * Most systems will allow creation of paths much longer than MAXPATHLEN, even
+ * though the kernel won't resolve them.  Round up the new size to a power of 2,
+ * so we don't realloc the path 2 bytes at a time.
+ */
+static int
+fts_palloc(FTS *sp, size_t size)
+{
+	char *new;
+
+	_DIAGASSERT(sp != NULL);
+
+#ifdef __FTS_COMPAT_LENGTH
+	/* Protect against fts_pathlen overflow. */
+	if (size > USHRT_MAX + 1) {
+		errno = ENAMETOOLONG;
+		return (1);
+	}
+#endif
+	size = fts_pow2(size);
+	new = realloc(sp->fts_path, size);
+	if (new == 0)
+		return (1);
+	sp->fts_path = new;
+	sp->fts_pathlen = fts_pathlen_truncate(size);
+	return (0);
+}
+
+/*
+ * When the path is realloc'd, have to fix all of the pointers in structures
+ * already returned.
+ */
+static void
+fts_padjust(FTS *sp, FTSENT *head)
+{
+	FTSENT *p;
+	char *addr;
+
+	_DIAGASSERT(sp != NULL);
+
+#define	ADJUST(p) do {							\
+	if ((p)->fts_accpath != (p)->fts_name)				\
+		(p)->fts_accpath =					\
+		    addr + ((p)->fts_accpath - (p)->fts_path);		\
+	(p)->fts_path = addr;						\
+} while (/*CONSTCOND*/0)
+
+	addr = sp->fts_path;
+
+	/* Adjust the current set of children. */
+	for (p = sp->fts_child; p; p = p->fts_link)
+		ADJUST(p);
+
+	/* Adjust the rest of the tree, including the current level. */
+	for (p = head; p->fts_level >= FTS_ROOTLEVEL;) {
+		ADJUST(p);
+		p = p->fts_link ? p->fts_link : p->fts_parent;
+	}
+}
+
+static size_t
+fts_maxarglen(char * const *argv)
+{
+	size_t len, max;
+
+	_DIAGASSERT(argv != NULL);
+
+	for (max = 0; *argv; ++argv)
+		if ((len = strlen(*argv)) > max)
+			max = len;
+	return (max + 1);
+}
+
+/*
+ * Change to dir specified by fd or p->fts_accpath without getting
+ * tricked by someone changing the world out from underneath us.
+ * Assumes p->fts_dev and p->fts_ino are filled in.
+ */
+static int
+fts_safe_changedir(const FTS *sp, const FTSENT *p, int fd, const char *path)
+{
+	int oldfd = fd, ret = -1;
+	struct stat sb;
+
+	if (ISSET(FTS_NOCHDIR))
+		return 0;
+
+	if (oldfd < 0 && (path == NULL || (fd = open(path, O_RDONLY)) == -1))
+		return -1;
+
+	if (fstat(fd, &sb) == -1)
+		goto bail;
+
+	if (sb.st_ino != p->fts_ino || sb.st_dev != p->fts_dev) {
+		errno = ENOENT;
+		goto bail;
+	}
+
+	ret = fchdir(fd);
+
+bail:
+	if (oldfd < 0) {
+		int save_errno = errno;
+		(void)close(fd);
+		errno = save_errno;
+	}
+	return ret;
+}
diff --git a/gawk-5.0.1/extension/gawkfts.h b/gawk-5.0.1/extension/gawkfts.h
new file mode 100644
index 00000000000..447b1758fe7
--- /dev/null
+++ b/gawk-5.0.1/extension/gawkfts.h
@@ -0,0 +1,153 @@
+/*	$NetBSD: fts.h,v 1.19 2009/08/16 19:33:38 christos Exp $	*/
+
+/*
+ * Copyright (c) 1989, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)fts.h	8.3 (Berkeley) 8/14/94
+ */
+
+#ifndef	_FTS_H_
+#define	_FTS_H_
+
+#ifndef __THROW
+# ifndef __GNUC_PREREQ
+#  define __GNUC_PREREQ(maj, min) (0)
+# endif
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+#  define __THROW	throw ()
+# else
+#  define __THROW
+# endif
+#endif
+
+#ifdef __MVS__
+#include <limits.h>
+#define MAXPATHLEN FILENAME_MAX
+#endif
+
+typedef struct {
+	struct _ftsent *fts_cur;	/* current node */
+	struct _ftsent *fts_child;	/* linked list of children */
+	struct _ftsent **fts_array;	/* sort array */
+	dev_t fts_dev;			/* starting device # */
+	char *fts_path;			/* path for this descent */
+	int fts_rfd;			/* fd for root */
+	unsigned int fts_pathlen;	/* sizeof(path) */
+	unsigned int fts_nitems;	/* elements in the sort array */
+	int (*fts_compar)		/* compare function */
+		(const struct _ftsent **, const struct _ftsent **);
+
+#define	FTS_COMFOLLOW	0x001		/* follow command line symlinks */
+#define	FTS_LOGICAL	0x002		/* logical walk */
+#define	FTS_NOCHDIR	0x004		/* don't change directories */
+#define	FTS_NOSTAT	0x008		/* don't get stat info */
+#define	FTS_PHYSICAL	0x010		/* physical walk */
+#define	FTS_SEEDOT	0x020		/* return dot and dot-dot */
+#define	FTS_XDEV	0x040		/* don't cross devices */
+/* #define	FTS_WHITEOUT	0x080 */	/* return whiteout information */
+#define	FTS_OPTIONMASK	0x0ff		/* valid user option mask */
+
+#define	FTS_NAMEONLY	0x100		/* (private) child names only */
+#define	FTS_STOP	0x200		/* (private) unrecoverable error */
+	int fts_options;		/* fts_open options, global flags */
+} FTS;
+
+typedef struct _ftsent {
+	struct _ftsent *fts_cycle;	/* cycle node */
+	struct _ftsent *fts_parent;	/* parent directory */
+	struct _ftsent *fts_link;	/* next file in directory */
+	long long fts_number;		/* local numeric value */
+	void *fts_pointer;	        /* local address value */
+	char *fts_accpath;		/* access path */
+	char *fts_path;			/* root path */
+	int fts_errno;			/* errno for this node */
+	int fts_symfd;			/* fd for symlink */
+	unsigned int fts_pathlen;	/* strlen(fts_path) */
+	unsigned int fts_namelen;	/* strlen(fts_name) */
+
+	ino_t fts_ino;		/* inode */
+	dev_t fts_dev;		/* device */
+	unsigned int fts_nlink;	/* link count */
+
+#define	FTS_ROOTPARENTLEVEL	-1
+#define	FTS_ROOTLEVEL		 0
+	int fts_level;		/* depth (-1 to N) */
+
+#define	FTS_D		 1		/* preorder directory */
+#define	FTS_DC		 2		/* directory that causes cycles */
+#define	FTS_DEFAULT	 3		/* none of the above */
+#define	FTS_DNR		 4		/* unreadable directory */
+#define	FTS_DOT		 5		/* dot or dot-dot */
+#define	FTS_DP		 6		/* postorder directory */
+#define	FTS_ERR		 7		/* error; errno is set */
+#define	FTS_F		 8		/* regular file */
+#define	FTS_INIT	 9		/* initialized only */
+#define	FTS_NS		10		/* stat(2) failed */
+#define	FTS_NSOK	11		/* no stat(2) requested */
+#define	FTS_SL		12		/* symbolic link */
+#define	FTS_SLNONE	13		/* symbolic link without target */
+#define	FTS_W		14		/* whiteout object */
+	unsigned short fts_info;	/* user flags for FTSENT structure */
+
+#define	FTS_DONTCHDIR	 0x01		/* don't chdir .. to the parent */
+#define	FTS_SYMFOLLOW	 0x02		/* followed a symlink to get here */
+#define	FTS_ISW		 0x04		/* this is a whiteout object */
+	unsigned short fts_flags;	/* private flags for FTSENT structure */
+
+#define	FTS_AGAIN	 1		/* read node again */
+#define	FTS_FOLLOW	 2		/* follow symbolic link */
+#define	FTS_NOINSTR	 3		/* no instructions */
+#define	FTS_SKIP	 4		/* discard node */
+	unsigned short fts_instr;	/* fts_set() instructions */
+
+	struct stat *fts_statp;	/* stat(2) information */
+	char fts_name[1];		/* file name */
+} FTSENT;
+
+/*
+ * Due to the wonders of modern linkers, shared libraries,
+ * compilers and other deep, dark, black magic voodoo, we
+ * redefined the identifiers so our code will use our version
+ * of these routines. See README.fts for a little bit more
+ * information and a lot more ranting.
+ */
+
+#define fts_children gawk_fts_children
+#define fts_close gawk_fts_close
+#define fts_open gawk_fts_open
+#define fts_read gawk_fts_read
+#define fts_set gawk_fts_set
+
+FTSENT	*fts_children (FTS *, int);
+int	 fts_close (FTS *);
+FTS	*fts_open (char * const *, int,
+		   int (*)(const FTSENT **, const FTSENT **));
+FTSENT	*fts_read (FTS *);
+int	 fts_set (FTS *, FTSENT *, int) __THROW;
+
+#endif /* !_FTS_H_ */
diff --git a/gawk-5.0.1/extension/inplace.3am b/gawk-5.0.1/extension/inplace.3am
new file mode 100644
index 00000000000..48fac54ade5
--- /dev/null
+++ b/gawk-5.0.1/extension/inplace.3am
@@ -0,0 +1,91 @@
+.TH INPLACE 3am "Feb 02 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+inplace \- emulate sed/perl/ruby in-place editing
+.SH SYNOPSIS
+.ft CW
+.nf
+gawk -i inplace ...
+.fi
+.ft R
+.SH DESCRIPTION
+The
+.I inplace
+extension adds two functions named
+.B inplace_begin()
+and
+.BR inplace_end() .
+These functions are meant to be invoked from the
+.I inplace.awk
+wrapper which is installed when
+.I gawk
+is.
+.PP
+By default, each named file on the command line is
+replaced with a new file of the same name whose contents
+are the results of running the AWK program.
+If the user supplies an AWK variable named
+.B INPLACE_SUFFIX
+in a
+.B BEGIN
+rule or on the command line, then the
+.I inplace
+extension concatenates that suffix onto the original
+filename and uses the result as a filename for renaming
+the original.
+.PP
+One can disable inplace editing selectively by placing
+.B inplace=0
+on the command line prior to files that should be processed normally.
+One can reenable inplace editing by placing
+.B inplace=1
+prior to files that should be subject to inplace editing.
+.\" .SH NOTES
+.SH BUGS
+While the extension does attempt to preserve ownership and permissions, it makes no attempt to copy the ACLs from the original file.
+.PP
+If the program dies prematurely, as might happen if an unhandled signal is received, a temporary file may be left behind.
+.SH EXAMPLE
+.ft CW
+.nf
+gawk -i inplace '\f(CIscript\fP' files ...
+.br
+gawk -i inplace -f \f(CIscriptfile\fP files ...
+.fi
+.ft R
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fnmatch (3am),
+.IR fork (3am),
+.IR ordchr (3am),
+.IR readdir (3am),
+.IR readfile (3am),
+.IR revoutput (3am),
+.IR rwarray (3am).
+.SH AUTHOR
+Andrew Schorr,
+.BR schorr@telemetry-investments.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2015, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/inplace.c b/gawk-5.0.1/extension/inplace.c
new file mode 100644
index 00000000000..dea65f61151
--- /dev/null
+++ b/gawk-5.0.1/extension/inplace.c
@@ -0,0 +1,279 @@
+/*
+ * inplace.c - Provide support for in-place editing.
+ */
+
+/*
+ * Copyright (C) 2013-2015, 2017, 2018, the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifndef _XOPEN_SOURCE
+# define _XOPEN_SOURCE 1
+#endif
+#ifndef _XOPEN_SOURCE_EXTENDED
+# define _XOPEN_SOURCE_EXTENDED 1
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#if ! defined(S_ISREG) && defined(S_IFREG)
+#define	S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif
+
+#ifdef __MINGW32__
+# define chown(x,y,z)  (0)
+# define link(f1,f2)   rename(f1,f2)
+int
+mkstemp (char *template)
+{
+  char *tmp_fname = _mktemp (template);
+
+  if (tmp_fname)
+    return _open (tmp_fname, O_RDWR | O_CREAT | O_EXCL, S_IREAD | S_IWRITE);
+  return -1;
+}
+#endif
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "inplace extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+
+static struct {
+	char *tname;
+	int default_stdout;
+	int posrc;	/* return code from fgetpos */
+	fpos_t pos;
+} state = { NULL, -1 };
+
+/*
+ * XXX Known problems:
+ * 1. Should copy ACL.
+ * 2. Not reentrant, so will not work if multiple files are open at
+ *    the same time.  I'm not sure this is a meaningful problem in practice.
+ */
+
+static void
+at_exit(void *data, int exit_status)
+{
+	(void) data;		/* silence warnings */
+	(void) exit_status;	/* silence warnings */
+	if (state.tname) {
+		unlink(state.tname);
+		gawk_free(state.tname);
+		state.tname = NULL;
+	}
+}
+
+/*
+ * N.B. Almost everything is a fatal error because this feature is typically
+ * used for one-liners where the user is not going to be worrying about
+ * checking errors.  If anything unexpected occurs, we want to abort
+ * immediately!
+ */
+
+static int
+invalid_filename(const awk_string_t *filename)
+{
+	return filename->len == 0 ||
+		(filename->len == 1 && *filename->str == '-');
+}
+
+/* do_inplace_begin --- start in-place editing */
+
+static awk_value_t *
+do_inplace_begin(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t filename;
+	struct stat sbuf;
+	int fd;
+
+	assert(result != NULL);
+	fflush(stdout);
+
+	if (state.tname)
+		fatal(ext_id, _("inplace::begin: in-place editing already active"));
+
+	if (nargs != 2)
+		fatal(ext_id, _("inplace::begin: expects 2 arguments but called with %d"), nargs);
+
+	if (! get_argument(0, AWK_STRING, &filename))
+		fatal(ext_id, _("inplace::begin: cannot retrieve 1st argument as a string filename"));
+
+	/*
+	 * N.B. In the current implementation, the 2nd suffix arg is not used
+	 * in this function.  It is used only in the inplace_end function.
+	 */
+
+	if (invalid_filename(&filename.str_value)) {
+		warning(ext_id, _("inplace::begin: disabling in-place editing for invalid FILENAME `%s'"),
+			filename.str_value.str);
+		unset_ERRNO();
+		return make_number(-1, result);
+	}
+
+	if (stat(filename.str_value.str, & sbuf) < 0) {
+		warning(ext_id, _("inplace::begin: Cannot stat `%s' (%s)"),
+			filename.str_value.str, strerror(errno));
+		update_ERRNO_int(errno);
+		return make_number(-1, result);
+	}
+
+	if (! S_ISREG(sbuf.st_mode)) {
+		warning(ext_id, _("inplace::begin: `%s' is not a regular file"),
+			filename.str_value.str);
+		unset_ERRNO();
+		return make_number(-1, result);
+	}
+
+	/* create a temporary file to which to redirect stdout */
+	emalloc(state.tname, char *, filename.str_value.len+14, "do_inplace_begin");
+	sprintf(state.tname, "%s.gawk.XXXXXX", filename.str_value.str);
+
+	if ((fd = mkstemp(state.tname)) < 0)
+		fatal(ext_id, _("inplace::begin: mkstemp(`%s') failed (%s)"),
+			state.tname, strerror(errno));
+
+	/* N.B. chown/chmod should be more portable than fchown/fchmod */
+	if (chown(state.tname, sbuf.st_uid, sbuf.st_gid) < 0) {
+		/* jumping through hoops to silence gcc and clang. :-( */
+		int junk;
+		junk = chown(state.tname, -1, sbuf.st_gid);
+		++junk;
+	}
+
+	if (chmod(state.tname, sbuf.st_mode) < 0)
+		fatal(ext_id, _("inplace::begin: chmod failed (%s)"),
+			strerror(errno));
+
+	fflush(stdout);
+	/* N.B. fgetpos fails when stdout is a tty */
+	state.posrc = fgetpos(stdout, &state.pos);
+	if ((state.default_stdout = dup(STDOUT_FILENO)) < 0)
+		fatal(ext_id, _("inplace::begin: dup(stdout) failed (%s)"),
+			strerror(errno));
+	if (dup2(fd, STDOUT_FILENO) < 0)
+		fatal(ext_id, _("inplace::begin: dup2(%d, stdout) failed (%s)"),
+			fd, strerror(errno));
+	if (close(fd) < 0)
+		fatal(ext_id, _("inplace::begin: close(%d) failed (%s)"),
+			fd, strerror(errno));
+	rewind(stdout);
+	return make_number(0, result);
+}
+
+/* do_inplace_end --- finish in-place editing */
+
+static awk_value_t *
+do_inplace_end(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t filename, suffix;
+
+	assert(result != NULL);
+
+	if (nargs != 2)
+		fatal(ext_id, _("inplace::end: expects 2 arguments but called with %d"), nargs);
+
+	if (! get_argument(0, AWK_STRING, &filename))
+		fatal(ext_id, _("inplace::end: cannot retrieve 1st argument as a string filename"));
+
+	if (! get_argument(1, AWK_STRING, &suffix))
+		suffix.str_value.str = NULL;
+
+	if (! state.tname) {
+		if (! invalid_filename(&filename.str_value))
+			warning(ext_id, _("inplace::end: in-place editing not active"));
+		return make_number(0, result);
+	}
+
+	fflush(stdout);
+	if (dup2(state.default_stdout, STDOUT_FILENO) < 0)
+		fatal(ext_id, _("inplace::end: dup2(%d, stdout) failed (%s)"),
+			state.default_stdout, strerror(errno));
+	if (close(state.default_stdout) < 0)
+		fatal(ext_id, _("inplace::end: close(%d) failed (%s)"),
+			state.default_stdout, strerror(errno));
+	state.default_stdout = -1;
+	if (state.posrc == 0 && fsetpos(stdout, &state.pos) < 0)
+		fatal(ext_id, _("inplace::end: fsetpos(stdout) failed (%s)"),
+			strerror(errno));
+
+	if (suffix.str_value.str && suffix.str_value.str[0]) {
+		/* backup requested */
+		char *bakname;
+
+		emalloc(bakname, char *, filename.str_value.len+suffix.str_value.len+1,
+			"do_inplace_end");
+		sprintf(bakname, "%s%s",
+			filename.str_value.str, suffix.str_value.str);
+		unlink(bakname); /* if backup file exists already, remove it */
+		if (link(filename.str_value.str, bakname) < 0)
+			fatal(ext_id, _("inplace::end: link(`%s', `%s') failed (%s)"),
+				filename.str_value.str, bakname, strerror(errno));
+		gawk_free(bakname);
+	}
+
+#ifdef __MINGW32__
+	unlink(filename.str_value.str);
+#endif
+
+	if (rename(state.tname, filename.str_value.str) < 0)
+		fatal(ext_id, _("inplace::end: rename(`%s', `%s') failed (%s)"),
+			state.tname, filename.str_value.str, strerror(errno));
+	gawk_free(state.tname);
+	state.tname = NULL;
+	return make_number(0, result);
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "begin", do_inplace_begin, 2, 2, awk_false, NULL },
+	{ "end", do_inplace_end, 2, 2, awk_false, NULL },
+};
+
+static awk_bool_t init_inplace(void)
+{
+	awk_atexit(at_exit, NULL);
+	return awk_true;
+}
+
+static awk_bool_t (*init_func)(void) = init_inplace;
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, inplace, "inplace")
diff --git a/gawk-5.0.1/extension/intdiv.c b/gawk-5.0.1/extension/intdiv.c
new file mode 100644
index 00000000000..4e3ae50d695
--- /dev/null
+++ b/gawk-5.0.1/extension/intdiv.c
@@ -0,0 +1,243 @@
+/*
+ * intdiv.c - Provide integer div/mod for MPFR.
+ */
+
+/*
+ * Copyright (C) 2017, 2018, the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#ifdef HAVE_MPFR
+#include <gmp.h>
+#include <mpfr.h>
+#ifndef MPFR_RNDZ
+/* for compatibility with MPFR 2.X */
+#define MPFR_RNDZ GMP_RNDZ
+#endif
+#endif
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "intdiv extension: version 1.0";
+static awk_bool_t (*init_func)(void) = NULL;
+
+int plugin_is_GPL_compatible;
+
+/* double_to_int --- get the integer part of a double */
+
+static double
+double_to_int(double d)
+{
+	if (d >= 0)
+		d = floor(d);
+	else
+		d = ceil(d);
+	return d;
+}
+
+/* array_set_number --- set an array element to a numeric value */
+
+static void
+array_set_number(awk_array_t array, const char *sub, size_t sublen, double num)
+{
+	awk_value_t index, tmp;
+
+	set_array_element(array, make_const_string(sub, sublen, & index), make_number(num, & tmp));
+}
+
+#ifdef HAVE_MPFR
+
+/* mpz_conv --- convert an awk_value_t to an MPZ value */
+
+static mpz_ptr
+mpz_conv(const awk_value_t *arg, mpz_ptr tmp)
+{
+	switch (arg->num_type) {
+	case AWK_NUMBER_TYPE_MPZ:
+		return arg->num_ptr;
+	case AWK_NUMBER_TYPE_MPFR:
+		if (! mpfr_number_p(arg->num_ptr))
+			return NULL;
+		mpz_init(tmp);
+		mpfr_get_z(tmp, arg->num_ptr, MPFR_RNDZ);
+		return tmp;
+	case AWK_NUMBER_TYPE_DOUBLE:	/* can this happen? */
+		mpz_init(tmp);
+		mpz_set_d(tmp, double_to_int(arg->num_value));
+		return tmp;
+	default:	/* should never happen */
+		fatal(ext_id, _("intdiv: invalid numeric type `%d'"), arg->num_type);
+		return NULL;
+	}
+}
+
+/* array_set_mpz --- set an array element to an MPZ value */
+
+static void
+array_set_mpz(awk_array_t array, const char *sub, size_t sublen, mpz_ptr num)
+{
+	awk_value_t index, tmp;
+
+	set_array_element(array, make_const_string(sub, sublen, & index), make_number_mpz(num, & tmp));
+}
+
+#endif
+
+/* do_intdiv --- do integer division, return quotient and remainder in dest array */
+
+/*
+ * We define the semantics as:
+ * 	numerator = int(numerator)
+ *	denominator = int(denonmator)
+ *	quotient = int(numerator / denomator)
+ *	remainder = int(numerator % denomator)
+ */
+
+static awk_value_t *
+do_intdiv(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t nv, dv, array_param;
+	awk_array_t array;
+
+	if (! get_argument(0, AWK_NUMBER, & nv)) {
+		warning(ext_id, _("intdiv: first argument must be numeric"));
+		return make_number(-1, result);
+	}
+	if (! get_argument(1, AWK_NUMBER, & dv)) {
+		warning(ext_id, _("intdiv: second argument must be numeric"));
+		return make_number(-1, result);
+	}
+	if (! get_argument(2, AWK_ARRAY, & array_param)) {
+		warning(ext_id, _("intdiv: third argument must be an array"));
+		return make_number(-1, result);
+	}
+	array = array_param.array_cookie;
+	clear_array(array);
+
+#ifdef HAVE_MPFR
+	if (nv.num_type == AWK_NUMBER_TYPE_DOUBLE && dv.num_type == AWK_NUMBER_TYPE_DOUBLE)
+#endif
+	{
+		/* regular precision */
+		double num, denom, quotient, remainder;
+
+#ifndef HAVE_MPFR
+		if (nv.num_type != AWK_NUMBER_TYPE_DOUBLE || dv.num_type != AWK_NUMBER_TYPE_DOUBLE) {
+			static int warned = 0;
+			if (!warned) {
+				warning(ext_id, _("intdiv: MPFR arguments converted to IEEE because this extension was not compiled with MPFR support; loss of precision may occur"));
+				warned = 1;
+			}
+		}
+#endif
+		num = double_to_int(nv.num_value);
+		denom = double_to_int(dv.num_value);
+
+		if (denom == 0.0) {
+			warning(ext_id, _("intdiv: division by zero attempted"));
+			return make_number(-1, result);
+		}
+
+		quotient = double_to_int(num / denom);
+#ifdef HAVE_FMOD
+		remainder = fmod(num, denom);
+#else	/* ! HAVE_FMOD */
+		(void) modf(num / denom, & remainder);
+		remainder = num - remainder * denom;
+#endif	/* ! HAVE_FMOD */
+		remainder = double_to_int(remainder);
+
+		array_set_number(array, "quotient", 8, quotient);
+		array_set_number(array, "remainder", 9, remainder);
+	}
+#ifdef HAVE_MPFR
+	else {
+		/* extended precision */
+		mpz_ptr numer, denom;
+		mpz_t numer_tmp, denom_tmp;
+		mpz_ptr quotient, remainder;
+
+		/* convert numerator and denominator to integer */
+		if (!(numer = mpz_conv(&nv, numer_tmp))) {
+			warning(ext_id, _("intdiv: numerator is not finite"));
+			return make_number(-1, result);
+		}
+		if (!(denom = mpz_conv(&dv, denom_tmp))) {
+			warning(ext_id, _("intdiv: denominator is not finite"));
+			if (numer == numer_tmp)
+				mpz_clear(numer);
+			return make_number(-1, result);
+		}
+		if (mpz_sgn(denom) == 0) {
+			warning(ext_id, _("intdiv: division by zero attempted"));
+			if (numer == numer_tmp)
+				mpz_clear(numer);
+			if (denom == denom_tmp)
+				mpz_clear(denom);
+			return make_number(-1, result);
+		}
+
+		/* ask gawk to allocate return values for us */
+		quotient = get_mpz_ptr();
+		remainder = get_mpz_ptr();
+
+		/* do the division */
+		mpz_tdiv_qr(quotient, remainder, numer, denom);
+
+		array_set_mpz(array, "quotient", 8, quotient);
+		array_set_mpz(array, "remainder", 9, remainder);
+
+		/* release temporary variables */
+		if (numer == numer_tmp)
+			mpz_clear(numer);
+		if (denom == denom_tmp)
+			mpz_clear(denom);
+	}
+#endif
+
+	return make_number(0, result);
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "intdiv", do_intdiv, 3, 3, awk_false, NULL },
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, intdiv, "")
diff --git a/gawk-5.0.1/extension/m4/ChangeLog b/gawk-5.0.1/extension/m4/ChangeLog
new file mode 100644
index 00000000000..3009b3955d6
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/ChangeLog
@@ -0,0 +1,77 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.0: Release tar ball made.
+
+2018-03-07  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: New file, from gettext-0.19.7.
+	* iconv.m4: New file, from gettext-0.19.7.
+	* lib-ld.m4: Upgrade to gettext-0.19.7.
+	* lib-link.m4: Upgrade to gettext-0.19.7.
+	* lib-prefix.m4: Upgrade to gettext-0.19.7.
+	* nls.m4: Upgrade to gettext-0.19.7.
+	* po.m4: New file, from gettext-0.19.7.
+	* progtest.m4: Upgrade to gettext-0.19.7.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-03-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* libtoolm4, ltversion.m4: Updated to libtool 2.4.6.
+
+2015-01-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gettext.m4, iconv.m4, intlmacosx.m4, po.m4: Removed.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2013-12-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* libtool.m4, ltoptions.m4, ltversion.m4: Update to
+	libtool 2.4.2.418.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* dirfd.m4: New file.
+
+2012-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* intlmacosx.m4: New file.
+
+2012-07-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gettext.m4, iconv.m4, lib-ld.m4, lib-link.m4, lib-prefix.m4,
+	nls.m4, po.m4, progtest.m4: New files for gettext support.
+
+2012-05-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* libtool.m4, ltoptions.m4, ltsugar.m4, ltversion.m4, lt~obsolete.m4:
+	New files to support libtool.
diff --git a/gawk-5.0.1/extension/m4/codeset.m4 b/gawk-5.0.1/extension/m4/codeset.m4
new file mode 100644
index 00000000000..d7de8d67e0d
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/codeset.m4
@@ -0,0 +1,23 @@
+# codeset.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2006, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+  AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset],
+    [AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <langinfo.h>]],
+          [[char* cs = nl_langinfo(CODESET); return !cs;]])],
+       [am_cv_langinfo_codeset=yes],
+       [am_cv_langinfo_codeset=no])
+    ])
+  if test $am_cv_langinfo_codeset = yes; then
+    AC_DEFINE([HAVE_LANGINFO_CODESET], [1],
+      [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+  fi
+])
diff --git a/gawk-5.0.1/extension/m4/dirfd.m4 b/gawk-5.0.1/extension/m4/dirfd.m4
new file mode 100644
index 00000000000..0b09a390d9c
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/dirfd.m4
@@ -0,0 +1,84 @@
+# serial 22   -*- Autoconf -*-
+
+dnl Find out how to get the file descriptor associated with an open DIR*.
+
+# Copyright (C) 2001-2006, 2008-2013 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+dnl From Jim Meyering
+dnl Simplified for gawk
+
+AC_DEFUN([GAWK_FUNC_DIRFD],
+[
+dnl  AC_REQUIRE([gl_DIRENT_H_DEFAULTS])
+
+  dnl Persuade glibc <dirent.h> to declare dirfd().
+  AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
+
+  AC_CHECK_FUNCS([dirfd])
+  AC_CHECK_DECLS([dirfd], , ,
+    [[#include <sys/types.h>
+      #include <dirent.h>]])
+  if test $ac_cv_have_decl_dirfd = no; then
+    HAVE_DECL_DIRFD=0
+  fi
+
+  AC_CACHE_CHECK([whether dirfd is a macro],
+    gl_cv_func_dirfd_macro,
+    [AC_EGREP_CPP([dirent_header_defines_dirfd], [
+#include <sys/types.h>
+#include <dirent.h>
+#ifdef dirfd
+ dirent_header_defines_dirfd
+#endif],
+       gl_cv_func_dirfd_macro=yes,
+       gl_cv_func_dirfd_macro=no)])
+
+  # Use the replacement only if we have no function or macro with that name.
+  if test $ac_cv_func_dirfd = no && test $gl_cv_func_dirfd_macro = no; then
+    if test $ac_cv_have_decl_dirfd = yes; then
+      # If the system declares dirfd already, let's declare rpl_dirfd instead.
+      REPLACE_DIRFD=1
+    fi
+  fi
+])
+
+dnl Prerequisites of lib/dirfd.c.
+AC_DEFUN([GAWK_PREREQ_DIRFD],
+[
+  AC_CACHE_CHECK([how to get the file descriptor associated with an open DIR*],
+                 [gl_cv_sys_dir_fd_member_name],
+    [
+      dirfd_save_CFLAGS=$CFLAGS
+      for ac_expr in d_fd dd_fd; do
+
+        CFLAGS="$CFLAGS -DDIR_FD_MEMBER_NAME=$ac_expr"
+        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+           #include <sys/types.h>
+           #include <dirent.h>]],
+          [[DIR *dir_p = opendir("."); (void) dir_p->DIR_FD_MEMBER_NAME;]])],
+          [dir_fd_found=yes]
+        )
+        CFLAGS=$dirfd_save_CFLAGS
+        test "$dir_fd_found" = yes && break
+      done
+      test "$dir_fd_found" = yes || ac_expr=no_such_member
+
+      gl_cv_sys_dir_fd_member_name=$ac_expr
+    ]
+  )
+  if test $gl_cv_sys_dir_fd_member_name != no_such_member; then
+    AC_DEFINE_UNQUOTED([DIR_FD_MEMBER_NAME],
+      [$gl_cv_sys_dir_fd_member_name],
+      [the name of the file descriptor member of DIR])
+  fi
+  AH_VERBATIM([DIR_TO_FD],
+              [#ifdef DIR_FD_MEMBER_NAME
+# define DIR_TO_FD(Dir_p) ((Dir_p)->DIR_FD_MEMBER_NAME)
+#else
+# define DIR_TO_FD(Dir_p) -1
+#endif
+])
+])
diff --git a/gawk-5.0.1/extension/m4/extern-inline.m4 b/gawk-5.0.1/extension/m4/extern-inline.m4
new file mode 100644
index 00000000000..72800650e6f
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/extern-inline.m4
@@ -0,0 +1,101 @@
+dnl 'extern inline' a la ISO C99.
+
+dnl Copyright 2012-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXTERN_INLINE],
+[
+  AH_VERBATIM([extern_inline],
+[/* Please see the Gnulib manual for how to use these macros.
+
+   Suppress extern inline with HP-UX cc, as it appears to be broken; see
+   <http://lists.gnu.org/archive/html/bug-texinfo/2013-02/msg00030.html>.
+
+   Suppress extern inline with Sun C in standards-conformance mode, as it
+   mishandles inline functions that call each other.  E.g., for 'inline void f
+   (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+   'reference to static identifier "f" in extern inline function'.
+   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+
+   Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+   on configurations that mistakenly use 'static inline' to implement
+   functions or macros in standard C headers like <ctype.h>.  For example,
+   if isdigit is mistakenly implemented via a static inline function,
+   a program containing an extern inline function that calls isdigit
+   may not work since the C standard prohibits extern inline functions
+   from calling static functions.  This bug is known to occur on:
+
+     OS X 10.8 and earlier; see:
+     http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html
+
+     DragonFly; see
+     http://muscles.dragonflybsd.org/bulk/bleeding-edge-potential/latest-per-pkg/ah-tty-0.3.12.log
+
+     FreeBSD; see:
+     http://lists.gnu.org/archive/html/bug-gnulib/2014-07/msg00104.html
+
+   OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+   for clang but remains for g++; see <http://trac.macports.org/ticket/41033>.
+   Assume DragonFly and FreeBSD will be similar.  */
+#if (((defined __APPLE__ && defined __MACH__) \
+      || defined __DragonFly__ || defined __FreeBSD__) \
+     && (defined __header_inline \
+         ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
+            && ! defined __clang__) \
+         : ((! defined _DONT_USE_CTYPE_INLINE_ \
+             && (defined __GNUC__ || defined __cplusplus)) \
+            || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
+                && defined __GNUC__ && ! defined __cplusplus))))
+# define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ \
+      ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
+      : (199901L <= __STDC_VERSION__ \
+         && !defined __HP_cc \
+         && !(defined __SUNPRO_C && __STDC__))) \
+     && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
+       && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+   /* __gnu_inline__ suppresses a GCC 4.2 diagnostic.  */
+#  define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
+# else
+#  define _GL_INLINE extern inline
+# endif
+# define _GL_EXTERN_INLINE extern
+# define _GL_EXTERN_INLINE_IN_USE
+#else
+# define _GL_INLINE static _GL_UNUSED
+# define _GL_EXTERN_INLINE static _GL_UNUSED
+#endif
+
+/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
+   suppress bogus "no previous prototype for 'FOO'"
+   and "no previous declaration for 'FOO'" diagnostics,
+   when FOO is an inline function in the header; see
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>.  */
+#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
+# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+#  define _GL_INLINE_HEADER_CONST_PRAGMA
+# else
+#  define _GL_INLINE_HEADER_CONST_PRAGMA \
+     _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+# endif
+# define _GL_INLINE_HEADER_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+    _GL_INLINE_HEADER_CONST_PRAGMA
+# define _GL_INLINE_HEADER_END \
+    _Pragma ("GCC diagnostic pop")
+#else
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif])
+])
diff --git a/gawk-5.0.1/extension/m4/fcntl-o.m4 b/gawk-5.0.1/extension/m4/fcntl-o.m4
new file mode 100644
index 00000000000..891a62fb6a3
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/fcntl-o.m4
@@ -0,0 +1,134 @@
+# fcntl-o.m4 serial 4
+dnl Copyright (C) 2006, 2009-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+# Test whether the flags O_NOATIME and O_NOFOLLOW actually work.
+# Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise.
+# Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise.
+AC_DEFUN([gl_FCNTL_O_FLAGS],
+[
+  dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
+  dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
+  dnl AC_GNU_SOURCE.
+  m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
+    [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
+    [AC_REQUIRE([AC_GNU_SOURCE])])
+
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+  AC_CHECK_FUNCS_ONCE([symlink])
+  AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
+    [AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <sys/types.h>
+           #include <sys/stat.h>
+           #if HAVE_UNISTD_H
+           # include <unistd.h>
+           #else /* on Windows with MSVC */
+           # include <io.h>
+           # include <stdlib.h>
+           # defined sleep(n) _sleep ((n) * 1000)
+           #endif
+           #include <fcntl.h>
+           #ifndef O_NOATIME
+            #define O_NOATIME 0
+           #endif
+           #ifndef O_NOFOLLOW
+            #define O_NOFOLLOW 0
+           #endif
+           static int const constants[] =
+            {
+              O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+              O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+            };
+          ]],
+          [[
+            int result = !constants;
+            #if HAVE_SYMLINK
+            {
+              static char const sym[] = "conftest.sym";
+              if (symlink ("/dev/null", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              if (unlink (sym) != 0 || symlink (".", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_RDONLY | O_NOFOLLOW);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              unlink (sym);
+            }
+            #endif
+            {
+              static char const file[] = "confdefs.h";
+              int fd = open (file, O_RDONLY | O_NOATIME);
+              if (fd < 0)
+                result |= 8;
+              else
+                {
+                  struct stat st0;
+                  if (fstat (fd, &st0) != 0)
+                    result |= 16;
+                  else
+                    {
+                      char c;
+                      sleep (1);
+                      if (read (fd, &c, 1) != 1)
+                        result |= 24;
+                      else
+                        {
+                          if (close (fd) != 0)
+                            result |= 32;
+                          else
+                            {
+                              struct stat st1;
+                              if (stat (file, &st1) != 0)
+                                result |= 40;
+                              else
+                                if (st0.st_atime != st1.st_atime)
+                                  result |= 64;
+                            }
+                        }
+                    }
+                }
+            }
+            return result;]])],
+       [gl_cv_header_working_fcntl_h=yes],
+       [case $? in #(
+        4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+        64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+        68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+         *) gl_cv_header_working_fcntl_h='no';;
+        esac],
+       [gl_cv_header_working_fcntl_h=cross-compiling])])
+
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
+    [Define to 1 if O_NOATIME works.])
+
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
+    [Define to 1 if O_NOFOLLOW works.])
+])
diff --git a/gawk-5.0.1/extension/m4/gettext.m4 b/gawk-5.0.1/extension/m4/gettext.m4
new file mode 100644
index 00000000000..da31efeeea4
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/gettext.m4
@@ -0,0 +1,405 @@
+# gettext.m4 serial 67 (gettext-0.19.6)
+dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl    default (if it is not specified or empty) is 'no-libtool'.
+dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl    depending on --{enable,disable}-{shared,static} and on the presence of
+dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl    $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl    implementations (in libc or libintl) without the ngettext() function
+dnl    will be ignored.  If NEEDSYMBOL is specified and is
+dnl    'need-formatstring-macros', then GNU gettext implementations that don't
+dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries.  If empty,
+dnl    the value '$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl    and used.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl    Catalog format: none
+dnl    Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+  dnl Argument checking.
+  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+  ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old],
+    [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])])
+  ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+  define([gt_included_intl],
+    ifelse([$1], [external],
+      ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]),
+      [yes]))
+  define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
+  gt_NEEDS_INIT
+  AM_GNU_GETTEXT_NEED([$2])
+
+  AC_REQUIRE([AM_PO_SUBDIRS])dnl
+  ifelse(gt_included_intl, yes, [
+    AC_REQUIRE([AM_INTL_SUBDIR])dnl
+  ])
+
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Sometimes libintl requires libiconv, so first search for libiconv.
+  dnl Ideally we would do this search only after the
+  dnl      if test "$USE_NLS" = "yes"; then
+  dnl        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+  dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+  dnl the configure script would need to contain the same shell code
+  dnl again, outside any 'if'. There are two solutions:
+  dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+  dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+  dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+  dnl documented, we avoid it.
+  ifelse(gt_included_intl, yes, , [
+    AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+  ])
+
+  dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
+  gt_INTL_MACOSX
+
+  dnl Set USE_NLS.
+  AC_REQUIRE([AM_NLS])
+
+  ifelse(gt_included_intl, yes, [
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+  ])
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+  dnl Add a version number to the cache macros.
+  case " $gt_needs " in
+    *" need-formatstring-macros "*) gt_api_version=3 ;;
+    *" need-ngettext "*) gt_api_version=2 ;;
+    *) gt_api_version=1 ;;
+  esac
+  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+  dnl If we use NLS figure out what method
+  if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+    ifelse(gt_included_intl, yes, [
+      AC_MSG_CHECKING([whether included gettext is requested])
+      AC_ARG_WITH([included-gettext],
+        [  --with-included-gettext use the GNU gettext library included here],
+        nls_cv_force_use_gnu_gettext=$withval,
+        nls_cv_force_use_gnu_gettext=no)
+      AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+    ])
+        dnl User does not insist on using GNU NLS library.  Figure out what
+        dnl to use.  If GNU gettext is available we use this.  Else we have
+        dnl to fall back to GNU NLS library.
+
+        if test $gt_api_version -ge 3; then
+          gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+'
+        else
+          gt_revision_test_code=
+        fi
+        if test $gt_api_version -ge 2; then
+          gt_expression_test_code=' + * ngettext ("", "", 0)'
+        else
+          gt_expression_test_code=
+        fi
+
+        AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
+         [AC_LINK_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+               ]],
+               [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
+               ]])],
+            [eval "$gt_func_gnugettext_libc=yes"],
+            [eval "$gt_func_gnugettext_libc=no"])])
+
+        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+          dnl Sometimes libintl requires libiconv, so first search for libiconv.
+          ifelse(gt_included_intl, yes, , [
+            AM_ICONV_LINK
+          ])
+          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+          dnl even if libiconv doesn't exist.
+          AC_LIB_LINKFLAGS_BODY([intl])
+          AC_CACHE_CHECK([for GNU gettext in libintl],
+            [$gt_func_gnugettext_libintl],
+           [gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+            dnl Now see whether libintl exists and does not depend on libiconv.
+            AC_LINK_IFELSE(
+              [AC_LANG_PROGRAM(
+                 [[
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+                 ]],
+                 [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+                 ]])],
+              [eval "$gt_func_gnugettext_libintl=yes"],
+              [eval "$gt_func_gnugettext_libintl=no"])
+            dnl Now see whether libintl exists and depends on libiconv.
+            if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              AC_LINK_IFELSE(
+                [AC_LANG_PROGRAM(
+                   [[
+#include <libintl.h>
+$gt_revision_test_code
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+                   ]],
+                   [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
+                   ]])],
+                [LIBINTL="$LIBINTL $LIBICONV"
+                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                 eval "$gt_func_gnugettext_libintl=yes"
+                ])
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"])
+        fi
+
+        dnl If an already present or preinstalled GNU gettext() is found,
+        dnl use it.  But if this macro is used in GNU gettext, and GNU
+        dnl gettext is already preinstalled in libintl, we update this
+        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
+        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+          dnl Reset the values set by searching for libintl.
+          LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+    ifelse(gt_included_intl, yes, [
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+          dnl GNU gettext is not found in the C library.
+          dnl Fall back on included GNU gettext library.
+          nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions used to generate GNU NLS library.
+        BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
+        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      CATOBJEXT=
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions to use GNU gettext tools.
+        CATOBJEXT=.gmo
+      fi
+    ])
+
+    if test -n "$INTL_MACOSX_LIBS"; then
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Some extra flags are needed during linking.
+        LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+      fi
+    fi
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+      AC_DEFINE([ENABLE_NLS], [1],
+        [Define to 1 if translation of program messages to the user's native language
+   is requested.])
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  AC_MSG_CHECKING([whether to use NLS])
+  AC_MSG_RESULT([$USE_NLS])
+  if test "$USE_NLS" = "yes"; then
+    AC_MSG_CHECKING([where the gettext function comes from])
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    AC_MSG_RESULT([$gt_source])
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        AC_MSG_CHECKING([how to link with libintl])
+        AC_MSG_RESULT([$LIBINTL])
+        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+      fi
+
+      dnl For backward compatibility. Some packages may be using this.
+      AC_DEFINE([HAVE_GETTEXT], [1],
+       [Define if the GNU gettext() function is already present or preinstalled.])
+      AC_DEFINE([HAVE_DCGETTEXT], [1],
+       [Define if the GNU dcgettext() function is already present or preinstalled.])
+    fi
+
+    dnl We need to process the po/ directory.
+    POSUB=po
+  fi
+
+  ifelse(gt_included_intl, yes, [
+    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+    dnl to 'yes' because some of the testsuite requires it.
+    if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+    dnl Make all variables we use known to autoconf.
+    AC_SUBST([BUILD_INCLUDED_LIBINTL])
+    AC_SUBST([USE_INCLUDED_LIBINTL])
+    AC_SUBST([CATOBJEXT])
+
+    dnl For backward compatibility. Some configure.ins may be using this.
+    nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    DATADIRNAME=share
+    AC_SUBST([DATADIRNAME])
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INSTOBJEXT=.mo
+    AC_SUBST([INSTOBJEXT])
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    GENCAT=gencat
+    AC_SUBST([GENCAT])
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INTLOBJS=
+    if test "$USE_INCLUDED_LIBINTL" = yes; then
+      INTLOBJS="\$(GETTOBJS)"
+    fi
+    AC_SUBST([INTLOBJS])
+
+    dnl Enable libtool support if the surrounding package wishes it.
+    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+    AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
+  ])
+
+  dnl For backward compatibility. Some Makefiles may be using this.
+  INTLLIBS="$LIBINTL"
+  AC_SUBST([INTLLIBS])
+
+  dnl Make all documented variables known to autoconf.
+  AC_SUBST([LIBINTL])
+  AC_SUBST([LTLIBINTL])
+  AC_SUBST([POSUB])
+])
+
+
+dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
+m4_define([gt_NEEDS_INIT],
+[
+  m4_divert_text([DEFAULTS], [gt_needs=])
+  m4_define([gt_NEEDS_INIT], [])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
+AC_DEFUN([AM_GNU_GETTEXT_NEED],
+[
+  m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
+
+
+dnl Usage: AM_GNU_GETTEXT_REQUIRE_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_REQUIRE_VERSION], [])
diff --git a/gawk-5.0.1/extension/m4/glibc2.m4 b/gawk-5.0.1/extension/m4/glibc2.m4
new file mode 100644
index 00000000000..216c8630805
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/glibc2.m4
@@ -0,0 +1,31 @@
+# glibc2.m4 serial 3
+dnl Copyright (C) 2000-2002, 2004, 2008, 2010-2015 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.0 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([gt_GLIBC2],
+  [
+    AC_CACHE_CHECK([whether we are using the GNU C Library 2 or newer],
+      [ac_cv_gnu_library_2],
+      [AC_EGREP_CPP([Lucky GNU user],
+        [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+  Lucky GNU user
+ #endif
+#endif
+        ],
+        [ac_cv_gnu_library_2=yes],
+        [ac_cv_gnu_library_2=no])
+      ]
+    )
+    AC_SUBST([GLIBC2])
+    GLIBC2="$ac_cv_gnu_library_2"
+  ]
+)
diff --git a/gawk-5.0.1/extension/m4/glibc21.m4 b/gawk-5.0.1/extension/m4/glibc21.m4
new file mode 100644
index 00000000000..3a971c5a240
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/glibc21.m4
@@ -0,0 +1,34 @@
+# glibc21.m4 serial 5
+dnl Copyright (C) 2000-2002, 2004, 2008, 2010-2015 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.1 or newer, or uClibc.
+# From Bruno Haible.
+
+AC_DEFUN([gl_GLIBC21],
+  [
+    AC_CACHE_CHECK([whether we are using the GNU C Library >= 2.1 or uClibc],
+      [ac_cv_gnu_library_2_1],
+      [AC_EGREP_CPP([Lucky],
+        [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+  Lucky GNU user
+ #endif
+#endif
+#ifdef __UCLIBC__
+ Lucky user
+#endif
+        ],
+        [ac_cv_gnu_library_2_1=yes],
+        [ac_cv_gnu_library_2_1=no])
+      ]
+    )
+    AC_SUBST([GLIBC21])
+    GLIBC21="$ac_cv_gnu_library_2_1"
+  ]
+)
diff --git a/gawk-5.0.1/extension/m4/iconv.m4 b/gawk-5.0.1/extension/m4/iconv.m4
new file mode 100644
index 00000000000..4e373631566
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/iconv.m4
@@ -0,0 +1,271 @@
+# iconv.m4 serial 19 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2007-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+  dnl those with the standalone portable GNU libiconv installed).
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libiconv and not disabled its use
+  dnl via --without-libiconv-prefix, he wants to use it. The first
+  dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+  AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[
+#include <stdlib.h>
+#include <iconv.h>
+         ]],
+         [[iconv_t cd = iconv_open("","");
+           iconv(cd,NULL,NULL,NULL,NULL);
+           iconv_close(cd);]])],
+      [am_cv_func_iconv=yes])
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[
+#include <stdlib.h>
+#include <iconv.h>
+           ]],
+           [[iconv_t cd = iconv_open("","");
+             iconv(cd,NULL,NULL,NULL,NULL);
+             iconv_close(cd);]])],
+        [am_cv_lib_iconv=yes]
+        [am_cv_func_iconv=yes])
+      LIBS="$am_save_LIBS"
+    fi
+  ])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+      dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
+      dnl Solaris 10.
+      am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        AC_RUN_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+             ]],
+             [[int result = 0;
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 1;
+        iconv_close (cd_utf8_to_88591);
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\263";
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 2;
+        iconv_close (cd_ascii_to_88591);
+      }
+  }
+  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304";
+        static char buf[2] = { (char)0xDE, (char)0xAD };
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = 1;
+        char *outptr = buf;
+        size_t outbytesleft = 1;
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+          result |= 4;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          result |= 8;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    result |= 16;
+  return result;
+]])],
+          [am_cv_func_iconv_works=yes], ,
+          [case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac])
+        test "$am_cv_func_iconv_works" = no || break
+      done
+      LIBS="$am_save_LIBS"
+    ])
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+    AC_DEFINE([HAVE_ICONV], [1],
+      [Define if you have the iconv() function and it works.])
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    AC_MSG_CHECKING([how to link with libiconv])
+    AC_MSG_RESULT([$LIBICONV])
+  else
+    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+    dnl either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  AC_SUBST([LIBICONV])
+  AC_SUBST([LTLIBICONV])
+])
+
+dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
+dnl avoid warnings like
+dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
+dnl This is tricky because of the way 'aclocal' is implemented:
+dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
+dnl   Otherwise aclocal's initial scan pass would miss the macro definition.
+dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
+dnl   Otherwise aclocal would emit many "Use of uninitialized value $1"
+dnl   warnings.
+m4_define([gl_iconv_AC_DEFUN],
+  m4_version_prereq([2.64],
+    [[AC_DEFUN_ONCE(
+        [$1], [$2])]],
+    [m4_ifdef([gl_00GNULIB],
+       [[AC_DEFUN_ONCE(
+           [$1], [$2])]],
+       [[AC_DEFUN(
+           [$1], [$2])]])]))
+gl_iconv_AC_DEFUN([AM_ICONV],
+[
+  AM_ICONV_LINK
+  if test "$am_cv_func_iconv" = yes; then
+    AC_MSG_CHECKING([for iconv declaration])
+    AC_CACHE_VAL([am_cv_proto_iconv], [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+           ]],
+           [[]])],
+        [am_cv_proto_iconv_arg1=""],
+        [am_cv_proto_iconv_arg1="const"])
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    AC_MSG_RESULT([
+         $am_cv_proto_iconv])
+    AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
+      [Define as const if the declaration of iconv() needs const.])
+    dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
+    m4_ifdef([gl_ICONV_H_DEFAULTS],
+      [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+       if test -n "$am_cv_proto_iconv_arg1"; then
+         ICONV_CONST="const"
+       fi
+      ])
+  fi
+])
diff --git a/gawk-5.0.1/extension/m4/intdiv0.m4 b/gawk-5.0.1/extension/m4/intdiv0.m4
new file mode 100644
index 00000000000..44f986325b8
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/intdiv0.m4
@@ -0,0 +1,87 @@
+# intdiv0.m4 serial 6 (gettext-0.18.2)
+dnl Copyright (C) 2002, 2007-2008, 2010-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gt_INTDIV0],
+[
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+  AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
+    gt_cv_int_divbyzero_sigfpe,
+    [
+      gt_cv_int_divbyzero_sigfpe=
+changequote(,)dnl
+      case "$host_os" in
+        macos* | darwin[6-9]* | darwin[1-9][0-9]*)
+          # On Mac OS X 10.2 or newer, just assume the same as when cross-
+          # compiling. If we were to perform the real test, 1 Crash Report
+          # dialog window would pop up.
+          case "$host_cpu" in
+            i[34567]86 | x86_64)
+              gt_cv_int_divbyzero_sigfpe="guessing yes" ;;
+          esac
+          ;;
+      esac
+changequote([,])dnl
+      if test -z "$gt_cv_int_divbyzero_sigfpe"; then
+        AC_RUN_IFELSE(
+          [AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+sigfpe_handler (int sig)
+{
+  /* Exit with code 0 if SIGFPE, with code 1 if any other signal.  */
+  exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+  signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP.  */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+  signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL.  */
+#if defined (__sparc__) && defined (__linux__)
+  signal (SIGILL, sigfpe_handler);
+#endif
+
+  z = x / y;
+  nan = y / y;
+  exit (2);
+}
+]])],
+          [gt_cv_int_divbyzero_sigfpe=yes],
+          [gt_cv_int_divbyzero_sigfpe=no],
+          [
+            # Guess based on the CPU.
+changequote(,)dnl
+            case "$host_cpu" in
+              alpha* | i[34567]86 | x86_64 | m68k | s390*)
+                gt_cv_int_divbyzero_sigfpe="guessing yes";;
+              *)
+                gt_cv_int_divbyzero_sigfpe="guessing no";;
+            esac
+changequote([,])dnl
+          ])
+      fi
+    ])
+  case "$gt_cv_int_divbyzero_sigfpe" in
+    *yes) value=1;;
+    *) value=0;;
+  esac
+  AC_DEFINE_UNQUOTED([INTDIV0_RAISES_SIGFPE], [$value],
+    [Define if integer division by zero raises signal SIGFPE.])
+])
diff --git a/gawk-5.0.1/extension/m4/intl.m4 b/gawk-5.0.1/extension/m4/intl.m4
new file mode 100644
index 00000000000..5cd7863d40a
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/intl.m4
@@ -0,0 +1,304 @@
+# intl.m4 serial 29 (gettext-0.19)
+dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2009.
+
+AC_PREREQ([2.60])
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl            USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+  AC_REQUIRE([gt_GLIBC2])dnl
+  AC_REQUIRE([AC_PROG_RANLIB])dnl
+  AC_REQUIRE([gl_VISIBILITY])dnl
+  AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl
+  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl
+  AC_REQUIRE([gt_TYPE_WCHAR_T])dnl
+  AC_REQUIRE([gt_TYPE_WINT_T])dnl
+  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([gt_TYPE_INTMAX_T])
+  AC_REQUIRE([gt_PRINTF_POSIX])
+  AC_REQUIRE([gl_GLIBC21])dnl
+  AC_REQUIRE([gl_XSIZE])dnl
+  AC_REQUIRE([gl_FCNTL_O_FLAGS])dnl
+  AC_REQUIRE([gt_INTL_MACOSX])dnl
+  AC_REQUIRE([gl_EXTERN_INLINE])dnl
+  AC_REQUIRE([gt_GL_ATTRIBUTE])dnl
+
+  dnl Support for automake's --enable-silent-rules.
+  case "$enable_silent_rules" in
+    yes) INTL_DEFAULT_VERBOSITY=0;;
+    no)  INTL_DEFAULT_VERBOSITY=1;;
+    *)   INTL_DEFAULT_VERBOSITY=1;;
+  esac
+  AC_SUBST([INTL_DEFAULT_VERBOSITY])
+
+  AC_CHECK_TYPE([ptrdiff_t], ,
+    [AC_DEFINE([ptrdiff_t], [long],
+       [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+    ])
+  AC_CHECK_HEADERS([features.h stddef.h stdlib.h string.h])
+  AC_CHECK_FUNCS([asprintf fwprintf newlocale putenv setenv setlocale \
+    snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb])
+
+  dnl Use the _snprintf function only if it is declared (because on NetBSD it
+  dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+  AC_CHECK_DECLS([_snprintf, _snwprintf], , , [#include <stdio.h>])
+
+  dnl Use the *_unlocked functions only if they are declared.
+  dnl (because some of them were defined without being declared in Solaris
+  dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+  dnl on Solaris 2.5.1 to run on Solaris 2.6).
+  AC_CHECK_DECLS([getc_unlocked], , , [#include <stdio.h>])
+
+  case $gt_cv_func_printf_posix in
+    *yes) HAVE_POSIX_PRINTF=1 ;;
+    *) HAVE_POSIX_PRINTF=0 ;;
+  esac
+  AC_SUBST([HAVE_POSIX_PRINTF])
+  if test "$ac_cv_func_asprintf" = yes; then
+    HAVE_ASPRINTF=1
+  else
+    HAVE_ASPRINTF=0
+  fi
+  AC_SUBST([HAVE_ASPRINTF])
+  if test "$ac_cv_func_snprintf" = yes; then
+    HAVE_SNPRINTF=1
+  else
+    HAVE_SNPRINTF=0
+  fi
+  AC_SUBST([HAVE_SNPRINTF])
+  if test "$ac_cv_func_newlocale" = yes; then
+    HAVE_NEWLOCALE=1
+  else
+    HAVE_NEWLOCALE=0
+  fi
+  AC_SUBST([HAVE_NEWLOCALE])
+  if test "$ac_cv_func_wprintf" = yes; then
+    HAVE_WPRINTF=1
+  else
+    HAVE_WPRINTF=0
+  fi
+  AC_SUBST([HAVE_WPRINTF])
+
+  AM_LANGINFO_CODESET
+  gt_LC_MESSAGES
+
+  dnl Compilation on mingw and Cygwin needs special Makefile rules, because
+  dnl 1. when we install a shared library, we must arrange to export
+  dnl    auxiliary pointer variables for every exported variable,
+  dnl 2. when we install a shared library and a static library simultaneously,
+  dnl    the include file specifies __declspec(dllimport) and therefore we
+  dnl    must arrange to define the auxiliary pointer variables for the
+  dnl    exported variables _also_ in the static library.
+  if test "$enable_shared" = yes; then
+    case "$host_os" in
+      mingw* | cygwin*) is_woe32dll=yes ;;
+      *) is_woe32dll=no ;;
+    esac
+  else
+    is_woe32dll=no
+  fi
+  WOE32DLL=$is_woe32dll
+  AC_SUBST([WOE32DLL])
+
+  dnl On mingw and Cygwin, we can activate special Makefile rules which add
+  dnl version information to the shared libraries and executables.
+  case "$host_os" in
+    mingw* | cygwin*) is_woe32=yes ;;
+    *) is_woe32=no ;;
+  esac
+  WOE32=$is_woe32
+  AC_SUBST([WOE32])
+  if test $WOE32 = yes; then
+    dnl Check for a program that compiles Windows resource files.
+    AC_CHECK_TOOL([WINDRES], [windres])
+  fi
+
+  dnl Determine whether when creating a library, "-lc" should be passed to
+  dnl libtool or not. On many platforms, it is required for the libtool option
+  dnl -no-undefined to work. On HP-UX, however, the -lc - stored by libtool
+  dnl in the *.la files - makes it impossible to create multithreaded programs,
+  dnl because libtool also reorders the -lc to come before the -pthread, and
+  dnl this disables pthread_create() <http://docs.hp.com/en/1896/pthreads.html>.
+  case "$host_os" in
+    hpux*) LTLIBC="" ;;
+    *)     LTLIBC="-lc" ;;
+  esac
+  AC_SUBST([LTLIBC])
+
+  dnl Rename some macros and functions used for locking.
+  AH_BOTTOM([
+#define __libc_lock_t                   gl_lock_t
+#define __libc_lock_define              gl_lock_define
+#define __libc_lock_define_initialized  gl_lock_define_initialized
+#define __libc_lock_init                gl_lock_init
+#define __libc_lock_lock                gl_lock_lock
+#define __libc_lock_unlock              gl_lock_unlock
+#define __libc_lock_recursive_t                   gl_recursive_lock_t
+#define __libc_lock_define_recursive              gl_recursive_lock_define
+#define __libc_lock_define_initialized_recursive  gl_recursive_lock_define_initialized
+#define __libc_lock_init_recursive                gl_recursive_lock_init
+#define __libc_lock_lock_recursive                gl_recursive_lock_lock
+#define __libc_lock_unlock_recursive              gl_recursive_lock_unlock
+#define glthread_in_use  libintl_thread_in_use
+#define glthread_lock_init_func     libintl_lock_init_func
+#define glthread_lock_lock_func     libintl_lock_lock_func
+#define glthread_lock_unlock_func   libintl_lock_unlock_func
+#define glthread_lock_destroy_func  libintl_lock_destroy_func
+#define glthread_rwlock_init_multithreaded     libintl_rwlock_init_multithreaded
+#define glthread_rwlock_init_func              libintl_rwlock_init_func
+#define glthread_rwlock_rdlock_multithreaded   libintl_rwlock_rdlock_multithreaded
+#define glthread_rwlock_rdlock_func            libintl_rwlock_rdlock_func
+#define glthread_rwlock_wrlock_multithreaded   libintl_rwlock_wrlock_multithreaded
+#define glthread_rwlock_wrlock_func            libintl_rwlock_wrlock_func
+#define glthread_rwlock_unlock_multithreaded   libintl_rwlock_unlock_multithreaded
+#define glthread_rwlock_unlock_func            libintl_rwlock_unlock_func
+#define glthread_rwlock_destroy_multithreaded  libintl_rwlock_destroy_multithreaded
+#define glthread_rwlock_destroy_func           libintl_rwlock_destroy_func
+#define glthread_recursive_lock_init_multithreaded     libintl_recursive_lock_init_multithreaded
+#define glthread_recursive_lock_init_func              libintl_recursive_lock_init_func
+#define glthread_recursive_lock_lock_multithreaded     libintl_recursive_lock_lock_multithreaded
+#define glthread_recursive_lock_lock_func              libintl_recursive_lock_lock_func
+#define glthread_recursive_lock_unlock_multithreaded   libintl_recursive_lock_unlock_multithreaded
+#define glthread_recursive_lock_unlock_func            libintl_recursive_lock_unlock_func
+#define glthread_recursive_lock_destroy_multithreaded  libintl_recursive_lock_destroy_multithreaded
+#define glthread_recursive_lock_destroy_func           libintl_recursive_lock_destroy_func
+#define glthread_once_func            libintl_once_func
+#define glthread_once_singlethreaded  libintl_once_singlethreaded
+#define glthread_once_multithreaded   libintl_once_multithreaded
+])
+])
+
+
+dnl Checks for the core files of the intl subdirectory:
+dnl   dcigettext.c
+dnl   eval-plural.h
+dnl   explodename.c
+dnl   finddomain.c
+dnl   gettextP.h
+dnl   gmo.h
+dnl   hash-string.h hash-string.c
+dnl   l10nflist.c
+dnl   libgnuintl.h.in (except the *printf stuff)
+dnl   loadinfo.h
+dnl   loadmsgcat.c
+dnl   localealias.c
+dnl   log.c
+dnl   plural-exp.h plural-exp.c
+dnl   plural.y
+dnl Used by libglocale.
+AC_DEFUN([gt_INTL_SUBDIR_CORE],
+[
+  AC_REQUIRE([AC_C_INLINE])dnl
+  AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+  AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+  AC_REQUIRE([AC_FUNC_MMAP])dnl
+  AC_REQUIRE([gt_INTDIV0])dnl
+  AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl
+  AC_REQUIRE([gt_INTTYPES_PRI])dnl
+  AC_REQUIRE([gl_LOCK])dnl
+
+  AC_LINK_IFELSE(
+    [AC_LANG_PROGRAM(
+       [[int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }]],
+       [[]])],
+    [AC_DEFINE([HAVE_BUILTIN_EXPECT], [1],
+       [Define to 1 if the compiler understands __builtin_expect.])])
+
+  AC_CHECK_HEADERS([argz.h inttypes.h limits.h unistd.h sys/param.h])
+  AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \
+    stpcpy strcasecmp strdup strtoul tsearch uselocale argz_count \
+    argz_stringify argz_next __fsetlocking])
+
+  dnl Solaris 12 provides getlocalename_l, while Illumos doesn't have
+  dnl it nor the equivalent.
+  if test $ac_cv_func_uselocale = yes; then
+    AC_CHECK_FUNCS([getlocalename_l])
+  fi
+
+  dnl Use the *_unlocked functions only if they are declared.
+  dnl (because some of them were defined without being declared in Solaris
+  dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+  dnl on Solaris 2.5.1 to run on Solaris 2.6).
+  AC_CHECK_DECLS([feof_unlocked, fgets_unlocked], , , [#include <stdio.h>])
+
+  AM_ICONV
+
+  dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+  dnl because plural.y uses bison specific features. It requires at least
+  dnl bison-2.7 for %define api.pure.
+  dnl bison is only needed for the maintainer (who touches plural.y). But in
+  dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+  dnl the rule in general Makefile. Now, some people carelessly touch the
+  dnl files or have a broken "make" program, hence the plural.c rule will
+  dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+  dnl present or too old.
+  AC_CHECK_PROGS([INTLBISON], [bison])
+  if test -z "$INTLBISON"; then
+    ac_verc_fail=yes
+  else
+    dnl Found it, now check the version.
+    AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+    ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    case $ac_prog_version in
+      '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+      2.[7-9]* | [3-9].*)
+changequote([,])dnl
+         ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+      *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+    esac
+    AC_MSG_RESULT([$ac_prog_version])
+  fi
+  if test $ac_verc_fail = yes; then
+    INTLBISON=:
+  fi
+])
+
+dnl Copies _GL_UNUSED and _GL_ATTRIBUTE_PURE definitions from
+dnl gnulib-common.m4 as a fallback, if the project isn't using Gnulib.
+AC_DEFUN([gt_GL_ATTRIBUTE], [
+  m4_ifndef([gl_[]COMMON],
+    AH_VERBATIM([gt_gl_attribute],
+[/* Define as a marker that can be attached to declarations that might not
+    be used.  This helps to reduce warnings, such as from
+    GCC -Wunused-parameter.  */
+#ifndef _GL_UNUSED
+# if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+#  define _GL_UNUSED __attribute__ ((__unused__))
+# else
+#  define _GL_UNUSED
+# endif
+#endif
+
+/* The __pure__ attribute was added in gcc 2.96.  */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+]))])
diff --git a/gawk-5.0.1/extension/m4/intldir.m4 b/gawk-5.0.1/extension/m4/intldir.m4
new file mode 100644
index 00000000000..3ca0d14f1b3
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/intldir.m4
@@ -0,0 +1,19 @@
+# intldir.m4 serial 2 (gettext-0.18)
+dnl Copyright (C) 2006, 2009-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+AC_PREREQ([2.52])
+
+dnl Tells the AM_GNU_GETTEXT macro to consider an intl/ directory.
+AC_DEFUN([AM_GNU_GETTEXT_INTL_SUBDIR], [])
diff --git a/gawk-5.0.1/extension/m4/intlmacosx.m4 b/gawk-5.0.1/extension/m4/intlmacosx.m4
new file mode 100644
index 00000000000..bba7b3d5640
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/intlmacosx.m4
@@ -0,0 +1,56 @@
+# intlmacosx.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2004-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Checks for special options needed on Mac OS X.
+dnl Defines INTL_MACOSX_LIBS.
+AC_DEFUN([gt_INTL_MACOSX],
+[
+  dnl Check for API introduced in Mac OS X 10.2.
+  AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
+    [gt_cv_func_CFPreferencesCopyAppValue],
+    [gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <CoreFoundation/CFPreferences.h>]],
+          [[CFPreferencesCopyAppValue(NULL, NULL)]])],
+       [gt_cv_func_CFPreferencesCopyAppValue=yes],
+       [gt_cv_func_CFPreferencesCopyAppValue=no])
+     LIBS="$gt_save_LIBS"])
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+    AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
+      [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+  fi
+  dnl Check for API introduced in Mac OS X 10.3.
+  AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
+    [gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <CoreFoundation/CFLocale.h>]],
+          [[CFLocaleCopyCurrent();]])],
+       [gt_cv_func_CFLocaleCopyCurrent=yes],
+       [gt_cv_func_CFLocaleCopyCurrent=no])
+     LIBS="$gt_save_LIBS"])
+  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+    AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
+      [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
+  fi
+  INTL_MACOSX_LIBS=
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+  fi
+  AC_SUBST([INTL_MACOSX_LIBS])
+])
diff --git a/gawk-5.0.1/extension/m4/intmax.m4 b/gawk-5.0.1/extension/m4/intmax.m4
new file mode 100644
index 00000000000..08b3a382e6b
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/intmax.m4
@@ -0,0 +1,36 @@
+# intmax.m4 serial 6 (gettext-0.18.2)
+dnl Copyright (C) 2002-2005, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the system has the 'intmax_t' type, but don't attempt to
+dnl find a replacement if it is lacking.
+
+AC_DEFUN([gt_TYPE_INTMAX_T],
+[
+  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+  AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+          ]],
+          [[intmax_t x = -1;
+            return !x;]])],
+       [gt_cv_c_intmax_t=yes],
+       [gt_cv_c_intmax_t=no])])
+  if test $gt_cv_c_intmax_t = yes; then
+    AC_DEFINE([HAVE_INTMAX_T], [1],
+      [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+  fi
+])
diff --git a/gawk-5.0.1/extension/m4/inttypes-pri.m4 b/gawk-5.0.1/extension/m4/inttypes-pri.m4
new file mode 100644
index 00000000000..0884e71e672
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/inttypes-pri.m4
@@ -0,0 +1,42 @@
+# inttypes-pri.m4 serial 7 (gettext-0.18.2)
+dnl Copyright (C) 1997-2002, 2006, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.53])
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values.  This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+  AC_CHECK_HEADERS([inttypes.h])
+  if test $ac_cv_header_inttypes_h = yes; then
+    AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+      [gt_cv_inttypes_pri_broken],
+      [
+        AC_COMPILE_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[
+#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+             ]],
+             [[]])],
+          [gt_cv_inttypes_pri_broken=no],
+          [gt_cv_inttypes_pri_broken=yes])
+      ])
+  fi
+  if test "$gt_cv_inttypes_pri_broken" = yes; then
+    AC_DEFINE_UNQUOTED([PRI_MACROS_BROKEN], [1],
+      [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+    PRI_MACROS_BROKEN=1
+  else
+    PRI_MACROS_BROKEN=0
+  fi
+  AC_SUBST([PRI_MACROS_BROKEN])
+])
diff --git a/gawk-5.0.1/extension/m4/inttypes_h.m4 b/gawk-5.0.1/extension/m4/inttypes_h.m4
new file mode 100644
index 00000000000..d0b5f5d9829
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/inttypes_h.m4
@@ -0,0 +1,29 @@
+# inttypes_h.m4 serial 10
+dnl Copyright (C) 1997-2004, 2006, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
+[
+  AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[
+#include <sys/types.h>
+#include <inttypes.h>
+          ]],
+          [[uintmax_t i = (uintmax_t) -1; return !i;]])],
+       [gl_cv_header_inttypes_h=yes],
+       [gl_cv_header_inttypes_h=no])])
+  if test $gl_cv_header_inttypes_h = yes; then
+    AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1],
+      [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
diff --git a/gawk-5.0.1/extension/m4/lcmessage.m4 b/gawk-5.0.1/extension/m4/lcmessage.m4
new file mode 100644
index 00000000000..1e40e44fe3c
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/lcmessage.m4
@@ -0,0 +1,35 @@
+# lcmessage.m4 serial 7 (gettext-0.18.2)
+dnl Copyright (C) 1995-2002, 2004-2005, 2008-2014 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([gt_LC_MESSAGES],
+[
+  AC_CACHE_CHECK([for LC_MESSAGES], [gt_cv_val_LC_MESSAGES],
+    [AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <locale.h>]],
+          [[return LC_MESSAGES]])],
+       [gt_cv_val_LC_MESSAGES=yes],
+       [gt_cv_val_LC_MESSAGES=no])])
+  if test $gt_cv_val_LC_MESSAGES = yes; then
+    AC_DEFINE([HAVE_LC_MESSAGES], [1],
+      [Define if your <locale.h> file defines LC_MESSAGES.])
+  fi
+])
diff --git a/gawk-5.0.1/extension/m4/lib-ld.m4 b/gawk-5.0.1/extension/m4/lib-ld.m4
new file mode 100644
index 00000000000..91ca9117098
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/lib-ld.m4
@@ -0,0 +1,119 @@
+# lib-ld.m4 serial 6
+dnl Copyright (C) 1996-2003, 2009-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
+dnl collision with libtool.m4.
+
+dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes
+  ;;
+*)
+  acl_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-2.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+        [assume the C compiler uses GNU ld [default=no]])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+      while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+        ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL([acl_cv_path_LD],
+[if test -z "$LD"; then
+  acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$acl_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+        test "$with_gnu_ld" != no && break
+        ;;
+      *)
+        test "$with_gnu_ld" != yes && break
+        ;;
+      esac
+    fi
+  done
+  IFS="$acl_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT([$LD])
+else
+  AC_MSG_RESULT([no])
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/gawk-5.0.1/extension/m4/lib-link.m4 b/gawk-5.0.1/extension/m4/lib-link.m4
new file mode 100644
index 00000000000..d8d5d1f0e12
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/lib-link.m4
@@ -0,0 +1,777 @@
+# lib-link.m4 serial 26 (gettext-0.18.2)
+dnl Copyright (C) 2001-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.54])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[m4_translit([$1],[./+-], [____])])
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+    ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[m4_translit([$1],[./+-], [____])])
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
+    dnl because these -l options might require -L options that are present in
+    dnl LIBS. -l options benefit only from the -L options listed before it.
+    dnl Otherwise, add it to the front of LIBS, because it may be a static
+    dnl library that depends on another static library that is present in LIBS.
+    dnl Static libraries benefit only from the static libraries listed after
+    dnl it.
+    case " $LIB[]NAME" in
+      *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
+      *)       LIBS="$LIB[]NAME $LIBS" ;;
+    esac
+    AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM([[$3]], [[$4]])],
+      [ac_cv_lib[]Name=yes],
+      [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+    LIB[]NAME[]_PREFIX=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl   acl_libext,
+dnl   acl_shlibext,
+dnl   acl_libname_spec,
+dnl   acl_library_names_spec,
+dnl   acl_hardcode_libdir_flag_spec,
+dnl   acl_hardcode_libdir_separator,
+dnl   acl_hardcode_direct,
+dnl   acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  dnl Determine whether the user wants rpath handling at all.
+  AC_ARG_ENABLE([rpath],
+    [  --disable-rpath         do not hardcode runtime library paths],
+    :, enable_rpath=yes)
+])
+
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  define([acl_frompackage_]NAME, [$2])
+  popdef([NAME])
+  pushdef([PACK],[$2])
+  pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+                                     [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  define([acl_libsinpackage_]PACKUP,
+    m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
+  popdef([PACKUP])
+  popdef([PACK])
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+  pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+                                     [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
+  dnl Autoconf >= 2.61 supports dots in --with options.
+  pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_ARG_WITH(P_A_C_K[-prefix],
+[[  --with-]]P_A_C_K[[-prefix[=DIR]  search for ]PACKLIBS[ in DIR/include and DIR/lib
+  --without-]]P_A_C_K[[-prefix     don't search for ]PACKLIBS[ in includedir and libdir]],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  LIB[]NAME[]_PREFIX=
+  dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+  dnl computed. So it has to be reset here.
+  HAVE_LIB[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+            dnl The same code as in the loop below:
+            dnl First look for a shared library.
+            if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+            dnl Then look for a static library.
+            if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  dnl First look for a shared library.
+                  if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                  dnl Then look for a static library.
+                  if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$acl_hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                      dnl Potentially add DIR to rpathdirs.
+                      dnl The rpathdirs will be appended to $LIBNAME at the end.
+                      haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                      dnl Potentially add DIR to ltrpathdirs.
+                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                      haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+  popdef([P_A_C_K])
+  popdef([PACKLIBS])
+  popdef([PACKUP])
+  popdef([PACK])
+  popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+  AC_REQUIRE([AC_LIB_RPATH])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  $1=
+  if test "$enable_rpath" != no; then
+    if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+      dnl Use an explicit option to hardcode directories into the resulting
+      dnl binary.
+      rpathdirs=
+      next=
+      for opt in $2; do
+        if test -n "$next"; then
+          dir="$next"
+          dnl No need to hardcode the standard /usr/lib.
+          if test "X$dir" != "X/usr/$acl_libdirstem" \
+             && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+            rpathdirs="$rpathdirs $dir"
+          fi
+          next=
+        else
+          case $opt in
+            -L) next=yes ;;
+            -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+                 dnl No need to hardcode the standard /usr/lib.
+                 if test "X$dir" != "X/usr/$acl_libdirstem" \
+                    && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+                   rpathdirs="$rpathdirs $dir"
+                 fi
+                 next= ;;
+            *) next= ;;
+          esac
+        fi
+      done
+      if test "X$rpathdirs" != "X"; then
+        if test -n ""$3""; then
+          dnl libtool is used for linking. Use -R options.
+          for dir in $rpathdirs; do
+            $1="${$1}${$1:+ }-R$dir"
+          done
+        else
+          dnl The linker is used for linking directly.
+          if test -n "$acl_hardcode_libdir_separator"; then
+            dnl Weird platform: only the last -rpath option counts, the user
+            dnl must pass all path elements in one option.
+            alldirs=
+            for dir in $rpathdirs; do
+              alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+            done
+            acl_save_libdir="$libdir"
+            libdir="$alldirs"
+            eval flag=\"$acl_hardcode_libdir_flag_spec\"
+            libdir="$acl_save_libdir"
+            $1="$flag"
+          else
+            dnl The -rpath options are cumulative.
+            for dir in $rpathdirs; do
+              acl_save_libdir="$libdir"
+              libdir="$dir"
+              eval flag=\"$acl_hardcode_libdir_flag_spec\"
+              libdir="$acl_save_libdir"
+              $1="${$1}${$1:+ }$flag"
+            done
+          fi
+        fi
+      fi
+    fi
+  fi
+  AC_SUBST([$1])
+])
diff --git a/gawk-5.0.1/extension/m4/lib-prefix.m4 b/gawk-5.0.1/extension/m4/lib-prefix.m4
new file mode 100644
index 00000000000..0465f477c04
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/lib-prefix.m4
@@ -0,0 +1,224 @@
+# lib-prefix.m4 serial 7 (gettext-0.18)
+dnl Copyright (C) 2001-2005, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a variable acl_libdirstem, containing the basename of the libdir, either
+dnl   "lib" or "lib64" or "lib/64",
+dnl - a variable acl_libdirstem2, as a secondary possible value for
+dnl   acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
+dnl   "lib/amd64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+  dnl There is no formal standard regarding lib and lib64.
+  dnl On glibc systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
+  dnl the compiler's default mode by looking at the compiler's library search
+  dnl path. If at least one of its elements ends in /lib64 or points to a
+  dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
+  dnl Otherwise we use the default, namely "lib".
+  dnl On Solaris systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+  dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+      dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+      dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
+      dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+      dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+      dnl symlink is missing, so we set acl_libdirstem2 too.
+      AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
+        [AC_EGREP_CPP([sixtyfour bits], [
+#ifdef _LP64
+sixtyfour bits
+#endif
+           ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
+        ])
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS= 	}"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+])
diff --git a/gawk-5.0.1/extension/m4/libtool.m4 b/gawk-5.0.1/extension/m4/libtool.m4
new file mode 100644
index 00000000000..10ab2844c4e
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/libtool.m4
@@ -0,0 +1,8388 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+])
+
+# serial 58 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in @S|@*""; do
+      case $cc_temp in
+        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
+m4_defun([_LT_CC_BASENAME],
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test set != "${COLLECT_NAMES+set}"; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from 'configure', and 'config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain=$ac_aux_dir/ltmain.sh
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the 'libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags='_LT_TAGS'dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# '#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $[#]
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try '$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try '$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "$LT_MULTI_MODULE"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS=$save_LDFLAGS
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]][[,.]]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+    fi
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+    m4_if([$1], [CXX],
+[   if test yes != "$lt_cv_apple_cc_single_mod"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+case $ECHO in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+  [Search for dependent libraries within DIR (or the compiler's sysroot
+   if not specified).])],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+   if test yes = "$GCC"; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([$with_sysroot])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and where our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE=32
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE=64
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test yes != "$lt_cv_cc_needs_belf"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS=$SAVE_CFLAGS
+  fi
+  ;;
+*-*solaris*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*|x86_64-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD=${LD-ld}_sol2
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks=$enable_libtool_lock
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test 0 -eq "$ac_status"; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test 0 -ne "$ac_status"; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test no = "$lt_cv_ar_at_file"; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  bitrig* | openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test yes = "[$]$2"; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+])
+
+if test yes = "[$]$2"; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring=ABCD
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test 17 != "$i" # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n "$lt_cv_sys_max_cmd_len"; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes = "$cross_compiling"; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes != "$enable_dlopen"; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen=load_add_on
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen=LoadLibrary
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+    # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+    lt_cv_dlopen=dyld
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen=shl_load],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen=dlopen],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test no = "$lt_cv_dlopen"; then
+    enable_dlopen=no
+  else
+    enable_dlopen=yes
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS=$LDFLAGS
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS=$LIBS
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test yes = "$lt_cv_dlopen_self"; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test no = "$hard_links"; then
+    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+  [Define to the sub-directory where libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x@S|@2 in
+    x)
+        ;;
+    *:)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+        ;;
+    x:*)
+        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+        ;;
+    *)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test yes = "$GCC"; then
+  case $host_os in
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary...
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo = "/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+    [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program that can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$1"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac])
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program that can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test no = "$withval" || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi])
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test yes != "$GCC"; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+  [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM=$NM
+else
+  lt_nm_to_check=${ac_tool_prefix}nm
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS=$lt_save_ifs
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break 2
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break 2
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS=$lt_save_ifs
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols -headers"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test yes != "$lt_cv_path_mainfest_tool"; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+  test DEF = "`$SED -n dnl
+    -e '\''s/^[[	 ]]*//'\'' dnl Strip leading whitespace
+    -e '\''/^\(;.*\)*$/d'\'' dnl      Delete empty lines and comments
+    -e '\''s/^\(EXPORTS\|LIBRARY\)\([[	 ]].*\)*$/DEF/p'\'' dnl
+    -e q dnl                          Only consider the first "real" line
+    $1`" dnl
+])# _LT_DLL_DEF_P
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM=-lm)
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test yes = "$GCC"; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test ia64 = "$host_cpu"; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t@_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS=conftstm.$ac_objext
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test yes = "$pipe_works"; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+    [Transform the output of nm into a list of symbols to manually relocate])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+    [The name lister interface])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test yes = "$GXX"; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test ia64 = "$host_cpu"; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64, which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test yes = "$GCC"; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS=$save_LDFLAGS])
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	else
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting $shlibpath_var if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC=$CC
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report what library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test no = "$can_build_shared" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test yes = "$enable_shared" && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test yes = "$enable_shared" || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC=$lt_save_CC
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test yes = "$GXX"; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test yes = "$GXX"; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test yes = "$with_gnu_ld"; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='$wl'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test ia64 = "$host_cpu"; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          _LT_TAGVAR(hardcode_direct, $1)=no
+          _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+          ;;
+        esac
+
+        if test yes = "$GXX"; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
+	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
+        else
+          # not using gcc
+          if test ia64 = "$host_cpu"; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
+	    else
+	      shared_flag='$wl-bM:SRE'
+	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          # The "-G" linker flag allows undefined symbols.
+          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+        else
+          if test ia64 = "$host_cpu"; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	    else
+	      # used by -dlpreopen to get the symbols
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=.dll
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      os2*)
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	shrext_cmds=.dll
+	_LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test yes = "$GXX"; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test no = "$with_gnu_ld"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd* | bitrig*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands '-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We CANNOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+              '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+              '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)=$GXX
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case @S|@2 in
+  .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $prev$p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)=$prev$p
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test no = "$pre_test_object_deps_done"; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)=$p
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)=$p
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test no = "$F77"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_F77"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)=$G77
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test no = "$FC"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_FC"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_FC"
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=$lt_simple_compile_test_code
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f "$lt_ac_sed" && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test 10 -lt "$lt_ac_count" && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test "$lt_ac_count" -gt "$lt_ac_max"; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine what file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/gawk-5.0.1/extension/m4/lock.m4 b/gawk-5.0.1/extension/m4/lock.m4
new file mode 100644
index 00000000000..9fd4aa78d20
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/lock.m4
@@ -0,0 +1,42 @@
+# lock.m4 serial 13 (gettext-0.18.2)
+dnl Copyright (C) 2005-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_LOCK],
+[
+  AC_REQUIRE([gl_THREADLIB])
+  if test "$gl_threads_api" = posix; then
+    # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the
+    # pthread_rwlock_* functions.
+    AC_CHECK_TYPE([pthread_rwlock_t],
+      [AC_DEFINE([HAVE_PTHREAD_RWLOCK], [1],
+         [Define if the POSIX multithreading library has read/write locks.])],
+      [],
+      [#include <pthread.h>])
+    # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
+    AC_COMPILE_IFELSE([
+      AC_LANG_PROGRAM(
+        [[#include <pthread.h>]],
+        [[
+#if __FreeBSD__ == 4
+error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
+#elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \
+       && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+error "No, in Mac OS X < 10.7 recursive mutexes actually don't work."
+#else
+int x = (int)PTHREAD_MUTEX_RECURSIVE;
+return !x;
+#endif
+        ]])],
+      [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], [1],
+         [Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])])
+  fi
+  gl_PREREQ_LOCK
+])
+
+# Prerequisites of lib/glthread/lock.c.
+AC_DEFUN([gl_PREREQ_LOCK], [:])
diff --git a/gawk-5.0.1/extension/m4/longlong.m4 b/gawk-5.0.1/extension/m4/longlong.m4
new file mode 100644
index 00000000000..d57bc700d4f
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/longlong.m4
@@ -0,0 +1,113 @@
+# longlong.m4 serial 17
+dnl Copyright (C) 1999-2007, 2009-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG_INT if 'long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'long long int' exists but is only 32 bits large
+# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
+# defined. In this case you can treat 'long long int' like 'long int'.
+
+AC_DEFUN([AC_TYPE_LONG_LONG_INT],
+[
+  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+  AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
+     [ac_cv_type_long_long_int=yes
+      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
+        if test $ac_cv_type_long_long_int = yes; then
+          dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
+          dnl If cross compiling, assume the bug is not important, since
+          dnl nobody cross compiles for this platform as far as we know.
+          AC_RUN_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[@%:@include <limits.h>
+                 @%:@ifndef LLONG_MAX
+                 @%:@ define HALF \
+                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+                 @%:@ define LLONG_MAX (HALF - 1 + HALF)
+                 @%:@endif]],
+               [[long long int n = 1;
+                 int i;
+                 for (i = 0; ; i++)
+                   {
+                     long long int m = n << i;
+                     if (m >> i != n)
+                       return 1;
+                     if (LLONG_MAX / 2 < m)
+                       break;
+                   }
+                 return 0;]])],
+            [],
+            [ac_cv_type_long_long_int=no],
+            [:])
+        fi
+      fi])
+  if test $ac_cv_type_long_long_int = yes; then
+    AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+      [Define to 1 if the system has the type 'long long int'.])
+  fi
+])
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+  AC_CACHE_CHECK([for unsigned long long int],
+    [ac_cv_type_unsigned_long_long_int],
+    [ac_cv_type_unsigned_long_long_int=yes
+     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+       AC_LINK_IFELSE(
+         [_AC_TYPE_LONG_LONG_SNIPPET],
+         [],
+         [ac_cv_type_unsigned_long_long_int=no])
+     fi])
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
+    AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+      [Define to 1 if the system has the type 'unsigned long long int'.])
+  fi
+])
+
+# Expands to a C program that can be used to test for simultaneous support
+# of 'long long' and 'unsigned long long'. We don't want to say that
+# 'long long' is available if 'unsigned long long' is not, or vice versa,
+# because too many programs rely on the symmetry between signed and unsigned
+# integer types (excluding 'bool').
+AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
+[
+  AC_LANG_PROGRAM(
+    [[/* For now, do not test the preprocessor; as of 2007 there are too many
+         implementations with broken preprocessors.  Perhaps this can
+         be revisited in 2012.  In the meantime, code should not expect
+         #if to work with literals wider than 32 bits.  */
+      /* Test literals.  */
+      long long int ll = 9223372036854775807ll;
+      long long int nll = -9223372036854775807LL;
+      unsigned long long int ull = 18446744073709551615ULL;
+      /* Test constant expressions.   */
+      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+                     ? 1 : -1)];
+      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+                     ? 1 : -1)];
+      int i = 63;]],
+    [[/* Test availability of runtime routines for shift and division.  */
+      long long int llmax = 9223372036854775807ll;
+      unsigned long long int ullmax = 18446744073709551615ull;
+      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+              | (llmax / ll) | (llmax % ll)
+              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+              | (ullmax / ull) | (ullmax % ull));]])
+])
diff --git a/gawk-5.0.1/extension/m4/ltoptions.m4 b/gawk-5.0.1/extension/m4/ltoptions.m4
new file mode 100644
index 00000000000..94b08297666
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/ltoptions.m4
@@ -0,0 +1,437 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 8 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option '$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+		   [_LT_ENABLE_FAST_INSTALL])
+  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+		   [_LT_WITH_AIX_SONAME([aix])])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+  AC_MSG_CHECKING([which variant of shared library versioning to provide])
+  AC_ARG_WITH([aix-soname],
+    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+      [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+    [case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname],
+    [AC_CACHE_VAL([lt_cv_with_aix_soname],
+      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+    with_aix_soname=$lt_cv_with_aix_soname])
+  AC_MSG_RESULT([$with_aix_soname])
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+    [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
+# LT_INIT options.
+# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for lt_pkg in $withval; do
+	IFS=$lt_save_ifs
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [pic_mode=m4_default([$1], [default])])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/gawk-5.0.1/extension/m4/ltsugar.m4 b/gawk-5.0.1/extension/m4/ltsugar.m4
new file mode 100644
index 00000000000..48bc9344a4d
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/ltsugar.m4
@@ -0,0 +1,124 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59, which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/gawk-5.0.1/extension/m4/ltversion.m4 b/gawk-5.0.1/extension/m4/ltversion.m4
new file mode 100644
index 00000000000..fa04b52a3bf
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 4179 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.6'
+macro_revision='2.4.6'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/gawk-5.0.1/extension/m4/lt~obsolete.m4 b/gawk-5.0.1/extension/m4/lt~obsolete.m4
new file mode 100644
index 00000000000..c6b26f88f6c
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/lt~obsolete.m4
@@ -0,0 +1,99 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/gawk-5.0.1/extension/m4/nls.m4 b/gawk-5.0.1/extension/m4/nls.m4
new file mode 100644
index 00000000000..93df8d3b3f0
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/nls.m4
@@ -0,0 +1,32 @@
+# nls.m4 serial 5 (gettext-0.18)
+dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.50])
+
+AC_DEFUN([AM_NLS],
+[
+  AC_MSG_CHECKING([whether NLS is requested])
+  dnl Default is enabled NLS
+  AC_ARG_ENABLE([nls],
+    [  --disable-nls           do not use Native Language Support],
+    USE_NLS=$enableval, USE_NLS=yes)
+  AC_MSG_RESULT([$USE_NLS])
+  AC_SUBST([USE_NLS])
+])
diff --git a/gawk-5.0.1/extension/m4/po.m4 b/gawk-5.0.1/extension/m4/po.m4
new file mode 100644
index 00000000000..d4bc2627936
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/po.m4
@@ -0,0 +1,453 @@
+# po.m4 serial 24 (gettext-0.19)
+dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.60])
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+  AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+  AC_REQUIRE([AC_PROG_SED])dnl
+  AC_REQUIRE([AM_NLS])dnl
+
+  dnl Release version of the gettext macros. This is used to ensure that
+  dnl the gettext macros and po/Makefile.in.in are in sync.
+  AC_SUBST([GETTEXT_MACRO_VERSION], [0.19])
+
+  dnl Perform the following tests also if --disable-nls has been given,
+  dnl because they are needed for "make dist" to work.
+
+  dnl Search for GNU msgfmt in the PATH.
+  dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+  dnl The second test excludes FreeBSD msgfmt.
+  AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+    [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
+
+  dnl Test whether it is GNU msgfmt >= 0.15.
+changequote(,)dnl
+  case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+    *) MSGFMT_015=$MSGFMT ;;
+  esac
+changequote([,])dnl
+  AC_SUBST([MSGFMT_015])
+changequote(,)dnl
+  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+    *) GMSGFMT_015=$GMSGFMT ;;
+  esac
+changequote([,])dnl
+  AC_SUBST([GMSGFMT_015])
+
+  dnl Search for GNU xgettext 0.12 or newer in the PATH.
+  dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+  dnl The second test excludes FreeBSD xgettext.
+  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+    [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  dnl Remove leftover from FreeBSD xgettext call.
+  rm -f messages.po
+
+  dnl Test whether it is GNU xgettext >= 0.15.
+changequote(,)dnl
+  case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+    *) XGETTEXT_015=$XGETTEXT ;;
+  esac
+changequote([,])dnl
+  AC_SUBST([XGETTEXT_015])
+
+  dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+  AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+    [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
+
+  dnl Installation directories.
+  dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we
+  dnl have to define it here, so that it can be used in po/Makefile.
+  test -n "$localedir" || localedir='${datadir}/locale'
+  AC_SUBST([localedir])
+
+  dnl Support for AM_XGETTEXT_OPTION.
+  test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+  AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
+
+  AC_CONFIG_COMMANDS([po-directories], [[
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        # Treat a directory as a PO directory if and only if it has a
+        # POTFILES.in file. This allows packages to have multiple PO
+        # directories under different names or in different locations.
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          gt_tab=`printf '\t'`
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          # Compute POFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+          # Compute UPDATEPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+          # Compute DUMMYPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+          # Compute GMOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          GMOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done]],
+   [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+    # from automake < 1.5.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+   ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+  # When this code is run, in config.status, two variables have already been
+  # set:
+  # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+  # - LINGUAS is the value of the environment variable LINGUAS at configure
+  #   time.
+
+changequote(,)dnl
+  # Adjust a relative srcdir.
+  ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+  ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+  ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+  # In autoconf-2.13 it is called $ac_given_srcdir.
+  # In autoconf-2.50 it is called $srcdir.
+  test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+  case "$ac_given_srcdir" in
+    .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+    /*) top_srcdir="$ac_given_srcdir" ;;
+    *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  # Find a way to echo strings without interpreting backslash.
+  if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+    gt_echo='echo'
+  else
+    if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+      gt_echo='printf %s\n'
+    else
+      echo_func () {
+        cat <<EOT
+$*
+EOT
+      }
+      gt_echo='echo_func'
+    fi
+  fi
+
+  # A sed script that extracts the value of VARIABLE from a Makefile.
+  tab=`printf '\t'`
+  sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
+  # Seen the first line of the variable definition.
+  s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
+  ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+  # Set POTFILES to the value of the Makefile variable POTFILES.
+  sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
+  POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+  # Compute POTFILES_DEPS as
+  #   $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+  POTFILES_DEPS=
+  for file in $POTFILES; do
+    POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+  done
+  POMAKEFILEDEPS=""
+
+  if test -n "$OBSOLETE_ALL_LINGUAS"; then
+    test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+  fi
+  if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+    # The LINGUAS file contains the set of available languages.
+    ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+    POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+  else
+    # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+    sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
+    ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+  fi
+  # Hide the ALL_LINGUAS assignment from automake < 1.5.
+  eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+  # Compute POFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+  # Compute UPDATEPOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+  # Compute DUMMYPOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+  # Compute GMOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+  # Compute PROPERTIESFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+  # Compute CLASSFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+  # Compute QMFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+  # Compute MSGFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+  # Compute RESOURCESDLLFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+  case "$ac_given_srcdir" in
+    .) srcdirpre= ;;
+    *) srcdirpre='$(srcdir)/' ;;
+  esac
+  POFILES=
+  UPDATEPOFILES=
+  DUMMYPOFILES=
+  GMOFILES=
+  PROPERTIESFILES=
+  CLASSFILES=
+  QMFILES=
+  MSGFILES=
+  RESOURCESDLLFILES=
+  for lang in $ALL_LINGUAS; do
+    POFILES="$POFILES $srcdirpre$lang.po"
+    UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+    DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+    GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+    PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+    CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+    QMFILES="$QMFILES $srcdirpre$lang.qm"
+    frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+    MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+    frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+    RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+  done
+  # CATALOGS depends on both $ac_dir and the user's LINGUAS
+  # environment variable.
+  INST_LINGUAS=
+  if test -n "$ALL_LINGUAS"; then
+    for presentlang in $ALL_LINGUAS; do
+      useit=no
+      if test "%UNSET%" != "$LINGUAS"; then
+        desiredlanguages="$LINGUAS"
+      else
+        desiredlanguages="$ALL_LINGUAS"
+      fi
+      for desiredlang in $desiredlanguages; do
+        # Use the presentlang catalog if desiredlang is
+        #   a. equal to presentlang, or
+        #   b. a variant of presentlang (because in this case,
+        #      presentlang can be used as a fallback for messages
+        #      which are not translated in the desiredlang catalog).
+        case "$desiredlang" in
+          "$presentlang"*) useit=yes;;
+        esac
+      done
+      if test $useit = yes; then
+        INST_LINGUAS="$INST_LINGUAS $presentlang"
+      fi
+    done
+  fi
+  CATALOGS=
+  JAVACATALOGS=
+  QTCATALOGS=
+  TCLCATALOGS=
+  CSHARPCATALOGS=
+  if test -n "$INST_LINGUAS"; then
+    for lang in $INST_LINGUAS; do
+      CATALOGS="$CATALOGS $lang.gmo"
+      JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+      QTCATALOGS="$QTCATALOGS $lang.qm"
+      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+      TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+      CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+    done
+  fi
+
+  sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+  tab=`printf '\t'`
+  if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+    # Add dependencies that cannot be formulated as a simple suffix rule.
+    for lang in $ALL_LINGUAS; do
+      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+      cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+${tab}@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+${tab}\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+    done
+  fi
+  if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
+    # Add dependencies that cannot be formulated as a simple suffix rule.
+    for lang in $ALL_LINGUAS; do
+      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+      cat >> "$ac_file.tmp" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+${tab}@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+${tab}\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+    done
+  fi
+  if test -n "$POMAKEFILEDEPS"; then
+    cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+  fi
+  mv "$ac_file.tmp" "$ac_file"
+])
+
+dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
+AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
+[
+  XGETTEXT_EXTRA_OPTIONS=
+])
+
+dnl Registers an option to be passed to xgettext in the po subdirectory.
+AC_DEFUN([AM_XGETTEXT_OPTION],
+[
+  AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
+  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
+])
diff --git a/gawk-5.0.1/extension/m4/printf-posix.m4 b/gawk-5.0.1/extension/m4/printf-posix.m4
new file mode 100644
index 00000000000..0f85ad61af2
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/printf-posix.m4
@@ -0,0 +1,48 @@
+# printf-posix.m4 serial 6 (gettext-0.18.2)
+dnl Copyright (C) 2003, 2007, 2009-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the printf() function supports POSIX/XSI format strings with
+dnl positions.
+
+AC_DEFUN([gt_PRINTF_POSIX],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings],
+    gt_cv_func_printf_posix,
+    [
+      AC_RUN_IFELSE(
+        [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+   dollar expansion (possibly an autoconf bug).  */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+  sprintf (buf, format, 33, 55);
+  return (strcmp (buf, "55 33") != 0);
+}]])],
+        [gt_cv_func_printf_posix=yes],
+        [gt_cv_func_printf_posix=no],
+        [
+          AC_EGREP_CPP([notposix], [
+#if defined __NetBSD__ || defined __BEOS__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+  notposix
+#endif
+            ],
+            [gt_cv_func_printf_posix="guessing no"],
+            [gt_cv_func_printf_posix="guessing yes"])
+        ])
+    ])
+  case $gt_cv_func_printf_posix in
+    *yes)
+      AC_DEFINE([HAVE_POSIX_PRINTF], [1],
+        [Define if your printf() function supports format strings with positions.])
+      ;;
+  esac
+])
diff --git a/gawk-5.0.1/extension/m4/progtest.m4 b/gawk-5.0.1/extension/m4/progtest.m4
new file mode 100644
index 00000000000..0921e1e5423
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/progtest.m4
@@ -0,0 +1,91 @@
+# progtest.m4 serial 7 (gettext-0.18.2)
+dnl Copyright (C) 1996-2003, 2005, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+AC_PREREQ([2.50])
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL([ac_cv_path_$1],
+[case "[$]$1" in
+  [[\\/]]* | ?:[[\\/]]*)
+    ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in ifelse([$5], , $PATH, [$5]); do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
+          if [$3]; then
+            ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+    ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+  AC_MSG_RESULT([$][$1])
+else
+  AC_MSG_RESULT([no])
+fi
+AC_SUBST([$1])dnl
+])
diff --git a/gawk-5.0.1/extension/m4/size_max.m4 b/gawk-5.0.1/extension/m4/size_max.m4
new file mode 100644
index 00000000000..186e3fddabf
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/size_max.m4
@@ -0,0 +1,79 @@
+# size_max.m4 serial 10
+dnl Copyright (C) 2003, 2005-2006, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+  AC_CHECK_HEADERS([stdint.h])
+  dnl First test whether the system already has SIZE_MAX.
+  AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [
+    gl_cv_size_max=
+    AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], [gl_cv_size_max=yes])
+    if test -z "$gl_cv_size_max"; then
+      dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+      dnl than the type 'unsigned long'. Try hard to find a definition that can
+      dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
+      AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1],
+        [#include <stddef.h>
+#include <limits.h>], [size_t_bits_minus_1=])
+      AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)],
+        [#include <stddef.h>], [fits_in_uint=])
+      if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+        if test $fits_in_uint = 1; then
+          dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+          dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+          AC_COMPILE_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[#include <stddef.h>
+                 extern size_t foo;
+                 extern unsigned long foo;
+               ]],
+               [[]])],
+            [fits_in_uint=0])
+        fi
+        dnl We cannot use 'expr' to simplify this expression, because 'expr'
+        dnl works only with 'long' integers in the host environment, while we
+        dnl might be cross-compiling from a 32-bit platform to a 64-bit platform.
+        if test $fits_in_uint = 1; then
+          gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+        else
+          gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+        fi
+      else
+        dnl Shouldn't happen, but who knows...
+        gl_cv_size_max='((size_t)~(size_t)0)'
+      fi
+    fi
+  ])
+  if test "$gl_cv_size_max" != yes; then
+    AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max],
+      [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+  fi
+  dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after
+  dnl <stdint.h>. Remember that the #undef in AH_VERBATIM gets replaced with
+  dnl #define by AC_DEFINE_UNQUOTED.
+  AH_VERBATIM([SIZE_MAX],
+[/* Define as the maximum value of type 'size_t', if the system doesn't define
+   it. */
+#ifndef SIZE_MAX
+# undef SIZE_MAX
+#endif])
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+  AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
diff --git a/gawk-5.0.1/extension/m4/stdint_h.m4 b/gawk-5.0.1/extension/m4/stdint_h.m4
new file mode 100644
index 00000000000..5097c0b0dcb
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/stdint_h.m4
@@ -0,0 +1,27 @@
+# stdint_h.m4 serial 9
+dnl Copyright (C) 1997-2004, 2006, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_STDINT_H],
+[
+  AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <sys/types.h>
+            #include <stdint.h>]],
+          [[uintmax_t i = (uintmax_t) -1; return !i;]])],
+       [gl_cv_header_stdint_h=yes],
+       [gl_cv_header_stdint_h=no])])
+  if test $gl_cv_header_stdint_h = yes; then
+    AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1],
+      [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
diff --git a/gawk-5.0.1/extension/m4/threadlib.m4 b/gawk-5.0.1/extension/m4/threadlib.m4
new file mode 100644
index 00000000000..8615ac94e1d
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/threadlib.m4
@@ -0,0 +1,389 @@
+# threadlib.m4 serial 11 (gettext-0.18.2)
+dnl Copyright (C) 2005-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl gl_THREADLIB
+dnl ------------
+dnl Tests for a multithreading library to be used.
+dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO
+dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the
+dnl default is 'no', otherwise it is system dependent. In both cases, the user
+dnl can change the choice through the options --enable-threads=choice or
+dnl --disable-threads.
+dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS,
+dnl USE_PTH_THREADS, USE_WINDOWS_THREADS
+dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
+dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
+dnl libtool).
+dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
+dnl programs that really need multithread functionality. The difference
+dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
+dnl symbols, typically LIBTHREAD is empty whereas LIBMULTITHREAD is not.
+dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
+dnl multithread-safe programs.
+
+AC_DEFUN([gl_THREADLIB_EARLY],
+[
+  AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
+])
+
+dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once.
+
+AC_DEFUN([gl_THREADLIB_EARLY_BODY],
+[
+  dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
+  dnl influences the result of the autoconf tests that test for *_unlocked
+  dnl declarations, on AIX 5 at least. Therefore it must come early.
+  AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
+  AC_BEFORE([$0], [gl_ARGP])dnl
+
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
+  dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
+  dnl AC_GNU_SOURCE.
+  m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
+    [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
+    [AC_REQUIRE([AC_GNU_SOURCE])])
+  dnl Check for multithreading.
+  m4_ifdef([gl_THREADLIB_DEFAULT_NO],
+    [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])],
+    [m4_divert_text([DEFAULTS], [gl_use_threads_default=])])
+  AC_ARG_ENABLE([threads],
+AC_HELP_STRING([--enable-threads={posix|solaris|pth|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [
+AC_HELP_STRING([--disable-threads], [build without multithread safety])]),
+    [gl_use_threads=$enableval],
+    [if test -n "$gl_use_threads_default"; then
+       gl_use_threads="$gl_use_threads_default"
+     else
+changequote(,)dnl
+       case "$host_os" in
+         dnl Disable multithreading by default on OSF/1, because it interferes
+         dnl with fork()/exec(): When msgexec is linked with -lpthread, its
+         dnl child process gets an endless segmentation fault inside execvp().
+         dnl Disable multithreading by default on Cygwin 1.5.x, because it has
+         dnl bugs that lead to endless loops or crashes. See
+         dnl <http://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
+         osf*) gl_use_threads=no ;;
+         cygwin*)
+               case `uname -r` in
+                 1.[0-5].*) gl_use_threads=no ;;
+                 *)         gl_use_threads=yes ;;
+               esac
+               ;;
+         *)    gl_use_threads=yes ;;
+       esac
+changequote([,])dnl
+     fi
+    ])
+  if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+    # For using <pthread.h>:
+    case "$host_os" in
+      osf*)
+        # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
+        # groks <pthread.h>. cc also understands the flag -pthread, but
+        # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
+        # 2. putting a flag into CPPFLAGS that has an effect on the linker
+        # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
+        # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
+        CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+        ;;
+    esac
+    # Some systems optimize for single-threaded programs by default, and
+    # need special flags to disable these optimizations. For example, the
+    # definition of 'errno' in <errno.h>.
+    case "$host_os" in
+      aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
+      solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
+    esac
+  fi
+])
+
+dnl The guts of gl_THREADLIB. Needs to be expanded only once.
+
+AC_DEFUN([gl_THREADLIB_BODY],
+[
+  AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
+  gl_threads_api=none
+  LIBTHREAD=
+  LTLIBTHREAD=
+  LIBMULTITHREAD=
+  LTLIBMULTITHREAD=
+  if test "$gl_use_threads" != no; then
+    dnl Check whether the compiler and linker support weak declarations.
+    AC_CACHE_CHECK([whether imported symbols can be declared weak],
+      [gl_cv_have_weak],
+      [gl_cv_have_weak=no
+       dnl First, test whether the compiler accepts it syntactically.
+       AC_LINK_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[extern void xyzzy ();
+#pragma weak xyzzy]],
+            [[xyzzy();]])],
+         [gl_cv_have_weak=maybe])
+       if test $gl_cv_have_weak = maybe; then
+         dnl Second, test whether it actually works. On Cygwin 1.7.2, with
+         dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
+         AC_RUN_IFELSE(
+           [AC_LANG_SOURCE([[
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+  return (fputs == NULL);
+}]])],
+           [gl_cv_have_weak=yes],
+           [gl_cv_have_weak=no],
+           [dnl When cross-compiling, assume that only ELF platforms support
+            dnl weak symbols.
+            AC_EGREP_CPP([Extensible Linking Format],
+              [#ifdef __ELF__
+               Extensible Linking Format
+               #endif
+              ],
+              [gl_cv_have_weak="guessing yes"],
+              [gl_cv_have_weak="guessing no"])
+           ])
+       fi
+      ])
+    if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+      # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+      # it groks <pthread.h>. It's added above, in gl_THREADLIB_EARLY_BODY.
+      AC_CHECK_HEADER([pthread.h],
+        [gl_have_pthread_h=yes], [gl_have_pthread_h=no])
+      if test "$gl_have_pthread_h" = yes; then
+        # Other possible tests:
+        #   -lpthreads (FSU threads, PCthreads)
+        #   -lgthreads
+        gl_have_pthread=
+        # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+        # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+        # the second one only in libpthread, and lock.c needs it.
+        #
+        # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+        # needs -pthread for some reason.  See:
+        # http://lists.gnu.org/archive/html/bug-gnulib/2014-09/msg00023.html
+        save_LIBS=$LIBS
+        for gl_pthread in '' '-pthread'; do
+          LIBS="$LIBS $gl_pthread"
+          AC_LINK_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[#include <pthread.h>
+                 pthread_mutex_t m;
+                 pthread_mutexattr_t ma;
+               ]],
+               [[pthread_mutex_lock (&m);
+                 pthread_mutexattr_init (&ma);]])],
+            [gl_have_pthread=yes
+             LIBTHREAD=$gl_pthread LTLIBTHREAD=$gl_pthread
+             LIBMULTITHREAD=$gl_pthread LTLIBMULTITHREAD=$gl_pthread])
+          LIBS=$save_LIBS
+          test -n "$gl_have_pthread" && break
+        done
+
+        # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+        # since it is defined as a macro on OSF/1.)
+        if test -n "$gl_have_pthread" && test -z "$LIBTHREAD"; then
+          # The program links fine without libpthread. But it may actually
+          # need to link with libpthread in order to create multiple threads.
+          AC_CHECK_LIB([pthread], [pthread_kill],
+            [LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread
+             # On Solaris and HP-UX, most pthread functions exist also in libc.
+             # Therefore pthread_in_use() needs to actually try to create a
+             # thread: pthread_create from libc will fail, whereas
+             # pthread_create will actually create a thread.
+             case "$host_os" in
+               solaris* | hpux*)
+                 AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
+                   [Define if the pthread_in_use() detection is hard.])
+             esac
+            ])
+        elif test -z "$gl_have_pthread"; then
+          # Some library is needed. Try libpthread and libc_r.
+          AC_CHECK_LIB([pthread], [pthread_kill],
+            [gl_have_pthread=yes
+             LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread
+             LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread])
+          if test -z "$gl_have_pthread"; then
+            # For FreeBSD 4.
+            AC_CHECK_LIB([c_r], [pthread_kill],
+              [gl_have_pthread=yes
+               LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r
+               LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r])
+          fi
+        fi
+        if test -n "$gl_have_pthread"; then
+          gl_threads_api=posix
+          AC_DEFINE([USE_POSIX_THREADS], [1],
+            [Define if the POSIX multithreading library can be used.])
+          if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+            if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+              AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
+                [Define if references to the POSIX multithreading library should be made weak.])
+              LIBTHREAD=
+              LTLIBTHREAD=
+            fi
+          fi
+        fi
+      fi
+    fi
+    if test -z "$gl_have_pthread"; then
+      if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then
+        gl_have_solaristhread=
+        gl_save_LIBS="$LIBS"
+        LIBS="$LIBS -lthread"
+        AC_LINK_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[
+#include <thread.h>
+#include <synch.h>
+             ]],
+             [[thr_self();]])],
+          [gl_have_solaristhread=yes])
+        LIBS="$gl_save_LIBS"
+        if test -n "$gl_have_solaristhread"; then
+          gl_threads_api=solaris
+          LIBTHREAD=-lthread
+          LTLIBTHREAD=-lthread
+          LIBMULTITHREAD="$LIBTHREAD"
+          LTLIBMULTITHREAD="$LTLIBTHREAD"
+          AC_DEFINE([USE_SOLARIS_THREADS], [1],
+            [Define if the old Solaris multithreading library can be used.])
+          if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+            AC_DEFINE([USE_SOLARIS_THREADS_WEAK], [1],
+              [Define if references to the old Solaris multithreading library should be made weak.])
+            LIBTHREAD=
+            LTLIBTHREAD=
+          fi
+        fi
+      fi
+    fi
+    if test "$gl_use_threads" = pth; then
+      gl_save_CPPFLAGS="$CPPFLAGS"
+      AC_LIB_LINKFLAGS([pth])
+      gl_have_pth=
+      gl_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBPTH"
+      AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM([[#include <pth.h>]], [[pth_self();]])],
+        [gl_have_pth=yes])
+      LIBS="$gl_save_LIBS"
+      if test -n "$gl_have_pth"; then
+        gl_threads_api=pth
+        LIBTHREAD="$LIBPTH"
+        LTLIBTHREAD="$LTLIBPTH"
+        LIBMULTITHREAD="$LIBTHREAD"
+        LTLIBMULTITHREAD="$LTLIBTHREAD"
+        AC_DEFINE([USE_PTH_THREADS], [1],
+          [Define if the GNU Pth multithreading library can be used.])
+        if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+          if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+            AC_DEFINE([USE_PTH_THREADS_WEAK], [1],
+              [Define if references to the GNU Pth multithreading library should be made weak.])
+            LIBTHREAD=
+            LTLIBTHREAD=
+          fi
+        fi
+      else
+        CPPFLAGS="$gl_save_CPPFLAGS"
+      fi
+    fi
+    if test -z "$gl_have_pthread"; then
+      case "$gl_use_threads" in
+        yes | windows | win32) # The 'win32' is for backward compatibility.
+          if { case "$host_os" in
+                 mingw*) true;;
+                 *) false;;
+               esac
+             }; then
+            gl_threads_api=windows
+            AC_DEFINE([USE_WINDOWS_THREADS], [1],
+              [Define if the native Windows multithreading API can be used.])
+          fi
+          ;;
+      esac
+    fi
+  fi
+  AC_MSG_CHECKING([for multithread API to use])
+  AC_MSG_RESULT([$gl_threads_api])
+  AC_SUBST([LIBTHREAD])
+  AC_SUBST([LTLIBTHREAD])
+  AC_SUBST([LIBMULTITHREAD])
+  AC_SUBST([LTLIBMULTITHREAD])
+])
+
+AC_DEFUN([gl_THREADLIB],
+[
+  AC_REQUIRE([gl_THREADLIB_EARLY])
+  AC_REQUIRE([gl_THREADLIB_BODY])
+])
+
+
+dnl gl_DISABLE_THREADS
+dnl ------------------
+dnl Sets the gl_THREADLIB default so that threads are not used by default.
+dnl The user can still override it at installation time, by using the
+dnl configure option '--enable-threads'.
+
+AC_DEFUN([gl_DISABLE_THREADS], [
+  m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no])
+])
+
+
+dnl Survey of platforms:
+dnl
+dnl Platform           Available  Compiler    Supports   test-lock
+dnl                    flavours   option      weak       result
+dnl ---------------    ---------  ---------   --------   ---------
+dnl Linux 2.4/glibc    posix      -lpthread       Y      OK
+dnl
+dnl GNU Hurd/glibc     posix
+dnl
+dnl Ubuntu 14.04       posix      -pthread        Y      OK
+dnl
+dnl FreeBSD 5.3        posix      -lc_r           Y
+dnl                    posix      -lkse ?         Y
+dnl                    posix      -lpthread ?     Y
+dnl                    posix      -lthr           Y
+dnl
+dnl FreeBSD 5.2        posix      -lc_r           Y
+dnl                    posix      -lkse           Y
+dnl                    posix      -lthr           Y
+dnl
+dnl FreeBSD 4.0,4.10   posix      -lc_r           Y      OK
+dnl
+dnl NetBSD 1.6         --
+dnl
+dnl OpenBSD 3.4        posix      -lpthread       Y      OK
+dnl
+dnl Mac OS X 10.[123]  posix      -lpthread       Y      OK
+dnl
+dnl Solaris 7,8,9      posix      -lpthread       Y      Sol 7,8: 0.0; Sol 9: OK
+dnl                    solaris    -lthread        Y      Sol 7,8: 0.0; Sol 9: OK
+dnl
+dnl HP-UX 11           posix      -lpthread       N (cc) OK
+dnl                                               Y (gcc)
+dnl
+dnl IRIX 6.5           posix      -lpthread       Y      0.5
+dnl
+dnl AIX 4.3,5.1        posix      -lpthread       N      AIX 4: 0.5; AIX 5: OK
+dnl
+dnl OSF/1 4.0,5.1      posix      -pthread (cc)   N      OK
+dnl                               -lpthread (gcc) Y
+dnl
+dnl Cygwin             posix      -lpthread       Y      OK
+dnl
+dnl Any of the above   pth        -lpth                  0.0
+dnl
+dnl Mingw              windows                    N      OK
+dnl
+dnl BeOS 5             --
+dnl
+dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
+dnl turned off:
+dnl   OK if all three tests terminate OK,
+dnl   0.5 if the first test terminates OK but the second one loops endlessly,
+dnl   0.0 if the first test already loops endlessly.
diff --git a/gawk-5.0.1/extension/m4/uintmax_t.m4 b/gawk-5.0.1/extension/m4/uintmax_t.m4
new file mode 100644
index 00000000000..8a92f58e101
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/uintmax_t.m4
@@ -0,0 +1,30 @@
+# uintmax_t.m4 serial 12
+dnl Copyright (C) 1997-2004, 2007-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_PREREQ([2.13])
+
+# Define uintmax_t to 'unsigned long' or 'unsigned long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([gl_AC_TYPE_UINTMAX_T],
+[
+  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+  if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+    AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+    test $ac_cv_type_unsigned_long_long_int = yes \
+      && ac_type='unsigned long long' \
+      || ac_type='unsigned long'
+    AC_DEFINE_UNQUOTED([uintmax_t], [$ac_type],
+      [Define to unsigned long or unsigned long long
+       if <stdint.h> and <inttypes.h> don't define.])
+  else
+    AC_DEFINE([HAVE_UINTMAX_T], [1],
+      [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+  fi
+])
diff --git a/gawk-5.0.1/extension/m4/visibility.m4 b/gawk-5.0.1/extension/m4/visibility.m4
new file mode 100644
index 00000000000..6fff7459ccb
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/visibility.m4
@@ -0,0 +1,77 @@
+# visibility.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2005, 2008, 2010-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl Mac OS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  CFLAG_VISIBILITY=
+  HAVE_VISIBILITY=0
+  if test -n "$GCC"; then
+    dnl First, check whether -Werror can be added to the command line, or
+    dnl whether it leads to an error because of some other option that the
+    dnl user has put into $CC $CFLAGS $CPPFLAGS.
+    AC_MSG_CHECKING([whether the -Werror option is usable])
+    AC_CACHE_VAL([gl_cv_cc_vis_werror], [
+      gl_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS -Werror"
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[]], [[]])],
+        [gl_cv_cc_vis_werror=yes],
+        [gl_cv_cc_vis_werror=no])
+      CFLAGS="$gl_save_CFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cc_vis_werror])
+    dnl Now check whether visibility declarations are supported.
+    AC_MSG_CHECKING([for simple visibility declarations])
+    AC_CACHE_VAL([gl_cv_cc_visibility], [
+      gl_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS -fvisibility=hidden"
+      dnl We use the option -Werror and a function dummyfunc, because on some
+      dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
+      dnl "visibility attribute not supported in this configuration; ignored"
+      dnl at the first function definition in every compilation unit, and we
+      dnl don't want to use the option in this case.
+      if test $gl_cv_cc_vis_werror = yes; then
+        CFLAGS="$CFLAGS -Werror"
+      fi
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+             extern __attribute__((__visibility__("default"))) int exportedvar;
+             extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+             extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+             void dummyfunc (void) {}
+           ]],
+           [[]])],
+        [gl_cv_cc_visibility=yes],
+        [gl_cv_cc_visibility=no])
+      CFLAGS="$gl_save_CFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cc_visibility])
+    if test $gl_cv_cc_visibility = yes; then
+      CFLAG_VISIBILITY="-fvisibility=hidden"
+      HAVE_VISIBILITY=1
+    fi
+  fi
+  AC_SUBST([CFLAG_VISIBILITY])
+  AC_SUBST([HAVE_VISIBILITY])
+  AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+    [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
diff --git a/gawk-5.0.1/extension/m4/wchar_t.m4 b/gawk-5.0.1/extension/m4/wchar_t.m4
new file mode 100644
index 00000000000..dc964e67e26
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/wchar_t.m4
@@ -0,0 +1,24 @@
+# wchar_t.m4 serial 4 (gettext-0.18.2)
+dnl Copyright (C) 2002-2003, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+  AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <stddef.h>
+            wchar_t foo = (wchar_t)'\0';]],
+          [[]])],
+       [gt_cv_c_wchar_t=yes],
+       [gt_cv_c_wchar_t=no])])
+  if test $gt_cv_c_wchar_t = yes; then
+    AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.])
+  fi
+])
diff --git a/gawk-5.0.1/extension/m4/wint_t.m4 b/gawk-5.0.1/extension/m4/wint_t.m4
new file mode 100644
index 00000000000..ca3fd449a14
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/wint_t.m4
@@ -0,0 +1,32 @@
+# wint_t.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2003, 2007-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+  AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+   before <wchar.h>.  */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+            wint_t foo = (wchar_t)'\0';]],
+          [[]])],
+       [gt_cv_c_wint_t=yes],
+       [gt_cv_c_wint_t=no])])
+  if test $gt_cv_c_wint_t = yes; then
+    AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.])
+  fi
+])
diff --git a/gawk-5.0.1/extension/m4/xsize.m4 b/gawk-5.0.1/extension/m4/xsize.m4
new file mode 100644
index 00000000000..98faf7de0b2
--- /dev/null
+++ b/gawk-5.0.1/extension/m4/xsize.m4
@@ -0,0 +1,12 @@
+# xsize.m4 serial 5
+dnl Copyright (C) 2003-2004, 2008-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XSIZE],
+[
+  dnl Prerequisites of lib/xsize.h.
+  AC_REQUIRE([gl_SIZE_MAX])
+  AC_CHECK_HEADERS([stdint.h])
+])
diff --git a/gawk-5.0.1/extension/ordchr.3am b/gawk-5.0.1/extension/ordchr.3am
new file mode 100644
index 00000000000..8831ab57bfa
--- /dev/null
+++ b/gawk-5.0.1/extension/ordchr.3am
@@ -0,0 +1,79 @@
+.TH ORDCHR 3am "Feb 02 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+ordchr \- convert characters to strings and vice versa
+.SH SYNOPSIS
+.ft CW
+@load "ordchr"
+.sp
+number = ord("A")
+.br
+string = chr(65)
+.ft R
+.SH DESCRIPTION
+The
+.I ordchr
+extension adds two functions named
+.BR ord() .
+and
+.BR chr() ,
+as follows.
+.TP
+.B ord()
+This function takes a string argument, and returns the
+numeric value of the first character in the string.
+.TP
+.B chr()
+This function takes a numeric argument and returns a string
+whose first character is that represented by the number.
+.PP
+These functions are inspired by the Pascal language functions
+of the same name.
+.\" .SH NOTES
+.\" .SH BUGS
+.SH EXAMPLE
+.ft CW
+.nf
+@load "ordchr"
+\&...
+printf("The numeric value of 'A' is %d\en", ord("A"))
+printf("The string value of 65 is %s\en", chr(65))
+.fi
+.ft R
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fnmatch (3am),
+.IR fork (3am),
+.IR inplace (3am),
+.IR readdir (3am),
+.IR readfile (3am),
+.IR revoutput (3am),
+.IR rwarray (3am),
+.IR time (3am).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/ordchr.c b/gawk-5.0.1/extension/ordchr.c
new file mode 100644
index 00000000000..d95431262ba
--- /dev/null
+++ b/gawk-5.0.1/extension/ordchr.c
@@ -0,0 +1,112 @@
+/*
+ * ordchr.c - Builtin functions that provide ord() and chr() functions.
+ *
+ * Arnold Robbins
+ * arnold@skeeve.com
+ * 8/2001
+ * Revised 6/2004
+ * Revised 5/2012
+ */
+
+/*
+ * Copyright (C) 2001, 2004, 2011, 2012, 2013, 2018
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "ordchr extension: version 1.0";
+static awk_bool_t (*init_func)(void) = NULL;
+
+int plugin_is_GPL_compatible;
+
+/*  do_ord --- return numeric value of first char of string */
+
+static awk_value_t *
+do_ord(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t str;
+	double ret = -1;
+
+	assert(result != NULL);
+
+	if (get_argument(0, AWK_STRING, & str)) {
+		ret = str.str_value.str[0];
+	} else if (do_lint)
+		lintwarn(ext_id, _("ord: called with inappropriate argument(s)"));
+
+	/* Set the return value */
+	return make_number(ret, result);
+}
+
+/*  do_chr --- turn numeric value into a string */
+
+static awk_value_t *
+do_chr(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t num;
+	unsigned int ret = 0;
+	double val = 0.0;
+	char str[2];
+
+	str[0] = str[1] = '\0';
+
+	assert(result != NULL);
+
+	if (get_argument(0, AWK_NUMBER, & num)) {
+		val = num.num_value;
+		ret = val;	/* convert to int */
+		ret &= 0xff;
+		str[0] = ret;
+		str[1] = '\0';
+	} else if (do_lint)
+		lintwarn(ext_id, _("chr: called with inappropriate argument(s)"));
+
+	/* Set the return value */
+	return make_const_string(str, 1, result);
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "ord", do_ord, 1, 1, awk_false, NULL },
+	{ "chr", do_chr, 1, 1, awk_false, NULL },
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, ord_chr, "")
diff --git a/gawk-5.0.1/extension/po/ChangeLog b/gawk-5.0.1/extension/po/ChangeLog
new file mode 100644
index 00000000000..1ccc698dd17
--- /dev/null
+++ b/gawk-5.0.1/extension/po/ChangeLog
@@ -0,0 +1,29 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.0: Release tar ball made.
+
+2018-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* .gitignore: New file.
+
+2018-03-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawk-extensions.pot, stamp-po: New files that keep 'make check'
+	from making lots of noise.
+
+2018-03-07  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: New file, from gettext-0.19.7.
+	* Rules-quot: New file, from gettext-0.19.7.
+	* boldquot.sed: New file, from gettext-0.19.7.
+	* en@boldquot.header: New file, from gettext-0.19.7.
+	* en@quot.header: New file, from gettext-0.19.7.
+	* insert-header.sin: New file, from gettext-0.19.7.
+	* quot.sed: New file, from gettext-0.19.7.
+	* remove-potcdate.sin: New file, from gettext-0.19.7.
+	* POTFILES.in: New file.
+
diff --git a/gawk-5.0.1/extension/po/Makefile.in.in b/gawk-5.0.1/extension/po/Makefile.in.in
new file mode 100644
index 00000000000..8f34f00754b
--- /dev/null
+++ b/gawk-5.0.1/extension/po/Makefile.in.in
@@ -0,0 +1,483 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.  This file is offered as-is,
+# without any warranty.
+#
+# Origin: gettext-0.19.7
+GETTEXT_MACRO_VERSION = 0.19
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+
+SED = @SED@
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = @localedir@
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+# We use $(mkdir_p).
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+# @install_sh@ does not start with $(SHELL), so we add it.
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+# versions, $(mkinstalldirs) and $(install_sh) are unused.
+mkinstalldirs = $(SHELL) @install_sh@ -d
+install_sh = $(SHELL) @install_sh@
+MKDIR_P = @MKDIR_P@
+mkdir_p = @mkdir_p@
+
+# When building gettext-tools, we prefer to use the built programs
+# rather than installed programs.  However, we can't do that when we
+# are cross compiling.
+CROSS_COMPILING = @CROSS_COMPILING@
+
+GMSGFMT_ = @GMSGFMT@
+GMSGFMT_no = @GMSGFMT@
+GMSGFMT_yes = @GMSGFMT_015@
+GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
+MSGFMT_ = @MSGFMT@
+MSGFMT_no = @MSGFMT@
+MSGFMT_yes = @MSGFMT_015@
+MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
+XGETTEXT_ = @XGETTEXT@
+XGETTEXT_no = @XGETTEXT@
+XGETTEXT_yes = @XGETTEXT_015@
+XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+POFILESDEPS_ = $(srcdir)/$(DOMAIN).pot
+POFILESDEPS_yes = $(POFILESDEPS_)
+POFILESDEPS_no =
+POFILESDEPS = $(POFILESDEPS_$(PO_DEPENDS_ON_POT))
+
+DISTFILESDEPS_ = update-po
+DISTFILESDEPS_yes = $(DISTFILESDEPS_)
+DISTFILESDEPS_no =
+DISTFILESDEPS = $(DISTFILESDEPS_$(DIST_DEPENDS_ON_UPDATE_PO))
+
+# Makevars gets inserted here. (Don't remove this line!)
+
+.SUFFIXES:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+	@echo "$(MSGFMT) -c -o $@ $<"; \
+	$(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+	@lang=`echo $* | sed -e 's,.*/,,'`; \
+	test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+	echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \
+	cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+	sed -e '/^#/d' $< > t-$@
+	mv t-$@ $@
+
+
+all: all-@USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# Ensure that the gettext macros and this Makefile.in.in are in sync.
+CHECK_MACRO_VERSION = \
+	test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
+	  || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
+	       exit 1; \
+	     }
+
+# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
+# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
+# we don't want to bother translators with empty POT files). We assume that
+# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
+# In this case, stamp-po is a nop (i.e. a phony target).
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(POFILES) has been designed to not touch files that don't need to be
+# changed.
+stamp-po: $(srcdir)/$(DOMAIN).pot
+	@$(CHECK_MACRO_VERSION)
+	test ! -f $(srcdir)/$(DOMAIN).pot || \
+	  test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
+	@test ! -f $(srcdir)/$(DOMAIN).pot || { \
+	  echo "touch stamp-po" && \
+	  echo timestamp > stamp-poT && \
+	  mv stamp-poT stamp-po; \
+	}
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
+# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+# The determination of whether the package xyz is a GNU one is based on the
+# heuristic whether some file in the top level directory mentions "GNU xyz".
+# If GNU 'find' is available, we avoid grepping through monster files.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+	package_gnu="$(PACKAGE_GNU)"; \
+	test -n "$$package_gnu" || { \
+	  if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \
+		 LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f \
+			       -size -10000000c -exec grep 'GNU @PACKAGE@' \
+			       /dev/null '{}' ';' 2>/dev/null; \
+	       else \
+		 LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null; \
+	       fi; \
+	     } | grep -v 'libtool:' >/dev/null; then \
+	     package_gnu=yes; \
+	   else \
+	     package_gnu=no; \
+	   fi; \
+	}; \
+	if test "$$package_gnu" = "yes"; then \
+	  package_prefix='GNU '; \
+	else \
+	  package_prefix=''; \
+	fi; \
+	if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
+	  msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
+	else \
+	  msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
+	fi; \
+	case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+	  '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
+	    $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+	      --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+	      --files-from=$(srcdir)/POTFILES.in \
+	      --copyright-holder='$(COPYRIGHT_HOLDER)' \
+	      --msgid-bugs-address="$$msgid_bugs_address" \
+	    ;; \
+	  *) \
+	    $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+	      --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+	      --files-from=$(srcdir)/POTFILES.in \
+	      --copyright-holder='$(COPYRIGHT_HOLDER)' \
+	      --package-name="$${package_prefix}@PACKAGE@" \
+	      --package-version='@VERSION@' \
+	      --msgid-bugs-address="$$msgid_bugs_address" \
+	    ;; \
+	esac
+	test ! -f $(DOMAIN).po || { \
+	  if test -f $(srcdir)/$(DOMAIN).pot-header; then \
+	    sed -e '1,/^#$$/d' < $(DOMAIN).po > $(DOMAIN).1po && \
+	    cat $(srcdir)/$(DOMAIN).pot-header $(DOMAIN).1po > $(DOMAIN).po; \
+	    rm -f $(DOMAIN).1po; \
+	  fi; \
+	  if test -f $(srcdir)/$(DOMAIN).pot; then \
+	    sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+	    sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+	    if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+	      rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+	    else \
+	      rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+	      mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+	    fi; \
+	  else \
+	    mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+	  fi; \
+	}
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+	$(MAKE) $(DOMAIN).pot-update
+
+# This target rebuilds a PO file if $(DOMAIN).pot has changed.
+# Note that a PO file is not touched if it doesn't need to be changed.
+$(POFILES): $(POFILESDEPS)
+	@lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+	if test -f "$(srcdir)/$${lang}.po"; then \
+	  test -f $(srcdir)/$(DOMAIN).pot || $(MAKE) $(srcdir)/$(DOMAIN).pot; \
+	  test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+	  echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \
+	  cd $(srcdir) \
+	    && { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+	           '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+	             $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
+	           *) \
+	             $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \
+	         esac; \
+	       }; \
+	else \
+	  $(MAKE) $${lang}.po-create; \
+	fi
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+	  for file in $(DISTFILES.common) Makevars.template; do \
+	    $(INSTALL_DATA) $(srcdir)/$$file \
+			    $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	  for file in Makevars; do \
+	    rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	else \
+	  : ; \
+	fi
+install-data-no: all
+install-data-yes: all
+	@catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+	  dir=$(localedir)/$$lang/LC_MESSAGES; \
+	  $(mkdir_p) $(DESTDIR)$$dir; \
+	  if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+	  $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+	  echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+	  for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+	    if test -n "$$lc"; then \
+	      if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+	        link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+	        mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	        mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+	         for file in *; do \
+	           if test -f $$file; then \
+	             ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+	           fi; \
+	         done); \
+	        rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	      else \
+	        if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+	          :; \
+	        else \
+	          rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	          mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        fi; \
+	      fi; \
+	      rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+	      ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+	      ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+	      cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+	      echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+	    fi; \
+	  done; \
+	done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+	else \
+	  : ; \
+	fi
+installdirs-data-no:
+installdirs-data-yes:
+	@catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+	  dir=$(localedir)/$$lang/LC_MESSAGES; \
+	  $(mkdir_p) $(DESTDIR)$$dir; \
+	  for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+	    if test -n "$$lc"; then \
+	      if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+	        link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+	        mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	        mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+	         for file in *; do \
+	           if test -f $$file; then \
+	             ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+	           fi; \
+	         done); \
+	        rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	      else \
+	        if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+	          :; \
+	        else \
+	          rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	          mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        fi; \
+	      fi; \
+	    fi; \
+	  done; \
+	done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  for file in $(DISTFILES.common) Makevars.template; do \
+	    rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	else \
+	  : ; \
+	fi
+uninstall-data-no:
+uninstall-data-yes:
+	catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+	  for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+	    rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+	  done; \
+	done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+	rm -f remove-potcdate.sed
+	rm -f stamp-poT
+	rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+	rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+	rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+	rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+	test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS)
+	@$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: stamp-po $(DISTFILES)
+	dists="$(DISTFILES)"; \
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  dists="$$dists Makevars.template"; \
+	fi; \
+	if test -f $(srcdir)/$(DOMAIN).pot; then \
+	  dists="$$dists $(DOMAIN).pot stamp-po"; \
+	fi; \
+	if test -f $(srcdir)/ChangeLog; then \
+	  dists="$$dists ChangeLog"; \
+	fi; \
+	for i in 0 1 2 3 4 5 6 7 8 9; do \
+	  if test -f $(srcdir)/ChangeLog.$$i; then \
+	    dists="$$dists ChangeLog.$$i"; \
+	  fi; \
+	done; \
+	if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+	for file in $$dists; do \
+	  if test -f $$file; then \
+	    cp -p $$file $(distdir) || exit 1; \
+	  else \
+	    cp -p $(srcdir)/$$file $(distdir) || exit 1; \
+	  fi; \
+	done
+
+update-po: Makefile
+	$(MAKE) $(DOMAIN).pot-update
+	test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+	$(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+	@lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+	echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+	exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+	@lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+	if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; fi; \
+	tmpdir=`pwd`; \
+	echo "$$lang:"; \
+	test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+	echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+	cd $(srcdir); \
+	if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+	       '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+	         $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+	       *) \
+	         $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+	     esac; \
+	   }; then \
+	  if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+	    rm -f $$tmpdir/$$lang.new.po; \
+	  else \
+	    if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+	      :; \
+	    else \
+	      echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+	      exit 1; \
+	    fi; \
+	  fi; \
+	else \
+	  echo "msgmerge for $$lang.po failed!" 1>&2; \
+	  rm -f $$tmpdir/$$lang.new.po; \
+	fi
+
+$(DUMMYPOFILES):
+
+update-gmo: Makefile $(GMOFILES)
+	@:
+
+# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
+# because execution permission bits may not work on the current file system.
+# Use @SHELL@, which is the shell determined by autoconf for the use by its
+# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
+Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
+	cd $(top_builddir) \
+	  && @SHELL@ ./config.status $(subdir)/$@.in po-directories
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/extension/po/Makevars b/gawk-5.0.1/extension/po/Makevars
new file mode 100644
index 00000000000..4293de4ed49
--- /dev/null
+++ b/gawk-5.0.1/extension/po/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = bug-gawk@gnu.org
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = no
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = yes
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = yes
diff --git a/gawk-5.0.1/extension/po/POTFILES.in b/gawk-5.0.1/extension/po/POTFILES.in
new file mode 100644
index 00000000000..667e27c3cbc
--- /dev/null
+++ b/gawk-5.0.1/extension/po/POTFILES.in
@@ -0,0 +1 @@
+# List of source files which contain translatable strings.
diff --git a/gawk-5.0.1/extension/po/Rules-quot b/gawk-5.0.1/extension/po/Rules-quot
new file mode 100644
index 00000000000..baf652858ad
--- /dev/null
+++ b/gawk-5.0.1/extension/po/Rules-quot
@@ -0,0 +1,58 @@
+# This file, Rules-quot, can be copied and used freely without restrictions.
+# Special Makefile rules for English message catalogs with quotation marks.
+
+DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-create:
+	$(MAKE) en@quot.po-update
+en@boldquot.po-create:
+	$(MAKE) en@boldquot.po-update
+
+en@quot.po-update: en@quot.po-update-en
+en@boldquot.po-update: en@boldquot.po-update-en
+
+.insert-header.po-update-en:
+	@lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+	if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+	tmpdir=`pwd`; \
+	echo "$$lang:"; \
+	ll=`echo $$lang | sed -e 's/@.*//'`; \
+	LC_ALL=C; export LC_ALL; \
+	cd $(srcdir); \
+	if $(MSGINIT) $(MSGINIT_OPTIONS) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null \
+	   | $(SED) -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | \
+	   { case `$(MSGFILTER) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+	     '' | 0.[0-9] | 0.[0-9].* | 0.1[0-8] | 0.1[0-8].*) \
+	       $(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed \
+	       ;; \
+	     *) \
+	       $(MSGFILTER) `echo $$lang | sed -e 's/.*@//'` \
+	       ;; \
+	     esac } 2>/dev/null > $$tmpdir/$$lang.new.po \
+	     ; then \
+	  if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+	    rm -f $$tmpdir/$$lang.new.po; \
+	  else \
+	    if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+	      :; \
+	    else \
+	      echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+	      exit 1; \
+	    fi; \
+	  fi; \
+	else \
+	  echo "creation of $$lang.po failed!" 1>&2; \
+	  rm -f $$tmpdir/$$lang.new.po; \
+	fi
+
+en@quot.insert-header: insert-header.sin
+	sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+	sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+	rm -f *.insert-header
diff --git a/gawk-5.0.1/extension/po/boldquot.sed b/gawk-5.0.1/extension/po/boldquot.sed
new file mode 100644
index 00000000000..4b937aa517b
--- /dev/null
+++ b/gawk-5.0.1/extension/po/boldquot.sed
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
+s/“/“[1m/g
+s/”/[0m”/g
+s/‘/‘[1m/g
+s/’/[0m’/g
diff --git a/gawk-5.0.1/extension/po/en@boldquot.header b/gawk-5.0.1/extension/po/en@boldquot.header
new file mode 100644
index 00000000000..fedb6a06d12
--- /dev/null
+++ b/gawk-5.0.1/extension/po/en@boldquot.header
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
diff --git a/gawk-5.0.1/extension/po/en@quot.header b/gawk-5.0.1/extension/po/en@quot.header
new file mode 100644
index 00000000000..a9647fc35c3
--- /dev/null
+++ b/gawk-5.0.1/extension/po/en@quot.header
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
diff --git a/gawk-5.0.1/extension/po/gawk-extensions.pot b/gawk-5.0.1/extension/po/gawk-extensions.pot
new file mode 100644
index 00000000000..21d35c84a80
--- /dev/null
+++ b/gawk-5.0.1/extension/po/gawk-extensions.pot
@@ -0,0 +1 @@
+# this file is to keep make check happy
diff --git a/gawk-5.0.1/extension/po/insert-header.sin b/gawk-5.0.1/extension/po/insert-header.sin
new file mode 100644
index 00000000000..b26de01f6c8
--- /dev/null
+++ b/gawk-5.0.1/extension/po/insert-header.sin
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/gawk-5.0.1/extension/po/quot.sed b/gawk-5.0.1/extension/po/quot.sed
new file mode 100644
index 00000000000..0122c46318d
--- /dev/null
+++ b/gawk-5.0.1/extension/po/quot.sed
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
diff --git a/gawk-5.0.1/extension/po/remove-potcdate.sin b/gawk-5.0.1/extension/po/remove-potcdate.sin
new file mode 100644
index 00000000000..2436c49e786
--- /dev/null
+++ b/gawk-5.0.1/extension/po/remove-potcdate.sin
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/gawk-5.0.1/extension/po/stamp-po b/gawk-5.0.1/extension/po/stamp-po
new file mode 100644
index 00000000000..9788f70238c
--- /dev/null
+++ b/gawk-5.0.1/extension/po/stamp-po
@@ -0,0 +1 @@
+timestamp
diff --git a/gawk-5.0.1/extension/readdir.3am b/gawk-5.0.1/extension/readdir.3am
new file mode 100644
index 00000000000..e4f24dffc23
--- /dev/null
+++ b/gawk-5.0.1/extension/readdir.3am
@@ -0,0 +1,96 @@
+.TH READDIR 3am "Mar 17 2019" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+readdir \- directory input parser for gawk
+.SH SYNOPSIS
+.ft CW
+@load "readdir"
+.ft R
+.SH DESCRIPTION
+The
+.I readdir
+extension
+adds an input parser for directories.
+.PP
+When this extension is in use, instead of skipping directories named
+on the command line (or with
+.BR getline ),
+they are read, with each entry returned as a record.
+.PP
+The record consists of three fields. The first two are the inode number and the
+filename, separated by a forward slash character.
+On systems where the directory entry contains the file type, the record
+has a third field which is a single letter indicating the type of the
+file:
+.B f
+for file,
+.B d
+for directory,
+.B b
+for a block device,
+.B c
+for a character device,
+.B p
+for a FIFO,
+.B l
+for a symbolic link,
+.B s
+for a socket.
+.PP
+On systems without the file type information, the extension falls back
+to calling
+.IR stat (2),
+in order to provide the information.
+Thus the third field should never be
+.BR u .
+.\" .SH BUGS
+.SH EXAMPLE
+.ft CW
+.nf
+@load "readdir"
+\&...
+BEGIN { FS = "/" }
+{ print "file name is", $2 }
+.fi
+.ft R
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fnmatch (3am),
+.IR fork (3am),
+.IR inplace (3am),
+.IR ordchr (3am),
+.IR readfile (3am),
+.IR revoutput (3am),
+.IR rwarray (3am),
+.IR time (3am).
+.PP
+.IR opendir (3),
+.IR readdir (3),
+.IR stat (2).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2018, 2019
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/readdir.c b/gawk-5.0.1/extension/readdir.c
new file mode 100644
index 00000000000..cc1cd505404
--- /dev/null
+++ b/gawk-5.0.1/extension/readdir.c
@@ -0,0 +1,326 @@
+/*
+ * readdir.c --- Provide an input parser to read directories
+ *
+ * Arnold Robbins
+ * arnold@skeeve.com
+ * Written 7/2012
+ *
+ * Andrew Schorr and Arnold Robbins: further fixes 8/2012.
+ * Simplified 11/2012.
+ * Improved 3/2019.
+ */
+
+/*
+ * Copyright (C) 2012-2014, 2018, 2019 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _BSD_SOURCE
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#else
+#error Cannot compile the readdir extension on this system!
+#endif
+
+#ifdef __MINGW32__
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+
+#include "gawkapi.h"
+
+#include "gawkdirfd.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#ifndef PATH_MAX
+#define PATH_MAX	1024	/* a good guess */
+#endif
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "readdir extension: version 2.0";
+
+static awk_bool_t init_readdir(void);
+static awk_bool_t (*init_func)(void) = init_readdir;
+
+int plugin_is_GPL_compatible;
+
+/* data type for the opaque pointer: */
+
+typedef struct open_directory {
+	DIR *dp;
+	char *buf;
+} open_directory_t;
+
+/* ftype --- return type of file as a single character string */
+
+static const char *
+ftype(struct dirent *entry, const char *dirname)
+{
+#ifdef DT_BLK
+	(void) dirname;		/* silence warnings */
+	switch (entry->d_type) {
+	case DT_BLK:	return "b";
+	case DT_CHR:	return "c";
+	case DT_DIR:	return "d";
+	case DT_FIFO:	return "p";
+	case DT_LNK:	return "l";
+	case DT_REG:	return "f";
+	case DT_SOCK:	return "s";
+	default:
+	case DT_UNKNOWN: break; // JFS returns 'u', so fall through and stat
+	}
+#endif
+	char fname[PATH_MAX];
+	struct stat sbuf;
+
+	strcpy(fname, dirname);
+	strcat(fname, "/");
+	strcat(fname, entry->d_name);
+	if (stat(fname, &sbuf) == 0) {
+		if (S_ISBLK(sbuf.st_mode))
+			return "b";
+		if (S_ISCHR(sbuf.st_mode))
+			return "c";
+		if (S_ISDIR(sbuf.st_mode))
+			return "d";
+		if (S_ISFIFO(sbuf.st_mode))
+			return "p";
+		if (S_ISREG(sbuf.st_mode))
+			return "f";
+#ifdef S_ISLNK
+		if (S_ISLNK(sbuf.st_mode))
+			return "l";
+#endif
+#ifdef S_ISSOCK
+		if (S_ISSOCK(sbuf.st_mode))
+			return "s";
+#endif
+	}
+	return "u";
+}
+
+/* get_inode --- get the inode of a file */
+
+static long long
+get_inode(struct dirent *entry, const char *dirname)
+{
+#ifdef __MINGW32__
+	char fname[PATH_MAX];
+	HANDLE fh;
+	BY_HANDLE_FILE_INFORMATION info;
+
+	sprintf(fname, "%s\\%s", dirname, entry->d_name);
+	fh = CreateFile(fname, 0, 0, NULL, OPEN_EXISTING,
+			FILE_FLAG_BACKUP_SEMANTICS, NULL);
+	if (fh == INVALID_HANDLE_VALUE)
+		return 0;
+	if (GetFileInformationByHandle(fh, &info)) {
+		long long inode = info.nFileIndexHigh;
+
+		inode <<= 32;
+		inode += info.nFileIndexLow;
+		return inode;
+	}
+	return 0;
+#else
+	(void) dirname;		/* silence warnings */
+	return entry->d_ino;
+#endif
+}
+
+/* dir_get_record --- get one record at a time out of a directory */
+
+static int
+dir_get_record(char **out, awk_input_buf_t *iobuf, int *errcode,
+		char **rt_start, size_t *rt_len,
+		const awk_fieldwidth_info_t **unused)
+{
+	DIR *dp;
+	struct dirent *dirent;
+	int len;
+	open_directory_t *the_dir;
+	const char *ftstr;
+	unsigned long long ino;
+
+	/*
+	 * The caller sets *errcode to 0, so we should set it only if an
+	 * error occurs.
+	 */
+
+	if (out == NULL || iobuf == NULL || iobuf->opaque == NULL)
+		return EOF;
+
+	the_dir = (open_directory_t *) iobuf->opaque;
+	dp = the_dir->dp;
+
+	/*
+	 * Initialize errno, since readdir does not set it to zero on EOF.
+	 */
+	errno = 0;
+	dirent = readdir(dp);
+	if (dirent == NULL) {
+		*errcode = errno;	/* in case there was an error */
+		return EOF;
+	}
+
+	ino = get_inode(dirent, iobuf->name);
+
+#if __MINGW32__
+	len = sprintf(the_dir->buf, "%I64u/%s", ino, dirent->d_name);
+#else
+	len = sprintf(the_dir->buf, "%llu/%s", ino, dirent->d_name);
+#endif
+
+	ftstr = ftype(dirent, iobuf->name);
+	len += sprintf(the_dir->buf + len, "/%s", ftstr);
+
+	*out = the_dir->buf;
+
+	*rt_start = NULL;
+	*rt_len = 0;	/* set RT to "" */
+	return len;
+}
+
+/* dir_close --- close up when done */
+
+static void
+dir_close(awk_input_buf_t *iobuf)
+{
+	open_directory_t *the_dir;
+
+	if (iobuf == NULL || iobuf->opaque == NULL)
+		return;
+
+	the_dir = (open_directory_t *) iobuf->opaque;
+
+	closedir(the_dir->dp);
+	gawk_free(the_dir->buf);
+	gawk_free(the_dir);
+
+	iobuf->fd = -1;
+}
+
+/* dir_can_take_file --- return true if we want the file */
+
+static awk_bool_t
+dir_can_take_file(const awk_input_buf_t *iobuf)
+{
+	if (iobuf == NULL)
+		return awk_false;
+
+	return (iobuf->fd != INVALID_HANDLE && S_ISDIR(iobuf->sbuf.st_mode));
+}
+
+/*
+ * dir_take_control_of --- set up input parser.
+ * We can assume that dir_can_take_file just returned true,
+ * and no state has changed since then.
+ */
+
+static awk_bool_t
+dir_take_control_of(awk_input_buf_t *iobuf)
+{
+	DIR *dp;
+	open_directory_t *the_dir;
+	size_t size;
+
+	errno = 0;
+#ifdef HAVE_FDOPENDIR
+	dp = fdopendir(iobuf->fd);
+#else
+	dp = opendir(iobuf->name);
+	if (dp != NULL)
+		iobuf->fd = dirfd(dp);
+#endif
+	if (dp == NULL) {
+		warning(ext_id, _("dir_take_control_of: opendir/fdopendir failed: %s"),
+				strerror(errno));
+		update_ERRNO_int(errno);
+		return awk_false;
+	}
+
+	emalloc(the_dir, open_directory_t *, sizeof(open_directory_t), "dir_take_control_of");
+	the_dir->dp = dp;
+	size = sizeof(struct dirent) + 21 /* max digits in inode */ + 2 /* slashes */;
+	emalloc(the_dir->buf, char *, size, "dir_take_control_of");
+
+	iobuf->opaque = the_dir;
+	iobuf->get_record = dir_get_record;
+	iobuf->close_func = dir_close;
+
+	return awk_true;
+}
+
+static awk_input_parser_t readdir_parser = {
+	"readdir",
+	dir_can_take_file,
+	dir_take_control_of,
+	NULL
+};
+
+#ifdef TEST_DUPLICATE
+static awk_input_parser_t readdir_parser2 = {
+	"readdir2",
+	dir_can_take_file,
+	dir_take_control_of,
+	NULL
+};
+#endif
+
+/* init_readdir --- set things ups */
+
+static awk_bool_t
+init_readdir()
+{
+	register_input_parser(& readdir_parser);
+#ifdef TEST_DUPLICATE
+	register_input_parser(& readdir_parser2);
+#endif
+
+	return awk_true;
+}
+
+static awk_ext_func_t func_table[] = {
+	{ NULL, NULL, 0, 0, awk_false, NULL }
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, readdir, "")
diff --git a/gawk-5.0.1/extension/readdir_test.c b/gawk-5.0.1/extension/readdir_test.c
new file mode 100644
index 00000000000..13bf667c5fb
--- /dev/null
+++ b/gawk-5.0.1/extension/readdir_test.c
@@ -0,0 +1,343 @@
+/*
+ * readdir.c --- Provide an input parser to read directories
+ *
+ * Arnold Robbins
+ * arnold@skeeve.com
+ * Written 7/2012
+ *
+ * Andrew Schorr and Arnold Robbins: further fixes 8/2012.
+ * Simplified 11/2012.
+ * Improved 3/2019.
+ */
+
+/*
+ * Copyright (C) 2012-2014, 2017, 2018, 2019 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _BSD_SOURCE
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#else
+#error Cannot compile the readdir extension on this system!
+#endif
+
+#ifdef __MINGW32__
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+
+#include "gawkapi.h"
+
+#include "gawkdirfd.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#ifndef PATH_MAX
+#define PATH_MAX	1024	/* a good guess */
+#endif
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "readdir extension: version 3.0";
+
+static awk_bool_t init_readdir(void);
+static awk_bool_t (*init_func)(void) = init_readdir;
+
+int plugin_is_GPL_compatible;
+
+/* data type for the opaque pointer: */
+
+typedef struct open_directory {
+	DIR *dp;
+	char *buf;
+	union {
+		awk_fieldwidth_info_t fw;
+		char buf[awk_fieldwidth_info_size(3)];
+	} u;
+} open_directory_t;
+#define fw u.fw
+
+/* ftype --- return type of file as a single character string */
+
+static const char *
+ftype(struct dirent *entry, const char *dirname)
+{
+#ifdef DT_BLK
+	(void) dirname;		/* silence warnings */
+	switch (entry->d_type) {
+	case DT_BLK:	return "b";
+	case DT_CHR:	return "c";
+	case DT_DIR:	return "d";
+	case DT_FIFO:	return "p";
+	case DT_LNK:	return "l";
+	case DT_REG:	return "f";
+	case DT_SOCK:	return "s";
+	default:
+	case DT_UNKNOWN: break;	// JFS returns 'u', so fall through to stat
+	}
+#endif
+	char fname[PATH_MAX];
+	struct stat sbuf;
+
+	strcpy(fname, dirname);
+	strcat(fname, "/");
+	strcat(fname, entry->d_name);
+	if (stat(fname, &sbuf) == 0) {
+		if (S_ISBLK(sbuf.st_mode))
+			return "b";
+		if (S_ISCHR(sbuf.st_mode))
+			return "c";
+		if (S_ISDIR(sbuf.st_mode))
+			return "d";
+		if (S_ISFIFO(sbuf.st_mode))
+			return "p";
+		if (S_ISREG(sbuf.st_mode))
+			return "f";
+#ifdef S_ISLNK
+		if (S_ISLNK(sbuf.st_mode))
+			return "l";
+#endif
+#ifdef S_ISSOCK
+		if (S_ISSOCK(sbuf.st_mode))
+			return "s";
+#endif
+	}
+	return "u";
+}
+
+/* get_inode --- get the inode of a file */
+
+static long long
+get_inode(struct dirent *entry, const char *dirname)
+{
+#ifdef __MINGW32__
+	char fname[PATH_MAX];
+	HANDLE fh;
+	BY_HANDLE_FILE_INFORMATION info;
+
+	sprintf(fname, "%s\\%s", dirname, entry->d_name);
+	fh = CreateFile(fname, 0, 0, NULL, OPEN_EXISTING,
+			FILE_FLAG_BACKUP_SEMANTICS, NULL);
+	if (fh == INVALID_HANDLE_VALUE)
+		return 0;
+	if (GetFileInformationByHandle(fh, &info)) {
+		long long inode = info.nFileIndexHigh;
+
+		inode <<= 32;
+		inode += info.nFileIndexLow;
+		return inode;
+	}
+	return 0;
+#else
+	(void) dirname;		/* silence warnings */
+	return entry->d_ino;
+#endif
+}
+
+/* dir_get_record --- get one record at a time out of a directory */
+
+static int
+dir_get_record(char **out, awk_input_buf_t *iobuf, int *errcode,
+		char **rt_start, size_t *rt_len,
+		const awk_fieldwidth_info_t **field_width)
+{
+	DIR *dp;
+	struct dirent *dirent;
+	int len, flen;
+	open_directory_t *the_dir;
+	const char *ftstr;
+	unsigned long long ino;
+
+	/*
+	 * The caller sets *errcode to 0, so we should set it only if an
+	 * error occurs.
+	 */
+
+	if (out == NULL || iobuf == NULL || iobuf->opaque == NULL)
+		return EOF;
+
+	the_dir = (open_directory_t *) iobuf->opaque;
+	dp = the_dir->dp;
+
+	/*
+	 * Initialize errno, since readdir does not set it to zero on EOF.
+	 */
+	errno = 0;
+	dirent = readdir(dp);
+	if (dirent == NULL) {
+		*errcode = errno;	/* in case there was an error */
+		return EOF;
+	}
+
+	ino = get_inode(dirent, iobuf->name);
+
+#if __MINGW32__
+	len = sprintf(the_dir->buf, "%I64u", ino);
+#else
+	len = sprintf(the_dir->buf, "%llu", ino);
+#endif
+	the_dir->fw.fields[0].len = len;
+	len += (flen = sprintf(the_dir->buf + len, "/%s", dirent->d_name));
+	the_dir->fw.fields[1].len = flen-1;
+
+	ftstr = ftype(dirent, iobuf->name);
+	len += (flen = sprintf(the_dir->buf + len, "/%s", ftstr));
+	the_dir->fw.fields[2].len = flen-1;
+
+	*out = the_dir->buf;
+
+	*rt_start = NULL;
+	*rt_len = 0;	/* set RT to "" */
+	if (field_width)
+		*field_width = & the_dir->fw;
+	return len;
+}
+
+/* dir_close --- close up when done */
+
+static void
+dir_close(awk_input_buf_t *iobuf)
+{
+	open_directory_t *the_dir;
+
+	if (iobuf == NULL || iobuf->opaque == NULL)
+		return;
+
+	the_dir = (open_directory_t *) iobuf->opaque;
+
+	closedir(the_dir->dp);
+	gawk_free(the_dir->buf);
+	gawk_free(the_dir);
+
+	iobuf->fd = -1;
+}
+
+/* dir_can_take_file --- return true if we want the file */
+
+static awk_bool_t
+dir_can_take_file(const awk_input_buf_t *iobuf)
+{
+	if (iobuf == NULL)
+		return awk_false;
+
+	return (iobuf->fd != INVALID_HANDLE && S_ISDIR(iobuf->sbuf.st_mode));
+}
+
+/*
+ * dir_take_control_of --- set up input parser.
+ * We can assume that dir_can_take_file just returned true,
+ * and no state has changed since then.
+ */
+
+static awk_bool_t
+dir_take_control_of(awk_input_buf_t *iobuf)
+{
+	DIR *dp;
+	open_directory_t *the_dir;
+	size_t size;
+
+	errno = 0;
+#ifdef HAVE_FDOPENDIR
+	dp = fdopendir(iobuf->fd);
+#else
+	dp = opendir(iobuf->name);
+	if (dp != NULL)
+		iobuf->fd = dirfd(dp);
+#endif
+	if (dp == NULL) {
+		warning(ext_id, _("dir_take_control_of: opendir/fdopendir failed: %s"),
+				strerror(errno));
+		update_ERRNO_int(errno);
+		return awk_false;
+	}
+
+	emalloc(the_dir, open_directory_t *, sizeof(open_directory_t), "dir_take_control_of");
+	the_dir->dp = dp;
+	/* pre-populate the field_width struct with constant values: */
+	the_dir->fw.use_chars = awk_false;
+	the_dir->fw.nf = 3;
+	the_dir->fw.fields[0].skip = 0;	/* no leading space */
+	the_dir->fw.fields[1].skip = 1;	/* single '/' separator */
+	the_dir->fw.fields[2].skip = 1;	/* single '/' separator */
+	size = sizeof(struct dirent) + 21 /* max digits in inode */ + 2 /* slashes */;
+	emalloc(the_dir->buf, char *, size, "dir_take_control_of");
+
+	iobuf->opaque = the_dir;
+	iobuf->get_record = dir_get_record;
+	iobuf->close_func = dir_close;
+
+	return awk_true;
+}
+
+static awk_input_parser_t readdir_parser = {
+	"readdir",
+	dir_can_take_file,
+	dir_take_control_of,
+	NULL
+};
+
+#ifdef TEST_DUPLICATE
+static awk_input_parser_t readdir_parser2 = {
+	"readdir2",
+	dir_can_take_file,
+	dir_take_control_of,
+	NULL
+};
+#endif
+
+/* init_readdir --- set things ups */
+
+static awk_bool_t
+init_readdir()
+{
+	register_input_parser(& readdir_parser);
+#ifdef TEST_DUPLICATE
+	register_input_parser(& readdir_parser2);
+#endif
+
+	return awk_true;
+}
+
+static awk_ext_func_t func_table[] = {
+	{ NULL, NULL, 0, 0, awk_false, NULL }
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, readdir, "")
diff --git a/gawk-5.0.1/extension/readfile.3am b/gawk-5.0.1/extension/readfile.3am
new file mode 100644
index 00000000000..8752bd532cc
--- /dev/null
+++ b/gawk-5.0.1/extension/readfile.3am
@@ -0,0 +1,88 @@
+.TH READFILE 3am "Feb 02 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+readfile \- return the entire contents of a file as a string
+.SH SYNOPSIS
+.ft CW
+@load "readfile"
+.sp
+result = readfile("/some/path")
+.sp
+.ft R
+For making whole files be single records:
+.sp
+.ft CW
+@load "readfile"
+.br
+BEGIN { PROCINFO["readfile"] = 1 }
+.ft R
+.SH DESCRIPTION
+The
+.I readfile
+extension adds a single function named
+.BR readfile() .
+The argument is the name of the file to read.
+The return value is a string containing the entire contents of
+the requested file.
+.PP
+Upon error, the function returns the empty string and sets
+.BR ERRNO .
+.PP
+In addition, it adds an input parser that is activated if
+.ft CW
+PROCINFO["readfile"]
+.ft R
+exists.
+When activated, each input file is returned in its entirety as \f(CW$0\fR.
+\f(CWRT\fP is set to the null string.
+.\" .SH NOTES
+.\" .SH BUGS
+.SH EXAMPLE
+.ft CW
+.nf
+@load "readfile"
+\&...
+contents = readfile("/path/to/file");
+if (contents == "" && ERRNO != "") {
+    print("problem reading file", ERRNO) > "/dev/stderr"
+    ...
+}
+.fi
+.ft R
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fnmatch (3am),
+.IR fork (3am),
+.IR inplace (3am),
+.IR ordchr (3am),
+.IR readdir (3am),
+.IR revoutput (3am),
+.IR rwarray (3am),
+.IR time (3am).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2014, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/readfile.c b/gawk-5.0.1/extension/readfile.c
new file mode 100644
index 00000000000..6c3307cd90e
--- /dev/null
+++ b/gawk-5.0.1/extension/readfile.c
@@ -0,0 +1,244 @@
+/*
+ * readfile.c - Read an entire file into a string.
+ *
+ * Arnold Robbins
+ * Tue Apr 23 17:43:30 IDT 2002
+ * Revised per Peter Tillier
+ * Mon Jun  9 17:05:11 IDT 2003
+ * Revised for new dynamic function facilities
+ * Mon Jun 14 14:53:07 IDT 2004
+ * Revised for formal API May 2012
+ * Added input parser March 2014
+ */
+
+/*
+ * Copyright (C) 2002, 2003, 2004, 2011, 2012, 2013, 2014, 2018
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _BSD_SOURCE
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "readfile extension: version 2.0";
+static awk_bool_t init_readfile();
+static awk_bool_t (*init_func)(void) = init_readfile;
+
+int plugin_is_GPL_compatible;
+
+/* read_file_to_buffer --- handle the mechanics of reading the file */
+
+static char *
+read_file_to_buffer(int fd, const struct stat *sbuf)
+{
+	char *text;
+
+	if ((sbuf->st_mode & S_IFMT) != S_IFREG) {
+		errno = EINVAL;
+		update_ERRNO_int(errno);
+		return NULL;
+	}
+
+	emalloc(text, char *, sbuf->st_size + 1, "do_readfile");
+
+	if (read(fd, text, sbuf->st_size) != sbuf->st_size) {
+		update_ERRNO_int(errno);
+		gawk_free(text);
+		return NULL;
+	}
+	text[sbuf->st_size] = '\0';
+	return text;
+}
+
+/* do_readfile --- read a file into memory */
+
+static awk_value_t *
+do_readfile(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t filename;
+	int ret;
+	struct stat sbuf;
+	char *text;
+	int fd;
+
+	assert(result != NULL);
+	make_null_string(result);	/* default return value */
+
+	unset_ERRNO();
+
+	if (get_argument(0, AWK_STRING, &filename)) {
+		ret = stat(filename.str_value.str, & sbuf);
+		if (ret < 0) {
+			update_ERRNO_int(errno);
+			goto done;
+		}
+
+		if ((fd = open(filename.str_value.str, O_RDONLY|O_BINARY)) < 0) {
+			update_ERRNO_int(errno);
+			goto done;
+		}
+
+		text = read_file_to_buffer(fd, & sbuf);
+		if (text == NULL)
+			goto done;	/* ERRNO already updated */
+
+		close(fd);
+		make_malloced_string(text, sbuf.st_size, result);
+		goto done;
+	} else if (do_lint)
+		lintwarn(ext_id, _("readfile: called with wrong kind of argument"));
+
+done:
+	/* Set the return value */
+	return result;
+}
+
+/* readfile_get_record --- read the whole file as one record */
+
+static int
+readfile_get_record(char **out, awk_input_buf_t *iobuf, int *errcode,
+			char **rt_start, size_t *rt_len,
+			const awk_fieldwidth_info_t **unused)
+{
+	char *text;
+
+	/*
+	 * The caller sets *errcode to 0, so we should set it only if an
+	 * error occurs.
+	 */
+
+	if (out == NULL || iobuf == NULL)
+		return EOF;
+
+	if (iobuf->opaque != NULL) {
+		/*
+		 * Already read the whole file,
+		 * free up stuff and return EOF
+		 */
+		gawk_free(iobuf->opaque);
+		iobuf->opaque = NULL;
+		return EOF;
+	}
+
+	/* read file */
+	text = read_file_to_buffer(iobuf->fd, & iobuf->sbuf);
+	if (text == NULL)
+		return EOF;
+
+	/* set up the iobuf for next time */
+	iobuf->opaque = text;
+
+	/* set return values */
+	*rt_start = NULL;
+	*rt_len = 0;
+	*out = text;
+
+	/* return count */
+	return iobuf->sbuf.st_size;
+}
+
+/* readfile_can_take_file --- return true if we want the file */
+
+static awk_bool_t
+readfile_can_take_file(const awk_input_buf_t *iobuf)
+{
+	awk_value_t array, index, value;
+
+	if (iobuf == NULL)
+		return awk_false;
+
+	/*
+	 * This could fail if PROCINFO isn't referenced from
+	 * the awk program. It's not a "can't happen" error.
+	 */
+	if (! sym_lookup("PROCINFO", AWK_ARRAY, & array)) {
+		return awk_false;
+	}
+
+	(void) make_const_string("readfile", 8, & index);
+
+	if (! get_array_element(array.array_cookie, & index, AWK_UNDEFINED, & value)) {
+		return awk_false;
+	}
+
+	return awk_true;
+}
+
+/* readfile_take_control_of --- take over the file */
+
+static awk_bool_t
+readfile_take_control_of(awk_input_buf_t *iobuf)
+{
+	if (iobuf == NULL)
+		return awk_false;
+
+	iobuf->get_record = readfile_get_record;
+	return awk_true;
+}
+
+static awk_input_parser_t readfile_parser = {
+	"readfile",
+	readfile_can_take_file,
+	readfile_take_control_of,
+	NULL
+};
+
+/* init_readfile --- set things up */
+
+static awk_bool_t
+init_readfile()
+{
+	register_input_parser(& readfile_parser);
+
+	return awk_true;
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "readfile", do_readfile, 1, 1, awk_false, NULL },
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, readfile, "")
diff --git a/gawk-5.0.1/extension/revoutput.3am b/gawk-5.0.1/extension/revoutput.3am
new file mode 100644
index 00000000000..5eec60e9ee6
--- /dev/null
+++ b/gawk-5.0.1/extension/revoutput.3am
@@ -0,0 +1,77 @@
+.TH REVOUTPUT 3am "Feb 21 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+revoutput \- Reverse output strings sample extension
+.SH SYNOPSIS
+.ft CW
+@load "revoutput"
+.sp
+BEGIN { REVOUT = 1 }    # Reverse all output strings
+.ft R
+.SH DESCRIPTION
+The
+.I revoutput
+extension
+adds a simple output wrapper that reverses the characters in each output
+line.
+It's main purpose is to show how to write an output wrapper, although
+it may be mildly amusing for the unwary.
+.\" .SH BUGS
+.SH EXAMPLE
+.ft CW
+.nf
+@load "revoutput"
+
+BEGIN {
+    REVOUT = 1
+    print "hello, world" > "/dev/stdout"
+}
+.fi
+.ft R
+.PP
+The output from this program is:
+.PP
+.ft CW
+.nf
+dlrow ,olleh
+.fi
+.ft R
+.SH BUGS
+This extension does not affect the default standard output.
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fnmatch (3am),
+.IR fork (3am),
+.IR inplace (3am),
+.IR ordchr (3am),
+.IR readdir (3am),
+.IR readfile (3am),
+.IR rwarray (3am),
+.IR time (3am).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/revoutput.c b/gawk-5.0.1/extension/revoutput.c
new file mode 100644
index 00000000000..c50616d01bb
--- /dev/null
+++ b/gawk-5.0.1/extension/revoutput.c
@@ -0,0 +1,142 @@
+/*
+ * revoutput.c --- Provide an output wrapper that reverses lines.
+ *
+ * Arnold Robbins
+ * arnold@skeeve.com
+ * Written 8/2012
+ */
+
+/*
+ * Copyright (C) 2012, 2013, 2015, 2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "revoutput extension: version 1.1";
+
+static awk_bool_t init_revoutput(void);
+static awk_bool_t (*init_func)(void) = init_revoutput;
+
+int plugin_is_GPL_compatible;
+
+/* rev_fwrite --- write out characters in reverse order */
+
+static size_t
+rev_fwrite(const void *buf, size_t size, size_t count, FILE *fp, void *opaque)
+{
+	const char *cp = buf;
+	int nbytes = size * count;
+
+	(void) opaque;
+
+	for (; nbytes >= 1; nbytes--)
+		putc(cp[nbytes-1], fp);
+
+	return (size * count);
+}
+
+
+/* revoutput_can_take_file --- return true if we want the file */
+
+static awk_bool_t
+revoutput_can_take_file(const awk_output_buf_t *outbuf)
+{
+	awk_value_t value;
+
+	if (outbuf == NULL)
+		return awk_false;
+
+	if (! sym_lookup("REVOUT", AWK_NUMBER, & value))
+		return awk_false;
+
+	return (value.num_value != 0);
+}
+
+/*
+ * revoutput_take_control_of --- set up output wrapper.
+ * We can assume that revoutput_can_take_file just returned true,
+ * and no state has changed since then.
+ */
+
+static awk_bool_t
+revoutput_take_control_of(awk_output_buf_t *outbuf)
+{
+	if (outbuf == NULL)
+		return awk_false;
+
+	outbuf->gawk_fwrite = rev_fwrite;
+	outbuf->redirected = awk_true;
+	return awk_true;
+}
+
+static awk_output_wrapper_t output_wrapper = {
+	"revoutput",
+	revoutput_can_take_file,
+	revoutput_take_control_of,
+	NULL
+};
+
+/* init_revoutput --- set things ups */
+
+static awk_bool_t
+init_revoutput()
+{
+	awk_value_t value;
+
+	register_output_wrapper(& output_wrapper);
+
+	if (! sym_lookup("REVOUT", AWK_SCALAR, & value)) {
+		/* only install it if not there, e.g. -v REVOUT=1 */
+		make_number(0.0, & value);	/* init to false */
+		if (! sym_update("REVOUT", & value)) {
+			warning(ext_id, _("revoutput: could not initialize REVOUT variable"));
+
+			return awk_false;
+		}
+	}
+
+	return awk_true;
+}
+
+static awk_ext_func_t func_table[] = {
+	{ NULL, NULL, 0, 0, awk_false, NULL }
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, revoutput, "")
diff --git a/gawk-5.0.1/extension/revtwoway.3am b/gawk-5.0.1/extension/revtwoway.3am
new file mode 100644
index 00000000000..c7312641bd3
--- /dev/null
+++ b/gawk-5.0.1/extension/revtwoway.3am
@@ -0,0 +1,65 @@
+.TH REVTWOWAY 3am "Feb 21 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+revtwoway \- Reverse strings sample two-way processor extension
+.SH SYNOPSIS
+.ft CW
+@load "revtwoway"
+.sp
+.nf
+BEGIN {
+    cmd = "/magic/mirror"
+    print "hello, world" |& cmd
+    cmd |& getline result
+    print result
+    close(cmd)
+}
+.fi
+.ft R
+.SH DESCRIPTION
+The
+.I revtwoway
+extension
+adds a simple two-way processor that reverses the characters
+in each line sent to it for reading back by the AWK program.
+It's main purpose is to show how to write a two-way extension, although
+it may also be mildly amusing.
+.\" .SH BUGS
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fnmatch (3am),
+.IR fork (3am),
+.IR inplace (3am),
+.IR ordchr (3am),
+.IR readdir (3am),
+.IR readfile (3am),
+.IR revoutput (3am),
+.IR rwarray (3am),
+.IR time (3am).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/revtwoway.c b/gawk-5.0.1/extension/revtwoway.c
new file mode 100644
index 00000000000..ebb9692e3ae
--- /dev/null
+++ b/gawk-5.0.1/extension/revtwoway.c
@@ -0,0 +1,345 @@
+/*
+ * revtwoway.c --- Provide a two-way processor that reverses lines.
+ *
+ * Arnold Robbins
+ * arnold@skeeve.com
+ * Written 8/2012
+ */
+
+/*
+ * Copyright (C) 2012-2014, 2016, 2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _BSD_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "revtwoway extension: version 1.0";
+
+static awk_bool_t init_revtwoway(void);
+static awk_bool_t (*init_func)(void) = init_revtwoway;
+
+int plugin_is_GPL_compatible;
+
+/*
+ * Use this variable to provide a value != INVALID_HANDLE in the awk_input_buf_t
+ * and != NULL in the awk_output_buf_t.  The idea is to have a value that
+ * is greater than the largest allowable file descriptor.
+ */
+static size_t max_fds;
+
+#ifndef HAVE_GETDTABLESIZE
+/* gawk_getdtablesize --- replacement version that should be good enough */
+
+static inline int
+gawk_getdtablesize()
+{
+	/*
+	 * Algorithm for the GNULIB folks:
+	 *
+	 * Set up a bitmap of 2048 elements.
+	 * Initialize it to zero.
+	 * In a loop, do
+	 * 	fd = open("/dev/null", O_RDONLY)
+	 * 	set the bit corresponding to fd in the bit map
+	 * until it fails.
+	 * Get the highest value that succeeded and increment it by one
+	 * --> that is how many descriptors we have.
+	 * Loop over the bitmap to close all the file descriptors we opened.
+	 *
+	 * Do all this upon the first call and return static values upon
+	 * subsequent calls.
+	 */
+
+	/* In the meantime, this is good enough for us: */
+	return 1024;
+}
+
+#define getdtablesize() gawk_getdtablesize()
+#endif
+
+/*
+ * IMPORTANT NOTE: This is a NOT a true general purpose
+ * extension.  It is intended to demonstrate how to set up
+ * all the "plumbing" and to work one record at a time, ONLY.
+ *
+ * While it would be possible to set up buffering and manage it,
+ * that would duplicate a large chunk of the code in gawk's
+ * get_a_record() function, and there's no real point in doing that.
+ */
+
+/* the data in the opaque pointer */
+typedef struct two_way_proc_data {
+	size_t size;	/* size of allocated buffer */
+	size_t len;	/* how much is actually in use */
+	char *data;
+	size_t in_use;	/* use count, must hit zero to be freed */
+} two_way_proc_data_t;
+
+/* close_two_proc_data --- release the data */
+
+static void
+close_two_proc_data(two_way_proc_data_t *proc_data)
+{
+	if (proc_data->in_use > 1) {
+		proc_data->in_use--;
+		return;
+	}
+
+	gawk_free(proc_data->data);
+	gawk_free(proc_data);
+}
+
+/*
+ * Input side of the two-way processor (input TO gawk)
+ */
+
+/* rev2way_get_record --- get one record at a time out of a directory */
+
+static int
+rev2way_get_record(char **out, awk_input_buf_t *iobuf, int *errcode,
+		char **rt_start, size_t *rt_len,
+		const awk_fieldwidth_info_t **unused)
+{
+	int len = 0;	/* for now */
+	two_way_proc_data_t *proc_data;
+
+	/*
+	 * The caller sets *errcode to 0, so we should set it only if an
+	 * error occurs.
+	 */
+
+	(void) errcode;		/* silence warnings */
+	if (out == NULL || iobuf == NULL || iobuf->opaque == NULL)
+		return EOF;
+
+	proc_data = (two_way_proc_data_t *) iobuf->opaque;
+	if (proc_data->len == 0)
+		return 0;
+
+	*out = proc_data->data;
+
+	len = proc_data->len;
+	proc_data->len = 0;
+
+	*rt_len = 0;	/* default: set RT to "" */
+	if (proc_data->data[len-1] == '\n') {
+		while (proc_data->data[len-1] == '\n') {
+			len--;
+			(*rt_len)++;
+		}
+		*rt_start = proc_data->data + len;
+	}
+
+	return len;
+}
+
+/* rev2way_close --- close up input side when done */
+
+static void
+rev2way_close(awk_input_buf_t *iobuf)
+{
+	two_way_proc_data_t *proc_data;
+
+	if (iobuf == NULL || iobuf->opaque == NULL)
+		return;
+
+	proc_data = (two_way_proc_data_t *) iobuf->opaque;
+	close_two_proc_data(proc_data);
+
+	iobuf->fd = INVALID_HANDLE;
+}
+
+
+/*
+ * Output side of the two-way processor (output FROM gawk)
+ */
+
+/* rev2way_fwrite --- write out characters in reverse order */
+
+static size_t
+rev2way_fwrite(const void *buf, size_t size, size_t count, FILE *fp, void *opaque)
+{
+	two_way_proc_data_t *proc_data;
+	size_t amount, char_count;
+	char *src, *dest;
+
+	(void) fp;	/* silence warnings */
+	if (opaque == NULL)
+		return 0;	/* error */
+
+	proc_data = (two_way_proc_data_t *) opaque;
+	amount = size * count;
+
+	/* do the dance */
+	if (amount > proc_data->size || proc_data->len > 0) {
+		if (proc_data->data == NULL)
+			emalloc(proc_data->data, char *,  amount, "rev2way_fwrite");
+		else
+			erealloc(proc_data->data, char *, proc_data->size + amount, "rev2way_fwrite");
+		proc_data->size += amount;
+	}
+
+	src = (char *) buf + amount -1;
+	dest = proc_data->data + proc_data->len;
+	for (char_count = amount; char_count > 0; char_count--) {
+		/* copy in backwards */
+		*dest++ = *src--;
+	}
+	proc_data->len += amount;
+
+	return amount;
+}
+
+/* rev2way_fflush --- do nothing hook for fflush */
+
+static int
+rev2way_fflush(FILE *fp, void *opaque)
+{
+	(void) fp;
+	(void) opaque;
+
+	return 0;
+}
+
+/* rev2way_ferror --- do nothing hook for ferror */
+
+static int
+rev2way_ferror(FILE *fp, void *opaque)
+{
+	(void) fp;
+	(void) opaque;
+
+	return 0;
+}
+
+/* rev2way_fclose --- close output side of two-way processor */
+
+static int
+rev2way_fclose(FILE *fp, void *opaque)
+{
+	two_way_proc_data_t *proc_data;
+
+	if (opaque == NULL)
+		return EOF;	/* error */
+
+	(void) fp;
+
+	proc_data = (two_way_proc_data_t *) opaque;
+	close_two_proc_data(proc_data);
+
+	return 0;
+}
+
+
+/* revtwoway_can_two_way --- return true if we want the file */
+
+static awk_bool_t
+revtwoway_can_take_two_way(const char *name)
+{
+	return (name != NULL && strcmp(name, "/magic/mirror") == 0);
+}
+
+/*
+ * revtwoway_take_control_of --- set up two way processor
+ * We can assume that revtwoway_can_take_two_way just returned true,
+ * and no state has changed since then.
+ */
+
+static awk_bool_t
+revtwoway_take_control_of(const char *name, awk_input_buf_t *inbuf, awk_output_buf_t *outbuf)
+{
+	two_way_proc_data_t *proc_data;
+
+	(void) name;	/* silence warnings */
+	if (inbuf == NULL || outbuf == NULL)
+		return awk_false;
+
+	emalloc(proc_data, two_way_proc_data_t *, sizeof(two_way_proc_data_t), "revtwoway_take_control_of");
+	proc_data->in_use = 2;
+	proc_data->size = 0;
+	proc_data->len = 0;
+	proc_data->data = NULL;
+
+	if (max_fds + 1 == 0)	/* wrapped. ha! */
+		max_fds = getdtablesize();
+
+	/* input side: */
+	inbuf->get_record = rev2way_get_record;
+	inbuf->close_func = rev2way_close;
+	inbuf->fd = max_fds;
+	inbuf->opaque = proc_data;
+
+	/* output side: */
+	outbuf->fp = (FILE *) max_fds++;
+	outbuf->opaque = proc_data;
+	outbuf->gawk_fwrite = rev2way_fwrite;
+	outbuf->gawk_fflush = rev2way_fflush;
+	outbuf->gawk_ferror = rev2way_ferror;
+	outbuf->gawk_fclose = rev2way_fclose;
+	outbuf->redirected = awk_true;
+
+	return awk_true;
+}
+
+static awk_two_way_processor_t two_way_processor = {
+	"revtwoway",
+	revtwoway_can_take_two_way,
+	revtwoway_take_control_of,
+	NULL
+};
+
+/* init_revtwoway --- set things ups */
+
+static awk_bool_t
+init_revtwoway()
+{
+	register_two_way_processor(& two_way_processor);
+
+	max_fds = getdtablesize();
+
+	return awk_true;
+}
+
+static awk_ext_func_t func_table[] = {
+	{ NULL, NULL, 0, 0, awk_false, NULL }
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, revtwoway, "")
diff --git a/gawk-5.0.1/extension/rwarray.3am b/gawk-5.0.1/extension/rwarray.3am
new file mode 100644
index 00000000000..f17ffaa9ee7
--- /dev/null
+++ b/gawk-5.0.1/extension/rwarray.3am
@@ -0,0 +1,104 @@
+.TH RWARRAY 3am "Feb 02 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+writea, reada \- write and read gawk arrays to/from files
+.SH SYNOPSIS
+.ft CW
+@load "rwarray"
+.sp
+ret = writea(file, array)
+.br
+ret = reada(file, array)
+.ft R
+.SH DESCRIPTION
+The
+.I rwarray
+extension adds two functions named
+.BR writea() .
+and
+.BR reada() ,
+as follows.
+.TP
+.B writea()
+This function takes a string argument, which is the name of the
+file to which dump the array, and the array itself as the second
+argument.
+.B writea()
+understands multidimensional arrays.
+It returns one on success, or zero upon failure.
+.TP
+.B reada()
+is the inverse of
+.BR writea() ;
+it reads the file named as its first argument, filling in
+the array named as the second argument. It clears the array
+first.
+Here too, the return value is one on success and zero upon failure.
+.SH NOTES
+The array created by
+.B reada()
+is identical to that written by
+.B writea()
+in the sense that the contents are the same. However, due
+to implementation issues, the array traversal order of the recreated
+array will likely be different from that of the original array.
+As array traversal order in AWK is by default undefined, this is
+not (technically) a problem.  If you need to guarantee a particular
+traversal order, use the array sorting features in
+.I gawk
+to do so.
+.PP
+The file contains binary data.  All integral values are written
+in network byte order.
+However, double precision floating-point values are written as
+native binary data.  Thus, arrays containing only string data
+can theoretically be dumped on systems with one byte order and
+restored on systems with a different one, but this has not been tried.
+.\" .SH BUGS
+.SH EXAMPLE
+.ft CW
+.nf
+@load "rwarray"
+\&...
+ret = writea("arraydump.bin", array)
+\&...
+ret = reada("arraydump.bin", array)
+.fi
+.ft R
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fnmatch (3am),
+.IR fork (3am),
+.IR inplace (3am),
+.IR ordchr (3am),
+.IR readdir (3am),
+.IR readfile (3am),
+.IR revoutput (3am),
+.IR time (3am).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/rwarray.c b/gawk-5.0.1/extension/rwarray.c
new file mode 100644
index 00000000000..9ba2dca41ef
--- /dev/null
+++ b/gawk-5.0.1/extension/rwarray.c
@@ -0,0 +1,514 @@
+/*
+ * rwarray.c - Builtin functions to binary read / write arrays to a file.
+ *
+ * Arnold Robbins
+ * May 2009
+ * Redone June 2012
+ * Improved September 2017
+ */
+
+/*
+ * Copyright (C) 2009-2014, 2017, 2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef __MINGW32__
+#include <winsock2.h>
+#include <stdint.h>
+#else
+#include <arpa/inet.h>
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#define MAGIC "awkrulz\n"
+#define MAJOR 3
+#define MINOR 1
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "rwarray extension: version 1.2";
+static awk_bool_t (*init_func)(void) = NULL;
+
+int plugin_is_GPL_compatible;
+
+static awk_bool_t write_array(FILE *fp, awk_array_t array);
+static awk_bool_t write_elem(FILE *fp, awk_element_t *element);
+static awk_bool_t write_value(FILE *fp, awk_value_t *val);
+
+static awk_bool_t read_array(FILE *fp, awk_array_t array);
+static awk_bool_t read_elem(FILE *fp, awk_element_t *element);
+static awk_bool_t read_value(FILE *fp, awk_value_t *value);
+
+/*
+ * Format of array info:
+ *
+ * MAGIC		8 bytes
+ * Major version	4 bytes - network order
+ * Minor version	4 bytes - network order
+ * Element count	4 bytes - network order
+ * Elements
+ *
+ * For each element:
+ * Length of index val:	4 bytes - network order
+ * Index val as characters (N bytes)
+ * Value type		4 bytes (0 = string, 1 = number, 2 = array, 3 = regex, 4 = strnum, 5 = undefined)
+ * IF string:
+ * 	Length of value	4 bytes
+ * 	Value as characters (N bytes)
+ * ELSE IF number:
+ * 	8 bytes as native double
+ * ELSE
+ * 	Element count
+ * 	Elements
+ * END IF
+ */
+
+/* do_writea --- write an array */
+
+static awk_value_t *
+do_writea(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t filename, array;
+	FILE *fp = NULL;
+	uint32_t major = MAJOR;
+	uint32_t minor = MINOR;
+
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs < 2)
+		goto out;
+
+	/* filename is first arg, array to dump is second */
+	if (! get_argument(0, AWK_STRING, & filename)) {
+		fprintf(stderr, _("do_writea: argument 0 is not a string\n"));
+		errno = EINVAL;
+		goto done1;
+	}
+
+	if (! get_argument(1, AWK_ARRAY, & array)) {
+		fprintf(stderr, _("do_writea: argument 1 is not an array\n"));
+		errno = EINVAL;
+		goto done1;
+	}
+
+	/* open the file, if error, set ERRNO and return */
+	fp = fopen(filename.str_value.str, "wb");
+	if (fp == NULL)
+		goto done1;
+
+	if (fwrite(MAGIC, 1, strlen(MAGIC), fp) != strlen(MAGIC))
+		goto done1;
+
+	major = htonl(major);
+	if (fwrite(& major, 1, sizeof(major), fp) != sizeof(major))
+		goto done1;
+
+	minor = htonl(minor);
+	if (fwrite(& minor, 1, sizeof(minor), fp) != sizeof(minor))
+		goto done1;
+
+	if (write_array(fp, array.array_cookie)) {
+		make_number(1.0, result);
+		goto done0;
+	}
+
+done1:
+	update_ERRNO_int(errno);
+	unlink(filename.str_value.str);
+
+done0:
+	fclose(fp);
+out:
+	return result;
+}
+
+
+/* write_array --- write out an array or a sub-array */
+
+static awk_bool_t
+write_array(FILE *fp, awk_array_t array)
+{
+	uint32_t i;
+	uint32_t count;
+	awk_flat_array_t *flat_array;
+
+	if (! flatten_array(array, & flat_array)) {
+		fprintf(stderr, _("write_array: could not flatten array\n"));
+		return awk_false;
+	}
+
+	count = htonl(flat_array->count);
+	if (fwrite(& count, 1, sizeof(count), fp) != sizeof(count))
+		return awk_false;
+
+	for (i = 0; i < flat_array->count; i++) {
+		if (! write_elem(fp, & flat_array->elements[i])) {
+			(void) release_flattened_array(array, flat_array);
+			return awk_false;
+		}
+	}
+
+	if (! release_flattened_array(array, flat_array)) {
+		fprintf(stderr, _("write_array: could not release flattened array\n"));
+		return awk_false;
+	}
+
+	return awk_true;
+}
+
+/* write_elem --- write out a single element */
+
+static awk_bool_t
+write_elem(FILE *fp, awk_element_t *element)
+{
+	uint32_t indexval_len;
+	ssize_t write_count;
+
+	indexval_len = htonl(element->index.str_value.len);
+	if (fwrite(& indexval_len, 1, sizeof(indexval_len), fp) != sizeof(indexval_len))
+		return awk_false;
+
+	if (element->index.str_value.len > 0) {
+		write_count = fwrite(element->index.str_value.str,
+				1, element->index.str_value.len, fp);
+		if (write_count != (ssize_t) element->index.str_value.len)
+			return awk_false;
+	}
+
+	return write_value(fp, & element->value);
+}
+
+/* write_value --- write a number or a string or a strnum or a regex or an array */
+
+static awk_bool_t
+write_value(FILE *fp, awk_value_t *val)
+{
+	uint32_t code, len;
+
+	if (val->val_type == AWK_ARRAY) {
+		code = htonl(2);
+		if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code))
+			return awk_false;
+		return write_array(fp, val->array_cookie);
+	}
+
+	if (val->val_type == AWK_NUMBER) {
+		code = htonl(1);
+		if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code))
+			return awk_false;
+
+		if (fwrite(& val->num_value, 1, sizeof(val->num_value), fp) != sizeof(val->num_value))
+			return awk_false;
+	} else {
+		switch (val->val_type) {
+		case AWK_STRING:
+			code = htonl(0);
+			break;
+		case AWK_STRNUM:
+			code = htonl(4);
+			break;
+		case AWK_REGEX:
+			code = htonl(3);
+			break;
+		case AWK_UNDEFINED:
+			code = htonl(5);
+			break;
+		default:
+			/* XXX can this happen? */
+			code = htonl(0);
+			warning(ext_id, _("array value has unknown type %d"), val->val_type);
+			break;
+		}
+		if (fwrite(& code, 1, sizeof(code), fp) != sizeof(code))
+			return awk_false;
+
+		len = htonl(val->str_value.len);
+		if (fwrite(& len, 1, sizeof(len), fp) != sizeof(len))
+			return awk_false;
+
+		if (fwrite(val->str_value.str, 1, val->str_value.len, fp)
+				!= (ssize_t) val->str_value.len)
+			return awk_false;
+	}
+
+	return awk_true;
+}
+
+/* do_reada --- read an array */
+
+static awk_value_t *
+do_reada(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t filename, array;
+	FILE *fp = NULL;
+	uint32_t major;
+	uint32_t minor;
+	char magic_buf[30];
+
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs < 2)
+		goto out;
+
+	/* directory is first arg, array to read is second */
+	if (! get_argument(0, AWK_STRING, & filename)) {
+		fprintf(stderr, _("do_reada: argument 0 is not a string\n"));
+		errno = EINVAL;
+		goto done1;
+	}
+
+	if (! get_argument(1, AWK_ARRAY, & array)) {
+		fprintf(stderr, _("do_reada: argument 1 is not an array\n"));
+		errno = EINVAL;
+		goto done1;
+	}
+
+	fp = fopen(filename.str_value.str, "rb");
+	if (fp == NULL)
+		goto done1;
+
+	memset(magic_buf, '\0', sizeof(magic_buf));
+	if (fread(magic_buf, 1, strlen(MAGIC), fp) != strlen(MAGIC)) {
+		errno = EBADF;
+		goto done1;
+	}
+
+	if (strcmp(magic_buf, MAGIC) != 0) {
+		errno = EBADF;
+		goto done1;
+	}
+
+	if (fread(& major, 1, sizeof(major), fp) != sizeof(major)) {
+		errno = EBADF;
+		goto done1;
+	}
+	major = ntohl(major);
+
+	if (major != MAJOR) {
+		errno = EBADF;
+		goto done1;
+	}
+
+	if (fread(& minor, 1, sizeof(minor), fp) != sizeof(minor)) {
+		/* read() sets errno */
+		goto done1;
+	}
+
+	minor = ntohl(minor);
+	if (minor != MINOR) {
+		errno = EBADF;
+		goto done1;
+	}
+
+	if (! clear_array(array.array_cookie)) {
+		errno = ENOMEM;
+		fprintf(stderr, _("do_reada: clear_array failed\n"));
+		goto done1;
+	}
+
+	if (read_array(fp, array.array_cookie)) {
+		make_number(1.0, result);
+		goto done0;
+	}
+
+done1:
+	update_ERRNO_int(errno);
+done0:
+	if (fp != NULL)
+		fclose(fp);
+out:
+	return result;
+}
+
+
+/* read_array --- read in an array or sub-array */
+
+static awk_bool_t
+read_array(FILE *fp, awk_array_t array)
+{
+	uint32_t i;
+	uint32_t count;
+	awk_element_t new_elem;
+
+	if (fread(& count, 1, sizeof(count), fp) != sizeof(count))
+		return awk_false;
+
+	count = ntohl(count);
+
+	for (i = 0; i < count; i++) {
+		if (read_elem(fp, & new_elem)) {
+			/* add to array */
+			if (! set_array_element_by_elem(array, & new_elem)) {
+				fprintf(stderr, _("read_array: set_array_element failed\n"));
+				return awk_false;
+			}
+		} else
+			break;
+	}
+
+	if (i != count)
+		return awk_false;
+
+	return awk_true;
+}
+
+/* read_elem --- read in a single element */
+
+static awk_bool_t
+read_elem(FILE *fp, awk_element_t *element)
+{
+	uint32_t index_len;
+	static char *buffer;
+	static uint32_t buflen;
+	ssize_t ret;
+
+	if ((ret = fread(& index_len, 1, sizeof(index_len), fp)) != sizeof(index_len)) {
+		return awk_false;
+	}
+	index_len = ntohl(index_len);
+
+	memset(element, 0, sizeof(*element));
+
+	if (index_len > 0) {
+		if (buffer == NULL) {
+			/* allocate buffer */
+			emalloc(buffer, char *, index_len, "read_elem");
+			buflen = index_len;
+		} else if (buflen < index_len) {
+			/* reallocate buffer */
+			char *cp = gawk_realloc(buffer, index_len);
+
+			if (cp == NULL)
+				return awk_false;
+
+			buffer = cp;
+			buflen = index_len;
+		}
+
+		if (fread(buffer, 1, index_len, fp) != (ssize_t) index_len) {
+			return awk_false;
+		}
+		make_const_string(buffer, index_len, & element->index);
+	} else {
+		make_null_string(& element->index);
+	}
+
+	if (! read_value(fp, & element->value))
+		return awk_false;
+
+	return awk_true;
+}
+
+/* read_value --- read a number or a string */
+
+static awk_bool_t
+read_value(FILE *fp, awk_value_t *value)
+{
+	uint32_t code, len;
+
+	if (fread(& code, 1, sizeof(code), fp) != sizeof(code))
+		return awk_false;
+
+	code = ntohl(code);
+
+	if (code == 2) {
+		awk_array_t array = create_array();
+
+		if (! read_array(fp, array))
+			return awk_false;
+
+		/* hook into value */
+		value->val_type = AWK_ARRAY;
+		value->array_cookie = array;
+	} else if (code == 1) {
+		double d;
+
+		if (fread(& d, 1, sizeof(d), fp) != sizeof(d))
+			return awk_false;
+
+		/* hook into value */
+		value->val_type = AWK_NUMBER;
+		value->num_value = d;
+	} else {
+		if (fread(& len, 1, sizeof(len), fp) != sizeof(len)) {
+			return awk_false;
+		}
+		len = ntohl(len);
+		switch (code) {
+		case 0:
+			value->val_type = AWK_STRING;
+			break;
+		case 3:
+			value->val_type = AWK_REGEX;
+			break;
+		case 4:
+			value->val_type = AWK_STRNUM;
+			break;
+		case 5:
+			value->val_type = AWK_UNDEFINED;
+			break;
+		default:
+			/* this cannot happen! */
+			warning(ext_id, _("treating recovered value with unknown type code %d as a string"), code);
+			value->val_type = AWK_STRING;
+			break;
+		}
+		value->str_value.len = len;
+		value->str_value.str = gawk_malloc(len + 1);
+
+		if (fread(value->str_value.str, 1, len, fp) != (ssize_t) len) {
+			gawk_free(value->str_value.str);
+			return awk_false;
+		}
+		value->str_value.str[len] = '\0';
+	}
+
+	return awk_true;
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "writea", do_writea, 2, 2, awk_false, NULL },
+	{ "reada", do_reada, 2, 2, awk_false, NULL },
+};
+
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, rwarray, "")
diff --git a/gawk-5.0.1/extension/rwarray0.c b/gawk-5.0.1/extension/rwarray0.c
new file mode 100644
index 00000000000..726570db413
--- /dev/null
+++ b/gawk-5.0.1/extension/rwarray0.c
@@ -0,0 +1,470 @@
+/*
+ * rwarray.c - Builtin functions to binary read / write arrays to a file.
+ *
+ * Arnold Robbins
+ * May 2009
+ * Redone June 2012
+ */
+
+/*
+ * Copyright (C) 2009, 2010, 2011, 2012, 2013, 2018
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+#define MAGIC "awkrulz\n"
+#define MAJOR 3
+#define MINOR 0
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "rwarray0 extension: version 1.0";
+static awk_bool_t (*init_func)(void) = NULL;
+
+int plugin_is_GPL_compatible;
+
+static awk_bool_t write_array(int fd, awk_array_t array);
+static awk_bool_t write_elem(int fd, awk_element_t *element);
+static awk_bool_t write_value(int fd, awk_value_t *val);
+
+static awk_bool_t read_array(int fd, awk_array_t array);
+static awk_bool_t read_elem(int fd, awk_element_t *element);
+static awk_bool_t read_value(int fd, awk_value_t *value);
+
+/*
+ * Format of array info:
+ *
+ * MAGIC		8 bytes
+ * Major version	4 bytes - network order
+ * Minor version	4 bytes - network order
+ * Element count	4 bytes - network order
+ * Elements
+ *
+ * For each element:
+ * Length of index val:	4 bytes - network order
+ * Index val as characters (N bytes)
+ * Value type		4 bytes (0 = string, 1 = number, 2 = array)
+ * IF string:
+ * 	Length of value	4 bytes
+ * 	Value as characters (N bytes)
+ * ELSE IF number:
+ * 	8 bytes as native double
+ * ELSE
+ * 	Element count
+ * 	Elements
+ * END IF
+ */
+
+/* do_writea --- write an array */
+
+static awk_value_t *
+do_writea(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t filename, array;
+	int fd = -1;
+	uint32_t major = MAJOR;
+	uint32_t minor = MINOR;
+
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs < 2)
+		goto out;
+
+	/* directory is first arg, array to dump is second */
+	if (! get_argument(0, AWK_STRING, & filename)) {
+		fprintf(stderr, _("do_writea: argument 0 is not a string\n"));
+		errno = EINVAL;
+		goto done1;
+	}
+
+	if (! get_argument(1, AWK_ARRAY, & array)) {
+		fprintf(stderr, _("do_writea: argument 1 is not an array\n"));
+		errno = EINVAL;
+		goto done1;
+	}
+
+	/* open the file, if error, set ERRNO and return */
+	fd = creat(filename.str_value.str, 0600);
+	if (fd < 0)
+		goto done1;
+
+	if (write(fd, MAGIC, strlen(MAGIC)) != strlen(MAGIC))
+		goto done1;
+
+	major = htonl(major);
+	if (write(fd, & major, sizeof(major)) != sizeof(major))
+		goto done1;
+
+	minor = htonl(minor);
+	if (write(fd, & minor, sizeof(minor)) != sizeof(minor))
+		goto done1;
+
+	if (write_array(fd, array.array_cookie)) {
+		make_number(1.0, result);
+		goto done0;
+	}
+
+done1:
+	update_ERRNO_int(errno);
+	unlink(filename.str_value.str);
+
+done0:
+	close(fd);
+out:
+	return result;
+}
+
+
+/* write_array --- write out an array or a sub-array */
+
+static awk_bool_t
+write_array(int fd, awk_array_t array)
+{
+	uint32_t i;
+	uint32_t count;
+	awk_flat_array_t *flat_array;
+
+	if (! flatten_array(array, & flat_array)) {
+		fprintf(stderr, _("write_array: could not flatten array\n"));
+		return awk_false;
+	}
+
+	count = htonl(flat_array->count);
+	if (write(fd, & count, sizeof(count)) != sizeof(count))
+		return awk_false;
+
+	for (i = 0; i < flat_array->count; i++) {
+		if (! write_elem(fd, & flat_array->elements[i]))
+			return awk_false;
+	}
+
+	if (! release_flattened_array(array, flat_array)) {
+		fprintf(stderr, _("write_array: could not release flattened array\n"));
+		return awk_false;
+	}
+
+	return awk_true;
+}
+
+/* write_elem --- write out a single element */
+
+static awk_bool_t
+write_elem(int fd, awk_element_t *element)
+{
+	uint32_t indexval_len;
+	ssize_t write_count;
+
+	indexval_len = htonl(element->index.str_value.len);
+	if (write(fd, & indexval_len, sizeof(indexval_len)) != sizeof(indexval_len))
+		return awk_false;
+
+	if (element->index.str_value.len > 0) {
+		write_count = write(fd, element->index.str_value.str,
+				element->index.str_value.len);
+		if (write_count != (ssize_t) element->index.str_value.len)
+			return awk_false;
+	}
+
+	return write_value(fd, & element->value);
+}
+
+/* write_value --- write a number or a string or a array */
+
+static awk_bool_t
+write_value(int fd, awk_value_t *val)
+{
+	uint32_t code, len;
+
+	if (val->val_type == AWK_ARRAY) {
+		code = htonl(2);
+		if (write(fd, & code, sizeof(code)) != sizeof(code))
+			return awk_false;
+		return write_array(fd, val->array_cookie);
+	}
+
+	if (val->val_type == AWK_NUMBER) {
+		code = htonl(1);
+		if (write(fd, & code, sizeof(code)) != sizeof(code))
+			return awk_false;
+
+		if (write(fd, & val->num_value, sizeof(val->num_value)) != sizeof(val->num_value))
+			return awk_false;
+	} else {
+		code = 0;
+		if (write(fd, & code, sizeof(code)) != sizeof(code))
+			return awk_false;
+
+		len = htonl(val->str_value.len);
+		if (write(fd, & len, sizeof(len)) != sizeof(len))
+			return awk_false;
+
+		if (write(fd, val->str_value.str, val->str_value.len)
+				!= (ssize_t) val->str_value.len)
+			return awk_false;
+	}
+
+	return awk_true;
+}
+
+/* do_reada --- read an array */
+
+static awk_value_t *
+do_reada(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t filename, array;
+	int fd = -1;
+	uint32_t major;
+	uint32_t minor;
+	char magic_buf[30];
+
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs < 2)
+		goto out;
+
+	/* directory is first arg, array to read is second */
+	if (! get_argument(0, AWK_STRING, & filename)) {
+		fprintf(stderr, _("do_reada: argument 0 is not a string\n"));
+		errno = EINVAL;
+		goto done1;
+	}
+
+	if (! get_argument(1, AWK_ARRAY, & array)) {
+		fprintf(stderr, _("do_reada: argument 1 is not an array\n"));
+		errno = EINVAL;
+		goto done1;
+	}
+
+	fd = open(filename.str_value.str, O_RDONLY);
+	if (fd < 0)
+		goto done1;
+
+	memset(magic_buf, '\0', sizeof(magic_buf));
+	if (read(fd, magic_buf, strlen(MAGIC)) != strlen(MAGIC)) {
+		errno = EBADF;
+		goto done1;
+	}
+
+	if (strcmp(magic_buf, MAGIC) != 0) {
+		errno = EBADF;
+		goto done1;
+	}
+
+	if (read(fd, & major, sizeof(major)) != sizeof(major)) {
+		errno = EBADF;
+		goto done1;
+	}
+	major = ntohl(major);
+
+	if (major != MAJOR) {
+		errno = EBADF;
+		goto done1;
+	}
+
+	if (read(fd, & minor, sizeof(minor)) != sizeof(minor)) {
+		/* read() sets errno */
+		goto done1;
+	}
+
+	minor = ntohl(minor);
+	if (minor != MINOR) {
+		errno = EBADF;
+		goto done1;
+	}
+
+	if (! clear_array(array.array_cookie)) {
+		errno = ENOMEM;
+		fprintf(stderr, _("do_reada: clear_array failed\n"));
+		goto done1;
+	}
+
+	if (read_array(fd, array.array_cookie)) {
+		make_number(1.0, result);
+		goto done0;
+	}
+
+done1:
+	update_ERRNO_int(errno);
+done0:
+	close(fd);
+out:
+	return result;
+}
+
+
+/* read_array --- read in an array or sub-array */
+
+static awk_bool_t
+read_array(int fd, awk_array_t array)
+{
+	uint32_t i;
+	uint32_t count;
+	awk_element_t new_elem;
+
+	if (read(fd, & count, sizeof(count)) != sizeof(count)) {
+		return awk_false;
+	}
+	count = ntohl(count);
+
+	for (i = 0; i < count; i++) {
+		if (read_elem(fd, & new_elem)) {
+			/* add to array */
+			if (! set_array_element_by_elem(array, & new_elem)) {
+				fprintf(stderr, _("read_array: set_array_element failed\n"));
+				return awk_false;
+			}
+		} else
+			break;
+	}
+
+	if (i != count)
+		return awk_false;
+
+	return awk_true;
+}
+
+/* read_elem --- read in a single element */
+
+static awk_bool_t
+read_elem(int fd, awk_element_t *element)
+{
+	uint32_t index_len;
+	static char *buffer;
+	static uint32_t buflen;
+	ssize_t ret;
+
+	if ((ret = read(fd, & index_len, sizeof(index_len))) != sizeof(index_len)) {
+		return awk_false;
+	}
+	index_len = ntohl(index_len);
+
+	memset(element, 0, sizeof(*element));
+
+	if (index_len > 0) {
+		if (buffer == NULL) {
+			// allocate buffer
+			emalloc(buffer, char *, index_len, "read_elem");
+			buflen = index_len;
+		} else if (buflen < index_len) {
+			// reallocate buffer
+			char *cp = realloc(buffer, index_len);
+
+			if (cp == NULL)
+				return awk_false;
+
+			buffer = cp;
+			buflen = index_len;
+		}
+
+		if (read(fd, buffer, index_len) != (ssize_t) index_len) {
+			return awk_false;
+		}
+		make_const_string(buffer, index_len, & element->index);
+	} else {
+		make_null_string(& element->index);
+	}
+
+	if (! read_value(fd, & element->value))
+		return awk_false;
+
+	return awk_true;
+}
+
+/* read_value --- read a number or a string */
+
+static awk_bool_t
+read_value(int fd, awk_value_t *value)
+{
+	uint32_t code, len;
+
+	if (read(fd, & code, sizeof(code)) != sizeof(code))
+		return awk_false;
+
+	code = ntohl(code);
+
+	if (code == 2) {
+		awk_array_t array = create_array();
+
+		if (read_array(fd, array) != 0)
+			return awk_false;
+
+		/* hook into value */
+		value->val_type = AWK_ARRAY;
+		value->array_cookie = array;
+	} else if (code == 1) {
+		double d;
+
+		if (read(fd, & d, sizeof(d)) != sizeof(d))
+			return awk_false;
+
+		/* hook into value */
+		value->val_type = AWK_NUMBER;
+		value->num_value = d;
+	} else {
+		if (read(fd, & len, sizeof(len)) != sizeof(len)) {
+			return awk_false;
+		}
+		len = ntohl(len);
+		value->val_type = AWK_STRING;
+		value->str_value.len = len;
+		value->str_value.str = malloc(len + 1);
+
+		if (read(fd, value->str_value.str, len) != (ssize_t) len) {
+			free(value->str_value.str);
+			return awk_false;
+		}
+		value->str_value.str[len] = '\0';
+	}
+
+	return awk_true;
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "writea", do_writea, 2, 2, awk_false, NULL },
+	{ "reada", do_reada, 2, 2, awk_false, NULL },
+};
+
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, rwarray, "")
diff --git a/gawk-5.0.1/extension/stack.c b/gawk-5.0.1/extension/stack.c
new file mode 100644
index 00000000000..637378e2229
--- /dev/null
+++ b/gawk-5.0.1/extension/stack.c
@@ -0,0 +1,90 @@
+/*
+ * stack.c -- Implementation for stack functions for use by extensions.
+ */
+
+/*
+ * Copyright (C) 2012, 2013 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include <stdlib.h>
+
+#include "stack.h"
+
+#define INITIAL_STACK	20
+
+static size_t size;
+static void **stack;
+static int index = -1;
+
+/* stack_empty --- return true if stack is empty */
+
+int
+stack_empty()
+{
+	return index < 0;
+}
+
+/* stack_top --- return top object on the stack */
+
+void *
+stack_top()
+{
+	if (stack_empty() || stack == NULL)
+		return NULL;
+
+	return stack[index];
+}
+
+/* stack_pop --- pop top object and return it */
+
+void *
+stack_pop()
+{
+	if (stack_empty() || stack == NULL)
+		return NULL;
+
+	return stack[index--];
+}
+
+/* stack_push --- push an object onto the stack */
+
+int stack_push(void *object)
+{
+	void **new_stack;
+	size_t new_size = 2 * size;
+
+	if (stack == NULL) {
+		stack = (void **) malloc(INITIAL_STACK * sizeof(void *));
+		if (stack == NULL)
+			return 0;
+		size = INITIAL_STACK;
+	} else if (index + 1 >= size) {
+		if (new_size < size)
+			return 0;
+		new_stack = realloc(stack, new_size * sizeof(void *));
+		if (new_stack == NULL)
+			return 0;
+		size = new_size;
+		stack = new_stack;
+	}
+
+	stack[++index] = object;
+	return 1;
+}
diff --git a/gawk-5.0.1/extension/stack.h b/gawk-5.0.1/extension/stack.h
new file mode 100644
index 00000000000..9643fb34c37
--- /dev/null
+++ b/gawk-5.0.1/extension/stack.h
@@ -0,0 +1,31 @@
+/*
+ * stack.h -- Definitions for stack functions for use by extensions.
+ */
+
+/* 
+ * Copyright (C) 2012, 2013 the Free Software Foundation, Inc.
+ * 
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ * 
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+extern int stack_empty();	/* return true if stack is empty */
+extern void *stack_top();	/* return top object on the stack */
+extern void *stack_pop();	/* pop top object and return it */
+extern int stack_push(void *);	/* push an object onto the stack,
+				 * return 0 if failed, 1 if success 
+				 */
diff --git a/gawk-5.0.1/extension/testext.c b/gawk-5.0.1/extension/testext.c
new file mode 100644
index 00000000000..b911ec93052
--- /dev/null
+++ b/gawk-5.0.1/extension/testext.c
@@ -0,0 +1,1126 @@
+/*
+ * testext.c - tests for the extension API.
+ */
+
+/*
+ * Copyright (C) 2012, 2013, 2014, 2015, 2017, 2018
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "gawkapi.h"
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "testext extension: version 1.0";
+
+int plugin_is_GPL_compatible;
+
+static void fill_in_array(awk_value_t *value);
+
+#ifdef __MINGW32__
+unsigned int
+getuid (void)
+{
+  /* See pc/getid.c.  */
+  return 0;
+}
+#endif
+
+/* valrep2str --- turn a value into a string */
+
+static const char *
+valrep2str(const awk_value_t *value)
+{
+	static char buf[BUFSIZ];
+	int size = BUFSIZ - 3;
+
+	switch (value->val_type) {
+	case AWK_UNDEFINED:
+		strcpy(buf, "<undefined>");
+		break;
+	case AWK_ARRAY:
+		strcpy(buf, "<array>");
+		break;
+	case AWK_SCALAR:
+		strcpy(buf, "<scalar>");
+		break;
+	case AWK_VALUE_COOKIE:
+		strcpy(buf, "<value-cookie>");
+		break;
+	case AWK_REGEX:
+	case AWK_STRNUM:
+	case AWK_STRING:
+		if (value->str_value.len < size)
+			size = value->str_value.len;
+		sprintf(buf, "\"%.*s\"",
+				size,
+				value->str_value.str);
+		break;
+	case AWK_NUMBER:
+		sprintf(buf, "%g", value->num_value);
+		break;
+	}
+	return buf;
+}
+
+/*
+ * The awk code for these tests is embedded in this file and then extracted
+ * dynamically to create the script that is run together with this extension.
+ * Extraction requires the format for awk code where test code is enclosed
+ * in a BEGIN block, with the BEGIN and close brace on lines by themselves
+ * and at the front of the lines.
+ */
+
+/*
+@load "testext"
+BEGIN {
+	n = split("blacky rusty sophie raincloud lucky", pets)
+	printf("pets has %d elements\n", length(pets))
+	ret = dump_array_and_delete("pets", "3")
+	printf("dump_array_and_delete(pets) returned %d\n", ret)
+	if ("3" in pets)
+		printf("dump_array_and_delete() did NOT remove index \"3\"!\n")
+	else
+		printf("dump_array_and_delete() did remove index \"3\"!\n")
+	print ""
+}
+*/
+static awk_value_t *
+dump_array_and_delete(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t value, value2, value3;
+	awk_flat_array_t *flat_array;
+	size_t count;
+	char *name;
+	int i;
+
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs != 2) {
+		printf("dump_array_and_delete: nargs not right (%d should be 2)\n", nargs);
+		goto out;
+	}
+
+	/* get argument named array as flat array and print it */
+	if (get_argument(0, AWK_STRING, & value)) {
+		name = value.str_value.str;
+		if (sym_lookup(name, AWK_ARRAY, & value2))
+			printf("dump_array_and_delete: sym_lookup of %s passed\n", name);
+		else {
+			printf("dump_array_and_delete: sym_lookup of %s failed\n", name);
+			goto out;
+		}
+	} else {
+		printf("dump_array_and_delete: get_argument(0) failed\n");
+		goto out;
+	}
+
+	if (! get_element_count(value2.array_cookie, & count)) {
+		printf("dump_array_and_delete: get_element_count failed\n");
+		goto out;
+	}
+
+	printf("dump_array_and_delete: incoming size is %lu\n", (unsigned long) count);
+
+	if (! flatten_array(value2.array_cookie, & flat_array)) {
+		printf("dump_array_and_delete: could not flatten array\n");
+		goto out;
+	}
+
+	if (flat_array->count != count) {
+		printf("dump_array_and_delete: flat_array->count (%lu) != count (%lu)\n",
+				(unsigned long) flat_array->count,
+				(unsigned long) count);
+		goto out;
+	}
+
+	if (! get_argument(1, AWK_STRING, & value3)) {
+		printf("dump_array_and_delete: get_argument(1) failed\n");
+		goto out;
+	}
+
+	for (i = 0; i < flat_array->count; i++) {
+		printf("\t%s[\"%.*s\"] = %s\n",
+			name,
+			(int) flat_array->elements[i].index.str_value.len,
+			flat_array->elements[i].index.str_value.str,
+			valrep2str(& flat_array->elements[i].value));
+
+		if (strcmp(value3.str_value.str, flat_array->elements[i].index.str_value.str) == 0) {
+			flat_array->elements[i].flags |= AWK_ELEMENT_DELETE;
+			printf("dump_array_and_delete: marking element \"%s\" for deletion\n",
+				flat_array->elements[i].index.str_value.str);
+		}
+	}
+
+	if (! release_flattened_array(value2.array_cookie, flat_array)) {
+		printf("dump_array_and_delete: could not release flattened array\n");
+		goto out;
+	}
+
+	make_number(1.0, result);
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	ENVIRON["testext"]++
+	try_modify_environ()
+	if ("testext" in ENVIRON)
+		print "try_del_environ() could not delete element - pass"
+	else
+		print "try_del_environ() deleted element! - fail"
+	if ("testext2" in ENVIRON)
+		print "try_del_environ() added an element - fail"
+	else
+		print "try_del_environ() could not add an element - pass"
+}
+*/
+
+static awk_value_t *
+try_modify_environ(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t value, index, newvalue;
+	awk_flat_array_t *flat_array;
+	awk_array_t environ_array;
+	size_t count;
+	int i;
+
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs != 0) {
+		printf("try_modify_environ: nargs not right (%d should be 0)\n", nargs);
+		goto out;
+	}
+
+	/* get ENVIRON array */
+	if (sym_lookup("ENVIRON", AWK_ARRAY, & value))
+		printf("try_modify_environ: sym_lookup of ENVIRON passed\n");
+	else {
+		printf("try_modify_environ: sym_lookup of ENVIRON failed\n");
+		goto out;
+	}
+
+	environ_array = value.array_cookie;
+	if (! get_element_count(environ_array, & count)) {
+		printf("try_modify_environ: get_element_count failed\n");
+		goto out;
+	}
+
+	/* setting an array element should fail */
+	(void) make_const_string("testext2", 8, & index);
+	(void) make_const_string("a value", 7, & value);
+	if (set_array_element(environ_array, & index, & newvalue)) {
+		printf("try_modify_environ: set_array_element of ENVIRON passed\n");
+	} else {
+		printf("try_modify_environ: set_array_element of ENVIRON failed\n");
+		gawk_free(index.str_value.str);
+		gawk_free(value.str_value.str);
+	}
+
+	if (! flatten_array(environ_array, & flat_array)) {
+		printf("try_modify_environ: could not flatten array\n");
+		goto out;
+	}
+
+	if (flat_array->count != count) {
+		printf("try_modify_environ: flat_array->count (%lu) != count (%lu)\n",
+				(unsigned long) flat_array->count,
+				(unsigned long) count);
+		goto out;
+	}
+
+	for (i = 0; i < flat_array->count; i++) {
+		/* don't print */
+	/*
+		printf("\t%s[\"%.*s\"] = %s\n",
+			name,
+			(int) flat_array->elements[i].index.str_value.len,
+			flat_array->elements[i].index.str_value.str,
+			valrep2str(& flat_array->elements[i].value));
+	*/
+		if (strcmp("testext", flat_array->elements[i].index.str_value.str) == 0) {
+			flat_array->elements[i].flags |= AWK_ELEMENT_DELETE;
+			printf("try_modify_environ: marking element \"%s\" for deletion\n",
+				flat_array->elements[i].index.str_value.str);
+		}
+	}
+
+	if (! release_flattened_array(environ_array, flat_array)) {
+		printf("try_modify_environ: could not release flattened array\n");
+		goto out;
+	}
+
+	make_number(1.0, result);
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	testvar = "One Adam Twelve"
+	ret = var_test("testvar")
+	printf("var_test() returned %d, test_var = %s\n", ret, testvar)
+	print ""
+}
+*/
+
+static awk_value_t *
+var_test(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t value, value2;
+	awk_value_t *valp;
+
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs != 1) {
+		printf("var_test: nargs not right (%d should be 1)\n", nargs);
+		goto out;
+	}
+
+	/* look up PROCINFO - should succeed fail */
+	if (sym_lookup("PROCINFO", AWK_ARRAY, & value))
+		printf("var_test: sym_lookup of PROCINFO passed - got a value!\n");
+	else
+		printf("var_test: sym_lookup of PROCINFO failed - did not get a value\n");
+
+	/* look up a reserved variable - should pass */
+	if (sym_lookup("ARGC", AWK_NUMBER, & value))
+		printf("var_test: sym_lookup of ARGC passed - got a value!\n");
+	else
+		printf("var_test: sym_lookup of ARGC failed - did not get a value\n");
+
+	/* now try to set it - should fail */
+	value.num_value++;
+	if (sym_update("ARGC", & value))
+		printf("var_test: sym_update of ARGC passed and should not have!\n");
+	else
+		printf("var_test: sym_update of ARGC failed - correctly\n");
+
+	/* look up variable whose name is passed in, should pass */
+	if (get_argument(0, AWK_STRING, & value)) {
+		if (sym_lookup(value.str_value.str, AWK_STRING, & value2)) {
+			/* change the value, should be reflected in awk script */
+			valp = make_number(42.0, & value2);
+
+			if (sym_update(value.str_value.str, valp)) {
+				printf("var_test: sym_update(\"%s\") succeeded\n", value.str_value.str);
+			} else {
+				printf("var_test: sym_update(\"%s\") failed\n", value.str_value.str);
+				goto out;
+			}
+		} else {
+			printf("var_test: sym_lookup(\"%s\") failed\n", value.str_value.str);
+			goto out;
+		}
+	} else {
+		printf("var_test: get_argument() failed\n");
+		goto out;
+	}
+
+	make_number(1.0, result);
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	ERRNO = ""
+	ret = test_errno()
+	printf("test_errno() returned %d, ERRNO = %s\n", ret, ERRNO)
+	print ""
+}
+*/
+static awk_value_t *
+test_errno(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs != 0) {
+		printf("test_errno: nargs not right (%d should be 0)\n", nargs);
+		goto out;
+	}
+
+	update_ERRNO_int(ECHILD);
+
+	make_number(1.0, result);
+out:
+	return result;
+}
+
+/*
+ * 3/2015: This test is no longer strictly necessary,
+ * since PROCINFO is no longer a deferred variable.
+ * But we leave it in for safety, anyway.
+ */
+/*
+BEGIN {
+	print "test_deferred returns", test_deferred()
+	print ""
+}
+*/
+static awk_value_t *
+test_deferred(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t arr;
+	awk_value_t index, value;
+	const struct nval {
+		const char *name;
+		double val;
+	} seed[] = {
+		{ "fubar", 9.0, },
+		{ "rumpus", -5.0, },
+	};
+	struct nval sysval[] = {
+		{ "uid", getuid(), },
+		{ "api_major", GAWK_API_MAJOR_VERSION, },
+	};
+	size_t i;
+
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs != 0) {
+		printf("test_deferred: nargs not right (%d should be 0)\n", nargs);
+		goto out;
+	}
+
+	if (! sym_lookup("PROCINFO", AWK_ARRAY, & arr)) {
+		printf("test_deferred: %d: sym_lookup failed\n", __LINE__);
+		goto out;
+	}
+
+	for (i = 0; i < sizeof(seed)/sizeof(seed[0]); i++) {
+		make_const_string(seed[i].name, strlen(seed[i].name), & index);
+		make_number(seed[i].val, & value);
+		if (! set_array_element(arr.array_cookie, & index, & value)) {
+			printf("test_deferred: %d: set_array_element(%s) failed\n", __LINE__, seed[i].name);
+			goto out;
+		}
+	}
+
+	/* test that it still contains the values we loaded */
+	for (i = 0; i < sizeof(seed)/sizeof(seed[0]); i++) {
+		make_const_string(seed[i].name, strlen(seed[i].name), & index);
+		make_null_string(& value);
+		if (! get_array_element(arr.array_cookie, &index, AWK_NUMBER, & value)) {
+			printf("test_deferred: %d: get_array_element(%s) failed\n", __LINE__, seed[i].name);
+			goto out;
+		}
+		printf("%s = %g\n", seed[i].name, value.num_value);
+	}
+
+	/* check a few automatically-supplied values */
+	for (i = 0; i < sizeof(sysval)/sizeof(sysval[0]); i++) {
+		make_const_string(sysval[i].name, strlen(sysval[i].name), & index);
+		make_null_string(& value);
+		if (! get_array_element(arr.array_cookie, &index, AWK_NUMBER, & value)) {
+			printf("test_deferred: %d: get_array_element(%s) failed\n", __LINE__, sysval[i].name);
+			goto out;
+		}
+		printf("%s matches %d\n", sysval[i].name, (value.num_value == sysval[i].val));
+	}
+
+	make_number(1.0, result);
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	for (i = 1; i <= 10; i++)
+		test_array[i] = i + 2
+
+	printf("length of test_array is %d, should be 10\n", length(test_array))
+	ret = test_array_size(test_array);
+	printf("test_array_size() returned %d, length is now %d\n", ret, length(test_array))
+	print ""
+}
+*/
+
+static awk_value_t *
+test_array_size(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t value;
+	size_t count = 0;
+
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs != 1) {
+		printf("test_array_size: nargs not right (%d should be 1)\n", nargs);
+		goto out;
+	}
+
+	/* get element count and print it; should match length(array) from awk script */
+	if (! get_argument(0, AWK_ARRAY, & value)) {
+		printf("test_array_size: get_argument failed\n");
+		goto out;
+	}
+
+	if (! get_element_count(value.array_cookie, & count)) {
+		printf("test_array_size: get_element_count failed\n");
+		goto out;
+	}
+
+	printf("test_array_size: incoming size is %lu\n", (unsigned long) count);
+
+	/* clear array - length(array) should then go to zero in script */
+	if (! clear_array(value.array_cookie)) {
+		printf("test_array_size: clear_array failed\n");
+		goto out;
+	}
+
+	make_number(1.0, result);
+
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	n = split("one two three four five six", test_array2)
+	ret = test_array_elem(test_array2, "3")
+	printf("test_array_elem() returned %d, test_array2[3] = %g\n", ret, test_array2[3])
+	if ("5" in test_array2)
+		printf("error: test_array_elem() did not remove element \"5\"\n")
+	else
+		printf("test_array_elem() did remove element \"5\"\n")
+	if ("7" in test_array2)
+		printf("test_array_elem() added element \"7\" --> %s\n", test_array2[7])
+	else
+		printf("test_array_elem() did not add element \"7\"\n")
+	if ("subarray" in test_array2) {
+		if (isarray(test_array2["subarray"])) {
+			for (i in test_array2["subarray"])
+				printf("test_array2[\"subarray\"][\"%s\"] = %s\n",
+					i, test_array2["subarray"][i])
+		} else
+			printf("test_array_elem() added element \"subarray\" as scalar\n")
+	} else
+		printf("test_array_elem() did not add element \"subarray\"\n")
+	print ""
+}
+*/
+static awk_value_t *
+test_array_elem(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t array, index, index2, value;
+
+	make_number(0.0, result);	/* default return until full success */
+
+	assert(result != NULL);
+
+	if (nargs != 2) {
+		printf("test_array_elem: nargs not right (%d should be 2)\n", nargs);
+		goto out;
+	}
+
+	/* look up an array element and print the value */
+	if (! get_argument(0, AWK_ARRAY, & array)) {
+		printf("test_array_elem: get_argument 0 (array) failed\n");
+		goto out;
+	}
+	if (! get_argument(1, AWK_STRING, & index)) {
+		printf("test_array_elem: get_argument 1 (index) failed\n");
+		goto out;
+	}
+	(void) make_const_string(index.str_value.str, index.str_value.len, & index2);
+	if (! get_array_element(array.array_cookie, & index2, AWK_UNDEFINED, & value)) {
+		printf("test_array_elem: get_array_element failed\n");
+		goto out;
+	}
+	printf("test_array_elem: a[\"%.*s\"] = %s\n",
+			(int) index.str_value.len,
+			index.str_value.str,
+			valrep2str(& value));
+
+	/* change the element - "3" */
+	(void) make_number(42.0, & value);
+	(void) make_const_string(index.str_value.str, index.str_value.len, & index2);
+	if (! set_array_element(array.array_cookie, & index2, & value)) {
+		printf("test_array_elem: set_array_element failed\n");
+		goto out;
+	}
+
+	/* delete another element - "5" */
+	(void) make_const_string("5", 1, & index);
+	if (! del_array_element(array.array_cookie, & index)) {
+		printf("test_array_elem: del_array_element failed\n");
+		goto out;
+	}
+
+	/* add a new element - "7" */
+	(void) make_const_string("7", 1, & index);
+	(void) make_const_string("seven", 5, & value);
+	if (! set_array_element(array.array_cookie, & index, & value)) {
+		printf("test_array_elem: set_array_element failed\n");
+		goto out;
+	}
+
+	/* add a subarray */
+	(void) make_const_string("subarray", 8, & index);
+	fill_in_array(& value);
+	if (! set_array_element(array.array_cookie, & index, & value)) {
+		printf("test_array_elem: set_array_element (subarray) failed\n");
+		goto out;
+	}
+
+	/* change and deletion should be reflected in awk script */
+	make_number(1.0, result);
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	ret = test_array_param(a_new_array)
+	printf("test_array_param() returned %d\n", ret)
+	printf("isarray(a_new_array) = %d\n", isarray(a_new_array))
+	if (isarray(a_new_array))
+		for (i in a_new_array)
+			printf("a_new_array[\"%s\"] = %s\n",
+				i, a_new_array[i])
+
+	a_scalar = 42
+	ret = test_array_param(a_scalar)
+	printf("test_array_param() returned %d\n", ret)
+	printf("isarray(a_scalar) = %d\n", isarray(a_scalar))
+	print ""
+}
+*/
+
+static awk_value_t *
+test_array_param(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t new_array;
+	awk_value_t arg0;
+
+	(void) nargs;		/* silence warnings */
+	make_number(0.0, result);
+
+	if (! get_argument(0, AWK_UNDEFINED, & arg0)) {
+		printf("test_array_param: could not get argument\n");
+		goto out;
+	}
+
+	if (arg0.val_type != AWK_UNDEFINED) {
+		printf("test_array_param: argument is not undefined (%d)\n",
+				arg0.val_type);
+		goto out;
+	}
+
+	fill_in_array(& new_array);
+	if (! set_argument(0, new_array.array_cookie)) {
+		printf("test_array_param: could not change type of argument\n");
+		goto out;
+	}
+
+	make_number(1.0, result);
+out:
+	return result;	/* for now */
+}
+
+/*
+BEGIN {
+	printf("Initial value of LINT is %d\n", LINT)
+	ret = print_do_lint();
+	printf("print_do_lint() returned %d\n", ret)
+	LINT = ! LINT
+	printf("Changed value of LINT is %d\n", LINT)
+	ret = print_do_lint();
+	printf("print_do_lint() returned %d\n", ret)
+	print ""
+}
+*/
+static awk_value_t *
+print_do_lint(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	if (nargs != 0) {
+		printf("print_do_lint: nargs not right (%d should be 0)\n", nargs);
+		goto out;
+	}
+
+	printf("print_do_lint: lint = %d\n", do_lint);
+
+	make_number(1.0, result);
+
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	n = split("1 3 5 7 9 11", nums)
+	m = split("the quick brown fox jumps over the lazy dog", strings)
+	for (i in nums) {
+		ret = test_scalar(nums[i] + 0)
+		printf("test_scalar(%d) returned %d, the_scalar is %d\n", nums[i], ret, the_scalar)
+	}
+	for (i in strings) {
+		ret = test_scalar(strings[i])
+		printf("test_scalar(%s) returned %d, the_scalar is %s\n", strings[i], ret, the_scalar)
+	}
+}
+*/
+
+/* test_scalar --- test scalar cookie */
+
+static awk_value_t *
+test_scalar(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t new_value, new_value2;
+	awk_value_t the_scalar;
+
+	(void) nargs;		/* silence warnings */
+	make_number(0.0, result);
+
+	if (! sym_lookup("the_scalar", AWK_SCALAR, & the_scalar)) {
+		printf("test_scalar: could not get scalar cookie\n");
+		goto out;
+	}
+
+	if (! get_argument(0, AWK_UNDEFINED, & new_value)) {
+		printf("test_scalar: could not get argument\n");
+		goto out;
+	} else if (new_value.val_type != AWK_STRING && new_value.val_type != AWK_NUMBER) {
+		printf("test_scalar: argument is not a scalar\n");
+		goto out;
+	}
+
+	if (new_value.val_type == AWK_STRING) {
+		make_const_string(new_value.str_value.str, new_value.str_value.len, & new_value2);
+	} else {
+		new_value2 = new_value;
+	}
+
+	if (! sym_update_scalar(the_scalar.scalar_cookie, & new_value2)) {
+		printf("test_scalar: could not update new_value2!\n");
+		goto out;
+	}
+
+	make_number(1.0, result);
+
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	test_scalar_reserved()
+}
+*/
+
+/* test_scalar_reserved --- test scalar cookie on special variable */
+
+static awk_value_t *
+test_scalar_reserved(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t new_value;
+	awk_value_t the_scalar;
+
+	(void) nargs;		/* silence warnings */
+	make_number(0.0, result);
+
+	/* look up a reserved variable - should pass */
+	if (sym_lookup("ARGC", AWK_SCALAR, & the_scalar)) {
+		printf("test_scalar_reserved: sym_lookup of ARGC passed - got a value!\n");
+	} else {
+		printf("test_scalar_reserved: sym_lookup of ARGC failed - did not get a value\n");
+		goto out;
+	}
+
+	/* updating it should fail */
+	make_number(42.0, & new_value);
+	if (! sym_update_scalar(the_scalar.scalar_cookie, & new_value)) {
+		printf("test_scalar_reserved: could not update new_value2 for ARGC - pass\n");
+	} else {
+		printf("test_scalar_reserved: was able to update new_value2 for ARGC - fail\n");
+		goto out;
+	}
+
+	make_number(1.0, result);
+
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	print "line 1" > "testexttmp.txt"
+	print "line 2" > "testexttmp.txt"
+	print "line 3" > "testexttmp.txt"
+	close("testexttmp.txt")
+	ARGV[1] = "testexttmp.txt"
+	ARGC = 2
+	getline
+	getline
+	getline		# now NR should be 3
+#	system("rm testexttmp.txt")
+	ret = test_indirect_vars()	# should get correct value of NR
+	printf("test_indirect_var() return %d\n", ret)
+	delete ARGV[1]
+	print ""
+}
+*/
+
+/* test_indirect_vars --- test that access to NR, NF, get correct vales */
+
+static awk_value_t *
+test_indirect_vars(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t value;
+	char *name = "NR";
+
+	(void) nargs;		/* silence warnings */
+	assert(result != NULL);
+	make_number(0.0, result);
+
+	/* system("rm testexttmp.txt") */
+	(void) unlink("testexttmp.txt");
+
+	if (sym_lookup(name, AWK_NUMBER, & value))
+		printf("test_indirect_var: sym_lookup of %s passed\n", name);
+	else {
+		printf("test_indirect_var: sym_lookup of %s failed\n", name);
+		goto out;
+	}
+
+	printf("test_indirect_var: value of NR is %g\n", value.num_value);
+
+	make_number(1.0, result);
+out:
+	return result;
+}
+
+/*
+BEGIN {
+	outfile = "testexttmp.txt"
+	alias = ".test.alias"
+	print "line 1" > outfile
+	print "line 2" > outfile
+	print "line 3" > outfile
+	close(outfile)
+	ret = test_get_file(outfile, alias)
+	printf "test_get_file returned %d\n", ret
+	nr = 0
+	while ((getline < alias) > 0)
+		printf "File [%s] nr [%s]: %s\n", alias, ++nr, $0
+	close(alias)
+#	system("rm " outfile)
+	print ""
+}
+*/
+
+/* test_get_file --- test that we can create a file */
+
+static awk_value_t *
+test_get_file(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t filename, alias;
+	int fd;
+	const awk_input_buf_t *ibuf;
+	const awk_output_buf_t *obuf;
+
+	if (nargs != 2) {
+		printf("%s: nargs not right (%d should be 2)\n", "test_get_file", nargs);
+		return make_number(-1.0, result);
+	}
+
+	if (! get_argument(0, AWK_STRING, & filename)) {
+		printf("%s: cannot get first arg\n", "test_get_file");
+		return make_number(-1.0, result);
+	}
+	if (! get_argument(1, AWK_STRING, & alias)) {
+		printf("%s: cannot get second arg\n", "test_get_file");
+		return make_number(-1.0, result);
+	}
+	if ((fd = open(filename.str_value.str, O_RDONLY)) < 0) {
+		printf("%s: open(%s) failed\n", "test_get_file", filename.str_value.str);
+		return make_number(-1.0, result);
+	}
+	if (! get_file(alias.str_value.str, strlen(alias.str_value.str), "<", fd, &ibuf, &obuf)) {
+		printf("%s: get_file(%s) failed\n", "test_get_file", alias.str_value.str);
+		return make_number(-1.0, result);
+	}
+	if (! ibuf || ibuf->fd != fd) {
+		printf("%s: get_file(%s) returned fd %d instead of %d\n", "test_get_file", alias.str_value.str, ibuf ? ibuf->fd : -1, fd);
+		return make_number(-1.0, result);
+	}
+	return make_number(0.0, result);
+}
+
+/* do_get_file --- provide access to get_file API */
+
+static awk_value_t *
+do_get_file(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t filename, filetype, fd, res;
+	const awk_input_buf_t *ibuf;
+	const awk_output_buf_t *obuf;
+
+	if (nargs != 4) {
+		printf("%s: nargs not right (%d should be 4)\n", "get_file", nargs);
+		return make_number(-1.0, result);
+	}
+
+	if (! get_argument(0, AWK_STRING, & filename)) {
+		printf("%s: cannot get first arg\n", "get_file");
+		return make_number(-1.0, result);
+	}
+	if (! get_argument(1, AWK_STRING, & filetype)) {
+		printf("%s: cannot get second arg\n", "get_file");
+		return make_number(-1.0, result);
+	}
+	if (! get_argument(2, AWK_NUMBER, & fd)) {
+		printf("%s: cannot get third arg\n", "get_file");
+		return make_number(-1.0, result);
+	}
+	if (! get_argument(3, AWK_ARRAY, & res)) {
+		printf("%s: cannot get fourth arg\n", "get_file");
+		return make_number(-1.0, result);
+	}
+	clear_array(res.array_cookie);
+
+	if (! get_file(filename.str_value.str, strlen(filename.str_value.str), filetype.str_value.str, fd.num_value, &ibuf, &obuf)) {
+		printf("%s: get_file(%s, %s, %d) failed\n", "get_file", filename.str_value.str, filetype.str_value.str, (int)(fd.num_value));
+		return make_number(0.0, result);
+	}
+
+	if (ibuf) {
+		awk_value_t idx, val;
+		set_array_element(res.array_cookie,
+				  make_const_string("input", 5, & idx),
+				  make_number(ibuf->fd, & val));
+		if (ibuf->name)
+			set_array_element(res.array_cookie,
+					  make_const_string("input_name", 10, & idx),
+					  make_const_string(ibuf->name, strlen(ibuf->name), & val));
+	}
+	if (obuf) {
+		awk_value_t idx, val;
+		set_array_element(res.array_cookie,
+				  make_const_string("output", 6, & idx),
+				  make_number(obuf->fp ? fileno(obuf->fp) : -1,
+				  	      & val));
+		if (obuf->name)
+			set_array_element(res.array_cookie,
+					  make_const_string("output_name", 11, & idx),
+					  make_const_string(obuf->name, strlen(obuf->name), & val));
+	}
+	return make_number(1.0, result);
+}
+
+/* fill_in_array --- fill in a new array */
+
+static void
+fill_in_array(awk_value_t *new_array)
+{
+	awk_array_t a_cookie;
+	awk_value_t index, value;
+
+	a_cookie = create_array();
+
+	(void) make_const_string("hello", 5, & index);
+	(void) make_const_string("world", 5, & value);
+	if (! set_array_element(a_cookie, & index, & value)) {
+		printf("fill_in_array:%d: set_array_element failed\n", __LINE__);
+		return;
+	}
+
+	(void) make_const_string("answer", 6, & index);
+	(void) make_number(42.0, & value);
+	if (! set_array_element(a_cookie, & index, & value)) {
+		printf("fill_in_array:%d: set_array_element failed\n", __LINE__);
+		return;
+	}
+
+	new_array->val_type = AWK_ARRAY;
+	new_array->array_cookie = a_cookie;
+}
+
+/* create_new_array --- create a named array */
+
+static void
+create_new_array()
+{
+	awk_value_t value;
+
+	fill_in_array(& value);
+	if (! sym_update("new_array", & value))
+		printf("create_new_array: sym_update(\"new_array\") failed!\n");
+}
+
+/* at_exit0 --- first at_exit program, runs last */
+
+static void at_exit0(void *data, int exit_status)
+{
+	printf("at_exit0 called (should be third):");
+	if (data)
+		printf(" data = %p,", data);
+	else
+		printf(" data = NULL,");
+	printf(" exit_status = %d\n", exit_status);
+}
+
+/* at_exit1 --- second at_exit program, runs second */
+
+static int data_for_1 = 0xDeadBeef;
+static void at_exit1(void *data, int exit_status)
+{
+	int *data_p = (int *) data;
+
+	printf("at_exit1 called (should be second):");
+	if (data) {
+		if (data == & data_for_1)
+			printf(" (data is & data_for_1),");
+		else
+			printf(" (data is NOT & data_for_1),");
+		printf(" data value = %#x,", *data_p);
+	} else
+		printf(" data = NULL,");
+	printf(" exit_status = %d\n", exit_status);
+}
+
+/* at_exit2 --- third at_exit program, runs first */
+
+static void at_exit2(void *data, int exit_status)
+{
+	printf("at_exit2 called (should be first):");
+	if (data)
+		printf(" data = %p,", data);
+	else
+		printf(" data = NULL,");
+	printf(" exit_status = %d\n", exit_status);
+}
+
+/* do_test_function --- test function for test namespace */
+
+static awk_value_t *
+do_test_function(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	printf("test::test_function() called.\n");
+	fflush(stdout);
+
+	return make_number(0.0, result);
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "dump_array_and_delete", dump_array_and_delete, 2, 2, awk_false, NULL },
+	{ "try_modify_environ", try_modify_environ, 0, 0, awk_false, NULL },
+	{ "var_test", var_test, 1, 1, awk_false, NULL },
+	{ "test_deferred", test_deferred, 0, 0, awk_false, NULL },
+	{ "test_errno", test_errno, 0, 0, awk_false, NULL },
+	{ "test_array_size", test_array_size, 1, 1, awk_false, NULL },
+	{ "test_array_elem", test_array_elem, 2, 2, awk_false, NULL },
+	{ "test_array_param", test_array_param, 1, 1, awk_false, NULL },
+	{ "print_do_lint", print_do_lint, 0, 0, awk_false, NULL },
+	{ "test_scalar", test_scalar, 1, 1, awk_false, NULL },
+	{ "test_scalar_reserved", test_scalar_reserved, 0, 0, awk_false, NULL },
+	{ "test_indirect_vars", test_indirect_vars, 0, 0, awk_false, NULL },
+	{ "test_get_file", test_get_file, 2, 2, awk_false, NULL },
+	{ "get_file", do_get_file, 4, 4, awk_false, NULL },
+};
+
+static awk_ext_func_t ns_test_func = {
+	"test_function", do_test_function, 0, 0, awk_false, NULL
+};
+
+/* init_testext --- additional initialization function */
+
+static awk_bool_t init_testext(void)
+{
+	awk_value_t value;
+	static const char message[] = "hello, world";	/* of course */
+	static const char message2[] = "i am a scalar";
+	static const char message3[] = "in namespace test";
+
+	/* This is used by the getfile test */
+	if (sym_lookup("TESTEXT_QUIET", AWK_NUMBER, & value))
+		return awk_true;
+
+	/* add at_exit functions */
+	awk_atexit(at_exit0, NULL);
+	awk_atexit(at_exit1, & data_for_1);
+	awk_atexit(at_exit2, NULL);
+
+/*
+BEGIN {
+	printf("answer_num = %g\n", answer_num);
+	printf("message_string = %s\n", message_string);
+	for (i in new_array)
+		printf("new_array[\"%s\"] = \"%s\"\n", i, new_array[i])
+	print ""
+	printf("test::testval = %s\n", test::testval)
+	test::test_function()
+	print ""
+}
+*/
+
+	/* install some variables */
+	if (! sym_update("answer_num", make_number(42, & value)))
+		printf("testext: sym_update(\"answer_num\") failed!\n");
+
+	if (! sym_update("message_string",
+			make_const_string(message, strlen(message), & value)))
+		printf("testext: sym_update(\"answer_num\") failed!\n");
+
+	if (! sym_update("the_scalar",
+			make_const_string(message2, strlen(message2), & value)))
+		printf("testext: sym_update(\"the_scalar\") failed!\n");
+
+	create_new_array();
+
+	if (! sym_update_ns("test", "testval",
+			make_const_string(message3, strlen(message3), & value)))
+		printf("testext: sym_update_ns(\"test\", \"testval\") failed!\n");
+
+	if (! add_ext_func("test", & ns_test_func))
+		printf("testext: add_ext_func(\"test\", ns_test_func) failed!\n");
+
+	return awk_true;
+}
+
+static awk_bool_t (*init_func)(void) = init_testext;
+
+dl_load_func(func_table, testext, "")
diff --git a/gawk-5.0.1/extension/time.3am b/gawk-5.0.1/extension/time.3am
new file mode 100644
index 00000000000..0b872c70a8c
--- /dev/null
+++ b/gawk-5.0.1/extension/time.3am
@@ -0,0 +1,90 @@
+.TH TIME 3am "Feb 02 2018" "Free Software Foundation" "GNU Awk Extension Modules"
+.SH NAME
+time \- time functions for gawk
+.SH SYNOPSIS
+.ft CW
+@load "time"
+.sp
+time = gettimeofday()
+.br
+ret = sleep(amount)
+.ft R
+.SH DESCRIPTION
+The
+.I time
+extension adds two functions named
+.B gettimeofday()
+and
+.BR sleep() ,
+as follows.
+.TP
+.B gettimeofday()
+This function returns the number of seconds since the Epoch
+as a floating-point value. It should have subsecond precision.
+It returns \-1 upon error and sets
+.B ERRNO
+to indicate the problem.
+.TP
+.BI sleep( seconds )
+This function attempts to sleep for the given amount of seconds, which
+may include a fractional portion.
+If
+.I seconds
+is negative, or the attempt to sleep fails,
+then it returns \-1 and sets
+.BR ERRNO .
+Otherwise, the function should return 0 after sleeping
+for the indicated amount of time.
+.\" .SH NOTES
+.\" .SH BUGS
+.SH EXAMPLE
+.ft CW
+.nf
+@load "time"
+\&...
+printf "It is now %g seconds since the Epoch\en", gettimeofday()
+printf "Pausing for a while... " ; sleep(2.5) ; print "done"
+.fi
+.ft R
+.SH "SEE ALSO"
+.IR "GAWK: Effective AWK Programming" ,
+.IR filefuncs (3am),
+.IR fnmatch (3am),
+.IR fork (3am),
+.IR inplace (3am),
+.IR ordchr (3am),
+.IR readdir (3am),
+.IR readfile (3am),
+.IR revoutput (3am),
+.IR rwarray (3am).
+.PP
+.IR gettimeofday (2),
+.IR nanosleep (2),
+.IR select (2).
+.SH AUTHOR
+Arnold Robbins,
+.BR arnold@skeeve.com .
+.SH COPYING PERMISSIONS
+Copyright \(co 2012, 2013, 2018,
+Free Software Foundation, Inc.
+.PP
+Permission is granted to make and distribute verbatim copies of
+this manual page provided the copyright notice and this permission
+notice are preserved on all copies.
+.ig
+Permission is granted to process this file through troff and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual page).
+..
+.PP
+Permission is granted to copy and distribute modified versions of this
+manual page under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+.PP
+Permission is granted to copy and distribute translations of this
+manual page into another language, under the above conditions for
+modified versions, except that this permission notice may be stated in
+a translation approved by the Foundation.
+.\" vim: set filetype=nroff :
diff --git a/gawk-5.0.1/extension/time.c b/gawk-5.0.1/extension/time.c
new file mode 100644
index 00000000000..e77a0d877da
--- /dev/null
+++ b/gawk-5.0.1/extension/time.c
@@ -0,0 +1,215 @@
+/*
+ * time.c - Builtin functions that provide time-related functions.
+ */
+
+/*
+ * Copyright (C) 2012, 2013, 2014, 2018
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef __VMS
+#define HAVE_NANOSLEEP
+#define HAVE_GETTIMEOFDAY
+#ifdef gettimeofday
+#undef gettimeofday
+#endif
+#ifdef __ia64__
+/* nanosleep not working correctly on IA64 */
+static int
+vms_fake_nanosleep(struct timespec *rqdly, struct timespec *rmdly)
+{
+	int result;
+	struct timespec mtime1, mtime2;
+
+	result = nanosleep(rqdly, &mtime1);
+	if (result == 0)
+		return 0;
+
+	/* On IA64 it returns 100 nanoseconds early with an error */
+	if ((mtime1.tv_sec == 0) && (mtime1.tv_nsec <= 100)) {
+		mtime1.tv_nsec += 100;
+		result = nanosleep(&mtime1, &mtime2);
+		if (result == 0)
+			return 0;
+		if ((mtime2.tv_sec == 0) && (mtime2.tv_nsec <= 100)) {
+			return 0;
+		}
+	}
+	return result;
+}
+#define nanosleep(x,y) vms_fake_nanosleep(x, y)
+#endif
+#endif
+
+#include "gawkapi.h"
+
+#include "gettext.h"
+#define _(msgid)  gettext(msgid)
+#define N_(msgid) msgid
+
+static const gawk_api_t *api;	/* for convenience macros to work */
+static awk_ext_id_t ext_id;
+static const char *ext_version = "time extension: version 1.0";
+static awk_bool_t (*init_func)(void) = NULL;
+
+int plugin_is_GPL_compatible;
+
+#include <time.h>
+#if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)
+#include <sys/time.h>
+#endif
+#if defined(HAVE_SELECT) && defined(HAVE_SYS_SELECT_H)
+#include <sys/select.h>
+#endif
+#if defined(HAVE_GETSYSTEMTIMEASFILETIME)
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+
+/*
+ * Returns time since 1/1/1970 UTC as a floating point value; should
+ * have sub-second precision, but the actual precision will vary based
+ * on the platform
+ */
+static awk_value_t *
+do_gettimeofday(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	double curtime;
+
+	assert(result != NULL);
+
+#if defined(HAVE_GETTIMEOFDAY)
+	{
+		struct timeval tv;
+		gettimeofday(&tv,NULL);
+		curtime = tv.tv_sec+(tv.tv_usec/1000000.0);
+	}
+#elif defined(HAVE_GETSYSTEMTIMEASFILETIME)
+	/* based on perl win32/win32.c:win32_gettimeofday() implementation */
+	{
+		union {
+			unsigned __int64 ft_i64;
+			FILETIME ft_val;
+		} ft;
+
+		/* # of 100-nanosecond intervals since January 1, 1601 (UTC) */
+		GetSystemTimeAsFileTime(&ft.ft_val);
+#ifdef __GNUC__
+#define Const64(x) x##LL
+#else
+#define Const64(x) x##i64
+#endif
+/* Number of 100 nanosecond units from 1/1/1601 to 1/1/1970 */
+#define EPOCH_BIAS  Const64(116444736000000000)
+		curtime = (ft.ft_i64 - EPOCH_BIAS)/10000000.0;
+#undef Const64
+	}
+#else
+	/* no way to retrieve system time on this platform */
+	curtime = -1;
+	update_ERRNO_string(_("gettimeofday: not supported on this platform"));
+#endif
+
+	return make_number(curtime, result);
+}
+
+/*
+ * Returns 0 if successful in sleeping the requested time;
+ * returns -1 if there is no platform support, or if the sleep request
+ * did not complete successfully (perhaps interrupted)
+ */
+static awk_value_t *
+do_sleep(int nargs, awk_value_t *result, struct awk_ext_func *unused)
+{
+	awk_value_t num;
+	double secs;
+	int rc;
+
+	assert(result != NULL);
+
+	if (! get_argument(0, AWK_NUMBER, &num)) {
+		update_ERRNO_string(_("sleep: missing required numeric argument"));
+		return make_number(-1, result);
+	}
+	secs = num.num_value;
+
+	if (secs < 0) {
+		update_ERRNO_string(_("sleep: argument is negative"));
+		return make_number(-1, result);
+	}
+
+#if defined(HAVE_NANOSLEEP)
+	{
+		struct timespec req;
+
+		req.tv_sec = secs;
+		req.tv_nsec = (secs-(double)req.tv_sec)*1000000000.0;
+		if ((rc = nanosleep(&req,NULL)) < 0)
+			/* probably interrupted */
+			update_ERRNO_int(errno);
+	}
+#elif defined(HAVE_SELECT)
+	{
+		struct timeval timeout;
+
+		timeout.tv_sec = secs;
+		timeout.tv_usec = (secs-(double)timeout.tv_sec)*1000000.0;
+		if ((rc = select(0,NULL,NULL,NULL,&timeout)) < 0)
+			/* probably interrupted */
+			update_ERRNO_int(errno);
+	}
+#elif defined(HAVE_GETSYSTEMTIMEASFILETIME)
+	{
+		DWORD milliseconds = secs * 1000;
+
+		Sleep (milliseconds);
+		rc = 0;
+	}
+#else
+	/* no way to sleep on this platform */
+	rc = -1;
+	update_ERRNO_string(_("sleep: not supported on this platform"));
+#endif
+
+	return make_number(rc, result);
+}
+
+static awk_ext_func_t func_table[] = {
+	{ "gettimeofday", do_gettimeofday, 0, 0, awk_false, NULL },
+	{ "sleep", do_sleep, 1, 1, awk_false, NULL },
+};
+
+/* define the dl_load function using the boilerplate macro */
+
+dl_load_func(func_table, time, "")
diff --git a/gawk-5.0.1/extras/ChangeLog b/gawk-5.0.1/extras/ChangeLog
new file mode 100644
index 00000000000..4fe9fa7d70e
--- /dev/null
+++ b/gawk-5.0.1/extras/ChangeLog
@@ -0,0 +1,23 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.0: Release tar ball made.
+
+2018-09-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.in: Regenerated, using Automake 1.16.1.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2014-10-29         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am, gawk.sh, gawk.csh: New files.
diff --git a/gawk-5.0.1/extras/Makefile.am b/gawk-5.0.1/extras/Makefile.am
new file mode 100644
index 00000000000..6a33ae04a64
--- /dev/null
+++ b/gawk-5.0.1/extras/Makefile.am
@@ -0,0 +1,29 @@
+#
+# extras/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 2014 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+## Process this file with automake to produce Makefile.in.
+
+profiledir = $(sysconfdir)/profile.d
+profile_DATA = gawk.sh gawk.csh
+
+EXTRA_DIST = $(profile_DATA)
diff --git a/gawk-5.0.1/extras/Makefile.in b/gawk-5.0.1/extras/Makefile.in
new file mode 100644
index 00000000000..705cca5bc86
--- /dev/null
+++ b/gawk-5.0.1/extras/Makefile.in
@@ -0,0 +1,533 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# extras/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 2014 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = extras
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \
+	$(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libsigsegv.m4 $(top_srcdir)/m4/longlong.m4 \
+	$(top_srcdir)/m4/mpfr.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/noreturn.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/readline.m4 \
+	$(top_srcdir)/m4/socket.m4 $(top_srcdir)/m4/ulonglong.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(profiledir)"
+DATA = $(profile_DATA)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs \
+	ChangeLog
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GAWKLIBEXT = @GAWKLIBEXT@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_LIBSIGSEGV = @HAVE_LIBSIGSEGV@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMPFR = @LIBMPFR@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBSIGSEGV = @LIBSIGSEGV@
+LIBSIGSEGV_PREFIX = @LIBSIGSEGV_PREFIX@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSIGSEGV = @LTLIBSIGSEGV@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+ZOS_FAIL = @ZOS_FAIL@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+acl_shlibext = @acl_shlibext@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgextensiondir = @pkgextensiondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+profiledir = $(sysconfdir)/profile.d
+profile_DATA = gawk.sh gawk.csh
+EXTRA_DIST = $(profile_DATA)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu extras/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu extras/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-profileDATA: $(profile_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(profile_DATA)'; test -n "$(profiledir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(profiledir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(profiledir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(profiledir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(profiledir)" || exit $$?; \
+	done
+
+uninstall-profileDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(profile_DATA)'; test -n "$(profiledir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(profiledir)'; $(am__uninstall_files_from_dir)
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(profiledir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-profileDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-profileDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
+	ctags-am distclean distclean-generic distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-profileDATA install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags-am uninstall uninstall-am \
+	uninstall-profileDATA
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/extras/gawk.csh b/gawk-5.0.1/extras/gawk.csh
new file mode 100644
index 00000000000..583d5bcd089
--- /dev/null
+++ b/gawk-5.0.1/extras/gawk.csh
@@ -0,0 +1,11 @@
+alias gawkpath_default 'unsetenv AWKPATH; setenv AWKPATH `gawk -v x=AWKPATH "BEGIN {print ENVIRON[x]}"`'
+
+alias gawkpath_prepend 'if (! $?AWKPATH) setenv AWKPATH ""; if ($AWKPATH == "") then; unsetenv AWKPATH; setenv AWKPATH `gawk -v x=AWKPATH "BEGIN {print ENVIRON[x]}"`; endif; setenv AWKPATH "\!*"":$AWKPATH"'
+
+alias gawkpath_append 'if (! $?AWKPATH) setenv AWKPATH ""; if ($AWKPATH == "") then; unsetenv AWKPATH; setenv AWKPATH `gawk -v x=AWKPATH "BEGIN {print ENVIRON[x]}"`; endif; setenv AWKPATH "$AWKPATH"":\!*"'
+
+alias gawklibpath_default 'unsetenv AWKLIBPATH; setenv AWKLIBPATH `gawk -v x=AWKLIBPATH "BEGIN {print ENVIRON[x]}"`'
+
+alias gawklibpath_prepend 'if (! $?AWKLIBPATH) setenv AWKLIBPATH ""; if ($AWKLIBPATH == "") then; unsetenv AWKLIBPATH; setenv AWKLIBPATH `gawk -v x=AWKLIBPATH "BEGIN {print ENVIRON[x]}"`; endif; setenv AWKLIBPATH "\!*"":$AWKLIBPATH"'
+
+alias gawklibpath_append 'if (! $?AWKLIBPATH) setenv AWKLIBPATH ""; if ($AWKLIBPATH == "") then; unsetenv AWKLIBPATH; setenv AWKLIBPATH `gawk -v x=AWKLIBPATH "BEGIN {print ENVIRON[x]}"`; endif; setenv AWKLIBPATH "$AWKLIBPATH"":\!*"'
diff --git a/gawk-5.0.1/extras/gawk.sh b/gawk-5.0.1/extras/gawk.sh
new file mode 100644
index 00000000000..c35471fac5c
--- /dev/null
+++ b/gawk-5.0.1/extras/gawk.sh
@@ -0,0 +1,31 @@
+gawkpath_default () {
+	unset AWKPATH
+	export AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
+}
+
+gawkpath_prepend () {
+	[ -z "$AWKPATH" ] && AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
+	export AWKPATH="$*:$AWKPATH"
+}
+
+gawkpath_append () {
+	[ -z "$AWKPATH" ] && AWKPATH=`gawk 'BEGIN {print ENVIRON["AWKPATH"]}'`
+	export AWKPATH="$AWKPATH:$*"
+}
+
+gawklibpath_default () {
+	unset AWKLIBPATH
+	export AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
+}
+
+gawklibpath_prepend () {
+	[ -z "$AWKLIBPATH" ] && \
+		AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
+	export AWKLIBPATH="$*:$AWKLIBPATH"
+}
+
+gawklibpath_append () {
+	[ -z "$AWKLIBPATH" ] && \
+		AWKLIBPATH=`gawk 'BEGIN {print ENVIRON["AWKLIBPATH"]}'`
+	export AWKLIBPATH="$AWKLIBPATH:$*"
+}
diff --git a/gawk-5.0.1/field.c b/gawk-5.0.1/field.c
new file mode 100644
index 00000000000..285376f22ef
--- /dev/null
+++ b/gawk-5.0.1/field.c
@@ -0,0 +1,1674 @@
+/*
+ * field.c - routines for dealing with fields and record parsing
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+/*
+ * In case that the system doesn't have isblank().
+ * Don't bother with autoconf ifdef junk, just force it.
+ * See dfa.c and regex_internal.h and regcomp.c. Bleah.
+ */
+static int
+is_blank(int c)
+{
+	return c == ' ' || c == '\t';
+}
+
+typedef void (* Setfunc)(long, char *, long, NODE *);
+
+/* is the API currently overriding the default parsing mechanism? */
+static bool api_parser_override = false;
+typedef long (*parse_field_func_t)(long, char **, int, NODE *,
+			     Regexp *, Setfunc, NODE *, NODE *, bool);
+static parse_field_func_t parse_field;
+/*
+ * N.B. The normal_parse_field function pointer contains the parse_field value
+ * that should be used except when API field parsing is overriding the default
+ * field parsing mechanism.
+ */
+static parse_field_func_t normal_parse_field;
+static long re_parse_field(long, char **, int, NODE *,
+			     Regexp *, Setfunc, NODE *, NODE *, bool);
+static long def_parse_field(long, char **, int, NODE *,
+			      Regexp *, Setfunc, NODE *, NODE *, bool);
+static long null_parse_field(long, char **, int, NODE *,
+			     Regexp *, Setfunc, NODE *, NODE *, bool);
+static long sc_parse_field(long, char **, int, NODE *,
+			     Regexp *, Setfunc, NODE *, NODE *, bool);
+static long fw_parse_field(long, char **, int, NODE *,
+			     Regexp *, Setfunc, NODE *, NODE *, bool);
+static const awk_fieldwidth_info_t *api_fw = NULL;
+static long fpat_parse_field(long, char **, int, NODE *,
+			     Regexp *, Setfunc, NODE *, NODE *, bool);
+static void set_element(long num, char * str, long len, NODE *arr);
+static void grow_fields_arr(long num);
+static void set_field(long num, char *str, long len, NODE *dummy);
+static void purge_record(void);
+
+static char *parse_extent;	/* marks where to restart parse of record */
+static long parse_high_water = 0; /* field number that we have parsed so far */
+static long nf_high_water = 0;	/* size of fields_arr */
+static bool resave_fs;
+static NODE *save_FS;		/* save current value of FS when line is read,
+				 * to be used in deferred parsing
+				 */
+static awk_fieldwidth_info_t *FIELDWIDTHS = NULL;
+
+NODE **fields_arr;		/* array of pointers to the field nodes */
+bool field0_valid;		/* $(>0) has not been changed yet */
+int default_FS;			/* true when FS == " " */
+Regexp *FS_re_yes_case = NULL;
+Regexp *FS_re_no_case = NULL;
+Regexp *FS_regexp = NULL;
+Regexp *FPAT_re_yes_case = NULL;
+Regexp *FPAT_re_no_case = NULL;
+Regexp *FPAT_regexp = NULL;
+NODE *Null_field = NULL;
+
+/* init_fields --- set up the fields array to start with */
+
+void
+init_fields()
+{
+	emalloc(fields_arr, NODE **, sizeof(NODE *), "init_fields");
+
+	getnode(fields_arr[0]);
+	*fields_arr[0] = *Nnull_string;
+	fields_arr[0]->flags |= NULL_FIELD;
+
+	parse_extent = fields_arr[0]->stptr;
+	save_FS = dupnode(FS_node->var_value);
+
+	getnode(Null_field);
+	*Null_field = *Nnull_string;
+	Null_field->valref = 1;
+	Null_field->flags = (STRCUR|STRING|NULL_FIELD); /* do not set MALLOC */
+
+	field0_valid = true;
+}
+
+/* grow_fields --- acquire new fields as needed */
+
+static void
+grow_fields_arr(long num)
+{
+	int t;
+	NODE *n;
+
+	erealloc(fields_arr, NODE **, (num + 1) * sizeof(NODE *), "grow_fields_arr");
+	for (t = nf_high_water + 1; t <= num; t++) {
+		getnode(n);
+		*n = *Null_field;
+		fields_arr[t] = n;
+	}
+	nf_high_water = num;
+}
+
+/* set_field --- set the value of a particular field */
+
+/*ARGSUSED*/
+static void
+set_field(long num,
+	char *str,
+	long len,
+	NODE *dummy ATTRIBUTE_UNUSED)	/* just to make interface same as set_element */
+{
+	NODE *n;
+
+	if (num > nf_high_water)
+		grow_fields_arr(num);
+	n = fields_arr[num];
+	n->stptr = str;
+	n->stlen = len;
+	n->flags = (STRCUR|STRING|USER_INPUT);	/* do not set MALLOC */
+}
+
+/* rebuild_record --- Someone assigned a value to $(something).
+			Fix up $0 to be right */
+
+void
+rebuild_record()
+{
+	/*
+	 * use explicit unsigned longs for lengths, in case
+	 * a size_t isn't big enough.
+	 */
+	unsigned long tlen;
+	NODE *tmp;
+	char *ops;
+	char *cops;
+	long i;
+
+	assert(NF != -1);
+
+	tlen = 0;
+	for (i = NF; i > 0; i--) {
+		tmp = fields_arr[i];
+		tmp = force_string(tmp);
+		tlen += tmp->stlen;
+	}
+	tlen += (NF - 1) * OFSlen;
+	if ((long) tlen < 0)
+		tlen = 0;
+	emalloc(ops, char *, tlen + 1, "rebuild_record");
+	cops = ops;
+	ops[0] = '\0';
+	for (i = 1;  i <= NF; i++) {
+		free_wstr(fields_arr[i]);
+		tmp = fields_arr[i];
+		/* copy field */
+		if (tmp->stlen == 1)
+			*cops++ = tmp->stptr[0];
+		else if (tmp->stlen != 0) {
+			memcpy(cops, tmp->stptr, tmp->stlen);
+			cops += tmp->stlen;
+		}
+		/* copy OFS */
+		if (i != NF) {
+			if (OFSlen == 1)
+				*cops++ = *OFS;
+			else if (OFSlen != 0) {
+				memcpy(cops, OFS, OFSlen);
+				cops += OFSlen;
+			}
+		}
+	}
+	tmp = make_str_node(ops, tlen, ALREADY_MALLOCED);
+
+	/*
+	 * Since we are about to unref fields_arr[0], we want to find
+	 * any fields that still point into it, and have them point
+	 * into the new field zero.  This has to be done intelligently,
+	 * so that unrefing a field doesn't try to unref into the old $0.
+	 */
+	for (cops = ops, i = 1; i <= NF; i++) {
+		NODE *r = fields_arr[i];
+		/*
+		 * There is no reason to copy malloc'ed fields to point into
+		 * the new $0 buffer, although that's how previous versions did
+		 * it. It seems faster to leave the malloc'ed fields in place.
+		 */
+		if (r->stlen > 0 && (r->flags & MALLOC) == 0) {
+			NODE *n;
+			getnode(n);
+
+			*n = *r;
+			if (r->valref > 1) {
+				/*
+				 * This can and does happen.  It seems clear that
+				 * we can't leave r's stptr pointing into the
+				 * old $0 buffer that we are about to unref.
+				 */
+				emalloc(r->stptr, char *, r->stlen + 1, "rebuild_record");
+				memcpy(r->stptr, cops, r->stlen);
+				r->stptr[r->stlen] = '\0';
+				r->flags |= MALLOC;
+
+				n->valref = 1;	// reset in the new field to start it off correctly!
+			}
+
+			n->stptr = cops;
+			unref(r);
+			fields_arr[i] = n;
+			assert((n->flags & WSTRCUR) == 0);
+		}
+		cops += fields_arr[i]->stlen + OFSlen;
+	}
+
+	assert((fields_arr[0]->flags & MALLOC) == 0
+		? fields_arr[0]->valref == 1
+		: true);
+
+	unref(fields_arr[0]);
+
+	fields_arr[0] = tmp;
+	field0_valid = true;
+}
+
+/*
+ * set_record:
+ * setup $0, but defer parsing rest of line until reference is made to $(>0)
+ * or to NF.  At that point, parse only as much as necessary.
+ *
+ * Manage a private buffer for the contents of $0.  Doing so keeps us safe
+ * if `getline var' decides to rearrange the contents of the IOBUF that
+ * $0 might have been pointing into.  The cost is the copying of the buffer;
+ * but better correct than fast.
+ */
+void
+set_record(const char *buf, int cnt, const awk_fieldwidth_info_t *fw)
+{
+	NODE *n;
+	static char *databuf;
+	static unsigned long databuf_size;
+#define INITIAL_SIZE	512
+#define MAX_SIZE	((unsigned long) ~0)	/* maximally portable ... */
+
+	purge_record();
+
+	/* buffer management: */
+	if (databuf_size == 0) {	/* first time */
+		ezalloc(databuf, char *, INITIAL_SIZE, "set_record");
+		databuf_size = INITIAL_SIZE;
+	}
+	/*
+	 * Make sure there's enough room. Since we sometimes need
+	 * to place a sentinel at the end, we make sure
+	 * databuf_size is > cnt after allocation.
+	 */
+	if (cnt >= databuf_size) {
+		do {
+			if (databuf_size > MAX_SIZE/2)
+				fatal(_("input record too large"));
+			databuf_size *= 2;
+		} while (cnt >= databuf_size);
+		erealloc(databuf, char *, databuf_size, "set_record");
+		memset(databuf, '\0', databuf_size);
+	}
+	/* copy the data */
+	memcpy(databuf, buf, cnt);
+
+	/*
+	 * Add terminating '\0' so that C library routines
+	 * will know when to stop.
+	 */
+	databuf[cnt] = '\0';
+
+	/* manage field 0: */
+	assert((fields_arr[0]->flags & MALLOC) == 0
+		? fields_arr[0]->valref == 1
+		: true);
+
+	unref(fields_arr[0]);
+	getnode(n);
+	n->stptr = databuf;
+	n->stlen = cnt;
+	n->valref = 1;
+	n->type = Node_val;
+	n->stfmt = STFMT_UNUSED;
+#ifdef HAVE_MPFR
+	n->strndmode = MPFR_round_mode;
+#endif
+	n->flags = (STRING|STRCUR|USER_INPUT);	/* do not set MALLOC */
+	fields_arr[0] = n;
+	if (fw != api_fw) {
+		if ((api_fw = fw) != NULL) {
+			if (! api_parser_override) {
+				api_parser_override = true;
+				parse_field = fw_parse_field;
+				update_PROCINFO_str("FS", "API");
+			}
+		} else if (api_parser_override) {
+			api_parser_override = false;
+			parse_field = normal_parse_field;
+			update_PROCINFO_str("FS", current_field_sep_str());
+		}
+	}
+
+#undef INITIAL_SIZE
+#undef MAX_SIZE
+}
+
+/* reset_record --- start over again with current $0 */
+
+void
+reset_record()
+{
+	fields_arr[0] = force_string(fields_arr[0]);
+	purge_record();
+	if (api_parser_override) {
+		api_parser_override = false;
+		parse_field = normal_parse_field;
+		update_PROCINFO_str("FS", current_field_sep_str());
+	}
+}
+
+static void
+purge_record()
+{
+	int i;
+
+	NF = -1;
+	for (i = 1; i <= parse_high_water; i++) {
+		NODE *n;
+		NODE *r = fields_arr[i];
+		if ((r->flags & MALLOC) == 0 && r->valref > 1) {
+			/* This can and does happen. We must copy the string! */
+			const char *save = r->stptr;
+			emalloc(r->stptr, char *, r->stlen + 1, "purge_record");
+			memcpy(r->stptr, save, r->stlen);
+			r->stptr[r->stlen] = '\0';
+			r->flags |= MALLOC;
+		}
+		unref(r);
+		getnode(n);
+		*n = *Null_field;
+		fields_arr[i] = n;
+	}
+
+	parse_high_water = 0;
+	/*
+	 * $0 = $0 should resplit using the current value of FS.
+	 */
+	if (resave_fs) {
+		resave_fs = false;
+		unref(save_FS);
+		save_FS = dupnode(FS_node->var_value);
+	}
+
+	field0_valid = true;
+}
+
+/* set_NF --- handle what happens to $0 and fields when NF is changed */
+
+void
+set_NF()
+{
+	int i;
+	long nf;
+	NODE *n;
+
+	assert(NF != -1);
+
+	(void) force_number(NF_node->var_value);
+	nf = get_number_si(NF_node->var_value);
+	if (nf < 0)
+		fatal(_("NF set to negative value"));
+
+	static bool warned = false;
+	if (do_lint && NF > nf && ! warned) {
+		warned = true;
+		lintwarn(_("decrementing NF is not portable to many awk versions"));
+	}
+
+	NF = nf;
+
+	if (NF > nf_high_water)
+		grow_fields_arr(NF);
+	if (parse_high_water < NF) {
+		for (i = parse_high_water + 1; i >= 0 && i <= NF; i++) {
+			unref(fields_arr[i]);
+			getnode(n);
+			*n = *Null_field;
+			fields_arr[i] = n;
+		}
+		parse_high_water = NF;
+	} else if (parse_high_water > 0) {
+		for (i = NF + 1; i >= 0 && i <= parse_high_water; i++) {
+			unref(fields_arr[i]);
+			getnode(n);
+			*n = *Null_field;
+			fields_arr[i] = n;
+		}
+		parse_high_water = NF;
+	}
+	field0_valid = false;
+}
+
+/*
+ * re_parse_field --- parse fields using a regexp.
+ *
+ * This is called both from get_field() and from do_split()
+ * via (*parse_field)().  This variation is for when FS is a regular
+ * expression -- either user-defined or because RS=="" and FS==" "
+ */
+static long
+re_parse_field(long up_to,	/* parse only up to this field number */
+	char **buf,	/* on input: string to parse; on output: point to start next */
+	int len,
+	NODE *fs ATTRIBUTE_UNUSED,
+	Regexp *rp,
+	Setfunc set,	/* routine to set the value of the parsed field */
+	NODE *n,
+	NODE *sep_arr,  /* array of field separators (maybe NULL) */
+	bool in_middle)
+{
+	char *scan = *buf;
+	long nf = parse_high_water;
+	char *field;
+	char *end = scan + len;
+	int regex_flags = RE_NEED_START;
+	char *sep;
+	size_t mbclen = 0;
+	mbstate_t mbs;
+
+	memset(&mbs, 0, sizeof(mbstate_t));
+
+	if (in_middle)
+		regex_flags |= RE_NO_BOL;
+
+	if (up_to == UNLIMITED)
+		nf = 0;
+	if (len == 0)
+		return nf;
+
+	if (RS_is_null && default_FS) {
+		sep = scan;
+		while (scan < end && (*scan == ' ' || *scan == '\t' || *scan == '\n'))
+			scan++;
+		if (sep_arr != NULL && sep < scan)
+			set_element(nf, sep, (long)(scan - sep), sep_arr);
+	}
+
+	if (rp == NULL) /* use FS */
+		rp = FS_regexp;
+
+	field = scan;
+	while (scan < end
+	       && research(rp, scan, 0, (end - scan), regex_flags) != -1
+	       && nf < up_to) {
+		regex_flags |= RE_NO_BOL;
+		if (REEND(rp, scan) == RESTART(rp, scan)) {   /* null match */
+			if (gawk_mb_cur_max > 1)	{
+				mbclen = mbrlen(scan, end-scan, &mbs);
+				if ((mbclen == 1) || (mbclen == (size_t) -1)
+					|| (mbclen == (size_t) -2) || (mbclen == 0)) {
+					/* We treat it as a singlebyte character.  */
+					mbclen = 1;
+				}
+				scan += mbclen;
+			} else
+				scan++;
+			if (scan == end) {
+				(*set)(++nf, field, (long)(scan - field), n);
+				up_to = nf;
+				break;
+			}
+			continue;
+		}
+		(*set)(++nf, field,
+		       (long)(scan + RESTART(rp, scan) - field), n);
+		if (sep_arr != NULL)
+	    		set_element(nf, scan + RESTART(rp, scan),
+           			(long) (REEND(rp, scan) - RESTART(rp, scan)), sep_arr);
+		scan += REEND(rp, scan);
+		field = scan;
+		if (scan == end)	/* FS at end of record */
+			(*set)(++nf, field, 0L, n);
+	}
+	if (nf != up_to && scan < end) {
+		(*set)(++nf, scan, (long)(end - scan), n);
+		scan = end;
+	}
+	*buf = scan;
+	return nf;
+}
+
+/*
+ * def_parse_field --- default field parsing.
+ *
+ * This is called both from get_field() and from do_split()
+ * via (*parse_field)().  This variation is for when FS is a single space
+ * character.
+ */
+
+static long
+def_parse_field(long up_to,	/* parse only up to this field number */
+	char **buf,	/* on input: string to parse; on output: point to start next */
+	int len,
+	NODE *fs,
+	Regexp *rp ATTRIBUTE_UNUSED,
+	Setfunc set,	/* routine to set the value of the parsed field */
+	NODE *n,
+	NODE *sep_arr,  /* array of field separators (maybe NULL) */
+	bool in_middle ATTRIBUTE_UNUSED)
+{
+	char *scan = *buf;
+	long nf = parse_high_water;
+	char *field;
+	char *end = scan + len;
+	char sav;
+	char *sep;
+
+	if (up_to == UNLIMITED)
+		nf = 0;
+	if (len == 0)
+		return nf;
+
+	/*
+	 * Nasty special case. If FS set to "", return whole record
+	 * as first field. This is not worth a separate function.
+	 */
+	if (fs->stlen == 0) {
+		(*set)(++nf, *buf, len, n);
+		*buf += len;
+		return nf;
+	}
+
+	/* before doing anything save the char at *end */
+	sav = *end;
+	/* because it will be destroyed now: */
+
+	*end = ' ';	/* sentinel character */
+	sep = scan;
+	for (; nf < up_to; scan++) {
+		/*
+		 * special case:  fs is single space, strip leading whitespace
+		 */
+		while (scan < end && (*scan == ' ' || *scan == '\t' || *scan == '\n'))
+			scan++;
+
+		if (sep_arr != NULL && scan > sep)
+			set_element(nf, sep, (long) (scan - sep), sep_arr);
+
+		if (scan >= end)
+			break;
+
+		field = scan;
+
+		while (*scan != ' ' && *scan != '\t' && *scan != '\n')
+			scan++;
+
+		(*set)(++nf, field, (long)(scan - field), n);
+
+		if (scan == end)
+			break;
+
+		sep = scan;
+	}
+
+	/* everything done, restore original char at *end */
+	*end = sav;
+
+	*buf = scan;
+	return nf;
+}
+
+/*
+ * null_parse_field --- each character is a separate field
+ *
+ * This is called both from get_field() and from do_split()
+ * via (*parse_field)().  This variation is for when FS is the null string.
+ */
+static long
+null_parse_field(long up_to,	/* parse only up to this field number */
+	char **buf,	/* on input: string to parse; on output: point to start next */
+	int len,
+	NODE *fs ATTRIBUTE_UNUSED,
+	Regexp *rp ATTRIBUTE_UNUSED,
+	Setfunc set,	/* routine to set the value of the parsed field */
+	NODE *n,
+	NODE *sep_arr,  /* array of field separators (maybe NULL) */
+	bool in_middle ATTRIBUTE_UNUSED)
+{
+	char *scan = *buf;
+	long nf = parse_high_water;
+	char *end = scan + len;
+
+	if (up_to == UNLIMITED)
+		nf = 0;
+	if (len == 0)
+		return nf;
+
+	if (gawk_mb_cur_max > 1) {
+		mbstate_t mbs;
+		memset(&mbs, 0, sizeof(mbstate_t));
+		for (; nf < up_to && scan < end;) {
+			size_t mbclen = mbrlen(scan, end-scan, &mbs);
+			if ((mbclen == 1) || (mbclen == (size_t) -1)
+				|| (mbclen == (size_t) -2) || (mbclen == 0)) {
+				/* We treat it as a singlebyte character.  */
+				mbclen = 1;
+			}
+			if (sep_arr != NULL && nf > 0)
+				set_element(nf, scan, 0L, sep_arr);
+			(*set)(++nf, scan, mbclen, n);
+			scan += mbclen;
+		}
+	} else {
+		for (; nf < up_to && scan < end; scan++) {
+			if (sep_arr != NULL && nf > 0)
+				set_element(nf, scan, 0L, sep_arr);
+			(*set)(++nf, scan, 1L, n);
+		}
+	}
+
+	*buf = scan;
+	return nf;
+}
+
+/*
+ * sc_parse_field --- single character field separator
+ *
+ * This is called both from get_field() and from do_split()
+ * via (*parse_field)().  This variation is for when FS is a single character
+ * other than space.
+ */
+static long
+sc_parse_field(long up_to,	/* parse only up to this field number */
+	char **buf,	/* on input: string to parse; on output: point to start next */
+	int len,
+	NODE *fs,
+	Regexp *rp ATTRIBUTE_UNUSED,
+	Setfunc set,	/* routine to set the value of the parsed field */
+	NODE *n,
+	NODE *sep_arr,  /* array of field separators (maybe NULL) */
+	bool in_middle ATTRIBUTE_UNUSED)
+{
+	char *scan = *buf;
+	char fschar;
+	long nf = parse_high_water;
+	char *field;
+	char *end = scan + len;
+	char sav;
+	size_t mbclen = 0;
+	mbstate_t mbs;
+
+	memset(&mbs, 0, sizeof(mbstate_t));
+
+	if (up_to == UNLIMITED)
+		nf = 0;
+	if (len == 0)
+		return nf;
+
+	if (RS_is_null && fs->stlen == 0)
+		fschar = '\n';
+	else
+		fschar = fs->stptr[0];
+
+	/* before doing anything save the char at *end */
+	sav = *end;
+	/* because it will be destroyed now: */
+	*end = fschar;	/* sentinel character */
+
+	for (; nf < up_to;) {
+		field = scan;
+		if (gawk_mb_cur_max > 1) {
+			while (*scan != fschar) {
+				mbclen = mbrlen(scan, end-scan, &mbs);
+				if ((mbclen == 1) || (mbclen == (size_t) -1)
+					|| (mbclen == (size_t) -2) || (mbclen == 0)) {
+					/* We treat it as a singlebyte character.  */
+					mbclen = 1;
+				}
+				scan += mbclen;
+			}
+		} else {
+			while (*scan != fschar)
+				scan++;
+		}
+		(*set)(++nf, field, (long)(scan - field), n);
+		if (scan == end)
+			break;
+		if (sep_arr != NULL)
+			set_element(nf, scan, 1L, sep_arr);
+		scan++;
+		if (scan == end) {	/* FS at end of record */
+			(*set)(++nf, field, 0L, n);
+			break;
+		}
+	}
+
+	/* everything done, restore original char at *end */
+	*end = sav;
+
+	*buf = scan;
+	return nf;
+}
+
+/*
+ * calc_mbslen --- calculate the length in bytes of a multi-byte string
+ * containing len characters.
+ */
+
+static size_t
+calc_mbslen(char *scan, char *end, size_t len, mbstate_t *mbs)
+{
+
+	size_t mbclen;
+	char *mbscan = scan;
+
+	while (len-- > 0 && mbscan < end) {
+		mbclen = mbrlen(mbscan, end - mbscan, mbs);
+		if (!(mbclen > 0 && mbclen <= (size_t)(end - mbscan)))
+			/*
+			 * We treat it as a singlebyte character. This should
+			 * catch error codes 0, (size_t) -1, and (size_t) -2.
+			 */
+			mbclen = 1;
+		mbscan += mbclen;
+	}
+	return mbscan - scan;
+}
+
+/*
+ * fw_parse_field --- field parsing using FIELDWIDTHS spec
+ *
+ * This is called from get_field() via (*parse_field)().
+ * This variation is for fields are fixed widths.
+ */
+static long
+fw_parse_field(long up_to,	/* parse only up to this field number */
+	char **buf,	/* on input: string to parse; on output: point to start next */
+	int len,
+	NODE *fs ATTRIBUTE_UNUSED,
+	Regexp *rp ATTRIBUTE_UNUSED,
+	Setfunc set,	/* routine to set the value of the parsed field */
+	NODE *n,
+	NODE *dummy ATTRIBUTE_UNUSED, /* sep_arr not needed here: hence dummy */
+	bool in_middle ATTRIBUTE_UNUSED)
+{
+	char *scan = *buf;
+	long nf = parse_high_water;
+	char *end = scan + len;
+	const awk_fieldwidth_info_t *fw;
+	mbstate_t mbs;
+	size_t skiplen;
+	size_t flen;
+
+	fw = (api_parser_override ? api_fw : FIELDWIDTHS);
+
+	if (up_to == UNLIMITED)
+		nf = 0;
+	if (len == 0)
+		return nf;
+	if (gawk_mb_cur_max > 1 && fw->use_chars) {
+		/*
+		 * Reset the shift state. Arguably, the shift state should
+		 * be part of the file state and carried forward at all times,
+		 * but nobody has complained so far, so this may not matter
+		 * in practice.
+		 */
+		memset(&mbs, 0, sizeof(mbstate_t));
+		while (nf < up_to && scan < end) {
+			if (nf >= fw->nf) {
+				*buf = end;
+				return nf;
+			}
+			scan += calc_mbslen(scan, end, fw->fields[nf].skip, &mbs);
+			flen = calc_mbslen(scan, end, fw->fields[nf].len, &mbs);
+			(*set)(++nf, scan, (long) flen, n);
+			scan += flen;
+		}
+	} else {
+		while (nf < up_to && scan < end) {
+			if (nf >= fw->nf) {
+				*buf = end;
+				return nf;
+			}
+			skiplen = fw->fields[nf].skip;
+			if (skiplen > end - scan)
+				skiplen = end - scan;
+			scan += skiplen;
+			flen = fw->fields[nf].len;
+			if (flen > end - scan)
+				flen = end - scan;
+			(*set)(++nf, scan, (long) flen, n);
+			scan += flen;
+		}
+	}
+	*buf = scan;
+	return nf;
+}
+
+/* invalidate_field0 --- $0 needs reconstruction */
+
+void
+invalidate_field0()
+{
+	field0_valid = false;
+}
+
+/* get_field --- return a particular $n */
+
+/* assign is not NULL if this field is on the LHS of an assign */
+
+NODE **
+get_field(long requested, Func_ptr *assign)
+{
+	bool in_middle = false;
+	static bool warned = false;
+	extern int currule;
+
+	if (do_lint && currule == END && ! warned) {
+		warned = true;
+		lintwarn(_("accessing fields from an END rule may not be portable"));
+	}
+
+	/*
+	 * if requesting whole line but some other field has been altered,
+	 * then the whole line must be rebuilt
+	 */
+	if (requested == 0) {
+		if (! field0_valid) {
+			/* first, parse remainder of input record */
+			if (NF == -1) {
+				in_middle = (parse_high_water != 0);
+				NF = (*parse_field)(UNLIMITED - 1, &parse_extent,
+		    			fields_arr[0]->stlen -
+					(parse_extent - fields_arr[0]->stptr),
+		    			save_FS, FS_regexp, set_field,
+					(NODE *) NULL,
+					(NODE *) NULL,
+					in_middle);
+				parse_high_water = NF;
+			}
+			rebuild_record();
+		}
+		if (assign != NULL)
+			*assign = reset_record;
+		return &fields_arr[0];
+	}
+
+	/* assert(requested > 0); */
+
+#if 0
+	if (assign != NULL)
+		field0_valid = false;		/* $0 needs reconstruction */
+#else
+	/*
+	 * Keep things uniform. Also, mere intention of assigning something
+	 * to $n should not make $0 invalid. Makes sense to invalidate $0
+	 * after the actual assignment is performed. Not a real issue in
+	 * the interpreter otherwise, but causes problem in the
+	 * debugger when watching or printing fields.
+	 */
+
+	if (assign != NULL)
+		*assign = invalidate_field0;	/* $0 needs reconstruction */
+#endif
+
+	if (requested <= parse_high_water)	/* already parsed this field */
+		return &fields_arr[requested];
+
+	if (NF == -1) {	/* have not yet parsed to end of record */
+		/*
+		 * parse up to requested fields, calling set_field() for each,
+		 * saving in parse_extent the point where the parse left off
+		 */
+		if (parse_high_water == 0)	/* starting at the beginning */
+			parse_extent = fields_arr[0]->stptr;
+		else
+			in_middle = true;
+		parse_high_water = (*parse_field)(requested, &parse_extent,
+		     fields_arr[0]->stlen - (parse_extent - fields_arr[0]->stptr),
+		     save_FS, NULL, set_field, (NODE *) NULL, (NODE *) NULL, in_middle);
+
+		/*
+		 * if we reached the end of the record, set NF to the number of
+		 * fields so far.  Note that requested might actually refer to
+		 * a field that is beyond the end of the record, but we won't
+		 * set NF to that value at this point, since this is only a
+		 * reference to the field and NF only gets set if the field
+		 * is assigned to -- this case is handled below
+		 */
+		if (parse_extent == fields_arr[0]->stptr + fields_arr[0]->stlen)
+			NF = parse_high_water;
+		else if (parse_field == fpat_parse_field) {
+			/* FPAT parsing is weird, isolate the special cases */
+			char *rec_start = fields_arr[0]->stptr;
+			char *rec_end = fields_arr[0]->stptr + fields_arr[0]->stlen;
+
+			if (    parse_extent > rec_end
+			    || (parse_extent > rec_start && parse_extent < rec_end && requested == UNLIMITED-1))
+				NF = parse_high_water;
+			else if (parse_extent == rec_start) /* could be no match for FPAT */
+				NF = 0;
+		}
+		if (requested == UNLIMITED - 1)	/* UNLIMITED-1 means set NF */
+			requested = parse_high_water;
+	}
+	if (parse_high_water < requested) { /* requested beyond end of record */
+		if (assign != NULL) {	/* expand record */
+			if (requested > nf_high_water)
+				grow_fields_arr(requested);
+
+			NF = requested;
+			parse_high_water = requested;
+		} else
+			return &Null_field;
+	}
+
+	return &fields_arr[requested];
+}
+
+/* set_element --- set an array element, used by do_split() */
+
+static void
+set_element(long num, char *s, long len, NODE *n)
+{
+	NODE *it;
+	NODE *sub;
+
+	it = make_string(s, len);
+	it->flags |= USER_INPUT;
+	sub = make_number((AWKNUM) (num));
+	assoc_set(n, sub, it);
+}
+
+/* do_split --- implement split(), semantics are same as for field splitting */
+
+NODE *
+do_split(int nargs)
+{
+	NODE *src, *arr, *sep, *fs, *tmp, *sep_arr = NULL;
+	char *s;
+	long (*parseit)(long, char **, int, NODE *,
+			 Regexp *, Setfunc, NODE *, NODE *, bool);
+	Regexp *rp = NULL;
+
+	if (nargs == 4) {
+		static bool warned = false;
+
+		if (do_traditional || do_posix) {
+			fatal(_("split: fourth argument is a gawk extension"));
+		}
+		sep_arr = POP_PARAM();
+		if (sep_arr->type != Node_var_array)
+			fatal(_("split: fourth argument is not an array"));
+		if ((do_lint_extensions || do_lint_old) && ! warned) {
+			warned = true;
+			lintwarn(_("split: fourth argument is a gawk extension"));
+		}
+	}
+
+	sep = POP();
+	arr = POP_PARAM();
+	if (arr->type != Node_var_array)
+		fatal(_("split: second argument is not an array"));
+
+	if (sep_arr != NULL) {
+		if (sep_arr == arr)
+			fatal(_("split: cannot use the same array for second and fourth args"));
+
+		/* This checks need to be done before clearing any of the arrays */
+		for (tmp = sep_arr->parent_array; tmp != NULL; tmp = tmp->parent_array)
+			if (tmp == arr)
+				fatal(_("split: cannot use a subarray of second arg for fourth arg"));
+		for (tmp = arr->parent_array; tmp != NULL; tmp = tmp->parent_array)
+			if (tmp == sep_arr)
+				fatal(_("split: cannot use a subarray of fourth arg for second arg"));
+		assoc_clear(sep_arr);
+	}
+	assoc_clear(arr);
+
+	src = TOP_STRING();
+	if (src->stlen == 0) {
+		/*
+		 * Skip the work if first arg is the null string.
+		 */
+		tmp = POP_SCALAR();
+		DEREF(tmp);
+		return make_number((AWKNUM) 0);
+	}
+
+	if ((sep->flags & REGEX) != 0)
+		sep = sep->typed_re;
+
+	if (   (sep->re_flags & FS_DFLT) != 0
+	    && current_field_sep() == Using_FS
+	    && ! RS_is_null) {
+		parseit = parse_field;
+		fs = force_string(FS_node->var_value);
+		rp = FS_regexp;
+	} else {
+		fs = sep->re_exp;
+
+		if (fs->stlen == 0) {
+			static bool warned = false;
+
+			parseit = null_parse_field;
+
+			if (do_lint && ! warned) {
+				warned = true;
+				lintwarn(_("split: null string for third arg is a non-standard extension"));
+			}
+		} else if (fs->stlen == 1 && (sep->re_flags & CONSTANT) == 0) {
+			if (fs->stptr[0] == ' ') {
+				parseit = def_parse_field;
+			} else
+				parseit = sc_parse_field;
+		} else {
+			parseit = re_parse_field;
+			rp = re_update(sep);
+		}
+	}
+
+	s = src->stptr;
+	tmp = make_number((AWKNUM) (*parseit)(UNLIMITED, &s, (int) src->stlen,
+					     fs, rp, set_element, arr, sep_arr, false));
+
+	src = POP_SCALAR();	/* really pop off stack */
+	DEREF(src);
+	return tmp;
+}
+
+/*
+ * do_patsplit --- implement patsplit(), semantics are same as for field
+ *		   splitting with FPAT.
+ */
+
+NODE *
+do_patsplit(int nargs)
+{
+	NODE *src, *arr, *sep, *fpat, *tmp, *sep_arr = NULL;
+	char *s;
+	Regexp *rp = NULL;
+
+	if (nargs == 4) {
+		sep_arr = POP_PARAM();
+		if (sep_arr->type != Node_var_array)
+			fatal(_("patsplit: fourth argument is not an array"));
+	}
+	sep = POP();
+	arr = POP_PARAM();
+	if (arr->type != Node_var_array)
+		fatal(_("patsplit: second argument is not an array"));
+
+	src = TOP_STRING();
+
+	if ((sep->flags & REGEX) != 0)
+		sep = sep->typed_re;
+
+	fpat = sep->re_exp;
+	if (fpat->stlen == 0)
+		fatal(_("patsplit: third argument must be non-null"));
+
+	if (sep_arr != NULL) {
+		if (sep_arr == arr)
+			fatal(_("patsplit: cannot use the same array for second and fourth args"));
+
+		/* These checks need to be done before clearing any of the arrays */
+		for (tmp = sep_arr->parent_array; tmp != NULL; tmp = tmp->parent_array)
+			if (tmp == arr)
+				fatal(_("patsplit: cannot use a subarray of second arg for fourth arg"));
+		for (tmp = arr->parent_array; tmp != NULL; tmp = tmp->parent_array)
+			if (tmp == sep_arr)
+				fatal(_("patsplit: cannot use a subarray of fourth arg for second arg"));
+		assoc_clear(sep_arr);
+	}
+	assoc_clear(arr);
+
+	if (src->stlen == 0) {
+		/*
+		 * Skip the work if first arg is the null string.
+		 */
+		tmp =  make_number((AWKNUM) 0);
+	} else {
+		rp = re_update(sep);
+		s = src->stptr;
+		tmp = make_number((AWKNUM) fpat_parse_field(UNLIMITED, &s,
+				(int) src->stlen, fpat, rp,
+				set_element, arr, sep_arr, false));
+	}
+
+	src = POP_SCALAR();	/* really pop off stack */
+	DEREF(src);
+	return tmp;
+}
+
+/* set_parser --- update the current (non-API) parser */
+
+static void
+set_parser(parse_field_func_t func)
+{
+	normal_parse_field = func;
+	if (! api_parser_override && parse_field != func) {
+		parse_field = func;
+	        update_PROCINFO_str("FS", current_field_sep_str());
+	}
+}
+
+/* set_FIELDWIDTHS --- handle an assignment to FIELDWIDTHS */
+
+void
+set_FIELDWIDTHS()
+{
+	char *scan;
+	char *end;
+	int i;
+	static int fw_alloc = 4;
+	static bool warned = false;
+	bool fatal_error = false;
+	NODE *tmp;
+
+	if (do_lint_extensions && ! warned) {
+		warned = true;
+		lintwarn(_("`FIELDWIDTHS' is a gawk extension"));
+	}
+	if (do_traditional)	/* quick and dirty, does the trick */
+		return;
+
+	/*
+	 * If changing the way fields are split, obey least-surprise
+	 * semantics, and force $0 to be split totally.
+	 */
+	if (fields_arr != NULL)
+		(void) get_field(UNLIMITED - 1, 0);
+
+	set_parser(fw_parse_field);
+	tmp = force_string(FIELDWIDTHS_node->var_value);
+	scan = tmp->stptr;
+
+	if (FIELDWIDTHS == NULL) {
+		emalloc(FIELDWIDTHS, awk_fieldwidth_info_t *, awk_fieldwidth_info_size(fw_alloc), "set_FIELDWIDTHS");
+		FIELDWIDTHS->use_chars = awk_true;
+	}
+	FIELDWIDTHS->nf = 0;
+	for (i = 0; ; i++) {
+		unsigned long int tmp;
+		if (i >= fw_alloc) {
+			fw_alloc *= 2;
+			erealloc(FIELDWIDTHS, awk_fieldwidth_info_t *, awk_fieldwidth_info_size(fw_alloc), "set_FIELDWIDTHS");
+		}
+		/* Ensure that there is no leading `-' sign.  Otherwise,
+		   strtoul would accept it and return a bogus result.  */
+		while (is_blank(*scan)) {
+			++scan;
+		}
+		if (*scan == '-') {
+			fatal_error = true;
+			break;
+		}
+		if (*scan == '\0')
+			break;
+
+		// Look for skip value. We allow N:M and N:*.
+		/*
+		 * Detect an invalid base-10 integer, a valid value that
+		 * is followed by something other than a blank or '\0',
+		 * or a value that is not in the range [1..UINT_MAX].
+		 */
+		errno = 0;
+		tmp = strtoul(scan, &end, 10);
+		if (errno == 0 && *end == ':' && (0 < tmp && tmp <= UINT_MAX)) {
+			FIELDWIDTHS->fields[i].skip = tmp;
+			scan = end + 1;
+			if (*scan == '-' || is_blank(*scan)) {
+				fatal_error = true;
+				break;
+			}
+			// try scanning for field width
+			tmp = strtoul(scan, &end, 10);
+		}
+		else
+			FIELDWIDTHS->fields[i].skip = 0;
+
+		if (errno != 0
+		    	|| (*end != '\0' && ! is_blank(*end))
+				|| !(0 < tmp && tmp <= UINT_MAX)
+		) {
+			if (*scan == '*') {
+				for (scan++; is_blank(*scan); scan++)
+					continue;
+
+				if (*scan != '\0')
+					fatal(_("`*' must be the last designator in FIELDWIDTHS"));
+
+				FIELDWIDTHS->fields[i].len = UINT_MAX;
+				FIELDWIDTHS->nf = i+1;
+			}
+			else
+				fatal_error = true;
+			break;
+		}
+		FIELDWIDTHS->fields[i].len = tmp;
+		FIELDWIDTHS->nf = i+1;
+		scan = end;
+		/* Skip past any trailing blanks.  */
+		while (is_blank(*scan)) {
+			++scan;
+		}
+		if (*scan == '\0')
+			break;
+	}
+
+	if (fatal_error)
+		fatal(_("invalid FIELDWIDTHS value, for field %d, near `%s'"),
+			      i + 1, scan);
+}
+
+/* set_FS --- handle things when FS is assigned to */
+
+void
+set_FS()
+{
+	char buf[10];
+	NODE *fs;
+	static NODE *save_fs = NULL;
+	static NODE *save_rs = NULL;
+	bool remake_re = true;
+
+	/*
+	 * If changing the way fields are split, obey least-surprise
+	 * semantics, and force $0 to be split totally.
+	 */
+	if (fields_arr != NULL)
+		(void) get_field(UNLIMITED - 1, 0);
+
+	/* It's possible that only IGNORECASE changed, or FS = FS */
+	/*
+	 * This comparison can't use cmp_nodes(), which pays attention
+	 * to IGNORECASE, and that's not what we want.
+	 */
+	if (save_fs
+		&& FS_node->var_value->stlen == save_fs->stlen
+		&& memcmp(FS_node->var_value->stptr, save_fs->stptr, save_fs->stlen) == 0
+		&& save_rs
+		&& RS_node->var_value->stlen == save_rs->stlen
+		&& memcmp(RS_node->var_value->stptr, save_rs->stptr, save_rs->stlen) == 0) {
+		if (FS_regexp != NULL)
+			FS_regexp = (IGNORECASE ? FS_re_no_case : FS_re_yes_case);
+
+		/* FS = FS */
+		if (current_field_sep() == Using_FS) {
+			return;
+		} else {
+			remake_re = false;
+			goto choose_fs_function;
+		}
+	}
+
+	unref(save_fs);
+	save_fs = dupnode(FS_node->var_value);
+	unref(save_rs);
+	save_rs = dupnode(RS_node->var_value);
+	resave_fs = true;
+
+	/* If FS_re_no_case assignment is fatal (make_regexp in remake_re)
+	 * FS_regexp will be NULL with a non-null FS_re_yes_case.
+	 * refree() handles null argument; no need for `if (FS_regexp != NULL)' below.
+	 * Please do not remerge.
+	 */
+	refree(FS_re_yes_case);
+	refree(FS_re_no_case);
+	FS_re_yes_case = FS_re_no_case = FS_regexp = NULL;
+
+
+choose_fs_function:
+	buf[0] = '\0';
+	default_FS = false;
+	fs = force_string(FS_node->var_value);
+
+	if (! do_traditional && fs->stlen == 0) {
+		static bool warned = false;
+
+		set_parser(null_parse_field);
+
+		if (do_lint_extensions && ! warned) {
+			warned = true;
+			lintwarn(_("null string for `FS' is a gawk extension"));
+		}
+	} else if (fs->stlen > 1) {
+		if (do_lint_old)
+			warning(_("old awk does not support regexps as value of `FS'"));
+		set_parser(re_parse_field);
+	} else if (RS_is_null) {
+		/* we know that fs->stlen <= 1 */
+		set_parser(sc_parse_field);
+		if (fs->stlen == 1) {
+			if (fs->stptr[0] == ' ') {
+				default_FS = true;
+				strcpy(buf, "[ \t\n]+");
+			} else if (fs->stptr[0] == '\\') {
+				/* yet another special case */
+				strcpy(buf, "[\\\\\n]");
+			} else if (fs->stptr[0] == '\0') {
+				/* and yet another special case */
+				strcpy(buf, "[\\000\n]");
+			} else if (fs->stptr[0] != '\n') {
+				sprintf(buf, "[%c\n]", fs->stptr[0]);
+			}
+		}
+	} else {
+		set_parser(def_parse_field);
+
+		if (fs->stlen == 1) {
+			if (fs->stptr[0] == ' ')
+				default_FS = true;
+			else if (fs->stptr[0] == '\\')
+				/* same special case */
+				strcpy(buf, "[\\\\]");
+			else
+				set_parser(sc_parse_field);
+		}
+	}
+	if (remake_re) {
+		refree(FS_re_yes_case);
+		refree(FS_re_no_case);
+		FS_re_yes_case = FS_re_no_case = FS_regexp = NULL;
+
+		if (buf[0] != '\0') {
+			FS_re_yes_case = make_regexp(buf, strlen(buf), false, true, true);
+			FS_re_no_case = make_regexp(buf, strlen(buf), true, true, true);
+			FS_regexp = (IGNORECASE ? FS_re_no_case : FS_re_yes_case);
+			set_parser(re_parse_field);
+		} else if (parse_field == re_parse_field) {
+			FS_re_yes_case = make_regexp(fs->stptr, fs->stlen, false, true, true);
+			FS_re_no_case = make_regexp(fs->stptr, fs->stlen, true, true, true);
+			FS_regexp = (IGNORECASE ? FS_re_no_case : FS_re_yes_case);
+		} else
+			FS_re_yes_case = FS_re_no_case = FS_regexp = NULL;
+	}
+
+	/*
+	 * For FS = "c", we don't use IGNORECASE. But we must use
+	 * re_parse_field to get the character and the newline as
+	 * field separators.
+	 */
+	if (fs->stlen == 1 && parse_field == re_parse_field)
+		FS_regexp = FS_re_yes_case;
+}
+
+/* current_field_sep --- return the field separator type */
+
+field_sep_type
+current_field_sep()
+{
+	if (api_parser_override)
+		return Using_API;
+	else if (parse_field == fw_parse_field)
+		return Using_FIELDWIDTHS;
+	else if (parse_field == fpat_parse_field)
+		return Using_FPAT;
+	else
+		return Using_FS;
+}
+
+/* current_field_sep_str --- return the field separator type as a string */
+
+const char *
+current_field_sep_str()
+{
+	if (api_parser_override)
+		return "API";
+	else if (parse_field == fw_parse_field)
+		return "FIELDWIDTHS";
+	else if (parse_field == fpat_parse_field)
+		return "FPAT";
+	else
+		return "FS";
+}
+
+/* update_PROCINFO_str --- update PROCINFO[sub] with string value */
+
+void
+update_PROCINFO_str(const char *subscript, const char *str)
+{
+	NODE *tmp;
+
+	if (PROCINFO_node == NULL)
+		return;
+	tmp = make_string(subscript, strlen(subscript));
+	assoc_set(PROCINFO_node, tmp, make_string(str, strlen(str)));
+}
+
+/* update_PROCINFO_num --- update PROCINFO[sub] with numeric value */
+
+void
+update_PROCINFO_num(const char *subscript, AWKNUM val)
+{
+	NODE *tmp;
+
+	if (PROCINFO_node == NULL)
+		return;
+	tmp = make_string(subscript, strlen(subscript));
+	assoc_set(PROCINFO_node, tmp, make_number(val));
+}
+
+/* set_FPAT --- handle an assignment to FPAT */
+
+void
+set_FPAT()
+{
+	static bool warned = false;
+	static NODE *save_fpat = NULL;
+	bool remake_re = true;
+	NODE *fpat;
+
+	if (do_lint_extensions && ! warned) {
+		warned = true;
+		lintwarn(_("`FPAT' is a gawk extension"));
+	}
+	if (do_traditional)	/* quick and dirty, does the trick */
+		return;
+
+	/*
+	 * If changing the way fields are split, obey least-suprise
+	 * semantics, and force $0 to be split totally.
+	 */
+	if (fields_arr != NULL)
+		(void) get_field(UNLIMITED - 1, 0);
+
+	/* It's possible that only IGNORECASE changed, or FPAT = FPAT */
+	/*
+	 * This comparison can't use cmp_nodes(), which pays attention
+	 * to IGNORECASE, and that's not what we want.
+	 */
+	if (save_fpat
+		&& FPAT_node->var_value->stlen == save_fpat->stlen
+		&& memcmp(FPAT_node->var_value->stptr, save_fpat->stptr, save_fpat->stlen) == 0) {
+		if (FPAT_regexp != NULL)
+			FPAT_regexp = (IGNORECASE ? FPAT_re_no_case : FPAT_re_yes_case);
+
+		/* FPAT = FPAT */
+		if (current_field_sep() == Using_FPAT) {
+			return;
+		} else {
+			remake_re = false;
+			goto set_fpat_function;
+		}
+	}
+
+	unref(save_fpat);
+	save_fpat = dupnode(FPAT_node->var_value);
+	refree(FPAT_re_yes_case);
+	refree(FPAT_re_no_case);
+	FPAT_re_yes_case = FPAT_re_no_case = FPAT_regexp = NULL;
+
+set_fpat_function:
+	fpat = force_string(FPAT_node->var_value);
+	set_parser(fpat_parse_field);
+
+	if (remake_re) {
+		refree(FPAT_re_yes_case);
+		refree(FPAT_re_no_case);
+		FPAT_re_yes_case = FPAT_re_no_case = FPAT_regexp = NULL;
+
+		FPAT_re_yes_case = make_regexp(fpat->stptr, fpat->stlen, false, true, true);
+		FPAT_re_no_case = make_regexp(fpat->stptr, fpat->stlen, true, true, true);
+		FPAT_regexp = (IGNORECASE ? FPAT_re_no_case : FPAT_re_yes_case);
+	}
+}
+
+/*
+ * increment_scan --- macro to move scan pointer ahead by one character.
+ * 			Implementation varies if doing MBS or not.
+ */
+
+#define increment_scan(scanp, len) incr_scan(scanp, len, & mbs)
+
+/* incr_scan --- MBS version of increment_scan() */
+
+static void
+incr_scan(char **scanp, size_t len, mbstate_t *mbs)
+{
+	size_t mbclen = 0;
+
+	if (gawk_mb_cur_max > 1) {
+		mbclen = mbrlen(*scanp, len, mbs);
+		if (   (mbclen == 1)
+		    || (mbclen == (size_t) -1)
+		    || (mbclen == (size_t) -2)
+		    || (mbclen == 0)) {
+			/* We treat it as a singlebyte character.  */
+			mbclen = 1;
+		}
+		*scanp += mbclen;
+	} else
+		(*scanp)++;
+}
+
+/*
+ * fpat_parse_field --- parse fields using a regexp.
+ *
+ * This is called both from get_field() and from do_patsplit()
+ * via (*parse_field)().  This variation is for when FPAT is a regular
+ * expression -- use the value to find field contents.
+ *
+ * The FPAT parsing logic is a bit difficult to specify. In particular
+ * to allow null fields at certain locations. To make the code as robust
+ * as possible, an awk reference implementation was written and tested
+ * as a first step, and later recoded in C, preserving its structure as
+ * much as possible.
+ *
+ * # Reference implementation of the FPAT record parsing.
+ * #
+ * # Each loop iteration identifies a (separator[n-1],field[n]) pair.
+ * # Each loop iteration must consume some characters, except for the first field.
+ * # So a null field is only valid as a first field or after a non-null separator.
+ * # A null record has no fields (not a single null field).
+ * 
+ * function refpatsplit(string, fields, pattern, seps,
+ *         parse_start, sep_start, field_start, field_length, field_found, nf) # locals
+ * {
+ *     # Local state variables:
+ *     # - parse_start: pointer to the first not yet consumed character
+ *     # - sep_start: pointer to the beginning of the parsed separator
+ *     # - field start: pointer to the beginning of the parsed field
+ *     # - field length: length of the parsed field
+ *     # - field_found: flag for succesful field match
+ *     # - nf: Number of fields found so far
+ *     
+ *     # Prepare for parsing
+ *     parse_start = 1   # first not yet parsed char
+ *     nf = 0            # fields found so far
+ *     delete fields
+ *     delete seps
+ * 
+ *     # Loop that consumes the whole record
+ *     while (parse_start <= length(string)) {  # still something to parse
+ *     
+ *         # first attempt to match the next field
+ *         sep_start = parse_start
+ *         field_found = match(substr(string, parse_start), pattern)
+ *         
+ *         # check for an invalid null field and retry one character away
+ *         if (nf > 0 && field_found && RSTART==1 && RLENGTH==0) {
+ *             parse_start++
+ *             field_found = match(substr(string, parse_start), pattern)
+ *         }
+ *         
+ *         # store the (sep[n-1],field[n]) pair
+ *         if (field_found) {
+ *             field_start = parse_start + RSTART - 1
+ *             field_length = RLENGTH
+ *             seps[nf] = substr(string, sep_start, field_start-sep_start)
+ *             fields[++nf] = substr(string, field_start, field_length)
+ *             parse_start = field_start + field_length
+ *             
+ *         # store the final extra sep after the last field
+ *         } else {
+ *             seps[nf] = substr(string, sep_start)
+ *             parse_start = length(string) + 1
+ *         }
+ *     }
+ *     
+ *     return nf
+ * }
+ */
+static long
+fpat_parse_field(long up_to,	/* parse only up to this field number */
+	char **buf,	/* on input: string to parse; on output: point to start next */
+	int len,
+	NODE *fs ATTRIBUTE_UNUSED,
+	Regexp *rp,
+	Setfunc set,	/* routine to set the value of the parsed field */
+	NODE *n,
+	NODE *sep_arr,  /* array of field separators (may be NULL) */
+	bool in_middle)
+{
+	char *scan = *buf;
+	long nf = parse_high_water;
+	char *start;
+	char *end = scan + len;
+	int regex_flags = RE_NEED_START;
+	mbstate_t mbs;
+	char* field_start;
+	bool field_found = false;
+
+	memset(&mbs, 0, sizeof(mbstate_t));
+
+	if (up_to == UNLIMITED)
+		nf = 0;
+
+	if (len == 0)
+		return nf;
+
+	if (rp == NULL) /* use FPAT */
+		rp = FPAT_regexp;
+
+	while (scan < end && nf < up_to) {  /* still something to parse */
+
+		/* first attempt to match the next field */
+		start = scan;
+		field_found = research(rp, scan, 0, (end - scan), regex_flags) != -1;
+
+		/* check for an invalid null field and retry one character away */ 
+		if (nf > 0 && field_found && REEND(rp, scan) == 0) { /* invalid null field */
+			increment_scan(& scan, end - scan);
+			field_found = research(rp, scan, 0, (end - scan), regex_flags) != -1;
+		}
+
+		/* store the (sep[n-1],field[n]) pair */
+		if (field_found) {
+			field_start = scan + RESTART(rp, scan);
+			if (sep_arr != NULL) { /* store the separator */
+				if (field_start == start) /* match at front */
+					set_element(nf, start, 0L, sep_arr);
+				else
+					set_element(nf,
+						start,
+						(long) (field_start - start),
+						sep_arr);
+			}
+			/* field is text that matched */
+			(*set)(++nf,
+				field_start,
+				(long)(REEND(rp, scan) - RESTART(rp, scan)),
+				n);
+			scan += REEND(rp, scan);
+
+		} else {
+			/*
+			 * No match, store the final extra separator after
+			 * the last field.
+			 */
+			if (sep_arr != NULL)
+				set_element(nf, start, (long) (end - start), sep_arr);
+			scan = end;
+		}
+	}
+
+	/*
+	 * If the last field extends up to the end of the record, generate
+	 * a null trailing separator
+	 */
+	if (sep_arr != NULL && scan == end && field_found) 
+		set_element(nf, scan, 0L, sep_arr);
+
+	*buf = scan;
+	return nf;
+}
diff --git a/gawk-5.0.1/floatcomp.c b/gawk-5.0.1/floatcomp.c
new file mode 100644
index 00000000000..7317fa759c6
--- /dev/null
+++ b/gawk-5.0.1/floatcomp.c
@@ -0,0 +1,114 @@
+/*
+ * floatcomp.c - Isolate floating point details.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2011, 2016
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+#include <math.h>
+
+#ifdef HAVE_UINTMAX_T
+
+/* Assume IEEE-754 arithmetic on pre-C89 hosts.  */
+#ifndef FLT_RADIX
+#define FLT_RADIX 2
+#endif
+#ifndef FLT_MANT_DIG
+#define FLT_MANT_DIG 24
+#endif
+#ifndef DBL_MANT_DIG
+#define DBL_MANT_DIG 53
+#endif
+
+/*
+ * The number of base-FLT_RADIX digits in an AWKNUM fraction, assuming
+ * that AWKNUM is not long double.
+ */
+#define AWKSMALL_MANT_DIG \
+  (sizeof (AWKNUM) == sizeof (double) ? DBL_MANT_DIG : FLT_MANT_DIG)
+
+/*
+ * The number of base-FLT_DIGIT digits in an AWKNUM fraction, even if
+ * AWKNUM is long double.  Don't mention 'long double' unless
+ * LDBL_MANT_DIG is defined, for the sake of ancient compilers that
+ * lack 'long double'.
+ */
+#ifdef LDBL_MANT_DIG
+#define AWKNUM_MANT_DIG \
+  (sizeof (AWKNUM) == sizeof (long double) ? LDBL_MANT_DIG : AWKSMALL_MANT_DIG)
+#else
+#define AWKNUM_MANT_DIG AWKSMALL_MANT_DIG
+#endif
+
+/*
+ * The number of bits in an AWKNUM fraction, assuming FLT_RADIX is
+ * either 2 or 16.  IEEE and VAX formats use radix 2, and IBM
+ * mainframe format uses radix 16; we know of no other radices in
+ * practical use.
+ */
+#if FLT_RADIX != 2 && FLT_RADIX != 16
+Please port the following code to your weird host;
+#endif
+#define AWKNUM_FRACTION_BITS (AWKNUM_MANT_DIG * (FLT_RADIX == 2 ? 1 : 4))
+#define DBL_FRACTION_BITS (DBL_MANT_DIG * (FLT_RADIX == 2 ? 1 : 4))
+
+/* Return the number of trailing zeros in N.  N must be nonzero.  */
+static int
+count_trailing_zeros(uintmax_t n)
+{
+#if 3 < (__GNUC__ + (4 <= __GNUC_MINOR__)) && UINTMAX_MAX <= ULLONG_MAX
+	return __builtin_ctzll(n);
+#else
+	int i = 0;
+	for (; (n & 3) == 0; n >>= 2)
+		i += 2;
+	return i + (1 & ~n);
+#endif
+}
+
+/* adjust_uint --- fiddle with values, ask Paul Eggert to explain */
+
+uintmax_t
+adjust_uint(uintmax_t n)
+{
+	/*
+	 * If uintmax_t is so wide that AWKNUM cannot represent all its
+	 * values, strip leading nonzero bits of integers that are so large
+	 * that they cannot be represented exactly as AWKNUMs, so that their
+	 * low order bits are represented exactly, without rounding errors.
+	 * This is more desirable in practice, since it means the user sees
+	 * integers that are the same width as the AWKNUM fractions.
+	 */
+	int wordbits = CHAR_BIT * sizeof n;
+	if (AWKNUM_FRACTION_BITS < wordbits) {
+		uintmax_t one = 1;
+		uintmax_t sentinel = one << (wordbits - AWKNUM_FRACTION_BITS);
+		int shift = count_trailing_zeros(n | sentinel);
+		uintmax_t mask = (one << AWKNUM_FRACTION_BITS) - 1;
+
+		n &= mask << shift;
+	}
+
+	return n;
+}
+#endif /* HAVE_UINTMAX_T */
diff --git a/gawk-5.0.1/floatmagic.h b/gawk-5.0.1/floatmagic.h
new file mode 100644
index 00000000000..cb22b611b6a
--- /dev/null
+++ b/gawk-5.0.1/floatmagic.h
@@ -0,0 +1,54 @@
+/*
+ * floatmagic.h -- Definitions of isnan and isinf for gawk.
+ */
+
+/*
+ * Copyright (C) 2009 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/*
+ * NOTE: <math.h> MUST be included before this file. Also <config.h>.
+ *
+ * These definitions are taken from the Autoconf 2.63 manual. Not pretty.
+ */
+
+#ifndef HAVE_ISNAN
+#ifndef isnan
+# define isnan(x) \
+    (sizeof (x) == sizeof (long double) ? isnan_ld (x) \
+     : sizeof (x) == sizeof (double) ? isnan_d (x) \
+     : isnan_f (x))
+static inline int isnan_f  (float       x) { return x != x; }
+static inline int isnan_d  (double      x) { return x != x; }
+static inline int isnan_ld (long double x) { return x != x; }
+#endif
+#endif
+
+#ifndef HAVE_ISINF
+#ifndef isinf
+# define isinf(x) \
+    (sizeof (x) == sizeof (long double) ? isinf_ld (x) \
+     : sizeof (x) == sizeof (double) ? isinf_d (x) \
+     : isinf_f (x))
+static inline int isinf_f  (float       x) { return isnan (x - x); }
+static inline int isinf_d  (double      x) { return isnan (x - x); }
+static inline int isinf_ld (long double x) { return isnan (x - x); }
+#endif
+#endif
diff --git a/gawk-5.0.1/gawkapi.c b/gawk-5.0.1/gawkapi.c
new file mode 100644
index 00000000000..99c25beda51
--- /dev/null
+++ b/gawk-5.0.1/gawkapi.c
@@ -0,0 +1,1621 @@
+/*
+ * gawkapi.c -- Implement the functions defined for gawkapi.h
+ */
+
+/*
+ * Copyright (C) 2012-2019 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+#ifdef HAVE_MPFR
+#define getmpfr(n)	getblock(n, BLOCK_MPFR, mpfr_ptr)
+#define freempfr(n)	freeblock(n, BLOCK_MPFR)
+
+#define getmpz(n)	getblock(n, BLOCK_MPZ, mpz_ptr)
+#define freempz(n)	freeblock(n, BLOCK_MPZ)
+#endif
+
+/* Declare some globals used by api_get_file: */
+extern IOBUF *curfile;
+extern INSTRUCTION *main_beginfile;
+extern int currule;
+
+static awk_bool_t node_to_awk_value(NODE *node, awk_value_t *result, awk_valtype_t wanted);
+static char *valtype2str(awk_valtype_t type);
+static NODE *ns_lookup(const char *name_space, const char *name, char **full_name);
+
+/*
+ * api_get_argument --- get the count'th paramater, zero-based.
+ *
+ * Returns false if count is out of range, or if actual paramater
+ * does not match what is specified in wanted. In the latter
+ * case, fills in result->val_type with the actual type.
+ */
+
+static awk_bool_t
+api_get_argument(awk_ext_id_t id, size_t count,
+			awk_valtype_t wanted, awk_value_t *result)
+{
+#ifdef DYNAMIC
+	NODE *arg;
+
+	if (result == NULL)
+		return awk_false;
+
+	(void) id;
+
+	/* set up default result */
+	memset(result, 0, sizeof(*result));
+	result->val_type = AWK_UNDEFINED;
+
+	/*
+	 * Song and dance here.  get_array_argument() and get_scalar_argument()
+	 * will force a change in type of a parameter that is Node_var_new.
+	 *
+	 * Start by looking at the unadulterated argument as it was passed.
+	 */
+	arg = get_argument(count);
+	if (arg == NULL)
+		return awk_false;
+
+	/* if type is undefined */
+	if (arg->type == Node_var_new) {
+		if (wanted == AWK_UNDEFINED)
+			return true;
+		else if (wanted == AWK_ARRAY) {
+			goto array;
+		} else {
+			goto scalar;
+		}
+	}
+
+	/* at this point, we have real type */
+	if (arg->type == Node_var_array || arg->type == Node_array_ref) {
+		if (wanted != AWK_ARRAY && wanted != AWK_UNDEFINED)
+			return false;
+		goto array;
+	} else
+		goto scalar;
+
+array:
+	/* get the array here */
+	arg = get_array_argument(arg, count);
+	if (arg == NULL)
+		return awk_false;
+
+	return node_to_awk_value(arg, result, wanted);
+
+scalar:
+	/* at this point we have a real type that is not an array */
+	arg = get_scalar_argument(arg, count);
+	if (arg == NULL)
+		return awk_false;
+
+	return node_to_awk_value(arg, result, wanted);
+#else
+	return awk_false;
+#endif
+}
+
+/* api_set_argument --- convert an argument to an array */
+
+static awk_bool_t
+api_set_argument(awk_ext_id_t id,
+		size_t count,
+		awk_array_t new_array)
+{
+#ifdef DYNAMIC
+	NODE *arg;
+	NODE *array = (NODE *) new_array;
+
+	(void) id;
+
+	if (array == NULL || array->type != Node_var_array)
+		return awk_false;
+
+	if (   (arg = get_argument(count)) == NULL
+	    || arg->type != Node_var_new)
+		return awk_false;
+
+	arg = get_array_argument(arg, count);
+	if (arg == NULL)
+		return awk_false;
+
+	array->vname = arg->vname;
+	*arg = *array;
+	freenode(array);
+
+	return awk_true;
+#else
+	return awk_false;
+#endif
+}
+
+/* awk_value_to_node --- convert a value into a NODE */
+
+NODE *
+awk_value_to_node(const awk_value_t *retval)
+{
+	NODE *ext_ret_val = NULL;
+	NODE *v;
+
+	if (retval == NULL)
+		fatal(_("awk_value_to_node: received null retval"));
+
+	switch (retval->val_type) {
+	case AWK_ARRAY:
+		ext_ret_val = (NODE *) retval->array_cookie;
+		break;
+	case AWK_UNDEFINED:
+		ext_ret_val = dupnode(Nnull_string);
+		break;
+	case AWK_NUMBER:
+		switch (retval->num_type) {
+		case AWK_NUMBER_TYPE_DOUBLE:
+			ext_ret_val = make_number(retval->num_value);
+			break;
+		case AWK_NUMBER_TYPE_MPFR:
+#ifdef HAVE_MPFR
+			if (! do_mpfr)
+				fatal(_("awk_value_to_node: not in MPFR mode"));
+			ext_ret_val = make_number_node(MPFN);
+			memcpy(&ext_ret_val->mpg_numbr, retval->num_ptr, sizeof(ext_ret_val->mpg_numbr));
+			freempfr(retval->num_ptr);
+#else
+			fatal(_("awk_value_to_node: MPFR not supported"));
+#endif
+			break;
+		case AWK_NUMBER_TYPE_MPZ:
+#ifdef HAVE_MPFR
+			if (! do_mpfr)
+				fatal(_("awk_value_to_node: not in MPFR mode"));
+			ext_ret_val = make_number_node(MPZN);
+			memcpy(&ext_ret_val->mpg_i, retval->num_ptr, sizeof(ext_ret_val->mpg_i));
+			freempz(retval->num_ptr);
+#else
+			fatal(_("awk_value_to_node: MPFR not supported"));
+#endif
+			break;
+		default:
+			fatal(_("awk_value_to_node: invalid number type `%d'"), retval->num_type);
+			break;
+		}
+		break;
+	case AWK_STRING:
+		ext_ret_val = make_str_node(retval->str_value.str,
+				retval->str_value.len, ALREADY_MALLOCED);
+		break;
+	case AWK_STRNUM:
+		ext_ret_val = make_str_node(retval->str_value.str,
+				retval->str_value.len, ALREADY_MALLOCED);
+		ext_ret_val->flags |= USER_INPUT;
+		break;
+	case AWK_REGEX:
+		ext_ret_val = make_typed_regex(retval->str_value.str,
+				retval->str_value.len);
+		break;
+	case AWK_SCALAR:
+		v = (NODE *) retval->scalar_cookie;
+		if (v->type != Node_var)
+			ext_ret_val = NULL;
+		else
+			ext_ret_val = dupnode(v->var_value);
+		break;
+	case AWK_VALUE_COOKIE:
+		ext_ret_val = dupnode((NODE *)(retval->value_cookie));
+		break;
+	default:	/* any invalid type */
+		ext_ret_val = NULL;
+		break;
+	}
+
+	return ext_ret_val;
+}
+
+/* Functions to print messages */
+
+/* api_fatal --- print a fatal message and exit */
+
+static void
+api_fatal(awk_ext_id_t id, const char *format, ...)
+{
+	va_list args;
+
+	(void) id;
+
+	va_start(args, format);
+	err(true, _("fatal: "), format, args);
+	va_end(args);
+}
+
+/* api_nonfatal --- print a non fatal error message */
+
+static void
+api_nonfatal(awk_ext_id_t id, const char *format, ...)
+{
+	va_list args;
+
+	(void) id;
+
+	va_start(args, format);
+	err(false, _("error: "), format, args);
+	va_end(args);
+}
+
+/* api_warning --- print a warning message */
+
+static void
+api_warning(awk_ext_id_t id, const char *format, ...)
+{
+	va_list args;
+
+	(void) id;
+
+	va_start(args, format);
+	err(false, _("warning: "), format, args);
+	va_end(args);
+}
+
+/* api_lintwarn --- print a lint warning message and exit if appropriate */
+
+static void
+api_lintwarn(awk_ext_id_t id, const char *format, ...)
+{
+	va_list args;
+
+	(void) id;
+
+	va_start(args, format);
+	if (lintwarn == r_fatal) {
+		err(true, _("fatal: "), format, args);
+	} else {
+		err(false, _("warning: "), format, args);
+	}
+	va_end(args);
+}
+
+/* api_register_input_parser --- register an input_parser; for opening files read-only */
+
+static void
+api_register_input_parser(awk_ext_id_t id, awk_input_parser_t *input_parser)
+{
+	(void) id;
+
+	if (input_parser == NULL)
+		return;
+
+	register_input_parser(input_parser);
+}
+
+/* api_register_output_wrapper --- register an output wrapper, for writing files / two-way pipes */
+
+static void api_register_output_wrapper(awk_ext_id_t id,
+		awk_output_wrapper_t *output_wrapper)
+{
+	(void) id;
+
+	if (output_wrapper == NULL)
+		return;
+
+	register_output_wrapper(output_wrapper);
+}
+
+/* api_register_two_way_processor --- register a processor for two way I/O */
+
+static void
+api_register_two_way_processor(awk_ext_id_t id,
+		awk_two_way_processor_t *two_way_processor)
+{
+	(void) id;
+
+	if (two_way_processor == NULL)
+		return;
+
+	register_two_way_processor(two_way_processor);
+}
+
+/* Functions to update ERRNO */
+
+/* api_update_ERRNO_int --- update ERRNO with an integer value */
+
+static void
+api_update_ERRNO_int(awk_ext_id_t id, int errno_val)
+{
+	(void) id;
+
+	update_ERRNO_int(errno_val);
+}
+
+/* api_update_ERRNO_string --- update ERRNO with a string value */
+
+static void
+api_update_ERRNO_string(awk_ext_id_t id,
+			const char *string)
+{
+	(void) id;
+
+	if (string == NULL)
+		return;
+
+	update_ERRNO_string(string);
+}
+
+/* api_unset_ERRNO --- unset ERRNO */
+
+static void
+api_unset_ERRNO(awk_ext_id_t id)
+{
+	(void) id;
+
+	unset_ERRNO();
+}
+
+
+/* api_add_ext_func --- add a function to the interpreter, returns true upon success */
+
+static awk_bool_t
+api_add_ext_func(awk_ext_id_t id,
+		const char *name_space,
+		awk_ext_func_t *func)
+{
+	(void) id;
+
+	if (func == NULL)
+		return awk_false;
+
+	if (name_space == NULL)
+		fatal(_("add_ext_func: received NULL name_space parameter"));
+
+#ifdef DYNAMIC
+	return make_builtin(name_space, func);
+#else
+	return awk_false;
+#endif
+}
+
+/* Stuff for exit handler - do it as linked list */
+
+struct ext_exit_handler {
+	struct ext_exit_handler *next;
+	void (*funcp)(void *data, int exit_status);
+	void *arg0;
+};
+static struct ext_exit_handler *list_head = NULL;
+
+/* run_ext_exit_handlers --- run the extension exit handlers, LIFO order */
+
+void
+run_ext_exit_handlers(int exitval)
+{
+	struct ext_exit_handler *p, *next;
+
+	for (p = list_head; p != NULL; p = next) {
+		next = p->next;
+		p->funcp(p->arg0, exitval);
+		free(p);
+	}
+	list_head = NULL;
+}
+
+/* api_awk_atexit --- add an exit call back */
+
+static void
+api_awk_atexit(awk_ext_id_t id,
+		void (*funcp)(void *data, int exit_status),
+		void *arg0)
+{
+	struct ext_exit_handler *p;
+
+	(void) id;
+
+	if (funcp == NULL)
+		return;
+
+	/* allocate memory */
+	emalloc(p, struct ext_exit_handler *, sizeof(struct ext_exit_handler), "api_awk_atexit");
+
+	/* fill it in */
+	p->funcp = funcp;
+	p->arg0 = arg0;
+
+	/* add to linked list, LIFO order */
+	p->next = list_head;
+	list_head = p;
+}
+
+static struct {
+	char **strings;
+	size_t i, size;
+} scopy;
+
+/* free_api_string_copies --- release memory used by string copies */
+
+void
+free_api_string_copies()
+{
+	size_t i;
+
+	for (i = 0; i < scopy.i; i++)
+		free(scopy.strings[i]);
+	scopy.i = 0;
+}
+
+/* assign_string --- return a string node with NUL termination */
+
+static inline void
+assign_string(NODE *node, awk_value_t *val, awk_valtype_t val_type)
+{
+	val->val_type = val_type;
+	if (node->stptr[node->stlen] != '\0') {
+		/*
+		 * This is an unterminated field string, so make a copy.
+		 * This should happen only for $n where n > 0 and n < NF.
+		 */
+		char *s;
+
+		assert((node->flags & MALLOC) == 0);
+		if (scopy.i == scopy.size) {
+			/* expand list */
+			if (scopy.size == 0)
+				scopy.size = 8;	/* initial size */
+			else
+				scopy.size *= 2;
+			erealloc(scopy.strings, char **, scopy.size * sizeof(char *), "assign_string");
+		}
+		emalloc(s, char *, node->stlen + 1, "assign_string");
+		memcpy(s, node->stptr, node->stlen);
+		s[node->stlen] = '\0';
+		val->str_value.str = scopy.strings[scopy.i++] = s;
+	}
+	else
+		val->str_value.str = node->stptr;
+	val->str_value.len = node->stlen;
+}
+
+/* assign_number -- return a number node */
+
+#define assign_double(val) \
+	val->num_value = node->numbr; \
+	val->num_type = AWK_NUMBER_TYPE_DOUBLE; \
+	val->num_ptr = NULL
+
+static inline void
+assign_number(NODE *node, awk_value_t *val)
+{
+	val->val_type = AWK_NUMBER;
+
+#ifndef HAVE_MPFR
+	assign_double(val);
+#else
+	switch (node->flags & (MPFN|MPZN)) {
+	case 0:
+		assign_double(val);
+		break;
+	case MPFN:
+		val->num_value = mpfr_get_d(node->mpg_numbr, ROUND_MODE);
+		val->num_type = AWK_NUMBER_TYPE_MPFR;
+		val->num_ptr = &node->mpg_numbr;
+		break;
+	case MPZN:
+		val->num_value = mpz_get_d(node->mpg_i);
+		val->num_type = AWK_NUMBER_TYPE_MPZ;
+		val->num_ptr = &node->mpg_i;
+		break;
+	default:
+		fatal(_("node_to_awk_value: detected invalid numeric flags combination `%s'; please file a bug report."), flags2str(node->flags));
+		break;
+	}
+#endif
+}
+#undef assign_double
+
+/* assign_regex --- return a regex node */
+
+static inline void
+assign_regex(NODE *node, awk_value_t *val)
+{
+	/* a REGEX node cannot be an unterminated field string */
+	assert((node->flags & MALLOC) != 0);
+	assert(node->stptr[node->stlen] == '\0');
+	val->str_value.str = node->stptr;
+	val->str_value.len = node->stlen;
+	val->val_type = AWK_REGEX;
+}
+
+/* node_to_awk_value --- convert a node into a value for an extension */
+
+static awk_bool_t
+node_to_awk_value(NODE *node, awk_value_t *val, awk_valtype_t wanted)
+{
+	awk_bool_t ret = awk_false;
+
+	if (node == NULL)
+		fatal(_("node_to_awk_value: received null node"));
+
+	if (val == NULL)
+		fatal(_("node_to_awk_value: received null val"));
+
+	switch (node->type) {
+	case Node_var_new:	/* undefined variable */
+		val->val_type = AWK_UNDEFINED;
+		if (wanted == AWK_UNDEFINED) {
+			ret = awk_true;
+		}
+		break;
+
+	case Node_var:
+		/* a scalar value */
+		if (wanted == AWK_SCALAR) {
+			val->val_type = AWK_SCALAR;
+			val->scalar_cookie = (void *) node;
+			ret = awk_true;
+			break;
+		}
+
+		node = node->var_value;
+		/* FALL THROUGH */
+	case Node_val:
+		/* a scalar value */
+		switch (wanted) {
+		case AWK_NUMBER:
+			if (node->flags & REGEX)
+				val->val_type = AWK_REGEX;
+			else {
+				(void) force_number(node);
+				assign_number(node, val);
+				ret = awk_true;
+			}
+			break;
+
+		case AWK_STRNUM:
+			switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) {
+			case STRING:
+				val->val_type = AWK_STRING;
+				break;
+			case NUMBER:
+				(void) force_string(node);
+				/* fall through */
+			case NUMBER|USER_INPUT:
+				assign_string(node, val, AWK_STRNUM);
+				ret = awk_true;
+				break;
+			case REGEX:
+				val->val_type = AWK_REGEX;
+				break;
+			case NUMBER|STRING:
+				if (node == Nnull_string) {
+					val->val_type = AWK_UNDEFINED;
+					break;
+				}
+				/* fall through */
+			default:
+				warning(_("node_to_awk_value detected invalid flags combination `%s'; please file a bug report."), flags2str(node->flags));
+				val->val_type = AWK_UNDEFINED;
+				break;
+			}
+			break;
+
+		case AWK_STRING:
+			(void) force_string(node);
+			assign_string(node, val, AWK_STRING);
+			ret = awk_true;
+			break;
+
+		case AWK_REGEX:
+			switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) {
+			case STRING:
+				val->val_type = AWK_STRING;
+				break;
+			case NUMBER:
+				val->val_type = AWK_NUMBER;
+				break;
+			case NUMBER|USER_INPUT:
+				val->val_type = AWK_STRNUM;
+				break;
+			case REGEX:
+				assign_regex(node, val);
+				ret = awk_true;
+				break;
+			case NUMBER|STRING:
+				if (node == Nnull_string) {
+					val->val_type = AWK_UNDEFINED;
+					break;
+				}
+				/* fall through */
+			default:
+				warning(_("node_to_awk_value detected invalid flags combination `%s'; please file a bug report."), flags2str(node->flags));
+				val->val_type = AWK_UNDEFINED;
+				break;
+			}
+			break;
+
+		case AWK_SCALAR:
+			switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) {
+			case STRING:
+				val->val_type = AWK_STRING;
+				break;
+			case NUMBER:
+				val->val_type = AWK_NUMBER;
+				break;
+			case NUMBER|USER_INPUT:
+				val->val_type = AWK_STRNUM;
+				break;
+			case REGEX:
+				val->val_type = AWK_REGEX;
+				break;
+			case NUMBER|STRING:
+				if (node == Nnull_string) {
+					val->val_type = AWK_UNDEFINED;
+					break;
+				}
+				/* fall through */
+			default:
+				warning(_("node_to_awk_value detected invalid flags combination `%s'; please file a bug report."), flags2str(node->flags));
+				val->val_type = AWK_UNDEFINED;
+				break;
+			}
+			break;
+
+		case AWK_UNDEFINED:
+			/* return true and actual type for request of undefined */
+			switch (fixtype(node)->flags & (STRING|NUMBER|USER_INPUT|REGEX)) {
+			case STRING:
+				assign_string(node, val, AWK_STRING);
+				ret = awk_true;
+				break;
+			case NUMBER:
+				assign_number(node, val);
+				ret = awk_true;
+				break;
+			case NUMBER|USER_INPUT:
+				assign_string(node, val, AWK_STRNUM);
+				ret = awk_true;
+				break;
+			case REGEX:
+				assign_regex(node, val);
+				ret = awk_true;
+				break;
+			case NUMBER|STRING:
+				if (node == Nnull_string) {
+					val->val_type = AWK_UNDEFINED;
+					ret = awk_true;
+					break;
+				}
+				/* fall through */
+			default:
+				warning(_("node_to_awk_value detected invalid flags combination `%s'; please file a bug report."), flags2str(node->flags));
+				val->val_type = AWK_UNDEFINED;
+				break;
+			}
+			break;
+
+		case AWK_ARRAY:
+		case AWK_VALUE_COOKIE:
+			break;
+		}
+		break;
+
+	case Node_var_array:
+		val->val_type = AWK_ARRAY;
+		if (wanted == AWK_ARRAY || wanted == AWK_UNDEFINED) {
+			val->array_cookie = node;
+			ret = awk_true;
+		} else
+			ret = awk_false;
+		break;
+
+	default:
+		val->val_type = AWK_UNDEFINED;
+		ret = awk_false;
+		break;
+	}
+
+	return ret;
+}
+
+/*
+ * Symbol table access:
+ * 	- No access to special variables (NF, etc.)
+ * 	- One special exception: PROCINFO.
+ *	- Use sym_update() to change a value, including from UNDEFINED
+ *	  to scalar or array.
+ */
+/*
+ * Lookup a variable, fills in value. No messing with the value
+ * returned. Returns false if the variable doesn't exist
+ * or the wrong type was requested.
+ * In the latter case, fills in vaule->val_type with the real type.
+ * Built-in variables (except PROCINFO) may not be accessed by an extension.
+ */
+
+/* api_sym_lookup --- look up a symbol */
+
+static awk_bool_t
+api_sym_lookup(awk_ext_id_t id,
+		const char *name_space,
+		const char *name,
+		awk_valtype_t wanted,
+		awk_value_t *result)
+{
+	NODE *node;
+
+	update_global_values();		/* make sure stuff like NF, NR, are up to date */
+
+	if (   name == NULL
+	    || *name == '\0'
+	    || result == NULL
+	    || ! is_valid_identifier(name)
+	    || name_space == NULL
+	    || (name_space[0] != '\0' && ! is_valid_identifier(name_space)))
+		return awk_false;
+
+	if ((node = ns_lookup(name_space, name, NULL)) == NULL)
+		return awk_false;
+
+	if (is_off_limits_var(name))	/* a built-in variable */
+		node->flags |= NO_EXT_SET;
+
+	return node_to_awk_value(node, result, wanted);
+}
+
+/* api_sym_lookup_scalar --- retrieve the current value of a scalar */
+
+static awk_bool_t
+api_sym_lookup_scalar(awk_ext_id_t id,
+			awk_scalar_t cookie,
+			awk_valtype_t wanted,
+			awk_value_t *result)
+{
+	NODE *node = (NODE *) cookie;
+
+	if (node == NULL
+	    || result == NULL
+	    || node->type != Node_var)
+		return awk_false;
+
+	update_global_values();	/* make sure stuff like NF, NR, are up to date */
+
+	return node_to_awk_value(node, result, wanted);
+}
+
+/* api_sym_update --- update a symbol's value, see gawkapi.h for semantics */
+
+static awk_bool_t
+api_sym_update(awk_ext_id_t id,
+		const char *name_space,
+		const char *name,
+		awk_value_t *value)
+{
+	NODE *node;
+	NODE *array_node;
+
+	if (   name == NULL
+	    || *name == '\0'
+	    || value == NULL
+	    || ! is_valid_identifier(name)
+	    || name_space == NULL
+	    || (name_space[0] != '\0' && ! is_valid_identifier(name_space)))
+		return awk_false;
+
+	switch (value->val_type) {
+	case AWK_NUMBER:
+	case AWK_STRNUM:
+	case AWK_STRING:
+	case AWK_REGEX:
+	case AWK_UNDEFINED:
+	case AWK_ARRAY:
+	case AWK_SCALAR:
+	case AWK_VALUE_COOKIE:
+		break;
+
+	default:
+		/* fatal(_("api_sym_update: invalid value for type of new value (%d)"), value->val_type); */
+		return awk_false;
+	}
+
+	char *full_name = NULL;
+	node = ns_lookup(name_space, name, & full_name);
+
+	if (node == NULL) {
+		/* new value to be installed */
+		if (value->val_type == AWK_ARRAY) {
+			array_node = awk_value_to_node(value);
+			node = install_symbol(full_name, Node_var_array);
+			array_node->vname = node->vname;
+			*node = *array_node;
+			freenode(array_node);
+			value->array_cookie = node;	/* pass new cookie back to extension */
+		} else {
+			/* regular variable */
+			node = install_symbol(full_name, Node_var);
+			node->var_value = awk_value_to_node(value);
+		}
+
+		return awk_true;
+	}
+
+	/*
+	 * If we get here, then it exists already.  Any valid type is
+	 * OK except for AWK_ARRAY.
+	 */
+	if (   (node->flags & NO_EXT_SET) != 0
+	    || is_off_limits_var(full_name)) {	/* most built-in vars not allowed */
+		node->flags |= NO_EXT_SET;
+		efree((void *) full_name);
+		return awk_false;
+	}
+
+	efree((void *) full_name);
+
+	if (    value->val_type != AWK_ARRAY
+	    && (node->type == Node_var || node->type == Node_var_new)) {
+		unref(node->var_value);
+		node->var_value = awk_value_to_node(value);
+		if (node->type == Node_var_new && value->val_type != AWK_UNDEFINED)
+			node->type = Node_var;
+
+		return awk_true;
+	}
+
+	return awk_false;
+}
+
+/* api_sym_update_scalar --- update a scalar cookie */
+
+static awk_bool_t
+api_sym_update_scalar(awk_ext_id_t id,
+			awk_scalar_t cookie,
+			awk_value_t *value)
+{
+	NODE *node = (NODE *) cookie;
+
+	if (value == NULL
+	    || node == NULL
+	    || node->type != Node_var
+	    || (node->flags & NO_EXT_SET) != 0)
+		return awk_false;
+
+	/*
+	 * Optimization: if valref is 1, and the new value is a string or
+	 * a number, we can avoid calling unref and then making a new node
+	 * by simply installing the new value.  First, we follow the same
+	 * recipe used by node.c:r_unref to wipe the current values, and then
+	 * we copy the logic from r_make_number or make_str_node to install
+	 * the new value.
+	 */
+	switch (value->val_type) {
+	case AWK_NUMBER:
+		if (node->var_value->valref == 1 && ! do_mpfr) {
+			NODE *r = node->var_value;
+
+			/* r_unref: */
+			if ((r->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
+				efree(r->stptr);
+			free_wstr(r);
+
+			/* r_make_number: */
+			r->numbr = value->num_value;
+			r->flags = MALLOC|NUMBER|NUMCUR;
+			r->stptr = NULL;
+			r->stlen = 0;
+			return awk_true;
+		}
+		break;
+
+	case AWK_STRING:
+	case AWK_STRNUM:
+		if (node->var_value->valref == 1) {
+			NODE *r = node->var_value;
+
+			/* r_unref: */
+			if ((r->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
+				efree(r->stptr);
+
+			mpfr_unset(r);
+			free_wstr(r);
+
+			/* make_str_node(s, l, ALREADY_MALLOCED): */
+			r->numbr = 0;
+			r->flags = (MALLOC|STRING|STRCUR);
+			if (value->val_type == AWK_STRNUM)
+				r->flags |= USER_INPUT;
+			r->stfmt = STFMT_UNUSED;
+			r->stptr = value->str_value.str;
+			r->stlen = value->str_value.len;
+#ifdef HAVE_MPFR
+			r->strndmode = MPFR_round_mode;
+#endif
+			return awk_true;
+		}
+		break;
+
+	case AWK_REGEX:
+	case AWK_UNDEFINED:
+	case AWK_SCALAR:
+	case AWK_VALUE_COOKIE:
+		break;
+
+
+	default:	/* AWK_ARRAY or invalid type */
+		return awk_false;
+	}
+
+	/* do it the hard (slow) way */
+	unref(node->var_value);
+	node->var_value = awk_value_to_node(value);
+	return awk_true;
+}
+
+/*
+ * valid_subscript_type --- test if a type is allowed for an array subscript.
+ *
+ * Any scalar value is fine, so only AWK_ARRAY (or an invalid type) is illegal.
+ */
+
+static inline bool
+valid_subscript_type(awk_valtype_t valtype)
+{
+	switch (valtype) {
+	case AWK_UNDEFINED:
+	case AWK_NUMBER:
+	case AWK_STRNUM:
+	case AWK_STRING:
+	case AWK_REGEX:
+	case AWK_SCALAR:
+	case AWK_VALUE_COOKIE:
+		return true;
+	default:	/* AWK_ARRAY or an invalid type */
+		return false;
+	}
+}
+
+/* Array management */
+/*
+ * api_get_array_element --- teturn the value of an element - read only!
+ *
+ * Use set_array_element to change it.
+ */
+
+static awk_bool_t
+api_get_array_element(awk_ext_id_t id,
+		awk_array_t a_cookie,
+		const awk_value_t *const index,
+		awk_valtype_t wanted,
+		awk_value_t *result)
+{
+	NODE *array = (NODE *) a_cookie;
+	NODE *subscript;
+	NODE **aptr;
+
+	/* don't check for index len zero, null str is ok as index */
+	if (   array == NULL
+	    || array->type != Node_var_array
+	    || result == NULL
+	    || index == NULL
+	    || ! valid_subscript_type(index->val_type))
+		return awk_false;
+
+	subscript = awk_value_to_node(index);
+
+	/* if it doesn't exist, return false */
+	if (in_array(array, subscript) == NULL) {
+		unref(subscript);
+		return awk_false;
+	}
+
+	aptr = assoc_lookup(array, subscript);
+
+	if (aptr == NULL) {	/* can't happen */
+		unref(subscript);
+		return awk_false;
+	}
+
+	unref(subscript);
+
+	return node_to_awk_value(*aptr, result, wanted);
+}
+
+/*
+ * api_set_array_element --- change (or create) element in existing array
+ *	with element->index and element->value.
+ */
+
+static awk_bool_t
+api_set_array_element(awk_ext_id_t id, awk_array_t a_cookie,
+					const awk_value_t *const index,
+					const awk_value_t *const value)
+{
+	NODE *array = (NODE *)a_cookie;
+	NODE *tmp;
+	NODE *elem;
+
+	/* don't check for index len zero, null str is ok as index */
+	if (   array == NULL
+	    || array->type != Node_var_array
+	    || (array->flags & NO_EXT_SET) != 0
+	    || index == NULL
+	    || value == NULL
+	    || ! valid_subscript_type(index->val_type))
+		return awk_false;
+
+	tmp = awk_value_to_node(index);
+	elem = awk_value_to_node(value);
+	if (elem->type == Node_var_array) {
+		elem->parent_array = array;
+		elem->vname = estrdup(index->str_value.str,
+					index->str_value.len);
+	}
+	assoc_set(array, tmp, elem);
+
+	return awk_true;
+}
+
+/*
+ * remove_element --- remove an array element
+ *		common code used by multiple functions
+ */
+
+static void
+remove_element(NODE *array, NODE *subscript)
+{
+	NODE *val;
+
+	if (array == NULL)
+		fatal(_("remove_element: received null array"));
+
+	if (subscript == NULL)
+		fatal(_("remove_element: received null subscript"));
+
+	val = in_array(array, subscript);
+
+	if (val == NULL)
+		return;
+
+	if (val->type == Node_var_array) {
+		assoc_clear(val);
+		/* cleared a sub-array, free Node_var_array */
+		efree(val->vname);
+		freenode(val);
+	} else
+		unref(val);
+
+	(void) assoc_remove(array, subscript);
+}
+
+/*
+ * api_del_array_element --- remove the element with the given index.
+ *	Return success if removed or if element did not exist.
+ */
+
+static awk_bool_t
+api_del_array_element(awk_ext_id_t id,
+		awk_array_t a_cookie, const awk_value_t* const index)
+{
+	NODE *array, *sub;
+
+	array = (NODE *) a_cookie;
+	if (   array == NULL
+	    || array->type != Node_var_array
+	    || (array->flags & NO_EXT_SET) != 0
+	    || index == NULL
+	    || ! valid_subscript_type(index->val_type))
+		return awk_false;
+
+	sub = awk_value_to_node(index);
+	remove_element(array, sub);
+	unref(sub);
+
+	return awk_true;
+}
+
+/*
+ * api_get_element_count --- retrieve total number of elements in array.
+ *	Return false if some kind of error.
+ */
+
+static awk_bool_t
+api_get_element_count(awk_ext_id_t id,
+		awk_array_t a_cookie, size_t *count)
+{
+	NODE *node = (NODE *) a_cookie;
+
+	if (count == NULL || node == NULL || node->type != Node_var_array)
+		return awk_false;
+
+	*count = node->table_size;
+	return awk_true;
+}
+
+/* api_create_array --- create a new array cookie to which elements may be added */
+
+static awk_array_t
+api_create_array(awk_ext_id_t id)
+{
+	NODE *n;
+
+	getnode(n);
+	memset(n, 0, sizeof(NODE));
+	null_array(n);
+
+	return (awk_array_t) n;
+}
+
+/* api_clear_array --- clear out an array */
+
+static awk_bool_t
+api_clear_array(awk_ext_id_t id, awk_array_t a_cookie)
+{
+	NODE *node = (NODE *) a_cookie;
+
+	if (   node == NULL
+	    || node->type != Node_var_array
+	    || (node->flags & NO_EXT_SET) != 0)
+		return awk_false;
+
+	assoc_clear(node);
+	return awk_true;
+}
+
+/* api_flatten_array_typed --- flatten out an array so that it can be looped over easily. */
+
+static awk_bool_t
+api_flatten_array_typed(awk_ext_id_t id,
+		awk_array_t a_cookie,
+		awk_flat_array_t **data,
+		awk_valtype_t index_type, awk_valtype_t value_type)
+{
+	NODE **list;
+	size_t i, j;
+	NODE *array = (NODE *) a_cookie;
+	size_t alloc_size;
+
+	if (   array == NULL
+	    || array->type != Node_var_array
+	    || assoc_empty(array)
+	    || data == NULL)
+		return awk_false;
+
+	alloc_size = sizeof(awk_flat_array_t) +
+			(array->table_size - 1) * sizeof(awk_element_t);
+
+	ezalloc(*data, awk_flat_array_t *, alloc_size,
+			"api_flatten_array_typed");
+
+	list = assoc_list(array, "@unsorted", ASORTI);
+
+	(*data)->opaque1 = array;
+	(*data)->opaque2 = list;
+	(*data)->count = array->table_size;
+
+	for (i = j = 0; i < 2 * array->table_size; i += 2, j++) {
+		NODE *index, *value;
+
+		index = list[i];
+		value = list[i + 1]; /* number or string or subarray */
+
+		/* Convert index and value to API types. */
+		if (! node_to_awk_value(index,
+				& (*data)->elements[j].index, index_type)) {
+			fatal(_("api_flatten_array_typed: could not convert index %d to %s"),
+						(int) i, valtype2str(index_type));
+		}
+		if (! node_to_awk_value(value,
+				& (*data)->elements[j].value, value_type)) {
+			fatal(_("api_flatten_array_typed: could not convert value %d to %s"),
+						(int) i, valtype2str(value_type));
+		}
+	}
+	return awk_true;
+}
+
+/*
+ * api_release_flattened_array --- release array memory,
+ *	delete any marked elements. Count must match what
+ *	gawk thinks the size is.
+ */
+
+static awk_bool_t
+api_release_flattened_array(awk_ext_id_t id,
+		awk_array_t a_cookie,
+		awk_flat_array_t *data)
+{
+	NODE *array = a_cookie;
+	NODE **list;
+	size_t i, j, k;
+
+	if (   array == NULL
+	    || array->type != Node_var_array
+	    || data == NULL
+	    || array != (NODE *) data->opaque1
+	    || data->count != array->table_size
+	    || data->opaque2 == NULL)
+		return awk_false;
+
+	list = (NODE **) data->opaque2;
+
+	/* free index nodes */
+	for (i = j = 0, k = 2 * array->table_size; i < k; i += 2, j++) {
+		/* Delete items flagged for delete. */
+		if (   (data->elements[j].flags & AWK_ELEMENT_DELETE) != 0
+		    && (array->flags & NO_EXT_SET) == 0) {
+			remove_element(array, list[i]);
+		}
+		unref(list[i]);
+	}
+
+	efree(list);
+	efree(data);
+
+	return awk_true;
+}
+
+/* api_create_value --- create a cached value */
+
+static awk_bool_t
+api_create_value(awk_ext_id_t id, awk_value_t *value,
+		awk_value_cookie_t *result)
+{
+	if (value == NULL || result == NULL)
+		return awk_false;
+
+	switch (value->val_type) {
+	case AWK_NUMBER:
+	case AWK_STRNUM:
+	case AWK_STRING:
+	case AWK_REGEX:
+		break;
+	default:
+		/* reject anything other than a simple scalar */
+		return awk_false;
+	}
+
+	return (awk_bool_t) ((*result = awk_value_to_node(value)) != NULL);
+}
+
+/* api_release_value --- release a cached value */
+
+static awk_bool_t
+api_release_value(awk_ext_id_t id, awk_value_cookie_t value)
+{
+	NODE *val = (NODE *) value;
+
+	if (val == NULL)
+		return awk_false;
+
+	unref(val);
+	return awk_true;
+}
+
+/* api_get_mpfr --- allocate an mpfr_ptr */
+
+static void *
+api_get_mpfr(awk_ext_id_t id)
+{
+#ifdef HAVE_MPFR
+	mpfr_ptr p;
+	getmpfr(p);
+	mpfr_init(p);
+	return p;
+#else
+	fatal(_("api_get_mpfr: MPFR not supported"));
+	return NULL;	// silence compiler warning
+#endif
+}
+
+/* api_get_mpz --- allocate an mpz_ptr */
+
+static void *
+api_get_mpz(awk_ext_id_t id)
+{
+#ifdef HAVE_MPFR
+	mpz_ptr p;
+	getmpz(p);
+	mpz_init(p);
+	return p;
+#else
+	fatal(_("api_get_mpfr: MPFR not supported"));
+	return NULL;	// silence compiler warning
+#endif
+}
+
+/* api_get_file --- return a handle to an existing or newly opened file */
+
+static awk_bool_t
+api_get_file(awk_ext_id_t id, const char *name, size_t namelen, const char *filetype,
+		int fd, const awk_input_buf_t **ibufp, const awk_output_buf_t **obufp)
+{
+	const struct redirect *f;
+	int flag;	/* not used, sigh */
+	enum redirval redirtype;
+
+	if (name == NULL || namelen == 0) {
+		if (curfile == NULL) {
+			INSTRUCTION *pc;
+			int save_rule;
+			char *save_source;
+
+			if (nextfile(& curfile, false) <= 0)
+				return awk_false;
+
+			pc = main_beginfile;
+			/* save execution state */
+			save_rule = currule;
+			save_source = source;
+
+			for (;;) {
+				if (pc == NULL)
+					fatal(_("cannot find end of BEGINFILE rule"));
+				if (pc->opcode == Op_after_beginfile)
+					break;
+				pc = pc->nexti;
+			}
+			pc->opcode = Op_stop;
+		        (void) (*interpret)(main_beginfile);
+			pc->opcode = Op_after_beginfile;
+			after_beginfile(& curfile);
+			/* restore execution state */
+			currule = save_rule;
+			source = save_source;
+		}
+		*ibufp = &curfile->public;
+		*obufp = NULL;
+
+		return awk_true;
+	}
+
+	redirtype = redirect_none;
+	switch (filetype[0]) {
+	case '<':
+		if (filetype[1] == '\0')
+			redirtype = redirect_input;
+		break;
+	case '>':
+		switch (filetype[1]) {
+		case '\0':
+			redirtype = redirect_output;
+			break;
+		case '>':
+			if (filetype[2] == '\0')
+				redirtype = redirect_append;
+			break;
+		}
+		break;
+	case '|':
+		if (filetype[2] == '\0') {
+			switch (filetype[1]) {
+			case '>':
+				redirtype = redirect_pipe;
+				break;
+			case '<':
+				redirtype = redirect_pipein;
+				break;
+			case '&':
+				redirtype = redirect_twoway;
+				break;
+			}
+		}
+		break;
+	}
+
+	if (redirtype == redirect_none) {
+		warning(_("cannot open unrecognized file type `%s' for `%s'"),
+			filetype, name);
+		return awk_false;
+	}
+
+	if ((f = redirect_string(name, namelen, 0, redirtype, &flag, fd, false)) == NULL)
+		return awk_false;
+
+	*ibufp = f->iop ? & f->iop->public : NULL;
+	*obufp = f->output.fp ? & f->output : NULL;
+	return awk_true;
+}
+
+/*
+ * Register a version string for this extension with gawk.
+ */
+
+struct version_info {
+	const char *version;
+	struct version_info *next;
+};
+
+static struct version_info *vi_head;
+
+/* api_register_ext_version --- add an extension version string to the list */
+
+static void
+api_register_ext_version(awk_ext_id_t id, const char *version)
+{
+	struct version_info *info;
+
+	if (version == NULL)
+		return;
+
+	(void) id;
+
+	emalloc(info, struct version_info *, sizeof(struct version_info), "register_ext_version");
+	info->version = version;
+	info->next = vi_head;
+	vi_head = info;
+}
+
+/* the struct api */
+gawk_api_t api_impl = {
+	/* data */
+	GAWK_API_MAJOR_VERSION,	/* major and minor versions */
+	GAWK_API_MINOR_VERSION,
+
+#ifdef HAVE_MPFR
+	__GNU_MP_VERSION,
+	__GNU_MP_VERSION_MINOR,
+	MPFR_VERSION_MAJOR,
+	MPFR_VERSION_MINOR,
+#else
+	0, 0, 0, 0,
+#endif
+
+	{ 0 },			/* do_flags */
+
+	/* registration functions */
+	api_add_ext_func,
+	api_register_input_parser,
+	api_register_output_wrapper,
+	api_register_two_way_processor,
+	api_awk_atexit,
+	api_register_ext_version,
+
+	/* message printing functions */
+	api_fatal,
+	api_warning,
+	api_lintwarn,
+	api_nonfatal,
+
+	/* updating ERRNO */
+	api_update_ERRNO_int,
+	api_update_ERRNO_string,
+	api_unset_ERRNO,
+
+	/* Function arguments */
+	api_get_argument,
+	api_set_argument,
+
+	/* Accessing and installing variables and constants */
+	api_sym_lookup,
+	api_sym_update,
+
+	/* Accessing and modifying variables via scalar cookies */
+	api_sym_lookup_scalar,
+	api_sym_update_scalar,
+
+	/* Cached values */
+	api_create_value,
+	api_release_value,
+
+	/* Array management */
+	api_get_element_count,
+	api_get_array_element,
+	api_set_array_element,
+	api_del_array_element,
+	api_create_array,
+	api_clear_array,
+	api_flatten_array_typed,
+	api_release_flattened_array,
+
+	/* Memory allocation */
+	malloc,
+	calloc,
+	realloc,
+	free,
+	api_get_mpfr,
+	api_get_mpz,
+
+	/* Find/open a file */
+	api_get_file,
+};
+
+/* init_ext_api --- init the extension API */
+
+void
+init_ext_api()
+{
+	/* force values to 1 / 0 */
+	api_impl.do_flags[0] = (do_lint ? 1 : 0);
+	api_impl.do_flags[1] = (do_traditional ? 1 : 0);
+	api_impl.do_flags[2] = (do_profile ? 1 : 0);
+	api_impl.do_flags[3] = (do_sandbox ? 1 : 0);
+	api_impl.do_flags[4] = (do_debug ? 1 : 0);
+	api_impl.do_flags[5] = (do_mpfr ? 1 : 0);
+}
+
+/* update_ext_api --- update the variables in the API that can change */
+
+void
+update_ext_api()
+{
+	api_impl.do_flags[0] = (do_lint ? 1 : 0);
+}
+
+/* print_ext_versions --- print the list */
+
+extern void
+print_ext_versions(void)
+{
+	struct version_info *p;
+
+	for (p = vi_head; p != NULL; p = p->next)
+		printf("%s\n", p->version);
+}
+
+/* valtype2str --- return a printable representation of a value type */
+
+static char *
+valtype2str(awk_valtype_t type)
+{
+	static char buf[100];
+
+	// Important: keep in same order as in gawkapi.h!
+	static char *values[] = {
+		"AWK_UNDEFINED",
+		"AWK_NUMBER",
+		"AWK_STRING",
+		"AWK_REGEX",
+		"AWK_STRNUM",
+		"AWK_ARRAY",
+		"AWK_SCALAR",
+		"AWK_VALUE_COOKIE",
+	};
+
+	if (AWK_UNDEFINED <= type && type <= AWK_VALUE_COOKIE)
+		return values[(int) type];
+
+	sprintf(buf, "unknown type! (%d)", (int) type);
+
+	return buf;
+}
+
+/* ns_lookup --- correctly build name before looking it up */
+
+static NODE *
+ns_lookup(const char *name_space, const char *name, char **fullname)
+{
+	assert(name_space != NULL);
+	assert(name != NULL);
+
+	if (name_space[0] == '\0' || strcmp(name_space, awk_namespace) == 0) {
+		if (fullname != NULL)
+			*fullname = estrdup(name, strlen(name));
+		return lookup(name);
+	}
+
+	size_t len = strlen(name_space) + 2 + strlen(name) + 1;
+	char *buf;
+	emalloc(buf, char *, len, "ns_lookup");
+	sprintf(buf, "%s::%s", name_space, name);
+
+	NODE *f = lookup(buf);
+	if (fullname != NULL)
+		*fullname = buf;
+	else
+		efree((void *) buf);
+
+	return f;
+}
diff --git a/gawk-5.0.1/gawkapi.h b/gawk-5.0.1/gawkapi.h
new file mode 100644
index 00000000000..3db8990a44d
--- /dev/null
+++ b/gawk-5.0.1/gawkapi.h
@@ -0,0 +1,1183 @@
+/*
+ * gawkapi.h -- Definitions for use by extension functions calling into gawk.
+ */
+
+/*
+ * Copyright (C) 2012-2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/*
+ * The following types and/or macros and/or functions are referenced
+ * in this file.  For correct use, you must therefore include the
+ * corresponding standard header file BEFORE including this file.
+ *
+ * FILE			- <stdio.h>
+ * NULL			- <stddef.h>
+ * memset(), memcpy()	- <string.h>
+ * size_t		- <sys/types.h>
+ * struct stat		- <sys/stat.h>
+ *
+ * Due to portability concerns, especially to systems that are not
+ * fully standards-compliant, it is your responsibility to include
+ * the correct files in the correct way. This requirement is necessary
+ * in order to keep this file clean, instead of becoming a portability
+ * hodge-podge as can be seen in the gawk source code.
+ *
+ * To pass reasonable integer values for ERRNO, you will also need to
+ * include <errno.h>.
+ */
+
+#ifndef _GAWK_API_H
+#define _GAWK_API_H
+
+/*
+ * General introduction:
+ *
+ * This API purposely restricts itself to ISO C 90 features.  In particular, no
+ * bool, no // comments, no use of the restrict keyword, or anything else,
+ * in order to provide maximal portability.
+ *
+ * Exception: the "inline" keyword is used below in the "constructor"
+ * functions. If your compiler doesn't support it, you should either
+ * -Dinline='' on your command line, or use the autotools and include a
+ * config.h in your extensions.
+ *
+ * Additional important information:
+ *
+ * 1. ALL string values in awk_value_t objects need to come from api_malloc().
+ * Gawk will handle releasing the storage if necessary.  This is slightly
+ * awkward, in that you can't take an awk_value_t that you got from gawk
+ * and reuse it directly, even for something that is conceptually pass
+ * by value.
+ *
+ * 2. Due to gawk internals, after using sym_update() to install an array
+ * into gawk, you have to retrieve the array cookie from the value
+ * passed in to sym_update().  Like so:
+ *
+ *	new_array = create_array();
+ *	val.val_type = AWK_ARRAY;
+ *	val.array_cookie = new_array;
+ *	sym_update("array", & val);	// install array in the symbol table
+ *
+ *	new_array = val.array_cookie;	// MUST DO THIS
+ *
+ *	// fill in new array with lots of subscripts and values
+ *
+ * Similarly, if installing a new array as a subarray of an existing
+ * array, you must add the new array to its parent before adding any
+ * elements to it.
+ *
+ * You must also retrieve the value of the array_cookie after the call
+ * to set_element().
+ *
+ * Thus, the correct way to build an array is to work "top down".
+ * Create the array, and immediately install it in gawk's symbol table
+ * using sym_update(), or install it as an element in a previously
+ * existing array using set_element().
+ *
+ * Thus the new array must ultimately be rooted in a global symbol. This is
+ * necessary before installing any subarrays in it, due to gawk's
+ * internal implementation.  Strictly speaking, this is required only
+ * for arrays that will have subarrays as elements; however it is
+ * a good idea to always do this.  This restriction may be relaxed
+ * in a subsequent revision of the API.
+ */
+
+/* Allow use in C++ code.  */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* This is used to keep extensions from modifying certain fields in some structs. */
+#ifdef GAWK
+#define awk_const
+#else
+#define awk_const const
+#endif
+
+typedef enum awk_bool {
+	awk_false = 0,
+	awk_true
+} awk_bool_t;	/* we don't use <stdbool.h> on purpose */
+
+/*
+ * If an input parser would like to specify the field positions in the input
+ * record, it may populate an awk_fieldwidth_info_t structure to indicate
+ * the location of each field. The use_chars boolean controls whether the
+ * field lengths are specified in terms of bytes or potentially multi-byte
+ * characters. Performance will be better if the values are supplied in
+ * terms of bytes. The fields[0].skip value indicates how many bytes (or
+ * characters) to skip before $1, and fields[0].len is the length of $1, etc.
+ */
+
+typedef struct {
+	awk_bool_t	use_chars;	/* false ==> use bytes */
+	size_t		nf;
+	struct awk_field_info {
+		size_t	skip;	/* amount to skip before field starts */
+		size_t	len;	/* length of field */
+	} fields[1];		/* actual dimension should be nf */
+} awk_fieldwidth_info_t;
+
+/*
+ * This macro calculates the total struct size needed. This is useful when
+ * calling malloc or realloc.
+ */
+#define awk_fieldwidth_info_size(NF) (sizeof(awk_fieldwidth_info_t) + \
+			(((NF)-1) * sizeof(struct awk_field_info)))
+
+/* The information about input files that input parsers need to know: */
+typedef struct awk_input {
+	const char *name;	/* filename */
+	int fd;			/* file descriptor */
+#define INVALID_HANDLE (-1)
+	void *opaque;           /* private data for input parsers */
+	/*
+	 * The get_record function is called to read the next record of data.
+	 *
+	 * It should return the length of the input record or EOF, and it
+	 * should set *out to point to the contents of $0. The rt_start
+	 * and rt_len arguments should be used to return RT to gawk.
+	 * If EOF is not returned, the parser must set *rt_len (and
+	 * *rt_start if *rt_len is non-zero).
+	 *
+	 * Note that gawk will make a copy of the record in *out, so the
+	 * parser is responsible for managing its own memory buffer.
+	 * Similarly, gawk will make its own copy of RT, so the parser
+	 * is also responsible for managing this memory.
+	 *
+	 * It is guaranteed that errcode is a valid pointer, so there is
+	 * no need to test for a NULL value.  Gawk sets *errcode to 0,
+	 * so there is no need to set it unless an error occurs.
+	 *
+	 * If an error does occur, the function should return EOF and set
+	 * *errcode to a positive value.  In that case, if *errcode is greater
+	 * than zero, gawk will automatically update the ERRNO variable based
+	 * on the value of *errcode (e.g., setting *errcode = errno should do
+	 * the right thing).
+	 *
+	 * If field_width is non-NULL, then *field_width will be initialized
+	 * to NULL, and the function may set it to point to a structure
+	 * supplying field width information to override the default
+	 * gawk field parsing mechanism. Note that this structure will not
+	 * be copied by gawk; it must persist at least until the next call
+	 * to get_record or close_func. Note also that field_width will
+	 * be NULL when getline is assigning the results to a variable, thus
+	 * field parsing is not needed.
+	 */
+	int (*get_record)(char **out, struct awk_input *iobuf, int *errcode,
+			char **rt_start, size_t *rt_len,
+			const awk_fieldwidth_info_t **field_width);
+
+	/*
+	 * No argument prototype on read_func to allow for older systems
+	 * whose headers are not up to date.
+	 */
+	ssize_t (*read_func)();
+
+	/*
+	 * The close_func is called to allow the parser to free private data.
+	 * Gawk itself will close the fd unless close_func first sets it to
+	 * INVALID_HANDLE.
+	 */
+	void (*close_func)(struct awk_input *iobuf);
+
+	/* put last, for alignment. bleah */
+	struct stat sbuf;       /* stat buf */
+
+} awk_input_buf_t;
+
+typedef struct awk_input_parser {
+	const char *name;	/* name of parser */
+
+	/*
+	 * The can_take_file function should return true if the parser
+	 * would like to parse this file.  It should not change any gawk
+	 * state!
+	 */
+	awk_bool_t (*can_take_file)(const awk_input_buf_t *iobuf);
+
+	/*
+	 * If this parser is selected, then take_control_of will be called.
+	 * It can assume that a previous call to can_take_file was successful,
+	 * and no gawk state has changed since that call.  It should populate
+	 * the awk_input_buf_t's get_record, close_func, and opaque values as needed.
+	 * It should return true if successful.
+	 */
+	awk_bool_t (*take_control_of)(awk_input_buf_t *iobuf);
+
+	awk_const struct awk_input_parser *awk_const next;	/* for use by gawk */
+} awk_input_parser_t;
+
+/*
+ * Similar for output wrapper.
+ */
+
+/* First the data structure */
+typedef struct awk_output_buf {
+	const char *name;	/* name of output file */
+	const char *mode;	/* mode argument to fopen */
+	FILE *fp;		/* stdio file pointer */
+	awk_bool_t redirected;	/* true if a wrapper is active */
+	void *opaque;		/* for use by output wrapper */
+
+	/*
+	 * Replacement functions for I/O.  Just like the regular
+	 * versions but also take the opaque pointer argument.
+	 */
+	size_t (*gawk_fwrite)(const void *buf, size_t size, size_t count,
+				FILE *fp, void *opaque);
+	int (*gawk_fflush)(FILE *fp, void *opaque);
+	int (*gawk_ferror)(FILE *fp, void *opaque);
+	int (*gawk_fclose)(FILE *fp, void *opaque);
+} awk_output_buf_t;
+
+/* Next the output wrapper registered with gawk */
+typedef struct awk_output_wrapper {
+	const char *name;	/* name of the wrapper */
+
+	/*
+	 * The can_take_file function should return true if the wrapper
+	 * would like to process this file.  It should not change any gawk
+	 * state!
+	 */
+	awk_bool_t (*can_take_file)(const awk_output_buf_t *outbuf);
+
+	/*
+	 * If this wrapper is selected, then take_control_of will be called.
+	 * It can assume that a previous call to can_take_file was successful,
+	 * and no gawk state has changed since that call.  It should populate
+	 * the awk_output_buf_t function pointers and opaque pointer as needed.
+	 * It should return true if successful.
+	 */
+	awk_bool_t (*take_control_of)(awk_output_buf_t *outbuf);
+
+	awk_const struct awk_output_wrapper *awk_const next;  /* for use by gawk */
+} awk_output_wrapper_t;
+
+/* A two-way processor combines an input parser and an output wrapper. */
+typedef struct awk_two_way_processor {
+	const char *name;	/* name of the two-way processor */
+
+	/*
+	 * The can_take_file function should return true if the two-way
+	 * processor would like to parse this file.  It should not change
+	 * any gawk state!
+	 */
+	awk_bool_t (*can_take_two_way)(const char *name);
+
+	/*
+	 * If this processor is selected, then take_control_of will be called.
+	 * It can assume that a previous call to can_take_file was successful,
+	 * and no gawk state has changed since that call.  It should populate
+	 * the awk_input_buf_t and awk_otuput_buf_t structures as needed.
+	 * It should return true if successful.
+	 */
+	awk_bool_t (*take_control_of)(const char *name, awk_input_buf_t *inbuf,
+					awk_output_buf_t *outbuf);
+
+	awk_const struct awk_two_way_processor *awk_const next;  /* for use by gawk */
+} awk_two_way_processor_t;
+
+#define gawk_api_major_version 2
+#define gawk_api_minor_version 0
+
+/* Current version of the API. */
+enum {
+	GAWK_API_MAJOR_VERSION = gawk_api_major_version,
+	GAWK_API_MINOR_VERSION = gawk_api_minor_version
+};
+
+/* A number of typedefs related to different types of values. */
+
+/*
+ * A mutable string. Gawk owns the memory pointed to if it supplied
+ * the value. Otherwise, it takes ownership of the memory pointed to.
+ *
+ * The API deals exclusively with regular chars; these strings may
+ * be multibyte encoded in the current locale's encoding and character
+ * set. Gawk will convert internally to wide characters if necessary.
+ *
+ * Note that a string provided by gawk will always be terminated
+ * with a '\0' character.
+ */
+typedef struct awk_string {
+	char *str;	/* data */
+	size_t len;	/* length thereof, in chars */
+} awk_string_t;
+
+enum AWK_NUMBER_TYPE {
+	AWK_NUMBER_TYPE_DOUBLE,
+	AWK_NUMBER_TYPE_MPFR,
+	AWK_NUMBER_TYPE_MPZ
+};
+
+typedef struct awk_number {
+	double d;	/* always populated in data received from gawk */
+	enum AWK_NUMBER_TYPE type;
+	void *ptr;	/* either NULL or mpfr_ptr or mpz_ptr */
+} awk_number_t;
+
+/* Arrays are represented as an opaque type. */
+typedef void *awk_array_t;
+
+/* Scalars can be represented as an opaque type. */
+typedef void *awk_scalar_t;
+
+/* Any value can be stored as a cookie. */
+typedef void *awk_value_cookie_t;
+
+/*
+ * This tag defines the type of a value.
+ *
+ * Values are associated with regular variables and with array elements.
+ * Since arrays can be multidimensional (as can regular variables)
+ * it's valid to have a "value" that is actually an array.
+ */
+typedef enum {
+	AWK_UNDEFINED,
+	AWK_NUMBER,
+	AWK_STRING,
+	AWK_REGEX,
+	AWK_STRNUM,
+	AWK_ARRAY,
+	AWK_SCALAR,		/* opaque access to a variable */
+	AWK_VALUE_COOKIE	/* for updating a previously created value */
+} awk_valtype_t;
+
+/*
+ * An awk value. The val_type tag indicates what
+ * is in the union.
+ */
+typedef struct awk_value {
+	awk_valtype_t	val_type;
+	union {
+		awk_string_t	s;
+		awk_number_t	n;
+		awk_array_t	a;
+		awk_scalar_t	scl;
+		awk_value_cookie_t vc;
+	} u;
+#define str_value	u.s
+#define strnum_value	str_value
+#define regex_value	str_value
+#define num_value	u.n.d
+#define num_type	u.n.type
+#define num_ptr		u.n.ptr
+#define array_cookie	u.a
+#define scalar_cookie	u.scl
+#define value_cookie	u.vc
+} awk_value_t;
+
+/*
+ * A "flattened" array element. Gawk produces an array of these
+ * inside the awk_flat_array_t.
+ * ALL memory pointed to belongs to gawk. Individual elements may
+ * be marked for deletion. New elements must be added individually,
+ * one at a time, using the separate API for that purpose.
+ */
+
+typedef struct awk_element {
+	/* convenience linked list pointer, not used by gawk */
+	struct awk_element *next;
+	enum {
+		AWK_ELEMENT_DEFAULT = 0,	/* set by gawk */
+		AWK_ELEMENT_DELETE = 1		/* set by extension if
+						   should be deleted */
+	} flags;
+	awk_value_t	index;
+	awk_value_t	value;
+} awk_element_t;
+
+/*
+ * A "flattened" array. See the description above for how
+ * to use the elements contained herein.
+ */
+typedef struct awk_flat_array {
+	awk_const void *awk_const opaque1;	/* private data for use by gawk */
+	awk_const void *awk_const opaque2;	/* private data for use by gawk */
+	awk_const size_t count;			/* how many elements */
+	awk_element_t elements[1];		/* will be extended */
+} awk_flat_array_t;
+
+/*
+ * A record describing an extension function. Upon being
+ * loaded, the extension should pass in one of these to gawk for
+ * each C function.
+ *
+ * Each called function must fill in the result with either a scalar
+ * (number, string, or regex). Gawk takes ownership of any string memory.
+ *
+ * The called function must return the value of `result'.
+ * This is for the convenience of the calling code inside gawk.
+ *
+ * Each extension function may decide what to do if the number of
+ * arguments isn't what it expected.  Following awk functions, it
+ * is likely OK to ignore extra arguments.
+ *
+ * 'min_required_args' indicates how many arguments MUST be passed.
+ * The API will throw a fatal error if not enough are passed.
+ *
+ * 'max_expected_args' is more benign; if more than that are passed,
+ * the API prints a lint message (IFF lint is enabled, of course).
+ *
+ * In any case, the extension function itself need not compare the
+ * actual number of arguments passed to those two values if it does
+ * not want to.
+ */
+typedef struct awk_ext_func {
+	const char *name;
+	awk_value_t *(*const function)(int num_actual_args,
+					awk_value_t *result,
+					struct awk_ext_func *finfo);
+	const size_t max_expected_args;
+	const size_t min_required_args;
+	awk_bool_t suppress_lint;
+	void *data;		/* opaque pointer to any extra state */
+} awk_ext_func_t;
+
+typedef void *awk_ext_id_t;	/* opaque type for extension id */
+
+/*
+ * The API into gawk. Lots of functions here. We hope that they are
+ * logically organized.
+ */
+typedef struct gawk_api {
+	/* First, data fields. */
+
+	/* These are what gawk thinks the API version is. */
+	awk_const int major_version;
+	awk_const int minor_version;
+
+	/* GMP/MPFR versions, if extended-precision is available */
+	awk_const int gmp_major_version;
+	awk_const int gmp_minor_version;
+	awk_const int mpfr_major_version;
+	awk_const int mpfr_minor_version;
+
+	/*
+	 * These can change on the fly as things happen within gawk.
+	 * Currently only do_lint is prone to change, but we reserve
+	 * the right to allow the others to do so also.
+	 */
+#define DO_FLAGS_SIZE	6
+	awk_const int do_flags[DO_FLAGS_SIZE];
+/* Use these as indices into do_flags[] array to check the values */
+#define gawk_do_lint		0
+#define gawk_do_traditional	1
+#define gawk_do_profile		2
+#define gawk_do_sandbox		3
+#define gawk_do_debug		4
+#define gawk_do_mpfr		5
+
+	/* Next, registration functions: */
+
+	/*
+	 * Add a function to the interpreter, returns true upon success. 
+	 * Gawk does not modify what func points to, but the extension
+	 * function itself receives this pointer and can modify what it
+	 * points to, thus it's not const.
+	 */
+	awk_bool_t (*api_add_ext_func)(awk_ext_id_t id, const char *name_space,
+			awk_ext_func_t *func);
+
+	/* Register an input parser; for opening files read-only */
+	void (*api_register_input_parser)(awk_ext_id_t id,
+					awk_input_parser_t *input_parser);
+
+	/* Register an output wrapper, for writing files */
+	void (*api_register_output_wrapper)(awk_ext_id_t id,
+					awk_output_wrapper_t *output_wrapper);
+
+	/* Register a processor for two way I/O */
+	void (*api_register_two_way_processor)(awk_ext_id_t id,
+				awk_two_way_processor_t *two_way_processor);
+
+	/*
+	 * Add an exit call back.
+	 *
+	 * arg0 is a private data pointer for use by the extension;
+	 * gawk saves it and passes it into the function pointed
+	 * to by funcp at exit.
+	 *
+	 * Exit callback functions are called in LIFO order.
+	 */
+	void (*api_awk_atexit)(awk_ext_id_t id,
+			void (*funcp)(void *data, int exit_status),
+			void *arg0);
+
+	/* Register a version string for this extension with gawk. */
+	void (*api_register_ext_version)(awk_ext_id_t id, const char *version);
+
+	/* Functions to print messages */
+	void (*api_fatal)(awk_ext_id_t id, const char *format, ...);
+	void (*api_warning)(awk_ext_id_t id, const char *format, ...);
+	void (*api_lintwarn)(awk_ext_id_t id, const char *format, ...);
+	void (*api_nonfatal)(awk_ext_id_t id, const char *format, ...);
+
+	/* Functions to update ERRNO */
+	void (*api_update_ERRNO_int)(awk_ext_id_t id, int errno_val);
+	void (*api_update_ERRNO_string)(awk_ext_id_t id, const char *string);
+	void (*api_unset_ERRNO)(awk_ext_id_t id);
+
+	/*
+	 * All of the functions that return a value from inside gawk
+	 * (get a parameter, get a global variable, get an array element)
+	 * behave in the same way.
+	 *
+	 * For a function parameter, the return is false if the argument
+	 * count is out of range, or if the actual paramater does not match
+	 * what is specified in wanted. In that case,  result->val_type
+	 * will hold the actual type of what was passed.
+	 *
+	 * Similarly for symbol table access to variables and array elements,
+	 * the return is false if the actual variable or array element does
+	 * not match what was requested, and result->val_type will hold
+	 * the actual type.
+
+	Table entry is type returned:
+
+
+	                        +-------------------------------------------------------+
+	                        |                   Type of Actual Value:               |
+	                        +--------+--------+--------+--------+-------+-----------+
+	                        | String | Strnum | Number | Regex  | Array | Undefined |
+	+-----------+-----------+--------+--------+--------+--------+-------+-----------+
+	|           | String    | String | String | String | String | false | false     |
+	|           +-----------+--------+--------+--------+--------+-------+-----------+
+	|           | Strnum    | false  | Strnum | Strnum | false  | false | false     |
+	|           +-----------+--------+--------+--------+--------+-------+-----------+
+	|           | Number    | Number | Number | Number | false  | false | false     |
+	|           +-----------+--------+--------+--------+--------+-------+-----------+
+	|           | Regex     | false  | false  | false  | Regex  | false | false     |
+	|           +-----------+--------+--------+--------+--------+-------+-----------+
+	|   Type    | Array     | false  | false  | false  | false  | Array | false     |
+	| Requested +-----------+--------+--------+--------+--------+-------+-----------+
+	|           | Scalar    | Scalar | Scalar | Scalar | Scalar | false | false     |
+	|           +-----------+--------+--------+--------+--------+-------+-----------+
+	|           | Undefined | String | Strnum | Number | Regex  | Array | Undefined |
+	|           +-----------+--------+--------+--------+--------+-------+-----------+
+	|           | Value     | false  | false  | false  | false  | false | false     |
+	|           | Cookie    |        |        |        |        |       |           |
+	+-----------+-----------+--------+--------+--------+--------+-------+-----------+
+	*/
+
+	/* Functions to handle parameters passed to the extension. */
+
+	/*
+	 * Get the count'th paramater, zero-based.
+	 * Returns false if count is out of range, or if actual paramater
+	 * does not match what is specified in wanted. In that case,
+	 * result->val_type is as described above.
+	 */
+	awk_bool_t (*api_get_argument)(awk_ext_id_t id, size_t count,
+					  awk_valtype_t wanted,
+					  awk_value_t *result);
+
+	/*
+	 * Convert a parameter that was undefined into an array
+	 * (provide call-by-reference for arrays).  Returns false
+	 * if count is too big, or if the argument's type is
+	 * not undefined.
+	 */
+	awk_bool_t (*api_set_argument)(awk_ext_id_t id,
+					size_t count,
+					awk_array_t array);
+
+	/*
+	 * Symbol table access:
+	 * 	- Read-only access to special variables (NF, etc.)
+	 * 	- One special exception: PROCINFO.
+	 *	- Use sym_update() to change a value, including from UNDEFINED
+	 *	  to scalar or array.
+	 */
+	/*
+	 * Lookup a variable, fill in value. No messing with the value
+	 * returned.
+	 * Returns false if the variable doesn't exist or if the wrong type
+	 * was requested.  In the latter case, vaule->val_type will have
+	 * the real type, as described above.
+	 *
+	 * 	awk_value_t val;
+	 * 	if (! api->sym_lookup(id, name, wanted, & val))
+	 * 		error_code_here();
+	 *	else {
+	 *		// safe to use val
+	 *	}
+	 */
+	awk_bool_t (*api_sym_lookup)(awk_ext_id_t id,
+				const char *name_space,
+				const char *name,
+				awk_valtype_t wanted,
+				awk_value_t *result);
+
+	/*
+	 * Update a value. Adds it to the symbol table if not there.
+	 * Changing types (scalar <--> array) is not allowed.
+	 * In fact, using this to update an array is not allowed, either.
+	 * Such an attempt returns false.
+	 */
+	awk_bool_t (*api_sym_update)(awk_ext_id_t id,
+				const char *name_space,
+				const char *name,
+				awk_value_t *value);
+
+	/*
+	 * A ``scalar cookie'' is an opaque handle that provide access
+	 * to a global variable or array. It is an optimization that
+	 * avoids looking up variables in gawk's symbol table every time
+	 * access is needed.
+	 *
+	 * This function retrieves the current value of a scalar cookie.
+	 * Once you have obtained a scalar_cookie using sym_lookup, you can
+	 * use this function to get its value more efficiently.
+	 *
+	 * Return will be false if the value cannot be retrieved.
+	 *
+	 * Flow is thus
+	 *	awk_value_t val;
+	 * 	awk_scalar_t cookie;
+	 * 	api->sym_lookup(id, "variable", AWK_SCALAR, & val);	// get the cookie
+	 *	cookie = val.scalar_cookie;
+	 *	...
+	 *	api->sym_lookup_scalar(id, cookie, wanted, & val);	// get the value
+	 */
+	awk_bool_t (*api_sym_lookup_scalar)(awk_ext_id_t id,
+				awk_scalar_t cookie,
+				awk_valtype_t wanted,
+				awk_value_t *result);
+
+	/*
+	 * Update the value associated with a scalar cookie.
+	 * Flow is
+	 * 	sym_lookup with wanted == AWK_SCALAR
+	 * 	if returns false
+	 * 		sym_update with real initial value to install it
+	 * 		sym_lookup again with AWK_SCALAR
+	 *	else
+	 *		use the scalar cookie
+	 *
+	 * Return will be false if the new value is not one of
+	 * AWK_STRING, AWK_NUMBER, AWK_REGEX.
+	 *
+	 * Here too, the built-in variables may not be updated.
+	 */
+	awk_bool_t (*api_sym_update_scalar)(awk_ext_id_t id,
+				awk_scalar_t cookie, awk_value_t *value);
+
+	/* Cached values */
+
+	/*
+	 * Create a cached string,regex, or numeric value for efficient later
+	 * assignment. This improves performance when you want to assign
+	 * the same value to one or more variables repeatedly.  Only
+	 * AWK_NUMBER, AWK_STRING, AWK_REGEX and AWK_STRNUM values are allowed.
+	 * Any other type is rejected.  We disallow AWK_UNDEFINED since that
+	 * case would result in inferior performance.
+	 */
+	awk_bool_t (*api_create_value)(awk_ext_id_t id, awk_value_t *value,
+		    awk_value_cookie_t *result);
+
+	/*
+	 * Release the memory associated with a cookie from api_create_value.
+	 * Please call this to free memory when the value is no longer needed.
+	 */
+	awk_bool_t (*api_release_value)(awk_ext_id_t id, awk_value_cookie_t vc);
+
+	/* Array management */
+
+	/*
+	 * Retrieve total number of elements in array.
+	 * Returns false if some kind of error.
+	 */
+	awk_bool_t (*api_get_element_count)(awk_ext_id_t id,
+			awk_array_t a_cookie, size_t *count);
+
+	/*
+	 * Return the value of an element - read only!
+	 * Use set_array_element() to change it.
+	 * Behavior for value and return is same as for api_get_argument
+	 * and sym_lookup.
+	 */
+	awk_bool_t (*api_get_array_element)(awk_ext_id_t id,
+			awk_array_t a_cookie,
+			const awk_value_t *const index,
+			awk_valtype_t wanted,
+			awk_value_t *result);
+
+	/*
+	 * Change (or create) element in existing array with
+	 * index and value.
+	 *
+	 * ARGV and ENVIRON may not be updated.
+	 */
+	awk_bool_t (*api_set_array_element)(awk_ext_id_t id, awk_array_t a_cookie,
+					const awk_value_t *const index,
+					const awk_value_t *const value);
+
+	/*
+	 * Remove the element with the given index.
+	 * Returns true if removed or false if element did not exist.
+	 */
+	awk_bool_t (*api_del_array_element)(awk_ext_id_t id,
+			awk_array_t a_cookie, const awk_value_t* const index);
+
+	/* Create a new array cookie to which elements may be added. */
+	awk_array_t (*api_create_array)(awk_ext_id_t id);
+
+	/* Clear out an array. */
+	awk_bool_t (*api_clear_array)(awk_ext_id_t id, awk_array_t a_cookie);
+
+	/*
+	 * Flatten out an array with type conversions as requested.
+	 * This supersedes the earlier api_flatten_array function that
+	 * did not allow the caller to specify the requested types.
+	 * (That API is still available as a macro, defined below.)
+	 */
+	awk_bool_t (*api_flatten_array_typed)(awk_ext_id_t id,
+			awk_array_t a_cookie,
+			awk_flat_array_t **data,
+			awk_valtype_t index_type, awk_valtype_t value_type);
+
+	/* When done, delete any marked elements, release the memory. */
+	awk_bool_t (*api_release_flattened_array)(awk_ext_id_t id,
+			awk_array_t a_cookie,
+			awk_flat_array_t *data);
+
+	/*
+	 * Hooks to provide access to gawk's memory allocation functions.
+	 * This ensures that memory passed between gawk and the extension
+	 * is allocated and released by the same library.
+	 */
+	void *(*api_malloc)(size_t size);
+	void *(*api_calloc)(size_t nmemb, size_t size);
+	void *(*api_realloc)(void *ptr, size_t size);
+	void (*api_free)(void *ptr);
+
+	/*
+	 * A function that returns mpfr data should call this function
+	 * to allocate and initialize an mpfr_ptr for use in an
+	 * awk_value_t structure that will be handed to gawk.
+	 */
+	void *(*api_get_mpfr)(awk_ext_id_t id);
+
+	/*
+	 * A function that returns mpz data should call this function
+	 * to allocate and initialize an mpz_ptr for use in an
+	 * awk_value_t structure that will be handed to gawk.
+	 */
+	void *(*api_get_mpz)(awk_ext_id_t id);
+
+        /*
+	 * Look up a file.  If the name is NULL or name_len is 0, it returns
+	 * data for the currently open input file corresponding to FILENAME
+	 * (and it will not access the filetype argument, so that may be
+	 * undefined).
+	 *
+	 * If the file is not already open, try to open it.
+	 *
+	 * The "filetype" argument should be one of:
+	 *
+	 *    ">", ">>", "<", "|>", "|<", and "|&"
+	 *
+	 * If the file is not already open, and the fd argument is non-negative,
+	 * gawk will use that file descriptor instead of opening the file
+	 * in the usual way.
+	 *
+	 * If the fd is non-negative, but the file exists already, gawk
+	 * ignores the fd and returns the existing file.  It is the caller's
+	 * responsibility to notice that the fd in the returned
+	 * awk_input_buf_t does not match the requested value.
+	 *
+	 * Note that supplying a file descriptor is currently NOT supported
+	 * for pipes. It should work for input, output, append, and two-way
+	 * (coprocess) sockets.  If the filetype is two-way, we assume that
+	 * it is a socket!
+	 *
+	 * Note that in the two-way case, the input and output file descriptors
+	 * may differ.  To check for success, one must check that either of
+	 * them matches.
+	 *
+	 * ibufp and obufp point at gawk's internal copies of the
+	 * awk_input_buf_t and awk_output_t associated with the open
+	 * file.  Treat these data structures as read-only!
+	 */
+	awk_bool_t (*api_get_file)(awk_ext_id_t id,
+			const char *name,
+			size_t name_len,
+			const char *filetype,
+			int fd,
+			/*
+			 * Return values (on success, one or both should
+			 * be non-NULL):
+			 */
+			const awk_input_buf_t **ibufp,
+			const awk_output_buf_t **obufp);
+} gawk_api_t;
+
+#ifndef GAWK	/* these are not for the gawk code itself! */
+/*
+ * Use these if you want to define "global" variables named api
+ * and ext_id to make the code a little easier to read.
+ * See the sample boilerplate code, below.
+ */
+#define do_lint		(api->do_flags[gawk_do_lint])
+#define do_traditional	(api->do_flags[gawk_do_traditional])
+#define do_profile	(api->do_flags[gawk_do_profile])
+#define do_sandbox	(api->do_flags[gawk_do_sandbox])
+#define do_debug	(api->do_flags[gawk_do_debug])
+#define do_mpfr		(api->do_flags[gawk_do_mpfr])
+
+#define get_argument(count, wanted, result) \
+	(api->api_get_argument(ext_id, count, wanted, result))
+#define set_argument(count, new_array) \
+	(api->api_set_argument(ext_id, count, new_array))
+
+#define fatal		api->api_fatal
+#define nonfatal	api->api_nonfatal
+#define warning		api->api_warning
+#define lintwarn	api->api_lintwarn
+
+#define register_input_parser(parser)	(api->api_register_input_parser(ext_id, parser))
+#define register_output_wrapper(wrapper) (api->api_register_output_wrapper(ext_id, wrapper))
+#define register_two_way_processor(processor) \
+	(api->api_register_two_way_processor(ext_id, processor))
+
+#define update_ERRNO_int(e)	(api->api_update_ERRNO_int(ext_id, e))
+#define update_ERRNO_string(str) \
+	(api->api_update_ERRNO_string(ext_id, str))
+#define unset_ERRNO()	(api->api_unset_ERRNO(ext_id))
+
+#define add_ext_func(ns, func)	(api->api_add_ext_func(ext_id, ns, func))
+#define awk_atexit(funcp, arg0)	(api->api_awk_atexit(ext_id, funcp, arg0))
+
+#define sym_lookup(name, wanted, result) \
+	sym_lookup_ns("", name, wanted, result)
+#define sym_update(name, value) \
+	sym_update_ns("", name, value)
+
+#define sym_lookup_ns(name_space, name, wanted, result) \
+	(api->api_sym_lookup(ext_id, name_space, name, wanted, result))
+#define sym_update_ns(name_space, name, value) \
+	(api->api_sym_update(ext_id, name_space, name, value))
+
+#define sym_lookup_scalar(scalar_cookie, wanted, result) \
+	(api->api_sym_lookup_scalar(ext_id, scalar_cookie, wanted, result))
+#define sym_update_scalar(scalar_cookie, value) \
+	(api->api_sym_update_scalar)(ext_id, scalar_cookie, value)
+
+#define get_array_element(array, index, wanted, result) \
+	(api->api_get_array_element(ext_id, array, index, wanted, result))
+
+#define set_array_element(array, index, value) \
+	(api->api_set_array_element(ext_id, array, index, value))
+
+#define set_array_element_by_elem(array, elem) \
+	(api->api_set_array_element(ext_id, array, & (elem)->index, & (elem)->value))
+
+#define del_array_element(array, index) \
+	(api->api_del_array_element(ext_id, array, index))
+
+#define get_element_count(array, count_p) \
+	(api->api_get_element_count(ext_id, array, count_p))
+
+#define create_array()		(api->api_create_array(ext_id))
+
+#define clear_array(array)	(api->api_clear_array(ext_id, array))
+
+#define flatten_array_typed(array, data, index_type, value_type) \
+	(api->api_flatten_array_typed(ext_id, array, data, index_type, value_type))
+
+#define flatten_array(array, data) \
+	flatten_array_typed(array, data, AWK_STRING, AWK_UNDEFINED)
+
+#define release_flattened_array(array, data) \
+	(api->api_release_flattened_array(ext_id, array, data))
+
+#define gawk_malloc(size)		(api->api_malloc(size))
+#define gawk_calloc(nmemb, size)	(api->api_calloc(nmemb, size))
+#define gawk_realloc(ptr, size)		(api->api_realloc(ptr, size))
+#define gawk_free(ptr)			(api->api_free(ptr))
+
+#define create_value(value, result) \
+	(api->api_create_value(ext_id, value,result))
+
+#define release_value(value) \
+	(api->api_release_value(ext_id, value))
+
+#define get_file(name, namelen, filetype, fd, ibuf, obuf) \
+	(api->api_get_file(ext_id, name, namelen, filetype, fd, ibuf, obuf))
+
+#define get_mpfr_ptr() (api->api_get_mpfr(ext_id))
+#define get_mpz_ptr() (api->api_get_mpz(ext_id))
+
+#define register_ext_version(version) \
+	(api->api_register_ext_version(ext_id, version))
+
+#define emalloc(pointer, type, size, message) \
+	do { \
+		if ((pointer = (type) gawk_malloc(size)) == 0) \
+			fatal(ext_id, "%s: malloc of %d bytes failed", message, size); \
+	} while(0)
+
+#define ezalloc(pointer, type, size, message) \
+	do { \
+		if ((pointer = (type) gawk_calloc(1, size)) == 0) \
+			fatal(ext_id, "%s: calloc of %d bytes failed", message, size); \
+	} while(0)
+
+#define erealloc(pointer, type, size, message) \
+	do { \
+		if ((pointer = (type) gawk_realloc(pointer, size)) == 0) \
+			fatal(ext_id, "%s: realloc of %d bytes failed", message, size); \
+	} while(0)
+
+/* Constructor functions */
+
+/* r_make_string_type --- make a string or strnum or regexp value in result from the passed-in string */
+
+static inline awk_value_t *
+r_make_string_type(const gawk_api_t *api,	/* needed for emalloc */
+		   awk_ext_id_t ext_id,		/* ditto */
+		   const char *string,
+		   size_t length,
+		   awk_bool_t duplicate,
+		   awk_value_t *result,
+		   awk_valtype_t val_type)
+{
+	char *cp = NULL;
+
+	memset(result, 0, sizeof(*result));
+
+	result->val_type = val_type;
+	result->str_value.len = length;
+
+	if (duplicate) {
+		emalloc(cp, char *, length + 1, "r_make_string");
+		memcpy(cp, string, length);
+		cp[length] = '\0';
+		result->str_value.str = cp;
+	} else {
+		result->str_value.str = (char *) string;
+	}
+
+	return result;
+}
+
+/* r_make_string --- make a string value in result from the passed-in string */
+
+static inline awk_value_t *
+r_make_string(const gawk_api_t *api,	/* needed for emalloc */
+	      awk_ext_id_t ext_id,	/* ditto */
+	      const char *string,
+	      size_t length,
+	      awk_bool_t duplicate,
+	      awk_value_t *result)
+{
+	return r_make_string_type(api, ext_id, string, length, duplicate, result, AWK_STRING);
+}
+
+#define make_const_string(str, len, result)	r_make_string(api, ext_id, str, len, awk_true, result)
+#define make_malloced_string(str, len, result)	r_make_string(api, ext_id, str, len, awk_false, result)
+
+#define make_const_regex(str, len, result)	r_make_string_type(api, ext_id, str, len, awk_true, result, AWK_REGEX)
+#define make_malloced_regex(str, len, result)	r_make_string_type(api, ext_id, str, len, awk_false, result, AWK_REGEX)
+
+/*
+ * Note: The caller may not create a STRNUM, but it can create a string that is
+ * flagged as user input that MAY be a STRNUM. Gawk will decide whether it's a
+ * STRNUM or a string by checking whether the string is numeric.
+ */
+#define make_const_user_input(str, len, result)	r_make_string_type(api, ext_id, str, len, 1, result, AWK_STRNUM)
+#define make_malloced_user_input(str, len, result)	r_make_string_type(api, ext_id, str, len, 0, result, AWK_STRNUM)
+
+/* make_null_string --- make a null string value */
+
+static inline awk_value_t *
+make_null_string(awk_value_t *result)
+{
+	memset(result, 0, sizeof(*result));
+	result->val_type = AWK_UNDEFINED;
+
+	return result;
+}
+
+/* make_number --- make a number value in result */
+
+static inline awk_value_t *
+make_number(double num, awk_value_t *result)
+{
+	result->val_type = AWK_NUMBER;
+	result->num_value = num;
+	result->num_type = AWK_NUMBER_TYPE_DOUBLE;
+	return result;
+}
+
+/*
+ * make_number_mpz --- make an mpz number value in result.
+ * The mpz_ptr must be from a call to get_mpz_ptr. Gawk will now
+ * take ownership of this memory.
+ */
+
+static inline awk_value_t *
+make_number_mpz(void *mpz_ptr, awk_value_t *result)
+{
+	result->val_type = AWK_NUMBER;
+	result->num_type = AWK_NUMBER_TYPE_MPZ;
+	result->num_ptr = mpz_ptr;
+	return result;
+}
+
+/*
+ * make_number_mpfr --- make an mpfr number value in result.
+ * The mpfr_ptr must be from a call to get_mpfr_ptr. Gawk will now
+ * take ownership of this memory.
+ */
+
+static inline awk_value_t *
+make_number_mpfr(void *mpfr_ptr, awk_value_t *result)
+{
+	result->val_type = AWK_NUMBER;
+	result->num_type = AWK_NUMBER_TYPE_MPFR;
+	result->num_ptr = mpfr_ptr;
+	return result;
+}
+
+
+/*
+ * Each extension must define a function with this prototype:
+ *
+ *	int dl_load(gawk_api_t *api_p, awk_ext_id_t id)
+ *
+ * The return value should be zero on failure and non-zero on success.
+ *
+ * For the macros to work, the function should save api_p in a global
+ * variable named 'api' and save id in a global variable named 'ext_id'.
+ * In addition, a global function pointer named 'init_func' should be
+ * defined and set to either NULL or an initialization function that
+ * returns non-zero on success and zero upon failure.
+ */
+
+extern int dl_load(const gawk_api_t *const api_p, awk_ext_id_t id);
+
+#if 0
+/* Boilerplate code: */
+int plugin_is_GPL_compatible;
+
+static gawk_api_t *const api;
+static awk_ext_id_t ext_id;
+static const char *ext_version = NULL; /* or ... = "some string" */
+
+static awk_ext_func_t func_table[] = {
+	{ "name", do_name, 1 },
+	/* ... */
+};
+
+/* EITHER: */
+
+static awk_bool_t (*init_func)(void) = NULL;
+
+/* OR: */
+
+static awk_bool_t
+init_my_extension(void)
+{
+	...
+}
+
+static awk_bool_t (*init_func)(void) = init_my_extension;
+
+dl_load_func(func_table, some_name, "name_space_in_quotes")
+#endif
+
+#define dl_load_func(func_table, extension, name_space) \
+int dl_load(const gawk_api_t *const api_p, awk_ext_id_t id)  \
+{ \
+	size_t i, j; \
+	int errors = 0; \
+\
+	api = api_p; \
+	ext_id = (void **) id; \
+\
+	if (api->major_version != GAWK_API_MAJOR_VERSION \
+	    || api->minor_version < GAWK_API_MINOR_VERSION) { \
+		fprintf(stderr, #extension ": version mismatch with gawk!\n"); \
+		fprintf(stderr, "\tmy version (API %d.%d), gawk version (API %d.%d)\n", \
+			GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION, \
+			api->major_version, api->minor_version); \
+		exit(1); \
+	} \
+\
+	check_mpfr_version(extension); \
+\
+	/* load functions */ \
+	for (i = 0, j = sizeof(func_table) / sizeof(func_table[0]); i < j; i++) { \
+		if (func_table[i].name == NULL) \
+			break; \
+		if (! add_ext_func(name_space, & func_table[i])) { \
+			warning(ext_id, #extension ": could not add %s", \
+					func_table[i].name); \
+			errors++; \
+		} \
+	} \
+\
+	if (init_func != NULL) { \
+		if (! init_func()) { \
+			warning(ext_id, #extension ": initialization function failed"); \
+			errors++; \
+		} \
+	} \
+\
+	if (ext_version != NULL) \
+		register_ext_version(ext_version); \
+\
+	return (errors == 0); \
+}
+
+#if defined __GNU_MP_VERSION && defined MPFR_VERSION_MAJOR
+#define check_mpfr_version(extension) do { \
+	if (api->gmp_major_version != __GNU_MP_VERSION \
+	    || api->gmp_minor_version < __GNU_MP_VERSION_MINOR) { \
+		fprintf(stderr, #extension ": GMP version mismatch with gawk!\n"); \
+		fprintf(stderr, "\tmy version (%d, %d), gawk version (%d, %d)\n", \
+			__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, \
+			api->gmp_major_version, api->gmp_minor_version); \
+		exit(1); \
+	} \
+	if (api->mpfr_major_version != MPFR_VERSION_MAJOR \
+	    || api->mpfr_minor_version < MPFR_VERSION_MINOR) { \
+		fprintf(stderr, #extension ": MPFR version mismatch with gawk!\n"); \
+		fprintf(stderr, "\tmy version (%d, %d), gawk version (%d, %d)\n", \
+			MPFR_VERSION_MAJOR, MPFR_VERSION_MINOR, \
+			api->mpfr_major_version, api->mpfr_minor_version); \
+		exit(1); \
+	} \
+} while (0)
+#else
+#define check_mpfr_version(extension) /* nothing */
+#endif
+
+#endif /* GAWK */
+
+#ifdef __cplusplus
+}
+#endif	/* C++ */
+
+#endif /* _GAWK_API_H */
diff --git a/gawk-5.0.1/gawkmisc.c b/gawk-5.0.1/gawkmisc.c
new file mode 100644
index 00000000000..1f85b221939
--- /dev/null
+++ b/gawk-5.0.1/gawkmisc.c
@@ -0,0 +1,43 @@
+/*
+ * gawkmisc.c --- miscellanious gawk routines that are OS specific.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2004, 2010, 2011, 2017,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+#if defined(HAVE_FCNTL_H)
+#include <fcntl.h>
+#endif
+
+/* some old compilers don't grok #elif. sigh */
+
+#if defined(__EMX__) || defined(__DJGPP__) || defined(__MINGW32__)
+#include "pc/gawkmisc.pc"
+#else /* not __DJGPP__, not __MINGW32__ */
+#if defined(VMS)
+#include "vms/gawkmisc.vms"
+#else /* not VMS */
+#include "posix/gawkmisc.c"
+#endif /* not VMS */
+#endif /* not __DJGPP__, not __MINGW32__ */
diff --git a/gawk-5.0.1/gettext.h b/gawk-5.0.1/gettext.h
new file mode 100644
index 00000000000..bfc6148834e
--- /dev/null
+++ b/gawk-5.0.1/gettext.h
@@ -0,0 +1,301 @@
+/* Convenience header for conditional use of GNU <libintl.h>.
+   Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2016 Free Software
+   Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as published by
+   the Free Software Foundation; either version 2.1 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _LIBGETTEXT_H
+#define _LIBGETTEXT_H 1
+
+/* NLS can be disabled through the configure --disable-nls option.  */
+#if ENABLE_NLS
+
+/* ADR: Need this so gcc -g without -O works. */
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif /* HAVE_LOCALE_H */
+
+/* Get declarations of GNU message catalog functions.  */
+# include <libintl.h>
+
+/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by
+   the gettext() and ngettext() macros.  This is an alternative to calling
+   textdomain(), and is useful for libraries.  */
+# ifdef DEFAULT_TEXT_DOMAIN
+#  undef gettext
+#  define gettext(Msgid) \
+     dgettext (DEFAULT_TEXT_DOMAIN, Msgid)
+#  undef ngettext
+#  define ngettext(Msgid1, Msgid2, N) \
+     dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N)
+# endif
+
+#else
+
+/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which
+   chokes if dcgettext is defined as a macro.  So include it now, to make
+   later inclusions of <locale.h> a NOP.  We don't include <libintl.h>
+   as well because people using "gettext.h" will not include <libintl.h>,
+   and also including <libintl.h> would fail on SunOS 4, whereas <locale.h>
+   is OK.  */
+/* ADR: Include <locale.h> even if not ENABLE_NLS so can pay attention
+ * to locale number formats, etc.
+ */
+#if defined(__sun) || defined(HAVE_LOCALE_H)
+# include <locale.h>
+#endif
+
+/* Many header files from the libstdc++ coming with g++ 3.3 or newer include
+   <libintl.h>, which chokes if dcgettext is defined as a macro.  So include
+   it now, to make later inclusions of <libintl.h> a NOP.  */
+#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
+# include <cstdlib>
+# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
+#  include <libintl.h>
+# endif
+#endif
+
+/* Disabled NLS.
+   The casts to 'const char *' serve the purpose of producing warnings
+   for invalid uses of the value returned from these functions.
+   On pre-ANSI systems without 'const', the config.h file is supposed to
+   contain "#define const".  */
+/* ADR: BOGUS. Remove const. 19 Feb 2002 */
+# undef gettext
+# define gettext(Msgid) ((char *) (Msgid))
+# undef dgettext
+# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid))
+# undef dcgettext
+# define dcgettext(Domainname, Msgid, Category) \
+    ((void) (Category), dgettext (Domainname, Msgid))
+# undef ngettext
+# define ngettext(Msgid1, Msgid2, N) \
+    ((N) == 1 \
+     ? ((void) (Msgid2), (const char *) (Msgid1)) \
+     : ((void) (Msgid1), (const char *) (Msgid2)))
+# undef dngettext
+# define dngettext(Domainname, Msgid1, Msgid2, N) \
+    ((void) (Domainname), ngettext (Msgid1, Msgid2, N))
+# undef dcngettext
+# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
+    ((void) (Category), dngettext (Domainname, Msgid1, Msgid2, N))
+# undef textdomain
+# define textdomain(Domainname) ((const char *) (Domainname))
+# undef bindtextdomain
+# define bindtextdomain(Domainname, Dirname) \
+    ((void) (Domainname), (const char *) (Dirname))
+# undef bind_textdomain_codeset
+# define bind_textdomain_codeset(Domainname, Codeset) \
+    ((void) (Domainname), (const char *) (Codeset))
+
+#endif
+
+/* Prefer gnulib's setlocale override over libintl's setlocale override.  */
+#ifdef GNULIB_defined_setlocale
+# undef setlocale
+# define setlocale rpl_setlocale
+#endif
+
+/* A pseudo function call that serves as a marker for the automated
+   extraction of messages, but does not call gettext().  The run-time
+   translation is done at a different place in the code.
+   The argument, String, should be a literal string.  Concatenated strings
+   and other string expressions won't work.
+   The macro's expansion is not parenthesized, so that it is suitable as
+   initializer for static 'char[]' or 'const char[]' variables.  */
+#define gettext_noop(String) String
+
+/* The separator between msgctxt and msgid in a .mo file.  */
+#define GETTEXT_CONTEXT_GLUE "\004"
+
+/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a
+   MSGID.  MSGCTXT and MSGID must be string literals.  MSGCTXT should be
+   short and rarely need to change.
+   The letter 'p' stands for 'particular' or 'special'.  */
+#ifdef DEFAULT_TEXT_DOMAIN
+# define pgettext(Msgctxt, Msgid) \
+   pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#else
+# define pgettext(Msgctxt, Msgid) \
+   pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#endif
+#define dpgettext(Domainname, Msgctxt, Msgid) \
+  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES)
+#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \
+  pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category)
+#ifdef DEFAULT_TEXT_DOMAIN
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+   npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#else
+# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \
+   npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#endif
+#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \
+  npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+pgettext_aux (const char *domain,
+              const char *msg_ctxt_id, const char *msgid,
+              int category)
+{
+  const char *translation = dcgettext (domain, msg_ctxt_id, category);
+  if (translation == msg_ctxt_id)
+    return msgid;
+  else
+    return translation;
+}
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+npgettext_aux (const char *domain,
+               const char *msg_ctxt_id, const char *msgid,
+               const char *msgid_plural, unsigned long int n,
+               int category)
+{
+  const char *translation =
+    dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+  if (translation == msg_ctxt_id || translation == msgid_plural)
+    return (n == 1 ? msgid : msgid_plural);
+  else
+    return translation;
+}
+
+/* The same thing extended for non-constant arguments.  Here MSGCTXT and MSGID
+   can be arbitrary expressions.  But for string literals these macros are
+   less efficient than those above.  */
+
+#include <string.h>
+
+#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
+     /* || __STDC_VERSION__ >= 199901L */ )
+# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
+#else
+# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
+#endif
+
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+#include <stdlib.h>
+#endif
+
+#define pgettext_expr(Msgctxt, Msgid) \
+  dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES)
+#define dpgettext_expr(Domainname, Msgctxt, Msgid) \
+  dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcpgettext_expr (const char *domain,
+                 const char *msgctxt, const char *msgid,
+                 int category)
+{
+  size_t msgctxt_len = strlen (msgctxt) + 1;
+  size_t msgid_len = strlen (msgid) + 1;
+  const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+  char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+  char buf[1024];
+  char *msg_ctxt_id =
+    (msgctxt_len + msgid_len <= sizeof (buf)
+     ? buf
+     : (char *) malloc (msgctxt_len + msgid_len));
+  if (msg_ctxt_id != NULL)
+#endif
+    {
+      int found_translation;
+      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+      msg_ctxt_id[msgctxt_len - 1] = '\004';
+      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+      translation = dcgettext (domain, msg_ctxt_id, category);
+      found_translation = (translation != msg_ctxt_id);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+      if (msg_ctxt_id != buf)
+        free (msg_ctxt_id);
+#endif
+      if (found_translation)
+        return translation;
+    }
+  return msgid;
+}
+
+#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \
+  dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \
+  dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES)
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+static const char *
+dcnpgettext_expr (const char *domain,
+                  const char *msgctxt, const char *msgid,
+                  const char *msgid_plural, unsigned long int n,
+                  int category)
+{
+  size_t msgctxt_len = strlen (msgctxt) + 1;
+  size_t msgid_len = strlen (msgid) + 1;
+  const char *translation;
+#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+  char msg_ctxt_id[msgctxt_len + msgid_len];
+#else
+  char buf[1024];
+  char *msg_ctxt_id =
+    (msgctxt_len + msgid_len <= sizeof (buf)
+     ? buf
+     : (char *) malloc (msgctxt_len + msgid_len));
+  if (msg_ctxt_id != NULL)
+#endif
+    {
+      int found_translation;
+      memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1);
+      msg_ctxt_id[msgctxt_len - 1] = '\004';
+      memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len);
+      translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category);
+      found_translation = !(translation == msg_ctxt_id || translation == msgid_plural);
+#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
+      if (msg_ctxt_id != buf)
+        free (msg_ctxt_id);
+#endif
+      if (found_translation)
+        return translation;
+    }
+  return (n == 1 ? msgid : msgid_plural);
+}
+
+#endif /* _LIBGETTEXT_H */
diff --git a/gawk-5.0.1/install-sh b/gawk-5.0.1/install-sh
new file mode 100755
index 00000000000..8175c640fe6
--- /dev/null
+++ b/gawk-5.0.1/install-sh
@@ -0,0 +1,518 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2018-03-11.20; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab='	'
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
+
+    -o) chowncmd="$chownprog $2"
+        shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
+
+    -T) is_target_a_directory=never;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --) shift
+        break;;
+
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename.
+    if test -d "$dst"; then
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
+      fi
+      dstdir=$dst
+      dstbase=`basename "$src"`
+      case $dst in
+	*/) dst=$dst$dstbase;;
+	*)  dst=$dst/$dstbase;;
+      esac
+      dstdir_status=0
+    else
+      dstdir=`dirname "$dst"`
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  case $dstdir in
+    */) dstdirslash=$dstdir;;
+    *)  dstdirslash=$dstdir/;;
+  esac
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
+            # here however when possible just to lower collision chance.
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # Because "mkdir -p" follows existing symlinks and we likely work
+            # directly in world-writeable /tmp, make sure that the '$tmpdir'
+            # directory is successfully created first before we actually test
+            # 'mkdir -p' feature.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      set -f
+      set fnord $dstdir
+      shift
+      set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=${dstdirslash}_inst.$$_
+    rmtmp=${dstdirslash}_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       set +f &&
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gawk-5.0.1/int_array.c b/gawk-5.0.1/int_array.c
new file mode 100644
index 00000000000..1a292156b56
--- /dev/null
+++ b/gawk-5.0.1/int_array.c
@@ -0,0 +1,869 @@
+/*
+ * int_array.c - routines for arrays of integer indices.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2013, 2016, 2017, 2019,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+extern FILE *output_fp;
+extern void indent(int indent_level);
+extern NODE **is_integer(NODE *symbol, NODE *subs);
+
+static size_t INT_CHAIN_MAX = 2;
+
+static NODE **int_array_init(NODE *symbol, NODE *subs);
+static NODE **int_lookup(NODE *symbol, NODE *subs);
+static NODE **int_exists(NODE *symbol, NODE *subs);
+static NODE **int_clear(NODE *symbol, NODE *subs);
+static NODE **int_remove(NODE *symbol, NODE *subs);
+static NODE **int_list(NODE *symbol, NODE *t);
+static NODE **int_copy(NODE *symbol, NODE *newsymb);
+static NODE **int_dump(NODE *symbol, NODE *ndump);
+
+static uint32_t int_hash(uint32_t k, uint32_t hsize);
+static inline NODE **int_find(NODE *symbol, long k, uint32_t hash1);
+static NODE **int_insert(NODE *symbol, long k, uint32_t hash1);
+static void grow_int_table(NODE *symbol);
+
+const array_funcs_t int_array_func = {
+	"int",
+	int_array_init,
+	is_integer,
+	int_lookup,
+	int_exists,
+	int_clear,
+	int_remove,
+	int_list,
+	int_copy,
+	int_dump,
+	(afunc_t) 0,
+};
+
+
+/* int_array_init --- array initialization routine */
+
+static NODE **
+int_array_init(NODE *symbol, NODE *subs ATTRIBUTE_UNUSED)
+{
+	if (symbol == NULL) {	/* first time */
+		long newval;
+
+		/* check relevant environment variables */
+		if ((newval = getenv_long("INT_CHAIN_MAX")) > 0)
+			INT_CHAIN_MAX = newval;
+	} else
+		null_array(symbol);
+
+	return & success_node;
+}
+
+/*
+ * standard_integer_string -- check whether the string matches what
+ * sprintf("%ld", <value>) would produce. This is accomplished by accepting
+ * only strings that look like /^0$/ or /^-?[1-9][0-9]*$/. This should be
+ * faster than comparing vs. the results of actually calling sprintf.
+ */
+
+static bool
+standard_integer_string(const char *s, size_t len)
+{
+	const char *end;
+
+	if (len == 0)
+		return false;
+	if (*s == '0' && len == 1)
+		return true;
+	end = s + len;
+	/* ignore leading minus sign */
+	if (*s == '-' && ++s == end)
+		return false;
+	/* check first char is [1-9] */
+	if (*s < '1' || *s > '9')
+		return false;
+	while (++s < end) {
+		if (*s < '0' || *s > '9')
+			return false;
+	}
+	return true;
+}
+
+/* is_integer --- check if subscript is an integer */
+
+NODE **
+is_integer(NODE *symbol, NODE *subs)
+{
+#ifndef CHECK_INTEGER_USING_FORCE_NUMBER
+	long l;
+#endif
+	AWKNUM d;
+
+	if ((subs->flags & NUMINT) != 0)
+		/* quick exit */
+		return & success_node;
+
+	if (subs == Nnull_string || do_mpfr)
+		return NULL;
+
+#ifdef CHECK_INTEGER_USING_FORCE_NUMBER
+	/*
+	 * This approach is much simpler, because we remove all of the strtol
+	 * logic below. But this may be slower in some usage cases.
+	 */
+	if ((subs->flags & NUMCUR) == 0) {
+		str2number(subs);
+
+		/* check again in case force_number set NUMINT */
+		if ((subs->flags & NUMINT) != 0)
+			return & success_node;
+	}
+#else /* CHECK_INTEGER_USING_FORCE_NUMBER */
+	if ((subs->flags & NUMCUR) != 0) {
+#endif /* CHECK_INTEGER_USING_FORCE_NUMBER */
+		d = subs->numbr;
+		if (d <= INT32_MAX && d >= INT32_MIN && d == (int32_t) d) {
+			/*
+			 * The numeric value is an integer, but we must
+			 * protect against strings that cannot be generated
+			 * from sprintf("%ld", <subscript>). This can happen
+			 * with strnum or string values. We could skip this
+			 * check for pure NUMBER values, but unfortunately the
+			 * code does not currently distinguish between NUMBER
+			 * and strnum values.
+			 */
+			if (   (subs->flags & STRCUR) == 0
+			    || standard_integer_string(subs->stptr, subs->stlen)) {
+				subs->flags |= NUMINT;
+				return & success_node;
+			}
+		}
+		return NULL;
+#ifndef CHECK_INTEGER_USING_FORCE_NUMBER
+	}
+
+	/* a[3]=1; print "3" in a    -- true
+	 * a[3]=1; print "+3" in a   -- false
+	 * a[3]=1; print "03" in a   -- false
+	 * a[-3]=1; print "-3" in a  -- true
+	 */
+
+	/* must be a STRING */
+	char *cp = subs->stptr, *cpend, *ptr;
+	char save;
+	size_t len = subs->stlen;
+
+	if (len == 0 || (! isdigit((unsigned char) *cp) && *cp != '-'))
+		return NULL;
+
+	if (len > 1 &&
+		((*cp == '0')		/* "00", "011" .. */
+			|| (*cp == '-' && *(cp + 1) == '0')	/* "-0", "-011" .. */
+		)
+	)
+		return NULL;
+	if (len == 1 && *cp != '-') {	/* single digit */
+		subs->numbr = (long) (*cp - '0');
+		if ((subs->flags & USER_INPUT) != 0) {
+			/* leave USER_INPUT set */
+			subs->flags &= ~STRING;
+			subs->flags |= NUMBER;
+		}
+		subs->flags |= (NUMCUR|NUMINT);
+		return & success_node;
+	}
+
+	cpend = cp + len;
+	save = *cpend;
+	*cpend = '\0';
+
+	errno = 0;
+	l = strtol(cp, & ptr, 10);
+	*cpend = save;
+	if (errno != 0 || ptr != cpend)
+		return NULL;
+
+	subs->numbr = l;
+	if ((subs->flags & USER_INPUT) != 0) {
+		/* leave USER_INPUT set */
+		subs->flags &= ~STRING;
+		subs->flags |= NUMBER;
+	}
+	subs->flags |= NUMCUR;
+	if (l <= INT32_MAX && l >= INT32_MIN) {
+		subs->flags |= NUMINT;
+		return & success_node;
+	}
+
+	return NULL;
+#endif /* CHECK_INTEGER_USING_FORCE_NUMBER */
+}
+
+
+/*
+ * int_lookup --- Find SYMBOL[SUBS] in the assoc array.  Install it with value ""
+ * if it isn't there. Returns a pointer ala get_lhs to where its value is stored.
+ */
+
+static NODE **
+int_lookup(NODE *symbol, NODE *subs)
+{
+	uint32_t hash1;
+	long k;
+	unsigned long size;
+	NODE **lhs;
+	NODE *xn;
+
+	/*
+	 * N.B: symbol->table_size is the total # of non-integers (symbol->xarray)
+	 *	and integer elements. Also, symbol->xarray must have at least one
+	 *	item in it, and can not exist if there are no integer elements.
+	 * 	In that case, symbol->xarray is promoted to 'symbol' (See int_remove).
+	 */
+
+
+	if (! is_integer(symbol, subs)) {
+		xn = symbol->xarray;
+		if (xn == NULL) {
+			xn = symbol->xarray = make_array();
+			xn->vname = symbol->vname;	/* shallow copy */
+			xn->flags |= XARRAY;
+		} else if ((lhs = xn->aexists(xn, subs)) != NULL)
+			return lhs;
+		symbol->table_size++;
+		return assoc_lookup(xn, subs);
+	}
+
+	k = subs->numbr;
+	if (symbol->buckets == NULL)
+		grow_int_table(symbol);
+
+ 	hash1 = int_hash(k, symbol->array_size);
+	if ((lhs = int_find(symbol, k, hash1)) != NULL)
+		return lhs;
+
+	/* It's not there, install it */
+
+	symbol->table_size++;
+
+	/* first see if we would need to grow the array, before installing */
+	size = symbol->table_size;
+	if ((xn = symbol->xarray) != NULL)
+		size -= xn->table_size;
+
+	if ((symbol->flags & ARRAYMAXED) == 0
+		    && (size / symbol->array_size) > INT_CHAIN_MAX) {
+		grow_int_table(symbol);
+		/* have to recompute hash value for new size */
+		hash1 = int_hash(k, symbol->array_size);
+	}
+
+	return int_insert(symbol, k, hash1);
+}
+
+
+/*
+ * int_exists --- test whether the array element symbol[subs] exists or not,
+ *	return pointer to value if it does.
+ */
+
+static NODE **
+int_exists(NODE *symbol, NODE *subs)
+{
+	long k;
+	uint32_t hash1;
+
+	if (! is_integer(symbol, subs)) {
+		NODE *xn = symbol->xarray;
+		if (xn == NULL)
+			return NULL;
+		return xn->aexists(xn, subs);
+	}
+	if (symbol->buckets == NULL)
+		return NULL;
+
+	k = subs->numbr;
+	hash1 = int_hash(k, symbol->array_size);
+	return int_find(symbol, k, hash1);
+}
+
+/* int_clear --- flush all the values in symbol[] */
+
+static NODE **
+int_clear(NODE *symbol, NODE *subs ATTRIBUTE_UNUSED)
+{
+	unsigned long i;
+	int j;
+	BUCKET *b, *next;
+	NODE *r;
+
+	if (symbol->xarray != NULL) {
+		NODE *xn = symbol->xarray;
+		assoc_clear(xn);
+		freenode(xn);
+		symbol->xarray = NULL;
+	}
+
+	for (i = 0; i < symbol->array_size; i++) {
+		for (b = symbol->buckets[i]; b != NULL;	b = next) {
+			next = b->ainext;
+			for (j = 0; j < b->aicount; j++) {
+				r = b->aivalue[j];
+				if (r->type == Node_var_array) {
+					assoc_clear(r);	/* recursively clear all sub-arrays */
+					efree(r->vname);
+					freenode(r);
+				} else
+					unref(r);
+			}
+			freebucket(b);
+		}
+		symbol->buckets[i] = NULL;
+	}
+	if (symbol->buckets != NULL)
+		efree(symbol->buckets);
+	symbol->ainit(symbol, NULL);	/* re-initialize symbol */
+	return NULL;
+}
+
+
+/* int_remove --- If SUBS is already in the table, remove it. */
+
+static NODE **
+int_remove(NODE *symbol, NODE *subs)
+{
+	uint32_t hash1;
+	BUCKET *b, *prev = NULL;
+	long k;
+	int i;
+	NODE *xn = symbol->xarray;
+
+	if (symbol->table_size == 0 || symbol->buckets == NULL)
+		return NULL;
+
+	if (! is_integer(symbol, subs)) {
+		if (xn == NULL || xn->aremove(xn, subs) == NULL)
+			return NULL;
+		if (xn->table_size == 0) {
+			freenode(xn);
+			symbol->xarray = NULL;
+		}
+		symbol->table_size--;
+		assert(symbol->table_size > 0);
+		return & success_node;
+	}
+
+	k = subs->numbr;
+	hash1 = int_hash(k, symbol->array_size);
+
+	for (b = symbol->buckets[hash1]; b != NULL; prev = b, b = b->ainext) {
+		for (i = 0; i < b->aicount; i++) {
+			if (k != b->ainum[i])
+				continue;
+
+			/* item found */
+			if (i == 0 && b->aicount == 2) {
+				/* removing the 1st item; move 2nd item from position 1 to 0 */
+
+				b->ainum[0] = b->ainum[1];
+				b->aivalue[0] = b->aivalue[1];
+			} /* else
+				removing the only item or the 2nd item */
+
+			goto removed;
+		}
+	}
+
+	if (b == NULL)	/* item not in array */
+		return NULL;
+
+removed:
+	b->aicount--;
+
+	if (b->aicount == 0) {
+		/* detach bucket */
+		if (prev != NULL)
+			prev->ainext = b->ainext;
+		else
+			symbol->buckets[hash1] = b->ainext;
+
+		/* delete bucket */
+		freebucket(b);
+	} else if (b != symbol->buckets[hash1]) {
+		BUCKET *head = symbol->buckets[hash1];
+
+		assert(b->aicount == 1);
+		/* move the last element from head to bucket to make it full. */
+		i = --head->aicount;	/* head has one less element */
+		b->ainum[1] = head->ainum[i];
+		b->aivalue[1] = head->aivalue[i];
+		b->aicount++;	/* bucket has one more element */
+		if (i == 0) {
+			/* head is now empty; delete head */
+			symbol->buckets[hash1] = head->ainext;
+			freebucket(head);
+		}
+	} /* else
+		do nothing */
+
+	symbol->table_size--;
+	if (xn == NULL && symbol->table_size == 0) {
+		efree(symbol->buckets);
+		symbol->ainit(symbol, NULL);	/* re-initialize array 'symbol' */
+	} else if (xn != NULL && symbol->table_size == xn->table_size) {
+		/* promote xn (str_array) to symbol */
+		xn->flags &= ~XARRAY;
+		xn->parent_array = symbol->parent_array;
+		efree(symbol->buckets);
+		*symbol = *xn;
+		freenode(xn);
+	}
+
+	return & success_node;	/* return success */
+}
+
+
+/* int_copy --- duplicate input array "symbol" */
+
+static NODE **
+int_copy(NODE *symbol, NODE *newsymb)
+{
+	BUCKET **old, **new, **pnew;
+	BUCKET *chain, *newchain;
+	int j;
+	unsigned long i, cursize;
+
+	assert(symbol->buckets != NULL);
+
+	/* find the current hash size */
+	cursize = symbol->array_size;
+
+	/* allocate new table */
+	ezalloc(new, BUCKET **, cursize * sizeof(BUCKET *), "int_copy");
+
+	old = symbol->buckets;
+
+	for (i = 0; i < cursize; i++) {
+		for (chain = old[i], pnew = & new[i]; chain != NULL;
+				chain = chain->ainext
+		) {
+			getbucket(newchain);
+			newchain->aicount = chain->aicount;
+			newchain->ainext = NULL;
+			for (j = 0; j < chain->aicount; j++) {
+				NODE *oldval;
+
+				/*
+				 * copy the corresponding key and
+				 * value from the original input list
+				 */
+				newchain->ainum[j] = chain->ainum[j];
+
+				oldval = chain->aivalue[j];
+				if (oldval->type == Node_val)
+					newchain->aivalue[j] = dupnode(oldval);
+				else {
+					NODE *r;
+					r = make_array();
+					r->vname = estrdup(oldval->vname, strlen(oldval->vname));
+					r->parent_array = newsymb;
+					newchain->aivalue[j] = assoc_copy(oldval, r);
+				}
+			}
+
+			*pnew = newchain;
+			newchain->ainext = NULL;
+			pnew = & newchain->ainext;
+		}
+	}
+
+	if (symbol->xarray != NULL) {
+		NODE *xn, *n;
+		xn = symbol->xarray;
+		n = make_array();
+		n->vname = newsymb->vname;	/* shallow copy */
+		(void) xn->acopy(xn, n);
+		newsymb->xarray = n;
+	} else
+		newsymb->xarray = NULL;
+
+	newsymb->table_size = symbol->table_size;
+	newsymb->buckets = new;
+	newsymb->array_size = cursize;
+	newsymb->flags = symbol->flags;
+
+	return NULL;
+}
+
+
+/* int_list --- return a list of array items */
+
+static NODE**
+int_list(NODE *symbol, NODE *t)
+{
+	NODE **list = NULL;
+	unsigned long num_elems, list_size, i, k = 0;
+	BUCKET *b;
+	NODE *r, *subs, *xn;
+	int j, elem_size = 1;
+	long num;
+	static char buf[100];
+	assoc_kind_t assoc_kind;
+
+	if (symbol->table_size == 0)
+		return NULL;
+
+	assoc_kind = (assoc_kind_t) t->flags;
+	num_elems = symbol->table_size;
+	if ((assoc_kind & (AINDEX|AVALUE|ADELETE)) == (AINDEX|ADELETE))
+		num_elems = 1;
+
+	if ((assoc_kind & (AINDEX|AVALUE)) == (AINDEX|AVALUE))
+		elem_size = 2;
+	list_size = elem_size * num_elems;
+
+	if (symbol->xarray != NULL) {
+		xn = symbol->xarray;
+		list = xn->alist(xn, t);
+		assert(list != NULL);
+		if (num_elems == 1 || num_elems == xn->table_size)
+			return list;
+		erealloc(list, NODE **, list_size * sizeof(NODE *), "int_list");
+		k = elem_size * xn->table_size;
+	} else
+		emalloc(list, NODE **, list_size * sizeof(NODE *), "int_list");
+
+	/* populate it */
+
+	for (i = 0; i < symbol->array_size; i++) {
+		for (b = symbol->buckets[i]; b != NULL;	b = b->ainext) {
+			for (j = 0; j < b->aicount; j++) {
+				/* index */
+				num = b->ainum[j];
+				if ((assoc_kind & AISTR) != 0) {
+					sprintf(buf, "%ld", num);
+					subs = make_string(buf, strlen(buf));
+					subs->numbr = num;
+					subs->flags |= (NUMCUR|NUMINT);
+				} else {
+					subs = make_number((AWKNUM) num);
+					subs->flags |= (INTIND|NUMINT);
+				}
+				list[k++] = subs;
+
+				/* value */
+				if ((assoc_kind & AVALUE) != 0) {
+					r = b->aivalue[j];
+					if (r->type == Node_val) {
+						if ((assoc_kind & AVNUM) != 0)
+							(void) force_number(r);
+						else if ((assoc_kind & AVSTR) != 0)
+							r = force_string(r);
+					}
+					list[k++] = r;
+				}
+
+				if (k >= list_size)
+					return list;
+			}
+		}
+	}
+	return list;
+}
+
+
+/* int_kilobytes --- calculate memory consumption of the assoc array */
+
+AWKNUM
+int_kilobytes(NODE *symbol)
+{
+	unsigned long i, bucket_cnt = 0;
+	BUCKET *b;
+	AWKNUM kb;
+	extern AWKNUM str_kilobytes(NODE *symbol);
+
+	for (i = 0; i < symbol->array_size; i++) {
+		for (b = symbol->buckets[i]; b != NULL; b = b->ainext)
+			bucket_cnt++;
+	}
+	kb = (((AWKNUM) bucket_cnt) * sizeof (BUCKET) +
+			((AWKNUM) symbol->array_size) * sizeof (BUCKET *)) / 1024.0;
+
+	if (symbol->xarray != NULL)
+		kb += str_kilobytes(symbol->xarray);
+
+	return kb;
+}
+
+
+/* int_dump --- dump array info */
+
+static NODE **
+int_dump(NODE *symbol, NODE *ndump)
+{
+#define HCNT	31
+
+	int indent_level;
+	BUCKET *b;
+	NODE *xn = NULL;
+	unsigned long str_size = 0, int_size = 0;
+	unsigned long i;
+	size_t j, bucket_cnt;
+	static size_t hash_dist[HCNT + 1];
+
+	indent_level = ndump->alevel;
+
+	if (symbol->xarray != NULL) {
+		xn = symbol->xarray;
+		str_size = xn->table_size;
+	}
+	int_size = symbol->table_size - str_size;
+
+	if ((symbol->flags & XARRAY) == 0)
+		fprintf(output_fp, "%s `%s'\n",
+				(symbol->parent_array == NULL) ? "array" : "sub-array",
+				array_vname(symbol));
+
+	indent_level++;
+	indent(indent_level);
+	fprintf(output_fp, "array_func: int_array_func\n");
+	if (symbol->flags != 0) {
+		indent(indent_level);
+		fprintf(output_fp, "flags: %s\n", flags2str(symbol->flags));
+	}
+	indent(indent_level);
+	fprintf(output_fp, "INT_CHAIN_MAX: %lu\n", (unsigned long) INT_CHAIN_MAX);
+	indent(indent_level);
+	fprintf(output_fp, "array_size: %lu (int)\n", (unsigned long) symbol->array_size);
+	indent(indent_level);
+	fprintf(output_fp, "table_size: %lu (total), %lu (int), %lu (str)\n",
+			(unsigned long) symbol->table_size, int_size, str_size);
+	indent(indent_level);
+	fprintf(output_fp, "Avg # of items per chain (int): %.2g\n",
+			((AWKNUM) int_size) / symbol->array_size);
+
+	indent(indent_level);
+	fprintf(output_fp, "memory: %.2g kB (total)\n", int_kilobytes(symbol));
+
+	/* hash value distribution */
+
+	memset(hash_dist, '\0', (HCNT + 1) * sizeof(size_t));
+	for (i = 0; i < symbol->array_size; i++) {
+		bucket_cnt = 0;
+		for (b = symbol->buckets[i]; b != NULL;	b = b->ainext)
+			bucket_cnt += b->aicount;
+		if (bucket_cnt >= HCNT)
+			bucket_cnt = HCNT;
+		hash_dist[bucket_cnt]++;
+	}
+
+	indent(indent_level);
+	fprintf(output_fp, "Hash distribution:\n");
+	indent_level++;
+	for (j = 0; j <= HCNT; j++) {
+		if (hash_dist[j] > 0) {
+			indent(indent_level);
+			if (j == HCNT)
+				fprintf(output_fp, "[>=%lu]:%lu\n",
+					(unsigned long) HCNT, (unsigned long) hash_dist[j]);
+			else
+				fprintf(output_fp, "[%lu]:%lu\n",
+					(unsigned long) j, (unsigned long) hash_dist[j]);
+		}
+	}
+	indent_level--;
+
+	/* dump elements */
+
+	if (ndump->adepth >= 0) {
+		NODE *subs;
+		const char *aname;
+
+		fprintf(output_fp, "\n");
+
+		aname = make_aname(symbol);
+		subs = make_number((AWKNUM) 0);
+		subs->flags |= (INTIND|NUMINT);
+
+		for (i = 0; i < symbol->array_size; i++) {
+			for (b = symbol->buckets[i]; b != NULL; b = b->ainext) {
+				for (j = 0; j < b->aicount; j++) {
+					subs->numbr = b->ainum[j];
+					assoc_info(subs, b->aivalue[j], ndump, aname);
+				}
+			}
+		}
+		unref(subs);
+	}
+
+	if (xn != NULL)	{
+		fprintf(output_fp, "\n");
+		xn->adump(xn, ndump);
+	}
+
+	return NULL;
+
+#undef HCNT
+}
+
+
+/* int_hash --- calculate the hash function of the integer subs */
+
+static uint32_t
+int_hash(uint32_t k, uint32_t hsize)
+{
+
+/*
+ * Code snippet copied from:
+ *	Hash functions (http://www.azillionmonkeys.com/qed/hash.html).
+ *	Copyright 2004-2008 by Paul Hsieh. Licenced under LGPL 2.1.
+ */
+
+	/* This is the final mixing function used by Paul Hsieh in SuperFastHash. */
+
+	k ^= k << 3;
+	k += k >> 5;
+	k ^= k << 4;
+	k += k >> 17;
+	k ^= k << 25;
+	k += k >> 6;
+
+	if (k >= hsize)
+		k %= hsize;
+	return k;
+}
+
+/* int_find --- locate symbol[subs] */
+
+static inline NODE **
+int_find(NODE *symbol, long k, uint32_t hash1)
+{
+	BUCKET *b;
+	int i;
+
+	assert(symbol->buckets != NULL);
+	for (b = symbol->buckets[hash1]; b != NULL; b = b->ainext) {
+		for (i = 0; i < b->aicount; i++) {
+			if (b->ainum[i] == k)
+				return (b->aivalue + i);
+		}
+	}
+	return NULL;
+}
+
+
+/* int_insert --- install subs in the assoc array */
+
+static NODE **
+int_insert(NODE *symbol, long k, uint32_t hash1)
+{
+	BUCKET *b;
+	int i;
+
+	b = symbol->buckets[hash1];
+
+	/* Only the first bucket in the chain can be partially full, but is never empty. */
+
+	if (b == NULL || (i = b->aicount) == 2) {
+		getbucket(b);
+		b->aicount = 0;
+		b->ainext = symbol->buckets[hash1];
+		symbol->buckets[hash1] = b;
+		i = 0;
+	}
+
+	b->ainum[i] = k;
+	b->aivalue[i] = dupnode(Nnull_string);
+	b->aicount++;
+	return & b->aivalue[i];
+}
+
+
+/* grow_int_table --- grow the hash table */
+
+static void
+grow_int_table(NODE *symbol)
+{
+	BUCKET **old, **new;
+	BUCKET *chain, *next;
+	int i, j;
+	unsigned long oldsize, newsize, k;
+
+	/*
+	 * This is an array of primes. We grow the table by an order of
+	 * magnitude each time (not just doubling) so that growing is a
+	 * rare operation. We expect, on average, that it won't happen
+	 * more than twice.  The final size is also chosen to be small
+	 * enough so that MS-DOG mallocs can handle it. When things are
+	 * very large (> 8K), we just double more or less, instead of
+	 * just jumping from 8K to 64K.
+	 */
+
+	static const unsigned long sizes[] = {
+		13, 127, 1021, 8191, 16381, 32749, 65497,
+		131101, 262147, 524309, 1048583, 2097169,
+		4194319, 8388617, 16777259, 33554467,
+		67108879, 134217757, 268435459, 536870923,
+		1073741827
+	};
+
+	/* find next biggest hash size */
+	newsize = oldsize = symbol->array_size;
+
+	for (i = 0, j = sizeof(sizes)/sizeof(sizes[0]); i < j; i++) {
+		if (oldsize < sizes[i]) {
+			newsize = sizes[i];
+			break;
+		}
+	}
+	if (newsize == oldsize) {	/* table already at max (!) */
+		symbol->flags |= ARRAYMAXED;
+		return;
+	}
+
+	/* allocate new table */
+	ezalloc(new, BUCKET **, newsize * sizeof(BUCKET *), "grow_int_table");
+
+	old = symbol->buckets;
+	symbol->buckets = new;
+	symbol->array_size = newsize;
+
+	/* brand new hash table */
+	if (old == NULL)
+		return;		/* DO NOT initialize symbol->table_size */
+
+	/* old hash table there, move stuff to new, free old */
+	/* note that symbol->table_size does not change if an old array. */
+
+	for (k = 0; k < oldsize; k++) {
+		long num;
+		for (chain = old[k]; chain != NULL; chain = next) {
+			for (i = 0; i < chain->aicount; i++) {
+				num = chain->ainum[i];
+				*int_insert(symbol, num, int_hash(num, newsize)) = chain->aivalue[i];
+			}
+			next = chain->ainext;
+			freebucket(chain);
+		}
+	}
+	efree(old);
+}
diff --git a/gawk-5.0.1/interpret.h b/gawk-5.0.1/interpret.h
new file mode 100644
index 00000000000..478dc82ab43
--- /dev/null
+++ b/gawk-5.0.1/interpret.h
@@ -0,0 +1,1493 @@
+/*
+ * interpret.h ---  run a list of instructions.
+ */
+
+/* 
+ * Copyright (C) 1986, 1988, 1989, 1991-2019 the Free Software Foundation, Inc.
+ * 
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/*
+ * If "r" is a field, valref should normally be > 1, because the field is
+ * created initially with valref 1, and valref should be bumped when it is
+ * pushed onto the stack by Op_field_spec. On the other hand, if we are
+ * assigning to $n, then Op_store_field calls unref(*lhs) before assigning
+ * the new value, so that decrements valref. So if the RHS is a field with
+ * valref 1, that effectively means that this is an assignment like "$n = $n",
+ * so a no-op, other than triggering $0 reconstitution.
+ */
+
+// not a macro so we can step into it with a debugger
+#ifndef UNFIELD_DEFINED
+#define UNFIELD_DEFINED 1
+static inline void
+unfield(NODE **l, NODE **r)
+{
+	/* if was a field, turn it into a var */
+	if (((*r)->flags & MALLOC) != 0 || (*r)->valref == 1) {
+		(*l) = (*r);
+	} else {
+		(*l) = dupnode(*r);
+		DEREF(*r);
+	}
+}
+
+#define UNFIELD(l, r)	unfield(& (l), & (r))
+#endif
+
+int
+r_interpret(INSTRUCTION *code)
+{
+	INSTRUCTION *pc;   /* current instruction */
+	OPCODE op;	/* current opcode */
+	NODE *r = NULL;
+	NODE *m;
+	INSTRUCTION *ni;
+	NODE *t1, *t2;
+	NODE **lhs;
+	AWKNUM x, x2;
+	int di;
+	Regexp *rp;
+	NODE *set_array = NULL;	/* array with a post-assignment routine */
+	NODE *set_idx = NULL;	/* the index of the array element */
+
+
+/* array subscript */
+#define mk_sub(n)  	(n == 1 ? POP_SCALAR() : concat_exp(n, true))
+
+#ifdef EXEC_HOOK
+#define JUMPTO(x)	do { if (post_execute) post_execute(pc); pc = (x); goto top; } while (false)
+#else
+#define JUMPTO(x)	do { pc = (x); goto top; } while (false)
+#endif
+
+	pc = code;
+
+	/* N.B.: always use JUMPTO for next instruction, otherwise bad things
+	 * may happen. DO NOT add a real loop (for/while) below to
+	 * replace ' forever {'; this catches failure to use JUMPTO to execute
+	 * next instruction (e.g. continue statement).
+	 */
+
+	/* loop until hit Op_stop instruction */
+
+	/* forever {  */
+top:
+		if (pc->source_line > 0)
+			sourceline = pc->source_line;
+
+#ifdef EXEC_HOOK
+		for (di = 0; di < num_exec_hook; di++) {
+			if (! pre_execute[di](& pc))
+				goto top;
+		}
+#endif
+
+		switch ((op = pc->opcode)) {
+		case Op_rule:
+			currule = pc->in_rule;   /* for sole use in Op_K_next, Op_K_nextfile, Op_K_getline */
+			/* fall through */
+		case Op_func:
+			source = pc->source_file;
+			break;
+
+		case Op_atexit:
+		{
+			bool stdio_problem = false;
+			bool got_EPIPE = false;
+
+			/* avoid false source indications */
+			source = NULL;
+			sourceline = 0;
+			(void) nextfile(& curfile, true);	/* close input data file */
+			/*
+			 * This used to be:
+			 *
+			 * if (close_io() != 0 && ! exiting && exit_val == 0)
+			 *      exit_val = 1;
+			 *
+			 * Other awks don't care about problems closing open files
+			 * and pipes, in that it doesn't affect their exit status.
+			 * So we no longer do either.
+			 */
+			(void) close_io(& stdio_problem, & got_EPIPE);
+			/*
+			 * However, we do want to exit non-zero if there was a problem
+			 * with stdout/stderr, so we reinstate a slightly different
+			 * version of the above:
+			 */
+			if (stdio_problem && ! exiting && exit_val == 0)
+				exit_val = 1;
+
+			close_extensions();
+
+			if (got_EPIPE)
+				die_via_sigpipe();
+		}
+			break;
+
+		case Op_stop:
+			return 0;
+
+		case Op_push_i:
+			m = pc->memory;
+			if (! do_traditional && (m->flags & INTLSTR) != 0) {
+				char *orig, *trans, save;
+
+				save = m->stptr[m->stlen];
+				m->stptr[m->stlen] = '\0';
+				orig = m->stptr;
+				trans = dgettext(TEXTDOMAIN, orig);
+				m->stptr[m->stlen] = save;
+				if (trans != orig)	// got a translation
+					m = make_string(trans, strlen(trans));
+				else
+					UPREF(m);
+			} else
+				UPREF(m);
+			PUSH(m);
+			break;
+
+		case Op_push:
+		case Op_push_arg:
+		case Op_push_arg_untyped:
+		{
+			NODE *save_symbol;
+			bool isparam = false;
+
+			save_symbol = m = pc->memory;
+			if (m->type == Node_param_list) {
+				isparam = true;
+				save_symbol = m = GET_PARAM(m->param_cnt);
+				if (m->type == Node_array_ref) {
+					if (m->orig_array->type == Node_var) {
+						/* gawk 'func f(x) { a = 10; print x; } BEGIN{ f(a) }' */
+						goto uninitialized_scalar;
+					}
+					m = m->orig_array;
+				}
+			}
+
+			switch (m->type) {
+			case Node_var:
+				if (do_lint && var_uninitialized(m))
+					lintwarn(isparam ?
+						_("reference to uninitialized argument `%s'") :
+						_("reference to uninitialized variable `%s'"),
+								save_symbol->vname);
+				m = m->var_value;
+				UPREF(m);
+				PUSH(m);
+				break;
+
+			case Node_var_new:
+uninitialized_scalar:
+				if (op != Op_push_arg_untyped) {
+					/* convert untyped to scalar */
+					m->type = Node_var;
+					m->var_value = dupnode(Nnull_string);
+				}
+				if (do_lint)
+					lintwarn(isparam ?
+						_("reference to uninitialized argument `%s'") :
+						_("reference to uninitialized variable `%s'"),
+								save_symbol->vname);
+				if (op != Op_push_arg_untyped)
+					m = dupnode(Nnull_string);
+				PUSH(m);
+				break;
+
+			case Node_var_array:
+				if (op == Op_push_arg || op == Op_push_arg_untyped)
+					PUSH(m);
+				else
+					fatal(_("attempt to use array `%s' in a scalar context"),
+							array_vname(save_symbol));
+				break;
+
+			default:
+				cant_happen();
+			}
+		}
+			break;
+
+		case Op_push_param:		/* function argument */
+			m = pc->memory;
+			if (m->type == Node_param_list)
+				m = GET_PARAM(m->param_cnt);
+			if (m->type == Node_var) {
+				m = m->var_value;
+				UPREF(m);
+				PUSH(m);
+		 		break;
+			}
+ 			/* else
+				fall through */
+		case Op_push_array:
+			PUSH(pc->memory);
+			break;
+
+		case Op_push_lhs:
+			lhs = get_lhs(pc->memory, pc->do_reference);
+			PUSH_ADDRESS(lhs);
+			break;
+
+		case Op_subscript:
+			t2 = mk_sub(pc->sub_count);
+			t1 = POP_ARRAY(false);
+
+			if (do_lint && in_array(t1, t2) == NULL) {
+				t2 = force_string(t2);
+				lintwarn(_("reference to uninitialized element `%s[\"%.*s\"]'"),
+					array_vname(t1), (int) t2->stlen, t2->stptr);
+				if (t2->stlen == 0)
+					lintwarn(_("subscript of array `%s' is null string"), array_vname(t1));
+			}
+
+			/* for FUNCTAB, get the name as the element value */
+			if (t1 == func_table) {
+				static bool warned = false;
+
+				if (do_lint && ! warned) {
+					warned = true;
+					lintwarn(_("FUNCTAB is a gawk extension"));
+				}
+				r = t2;
+			} else {
+				/* make sure stuff like NF, NR, are up to date */
+				if (t1 == symbol_table)
+					update_global_values();
+
+				r = *assoc_lookup(t1, t2);
+			}
+			DEREF(t2);
+
+			/* for SYMTAB, step through to the actual variable */
+			if (t1 == symbol_table) {
+				static bool warned = false;
+
+				if (do_lint && ! warned) {
+					warned = true;
+					lintwarn(_("SYMTAB is a gawk extension"));
+				}
+				if (r->type == Node_var)
+					r = r->var_value;
+			}
+
+			if (r->type == Node_val)
+				UPREF(r);
+			PUSH(r);
+			break;
+
+		case Op_sub_array:
+			t2 = mk_sub(pc->sub_count);
+			t1 = POP_ARRAY(false);
+			r = in_array(t1, t2);
+			if (r == NULL) {
+				r = make_array();
+				r->parent_array = t1;
+				t2 = force_string(t2);
+				r->vname = estrdup(t2->stptr, t2->stlen);	/* the subscript in parent array */
+				assoc_set(t1, t2, r);
+			} else if (r->type != Node_var_array) {
+				t2 = force_string(t2);
+				fatal(_("attempt to use scalar `%s[\"%.*s\"]' as an array"),
+						array_vname(t1), (int) t2->stlen, t2->stptr);
+			} else
+				DEREF(t2);
+
+			PUSH(r);
+			break;
+
+		case Op_subscript_lhs:
+			t2 = mk_sub(pc->sub_count);
+			t1 = POP_ARRAY(false);
+			if (do_lint && in_array(t1, t2) == NULL) {
+				t2 = force_string(t2);
+				if (pc->do_reference)
+					lintwarn(_("reference to uninitialized element `%s[\"%.*s\"]'"),
+						array_vname(t1), (int) t2->stlen, t2->stptr);
+				if (t2->stlen == 0)
+					lintwarn(_("subscript of array `%s' is null string"), array_vname(t1));
+			}
+
+			lhs = assoc_lookup(t1, t2);
+			if ((*lhs)->type == Node_var_array) {
+				t2 = force_string(t2);
+				fatal(_("attempt to use array `%s[\"%.*s\"]' in a scalar context"),
+						array_vname(t1), (int) t2->stlen, t2->stptr);
+			}
+
+			/*
+			 * Changing something in FUNCTAB is not allowed.
+			 *
+			 * SYMTAB is a little more messy.  Three kinds of values may
+			 * be stored in SYMTAB:
+			 * 	1. Variables that don"t yet have a value (Node_var_new)
+			 * 	2. Variables that have a value (Node_var)
+			 * 	3. Values that awk code stuck into SYMTAB not related to variables (Node_value)
+			 * For 1, since we are giving it a value, we have to change the type to Node_var.
+			 * For 1 and 2, we have to step through the Node_var to get to the value.
+			 * For 3, we fatal out. This avoids confusion on things like
+			 * SYMTAB["a foo"] = 42	# variable with a space in its name?
+			 */
+			if (t1 == func_table)
+				fatal(_("cannot assign to elements of FUNCTAB"));
+			else if (t1 == symbol_table) {
+				if ((   (*lhs)->type == Node_var
+				     || (*lhs)->type == Node_var_new)) {
+					update_global_values();		/* make sure stuff like NF, NR, are up to date */
+					(*lhs)->type = Node_var;	/* in case was Node_var_new */
+					lhs = & ((*lhs)->var_value);	/* extra level of indirection */
+				} else
+					fatal(_("cannot assign to arbitrary elements of SYMTAB"));
+			}
+
+			assert(set_idx == NULL);
+
+			if (t1->astore) {
+				/* array has post-assignment routine */
+				set_array = t1;
+				set_idx = t2;
+			} else
+				DEREF(t2);
+
+			PUSH_ADDRESS(lhs);
+			break;
+
+		case Op_field_spec:
+			t1 = TOP_SCALAR();
+			lhs = r_get_field(t1, (Func_ptr *) 0, true);
+			decr_sp();
+			DEREF(t1);
+			r = *lhs;
+			UPREF(r);
+			PUSH(r);
+			break;
+
+		case Op_field_spec_lhs:
+			t1 = TOP_SCALAR();
+			lhs = r_get_field(t1, &pc->target_assign->field_assign, pc->do_reference);
+			decr_sp();
+			DEREF(t1);
+			PUSH_ADDRESS(lhs);
+			break;
+
+		case Op_lint:
+			if (do_lint) {
+				switch (pc->lint_type) {
+				case LINT_assign_in_cond:
+					lintwarn(_("assignment used in conditional context"));
+					break;
+
+				case LINT_no_effect:
+					lintwarn(_("statement has no effect"));
+					break;
+
+				default:
+					cant_happen();
+				}
+			}
+			break;
+
+		case Op_K_break:
+		case Op_K_continue:
+		case Op_jmp:
+			assert(pc->target_jmp != NULL);
+			JUMPTO(pc->target_jmp);
+
+		case Op_jmp_false:
+			r = POP_SCALAR();
+			di = eval_condition(r);
+			DEREF(r);
+			if (! di)
+				JUMPTO(pc->target_jmp);
+			break;
+
+		case Op_jmp_true:
+			r = POP_SCALAR();
+			di = eval_condition(r);
+			DEREF(r);
+			if (di)
+				JUMPTO(pc->target_jmp);
+			break;
+
+		case Op_and:
+		case Op_or:
+			t1 = POP_SCALAR();
+			di = eval_condition(t1);
+			DEREF(t1);
+			if ((op == Op_and && di) || (op == Op_or && ! di))
+				break;
+			r = node_Boolean[di];
+			UPREF(r);
+			PUSH(r);
+			ni = pc->target_jmp;
+			JUMPTO(ni->nexti);
+
+		case Op_and_final:
+		case Op_or_final:
+			t1 = TOP_SCALAR();
+			r = node_Boolean[eval_condition(t1)];
+			DEREF(t1);
+			UPREF(r);
+			REPLACE(r);
+			break;
+
+		case Op_not:
+			t1 = TOP_SCALAR();
+			r = node_Boolean[! eval_condition(t1)];
+			DEREF(t1);
+			UPREF(r);
+			REPLACE(r);
+			break;
+
+		case Op_equal:
+			r = node_Boolean[cmp_scalars(SCALAR_EQ_NEQ) == 0];
+			UPREF(r);
+			REPLACE(r);
+			break;
+
+		case Op_notequal:
+			r = node_Boolean[cmp_scalars(SCALAR_EQ_NEQ) != 0];
+			UPREF(r);
+			REPLACE(r);
+			break;
+
+		case Op_less:
+			r = node_Boolean[cmp_scalars(SCALAR_RELATIONAL) < 0];
+			UPREF(r);
+			REPLACE(r);
+			break;
+
+		case Op_greater:
+			r = node_Boolean[cmp_scalars(SCALAR_RELATIONAL) > 0];
+			UPREF(r);
+			REPLACE(r);
+			break;
+
+		case Op_leq:
+			r = node_Boolean[cmp_scalars(SCALAR_RELATIONAL) <= 0];
+			UPREF(r);
+			REPLACE(r);
+			break;
+
+		case Op_geq:
+			r = node_Boolean[cmp_scalars(SCALAR_RELATIONAL) >= 0];
+			UPREF(r);
+			REPLACE(r);
+			break;
+
+		case Op_plus_i:
+			x2 = force_number(pc->memory)->numbr;
+			goto plus;
+		case Op_plus:
+			t2 = POP_NUMBER();
+			x2 = t2->numbr;
+			DEREF(t2);
+plus:
+			t1 = TOP_NUMBER();
+			r = make_number(t1->numbr + x2);
+			DEREF(t1);
+			REPLACE(r);
+			break;
+
+		case Op_minus_i:
+			x2 = force_number(pc->memory)->numbr;
+			goto minus;
+		case Op_minus:
+			t2 = POP_NUMBER();
+			x2 = t2->numbr;
+			DEREF(t2);
+minus:
+			t1 = TOP_NUMBER();
+			r = make_number(t1->numbr - x2);
+			DEREF(t1);
+			REPLACE(r);
+			break;
+
+		case Op_times_i:
+			x2 = force_number(pc->memory)->numbr;
+			goto times;
+		case Op_times:
+			t2 = POP_NUMBER();
+			x2 = t2->numbr;
+			DEREF(t2);
+times:
+			t1 = TOP_NUMBER();
+			r = make_number(t1->numbr * x2);
+			DEREF(t1);
+			REPLACE(r);
+			break;
+
+		case Op_exp_i:
+			x2 = force_number(pc->memory)->numbr;
+			goto exp;
+		case Op_exp:
+			t2 = POP_NUMBER();
+			x2 = t2->numbr;
+			DEREF(t2);
+exp:
+			t1 = TOP_NUMBER();
+			r = make_number(calc_exp(t1->numbr, x2));
+			DEREF(t1);
+			REPLACE(r);
+			break;
+
+		case Op_quotient_i:
+			x2 = force_number(pc->memory)->numbr;
+			goto quotient;
+		case Op_quotient:
+			t2 = POP_NUMBER();
+			x2 = t2->numbr;
+			DEREF(t2);
+quotient:
+			t1 = TOP_NUMBER();
+			if (x2 == 0)
+				fatal(_("division by zero attempted"));
+			r = make_number(t1->numbr / x2);
+			DEREF(t1);
+			REPLACE(r);
+			break;
+
+		case Op_mod_i:
+			x2 = force_number(pc->memory)->numbr;
+			goto mod;
+		case Op_mod:
+			t2 = POP_NUMBER();
+			x2 = t2->numbr;
+			DEREF(t2);
+mod:
+			t1 = TOP_NUMBER();
+			if (x2 == 0)
+				fatal(_("division by zero attempted in `%%'"));
+#ifdef HAVE_FMOD
+			x = fmod(t1->numbr, x2);
+#else	/* ! HAVE_FMOD */
+			(void) modf(t1->numbr / x2, &x);
+			x = t1->numbr - x * x2;
+#endif	/* ! HAVE_FMOD */
+			r = make_number(x);
+
+			DEREF(t1);
+			REPLACE(r);
+			break;
+
+		case Op_preincrement:
+		case Op_predecrement:
+			x = op == Op_preincrement ? 1.0 : -1.0;
+			lhs = TOP_ADDRESS();
+			t1 = *lhs;
+			force_number(t1);
+			if (t1->valref == 1 && t1->flags == (MALLOC|NUMCUR|NUMBER)) {
+				/* optimization */
+				t1->numbr += x;
+				r = t1;
+			} else {
+				r = *lhs = make_number(t1->numbr + x);
+				unref(t1);
+			}
+			UPREF(r);
+			REPLACE(r);
+			break;
+
+		case Op_postincrement:
+		case Op_postdecrement:
+			x = op == Op_postincrement ? 1.0 : -1.0;
+			lhs = TOP_ADDRESS();
+			t1 = *lhs;
+			force_number(t1);
+			r = make_number(t1->numbr);
+			if (t1->valref == 1 && t1->flags == (MALLOC|NUMCUR|NUMBER)) {
+ 				/* optimization */
+				t1->numbr += x;
+			} else {
+				*lhs = make_number(t1->numbr + x);
+				unref(t1);
+			}
+			REPLACE(r);
+			break;
+
+		case Op_unary_minus:
+			t1 = TOP_NUMBER();
+			r = make_number(-t1->numbr);
+			DEREF(t1);
+			REPLACE(r);
+			break;
+
+		case Op_unary_plus:
+			// Force argument to be numeric
+			t1 = TOP_NUMBER();
+			r = make_number(t1->numbr);
+			DEREF(t1);
+			REPLACE(r);
+			break;
+
+		case Op_store_sub:
+			/*
+			 * array[sub] assignment optimization,
+			 * see awkgram.y (optimize_assignment)
+			 */
+			t1 = force_array(pc->memory, true);	/* array */
+			t2 = mk_sub(pc->expr_count);	/* subscript */
+ 			lhs = assoc_lookup(t1, t2);
+			if ((*lhs)->type == Node_var_array) {
+				t2 = force_string(t2);
+				fatal(_("attempt to use array `%s[\"%.*s\"]' in a scalar context"),
+						array_vname(t1), (int) t2->stlen, t2->stptr);
+			}
+			DEREF(t2);
+
+			/*
+			 * Changing something in FUNCTAB is not allowed.
+			 *
+			 * SYMTAB is a little more messy.  Three possibilities for SYMTAB:
+			 * 	1. Variables that don"t yet have a value (Node_var_new)
+			 * 	2. Variables that have a value (Node_var)
+			 * 	3. Values that awk code stuck into SYMTAB not related to variables (Node_value)
+			 * For 1, since we are giving it a value, we have to change the type to Node_var.
+			 * For 1 and 2, we have to step through the Node_var to get to the value.
+			 * For 3, we fatal out. This avoids confusion on things like
+			 * SYMTAB["a foo"] = 42	# variable with a space in its name?
+			 */
+			if (t1 == func_table)
+				fatal(_("cannot assign to elements of FUNCTAB"));
+			else if (t1 == symbol_table) {
+				if ((   (*lhs)->type == Node_var
+				     || (*lhs)->type == Node_var_new)) {
+					update_global_values();		/* make sure stuff like NF, NR, are up to date */
+					(*lhs)->type = Node_var;	/* in case was Node_var_new */
+					lhs = & ((*lhs)->var_value);	/* extra level of indirection */
+				} else
+					fatal(_("cannot assign to arbitrary elements of SYMTAB"));
+			}
+
+			unref(*lhs);
+			r = POP_SCALAR();
+			UNFIELD(*lhs, r);
+
+			/* execute post-assignment routine if any */
+			if (t1->astore != NULL)
+				(*t1->astore)(t1, t2);
+
+			DEREF(t2);
+			break;
+
+		case Op_store_var:
+			/*
+			 * simple variable assignment optimization,
+			 * see awkgram.y (optimize_assignment)
+			 */
+
+			lhs = get_lhs(pc->memory, false);
+			unref(*lhs);
+			r = pc->initval;	/* constant initializer */
+			if (r != NULL) {
+				UPREF(r);
+				*lhs = r;
+			} else {
+				r = POP_SCALAR();
+				UNFIELD(*lhs, r);
+			}
+			break;
+
+		case Op_store_field:
+		{
+			/* field assignment optimization,
+			 * see awkgram.y (optimize_assignment)
+			 */
+
+			Func_ptr assign;
+			t1 = TOP_SCALAR();
+			lhs = r_get_field(t1, & assign, false);
+			decr_sp();
+			DEREF(t1);
+			/*
+			 * N.B. We must call assign() before unref, since
+			 * we may need to copy $n values before freeing the
+			 * $0 buffer.
+			 */
+			assert(assign != NULL);
+			assign();
+			unref(*lhs);
+			r = POP_SCALAR();
+			UNFIELD(*lhs, r);
+			/* field variables need the string representation: */
+			force_string(*lhs);
+		}
+			break;
+
+		case Op_assign_concat:
+			/* x = x ... string concatenation optimization */
+			lhs = get_lhs(pc->memory, false);
+			t1 = force_string(*lhs);
+			t2 = POP_STRING();
+
+			if (t1 != *lhs) {
+				unref(*lhs);
+				*lhs = dupnode(t1);
+			}
+
+			if (t1 != t2 && t1->valref == 1 && (t1->flags & (MALLOC|MPFN|MPZN)) == MALLOC) {
+				size_t nlen = t1->stlen + t2->stlen;
+
+				erealloc(t1->stptr, char *, nlen + 1, "r_interpret");
+				memcpy(t1->stptr + t1->stlen, t2->stptr, t2->stlen);
+				t1->stlen = nlen;
+				t1->stptr[nlen] = '\0';
+				/* clear flags except WSTRCUR (used below) */
+				t1->flags &= WSTRCUR;
+				/* configure as a string as in make_str_node */
+				t1->flags |= (MALLOC|STRING|STRCUR);
+				t1->stfmt = STFMT_UNUSED;
+#ifdef HAVE_MPFR
+				t1->strndmode = MPFR_round_mode;
+#endif
+
+				if ((t1->flags & WSTRCUR) != 0 && (t2->flags & WSTRCUR) != 0) {
+					size_t wlen = t1->wstlen + t2->wstlen;
+
+					erealloc(t1->wstptr, wchar_t *,
+							sizeof(wchar_t) * (wlen + 1), "r_interpret");
+					memcpy(t1->wstptr + t1->wstlen, t2->wstptr, t2->wstlen * sizeof(wchar_t));
+					t1->wstlen = wlen;
+					t1->wstptr[wlen] = L'\0';
+				} else
+					free_wstr(*lhs);
+			} else {
+				size_t nlen = t1->stlen + t2->stlen;
+				char *p;
+
+				emalloc(p, char *, nlen + 1, "r_interpret");
+				memcpy(p, t1->stptr, t1->stlen);
+				memcpy(p + t1->stlen, t2->stptr, t2->stlen);
+				/* N.B. No NUL-termination required, since make_str_node will do it. */
+				unref(*lhs);
+				t1 = *lhs = make_str_node(p, nlen, ALREADY_MALLOCED);
+			}
+			DEREF(t2);
+			break;
+
+		case Op_assign:
+			lhs = POP_ADDRESS();
+			r = TOP_SCALAR();
+			unref(*lhs);
+			UPREF(r);
+			UNFIELD(*lhs, r);
+			REPLACE(r);
+			break;
+
+		case Op_subscript_assign:
+			/* conditionally execute post-assignment routine for an array element */
+
+			if (set_idx != NULL) {
+				di = true;
+				if (pc->assign_ctxt == Op_sub_builtin
+					&& (r = TOP())
+					&& get_number_si(r) == 0	/* no substitution performed */
+				)
+					di = false;
+				else if ((pc->assign_ctxt == Op_K_getline
+						|| pc->assign_ctxt == Op_K_getline_redir)
+					&& (r = TOP())
+					&& get_number_si(r) <= 0 	/* EOF or error */
+				)
+					di = false;
+
+				if (di)
+					(*set_array->astore)(set_array, set_idx);
+				unref(set_idx);
+				set_idx = NULL;
+			}
+			break;
+
+		/* numeric assignments */
+		case Op_assign_plus:
+		case Op_assign_minus:
+		case Op_assign_times:
+		case Op_assign_quotient:
+		case Op_assign_mod:
+		case Op_assign_exp:
+			op_assign(op);
+			break;
+
+		case Op_var_update:        /* update value of NR, FNR or NF */
+			pc->update_var();
+			break;
+
+		case Op_var_assign:
+		case Op_field_assign:
+			r = TOP();
+			if (pc->assign_ctxt == Op_sub_builtin
+				&& get_number_si(r) == 0	/* top of stack has a number == 0 */
+			) {
+				/* There wasn't any substitutions. If the target is a FIELD,
+				 * this means no field re-splitting or $0 reconstruction.
+				 * Skip the set_FOO routine if the target is a special variable.
+				 */
+
+				break;
+			} else if ((pc->assign_ctxt == Op_K_getline
+					|| pc->assign_ctxt == Op_K_getline_redir)
+				&& get_number_si(r) <= 0 	/* top of stack has a number <= 0 */
+			) {
+				/* getline returned EOF or error */
+
+				break;
+			}
+
+			if (op == Op_var_assign)
+				pc->assign_var();
+			else
+				pc->field_assign();
+			break;
+
+		case Op_concat:
+			r = concat_exp(pc->expr_count, pc->concat_flag & CSUBSEP);
+			PUSH(r);
+			break;
+
+		case Op_K_case:
+			if ((pc + 1)->match_exp) {
+				/* match a constant regex against switch expression instead of $0. */
+
+				m = POP();	/* regex */
+				t2 = TOP_SCALAR();	/* switch expression */
+				t2 = force_string(t2);
+				rp = re_update(m);
+				di = (research(rp, t2->stptr, 0, t2->stlen, RE_NO_FLAGS) >= 0);
+			} else {
+				t1 = POP_SCALAR();	/* case value */
+				t2 = TOP_SCALAR();	/* switch expression */
+				di = (cmp_nodes(t2, t1, true) == 0);
+				DEREF(t1);
+			}
+
+			if (di) {
+				/* match found */
+				t2 = POP_SCALAR();
+				DEREF(t2);
+				JUMPTO(pc->target_jmp);
+			}
+			break;
+
+		case Op_K_delete:
+			t1 = POP_ARRAY(false);
+			do_delete(t1, pc->expr_count);
+			stack_adj(-pc->expr_count);
+			break;
+
+		case Op_K_delete_loop:
+			t1 = POP_ARRAY(false);
+			lhs = POP_ADDRESS();	/* item */
+			do_delete_loop(t1, lhs);
+			break;
+
+		case Op_in_array:
+			t1 = POP_ARRAY(false);
+			t2 = mk_sub(pc->expr_count);
+			r = node_Boolean[(in_array(t1, t2) != NULL)];
+			DEREF(t2);
+			UPREF(r);
+			PUSH(r);
+			break;
+
+		case Op_arrayfor_init:
+		{
+			NODE **list = NULL;
+			NODE *array, *sort_str;
+			size_t num_elems = 0;
+			static NODE *sorted_in = NULL;
+			const char *how_to_sort = "@unsorted";
+			char save;
+			bool saved_end = false;
+
+			/* get the array */
+			array = POP_ARRAY(true);
+
+			/* sanity: check if empty */
+			num_elems = assoc_length(array);
+			if (num_elems == 0)
+				goto arrayfor;
+
+			if (sorted_in == NULL)		/* do this once */
+				sorted_in = make_string("sorted_in", 9);
+
+			sort_str = NULL;
+			/*
+			 * If posix, or if there's no PROCINFO[],
+			 * there's no ["sorted_in"], so no sorting
+			 */
+			if (! do_posix && PROCINFO_node != NULL)
+				sort_str = in_array(PROCINFO_node, sorted_in);
+
+			if (sort_str != NULL) {
+				sort_str = force_string(sort_str);
+				if (sort_str->stlen > 0) {
+					how_to_sort = sort_str->stptr;
+					str_terminate(sort_str, save);
+					saved_end = true;
+				}
+			}
+
+			list = assoc_list(array, how_to_sort, SORTED_IN);
+			if (saved_end)
+				str_restore(sort_str, save);
+
+arrayfor:
+			getnode(r);
+			r->type = Node_arrayfor;
+			r->for_list = list;
+			r->for_list_size = num_elems;		/* # of elements in list */
+			r->cur_idx = -1;			/* current index */
+			r->for_array = array;		/* array */
+			PUSH(r);
+
+			if (num_elems == 0)
+				JUMPTO(pc->target_jmp);   /* Op_arrayfor_final */
+		}
+			break;
+
+		case Op_arrayfor_incr:
+			r = TOP();	/* Node_arrayfor */
+			if (++r->cur_idx == r->for_list_size) {
+				NODE *array;
+				array = r->for_array;	/* actual array */
+				if (do_lint && array->table_size != r->for_list_size)
+					lintwarn(_("for loop: array `%s' changed size from %ld to %ld during loop execution"),
+						array_vname(array), (long) r->for_list_size, (long) array->table_size);
+				JUMPTO(pc->target_jmp);	/* Op_arrayfor_final */
+			}
+
+			t1 = r->for_list[r->cur_idx];
+			lhs = get_lhs(pc->array_var, false);
+			unref(*lhs);
+			*lhs = dupnode(t1);
+			break;
+
+		case Op_arrayfor_final:
+			r = POP();
+			assert(r->type == Node_arrayfor);
+			free_arrayfor(r);
+			break;
+
+		case Op_builtin:
+			r = pc->builtin(pc->expr_count);
+			PUSH(r);
+			break;
+
+		case Op_ext_builtin:
+		{
+			size_t arg_count = pc->expr_count;
+			awk_ext_func_t *f = pc[1].c_function;
+			size_t min_req = f->min_required_args;
+			size_t max_expect = f->max_expected_args;
+			awk_value_t result;
+
+			if (arg_count < min_req)
+				fatal(_("%s: called with %lu arguments, expecting at least %lu"),
+						pc[1].func_name,
+						(unsigned long) arg_count,
+						(unsigned long) min_req);
+
+			if (do_lint && ! f->suppress_lint && arg_count > max_expect)
+				lintwarn(_("%s: called with %lu arguments, expecting no more than %lu"),
+						pc[1].func_name,
+						(unsigned long) arg_count,
+						(unsigned long) max_expect);
+
+			PUSH_CODE(pc);
+			r = awk_value_to_node(pc->extfunc(arg_count, & result, f));
+			(void) POP_CODE();
+			while (arg_count-- > 0) {
+				t1 = POP();
+				if (t1->type == Node_val)
+					DEREF(t1);
+			}
+			free_api_string_copies();
+			PUSH(r);
+		}
+			break;
+
+		case Op_sub_builtin:	/* sub, gsub and gensub */
+			r = do_sub(pc->expr_count, pc->sub_flags);
+			PUSH(r);
+			break;
+
+		case Op_K_print:
+			do_print(pc->expr_count, pc->redir_type);
+			break;
+
+		case Op_K_printf:
+			do_printf(pc->expr_count, pc->redir_type);
+			break;
+
+		case Op_K_print_rec:
+			do_print_rec(pc->expr_count, pc->redir_type);
+			break;
+
+		case Op_push_re:
+			m = pc->memory;
+			if (m->type == Node_dynregex) {
+				r = POP_STRING();
+				unref(m->re_exp);
+				m->re_exp = r;
+			} else if (m->type == Node_val) {
+				assert((m->flags & REGEX) != 0);
+				UPREF(m);
+			}
+			PUSH(m);
+			break;
+
+		case Op_match_rec:
+			m = pc->memory;
+			t1 = *get_field(0, (Func_ptr *) 0);
+match_re:
+			rp = re_update(m);
+			di = research(rp, t1->stptr, 0, t1->stlen, RE_NO_FLAGS);
+			di = (di == -1) ^ (op != Op_nomatch);
+			if (op != Op_match_rec) {
+				decr_sp();
+				DEREF(t1);
+			}
+			r = node_Boolean[di];
+			UPREF(r);
+			PUSH(r);
+			break;
+
+		case Op_nomatch:
+			/* fall through */
+		case Op_match:
+			m = pc->memory;
+			t1 = TOP_STRING();
+			if (m->type == Node_dynregex) {
+				unref(m->re_exp);
+				m->re_exp = t1;
+				decr_sp();
+				t1 = TOP_STRING();
+			}
+			goto match_re;
+			break;
+
+		case Op_indirect_func_call:
+		{
+			NODE *f = NULL;
+			int arg_count;
+			char save;
+
+			arg_count = (pc + 1)->expr_count;
+			t1 = PEEK(arg_count);	/* indirect var */
+
+			if (t1->type != Node_val)	/* @a[1](p) not allowed in grammar */
+				fatal(_("indirect function call requires a simple scalar value"));
+
+			t1 = force_string(t1);
+			str_terminate(t1, save);
+			if (t1->stlen > 0) {
+				/* retrieve function definition node */
+				f = pc->func_body;
+				if (f != NULL && strcmp(f->vname, t1->stptr) == 0) {
+					/* indirect var hasn't been reassigned */
+
+					str_restore(t1, save);
+					ni = setup_frame(pc);
+					JUMPTO(ni);	/* Op_func */
+				}
+				f = lookup(t1->stptr);
+			}
+
+			if (f == NULL) {
+				fatal(_("`%s' is not a function, so it cannot be called indirectly"),
+						t1->stptr);
+			} else if (f->type == Node_builtin_func) {
+				int arg_count = (pc + 1)->expr_count;
+				builtin_func_t the_func = lookup_builtin(t1->stptr);
+
+				assert(the_func != NULL);
+
+				/* call it */
+				if (the_func == (builtin_func_t) do_sub)
+					r = call_sub(t1->stptr, arg_count);
+				else if (the_func == do_match)
+					r = call_match(arg_count);
+				else if (the_func == do_split || the_func == do_patsplit)
+					r = call_split_func(t1->stptr, arg_count);
+				else
+					r = the_func(arg_count);
+				str_restore(t1, save);
+
+				PUSH(r);
+				break;
+			} else if (f->type != Node_func) {
+				str_restore(t1, save);
+				if (f->type == Node_ext_func) {
+					/* code copied from below, keep in sync */
+					INSTRUCTION *bc;
+					char *fname = pc->func_name;
+					int arg_count = (pc + 1)->expr_count;
+					static INSTRUCTION npc[2];
+
+					npc[0] = *pc;
+
+					bc = f->code_ptr;
+					assert(bc->opcode == Op_symbol);
+					npc[0].opcode = Op_ext_builtin;	/* self modifying code */
+					npc[0].extfunc = bc->extfunc;
+					npc[0].expr_count = arg_count;		/* actual argument count */
+					npc[1] = pc[1];
+					npc[1].func_name = fname;	/* name of the builtin */
+					npc[1].c_function = bc->c_function;
+					ni = npc;
+					JUMPTO(ni);
+				} else
+					fatal(_("function called indirectly through `%s' does not exist"),
+							pc->func_name);
+			}
+			pc->func_body = f;     /* save for next call */
+			str_restore(t1, save);
+
+			ni = setup_frame(pc);
+			JUMPTO(ni);	/* Op_func */
+		}
+
+		case Op_func_call:
+		{
+			NODE *f;
+
+			/* retrieve function definition node */
+			f = pc->func_body;
+			if (f == NULL) {
+				f = lookup(pc->func_name);
+				if (f == NULL || (f->type != Node_func && f->type != Node_ext_func))
+					fatal(_("function `%s' not defined"), pc->func_name);
+				pc->func_body = f;     /* save for next call */
+			}
+
+			if (f->type == Node_ext_func) {
+				/* keep in sync with indirect call code */
+				INSTRUCTION *bc;
+				char *fname = pc->func_name;
+				int arg_count = (pc + 1)->expr_count;
+
+				bc = f->code_ptr;
+				assert(bc->opcode == Op_symbol);
+				pc->opcode = Op_ext_builtin;	/* self modifying code */
+				pc->extfunc = bc->extfunc;
+				pc->expr_count = arg_count;	/* actual argument count */
+				(pc + 1)->func_name = fname;	/* name of the builtin */
+				(pc + 1)->c_function = bc->c_function;	/* min and max args */
+				ni = pc;
+				JUMPTO(ni);
+			}
+
+			ni = setup_frame(pc);
+			JUMPTO(ni);	/* Op_func */
+		}
+
+		case Op_K_return_from_eval:
+			cant_happen();
+			break;
+
+		case Op_K_return:
+			m = POP_SCALAR();       /* return value */
+
+			ni = pop_fcall();
+
+			/* put the return value back on stack */
+			PUSH(m);
+
+			JUMPTO(ni);
+
+		case Op_K_getline_redir:
+			r = do_getline_redir(pc->into_var, pc->redir_type);
+			PUSH(r);
+			break;
+
+		case Op_K_getline:	/* no redirection */
+			if (! currule || currule == BEGINFILE || currule == ENDFILE)
+				fatal(_("non-redirected `getline' invalid inside `%s' rule"),
+						ruletab[currule]);
+
+			do {
+				int ret;
+				ret = nextfile(& curfile, false);
+				if (ret <= 0)
+					r = do_getline(pc->into_var, curfile);
+				else {
+
+					/* Save execution state so that we can return to it
+					 * from Op_after_beginfile or Op_after_endfile.
+					 */
+
+					push_exec_state(pc, currule, source, stack_ptr);
+
+					if (curfile == NULL)
+						JUMPTO((pc + 1)->target_endfile);
+					else
+						JUMPTO((pc + 1)->target_beginfile);
+				}
+			} while (r == NULL);	/* EOF */
+
+			PUSH(r);
+			break;
+
+		case Op_after_endfile:
+			/* Find the execution state to return to */
+			ni = pop_exec_state(& currule, & source, NULL);
+
+			assert(ni->opcode == Op_newfile || ni->opcode == Op_K_getline);
+			JUMPTO(ni);
+
+		case Op_after_beginfile:
+			after_beginfile(& curfile);
+
+			/* Find the execution state to return to */
+			ni = pop_exec_state(& currule, & source, NULL);
+
+			assert(ni->opcode == Op_newfile || ni->opcode == Op_K_getline);
+			if (ni->opcode == Op_K_getline
+					|| curfile == NULL      /* skipping directory argument */
+			)
+				JUMPTO(ni);
+
+			break;	/* read a record, Op_get_record */
+
+		case Op_newfile:
+		{
+			int ret;
+
+			ret = nextfile(& curfile, false);
+
+			if (ret < 0)	/* end of input */
+				JUMPTO(pc->target_jmp);	/* end block or Op_atexit */
+
+			if (ret == 0) /* read a record */
+				JUMPTO((pc + 1)->target_get_record);
+
+			/* ret > 0 */
+			/* Save execution state for use in Op_after_beginfile or Op_after_endfile. */
+
+			push_exec_state(pc, currule, source, stack_ptr);
+
+			if (curfile == NULL)	/* EOF */
+				JUMPTO(pc->target_endfile);
+			/* else
+				execute beginfile block */
+		}
+			break;
+
+		case Op_get_record:
+		{
+			int errcode = 0;
+
+			ni = pc->target_newfile;
+			if (curfile == NULL) {
+				/* from non-redirected getline, e.g.:
+				 *  {
+				 *		while (getline > 0) ;
+				 *  }
+				 */
+
+				ni = ni->target_jmp;	/* end_block or Op_atexit */
+				JUMPTO(ni);
+			}
+
+			if (! inrec(curfile, & errcode)) {
+				if (errcode > 0) {
+					update_ERRNO_int(errcode);
+					if (do_traditional || ! pc->has_endfile)
+						fatal(_("error reading input file `%s': %s"),
+						curfile->public.name, strerror(errcode));
+				}
+
+				JUMPTO(ni);
+			} /* else
+				prog (rule) block */
+		}
+			break;
+
+		case Op_K_nextfile:
+		{
+			int ret;
+
+			if (currule != Rule && currule != BEGINFILE)
+				fatal(_("`nextfile' cannot be called from a `%s' rule"),
+					ruletab[currule]);
+
+			ret = nextfile(& curfile, true);	/* skip current file */
+
+			if (currule == BEGINFILE) {
+				long stack_size = 0;
+
+				ni = pop_exec_state(& currule, & source, & stack_size);
+
+				assert(ni->opcode == Op_K_getline || ni->opcode == Op_newfile);
+
+				/* pop stack returning to the state of Op_K_getline or Op_newfile. */
+				unwind_stack(stack_size);
+
+				if (ret == 0) {
+					/* There was an error opening the file;
+					 * don't run ENDFILE block(s).
+					 */
+
+					JUMPTO(ni);
+				} else {
+					/* do run ENDFILE block(s) first. */
+
+					/* Execution state to return to in Op_after_endfile. */
+					push_exec_state(ni, currule, source, stack_ptr);
+
+					JUMPTO(pc->target_endfile);
+				}
+			} /* else
+				Start over with the first rule. */
+
+			/* empty the run-time stack to avoid memory leak */
+			pop_stack();
+
+			/* Push an execution state for Op_after_endfile to return to */
+			push_exec_state(pc->target_newfile, currule, source, stack_ptr);
+
+			JUMPTO(pc->target_endfile);
+		}
+			break;
+
+		case Op_K_exit:
+			/* exit not allowed in user-defined comparison functions for "sorted_in";
+			 * This is done so that END blocks aren't executed more than once.
+			 */
+			if (! currule)
+				fatal(_("`exit' cannot be called in the current context"));
+
+			exiting = true;
+			if ((t1 = POP_NUMBER()) != Nnull_string) {
+				exit_val = (int) get_number_si(t1);
+#ifdef VMS
+				if (exit_val == 0)
+					exit_val = EXIT_SUCCESS;
+				else if (exit_val == 1)
+					exit_val = EXIT_FAILURE;
+				/* else
+					just pass anything else on through */
+#endif
+			}
+			DEREF(t1);
+
+			if (currule == BEGINFILE || currule == ENDFILE) {
+
+				/* Find the rule of the saved execution state (Op_K_getline/Op_newfile).
+				 * This is needed to prevent multiple execution of any END rules:
+				 * 	gawk 'BEGINFILE { exit(1) } \
+				 *         END { while (getline > 0); }' in1 in2
+				 */
+
+				(void) pop_exec_state(& currule, & source, NULL);
+			}
+
+			pop_stack();	/* empty stack, don't leak memory */
+
+			/* Jump to either the first END block instruction
+			 * or to Op_atexit.
+			 */
+
+			if (currule == END)
+				ni = pc->target_atexit;
+			else
+				ni = pc->target_end;
+			JUMPTO(ni);
+
+		case Op_K_next:
+			if (currule != Rule)
+				fatal(_("`next' cannot be called from a `%s' rule"), ruletab[currule]);
+
+			pop_stack();
+			JUMPTO(pc->target_jmp);	/* Op_get_record, read next record */
+
+		case Op_pop:
+			r = POP_SCALAR();
+			DEREF(r);
+			break;
+
+		case Op_line_range:
+			if (pc->triggered)		/* evaluate right expression */
+				JUMPTO(pc->target_jmp);
+			/* else
+				evaluate left expression */
+			break;
+
+		case Op_cond_pair:
+		{
+			int result;
+			INSTRUCTION *ip;
+
+			t1 = TOP_SCALAR();   /* from right hand side expression */
+			di = (eval_condition(t1) != 0);
+			DEREF(t1);
+
+			ip = pc->line_range;            /* Op_line_range */
+
+			if (! ip->triggered && di) {
+				/* not already triggered and left expression is true */
+				decr_sp();
+				ip->triggered = true;
+				JUMPTO(ip->target_jmp);	/* evaluate right expression */
+			}
+
+			result = ip->triggered || di;
+			ip->triggered ^= di;          /* update triggered flag */
+			r = node_Boolean[result];      /* final value of condition pair */
+			UPREF(r);
+			REPLACE(r);
+			JUMPTO(pc->target_jmp);
+		}
+
+		case Op_exec_count:
+			if (do_profile)
+				pc->exec_count++;
+			break;
+
+		case Op_no_op:
+		case Op_K_do:
+		case Op_K_while:
+		case Op_K_for:
+		case Op_K_arrayfor:
+		case Op_K_switch:
+		case Op_K_default:
+		case Op_K_if:
+		case Op_K_else:
+		case Op_cond_exp:
+		case Op_comment:
+		case Op_parens:
+			break;
+
+		default:
+			fatal(_("Sorry, don't know how to interpret `%s'"), opcode2str(op));
+		}
+
+		JUMPTO(pc->nexti);
+
+/*	} forever */
+
+	/* not reached */
+	return 0;
+
+#undef mk_sub
+#undef JUMPTO
+}
diff --git a/gawk-5.0.1/io.c b/gawk-5.0.1/io.c
new file mode 100644
index 00000000000..c49d1281468
--- /dev/null
+++ b/gawk-5.0.1/io.c
@@ -0,0 +1,4457 @@
+/*
+ * io.c --- routines for dealing with input and output and records
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2018,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/* For OSF/1 to get struct sockaddr_storage */
+#if defined(__osf__) && !defined(_OSF_SOURCE)
+#define _OSF_SOURCE
+#endif
+
+#include "awk.h"
+
+#ifdef HAVE_SYS_PARAM_H
+#undef RE_DUP_MAX	/* avoid spurious conflict w/regex.h */
+#include <sys/param.h>
+#endif /* HAVE_SYS_PARAM_H */
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif /* HAVE_SYS_IOCTL_H */
+
+#ifndef O_ACCMODE
+#define O_ACCMODE	(O_RDONLY|O_WRONLY|O_RDWR)
+#endif
+
+#if ! defined(S_ISREG) && defined(S_IFREG)
+#define	S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
+#endif
+
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+#ifdef HAVE_STROPTS_H
+#include <stropts.h>
+#endif
+
+#ifdef HAVE_SOCKETS
+
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#else
+#include <socket.h>
+#endif /* HAVE_SYS_SOCKET_H */
+
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+
+#else /* ! HAVE_NETINET_IN_H */
+#include <in.h>
+#endif /* HAVE_NETINET_IN_H */
+
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif /* HAVE_NETDB_H */
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif	/* HAVE_SYS_SELECT_H */
+
+#ifndef HAVE_GETADDRINFO
+#include "missing_d/getaddrinfo.h"
+#endif
+
+#ifndef AI_ADDRCONFIG	/* not everyone has this symbol */
+#define AI_ADDRCONFIG 0
+#endif /* AI_ADDRCONFIG */
+
+#ifndef HAVE_SOCKADDR_STORAGE
+#define sockaddr_storage sockaddr	/* for older systems */
+#endif /* HAVE_SOCKADDR_STORAGE */
+
+#endif /* HAVE_SOCKETS */
+
+#ifndef AF_UNSPEC
+#define AF_UNSPEC 0
+#endif
+#ifndef AF_INET
+#define AF_INET 2
+#endif
+#ifndef AF_INET6
+#define AF_INET6 10
+#endif
+
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+
+#if defined(HAVE_POPEN_H)
+#include "popen.h"
+#endif
+
+#ifdef __EMX__
+#include <process.h>
+
+#if !defined(_S_IFDIR) && defined(S_IFDIR)
+#define _S_IFDIR	S_IFDIR
+#endif
+
+#if !defined(_S_IRWXU) && defined(S_IRWXU)
+#define _S_IRWXU	S_IRWXU
+#endif
+#endif
+
+#ifndef ENFILE
+#define ENFILE EMFILE
+#endif
+
+#if defined(__DJGPP__)
+#define closemaybesocket(fd)	close(fd)
+#endif
+
+#if defined(VMS)
+#include <ssdef.h>
+#ifndef SS$_EXBYTLM
+#define SS$_EXBYTLM 0x2a14  /* VMS 8.4 seen */
+#endif
+#include <rmsdef.h>
+#define closemaybesocket(fd)	close(fd)
+#endif
+
+#ifdef HAVE_SOCKETS
+
+#ifndef SHUT_RD
+# ifdef SD_RECEIVE
+#  define SHUT_RD	SD_RECEIVE
+# else
+#  define SHUT_RD	0
+# endif
+#endif
+
+#ifndef SHUT_WR
+# ifdef SD_SEND
+#  define SHUT_WR	SD_SEND
+# else
+#  define SHUT_WR	1
+# endif
+#endif
+
+#ifndef SHUT_RDWR
+# ifdef SD_BOTH
+#  define SHUT_RDWR	SD_BOTH
+# else
+#  define SHUT_RDWR	2
+# endif
+#endif
+
+/* MinGW defines non-trivial macros on pc/socket.h.  */
+#ifndef FD_TO_SOCKET
+# define FD_TO_SOCKET(fd)	(fd)
+# define closemaybesocket(fd)	close(fd)
+#endif
+
+#ifndef SOCKET_TO_FD
+# define SOCKET_TO_FD(s)	(s)
+# define SOCKET			int
+#endif
+
+#else /* HAVE_SOCKETS */
+
+#ifndef closemaybesocket
+# define closemaybesocket(fd)	close(fd)
+#endif
+
+#endif /* HAVE_SOCKETS */
+
+#ifndef HAVE_SETSID
+#define setsid()	/* nothing */
+#endif /* HAVE_SETSID */
+
+#if defined(_AIX)
+#undef TANDEM	/* AIX defines this in one of its header files */
+#endif
+
+#ifdef __DJGPP__
+#define PIPES_SIMULATED
+#endif
+
+#ifdef __MINGW32__
+# ifndef PIPES_SIMULATED
+#  define pipe(fds)	_pipe(fds, 0, O_NOINHERIT)
+# endif
+#endif
+
+#ifdef HAVE_MPFR
+/* increment NR or FNR */
+#define INCREMENT_REC(X)	(do_mpfr && X == (LONG_MAX - 1)) ? \
+				(mpz_add_ui(M##X, M##X, 1), X = 0) : X++
+#else
+#define INCREMENT_REC(X)	X++
+#endif
+
+/* Several macros to make the code a bit clearer. */
+#define at_eof(iop)     (((iop)->flag & IOP_AT_EOF) != 0)
+#define has_no_data(iop)        ((iop)->dataend == NULL)
+#define no_data_left(iop)	((iop)->off >= (iop)->dataend)
+#define buffer_has_all_data(iop) ((iop)->dataend - (iop)->off == (iop)->public.sbuf.st_size)
+
+/*
+ * The key point to the design is to split out the code that searches through
+ * a buffer looking for the record and the terminator into separate routines,
+ * with a higher-level routine doing the reading of data and buffer management.
+ * This makes the code easier to manage; the buffering code is the same
+ * independent of how we find a record.  Communication is via the return
+ * value:
+ */
+
+typedef enum recvalues {
+        REC_OK,         /* record and terminator found, recmatch struct filled in */
+        NOTERM,         /* no terminator found, give me more input data */
+        TERMATEND,      /* found terminator at end of buffer */
+        TERMNEAREND     /* found terminator close to end of buffer, for when
+			   the RE might be match more data further in
+			   the file. */
+} RECVALUE;
+
+/*
+ * Between calls to a scanning routine, the state is stored in
+ * an enum scanstate variable.  Not all states apply to all
+ * variants, but the higher code doesn't really care.
+ */
+
+typedef enum scanstate {
+        NOSTATE,        /* scanning not started yet (all) */
+        INLEADER,       /* skipping leading data (RS = "") */
+        INDATA,         /* in body of record (all) */
+        INTERM          /* scanning terminator (RS = "", RS = regexp) */
+} SCANSTATE;
+
+/*
+ * When a record is seen (REC_OK or TERMATEND), the following
+ * structure is filled in.
+ */
+
+struct recmatch {
+        char *start;    /* record start */
+        size_t len;     /* length of record */
+        char *rt_start; /* start of terminator */
+        size_t rt_len;  /* length of terminator */
+};
+
+
+static int iop_close(IOBUF *iop);
+static void close_one(void);
+static int close_redir(struct redirect *rp, bool exitwarn, two_way_close_type how);
+#ifndef PIPES_SIMULATED
+static int wait_any(int interesting);
+#endif
+static IOBUF *gawk_popen(const char *cmd, struct redirect *rp);
+static IOBUF *iop_alloc(int fd, const char *name, int errno_val);
+static IOBUF *iop_finish(IOBUF *iop);
+static int gawk_pclose(struct redirect *rp);
+static int str2mode(const char *mode);
+static int two_way_open(const char *str, struct redirect *rp, int extfd);
+static bool pty_vs_pipe(const char *command);
+static void find_input_parser(IOBUF *iop);
+static bool find_output_wrapper(awk_output_buf_t *outbuf);
+static void init_output_wrapper(awk_output_buf_t *outbuf);
+static bool find_two_way_processor(const char *name, struct redirect *rp);
+
+static RECVALUE rs1scan(IOBUF *iop, struct recmatch *recm, SCANSTATE *state);
+static RECVALUE rsnullscan(IOBUF *iop, struct recmatch *recm, SCANSTATE *state);
+static RECVALUE rsrescan(IOBUF *iop, struct recmatch *recm, SCANSTATE *state);
+
+static RECVALUE (*matchrec)(IOBUF *iop, struct recmatch *recm, SCANSTATE *state) = rs1scan;
+
+static int get_a_record(char **out, IOBUF *iop, int *errcode, const awk_fieldwidth_info_t **field_width);
+
+static void free_rp(struct redirect *rp);
+
+struct inet_socket_info {
+	int family;		/* AF_UNSPEC, AF_INET, or AF_INET6 */
+	int protocol;		/* SOCK_STREAM or SOCK_DGRAM */
+	/*
+	 * N.B. If we used 'char *' or 'const char *' pointers to the
+	 * substrings, it would trigger compiler warnings about the casts
+	 * in either inetfile() or devopen().  So we use offset/len to
+	 * avoid that.
+	 */
+	struct {
+		int offset;
+		int len;
+	} localport, remotehost, remoteport;
+};
+
+static bool inetfile(const char *str, size_t len, struct inet_socket_info *isn);
+
+static NODE *in_PROCINFO(const char *pidx1, const char *pidx2, NODE **full_idx);
+static long get_read_timeout(IOBUF *iop);
+static ssize_t read_with_timeout(int fd, char *buf, size_t size);
+
+static bool read_can_timeout = false;
+static long read_timeout;
+static long read_default_timeout;
+
+static struct redirect *red_head = NULL;
+static NODE *RS = NULL;
+static Regexp *RS_re[2];	/* index 0 - don't ignore case, index 1, do */
+static Regexp *RS_regexp;
+
+static const char nonfatal[] = "NONFATAL";
+
+bool RS_is_null;
+
+extern NODE *ARGC_node;
+extern NODE *ARGV_node;
+extern NODE *ARGIND_node;
+extern NODE **fields_arr;
+
+/* init_io --- set up timeout related variables */
+
+void
+init_io()
+{
+	long tmout;
+
+	/* Only MinGW has a non-trivial implementation of this.  */
+	init_sockets();
+
+	/*
+	 * N.B.: all these hacks are to minimize the effect
+	 * on programs that do not care about timeout.
+	 */
+
+	/* Parse the env. variable only once */
+	tmout = getenv_long("GAWK_READ_TIMEOUT");
+	if (tmout > 0) {
+		read_default_timeout = tmout;
+		read_can_timeout = true;
+	}
+
+	/*
+	 * PROCINFO entries for timeout are dynamic;
+	 * We can't be any more specific than this.
+	 */
+	if (PROCINFO_node != NULL)
+		read_can_timeout = true;
+}
+
+
+#if defined(__DJGPP__) || defined(__MINGW32__) || defined(__EMX__) || defined(__CYGWIN__)
+/* binmode --- convert BINMODE to string for fopen */
+
+static const char *
+binmode(const char *mode)
+{
+	switch (mode[0]) {
+	case 'r':
+		if ((BINMODE & BINMODE_INPUT) != 0)
+			mode = "rb";
+		break;
+	case 'w':
+	case 'a':
+		if ((BINMODE & BINMODE_OUTPUT) != 0)
+			mode = (mode[0] == 'w' ? "wb" : "ab");
+		break;
+	}
+	return mode;
+}
+#else
+#define binmode(mode)	(mode)
+#endif
+
+#ifdef VMS
+/* File pointers have an extra level of indirection, and there are cases where
+   `stdin' can be null.  That can crash gawk if fileno() is used as-is.  */
+static int vmsrtl_fileno(FILE *);
+static int vmsrtl_fileno(fp) FILE *fp; { return fileno(fp); }
+#undef fileno
+#define fileno(FP) (((FP) && *(FP)) ? vmsrtl_fileno(FP) : -1)
+#endif	/* VMS */
+
+/* after_beginfile --- reset necessary state after BEGINFILE has run */
+
+void
+after_beginfile(IOBUF **curfile)
+{
+	IOBUF *iop;
+
+	iop = *curfile;
+	assert(iop != NULL);
+
+	/*
+	 * Input parsers could have been changed by BEGINFILE,
+	 * so delay check until now.
+	 */
+
+	find_input_parser(iop);
+
+	if (! iop->valid) {
+		const char *fname;
+		int errcode;
+		bool valid;
+
+		fname = iop->public.name;
+		errcode = iop->errcode;
+		valid = iop->valid;
+		errno = 0;
+		update_ERRNO_int(errcode);
+		iop_close(iop);
+		*curfile = NULL;
+		if (! valid && errcode == EISDIR && ! do_traditional) {
+			warning(_("command line argument `%s' is a directory: skipped"), fname);
+			return;		/* read next file */
+		}
+		fatal(_("cannot open file `%s' for reading (%s)"),
+				fname, strerror(errcode));
+	}
+}
+
+/* nextfile --- move to the next input data file */
+/*
+ * Return value > 0 ----> run BEGINFILE block
+ * *curfile = NULL  ----> hit EOF, run ENDFILE block
+ */
+
+int
+nextfile(IOBUF **curfile, bool skipping)
+{
+	static long i = 1;
+	static bool files = false;
+	NODE *arg, *tmp;
+	const char *fname;
+	int fd = INVALID_HANDLE;
+	int errcode = 0;
+	IOBUF *iop = *curfile;
+	long argc;
+
+	if (skipping) {			/* for 'nextfile' call */
+		errcode = 0;
+		if (iop != NULL) {
+			errcode = iop->errcode;
+			(void) iop_close(iop);
+		}
+		*curfile = NULL;
+		return (errcode == 0);
+	}
+
+	if (iop != NULL) {
+		if (at_eof(iop)) {
+			assert(iop->public.fd != INVALID_HANDLE);
+			(void) iop_close(iop);
+			*curfile = NULL;
+			return 1;	/* run endfile block */
+		} else
+			return 0;
+	}
+
+	argc = get_number_si(ARGC_node->var_value);
+
+	for (; i < argc; i++) {
+		tmp = make_number((AWKNUM) i);
+		(void) force_string(tmp);
+		arg = in_array(ARGV_node, tmp);
+		unref(tmp);
+		if (arg == NULL || arg->stlen == 0)
+			continue;
+		arg = force_string(arg);
+		if (! do_traditional) {
+			unref(ARGIND_node->var_value);
+			ARGIND_node->var_value = make_number((AWKNUM) i);
+		}
+
+		if (! arg_assign(arg->stptr, false)) {
+			files = true;
+			fname = arg->stptr;
+
+			/* manage the awk variables: */
+			unref(FILENAME_node->var_value);
+			FILENAME_node->var_value = dupnode(arg);
+#ifdef HAVE_MPFR
+			if (is_mpg_number(FNR_node->var_value))
+				mpz_set_ui(MFNR, 0);
+#endif
+			FNR = 0;
+
+			/* IOBUF management: */
+			errno = 0;
+			fd = devopen(fname, binmode("r"));
+			if (fd == INVALID_HANDLE && errno == EMFILE) {
+				close_one();
+				close_one();
+				fd = devopen(fname, binmode("r"));
+			}
+			errcode = errno;
+			if (! do_traditional)
+				update_ERRNO_int(errno);
+			iop = iop_alloc(fd, fname, errcode);
+			*curfile = iop_finish(iop);
+			if (iop->public.fd == INVALID_HANDLE)
+				iop->errcode = errcode;
+			else if (iop->valid)
+				iop->errcode = 0;
+
+			if (! do_traditional && iop->errcode != 0)
+				update_ERRNO_int(iop->errcode);
+
+			return ++i;	/* run beginfile block */
+		}
+	}
+
+	if (files == false) {
+		files = true;
+		/* no args. -- use stdin */
+		/* FNR is init'ed to 0 */
+		errno = 0;
+		if (! do_traditional)
+			update_ERRNO_int(errno);
+
+		unref(FILENAME_node->var_value);
+		FILENAME_node->var_value = make_string("-", 1);
+		FILENAME_node->var_value->flags |= USER_INPUT; /* be pedantic */
+		fname = "-";
+		iop = iop_alloc(fileno(stdin), fname, 0);
+		*curfile = iop_finish(iop);
+
+		if (iop->public.fd == INVALID_HANDLE) {
+			errcode = errno;
+			errno = 0;
+			update_ERRNO_int(errno);
+			(void) iop_close(iop);
+			*curfile = NULL;
+			fatal(_("cannot open file `%s' for reading (%s)"),
+					fname, strerror(errcode));
+		}
+		return ++i;	/* run beginfile block */
+	}
+
+	return -1;	/* end of input, run end block or Op_atexit */
+}
+
+/* set_FNR --- update internal FNR from awk variable */
+
+void
+set_FNR()
+{
+	NODE *n = FNR_node->var_value;
+	(void) force_number(n);
+#ifdef HAVE_MPFR
+	if (is_mpg_number(n))
+		FNR = mpg_set_var(FNR_node);
+	else
+#endif
+	FNR = get_number_si(n);
+}
+
+/* set_NR --- update internal NR from awk variable */
+
+void
+set_NR()
+{
+	NODE *n = NR_node->var_value;
+	(void) force_number(n);
+#ifdef HAVE_MPFR
+	if (is_mpg_number(n))
+		NR = mpg_set_var(NR_node);
+	else
+#endif
+	NR = get_number_si(n);
+}
+
+/* inrec --- This reads in a record from the input file */
+
+bool
+inrec(IOBUF *iop, int *errcode)
+{
+	char *begin;
+	int cnt;
+	bool retval = true;
+	const awk_fieldwidth_info_t *field_width = NULL;
+
+	if (at_eof(iop) && no_data_left(iop))
+		cnt = EOF;
+	else if ((iop->flag & IOP_CLOSED) != 0)
+		cnt = EOF;
+	else
+		cnt = get_a_record(& begin, iop, errcode, & field_width);
+
+	/* Note that get_a_record may return -2 when I/O would block */
+	if (cnt < 0) {
+		retval = false;
+	} else {
+		INCREMENT_REC(NR);
+		INCREMENT_REC(FNR);
+		set_record(begin, cnt, field_width);
+		if (*errcode > 0)
+			retval = false;
+	}
+
+	return retval;
+}
+
+/* remap_std_file --- reopen a standard descriptor on /dev/null */
+
+static int
+remap_std_file(int oldfd)
+{
+	int newfd;
+	int ret = -1;
+
+	/*
+	 * Give OS-specific routines in gawkmisc.c a chance to interpret
+	 * "/dev/null" as appropriate for their platforms.
+	 */
+	newfd = os_devopen("/dev/null", O_RDWR);
+	if (newfd == INVALID_HANDLE)
+		newfd = open("/dev/null", O_RDWR);
+	if (newfd >= 0) {
+		/* if oldfd is open, dup2() will close oldfd for us first. */
+		ret = dup2(newfd, oldfd);
+		if (ret == 0)
+			close(newfd);
+	} else
+		ret = 0;
+
+	return ret;
+}
+
+/* iop_close --- close an open IOP */
+
+static int
+iop_close(IOBUF *iop)
+{
+	int ret = 0;
+
+	if (iop == NULL)
+		return 0;
+
+	errno = 0;
+
+	iop->flag &= ~IOP_AT_EOF;
+	iop->flag |= IOP_CLOSED;	/* there may be dangling pointers */
+	iop->dataend = NULL;
+	/*
+	 * Closing standard files can cause crufty code elsewhere to lose.
+	 * So we remap the standard file to /dev/null.
+	 * Thanks to Jim Meyering for the suggestion.
+	 */
+	if (iop->public.close_func != NULL)
+		iop->public.close_func(&iop->public);
+
+	if (iop->public.fd != INVALID_HANDLE) {
+		if (iop->public.fd == fileno(stdin)
+		    || iop->public.fd == fileno(stdout)
+		    || iop->public.fd == fileno(stderr))
+			ret = remap_std_file(iop->public.fd);
+		else
+			ret = closemaybesocket(iop->public.fd);
+	}
+
+	if (ret == -1)
+		warning(_("close of fd %d (`%s') failed (%s)"), iop->public.fd,
+				iop->public.name, strerror(errno));
+	/*
+	 * Be careful -- $0 may still reference the buffer even though
+	 * an explicit close is being done; in the future, maybe we
+	 * can do this a bit better.
+	 */
+	if (iop->buf) {
+		if ((fields_arr[0]->stptr >= iop->buf)
+		    && (fields_arr[0]->stptr < (iop->buf + iop->size))) {
+			NODE *t;
+
+			t = make_string(fields_arr[0]->stptr,
+					fields_arr[0]->stlen);
+			unref(fields_arr[0]);
+			fields_arr[0] = t;
+			/*
+			 * This used to be here:
+			 *
+			 * reset_record();
+			 *
+			 * Don't do that; reset_record() throws away all fields,
+			 * saves FS etc.  We just need to make sure memory isn't
+			 * corrupted and that references to $0 and fields work.
+			 */
+		}
+		efree(iop->buf);
+		iop->buf = NULL;
+	}
+	efree(iop);
+	return ret == -1 ? 1 : 0;
+}
+
+/* redflags2str --- turn redirection flags into a string, for debugging */
+
+const char *
+redflags2str(int flags)
+{
+	static const struct flagtab redtab[] = {
+		{ RED_FILE,	"RED_FILE" },
+		{ RED_PIPE,	"RED_PIPE" },
+		{ RED_READ,	"RED_READ" },
+		{ RED_WRITE,	"RED_WRITE" },
+		{ RED_APPEND,	"RED_APPEND" },
+		{ RED_NOBUF,	"RED_NOBUF" },
+		{ RED_EOF,	"RED_EOF" },
+		{ RED_TWOWAY,	"RED_TWOWAY" },
+		{ RED_PTY,	"RED_PTY" },
+		{ RED_SOCKET,	"RED_SOCKET" },
+		{ RED_TCP,	"RED_TCP" },
+		{ 0, NULL }
+	};
+
+	return genflags2str(flags, redtab);
+}
+
+/* redirect_string --- Redirection for printf and print commands, use string info */
+
+struct redirect *
+redirect_string(const char *str, size_t explen, bool not_string,
+		int redirtype, int *errflg, int extfd, bool failure_fatal)
+{
+	struct redirect *rp;
+	int tflag = 0;
+	int outflag = 0;
+	const char *direction = "to";
+	const char *mode;
+	int fd;
+	const char *what = NULL;
+	bool new_rp = false;
+#ifdef HAVE_SOCKETS
+	struct inet_socket_info isi;
+#endif
+	static struct redirect *save_rp = NULL;	/* hold onto rp that should
+	                                         * be freed for reuse
+	                                         */
+
+	if (do_sandbox)
+		fatal(_("redirection not allowed in sandbox mode"));
+
+	switch (redirtype) {
+	case redirect_append:
+		tflag = RED_APPEND;
+		/* FALL THROUGH */
+	case redirect_output:
+		outflag = (RED_FILE|RED_WRITE);
+		tflag |= outflag;
+		if (redirtype == redirect_output)
+			what = ">";
+		else
+			what = ">>";
+		break;
+	case redirect_pipe:
+		tflag = (RED_PIPE|RED_WRITE);
+		what = "|";
+		break;
+	case redirect_pipein:
+		tflag = (RED_PIPE|RED_READ);
+		what = "|";
+		break;
+	case redirect_input:
+		tflag = (RED_FILE|RED_READ);
+		what = "<";
+		break;
+	case redirect_twoway:
+		tflag = (RED_READ|RED_WRITE|RED_TWOWAY);
+		what = "|&";
+		break;
+	default:
+		cant_happen();
+	}
+	if (do_lint && not_string)
+		lintwarn(_("expression in `%s' redirection is a number"),
+			what);
+
+	if (explen < 1 || str == NULL || *str == '\0')
+		fatal(_("expression for `%s' redirection has null string value"),
+			what);
+
+	if (do_lint && (strncmp(str, "0", explen) == 0
+			|| strncmp(str, "1", explen) == 0))
+		lintwarn(_("filename `%.*s' for `%s' redirection may be result of logical expression"),
+				(int) explen, str, what);
+
+#ifdef HAVE_SOCKETS
+	/*
+	 * Use /inet4 to force IPv4, /inet6 to force IPv6, and plain
+	 * /inet will be whatever we get back from the system.
+	 */
+	if (inetfile(str, explen, & isi)) {
+		tflag |= RED_SOCKET;
+		if (isi.protocol == SOCK_STREAM)
+			tflag |= RED_TCP;	/* use shutdown when closing */
+	}
+#endif /* HAVE_SOCKETS */
+
+	for (rp = red_head; rp != NULL; rp = rp->next) {
+#ifndef PIPES_SIMULATED
+		/*
+		 * This is an efficiency hack.  We want to
+		 * recover the process slot for dead children,
+		 * if at all possible.  Messing with signal() for
+		 * SIGCLD leads to lots of headaches.  However, if
+		 * we've gotten EOF from a child input pipeline, it's
+		 * a good bet that the child has died. So recover it.
+		 */
+		if ((rp->flag & RED_EOF) != 0 && redirtype == redirect_pipein) {
+			if (rp->pid != -1)
+#ifdef __MINGW32__
+				/* MinGW cannot wait for any process.  */
+				wait_any(rp->pid);
+#else
+				wait_any(0);
+#endif
+		}
+#endif /* PIPES_SIMULATED */
+
+		/* now check for a match */
+		if (strlen(rp->value) == explen
+		    && memcmp(rp->value, str, explen) == 0
+		    && ((rp->flag & ~(RED_NOBUF|RED_EOF|RED_PTY)) == tflag
+			|| (outflag != 0
+			    && (rp->flag & (RED_FILE|RED_WRITE)) == outflag))) {
+
+			int rpflag = (rp->flag & ~(RED_NOBUF|RED_EOF|RED_PTY));
+			int newflag = (tflag & ~(RED_NOBUF|RED_EOF|RED_PTY));
+
+			if (do_lint && rpflag != newflag)
+				lintwarn(
+		_("unnecessary mixing of `>' and `>>' for file `%.*s'"),
+					(int) explen, rp->value);
+
+			break;
+		}
+	}
+
+	if (rp == NULL) {
+		char *newstr;
+		new_rp = true;
+		if (save_rp != NULL) {
+			rp = save_rp;
+			efree(rp->value);
+		} else
+			emalloc(rp, struct redirect *, sizeof(struct redirect), "redirect");
+		emalloc(newstr, char *, explen + 1, "redirect");
+		memcpy(newstr, str, explen);
+		newstr[explen] = '\0';
+		str = newstr;
+		rp->value = newstr;
+		rp->flag = tflag;
+		init_output_wrapper(& rp->output);
+		rp->output.name = str;
+		rp->iop = NULL;
+		rp->pid = -1;
+		rp->status = 0;
+	} else
+		str = rp->value;	/* get \0 terminated string */
+	save_rp = rp;
+
+	while (rp->output.fp == NULL && rp->iop == NULL) {
+		if (! new_rp && (rp->flag & RED_EOF) != 0) {
+			/*
+			 * Encountered EOF on file or pipe -- must be cleared
+			 * by explicit close() before reading more
+			 */
+			save_rp = NULL;
+			return rp;
+		}
+		mode = NULL;
+		errno = 0;
+		switch (redirtype) {
+		case redirect_output:
+			mode = binmode("w");
+			if ((rp->flag & RED_USED) != 0)
+				mode = (rp->mode[1] == 'b') ? "ab" : "a";
+			break;
+		case redirect_append:
+			mode = binmode("a");
+			break;
+		case redirect_pipe:
+			if (extfd >= 0) {
+				warning(_("get_file cannot create pipe `%s' with fd %d"), str, extfd);
+				return NULL;
+			}
+			/* synchronize output before new pipe */
+			(void) flush_io();
+
+			os_restore_mode(fileno(stdin));
+			set_sigpipe_to_default();
+			/*
+			 * Don't check failure_fatal; see input pipe below.
+			 * Note that the failure happens upon failure to fork,
+			 * using a non-existant program will still succeed the
+			 * popen().
+			 */
+			if ((rp->output.fp = popen(str, binmode("w"))) == NULL)
+				fatal(_("can't open pipe `%s' for output (%s)"),
+						str, strerror(errno));
+			ignore_sigpipe();
+
+			/* set close-on-exec */
+			os_close_on_exec(fileno(rp->output.fp), str, "pipe", "to");
+			rp->flag |= RED_NOBUF;
+			break;
+		case redirect_pipein:
+			if (extfd >= 0) {
+				warning(_("get_file cannot create pipe `%s' with fd %d"), str, extfd);
+				return NULL;
+			}
+			direction = "from";
+			if (gawk_popen(str, rp) == NULL)
+				fatal(_("can't open pipe `%s' for input (%s)"),
+					str, strerror(errno));
+			break;
+		case redirect_input:
+			direction = "from";
+			fd = (extfd >= 0) ? extfd : devopen(str, binmode("r"));
+			if (fd == INVALID_HANDLE && errno == EISDIR) {
+				*errflg = EISDIR;
+				/* do not free rp, saving it for reuse (save_rp = rp) */
+				return NULL;
+			}
+			rp->iop = iop_alloc(fd, str, errno);
+			find_input_parser(rp->iop);
+			iop_finish(rp->iop);
+			if (! rp->iop->valid) {
+				if (! do_traditional && rp->iop->errcode != 0)
+					update_ERRNO_int(rp->iop->errcode);
+				iop_close(rp->iop);
+				rp->iop = NULL;
+			}
+			break;
+		case redirect_twoway:
+#ifndef HAVE_SOCKETS
+			if (extfd >= 0) {
+				warning(_("get_file socket creation not supported on this platform for `%s' with fd %d"), str, extfd);
+				return NULL;
+			}
+#endif
+			direction = "to/from";
+			if (! two_way_open(str, rp, extfd)) {
+				if (! failure_fatal || is_non_fatal_redirect(str, explen)) {
+					*errflg = errno;
+					/* do not free rp, saving it for reuse (save_rp = rp) */
+					return NULL;
+				} else
+					fatal(_("can't open two way pipe `%s' for input/output (%s)"),
+							str, strerror(errno));
+			}
+			break;
+		default:
+			cant_happen();
+		}
+
+		if (mode != NULL) {
+			errno = 0;
+			rp->output.mode = mode;
+			fd = (extfd >= 0) ? extfd : devopen(str, mode);
+
+			if (fd > INVALID_HANDLE) {
+				if (fd == fileno(stdin))
+					rp->output.fp = stdin;
+				else if (fd == fileno(stdout))
+					rp->output.fp = stdout;
+				else if (fd == fileno(stderr))
+					rp->output.fp = stderr;
+				else {
+					const char *omode = mode;
+#if defined(F_GETFL) && defined(O_APPEND)
+					int fd_flags;
+
+					fd_flags = fcntl(fd, F_GETFL);
+					if (fd_flags != -1 && (fd_flags & O_APPEND) == O_APPEND)
+						omode = binmode("a");
+#endif
+					os_close_on_exec(fd, str, "file", "");
+					rp->output.fp = fdopen(fd, (const char *) omode);
+					rp->mode = (const char *) mode;
+					/* don't leak file descriptors */
+					if (rp->output.fp == NULL)
+						close(fd);
+				}
+				if (rp->output.fp != NULL && os_isatty(fd))
+					rp->flag |= RED_NOBUF;
+
+				/* Move rp to the head of the list. */
+				if (! new_rp && red_head != rp) {
+					if ((rp->prev->next = rp->next) != NULL)
+						rp->next->prev = rp->prev;
+					red_head->prev = rp;
+					rp->prev = NULL;
+					rp->next = red_head;
+					red_head = rp;
+				}
+			}
+			find_output_wrapper(& rp->output);
+		}
+
+		if (rp->output.fp == NULL && rp->iop == NULL) {
+			/* too many files open -- close one and try again */
+			if (errno == EMFILE || errno == ENFILE)
+				close_one();
+#ifdef VMS
+			/* Alpha/VMS V7.1+ C RTL is returning these instead
+			   of EMFILE (haven't tried other post-V6.2 systems) */
+			else if ((errno == EIO || errno == EVMSERR) &&
+                                 (vaxc$errno == SS$_EXQUOTA ||
+                                  vaxc$errno == SS$_EXBYTLM ||
+                                  vaxc$errno == RMS$_ACC ||
+				  vaxc$errno == RMS$_SYN)) {
+				close_one();
+				close_one();
+			}
+#endif
+			else {
+				/*
+				 * Some other reason for failure.
+				 *
+				 * On redirection of input from a file,
+				 * just return an error, so e.g. getline
+				 * can return -1.  For output to file,
+				 * complain. The shell will complain on
+				 * a bad command to a pipe.
+				 *
+				 * 12/2014: Take nonfatal settings in PROCINFO into account.
+				 */
+				if (errflg != NULL)
+					*errflg = errno;
+				if (failure_fatal && ! is_non_fatal_redirect(str, explen) &&
+				    (redirtype == redirect_output
+				     || redirtype == redirect_append)) {
+					/* multiple messages make life easier for translators */
+					if (*direction == 'f')
+						fatal(_("can't redirect from `%s' (%s)"),
+					    		str, strerror(errno));
+					else
+						fatal(_("can't redirect to `%s' (%s)"),
+							str, strerror(errno));
+				} else {
+					/* do not free rp, saving it for reuse (save_rp = rp) */
+					return NULL;
+				}
+			}
+		}
+	}
+
+	if (new_rp) {
+		/*
+		 * It opened successfully, hook it into the list.
+		 * Maintain the list in most-recently-used first order.
+		 */
+		if (red_head != NULL)
+			red_head->prev = rp;
+		rp->prev = NULL;
+		rp->next = red_head;
+		red_head = rp;
+	}
+	save_rp = NULL;
+	return rp;
+}
+
+/* redirect --- Redirection for printf and print commands */
+
+struct redirect *
+redirect(NODE *redir_exp, int redirtype, int *errflg, bool failure_fatal)
+{
+	bool not_string = ((fixtype(redir_exp)->flags & STRING) == 0);
+
+	redir_exp = force_string(redir_exp);
+	return redirect_string(redir_exp->stptr, redir_exp->stlen, not_string,
+				redirtype, errflg, -1, failure_fatal);
+}
+
+/* getredirect --- find the struct redirect for this file or pipe */
+
+struct redirect *
+getredirect(const char *str, int len)
+{
+	struct redirect *rp;
+
+	for (rp = red_head; rp != NULL; rp = rp->next)
+		if (strlen(rp->value) == len && memcmp(rp->value, str, len) == 0)
+			return rp;
+
+	return NULL;
+}
+
+/* is_non_fatal_std --- return true if fp is stdout/stderr and nonfatal */
+
+bool
+is_non_fatal_std(FILE *fp)
+{
+	if (in_PROCINFO(nonfatal, NULL, NULL))
+		return true;
+
+	/* yucky logic. sigh. */
+	if (fp == stdout) {
+		return (   in_PROCINFO("-", nonfatal, NULL) != NULL
+		        || in_PROCINFO("/dev/stdout", nonfatal, NULL) != NULL);
+	} else if (fp == stderr) {
+		return (in_PROCINFO("/dev/stderr", nonfatal, NULL) != NULL);
+	}
+
+	return false;
+}
+
+/* is_non_fatal_redirect --- return true if redirected I/O should be nonfatal */
+
+bool
+is_non_fatal_redirect(const char *str, size_t len)
+{
+	bool ret;
+	char save;
+	char *s = (char *) str;
+
+	save = s[len];
+	s[len] = '\0';
+
+	ret = in_PROCINFO(nonfatal, NULL, NULL) != NULL
+	       || in_PROCINFO(s, nonfatal, NULL) != NULL;
+
+	s[len] = save;
+
+	return ret;
+}
+
+/* close_one --- temporarily close an open file to re-use the fd */
+
+static void
+close_one()
+{
+	struct redirect *rp;
+	struct redirect *rplast = NULL;
+
+	static bool warned = false;
+
+	if (do_lint && ! warned) {
+		warned = true;
+		lintwarn(_("reached system limit for open files: starting to multiplex file descriptors"));
+	}
+
+	/* go to end of list first, to pick up least recently used entry */
+	for (rp = red_head; rp != NULL; rp = rp->next)
+		rplast = rp;
+	/* now work back up through the list */
+	for (rp = rplast; rp != NULL; rp = rp->prev) {
+		/* don't close standard files! */
+		if (rp->output.fp == NULL || rp->output.fp == stderr || rp->output.fp == stdout)
+			continue;
+
+		if ((rp->flag & (RED_FILE|RED_WRITE)) == (RED_FILE|RED_WRITE)) {
+			rp->flag |= RED_USED;
+			errno = 0;
+			if (rp->output.gawk_fclose(rp->output.fp, rp->output.opaque) != 0)
+				warning(_("close of `%s' failed (%s)."),
+					rp->value, strerror(errno));
+			rp->output.fp = NULL;
+			break;
+		}
+	}
+	if (rp == NULL)
+		/* surely this is the only reason ??? */
+		fatal(_("too many pipes or input files open"));
+}
+
+/* do_close --- completely close an open file or pipe */
+
+NODE *
+do_close(int nargs)
+{
+	NODE *tmp, *tmp2;
+	struct redirect *rp;
+	two_way_close_type how = CLOSE_ALL;	/* default */
+
+	if (nargs == 2) {
+		/* 2nd arg if present: "to" or "from" for two-way pipe */
+		/* DO NOT use _() on the strings here! */
+		char save;
+
+		tmp2 = POP_STRING();
+		save = tmp2->stptr[tmp2->stlen];
+		tmp2->stptr[tmp2->stlen] = '\0';
+		if (strcasecmp(tmp2->stptr, "to") == 0)
+			how = CLOSE_TO;
+		else if (strcasecmp(tmp2->stptr, "from") == 0)
+			how = CLOSE_FROM;
+		else {
+			DEREF(tmp2);
+			fatal(_("close: second argument must be `to' or `from'"));
+		}
+		tmp2->stptr[tmp2->stlen] = save;
+		DEREF(tmp2);
+	}
+
+	tmp = POP_STRING(); 	/* 1st arg: redir to close */
+
+	for (rp = red_head; rp != NULL; rp = rp->next) {
+		if (strlen(rp->value) == tmp->stlen
+		    && memcmp(rp->value, tmp->stptr, tmp->stlen) == 0)
+			break;
+	}
+
+	if (rp == NULL) {	/* no match, return -1 */
+		char *cp;
+
+		if (do_lint)
+			lintwarn(_("close: `%.*s' is not an open file, pipe or co-process"),
+				(int) tmp->stlen, tmp->stptr);
+
+		if (! do_traditional) {
+			/* update ERRNO manually, using errno = ENOENT is a stretch. */
+			cp = _("close of redirection that was never opened");
+			update_ERRNO_string(cp);
+		}
+
+		DEREF(tmp);
+		return make_number((AWKNUM) -1.0);
+	}
+	DEREF(tmp);
+	fflush(stdout);	/* synchronize regular output */
+	tmp = make_number((AWKNUM) close_redir(rp, false, how));
+	rp = NULL;
+	/*
+	 * POSIX says close() returns 0 on success, non-zero otherwise.
+	 * For POSIX, at this point we just return 0.  Otherwise we
+	 * return the exit status of the process or of pclose(), depending.
+	 * Down in the call tree of close_redir(), we rationalize the
+	 * value like we do for system().
+	 */
+	if (do_posix) {
+		unref(tmp);
+		tmp = make_number((AWKNUM) 0);
+	}
+	return tmp;
+}
+
+/* close_rp --- separate function to just do closing */
+
+int
+close_rp(struct redirect *rp, two_way_close_type how)
+{
+	int status = 0;
+
+	errno = 0;
+	if ((rp->flag & RED_TWOWAY) != 0) {	/* two-way pipe */
+		/* write end: */
+		if ((how == CLOSE_ALL || how == CLOSE_TO) && rp->output.fp != NULL) {
+#ifdef HAVE_SOCKETS
+			if ((rp->flag & RED_TCP) != 0)
+				(void) shutdown(fileno(rp->output.fp), SHUT_WR);
+#endif /* HAVE_SOCKETS */
+
+			if ((rp->flag & RED_PTY) != 0) {
+				rp->output.gawk_fwrite("\004\n", sizeof("\004\n") - 1, 1, rp->output.fp, rp->output.opaque);
+				rp->output.gawk_fflush(rp->output.fp, rp->output.opaque);
+			}
+			status = rp->output.gawk_fclose(rp->output.fp, rp->output.opaque);
+			rp->output.fp = NULL;
+		}
+
+		/* read end: */
+		if (how == CLOSE_ALL || how == CLOSE_FROM) {
+			if ((rp->flag & RED_SOCKET) != 0 && rp->iop != NULL) {
+#ifdef HAVE_SOCKETS
+				if ((rp->flag & RED_TCP) != 0)
+					(void) shutdown(rp->iop->public.fd, SHUT_RD);
+#endif /* HAVE_SOCKETS */
+				(void) iop_close(rp->iop);
+			} else
+				/* status already sanitized */
+				status = gawk_pclose(rp);
+
+			rp->iop = NULL;
+		}
+	} else if ((rp->flag & (RED_PIPE|RED_WRITE)) == (RED_PIPE|RED_WRITE)) {
+		/* write to pipe */
+		status = sanitize_exit_status(pclose(rp->output.fp));
+		if ((BINMODE & BINMODE_INPUT) != 0)
+			os_setbinmode(fileno(stdin), O_BINARY);
+
+		rp->output.fp = NULL;
+	} else if (rp->output.fp != NULL) {	/* write to file */
+		status = rp->output.gawk_fclose(rp->output.fp, rp->output.opaque);
+		rp->output.fp = NULL;
+	} else if (rp->iop != NULL) {	/* read from pipe/file */
+		if ((rp->flag & RED_PIPE) != 0)		/* read from pipe */
+			status = gawk_pclose(rp);
+			/* gawk_pclose sets rp->iop to null */
+		else {					/* read from file */
+			status = iop_close(rp->iop);
+			rp->iop = NULL;
+		}
+	}
+
+	return status;
+}
+
+/* close_redir --- close an open file or pipe */
+
+static int
+close_redir(struct redirect *rp, bool exitwarn, two_way_close_type how)
+{
+	int status = 0;
+
+	if (rp == NULL)
+		return 0;
+	if (rp->output.fp == stdout || rp->output.fp == stderr)
+		goto checkwarn;		/* bypass closing, remove from list */
+
+	if (do_lint && (rp->flag & RED_TWOWAY) == 0 && how != CLOSE_ALL)
+		lintwarn(_("close: redirection `%s' not opened with `|&', second argument ignored"),
+				rp->value);
+
+	status = close_rp(rp, how);
+
+	if (status != 0) {
+		int save_errno = errno;
+		char *s = strerror(save_errno);
+
+		/*
+		 * BWK's awk, as far back as SVR4 (1989) would check
+		 * and warn about the status of close.  However, when
+		 * we did this we got too many complaints, so we moved
+		 * it to be under lint control.
+		 */
+		if (do_lint) {
+			if ((rp->flag & RED_PIPE) != 0)
+				lintwarn(_("failure status (%d) on pipe close of `%s' (%s)"),
+					 status, rp->value, s);
+			else
+				lintwarn(_("failure status (%d) on file close of `%s' (%s)"),
+					 status, rp->value, s);
+		}
+
+		if (! do_traditional) {
+			/* set ERRNO too so that program can get at it */
+			update_ERRNO_int(save_errno);
+		}
+	}
+
+checkwarn:
+	if (exitwarn) {
+		/*
+		 * Don't use lintwarn() here.  If lint warnings are fatal,
+		 * doing so prevents us from closing other open redirections.
+		 *
+		 * Using multiple full messages instead of string parameters
+		 * for the types makes message translation easier.
+		 */
+		if ((rp->flag & RED_SOCKET) != 0)
+			warning(_("no explicit close of socket `%s' provided"),
+				rp->value);
+		else if ((rp->flag & RED_TWOWAY) != 0)
+			warning(_("no explicit close of co-process `%s' provided"),
+				rp->value);
+		else if ((rp->flag & RED_PIPE) != 0)
+			warning(_("no explicit close of pipe `%s' provided"),
+				rp->value);
+		else
+			warning(_("no explicit close of file `%s' provided"),
+				rp->value);
+	}
+
+	/* remove it from the list if closing both or both ends have been closed */
+	if (how == CLOSE_ALL || (rp->iop == NULL && rp->output.fp == NULL)) {
+		if (rp->next != NULL)
+			rp->next->prev = rp->prev;
+		if (rp->prev != NULL)
+			rp->prev->next = rp->next;
+		else
+			red_head = rp->next;
+		free_rp(rp);
+	}
+
+	return status;
+}
+
+/* non_fatal_flush_std_file --- flush a standard output file allowing for nonfatal setting */
+
+bool
+non_fatal_flush_std_file(FILE *fp)
+{
+	int status = fflush(fp);
+
+	if (status != 0) {
+		bool is_fatal = ! is_non_fatal_std(fp);
+
+		if (is_fatal) {
+#ifdef __MINGW32__
+			if (errno == 0 || errno == EINVAL)
+				w32_maybe_set_errno();
+#endif
+			if (errno == EPIPE)
+				die_via_sigpipe();
+			else
+				fatal(fp == stdout
+					? _("fflush: cannot flush standard output: %s")
+					: _("fflush: cannot flush standard error: %s"),
+						strerror(errno));
+		} else {
+			update_ERRNO_int(errno);
+			warning(fp == stdout
+				? _("error writing standard output (%s)")
+				: _("error writing standard error (%s)"),
+					strerror(errno));
+		}
+		return false;
+	}
+
+	return true;
+}
+
+/* flush_io --- flush all open output files */
+
+int
+flush_io()
+{
+	struct redirect *rp;
+	int status = 0;
+
+	errno = 0;
+	if (! non_fatal_flush_std_file(stdout))	// ERRNO updated
+		status++;
+
+	errno = 0;
+	if (! non_fatal_flush_std_file(stderr))	// ERRNO updated
+		status++;
+
+
+	// now for all open redirections
+	for (rp = red_head; rp != NULL; rp = rp->next) {
+		void (*messagefunc)(const char *mesg, ...) = r_fatal;
+
+		/* flush both files and pipes, what the heck */
+		if ((rp->flag & RED_WRITE) != 0 && rp->output.fp != NULL) {
+			if (rp->output.gawk_fflush(rp->output.fp, rp->output.opaque) != 0) {
+				update_ERRNO_int(errno);
+
+				if (is_non_fatal_redirect(rp->value, strlen(rp->value)))
+					messagefunc = r_warning;
+
+				if ((rp->flag & RED_PIPE) != 0)
+					messagefunc(_("pipe flush of `%s' failed (%s)."),
+						rp->value, strerror(errno));
+				else if ((rp->flag & RED_TWOWAY) != 0)
+					messagefunc(_("co-process flush of pipe to `%s' failed (%s)."),
+						rp->value, strerror(errno));
+				else
+					messagefunc(_("file flush of `%s' failed (%s)."),
+						rp->value, strerror(errno));
+				status++;
+			}
+		}
+	}
+	if (status != 0)
+		status = -1;	/* canonicalize it */
+	return status;
+}
+
+/* close_io --- close all open files, called when exiting */
+
+int
+close_io(bool *stdio_problem, bool *got_EPIPE)
+{
+	struct redirect *rp;
+	struct redirect *next;
+	int status = 0;
+
+	*stdio_problem = *got_EPIPE = false;
+	errno = 0;
+	for (rp = red_head; rp != NULL; rp = next) {
+		next = rp->next;
+		/*
+		 * close_redir() will print a message if needed.
+		 * if do_lint, warn about lack of explicit close
+		 */
+		if (close_redir(rp, do_lint, CLOSE_ALL))
+			status++;
+		rp = NULL;
+	}
+	/*
+	 * Some of the non-Unix os's have problems doing an fclose()
+	 * on stdout and stderr.  Since we don't really need to close
+	 * them, we just flush them, and do that across the board.
+	 */
+	*stdio_problem = false;
+	/* we don't warn about stdout/stderr if EPIPE, but we do error exit */
+	if (fflush(stdout) != 0) {
+#ifdef __MINGW32__
+		if (errno == 0 || errno == EINVAL)
+			w32_maybe_set_errno();
+#endif
+		if (errno != EPIPE)
+			warning(_("error writing standard output (%s)"), strerror(errno));
+		else
+			*got_EPIPE = true;
+
+		status++;
+		*stdio_problem = true;
+	}
+	if (fflush(stderr) != 0) {
+#ifdef __MINGW32__
+		if (errno == 0 || errno == EINVAL)
+			w32_maybe_set_errno();
+#endif
+		if (errno != EPIPE)
+			warning(_("error writing standard error (%s)"), strerror(errno));
+		else
+			*got_EPIPE = true;
+
+		status++;
+		*stdio_problem = true;
+	}
+	return status;
+}
+
+/* str2mode --- convert a string mode to an integer mode */
+
+static int
+str2mode(const char *mode)
+{
+	int ret;
+	const char *second = & mode[1];
+
+	if (*second == 'b')
+		second++;
+
+	switch(mode[0]) {
+	case 'r':
+		ret = O_RDONLY;
+		if (*second == '+' || *second == 'w')
+			ret = O_RDWR;
+		break;
+
+	case 'w':
+		ret = O_WRONLY|O_CREAT|O_TRUNC;
+		if (*second == '+' || *second == 'r')
+			ret = O_RDWR|O_CREAT|O_TRUNC;
+		break;
+
+	case 'a':
+		ret = O_WRONLY|O_APPEND|O_CREAT;
+		if (*second == '+')
+			ret = O_RDWR|O_APPEND|O_CREAT;
+		break;
+
+	default:
+		ret = 0;		/* lint */
+		cant_happen();
+	}
+	if (strchr(mode, 'b') != NULL)
+		ret |= O_BINARY;
+	return ret;
+}
+
+#ifdef HAVE_SOCKETS
+
+/* socketopen --- open a socket and set it into connected state */
+
+static int
+socketopen(int family, int type, const char *localpname,
+	const char *remotepname, const char *remotehostname, bool *hard_error)
+{
+	struct addrinfo *lres, *lres0;
+	struct addrinfo lhints;
+	struct addrinfo *rres, *rres0;
+	struct addrinfo rhints;
+
+	int lerror, rerror;
+
+	int socket_fd = INVALID_HANDLE;
+	int any_remote_host = (strcmp(remotehostname, "0") == 0);
+
+	memset(& lhints, '\0', sizeof (lhints));
+
+	lhints.ai_socktype = type;
+	lhints.ai_family = family;
+
+	/*
+         * If only the loopback interface is up and hints.ai_flags has
+	 * AI_ADDRCONFIG, getaddrinfo() will succeed and return all wildcard
+	 * addresses, but only if hints.ai_family == AF_UNSPEC
+	 *
+	 * Do return the wildcard address in case the loopback interface
+	 * is the only one that is up (and
+	 * hints.ai_family == either AF_INET4 or AF_INET6)
+         */
+	lhints.ai_flags = AI_PASSIVE;
+	if (lhints.ai_family == AF_UNSPEC)
+		lhints.ai_flags |= AI_ADDRCONFIG;
+
+	lerror = getaddrinfo(NULL, localpname, & lhints, & lres);
+	if (lerror) {
+		if (strcmp(localpname, "0") != 0) {
+#ifdef HAVE_GAI_STRERROR
+			warning(_("local port %s invalid in `/inet': %s"), localpname,
+					gai_strerror(lerror));
+#else
+			warning(_("local port %s invalid in `/inet'"), localpname);
+#endif
+			*hard_error = true;
+			return INVALID_HANDLE;
+		}
+		lres0 = NULL;
+		lres = & lhints;
+	} else
+		lres0 = lres;
+
+	while (lres != NULL) {
+		memset (& rhints, '\0', sizeof (rhints));
+		rhints.ai_flags = lhints.ai_flags;
+		rhints.ai_socktype = lhints.ai_socktype;
+		rhints.ai_family = lhints.ai_family;
+		rhints.ai_protocol = lhints.ai_protocol;
+
+		rerror = getaddrinfo(any_remote_host ? NULL : remotehostname,
+				remotepname, & rhints, & rres);
+		if (rerror) {
+			if (lres0 != NULL)
+				freeaddrinfo(lres0);
+#ifdef HAVE_GAI_STRERROR
+			warning(_("remote host and port information (%s, %s) invalid: %s"), remotehostname, remotepname,
+					gai_strerror(rerror));
+#else
+			warning(_("remote host and port information (%s, %s) invalid"), remotehostname, remotepname);
+#endif
+			*hard_error = true;
+			return INVALID_HANDLE;
+		}
+		rres0 = rres;
+		socket_fd = INVALID_HANDLE;
+		while (rres != NULL) {
+			socket_fd = socket(rres->ai_family,
+				rres->ai_socktype, rres->ai_protocol);
+			if (socket_fd < 0 || socket_fd == INVALID_HANDLE)
+				goto nextrres;
+
+			if (type == SOCK_STREAM) {
+				int on = 1;
+#ifdef SO_LINGER
+				struct linger linger;
+				memset(& linger, '\0', sizeof(linger));
+#endif
+				setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR,
+					(char *) & on, sizeof(on));
+#ifdef SO_LINGER
+				linger.l_onoff = 1;
+				/* linger for 30/100 second */
+				linger.l_linger = 30;
+				setsockopt(socket_fd, SOL_SOCKET, SO_LINGER,
+					(char *) & linger, sizeof(linger));
+#endif
+			}
+			if (bind(socket_fd, lres->ai_addr, lres->ai_addrlen) != 0)
+				goto nextrres;
+
+			if (! any_remote_host) { /* not ANY => create a client */
+				if (connect(socket_fd, rres->ai_addr, rres->ai_addrlen) == 0)
+					break;
+			} else { /* remote host is ANY => create a server */
+				if (type == SOCK_STREAM) {
+					int clientsocket_fd = INVALID_HANDLE;
+
+					struct sockaddr_storage remote_addr;
+					socklen_t namelen = sizeof(remote_addr);
+
+					if (listen(socket_fd, 1) >= 0
+					    && (clientsocket_fd = accept(socket_fd,
+						(struct sockaddr *) & remote_addr,
+						& namelen)) >= 0) {
+						closemaybesocket(socket_fd);
+						socket_fd = clientsocket_fd;
+						break;
+					}
+				} else if (type == SOCK_DGRAM) {
+#ifdef MSG_PEEK
+					char buf[10];
+					struct sockaddr_storage remote_addr;
+					socklen_t read_len = sizeof(remote_addr);
+
+					if (recvfrom(socket_fd, buf, 1, MSG_PEEK,
+						(struct sockaddr *) & remote_addr,
+							& read_len) >= 0
+							&& read_len
+							&& connect(socket_fd,
+						(struct sockaddr *) & remote_addr,
+								read_len) == 0)
+							break;
+#endif
+				}
+			}
+
+nextrres:
+			if (socket_fd != INVALID_HANDLE)
+				closemaybesocket(socket_fd);
+			socket_fd = INVALID_HANDLE;
+			rres = rres->ai_next;
+		}
+		freeaddrinfo(rres0);
+		if (socket_fd != INVALID_HANDLE)
+			break;
+		lres = lres->ai_next;
+	}
+	if (lres0)
+		freeaddrinfo(lres0);
+
+	return socket_fd;
+}
+#endif /* HAVE_SOCKETS */
+
+
+/* devopen_simple --- handle "-", /dev/std{in,out,err}, /dev/fd/N */
+
+/*
+ * 9/2014: Flow here is a little messy.
+ *
+ * For do_posix, we don't allow any of the special filenames.
+ *
+ * For do_traditional, we allow /dev/{stdin,stdout,stderr} since BWK awk
+ * (and mawk) support them.  But we don't allow /dev/fd/N or /inet.
+ *
+ * Note that for POSIX systems os_devopen() is a no-op.
+ */
+
+int
+devopen_simple(const char *name, const char *mode, bool try_real_open)
+{
+	int openfd;
+	char *cp;
+	char *ptr;
+	int flag = 0;
+
+	if (strcmp(name, "-") == 0) {
+		if (mode[0] == 'r')
+			return fileno(stdin);
+		else
+			return fileno(stdout);
+	}
+
+	flag = str2mode(mode);
+	openfd = INVALID_HANDLE;
+
+	if (do_posix)
+		goto done;
+
+	if ((openfd = os_devopen(name, flag)) != INVALID_HANDLE) {
+		os_close_on_exec(openfd, name, "file", "");
+		return openfd;
+	}
+
+	if (strncmp(name, "/dev/", 5) == 0) {
+		cp = (char *) name + 5;
+
+		if (strcmp(cp, "stdin") == 0 && (flag & O_ACCMODE) == O_RDONLY)
+			openfd = fileno(stdin);
+		else if (strcmp(cp, "stdout") == 0 && (flag & O_ACCMODE) == O_WRONLY)
+			openfd = fileno(stdout);
+		else if (strcmp(cp, "stderr") == 0 && (flag & O_ACCMODE) == O_WRONLY)
+			openfd = fileno(stderr);
+		else if (do_traditional)
+			goto done;
+		else if (strncmp(cp, "fd/", 3) == 0) {
+			struct stat sbuf;
+
+			cp += 3;
+			openfd = (int) strtoul(cp, & ptr, 10);
+			if (openfd <= INVALID_HANDLE || ptr == cp
+			    || fstat(openfd, & sbuf) < 0)
+				openfd = INVALID_HANDLE;
+		}
+		/* do not set close-on-exec for inherited fd's */
+	}
+done:
+	if (try_real_open)
+		openfd = open(name, flag, 0666);
+
+	return openfd;
+}
+
+/* devopen --- handle /dev/std{in,out,err}, /dev/fd/N, /inet, regular files */
+
+/*
+ * Strictly speaking, "name" is not a "const char *" because we temporarily
+ * change the string.
+ */
+
+int
+devopen(const char *name, const char *mode)
+{
+	int openfd;
+	int flag;
+	struct inet_socket_info isi;
+	int save_errno = 0;
+
+	openfd = devopen_simple(name, mode, false);
+	if (openfd != INVALID_HANDLE)
+		return openfd;
+
+	flag = str2mode(mode);
+
+	if (do_traditional) {
+		goto strictopen;
+	} else if (inetfile(name, strlen(name), & isi)) {
+#ifdef HAVE_SOCKETS
+#define DEFAULT_RETRIES 20
+		static unsigned long def_retries = DEFAULT_RETRIES;
+		static bool first_time = true;
+		unsigned long retries = 0;
+		static long msleep = 1000;
+		bool hard_error = false;
+		bool non_fatal = is_non_fatal_redirect(name, strlen(name));
+		char save;
+		char *cp = (char *) name;
+
+		/* socketopen requires NUL-terminated strings */
+		cp[isi.localport.offset+isi.localport.len] = '\0';
+		cp[isi.remotehost.offset+isi.remotehost.len] = '\0';
+		save = cp[isi.remoteport.offset+isi.remoteport.len];
+		cp[isi.remoteport.offset+isi.remoteport.len] = '\0';
+
+		if (first_time) {
+			char *cp, *end;
+			unsigned long count = 0;
+			char *ms2;
+
+			first_time = false;
+			if ((cp = getenv("GAWK_SOCK_RETRIES")) != NULL) {
+				count = strtoul(cp, & end, 10);
+				if (end != cp && count > 0)
+					def_retries = count;
+			}
+
+			/*
+			 * Env var is in milliseconds, paramter to usleep()
+			 * is microseconds, make the conversion. Default is
+			 * 1 millisecond.
+			 */
+			if ((ms2 = getenv("GAWK_MSEC_SLEEP")) != NULL) {
+				msleep = strtol(ms2, & end, 10);
+				if (end == ms2 || msleep < 0)
+					msleep = 1000;
+				else
+					msleep *= 1000;
+			}
+		}
+		/*
+		 * PROCINFO["NONFATAL"] or PROCINFO[name, "NONFATAL"] overrrides
+		 * GAWK_SOCK_RETRIES.  The explicit code in the program carries
+		 * a bigger stick than the environment variable does.
+		 */
+		retries = non_fatal ? 1 : def_retries;
+
+		errno = 0;
+		do {
+			openfd = socketopen(isi.family, isi.protocol, name+isi.localport.offset,
+					name+isi.remoteport.offset, name+isi.remotehost.offset,
+					& hard_error);
+			retries--;
+		} while (openfd == INVALID_HANDLE && ! hard_error && retries > 0 && usleep(msleep) == 0);
+		save_errno = errno;
+
+		/* restore original name string */
+		cp[isi.localport.offset+isi.localport.len] = '/';
+		cp[isi.remotehost.offset+isi.remotehost.len] = '/';
+		cp[isi.remoteport.offset+isi.remoteport.len] = save;
+#else /* ! HAVE_SOCKETS */
+		fatal(_("TCP/IP communications are not supported"));
+#endif /* HAVE_SOCKETS */
+	}
+
+strictopen:
+	if (openfd == INVALID_HANDLE) {
+		openfd = open(name, flag, 0666);
+		/*
+		 * ENOENT means there is no such name in the filesystem.
+		 * Therefore it's ok to propagate up the error from
+		 * getaddrinfo() that's in save_errno.
+		 */
+		if (openfd == INVALID_HANDLE && errno == ENOENT && save_errno)
+			errno = save_errno;
+	}
+#if defined(__EMX__) || defined(__MINGW32__)
+	if (openfd == INVALID_HANDLE && errno == EACCES) {
+		/* On OS/2 and Windows directory access via open() is
+		   not permitted.  */
+		struct stat buf;
+
+		if (! inetfile(name, strlen(name), NULL)
+		    && stat(name, & buf) == 0 && S_ISDIR(buf.st_mode))
+			errno = EISDIR;
+	}
+#endif
+	if (openfd != INVALID_HANDLE) {
+		if (openfd > fileno(stderr))
+			os_close_on_exec(openfd, name, "file", "");
+	}
+
+	return openfd;
+}
+
+#if defined(HAVE_TERMIOS_H)
+/* push_pty_line_disciplines --- push line disciplines if we work that way */
+
+// Factors out common code for the two versions of fork_and_open_slave_pty().
+
+static void
+push_pty_line_disciplines(int slave)
+{
+#ifdef I_PUSH
+	/*
+	 * Push the necessary modules onto the slave to
+	 * get terminal semantics.  Check that they aren't
+	 * already there to avoid hangs on said "limited" systems.
+	 */
+#ifdef I_FIND
+	if (ioctl(slave, I_FIND, "ptem") == 0)
+#endif
+		ioctl(slave, I_PUSH, "ptem");
+#ifdef I_FIND
+	if (ioctl(slave, I_FIND, "ldterm") == 0)
+#endif
+		ioctl(slave, I_PUSH, "ldterm");
+#endif
+}
+
+/* set_slave_pty_attributes --- set terminal attributes for slave pty */
+
+// Factors out common code for the two versions of fork_and_open_slave_pty().
+
+static void
+set_slave_pty_attributes(int slave)
+{
+	struct termios st;
+
+	tcgetattr(slave, & st);
+	st.c_iflag &= ~(ISTRIP | IGNCR | INLCR | IXOFF);
+	st.c_iflag |= (ICRNL | IGNPAR | BRKINT | IXON);
+	st.c_oflag &= ~OPOST;
+	st.c_cflag &= ~CSIZE;
+	st.c_cflag |= CREAD | CS8 | CLOCAL;
+	st.c_lflag &= ~(ECHO | ECHOE | ECHOK | NOFLSH | TOSTOP);
+	st.c_lflag |= ISIG;
+
+	/* Set some control codes to default values */
+#ifdef VINTR
+	st.c_cc[VINTR] = '\003';        /* ^c */
+#endif
+#ifdef VQUIT
+	st.c_cc[VQUIT] = '\034';        /* ^| */
+#endif
+#ifdef VERASE
+	st.c_cc[VERASE] = '\177';       /* ^? */
+#endif
+#ifdef VKILL
+	st.c_cc[VKILL] = '\025';        /* ^u */
+#endif
+#ifdef VEOF
+	st.c_cc[VEOF] = '\004'; /* ^d */
+#endif
+	tcsetattr(slave, TCSANOW, & st);
+}
+
+
+/* fork_and_open_slave_pty --- handle forking the child and slave pty setup */
+
+/*
+ * January, 2018:
+ * This is messy. AIX and HP-UX require that the slave pty be opened and
+ * set up in the child.  Everything else wants it to be done in the parent,
+ * before the fork.  Thus we have two different versions of the routine that
+ * do the same thing, but in different orders.  This is not pretty, but it
+ * seems to be the simplest thing to do.
+ */
+
+static bool
+fork_and_open_slave_pty(const char *slavenam, int master, const char *command, pid_t *pid)
+{
+	int slave;
+	int save_errno;
+
+#if defined _AIX || defined __hpux
+	/*
+	 * We specifically open the slave only in the child. This allows
+	 * AIX and HP0UX to work.  The open is specifically without O_NOCTTY
+	 * in order to make the slave become the controlling terminal.
+	 */
+
+	switch (*pid = fork()) {
+	case 0:
+		/* Child process */
+		setsid();
+
+		if ((slave = open(slavenam, O_RDWR)) < 0) {
+			close(master);
+			fatal(_("could not open `%s', mode `%s'"),
+				slavenam, "r+");
+		}
+
+		push_pty_line_disciplines(slave);
+		set_slave_pty_attributes(slave);
+
+		if (close(master) == -1)
+			fatal(_("close of master pty failed (%s)"), strerror(errno));
+		if (close(1) == -1)
+			fatal(_("close of stdout in child failed (%s)"),
+				strerror(errno));
+		if (dup(slave) != 1)
+			fatal(_("moving slave pty to stdout in child failed (dup: %s)"), strerror(errno));
+		if (close(0) == -1)
+			fatal(_("close of stdin in child failed (%s)"),
+				strerror(errno));
+		if (dup(slave) != 0)
+			fatal(_("moving slave pty to stdin in child failed (dup: %s)"), strerror(errno));
+		if (close(slave))
+			fatal(_("close of slave pty failed (%s)"), strerror(errno));
+
+		/* stderr does NOT get dup'ed onto child's stdout */
+
+		set_sigpipe_to_default();
+
+		execl("/bin/sh", "sh", "-c", command, NULL);
+		_exit(errno == ENOENT ? 127 : 126);
+
+	case -1:
+		save_errno = errno;
+		close(master);
+		errno = save_errno;
+		return false;
+
+	default:
+		return true;
+	}
+
+#else
+
+	if ((slave = open(slavenam, O_RDWR)) < 0) {
+		close(master);
+		fatal(_("could not open `%s', mode `%s'"),
+			slavenam, "r+");
+	}
+
+	push_pty_line_disciplines(slave);
+	set_slave_pty_attributes(slave);
+
+	switch (*pid = fork()) {
+	case 0:
+		/* Child process */
+		setsid();
+
+#ifdef TIOCSCTTY
+		ioctl(slave, TIOCSCTTY, 0);
+#endif
+
+		if (close(master) == -1)
+			fatal(_("close of master pty failed (%s)"), strerror(errno));
+		if (close(1) == -1)
+			fatal(_("close of stdout in child failed (%s)"),
+				strerror(errno));
+		if (dup(slave) != 1)
+			fatal(_("moving slave pty to stdout in child failed (dup: %s)"), strerror(errno));
+		if (close(0) == -1)
+			fatal(_("close of stdin in child failed (%s)"),
+				strerror(errno));
+		if (dup(slave) != 0)
+			fatal(_("moving slave pty to stdin in child failed (dup: %s)"), strerror(errno));
+		if (close(slave))
+			fatal(_("close of slave pty failed (%s)"), strerror(errno));
+
+		/* stderr does NOT get dup'ed onto child's stdout */
+
+		signal(SIGPIPE, SIG_DFL);
+
+		execl("/bin/sh", "sh", "-c", command, NULL);
+		_exit(errno == ENOENT ? 127 : 126);
+
+	case -1:
+		save_errno = errno;
+		close(master);
+		close(slave);
+		errno = save_errno;
+		return false;
+
+	}
+
+	/* parent */
+	if (close(slave) != 0) {
+		close(master);
+		(void) kill(*pid, SIGKILL);
+		fatal(_("close of slave pty failed (%s)"), strerror(errno));
+	}
+
+	return true;
+#endif
+}
+
+#endif /* defined(HAVE_TERMIOS_H) */
+
+/* two_way_open --- open a two way communications channel */
+
+static int
+two_way_open(const char *str, struct redirect *rp, int extfd)
+{
+	static bool no_ptys = false;
+
+#ifdef HAVE_SOCKETS
+	/* case 1: socket */
+	if (extfd >= 0 || inetfile(str, strlen(str), NULL)) {
+		int fd, newfd;
+
+		fd = (extfd >= 0) ? extfd : devopen(str, "rw");
+		if (fd == INVALID_HANDLE)
+			return false;
+		if ((BINMODE & BINMODE_OUTPUT) != 0)
+			os_setbinmode(fd, O_BINARY);
+		rp->output.fp = fdopen(fd, binmode("wb"));
+		if (rp->output.fp == NULL) {
+			close(fd);
+			return false;
+		}
+		newfd = dup(fd);
+		if (newfd < 0) {
+			rp->output.gawk_fclose(rp->output.fp, rp->output.opaque);
+			return false;
+		}
+		if ((BINMODE & BINMODE_INPUT) != 0)
+			os_setbinmode(newfd, O_BINARY);
+		os_close_on_exec(fd, str, "socket", "to/from");
+		os_close_on_exec(newfd, str, "socket", "to/from");
+		rp->iop = iop_alloc(newfd, str, 0);
+		rp->output.name = str;
+		find_input_parser(rp->iop);
+		iop_finish(rp->iop);
+		if (! rp->iop->valid) {
+			if (! do_traditional && rp->iop->errcode != 0)
+				update_ERRNO_int(rp->iop->errcode);
+			iop_close(rp->iop);
+			rp->iop = NULL;
+			rp->output.gawk_fclose(rp->output.fp, rp->output.opaque);
+			return false;
+		}
+		rp->flag |= RED_SOCKET;
+		return true;
+	}
+#endif /* HAVE_SOCKETS */
+
+	/* case 2: see if an extension wants it */
+	if (find_two_way_processor(str, rp))
+		return true;
+
+#if defined(HAVE_TERMIOS_H)
+	/* case 3: use ptys for two-way communications to child */
+	if (! no_ptys && pty_vs_pipe(str)) {
+		static bool initialized = false;
+		static char first_pty_letter;
+#if defined(HAVE_GRANTPT) && ! defined(HAVE_POSIX_OPENPT)
+		static int have_dev_ptmx;
+#endif
+		char slavenam[32];
+		char c;
+		int master, dup_master;
+		pid_t pid;
+		struct stat statb;
+		/* Use array of chars to avoid ASCII / EBCDIC issues */
+		static char pty_chars[] = "pqrstuvwxyzabcdefghijklmno";
+		int i;
+
+		if (! initialized) {
+			initialized = true;
+#if defined(HAVE_GRANTPT) && ! defined(HAVE_POSIX_OPENPT)
+			have_dev_ptmx = (stat("/dev/ptmx", & statb) >= 0);
+#endif
+			i = 0;
+			do {
+				c = pty_chars[i++];
+				sprintf(slavenam, "/dev/pty%c0", c);
+				if (stat(slavenam, & statb) >= 0) {
+					first_pty_letter = c;
+					break;
+				}
+			} while (pty_chars[i] != '\0');
+		}
+
+#ifdef HAVE_GRANTPT
+#ifdef HAVE_POSIX_OPENPT
+		{
+			master = posix_openpt(O_RDWR|O_NOCTTY);
+#else
+		if (have_dev_ptmx) {
+			master = open("/dev/ptmx", O_RDWR);
+#endif
+			if (master >= 0) {
+				char *tem;
+
+				grantpt(master);
+				unlockpt(master);
+				tem = ptsname(master);
+				if (tem != NULL) {
+					strcpy(slavenam, tem);
+					goto got_the_pty;
+				}
+				(void) close(master);
+			}
+		}
+#endif
+
+		if (first_pty_letter) {
+			/*
+			 * Assume /dev/ptyXNN and /dev/ttyXN naming system.
+			 * The FIRST_PTY_LETTER gives the first X to try.
+			 * We try in the sequence FIRST_PTY_LETTER, ..,
+			 * 'z', 'a', .., FIRST_PTY_LETTER.
+			 * Is this worthwhile, or just over-zealous?
+			 */
+			c = first_pty_letter;
+			do {
+				int i;
+				char *cp;
+
+				for (i = 0; i < 16; i++) {
+					sprintf(slavenam, "/dev/pty%c%x", c, i);
+					if (stat(slavenam, & statb) < 0) {
+						no_ptys = true;	/* bypass all this next time */
+						goto use_pipes;
+					}
+
+					if ((master = open(slavenam, O_RDWR)) >= 0) {
+						slavenam[sizeof("/dev/") - 1] = 't';
+						if (access(slavenam, R_OK | W_OK) == 0)
+							goto got_the_pty;
+						close(master);
+					}
+				}
+				/* move to next character */
+				cp = strchr(pty_chars, c);
+				if (cp[1] != '\0')
+					cp++;
+				else
+					cp = pty_chars;
+				c = *cp;
+			} while (c != first_pty_letter);
+		} else
+			no_ptys = true;
+
+		/* Couldn't find a pty. Fall back to using pipes. */
+		goto use_pipes;
+
+	got_the_pty:
+
+		/* this is the parent */
+		if (! fork_and_open_slave_pty(slavenam, master, str, & pid))
+			fatal(_("could not create child process or open pty"));
+
+		rp->pid = pid;
+		rp->iop = iop_alloc(master, str, 0);
+		find_input_parser(rp->iop);
+		iop_finish(rp->iop);
+		if (! rp->iop->valid) {
+			if (! do_traditional && rp->iop->errcode != 0)
+				update_ERRNO_int(rp->iop->errcode);
+			iop_close(rp->iop);
+			rp->iop = NULL;
+			(void) kill(pid, SIGKILL);
+			return false;
+		}
+
+		rp->output.name = str;
+		/*
+		 * Force read and write ends of two-way connection to
+		 * be different fd's so they can be closed independently.
+		 */
+		rp->output.mode = "w";
+		if ((dup_master = dup(master)) < 0
+		    || (rp->output.fp = fdopen(dup_master, "w")) == NULL) {
+			iop_close(rp->iop);
+			rp->iop = NULL;
+			(void) close(master);
+			(void) kill(pid, SIGKILL);
+			if (dup_master > 0)
+				(void) close(dup_master);
+			return false;
+		} else
+			find_output_wrapper(& rp->output);
+		rp->flag |= RED_PTY;
+		os_close_on_exec(master, str, "pipe", "from");
+		os_close_on_exec(dup_master, str, "pipe", "to");
+		first_pty_letter = '\0';	/* reset for next command */
+		return true;
+	}
+#endif /* defined(HAVE_TERMIOS_H) */
+
+use_pipes:
+#ifndef PIPES_SIMULATED		/* real pipes */
+	/* case 4: two way pipe to a child process */
+    {
+	int ptoc[2], ctop[2];
+	int pid;
+	int save_errno;
+#if defined(__EMX__) || defined(__MINGW32__)
+	int save_stdout, save_stdin;
+#ifdef __MINGW32__
+	char *qcmd = NULL;
+#endif
+#endif
+
+	if (pipe(ptoc) < 0)
+		return false;	/* errno set, diagnostic from caller */
+
+	if (pipe(ctop) < 0) {
+		save_errno = errno;
+		close(ptoc[0]);
+		close(ptoc[1]);
+		errno = save_errno;
+		return false;
+	}
+
+#if defined(__EMX__) || defined(__MINGW32__)
+	save_stdin = dup(0);	/* duplicate stdin */
+	save_stdout = dup(1);	/* duplicate stdout */
+
+	if (save_stdout == -1 || save_stdin == -1) {
+		/* if an error occurs close all open file handles */
+		save_errno = errno;
+		if (save_stdin != -1)
+			close(save_stdin);
+		if (save_stdout != -1)
+			close(save_stdout);
+		close(ptoc[0]); close(ptoc[1]);
+		close(ctop[0]); close(ctop[1]);
+		errno = save_errno;
+		return false;
+	}
+
+	/* connect pipes to stdin and stdout */
+	close(1);	/* close stdout */
+	if (dup(ctop[1]) != 1) {	/* connect pipe input to stdout */
+		close(save_stdin); close(save_stdout);
+		close(ptoc[0]); close(ptoc[1]);
+		close(ctop[0]); close(ctop[1]);
+		fatal(_("moving pipe to stdout in child failed (dup: %s)"), strerror(errno));
+	}
+	close(0);	/* close stdin */
+	if (dup(ptoc[0]) != 0) {	/* connect pipe output to stdin */
+		close(save_stdin); close(save_stdout);
+		close(ptoc[0]); close(ptoc[1]);
+		close(ctop[0]); close(ctop[1]);
+		fatal(_("moving pipe to stdin in child failed (dup: %s)"), strerror(errno));
+	}
+
+	/* none of these handles must be inherited by the child process */
+	(void) close(ptoc[0]);	/* close pipe output, child will use stdin instead */
+	(void) close(ctop[1]);	/* close pipe input, child will use stdout instead */
+
+	os_close_on_exec(ptoc[1], str, "pipe", "from"); /* pipe input: output of the parent process */
+	os_close_on_exec(ctop[0], str, "pipe", "from"); /* pipe output: input of the parent process */
+	os_close_on_exec(save_stdin, str, "pipe", "from"); /* saved stdin of the parent process */
+	os_close_on_exec(save_stdout, str, "pipe", "from"); /* saved stdout of the parent process */
+
+	/* stderr does NOT get dup'ed onto child's stdout */
+#ifdef __EMX__
+	pid = spawnl(P_NOWAIT, "/bin/sh", "sh", "-c", str, NULL);
+#else  /* __MINGW32__ */
+	pid = spawnl(P_NOWAIT, getenv("ComSpec"), "cmd.exe", "/c",
+		     qcmd = quote_cmd(str), NULL);
+	efree(qcmd);
+#endif
+
+	/* restore stdin and stdout */
+	close(1);
+	if (dup(save_stdout) != 1) {
+		close(save_stdin); close(save_stdout);
+		close(ptoc[1]); close(ctop[0]);
+		fatal(_("restoring stdout in parent process failed"));
+	}
+	close(save_stdout);
+
+	close(0);
+	if (dup(save_stdin) != 0) {
+		close(save_stdin);
+		close(ptoc[1]);	close(ctop[0]);
+		fatal(_("restoring stdin in parent process failed"));
+	}
+	close(save_stdin);
+
+	if (pid < 0) { /* spawnl() failed */
+		save_errno = errno;
+		close(ptoc[1]);
+		close(ctop[0]);
+
+		errno = save_errno;
+		return false;
+	}
+
+#else /* NOT __EMX__, NOT __MINGW32__ */
+	if ((pid = fork()) < 0) {
+		save_errno = errno;
+		close(ptoc[0]); close(ptoc[1]);
+		close(ctop[0]); close(ctop[1]);
+		errno = save_errno;
+		return false;
+	}
+
+	if (pid == 0) {	/* child */
+		if (close(1) == -1)
+			fatal(_("close of stdout in child failed (%s)"),
+				strerror(errno));
+		if (dup(ctop[1]) != 1)
+			fatal(_("moving pipe to stdout in child failed (dup: %s)"), strerror(errno));
+		if (close(0) == -1)
+			fatal(_("close of stdin in child failed (%s)"),
+				strerror(errno));
+		if (dup(ptoc[0]) != 0)
+			fatal(_("moving pipe to stdin in child failed (dup: %s)"), strerror(errno));
+		if (   close(ptoc[0]) == -1 || close(ptoc[1]) == -1
+		    || close(ctop[0]) == -1 || close(ctop[1]) == -1)
+			fatal(_("close of pipe failed (%s)"), strerror(errno));
+		/* stderr does NOT get dup'ed onto child's stdout */
+		set_sigpipe_to_default();
+		execl("/bin/sh", "sh", "-c", str, NULL);
+		_exit(errno == ENOENT ? 127 : 126);
+	}
+#endif /* NOT __EMX__, NOT __MINGW32__ */
+
+	/* parent */
+	if ((BINMODE & BINMODE_INPUT) != 0)
+		os_setbinmode(ctop[0], O_BINARY);
+	if ((BINMODE & BINMODE_OUTPUT) != 0)
+		os_setbinmode(ptoc[1], O_BINARY);
+	rp->pid = pid;
+	rp->iop = iop_alloc(ctop[0], str, 0);
+	find_input_parser(rp->iop);
+	iop_finish(rp->iop);
+	if (! rp->iop->valid) {
+		if (! do_traditional && rp->iop->errcode != 0)
+			update_ERRNO_int(rp->iop->errcode);
+		iop_close(rp->iop);
+		rp->iop = NULL;
+		(void) close(ctop[1]);
+		(void) close(ptoc[0]);
+		(void) close(ptoc[1]);
+		(void) kill(pid, SIGKILL);
+
+		return false;
+	}
+	rp->output.fp = fdopen(ptoc[1], binmode("w"));
+	rp->output.mode = "w";
+	rp->output.name = str;
+	if (rp->output.fp == NULL) {
+		iop_close(rp->iop);
+		rp->iop = NULL;
+		(void) close(ctop[0]);
+		(void) close(ctop[1]);
+		(void) close(ptoc[0]);
+		(void) close(ptoc[1]);
+		(void) kill(pid, SIGKILL);
+
+		return false;
+	}
+	else
+		find_output_wrapper(& rp->output);
+
+#if !defined(__EMX__) && !defined(__MINGW32__)
+	os_close_on_exec(ctop[0], str, "pipe", "from");
+	os_close_on_exec(ptoc[1], str, "pipe", "from");
+
+	(void) close(ptoc[0]);
+	(void) close(ctop[1]);
+#endif
+
+	return true;
+    }
+
+#else	/*PIPES_SIMULATED*/
+
+	fatal(_("`|&' not supported"));
+	/*NOTREACHED*/
+	return false;
+
+#endif
+}
+
+#ifndef PIPES_SIMULATED		/* real pipes */
+
+/*
+ * wait_any --- if the argument pid is 0, wait for all child processes that
+ * have exited.  We loop to make sure to reap all children that have exited to
+ * minimize the risk of running out of process slots.  Since we don't process
+ * SIGCHLD, we do not immediately reap exited children.  So when we get here,
+ * we want to reap any that have piled up.
+ *
+ * Note: on platforms that do not support waitpid with WNOHANG, when called with
+ * a zero argument, this function will hang until all children have exited.
+ *
+ * AJS, 2013-07-07: I do not see why we need to ignore signals during this
+ * function.  This function just waits and updates the pid and status fields.
+ * I don't see why that should interfere with any signal handlers.  But I am
+ * reluctant to remove this protection.  So I changed to use sigprocmask to
+ * block signals instead to avoid interfering with installed signal handlers.
+ */
+
+static int
+wait_any(int interesting)	/* pid of interest, if any */
+{
+	int pid;
+	int status = 0;
+	struct redirect *redp;
+#ifdef HAVE_SIGPROCMASK
+	sigset_t set, oldset;
+
+	/* I have no idea why we are blocking signals during this function... */
+	sigemptyset(& set);
+	sigaddset(& set, SIGINT);
+	sigaddset(& set, SIGHUP);
+	sigaddset(& set, SIGQUIT);
+	sigprocmask(SIG_BLOCK, & set, & oldset);
+#else
+	void (*hstat)(int), (*istat)(int), (*qstat)(int);
+
+	istat = signal(SIGINT, SIG_IGN);
+#endif
+#ifdef __MINGW32__
+	if (interesting < 0) {
+		status = -1;
+		pid = -1;
+	}
+	else
+		pid = _cwait(& status, interesting, 0);
+	if (pid == interesting && pid > 0) {
+		for (redp = red_head; redp != NULL; redp = redp->next)
+			if (interesting == redp->pid) {
+				redp->pid = -1;
+				redp->status = status;
+				break;
+			}
+	}
+#else /* ! __MINGW32__ */
+#ifndef HAVE_SIGPROCMASK
+	hstat = signal(SIGHUP, SIG_IGN);
+	qstat = signal(SIGQUIT, SIG_IGN);
+#endif
+	for (;;) {
+# if defined(HAVE_WAITPID) && defined(WNOHANG)
+		/*
+		 * N.B. If the caller wants status for a specific child process
+		 * (i.e. interesting is non-zero), then we must hang until we
+		 * get exit status for that child.
+		 */
+		if ((pid = waitpid(-1, & status, (interesting ? 0 : WNOHANG))) == 0)
+			/* No children have exited */
+			break;
+# elif defined(HAVE_SYS_WAIT_H)	/* POSIX compatible sys/wait.h */
+		pid = wait(& status);
+# else
+		pid = wait((union wait *) & status);
+# endif
+		if (interesting && pid == interesting) {
+			break;
+		} else if (pid != -1) {
+			for (redp = red_head; redp != NULL; redp = redp->next)
+				if (pid == redp->pid) {
+					redp->pid = -1;
+					redp->status = status;
+					break;
+				}
+		}
+		if (pid == -1 && errno == ECHILD)
+			break;
+	}
+#ifndef HAVE_SIGPROCMASK
+	signal(SIGHUP, hstat);
+	signal(SIGQUIT, qstat);
+#endif
+#endif /* ! __MINGW32__ */
+#ifndef HAVE_SIGPROCMASK
+	signal(SIGINT, istat);
+#else
+	sigprocmask(SIG_SETMASK, & oldset, NULL);
+#endif
+	return status;
+}
+
+/* gawk_popen --- open an IOBUF on a child process */
+
+static IOBUF *
+gawk_popen(const char *cmd, struct redirect *rp)
+{
+	int p[2];
+	int pid;
+#if defined(__EMX__) || defined(__MINGW32__)
+	int save_stdout;
+#ifdef __MINGW32__
+	char *qcmd = NULL;
+#endif
+#endif
+
+	/*
+	 * We used to wait for any children to synchronize input and output,
+	 * but this could cause gawk to hang when it is started in a pipeline
+	 * and thus has a child process feeding it input (shell dependent).
+	 *
+	 * (void) wait_any(0);	// wait for outstanding processes
+	 */
+
+	if (pipe(p) < 0)
+		fatal(_("cannot open pipe `%s' (%s)"), cmd, strerror(errno));
+
+#if defined(__EMX__) || defined(__MINGW32__)
+	rp->iop = NULL;
+	save_stdout = dup(1); /* save stdout */
+	if (save_stdout == -1) {
+		close(p[0]);
+		close(p[1]);
+		return NULL;	/* failed */
+	}
+
+	close(1); /* close stdout */
+	if (dup(p[1]) != 1) {
+		close(p[0]);
+		close(p[1]);
+		fatal(_("moving pipe to stdout in child failed (dup: %s)"),
+				strerror(errno));
+	}
+
+	/* none of these handles must be inherited by the child process */
+	close(p[1]); /* close pipe input */
+
+	os_close_on_exec(p[0], cmd, "pipe", "from"); /* pipe output: input of the parent process */
+	os_close_on_exec(save_stdout, cmd, "pipe", "from"); /* saved stdout of the parent process */
+
+#ifdef __EMX__
+	pid = spawnl(P_NOWAIT, "/bin/sh", "sh", "-c", cmd, NULL);
+#else  /* __MINGW32__ */
+	pid = spawnl(P_NOWAIT, getenv("ComSpec"), "cmd.exe", "/c",
+		     qcmd = quote_cmd(cmd), NULL);
+	efree(qcmd);
+#endif
+
+	/* restore stdout */
+	close(1);
+	if (dup(save_stdout) != 1) {
+		close(p[0]);
+		fatal(_("restoring stdout in parent process failed"));
+	}
+	close(save_stdout);
+
+#else /* NOT __EMX__, NOT __MINGW32__ */
+	if ((pid = fork()) == 0) {
+		if (close(1) == -1)
+			fatal(_("close of stdout in child failed (%s)"),
+				strerror(errno));
+		if (dup(p[1]) != 1)
+			fatal(_("moving pipe to stdout in child failed (dup: %s)"), strerror(errno));
+		if (close(p[0]) == -1 || close(p[1]) == -1)
+			fatal(_("close of pipe failed (%s)"), strerror(errno));
+		set_sigpipe_to_default();
+		execl("/bin/sh", "sh", "-c", cmd, NULL);
+		_exit(errno == ENOENT ? 127 : 126);
+	}
+#endif /* NOT __EMX__, NOT __MINGW32__ */
+
+	if (pid == -1) {
+		close(p[0]); close(p[1]);
+		fatal(_("cannot create child process for `%s' (fork: %s)"), cmd, strerror(errno));
+	}
+	rp->pid = pid;
+#if !defined(__EMX__) && !defined(__MINGW32__)
+	if (close(p[1]) == -1) {
+		close(p[0]);
+		fatal(_("close of pipe failed (%s)"), strerror(errno));
+	}
+#endif
+	os_close_on_exec(p[0], cmd, "pipe", "from");
+	if ((BINMODE & BINMODE_INPUT) != 0)
+		os_setbinmode(p[0], O_BINARY);
+	rp->iop = iop_alloc(p[0], cmd, 0);
+	find_input_parser(rp->iop);
+	iop_finish(rp->iop);
+	if (! rp->iop->valid) {
+		if (! do_traditional && rp->iop->errcode != 0)
+			update_ERRNO_int(rp->iop->errcode);
+		iop_close(rp->iop);
+		rp->iop = NULL;
+	}
+
+	return rp->iop;
+}
+
+/* gawk_pclose --- close an open child pipe */
+
+static int
+gawk_pclose(struct redirect *rp)
+{
+	if (rp->iop != NULL)
+		(void) iop_close(rp->iop);
+	rp->iop = NULL;
+
+	/* process previously found, return stored status */
+	if (rp->pid == -1)
+		return rp->status;
+	rp->status = sanitize_exit_status(wait_any(rp->pid));
+	rp->pid = -1;
+	return rp->status;
+}
+
+#else	/* PIPES_SIMULATED */
+
+/*
+ * use temporary file rather than pipe
+ * except if popen() provides real pipes too
+ */
+
+/* gawk_popen --- open an IOBUF on a child process */
+
+static IOBUF *
+gawk_popen(const char *cmd, struct redirect *rp)
+{
+	FILE *current;
+
+	os_restore_mode(fileno(stdin));
+	set_sigpipe_to_default();
+
+	current = popen(cmd, binmode("r"));
+
+	if ((BINMODE & BINMODE_INPUT) != 0)
+		os_setbinmode(fileno(stdin), O_BINARY);
+	ignore_sigpipe();
+
+	if (current == NULL)
+		return NULL;
+	os_close_on_exec(fileno(current), cmd, "pipe", "from");
+	rp->iop = iop_alloc(fileno(current), cmd, 0);
+	find_input_parser(rp->iop);
+	iop_finish(rp->iop);
+	if (! rp->iop->valid) {
+		if (! do_traditional && rp->iop->errcode != 0)
+			update_ERRNO_int(rp->iop->errcode);
+		(void) pclose(current);
+		rp->iop->public.fd = INVALID_HANDLE;
+		iop_close(rp->iop);
+		rp->iop = NULL;
+		current = NULL;
+	}
+	rp->ifp = current;
+	return rp->iop;
+}
+
+/* gawk_pclose --- close an open child pipe */
+
+static int
+gawk_pclose(struct redirect *rp)
+{
+	int rval, aval, fd = rp->iop->public.fd;
+
+	if (rp->iop != NULL) {
+		rp->iop->public.fd = dup(fd);	  /* kludge to allow close() + pclose() */
+		rval = iop_close(rp->iop);
+	}
+	rp->iop = NULL;
+	aval = pclose(rp->ifp);
+	rp->ifp = NULL;
+	return (rval < 0 ? rval : aval);
+}
+
+#endif	/* PIPES_SIMULATED */
+
+/* do_getline_redir --- read in a line, into var and with redirection */
+
+NODE *
+do_getline_redir(int into_variable, enum redirval redirtype)
+{
+	struct redirect *rp = NULL;
+	IOBUF *iop;
+	int cnt = EOF;
+	char *s = NULL;
+	int errcode;
+	NODE *redir_exp = NULL;
+	NODE **lhs = NULL;
+	int redir_error = 0;
+	const awk_fieldwidth_info_t *field_width = NULL;
+
+	if (into_variable)
+		lhs = POP_ADDRESS();
+
+	assert(redirtype != redirect_none);
+	redir_exp = TOP();
+	rp = redirect(redir_exp, redirtype, & redir_error, false);
+	DEREF(redir_exp);
+	decr_sp();
+	if (rp == NULL) {
+		if (redir_error) { /* failed redirect */
+			if (! do_traditional)
+				update_ERRNO_int(redir_error);
+		}
+		return make_number((AWKNUM) -1.0);
+	} else if ((rp->flag & RED_TWOWAY) != 0 && rp->iop == NULL) {
+		if (is_non_fatal_redirect(redir_exp->stptr, redir_exp->stlen)) {
+			update_ERRNO_int(EBADF);
+			return make_number((AWKNUM) -1.0);
+		}
+		(void) close_rp(rp, CLOSE_ALL);
+		fatal(_("getline: attempt to read from closed read end of two-way pipe"));
+	}
+	iop = rp->iop;
+	if (iop == NULL)		/* end of input */
+		return make_number((AWKNUM) 0.0);
+
+	errcode = 0;
+	cnt = get_a_record(& s, iop, & errcode, (lhs ? NULL : & field_width));
+	if (errcode != 0) {
+		if (! do_traditional && (errcode != -1))
+			update_ERRNO_int(errcode);
+		return make_number((AWKNUM) cnt);
+	}
+
+	if (cnt == EOF) {
+		/*
+		 * Don't do iop_close() here if we are
+		 * reading from a pipe; otherwise
+		 * gawk_pclose will not be called.
+		 */
+		if ((rp->flag & (RED_PIPE|RED_TWOWAY)) == 0) {
+			(void) iop_close(iop);
+			rp->iop = NULL;
+		}
+		rp->flag |= RED_EOF;	/* sticky EOF */
+		return make_number((AWKNUM) 0.0);
+	}
+
+	if (lhs == NULL)	/* no optional var. */
+		set_record(s, cnt, field_width);
+	else {			/* assignment to variable */
+		unref(*lhs);
+		*lhs = make_string(s, cnt);
+		(*lhs)->flags |= USER_INPUT;
+	}
+
+	return make_number((AWKNUM) 1.0);
+}
+
+/* do_getline --- read in a line, into var and without redirection */
+
+NODE *
+do_getline(int into_variable, IOBUF *iop)
+{
+	int cnt = EOF;
+	char *s = NULL;
+	int errcode;
+	const awk_fieldwidth_info_t *field_width = NULL;
+
+	if (iop == NULL) {	/* end of input */
+		if (into_variable)
+			(void) POP_ADDRESS();
+		return make_number((AWKNUM) 0.0);
+	}
+
+	errcode = 0;
+	cnt = get_a_record(& s, iop, & errcode, (into_variable ? NULL : & field_width));
+	if (errcode != 0) {
+		if (! do_traditional && (errcode != -1))
+			update_ERRNO_int(errcode);
+		if (into_variable)
+			(void) POP_ADDRESS();
+		return make_number((AWKNUM) cnt);
+	}
+
+	if (cnt == EOF)
+		return NULL;	/* try next file */
+	INCREMENT_REC(NR);
+	INCREMENT_REC(FNR);
+
+	if (! into_variable)	/* no optional var. */
+		set_record(s, cnt, field_width);
+	else {			/* assignment to variable */
+		NODE **lhs;
+		lhs = POP_ADDRESS();
+		unref(*lhs);
+		*lhs = make_string(s, cnt);
+		(*lhs)->flags |= USER_INPUT;
+	}
+	return make_number((AWKNUM) 1.0);
+}
+
+typedef struct {
+	const char *envname;
+	char **dfltp;		/* pointer to address of default path */
+	char **awkpath;		/* array containing library search paths */
+	int max_pathlen;	/* length of the longest item in awkpath */
+} path_info;
+
+static path_info pi_awkpath = {
+	/* envname */	"AWKPATH",
+	/* dfltp */	& defpath,
+};
+
+static path_info pi_awklibpath = {
+	/* envname */	"AWKLIBPATH",
+	/* dfltp */	& deflibpath,
+};
+
+/* init_awkpath --- split path(=$AWKPATH) into components */
+
+static void
+init_awkpath(path_info *pi)
+{
+	char *path;
+	char *start, *end, *p;
+	int len, i;
+	int max_path;		/* (# of allocated paths)-1 */
+
+	pi->max_pathlen = 0;
+	if ((path = getenv(pi->envname)) == NULL || *path == '\0')
+		path = pi->dfltp[0];
+
+	/* count number of separators */
+	for (max_path = 0, p = path; *p; p++)
+		if (*p == envsep)
+			max_path++;
+
+	// +3 --> 2 for null entries at front and end of path, 1 for NULL end of list
+	ezalloc(pi->awkpath, char **, (max_path + 3) * sizeof(char *), "init_awkpath");
+
+	start = path;
+	i = 0;
+
+	if (*path == envsep) {	/* null entry at front of path */
+		pi->awkpath[i++] = ".";
+		pi->max_pathlen = 1;
+	}
+
+	while (*start) {
+		if (*start == envsep) {
+			if (start[1] == envsep) {
+				pi->awkpath[i++] = ".";
+				if (pi->max_pathlen == 0)
+					pi->max_pathlen = 1;
+				start++;
+			} else if (start[1] == '\0') {
+				pi->awkpath[i++] = ".";
+				if (pi->max_pathlen == 0)
+					pi->max_pathlen = 1;
+				break;
+			} else
+				start++;
+		} else {
+			for (end = start; *end && *end != envsep; end++)
+				continue;
+
+			len = end - start;
+			if (len > 0) {
+				emalloc(p, char *, len + 2, "init_awkpath");
+				memcpy(p, start, len);
+
+				/* add directory punctuation if necessary */
+				if (! isdirpunct(end[-1]))
+					p[len++] = '/';
+				p[len] = '\0';
+				pi->awkpath[i++] = p;
+				if (len > pi->max_pathlen)
+					pi->max_pathlen = len;
+
+				start = end;
+			} else
+				start++;
+		}
+	}
+
+	pi->awkpath[i] = NULL;
+}
+
+/* do_find_source --- search $AWKPATH for file, return NULL if not found */
+
+static char *
+do_find_source(const char *src, struct stat *stb, int *errcode, path_info *pi)
+{
+	char *path;
+	int i;
+
+	assert(errcode != NULL);
+
+	/* some kind of path name, no search */
+	if (ispath(src)) {
+		emalloc(path, char *, strlen(src) + 1, "do_find_source");
+		strcpy(path, src);
+		if (stat(path, stb) == 0)
+			return path;
+		*errcode = errno;
+		efree(path);
+		return NULL;
+	}
+
+	if (pi->awkpath == NULL)
+		init_awkpath(pi);
+
+	emalloc(path, char *, pi->max_pathlen + strlen(src) + 1, "do_find_source");
+	for (i = 0; pi->awkpath[i] != NULL; i++) {
+		if (strcmp(pi->awkpath[i], "./") == 0 || strcmp(pi->awkpath[i], ".") == 0)
+			*path = '\0';
+		else
+			strcpy(path, pi->awkpath[i]);
+		strcat(path, src);
+		if (stat(path, stb) == 0)
+			return path;
+	}
+
+	/* not found, give up */
+	*errcode = errno;
+	efree(path);
+	return NULL;
+}
+
+/* find_source --- find source file with default file extension handling */
+
+char *
+find_source(const char *src, struct stat *stb, int *errcode, int is_extlib)
+{
+	char *path;
+	path_info *pi = (is_extlib ? & pi_awklibpath : & pi_awkpath);
+
+	*errcode = 0;
+	if (src == NULL || *src == '\0')
+		return NULL;
+#ifdef __EMX__
+	char os2_src[strlen(src) + 1];
+
+	if (is_extlib)
+		src = os2_fixdllname(os2_src, src, sizeof(os2_src));
+#endif /* __EMX__ */
+	path = do_find_source(src, stb, errcode, pi);
+
+	if (path == NULL && is_extlib) {
+		char *file_ext;
+		int save_errno;
+		size_t src_len;
+		size_t suffix_len;
+
+#define EXTLIB_SUFFIX	"." SHLIBEXT
+		src_len = strlen(src);
+		suffix_len = strlen(EXTLIB_SUFFIX);
+
+		/* check if already has the SUFFIX */
+		if (src_len >= suffix_len && strcmp(& src[src_len - suffix_len], EXTLIB_SUFFIX) == 0)
+			return NULL;
+
+		/* append EXTLIB_SUFFIX and try again */
+		save_errno = errno;
+		emalloc(file_ext, char *, src_len + suffix_len + 1, "find_source");
+		sprintf(file_ext, "%s%s", src, EXTLIB_SUFFIX);
+		path = do_find_source(file_ext, stb, errcode, pi);
+		efree(file_ext);
+		if (path == NULL)
+			errno = save_errno;
+		return path;
+#undef EXTLIB_SUFFIX
+	}
+
+/*
+ * Try searching with .awk appended if the platform headers have not specified
+ * another suffix.
+ */
+#ifndef DEFAULT_FILETYPE
+#define DEFAULT_FILETYPE ".awk"
+#endif
+
+#ifdef DEFAULT_FILETYPE
+	if (! do_traditional && path == NULL) {
+		char *file_awk;
+		int save_errno = errno;
+#ifdef VMS
+		int vms_save = vaxc$errno;
+#endif
+
+		/* append ".awk" and try again */
+		emalloc(file_awk, char *, strlen(src) +
+			sizeof(DEFAULT_FILETYPE) + 1, "find_source");
+		sprintf(file_awk, "%s%s", src, DEFAULT_FILETYPE);
+		path = do_find_source(file_awk, stb, errcode, pi);
+		efree(file_awk);
+		if (path == NULL) {
+			errno = save_errno;
+#ifdef VMS
+			vaxc$errno = vms_save;
+#endif
+		}
+	}
+#endif	/*DEFAULT_FILETYPE*/
+
+	return path;
+}
+
+
+/* srcopen --- open source file */
+
+int
+srcopen(SRCFILE *s)
+{
+	int fd = INVALID_HANDLE;
+
+	if (s->stype == SRC_STDIN)
+		fd = fileno(stdin);
+	else if (s->stype == SRC_FILE || s->stype == SRC_INC)
+		fd = devopen(s->fullpath, "r");
+
+	/* set binary mode so that debugger byte offset calculations will be right */
+	if (fd != INVALID_HANDLE)
+		os_setbinmode(fd, O_BINARY);
+
+	return fd;
+}
+
+/* input parsers, mainly for use by extension functions */
+
+static awk_input_parser_t *ip_head, *ip_tail;
+
+/*
+ * register_input_parser --- add an input parser to the list, FIFO.
+ * 	The main reason to use FIFO is to provide the diagnostic
+ * 	with the correct information: input parser 2 conflicts
+ * 	with input parser 1.  Otherwise LIFO would have been easier.
+ */
+
+void
+register_input_parser(awk_input_parser_t *input_parser)
+{
+	if (input_parser == NULL)
+		fatal(_("register_input_parser: received NULL pointer"));
+
+	input_parser->next = NULL;	/* force it */
+	if (ip_head == NULL) {
+		ip_head = ip_tail = input_parser;
+	} else {
+		ip_tail->next = input_parser;
+		ip_tail = ip_tail->next;
+	}
+}
+
+/* find_input_parser --- search the list of input parsers */
+
+static void
+find_input_parser(IOBUF *iop)
+{
+	awk_input_parser_t *ip, *ip2;
+
+	/* if already associated with an input parser, bail out early */
+	if (iop->public.get_record != NULL)
+		return;
+
+	ip = ip2 = NULL;
+	for (ip2 = ip_head; ip2 != NULL; ip2 = ip2->next) {
+		if (ip2->can_take_file(& iop->public)) {
+			if (ip == NULL)
+				ip = ip2;	/* found first one */
+			else
+				fatal(_("input parser `%s' conflicts with previously installed input parser `%s'"),
+						ip2->name, ip->name);
+		}
+	}
+
+	if (ip != NULL) {
+		if (! ip->take_control_of(& iop->public))
+			warning(_("input parser `%s' failed to open `%s'"),
+					ip->name, iop->public.name);
+		else
+			iop->valid = true;
+	}
+}
+
+/* output wrappers --- for use by extensions */
+
+static awk_output_wrapper_t *op_head, *op_tail;
+
+/*
+ * register_output_wrapper --- add an output wrapper to the list.
+ * 	Same stuff here as for input parsers.
+ */
+
+void
+register_output_wrapper(awk_output_wrapper_t *wrapper)
+{
+	if (wrapper == NULL)
+		fatal(_("register_output_wrapper: received NULL pointer"));
+
+	wrapper->next = NULL;	/* force it */
+	if (op_head == NULL) {
+		op_head = op_tail = wrapper;
+	} else {
+		op_tail->next = wrapper;
+		op_tail = op_tail->next;
+	}
+}
+
+/* find_output_wrapper --- search the list of output wrappers */
+
+static bool
+find_output_wrapper(awk_output_buf_t *outbuf)
+{
+	awk_output_wrapper_t *op, *op2;
+
+	/* if already associated with an output wrapper, bail out early */
+	if (outbuf->redirected)
+		return false;
+
+	op = op2 = NULL;
+	for (op2 = op_head; op2 != NULL; op2 = op2->next) {
+		if (op2->can_take_file(outbuf)) {
+			if (op == NULL)
+				op = op2;	/* found first one */
+			else
+				fatal(_("output wrapper `%s' conflicts with previously installed output wrapper `%s'"),
+						op2->name, op->name);
+		}
+	}
+
+	if (op != NULL) {
+		if (! op->take_control_of(outbuf)) {
+			warning(_("output wrapper `%s' failed to open `%s'"),
+					op->name, outbuf->name);
+			return false;
+		}
+		return true;
+	}
+
+	return false;
+}
+
+
+/* two way processors --- for use by extensions */
+
+static awk_two_way_processor_t *tw_head, *tw_tail;
+
+/* register_two_way_processor --- register a two-way I/O processor, for extensions */
+
+void
+register_two_way_processor(awk_two_way_processor_t *processor)
+{
+	if (processor == NULL)
+		fatal(_("register_output_processor: received NULL pointer"));
+
+	processor->next = NULL;	/* force it */
+	if (tw_head == NULL) {
+		tw_head = tw_tail = processor;
+	} else {
+		tw_tail->next = processor;
+		tw_tail = tw_tail->next;
+	}
+}
+
+/* find_two_way_processor --- search the list of two way processors */
+
+static bool
+find_two_way_processor(const char *name, struct redirect *rp)
+{
+	awk_two_way_processor_t *tw, *tw2;
+
+	/* if already associated with i/o, bail out early */
+	if (   (rp->iop != NULL && rp->iop->public.fd != INVALID_HANDLE)
+	    || rp->output.fp != NULL)
+		return false;
+
+	tw = tw2 = NULL;
+	for (tw2 = tw_head; tw2 != NULL; tw2 = tw2->next) {
+		if (tw2->can_take_two_way(name)) {
+			if (tw == NULL)
+				tw = tw2;	/* found first one */
+			else
+				fatal(_("two-way processor `%s' conflicts with previously installed two-way processor `%s'"),
+						tw2->name, tw->name);
+		}
+	}
+
+	if (tw != NULL) {
+		if (rp->iop == NULL)
+			rp->iop = iop_alloc(INVALID_HANDLE, name, 0);
+		if (! tw->take_control_of(name, & rp->iop->public, & rp->output)) {
+			warning(_("two way processor `%s' failed to open `%s'"),
+					tw->name, name);
+			return false;
+		}
+		iop_finish(rp->iop);
+		return true;
+	}
+
+	return false;
+}
+
+/*
+ * IOBUF management is somewhat complicated.  In particular,
+ * it is possible and OK for an IOBUF to be allocated with
+ * a file descriptor that is either valid or not usable with
+ * read(2), in case an input parser will come along later and
+ * make it readable.  Alternatively, an input parser can simply
+ * come along and take over reading on a valid readable descriptor.
+ *
+ * The first stage is simply to allocate the IOBUF.  This is done
+ * during nextfile() for command line files and by redirect()
+ * and other routines for getline, input pipes, and the input
+ * side of a two-way pipe.
+ *
+ * The second stage is to check for input parsers.  This is done
+ * for command line files in after_beginfile() and for the others
+ * as part of the full flow.  At this point, either:
+ * 	- The fd is valid on a readable file
+ * 	- The input parser has taken over a valid fd and made
+ * 	  it usable (e.g., directories)
+ * 	- Or the input parser has simply hijacked the reading
+ * 	  (such as the gawkextlib XML extension)
+ * If none of those are true, the fd should be closed, reset
+ * to INVALID_HANDLE, and iop->errcode set to indicate the error
+ * (EISDIR for directories, EIO for anything else).
+ * iop->valid should be set to false in this case.
+ *
+ * Otherwise, after the second stage, iop->errcode should be
+ * zero, iop->valid should be true, and iop->public.fd should
+ * not be INVALID_HANDLE.
+ *
+ * The third stage is to set up the rest of the IOBUF for
+ * use by get_a_record(). In this case, iop->valid must
+ * be true already, and iop->public.fd cannot be INVALID_HANDLE.
+ *
+ * Checking for input parsers for command line files is delayed
+ * to after_beginfile() so that the BEGINFILE rule has an
+ * opportunity to look at FILENAME and ERRNO and attempt to
+ * recover with a custom input parser. The XML extension, in
+ * particular, relies strongly upon this ability.
+ */
+
+/* iop_alloc --- allocate an IOBUF structure for an open fd */
+
+static IOBUF *
+iop_alloc(int fd, const char *name, int errno_val)
+{
+	IOBUF *iop;
+
+	ezalloc(iop, IOBUF *, sizeof(IOBUF), "iop_alloc");
+
+	iop->public.fd = fd;
+	iop->public.name = name;
+	iop->public.read_func = ( ssize_t(*)() ) read;
+	iop->valid = false;
+	iop->errcode = errno_val;
+
+	if (fd != INVALID_HANDLE)
+		fstat(fd, & iop->public.sbuf);
+#if defined(__EMX__) || defined(__MINGW32__)
+	else if (errno_val == EISDIR) {
+		iop->public.sbuf.st_mode = (_S_IFDIR | _S_IRWXU);
+		iop->public.fd = FAKE_FD_VALUE;
+	}
+#endif
+
+	return iop;
+}
+
+/* iop_finish --- finish setting up an IOBUF */
+
+static IOBUF *
+iop_finish(IOBUF *iop)
+{
+	bool isdir = false;
+
+	if (iop->public.fd != INVALID_HANDLE) {
+		if (os_isreadable(& iop->public, & isdir))
+			iop->valid = true;
+		else {
+			if (isdir)
+				iop->errcode = EISDIR;
+			else {
+				iop->errcode = EIO;
+				/*
+				 * Extensions can supply values that are not
+				 * INVALID_HANDLE but that are also not real
+				 * file descriptors. So check the fd before
+				 * trying to close it, which avoids errors
+				 * on some operating systems.
+				 *
+				 * The fcntl call works for Windows, too.
+				 */
+#if defined(F_GETFL)
+				if (fcntl(iop->public.fd, F_GETFL) >= 0)
+#endif
+					(void) close(iop->public.fd);
+				iop->public.fd = INVALID_HANDLE;
+			}
+			/*
+			 * Don't close directories: after_beginfile(),
+			 * special cases them.
+			 */
+		}
+	}
+
+	if (! iop->valid || iop->public.fd == INVALID_HANDLE)
+		return iop;
+
+	if (os_isatty(iop->public.fd))
+		iop->flag |= IOP_IS_TTY;
+
+	iop->readsize = iop->size = optimal_bufsize(iop->public.fd, & iop->public.sbuf);
+	if (do_lint && S_ISREG(iop->public.sbuf.st_mode) && iop->public.sbuf.st_size == 0)
+		lintwarn(_("data file `%s' is empty"), iop->public.name);
+	iop->errcode = errno = 0;
+	iop->count = iop->scanoff = 0;
+	emalloc(iop->buf, char *, iop->size += 1, "iop_finish");
+	iop->off = iop->buf;
+	iop->dataend = NULL;
+	iop->end = iop->buf + iop->size;
+	iop->flag |= IOP_AT_START;
+
+	return iop;
+}
+
+#define set_RT_to_null() \
+	(void)(! do_traditional && (unref(RT_node->var_value), \
+			   RT_node->var_value = dupnode(Nnull_string)))
+
+#define set_RT(str, len) \
+	(void)(! do_traditional && (unref(RT_node->var_value), \
+			   RT_node->var_value = make_string(str, len)))
+
+/*
+ * grow_iop_buffer:
+ *
+ * grow must increase size of buffer, set end, make sure off and dataend
+ * point at the right spot.
+ */
+
+static void
+grow_iop_buffer(IOBUF *iop)
+{
+	size_t valid = iop->dataend - iop->off;
+	size_t off = iop->off - iop->buf;
+	size_t newsize;
+
+	/*
+	 * Lop off original extra byte, double the size,
+	 * add it back.
+	 */
+	newsize = ((iop->size - 1) * 2) + 1;
+
+	/* Check for overflow */
+	if (newsize <= iop->size)
+		fatal(_("could not allocate more input memory"));
+
+	/* Make sure there's room for a disk block */
+	if (newsize - valid < iop->readsize)
+		newsize += iop->readsize + 1;
+
+	/* Check for overflow, again */
+	if (newsize <= iop->size)
+		fatal(_("could not allocate more input memory"));
+
+	iop->size = newsize;
+	erealloc(iop->buf, char *, iop->size, "grow_iop_buffer");
+	iop->off = iop->buf + off;
+	iop->dataend = iop->off + valid;
+	iop->end = iop->buf + iop->size;
+}
+
+/* rs1scan --- scan for a single character record terminator */
+
+static RECVALUE
+rs1scan(IOBUF *iop, struct recmatch *recm, SCANSTATE *state)
+{
+	char *bp;
+	char rs;
+	size_t mbclen = 0;
+	mbstate_t mbs;
+
+	memset(recm, '\0', sizeof(struct recmatch));
+	rs = RS->stptr[0];
+	*(iop->dataend) = rs;   /* set sentinel */
+	recm->start = iop->off; /* beginning of record */
+
+	bp = iop->off;
+	if (*state == INDATA)   /* skip over data we've already seen */
+		bp += iop->scanoff;
+
+	/*
+	 * From: Bruno Haible <bruno@clisp.org>
+	 * To: Aharon Robbins <arnold@skeeve.com>, gnits@gnits.org
+	 * Subject: Re: multibyte locales: any way to find if a character isn't multibyte?
+	 * Date: Mon, 23 Jun 2003 12:20:16 +0200
+	 * Cc: isamu@yamato.ibm.com
+	 *
+	 * Hi,
+	 *
+	 * > Is there any way to make the following query to the current locale?
+	 * >
+	 * > 	Given an 8-bit value, can this value ever appear as part of
+	 * > 	a multibyte character?
+	 *
+	 * There is no simple answer here. The easiest solution I see is to
+	 * get the current locale's codeset (via locale_charset() which is a
+	 * wrapper around nl_langinfo(CODESET)), and then perform a case-by-case
+	 * treatment of the known multibyte encodings, from GB2312 to EUC-JISX0213;
+	 * for the unibyte encodings, a single btowc() call will tell you.
+	 *
+	 * > This is particularly critical for me for ASCII newline ('\n').  If I
+	 * > can be guaranteed that it never shows up as part of a multibyte character,
+	 * > I can speed up gawk considerably in mulitbyte locales.
+	 *
+	 * This is much simpler to answer!
+	 * In all ASCII based multibyte encodings used for locales today (this
+	 * excludes EBCDIC based doublebyte encodings from IBM, and also excludes
+	 * ISO-2022-JP which is used for email exchange but not as a locale encoding)
+	 * ALL bytes in the range 0x00..0x2F occur only as a single character, not
+	 * as part of a multibyte character.
+	 *
+	 * So it's safe to assume, but deserves a comment in the source.
+	 *
+	 * Bruno
+	 ***************************************************************
+	 * From: Bruno Haible <bruno@clisp.org>
+	 * To: Aharon Robbins <arnold@skeeve.com>
+	 * Subject: Re: multibyte locales: any way to find if a character isn't multibyte?
+	 * Date: Mon, 23 Jun 2003 14:27:49 +0200
+	 *
+	 * On Monday 23 June 2003 14:11, you wrote:
+	 *
+	 * >       if (rs != '\n' && MB_CUR_MAX > 1) {
+	 *
+	 * If you assume ASCII, you can even write
+	 *
+	 *         if (rs >= 0x30 && MB_CUR_MAX > 1) {
+	 *
+	 * (this catches also the space character) but if portability to EBCDIC
+	 * systems is desired, your code is fine as is.
+	 *
+	 * Bruno
+	 */
+	/* Thus, the check for \n here; big speedup ! */
+	if (rs != '\n' && gawk_mb_cur_max > 1) {
+		int len = iop->dataend - bp;
+		bool found = false;
+
+		memset(& mbs, 0, sizeof(mbstate_t));
+		do {
+			if (*bp == rs)
+				found = true;
+			if (is_valid_character(*bp))
+				mbclen = 1;
+			else
+				mbclen = mbrlen(bp, len, & mbs);
+			if (   mbclen == 1
+			    || mbclen == (size_t) -1
+			    || mbclen == (size_t) -2
+			    || mbclen == 0) {
+				/* We treat it as a single-byte character.  */
+				mbclen = 1;
+			}
+			len -= mbclen;
+			bp += mbclen;
+		} while (len > 0 && ! found);
+
+		/* Check that newline found isn't the sentinel. */
+		if (found && (bp - mbclen) < iop->dataend) {
+			/*
+			 * Set len to what we have so far, in case this is
+			 * all there is.
+			 */
+			recm->len = bp - recm->start - mbclen;
+			recm->rt_start = bp - mbclen;
+			recm->rt_len = mbclen;
+			*state = NOSTATE;
+			return REC_OK;
+		} else {
+			/* also set len */
+			recm->len = bp - recm->start;
+			*state = INDATA;
+			iop->scanoff = bp - iop->off;
+			return NOTERM;
+		}
+	}
+
+	while (*bp != rs)
+		bp++;
+
+	/* set len to what we have so far, in case this is all there is */
+	recm->len = bp - recm->start;
+
+	if (bp < iop->dataend) {        /* found it in the buffer */
+		recm->rt_start = bp;
+		recm->rt_len = 1;
+		*state = NOSTATE;
+		return REC_OK;
+	} else {
+		*state = INDATA;
+		iop->scanoff = bp - iop->off;
+		return NOTERM;
+	}
+}
+
+/* rsrescan --- search for a regex match in the buffer */
+
+static RECVALUE
+rsrescan(IOBUF *iop, struct recmatch *recm, SCANSTATE *state)
+{
+	char *bp;
+	size_t restart = 0, reend = 0;
+	Regexp *RSre = RS_regexp;
+	int regex_flags = RE_NEED_START;
+
+	memset(recm, '\0', sizeof(struct recmatch));
+	recm->start = iop->off;
+
+	bp = iop->off;
+	if (*state == INDATA)
+		bp += iop->scanoff;
+
+	if ((iop->flag & IOP_AT_START) == 0)
+		regex_flags |= RE_NO_BOL;
+again:
+	/* case 1, no match */
+	if (research(RSre, bp, 0, iop->dataend - bp, regex_flags) == -1) {
+		/* set len, in case this all there is. */
+		recm->len = iop->dataend - iop->off;
+		return NOTERM;
+	}
+
+	/* ok, we matched within the buffer, set start and end */
+	restart = RESTART(RSre, iop->off);
+	reend = REEND(RSre, iop->off);
+
+	/* case 2, null regex match, grow buffer, try again */
+	if (restart == reend) {
+		*state = INDATA;
+		iop->scanoff = reend + 1;
+		/*
+		 * If still room in buffer, skip over null match
+		 * and restart search. Otherwise, return.
+		 */
+		if (bp + iop->scanoff < iop->dataend) {
+			bp += iop->scanoff;
+			goto again;
+		}
+		recm->len = (bp - iop->off) + restart;
+		return NOTERM;
+	}
+
+	/*
+	 * At this point, we have a non-empty match.
+	 *
+	 * First, fill in rest of data. The rest of the cases return
+	 * a record and terminator.
+	 */
+	recm->len = restart;
+	recm->rt_start = bp + restart;
+	recm->rt_len = reend - restart;
+	*state = NOSTATE;
+
+	/*
+	 * 3. Match exactly at end:
+	 *      if re is a simple string match
+	 *              found a simple string match at end, return REC_OK
+	 *      else
+	 *              grow buffer, add more data, try again
+	 *      fi
+	 */
+	if (iop->off + reend >= iop->dataend) {
+		if (reisstring(RS->stptr, RS->stlen, RSre, iop->off))
+			return REC_OK;
+		else
+			return TERMATEND;
+	}
+
+	/*
+	 * 4. Match within xxx bytes of end & maybe islong re:
+	 *      return TERMNEAREND
+	 */
+
+        /*
+         * case 4, match succeeded, but there may be more in
+         * the next input buffer.
+         *
+         * Consider an RS of   xyz(abc)?   where the
+         * exact end of the buffer is   xyza  and the
+         * next two, unread, characters are bc.
+         *
+         * This matches the "xyz" and ends up putting the
+         * "abc" into the front of the next record. Ooops.
+         *
+         * The re->maybe_long member is true if the
+         * regex contains one of: + * ? |.  This is a very
+         * simple heuristic, but in combination with the
+         * "end of match within a few bytes of end of buffer"
+         * check, should keep things reasonable.
+         */
+
+	/* succession of tests is easier to trace in GDB. */
+	if (RSre->maybe_long) {
+		char *matchend = iop->off + reend;
+
+		if (iop->dataend - matchend < RS->stlen)
+			return TERMNEAREND;
+	}
+
+	return REC_OK;
+}
+
+/* rsnullscan --- handle RS = "" */
+
+static RECVALUE
+rsnullscan(IOBUF *iop, struct recmatch *recm, SCANSTATE *state)
+{
+	char *bp;
+
+	if (*state == NOSTATE || *state == INLEADER)
+		memset(recm, '\0', sizeof(struct recmatch));
+
+	recm->start = iop->off;
+
+	bp = iop->off;
+	if (*state != NOSTATE)
+		bp += iop->scanoff;
+
+	/* set sentinel */
+	*(iop->dataend) = '\n';
+
+	if (*state == INTERM)
+		goto find_longest_terminator;
+	else if (*state == INDATA)
+		goto scan_data;
+	/* else
+		fall into things from beginning,
+		either NOSTATE or INLEADER */
+
+/* skip_leading: */
+	/* leading newlines are ignored */
+	while (*bp == '\n' && bp < iop->dataend)
+		bp++;
+
+	if (bp >= iop->dataend) {       /* LOTS of leading newlines, sheesh. */
+		*state = INLEADER;
+		iop->scanoff = bp - iop->off;
+		return NOTERM;
+	}
+
+	iop->off = recm->start = bp;    /* real start of record */
+scan_data:
+	while (*bp++ != '\n')
+		continue;
+
+	if (bp >= iop->dataend) {       /* no full terminator */
+		iop->scanoff = recm->len = bp - iop->off - 1;
+		if (bp == iop->dataend) {	/* half a terminator */
+			recm->rt_start = bp - 1;
+			recm->rt_len = 1;
+		}
+		*state = INDATA;
+		return NOTERM;
+	}
+
+	/* found one newline before end of buffer, check next char */
+	if (*bp != '\n')
+		goto scan_data;
+
+	/* we've now seen at least two newlines */
+	*state = INTERM;
+	recm->len = bp - iop->off - 1;
+	recm->rt_start = bp - 1;
+
+find_longest_terminator:
+	/* find as many newlines as we can, to set RT */
+	while (*bp == '\n' && bp < iop->dataend)
+		bp++;
+
+	recm->rt_len = bp - recm->rt_start;
+	iop->scanoff = bp - iop->off;
+
+	if (bp >= iop->dataend)
+		return TERMATEND;
+
+	return REC_OK;
+}
+
+/* retryable --- return true if PROCINFO[<filename>, "RETRY"] exists */
+
+static inline int
+retryable(IOBUF *iop)
+{
+	return PROCINFO_node && in_PROCINFO(iop->public.name, "RETRY", NULL);
+}
+
+/* errno_io_retry --- Does the I/O error indicate that the operation should be retried later? */
+
+static inline int
+errno_io_retry(void)
+{
+	switch (errno) {
+#ifdef EAGAIN
+	case EAGAIN:
+#endif
+#ifdef EWOULDBLOCK
+#if !defined(EAGAIN) || (EWOULDBLOCK != EAGAIN)
+	case EWOULDBLOCK:
+#endif
+#endif
+#ifdef EINTR
+	case EINTR:
+#endif
+#ifdef ETIMEDOUT
+	case ETIMEDOUT:
+#endif
+		return 1;
+	default:
+		return 0;
+	}
+}
+
+/*
+ * get_a_record --- read a record from IOP into out,
+ * return length of EOF, set RT.
+ * Note that errcode is never NULL, and the caller initializes *errcode to 0.
+ * If I/O would block, return -2.
+ */
+
+static int
+get_a_record(char **out,        /* pointer to pointer to data */
+        IOBUF *iop,             /* input IOP */
+        int *errcode,           /* pointer to error variable */
+        const awk_fieldwidth_info_t **field_width)
+				/* pointer to pointer to field_width info */
+{
+	struct recmatch recm;
+	SCANSTATE state;
+	RECVALUE ret;
+	int retval;
+	NODE *rtval = NULL;
+	static RECVALUE (*lastmatchrec)(IOBUF *iop, struct recmatch *recm, SCANSTATE *state) = NULL;
+
+	if (at_eof(iop) && no_data_left(iop))
+		return EOF;
+
+	if (read_can_timeout)
+		read_timeout = get_read_timeout(iop);
+
+	if (iop->public.get_record != NULL) {
+		char *rt_start;
+		size_t rt_len;
+		int rc = iop->public.get_record(out, &iop->public, errcode,
+						&rt_start, &rt_len,
+						field_width);
+		if (rc == EOF)
+			iop->flag |= IOP_AT_EOF;
+		else {
+			if (rt_len != 0)
+				set_RT(rt_start, rt_len);
+			else
+				set_RT_to_null();
+		}
+		return rc;
+	}
+
+        /* fill initial buffer */
+	if (has_no_data(iop) || no_data_left(iop)) {
+		iop->count = iop->public.read_func(iop->public.fd, iop->buf, iop->readsize);
+		if (iop->count == 0) {
+			iop->flag |= IOP_AT_EOF;
+			return EOF;
+		} else if (iop->count == -1) {
+			*errcode = errno;
+			if (errno_io_retry() && retryable(iop))
+				return -2;
+			iop->flag |= IOP_AT_EOF;
+			return EOF;
+		} else {
+			iop->dataend = iop->buf + iop->count;
+			iop->off = iop->buf;
+		}
+	}
+
+	/* loop through file to find a record */
+	state = NOSTATE;
+	for (;;) {
+		size_t dataend_off;
+		size_t room_left;
+		size_t amt_to_read;
+
+		ret = (*matchrec)(iop, & recm, & state);
+		iop->flag &= ~IOP_AT_START;
+		/* found the record, we're done, break the loop */
+		if (ret == REC_OK)
+			break;
+
+		/*
+		 * Likely found the record; if there's no more data
+		 * to be had (like from a tiny regular file), break the
+		 * loop. Otherwise, see if we can read more.
+		 */
+		if (ret == TERMNEAREND && buffer_has_all_data(iop))
+			break;
+
+		/* need to add more data to buffer */
+		/* shift data down in buffer */
+		dataend_off = iop->dataend - iop->off;
+		memmove(iop->buf, iop->off, dataend_off);
+		iop->off = iop->buf;
+		iop->dataend = iop->buf + dataend_off;
+
+		/* adjust recm contents */
+		recm.start = iop->off;
+		if (recm.rt_start != NULL)
+			recm.rt_start = iop->off + recm.len;
+
+		/* read more data, break if EOF */
+#ifndef MIN
+#define MIN(x, y) (x < y ? x : y)
+#endif
+		/* subtract one in read count to leave room for sentinel */
+		room_left = iop->end - iop->dataend - 1;
+		amt_to_read = MIN(iop->readsize, room_left);
+
+		if (amt_to_read < iop->readsize) {
+			grow_iop_buffer(iop);
+			/* adjust recm contents */
+			recm.start = iop->off;
+			if (recm.rt_start != NULL)
+				recm.rt_start = iop->off + recm.len;
+
+			/* recalculate amt_to_read */
+			room_left = iop->end - iop->dataend - 1;
+			amt_to_read = MIN(iop->readsize, room_left);
+		}
+		while (amt_to_read + iop->readsize < room_left)
+			amt_to_read += iop->readsize;
+
+#ifdef SSIZE_MAX
+		/*
+		 * POSIX limits read to SSIZE_MAX. There are (bizarre)
+		 * systems where this amount is small.
+		 */
+		amt_to_read = MIN(amt_to_read, SSIZE_MAX);
+#endif
+
+		iop->count = iop->public.read_func(iop->public.fd, iop->dataend, amt_to_read);
+		if (iop->count == -1) {
+			*errcode = errno;
+			if (errno_io_retry() && retryable(iop))
+				return -2;
+			iop->flag |= IOP_AT_EOF;
+			break;
+		} else if (iop->count == 0) {
+			/*
+			 * Hit EOF before being certain that we've matched
+			 * the end of the record. If ret is TERMNEAREND,
+			 * we need to pull out what we've got in the buffer.
+			 * Eventually we'll come back here and see the EOF,
+			 * end the record and set RT to "".
+			 */
+			if (ret != TERMNEAREND)
+				iop->flag |= IOP_AT_EOF;
+			break;
+		} else
+			iop->dataend += iop->count;
+	}
+
+	/* set record, RT, return right value */
+
+	/*
+	 * rtval is not a static pointer to avoid dangling pointer problems
+	 * in case awk code assigns to RT.  A remote possibility, to be sure,
+	 * but Bitter Experience teaches us not to make ``that'll never
+	 * happen'' kinds of assumptions.
+	 */
+	rtval = RT_node->var_value;
+
+	if (recm.rt_len == 0) {
+		set_RT_to_null();
+		lastmatchrec = NULL;
+	} else {
+		assert(recm.rt_start != NULL);
+		/*
+		 * Optimization. For rs1 case, don't set RT if
+		 * character is same as last time.  This knocks a
+		 * chunk of time off something simple like
+		 *
+		 *      gawk '{ print }' /some/big/file
+		 *
+		 * Similarly, for rsnull case, if length of new RT is
+		 * shorter than current RT, just bump length down in RT.
+		 *
+		 * Make sure that matchrec didn't change since the last
+		 * check.  (Ugh, details, details, details.)
+		 */
+		if (lastmatchrec == NULL || lastmatchrec != matchrec) {
+			lastmatchrec = matchrec;
+			set_RT(recm.rt_start, recm.rt_len);
+		} else if (matchrec == rs1scan) {
+			if (rtval->stlen != 1 || rtval->stptr[0] != recm.rt_start[0])
+				set_RT(recm.rt_start, recm.rt_len);
+			/* else
+				leave it alone */
+		} else if (matchrec == rsnullscan) {
+			if (rtval->stlen >= recm.rt_len) {
+				rtval->stlen = recm.rt_len;
+				free_wstr(rtval);
+			} else
+				set_RT(recm.rt_start, recm.rt_len);
+		} else
+			set_RT(recm.rt_start, recm.rt_len);
+	}
+
+	if (recm.len == 0) {
+		*out = NULL;
+		retval = 0;
+	} else {
+		assert(recm.start != NULL);
+		*out = recm.start;
+		retval = recm.len;
+	}
+
+	iop->off += recm.len + recm.rt_len;
+
+	if (recm.len == 0 && recm.rt_len == 0 && at_eof(iop))
+		return EOF;
+	else
+		return retval;
+}
+
+/* set_RS --- update things as appropriate when RS is set */
+
+void
+set_RS()
+{
+	static NODE *save_rs = NULL;
+
+	/*
+	 * Don't use cmp_nodes(), which pays attention to IGNORECASE.
+	 */
+	if (save_rs
+		&& RS_node->var_value->stlen == save_rs->stlen
+		&& memcmp(RS_node->var_value->stptr, save_rs->stptr, save_rs->stlen) == 0) {
+		/*
+		 * It could be that just IGNORECASE changed.  If so,
+		 * update the regex and then do the same for FS.
+		 * set_IGNORECASE() relies on this routine to call
+		 * set_FS().
+		 */
+		RS_regexp = RS_re[IGNORECASE];
+		goto set_FS;
+	}
+	unref(save_rs);
+	save_rs = dupnode(RS_node->var_value);
+	RS_is_null = false;
+	RS = force_string(RS_node->var_value);
+	/*
+	 * used to be if (RS_regexp != NULL) { refree(..); refree(..); ...; }.
+	 * Please do not remerge the if condition; hinders memory deallocation
+	 * in case of fatal error in make_regexp.
+	 */
+	refree(RS_re[0]);	/* NULL argument is ok */
+	refree(RS_re[1]);
+	RS_re[0] = RS_re[1] = RS_regexp = NULL;
+
+	if (RS->stlen == 0) {
+		RS_is_null = true;
+		matchrec = rsnullscan;
+	} else if (RS->stlen > 1 && ! do_traditional) {
+		static bool warned = false;
+
+		RS_re[0] = make_regexp(RS->stptr, RS->stlen, false, true, true);
+		RS_re[1] = make_regexp(RS->stptr, RS->stlen, true, true, true);
+		RS_regexp = RS_re[IGNORECASE];
+
+		matchrec = rsrescan;
+
+		if (do_lint_extensions && ! warned) {
+			lintwarn(_("multicharacter value of `RS' is a gawk extension"));
+			warned = true;
+		}
+	} else
+		matchrec = rs1scan;
+set_FS:
+	if (current_field_sep() == Using_FS)
+		set_FS();
+}
+
+
+/* pty_vs_pipe --- return true if should use pty instead of pipes for `|&' */
+
+/*
+ * This works by checking if PROCINFO["command", "pty"] exists and is true.
+ */
+
+static bool
+pty_vs_pipe(const char *command)
+{
+#ifdef HAVE_TERMIOS_H
+	NODE *val;
+
+	/*
+	 * N.B. No need to check for NULL PROCINFO_node, since the
+	 * in_PROCINFO function now checks that for us.
+	 */
+	val = in_PROCINFO(command, "pty", NULL);
+	if (val)
+		return boolval(val);
+#endif /* HAVE_TERMIOS_H */
+	return false;
+}
+
+/* iopflags2str --- make IOP flags printable */
+
+const char *
+iopflags2str(int flag)
+{
+	static const struct flagtab values[] = {
+		{ IOP_IS_TTY, "IOP_IS_TTY" },
+		{ IOP_AT_EOF,  "IOP_AT_EOF" },
+		{ IOP_CLOSED, "IOP_CLOSED" },
+		{ IOP_AT_START,  "IOP_AT_START" },
+		{ 0, NULL }
+	};
+
+	return genflags2str(flag, values);
+}
+
+/* free_rp --- release the memory used by rp */
+
+static void
+free_rp(struct redirect *rp)
+{
+	efree(rp->value);
+	efree(rp);
+}
+
+/* inetfile --- return true for a /inet special file, set other values */
+
+static bool
+inetfile(const char *str, size_t len, struct inet_socket_info *isi)
+{
+#ifndef HAVE_SOCKETS
+	return false;
+#else
+	const char *cp = str;
+	const char *cpend = str + len;
+	struct inet_socket_info buf;
+
+	/* syntax: /inet/protocol/localport/hostname/remoteport */
+	if (len < 5 || memcmp(cp, "/inet", 5) != 0)
+		/* quick exit */
+		return false;
+	if (! isi)
+		isi = & buf;
+	cp += 5;
+	if (cpend - cp < 2)
+		return false;
+	switch (*cp) {
+	case '/':
+		isi->family = AF_UNSPEC;
+		break;
+	case '4':
+		if (*++cp != '/')
+			return false;
+		isi->family = AF_INET;
+		break;
+	case '6':
+		if (*++cp != '/')
+			return false;
+		isi->family = AF_INET6;
+		break;
+	default:
+		return false;
+	}
+	cp++;	/* skip past '/' */
+
+	/* which protocol? */
+	if (cpend - cp < 5)
+		return false;
+	if (memcmp(cp, "tcp/", 4) == 0)
+		isi->protocol = SOCK_STREAM;
+	else if (memcmp(cp, "udp/", 4) == 0)
+		isi->protocol = SOCK_DGRAM;
+	else
+		return false;
+	cp += 4;
+
+	/* which localport? */
+	isi->localport.offset = cp-str;
+	while (*cp != '/') {
+		if (++cp >= cpend)
+			return false;
+	}
+	/*
+	 * Require a port, let them explicitly put 0 if
+	 * they don't care.
+	 */
+	if ((isi->localport.len = (cp-str)-isi->localport.offset) == 0)
+		return false;
+
+	/* which hostname? */
+	if (cpend - cp < 2)
+		return false;
+	cp++;
+	isi->remotehost.offset = cp-str;
+	while (*cp != '/') {
+		if (++cp >= cpend)
+			return false;
+	}
+	if ((isi->remotehost.len = (cp-str)-isi->remotehost.offset) == 0)
+		return false;
+
+	/* which remoteport? */
+	if (cpend - cp < 2)
+		return false;
+	cp++;
+	/*
+	 * The remote port ends the special file name.
+	 *
+	 * Here too, require a port, let them explicitly put 0 if
+	 * they don't care.
+	 */
+	isi->remoteport.offset = cp-str;
+	while (*cp != '/' && cp < cpend)
+		cp++;
+	if (cp != cpend || ((isi->remoteport.len = (cp-str)-isi->remoteport.offset) == 0))
+		return false;
+
+#ifndef HAVE_GETADDRINFO
+	/* final check for IPv6: */
+	if (isi->family == AF_INET6)
+		fatal(_("IPv6 communication is not supported"));
+#endif
+	return true;
+#endif /* HAVE_SOCKETS */
+}
+
+/*
+ * in_PROCINFO --- return value for a PROCINFO element with
+ *	SUBSEP seperated indices.
+ */
+
+static NODE *
+in_PROCINFO(const char *pidx1, const char *pidx2, NODE **full_idx)
+{
+	char *str;
+	size_t str_len;
+	NODE *r, *sub = NULL;
+	NODE *subsep = SUBSEP_node->var_value;
+
+	if (PROCINFO_node == NULL || (pidx1 == NULL && pidx2 == NULL))
+		return NULL;
+
+	/* full_idx is in+out parameter */
+
+	if (full_idx)
+		sub = *full_idx;
+
+	if (pidx1 != NULL && pidx2 == NULL)
+		str_len = strlen(pidx1);
+	else if (pidx1 == NULL && pidx2 != NULL)
+		str_len = strlen(pidx2);
+	else
+		str_len = strlen(pidx1) + subsep->stlen	+ strlen(pidx2);
+
+	if (sub == NULL) {
+		emalloc(str, char *, str_len + 1, "in_PROCINFO");
+		sub = make_str_node(str, str_len, ALREADY_MALLOCED);
+		if (full_idx)
+			*full_idx = sub;
+	} else if (str_len != sub->stlen) {
+		/* *full_idx != NULL */
+
+		assert(sub->valref == 1);
+		erealloc(sub->stptr, char *, str_len + 1, "in_PROCINFO");
+		sub->stlen = str_len;
+	}
+
+	if (pidx1 != NULL && pidx2 == NULL)
+		strcpy(sub->stptr, pidx1);
+	else if (pidx1 == NULL && pidx2 != NULL)
+		strcpy(sub->stptr, pidx2);
+	else
+		sprintf(sub->stptr, "%s%.*s%s", pidx1, (int)subsep->stlen,
+				subsep->stptr, pidx2);
+
+	r = in_array(PROCINFO_node, sub);
+	if (! full_idx)
+		unref(sub);
+	return r;
+}
+
+
+/* get_read_timeout --- get timeout in milliseconds for reading */
+
+static long
+get_read_timeout(IOBUF *iop)
+{
+	long tmout = 0;
+
+	if (PROCINFO_node != NULL) {
+		const char *name = iop->public.name;
+		NODE *val = NULL;
+		static NODE *full_idx = NULL;
+		static const char *last_name = NULL;
+
+		/*
+		 * Do not re-construct the full index when last redirection
+		 * string is the same as the current; "efficiency_hack++".
+		 */
+		if (full_idx == NULL || strcmp(name, last_name) != 0) {
+			val = in_PROCINFO(name, "READ_TIMEOUT", & full_idx);
+			if (last_name != NULL)
+				efree((void *) last_name);
+			last_name = estrdup(name, strlen(name));
+		} else	/* use cached full index */
+			val = in_array(PROCINFO_node, full_idx);
+
+		if (val != NULL) {
+			(void) force_number(val);
+			tmout = get_number_si(val);
+		}
+	} else
+		tmout = read_default_timeout;	/* initialized from env. variable in init_io() */
+
+	/* overwrite read routine only if an extension has not done so */
+	if ((iop->public.read_func == ( ssize_t(*)() ) read) && tmout > 0)
+		iop->public.read_func = read_with_timeout;
+
+	return tmout;
+}
+
+/*
+ * read_with_timeout --- read with a timeout, return failure
+ *	if no data is available within the timeout period.
+ */
+
+static ssize_t
+read_with_timeout(int fd, char *buf, size_t size)
+{
+#if ! defined(VMS)
+	fd_set readfds;
+	struct timeval tv;
+#ifdef __MINGW32__
+	/*
+	 * Only sockets can be read with a timeout.  Also, the FD_*
+	 * macros work on SOCKET type, not on int file descriptors.
+	 */
+	SOCKET s = valid_socket(fd);
+
+	if (!s)
+		return read(fd, buf, size);
+#else
+	int s = fd;
+#endif
+
+	tv.tv_sec = read_timeout / 1000;
+	tv.tv_usec = 1000 * (read_timeout - 1000 * tv.tv_sec);
+
+	FD_ZERO(& readfds);
+	FD_SET(s, & readfds);
+
+	errno = 0;
+	/*
+	 * Note: the 1st arg of 'select' is ignored on MS-Windows, so
+	 * it's not a mistake to pass fd+1 there, although we use
+	 * sockets, not file descriptors.
+	 */
+	if (select(fd + 1, & readfds, NULL, NULL, & tv) < 0)
+		return -1;
+
+	if (FD_ISSET(s, & readfds))
+		return read(fd, buf, size);
+	/* else
+		timed out */
+
+	/* Set a meaningful errno */
+#ifdef ETIMEDOUT
+	errno = ETIMEDOUT;
+#else
+	errno = EAGAIN;
+#endif
+	return -1;
+#else  /* VMS */
+	return read(fd, buf, size);
+#endif	/* VMS */
+}
+
+/*
+ * Dummy pass through functions for default output.
+ */
+
+/* gawk_fwrite --- like fwrite */
+
+static size_t
+gawk_fwrite(const void *buf, size_t size, size_t count, FILE *fp, void *opaque)
+{
+	(void) opaque;
+
+	return fwrite(buf, size, count, fp);
+}
+
+/* gawk_fflush --- like fflush */
+
+static int
+gawk_fflush(FILE *fp, void *opaque)
+{
+	(void) opaque;
+
+	return fflush(fp);
+}
+
+/* gawk_ferror --- like ferror */
+
+static int
+gawk_ferror(FILE *fp, void *opaque)
+{
+	(void) opaque;
+
+	return ferror(fp);
+}
+
+/* gawk_fclose --- like fclose */
+
+static int
+gawk_fclose(FILE *fp, void *opaque)
+{
+	int result;
+#ifdef __MINGW32__
+	SOCKET s = valid_socket (fileno(fp));
+#endif
+	(void) opaque;
+
+	result =  fclose(fp);
+#ifdef __MINGW32__
+	if (s && closesocket(s) == SOCKET_ERROR)
+		result = -1;
+#endif
+	return result;
+}
+
+/* init_output_wrapper --- initialize the output wrapper */
+
+static void
+init_output_wrapper(awk_output_buf_t *outbuf)
+{
+	outbuf->name = NULL;
+	outbuf->mode = NULL;
+	outbuf->fp = NULL;
+	outbuf->opaque = NULL;
+	outbuf->redirected = awk_false;
+	outbuf->gawk_fwrite = gawk_fwrite;
+	outbuf->gawk_fflush = gawk_fflush;
+	outbuf->gawk_ferror = gawk_ferror;
+	outbuf->gawk_fclose = gawk_fclose;
+}
diff --git a/gawk-5.0.1/m4/ChangeLog b/gawk-5.0.1/m4/ChangeLog
new file mode 100644
index 00000000000..6df93c56d1e
--- /dev/null
+++ b/gawk-5.0.1/m4/ChangeLog
@@ -0,0 +1,9 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/m4/ChangeLog.0 b/gawk-5.0.1/m4/ChangeLog.0
new file mode 100644
index 00000000000..305c1cfddfa
--- /dev/null
+++ b/gawk-5.0.1/m4/ChangeLog.0
@@ -0,0 +1,180 @@
+Wed Jan  5 20:36:10 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* readline.m4: Move call to AC_LANG([C]) from here to
+	../configure.ac.
+
+Tue Jan  4 11:09:43 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* readline.m4: Really fixed to work correctly with Autoconf 2.68.
+
+Sat Dec 25 21:40:25 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* readline.m4: Fixed to work correctly with Autoconf 2.68.
+
+Fri Dec 24 13:00:26 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* readline.m4: Updated to work with Autoconf 2.68.
+
+2010-12-22  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.18.1.
+	* iconv.m4: Upgrade to gettext-0.18.1.
+	* lib-ld.m4: Upgrade to gettext-0.18.1.
+	* lib-link.m4: Upgrade to gettext-0.18.1.
+	* lib-prefix.m4: Upgrade to gettext-0.18.1.
+	* nls.m4: Upgrade to gettext-0.18.1.
+	* po.m4: Upgrade to gettext-0.18.1.
+	* progtest.m4: Upgrade to gettext-0.18.1.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Mon Apr 26 20:16:49 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* libtool.m4, ltoptions.m4, ltsugar.m4, ltversion.m4,
+	lt~obsolete.m4: Removed.
+
+Mon Mar 29 08:42:38 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* libsigsegv.m4: New file, from gnulib.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+2009-06-08  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.17.
+	* iconv.m4: Upgrade to gettext-0.17.
+	* lib-link.m4: Upgrade to gettext-0.17.
+	* po.m4: Upgrade to gettext-0.17.
+
+Mon Jun  8 22:15:29 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* libtool.m4, lt~obsolete.m4 ltsugar.m4 ltversion.m4,
+	ltoptions.m4: New files.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Tue Mar 20 21:33:31 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* strtod.m4: Removed, not needed anymore.
+
+2007-01-08  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.16.1.
+	* lib-link.m4: Upgrade to gettext-0.16.1.
+	* lib-prefix.m4: Upgrade to gettext-0.16.1.
+	* nls.m4: Upgrade to gettext-0.16.1.
+	* po.m4: Upgrade to gettext-0.16.1.
+	* intl.m4: New file, copied in from move to current Autotools.
+	* intldir.m4: New file, copied in from move to current Autotools.
+	* lock.m4: New file, copied in from move to current Autotools.
+	* visibility.m4: New file, copied in from move to current Autotools.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Wed Jul  6 17:05:32 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* gettext.m4: Per Bruno Haible, revert the change for the test
+	for locale.h from Sergey Poznyakoff.
+
+Wed Jun  8 20:45:17 2005   Sergey Poznyakoff    <gray@Mirddin.farlep.net>
+
+	* gettext.m4: Move test for locale.h and LC_MESSAGES in AM_GNU_GETTEXT.
+	Makes things work when the library is external.
+
+Mon May 30 21:31:43 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* intmax_t.m4: Updated macro for intmax_t from Jim Meyering.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+2004-02-19  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* po.m4: Upgrade to gettext-0.14.1.
+
+2004-01-16  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.13.1.
+	* intmax.m4: New file, from gettext-0.13.1.
+	* lib-ld.m4: Upgrade to gettext-0.13.1.
+	* lib-prefix.m4: Upgrade to gettext-0.13.1.
+	* longdouble.m4: New file, from gettext-0.13.1.
+	* longlong.m4: Upgrade to gettext-0.13.1.
+	* po.m4: Upgrade to gettext-0.13.1.
+	* printf-posix.m4: New file, from gettext-0.13.1.
+	* signed.m4: New file, from gettext-0.13.1.
+	* size_max.m4: New file, from gettext-0.13.1.
+	* ulonglong.m4: Upgrade to gettext-0.13.1.
+	* wchar_t.m4: New file, from gettext-0.13.1.
+	* wint_t.m4: New file, from gettext-0.13.1.
+	* xsize.m4: New file, from gettext-0.13.1.
+	* Makefile.am: New file.
+
+Thu Jan 15 15:51:12 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* m4/arch.m4, m4/socket.m4, m4/strtod.m4: Quoting fixed for automake 1.8.x.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+2003-06-16  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.12.1.
+	* inttypes_h.m4: Upgrade to gettext-0.12.1.
+	* lib-ld.m4: Upgrade to gettext-0.12.1.
+	* lib-link.m4: Upgrade to gettext-0.12.1.
+	* lib-prefix.m4: Upgrade to gettext-0.12.1.
+	* nls.m4: New file, from gettext-0.12.1.
+	* po.m4: New file, from gettext-0.12.1.
+	* progtest.m4: Upgrade to gettext-0.12.1.
+	* stdint_h.m4: Upgrade to gettext-0.12.1.
+	* uintmax_t.m4: New file, from gettext-0.12.1.
+	* ulonglong.m4: New file, from gettext-0.12.1.
+	* Makefile.am: New file.
+
+2003-03-26  Paul Eggert  <eggert@twinsun.com>
+
+	* longlong.m4, intmax_t.m4: New files.
+	* ulonglong.m4, uintmax_t.m4: Removed.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Tue Feb  4 14:28:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	All relevant files: Copyright year updated to 2003.
+
+Wed Nov 20 13:15:59 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* arch.m4 (GAWK_AIX_TWEAK): Add -DGAWK_AIX for use in
+	io.c to get real pipes. Ugh.
+	Change test to -d /lpp so it actually works. Sigh.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+2002-04-28  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.11.2.
+	* isc-posix.m4: Upgrade to gettext-0.11.2.
+	* lib-link.m4: Upgrade to gettext-0.11.2.
+
+2002-04-09  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.11.1.
+
diff --git a/gawk-5.0.1/m4/ChangeLog.1 b/gawk-5.0.1/m4/ChangeLog.1
new file mode 100644
index 00000000000..476483a7fa4
--- /dev/null
+++ b/gawk-5.0.1/m4/ChangeLog.1
@@ -0,0 +1,193 @@
+2018-09-16  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.19.8.1.
+	* iconv.m4: Upgrade to gettext-0.19.8.1.
+	* lib-ld.m4: Upgrade to gettext-0.19.8.1.
+	* lib-link.m4: Upgrade to gettext-0.19.8.1.
+	* lib-prefix.m4: Upgrade to gettext-0.19.8.1.
+	* nls.m4: Upgrade to gettext-0.19.8.1.
+	* po.m4: Upgrade to gettext-0.19.8.1.
+	* progtest.m4: Upgrade to gettext-0.19.8.1.
+
+2018-03-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* extern-inline.m4, intl.m4: Updated.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-08-21         Daniel Richard G.     <skunk@iSKUNK.ORG>
+
+	* arch.m4: Improvements and enable compiling with unlocked stdio.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-02-22  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.19.7.
+	* lib-ld.m4: Upgrade to gettext-0.19.7.
+	* lib-link.m4: Upgrade to gettext-0.19.7.
+	* lib-prefix.m4: Upgrade to gettext-0.19.7.
+	* nls.m4: Upgrade to gettext-0.19.7.
+	* po.m4: Upgrade to gettext-0.19.7.
+	* progtest.m4: Upgrade to gettext-0.19.7.
+
+2016-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* arch.m4 (GAWK_AC_AIX_TWEAK): Remove definition.
+
+2016-01-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* arch.m4 (GAWK_AC_LINUX_ALPHA): Remove definition.
+
+2015-09-11	Daniel Richard G.	<skunk@iSKUNK.ORG>
+
+	* arch.m4: Rework again. In particular, provide a wrapper
+	for CC to work around some issues.
+
+2015-08-28	Daniel Richard G.	<skunk@iSKUNK.ORG>
+
+	* arch.m4: Complete rewrite of AC_ZOS_USS. It no longer
+	deletes awkgram.c and command.c on a z/OS system, as these are
+	now usable in EBCDIC-land without regeneration; it sets some
+	important CFLAGS/CPPFLAGS to enable standard compiler
+	behavior, like giving an error instead of a warning when a
+	header file cannot be found (!); prevents the use of cc(1),
+	which on z/OS does not build gawk correctly; and gives some
+	help to the user if s/he is building with c89(1), which
+	presents some difficulties due to its option syntax.
+
+2015-08-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* codeset.m4, glibc2.m4, glibc21.m4, intdiv0.m4, intl.m4,
+	intlmacosx.m4, intmax.m4, inttypes-pri.m4, inttypes_h.m4,
+	lcmessage.m4, lock.m4, longlong.m4, printf-posix.m4,
+	size_max.m4, stdint_h.m4, visibility.m4, wchar_t.m4,
+	wint_t.m4, xsize.m4: Updated via autoreconf -f -i.
+	* extern-inline.m4, fcntl-o.m4, threadlib.m4: Added.
+
+
+2015-06-15         Yuta SATOH            <nigoro@gentoo.gr.jp>
+
+	* readline.m4: Add check for libtermcap on Gentoo/FreeBSD.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* isc-posix.m4: Removed. No longer needed.
+
+2015-01-24  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* iconv.m4: Upgrade to gettext-0.19.4.
+	* po.m4: Upgrade to gettext-0.19.4.
+
+2014-11-19  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* gettext.m4: Upgrade to gettext-0.19.3.
+	* iconv.m4: Upgrade to gettext-0.19.3.
+	* lib-ld.m4: Upgrade to gettext-0.19.3.
+	* lib-link.m4: Upgrade to gettext-0.19.3.
+	* lib-prefix.m4: Upgrade to gettext-0.19.3.
+	* nls.m4: Upgrade to gettext-0.19.3.
+	* po.m4: Upgrade to gettext-0.19.3.
+	* progtest.m4: Upgrade to gettext-0.19.3.
+
+2014-10-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readline.m4: Enable cross compiling. Thanks to
+	Christer Solskogen <christer.solskogen@gmail.com> for
+	motivating and testing.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-03-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readline.m4: Add manual check for *bsd* OS and add -ltermcap
+	if so.  Hack, slash. Can you say "quick and dirty" boys and girls?
+	I knew you could.
+
+2013-10-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readline.m4: Add check for NULL return from readline() in
+	call to printf() for results. Thanks to Dagobert Michelsen
+	<dam@opencsw.org> for the report.
+
+2013-08-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readline.m4: Add additional code to check for history_list()
+	function. Patterned after checks in:
+	http://ftp.samba.org/pub/unpacked/samba_3_current/source4/lib/smbreadline/readline.m4
+	Thanks to Larry Baker (larry.baker@stanfordalumni.org) for the
+	pointer.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-01-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readline.m4: Add cross-compiling action.
+
+2013-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readline.m4 (GAWK_CHECK_READLINE): Renamed from GNUPG_CHECK_READLINE.
+	Test program changed and test changed to try to run the built program
+	since some systems don't notice a link dependency between libreadline
+	and other libs until runtime. Isn't that fun?
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-10-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* po.m4, intl.m4: Fix droppings left over from a git merge.
+
+2012-05-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* libtool.m4, ltoptions.m4, ltsugar.m4, ltversion.m4, lt~obsolete.m4:
+	Remove files related to libtool support.  Libtool usage has been
+	pushed down into the extension directory.
+
+2012-04-01         John Haque      <j.eh@mchsi.com>
+
+	* mpfr.m4: New file.
+
+2012-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Update to autoconf 2.69, automake 1.12.
+
+	* codeset.m4, glibc2.m4, glibc21.m4, intdiv0.m4, intl.m4, intldir.m4,
+	intlmacosx.m4, intmax.m4, inttypes-pri.m4, inttypes_h.m4, lcmessage.m4,
+	lock.m4, longlong.m4, printf-posix.m4, size_max.m4, stdint_h.m4,
+	uintmax_t.m4, visibility.m4, wchar_t.m4, wint_t.m4, xsize.m4: Updated.
+
+2012-03-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* noreturn.m4: New file.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/m4/arch.m4 b/gawk-5.0.1/m4/arch.m4
new file mode 100644
index 00000000000..bab9943a78c
--- /dev/null
+++ b/gawk-5.0.1/m4/arch.m4
@@ -0,0 +1,122 @@
+dnl
+dnl arch.m4 --- autoconf input file for gawk
+dnl
+dnl Copyright (C) 1995, 1996, 1998, 1999, 2000, 2003, 2004, 2015
+dnl the Free Software Foundation, Inc.
+dnl
+dnl This file is part of GAWK, the GNU implementation of the
+dnl AWK Progamming Language.
+dnl
+dnl GAWK is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl GAWK is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+dnl
+
+dnl Check for z/OS Unix Systems Services
+AC_DEFUN([AC_ZOS_USS], [
+AC_MSG_CHECKING([for z/OS USS compilation])
+AC_CACHE_VAL(ac_cv_zos_uss, [
+if test "OS/390" = "`uname`"
+then
+  ac_cv_zos_uss=yes
+else
+  ac_cv_zos_uss=no
+fi
+])dnl
+AC_MSG_RESULT([${ac_cv_zos_uss}])
+if test "x$ac_cv_zos_uss" = "xyes"
+then
+  dnl Identify the compiler.
+  ac_zos_uss_cc_id=unknown
+  echo " $CC " | $EGREP [' (/bin/)?c89[ |_]'] >/dev/null && ac_zos_uss_cc_id=c89
+  echo " $CC " | $EGREP [' (/bin/)?c99[ |_]'] >/dev/null && ac_zos_uss_cc_id=xlc
+  echo " $CC " | $EGREP [' (/bin/)?cc[ |_]']  >/dev/null && ac_zos_uss_cc_id=cc
+  echo " $CC " | $EGREP [' (/bin/)?xlc[ |_]'] >/dev/null && ac_zos_uss_cc_id=xlc
+  echo " $CC " | $EGREP [' (/bin/)?xlC[ |_]'] >/dev/null && ac_zos_uss_cc_id=xlc++
+  echo " $CC " | $EGREP [' (/bin/)?xlc\+\+[ |_]'] >/dev/null && ac_zos_uss_cc_id=xlc++
+  test "x$GCC" = "xyes" && ac_zos_uss_cc_id=gcc
+  dnl These feature test macros are needed on z/OS.
+  CPPFLAGS="$CPPFLAGS -D_ALL_SOURCE -D_OPEN_SYS_UNLOCKED_EXT"
+  test "$ac_zos_uss_cc_id" != xlc++ && CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600"
+  case "$ac_zos_uss_cc_id" in
+  c89)
+    dnl If the user has set CC=c89 and _C89_OPTIONS, then don't get in
+    dnl their way.  c89 (as well as cc) pre-dates xlc, and accepts an
+    dnl option syntax that involves parentheses and cannot be handled
+    dnl in the usual way in C(PP)FLAGS.  However, c89 will also accept
+    dnl options via the aforementioned environment variable, which
+    dnl gives the user one way around the problem.  (If you're
+    dnl wondering about cc, it is meant for programs written in
+    dnl "Common Usage C" [a.k.a. K&R C] as opposed to "Standard C"
+    dnl [a.k.a. ANSI], and does not build gawk correctly.)
+    if test -n "$_C89_OPTIONS"
+    then
+      AC_MSG_NOTICE([CC = $CC])
+      AC_MSG_NOTICE([_C89_OPTIONS = $_C89_OPTIONS])
+    else
+      AC_MSG_ERROR([c89-setup-required
+To build GNU Awk using "c89", please set
+
+    _C89_OPTIONS="-W c,langlvl(stdc99,libext),haltonmsg(CCN3296)"
+
+in your environment, and reconfigure. (The above flags cannot be specified
+in CFLAGS/CPPFLAGS, due to the parentheses.)])
+    fi
+    ;;
+  gcc)
+    dnl GCC has not yet been ported to z/OS as of this writing
+    ;;
+  cc)
+    AC_MSG_ERROR([cc-invalid
+The z/OS "cc" compiler does not build GNU Awk correctly.
+
+If the "xlc" or "c89" compiler is available, please set CC accordingly
+and reconfigure. ("xlc" is the recommended compiler on z/OS.)])
+    ;;
+  xlc*)
+    dnl This enables C99, and on z/OS 1.11, the setenv() prototype.
+    CFLAGS="$CFLAGS -qlanglvl=stdc99:libext"
+    dnl Use a compiler wrapper script to address some annoyances.
+    cat >zos-cc <<EOF
+#!/bin/sh
+#
+# This wrapper script addresses two annoying peculiarities of the IBM
+# xlc/c99 compiler on z/OS:
+#
+# 1. Missing header files are considered warnings by default rather
+#    than fatal errors;
+#
+# 2. Include directories specified with -I are searched _after_ the
+#    system include directories (for #include<> directives) rather
+#    than before.
+#
+# This script allows the code and the build system to assume standard
+# compiler behavior.
+#
+
+PS4='zos-cc: '
+REAL_CC="$CC"
+
+set -x
+\$REAL_CC -qhaltonmsg=CCN3296 -qnosearch "\$[]@" -qsearch=/usr/include
+EOF
+    chmod +x zos-cc
+    AC_MSG_NOTICE([wrapping $CC with zos-cc to obtain standard behavior])
+    CC="`pwd`/zos-cc"
+    ;;
+  *)
+    AC_MSG_WARN([unrecognized compiler environment])
+    ;;
+  esac
+fi # ac_cv_zos_uss = yes
+])dnl
diff --git a/gawk-5.0.1/m4/codeset.m4 b/gawk-5.0.1/m4/codeset.m4
new file mode 100644
index 00000000000..d7de8d67e0d
--- /dev/null
+++ b/gawk-5.0.1/m4/codeset.m4
@@ -0,0 +1,23 @@
+# codeset.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2006, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+  AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset],
+    [AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <langinfo.h>]],
+          [[char* cs = nl_langinfo(CODESET); return !cs;]])],
+       [am_cv_langinfo_codeset=yes],
+       [am_cv_langinfo_codeset=no])
+    ])
+  if test $am_cv_langinfo_codeset = yes; then
+    AC_DEFINE([HAVE_LANGINFO_CODESET], [1],
+      [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+  fi
+])
diff --git a/gawk-5.0.1/m4/extern-inline.m4 b/gawk-5.0.1/m4/extern-inline.m4
new file mode 100644
index 00000000000..72800650e6f
--- /dev/null
+++ b/gawk-5.0.1/m4/extern-inline.m4
@@ -0,0 +1,101 @@
+dnl 'extern inline' a la ISO C99.
+
+dnl Copyright 2012-2015 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_EXTERN_INLINE],
+[
+  AH_VERBATIM([extern_inline],
+[/* Please see the Gnulib manual for how to use these macros.
+
+   Suppress extern inline with HP-UX cc, as it appears to be broken; see
+   <http://lists.gnu.org/archive/html/bug-texinfo/2013-02/msg00030.html>.
+
+   Suppress extern inline with Sun C in standards-conformance mode, as it
+   mishandles inline functions that call each other.  E.g., for 'inline void f
+   (void) { } inline void g (void) { f (); }', c99 incorrectly complains
+   'reference to static identifier "f" in extern inline function'.
+   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
+
+   Suppress extern inline (with or without __attribute__ ((__gnu_inline__)))
+   on configurations that mistakenly use 'static inline' to implement
+   functions or macros in standard C headers like <ctype.h>.  For example,
+   if isdigit is mistakenly implemented via a static inline function,
+   a program containing an extern inline function that calls isdigit
+   may not work since the C standard prohibits extern inline functions
+   from calling static functions.  This bug is known to occur on:
+
+     OS X 10.8 and earlier; see:
+     http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html
+
+     DragonFly; see
+     http://muscles.dragonflybsd.org/bulk/bleeding-edge-potential/latest-per-pkg/ah-tty-0.3.12.log
+
+     FreeBSD; see:
+     http://lists.gnu.org/archive/html/bug-gnulib/2014-07/msg00104.html
+
+   OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
+   for clang but remains for g++; see <http://trac.macports.org/ticket/41033>.
+   Assume DragonFly and FreeBSD will be similar.  */
+#if (((defined __APPLE__ && defined __MACH__) \
+      || defined __DragonFly__ || defined __FreeBSD__) \
+     && (defined __header_inline \
+         ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
+            && ! defined __clang__) \
+         : ((! defined _DONT_USE_CTYPE_INLINE_ \
+             && (defined __GNUC__ || defined __cplusplus)) \
+            || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
+                && defined __GNUC__ && ! defined __cplusplus))))
+# define _GL_EXTERN_INLINE_STDHEADER_BUG
+#endif
+#if ((__GNUC__ \
+      ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
+      : (199901L <= __STDC_VERSION__ \
+         && !defined __HP_cc \
+         && !(defined __SUNPRO_C && __STDC__))) \
+     && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# define _GL_INLINE inline
+# define _GL_EXTERN_INLINE extern inline
+# define _GL_EXTERN_INLINE_IN_USE
+#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
+       && !defined _GL_EXTERN_INLINE_STDHEADER_BUG)
+# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
+   /* __gnu_inline__ suppresses a GCC 4.2 diagnostic.  */
+#  define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
+# else
+#  define _GL_INLINE extern inline
+# endif
+# define _GL_EXTERN_INLINE extern
+# define _GL_EXTERN_INLINE_IN_USE
+#else
+# define _GL_INLINE static _GL_UNUSED
+# define _GL_EXTERN_INLINE static _GL_UNUSED
+#endif
+
+/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
+   suppress bogus "no previous prototype for 'FOO'"
+   and "no previous declaration for 'FOO'" diagnostics,
+   when FOO is an inline function in the header; see
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
+   <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>.  */
+#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
+# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
+#  define _GL_INLINE_HEADER_CONST_PRAGMA
+# else
+#  define _GL_INLINE_HEADER_CONST_PRAGMA \
+     _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
+# endif
+# define _GL_INLINE_HEADER_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
+    _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
+    _GL_INLINE_HEADER_CONST_PRAGMA
+# define _GL_INLINE_HEADER_END \
+    _Pragma ("GCC diagnostic pop")
+#else
+# define _GL_INLINE_HEADER_BEGIN
+# define _GL_INLINE_HEADER_END
+#endif])
+])
diff --git a/gawk-5.0.1/m4/fcntl-o.m4 b/gawk-5.0.1/m4/fcntl-o.m4
new file mode 100644
index 00000000000..43c93124ed5
--- /dev/null
+++ b/gawk-5.0.1/m4/fcntl-o.m4
@@ -0,0 +1,134 @@
+# fcntl-o.m4 serial 4
+dnl Copyright (C) 2006, 2009-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Written by Paul Eggert.
+
+# Test whether the flags O_NOATIME and O_NOFOLLOW actually work.
+# Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise.
+# Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise.
+AC_DEFUN([gl_FCNTL_O_FLAGS],
+[
+  dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
+  dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
+  dnl AC_GNU_SOURCE.
+  m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
+    [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
+    [AC_REQUIRE([AC_GNU_SOURCE])])
+
+  AC_CHECK_HEADERS_ONCE([unistd.h])
+  AC_CHECK_FUNCS_ONCE([symlink])
+  AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
+    [AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <sys/types.h>
+           #include <sys/stat.h>
+           #if HAVE_UNISTD_H
+           # include <unistd.h>
+           #else /* on Windows with MSVC */
+           # include <io.h>
+           # include <stdlib.h>
+           # defined sleep(n) _sleep ((n) * 1000)
+           #endif
+           #include <fcntl.h>
+           #ifndef O_NOATIME
+            #define O_NOATIME 0
+           #endif
+           #ifndef O_NOFOLLOW
+            #define O_NOFOLLOW 0
+           #endif
+           static int const constants[] =
+            {
+              O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
+              O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
+            };
+          ]],
+          [[
+            int result = !constants;
+            #if HAVE_SYMLINK
+            {
+              static char const sym[] = "conftest.sym";
+              if (symlink ("/dev/null", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_WRONLY | O_NOFOLLOW | O_CREAT, 0);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              if (unlink (sym) != 0 || symlink (".", sym) != 0)
+                result |= 2;
+              else
+                {
+                  int fd = open (sym, O_RDONLY | O_NOFOLLOW);
+                  if (fd >= 0)
+                    {
+                      close (fd);
+                      result |= 4;
+                    }
+                }
+              unlink (sym);
+            }
+            #endif
+            {
+              static char const file[] = "confdefs.h";
+              int fd = open (file, O_RDONLY | O_NOATIME);
+              if (fd < 0)
+                result |= 8;
+              else
+                {
+                  struct stat st0;
+                  if (fstat (fd, &st0) != 0)
+                    result |= 16;
+                  else
+                    {
+                      char c;
+                      sleep (1);
+                      if (read (fd, &c, 1) != 1)
+                        result |= 24;
+                      else
+                        {
+                          if (close (fd) != 0)
+                            result |= 32;
+                          else
+                            {
+                              struct stat st1;
+                              if (stat (file, &st1) != 0)
+                                result |= 40;
+                              else
+                                if (st0.st_atime != st1.st_atime)
+                                  result |= 64;
+                            }
+                        }
+                    }
+                }
+            }
+            return result;]])],
+       [gl_cv_header_working_fcntl_h=yes],
+       [case $? in #(
+        4) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+        64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+        68) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+         *) gl_cv_header_working_fcntl_h='no';;
+        esac],
+       [gl_cv_header_working_fcntl_h=cross-compiling])])
+
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
+    [Define to 1 if O_NOATIME works.])
+
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
+    [Define to 1 if O_NOFOLLOW works.])
+])
diff --git a/gawk-5.0.1/m4/gettext.m4 b/gawk-5.0.1/m4/gettext.m4
new file mode 100644
index 00000000000..eef5073b32c
--- /dev/null
+++ b/gawk-5.0.1/m4/gettext.m4
@@ -0,0 +1,420 @@
+# gettext.m4 serial 68 (gettext-0.19.8)
+dnl Copyright (C) 1995-2014, 2016 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl    default (if it is not specified or empty) is 'no-libtool'.
+dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl    depending on --{enable,disable}-{shared,static} and on the presence of
+dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl    $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl    implementations (in libc or libintl) without the ngettext() function
+dnl    will be ignored.  If NEEDSYMBOL is specified and is
+dnl    'need-formatstring-macros', then GNU gettext implementations that don't
+dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries.  If empty,
+dnl    the value '$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl    and used.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl    Catalog format: none
+dnl    Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+  dnl Argument checking.
+  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+  ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old],
+    [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])])
+  ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+  define([gt_included_intl],
+    ifelse([$1], [external],
+      ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]),
+      [yes]))
+  define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], []))
+  gt_NEEDS_INIT
+  AM_GNU_GETTEXT_NEED([$2])
+
+  AC_REQUIRE([AM_PO_SUBDIRS])dnl
+  ifelse(gt_included_intl, yes, [
+    AC_REQUIRE([AM_INTL_SUBDIR])dnl
+  ])
+
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Sometimes libintl requires libiconv, so first search for libiconv.
+  dnl Ideally we would do this search only after the
+  dnl      if test "$USE_NLS" = "yes"; then
+  dnl        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+  dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+  dnl the configure script would need to contain the same shell code
+  dnl again, outside any 'if'. There are two solutions:
+  dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+  dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+  dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+  dnl documented, we avoid it.
+  ifelse(gt_included_intl, yes, , [
+    AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+  ])
+
+  dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation.
+  gt_INTL_MACOSX
+
+  dnl Set USE_NLS.
+  AC_REQUIRE([AM_NLS])
+
+  ifelse(gt_included_intl, yes, [
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+  ])
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+  dnl Add a version number to the cache macros.
+  case " $gt_needs " in
+    *" need-formatstring-macros "*) gt_api_version=3 ;;
+    *" need-ngettext "*) gt_api_version=2 ;;
+    *) gt_api_version=1 ;;
+  esac
+  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
+  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"
+
+  dnl If we use NLS figure out what method
+  if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+    ifelse(gt_included_intl, yes, [
+      AC_MSG_CHECKING([whether included gettext is requested])
+      AC_ARG_WITH([included-gettext],
+        [  --with-included-gettext use the GNU gettext library included here],
+        nls_cv_force_use_gnu_gettext=$withval,
+        nls_cv_force_use_gnu_gettext=no)
+      AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+    ])
+        dnl User does not insist on using GNU NLS library.  Figure out what
+        dnl to use.  If GNU gettext is available we use this.  Else we have
+        dnl to fall back to GNU NLS library.
+
+        if test $gt_api_version -ge 3; then
+          gt_revision_test_code='
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+'
+        else
+          gt_revision_test_code=
+        fi
+        if test $gt_api_version -ge 2; then
+          gt_expression_test_code=' + * ngettext ("", "", 0)'
+        else
+          gt_expression_test_code=
+        fi
+
+        AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc],
+         [AC_LINK_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[
+#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings)
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+               ]],
+               [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+               ]])],
+            [eval "$gt_func_gnugettext_libc=yes"],
+            [eval "$gt_func_gnugettext_libc=no"])])
+
+        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then
+          dnl Sometimes libintl requires libiconv, so first search for libiconv.
+          ifelse(gt_included_intl, yes, , [
+            AM_ICONV_LINK
+          ])
+          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+          dnl even if libiconv doesn't exist.
+          AC_LIB_LINKFLAGS_BODY([intl])
+          AC_CACHE_CHECK([for GNU gettext in libintl],
+            [$gt_func_gnugettext_libintl],
+           [gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+            dnl Now see whether libintl exists and does not depend on libiconv.
+            AC_LINK_IFELSE(
+              [AC_LANG_PROGRAM(
+                 [[
+#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias (""))
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+                 ]],
+                 [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+                 ]])],
+              [eval "$gt_func_gnugettext_libintl=yes"],
+              [eval "$gt_func_gnugettext_libintl=no"])
+            dnl Now see whether libintl exists and depends on libiconv.
+            if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              AC_LINK_IFELSE(
+                [AC_LANG_PROGRAM(
+                   [[
+#include <libintl.h>
+#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias (const char *);
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias (""))
+#else
+#define __GNU_GETTEXT_SYMBOL_EXPRESSION 0
+#endif
+$gt_revision_test_code
+                   ]],
+                   [[
+bindtextdomain ("", "");
+return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION
+                   ]])],
+                [LIBINTL="$LIBINTL $LIBICONV"
+                 LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                 eval "$gt_func_gnugettext_libintl=yes"
+                ])
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"])
+        fi
+
+        dnl If an already present or preinstalled GNU gettext() is found,
+        dnl use it.  But if this macro is used in GNU gettext, and GNU
+        dnl gettext is already preinstalled in libintl, we update this
+        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
+        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
+           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+          dnl Reset the values set by searching for libintl.
+          LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+    ifelse(gt_included_intl, yes, [
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+          dnl GNU gettext is not found in the C library.
+          dnl Fall back on included GNU gettext library.
+          nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions used to generate GNU NLS library.
+        BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD"
+        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      CATOBJEXT=
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions to use GNU gettext tools.
+        CATOBJEXT=.gmo
+      fi
+    ])
+
+    if test -n "$INTL_MACOSX_LIBS"; then
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Some extra flags are needed during linking.
+        LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
+        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
+      fi
+    fi
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+      AC_DEFINE([ENABLE_NLS], [1],
+        [Define to 1 if translation of program messages to the user's native language
+   is requested.])
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  AC_MSG_CHECKING([whether to use NLS])
+  AC_MSG_RESULT([$USE_NLS])
+  if test "$USE_NLS" = "yes"; then
+    AC_MSG_CHECKING([where the gettext function comes from])
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    AC_MSG_RESULT([$gt_source])
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
+        AC_MSG_CHECKING([how to link with libintl])
+        AC_MSG_RESULT([$LIBINTL])
+        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+      fi
+
+      dnl For backward compatibility. Some packages may be using this.
+      AC_DEFINE([HAVE_GETTEXT], [1],
+       [Define if the GNU gettext() function is already present or preinstalled.])
+      AC_DEFINE([HAVE_DCGETTEXT], [1],
+       [Define if the GNU dcgettext() function is already present or preinstalled.])
+    fi
+
+    dnl We need to process the po/ directory.
+    POSUB=po
+  fi
+
+  ifelse(gt_included_intl, yes, [
+    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+    dnl to 'yes' because some of the testsuite requires it.
+    if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+    dnl Make all variables we use known to autoconf.
+    AC_SUBST([BUILD_INCLUDED_LIBINTL])
+    AC_SUBST([USE_INCLUDED_LIBINTL])
+    AC_SUBST([CATOBJEXT])
+
+    dnl For backward compatibility. Some configure.ins may be using this.
+    nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    DATADIRNAME=share
+    AC_SUBST([DATADIRNAME])
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INSTOBJEXT=.mo
+    AC_SUBST([INSTOBJEXT])
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    GENCAT=gencat
+    AC_SUBST([GENCAT])
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INTLOBJS=
+    if test "$USE_INCLUDED_LIBINTL" = yes; then
+      INTLOBJS="\$(GETTOBJS)"
+    fi
+    AC_SUBST([INTLOBJS])
+
+    dnl Enable libtool support if the surrounding package wishes it.
+    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+    AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
+  ])
+
+  dnl For backward compatibility. Some Makefiles may be using this.
+  INTLLIBS="$LIBINTL"
+  AC_SUBST([INTLLIBS])
+
+  dnl Make all documented variables known to autoconf.
+  AC_SUBST([LIBINTL])
+  AC_SUBST([LTLIBINTL])
+  AC_SUBST([POSUB])
+])
+
+
+dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized.
+m4_define([gt_NEEDS_INIT],
+[
+  m4_divert_text([DEFAULTS], [gt_needs=])
+  m4_define([gt_NEEDS_INIT], [])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL])
+AC_DEFUN([AM_GNU_GETTEXT_NEED],
+[
+  m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
+
+
+dnl Usage: AM_GNU_GETTEXT_REQUIRE_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_REQUIRE_VERSION], [])
diff --git a/gawk-5.0.1/m4/glibc2.m4 b/gawk-5.0.1/m4/glibc2.m4
new file mode 100644
index 00000000000..71dd8a1234b
--- /dev/null
+++ b/gawk-5.0.1/m4/glibc2.m4
@@ -0,0 +1,31 @@
+# glibc2.m4 serial 3
+dnl Copyright (C) 2000-2002, 2004, 2008, 2010-2014 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.0 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([gt_GLIBC2],
+  [
+    AC_CACHE_CHECK([whether we are using the GNU C Library 2 or newer],
+      [ac_cv_gnu_library_2],
+      [AC_EGREP_CPP([Lucky GNU user],
+        [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ >= 2) && !defined __UCLIBC__
+  Lucky GNU user
+ #endif
+#endif
+        ],
+        [ac_cv_gnu_library_2=yes],
+        [ac_cv_gnu_library_2=no])
+      ]
+    )
+    AC_SUBST([GLIBC2])
+    GLIBC2="$ac_cv_gnu_library_2"
+  ]
+)
diff --git a/gawk-5.0.1/m4/glibc21.m4 b/gawk-5.0.1/m4/glibc21.m4
new file mode 100644
index 00000000000..ab58b712137
--- /dev/null
+++ b/gawk-5.0.1/m4/glibc21.m4
@@ -0,0 +1,34 @@
+# glibc21.m4 serial 5
+dnl Copyright (C) 2000-2002, 2004, 2008, 2010-2014 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+# Test for the GNU C Library, version 2.1 or newer, or uClibc.
+# From Bruno Haible.
+
+AC_DEFUN([gl_GLIBC21],
+  [
+    AC_CACHE_CHECK([whether we are using the GNU C Library >= 2.1 or uClibc],
+      [ac_cv_gnu_library_2_1],
+      [AC_EGREP_CPP([Lucky],
+        [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+  Lucky GNU user
+ #endif
+#endif
+#ifdef __UCLIBC__
+ Lucky user
+#endif
+        ],
+        [ac_cv_gnu_library_2_1=yes],
+        [ac_cv_gnu_library_2_1=no])
+      ]
+    )
+    AC_SUBST([GLIBC21])
+    GLIBC21="$ac_cv_gnu_library_2_1"
+  ]
+)
diff --git a/gawk-5.0.1/m4/iconv.m4 b/gawk-5.0.1/m4/iconv.m4
new file mode 100644
index 00000000000..aa159c539a8
--- /dev/null
+++ b/gawk-5.0.1/m4/iconv.m4
@@ -0,0 +1,271 @@
+# iconv.m4 serial 19 (gettext-0.18.2)
+dnl Copyright (C) 2000-2002, 2007-2014, 2016 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+  dnl those with the standalone portable GNU libiconv installed).
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libiconv and not disabled its use
+  dnl via --without-libiconv-prefix, he wants to use it. The first
+  dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+  AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM(
+         [[
+#include <stdlib.h>
+#include <iconv.h>
+         ]],
+         [[iconv_t cd = iconv_open("","");
+           iconv(cd,NULL,NULL,NULL,NULL);
+           iconv_close(cd);]])],
+      [am_cv_func_iconv=yes])
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[
+#include <stdlib.h>
+#include <iconv.h>
+           ]],
+           [[iconv_t cd = iconv_open("","");
+             iconv(cd,NULL,NULL,NULL,NULL);
+             iconv_close(cd);]])],
+        [am_cv_lib_iconv=yes]
+        [am_cv_func_iconv=yes])
+      LIBS="$am_save_LIBS"
+    fi
+  ])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
+      dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
+      dnl Solaris 10.
+      am_save_LIBS="$LIBS"
+      if test $am_cv_lib_iconv = yes; then
+        LIBS="$LIBS $LIBICONV"
+      fi
+      am_cv_func_iconv_works=no
+      for ac_iconv_const in '' 'const'; do
+        AC_RUN_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[
+#include <iconv.h>
+#include <string.h>
+
+#ifndef ICONV_CONST
+# define ICONV_CONST $ac_iconv_const
+#endif
+             ]],
+             [[int result = 0;
+  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
+     returns.  */
+  {
+    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
+    if (cd_utf8_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_utf8_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 1;
+        iconv_close (cd_utf8_to_88591);
+      }
+  }
+  /* Test against Solaris 10 bug: Failures are not distinguishable from
+     successful returns.  */
+  {
+    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
+    if (cd_ascii_to_88591 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\263";
+        char buf[10];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_ascii_to_88591,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res == 0)
+          result |= 2;
+        iconv_close (cd_ascii_to_88591);
+      }
+  }
+  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304";
+        static char buf[2] = { (char)0xDE, (char)0xAD };
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = 1;
+        char *outptr = buf;
+        size_t outbytesleft = 1;
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
+          result |= 4;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#if 0 /* This bug could be worked around by the caller.  */
+  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
+  {
+    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
+    if (cd_88591_to_utf8 != (iconv_t)(-1))
+      {
+        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
+        char buf[50];
+        ICONV_CONST char *inptr = input;
+        size_t inbytesleft = strlen (input);
+        char *outptr = buf;
+        size_t outbytesleft = sizeof (buf);
+        size_t res = iconv (cd_88591_to_utf8,
+                            &inptr, &inbytesleft,
+                            &outptr, &outbytesleft);
+        if ((int)res > 0)
+          result |= 8;
+        iconv_close (cd_88591_to_utf8);
+      }
+  }
+#endif
+  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
+     provided.  */
+  if (/* Try standardized names.  */
+      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
+      /* Try IRIX, OSF/1 names.  */
+      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
+      /* Try AIX names.  */
+      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
+      /* Try HP-UX names.  */
+      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
+    result |= 16;
+  return result;
+]])],
+          [am_cv_func_iconv_works=yes], ,
+          [case "$host_os" in
+             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
+             *)            am_cv_func_iconv_works="guessing yes" ;;
+           esac])
+        test "$am_cv_func_iconv_works" = no || break
+      done
+      LIBS="$am_save_LIBS"
+    ])
+    case "$am_cv_func_iconv_works" in
+      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
+      *)   am_func_iconv=yes ;;
+    esac
+  else
+    am_func_iconv=no am_cv_lib_iconv=no
+  fi
+  if test "$am_func_iconv" = yes; then
+    AC_DEFINE([HAVE_ICONV], [1],
+      [Define if you have the iconv() function and it works.])
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    AC_MSG_CHECKING([how to link with libiconv])
+    AC_MSG_RESULT([$LIBICONV])
+  else
+    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+    dnl either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  AC_SUBST([LIBICONV])
+  AC_SUBST([LTLIBICONV])
+])
+
+dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
+dnl avoid warnings like
+dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
+dnl This is tricky because of the way 'aclocal' is implemented:
+dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
+dnl   Otherwise aclocal's initial scan pass would miss the macro definition.
+dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
+dnl   Otherwise aclocal would emit many "Use of uninitialized value $1"
+dnl   warnings.
+m4_define([gl_iconv_AC_DEFUN],
+  m4_version_prereq([2.64],
+    [[AC_DEFUN_ONCE(
+        [$1], [$2])]],
+    [m4_ifdef([gl_00GNULIB],
+       [[AC_DEFUN_ONCE(
+           [$1], [$2])]],
+       [[AC_DEFUN(
+           [$1], [$2])]])]))
+gl_iconv_AC_DEFUN([AM_ICONV],
+[
+  AM_ICONV_LINK
+  if test "$am_cv_func_iconv" = yes; then
+    AC_MSG_CHECKING([for iconv declaration])
+    AC_CACHE_VAL([am_cv_proto_iconv], [
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+           ]],
+           [[]])],
+        [am_cv_proto_iconv_arg1=""],
+        [am_cv_proto_iconv_arg1="const"])
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    AC_MSG_RESULT([
+         $am_cv_proto_iconv])
+    AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
+      [Define as const if the declaration of iconv() needs const.])
+    dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
+    m4_ifdef([gl_ICONV_H_DEFAULTS],
+      [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
+       if test -n "$am_cv_proto_iconv_arg1"; then
+         ICONV_CONST="const"
+       fi
+      ])
+  fi
+])
diff --git a/gawk-5.0.1/m4/intdiv0.m4 b/gawk-5.0.1/m4/intdiv0.m4
new file mode 100644
index 00000000000..afa9acb82c0
--- /dev/null
+++ b/gawk-5.0.1/m4/intdiv0.m4
@@ -0,0 +1,87 @@
+# intdiv0.m4 serial 6 (gettext-0.18.2)
+dnl Copyright (C) 2002, 2007-2008, 2010-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gt_INTDIV0],
+[
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+  AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
+    gt_cv_int_divbyzero_sigfpe,
+    [
+      gt_cv_int_divbyzero_sigfpe=
+changequote(,)dnl
+      case "$host_os" in
+        macos* | darwin[6-9]* | darwin[1-9][0-9]*)
+          # On Mac OS X 10.2 or newer, just assume the same as when cross-
+          # compiling. If we were to perform the real test, 1 Crash Report
+          # dialog window would pop up.
+          case "$host_cpu" in
+            i[34567]86 | x86_64)
+              gt_cv_int_divbyzero_sigfpe="guessing yes" ;;
+          esac
+          ;;
+      esac
+changequote([,])dnl
+      if test -z "$gt_cv_int_divbyzero_sigfpe"; then
+        AC_RUN_IFELSE(
+          [AC_LANG_SOURCE([[
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+sigfpe_handler (int sig)
+{
+  /* Exit with code 0 if SIGFPE, with code 1 if any other signal.  */
+  exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+  signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP.  */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+  signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL.  */
+#if defined (__sparc__) && defined (__linux__)
+  signal (SIGILL, sigfpe_handler);
+#endif
+
+  z = x / y;
+  nan = y / y;
+  exit (2);
+}
+]])],
+          [gt_cv_int_divbyzero_sigfpe=yes],
+          [gt_cv_int_divbyzero_sigfpe=no],
+          [
+            # Guess based on the CPU.
+changequote(,)dnl
+            case "$host_cpu" in
+              alpha* | i[34567]86 | x86_64 | m68k | s390*)
+                gt_cv_int_divbyzero_sigfpe="guessing yes";;
+              *)
+                gt_cv_int_divbyzero_sigfpe="guessing no";;
+            esac
+changequote([,])dnl
+          ])
+      fi
+    ])
+  case "$gt_cv_int_divbyzero_sigfpe" in
+    *yes) value=1;;
+    *) value=0;;
+  esac
+  AC_DEFINE_UNQUOTED([INTDIV0_RAISES_SIGFPE], [$value],
+    [Define if integer division by zero raises signal SIGFPE.])
+])
diff --git a/gawk-5.0.1/m4/intl.m4 b/gawk-5.0.1/m4/intl.m4
new file mode 100644
index 00000000000..5cd7863d40a
--- /dev/null
+++ b/gawk-5.0.1/m4/intl.m4
@@ -0,0 +1,304 @@
+# intl.m4 serial 29 (gettext-0.19)
+dnl Copyright (C) 1995-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2009.
+
+AC_PREREQ([2.60])
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl            USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+  AC_REQUIRE([gt_GLIBC2])dnl
+  AC_REQUIRE([AC_PROG_RANLIB])dnl
+  AC_REQUIRE([gl_VISIBILITY])dnl
+  AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl
+  AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl
+  AC_REQUIRE([gt_TYPE_WCHAR_T])dnl
+  AC_REQUIRE([gt_TYPE_WINT_T])dnl
+  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([gt_TYPE_INTMAX_T])
+  AC_REQUIRE([gt_PRINTF_POSIX])
+  AC_REQUIRE([gl_GLIBC21])dnl
+  AC_REQUIRE([gl_XSIZE])dnl
+  AC_REQUIRE([gl_FCNTL_O_FLAGS])dnl
+  AC_REQUIRE([gt_INTL_MACOSX])dnl
+  AC_REQUIRE([gl_EXTERN_INLINE])dnl
+  AC_REQUIRE([gt_GL_ATTRIBUTE])dnl
+
+  dnl Support for automake's --enable-silent-rules.
+  case "$enable_silent_rules" in
+    yes) INTL_DEFAULT_VERBOSITY=0;;
+    no)  INTL_DEFAULT_VERBOSITY=1;;
+    *)   INTL_DEFAULT_VERBOSITY=1;;
+  esac
+  AC_SUBST([INTL_DEFAULT_VERBOSITY])
+
+  AC_CHECK_TYPE([ptrdiff_t], ,
+    [AC_DEFINE([ptrdiff_t], [long],
+       [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+    ])
+  AC_CHECK_HEADERS([features.h stddef.h stdlib.h string.h])
+  AC_CHECK_FUNCS([asprintf fwprintf newlocale putenv setenv setlocale \
+    snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb])
+
+  dnl Use the _snprintf function only if it is declared (because on NetBSD it
+  dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+  AC_CHECK_DECLS([_snprintf, _snwprintf], , , [#include <stdio.h>])
+
+  dnl Use the *_unlocked functions only if they are declared.
+  dnl (because some of them were defined without being declared in Solaris
+  dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+  dnl on Solaris 2.5.1 to run on Solaris 2.6).
+  AC_CHECK_DECLS([getc_unlocked], , , [#include <stdio.h>])
+
+  case $gt_cv_func_printf_posix in
+    *yes) HAVE_POSIX_PRINTF=1 ;;
+    *) HAVE_POSIX_PRINTF=0 ;;
+  esac
+  AC_SUBST([HAVE_POSIX_PRINTF])
+  if test "$ac_cv_func_asprintf" = yes; then
+    HAVE_ASPRINTF=1
+  else
+    HAVE_ASPRINTF=0
+  fi
+  AC_SUBST([HAVE_ASPRINTF])
+  if test "$ac_cv_func_snprintf" = yes; then
+    HAVE_SNPRINTF=1
+  else
+    HAVE_SNPRINTF=0
+  fi
+  AC_SUBST([HAVE_SNPRINTF])
+  if test "$ac_cv_func_newlocale" = yes; then
+    HAVE_NEWLOCALE=1
+  else
+    HAVE_NEWLOCALE=0
+  fi
+  AC_SUBST([HAVE_NEWLOCALE])
+  if test "$ac_cv_func_wprintf" = yes; then
+    HAVE_WPRINTF=1
+  else
+    HAVE_WPRINTF=0
+  fi
+  AC_SUBST([HAVE_WPRINTF])
+
+  AM_LANGINFO_CODESET
+  gt_LC_MESSAGES
+
+  dnl Compilation on mingw and Cygwin needs special Makefile rules, because
+  dnl 1. when we install a shared library, we must arrange to export
+  dnl    auxiliary pointer variables for every exported variable,
+  dnl 2. when we install a shared library and a static library simultaneously,
+  dnl    the include file specifies __declspec(dllimport) and therefore we
+  dnl    must arrange to define the auxiliary pointer variables for the
+  dnl    exported variables _also_ in the static library.
+  if test "$enable_shared" = yes; then
+    case "$host_os" in
+      mingw* | cygwin*) is_woe32dll=yes ;;
+      *) is_woe32dll=no ;;
+    esac
+  else
+    is_woe32dll=no
+  fi
+  WOE32DLL=$is_woe32dll
+  AC_SUBST([WOE32DLL])
+
+  dnl On mingw and Cygwin, we can activate special Makefile rules which add
+  dnl version information to the shared libraries and executables.
+  case "$host_os" in
+    mingw* | cygwin*) is_woe32=yes ;;
+    *) is_woe32=no ;;
+  esac
+  WOE32=$is_woe32
+  AC_SUBST([WOE32])
+  if test $WOE32 = yes; then
+    dnl Check for a program that compiles Windows resource files.
+    AC_CHECK_TOOL([WINDRES], [windres])
+  fi
+
+  dnl Determine whether when creating a library, "-lc" should be passed to
+  dnl libtool or not. On many platforms, it is required for the libtool option
+  dnl -no-undefined to work. On HP-UX, however, the -lc - stored by libtool
+  dnl in the *.la files - makes it impossible to create multithreaded programs,
+  dnl because libtool also reorders the -lc to come before the -pthread, and
+  dnl this disables pthread_create() <http://docs.hp.com/en/1896/pthreads.html>.
+  case "$host_os" in
+    hpux*) LTLIBC="" ;;
+    *)     LTLIBC="-lc" ;;
+  esac
+  AC_SUBST([LTLIBC])
+
+  dnl Rename some macros and functions used for locking.
+  AH_BOTTOM([
+#define __libc_lock_t                   gl_lock_t
+#define __libc_lock_define              gl_lock_define
+#define __libc_lock_define_initialized  gl_lock_define_initialized
+#define __libc_lock_init                gl_lock_init
+#define __libc_lock_lock                gl_lock_lock
+#define __libc_lock_unlock              gl_lock_unlock
+#define __libc_lock_recursive_t                   gl_recursive_lock_t
+#define __libc_lock_define_recursive              gl_recursive_lock_define
+#define __libc_lock_define_initialized_recursive  gl_recursive_lock_define_initialized
+#define __libc_lock_init_recursive                gl_recursive_lock_init
+#define __libc_lock_lock_recursive                gl_recursive_lock_lock
+#define __libc_lock_unlock_recursive              gl_recursive_lock_unlock
+#define glthread_in_use  libintl_thread_in_use
+#define glthread_lock_init_func     libintl_lock_init_func
+#define glthread_lock_lock_func     libintl_lock_lock_func
+#define glthread_lock_unlock_func   libintl_lock_unlock_func
+#define glthread_lock_destroy_func  libintl_lock_destroy_func
+#define glthread_rwlock_init_multithreaded     libintl_rwlock_init_multithreaded
+#define glthread_rwlock_init_func              libintl_rwlock_init_func
+#define glthread_rwlock_rdlock_multithreaded   libintl_rwlock_rdlock_multithreaded
+#define glthread_rwlock_rdlock_func            libintl_rwlock_rdlock_func
+#define glthread_rwlock_wrlock_multithreaded   libintl_rwlock_wrlock_multithreaded
+#define glthread_rwlock_wrlock_func            libintl_rwlock_wrlock_func
+#define glthread_rwlock_unlock_multithreaded   libintl_rwlock_unlock_multithreaded
+#define glthread_rwlock_unlock_func            libintl_rwlock_unlock_func
+#define glthread_rwlock_destroy_multithreaded  libintl_rwlock_destroy_multithreaded
+#define glthread_rwlock_destroy_func           libintl_rwlock_destroy_func
+#define glthread_recursive_lock_init_multithreaded     libintl_recursive_lock_init_multithreaded
+#define glthread_recursive_lock_init_func              libintl_recursive_lock_init_func
+#define glthread_recursive_lock_lock_multithreaded     libintl_recursive_lock_lock_multithreaded
+#define glthread_recursive_lock_lock_func              libintl_recursive_lock_lock_func
+#define glthread_recursive_lock_unlock_multithreaded   libintl_recursive_lock_unlock_multithreaded
+#define glthread_recursive_lock_unlock_func            libintl_recursive_lock_unlock_func
+#define glthread_recursive_lock_destroy_multithreaded  libintl_recursive_lock_destroy_multithreaded
+#define glthread_recursive_lock_destroy_func           libintl_recursive_lock_destroy_func
+#define glthread_once_func            libintl_once_func
+#define glthread_once_singlethreaded  libintl_once_singlethreaded
+#define glthread_once_multithreaded   libintl_once_multithreaded
+])
+])
+
+
+dnl Checks for the core files of the intl subdirectory:
+dnl   dcigettext.c
+dnl   eval-plural.h
+dnl   explodename.c
+dnl   finddomain.c
+dnl   gettextP.h
+dnl   gmo.h
+dnl   hash-string.h hash-string.c
+dnl   l10nflist.c
+dnl   libgnuintl.h.in (except the *printf stuff)
+dnl   loadinfo.h
+dnl   loadmsgcat.c
+dnl   localealias.c
+dnl   log.c
+dnl   plural-exp.h plural-exp.c
+dnl   plural.y
+dnl Used by libglocale.
+AC_DEFUN([gt_INTL_SUBDIR_CORE],
+[
+  AC_REQUIRE([AC_C_INLINE])dnl
+  AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+  AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+  AC_REQUIRE([AC_FUNC_MMAP])dnl
+  AC_REQUIRE([gt_INTDIV0])dnl
+  AC_REQUIRE([gl_AC_TYPE_UINTMAX_T])dnl
+  AC_REQUIRE([gt_INTTYPES_PRI])dnl
+  AC_REQUIRE([gl_LOCK])dnl
+
+  AC_LINK_IFELSE(
+    [AC_LANG_PROGRAM(
+       [[int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }]],
+       [[]])],
+    [AC_DEFINE([HAVE_BUILTIN_EXPECT], [1],
+       [Define to 1 if the compiler understands __builtin_expect.])])
+
+  AC_CHECK_HEADERS([argz.h inttypes.h limits.h unistd.h sys/param.h])
+  AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \
+    stpcpy strcasecmp strdup strtoul tsearch uselocale argz_count \
+    argz_stringify argz_next __fsetlocking])
+
+  dnl Solaris 12 provides getlocalename_l, while Illumos doesn't have
+  dnl it nor the equivalent.
+  if test $ac_cv_func_uselocale = yes; then
+    AC_CHECK_FUNCS([getlocalename_l])
+  fi
+
+  dnl Use the *_unlocked functions only if they are declared.
+  dnl (because some of them were defined without being declared in Solaris
+  dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+  dnl on Solaris 2.5.1 to run on Solaris 2.6).
+  AC_CHECK_DECLS([feof_unlocked, fgets_unlocked], , , [#include <stdio.h>])
+
+  AM_ICONV
+
+  dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+  dnl because plural.y uses bison specific features. It requires at least
+  dnl bison-2.7 for %define api.pure.
+  dnl bison is only needed for the maintainer (who touches plural.y). But in
+  dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+  dnl the rule in general Makefile. Now, some people carelessly touch the
+  dnl files or have a broken "make" program, hence the plural.c rule will
+  dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+  dnl present or too old.
+  AC_CHECK_PROGS([INTLBISON], [bison])
+  if test -z "$INTLBISON"; then
+    ac_verc_fail=yes
+  else
+    dnl Found it, now check the version.
+    AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+    ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    case $ac_prog_version in
+      '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+      2.[7-9]* | [3-9].*)
+changequote([,])dnl
+         ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+      *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+    esac
+    AC_MSG_RESULT([$ac_prog_version])
+  fi
+  if test $ac_verc_fail = yes; then
+    INTLBISON=:
+  fi
+])
+
+dnl Copies _GL_UNUSED and _GL_ATTRIBUTE_PURE definitions from
+dnl gnulib-common.m4 as a fallback, if the project isn't using Gnulib.
+AC_DEFUN([gt_GL_ATTRIBUTE], [
+  m4_ifndef([gl_[]COMMON],
+    AH_VERBATIM([gt_gl_attribute],
+[/* Define as a marker that can be attached to declarations that might not
+    be used.  This helps to reduce warnings, such as from
+    GCC -Wunused-parameter.  */
+#ifndef _GL_UNUSED
+# if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+#  define _GL_UNUSED __attribute__ ((__unused__))
+# else
+#  define _GL_UNUSED
+# endif
+#endif
+
+/* The __pure__ attribute was added in gcc 2.96.  */
+#ifndef _GL_ATTRIBUTE_PURE
+# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
+#  define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+#  define _GL_ATTRIBUTE_PURE /* empty */
+# endif
+#endif
+]))])
diff --git a/gawk-5.0.1/m4/intldir.m4 b/gawk-5.0.1/m4/intldir.m4
new file mode 100644
index 00000000000..ebae76d3617
--- /dev/null
+++ b/gawk-5.0.1/m4/intldir.m4
@@ -0,0 +1,19 @@
+# intldir.m4 serial 2 (gettext-0.18)
+dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+AC_PREREQ([2.52])
+
+dnl Tells the AM_GNU_GETTEXT macro to consider an intl/ directory.
+AC_DEFUN([AM_GNU_GETTEXT_INTL_SUBDIR], [])
diff --git a/gawk-5.0.1/m4/intlmacosx.m4 b/gawk-5.0.1/m4/intlmacosx.m4
new file mode 100644
index 00000000000..8a045f6a295
--- /dev/null
+++ b/gawk-5.0.1/m4/intlmacosx.m4
@@ -0,0 +1,56 @@
+# intlmacosx.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2004-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Checks for special options needed on Mac OS X.
+dnl Defines INTL_MACOSX_LIBS.
+AC_DEFUN([gt_INTL_MACOSX],
+[
+  dnl Check for API introduced in Mac OS X 10.2.
+  AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
+    [gt_cv_func_CFPreferencesCopyAppValue],
+    [gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <CoreFoundation/CFPreferences.h>]],
+          [[CFPreferencesCopyAppValue(NULL, NULL)]])],
+       [gt_cv_func_CFPreferencesCopyAppValue=yes],
+       [gt_cv_func_CFPreferencesCopyAppValue=no])
+     LIBS="$gt_save_LIBS"])
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
+    AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
+      [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
+  fi
+  dnl Check for API introduced in Mac OS X 10.3.
+  AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
+    [gt_save_LIBS="$LIBS"
+     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
+     AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <CoreFoundation/CFLocale.h>]],
+          [[CFLocaleCopyCurrent();]])],
+       [gt_cv_func_CFLocaleCopyCurrent=yes],
+       [gt_cv_func_CFLocaleCopyCurrent=no])
+     LIBS="$gt_save_LIBS"])
+  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+    AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
+      [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
+  fi
+  INTL_MACOSX_LIBS=
+  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
+    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
+  fi
+  AC_SUBST([INTL_MACOSX_LIBS])
+])
diff --git a/gawk-5.0.1/m4/intmax.m4 b/gawk-5.0.1/m4/intmax.m4
new file mode 100644
index 00000000000..f70ceeea1b5
--- /dev/null
+++ b/gawk-5.0.1/m4/intmax.m4
@@ -0,0 +1,36 @@
+# intmax.m4 serial 6 (gettext-0.18.2)
+dnl Copyright (C) 2002-2005, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the system has the 'intmax_t' type, but don't attempt to
+dnl find a replacement if it is lacking.
+
+AC_DEFUN([gt_TYPE_INTMAX_T],
+[
+  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+  AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+          ]],
+          [[intmax_t x = -1;
+            return !x;]])],
+       [gt_cv_c_intmax_t=yes],
+       [gt_cv_c_intmax_t=no])])
+  if test $gt_cv_c_intmax_t = yes; then
+    AC_DEFINE([HAVE_INTMAX_T], [1],
+      [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+  fi
+])
diff --git a/gawk-5.0.1/m4/intmax_t.m4 b/gawk-5.0.1/m4/intmax_t.m4
new file mode 100644
index 00000000000..b9cb27ff6a5
--- /dev/null
+++ b/gawk-5.0.1/m4/intmax_t.m4
@@ -0,0 +1,40 @@
+#serial 6
+
+dnl From Paul Eggert.
+
+AC_PREREQ(2.52)
+
+# Define intmax_t to long or long long if <inttypes.h> doesn't define.
+
+AC_DEFUN([gl_AC_TYPE_INTMAX_T],
+[
+  dnl For simplicity, we assume that a header file defines 'intmax_t' if and
+  dnl only if it defines 'uintmax_t'.
+  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+  if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+    AC_REQUIRE([gl_AC_TYPE_LONG_LONG])
+    test $ac_cv_type_long_long = yes \
+      && ac_type='long long' \
+      || ac_type='long'
+    AC_DEFINE_UNQUOTED(intmax_t, $ac_type,
+     [Define to long or long long if <inttypes.h> and <stdint.h> don't define.])
+  else
+    AC_DEFINE(HAVE_INTMAX_T, 1,
+      [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+  fi
+])
+
+# Define uintmax_t to unsigned long or unsigned long long
+# if <inttypes.h> doesn't define.
+
+AC_DEFUN([jm_AC_TYPE_UINTMAX_T],
+[
+  AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG])
+  AC_CHECK_TYPE(uintmax_t, ,
+    [test $ac_cv_type_unsigned_long_long = yes \
+       && ac_type='unsigned long long' \
+       || ac_type='unsigned long'
+     AC_DEFINE_UNQUOTED(uintmax_t, $ac_type,
+       [Define to widest unsigned type if <inttypes.h> doesn't define.])])
+])
diff --git a/gawk-5.0.1/m4/inttypes-pri.m4 b/gawk-5.0.1/m4/inttypes-pri.m4
new file mode 100644
index 00000000000..00251e1dbf4
--- /dev/null
+++ b/gawk-5.0.1/m4/inttypes-pri.m4
@@ -0,0 +1,42 @@
+# inttypes-pri.m4 serial 7 (gettext-0.18.2)
+dnl Copyright (C) 1997-2002, 2006, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.53])
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values.  This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+  AC_CHECK_HEADERS([inttypes.h])
+  if test $ac_cv_header_inttypes_h = yes; then
+    AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+      [gt_cv_inttypes_pri_broken],
+      [
+        AC_COMPILE_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[
+#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+             ]],
+             [[]])],
+          [gt_cv_inttypes_pri_broken=no],
+          [gt_cv_inttypes_pri_broken=yes])
+      ])
+  fi
+  if test "$gt_cv_inttypes_pri_broken" = yes; then
+    AC_DEFINE_UNQUOTED([PRI_MACROS_BROKEN], [1],
+      [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+    PRI_MACROS_BROKEN=1
+  else
+    PRI_MACROS_BROKEN=0
+  fi
+  AC_SUBST([PRI_MACROS_BROKEN])
+])
diff --git a/gawk-5.0.1/m4/inttypes.m4 b/gawk-5.0.1/m4/inttypes.m4
new file mode 100644
index 00000000000..50677025a08
--- /dev/null
+++ b/gawk-5.0.1/m4/inttypes.m4
@@ -0,0 +1,30 @@
+# inttypes.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H if <inttypes.h> exists and doesn't clash with
+# <sys/types.h>.
+
+AC_DEFUN([gt_HEADER_INTTYPES_H],
+[
+  if test "OS/390" = "`uname`"
+  then
+    gt_cv_header_inttypes_h=no
+  else
+    AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h,
+    [
+      AC_TRY_COMPILE(
+        [#include <sys/types.h>
+#include <inttypes.h>],
+        [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no)
+    ])
+    if test $gt_cv_header_inttypes_h = yes; then
+      AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1,
+        [Define if <inttypes.h> exists and doesn't clash with <sys/types.h>.])
+    fi
+  fi
+])
diff --git a/gawk-5.0.1/m4/inttypes_h.m4 b/gawk-5.0.1/m4/inttypes_h.m4
new file mode 100644
index 00000000000..87be9cfb560
--- /dev/null
+++ b/gawk-5.0.1/m4/inttypes_h.m4
@@ -0,0 +1,29 @@
+# inttypes_h.m4 serial 10
+dnl Copyright (C) 1997-2004, 2006, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
+[
+  AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[
+#include <sys/types.h>
+#include <inttypes.h>
+          ]],
+          [[uintmax_t i = (uintmax_t) -1; return !i;]])],
+       [gl_cv_header_inttypes_h=yes],
+       [gl_cv_header_inttypes_h=no])])
+  if test $gl_cv_header_inttypes_h = yes; then
+    AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1],
+      [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
diff --git a/gawk-5.0.1/m4/lcmessage.m4 b/gawk-5.0.1/m4/lcmessage.m4
new file mode 100644
index 00000000000..7470ec5973a
--- /dev/null
+++ b/gawk-5.0.1/m4/lcmessage.m4
@@ -0,0 +1,35 @@
+# lcmessage.m4 serial 7 (gettext-0.18.2)
+dnl Copyright (C) 1995-2002, 2004-2005, 2008-2014 Free Software Foundation,
+dnl Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([gt_LC_MESSAGES],
+[
+  AC_CACHE_CHECK([for LC_MESSAGES], [gt_cv_val_LC_MESSAGES],
+    [AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <locale.h>]],
+          [[return LC_MESSAGES]])],
+       [gt_cv_val_LC_MESSAGES=yes],
+       [gt_cv_val_LC_MESSAGES=no])])
+  if test $gt_cv_val_LC_MESSAGES = yes; then
+    AC_DEFINE([HAVE_LC_MESSAGES], [1],
+      [Define if your <locale.h> file defines LC_MESSAGES.])
+  fi
+])
diff --git a/gawk-5.0.1/m4/lib-ld.m4 b/gawk-5.0.1/m4/lib-ld.m4
new file mode 100644
index 00000000000..6209de65d96
--- /dev/null
+++ b/gawk-5.0.1/m4/lib-ld.m4
@@ -0,0 +1,119 @@
+# lib-ld.m4 serial 6
+dnl Copyright (C) 1996-2003, 2009-2016 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid
+dnl collision with libtool.m4.
+
+dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes
+  ;;
+*)
+  acl_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-2.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+        [assume the C compiler uses GNU ld [default=no]])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'`
+      while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do
+        ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL([acl_cv_path_LD],
+[if test -z "$LD"; then
+  acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$acl_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+        test "$with_gnu_ld" != no && break
+        ;;
+      *)
+        test "$with_gnu_ld" != yes && break
+        ;;
+      esac
+    fi
+  done
+  IFS="$acl_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT([$LD])
+else
+  AC_MSG_RESULT([no])
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/gawk-5.0.1/m4/lib-link.m4 b/gawk-5.0.1/m4/lib-link.m4
new file mode 100644
index 00000000000..2f518553bc4
--- /dev/null
+++ b/gawk-5.0.1/m4/lib-link.m4
@@ -0,0 +1,777 @@
+# lib-link.m4 serial 26 (gettext-0.18.2)
+dnl Copyright (C) 2001-2016 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_PREREQ([2.54])
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[m4_translit([$1],[./+-], [____])])
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+    ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. The missing-message
+dnl defaults to 'no' and may contain additional hints for the user.
+dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
+dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
+dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  pushdef([Name],[m4_translit([$1],[./+-], [____])])
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
+    dnl because these -l options might require -L options that are present in
+    dnl LIBS. -l options benefit only from the -L options listed before it.
+    dnl Otherwise, add it to the front of LIBS, because it may be a static
+    dnl library that depends on another static library that is present in LIBS.
+    dnl Static libraries benefit only from the static libraries listed after
+    dnl it.
+    case " $LIB[]NAME" in
+      *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
+      *)       LIBS="$LIB[]NAME $LIBS" ;;
+    esac
+    AC_LINK_IFELSE(
+      [AC_LANG_PROGRAM([[$3]], [[$4]])],
+      [ac_cv_lib[]Name=yes],
+      [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+    LIB[]NAME[]_PREFIX=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  AC_SUBST([LIB]NAME[_PREFIX])
+  popdef([NAME])
+  popdef([Name])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl   acl_libext,
+dnl   acl_shlibext,
+dnl   acl_libname_spec,
+dnl   acl_library_names_spec,
+dnl   acl_hardcode_libdir_flag_spec,
+dnl   acl_hardcode_libdir_separator,
+dnl   acl_hardcode_direct,
+dnl   acl_hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+  m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  acl_libext="$acl_cv_libext"
+  acl_shlibext="$acl_cv_shlibext"
+  acl_libname_spec="$acl_cv_libname_spec"
+  acl_library_names_spec="$acl_cv_library_names_spec"
+  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  acl_hardcode_direct="$acl_cv_hardcode_direct"
+  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  dnl Determine whether the user wants rpath handling at all.
+  AC_ARG_ENABLE([rpath],
+    [  --disable-rpath         do not hardcode runtime library paths],
+    :, enable_rpath=yes)
+])
+
+dnl AC_LIB_FROMPACKAGE(name, package)
+dnl declares that libname comes from the given package. The configure file
+dnl will then not have a --with-libname-prefix option but a
+dnl --with-package-prefix option. Several libraries can come from the same
+dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
+dnl macro call that searches for libname.
+AC_DEFUN([AC_LIB_FROMPACKAGE],
+[
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  define([acl_frompackage_]NAME, [$2])
+  popdef([NAME])
+  pushdef([PACK],[$2])
+  pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+                                     [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  define([acl_libsinpackage_]PACKUP,
+    m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
+  popdef([PACKUP])
+  popdef([PACK])
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
+dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
+                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
+  pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
+                                     [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
+  pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
+  dnl Autoconf >= 2.61 supports dots in --with options.
+  pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_ARG_WITH(P_A_C_K[-prefix],
+[[  --with-]]P_A_C_K[[-prefix[=DIR]  search for ]PACKLIBS[ in DIR/include and DIR/lib
+  --without-]]P_A_C_K[[-prefix     don't search for ]PACKLIBS[ in includedir and libdir]],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+        if test "$acl_libdirstem2" != "$acl_libdirstem" \
+           && ! test -d "$withval/$acl_libdirstem"; then
+          additional_libdir="$withval/$acl_libdirstem2"
+        fi
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  LIB[]NAME[]_PREFIX=
+  dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
+  dnl computed. So it has to be reset here.
+  HAVE_LIB[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
+          if test -n "$acl_shlibext"; then
+            shrext=".$acl_shlibext"             # typically: shrext=.so
+          else
+            shrext=
+          fi
+          if test $use_additional = yes; then
+            dir="$additional_libdir"
+            dnl The same code as in the loop below:
+            dnl First look for a shared library.
+            if test -n "$acl_shlibext"; then
+              if test -f "$dir/$libname$shrext"; then
+                found_dir="$dir"
+                found_so="$dir/$libname$shrext"
+              else
+                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                  ver=`(cd "$dir" && \
+                        for f in "$libname$shrext".*; do echo "$f"; done \
+                        | sed -e "s,^$libname$shrext\\\\.,," \
+                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                        | sed 1q ) 2>/dev/null`
+                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                    found_dir="$dir"
+                    found_so="$dir/$libname$shrext.$ver"
+                  fi
+                else
+                  eval library_names=\"$acl_library_names_spec\"
+                  for f in $library_names; do
+                    if test -f "$dir/$f"; then
+                      found_dir="$dir"
+                      found_so="$dir/$f"
+                      break
+                    fi
+                  done
+                fi
+              fi
+            fi
+            dnl Then look for a static library.
+            if test "X$found_dir" = "X"; then
+              if test -f "$dir/$libname.$acl_libext"; then
+                found_dir="$dir"
+                found_a="$dir/$libname.$acl_libext"
+              fi
+            fi
+            if test "X$found_dir" != "X"; then
+              if test -f "$dir/$libname.la"; then
+                found_la="$dir/$libname.la"
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  dnl First look for a shared library.
+                  if test -n "$acl_shlibext"; then
+                    if test -f "$dir/$libname$shrext"; then
+                      found_dir="$dir"
+                      found_so="$dir/$libname$shrext"
+                    else
+                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
+                        ver=`(cd "$dir" && \
+                              for f in "$libname$shrext".*; do echo "$f"; done \
+                              | sed -e "s,^$libname$shrext\\\\.,," \
+                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
+                              | sed 1q ) 2>/dev/null`
+                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
+                          found_dir="$dir"
+                          found_so="$dir/$libname$shrext.$ver"
+                        fi
+                      else
+                        eval library_names=\"$acl_library_names_spec\"
+                        for f in $library_names; do
+                          if test -f "$dir/$f"; then
+                            found_dir="$dir"
+                            found_so="$dir/$f"
+                            break
+                          fi
+                        done
+                      fi
+                    fi
+                  fi
+                  dnl Then look for a static library.
+                  if test "X$found_dir" = "X"; then
+                    if test -f "$dir/$libname.$acl_libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/$libname.$acl_libext"
+                    fi
+                  fi
+                  if test "X$found_dir" != "X"; then
+                    if test -f "$dir/$libname.la"; then
+                      found_la="$dir/$libname.la"
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "$enable_rpath" = no \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem" \
+                 || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$acl_hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$acl_hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */$acl_libdirstem | */$acl_libdirstem/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+              */$acl_libdirstem2 | */$acl_libdirstem2/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
+                if test "$name" = '$1'; then
+                  LIB[]NAME[]_PREFIX="$basedir"
+                fi
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
+                       && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
+                         || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                      dnl Potentially add DIR to rpathdirs.
+                      dnl The rpathdirs will be appended to $LIBNAME at the end.
+                      haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                      dnl Potentially add DIR to ltrpathdirs.
+                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                      haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$acl_hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$acl_hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$acl_hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+  popdef([P_A_C_K])
+  popdef([PACKLIBS])
+  popdef([PACKUP])
+  popdef([PACK])
+  popdef([NAME])
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
+
+dnl For those cases where a variable contains several -L and -l options
+dnl referring to unknown libraries and directories, this macro determines the
+dnl necessary additional linker options for the runtime path.
+dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
+dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
+dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
+dnl otherwise linking without libtool is assumed.
+AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
+[
+  AC_REQUIRE([AC_LIB_RPATH])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  $1=
+  if test "$enable_rpath" != no; then
+    if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
+      dnl Use an explicit option to hardcode directories into the resulting
+      dnl binary.
+      rpathdirs=
+      next=
+      for opt in $2; do
+        if test -n "$next"; then
+          dir="$next"
+          dnl No need to hardcode the standard /usr/lib.
+          if test "X$dir" != "X/usr/$acl_libdirstem" \
+             && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+            rpathdirs="$rpathdirs $dir"
+          fi
+          next=
+        else
+          case $opt in
+            -L) next=yes ;;
+            -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
+                 dnl No need to hardcode the standard /usr/lib.
+                 if test "X$dir" != "X/usr/$acl_libdirstem" \
+                    && test "X$dir" != "X/usr/$acl_libdirstem2"; then
+                   rpathdirs="$rpathdirs $dir"
+                 fi
+                 next= ;;
+            *) next= ;;
+          esac
+        fi
+      done
+      if test "X$rpathdirs" != "X"; then
+        if test -n ""$3""; then
+          dnl libtool is used for linking. Use -R options.
+          for dir in $rpathdirs; do
+            $1="${$1}${$1:+ }-R$dir"
+          done
+        else
+          dnl The linker is used for linking directly.
+          if test -n "$acl_hardcode_libdir_separator"; then
+            dnl Weird platform: only the last -rpath option counts, the user
+            dnl must pass all path elements in one option.
+            alldirs=
+            for dir in $rpathdirs; do
+              alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
+            done
+            acl_save_libdir="$libdir"
+            libdir="$alldirs"
+            eval flag=\"$acl_hardcode_libdir_flag_spec\"
+            libdir="$acl_save_libdir"
+            $1="$flag"
+          else
+            dnl The -rpath options are cumulative.
+            for dir in $rpathdirs; do
+              acl_save_libdir="$libdir"
+              libdir="$dir"
+              eval flag=\"$acl_hardcode_libdir_flag_spec\"
+              libdir="$acl_save_libdir"
+              $1="${$1}${$1:+ }$flag"
+            done
+          fi
+        fi
+      fi
+    fi
+  fi
+  AC_SUBST([$1])
+])
diff --git a/gawk-5.0.1/m4/lib-prefix.m4 b/gawk-5.0.1/m4/lib-prefix.m4
new file mode 100644
index 00000000000..6851031d391
--- /dev/null
+++ b/gawk-5.0.1/m4/lib-prefix.m4
@@ -0,0 +1,224 @@
+# lib-prefix.m4 serial 7 (gettext-0.18)
+dnl Copyright (C) 2001-2005, 2008-2016 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/$acl_libdirstem"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_PREPARE_MULTILIB creates
+dnl - a variable acl_libdirstem, containing the basename of the libdir, either
+dnl   "lib" or "lib64" or "lib/64",
+dnl - a variable acl_libdirstem2, as a secondary possible value for
+dnl   acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
+dnl   "lib/amd64".
+AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
+[
+  dnl There is no formal standard regarding lib and lib64.
+  dnl On glibc systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
+  dnl the compiler's default mode by looking at the compiler's library search
+  dnl path. If at least one of its elements ends in /lib64 or points to a
+  dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
+  dnl Otherwise we use the default, namely "lib".
+  dnl On Solaris systems, the current practice is that on a system supporting
+  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
+  dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
+  dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  acl_libdirstem=lib
+  acl_libdirstem2=
+  case "$host_os" in
+    solaris*)
+      dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
+      dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
+      dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
+      dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
+      dnl symlink is missing, so we set acl_libdirstem2 too.
+      AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
+        [AC_EGREP_CPP([sixtyfour bits], [
+#ifdef _LP64
+sixtyfour bits
+#endif
+           ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
+        ])
+      if test $gl_cv_solaris_64bit = yes; then
+        acl_libdirstem=lib/64
+        case "$host_cpu" in
+          sparc*)        acl_libdirstem2=lib/sparcv9 ;;
+          i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
+        esac
+      fi
+      ;;
+    *)
+      searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
+      if test -n "$searchpath"; then
+        acl_save_IFS="${IFS= 	}"; IFS=":"
+        for searchdir in $searchpath; do
+          if test -d "$searchdir"; then
+            case "$searchdir" in
+              */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
+              */../ | */.. )
+                # Better ignore directories of this form. They are misleading.
+                ;;
+              *) searchdir=`cd "$searchdir" && pwd`
+                 case "$searchdir" in
+                   */lib64 ) acl_libdirstem=lib64 ;;
+                 esac ;;
+            esac
+          fi
+        done
+        IFS="$acl_save_IFS"
+      fi
+      ;;
+  esac
+  test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
+])
diff --git a/gawk-5.0.1/m4/libsigsegv.m4 b/gawk-5.0.1/m4/libsigsegv.m4
new file mode 100644
index 00000000000..9d255d3b2b4
--- /dev/null
+++ b/gawk-5.0.1/m4/libsigsegv.m4
@@ -0,0 +1,16 @@
+# libsigsegv.m4 serial 4
+dnl Copyright (C) 2002-2003, 2008-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible, Sam Steingold.
+
+AC_DEFUN([gl_LIBSIGSEGV],
+[
+  AC_LIB_HAVE_LINKFLAGS([sigsegv], [],
+    [#include <sigsegv.h>], [sigsegv_deinstall_handler();],
+    [no, consider installing GNU libsigsegv])
+  dnl Some other autoconf macros and clisp's configure use this variable.
+  gl_cv_lib_sigsegv="$ac_cv_libsigsegv"
+])
diff --git a/gawk-5.0.1/m4/lock.m4 b/gawk-5.0.1/m4/lock.m4
new file mode 100644
index 00000000000..73a3c54cee8
--- /dev/null
+++ b/gawk-5.0.1/m4/lock.m4
@@ -0,0 +1,42 @@
+# lock.m4 serial 13 (gettext-0.18.2)
+dnl Copyright (C) 2005-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_LOCK],
+[
+  AC_REQUIRE([gl_THREADLIB])
+  if test "$gl_threads_api" = posix; then
+    # OSF/1 4.0 and Mac OS X 10.1 lack the pthread_rwlock_t type and the
+    # pthread_rwlock_* functions.
+    AC_CHECK_TYPE([pthread_rwlock_t],
+      [AC_DEFINE([HAVE_PTHREAD_RWLOCK], [1],
+         [Define if the POSIX multithreading library has read/write locks.])],
+      [],
+      [#include <pthread.h>])
+    # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
+    AC_COMPILE_IFELSE([
+      AC_LANG_PROGRAM(
+        [[#include <pthread.h>]],
+        [[
+#if __FreeBSD__ == 4
+error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
+#elif (defined __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ \
+       && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
+error "No, in Mac OS X < 10.7 recursive mutexes actually don't work."
+#else
+int x = (int)PTHREAD_MUTEX_RECURSIVE;
+return !x;
+#endif
+        ]])],
+      [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], [1],
+         [Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])])
+  fi
+  gl_PREREQ_LOCK
+])
+
+# Prerequisites of lib/glthread/lock.c.
+AC_DEFUN([gl_PREREQ_LOCK], [:])
diff --git a/gawk-5.0.1/m4/longdouble.m4 b/gawk-5.0.1/m4/longdouble.m4
new file mode 100644
index 00000000000..25590f4704d
--- /dev/null
+++ b/gawk-5.0.1/m4/longdouble.m4
@@ -0,0 +1,31 @@
+# longdouble.m4 serial 2 (gettext-0.15)
+dnl Copyright (C) 2002-2003, 2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the compiler supports the 'long double' type.
+dnl Prerequisite: AC_PROG_CC
+
+dnl This file is only needed in autoconf <= 2.59.  Newer versions of autoconf
+dnl have a macro AC_TYPE_LONG_DOUBLE with identical semantics.
+
+AC_DEFUN([gt_TYPE_LONGDOUBLE],
+[
+  AC_CACHE_CHECK([for long double], gt_cv_c_long_double,
+    [if test "$GCC" = yes; then
+       gt_cv_c_long_double=yes
+     else
+       AC_TRY_COMPILE([
+         /* The Stardent Vistra knows sizeof(long double), but does not support it.  */
+         long double foo = 0.0;
+         /* On Ultrix 4.3 cc, long double is 4 and double is 8.  */
+         int array [2*(sizeof(long double) >= sizeof(double)) - 1];
+         ], ,
+         gt_cv_c_long_double=yes, gt_cv_c_long_double=no)
+     fi])
+  if test $gt_cv_c_long_double = yes; then
+    AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.])
+  fi
+])
diff --git a/gawk-5.0.1/m4/longlong.m4 b/gawk-5.0.1/m4/longlong.m4
new file mode 100644
index 00000000000..eefb37c455e
--- /dev/null
+++ b/gawk-5.0.1/m4/longlong.m4
@@ -0,0 +1,113 @@
+# longlong.m4 serial 17
+dnl Copyright (C) 1999-2007, 2009-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG_INT if 'long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'long long int' exists but is only 32 bits large
+# (as on some very old compilers), HAVE_LONG_LONG_INT will not be
+# defined. In this case you can treat 'long long int' like 'long int'.
+
+AC_DEFUN([AC_TYPE_LONG_LONG_INT],
+[
+  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+  AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
+     [ac_cv_type_long_long_int=yes
+      if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+        ac_cv_type_long_long_int=$ac_cv_type_unsigned_long_long_int
+        if test $ac_cv_type_long_long_int = yes; then
+          dnl Catch a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
+          dnl If cross compiling, assume the bug is not important, since
+          dnl nobody cross compiles for this platform as far as we know.
+          AC_RUN_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[@%:@include <limits.h>
+                 @%:@ifndef LLONG_MAX
+                 @%:@ define HALF \
+                          (1LL << (sizeof (long long int) * CHAR_BIT - 2))
+                 @%:@ define LLONG_MAX (HALF - 1 + HALF)
+                 @%:@endif]],
+               [[long long int n = 1;
+                 int i;
+                 for (i = 0; ; i++)
+                   {
+                     long long int m = n << i;
+                     if (m >> i != n)
+                       return 1;
+                     if (LLONG_MAX / 2 < m)
+                       break;
+                   }
+                 return 0;]])],
+            [],
+            [ac_cv_type_long_long_int=no],
+            [:])
+        fi
+      fi])
+  if test $ac_cv_type_long_long_int = yes; then
+    AC_DEFINE([HAVE_LONG_LONG_INT], [1],
+      [Define to 1 if the system has the type 'long long int'.])
+  fi
+])
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.61, and can be faster
+# than what's in Autoconf 2.62 through 2.68.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+  AC_CACHE_CHECK([for unsigned long long int],
+    [ac_cv_type_unsigned_long_long_int],
+    [ac_cv_type_unsigned_long_long_int=yes
+     if test "x${ac_cv_prog_cc_c99-no}" = xno; then
+       AC_LINK_IFELSE(
+         [_AC_TYPE_LONG_LONG_SNIPPET],
+         [],
+         [ac_cv_type_unsigned_long_long_int=no])
+     fi])
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
+    AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
+      [Define to 1 if the system has the type 'unsigned long long int'.])
+  fi
+])
+
+# Expands to a C program that can be used to test for simultaneous support
+# of 'long long' and 'unsigned long long'. We don't want to say that
+# 'long long' is available if 'unsigned long long' is not, or vice versa,
+# because too many programs rely on the symmetry between signed and unsigned
+# integer types (excluding 'bool').
+AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
+[
+  AC_LANG_PROGRAM(
+    [[/* For now, do not test the preprocessor; as of 2007 there are too many
+         implementations with broken preprocessors.  Perhaps this can
+         be revisited in 2012.  In the meantime, code should not expect
+         #if to work with literals wider than 32 bits.  */
+      /* Test literals.  */
+      long long int ll = 9223372036854775807ll;
+      long long int nll = -9223372036854775807LL;
+      unsigned long long int ull = 18446744073709551615ULL;
+      /* Test constant expressions.   */
+      typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
+                     ? 1 : -1)];
+      typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
+                     ? 1 : -1)];
+      int i = 63;]],
+    [[/* Test availability of runtime routines for shift and division.  */
+      long long int llmax = 9223372036854775807ll;
+      unsigned long long int ullmax = 18446744073709551615ull;
+      return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
+              | (llmax / ll) | (llmax % ll)
+              | (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
+              | (ullmax / ull) | (ullmax % ull));]])
+])
diff --git a/gawk-5.0.1/m4/mpfr.m4 b/gawk-5.0.1/m4/mpfr.m4
new file mode 100644
index 00000000000..7d9e678b49e
--- /dev/null
+++ b/gawk-5.0.1/m4/mpfr.m4
@@ -0,0 +1,62 @@
+dnl Check for MPFR and dependencies
+dnl Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+dnl
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl Defines HAVE_MPFR to 1 if a working MPFR/GMP setup is
+dnl found, and sets @LIBMPFR@ to the necessary libraries.
+
+AC_DEFUN([GNUPG_CHECK_MPFR],
+[
+  AC_ARG_WITH([mpfr],
+     AC_HELP_STRING([--with-mpfr=DIR],
+	[look for the mpfr and gmp libraries in DIR]),
+     [_do_mpfr=$withval],[_do_mpfr=yes])
+
+  if test "$_do_mpfr" != "no" ; then
+     if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+     fi
+
+        _mpfr_save_libs=$LIBS
+        _combo="-lmpfr -lgmp"
+        LIBS="$LIBS $_combo"
+
+        AC_MSG_CHECKING([whether mpfr via \"$_combo\" is present and usable])
+
+        AC_LINK_IFELSE([
+	AC_LANG_PROGRAM([
+#include <stdio.h>
+#include <mpfr.h>
+#include <gmp.h>
+],[
+mpfr_t p;
+mpz_t z;
+mpfr_init(p);
+mpz_init(z);
+mpfr_printf("%Rf%Zd", p, z);
+mpfr_clear(p);
+mpz_clear(z);
+])],_found_mpfr=yes,_found_mpfr=no)
+
+        AC_MSG_RESULT([$_found_mpfr])
+
+        LIBS=$_mpfr_save_libs
+
+        if test $_found_mpfr = yes ; then
+           AC_DEFINE(HAVE_MPFR,1,
+	      [Define to 1 if you have fully functional mpfr and gmp libraries.])
+           AC_SUBST(LIBMPFR,$_combo)
+           break
+        fi
+
+     unset _mpfr_save_libs
+     unset _combo
+     unset _found_mpfr
+  fi
+])dnl
diff --git a/gawk-5.0.1/m4/nls.m4 b/gawk-5.0.1/m4/nls.m4
new file mode 100644
index 00000000000..afdb9cacd0a
--- /dev/null
+++ b/gawk-5.0.1/m4/nls.m4
@@ -0,0 +1,32 @@
+# nls.m4 serial 5 (gettext-0.18)
+dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016 Free Software
+dnl Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.50])
+
+AC_DEFUN([AM_NLS],
+[
+  AC_MSG_CHECKING([whether NLS is requested])
+  dnl Default is enabled NLS
+  AC_ARG_ENABLE([nls],
+    [  --disable-nls           do not use Native Language Support],
+    USE_NLS=$enableval, USE_NLS=yes)
+  AC_MSG_RESULT([$USE_NLS])
+  AC_SUBST([USE_NLS])
+])
diff --git a/gawk-5.0.1/m4/noreturn.m4 b/gawk-5.0.1/m4/noreturn.m4
new file mode 100644
index 00000000000..7fa7d37740d
--- /dev/null
+++ b/gawk-5.0.1/m4/noreturn.m4
@@ -0,0 +1,38 @@
+dnl Date: Sun, 26 Feb 2012 11:31:50 -0800
+dnl From: Paul Eggert <eggert@cs.ucla.edu>
+dnl To: arnold@skeeve.com
+dnl CC: bug-grep@gnu.org
+dnl Subject: Re: avoid gcc 4.6.2 'may be used before set' warnings in dfa.c
+dnl 
+dnl On 02/26/2012 01:18 AM, arnold@skeeve.com wrote:
+dnl > It looks like I can just use the code as it is now in grep. I have asked
+dnl > for compile failures and haven't gotten any.
+dnl 
+dnl Sure, but the gnulib support for this is better
+dnl than what's in the dfa code.  It could be that
+dnl your correspondents aren't using the less-common hosts
+dnl or compiler warning options that gnulib is ported to.
+dnl 
+dnl In the long run stdnoreturn.h or _Noreturn is the way to go,
+dnl since they're part of the C standard.
+dnl 
+dnl If you'd rather not create a separate file, how about if
+dnl we change the dfa code to use _Noreturn instead of
+dnl <stdnoreturn.h> and noreturn, and you can put the
+dnl following into your configure.ac so that config.h
+dnl defines _Noreturn the same way gnulib does:
+
+AC_DEFUN([GAWK_AC_NORETURN],[
+AH_VERBATIM([_Noreturn],
+[/* The _Noreturn keyword of C11.  */
+#ifndef _Noreturn
+# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
+      || 0x5110 <= __SUNPRO_C)
+#  define _Noreturn __attribute__ ((__noreturn__))
+# elif defined _MSC_VER && 1200 <= _MSC_VER
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn
+# endif
+#endif
+])])
diff --git a/gawk-5.0.1/m4/po.m4 b/gawk-5.0.1/m4/po.m4
new file mode 100644
index 00000000000..c5a2f6bf2a9
--- /dev/null
+++ b/gawk-5.0.1/m4/po.m4
@@ -0,0 +1,453 @@
+# po.m4 serial 24 (gettext-0.19)
+dnl Copyright (C) 1995-2014, 2016 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_PREREQ([2.60])
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+  AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+  AC_REQUIRE([AC_PROG_SED])dnl
+  AC_REQUIRE([AM_NLS])dnl
+
+  dnl Release version of the gettext macros. This is used to ensure that
+  dnl the gettext macros and po/Makefile.in.in are in sync.
+  AC_SUBST([GETTEXT_MACRO_VERSION], [0.19])
+
+  dnl Perform the following tests also if --disable-nls has been given,
+  dnl because they are needed for "make dist" to work.
+
+  dnl Search for GNU msgfmt in the PATH.
+  dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+  dnl The second test excludes FreeBSD msgfmt.
+  AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+    [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
+
+  dnl Test whether it is GNU msgfmt >= 0.15.
+changequote(,)dnl
+  case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
+    *) MSGFMT_015=$MSGFMT ;;
+  esac
+changequote([,])dnl
+  AC_SUBST([MSGFMT_015])
+changequote(,)dnl
+  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
+    *) GMSGFMT_015=$GMSGFMT ;;
+  esac
+changequote([,])dnl
+  AC_SUBST([GMSGFMT_015])
+
+  dnl Search for GNU xgettext 0.12 or newer in the PATH.
+  dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+  dnl The second test excludes FreeBSD xgettext.
+  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+    [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  dnl Remove leftover from FreeBSD xgettext call.
+  rm -f messages.po
+
+  dnl Test whether it is GNU xgettext >= 0.15.
+changequote(,)dnl
+  case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
+    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
+    *) XGETTEXT_015=$XGETTEXT ;;
+  esac
+changequote([,])dnl
+  AC_SUBST([XGETTEXT_015])
+
+  dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+  AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+    [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :)
+
+  dnl Installation directories.
+  dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we
+  dnl have to define it here, so that it can be used in po/Makefile.
+  test -n "$localedir" || localedir='${datadir}/locale'
+  AC_SUBST([localedir])
+
+  dnl Support for AM_XGETTEXT_OPTION.
+  test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
+  AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
+
+  AC_CONFIG_COMMANDS([po-directories], [[
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        # Treat a directory as a PO directory if and only if it has a
+        # POTFILES.in file. This allows packages to have multiple PO
+        # directories under different names or in different locations.
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          gt_tab=`printf '\t'`
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            # Hide the ALL_LINGUAS assignment from automake < 1.5.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          # Compute POFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+          # Compute UPDATEPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+          # Compute DUMMYPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+          # Compute GMOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          GMOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done]],
+   [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+    # from automake < 1.5.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+   ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+  # When this code is run, in config.status, two variables have already been
+  # set:
+  # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+  # - LINGUAS is the value of the environment variable LINGUAS at configure
+  #   time.
+
+changequote(,)dnl
+  # Adjust a relative srcdir.
+  ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+  ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'`
+  ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+  # In autoconf-2.13 it is called $ac_given_srcdir.
+  # In autoconf-2.50 it is called $srcdir.
+  test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+  case "$ac_given_srcdir" in
+    .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+    /*) top_srcdir="$ac_given_srcdir" ;;
+    *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  # Find a way to echo strings without interpreting backslash.
+  if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+    gt_echo='echo'
+  else
+    if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+      gt_echo='printf %s\n'
+    else
+      echo_func () {
+        cat <<EOT
+$*
+EOT
+      }
+      gt_echo='echo_func'
+    fi
+  fi
+
+  # A sed script that extracts the value of VARIABLE from a Makefile.
+  tab=`printf '\t'`
+  sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=/{
+  # Seen the first line of the variable definition.
+  s/^['"${tab}"' ]*VARIABLE['"${tab}"' ]*=//
+  ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+  # Set POTFILES to the value of the Makefile variable POTFILES.
+  sed_x_POTFILES=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`
+  POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+  # Compute POTFILES_DEPS as
+  #   $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+  POTFILES_DEPS=
+  for file in $POTFILES; do
+    POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+  done
+  POMAKEFILEDEPS=""
+
+  if test -n "$OBSOLETE_ALL_LINGUAS"; then
+    test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+  fi
+  if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+    # The LINGUAS file contains the set of available languages.
+    ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+    POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+  else
+    # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+    sed_x_LINGUAS=`$gt_echo "$sed_x_variable" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`
+    ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+  fi
+  # Hide the ALL_LINGUAS assignment from automake < 1.5.
+  eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+  # Compute POFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+  # Compute UPDATEPOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+  # Compute DUMMYPOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+  # Compute GMOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+  # Compute PROPERTIESFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+  # Compute CLASSFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+  # Compute QMFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+  # Compute MSGFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+  # Compute RESOURCESDLLFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+  case "$ac_given_srcdir" in
+    .) srcdirpre= ;;
+    *) srcdirpre='$(srcdir)/' ;;
+  esac
+  POFILES=
+  UPDATEPOFILES=
+  DUMMYPOFILES=
+  GMOFILES=
+  PROPERTIESFILES=
+  CLASSFILES=
+  QMFILES=
+  MSGFILES=
+  RESOURCESDLLFILES=
+  for lang in $ALL_LINGUAS; do
+    POFILES="$POFILES $srcdirpre$lang.po"
+    UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+    DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+    GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+    PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+    CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+    QMFILES="$QMFILES $srcdirpre$lang.qm"
+    frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+    MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+    frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+    RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+  done
+  # CATALOGS depends on both $ac_dir and the user's LINGUAS
+  # environment variable.
+  INST_LINGUAS=
+  if test -n "$ALL_LINGUAS"; then
+    for presentlang in $ALL_LINGUAS; do
+      useit=no
+      if test "%UNSET%" != "$LINGUAS"; then
+        desiredlanguages="$LINGUAS"
+      else
+        desiredlanguages="$ALL_LINGUAS"
+      fi
+      for desiredlang in $desiredlanguages; do
+        # Use the presentlang catalog if desiredlang is
+        #   a. equal to presentlang, or
+        #   b. a variant of presentlang (because in this case,
+        #      presentlang can be used as a fallback for messages
+        #      which are not translated in the desiredlang catalog).
+        case "$desiredlang" in
+          "$presentlang"*) useit=yes;;
+        esac
+      done
+      if test $useit = yes; then
+        INST_LINGUAS="$INST_LINGUAS $presentlang"
+      fi
+    done
+  fi
+  CATALOGS=
+  JAVACATALOGS=
+  QTCATALOGS=
+  TCLCATALOGS=
+  CSHARPCATALOGS=
+  if test -n "$INST_LINGUAS"; then
+    for lang in $INST_LINGUAS; do
+      CATALOGS="$CATALOGS $lang.gmo"
+      JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+      QTCATALOGS="$QTCATALOGS $lang.qm"
+      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+      TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+      CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+    done
+  fi
+
+  sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+  tab=`printf '\t'`
+  if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+    # Add dependencies that cannot be formulated as a simple suffix rule.
+    for lang in $ALL_LINGUAS; do
+      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+      cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+${tab}@echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+${tab}\$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+    done
+  fi
+  if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
+    # Add dependencies that cannot be formulated as a simple suffix rule.
+    for lang in $ALL_LINGUAS; do
+      frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'`
+      cat >> "$ac_file.tmp" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+${tab}@echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+${tab}\$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+    done
+  fi
+  if test -n "$POMAKEFILEDEPS"; then
+    cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+  fi
+  mv "$ac_file.tmp" "$ac_file"
+])
+
+dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
+AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
+[
+  XGETTEXT_EXTRA_OPTIONS=
+])
+
+dnl Registers an option to be passed to xgettext in the po subdirectory.
+AC_DEFUN([AM_XGETTEXT_OPTION],
+[
+  AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
+  XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
+])
diff --git a/gawk-5.0.1/m4/printf-posix.m4 b/gawk-5.0.1/m4/printf-posix.m4
new file mode 100644
index 00000000000..3be95c130ae
--- /dev/null
+++ b/gawk-5.0.1/m4/printf-posix.m4
@@ -0,0 +1,48 @@
+# printf-posix.m4 serial 6 (gettext-0.18.2)
+dnl Copyright (C) 2003, 2007, 2009-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether the printf() function supports POSIX/XSI format strings with
+dnl positions.
+
+AC_DEFUN([gt_PRINTF_POSIX],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings],
+    gt_cv_func_printf_posix,
+    [
+      AC_RUN_IFELSE(
+        [AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+   dollar expansion (possibly an autoconf bug).  */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+  sprintf (buf, format, 33, 55);
+  return (strcmp (buf, "55 33") != 0);
+}]])],
+        [gt_cv_func_printf_posix=yes],
+        [gt_cv_func_printf_posix=no],
+        [
+          AC_EGREP_CPP([notposix], [
+#if defined __NetBSD__ || defined __BEOS__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+  notposix
+#endif
+            ],
+            [gt_cv_func_printf_posix="guessing no"],
+            [gt_cv_func_printf_posix="guessing yes"])
+        ])
+    ])
+  case $gt_cv_func_printf_posix in
+    *yes)
+      AC_DEFINE([HAVE_POSIX_PRINTF], [1],
+        [Define if your printf() function supports format strings with positions.])
+      ;;
+  esac
+])
diff --git a/gawk-5.0.1/m4/progtest.m4 b/gawk-5.0.1/m4/progtest.m4
new file mode 100644
index 00000000000..9ace7c3418a
--- /dev/null
+++ b/gawk-5.0.1/m4/progtest.m4
@@ -0,0 +1,91 @@
+# progtest.m4 serial 7 (gettext-0.18.2)
+dnl Copyright (C) 1996-2003, 2005, 2008-2016 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+dnl
+dnl This file can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+AC_PREREQ([2.50])
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+  # contains only /bin. Note that ksh looks also at the FPATH variable,
+  # so we have to set that as well for the test.
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+    && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+           || PATH_SEPARATOR=';'
+       }
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL([ac_cv_path_$1],
+[case "[$]$1" in
+  [[\\/]]* | ?:[[\\/]]*)
+    ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in ifelse([$5], , $PATH, [$5]); do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD
+          if [$3]; then
+            ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+    ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+  AC_MSG_RESULT([$][$1])
+else
+  AC_MSG_RESULT([no])
+fi
+AC_SUBST([$1])dnl
+])
diff --git a/gawk-5.0.1/m4/readline.m4 b/gawk-5.0.1/m4/readline.m4
new file mode 100644
index 00000000000..5c0bb1ea53c
--- /dev/null
+++ b/gawk-5.0.1/m4/readline.m4
@@ -0,0 +1,116 @@
+dnl Check for readline and dependencies
+dnl Copyright (C) 2004, 2005, 2013, 2014 Free Software Foundation, Inc.
+dnl
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl Defines HAVE_LIBREADLINE to 1 if a working readline setup is
+dnl found, and sets @LIBREADLINE@ to the necessary libraries.
+dnl
+dnl Based upon GNUPG_CHECK_READLINE.  Many more years into the
+dnl twenty-first century, it is not enough to link a test program
+dnl with the readline library. On several systems, if readline is
+dnl not linked with the curses / termcap / whatever libraries, the
+dnl problem is only discovered at run time.  Isn't that special?
+
+AC_DEFUN([GAWK_CHECK_READLINE],
+[
+  AC_ARG_WITH([readline],
+     AC_HELP_STRING([--with-readline=DIR],
+	[look for the readline library in DIR]),
+     [_do_readline=$withval],[_do_readline=yes])
+
+  if test "$_do_readline" != "no" ; then
+     if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+     fi
+
+     for _termcap in "" "-ltermcap" "-lcurses" "-lncurses" ; do
+        _readline_save_libs=$LIBS
+        _combo="-lreadline${_termcap:+ $_termcap}"
+        LIBS="$LIBS $_combo"
+
+        AC_MSG_CHECKING([whether readline via \"$_combo\" is present and sane])
+
+	AC_TRY_RUN(
+dnl source program:
+AC_LANG_SOURCE([[#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+
+int main(int argc, char **argv)
+{
+	int fd;
+	char *line;
+
+	close(0);
+	close(1);
+	fd = open("/dev/null", 2);	/* should get fd 0 */
+	dup(fd);
+	line = readline("giveittome> ");
+
+	/* some printfs don't handle NULL for %s */
+	printf("got <%s>\n", line ? line : "(NULL)");
+	return 0;
+}]]),
+dnl action if true:
+            [_found_readline=yes],
+dnl action if false:
+            [_found_readline=no],
+dnl action if cross compiling:
+		AC_TRY_LINK([#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>],		dnl includes
+			dnl function body
+			[
+	int fd;
+	char *line;
+
+	close(0);
+	close(1);
+	fd = open("/dev/null", 2);	/* should get fd 0 */
+	dup(fd);
+	line = readline("giveittome> ");
+
+	/* some printfs don't handle NULL for %s */
+	printf("got <%s>\n", line ? line : "(NULL)");
+],
+dnl action if found:
+			[_found_readline=yes],
+dnl action if not found:
+			[_found_readline=no]
+		)
+	)
+
+        AC_MSG_RESULT([$_found_readline])
+
+        LIBS=$_readline_save_libs
+
+        if test $_found_readline = yes ; then
+	   case $host_os in
+	   *bsd* )	AC_CHECK_LIB(termcap, tgetent, _combo="$_combo -ltermcap")
+	  	 ;;
+	   esac
+           AC_DEFINE(HAVE_LIBREADLINE,1,
+	      [Define to 1 if you have a fully functional readline library.])
+           AC_SUBST(LIBREADLINE,$_combo)
+
+	   AC_CHECK_LIB(readline, history_list,
+		[AC_DEFINE(HAVE_HISTORY_LIST, 1, [Do we have history_list?])],
+		[],
+		[$_combo])
+
+           break
+        fi
+     done
+
+     unset _termcap
+     unset _readline_save_libs
+     unset _combo
+     unset _found_readline
+  fi
+])dnl
diff --git a/gawk-5.0.1/m4/signed.m4 b/gawk-5.0.1/m4/signed.m4
new file mode 100644
index 00000000000..048f593698b
--- /dev/null
+++ b/gawk-5.0.1/m4/signed.m4
@@ -0,0 +1,17 @@
+# signed.m4 serial 1 (gettext-0.10.40)
+dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([bh_C_SIGNED],
+[
+  AC_CACHE_CHECK([for signed], bh_cv_c_signed,
+   [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)])
+  if test $bh_cv_c_signed = no; then
+    AC_DEFINE(signed, ,
+              [Define to empty if the C compiler doesn't support this keyword.])
+  fi
+])
diff --git a/gawk-5.0.1/m4/size_max.m4 b/gawk-5.0.1/m4/size_max.m4
new file mode 100644
index 00000000000..7e192d5e962
--- /dev/null
+++ b/gawk-5.0.1/m4/size_max.m4
@@ -0,0 +1,79 @@
+# size_max.m4 serial 10
+dnl Copyright (C) 2003, 2005-2006, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+  AC_CHECK_HEADERS([stdint.h])
+  dnl First test whether the system already has SIZE_MAX.
+  AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [
+    gl_cv_size_max=
+    AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], [gl_cv_size_max=yes])
+    if test -z "$gl_cv_size_max"; then
+      dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+      dnl than the type 'unsigned long'. Try hard to find a definition that can
+      dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
+      AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1],
+        [#include <stddef.h>
+#include <limits.h>], [size_t_bits_minus_1=])
+      AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)],
+        [#include <stddef.h>], [fits_in_uint=])
+      if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
+        if test $fits_in_uint = 1; then
+          dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+          dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+          AC_COMPILE_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[#include <stddef.h>
+                 extern size_t foo;
+                 extern unsigned long foo;
+               ]],
+               [[]])],
+            [fits_in_uint=0])
+        fi
+        dnl We cannot use 'expr' to simplify this expression, because 'expr'
+        dnl works only with 'long' integers in the host environment, while we
+        dnl might be cross-compiling from a 32-bit platform to a 64-bit platform.
+        if test $fits_in_uint = 1; then
+          gl_cv_size_max="(((1U << $size_t_bits_minus_1) - 1) * 2 + 1)"
+        else
+          gl_cv_size_max="(((1UL << $size_t_bits_minus_1) - 1) * 2 + 1)"
+        fi
+      else
+        dnl Shouldn't happen, but who knows...
+        gl_cv_size_max='((size_t)~(size_t)0)'
+      fi
+    fi
+  ])
+  if test "$gl_cv_size_max" != yes; then
+    AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max],
+      [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+  fi
+  dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after
+  dnl <stdint.h>. Remember that the #undef in AH_VERBATIM gets replaced with
+  dnl #define by AC_DEFINE_UNQUOTED.
+  AH_VERBATIM([SIZE_MAX],
+[/* Define as the maximum value of type 'size_t', if the system doesn't define
+   it. */
+#ifndef SIZE_MAX
+# undef SIZE_MAX
+#endif])
+])
+
+dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
+dnl Remove this when we can assume autoconf >= 2.61.
+m4_ifdef([AC_COMPUTE_INT], [], [
+  AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
+])
diff --git a/gawk-5.0.1/m4/socket.m4 b/gawk-5.0.1/m4/socket.m4
new file mode 100644
index 00000000000..ae86b3494c9
--- /dev/null
+++ b/gawk-5.0.1/m4/socket.m4
@@ -0,0 +1,85 @@
+dnl
+dnl socket.m4 --- autoconf input file for gawk
+dnl
+dnl Copyright (C) 1995, 1996, 1998, 1999, 2000, 2003, 2004 the Free Software Foundation, Inc.
+dnl
+dnl This file is part of GAWK, the GNU implementation of the
+dnl AWK Progamming Language.
+dnl
+dnl GAWK is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 3 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl GAWK is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+dnl
+
+dnl Find the socket libraries
+dnl largely stolen from AC_PATH_XTRA
+AC_DEFUN([GAWK_AC_LIB_SOCKETS], [
+gawk_have_sockets=no
+# Check for system-dependent location of socket libraries
+
+SOCKET_LIBS=
+if test "$ISC" = yes; then
+  SOCKET_LIBS="-lnsl_s -linet"
+else
+  # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X
+  # libraries were built with DECnet support.  And karl@cs.umb.edu says
+  # the Alpha needs dnet_stub (dnet does not exist).
+  #
+  # ADR: Is this needed just for sockets???
+#  AC_CHECK_LIB(dnet, dnet_ntoa, [SOCKET_LIBS="$SOCKET_LIBS -ldnet"])
+#  if test $ac_cv_lib_dnet_ntoa = no; then
+#    AC_CHECK_LIB(dnet_stub, dnet_ntoa,
+#	[SOCKET_LIBS="$SOCKET_LIBS -ldnet_stub"])
+#  fi
+
+  # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+  # to get the SysV transport functions.
+  # chad@anasazi.com says the Pyramid MIS-ES running DC/OSx (SVR4)
+  # needs -lnsl.
+  # The nsl library prevents programs from opening the X display
+  # on Irix 5.2, according to dickey@clark.net.
+  AC_CHECK_FUNC(gethostbyname)
+  if test $ac_cv_func_gethostbyname = no; then
+    AC_CHECK_LIB(nsl, gethostbyname, SOCKET_LIBS="$SOCKET_LIBS -lnsl")
+  fi
+
+  # lieder@skyler.mavd.honeywell.com says without -lsocket,
+  # socket/setsockopt and other routines are undefined under SCO ODT
+  # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
+  # on later versions), says simon@lia.di.epfl.ch: it contains
+  # gethostby* variants that don't use the nameserver (or something).
+  # -lsocket must be given before -lnsl if both are needed.
+  # We assume that if connect needs -lnsl, so does gethostbyname.
+  AC_CHECK_FUNC(connect)
+  if test $ac_cv_func_connect = no; then
+    AC_CHECK_LIB(socket, connect, SOCKET_LIBS="-lsocket $SOCKET_LIBS"
+    				  gawk_have_sockets=yes, ,
+	$SOCKET_LIBS)
+  else
+    gawk_have_sockets=yes
+  fi
+fi
+
+if test "${gawk_have_sockets}" = "yes"
+then
+	AC_MSG_CHECKING([where to find the socket library calls])
+	case "${SOCKET_LIBS}" in
+	?*)	gawk_lib_loc="${SOCKET_LIBS}" ;;
+	*)	gawk_lib_loc="the standard library" ;;
+	esac
+	AC_MSG_RESULT([${gawk_lib_loc}])
+
+	AC_DEFINE(HAVE_SOCKETS, 1, [we have sockets on this system])
+fi
+AC_SUBST(SOCKET_LIBS)dnl
+])dnl
diff --git a/gawk-5.0.1/m4/stdint_h.m4 b/gawk-5.0.1/m4/stdint_h.m4
new file mode 100644
index 00000000000..7fc2ce9a838
--- /dev/null
+++ b/gawk-5.0.1/m4/stdint_h.m4
@@ -0,0 +1,27 @@
+# stdint_h.m4 serial 9
+dnl Copyright (C) 1997-2004, 2006, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([gl_AC_HEADER_STDINT_H],
+[
+  AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <sys/types.h>
+            #include <stdint.h>]],
+          [[uintmax_t i = (uintmax_t) -1; return !i;]])],
+       [gl_cv_header_stdint_h=yes],
+       [gl_cv_header_stdint_h=no])])
+  if test $gl_cv_header_stdint_h = yes; then
+    AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1],
+      [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
diff --git a/gawk-5.0.1/m4/threadlib.m4 b/gawk-5.0.1/m4/threadlib.m4
new file mode 100644
index 00000000000..dc9a3d8e844
--- /dev/null
+++ b/gawk-5.0.1/m4/threadlib.m4
@@ -0,0 +1,389 @@
+# threadlib.m4 serial 11 (gettext-0.18.2)
+dnl Copyright (C) 2005-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl gl_THREADLIB
+dnl ------------
+dnl Tests for a multithreading library to be used.
+dnl If the configure.ac contains a definition of the gl_THREADLIB_DEFAULT_NO
+dnl (it must be placed before the invocation of gl_THREADLIB_EARLY!), then the
+dnl default is 'no', otherwise it is system dependent. In both cases, the user
+dnl can change the choice through the options --enable-threads=choice or
+dnl --disable-threads.
+dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS,
+dnl USE_PTH_THREADS, USE_WINDOWS_THREADS
+dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
+dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
+dnl libtool).
+dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
+dnl programs that really need multithread functionality. The difference
+dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
+dnl symbols, typically LIBTHREAD is empty whereas LIBMULTITHREAD is not.
+dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
+dnl multithread-safe programs.
+
+AC_DEFUN([gl_THREADLIB_EARLY],
+[
+  AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
+])
+
+dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once.
+
+AC_DEFUN([gl_THREADLIB_EARLY_BODY],
+[
+  dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
+  dnl influences the result of the autoconf tests that test for *_unlocked
+  dnl declarations, on AIX 5 at least. Therefore it must come early.
+  AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
+  AC_BEFORE([$0], [gl_ARGP])dnl
+
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
+  dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
+  dnl AC_GNU_SOURCE.
+  m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
+    [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
+    [AC_REQUIRE([AC_GNU_SOURCE])])
+  dnl Check for multithreading.
+  m4_ifdef([gl_THREADLIB_DEFAULT_NO],
+    [m4_divert_text([DEFAULTS], [gl_use_threads_default=no])],
+    [m4_divert_text([DEFAULTS], [gl_use_threads_default=])])
+  AC_ARG_ENABLE([threads],
+AC_HELP_STRING([--enable-threads={posix|solaris|pth|windows}], [specify multithreading API])m4_ifdef([gl_THREADLIB_DEFAULT_NO], [], [
+AC_HELP_STRING([--disable-threads], [build without multithread safety])]),
+    [gl_use_threads=$enableval],
+    [if test -n "$gl_use_threads_default"; then
+       gl_use_threads="$gl_use_threads_default"
+     else
+changequote(,)dnl
+       case "$host_os" in
+         dnl Disable multithreading by default on OSF/1, because it interferes
+         dnl with fork()/exec(): When msgexec is linked with -lpthread, its
+         dnl child process gets an endless segmentation fault inside execvp().
+         dnl Disable multithreading by default on Cygwin 1.5.x, because it has
+         dnl bugs that lead to endless loops or crashes. See
+         dnl <http://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
+         osf*) gl_use_threads=no ;;
+         cygwin*)
+               case `uname -r` in
+                 1.[0-5].*) gl_use_threads=no ;;
+                 *)         gl_use_threads=yes ;;
+               esac
+               ;;
+         *)    gl_use_threads=yes ;;
+       esac
+changequote([,])dnl
+     fi
+    ])
+  if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+    # For using <pthread.h>:
+    case "$host_os" in
+      osf*)
+        # On OSF/1, the compiler needs the flag -D_REENTRANT so that it
+        # groks <pthread.h>. cc also understands the flag -pthread, but
+        # we don't use it because 1. gcc-2.95 doesn't understand -pthread,
+        # 2. putting a flag into CPPFLAGS that has an effect on the linker
+        # causes the AC_LINK_IFELSE test below to succeed unexpectedly,
+        # leading to wrong values of LIBTHREAD and LTLIBTHREAD.
+        CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+        ;;
+    esac
+    # Some systems optimize for single-threaded programs by default, and
+    # need special flags to disable these optimizations. For example, the
+    # definition of 'errno' in <errno.h>.
+    case "$host_os" in
+      aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
+      solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
+    esac
+  fi
+])
+
+dnl The guts of gl_THREADLIB. Needs to be expanded only once.
+
+AC_DEFUN([gl_THREADLIB_BODY],
+[
+  AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
+  gl_threads_api=none
+  LIBTHREAD=
+  LTLIBTHREAD=
+  LIBMULTITHREAD=
+  LTLIBMULTITHREAD=
+  if test "$gl_use_threads" != no; then
+    dnl Check whether the compiler and linker support weak declarations.
+    AC_CACHE_CHECK([whether imported symbols can be declared weak],
+      [gl_cv_have_weak],
+      [gl_cv_have_weak=no
+       dnl First, test whether the compiler accepts it syntactically.
+       AC_LINK_IFELSE(
+         [AC_LANG_PROGRAM(
+            [[extern void xyzzy ();
+#pragma weak xyzzy]],
+            [[xyzzy();]])],
+         [gl_cv_have_weak=maybe])
+       if test $gl_cv_have_weak = maybe; then
+         dnl Second, test whether it actually works. On Cygwin 1.7.2, with
+         dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
+         AC_RUN_IFELSE(
+           [AC_LANG_SOURCE([[
+#include <stdio.h>
+#pragma weak fputs
+int main ()
+{
+  return (fputs == NULL);
+}]])],
+           [gl_cv_have_weak=yes],
+           [gl_cv_have_weak=no],
+           [dnl When cross-compiling, assume that only ELF platforms support
+            dnl weak symbols.
+            AC_EGREP_CPP([Extensible Linking Format],
+              [#ifdef __ELF__
+               Extensible Linking Format
+               #endif
+              ],
+              [gl_cv_have_weak="guessing yes"],
+              [gl_cv_have_weak="guessing no"])
+           ])
+       fi
+      ])
+    if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
+      # On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
+      # it groks <pthread.h>. It's added above, in gl_THREADLIB_EARLY_BODY.
+      AC_CHECK_HEADER([pthread.h],
+        [gl_have_pthread_h=yes], [gl_have_pthread_h=no])
+      if test "$gl_have_pthread_h" = yes; then
+        # Other possible tests:
+        #   -lpthreads (FSU threads, PCthreads)
+        #   -lgthreads
+        gl_have_pthread=
+        # Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
+        # in libc. IRIX 6.5 has the first one in both libc and libpthread, but
+        # the second one only in libpthread, and lock.c needs it.
+        #
+        # If -pthread works, prefer it to -lpthread, since Ubuntu 14.04
+        # needs -pthread for some reason.  See:
+        # http://lists.gnu.org/archive/html/bug-gnulib/2014-09/msg00023.html
+        save_LIBS=$LIBS
+        for gl_pthread in '' '-pthread'; do
+          LIBS="$LIBS $gl_pthread"
+          AC_LINK_IFELSE(
+            [AC_LANG_PROGRAM(
+               [[#include <pthread.h>
+                 pthread_mutex_t m;
+                 pthread_mutexattr_t ma;
+               ]],
+               [[pthread_mutex_lock (&m);
+                 pthread_mutexattr_init (&ma);]])],
+            [gl_have_pthread=yes
+             LIBTHREAD=$gl_pthread LTLIBTHREAD=$gl_pthread
+             LIBMULTITHREAD=$gl_pthread LTLIBMULTITHREAD=$gl_pthread])
+          LIBS=$save_LIBS
+          test -n "$gl_have_pthread" && break
+        done
+
+        # Test for libpthread by looking for pthread_kill. (Not pthread_self,
+        # since it is defined as a macro on OSF/1.)
+        if test -n "$gl_have_pthread" && test -z "$LIBTHREAD"; then
+          # The program links fine without libpthread. But it may actually
+          # need to link with libpthread in order to create multiple threads.
+          AC_CHECK_LIB([pthread], [pthread_kill],
+            [LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread
+             # On Solaris and HP-UX, most pthread functions exist also in libc.
+             # Therefore pthread_in_use() needs to actually try to create a
+             # thread: pthread_create from libc will fail, whereas
+             # pthread_create will actually create a thread.
+             case "$host_os" in
+               solaris* | hpux*)
+                 AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
+                   [Define if the pthread_in_use() detection is hard.])
+             esac
+            ])
+        elif test -z "$gl_have_pthread"; then
+          # Some library is needed. Try libpthread and libc_r.
+          AC_CHECK_LIB([pthread], [pthread_kill],
+            [gl_have_pthread=yes
+             LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread
+             LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread])
+          if test -z "$gl_have_pthread"; then
+            # For FreeBSD 4.
+            AC_CHECK_LIB([c_r], [pthread_kill],
+              [gl_have_pthread=yes
+               LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r
+               LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r])
+          fi
+        fi
+        if test -n "$gl_have_pthread"; then
+          gl_threads_api=posix
+          AC_DEFINE([USE_POSIX_THREADS], [1],
+            [Define if the POSIX multithreading library can be used.])
+          if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+            if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+              AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
+                [Define if references to the POSIX multithreading library should be made weak.])
+              LIBTHREAD=
+              LTLIBTHREAD=
+            fi
+          fi
+        fi
+      fi
+    fi
+    if test -z "$gl_have_pthread"; then
+      if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then
+        gl_have_solaristhread=
+        gl_save_LIBS="$LIBS"
+        LIBS="$LIBS -lthread"
+        AC_LINK_IFELSE(
+          [AC_LANG_PROGRAM(
+             [[
+#include <thread.h>
+#include <synch.h>
+             ]],
+             [[thr_self();]])],
+          [gl_have_solaristhread=yes])
+        LIBS="$gl_save_LIBS"
+        if test -n "$gl_have_solaristhread"; then
+          gl_threads_api=solaris
+          LIBTHREAD=-lthread
+          LTLIBTHREAD=-lthread
+          LIBMULTITHREAD="$LIBTHREAD"
+          LTLIBMULTITHREAD="$LTLIBTHREAD"
+          AC_DEFINE([USE_SOLARIS_THREADS], [1],
+            [Define if the old Solaris multithreading library can be used.])
+          if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+            AC_DEFINE([USE_SOLARIS_THREADS_WEAK], [1],
+              [Define if references to the old Solaris multithreading library should be made weak.])
+            LIBTHREAD=
+            LTLIBTHREAD=
+          fi
+        fi
+      fi
+    fi
+    if test "$gl_use_threads" = pth; then
+      gl_save_CPPFLAGS="$CPPFLAGS"
+      AC_LIB_LINKFLAGS([pth])
+      gl_have_pth=
+      gl_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBPTH"
+      AC_LINK_IFELSE(
+        [AC_LANG_PROGRAM([[#include <pth.h>]], [[pth_self();]])],
+        [gl_have_pth=yes])
+      LIBS="$gl_save_LIBS"
+      if test -n "$gl_have_pth"; then
+        gl_threads_api=pth
+        LIBTHREAD="$LIBPTH"
+        LTLIBTHREAD="$LTLIBPTH"
+        LIBMULTITHREAD="$LIBTHREAD"
+        LTLIBMULTITHREAD="$LTLIBTHREAD"
+        AC_DEFINE([USE_PTH_THREADS], [1],
+          [Define if the GNU Pth multithreading library can be used.])
+        if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
+          if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
+            AC_DEFINE([USE_PTH_THREADS_WEAK], [1],
+              [Define if references to the GNU Pth multithreading library should be made weak.])
+            LIBTHREAD=
+            LTLIBTHREAD=
+          fi
+        fi
+      else
+        CPPFLAGS="$gl_save_CPPFLAGS"
+      fi
+    fi
+    if test -z "$gl_have_pthread"; then
+      case "$gl_use_threads" in
+        yes | windows | win32) # The 'win32' is for backward compatibility.
+          if { case "$host_os" in
+                 mingw*) true;;
+                 *) false;;
+               esac
+             }; then
+            gl_threads_api=windows
+            AC_DEFINE([USE_WINDOWS_THREADS], [1],
+              [Define if the native Windows multithreading API can be used.])
+          fi
+          ;;
+      esac
+    fi
+  fi
+  AC_MSG_CHECKING([for multithread API to use])
+  AC_MSG_RESULT([$gl_threads_api])
+  AC_SUBST([LIBTHREAD])
+  AC_SUBST([LTLIBTHREAD])
+  AC_SUBST([LIBMULTITHREAD])
+  AC_SUBST([LTLIBMULTITHREAD])
+])
+
+AC_DEFUN([gl_THREADLIB],
+[
+  AC_REQUIRE([gl_THREADLIB_EARLY])
+  AC_REQUIRE([gl_THREADLIB_BODY])
+])
+
+
+dnl gl_DISABLE_THREADS
+dnl ------------------
+dnl Sets the gl_THREADLIB default so that threads are not used by default.
+dnl The user can still override it at installation time, by using the
+dnl configure option '--enable-threads'.
+
+AC_DEFUN([gl_DISABLE_THREADS], [
+  m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no])
+])
+
+
+dnl Survey of platforms:
+dnl
+dnl Platform           Available  Compiler    Supports   test-lock
+dnl                    flavours   option      weak       result
+dnl ---------------    ---------  ---------   --------   ---------
+dnl Linux 2.4/glibc    posix      -lpthread       Y      OK
+dnl
+dnl GNU Hurd/glibc     posix
+dnl
+dnl Ubuntu 14.04       posix      -pthread        Y      OK
+dnl
+dnl FreeBSD 5.3        posix      -lc_r           Y
+dnl                    posix      -lkse ?         Y
+dnl                    posix      -lpthread ?     Y
+dnl                    posix      -lthr           Y
+dnl
+dnl FreeBSD 5.2        posix      -lc_r           Y
+dnl                    posix      -lkse           Y
+dnl                    posix      -lthr           Y
+dnl
+dnl FreeBSD 4.0,4.10   posix      -lc_r           Y      OK
+dnl
+dnl NetBSD 1.6         --
+dnl
+dnl OpenBSD 3.4        posix      -lpthread       Y      OK
+dnl
+dnl Mac OS X 10.[123]  posix      -lpthread       Y      OK
+dnl
+dnl Solaris 7,8,9      posix      -lpthread       Y      Sol 7,8: 0.0; Sol 9: OK
+dnl                    solaris    -lthread        Y      Sol 7,8: 0.0; Sol 9: OK
+dnl
+dnl HP-UX 11           posix      -lpthread       N (cc) OK
+dnl                                               Y (gcc)
+dnl
+dnl IRIX 6.5           posix      -lpthread       Y      0.5
+dnl
+dnl AIX 4.3,5.1        posix      -lpthread       N      AIX 4: 0.5; AIX 5: OK
+dnl
+dnl OSF/1 4.0,5.1      posix      -pthread (cc)   N      OK
+dnl                               -lpthread (gcc) Y
+dnl
+dnl Cygwin             posix      -lpthread       Y      OK
+dnl
+dnl Any of the above   pth        -lpth                  0.0
+dnl
+dnl Mingw              windows                    N      OK
+dnl
+dnl BeOS 5             --
+dnl
+dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
+dnl turned off:
+dnl   OK if all three tests terminate OK,
+dnl   0.5 if the first test terminates OK but the second one loops endlessly,
+dnl   0.0 if the first test already loops endlessly.
diff --git a/gawk-5.0.1/m4/uintmax_t.m4 b/gawk-5.0.1/m4/uintmax_t.m4
new file mode 100644
index 00000000000..03b51bcfe37
--- /dev/null
+++ b/gawk-5.0.1/m4/uintmax_t.m4
@@ -0,0 +1,30 @@
+# uintmax_t.m4 serial 12
+dnl Copyright (C) 1997-2004, 2007-2010 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+AC_PREREQ([2.13])
+
+# Define uintmax_t to 'unsigned long' or 'unsigned long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([gl_AC_TYPE_UINTMAX_T],
+[
+  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
+  if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
+    AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+    test $ac_cv_type_unsigned_long_long_int = yes \
+      && ac_type='unsigned long long' \
+      || ac_type='unsigned long'
+    AC_DEFINE_UNQUOTED([uintmax_t], [$ac_type],
+      [Define to unsigned long or unsigned long long
+       if <stdint.h> and <inttypes.h> don't define.])
+  else
+    AC_DEFINE([HAVE_UINTMAX_T], [1],
+      [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+  fi
+])
diff --git a/gawk-5.0.1/m4/ulonglong.m4 b/gawk-5.0.1/m4/ulonglong.m4
new file mode 100644
index 00000000000..9fae98e3a6c
--- /dev/null
+++ b/gawk-5.0.1/m4/ulonglong.m4
@@ -0,0 +1,48 @@
+# ulonglong.m4 serial 6
+dnl Copyright (C) 1999-2006 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Paul Eggert.
+
+# Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
+# This fixes a bug in Autoconf 2.60, but can be removed once we
+# assume 2.61 everywhere.
+
+# Note: If the type 'unsigned long long int' exists but is only 32 bits
+# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
+# will not be defined. In this case you can treat 'unsigned long long int'
+# like 'unsigned long int'.
+
+AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
+[
+  AC_CACHE_CHECK([for unsigned long long int],
+    [ac_cv_type_unsigned_long_long_int],
+    [AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM(
+	  [[unsigned long long int ull = 18446744073709551615ULL;
+	    typedef int a[(18446744073709551615ULL <= (unsigned long long int) -1
+			   ? 1 : -1)];
+	   int i = 63;]],
+	  [[unsigned long long int ullmax = 18446744073709551615ull;
+	    return (ull << 63 | ull >> 63 | ull << i | ull >> i
+		    | ullmax / ull | ullmax % ull);]])],
+       [ac_cv_type_unsigned_long_long_int=yes],
+       [ac_cv_type_unsigned_long_long_int=no])])
+  if test $ac_cv_type_unsigned_long_long_int = yes; then
+    AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], 1,
+      [Define to 1 if the system has the type `unsigned long long int'.])
+  fi
+])
+
+# This macro is obsolescent and should go away soon.
+AC_DEFUN([gl_AC_TYPE_UNSIGNED_LONG_LONG],
+[
+  AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+  ac_cv_type_unsigned_long_long=$ac_cv_type_unsigned_long_long_int
+  if test $ac_cv_type_unsigned_long_long = yes; then
+    AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
+      [Define if you have the 'unsigned long long' type.])
+  fi
+])
diff --git a/gawk-5.0.1/m4/visibility.m4 b/gawk-5.0.1/m4/visibility.m4
new file mode 100644
index 00000000000..552e39772d2
--- /dev/null
+++ b/gawk-5.0.1/m4/visibility.m4
@@ -0,0 +1,77 @@
+# visibility.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2005, 2008, 2010-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+
+dnl Tests whether the compiler supports the command-line option
+dnl -fvisibility=hidden and the function and variable attributes
+dnl __attribute__((__visibility__("hidden"))) and
+dnl __attribute__((__visibility__("default"))).
+dnl Does *not* test for __visibility__("protected") - which has tricky
+dnl semantics (see the 'vismain' test in glibc) and does not exist e.g. on
+dnl Mac OS X.
+dnl Does *not* test for __visibility__("internal") - which has processor
+dnl dependent semantics.
+dnl Does *not* test for #pragma GCC visibility push(hidden) - which is
+dnl "really only recommended for legacy code".
+dnl Set the variable CFLAG_VISIBILITY.
+dnl Defines and sets the variable HAVE_VISIBILITY.
+
+AC_DEFUN([gl_VISIBILITY],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  CFLAG_VISIBILITY=
+  HAVE_VISIBILITY=0
+  if test -n "$GCC"; then
+    dnl First, check whether -Werror can be added to the command line, or
+    dnl whether it leads to an error because of some other option that the
+    dnl user has put into $CC $CFLAGS $CPPFLAGS.
+    AC_MSG_CHECKING([whether the -Werror option is usable])
+    AC_CACHE_VAL([gl_cv_cc_vis_werror], [
+      gl_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS -Werror"
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM([[]], [[]])],
+        [gl_cv_cc_vis_werror=yes],
+        [gl_cv_cc_vis_werror=no])
+      CFLAGS="$gl_save_CFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cc_vis_werror])
+    dnl Now check whether visibility declarations are supported.
+    AC_MSG_CHECKING([for simple visibility declarations])
+    AC_CACHE_VAL([gl_cv_cc_visibility], [
+      gl_save_CFLAGS="$CFLAGS"
+      CFLAGS="$CFLAGS -fvisibility=hidden"
+      dnl We use the option -Werror and a function dummyfunc, because on some
+      dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
+      dnl "visibility attribute not supported in this configuration; ignored"
+      dnl at the first function definition in every compilation unit, and we
+      dnl don't want to use the option in this case.
+      if test $gl_cv_cc_vis_werror = yes; then
+        CFLAGS="$CFLAGS -Werror"
+      fi
+      AC_COMPILE_IFELSE(
+        [AC_LANG_PROGRAM(
+           [[extern __attribute__((__visibility__("hidden"))) int hiddenvar;
+             extern __attribute__((__visibility__("default"))) int exportedvar;
+             extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
+             extern __attribute__((__visibility__("default"))) int exportedfunc (void);
+             void dummyfunc (void) {}
+           ]],
+           [[]])],
+        [gl_cv_cc_visibility=yes],
+        [gl_cv_cc_visibility=no])
+      CFLAGS="$gl_save_CFLAGS"])
+    AC_MSG_RESULT([$gl_cv_cc_visibility])
+    if test $gl_cv_cc_visibility = yes; then
+      CFLAG_VISIBILITY="-fvisibility=hidden"
+      HAVE_VISIBILITY=1
+    fi
+  fi
+  AC_SUBST([CFLAG_VISIBILITY])
+  AC_SUBST([HAVE_VISIBILITY])
+  AC_DEFINE_UNQUOTED([HAVE_VISIBILITY], [$HAVE_VISIBILITY],
+    [Define to 1 or 0, depending whether the compiler supports simple visibility declarations.])
+])
diff --git a/gawk-5.0.1/m4/wchar_t.m4 b/gawk-5.0.1/m4/wchar_t.m4
new file mode 100644
index 00000000000..839a04c17c3
--- /dev/null
+++ b/gawk-5.0.1/m4/wchar_t.m4
@@ -0,0 +1,24 @@
+# wchar_t.m4 serial 4 (gettext-0.18.2)
+dnl Copyright (C) 2002-2003, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+  AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[#include <stddef.h>
+            wchar_t foo = (wchar_t)'\0';]],
+          [[]])],
+       [gt_cv_c_wchar_t=yes],
+       [gt_cv_c_wchar_t=no])])
+  if test $gt_cv_c_wchar_t = yes; then
+    AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.])
+  fi
+])
diff --git a/gawk-5.0.1/m4/wint_t.m4 b/gawk-5.0.1/m4/wint_t.m4
new file mode 100644
index 00000000000..9b07b070900
--- /dev/null
+++ b/gawk-5.0.1/m4/wint_t.m4
@@ -0,0 +1,32 @@
+# wint_t.m4 serial 5 (gettext-0.18.2)
+dnl Copyright (C) 2003, 2007-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+  AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_PROGRAM(
+          [[
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
+   <wchar.h>.
+   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
+   before <wchar.h>.  */
+#include <stddef.h>
+#include <stdio.h>
+#include <time.h>
+#include <wchar.h>
+            wint_t foo = (wchar_t)'\0';]],
+          [[]])],
+       [gt_cv_c_wint_t=yes],
+       [gt_cv_c_wint_t=no])])
+  if test $gt_cv_c_wint_t = yes; then
+    AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.])
+  fi
+])
diff --git a/gawk-5.0.1/m4/xsize.m4 b/gawk-5.0.1/m4/xsize.m4
new file mode 100644
index 00000000000..3af23ec75b8
--- /dev/null
+++ b/gawk-5.0.1/m4/xsize.m4
@@ -0,0 +1,12 @@
+# xsize.m4 serial 5
+dnl Copyright (C) 2003-2004, 2008-2014 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_XSIZE],
+[
+  dnl Prerequisites of lib/xsize.h.
+  AC_REQUIRE([gl_SIZE_MAX])
+  AC_CHECK_HEADERS([stdint.h])
+])
diff --git a/gawk-5.0.1/main.c b/gawk-5.0.1/main.c
new file mode 100644
index 00000000000..925f4fc07da
--- /dev/null
+++ b/gawk-5.0.1/main.c
@@ -0,0 +1,1845 @@
+/*
+ * main.c -- Code generator and main program for gawk.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2019 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/* FIX THIS BEFORE EVERY RELEASE: */
+#define UPDATE_YEAR	2019
+
+#include "awk.h"
+#include "getopt.h"
+
+#ifdef HAVE_MCHECK_H
+#include <mcheck.h>
+#endif
+
+#ifdef HAVE_LIBSIGSEGV
+#include <sigsegv.h>
+#else
+typedef void *stackoverflow_context_t;
+/* the argument to this macro is purposely not used */
+#define sigsegv_install_handler(catchsegv) signal(SIGSEGV, catchsig)
+/* define as 0 rather than empty so that (void) cast on it works */
+#define stackoverflow_install_handler(catchstackoverflow, extra_stack, STACK_SIZE) 0
+#endif
+
+#define DEFAULT_PROFILE		"awkprof.out"	/* where to put profile */
+#define DEFAULT_VARFILE		"awkvars.out"	/* where to put vars */
+#define DEFAULT_PREC		53
+#define DEFAULT_ROUNDMODE	"N"		/* round to nearest */
+
+static const char *varfile = DEFAULT_VARFILE;
+const char *command_file = NULL;	/* debugger commands */
+
+static void usage(int exitval, FILE *fp) ATTRIBUTE_NORETURN;
+static void copyleft(void) ATTRIBUTE_NORETURN;
+static void cmdline_fs(char *str);
+static void init_args(int argc0, int argc, const char *argv0, char **argv);
+static void init_vars(void);
+static NODE *load_environ(void);
+static NODE *load_procinfo(void);
+static void catchsig(int sig);
+#ifdef HAVE_LIBSIGSEGV
+static int catchsegv(void *fault_address, int serious);
+static void catchstackoverflow(int emergency, stackoverflow_context_t scp);
+#endif
+static void nostalgia(void) ATTRIBUTE_NORETURN;
+static void version(void) ATTRIBUTE_NORETURN;
+static void init_fds(void);
+static void init_groupset(void);
+static void save_argv(int, char **);
+static const char *platform_name();
+
+/* These nodes store all the special variables AWK uses */
+NODE *ARGC_node, *ARGIND_node, *ARGV_node, *BINMODE_node, *CONVFMT_node;
+NODE *ENVIRON_node, *ERRNO_node, *FIELDWIDTHS_node, *FILENAME_node;
+NODE *FNR_node, *FPAT_node, *FS_node, *IGNORECASE_node, *LINT_node;
+NODE *NF_node, *NR_node, *OFMT_node, *OFS_node, *ORS_node, *PROCINFO_node;
+NODE *RLENGTH_node, *RSTART_node, *RS_node, *RT_node, *SUBSEP_node;
+NODE *PREC_node, *ROUNDMODE_node;
+NODE *TEXTDOMAIN_node;
+
+long NF;
+long NR;
+long FNR;
+int BINMODE;
+bool IGNORECASE;
+char *OFS;
+char *ORS;
+char *OFMT;
+char *TEXTDOMAIN;
+
+/*
+ * CONVFMT is a convenience pointer for the current number to string format.
+ * We must supply an initial value to avoid recursion problems of
+ *	set_CONVFMT -> fmt_index -> force_string: gets NULL CONVFMT
+ * Fun, fun, fun, fun.
+ */
+char *CONVFMT = "%.6g";
+
+NODE *Nnull_string;		/* The global null string */
+
+#if defined(HAVE_LOCALE_H)
+struct lconv loc;		/* current locale */
+static void init_locale(struct lconv *l);
+#endif /* defined(HAVE_LOCALE_H) */
+
+/* The name the program was invoked under, for error messages */
+const char *myname;
+
+/* A block of AWK code to be run */
+INSTRUCTION *code_block = NULL;
+
+char **d_argv;			/* saved argv for debugger restarting */
+/*
+ * List of rules and functions with first and last instruction (source_line)
+ * information; used for profiling and debugging.
+ */
+INSTRUCTION *rule_list;
+
+int exit_val = EXIT_SUCCESS;		/* exit value */
+
+#if defined(YYDEBUG) || defined(GAWKDEBUG)
+extern int yydebug;
+#endif
+
+SRCFILE *srcfiles; /* source files */
+
+/*
+ * structure to remember variable pre-assignments
+ */
+struct pre_assign {
+	enum assign_type { PRE_ASSIGN = 1, PRE_ASSIGN_FS } type;
+	char *val;
+};
+
+static struct pre_assign *preassigns = NULL;	/* requested via -v or -F */
+static long numassigns = -1;			/* how many of them */
+
+static bool disallow_var_assigns = false;	/* true for --exec */
+
+static void add_preassign(enum assign_type type, char *val);
+
+static void parse_args(int argc, char **argv);
+static void set_locale_stuff(void);
+static bool stopped_early = false;
+
+int do_flags = false;
+bool do_optimize = true;		/* apply default optimizations */
+static int do_nostalgia = false;	/* provide a blast from the past */
+static int do_binary = false;		/* hands off my data! */
+static int do_version = false;		/* print version info */
+static const char *locale = "";		/* default value to setlocale */
+static char *locale_dir = LOCALEDIR;	/* default locale dir */
+
+int use_lc_numeric = false;	/* obey locale for decimal point */
+
+int gawk_mb_cur_max;		/* MB_CUR_MAX value, see comment in main() */
+
+FILE *output_fp;		/* default gawk output, can be redirected in the debugger */
+bool output_is_tty = false;	/* control flushing of output */
+
+/* default format for strftime(), available via PROCINFO */
+const char def_strftime_format[] = "%a %b %e %H:%M:%S %Z %Y";
+
+extern const char *version_string;
+
+#if defined (HAVE_GETGROUPS) && defined(NGROUPS_MAX) && NGROUPS_MAX > 0
+GETGROUPS_T *groupset;		/* current group set */
+int ngroups;			/* size of said set */
+#endif
+
+void (*lintfunc)(const char *mesg, ...) = r_warning;
+
+/* Sorted by long option name! */
+static const struct option optab[] = {
+	{ "assign",		required_argument,	NULL,	'v' },
+	{ "bignum",		no_argument,		NULL,	'M' },
+	{ "characters-as-bytes", no_argument,		& do_binary,	 'b' },
+	{ "copyright",		no_argument,		NULL,	'C' },
+	{ "debug",		optional_argument,	NULL,	'D' },
+	{ "dump-variables",	optional_argument,	NULL,	'd' },
+	{ "exec",		required_argument,	NULL,	'E' },
+	{ "field-separator",	required_argument,	NULL,	'F' },
+	{ "file",		required_argument,	NULL,	'f' },
+	{ "gen-pot",		no_argument,		NULL,	'g' },
+	{ "help",		no_argument,		NULL,	'h' },
+	{ "include",		required_argument,	NULL,	'i' },
+	{ "lint",		optional_argument,	NULL,	'L' },
+	{ "lint-old",		no_argument,		NULL,	't' },
+	{ "load",		required_argument,	NULL,	'l' },
+#if defined(LOCALEDEBUG)
+	{ "locale",		required_argument,	NULL,	'Z' },
+#endif
+	{ "non-decimal-data",	no_argument,		NULL,	'n' },
+	{ "no-optimize",	no_argument,		NULL,	's' },
+	{ "nostalgia",		no_argument,		& do_nostalgia,	1 },
+	{ "optimize",		no_argument,		NULL,	'O' },
+#if defined(YYDEBUG) || defined(GAWKDEBUG)
+	{ "parsedebug",		no_argument,		NULL,	'Y' },
+#endif
+	{ "posix",		no_argument,		NULL,	'P' },
+	{ "pretty-print",	optional_argument,	NULL,	'o' },
+	{ "profile",		optional_argument,	NULL,	'p' },
+	{ "re-interval",	no_argument,		NULL,	'r' },
+	{ "sandbox",		no_argument,		NULL, 	'S' },
+	{ "source",		required_argument,	NULL,	'e' },
+	{ "traditional",	no_argument,		NULL,	'c' },
+	{ "use-lc-numeric",	no_argument,		& use_lc_numeric, 1 },
+	{ "version",		no_argument,		& do_version, 'V' },
+	{ NULL, 0, NULL, '\0' }
+};
+
+/* main --- process args, parse program, run it, clean up */
+
+int
+main(int argc, char **argv)
+{
+	int i;
+	char *extra_stack;
+	int have_srcfile = 0;
+	SRCFILE *s;
+	char *cp;
+#if defined(LOCALEDEBUG)
+	const char *initial_locale;
+#endif
+
+	/* do these checks early */
+	if (getenv("TIDYMEM") != NULL)
+		do_flags |= DO_TIDY_MEM;
+
+#ifdef HAVE_MCHECK_H
+#ifdef HAVE_MTRACE
+	if (do_tidy_mem)
+		mtrace();
+#endif /* HAVE_MTRACE */
+#endif /* HAVE_MCHECK_H */
+
+	myname = gawk_name(argv[0]);
+	os_arg_fixup(&argc, &argv); /* emulate redirection, expand wildcards */
+
+	if (argc < 2)
+		usage(EXIT_FAILURE, stderr);
+
+	if ((cp = getenv("GAWK_LOCALE_DIR")) != NULL)
+		locale_dir = cp;
+
+#if defined(F_GETFL) && defined(O_APPEND)
+	// 1/2018: This is needed on modern BSD systems so that the
+	// inplace tests pass. I think it's a bug in those kernels
+	// but let's just work around it anyway.
+	int flags = fcntl(fileno(stderr), F_GETFL, NULL);
+	if (flags >= 0 && (flags & O_APPEND) == 0) {
+		flags |= O_APPEND;
+		(void) fcntl(fileno(stderr), F_SETFL, flags);
+	}
+#endif
+
+#if defined(LOCALEDEBUG)
+	initial_locale = locale;
+#endif
+	set_locale_stuff();
+
+	(void) signal(SIGFPE, catchsig);
+#ifdef SIGBUS
+	(void) signal(SIGBUS, catchsig);
+#endif
+
+	/*
+	 * Ignore SIGPIPE so that writes to pipes that fail don't
+	 * kill the process but instead return -1 and set errno.
+	 * That lets us print a fatal message instead of dieing suddenly.
+	 *
+	 * Note that this requires ignoring EPIPE when writing and
+	 * flushing stdout/stderr in other parts of the program. E.g.,
+	 *
+	 * 	gawk 'BEGIN { print "hi" }' | exit
+	 *
+	 * should not give us "broken pipe" messages --- mainly because
+	 * it did not do so in the past and people would complain.
+	 */
+	ignore_sigpipe();
+
+	(void) sigsegv_install_handler(catchsegv);
+#define STACK_SIZE (16*1024)
+	emalloc(extra_stack, char *, STACK_SIZE, "main");
+	(void) stackoverflow_install_handler(catchstackoverflow, extra_stack, STACK_SIZE);
+#undef STACK_SIZE
+
+	/* initialize the null string */
+	Nnull_string = make_string("", 0);
+
+	/* Robustness: check that file descriptors 0, 1, 2 are open */
+	init_fds();
+
+	/* init array handling. */
+	array_init();
+
+	/* init the symbol tables */
+	init_symbol_table();
+
+	output_fp = stdout;
+
+	/* initialize global (main) execution context */
+	push_context(new_context());
+
+	parse_args(argc, argv);
+
+#if defined(LOCALEDEBUG)
+	if (locale != initial_locale)
+		set_locale_stuff();
+#endif
+
+	/*
+	 * In glibc, MB_CUR_MAX is actually a function.  This value is
+	 * tested *a lot* in many speed-critical places in gawk. Caching
+	 * this value once makes a speed difference.
+	 */
+	gawk_mb_cur_max = MB_CUR_MAX;
+
+	/* init the cache for checking bytes if they're characters */
+	init_btowc_cache();
+
+	/* set up the single byte case table */
+	if (gawk_mb_cur_max == 1)
+		load_casetable();
+
+	if (do_nostalgia)
+		nostalgia();
+
+	/* check for POSIXLY_CORRECT environment variable */
+	if (! do_posix && getenv("POSIXLY_CORRECT") != NULL) {
+		do_flags |= DO_POSIX;
+		if (do_lint)
+			lintwarn(
+	_("environment variable `POSIXLY_CORRECT' set: turning on `--posix'"));
+	}
+
+	// Checks for conflicting command-line arguments.
+	if (do_posix) {
+		use_lc_numeric = true;
+		if (do_traditional)	/* both on command line */
+			warning(_("`--posix' overrides `--traditional'"));
+		else
+			do_flags |= DO_TRADITIONAL;
+			/*
+			 * POSIX compliance also implies
+			 * no GNU extensions either.
+			 */
+	}
+
+	if (do_traditional && do_non_decimal_data) {
+		do_flags &= ~DO_NON_DEC_DATA;
+		warning(_("`--posix'/`--traditional' overrides `--non-decimal-data'"));
+	}
+
+	if (do_binary) {
+		if (do_posix)
+			warning(_("`--posix' overrides `--characters-as-bytes'"));
+		else
+			gawk_mb_cur_max = 1;	/* hands off my data! */
+#if defined(LC_ALL)
+		setlocale(LC_ALL, "C");
+#endif
+	}
+
+	if (do_lint && os_is_setuid())
+		warning(_("running %s setuid root may be a security problem"), myname);
+
+	if (do_debug)	/* Need to register the debugger pre-exec hook before any other */
+		init_debug();
+
+#ifdef HAVE_MPFR
+	/* Set up MPFR defaults, and register pre-exec hook to process arithmetic opcodes */
+	if (do_mpfr)
+		init_mpfr(DEFAULT_PREC, DEFAULT_ROUNDMODE);
+#endif
+
+	/* load group set */
+	init_groupset();
+
+#ifdef HAVE_MPFR
+	if (do_mpfr) {
+		mpz_init(Nnull_string->mpg_i);
+		Nnull_string->flags = (MALLOC|STRCUR|STRING|MPZN|NUMCUR|NUMBER);
+	} else
+#endif
+	{
+		Nnull_string->numbr = 0.0;
+		Nnull_string->flags = (MALLOC|STRCUR|STRING|NUMCUR|NUMBER);
+	}
+
+	/*
+	 * Tell the regex routines how they should work.
+	 * Do this before initializing variables, since
+	 * they could want to do a regexp compile.
+	 */
+	resetup();
+
+	/* Set up the special variables */
+	init_vars();
+
+	/* Set up the field variables */
+	init_fields();
+
+	/* Now process the pre-assignments */
+	int dash_v_errs = 0;	// bad stuff for -v
+	for (i = 0; i <= numassigns; i++) {
+		if (preassigns[i].type == PRE_ASSIGN)
+			dash_v_errs += (arg_assign(preassigns[i].val, true) == false);
+		else	/* PRE_ASSIGN_FS */
+			cmdline_fs(preassigns[i].val);
+		efree(preassigns[i].val);
+	}
+
+	if (preassigns != NULL)
+		efree(preassigns);
+
+	if ((BINMODE & BINMODE_INPUT) != 0)
+		if (os_setbinmode(fileno(stdin), O_BINARY) == -1)
+			fatal(_("can't set binary mode on stdin (%s)"), strerror(errno));
+	if ((BINMODE & BINMODE_OUTPUT) != 0) {
+		if (os_setbinmode(fileno(stdout), O_BINARY) == -1)
+			fatal(_("can't set binary mode on stdout (%s)"), strerror(errno));
+		if (os_setbinmode(fileno(stderr), O_BINARY) == -1)
+			fatal(_("can't set binary mode on stderr (%s)"), strerror(errno));
+	}
+
+#ifdef GAWKDEBUG
+	setbuf(stdout, (char *) NULL);	/* make debugging easier */
+#endif
+	if (os_isatty(fileno(stdout)))
+		output_is_tty = true;
+
+	/* initialize API before loading extension libraries */
+	init_ext_api();
+
+	/* load extension libs */
+        for (s = srcfiles->next; s != srcfiles; s = s->next) {
+                if (s->stype == SRC_EXTLIB)
+			load_ext(s->fullpath);
+		else if (s->stype != SRC_INC)
+			have_srcfile++;
+        }
+
+	/* do version check after extensions are loaded to get extension info */
+	if (do_version)
+		version();
+
+	/* No -f or --source options, use next arg */
+	if (! have_srcfile) {
+		if (optind > argc - 1 || stopped_early) /* no args left or no program */
+			usage(EXIT_FAILURE, stderr);
+		(void) add_srcfile(SRC_CMDLINE, argv[optind], srcfiles, NULL, NULL);
+		optind++;
+	}
+
+	/* Select the interpreter routine */
+	init_interpret();
+
+	init_args(optind, argc,
+			do_posix ? argv[0] : myname,
+			argv);
+
+#if defined(LC_NUMERIC)
+	/*
+	 * FRAGILE!  CAREFUL!
+	 * Pre-initing the variables with arg_assign() can change the
+	 * locale.  Force it to C before parsing the program.
+	 */
+	setlocale(LC_NUMERIC, "C");
+#endif
+	/* Read in the program */
+	if (parse_program(& code_block, false) != 0 || dash_v_errs > 0)
+		exit(EXIT_FAILURE);
+
+	if (do_intl)
+		exit(EXIT_SUCCESS);
+
+	set_current_namespace(awk_namespace);
+
+	install_builtins();
+
+	if (do_lint)
+		shadow_funcs();
+
+	if (do_lint && code_block->nexti->opcode == Op_atexit)
+		lintwarn(_("no program text at all!"));
+
+	load_symbols();
+
+	if (do_profile)
+		init_profiling_signals();
+
+#if defined(LC_NUMERIC)
+	/*
+	 * See comment above about using locale's decimal point.
+	 *
+	 * 10/2005:
+	 * Bitter experience teaches us that most people the world over
+	 * use period as the decimal point, not whatever their locale
+	 * uses.  Thus, only use the locale's decimal point if being
+	 * posixly anal-retentive.
+	 *
+	 * 7/2007:
+	 * Be a little bit kinder. Allow the --use-lc-numeric option
+	 * to also use the local decimal point. This avoids the draconian
+	 * strictness of POSIX mode if someone just wants to parse their
+	 * data using the local decimal point.
+	 */
+	if (use_lc_numeric)
+		setlocale(LC_NUMERIC, locale);
+#endif
+
+	init_io();
+	output_fp = stdout;
+
+	if (do_debug)
+		debug_prog(code_block);
+	else if (do_pretty_print && ! do_profile)
+		;	/* run pretty printer only. */
+	else
+		interpret(code_block);
+
+	if (do_pretty_print) {
+		set_current_namespace(awk_namespace);
+		dump_prog(code_block);
+		dump_funcs();
+	}
+
+	if (do_dump_vars)
+		dump_vars(varfile);
+
+#ifdef HAVE_MPFR
+	if (do_mpfr)
+		cleanup_mpfr();
+#endif
+
+	if (do_tidy_mem)
+		release_all_vars();
+
+	/* keep valgrind happier */
+	if (extra_stack)
+		efree(extra_stack);
+
+	final_exit(exit_val);
+	return exit_val;	/* to suppress warnings */
+}
+
+/* add_preassign --- add one element to preassigns */
+
+static void
+add_preassign(enum assign_type type, char *val)
+{
+	static long alloc_assigns;		/* for how many are allocated */
+
+#define INIT_SRC 4
+
+	++numassigns;
+
+	if (preassigns == NULL) {
+		emalloc(preassigns, struct pre_assign *,
+			INIT_SRC * sizeof(struct pre_assign), "add_preassign");
+		alloc_assigns = INIT_SRC;
+	} else if (numassigns >= alloc_assigns) {
+		alloc_assigns *= 2;
+		erealloc(preassigns, struct pre_assign *,
+			alloc_assigns * sizeof(struct pre_assign), "add_preassigns");
+	}
+	preassigns[numassigns].type = type;
+	preassigns[numassigns].val = estrdup(val, strlen(val));
+
+#undef INIT_SRC
+}
+
+/* usage --- print usage information and exit */
+
+static void
+usage(int exitval, FILE *fp)
+{
+	/* Not factoring out common stuff makes it easier to translate. */
+	fprintf(fp, _("Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"),
+		myname);
+	fprintf(fp, _("Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"),
+			myname, quote, quote);
+
+	/* GNU long options info. This is too many options. */
+
+	fputs(_("POSIX options:\t\tGNU long options: (standard)\n"), fp);
+	fputs(_("\t-f progfile\t\t--file=progfile\n"), fp);
+	fputs(_("\t-F fs\t\t\t--field-separator=fs\n"), fp);
+	fputs(_("\t-v var=val\t\t--assign=var=val\n"), fp);
+	fputs(_("Short options:\t\tGNU long options: (extensions)\n"), fp);
+	fputs(_("\t-b\t\t\t--characters-as-bytes\n"), fp);
+	fputs(_("\t-c\t\t\t--traditional\n"), fp);
+	fputs(_("\t-C\t\t\t--copyright\n"), fp);
+	fputs(_("\t-d[file]\t\t--dump-variables[=file]\n"), fp);
+	fputs(_("\t-D[file]\t\t--debug[=file]\n"), fp);
+	fputs(_("\t-e 'program-text'\t--source='program-text'\n"), fp);
+	fputs(_("\t-E file\t\t\t--exec=file\n"), fp);
+	fputs(_("\t-g\t\t\t--gen-pot\n"), fp);
+	fputs(_("\t-h\t\t\t--help\n"), fp);
+	fputs(_("\t-i includefile\t\t--include=includefile\n"), fp);
+	fputs(_("\t-l library\t\t--load=library\n"), fp);
+	/*
+	 * TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+	 * values, they should not be translated. Thanks.
+	 */
+	fputs(_("\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"), fp);
+	fputs(_("\t-M\t\t\t--bignum\n"), fp);
+	fputs(_("\t-N\t\t\t--use-lc-numeric\n"), fp);
+	fputs(_("\t-n\t\t\t--non-decimal-data\n"), fp);
+	fputs(_("\t-o[file]\t\t--pretty-print[=file]\n"), fp);
+	fputs(_("\t-O\t\t\t--optimize\n"), fp);
+	fputs(_("\t-p[file]\t\t--profile[=file]\n"), fp);
+	fputs(_("\t-P\t\t\t--posix\n"), fp);
+	fputs(_("\t-r\t\t\t--re-interval\n"), fp);
+	fputs(_("\t-s\t\t\t--no-optimize\n"), fp);
+	fputs(_("\t-S\t\t\t--sandbox\n"), fp);
+	fputs(_("\t-t\t\t\t--lint-old\n"), fp);
+	fputs(_("\t-V\t\t\t--version\n"), fp);
+#ifdef NOSTALGIA
+	fputs(_("\t-W nostalgia\t\t--nostalgia\n"), fp);
+#endif
+#ifdef GAWKDEBUG
+	fputs(_("\t-Y\t\t\t--parsedebug\n"), fp);
+#endif
+#ifdef GAWKDEBUG
+	fputs(_("\t-Z locale-name\t\t--locale=locale-name\n"), fp);
+#endif
+
+	/* This is one string to make things easier on translators. */
+	/* TRANSLATORS: --help output 5 (end)
+	   TRANSLATORS: the placeholder indicates the bug-reporting address
+	   for this application.  Please add _another line_ with the
+	   address for translation bugs.
+	   no-wrap */
+	fputs(_("\nTo report bugs, see node `Bugs' in `gawk.info'\n\
+which is section `Reporting Problems and Bugs' in the\n\
+printed version.  This same information may be found at\n\
+https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n\
+PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n\
+or by using a web forum such as Stack Overflow.\n\n"), fp);
+
+	/* ditto */
+	fputs(_("gawk is a pattern scanning and processing language.\n\
+By default it reads standard input and writes standard output.\n\n"), fp);
+
+	/* ditto */
+	fputs(_("Examples:\n\tgawk '{ sum += $1 }; END { print sum }' file\n\
+\tgawk -F: '{ print $1 }' /etc/passwd\n"), fp);
+
+	fflush(fp);
+
+	if (ferror(fp)) {
+#ifdef __MINGW32__
+		if (errno == 0 || errno == EINVAL)
+			w32_maybe_set_errno();
+#endif
+		/* don't warn about stdout/stderr if EPIPE, but do error exit */
+		if (errno == EPIPE)
+			die_via_sigpipe();
+
+		if (fp == stdout)
+			warning(_("error writing standard output (%s)"), strerror(errno));
+		else if (fp == stderr)
+			warning(_("error writing standard error (%s)"), strerror(errno));
+
+		// some other problem than SIGPIPE
+		exit(EXIT_FAILURE);
+	}
+
+	exit(exitval);
+}
+
+/* copyleft --- print out the short GNU copyright information */
+
+static void
+copyleft()
+{
+	static const char blurb_part1[] =
+	  N_("Copyright (C) 1989, 1991-%d Free Software Foundation.\n\
+\n\
+This program is free software; you can redistribute it and/or modify\n\
+it under the terms of the GNU General Public License as published by\n\
+the Free Software Foundation; either version 3 of the License, or\n\
+(at your option) any later version.\n\
+\n");
+	static const char blurb_part2[] =
+	  N_("This program is distributed in the hope that it will be useful,\n\
+but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
+GNU General Public License for more details.\n\
+\n");
+	static const char blurb_part3[] =
+	  N_("You should have received a copy of the GNU General Public License\n\
+along with this program. If not, see http://www.gnu.org/licenses/.\n");
+
+	/* multiple blurbs are needed for some brain dead compilers. */
+	printf(_(blurb_part1), UPDATE_YEAR);	/* Last update year */
+	fputs(_(blurb_part2), stdout);
+	fputs(_(blurb_part3), stdout);
+	fflush(stdout);
+
+	if (ferror(stdout)) {
+#ifdef __MINGW32__
+		if (errno == 0 || errno == EINVAL)
+			w32_maybe_set_errno();
+#endif
+		/* don't warn about stdout if EPIPE, but do error exit */
+		if (errno != EPIPE)
+			warning(_("error writing standard output (%s)"), strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+
+	exit(EXIT_SUCCESS);
+}
+
+/* cmdline_fs --- set FS from the command line */
+
+static void
+cmdline_fs(char *str)
+{
+	NODE **tmp;
+
+	tmp = &FS_node->var_value;
+	unref(*tmp);
+	/*
+	 * Only if in full compatibility mode check for the stupid special
+	 * case so -F\t works as documented in awk book even though the shell
+	 * hands us -Ft.  Bleah!
+	 *
+	 * Thankfully, POSIX didn't propagate this "feature".
+	 */
+	if (str[0] == 't' && str[1] == '\0') {
+		if (do_lint)
+			lintwarn(_("-Ft does not set FS to tab in POSIX awk"));
+		if (do_traditional && ! do_posix)
+			str[0] = '\t';
+	}
+
+	*tmp = make_str_node(str, strlen(str), SCAN); /* do process escapes */
+	set_FS();
+}
+
+/* init_args --- set up ARGV from stuff on the command line */
+
+static void
+init_args(int argc0, int argc, const char *argv0, char **argv)
+{
+	int i, j;
+	NODE *sub, *val;
+	NODE *shadow_node = NULL;
+
+	ARGV_node = install_symbol(estrdup("ARGV", 4), Node_var_array);
+	sub = make_number(0.0);
+	val = make_string(argv0, strlen(argv0));
+	val->flags |= USER_INPUT;
+	assoc_set(ARGV_node, sub, val);
+
+	if (do_sandbox) {
+		shadow_node = make_array();
+		sub = make_string(argv0, strlen(argv0));
+		val = make_number(0.0);
+		assoc_set(shadow_node, sub, val);
+	}
+
+
+	for (i = argc0, j = 1; i < argc; i++, j++) {
+		sub = make_number((AWKNUM) j);
+		val = make_string(argv[i], strlen(argv[i]));
+		val->flags |= USER_INPUT;
+		assoc_set(ARGV_node, sub, val);
+
+		if (do_sandbox) {
+			sub = make_string(argv[i], strlen(argv[i]));
+			val = make_number(0.0);
+			assoc_set(shadow_node, sub, val);
+		}
+	}
+
+	ARGC_node = install_symbol(estrdup("ARGC", 4), Node_var);
+	ARGC_node->var_value = make_number((AWKNUM) j);
+
+	if (do_sandbox)
+		init_argv_array(ARGV_node, shadow_node);
+}
+
+
+/*
+ * Set all the special variables to their initial values.
+ * Note that some of the variables that have set_FOO routines should
+ * *N*O*T* have those routines called upon initialization, and thus
+ * they have NULL entries in that field. This is notably true of FS
+ * and IGNORECASE.
+ */
+
+struct varinit {
+	NODE **spec;
+	const char *name;
+	const char *strval;
+	AWKNUM numval;
+	Func_ptr update;
+	Func_ptr assign;
+	bool do_assign;
+	int flags;
+#define NO_INSTALL	0x01
+#define NON_STANDARD	0x02
+#define NOT_OFF_LIMITS	0x04	/* may be accessed by extension function */
+};
+
+static const struct varinit varinit[] = {
+{NULL,		"ARGC",		NULL,	0,  NULL, NULL,	false, NO_INSTALL },
+{&ARGIND_node,	"ARGIND",	NULL,	0,  NULL, NULL,	false, NON_STANDARD },
+{NULL,		"ARGV",		NULL,	0,  NULL, NULL,	false, NO_INSTALL },
+{&BINMODE_node,	"BINMODE",	NULL,	0,  NULL, set_BINMODE,	false, NON_STANDARD },
+{&CONVFMT_node,	"CONVFMT",	"%.6g",	0,  NULL, set_CONVFMT,true, 	0 },
+{NULL,		"ENVIRON",	NULL,	0,  NULL, NULL,	false, NO_INSTALL },
+{&ERRNO_node,	"ERRNO",	"",	0,  NULL, NULL,	false, NON_STANDARD },
+{&FIELDWIDTHS_node, "FIELDWIDTHS", "",	0,  NULL, set_FIELDWIDTHS,	false, NON_STANDARD },
+{&FILENAME_node, "FILENAME",	"",	0,  NULL, NULL,	false, 0 },
+{&FNR_node,	"FNR",		NULL,	0,  update_FNR, set_FNR,	true, 0 },
+{&FS_node,	"FS",		" ",	0,  NULL, set_FS,	false, 0 },
+{&FPAT_node,	"FPAT",		"[^[:space:]]+", 0,  NULL, set_FPAT,	false, NON_STANDARD },
+{&IGNORECASE_node, "IGNORECASE", NULL,	0,  NULL, set_IGNORECASE,	false, NON_STANDARD },
+{&LINT_node,	"LINT",		NULL,	0,  NULL, set_LINT,	false, NON_STANDARD },
+{&PREC_node,	"PREC",		NULL,	DEFAULT_PREC,	NULL,	set_PREC,	false,	NON_STANDARD},
+{&NF_node,	"NF",		NULL,	-1, update_NF, set_NF,	false, 0 },
+{&NR_node,	"NR",		NULL,	0,  update_NR, set_NR,	true, 0 },
+{&OFMT_node,	"OFMT",		"%.6g",	0,  NULL, set_OFMT,	true, 0 },
+{&OFS_node,	"OFS",		" ",	0,  NULL, set_OFS,	true, 0 },
+{&ORS_node,	"ORS",		"\n",	0,  NULL, set_ORS,	true, 0 },
+{NULL,		"PROCINFO",	NULL,	0,  NULL, NULL,	false, NO_INSTALL | NON_STANDARD | NOT_OFF_LIMITS },
+{&RLENGTH_node, "RLENGTH",	NULL,	0,  NULL, NULL,	false, 0 },
+{&ROUNDMODE_node, "ROUNDMODE",	DEFAULT_ROUNDMODE,	0,  NULL, set_ROUNDMODE,	false, NON_STANDARD },
+{&RS_node,	"RS",		"\n",	0,  NULL, set_RS,	true, 0 },
+{&RSTART_node,	"RSTART",	NULL,	0,  NULL, NULL,	false, 0 },
+{&RT_node,	"RT",		"",	0,  NULL, NULL,	false, NON_STANDARD },
+{&SUBSEP_node,	"SUBSEP",	"\034",	0,  NULL, set_SUBSEP,	true, 0 },
+{&TEXTDOMAIN_node,	"TEXTDOMAIN",	"messages",	0,  NULL, set_TEXTDOMAIN,	true, NON_STANDARD },
+{0,		NULL,		NULL,	0,  NULL, NULL,	false, 0 },
+};
+
+/* init_vars --- actually initialize everything in the symbol table */
+
+static void
+init_vars()
+{
+	const struct varinit *vp;
+	NODE *n;
+
+	for (vp = varinit; vp->name != NULL; vp++) {
+		if ((vp->flags & NO_INSTALL) != 0)
+			continue;
+		n = *(vp->spec) = install_symbol(estrdup(vp->name, strlen(vp->name)), Node_var);
+		if (vp->strval != NULL)
+			n->var_value = make_string(vp->strval, strlen(vp->strval));
+		else
+			n->var_value = make_number(vp->numval);
+		n->var_assign = (Func_ptr) vp->assign;
+		n->var_update = (Func_ptr) vp->update;
+		if (vp->do_assign)
+			(*(vp->assign))();
+	}
+
+	/* Load PROCINFO and ENVIRON */
+	if (! do_traditional)
+		load_procinfo();
+	load_environ();
+}
+
+/* path_environ --- put path variable into environment if not already there */
+
+static void
+path_environ(const char *pname, const char *dflt)
+{
+	const char *val;
+	NODE **aptr;
+	NODE *tmp;
+
+	tmp = make_string(pname, strlen(pname));
+	/*
+	 * On VMS, environ[] only holds a subset of what getenv() can
+	 * find, so look AWKPATH up before resorting to default path.
+	 */
+	val = getenv(pname);
+	if (val == NULL || *val == '\0')
+		val = dflt;
+	aptr = assoc_lookup(ENVIRON_node, tmp);
+	/*
+	 * If original value was the empty string, set it to
+	 * the default value.
+	 */
+	if ((*aptr)->stlen == 0) {
+		unref(*aptr);
+		*aptr = make_string(val, strlen(val));
+	}
+
+	unref(tmp);
+}
+
+/* load_environ --- populate the ENVIRON array */
+
+static NODE *
+load_environ()
+{
+#if ! (defined(VMS) && defined(__DECC))
+	extern char **environ;
+#endif
+	char *var, *val;
+	int i;
+	NODE *sub, *newval;
+	static bool been_here = false;
+
+	if (been_here)
+		return ENVIRON_node;
+
+	been_here = true;
+
+	ENVIRON_node = install_symbol(estrdup("ENVIRON", 7), Node_var_array);
+	for (i = 0; environ[i] != NULL; i++) {
+		static char nullstr[] = "";
+
+		var = environ[i];
+		val = strchr(var, '=');
+		if (val != NULL)
+			*val++ = '\0';
+		else
+			val = nullstr;
+		sub = make_string(var, strlen(var));
+		newval = make_string(val, strlen(val));
+		newval->flags |= USER_INPUT;
+		assoc_set(ENVIRON_node, sub, newval);
+
+		/* restore '=' so that system() gets a valid environment */
+		if (val != nullstr)
+			*--val = '=';
+	}
+	/*
+	 * Put AWKPATH and AWKLIBPATH into ENVIRON if not already there.
+	 * This allows querying it from within awk programs.
+	 *
+	 * October 2014:
+	 * If their values are "", override with the default values;
+	 * since 2.10 AWKPATH used default value if environment's
+	 * value was "".
+	 */
+	path_environ("AWKPATH", defpath);
+	path_environ("AWKLIBPATH", deflibpath);
+
+	/* set up array functions */
+	init_env_array(ENVIRON_node);
+
+	return ENVIRON_node;
+}
+
+/* load_procinfo_argv --- populate PROCINFO["argv"] */
+
+static void
+load_procinfo_argv()
+{
+	NODE *sub;
+	NODE *val;
+	NODE *argv_array;
+	int i;
+
+	// build the sub-array first
+	getnode(argv_array);
+ 	memset(argv_array, '\0', sizeof(NODE));  /* valgrind wants this */
+	null_array(argv_array);
+	argv_array->parent_array = PROCINFO_node;
+	argv_array->vname = estrdup("argv", 4);
+	for (i = 0; d_argv[i] != NULL; i++) {
+		sub = make_number(i);
+		val = make_string(d_argv[i], strlen(d_argv[i]));
+		assoc_set(argv_array, sub, val);
+	}
+
+	// hook it into PROCINFO
+	sub = make_string("argv", 4);
+	assoc_set(PROCINFO_node, sub, argv_array);
+
+}
+
+/* load_procinfo --- populate the PROCINFO array */
+
+static NODE *
+load_procinfo()
+{
+#if defined (HAVE_GETGROUPS) && defined(NGROUPS_MAX) && NGROUPS_MAX > 0
+	int i;
+#endif
+#if (defined (HAVE_GETGROUPS) && defined(NGROUPS_MAX) && NGROUPS_MAX > 0) || defined(HAVE_MPFR)
+	char name[100];
+#endif
+	AWKNUM value;
+	static bool been_here = false;
+
+	if (been_here)
+		return PROCINFO_node;
+
+	been_here = true;
+
+	PROCINFO_node = install_symbol(estrdup("PROCINFO", 8), Node_var_array);
+
+	update_PROCINFO_str("version", VERSION);
+	update_PROCINFO_str("strftime", def_strftime_format);
+	update_PROCINFO_str("platform", platform_name());
+
+#ifdef HAVE_MPFR
+	sprintf(name, "GNU MPFR %s", mpfr_get_version());
+	update_PROCINFO_str("mpfr_version", name);
+	sprintf(name, "GNU MP %s", gmp_version);
+	update_PROCINFO_str("gmp_version", name);
+	update_PROCINFO_num("prec_max", MPFR_PREC_MAX);
+	update_PROCINFO_num("prec_min", MPFR_PREC_MIN);
+#endif
+
+#ifdef DYNAMIC
+	update_PROCINFO_num("api_major", GAWK_API_MAJOR_VERSION);
+	update_PROCINFO_num("api_minor", GAWK_API_MINOR_VERSION);
+#endif
+
+#ifdef GETPGRP_VOID
+#define getpgrp_arg() /* nothing */
+#else
+#define getpgrp_arg() getpid()
+#endif
+
+	value = getpgrp(getpgrp_arg());
+	update_PROCINFO_num("pgrpid", value);
+
+	/*
+	 * Could put a lot of this into a table, but then there's
+	 * portability problems declaring all the functions. So just
+	 * do it the slow and stupid way. Sigh.
+	 */
+
+	value = getpid();
+	update_PROCINFO_num("pid", value);
+
+	value = getppid();
+	update_PROCINFO_num("ppid", value);
+
+	value = getuid();
+	update_PROCINFO_num("uid", value);
+
+	value = geteuid();
+	update_PROCINFO_num("euid", value);
+
+	value = getgid();
+	update_PROCINFO_num("gid", value);
+
+	value = getegid();
+	update_PROCINFO_num("egid", value);
+
+	update_PROCINFO_str("FS", current_field_sep_str());
+
+#if defined (HAVE_GETGROUPS) && defined(NGROUPS_MAX) && NGROUPS_MAX > 0
+	for (i = 0; i < ngroups; i++) {
+		sprintf(name, "group%d", i + 1);
+		value = groupset[i];
+		update_PROCINFO_num(name, value);
+	}
+	if (groupset) {
+		efree(groupset);
+		groupset = NULL;
+	}
+#endif
+	load_procinfo_argv();
+	return PROCINFO_node;
+}
+
+/* is_std_var --- return true if a variable is a standard variable */
+
+int
+is_std_var(const char *var)
+{
+	const struct varinit *vp;
+
+	for (vp = varinit; vp->name != NULL; vp++) {
+		if (strcmp(vp->name, var) == 0) {
+			if ((do_traditional || do_posix) && (vp->flags & NON_STANDARD) != 0)
+				return false;
+
+			return true;
+		}
+	}
+
+	return false;
+}
+
+/*
+ * is_off_limits_var --- return true if a variable is off limits
+ * 			to extension functions
+ */
+
+int
+is_off_limits_var(const char *var)
+{
+	const struct varinit *vp;
+
+	for (vp = varinit; vp->name != NULL; vp++) {
+		if (strcmp(vp->name, var) == 0)
+			return ((vp->flags & NOT_OFF_LIMITS) == 0);
+	}
+
+	return false;
+}
+
+/* get_spec_varname --- return the name of a special variable
+	with the given assign or update routine.
+*/
+
+const char *
+get_spec_varname(Func_ptr fptr)
+{
+	const struct varinit *vp;
+
+	if (! fptr)
+		return NULL;
+	for (vp = varinit; vp->name != NULL; vp++) {
+		if (vp->assign == fptr || vp->update == fptr)
+			return vp->name;
+	}
+	return NULL;
+}
+
+
+/* arg_assign --- process a command-line assignment */
+
+int
+arg_assign(char *arg, bool initing)
+{
+	char *cp, *cp2;
+	bool badvar;
+	NODE *var;
+	NODE *it;
+	NODE **lhs;
+	long save_FNR;
+
+	if (! initing && disallow_var_assigns)
+		return false;	/* --exec */
+
+	cp = strchr(arg, '=');
+
+	if (cp == NULL) {
+		if (! initing)
+			return false;	/* This is file name, not assignment. */
+
+		fprintf(stderr,
+			_("%s: `%s' argument to `-v' not in `var=value' form\n\n"),
+			myname, arg);
+		usage(EXIT_FAILURE, stderr);
+	}
+
+	*cp++ = '\0';
+
+	/* avoid false source indications in a fatal message */
+	source = NULL;
+	sourceline = 0;
+	save_FNR = FNR;
+	FNR = 0;
+
+	/* first check that the variable name has valid syntax */
+	badvar = false;
+	if (! is_letter((unsigned char) arg[0]))
+		badvar = true;
+	else
+		for (cp2 = arg+1; *cp2; cp2++)
+			if (! is_identchar((unsigned char) *cp2) && *cp2 != ':') {
+				badvar = true;
+				break;
+			}
+
+	if (badvar) {
+		if (initing)
+			fatal(_("`%s' is not a legal variable name"), arg);
+
+		if (do_lint)
+			lintwarn(_("`%s' is not a variable name, looking for file `%s=%s'"),
+				arg, arg, cp);
+
+		goto done;
+	}
+
+	// Assigning a string or typed regex
+
+	if (! validate_qualified_name(arg)) {
+		badvar = true;
+		goto done;
+	}
+
+	if (check_special(arg) >= 0)
+		fatal(_("cannot use gawk builtin `%s' as variable name"), arg);
+
+	if (! initing) {
+		var = lookup(arg);
+		if (var != NULL && var->type == Node_func)
+			fatal(_("cannot use function `%s' as variable name"), arg);
+	}
+
+	cp2 = cp + strlen(cp) - 1;	// end char
+	if (! do_traditional
+	    && cp[0] == '@' && cp[1] == '/' && *cp2 == '/') {
+		// typed regex
+		size_t len = strlen(cp) - 3;
+
+		ezalloc(cp2, char *, len + 1, "arg_assign");
+		memcpy(cp2, cp + 2, len);
+
+		it = make_typed_regex(cp2, len);
+		// fall through to variable setup
+	} else {
+		// string assignment
+
+		// POSIX disallows any newlines inside strings
+		// The scanner handles that for program files.
+		// We have to check here for strings passed to -v.
+		if (do_posix && strchr(cp, '\n') != NULL)
+			fatal(_("POSIX does not allow physical newlines in string values"));
+
+		/*
+		 * BWK awk expands escapes inside assignments.
+		 * This makes sense, so we do it too.
+		 * In addition, remove \-<newline> as in scanning.
+		 */
+		it = make_str_node(cp, strlen(cp), SCAN | ELIDE_BACK_NL);
+		it->flags |= USER_INPUT;
+#ifdef LC_NUMERIC
+		/*
+		 * See comment above about locale decimal point.
+		 */
+		if (do_posix)
+			setlocale(LC_NUMERIC, "C");
+#endif /* LC_NUMERIC */
+		(void) force_number(it);
+#ifdef LC_NUMERIC
+		if (do_posix)
+			setlocale(LC_NUMERIC, locale);
+#endif /* LC_NUMERIC */
+	}
+
+	/*
+	 * since we are restoring the original text of ARGV later,
+	 * need to copy the variable name part if we don't want
+	 * name like v=abc instead of just v in var->vname
+	 */
+
+	cp2 = estrdup(arg, cp - arg);	/* var name */
+
+	var = variable(0, cp2, Node_var);
+	if (var == NULL)	/* error */
+		final_exit(EXIT_FATAL);
+
+	if (var->type == Node_var && var->var_update)
+		var->var_update();
+	lhs = get_lhs(var, false);
+	unref(*lhs);
+	*lhs = it;
+	/* check for set_FOO() routine */
+	if (var->type == Node_var && var->var_assign)
+		var->var_assign();
+
+done:
+	if (! initing)
+		*--cp = '=';	/* restore original text of ARGV */
+	FNR = save_FNR;
+	return ! badvar;
+}
+
+/* catchsig --- catch signals */
+
+static void
+catchsig(int sig)
+{
+	if (sig == SIGFPE) {
+		fatal(_("floating point exception"));
+	} else if (sig == SIGSEGV
+#ifdef SIGBUS
+	        || sig == SIGBUS
+#endif
+	) {
+		if (errcount > 0)	// assume a syntax error corrupted our data structures
+			exit(EXIT_FATAL);
+
+		set_loc(__FILE__, __LINE__);
+		msg(_("fatal error: internal error"));
+		/* fatal won't abort() if not compiled for debugging */
+		// GLIBC 2.27 doesn't necessarily flush on abort. Sigh.
+		fflush(NULL);
+		abort();
+	} else
+		cant_happen();
+	/* NOTREACHED */
+}
+
+#ifdef HAVE_LIBSIGSEGV
+/* catchsegv --- for use with libsigsegv */
+
+static int
+catchsegv(void *fault_address, int serious)
+{
+	if (errcount > 0)	// assume a syntax error corrupted our data structures
+		exit(EXIT_FATAL);
+
+	set_loc(__FILE__, __LINE__);
+	msg(_("fatal error: internal error: segfault"));
+	fflush(NULL);
+	abort();
+	/*NOTREACHED*/
+	return 0;
+}
+
+/* catchstackoverflow --- for use with libsigsegv */
+
+static void
+catchstackoverflow(int emergency, stackoverflow_context_t scp)
+{
+	set_loc(__FILE__, __LINE__);
+	msg(_("fatal error: internal error: stack overflow"));
+	fflush(NULL);
+	abort();
+	/*NOTREACHED*/
+	return;
+}
+#endif /* HAVE_LIBSIGSEGV */
+
+/* nostalgia --- print the famous error message and die */
+
+static void
+nostalgia()
+{
+	/*
+	 * N.B.: This string is not gettextized, on purpose.
+	 * So there.
+	 */
+	fprintf(stderr, "awk: bailing out near line 1\n");
+	fflush(stderr);
+	abort();
+}
+
+/* version --- print version message */
+
+static void
+version()
+{
+	printf("%s", version_string);
+#ifdef DYNAMIC
+	printf(", API: %d.%d", GAWK_API_MAJOR_VERSION, GAWK_API_MINOR_VERSION);
+#endif
+#ifdef HAVE_MPFR
+	printf(" (GNU MPFR %s, GNU MP %s)", mpfr_get_version(), gmp_version);
+#endif
+	printf("\n");
+	print_ext_versions();
+
+	/*
+	 * Per GNU coding standards, print copyright info,
+	 * then exit successfully, do nothing else.
+	 */
+	copyleft();
+	exit(EXIT_SUCCESS);
+}
+
+/* init_fds --- check for 0, 1, 2, open on /dev/null if possible */
+
+static void
+init_fds()
+{
+	struct stat sbuf;
+	int fd;
+	int newfd;
+	char const *const opposite_mode[] = {"w", "r", "r"};
+
+	/* maybe no stderr, don't bother with error mesg */
+	for (fd = 0; fd <= 2; fd++) {
+		if (fstat(fd, &sbuf) < 0) {
+#if MAKE_A_HEROIC_EFFORT
+			if (do_lint)
+				lintwarn(_("no pre-opened fd %d"), fd);
+#endif
+			newfd = devopen("/dev/null", opposite_mode[fd]);
+			/* turn off some compiler warnings "set but not used" */
+			newfd += 0;
+#ifdef MAKE_A_HEROIC_EFFORT
+			if (do_lint && newfd < 0)
+				lintwarn(_("could not pre-open /dev/null for fd %d"), fd);
+#endif
+		}
+	}
+}
+
+/* init_groupset --- initialize groupset */
+
+static void
+init_groupset()
+{
+#if defined(HAVE_GETGROUPS) && defined(NGROUPS_MAX) && NGROUPS_MAX > 0
+#ifdef GETGROUPS_NOT_STANDARD
+	/* For systems that aren't standards conformant, use old way. */
+	ngroups = NGROUPS_MAX;
+#else
+	/*
+	 * If called with 0 for both args, return value is
+	 * total number of groups.
+	 */
+	ngroups = getgroups(0, NULL);
+#endif
+	/* If an error or no groups, just give up and get on with life. */
+	if (ngroups <= 0)
+		return;
+
+	/* fill in groups */
+	emalloc(groupset, GETGROUPS_T *, ngroups * sizeof(GETGROUPS_T), "init_groupset");
+
+	ngroups = getgroups(ngroups, groupset);
+	/* same thing here, give up but keep going */
+	if (ngroups == -1) {
+		efree(groupset);
+		ngroups = 0;
+		groupset = NULL;
+	}
+#endif
+}
+
+/* estrdup --- duplicate a string */
+
+char *
+estrdup(const char *str, size_t len)
+{
+	char *s;
+	emalloc(s, char *, len + 1, "estrdup");
+	memcpy(s, str, len);
+	s[len] = '\0';
+	return s;
+}
+
+#if defined(HAVE_LOCALE_H)
+
+/* init_locale --- initialize locale info. */
+
+/*
+ * On some operating systems, the pointers in the struct returned
+ * by localeconv() can become dangling pointers after a call to
+ * setlocale().  So we do a deep copy.
+ *
+ * Thanks to KIMURA Koichi <kimura.koichi@canon.co.jp>.
+ */
+
+static void
+init_locale(struct lconv *l)
+{
+	struct lconv *t;
+
+	t = localeconv();
+	*l = *t;
+	l->thousands_sep = estrdup(t->thousands_sep, strlen(t->thousands_sep));
+	l->decimal_point = estrdup(t->decimal_point, strlen(t->decimal_point));
+	l->grouping = estrdup(t->grouping, strlen(t->grouping));
+	l->int_curr_symbol = estrdup(t->int_curr_symbol, strlen(t->int_curr_symbol));
+	l->currency_symbol = estrdup(t->currency_symbol, strlen(t->currency_symbol));
+	l->mon_decimal_point = estrdup(t->mon_decimal_point, strlen(t->mon_decimal_point));
+	l->mon_thousands_sep = estrdup(t->mon_thousands_sep, strlen(t->mon_thousands_sep));
+	l->mon_grouping = estrdup(t->mon_grouping, strlen(t->mon_grouping));
+	l->positive_sign = estrdup(t->positive_sign, strlen(t->positive_sign));
+	l->negative_sign = estrdup(t->negative_sign, strlen(t->negative_sign));
+}
+#endif /* LOCALE_H */
+
+/* save_argv --- save argv array */
+
+static void
+save_argv(int argc, char **argv)
+{
+	int i;
+
+	emalloc(d_argv, char **, (argc + 1) * sizeof(char *), "save_argv");
+	for (i = 0; i < argc; i++)
+		d_argv[i] = estrdup(argv[i], strlen(argv[i]));
+	d_argv[argc] = NULL;
+}
+
+/*
+ * update_global_values --- make sure the symbol table has correct values.
+ * Called from the grammar before dumping values.
+ *
+ * Also called when accessing through SYMTAB, and from api_sym_lookup().
+ */
+
+void
+update_global_values()
+{
+	const struct varinit *vp;
+
+	for (vp = varinit; vp->name; vp++) {
+		if (vp->update != NULL)
+			vp->update();
+	}
+}
+
+/* getenv_long --- read a long value (>= 0) from an environment var. */
+
+long
+getenv_long(const char *name)
+{
+	const char *val;
+	long newval;
+	if ((val = getenv(name)) != NULL && isdigit((unsigned char) *val)) {
+		for (newval = 0; *val && isdigit((unsigned char) *val); val++)
+			newval = (newval * 10) + *val - '0';
+		return newval;
+	}
+	return -1;
+}
+
+/* parse_args --- do the getopt_long thing */
+
+static void
+parse_args(int argc, char **argv)
+{
+	/*
+	 * The + on the front tells GNU getopt not to rearrange argv.
+	 */
+	const char *optlist = "+F:f:v:W;bcCd::D::e:E:ghi:l:L::nNo::Op::MPrSstVYZ:";
+	int old_optind;
+	int c;
+	char *scan;
+	char *src;
+
+	/* we do error messages ourselves on invalid options */
+	opterr = false;
+
+	/* copy argv before getopt gets to it; used to restart the debugger */
+	save_argv(argc, argv);
+
+	/* option processing. ready, set, go! */
+	for (optopt = 0, old_optind = 1;
+	     (c = getopt_long(argc, argv, optlist, optab, NULL)) != EOF;
+	     optopt = 0, old_optind = optind) {
+		if (do_posix)
+			opterr = true;
+
+		switch (c) {
+		case 'F':
+			add_preassign(PRE_ASSIGN_FS, optarg);
+			break;
+
+		case 'E':
+			disallow_var_assigns = true;
+			/* fall through */
+		case 'f':
+			/*
+			 * Allow multiple -f options.
+			 * This makes function libraries real easy.
+			 * Most of the magic is in the scanner.
+			 *
+			 * The following is to allow for whitespace at the end
+			 * of a #! /bin/gawk line in an executable file
+			 */
+			scan = optarg;
+			if (argv[optind-1] != optarg)
+				while (isspace((unsigned char) *scan))
+					scan++;
+			src = (*scan == '\0' ? argv[optind++] : optarg);
+			(void) add_srcfile((src && src[0] == '-' && src[1] == '\0') ?
+					SRC_STDIN : SRC_FILE,
+					src, srcfiles, NULL, NULL);
+
+			break;
+
+		case 'v':
+			add_preassign(PRE_ASSIGN, optarg);
+			break;
+
+		case 'b':
+			do_binary = true;
+			break;
+
+		case 'c':
+			do_flags |= DO_TRADITIONAL;
+			break;
+
+		case 'C':
+			copyleft();
+			break;
+
+		case 'd':
+			do_flags |= DO_DUMP_VARS;
+			if (optarg != NULL && optarg[0] != '\0')
+				varfile = optarg;
+			break;
+
+		case 'D':
+			do_flags |= DO_DEBUG;
+			if (optarg != NULL && optarg[0] != '\0')
+				command_file = optarg;
+			break;
+
+		case 'e':
+			if (optarg[0] == '\0')
+				warning(_("empty argument to `-e/--source' ignored"));
+			else
+				(void) add_srcfile(SRC_CMDLINE, optarg, srcfiles, NULL, NULL);
+			break;
+
+		case 'g':
+			do_flags |= DO_INTL;
+			break;
+
+		case 'h':
+			/* write usage to stdout, per GNU coding stds */
+			usage(EXIT_SUCCESS, stdout);
+			break;
+
+		case 'i':
+			(void) add_srcfile(SRC_INC, optarg, srcfiles, NULL, NULL);
+			break;
+
+		case 'l':
+			(void) add_srcfile(SRC_EXTLIB, optarg, srcfiles, NULL, NULL);
+			break;
+
+#ifndef NO_LINT
+		case 'L':
+			do_flags |= (DO_LINT_ALL|DO_LINT_EXTENSIONS);
+			if (optarg != NULL) {
+				if (strcmp(optarg, "fatal") == 0)
+					lintfunc = r_fatal;
+				else if (strcmp(optarg, "invalid") == 0) {
+					do_flags &= ~DO_LINT_ALL;
+					do_flags |= DO_LINT_INVALID;
+				}
+				else if (strcmp(optarg, "no-ext") == 0) {
+					do_flags &= ~DO_LINT_EXTENSIONS;
+				}
+			}
+			break;
+
+		case 't':
+			do_flags |= DO_LINT_OLD;
+			break;
+#else
+		case 'L':
+		case 't':
+			break;
+#endif
+
+		case 'n':
+			do_flags |= DO_NON_DEC_DATA;
+			break;
+
+		case 'N':
+			use_lc_numeric = true;
+			break;
+
+		case 'O':
+			do_optimize = true;
+			break;
+
+		case 'p':
+			if (do_pretty_print)
+				warning(_("`--profile' overrides `--pretty-print'"));
+			do_flags |= DO_PROFILE;
+			/* fall through */
+		case 'o':
+			if (c == 'o' && do_profile)
+				warning(_("`--profile' overrides `--pretty-print'"));
+			do_flags |= DO_PRETTY_PRINT;
+			if (optarg != NULL)
+				set_prof_file(optarg);
+			else
+				set_prof_file(DEFAULT_PROFILE);
+			break;
+
+		case 'M':
+#ifdef HAVE_MPFR
+			do_flags |= DO_MPFR;
+#else
+			warning(_("-M ignored: MPFR/GMP support not compiled in"));
+#endif
+			break;
+
+		case 'P':
+			do_flags |= DO_POSIX;
+			break;
+
+		case 'r':
+			do_flags |= DO_INTERVALS;
+ 			break;
+
+		case 's':
+			do_optimize = false;
+			break;
+
+		case 'S':
+			do_flags |= DO_SANDBOX;
+  			break;
+
+		case 'V':
+			do_version = true;
+			break;
+
+		case 'W':       /* gawk specific options - now in getopt_long */
+			fprintf(stderr, _("%s: option `-W %s' unrecognized, ignored\n"),
+				argv[0], optarg);
+			break;
+
+		case 0:
+			/*
+			 * getopt_long found an option that sets a variable
+			 * instead of returning a letter. Do nothing, just
+			 * cycle around for the next one.
+			 */
+			break;
+
+		case 'Y':
+		case 'Z':
+#if defined(YYDEBUG) || defined(GAWKDEBUG)
+			if (c == 'Y') {
+				yydebug = 2;
+				break;
+			}
+#endif
+#if defined(LOCALEDEBUG)
+			if (c == 'Z') {
+				locale = optarg;
+				break;
+			}
+#endif
+			/* if not debugging, fall through */
+		case '?':
+		default:
+			/*
+			 * If not posix, an unrecognized option stops argument
+			 * processing so that it can go into ARGV for the awk
+			 * program to see. This makes use of ``#! /bin/gawk -f''
+			 * easier.
+			 *
+			 * However, it's never simple. If optopt is set,
+			 * an option that requires an argument didn't get the
+			 * argument. We care because if opterr is 0, then
+			 * getopt_long won't print the error message for us.
+			 */
+			if (! do_posix
+			    && (optopt == '\0' || strchr(optlist, optopt) == NULL)) {
+				/*
+				 * can't just do optind--. In case of an
+				 * option with >= 2 letters, getopt_long
+				 * won't have incremented optind.
+				 */
+				optind = old_optind;
+				stopped_early = true;
+				goto out;
+			} else if (optopt != '\0') {
+				/* Use POSIX required message format */
+				fprintf(stderr,
+					_("%s: option requires an argument -- %c\n"),
+					myname, optopt);
+				usage(EXIT_FAILURE, stderr);
+			}
+			/* else
+				let getopt print error message for us */
+			break;
+		}
+		if (c == 'E')	/* --exec ends option processing */
+			break;
+	}
+out:
+	do_optimize = (do_optimize && ! do_pretty_print);
+
+	return;
+}
+
+/* set_locale_stuff --- setup the locale stuff */
+
+static void
+set_locale_stuff(void)
+{
+#if defined(LC_CTYPE)
+	setlocale(LC_CTYPE, locale);
+#endif
+#if defined(LC_COLLATE)
+	setlocale(LC_COLLATE, locale);
+#endif
+#if defined(LC_MESSAGES)
+	setlocale(LC_MESSAGES, locale);
+#endif
+#if defined(LC_NUMERIC) && defined(HAVE_LOCALE_H)
+	/*
+	 * Force the issue here.  According to POSIX 2001, decimal
+	 * point is used for parsing source code and for command-line
+	 * assignments and the locale value for processing input,
+	 * number to string conversion, and printing output.
+	 *
+	 * 10/2005 --- see below also; we now only use the locale's
+	 * decimal point if do_posix in effect.
+	 *
+	 * 9/2007:
+	 * This is a mess. We need to get the locale's numeric info for
+	 * the thousands separator for the %'d flag.
+	 */
+	setlocale(LC_NUMERIC, locale);
+	init_locale(& loc);
+	setlocale(LC_NUMERIC, "C");
+#endif
+#if defined(LC_TIME)
+	setlocale(LC_TIME, locale);
+#endif
+
+	/* These must be done after calling setlocale */
+	(void) bindtextdomain(PACKAGE, locale_dir);
+	(void) textdomain(PACKAGE);
+}
+
+/* platform_name --- return the platform name */
+
+static const char *
+platform_name()
+{
+	// Cygwin and Mac OS X count as POSIX
+#if defined(__VMS)
+	return "vms";
+#elif defined(__MINGW32__)
+	return "mingw";
+#elif defined(__DJGPP__)
+	return "djgpp";
+#elif defined(__EMX__)
+	return "os2";
+#elif defined(USE_EBCDIC)
+	return "os390";
+#else
+	return "posix";
+#endif
+}
+
+/* set_current_namespace --- set current_namespace and handle memory management */
+
+void
+set_current_namespace(const char *new_namespace)
+{
+	if (current_namespace != awk_namespace)
+		efree((void *) current_namespace);
+
+	current_namespace = new_namespace;
+}
diff --git a/gawk-5.0.1/mbsupport.h b/gawk-5.0.1/mbsupport.h
new file mode 100644
index 00000000000..51cec3c7345
--- /dev/null
+++ b/gawk-5.0.1/mbsupport.h
@@ -0,0 +1,58 @@
+/*
+ * mbsupport.h --- Localize determination of whether we have multibyte stuff.
+ */
+
+/*
+ * Copyright (C) 2004, 2005, 2011, 2012, 2015, 2016
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+
+#ifdef __DJGPP__
+# undef MB_CUR_MAX
+# define MB_CUR_MAX 1
+
+/* All this glop is for DGJPP */
+
+#define towupper	toupper
+#define towlower	tolower
+#define iswalnum	isalnum
+#define iswalpha	isalpha
+#define iswupper	isupper
+#define iswlower	islower
+
+#define mbrtowc(wcp, s, e, mbs)	(-1)
+#define mbrlen(s, e, mbs)	strlen(s)
+#define wcrtomb(wc, b, mbs)	(-1)
+#define wcslen		strlen
+#define wctob(wc)	(EOF)
+
+#if (__DJGPP__ > 2 || __DJGPP_MINOR__ >= 3)
+# include <ctype.h>
+# include <wchar.h>
+# include <wctype.h>
+#else
+# define mbstate_t	int
+#endif
+
+extern wctype_t wctype(const char *name);
+extern int iswctype(wint_t wc, wctype_t desc);
+extern int wcscoll(const wchar_t *ws1, const wchar_t *ws2);
+#endif
diff --git a/gawk-5.0.1/missing b/gawk-5.0.1/missing
new file mode 100755
index 00000000000..f62bbae306c
--- /dev/null
+++ b/gawk-5.0.1/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2013-10-28.13; # UTC
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try '$0 --help' for more information"
+  exit 1
+fi
+
+case $1 in
+
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
+
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
+
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gawk-5.0.1/missing_d/COPYING.LIB b/gawk-5.0.1/missing_d/COPYING.LIB
new file mode 100644
index 00000000000..778d0bb5b2a
--- /dev/null
+++ b/gawk-5.0.1/missing_d/COPYING.LIB
@@ -0,0 +1,482 @@
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+     Appendix: How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+    MA 02110-1301, USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/gawk-5.0.1/missing_d/ChangeLog b/gawk-5.0.1/missing_d/ChangeLog
new file mode 100644
index 00000000000..6df93c56d1e
--- /dev/null
+++ b/gawk-5.0.1/missing_d/ChangeLog
@@ -0,0 +1,9 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/missing_d/ChangeLog.0 b/gawk-5.0.1/missing_d/ChangeLog.0
new file mode 100644
index 00000000000..4eaa802f01e
--- /dev/null
+++ b/gawk-5.0.1/missing_d/ChangeLog.0
@@ -0,0 +1,171 @@
+Mon Nov 29 20:09:40 2010  Eli Zaretskii  <eliz@gnu.org>
+
+	* strftime.c <tzname>: Don't declare for __MINGW32__.
+
+Thu Nov 25 21:16:58 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* strcoll.c: New file.
+	* memcmp.c, memcpy.c, memset.c, strchr.c, strtod.c: Remove
+	`register' keyword everywhere, as in mainline code.
+
+Sun Jun  6 21:44:19 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getaddrinfo.h: Add undef for addrinfo, freeaddrinfo, and
+	getaddrinfo, just in case.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Fri Apr 30 11:38:49 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* snprintf.c: Add check to undef restrict and define as empty.
+	Allows !@#$%^&*() OSF/1 to compile and build.
+
+Mon Apr 26 19:48:07 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* snprintf.c (vsnprintf): Undo change of 21 April. vsnprintf
+	is needed for vprintf in that file.
+
+Wed Apr 21 23:32:51 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* snprintf.c (vsnprintf): Don't define if not STDARG_H.
+	Gawk doesn't use it.
+
+Fri Mar 19 09:19:17 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* usleep.c: New file.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Sun Oct 14 19:37:33 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* snprintf.c (safe_tmpfile): If have `atexit', add call to a function
+	that closes the open fp and unlinks the file.  Needed mainly for
+	PC which can't do Unix-style unlink-after-open.
+
+Tue Oct  2 22:12:13 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* snprintf.c (safe_tmpfile): Add use of TMPDIR and TEMP environment
+	variables for systems that may not have a /tmp.  For MS systems
+	do unlink at close. Thanks to Eli Zaretskii and Scott Deifik
+	for motivating me to do the right thing.
+
+Fri Apr 13 06:05:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getaddrinfo.c: Add test for HAVE_SOCKETS with error message
+	if not. Thanks to Pat Rankin.
+
+Sun Apr  8 16:15:27 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getaddrinfo.c: Add include of <netinet/in.h>, and <arpa/inet.h>.
+
+Fri Apr  6 13:23:04 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* memmove.c.BSD, strncasecmp.c.BSD: Removed so that they won't make
+	their way into a tarball; these were the original versions from BSD
+	that were in use until the Savannah CVS archive went into place; see
+	the entry from August 25, 2006.
+
+Thu Apr  5 17:01:15 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* sprintf.c (snprintf): Fix typo and call vsnprintf
+	instead of calling self recursively. Thanks to Pat Rankin.
+
+Tue Feb 27 20:58:01 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* snprintf.c: Change names from gawk_xxx to real xxx.
+
+Mon Jan 15 14:34:30 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* getaddrinfo.h, getaddrinfo.c: New files, based on
+	submission by Jan Pazdziora <jpazdziora@redhat.com>.
+
+Fri Sep 15 15:05:09 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* strncasecmp.c, memmove.c: Corrected the FSF's address.
+
+Fri Aug 25 13:21:57 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* README: New file.
+	* strncasecmp.c, memmove.c: Replaced with versions
+	from GLIBC, hacked unmercifully to work standalone.
+
+Fri Oct 21 11:18:10 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* strtod.c (gawk_strtod): Made check for locale's decimal
+	point conditional also upon do_posix.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Tue Jul 26 21:27:46 2005   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* strtod.c (gawk_strtod) [ENABLE_NLS]: Removed from conditional
+	paralleling change to main.c.
+	* stroul.c (strtoul): Same.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+Mon May  3 09:24:21 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* strtoul.c: New file.
+
+Sun May  2 18:03:54 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* strtod.c (gawk_strtod): Check for locale's decimal point
+	instead of hard-wiring period.
+
+Tue Jan 20 10:38:48 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* memmove.c: New file.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Mon Feb 3 20:37:09 2003  Pat Rankin  <rankin@pactechdata.com>
+
+	* strftime.c: Restore use of TIME_T_IN_SYS_TYPES_H to control
+	inclusion of <sys/types.h>.
+	(TYPE_SIGNED): Add workaround to avoid diagnostic from Compaq C V6.4.
+	(my_strftime) [case 's']: Likewise; exclude negative number handling
+	if TIME_T_UNSIGNED is defined.
+
+Mon Jan 27 12:09:50 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* strtod.c (gawk_strtod): Cleanup, changing the logic
+	  so that ptr is correct.  Fixes the bug that 0e0 is not
+	  recognized as numeric.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+Tue Dec  4 17:56:46 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* strftime.c: Replaced with glibc version.
+	* strftime.3: Removed
+
+Fri Aug  3 09:01:19 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	ChangeLog created.
+
+	* strtod.c (strtod): Fixed test at end for failure to
+	  be a little smarter.
diff --git a/gawk-5.0.1/missing_d/ChangeLog.1 b/gawk-5.0.1/missing_d/ChangeLog.1
new file mode 100644
index 00000000000..83cae85515d
--- /dev/null
+++ b/gawk-5.0.1/missing_d/ChangeLog.1
@@ -0,0 +1,134 @@
+2019-01-09         John E. Malmberg     <wb8tyw@qsl.net>
+
+	* timegm.c (timegm): Remove static attribute from function.
+
+2018-12-12         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* timegm.c (timegm): Add comment indicating that this came from
+	the Linux man page.
+
+2018-12-12         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* timegm.c: New file implementing timegm.
+
+2018-10-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* intprops.h, verify.h: Removed. The copy in ../support is
+	good enough. Thanks to Bruno Haible for the tip.
+
+2018-09-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* intprops.h, mktime.c, verify.h: Updated from GNULIB.
+	* mktime-internal.h: New file, imported from GNULIB.
+
+2018-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* intprops.h, mktime.c: Updated from GNULIB.
+
+2018-08-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* mktime.c.old: Removed.
+
+2018-08-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* mktime.c: Updated from GNULIB.
+	* verify.h, intprops.h: Copied from supprt, for mktime.c
+	* mktime.c.old: Original version, just in case.
+
+2018-03-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* snprintf.c: Update copyright year.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2017-11-07         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* Remove varargs.h usage in snprintf.c
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-10-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkbool.h: Removed.
+
+2017-10-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* strncasecmp.c: Fix FSF's address.
+
+2017-06-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* getaddrinfo.c (getaddrinfo): Replace malloc+memset with calloc.
+
+2016-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* General: Remove trailing whitespace from all relevant files.
+
+2016-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* setenv.c: Update license text in setenv.c. Thanks
+	to David Kaspar <dkaspar@redhat.com> for pointing out
+	the necessity.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* getaddrinfo.h (gai_strerror): Add declaration.
+	* getaddrinfo.c (gai_strerror): New function.
+	(getaddrinfo): Return errno values instead of just -1.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-02-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fnmatch.h, fnmatch.c: New files, from GNU Make.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-09-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* snprintf.c, strtoul.c: Remove TRUE/FALSE in favor of true/false.
+
+2012-05-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* snprintf.c [DJGPP]: Change to __DJGPP__.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2011-11-02	Pat Rankin	<r.pat.rankin@gmail.com>
+
+	* wcmisc.c: Make code be conditional upon corresponding !HAVE_WCxxx.
+
+2011-11-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* wcmisc.c: New file.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/missing_d/README b/gawk-5.0.1/missing_d/README
new file mode 100644
index 00000000000..735889d832a
--- /dev/null
+++ b/gawk-5.0.1/missing_d/README
@@ -0,0 +1,14 @@
+Fri Aug 25 13:23:06 IDT 2006
+============================
+
+The files memmove.c, mktime.c, snprintf.c, strerror.c, strftime.c,
+strncasecmp.c, and system.c are copyright by the Free Software
+Foundation. They are licensed under the GPL or the LGPL. See the
+COPYING.LIB file in this directory and the COPYING file in the parent
+directory for licensing information.
+
+All other files are public domain.
+
+Arnold Robbins
+arnold@skeeve.com
+
diff --git a/gawk-5.0.1/missing_d/fnmatch.c b/gawk-5.0.1/missing_d/fnmatch.c
new file mode 100644
index 00000000000..4da8c5fb651
--- /dev/null
+++ b/gawk-5.0.1/missing_d/fnmatch.c
@@ -0,0 +1,489 @@
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software
+Foundation, Inc.
+This file is part of the GNU C Library.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; see the file COPYING.LIB.  If not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA.  */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Enable GNU extensions in fnmatch.h.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE	1
+#endif
+
+#include <errno.h>
+#include <fnmatch.h>
+#include <ctype.h>
+
+#if HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+/* For platform which support the ISO C amendement 1 functionality we
+   support user defined character classes.  */
+#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
+# include <wchar.h>
+# include <wctype.h>
+#endif
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined _LIBC || !defined __GNU_LIBRARY__
+
+
+# if defined STDC_HEADERS || !defined isascii
+#  define ISASCII(c) 1
+# else
+#  define ISASCII(c) isascii(c)
+# endif
+
+# ifdef isblank
+#  define ISBLANK(c) (ISASCII (c) && isblank (c))
+# else
+#  define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+# endif
+# ifdef isgraph
+#  define ISGRAPH(c) (ISASCII (c) && isgraph (c))
+# else
+#  define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
+# endif
+
+# define ISPRINT(c) (ISASCII (c) && isprint (c))
+# define ISDIGIT(c) (ISASCII (c) && isdigit (c))
+# define ISALNUM(c) (ISASCII (c) && isalnum (c))
+# define ISALPHA(c) (ISASCII (c) && isalpha (c))
+# define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
+# define ISLOWER(c) (ISASCII (c) && islower (c))
+# define ISPUNCT(c) (ISASCII (c) && ispunct (c))
+# define ISSPACE(c) (ISASCII (c) && isspace (c))
+# define ISUPPER(c) (ISASCII (c) && isupper (c))
+# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
+
+# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+/* The GNU C library provides support for user-defined character classes
+   and the functions from ISO C amendement 1.  */
+#  ifdef CHARCLASS_NAME_MAX
+#   define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+#  else
+/* This shouldn't happen but some implementation might still have this
+   problem.  Use a reasonable default value.  */
+#   define CHAR_CLASS_MAX_LENGTH 256
+#  endif
+
+#  ifdef _LIBC
+#   define IS_CHAR_CLASS(string) __wctype (string)
+#  else
+#   define IS_CHAR_CLASS(string) wctype (string)
+#  endif
+# else
+#  define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+
+#  define IS_CHAR_CLASS(string)						      \
+   (STREQ (string, "alpha") || STREQ (string, "upper")			      \
+    || STREQ (string, "lower") || STREQ (string, "digit")		      \
+    || STREQ (string, "alnum") || STREQ (string, "xdigit")		      \
+    || STREQ (string, "space") || STREQ (string, "print")		      \
+    || STREQ (string, "punct") || STREQ (string, "graph")		      \
+    || STREQ (string, "cntrl") || STREQ (string, "blank"))
+# endif
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+# if !defined _LIBC && !defined getenv
+extern char *getenv ();
+# endif
+
+# ifndef errno
+extern int errno;
+# endif
+
+/* This function doesn't exist on most systems.  */
+
+# if !defined HAVE___STRCHRNUL && !defined _LIBC
+static char *
+__strchrnul (s, c)
+     const char *s;
+     int c;
+{
+  char *result = strchr (s, c);
+  if (result == NULL)
+    result = strchr (s, '\0');
+  return result;
+}
+# endif
+
+# ifndef internal_function
+/* Inside GNU libc we mark some function in a special way.  In other
+   environments simply ignore the marking.  */
+#  define internal_function
+# endif
+
+/* Match STRING against the filename pattern PATTERN, returning zero if
+   it matches, nonzero if not.  */
+static int internal_fnmatch __P ((const char *pattern, const char *string,
+				  int no_leading_period, int flags))
+     internal_function;
+static int
+internal_function
+internal_fnmatch (pattern, string, no_leading_period, flags)
+     const char *pattern;
+     const char *string;
+     int no_leading_period;
+     int flags;
+{
+  register const char *p = pattern, *n = string;
+  register unsigned char c;
+
+/* Note that this evaluates C many times.  */
+# ifdef _LIBC
+#  define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
+# else
+#  define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
+# endif
+
+  while ((c = *p++) != '\0')
+    {
+      c = FOLD (c);
+
+      switch (c)
+	{
+	case '?':
+	  if (*n == '\0')
+	    return FNM_NOMATCH;
+	  else if (*n == '/' && (flags & FNM_FILE_NAME))
+	    return FNM_NOMATCH;
+	  else if (*n == '.' && no_leading_period
+		   && (n == string
+		       || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
+	    return FNM_NOMATCH;
+	  break;
+
+	case '\\':
+	  if (!(flags & FNM_NOESCAPE))
+	    {
+	      c = *p++;
+	      if (c == '\0')
+		/* Trailing \ loses.  */
+		return FNM_NOMATCH;
+	      c = FOLD (c);
+	    }
+	  if (FOLD ((unsigned char) *n) != c)
+	    return FNM_NOMATCH;
+	  break;
+
+	case '*':
+	  if (*n == '.' && no_leading_period
+	      && (n == string
+		  || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
+	    return FNM_NOMATCH;
+
+	  for (c = *p++; c == '?' || c == '*'; c = *p++)
+	    {
+	      if (*n == '/' && (flags & FNM_FILE_NAME))
+		/* A slash does not match a wildcard under FNM_FILE_NAME.  */
+		return FNM_NOMATCH;
+	      else if (c == '?')
+		{
+		  /* A ? needs to match one character.  */
+		  if (*n == '\0')
+		    /* There isn't another character; no match.  */
+		    return FNM_NOMATCH;
+		  else
+		    /* One character of the string is consumed in matching
+		       this ? wildcard, so *??? won't match if there are
+		       less than three characters.  */
+		    ++n;
+		}
+	    }
+
+	  if (c == '\0')
+	    /* The wildcard(s) is/are the last element of the pattern.
+	       If the name is a file name and contains another slash
+	       this does mean it cannot match.  */
+	    return ((flags & FNM_FILE_NAME) && strchr (n, '/') != NULL
+		    ? FNM_NOMATCH : 0);
+	  else
+	    {
+	      const char *endp;
+
+	      endp = __strchrnul (n, (flags & FNM_FILE_NAME) ? '/' : '\0');
+
+	      if (c == '[')
+		{
+		  int flags2 = ((flags & FNM_FILE_NAME)
+				? flags : (flags & ~FNM_PERIOD));
+
+		  for (--p; n < endp; ++n)
+		    if (internal_fnmatch (p, n,
+					  (no_leading_period
+					   && (n == string
+					       || (n[-1] == '/'
+						   && (flags
+						       & FNM_FILE_NAME)))),
+					  flags2)
+			== 0)
+		      return 0;
+		}
+	      else if (c == '/' && (flags & FNM_FILE_NAME))
+		{
+		  while (*n != '\0' && *n != '/')
+		    ++n;
+		  if (*n == '/'
+		      && (internal_fnmatch (p, n + 1, flags & FNM_PERIOD,
+					    flags) == 0))
+		    return 0;
+		}
+	      else
+		{
+		  int flags2 = ((flags & FNM_FILE_NAME)
+				? flags : (flags & ~FNM_PERIOD));
+
+		  if (c == '\\' && !(flags & FNM_NOESCAPE))
+		    c = *p;
+		  c = FOLD (c);
+		  for (--p; n < endp; ++n)
+		    if (FOLD ((unsigned char) *n) == c
+			&& (internal_fnmatch (p, n,
+					      (no_leading_period
+					       && (n == string
+						   || (n[-1] == '/'
+						       && (flags
+							   & FNM_FILE_NAME)))),
+					      flags2) == 0))
+		      return 0;
+		}
+	    }
+
+	  /* If we come here no match is possible with the wildcard.  */
+	  return FNM_NOMATCH;
+
+	case '[':
+	  {
+	    /* Nonzero if the sense of the character class is inverted.  */
+	    static int posixly_correct;
+	    register int not;
+	    char cold;
+
+	    if (posixly_correct == 0)
+	      posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
+
+	    if (*n == '\0')
+	      return FNM_NOMATCH;
+
+	    if (*n == '.' && no_leading_period && (n == string
+						   || (n[-1] == '/'
+						       && (flags
+							   & FNM_FILE_NAME))))
+	      return FNM_NOMATCH;
+
+	    if (*n == '/' && (flags & FNM_FILE_NAME))
+	      /* `/' cannot be matched.  */
+	      return FNM_NOMATCH;
+
+	    not = (*p == '!' || (posixly_correct < 0 && *p == '^'));
+	    if (not)
+	      ++p;
+
+	    c = *p++;
+	    for (;;)
+	      {
+		unsigned char fn = FOLD ((unsigned char) *n);
+
+		if (!(flags & FNM_NOESCAPE) && c == '\\')
+		  {
+		    if (*p == '\0')
+		      return FNM_NOMATCH;
+		    c = FOLD ((unsigned char) *p);
+		    ++p;
+
+		    if (c == fn)
+		      goto matched;
+		  }
+		else if (c == '[' && *p == ':')
+		  {
+		    /* Leave room for the null.  */
+		    char str[CHAR_CLASS_MAX_LENGTH + 1];
+		    size_t c1 = 0;
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+		    wctype_t wt;
+# endif
+		    const char *startp = p;
+
+		    for (;;)
+		      {
+			if (c1 == CHAR_CLASS_MAX_LENGTH)
+			  /* The name is too long and therefore the pattern
+			     is ill-formed.  */
+			  return FNM_NOMATCH;
+
+			c = *++p;
+			if (c == ':' && p[1] == ']')
+			  {
+			    p += 2;
+			    break;
+			  }
+			if (c < 'a' || c >= 'z')
+			  {
+			    /* This cannot possibly be a character class name.
+			       Match it as a normal range.  */
+			    p = startp;
+			    c = '[';
+			    goto normal_bracket;
+			  }
+			str[c1++] = c;
+		      }
+		    str[c1] = '\0';
+
+# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
+		    wt = IS_CHAR_CLASS (str);
+		    if (wt == 0)
+		      /* Invalid character class name.  */
+		      return FNM_NOMATCH;
+
+		    if (__iswctype (__btowc ((unsigned char) *n), wt))
+		      goto matched;
+# else
+		    if ((STREQ (str, "alnum") && ISALNUM ((unsigned char) *n))
+			|| (STREQ (str, "alpha") && ISALPHA ((unsigned char) *n))
+			|| (STREQ (str, "blank") && ISBLANK ((unsigned char) *n))
+			|| (STREQ (str, "cntrl") && ISCNTRL ((unsigned char) *n))
+			|| (STREQ (str, "digit") && ISDIGIT ((unsigned char) *n))
+			|| (STREQ (str, "graph") && ISGRAPH ((unsigned char) *n))
+			|| (STREQ (str, "lower") && ISLOWER ((unsigned char) *n))
+			|| (STREQ (str, "print") && ISPRINT ((unsigned char) *n))
+			|| (STREQ (str, "punct") && ISPUNCT ((unsigned char) *n))
+			|| (STREQ (str, "space") && ISSPACE ((unsigned char) *n))
+			|| (STREQ (str, "upper") && ISUPPER ((unsigned char) *n))
+			|| (STREQ (str, "xdigit") && ISXDIGIT ((unsigned char) *n)))
+		      goto matched;
+# endif
+		  }
+		else if (c == '\0')
+		  /* [ (unterminated) loses.  */
+		  return FNM_NOMATCH;
+		else
+		  {
+		  normal_bracket:
+		    if (FOLD (c) == fn)
+		      goto matched;
+
+		    cold = c;
+		    c = *p++;
+
+		    if (c == '-' && *p != ']')
+		      {
+			/* It is a range.  */
+			unsigned char cend = *p++;
+			if (!(flags & FNM_NOESCAPE) && cend == '\\')
+			  cend = *p++;
+			if (cend == '\0')
+			  return FNM_NOMATCH;
+
+			if (cold <= fn && fn <= FOLD (cend))
+			  goto matched;
+
+			c = *p++;
+		      }
+		  }
+
+		if (c == ']')
+		  break;
+	      }
+
+	    if (!not)
+	      return FNM_NOMATCH;
+	    break;
+
+	  matched:
+	    /* Skip the rest of the [...] that already matched.  */
+	    while (c != ']')
+	      {
+		if (c == '\0')
+		  /* [... (unterminated) loses.  */
+		  return FNM_NOMATCH;
+
+		c = *p++;
+		if (!(flags & FNM_NOESCAPE) && c == '\\')
+		  {
+		    if (*p == '\0')
+		      return FNM_NOMATCH;
+		    /* XXX 1003.2d11 is unclear if this is right.  */
+		    ++p;
+		  }
+		else if (c == '[' && *p == ':')
+		  {
+		    do
+		      if (*++p == '\0')
+			return FNM_NOMATCH;
+		    while (*p != ':' || p[1] == ']');
+		    p += 2;
+		    c = *p;
+		  }
+	      }
+	    if (not)
+	      return FNM_NOMATCH;
+	  }
+	  break;
+
+	default:
+	  if (c != FOLD ((unsigned char) *n))
+	    return FNM_NOMATCH;
+	}
+
+      ++n;
+    }
+
+  if (*n == '\0')
+    return 0;
+
+  if ((flags & FNM_LEADING_DIR) && *n == '/')
+    /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz".  */
+    return 0;
+
+  return FNM_NOMATCH;
+
+# undef FOLD
+}
+
+
+int
+fnmatch (pattern, string, flags)
+     const char *pattern;
+     const char *string;
+     int flags;
+{
+  return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags);
+}
+
+#endif	/* _LIBC or not __GNU_LIBRARY__.  */
diff --git a/gawk-5.0.1/missing_d/fnmatch.h b/gawk-5.0.1/missing_d/fnmatch.h
new file mode 100644
index 00000000000..a788c8e1c7b
--- /dev/null
+++ b/gawk-5.0.1/missing_d/fnmatch.h
@@ -0,0 +1,85 @@
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999 Free Software
+Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; see the file COPYING.LIB.  If not, write to the Free
+Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA.  */
+
+#ifndef	_FNMATCH_H
+#define	_FNMATCH_H	1
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
+# if !defined __GLIBC__
+#  undef	__P
+#  define __P(protos)	protos
+# endif
+#else /* Not C++ or ANSI C.  */
+# undef	__P
+# define __P(protos)	()
+/* We can get away without defining `const' here only because in this file
+   it is used only inside the prototype for `fnmatch', which is elided in
+   non-ANSI C where `const' is problematical.  */
+#endif /* C++ or ANSI C.  */
+
+#ifndef const
+# if (defined __STDC__ && __STDC__) || defined __cplusplus || defined WINDOWS32
+#  define __const	const
+# else
+#  define __const
+# endif
+#endif
+
+/* We #undef these before defining them because some losing systems
+   (HP-UX A.08.07 for example) define these in <unistd.h>.  */
+#undef	FNM_PATHNAME
+#undef	FNM_NOESCAPE
+#undef	FNM_PERIOD
+
+/* Bits set in the FLAGS argument to `fnmatch'.  */
+#define	FNM_PATHNAME	(1 << 0) /* No wildcard can ever match `/'.  */
+#define	FNM_NOESCAPE	(1 << 1) /* Backslashes don't quote special chars.  */
+#define	FNM_PERIOD	(1 << 2) /* Leading `.' is matched only explicitly.  */
+
+#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
+# define FNM_FILE_NAME	 FNM_PATHNAME	/* Preferred GNU name.  */
+# define FNM_LEADING_DIR (1 << 3)	/* Ignore `/...' after a match.  */
+# define FNM_CASEFOLD	 (1 << 4)	/* Compare without regard to case.  */
+#endif
+
+/* Value returned by `fnmatch' if STRING does not match PATTERN.  */
+#define	FNM_NOMATCH	1
+
+/* This value is returned if the implementation does not support
+   `fnmatch'.  Since this is not the case here it will never be
+   returned but the conformance test suites still require the symbol
+   to be defined.  */
+#ifdef _XOPEN_SOURCE
+# define FNM_NOSYS	(-1)
+#endif
+
+/* Match NAME against the filename pattern PATTERN,
+   returning zero if it matches, FNM_NOMATCH if not.  */
+extern int fnmatch __P ((__const char *__pattern, __const char *__name,
+			 int __flags));
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* fnmatch.h */
diff --git a/gawk-5.0.1/missing_d/getaddrinfo.c b/gawk-5.0.1/missing_d/getaddrinfo.c
new file mode 100644
index 00000000000..5233cf5632f
--- /dev/null
+++ b/gawk-5.0.1/missing_d/getaddrinfo.c
@@ -0,0 +1,119 @@
+#ifndef HAVE_SOCKETS
+#error getaddrinfo.c included by mistake! no socket support!
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif
+#include <errno.h>
+#include <string.h>	/* strerror */
+
+#include "getaddrinfo.h"
+
+void
+freeaddrinfo(struct addrinfo *res)
+{
+	if (res->ai_addr != NULL)
+		free(res->ai_addr);
+	free(res);
+}
+
+int
+getaddrinfo(const char *hostname, const char *portname,
+	struct addrinfo *hints, struct addrinfo **res)
+{
+	struct addrinfo *out;
+	if (res == NULL)
+		return EINVAL;
+
+	out = (struct addrinfo *) calloc(1, sizeof(*out));
+	if (out == NULL) {
+		*res = NULL;
+		return ENOMEM;
+	}
+
+	out->ai_addr = (struct sockaddr *) malloc(sizeof(struct sockaddr_in));
+	if (out->ai_addr == NULL) {
+		free(out);
+		*res = NULL;
+		return ENOMEM;
+	}
+
+	out->ai_socktype = SOCK_STREAM;
+	if (hints != NULL) {
+		if (hints->ai_socktype)
+			out->ai_socktype = hints->ai_socktype;
+		if (hints->ai_protocol)
+			out->ai_protocol = hints->ai_protocol;
+	}
+
+	if (out->ai_protocol == 0) {
+		switch (out->ai_socktype) {
+		case SOCK_STREAM:
+			out->ai_protocol = IPPROTO_TCP;
+			break;
+		case SOCK_DGRAM:
+			out->ai_protocol = IPPROTO_UDP;
+			break;
+		case SOCK_RAW:
+			out->ai_protocol = IPPROTO_RAW;
+			break;
+		}
+	}
+
+	out->ai_addrlen = sizeof(struct sockaddr_in);
+	memset(out->ai_addr, '\0', sizeof(struct sockaddr_in));
+
+	if (hostname != NULL) {
+		struct hostent *he;
+		he = gethostbyname(hostname);
+		if (he != NULL && he->h_addr_list != NULL) {
+			((struct sockaddr_in *)out->ai_addr)->sin_addr.s_addr
+				= ((struct in_addr *)he->h_addr_list[0])->s_addr;
+		} else {
+			freeaddrinfo(out);
+			return EADDRNOTAVAIL;
+		}
+	} else {
+		if (!(out->ai_flags & AI_PASSIVE))
+			((struct sockaddr_in *)out->ai_addr)->sin_addr.s_addr
+							= htonl(INADDR_ANY);
+	}
+	((struct sockaddr_in *)out->ai_addr)->sin_family = AF_INET;
+	out->ai_family = AF_INET;
+
+	if (portname != NULL && *portname) {
+		long portnum;
+		char *end;
+		portnum = strtol(portname, &end, 10);
+		if (*end == '\0' && portnum > 0 && portnum < 65536) {
+			((struct sockaddr_in *)out->ai_addr)->sin_port
+							= htons(portnum);
+		} else {
+			struct servent *se;
+			se = getservbyname(portname, NULL);
+			if (se != NULL) {
+				((struct sockaddr_in *)out->ai_addr)->sin_port
+							= se->s_port;
+			}
+		}
+	}
+
+	*res = out;
+
+	return 0;
+}
+
+const char *
+gai_strerror(int errcode)
+{
+	return strerror(errcode);
+}
+#endif
diff --git a/gawk-5.0.1/missing_d/getaddrinfo.h b/gawk-5.0.1/missing_d/getaddrinfo.h
new file mode 100644
index 00000000000..873d67dffc2
--- /dev/null
+++ b/gawk-5.0.1/missing_d/getaddrinfo.h
@@ -0,0 +1,33 @@
+#ifndef AI_ADDRCONFIG
+#define AI_ADDRCONFIG 0
+#endif /* AI_ADDRCONFIG */
+#ifndef AI_PASSIVE
+#define AI_PASSIVE 1
+#endif /* AI_PASSIVE */
+
+/* undef these, just in case, to avoid noisy warnings */
+#undef addrinfo
+#undef freeaddrinfo
+#undef getaddrinfo
+
+#define addrinfo xaddrinfo
+#define freeaddrinfo xfreeaddrinfo
+#define getaddrinfo xgetaddrinfo
+
+struct addrinfo
+{
+	int ai_flags;
+	int ai_socktype;
+	int ai_family;
+	int ai_protocol;
+	socklen_t ai_addrlen;
+	struct sockaddr * ai_addr;
+	struct xaddrinfo * ai_next;
+};
+
+void freeaddrinfo(struct xaddrinfo * res);
+
+int getaddrinfo(const char * hostname, const char * portname,
+	struct xaddrinfo * hints, struct xaddrinfo ** res);
+
+const char *gai_strerror(int errcode);
diff --git a/gawk-5.0.1/missing_d/memcmp.c b/gawk-5.0.1/missing_d/memcmp.c
new file mode 100644
index 00000000000..12b3775dfec
--- /dev/null
+++ b/gawk-5.0.1/missing_d/memcmp.c
@@ -0,0 +1,18 @@
+/*
+ * memcmp --- compare strings.
+ *
+ * We use our own routine since it has to act like strcmp() for return
+ * value, and the BSD manual says bcmp() only returns zero/non-zero.
+ */
+
+int
+memcmp (s1, s2, l)
+char *s1, *s2;
+int l;
+{
+	for (; l-- > 0; s1++, s2++) {
+		if (*s1 != *s2)
+			return (*s1 - *s2);
+	}
+	return (0);
+}
diff --git a/gawk-5.0.1/missing_d/memcpy.c b/gawk-5.0.1/missing_d/memcpy.c
new file mode 100644
index 00000000000..568a006a094
--- /dev/null
+++ b/gawk-5.0.1/missing_d/memcpy.c
@@ -0,0 +1,18 @@
+/*
+ * memcpy --- copy strings.
+ *
+ * We supply this routine for those systems that aren't standard yet.
+ */
+
+char *
+memcpy (dest, src, l)
+char *dest, *src;
+int l;
+{
+	char *ret = dest;
+
+	while (l--)
+		*dest++ = *src++;
+
+	return ret;
+}
diff --git a/gawk-5.0.1/missing_d/memmove.c b/gawk-5.0.1/missing_d/memmove.c
new file mode 100644
index 00000000000..4f577b382f4
--- /dev/null
+++ b/gawk-5.0.1/missing_d/memmove.c
@@ -0,0 +1,139 @@
+/* Copy memory to memory until the specified number of bytes
+   has been copied.  Overlap is handled correctly.
+   Copyright (C) 1991, 1995, 1996, 1997, 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Torbjorn Granlund (tege@sics.se).
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA  02110-1301  USA */
+
+/*
+ * August 2006. For Gawk: Borrowed from GLIBC and hacked unmercifully.
+ * DON'T steal this for your own code, go straight to the GLIBC
+ * source for the original versions.
+ */
+
+
+/* This stuff from libc/sysdeps/generic/memcopy.h */
+typedef unsigned char byte;
+
+/* Copy exactly NBYTES bytes from SRC_BP to DST_BP,
+   without any assumptions about alignment of the pointers.  */
+#define BYTE_COPY_FWD(dst_bp, src_bp, nbytes)				      \
+  do									      \
+    {									      \
+      size_t __nbytes = (nbytes);					      \
+      while (__nbytes > 0)						      \
+	{								      \
+	  byte __x = ((byte *) src_bp)[0];				      \
+	  src_bp += 1;							      \
+	  __nbytes -= 1;						      \
+	  ((byte *) dst_bp)[0] = __x;					      \
+	  dst_bp += 1;							      \
+	}								      \
+    } while (0)
+
+/* Copy exactly NBYTES_TO_COPY bytes from SRC_END_PTR to DST_END_PTR,
+   beginning at the bytes right before the pointers and continuing towards
+   smaller addresses.  Don't assume anything about alignment of the
+   pointers.  */
+#define BYTE_COPY_BWD(dst_ep, src_ep, nbytes)				      \
+  do									      \
+    {									      \
+      size_t __nbytes = (nbytes);					      \
+      while (__nbytes > 0)						      \
+	{								      \
+	  byte __x;							      \
+	  src_ep -= 1;							      \
+	  __x = ((byte *) src_ep)[0];					      \
+	  dst_ep -= 1;							      \
+	  __nbytes -= 1;						      \
+	  ((byte *) dst_ep)[0] = __x;					      \
+	}								      \
+    } while (0)
+
+/* end of stuff from memcopy.h */
+
+void *
+memmove (dest, src, len)
+     void *dest;
+     const void *src;
+     size_t len;
+{
+  unsigned long int dstp = (long int) dest;
+  unsigned long int srcp = (long int) src;
+
+  /* This test makes the forward copying code be used whenever possible.
+     Reduces the working set.  */
+  if (dstp - srcp >= len)	/* *Unsigned* compare!  */
+    {
+      /* Copy from the beginning to the end.  */
+#if 0 /* screw all this */
+      /* If there not too few bytes to copy, use word copy.  */
+      if (len >= OP_T_THRES)
+	{
+	  /* Copy just a few bytes to make DSTP aligned.  */
+	  len -= (-dstp) % OPSIZ;
+	  BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);
+
+	  /* Copy whole pages from SRCP to DSTP by virtual address
+	     manipulation, as much as possible.  */
+
+	  PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);
+
+	  /* Copy from SRCP to DSTP taking advantage of the known
+	     alignment of DSTP.  Number of bytes remaining is put
+	     in the third argument, i.e. in LEN.  This number may
+	     vary from machine to machine.  */
+
+	  WORD_COPY_FWD (dstp, srcp, len, len);
+
+	  /* Fall out and copy the tail.  */
+	}
+
+      /* There are just a few bytes to copy.  Use byte memory operations.  */
+#endif
+      BYTE_COPY_FWD (dstp, srcp, len);
+    }
+  else
+    {
+      /* Copy from the end to the beginning.  */
+      srcp += len;
+      dstp += len;
+
+#if 0 /* ditto */
+      /* If there not too few bytes to copy, use word copy.  */
+      if (len >= OP_T_THRES)
+	{
+	  /* Copy just a few bytes to make DSTP aligned.  */
+	  len -= dstp % OPSIZ;
+	  BYTE_COPY_BWD (dstp, srcp, dstp % OPSIZ);
+
+	  /* Copy from SRCP to DSTP taking advantage of the known
+	     alignment of DSTP.  Number of bytes remaining is put
+	     in the third argument, i.e. in LEN.  This number may
+	     vary from machine to machine.  */
+
+	  WORD_COPY_BWD (dstp, srcp, len, len);
+
+	  /* Fall out and copy the tail.  */
+	}
+#endif
+      /* There are just a few bytes to copy.  Use byte memory operations.  */
+      BYTE_COPY_BWD (dstp, srcp, len);
+    }
+
+  return (dest);
+}
diff --git a/gawk-5.0.1/missing_d/memset.c b/gawk-5.0.1/missing_d/memset.c
new file mode 100644
index 00000000000..0e509e85fba
--- /dev/null
+++ b/gawk-5.0.1/missing_d/memset.c
@@ -0,0 +1,20 @@
+/*
+ * memset --- initialize memory
+ *
+ * We supply this routine for those systems that aren't standard yet.
+ */
+
+void *
+memset(dest, val, l)
+void *dest;
+int val;
+size_t l;
+{
+	char *ret = dest;
+	char *d = dest;
+
+	while (l--)
+		*d++ = val;
+
+	return ((void *) ret);
+}
diff --git a/gawk-5.0.1/missing_d/mktime-internal.h b/gawk-5.0.1/missing_d/mktime-internal.h
new file mode 100644
index 00000000000..3e64156e8dc
--- /dev/null
+++ b/gawk-5.0.1/missing_d/mktime-internal.h
@@ -0,0 +1,53 @@
+/* mktime variant that also uses an offset guess
+
+   Copyright 2016-2018 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this program; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <time.h>
+
+/* mktime_offset_t is a signed type wide enough to hold a UTC offset
+   in seconds, and used as part of the type of the offset-guess
+   argument to mktime_internal.  Use time_t on platforms where time_t
+   is signed, to be compatible with platforms like BeOS that export
+   this implementation detail of mktime.  On platforms where time_t is
+   unsigned, GNU and POSIX code can assume 'int' is at least 32 bits
+   which is wide enough for a UTC offset.  */
+
+#if TIME_T_IS_SIGNED
+typedef time_t mktime_offset_t;
+#else
+typedef int mktime_offset_t;
+#endif
+
+time_t mktime_internal (struct tm *,
+                        struct tm * (*) (time_t const *, struct tm *),
+                        mktime_offset_t *);
+
+/* Although glibc source code uses leading underscores, Gnulib wants
+   ordinary names.
+
+   Portable standalone applications should supply a <time.h> that
+   declares a POSIX-compliant localtime_r, for the benefit of older
+   implementations that lack localtime_r or have a nonstandard one.
+   Similarly for gmtime_r.  See the gnulib time_r module for one way
+   to implement this.  */
+
+#undef __gmtime_r
+#undef __localtime_r
+#define __gmtime_r gmtime_r
+#define __localtime_r localtime_r
+
+#define __mktime_internal mktime_internal
diff --git a/gawk-5.0.1/missing_d/mktime.c b/gawk-5.0.1/missing_d/mktime.c
new file mode 100644
index 00000000000..3ecab0d11cf
--- /dev/null
+++ b/gawk-5.0.1/missing_d/mktime.c
@@ -0,0 +1,690 @@
+/* Convert a 'struct tm' to a time_t value.
+   Copyright (C) 1993-2018 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Paul Eggert <eggert@twinsun.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* Define this to 1 to have a standalone program to test this implementation of
+   mktime.  */
+#ifndef DEBUG_MKTIME
+# define DEBUG_MKTIME 0
+#endif
+
+/* The following macros influence what gets defined when this file is compiled:
+
+   Macro/expression            Which gnulib module    This compilation unit
+                                                      should define
+
+   _LIBC                       (glibc proper)         mktime
+
+   NEED_MKTIME_WORKING         mktime                 rpl_mktime
+   || NEED_MKTIME_WINDOWS
+
+   NEED_MKTIME_INTERNAL        mktime-internal        mktime_internal
+
+   DEBUG_MKTIME                (defined manually)     my_mktime, main
+ */
+
+#if !defined _LIBC && !DEBUG_MKTIME
+# include <config.h>
+#endif
+
+/* Assume that leap seconds are possible, unless told otherwise.
+   If the host has a 'zic' command with a '-L leapsecondfilename' option,
+   then it supports leap seconds; otherwise it probably doesn't.  */
+#ifndef LEAP_SECONDS_POSSIBLE
+# define LEAP_SECONDS_POSSIBLE 1
+#endif
+
+#include <time.h>
+
+#include <limits.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <intprops.h>
+#include <verify.h>
+
+#if DEBUG_MKTIME
+# include <stdio.h>
+/* Make it work even if the system's libc has its own mktime routine.  */
+# undef mktime
+# define mktime my_mktime
+#endif /* DEBUG_MKTIME */
+
+#ifndef NEED_MKTIME_INTERNAL
+# define NEED_MKTIME_INTERNAL 0
+#endif
+#ifndef NEED_MKTIME_WINDOWS
+# define NEED_MKTIME_WINDOWS 0
+#endif
+#ifndef NEED_MKTIME_WORKING
+# define NEED_MKTIME_WORKING DEBUG_MKTIME
+#endif
+
+# include "mktime-internal.h"
+
+#ifndef _LIBC
+static void
+my_tzset (void)
+{
+# if NEED_MKTIME_WINDOWS
+  /* Rectify the value of the environment variable TZ.
+     There are four possible kinds of such values:
+       - Traditional US time zone names, e.g. "PST8PDT".  Syntax: see
+         <https://msdn.microsoft.com/en-us/library/90s5c885.aspx>
+       - Time zone names based on geography, that contain one or more
+         slashes, e.g. "Europe/Moscow".
+       - Time zone names based on geography, without slashes, e.g.
+         "Singapore".
+       - Time zone names that contain explicit DST rules.  Syntax: see
+         <http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03>
+     The Microsoft CRT understands only the first kind.  It produces incorrect
+     results if the value of TZ is of the other kinds.
+     But in a Cygwin environment, /etc/profile.d/tzset.sh sets TZ to a value
+     of the second kind for most geographies, or of the first kind in a few
+     other geographies.  If it is of the second kind, neutralize it.  For the
+     Microsoft CRT, an absent or empty TZ means the time zone that the user
+     has set in the Windows Control Panel.
+     If the value of TZ is of the third or fourth kind -- Cygwin programs
+     understand these syntaxes as well --, it does not matter whether we
+     neutralize it or not, since these values occur only when a Cygwin user
+     has set TZ explicitly; this case is 1. rare and 2. under the user's
+     responsibility.  */
+  const char *tz = getenv ("TZ");
+  if (tz != NULL && strchr (tz, '/') != NULL)
+    _putenv ("TZ=");
+# elif HAVE_TZSET
+  tzset ();
+# endif
+}
+# undef __tzset
+# define __tzset() my_tzset ()
+#endif
+
+#if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL
+
+/* A signed type that can represent an integer number of years
+   multiplied by three times the number of seconds in a year.  It is
+   needed when converting a tm_year value times the number of seconds
+   in a year.  The factor of three comes because these products need
+   to be subtracted from each other, and sometimes with an offset
+   added to them, without worrying about overflow.
+
+   Much of the code uses long_int to represent time_t values, to
+   lessen the hassle of dealing with platforms where time_t is
+   unsigned, and because long_int should suffice to represent all
+   time_t values that mktime can generate even on platforms where
+   time_t is excessively wide.  */
+
+#if INT_MAX <= LONG_MAX / 3 / 366 / 24 / 60 / 60
+typedef long int long_int;
+#else
+typedef long long int long_int;
+#endif
+verify (INT_MAX <= TYPE_MAXIMUM (long_int) / 3 / 366 / 24 / 60 / 60);
+
+/* Shift A right by B bits portably, by dividing A by 2**B and
+   truncating towards minus infinity.  B should be in the range 0 <= B
+   <= LONG_INT_BITS - 2, where LONG_INT_BITS is the number of useful
+   bits in a long_int.  LONG_INT_BITS is at least 32.
+
+   ISO C99 says that A >> B is implementation-defined if A < 0.  Some
+   implementations (e.g., UNICOS 9.0 on a Cray Y-MP EL) don't shift
+   right in the usual way when A < 0, so SHR falls back on division if
+   ordinary A >> B doesn't seem to be the usual signed shift.  */
+
+static long_int
+shr (long_int a, int b)
+{
+  long_int one = 1;
+  return (-one >> 1 == -1
+	  ? a >> b
+	  : a / (one << b) - (a % (one << b) < 0));
+}
+
+/* Bounds for the intersection of time_t and long_int.  */
+
+static long_int const mktime_min
+  = ((TYPE_SIGNED (time_t) && TYPE_MINIMUM (time_t) < TYPE_MINIMUM (long_int))
+     ? TYPE_MINIMUM (long_int) : TYPE_MINIMUM (time_t));
+static long_int const mktime_max
+  = (TYPE_MAXIMUM (long_int) < TYPE_MAXIMUM (time_t)
+     ? TYPE_MAXIMUM (long_int) : TYPE_MAXIMUM (time_t));
+
+verify (TYPE_IS_INTEGER (time_t));
+
+#define EPOCH_YEAR 1970
+#define TM_YEAR_BASE 1900
+verify (TM_YEAR_BASE % 100 == 0);
+
+/* Is YEAR + TM_YEAR_BASE a leap year?  */
+static bool
+leapyear (long_int year)
+{
+  /* Don't add YEAR to TM_YEAR_BASE, as that might overflow.
+     Also, work even if YEAR is negative.  */
+  return
+    ((year & 3) == 0
+     && (year % 100 != 0
+	 || ((year / 100) & 3) == (- (TM_YEAR_BASE / 100) & 3)));
+}
+
+/* How many days come before each month (0-12).  */
+#ifndef _LIBC
+static
+#endif
+const unsigned short int __mon_yday[2][13] =
+  {
+    /* Normal years.  */
+    { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
+    /* Leap years.  */
+    { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
+  };
+
+
+/* Do the values A and B differ according to the rules for tm_isdst?
+   A and B differ if one is zero and the other positive.  */
+static bool
+isdst_differ (int a, int b)
+{
+  return (!a != !b) && (0 <= a) && (0 <= b);
+}
+
+/* Return an integer value measuring (YEAR1-YDAY1 HOUR1:MIN1:SEC1) -
+   (YEAR0-YDAY0 HOUR0:MIN0:SEC0) in seconds, assuming that the clocks
+   were not adjusted between the timestamps.
+
+   The YEAR values uses the same numbering as TP->tm_year.  Values
+   need not be in the usual range.  However, YEAR1 must not overflow
+   when multiplied by three times the number of seconds in a year, and
+   likewise for YDAY1 and three times the number of seconds in a day.  */
+
+static long_int
+ydhms_diff (long_int year1, long_int yday1, int hour1, int min1, int sec1,
+	    int year0, int yday0, int hour0, int min0, int sec0)
+{
+  verify (-1 / 2 == 0);
+
+  /* Compute intervening leap days correctly even if year is negative.
+     Take care to avoid integer overflow here.  */
+  int a4 = shr (year1, 2) + shr (TM_YEAR_BASE, 2) - ! (year1 & 3);
+  int b4 = shr (year0, 2) + shr (TM_YEAR_BASE, 2) - ! (year0 & 3);
+  int a100 = a4 / 25 - (a4 % 25 < 0);
+  int b100 = b4 / 25 - (b4 % 25 < 0);
+  int a400 = shr (a100, 2);
+  int b400 = shr (b100, 2);
+  int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+
+  /* Compute the desired time without overflowing.  */
+  long_int years = year1 - year0;
+  long_int days = 365 * years + yday1 - yday0 + intervening_leap_days;
+  long_int hours = 24 * days + hour1 - hour0;
+  long_int minutes = 60 * hours + min1 - min0;
+  long_int seconds = 60 * minutes + sec1 - sec0;
+  return seconds;
+}
+
+/* Return the average of A and B, even if A + B would overflow.
+   Round toward positive infinity.  */
+static long_int
+long_int_avg (long_int a, long_int b)
+{
+  return shr (a, 1) + shr (b, 1) + ((a | b) & 1);
+}
+
+/* Return a time_t value corresponding to (YEAR-YDAY HOUR:MIN:SEC),
+   assuming that T corresponds to *TP and that no clock adjustments
+   occurred between *TP and the desired time.
+   Although T and the returned value are of type long_int,
+   they represent time_t values and must be in time_t range.
+   If TP is null, return a value not equal to T; this avoids false matches.
+   YEAR and YDAY must not be so large that multiplying them by three times the
+   number of seconds in a year (or day, respectively) would overflow long_int.
+   If the returned value would be out of range, yield the minimal or
+   maximal in-range value, except do not yield a value equal to T.  */
+static long_int
+guess_time_tm (long_int year, long_int yday, int hour, int min, int sec,
+	       long_int t, const struct tm *tp)
+{
+  if (tp)
+    {
+      long_int result;
+      long_int d = ydhms_diff (year, yday, hour, min, sec,
+			       tp->tm_year, tp->tm_yday,
+			       tp->tm_hour, tp->tm_min, tp->tm_sec);
+      if (! INT_ADD_WRAPV (t, d, &result))
+	return result;
+    }
+
+  /* Overflow occurred one way or another.  Return the nearest result
+     that is actually in range, except don't report a zero difference
+     if the actual difference is nonzero, as that would cause a false
+     match; and don't oscillate between two values, as that would
+     confuse the spring-forward gap detector.  */
+  return (t < long_int_avg (mktime_min, mktime_max)
+	  ? (t <= mktime_min + 1 ? t + 1 : mktime_min)
+	  : (mktime_max - 1 <= t ? t - 1 : mktime_max));
+}
+
+/* Use CONVERT to convert T to a struct tm value in *TM.  T must be in
+   range for time_t.  Return TM if successful, NULL if T is out of
+   range for CONVERT.  */
+static struct tm *
+convert_time (struct tm *(*convert) (const time_t *, struct tm *),
+	      long_int t, struct tm *tm)
+{
+  time_t x = t;
+  return convert (&x, tm);
+}
+
+/* Use CONVERT to convert *T to a broken down time in *TP.
+   If *T is out of range for conversion, adjust it so that
+   it is the nearest in-range value and then convert that.
+   A value is in range if it fits in both time_t and long_int.  */
+static struct tm *
+ranged_convert (struct tm *(*convert) (const time_t *, struct tm *),
+		long_int *t, struct tm *tp)
+{
+  struct tm *r;
+  if (*t < mktime_min)
+    *t = mktime_min;
+  else if (mktime_max < *t)
+    *t = mktime_max;
+  r = convert_time (convert, *t, tp);
+
+  if (!r && *t)
+    {
+      long_int bad = *t;
+      long_int ok = 0;
+
+      /* BAD is a known unconvertible value, and OK is a known good one.
+	 Use binary search to narrow the range between BAD and OK until
+	 they differ by 1.  */
+      while (true)
+	{
+	  long_int mid = long_int_avg (ok, bad);
+	  if (mid != ok && mid != bad)
+	    break;
+	  r = convert_time (convert, mid, tp);
+	  if (r)
+	    ok = mid;
+	  else
+	    bad = mid;
+	}
+
+      if (!r && ok)
+	{
+	  /* The last conversion attempt failed;
+	     revert to the most recent successful attempt.  */
+	  r = convert_time (convert, ok, tp);
+	}
+    }
+
+  return r;
+}
+
+
+/* Convert *TP to a time_t value, inverting
+   the monotonic and mostly-unit-linear conversion function CONVERT.
+   Use *OFFSET to keep track of a guess at the offset of the result,
+   compared to what the result would be for UTC without leap seconds.
+   If *OFFSET's guess is correct, only one CONVERT call is needed.
+   This function is external because it is used also by timegm.c.  */
+time_t
+__mktime_internal (struct tm *tp,
+		   struct tm *(*convert) (const time_t *, struct tm *),
+		   mktime_offset_t *offset)
+{
+  long_int t, gt, t0, t1, t2, dt;
+  struct tm tm;
+
+  /* The maximum number of probes (calls to CONVERT) should be enough
+     to handle any combinations of time zone rule changes, solar time,
+     leap seconds, and oscillations around a spring-forward gap.
+     POSIX.1 prohibits leap seconds, but some hosts have them anyway.  */
+  int remaining_probes = 6;
+
+  /* Time requested.  Copy it in case CONVERT modifies *TP; this can
+     occur if TP is localtime's returned value and CONVERT is localtime.  */
+  int sec = tp->tm_sec;
+  int min = tp->tm_min;
+  int hour = tp->tm_hour;
+  int mday = tp->tm_mday;
+  int mon = tp->tm_mon;
+  int year_requested = tp->tm_year;
+  int isdst = tp->tm_isdst;
+
+  /* 1 if the previous probe was DST.  */
+  int dst2;
+
+  /* Ensure that mon is in range, and set year accordingly.  */
+  int mon_remainder = mon % 12;
+  int negative_mon_remainder = mon_remainder < 0;
+  int mon_years = mon / 12 - negative_mon_remainder;
+  long_int lyear_requested = year_requested;
+  long_int year = lyear_requested + mon_years;
+
+  /* The other values need not be in range:
+     the remaining code handles overflows correctly.  */
+
+  /* Calculate day of year from year, month, and day of month.
+     The result need not be in range.  */
+  int mon_yday = ((__mon_yday[leapyear (year)]
+		   [mon_remainder + 12 * negative_mon_remainder])
+		  - 1);
+  long_int lmday = mday;
+  long_int yday = mon_yday + lmday;
+
+  mktime_offset_t off = *offset;
+  int negative_offset_guess;
+
+  int sec_requested = sec;
+
+  if (LEAP_SECONDS_POSSIBLE)
+    {
+      /* Handle out-of-range seconds specially,
+	 since ydhms_tm_diff assumes every minute has 60 seconds.  */
+      if (sec < 0)
+	sec = 0;
+      if (59 < sec)
+	sec = 59;
+    }
+
+  /* Invert CONVERT by probing.  First assume the same offset as last
+     time.  */
+
+  INT_SUBTRACT_WRAPV (0, off, &negative_offset_guess);
+  t0 = ydhms_diff (year, yday, hour, min, sec,
+		   EPOCH_YEAR - TM_YEAR_BASE, 0, 0, 0, negative_offset_guess);
+
+  /* Repeatedly use the error to improve the guess.  */
+
+  for (t = t1 = t2 = t0, dst2 = 0;
+       (gt = guess_time_tm (year, yday, hour, min, sec, t,
+			    ranged_convert (convert, &t, &tm)),
+	t != gt);
+       t1 = t2, t2 = t, t = gt, dst2 = tm.tm_isdst != 0)
+    if (t == t1 && t != t2
+	&& (tm.tm_isdst < 0
+	    || (isdst < 0
+		? dst2 <= (tm.tm_isdst != 0)
+		: (isdst != 0) != (tm.tm_isdst != 0))))
+      /* We can't possibly find a match, as we are oscillating
+	 between two values.  The requested time probably falls
+	 within a spring-forward gap of size GT - T.  Follow the common
+	 practice in this case, which is to return a time that is GT - T
+	 away from the requested time, preferring a time whose
+	 tm_isdst differs from the requested value.  (If no tm_isdst
+	 was requested and only one of the two values has a nonzero
+	 tm_isdst, prefer that value.)  In practice, this is more
+	 useful than returning -1.  */
+      goto offset_found;
+    else if (--remaining_probes == 0)
+      return -1;
+
+  /* We have a match.  Check whether tm.tm_isdst has the requested
+     value, if any.  */
+  if (isdst_differ (isdst, tm.tm_isdst))
+    {
+      /* tm.tm_isdst has the wrong value.  Look for a neighboring
+	 time with the right value, and use its UTC offset.
+
+	 Heuristic: probe the adjacent timestamps in both directions,
+	 looking for the desired isdst.  This should work for all real
+	 time zone histories in the tz database.  */
+
+      /* Distance between probes when looking for a DST boundary.  In
+	 tzdata2003a, the shortest period of DST is 601200 seconds
+	 (e.g., America/Recife starting 2000-10-08 01:00), and the
+	 shortest period of non-DST surrounded by DST is 694800
+	 seconds (Africa/Tunis starting 1943-04-17 01:00).  Use the
+	 minimum of these two values, so we don't miss these short
+	 periods when probing.  */
+      int stride = 601200;
+
+      /* The longest period of DST in tzdata2003a is 536454000 seconds
+	 (e.g., America/Jujuy starting 1946-10-01 01:00).  The longest
+	 period of non-DST is much longer, but it makes no real sense
+	 to search for more than a year of non-DST, so use the DST
+	 max.  */
+      int duration_max = 536454000;
+
+      /* Search in both directions, so the maximum distance is half
+	 the duration; add the stride to avoid off-by-1 problems.  */
+      int delta_bound = duration_max / 2 + stride;
+
+      int delta, direction;
+
+      for (delta = stride; delta < delta_bound; delta += stride)
+	for (direction = -1; direction <= 1; direction += 2)
+	  {
+	    long_int ot;
+	    if (! INT_ADD_WRAPV (t, delta * direction, &ot))
+	      {
+		struct tm otm;
+		ranged_convert (convert, &ot, &otm);
+		if (! isdst_differ (isdst, otm.tm_isdst))
+		  {
+		    /* We found the desired tm_isdst.
+		       Extrapolate back to the desired time.  */
+		    t = guess_time_tm (year, yday, hour, min, sec, ot, &otm);
+		    ranged_convert (convert, &t, &tm);
+		    goto offset_found;
+		  }
+	      }
+	  }
+    }
+
+ offset_found:
+  /* Set *OFFSET to the low-order bits of T - T0 - NEGATIVE_OFFSET_GUESS.
+     This is just a heuristic to speed up the next mktime call, and
+     correctness is unaffected if integer overflow occurs here.  */
+  INT_SUBTRACT_WRAPV (t, t0, &dt);
+  INT_SUBTRACT_WRAPV (dt, negative_offset_guess, offset);
+
+  if (LEAP_SECONDS_POSSIBLE && sec_requested != tm.tm_sec)
+    {
+      /* Adjust time to reflect the tm_sec requested, not the normalized value.
+	 Also, repair any damage from a false match due to a leap second.  */
+      long_int sec_adjustment = sec == 0 && tm.tm_sec == 60;
+      sec_adjustment -= sec;
+      sec_adjustment += sec_requested;
+      if (INT_ADD_WRAPV (t, sec_adjustment, &t)
+	  || ! (mktime_min <= t && t <= mktime_max)
+	  || ! convert_time (convert, t, &tm))
+	return -1;
+    }
+
+  *tp = tm;
+  return t;
+}
+
+#endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_INTERNAL */
+
+#if defined _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS
+
+/* Convert *TP to a time_t value.  */
+time_t
+mktime (struct tm *tp)
+{
+  /* POSIX.1 8.1.1 requires that whenever mktime() is called, the
+     time zone names contained in the external variable 'tzname' shall
+     be set as if the tzset() function had been called.  */
+  __tzset ();
+
+# if defined _LIBC || NEED_MKTIME_WORKING
+  static mktime_offset_t localtime_offset;
+  return __mktime_internal (tp, __localtime_r, &localtime_offset);
+# else
+#  undef mktime
+  return mktime (tp);
+# endif
+}
+#endif /* _LIBC || NEED_MKTIME_WORKING || NEED_MKTIME_WINDOWS */
+
+#ifdef weak_alias
+weak_alias (mktime, timelocal)
+#endif
+
+#ifdef _LIBC
+libc_hidden_def (mktime)
+libc_hidden_weak (timelocal)
+#endif
+
+#if DEBUG_MKTIME
+
+static int
+not_equal_tm (const struct tm *a, const struct tm *b)
+{
+  return ((a->tm_sec ^ b->tm_sec)
+	  | (a->tm_min ^ b->tm_min)
+	  | (a->tm_hour ^ b->tm_hour)
+	  | (a->tm_mday ^ b->tm_mday)
+	  | (a->tm_mon ^ b->tm_mon)
+	  | (a->tm_year ^ b->tm_year)
+	  | (a->tm_yday ^ b->tm_yday)
+	  | isdst_differ (a->tm_isdst, b->tm_isdst));
+}
+
+static void
+print_tm (const struct tm *tp)
+{
+  if (tp)
+    printf ("%04d-%02d-%02d %02d:%02d:%02d yday %03d wday %d isdst %d",
+	    tp->tm_year + TM_YEAR_BASE, tp->tm_mon + 1, tp->tm_mday,
+	    tp->tm_hour, tp->tm_min, tp->tm_sec,
+	    tp->tm_yday, tp->tm_wday, tp->tm_isdst);
+  else
+    printf ("0");
+}
+
+static int
+check_result (time_t tk, struct tm tmk, time_t tl, const struct tm *lt)
+{
+  if (tk != tl || !lt || not_equal_tm (&tmk, lt))
+    {
+      printf ("mktime (");
+      print_tm (lt);
+      printf (")\nyields (");
+      print_tm (&tmk);
+      printf (") == %ld, should be %ld\n", (long int) tk, (long int) tl);
+      return 1;
+    }
+
+  return 0;
+}
+
+int
+main (int argc, char **argv)
+{
+  int status = 0;
+  struct tm tm, tmk, tml;
+  struct tm *lt;
+  time_t tk, tl, tl1;
+  char trailer;
+
+  /* Sanity check, plus call tzset.  */
+  tl = 0;
+  if (! localtime (&tl))
+    {
+      printf ("localtime (0) fails\n");
+      status = 1;
+    }
+
+  if ((argc == 3 || argc == 4)
+      && (sscanf (argv[1], "%d-%d-%d%c",
+		  &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &trailer)
+	  == 3)
+      && (sscanf (argv[2], "%d:%d:%d%c",
+		  &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &trailer)
+	  == 3))
+    {
+      tm.tm_year -= TM_YEAR_BASE;
+      tm.tm_mon--;
+      tm.tm_isdst = argc == 3 ? -1 : atoi (argv[3]);
+      tmk = tm;
+      tl = mktime (&tmk);
+      lt = localtime_r (&tl, &tml);
+      printf ("mktime returns %ld == ", (long int) tl);
+      print_tm (&tmk);
+      printf ("\n");
+      status = check_result (tl, tmk, tl, lt);
+    }
+  else if (argc == 4 || (argc == 5 && strcmp (argv[4], "-") == 0))
+    {
+      time_t from = atol (argv[1]);
+      time_t by = atol (argv[2]);
+      time_t to = atol (argv[3]);
+
+      if (argc == 4)
+	for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
+	  {
+	    lt = localtime_r (&tl, &tml);
+	    if (lt)
+	      {
+		tmk = tml;
+		tk = mktime (&tmk);
+		status |= check_result (tk, tmk, tl, &tml);
+	      }
+	    else
+	      {
+		printf ("localtime_r (%ld) yields 0\n", (long int) tl);
+		status = 1;
+	      }
+	    tl1 = tl + by;
+	    if ((tl1 < tl) != (by < 0))
+	      break;
+	  }
+      else
+	for (tl = from; by < 0 ? to <= tl : tl <= to; tl = tl1)
+	  {
+	    /* Null benchmark.  */
+	    lt = localtime_r (&tl, &tml);
+	    if (lt)
+	      {
+		tmk = tml;
+		tk = tl;
+		status |= check_result (tk, tmk, tl, &tml);
+	      }
+	    else
+	      {
+		printf ("localtime_r (%ld) yields 0\n", (long int) tl);
+		status = 1;
+	      }
+	    tl1 = tl + by;
+	    if ((tl1 < tl) != (by < 0))
+	      break;
+	  }
+    }
+  else
+    printf ("Usage:\
+\t%s YYYY-MM-DD HH:MM:SS [ISDST] # Test given time.\n\
+\t%s FROM BY TO # Test values FROM, FROM+BY, ..., TO.\n\
+\t%s FROM BY TO - # Do not test those values (for benchmark).\n",
+	    argv[0], argv[0], argv[0]);
+
+  return status;
+}
+
+#endif /* DEBUG_MKTIME */
+
+/*
+Local Variables:
+compile-command: "gcc -DDEBUG_MKTIME -I. -Wall -W -O2 -g mktime.c -o mktime"
+End:
+*/
diff --git a/gawk-5.0.1/missing_d/setenv.c b/gawk-5.0.1/missing_d/setenv.c
new file mode 100644
index 00000000000..46885d5221c
--- /dev/null
+++ b/gawk-5.0.1/missing_d/setenv.c
@@ -0,0 +1,190 @@
+/*	$NetBSD: setenv.c,v 1.1.1.1 2009/04/12 15:33:26 christos Exp $	*/
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static const char sccsid[] = "@(#)setenv.c	8.1 (Berkeley) 6/4/93";
+static const char rcsid[] = "Id: setenv.c,v 1.2 2005/04/27 04:56:11 sra Exp";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * Copyright (c) 1987, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Per the statement at http://opensource.org/licenses/bsd-license.php,
+ *
+ *	The advertising clause in the license appearing on BSD Unix files was
+ *	officially rescinded by the Director of the Office of Technology
+ *	Licensing of the University of California on July 22 1999. He states
+ *	that clause 3 is "hereby deleted in its entirety."
+ *
+ * I removed the advertising clause in the above copyright.
+ * The above web site points to
+ * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change.
+ *
+ * Arnold Robbins
+ * 7 September 2016
+ */
+
+/* #include "port_before.h" */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+/* #include "port_after.h" */
+
+#define NEED_SETENV
+#if !defined(NEED_SETENV)
+int __bindcompat_setenv;
+#else
+
+/*
+ * Gawk changes:
+ * 1. Comment out "port_before.h" and "port_after.h" includes.
+ * 2. Define NEED_SETENV.
+ * 3. Add leading "int" to setenv() for C99 compilers. Which is worse,
+ *    that it wasn't there in the first place, or that C99 now makes
+ *    such functions void, breaking 40+ years of historical practice?
+ * 4. Change return type of unsetenv to "int" for standards
+ *    conformance and check for name containing an "=" in
+ *    which case it return an error. (See unsetenv(3), at least on Linux.)
+ */
+
+extern char **environ;
+
+static char *findenv(const char *name, int *offset);
+
+/*%
+ * setenv --
+ *	Set the value of the environmental variable "name" to be
+ *	"value".  If rewrite is set, replace any current value.
+ */
+int
+setenv(const char *name, const char *value, int rewrite)
+{
+	extern char **environ;
+	static int alloced;			/*%< if allocated space before */
+	char *c;
+	int l_value, offset;
+
+	if (*value == '=')			/*%< no `=' in value */
+		++value;
+	l_value = strlen(value);
+	if ((c = findenv(name, &offset))) {	/*%< find if already exists */
+		if (!rewrite)
+			return (0);
+		if (strlen(c) >= l_value) {	/*%< old larger; copy over */
+			while (*c++ = *value++);
+			return (0);
+		}
+	} else {					/*%< create new slot */
+		int cnt;
+		char **p;
+
+		for (p = environ, cnt = 0; *p; ++p, ++cnt);
+		if (alloced) {			/*%< just increase size */
+			environ = (char **)realloc((char *)environ,
+			    (size_t)(sizeof(char *) * (cnt + 2)));
+			if (!environ)
+				return (-1);
+		}
+		else {				/*%< get new space */
+			alloced = 1;		/*%< copy old entries into it */
+			p = malloc((size_t)(sizeof(char *) * (cnt + 2)));
+			if (!p)
+				return (-1);
+			memcpy(p, environ, cnt * sizeof(char *));
+			environ = p;
+		}
+		environ[cnt + 1] = NULL;
+		offset = cnt;
+	}
+	for (c = (char *)name; *c && *c != '='; ++c);	/*%< no `=' in name */
+	if (!(environ[offset] =			/*%< name + `=' + value */
+	    malloc((size_t)((int)(c - name) + l_value + 2))))
+		return (-1);
+	for (c = environ[offset]; (*c = *name++) && *c != '='; ++c);
+	for (*c++ = '='; *c++ = *value++;);
+	return (0);
+}
+
+/*%
+ * unsetenv(name) --
+ *	Delete environmental variable "name".
+ */
+int
+unsetenv(const char *name)
+{
+	char **p;
+	int offset;
+
+	if (strchr(name, '=') != NULL) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	while (findenv(name, &offset))	/*%< if set multiple times */
+		for (p = &environ[offset];; ++p)
+			if (!(*p = *(p + 1)))
+				break;
+
+	return 0;
+}
+
+/*%
+ * findenv --
+ *	Returns pointer to value associated with name, if any, else NULL.
+ *	Sets offset to be the offset of the name/value combination in the
+ *	environmental array, for use by setenv(3) and unsetenv(3).
+ *	Explicitly removes '=' in argument name.
+ *
+ *	This routine *should* be a static; don't use it.
+ */
+static char *
+findenv(const char *name, int *offset)
+{
+	const char *np;
+	char **p, *c;
+	int len;
+
+	if (name == NULL || environ == NULL)
+		return (NULL);
+	for (np = name; *np && *np != '='; ++np)
+		continue;
+	len = np - name;
+	for (p = environ; (c = *p) != NULL; ++p)
+		if (strncmp(c, name, len) == 0 && c[len] == '=') {
+			*offset = p - environ;
+			return (c + len + 1);
+		}
+	return (NULL);
+}
+#endif
+
+/*! \file */
diff --git a/gawk-5.0.1/missing_d/snprintf.c b/gawk-5.0.1/missing_d/snprintf.c
new file mode 100644
index 00000000000..c09c7473e82
--- /dev/null
+++ b/gawk-5.0.1/missing_d/snprintf.c
@@ -0,0 +1,186 @@
+/*
+ * snprintf.c - Implement snprintf and vsnprintf on platforms that need them.
+ */
+
+/*
+ * Copyright (C) 2006, 2007, 2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+
+/* If using in a multi-threaded context, then SNPRINTF_REENTRANT must be
+   defined.   But in that case, performance will be much worse, since a
+   temporary file is created and closed for each call to snprintf. */
+
+#if defined(HAVE_MKSTEMP)
+/* If mkstemp is available, use it instead of tmpfile(), since some older
+   implementations of tmpfile() were not secure. */
+
+static char *tmpfilename = NULL;
+static FILE *safe_f = NULL;
+
+#ifdef HAVE_ATEXIT
+static void close_safe_f()
+{
+	if (safe_f != NULL) {
+		fclose(safe_f);
+		safe_f = NULL;
+	}
+	if (tmpfilename != NULL) {
+		unlink(tmpfilename);
+		free(tmpfilename);
+		tmpfilename = NULL;
+	}
+}
+#endif
+
+static FILE *
+safe_tmpfile (void)
+{
+	static bool first = true;
+	static const char template[] = "snprintfXXXXXX";
+	int fd;
+	static char *tmpdir = NULL;
+	static int len = 0;
+
+	if (first) {
+		first = false;
+		/*
+		 * First try Unix stanadard env var, then Windows var,
+		 * then fall back to /tmp.
+		 */
+		if ((tmpdir = getenv("TMPDIR")) != NULL && *tmpdir != '\0')
+			;	/* got it */
+		else if ((tmpdir = getenv("TEMP")) != NULL && *tmpdir != '\0')
+			;	/* got it */
+		else
+			tmpdir = "/tmp";
+
+		len = strlen(tmpdir) + 1 + strlen(template) + 1;
+#ifdef HAVE_ATEXIT
+		atexit(close_safe_f);
+#endif /* HAVE_ATEXIT */
+	}
+
+	if ((tmpfilename = (char *) malloc(len)) == NULL)
+		return NULL;
+	else
+		sprintf(tmpfilename, "%s/%s", tmpdir, template);
+
+	if ((fd = mkstemp (tmpfilename)) < 0)
+		return NULL;
+
+#if ! defined(__DJGPP__) && ! defined(MSDOS) && ! defined(_MSC_VER) \
+	&& ! defined(_WIN32) && ! defined(__CRTRSXNT__) && ! defined(__EMX__) \
+	&& ! defined(__MINGW32__) && ! defined(__WIN32__)
+	/* If not MS or OS/2, unlink after opening. */
+	unlink (tmpfilename);
+	free(tmpfilename);
+	tmpfilename = NULL;
+#endif
+
+	if ((safe_f = fdopen (fd, "w+b")) == NULL) {
+		close (fd);
+		return NULL;
+	}
+	/* setvbuf(f,NULL,_IOFBF,4*BUFSIZ); */
+	return safe_f;
+}
+
+#elif defined(HAVE_TMPFILE)
+#define safe_tmpfile tmpfile
+#else
+#error Neither mkstemp() nor tmpfile() is available on this platform.
+#endif
+
+#if (__STDC_VERSION__ + 0) < 199901
+#undef restrict	/* force it! */
+#define restrict
+#endif
+
+int
+vsnprintf (char *restrict buf, size_t len,
+		const char *restrict fmt, va_list args)
+{
+	int actual;
+	int nread;
+	size_t cnt = 0;
+#ifndef SNPRINTF_REENTRANT
+	static
+#endif
+	FILE *fp;
+
+	if ((buf == NULL) || (len < 1))
+		return -1;
+
+	buf[0] = '\0';	/* in case the caller does not check the return code! */
+
+#ifdef SNPRINTF_REENTRANT
+	if ((fp = safe_tmpfile ()) == NULL)
+		return -1;
+#else
+	if ((fp == NULL) && ((fp = safe_tmpfile ()) == NULL))
+		return -1;
+	rewind (fp);
+#endif
+	actual = vfprintf (fp, fmt, args);
+	rewind (fp);
+	if (actual < 0) {
+#ifdef SNPRINTF_REENTRANT
+		fclose (fp);
+		if (tmpfilename != NULL) {
+			unlink(tmpfilename);
+			free(tmpfilename);
+			tmpfilename = NULL;
+		}
+#endif
+		return -1;
+	}
+	else if ((size_t) actual < len)
+		len = actual;
+	else
+		--len;
+	while (cnt < len && (nread = fread (buf + cnt, 1, len - cnt, fp)) > 0)
+		cnt += nread;
+	buf[cnt] = '\0';
+#ifdef SNPRINTF_REENTRANT
+	fclose (fp);
+	if (tmpfilename != NULL) {
+		unlink(tmpfilename);
+		free(tmpfilename);
+		tmpfilename = NULL;
+	}
+#endif
+	if (cnt < len)
+		return -1;
+
+	return actual;
+}
+
+int
+snprintf (char *restrict buf, size_t len, const char *restrict fmt, ...)
+{
+	int rv;
+	va_list args;
+
+	va_start (args, fmt);
+	rv = vsnprintf (buf, len, fmt, args);
+	va_end (args);
+	return rv;
+}
diff --git a/gawk-5.0.1/missing_d/strchr.c b/gawk-5.0.1/missing_d/strchr.c
new file mode 100644
index 00000000000..e549099d30d
--- /dev/null
+++ b/gawk-5.0.1/missing_d/strchr.c
@@ -0,0 +1,47 @@
+/*
+ * strchr --- search a string for a character
+ *
+ * We supply this routine for those systems that aren't standard yet.
+ */
+
+#if 0
+#include <stdio.h>
+#endif
+
+char *
+strchr(str, c)
+const char *str, c;
+{
+	if (c == '\0') {
+		/* thanks to Mike Brennan ... */
+		do {
+			if (*str == c)
+				return (char *) str;
+		} while (*str++);
+	} else {
+		for (; *str; str++)
+			if (*str == c)
+				return (char *) str;
+	}
+
+	return NULL;
+}
+
+/*
+ * strrchr --- find the last occurrence of a character in a string
+ *
+ * We supply this routine for those systems that aren't standard yet.
+ */
+
+char *
+strrchr(str, c)
+const char *str, c;
+{
+	const char *save = NULL;
+
+	for (; *str; str++)
+		if (*str == c)
+			save = str;
+
+	return (char *) save;
+}
diff --git a/gawk-5.0.1/missing_d/strcoll.c b/gawk-5.0.1/missing_d/strcoll.c
new file mode 100644
index 00000000000..ac65795e504
--- /dev/null
+++ b/gawk-5.0.1/missing_d/strcoll.c
@@ -0,0 +1,7 @@
+/* replacement strcoll.c */
+
+int
+strcoll(const char *s1, const char *s2)
+{
+	return strcmp(s1, s2);	/* nyah, nyah, so there */
+}
diff --git a/gawk-5.0.1/missing_d/strerror.c b/gawk-5.0.1/missing_d/strerror.c
new file mode 100644
index 00000000000..f3e8c28c916
--- /dev/null
+++ b/gawk-5.0.1/missing_d/strerror.c
@@ -0,0 +1,37 @@
+/* strerror.c --- ANSI C compatible system error routine
+
+   Copyright (C) 1986, 1988, 1989, 1991 the Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#if 0
+#include <stdio.h>
+#endif
+
+extern int sys_nerr;
+extern char *sys_errlist[];
+
+char *
+strerror(n)
+int n;
+{
+	static char mesg[30];
+
+	if (n < 0 || n >= sys_nerr) {
+		sprintf(mesg, "Unknown error (%d)", n);
+		return mesg;
+	} else
+		return sys_errlist[n];
+}
diff --git a/gawk-5.0.1/missing_d/strftime.c b/gawk-5.0.1/missing_d/strftime.c
new file mode 100644
index 00000000000..d4b9ecf4145
--- /dev/null
+++ b/gawk-5.0.1/missing_d/strftime.c
@@ -0,0 +1,1475 @@
+/* Copyright (C) 1991-1999, 2000, 2001, 2002, 2003
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301 USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define HAVE_LIMITS_H 1
+# define HAVE_MBLEN 1
+# define HAVE_MBRLEN 1
+# define HAVE_STRUCT_ERA_ENTRY 1
+# define HAVE_TM_GMTOFF 1
+# define HAVE_TM_ZONE 1
+# define HAVE_TZNAME 1
+# define HAVE_TZSET 1
+# define MULTIBYTE_IS_FORMAT_SAFE 1
+# define STDC_HEADERS 1
+# include "../locale/localeinfo.h"
+#endif
+
+#if defined emacs && !defined HAVE_BCOPY
+# define HAVE_MEMCPY 1
+#endif
+
+#include <ctype.h>
+#ifdef TIME_T_IN_SYS_TYPES
+#include <sys/types.h>		/* Some systems define `time_t' here.  */
+#endif
+
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+#if HAVE_TZNAME
+#ifndef __MINGW32__
+extern char *tzname[];
+#endif
+#endif
+
+/* Do multibyte processing if multibytes are supported, unless
+   multibyte sequences are safe in formats.  Multibyte sequences are
+   safe if they cannot contain byte sequences that look like format
+   conversion specifications.  The GNU C Library uses UTF8 multibyte
+   encoding, which is safe for formats, but strftime.c can be used
+   with other C libraries that use unsafe encodings.  */
+#define DO_MULTIBYTE (HAVE_MBLEN && ! MULTIBYTE_IS_FORMAT_SAFE)
+
+#if DO_MULTIBYTE
+# if HAVE_MBRLEN
+#  include <wchar.h>
+# else
+   /* Simulate mbrlen with mblen as best we can.  */
+#  define mbstate_t int
+#  define mbrlen(s, n, ps) mblen (s, n)
+#  define mbsinit(ps) (*(ps) == 0)
+# endif
+  static const mbstate_t mbstate_zero;
+#endif
+
+#if HAVE_LIMITS_H
+# include <limits.h>
+#endif
+
+#if STDC_HEADERS
+# include <stddef.h>
+# include <stdlib.h>
+# include <string.h>
+#else
+# ifndef HAVE_MEMCPY
+#  define memcpy(d, s, n) bcopy ((s), (d), (n))
+# endif
+#endif
+
+#ifdef COMPILE_WIDE
+# include <endian.h>
+# define CHAR_T wchar_t
+# define UCHAR_T unsigned int
+# define L_(Str) L##Str
+# define NLW(Sym) _NL_W##Sym
+
+# define MEMCPY(d, s, n) __wmemcpy (d, s, n)
+# define STRLEN(s) __wcslen (s)
+
+#else
+# define CHAR_T char
+# define UCHAR_T unsigned char
+# define L_(Str) Str
+# define NLW(Sym) Sym
+
+# if !defined STDC_HEADERS && !defined HAVE_MEMCPY
+#  define MEMCPY(d, s, n) bcopy ((s), (d), (n))
+# else
+#  define MEMCPY(d, s, n) memcpy ((d), (s), (n))
+# endif
+# define STRLEN(s) strlen (s)
+
+# ifdef _LIBC
+#  define MEMPCPY(d, s, n) __mempcpy (d, s, n)
+# else
+#  ifndef HAVE_MEMPCPY
+#   define MEMPCPY(d, s, n) ((void *) ((char *) memcpy (d, s, n) + (n)))
+#  endif
+# endif
+#endif
+
+#ifndef __P
+# if defined __GNUC__ || (defined __STDC__ && __STDC__)
+#  define __P(args) args
+# else
+#  define __P(args) ()
+# endif  /* GCC.  */
+#endif  /* Not __P.  */
+
+#ifndef PTR
+# ifdef __STDC__
+#  define PTR void *
+# else
+#  define PTR char *
+# endif
+#endif
+
+#ifndef CHAR_BIT
+# define CHAR_BIT 8
+#endif
+
+#ifndef NULL
+# define NULL 0
+#endif
+
+/* Test for checking whether a given type is signed or not.
+   Some compilers issue a diagnostic about suspicious construct for
+   a test that will always fail when comparing a value that can't be
+   negative against 0 using `<' or `<=' operator.  */
+/* #define TYPE_SIGNED(t) ((t) -1 < 0) */
+#define TYPE_SIGNED(t) ((t) -1 < 1)
+
+#ifndef INT_STRLEN_BOUND
+/* Bound on length of the string representing an integer value of type t.
+   Subtract one for the sign bit if t is signed;
+   302 / 1000 is log10 (2) rounded up;
+   add one for integer division truncation;
+   add one more for a minus sign if t is signed.  */
+#define INT_STRLEN_BOUND(t) \
+ ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 + 1 + TYPE_SIGNED (t))
+#endif
+
+#define TM_YEAR_BASE 1900
+
+#ifndef __isleap
+/* Nonzero if YEAR is a leap year (every 4 years,
+   except every 100th isn't, and every 400th is).  */
+# define __isleap(year)	\
+  ((year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0))
+#endif
+
+
+#ifdef _LIBC
+# define my_strftime_gmtime_r __gmtime_r
+# define my_strftime_localtime_r __localtime_r
+# define tzname __tzname
+# define tzset __tzset
+#else
+
+/* If we're a strftime substitute in a GNU program, then prefer gmtime
+   to gmtime_r, since many gmtime_r implementations are buggy.
+   Similarly for localtime_r.  */
+
+# if ! HAVE_TM_GMTOFF
+static struct tm *my_strftime_gmtime_r __P ((const time_t *, struct tm *));
+static struct tm *
+my_strftime_gmtime_r (t, tp)
+     const time_t *t;
+     struct tm *tp;
+{
+  struct tm *l = gmtime (t);
+  if (! l)
+    return 0;
+  *tp = *l;
+  return tp;
+}
+# endif /* ! HAVE_TM_GMTOFF */
+
+static struct tm *my_strftime_localtime_r __P ((const time_t *, struct tm *));
+static struct tm *
+my_strftime_localtime_r (t, tp)
+     const time_t *t;
+     struct tm *tp;
+{
+  struct tm *l = localtime (t);
+  if (! l)
+    return 0;
+  *tp = *l;
+  return tp;
+}
+#endif /* ! defined _LIBC */
+
+
+#if !defined memset && !defined HAVE_MEMSET && !defined _LIBC
+/* Some systems lack the `memset' function and we don't want to
+   introduce additional dependencies.  */
+/* The SGI compiler reportedly barfs on the trailing null
+   if we use a string constant as the initializer.  28 June 1997, rms.  */
+static const CHAR_T spaces[16] = /* "                " */
+{
+  L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),
+  L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' '),L_(' ')
+};
+static const CHAR_T zeroes[16] = /* "0000000000000000" */
+{
+  L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),
+  L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0'),L_('0')
+};
+
+# define memset_space(P, Len) \
+  do {									      \
+    int _len = (Len);							      \
+									      \
+    do									      \
+      {									      \
+	int _this = _len > 16 ? 16 : _len;				      \
+	(P) = MEMPCPY ((P), spaces, _this * sizeof (CHAR_T));		      \
+	_len -= _this;							      \
+      }									      \
+    while (_len > 0);							      \
+  } while (0)
+
+# define memset_zero(P, Len) \
+  do {									      \
+    int _len = (Len);							      \
+									      \
+    do									      \
+      {									      \
+	int _this = _len > 16 ? 16 : _len;				      \
+	(P) = MEMPCPY ((P), zeroes, _this * sizeof (CHAR_T));		      \
+	_len -= _this;							      \
+      }									      \
+    while (_len > 0);							      \
+  } while (0)
+#else
+# ifdef COMPILE_WIDE
+#  define memset_space(P, Len) (wmemset ((P), L' ', (Len)), (P) += (Len))
+#  define memset_zero(P, Len) (wmemset ((P), L'0', (Len)), (P) += (Len))
+# else
+#  define memset_space(P, Len) (memset ((P), ' ', (Len)), (P) += (Len))
+#  define memset_zero(P, Len) (memset ((P), '0', (Len)), (P) += (Len))
+# endif
+#endif
+
+#define add(n, f)							      \
+  do									      \
+    {									      \
+      int _n = (n);							      \
+      int _delta = width - _n;						      \
+      int _incr = _n + (_delta > 0 ? _delta : 0);			      \
+      if ((size_t) _incr >= maxsize - i)				      \
+	return 0;							      \
+      if (p)								      \
+	{								      \
+	  if (_delta > 0)						      \
+	    {								      \
+	      if (pad == L_('0'))					      \
+		memset_zero (p, _delta);				      \
+	      else							      \
+		memset_space (p, _delta);				      \
+	    }								      \
+	  f;								      \
+	  p += _n;							      \
+	}								      \
+      i += _incr;							      \
+    } while (0)
+
+#define cpy(n, s) \
+    add ((n),								      \
+	 if (to_lowcase)						      \
+	   memcpy_lowcase (p, (s), _n LOCALE_ARG);			      \
+	 else if (to_uppcase)						      \
+	   memcpy_uppcase (p, (s), _n LOCALE_ARG);			      \
+	 else								      \
+	   MEMCPY ((PTR) p, (const PTR) (s), _n))
+
+#ifdef COMPILE_WIDE
+# ifndef USE_IN_EXTENDED_LOCALE_MODEL
+#  undef __mbsrtowcs_l
+#  define __mbsrtowcs_l(d, s, l, st, loc) __mbsrtowcs (d, s, l, st)
+# endif
+# define widen(os, ws, l) \
+  {									      \
+    mbstate_t __st;							      \
+    const char *__s = os;						      \
+    memset (&__st, '\0', sizeof (__st));				      \
+    l = __mbsrtowcs_l (NULL, &__s, 0, &__st, loc);			      \
+    ws = alloca ((l + 1) * sizeof (wchar_t));				      \
+    (void) __mbsrtowcs_l (ws, &__s, l, &__st, loc);			      \
+  }
+#endif
+
+/* For gawk */
+#undef TOLOWER
+#undef TOUPPER
+#undef ISDIGIT
+
+#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
+/* We use this code also for the extended locale handling where the
+   function gets as an additional argument the locale which has to be
+   used.  To access the values we have to redefine the _NL_CURRENT
+   macro.  */
+# define strftime		__strftime_l
+# define wcsftime		__wcsftime_l
+# undef _NL_CURRENT
+# define _NL_CURRENT(category, item) \
+  (current->values[_NL_ITEM_INDEX (item)].string)
+# define LOCALE_PARAM , loc
+# define LOCALE_ARG , loc
+# define LOCALE_PARAM_DECL  __locale_t loc;
+# define LOCALE_PARAM_PROTO , __locale_t loc
+# define HELPER_LOCALE_ARG  , current
+#else
+# define LOCALE_PARAM
+# define LOCALE_PARAM_PROTO
+# define LOCALE_ARG
+# define LOCALE_PARAM_DECL
+# ifdef _LIBC
+#  define HELPER_LOCALE_ARG , _NL_CURRENT_DATA (LC_TIME)
+# else
+#  define HELPER_LOCALE_ARG
+# endif
+#endif
+
+#ifdef COMPILE_WIDE
+# ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#  define TOUPPER(Ch, L) __towupper_l (Ch, L)
+#  define TOLOWER(Ch, L) __towlower_l (Ch, L)
+# else
+#  define TOUPPER(Ch, L) towupper (Ch)
+#  define TOLOWER(Ch, L) towlower (Ch)
+# endif
+#else
+# ifdef _LIBC
+#  ifdef USE_IN_EXTENDED_LOCALE_MODEL
+#   define TOUPPER(Ch, L) __toupper_l (Ch, L)
+#   define TOLOWER(Ch, L) __tolower_l (Ch, L)
+#  else
+#   define TOUPPER(Ch, L) toupper (Ch)
+#   define TOLOWER(Ch, L) tolower (Ch)
+#  endif
+# else
+#  define TOUPPER(Ch, L) (islower (Ch) ? toupper (Ch) : (Ch))
+#  define TOLOWER(Ch, L) (isupper (Ch) ? tolower (Ch) : (Ch))
+# endif
+#endif
+/* We don't use `isdigit' here since the locale dependent
+   interpretation is not what we want here.  We only need to accept
+   the arabic digits in the ASCII range.  One day there is perhaps a
+   more reliable way to accept other sets of digits.  */
+#define ISDIGIT(Ch) ((unsigned int) (Ch) - L_('0') <= 9)
+
+static CHAR_T *memcpy_lowcase __P ((CHAR_T *dest, const CHAR_T *src,
+				    size_t len LOCALE_PARAM_PROTO));
+
+static CHAR_T *
+memcpy_lowcase (dest, src, len LOCALE_PARAM)
+     CHAR_T *dest;
+     const CHAR_T *src;
+     size_t len;
+     LOCALE_PARAM_DECL
+{
+  while (len-- > 0)
+    dest[len] = TOLOWER ((UCHAR_T) src[len], loc);
+  return dest;
+}
+
+static CHAR_T *memcpy_uppcase __P ((CHAR_T *dest, const CHAR_T *src,
+				    size_t len LOCALE_PARAM_PROTO));
+
+static CHAR_T *
+memcpy_uppcase (dest, src, len LOCALE_PARAM)
+     CHAR_T *dest;
+     const CHAR_T *src;
+     size_t len;
+     LOCALE_PARAM_DECL
+{
+  while (len-- > 0)
+    dest[len] = TOUPPER ((UCHAR_T) src[len], loc);
+  return dest;
+}
+
+
+#if ! HAVE_TM_GMTOFF
+/* Yield the difference between *A and *B,
+   measured in seconds, ignoring leap seconds.  */
+# define tm_diff ftime_tm_diff
+static int tm_diff __P ((const struct tm *, const struct tm *));
+static int
+tm_diff (a, b)
+     const struct tm *a;
+     const struct tm *b;
+{
+  /* Compute intervening leap days correctly even if year is negative.
+     Take care to avoid int overflow in leap day calculations,
+     but it's OK to assume that A and B are close to each other.  */
+  int a4 = (a->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (a->tm_year & 3);
+  int b4 = (b->tm_year >> 2) + (TM_YEAR_BASE >> 2) - ! (b->tm_year & 3);
+  int a100 = a4 / 25 - (a4 % 25 < 0);
+  int b100 = b4 / 25 - (b4 % 25 < 0);
+  int a400 = a100 >> 2;
+  int b400 = b100 >> 2;
+  int intervening_leap_days = (a4 - b4) - (a100 - b100) + (a400 - b400);
+  int years = a->tm_year - b->tm_year;
+  int days = (365 * years + intervening_leap_days
+	      + (a->tm_yday - b->tm_yday));
+  return (60 * (60 * (24 * days + (a->tm_hour - b->tm_hour))
+		+ (a->tm_min - b->tm_min))
+	  + (a->tm_sec - b->tm_sec));
+}
+#endif /* ! HAVE_TM_GMTOFF */
+
+
+
+/* The number of days from the first day of the first ISO week of this
+   year to the year day YDAY with week day WDAY.  ISO weeks start on
+   Monday; the first ISO week has the year's first Thursday.  YDAY may
+   be as small as YDAY_MINIMUM.  */
+#define ISO_WEEK_START_WDAY 1 /* Monday */
+#define ISO_WEEK1_WDAY 4 /* Thursday */
+#define YDAY_MINIMUM (-366)
+static int iso_week_days __P ((int, int));
+#ifdef __GNUC__
+__inline__
+#endif
+static int
+iso_week_days (yday, wday)
+     int yday;
+     int wday;
+{
+  /* Add enough to the first operand of % to make it nonnegative.  */
+  int big_enough_multiple_of_7 = (-YDAY_MINIMUM / 7 + 2) * 7;
+  return (yday
+	  - (yday - wday + ISO_WEEK1_WDAY + big_enough_multiple_of_7) % 7
+	  + ISO_WEEK1_WDAY - ISO_WEEK_START_WDAY);
+}
+
+
+#if !(defined _NL_CURRENT || HAVE_STRFTIME)
+static CHAR_T const weekday_name[][10] =
+  {
+    L_("Sunday"), L_("Monday"), L_("Tuesday"), L_("Wednesday"),
+    L_("Thursday"), L_("Friday"), L_("Saturday")
+  };
+static CHAR_T const month_name[][10] =
+  {
+    L_("January"), L_("February"), L_("March"), L_("April"), L_("May"),
+    L_("June"), L_("July"), L_("August"), L_("September"), L_("October"),
+    L_("November"), L_("December")
+  };
+#endif
+
+
+#ifdef emacs
+# define my_strftime emacs_strftimeu
+# define ut_argument , ut
+# define ut_argument_spec int ut;
+# define ut_argument_spec_iso , int ut
+#else
+# ifdef COMPILE_WIDE
+#  define my_strftime wcsftime
+#  define nl_get_alt_digit _nl_get_walt_digit
+# else
+#  define my_strftime strftime
+#  define nl_get_alt_digit _nl_get_alt_digit
+# endif
+# define ut_argument
+# define ut_argument_spec
+# define ut_argument_spec_iso
+/* We don't have this information in general.  */
+# define ut 0
+#endif
+
+#if !defined _LIBC && HAVE_TZNAME && HAVE_TZSET
+  /* Solaris 2.5 tzset sometimes modifies the storage returned by localtime.
+     Work around this bug by copying *tp before it might be munged.  */
+  size_t _strftime_copytm __P ((char *, size_t, const char *,
+			        const struct tm * ut_argument_spec_iso));
+  size_t
+  my_strftime (s, maxsize, format, tp ut_argument)
+      CHAR_T *s;
+      size_t maxsize;
+      const CHAR_T *format;
+      const struct tm *tp;
+      ut_argument_spec
+  {
+    struct tm tmcopy;
+    tmcopy = *tp;
+    return _strftime_copytm (s, maxsize, format, &tmcopy ut_argument);
+  }
+# undef my_strftime
+# define my_strftime _strftime_copytm
+#endif
+
+
+/* Write information from TP into S according to the format
+   string FORMAT, writing no more that MAXSIZE characters
+   (including the terminating '\0') and returning number of
+   characters written.  If S is NULL, nothing will be written
+   anywhere, so to determine how many characters would be
+   written, use NULL for S and (size_t) UINT_MAX for MAXSIZE.  */
+size_t
+my_strftime (s, maxsize, format, tp ut_argument LOCALE_PARAM)
+      CHAR_T *s;
+      size_t maxsize;
+      const CHAR_T *format;
+      const struct tm *tp;
+      ut_argument_spec
+      LOCALE_PARAM_DECL
+{
+#if defined _LIBC && defined USE_IN_EXTENDED_LOCALE_MODEL
+  struct locale_data *const current = loc->__locales[LC_TIME];
+#endif
+
+  int hour12 = tp->tm_hour;
+#ifdef _NL_CURRENT
+  /* We cannot make the following values variables since we must delay
+     the evaluation of these values until really needed since some
+     expressions might not be valid in every situation.  The `struct tm'
+     might be generated by a strptime() call that initialized
+     only a few elements.  Dereference the pointers only if the format
+     requires this.  Then it is ok to fail if the pointers are invalid.  */
+# define a_wkday \
+  ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))
+# define f_wkday \
+  ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))
+# define a_month \
+  ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))
+# define f_month \
+  ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))
+# define ampm \
+  ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11		      \
+				 ? NLW(PM_STR) : NLW(AM_STR)))
+
+# define aw_len STRLEN (a_wkday)
+# define am_len STRLEN (a_month)
+# define ap_len STRLEN (ampm)
+#else
+# if !HAVE_STRFTIME
+#  define f_wkday (weekday_name[tp->tm_wday])
+#  define f_month (month_name[tp->tm_mon])
+#  define a_wkday f_wkday
+#  define a_month f_month
+#  define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11))
+
+  size_t aw_len = 3;
+  size_t am_len = 3;
+  size_t ap_len = 2;
+# endif
+#endif
+  const char *zone;
+  size_t i = 0;
+  CHAR_T *p = s;
+  const CHAR_T *f;
+#if DO_MULTIBYTE && !defined COMPILE_WIDE
+  const char *format_end = NULL;
+#endif
+
+  zone = NULL;
+#if HAVE_TM_ZONE
+  /* The POSIX test suite assumes that setting
+     the environment variable TZ to a new value before calling strftime()
+     will influence the result (the %Z format) even if the information in
+     TP is computed with a totally different time zone.
+     This is bogus: though POSIX allows bad behavior like this,
+     POSIX does not require it.  Do the right thing instead.  */
+  zone = (const char *) tp->tm_zone;
+#endif
+#if HAVE_TZNAME
+  if (ut)
+    {
+      if (! (zone && *zone))
+	zone = "GMT";
+    }
+  else
+    {
+      /* POSIX.1 requires that local time zone information is used as
+	 though strftime called tzset.  */
+# if HAVE_TZSET
+      tzset ();
+# endif
+    }
+#endif
+
+  if (hour12 > 12)
+    hour12 -= 12;
+  else
+    if (hour12 == 0)
+      hour12 = 12;
+
+  for (f = format; *f != '\0'; ++f)
+    {
+      int pad = 0;		/* Padding for number ('-', '_', or 0).  */
+      int modifier;		/* Field modifier ('E', 'O', or 0).  */
+      int digits;		/* Max digits for numeric format.  */
+      int number_value; 	/* Numeric value to be printed.  */
+      int negative_number;	/* 1 if the number is negative.  */
+      const CHAR_T *subfmt;
+      CHAR_T *bufp;
+      CHAR_T buf[1 + (sizeof (int) < sizeof (time_t)
+		      ? INT_STRLEN_BOUND (time_t)
+		      : INT_STRLEN_BOUND (int))];
+      int width = -1;
+      int to_lowcase = 0;
+      int to_uppcase = 0;
+      int change_case = 0;
+      int format_char;
+
+#if DO_MULTIBYTE && !defined COMPILE_WIDE
+      switch (*f)
+	{
+	case L_('%'):
+	  break;
+
+	case L_('\b'): case L_('\t'): case L_('\n'):
+	case L_('\v'): case L_('\f'): case L_('\r'):
+	case L_(' '): case L_('!'): case L_('"'): case L_('#'): case L_('&'):
+	case L_('\''): case L_('('): case L_(')'): case L_('*'): case L_('+'):
+	case L_(','): case L_('-'): case L_('.'): case L_('/'): case L_('0'):
+	case L_('1'): case L_('2'): case L_('3'): case L_('4'): case L_('5'):
+	case L_('6'): case L_('7'): case L_('8'): case L_('9'): case L_(':'):
+	case L_(';'): case L_('<'): case L_('='): case L_('>'): case L_('?'):
+	case L_('A'): case L_('B'): case L_('C'): case L_('D'): case L_('E'):
+	case L_('F'): case L_('G'): case L_('H'): case L_('I'): case L_('J'):
+	case L_('K'): case L_('L'): case L_('M'): case L_('N'): case L_('O'):
+	case L_('P'): case L_('Q'): case L_('R'): case L_('S'): case L_('T'):
+	case L_('U'): case L_('V'): case L_('W'): case L_('X'): case L_('Y'):
+	case L_('Z'): case L_('['): case L_('\\'): case L_(']'): case L_('^'):
+	case L_('_'): case L_('a'): case L_('b'): case L_('c'): case L_('d'):
+	case L_('e'): case L_('f'): case L_('g'): case L_('h'): case L_('i'):
+	case L_('j'): case L_('k'): case L_('l'): case L_('m'): case L_('n'):
+	case L_('o'): case L_('p'): case L_('q'): case L_('r'): case L_('s'):
+	case L_('t'): case L_('u'): case L_('v'): case L_('w'): case L_('x'):
+	case L_('y'): case L_('z'): case L_('{'): case L_('|'): case L_('}'):
+	case L_('~'):
+	  /* The C Standard requires these 98 characters (plus '%') to
+	     be in the basic execution character set.  None of these
+	     characters can start a multibyte sequence, so they need
+	     not be analyzed further.  */
+	  add (1, *p = *f);
+	  continue;
+
+	default:
+	  /* Copy this multibyte sequence until we reach its end, find
+	     an error, or come back to the initial shift state.  */
+	  {
+	    mbstate_t mbstate = mbstate_zero;
+	    size_t len = 0;
+	    size_t fsize;
+
+	    if (! format_end)
+	      format_end = f + strlen (f) + 1;
+	    fsize = format_end - f;
+
+	    do
+	      {
+		size_t bytes = mbrlen (f + len, fsize - len, &mbstate);
+
+		if (bytes == 0)
+		  break;
+
+		if (bytes == (size_t) -2)
+		  {
+		    len += strlen (f + len);
+		    break;
+		  }
+
+		if (bytes == (size_t) -1)
+		  {
+		    len++;
+		    break;
+		  }
+
+		len += bytes;
+	      }
+	    while (! mbsinit (&mbstate));
+
+	    cpy (len, f);
+	    f += len - 1;
+	    continue;
+	  }
+	}
+
+#else /* ! DO_MULTIBYTE */
+
+      /* Either multibyte encodings are not supported, they are
+	 safe for formats, so any non-'%' byte can be copied through,
+	 or this is the wide character version.  */
+      if (*f != L_('%'))
+	{
+	  add (1, *p = *f);
+	  continue;
+	}
+
+#endif /* ! DO_MULTIBYTE */
+
+      /* Check for flags that can modify a format.  */
+      while (1)
+	{
+	  switch (*++f)
+	    {
+	      /* This influences the number formats.  */
+	    case L_('_'):
+	    case L_('-'):
+	    case L_('0'):
+	      pad = *f;
+	      continue;
+
+	      /* This changes textual output.  */
+	    case L_('^'):
+	      to_uppcase = 1;
+	      continue;
+	    case L_('#'):
+	      change_case = 1;
+	      continue;
+
+	    default:
+	      break;
+	    }
+	  break;
+	}
+
+      /* As a GNU extension we allow to specify the field width.  */
+      if (ISDIGIT (*f))
+	{
+	  width = 0;
+	  do
+	    {
+	      if (width > INT_MAX / 10
+		  || (width == INT_MAX / 10 && *f - L_('0') > INT_MAX % 10))
+		/* Avoid overflow.  */
+		width = INT_MAX;
+	      else
+		{
+		  width *= 10;
+		  width += *f - L_('0');
+		}
+	      ++f;
+	    }
+	  while (ISDIGIT (*f));
+	}
+
+      /* Check for modifiers.  */
+      switch (*f)
+	{
+	case L_('E'):
+	case L_('O'):
+	  modifier = *f++;
+	  break;
+
+	default:
+	  modifier = 0;
+	  break;
+	}
+
+      /* Now do the specified format.  */
+      format_char = *f;
+      switch (format_char)
+	{
+#define DO_NUMBER(d, v) \
+	  digits = d > width ? d : width;				      \
+	  number_value = v; goto do_number
+#define DO_NUMBER_SPACEPAD(d, v) \
+	  digits = d > width ? d : width;				      \
+	  number_value = v; goto do_number_spacepad
+
+	case L_('%'):
+	  if (modifier != 0)
+	    goto bad_format;
+	  add (1, *p = *f);
+	  break;
+
+	case L_('a'):
+	  if (modifier != 0)
+	    goto bad_format;
+	  if (change_case)
+	    {
+	      to_uppcase = 1;
+	      to_lowcase = 0;
+	    }
+#if defined _NL_CURRENT || !HAVE_STRFTIME
+	  cpy (aw_len, a_wkday);
+	  break;
+#else
+	  goto underlying_strftime;
+#endif
+
+	case 'A':
+	  if (modifier != 0)
+	    goto bad_format;
+	  if (change_case)
+	    {
+	      to_uppcase = 1;
+	      to_lowcase = 0;
+	    }
+#if defined _NL_CURRENT || !HAVE_STRFTIME
+	  cpy (STRLEN (f_wkday), f_wkday);
+	  break;
+#else
+	  goto underlying_strftime;
+#endif
+
+	case L_('b'):
+	case L_('h'):
+	  if (change_case)
+	    {
+	      to_uppcase = 1;
+	      to_lowcase = 0;
+	    }
+	  if (modifier != 0)
+	    goto bad_format;
+#if defined _NL_CURRENT || !HAVE_STRFTIME
+	  cpy (am_len, a_month);
+	  break;
+#else
+	  goto underlying_strftime;
+#endif
+
+	case L_('B'):
+	  if (modifier != 0)
+	    goto bad_format;
+	  if (change_case)
+	    {
+	      to_uppcase = 1;
+	      to_lowcase = 0;
+	    }
+#if defined _NL_CURRENT || !HAVE_STRFTIME
+	  cpy (STRLEN (f_month), f_month);
+	  break;
+#else
+	  goto underlying_strftime;
+#endif
+
+	case L_('c'):
+	  if (modifier == L_('O'))
+	    goto bad_format;
+#ifdef _NL_CURRENT
+	  if (! (modifier == 'E'
+		 && (*(subfmt =
+		       (const CHAR_T *) _NL_CURRENT (LC_TIME,
+						     NLW(ERA_D_T_FMT)))
+		     != '\0')))
+	    subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_T_FMT));
+#else
+# if HAVE_STRFTIME
+	  goto underlying_strftime;
+# else
+	  subfmt = L_("%a %b %e %H:%M:%S %Y");
+# endif
+#endif
+
+	subformat:
+	  {
+	    CHAR_T *old_start = p;
+	    size_t len = my_strftime (NULL, (size_t) -1, subfmt,
+				      tp ut_argument LOCALE_ARG);
+	    add (len, my_strftime (p, maxsize - i, subfmt,
+				   tp ut_argument LOCALE_ARG));
+
+	    if (to_uppcase)
+	      while (old_start < p)
+		{
+		  *old_start = TOUPPER ((UCHAR_T) *old_start, loc);
+		  ++old_start;
+		}
+	  }
+	  break;
+
+#if HAVE_STRFTIME && ! (defined _NL_CURRENT && HAVE_STRUCT_ERA_ENTRY)
+	underlying_strftime:
+	  {
+	    /* The relevant information is available only via the
+	       underlying strftime implementation, so use that.  */
+	    char ufmt[4];
+	    char *u = ufmt;
+	    char ubuf[1024]; /* enough for any single format in practice */
+	    size_t len;
+	    /* Make sure we're calling the actual underlying strftime.
+	       In some cases, config.h contains something like
+	       "#define strftime rpl_strftime".  */
+# ifdef strftime
+#  undef strftime
+	    size_t strftime ();
+# endif
+
+	    *u++ = '%';
+	    if (modifier != 0)
+	      *u++ = modifier;
+	    *u++ = format_char;
+	    *u = '\0';
+	    len = strftime (ubuf, sizeof ubuf, ufmt, tp);
+	    if (len == 0 && ubuf[0] != '\0')
+	      return 0;
+	    cpy (len, ubuf);
+	  }
+	  break;
+#endif
+
+	case L_('C'):
+	  if (modifier == L_('O'))
+	    goto bad_format;
+	  if (modifier == L_('E'))
+	    {
+#if HAVE_STRUCT_ERA_ENTRY
+	      struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
+	      if (era)
+		{
+# ifdef COMPILE_WIDE
+		  size_t len = __wcslen (era->era_wname);
+		  cpy (len, era->era_wname);
+# else
+		  size_t len = strlen (era->era_name);
+		  cpy (len, era->era_name);
+# endif
+		  break;
+		}
+#else
+# if HAVE_STRFTIME
+	      goto underlying_strftime;
+# endif
+#endif
+	    }
+
+	  {
+	    int year = tp->tm_year + TM_YEAR_BASE;
+	    DO_NUMBER (1, year / 100 - (year % 100 < 0));
+	  }
+
+	case L_('x'):
+	  if (modifier == L_('O'))
+	    goto bad_format;
+#ifdef _NL_CURRENT
+	  if (! (modifier == L_('E')
+		 && (*(subfmt =
+		       (const CHAR_T *)_NL_CURRENT (LC_TIME, NLW(ERA_D_FMT)))
+		     != L_('\0'))))
+	    subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(D_FMT));
+	  goto subformat;
+#else
+# if HAVE_STRFTIME
+	  goto underlying_strftime;
+# else
+	  /* Fall through.  */
+# endif
+#endif
+	case L_('D'):
+	  if (modifier != 0)
+	    goto bad_format;
+	  subfmt = L_("%m/%d/%y");
+	  goto subformat;
+
+	case L_('d'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (2, tp->tm_mday);
+
+	case L_('e'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER_SPACEPAD (2, tp->tm_mday);
+
+	  /* All numeric formats set DIGITS and NUMBER_VALUE and then
+	     jump to one of these two labels.  */
+
+	do_number_spacepad:
+	  /* Force `_' flag unless overwritten by `0' flag.  */
+	  if (pad != L_('0'))
+	    pad = L_('_');
+
+	do_number:
+	  /* Format the number according to the MODIFIER flag.  */
+
+	  if (modifier == L_('O') && 0 <= number_value)
+	    {
+#ifdef _NL_CURRENT
+	      /* Get the locale specific alternate representation of
+		 the number NUMBER_VALUE.  If none exist NULL is returned.  */
+	      const CHAR_T *cp = nl_get_alt_digit (number_value
+						   HELPER_LOCALE_ARG);
+
+	      if (cp != NULL)
+		{
+		  size_t digitlen = STRLEN (cp);
+		  if (digitlen != 0)
+		    {
+		      cpy (digitlen, cp);
+		      break;
+		    }
+		}
+#else
+# if HAVE_STRFTIME
+	      goto underlying_strftime;
+# endif
+#endif
+	    }
+	  {
+	    unsigned int u = number_value;
+
+	    bufp = buf + sizeof (buf) / sizeof (buf[0]);
+	    negative_number = number_value < 0;
+
+	    if (negative_number)
+	      u = -u;
+
+	    do
+	      *--bufp = u % 10 + L_('0');
+	    while ((u /= 10) != 0);
+  	  }
+
+	do_number_sign_and_padding:
+	  if (negative_number)
+	    *--bufp = L_('-');
+
+	  if (pad != L_('-'))
+	    {
+	      int padding = digits - (buf + (sizeof (buf) / sizeof (buf[0]))
+				      - bufp);
+
+	      if (padding > 0)
+		{
+		  if (pad == L_('_'))
+		    {
+		      if ((size_t) padding >= maxsize - i)
+			return 0;
+
+		      if (p)
+			memset_space (p, padding);
+		      i += padding;
+		      width = width > padding ? width - padding : 0;
+		    }
+		  else
+		    {
+		      if ((size_t) digits >= maxsize - i)
+			return 0;
+
+		      if (negative_number)
+			{
+			  ++bufp;
+
+			  if (p)
+			    *p++ = L_('-');
+			  ++i;
+			}
+
+		      if (p)
+			memset_zero (p, padding);
+		      i += padding;
+		      width = 0;
+		    }
+		}
+	    }
+
+	  cpy (buf + sizeof (buf) / sizeof (buf[0]) - bufp, bufp);
+	  break;
+
+	case L_('F'):
+	  if (modifier != 0)
+	    goto bad_format;
+	  subfmt = L_("%Y-%m-%d");
+	  goto subformat;
+
+	case L_('H'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (2, tp->tm_hour);
+
+	case L_('I'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (2, hour12);
+
+	case L_('k'):		/* GNU extension.  */
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER_SPACEPAD (2, tp->tm_hour);
+
+	case L_('l'):		/* GNU extension.  */
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER_SPACEPAD (2, hour12);
+
+	case L_('j'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (3, 1 + tp->tm_yday);
+
+	case L_('M'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (2, tp->tm_min);
+
+	case L_('m'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (2, tp->tm_mon + 1);
+
+	case L_('n'):
+	  add (1, *p = L_('\n'));
+	  break;
+
+	case L_('P'):
+	  to_lowcase = 1;
+#if !defined _NL_CURRENT && HAVE_STRFTIME
+	  format_char = L_('p');
+#endif
+	  /* FALLTHROUGH */
+
+	case L_('p'):
+	  if (change_case)
+	    {
+	      to_uppcase = 0;
+	      to_lowcase = 1;
+	    }
+#if defined _NL_CURRENT || !HAVE_STRFTIME
+	  cpy (ap_len, ampm);
+	  break;
+#else
+	  goto underlying_strftime;
+#endif
+
+	case L_('R'):
+	  subfmt = L_("%H:%M");
+	  goto subformat;
+
+	case L_('r'):
+#ifdef _NL_CURRENT
+	  if (*(subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME,
+						       NLW(T_FMT_AMPM)))
+	      == L_('\0'))
+#endif
+	    subfmt = L_("%I:%M:%S %p");
+	  goto subformat;
+
+	case L_('S'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (2, tp->tm_sec);
+
+	case L_('s'):		/* GNU extension.  */
+  	  {
+	    struct tm ltm;
+	    time_t t;
+
+	    ltm = *tp;
+	    t = mktime (&ltm);
+
+	    /* Generate string value for T using time_t arithmetic;
+	       this works even if sizeof (long) < sizeof (time_t).  */
+
+	    bufp = buf + sizeof (buf) / sizeof (buf[0]);
+#ifndef TIME_T_UNSIGNED
+	    negative_number = t < 0;
+#endif
+
+	    do
+	      {
+		int d = t % 10;
+		t /= 10;
+
+#ifndef TIME_T_UNSIGNED
+		if (negative_number)
+		  {
+		    d = -d;
+
+		    /* Adjust if division truncates to minus infinity.  */
+		    if (0 < -1 % 10 && d < 0)
+		      {
+			t++;
+			d += 10;
+		      }
+		  }
+#endif
+
+		*--bufp = d + L_('0');
+	      }
+	    while (t != 0);
+
+	    digits = 1;
+	    goto do_number_sign_and_padding;
+	  }
+
+	case L_('X'):
+	  if (modifier == L_('O'))
+	    goto bad_format;
+#ifdef _NL_CURRENT
+	  if (! (modifier == L_('E')
+		 && (*(subfmt =
+		       (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ERA_T_FMT)))
+		     != L_('\0'))))
+	    subfmt = (const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(T_FMT));
+	  goto subformat;
+#else
+# if HAVE_STRFTIME
+	  goto underlying_strftime;
+# else
+	  /* Fall through.  */
+# endif
+#endif
+	case L_('T'):
+	  subfmt = L_("%H:%M:%S");
+	  goto subformat;
+
+	case L_('t'):
+	  add (1, *p = L_('\t'));
+	  break;
+
+	case L_('u'):
+	  DO_NUMBER (1, (tp->tm_wday - 1 + 7) % 7 + 1);
+
+	case L_('U'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (2, (tp->tm_yday - tp->tm_wday + 7) / 7);
+
+	case L_('V'):
+	case L_('g'):
+	case L_('G'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+	  {
+	    int year = tp->tm_year + TM_YEAR_BASE;
+	    int days = iso_week_days (tp->tm_yday, tp->tm_wday);
+
+	    if (days < 0)
+	      {
+		/* This ISO week belongs to the previous year.  */
+		year--;
+		days = iso_week_days (tp->tm_yday + (365 + __isleap (year)),
+				      tp->tm_wday);
+	      }
+	    else
+	      {
+		int d = iso_week_days (tp->tm_yday - (365 + __isleap (year)),
+				       tp->tm_wday);
+		if (0 <= d)
+		  {
+		    /* This ISO week belongs to the next year.  */
+		    year++;
+		    days = d;
+		  }
+	      }
+
+	    switch (*f)
+	      {
+	      case L_('g'):
+		DO_NUMBER (2, (year % 100 + 100) % 100);
+
+	      case L_('G'):
+		DO_NUMBER (1, year);
+
+	      default:
+		DO_NUMBER (2, days / 7 + 1);
+	      }
+	  }
+
+	case L_('W'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (2, (tp->tm_yday - (tp->tm_wday - 1 + 7) % 7 + 7) / 7);
+
+	case L_('w'):
+	  if (modifier == L_('E'))
+	    goto bad_format;
+
+	  DO_NUMBER (1, tp->tm_wday);
+
+	case L_('Y'):
+	  if (modifier == 'E')
+	    {
+#if HAVE_STRUCT_ERA_ENTRY
+	      struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
+	      if (era)
+		{
+# ifdef COMPILE_WIDE
+		  subfmt = era->era_wformat;
+# else
+		  subfmt = era->era_format;
+# endif
+		  goto subformat;
+		}
+#else
+# if HAVE_STRFTIME
+	      goto underlying_strftime;
+# endif
+#endif
+	    }
+	  if (modifier == L_('O'))
+	    goto bad_format;
+	  else
+	    DO_NUMBER (1, tp->tm_year + TM_YEAR_BASE);
+
+	case L_('y'):
+	  if (modifier == L_('E'))
+	    {
+#if HAVE_STRUCT_ERA_ENTRY
+	      struct era_entry *era = _nl_get_era_entry (tp HELPER_LOCALE_ARG);
+	      if (era)
+		{
+		  int delta = tp->tm_year - era->start_date[0];
+		  DO_NUMBER (1, (era->offset
+				 + delta * era->absolute_direction));
+		}
+#else
+# if HAVE_STRFTIME
+	      goto underlying_strftime;
+# endif
+#endif
+	    }
+	  DO_NUMBER (2, (tp->tm_year % 100 + 100) % 100);
+
+	case L_('Z'):
+	  if (change_case)
+	    {
+	      to_uppcase = 0;
+	      to_lowcase = 1;
+	    }
+
+#if HAVE_TZNAME
+	  /* The tzset() call might have changed the value.  */
+	  if (!(zone && *zone) && tp->tm_isdst >= 0)
+	    zone = tzname[tp->tm_isdst];
+#endif
+	  if (! zone)
+	    zone = "";
+
+#ifdef COMPILE_WIDE
+	  {
+	    /* The zone string is always given in multibyte form.  We have
+	       to transform it first.  */
+	    wchar_t *wczone;
+	    size_t len;
+	    widen (zone, wczone, len);
+	    cpy (len, wczone);
+	  }
+#else
+	  cpy (strlen (zone), zone);
+#endif
+	  break;
+
+	case L_('z'):
+	  if (tp->tm_isdst < 0)
+	    break;
+
+	  {
+	    int diff;
+#if HAVE_TM_GMTOFF
+	    diff = tp->tm_gmtoff;
+#else
+	    if (ut)
+	      diff = 0;
+	    else
+	      {
+		struct tm gtm;
+		struct tm ltm;
+		time_t lt;
+
+		ltm = *tp;
+		lt = mktime (&ltm);
+
+		if (lt == (time_t) -1)
+		  {
+		    /* mktime returns -1 for errors, but -1 is also a
+		       valid time_t value.  Check whether an error really
+		       occurred.  */
+		    struct tm tm;
+
+		    if (! my_strftime_localtime_r (&lt, &tm)
+			|| ((ltm.tm_sec ^ tm.tm_sec)
+			    | (ltm.tm_min ^ tm.tm_min)
+			    | (ltm.tm_hour ^ tm.tm_hour)
+			    | (ltm.tm_mday ^ tm.tm_mday)
+			    | (ltm.tm_mon ^ tm.tm_mon)
+			    | (ltm.tm_year ^ tm.tm_year)))
+		      break;
+		  }
+
+		if (! my_strftime_gmtime_r (&lt, &gtm))
+		  break;
+
+		diff = tm_diff (&ltm, &gtm);
+	      }
+#endif
+
+	    if (diff < 0)
+	      {
+		add (1, *p = L_('-'));
+		diff = -diff;
+	      }
+	    else
+	      add (1, *p = L_('+'));
+
+	    diff /= 60;
+	    DO_NUMBER (4, (diff / 60) * 100 + diff % 60);
+	  }
+
+	case L_('\0'):		/* GNU extension: % at end of format.  */
+	    --f;
+	    /* Fall through.  */
+	default:
+	  /* Unknown format; output the format, including the '%',
+	     since this is most likely the right thing to do if a
+	     multibyte string has been misparsed.  */
+	bad_format:
+	  {
+	    int flen;
+	    for (flen = 1; f[1 - flen] != L_('%'); flen++)
+	      continue;
+	    cpy (flen, &f[1 - flen]);
+	  }
+	  break;
+	}
+    }
+
+  if (p && maxsize != 0)
+    *p = L_('\0');
+  return i;
+}
+#ifdef _LIBC
+libc_hidden_def (my_strftime)
+#endif
+
+
+#ifdef emacs
+/* For Emacs we have a separate interface which corresponds to the normal
+   strftime function and does not have the extra information whether the
+   TP arguments comes from a `gmtime' call or not.  */
+size_t
+emacs_strftime (s, maxsize, format, tp)
+      char *s;
+      size_t maxsize;
+      const char *format;
+      const struct tm *tp;
+{
+  return my_strftime (s, maxsize, format, tp, 0);
+}
+#endif
diff --git a/gawk-5.0.1/missing_d/strncasecmp.c b/gawk-5.0.1/missing_d/strncasecmp.c
new file mode 100644
index 00000000000..a29015ce060
--- /dev/null
+++ b/gawk-5.0.1/missing_d/strncasecmp.c
@@ -0,0 +1,98 @@
+/* Copyright (C) 1991,1992,1995,1996,1997,2001,2002, 2004
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA  02110-1301  USA */
+
+/*
+ * August 2006. For Gawk: Borrowed from GLIBC to replace BSD licensed version.
+ * DON'T steal this for your own code, just go to the GLIBC sources.
+ * This version hacked unmercifully.
+ */
+
+
+/* Compare S1 and S2, ignoring case, returning less than, equal to or
+   greater than zero if S1 is lexicographically less than,
+   equal to or greater than S2.  */
+int
+strcasecmp (s1, s2)
+     const char *s1;
+     const char *s2;
+{
+  const unsigned char *p1 = (const unsigned char *) s1;
+  const unsigned char *p2 = (const unsigned char *) s2;
+  int result;
+
+  if (p1 == p2)
+    return 0;
+
+  while ((result = tolower (*p1) - tolower (*p2++)) == 0)
+    if (*p1++ == '\0')
+      break;
+
+  return result;
+}
+
+/* Compare at most N characters of two strings without taking care for
+   the case.
+   Copyright (C) 1992, 1996, 1997, 2001, 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+   MA 02110-1335, USA 
+*/
+
+/*
+ * August 2006, for gawk, same comment applies. See strncase.c
+ * in the GLIBC sources.
+ */
+
+
+/* Compare no more than N characters of S1 and S2,
+   ignoring case, returning less than, equal to or
+   greater than zero if S1 is lexicographically less
+   than, equal to or greater than S2.  */
+int
+strncasecmp (s1, s2, n)
+     const char *s1;
+     const char *s2;
+     size_t n;
+{
+  const unsigned char *p1 = (const unsigned char *) s1;
+  const unsigned char *p2 = (const unsigned char *) s2;
+  int result;
+
+  if (p1 == p2 || n == 0)
+    return 0;
+
+  while ((result = tolower (*p1) - tolower (*p2++)) == 0)
+    if (*p1++ == '\0' || --n == 0)
+      break;
+
+  return result;
+}
diff --git a/gawk-5.0.1/missing_d/strtod.c b/gawk-5.0.1/missing_d/strtod.c
new file mode 100644
index 00000000000..570f6407043
--- /dev/null
+++ b/gawk-5.0.1/missing_d/strtod.c
@@ -0,0 +1,134 @@
+/*
+ * gawk wrapper for strtod
+ */
+/*
+ * Stupid version of System V strtod(3) library routine.
+ * Does no overflow/underflow checking.
+ *
+ * A real number is defined to be
+ *	optional leading white space
+ *	optional sign
+ *	string of digits with optional decimal point
+ *	optional 'e' or 'E'
+ *		followed by optional sign or space
+ *		followed by an integer
+ *
+ * if ptr is not NULL a pointer to the character terminating the
+ * scan is returned in *ptr.  If no number formed, *ptr is set to str
+ * and 0 is returned.
+ *
+ * For speed, we don't do the conversion ourselves.  Instead, we find
+ * the end of the number and then call atof() to do the dirty work.
+ * This bought us a 10% speedup on a sample program at uunet.uu.net.
+ *
+ * Fall 2000: Changed to enforce C89 semantics, so that 0x... returns 0.
+ * C99 has hexadecimal floating point numbers.
+ *
+ * Summer 2001. Try to make it smarter, so that a string like "0000"
+ * doesn't look like we failed. Sigh.
+ *
+ * Xmass 2002. Fix a bug in ptr determination, eg. for "0e0".
+ *
+ * Spring 2004. Update for I18N. Oh joy.
+ */
+
+#if 0
+#include <ctype.h>
+#endif
+
+extern double atof();
+
+double
+gawk_strtod(s, ptr)
+const char *s;
+const char **ptr;
+{
+	const char *start = s;		/* save original start of string */
+	const char *begin = NULL;	/* where the number really begins */
+	int dig = 0;
+	int dig0 = 0;
+
+	/* optional white space */
+	while (isspace(*s))
+		s++;
+
+	begin = s;
+
+	/* optional sign */
+	if (*s == '+' || *s == '-')
+		s++;
+
+	/* string of digits with optional decimal point */
+	while (*s == '0') {
+		s++;
+		dig0++;
+	}
+	while (isdigit(*s)) {
+		s++;
+		dig++;
+	}
+
+	if (
+#if defined(HAVE_LOCALE_H)
+	loc.decimal_point != NULL && do_posix
+			? *s == loc.decimal_point[0]
+			: *s == '.'
+#else
+	*s == '.'
+#endif
+	) {
+		s++;
+		while (*s == '0') {
+			s++;
+			dig0++;
+		}
+		while (isdigit(*s)) {
+			s++;
+			dig++;
+		}
+	}
+
+	dig0 += dig;	/* any digit has appeared */
+
+	/*
+ 	 *	optional 'e' or 'E'
+	 *		if a digit (or at least zero) was seen
+	 *		followed by optional sign
+	 *		followed by an integer
+	 */
+	if (dig0
+	    && (*s == 'e' || *s == 'E')
+	    && (isdigit(s[1])
+	      || ((s[1] == '-' || s[1] == '+') && isdigit(s[2])))) {
+		s++;
+		if (*s == '+' || *s == '-')
+			s++;
+		while (isdigit(*s))
+			s++;
+	}
+
+	/* In case we haven't found a number, set ptr to start. */
+	if (ptr)
+		*ptr = (dig0 ? s : start);
+
+	/* Go for it. */
+	return (dig ? atof(begin) : 0.0);
+}
+
+#ifdef TEST
+int
+main(argc, argv)
+int argc;
+char **argv;
+{
+	double d;
+	char *p;
+
+	for (argc--, argv++; argc; argc--, argv++) {
+		d = strtod (*argv, & p);
+		printf ("%lf [%s]\n", d, p);
+	}
+
+	return 0;
+}
+#endif
diff --git a/gawk-5.0.1/missing_d/strtoul.c b/gawk-5.0.1/missing_d/strtoul.c
new file mode 100644
index 00000000000..cdd7cf143e6
--- /dev/null
+++ b/gawk-5.0.1/missing_d/strtoul.c
@@ -0,0 +1,221 @@
+/*
+ * Very simple implementation of strtoul() for gawk,
+ * for old systems.  Descriptive prose from the Linux man page.
+ *
+ * May 2004
+ */
+
+/* #define TEST 1 */
+
+#ifdef TEST
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#define strtoul mystrtoul
+#endif
+
+#ifndef ULONG_MAX
+#define ULONG_MAX (~ 0UL)
+#endif
+
+unsigned long int
+strtoul(nptr, endptr, base)
+const char *nptr;
+char **endptr;
+int base;
+{
+	static char lower[] = "abcdefghijklmnopqrstuvwxyz";
+
+	unsigned long result = 0UL;
+	char *nptr_orig = (char *) nptr;
+	bool neg = false;
+	char *cp, c;
+	int val;
+	bool sawdigs = false;
+
+	/*
+	 * The strtoul() function converts the initial part of the
+	 * string in nptr to an unsigned long integer value according
+	 * to the given base, which must be between 2 and 36 inclusive,
+	 * or be the special value 0.
+	 */
+
+	if ((base != 0 && (base < 2 || base > 36)) || nptr == NULL) {
+		if (endptr != NULL)
+			*endptr = nptr_orig;
+		errno = EINVAL;
+		return 0;
+	}
+
+	/*
+	 * The string must [sic] begin with an arbitrary amount of white space
+	 * (as determined by isspace(3)) followed by a single optional
+	 * `+' or `-' sign.
+         */
+	while (isspace(*nptr))
+		nptr++;
+
+	if (*nptr == '+')
+		nptr++;
+	else if (*nptr == '-') {
+		nptr++;
+		neg = true;
+	}
+
+       /*
+	* If base is zero or 16, the string may then include a `0x' prefix,
+	* and the number will be read in base 16; otherwise, a zero base is
+	* taken as 10 (decimal) unless the next character is `0', in which
+	* case it is taken as 8 (octal).
+	*/
+       if ((base == 0 || base == 16)
+           && nptr[0] == '0'
+	   && (nptr[1] == 'x' || nptr[1] == 'X')) {
+		base = 16;	/* force it */
+		nptr += 2;	/* skip 0x */
+	} else if ((base == 0 || base == 8) && nptr[0] == '0') {
+		base = 8;
+		nptr++;
+	} else if (base == 0)
+		base = 10;
+
+	/*
+	 * The remainder of the string is converted to an unsigned long int
+	 * value in the obvious manner, stopping at the first character
+	 * which is not a valid digit in the given base. (In bases above 10,
+	 * the letter `A' in either upper or lower case represents 10,
+	 * `B' represents 11, and so forth, with `Z' representing 35.)
+	 */
+	for (; *nptr != '\0'; nptr++) {
+		c = *nptr;
+#if defined(HAVE_LOCALE_H)
+		if (base == 10
+		    && loc.thousands_sep != NULL
+		    && loc.thousands_sep[0] != '\0'
+		    && c == loc.thousands_sep[0])
+			continue;
+#endif
+		switch (c) {
+		case '0': case '1': case '2':
+		case '3': case '4': case '5':
+		case '6': case '7': case '8':
+		case '9':
+			val = c  - '0';
+			if (val >= base)  /* even base 2 allowed ... */
+				goto out;
+			result *= base;
+			result += val;
+			sawdigs = true;
+			break;
+		case 'A': case 'B': case 'C': case 'D': case 'E':
+		case 'F': case 'G': case 'H': case 'I': case 'J':
+		case 'K': case 'L': case 'M': case 'N': case 'O':
+		case 'P': case 'Q': case 'R': case 'S': case 'T':
+		case 'U': case 'V': case 'W': case 'X': case 'Y':
+		case 'Z':
+			c += 'a' - 'A';	/* downcase */
+			/* fall through */
+		case 'a': case 'b': case 'c': case 'd': case 'e':
+		case 'f': case 'g': case 'h': case 'i': case 'j':
+		case 'k': case 'l': case 'm': case 'n': case 'o':
+		case 'p': case 'q': case 'r': case 's': case 't':
+		case 'u': case 'v': case 'w': case 'x': case 'y':
+		case 'z':
+			cp = strchr(lower, c);
+			val = cp - lower;
+			val += 10;	/* 'a' == 10 */
+			if (val >= base)
+				goto out;
+			result *= base;
+			result += val;
+			sawdigs = true;
+			break;
+		default:
+			goto out;
+		}
+	}
+out:
+	/*
+	 * If endptr is not NULL, strtoul() stores the address of the
+	 * first invalid character in *endptr. If there were no digits
+	 * at all, strtoul() stores the original value of nptr in *endptr
+	 * (and returns 0).  In particular, if *nptr is not `\0' but
+	 * **endptr is `\0' on return, the entire string is valid.
+	 */
+	if (endptr != NULL) {
+		if (! sawdigs) {
+			*endptr = nptr_orig;
+			return 0;
+		} else
+			*endptr = (char *) nptr;
+	}
+
+	/*
+	 * RETURN VALUE
+	 * The strtoul() function returns either the result of the
+	 * conversion or, if there was a leading minus sign, the
+	 * negation of the result of the conversion, unless the original
+	 * (non-negated) value would overflow; in the latter case,
+	 * strtoul() returns ULONG_MAX and sets the global variable errno
+	 * to ERANGE.
+	 */
+
+	/*
+	 * ADR: This computation is probably bogus.  If it's a
+	 * problem, upgrade to a modern system.
+	 */
+	if (neg && result == ULONG_MAX) {
+		errno = ERANGE;
+		return ULONG_MAX;
+	} else if (neg)
+		result = -result;
+
+	return result;
+}
+
+#ifdef TEST
+#undef strtoul
+int main(void)
+{
+	char *endptr;
+	unsigned long res1, res2;
+
+	res1 = strtoul("0xdeadBeeF", & endptr, 0),
+	res2 = mystrtoul("0xdeadBeeF", & endptr, 0),
+printf("(real,my)strtoul(\"0xdeadBeeF\", & endptr, 0) is %lu, %lu *endptr = %d\n",
+		res1, res2, *endptr);
+
+	res1 = strtoul("0101101", & endptr, 2),
+	res2 = mystrtoul("0101101", & endptr, 2),
+printf("(real,my)strtoul(\"0101101\", & endptr, 2) is %lu, %lu *endptr = %d\n",
+		res1, res2, *endptr);
+
+	res1 = strtoul("01011012", & endptr, 2),
+	res2 = mystrtoul("01011012", & endptr, 2),
+printf("(real,my)strtoul(\"01011012\", & endptr, 2) is %lu, %lu *endptr = %d\n",
+		res1, res2, *endptr);
+
+	res1 = strtoul("  +42a", & endptr, 0),
+	res2 = mystrtoul("  +42a", & endptr, 0),
+printf("(real,my)strtoul(\"  +42a\", & endptr, 0) is %lu, %lu *endptr = %d\n",
+		res1, res2, *endptr);
+
+	res1 = strtoul("0377", & endptr, 0),
+	res2 = mystrtoul("0377", & endptr, 0),
+printf("(real,my)strtoul(\"0377\", & endptr, 0) is %lu, %lu *endptr = %d\n",
+		res1, res2, *endptr);
+
+	res1 = strtoul("Z", & endptr, 36),
+	res2 = mystrtoul("Z", & endptr, 36),
+printf("(real,my)strtoul(\"Z\", & endptr, 36) is %lu, %lu *endptr = %d\n",
+		res1, res2, *endptr);
+
+	res1 = strtoul("qZ*", & endptr, 36),
+	res2 = mystrtoul("qZ*", & endptr, 36),
+printf("(real,my)strtoul(\"qZ*\", & endptr, 36) is %lu, %lu *endptr = %d\n",
+		res1, res2, *endptr);
+}
+#endif
diff --git a/gawk-5.0.1/missing_d/system.c b/gawk-5.0.1/missing_d/system.c
new file mode 100644
index 00000000000..7d1a4ee4300
--- /dev/null
+++ b/gawk-5.0.1/missing_d/system.c
@@ -0,0 +1,27 @@
+/* system.c --- replacement system() for systems missing one
+
+   Copyright (C) 1986, 1988, 1989, 1991 the Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+extern void fatal();
+
+int
+system(s)
+char *s;
+{
+	fatal("system() not supported on this system");
+	return 0;
+}
diff --git a/gawk-5.0.1/missing_d/timegm.c b/gawk-5.0.1/missing_d/timegm.c
new file mode 100644
index 00000000000..faf377ed7d2
--- /dev/null
+++ b/gawk-5.0.1/missing_d/timegm.c
@@ -0,0 +1,31 @@
+#include <time.h>
+#include <stdlib.h>
+
+/* timegm -- based on Linux timegm man page */
+
+time_t
+timegm(struct tm *tm)
+{
+	time_t ret;
+	char *tz = getenv("TZ");
+	const char *tzreq = "UTC+0";	/* more portable than ""? */
+
+	if (tz)
+		tz = estrdup(tz, strlen(tz));
+	if (setenv("TZ", tzreq, 1) < 0) {
+		warning(_("setenv(TZ, %s) failed (%s)"), tzreq, strerror(errno));
+		return -1;
+	}
+	tzset();
+	ret = mktime(tm);
+	if (tz) {
+		if (setenv("TZ", tz, 1) < 0)
+			fatal(_("setenv(TZ, %s) restoration failed (%s)"), tz, strerror(errno));
+		free(tz);
+	} else {
+		if (unsetenv("TZ") < 0)
+			fatal(_("unsetenv(TZ) failed (%s)"), strerror(errno));
+	}
+	tzset();
+	return ret;
+}
diff --git a/gawk-5.0.1/missing_d/tzset.c b/gawk-5.0.1/missing_d/tzset.c
new file mode 100644
index 00000000000..678ec66db18
--- /dev/null
+++ b/gawk-5.0.1/missing_d/tzset.c
@@ -0,0 +1,39 @@
+/*
+ * tzset.c
+ *
+ * Quick and dirty emulation of tzset(), tzname[], and daylight
+ * for old BSD systems without it.
+ *
+ * Thanks to Rick Adams, rick@uunet.uu.net, for the basics.
+ *
+ * BUGS:
+ *	Totally ignores the value of the TZ environment variable.
+ */
+
+#if 0
+#include <time.h>
+#endif
+#include <sys/time.h>
+
+static char tz1[1024];
+static char tz2[1024];
+
+/* external variables */
+char *tzname[2] = {
+	tz1, tz2
+};
+int daylight;
+
+extern char *timezone();
+
+void
+tzset()
+{
+	struct timeval tp;
+	struct timezone tz;
+
+	(void) gettimeofday(&tp, &tz);
+	(void) strcpy(tz1, timezone(tz.tz_minuteswest, 0));
+	(void) strcpy(tz2, timezone(tz.tz_minuteswest, 1));
+	daylight = tz.tz_dsttime;
+}
diff --git a/gawk-5.0.1/missing_d/usleep.c b/gawk-5.0.1/missing_d/usleep.c
new file mode 100644
index 00000000000..cb1c7abf2fb
--- /dev/null
+++ b/gawk-5.0.1/missing_d/usleep.c
@@ -0,0 +1,17 @@
+/*
+ * usleep - round microseconds up to an integral number of seconds.
+ *
+ * The real usleep() doesn't work this way; this is a hack for systems
+ * that don't have usleep().
+ */
+
+int
+usleep(unsigned int usec)
+{
+	unsigned int seconds = usec / 1000000;
+
+	/* Round up: */
+	seconds += (usec % 1000000 > 0);	/* 1 or 0 */
+
+	return sleep(seconds);
+}
diff --git a/gawk-5.0.1/missing_d/wcmisc.c b/gawk-5.0.1/missing_d/wcmisc.c
new file mode 100644
index 00000000000..d2b7aa08ea9
--- /dev/null
+++ b/gawk-5.0.1/missing_d/wcmisc.c
@@ -0,0 +1,100 @@
+/* wcmisc.c - replace wcXXXX routines
+   Copyright (C) 2011 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc.,
+   51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA */
+
+#if !defined(HAVE_WCTYPE) || !defined(HAVE_ISWCTYPE)
+static const char *classes[] = {
+	"<dummy>",
+	"alnum",
+	"alpha",
+	"blank",
+	"cntrl",
+	"digit",
+	"graph",
+	"lower",
+	"print",
+	"punct",
+	"space",
+	"upper",
+	"xdigit",
+	NULL
+};
+#endif
+
+#ifndef HAVE_ISWCTYPE
+static int is_blank (int c)
+{
+   return (c == ' ' || c == '\t');
+}
+#endif
+
+#ifndef HAVE_WCTYPE
+wctype_t wctype(const char *name)
+{
+	int i;
+
+	for (i = 1; classes[i] != NULL; i++)
+		if (strcmp(name, classes[i]) == 0)
+			return i;
+
+	return 0;
+}
+#endif
+
+#ifndef HAVE_ISWCTYPE
+int iswctype(wint_t wc, wctype_t desc)
+{
+	int j = sizeof(classes) / sizeof(classes[0]);
+
+	if (desc >= j || desc == 0)
+		return 0;
+
+	switch (desc) {
+	case 1:		return isalnum(wc);
+	case 2:		return isalpha(wc);
+	case 3:		return is_blank(wc);
+	case 4:		return iscntrl(wc);
+	case 5:		return isdigit(wc);
+	case 6:		return isgraph(wc);
+	case 7:		return islower(wc);
+	case 8:		return isprint(wc);
+	case 9:		return ispunct(wc);
+	case 10:	return isspace(wc);
+	case 11:	return isupper(wc);
+	case 12:	return isxdigit(wc);
+	default:	return 0;
+	}
+}
+#endif
+
+#ifndef HAVE_WCSCOLL
+int wcscoll(const wchar_t *ws1, const wchar_t *ws2)
+{
+	size_t i;
+
+	for (i = 0; ws1[i] != 0 && ws2[i] != 0; i++) {
+		if (ws1[i] < ws2[i])
+			return -1;
+		else if (ws1[i] > ws2[i])
+			return 1;
+	}
+
+	return (ws1[i] - ws2[i]);
+}
+#endif
+
+/*wcmisc.c*/
diff --git a/gawk-5.0.1/mkinstalldirs b/gawk-5.0.1/mkinstalldirs
new file mode 100755
index 00000000000..36aa90953b3
--- /dev/null
+++ b/gawk-5.0.1/mkinstalldirs
@@ -0,0 +1,162 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2018-03-07.03; # UTC
+
+# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+IFS=" ""	$nl"
+errstatus=0
+dirmode=
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake@gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage"
+      exit $?
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --version)
+      echo "$0 $scriptversion"
+      exit $?
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error.  This is a problem when calling mkinstalldirs
+# from a parallel make.  We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+  '')
+    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    else
+      # On NextStep and OpenStep, the 'mkdir' command does not
+      # recognize any option.  It will interpret all options as
+      # directories to create, and then abort because '.' already
+      # exists.
+      test -d ./-p && rmdir ./-p
+      test -d ./--version && rmdir ./--version
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+       test ! -d ./--version; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    else
+      # Clean up after NextStep and OpenStep mkdir.
+      for d in ./-m ./-p ./--version "./$dirmode";
+      do
+        test -d $d && rmdir $d
+      done
+    fi
+    ;;
+esac
+
+for file
+do
+  case $file in
+    /*) pathcomp=/ ;;
+    *)  pathcomp= ;;
+  esac
+  oIFS=$IFS
+  IFS=/
+  set fnord $file
+  shift
+  IFS=$oIFS
+
+  for d
+  do
+    test "x$d" = x && continue
+
+    pathcomp=$pathcomp$d
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+	errstatus=$lasterr
+      else
+	if test ! -z "$dirmode"; then
+	  echo "chmod $dirmode $pathcomp"
+	  lasterr=
+	  chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+	  if test ! -z "$lasterr"; then
+	    errstatus=$lasterr
+	  fi
+	fi
+      fi
+    fi
+
+    pathcomp=$pathcomp/
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/gawk-5.0.1/mpfr.c b/gawk-5.0.1/mpfr.c
new file mode 100644
index 00000000000..e1712863a97
--- /dev/null
+++ b/gawk-5.0.1/mpfr.c
@@ -0,0 +1,1801 @@
+/*
+ * mpfr.c - routines for arbitrary-precision number support in gawk.
+ */
+
+/*
+ * Copyright (C) 2012, 2013, 2015, 2017, 2018, 2019,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+#ifdef HAVE_MPFR
+
+int MPFR_round_mode = 'N';	// default value
+
+#if !defined(MPFR_VERSION_MAJOR) || MPFR_VERSION_MAJOR < 3
+typedef mp_exp_t mpfr_exp_t;
+#endif
+
+extern NODE **fmt_list;          /* declared in eval.c */
+
+mpz_t mpzval;	/* GMP integer type, used as temporary in few places */
+mpz_t MNR;
+mpz_t MFNR;
+bool do_ieee_fmt;	/* IEEE-754 floating-point emulation */
+mpfr_rnd_t ROUND_MODE;
+
+static mpfr_prec_t default_prec;
+
+static mpfr_rnd_t get_rnd_mode(const char rmode);
+static NODE *mpg_force_number(NODE *n);
+static NODE *mpg_make_number(double);
+static NODE *mpg_format_val(const char *format, int index, NODE *s);
+static int mpg_interpret(INSTRUCTION **cp);
+
+static mpfr_exp_t min_exp = MPFR_EMIN_DEFAULT;
+static mpfr_exp_t max_exp = MPFR_EMAX_DEFAULT;
+
+/* temporary MPFR floats used to hold converted GMP integer operands */
+static mpfr_t _mpf_t1;
+static mpfr_t _mpf_t2;
+
+/*
+ * PRECISION_MIN is the precision used to initialize _mpf_t1 and _mpf_t2.
+ * 64 bits should be enough for exact conversion of most integers to floats.
+ */
+
+#define PRECISION_MIN	64
+
+/* mf = { _mpf_t1, _mpf_t2 } */
+static inline mpfr_ptr mpg_tofloat(mpfr_ptr mf, mpz_ptr mz);
+/* T = {t1, t2} */
+#define MP_FLOAT(T) is_mpg_integer(T) ? mpg_tofloat(_mpf_##T, (T)->mpg_i) : (T)->mpg_numbr
+
+
+/* init_mpfr --- set up MPFR related variables */
+
+void
+init_mpfr(mpfr_prec_t prec, const char *rmode)
+{
+	mpfr_set_default_prec(default_prec = prec);
+	ROUND_MODE = get_rnd_mode(rmode[0]);
+	mpfr_set_default_rounding_mode(ROUND_MODE);
+	make_number = mpg_make_number;
+	str2number = mpg_force_number;
+	format_val = mpg_format_val;
+	cmp_numbers = mpg_cmp;
+
+	mpz_init(MNR);
+	mpz_init(MFNR);
+	do_ieee_fmt = false;
+
+	mpfr_init2(_mpf_t1, PRECISION_MIN);
+	mpfr_init2(_mpf_t2, PRECISION_MIN);
+	mpz_init(mpzval);
+
+	register_exec_hook(mpg_interpret, 0);
+}
+
+/* cleanup_mpfr --- clean stuff up, mainly for valgrind */
+
+void
+cleanup_mpfr(void)
+{
+	mpfr_clear(_mpf_t1);
+	mpfr_clear(_mpf_t2);
+}
+
+/* mpg_node --- allocate a node to store MPFR float or GMP integer */
+
+NODE *
+mpg_node(unsigned int flags)
+{
+	NODE *r = make_number_node(flags);
+
+	if (flags == MPFN)
+		/* Initialize, set precision to the default precision, and value to NaN */
+		mpfr_init(r->mpg_numbr);
+	else
+		/* Initialize and set value to 0 */
+		mpz_init(r->mpg_i);
+	return r;
+}
+
+/*
+ * mpg_make_number --- make a arbitrary-precision number node
+ *	and initialize with a C double
+ */
+
+static NODE *
+mpg_make_number(double x)
+{
+	NODE *r;
+	double ival;
+
+	if ((ival = double_to_int(x)) != x) {
+		int tval;
+		r = mpg_float();
+		tval = mpfr_set_d(r->mpg_numbr, x, ROUND_MODE);
+		IEEE_FMT(r->mpg_numbr, tval);
+	} else {
+		r = mpg_integer();
+		mpz_set_d(r->mpg_i, ival);
+	}
+	return r;
+}
+
+/* mpg_strtoui --- assign arbitrary-precision integral value from a string */
+
+int
+mpg_strtoui(mpz_ptr zi, char *str, size_t len, char **end, int base)
+{
+	char *s = str;
+	char *start;
+	int ret = -1;
+
+	/*
+	 * mpz_set_str does not like leading 0x or 0X for hex (or 0 for octal)
+	 * with a non-zero base argument.
+	*/
+	if (base == 16 && len >= 2 && *s == '0' && (s[1] == 'x' || s[1] == 'X')) {
+		s += 2; len -= 2;
+	} else if (base == 8 && len >= 1 && *s == '0') {
+		s++; len--;
+	}
+	start = s;
+
+	while (len > 0) {
+		switch (*s) {
+		case '0':
+		case '1':
+		case '2':
+		case '3':
+		case '4':
+		case '5':
+		case '6':
+		case '7':
+			break;
+		case '8':
+		case '9':
+			if (base == 8)
+				goto done;
+			break;
+		case 'a':
+		case 'b':
+		case 'c':
+		case 'd':
+		case 'e':
+		case 'f':
+		case 'A':
+		case 'B':
+		case 'C':
+		case 'D':
+		case 'E':
+		case 'F':
+			if (base == 16)
+				break;
+		default:
+			goto done;
+		}
+		s++; len--;
+	}
+done:
+	if (s > start) {
+		char save = *s;
+		*s = '\0';
+		ret = mpz_set_str(zi, start, base);
+		*s = save;
+	}
+	if (end != NULL)
+		*end = s;
+	return ret;
+}
+
+
+/* mpg_maybe_float --- test if a string may contain arbitrary-precision float */
+
+static int
+mpg_maybe_float(const char *str, int use_locale)
+{
+	int dec_point = '.';
+	const char *s = str;
+
+#if defined(HAVE_LOCALE_H)
+	/*
+	 * loc.decimal_point may not have been initialized yet,
+	 * so double check it before using it.
+	 */
+	if (use_locale && loc.decimal_point != NULL && loc.decimal_point[0] != '\0')
+		dec_point = loc.decimal_point[0];	/* XXX --- assumes one char */
+#endif
+
+	if (strlen(s) >= 3
+		&& (   (   (s[0] == 'i' || s[0] == 'I')
+			&& (s[1] == 'n' || s[1] == 'N')
+			&& (s[2] == 'f' || s[2] == 'F'))
+		    || (   (s[0] == 'n' || s[0] == 'N')
+			&& (s[1] == 'a' || s[1] == 'A')
+			&& (s[2] == 'n' || s[2] == 'N'))))
+		return true;
+
+	for (; *s != '\0'; s++) {
+		if (*s == dec_point || *s == 'e' || *s == 'E')
+			return true;
+	}
+
+	return false;
+}
+
+
+/* mpg_zero --- initialize with arbitrary-precision integer(GMP) and set value to zero */
+
+static inline void
+mpg_zero(NODE *n)
+{
+	if (is_mpg_float(n)) {
+		mpfr_clear(n->mpg_numbr);
+		n->flags &= ~MPFN;
+	}
+	if (! is_mpg_integer(n)) {
+		mpz_init(n->mpg_i);	/* this also sets its value to 0 */
+		n->flags |= MPZN;
+	} else
+		mpz_set_si(n->mpg_i, 0);
+}
+
+
+/* force_mpnum --- force a value to be a GMP integer or MPFR float */
+
+static int
+force_mpnum(NODE *n, int do_nondec, int use_locale)
+{
+	char *cp, *cpend, *ptr, *cp1;
+	char save;
+	int tval, base = 10;
+
+	if (n->stlen == 0) {
+		mpg_zero(n);
+		return false;
+	}
+
+	cp = n->stptr;
+	cpend = n->stptr + n->stlen;
+	while (cp < cpend && isspace((unsigned char) *cp))
+		cp++;
+	if (cp == cpend) {	/* only spaces */
+		mpg_zero(n);
+		return false;
+	}
+
+	save = *cpend;
+	*cpend = '\0';
+
+	if (*cp == '+' || *cp == '-')
+		cp1 = cp + 1;
+	else
+		cp1 = cp;
+
+	if (do_nondec)
+		base = get_numbase(cp1, cpend - cp1, use_locale);
+
+	if (base != 10 || ! mpg_maybe_float(cp1, use_locale)) {
+		mpg_zero(n);
+		errno = 0;
+		mpg_strtoui(n->mpg_i, cp1, cpend - cp1, & ptr, base);
+		if (*cp == '-')
+			mpz_neg(n->mpg_i, n->mpg_i);
+		goto done;
+	}
+
+	if (is_mpg_integer(n)) {
+		mpz_clear(n->mpg_i);
+		n->flags &= ~MPZN;
+	}
+
+	if (! is_mpg_float(n)) {
+		mpfr_init(n->mpg_numbr);
+		n->flags |= MPFN;
+	}
+
+	errno = 0;
+	tval = mpfr_strtofr(n->mpg_numbr, cp, & ptr, base, ROUND_MODE);
+	IEEE_FMT(n->mpg_numbr, tval);
+done:
+	/* trailing space is OK for NUMBER */
+	while (ptr < cpend && isspace((unsigned char) *ptr))
+		ptr++;
+	*cpend = save;
+	if (errno == 0 && ptr == cpend)
+		return true;
+	errno = 0;
+	return false;
+}
+
+/* mpg_force_number --- force a value to be a multiple-precision number */
+
+static NODE *
+mpg_force_number(NODE *n)
+{
+	if ((n->flags & NUMCUR) != 0)
+		return n;
+	n->flags |= NUMCUR;
+
+	if (force_mpnum(n, (do_non_decimal_data && ! do_traditional), true)) {
+		if ((n->flags & USER_INPUT) != 0) {
+			/* leave USER_INPUT set to indicate a strnum */
+			n->flags &= ~STRING;
+			n->flags |= NUMBER;
+		}
+	} else
+		n->flags &= ~USER_INPUT;
+	return n;
+}
+
+/* mpg_format_val --- format a numeric value based on format */
+
+static NODE *
+mpg_format_val(const char *format, int index, NODE *s)
+{
+	NODE *dummy[2], *r;
+	unsigned int oflags;
+
+	if (out_of_range(s)) {
+		const char *result = format_nan_inf(s, 'g');
+		return make_string(result, strlen(result));
+	}
+
+	/* create dummy node for a sole use of format_tree */
+	dummy[1] = s;
+	oflags = s->flags;
+
+	if (is_mpg_integer(s) || mpfr_integer_p(s->mpg_numbr)) {
+		/* integral value, use %d */
+		r = format_tree("%d", 2, dummy, 2);
+		s->stfmt = STFMT_UNUSED;
+	} else {
+		r = format_tree(format, fmt_list[index]->stlen, dummy, 2);
+		assert(r != NULL);
+		s->stfmt = index;
+	}
+	s->flags = oflags;
+	s->stlen = r->stlen;
+	if ((s->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
+		efree(s->stptr);
+	s->stptr = r->stptr;
+	s->flags |= STRCUR;
+	s->strndmode = MPFR_round_mode;
+	freenode(r);	/* Do not unref(r)! We want to keep s->stptr == r->stpr.  */
+	free_wstr(s);
+	return s;
+}
+
+/* mpg_cmp --- compare two numbers */
+
+int
+mpg_cmp(const NODE *t1, const NODE *t2)
+{
+	/*
+	 * For the purposes of sorting, NaN is considered greater than
+	 * any other value, and all NaN values are considered equivalent and equal.
+	 */
+
+	if (is_mpg_float(t1)) {
+		if (is_mpg_float(t2)) {
+			if (mpfr_nan_p(t1->mpg_numbr))
+				return ! mpfr_nan_p(t2->mpg_numbr);
+			if (mpfr_nan_p(t2->mpg_numbr))
+				return -1;
+			return mpfr_cmp(t1->mpg_numbr, t2->mpg_numbr);
+		}
+		if (mpfr_nan_p(t1->mpg_numbr))
+			return 1;
+		return mpfr_cmp_z(t1->mpg_numbr, t2->mpg_i);
+	} else if (is_mpg_float(t2)) {
+		int ret;
+		if (mpfr_nan_p(t2->mpg_numbr))
+			return -1;
+		ret = mpfr_cmp_z(t2->mpg_numbr, t1->mpg_i);
+		return ret > 0 ? -1 : (ret < 0);
+	} else if (is_mpg_integer(t1)) {
+		return mpz_cmp(t1->mpg_i, t2->mpg_i);
+	}
+
+	/* t1 and t2 are AWKNUMs */
+	return cmp_awknums(t1, t2);
+}
+
+
+/*
+ * mpg_update_var --- update NR or FNR.
+ *	NR_node->var_value(mpz_t) = MNR(mpz_t) * LONG_MAX + NR(long)
+ */
+
+NODE *
+mpg_update_var(NODE *n)
+{
+	NODE *val = n->var_value;
+	long nr = 0;
+	mpz_ptr nq = 0;
+
+	if (n == NR_node) {
+		nr = NR;
+		nq = MNR;
+	} else if (n == FNR_node) {
+		nr = FNR;
+		nq = MFNR;
+	} else
+		cant_happen();
+
+	if (mpz_sgn(nq) == 0) {
+		/* Efficiency hack similar to that for AWKNUM */
+		if (is_mpg_float(val) || mpz_get_si(val->mpg_i) != nr) {
+			unref(n->var_value);
+			val = n->var_value = mpg_integer();
+			mpz_set_si(val->mpg_i, nr);
+		}
+	} else {
+		unref(n->var_value);
+		val = n->var_value = mpg_integer();
+		mpz_set_si(val->mpg_i, nr);
+		mpz_addmul_ui(val->mpg_i, nq, LONG_MAX);	/* val->mpg_i += nq * LONG_MAX */
+	}
+	return val;
+}
+
+/* mpg_set_var --- set NR or FNR */
+
+long
+mpg_set_var(NODE *n)
+{
+	long nr = 0;
+	mpz_ptr nq = 0, r;
+	NODE *val = n->var_value;
+
+	if (n == NR_node)
+		nq = MNR;
+	else if (n == FNR_node)
+		nq = MFNR;
+	else
+		cant_happen();
+
+	if (is_mpg_integer(val))
+		r = val->mpg_i;
+	else {
+		/* convert float to integer */
+		mpfr_get_z(mpzval, val->mpg_numbr, MPFR_RNDZ);
+		r = mpzval;
+	}
+	nr = mpz_fdiv_q_ui(nq, r, LONG_MAX);	/* nq (MNR or MFNR) is quotient */
+	return nr;	/* remainder (NR or FNR) */
+}
+
+/* set_PREC --- update MPFR PRECISION related variables when PREC assigned to */
+
+void
+set_PREC()
+{
+	long prec = 0;
+	NODE *val;
+	static const struct ieee_fmt {
+		const char *name;
+		mpfr_prec_t precision;
+		mpfr_exp_t emax;
+		mpfr_exp_t emin;
+	} ieee_fmts[] = {
+		{ "half",	11,	16,	-23	},	/* binary16 */
+		{ "single",	24,	128,	-148	},	/* binary32 */
+		{ "double",	53,	1024,	-1073	},	/* binary64 */
+		{ "quad",	113,	16384,	-16493	},	/* binary128 */
+		{ "oct",	237,	262144,	-262377	},	/* binary256, not in the IEEE 754-2008 standard */
+
+		/*
+ 		 * For any bitwidth = 32 * k ( k >= 4),
+ 		 * precision = 13 + bitwidth - int(4 * log2(bitwidth))
+		 * emax = 1 << bitwidth - precision - 1
+		 * emin = 4 - emax - precision
+ 		 */
+	};
+
+	if (! do_mpfr)
+		return;
+
+	val = fixtype(PREC_node->var_value);
+
+	if ((val->flags & STRING) != 0) {
+		int i, j;
+
+		/* emulate IEEE-754 binary format */
+
+		for (i = 0, j = sizeof(ieee_fmts)/sizeof(ieee_fmts[0]); i < j; i++) {
+			if (strcasecmp(ieee_fmts[i].name, val->stptr) == 0)
+				break;
+		}
+
+		if (i < j) {
+			prec = ieee_fmts[i].precision;
+
+			/*
+			 * We *DO NOT* change the MPFR exponent range using
+			 * mpfr_set_{emin, emax} here. See format_ieee() for details.
+			 */
+			max_exp = ieee_fmts[i].emax;
+			min_exp = ieee_fmts[i].emin;
+
+			do_ieee_fmt = true;
+		}
+	}
+
+	if (prec <= 0) {
+		force_number(val);
+		prec = get_number_si(val);
+		if (prec < MPFR_PREC_MIN || prec > MPFR_PREC_MAX) {
+			force_string(val);
+			warning(_("PREC value `%.*s' is invalid"), (int) val->stlen, val->stptr);
+			prec = 0;
+		} else
+			do_ieee_fmt = false;
+	}
+
+	if (prec > 0)
+		mpfr_set_default_prec(default_prec = prec);
+}
+
+
+/* get_rnd_mode --- convert string to MPFR rounding mode */
+
+static mpfr_rnd_t
+get_rnd_mode(const char rmode)
+{
+	switch (rmode) {
+	case 'N':
+	case 'n':
+		return MPFR_RNDN;	/* round to nearest (IEEE-754 roundTiesToEven) */
+	case 'Z':
+	case 'z':
+		return MPFR_RNDZ;	/* round toward zero (IEEE-754 roundTowardZero) */
+	case 'U':
+	case 'u':
+		return MPFR_RNDU;	/* round toward plus infinity (IEEE-754 roundTowardPositive) */
+	case 'D':
+	case 'd':
+		return MPFR_RNDD;	/* round toward minus infinity (IEEE-754 roundTowardNegative) */
+#if defined(MPFR_VERSION_MAJOR) && MPFR_VERSION_MAJOR > 2
+	case 'A':
+	case 'a':
+		return MPFR_RNDA;	/* round away from zero */
+#endif
+	default:
+		break;
+	}
+	return -1;
+}
+
+/*
+ * set_ROUNDMODE --- update MPFR rounding mode related variables
+ *	when ROUNDMODE assigned to
+ */
+
+void
+set_ROUNDMODE()
+{
+	if (do_mpfr) {
+		mpfr_rnd_t rndm = -1;
+		NODE *n;
+		n = force_string(ROUNDMODE_node->var_value);
+		if (n->stlen == 1)
+			rndm = get_rnd_mode(n->stptr[0]);
+		if (rndm != -1) {
+			mpfr_set_default_rounding_mode(rndm);
+			ROUND_MODE = rndm;
+			MPFR_round_mode = n->stptr[0];
+		} else
+			warning(_("RNDMODE value `%.*s' is invalid"), (int) n->stlen, n->stptr);
+	}
+}
+
+
+/* format_ieee --- make sure a number follows IEEE-754 floating-point standard */
+
+int
+format_ieee(mpfr_ptr x, int tval)
+{
+	/*
+	 * The MPFR doc says that it's our responsibility to make sure all numbers
+	 * including those previously created are in range after we've changed the
+	 * exponent range. Most MPFR operations and functions require
+	 * the input arguments to have exponents within the current exponent range.
+	 * Any argument outside the range results in a MPFR assertion failure
+	 * like this:
+	 *
+	 *   $ gawk -M 'BEGIN { x=1.0e-10000; print x+0; PREC="double"; print x+0}'
+	 *   1e-10000
+	 *   init2.c:52: MPFR assertion failed ....
+	 *
+	 * A "naive" approach would be to keep track of the ternary state and
+	 * the rounding mode for each number, and make sure it is in the current
+	 * exponent range (using mpfr_check_range) before using it in an
+	 * operation or function. Instead, we adopt the following strategy.
+	 *
+	 * When gawk starts, the exponent range is the MPFR default
+	 * [MPFR_EMIN_DEFAULT, MPFR_EMAX_DEFAULT]. Any number that gawk
+	 * creates must have exponent in this range (excluding infinities, NaNs and zeros).
+	 * Each MPFR operation or function is performed with this default exponent
+	 * range.
+	 *
+	 * When emulating IEEE-754 format, the exponents are *temporarily* changed,
+	 * mpfr_check_range is called to make sure the number is in the new range,
+	 * and mpfr_subnormalize is used to round following the rules of subnormal
+	 * arithmetic. The exponent range is then *restored* to the original value
+	 * [MPFR_EMIN_DEFAULT, MPFR_EMAX_DEFAULT].
+	 */
+
+	(void) mpfr_set_emin(min_exp);
+	(void) mpfr_set_emax(max_exp);
+	tval = mpfr_check_range(x, tval, ROUND_MODE);
+	tval = mpfr_subnormalize(x, tval, ROUND_MODE);
+	(void) mpfr_set_emin(MPFR_EMIN_DEFAULT);
+	(void) mpfr_set_emax(MPFR_EMAX_DEFAULT);
+	return tval;
+}
+
+
+/* do_mpfr_atan2 --- do the atan2 function */
+
+NODE *
+do_mpfr_atan2(int nargs)
+{
+	NODE *t1, *t2, *res;
+	mpfr_ptr p1, p2;
+	int tval;
+
+	t2 = POP_SCALAR();
+	t1 = POP_SCALAR();
+
+	if (do_lint) {
+		if ((fixtype(t1)->flags & NUMBER) == 0)
+			lintwarn(_("atan2: received non-numeric first argument"));
+		if ((fixtype(t2)->flags & NUMBER) == 0)
+			lintwarn(_("atan2: received non-numeric second argument"));
+	}
+	force_number(t1);
+	force_number(t2);
+
+	p1 = MP_FLOAT(t1);
+	p2 = MP_FLOAT(t2);
+	res = mpg_float();
+	/* See MPFR documentation for handling of special values like +inf as an argument */
+	tval = mpfr_atan2(res->mpg_numbr, p1, p2, ROUND_MODE);
+	IEEE_FMT(res->mpg_numbr, tval);
+
+	DEREF(t1);
+	DEREF(t2);
+	return res;
+}
+
+/* do_mpfr_func --- run an MPFR function - not inline, for debugging */
+
+static inline NODE *
+do_mpfr_func(const char *name,
+		int (*mpfr_func)(),	/* putting argument types just gets the compiler confused */
+		int nargs)
+{
+	NODE *t1, *res;
+	mpfr_ptr p1;
+	int tval;
+	mpfr_prec_t argprec;
+
+	t1 = POP_SCALAR();
+	if (do_lint && (fixtype(t1)->flags & NUMBER) == 0)
+		lintwarn(_("%s: received non-numeric argument"), name);
+
+	force_number(t1);
+	p1 = MP_FLOAT(t1);
+	res = mpg_float();
+	if ((argprec = mpfr_get_prec(p1)) > default_prec)
+		mpfr_set_prec(res->mpg_numbr, argprec);	/* needed at least for sqrt() */
+	tval = mpfr_func(res->mpg_numbr, p1, ROUND_MODE);
+	IEEE_FMT(res->mpg_numbr, tval);
+	DEREF(t1);
+	return res;
+}
+
+#define SPEC_MATH(X)				\
+NODE *result;					\
+result = do_mpfr_func(#X, mpfr_##X, nargs);	\
+return result
+
+/* do_mpfr_sin --- do the sin function */
+
+NODE *
+do_mpfr_sin(int nargs)
+{
+	SPEC_MATH(sin);
+}
+
+/* do_mpfr_cos --- do the cos function */
+
+NODE *
+do_mpfr_cos(int nargs)
+{
+	SPEC_MATH(cos);
+}
+
+/* do_mpfr_exp --- exponential function */
+
+NODE *
+do_mpfr_exp(int nargs)
+{
+	SPEC_MATH(exp);
+}
+
+/* do_mpfr_log --- the log function */
+
+NODE *
+do_mpfr_log(int nargs)
+{
+	SPEC_MATH(log);
+}
+
+/* do_mpfr_sqrt --- do the sqrt function */
+
+NODE *
+do_mpfr_sqrt(int nargs)
+{
+	SPEC_MATH(sqrt);
+}
+
+/* do_mpfr_int --- convert double to int for awk */
+
+NODE *
+do_mpfr_int(int nargs)
+{
+	NODE *tmp, *r;
+
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+		lintwarn(_("int: received non-numeric argument"));
+	force_number(tmp);
+
+	if (is_mpg_integer(tmp)) {
+		r = mpg_integer();
+		mpz_set(r->mpg_i, tmp->mpg_i);
+	} else {
+		if (! mpfr_number_p(tmp->mpg_numbr)) {
+			/* [+-]inf or NaN */
+			return tmp;
+		}
+
+		r = mpg_integer();
+		mpfr_get_z(r->mpg_i, tmp->mpg_numbr, MPFR_RNDZ);
+	}
+
+	DEREF(tmp);
+	return r;
+}
+
+/* do_mpfr_compl --- perform a ~ operation */
+
+NODE *
+do_mpfr_compl(int nargs)
+{
+	NODE *tmp, *r;
+	mpz_ptr zptr;
+
+	tmp = POP_SCALAR();
+	if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+		lintwarn(_("compl: received non-numeric argument"));
+
+	force_number(tmp);
+	if (is_mpg_float(tmp)) {
+		mpfr_ptr p = tmp->mpg_numbr;
+
+		if (! mpfr_number_p(p)) {
+			/* [+-]inf or NaN */
+			return tmp;
+		}
+		if (mpfr_sgn(p) < 0)
+			fatal("%s",
+			mpg_fmt(_("compl(%Rg): negative value is not allowed"), p)
+					);
+		if (do_lint) {
+			if (! mpfr_integer_p(p))
+				lintwarn("%s",
+			mpg_fmt(_("comp(%Rg): fractional value will be truncated"), p)
+					);
+		}
+
+		mpfr_get_z(mpzval, p, MPFR_RNDZ);	/* float to integer conversion */
+		zptr = mpzval;
+	} else {
+		/* (tmp->flags & MPZN) != 0 */
+		zptr = tmp->mpg_i;
+		if (mpz_sgn(zptr) < 0)
+				fatal("%s",
+			mpg_fmt(_("compl(%Zd): negative values are not allowed"), zptr)
+					);
+	}
+
+	r = mpg_integer();
+	mpz_com(r->mpg_i, zptr);
+	DEREF(tmp);
+	return r;
+}
+
+/* get_intval --- get the (converted) integral operand of a binary function. */
+
+static mpz_ptr
+get_intval(NODE *t1, int argnum, const char *op)
+{
+	mpz_ptr pz;
+
+	if (do_lint && (fixtype(t1)->flags & NUMBER) == 0)
+		lintwarn(_("%s: received non-numeric argument #%d"), op, argnum);
+
+	(void) force_number(t1);
+
+	if (is_mpg_float(t1)) {
+		mpfr_ptr left = t1->mpg_numbr;
+		if (! mpfr_number_p(left)) {
+			/* inf or NaN */
+			if (do_lint)
+                       		lintwarn("%s",
+		mpg_fmt(_("%s: argument #%d has invalid value %Rg, using 0"),
+                                	op, argnum, left)
+				);
+
+			emalloc(pz, mpz_ptr, sizeof (mpz_t), "get_intval");
+			mpz_init(pz);
+			return pz;	/* should be freed */
+		}
+
+		if (mpfr_sgn(left) < 0)
+			fatal("%s",
+		mpg_fmt(_("%s: argument #%d negative value %Rg is not allowed"),
+					op, argnum, left)
+				);
+
+		if (do_lint) {
+			if (! mpfr_integer_p(left))
+				lintwarn("%s",
+		mpg_fmt(_("%s: argument #%d fractional value %Rg will be truncated"),
+					op, argnum, left)
+				);
+		}
+
+		emalloc(pz, mpz_ptr, sizeof (mpz_t), "get_intval");
+		mpz_init(pz);
+		mpfr_get_z(pz, left, MPFR_RNDZ);	/* float to integer conversion */
+		return pz;	/* should be freed */
+	}
+	/* (t1->flags & MPZN) != 0 */
+	pz = t1->mpg_i;
+	if (mpz_sgn(pz) < 0)
+		fatal("%s",
+	mpg_fmt(_("%s: argument #%d negative value %Zd is not allowed"),
+					op, argnum, pz)
+				);
+
+	return pz;	/* must not be freed */
+}
+
+
+/* free_intval --- free the converted integer value returned by get_intval() */
+
+static inline void
+free_intval(NODE *t, mpz_ptr pz)
+{
+	if ((t->flags & MPZN) == 0) {
+		mpz_clear(pz);
+		efree(pz);
+	}
+}
+
+
+/* do_mpfr_lshift --- perform a << operation */
+
+NODE *
+do_mpfr_lshift(int nargs)
+{
+	NODE *t1, *t2, *res;
+	unsigned long shift;
+	mpz_ptr pz1, pz2;
+
+	t2 = POP_SCALAR();
+	t1 = POP_SCALAR();
+
+	pz1 = get_intval(t1, 1, "lshift");
+	pz2 = get_intval(t2, 2, "lshift");
+
+	/*
+	 * mpz_get_ui: If op is too big to fit an unsigned long then just
+	 * the least significant bits that do fit are returned.
+	 * The sign of op is ignored, only the absolute value is used.
+	 */
+
+	shift = mpz_get_ui(pz2);	/* GMP integer => unsigned long conversion */
+	res = mpg_integer();
+	mpz_mul_2exp(res->mpg_i, pz1, shift);		/* res = pz1 * 2^shift */
+
+	free_intval(t1, pz1);
+	free_intval(t2, pz2);
+	DEREF(t2);
+	DEREF(t1);
+	return res;
+}
+
+/* do_mpfr_rshift --- perform a >> operation */
+
+NODE *
+do_mpfr_rshift(int nargs)
+{
+	NODE *t1, *t2, *res;
+	unsigned long shift;
+	mpz_ptr pz1, pz2;
+
+	t2 = POP_SCALAR();
+	t1 = POP_SCALAR();
+
+	pz1 = get_intval(t1, 1, "rshift");
+	pz2 = get_intval(t2, 2, "rshift");
+
+	/* N.B: See do_mpfp_lshift. */
+	shift = mpz_get_ui(pz2);	/* GMP integer => unsigned long conversion */
+	res = mpg_integer();
+	mpz_fdiv_q_2exp(res->mpg_i, pz1, shift);	/* res = pz1 / 2^shift, round towards -inf */
+
+	free_intval(t1, pz1);
+	free_intval(t2, pz2);
+	DEREF(t2);
+	DEREF(t1);
+	return res;
+}
+
+
+/* do_mpfr_and --- perform an & operation */
+
+NODE *
+do_mpfr_and(int nargs)
+{
+	NODE *t1, *t2, *res;
+	mpz_ptr pz1, pz2;
+	int i;
+
+	if (nargs < 2)
+		fatal(_("and: called with less than two arguments"));
+
+	t2 = POP_SCALAR();
+	pz2 = get_intval(t2, nargs, "and");
+
+	res = mpg_integer();
+	for (i = 1; i < nargs; i++) {
+		t1 = POP_SCALAR();
+		pz1 = get_intval(t1, nargs - i, "and");
+		mpz_and(res->mpg_i, pz1, pz2);
+		free_intval(t1, pz1);
+		DEREF(t1);
+		if (i == 1) {
+			free_intval(t2, pz2);
+			DEREF(t2);
+		}
+		pz2 = res->mpg_i;
+	}
+	return res;
+}
+
+
+/* do_mpfr_or --- perform an | operation */
+
+NODE *
+do_mpfr_or(int nargs)
+{
+	NODE *t1, *t2, *res;
+	mpz_ptr pz1, pz2;
+	int i;
+
+	if (nargs < 2)
+		fatal(_("or: called with less than two arguments"));
+
+	t2 = POP_SCALAR();
+	pz2 = get_intval(t2, nargs, "or");
+
+	res = mpg_integer();
+	for (i = 1; i < nargs; i++) {
+		t1 = POP_SCALAR();
+		pz1 = get_intval(t1, nargs - i, "or");
+		mpz_ior(res->mpg_i, pz1, pz2);
+		free_intval(t1, pz1);
+		DEREF(t1);
+		if (i == 1) {
+			free_intval(t2, pz2);
+			DEREF(t2);
+		}
+		pz2 = res->mpg_i;
+	}
+	return res;
+}
+
+/* do_mpfr_xor --- perform an ^ operation */
+
+NODE *
+do_mpfr_xor(int nargs)
+{
+	NODE *t1, *t2, *res;
+	mpz_ptr pz1, pz2;
+	int i;
+
+	if (nargs < 2)
+		fatal(_("xor: called with less than two arguments"));
+
+	t2 = POP_SCALAR();
+	pz2 = get_intval(t2, nargs, "xor");
+
+	res = mpg_integer();
+	for (i = 1; i < nargs; i++) {
+		t1 = POP_SCALAR();
+		pz1 = get_intval(t1, nargs - i, "xor");
+		mpz_xor(res->mpg_i, pz1, pz2);
+		free_intval(t1, pz1);
+		DEREF(t1);
+		if (i == 1) {
+			free_intval(t2, pz2);
+			DEREF(t2);
+		}
+		pz2 = res->mpg_i;
+	}
+	return res;
+}
+
+/* do_mpfr_strtonum --- the strtonum function */
+
+NODE *
+do_mpfr_strtonum(int nargs)
+{
+	NODE *tmp, *r;
+
+	tmp = fixtype(POP_SCALAR());
+	if ((tmp->flags & NUMBER) == 0) {
+		r = mpg_integer();	/* will be changed to MPFR float if necessary in force_mpnum() */
+		r->stptr = tmp->stptr;
+		r->stlen = tmp->stlen;
+		force_mpnum(r, true, use_lc_numeric);
+		r->stptr = NULL;
+		r->stlen = 0;
+		r->wstptr = NULL;
+		r->wstlen = 0;
+	} else if (is_mpg_float(tmp)) {
+		int tval;
+		r = mpg_float();
+		tval = mpfr_set(r->mpg_numbr, tmp->mpg_numbr, ROUND_MODE);
+		IEEE_FMT(r->mpg_numbr, tval);
+	} else {
+		r = mpg_integer();
+		mpz_set(r->mpg_i, tmp->mpg_i);
+	}
+
+	DEREF(tmp);
+	return r;
+}
+
+
+static bool firstrand = true;
+static gmp_randstate_t state;
+static mpz_t seed;	/* current seed */
+
+/* do_mpfr_rand --- do the rand function */
+
+NODE *
+do_mpfr_rand(int nargs ATTRIBUTE_UNUSED)
+{
+	NODE *res;
+	int tval;
+
+	if (firstrand) {
+#if 0
+		/* Choose the default algorithm */
+		gmp_randinit_default(state);
+#endif
+		/*
+		 * Choose a specific (Mersenne Twister) algorithm in case the default
+		 * changes in the future.
+		 */
+
+		gmp_randinit_mt(state);
+
+		mpz_init(seed);
+		mpz_set_ui(seed, 1);
+		/* seed state */
+		gmp_randseed(state, seed);
+		firstrand = false;
+	}
+	res = mpg_float();
+	tval = mpfr_urandomb(res->mpg_numbr, state);
+	IEEE_FMT(res->mpg_numbr, tval);
+	return res;
+}
+
+
+/* do_mpfr_srand --- seed the random number generator */
+
+NODE *
+do_mpfr_srand(int nargs)
+{
+	NODE *res;
+
+	if (firstrand) {
+#if 0
+		/* Choose the default algorithm */
+		gmp_randinit_default(state);
+#endif
+		/*
+		 * Choose a specific algorithm (Mersenne Twister) in case default
+		 * changes in the future.
+		 */
+
+		gmp_randinit_mt(state);
+
+		mpz_init(seed);
+		mpz_set_ui(seed, 1);
+		/* No need to seed state, will change it below */
+		firstrand = false;
+	}
+
+	res = mpg_integer();
+	mpz_set(res->mpg_i, seed);	/* previous seed */
+
+	if (nargs == 0)
+		mpz_set_ui(seed, (unsigned long) time((time_t *) 0));
+	else {
+		NODE *tmp;
+		tmp = POP_SCALAR();
+		if (do_lint && (fixtype(tmp)->flags & NUMBER) == 0)
+			lintwarn(_("srand: received non-numeric argument"));
+		force_number(tmp);
+		if (is_mpg_float(tmp))
+			mpfr_get_z(seed, tmp->mpg_numbr, MPFR_RNDZ);
+		else /* MP integer */
+			mpz_set(seed, tmp->mpg_i);
+		DEREF(tmp);
+	}
+
+	gmp_randseed(state, seed);
+	return res;
+}
+
+#ifdef SUPPLY_INTDIV
+/* do_mpfr_intdiv --- do integer division, return quotient and remainder in dest array */
+
+/*
+ * We define the semantics as:
+ * 	numerator = int(numerator)
+ *	denominator = int(denonmator)
+ *	quotient = int(numerator / denomator)
+ *	remainder = int(numerator % denomator)
+ */
+
+NODE *
+do_mpfr_intdiv(int nargs)
+{
+	NODE *numerator, *denominator, *result;
+	NODE *num, *denom;
+	NODE *quotient, *remainder;
+	NODE *sub, **lhs;
+
+	result = POP_PARAM();
+	if (result->type != Node_var_array)
+		fatal(_("intdiv: third argument is not an array"));
+	assoc_clear(result);
+
+	denominator = POP_SCALAR();
+	numerator = POP_SCALAR();
+
+	if (do_lint) {
+		if ((fixtype(numerator)->flags & NUMBER) == 0)
+			lintwarn(_("intdiv: received non-numeric first argument"));
+		if ((fixtype(denominator)->flags & NUMBER) == 0)
+			lintwarn(_("intdiv: received non-numeric second argument"));
+	}
+
+	(void) force_number(numerator);
+	(void) force_number(denominator);
+
+	/* convert numerator and denominator to integer */
+	if (is_mpg_integer(numerator)) {
+		num = mpg_integer();
+		mpz_set(num->mpg_i, numerator->mpg_i);
+	} else {
+		if (! mpfr_number_p(numerator->mpg_numbr)) {
+			/* [+-]inf or NaN */
+			unref(numerator);
+			unref(denominator);
+			return make_number((AWKNUM) -1);
+		}
+
+		num = mpg_integer();
+		mpfr_get_z(num->mpg_i, numerator->mpg_numbr, MPFR_RNDZ);
+	}
+
+	if (is_mpg_integer(denominator)) {
+		denom = mpg_integer();
+		mpz_set(denom->mpg_i, denominator->mpg_i);
+	} else {
+		if (! mpfr_number_p(denominator->mpg_numbr)) {
+			/* [+-]inf or NaN */
+			unref(numerator);
+			unref(denominator);
+			unref(num);
+			return make_number((AWKNUM) -1);
+		}
+
+		denom = mpg_integer();
+		mpfr_get_z(denom->mpg_i, denominator->mpg_numbr, MPFR_RNDZ);
+	}
+
+	if (mpz_sgn(denom->mpg_i) == 0)
+		fatal(_("intdiv: division by zero attempted"));
+
+	quotient = mpg_integer();
+	remainder = mpg_integer();
+
+	/* do the division */
+	mpz_tdiv_qr(quotient->mpg_i, remainder->mpg_i, num->mpg_i, denom->mpg_i);
+	unref(num);
+	unref(denom);
+	unref(numerator);
+	unref(denominator);
+
+	sub = make_string("quotient", 8);
+	assoc_set(result, sub, quotient);
+
+	sub = make_string("remainder", 9);
+	assoc_set(result, sub, remainder);
+
+	return make_number((AWKNUM) 0.0);
+}
+#endif /* SUPPLY_INTDIV */
+
+/*
+ * mpg_tofloat --- convert an arbitrary-precision integer operand to
+ *	a float without loss of precision. It is assumed that the
+ *	MPFR variable has already been initialized.
+ */
+
+static inline mpfr_ptr
+mpg_tofloat(mpfr_ptr mf, mpz_ptr mz)
+{
+	size_t prec;
+
+	/*
+	 * When implicitely converting a GMP integer operand to a MPFR float, use
+	 * a precision sufficiently large to hold the converted value exactly.
+	 *
+ 	 *	$ ./gawk -M 'BEGIN { print 13 % 2 }'
+ 	 *	1
+ 	 * If the user-specified precision is used to convert the integer 13 to a
+	 * float, one will get:
+ 	 *	$ ./gawk -M 'BEGIN { PREC=2; print 13 % 2.0 }'
+ 	 *	0
+ 	 */
+
+	prec = mpz_sizeinbase(mz, 2);	/* most significant 1 bit position starting at 1 */
+	if (prec > PRECISION_MIN) {
+		prec -= (size_t) mpz_scan1(mz, 0);	/* least significant 1 bit index starting at 0 */
+		if (prec > MPFR_PREC_MAX)
+			prec = MPFR_PREC_MAX;
+		else if (prec < PRECISION_MIN)
+			prec = PRECISION_MIN;
+	}
+	else
+		prec = PRECISION_MIN;
+	/*
+	 * Always set the precision to avoid hysteresis, since do_mpfr_func
+	 * may copy our precision.
+	 */
+	if (prec != mpfr_get_prec(mf))
+		mpfr_set_prec(mf, prec);
+
+	mpfr_set_z(mf, mz, ROUND_MODE);
+	return mf;
+}
+
+
+/* mpg_add --- add arbitrary-precision numbers */
+
+static NODE *
+mpg_add(NODE *t1, NODE *t2)
+{
+	NODE *r;
+	int tval;
+
+	if (is_mpg_integer(t1) && is_mpg_integer(t2)) {
+		r = mpg_integer();
+		mpz_add(r->mpg_i, t1->mpg_i, t2->mpg_i);
+	} else {
+		r = mpg_float();
+		if (is_mpg_integer(t2))
+			tval = mpfr_add_z(r->mpg_numbr, t1->mpg_numbr, t2->mpg_i, ROUND_MODE);
+		else if (is_mpg_integer(t1))
+			tval = mpfr_add_z(r->mpg_numbr, t2->mpg_numbr, t1->mpg_i, ROUND_MODE);
+		else
+			tval = mpfr_add(r->mpg_numbr, t1->mpg_numbr, t2->mpg_numbr, ROUND_MODE);
+		IEEE_FMT(r->mpg_numbr, tval);
+	}
+	return r;
+}
+
+/* mpg_sub --- subtract arbitrary-precision numbers */
+
+static NODE *
+mpg_sub(NODE *t1, NODE *t2)
+{
+	NODE *r;
+	int tval;
+
+	if (is_mpg_integer(t1) && is_mpg_integer(t2)) {
+		r = mpg_integer();
+		mpz_sub(r->mpg_i, t1->mpg_i, t2->mpg_i);
+	} else {
+		r = mpg_float();
+		if (is_mpg_integer(t2))
+			tval = mpfr_sub_z(r->mpg_numbr, t1->mpg_numbr, t2->mpg_i, ROUND_MODE);
+		else if (is_mpg_integer(t1)) {
+#if (!defined(MPFR_VERSION) || (MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)))
+			NODE *tmp = t1;
+			t1 = t2;
+			t2 = tmp;
+			tval = mpfr_sub_z(r->mpg_numbr, t1->mpg_numbr, t2->mpg_i, ROUND_MODE);
+			tval = mpfr_neg(r->mpg_numbr, r->mpg_numbr, ROUND_MODE);
+			t2 = t1;
+			t1 = tmp;
+#else
+			tval = mpfr_z_sub(r->mpg_numbr, t1->mpg_i, t2->mpg_numbr, ROUND_MODE);
+#endif
+		} else
+			tval = mpfr_sub(r->mpg_numbr, t1->mpg_numbr, t2->mpg_numbr, ROUND_MODE);
+		IEEE_FMT(r->mpg_numbr, tval);
+	}
+	return r;
+}
+
+/* mpg_mul --- multiply arbitrary-precision numbers */
+
+static NODE *
+mpg_mul(NODE *t1, NODE *t2)
+{
+	NODE *r;
+	int tval;
+
+	if (is_mpg_integer(t1) && is_mpg_integer(t2)) {
+		r = mpg_integer();
+		mpz_mul(r->mpg_i, t1->mpg_i, t2->mpg_i);
+	} else {
+		r = mpg_float();
+		if (is_mpg_integer(t2))
+			tval = mpfr_mul_z(r->mpg_numbr, t1->mpg_numbr, t2->mpg_i, ROUND_MODE);
+		else if (is_mpg_integer(t1))
+			tval = mpfr_mul_z(r->mpg_numbr, t2->mpg_numbr, t1->mpg_i, ROUND_MODE);
+		else
+			tval = mpfr_mul(r->mpg_numbr, t1->mpg_numbr, t2->mpg_numbr, ROUND_MODE);
+		IEEE_FMT(r->mpg_numbr, tval);
+	}
+	return r;
+}
+
+
+/* mpg_pow --- exponentiation involving arbitrary-precision numbers */
+
+static NODE *
+mpg_pow(NODE *t1, NODE *t2)
+{
+	NODE *r;
+	int tval;
+
+	if (is_mpg_integer(t1) && is_mpg_integer(t2)) {
+		if (mpz_sgn(t2->mpg_i) >= 0 && mpz_fits_ulong_p(t2->mpg_i)) {
+			r = mpg_integer();
+			mpz_pow_ui(r->mpg_i, t1->mpg_i, mpz_get_ui(t2->mpg_i));
+		} else {
+			mpfr_ptr p1, p2;
+			p1 = MP_FLOAT(t1);
+			p2 = MP_FLOAT(t2);
+			r = mpg_float();
+			tval = mpfr_pow(r->mpg_numbr, p1, p2, ROUND_MODE);
+			IEEE_FMT(r->mpg_numbr, tval);
+		}
+	} else {
+		r = mpg_float();
+		if (is_mpg_integer(t2))
+			tval = mpfr_pow_z(r->mpg_numbr, t1->mpg_numbr, t2->mpg_i, ROUND_MODE);
+		else {
+			mpfr_ptr p1;
+			p1 = MP_FLOAT(t1);
+			tval = mpfr_pow(r->mpg_numbr, p1, t2->mpg_numbr, ROUND_MODE);
+		}
+		IEEE_FMT(r->mpg_numbr, tval);
+	}
+	return r;
+}
+
+/* mpg_div --- arbitrary-precision division */
+
+static NODE *
+mpg_div(NODE *t1, NODE *t2)
+{
+	NODE *r;
+	int tval;
+
+	if (is_mpg_integer(t1) && is_mpg_integer(t2)
+			&& (mpz_sgn(t2->mpg_i) != 0)	/* not dividing by 0 */
+			&& mpz_divisible_p(t1->mpg_i, t2->mpg_i)
+	) {
+		r = mpg_integer();
+		mpz_divexact(r->mpg_i, t1->mpg_i, t2->mpg_i);
+	} else {
+		mpfr_ptr p1, p2;
+		p1 = MP_FLOAT(t1);
+		p2 = MP_FLOAT(t2);
+		r = mpg_float();
+		tval = mpfr_div(r->mpg_numbr, p1, p2, ROUND_MODE);
+		IEEE_FMT(r->mpg_numbr, tval);
+	}
+	return r;
+}
+
+/* mpg_mod --- modulus operation with arbitrary-precision numbers */
+
+static NODE *
+mpg_mod(NODE *t1, NODE *t2)
+{
+	NODE *r;
+	int tval;
+
+	if (is_mpg_integer(t1) && is_mpg_integer(t2)) {
+		/*
+		 * 8/2014: Originally, this was just
+		 *
+		 * r = mpg_integer();
+		 * mpz_mod(r->mpg_i, t1->mpg_i, t2->mpg_i);
+		 *
+		 * But that gave very strange results with negative numerator:
+		 *
+		 *	$ ./gawk -M 'BEGIN { print -15 % 7 }'
+		 *	6
+		 *
+		 * So instead we use mpz_tdiv_qr() to get the correct result
+		 * and just throw away the quotient. We could not find any
+		 * reason why mpz_mod() wasn't working correctly.
+		 */
+		NODE *dummy_quotient;
+
+		r = mpg_integer();
+		dummy_quotient = mpg_integer();
+		mpz_tdiv_qr(dummy_quotient->mpg_i, r->mpg_i, t1->mpg_i, t2->mpg_i);
+		unref(dummy_quotient);
+	} else {
+		mpfr_ptr p1, p2;
+		p1 = MP_FLOAT(t1);
+		p2 = MP_FLOAT(t2);
+		r = mpg_float();
+		tval = mpfr_fmod(r->mpg_numbr, p1, p2, ROUND_MODE);
+		IEEE_FMT(r->mpg_numbr, tval);
+	}
+	return r;
+}
+
+/*
+ * mpg_interpret --- pre-exec hook in the interpreter. Handles
+ *	arithmetic operations with MPFR/GMP numbers.
+ */
+
+static int
+mpg_interpret(INSTRUCTION **cp)
+{
+	INSTRUCTION *pc = *cp;	/* current instruction */
+	OPCODE op;	/* current opcode */
+	NODE *r = NULL;
+	NODE *t1, *t2;
+	NODE **lhs;
+	int tval;	/* the ternary value returned by a MPFR function */
+
+	switch ((op = pc->opcode)) {
+	case Op_plus_i:
+		t2 = force_number(pc->memory);
+		goto plus;
+	case Op_plus:
+		t2 = POP_NUMBER();
+plus:
+		t1 = TOP_NUMBER();
+		r = mpg_add(t1, t2);
+		DEREF(t1);
+		if (op == Op_plus)
+			DEREF(t2);
+		REPLACE(r);
+		break;
+
+	case Op_minus_i:
+		t2 = force_number(pc->memory);
+		goto minus;
+	case Op_minus:
+		t2 = POP_NUMBER();
+minus:
+		t1 = TOP_NUMBER();
+		r = mpg_sub(t1, t2);
+		DEREF(t1);
+		if (op == Op_minus)
+			DEREF(t2);
+		REPLACE(r);
+		break;
+
+	case Op_times_i:
+		t2 = force_number(pc->memory);
+		goto times;
+	case Op_times:
+		t2 = POP_NUMBER();
+times:
+		t1 = TOP_NUMBER();
+		r = mpg_mul(t1, t2);
+		DEREF(t1);
+		if (op == Op_times)
+			DEREF(t2);
+		REPLACE(r);
+		break;
+
+	case Op_exp_i:
+		t2 = force_number(pc->memory);
+		goto exp;
+	case Op_exp:
+		t2 = POP_NUMBER();
+exp:
+		t1 = TOP_NUMBER();
+		r = mpg_pow(t1, t2);
+		DEREF(t1);
+		if (op == Op_exp)
+			DEREF(t2);
+		REPLACE(r);
+		break;
+
+	case Op_quotient_i:
+		t2 = force_number(pc->memory);
+		goto quotient;
+	case Op_quotient:
+		t2 = POP_NUMBER();
+quotient:
+		t1 = TOP_NUMBER();
+		r = mpg_div(t1, t2);
+		DEREF(t1);
+		if (op == Op_quotient)
+			DEREF(t2);
+		REPLACE(r);
+		break;
+
+	case Op_mod_i:
+		t2 = force_number(pc->memory);
+		goto mod;
+	case Op_mod:
+		t2 = POP_NUMBER();
+mod:
+		t1 = TOP_NUMBER();
+		r = mpg_mod(t1, t2);
+		DEREF(t1);
+		if (op == Op_mod)
+			DEREF(t2);
+		REPLACE(r);
+		break;
+
+	case Op_preincrement:
+	case Op_predecrement:
+		lhs = TOP_ADDRESS();
+		t1 = *lhs;
+		force_number(t1);
+
+		if (is_mpg_integer(t1)) {
+			if (t1->valref == 1 && t1->flags == (MALLOC|MPZN|NUMCUR|NUMBER))
+			/* Efficiency hack. Big speed-up (> 30%) in a tight loop */
+				r = t1;
+			else
+				r = *lhs = mpg_integer();
+			if (op == Op_preincrement)
+				mpz_add_ui(r->mpg_i, t1->mpg_i, 1);
+			else
+				mpz_sub_ui(r->mpg_i, t1->mpg_i, 1);
+		} else {
+
+			/*
+			 * An optimization like the one above is not going to work
+			 * for a floating-point number. With it,
+			 *   gawk -M 'BEGIN { PREC=53; i=2^53+0.0; PREC=113; ++i; print i}'
+		 	 * will output 2^53 instead of 2^53+1.
+		 	 */
+
+			r = *lhs = mpg_float();
+			tval = mpfr_add_si(r->mpg_numbr, t1->mpg_numbr,
+					op == Op_preincrement ? 1 : -1,
+					ROUND_MODE);
+			IEEE_FMT(r->mpg_numbr, tval);
+		}
+		if (r != t1)
+			unref(t1);
+		UPREF(r);
+		REPLACE(r);
+		break;
+
+	case Op_postincrement:
+	case Op_postdecrement:
+		lhs = TOP_ADDRESS();
+		t1 = *lhs;
+		force_number(t1);
+
+		if (is_mpg_integer(t1)) {
+			r = mpg_integer();
+			mpz_set(r->mpg_i, t1->mpg_i);
+			if (t1->valref == 1 && t1->flags == (MALLOC|MPZN|NUMCUR|NUMBER))
+			/* Efficiency hack. Big speed-up (> 30%) in a tight loop */
+				t2 = t1;
+			else
+				t2 = *lhs = mpg_integer();
+			if (op == Op_postincrement)
+				mpz_add_ui(t2->mpg_i, t1->mpg_i, 1);
+			else
+				mpz_sub_ui(t2->mpg_i, t1->mpg_i, 1);
+		} else {
+			r = mpg_float();
+			tval = mpfr_set(r->mpg_numbr, t1->mpg_numbr, ROUND_MODE);
+			IEEE_FMT(r->mpg_numbr, tval);
+			t2 = *lhs = mpg_float();
+			tval = mpfr_add_si(t2->mpg_numbr, t1->mpg_numbr,
+					op == Op_postincrement ? 1 : -1,
+					ROUND_MODE);
+			IEEE_FMT(t2->mpg_numbr, tval);
+		}
+		if (t2 != t1)
+			unref(t1);
+		REPLACE(r);
+		break;
+
+	case Op_unary_minus:
+		t1 = TOP_NUMBER();
+		if (is_mpg_float(t1)) {
+			r = mpg_float();
+			tval = mpfr_neg(r->mpg_numbr, t1->mpg_numbr, ROUND_MODE);
+			IEEE_FMT(r->mpg_numbr, tval);
+		} else {
+			r = mpg_integer();
+			mpz_neg(r->mpg_i, t1->mpg_i);
+		}
+		DEREF(t1);
+		REPLACE(r);
+		break;
+
+	case Op_unary_plus:
+		t1 = TOP_NUMBER();
+		if (is_mpg_float(t1)) {
+			r = mpg_float();
+			tval = mpfr_set(r->mpg_numbr, t1->mpg_numbr, ROUND_MODE);
+			IEEE_FMT(r->mpg_numbr, tval);
+		} else {
+			r = mpg_integer();
+			mpz_set(r->mpg_i, t1->mpg_i);
+		}
+		DEREF(t1);
+		REPLACE(r);
+		break;
+
+	case Op_assign_plus:
+	case Op_assign_minus:
+	case Op_assign_times:
+	case Op_assign_quotient:
+	case Op_assign_mod:
+	case Op_assign_exp:
+		lhs = POP_ADDRESS();
+		t1 = *lhs;
+		force_number(t1);
+		t2 = TOP_NUMBER();
+
+		switch (op) {
+		case Op_assign_plus:
+			r = mpg_add(t1, t2);
+			break;
+		case Op_assign_minus:
+			r = mpg_sub(t1, t2);
+			break;
+		case Op_assign_times:
+			r = mpg_mul(t1, t2);
+			break;
+		case Op_assign_quotient:
+			r = mpg_div(t1, t2);
+			break;
+		case Op_assign_mod:
+			r = mpg_mod(t1, t2);
+			break;
+		case Op_assign_exp:
+			r = mpg_pow(t1, t2);
+			break;
+		default:
+			cant_happen();
+		}
+
+		DEREF(t2);
+		unref(*lhs);
+		*lhs = r;
+		UPREF(r);
+		REPLACE(r);
+		break;
+
+	default:
+		return true;	/* unhandled */
+	}
+
+	*cp = pc->nexti;	/* next instruction to execute */
+	return false;
+}
+
+
+/* mpg_fmt --- output formatted string with special MPFR/GMP conversion specifiers */
+
+const char *
+mpg_fmt(const char *mesg, ...)
+{
+	static char *tmp = NULL;
+	int ret;
+	va_list args;
+
+	if (tmp != NULL) {
+		mpfr_free_str(tmp);
+		tmp = NULL;
+	}
+	va_start(args, mesg);
+	ret = mpfr_vasprintf(& tmp, mesg, args);
+	va_end(args);
+	if (ret >= 0 && tmp != NULL)
+		return tmp;
+	return mesg;
+}
+
+/* mpfr_unset --- clear out the MPFR values */
+
+void
+mpfr_unset(NODE *n)
+{
+	if (is_mpg_float(n))
+		mpfr_clear(n->mpg_numbr);
+	else if (is_mpg_integer(n))
+		mpz_clear(n->mpg_i);
+}
+
+#else
+
+void
+set_PREC()
+{
+	/* dummy function */
+}
+
+void
+set_ROUNDMODE()
+{
+	/* dummy function */
+}
+
+void
+mpfr_unset(NODE *n)
+{
+	/* dummy function */
+}
+#endif
diff --git a/gawk-5.0.1/msg.c b/gawk-5.0.1/msg.c
new file mode 100644
index 00000000000..32f152ab136
--- /dev/null
+++ b/gawk-5.0.1/msg.c
@@ -0,0 +1,198 @@
+/*
+ * msg.c - routines for error messages.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2001, 2003, 2010-2013, 2017, 2018,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+extern FILE *output_fp;
+int sourceline = 0;
+char *source = NULL;
+static const char *srcfile = NULL;
+static int srcline;
+
+jmp_buf fatal_tag;
+int fatal_tag_valid = 0;
+
+/* err --- print an error message with source line and file and record */
+
+/* VARARGS2 */
+void
+err(bool isfatal, const char *s, const char *emsg, va_list argp)
+{
+	char *file;
+	const char *me;
+
+	static bool first = true;
+	static bool add_src_info = false;
+	static long lineno_val = 0;	// Easter Egg
+
+	if (first) {
+		first = false;
+		add_src_info = (getenv("GAWK_MSG_SRC") != NULL);
+		if (! do_traditional) {
+			NODE *n = lookup("LINENO");
+
+			if (n != NULL && n->type == Node_var)
+				lineno_val = get_number_d(n->var_value);
+		}
+	}
+
+	(void) fflush(output_fp);
+	me = myname;
+	(void) fprintf(stderr, "%s: ", me);
+
+	if (srcfile != NULL && add_src_info) {
+		fprintf(stderr, "%s:%d:", srcfile, srcline);
+		srcfile = NULL;
+	}
+
+	if (sourceline > 0) {
+		if (source != NULL)
+			(void) fprintf(stderr, "%s:", source);
+		else
+			(void) fprintf(stderr, _("cmd. line:"));
+
+		(void) fprintf(stderr, "%ld: ", sourceline + lineno_val);
+	}
+
+#ifdef HAVE_MPFR
+	if (FNR_node && is_mpg_number(FNR_node->var_value)) {
+		NODE *val;
+		val = mpg_update_var(FNR_node);
+		assert((val->flags & MPZN) != 0);
+		if (mpz_sgn(val->mpg_i) > 0) {
+			int len = FILENAME_node->var_value->stlen;
+			file = FILENAME_node->var_value->stptr;
+			(void) putc('(', stderr);
+			if (file)
+				(void) fprintf(stderr, "FILENAME=%.*s ", len, file);
+			(void) mpfr_fprintf(stderr, "FNR=%Zd) ", val->mpg_i);
+		}
+	} else
+#endif
+	if (FNR > 0) {
+		int len = FILENAME_node->var_value->stlen;
+		file = FILENAME_node->var_value->stptr;
+		(void) putc('(', stderr);
+		if (file)
+			(void) fprintf(stderr, "FILENAME=%.*s ", len, file);
+		(void) fprintf(stderr, "FNR=%ld) ", FNR);
+	}
+
+	(void) fprintf(stderr, "%s", s);
+	vfprintf(stderr, emsg, argp);
+	(void) fprintf(stderr, "\n");
+	(void) fflush(stderr);
+
+	if (isfatal) {
+#ifdef GAWKDEBUG
+		// GLIBC 2.27 doesn't necessarily flush on abort. Sigh.
+		fflush(NULL);
+		abort();
+#endif
+		gawk_exit(EXIT_FATAL);
+	}
+}
+
+/* msg --- take a varargs error message and print it */
+
+void
+msg(const char *mesg, ...)
+{
+	va_list args;
+	va_start(args, mesg);
+	err(false, "", mesg, args);
+	va_end(args);
+}
+
+/* r_warning --- print a warning message */
+
+void
+r_warning(const char *mesg, ...)
+{
+	va_list args;
+	va_start(args, mesg);
+	err(false, _("warning: "), mesg, args);
+	va_end(args);
+}
+
+void
+error(const char *mesg, ...)
+{
+	va_list args;
+	va_start(args, mesg);
+	err(false, _("error: "), mesg, args);
+	va_end(args);
+}
+
+/* set_loc --- set location where a fatal error happened */
+
+void
+set_loc(const char *file, int line)
+{
+	srcfile = file;
+	srcline = line;
+
+	/* This stupid line keeps some compilers happy: */
+	file = srcfile; line = srcline;
+}
+
+/* r_fatal --- print a fatal error message */
+
+void
+r_fatal(const char *mesg, ...)
+{
+	va_list args;
+	va_start(args, mesg);
+	err(true, _("fatal: "), mesg, args);
+	va_end(args);
+}
+
+/* gawk_exit --- longjmp out if necessary */
+
+void
+gawk_exit(int status)
+{
+	if (fatal_tag_valid) {
+		exit_val = status;
+		longjmp(fatal_tag, 1);
+	}
+
+	final_exit(status);
+}
+
+/* final_exit --- run extension exit handlers and exit */
+
+void
+final_exit(int status)
+{
+	/* run any extension exit handlers */
+	run_ext_exit_handlers(status);
+
+	/* we could close_io() here */
+	close_extensions();
+
+	exit(status);
+}
diff --git a/gawk-5.0.1/node.c b/gawk-5.0.1/node.c
new file mode 100644
index 00000000000..2f9e6d4c837
--- /dev/null
+++ b/gawk-5.0.1/node.c
@@ -0,0 +1,1066 @@
+/*
+ * node.c -- routines for node management
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2001, 2003-2015, 2017, 2018,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+#include "math.h"
+#include "floatmagic.h"	/* definition of isnan */
+
+static int is_ieee_magic_val(const char *val);
+static NODE *r_make_number(double x);
+static AWKNUM get_ieee_magic_val(char *val);
+extern NODE **fmt_list;          /* declared in eval.c */
+
+NODE *(*make_number)(double) = r_make_number;
+NODE *(*str2number)(NODE *) = r_force_number;
+NODE *(*format_val)(const char *, int, NODE *) = r_format_val;
+int (*cmp_numbers)(const NODE *, const NODE *) = cmp_awknums;
+
+/* is_hex --- return true if a string looks like a hex value */
+
+static bool
+is_hex(const char *str, const char *cpend)
+{
+	/* on entry, we know the string length is >= 1 */
+	if (*str == '-' || *str == '+')
+		str++;
+
+	if (str + 1 < cpend && str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
+		return true;
+
+	return false;
+}
+
+/* force_number --- force a value to be numeric */
+
+NODE *
+r_force_number(NODE *n)
+{
+	char *cp;
+	char *cpend;
+	char save;
+	char *ptr;
+	extern double strtod();
+
+	if ((n->flags & NUMCUR) != 0)
+		return n;
+
+	/*
+	 * We should always set NUMCUR. If USER_INPUT is set and it's a
+	 * numeric string, we clear STRING and enable NUMBER, but if it's not
+	 * numeric, we disable USER_INPUT.
+	 */
+
+	/* All the conditionals are an attempt to avoid the expensive strtod */
+
+	n->flags |= NUMCUR;
+	n->numbr = 0.0;
+
+	/* Trim leading white space, bailing out if there's nothing else */
+	for (cp = n->stptr, cpend = cp + n->stlen;
+	     cp < cpend && isspace((unsigned char) *cp); cp++)
+		continue;
+
+	if (cp == cpend)
+		goto badnum;
+
+	/* At this point, we know the string is not entirely white space */
+	/* Trim trailing white space */
+	while (isspace((unsigned char) cpend[-1]))
+		cpend--;
+
+	/*
+	 * 2/2007:
+	 * POSIX, by way of severe language lawyering, seems to
+	 * allow things like "inf" and "nan" to mean something.
+	 * So if do_posix, the user gets what he deserves.
+	 * This also allows hexadecimal floating point. Ugh.
+	 */
+	if (! do_posix) {
+		if (is_alpha((unsigned char) *cp))
+			goto badnum;
+		else if (cpend == cp+4 && is_ieee_magic_val(cp)) {
+			n->numbr = get_ieee_magic_val(cp);
+			goto goodnum;
+		}
+		/* else
+			fall through */
+	}
+	/* else POSIX, so
+		fall through */
+
+	if (   (! do_posix		/* not POSIXLY paranoid and */
+	        && (is_alpha((unsigned char) *cp)	/* letter, or */
+					/* CANNOT do non-decimal and saw 0x */
+		    || (! do_non_decimal_data && is_hex(cp, cpend))))) {
+		goto badnum;
+	}
+
+	if (cpend - cp == 1) {		/* only one character */
+		if (isdigit((unsigned char) *cp)) {	/* it's a digit! */
+			n->numbr = (AWKNUM)(*cp - '0');
+			if (n->stlen == 1)		/* no white space */
+				n->flags |= NUMINT;
+			goto goodnum;
+		}
+		goto badnum;
+	}
+
+	errno = 0;
+	if (do_non_decimal_data		/* main.c assures false if do_posix */
+		&& ! do_traditional && get_numbase(cp, cpend - cp, true) != 10) {
+		/* nondec2awknum() saves and restores the byte after the string itself */
+		n->numbr = nondec2awknum(cp, cpend - cp, &ptr);
+	} else {
+		save = *cpend;
+		*cpend = '\0';
+		n->numbr = (AWKNUM) strtod((const char *) cp, &ptr);
+		*cpend = save;
+	}
+
+	if (errno == 0 || errno == ERANGE) {
+		errno = 0;	/* reset in case of ERANGE */
+		if (ptr == cpend)
+			goto goodnum;
+		/* else keep the leading numeric value without updating flags */
+		/* fall through to badnum */
+	} else {
+		errno = 0;
+		/*
+		 * N.B. For subnormal values, strtod may return the
+		 * floating-point representation while setting errno to ERANGE.
+		 * We force the numeric value to 0 in such cases.
+		 */
+		n->numbr = 0;
+		/*
+		 * Or should we accept it as a NUMBER even though strtod
+		 * threw an error?
+		 */
+		/* fall through to badnum */
+	}
+badnum:
+	n->flags &= ~USER_INPUT;
+	return n;
+
+goodnum:
+	if ((n->flags & USER_INPUT) != 0) {
+		/* leave USER_INPUT enabled to indicate that this is a strnum */
+		n->flags &= ~STRING;
+		n->flags |= NUMBER;
+	}
+	return n;
+}
+
+
+/*
+ * The following lookup table is used as an optimization in force_string;
+ * (more complicated) variations on this theme didn't seem to pay off, but
+ * systematic testing might be in order at some point.
+ */
+static const char *values[] = {
+	"0",
+	"1",
+	"2",
+	"3",
+	"4",
+	"5",
+	"6",
+	"7",
+	"8",
+	"9",
+};
+#define	NVAL	(sizeof(values)/sizeof(values[0]))
+
+/* r_format_val --- format a numeric value based on format */
+
+NODE *
+r_format_val(const char *format, int index, NODE *s)
+{
+	char buf[BUFSIZ];
+	char *sp = buf;
+	double val;
+
+	/*
+	 * 2/2007: Simplify our lives here. Instead of worrying about
+	 * whether or not the value will fit into a long just so we
+	 * can use sprintf("%ld", val) on it, always format it ourselves.
+	 * The only thing to worry about is that integral values always
+	 * format as integers. %.0f does that very well.
+	 *
+	 * 6/2008: Would that things were so simple. Always using %.0f
+	 * imposes a notable performance penalty for applications that
+	 * do a lot of conversion of integers to strings. So, we reinstate
+	 * the old code, but use %.0f for integral values that are outside
+	 * the range of a long.  This seems a reasonable compromise.
+	 *
+	 * 12/2009: Use <= and >= in the comparisons with LONG_xxx instead of
+	 * < and > so that things work correctly on systems with 64 bit integers.
+	 */
+
+	if (out_of_range(s)) {
+		const char *result = format_nan_inf(s, 'g');
+		return make_string(result, strlen(result));
+	} else if ((val = double_to_int(s->numbr)) != s->numbr
+			|| val <= LONG_MIN || val >= LONG_MAX
+	) {
+		/* not an integral value, or out of integer range */
+		/*
+		 * Once upon a time, we just blindly did this:
+		 *	sprintf(sp, format, s->numbr);
+		 *	s->stlen = strlen(sp);
+		 *	s->stfmt = index;
+		 * but that's no good if, e.g., OFMT is %s. So we punt,
+		 * and just always format the value ourselves.
+		 */
+
+		NODE *dummy[2], *r;
+		unsigned int oflags;
+
+		/* create dummy node for a sole use of format_tree */
+		dummy[1] = s;
+		oflags = s->flags;
+
+		if (val == s->numbr) {
+			/* integral value, but outside range of %ld, use %.0f */
+			r = format_tree("%.0f", 4, dummy, 2);
+			s->stfmt = STFMT_UNUSED;
+		} else {
+			r = format_tree(format, fmt_list[index]->stlen, dummy, 2);
+			assert(r != NULL);
+			s->stfmt = index;
+		}
+		s->flags = oflags;
+		s->stlen = r->stlen;
+		if ((s->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
+			efree(s->stptr);
+		s->stptr = r->stptr;
+#ifdef HAVE_MPFR
+		s->strndmode = MPFR_round_mode;
+#endif
+		freenode(r);	/* Do not unref(r)! We want to keep s->stptr == r->stpr.  */
+
+		goto no_malloc;
+	} else {
+		/*
+		 * integral value; force conversion to long only once.
+		 */
+		long num = (long) val;
+
+		if (num < NVAL && num >= 0) {
+			sp = (char *) values[num];
+			s->stlen = 1;
+		} else {
+			(void) sprintf(sp, "%ld", num);
+			s->stlen = strlen(sp);
+		}
+		s->stfmt = STFMT_UNUSED;
+		if ((s->flags & INTIND) != 0) {
+			s->flags &= ~(INTIND|NUMBER);
+			s->flags |= STRING;
+		}
+#ifdef HAVE_MPFR
+		s->strndmode = MPFR_round_mode;
+#endif
+	}
+	if ((s->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
+		efree(s->stptr);
+	emalloc(s->stptr, char *, s->stlen + 1, "format_val");
+	memcpy(s->stptr, sp, s->stlen + 1);
+no_malloc:
+	s->flags |= STRCUR;
+	free_wstr(s);
+	return s;
+}
+
+/* r_dupnode --- duplicate a node */
+
+NODE *
+r_dupnode(NODE *n)
+{
+	NODE *r;
+
+	assert(n->type == Node_val);
+
+#ifdef GAWKDEBUG
+	if ((n->flags & MALLOC) != 0) {
+		n->valref++;
+		return n;
+	}
+#endif
+
+#ifdef HAVE_MPFR
+	if ((n->flags & MPZN) != 0) {
+		r = mpg_integer();
+		mpz_set(r->mpg_i, n->mpg_i);
+		r->flags = n->flags;
+	} else if ((n->flags & MPFN) != 0) {
+		r = mpg_float();
+		int tval = mpfr_set(r->mpg_numbr, n->mpg_numbr, ROUND_MODE);
+		IEEE_FMT(r->mpg_numbr, tval);
+		r->flags = n->flags;
+	} else {
+#endif
+		getnode(r);
+		*r = *n;
+#ifdef HAVE_MPFR
+	}
+#endif
+
+	r->flags |= MALLOC;
+	r->valref = 1;
+	/*
+	 * DON'T call free_wstr(r) here!
+	 * r->wstptr still points at n->wstptr's value, and we
+	 * don't want to free it!
+	 */
+	r->wstptr = NULL;
+	r->wstlen = 0;
+
+	if ((n->flags & STRCUR) != 0) {
+		emalloc(r->stptr, char *, n->stlen + 1, "r_dupnode");
+		memcpy(r->stptr, n->stptr, n->stlen);
+		r->stptr[n->stlen] = '\0';
+		if ((n->flags & WSTRCUR) != 0) {
+			r->wstlen = n->wstlen;
+			emalloc(r->wstptr, wchar_t *, sizeof(wchar_t) * (n->wstlen + 1), "r_dupnode");
+			memcpy(r->wstptr, n->wstptr, n->wstlen * sizeof(wchar_t));
+			r->wstptr[n->wstlen] = L'\0';
+			r->flags |= WSTRCUR;
+		}
+	}
+
+	return r;
+}
+
+/* r_make_number --- allocate a node with defined number */
+
+static NODE *
+r_make_number(double x)
+{
+	NODE *r = make_number_node(0);
+	r->numbr = x;
+	return r;
+}
+
+/* cmp_awknums --- compare two AWKNUMs */
+
+int
+cmp_awknums(const NODE *t1, const NODE *t2)
+{
+	/*
+	 * This routine is also used to sort numeric array indices or values.
+	 * For the purposes of sorting, NaN is considered greater than
+	 * any other value, and all NaN values are considered equivalent and equal.
+	 * This isn't in compliance with IEEE standard, but compliance w.r.t. NaN
+	 * comparison at the awk level is a different issue, and needs to be dealt
+	 * with in the interpreter for each opcode seperately.
+	 */
+
+	if (isnan(t1->numbr))
+		return ! isnan(t2->numbr);
+	if (isnan(t2->numbr))
+		return -1;
+	/* don't subtract, in case one or both are infinite */
+	if (t1->numbr == t2->numbr)
+		return 0;
+	if (t1->numbr < t2->numbr)
+		return -1;
+	return 1;
+}
+
+
+/* make_str_node --- make a string node */
+
+NODE *
+make_str_node(const char *s, size_t len, int flags)
+{
+	NODE *r;
+	getnode(r);
+	r->type = Node_val;
+	r->numbr = 0;
+	r->flags = (MALLOC|STRING|STRCUR);
+	r->valref = 1;
+	r->stfmt = STFMT_UNUSED;
+#ifdef HAVE_MPFR
+	r->strndmode = MPFR_round_mode;
+#endif
+	r->wstptr = NULL;
+	r->wstlen = 0;
+
+	if ((flags & ALREADY_MALLOCED) != 0)
+		r->stptr = (char *) s;
+	else {
+		emalloc(r->stptr, char *, len + 1, "make_str_node");
+		memcpy(r->stptr, s, len);
+	}
+	r->stptr[len] = '\0';
+
+	if ((flags & SCAN) != 0) {	/* scan for escape sequences */
+		const char *pf;
+		char *ptm;
+		int c;
+		const char *end;
+		mbstate_t cur_state;
+
+		memset(& cur_state, 0, sizeof(cur_state));
+
+		end = &(r->stptr[len]);
+		for (pf = ptm = r->stptr; pf < end;) {
+			/*
+			 * Keep multibyte characters together. This avoids
+			 * problems if a subsequent byte of a multibyte
+			 * character happens to be a backslash.
+			 */
+			if (gawk_mb_cur_max > 1) {
+				int mblen = mbrlen(pf, end-pf, &cur_state);
+
+				if (mblen > 1) {
+					int i;
+
+					for (i = 0; i < mblen; i++)
+						*ptm++ = *pf++;
+					continue;
+				}
+			}
+
+			c = *pf++;
+			if (c == '\\') {
+				c = parse_escape(&pf);
+				if (c < 0) {
+					if (do_lint)
+						lintwarn(_("backslash string continuation is not portable"));
+					if ((flags & ELIDE_BACK_NL) != 0)
+						continue;
+					c = '\\';
+				}
+				*ptm++ = c;
+			} else
+				*ptm++ = c;
+		}
+		len = ptm - r->stptr;
+		erealloc(r->stptr, char *, len + 1, "make_str_node");
+		r->stptr[len] = '\0';
+	}
+	r->stlen = len;
+
+	return r;
+}
+
+/* make_typed_regex --- make a typed regex node */
+
+NODE *
+make_typed_regex(const char *re, size_t len)
+{
+	NODE *n, *exp, *n2;
+
+	exp = make_str_node(re, len, ALREADY_MALLOCED);
+	n = make_regnode(Node_regex, exp);
+	if (n == NULL)
+		fatal(_("could not make typed regex"));
+
+	n2 = make_string(re, len);
+	n2->typed_re = n;
+	n2->numbr = 0;
+	n2->flags |= NUMCUR|STRCUR|REGEX; 
+	n2->flags &= ~(STRING|NUMBER);
+
+	return n2;
+}
+
+
+/* unref --- remove reference to a particular node */
+
+void
+r_unref(NODE *tmp)
+{
+#ifdef GAWKDEBUG
+	if (tmp == NULL)
+		return;
+	if ((tmp->flags & MALLOC) != 0) {
+		if (tmp->valref > 1) {
+			tmp->valref--;
+			return;
+		}
+		if ((tmp->flags & STRCUR) != 0)
+			efree(tmp->stptr);
+	}
+#else
+	if ((tmp->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
+		efree(tmp->stptr);
+#endif
+
+	mpfr_unset(tmp);
+
+	free_wstr(tmp);
+	freenode(tmp);
+}
+
+
+/*
+ * parse_escape:
+ *
+ * Parse a C escape sequence.  STRING_PTR points to a variable containing a
+ * pointer to the string to parse.  That pointer is updated past the
+ * characters we use.  The value of the escape sequence is returned.
+ *
+ * A negative value means the sequence \ newline was seen, which is supposed to
+ * be equivalent to nothing at all.
+ *
+ * If \ is followed by a null character, we return a negative value and leave
+ * the string pointer pointing at the null character.
+ *
+ * If \ is followed by 000, we return 0 and leave the string pointer after the
+ * zeros.  A value of 0 does not mean end of string.
+ *
+ * POSIX doesn't allow \x.
+ */
+
+int
+parse_escape(const char **string_ptr)
+{
+	int c = *(*string_ptr)++;
+	int i;
+	int count;
+	int j;
+	const char *start;
+
+	if (do_lint_old) {
+		switch (c) {
+		case 'a':
+		case 'b':
+		case 'f':
+		case 'r':
+			warning(_("old awk does not support the `\\%c' escape sequence"), c);
+			break;
+		}
+	}
+
+	switch (c) {
+	case 'a':
+		return '\a';
+	case 'b':
+		return '\b';
+	case 'f':
+		return '\f';
+	case 'n':
+		return '\n';
+	case 'r':
+		return '\r';
+	case 't':
+		return '\t';
+	case 'v':
+		return '\v';
+	case '\n':
+		return -2;
+	case 0:
+		(*string_ptr)--;
+		return -1;
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+		i = c - '0';
+		count = 0;
+		while (++count < 3) {
+			if ((c = *(*string_ptr)++) >= '0' && c <= '7') {
+				i *= 8;
+				i += c - '0';
+			} else {
+				(*string_ptr)--;
+				break;
+			}
+		}
+		return i;
+	case 'x':
+		if (do_lint) {
+			static bool warned = false;
+
+			if (! warned) {
+				warned = true;
+				lintwarn(_("POSIX does not allow `\\x' escapes"));
+			}
+		}
+		if (do_posix)
+			return ('x');
+		if (! isxdigit((unsigned char) (*string_ptr)[0])) {
+			warning(_("no hex digits in `\\x' escape sequence"));
+			return ('x');
+		}
+		start = *string_ptr;
+		for (i = j = 0; j < 2; j++) {
+			/* do outside test to avoid multiple side effects */
+			c = *(*string_ptr)++;
+			if (isxdigit(c)) {
+				i *= 16;
+				if (isdigit(c))
+					i += c - '0';
+				else if (isupper(c))
+					i += c - 'A' + 10;
+				else
+					i += c - 'a' + 10;
+			} else {
+				(*string_ptr)--;
+				break;
+			}
+		}
+		if (do_lint && j > 2)
+			lintwarn(_("hex escape \\x%.*s of %d characters probably not interpreted the way you expect"), j, start, j);
+		return i;
+	case '\\':
+	case '"':
+		return c;
+	default:
+	{
+		static bool warned[256];
+		unsigned char uc = (unsigned char) c;
+
+		/* N.B.: use unsigned char here to avoid Latin-1 problems */
+
+		if (! warned[uc]) {
+			warned[uc] = true;
+
+			warning(_("escape sequence `\\%c' treated as plain `%c'"), uc, uc);
+		}
+	}
+		return c;
+	}
+}
+
+/* get_numbase --- return the base to use for the number in 's' */
+
+int
+get_numbase(const char *s, size_t len, bool use_locale)
+{
+	int dec_point = '.';
+	const char *str = s;
+
+#if defined(HAVE_LOCALE_H)
+	/*
+	 * loc.decimal_point may not have been initialized yet,
+	 * so double check it before using it.
+	 */
+	if (use_locale && loc.decimal_point != NULL && loc.decimal_point[0] != '\0')
+		dec_point = loc.decimal_point[0];	/* XXX --- assumes one char */
+#endif
+
+	if (len < 2 || str[0] != '0')
+		return 10;
+
+	/* leading 0x or 0X */
+	if (str[1] == 'x' || str[1] == 'X')
+		return 16;
+
+	/*
+	 * Numbers with '.', 'e', or 'E' are decimal.
+	 * Have to check so that things like 00.34 are handled right.
+	 *
+	 * These beasts can have trailing whitespace. Deal with that too.
+	 */
+	for (; len > 0; len--, str++) {
+		if (*str == 'e' || *str == 'E' || *str == dec_point)
+			return 10;
+		else if (! isdigit((unsigned char) *str))
+			break;
+	}
+
+	if (! isdigit((unsigned char) s[1])
+			|| s[1] == '8' || s[1] == '9'
+	)
+		return 10;
+	return 8;
+}
+
+/* str2wstr --- convert a multibyte string to a wide string */
+
+NODE *
+str2wstr(NODE *n, size_t **ptr)
+{
+	size_t i, count, src_count;
+	char *sp;
+	mbstate_t mbs;
+	wchar_t wc, *wsp;
+	static bool warned = false;
+
+	assert((n->flags & (STRING|STRCUR)) != 0);
+
+	/*
+	 * Don't convert global null string or global null field
+	 * variables to a wide string. They are both zero-length anyway.
+	 * This also avoids future double-free errors while releasing
+	 * shallow copies, eg. *tmp = *Null_field; free_wstr(tmp);
+	 */
+	if (n == Nnull_string || n == Null_field)
+		return n;
+
+	if ((n->flags & WSTRCUR) != 0) {
+		if (ptr == NULL)
+			return n;
+		/* otherwise
+			fall through and recompute to fill in the array */
+		free_wstr(n);
+	}
+
+	/*
+	 * After consideration and consultation, this
+	 * code trades space for time. We allocate
+	 * an array of wchar_t that is n->stlen long.
+	 * This is needed in the worst case anyway, where
+	 * each input byte maps to one wchar_t.  The
+	 * advantage is that we only have to convert the string
+	 * once, instead of twice, once to find out how many
+	 * wide characters, and then again to actually fill in
+	 * the info.  If there's a lot left over, we can
+	 * realloc the wide string down in size.
+	 */
+
+	emalloc(n->wstptr, wchar_t *, sizeof(wchar_t) * (n->stlen + 1), "str2wstr");
+	wsp = n->wstptr;
+
+	/*
+	 * For use by do_match, create and fill in an array.
+	 * For each byte `i' in n->stptr (the original string),
+	 * a[i] is equal to `j', where `j' is the corresponding wchar_t
+	 * in the converted wide string.
+	 *
+	 * Create the array.
+	 */
+	if (ptr != NULL) {
+		ezalloc(*ptr, size_t *, sizeof(size_t) * n->stlen, "str2wstr");
+	}
+
+	sp = n->stptr;
+	src_count = n->stlen;
+	memset(& mbs, 0, sizeof(mbs));
+	for (i = 0; src_count > 0; i++) {
+		/*
+		 * 9/2010: Check the current byte; if it's a valid character,
+		 * then it doesn't start a multibyte sequence. This brings a
+		 * big speed up. Thanks to Ulrich Drepper for the tip.
+		 * 11/2010: Thanks to Paolo Bonzini for some even faster code.
+		 */
+		if (is_valid_character(*sp)) {
+			count = 1;
+			wc = btowc_cache(*sp);
+		} else
+			count = mbrtowc(& wc, sp, src_count, & mbs);
+		switch (count) {
+		case (size_t) -2:
+		case (size_t) -1:
+			/*
+			 * mbrtowc(3) says the state of mbs becomes undefined
+			 * after a bad character, so reset it.
+			 */
+			memset(& mbs, 0, sizeof(mbs));
+
+			/* Warn the user something's wrong */
+			if (! warned) {
+				warned = true;
+				warning(_("Invalid multibyte data detected. There may be a mismatch between your data and your locale."));
+			}
+
+			/*
+			 * 8/2015: If we're using UTF, then instead of just
+			 * skipping the character, plug in the Unicode
+			 * replacement character. In most cases this gives
+			 * us "better" results, in that character counts
+			 * and string lengths tend to make more sense.
+			 *
+			 * Otherwise, just skip the bad byte and keep going,
+			 * so that we get a more-or-less full string, instead of
+			 * stopping early. This is particularly important
+			 * for match() where we need to build the indices.
+			 */
+			if (using_utf8()) {
+				count = 1;
+				wc = 0xFFFD;	/* unicode replacement character */
+				goto set_wc;
+			} else {
+				/* skip it and keep going */
+				sp++;
+				src_count--;
+			}
+			break;
+
+		case 0:
+			count = 1;
+			/* fall through */
+		default:
+		set_wc:
+			*wsp++ = wc;
+			src_count -= count;
+			while (count--)  {
+				if (ptr != NULL)
+					(*ptr)[sp - n->stptr] = i;
+				sp++;
+			}
+			break;
+		}
+	}
+
+	*wsp = L'\0';
+	n->wstlen = wsp - n->wstptr;
+	n->flags |= WSTRCUR;
+#define ARBITRARY_AMOUNT_TO_GIVE_BACK 100
+	if (n->stlen - n->wstlen > ARBITRARY_AMOUNT_TO_GIVE_BACK)
+		erealloc(n->wstptr, wchar_t *, sizeof(wchar_t) * (n->wstlen + 1), "str2wstr");
+
+	return n;
+}
+
+/* wstr2str --- convert a wide string back into multibyte one */
+
+NODE *
+wstr2str(NODE *n)
+{
+	size_t result;
+	size_t length;
+	wchar_t *wp;
+	mbstate_t mbs;
+	char *newval, *cp;
+
+	assert(n->valref == 1);
+	assert((n->flags & WSTRCUR) != 0);
+
+	/*
+	 * Convert the wide chars in t1->wstptr back into m.b. chars.
+	 * This is pretty grotty, but it's the most straightforward
+	 * way to do things.
+	 */
+	memset(& mbs, 0, sizeof(mbs));
+
+	length = n->wstlen;
+	emalloc(newval, char *, (length * gawk_mb_cur_max) + 1, "wstr2str");
+
+	wp = n->wstptr;
+	for (cp = newval; length > 0; length--) {
+		result = wcrtomb(cp, *wp, & mbs);
+		if (result == (size_t) -1)	/* what to do? break seems best */
+			break;
+		cp += result;
+		wp++;
+	}
+	*cp = '\0';
+
+	/* N.B. caller just created n with make_string, so this free is safe */
+	efree(n->stptr);
+	n->stptr = newval;
+	n->stlen = cp - newval;
+
+	return n;
+}
+
+/* free_wstr --- release the wide string part of a node */
+
+void
+r_free_wstr(NODE *n)
+{
+	assert(n->type == Node_val);
+
+	if ((n->flags & WSTRCUR) != 0) {
+		assert(n->wstptr != NULL);
+		efree(n->wstptr);
+	}
+	n->wstptr = NULL;
+	n->wstlen = 0;
+	n->flags &= ~WSTRCUR;
+}
+
+static void __attribute__ ((unused))
+dump_wstr(FILE *fp, const wchar_t *str, size_t len)
+{
+	if (str == NULL || len == 0)
+		return;
+
+	for (; len--; str++)
+		putwc(*str, fp);
+}
+
+/* wstrstr --- walk haystack, looking for needle, wide char version */
+
+const wchar_t *
+wstrstr(const wchar_t *haystack, size_t hs_len,
+	const wchar_t *needle, size_t needle_len)
+{
+	size_t i;
+
+	if (haystack == NULL || needle == NULL || needle_len > hs_len)
+		return NULL;
+
+	for (i = 0; i < hs_len; i++) {
+		if (haystack[i] == needle[0]
+		    && i+needle_len-1 < hs_len
+		    && haystack[i+needle_len-1] == needle[needle_len-1]) {
+			/* first & last chars match, check string */
+			if (memcmp(haystack+i, needle, sizeof(wchar_t) * needle_len) == 0) {
+				return haystack + i;
+			}
+		}
+	}
+
+	return NULL;
+}
+
+/* wcasestrstr --- walk haystack, nocase look for needle, wide char version */
+
+const wchar_t *
+wcasestrstr(const wchar_t *haystack, size_t hs_len,
+	const wchar_t *needle, size_t needle_len)
+{
+	size_t i, j;
+
+	if (haystack == NULL || needle == NULL || needle_len > hs_len)
+		return NULL;
+
+	for (i = 0; i < hs_len; i++) {
+		if (towlower(haystack[i]) == towlower(needle[0])
+		    && i+needle_len-1 < hs_len
+		    && towlower(haystack[i+needle_len-1]) == towlower(needle[needle_len-1])) {
+			/* first & last chars match, check string */
+			const wchar_t *start;
+
+			start = haystack+i;
+			for (j = 0; j < needle_len; j++, start++) {
+				wchar_t h, n;
+
+				h = towlower(*start);
+				n = towlower(needle[j]);
+				if (h != n)
+					goto out;
+			}
+			return haystack + i;
+		}
+out:	;
+	}
+
+	return NULL;
+}
+
+/* is_ieee_magic_val --- return true for +inf, -inf, +nan, -nan */
+
+static int
+is_ieee_magic_val(const char *val)
+{
+	/*
+	 * Avoid strncasecmp: it mishandles ASCII bytes in some locales.
+	 * Assume the length is 4, as the caller checks this.
+	 */
+	return (   (val[0] == '+' || val[0] == '-')
+		&& (   (   (val[1] == 'i' || val[1] == 'I')
+			&& (val[2] == 'n' || val[2] == 'N')
+			&& (val[3] == 'f' || val[3] == 'F'))
+		    || (   (val[1] == 'n' || val[1] == 'N')
+			&& (val[2] == 'a' || val[2] == 'A')
+			&& (val[3] == 'n' || val[3] == 'N'))));
+}
+
+/* get_ieee_magic_val --- return magic value for string */
+
+static AWKNUM
+get_ieee_magic_val(char *val)
+{
+	static bool first = true;
+	static AWKNUM inf;
+	static AWKNUM nan;
+	char save;
+
+	char *ptr;
+	save = val[4];
+	val[4] = '\0';
+	AWKNUM v = strtod(val, &ptr);
+	val[4] = save;
+
+	if (val == ptr) { /* Older strtod implementations don't support inf or nan. */
+		if (first) {
+			first = false;
+			nan = sqrt(-1.0);
+			inf = -log(0.0);
+		}
+
+		v = ((val[1] == 'i' || val[1] == 'I') ? inf : nan);
+		if (val[0] == '-')
+			v = -v;
+	}
+
+	return v;
+}
+
+wint_t btowc_cache[256];
+
+/* init_btowc_cache --- initialize the cache */
+
+void init_btowc_cache()
+{
+	int i;
+
+	for (i = 0; i < 255; i++) {
+		btowc_cache[i] = btowc(i);
+	}
+}
+
+#define BLOCKCHUNK 100
+
+struct block_header nextfree[BLOCK_MAX] = {
+	{ NULL, sizeof(NODE) },
+	{ NULL, sizeof(BUCKET) },
+#ifdef HAVE_MPFR
+	{ NULL, sizeof(mpfr_t) },
+	{ NULL, sizeof(mpz_t) },
+#endif
+};
+
+
+/* more_blocks --- get more blocks of memory and add to the free list;
+	size of a block must be >= sizeof(struct block_item)
+ */
+
+void *
+more_blocks(int id)
+{
+	struct block_item *freep, *np, *next;
+	char *p, *endp;
+	size_t size;
+
+	size = nextfree[id].size;
+
+	assert(size >= sizeof(struct block_item));
+	emalloc(freep, struct block_item *, BLOCKCHUNK * size, "more_blocks");
+	p = (char *) freep;
+	endp = p + BLOCKCHUNK * size;
+
+	for (np = freep; ; np = next) {
+		next = (struct block_item *) (p += size);
+		if (p >= endp) {
+			np->freep = NULL;
+			break;
+		}
+		np->freep = next;
+	}
+	nextfree[id].freep = freep->freep;
+	return freep;
+}
diff --git a/gawk-5.0.1/nonposix.h b/gawk-5.0.1/nonposix.h
new file mode 100644
index 00000000000..52fb21f2023
--- /dev/null
+++ b/gawk-5.0.1/nonposix.h
@@ -0,0 +1,99 @@
+/*
+ * nonposix.h --- definitions needed on non-POSIX systems.
+ */
+
+/*
+ * Copyright (C) 2012, 2013, 2016, 2017, 2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/*
+ * This is for fake directory file descriptors on systems that don't
+ * allow to open() a directory.
+ */
+
+#define FAKE_FD_VALUE 42
+
+#ifdef __MINGW32__
+/* Replacements for sys/wait.h macros.  */
+# define WEXITSTATUS(stv) (((unsigned)(stv)) & ~0xC0000000)
+/* MS-Windows programs that crash due to a fatal exception exit with
+   an exit code whose 2 MSB bits are set.  */
+# define WIFEXITED(stv)   ((((unsigned)(stv)) & 0xC0000000) == 0)
+# define WIFSIGNALED(stv) ((((unsigned)(stv)) & 0xC0000000) == 0xC0000000)
+# define WTERMSIG(stv)    w32_status_to_termsig ((unsigned)stv)
+# define WIFSTOPPED(stv)  (0)
+# define WSTOPSIG(stv)    (0)
+
+int w32_status_to_termsig (unsigned);
+
+/* Prototypes of for Posix functions for which we define replacements
+   in pc/ files.  */
+
+/* getid.c */
+unsigned int getuid (void);
+unsigned int geteuid (void);
+unsigned int getgid (void);
+unsigned int getegid (void);
+
+/* gawkmisc.pc */
+int unsetenv (const char *);
+int setenv (const char *, const char *, int);
+void w32_maybe_set_errno (void);
+char *w32_setlocale (int, const char *);
+/* libintl.h from GNU gettext defines setlocale to redirect that to
+   its own function.  Note: this will have to be revisited if MinGW
+   Gawk will support ENABLE_NLS at some point.  */
+#ifdef setlocale
+# undef setlocale
+#endif
+#define setlocale(c,v) w32_setlocale(c,v)
+
+#endif	/* __MINGW32__ */
+
+#if defined(VMS) || defined(__DJGPP__) || defined(__MINGW32__)
+int getpgrp(void);
+#endif
+
+#if defined(__DJGPP__) || defined(__MINGW32__)
+int getppid(void);
+#endif
+
+#ifdef __DJGPP__
+/* Prototypes of for Posix functions for which we define replacements
+   in pc/ files.  */
+wint_t btowc (int c);
+wint_t putwc (wchar_t wc, FILE *stream);
+#endif
+
+#ifdef __EMX__
+
+char *os2_fixdllname(char *dst, const char *src, size_t n);
+
+#ifdef __KLIBC__
+#include <dlfcn.h>
+
+#define dlopen(f, m) os2_dlopen(f, m)
+void *os2_dlopen(const char *file, int mode);
+
+#define dlsym(h, n) os2_dlsym(h, n)
+void *os2_dlsym(void *handle, const char *name);
+#endif /* __KLIBC__ */
+
+#endif /* __EMX__ */
diff --git a/gawk-5.0.1/pc/ChangeLog b/gawk-5.0.1/pc/ChangeLog
new file mode 100644
index 00000000000..d6224da0366
--- /dev/null
+++ b/gawk-5.0.1/pc/ChangeLog
@@ -0,0 +1,14 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-13  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile (install1): Copy the *.txt files needed to display the
+	manuals in the stand-alone Info reader.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/pc/ChangeLog.0 b/gawk-5.0.1/pc/ChangeLog.0
new file mode 100644
index 00000000000..95a36100db8
--- /dev/null
+++ b/gawk-5.0.1/pc/ChangeLog.0
@@ -0,0 +1,680 @@
+Mon Jun 20 20:37:19 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline version.
+
+Mon Jun 20 20:16:58 2011  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile (LIBOBJS): Remove hard-locale$O.
+	(dfa$O): Remove hard-locale.h from prerequisites.
+
+Sun Jun  5 21:47:33 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Tue May 31 23:09:13 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline version.
+
+Tue May 31 23:07:20 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst (fpat2): Fix the test.
+
+Thu May 26 22:12:28 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline version.
+
+Mon May 23 21:52:49 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Sat May 14 22:30:06 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline version.
+
+Mon May  9 15:13:18 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline version.
+
+Sun May  8 20:57:16 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline version.
+
+Mon May  2 23:34:54 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Fri Apr 29 12:35:21 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile: Remove dependencies on awkprintf.h.
+
+Sun Apr 24 11:54:58 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Fri Apr  1 11:50:59 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* config.h (ISATTY): Remove definition.
+	* gawkmisc.pc (os_iastty): New function.
+
+Sun Feb 27 22:58:08 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Mon Feb 21 20:32:36 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst (GAWK_EXT_TESTS): Include profile3. Thanks to
+	Scott Deifik for pointing out the omission.
+
+Wed Feb 16 21:09:50 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst (lintwarn): New test.
+
+Wed Feb 16 20:40:27 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Mon Feb 14 21:30:48 2011  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline version.
+
+Sun Feb 13 20:23:07 2011  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.pc (files_are_same): Change arguments.  Compare file
+	names and modification times in addition to devices and inodes.
+	* Makefile (LIBOBJS): Add hard-locale$O.
+	Update prerequisites.
+	* config.h (ISATTY) [__MINGW32__ || _MSC_VER]: Define.
+
+Mon Feb  7 22:45:28 2011  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline version.
+
+Tue Feb  1 23:15:45 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Thu Jan 27 21:31:23 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Fixes for dumpvars and mv, cp, et. al.
+
+Mon Jan 17 22:21:07 2011  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Mon Jan 17 22:17:07 2011  Arnold Robbins  <arnold@skeeve.com>
+
+	* config.h: Remove definitions of PIPES_SIMULATED and _NFILE for
+	DJGPP. Per Eli, they aren't needed here.
+
+2011-01-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* popen.c (scriptify): Fix syntax error.
+
+	* config.h (HAVE___ARGZ_COUNT, HAVE___ARGZ_NEXT)
+	(HAVE___ARGZ_STRINGIFY): Don't define.
+	(HAVE_PORTALS): Remove reference.
+
+	* gawkmisc.pc (unsetenv) [__DJGPP__]: Implement.
+	(usleep) [__MINGW32__]: Resurrect.
+
+Tue Jan  4 11:20:40 2011  Arnold Robbins  <arnold@skeeve.com>
+
+	* config.h: Add PIPES_SIMULATED and definition of _NFILE for
+	DJGPP.
+
+Sat Dec 18 22:12:42 2010  Arnold Robbins  <arnold@skeeve.com>
+
+	* gawkw32.def: Removed.
+	* Makefile (gawk.exp): Removed target and rule.
+
+Sat Dec 18 20:13:35 2010  Eli Zaretskii  <eliz@gnu.org>
+
+	* popen.h: Remove the parts conditioned by _MSC_VER and OS2.  Use
+	__DJGPP__ instead of __GO32__.
+
+	* popen.c (popen, pclose) [OS2, _MSC_VER]: Remove definitions.
+	(unixshell, scriptify, os_pclose): Remove OS2 parts.
+
+	* getid.c: Remove the parts conditioned by _MSC_VER and OS2.
+
+	* config.h: Remove the parts conditioned by _MSC_VER.
+
+	* Makefile: Drop support for DJGPP v1.x and for Microsoft
+	compilers on DOS/Windows.
+
+	* gawkmisc.pc (setenv, unsetenv) [__MINGW32__]: Emulations for MinGW.
+
+	* Makefile (DLMINGW32): New variable.
+	(mingw32): Pass it to sub-Make.
+
+	* dlfnc.h, dlfcn.c, include/*: Removed.
+
+Mon Nov 29 20:10:00 2010  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.h (HAVE_STRFTIME): Don't define for __MINGW32__.  Define
+	strftime to rpl_strftime, to avoid infinite recursion in
+	missing_d/strftime.c.
+
+Fri Nov 12 12:36:18 2010  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Thu Oct 28 08:17:00 2010  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+Wed Jul 14 23:05:57 2010  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.h (HAVE_USLEEP) [__MINGW32__]: Define.
+
+	* gawkmisc.pc (usleep) [__MINGW32__]: Implementation of `usleep'
+	for MinGW.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Mon May  3 21:15:49 2010  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst (lc_num1): Now passes, remove "expect to fail"
+	message.
+
+Tue Apr 13 22:13:51 2010  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* config.h, Makefile.tst: Sync with mainline.
+
+Tue Feb  2 20:49:20 2010  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Mon Jul 13 05:43:07 2009  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Still more sync with mainline.
+
+Tue Jun 23 05:24:12 2009  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: More sync with mainline.
+
+Thu Jun 18 06:24:29 2009  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2008-07-26  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.h (WEXITSTATUS) [_MSC_VER || __MINGW32__]: Define.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Sat Oct 20 22:42:08 2007  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline, Revise inftest.
+
+Fri Oct 19 05:37:37 2007  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* config.h: Add definition of HAVE_ATEXIT. Needed for replacement
+	sprintf.
+
+Thu Oct  4 21:19:54 2007  Juan M. Guerrero     <juan.guerrero@gmx.de>
+
+	* Makefile.tst (fmtspcl.ok): Remove unneeded dependency on Makefile.
+
+Wed Sep 26 15:10:17 2007  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst (poundbang): Fix path in call to gawk.
+	(nofile): Fix output message with sed to match what test suite wants.
+
+Wed Sep 26 14:46:34 2007  Eli Zaretskii      <eliz@gnu.org>
+
+	* Makefile.tst (msg): Use $(CMP) instead a literal "cmp".
+	(nonl): Use NUL instead of /dev/null.
+	(devfd, pid, fmtspcl, nofile, rstest4, rstest5, getlnhd, clos1way):
+	Expect to fail on MinGW.
+	(fmtspcl.ok): Depend on Makefile, not Makefile.tst.
+	(pipeio2, hsprint, fmttest): Expect formatting or whitespace
+	differences.
+	(exitval2): Use exitval2.w32 instead of exitval2.awk.
+
+	* config.h (HAVE_DECL_TZNAME) [__MINGW32__]: Define.
+	(HAVE_ALLOCA) [__MINGW32__]: Don't define.
+	(HAVE_SNPRINTF) [__MINGW32__]: Remove _MSC_VER condition.
+
+Tue Sep 25 08:22:11 2007  KIMURA Koichi        <kimura.koichi@canon.co.jp>
+
+	* config.h: For Visual Studio, undef restrict, define HAVE_TMPFILE,
+	undef TIME_WITH_SYS_TIME.
+
+Mon May 21 05:46:46 2007  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* config.h (HAVE_MKTIME): Define.
+
+Wed May 16 22:12:55 2007  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	* Makfile.tst: Changes for DJGPP, bring in sync with main
+	test/Makefile.
+
+Wed May  9 21:01:18 2007  Scott Deifik         <scottd.mail@sbcglobal.net>
+
+	DJGPP changes:
+
+	* config.h: Add HAVE_MKTME, HAVE_MKSTEMP, conditionalize
+	HAVE_SNPRINTF. (ADR: #define out restrict).
+	* Makefile: Add replace$0 to AWKOBJS2 and PAWKOBJS2.
+
+2007-03-19  Juan M. Guerrero  <juan.guerrero@gmx.de>
+
+	* config.h: Undef HAVE_ALLOCA for DJGPP.
+	* Makefile: Add floatcomp$O to AWKOBJS1 and PAWKOBJS1.
+
+2007-02-25  Juan M. Guerrero  <juan.guerrero@gmx.de>
+
+	* config.h: Let DEFPATH reflect DJGPP installation directory tree.
+	* Makefile: pkgdatadir variable defined to $(prefix)/lib/awk.
+	* Makefile: In DJGPP section use the DJGPP environment variable to
+	redefine the pkgdatadir variable.
+
+2006-07-22  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst: Update copyright years.
+	(COMSPEC): If it's empty, use ComSpec instead.
+	(CMP): Ignore white space differences.
+	(BASIC_TESTS): Add concat4, nofile, ovrflow1, subi18n.
+	(GAWK_EXT_TESTS): Add binmode1, devfd1, devfd2, fwtest, nondec2.
+	(msg): Use $(CMP) instead of literal "cmp".
+	(inftest): Uncomment the test.
+	(nonl): Use NUL, so it works with any DOS/Windows shell.
+	(fsspcoln): Run `head' though the system shell.
+	(nondec2, nofile, binmode1, subi18n, concat4, devfd1, devfd2)
+	(ovrflow1, fwtest, mixed1): New tests.
+	(fmttest, hsprint, ovrflow1, posix): Run output through Sed to
+	adjust the number of leading zeros in the exponent produced by %e.
+	(longwrds): Set SORT to just "sort".
+	(exitval2): Use exitval2.w32.
+
+2006-07-01  Eli Zaretskii  <eliz@gnu.org>
+
+	* popen.h (os_popen): Declare 1st argument "const char *".
+
+	* popen.c (scriptify): Declare argument "const char *".
+	(os_system): Declare argument "const char *".  Add a new local
+	variable cmd1 to hold the results of scriptify.
+	(os_popen): Declare 1st argument "const char *".  Add a new local
+	variable cmd to hold the results of scriptify.
+
+	* Makefile (mingw32): Update definitions for CF, LF, and LF2.  Use
+	libmsvcrtp60 during linking (for multibyte and wide character
+	support).
+	(io$O): Depend on popen.h.
+
+	* config.h (HAVE_BTOWC) [_WIN32]: Define.
+	(HAVE_INTMAX_T, HAVE_UINTMAX_T, HAVE_INTTYPES_H, HAVE_STDINT_H)
+	(HAVE_INTTYPES_H_WITH_UINTMAX, HAVE_ISASCII, HAVE_ISWCTYPE)
+	(HAVE_ISWLOWER, HAVE_ISWUPPER, HAVE_LONG_LONG, HAVE_MBRLEN)
+	(HAVE_MBRTOWC, HAVE_TOWLOWER, HAVE_TOWUPPER, HAVE_WCHAR_H)
+	(HAVE_WCRTOMB, HAVE_WCSCOLL, HAVE_WCTYPE, HAVE_WCTYPE_H)
+	(HAVE_WCTYPE_T, HAVE_WINT_T) [__MINGW32__]: Define.
+	(inline) [__GNUC__]: Define to __inline__.
+	(HAVE_MEMMOVE, HAVE_PUTENV, HAVE_SETLOCALE, HAVE_LOCALE_H)
+	(HAVE_SNPRINTF, HAVE_STRTOUL, HAVE_STDLIB_H, HAVE_SYS_STAT_H)
+	(HAVE_SYS_TIME_H, HAVE_UNSIGNED_LONG_LONG) [__MINGW32__]: Define.
+	(HAVE_UNISTD_H): Define also for __MINGW32__.
+	(PACKAGE_BUGREPORT, PACKAGE_NAME, PACKAGE_STRING)
+	(PACKAGE_TARNAME, PACKAGE_VERSION): Define.
+	(VERSION): Update.
+	[__MINGW32__]: Include <limits.h>.
+	(HAVE_POPEN_H): Define as 1.
+	(ssize_t, intmax_t, uintmax_t): Don't redefine for __MINGW32__.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Sun Jun 26 09:31:35 2005  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile: Decrease stack size for MSC.
+	* Makefile.tst (Maketests): Syncronized with what's happening in
+	the main dist.
+
+Thu Apr 28 23:08:51 2005  Scott Deifik         <scottd@amgen.com>
+
+	* config.h, Makefile.tst: Synced to main distribution.
+
+Wed Feb 16 10:20:18 2005  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile: Decrease stack size for MSC.
+	* Makefile.tst: Syncronized with what's happening in the main dist.
+	* config.h: Improved for DJGPP.
+
+Wed Feb  9 14:38:38 2005  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile, Makefile.tst: Syncronized with what's happening
+	in the main dist.
+
+Thu Feb  3 14:57:28 2005  Scott Deifik         <scottd@amgen.com>
+
+	* config.h (SIZEOF_UNSIGNED_INT, SIZEOF_UNSIGNED_LONG): Add definitions.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+Sun Jun 13 17:40:09 2004  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile: Reduce the stack size for MSC.
+	* Makefile.tst: Synchronized with main distribution.
+
+Sun Jun 13 17:39:47 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile (AWKOBJS2, PAWKOBJS2): Restore version.o.
+	
+Tue Jun  1 22:31:36 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile (AWKOBJS2, PAWKOBJS2): Remove version.o.
+	
+	Per Jim Meyering:
+	* popen.c (scriptify): Check `realloc' return value.
+
+Tue Mar  2 18:10:55 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile (LIBOJBS): Add `dfa$O' into list.
+	(main$O rule): Removed, since patchlev.h not part of dist
+	anymore.
+
+Tue Mar  2 18:09:54 2004  Scott Deifik         <scottd@amgen.com>
+
+	* config.h (HAVE_ALLOCA_H): Undefine.
+	* Makefile (LMSC): Adjust stack size for MSC.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+Thu Jun 26 15:00:20 2003  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile.tst: Synchronized to main dist.
+
+Sun Jun 15 19:27:58 2003  Patrick T.J. McPhee  <ptjm@interlog.com>
+
+	* config.h: Separate the ifdefs for os_system from ssize_t etc.
+
+Sun Jun 15 19:05:15 2003  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile.tst: Synchronized to main dist.
+
+Mon Jun  9 17:12:24 2003  Patrick T.J. McPhee  <ptjm@interlog.com>
+
+	* dlfcn.c, dlfcn.h, gawke32.def: New files.
+	* Makefile: Changes to allow dynamic linking of libraries
+	under Windows32.
+
+Sun May 11 15:19:52 2003  Scott Deifik         <scottd@amgen.com>
+
+	* config.h: Update defs for ssize_t, intmax_t, uintmax_t.
+	* Makefile: Update compile options.
+	* gawkmisc.pc (memcpy_long, memset_long): New functions.
+	* Makefile.tst: Synchronized with test/Makefile.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Sun Feb 23 16:25:44 2003  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile, Makefile.tst: Synchronized to main dist.
+
+Sun Feb 16 15:44:20 2003  Scott Deifik         <scottd@amgen.com>
+
+	* config.h: Updated.
+
+Sun Feb  9 11:57:11 2003  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile, Makefile.tst: Synchronized to main dist.
+
+Tue Feb  4 14:28:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	All relevant files: Copyright year updated to 2003.
+
+Sun Nov 24 18:37:31 2002  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile, Makefile.tst: Synchronized to main dist.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+Thu Apr 18 17:29:16 2002  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile.tst (strftime): Remove comment on call to $(CMP).
+
+Sun Mar 10 17:05:35 2002  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile.tst: More clean up and sync with ../test/Makefile.
+
+Thu Jan  3 15:20:17 2002  Scott Deifik         <scottd@amgen.com>
+
+	* Makefile.tst: Minor clean up and sync with ../test/Makefile.
+
+Wed Dec 19 16:01:58 2001  Peter J. Farley III  <pjfarley@dorsai.org>
+
+	* gawkmisc.pc: Just use single quote for `quote' for all cases.
+
+Wed Dec 19 15:59:52 2001  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* install.awk: Install gawkinet.info as well.
+	* awklib/igawk.awk: Bring in sync with awklib/eg/prog/igawk.sh.
+	* makefile (PRSPFILE, PRSP, PLDRSP, DO_PLNK, DO_PBIND, PLDJG): New
+	variables.
+	(djgpp, djgpp-debug): Set PLNK and PBIND.
+	(PBIND): Define to EMPTY as default.
+	(PAWKOBJS1, PAWKOBJS2, PGAWKOBJS): New variables.
+	(all): Add pgawk.exe.
+	(pgawk.exe, $(PRSPFILE)): New rules.
+	($(ALLOBJS)): Add eval_p.o and profile_p.o to the list of files
+	that are dependent on awk.h, dfa.h, regex.h, and config.h.
+	(eval_p$O, profile_p$O): New dependencies.
+	(clean): Add pgawk and $(PRSPFILE) to files that are to be cleaned
+	up.
+
+Tue Dec  4 16:44:07 2001  Andreas Buening    <andreas.buening@nexgo.de>
+
+	Updated OS/2 support.
+
+	* gawkmisc.pc (quote): Use single quote for __EMX__.
+	(os_arg_fixup): new OS/2 code.
+	(os_devopen): for OS/2 return -1.
+	(ispath): check for leading drive letter for __EMX__.
+	(os_close_on_exec): Add check for defined __EMX__.
+	(os_is_setuid): Add real code for __EMX__.
+	(_os2_is_abs_path): new function.
+	(_os2_unixroot): new function.
+	(_os2_unixroot_path): new function.
+
+Tue Sep 25 15:19:53 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.pc (os_close_on_exec): If fd <= 2, return.
+
+Sun Jun  3 13:04:44 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.0: Release tar file made.  And there was
+	rejoicing.
+
+Tue Jan 30 10:56:05 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* config.h: Per Kay Uwe Rommel, turn on HAVE_FCNTL_H for
+	all PC platforms so that BINMODE works on all.
+
+Sun Jan 28 15:50:02 2001  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* gawkmisc.pc (gawk_name): Support file names with mixed forward-
+	and back-slashes.
+	(orig_tty_mode): New variable.
+	(os_setbinmode): Save the original mode of the console device.
+	[__DJGPP__]: Allow the program to be interrupted with Ctrl-C even
+	though the console was switched to binary mode.
+	(os_restore_mode): New function.
+
+Wed Jan 17 10:59:32 2001  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* gawkmisc.pc (os_close_on_exec) [__DJGPP__]: Don't print the
+	warning about failure to set close-on-exec bit, unless it's DJGPP
+	2.04 or later.
+
+Wed Jan  3 19:11:00 2001  Darrel Hankerson  <hankedr@auburn.edu>
+
+	* popen.c: write script files in binary only if the shell is
+	unix-like.
+	* Makefile: set threshold (-Gt) on MSC 16bit versions to obtain
+	sufficient stack.  3.0.91 builtin.c compiles with optimization,
+	in MSC[67], so remove the special compile
+
+Wed Jan  3 19:54:12 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* config.h, gawkmisc.pc: Allow fcntl if DGJPP. From Scott.
+
+Sun Dec  3 16:53:37 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.pc (os_setbinmode): new function.
+
+Sun Dec  3 14:56:38 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile, Makefile.tst, gawkmisc.pc: updated from Scottd.
+	* popen.c: updated from Darrell Hankerson.
+
+Wed Nov 22 11:47:00 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawk.rsp, pc_popen.c, pc_popen.h, Makefile, Makefile.tst,
+	gawkmisc.pc: Synched with diffs from Scott Deifik.
+	* config.h: Updated from main dist, best guess by me, will
+	probably need tweaking.
+
+Tue Nov  7 14:09:14 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.pc (os_is_setuid): new function.
+
+Thu Nov  5 16:50:09 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* gawkmisc.pc (os_devopen): handle "/dev/null".
+
+Wed Jul 30 19:53:52 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Close-on-exec changes:
+	gawkmisc.pc: (os_close_on_exec, os_isdir): new functions.
+
+Mon Aug  7 15:23:00 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.6: Release tar file made.
+
+Sun Jun 25 15:08:19 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.5: Release tar file made.
+
+Wed Jun 21 16:44:54 2000  Scott Deifik       <scottd@amgen.com>
+
+	* Makefile, Makefile.tst: synchronized with main dist, again.
+
+Thu May 18 14:07:52 2000  Scott Deifik       <scottd@amgen.com>
+
+	* Makefile, Makefile.tst: synchronized with main dist.
+	* config.h: Define HAVE_LIMITS_H as 1.
+
+Wed Jun 30 16:14:36 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Release 3.0.4: Release tar file made.  This time for sure.
+
+Sun Jun 27 12:27:00 1999   Darrel Hankerson   <hankedr@mail.auburn.edu>
+
+	* Makefile, Makefile.tst, ../README_d/README.pc: finalized.
+	* include/process.h: new file
+
+Fri May  21 00:00:00 1999  Darrel Hankerson   <hankedr@mail.auburn.edu>
+
+	* popen.c: MSC (on DOS/Windows32) and MINGW32 now honor SHELL.
+	* io.c: MINGW32 reports errno==0 after failure in redirect();
+	assume close_one() in this case.  
+	* io.c: Add HAVE_POPEN_H and let pc/config.h deal with the mess.
+	(Can't move everything to config.h because of popen define.)
+
+Sun May  9 09:12:33 1999  Darrel Hankerson   <hankedr@mail.auburn.edu>
+
+	* Add 1999-04-30 changes from Eli Zaretskii <eliz@is.elta.co.il>
+	1. Makefile (TAGS, tags): New targets.
+	2. Makefile.tst (regtes): Pass the value of $CMP to the 
+	regtest script.
+
+Thu Nov 18 03:48:32 1998  Scott Deifik       <scottd@amgen.com>
+
+	* Readme.pc: More LFN-based comments.
+
+Thu Nov 12 21:01:24 1998  Darrel Hankerson   <hankedr@mail.auburn.edu>
+
+	* mingw32 target added with corresponding minor changes to getid.c,
+	io.c, and config.h.
+	
+	* vcWin32 needed popen defines in config.h which were inadvertently
+	omitted from 3.0.3.
+
+	* README.pc updated to clarify the procedure for building
+	non-LFN versions on LFN systems, and to note that Windows32 gawk
+	may require Windows32 utilities.
+
+	* emxbnd target modified to accomodate older versions of emx.
+
+Thu Nov 08 09:11:44 1998  Scott Deifik       <scottd@amgen.com>
+
+	* pc/Makefile: Stack reduced again for 16bit MSC versions.
+	
+	* pc/Makefile.tst: Updated to keep in sync with new
+	test/Makefile.in.  In addition, made to work in Windows 9x
+	with non-LFN tools.
+
+Thu May 15 12:49:08 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.3: Release tar file made.
+
+Tue May 13 20:06:09 1997  Darrel Hankerson  <hankedr@mail.auburn.edu>
+
+	* vcWin32 target added.  Some new tests for WIN32 in gawkmisc.c
+	io.c, and regex.c.  Makefile changes for nmake, which can't 
+	expand $($x).
+
+	* config.h updated for BITOPS and NONDECDATA (also in Makefile).
+
+Fri Apr 18 07:55:47 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* BETA Release 3.0.34: Release tar file made.
+
+Fri Jan 17 19:20:45 1997  Darrel Hankerson  <hankedr@mail.auburn.edu>
+
+	* Makefile: add KUR's emxnt target for emx+RSXNT.  Create awk.exe
+	"link" to gawk.exe for djgpp target.  (Suggested by Eli Zaretskii.
+	Should be done as part of a smarter install, since awk.exe only
+	works with djgpp gawk.exe.)  Separate djgpp-v1 into djgppv1 
+	target.  Install awk.exe if present.
+
+	* install.awk: install awk.exe if present (only for djgpp)
+
+	* config.h: additional include for emx+RSXNT.
+
+Wed Dec 25 11:25:22 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.2: Release tar file made.
+
+Tue Dec 10 23:09:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.1: Release tar file made.
+
+Thu Aug  1 19:46:00 1996  Scott Deifik       <scottd@amgen.com>
+
+	* Makefile: Changes for MSC 8.
+
+Wed Jan 10 22:58:55 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* ChangeLog created.
diff --git a/gawk-5.0.1/pc/ChangeLog.1 b/gawk-5.0.1/pc/ChangeLog.1
new file mode 100644
index 00000000000..5d782951329
--- /dev/null
+++ b/gawk-5.0.1/pc/ChangeLog.1
@@ -0,0 +1,946 @@
+2019-02-22  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst: Regenerated after changing test/Makefile.am and
+	test/Makefile.in.
+
+2019-02-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst, config.h: Regenerated after DJGPP changes.
+
+2019-02-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* GenMakefileTst.awk: Fix typo in call to gsub.
+
+2010-02-03  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* config.sed (_GNU_SOURCE) [__DJGPP__]: Define for DJGPP.
+	(HAVE_LANGINFO_CODESET) [__DJGPP__]: Define for DJGPP.
+	[__DJGPP__]: Prototype of is_valid_identifier.
+
+	* gawkmisc.pc (nl_langinfo) [__DJGPP__]: New function.
+
+2019-02-02  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.pc (w32_execvp) [__MINGW32__]: Renamed from execvp, to
+	avoid compiler errors with MinGW64, which stupidly defined a
+	deviant prototype for execvp, because GCC's built-in does.
+	Reported by Budi <budikusasi@gmail.com>.
+
+	* Makefile.tst (typedregex4):
+	* GenMakefileTst.awk (substitutions): Replace a literal slash with
+	$(SLASH) in the typedregex4 test.
+
+2019-01-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* GenMakefileTst.awk: Remove BEGIN rule that did cat of
+	prologue file; moved to main Makefile so that out-of-tree
+	builds (make distcheck) will work.
+	* Makefile.tst, config.h: Regenerated.
+
+2018-09-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.sed (_GNU_SOURCE) [__MINGW32__]: Define to 1.
+	* config.h: Regenerate.
+
+2018-08-04  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.pc (nl_langinfo) [__MINGW32__]: New function
+	[DYNAMIC]: Include winerror.h, for MinGW runtime 5.1.0.
+
+	* langinfo.h: New file.
+
+	* config.sed:
+	* config.h (HAVE_LANGINFO_CODESET): Define for MinGW.
+
+2018-05-12  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (readfile): Fix a typo.
+
+2018-05-05  Eli Zaretskii  <eliz@gnu.org>
+
+	* GenMakefileTst.awk (substitutions): Replace the literal slash in
+	-F/ with $(SLASH).
+
+2018-05-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* GenMakefileTst.awk: Use only fully portable constructs so that
+	it can be run by any awk.
+	* Makefile.tst.original: Renamed from Makefile.tst. To be kept
+	around until merge with master.
+	* Makefile.tst: Now autogenerated.
+
+2018-04-27  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst.prologue (PGAWK, GAWK2): Delete unused variables.
+
+2018-04-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* GenMakefileTst.awk: Improve the 'Expect ...' messages.
+	Make the regexps for target names consistent. Remove
+	an extraneous semi-colon.
+
+2018-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.sed: Add HAVE_STDBOOL_H for MinGW.
+	* config.h: Ditto.
+
+	Unrelated:
+
+	* Makefile.tst.prologue (SORT): New macro.
+	* GenMakefileTst.awk: Add processing of TESOUTCMP for recipes
+	that need it.
+
+2018-04-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst.prologue, Makefile.tst: Update copyright years.
+
+2018-04-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* GenMakefileTst.awk: Further improve processing of input file.
+
+2018-04-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* GenMakefileTst.awk: Improve processing of input file.
+
+2018-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst.prologue: Initial version for autogeneration
+	of Makefile.tst.
+	* GenMakefileTst.awk: New file.
+
+2018-03-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.h: Add support for printf %a format.
+	* config.sed: Ditto.
+
+2018-03-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.pc: Update copyright year.
+
+2018-03-03  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile (install1): Create parent directories of $(pkgextensiondir).
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-02-17  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (BASIC_TESTS): Add uplus.
+	(mpfruplus, uplus): New tests.
+
+2018-02-10  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (MPFR_TESTS): Update to match test/Makefile.in.
+
+2018-02-03  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (BASIC_TESTS): Add numstr1.
+	(numindex): New test.  Reported by Scott Deifik
+	<scottd.mail@sbcglobal.net>.
+
+2018-01-26  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (nlstringtest): Expected failure on MinGW when not
+	built with gettext.
+
+2018-01-22         Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* pc/Makefile.tst (nlstringtest): Update the expected failure
+	messages for DJGPP.
+
+2018-01-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst (pty2): Sync against test/Makefile.in.
+	Really for real this time.
+
+2018-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst: Sync against test/Makefile.in.
+	For real this time.
+
+2018-01-20  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (sigpipe1): Fix syntax for non-DJGPP ports.
+
+2018-01-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst: Sync against test/Makefile.in.
+
+2018-01-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst: Initial sync against test/Makefile.in.
+
+2017-11-19  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* pc/Makefile (default): Add lines for the djgpp-readline-mpfr
+	and the djgpp-readline targets.
+	(djgpp-readline): New target, passes -DHAVE_LIBREADLINE to the
+	compiler and adds -lreadline to the linker command line.
+	(djgpp-readline-mpfr): New target, passes -DHAVE_LIBREADLINE and
+	-DHAVE_MPFR to the compiler and adds -lreadline -lmpfr -lgmp to
+	the linker command line.
+
+2017-11-13  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* Makefile (default): Add a line for the djgpp-mpfr target.
+	(djgpp-mpfr): New target, passes -DHAVE_MPFR to the
+	compiler and adds -lmpfr -lgmp to the linker command line.
+
+2017-11-11  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* pc/Makefile.tst (sigpipe1): Exclude DJGPP from the sigpipe1 test.
+
+2017-11-03  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* Makefile (install1): Copy gawk.exe to awk.exe before copying
+	*awk.exe.
+
+2017-11-03  Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst (readdir): Make the message identical with
+	test/Makefile.in.
+
+2017-10-21  KO Myung-Hun <komh78@gmail.com>
+
+	* gawkmisc.pc (os2_dlsym, os2_fixdllname, os2_dlopen) [__KLIBC__]:
+	New functions.
+
+2017-10-21  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile (install1): Create include/ at desctination, and copy
+	there gawkapi.h.  Also copy *.png image files to share/info, as
+	those are required for the Info readers.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-10-01  Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst (readdir_test): Announce a possible MinGW failure.
+
+2017-09-20  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (jarebug): Don't announce a MinGW failure.
+	(mpfr-tests, shlib-tests): Fix the command to not fail due to a
+	second "@".  Reported by Scott Deifik <scottd.mail@sbcglobal.net>.
+	(clean-local): Remove readdir_test.ok, for the case that the test
+	failed.
+
+2017-09-18         Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* pc/Makefile.tst (mbprintf5, beginfile1, sigpipe1, backw, nonfatal1)
+	(nonfatal2, nonfatal3, timeout): Update the expected failure messages
+	for DJGPP.
+
+2017-09-16  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.h (HAVE_GAI_STRERROR) [__MINGW32__]: Define to 1.  Update
+	to Gawk 4.1.64.
+
+	* config.sed (HAVE_GAI_STRERROR) [__MINGW32__]: Edit to 1 for MinGW.
+
+	* Makefile.tst (nondec): Edit the error message to match teh
+	expected results.
+
+	* Makefile (awkgram.c): Edit "parse error" into "syntax error",
+	like the mainline Makefile does.
+	(clean): Remove awkgram.tmp.
+
+2017-08-27         Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* pc/Makefile.tst (mbstr1, mbstr2, errno, getlndir, clos1way2)
+	(clos1way3, clos1way4, clos1way5, clos1way6): Update the expected
+	failure messages for DJGPP.
+
+2017-08-26  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (SLASH, PATH_SEPARATOR, LS): Change the default
+	values to be less specific to my private setup.
+
+2017-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (testext): Fix spelling of testexttmp.txt.
+
+2017-08-21  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (testext): Remove textexttmp.txt.
+
+2017-08-19  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (SLASH): New variable for use it readdir_test.
+	(mbprintf5, profile4, profile5, profile8, getfile): Update the
+	expected failure messages.
+	(readdir_test): Use SLASH instead of a literal /, as the latter
+	gets converted by MSYS Bash to the corresponding Windows directory.
+
+	* Makefile.ext (MPFR, MPFR_LIBS): New variables, used in compiling
+	intdiv.c.
+	(ALL_EXTENSIONS): Add intdiv and readdir_test.
+	(intdiv.$(SOEXT), readdir_test.$(SOEXT)): New recipes.
+
+	* Makefile.tst: Synchronize with test/Makefile.in.
+
+2017-08-18  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.h (HAVE_SYS_IOCTL_H):
+	* config.sed (HAVE_SYS_IOCTL_H): Do not define for MinGW.
+
+2017-08-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.h: Regenerated in preparation for release.
+
+2017-08-01         Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	Bring DJGPP support up to speed.
+
+	* Makefile: Add LOCALEDIR, infodir, mandir. Revise prefix,
+	SHLIBExT, CFLAGS.
+	* config.sed: Update for DJGPP.
+	* gawkmisc.pc: Update for DJGPP.
+	(putwc): New funcction.
+
+2017-01-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.pc: Fix a typo.
+
+2017-01-21  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst: Modify the locale values to valid ones on Windows.
+
+	* gawkmisc.pc: Undef setlocale and include locale.h.
+	(lc_var, w32_setlocale): New functions.
+
+	* Makefile (VAPTH): Set to allow Make to find sources in the
+	'support' subdirectory.
+	(CFLAGS): Add "-I./support", as some headers are there.
+	(LIBOBJS): Add localeinfo$O.
+	(regex$O): Depend on regex_internal.c.
+	(localeinfo$O): New dependency.
+
+	* config.sed (SIZEOF_UNSIGNED_INT, SIZEOF_UNSIGNED_LONG): Set to 4
+	unconditioonally, as we no longer support 16-bit ports.  The
+	previous definitions caused compilation errors, since config.h is
+	included by random.h before awk.h, where limits.h is included and
+	defines UINT_MAX etc.
+	* config.h: Regenerated.
+
+	* Makefile.tst: Sync with test/Makefile.in.
+
+2016-11-04  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.pc (w32_maybe_set_errno) [__MINGW32__]: New function,
+	to correct errno when it is not set to a useful value.
+
+2016-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* General: Remove trailing whitespace from all relevant files.
+
+2016-09-24  Eli Zaretskii  <eliz@gnu.org>
+
+	Fix compilation warnings on MinGW with the latest runtime.
+	Reported by Marc de Bourget <marcdebourget@gmail.com>.
+
+	* socket.h (_WIN32_WINNT): If it's already defined, redefine it
+	only if the value is less than what we need.  This avoids compiler
+	warnings about redefinitions.
+
+	* config.h (HAVE_STRINGS_H): Define to 1.
+
+	* config.sed: Define STRINGS_H as well, as MinGW runtime 3.22 and
+	later needs that to get the prototypes of strcasecmp and
+	strncasecmp.
+
+2016-09-08         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-08-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (BASIC_TESTS): Add ofmtstrnum and sortfor2.
+	(rscompat, ofmtstrnum, sortfor2): New tests.
+
+2016-07-01         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2016-06-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline:
+	(mixed1, symtab10, subback): New tests.
+	(FAIL_CODE1): Updated.
+
+2016-05-25  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (BASIC_TESTS): Add arrayind1 and sigpipe1.
+	(anchgsub, sclifin): New tests.
+
+2016-05-15         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2016-05-12  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile ($(ALLOBJS) $(LIBOBJS)): Depend on nonposix.h.
+
+2016-04-23  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (pty1): Ignore errors (happens with MinGW).
+
+2016-04-17         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2016-04-16  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.sed (HAVE_BTOWC): Now unconditionally defined to 1.
+	(HAVE_SYS_WAIT_H): Define to 1 for DJGPP.
+
+2016-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (BASIC_TESTS, GAWK_EXT_TESTS): Add new tests.
+	(mbstr1): Expect to fail on MinGW.
+	(mbstr2, profile8, muldimposix, watchpoint1, aryprm9, nulinsrc)
+	(readbuf, clos1way2, clos1way3, clos1way4, clos1way5, fpat5): New
+	tests.
+
+2016-04-07  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.h: Don't define WEXITSTATUS, it is now defined in
+	nonposix.h.
+
+	* config.sed: Don't define WEXITSTATUS, it is now defined in
+	nonposix.h.
+
+	* gawkmisc.pc (w32_status_to_termsig) [__MINGW32__]: New function.
+
+2016-03-16  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.pc (usleep): Condition on MinGW runtime version older
+	than 3.21, which defines 'usleep' as an inline function in
+	unistd.h, and thus causes compilation errors due to conflicting
+	definitions.  Reported by Ivan Suchý <suchy.ivan@gmail.com>.
+
+	* Makefile (mingw32, mingw32-readline, mingw32-mpfr)
+	(mingw32-readline-mpfr): Use -Wno-deprecated-declarations, to
+	avoid warnings about 'usleep' in newer versions of mingw.org's
+	MinGW runtime.
+
+2016-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.h: Updated to current.
+
+2015-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst (negtime): Sync with mainline.
+
+2015-05-29         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst (dbugeval): Sync with mainline.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-05-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline.
+
+2015-05-04         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-04-22         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Don't do 'make diffout' after pass-fail.
+	* negtime: Add expect failure for DJGPP.
+
+2015-04-17  Eli Zaretskii  <eliz@gnu.org>
+
+	* testoutcmp.awk (END): Attempt a series of massages on the actual
+	output to match it to the expected result, when the number of
+	exponent digits is different.  Also, edit "nul" into "null", to
+	account for the difference in the null device name.  This removes
+	"failures" due to Windows-specific issues that do not indicate
+	real problems in Gawk, just some non-portable assumptions about
+	the expected results.
+
+	* Makefile.tst (abs_top_builddir): Define.
+	(negtime): Mark this test as an expected failure with MinGW.
+	(profile5, exit, hsprint, posix, double2, fmttest): Remove the
+	"expect to fail" message for MinGW, and use the testoutcmp.awk
+	script to loosely compare actual output to expected one.
+
+	* Makefile.ext ($(SIMPLE_EXTENSIONS)): Really use -static-libgcc.
+
+2015-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline.
+	* config.h: Sync with mainline.
+
+2015-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.ext (fnmatch.$(SOEXT), readdir.$(SOEXT), rwarray.$(SOEXT))
+	(filefuncs.$(SOEXT), time.$(SOEXT), $(SIMPLE_EXTENSIONS)): Use
+	-static-libgcc, to avoid run-time dependency on libgcc DLL.  This
+	makes the extensions independent of non-system DLLs, and also
+	prevents an abort at exit due to a known upstream bug in
+	libgcc_s_dw2-1.dll.
+
+	* Makefile.tst (mpfrmemok1): Use -p- instead of -p/dev/stdout, for
+	more portability.
+
+2015-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst: Sync with mainline.
+	* config.h: Sync with mainline.
+
+2014-11-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst (id): Add an 'expect to fail for DJGPP' message.
+
+2014-11-13         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2014-10-12         KO Myung-Hun          <komh78@gmail.com>
+
+	Fixes for OS/2:
+
+	* gawkmisc.pc (init_sockets): Add additional checks for __EMX__.
+
+2014-09-23         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2014-04-17         Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Add readfile2 test.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-02-03   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Include original test/Makefile.in lines as
+	comments.
+
+2014-01-28  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (strftime): Pass the value of 'date' command
+	through the DATECMD variable.
+	(readdir): Adapt to changes in test/readdir0.awk.
+
+2014-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst (mbprintf4, backbigs1, backsmalls1): Add warning
+	that the tests are expected to fail with DJGPP.
+
+2014-01-24   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2014-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst (split_after_fpat, mpfrnegzero): Added, to
+	sync with main test Makefile.
+
+2014-01-15  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (mbprintf4, profile5, backbigs1, backsmalls1):
+	Announce expected failures.
+	(fts): Fail gracefully, to avoid bailing out of the test suite too
+	early.
+
+	* popen.c (os_system): Use spawnl, and quote the command line, to
+	be consistent with what gawk_popen does.
+	(os_popen) [__MINGW32__]: Don't scriptify the command, to be
+	consistent with gawk_popen.
+	(os_pclose) [__MINGW32__]: Update to match os_open: no need to
+	unlink the script file.
+
+2013-12-10   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* gawkmisc.c (init_sockets): Move into the right part of the
+	file so that it will be compiled for DJGPP also.
+	* Makefile.tst: Sync with mainline.
+
+2013-06-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.c (init_sockets): Rearrange ifdefs.
+
+2013-06-01  Eli Zaretskii  <eliz@gnu.org>
+
+	* popen.h (SIGKILL) [__MINGW32__]: Define.
+	(kill, quote_cmd): New prototypes.
+
+	* popen.c: Include popen.h and errno.h.
+	(popen, pclose, system): Undefine macros.
+	(WIN32_LEAN_AND_MEAN) [__MINGW32__]: Define and include windows.h.
+	(kill, quote_cmd) [!PIPES_SIMULATED]: New functions.
+	(os_popen): Make the function definition match its prototype
+	exactly.
+
+	* gawkmisc.pc [HAVE_SOCKETS]: Include socket.h and windows.h.
+	(socket, setsockopt, bind, connect, listen, accept, recvfrom)
+	(shutdown): Undefine macros.
+	(os_close_on_exec) [__MINGW32__]: Non-trivial implementation.
+	(init_sockets, socket_to_fd, w32_socket, w32_setsockopt)
+	(w32_bind, w32_connect, w32_listen, w32_accept, valid_socket)
+	(w32_closesocket, w32_recvfrom, w32_shutdown) [HAVE_SOCKETS]: New
+	functions for MinGW, emulate Posix sockets specified by file
+	descriptors.
+
+	* config.h (HAVE_GETADDRINFO, HAVE_SOCKADDR_STORAGE)
+	(HAVE_SOCKETS) [__MINGW32__]: Define.
+
+	* config.sed (HAVE_GETADDRINFO, HAVE_SOCKADDR_STORAGE)
+	(HAVE_SOCKETS) [__MINGW32__]: Define.
+
+	* Makefile.tst (fmtspcl): Announce expected failure only if not
+	built with MPFR.
+	(inetecht, inetdayt): For MinGW, warn about time-outs.
+	(beginfile1, clos1way, getlndir): Announce expected failure only
+	with DJGPP.
+	(exit): Describe the failure on MinGW.
+	(readdir): Explain why test might fail with bad ls.exe.
+
+	* Makefile (mingw32, mingw32-readline, mingw32-mpfr)
+	(mingw32-readline-mpfr): Add -lws2_32 to the link flags.
+	(gawkmisc$O): Depend on socket.h.
+	(io$O): Depend on socket.h and in.h.
+	(popen$O): New dependency.
+
+2013-05-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.h: Remove obsolete HAVE_ST_BLKSIZE.
+
+2013-05-14  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (AWK): Set AWKLIBPATH so extensions could be found.
+	(LS): New variable.
+	(check): Add back shlib-tests and shlib-msg-end.
+	(readdir): Add a warning regarding inode reporting by ls.exe.
+	(fts, fork, fork2): Add message about expected failure on MinGW.
+
+	* Makefile (install): Install the extensions.
+	(install-strip): Likewise.
+
+	* Makefile.ext: New file.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-05-09   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2013-05-05  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.sed (HAVE_MPFR): Don't #undef; it will be defined by
+	pc/Makefile as needed.
+
+2013-05-04  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.h (HAVE_MPFR): Don't #undef; it will be defined by
+	pc/Makefile as needed.
+
+2013-05-02   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2013-04-29  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (mpfr-tests, shlib-tests, rsnulbig, rsnulbig2):
+	Insert a space between ' and the following / to prevent MSYS Bash
+	from interpreting that as a Unix-style file name.
+
+2013-04-28  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (top_srcdir): Define.  This avoids failure in a few
+	tests that use this variable.
+	(testext): Prepend a space before the /regexp/ argument, to
+	prevent MSYS Bash mistaking this for an absolute file name that
+	needs to be converted to the Windows D:/foo/bar form, which fails
+	the test.
+	(check): Remove the shlib tests from 'check', so that they are not
+	run by default, because the extensions are not yet built
+	automatically.
+
+2013-04-22   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2013-04-14   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2013-03-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.h: Update by manually running make-config.bat steps.
+
+2013-03-10   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile: Sync with mainline.
+
+2013-03-04   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile: Build additional C source files.
+
+2013-03-04  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.sed: Fixes to build on DJGPP.
+
+2013-02-09  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.pc (dlopen, dlerror, dlclose, dlsym) [DYNAMIC]: New
+	functions for _WIN32 build.
+
+	* dlfcn.h: New file.
+
+	* Makefile (pkgextensiondir, DEFLIBPATH, SHLIBEXT): New variables.
+	(AWKOBJS4): New sub-list of object files; add gawkapi$O.
+	(ALLOBJS): Include AWKOBJS4.
+	(CFLAGS): Add -DDEFLIBPATH=$(DEFLIBPATH) -DSHLIBEXT=$(SHLIBEXT).
+
+	* config.sed (DYNAMIC): Define for _WIN32 build.
+
+2013-02-07   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline.
+
+2013-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.h: Version bumped.
+
+2012-12-28  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile (install1): Don't require a Unixy shell and Sed.  Don't
+	edit igawk.bat to point to the igawk script in $(prefix)/bin, as
+	that directory should be on PATH when Gawk is installed.  Create
+	$(prefix)/bin/awk.exe, to emulate a symlink created on Unix.
+	Install documentation in $(prefix)/share.  Install gawkinet.info.
+	(install-strip): New target.
+
+	* install.awk: Install documentation in $prefix/share.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst (paramuninitglobal): New test.
+
+2012-11-22         Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (jarebug): Update.
+	(GREP_OPTIONS): Add.
+
+2012-11-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.pc (os_isreadable): Use correct type for first parameter.
+
+2012-11-04   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst (jarebug, charasbytes): Update.
+
+2012-10-28   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+2012-10-28         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.pc (messages): Adjust to use standard failure test for
+	make diffout.
+
+2012-08-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.pc (os_isreadable): Take IOBUF_PUBLIC instead of fd and
+	use passed in info.
+
+2012-07-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.pc (os_isreadable): Add isdir pointer parameter to be
+	set to true if fd is for a directory.
+
+2012-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.pc (os_isreadable): New function.
+
+2012-05-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile: Remove second mingw32-readline target. Bad
+	result from branch merging.
+
+2012-05-06         Eli Zaretskii  <eliz@gnu.org>
+
+	* config.sed: Update DJGPP -> __DJGPP__.
+
+2012-04-16  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst (PGAWK): Redefine as "../gawk.exe -p".
+	(MPFR_TESTS): New variable, a list of MPFR-related tests.
+	(mpfr-tests): A new target.
+	(badargs): Reset GREP_OPTIONS to empty, to avoid gratuitous
+	failures when the user has something like -nH there.
+	(mpfrieee, mpfrexprange, mpfrrnd, mpfrnr, mpfrsort, mpfrbigint):
+	New tests.
+
+	* Makefile (default): Add descriptions of mingw32-mpfr and
+	mingw32-libreadline-mpfr targets.
+	(PRSPFILE, DRSPFILE, PRSP, DRSP, PLDRSP, DLDRSP, DO_PLNK)
+	(DO_PBIND, DO_DLNK, DO_DBIND, PLDJG, DLDJG, PLMINGW32)
+	(DLMINGW32, PAWKOBJS1, PAWKOBJS2, DAWKOBJS2, PGAWKOBJS)
+	(DGAWKOBJS): Remove unused variables.
+	(djgpp, djgpp-debug, mingw32): Don't use them.
+	(mingw32): Add -D__USE_MINGW_ANSI_STDIO to compilation flags.
+	(mingw32-readline, mingw32-mpfr, mingw32-readline-mpfr): New targets.
+	(CFLAGS, AWKOBJS2): Don't reference obsolete DYN_FLAGS and DYN_OBJ
+	variables.
+	(AWKOBJS2): Add symbol$O.
+	(AWKOBJS3): New variable, lists MPFR-related object files.
+	(AWKOBJS): Add $(AWKOBJS3).
+	(all): Remove pgawk.exe and dgawk.exe.
+	(pgawk.exe, dgawk.exe, $(PRSPFILE) $(DRSPFILE), eval_p$O)
+	(profile_p$O): Remove targets.
+	(random$O, debug$O): Don't depend on floatmagic.h
+	(eval$O): Depend on interpret.h.
+	(clean): Prepend '-' to command line, to ignore errors due to
+	non-existent files.
+
+	* config.h: Comment out "#undef HAVE_LIBREADLINE" (again).
+
+2012-03-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.h: Add definition for _Noreturn.
+
+2012-03-20         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkmisc.pc (deflibpath): New global variable.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2012-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.tst (printfbad3): New test.
+
+2012-03-14         Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.pc (btowc): New version for DJGPP.
+
+2012-03-01   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+2012-03-01         Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile: Quiet confusing info messages from the linker when
+	gawk is linked against readline as a shared library.
+
+2012-02-22         Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.tst: Update CMP and CP definitions, add "Expect xxxx to
+	fail with MinGW" messages as needed.
+
+2012-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.pc (execvp): Modify signature, return -1
+	on error.
+
+2012-02-11  Eli Zaretskii  <eliz@gnu.org>
+
+	Fix dependencies in pc/Makefile.
+	* Makefile ($(ALLOBJS) $(LIBOBJS) eval_p$O profile_p$O): Add eval_d$O,
+	debug$O, and command$O.
+
+	Support MinGW build with the readline library.
+	* Makefile (default): Add a line for the mingw32-readline target.
+	(mingw32-readline): New target, passes -DHAVE_LIBREADLINE to the
+	compiler and adds -lreadline to the linker command line.
+
+	* config.sed: Comment out "#undef HAVE_LIBREADLINE", so that it
+	could be #define'd on the compiler command line.
+
+2012-02-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.pc (execvp): New function based on code from Eli
+	Zaretskii to make dgawk's restarting the debugger work.
+
+2012-01-27   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+2011-12-12   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+2011-12-06   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+	Use testoutcmp.awk script.
+
+2011-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testoutcmp.awk: Script to replace cmd for DJGPP.
+
+2011-11-01   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* config.sed: Additional update.
+
+2011-10-29  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.sed: Fix some edits, to be consistent with the old
+	config.h file.  Make regexps match #undef lines with whitespace
+	at the end of the line.  Add forgotten EMX #defines.
+
+2011-10-27   Scott Deifik  <scottd.mail@sbcglobal.net>
+
+	* Makefile.tst: Sync with mainline version.
+
+2011-10-24   Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.pc (wctob) [__MINGW32__]: A replacement for the
+	function of the same name in MS runtime, which does a better job
+	with 8-bit characters that have their high bit set.
+	Original supplied by Jim Meyering  <jim@meyering.net>.
+
+	* popen.h (system) [__MINGW32__]: Redirect to os_system.
+
+	* Makefile (./doc/awkcard.tr): Don't use Unixy forward slashes in
+	redirection.
+	(builtin$O): Depend on popen.h.
+	(random$O): New target, separated from builtin$O.
+
+	* configpk.sed:
+	* config.sed:
+	* make-config.bat: New files, to produce pc/config.h from the top-level
+	configh.in file.
+
+2011-10-18  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* Makefile: doc target to create all documentation files.
+
+2011-09-30  Eli Zaretskii  <eliz@gnu.org>
+
+	* config.h: Update packaging related versions.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/pc/GenMakefileTst.awk b/gawk-5.0.1/pc/GenMakefileTst.awk
new file mode 100644
index 00000000000..298b3887bd2
--- /dev/null
+++ b/gawk-5.0.1/pc/GenMakefileTst.awk
@@ -0,0 +1,158 @@
+#!/usr/bin/gawk -f
+
+# This program generates pc/Makefile.tst
+
+# Skip the first part of Makefile.in
+/Get rid of core files/ { process = 1 }
+
+! process	{ next }
+
+# Skip stuff that PC doesn't need
+/^CMP =/, /^\.PRECIOUS/	{ next }
+
+# Process the bits in Makefile.in we need to generate the tests properly
+
+# Tests that fail on DJGPP
+/^EXPECTED_FAIL_DJGPP *=/,/[^\\]$/ {
+	print
+	gsub(/(^EXPECTED_FAIL_DJGPP *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		djgpp[$i]
+
+	next
+}
+
+# Tests that fail on MinGW
+/^EXPECTED_FAIL_MINGW *=/,/[^\\]$/ {
+	print
+	gsub(/(^EXPECTED_FAIL_MINGW *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		mingw[$i]
+
+	next
+}
+
+# Tests that need a different cmp program
+/^NEED_TESTOUTCMP *=/,/[^\\]$/ {
+	print
+	gsub(/(^NEED_TESTOUTCMP *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		testoutcmp[$i]
+
+	next
+}
+
+# Start of a target
+! in_recipe && /^[[:alpha:]_][-[:alnum:]_]*:/ {
+	in_recipe = 1
+	start_new_recipe()
+	next
+}
+
+# Empty targets, one after the other
+in_recipe && /^[[:alpha:]_][-[:alnum:]_]*:/ {
+	print_recipe()
+	start_new_recipe()
+	next
+}
+
+# Collect recipe lines
+in_recipe && /^\t/ {
+	recipe_lines[++line] = substitutions(name, $0)
+	next
+}
+
+# End of collected recipe, print it out
+in_recipe && /(^[^\t])|(^$)/ {
+	in_recipe = 0
+	print_recipe()
+
+	print
+	next
+}
+
+# Default is to print input lines
+process		{ print }
+
+# substitutions --- replace *nix values with what's needed on Windows
+
+function substitutions(test, string)
+{
+	# locales
+	gsub(/en_US.UTF-8/, "ENU_USA.1252", string)
+	gsub(/fr_FR.UTF-8/, "FRA_FRA.1252", string)
+	gsub(/ja_JP.UTF-8/, "JPN_JPN.932", string)
+	gsub(/el_GR.iso88597/, "ell_GRC.1253", string)
+	gsub(/ru_RU.UTF-8/, "RUS_RUS.1251", string)
+
+	# command for `ls'
+	gsub(/@ls/, "@$(LS)", string)
+
+	# MSYS needs "/" to be doubled
+	gsub(/-F\//, "-F$(SLASH)", string)
+	gsub(/=@\//, "=@$(SLASH)", string)
+
+	if (string ~ /\$\(CMP\)/ && test in testoutcmp) {
+		gsub(/\$\(CMP\)/, "$(TESTOUTCMP)", string)
+		delete testoutcmp[test]
+	}
+
+	return string
+}
+
+# print_recipe --- print out the recipe
+
+function print_recipe(		i, start)
+{
+	print recipe_lines[1]	# target:
+	if (line == 1)
+		return
+
+	# First line if it's @echo $@
+	if (recipe_lines[2] == "\t@echo $@") {
+		start = 3
+		print recipe_lines[2]
+	} else
+		start = 2
+
+	# print the right warning
+	if (name in djgpp && name in mingw) {
+		print "\t@echo Expect $@ to fail with DJGPP and MinGW."
+	} else if (name in djgpp) {
+		print "\t@echo Expect $@ to fail with DJGPP."
+	} else if (name in mingw) {
+		print "\t@echo Expect $@ to fail with MinGW."
+	}
+
+	# find first line from the end that starts with @
+	# make sure it starts with @-
+	for (i = line; i >= start; i--) {
+		if (recipe_lines[i] !~ /^\t@/)
+			continue
+
+		if (recipe_lines[i] ~ /^\t@-/)
+			break
+		else if (recipe_lines[i] ~ /^\t@/) {
+			recipe_lines[i] = "\t@-" substr(recipe_lines[i], 3)
+			break
+		}
+	}
+
+	# Print all the lines but the last
+	for (i = start; i <= line; i++)
+		print recipe_lines[i]
+}
+
+# start_new_recipe --- start collecting data from scratch
+
+function start_new_recipe()
+{
+	# get the name of the target
+	# use match(), not gensub(), so that this script is fully portable
+	match($0, /^[[:alpha:]_][-[:alnum:]_]*:/)
+	name = substr($0, RSTART, RLENGTH - 1)	# leave out the colon
+
+	delete recipe_lines
+	line = 0
+	recipe_lines[++line] = $0
+}
diff --git a/gawk-5.0.1/pc/Makefile b/gawk-5.0.1/pc/Makefile
new file mode 100644
index 00000000000..d15ff10fd16
--- /dev/null
+++ b/gawk-5.0.1/pc/Makefile
@@ -0,0 +1,439 @@
+# Makefile for gawk (GNU awk)                                      Dec 2010
+#
+# - for GNU C (djgpp)         [32bit protected-mode executable for DOS]
+# - for GNU C (emx)           [32bit executable for OS/2 or DOS or Windows32]
+# - for GNU C (mingw32)	      [Windows32 executable for Windows 9x/NT/2K/XP/7]
+
+# Tested with GNU make on Windows, OS/2 and DOS.
+
+# Copyright (C) 1989-2016 Free Software Foundation, Inc.
+
+# This Makefile is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+default:
+	@echo "Enter $(MAK) target "
+	@echo " where 'target' is chosen from                          "
+	@echo "  djgpp ... DOS 32-bit exe [GNU C, Delorie, v2]         "
+	@echo "  djgpp-mpfr . Like djgpp, but with MPFR                "
+	@echo "   [You will need to have GNU MPFR library installed.]  "
+	@echo "  djgpp-readline . Like djgpp, but with readline        "
+	@echo "   [You will need to have GNU readline library installed.] "
+	@echo "  djgpp-readline-mpfr . djgpp with readline and MPFR    "
+	@echo "  emx ..... OS/2 32-bit exe [emx/gcc; uses emxlibc.dll] "
+	@echo "  emxnt ... NT exe [emx/gcc with RSXNT]                 "
+	@echo "  emxbnd .. OS/2 and DOS 32-bit exe [emx/gcc]           "
+	@echo "  mingw32 . Windows32 exe [Mingw32 GNU C]               "
+	@echo "  mingw32-readline . Like mingw32, but with readline    "
+	@echo "   [You will need to have GNU readline library installed.] "
+	@echo "  mingw32-mpfr . Like mingw32, but with MPFR            "
+	@echo "   [You will need to have GNU MPFR library installed.]  "
+	@echo "  mingw32-readline-mpfr . mingw32 with readline and MPFR "
+	@echo "  ----------------------------------------------------- "
+	@echo "  test .... Perform tests (see README_d/README.pc)      "
+	@echo "  install . Install gawk under $(prefix)/               "
+	@echo "  doc ..... Create documentation                        "
+
+# Support dropped in 4.0
+# - for DJGPP v1.x            [DOS 32bit protected-mode executable]
+# - for MS-Visual C/C++ 4.x   [Windows32 executable for Windows 9x/NT]
+# - for Microsoft C 7         [16bit ececutable for DOS]
+# - for Microsoft C 6.00A     [16bit executable for OS/2 or DOS]
+#	@echo "  djgppv1 . DOS 32-bit exe [GNU C, Delorie, v1]         "
+#	@echo "  msc ..... DOS exe [Microsoft C 7 & 8 (AKA 1.52)]      "
+#	@echo "  msc6 .... DOS exe [Microsoft C 6.00a]                 "
+#	@echo "  msc6os2 . OS/2 exe [Microsoft C 6.00a]                "
+#	@echo "  msc6bnd . OS/2 and DOS exe [Microsoft C 6.00a]        "
+#	@echo "  vcWin32 . Windows32 exe [Microsoft Visual C]          "
+# Support dropped in 3.0
+# - for Microsoft C 5.1       [16bit executable for OS/2 or DOS]
+#	@echo "  msc51     DOS exe [Microsoft C 5.1]                   "
+#	@echo "  msc51bnd  OS/2 and DOS exe [Microsoft C 5.1]          "
+
+#======================= Configuration ==================================
+RSPFILE = gawk.rsp
+#
+# Choose method for passing arguments to the linker.
+#
+# If compiling under OS/2 or if make can pass long lines
+#LDRSP = $(GAWKOBJS)
+#LNKRSP = $(LDRSP)
+#
+# else use brain-dead approach (emxbnd will need 'tr').
+RSP = $(RSPFILE)
+LDRSP = @$(RSP)
+LNKRSP = $(LDRSP)
+#------------------------------------------------------------------------
+# Some makes do not define MAKE (and ndmake does not allow a define).
+# Define MAK to be your make command.
+#MAKE = dmake
+MAK = $(MAKE) $(MAKEFILE)
+#MAK = $(MAKE)
+#MAKEFILE = -f Makefile
+#MAK = make45 $(MAKEFILE)
+#------------------------------------------------------------------------
+# Define the base directory for the install. "make install" will install
+# in bin, lib/awk, man, and info under $(prefix)/. Most likely, you should
+# edit config.h so that $(prefix)/lib/awk appears as part of DEFPATH.
+#prefix =
+prefix = c:/gnu
+pkgdatadir = $(prefix)/lib/awk
+pkgextensiondir = $(prefix)/lib/gawk
+DEFLIBPATH = "\"$(pkgextensiondir)\""
+LOCALEDIR="\"$(prefix)/share/locale\""
+SHLIBEXT = "\"dll\""
+infodir = $(prefix)/share/info
+mandir = $(prefix)/share/man
+#
+# Define the install method. Method 1 is Unix-like (and requires cat
+# and cp); method 2 uses gawk and batch files.
+install = 1
+#------------------------------------------------------------------------
+# To work around command-line length problems, this makefile assumes
+# that $($X) can be expanded.
+DO_LNK = $($(LNK))
+DO_BIND= $($(BIND))
+#------------------------------------------------------------------------
+# To allow Make find files in the support subdirectory.
+VPATH = .;./support
+#========================================================================
+# End of general configuration. Some platform-specific configuration
+# notes appear below.
+
+#========================================================================
+#========================== DJGPP =======================================
+#========================================================================
+
+ifneq ($(DJGPP),)
+prefix = /dev/env/DJDIR
+pkgdatadir = $(prefix)/share/awk
+SHLIBEXT = "\"dxe\""
+endif
+LDJG = $(CC) $(LF) -o gawk.exe $(LDRSP) $(LF2)
+BDJG = stubify -g awk.exe | stubedit awk.exe runfile=gawk
+
+djgpp:
+	$(MAK) all \
+	CC=gcc O=.o CF=-O2 \
+	LNK=LDJG LF=-s LF2=-lm \
+	BIND=BDJG
+
+djgpp-debug:
+	$(MAK) all \
+	CC=gcc O=.o CF='-O2 -g' \
+	LNK=LDJG LF2=-lm \
+	BIND=BDJG
+
+djgpp-mpfr:
+	$(MAK) all \
+	CC=gcc O=.o CF='-O2 -DHAVE_MPFR' \
+	LNK=LDJG LF=-s LF2="-lmpfr -lgmp -lm" \
+	BIND=BDJG
+
+djgpp-readline:
+	$(MAK) all \
+	CC=gcc O=.o CF='-O2 -DHAVE_LIBREADLINE' \
+	LNK=LDJG LF=-s LF2="-lreadline -lm" \
+	BIND=BDJG
+
+djgpp-readline-mpfr:
+	$(MAK) all \
+	CC=gcc O=.o CF='-O2 -DHAVE_LIBREADLINE -DHAVE_MPFR' \
+	LNK=LDJG LF=-s LF2="-lreadline -lmpfr -lgmp -lm" \
+	BIND=BDJG
+
+#========================================================================
+#========================== EMX =========================================
+#========================================================================
+
+# Link command for OS/2 versions.
+LEMX = $(CC) $(LF) -o $@ $(GAWKOBJS) gawk.def -lbsd $(LF2)
+
+# Link and bind for DOS and OS/2 versions.
+# emx-09 needs '-p' emx option here or in EMXOPT environ var.
+# The following works with 0.9a or newer
+LEMXBND = $(CC) $(LF) -o gawk $(LDRSP) gawk.def -lbsd $(LF2)
+BEMX = emxbind -bs gawk  -p
+# The following works with 0.9c or newer
+#LEMXBND = $(CC) $(LF) -o a.out $(LDRSP) gawk.def -lbsd $(LF2)
+#BEMX = emxbind -bs -o $@ a.out -p
+#BEMX = emxbind -bs /emx/bin/emx.exe a.out $@ -p
+BEMXD = emxbind -b -o $@ a.out -p
+
+emx:
+	$(MAK) all \
+	"CC=gcc -Zomf" O=.obj "CF=-O -DOS2" \
+	LNK=LEMX "LF=-s -Zcrtdll -Zstack 512" RSP=
+
+emxnt:
+	$(MAK) all \
+	"CC=gcc -Zwin32 -Zcrtdll=rsxntcs" O=.o "CF=-O -DOS2" \
+	LNK=LEMX "LF=-s -Zstack 512" RSP=
+
+emxbnd:
+	$(MAK) all \
+	CC=gcc O=.o "CF=-O -DOS2 -DMSDOS" OBJ=popen.o \
+	LNK=LEMXBND \
+	BIND=BEMX "P=|tr \" \" \"\n\""
+
+emxbnd-debug:
+	$(MAK) all \
+	CC=gcc O=.o "CF=-g -DOS2 -DMSDOS" OBJ=popen.o \
+	LNK=LEMXBND \
+	BIND=BEMXD "P=|tr \" \" \"\n\""
+
+#========================================================================
+#========================== MINGW32 =====================================
+#========================================================================
+
+LMINGW32 = $(CC) $(LF) -o $@ $(GAWKOBJS) $(LF2)
+# The following might work around command-line length limitations:
+#LMINGW32 = $(CC) $(LF) -o $@ *.o $(LF2)
+
+mingw32:
+	$(MAK) all \
+	CC=gcc O=.o CF="-D__USE_MINGW_ANSI_STDIO -O2 -gdwarf-2 -g3 -Wno-deprecated-declarations" \
+	OBJ=popen.o LNK=LMINGW32 LF="-gdwarf-2 -g3" \
+        LF2="-lws2_32 -lmsvcp60" RSP=
+
+mingw32-readline:
+	$(MAK) all \
+	CC=gcc O=.o \
+	CF="-D__USE_MINGW_ANSI_STDIO -DHAVE_LIBREADLINE -O2 -gdwarf-2 -g3 -Wno-deprecated-declarations" \
+	OBJ=popen.o LNK=LMINGW32 LF="-gdwarf-2 -g3" \
+	LF2="-lreadline -lws2_32 -lmsvcp60 -Wl,--enable-auto-import" RSP=
+
+mingw32-mpfr:
+	$(MAK) all \
+	CC=gcc O=.o \
+	CF="-D__USE_MINGW_ANSI_STDIO -DHAVE_MPFR -O2 -gdwarf-2 -g3 -Wno-deprecated-declarations" \
+	OBJ=popen.o LNK=LMINGW32 LF="-gdwarf-2 -g3" \
+	LF2="-lmpfr -lgmp -lws2_32 -lmsvcp60 -Wl,--enable-auto-import" RSP=
+
+mingw32-readline-mpfr:
+	$(MAK) all \
+	CC=gcc O=.o \
+	CF="-D__USE_MINGW_ANSI_STDIO -DHAVE_LIBREADLINE -DHAVE_MPFR -O2 -gdwarf-2 -g3 -Wno-deprecated-declarations" \
+	OBJ=popen.o LNK=LMINGW32 LF="-gdwarf-2 -g3" \
+	LF2="-lmpfr -lgmp -lreadline -lws2_32 -lmsvcp60 -Wl,--enable-auto-import" RSP=
+
+# Define BIND for BINDless compiles, otherwise $($(BIND)) may break.
+BIND = EMPTY
+PBIND = EMPTY
+EMPTY=
+
+CFLAGS = $(CF) -DGAWK -I. -I./support -DHAVE_CONFIG_H -DDEFLIBPATH=$(DEFLIBPATH) -DSHLIBEXT=$(SHLIBEXT) -DLOCALEDIR=$(LOCALEDIR)
+
+# object files
+AWKOBJS1  = array$O builtin$O eval$O field$O floatcomp$O gawkmisc$O io$O main$O
+AWKOBJS2  = ext$O msg$O node$O profile$O re$O replace$O version$O symbol$O
+AWKOBJS3  = debug$O cint_array$O int_array$O mpfr$O str_array$O command$O
+AWKOBJS4  = gawkapi$O
+AWKOBJS = $(AWKOBJS1) $(AWKOBJS2) $(AWKOBJS3) $(AWKOBJS4)
+
+ALLOBJS = $(AWKOBJS) awkgram$O getid$O $(OBJ)
+
+# LIBOBJS
+#       GNU and other stuff that gawk uses as library routines.
+LIBOBJS= getopt$O getopt1$O dfa$O regex$O random$O localeinfo$O
+
+GAWKOBJS = $(ALLOBJS) $(LIBOBJS)
+
+# clear out suffixes list
+# .SUFFIXES:
+.SUFFIXES: .c $O
+
+.c$O:
+	$(CC) -c $(CFLAGS) $<
+
+# rules to build gawk
+all : gawk.exe
+
+gawk.exe:: $(GAWKOBJS) $(RSP)
+	$(DO_LNK)
+	$(DO_BIND)
+
+$(RSPFILE) : $(GAWKOBJS)
+	echo $(AWKOBJS1)$P > $@
+	echo $(AWKOBJS2)$P >> $@
+	echo $(AWKOBJS3)$P >> $@
+	echo $(AWKOBJS4)$P >> $@
+	echo awkgram$O getid$O $(OBJ) $(LIBOBJS)$P >> $@
+
+# Notes to dependencies:
+# 1. The dependency on getopt.h is because unistd.h includes it,
+#    and we have -I. on the compiler command line.  unistd.h is
+#    included by awk.h.
+# 2. custom.h is not mentioned because pc ports don't use it.
+$(ALLOBJS) $(LIBOBJS): \
+  awk.h regex.h config.h gettext.h mbsupport.h protos.h dfa.h getopt.h nonposix.h
+
+builtin$O:	floatmagic.h random.h popen.h
+
+random$O:	random.h
+
+node$O:		floatmagic.h
+
+command$O debug$O:	cmd.h
+
+dfa$O:		xalloc.h
+
+gawkmisc$O:	pc/gawkmisc.pc socket.h
+
+getopt$O getopt1$O :	getopt_int.h
+
+io$O:		popen.h socket.h in.h
+
+regex$O:	regcomp.c regexec.c regex_internal.c regex_internal.h
+
+eval$O:		interpret.h
+
+localeinfo$O:	localeinfo.h
+
+# A bug in ndmake requires the following rule
+awkgram$O: awk.h awkgram.c
+	$(CC) -c $(CFLAGS) awkgram.c
+
+awkgram.c:	awkgram.y
+	bison -o awkgram.tmp awkgram.y
+	sed "s/parse error/syntax error/g" < awkgram.tmp > $@
+
+alloca$O:	alloca.c
+
+popen$O:	popen.h
+
+install: install$(install)
+	-$(MAKE) -C extension install-extensions
+
+# Note: The line that copies gawk.exe into awk.exe should come before
+# the line after it, which copies *awk.exe, to support the DJGPP "hard
+# link to executables" feature, whereby awk.exe is actually a small
+# stub that invokes gawk.exe.
+install1:
+	echo extproc sh $(prefix)/bin/igawk.cmd > igawk.cmd
+	echo shift >> igawk.cmd
+	cat pc/awklib/igawk >> igawk.cmd
+	cat pc/awklib/igawk.bat > igawk.bat
+	-mkdir "$(prefix)"
+	-mkdir "$(prefix)/include"
+	-mkdir "$(prefix)/bin"
+	-mkdir "$(prefix)/share"
+	-mkdir "$(prefix)/share/man"
+	-mkdir "$(prefix)/lib"
+	-mkdir "$(pkgdatadir)" "$(prefix)/share/man/man1" "$(prefix)/share/info"
+	-mkdir "$(prefix)/lib/gawk"
+	cp gawk.exe $(prefix)/bin/awk.exe
+	cp *awk.exe igawk.bat igawk.cmd pc/awklib/igawk $(prefix)/bin
+	cp gawkapi.h $(prefix)/include
+	cp awklib/eg/lib/* pc/awklib/igawk.awk $(pkgdatadir)
+	cp doc/*.1 $(prefix)/share/man/man1
+	cp doc/*.info $(prefix)/share/info
+	cp doc/*.png $(prefix)/share/info
+	cp doc/*.txt $(prefix)/share/info
+	rm -f $(prefix)/share/info/awkforai.txt
+
+# install2 is equivalent to install1, but doesn't require cp, sed, etc.
+install2:
+	gawk -v prefix=$(prefix) -f install.awk
+
+install-strip: install$(install)
+	strip "$(prefix)/bin"/*.exe
+	-$(MAKE) -C extension $@
+
+clean:
+	-rm -rf gawk *.exe gawk.map *.o *.obj core a.out $(RSPFILE) $(PRSPFILE) $(DRSPFILE) $(DYN_EXP) awkgram.tmp
+#	cd doc && $(MAKE) clean
+#	cd test && $(MAKE) clean
+#	cd awklib && $(MAKE) clean
+
+awklib/eg: doc/gawk.texi
+	rm -fr awklib/eg
+	sh -c "cd awklib && ../gawk -f extract.awk ../doc/gawk.texi"
+
+check:
+	@echo "Running the tests requires several unix-like utilities.  The"
+	@echo "recommendation is to copy pc/Makefile.tst to test/Makefile.  Under"
+	@echo "DOS, it may be necessary to run make from the test directory."
+# The `-k' option to make should be unnecessary if using pc/Makefile.tst.
+	sh -c "cd test && $(MAK) -k AWK=../gawk.exe"
+#	sh -c "cd test && $(MAK) AWK=../gawk.exe bigtest extra"
+
+test:	check
+
+# for those who have the necessary tools:
+TAGS:
+	etags awk.h *.y custom.h *.c *.h
+
+tags:
+	ctags awk.h *.y custom.h *.c *.h
+
+#========================================================================
+#================================= DOC ==================================
+#========================================================================
+
+DVIS = ./doc/gawk.dvi ./doc/gawkinet.dvi
+PDFS = ./doc/gawk.pdf ./doc/gawkinet.pdf
+PSS = ./doc/gawk.ps ./doc/gawkinet.ps
+HTMLS = ./doc/gawk.html ./doc/gawkinet.html
+INFOS = ./doc/gawk.info ./doc/gawkinet.info
+TEXINFOS = ./doc/gawk.texi ./doc/gawkinet.texi
+
+TEXI2DVI = texi2dvi --build-dir=./doc
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+DVIPS = dvips
+MAKEINFO = makeinfo --no-split --force
+MAKEINFOHTML = $(MAKEINFO) --html
+
+TROFF = groff -t -Tps -U
+#SEDME = sed -e "s/^level0 restore/level0 restore flashme 100 72 moveto (Copyright `date '+%m-%d-%y %T'`, FSF, Inc. (all)) show/" \
+#		-e "s/^\/level0 save def/\/level0 save def 30 -48 translate/"
+
+SEDME = sed "s/^\/level0 save def/\/level0 save def 30 -48 translate/"
+
+SEDME2 = sed "/%%Page: 10 10/,/0 Cg EP/d"
+
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+
+.texi.info:
+	$(MAKEINFO) -o $@ $<
+
+.texi.html:
+	$(MAKEINFOHTML) -o $@ $<
+
+.texi.dvi:
+	$(TEXI2DVI) -o $@ $<
+
+.texi.pdf:
+	$(TEXI2PDF) -o $@ $<
+
+.dvi.ps:
+	$(DVIPS) -o $@ $<
+
+./doc/awkcard.tr: ./doc/awkcard.in
+	cd doc
+	sed "s,SRCDIR,.," < awkcard.in > awkcard.tr
+	cd ..
+
+./doc/awkcard.nc: export GROFF_TMPDIR ?= .
+./doc/awkcard.nc: ./doc/macros ./doc/cardfonts ./doc/no.colors ./doc/awkcard.tr ./doc/ad.block ./doc/awkcard.in ./doc/setter.outline
+	cd doc
+	$(TROFF) ./macros ./cardfonts ./no.colors awkcard.tr | $(SEDME) | cat ./setter.outline - | $(SEDME2) > awkcard.ps
+	cd ..
+
+./doc/awkcard.ps: ./doc/awkcard.nc
+	cd doc
+	touch awkcard.nc
+	cd ..
+
+./doc/awkcard.pdf: ./doc/awkcard.ps
+	cd doc
+	ps2pdf ./awkcard.ps ./awkcard.pdf
+	cd ..
+
+doc: $(INFOS) $(DVIS) $(HTMLS) $(PSS) $(PDFS) ./doc/awkcard.ps ./doc/awkcard.pdf
diff --git a/gawk-5.0.1/pc/Makefile.ext b/gawk-5.0.1/pc/Makefile.ext
new file mode 100644
index 00000000000..4aa84facaef
--- /dev/null
+++ b/gawk-5.0.1/pc/Makefile.ext
@@ -0,0 +1,86 @@
+# extension/Makefile for the MinGW build
+#
+# Copyright (C) 2013 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+prefix = c:/gnu
+pkgdatadir = $(prefix)/lib/awk
+pkgextensiondir = $(prefix)/lib/gawk
+includedir = $(prefix)/include
+libdir = $(prefix)/lib
+datadir = $(prefix)/share
+pkgdatadir = $(datadir)/gawk-extensions
+pkgincludedir = $(includedir)/gawk-extensions
+pkglibdir = $(libdir)/gawk-extensions
+pkglibexecdir = $(libexecdir)/gawk-extensions
+
+SOEXT = dll
+
+MPFR = -DHAVE_MPFR
+MPFR_LIBS = -lmpfr -lgmp
+
+SIMPLE_EXTENSIONS = inplace.$(SOEXT) ordchr.$(SOEXT) readfile.$(SOEXT)\
+ revoutput.$(SOEXT) revtwoway.$(SOEXT) testext.$(SOEXT)
+ALL_EXTENSIONS = filefuncs.$(SOEXT) fnmatch.$(SOEXT) inplace.$(SOEXT)\
+ intdiv.$(SOEXT) ordchr.$(SOEXT) readdir.$(SOEXT) readfile.$(SOEXT) \
+ revoutput.$(SOEXT) readdir_test.$(SOEXT) revtwoway.$(SOEXT) rwarray.$(SOEXT) \
+ testext.$(SOEXT) time.$(SOEXT)
+
+extensions: $(ALL_EXTENSIONS)
+
+fnmatch.$(SOEXT): fnmatch.c
+	gcc -I.. -I../missing_d -DHAVE_FNMATCH_H -shared -gdwarf-2 -g3 -static-libgcc -o $@ fnmatch.c
+
+intdiv.$(SOEXT): intdiv.c
+	gcc -I.. $(MPFR) -shared -gdwarf-2 -g3 -static-libgcc -o $@ intdiv.c $(MPFR_LIBS)
+
+readdir.$(SOEXT): readdir.c gawkdirfd.h
+	gcc -I.. -DHAVE_DIRENT_H -shared -gdwarf-2 -g3 -static-libgcc -o $@ readdir.c
+
+readdir_test.$(SOEXT): readdir.c gawkdirfd.h
+	gcc -I.. -DHAVE_DIRENT_H -shared -gdwarf-2 -g3 -static-libgcc -o $@ readdir_test.c
+
+rwarray.$(SOEXT): rwarray.c
+	gcc -I.. -shared -gdwarf-2 -g3 -static-libgcc -o $@ rwarray.c -lws2_32
+
+filefuncs.$(SOEXT): filefuncs.c stack.c stack.h gawkfts.h
+	gcc -I.. -shared -gdwarf-2 -g3 -static-libgcc -o $@ filefuncs.c stack.c
+
+time.$(SOEXT): time.c
+	gcc -DHAVE_GETSYSTEMTIMEASFILETIME -I.. -shared -gdwarf-2 -g3 -static-libgcc -o $@ time.c
+
+$(SIMPLE_EXTENSIONS):
+	gcc -I.. -shared -gdwarf-2 -g3 -static-libgcc -o $@ $(@:.$(SOEXT)=.c)
+
+$(ALL_EXTENSIONS): ../gawkapi.h ../gettext.h
+
+inplace.$(SOEXT): inplace.c
+ordchr.$(SOEXT): ordchr.c
+readfile.$(SOEXT): readfile.c
+revoutput.$(SOEXT): revoutput.c
+rwarray.$(SOEXT): rwarray.c
+testext.$(SOEXT): testext.c
+time.$(SOEXT): time.c
+
+# This must not be called 'install' because there's a file INSTALL,
+# and case-insensitive filesystems will gladly accept it.
+install-extensions:
+	-mkdir "$(pkgextensiondir)"
+	cp *.$(SOEXT) "$(pkgextensiondir)"
+	-mkdir "$(prefix)/share/man/man3"
+	cp *.3am "$(prefix)/share/man/man3"
+
+install-strip: install-extensions
+	strip --strip-unneeded "$(pkgextensiondir)"/*.$(SOEXT)
+
+clean:
+	-rm -f *.$(SOEXT)
+
diff --git a/gawk-5.0.1/pc/Makefile.tst b/gawk-5.0.1/pc/Makefile.tst
new file mode 100644
index 00000000000..e6bf0352e60
--- /dev/null
+++ b/gawk-5.0.1/pc/Makefile.tst
@@ -0,0 +1,3461 @@
+# Makefile for GNU Awk test suite.
+#
+# Copyright (C) 1988-2018 the Free Software Foundation, Inc.
+# 
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+# 
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+# ============================================================================
+# MS-DOS & OS/2 Notes: READ THEM!
+# ============================================================================
+
+# As of version 2.91, efforts to make this makefile run in MS-DOS and OS/2
+# have started in earnest.  The following steps need to be followed in order 
+# to run this makefile:
+#
+# 1. The first thing that you will need to do is to convert all of the 
+#    files ending in ".ok" in the test directory, all of the files ending 
+#    in ".good" (or ".goo") in the test/reg directory, and mmap8k.in from
+#    having a linefeed to having carriage return/linefeed at the end of each
+#    line. There are various public domain UNIX to DOS converters and any 
+#    should work.  Alternatively, you can use diff instead of cmp--most 
+#    versions of diff don't care about how the lines end.
+#
+# 2. You will need an sh-compatible shell.  Please refer to the "README.pc"
+#    file in the README_d directory for information about obtaining a copy.
+#    You will also need various UNIX utilities.  At a minimum, you will 
+#    need: rm, tr, cmp (or diff, see above), cat, wc, and sh.  
+#    You should also have a UNIX-compatible date program.
+#
+# The makefile has only been tested with dmake 3.8 and DJGPP Make 3.74 or
+# later.  After making all of these changes, typing "dmake check extra"
+# or "make check extra" (with DJGPP Make) should run successfully.
+
+# The Bash shell (compiled with djgpp) works very well with the
+# djgpp-compiled gawk.  It is currently the recommended shell to use
+# for testing, along with DJGPP make.  See README.pc for 
+# more information on OS/2 and DOS shells.
+
+# You will almost certainly need to change some of the values (MACROS) 
+# defined on the next few lines.  
+
+# This won't work unless you have "sh" and set SHELL equal to it (Make 3.74
+# or later which comes with DJGPP will work with SHELL=/bin/sh if you have
+# sh.exe anywhere on your PATH).
+#SHELL = e:\bin\sh.exe
+SHELL = /bin/sh
+
+# Point to gawk
+AWK = AWKLIBPATH=../extension $(AWKPROG)
+AWKPROG = ../gawk.exe
+# Point $(LS) to a version of ls.exe that reports true Windows file
+# index numbers, because this is what the readdir test expects.
+# Otherwise, the readdir test will fail.  (The MSYS ls.exe doesn't
+# report full index values.)
+LS = ls.exe
+
+# Set your cmp command here (you can use most versions of diff instead of cmp
+# if you don't want to convert the .ok files to the DOS CR/LF format).
+# This is also an issue for the "mmap8k" test.  If it fails, make sure that
+# mmap8k.in has CR/LFs or that you've used diff.
+#
+# The following comment is for users of OSs which support long file names
+# (such as Windows 95) for all versions of gawk (both 16 & 32-bit).
+# If you use a shell which doesn't support long filenames, temporary files
+# created by this makefile will be truncated by your shell.  "_argarra" is an
+# example of this.  If $(CMP) is a DJGPP-compiled program, then it will fail
+# because it looks for the long filename (eg. _argarray).  To fix this, you
+# need to set LFN=n in your shell's environment.
+# NOTE: Setting LFN in the makefile most probably won't help you because LFN
+# needs to be an environment variable.
+#CMP = cmp
+# See the comment above for why you might want to set CMP to "env LFN=n diff"
+#CMP = env LFN=n diff
+#CMP = diff
+CMP = diff -u
+#CMP = gcmp
+
+# cmp replacement program for PC where the error messages aren't
+# exactly the same.  Should run even on old awk.
+TESTOUTCMP = $(AWK) -f ../testoutcmp.awk
+
+# Set your "cp," "mv," and "mkdir" commands here.  Note: DOS's copy must take
+# forward slashes.
+CP = cp
+#CP = : && command -c copy
+#CP  = command.com /c copy
+
+#MV = cmd.exe /c ren
+MV = mv
+
+MKDIR = mkdir
+#MKDIR = gmkdir
+#MKDIR = : && command -c mkdir
+#MKDIR  = command.com /c mkdir
+
+# Set your unix-style date function here
+#DATE = date
+DATE = gdate
+
+# Set sort command
+SORT = sort
+
+# MS-DOS and OS/2 use ; as a PATH delimiter
+PATH_SEPARATOR = ;
+
+# Argument to -F to produce -F/, should be // for MinGW, / otherwise,
+# because MSYS Bash converts a single slash to the equivalent Windows
+# directory.
+SLASH = /
+#SLASH = //
+
+# Non-default GREP_OPTIONS might fail the badargs test
+export GREP_OPTIONS=
+
+# ============================================================================
+# You shouldn't need to modify anything below this line.
+# ============================================================================
+
+srcdir = .
+abs_srcdir = .
+abs_builddir = .
+top_srcdir = "$(srcdir)"/..
+abs_top_builddir = "$(top_srcdir)"
+
+# Get rid of core files when cleaning and generated .ok file
+CLEANFILES = core core.* fmtspcl.ok
+
+# try to keep these sorted. each letter starts a new line
+BASIC_TESTS = \
+	addcomma anchgsub anchor argarray arrayind1 arrayind2 arrayind3 arrayparm \
+	arrayprm2 arrayprm3 arrayref arrymem1 arryref2 arryref3 arryref4 arryref5 \
+	arynasty arynocls aryprm1 aryprm2 aryprm3 aryprm4 aryprm5 aryprm6 aryprm7 \
+	aryprm8 aryprm9 arysubnm aryunasgn asgext awkpath \
+	assignnumfield assignnumfield2 \
+	back89 backgsub badassign1 badbuild \
+	callparam childin clobber closebad clsflnam compare compare2 \
+	concat1 concat2 concat3 concat4 concat5 convfmt \
+	datanonl defref delargv delarpm2 delarprm delfunc dfamb1 dfastress dynlj \
+	eofsplit eofsrc1 exit2 exitval1 exitval2 exitval3 \
+	fcall_exit fcall_exit2 fldchg fldchgnf fldterm fnamedat fnarray fnarray2 \
+	fnaryscl fnasgnm fnmisc fordel forref forsimp fsbs fscaret fsnul1 \
+	fsrs fsspcoln fstabplus funsemnl funsmnam funstack \
+	getline getline2 getline3 getline4 getline5 getlnbuf getnr2tb getnr2tm \
+	gsubasgn gsubtest gsubtst2 gsubtst3 gsubtst4 gsubtst5 gsubtst6 gsubtst7 \
+	gsubtst8 \
+	hex hex2 hsprint \
+	inpref inputred intest intprec iobug1 \
+	leaddig leadnl litoct longsub longwrds \
+	manglprm math membug1 memleak messages minusstr mmap8k \
+	nasty nasty2 negexp negrange nested nfldstr nfloop nfneg nfset nlfldsep \
+	nlinstr nlstrina noeffect nofile nofmtch noloop1 noloop2 nonl noparms \
+	nors nulinsrc nulrsend numindex numrange numstr1 numsubstr \
+	octsub ofmt ofmta ofmtbig ofmtfidl ofmts ofmtstrnum ofs1 onlynl \
+	opasnidx opasnslf \
+	paramasfunc1 paramasfunc2 paramdup paramres paramtyp paramuninitglobal \
+	parse1 parsefld parseme pcntplus posix2008sub prdupval prec printf0 \
+	printf1 printfchar prmarscl prmreuse prt1eval prtoeval \
+	rand randtest range1 range2 readbuf rebrackloc rebt8b1 rebuild redfilnm regeq \
+	regexpbrack regexpbrack2 regexprange regrange reindops reparse resplit \
+	rri1 rs rscompat rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 rstest3 \
+	rstest4 rstest5 rswhite \
+	scalar sclforin sclifin setrec0 setrec1 \
+	sigpipe1 sortempty sortglos spacere splitargv splitarr \
+	splitdef splitvar splitwht status-close strcat1 strnum1 strnum2 strtod \
+	subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 synerr3 \
+	tailrecurse tradanch trailbs tweakfld \
+	uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs uplus \
+	wideidx wideidx2 widesub widesub2 widesub3 widesub4 wjposer1 \
+	zero2 zeroe0 zeroflag
+
+UNIX_TESTS = \
+	fflush getlnhd localenl pid pipeio1 pipeio2 poundbang rtlen rtlen01 \
+	space strftlng
+
+GAWK_EXT_TESTS = \
+	aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort arraysort2 \
+	arraytype \
+	backw badargs beginfile1 beginfile2 binmode1 \
+	charasbytes colonwarn clos1way clos1way2 clos1way3 clos1way4 clos1way5 \
+	clos1way6 crlf \
+	dbugeval dbugeval2 dbugeval3 dbugtypedre1 dbugtypedre2 delsub \
+	devfd devfd1 devfd2 dfacheck1 dumpvars \
+	errno exit \
+	fieldwdth forcenum fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpatnull fsfwfs \
+	funlen functab1 functab2 functab3 fwtest fwtest2 fwtest3 fwtest4 \
+	fwtest5 fwtest6 fwtest7 fwtest8 \
+	genpot gensub gensub2 gensub3 getlndir gnuops2 gnuops3 gnureops gsubind \
+	icasefs icasers id igncdym igncfs ignrcas2 ignrcas4 ignrcase incdupe \
+	incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 include include2 \
+	indirectbuiltin indirectcall indirectcall2 intarray isarrayunset \
+	lint lintexp lintindex lintint lintlength lintold lintset lintwarn \
+	manyfiles match1 match2 match3 mbstr1 mbstr2 mixed1 mktime muldimposix \
+	nastyparm negtime next nondec nondec2 nonfatal1 nonfatal2 nonfatal3 \
+	nsbad nsbad_cmd nsforloop nsfuncrecurse nsindirect1 nsindirect2 nsprof1 nsprof2 \
+	patsplit posix printfbad1 printfbad2 printfbad3 printfbad4 printhuge \
+	procinfs profile0 profile1 profile2 profile3 profile4 profile5 profile6 \
+	profile7 profile8 profile9 profile10 profile11 profile12 pty1 pty2 \
+	rebuf regnul1 regnul2 regx8bit reginttrad reint reint2 rsgetline rsglstdin \
+	rsstart1 rsstart2 rsstart3 rstest6 \
+	sandbox1 shadow shadowbuiltin sortfor sortfor2 sortu \
+	sourcesplit split_after_fpat \
+	splitarg4 strftfld strftime strtonum strtonum1 switch2 symtab1 symtab2 \
+	symtab3 symtab4 symtab5 symtab6 symtab7 symtab8 symtab9 symtab10 \
+	timeout typedregex1 typedregex2 typedregex3 typedregex4 \
+	typeof1 typeof2 typeof3 typeof4 typeof5 \
+	watchpoint1
+
+ARRAYDEBUG_TESTS = arrdbg
+EXTRA_TESTS = inftest regtest ignrcas3 
+INET_TESTS = inetdayu inetdayt inetechu inetecht
+MACHINE_TESTS = double1 double2 intformat
+LOCALE_CHARSET_TESTS = \
+	asort asorti backbigs1 backsmalls1 backsmalls2 \
+	fmttest fnarydel fnparydl jarebug lc_num1 mbfw1 \
+	mbprintf1 mbprintf2 mbprintf3 mbprintf4 mbprintf5 \
+	mtchi18n nlstringtest rebt8b2 rtlenmb sort1 sprintfc
+
+SHLIB_TESTS = \
+	apiterm \
+	filefuncs fnmatch fork fork2 fts functab4 \
+	getfile \
+	inplace1 inplace2 inplace3 \
+	ordchr ordchr2 \
+	readdir readdir_test readdir_retest readfile readfile2 revout \
+	revtwoway rwarray \
+	testext time
+
+
+# List of the tests which should be run with --debug option:
+NEED_DEBUG = dbugtypedre1 dbugtypedre2 dbugeval2 dbugeval3 symtab10
+
+# List of the tests which should be run with --lint option:
+NEED_LINT = \
+	defref fmtspcl lintexp lintindex lintint lintlength lintwarn \
+	noeffect nofmtch nonl shadow uninit2 uninit3 uninit4 uninit5 uninitialized
+
+
+# List of the tests which should be run with --lint-old option:
+NEED_LINT_OLD = lintold
+
+# List of tests that must be run with -M
+NEED_MPFR = mpfrbigint mpfrbigint2 mpfrexprange mpfrfield mpfrieee mpfrmemok1 \
+	mpfrnegzero mpfrnr mpfrrem mpfrrnd mpfrrndeval mpfrsort mpfrsqrt \
+	mpfrstrtonum mpgforcenum mpfruplus
+
+
+# List of tests that need --non-decimal-data
+NEED_NONDEC = mpfrbigint2 nondec2 intarray forcenum
+
+# List of tests that need --posix
+NEED_POSIX = printf0 posix2008sub paramasfunc1 paramasfunc2 muldimposix
+
+# List of tests that need --pretty-print
+NEED_PRETTY = nsprof1 nsprof2 \
+	profile4 profile5 profile8 profile9 profile10 profile11
+
+
+# List of tests that need --re-interval
+NEED_RE_INTERVAL = gsubtst3 reint reint2
+
+# List of tests that need --sandbox
+NEED_SANDBOX = sandbox1
+
+# List of tests that need --traditional
+NEED_TRADITIONAL = litoct tradanch rscompat
+
+# Lists of tests that run a shell script
+RUN_SHELL = exit fflush localenl next randtest rtlen rtlen01
+
+# List of the tests which fail with EXIT CODE 1
+FAIL_CODE1 = \
+	badassign1 badbuild callparam delfunc fcall_exit fcall_exit2 \
+	fnamedat fnarray fnarray2 fnasgnm fnmisc funsmnam gsubasgn \
+	incdupe2 lintwarn match2 mixed1 noparms paramasfunc1 paramasfunc2 \
+	paramdup paramres parseme readbuf synerr1 synerr2 unterm
+
+
+# List of files which have .ok versions for MPFR
+CHECK_MPFR = \
+	rand fnarydel fnparydl
+
+
+# Lists of tests that need particular locales
+NEED_LOCALE_C = \
+	clos1way gsubtst6 range2
+
+NEED_LOCALE_EN = \
+	backbigs1 backsmalls1 backsmalls2 concat4 dfamb1 ignrcas2 lc_num1 \
+	mbfw1 mbprintf1 mbprintf3 mbprintf4 mbstr1 mbstr2 printhuge reint2 \
+	rri1 subamp subi18n wideidx wideidx2 widesub widesub2 widesub3 widesub4
+
+
+# Unused at the moment, since nlstringtest has additional stufff it does
+# NEED_LOCALE_FR =
+# Same for ignrcas3
+# NEED_LOCALE_GR =
+NEED_LOCALE_JP = mbprintf2
+NEED_LOCALE_RU = mtchi18n
+
+# List of tests that fail on DJGPP
+EXPECTED_FAIL_DJGPP = \
+	backbigs1 backsmalls1 backw beginfile1 clos1way clos1way2 \
+	clos1way3 clos1way4 clos1way5 clos1way6 errno getlndir \
+	getlnhd gnuops3 gnureops id ignrcas3 inetdayt inetdayu \
+	inetecht inetechu inftest jarebug mbfw1 mbprintf1 mbprintf4 \
+	mbstr1 mbstr2 mpfrsqrt nonfatal1 nonfatal2 nonfatal3 pid pty1 pty2 \
+	randtest regx8bit strtod sigpipe1 symtab6 timeout
+
+
+# List of tests that fail on MinGW
+EXPECTED_FAIL_MINGW = \
+	backbigs1 backsmalls1 clos1way6 devfd devfd1 devfd2 \
+	errno exitval2 fork fork2 fts getfile getlnhd ignrcas3 inetdayt \
+	inetecht mbfw1 mbprintf1 mbprintf4 mbstr1 mbstr2 pid pipeio2 \
+	pty1 pty2 readdir rstest4 rstest5 status-close timeout
+
+
+# List of tests that fail on z/OS
+EXPECTED_FAIL_ZOS = \
+	aasort aasorti arraysort asort asorti backbigs1 backsmalls1 \
+	backsmalls2 charasbytes concat4 dfamb1 double1 double2 fmttest \
+	forcenum gsubtst5 ignrcas2 lc_num1 localenl mbfw1 mbprintf1 \
+	mbprintf2 mbprintf3 mbprintf4 mbprintf5 mbstr1 mbstr2 numrange \
+	printhuge profile5 regrange reint2 rri1 sigpipe1 sortfor sortu \
+	subamp subi18n symtab1 symtab8 timeout wideidx wideidx2 \
+	widesub widesub2 widesub3 widesub4 \
+	beginfile1 beginfile2 clos1way6 errno getlndir nofile nonfatal2 space
+
+
+# List of the files that appear in manual tests or are for reserve testing:
+GENTESTS_UNUSED = Makefile.in checknegtime.awk dtdgport.awk fix-fmtspcl.awk \
+	fmtspcl-mpfr.ok fmtspcl.awk fmtspcl.tok gtlnbufv.awk hello.awk \
+	inchello.awk inclib.awk inplace.1.in inplace.2.in inplace.in \
+	printfloat.awk readdir0.awk valgrind.awk xref.awk
+
+
+# List of tests on MinGW or DJGPP that need a different cmp program
+NEED_TESTOUTCMP = \
+	beginfile2 double2 exit fmttest hsprint posix profile5 space
+
+
+
+# Message stuff is to make it a little easier to follow.
+# Make the pass-fail last and dependent on others to avoid
+# spurious errors if `make -j' in effect.
+check:	msg \
+	printlang \
+	basic-msg-start  basic           basic-msg-end \
+	unix-msg-start   unix-tests      unix-msg-end \
+	extend-msg-start gawk-extensions arraydebug-tests extend-msg-end \
+	machine-msg-start machine-tests machine-msg-end \
+	charset-tests-all \
+	shlib-msg-start  shlib-tests     shlib-msg-end \
+	mpfr-msg-start   mpfr-tests      mpfr-msg-end
+	@-$(MAKE) pass-fail || { $(MAKE) diffout; exit 1; }
+
+basic:	$(BASIC_TESTS)
+
+unix-tests: $(UNIX_TESTS)
+
+gawk-extensions: $(GAWK_EXT_TESTS)
+
+charset-tests-all:
+	@-case `uname` in \
+	*MINGW* | *MS-DOS*) \
+		$(MAKE) charset-msg-start charset-tests charset-msg-end ;; \
+	*) \
+		if locale -a | grep -i 'en_US.UTF.*8' > /dev/null && \
+		   locale -a | grep -i 'fr_FR.UTF.*8' > /dev/null && \
+		   locale -a | grep -i 'ru_RU.UTF.*8' > /dev/null && \
+		   locale -a | grep -i 'ja_JP.UTF.*8' > /dev/null  ; \
+		then \
+			$(MAKE) charset-msg-start charset-tests charset-msg-end; \
+		else \
+			echo %%%%%%%%%% Inadequate locale support: skipping charset tests. ; \
+			echo %%%%%%%%%% At least ENU_USA.1252, FRA_FRA.1252, RUS_RUS.1251 and JPN_JPN.932 are needed. ; \
+		fi ;; \
+	esac
+
+charset-tests: $(LOCALE_CHARSET_TESTS)
+
+extra:	$(EXTRA_TESTS) inet
+
+inet:	inetmesg $(INET_TESTS)
+
+machine-tests: $(MACHINE_TESTS)
+
+# The blank between ' and /MPFR/ is for running tests on Windows under
+# MSYS, which thinks /MPFR is a Unix-style file name and converts it
+# to Windows format, butchering it in the process.  Likewise for /API/
+# in the next shlib-tests.
+mpfr-tests:
+	@-if $(AWK) --version | $(AWK) ' /MPFR/ { exit 1 }' ; then \
+	echo MPFR tests not supported on this system ; \
+	else $(MAKE) $(NEED_MPFR) ; \
+	fi
+
+arraydebug-tests:
+	@-if echo $(CFLAGS) | grep ARRAYDEBUG > /dev/null ; then \
+	$(MAKE) $(ARRAYDEBUG_TESTS) ; \
+	else echo gawk is not compiled to support the array debug tests ; \
+	fi
+
+shlib-tests:
+	@-if $(AWK) --version | $(AWK) ' /API/ { exit 1 }' ; then \
+	echo shlib tests not supported on this system ; \
+	else $(MAKE) shlib-real-tests ; \
+	fi
+
+shlib-real-tests: $(SHLIB_TESTS)
+
+msg::
+	@echo ''
+	@echo 'Any output from "$(CMP)" is bad news, although some differences'
+	@echo 'in floating point values are probably benign -- in particular,'
+	@echo 'some systems may omit a leading zero and the floating point'
+	@-echo 'precision may lead to slightly different output in a few cases.'
+
+printlang::
+	@-$(AWK) -f "$(srcdir)"/printlang.awk
+
+basic-msg-start:
+	@-echo "======== Starting basic tests ========"
+
+basic-msg-end:
+	@-echo "======== Done with basic tests ========"
+
+unix-msg-start:
+	@-echo "======== Starting Unix tests ========"
+
+unix-msg-end:
+	@-echo "======== Done with Unix tests ========"
+
+extend-msg-start:
+	@-echo "======== Starting gawk extension tests ========"
+
+extend-msg-end:
+	@-echo "======== Done with gawk extension tests ========"
+
+machine-msg-start:
+	@-echo "======== Starting machine-specific tests ========"
+
+machine-msg-end:
+	@-echo "======== Done with machine-specific tests ========"
+
+charset-msg-start:
+	@echo "======== Starting tests that can vary based on character set or locale support ========"
+	@echo "**************************************************************************"
+	@echo "* Some or all of these tests may fail if you have inadequate or missing  *"
+	@echo "* locale support. At least ENU_USA.1252, FRA_FRA.1252, RUS_RUS.1251 and     *"
+	@echo "* JPN_JPN.932 are needed. The ell_GRC.1253 is optional but helpful.    *"
+	@echo "* However, if you see this message, the Makefile thinks you have what    *"
+	@echo "* you need ...                                                           *"
+	@-echo "**************************************************************************"
+
+charset-msg-end:
+	@-echo "======== Done with tests that can vary based on character set or locale support ========"
+
+shlib-msg-start:
+	@-echo "======== Starting shared library tests ========"
+
+shlib-msg-end:
+	@-echo "======== Done with shared library tests ========"
+
+mpfr-msg-start:
+	@-echo "======== Starting MPFR tests ========"
+
+mpfr-msg-end:
+	@-echo "======== Done with MPFR tests ========"
+
+# This test is a PITA because increasingly, /tmp is getting
+# mounted noexec.  So, we'll test it locally.  Sigh.
+#
+# More PITA; some systems have medium short limits on #! paths,
+# so this can still fail
+poundbang::
+	@echo $@
+	@sed "s;/tmp/gawk;`pwd`/$(AWKPROG);" < "$(srcdir)"/poundbang.awk > ./_pbd.awk
+	@chmod +x ./_pbd.awk
+	@if ./_pbd.awk "$(srcdir)"/poundbang.awk > _`basename $@` ; \
+	then : ; \
+	else \
+		sed "s;/tmp/gawk;$(AWKPROG);" < "$(srcdir)"/poundbang.awk > ./_pbd.awk ; \
+		chmod +x ./_pbd.awk ; \
+		LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C} ./_pbd.awk "$(srcdir)"/poundbang.awk > _`basename $@`;  \
+	fi
+	@-$(CMP) "$(srcdir)"/poundbang.awk _`basename $@` && rm -f _`basename $@` _pbd.awk
+
+messages::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/messages.awk >_out2 2>_out3 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/out1.ok _out1 && $(CMP) "$(srcdir)"/out2.ok _out2 && $(CMP) "$(srcdir)"/out3.ok _out3 && rm -f _out1 _out2 _out3
+
+argarray::
+	@echo $@
+	@cp "$(srcdir)"/argarray.in ./argarray.input
+	@TEST=test echo just a test | $(AWK) -f "$(srcdir)"/argarray.awk ./argarray.input - >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f ./argarray.input
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regtest::
+	@echo $@
+	@echo 'Some of the output from regtest is very system specific, do not'
+	@echo 'be distressed if your output differs from that distributed.'
+	@echo 'Manual inspection is called for.'
+	@-AWK=$(AWKPROG) "$(srcdir)"/regtest.sh
+
+manyfiles::
+	@echo $@
+	@rm -rf junk
+	@mkdir junk
+	@$(AWK) 'BEGIN { for (i = 1; i <= 1030; i++) print i, i}' >_$@
+	@$(AWK) -f "$(srcdir)"/manyfiles.awk _$@ _$@ || echo EXIT CODE: $$? >> _$@
+	@wc -l junk/* | $(AWK) '$$1 != 2' | wc -l | sed "s/  *//g" > _$@
+	@rm -rf junk
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+compare::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/compare.awk 0 1 "$(srcdir)"/compare.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inftest::
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@echo This test is very machine specific...
+	@$(AWK) -f "$(srcdir)"/inftest.awk | sed "s/inf/Inf/g" >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline2::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/getline2.awk "$(srcdir)"/getline2.awk "$(srcdir)"/getline2.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+awkpath::
+	@echo $@
+	@AWKPATH="$(srcdir)$(PATH_SEPARATOR)$(srcdir)/lib" $(AWK) -f awkpath.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+argtest::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/argtest.awk -x -y abc >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+badargs::
+	@echo $@
+	@-$(AWK) -f 2>&1 | grep -v patchlevel >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strftime::
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C ; export GAWKLOCALE; \
+	TZ=GMT0; export TZ; \
+	$(AWK) -v OUTPUT=_$@ -v DATECMD="$(DATE)" -f "$(srcdir)"/strftime.awk || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) strftime.ok _$@ && rm -f _$@ strftime.ok || exit 0
+
+devfd::
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@$(AWK) 1 /dev/fd/4 /dev/fd/5 4<"$(srcdir)"/devfd.in4 5<"$(srcdir)"/devfd.in5 >_$@ 2>&1 || echo EXIT CODE: $$? >> _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# This cannot be autogenerated; we want it to read the input name
+# on the command line.
+errno:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+tweakfld::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/tweakfld.awk "$(srcdir)"/tweakfld.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f errors.cleanup
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# AIX /bin/sh exec's the last command in a list, therefore issue a ":"
+# command so that pid.sh is fork'ed as a child before being exec'ed.
+pid::
+	@echo $@
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@AWKPATH="$(srcdir)" AWK=$(AWKPROG) $(SHELL) "$(srcdir)"/pid.sh $$$$ > _`basename $@` ; :
+	@-$(CMP) "$(srcdir)"/pid.ok _`basename $@` && rm -f _`basename $@`
+
+strftlng::
+	@echo $@
+	@TZ=UTC; export TZ; $(AWK) -f "$(srcdir)"/strftlng.awk >_$@
+	@if $(CMP) "$(srcdir)"/strftlng.ok _$@ >/dev/null 2>&1 ; then : ; else \
+	TZ=UTC0; export TZ; $(AWK) -f "$(srcdir)"/strftlng.awk >_$@ ; \
+	fi
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nors::
+	@echo $@
+	@echo A B C D E | tr -d '\12\15' | $(AWK) '{ print $$NF }' - "$(srcdir)"/nors.in > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# fmtspcl.ok: fmtspcl.tok Makefile fix-fmtspcl.awk
+# 	@$(AWK) -v "sd=$(srcdir)" -f "$(srcdir)/fix-fmtspcl.awk" < "$(srcdir)"/fmtspcl.tok > $@ 2>/dev/null
+# 
+# fmtspcl: fmtspcl.ok
+# 	@echo $@
+# 	@$(AWK) $(AWKFLAGS) -f "$(srcdir)"/fmtspcl.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+# 	@-if test -z "$$AWKFLAGS" ; then $(CMP) $@.ok _$@ && rm -f _$@ ; else \
+# 	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+# 	fi
+
+rebuf::
+	@echo $@
+	@AWKBUFSIZE=4096 AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsglstdin:: 
+	@echo $@
+	@cat  "$(srcdir)"/rsgetline.in | AWKPATH="$(srcdir)" $(AWK) -f rsgetline.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pipeio1::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/pipeio1.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f test1 test2
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pipeio2::
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@$(AWK) -v SRCDIR="$(srcdir)" -f "$(srcdir)"/pipeio2.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clobber::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/clobber.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/clobber.ok seq && $(CMP) "$(srcdir)"/clobber.ok _$@ && rm -f _$@
+	@-rm -f seq
+
+arynocls::
+	@echo $@
+	@-AWKPATH="$(srcdir)" $(AWK) -v INPUT="$(srcdir)"/arynocls.in -f arynocls.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getlnbuf::
+	@echo $@
+	@-AWKPATH="$(srcdir)" $(AWK) -f getlnbuf.awk "$(srcdir)"/getlnbuf.in > _$@ || echo EXIT CODE: $$? >> _$@
+	@-AWKPATH="$(srcdir)" $(AWK) -f gtlnbufv.awk "$(srcdir)"/getlnbuf.in > _2$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/getlnbuf.ok _$@ && $(CMP) "$(srcdir)"/getlnbuf.ok _2$@ && rm -f _$@ _2$@
+
+inetmesg::
+	@echo These tests only work if your system supports the services
+	@echo "'discard'" at port 9 and "'daytimed'" at port 13. Check your
+	@-echo file /etc/services and do "'netstat -a'".
+
+inetechu::
+	@echo Expect $@ to fail with DJGPP.
+	@echo This test is for establishing UDP connections
+	@-$(AWK) 'BEGIN {print "" |& "/inet/udp/0/127.0.0.1/9"}'
+
+inetecht::
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo This test is for establishing TCP connections
+	@-$(AWK) 'BEGIN {print "" |& "/inet/tcp/0/127.0.0.1/9"}'
+
+inetdayu::
+	@echo Expect $@ to fail with DJGPP.
+	@echo This test is for bidirectional UDP transmission
+	@-$(AWK) 'BEGIN { print "" |& "/inet/udp/0/127.0.0.1/13"; \
+	"/inet/udp/0/127.0.0.1/13" |& getline; print $0}'
+
+inetdayt::
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo This test is for bidirectional TCP transmission
+	@-$(AWK) 'BEGIN { print "" |& "/inet/tcp/0/127.0.0.1/13"; \
+	"/inet/tcp/0/127.0.0.1/13" |& getline; print $0}'
+
+redfilnm::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/redfilnm.awk srcdir="$(srcdir)" "$(srcdir)"/redfilnm.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+space::
+	@echo $@ $(ZOS_FAIL)
+	@$(AWK) -f ' ' "$(srcdir)"/space.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(TESTOUTCMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsnulbig::
+	@echo $@
+	@ : Suppose that block size for pipe is at most 128kB:
+	@$(AWK) 'BEGIN { for (i = 1; i <= 128*64+1; i++) print "abcdefgh123456\n" }' 2>&1 | \
+	$(AWK) 'BEGIN { RS = ""; ORS = "\n\n" }; { print }' 2>&1 | \
+	$(AWK) ' /^[^a]/; END{ print NR }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsnulbig2::
+	@echo $@
+	@$(AWK) 'BEGIN { ORS = ""; n = "\n"; for (i = 1; i <= 10; i++) n = (n n); \
+		for (i = 1; i <= 128; i++) print n; print "abc\n" }' 2>&1 | \
+		$(AWK) 'BEGIN { RS = ""; ORS = "\n\n" };{ print }' 2>&1 | \
+		$(AWK) ' /^[^a]/; END { print NR }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# This test makes sure gawk exits with a zero code.
+# Thus, unconditionally generate the exit code.
+exitval1::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/exitval1.awk >_$@ 2>&1; echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsspcoln::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk 'FS=[ :]+' "$(srcdir)"/$@.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsstart3::
+	@echo $@
+	@head "$(srcdir)"/rsstart1.in | $(AWK) -f "$(srcdir)"/rsstart2.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# FIXME: Gentests can't really deal with something that is both a shell script
+# and requires a locale. We might can fix that ...
+rtlenmb::
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE ; \
+	"$(srcdir)"/rtlen.sh >_$@ || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nofile::
+	@echo $@ $(ZOS_FAIL)
+	@$(AWK) '{}' no/such/file >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+binmode1::
+	@echo $@
+	@$(AWK) -v BINMODE=3 'BEGIN { print BINMODE }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+devfd1::
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@$(AWK) -f "$(srcdir)"/$@.awk 4< "$(srcdir)"/devfd.in1 5< "$(srcdir)"/devfd.in2 >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# The program text is the '1' which will print each record. How compact can you get?
+devfd2::
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@$(AWK) 1 /dev/fd/4 /dev/fd/5 4< "$(srcdir)"/devfd.in1 5< "$(srcdir)"/devfd.in2 >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mixed1::
+	@echo $@
+	@$(AWK) -f /dev/null --source 'BEGIN {return junk}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf5::
+	@echo $@ $(ZOS_FAIL)
+	@-case `uname` in \
+	CYGWIN* | MINGW32* | *MS-DOS*) echo this test fails on this system --- skipping $@ ;; \
+	*) \
+	[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE ; \
+	$(AWK) -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >> _$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	esac
+
+printfbad2: printfbad2.ok
+	@echo $@
+	@$(AWK) --lint -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in 2>&1 | sed 's;$(srcdir)/;;g' >_$@ || echo EXIT CODE: $$?  >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+beginfile1::
+	@echo Expect $@ to fail with DJGPP.
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk "$(srcdir)"/$@.awk . ./no/such/file Makefile  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+beginfile2:
+	@echo $@ $(ZOS_FAIL)
+	@-( cd "$(srcdir)" && LC_ALL=C AWK="$(abs_builddir)/$(AWKPROG)" $(abs_srcdir)/$@.sh $(abs_srcdir)/$@.in ) > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(TESTOUTCMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dumpvars::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --dump-variables 1 < "$(srcdir)"/$@.in >/dev/null 2>&1 || echo EXIT CODE: $$? >>_$@ || echo EXIT CODE: $$? >> _$@
+	@grep -v ENVIRON < awkvars.out | grep -v PROCINFO > _$@; rm awkvars.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile0:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile1:
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/xref.awk "$(srcdir)"/dtdgport.awk > _$@.out1
+	@$(AWK) --pretty-print=ap-$@.out -f "$(srcdir)"/xref.awk
+	@$(AWK) -f ./ap-$@.out "$(srcdir)"/dtdgport.awk > _$@.out2 ; rm ap-$@.out
+	@-$(CMP) _$@.out1 _$@.out2 && rm _$@.out[12] || { echo EXIT CODE: $$? >>_$@ ; \
+	cp "$(srcdir)"/dtdgport.awk $@.ok ; }
+
+profile2:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -v sortcmd=$(SORT) -f "$(srcdir)"/xref.awk "$(srcdir)"/dtdgport.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile3:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile6:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile7:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile12:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrieee:
+	@echo $@
+	@$(AWK) -M -vPREC=double -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrexprange:
+	@echo $@
+	@$(AWK) -M -vPREC=53 -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrrnd:
+	@echo $@
+	@$(AWK) -M -vPREC=53 -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrsort:
+	@echo $@
+	@$(AWK) -M -vPREC=53 -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfruplus:
+	@echo $@
+	@$(AWK) -M -f "$(srcdir)"/uplus.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrmemok1:
+	@echo $@
+	@$(AWK) -p- -M -f "$(srcdir)"/$@.awk 2>&1 | sed 1d > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+jarebug::
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@"$(srcdir)"/$@.sh "$(AWKPROG)" "$(srcdir)"/$@.awk "$(srcdir)"/$@.in "_$@" || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ordchr2::
+	@echo $@
+	@$(AWK) --load ordchr 'BEGIN {print chr(ord("z"))}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# N.B. If the test fails, create readfile.ok so that "make diffout" will work
+readfile::
+	@echo $@
+	@$(AWK) -l readfile 'BEGIN {printf "%s", readfile("$(srcdir)/Makefile.am")}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)/Makefile.am" _$@ && rm -f _$@ || cp -p "$(srcdir)/Makefile.am" $@.ok
+
+readfile2::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.awk "$(srcdir)"/readdir.awk > _$@ || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+include2::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --include inclib 'BEGIN {print sandwich("a", "b", "c")}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -i inclib -i inclib.awk 'BEGIN {print sandwich("a", "b", "c")}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe2::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f inclib -f inclib.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe3::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f hello -f hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe4::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f hello -i hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe5::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -i hello -f hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe6::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -i inchello -f hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe7::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f hello -i inchello >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inplace1::
+	@echo $@
+	@cp "$(srcdir)"/inplace.1.in _$@.1
+	@cp "$(srcdir)"/inplace.2.in _$@.2
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+	@-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1
+	@-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2
+
+inplace2::
+	@echo $@
+	@cp "$(srcdir)"/inplace.1.in _$@.1
+	@cp "$(srcdir)"/inplace.2.in _$@.2
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+	@-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1
+	@-$(CMP) "$(srcdir)"/$@.1.bak.ok _$@.1.bak && rm -f _$@.1.bak
+	@-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2
+	@-$(CMP) "$(srcdir)"/$@.2.bak.ok _$@.2.bak && rm -f _$@.2.bak
+
+inplace3::
+	@echo $@
+	@cp "$(srcdir)"/inplace.1.in _$@.1
+	@cp "$(srcdir)"/inplace.2.in _$@.2
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "Before"} {gsub(/bar/, "foo"); print} END {print "After"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+	@-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1
+	@-$(CMP) "$(srcdir)"/$@.1.bak.ok _$@.1.bak && rm -f _$@.1.bak
+	@-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2
+	@-$(CMP) "$(srcdir)"/$@.2.bak.ok _$@.2.bak && rm -f _$@.2.bak
+
+testext::
+	@echo $@
+	@$(AWK) ' /^(@load|BEGIN)/,/^}/' "$(top_srcdir)"/extension/testext.c > testext.awk
+	@$(AWK) -f ./testext.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ testext.awk testexttmp.txt
+
+getfile:
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@AWKPATH="$(srcdir)" $(AWK) -v TESTEXT_QUIET=1 -ltestext -f $@.awk < $(srcdir)/$@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+readdir:
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@if [ "`uname`" = Linux ] && [ "`stat -f . 2>/dev/null | awk 'NR == 2 { print $$NF }'`" = nfs ];  then \
+	echo This test may fail on GNU/Linux systems when run on NFS or JFS filesystems.; \
+	echo If it does, try rerunning on an ext'[234]' filesystem. ; \
+	fi
+	@$(AWK) -f "$(srcdir)"/readdir.awk "$(top_srcdir)" > _$@ || echo EXIT CODE: $$? >> _$@
+	@$(LS) -afi "$(top_srcdir)" > _dirlist
+	@$(LS) -lna "$(top_srcdir)" | sed 1d > _longlist
+	@$(AWK) -f "$(srcdir)"/readdir0.awk -v extout=_$@  \
+		-v dirlist=_dirlist -v longlist=_longlist > $@.ok
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@ _dirlist _longlist
+
+readdir_test:
+	@echo $@
+	@$(AWK) -lreaddir -F$(SLASH) '{printf "[%s] [%s] [%s] [%s]\n", $$1, $$2, $$3, $$4}' "$(top_srcdir)" > $@.ok
+	@$(AWK) -lreaddir_test '{printf "[%s] [%s] [%s] [%s]\n", $$1, $$2, $$3, $$4}' "$(top_srcdir)" > _$@
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@
+
+readdir_retest:
+	@echo $@
+	@$(AWK) -lreaddir -F$(SLASH) -f "$(srcdir)"/$@.awk "$(top_srcdir)" > $@.ok
+	@$(AWK) -lreaddir_test -F$(SLASH) -f "$(srcdir)"/$@.awk "$(top_srcdir)" > _$@
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@
+
+fts:
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@case `uname` in \
+	IRIX) \
+	echo This test may fail on IRIX systems when run on an NFS filesystem.; \
+	echo If it does, try rerunning on an xfs filesystem. ;; \
+	CYGWIN*) \
+	echo This test may fail on CYGWIN systems when run on an NFS filesystem.; \
+	echo If it does, try rerunning on an ntfs filesystem. ;; \
+	esac
+	@$(AWK) -f "$(srcdir)"/fts.awk || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@
+
+# BINMODE=2 is needed for PC tests.
+charasbytes:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -b -v BINMODE=2 -f $@.awk "$(srcdir)"/$@.in | \
+	od -c -t x1 | tr '	' ' ' | sed -e 's/  */ /g' -e 's/ *$$//' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab6:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab8:
+	@echo $@ $(ZOS_FAIL)
+	@$(AWK) -d__$@ -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in >_$@
+	@grep -v '^ENVIRON' __$@ | grep -v '^PROCINFO' | grep -v '^FILENAME' >> _$@ ; rm __$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab9:
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f testit.txt
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reginttrad:
+	@echo $@
+	@$(AWK) --traditional -r -f "$(srcdir)"/$@.awk > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+colonwarn:
+	@echo $@
+	@for i in 1 2 3 ; \
+	do $(AWK) -f "$(srcdir)"/$@.awk $$i < "$(srcdir)"/$@.in ; \
+	done > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugeval::
+	@echo $@
+	@-if [ -t 0 ]; then \
+	$(AWK) --debug -f /dev/null < "$(srcdir)"/$@.in > _$@  2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	fi
+
+filefuncs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk -v builddir="$(abs_top_builddir)"  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+genpot:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk --gen-pot >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+negtime::
+	@echo $@
+	@TZ=GMT AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-AWKPATH="$(srcdir)" $(AWK) -f checknegtime.awk "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+watchpoint1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -D -f $@.awk $(srcdir)/$@.in < $(srcdir)/$@.script >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pty1:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@-case `uname` in \
+	*[Oo][Ss]/390*) : ;; \
+	*) AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ;; \
+	esac
+
+pty2:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@-case `uname` in \
+	*[Oo][Ss]/390*) : ;; \
+	*) AWKPATH="$(srcdir)" $(AWK) -f $@.awk | od -c | $(AWK) '{ $$1 = $$1 ; print }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ;; \
+	esac
+
+ignrcas3::
+	@echo $@
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@-if locale -a | grep ell_GRC.1253 > /dev/null ; then \
+	[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ell_GRC.1253 ; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	fi
+
+arrdbg:
+	@echo $@
+	@$(AWK) -v "okfile=./$@.ok" -f "$(srcdir)"/$@.awk | grep array_f >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) ./$@.ok _$@ && rm -f _$@ ./$@.ok
+
+sourcesplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --source='BEGIN { a = 5;' --source='print a }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+eofsrc1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@a.awk -f $@b.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsbad_cmd:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -v foo:bar=3 -v foo:::blat=4 1 /dev/null >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# Use [:] in the regexp to keep MSYS from converting the /'s to \'s.
+nonfatal1:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk 2>&1 | $(AWK) '{print gensub(/invalid[:].*$$/, "invalid", 1, $$0)}' >_$@ || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# 4/2018: On first call to $(CMP), send to /dev/null even with -s for MinGW.
+nlstringtest::
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=FRA_FRA.1252 ; export GAWKLOCALE ; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk "$(srcdir)" >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if $(CMP) -s "$(srcdir)"/nlstringtest-nogettext.ok _$@ > /dev/null ; \
+	then \
+		rm -f _$@ ; \
+	else \
+		$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	fi
+
+longwrds:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk -v SORT="$(SORT)" < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+spacere:
+	@echo $@
+	@LC_ALL=C AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex4:
+	@echo $@
+	@$(AWK) -v x=@$(SLASH)foo/ -f "$(srcdir)"/$@.awk y=@$(SLASH)bar/ /dev/null >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+Gt-dummy:
+# file Maketests, generated from Makefile.am by the Gentests program
+addcomma:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+anchgsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+anchor:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayind1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayind2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayind3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayparm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayprm2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayprm3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrymem1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arynasty:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm9:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arysubnm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryunasgn:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+asgext:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+assignnumfield:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+assignnumfield2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+back89:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backgsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+badassign1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+badbuild:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+callparam:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+childin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+closebad:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clsflnam:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+compare2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat4:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+convfmt:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+datanonl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+defref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delargv:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delarpm2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delarprm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delfunc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dfamb1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dfastress:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dynlj:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+eofsplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exit2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exitval2:
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exitval3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fcall_exit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fcall_exit2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fldchg:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fldchgnf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fldterm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnamedat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnarray:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnarray2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnaryscl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnasgnm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnmisc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fordel:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+forref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+forsimp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsbs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fscaret:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsnul1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsrs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fstabplus:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funsemnl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funsmnam:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funstack:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getnr2tb:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getnr2tm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubasgn:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtest:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --re-interval < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst5:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst6:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+hex:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+hex2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+hsprint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(TESTOUTCMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inpref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inputred:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intest:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intprec:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+iobug1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+leaddig:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+leadnl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+litoct:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --traditional < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+longsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+manglprm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+math:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+membug1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+memleak:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+minusstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mmap8k:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nasty:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nasty2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+negexp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+negrange:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nested:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfldstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfloop:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfneg:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfset:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nlfldsep:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nlinstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nlstrina:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noeffect:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nofmtch:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noloop1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noloop2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nonl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noparms:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nulinsrc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nulrsend:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numindex:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numrange:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numstr1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numsubstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+octsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmt:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmta:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmtbig:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmtfidl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmts:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmtstrnum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofs1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+onlynl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+opasnidx:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+opasnslf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramasfunc1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramasfunc2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramdup:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramres:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramtyp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramuninitglobal:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+parse1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+parsefld:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+parseme:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pcntplus:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+posix2008sub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prdupval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prec:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printf0:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printf1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfchar:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prmarscl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prmreuse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prt1eval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prtoeval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rand:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+	fi
+
+randtest:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+range1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+range2:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+readbuf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebrackloc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebt8b1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebuild:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regeq:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regexpbrack:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regexpbrack2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regexprange:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regrange:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reindops:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reparse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+resplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rri1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rscompat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --traditional < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsnul1nl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest4:
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest5:
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rswhite:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+scalar:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sclforin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sclifin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+setrec0:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+setrec1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sigpipe1:
+	@echo Expect $@ to fail with DJGPP.
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortempty:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortglos:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitargv:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitarr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitdef:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitvar:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitwht:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+status-close:
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strcat1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strnum1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strnum2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strtod:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subamp:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subback:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subi18n:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subsepnm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subslash:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+substr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+swaplns:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+synerr1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+synerr2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+synerr3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+tailrecurse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+tradanch:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --traditional < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+trailbs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninitialized:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+unterm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uparrfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uplus:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+wideidx:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+wideidx2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub3:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub4:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+wjposer1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+zero2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+zeroe0:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+zeroflag:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fflush:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getlnhd:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+localenl:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rtlen:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rtlen01:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aadelete1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aadelete2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aarray1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aasort:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aasorti:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arraysort:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arraysort2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arraytype:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backw:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way2:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way3:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way4:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way5:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way6:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+crlf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugeval2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugeval3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugtypedre1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugtypedre2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dfacheck1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exit:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(TESTOUTCMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fieldwdth:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+forcenum:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpatnull:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsfwfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funlen:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gensub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gensub2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gensub3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getlndir:
+	@echo Expect $@ to fail with DJGPP.
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gnuops2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gnuops3:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gnureops:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubind:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+icasefs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+icasers:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+id:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+igncdym:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+igncfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ignrcas2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ignrcas4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ignrcase:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+include:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+indirectbuiltin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+indirectcall:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+indirectcall2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intarray:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+isarrayunset:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintexp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintindex:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintlength:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintold:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint-old < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintset:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintwarn:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+match1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+match2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+match3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbstr1:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbstr2:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mktime:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+muldimposix:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nastyparm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+next:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nondec:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nondec2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nonfatal2:
+	@echo Expect $@ to fail with DJGPP.
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nonfatal3:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsbad:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsforloop:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsfuncrecurse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsindirect1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsindirect2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsprof1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsprof2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+patsplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+posix:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(TESTOUTCMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfbad1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfbad3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfbad4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printhuge:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+procinfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile5:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(TESTOUTCMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile9:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile10:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile11:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regnul1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regnul2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regx8bit:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --re-interval < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reint2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --re-interval < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsgetline:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsstart1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsstart2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sandbox1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --sandbox >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+shadow:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+shadowbuiltin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortfor:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortfor2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortu:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+split_after_fpat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitarg4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strftfld:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strtonum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strtonum1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+switch2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab1:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab10:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+timeout:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+double1:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+double2:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(TESTOUTCMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intformat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+asort:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+asorti:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backbigs1:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backsmalls1:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backsmalls2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fmttest:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(TESTOUTCMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnarydel:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+	fi
+
+fnparydl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+	fi
+
+lc_num1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbfw1:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf1:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf3:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf4:
+	@echo Expect $@ to fail with DJGPP and MinGW.
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ENU_USA.1252; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mtchi18n:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=RUS_RUS.1251; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebt8b2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sort1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sprintfc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+apiterm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnmatch:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fork:
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fork2:
+	@echo $@
+	@echo Expect $@ to fail with MinGW.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ordchr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+revout:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+revtwoway:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rwarray:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+time:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrbigint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrbigint2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M --non-decimal-data < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrfield:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrnegzero:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrnr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrrem:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrrndeval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrsqrt:
+	@echo $@
+	@echo Expect $@ to fail with DJGPP.
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrstrtonum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpgforcenum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# end of file Maketests
+
+# Targets generated for other tests:
+
+Maketests: $(srcdir)/Makefile.am $(srcdir)/Gentests
+	files=`cd "$(srcdir)" && echo *.awk *.in *.sh`; \
+	$(AWK) -f "$(srcdir)"/Gentests "$(srcdir)"/Makefile.am $$files > $@
+
+clean-local:
+	rm -fr _* core core.* fmtspcl.ok junk strftime.ok test1 test2 \
+	seq *~ readfile.ok fork.tmp.* testext.awk fts.ok readdir.ok \
+	readdir_test.ok readdir_retest.ok \
+	profile1.ok
+
+# An attempt to print something that can be grepped for in build logs
+pass-fail:
+	@-COUNT=`ls _* 2>/dev/null | wc -l` ; \
+	if test $$COUNT = 0 ; \
+	then	echo ALL TESTS PASSED ; \
+	else	echo $$COUNT TESTS FAILED ; exit 1; \
+	fi
+
+# This target for my convenience to look at all the results
+# Don't use POSIX or bash-isms so that it'll work on !@#$%^&*() Solaris.
+diffout:
+	for i in _* ; \
+	do  \
+		if [ "$$i" != "_*" ]; then \
+		echo ============== $$i ============= ; \
+		base=`echo $$i | sed 's/^_//'` ; \
+		if [ -r $${base}.ok ]; then \
+		diff -c $${base}.ok $$i ; \
+		else \
+		diff -c "$(srcdir)"/$${base}.ok  $$i ; \
+		fi ; \
+		fi ; \
+	done | more
+
+# convenient way to scan valgrind results for errors
+valgrind-scan:
+	@echo "Scanning valgrind log files for problems:"
+	@-$(AWK) -f "$(srcdir)"/valgrind.awk log.[0-9]*
+
+# This target is for testing with electric fence.
+efence:
+	for i in $$(ls _* | sed 's;_\(.*\);\1;') ; \
+	do \
+		bad=$$(wc -l < _$$i) \
+		ok=$$(wc -l < $$i.ok) ; \
+		if (( $$bad == $$ok + 2 )) ; \
+		then \
+			rm _$$i ; \
+		fi ; \
+	done
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/pc/Makefile.tst.prologue b/gawk-5.0.1/pc/Makefile.tst.prologue
new file mode 100644
index 00000000000..57e55d740eb
--- /dev/null
+++ b/gawk-5.0.1/pc/Makefile.tst.prologue
@@ -0,0 +1,138 @@
+# Makefile for GNU Awk test suite.
+#
+# Copyright (C) 1988-2018 the Free Software Foundation, Inc.
+# 
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+# 
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+# ============================================================================
+# MS-DOS & OS/2 Notes: READ THEM!
+# ============================================================================
+
+# As of version 2.91, efforts to make this makefile run in MS-DOS and OS/2
+# have started in earnest.  The following steps need to be followed in order 
+# to run this makefile:
+#
+# 1. The first thing that you will need to do is to convert all of the 
+#    files ending in ".ok" in the test directory, all of the files ending 
+#    in ".good" (or ".goo") in the test/reg directory, and mmap8k.in from
+#    having a linefeed to having carriage return/linefeed at the end of each
+#    line. There are various public domain UNIX to DOS converters and any 
+#    should work.  Alternatively, you can use diff instead of cmp--most 
+#    versions of diff don't care about how the lines end.
+#
+# 2. You will need an sh-compatible shell.  Please refer to the "README.pc"
+#    file in the README_d directory for information about obtaining a copy.
+#    You will also need various UNIX utilities.  At a minimum, you will 
+#    need: rm, tr, cmp (or diff, see above), cat, wc, and sh.  
+#    You should also have a UNIX-compatible date program.
+#
+# The makefile has only been tested with dmake 3.8 and DJGPP Make 3.74 or
+# later.  After making all of these changes, typing "dmake check extra"
+# or "make check extra" (with DJGPP Make) should run successfully.
+
+# The Bash shell (compiled with djgpp) works very well with the
+# djgpp-compiled gawk.  It is currently the recommended shell to use
+# for testing, along with DJGPP make.  See README.pc for 
+# more information on OS/2 and DOS shells.
+
+# You will almost certainly need to change some of the values (MACROS) 
+# defined on the next few lines.  
+
+# This won't work unless you have "sh" and set SHELL equal to it (Make 3.74
+# or later which comes with DJGPP will work with SHELL=/bin/sh if you have
+# sh.exe anywhere on your PATH).
+#SHELL = e:\bin\sh.exe
+SHELL = /bin/sh
+
+# Point to gawk
+AWK = AWKLIBPATH=../extension $(AWKPROG)
+AWKPROG = ../gawk.exe
+# Point $(LS) to a version of ls.exe that reports true Windows file
+# index numbers, because this is what the readdir test expects.
+# Otherwise, the readdir test will fail.  (The MSYS ls.exe doesn't
+# report full index values.)
+LS = ls.exe
+
+# Set your cmp command here (you can use most versions of diff instead of cmp
+# if you don't want to convert the .ok files to the DOS CR/LF format).
+# This is also an issue for the "mmap8k" test.  If it fails, make sure that
+# mmap8k.in has CR/LFs or that you've used diff.
+#
+# The following comment is for users of OSs which support long file names
+# (such as Windows 95) for all versions of gawk (both 16 & 32-bit).
+# If you use a shell which doesn't support long filenames, temporary files
+# created by this makefile will be truncated by your shell.  "_argarra" is an
+# example of this.  If $(CMP) is a DJGPP-compiled program, then it will fail
+# because it looks for the long filename (eg. _argarray).  To fix this, you
+# need to set LFN=n in your shell's environment.
+# NOTE: Setting LFN in the makefile most probably won't help you because LFN
+# needs to be an environment variable.
+#CMP = cmp
+# See the comment above for why you might want to set CMP to "env LFN=n diff"
+#CMP = env LFN=n diff
+#CMP = diff
+CMP = diff -u
+#CMP = gcmp
+
+# cmp replacement program for PC where the error messages aren't
+# exactly the same.  Should run even on old awk.
+TESTOUTCMP = $(AWK) -f ../testoutcmp.awk
+
+# Set your "cp," "mv," and "mkdir" commands here.  Note: DOS's copy must take
+# forward slashes.
+CP = cp
+#CP = : && command -c copy
+#CP  = command.com /c copy
+
+#MV = cmd.exe /c ren
+MV = mv
+
+MKDIR = mkdir
+#MKDIR = gmkdir
+#MKDIR = : && command -c mkdir
+#MKDIR  = command.com /c mkdir
+
+# Set your unix-style date function here
+#DATE = date
+DATE = gdate
+
+# Set sort command
+SORT = sort
+
+# MS-DOS and OS/2 use ; as a PATH delimiter
+PATH_SEPARATOR = ;
+
+# Argument to -F to produce -F/, should be // for MinGW, / otherwise,
+# because MSYS Bash converts a single slash to the equivalent Windows
+# directory.
+SLASH = /
+#SLASH = //
+
+# Non-default GREP_OPTIONS might fail the badargs test
+export GREP_OPTIONS=
+
+# ============================================================================
+# You shouldn't need to modify anything below this line.
+# ============================================================================
+
+srcdir = .
+abs_srcdir = .
+abs_builddir = .
+top_srcdir = "$(srcdir)"/..
+abs_top_builddir = "$(top_srcdir)"
+
diff --git a/gawk-5.0.1/pc/awklib/igawk b/gawk-5.0.1/pc/awklib/igawk
new file mode 100644
index 00000000000..7c599dca970
--- /dev/null
+++ b/gawk-5.0.1/pc/awklib/igawk
@@ -0,0 +1,85 @@
+#! /bin/sh
+
+# igawk --- like gawk but do @include processing
+# Arnold Robbins, arnold@gnu.ai.mit.edu, Public Domain
+# July 1993
+
+igs=${TMP:-/tmp}/igs$$
+ige=${TMP:-/tmp}/ige$$
+
+if [ "$1" = debug ]
+then
+    set -x
+    shift
+else
+    # cleanup on exit, hangup, interrupt, quit, termination
+    #trap 'rm -f $igs $ige' 0 1 2 3 15
+    trap 'rm -f $igs $ige' 0 2 15
+fi
+
+while [ $# -ne 0 ] # loop over arguments
+do
+    case $1 in
+    --)     shift; break;;
+
+    -W)     shift
+            set -- -W"$@"
+            continue;;
+
+    -[vF])  opts="$opts $1 '$2'"
+            shift;;
+
+    -[vF]*) opts="$opts '$1'" ;;
+
+    -f)     echo @include "$2" >> $igs
+            shift;;
+
+    -f*)    f=`echo "$1" | sed 's/-f//'`
+            echo @include "$f" >> $igs ;;
+
+    -?file=*)    # -Wfile or --file
+            f=`echo "$1" | sed 's/-.file=//'`
+            echo @include "$f" >> $igs ;;
+
+    -?file)    # get arg, $2
+            echo @include "$2" >> $igs
+            shift;;
+
+    -?source=*)    # -Wsource or --source
+            t=`echo "$1" | sed 's/-.source=//'`
+            echo "$t" >> $igs ;;
+
+    -?source)  # get arg, $2
+            echo "$2" >> $igs
+            shift;;
+
+    -?version)
+            echo igawk: version 1.0 1>&2
+            gawk --version
+            exit 0 ;;
+
+    -[W-]*)    opts="$opts '$1'" ;;
+
+    *)      break;;
+    esac
+
+    shift
+done
+
+if [ ! -s $igs ]
+then
+    if [ -z "$1" ]
+    then
+         echo igawk: no program! 1>&2
+         exit 1
+    else
+        echo "$1" > $igs
+        shift
+    fi
+fi
+
+# at this point, $igs has the program
+gawk -f igawk.awk $igs > $ige
+eval gawk -f '$ige' $opts -- "$@"
+
+exit $?
diff --git a/gawk-5.0.1/pc/awklib/igawk.awk b/gawk-5.0.1/pc/awklib/igawk.awk
new file mode 100644
index 00000000000..c660b8dc4d8
--- /dev/null
+++ b/gawk-5.0.1/pc/awklib/igawk.awk
@@ -0,0 +1,51 @@
+# igawk.awk
+# process @include directives
+
+function pathto(file,    i, t, junk)
+{
+    if (index(file, "/") != 0)
+        return file
+
+    for (i = 1; i <= ndirs; i++) {
+        t = (pathlist[i] "/" file)
+        if ((getline junk < t) > 0) {
+            # found it
+            close(t)
+            return t
+        }
+    }
+    return ""
+}
+BEGIN {
+    path = ENVIRON["AWKPATH"]
+    ndirs = split(path, pathlist, ";")
+    for (i = 1; i <= ndirs; i++) {
+        if (pathlist[i] == "")
+            pathlist[i] = "."
+    }
+    stackptr = 0
+    input[stackptr] = ARGV[1] # ARGV[1] is first file
+
+    for (; stackptr >= 0; stackptr--) {
+        while ((getline < input[stackptr]) > 0) {
+            if (tolower($1) != "@include") {
+                print
+                continue
+            }
+            fpath = pathto($2)
+            if (fpath == "") {
+                printf("igawk:%s:%d: cannot find %s\n",
+                    input[stackptr], FNR, $2) > "/dev/stderr"
+                continue
+            }
+            if (! (fpath in processed)) {
+                processed[fpath] = input[stackptr]
+                input[++stackptr] = fpath  # push onto stack
+            } else
+                print $2, "included in", input[stackptr],
+                    "already included in",
+                    processed[fpath] > "/dev/stderr"
+        }
+        close(input[stackptr])
+    }
+}
diff --git a/gawk-5.0.1/pc/awklib/igawk.bat b/gawk-5.0.1/pc/awklib/igawk.bat
new file mode 100644
index 00000000000..bfc9b2a3a61
--- /dev/null
+++ b/gawk-5.0.1/pc/awklib/igawk.bat
@@ -0,0 +1 @@
+@sh igawk %1 %2 %3 %4 %5 %6 %7 %8 %9
\ No newline at end of file
diff --git a/gawk-5.0.1/pc/config.sed b/gawk-5.0.1/pc/config.sed
new file mode 100644
index 00000000000..45f0287de55
--- /dev/null
+++ b/gawk-5.0.1/pc/config.sed
@@ -0,0 +1,334 @@
+# -config.sed-----------------------------------------------------------
+# Configuration script for pc/config.h
+# ----------------------------------------------------------------------
+
+# Copyright (C) 2011, 2016 the Free Software Foundation, Inc.
+
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+# ----------------------------------------------------------------------
+
+/configh\.in/a\
+/* pc/config.h.  Generated automatically by pc/config.sed.  */
+
+/^#undef DYNAMIC$/c\
+#ifdef _WIN32\
+#define DYNAMIC 1\
+#endif
+s/^#undef GETPGRP_VOID *$/#define GETPGRP_VOID 1/
+s/^#undef GETGROUPS_T *$/#define GETGROUPS_T gid_t/
+/^#undef GETPGRP_VOID$/c\
+#ifdef __DJGPP__\
+#define GETPGRP_VOID 1\
+#endif
+s/^#undef HAVE_ALARM *$/#define HAVE_ALARM 1/
+s/^#undef HAVE_ATEXIT *$/#define HAVE_ATEXIT 1/
+/^#undef HAVE_BTOWC *$/c\
+#define HAVE_BTOWC 1
+/^#undef HAVE_DECL_TZNAME *$/c\
+#ifdef __MINGW32__\
+#define HAVE_DECL_TZNAME 1\
+#endif
+s/^#undef HAVE_FCNTL_H *$/#define HAVE_FCNTL_H 1/
+s/^#undef HAVE_FMOD *$/#define HAVE_FMOD 1/
+/^#undef HAVE_GAI_STRERROR *$/c\
+#ifdef __MINGW32__\
+#define HAVE_GAI_STRERROR 1\
+#endif
+/^#undef HAVE_GETADDRINFO *$/c\
+#ifdef __MINGW32__\
+#define HAVE_GETADDRINFO 1\
+#endif
+/^#undef HAVE_INTMAX_T *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_INTMAX_T 1\
+#endif
+/^#undef HAVE_INTTYPES_H *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_INTTYPES_H 1\
+#endif
+/^#undef HAVE_INTTYPES_H_WITH_UINTMAX *$/c\
+#ifdef __MINGW32__\
+#define HAVE_INTTYPES_H_WITH_UINTMAX 1\
+#endif
+/^#undef HAVE_ISASCII *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_ISASCII 1\
+#endif
+/^#undef HAVE_ISWCTYPE *$/c\
+#ifdef __MINGW32__\
+#define HAVE_ISWCTYPE 1\
+#endif
+/^#undef HAVE_ISWLOWER *$/c\
+#ifdef __MINGW32__\
+#define HAVE_ISWLOWER 1\
+#endif
+/^#undef HAVE_ISWUPPER *$/c\
+#ifdef __MINGW32__\
+#define HAVE_ISWUPPER 1\
+#endif
+/^#undef HAVE_LANGINFO_CODESET *$/c\
+#if defined(__DJGPP__) || defined(__MINGW32__)\
+#define HAVE_LANGINFO_CODESET 1\
+#endif
+s/^#undef HAVE_LIBM *$/#define HAVE_LIBM 1/
+/^#undef HAVE_LIBREADLINE *$/c\
+/* #undef HAVE_LIBREADLINE */
+s/^#undef HAVE_LIMITS_H *$/#define HAVE_LIMITS_H 1/
+/^#undef HAVE_LOCALE_H *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_LOCALE_H 1\
+#endif
+/^#undef HAVE_LONG_LONG *$/c\
+#ifdef __MINGW32__\
+#define HAVE_LONG_LONG 1\
+#endif
+/^#undef HAVE_MBRLEN *$/c\
+#ifdef __MINGW32__\
+#define HAVE_MBRLEN 1\
+#endif
+/^#undef HAVE_MBRTOWC *$/c\
+#ifdef __MINGW32__\
+#define HAVE_MBRTOWC 1\
+#endif
+s/^#undef HAVE_MEMCMP *$/#define HAVE_MEMCMP 1/
+s/^#undef HAVE_MEMCPY *$/#define HAVE_MEMCPY 1/
+/^#undef HAVE_MEMMOVE *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_MEMMOVE 1\
+#endif
+/^#undef HAVE_MEMORY_H *$/c\
+#ifdef __DJGPP__\
+#define HAVE_MEMORY_H 1\
+#endif
+s/^#undef HAVE_MEMSET *$/#define HAVE_MEMSET 1/
+/^#undef HAVE_MKSTEMP *$/c\
+#ifdef __DJGPP__\
+#define HAVE_MKSTEMP 1\
+#endif
+s/^#undef HAVE_MKTIME *$/#define HAVE_MKTIME 1/
+/^#undef HAVE_MPFR *$/c\
+/* #undef HAVE_MPFR */
+/^#undef HAVE_SETENV *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_SETENV 1\
+#endif
+/^#undef HAVE_SETLOCALE *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_SETLOCALE 1\
+#endif
+/^#undef HAVE_SNPRINTF *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_SNPRINTF 1\
+#endif
+/^#undef HAVE_SOCKADDR_STORAGE *$/c\
+#ifdef __MINGW32__\
+#define HAVE_SOCKADDR_STORAGE 1\
+#endif
+/^#undef HAVE_SOCKETS *$/c\
+#ifdef __MINGW32__\
+#define HAVE_SOCKETS 1\
+#endif
+s/^#undef HAVE_STDARG_H *$/#define HAVE_STDARG_H 1/
+/^#undef HAVE_STDBOOL_H *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_STDBOOL_H 1\
+#endif
+/^#undef HAVE_STDDEF_H *$/c\
+#ifdef __GNUC__\
+#define HAVE_STDDEF_H 1\
+#endif
+/^#undef HAVE_STDINT_H *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_STDINT_H 1\
+#endif
+/^#undef HAVE_STDLIB_H *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_STDLIB_H 1\
+#endif
+/^#undef HAVE_STRCASECMP *$/c\
+#ifdef __DJGPP__\
+#define HAVE_STRCASECMP 1\
+#endif
+/^#undef HAVE_STRCOLL *$/c\
+#ifdef __DJGPP__\
+#define HAVE_STRCOLL 1\
+#endif
+s/^#undef HAVE_STRCHR *$/#define HAVE_STRCHR 1/
+s/^#undef HAVE_STRERROR *$/#define HAVE_STRERROR 1/
+/^#undef HAVE_STRFTIME *$/c\
+#ifdef __MINGW32__\
+/* MinGW uses the replacement from missing_d, to support the %e specifier.  */\
+#define strftime rpl_strftime\
+#else\
+#define HAVE_STRFTIME 1\
+#endif
+s/^#undef HAVE_STRINGIZE *$/#define HAVE_STRINGIZE 1/
+s/^#undef HAVE_STRINGS_H *$/#define HAVE_STRINGS_H 1/
+s/^#undef HAVE_STRING_H *$/#define HAVE_STRING_H 1/
+/^#undef HAVE_STRNCASECMP *$/c\
+#define HAVE_STRNCASECMP 1\
+#ifdef __EMX__\
+#define strncasecmp strnicmp\
+#endif
+s/^#undef HAVE_STRTOD *$/#define HAVE_STRTOD 1/
+/^#undef HAVE_STRTOUL *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_STRTOUL 1\
+#endif
+/^#undef HAVE_STRUCT_STAT_ST_BLKSIZE *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_STRUCT_STAT_ST_BLKSIZE 1\
+#endif
+/^#undef HAVE_SYS_IOCTL_H *$/c\
+#ifdef __DJGPP__\
+#define HAVE_SYS_IOCTL_H 1\
+#endif
+s/^#undef HAVE_SYSTEM *$/#define HAVE_SYSTEM 1/
+/^#undef HAVE_SYS_PARAM_H *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_SYS_PARAM_H 1\
+#endif
+/^#undef HAVE_SYS_STAT_H *$/c\
+#if defined(__MINGW32__) || defined(__DJGPP__)\
+#define HAVE_SYS_STAT_H 1\
+#endif
+/^#undef HAVE_SYS_TIME_H *$/c\
+#if defined(__DJGPP__) || defined(__MINGW32__)\
+#define HAVE_SYS_TIME_H 1\
+#endif
+s/^#undef HAVE_SYS_TYPES_H *$/#define HAVE_SYS_TYPES_H 1/
+/^#undef HAVE_SYS_WAIT_H *$/c\
+#ifdef __DJGPP__\
+#define HAVE_SYS_WAIT_H 1\
+#endif
+/^#undef HAVE_TMPFILE *$/c\
+#ifdef __DJGPP__\
+#define HAVE_TMPFILE 1\
+#endif
+/^#undef HAVE_TOWLOWER *$/c\
+#ifdef __MINGW32__\
+#define HAVE_TOWLOWER 1\
+#endif
+/^#undef HAVE_TOWUPPER *$/c\
+#ifdef __MINGW32__\
+#define HAVE_TOWUPPER 1\
+#endif
+s/^#undef HAVE_TZNAME *$/#define HAVE_TZNAME 1/
+s/^#undef HAVE_TZSET *$/#define HAVE_TZSET 1/
+/^#undef HAVE_UINTMAX_T *$/c\
+#if defined(__DJGPP__) || defined(__MINGW32__)\
+#define HAVE_UINTMAX_T 1\
+#endif
+/^#undef HAVE_UNISTD_H *$/c\
+#if defined(__DJGPP__) || defined(__MINGW32__)\
+#define HAVE_UNISTD_H 1\
+#endif
+s/^#undef HAVE_UNSIGNED_LONG_LONG *$/#define HAVE_UNSIGNED_LONG_LONG 1/
+/^#undef HAVE_USLEEP *$/c\
+#if defined(__DJGPP__) || defined(__MINGW32__)\
+#define HAVE_USLEEP 1\
+#endif
+s/^#undef HAVE_VPRINTF *$/#define HAVE_VPRINTF 1/
+/^#undef HAVE_WCHAR_H *$/c\
+#ifdef __MINGW32__\
+#define HAVE_WCHAR_H 1\
+#endif
+/^#undef HAVE_WCRTOMB *$/c\
+#ifdef __MINGW32__\
+#define HAVE_WCRTOMB 1\
+#endif
+/^#undef HAVE_WCSCOLL *$/c\
+#ifdef __MINGW32__\
+#define HAVE_WCSCOLL 1\
+#endif
+/^#undef HAVE_WCTYPE *$/c\
+#ifdef __MINGW32__\
+#define HAVE_WCTYPE 1\
+#endif
+/^#undef HAVE_WCTYPE_H *$/c\
+#ifdef __MINGW32__\
+#define HAVE_WCTYPE_H 1\
+#endif
+/^#undef HAVE_WCTYPE_T *$/c\
+#ifdef __MINGW32__\
+#define HAVE_WCTYPE_T 1\
+#endif
+/^#undef HAVE_WINT_T *$/c\
+#ifdef __MINGW32__\
+#define HAVE_WINT_T 1\
+#endif
+/^#undef HAVE__BOOL *$/c\
+#ifdef __DJGPP__\
+#define HAVE__BOOL 1\
+#endif
+/^#undef PRINTF_HAS_A_FORMAT *$/c\
+#define PRINTF_HAS_A_FORMAT 1
+/^#undef PRINTF_HAS_F_FORMAT *$/c\
+#ifdef __DJGPP__\
+#define PRINTF_HAS_F_FORMAT 1\
+#endif
+s/^#undef PROTOTYPES *$/#define PROTOTYPES 1/
+s/^#undef RETSIGTYPE *$/#define RETSIGTYPE void/
+/^#.*RETSIGTYPE /a\
+\
+#if defined(__DJGPP__) || defined(__MINGW32__)\
+#include <limits.h>\
+#endif
+s/^#undef SIZEOF_UNSIGNED_INT *$/#define SIZEOF_UNSIGNED_INT 4/
+s/^#undef SIZEOF_UNSIGNED_LONG *$/#define SIZEOF_UNSIGNED_LONG 4/
+s/^#undef STDC_HEADERS *$/#define STDC_HEADERS 1/
+s/^#undef TIME_WITH_SYS_TIME *$/#define TIME_WITH_SYS_TIME 1/
+/^#undef inline *$/c\
+#ifdef __GNUC__\
+#define inline __inline__\
+#endif
+
+/^\/\* Enable extensions on AIX 3, Interix.  \*\//i\
+/* This is required to compile Gnulib regex code.  */\
+#if defined(__DJGPP__) || defined(__MINGW32__)\
+#define _GNU_SOURCE 1\
+#endif
+
+s|^#undef PACKAGE_URL *$|#define PACKAGE_URL "http://www.gnu.org/software/gawk/"|
+
+$a\
+#ifdef __DJGPP__\
+/* gcc no longer includes this by default */\
+# include <sys/version.h>\
+\
+/* Library search path */\
+# if (__DJGPP__ > 2 || __DJGPP_MINOR__ >= 3)\
+#  define DEFPATH  ".;/dev/env/DJDIR/share/awk"\
+# else\
+#  define DEFPATH  ".;c:/lib/awk;c:/gnu/lib/awk"\
+# endif\
+\
+/* Function prototype.  */\
+#include <stdbool.h>\
+extern bool is_valid_identifier(const char *name);\
+#endif\
+\
+#ifndef __DJGPP__\
+#define HAVE_POPEN_H 1\
+#endif\
+\
+#if defined(__EMX__)\
+#define strcasecmp stricmp\
+#define strncasecmp strnicmp\
+#endif
diff --git a/gawk-5.0.1/pc/configpk.sed b/gawk-5.0.1/pc/configpk.sed
new file mode 100644
index 00000000000..26e6e946296
--- /dev/null
+++ b/gawk-5.0.1/pc/configpk.sed
@@ -0,0 +1,9 @@
+s/^AC_INIT([[]\{0,1\}\([^],]*\)[]]\{0,1\}, *[[]\{0,1\}\([^],]*\)[]]\{0,1\}, *[[]\{0,1\}\([^],]*\)[]]\{0,1\}, *[[]\{0,1\}\([^],)]*\).*$/\
+s|^#undef PACKAGE_NAME *$|#define PACKAGE_NAME "\1"|\
+s|^#undef VERSION *$|#define VERSION "\2"\|\
+s|^#undef PACKAGE_VERSION *$|#define PACKAGE_VERSION "\2"|\
+s|^#undef PACKAGE_STRING *$|#define PACKAGE_STRING "\1 \2"|\
+s|^#undef PACKAGE_BUGREPORT *$|#define PACKAGE_BUGREPORT "\3"|\
+s|^#undef PACKAGE *$|#define PACKAGE "\4"|\
+s|^#undef PACKAGE_TARNAME *$|#define PACKAGE_TARNAME "\4"|\
+/p
diff --git a/gawk-5.0.1/pc/dlfcn.h b/gawk-5.0.1/pc/dlfcn.h
new file mode 100644
index 00000000000..64ef4bc5ac9
--- /dev/null
+++ b/gawk-5.0.1/pc/dlfcn.h
@@ -0,0 +1,12 @@
+/* dlfcn.h replacement for MS-Windows build.  */
+#ifndef DLFCN_H
+#define DLFCN_H
+
+#define RTLD_LAZY 1
+
+extern void *dlopen (const char *, int);
+extern int   dlclose (void *);
+extern void *dlsym (void *, const char *);
+extern char *dlerror (void);
+
+#endif	/* DLFCN_H */
diff --git a/gawk-5.0.1/pc/gawk.def b/gawk-5.0.1/pc/gawk.def
new file mode 100644
index 00000000000..ac1a5a2c4cf
--- /dev/null
+++ b/gawk-5.0.1/pc/gawk.def
@@ -0,0 +1,2 @@
+NAME gawk WINDOWCOMPAT NEWFILES
+DESCRIPTION 'GNU awk for OS/2'
diff --git a/gawk-5.0.1/pc/gawkmisc.pc b/gawk-5.0.1/pc/gawkmisc.pc
new file mode 100644
index 00000000000..e0f3f3ff433
--- /dev/null
+++ b/gawk-5.0.1/pc/gawkmisc.pc
@@ -0,0 +1,1152 @@
+/* gawkmisc.c --- miscellaneous gawk routines that are OS specific. -*-C-*- */
+
+/* 
+ * Copyright (C) 1986, 1988, 1989, 1991 - 2003, 2012, 2016, 2017
+ * the Free Software Foundation, Inc.
+ * 
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Progamming Language.
+ * 
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+char quote = '\'';
+char envsep = ';';
+
+# ifdef DEFPATH
+char *defpath = DEFPATH;
+# else
+char *defpath = ".;c:\\lib\\awk;c:\\gnu\\lib\\awk";
+# endif
+/* the Makefile should define DEFLIBPATH */
+char *deflibpath = DEFLIBPATH;
+
+#ifdef __EMX__
+#include<io.h>
+
+static int _os2_is_abs_path(const char *dirname);
+static char* _os2_unixroot(const char *path);
+static const char* _os2_unixroot_path(const char *path);
+#endif
+
+#ifdef __MINGW32__
+#ifdef HAVE_SOCKETS
+#include <socket.h>
+
+#undef socket
+#undef setsockopt
+#undef bind
+#undef connect
+#undef listen
+#undef accept
+#undef recvfrom
+#undef shutdown
+#endif
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#endif
+
+/* gawk_name --- pull out the "gawk" part from how the OS called us */
+
+char *
+gawk_name(filespec)
+const char *filespec;
+{
+	char *p, *q;
+
+	p = (char *) filespec;  /* Sloppy... */
+
+	/* OS/2 allows / for directory separator too */
+	if ((q = strrchr(p, '\\')) != NULL)
+		p = q + 1;
+	if ((q = strrchr(p, '/')) != NULL
+	    && (p == NULL || q > p)) /* support mixed d:\foo/bar\gawk.exe */
+		p = q + 1;
+	if ((q = strchr(p, '.')) != NULL)
+		*q = '\0';
+	return strlwr(p);
+}
+
+
+/*
+ * memcpy_long() & memset_ulong() are 32-bit replacements for MSC which
+ * has a 16-bit size_t.
+ */
+char *
+memcpy_ulong (dest, src, l)
+register char *dest;
+register const char *src;
+register unsigned long l;
+{
+	register char *ret = dest;
+
+	while (l--)
+		*dest++ = *src++;
+
+	return ret;
+}
+
+
+void *
+memset_ulong(dest, val, l)
+void *dest;
+register int val;
+register unsigned long l;
+{
+	register char *ret = dest;
+	register char *d = dest;
+
+	while (l--)
+		*d++ = val;
+
+	return ((void *) ret);
+}
+
+
+/* os_arg_fixup --- fixup the command line */
+
+void
+os_arg_fixup(argcp, argvp)
+int *argcp;
+char ***argvp;
+{
+#ifdef __EMX__
+# ifdef initialize_main
+	initialize_main(argcp, argvp);
+# else
+	_wildcard(argcp, argvp);
+	_response(argcp, argvp);
+# endif
+
+	setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
+	defpath = (char*) _os2_unixroot_path(defpath);
+#endif /* __EMX__ */
+	return;
+}
+
+/* os_devopen --- open special per-OS devices */
+
+int
+os_devopen(name, flag)
+const char *name;
+int flag;
+{
+#ifdef __EMX__
+	/* do not use open(name, flag) here !!! */
+	return -1;
+#else
+	if (strcmp(name, "/dev/null") == 0)
+		return open("NUL", flag);
+	/* FIXME: */
+	/* else if (strcmp(name, "/dev/tty") == 0)
+	 * 	return open("???", flag);
+	 */
+	return -1;
+#endif
+}
+
+/* optimal_bufsize --- determine optimal buffer size */
+
+size_t
+optimal_bufsize(fd, stb)
+int fd;
+struct stat *stb;
+{
+	/* force all members to zero in case OS doesn't use all of them. */
+	memset(stb, '\0', sizeof(struct stat));
+
+	/*
+	 * DOS doesn't have the file system block size in the
+	 * stat structure. So we have to make some sort of reasonable
+	 * guess. We use stdio's BUFSIZ, since that is what it was
+	 * meant for in the first place.
+	 */
+#define	DEFBLKSIZE	BUFSIZ
+
+	if (fstat(fd, stb) == -1)
+		fatal("can't stat fd %d (%s)", fd, strerror(errno));
+	if (S_ISREG(stb->st_mode)
+	    && 0 < stb->st_size && stb->st_size < DEFBLKSIZE) /* small file */
+		return stb->st_size;
+	return DEFBLKSIZE;
+}
+
+/* ispath --- return true if path has directory components */
+
+int
+ispath(file)
+const char *file;
+{
+#ifdef __EMX__
+	return (strpbrk(file, "/\\") != NULL ||
+		(toupper(file[0]) >= 'A' && toupper(file[0]) <= 'Z' && file[1] == ':'));
+#else
+	for (; *file; file++) {
+		switch (*file) {
+		case '/':
+		case '\\':
+		case ':':
+			return 1;
+		}
+	}
+	return 0;
+#endif
+}
+
+/* isdirpunct --- return true if char is a directory separator */
+
+int
+isdirpunct(c)
+int c;
+{
+	return (strchr(":\\/", c) != NULL);
+}
+
+/* os_close_on_exec --- set close on exec flag, print warning if fails */
+
+void
+os_close_on_exec(fd, name, what, dir)
+int fd;
+const char *name, *what, *dir;
+{
+#if (defined(__DJGPP__) && (__DJGPP__ > 2 || __DJGPP_MINOR__ >= 4)) || defined __EMX__
+	if (fd <= 2)	/* sanity */
+		return;
+
+	if (fcntl(fd, F_SETFD, 1) < 0)
+		warning("%s %s `%s': could not set close-on-exec: %s",
+			what, dir, name, strerror(errno));
+#endif
+#ifdef __MINGW32__
+	HANDLE fh = (HANDLE)_get_osfhandle(fd);
+
+	if (fh && fh != INVALID_HANDLE_VALUE)
+		SetHandleInformation(fh, HANDLE_FLAG_INHERIT, 0);
+#endif
+}
+
+/* os_isdir --- is this an fd on a directory? */
+
+#if ! defined(S_ISDIR) && defined(S_IFDIR)
+#define	S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#endif
+
+int
+os_isdir(fd)
+int fd;
+{
+	struct stat sbuf;
+
+	return (fstat(fd, &sbuf) == 0 && S_ISDIR(sbuf.st_mode));
+}
+
+/* os_isreadable --- fd can be read from */
+
+int
+os_isreadable(const awk_input_buf_t *iobuf, bool *isdir)
+{
+	*isdir = false;
+
+	switch (iobuf->sbuf.st_mode & S_IFMT) {
+	case S_IFREG:
+	case S_IFCHR:	/* ttys, /dev/null, .. */
+#ifdef S_IFSOCK
+	case S_IFSOCK:
+#endif
+#ifdef S_IFIFO
+	case S_IFIFO:
+#endif
+		return true;
+	case S_IFDIR:
+		*isdir = true;
+		/* fall through */
+	default:
+		return false;
+	}
+}
+
+/* os_is_setuid --- true if running setuid root */
+
+int
+os_is_setuid()
+{
+#ifdef __EMX__
+      	long uid, euid;
+
+	uid = getuid();
+	euid = geteuid();
+
+	return (euid == 0 && euid != uid);
+#else
+	return 0;
+#endif
+}
+
+/* os_setbinmode --- set binary mode on file */
+
+#ifdef __DJGPP__
+#include <sys/exceptn.h>
+#include <io.h>
+#endif
+static int orig_tty_mode = -1;
+
+int
+os_setbinmode(fd, mode)
+int fd, mode;
+{
+	int prev_mode = setmode(fd, mode);
+
+#ifdef __DJGPP__
+	if ((mode & O_BINARY) != 0)
+		__djgpp_set_ctrl_c(1); /* allow to interrupt with Ctrl-C */
+#endif
+	/* Save the original tty mode as we found it.  */
+	if (orig_tty_mode == -1 && fd >= 0 && fd <= 2)
+		orig_tty_mode = prev_mode;
+	return prev_mode;
+}
+
+/* os_restore_mode --- restore the original mode of the console device */
+
+void
+os_restore_mode (fd)
+int fd;
+{
+	if (orig_tty_mode != -1) {
+		setmode(fd, orig_tty_mode);
+	}
+}
+
+/* os_isatty --- return true if fd is a tty */
+
+int
+os_isatty(int fd)
+{
+#if defined(__MINGW32__) || defined(_MSC_VER)
+	return (isatty(fd) && lseek(fd, SEEK_CUR, 0) == -1);
+#else
+	return isatty(fd);
+#endif
+}
+ 
+/* files_are_same --- return true if files are identical */
+
+int
+files_are_same(char *path, SRCFILE *src)
+{
+	struct stat st;
+	size_t pathlen;
+	char *p, *s;
+
+	if (stat (path, & st) == 0) {
+		/* If they have a working `stat', honor that.  */
+		if (!(st.st_dev == src->sbuf.st_dev
+		      && st.st_ino == src->sbuf.st_ino))
+			return 0;
+
+		/* Compare modification times.  */
+		if (st.st_mtime != src->mtime)
+			return 0;
+
+		/* Compare absolute file names case-insensitively, and
+		   treat forward- and back-slashes as equal.  */
+		pathlen = strlen(path);
+		for (p = path, s = src->fullpath;
+		     p <= path + pathlen;
+		     p++, s++) {
+			if (tolower(*p) != tolower(*s)
+			    && !((*p == '/' || *p == '\\')
+				 && (*s == '/' || *s == '\\')))
+				return 0;
+		}
+		return 1;
+	}
+	return 0;
+}
+
+
+#ifdef __EMX__ 
+# ifndef PATH_SEPARATOR
+#  define PATH_SEPARATOR ';'
+# endif
+
+/* result is 0 if dirname is no absolute path, 1 otherwise */
+
+static int
+_os2_is_abs_path(const char *dirname)
+{
+  int result = 0;
+  if (dirname != NULL && dirname[0] != '\0') {
+    /* if dirname contains a valid drive letter like "c:" */
+    if (((dirname[0] >= 'A' && dirname[0] <= 'Z') || (dirname[0] >= 'a' && dirname[0] <= 'z'))
+        && dirname[1] == ':') dirname += 2; /* remove the drive letter */
+
+    if (dirname[0] == '/' || dirname[0] == '\\') result = 1; /* asbolute path */
+  }
+
+  return result;
+}
+
+
+/* path is assumed to be a list of directories separated by PATH_SEPARATOR.
+   This function determines if the first directory of path is on the
+   drive specified by the environment variable UNIXROOT.
+   If it is the case, NULL is returned, otherwise a new directory name
+   is allocated using the drive letter from UNIXROOT and returned as result.
+   If the first directory is a relative path NULL is returned, too.
+   The new directory name is allocated by malloc().
+   Example (UNIXROOT is set to "e:"):
+     "c:/usr/share" -> "e:/usr/share"
+     "e:/usr/share" -> NULL             (already on the $UNIXROOT drive)
+     "/usr/share"   -> "e:/usr/share"
+     "."            -> NULL             (not an absolute path)
+     "usr/share"    -> NULL             (not an absolute path)
+     "c:usr/share"  -> NULL             (not an absolute path)
+     "c:/usr/share;d:/etc" -> "e:/usr/share" (only the first directory in path is used) */
+
+static char*
+_os2_unixroot(const char *path)
+{
+  static const char *unixroot = NULL;
+  static int unixroot_init = 0; 
+  char *result = NULL; 
+
+  if (unixroot_init == 0) {
+    /* get $UNIXROOT only one time */
+    unixroot = getenv("UNIXROOT");
+
+    /* check whether unixroot is valid (must be "x:") */
+    if (unixroot != NULL) {
+      int drive = toupper(unixroot[0]);
+      if (drive < 'A' || drive > 'Z' || unixroot[1] != ':' || unixroot[2] != '\0')
+        unixroot = NULL; /* unixroot not valid */
+    }
+
+    unixroot_init = 1; /* initialized */
+  }
+
+  /* note: if unixroot != NULL then it contains a valid drive letter */
+  if (unixroot != NULL && _os2_is_abs_path(path)) {
+    /* dirname is an absolute path and unixroot is a drive letter, "c:" for example */
+    size_t old_path_len = strlen(path);
+
+    /* end points to the first ';' in path or to NULL */
+    const char *end = strchr(path, PATH_SEPARATOR);
+
+    /* dir_len is the length of the first directory in path */
+    size_t dir_len = (end) ? end - path : old_path_len;
+
+    if (toupper(unixroot[0]) != toupper(path[0]) || path[1] != ':') {
+      /* the first directory of path does not start with the string $UNIXROOT */
+      if (path[1] == ':') {
+        /* if there is a drive letter remove it */
+        dir_len -= 2;
+        path += 2;
+      } 
+
+      result = malloc(dir_len + 3);
+      if (result) { /* do nothing if we are out of memory */
+        result[0] = unixroot[0];
+        result[1] = unixroot[1];
+        memcpy(result + 2, path, dir_len);
+        result[dir_len + 2] = '\0';
+      }
+    }
+  }
+  return result;
+}
+
+/* path is assumed to be a list of directories separated by PATH_SEPARATOR.
+   Every directory is processed. _os2_unixroot() is used to find out whether
+   these directories are on the drive specified by the environment variable
+   UNIXROOT. If this is not the case the same directory on the UNIXROOT drive
+   is added to the end of path. If path is a valid path this function returns a valid path, too.
+   Example ($UNIXROOT is set to "e:"):
+   ".;c:/usr/local;d:/usr/local;d:/etc;e:/etc"
+   -> ".;c:/usr/local;d:/usr/local;d:/etc;e:/etc;e:/usr/local;e:/usr/local;e:/etc" */
+
+static const char*
+_os2_unixroot_path(const char *path)
+{
+  char *result = NULL;
+  const char *p = path;
+  unsigned dir_count = 1;
+
+  if (path == NULL || path[0] == '\0') return NULL; /* empty path */
+
+  /* save number of path components in dir_count */
+  while(*p) {
+    if (*p++ == PATH_SEPARATOR && *p != '\0' && *p != PATH_SEPARATOR)
+      dir_count += 1;
+  }
+
+  {
+    const char *list[dir_count]; /* list of char pointers */
+    size_t dir_len[dir_count]; /* the according directory length */
+    size_t old_path_len = strlen(path); /* the old path length */
+    size_t total_len;
+    unsigned i = 0;
+
+    if (path[old_path_len - 1] == PATH_SEPARATOR) /* last character is ';' */
+      old_path_len--;
+
+    list[0] = p = path; /* first directory */
+
+    while(*p) {
+    if (*p++ == PATH_SEPARATOR && *p != '\0' && *p != PATH_SEPARATOR)
+      list[++i] = p;
+    }
+    /* now list[i] contains the ith directory of path (no 0-terminated strings!!!) */
+
+    /* determine the total length for the new path */
+    total_len = old_path_len;
+
+    for(i = 0; i < dir_count; i++) {
+      list[i] = _os2_unixroot(list[i]);
+      if (list[i] != NULL) {
+        dir_len[i] = strlen(list[i]);
+        total_len += dir_len[i] + 1; /* one character for ';' or '\0' */
+      }
+      else dir_len[i] = 0;
+    }
+    /* now list[] contains the according directories on the UNIXROOT drive or NULL
+       total_len contains the total length for the new path */
+    result = malloc(total_len + 1);
+
+    if (result) {
+      /* copy the old path and the new directories into the new path */
+      char *q = result;
+      memcpy(q, path, old_path_len);
+      q += old_path_len;
+
+      for(i = 0; i < dir_count; i++) {
+        if (dir_len[i] != 0) {
+          *q++ = PATH_SEPARATOR;
+          memcpy(q, list[i], dir_len[i]);
+          q += dir_len[i];
+        }
+      }
+
+      *q = '\0'; /* terminating '\0' */
+    }
+
+    for(i = 0; i < dir_count; i++) free((void*) list[i]);
+  }
+
+  return (result) ? (const char*) result : path;
+}
+
+/* limit a length of DLL name up to 8 characters. If dst is not enough for
+   a fixed dll name, it is truncated. */
+char *os2_fixdllname(char *dst, const char *src, size_t n)
+{
+    char drive[_MAX_DRIVE];
+    char dir[_MAX_DIR];
+    char name[_MAX_FNAME];
+    char ext[_MAX_EXT];
+    char dll_file[_MAX_PATH];
+
+    _splitpath(src, drive, dir, name, ext);
+    if (strlen(name) > 8)
+        name[8] = '\0';
+    _makepath(dll_file, drive, dir, name, ext);
+
+    strncpy(dst, dll_file, n);
+    dst[n - 1] = '\0';
+
+    return dst;
+}
+
+#ifdef __KLIBC__
+
+/* replacement of dlopen(). This limits a length of a base name up to 8
+   characters. */
+void *os2_dlopen(const char *file, int mode)
+{
+    char dll_file[strlen(file) + 1];
+
+    return (dlopen)(os2_fixdllname(dll_file, file, sizeof(dll_file)), mode);
+}
+
+/* replacement of dlsym(). This prepends '_' to name. */
+void *os2_dlsym(void *handle, const char *name)
+{
+    char sym[strlen(name) + 1 + 1]; /* 1 for '_', 1 for NUL */
+
+    sym[0] = '_';
+    strcpy(sym + 1, name);
+
+    return (dlsym)(handle, sym);
+}
+
+#endif /* __KLIBC__ */
+
+#endif /* __EMX__ */
+
+#ifdef __MINGW32__
+
+extern void *xmalloc (size_t);
+
+int
+setenv (const char *name, const char *value, int rewrite)
+{
+  char *entry;
+
+  if (*value == '=')
+    ++value;
+
+  if (getenv (name) && !rewrite)
+    return 0;
+
+  entry = xmalloc (strlen (name) + 1 + strlen (value) + 1);
+  strcat (strcat (strcpy (entry, name), "="), value);
+  if (putenv (entry) != 0)
+    {
+      free (entry);
+      return -1;
+    }
+  return 0;
+}
+
+int
+unsetenv (const char *name)
+{
+  if (!name || !*name || strchr (name, '=') != NULL)
+    return -1;
+
+  return setenv (name, "", 1);
+}
+
+/* MinGW 3.21 and later defines usleep as an inline function in
+   unistd.h, which conflicts with the version below.  */
+#if __MINGW32_MAJOR_VERSION + (__MINGW32_MINOR_VERSION > 20) < 4
+int
+usleep(unsigned int usec)
+{
+  double msecf = usec / 1000.0;
+
+  Sleep ((DWORD)msecf);
+
+  return usec - msecf * 1000 < 0 ? 0 : (int)(usec - msecf * 1000);
+}
+#endif
+
+/* The implementation of wctob in the MS runtime is problematic
+   because it doesn't allow to distinguish between WEOF and 0xff, due
+   to integer sign extension.  It also causes failures in dfa.c when
+   characters with the 8th bit set are involved.  This replacement
+   version fixes that.  */
+
+#include <wchar.h>
+
+int
+wctob (wint_t wc)
+{
+  char buf[64];
+
+  if (!(MB_CUR_MAX <= sizeof (buf)))
+    abort ();
+  /* Handle the case where WEOF is a value that does not fit in a wchar_t.  */
+  if (wc == (wchar_t)wc)
+    if (wctomb (buf, (wchar_t)wc) == 1)
+      return (unsigned char) buf[0];
+  return EOF;
+}
+
+
+#undef setlocale
+#include <locale.h>
+
+/* On Posix systems, 'setlocale' looks at LC_* variables in the
+   environment, and Gawk users might expect that on Windows as well.
+   The replacement implementation below does that, and also fixes a
+   few additional quirks with locales on Windows.  */
+static const char *
+lc_var (int category)
+{
+  static const char *loc_name[LC_MAX - LC_MIN + 1] = {
+    "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MONETARY", "LC_NUMERIC", "LC_TIME"
+  };
+
+  /* This function assumes LC_* categories are small numbers between 0
+     and 5, as shown above, so if that changes at some point, complain
+     vociferously.  */
+  if (LC_ALL != 0 || LC_CTYPE != 2 || LC_TIME != 5)
+    abort ();
+  /* Ensured by the caller, so should never happen.  */
+  if (category < LC_MIN || category > LC_MAX)
+    return "????";
+  return loc_name[category];
+}
+
+char *
+w32_setlocale (int category, const char *value)
+{
+  const char *new_locale = value;
+
+  if (LC_MIN <= category && category <= LC_MAX
+      && value && *value == '\0')
+    {
+      const char *lc_val = getenv ("LC_ALL");
+
+      if (!lc_val)
+	lc_val = getenv (lc_var (category));
+      if (!lc_val)
+	lc_val = getenv ("LANG");
+      if (lc_val)
+	new_locale = lc_val;
+    }
+
+  /* If VALUE includes a codeset, i.e. a Windows codepage number, we
+     must also set the LC_CTYPE locale to the same value, because
+     LC_CTYPE is the only category which is documented to be able to
+     change the codepage.  */
+  if (category != LC_ALL && category != LC_CTYPE)
+    {
+      const char *p = strchr (new_locale, '.');
+
+      if (p && isdigit (p[1]))
+	setlocale (LC_CTYPE, new_locale);
+    }
+  return setlocale (category, new_locale);
+}
+
+/* Replacement for the missing nl_langinfo.  Only CODESET is currently
+   supported.  */
+#include <langinfo.h>
+
+char *
+nl_langinfo (int item)
+{
+  switch (item)
+    {
+      case CODESET:
+	{
+	  /* Shamelessly stolen from Gnulib's nl_langinfo.c.  */
+	  static char buf[2 + 10 + 1];
+	  char const *locale = setlocale (LC_CTYPE, NULL);
+	  char *codeset = buf;
+	  size_t codesetlen;
+	  codeset[0] = '\0';
+
+	  if (locale && locale[0])
+	    {
+	      /* If the locale name contains an encoding after the
+		 dot, return it.  */
+	      char *dot = strchr (locale, '.');
+
+	      if (dot)
+		{
+		  /* Look for the possible @... trailer and remove it,
+		     if any.  */
+		  char *codeset_start = dot + 1;
+		  char const *modifier = strchr (codeset_start, '@');
+
+		  if (! modifier)
+		    codeset = codeset_start;
+		  else
+		    {
+		      codesetlen = modifier - codeset_start;
+		      if (codesetlen < sizeof buf)
+			{
+			  codeset = memcpy (buf, codeset_start, codesetlen);
+			  codeset[codesetlen] = '\0';
+			}
+		    }
+		}
+	    }
+	  /* If setlocale is successful, it returns the number of the
+	     codepage, as a string.  Otherwise, fall back on Windows
+	     API GetACP, which returns the locale's codepage as a
+	     number (although this doesn't change according to what
+	     the 'setlocale' call specified).  Either way, prepend
+	     "CP" to make it a valid codeset name.  */
+	  codesetlen = strlen (codeset);
+	  if (0 < codesetlen && codesetlen < sizeof buf - 2)
+	    memmove (buf + 2, codeset, codesetlen + 1);
+	  else
+	    sprintf (buf + 2, "%u", GetACP ());
+	  codeset = memcpy (buf, "CP", 2);
+
+	  return codeset;
+	}
+      default:
+	return (char *) "";
+    }
+}
+
+/*
+ * On MS-Windows with MinGW, execvp causes the shell and the re-exec'ed
+ * dgawk to compete for the keyboard input.
+ *
+ * This will need work if we ever need a real version of execvp.
+ */
+int w32_execvp(const char *file, char **argv)
+{
+	if (_spawnvp(_P_WAIT, file, (const char * const *)argv) != -1)
+		exit(EXIT_SUCCESS);
+
+	return -1;
+}
+
+#ifdef DYNAMIC
+
+#include <winerror.h>
+#include <dlfcn.h>
+
+static DWORD last_err;
+
+void *
+dlopen (const char *file, int mode)
+{
+  char dllfn[MAX_PATH], *p;
+  HANDLE dllhandle;
+
+  if (mode != RTLD_LAZY)
+    {
+      errno = EINVAL;
+      last_err = ERROR_INVALID_PARAMETER;
+      return NULL;
+    }
+
+  /* MSDN says to be sure to use backslashes in the DLL file name.  */
+  strcpy (dllfn, file);
+  for (p = dllfn; *p; p++)
+    if (*p == '/')
+      *p = '\\';
+
+  dllhandle = LoadLibrary (dllfn);
+  if (!dllhandle)
+    last_err = GetLastError ();
+
+  return dllhandle;
+}
+
+char *
+dlerror (void)
+{
+  static char errbuf[1024];
+  DWORD ret;
+
+  if (!last_err)
+    return NULL;
+
+  ret = FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
+		       | FORMAT_MESSAGE_IGNORE_INSERTS,
+		       NULL, last_err, 0, errbuf, sizeof (errbuf), NULL);
+  while (ret > 0 && (errbuf[ret - 1] == '\n' || errbuf[ret - 1] == '\r'))
+    --ret;
+
+  errbuf[ret] = '\0';
+  if (!ret)
+    sprintf (errbuf, "Error code %lu", last_err);
+
+  last_err = 0;
+  return errbuf;
+}
+
+int
+dlclose (void *handle)
+{
+  if (!handle || handle == INVALID_HANDLE_VALUE)
+    return -1;
+  if (!FreeLibrary (handle))
+    return -1;
+
+  return 0;
+}
+
+void *
+dlsym (void *handle, const char *name)
+{
+  FARPROC addr = NULL;
+
+  if (!handle || handle == INVALID_HANDLE_VALUE)
+    {
+      last_err = ERROR_INVALID_PARAMETER;
+      return NULL;
+    }
+
+  addr = GetProcAddress (handle, name);
+  if (!addr)
+    last_err = GetLastError ();
+
+  return (void *)addr;
+}
+#endif	/* DYNAMIC */
+
+#ifdef HAVE_SOCKETS
+int
+socket_to_fd(SOCKET s)
+{
+  return (s == INVALID_SOCKET
+	  ? INVALID_HANDLE
+	  : _open_osfhandle (s, O_BINARY | O_NOINHERIT));
+}
+
+int
+w32_socket(int family, int type, int protocol)
+{
+  /* We need to use WSASocket rather than socket, since the latter
+     creates overlapped sockets that cannot be used in file I/O
+     APIs.  */
+  SOCKET s = WSASocket (family, type, protocol, NULL, 0, 0);
+
+  if (s == INVALID_SOCKET)
+    {
+      switch (WSAGetLastError ())
+	{
+	  case WSAEMFILE:
+	    errno = EMFILE;
+	    break;
+	  case WSANOTINITIALISED:
+	  case WSAENETDOWN:
+	    errno = EACCES;
+	    break;
+	  case WSAENOBUFS:
+	    errno = ENOMEM;
+	    break;
+	  case WSAEFAULT:
+	    errno = EFAULT;
+	    break;
+	  default:
+	    errno = EINVAL;
+	    break;
+	}
+    }
+
+  return socket_to_fd (s);
+}
+
+int
+w32_setsockopt (int fd, int level, int optname, const char *optval, int optlen)
+{
+  SOCKET s = FD_TO_SOCKET (fd);
+
+  return setsockopt (s, level, optname, optval, optlen);
+}
+
+int
+w32_bind (int fd, const struct sockaddr *name, int namelen)
+{
+  SOCKET s = FD_TO_SOCKET (fd);
+
+  return bind (s, name, namelen);
+}
+
+int
+w32_connect (int fd, const struct sockaddr *name, int namelen)
+{
+  SOCKET s = FD_TO_SOCKET (fd);
+
+  return connect (s, name, namelen);
+}
+
+int
+w32_listen (int fd, int backlog)
+{
+  SOCKET s = FD_TO_SOCKET (fd);
+
+  return listen (s, backlog);
+}
+
+int
+w32_accept (int fd, struct sockaddr *addr, int *addrlen)
+{
+  SOCKET s = FD_TO_SOCKET (fd);
+
+  return socket_to_fd (accept (s, addr, addrlen));
+}
+
+SOCKET
+valid_socket (int fd)
+{
+  SOCKET s = FD_TO_SOCKET (fd);
+  int ov, ol = 4;
+
+  if (s == INVALID_SOCKET
+      || (getsockopt (s, SOL_SOCKET, SO_TYPE, (char *)&ov, &ol) == SOCKET_ERROR
+	  && WSAGetLastError() == WSAENOTSOCK))
+    return (SOCKET)0;
+  return s;
+}
+
+int
+w32_closesocket (int fd)
+{
+  SOCKET s = valid_socket (fd);
+  int res1, res2 = 0;
+
+  if (!s && fd == FAKE_FD_VALUE)
+    return 0;
+
+  res1 = close (fd);
+  if (s)
+    res2 = closesocket (s);
+
+  if (res1 == -1 || res2 == SOCKET_ERROR)
+    return -1;
+  return 0;
+}
+
+int
+w32_recvfrom (int fd, char *buf, int len, int flags,
+	      struct sockaddr *from, int *fromlen)
+{
+  SOCKET s = FD_TO_SOCKET (fd);
+
+  return recvfrom (s, buf, len, flags, from, fromlen);
+}
+
+int
+w32_shutdown (int fd, int how)
+{
+  SOCKET s = FD_TO_SOCKET (fd);
+
+  return shutdown (s, how);
+}
+
+#endif	/* HAVE_SOCKETS */
+
+/* Translate abnormal exit status of Windows programs into the signal
+   that terminated the program.  This is required to support scm_kill
+   and WTERMSIG.  */
+
+#include <signal.h>
+
+struct signal_and_status {
+  int sig;
+  unsigned status;
+};
+
+static const struct signal_and_status sigtbl[] = {
+  {SIGSEGV, 0xC0000005},	/* access to invalid address */
+  {SIGSEGV, 0xC0000008},	/* invalid handle */
+  {SIGILL,  0xC000001D},	/* illegal instruction */
+  {SIGILL,  0xC0000025},	/* non-continuable instruction */
+  {SIGSEGV, 0xC000008C},	/* array bounds exceeded */
+  {SIGFPE,  0xC000008D},	/* float denormal */
+  {SIGFPE,  0xC000008E},	/* float divide by zero */
+  {SIGFPE,  0xC000008F},	/* float inexact */
+  {SIGFPE,  0xC0000090},	/* float invalid operation */
+  {SIGFPE,  0xC0000091},	/* float overflow */
+  {SIGFPE,  0xC0000092},	/* float stack check */
+  {SIGFPE,  0xC0000093},	/* float underflow */
+  {SIGFPE,  0xC0000094},	/* integer divide by zero */
+  {SIGFPE,  0xC0000095},	/* integer overflow */
+  {SIGILL,  0xC0000096},	/* privileged instruction */
+  {SIGSEGV, 0xC00000FD},	/* stack overflow */
+  {SIGTERM, 0xC000013A},	/* Ctrl-C exit */
+  {SIGINT,  0xC000013A}
+};
+
+int
+w32_status_to_termsig (unsigned status)
+{
+  int i;
+
+  for (i = 0; i < sizeof (sigtbl) / sizeof (sigtbl[0]); i++)
+    if (status == sigtbl[i].status)
+      return sigtbl[i].sig;
+
+  return SIGTERM;
+}
+
+void
+w32_maybe_set_errno (void)
+{
+  DWORD w32err = GetLastError ();
+
+  switch (w32err)
+    {
+      /* When stdout is redirected to a pipe, and the program that
+	 reads the pipe (e.g., a pager) exits, Windows doesn't set
+	 errno to a useful value.  Help it DTRT.  */
+      case ERROR_BAD_PIPE:
+      case ERROR_PIPE_BUSY:
+      case ERROR_NO_DATA:
+      case ERROR_PIPE_NOT_CONNECTED:
+	errno = EPIPE;
+	break;
+      default:
+	errno = EINVAL;
+	break;
+    }
+}
+
+#endif	/* __MINGW32__ */
+
+#if defined(__DJGPP__) || defined(__MINGW32__) || defined(__EMX__)
+
+void
+init_sockets(void)
+{
+#if defined(HAVE_SOCKETS) && !defined(__EMX__)
+  WSADATA  winsockData;
+  int errcode;
+
+  if ((errcode = WSAStartup (0x101, &winsockData)) != 0
+      || winsockData.wVersion != 0x101)
+    fatal(_("cannot start Winsock (%d)"), errcode);
+#endif
+}
+
+#endif	/* __DJGPP__ || __MINGW32__ */
+
+#ifdef __DJGPP__
+
+/* Replacement for the missing nl_langinfo.  DJGPP provides only C locale.  */
+#include <langinfo.h>
+
+char *
+nl_langinfo (int item)
+{
+  switch (item)
+    {
+      case CODESET:
+      default:
+        return (char *) "";
+    }
+}
+
+
+# if __DJGPP__ == 2 && __DJGPP_MINOR__ < 4 
+int
+unsetenv (const char *name)
+{
+  if (!name || !*name || strchr (name, '=') != NULL)
+    return -1;
+
+  return putenv (name);
+}
+#endif
+
+/* This is needed to defeat too-clever GCC warnings in dfa.c about
+   comparison being always false due to limited range of data type.  */
+wint_t
+btowc (int c)
+{
+  return c;
+}
+
+wint_t
+putwc(wchar_t wc, FILE *stream)
+{
+  return MB_CUR_MAX == 1 && wc > 0 && wc <= UCHAR_MAX
+         && putc((unsigned char)wc, stream) != EOF ? (wint_t)wc : WEOF;
+}
+
+#endif /* __DJGPP__ */
diff --git a/gawk-5.0.1/pc/getid.c b/gawk-5.0.1/pc/getid.c
new file mode 100644
index 00000000000..eb30ae44872
--- /dev/null
+++ b/gawk-5.0.1/pc/getid.c
@@ -0,0 +1,37 @@
+#ifdef __MINGW32__
+
+#include <process.h>
+
+unsigned int getuid (void)
+{
+  return (0);                   /* root! */
+}
+
+unsigned int geteuid (void)
+{
+  return (0);
+}
+
+unsigned int getgid (void)
+{
+  return (0);
+}
+
+unsigned int getegid (void)
+{
+  return (0);
+}
+
+#endif	/* __MINGW32__ */
+
+int getpgrp(void)
+{
+  return (0);
+}
+
+#if defined(__DJGPP__) || defined(__MINGW32__)
+int getppid(void)
+{
+  return (0);
+}
+#endif	/* __DJGPP__ || __MINGW32__ */
diff --git a/gawk-5.0.1/pc/in.h b/gawk-5.0.1/pc/in.h
new file mode 100644
index 00000000000..d0833805dc6
--- /dev/null
+++ b/gawk-5.0.1/pc/in.h
@@ -0,0 +1 @@
+/* A dummy in.h for pc/ systems.  */
diff --git a/gawk-5.0.1/pc/install.awk b/gawk-5.0.1/pc/install.awk
new file mode 100644
index 00000000000..7b8e1c9044a
--- /dev/null
+++ b/gawk-5.0.1/pc/install.awk
@@ -0,0 +1,62 @@
+# install.awk 
+# awk script to handle "make install". Goal is to eliminate need for
+# extra utilities (such as sh, mkdir, and cp). This is a hack.
+
+function mkinstalldirs(dir,  i, ii, j, jj, s, comp, mkdir)
+{
+  gsub("/", "\\", dir); ii = split(dir, s, " ")
+  print "@echo off" > install_bat
+  print "@echo off" > install_cmd
+  for (i = 1; i <= ii; i++) {
+    jj = split(s[i], comp, "\\"); dir = comp[1];
+    for (j = 1; j <= jj; dir=dir "\\" comp[++j]) {
+      if (substr(dir, length(dir)) == ":" || mkdir[dir]) continue;
+      printf("if not exist %s\\*.* mkdir %s\n", dir, dir) > install_bat
+      printf("if not exist %s\\* mkdir %s\n", dir, dir) > install_cmd
+      mkdir[dir] = 1
+    }
+  }
+  close(install_bat); close(install_cmd)
+  system(install)
+}
+
+function cp(s,  j, n, comp)
+{
+  gsub("/", "\\", s); n = split(s, comp, " ");
+  print "@echo off" > install_bat
+  print "@echo off" > install_cmd
+  for (j = 1; j < n; j++) {
+    printf("copy %s %s\n", comp[j], comp[n]) > install_cmd
+    if (substr(comp[j], length(comp[j]), 1) == "*")
+      comp[j] = comp[j] ".*"
+    printf("copy %s %s\n", comp[j], comp[n]) > install_bat
+  }
+  close(install_bat); close(install_cmd)
+  system(install)
+}
+    
+BEGIN{
+install = "installg"
+install_bat = install ".bat"; install_cmd = install ".cmd"
+igawk_cmd = prefix "/bin/igawk.cmd"
+igawk_bat = prefix "/bin/igawk.bat"
+igawk = "pc/awklib/igawk"
+
+# Make the bin directory
+mkinstalldirs(prefix "/bin");
+
+# Create igawk.cmd for OS/2
+printf("extproc sh %s/bin/igawk.cmd\nshift\n", prefix) > igawk_cmd
+while (getline < igawk) print $0 > igawk_cmd
+
+# Create igawk.bat for DOS
+printf("@sh igawk %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9", prefix) > igawk_bat
+
+# Do common
+cp(igawk " *awk.exe " prefix "/bin")
+mkinstalldirs(prefix "/lib/awk " prefix "/share/man/man1 " prefix "/share/info")
+cp("awklib/eg/lib/* pc/awklib/igawk.awk " prefix "/lib/awk");
+cp("doc/*.1 " prefix "/share/man/man1");
+cp("doc/gawk.info " prefix "/share/info");
+cp("doc/gawkinet.info " prefix "/share/info");
+}
diff --git a/gawk-5.0.1/pc/langinfo.h b/gawk-5.0.1/pc/langinfo.h
new file mode 100644
index 00000000000..2d22096812f
--- /dev/null
+++ b/gawk-5.0.1/pc/langinfo.h
@@ -0,0 +1,9 @@
+/* langinfo.h replacement for MS-Windows build.  */
+#ifndef LANGINFO_H
+#define LANGINFO_H
+
+#define CODESET 1
+
+extern char *nl_langinfo (int);
+
+#endif
diff --git a/gawk-5.0.1/pc/make-config.bat b/gawk-5.0.1/pc/make-config.bat
new file mode 100755
index 00000000000..d2248048dcd
--- /dev/null
+++ b/gawk-5.0.1/pc/make-config.bat
@@ -0,0 +1,6 @@
+@echo off
+sed -n -f configpk.sed < ..\configure.ac > tmp.sed
+sed -f config.sed < ..\configh.in > config.tmp
+sed -f tmp.sed < config.tmp > config.h
+del tmp.sed
+del config.tmp
diff --git a/gawk-5.0.1/pc/mkinstal.sh b/gawk-5.0.1/pc/mkinstal.sh
new file mode 100644
index 00000000000..f5e45f33ee0
--- /dev/null
+++ b/gawk-5.0.1/pc/mkinstal.sh
@@ -0,0 +1,33 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Last modified: 1994-03-25
+# Public domain
+
+errstatus=0
+
+for file in ${1+"$@"} ; do 
+   #set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   set fnord `echo "$file" | sed 's/\([^:]\)\//\1 /g'`
+   shift
+
+   pathcomp=
+   for d in ${1+"$@"} ; do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+        mkdir "$pathcomp" || errstatus=$?
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/gawk-5.0.1/pc/popen.c b/gawk-5.0.1/pc/popen.c
new file mode 100644
index 00000000000..425d32b97d3
--- /dev/null
+++ b/gawk-5.0.1/pc/popen.c
@@ -0,0 +1,305 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <io.h>
+#include <string.h>
+#include <process.h>
+#include <errno.h>
+#include "popen.h"
+#undef popen
+#undef pclose
+#undef system
+
+#ifndef _NFILE
+#define _NFILE 40
+#endif
+
+static struct {
+  char *command;
+  char *name;
+  char pmode[4];
+} pipes[_NFILE];
+
+
+/*
+ * For systems where system() and popen() do not follow SHELL:
+ *  1. Write command to temp file.  Temp filename must have slashes
+ *     compatible with SHELL (if set) or COMSPEC.
+ *  2. Convert slashes in SHELL (if present) to be compatible with COMSPEC.
+ * Currently, only MSC (running under DOS) and MINGW versions are managed.
+ */
+
+#if defined(__MINGW32__)
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+#if 0
+static int
+unixshell(char *p)
+{
+  static char *shell[] = {"sh", "bash", "csh", "tcsh", "sh32", "sh16", "ksh", NULL};
+  char **shellp = shell, *s, *q;
+
+  if (p == NULL) return (0);
+  s = p = strdup(p);
+  if ((q = strrchr(p, '\\')) != NULL)
+    p = q + 1;
+  if ((q = strrchr(p, '/')) != NULL)
+    p = q + 1;
+  if ((q = strchr(p, '.')) != NULL)
+    *q = '\0';
+  strlwr(p);
+  do {
+    if (strcmp(*shellp, p) == 0) break;
+  } while (*++shellp);
+  free(s);
+  return(*shellp ? 1 : 0);
+}
+
+static char *
+slashify(char *p, char *s)
+{
+  if (unixshell(s))
+    while (s = strchr(p, '\\')) *s = '/';
+  else
+    while (s = strchr(p, '/')) *s = '\\';
+  return(p);
+}
+
+static char *
+scriptify(const char *command)
+{
+  FILE *fp;
+  char *cmd, *name, *s, *p;
+  int i;
+
+  if((name = tempnam(".", "pip")) == NULL) return(NULL);
+  p = getenv("COMSPEC"); s = getenv("SHELL");
+  cmd = malloc(strlen(name) + (s ? strlen(s) : 0) + 9); *cmd = '\0';
+  if (s) {
+    slashify(strcpy(cmd, s), p);
+    p = s;
+  }
+  slashify(name, p);
+  if (! (i = unixshell(p))) {
+    char *p = (char *) realloc(name, strlen(name) + 5);
+    if (p == NULL) {
+	free(cmd);
+	return NULL;
+    }
+    name = p;
+    strcat(name, ".bat");
+  }
+  if (s) sprintf(cmd + strlen(cmd), " %cc ", unixshell(s) ? '-' : '/');
+  strcpy(p = cmd + strlen(cmd), name); free(name);
+
+  if ((fp = fopen(p, i ? "wb" : "w")) != NULL) {
+    if (! i) fputs("@echo off\n", fp);
+    i = strlen(command);
+    if ((fwrite(command, 1, i, fp) < i) || (fputc('\n', fp) == EOF)) {
+      free(cmd);
+      cmd = NULL;
+    }
+  } else {
+    free(cmd);
+    cmd = NULL;
+  }
+  if (fp) fclose(fp);
+  return(cmd);
+}
+
+static void
+unlink_and_free(char *cmd)
+{
+  char *s;
+
+  if (s = strrchr(cmd, ' '))
+    s++;
+  else
+    s = cmd;
+  unlink(s); free(cmd);
+}
+#endif
+
+int
+os_system(const char *cmd)
+{
+  char *cmdexe = getenv("ComSpec");
+  char *cmd1 = quote_cmd(cmd);
+  int i = spawnl(P_WAIT, cmdexe, "cmd.exe", "/c", cmd1, NULL);
+
+  free(cmd1);
+  return(i);
+}
+
+#ifndef PIPES_SIMULATED
+int
+kill (int pid, int sig)
+{
+  HANDLE ph;
+  int retval = 0;
+
+  /* We only support SIGKILL.  */
+  if (sig != SIGKILL)
+    {
+      errno = ENOSYS;
+      return -1;
+    }
+
+  ph = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
+  if (ph)
+    {
+      BOOL status = TerminateProcess(ph, -1);
+
+      if (!status)
+	{
+	  errno = EPERM;
+	  retval = -1;
+	}
+    }
+  else
+    {
+      /* If we cannot open the process, it means we eaither aren't
+	 allowed to (e.g., a process of another user), or such a
+	 process doesn't exist.  */
+      switch (GetLastError ())
+	{
+	  case ERROR_ACCESS_DENIED:
+	    errno = EPERM;
+	    break;
+	  default:
+	    errno = ESRCH;
+	    break;
+	}
+      retval = -1;
+    }
+  CloseHandle (ph);
+  return retval;
+}
+
+char *
+quote_cmd(const char *cmd)
+{
+  char *quoted;
+
+  /* The command will be invoked via cmd.exe, whose behavior wrt
+     quoted commands is to remove the first and the last quote
+     characters, and leave the rest (including any quote characters
+     inside the outer pair) intact.  */
+  quoted = malloc(strlen (cmd) + 2 + 1);
+  sprintf(quoted, "\"%s\"", cmd);
+
+  return quoted;
+}
+#endif
+
+#else  /* !__MINGW32__ */
+#define os_system(cmd) system(cmd)
+#endif
+
+
+FILE *
+os_popen(const char *command, const char *mode )
+{
+    FILE *current;
+    char *name;
+    int cur;
+    char curmode[4];
+
+    if (*mode != 'r' && *mode != 'w')
+      return NULL;
+    strncpy(curmode, mode, 3); curmode[3] = '\0';
+
+#if defined(__MINGW32__)
+    current = popen(command, mode);
+    cur = fileno(current);
+    strcpy(pipes[cur].pmode, curmode);
+    return(current);
+#endif
+
+    /*
+    ** get a name to use.
+    */
+    if((name = tempnam(".","pip"))==NULL)
+        return NULL;
+    /*
+    ** If we're reading, just call system to get a file filled with
+    ** output.
+    */
+    if (*curmode == 'r') {
+        FILE *fp;
+        if ((cur = dup(fileno(stdout))) == -1)
+	    return NULL;
+	*curmode = 'w';
+        if ((current = freopen(name, curmode, stdout)) == NULL)
+	    return NULL;
+        os_system(command);
+        if (dup2(cur, fileno(stdout)) == -1)
+	    return NULL;
+	close(cur);
+	*curmode = 'r';
+        if ((current = fopen(name, curmode)) == NULL)
+            return NULL;
+    } else {
+        if ((current = fopen(name, curmode)) == NULL)
+            return NULL;
+    }
+    cur = fileno(current);
+    pipes[cur].name = name;
+    strcpy(pipes[cur].pmode, curmode);
+    pipes[cur].command = strdup(command);
+    return current;
+}
+
+int
+os_pclose( FILE * current)
+{
+    int cur = fileno(current);
+    int fd, rval;
+
+#if defined(__MINGW32__)
+    rval = pclose(current);
+    *pipes[cur].pmode = '\0';
+    return rval;
+#endif
+
+    /*
+    ** check for an open file.
+    */
+    switch (*pipes[cur].pmode) {
+    case 'r':
+        /*
+        ** input pipes are just files we're done with.
+        */
+        rval = fclose(current);
+        unlink(pipes[cur].name);
+	break;
+    case 'w':
+        /*
+        ** output pipes are temporary files we have
+        ** to cram down the throats of programs.
+        */
+        fclose(current);
+	rval = -1;
+	if ((fd = dup(fileno(stdin))) != -1) {
+	  char *mode = pipes[cur].pmode; *mode = 'r';
+	  if (current = freopen(pipes[cur].name, mode, stdin)) {
+	    rval = os_system(pipes[cur].command);
+	    fclose(current);
+	    if (dup2(fd, fileno(stdin)) == -1) rval = -1;
+	    close(fd);
+	  }
+	}
+        unlink(pipes[cur].name);
+	break;
+    default:
+      return -1;
+    }
+    /*
+    ** clean up current pipe.
+    */
+    *pipes[cur].pmode = '\0';
+    free(pipes[cur].name);
+    free(pipes[cur].command);
+    return rval;
+}
diff --git a/gawk-5.0.1/pc/popen.h b/gawk-5.0.1/pc/popen.h
new file mode 100644
index 00000000000..b86c00f0f38
--- /dev/null
+++ b/gawk-5.0.1/pc/popen.h
@@ -0,0 +1,20 @@
+/*
+** popen.h -- prototypes for pipe functions
+*/
+#if !defined (__DJGPP__)
+# if defined (popen)
+#  undef popen
+#  undef pclose
+# endif
+# define popen(c, m)	os_popen(c, m)
+# define pclose(f)	os_pclose(f)
+  extern FILE *os_popen( const char *, const char * );
+  extern int  os_pclose( FILE * );
+# ifdef __MINGW32__
+#  define system(c)	os_system(c)
+   extern int os_system( const char * );
+#  define SIGKILL	9
+   extern int kill( int, int );
+   extern char *quote_cmd( const char * );
+# endif	 /* __MINGW32__ */
+#endif	/* !__DJGPP__ */
diff --git a/gawk-5.0.1/pc/socket.h b/gawk-5.0.1/pc/socket.h
new file mode 100644
index 00000000000..d7b890ddf76
--- /dev/null
+++ b/gawk-5.0.1/pc/socket.h
@@ -0,0 +1,45 @@
+/* An emulation for socket.h header for pc/ systems.  */
+
+#ifndef GAWK_SOCKET_H
+#define GAWK_SOCKET_H
+
+#ifdef __MINGW32__
+
+#include <io.h>
+
+#if !defined _WIN32_WINNT || _WIN32_WINNT < 0x501
+# undef _WIN32_WINNT
+# define _WIN32_WINNT 0x501
+#endif
+#include <winsock2.h>
+#include <ws2tcpip.h>
+
+#define socket(f,t,p)		w32_socket(f,t,p)
+#define setsockopt(f,l,o,v,s)	w32_setsockopt(f,l,o,v,s)
+#define bind(f,a,l)		w32_bind(f,a,l)
+#define connect(f,a,l)		w32_connect(f,a,l)
+#define listen(f,b)		w32_listen(f,b)
+#define accept(f,a,l)		w32_accept(f,a,l)
+#define closemaybesocket(f)	w32_closesocket(f)
+#define recvfrom(f,b,l,fl,fr,ln)	w32_recvfrom(f,b,l,fl,fr,ln)
+#define shutdown(f,h)		w32_shutdown(f,h)
+
+#define SOCKET_TO_FD(s)		socket_to_fd(s)
+#define FD_TO_SOCKET(fd) \
+  ((fd) == INVALID_HANDLE ? INVALID_SOCKET : _get_osfhandle(fd))
+
+int w32_socket (int, int, int);
+int w32_setsockopt (int, int, int, const char *, int);
+int w32_bind (int, const struct sockaddr *, int);
+int w32_connect (int, const struct sockaddr *, int);
+int w32_listen (int, int);
+int w32_accept (int, struct sockaddr *, int *);
+int w32_closesocket (int);
+int w32_recvfrom (int, char *, int, int, struct sockaddr *, int *);
+int w32_shutdown (int, int);
+int socket_to_fd (SOCKET);
+SOCKET valid_socket (int);
+
+#endif	/* __MINGW32__ */
+
+#endif	/* GAWK_SOCKET_H */
diff --git a/gawk-5.0.1/pc/testoutcmp.awk b/gawk-5.0.1/pc/testoutcmp.awk
new file mode 100644
index 00000000000..d4bbadd0653
--- /dev/null
+++ b/gawk-5.0.1/pc/testoutcmp.awk
@@ -0,0 +1,80 @@
+# cmp replacement program for PC where the error messages aren't
+# exactly the same, and neither are e+NNN exponents.
+# should run even on old awk
+#
+# Copyright (C) 2011-2015 the Free Software Foundation, Inc.
+# 
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+# 
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+{
+	if (FNR == NR)
+		file = 0
+	else
+		file = 1
+	gsub(/\r/, "", $0)
+	lines[file, FNR] = $0
+}
+
+END {
+	if (NR/2 != FNR) {
+		printf("testoutcmp: warning: files are not of equal length!\n") > "/dev/stderr"
+		exit 1
+	}
+
+	status = 0;
+	for (i = 1; i <= FNR; i++) {
+		good = lines[0, i]
+		actual = lines[1, i]
+		if (good == actual)
+			continue
+
+		l = length(good)
+		if (substr(good, l, 1) == ")")
+			l--
+		if (substr(good, 1, l) == substr(actual, 1, l))
+			continue
+
+		# For exponents
+		actual1 = gensub(/( ?)([-+]?[0-9.][0-9.]?+e[-+])0([0-9][0-9])/, " \\1\\2\\3", "g", actual)
+		if (good == actual1)
+		    continue
+		actual1 = gensub(/([-+]?0)([0-9.]+e[-+])0([0-9][0-9])/, "\\10\\2\\3", "g", actual)
+		if (good == actual1)
+		    continue
+		actual1 = gensub(/( ?)([-+]?)([1-9.][0-9.]?+e[-+])0([0-9][0-9])/, "\\1\\20\\3\\4", "g", actual)
+		if (good == actual1)
+		    continue
+		actual1 = gensub(/([-+]?[0-9.]+e[-+])0([0-9][0-9])/, "\\1\\2 ", "g", actual)
+		if (good == actual1)
+		    continue
+		actual1 = gensub(/([-+]?[0-9.]+e[-+])0([0-9][0-9])/, "\\1\\2", "g", actual)
+		if (good == actual1)
+		    continue
+		# For exit test
+		actual1 = gensub(/([01]) nul/, "\\1 null", "g", actual)
+		if (good == actual1)
+		    continue
+		else {
+			printf("-%s\n", good) > "/dev/stderr"
+			printf("+%s\n", actual) > "/dev/stderr"
+			status = 1
+		}
+	}
+
+	exit status
+}
diff --git a/gawk-5.0.1/po/ChangeLog b/gawk-5.0.1/po/ChangeLog
new file mode 100644
index 00000000000..15f72072236
--- /dev/null
+++ b/gawk-5.0.1/po/ChangeLog
@@ -0,0 +1,14 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-05-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* pt.po: New file.
+	* LINGUAS: Updated.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/po/ChangeLog.0 b/gawk-5.0.1/po/ChangeLog.0
new file mode 100644
index 00000000000..3c951001c1c
--- /dev/null
+++ b/gawk-5.0.1/po/ChangeLog.0
@@ -0,0 +1,127 @@
+Wed Jun  8 22:14:07 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* sv.po, sv.gmo: Updated!
+	* LINGUAS: Updated and sorted.
+
+Thu May 19 17:10:07 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* LINGUAS: Updated and sorted.
+
+Wed May 18 21:45:31 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* LINGUAS: Updated and sorted.
+
+Sun May  1 20:32:10 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* LINGUAS: Removed all files not updated recently; some have been
+	abandoned all the way back to 2002.
+	* README: New file.
+
+Mon Mar 21 20:40:28 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* LINGUAS: Sorted.
+
+Fri Mar 18 12:01:21 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* fi.po, fi.gmo: New files.
+	* LINGUAS: Updated.
+
+2010-12-22  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.18.1.
+	* Rules-quot: Upgrade to gettext-0.18.1.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Mon Jun  8 23:12:09 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in.in: Reinstate change of 2008.12.18.
+
+2009-06-08  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.17.
+
+Thu Dec 18 20:36:34 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in.in (install-dvi, install-ps): New targets that
+	do nothing, per email from "Stoddard, Isaac A"
+	<isaac.a.stoddard@boeing.com>.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Mon Sep 10 12:41:34 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* All .po files: Updated to GPL 3.
+
+2007-01-08  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.16.1.
+	* Makevar.template: New file, copied in from gettext-0.16.1.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+2004-02-19  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.14.1.
+	* Rules-quot: Upgrade to gettext-0.14.1.
+
+2004-01-16  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.13.1.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+2003-06-16  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.12.1.
+	* Rules-quot: New file, from gettext-0.12.1.
+	* boldquot.sed: New file, from gettext-0.12.1.
+	* en@boldquot.header: New file, from gettext-0.12.1.
+	* en@quot.header: New file, from gettext-0.12.1.
+	* insert-header.sin: New file, from gettext-0.12.1.
+	* quot.sed: New file, from gettext-0.12.1.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Mon Dec  2 11:49:59 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Rules-quot, en@quot.reader, en@boldquot.reader: removed.
+
+Thu Sep 19 11:00:00 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Updated to gettext 0.11.5.
+
+Mon Jun 17 18:26:23 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* POTFILES.in: Updated with list of new regex files.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+2002-04-09  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.11.1.
+	* remove-potcdate.sin: New file, from gettext-0.11.1.
+
diff --git a/gawk-5.0.1/po/ChangeLog.1 b/gawk-5.0.1/po/ChangeLog.1
new file mode 100644
index 00000000000..da08114f871
--- /dev/null
+++ b/gawk-5.0.1/po/ChangeLog.1
@@ -0,0 +1,171 @@
+2019-03-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* zh_CN.po: Updated.
+
+2019-03-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* sv.po: Updated.
+
+2019-03-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* pt_BR.po: Updated.
+
+2019-03-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ko.po: New translation.
+	* LINGUAS: Updated.
+
+2019-03-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fr.po, zh_CN.po: Updated.
+
+2019-02-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* it.po: Updated.
+
+2019-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fr.po, pt_BR.po: Updated.
+
+2018-12-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* it.po: Updated.
+
+2018-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* it.po: Updated.
+
+2018-09-16  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.19.8.1.
+
+2018-03-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* es.po: Updated.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-02-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* zh_CN.po: Updated.
+
+2018-02-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* pt_BR.po: Updated.
+
+2018-01-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* it.po, pt_BR.po, sv.po: Updated.
+
+2018-01-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fr.po, vi.po: Updated.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-09-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* de.po: Updated.
+
+2017-09-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* sv.po: Updated.
+
+2017-09-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fr.po, it.po, pt_BR.po, vi.po, zh_CN.po: Updated.
+
+2017-08-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fi.po, sv.po: Updated.
+
+2017-08-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fr.po, it.po, pt_BR.po, vi.po, zh_CN.po: Updated.
+
+2017-02-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* POTFILES.in: Update list of files and sort it.
+
+2017-01-27         Rafael Fontenelle     <rafaelff@gnome.org>
+
+	* POTFILES.in: Fix path of some files listed there so that
+	update via commands like 'make gawk.pot-update' or
+	'intltool-update <lang>' will work.
+
+2017-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* LINGUAS: Updated with pt_BR.
+	* pt_BR.po: Updated.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-02-22  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.19.7.
+	* Rules-quot: Upgrade to gettext-0.19.7.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-01-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* POTFILES.in: Brought up to date.
+
+2014-11-19  gettextize  <bug-gnu-gettext@gnu.org>
+
+	* Makefile.in.in: Upgrade to gettext-0.19.3.
+	* Rules-quot: Upgrade to gettext-0.19.3.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* POTFILES.in: Brought up to date.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-07-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* POTFILES.in: Brought up to date.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2011-07-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.in.in (dist2): Remove README from list of files checked for
+	manually. Added in main directory's Makefile.am EXTRA_DIST, per
+	advice from Bruno Haible.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.in.in (dist2): Add README to list of files checked for
+	manually.
+	* 4.0.0: Remake the tar ball.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/po/LINGUAS b/gawk-5.0.1/po/LINGUAS
new file mode 100644
index 00000000000..b702442b68d
--- /dev/null
+++ b/gawk-5.0.1/po/LINGUAS
@@ -0,0 +1,18 @@
+ca
+da
+de
+es
+fi
+fr
+id
+it
+ja
+ko
+ms
+nl
+pl
+pt
+pt_BR
+sv
+vi
+zh_CN
diff --git a/gawk-5.0.1/po/Makefile.in.in b/gawk-5.0.1/po/Makefile.in.in
new file mode 100644
index 00000000000..38c293d2ed2
--- /dev/null
+++ b/gawk-5.0.1/po/Makefile.in.in
@@ -0,0 +1,483 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.  This file is offered as-is,
+# without any warranty.
+#
+# Origin: gettext-0.19.8
+GETTEXT_MACRO_VERSION = 0.19
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+
+SED = @SED@
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datarootdir = @datarootdir@
+datadir = @datadir@
+localedir = @localedir@
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+# We use $(mkdir_p).
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions,
+# @install_sh@ does not start with $(SHELL), so we add it.
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake
+# versions, $(mkinstalldirs) and $(install_sh) are unused.
+mkinstalldirs = $(SHELL) @install_sh@ -d
+install_sh = $(SHELL) @install_sh@
+MKDIR_P = @MKDIR_P@
+mkdir_p = @mkdir_p@
+
+# When building gettext-tools, we prefer to use the built programs
+# rather than installed programs.  However, we can't do that when we
+# are cross compiling.
+CROSS_COMPILING = @CROSS_COMPILING@
+
+GMSGFMT_ = @GMSGFMT@
+GMSGFMT_no = @GMSGFMT@
+GMSGFMT_yes = @GMSGFMT_015@
+GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT))
+MSGFMT_ = @MSGFMT@
+MSGFMT_no = @MSGFMT@
+MSGFMT_yes = @MSGFMT_015@
+MSGFMT = $(MSGFMT_$(USE_MSGCTXT))
+XGETTEXT_ = @XGETTEXT@
+XGETTEXT_no = @XGETTEXT@
+XGETTEXT_yes = @XGETTEXT_015@
+XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT))
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+POFILESDEPS_ = $(srcdir)/$(DOMAIN).pot
+POFILESDEPS_yes = $(POFILESDEPS_)
+POFILESDEPS_no =
+POFILESDEPS = $(POFILESDEPS_$(PO_DEPENDS_ON_POT))
+
+DISTFILESDEPS_ = update-po
+DISTFILESDEPS_yes = $(DISTFILESDEPS_)
+DISTFILESDEPS_no =
+DISTFILESDEPS = $(DISTFILESDEPS_$(DIST_DEPENDS_ON_UPDATE_PO))
+
+# Makevars gets inserted here. (Don't remove this line!)
+
+.SUFFIXES:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+	@echo "$(MSGFMT) -c -o $@ $<"; \
+	$(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+	@lang=`echo $* | sed -e 's,.*/,,'`; \
+	test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+	echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \
+	cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+	sed -e '/^#/d' $< > t-$@
+	mv t-$@ $@
+
+
+all: all-@USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# Ensure that the gettext macros and this Makefile.in.in are in sync.
+CHECK_MACRO_VERSION = \
+	test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
+	  || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
+	       exit 1; \
+	     }
+
+# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
+# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
+# we don't want to bother translators with empty POT files). We assume that
+# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty.
+# In this case, stamp-po is a nop (i.e. a phony target).
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(POFILES) has been designed to not touch files that don't need to be
+# changed.
+stamp-po: $(srcdir)/$(DOMAIN).pot
+	@$(CHECK_MACRO_VERSION)
+	test ! -f $(srcdir)/$(DOMAIN).pot || \
+	  test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
+	@test ! -f $(srcdir)/$(DOMAIN).pot || { \
+	  echo "touch stamp-po" && \
+	  echo timestamp > stamp-poT && \
+	  mv stamp-poT stamp-po; \
+	}
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
+# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+# The determination of whether the package xyz is a GNU one is based on the
+# heuristic whether some file in the top level directory mentions "GNU xyz".
+# If GNU 'find' is available, we avoid grepping through monster files.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+	package_gnu="$(PACKAGE_GNU)"; \
+	test -n "$$package_gnu" || { \
+	  if { if (LC_ALL=C find --version) 2>/dev/null | grep GNU >/dev/null; then \
+		 LC_ALL=C find -L $(top_srcdir) -maxdepth 1 -type f \
+			       -size -10000000c -exec grep 'GNU @PACKAGE@' \
+			       /dev/null '{}' ';' 2>/dev/null; \
+	       else \
+		 LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null; \
+	       fi; \
+	     } | grep -v 'libtool:' >/dev/null; then \
+	     package_gnu=yes; \
+	   else \
+	     package_gnu=no; \
+	   fi; \
+	}; \
+	if test "$$package_gnu" = "yes"; then \
+	  package_prefix='GNU '; \
+	else \
+	  package_prefix=''; \
+	fi; \
+	if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
+	  msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
+	else \
+	  msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
+	fi; \
+	case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+	  '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
+	    $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+	      --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+	      --files-from=$(srcdir)/POTFILES.in \
+	      --copyright-holder='$(COPYRIGHT_HOLDER)' \
+	      --msgid-bugs-address="$$msgid_bugs_address" \
+	    ;; \
+	  *) \
+	    $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+	      --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
+	      --files-from=$(srcdir)/POTFILES.in \
+	      --copyright-holder='$(COPYRIGHT_HOLDER)' \
+	      --package-name="$${package_prefix}@PACKAGE@" \
+	      --package-version='@VERSION@' \
+	      --msgid-bugs-address="$$msgid_bugs_address" \
+	    ;; \
+	esac
+	test ! -f $(DOMAIN).po || { \
+	  if test -f $(srcdir)/$(DOMAIN).pot-header; then \
+	    sed -e '1,/^#$$/d' < $(DOMAIN).po > $(DOMAIN).1po && \
+	    cat $(srcdir)/$(DOMAIN).pot-header $(DOMAIN).1po > $(DOMAIN).po; \
+	    rm -f $(DOMAIN).1po; \
+	  fi; \
+	  if test -f $(srcdir)/$(DOMAIN).pot; then \
+	    sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+	    sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+	    if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+	      rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+	    else \
+	      rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+	      mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+	    fi; \
+	  else \
+	    mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+	  fi; \
+	}
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+	$(MAKE) $(DOMAIN).pot-update
+
+# This target rebuilds a PO file if $(DOMAIN).pot has changed.
+# Note that a PO file is not touched if it doesn't need to be changed.
+$(POFILES): $(POFILESDEPS)
+	@lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+	if test -f "$(srcdir)/$${lang}.po"; then \
+	  test -f $(srcdir)/$(DOMAIN).pot || $(MAKE) $(srcdir)/$(DOMAIN).pot; \
+	  test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+	  echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \
+	  cd $(srcdir) \
+	    && { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+	           '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+	             $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
+	           *) \
+	             $(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \
+	         esac; \
+	       }; \
+	else \
+	  $(MAKE) $${lang}.po-create; \
+	fi
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+	  for file in $(DISTFILES.common) Makevars.template; do \
+	    $(INSTALL_DATA) $(srcdir)/$$file \
+			    $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	  for file in Makevars; do \
+	    rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	else \
+	  : ; \
+	fi
+install-data-no: all
+install-data-yes: all
+	@catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+	  dir=$(localedir)/$$lang/LC_MESSAGES; \
+	  $(mkdir_p) $(DESTDIR)$$dir; \
+	  if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+	  $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+	  echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+	  for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+	    if test -n "$$lc"; then \
+	      if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+	        link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+	        mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	        mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+	         for file in *; do \
+	           if test -f $$file; then \
+	             ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+	           fi; \
+	         done); \
+	        rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	      else \
+	        if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+	          :; \
+	        else \
+	          rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	          mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        fi; \
+	      fi; \
+	      rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+	      ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+	      ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+	      cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+	      echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+	    fi; \
+	  done; \
+	done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
+	else \
+	  : ; \
+	fi
+installdirs-data-no:
+installdirs-data-yes:
+	@catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+	  dir=$(localedir)/$$lang/LC_MESSAGES; \
+	  $(mkdir_p) $(DESTDIR)$$dir; \
+	  for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+	    if test -n "$$lc"; then \
+	      if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+	        link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+	        mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	        mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+	         for file in *; do \
+	           if test -f $$file; then \
+	             ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+	           fi; \
+	         done); \
+	        rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+	      else \
+	        if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+	          :; \
+	        else \
+	          rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	          mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+	        fi; \
+	      fi; \
+	    fi; \
+	  done; \
+	done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  for file in $(DISTFILES.common) Makevars.template; do \
+	    rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+	  done; \
+	else \
+	  : ; \
+	fi
+uninstall-data-no:
+uninstall-data-yes:
+	catalogs='$(CATALOGS)'; \
+	for cat in $$catalogs; do \
+	  cat=`basename $$cat`; \
+	  lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+	  for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+	    rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+	  done; \
+	done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+	rm -f remove-potcdate.sed
+	rm -f stamp-poT
+	rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+	rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+	rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+	@echo "This command is intended for maintainers to use;"
+	@echo "it deletes files that may require special tools to rebuild."
+	rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+	test -z "$(DISTFILESDEPS)" || $(MAKE) $(DISTFILESDEPS)
+	@$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: stamp-po $(DISTFILES)
+	dists="$(DISTFILES)"; \
+	if test "$(PACKAGE)" = "gettext-tools"; then \
+	  dists="$$dists Makevars.template"; \
+	fi; \
+	if test -f $(srcdir)/$(DOMAIN).pot; then \
+	  dists="$$dists $(DOMAIN).pot stamp-po"; \
+	fi; \
+	if test -f $(srcdir)/ChangeLog; then \
+	  dists="$$dists ChangeLog"; \
+	fi; \
+	for i in 0 1 2 3 4 5 6 7 8 9; do \
+	  if test -f $(srcdir)/ChangeLog.$$i; then \
+	    dists="$$dists ChangeLog.$$i"; \
+	  fi; \
+	done; \
+	if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+	for file in $$dists; do \
+	  if test -f $$file; then \
+	    cp -p $$file $(distdir) || exit 1; \
+	  else \
+	    cp -p $(srcdir)/$$file $(distdir) || exit 1; \
+	  fi; \
+	done
+
+update-po: Makefile
+	$(MAKE) $(DOMAIN).pot-update
+	test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+	$(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+	@lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+	echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+	exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+	@lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+	if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; fi; \
+	tmpdir=`pwd`; \
+	echo "$$lang:"; \
+	test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+	echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+	cd $(srcdir); \
+	if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+	       '' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
+	         $(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+	       *) \
+	         $(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
+	     esac; \
+	   }; then \
+	  if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+	    rm -f $$tmpdir/$$lang.new.po; \
+	  else \
+	    if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+	      :; \
+	    else \
+	      echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+	      exit 1; \
+	    fi; \
+	  fi; \
+	else \
+	  echo "msgmerge for $$lang.po failed!" 1>&2; \
+	  rm -f $$tmpdir/$$lang.new.po; \
+	fi
+
+$(DUMMYPOFILES):
+
+update-gmo: Makefile $(GMOFILES)
+	@:
+
+# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
+# because execution permission bits may not work on the current file system.
+# Use @SHELL@, which is the shell determined by autoconf for the use by its
+# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
+Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
+	cd $(top_builddir) \
+	  && @SHELL@ ./config.status $(subdir)/$@.in po-directories
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/po/Makevars b/gawk-5.0.1/po/Makevars
new file mode 100644
index 00000000000..4293de4ed49
--- /dev/null
+++ b/gawk-5.0.1/po/Makevars
@@ -0,0 +1,78 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This tells whether or not to prepend "GNU " prefix to the package
+# name that gets inserted into the header of the $(DOMAIN).pot file.
+# Possible values are "yes", "no", or empty.  If it is empty, try to
+# detect it automatically by scanning the files in $(top_srcdir) for
+# "GNU packagename" string.
+PACKAGE_GNU =
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = bug-gawk@gnu.org
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt'
+# context.  Possible values are "yes" and "no".  Set this to yes if the
+# package uses functions taking also a message context, like pgettext(), or
+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument.
+USE_MSGCTXT = no
+
+# These options get passed to msgmerge.
+# Useful options are in particular:
+#   --previous            to keep previous msgids of translated messages,
+#   --quiet               to reduce the verbosity.
+MSGMERGE_OPTIONS =
+
+# These options get passed to msginit.
+# If you want to disable line wrapping when writing PO files, add
+# --no-wrap to MSGMERGE_OPTIONS, XGETTEXT_OPTIONS, and
+# MSGINIT_OPTIONS.
+MSGINIT_OPTIONS =
+
+# This tells whether or not to regenerate a PO file when $(DOMAIN).pot
+# has changed.  Possible values are "yes" and "no".  Set this to no if
+# the POT file is checked in the repository and the version control
+# program ignores timestamps.
+PO_DEPENDS_ON_POT = yes
+
+# This tells whether or not to forcibly update $(DOMAIN).pot and
+# regenerate PO files on "make dist".  Possible values are "yes" and
+# "no".  Set this to no if the POT file and PO files are maintained
+# externally.
+DIST_DEPENDS_ON_UPDATE_PO = yes
diff --git a/gawk-5.0.1/po/POTFILES.in b/gawk-5.0.1/po/POTFILES.in
new file mode 100644
index 00000000000..bc8c9c72a21
--- /dev/null
+++ b/gawk-5.0.1/po/POTFILES.in
@@ -0,0 +1,52 @@
+# List of source files containing translatable strings.
+# Copyright (C) 1999, 2002, 2012, 2017 Free Software Foundation, Inc.
+
+array.c
+awkgram.c
+builtin.c
+cint_array.c
+command.c
+debug.c
+eval.c
+ext.c
+extension/filefuncs.c
+extension/fnmatch.c
+extension/fork.c
+extension/gawkfts.c
+extension/inplace.c
+extension/ordchr.c
+extension/readdir.c
+extension/readfile.c
+extension/revoutput.c
+extension/revtwoway.c
+extension/rwarray.c
+extension/rwarray0.c
+extension/stack.c
+extension/testext.c
+extension/time.c
+field.c
+floatcomp.c
+gawkapi.c
+gawkmisc.c
+int_array.c
+io.c
+main.c
+mpfr.c
+msg.c
+node.c
+posix/gawkmisc.c
+profile.c
+re.c
+replace.c
+str_array.c
+support/dfa.c
+support/getopt.c
+support/getopt1.c
+support/localeinfo.c
+support/random.c
+support/regcomp.c
+support/regex.c
+support/regex_internal.c
+support/regexec.c
+symbol.c
+version.c
diff --git a/gawk-5.0.1/po/README b/gawk-5.0.1/po/README
new file mode 100644
index 00000000000..dbe9ebd1ea6
--- /dev/null
+++ b/gawk-5.0.1/po/README
@@ -0,0 +1,15 @@
+Sun May  1 20:34:31 IDT 2011
+============================
+
+For gawk 4.0, I have removed .po files that are not being maintained
+from the distribution, since the code base has changed so much.
+
+The original files are still available from the gawk git repository
+and/or from the translation project.  If your language used to be supported
+and no longer is, please consider updating the translation so that it
+can be restored to the distribution.
+
+Thanks!
+
+Arnold Robbins
+arnold@skeeve.com
diff --git a/gawk-5.0.1/po/Rules-quot b/gawk-5.0.1/po/Rules-quot
new file mode 100644
index 00000000000..baf652858ad
--- /dev/null
+++ b/gawk-5.0.1/po/Rules-quot
@@ -0,0 +1,58 @@
+# This file, Rules-quot, can be copied and used freely without restrictions.
+# Special Makefile rules for English message catalogs with quotation marks.
+
+DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-create:
+	$(MAKE) en@quot.po-update
+en@boldquot.po-create:
+	$(MAKE) en@boldquot.po-update
+
+en@quot.po-update: en@quot.po-update-en
+en@boldquot.po-update: en@boldquot.po-update-en
+
+.insert-header.po-update-en:
+	@lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+	if test "$(PACKAGE)" = "gettext-tools" && test "$(CROSS_COMPILING)" != "yes"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+	tmpdir=`pwd`; \
+	echo "$$lang:"; \
+	ll=`echo $$lang | sed -e 's/@.*//'`; \
+	LC_ALL=C; export LC_ALL; \
+	cd $(srcdir); \
+	if $(MSGINIT) $(MSGINIT_OPTIONS) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null \
+	   | $(SED) -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | \
+	   { case `$(MSGFILTER) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
+	     '' | 0.[0-9] | 0.[0-9].* | 0.1[0-8] | 0.1[0-8].*) \
+	       $(MSGFILTER) $(SED) -f `echo $$lang | sed -e 's/.*@//'`.sed \
+	       ;; \
+	     *) \
+	       $(MSGFILTER) `echo $$lang | sed -e 's/.*@//'` \
+	       ;; \
+	     esac } 2>/dev/null > $$tmpdir/$$lang.new.po \
+	     ; then \
+	  if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+	    rm -f $$tmpdir/$$lang.new.po; \
+	  else \
+	    if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+	      :; \
+	    else \
+	      echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+	      exit 1; \
+	    fi; \
+	  fi; \
+	else \
+	  echo "creation of $$lang.po failed!" 1>&2; \
+	  rm -f $$tmpdir/$$lang.new.po; \
+	fi
+
+en@quot.insert-header: insert-header.sin
+	sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+	sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+	rm -f *.insert-header
diff --git a/gawk-5.0.1/po/boldquot.sed b/gawk-5.0.1/po/boldquot.sed
new file mode 100644
index 00000000000..4b937aa517b
--- /dev/null
+++ b/gawk-5.0.1/po/boldquot.sed
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
+s/“/“[1m/g
+s/”/[0m”/g
+s/‘/‘[1m/g
+s/’/[0m’/g
diff --git a/gawk-5.0.1/po/ca.po b/gawk-5.0.1/po/ca.po
new file mode 100644
index 00000000000..ff5ceb25821
--- /dev/null
+++ b/gawk-5.0.1/po/ca.po
@@ -0,0 +1,4165 @@
+# translation of gawk.po to Catalan
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Antoni Bella Perez <bella5@teleline.es>, 2003.
+# Walter Garcia-Fontes <walter.garcia@upf.edu>, 2015,2016.
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.1.3h\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2016-12-18 19:51+0100\n"
+"Last-Translator: Walter Garcia-Fontes <walter.garcia@upf.edu>\n"
+"Language-Team: Catalan <ca@dodds.net>\n"
+"Language: ca\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: KBabel 1.0.1\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "de %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "s'ha intentat usar un valor escalar com a una matriu"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "s'ha intentat usar un par�metre escalar `%s' com a una matriu"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "s'ha intentat usar la dada escalar `%s' com a una matriu"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "s'ha intentat usar la matriu `%s' en un context escalar"
+
+#: array.c:574
+#, fuzzy, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: l'�ndex `%s' no est� en la matriu `%s'"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "s'ha intentat usar la dada escalar `%s[\"%.*s\"]' com a una matriu"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: el primer argument no �s una matriu"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: el segon argument no �s una matriu"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: el segon argument no �s una matriu"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: el primer argument no �s una matriu"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asort: el primer argument no �s una matriu"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: no es pot usar una submatriu com a primer argument per al segon "
+"argument"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: no es pot usar una submatriu com a primer argument per al segon "
+"argument"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: no es pot usar una submatriu com a segon argument per al primer "
+"argument"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: no es pot usar una submatriu com a segon argument per al primer "
+"argument"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "`%s' no �s v�lid com a nom de funci�"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "la funci� de comparaci� d'ordenaci� `%s' no est� definida"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s blocs han de tenir una part d'acci�"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "cada regla ha de tenir un patr� o una part d'acci�"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "l'antic awk no suporta m�ltiples regles `BEGIN' i `END'"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "`%s' �s una funci� interna, no pot ser redefinida"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr ""
+"la constant d'expressi� regular `//' sembla un comentari en C++, per� no ho "
+"�s"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr ""
+"la constant d'expressi� regular `/%s/' sembla un comentari en C, per� no ho "
+"�s"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "valors duplicats de casos al cos de l'expressi� switch: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr ""
+"s'ha detectat el cas predeterminat `default' duplicat a l'expressi� switch "
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "no es permet `break' a fora d'un bucle o bifurcaci�"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "no es permet `continue' a fora d'un bucle"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "`next' usat a l'acci� %s"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "`nextfile' usat a l'acci� %s"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "`return' �s usat fora del context d'una funci�"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"el �print� simple en la regla BEGIN o END probablement ha de ser �print \"\"�"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "no es permet `delete' amb SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "no es permet `delete' a FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "`delete(array)' �s una extensi� tawk no portable"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "les canonades bidireccionals multi-etapes no funcionen"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "expressi� regular a la dreta d'una assignaci�"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "expressi� regular a l'esquerra de l'operador `~' o `!~'"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr ""
+"l'antic awk no d�na suport a la paraula clau `in' excepte despr�s de `for'"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "expressi� regular a la dreta de la comparaci�"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "`getline' sense redirigir no �s v�lid a dins de la regla `%s'"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "`getline' no redirigit sense definir dintre de l'acci� FINAL"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "l'antic awk no suporta matrius multidimensionals"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "la crida de `length' sense par�ntesis no �s portable"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "les crides a funcions indirectes s�n una extensi� gawk"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"no es pot usar la variable especial `%s' per a una crida indirecta de funci�"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "s'ha intentat usar la no-funci� �%s� en una crida a funcions"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "expressi� de sub�ndex no v�lida"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "advertiment: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fatal: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "nova l�nia inesperada o final d'una cadena de car�cters"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "no es pot obrir el fitxer font `%s' per a lectura (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "no es pot obrir la llibreria compartida `%s' per a lectura (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "motiu desconegut"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "no es pot incloure `%s' i usar-lo com un fitxer de programa"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "ja s'ha incl�s el fitxer font `%s'"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "ja s'ha carregat la biblioteca compartida `%s'"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include �s una extensi� de gawk"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "nom de fitxer buit despr�s de @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load �s una extensi� de gawk"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "fitxer buit despr�s de @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "el text del programa en la l�nia de comandaments est� buit"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "no es pot llegir el fitxer font `%s' (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "el fitxer font `%s' est� buit"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "Error PEBKAC: car�cter �\\%03o'� no v�lid al codi font"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "el fitxer font no finalitza amb un retorn de carro"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "expressi� regular sense finalitzar acaba amb `\\' al final del fitxer"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "%s: %d: el modificador regex tawk `/.../%c' no funciona a gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "el modificador regex tawk `/.../%c' no funciona a gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "expressi� regular sense finalitzar"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "expressi� regular sense finalitzar al final del fitxer"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "l'�s de `\\ #...' com a continuaci� de l�nia no �s portable"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "la barra invertida no �s l'�ltim car�cter en la l�nia"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "les matrius multidimensionals s�n una extensi� gawk"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX no permet l'operador `**='"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "l'antic awk no suporta l'operador `**='"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX no permet l'operador `**'"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "l'antic awk no suporta l'operador `**='"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "l'operador `^=' no est� suportat en l'antic awk"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "l'operador `^' no est� suportat en l'antic awk"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "cadena sense finalitzar"
+
+#: awkgram.y:4048 main.c:1220
+#, fuzzy
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX no permet seq��ncies d'escapada `\\x'"
+
+#: awkgram.y:4050 node.c:453
+#, fuzzy
+msgid "backslash string continuation is not portable"
+msgstr "l'�s de `\\ #...' com a continuaci� de l�nia no �s portable"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "car�cter `%c' no v�lid en l'expressi�"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "`%s' �s una extensi� de gawk"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX no permet �%s�"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "`%s' no est� suportat en l'antic awk"
+
+#: awkgram.y:4494
+#, fuzzy
+msgid "`goto' considered harmful!"
+msgstr "`goto' es considera perjudicial!\n"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d no �s v�lid com a nombre d'arguments per a %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr "%s: la cadena literal com a �ltim argument de substituci� no t� efecte"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "%s el tercer par�metre no �s un objecte intercanviable"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: el tercer argument �s una extensi� de gawk"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: el segon argument �s una extensi� de gawk"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"l'�s de dcgettext(_\"...\") no �s correcte: elimineu el gui� baix inicial"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"l'�s de dcgettext(_\"...\") no �s correcte: elimineu el gui� baix inicial"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "�ndex: no es permet una constant regexp com a segon argument"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "funci� `%s': par�metre `%s' ofusca la variable global"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "no es pot obrir `%s' per a escriptura (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "s'est� enviant la llista de variables a l'eixida d'error est�ndard"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: tancament erroni (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() s'ha cridat dues vegades!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "hi ha hagut variables a l'ombra"
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "nom de la funci� `%s' definida pr�viament"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "funci� `%s�: no pot usar el nom de la funci� com a par�metre"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"funci� `%s': no es pot usar la variable especial `%s' com a un par�metre de "
+"funci�"
+
+#: awkgram.y:5092
+#, fuzzy, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "funci� `%s': par�metre `%s' ofusca la variable global"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "funci� `%s': par�metre #%d, `%s', duplica al par�metre #%d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "es crida a la funci� `%s' per� no s'ha definit"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "la funci� `%s' est� definida per� no s'ha cridat mai directament"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr ""
+"l'expressi� regular constant per al par�metre #%d condueix a un valor boole�"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"s'ha cridat a la funci� `%s' amb espai entre el nom i el '(',\n"
+"o s'ha usat com a variable o matriu"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "s'ha intentat una divisi� per zero"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "s'ha intentat una divisi� per zero en `%%'"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"no es pot assignar un valor al resultat d'una expressi� post-increment de "
+"camp"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "dest� no v�lid d'assignaci� (opcode %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "@include �s una extensi� de gawk"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s a \"%s\" ha fallat (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "sortida est�ndard"
+
+#: builtin.c:148
+#, fuzzy
+msgid "standard error"
+msgstr "sortida est�ndard"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: s'ha rebut un argument que no �s un n�mero"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: l'argument %g est� fora de rang"
+
+#: builtin.c:245
+#, fuzzy, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: no es pot netejar: la canonada `%s' s'ha obert per a lectura, no per "
+"a escriptura"
+
+#: builtin.c:248
+#, fuzzy, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: no es pot netejar: el fitxer `%s' s'ha obert per a lectura, no per a "
+"escriptura"
+
+#: builtin.c:259
+#, fuzzy, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr ""
+"fflush: no es pot netejar: el fitxer `%s' s'ha obert per a lectura, no per a "
+"escriptura"
+
+#: builtin.c:264
+#, fuzzy, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: no es pot netejar: la canonada de doble via `%s' t� un final "
+"d'escriptura tancat"
+
+#: builtin.c:270
+#, fuzzy, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: `%s' no �s un fitxer obert, canonada o co-proc�s"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "�ndex: el primer argument rebut no �s una cadena"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "�ndex: el segon argument rebut no �s una cadena"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: s'ha rebut un argument no num�ric"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: s'ha rebut un argument de matriu"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "`length(array)' �s una extensi� de gawk"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: s'ha rebut un argument que no �s una cadena"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: s'ha rebut un argument no num�ric"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: s'ha rebut l'argument negatiu %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "fatal: s'ha d'usar `count$' a tots els format o a cap"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "l'amplada de camp s'ignorar� per a l'especificador `%%'"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "la precisi� s'ignorar� per a l'especificador `%%'"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "l'amplada de camp i la precisi� s'ignoraran per a l'especificador `%%'"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fatal: no es permeten `$' en els formats awk"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fatal: el recompte d'arguments amb `$' ha de ser > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"fatal: el recompte d'arguments %ld �s major que el nombre total d'arguments "
+"proporcionats"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fatal: no es permet `$' despr�s d'un punt en el format"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+"fatal: no es proporciona `$' per a l'ample o precisi� del camp de posici�"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "`l' manca de significat en els formats awk; ser� ignorat"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fatal: `l' no est� perm�s en els formats POSIX de awk"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "`L' manca de significat en els formats awk; ser� ignorat"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fatal: `L' no est� perm�s en els formats POSIX de awk"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "`h' manca de significat en els formats awk; ser� ignorat"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fatal: `h' no est� perm�s en els formats POSIX de awk"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: el valor %g �s massa gran per al format `%%c'"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: el valor %g no �s un car�cter ampli v�lid"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: el valor %g est� fora de rang per al format `%%%c'"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: el valor %g est� fora de rang per al format `%%%c'"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"s'ignorar� el car�cter especificador de format `%c': no s'ha convertit cap "
+"argument"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "fatal: no hi ha prou arguments per a satisfer el format d'una cadena"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ desbordament per a aquest"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: l'especificador de format no cont� lletra de control"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "s'han proporcionat masses arguments per a la cadena de format"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: sense arguments"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: sense arguments"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"printf: s'han intentat escriure a un final d'escriptura tancat a una "
+"canonada de doble via"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: s'ha rebut un argument no num�ric"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: cridat amb l'argument negatiu %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: la longitud %g no �s >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: la longitud %g no �s >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: la longitud sobre un nombre no enter %g ser� truncada"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+"substr: la llargada %g �s massa gran per a la indexaci� de cadenes de "
+"car�cters, es truncar� a %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: l'�ndex d'inici %g no �s v�lid, usant 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: l'�ndex d'inici no enter %g ser� truncat"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: la cadena font �s de longitud zero"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: l'�ndex d'inici %g sobrepassa l'acabament de la cadena"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: la longitud %g a l'�ndex d'inici %g excedeix la longitud del primer "
+"argument (%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime: el valor de format a PROCINFO[\"strftime\"] t� tipus num�ric"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: s'ha rebut un segon argument no num�ric"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr ""
+"strftime: el segon argument �s m�s petit que 0 o massa gran per a time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: ssegon argument fora de rang per a time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: el primer argument rebut no �s una cadena"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: s'ha rebut una cadena de format buida"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: s'ha rebut un argument que no �s una cadena"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: almenys un dels valors est� forra del rang predeterminat"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "la funci� 'system' no es permet fora del mode entorn de proves"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: s'ha rebut un argument que no �s una cadena"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"print: s'ha intentat escriure a un final d'escriptura tancat a una canonada "
+"de doble via"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "refer�ncia a una variable sense inicialitzar `$%d'"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: s'ha rebut un argument que no �s una cadena"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: s'ha rebut un argument que no �s una cadena"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: el primer argument rebut no �s num�ric"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: el segon argument rebut no �s num�ric"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: s'ha rebut un argument que no �s num�ric"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: s'ha rebut un argument que no �s num�ric"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: s'ha rebut un argument que no �s num�ric"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: el tercer argument no �s una matriu"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: el tercer argument `%.*s' es tractar� com a 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: es pot cridar indirectament amb dos arguments"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "la crida indirecta a %s requereix almenys dos arguments"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: el primer argument rebut no �s num�ric"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: el segon argument rebut no �s num�ric"
+
+#: builtin.c:3404
+#, fuzzy, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): els valors negatius donaran resultats estranys"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): els valors fraccionaris sernn truncats"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"lshift(%f, %f): un valor de despla�ament massa gran donar� resultats estranys"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: el primer argument rebut no �s num�ric"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: el segon argument rebut no �s num�ric"
+
+#: builtin.c:3443
+#, fuzzy, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): els valors negatius donaran resultats estranys"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): els valors fraccionaris seran truncats"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"rshift(%f, %f): un valor de despla�ament massa gran donar� resultats estranys"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: cridat amb menys de dos arguments"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "exp: l'argument %d no �s num�ric"
+
+#: builtin.c:3483
+#, fuzzy, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: l'argument %d amb valor negatiu %g donar� resultats estranys"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: cridat amb menys de dos arguments"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: l'argument %d no �s num�ric"
+
+#: builtin.c:3515
+#, fuzzy, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: l'argument %d amb valor negatiu %g donar� resultats estranys"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xort: cridat amb menys de dos arguments"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: l'argument %d no �s num�ric"
+
+#: builtin.c:3547
+#, fuzzy, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: l'argument %d del valor negatiu %g donar� resultats estranys"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: s'ha rebut un argument que no �s num�ric"
+
+#: builtin.c:3577
+#, fuzzy, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): el valor negatiu donar� resultats estranys"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): el valor fraccionari ser� truncat"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: `%s' no �s una categoria local v�lida"
+
+#: builtin.c:3988 mpfr.c:1203
+#, fuzzy
+msgid "intdiv: third argument is not an array"
+msgstr "match: el tercer argument no �s una matriu"
+
+#: builtin.c:3996 mpfr.c:1211
+#, fuzzy
+msgid "intdiv: received non-numeric first argument"
+msgstr "and: el primer argument rebut no �s num�ric"
+
+#: builtin.c:3998 mpfr.c:1213
+#, fuzzy
+msgid "intdiv: received non-numeric second argument"
+msgstr "lshift: el segon argument rebut no �s num�ric"
+
+#: builtin.c:4007 mpfr.c:1252
+#, fuzzy
+msgid "intdiv: division by zero attempted"
+msgstr "s'ha intentat una divisi� per zero"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: el segon argument no �s una matriu"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+
+#: builtin.c:4101
+#, fuzzy, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "opci�: par�metre no v�lid - \"%s\""
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr ""
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Escriviu proposici�(ns) g(awk). Termineu amb la instrucci� \"end\"\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "n�mero inv�lid de marc: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: opci� no v�lida - \"%s\""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\": ja s'ha utilitzat."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": ordre no permesa."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+"No es pot usar l'ordre `commands' per a ordres de punt d'interrupci�/"
+"inspecci�"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "no s'ha establert encara cap punt d'interrupci�/verificaci�"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "n�mero de punt d'interrupci�/inspecci� no v�lid"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Escriviu les ordres per a quan s'assoleix %s %d, una per l�nia.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Termineu amb l'ordre \"end\"\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "`end' �s v�lid sols a les ordres `commands' o `eval'"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "`silent' �s v�lid sols a l'ordre `commands'"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "tra�: opci� no v�lida - \"%s\""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condici�: n�mero de punt d'interrupci�/inspecci� no v�lid"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "l'argument no �s una cadena de car�cters"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "opci�: par�metre no v�lid - \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "no existeix aquesta funci� - \"%s\""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: opci� no v�lida - \"%s\""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "especificaci� no v�lida de rang: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "valor no num�ric per al n�mero de camp"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "s'ha trobat un valor no num�ric, s'esperava un valor num�ric"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "valor enter no zero"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - imprimeix la tra�a de tot els N marcs interiors (exteriors "
+"si N < 0)."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[fitxer:]N|funci�] - estableix el punt d'interrupci� a la ubicaci� "
+"especificada."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+"clear [[fitxer:]N|funci�] - suprimeix els punts  establerts pr�viament."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [num] - inicia una llista d'ordres a executar quan s'arribi a un "
+"punt d'interrupci�/inspecci�."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition num [expr] - estableix o neteja una condici� de punt d'interrupci� "
+"o d'inspecci�."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [RECOMPTE] - continua el programa que s'est� depurant."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+"delete [punts d'interrupci�] [rang] - esborra els punts d'interrupci� "
+"especificats."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+"disable [punts d'interrupci�] [rang] - deshabilita els punts d'interrupci� "
+"especificats."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+"display [var] - imprimeix el valor de la variable cada cop que el programa "
+"s'atura"
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - mou N marcs cap a baix a la pila."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+"dump [filename] - aboca les instruccions a un fitxer o a la sortida "
+"est�ndard."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [punts d'interrupci�] [rang] - habilita els punts "
+"d'interrupci� especificats."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - finalitza una llista de ordres o declaracions awk."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval stmt|[p1, p2, ...] - avalua la(es) declaraci�(ns) awk."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (igual que quit) surt del depurador."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr ""
+"finish - executa fins que hi hagi un retorn del marc de pila seleccionat."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - selecciona i imprimeix el  marc de pila amb n�mero N."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr "help [ordre] - imprimeix una llista d'ordres o una explica de l'ordre."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+"ignore N RECOMPTE - estableix ignore-count del punt d'interrupci� n�mero N "
+"fins RECOMPTE."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[fitxer:]n�mero-de-l�nia|funci�|rang] - fes una llista la(es) "
+"l�nia(es) especificada(es)."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+"next [RECOMPTE] - avan�a el programa pas per pas, tot procedint a trav�s de "
+"les crides de subrutines."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [RECOMPTE] - avan�a una instrucci�, per� procedeix a trav�s de crides "
+"de subrutines."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr ""
+"option [nom[=valor]] - estableix o mostra la(es) opci�(ns) del depurador."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [var] - imprimeix el valor de la variable o matriu."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf format, [arg], ... - sortida amb format."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - surt del depurador."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+"return [valor] - fes que el marc seleccionat de pila retorni a l'element que "
+"l'ha cridat."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - inicia o reinicia el programa que s'est� executant."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save filename - desa les ordres de la sessi� a un fitxer."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set var = valor - assigna un valor a una variable escalar."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - susp�n els missatges habituals quan s'autra a un punt d'interrupci�/"
+"inspecci�."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source file - executa una ordre des d'un fitxer."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [RECOMPTE] - avan�a pas per pas pel programa fins que arribi a una "
+"l�nia diferent de la font."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [RECOMPTE] - avan�a exactament una instrucci�."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr ""
+"tbreak [[fitxer:]N|funci�] - estableix un punt temporari d'interrupci�."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - imprimeix la instrucci� abans d'executar-la."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+"undisplay [N] - remou la(es) variable(s) de la llista autom�tica  "
+"visualitzaci�."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[fitxer:]N|funci�] - executa fins que el programa arribi a una l�nia "
+"diferent a la l�nia N dins del marc actual."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - remou la(es) variable(s) de la llista d'inspecci�."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - mou-te N marcs cap a dalt de la pila."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch var - estableix un punt d'inspecci� per a una variable."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"on [N] - (igual que la tra�a inversa) imprimeix la tra�a de tots els N marcs "
+"interiors (exteriors si N < 0)."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "no es pot llegir l'ordre (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "no es pot llegir l'ordre (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "car�cter no v�lida en la instucci�"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "ordre desconeguda - \"%.*s\", prova l'ajuda"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "car�cter no v�lid"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "ordre no definida: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+"estableix o mostra el n�mero de l�nies a mantenir al fitxer d'hist�ria."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "estableix o mostra la mida de la finestra de llista d'ordres."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "estableix o mostra el fitxer de sortida gawk."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "estableix o mostra l'indicador del depurador."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+"estableix(anul�la) o mostra el desament de la hist�ria d'ordres (valor=on|"
+"off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "estableix(anul�la) o mostra el desament d'opcions (valor=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr ""
+"estableix(anul�la) o mostra el seguiment d'instruccions (valor=on|off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "el programa no s'est� executant."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "no es pot llegir el fitxer font `%s' (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "el fitxer font `%s' est� buit\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "no hi ha un fitxer font."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "no es pot trobar el fitxer font `%s' (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+"ADVERTIMENT: el fitxer font `%s' s'ha modificat des de la compilaci� del "
+"programa.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "l�nia n�mero %d fora de rang; `%s' t� %d l�nies"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr ""
+"final de fitxer no esperat quan s'estava llegint el fitxer `%s', l�nia %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr ""
+"el fitxer font `%s' s'ha modificat des de l'inici de l'execuci� del programa"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Fitxer font actual: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Nombre de l�nies: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Fitxer font (l�nies): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Ubicaci� habilitada per n�mero disp\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tn�mero de accessos = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tignora el(s) pr�xim(s) %ld acc�s(sos)\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tcondici� d'aturada: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tordres:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Marc actual: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Cridat per marc: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Cridador de marc: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Cap a main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Sense arguments.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "No hi ha locals.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Totes les variables definides:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Totes les funcions definides:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Mostra autom�ticament les variables:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Inspecciona les variables:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "no hi ha el s�mbol `%s' al context actual\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "`%s' no �s una matriu\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = camp sense inicialitzar\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "la matriu `%s' est� buida\n"
+
+#: debug.c:1132 debug.c:1184
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%s\"] no est� a la matriu `%s'\n"
+
+#: debug.c:1188
+#, fuzzy, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "`%s[\"%s\"]' no �s una matriu\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "`%s' no �s una variable escalar"
+
+#: debug.c:1272 debug.c:5133
+#, fuzzy, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "s'ha intentat usar la matriu `%s[\"%s\"]' en un context escalar"
+
+#: debug.c:1295 debug.c:5144
+#, fuzzy, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "s'ha intentat usar la dada escalar `%s[\"%s\"]' com a una matriu"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "`%s' �s una funci�"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "el punt d'inspecci� %d �s incondicional\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "No hi ha un element de visualitzaci� numerat %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "No hi ha un element d'inspecci� numerat %ld"
+
+#: debug.c:1543
+#, fuzzy, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%s\"] no est� a la matriu `%s'\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "s'ha intentat usar una dada escalar com a una matriu"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+"El punt d'inspecci� %d s'ha esborrat perqu� el par�metre est� fora d'abast.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "La vista %d s'ha suprimit perqu� el par�metre est� fora de l'abast.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr "al fitxer `%s', l�nia %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " a `%s':%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\ten "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Segueixen m�s marcs de pila ...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "n�mero no v�lid de rang"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: el punt d'interrupci� %d (habilitat, ignora els %ld accessos "
+"seg�ents), tamb� s'ha establert a %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr ""
+"Nota: el punt d'interrupci� %d (habilitat), tamb� s'ha establert a %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: el punt d'interrupci� %d (deshabilitat, ignora els %ld accessos "
+"seg�ents), tamb� s'ha establert a %s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr ""
+"Nota: el punt d'interrupci� %d (deshabilitat), tamb� s'ha establert a %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Punt d'interrupci�  %d establert al fitxer `%s', l�nia %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "No es pot establir el punt d'interrupci� al fitxer `%s'\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "el n�mero de l�nia %d al fitxer `%s' est� fora de rang"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "No es pot trobar la regla!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "No es pot establir el punt d'interrupci� a `%s':%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "No est pot establir el punt d'interrupci� a la funci� `%s'\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr ""
+"el punt d'interrupci� %d establert al fitxer `%s', l�nia %d �s "
+"incondicional\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Punt interrupci� suprimit %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "No hi ha punt(s) d'interrupci� a l'entrada a la funci� `%s'\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "No hi ha un punt d'interrupci� al fitxer `%s', l�nia #%d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "n�mero no v�lid de punt d'interrupci�"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Suprimir tots els punts d'interrupci� (s o n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "s"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr ""
+"S'ignoraran el(s) %ld creuament(s) seg�ent(s) del punt d'interrupci� %d.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr ""
+"S'aturar� la pr�xima vegada que s'assoleixi el punt d'interrupci� %d.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "Sols es poden depurar programes que tenen l'opci� `-f'.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "No s'ha pogut reiniciar el depurador."
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "El programa ja est� corrent. S'ha de reiniciar des del principi (s/n)?"
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "No s'ha reiniciat el programa\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "error: no es pot reiniciar, l'operaci� no est� permesa\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "error (%s): no es pot reiniciar, s'ignoraran la resta de les ordres\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "S'est� iniciant el programa: \n"
+
+#: debug.c:2977
+#, fuzzy, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "El programa ha tingut la sortida %s amb el valor de sortida: %d\n"
+
+#: debug.c:2978
+#, fuzzy, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "El programa ha tingut la sortida %s amb el valor de sortida: %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "El programa s'est� executant. Voleu sortir tot i aix� (s/n)? "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "No s'ha detingut a cap punt d'interrupci�; s'ignorar� l'argument.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "n�mero no v�lid de punt d'interrupci� %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "S'ignoraran els pr�xims %ld creuaments de punt d'interrupci� %d.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "'finish' no t� significat al marc m�s extern main()\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Executa fins retornar de "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "'return' no t� significat al marc m�s extern main()\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "No es pot trobar la ubicaci� especificada a la funci� `%s'\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "l�nia %d no v�lida de font al fitxer `%s'"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "No es pot trobar la ubicaci� especificada %d al fitxer `%s'\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "l'element no est� a la matriu\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "variable sense tipus\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "S'est� aturant a %s ...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "'finish' no t� significat amb salt no local '%s'\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "'until' no t� significat amb salt no local '%s'\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t------[Intro] per continuar o q [Intro] per sortir------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%s\"] no est� a la matriu `%s'"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "s'est� enviant la sortida a la sortida est�ndard\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "n�mero no v�lid"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "`%s' no est� perm�s al context actual; s'ignorar� la declaraci�"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "`return' no est� perm�s al context actual; s'ignorar� la declaraci�"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "No hi ha un s�mbol `%s' al context actual"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "tipus de node %d desconegut"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "opcode %d desconegut"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "l'opcode %s no �s un operador o una paraula clau"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "desbordament del cau temporal en genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Pila de crida a les funcions:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "`IGNORECASE' �s una extensi� de gawk"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "`BINMODE' �s una extensi� de gawk"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "El valor BINMODE `%s' no �s v�lid, es tractar� com 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "`%sFMT' especificaci� err�nia `%s'"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "desactivant `--lint' degut a una assignaci� a `LINT'"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "refer�ncia a un argument sense inicialitzar `%s'"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "refer�ncia a una variable sense inicialitzar `%s'"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "s'ha intentat una refer�ncia de camp a partir d'un valor no num�ric"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "s'ha intentat entrar una refer�ncia a partir d'una cadena nul�la"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "s'ha intentat accedir al camp %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "refer�ncia a una variable sense inicialitzar `$%ld'"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "s'ha cridat a la funci� `%s' amb m�s arguments dels declarats"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: tipus no esperat `%s'"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "s'ha intentat una divisi� per zero en `/='"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "s'ha intentat una divisi� per zero en `%%='"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "les extensions no estan permeses en mode de proves"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load s�n extensions gawk"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: s'ha rebut lib_name nul"
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: no es pot obrir la llibreria `%s' (%s)\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: biblioteca `%s': no defineix `plugin_is_GPL_compatible' (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: biblioteca `%s': no es pot cridar a la funci� `%s' (%s)\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr ""
+"load_ext: la biblioteca `%s' amb rutina d'inicialitzaci� `%s' ha fallat\n"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: nom absent de funci�"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr "make_builtin: no es pot usar el nom intern `%s' com a nom de funci�"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr "make_builtin: no es pot usar el nom intern `%s' com a nom de funci�"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: no es pot redefinir la funci� `%s'"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: la funci� `%s' ja est� definida"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: nom de la funci� `%s' definida pr�viament"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: recompte negatiu d'arguments per a la funci� `%s'"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+"funci� `%s': argument #%d: s'ha intentat usar una dada escalar com a una "
+"matriu"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr ""
+"funci� `%s': argument #%d: s'ha intentat usar una matriu com a un escalar"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "no est� suportada la c�rrega din�mica de la biblioteca"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: no s'ha pogut llegir l'enlla� simb�lic `%s'"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stata: arguments dolents"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init: no s'ha pogut crear la variable %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "fts no est� suportat en aquest sistema"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: no s'ha pogut crear la matriu"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: no s'ha pogut establir l'element"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: no s'ha pogut establir l'element"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: no s'ha pogut establir l'element"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: no s'ha pogut crear la matriu"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: no s'ha pogut establir l'element"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: cridat amb un nombre incorrecte d'arguments, s'esperaven 3"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: el segon argument �s dolent"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: el segon argument �s dolent"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: el tercer par�meter es dolent"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: no s'ha pogut aplanar la matriu\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: s'ignorar� l'indicador FTS_NOSTAT furtiu. T'he enxampat!"
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() ha fallat\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: no s'ha pogut obtenir el segon argument"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: no s'ha pogut obtenir el segon argument"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: no s'ha pogut obtenir el tercer argument"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch no est� implementat en aquest sistema\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: no s'ha pogut afegir la variable FNM_NOMATCH"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: no s'ha pogut establir l'element de matriu %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: no s'ha pogut instal�lar la matriu FNM"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO no �s una matriu!"
+
+#: extension/inplace.c:131
+#, fuzzy
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace_begin: l'edici� in situ ja est� activa"
+
+#: extension/inplace.c:134
+#, fuzzy, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace_begin: s'esperaven 2 arguments per� s'ha cridat amb %d"
+
+#: extension/inplace.c:137
+#, fuzzy
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace_begin: no es pot obtenir el primer argument com nom de fitxer cadena "
+"de car�cters"
+
+#: extension/inplace.c:145
+#, fuzzy, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace_begin: s'est� deshabilitant l'edici� in situ per al nom de fitxer no "
+"v�lid `%s'"
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "implace_begin: No es pot obrir `%s' (%s)"
+
+#: extension/inplace.c:159
+#, fuzzy, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace_begin: `%s' no �s un fitxer regular"
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace_begin: mkstemp(`%s') ha fallat (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace_begin: ha fallat chmod (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace_begin: dup(stdout) ha fallat(%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_begin: dup2(%d, stdout) ha fallat (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace begin: close(%d) ha fallat (%s)"
+
+#: extension/inplace.c:211
+#, fuzzy, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace_begin: s'esperaven 2 arguments per� s'ha cridat amb %d"
+
+#: extension/inplace.c:214
+#, fuzzy
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace_end: no es pot obtenir el primer argument com un nom de fitxer "
+"cadena de car�cters"
+
+#: extension/inplace.c:221
+#, fuzzy
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace_end: no est� activa l'edici� in situ"
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_end: dup2(%d, stdout) ha fallat (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace_end: close(%d) ha fallat (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace_end: fsetpos(stdout) ha fallat (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace_end: link(`%s', `%s') ha fallat (%s)"
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace_end: rename(`%s', `%s') ha fallat (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: s'ha cridat amb argument(s) no apropiat(s)"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: s'ha cridat amb argument(s) no apropiat(s)"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir ha fallat: %s"
+
+#: extension/readfile.c:131
+#, fuzzy
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: s'ha cridat amb cap argument"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: no s'ha pogut inicialitzar la variable REVOUT"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: l'argument 0 no �s una cadena de car�cters\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: l'argument 1 no �s una matriu\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: no s'ha pogut aplanar la matriu\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: no s'ha pogut alliberar la matriu aplanada\n"
+
+#: extension/rwarray.c:255
+#, fuzzy, c-format
+msgid "array value has unknown type %d"
+msgstr "tipus de node %d desconegut"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: l'argument 0 no �s una cadena de car�cters\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: l'argument 1 no �s una matriu\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array ha fallat\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element ha fallat\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: no est� suportat en aquesta plataforma"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: no hi ha un argument num�ric requerit"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: l'argument �s negatiu"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: no est� suportat en aquesta plataforma"
+
+#: field.c:284
+msgid "input record too large"
+msgstr ""
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF s'inicialitza sobre un valor negatiu"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: el quart argument �s una extensi� gawk"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: el quart argument no �s una matriu"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: el segon argument no �s una matriu"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split: no es pot usar una submatriu de segon argument per a quart argument"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: no es pot usar una submatriu de segon argument per a quart argument"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: no est pot usar una submatriu de quart argument per a segon argument"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: la cadena nul�la per al tercer argument �s una extensi� de gawk"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: el quart argument no �s una matriu"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: el tercer argument no �s una matriu"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: el segon argument no �s una matriu"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: no es pot usar la mateixa matriu per a segon i quart argument"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: no es pot usar una submatriu de segon argument per a quart argument"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: no es pot usar una submatriu de quart argument per a segon argument"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "`FIELDWIDTHS' �s una extensi� de gawk"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr ""
+
+#: field.c:1239
+#, fuzzy, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "valor FIELDWIDTHS no v�lid, a prop de `%s'"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "la cadena nul�la per a `FS' �s una extensi� de gawk"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "l'antic awk no suporta expressions regulars com a valor de `FS'"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "`FPAT' �s una extensi� gawk"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: s'ha rebut retval nul"
+
+#: gawkapi.c:178 gawkapi.c:189
+#, fuzzy
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: s'ha rebut retval nul"
+
+#: gawkapi.c:183 gawkapi.c:194
+#, fuzzy
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: s'ha rebut retval nul"
+
+#: gawkapi.c:198
+#, fuzzy, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: s'ha rebut retval nul"
+
+#: gawkapi.c:385
+#, fuzzy
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "load_ext: s'ha rebut lib_name nul"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: s'ha rebut un node nul"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: s'ha rebut un valor nul"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: s'ha rebut una matriu nul�la"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: s'ha rebut un sub�ndex nul"
+
+#: gawkapi.c:1217
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array: no s'ha pogut convertir l'�ndex %d\n"
+
+#: gawkapi.c:1222
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array: no s'ha pogut convertir el valor %d\n"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:1365
+#, fuzzy
+msgid "cannot find end of BEGINFILE rule"
+msgstr "�next� no es pot cridar des d'una regla BEGIN"
+
+#: gawkapi.c:1419
+#, fuzzy, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "no es pot obrir el fitxer font `%s' per a lectura (%s)"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "l'argument `%s' de l�nia d'ordres �s un directori: s'ignorar�"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "no es pot obrir el fitxer `%s' per a lectura (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "la finalitzaci� del descriptor fd %d (`%s') ha fallat  (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "no est permeten redireccions en mode de proves"
+
+#: io.c:787
+#, fuzzy, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "l'expressi� en la redirecci� `%s' solt t� un valor num�ric"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "l'expressi� per a la redirecci� `%s' t� un valor de cadena nul�la"
+
+#: io.c:796
+#, fuzzy, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"el fitxer `%s' per a la redirecci� `%s' pot ser resultat d'una expressi� "
+"l�gica"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "mescla innecess�ria de `>' i `>>' per al fitxer `%.*s'"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr ""
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "no es pot obrir la canonada `%s' per a l'eixida (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "no es pot obrir la canonada `%s' per a l'entrada (%s)"
+
+#: io.c:950
+#, fuzzy, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr "gettimeofday: no est� suportat en aquesta plataforma"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr ""
+"no es pot obrir una canonada bidireccional `%s' per a les entrades/eixides "
+"(%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "no es pot redirigir des de `%s' (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "no es pot redirigir cap a `%s' (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"s'ha arribat al l�mit del sistema per a fitxers oberts: es comen�ar� a "
+"multiplexar els descriptors de fitxer"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "la finalitzaci� de `%s' ha fallat  (%s)"
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "masses canonades o fitxers d'entrada oberts"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: el segon argument hauria de ser `to' o `from'"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: `%.*s' no �s un fitxer obert, canonada o co-proc�s"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "finalitzaci� d'una redirecci� que no s'ha obert"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: la redirecci� `%s' no s'obre amb `|&', s'ignora el segon argument"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "estat de fallada (%d) en la finalitzaci� de la canonada `%s' (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "estat de falla (%d) en la finalitzaci� del fitxer `%s' (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "no s'aporta la finalitzaci� expl�cita del socket `%s'"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "no s'aporta la finalitzaci� expl�cita del co-proc�s `%s'"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "no s'aporta la finalitzaci� expl�cita de la canonada `%s'"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "no s'aporta la finalitzaci� expl�cita del fitxer `%s'"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr ""
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr ""
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "error en escriure a la sortida est�ndard (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "error en escriure a la sortida d'error est�ndard (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "la neteja de la canonada de `%sx' ha fallat (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "la neteja de la canonada per al co-proc�s de `%sx' ha fallat (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "la neteja del fitxer `%s' ha fallat (%s)."
+
+#: io.c:1610
+#, fuzzy, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "port local %s no v�lid a `/inet'"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "port local %s no v�lid a `/inet'"
+
+#: io.c:1636
+#, fuzzy, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "amfitri� remot i informaci� de port (%s, %s) no v�lids"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "amfitri� remot i informaci� de port (%s, %s) no v�lids"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "les comunicacions TCP/IP no estan suportades"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "no es pot obrir `%s', mode `%s'"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "ha fallat el tancament del pty mestre (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr ""
+"ha fallat la finalitzaci� de la sortida est�ndard en els processos fills (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"ha fallat el trasllat del pty esclau cap a l'eixida est�ndard dels processos "
+"fills (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr ""
+"ha fallat la finalitzaci� de l'entrada est�ndard en els processos fills (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"ha fallat el trasllat del pty esclau cap a l'entrada est�ndard dels "
+"processos fills (dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "ha fallat el tancament del pty esclau (%s)"
+
+#: io.c:2265
+#, fuzzy
+msgid "could not create child process or open pty"
+msgstr "no es pot crear el proc�s fill per a `%s' (fork: %s)"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+"ha fallat la redirecci� cap a l'eixida est�ndard dels processos fills (dup: "
+"%s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+"ha fallat la redirecci� cap a l'entrada est�ndard dels processos fills (dup: "
+"%s)"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr "ha fallat la restauraci� de l'eixida est�ndard en el proc�s pare\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr "ha fallat la restauraci� de l'entrada est�ndard en el proc�s pare\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "ha fallat la finalitzaci� de la canonada (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "`|&' no est� suportat"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "no es pot obrir la canonada `%s' (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "no es pot crear el proc�s fill per a `%s' (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+"getline: s'ha intentat llegir d'un final de lectura tancada d'una canonada "
+"de doble via"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: s'ha rebut un punter nul"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"l'analitzador d'entrades `%s' est� en conflicte amb analitzador d'entrades `"
+"%s' instal�lat pr�viament"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "l'analitzador d'entrada `%s' no ha pogut obrir `%s'"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: s'ha rebut un punter nul"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"l'embolcall de sortida `%s' est� en conflicte amb l'embolcall de sortida `"
+"%s' instal�lat pr�viament"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "l'embolcall de sortida `%s' no ha pogut obrir `%s'"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: s'ha rebut un punter nul"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"el processsador de dues vies `%s' est� en conflicte amb el processador de "
+"dues vies `%s' instal�lat pr�viament"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "el processador de dues vies `%s' no ha pogut obrir `%s'"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "el fitxer de dades `%s' est� buit"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "no s'ha pogut assignar m�s mem�ria d'entrada"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "el valor multicar�cter de `RS' �s una extensi� de gawk"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "la comunicaci� IPv6 no est� suportada"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+"la variable d'entorn `POSIXLY_CORRECT' est� establerta: usant `--posix'"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "`--posix' solapa a `--traditional'"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "`--posix' i `--traditional' solapen a `--non-decimal-data'"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "`--posix' anul�la a `--characters-as-bytes'"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "executar %s com a setuid root pot ser un problema de seguretat"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "no es pot establir el mode binari en l'entrada est�ndard (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "no es pot establir el mode en l'eixida est�ndard (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "no es pot establir el mode en l'eixida d'error est�ndard (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "no hi ha cap text per al programa!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr "�s: %s [opcions d'estil POSIX o GNU] -f fitx_prog [--] fitxer ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr "�s: %s [opcions d'estil POSIX o GNU] [--] %cprograma%c fitxer ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "Opcions POSIX:\t\tOpcions llargues GNU: (est�ndard)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f fitx_prog\t\t--file=fitx_prog\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs (fs=sep_camp)\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=valor\t\t--assign=var=valor\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Opcions curtes:\t\tOpcions llargues GNU: (extensions)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[file]\t\t--dump-variables[=file]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[file]\t\t--debug[=file]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'program-text'\t--source='program-text'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E file\t\t\t--exec=file\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i includefile\t\t--include=fitxer a incloure\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l library\t\t--load=biblioteca\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[file]\t\t--pretty-print[=file]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[file]\t\t--profile[=file]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+#, fuzzy
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Per informar d'errors, vegeu el node `Bugs' a `gawk.info', que\n"
+"�s la secci� `Informant sobre problemes i errors' a la versi� impresa.\n"
+"Informeu dels errors de traducci� a <ca@li.org>\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk �s un llenguatge d'an�lisi i processament de patrons.\n"
+"De forma predeterminada llegeix l'entrada est�ndard i escriu a la sortida "
+"est�ndar.\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Exemples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' fitxer\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Aquest programa �s programari lliure; pot redistribuir-se i/o modificar-se\n"
+"sota els termes de la Llic�ncia P�blica General de GNU tal i como est�\n"
+"publicada per la Free Software Foundation; ja siga en la versi� 3 de la\n"
+"Llic�ncia, o (a la vostra elecci�) qualsevol versi� posterior.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Aquest programa es distribueix amb l'esperan�a de que ser� d'utilitat,\n"
+"per� SENSE CAP GARANTIA; fins i tot sense la garantia impl�cita de\n"
+"COMERCIABILITAT o IDONE�TAT PER A UN PROP�SIT EN PARTICULAR.\n"
+"Per a m�s detalls consulteu la Llic�ncia P�blica General de GNU.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Junt amb aquest programa haur�eu d'haver rebut una c�pia de la Llic�ncia\n"
+"P�blica General de GNU; si no �s aix�, vegeu http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft no permet inicialitzar FS a un tabulador en la versi� POSIX de awk"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: `%s' l'argument per a `-v' no est� en forma `var=valor'\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "`%s' no �s nom legal de variable"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "`%s' no �s un valor de variable, s'esperava fitxer `%s=%s'"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr ""
+"no es pot usar el nom de la funci� integrada `%s' com a nom de variable"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "no es pot usar el nom de la funci� interna `%s' com nom de variable"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "excepci� de coma flotant"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "error fatal: error intern"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "error fatal: error intern: segfault"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "error fatal: error intern: sobreeiximent de pila"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "no s'ha pre-obert el descriptor fd per a %d"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "no es pot pre-obrir /dev/null per al descriptor fd %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "s'ignonar� l'argument buit de `-e/--source'"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "`--posix' solapa a `--traditional'"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M ignorat: no s'ha compilat el suport MPFR/GMP"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: no es reconeix l'opci� `-W %s', ser� ignorada\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: l'opci� requereix un argument -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "Valor PREC `%.*s' no �s v�lid"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "Valor RNDMODE `%.*s' no �s v�lid"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: s'ha rebut un argument que no �s num�ric"
+
+#: mpfr.c:816
+#, fuzzy
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): el valor negatiu donar� resultats estranys"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg): el valor fraccionari ser� truncat"
+
+#: mpfr.c:832
+#, fuzzy, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "cmpl(%Zd): els valors negatius donaran resultats estranys"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: s'ha rebut un argument no num�ric #%d"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: l'argument #%d t� valor no v�lid %Rg, s'usar� 0"
+
+#: mpfr.c:871
+#, fuzzy
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: l'argument #%d amb valor negatiu %Rg donar� resultats estranys"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: l'argument #%d amb valor fraccional %Rg ser� truncat"
+
+#: mpfr.c:892
+#, fuzzy, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: l'argument #%d amb valor negatiu %Zd donar� resultats estranys"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "l�nia cmd.:"
+
+#: node.c:481
+#, fuzzy
+msgid "could not make typed regex"
+msgstr "expressi� regular sense finalitzar"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "l'antic awk no d�na suport a la seq�encia d'escapada `\\%c'"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX no permet seq��ncies d'escapada `\\x'"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "no hi ha d�gits hexadecimals en la seq��ncia d'escapada `\\x'"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"probablement no s'han interpretat els car�cters hex escape \\x%.*s of %d de "
+"la manera que esper�veu"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "la seq��ncia d'escapada `\\%c' �s tractada com a una simple `%c'"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"S'han detectat dades multibyte no v�lides. Pot haver-hi una discordan�a "
+"entre les vostres dades i la vostra configuraci� local"
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr ""
+"%s %s `%s': no s'han pogut obtenir els indicadors fd: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s `%s': no s'ha pogut establir close-on-exec: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "no es pot obrir `%s' per a escriptura: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "enviant el perfil a l'eixida d'error est�ndard"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s regla(es)\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regla(es)\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "error intern: %s amb vname nul"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "error intern: funci� integrada amb fname nul"
+
+#: profile.c:1302
+#, fuzzy, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"\t# Extensions carregades (-l i/o @load)\n"
+"\n"
+
+#: profile.c:1333
+#, fuzzy, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\t# Extensions carregades (-l i/o @load)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# perfil gawk, creat %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funcions, llistades alfab�ticament\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: tipus desconegut de redireccionament %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "la seq��ncia d'escapada `\\%c' �s tractada com a una simple `%c'"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "el component regexp `%.*s' probablement hauria de ser `[%.*s]'"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "[ sense aparellar"
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "classe no v�lida de car�cters"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "la sintaxi de la classe de car�cters �s [[:espai:]], no [:espai:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "seq��ncia d'escapada \\ sense finalitzar"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "contingut no v�lid de \\{\\}"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "l'expressi� regular �s massa gran"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "( sense aparellar"
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "no s'ha especificat una sintaxi"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ") sense aparellar"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: l'opci� `%s' �s ambigua<b: possibilitats:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: l'opci� `--%s' no admet cap argument\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: l'opci� `%c%s' no admet cap argument\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: l'opci� `--%s' requereix un argument\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: no es reconeix l'opci� `--%s'\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: no es reconeix l'opci� `%c%s'\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opci� no v�lida -- '%c'\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: l'opci� requereix un argument -- '%c'\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: l'opci� `-W %s' �s ambigua\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: l'opci� `-W %s' no admet cap argument\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: l'opci� `-W %s' requereix un argument\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "�xit"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "No hi ha concordan�a"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expressi� regular no v�lida"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Car�cter de comparaci� no v�lid"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nom de classe de car�cters no v�lid"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barra invertida extra al final"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Refer�ncia cap endarrere no v�lida"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [., o [= sense concordan�a"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( o \\( desemparellats"
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ desemparellat"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Contingut no v�lid de \\{\\}"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Final de rang no v�lid"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Mem�ria exhaurida"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Expressi� regular precedent no v�lida"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "F� prematura de l'expressi� regular"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "L'expressi� regular �s massa gran"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") o \\) desemparellats"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "No hi ha una expressi� regular pr�via"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "funci� %s�: no es pot usar la funci� `%s' com a nom de par�metre"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "no es pot mostrar el context principal"
+
+#, fuzzy
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "%s a \"%s\" ha fallat (%s)"
+
+#, fuzzy
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "%s: tancament erroni (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "barra invertida al final de la cadena"
+
+#, fuzzy
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "s'ha intentat usar la matriu `%s[\"%s\"]' en un context escalar"
+
+#, fuzzy
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "s'ha intentat usar la dada escalar `%s[\"%s\"]' com a una matriu"
+
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: el tercer argument %g es tractar� com a 1"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "`extension' �s una extensi� gawk"
+
+#~ msgid "extension: received NULL lib_name"
+#~ msgstr "extension: s'ha rebut lib_name nul"
+
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "extension: no es pot obrir la biblioteca `%s' (%s)"
+
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr ""
+#~ "extension: biblioteca `%s': no defineix `plugin_is_GPL_compatible' (%s)"
+
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr "extension: biblioteca `%s': no es pot cridar a la funci� `%s' (%s)"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension: nom absent de funci�"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: car�cter `%c' il�legal al nom de funci� `%s'"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: no es pot redefinir la funci� `%s'"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: la funci� `%s' ja est� definida"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension: nom de la funci� `%s' definida pr�viament"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr "extension: no es pot usar el nom intern `%s' com a nom de funci�"
+
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr "chdir: cridat amb un nombre incorrecte d'arguments, s'esperava 1"
+
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "stat: cridat amb un nombre incorrecte d'arguments"
+
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "statvfs: cridat amb un nombre incorrecte d'arguments"
+
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "fnmatch: s'ha cridat amb menys de tres arguments"
+
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "fnmatch: s'ha cridat amb m�s de tres arguments"
+
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "fork: s'ha cridat amb massa arguments"
+
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "waitpid: s'ha cridat amb massa arguments"
+
+#~ msgid "wait: called with no arguments"
+#~ msgstr "wait: s'ha cridat amb cap argument"
+
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "wait: s'ha cridat amb massa arguments"
+
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "ord: s'ha cridat amb massa arguments"
+
+#~ msgid "ord: called with no arguments"
+#~ msgstr "ord: s'ha cridat amb cap argument"
+
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "chr: s'ha cridat amb massa arguments"
+
+#~ msgid "chr: called with no arguments"
+#~ msgstr "chr: s'ha cridat amb cap argument"
+
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "readfile: s'ha cridat amb massa arguments"
+
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "writea: s'ha cridat amb massa arguments"
+
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "reada: s'ha cridat amb massa arguments"
+
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "gettimeofday: s'estan ignorant els arguments"
+
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sleep: s'ha cridat amb massa arguments"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "valor desconegut per a l'especificaci� de camp: %d\n"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr "la funci� `%s' est� definida per agafar no m�s de %d argument(s)"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "funci� `%s': falta l'argument  #%d"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "`getline var' no �s v�lid a dins de la regla `%s'"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr ""
+#~ "no s'aporta cap protocol (conegut) en el nom del fitxer especial `%s'"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "el nom del fitxer especial `%s' est� incomplet"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "s'ha de subministrar un nom de sistema remot a `/inet'"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "s'ha de subministrar un port remot a `/inet'"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# %s bloc(s)\n"
+#~ "\n"
+
+#~ msgid "reference to uninitialized element `%s[\"%s\"]'"
+#~ msgstr "refer�ncia a un element sense valor inicial `%s[\"%s\"]'"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "el subscript de la matriu `%s' �s una cadena nul�la"
+
+#~ msgid "delete: illegal use of variable `%s' as array"
+#~ msgstr "delete: �s il�legal de la variable `%s' com a una matriu"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: buit (nul)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: buit (zero)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: mida_taula = %d, mida_matriu = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: ref_matriu a %s\n"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: el primer argument rebut no �s num�ric"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): els valors negatius donaran resultats estranys"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): els valors fraccionaris seran truncats"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: el primer argument rebut no �s num�ric"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): els valors fraccionaris seran truncats"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "Operaci� No Suportada"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opci� il�legal -- %c\n"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "l'opci�n `-m[fr]' �s irrellevant en gawk"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "�s de l'opci� -m: `-m[fr] nnn'"
+
+#~ msgid "\t-m[fr] val\n"
+#~ msgstr "\t-m[fr] valor\n"
+
+#~ msgid "\t-W compat\t\t--compat\n"
+#~ msgstr "\t-W compat\t\t--compat\n"
+
+#~ msgid "\t-W copyleft\t\t--copyleft\n"
+#~ msgstr "\t-W copyleft\t\t--copyleft\n"
+
+#~ msgid "\t-W usage\t\t--usage\n"
+#~ msgstr "\t-W usage\t\t--usage\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "To report bugs, see node `Bugs' in `gawk.info', which is\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Per a informar d'errors, consulteu el node �Bugs' en �gawk.info', que "
+#~ "est�\n"
+
+#~ msgid "invalid syntax in name `%s' for variable assignment"
+#~ msgstr "sintaxi no v�lida en el nom �%s' per a l'asignaci� de la variable"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "no es poden trobar els grups: %s"
+
+#~ msgid "internal error: Node_var_array with null vname"
+#~ msgstr "error intern: Node_var_array amb vname nul"
+
+#~ msgid "or used in other expression context"
+#~ msgstr "o s'ha emprat en un altre context de l'expressi�"
+
+#~ msgid "illegal type (%s) in tree_eval"
+#~ msgstr "tipus il�legal (%s) en tree_eval"
+
+#~ msgid "`%s' is a function, assignment is not allowed"
+#~ msgstr "�%s� �s una funci�, l'assignaci� no �s permesa"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr ""
+#~ "no es permet l'assignaci� per a obtindre un resultat d'una funci� interna"
+
+#~ msgid ""
+#~ "\t# BEGIN block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# Bloc(s) INICI\n"
+#~ "\n"
+
+#~ msgid "unexpected type %s in prec_level"
+#~ msgstr "tipus %s inesperat en prec_level"
+
+#~ msgid "BEGIN blocks must have an action part"
+#~ msgstr "Els blocs INICI han de tindre una part d'acci�"
+
+#~ msgid "statement may have no effect"
+#~ msgstr "la declaraci� podria no tindre efecte"
+
+#~ msgid "non-redirected `getline' undefined inside BEGIN or END action"
+#~ msgstr "�getline� no redirigit sense definir dintre de l'acci� BEGIN o END"
+
+#~ msgid "call of `length' without parentheses is deprecated by POSIX"
+#~ msgstr "la crida de �length� sense par�ntesis est� desaprovada per POSIX"
+
+#~ msgid "fptr %x not in tokentab\n"
+#~ msgstr "fptr %x no est� en la taula de refer�ncia\n"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "�%s� �s una extensi� de Bell Labs"
+
+#~ msgid "gsub third parameter is not a changeable object"
+#~ msgstr "gsub: el tercer argument no �s un objecte intercanviable"
+
+#~ msgid "unfinished repeat count"
+#~ msgstr "repetici� del comptador sense finalitzar"
+
+#~ msgid "malformed repeat count"
+#~ msgstr "repetici� del comptador malformada"
+
+#~ msgid "out of memory"
+#~ msgstr "mem�ria esgotada"
+
+#~ msgid "field %d in FIELDWIDTHS, must be > 0"
+#~ msgstr "el camp %d en FIELDWIDTHS, hauria de ser > 0"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %d to %d during loop execution"
+#~ msgstr ""
+#~ "bucle for: la matriu �%s� ha canviat de mida de %d a %d durant l'execuci� "
+#~ "del bucle"
+
+#~ msgid "`break' outside a loop is not portable"
+#~ msgstr "�break� a fora d'un bucle no �s portable"
+
+#~ msgid "`continue' outside a loop is not portable"
+#~ msgstr "�continue� fora d'un bucle no �s portable"
+
+#~ msgid "`next' cannot be called from an END rule"
+#~ msgstr "�next� no es pot cridar des d'una regla FINAL"
+
+#~ msgid "`nextfile' cannot be called from a BEGIN rule"
+#~ msgstr "�nextfile� no es pot cridar des d'una regla BEGIN"
+
+#~ msgid "`nextfile' cannot be called from an END rule"
+#~ msgstr "�nextfile� no es pot cridar des d'una regla FINAL"
+
+#~ msgid "statement has no effect"
+#~ msgstr "la sent�ncia no t� efecte"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "assignaci� usada en un context condicional"
+
+#~ msgid ""
+#~ "concatenation: side effects in one expression have changed the length of "
+#~ "another!"
+#~ msgstr ""
+#~ "concatenaci�: els efectes colaterals en una expressi� han canviat la "
+#~ "longitud d'una altra!"
+
+#~ msgid "function %s called\n"
+#~ msgstr "s'ha cridat a la funci� %s\n"
+
+#~ msgid "\t# -- main --\n"
+#~ msgstr "\t# -- principal --\n"
+
+#~ msgid "invalid tree type %s in redirect()"
+#~ msgstr "tipus d'arbre %s no v�lid dintre de redirect()"
+
+#~ msgid "can't open two way socket `%s' for input/output (%s)"
+#~ msgstr ""
+#~ "no es pot obrir un socket bidireccional �%s� per a les entrades/eixides "
+#~ "(%s)"
+
+#~ msgid "/inet/raw client not ready yet, sorry"
+#~ msgstr "el client /inet/raw encara no est� a punt, ho sento"
+
+#~ msgid "only root may use `/inet/raw'."
+#~ msgstr "sols el root pot usar �/inet/raw�."
+
+#~ msgid "/inet/raw server not ready yet, sorry"
+#~ msgstr "el servidor /inet/raw encara no est� a punt, ho sento"
+
+#~ msgid "file `%s' is a directory"
+#~ msgstr "el fitxer �%s� �s un directori"
+
+#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'"
+#~ msgstr "useu �PROCINFO[\"%s\"]� en comptes de �%s�"
+
+#~ msgid "use `PROCINFO[...]' instead of `/dev/user'"
+#~ msgstr "useu �PROCINFO[...]� en comptes de �/dev/user�"
+
+#~ msgid "error reading input file `%s': %s"
+#~ msgstr "error en llegir el fitxer d'entrada �%s�: %s"
+
+#~ msgid "can't convert string to float"
+#~ msgstr "no es pot convertir la cadena a coma flotant"
diff --git a/gawk-5.0.1/po/da.po b/gawk-5.0.1/po/da.po
new file mode 100644
index 00000000000..50f5dbdbc7b
--- /dev/null
+++ b/gawk-5.0.1/po/da.po
@@ -0,0 +1,4078 @@
+# Danish translation of gawk
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Martin Sj�gren <md9ms@mdstud.chalmers.se>, 2001-2002.
+# Christer Andersson <klamm@comhem.se>, 2007.
+# Keld Simonsen <keld@keldix.com>, 2002,2011,2012,2015.
+# Review by Torben Gr�n Helligs� <torben-dansk@thel.dk>, 2011.
+# Review by Ask Hjorth Larsen <asklarsen@gmail.com>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.1.1d\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2015-05-18 12:37+0200\n"
+"Last-Translator: Keld Simonsen <keld@keldix.com>\n"
+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "fra %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "fors�g p� at bruge en skalar som array"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "fors�g p� at bruge skalarparameteren '%s' som et array"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "fors�g p� at bruge skalar '%s' som et array"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "fors�g p� at bruge array '%s' i skalarsammenh�ng"
+
+#: array.c:574
+#, fuzzy, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: indeks '%s' findes ikke i array '%s'"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "fors�g p� at bruge skalaren '%s[\"%.*s\"]' som array"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: f�rste argument er ikke et array"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: andet argument er ikke et array"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: andet argument er ikke et array"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: f�rste argument er ikke et array"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: f�rste argument er ikke et array"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: kan ikke bruge et underarray af f�rste argument for andet argument"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: kan ikke bruge et underarray af f�rste argument for andet argument"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: kan ikke bruge et underarray af andet argument for f�rste argument"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: kan ikke bruge et underarray af andet argument for f�rste argument"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "'%s' er ugyldigt som funktionsnavn"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "funktionen for sorteringssammenligning '%s' er ikke defineret"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s-blokke skal have en handlingsdel"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "hver regel skal have et m�nster eller en handlingsdel"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr ""
+"gamle versioner af awk underst�tter ikke flere 'BEGIN'- eller 'END'-regler"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "'%s' er en indbygget funktion, den kan ikke omdefineres"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "regexp-konstanten '//' ser ud som en C++-kommentar, men er det ikke"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "regexp-konstanten '/%s/' ser ud som en C-kommentar, men er det ikke"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "dublet case-v�rdier i switch-krop %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "dublet 'default' opdaget i switch-krop"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "'break' uden for en l�kke eller switch er ikke tilladt"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "'continue' uden for en l�kke er ikke tilladt"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "'next' brugt i %s-handling"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "'nextfile' brugt i %s-handling"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "'return' brugt uden for funktion"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"alenest�ende 'print' i BEGIN eller END-regel skulle muligvis v�re 'print "
+"\"\"'"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr ""
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr ""
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "'delete array' er en ikke-portabel udvidelse fra tawk"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "flertrins dobbeltrettede datakanaler fungerer ikke"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "regul�rt udtryk i h�jreleddet af en tildeling"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "regul�rt udtryk p� venstre side af en '~'- eller '!~'-operator"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr ""
+"gamle versioner af awk underst�tter ikke n�gleordet 'in' undtagen efter 'for'"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "regul�rt udtryk i h�jreleddet af en sammenligning"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "ikke-omdirigeret 'getline' ugyldig inden i '%s'-regel"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "ikke-omdirigeret 'getline' udefineret inden i END-handling"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "gamle versioner af awk underst�tter ikke flerdimensionale array"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "kald af 'length' uden parenteser er ikke portabelt"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "indirekte funktionskald er en gawk-udvidelse"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr "kan ikke bruge specialvariabel '%s' til indirekte funktionskald"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "fors�g p� at bruge ikke-funktionen '%s' som et funktionskald"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "ugyldigt indeksudtryk"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "advarsel: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fatal: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "uventet nylinjetegn eller strengafslutning"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "kan ikke �bne kildefilen '%s' for l�sning (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "kan ikke �bne delt bibliotek '%s' for l�sning (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "ukendt �rsag"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr ""
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "allerede inkluderet kildefil '%s'"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "allerede indl�st delt bibliotek '%s'"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include er en gawk-udvidelse"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "tomt filnavn efter @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load er en gawk-udvidelse"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "tomt filnavn efter @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "tom programtekst p� kommandolinjen"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "kan ikke l�se kildefilen '%s' (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "kildefilen '%s' er tom"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr ""
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "kildefilen slutter ikke med en ny linje"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "uafsluttet regul�rt udtryk slutter med '\\' i slutningen af filen"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "%s: %d: regex-�ndringstegn '/.../%c' fra tawk virker ikke i gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "regex-�ndringstegn '/.../%c' fra tawk virker ikke i gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "uafsluttet regul�rt udtryk"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "uafsluttet regul�rt udtryk i slutningen af filen"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "brug af '\\ #...' for linjeforts�ttelse er ikke portabelt"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "sidste tegn p� linjen er ikke en omvendt skr�streg"
+
+#: awkgram.y:3858 awkgram.y:3860
+#, fuzzy
+msgid "multidimensional arrays are a gawk extension"
+msgstr "indirekte funktionskald er en gawk-udvidelse"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX tillader ikke operatoren '**='"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "gamle versioner af awk underst�tter ikke operatoren '**='"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX tillader ikke operatoren '**'"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "gamle versioner af awk underst�tter ikke operatoren '**'"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "operatoren '^=' underst�ttes ikke i gamle versioner af awk"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "operatoren '^' underst�ttes ikke i gamle versioner af awk"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "uafsluttet streng"
+
+#: awkgram.y:4048 main.c:1220
+#, fuzzy
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX tillader ikke '\\x'-kontrolsekvenser"
+
+#: awkgram.y:4050 node.c:453
+#, fuzzy
+msgid "backslash string continuation is not portable"
+msgstr "brug af '\\ #...' for linjeforts�ttelse er ikke portabelt"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "ugyldigt tegn '%c' i udtryk"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "'%s' er en gawk-udvidelse"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX tillader ikke '%s'"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "'%s' underst�ttes ikke i gamle versioner af awk"
+
+#: awkgram.y:4494
+#, fuzzy
+msgid "`goto' considered harmful!"
+msgstr "'goto' anses for skadelig!\n"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d er et ugyldigt antal argumenter for %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s: bogstavelig streng som sidste argument til erstatning har ingen effekt"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "%s: tredje argument er ikke et �ndringsbart objekt"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: tredje argument er en gawk-udvidelse"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: andet argument er en gawk-udvidelse"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"brug af dcgettext(_\"...\") er forkert: fjern det indledende "
+"understregningstegn"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"brug af dcgettext(_\"...\") er forkert: fjern det indledende "
+"understregningstegn"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: regexp-konstant som andet argument er ikke tilladt"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "funktionen '%s': parameteren '%s' overskygger en global variabel"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "kunne ikke �bne '%s' for skrivning (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "sender variabelliste til standard fejl"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: lukning mislykkedes (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() kaldt to gange!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "der var skyggede variable."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "funktionsnavnet '%s' er allerede defineret"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "funktionen '%s': kan ikke bruge funktionsnavn som parameternavn"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"funktionen '%s': kan ikke bruge specialvariabel '%s' som en "
+"funktionsparameter"
+
+#: awkgram.y:5092
+#, fuzzy, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "funktionen '%s': parameteren '%s' overskygger en global variabel"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "funktionen '%s': parameter %d, '%s', er samme som parameter %d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "funktionen '%s' kaldt, men aldrig defineret"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "funktionen '%s' defineret, men aldrig kaldt direkte"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "konstant regul�rt udtryk for parameter %d giver en boolesk v�rdi"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"funktionen '%s' kaldt med blanktegn mellem navnet og '(',\n"
+"eller brugt som en variabel eller et array"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "fors�gte at dividere med nul"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "fors�gte at dividere med nul i '%%'"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+
+#: awkgram.y:5805
+#, fuzzy, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "%d er et ugyldigt antal argumenter for %s"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "@include er en gawk-udvidelse"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s til '%s' mislykkedes (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "standard ud"
+
+#: builtin.c:148
+#, fuzzy
+msgid "standard error"
+msgstr "standard ud"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: fik et ikke-numerisk argument"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: argumentet %g er uden for det tilladte omr�de"
+
+#: builtin.c:245
+#, fuzzy, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: kan ikke rense: datakanalen '%s' �bnet for l�sning, ikke skrivning"
+
+#: builtin.c:248
+#, fuzzy, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr "fflush: kan ikke rense: filen '%s' �bnet for l�sning, ikke skrivning"
+
+#: builtin.c:259
+#, fuzzy, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: kan ikke rense: filen '%s' �bnet for l�sning, ikke skrivning"
+
+#: builtin.c:264
+#, fuzzy, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: kan ikke rense: datakanalen '%s' �bnet for l�sning, ikke skrivning"
+
+#: builtin.c:270
+#, fuzzy, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: '%s' er ikke en �ben fil, datakanal eller ko-proces"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "indeks: f�rste argument er ikke en streng"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "indeks: andet argument er ikke en streng"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: fik et ikke-numerisk argument"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: fik et array-argument"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "'length(array)' er en gawk-udvidelse"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: fik et argument som ikke er en streng"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: fik et ikke-numerisk argument"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: fik et negativt argument %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "fatal: skal bruge 'count$' p� alle formater eller ikke nogen"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "feltbredde ignoreret for '%%'-angivelse"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "pr�cision ignoreret for '%%'-angivelse"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "feltbredde og pr�cision ignoreret for '%%'-angivelse"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fatal: '$' tillades ikke i awk-formater"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fatal: argumentantallet med '$' skal v�re > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr "fatal: argumentantallet %ld er st�rre end antal givne argumenter"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fatal: '$' tillades ikke efter et punktum i formatet"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+"fatal: intet '$' angivet for bredde eller pr�cision af positionsangivet felt"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "'l' er meningsl�st i awk-formater, ignoreret"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fatal: 'l' tillades ikke i POSIX awk-formater"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "'L' er meningsl�st i awk-formater, ignoreret"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fatal: 'L' tillades ikke i POSIX awk-formater"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "'h' er meningsl�st i awk-formater, ignoreret"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fatal: 'h' tillades ikke i POSIX awk-formater"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: v�rdi %g er for stor for %%c-format"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: v�rdi %g er ikke et gyldigt bredt tegn"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: v�rdi %g er uden for omr�de for '%%%c'-format"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: v�rdi %g er uden for omr�de for '%%%c'-format"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"ignorerer ukendt formatspecificeringstegn '%c': intet argument konverteret"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "fatal: for f� argumenter til formatstrengen"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ sluttede her"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: formatspecifikation har intet kommandobogstav"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "for mange argumenter til formatstrengen"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: ingen argumenter"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: ingen argumenter"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: fik ikke-numerisk argument"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: kaldt med negativt argument %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: l�ngden %g er ikke >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: l�ngden %g er ikke >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: l�ngden %g som ikke er et heltal vil blive trunkeret"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr "substr: l�ngden %g for stor til strengindeksering, trunkerer til %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: startindeks %g er ugyldigt, bruger 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: startindeks %g som ikke er et heltal vil blive trunkeret"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: kildestrengen er tom"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: startindeks %g er forbi slutningen p� strengen"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: l�ngden %g ved startindeks %g overskrider l�ngden af f�rste argument "
+"(%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime: formatv�rdi i PROCINFO[\"strftime\"] har numerisk type"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: fik et ikke-numerisk andet argument"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: andet argument mindre end 0 eller for stort til time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: andet argument uden for omr�de for time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: fik et f�rste argument som ikke er en streng"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: fik en tom formatstreng"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: fik et argument som ikke er en streng"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: mindst �n af v�rdierne er udenfor standardomr�det"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "'system'-funktion ikke tilladt i sandkasse-tilstand"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: fik et argument som ikke er en streng"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "reference til ikke-initieret felt '$%d'"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: fik et argument som ikke er en streng"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: fik et argument som ikke er en streng"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: fik et ikke-numerisk f�rste argument"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: fik et ikke-numerisk andet argument"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: fik et ikke-numerisk argument"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: fik et ikke-numerisk argument"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: fik et ikke-numerisk argument"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: tredje argument er ikke et array"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: tredje argument '%.*s' behandlet som 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: kan kun kaldes indirekte med to argumenter"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "indirekte kald til %s kr�ver mindst to argumenter"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: fik et ikke-numerisk f�rste argument"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: fik et ikke-numerisk andet argument"
+
+#: builtin.c:3404
+#, fuzzy, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): negative v�rdier vil give m�rkelige resultater"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): kommatalsv�rdier vil blive trunkeret"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): for stor skiftev�rdi vil give m�rkelige resultater"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: fik et ikke-numerisk f�rste argument"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: fik et ikke-numerisk andet argument"
+
+#: builtin.c:3443
+#, fuzzy, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): negative v�rdier vil give m�rkelige resultater"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): kommatalsv�rdier vil blive trunkeret"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): for stor skiftev�rdi vil give m�rkelige resultater"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: kaldt med mindre end to argumenter"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: argumentet %d er ikke-numerisk"
+
+#: builtin.c:3483
+#, fuzzy, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: argument %d negativ v�rdi %g vil give m�rkelige resultater"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: kaldt med mindre end to argumenter"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: argumentet %d er ikke-numerisk"
+
+#: builtin.c:3515
+#, fuzzy, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: argument %d negativ v�rdi %g vil give m�rkelige resultater"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "zor: kaldt med mindre end to argumenter"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: argumentet %d er ikke-numerisk"
+
+#: builtin.c:3547
+#, fuzzy, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: argument %d negativ v�rdi %g vil give m�rkelige resultater"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: fik et ikke-numerisk argument"
+
+#: builtin.c:3577
+#, fuzzy, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): negativ v�rdi vil give m�rkelige resultater"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): kommatalsv�rdi vil blive trunkeret"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: '%s' er ikke en gyldig lokalitetskategori"
+
+#: builtin.c:3988 mpfr.c:1203
+#, fuzzy
+msgid "intdiv: third argument is not an array"
+msgstr "match: tredje argument er ikke et array"
+
+#: builtin.c:3996 mpfr.c:1211
+#, fuzzy
+msgid "intdiv: received non-numeric first argument"
+msgstr "and: fik et ikke-numerisk f�rste argument"
+
+#: builtin.c:3998 mpfr.c:1213
+#, fuzzy
+msgid "intdiv: received non-numeric second argument"
+msgstr "and: fik et ikke-numerisk andet argument"
+
+#: builtin.c:4007 mpfr.c:1252
+#, fuzzy
+msgid "intdiv: division by zero attempted"
+msgstr "fors�gte at dividere med nul"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: andet argument er ikke et array"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+
+#: builtin.c:4101
+#, fuzzy, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "flag: ugyldig parameter - \"%s\""
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr ""
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Indtast (g)awk s�tninger. Slut med kommandoen \"end\"\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "ugyldigt rammenummer: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: ugyldigt flag - '%s'"
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr ""
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr ""
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr ""
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr ""
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr ""
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr ""
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr ""
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr ""
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: ugyldigt flag - '%s'"
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr ""
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "argument er ikke en streng"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "flag: ugyldig parameter - \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "ingen s�dan funktion - \"%s\""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: ugyldigt flag - '%s'"
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "Ugyldig intervalangivelse: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "ikke-numerisk v�rdi for felt-nummer"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "ikke-numerisk v�rdi fundet, numerisk forventet"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "ikke-nul heltalsv�rdi"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr ""
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr ""
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr ""
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr ""
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr ""
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr ""
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr ""
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr ""
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr ""
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr ""
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr ""
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr ""
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr ""
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr ""
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr ""
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr ""
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr ""
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr ""
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr ""
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr ""
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr ""
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "fejl: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "kan ikke l�se kommando (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "kan ikke l�se kommando (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "Ugyldigt tegn i kommando"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr ""
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "Ugyldigt tegn"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "ikke-defineret kommando: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr ""
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr ""
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr ""
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr ""
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr ""
+
+#: debug.c:358
+msgid "program not running."
+msgstr ""
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "kan ikke l�se kildefil '%s' (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "kildefil '%s' er tom.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "ingen aktuel kildefil."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "kan ikke finde kildefil kaldet '%s' (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "linjenummer %d uden for omr�de; '%s' har %d linjer"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "uventet nylinjetegn ved l�sning af fil '%s', lije %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr ""
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Aktuel kildefil %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr ""
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr ""
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr ""
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr ""
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr ""
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr ""
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr ""
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr ""
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr ""
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr ""
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Ingen argumenter.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Ingen lokale.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Alle definerede funktioner:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Vis variable automatisk:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Overv�g variable:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "'intet symbol '%s' i den aktuelle kontekst\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "'%s' er ikke et array\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = ikke-initieret felt\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "array '%s' er tomt\n"
+
+#: debug.c:1132 debug.c:1184
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%s\"] findes ikke i array '%s'\n"
+
+#: debug.c:1188
+#, fuzzy, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "`%s[\"%s\"]' er ikke et array\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "'%s' er ikke en skalar variabel"
+
+#: debug.c:1272 debug.c:5133
+#, fuzzy, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "fors�g p� at bruge array '%s[\"%s\"]' i skalarsammenh�ng"
+
+#: debug.c:1295 debug.c:5144
+#, fuzzy, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "fors�g p� at bruge skalaren '%s[\"%s\"]' som array"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "'%s' er en funktion"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr ""
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr ""
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr ""
+
+#: debug.c:1543
+#, fuzzy, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%s\"] ikke i array '%s'\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "fors�g p� at bruge en skalarv�rdi som array"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " i fil `%s', linje %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " ved '%s':%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\ti "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr ""
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "Ugyldigt rammenummer"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr ""
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr ""
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "linjenummer %d i fil %s er uden for det tilladte omr�de"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Kan ikke finde regel!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr ""
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Kan ikke s�tte stoppunkt i funktion '%s'\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr ""
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Slettet stoppunkt %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr ""
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Intet stoppunkt ved fil `%s', linje #%d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "Ugyldigt stoppunktsnummer"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Slet alle stoppunkter? (j eller n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "j"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr ""
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr ""
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Kunne ikke genstarte fejls�ger"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr ""
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Program ikke genstartet\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr ""
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr ""
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Starter program: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr ""
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr ""
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "Ugyldigt stoppunktsnummer %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "K�r til returnering fra "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr ""
+
+#: debug.c:3394
+#, fuzzy, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "allerede inkluderet kildefil '%s'"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr ""
+
+#: debug.c:3441
+#, fuzzy, c-format
+msgid "element not in array\n"
+msgstr "adump: argument er ikke et array"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "variabel uden type\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Stopper i %s ...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t------[Retur] for at forts�tte eller q [Retur] for at afslutte------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%s\"] findes ikke i array '%s'"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "sender uddata til stdout\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "ugyldigt nummer"
+
+#: debug.c:5520
+#, fuzzy, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "'exit' kan ikke kaldes i den aktuelle kontekst"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "'return�r' ikke tilladt i den aktuelle kontekst, s�tning ignoreret"
+
+#: debug.c:5743
+#, fuzzy, c-format
+msgid "No symbol `%s' in current context"
+msgstr "fors�g p� at bruge array '%s' i skalarsammenh�ng"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "ukendt nodetype %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "ukendt opkode %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "opkode %s er ikke en operator eller et n�gleord"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "bufferoverl�b i genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Funktionskaldsstak:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "'IGNORECASE' er en gawk-udvidelse"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "'BINMODE' er en gawk-udvidelse"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "BINMODE v�rdi '%s' er ugyldig, behandles som 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "forkert '%sFMT'-specifikation '%s'"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "deaktiverer '--lint' p� grund af en tildeling til 'LINT'"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "reference til ikke-initieret argument '%s'"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "reference til ikke-initieret variabel '%s'"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "fors�g p� at referere til et felt fra ikke-numerisk v�rdi"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "fors�g p� at referere til et felt fra tom streng"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "fors�g p� at f� adgang til felt %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "reference til ikke-initieret felt '$%ld'"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "funktionen '%s' kaldt med flere argumenter end deklareret"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: uventet type `%s'"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "fors�gte at dividere med nul i '/='"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "fors�gte at dividere med nul i '%%='"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "udvidelser er ikke tilladt i sandkasse-tilstand"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load er gawk-udvidelser"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr ""
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: kan ikke �bne bibliotek '%s' (%s)\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"fatalt: extension: bibliotek '%s': definer ikke "
+"'plugin_is_GPL_compatible' (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr ""
+"fatalt: extension: bibliotek '%s': kan ikke kalde funktionen '%s' (%s)\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr ""
+"fatalt: extension: bibliotek '%s': kan ikke kalde funktionen '%s' (%s)\n"
+
+#: ext.c:92
+#, fuzzy
+msgid "make_builtin: missing function name"
+msgstr "extension: mangler funktionsnavn"
+
+#: ext.c:100 ext.c:111
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr "extension: kan ikke bruge gawk's indbyggede '%s' som funktionsnavn"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr "extension: kan ikke bruge gawk's indbyggede '%s' som funktionsnavn"
+
+#: ext.c:126
+#, fuzzy, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "extension: kan ikke omdefinere funktion '%s'"
+
+#: ext.c:130
+#, fuzzy, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "extension: funktionen '%s' er allerede defineret"
+
+#: ext.c:134
+#, fuzzy, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "extension: funktionsnavnet '%s' er defineret tidligere"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: negativt argumentantal for funktion '%s'"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+"funktion '%s': argument nummer %d: fors�g p� at bruge skalar som et array"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr ""
+"funktion '%s': argument nummer %d: fors�g p� at bruge array som en skalar"
+
+#: ext.c:232
+msgid "dynamic loading of libraries is not supported"
+msgstr ""
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr ""
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+#, fuzzy
+msgid "stat: bad parameters"
+msgstr "%s: er parameter\n"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr ""
+
+#: extension/filefuncs.c:606
+#, fuzzy
+msgid "fts is not supported on this system"
+msgstr "'%s' underst�ttes ikke i gamle versioner af awk"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr ""
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr ""
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:841
+#, fuzzy
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "sqrt: kaldt med negativt argument %g"
+
+#: extension/filefuncs.c:844
+#, fuzzy
+msgid "fts: bad first parameter"
+msgstr "%s: er parameter\n"
+
+#: extension/filefuncs.c:850
+#, fuzzy
+msgid "fts: bad second parameter"
+msgstr "%s: er parameter\n"
+
+#: extension/filefuncs.c:856
+#, fuzzy
+msgid "fts: bad third parameter"
+msgstr "%s: er parameter\n"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr ""
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr ""
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr ""
+
+#: extension/fnmatch.c:120
+#, fuzzy
+msgid "fnmatch: could not get first argument"
+msgstr "strftime: fik et f�rste argument som ikke er en streng"
+
+#: extension/fnmatch.c:125
+#, fuzzy
+msgid "fnmatch: could not get second argument"
+msgstr "indeks: andet argument er ikke en streng"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr ""
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr ""
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr ""
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr ""
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr ""
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr ""
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr ""
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr ""
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "atalt: extension: kan ikke �bne '%s' (%s)\n"
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr ""
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "%s: lukning mislykkedes (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "%s: lukning mislykkedes (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "%s: lukning mislykkedes (%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "%s: lukning mislykkedes (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "%s: lukning mislykkedes (%s)"
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr ""
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr ""
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "%s: lukning mislykkedes (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "%s: lukning mislykkedes (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "%s: lukning mislykkedes (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "datakanalsrensning af '%s' mislykkedes (%s)."
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "lukning af fd %d ('%s') mislykkedes (%s)"
+
+#: extension/ordchr.c:72
+#, fuzzy
+msgid "ord: called with inappropriate argument(s)"
+msgstr "sqrt: kaldt med negativt argument %g"
+
+#: extension/ordchr.c:99
+#, fuzzy
+msgid "chr: called with inappropriate argument(s)"
+msgstr "sqrt: kaldt med negativt argument %g"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr ""
+
+#: extension/readfile.c:131
+#, fuzzy
+msgid "readfile: called with wrong kind of argument"
+msgstr "sqrt: kaldt med negativt argument %g"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr ""
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, fuzzy, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "exp: argumentet %g er uden for det tilladte omr�de"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, fuzzy, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "split: fjerde argument er ikke et array"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr ""
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr ""
+
+#: extension/rwarray.c:255
+#, fuzzy, c-format
+msgid "array value has unknown type %d"
+msgstr "ukendt nodetype %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, fuzzy, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "exp: argumentet %g er uden for det tilladte omr�de"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, fuzzy, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "adump: argument er ikke et array"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr ""
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr ""
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr ""
+
+#: extension/time.c:162
+#, fuzzy
+msgid "sleep: missing required numeric argument"
+msgstr "exp: fik et ikke-numerisk argument"
+
+#: extension/time.c:168
+#, fuzzy
+msgid "sleep: argument is negative"
+msgstr "exp: argumentet %g er uden for det tilladte omr�de"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr ""
+
+#: field.c:284
+msgid "input record too large"
+msgstr ""
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF sat til en negativ v�rdi"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: fjerde argument er en gawk-udvidelse"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: fjerde argument er ikke et array"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: andet argument er ikke et array"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr "split: kan ikke bruge det samme array som andet og fjerde argument"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: kan ikke bruge et underarray af andet argument som fjerde argument"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: kan ikke bruge et underarray af fjerde argument som andet argument"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: tom streng som tredje argument er en gawk-udvidelse"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: fjerde argument er ikke et array"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: andet argument er ikke et array"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patmatch: tredje argument er ikke et array"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr "patsplit: kan ikke bruge det samme array som andet og fjerde argument"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: kan ikke bruge et underarray af andet argument som fjerde argument"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: kan ikke bruge et underarray af fjerde argument som andet argument"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "'FIELDWIDTHS' er en gawk-udvidelse"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr ""
+
+#: field.c:1239
+#, fuzzy, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "ugyldig FIELDWIDTHS v�rdi, n�r '%s"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "tom streng som 'FS' er en gawk-udvidelse"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "gamle versioner af awk underst�tter ikke regexp'er som v�rdi for 'FS'"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "'FPAT' er en gawk-udvidelse"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr ""
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr ""
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr ""
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr ""
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr ""
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr ""
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+
+#: gawkapi.c:1082
+#, fuzzy
+msgid "remove_element: received null array"
+msgstr "length: fik et array-argument"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr ""
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr ""
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr ""
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:1365
+#, fuzzy
+msgid "cannot find end of BEGINFILE rule"
+msgstr "'next' kan ikke kaldes fra en BEGIN-regel"
+
+#: gawkapi.c:1419
+#, fuzzy, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "kan ikke �bne kildefilen '%s' for l�sning (%s)"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "kommandolinjeargument '%s' er et katalog, oversprunget"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "kan ikke �bne filen '%s' for l�sning (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "lukning af fd %d ('%s') mislykkedes (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "omdirigering ikke tilladt i sandkasse-tilstand"
+
+#: io.c:787
+#, fuzzy, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "udtrykket i '%s'-omdirigering har kun numerisk v�rdi"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "udtrykket for '%s'-omdirigering har en tom streng som v�rdi"
+
+#: io.c:796
+#, fuzzy, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"filnavnet '%s' for '%s'-omdirigering kan v�re resultatet af et logisk udtryk"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "un�dig blanding af '>' og '>>' for filen '%.*s'"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr ""
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "kan ikke �bne datakanalen '%s' for udskrivning (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "kan ikke �bne datakanalen '%s' for indtastning (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "kan ikke �bne tovejsdatakanalen '%s' for ind-/uddata (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "kan ikke omdirigere fra '%s' (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "kan ikke omdirigere til '%s' (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"n�ede systembegr�nsningen for �bne filer: begynder at multiplekse "
+"fildeskriptorer"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "lukning af '%s' mislykkedes (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "for mange datakanaler eller inddatafiler �bne"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: andet argument skal v�re 'to' eller 'from'"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: '%.*s' er ikke en �ben fil, datakanal eller ko-proces"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "lukning af omdirigering som aldrig blev �bnet"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: omdirigeringen '%s' blev ikke �bnet med '|&', andet argument ignoreret"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "fejlstatus (%d) fra lukning af datakanalen '%s' (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "fejlstatus (%d) fra fillukning af '%s' (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "ingen eksplicit lukning af soklen '%s' angivet"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "ingen eksplicit lukning af ko-processen '%s' angivet"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "ingen eksplicit lukning af datakanalen '%s' angivet"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "ingen eksplicit lukning af filen '%s' angivet"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr ""
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr ""
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "fejl ved skrivning til standard ud (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "fejl ved skrivning til standard fejl (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "datakanalsrensning af '%s' mislykkedes (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "ko-procesrensning af datakanalen til '%s' mislykkedes (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "filrensning af '%s' mislykkedes (%s)."
+
+#: io.c:1610
+#, fuzzy, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "lokal port %s ugyldig i '/inet'"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "lokal port %s ugyldig i '/inet'"
+
+#: io.c:1636
+#, fuzzy, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "fjernv�rt og portinformation (%s, %s) ugyldige"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "fjernv�rt og portinformation (%s, %s) ugyldige"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "TCP/IP-kommunikation underst�ttes ikke"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "kunne ikke �bne '%s', tilstand '%s'"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "lukning af master-pty mislykkedes (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "lukning af standard ud i underproces mislykkedes (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"flytning af slave-pty til standard ud i underproces mislykkedes (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "lukning af standard ind i underproces mislykkedes (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"flytning af slave-pty til standard ind i underproces mislykkedes (dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "lukning af slave-pty mislykkedes (%s)"
+
+#: io.c:2265
+#, fuzzy
+msgid "could not create child process or open pty"
+msgstr "kan ikke oprette barneproces for '%s' (fork: %s)"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+"flytning af datakanal til standard ud i underproces mislykkedes (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+"flytning af datakanalen til standard ind i underproces mislykkedes (dup: %s)"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr "genskabelse af standard ud i for�lderprocessen mislykkedes\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr "genskabelse af standard ind i for�lderprocessen mislykkedes\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "lukning af datakanalen mislykkedes (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "'|&' underst�ttes ikke"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "kan ikke �bne datakanalen '%s' (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "kan ikke oprette barneproces for '%s' (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr ""
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr ""
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr ""
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "datafilen '%s' er tom"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "kunne ikke allokere mere hukommelse til inddata"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "'RS' som flertegnsv�rdi er en gawk-udvidelse"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "IPv6-kommunikation underst�ttes ikke"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr "milj�variablen 'POSIXLY_CORRECT' sat: aktiverer '--posix'"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "'--posix' tilsides�tter '--traditional'"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "'--posix'/'--traditional' tilsides�tter '--non-decimal-data'"
+
+#: main.c:358
+#, fuzzy
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "'--posix' tilsides�tter '--binary'"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "at k�re %s setuid root kan v�re et sikkerhedsproblem"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "kan ikke s�tte bin�r tilstand p� standard ind (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "kan ikke s�tte bin�r tilstand p� standard ud (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "kan ikke s�tte bin�r tilstand p� standard fejl (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "ingen programtekst overhovedet!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr "Brug: %s [flag i POSIX- eller GNU-stil] -f progfil [--] fil ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr "Brug: %s [flag i POSIX- eller GNU-stil] %cprogram%c fil ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "POSIX-flag:\t\tlange GNU-flag: (standard)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f progfil\t\t--file=progfil\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=v�rdi\t\t--assign=var=v�rdi\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "POSIX-flag:\t\tlange GNU-flag: (udvidelser)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[fil]\t\t--dump-variables[=fil]\n"
+
+#: main.c:597
+#, fuzzy
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-p[fil]\t\t--profile[=fil]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'programtekst'\t--source='programtekst'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E fil\t\t\t--exec=fil\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr ""
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr ""
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L [fatal]\t\t--lint[=fatal]\n"
+
+#: main.c:609
+#, fuzzy
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+#, fuzzy
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-p[fil]\t\t--profile[=fil]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[fil]\t\t--profile[=fil]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+#, fuzzy
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"For at rapportere fejl kan du se punktet 'Bugs' i 'gawk.info', som er\n"
+"sektionen 'Reporting Problems and Bugs' i den trykte version.\n"
+"\n"
+"Rapport�r kommentarer til overs�ttelsen til <dansk@dansk-gruppen.dk>.\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk er et sprog til m�nster-genkendelse og -behandling.\n"
+"Almindeligvis l�ser gawk fra standard ind og skriver til standard ud.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Eksempler:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' fil\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright � 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Dette program er frit programmel. Du kan distribuere det og/eller\n"
+"�ndre det under betingelserne i GNU General Public License, offentliggjort\n"
+"af Free Software Foundation, enten version 3 af licensen, eller (hvis du "
+"vil)\n"
+"enhver senere version.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Dette program distribueres i h�b om at det vil v�re nyttigt,\n"
+"men UDEN NOGEN SOM HELST GARANTI, ogs� uden underforst�et garanti\n"
+"om SALGBARHED eller EGNETHED FOR NOGET SPECIELT FORM�L. Se GNU\n"
+"General Public License for yderligere information.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Du b�r have f�et en kopi af GNU General Public License sammen\n"
+"med dette program. Hvis ikke, s� se http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft s�tter ikke FS til tab i POSIX-awk"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: '%s' argument til '-v' ikke p� formen 'var=v�rdi'\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "'%s' er ikke et gyldigt variabelnavn"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "'%s' er ikke et variabelnavn, leder efter fil '%s=%s'"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "kan ikke bruge gawk's indbyggede '%s' som variabelnavn"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "kan ikke bruge funktion '%s' som variabelnavn"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "flydendetalsundtagelse"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "fatal fejl: intern fejl"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "fatal fejl: intern fejl: segmentfejl"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "fatal fejl: intern fejl: stakoverl�b"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "ingen fd %d �bnet i forvejen"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "kunne ikke i forvejen �bne /dev/null for fd %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "tomt argument til '-e/--source' ignoreret"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "'--posix' tilsides�tter '--traditional'"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr ""
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: flaget '-W %s' ukendt, ignoreret\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: flaget kr�ver et argument -- %c\n"
+
+#: mpfr.c:551
+#, fuzzy, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "BINMODE v�rdi '%s' er ugyldig, behandles som 3"
+
+#: mpfr.c:610
+#, fuzzy, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "BINMODE v�rdi '%s' er ugyldig, behandles som 3"
+
+#: mpfr.c:707
+#, fuzzy, c-format
+msgid "%s: received non-numeric argument"
+msgstr "cos: fik et ikke-numerisk argument"
+
+#: mpfr.c:816
+#, fuzzy
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%lf): negative v�rdier vil give m�rkelige resultater"
+
+#: mpfr.c:821
+#, fuzzy
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%lf): kommatalsv�rdier vil blive trunkeret"
+
+#: mpfr.c:832
+#, fuzzy, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%lf): negative v�rdier vil give m�rkelige resultater"
+
+#: mpfr.c:850
+#, fuzzy, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "cos: fik et ikke-numerisk argument"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr ""
+
+#: mpfr.c:871
+#, fuzzy
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "and(%lf, %lf): negative v�rdier vil give m�rkelige resultater"
+
+#: mpfr.c:878
+#, fuzzy
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "and(%lf, %lf): kommatalsv�rdier vil blive trunkeret"
+
+#: mpfr.c:892
+#, fuzzy, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "and(%lf, %lf): negative v�rdier vil give m�rkelige resultater"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "kommandolinje:"
+
+#: node.c:481
+#, fuzzy
+msgid "could not make typed regex"
+msgstr "uafsluttet regul�rt udtryk"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "gamle versioner af awk underst�tter ikke '\\%c' undvigesekvens"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX tillader ikke '\\x'-kontrolsekvenser"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "ingen heksadecimale cifre i '\\x'-kontrolsekvenser"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"den heksadecimale sekvens \\x%.*s p� %d tegn nok ikke forst�et som du "
+"forventer det"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "kontrolsekvensen '\\%c' behandlet som kun '%c'"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Ugyldigt multibyte data fundet. M�ske er der uoverensstemmelse mellem  dine "
+"data og dit locale."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s '%s': kunne ikke f� fat p� fd flag: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s '%s': kunne ikke s�tte luk-ved-exec (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "kunne ikke �bne '%s' for skrivning: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "sender profilen til standard fejl"
+
+#: profile.c:271
+#, fuzzy, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regler\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regler\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "intern fejl: %s med null vname"
+
+#: profile.c:658
+#, fuzzy
+msgid "internal error: builtin with null fname"
+msgstr "intern fejl: %s med null vname"
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# profil til gawk oprettet %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funktioner, listede alfabetisk\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: uykendt omdirigeringstype %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "kontrolsekvensen '\\%c' behandlet som kun '%c'"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "regexp-komponent `%.*s' skulle nok v�re `[%.*s]'"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr ""
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "Ugyldig tegnklasse"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr ""
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr ""
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "ugyldigt indhold i \\{\\}"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "regul�rt udtryk for stort"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr ""
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "ingen syntaks angivet"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ""
+
+#: support/getopt.c:605 support/getopt.c:634
+#, fuzzy, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: flaget '%s' er flertydigt\n"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: flaget '--%s' tillader ikke noget argument\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: flaget '%c%s' tillader ikke noget argument\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: flaget '--%s' kr�ver et argument\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: ukendt flag '--%s'\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: ukendt flag '%c%s'\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ugyldigt flag - '%c'\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: flaget kr�ver et argument - '%c'\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: flaget '-W %s' er flertydigt\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: flaget '-W %s' tillader ikke noget argument\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: flaget '-W %s' kr�ver et argument\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Lykkedes"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Mislykkedes"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ugyldigt regul�rt udtryk"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ugyldigt sorteringstegn"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ugyldigt tegnklassenavn"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Efterf�lgende omvendt skr�streg"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Ugyldig bagudreference"
+
+#: support/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Ubalanceret [ eller [^"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Ubalanceret ( eller \\("
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Ubalanceret \\{"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ugyldigt indhold i \\{\\}"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ugyldig intervalslutning"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Hukommelsen opbrugt"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Ugyldigt foreg�ende regul�rt udtryk"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "For tidligt slut p� regul�rt udtryk"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Regul�rt udtryk for stort"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Ubalanceret ) eller \\)"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Intet foreg�ende regul�rt udtryk"
+
+#: symbol.c:688
+#, fuzzy, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "funktionen '%s': kan ikke bruge funktionsnavn som parameternavn"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr ""
+
+#, fuzzy
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "%s til '%s' mislykkedes (%s)"
+
+#, fuzzy
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "%s: lukning mislykkedes (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "omvendt skr�streg i slutningen af strengen"
+
+#, fuzzy
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "fors�g p� at bruge array '%s[\"%s\"]' i skalarsammenh�ng"
+
+#, fuzzy
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "fors�g p� at bruge skalaren '%s[\"%s\"]' som array"
+
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: tredje argument %g behandlet som 1"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "'extension' er en gawk-udvidelse"
+
+#, fuzzy
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "atalt: extension: kan ikke �bne '%s' (%s)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr ""
+#~ "fatalt: extension: bibliotek '%s': definer ikke "
+#~ "'plugin_is_GPL_compatible' (%s)\n"
+
+#, fuzzy
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr ""
+#~ "fatalt: extension: bibliotek '%s': kan ikke kalde funktionen '%s' (%s)\n"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension: mangler funktionsnavn"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: ugyldigt tegn '%c' i funktionsnavn '%s'"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: kan ikke omdefinere funktion '%s'"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: funktionen '%s' er allerede defineret"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension: funktionsnavnet '%s' er defineret tidligere"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr "extension: kan ikke bruge gawk's indbyggede '%s' som funktionsnavn"
+
+#, fuzzy
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "wait: called with no arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "ord: called with no arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "chr: called with no arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#, fuzzy
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "mktime: fik et argument som ikke er en streng"
+
+#, fuzzy
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sqrt: kaldt med negativt argument %g"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "ukendt v�rdi for felt-spec: %d\n"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr "funktionen '%s' defineret til at tage ikke mere end %d argumenter"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "funktion '%s': mangler argument nummer %d"
+
+#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'"
+#~ msgstr "reference til ikke-initieret element '%s[\"%.*s\"]'"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "indeks i array '%s' er en tom streng"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: tom (null)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: tom (nul)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: tabelst�rrelse = %d, arrayst�rrelse = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: arrayreference til %s\n"
+
+#~ msgid "`nextfile' is a gawk extension"
+#~ msgstr "'nextfile' er en gawk-udvidelse"
+
+#~ msgid "`delete array' is a gawk extension"
+#~ msgstr "'delete array' er en gawk-udvidelse"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "'getline var' ugyldig inden i '%s' regel"
+
+#~ msgid "`getline' invalid inside `%s' rule"
+#~ msgstr "'getline' ugyldig inden i '%s' regel"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "brug af ikke-array som array"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "'%s' er en Bell Labs-udvidelse"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: fik et ikke-numerisk f�rste argument"
+
+#~ msgid "or: received non-numeric second argument"
+#~ msgstr "or: fik et ikke-numerisk andet argument"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): negative v�rdier vil give m�rkelige resultater"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): kommatalsv�rdier vil blive trunkeret"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: fik et ikke-numerisk f�rste argument"
+
+#~ msgid "xor: received non-numeric second argument"
+#~ msgstr "xor: fik et ikke-numerisk andet argument"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): kommatalsv�rdier vil blive trunkeret"
+
+#~ msgid "can't use function name `%s' as variable or array"
+#~ msgstr "kan ikke bruge funktionsnavnet '%s' som variabel eller array"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "tildeling brugt i sammenligningsammenh�ng"
+
+#~ msgid "statement has no effect"
+#~ msgstr "kommandoen har ingen effekt"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr ""
+#~ "for-l�kke: array '%s' �ndrede st�rrelse fra %ld til %ld under udf�relse "
+#~ "af l�kken"
+
+#~ msgid "function called indirectly through `%s' does not exist"
+#~ msgstr "funktion kaldt indirekte via '%s' eksisterer ikke"
+
+#~ msgid "function `%s' not defined"
+#~ msgstr "funktionen '%s' er ikke defineret"
+
+#~ msgid "`nextfile' cannot be called from a `%s' rule"
+#~ msgstr "'nextfile' kan ikke kaldes fra en '%s'-regel"
+
+#~ msgid "`next' cannot be called from a `%s' rule"
+#~ msgstr "'next' kan ikke kaldes fra en '%s'-regel"
+
+#~ msgid "Sorry, don't know how to interpret `%s'"
+#~ msgstr "V�d desv�rre ikke hvordan '%s' skal fortolkes"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "Operationen underst�ttes ikke"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr "ingen (kendt) protokol opgivet i special-filnavn '%s'"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "special-filnavn '%s' er ufuldst�ndigt"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "fjernmaskinenavn til '/inet' skal angives"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "fjernport til '/inet' skal angives"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "'-m[fr]'-flaget er irrelevant i gawk"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "brug af flaget -m: '-m[fr] nnn'"
+
+#~ msgid "\t-R file\t\t\t--command=file\n"
+#~ msgstr "\t-R file\t\t\t--command=fil\n"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "kunne ikke finde grupper: %s"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# %s blokke\n"
+#~ "\n"
+
+#~ msgid "range of the form `[%c-%c]' is locale dependent"
+#~ msgstr "omr�de p� formen `[%c-%c]' er locale-afh�ngig"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr "tildeling er ikke tilladt til resultatet fra en indbygget funktion"
+
+#~ msgid "attempt to use array in a scalar context"
+#~ msgstr "fors�g p� at bruge array i skalarsammenh�ng"
+
+#~ msgid "statement may have no effect"
+#~ msgstr "kommandoen har m�ske ikke nogen effekt"
+
+#~ msgid "out of memory"
+#~ msgstr "slut p� hukommelsen"
+
+#~ msgid "attempt to use scalar `%s' as array"
+#~ msgstr "fors�g p� at bruge skalaren '%s' som array"
+
+#~ msgid "call of `length' without parentheses is deprecated by POSIX"
+#~ msgstr "kald af 'length' uden parenteser er for�ldet if�lge POSIX"
+
+#~ msgid "division by zero attempted in `/'"
+#~ msgstr "fors�gte at dividere med nul i '/'"
+
+#~ msgid "length: untyped parameter argument will be forced to scalar"
+#~ msgstr "length: parameter uden type vil blive brugt som skalar"
+
+#~ msgid "length: untyped argument will be forced to scalar"
+#~ msgstr "length: argument uden type vil blive brugt som skalar"
+
+#~ msgid "`break' outside a loop is not portable"
+#~ msgstr "'break' uden for en l�kke er ikke portabelt"
+
+#~ msgid "`continue' outside a loop is not portable"
+#~ msgstr "'continue' uden for en l�kke er ikke portabelt"
+
+#~ msgid "`nextfile' cannot be called from a BEGIN rule"
+#~ msgstr "'nextfile' kan ikke kaldes fra en BEGIN-regel"
+
+#~ msgid ""
+#~ "concatenation: side effects in one expression have changed the length of "
+#~ "another!"
+#~ msgstr ""
+#~ "konkatenering: sideeffekter i et udtryk har �ndret l�ngden af et andet!"
+
+#~ msgid "illegal type (%s) in tree_eval"
+#~ msgstr "ugyldig type (%s) i tree_eval"
+
+#~ msgid "\t# -- main --\n"
+#~ msgstr "\t# -- main --\n"
+
+#~ msgid "invalid tree type %s in redirect()"
+#~ msgstr "ugyldig tr�type %s i redirect()"
+
+#~ msgid "/inet/raw client not ready yet, sorry"
+#~ msgstr "/inet/raw-klient er desv�rre ikke klar endnu"
+
+#~ msgid "only root may use `/inet/raw'."
+#~ msgstr "kun root kan bruge '/inet/raw'."
+
+#~ msgid "/inet/raw server not ready yet, sorry"
+#~ msgstr "/inet/raw-server er desv�rre ikke klar endnu"
+
+#~ msgid "file `%s' is a directory"
+#~ msgstr "filen '%s' er et katalog"
+
+#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'"
+#~ msgstr "brug 'PROCINFO[\"%s\"]' i stedet for '%s'"
+
+#~ msgid "use `PROCINFO[...]' instead of `/dev/user'"
+#~ msgstr "brug 'PROCINFO[...]' i stedet for '/dev/user'"
+
+#~ msgid "\t-m[fr] val\n"
+#~ msgstr "\t-m[fr] v�rdi\n"
+
+#~ msgid "\t-W compat\t\t--compat\n"
+#~ msgstr "\t-W compat\t\t--compat\n"
+
+#~ msgid "\t-W copyleft\t\t--copyleft\n"
+#~ msgstr "\t-W copyleft\t\t--copyleft\n"
+
+#~ msgid "\t-W usage\t\t--usage\n"
+#~ msgstr "\t-W usage\t\t--usage\n"
+
+#~ msgid "can't convert string to float"
+#~ msgstr "kan ikke konvertere en streng til flydende tal"
+
+#~ msgid "# treated internally as `delete'"
+#~ msgstr "# behandlet internt som 'delete'"
+
+#~ msgid "# this is a dynamically loaded extension function"
+#~ msgstr "# dette er en dynamisk indl�st udvidelsesfunktion"
+
+#~ msgid ""
+#~ "\t# BEGIN block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# BEGIN-blok\n"
+#~ "\n"
+
+#~ msgid "unexpected type %s in prec_level"
+#~ msgstr "uventet type %s i prec_level"
+
+#~ msgid "Unknown node type %s in pp_var"
+#~ msgstr "Ukendt nodetype %s i pp_var"
diff --git a/gawk-5.0.1/po/de.po b/gawk-5.0.1/po/de.po
new file mode 100644
index 00000000000..a2abe87f8d8
--- /dev/null
+++ b/gawk-5.0.1/po/de.po
@@ -0,0 +1,3978 @@
+# Deutsche Meldungen für GNU awk
+# Copyright (C) 2000 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+#
+# Philipp Thomas <pth@suse.de>, 2011, 2012, 2014, 2015, 2016, 2017
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.1.64\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2017-09-18 09:08+0200\n"
+"Last-Translator: Philipp Thomas <pth@suse.de>\n"
+"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "von %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "Es wird versucht, einen Skalar als Feld zu verwenden"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "Es wird versucht, den skalaren Parameter „%s“ als Feld zu verwenden"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "Es wird versucht, den Skalar „%s“ als Array zu verwenden"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "Es wird versucht, das Feld „%s“ in einem Skalarkontext zu verwenden"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: Index „%.*s“ ist in Feld „%s“ nicht vorhanden"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "Es wird versucht, den Skalar »%s[\"%.*s\"]« als Feld zu verwenden"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: Das erste Argument ist kein Feld"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: Das zweite Argument ist kein Feld"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: Das zweite Argument ist kein Feld"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: Das erste Argument ist kein Feld"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: Das erste Argument ist kein Feld"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: ein untergeordnetes Feld des ersten Arguments kann nicht als zweites "
+"Argument verwendet werden"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: ein untergeordnetes Feld des ersten Arguments kann nicht als zweites "
+"Argument verwendet werden"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: ein untergeordnetes Feld des zweiten Arguments kann nicht als erstes "
+"Argument verwendet werden"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: ein untergeordnetes Feld des zweiten Arguments kann nicht als erstes "
+"Argument verwendet werden"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "„%s“ ist ein unzulässiger Funktionsname"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "Die Vergleichsfunktion „%s“ für das Sortieren ist nicht definiert"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s-Blöcke müssen einen Aktionsteil haben"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "Jede Regel muss entweder ein Muster oder einen Aktionsteil haben"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "Das alte awk erlaubt keine mehrfachen »BEGIN«- oder »END«-Regeln"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "„%s“ ist eine eingebaute Funktion und kann nicht umdefiniert werden"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr ""
+"Die Regulärer-Ausdruck-Konstante »//« sieht wie ein C-Kommentar aus, ist "
+"aber keiner"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr ""
+"Die Regulärer-Ausdruck-Konstante »/%s/« sieht wie ein C-Kommentar aus, ist "
+"aber keiner"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "doppelte Case-Werte im Switch-Block: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "doppeltes »default« im Switch-Block gefunden"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr ""
+"»break« ist außerhalb einer Schleife oder eines Switch-Blocks nicht zulässig"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "»continue« ist außerhalb einer Schleife nicht zulässig"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "»next« wird in %s-Aktion verwendet"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "»nextfile« wird in %s-Aktion verwendet"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "»return« wird außerhalb einer Funktion verwendet"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"Einfaches »print« in BEGIN- oder END-Regel soll vermutlich »print \"\"« sein"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "»delete« ist in Zusammenhang mit SYMTAB nicht zulässig"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "»delete« ist in Zusammenhang mit FUNCTAB nicht zulässig"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "»delete(array)« ist eine gawk-Erweiterung"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "mehrstufige Zweiwege-Pipes funktionieren nicht"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "Regulärer Ausdruck auf der rechten Seite einer Zuweisung"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "Regulärer Ausdruck links vom »~«- oder »!~«-Operator"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "Das alte awk unterstützt das Schlüsselwort »in« nur nach »for«"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "Regulärer Ausdruck rechts von einem Vergleich"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "nicht umgeleitetes »getline« ist ungültig innerhalb der „%s“-Regel"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr ""
+"Nicht-umgelenktes »getline« ist innerhalb der END-Aktion nicht definiert"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "Das alte awk unterstützt keine mehrdimensionalen Felder"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "Aufruf von »length« ohne Klammern ist nicht portabel"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "indirekte Funktionsaufrufe sind eine gawk-Erweiterung"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"die besondere Variable „%s“ kann nicht für den indirekten Funktionsaufruf "
+"verwendet werden"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "es wird versucht, „%s“ als Funktion aufzurufen, obwohl es keine ist"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "Ungültiger Index-Ausdruck"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "Warnung: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "Fatal: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "Unerwarteter Zeilenumbruch oder Ende der Zeichenkette"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "Quelldatei „%s“ kann nicht zum Lesen geöffnet werden (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr ""
+"Die dynamische Bibliothek „%s“ kann nicht zum Lesen geöffnet werden (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "Unbekannte Ursache"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "„%s“ kann nicht eingebunden und als Programmdatei verwendet werden"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "Quelldatei „%s“ wurde bereits eingebunden"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "Die dynamische Bibliothek „%s“ wurde bereits eingebunden"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "»@include« ist eine gawk-Erweiterung"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "leerer Dateiname nach @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "»@load« ist eine Gawk-Erweiterung"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "leerer Dateiname nach @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "Kein Programmtext auf der Kommandozeile"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "Die Quelldatei „%s“ kann nicht gelesen werden (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "Die Quelldatei „%s“ ist leer"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "PEBKAC Fehler: ungültiges Zeichen „\\%03o“ im Quellcode"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "Die Quelldatei hört nicht mit einem Zeilenende auf"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr ""
+"Nicht beendeter regulärer Ausdruck (hört mit '\\' auf) am Ende der Datei"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"%s: %d: der tawk-Modifizierer für reguläre Ausdrücke »/.../%c« funktioniert "
+"nicht in gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"Der tawk-Modifizierer für reguläre Ausdrücke »/.../%c« funktioniert nicht in "
+"gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "Nicht beendeter regulärer Ausdruck"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "Nicht beendeter regulärer Ausdruck am Dateiende"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr ""
+"Die Verwendung von »\\#...« zur Fortsetzung von Zeilen ist nicht portabel"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "das letzte Zeichen auf der Zeile ist kein Backslash (»\\«)"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "mehrdimensionale Felder sind eine Gawk-Erweiterung"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX erlaubt den Operator »**=« nicht"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "Das alte awk unterstützt den Operator »**=« nicht"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX erlaubt den Operator »**« nicht"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "Das alte awk unterstützt den Operator »**« nicht"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "Das alte awk unterstützt den Operator »^=« nicht"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "Das alte awk unterstützt den Operator »^« nicht"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "Nicht beendete Zeichenkette"
+
+#: awkgram.y:4048 main.c:1220
+#, fuzzy
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX erlaubt keine »\\x«-Escapes"
+
+#: awkgram.y:4050 node.c:453
+#, fuzzy
+msgid "backslash string continuation is not portable"
+msgstr ""
+"Die Verwendung von »\\#...« zur Fortsetzung von Zeilen ist nicht portabel"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "Ungültiges Zeichen »%c« in einem Ausdruck"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "„%s“ ist eine gawk-Erweiterung"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX erlaubt „%s“ nicht"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "„%s“ wird im alten awk nicht unterstützt"
+
+#: awkgram.y:4494
+#, fuzzy
+msgid "`goto' considered harmful!"
+msgstr "»goto« gilt als schlechter Stil!\n"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "Unzulässige Argumentzahl %d für %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr "%s: Ein String als letztes Argument von substitute hat keinen Effekt"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "Der dritte Parameter von %s ist ein unveränderliches Objekt"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: Das dritte Argument ist eine gawk-Erweiterung"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: Das zweite Argument ist eine gawk-Erweiterung"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"Fehlerhafte Verwendung von dcgettext(_\"...\"): \n"
+"Entfernen Sie den führenden Unterstrich"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"Fehlerhafte Verwendung von dcngettext(_\"...\"): \n"
+"Entfernen Sie den führenden Unterstrich"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: eine Regexp-Konstante als zweites Argument ist unzulässig"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "Funktion „%s“: Parameter „%s“ verdeckt eine globale Variable"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "„%s“ kann nicht zum Schreiben geöffne werden(%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "Die Liste der Variablen wird auf der Standardfehlerausgabe ausgegeben"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: close ist gescheitert (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() zweimal aufgerufen!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "es sind verdeckte Variablen vorhanden"
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "Funktion „%s“ wurde bereits definiert"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "Funktion „%s“: Funktionsnamen können nicht als Parameternamen benutzen"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"Funktion „%s“: die spezielle Variable „%s“ kann nicht als Parameter "
+"verwendet werden"
+
+#: awkgram.y:5092
+#, fuzzy, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "Funktion „%s“: Parameter „%s“ verdeckt eine globale Variable"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "Funktion „%s“: Parameter #%d, „%s“ wiederholt Parameter #%d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "Aufgerufene Funktion „%s“ ist nirgends definiert"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "Funktion „%s“ wurde definiert aber nirgends aufgerufen"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr ""
+"Regulärer-Ausdruck-Konstante für Parameter #%d ergibt einen \n"
+"logischen Wert"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"Funktion „%s“ wird mit Leerzeichen zwischen Name und »(« aufgerufen, \n"
+"oder als Variable oder Feld verwendet"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "Division durch Null wurde versucht"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "Division durch Null versucht in »%%«"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"dem Ergebnis eines Feld-Postinkrementausdruck kann kein Wert zugewiesen "
+"werden"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "Unzulässiges Ziel für eine Zuweisung (Opcode %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "»@include« ist eine gawk-Erweiterung"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s to \"%s\" fehlgeschlagen (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "Standardausgabe"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "Standardfehleraugabe"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: das Argument ist keine Zahl"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: das Argument %g liegt außerhalb des gültigen Bereichs"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: Leeren der Puffer nicht möglich, Pipe „%.*s“ ist nur zum Lesen "
+"geöffnet"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: Leeren der Puffer nicht möglich, Datei „%.*s“ ist nur zum Lesen "
+"geöffnet"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: Der Puffer für die Datei „%.*s“ kann nicht geleert werden: %s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: Leeren der Puffer nicht möglich; zweiseitige Pipe „%.*s“ hat die "
+"schreibende Seite geschlossen"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: „%.*s“ ist keine geöffnete Datei, Pipe oder Prozess"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: Erstes Argument ist kein String"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: Zweites Argument ist kein string"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "Argument ist keine Zahl"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: Argument ist ein Feld"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "»length(array)« ist eine Gawk-Erweiterung"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: Argument ist kein String"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: Argument ist keine Zahl"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: Negatives Argument %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "Fatal: »count$« muss auf alle Formate angewandt werden oder auf keines"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "Feldbreite wird für die »%%«-Angabe ignoriert"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "Genauigkeit wird für die »%%«-Angabe ignoriert"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "Feldbreite und Genauigkeit werden für die »%%«-Angabe ignoriert"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "Fatal: »$« ist in awk-Formaten nicht zulässig"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "Fatal: die Anzahl der Argumen bei »$« muss > 0 sein"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"Fatal: Argumentenanzahl %ld ist größer als die Gesamtzahl angegebener "
+"Argumente"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "Fatal: »$« nach Punkt in Formatangabe nicht zulässig"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr "Fatal: »$« fehlt in positionsabhängiger Feldbreite oder Genauigkeit"
+
+#
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "»l« ist in awk-Formaten bedeutungslos, ignoriert"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "Fatal: »l« ist in POSIX-awk-Formaten nicht zulässig"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "»L« ist in awk-Formaten bedeutungslos, ignoriert"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "Fatal: »L« ist in POSIX-awk-Formaten nicht zulässig"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "»h« ist in awk-Formaten bedeutungslos, ignoriert"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "Fatal: »h« ist in POSIX-awk-Formaten nicht zulässig"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: Wert %g ist außerhalb des Bereichs für Format »%%c«"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: Wert %g ist kein gultiges Wide-Zeichen"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: Wert %g ist außerhalb des Bereichs für Format »%%%c«"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: Wert %g ist außerhalb des Bereichs für Format »%%%c«"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"das unbekannte Zeichen »%c« in der Formatspezifikation wird ignoriert: keine "
+"Argumente umgewandelt"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "Fatal: Nicht genügend Argumente für die Formatangabe"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ hierfür fehlte es"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: Format-Spezifikation hat keinen Controlcode"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "Zu viele Argumente für den Formatstring"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: Keine Argumente"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: Keine Argumente"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"printf: Versuch in die geschlossene schreibende Seite einer bidirektionalen "
+"Pipe zu schreiben"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: das Argument ist keine Zahl"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: das Argument %g ist negativ"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: Länge %g ist nicht >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: Länge %g ist nicht >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: Nicht ganzzahlige Länge %g wird abgeschnitten"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+"substr: Länge %g ist zu groß für Stringindizierung, wird auf %g gekürzt"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: Start-Index %g ist ungültig, 1 wird verwendet"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: Nicht ganzzahliger Start-Wert %g wird abgeschnitten"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: Quellstring ist leer"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: Start-Wert %g liegt hinter dem Ende des Strings"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: Länge %g am Start-Wert %g überschreitet die Länge des ersten "
+"Arguments (%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime: Formatwert in PROCINFO[\"strftime\"] ist numerischen Typs"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: Das zweite Argument ist keine Zahl"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr ""
+"strftime: das zweite Argument ist kleiner als 0 oder zu groß für time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr ""
+"strftime: das zweite Argument ist ausserhalb des Gültigkeitsbereichs von "
+"time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: Das erste Argument ist kein String"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: Der Format-String ist leer"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: Das Argument ist kein String"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: mindestens einer der Werte ist außerhalb des normalen Bereichs"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "Die Funktion »system« ist im Sandbox-Modus nicht erlaubt"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: Das Argument ist kein String"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"print: Versuch in die geschlossene schreibende Seite einer bidirektionalen "
+"Pipe zu schreiben"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "Referenz auf das nicht initialisierte Feld »$%d«"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: das Argument ist kein String"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: das Argument ist kein String"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: das erste Argument ist keine Zahl"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: das zweite Argument ist keine Zahl"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: das Argument ist keine Zahl"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: das Argument ist keine Zahl"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: das Argument ist keine Zahl"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: das dritte Argument ist kein Array"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: das dritte Argument „%.*s“ wird als 1 interpretiert"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: kann indirekt nur mit zwei Argumenten aufgerufen werden"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "der indirekte Aufruf von %s erfordert mindestens zwei Argumente"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: das erste Argument ist keine Zahl"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: das zweite Argument ist keine Zahl"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): Negative Werte sind nicht zulässig"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): Dezimalteil wird abgeschnitten"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"lshift(%f, %f): Zu große Shift-Werte werden zu merkwürdigen Ergebnissen "
+"führen"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: das erste Argument ist keine Zahl"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: das zweite Argument ist keine Zahl"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift (%f, %f): Negative Werte sind nicht zulässig"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): Dezimalteil wird abgeschnitten"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"rshift(%f, %f): Zu große Shift-Werte werden zu merkwürdigen Ergebnissen "
+"führen"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: wird mit weniger als zwei Argumenten aufgerufen"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: das Argument %d ist nicht numerisch"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: der negative Wert %2$g von Argument %1$d ist unzulässig"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: wird mit weniger als zwei Argumenten aufgerufen"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: das Argument %d ist nicht numerisch"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: der negative Wert %2$g von Argument %1$d ist unzuässig"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: wird mit weniger als zwei Argumenten aufgerufen"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: das Argument %d ist nicht numerisch"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: der negative Wert %2$g von Argument %1$d ist unzulässig"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: das erste Argument ist keine Zahl"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): Der negative Wert ist unzulässig"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): der Dezimalteil wird abgeschnitten"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: „%s“ ist keine gültige Locale-Kategorie"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv: das dritte Argument ist kein Feld"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv: das erste Argument ist keine Zahl"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv: das zweite Argument ist keine Zahl"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv: Division durch Null wurde versucht"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: das zweite Argument ist kein Feld"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+"typeof fand die unzulässige Kombination von Kennungen „%s”; Bitte senden Sie "
+"einen Fehlerbericht."
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof: ungültiger Parametertyp „%s“"
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof: unbekannter Parametrttyp „%s”"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Geben Sie »(g)awk Ausdrücke« und zum Abschluss \"end\" ein\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "Ungültige Frame-Nummer: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: Ungültige Option - „%s“"
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "Quelle „%s“: wurde bereits eingelesen."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save „%s“: Der Befehl ist nicht zulässig."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+"Der Befehl »commands« kann nicht für Break- bzw. Watchpoints verwendet werden"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "es wurden noch keine Break-/Watchpoints gesetzt"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "ungültige Break-/Watchpoint/Nummer"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr ""
+"Befehle eingeben, die bei Erreichen von %s %d ausgeführt werden sollen, "
+"einer pro Zeile.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Abschließen mit dem Befehl »end«\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "»end« ist nur innerhalb der Befehle »commands« oder »eval« zulässig"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "»silent« ist nur innerhalb des Befehls »commands« zuzlässig"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: Ungültige Option - „%s“"
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: Unzulässige Break-/Watchpoint-Nummer"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "Das Argument ist keine Zeichenkette"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: ungültiger Parameter - „%s“"
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "Unbekannte Funktion - „%s“"
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: Ungültige Option - „%s“"
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "Ungültige Bereichsangabe: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "nichtnumerischer Wert als Feldnummer"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "nichtnumerischer Wert wo ein numerischer erwartet wurde"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "ganyzahliger Wert ungleich Null"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - log von allen oder den N innersten (äußersten wenn N < 0) "
+"Rahmen."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[Dateiname:]N|funktion - Breakpoint an der angegebenen Stelle setzen.]"
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr "clear [[Dateiname:]N|Funktion - zuvor gesetzte Breakpoints löschen."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [Nr] - startet eine Liste von Befehlen, die bei Erreichen eines "
+"Break- bzw. Watchpoints ausgeführt werden."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition Nr [Ausdruck] - Bedingungen für einen Break-/Watchpoint setzen "
+"oder löschen."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [ANZAHL] - zu debuggendes Programm fortsetzen."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr "delete [Breakpoints] [Bereich] - angegebene Breakpoints entfernen."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr "disable [Breakpoints] [Bereich] - angegebene Breakpoints deaktivieren."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+"display [Var] - den Wert der Variablen bei jedem Programmstop ausgeben."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - N Rahmen nach unten im Stack gehen."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+"dump [Dateiname] - Befehle in eine Datei oder auf der Standardausgabe "
+"ausgeben"
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [Breakpoints] [Bereich] - die angegebenen Breakpoints "
+"aktivieren."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - beendet eine Liste von Befehlen oder AWK/Ausdrücken."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval stmt[p1, p2, ...] - Awk-Ausdrücke auswerten."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (identisch mit quit) Debugger verlassen."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr ""
+"finish - mit Ausführung fortfahren bis auisgewählter Rahmen verlassen wird."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - den Stackrahmen Nummer N auswählen und ausgeben."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+"help [Befehl] - gibt eine Liste der Befehle oder die Beschreibung eines "
+"einzelnen Befehls aus."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+"ignore N ZÄHLER - setzt den Ignorieren-Zähler von Breakpoint N auf ZÄHLER"
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info Thema - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[Dateiname:]Zeilennr|Funktion|Breich] - die angegebenen Zeilen "
+"ausgeben"
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+"next [ZÄHLER] - Programm schrittweise ausführen aber Subroutinen in einem "
+"Rutsch ausführen"
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [ZÄHLER] - einen Befehl abarbeiten. aber Subroutinen in einem Rutsch "
+"ausführen"
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [Name[=Wer]] - Debuggeroptionen setzen oder anzeigen."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print Var [Var] - den Wert einer Variablen oder eines Feldes ausgeben."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf Format, [Arg], ... - formatierte Ausgabe."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - Debugger verlassen"
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+"return [Wert] - den ausgewählten Stapelrahmen yu seinem Aufrufer zurück "
+"kehren lassen"
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - startet die (erneute) Ausführung des Programms."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save Dateineme - sichert die Befehle der Sitzung in einer Datei."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set Var = Wert - einer skalaren Variablen einen  Wert zuweisen"
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - unterdrückt die übliche Nachricht, wenn ein Break- bzw. Watchpoint "
+"erreicht wird."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source Datei - die Befehle in Datei ausführen"
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [ZÄHLER - Programm schrittweise ausführen bis es eine andere Quellzeile "
+"erricht."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [ZÄHLER - genau eine Instruktion ausführen"
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[Dateinem:]N|Funktion] - einen temporären Breakpoint setzen."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - Instruktionen vor der Ausführung ausgeben."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+"undisplay [N] - Variablen von der Liste der automatisch Anzuzeigenden "
+"entfernen."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[Dateiname:]N|Funktion - Ausführen bis das Programm eine andere Zeile "
+"erreicht oder N Zeilen im aktuellen Rahmen."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N} - Variablen von der Beobachtungsliste löschen"
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - N Rahmen im Kellerspeicher nach oben gehen."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch Var - einen Watchpoint für eine Variable setzen."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where [N] - (wie bei backtrace) Liste von allen oder den N innersten "
+"(äußersten wenn N <0> Stackframes"
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "der Befehl kann nicht gelesen werden („%s“)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "der Befehl kann nicht gelesen werden („%s“)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "Ungültiges Zeichen im Befehl"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "unbekannter Befehl - »%.*s«, versuchen Sie es mit help"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "Ungültiges Zeichen"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "undefinierter Befehl: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+"die Anzahl von Zeilen setzen oder anzeigen, die in der Historydatei "
+"gespeichert werden sollen."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "die Größe des Fensters für den Befehl list setzen oder anzeigen."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "die gawk Ausgabedatei setzen oder anzeigen."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "das Debugger-Prompt setzen oder anzeigen."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr "(rück)setzen des Sicherns der Befehlshistorie (on oder off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "(rück)setzen des Sicherns von Optionen (on oder off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "(rück)setzen des Verfolgens von Instruktionen (on oder off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "Das Programm läuft nicht."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "Die Quelldatei „%s“ kann nicht gelesen werden (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "Die Quelldatei „%s“ ist leer.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "keine aktuelle Quelldatei"
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "Die Quelldatei „%s“ kann nicht gefunden werden (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+"WARNUNG: Quelldatei „%s“ wurde seit der Programmübersetzung verändert.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr ""
+"die Zeilennummer %d ist außerhalb des gültigen Bereichs: „%s“ hat %d Zeilen"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "Unerwartetes Dateiende beim Lesen von Datei »%s<<, Zeile %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "Quelldatei „%s“ wurde seit dem Start des Programmes verändert"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Derzeitige Quelldatei: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Anzahl von Zeilen: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Quelldatei (Zeilen): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Nummer  Anz.  Aktiv    Ort\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tAnzahl Treffer = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tdie nächsten %ld Treffer\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tStopbedingung: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tBefehle:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Derzeitiger Stapelrahmen"
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Aufgerufen aus Rahmen: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Aufrufer des Rahmens: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Keine in  main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Keine Argumente.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Keine lokalen.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Alle definierten Variablen:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Alle definierten Funktionen:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Auto-display-Variablen:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Yu überwachende Variablen:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "im aktuellen Kontext gibt es kein Symbol mit Namen „%s“\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "„%s“ ist kein Feld\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = nicht initialisiertes Feld\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "Das Feld „%s“ ist leer\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%.*s\"] ist in Feld „%s“ nicht vorhanden\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "»%s[\"%.*s\"]« ist kein Feld\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "„%s“ ist keine skalare Variable"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr ""
+"Es wird versucht, das Feld »%s[\"%.*s\"]« in einem Skalarkontext zu verwenden"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "Es wird versucht, den Skalar »%s[\"%.*s\"]« als Feld zu verwenden"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "„%s“ ist eine Funktion"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "Watchpoint %d ist bedingungslos\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "Kein anzuzeigendes Element mit Nummer %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Kein zu beobachtendes Element mit Nummer %ld"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%.*s\"] ist in Feld „%s“ nicht vorhanden\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "Es wird versucht, einen Skalar als Feld zu verwenden"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+"Watchpoint %d wurde gelöscht, weil der Parameter außerhalb des "
+"Gültigkeitsbereichs ist.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr ""
+"Anzuzeigendes Element %d wurde gelöscht, weil der Parameter außerhalb des "
+"Gültigkeitsbereichs ist.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " in Datei „%s“, Zeile %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " bei „%s“:%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tin "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Weitere Stapelrahmen folgen ...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "Ungültige Rahmennummer"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Hinweis: Breakpont %d (aktiv, ignoriert für die nächsten %ld Treffer) wird "
+"auch an %s:%d gesetzt"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Hinweis: Breakpont %d (aktiv) wird auch an %s:%d gesetzt"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Hinweis: Breakpont %d (inaktiv, ignoriert für die nächsten %ld Treffer) wird "
+"auch von %s:%d gesetzt"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Hinweis: Breakpont %d (inaktiv) wird auch an %s:%d gesetzt"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Breakpont %d wird auf Datei %s, Zeile %d gesetzt\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "In Datei „%s“ kann kein Breakpoint gesetzt werden\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "Zeile Nummer %d in Datei „%s“ liegt außerhalb des gültigen Bereichs"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Die Regel kann nicht gefunden werden!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "In „%s“:%d kann kein Breakpoint gesetzt werden\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "In Funktion „%s“ kann kein Breakpoint gesetzt werden\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "Breakpoint %d gestzt auf Datei „%s“ Zeile %d ist bedingungslos\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Breakpoint %d wurde gelöscht"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "Am Beginn von Funktion „%s“ gibt es keine Breakpoints\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Bei Datei „%s“ Zeile %d gibt es keine Breakpoints\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "Ungtige Breakpoint/Nummer"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Alle Breakpoints löschen? (j oder n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "j"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr ""
+"die nächsten %ld Überschreitungen von Breakpoint %d werden ignoriert.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "wenn Breakpoint %d das nächste mal erreicht wird, wird angehalten\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr ""
+"Es können nur Programme untersucht werden, die mittels der Option »-f« "
+"übergeben wurden.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Der Debugger konnte nicht neu gestartet werden"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "das Programm läfut bereits. Neu starten (j/n}? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Das Programm wurde nicht neu gestartet\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "Fehler: Neustart nicht möglich da die Operation verboten ist\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr ""
+"Fehler (%s): Neustart nicht möglich, der Rest der Befehle wird ignoriert\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Das Programm wird gestartet: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Das Programm endete nicht normal mit dem Rückgabewert: %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Das Programm endete normal mit dem Rückgabewert: %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "Das Prgramm läuft. Trotzdem beenden (j/n) "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Es wird an keinem Breakpoint gestoppt; das Argument wird ignoriert.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "ungültige Breakpointnummer %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr ""
+"Die nächsten %ld Überschreitungen von Breakpoint %d werden ignoriert.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "»finish« hat in main() des äußersten Rahmens keine Bedeutung\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Laufen bis zur Rückkehr von "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "»return« hat in main() des äußersten Rahmens keine Bedeutung\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "Die angegebene Position in Funktion „%s“ kann nicht gefunden werden\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "ungültige Quellzeilennummer %d in Datei „%s“"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "Der Zielpunkt %d in Datei „%s“ ist nicht auffindbar\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "Das Element ist kein Feld\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "untypisierte Variable\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Stopp in %s ...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "»finish« hat bei dem nichtlokalen Sprung „%s“ keine Bedeutung\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "»finish« hat bei dem nichtlokalen Sprung „%s“ keine Bedeutung\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t-[Eingabe] um fort zu fahren oder b [Eingabe] für geenden -"
+
+#: debug.c:4324
+msgid "q"
+msgstr "b"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] ist in Feld „%s“ nicht vorhanden"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "Ausgabe wird an die Standardausgabe geschickt\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "ungültige Zahl"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr ""
+"„%s“ ist im aktuellen Kontext nicht zulässig; der Ausdruck wird ignoriert"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr ""
+"»reeturn« ist im aktuellen Kontext nicht zulässig; der Ausdruck wird "
+"ignoriert"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Im aktuelln Kontext gibt es kein Symbol „%s“"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "Unbekannter Knotentyp %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "Unbekannter Opcode %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "Opcode %s ist weder ein Operator noch ein Schlüsselwort"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "Pufferüberlauf in genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Funktions-Aufruf-Stack\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "»IGNORECASE« ist eine gawk-Erweiterung"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "»BINMODE« ist eine gawk-Erweiterung"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "BINMODE Wert „%s“ ist ungültig und wird als 3 behandelt"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "Falsche »%sFMT«-Angabe „%s“"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "»--lint« wird abgeschaltet, da an »LINT« zugewiesen wird"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "Referenz auf nicht initialisiertes Argument „%s“"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "Referenz auf die nicht initialisierte Variable „%s“"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "Nicht numerischer Wert für Feldreferenz verwendet"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "Referenz auf ein Feld von einem Null-String"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "Versuch des Zugriffs auf Feld %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "Referenz auf das nicht initialisierte Feld »$%ld«"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "Funktion „%s“ mit zu vielen Argumenten aufgerufen"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: unerwarteter Typ „%s“"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "Division durch Null versucht in »/=«"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "Division durch Null versucht in »%%=«"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "Erweiterungen sind im Sandbox-Modus nicht erlaubt"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load sind gawk-Erweiterungen"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: NULL lib_name erhalten"
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: Bibliothek „%s“ kann nicht geöffnet werden (%s)\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: Bibliothek „%s“: definiert »plugin_is_GPL_compatible« nicht (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr ""
+"load_ext: Bibliothek „%s“: Funktion „%s“ kann nicht aufgerufen werden (%s)\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr ""
+"load_ext: die Initialisierungsroutine %2$s von Bibliothek »%1$s« ist "
+"gescheitert\n"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: Funktionsname fehlt"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: die in gawk eingebaute Funktion „%s“ kann nicht als "
+"Funktionsname verwendet werden"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: die in gawk eingebaute Funktion „%s“ kann nicht als "
+"Funktionsname verwendet werden"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: Funktion „%s“ kann nicht neu definiert werden"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: Funktion „%s“ wurde bereits definiert"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: Funktion „%s“ wurde bereits vorher definiert"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: negative Anzahl von Argumenten für Funktion „%s“"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+"Funktion „%s“: Argument #%d: Es wird versucht, einen Skalar als Feld zu "
+"verwenden"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr ""
+"Funktion „%s“: Argument #%d: Es wird versucht, ein Feld als Skalar zu "
+"verwenden"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "das dynamische Laden von Bibliotheken wird nicht unterstützt"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stst: die symbolische Verknüpfung „%s“ kann nicht gelesenb werden"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: ungültige Parameter"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts_init: Variable %s konnte nicht angelegt werden"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "fts wird auf diesem System nicht unterstützt"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: das Feld konnte nicht angelegt werden"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: das Element konnte nicht gesetzt werden"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: das Element konnte nicht gesetzt werden"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: das Element konnte nicht gesetzt werden"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: das Feld konnte nicht anglegt werden"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: das Element konnte nicht gesetzt werden"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: Aufruf mit falscher Anzahl an Argumenten, es werden 3 erwartet"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: ungültiger Parameter"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: ungültiger zweiter Parameter"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "%s: ist ein Parameter"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: ungültiger dritter Parameter\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr ""
+"fts: die heimtückische Kennung FTS_NOSTAT wird ignoriert, ätsch bätsch."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() ist gescheitert\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: Das erste Argument konnte nicht gelesen werden"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: Das zweite  Argument konnte nicht gelesen werden"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: Das dritte  Argument konnte nicht gelesen werden"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch ist auf diesem System nicht implementiert\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr ""
+"fnmatch_init: eine FNM_NOMATCH-Variable konnte nicht hinzu gefügt werden"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch_init: das Feldelement %s konnte nicht initialisiert werden"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch_init: das FNM-Feld konnte nicht gesetzt werden."
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO ist kein Feld!"
+
+#: extension/inplace.c:131
+#, fuzzy
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace_begin: direktes Editieren ist bereits aktiv"
+
+#: extension/inplace.c:134
+#, fuzzy, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace_begin: erwartet 2 Argumente aber wurde aufgerufen mit %d"
+
+#: extension/inplace.c:137
+#, fuzzy
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr "inplace_begin: das erste Argument ist kein Dateiname"
+
+#: extension/inplace.c:145
+#, fuzzy, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace_begin: direktes Editieren wird deaktiviert wegen des ungültigen "
+"Dateinamens „%s“"
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace_begin: Status von „%s“ kann nicht ermittelt werden (%s)"
+
+#: extension/inplace.c:159
+#, fuzzy, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace_begin: „%s“ ist keine reguläre Datei"
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace_begin: mkstemp(„%s“) ist gescheitert (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace_begin:: chmod ist gescheitert (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace_begin: dup(stdout) ist gescheitert (%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_begin: dup2(%d, stdout) ist gescheitert (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace_begin: close(%d) ist gescheitert (%s)"
+
+#: extension/inplace.c:211
+#, fuzzy, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace_end: erwartet 2 Argumente wurde aber mit %d aufgerufen"
+
+#: extension/inplace.c:214
+#, fuzzy
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr "inplace_end: das erste Argument ist kein Dateiname"
+
+#: extension/inplace.c:221
+#, fuzzy
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace_end: direktes Editieren ist nicht aktiv"
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_end: dup2(%d, stdout) ist gescheitert (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace_end: close(%d) ist gescheitert (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace_end: fsetpos(stdout) ist gescheitert (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace_end: link(„%s“, „%s“) ist gescheitert (%s)"
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace_end: rename(„%s“, „%s“) ist gescheitert (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: Aufruf mit ungeeigneten Argumenten"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: Aufruf mit ungeeigneten Argumenten"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir ist gescheitert: %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: Aufruf mit der falschen Art von Argument"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: die Variable REVOUT konnte nicht initialisiert werden"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: das Argument 0 ist keine Zeichenkette\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: das Argument 1 ist kein Feld\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: das Feld konnte nicht niveliert werden\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: das nivelierte Feld konnte nicht frei gegeben werden\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "Der Wert im Feld hat den unbekannten Typ %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: Argument 0 ist keine Zeichenkette\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: Argument 1 ist kein Feld\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array ist gescheitert\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element ist gescheitert\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+"Der wiederhergestellte Wert mit dem unbekannten Typcode %d wird als "
+"Zeichenkette behandelt"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: wird auf dieser Plattform nicht unterstützt"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: das erforderliche numerische Argument fehlt"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: das Argument ist negativ"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: wird auf dieser Plattform nicht unterstützt"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "Der Eingabe-Datensatz ist zu groß"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF wird ein negativer Wert zugewiesen"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: das vierte Argument ist eine gawk-Erweiterung"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: das vierte Argument ist kein Feld"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: das zweite Argument ist kein Feld"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split: als zweites und viertes Argument kann nicht das gleiche Feld "
+"verwendet werden"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: Ein untergeordnetes Feld des zweiten Arguments kann nicht als viertes "
+"Argument verwendet werden"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: Ein untergeordnetes Feld des vierten Arguments kann nicht als zweites "
+"Argument verwendet werden"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: Null-String als drittes Argument ist eine gawk-Erweiterung"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: Das vierte Argument ist kein Feld"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: Das zweite Argument ist kein Feld"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: Das dritte Argument darf nicht Null sein"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: als zweites und viertes Argument kann nicht das gleiche Feld "
+"verwendet werden"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: Ein untergeordnetes Feld des zweiten Arguments kann nicht als "
+"viertes Argument verwendet werden"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: Ein untergeordnetes Feld des vierten Arguments kann nicht als "
+"zweites Argument verwendet werden"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "»FIELDWIDTHS« ist eine gawk-Erweiterung"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "„*” muss der letzte Bezeichner in FIELDWIDTHS sein"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "ungültiger FIELDWIDTHS-Wert für Feld %d, nah bei „%s“"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "Null-String für »FS« ist eine gawk-Erweiterung"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "Das alte awk unterstützt keine regulären Ausdrücke als Wert von »FS«"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "»FPAT« ist eine gawk-Erweiterung"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: Rückgabewert Null erhalten"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: nicht im MPFR-Modus"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: MPFR wird nicht unterstützt"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: Zahl mit ungültigem Wert „%d”"
+
+#: gawkapi.c:385
+#, fuzzy
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "load_ext: NULL lib_name erhalten"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+"node_to_awk_value: unzulässige Kombination von Kennungen für Zahlen „%s” "
+"gefunden; Bitte senden Sie einen Fehlerbericht."
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: Null-Knoten erhalten"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: Null-Wert erhalten"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+"node_to_awk_value fand die ungültige Kombination von Schaltern „%s”: Bitte "
+"senden Sie einen Fehlerebericht."
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: Null-Feld erhalten"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: Null-Index erhalten"
+
+#: gawkapi.c:1217
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr ""
+"api_flatten_array_typed: Index %d konnte nicht in %s umgewandelt werden\n"
+
+#: gawkapi.c:1222
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr ""
+"api_flatten_array_typed: Wert %d konnte nicht in %s umgewandelt werden\n"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr: MPFR wird nicht unterstützt"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "Das Ende der Regel BEGINFILE ist unauffindbar"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "Der unbekannte Dateityp „%s“ kann nicht zum „%s” geöffnet werden"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr ""
+"das Kommandozeilen-Argument „%s“ ist ein Verzeichnis: wird übersprungen"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "Die Datei „%s“ kann nicht zum Lesen geöffnet werden (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "Das Schließen des Dateideskriptors %d („%s“) ist gescheitert (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "Umlenkungen sind im Sandbox-Modus nicht erlaubt"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "Der Ausdruck in einer Umlenkung mittels „%s“ ist eine Zahl"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "Der Ausdruck für eine Umlenkung mittels „%s“ ist ein leerer String"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"Der Dateiname „%.*s“ für eine Umlenkung mittels „%s“ kann das Ergebnis eines "
+"logischen Ausdrucks sein"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "Unnötige Kombination von »>« und »>>« für Datei »%.*s«"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file kann die Pipe „%s” mit fd %d nicht erzeugen"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "Die Pipe „%s“ kann nicht für die Ausgabe geöffnet werden (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "Die Pipe „%s“ kann nicht für die Eingabe geöffnet werden (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"Die Erzeugung eines Sockets mittels get_file für „%s” mit fd %d wird auf "
+"dieser Plattform nicht unterstützt"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr ""
+"Die bidirektionale Pipe „%s“ kann nicht für die Ein-/Ausgabe geöffnet werden "
+"(%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "Von „%s“ kann nicht umgelenkt werden (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "Zu „%s“ kann nicht umgelenkt werden (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"Die Systemgrenze offener Dateien ist erreicht, daher werden nun "
+"Dateideskriptoren mehrfach verwendet"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "Das Schließen von „%s“ ist gescheitert (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "Zu viele Pipes oder Eingabedateien offen"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: Das zweite Argument muss »to« oder »from« sein"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: »%.*s« ist weder offene Datei, noch Pipe oder Ko-Prozess"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "»close« für eine Umlenkung, die nie geöffnet wurde"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: Umlenkung „%s“ wurde nicht mit »[&« geöffnet, das zweite Argument "
+"wird ignoriert"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "Fehlerstatus (%d) beim Schließen der Pipe „%s“ (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "Fehlerstatus (%d) beim Schließen der Datei „%s“ (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "Das explizite Schließen des Sockets „%s“ fehlt"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "Das explizite Schließen des Ko-Prozesses „%s“ fehlt"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "Das explizite Schließen der Pipe „%s“ fehlt"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "Das explizite Schließen der Datei „%s“ fehlt"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush: die Standardausgabe kann nicht geleert werden: %s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush: die Standardfehlerausgabe kann nicht geleert werden: %s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "Fehler beim Schreiben auf die Standardausgabe (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "Fehler beim Schreiben auf die Standardfehlerausgabe (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "Das Leeren der Pipe „%s“ ist gescheitert (%s)"
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "Ko-Prozess: Das Leeren der Pipe zu „%s“ ist gescheitert (%s)"
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "Das Leeren der Datei „%s“ ist gescheitert (%s)"
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "Der lokale Port „%s“ ist ungültig in „/inet”: %s"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "Der lokale Port „%s“ ist ungültig in „/inet”"
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "Die Angaben zu entferntem Host und Port (%s, %s) sind ungültig: %s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "Die Angaben zu entferntem Host und Port (%s, %s) sind ungültig"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "TCP/IP-Verbindungen werden nicht unterstützt"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "„%s“ konnte nicht geöffnet werden, Modus „%s“"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr ""
+"Das Schließen der übergeordneten Terminal-Gerätedatei ist gescheitert (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "Das Schließen der Standardausgabe im Kindprozess ist gescheitert (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"Das Verschieben der untergeordneten Terminal-Gerätedatei zur Standardausgabe "
+"im Kindprozess ist gescheitert (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "Schließen von stdin im Kindprozess gescheitert (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"Das Verschieben der untergeordneten Terminal-Gerätedatei zur Standardeingabe "
+"im Kindprozess ist gescheitert (dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr ""
+"Das Schließen der untergeordneten Terminal-Gerätedatei ist gescheitert (%s)"
+
+#: io.c:2265
+#, fuzzy
+msgid "could not create child process or open pty"
+msgstr "Kindprozess für „%s“ kann nicht erzeugt werden (fork: %s)"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+"Das Verschieben der Pipe zur Standardausgabe im Kindprozess ist gescheitert "
+"(dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+"Das Verschieben der Pipe zur Standardeingabe im Kindprozess ist gescheitert "
+"(dup: %s)"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr ""
+"Das Wiederherstellen der Standardausgabe im Elternprozess ist gescheitert\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr ""
+"Das Wiederherstellen der Standardeingabe im Elternprozess ist gescheitert\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "Das Schließen der Pipe ist gescheitert (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "»|&« wird nicht unterstützt"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "Pipe „%s“ kann nicht geöffnet werden (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "Kindprozess für „%s“ kann nicht erzeugt werden (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+"getline: es wird versucht, vom geschlossenen lesenden Ende einer "
+"bidirektionalen Pipe zu lesen"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: NULL-Zeiger erhalten"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"Eingabeparser „%s“ steht im Konflikt mit dem vorher installierten "
+"Eingabeparser „%s“"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "Eingabeparser „%s“ konnte „%s“ nicht öffnen"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: NULL-Zeiger erhalten"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr "Ausgabeverpackung „%s“ steht im Konflikt mit Ausgabeverpackung „%s“"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "Ausgabeverpackung „%s“ konnte „%s“ nicht öffnen"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: NULL-Zeiger erhalten"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr "Zweiwegeprozessor „%s“ steht im Konflikt mit Zweiwegeprozessor „%s“"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "Zweiwegeprozessor „%s“ konnte „%s“ nicht öffnen"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "Die Datei „%s“ ist leer"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "Es konnte kein weiterer Speicher für die Eingabe beschafft werden"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "Multicharacter-Wert von »RS« ist eine gawk-Erweiterung"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "IPv6-Verbindungen werden nicht unterstützt"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+"Die Umgebungsvariable »POSIXLY_CORRECT« ist gesetzt: »--posix« wird "
+"eingeschaltet"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "»--posix« hat Vorrang vor »--traditional«"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "»--posix« /»--traditional« hat Vorrang vor »--non-decimal-data«"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "»--posix« hat Vorrang vor »--characters-as-bytes«"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "%s als setuid root auszuführen kann zu Sicherheitsproblemen führen"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr ""
+"Das Setzen des Binärermodus für die Standardeingabe ist nicht möglich (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr ""
+"Das Setzen des Binärermodus für die Standardausgabe ist nicht möglich (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr ""
+"Das Setzen des Binärermodus für die Standardfehlerausgabe ist nicht möglich "
+"(%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "Es wurde überhaupt kein Programmtext angegeben!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr "Aufruf: %s [POSIX- oder GNU-Optionen] -f PROGRAMM [--] Datei ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr "Aufruf: %s [POSIX- oder GNU-Optionen] -- %cPROGRAMM%c Datei ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "POSIX-Optionen\t\tlange GNU-Optionen: (standard)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f PROGRAMM\t\t--file=PROGRAMM\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F Feldtrenner\t\t\t--field-separator=Feldtrenner\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=Wert\t\t--assign=var=Wert\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "POSIX-Optionen\t\tGNU-Optionen (lang): (Erweiterungen)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d [Datei]\t\t--dump-variables[=Datei]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[Datei]\t\t--debug[=Datei]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'Programmtext'\t--source=Programmtext\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E Datei\t\t\t--exec=Datei\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i einzubindende_datei\t\t--include=einzubindende_datei\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l Bibliothek\t\t--load=Bibliothek\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[Datei]\t\t--pretty-print[=Datei]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p [Datei]\t\t--profile[=Datei]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Zum Berichten von Fehlern sehen Sie bitte den Punkt »Bugs«\n"
+"in »gawk.info«, den Sie als Kapitel »Reporting Problems and Bugs«\n"
+"in der gedruckten Version finden.\n"
+"\n"
+"Fehler in der Übersetzung senden Sie bitte als E-Mail an\n"
+"translation-team-de@lists.sourceforge.net\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk ist eine Sprache zur Suche nach und dem Verarbeiten von Mustern.\n"
+"Normalerweise ließt das Programm von der Standardeingabe und gibt\n"
+"auf der Standardausgabe aus.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Beispiele:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright © 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Dieses Programm ist Freie Software. Sie können es unter den Bedingungen\n"
+"der von der Free Software Foundation veröffentlichten GNU \n"
+"General Public License weitergeben und/oder ändern.\n"
+"Es gilt Version 2 dieser Lizenz oder (nach Ihrer Wahl) irgendeine\n"
+"spätere Version.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Dieses Programm wird weitergegeben in der Hoffnung, dass es nützlich ist,\n"
+"aber OHNE JEDE GEWÄHRLEISTUNG; nicht einmal mit der impliziten Gewähr-\n"
+"leistung einer HANDELBARKEIT oder der EIGNUNG FÜR EINEN BESTIMMTEN ZWECK.\n"
+"Sehen Sie bitte die GNU General Public License für weitere Details.\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Sie sollten eine Kopie der GNU General Publice License zusammen mit\n"
+"diesem Programm erhalten haben. Wenn nicht, lesen Sie bitte\n"
+"http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft setzt FS im POSIX-awk nicht auf Tab"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: Argument „%s“ von »-v« ist nicht in der Form »Variable=Wert«\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "„%s“ ist kein gültiger Variablenname"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "„%s“ ist kein Variablenname, es wird nach der Datei »%s=%s« gesucht"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr ""
+"die eingebaute Funktion „%s“ kann nicht als Variablenname verwendet werden"
+
+# c-format
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "Funktion „%s“ kann nicht als Name einer Variablen verwendet werden"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "Fließkomma-Ausnahme"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "Fataler Fehler: interner Fehler"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "Fataler Fehler: interner Fehler: Speicherbegrenzungsfehler"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "Fataler Fehler: interner Fehler: Stapelüberlauf"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "Kein bereits geöffneter Dateideskriptor %d"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "/dev/null konnte nicht für Dateideskriptor %d geöffnet werden"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "Das leere Argument für »--source« wird ignoriert"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "»--posix« hat Vorrang vor »--traditional«"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr ""
+"-M wurde ignoriert: die Unterstützung von MPFR/GMP wurde nicht eingebaut"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: Die Option »-W %s« ist unbekannt und wird ignoriert\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: Die Option %c erfordert ein Argument\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "PREC Wert »%.*s« ist ungültig"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "BINMODE Wert »%.*s« ist ungültig"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: das Argument ist keine Zahl"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): ein negativer Wert ist unzulässig"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg): Dezimalteil wird abgeschnitten"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "cmpl(%Zd): Negative Werte sind unzulässig"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: das Argument Nr. %d ist keine Zahl"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr ""
+"%s: Argument Nr. %d hat den ungültigen Wert %Rg, es wird stattdessen 0 "
+"verwendet"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: der negative Wert %2$Rg in Argument Nr. %1$d ist unzulässig"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: der Nachkommateil %2$Rg in Argument Nr. %1$d wird abgeschnitten"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%1$s: der negative Wert %3$Zd in Argument Nr. %2$d ist unzulässig"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "Kommandozeile:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "Der typisierte Regex konnte nicht erzeugt werden"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "Das alte awk unterstützt die Escapesequenz »\\%c« nicht"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX erlaubt keine »\\x«-Escapes"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "In der »\\x«-Fluchtsequenz sind keine hexadezimalen Zahlen"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"Die Hex-Sequenz \\x%.*s aus %d Zeichen wird wahrscheinlich nicht wie "
+"gewünscht interpretiert"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "Fluchtsequenz »\\%c« wird wie ein normales »%c« behandelt"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Es wurden unbekannte Multibyte-Daten gefunden. Ihre Daten entsprechen "
+"neventuell nicht der gesetzten Locale"
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr ""
+"%s %s „%s“: Die Kennungen des Dateideskriptors konnten nicht abgefragt "
+"werden: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr ""
+"%s %s „%s“: close-on-exec konnte nicht gesetzt werden: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "„%s“ konnte nicht zum Schreiben geöffnet werden: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "Das Profil wird auf der Standardfehlerausgabe ausgegeben"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s Regel(n)\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regel(n)\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "Interner Fehler: %s mit null vname"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "Interner Fehler: eingebaute Fuktion  mit leerem fname"
+
+#: profile.c:1302
+#, fuzzy, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"\t# Erweiterungen geladen (-l und/oder @load)\n"
+"\n"
+
+#: profile.c:1333
+#, fuzzy, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\t# Erweiterungen geladen (-l und/oder @load)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# gawk-Profil, erzeugt %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funktionen in alphabetischer Reihenfolge\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: unbekannter Umlenkungstyp %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "Fluchtsequenz »\\%c« wird wie ein normales »%c« behandelt"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr ""
+"Regulärer-Ausdruck-Komponente »%.*s« sollte wahrscheinlich »[%.*s]« sein"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "nicht geschlossene ["
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "ungültige Zeichenklasse"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "Die Syntax für Zeichenklassen ist [[:space:]], nicht [:space:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "nicht beendetes \\ Escape"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "Ungültiger Inhalt von \\{\\}"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "Regulärer Ausdruck ist zu groß"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "nicht geschlossene ("
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "keine Syntax angegeben"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr "nicht geöffnete )"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: Option „%s“ ist mehrdeutig; Mögliche Bedautung:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: Die Option »--%s« hat keine Argumente\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: Die Option »%c%s« hat keine Argument\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: Die Option „%s“ erfordert ein Argument\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: Die Option »--%s« ist unbekannt\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: Die Option »%c%s« ist unbekannt\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: Ungültige Option -- »%c«\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s Die Option »%c« erfordert ein Argument\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: Die Option »-W %s« ist mehrdeutig\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: Die Option »-W %s« hat keine Argumente\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: Die Option »-W %s« erfordert ein Argument\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Erfolg"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Kein Treffer"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ungültiger Regulärer Ausdruck"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ungültiges Zeichen"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ungültiger Name für eine Zeichenklasse"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Angehängter Backslash"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Ungültige Rück-Referenz"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [., oder [= werden nicht geschlossen"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( oder \\( werden nicht geschlossen"
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ wird nicht geschlossen"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ungültiger Inhalt von \\{\\}"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ungültiges Bereichsende"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Kein freier Speicher mehr vorhanden"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Vorangehender regulärer Ausdruck ist ungültig"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Vorzeitiges Ende des regulären Ausdrucks"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Regulärer Ausdruck ist zu groß"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") oder \\) werden nicht geöffnet"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Kein vorangehender regulärer Ausdruck"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr ""
+"Funktion „%s“: Funktionsname „%s“ kann nicht als Parametername benutzt werden"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "der Hauptkontext kann nicht entfernt werden"
+
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "setenv (TZ, %s) ist fehlgeschlagen (%s)"
+
+#~ msgid "setenv(TZ, %s) restoration failed (%s)"
+#~ msgstr "die Wiederherstellung von setenv (TZ, %s) ist fehlgeschlagen (%s)"
+
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "unsetenv(TZ) ist gescheitert (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "Backslash am Ende der Zeichenkette"
+
+#~ msgid "`isarray' is deprecated. Use `typeof' instead"
+#~ msgstr "„isarray” ist veraltet, verwenden statt dessen „typeof”"
+
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: das dritte Argument %g wird als 1 interpretiert"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "»extension« ist eine gawk-Erweiterung"
+
+#~ msgid "extension: received NULL lib_name"
+#~ msgstr "extension: NULL lib_name erhalten"
+
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "extension: Bibliothek „%s“ kann nicht geöffnet werden (%s)"
+
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr ""
+#~ "extension: Bibliothek „%s“: definiert »plugin_is_GPL_compatible« nicht "
+#~ "(%s)"
+
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr ""
+#~ "extension: Bibliothek „%s“: Funktion „%s“ kann nicht aufgerufen werden "
+#~ "(%s)"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "Erweiterung: Funktionsname fehlt"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: unzulässiges Zeichen »%c« in Funktionsname „%s“"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: Funktion „%s“ kann nicht neu definiert werden"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: Funktion „%s“ wurde bereits definiert"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension: Funktion „%s“ wurde bereits vorher definiert"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr ""
+#~ "extension: die eingebaute Funktion „%s“ kann nicht als Funktionsname "
+#~ "verwendet werden"
+
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr ""
+#~ "chdir: Aufgruf mit einer ungültigen Anzahl von Argumenten, 1 wird erwartet"
+
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "stat: Aufruf mit falscher Anzahl Argumenten"
+
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "statvfs: Aufruf mit falscher Anzahl von Argumenten"
+
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "fnmatch: Aufruf mit weniger als drei Argumenten"
+
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "fnmatch: Aufruf mit mehr als drei Argumenten"
+
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "fork: Aufruf mit zu vielen Argumenten"
+
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "waitpid: Aufruf mit zu vielen Argumenten"
+
+#~ msgid "wait: called with no arguments"
+#~ msgstr "wait: Aufruf ohne Argumente"
+
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "wait: Aufruf mit zu vielen Argumenten"
+
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "ord: Aufruf mit yu vielen Argumenten"
+
+#~ msgid "ord: called with no arguments"
+#~ msgstr "ord: Aufruf ohne Argumente"
+
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "chr: Aufruf mit zu vielen Argumenten"
+
+#~ msgid "chr: called with no arguments"
+#~ msgstr "chr: Aufruf ohne Argumente"
+
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "readfile: Aufruf mit zu vielen Argumenten"
+
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "writea: Aufruf mit zu vielen Argumenten"
+
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "reada: Aufruf mit zu vielen Argumenten"
+
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "gettimeofday: die Argumente werden ignoriert"
+
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sleep: Aufruf mit zu vielen Argumenten"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "unbekannter Wert für eine Feldangabe: %d\n"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr ""
+#~ "Funktion „%s“ wird als Funktion definiert, die nie mehr als %d "
+#~ "Argument(e) akzeptiert"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "Funktion „%s“: fehlendes Argument #%d"
diff --git a/gawk-5.0.1/po/en@boldquot.header b/gawk-5.0.1/po/en@boldquot.header
new file mode 100644
index 00000000000..fedb6a06d12
--- /dev/null
+++ b/gawk-5.0.1/po/en@boldquot.header
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
diff --git a/gawk-5.0.1/po/en@quot.header b/gawk-5.0.1/po/en@quot.header
new file mode 100644
index 00000000000..a9647fc35c3
--- /dev/null
+++ b/gawk-5.0.1/po/en@quot.header
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
diff --git a/gawk-5.0.1/po/es.po b/gawk-5.0.1/po/es.po
new file mode 100644
index 00000000000..1fd5061e893
--- /dev/null
+++ b/gawk-5.0.1/po/es.po
@@ -0,0 +1,4165 @@
+# Mensajes en español para gawk-4.2.0e.
+# Copyright (C) 2001 - 2018 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Cristian Othón Martínez Vera <cfuga@cfuga.mx>, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012.
+# Javier <fserrador@gmail.com>, 2018.
+# Francisco Javier Serrador <fserrador@gmail.com>, 2018.
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.2.0e\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2018-03-24 17:48+0200\n"
+"Last-Translator: Francisco Javier Serrador <fserrador@gmail.com>\n"
+"Language-Team: Spanish <es@tp.org.es>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "desde %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "trata emplear un valor escalar como una matriz"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "trata utilizar parámetro escalar «%s» como una matriz"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "trata utilizar el escalar «%s» como una matriz"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "trata utilizar la matriz «%s» en un contexto escalar"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: índice «%.*s» no dentro de la matriz «%s»"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "trata utilizar `%s[«%.*s»]' escalar como una matriz"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: el primer argumento no es una matriz"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: el segundo argumento no es una matriz"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: el segundo argumento no es una matriz"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: el primer argumento no es una matriz"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: el primer argumento no es una matriz"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: no se puede usar una submatriz del primer argumento para el segundo "
+"argumento"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: no se puede usar una submatriz del primer argumento para el segundo "
+"argumento"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: no se puede usar una submatriz del segundo argumento para el primer "
+"argumento"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: no se puede usar una submatriz del segundo argumento para el primer "
+"argumento"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "«%s» es inválido como un nombre de función"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "la función de comparación de ordenamiento «%s» no está definida"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "bloques %s deben tener una parte de acción"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "cada regla debe tener un patrón o una parte de acción"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "el awk antiguo no admite reglas `BEGIN' o `END' múltiples"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "«%s» es una función interna, no puede ser redefinida"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr ""
+"la constante de expresión regular `//' parece un comentario de C++, pero no "
+"lo es"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "expreg constante `/%s/' parece como un comentario de C, pero no lo es"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "valores case duplicados en el cuerpo de un switch: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "se detectó un `default' duplicado en el cuerpo de un switch"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "no se permite `break' fuera de un bucle o switch"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "`continue' no se permite fuera de un bucle"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "se usó `next' en la acción %s"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "se usó `nextfile' en la acción %s"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "se usó `return' fuera del contexto de la función"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"el `print' simple en la regla BEGIN o END probablemente debe ser `print \"\"'"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "`delete' no está permitida con SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "`delete' no está permitida con FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "`delete(array)' es una extensión de tawk que no es transportable"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "las líneas de tuberías de dos vías multiestado no funcionan"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "expreg del lado derecho de asignación"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "expreg `~' o `!~' a la izquierda del operador"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr ""
+"el awk antiguo no admite la palabra clave `in' excepto después de `for'"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "expreg del lado derecho de comparación"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "`getline' no redirigido es inválido dentro de regla «%s»"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "`getline' no redirigido indefinido dentro de la acción de END"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "el awk antiguo no admite matrices multidimensionales"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "la llamada de `length' sin paréntesis no es transportable"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "las llamadas indirectas a función son una extensión de gawk"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"la variable especial «%s» no se puede usar como llamada indirecta a función"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "trata utilizar una no-función «%s» dentro de llamada de función"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "expresión de subíndice inválida"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "aviso: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fatal: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "nueva línea o fin de la cadena inesperados"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "no puede abrir el fichero fuente «%s» para lectura (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "no puede abrir biblioteca «%s» compartida para lectura (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "razón desconocida"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "no puede incluir «%s» y emplearla como un fichero de programa"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "ya se incluyó el fichero fuente «%s»"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "ya caargada la biblioteca compartida «%s»"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include es una extensión de gawk"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "nombre de fichero vacío después de @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load es una extensión de gawk"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "nombre de fichero vacío después de @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "texto de programa vacío en la línea de órdenes"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "no puede leer el fichero fuente «%s» (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "el fichero fuente «%s» está vacío"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "Error PEBKAC: carácter inválido '\\%03o' en código fuente"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "el fichero fuente no termina con línea nueva"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "expreg sin terminar finaliza con `\\` al final del fichero"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"%s: %d: el modificador de expresión regular `/…/%c` de tawk no funciona en "
+"gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"el modificador de expresión regular `/…/%c` de tawk no funciona en gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "expreg sin terminar"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "expreg sin terminar al final del fichero"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "la utilización de la continuación de línea `\\ #…' no es transportable"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "barra invertida no es el último caracter en la línea"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "matrices multidimensionales son una extensión de gawk"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX no permite el operador `**='"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "el awk antiguo no admite el operador `**='"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX no permite el operador `**'"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "el awk antiguo no admite el operador `**'"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "el operador `^=' no se admite en el awk antiguo"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "el operador `^' no se admite en el awk antiguo"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "cadena sin terminar"
+
+#: awkgram.y:4048 main.c:1220
+#, fuzzy
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX no permite `\\x' como escapes"
+
+#: awkgram.y:4050 node.c:453
+#, fuzzy
+msgid "backslash string continuation is not portable"
+msgstr "la utilización de la continuación de línea `\\ #…' no es transportable"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "carácter «%c» inválido en la expresión"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "«%s» es una extensión de gawk"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX no permite «%s»"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "«%s» no se admite en el awk antiguo"
+
+#: awkgram.y:4494
+#, fuzzy
+msgid "`goto' considered harmful!"
+msgstr "¡`goto' se considera dañino!\n"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d es inválido como número de argumentos para %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s: la literal de cadena como último argumento de substitute no tiene efecto"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "el tercer argumento de %s no es un objecto modificable"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: el tercer argumento es una extensión de gawk"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: el segundo argumento es una extensión de gawk"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"la utilización de dcgettext(_\"…\") es incorrecta: quite el subrayado inicial"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"la utilización de dcngettext(_\"…\") es incorrecta: quite el subrayado "
+"inicial"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "indizado: expreg constante como segundo argumento no está permitido"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "función «%s»: parámetro «%s» oscurece la variable global"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "no se puede abrir «%s» para escritura (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "se envía la lista de variables a la salida común de error"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: fallado close (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "¡se llamó shadow_funcs() dos veces!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "hay variables opacadas."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "el nombre de función «%s» se definió previamente"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr ""
+"función «%s»: no se puede usar un nombre de función como nombre de parámetro"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"función «%s»: no se puede usar la variable especial «%s» como un parámetro "
+"de función"
+
+#: awkgram.y:5092
+#, fuzzy, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "función «%s»: parámetro «%s» oscurece la variable global"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "función «%s»: parámetro #%d, «%s», duplica el parámetro #%d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "se llamó a la función «%s» pero nunca se definió"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "se definió la función «%s» pero nunca se llamó directamente"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "expreg constante para el parámetro #%d da un valor booleano"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"se llamó a la función «%s» con espacio entre el nombre y el `(',\n"
+"o se usó como una variable o una matriz"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "se intentó una división entre cero"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "se intentó una división entre cero en `%%'"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"no puede asignar un valor al resultado de un campo expresión post-intremental"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "objetivo inválido de asignación (codigo op %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "@include es una extensión de gawk"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "fallado %s a «%s» (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "salida común"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "error común"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: se recibió un argumento que no es númerico"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: el argumento %g está fuera de rango"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: no se puede tirar: se abrió la tubería «%.*s» para lectura, no para "
+"escritura"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: no se puede tirar: fichero «%.*s» abierto para lectura, no para "
+"escritura"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: no se puede tirar el fichero «%.*s»: %s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: no se puede vaciar: tubería dos vías «%.*s» ha cerado final de "
+"escritura"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: «%.*s» no es un fichero abierto, tubería o co-proceso"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: el primer argumento recibido no es una cadena"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: el segundo argumento recibido no es una cadena"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: se recibió un argumento que no es númerico"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: se recibió un argumento de matriz"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "`length(array)' es una extensión de gawk"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: se recibió un argumento que no es una cadena"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: se recibió un argumento que no es númerico"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: se recibió el argumento negativo %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "fatal: se debe utilizar `count$' en todos los formatos o en ninguno"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "anchura del campo ignorada para `%%' como especificador"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "precisión está ignorada para `%%' especificador"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr ""
+"anchura y orecisión del campo son ignorados para `%%' como especificador"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fatal: no se permite `$' en los formatos de awk"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fatal: la cuenta de argumentos con `$' debe ser > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"fatal: cuenta arg %ld es mayor que el número total de argumentos "
+"proporcionados"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fatal: no se permite `$' después de un punto en el formato"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+"fatal: no se proporciona `$' para la anchura o la precisión del campo "
+"posicional"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "`l' no tiene significado en los formatos de awk; se descarta"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fatal: no se permite `l' en los formatos POSIX de awk"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "`L' no tiene significado en los formatos de awk; se descarta"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fatal: no se permite `L' en los formatos POSIX de awk"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "`h' no tiene significado en los formatos de awk; se descarta"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fatal: no se permite `h' en los formatos POSIX de awk"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: el valor %g es demasiado grande para el formato %%c"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: el valor %g no es un ancho de carácter válido"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: el valor %g está fuera del rango para `%%%c' como formato"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: el valor %g está fuera del rango para `%%%c' como formato"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"se descarta el carácter especificador de formato `%c' desconocido: no se "
+"convirtió ningún argumento"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr ""
+"fatal: no hay suficientes argumentos para satisfacer a la cadena de formato"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "se acabó ^ para éste"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: el especificador de formato no tiene letras de control"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "se proporcionaron demasiados argumentos para la cadena de formato"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: sin argumentos"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: sin argumentos"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"printf: intenta escribir a final de escritura cerrada de dos tuberías de vía "
+"doble"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: se recibió un argumento que no es un númerico"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: se llamó con el argumento negativo %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: la longitud %g no es >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: la longitud %g no es >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: se truncará la longitud no entera %g"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+"substr: la longitud %g es demasiado grande para ser índice de cadena, se "
+"trunca a %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: el índice de inicio %g es inválido, se usa 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: se truncará el índice de inicio no entero %g"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: la cadena de origen es de longitud cero"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: el índice de inicio %g está después del fin de la cadena"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: la cadena %g en el índice de inicio %g excede la longitud del primer "
+"argumento (%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr ""
+"strftime: el valor de formato en PROCINFO[\"strftime\"] tiene tipo numérico"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: el segundo argumento recibido no es númerico"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr ""
+"strftime: el segundo argumento es menor que 0 o demasiado grande para time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: segundo argumento fuera de rango para tiempo time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: el primer argumento recibido no es una cadena"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: se recibió una cadena de formato vacía"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: se recibió un argumento que no es una cadena"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr ""
+"mktime: por lo menos uno de los valores está fuera del rango por defecto"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "función 'system' no se permite en modo sandbox"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: se recibió un argumento que no es una cadena"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"print: intenta escribir a final de escritura cerrada de tubería de vía doble"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "referencia al campo sin inicializar `$%d'"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: se recibió un argumento que no es una cadena"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: se recibió un argumento que no es una cadena"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: el primer argumento recibido no es númerico"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: el segundo argumento recibido no es númerico"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: se recibió un argumento que no es númerico"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: se recibió un argumento que no es númerico"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: se recibió un argumento que no es númerico"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: el tercer argumento no es una matriz"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: el tercer argumento `%.*s' tratado como 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: puede ser llamado indirectamente solo con dos argumentos"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "llamada indirecta a %s requiere al menos dos argumentos"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: el primer argumento recibido no es númerico"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: el segundo argumento recibido no es númerico"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): los valores negativos no están permitidos"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): valores fraccionarios serán truncados"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"lshift(%f, %f): valor de desplazamiento demasiado grande dará resultados "
+"extraños"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: el primer argumento recibido no es númerico"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: el segundo argumento recibido no es númerico"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): valores negativos no están permitidos"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): valores fraccionarios serán truncados"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"rshift(%f, %f): un valor de desplazamiento muy grande dará resultados "
+"extraños"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: llamado con menos de dos argumentos"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "y: argumento %d es no-numérico"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "y: argumento negativo %d valorador %g no está permitido"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "o: llamado con menos de dos argumentos"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "o: argumento %d es no numérico"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "o: argumento negativo %d valorador %g no está permitido"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "oex: llamado con menos de dos argumentos"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "oex: argumento %d es no-numérico"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "oex: argumento negativo %d valorado %g no está permitido"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: se recibió un argumento que no es númerico"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): valor negativo no está permitido"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): valor fraccional será truncado"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: «%s» no es una categoría local válida"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv: tercer argumento no es una matriz"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv: primer argumento recibido es no-númerico"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv: segundo argumento recibido no es númerico"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv: intentado división entre cero"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: el segundo argumento no es una matriz"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+"typeof detectado inválidas marcas combinadas «%s»; envíe un reporte de "
+"defecto."
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "tipode: tipo de argumento inválido «%s»"
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "tipode: tipo de argumento inválido «%s»"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Tecla de estado(s) (g)awk. Termina con la orden «end»\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "número de marco inválido: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: opción inválida -- «%s»"
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "fuente «%s»: ya originados."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "guarda «%s»: orden no permitida."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr "No puede emplear «órdenes» para órdens de puntos de ruptura/vigías"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "ningún punto de ruptura/vigía ha sido establecida aún"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "número de punto de ruptura/vigía inválido"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Teclee órdenes para cuando %s %d es alcanzado, uno por línea.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Finaliza con la orden «end»\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "`end' válido solo en orden `commands' o `eval'"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "`silent' válido solo en orden `commands'"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "traza: opción inválida - «%s»"
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condición: número de punto de ruptura/vigía inválido"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "argumento no una cadena"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "opción: parámetro inválido - «%s»"
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "sin tal función - «%s»"
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "activar: opción inválida - «%s»"
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "especificación de rango inválido: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "valor no numérico para número de campo"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "valor no numérico encontrado, numérico esperado"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "valor entero distinto de cero"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - escribe traza de todo o N más internos (externos si N < 0) "
+"marcos."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[nombre-fichero:]N]|función] - establece punto de ruptura en la "
+"localización especificada."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+"clear [[nombrefichero:]N|función] - borra puntos de ruptura anteriormente "
+"puestos."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [núm] - inicia una lista de órdenes para ser ejecutadas en un punto "
+"de ruptura(vigia) alcanzado."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition núm [expr] - establece o vacía punto condicional de ruptura o "
+"vigía."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [CONTADOR] - continúa programa siendo depurado."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+"delete [puntos_ruptura] [rango] - borra puntos de rupturas especificados."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+"disable [puntos_ruptura] [rango] - desactiva puntos de ruptura especificado."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+"display [var] - escribe valor de variable cada tiempo que el programa se "
+"detiene."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - baja N marcos de pila."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr "dump [nombre-fichero] - vuelca intrucciones al fichero o salida común."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [unitario|borra] [puntos_ruptura] [rango] - activa puntos de ruptura "
+"especificado."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - finaliza una lista de órdenes o declaraciones awk."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval stmt|[p1, p2, …] - evalua sentencia(s) awk."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (lo mismo que quit) sale del depurador."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - ejecuta hasta marco de pila seleccionada devuelve."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - selecciona y esscribe número N de marco de pila."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr "help [mandato] - escribe lista de mandato o explicación de mandato."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+"ignora N CONTADOR - establece cuenta-ignora de núemro N de puntos de ruptura "
+"a CONTADOR."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"tópico info - fuente|fuentes|variables|funciones|ruptura|marco|args|locales|"
+"pantalla|visor."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[filename:]lineno|function|range] - lista línea(s) específica(s)."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+"next [CONTADOR] - paso programado, procediendo a través de llamadas a "
+"subrutina."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [CONTADOR] - un paso de instrucción, pero procedido por llamadas a "
+"subrutina."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr ""
+"option [nombre[=valor]] - establecer o enseñar opcione(s) depuradora(s)."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [var] - escribe valor de una variable o matriz."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "formato printf, [arg], … - salida formateada."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - sale del depurador."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr "return [valor] - crea marco de pila seleccionada a su llamador."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - iniciar o reiniciar ejecución del programa."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save nombrefichero - guarda órdenes desde la sesión al fichero."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set var = valor - asigna valor a una variable escalar."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - suspende mensaje usual cuando detenga en un punto de ruptura/vigía."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "fichero fuente - ejecuta órdenes desde fichero."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [CONTADOR] - paso de programa hasta que alcance una línea de la fuente "
+"distinta."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [CONTADOR] - paso de una instrucción exactamente."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr ""
+"tbreak [[nombrefchero:]N|función] - establece un punto de ruptura temporal."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - escribe instrucciones antes de ejecutar."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr "undisplay [N] - quita variable(s) de la lista vista automática."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"hasta [[nombre-fichero:]N|función] - ejecuta hasta que el programa alcanza "
+"una línea diferente o línea N dentro del marco actual."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - quita variable(s) de la lista de vigía."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - sube N marcos de pila."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch var - establece un punto de vigía para una variable."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where [N] - (lo mismo que traza anterior) escribe traza de todo o N más "
+"marcos internos\n"
+"            (externos si N < 0)."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "no puede leer orden (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "no puede leer orden (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "carácter inválido en orden"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "orden desconocidoa - «%.*s», intente ayuda"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "carácter inválido"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "orden no definida: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+"establece o muestra el número de líneas para conservar en el fichero "
+"histórico."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "establece o muestra la lista de ventana de tamaño de orden."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "establece o muestra fichero de salida gawk."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "establece o muestra petición del depurador."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+"(des)establece o muestra guardando de histórico de órdenes (valor=on|off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "(des)establece o muestra guardando de opciones (valor=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr ""
+"(des)establecer o mostrar instrucción trazada (valor=encendido|apagado)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "programa no ejecutando."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "no puede leer el fichero fuente «%s» (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "el fichero fuente «%s» está vacío.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "sin actual fichero fuente."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "no puede encontrar fichero fuente nombrado «%s» (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+"CUIDADO: fichero fuente «%s» modificado desde la compilación del programa.\n"
+" \n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "número lineal %d fuera de límite; «%s» tiene %d líneas"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "fdl inesperado mientras leía el fichero «%s», línea %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "fichero origen «%s» modificó desde inicio de ejecución programada"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Fichero fuente actual: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Número de líneas: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Fichero fuente (líneas): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Número   Disp  Activado  Localización\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tnº de alcances = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tignora siguiente punto %ld\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tdetiene confición: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tórdenes:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Marco actual: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Llamado por marco: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Llamador del marco: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Ninguno en main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Sin argumentos.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Sin locales.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Todas las variables definidas:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Todas las funciones definidas:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Autoenseñar varibles:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Vigilar variables:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "sin símbolo «%s» en contexto actual\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "«%s» no es una matriz\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = campo no inicializado\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr ""
+"matriz «%s» está vacía\n"
+"\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[«%.*s»] no dentro de matriz «%s»\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "`%s[\"%.*s\"]' no es una matriz\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "«%s» no es una variable escalar"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "trata utilizar la matriz `%s[\"%.*s\"]' en un contexto escalar"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "trata usar el escalar `%s[\"%.*s\"]' como una matriz"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "`%s' es una función"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "punto de vigía %d es incondicional\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "No enseña ítem numerado %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Sin vista ítem numerado %ld"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d:[\"%.*s\"] no está en la matriz «%s»\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "trata emplear un valor escalar como una matriz"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr "Punto vigía %d borrado porque parámetro está fuera del visor.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "Pantalla %d eliminada porque parámetro está fuera del visor.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " en fichero «%s», línea %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " en «%s»:%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld    en "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Más pilas de marcos continuan …\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "número de marco inválido"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: punto ruptura %d (activado, ignore siguiente %ld puntos), también "
+"establece en %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Nota: punto de ruptura %d (activado), también establce en %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: punto ruptura %d (desactivado, ignore siguiente %ld punto), también "
+"establece en %s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Nota: punto de ruptura %d (desactivado), también establce en %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Punto de ruptura %d establece un fichero «%s», línea %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "No puede establecer punto de ruptura en el fichero «%s»\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "número lineal %d en el fichero «%s» fuera de rango"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "¡¡¡No puede encontrar regla!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "No puede establecer punto de ruptura en «%s»: %d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "No puede establecer punto de ruptura en la función «%s»\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr ""
+"punto de ruptura %d establece un fichero «%s», línea %d es incondicional\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Punto de ruptura borrado %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "Sin punto de ruptura(s) en asiento a función «%s»\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Sin punto de ruptura en fichero «%s», línea #%d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "número de punto de ruptura inválido"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "¿Borro todos los puntos de ruptura? (s o n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "s"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Ignorará siguiente %ld cruzado de punto de ruptura %d.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "Detendrá siguiente tiempo de ruptura %d es alcanzado.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "Puede solo depurar programas proporcionados con la opción `-f'.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Fallado al reiniciar depurador"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Programa ya ejecutando. ¿Reiniciar desde el principio (s/n)? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Programa no reiniciado\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "error: no puede reiniciar, operación no permitida\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "error (%s): no puede reiniciar, ignorando resto de las órdenes\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Programa iniciado: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Programa terminado abnormalmente con valor de salida: %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Programa terminado normalmente con valor de salida: %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "El programa está ejecutando. ¿Sale de todas formas (s/n)? "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "No detenido en cualquier punto de ruptura; argumento ignorado.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "número de punto de ruptura inválido %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Ignorará siguientes %ld cruzados de puntos de ruptura %d.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "'finish' no significado dentro del marco externo main()\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Ejecutar hasta devolver desde "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "'retorno' no significativo en el marco externo main()\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "No puede encontrar localicación dentro de función `%s'\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "línea %d de fuente inválida en el fichero «%s»"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "No puede encontrar localicación %d especificada en el ficheor «%s»\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "elemento no dentro de matriz\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "variable no tipada\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Deteniendo en %s …\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "'terminación' no significante con omisión no local «%s»\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "'hasta' no significante con omisión no local «%s»\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t---[Intro] para continuar o q [Intro] para quitar---"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[«%.*s»] no dentro de matriz «%s»"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "enviando salida a stdout\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "número inválido"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "`%s' no permitido en contexto actual; declaración ignorada"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "`return' no permitido en contexto actual; declaración ignorado"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Ningún símbolo «%s» en contexto actual"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "tipo de nodo %d desconocido"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "código de operación %d desconocido"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "código operacional %s no es un operador o una palabra clave"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "desbordamiento de almacenamiento temporal en genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Pila de Llamadas de Funciones:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "`IGNORECASE' es una extensión de gawk"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "`BINMODE' es una extensión de gawk"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "BINMODE evaluado «%s» es inválido, tratado como 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "especificación «%sFMT» equivocada «%s»"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "se desactiva `--lint' debido a una asignación a `LINT'"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "referencia al argumento sin inicializar «%s»"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "referencia a la variable sin inicializar «%s»"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "trata una referencia de campo desde un valor que no es númerico"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "trata una referencia de campo desde una cadena nula"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "trata acceder al campo %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "referencia al campo sin inicializar `$%ld'"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "se llamó a la función «%s» con más argumentos de los declarados"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: tipo inesperado «%s»"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "se intentó una división entre cero en `/='"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "se intentó una división entre cero en `%%='"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "no se permiten las extensiones en modo sandbox"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @carga son extensiones gawk"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: recibido lib_name NULO"
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: no se puede abrir biblioteca «%s» (%s)\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: la biblioteca «%s»: no define `plugin_is_GPL_compatible' (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: biblioteca «%s»: no puede llamar a la función «%s» (%s)\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: inicialización de biblioteca «%s» de rutina «%s» fallada\n"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: falta nombre de función"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: no se puede utilizar la orden interna de gawk «%s» como nombre "
+"de función"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: no se puede utilizar la orden interna de gawk «%s» como nombre "
+"de función"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: no puede redefinir función «%s»"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: función «%s» ya definida"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: nombre de función «%s» anteriormente definida"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: cuenta de argumento negativa para la función «%s»"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+"función «%s»: argumento #%d: se intentó usar un escalar como una matriz"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr ""
+"función «%s»: argumento #%d: se intentó usar una matriz como un escalar"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "la carga dinámica de biblioteca no compatible"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "estado: no se puede leer el enlace simbólico «%s»"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "estado: parámetros equivocados"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init: no pudo crear la variable %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "fts no es admitida en este sistema"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: no pudo crear matríz"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: no pudo establecer elemento"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: no pudo establecer elemento"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: no pudo establecer elemento"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: no pudo crear matríz"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: no pudo establecer elemento"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: llamado con el número incorrecto de argumento, esperando 3"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: primer parámetro equivocado"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: segundo parámetro equivocado"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: tercer parámetro equivocado"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: no pudo determinar matríz\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: ignorando seguimiento de marca FTS_NOSTAT."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: fts_array() fallado\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: no pudo obtener el primer argumento"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: no pudo obtener el segundo argumento"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: no pudo obtener el tercer argumento"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch no está implementado en este sistema\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: variable FNM_NOMATCHno no pudo añadirse"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: no pudo establecer elemento matricial %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: no pudo instalar matríz FNM"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: ¡PROCINFO no es una matriz!"
+
+#: extension/inplace.c:131
+#, fuzzy
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace_end: edición interna ya activa"
+
+#: extension/inplace.c:134
+#, fuzzy, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace_begin: espera 2 argumentos pero llamó con %d"
+
+#: extension/inplace.c:137
+#, fuzzy
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace_begin: no puede obtener 1º argumento como un nombre de fichero "
+"encadenado"
+
+#: extension/inplace.c:145
+#, fuzzy, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace_begin: desactivando edición en lugar para NOMBREFICHERO inválido «%s»"
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace_begin: no se puede declarar «%s» (%s)"
+
+#: extension/inplace.c:159
+#, fuzzy, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace_begin: `%s' no es un fichero regular"
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace_begin: mkstemp(`%s') fallado (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace_begin: chmod fallado (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace_begin: dup(stdout) fallado (%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_begin: dup2(%d, stdout) fallado (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace_begin: cierre(%d) fallado (%s)"
+
+#: extension/inplace.c:211
+#, fuzzy, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace_end: espera 2 argumentos pero llamó con %d"
+
+#: extension/inplace.c:214
+#, fuzzy
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace_end: no puede obtener 1º argumento como un nombre de fichero de "
+"cadena"
+
+#: extension/inplace.c:221
+#, fuzzy
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace_end: edición interna no activa"
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_end: dup2(%d, stdout) fallado (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace_end: cierre(%d) fallado (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace_end: fsetpos(stdout) fallado (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace_end: enlace(`%s', `%s') fallado (%s)"
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace_end: renombrar(`%s', `%s') fallado (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: llamado con argumento(s) inapropiado(s)"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: llamado con argumento(s) inapropiados"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: abrirdir/fdopendir fallado: %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: se llamó con familia equivocada de argumento"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: no pudo inicializar variable REVOUT"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: argumento 0 no es una cadena\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: argumento 1 no es una matriz\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: no pudo determinar matríz\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: no pudo publicar matríz aplanada\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "valor matiz tiene tipo %d desconocido"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: argumento 0 no es una cadena\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: argumento 1 no es una matriz\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_arrayel fallado\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: elemento set_array_element fallado\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+"tratando recuperar valor con código tipo %d desconocido como una cadena "
+"textual"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "no es compatible en esta plataforma"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: argumento numérico requerido faltante"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: argumento es negativo"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: no compatible en esta plataforma"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "registro entrante demadiado grande"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF definido a valor negativo"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: el cuarto argumento es una extensión de gawk"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: el cuarto argumento no es una matriz"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: el segundo argumento no es una matriz"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split: no se puede usar la misma matriz para el segundo y cuarto argumentos"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: no se puede usar una submatriz del segundo argumento para el cuarto "
+"argumento"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: no se puede usar una submatriz del cuarto argumento para el segundo "
+"argumento"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr ""
+"split: la cadena nula para el tercer argumento es una extensión de gawk"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: el cuarto argumento no es una matriz"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: el segundo argumento no es una matriz"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: el tercer argumento no debe ser nulo"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: no se puede usar la misma matriz para segundo y cuarto argumentos"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: no se puede usar una submatriz del segundo argumento para el "
+"cuarto argumento"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: no se puede usar una submatriz del cuarto argumento para el "
+"segundo argumento"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "`FIELDWIDTHS' es una extensión gawk"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "`*' debe ser el último designador en FIELDWIDTHS"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "valor de FIELDWIDTHS inválido, para campo %d, cercano a «%s»"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "la cadena nula para `FS' es una extensión de gawk"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "el awk antiguo no admite expresiones regulares como valor de `FS'"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "`FPAT' es una extensión de gawk"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: recibió retval nulo"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: no dentro del modo MPFR"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: MPFR incompatible"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: tipo numérico inválido «%d»"
+
+#: gawkapi.c:385
+#, fuzzy
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "load_ext: recibido lib_name NULO"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+"node_to_value: detectado marcas inválidas combinadas «%s»; envíe un reporte "
+"de defecto."
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: recibido nodo nulo"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: recibido valor nulo"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+"node_to_awk_value detectadas marcas inválidas combinadas «%s»; envíe un "
+"reporte de defecto."
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: matriz nula recibida"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: subescritura nula recibida"
+
+#: gawkapi.c:1217
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array_typed: no pudo convertir índice %d a %s\n"
+
+#: gawkapi.c:1222
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array_typed: no pudo convertir valor %d a %s\n"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr: MPFR no soportado"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "no puede encontrar final de regla BEGINFILE"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "no se puede abrir tipo de fichero no reconocido «%s» para «%s»"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "el argumento de la línea de órdenes «%s» es un directorio: se salta"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "no se puede abrir el fichero «%s» para lectura (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "cierre fallado en df %d («%s») (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "no se permite la redirección en modo sandbox"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "expresión dentro de redirección «%s» es un número"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "la expresión para la redirección «%s» tiene un valor de cadena nula"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"nombre del fichero «%.*s» para redirección «%s» quizá es un resultado de una "
+"expresión lógica"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "mezcla innecesaria de `>' y `>>' para el fichero `%.*s'"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file no puede crear una tubería «%s» con fd %d"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "no  puede abrir la tubería «%s» para la salida (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "no puede abrir la tubería «%s» para la entrada (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"creación de socket get_file incompatible en esta plataforma para «%s» con fd "
+"%d"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "no puede abrir la tubería de dos vías «%s» para entrada/salida (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "no se puede redirigir desde «%s» (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "no se puede redirigir a «%s» (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"se alcanzó el límite del sistema para ficheros abiertos: comenzando a "
+"multiplexar los descriptores de fichero"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "cierre fallado de «%s» (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "demasiadas tuberías o ficheros de entrada abiertos"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: el segundo argumento debe ser `to' o `from'"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: `%.*s' no es un fichero abierto, tubería o co-proceso"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "cierre de redirección que nunca se abrió"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: la redirección «%s» no se abrió con `|&', se descarta el segundo "
+"argumento"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "estado de fallo (%d) al cerrar la tubería de «%s» (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "estado de fallo (%d) al cerrar el fichero de «%s» (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "ningún cierre explícito de `socket' «%s» proporcionado"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "ningún cierre explícito de «%s» como co-proceso"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "ningún cierre explícito de tubería «%s» proporcionada"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "ningún cierre explícito del fichero «%s» proporcionado"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush: no se puede tirar salida común: %s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush: no se puede tirar error común: %s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "error al escribir en la salida común (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "error al escribir en la salida común de error (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "fallado la limpieza de la tubería de «%s» (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "vaciado fallado del co-proceso de la tubería a «%s» (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "fallado el vaciado del fichero de «%s» (%s)."
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "puerto local %s inválido en `/inet': %s"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "puerto local %s inválido en `/inet'"
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "anfitrión remoto e información de puerto (%s, %s) inválidos: %s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "anfitrión remoto e información de puerto (%s, %s) inválidos"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "TCP/IP para comunicaciones no son admitidas"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "no se puede abrir «%s», modo «%s»"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "cierre fallado del pty maestro (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "cierre de salida común fallada en el hijo (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"fallado el movimiento del pty esclavo a la salida común en el hijo (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "cierre fallado de entrada común en el hijo (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"fallado el movimiento del pty esclavo a la entrada común en el hijo (dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "cierre fallado del pty esclavo (%s)"
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr "no pudo crear el subproceso para o abrir pty"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr "fallado el movimiento a la salida común en el hijo (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+"fallado el movimiento de la tubería a la entrada común en el hijo (dup: %s)"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr "restauración saliente común en el proceso padre fallado\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr "restauración entrante común en el proceso padre fallado\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "cierre fallado de tubería (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "`|&' no admitido"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "no se puede abrir la tubería «%s» (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "no se puede crear el proceso hijo para «%s» (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+"getline: intenta leer desde final de lectura cerrada de tubería de vía doble"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: revibido puntero NULO"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"intérprete entrante «%s» en conflicto con intérprete entrante «%s» instalado "
+"anteriormente"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "interpretador entrante «%s» fallado para abrir «%s»"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: recibido puntero NULO"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"envoltorio saliente «%s» en conflicto con intérprete saliente «%s» instalado "
+"anteriormente"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "envoltorio saliente «%s» fallado al abrir «%s»"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: recibido puntero NULO"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"proceso de dos vías «%s» conflicto con previamente instalado proceso de dos "
+"vias «%s»"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "procesador «%s» de dos vías fallado para abrir «%s»"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "el fichero de datos «%s» está vacío"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "no se puede reservar más memoria de entrada"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "el valor multicaracter de `RS' es una extensión de gawk"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "IPv6 de comunicación no admitida"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+"la variable de ambiente `POSIXLY_CORRECT' definida: activando `--posix'"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "`--posix' se impone a `--traditional'"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "`--posix'/`--traditional' se imponen a `--non-decimal-data'"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "`--posix' sobrepone a `--character-as-bytes'"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "ejecutar %s como setuid root puede ser un problema de seguridad"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "no se puede establecer el modo binario entrante común (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "no se puede establecer el modo binario saliente común (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "no se puede establecer el modo binario de error común (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "¡No hay ningún programa de texto!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"Modo de empleo: %s [opciones estilo POSIX o GNU] -f fichprog [--] fichero …\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+"Modo de empleo: %s [opciones estilo POSIX o GNU] [--] %cprograma%c fichero "
+"…\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "Opciones POSIX:\t\tOpciones largas GNU: (común)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f fichprog\t\t--file=fichprog\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F sc\t\t\t--field-separator=sc\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=valor\t\t--assign=var=valor\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Opciones cortas:\t\tOpciones largas GNU: (extensiones)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[fichero]\t\t--dump-variables[=fichero]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[fichero]\t\t--debug[=fichero]\n"
+
+# Esta es la línea más larga de la lista de argumentos.
+# Probar con gawk para revisar tabuladores. cfuga
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'texto-prog'\t        --source='texto-prog'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E fichero\t\t--exec=fichero\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i ficheroinclusivo\t--incluide=ficheroincluido\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr ""
+"\t-l biblioteca\t\t--load=biblioteca\n"
+"\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[fichero]\t\t--profile[=fichero]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[fichero]\t\t--profile[=fichero]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Para indicar defectos, vea el nodo `Defectos' en `gawk.info'\n"
+"la cual es sección `Indicando Problemas y Defectos' en la\n"
+"versión escrita.  Esta misma información quizá está escrita\n"
+"en https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"POR FAVOR NO intente indicar defectos publicando en comp.lang.awk.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk es un lenguaje de reconocimiento y procesamiento de patrones.\n"
+"Por defecto lee la entrada común y escribe en la salida común.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Ejemplos:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' fichero\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"© 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Este programa es software libre; se puede redistribuir y/o modificar\n"
+"bajo los términos de la Licencia Pública General de GNU tal como es "
+"publicada\n"
+"por la Free Software Foundation; ya sea por la versión 3 de la Licencia, o\n"
+"(a su elección) cualquier versión posterior.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Este programa se distribuye con la esperanza que será útil,\n"
+"pero SIN NINGUNA GARANTÍA; aún sin la garantía implícita de\n"
+"COMERCIABILIDAD o IDONEIDAD PARA UN FIN DETERMINADO.  Vea la\n"
+"Licencia Pública General de GNU para más detalles.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Debería haber recibido una copia de la Licencia Pública General de GNU\n"
+"junto con este programa. Si no es así, vea http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft no establece FS a tabulador en el awk de POSIX"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: el argumento «%s» para `-v' no es de la forma `var=valor'\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "«%s» no es un nombre de variable legal"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "«%s» no es un nombre de variable, se busca el fichero `%s=%s'"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr ""
+"no se puede utilizar la orden interna de gawk «%s» como nombre de variable"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "no se puede usar la función «%s» como nombre de variable"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "excepción de coma flotante"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "error fatal: error interno"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "error fatal: error interno: falla de segmentación"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "error fatal: error interno: desbordamiento de pila"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "no existe el df %d abierto previamente"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "no se puede abrir previamente /dev/null para el df %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "argumento vacío para `-e/--source' ignorado"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "`--posix' se impone a `--traditional'"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M ignorado: aooyo MPFR/GMP no compilado dentro de"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: no se reconoce la opción `-W %s', se descarta\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: la opción requiere un argumento -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "Valor PREC «%.*s» es inválido"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "RNDMODE valorado `%.*s' es inválido"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: argumento no numérico recibido"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): valor negativo no está permitido"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "comp(%Rg): valor fraccionario será truncado"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): valores negativos no serán permitidos"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: argumento no-numérico recibido #%d"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: argumento #%d tiene valor inválido %Rg, utilizando 0"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: argumento #%d valor negativo %Rg no está permitido"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: argumento #%d valor fraccional %Rg serán truncados"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: argumento #%d valor negativo %Zd no está permitido"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "línea ord.:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "no pudo hacer expreg tipada"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "el awk antiguo no admite la secuencia `\\%c' de escape"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX no permite `\\x' como escapes"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "no hay dígitos hexadecimales en `\\x' como secuencia de escape"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"escape hexadecimal \\x%.*s de %d caracteres tal vez no se interprete de la "
+"forma esperada"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "la secuencia de escape `\\%c' tratada como una simple `%c'"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Se detectaron datos multibyte inválidos. Puede ser que no coincidan sus "
+"datos con su local."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr ""
+"%s %s «%s»: no se pueden obtener las opciones del fd: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s «%s»: no se puede establecer close-on-exec: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "no se puede abrir «%s» para escritura: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "se envía el perfil a la salida común de error"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s regla(s)\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regla(s)\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "error interno: %s con vname nulo"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "error interno: compilado con fname nulo"
+
+#: profile.c:1302
+#, fuzzy, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"\t# Extensiones cargadas (-l y/o @load)\n"
+"\n"
+
+#: profile.c:1333
+#, fuzzy, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\t# Extensiones cargadas (-l y/o @load)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# perfil de gawk, creado %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funciones, enumeradas alfabéticamente\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: tipo de redirección %d desconocida"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "la secuencia de escape `\\%c' tratada como una simple `%c'"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr ""
+"el componente de expresión regular `%.*s' probablemente debe ser `[%.*s]'"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "desbalanceado ["
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "clase de carácter inválido"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "sintaxis de clase de carácter es [[:espacio:]], no [:espacio:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "escape \\ no terminado"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "contenido inválido de \\{\\}"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "expresión regular demasiado grande"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "desbalanceado ("
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "sin sintaxis especificada"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ") desbalanceado"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: la opción '%s' es ambigua; posibilidades:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: la opción '--%s' no admite ningún argumento\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: la opción '%c%s' no admite ningún argumento\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: la opción '--%s' requiere un argumento\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: no se reconoce la opción '--%s'\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: no se reconoce la opción '%c%s'\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opción inválida -- «%c»\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: la opción requiere un argumento -- «%c»\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: la opción '-W %s' es ambigua\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: la opción '-W %s' no admite ningún argumento\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: la opción '-W %s' requiere un argumento\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Correcto"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "No hay coincidencia"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expresión regular inválida"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Caracter de ordenación inválido"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nombre de clase de caracter inválido"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barra invertida al final"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Referencia hacia atrás inválida"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [., o [= desemparejados"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Desemparajados ( o \\("
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Desemparejado \\{"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Contenido inválido de \\{\\}"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Final de rango inválido"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memoria agotada"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Expresión regular precedente inválida"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fin prematuro de la expresión regular"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Expresión regular demasiado grande"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") o \\) desemparejados"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "No hay una expresión regular previa"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr ""
+"función «%s»: no se puede usar una función «%s» como nombre paramétrico"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "no puede extraer por arriba el contexto principal"
+
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "setenv(TZ, %s) fallado (%s)"
+
+#~ msgid "setenv(TZ, %s) restoration failed (%s)"
+#~ msgstr "setenv(TZ, %s) restauración falladoa (%s)"
+
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "unsetenv(TZ) fallado (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "barra invertida al final de la cadena"
+
+#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'"
+#~ msgstr "referencia al elemento sin inicializar `%s[\"%.*s\"]'"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "el subíndice de la matriz `%s' es la cadena nula"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: vacío (nulo)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: vacío (cero)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: tamaño_tabla = %d, tamaño_matriz = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: array_ref a %s\n"
+
+#~ msgid "`nextfile' is a gawk extension"
+#~ msgstr "`nextfile' es una extensión de gawk"
+
+#~ msgid "`delete array' is a gawk extension"
+#~ msgstr "`delete array' es una extensión de gawk"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "`getline var' inválido dentro de la regla `%s'"
+
+#~ msgid "`getline' invalid inside `%s' rule"
+#~ msgstr "`getline' inválido dentro de la regla `%s'"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "uso de una matriz que no es matriz"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "`%s' es una extensión de Bell Labs"
+
+#~ msgid "and(%lf, %lf): negative values will give strange results"
+#~ msgstr "and(%lf, %lf): los valores negativos darán resultados extraños"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: el primer argumento recibido no es númerico"
+
+#~ msgid "or: received non-numeric second argument"
+#~ msgstr "or: el segundo argumento recibido no es númerico"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): los valores negativos darán resultados extraños"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): los valores fraccionarios serán truncados"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: el primer argumento recibido no es númerico"
+
+#~ msgid "xor: received non-numeric second argument"
+#~ msgstr "xor: el segundo argumento recibido no es númerico"
+
+#~ msgid "xor(%lf, %lf): negative values will give strange results"
+#~ msgstr "xor(%lf, %lf): los valores negativos darán resultados extraños"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): los valores fraccionarios se truncarán"
+
+#~ msgid "can't use function name `%s' as variable or array"
+#~ msgstr ""
+#~ "no se puede usar el nombre de la función `%s' como variable o matriz"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "se usó una asignación en un contexto condicional"
+
+#~ msgid "statement has no effect"
+#~ msgstr "la declaración no tiene efecto"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr ""
+#~ "bucle for: la matriz `%s' cambió de tamaño de %ld a %ld durante la "
+#~ "ejecución del bucle"
+
+#~ msgid "function called indirectly through `%s' does not exist"
+#~ msgstr "no existe la función llamada indirectamente a través de `%s'"
+
+#~ msgid "function `%s' not defined"
+#~ msgstr "la función `%s' no está definida"
+
+#~ msgid "error reading input file `%s': %s"
+#~ msgstr "error al leer el fichero de entrada `%s': %s"
+
+#~ msgid "`nextfile' cannot be called from a `%s' rule"
+#~ msgstr "`nextfile' no se puede llamar desde una regla `%s'"
+
+#~ msgid "`next' cannot be called from a `%s' rule"
+#~ msgstr "`next' no se puede llamar desde una regla `%s'"
+
+#~ msgid "Sorry, don't know how to interpret `%s'"
+#~ msgstr "Perdón, no se cómo interpretar `%s'"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "`extension' es una extensión de gawk"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: carácter ilegal `%c' en el nombre de la función `%s'"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr "la función `%s' se definió para tomar no más de %d argumento(s)"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "función `%s': falta el argumento #%d"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "No Se Admite La Operación"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr ""
+#~ "no se proporciona algún protocolo (conocido) en el nombre de fichero "
+#~ "especial `%s'"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "el nombre de fichero especial `%s' está incompleto"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "se debe proporcionar a `/inet' un nombre de anfitrión remoto"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "se debe proporcionar a `/inet' un puerto remoto"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "la opción -m[fr] es irrelevante en gawk"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "uso de la opción -m: `-m[fr]' nnn"
+
+#~ msgid "\t-R file\t\t\t--command=file\n"
+#~ msgstr "\t-R fichero\t\t\t--command=fichero\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "To report bugs, see node `Bugs' in `gawk.info', which is\n"
+#~ "section `Reporting Problems and Bugs' in the printed version.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Para reportar bichos, consulte el nodo `Bugs' en `gawk.info', el cual\n"
+#~ "corresponde a la sección `Reporting Problems and Bugs' en la versión "
+#~ "impresa.\n"
+#~ "Reporte los errores de los mensajes en español a <es@li.org>.\n"
+#~ "\n"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "no se pueden encontrar los grupos: %s"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# bloque(s) %s\n"
+#~ "\n"
+
+#~ msgid "range of the form `[%c-%c]' is locale dependent"
+#~ msgstr "el rango de la forma `[%c-%c]' depende del local"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr "no se permite la asignación como resultado de una función interna"
+
+#~ msgid "attempt to use array in a scalar context"
+#~ msgstr "se intentó usar una matriz en un contexto escalar"
+
+#~ msgid "statement may have no effect"
+#~ msgstr "la sentencia puede no tener efecto"
+
+#~ msgid "out of memory"
+#~ msgstr "memoria agotada"
+
+#~ msgid "attempt to use scalar `%s' as array"
+#~ msgstr "se intentó usar el dato escalar `%s' como una matriz"
+
+#~ msgid "call of `length' without parentheses is deprecated by POSIX"
+#~ msgstr "la llamada de `length' sin paréntesis está obsoleta por POSIX"
+
+#~ msgid "division by zero attempted in `/'"
+#~ msgstr "se intentó una división por cero en `/'"
+
+#~ msgid "length: untyped parameter argument will be forced to scalar"
+#~ msgstr "length: un argumento de parámetro sin tipo se forzará a escalar"
+
+#~ msgid "length: untyped argument will be forced to scalar"
+#~ msgstr "length: un argumento sin tipo se forzará a escalar"
+
+#~ msgid "`break' outside a loop is not portable"
+#~ msgstr "`break' fuera de un ciclo no es transportable"
+
+#~ msgid "`continue' outside a loop is not portable"
+#~ msgstr "`continue' fuera de un ciclo no es transportable"
+
+#~ msgid "`nextfile' cannot be called from a BEGIN rule"
+#~ msgstr "`nextfile' no se puede llamar desde una regla BEGIN"
+
+#~ msgid ""
+#~ "concatenation: side effects in one expression have changed the length of "
+#~ "another!"
+#~ msgstr ""
+#~ "concatenación: ¡Los efectos laterales en una expresión han cambiado la "
+#~ "longitud de otra!"
+
+#~ msgid "illegal type (%s) in tree_eval"
+#~ msgstr "tipo ilegal (%s) en tree_eval"
+
+#~ msgid "\t# -- main --\n"
+#~ msgstr "\t# -- principal --\n"
+
+#~ msgid "invalid tree type %s in redirect()"
+#~ msgstr "tipo de árbol %s inválido en redirect()"
+
+#~ msgid "/inet/raw client not ready yet, sorry"
+#~ msgstr "el cliente /inet/raw no está listo aún, perdón"
+
+#~ msgid "only root may use `/inet/raw'."
+#~ msgstr "sólo root puede utilizar `/inet/raw'."
+
+#~ msgid "/inet/raw server not ready yet, sorry"
+#~ msgstr "el servidor /inet/raw no está listo aún, perdón"
+
+#~ msgid "file `%s' is a directory"
+#~ msgstr "el fichero `%s' es un directorio"
+
+#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'"
+#~ msgstr "use `PROCINFO[\"%s\"]' en lugar de `%s'"
+
+#~ msgid "use `PROCINFO[...]' instead of `/dev/user'"
+#~ msgstr "use `PROCINFO[...]' en lugar de `/dev/user'"
+
+#~ msgid "\t-m[fr] val\n"
+#~ msgstr "\t-m[fr] valor\n"
+
+#~ msgid "\t-W compat\t\t--compat\n"
+#~ msgstr "\t-W compat\t\t--compat\n"
+
+#~ msgid "\t-W copyleft\t\t--copyleft\n"
+#~ msgstr "\t-W copyleft\t\t--copyleft\n"
+
+#~ msgid "\t-W usage\t\t--usage\n"
+#~ msgstr "\t-W usage\t\t--usage\n"
+
+#~ msgid "can't convert string to float"
+#~ msgstr "no se puede convertir una cadena a coma flotante"
+
+#~ msgid "# treated internally as `delete'"
+#~ msgstr "# se trata internamente como `delete'"
+
+#~ msgid "# this is a dynamically loaded extension function"
+#~ msgstr "# esta es una función de extensión cargada dinámicamente"
+
+#~ msgid ""
+#~ "\t# BEGIN block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# bloque(s) BEGIN\n"
+#~ "\n"
+
+#~ msgid "unexpected type %s in prec_level"
+#~ msgstr "tipo %s inesperado en prec_level"
+
+#~ msgid "Unknown node type %s in pp_var"
+#~ msgstr "Tipo de nodo %s desconocido en pp_var"
+
+#~ msgid "can't open two way socket `%s' for input/output (%s)"
+#~ msgstr ""
+#~ "no se puede abrir el `socket' de dos vías `%s' para entrada/salida (%s)"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opción ilegal -- %c\n"
+
+#~ msgid "function %s called\n"
+#~ msgstr "se llamó a la función %s\n"
+
+#~ msgid "field %d in FIELDWIDTHS, must be > 0"
+#~ msgstr "el campo %d en FIELDWIDTHS, debe ser > 0"
+
+#~ msgid "or used as a variable or an array"
+#~ msgstr "o se usó como una variable o una matriz"
+
+#~ msgid "substr: length %g is < 0"
+#~ msgstr "substr: la longitud %g es < 0"
+
+#~ msgid "regex match failed, not enough memory to match string \"%.*s%s\""
+#~ msgstr ""
+#~ "falló la coincidencia de la expresión regular, no hay suficiente memoria "
+#~ "para que coincida la cadena \"%.*s%s\""
+
+#~ msgid "delete: illegal use of variable `%s' as array"
+#~ msgstr "delete: uso ilegal de la variable `%s' como una matriz"
+
+#~ msgid "internal error: Node_var_array with null vname"
+#~ msgstr "error interno: Node_var_array con vname nulo"
+
+#~ msgid "invalid syntax in name `%s' for variable assignment"
+#~ msgstr "sintaxis inválida en el nombre `%s' para la asignación de variable"
+
+#~ msgid "or used in other expression context"
+#~ msgstr "se usó or en otro contexto de la expresión"
+
+#~ msgid "`%s' is a function, assignment is not allowed"
+#~ msgstr "`%s' es una función, no se permite asignación"
+
+#~ msgid "BEGIN blocks must have an action part"
+#~ msgstr "Los bloques BEGIN deben tener una parte de acción"
+
+#~ msgid "`nextfile' used in BEGIN or END action"
+#~ msgstr "`nextfile' es usado en la acción de BEGIN o END"
+
+#~ msgid "non-redirected `getline' undefined inside BEGIN or END action"
+#~ msgstr ""
+#~ "`getline' no redirigido indefinido dentro de la acción de BEGIN o END"
+
+# tokentab? cfuga
+#~ msgid "fptr %x not in tokentab\n"
+#~ msgstr "fptr %x no está en tokentab\n"
+
+#~ msgid "gsub third parameter is not a changeable object"
+#~ msgstr "el tercer argumento de gsub no es un objecto que se puede cambiar"
+
+#~ msgid "unfinished repeat count"
+#~ msgstr "cuenta de repetición sin terminar"
+
+#~ msgid "malformed repeat count"
+#~ msgstr "cuenta de repetición malformada"
+
+#~ msgid ""
+#~ "\n"
+#~ "To report bugs, see node `Bugs' in `gawk.info', which is\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Para reportar `bugs', vea el nodo `Bugs' en gawk.info, que es\n"
+
+#~ msgid "pipe from `%s': could not set close-on-exec (fcntl: %s)"
+#~ msgstr "tubería de `%s': no se puede establecer close-on-exec (fcntl: %s)"
+
+#~ msgid "pipe to `%s': could not set close-on-exec (fcntl: %s)"
+#~ msgstr "tubería a `%s': no se puede establecer close-on-exec (fcntl: %s)"
diff --git a/gawk-5.0.1/po/fi.po b/gawk-5.0.1/po/fi.po
new file mode 100644
index 00000000000..49aecdd795e
--- /dev/null
+++ b/gawk-5.0.1/po/fi.po
@@ -0,0 +1,4279 @@
+# Finnish messages for gawk.
+# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2017 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Jorma Karvonen <karvonen.jorma@gmail.com>, 2010-2015, 2017.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.1.62\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2017-08-19 12:18+0300\n"
+"Last-Translator: Jorma Karvonen <karvonen.jorma@gmail.com>\n"
+"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.0.1\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "taulukosta %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "yritettiin käyttää skalaariarvoa taulukkona"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "yritettiin käyttää skalaariparametria ”%s” taulukkona"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "yritettiin käyttää skalaaria ”%s” taulukkona"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "yritettiin käyttää taulukkoa ”%s” skalaarikontekstissa"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: indeksi ”%.*s” ei ole taulukossa ”%s”"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "yritettiin käyttää skalaaria ”%s[\"%.*s\"]” taulukkona"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: ensimmäinen argumentti ei ole taulukko"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: toinen argumentti ei ole taulukko"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: toinen argumentti ei ole taulukko"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: ensimmäinen argumentti ei ole taulukko"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: ensimmäinen argumentti ei ole taulukko"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: ensimmäisen argumentin alitaulukon käyttö toiselle argumentille "
+"epäonnistui"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: ensimmäisen argumentin alitaulukon käyttö toiselle argumentille "
+"epäonnistui"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: toisen argumentin alitaulukon käyttö ensimmäiselle argumentille "
+"epäonnistui"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: toisen argumentin alitaulukon käyttö ensimmäiselle argumentille "
+"epäonnistui"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "”%s” on virheellinen funktionimenä"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "lajitteluvertailufunktiota ”%s” ei ole määritelty"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s lohkoilla on oltava toiminto-osa"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "jokaisella säännöllä on oltava malli tai toiminto-osa"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "vanha awk ei tue useita ”BEGIN”- tai ”END”-sääntöjä"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "”%s” on sisäänrakennettu funktio. Sitä ei voi määritellä uudelleen"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr ""
+"säännöllisen lausekkeen vakio ”//” näyttää C++-kommentilta, mutta ei ole"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr ""
+"säännöllisen lausekkeen vakio ”/%s/” näyttää C-kommentilta, mutta ei ole"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "kaksi samanlaista case-arvoa switch-rakenteen rungossa: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "kaksoiskappale ”default” havaittu switch-rungossa"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "”break” ei ole sallittu silmukan tai switch-lauseen ulkopuolella"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "”continue” ei ole sallittu silmukan ulkopuolella"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "”next” käytetty %s-toiminnossa"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "”nextfile” käytetty %s-toiminnossa"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "”return” käytetty funktiokontekstin ulkopuolella"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"pelkkä ”print” BEGIN- tai END-säännössä pitäisi luultavasti olla ”print \"\"”"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "”delete” ei ole sallittu kohteessa SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "”delete” ei ole sallittu kohteessa FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "”delete(array)” ei ole siirrettävä tawk-laajennus"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "monivaiheiset kaksisuuntaiset putket eivät toimi"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "säännöllinen lauseke sijoituksen oikealla puolella"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "säännöllinen lauseke ”~”- tai ”!~”-operaattorin vasemmalla puolella"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "vanha awk ei tue avainsanaa ”in” paitsi ”for”-sanan jälkeen"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "säännöllinen lauseke vertailun oikealla puolella"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "edelleenohjaamaton ”getline” virheellinen ”%s”-säännön sisällä"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "edelleenohjaamaton ”getline” määrittelemätön END-toiminnon sisällä"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "vanha awk ei tue moniulotteisia taulukkoja"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "”length”-kutsu ilman sulkumerkkejä ei ole siirrettävä"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "epäsuorat funktiokutsut ovat gawk-laajennus"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr "erikoismuuttujan ”%s” käyttö epäsuoralle funktiokutsulle epäonnistui"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "yritys käyttää ei-funktio ”%s” funktiokutsussa"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "virheellinen indeksointilauseke"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "varoitus: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "tuhoisa: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "odottamaton rivinvaihto tai merkkijonon loppu"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "lähdetiedoston ”%s” avaaminen lukemista varten (%s) epäonnistui"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "jaetun kirjaston ”%s” avaaminen lukemista varten (%s) epäonnistui"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "syy tuntematon"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "kohteen ”%s” sisällyttäminen ja käyttö ohjelmatiedostona epäonnistui"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "on jo sisällytetty lähdetiedostoon ”%s”"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "jaettu kirjasto ”%s” on jo ladattu"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include on gawk-laajennus"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "tyhjä tiedostonimi @include:n jälkeen"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load on gawk-laajennus"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "tyhjä tiedostonimi @load:n jälkeen"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "tyhjä ohjelmateksti komentorivillä"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "lähdetiedoston ”%s” (%s) lukeminen epäonnistui"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "lähdetiedosto ”%s” on tyhjä"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "PEBKAC-virhe: virheellinen merkki ’\\%03o’ lähdekoodissa"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "lähdetiedoston lopussa ei ole rivinvaihtoa"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr ""
+"päättämätön säännöllinen lauseke loppuu ”\\”-merkkeihin tiedoston lopussa"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "%s: %d: tawk:n regex-määre ”/.../%c” ei toimi gawk:ssa"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "tawkin regex-määre ”/.../%c” ei toimi gawkissa"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "päättämätön säännöllinen lauseke"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "päättämätön säännöllinen lauseke tiedoston lopussa"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "”\\ #...”-rivijatkamisen käyttö ei ole siirrettävä"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "kenoviiva ei ole rivin viimeinen merkki"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "moniulotteiset taulukot ovat gawk-laajennus"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX ei salli operaattoria ”**=”"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "vanha awk ei tue operaattoria ”**=”"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX ei salli operaattoria ”**”"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "vanha awk ei tue operaattoria ”**”"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "operaattoria ”^=” ei tueta vanhassa awk:ssa"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "operaattoria ”^” ei tueta vanhassa awk:ssa"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "päättämätön merkkijono"
+
+#: awkgram.y:4048 main.c:1220
+#, fuzzy
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX ei salli ”\\x”-koodinvaihtoja"
+
+#: awkgram.y:4050 node.c:453
+#, fuzzy
+msgid "backslash string continuation is not portable"
+msgstr "”\\ #...”-rivijatkamisen käyttö ei ole siirrettävä"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "virheellinen merkki ’%c’ lausekkeessa"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "”%s” on gawk-laajennus"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX ei salli operaattoria ”%s”"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "”%s” ei ole tuettu vanhassa awk-ohjelmassa"
+
+#: awkgram.y:4494
+#, fuzzy
+msgid "`goto' considered harmful!"
+msgstr "”goto”-käskyä pidetään haitallisena!\n"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d on virheellinen argumenttilukumäärä operaattorille %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s: merkkijonoliteraalilla ei ole vaikutusta korvauksen viimeisenä "
+"argumenttina"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "%s kolmas parametri ei ole vaihdettava objekti"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: kolmas argumentti on gawk-laajennus"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: toinen argumentti on gawk-laajennus"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "dcgettext(_\"...\")-käyttö on virheellinen: poista alaviiva alusta"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "dcngettext(_\"...\")-käyttö on virheellinen: poista alaviiva alusta"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "indeksi: regexp-vakio toisena argumenttina ei ole sallitttu"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "funktio ”%s”: parametri ”%s” varjostaa yleismuuttujaa"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "tiedoston ”%s” avaaminen kirjoittamista varten (%s) epäonnistui"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "lähetetään muuttujaluettelo vakiovirheeseen"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: sulkeminen epäonnistui (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() kutsuttu kahdesti!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "siellä oli varjostettuja muuttujia."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "funktionimi ”%s” on jo aikaisemmin määritelty"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "funktio ”%s”: funktionimen käyttö parametrinimenä epäonnistui"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"funktio ”%s”: erikoismuuttujan ”%s” käyttö funktioparametrina epäonnistui"
+
+#: awkgram.y:5092
+#, fuzzy, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "funktio ”%s”: parametri ”%s” varjostaa yleismuuttujaa"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "funktio ”%s”: parametri #%d, ”%s”, samanlainen parametri #%d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "funktiota ”%s” kutsuttiin, mutta sitä ei ole koskaan määritelty"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "funktio ”%s” määriteltiin, mutta sitä ei ole koskaan kutsuttu suoraan"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "säännöllisen lausekkeen vakio parametrille #%d antaa boolean-arvon"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"funktio ”%s” kutsuttu välilyönnillä nimen ja ”(”-merkin\n"
+"välillä, tai käytetty muuttujana tai taulukkona"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "nollalla jakoa yritettiin"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "jakoa nollalla yritettiin operaattorissa ”%%”"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"arvon sijoittaminen kenttäjälkikasvatuslausekkeen tulokseen epäonnistui"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "virheellinen sijoituskohde (käskykoodi %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "@include on gawk-laajennus"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#  kohteena voi olla vakiotuloste tai joku muu
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s kohteeseen ”%s” epäonnistui (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "vakiotuloste"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "vakiovirhe"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: argumentti %g on lukualueen ulkopuolella"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: tyhjentäminen epäonnistui: putki ”%.*s” avattu lukemista varten, ei "
+"kirjoittamiseen"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: tyhjentäminen epäonnistui: tiedosto ”%.*s” avattu lukemista varten, "
+"ei kirjoittamiseen"
+
+#: builtin.c:259
+#, fuzzy, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: tiedoston ”%.*s” tyhjentäminen epäonnistui"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: tyhjentäminen epäonnistui: kaksisuuntainen putki ”%.*s” suljettu "
+"kirjoituspäässä"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: ”%.*s” ei ole avoin tiedosto, putki tai apuprosessi"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: ensimmäinen vastaanotettu argumentti ei ole merkkijono"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: toinen vastaanotettu argumentti ei ole merkkijono"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: vastaanotettu taulukkoargumentti"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "”length(array)” on gawk-laajennus"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: vastaanotettu argumentti ei ole merkkijono"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: vastaanotettu negatiivinen argumentti %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "kohtalokas: on käytettävä ”count$” kaikilla muodoilla tai ei missään"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "kenttäleveys ohitetaan ”%%%%”-määritteelle"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "tarkkuus ohitetaan ”%%%%”-määritteelle"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "kenttäleveys ja tarkkuus ohitetaan ”%%%%”-määritteelle"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "kohtalokas: ”$”-argumentti ei ole sallittu awk-muodoissa"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "kohtalokas: argumenttilukumäärän argumentilla ”$” on oltava > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"kohtalokas: argumenttilukumäärä %ld on suurempi kuin toimitettujen "
+"argumenttien lukumäärä"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "kohtalokas: ”$”-argumentti ei ole sallittu pisteen jälkeen muodossa"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+"kohtalokas: ei ”$”-argumenttia tarjottu sijantikenttäleveydelle tai "
+"tarkkuudelle"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "”l” on merkityksetön awk-muodoissa; ohitetaan"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "kohtalokas: ”l” ei ole sallittu POSIX awk -muodoissa"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "”L” on merkityksetön awk-muodoissa; ohitetaan"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "kohtalokas: ”L” ei ole sallittu POSIX awk -muodoissa"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "”h” on merkityksetön awk-muodoissa; ohitetaan"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "kohtalokas: ”h” ei ole sallittu POSIX awk -muodoissa"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: arvo %g on liian suuri %%c-muodolle"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: arvo %g ei ole kelvollinen leveä merkki"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: arvo %g on lukualueen ulkopuolella ”%%%c”-muodolle"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: arvo %g on lukualueen ulkopuolella ”%%%c”-muodolle"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"ohitetaan tuntematon muotoargumenttimerkki ”%c”: ei muunnettu argumenttia"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "kohtalokas: ei kylliksi argumentteja muotomerkkijonon tyydyttämiseksi"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ tällainen loppui kesken"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: muotoargumentilla ei ole ohjauskirjainta"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "muotomerkkijonoon toimitettu liian monta argumenttia"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: ei argumentteja"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: ei argumentteja"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"printf: yritettiin kirjoittaa kaksisuuntaisen putken suljettuun "
+"kirjoituspäähän"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: kutsuttu negatiivisella argumentilla %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: pituus %g ei ole >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: pituus %g ei ole >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: typistetään pituus %g, joka ei ole kokonaisluku"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+"substr: pituus %g liian suuri merkkijononindeksointiin, typistetään arvoon %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: aloitusindeksi %g on virheellinen, käytetään 1:tä"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: typistetään aloitusindeksi %g, joka ei ole kokonaisluku"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: lähdemerkkijono on nollapituinen"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: aloitusindeksi %g on merkkijonon lopun jälkeen"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: pituus %g alkuindeksissä %g ylittää ensimmäisen argumentin pituuden "
+"(%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr ""
+"strftime: muotoarvolla kohteessa PROCINFO[\"strftime\"] on numerotyyppi"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: toinen vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr ""
+"strftime: toinen argumentti on pienempi kuin 0 tai liian suuri time_t-"
+"rakenteeseen"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: kohteen time_t toinen argumentti lukualueen ulkopuolella"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: ensimmäinen vastaanotettu argumentti ei ole merkkijono"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: vastaanotettu tyhjä muotomerkkijono"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: vastaanotettu argumentti ei ole merkkijono"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: vähintään yksi arvoista on oletuslukualueen ulkopuolella"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "’system’-funktio ei ole sallittu hiekkalaatikkotilassa"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: vastaanotettu argumentti ei ole merkkijono"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"print: yritettiin kirjoittaa kaksisuuntaisen putken suljettuun "
+"kirjoituspäähän"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "viite alustamattomaan kenttään ”$%d”"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: vastaanotettu argumentti ei ole merkkijono"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: vastaanotettu argumentti ei ole merkkijono"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: ensimmäinen vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: toinen vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: kolmas argumentti ei ole taulukko"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: kolmatta argumenttia  ”%.*s” käsiteltiin kuin 1:stä"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: voidaan kutsua epäsuorasti vain kahdella argumentilla"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "epäsuora kutsu kohteeseen %s vaatii vähintään kaksi argumenttia"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: ensimmäinen vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: toinen vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): negatiiviset arvot eivät ole sallittuja"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): jaosarvot typistetään"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): liian suuri siirrosarvo antaa outoja tuloksia"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: ensimmäinen vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: toinen vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): negatiiviset arvot eivät ole sallittuja"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): jaosarvot typistetään"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): liian suuri siirrosarvo antaa outoja tuloksia"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: kutsuttu vähemmällä kuin kahdella argumentilla"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: argumentti %d ei ole numeeraaliargumentti"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: argumentin %d negatiivinen arvo %g ei ole sallittu"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: kutsuttu vähemmällä kuin kahdella argumentilla"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: argumentti %d ei ole numeraaliargumentti"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: argumentin %d negatiivinen arvo %g ei ole sallittu"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: kutsuttu vähemmällä kuin kahdella argumentilla"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: argumentti %d ei ole numeraaliargumentti"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: argumentin %d negatiivinen arvo %g ei ole sallittu"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): negatiivinen arvo ei ole sallittu"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): jaosarvo typistetään"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: ”%s” ei ole kelvollinen paikallinen kategoria"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv: kolmas argumentti ei ole taulukko"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv: ensimmäinen vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv: toinen vastaanotettu argumentti ei ole numeerinen"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv: nollalla jakoa yritettiin"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: toinen argumentti ei ole taulukko"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof: virheellinen argumenttityyppi ”%s”"
+
+#: builtin.c:4105
+#, fuzzy, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof: virheellinen argumenttityyppi ”%s”"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Kirjoita (g)awk-lause(et). Lopeta komennolla \"end\"\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "virheellinen kehysnumero: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: virheellinen valitsin -- ”%s”"
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source ”%s”: on jo merkitty lähteeksi."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save ”%s”: komento ei ole sallittu."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+"Komennon ”commands” käyttö breakpoint/watchpoint-komentoja varten epäonnistui"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "yhtään breakpoint/watchpoint -kohdetta ei ole vielä asetettu"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "virheellinen breakpoint/watchpoint-numero"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Kirjoita komennot, kun %s %d osui, yksi per rivi.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Lopeta komennolla ”end”\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "”end” on kelvollinen vain komennoissa ”commands” tai ”eval”"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "”silent” on kelvollinen vain komennossa ”commands”"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: virheellinen valitsin -- ”%s”"
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: virheellinen breakpoint/watchpoint-numero"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "argumentti ei ole merkkijono"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: virheellinen parametri - ”%s”"
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "tuntematon funktio - ”%s”"
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: virheellinen valitsin -- ”%s”"
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "virheellinen lukualuemäärittely: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "ei-numeerinen arvo kenttänumerolle"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "löytyi ei-numeerinen arvo, odotettiin numeraalia"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "nollasta poikkeava kokonaislukuarvo"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - tulosta kaikkien tai N:n sisimmäisen (ulommaisin, jos N < 0) "
+"kehyksen jäljet."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[filename:]N|function] - aseta breakpoint määriteltyyn sijaintiin."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+"clear [[filename:]N|function] - poista aiemmin asetetut breakpoint-kohdat."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [num] - aloittaa komentojen luettelon, joka suoritetaan "
+"keskeytyskohta(watchpoint)osumassa."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition num [expr] - aseta tai nollaa keskeytyskohta- tai vahtikohtaehdot."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [COUNT] - continue program being debugged."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+"delete [keskeytyskohdat] [lukualue] - poista määritellyt keskeytyskohdat."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+"disable [keskeytyskohdat] [lukualue] - ota pois käytöstä määritellyt "
+"keskeytyskohdat."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+"display [muuttuja] - tulosta muuttujan arvo joka kerta kun ohjelma pysähtyy."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - siirrä N kehystä alaspäin pinossa."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr "dump [tiedostonimi] - vedosta käskyt tiedostoon tai vakiotulosteeseen."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [keskeytyskohdat] [lukualue] - ota käyttöön määritellyt "
+"keskeytyskohdat."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - lopeta komentojen tai awk-lauseiden luottelo."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval stmt|[p1, p2, ...] - evaloi awk-lauseet."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (sama kuin quit) poistu vianjäljittäjästä."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - suorita kunnes palautetaan valittu pinokehys."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - valitse ja tulosta pinokehys numero N."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr "help [komento] - tulosta komentoluettelo tai komennon selitys."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+"ignore N COUNT - aseta keskeytyskohdan ignore-count numero N arvoon COUNT."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info aihe - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[tiedostonimi:]rivinumero|funktio|lukualue] - luettele määritellyt "
+"rivit."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr "next [COUNT] - askella ohjelmaa, etene alirutiinikutsujen kautta."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [COUNT] - askella yksi käsky, mutta etene alirutiinikutsujen kautta."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [nimi[=arvo]] - aseta tai näytä vianjäljittäjävalitsimet."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [muuttuja] - tulosta muutujan tai taulukon arvo."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf muoto, [argumentti], ... - muotoiltu tuloste."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - poistu vianjäljittäjästä."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr "return [arvo] - tekee valitun pinokehyksen paluun sen kutsujalle."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - käynnistä tai uudelleenkäynnistä ohjelman suoritus."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save tiedostonimi - tallenna komennot istunnosta tiedostoon."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set var = arvo - liitä arvo skalaarimuuttujaan."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - pysäyttää tavallisen viestin kun pysähdytään katkaisukohdassa/"
+"vahtipisteessä."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source file - suorita komennot tiedostosta."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [COUNT] - askella ohjelmaa, kunnes se saavuttaa eri lähdekoodirivin."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [COUNT] - askella tarkalleen yksi käsky."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[tiedostonimi:]N|funktio] - aseta tilapäinen keskeytyskohta."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - tulosta käsky ennen suoritusta."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr "undisplay [N] - poista muuttuja(t) automaattisesta näyttöluettelosta."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[tiedostonimi:]N|funktio] - suorita kunnes ohjelma tavoittaa eri "
+"rivin tai rivin N nykyisen kehyksen sisällä."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - poista muuttuja(t) vahtiluettelosta."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - siirrä N kehystä ylöspäin pinossa."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch muuttuja - aseta vahtikohta muuttujalle."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"missä [N] - (sama kuin paluujälki) tulostaa kaikkien tai N-sisimmäisen "
+"(ulommaisen jos N < 0) kehyksen jäljen."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "virhe: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "komennon (%s) lukeminen epäonnistui\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "komennon (%s) lukeminen epäonnistui"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "virheellinen merkki komennossa"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "tuntematon komento - \"%.*s\", kokeile käskyä help"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "virheellinen merkki"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "määrittelemätön komento: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr "aseta tai näytä historiatiedostossa säilytettävien rivien lukumäärä."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "aseta tai näytä luettelokomentoikkunan koko."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "aseta tai näytä gawk-tulostetiedosto."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "aseta tai näytä vianjäljittäjäkehote."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+"aseta, poista asetus tai näytä komentohistoriatallennus (value=on|off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "aseta, poista asetus tai näytä valitsintallennus (value=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "aseta, poista asetus tai näytä käskyjäljitys (value=on|off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "ohjelma ei ole käynnissä."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "lähdetiedoston ”%s” (%s) lukeminen epäonnistui"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "lähdetiedosto ”%s” on tyhjä.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "ei nykyistä lähdekooditiedostoa."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "lähdetiedostoa nimeltä ”%s” (%s) ei kyetä lukemaan"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+"VAROITUS: lähdekooditiedostoa ”%s” on muokattu ohjelman kääntämisen "
+"jälkeen.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "rivinumero %d lukualueen ulkopuolella; kohteessa ”%s” on %d riviä"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr ""
+"odottamaton eof-tiedostonloppumerkki luettaessa tiedostoa ”%s”, rivi %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr ""
+"lähdekooditiedostoa ”%s” on muokattu ohjelman suorituksen aloituksen jälkeen"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Nykyinen lähdetiedosto: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Rivien lukumäärä: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Lähdetiedosto (riviä): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Numero  Disp  Käytössä  Sijainti\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tosumien lukumäärä = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tohita seuraavat %ld osumaa\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tpysähtymisehto: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tkomennot:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Nykyinen kehys: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Kehyksen kutsuma: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Kehyksen kutsuja: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Funktiossa main() ei ole mitään.\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Ei argumentteja.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Ei paikallisia muuttujia.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Kaikki määritellyt muuttujat:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Kaikki määritellyt funktiot.\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Automaattisesti näytettävät muuttujat:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Vahtimuuttujia:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "symbolia ”%s” ei löydy nykyisestä asiayhteydestä\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "”%s” ei ole taulukko\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = alustamaton kenttä\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "taulukko ”%s” on tyhjä\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%.*s\"] ei ole taulukossa ”%s”\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "”%s[\"%.*s\"]” ei ole taulukko\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "”%s” ei ole skalaarimuuttuja"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "yritettiin käyttää taulukkoa ”%s[\"%.*s\"]” skalaarikontekstissa"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "yritettiin käyttää skalaaria ”%s[\"%.*s\"]” taulukkona"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "”%s” on funktio"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "watchpoint %d ei ole ehdollinen\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "Yksikään näyttörivi ei ole numeroitu %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Yksikään vahtirivi ei ole numeroitu %ld"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%.*s\"] ei ole taulukossa ”%s”\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "yritettiin käyttää skalaariarvoa taulukkona"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+"Watchpoint %d poistettiin, koska parametri on lukualueen ulkopuolella.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "Display %d poistettiin, koska parametri on lukualueen ulkopuolella.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " tiedostossa ”%s”, rivi %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " osoitteessa ”%s”:%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tkohteessa "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Lisää pinokehyksiä seuraa ...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "virheellinen kehysnumero"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Huomaa: keskeytyskohta %d (otettu käyttöön, ohita seuraavat %ld osumaa), "
+"asetettu myös osoitteessa %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr ""
+"Huomaa: keskeytyskohta %d (otettu käyttöön), asetettu myös kohdassa %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Huomaa: keskeytyskohta %d (otettu pois käytöstä, ohita seuraavat %ld "
+"osumaa), asetettu myös kohdassa %s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr ""
+"Huomaa: keskeytyskohta %d (otettu pois käytöstä), asetettu myös kohdassa %s:"
+"%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Keskeytyskohta %d asetettu tiedostossa ”%s”, rivi %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "Keskeytyskohdan asetaminen tiedostossa ”%s” epäonnistui\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "rivinumero %d tiedostossa ”%s” on lukualueen ulkopuolella"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Säännön löytäminen epäonnistui!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "Keskeytykohdan asettaminen kohdassa ”%s”:%d epäonnistui\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Keskeytyskohdan asettaminen funktiossa ”%s” epäonnistui\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "keskeytyskohta %d asetettu tiedostossa ”%s”, rivi %d on ehdoton\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Poistettu keskeytyskohta %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "Ei keskeytyskohtaa funktion ”%s” sisääntulossa\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Tiedostossa ”%s” ei ole keskeytyskohtaa, rivi #%d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "virheellinen keskeytyskohtanumero"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Poistetaanko kaikki keskeytyskohdata? (y tai n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "k"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Keskeytyskohta %2$d:n seuraavat %1$ld risteystä ohitetaan.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "Pysähtyy seuraavalla kerralla kun keskeytyskohta %d saavutetaan.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr ""
+"Vain ohjelmia, jotka tarjoavat valitsimen ”-f”, voidaan vikajäljittää.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Vianjäljittäjän uudelleenkäynnistys epäonnistui"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Ohjelma on jo käynnissä. Käynnistetäänkö uudelleen alusta (y/n)? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Ohjelma ei käynnistynyt uudelleen\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "virhe: uudelleenkäynnistys epäonnistui, toiminto ei ole sallittu\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr ""
+"virhe (%s): uudelleenkäynnistys epäonnistui, loput komennot ohitetaan\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Käynnistetään ohjelma: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Ohjelma päättyi epänormaalisti päättymisarvolla: %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Ohjelma päättyi normaalisti päättymisarvolla: %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "Ohjelma on käynnissä. Poistutaanko silti (y/n)? "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Ei pysäytetty yhdessäkään keskeytyskohdassa; argumentti ohitetaan.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "virheellinen keskeytyskohtanumero %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Ohittaa seuraavat %ld keskeytyskohdan %d ylitystä.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr ""
+"’finish’ ei ole merkityksellinen ulommaisen kehyksen main()-funktiossa\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Suorita kunnes paluu kohteesta "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr ""
+"’return’ ei ole merkityksellinen ulommaisen kehyksen main()-funktiossa\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "Määritellyn sijainnin löytyminen funktiossa ”%s” epäonnistui\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "virheellinen lähdekoodirivi %d tiedostossa ”%s”"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "Määritellyn sijainnin %d löytyminen tiedostossa ”%s” epäonnistui\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "elementti ei ole taulukossa\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "tyypitön muuttuja\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Pysäytetään kohdassa %s ...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "’finish’ ei ole merkityksellinen ei-paikallisessa hypyssä ’%s’\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "’until’ ei ole merkityksellinen ei-paikallisessa hypyssä ’%s’\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t------Jatka painamalla [Enter] tai poistu painamalla q [Enter]------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] ei ole taulukossa ”%s”"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "lähetetään tuloste vakiotulosteeseen\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "virheellinen numero"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "”%s” ei ole sallittu nykyisessä asiayhteydessä; lause ohitetaan"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "”return” ei ole sallittu nykyisessä asiayhteydessä; lause ohitetaan"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Symbolia ”%s” ei ole nykyisesssä asiayhteydessä"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "tuntematon solmutyyppi %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "tuntematon käskykoodi %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "käskykoodi %s ei ole operaattori tai avainsana"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "puskurin ylivuoto funktiossa genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Funktiokutsupino:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "”IGNORECASE” on gawk-laajennus"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "”BINMODE” on gawk-laajennus"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "BINMODE-arvo ”%s” on virheellinen, käsiteltiin arvona 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "väärä ”%sFMT”-määritys ”%s”"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "käännetään pois ”--lint”-valitsin ”LINT”-sijoituksen vuoksi"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "viite alustamattomaan argumenttiin ”%s”"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "viite alustamattomaan muuttujaan ”%s”"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "yritettiin kenttäviitettä arvosta, joka ei ole numeerinen"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "yritettiin kenttäviitettä null-merkkijonosta"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "yritettiin saantia kenttään %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "viite alustamattomaan kenttään ”$%ld”"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "funktio ”%s” kutsuttiin useammalla argumentilla kuin esiteltiin"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: odottamaton tyyppi ”%s”"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "jakoa nollalla yritettiin operaatiossa ”/=”"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "jakoa nollalla yritettiin operaatiossa ”%%=”"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "laajennuksia ei sallita hiekkalaatikkotilassa"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load ovat gawk-laajennuksia"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: vastaanotettiin NULL lib_name"
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: kirjaston ”%s” (%s) avaus epäonnistui\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: kirjasto ”%s”: ei määrittele ”plugin_is_GPL_compatible” (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: kirjasto ”%s”: funktion ”%s” (%s) kutsu epäonnistui\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: kirjaston ”%s” alustusrutiini ”%s” epäonnistui\n"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: puuttuva funktionimi"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: gawk-ohjelman sisäisen muuttujanimen ”%s” käyttö funktionimenä "
+"epäonnistui"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: gawk-ohjelman sisäisen muuttujanimen ”%s” käyttö funktionimenä "
+"epäonnistui"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: funktion ”%s” uudelleenmäärittely epäonnistui"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: funktio ”%s” on jo määritelty"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: funktionimi ”%s” on määritelty jo aiemmin"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: negatiivinen argumenttilukumäärä funktiolle ”%s”"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr "funktio ”%s”: argumentti #%d: yritettiin käyttää skalaaria taulukkona"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "funktio ”%s”: argumentti #%d: yritettiin käyttää taulukkoa skalaarina"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "kirjaston dynaamista latausta ei tueta"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: symbolisen linkin ”%s” lukeminen epäonnistui"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: väärät parametrit"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init: muuttujan %s luominen epäonnistui"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "fts ei ole tuettu tässä järjestelmässä"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: taulukon luominen epäonnistui"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: elementin asettaminen epäonnistui"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: elementin asettaminen epäonnistui"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: elementin asettaminen epäonnistui"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: taulukon luominen epäonnistui"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: elementin asettaminen epäonnistui"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: kutsuttu argumenttien väärällä lukumäärällä, odotettiin 3"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: väärä ensimmäinen parametri"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: väärä toinen parametri"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: väärä kolmas parametri"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: taulukon litistäminen epäonnistui\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: ohitetaan petollinen FTS_NOSTAT-lippu. nyyh, nyyh, nyyh."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() epäonnistui\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: ensimmäistä argumenttia ei saatu"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: toista argumenttia ei saatu"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: kolmatta argumenttia ei saatu"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch ei ole toteutettu tässä järjestelmässä\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: muuttujan FNM_NOMATCH lisääminen epäonnistui"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: taulukkoelementin %s asettaminen epäonnistui"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: FNM-taulukon lisääminen epäonnistui"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO ei ole taulukko!"
+
+#: extension/inplace.c:131
+#, fuzzy
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace_begin: kohdallaanmuokkaus on jo aktivoitu"
+
+#: extension/inplace.c:134
+#, fuzzy, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr ""
+"inplace_begin: odotetaan 2 argumenttia, mutta kutsussa oli %d argumenttia"
+
+#: extension/inplace.c:137
+#, fuzzy
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace_begin: ensimmäisen argumentin noutaminen merkkijonotiedostonimenä "
+"epäonnistui"
+
+#: extension/inplace.c:145
+#, fuzzy, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace_begin: ottaen pois käytöstä virheellisen TIEDOSTONIMI ”%s” "
+"muokkauksen"
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace_begin: stat ”%s” (%s) epäonnistui"
+
+#: extension/inplace.c:159
+#, fuzzy, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace_begin: ”%s” ei ole tavallinen tiedosto"
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace_begin: mkstemp(”%s”) epäonnistui (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace_begin: chmod epäonnistui (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace_begin: dup(stdout) epäonnistui (%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_begin: dup2(%d, stdout) epäonnistui (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace_begin: close(%d) epäonnistui (%s)"
+
+#: extension/inplace.c:211
+#, fuzzy, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr ""
+"inplace_end: odotetaan 2 argumenttia, mutta kutsussa oli %d argumenttia"
+
+#: extension/inplace.c:214
+#, fuzzy
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace_end: ensimmäisen argumentin noutaminen merkkijonotiedostonimenä "
+"epäonnistui"
+
+#: extension/inplace.c:221
+#, fuzzy
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace_end: kohdallaanmuokkaus ei ole aktiivinen"
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_end: dup2(%d, stdout) epäonnistui (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace_end: close(%d) epäonnistui (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace_end: fsetpos(stdout) epäonnistui (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace_end: link(”%s”, ”%s”) epäonnistui (%s)."
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace_end: rename(”%s”, ”%s”) epäonnistui (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: kutsuttu sopimattomalla argumentilla"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: kutsuttu sopimattomalla argumentilla"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir epäonnistui: %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: kutsuttu vääränlaisella argumentilla"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: REVOUT-muuttujan alustaminen epäonnistui"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: argumentti 0 ei ole merkkijono\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: argumentti 1 ei ole taulukko\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: taulukon litistäminen epäonnistui\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: litistettyä taulukon vapauttaminen epäonnistui\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "taulukkoarvo on tuntematonta tyyppiä %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: argumentti 0 ei ole merkkijono\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: argumentti 1 ei ole taulukko\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array epäonnistui\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element epäonnistui\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: ei ole tuettu tällä alustalla"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: puuttuu vaadittu numeerinen argumentti"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: argumentti on negatiivinen"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: ei ole tuettu tällä alustalla"
+
+#: field.c:284
+msgid "input record too large"
+msgstr ""
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF asetettu negatiiviseen arvoon"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: neljäs argumentti on gawk-laajennus"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: neljäs argumentti ei ole taulukko"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: toinen argumentti ei ole taulukko"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split: saman taulukon käyttö toiselle ja neljännelle argumentille epäonnistui"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: toisen argumentin käyttö alitaulukkoa neljännelle argumentille "
+"epäonnistui"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: neljännen argumentin käyttö alitaulukkoa toiselle argumentille "
+"epäonnistui"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: null-merkkijono kolmantena argumenttina on gawk-laajennus"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: neljäs argumentti ei ole taulukko"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: toinen argumentti ei ole taulukko"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: kolmas argumentti ei ole taulukko"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: saman taulukon käyttö toiselle ja neljännelle argumentille "
+"epäonnistui"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: toisen argumentin käyttö alitaulukkkoa neljännelle argumentille "
+"epäonnistui"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: neljännen argumentin käyttö alitaulukkoa toiselle argumentille "
+"epäonnistui"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "”FIELDWIDTHS” on gawk-laajennus"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr ""
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "virheellinen FIELDWIDTHS-arvo kentälle %d lähellä ”%s”"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "null-merkkijono ”FS”-kenttäerotinmuuttujalle on gawk-laajennus"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "vanha awk ei tue regexp-arvoja ”FS”-kenttäerotinmuuttujana"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "”FPAT” on gawk-laajennus"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: vastaanotti null retval-paluuarvon"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: ei MPFR-tilassa"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: MPFR ei ole tuettu"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: virheellinen numerotyyppi ”%d”"
+
+#: gawkapi.c:385
+#, fuzzy
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "load_ext: vastaanotettiin NULL lib_name"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: vastaaotti null-solmun"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: vastaanotti null-arvon"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: vastaanotettu null-taulukko"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: vastaanotti null-alaindeksin"
+
+#: gawkapi.c:1217
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr ""
+"api_flatten_array_typed: indeksin %d muuntaminen arvoksi %s epäonnistui\n"
+
+#: gawkapi.c:1222
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array_typed: arvon %d muuntaminen arvoksi %s epäonnistui\n"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+#, fuzzy
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "awk_value_to_node: MPFR ei ole tuettu"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "BEGINFILE-säännön loppua ei löytynyt"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr ""
+"tunnistamattoman tiedostotyypin ”%s” avaaminen kohteessa ”%s” epäonnistui"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "komentoriviargumentti ”%s” on hakemisto: ohitettiin"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "tiedoston ”%s” avaaminen lukemista varten (%s) epäonnistui"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "tiedostomäärittelijän %d (”%s”) sulkeminen epäonnistui (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "edelleenohjaus ei ole sallittua hiekkalaatikkotilassa"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "lauseke ”%s”-uudellenohjauksessa on numero"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "lausekkeella ”%s”-uudelleenohjauksessa on null-merkkijonoarvo"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"tiedostonimi ”%.*s” ”%s”-uudelleenohjaukselle saattaa olla loogisen "
+"lausekkeen tulos"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "turha merkkien ”>” ja ”>>” sekoittaminen tiedostolle ”%.*s”"
+
+#: io.c:896 io.c:921
+#, fuzzy, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr ""
+"get_file-vastakkeen luomista ei tueta tällä alustalla kohteelle ”%s” fd %d-"
+"arvolla"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "putken ”%s” avaaminen tulosteelle (%s) epäonnistui"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "putken ”%s” avaaminen syötteelle (%s) epäonnistui"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"get_file-vastakkeen luomista ei tueta tällä alustalla kohteelle ”%s” fd %d-"
+"arvolla"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr ""
+"kaksisuuntaisen putken ”%s” avaaminen syötteelle/tulosteelle (%s) epäonnistui"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "uudelleenohjaus putkesta ”%s” (%s) epäonnistui"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "uudelleenohjaus putkeen ”%s” (%s) epäonnistui"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"saavutettiin avoimien tiedostojen järjestelmäraja: aloitetaan "
+"tiedostomäärittelijöiden lomittaminen"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "uudelleenohjauksen ”%s” sulkeminen epäonnistui (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "avoinna liian monta putkea tai syötetiedostoa"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: toisen argumentin on oltava ”to” tai ”from”"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: ”%.*s” ei ole avoin tiedosto, putki tai apuprosessi"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "suljettiin uudelleenohjaus, jota ei avattu koskaan"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: uudelleenohjaus ”%s” ei ole avattu operaattoreilla ”|&”, toinen "
+"argumentti ohitettu"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "virhetila (%d) putken ”%s” sulkemisessa (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "virhetila (%d) tiedoston ”%s” sulkemisessa (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "pistokkeen ”%s” eksplisiittistä sulkemista ei tarjota"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "apuprosessin ”%s” eksplisiittistä sulkemista ei tarjota"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "putken ”%s” eksplisiittistä sulkemista ei tarjota"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "tiedoston ”%s” eksplisiittistä sulkemista ei tarjota"
+
+#: io.c:1411
+#, fuzzy, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush: tiedoston ”%.*s” tyhjentäminen epäonnistui"
+
+#: io.c:1412
+#, fuzzy, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush: tiedoston ”%.*s” tyhjentäminen epäonnistui"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "virhe kirjoitettaessa vakiotulosteeseen (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "virhe kirjoitettaessa vakiovirheeseen (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "uudelleenohjauksen ”%s” putken tyhjennys epäonnistui (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "putken apuprosessityhjennys uudelleenohjaukseen ”%s” epäonnistui (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "uudelleenohjauksen ”%s” tiedostontyhjennys epäonnistui (%s)."
+
+#: io.c:1610
+#, fuzzy, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "paikallinen portti %s virheellinen pistokkeessa ”/inet”"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "paikallinen portti %s virheellinen pistokkeessa ”/inet”"
+
+#: io.c:1636
+#, fuzzy, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "etäkone- ja porttitiedot (%s, %s) ovat virheellisiä"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "etäkone- ja porttitiedot (%s, %s) ovat virheellisiä"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "TCP/IP-viestintää ei tueta"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "laitteen ”%s” avaus epäonnistui, tila ”%s”"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "”master pty”-sulkeminen epäonnistui (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "vakiotulosteen sulkeminen lapsiprosessissa epäonnistui (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"”slave pty”:n siirtäminen vakiotulosteeseen lapsiprosessissa epäonnistui "
+"(dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "vakiosyötteen sulkeminen lapsiprosessissa epäonnistui (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"”slave pty”:n siirtäminen vakiosyötteeseen lapsiprosessissa epäonnistui "
+"(dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "”slave pty”:n sulkeminen epäonnistui (%s)"
+
+#: io.c:2265
+#, fuzzy
+msgid "could not create child process or open pty"
+msgstr "lapsiprosessin luominen komennolle ”%s” (fork: %s) epäonnistui"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+"putken siirtäminen vakiotulosteeseen lapsiprosessissa epäonnistui (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+"putken siirtäminen vakiosyötteeseen lapsiprosessissa epäonnistui (dup: %s)"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr "vakiotulosteen palauttaminen äitiprosessissa epäonnistui\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr "vakiosyötön palauttaminen äitiprosessissa epäonnistui\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "putken sulkeminen epäonnistui (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "”|&” ei tueta"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "putken ”%s” (%s) avaaminen epäonnistui"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "lapsiprosessin luominen komennolle ”%s” (fork: %s) epäonnistui"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr "getline: yritys lukea kaksisuuntaisen putken suljetusta lukupäästä"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: vastaanotettiin NULL-osoitin"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"syötejäsennin ”%s” on ristiriidassa aiemmin asennetun syötejäsentimen ”%s” "
+"kanssa"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "syötejäsentäjä ”%s” epäonnistui kohteen ”%s” avaamisessa"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: vastaanotti NULL-osoittimen"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"tulostekäärin ”%s” on ristiriidassa aiemmin asennetun tulostekäärimen ”%s” "
+"kanssa"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "tulostekäärin ”%s” epäonnistui avaamaan ”%s”"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: vastaanotti NULL-osoittimen"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"kaksisuuntainen prosessori ”%s” on ristiriidassa aiemmin asennetun "
+"kaksisuuntaisen prosessorin ”%s” kanssa"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "kaksisuuntainen prosessori ”%s” epäonnistui avaamaan ”%s”"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "data-tiedosto ”%s” on tyhjä"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "lisäsyötemuistin varaus epäonnistui"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "”RS”-monimerkkiarvo on gawk-laajennus"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "IPv6-viestintää ei tueta"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+"ympäristömuuttuja ”POSIXLY_CORRECT” asetettu: käännetään päälle valitsin ”--"
+"posix”"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "valitsin ”--posix” korvaa valitsimen ”--traditional”"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr ""
+"valitsin ”--posix” tai ”--traditional” korvaa valitsimen ”--non-decimal-data”"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "valitsin ”--posix” korvaa valitsimen ”--characters-as-bytes”"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "suorittaminen ”%s setuid root”-käyttäjänä saattaa olla turvapulma"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "binaaritilan asettaminen vakiosyötteessä (%s) epäonnistui"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "binaaritilan asettaminen vakiotulosteessa (%s) epäonnistui"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "binaaritilaa asettaminen vakiovirheessä (%s) epäonnistui"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "ei ohjelmatekstiä ollenkaan!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"Käyttö: %s [POSIX- tai GNU-tyyliset valitsimet] -f ohjelmatiedosto [--] "
+"tiedosto ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+"Käyttö: %s [POSIX- tai GNU-tyyliset valitsimet] [--] %cohjelma%c "
+"tiedosto ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "POSIX-valitsimet:\t\tGNU-pitkät valitsimet: (vakio)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f ohjelmatiedosto\t\t--file=ohjelmatiedosto\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=arvo\t\t--assign=muuttuja=arvo\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Lyhyet valitsimet:\t\tGNU-pitkät valitsimet: (laajennukset)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[tiedosto]\t\t--dump-variables[=tiedosto]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[tiedosto]\t\t--debug[=tiedosto]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'program-text'\t--source='program-text'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E file\t\t\t--exec=tiedosto\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-po\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i include-tiedosto\t\t--include=include-tiedosto\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l kirjasto\t\t--load=kirjasto\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[tiedosto]\t\t--pretty-print[=tiedosto]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[tiedosto]\t\t--profile[=tiedosto]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-O\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Virheiden ilmoittamista varten, katso solmua ”Bugs” tiedostossa ”gawk."
+"info”,\n"
+"joka on kappale ”Reporting Problems and Bugs” painetussa versiossa. Nämä\n"
+"samat tiedot löytyvät osoitteesta\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk on mallietsintä- ja käsittelykieli.\n"
+"Oletuksena se lukee vakiosyötettä ja kirjoittaa vakiotulosteeseen.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Esimerkkejä:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' tiedosto\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright © 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Tämä ohjelma on ilmainen; voit jakaa sitä edelleen ja/tai muokata sitä\n"
+"Free Software Foundation julkaisemien GNU General Public License-lisenssin\n"
+"version 3, tai (valintasi mukaan) minkä tahansa myöhäisemmän version\n"
+"ehtojen mukaisesti.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Tätä ohjelmaa levitetään toivossa, että se on hyödyllinen, mutta\n"
+"ILMAN MITÄÄN TAKUUTA; ilman edes viitattua takuuta KAUPALLISUUDESTA\n"
+"tai SOPIVUUDESTA TIETTYYN TARKOITUKSEEN. Katso yksityiskohdat\n"
+"GNU General Public License-ehdoista.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Sinun pitäisi vastaanottaa kopion GNU General Public Licence-lisenssistä\n"
+"tämän ohjelman mukana. Jos näin ei ole, katso http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft ei aseta FS välilehteen POSIX awk:ssa"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: ”%s” argumentti valitsimelle ”-v” ei ole ”var=arvo”-muodossa\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "”%s” ei ole laillinen muuttujanimi"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "”%s” ei ole muuttujanimi, etsitään tiedostoa ”%s=%s”"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr ""
+"gawk-ohjelman sisäisen ”%s”-määrittelyn käyttö muuttujanimenä epäonnistui"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "funktionimen ”%s” käyttö muuttujanimenä epäonnistui"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "liukulukupoikkeus"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "tuhoisa virhe: sisäinen virhe"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "tuhoisa virhe: sisäinen virhe: segmenttivirhe"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "tuhoisa virhe: sisäinen virhe: pinoylivuoto"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "ei avattu uudelleen tiedostomäärittelijää %d"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr ""
+"laitteen /dev/null avaaminen uudelleen tiedostomäärittelijälle %d epäonnistui"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "tyhjä argumentti valitsimelle ”-e/--source” ohitetaan"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "valitsin ”--posix” korvaa valitsimen ”--traditional”"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M ohitettu: MPFR/GMP-tuki ei ole käännetty kohteessa"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: valitsin ”-W %s” on tunnistamaton, ohitetaan\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: valitsin vaatii argumentin -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "PREC-arvo ”%.*s” on virheellinen"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "RNDMODE-arvo ”%.*s” on virheellinen"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: vastaanotettu argumentti ei ole numeerinen"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): negatiivinen arvo ei ole sallittu"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg): jaosarvo typistetään"
+
+#: mpfr.c:832
+#, fuzzy, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): negatiiviset arvot eivät ole sallittuja"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: vastaanotettu argumentti #%d ei ole numeerinen"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: argumentilla #%d on virheellinen arvo %Rg, käytetään 0"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: argumentin #%d negatiivinen arvo %Rg ei ole sallittu"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: argumentin #%d jaosarvo %Rg typistetään"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: argumentin #%d negatiivinen arvo %Zd ei ole sallittu"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "komentorivi:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "tyypitetyn regex-lausekeen tekeminen epäonnistui"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "vanha awk ei tue ”\\%c”-koodinvaihtosekvenssiä"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX ei salli ”\\x”-koodinvaihtoja"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "ei heksadesimaalilukuja ”\\x”-koodinvaihtosekvenssissä"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"heksadesimaalikoodinvaihtomerkkejä \\x%.*s / %d ei ole luultavasti tulkittu "
+"sillä tavalla kuin odotat"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "koodinvaihtosekvenssi ”\\%c” käsitelty kuin pelkkä ”%c”"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Virheellinen monitavutieto havaittu. Paikallisasetuksesi ja tietojesi "
+"välillä saattaa olla täsmäämättömyys."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s ”%s”: fd-lippujen hakeminen epäonnistui: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr ""
+"%s %s ”%s”: close-on-exec -asettaminen epäonnistui: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "tiedoston ”%s” avaaminen kirjoittamista varten epäonnistui: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "lähetetään profiili vakiovirheeseen"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s säännöt\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Säännöt\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "sisäinen virhe: %s null vname-arvolla"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "sisäinen virhe: builtin null-funktionimellä"
+
+#: profile.c:1302
+#, fuzzy, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"\t# Ladatut laajennukset (-l ja/tai @load)\n"
+"\n"
+
+#: profile.c:1333
+#, fuzzy, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\t# Ladatut laajennukset (-l ja/tai @load)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# gawk-profiili, luotu %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funktiot, luetteloitu aakkosjärjestyksessä\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: tuntematon edelleenohjaustyyppi %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "koodinvaihtosekvenssi ”\\%c” käsitelty kuin pelkkä ”%c”"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr ""
+"säännöllisen lausekkeen komponentin ”%.*s” pitäisi luultavasti olla ”[%.*s]”"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "pariton ["
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "virheellinen merkkiluokka"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "merkkiluokkasyntaksi on [[:space:]], ei [:space:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "päättymätön \\-koodinvaihtomerkki"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "virheellinen \\{\\}-sisältö"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "säännöllinen lauseke on liian suuri"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "pariton ("
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "syntaksi ei ole määritelty"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr "pariton )"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: valitsin ’%s’ ei ole yksiselitteinen; mahdollisuudet:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: valitsin ’--%s’ ei salli argumenttia\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: valitsin ’%c%s’ ei salli argumenttia\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: valitsin ’--%s’ vaatii argumentin\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: tunnistamaton valitsin ’--%s’\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: tunnistamaton valitsin ’%c%s’\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: virheellinen valitsin -- ’%c’\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: valitsin vaatii argumentin -- ’%c’\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: valitsin ’-W %s’ ei ole yksiselitteinen\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: valitsin ’-W %s’ ei salli argumenttia\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: valitsin ’-W %s’ vaatii argumentin\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Onnistui"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Ei täsmäystä"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Virheellinen säännöllinen lauseke"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Virheellinen vertailumerkki"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Virheellinen merkkiluokkanimi"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Jäljessä oleva kenoviiva"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Virheellinen paluuviite"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Pariton [, [^, [:, [., or [="
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Pariton ( tai \\("
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Pariton \\{"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Virheellinen \\{\\}-sisältö"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Virheellinen lukualueen loppu"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Muisti loppui"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Virheellinen edeltävä säännöllinen lauseke"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Ennenaikainen säännöllisen lausekkeen loppu"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Säännöllinen lauseke on liian iso"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Pariton ) tai \\)"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Ei edellistä säännöllistä lauseketta"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "funktio ”%s”: funktion ”%s” käyttö parametrinimenä epäonnistui"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "pääsisällön pop-toiminto epäonnistui"
+
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "setenv(TZ, %s) epäonnistui (%s)"
+
+#, fuzzy
+#~ msgid "setenv(TZ, %s) restoration failed (%s)"
+#~ msgstr "setenv(TZ, %s) epäonnistui (%s)"
+
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "unsetenv(TZ) epäonnistui (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "kenoviiva merkkijonon lopussa"
+
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "yritettiin käyttää taulukkoa ”%s[\".*%s\"]” skalaarikontekstissa"
+
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "yritettiin käyttää skalaaria ”%s[\".*%s\"]” taulukkona"
+
+#~ msgid "delete: index `%s' not in array `%s'"
+#~ msgstr "delete: indeksi ”%s” ei ole taulukko ”%s”"
+
+#~ msgid "fflush: cannot flush: pipe `%s' opened for reading, not writing"
+#~ msgstr ""
+#~ "fflush: tyhjennys epäonnistui: putki ”%s” avattu lukemista varten, ei "
+#~ "kirjoittamista"
+
+#~ msgid "fflush: cannot flush: file `%s' opened for reading, not writing"
+#~ msgstr ""
+#~ "fflush: tyhjennys epäonnistui: tiedosto ”%s” avattu lukemista varten, ei "
+#~ "kirjoittamista"
+
+#~ msgid "fflush: cannot flush: two-way pipe `%s' has closed write end"
+#~ msgstr ""
+#~ "fflush: tyhjennys epäonnistui: kaksisuuntainen putki ”%s” suljettu "
+#~ "kirjoituspäässä"
+
+#~ msgid "fflush: `%s' is not an open file, pipe or co-process"
+#~ msgstr "fflush: ”%s” ei ole avoin tiedosto, putki tai apuprosessi"
+
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: kolmas argumentti %g käsiteltiin kuin 1."
+
+#~ msgid "lshift(%f, %f): negative values will give strange results"
+#~ msgstr "lshift(%f, %f): negatiiviset arvot antavat outoja tuloksia"
+
+#~ msgid "rshift(%f, %f): negative values will give strange results"
+#~ msgstr "rshift(%f, %f): negatiiviset arvot antavat outoja tuloksia"
+
+#~ msgid "and: argument %d negative value %g will give strange results"
+#~ msgstr "and: argumentin %d negatiivinen arvo %g antaa outoja tuloksia"
+
+#~ msgid "or: argument %d negative value %g will give strange results"
+#~ msgstr "or: argumentin %d negatiivinen arvo %g antaa outoja tuloksia"
+
+#~ msgid "xor: argument %d negative value %g will give strange results"
+#~ msgstr "xor: argumentin %d negatiivinen arvo %g antaa outoja tuloksia"
+
+#~ msgid "compl(%f): negative value will give strange results"
+#~ msgstr "compl(%f): negatiivinen arvo antaa outoja tuloksia"
+
+#~ msgid "[\"%s\"] not in array `%s'\n"
+#~ msgstr "[\"%s\"] ei ole taulukko ”%s”\n"
+
+#~ msgid "`%s[\"%s\"]' is not an array\n"
+#~ msgstr "”%s[\"%s\"]” ei ole taulukko\n"
+
+#~ msgid "attempt to use array `%s[\"%s\"]' in a scalar context"
+#~ msgstr "yritys käyttää taulukkoa ”%s[\"%s\"]” skalaariyhteydessä"
+
+#~ msgid "attempt to use scalar `%s[\"%s\"]' as array"
+#~ msgstr "yritys käyttää skalaaria ”%s[\"%s\"]” taulukkona"
+
+#~ msgid "%d: [\"%s\"] not in array `%s'\n"
+#~ msgstr "%d: [\"%s\"] ei ole taulukko ”%s”\n"
+
+#~ msgid "Program exited %s with exit value: %d\n"
+#~ msgstr "Ohjelma sulkeutunut %s poistumisarvolla: %d\n"
+
+#~ msgid "[\"%s\"] not in array `%s'"
+#~ msgstr "[\"%s\"] ei ole taulukossa ”%s”"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "”extension” on gawk-laajennus"
+
+#~ msgid "extension: received NULL lib_name"
+#~ msgstr "laajennos: vastaantotettu NULL lib_name"
+
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "extension: kirjaston ”%s” (%s) avaus epäonnistui"
+
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr ""
+#~ "extension: kirjasto ”%s”: ei määrittele ”plugin_is_GPL_compatible” (%s)"
+
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr "extension: kirjasto ”%s”: funktion ”%s” (%s) kutsu epäonnistui"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension: puuttuva funktionimi"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: virheellinen merkki ”%c” funktionimessä ”%s”"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: funktion ”%s” uudelleenmäärittely epäonnistui"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: funktio ”%s” on jo määritelty"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension: funktionimi ”%s” on määritelty jo aiemmin"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr ""
+#~ "extension: gawk-ohjelman sisäisen muuttujanimen käyttö ”%s” funktionimenä "
+#~ "epäonnistui"
+
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr "chdir: kutsuttu argumenttien väärällä lukumäärällä, odotettiin 1"
+
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "stat: kutsuttu argumenttien väärällä lukumäärällä"
+
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "statvfs: kutsuttu väärällä argumenttimäärällä"
+
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "fnmatch: kutsuttu vähemmällä kuin kolmella argumentilla"
+
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "fnmatch: kutsuttu useammalla kuin kolmella argumentilla"
+
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "fork: kutsuttu liian monella argumentilla"
+
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "waitpid: kutsuttu liian monella argumentilla"
+
+#~ msgid "wait: called with no arguments"
+#~ msgstr "wait: kutsuttu ilman argumentteja"
+
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "wait: kutsuttu liian monella argumentilla"
+
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "ord: kutsuttu liian monella argumentilla"
+
+#~ msgid "ord: called with no arguments"
+#~ msgstr "ord: kutsuttu ilman argumentteja"
+
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "chr: kutsuttu liian monella argumentilla"
+
+#~ msgid "chr: called with no arguments"
+#~ msgstr "chr: kutsuttu ilman argumentteja"
+
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "readfile: kutsuttu liian monella argumentilla"
+
+#~ msgid "readfile: called with no arguments"
+#~ msgstr "readfile: kutsuttu ilman argumentteja"
+
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "writea: kutsuttu liian monella argumentilla"
+
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "reada: kutsuttu liian monilla argumenteilla"
+
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "gettimeofday: ohitetaan argumentit"
+
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sleep: kutsuttu liian monella argumentilla"
+
+#~ msgid "invalid FIELDWIDTHS value, near `%s'"
+#~ msgstr "virheellinen FIELDWIDTHS-arvo, lähellä ”%s”"
+
+#~ msgid "api_flatten_array: could not convert index %d\n"
+#~ msgstr "api_flatten_array: indeksin %d muuntaminen epäonnistui\n"
+
+#~ msgid "api_flatten_array: could not convert value %d\n"
+#~ msgstr "api_flatten_array: arvon %d muuntaminen epäonnistui\n"
+
+#~ msgid "expression in `%s' redirection only has numeric value"
+#~ msgstr "lausekeella ”%s”-uudelleenohjauksessa on vain numeerinen arvo"
+
+#~ msgid ""
+#~ "filename `%s' for `%s' redirection may be result of logical expression"
+#~ msgstr ""
+#~ "tiedostonimi `%s' ”%s”-uudelleenohjaukselle saattaa olla loogisen "
+#~ "lausekkeen tulos"
+
+#~ msgid ""
+#~ "\n"
+#~ "To report bugs, see node `Bugs' in `gawk.info', which is\n"
+#~ "section `Reporting Problems and Bugs' in the printed version.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Vikailmoituksia varten katso solmua ”Bugs” tiedostossa ”gawk.info”, joka "
+#~ "on\n"
+#~ "kappaleessa ”Reporting Problems and Bugs” painetussa versiossa.\n"
+#~ "\n"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "tuntematon arvo kenttämääritteelle: %d\n"
+
+#~ msgid "compl(%Rg): negative value will give strange results"
+#~ msgstr "compl(%Rg): negatiivinen arvo antaa outoja tuloksia"
+
+#~ msgid "cmpl(%Zd): negative values will give strange results"
+#~ msgstr "cmpl(%Zd): negatiiviset arvot antavat outoja tuloksia"
+
+#~ msgid "%s: argument #%d negative value %Rg will give strange results"
+#~ msgstr "%s: argumentin #%d negatiivinen arvo %Rg antaa outoja tuloksia"
+
+#~ msgid "%s: argument #%d negative value %Zd will give strange results"
+#~ msgstr "%s: argumentin #%d negatiivinen arvo %Zd antaa outoja tuloksia"
+
+#~ msgid "and: received non-numeric first argument"
+#~ msgstr "and: ensimmäinen vastaanotettu argumentti ei ole numeerinen"
+
+#~ msgid "and: received non-numeric second argument"
+#~ msgstr "and: toinen vastaanotettu argumentti ei ole numeerinen"
+
+#~ msgid "`next' cannot be called from a BEGIN rule"
+#~ msgstr "”next” ei voida kutsua BEGIN-säännöstä"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr "funktio ”%s” on määritelty ottamaan enemmän kuin %d argumenttia"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "function ”%s”: puuttuva argumentti #%d"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "”getline var” virheellinen säännön ”%s” sisällä"
+
+#~ msgid "`getline' invalid inside `%s' rule"
+#~ msgstr "”getline” virheellinen säännön ”%s” sisällä"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr "ei (tunnettua) yhteyskäytäntöä tarjottu erikoistiedostonimessä ”%s”"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "erikoistiedostonimi ”%s” on vaillinainen"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "on tarjottava etäkoneen nimi pistokkeeseen ”/inet”"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "on tarjottava etäportti pistokkeeseen ”/inet”"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# %s-lohko(t)\n"
+#~ "\n"
+
+#~ msgid "range of the form `[%c-%c]' is locale dependent"
+#~ msgstr "muodon ”[%c-%c]” lukualue on paikallisasetuksesta riippuvainen"
+
+#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'"
+#~ msgstr "viite alustamattomaan elementtiin ”%s[\"%.*s\"]”"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "taulukon alaindeksi ”%s” on null-merkkijono"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: tyhjä (null)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: tyhjä (nolla)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: table_size = %d, array_size = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: array_ref-viite taulukkoon %s\n"
+
+#~ msgid "`nextfile' is a gawk extension"
+#~ msgstr "”nextfile” on gawk-laajennus"
+
+#~ msgid "`delete array' is a gawk extension"
+#~ msgstr "”delete array” on gawk-laajennus"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "ei-taulukon käyttö taulukkona"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "”%s” on Bell Labs -laajennus"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: ensimmäinen vastaanotettu argumentti ei ole numeerinen"
+
+#~ msgid "or: received non-numeric second argument"
+#~ msgstr "or: toinen vastaanotettu argumentti ei ole numeerinen"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): negatiiviset arvot antavat outoja tuloksia"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): jaosarvot typistetään"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: ensimmäinen vastaanotettu argumentti ei ole numeerinen"
+
+#~ msgid "xor: received non-numeric second argument"
+#~ msgstr "xor: toinen vastaanotettu argumentti ei ole numeerinen"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): jaosarvot typistetään"
+
+#~ msgid "can't use function name `%s' as variable or array"
+#~ msgstr "funktionimeä ”%s” käyttö muuttujana tai taulukkona epäonnistui"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "sijoitusta käytetty ehdollisessa kontekstissa"
+
+#~ msgid "statement has no effect"
+#~ msgstr "käskyllä ei ole vaikutusta"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr ""
+#~ "for-silmukka: taulukon ”%s” koko muuttui arvosta %ld arvoon %ld silmukan "
+#~ "suorituksen aikana"
+
+#~ msgid "function called indirectly through `%s' does not exist"
+#~ msgstr "kohteen ”%s” kautta epäsuorasti kutsuttu funktio ei ole olemassa"
+
+#~ msgid "function `%s' not defined"
+#~ msgstr "funktio ”%s” ei ole määritelty"
+
+#~ msgid "`nextfile' cannot be called from a `%s' rule"
+#~ msgstr "”nextfile” ei voida kutsua ”%s”-säännöstä"
+
+#~ msgid "`next' cannot be called from a `%s' rule"
+#~ msgstr "”next” ei voida kutsua ”%s”-säännöstä"
+
+#~ msgid "Sorry, don't know how to interpret `%s'"
+#~ msgstr "Ei osata tulkita kohdetta ”%s”"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "Toimintoa ei tueta"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "”-m[fr]”-valitsin asiaanliittymätön gawk:ssa"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "-m valitsinkäyttö: ”-m[fr] nnn”"
+
+#~ msgid "\t-R file\t\t\t--command=file\n"
+#~ msgstr "\t-R tiedosto\t\t\t--exec=tiedosto\n"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "ryhmien löytäminen epäonnistui: %s"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr "sijoitusta ei sallita sisäänrakennetun funktion tulokselle"
+
+#~ msgid "attempt to use array in a scalar context"
+#~ msgstr "yritettiin käyttää taulukkoa skalaarikontekstissa"
+
+#~ msgid "statement may have no effect"
+#~ msgstr "käsky saattaa olla tehoton"
+
+#~ msgid "out of memory"
+#~ msgstr "muisti loppui"
+
+#~ msgid "call of `length' without parentheses is deprecated by POSIX"
+#~ msgstr ""
+#~ "”length”-kutsu ilman sulkumerkkejä on vanhentunut POSIX-standardissa"
+
+#~ msgid "division by zero attempted in `/'"
+#~ msgstr "jakoa nollalla yritettiin operaatiossa ”/”"
+
+#~ msgid "length: untyped parameter argument will be forced to scalar"
+#~ msgstr "length: tyypitön parametri pakotetaan skalaariksi"
+
+#~ msgid "length: untyped argument will be forced to scalar"
+#~ msgstr "length: tyypitön argumentti pakotetaan skalaariksi"
+
+#~ msgid "`break' outside a loop is not portable"
+#~ msgstr "”break” silmukan ulkopuolella ei ole siirrettävä"
+
+#~ msgid "`continue' outside a loop is not portable"
+#~ msgstr "”continue” silmukan ulkopuolella ei ole siirrettävä"
+
+#~ msgid "`nextfile' cannot be called from a BEGIN rule"
+#~ msgstr "”nextfile” ei voida kutsua BEGIN-säännöstä"
+
+#~ msgid ""
+#~ "concatenation: side effects in one expression have changed the length of "
+#~ "another!"
+#~ msgstr ""
+#~ "concatenation: sivuvaikutukset yhdessä lausekkeessa ovat muuttaneet "
+#~ "toisen pituutta!"
+
+#~ msgid "illegal type (%s) in tree_eval"
+#~ msgstr "virheellinen tyyppi (%s) funktiossa tree_eval"
+
+#~ msgid "\t# -- main --\n"
+#~ msgstr "\t# -- main --\n"
+
+#~ msgid "invalid tree type %s in redirect()"
+#~ msgstr "virheellinen puutyyppi %s funktiossa redirec()"
+
+#~ msgid "/inet/raw client not ready yet, sorry"
+#~ msgstr "/inet/raw-asiakas ei ole vielä valitettavasti valmis"
+
+#~ msgid "only root may use `/inet/raw'."
+#~ msgstr "vain root-käyttäjä voi käyttää asiakasta ”/inet/raw”."
+
+#~ msgid "/inet/raw server not ready yet, sorry"
+#~ msgstr "/inet/raw-palvelin ei ole vielä valitettavasti valmis"
+
+#~ msgid "file `%s' is a directory"
+#~ msgstr "tiedosto ”%s” on hakemisto"
+
+#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'"
+#~ msgstr "käytä ”PROCINFO[\"%s\"]” eikä ”%s”"
+
+#~ msgid "use `PROCINFO[...]' instead of `/dev/user'"
+#~ msgstr "käytä ”PROCINFO[...]” eikä ”/dev/user”"
+
+#~ msgid "\t-m[fr] val\n"
+#~ msgstr "\t-m[fr] arvo\n"
+
+#~ msgid "\t-W compat\t\t--compat\n"
+#~ msgstr "\t-W compat\t\t--compat\n"
+
+#~ msgid "\t-W copyleft\t\t--copyleft\n"
+#~ msgstr "\t-W copyleft\t\t--copyleft\n"
+
+#~ msgid "\t-W usage\t\t--usage\n"
+#~ msgstr "\t-W usage\t\t--usage\n"
+
+#~ msgid "can't convert string to float"
+#~ msgstr "merkkijonon muuntaminen liukuluvuksi epäonnistui"
+
+#~ msgid "# treated internally as `delete'"
+#~ msgstr "# käsitelty sisäisesti kuin ”delete”"
+
+#~ msgid "# this is a dynamically loaded extension function"
+#~ msgstr "# tämä on dynaamisesti ladattu laajennusfunktio"
+
+#~ msgid ""
+#~ "\t# BEGIN block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# BEGIN-lohko(t)\n"
+#~ "\n"
+
+#~ msgid "unexpected type %s in prec_level"
+#~ msgstr "odottamaton tyyppi %s funktiossa prec_level"
+
+#~ msgid "Unknown node type %s in pp_var"
+#~ msgstr "Tuntematon solmutyyppi %s funktiossa pp_var"
+
+#~ msgid "can't open two way socket `%s' for input/output (%s)"
+#~ msgstr ""
+#~ "kaksisuuntaisen vastakkeen ”%s” avaaminen syötteelle/tulosteelle (%s) "
+#~ "epäonnistui"
+
+#~ msgid "attempt to use scalar `%s' as array"
+#~ msgstr "yritettiin käyttää skalaaria ”%s” taulukkona"
+
+#~ msgid "cannot pop main context"
+#~ msgstr "pääsisällön pop-toiminto epäonnistui"
+
+#~ msgid "gensub: third argument of 0 treated as 1"
+#~ msgstr "gensub: 0-arvoinen kolmas argumentti käsitellään kuin 1"
+
+#~ msgid "\t-L [fatal]\t\t--lint[=fatal]\n"
+#~ msgstr "\t-L [fatal]\t\t--lint[=fatal]\n"
+
+#~ msgid "Unmatched [ or [^"
+#~ msgstr "Pariton [ tai [^"
+
+#~ msgid "attempt to use function `%s' as an array"
+#~ msgstr "yritettiin käyttää funktiota ”%s” taulukkona"
diff --git a/gawk-5.0.1/po/fr.po b/gawk-5.0.1/po/fr.po
new file mode 100644
index 00000000000..33f25fa8b31
--- /dev/null
+++ b/gawk-5.0.1/po/fr.po
@@ -0,0 +1,3829 @@
+# Messages français pour gawk.
+# This file is distributed under the same license as the gawk package.
+# Ce fichier est distribué sous la même licence que le paquet gawk.
+# Copyright © 2004 Free Software Foundation, Inc.
+# Michel Robitaille <robitail@IRO.UMontreal.CA>, 1996-2005.
+# Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>, 2010-2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.2.63\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2019-03-02 23:58+0100\n"
+"Last-Translator: Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir."
+"org>\n"
+"Language-Team: French <traduc@traduc.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "de %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "tentative d'utiliser un scalaire comme tableau"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "tentative d'utiliser le paramètre scalaire « %s » comme tableau"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "tentative d'utiliser le scalaire « %s » comme tableau"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "tentative d'utilisation du tableau « %s » dans un contexte scalaire"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete : l'indice « %.*s » est absent du tableau « %s »"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "tentative d'utiliser le scalaire « %s[\"%.*s\"] » comme tableau"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump : le 1er argument n'est pas un tableau"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort : le 2e argument n'est pas un tableau"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti : le 2e argument n'est pas un tableau"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort : le 1er argument n'est pas un tableau"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti : le 1er argument n'est pas un tableau"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr "asort : le 2e argument ne doit pas être un sous-tableau du 1er"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr "asorti : le 2e argument ne doit pas être un sous-tableau du 1er"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr "asort : le 1er argument ne doit pas être un sous-tableau du 2e"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr "asorti : le 1er argument ne doit pas être un sous-tableau du 2e"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "« %s » n'est pas un nom de fonction autorisé"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "la fonction de comparaison « %s » du tri n'est pas définie"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "les blocs %s doivent avoir une partie action"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "chaque règle doit avoir au moins une partie motif ou action"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "l'ancien awk ne permet pas les « BEGIN » ou « END » multiples"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "« %s » est une fonction interne, elle ne peut être redéfinie"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "l'expression rationnelle constante « // » n'est pas un commentaire C++"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "l'expression rationnelle constante « /%s/ » n'est pas un commentaire C"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "le corps du switch comporte des cas répétés : %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "plusieurs « default » ont été détectés dans le corps du switch"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "« break » est interdit en dehors d'une boucle ou d'un switch"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "« continue » est interdit en dehors d'une boucle ou d'un switch"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "« next » est utilisé dans l'action %s"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "« nextfile » est utilisé dans l'action %s"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "« return » est utilisé hors du contexte d'une fonction"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"dans BEGIN ou END, un « print » seul devrait sans doute être un « print "
+"\"\" »"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "« delete » est interdit sur SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "« delete » est interdit sur FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "« delete(array) » est une extension non portable de tawk"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "impossible d'utiliser des tubes bidirectionnels en série"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr "concaténation ambiguë comme cible d'une redirection d'E/S (« > »)"
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "expression rationnelle à droite d'une affectation"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "expression rationnelle à gauche d'un opérateur « ~ » ou « !~ »"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "l'ancien awk n'autorise le mot-clef « in » qu'après « for »"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "expression rationnelle à droite d'une comparaison"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "un « getline » non redirigé n'est pas valide dans une règle « %s »"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "dans une action END, un « getline » non redirigé n'est pas défini"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "l'ancien awk ne dispose pas des tableaux multidimensionnels"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "l'appel de « length » sans parenthèses n'est pas portable"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "les appels indirects de fonctions sont une extension gawk"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"impossible d'utiliser la variable spéciale « %s » pour un appel indirect de "
+"fonction"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "tentative d'appel de « %s » comme fonction"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "expression indice incorrecte"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "avertissement : "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fatal : "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "fin de chaîne ou passage à la ligne inattendu"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+"fichiers sources et arguments doivent contenir des règles et fonctions "
+"complètes"
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "impossible d'ouvrir le fichier source « %s » en lecture (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "impossible d'ouvrir la bibliothèque partagée « %s » en lecture (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "raison inconnue"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "impossible d'inclure « %s » et de l'utiliser comme extension"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "le fichier source « %s » a déjà été intégré"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "la bibliothèque partagée « %s » est déjà chargée"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include est une extension gawk"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "Le nom de fichier après @include est vide"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load est une extension gawk"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "Le nom de fichier après @load est vide"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "le programme indiqué en ligne de commande est vide"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "impossible de lire le fichier source « %s » (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "le fichier source « %s » est vide"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "erreur bête : caractère incorrect « \\%03o » dans le code source"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "le fichier source ne se termine pas par un passage à la ligne"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr ""
+"expression rationnelle non refermée terminée par un « \\ » en fin de fichier"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"%s : %d : le modificateur d'expressions rationnelles « /.../%c » de tawk ne "
+"marche pas dans gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"le modificateur d'expressions rationnelles « /.../%c » de tawk ne marche pas "
+"dans gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "expression rationnelle non refermée"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "expression rationnelle non refermée en fin de fichier"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr ""
+"l'utilisation de « \\ #... » pour prolonger une ligne n'est pas portable"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "la barre oblique inverse n'est pas le dernier caractère de la ligne"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "les tableaux multidimensionnels sont une extension gawk"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX n'autorise pas l'opérateur « **= »"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "l'ancien awk ne dispose pas de l'opérateur « **= »"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX n'autorise pas l'opérateur « ** »"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "l'ancien awk ne dispose pas de l'opérateur « ** »"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "l'ancien awk ne dispose pas de l'opérateur « ^= »"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "l'ancien awk ne dispose pas de l'opérateur « ^ »"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "chaîne non refermée"
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX interdit les sauts de lignes physiques dans les chaînes"
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr "prolonger une chaîne via une barre oblique inversée est non portable"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "caractère incorrect « %c » dans l'expression"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "« %s » est une extension gawk"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX n'autorise pas « %s »"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "l'ancien awk ne dispose pas de « %s »"
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr "« goto » est jugé dangereux !"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d n'est pas un nombre d'arguments valide de %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s : une chaîne littérale en dernier argument d'une substitution est sans "
+"effet"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "le 3e paramètre de %s n'est pas un objet modifiable"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match : le 3e argument est une extension gawk"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close : le 2e argument est une extension gawk"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"utilisation incorrecte de dcgettext(_\"...\") : enlevez le souligné de tête"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"utilisation incorrecte de dcngettext(_\"...\") : enlevez le souligné de tête"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr ""
+"index : le second argument ne peut être une expression rationnelle constante"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "fonction « %s » : le paramètre « %s » masque la variable globale"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "impossible d'ouvrir « %s » en écriture (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "envoi de la liste des variables vers la sortie d'erreur standard"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s : échec de la fermeture (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadows_funcs() a été appelé deux fois !"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "il y avait des variables masquées."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "nom de fonction « %s » déjà défini"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr ""
+"fonction « %s » : impossible d'utiliser un nom de fonction comme paramètre"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"fonction « %s » : impossible d'utiliser la variable spéciale « %s » comme "
+"paramètre d'une fonction"
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr ""
+"fonction « %s » : le paramètre « %s » ne peut contenir un espace de noms"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr ""
+"fonction « %s » : paramètre #%d, « %s » est un doublon du paramètre #%d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "fonction « %s » appelée sans être définie"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "fonction « %s » définie mais jamais appelée directement"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "le paramètre #%d, une expr. rationnelle constante, fournit un booléen"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"fonction « %s » appelée avec un espace entre son nom\n"
+"et « ( », ou utilisée comme variable ou tableau"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "tentative de division par zéro"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "tentative de division par zéro dans « %% »"
+
+# gawk 'BEGIN { $1++ = 1 }'
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"impossible d'assigner une valeur au résultat de la post-incrémentation d'un "
+"champ"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "cible de l'assignement incorrecte (opcode %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+"identifiant %s : les noms qualifiés sont interdits en mode POSIX / "
+"traditionnel"
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+"identifiant %s : le séparateur d'espace de noms est « :: », et non « : »"
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr "l'identifiant qualifié « %s » est mal formé"
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+"identifiant « %s » : le séparateur d'espace de noms ne peut apparaître "
+"qu'une fois"
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+"utiliser l'identifiant réservé « %s » comme espace de noms est interdit"
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+"utiliser l'identifiant réservé « %s » comme 2nd composant d'un nom qualifié "
+"est interdit"
+
+#: awkgram.y:6799
+msgid "@namespace is a gawk extension"
+msgstr "@namespace est une extension gawk"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+"l'espace de noms « %s » doit respecter les règles d'écriture des identifiants"
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "échec de %s vers « %s » (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "sortie standard"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "sortie d'erreur standard"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp : l'argument n'est pas numérique"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp : l'argument %g est hors limite"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush : vidage impossible : le tube « %.*s » est ouvert en lecture et non "
+"en écriture"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush : vidage impossible : fichier « %.*s » ouvert en lecture, pas en "
+"écriture"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush : vidage vers le fichier « %.*s » impossible : %s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush : vidage impossible : le tube bidirectionnel « %.*s » a fermé son "
+"côté écriture"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr ""
+"fflush : « %.*s » n'est ni un fichier ouvert, ni un tube, ni un co-processus"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index : le premier argument n'est pas une chaîne"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index : le second argument n'est pas une chaîne"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int : l'argument n'est pas numérique"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length : l'argument reçu est un tableau"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "« length(tableau) » est une extension gawk"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length : l'argument n'est pas une chaîne"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log : l'argument n'est pas numérique"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log : l'argument est négatif %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr ""
+"fatal : « numéro$ » doit être utilisé pour toutes les formats ou pour aucun"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "taille du champ de la spécification « %% » ignorée"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "précision de la spécification « %% » ignorée"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "taille du champ et précision de la spécification « %% » ignorées"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fatal : « $ » n'est pas autorisé dans les formats awk"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fatal : le numéro d'argument de « $ » doit être > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"fatal : le numéro d'argument %ld est > au nombre total d'arguments fournis"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fatal : dans un format, « $ » ne doit pas suivre un point"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+"fatal : aucun « $ » fourni pour la taille ou la précision du champ positionné"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "« l » n'a aucun sens dans un format awk ; ignoré"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fatal : « l » est interdit dans un format awk POSIX"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "« L » n'a aucun sens dans un format awk ; ignoré"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fatal : « L » est interdit dans un format awk POSIX"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "« h » n'a aucun sens dans un format awk ; ignoré"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fatal : « h » est interdit dans un format awk POSIX"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf : valeur %g trop grande pour le format « %%c »"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf : %g n'est pas un caractère large valide"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf : valeur %g hors limite pour le format « %%%c »"
+
+#: builtin.c:1504
+#, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf : valeur %s hors limite pour le format « %%%c »"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+"le format %%%c est conforme à POSIX, mais non reconnu par les autres awk"
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr "caractère de format inconnu « %c » ignoré : aucun argument converti"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "fatal : pas assez d'arguments pour satisfaire la chaîne de formatage"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ à court pour celui-ci"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf : spécification de format sans lettre de contrôle"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "trop d'arguments pour la chaîne de formatage"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf : aucun argument"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf : aucun argument"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"printf : tentative d'écriture vers un tube bidirectionnel fermé côté écriture"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt : l'argument n'est pas numérique"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt : appelé avec un argument négatif %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr : la longueur %g n'est pas >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr : la longueur %g n'est pas >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr : la longueur %g n'est pas entière, elle sera tronquée"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr "substr : la longueur %g est trop grande, tronquée à %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr : l'index de début %g n'est pas valide, utilisation de 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr : l'index de début %g n'est pas un entier, il sera tronqué"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr : la chaîne source est de longueur nulle"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr : l'index de début %g est au-delà de la fin de la chaîne"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr : la longueur %g à partir de %g dépasse la fin du 1er argument (%lu)"
+
+# Exemple : gawk --lint 'BEGIN { PROCINFO["strftime"]=123 ;  print strftime() }'
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr ""
+"strftime : la valeur de formatage PROCINFO[\"strftime\"] est de type "
+"numérique"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime : le second argument n'est pas numérique"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: second argument négatif ou trop grand pour time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: second argument hors plage pour time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftim : le premier argument n'est pas une chaîne"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime : la chaîne de formatage est vide"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime : l'argument n'est pas une chaîne"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr ""
+"mktime : au moins l'une des valeurs est en dehors de la plage par défaut"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "La fonction « system » est interdite en isolement (mode sandbox)"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system : l'argument n'est pas une chaîne"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"print : tentative d'écriture vers un tube bidirectionnel fermé côté écriture"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "référence à un champ non initialisé « $%d »"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower : l'argument n'est pas une chaîne"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper : l'argument n'est pas une chaîne"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2 : le premier argument n'est pas numérique"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2 : le second argument n'est pas numérique"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin : l'argument n'est pas numérique"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos : l'argument n'est pas numérique"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand : l'argument n'est pas numérique"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match : le 3e argument n'est pas un tableau"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub : le 3e argument « %.*s » sera traité comme un 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s : un appel indirect nécessite deux arguments"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "un appel indirect à %s demande au moins 2 arguments"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift : le premier argument n'est pas numérique"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift : le second argument reçu n'est pas numérique"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f) : les valeurs négatives sont interdites"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f) : les valeurs non entières seront tronquées"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f) : un décalage trop grand donne des résultats inattendus"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift : le premier argument n'est pas numérique"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift : le second argument reçu n'est pas numérique"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f) : les valeurs négatives sont interdites"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f) : les valeurs non entières seront tronquées"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"rshift(%f, %f) : un décalage trop grand donnera des résultats inattendus"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and : appelé avec moins de 2 arguments"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and : l'argument %d n'est pas numérique"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and : l'argument %d est négatif (%g) ce qui est interdit"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or : appelé avec moins de 2 arguments"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or : l'argument %d n'est pas numérique"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or : l'argument %d est négatif (%g) ce qui est interdit"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor : appelé avec moins de 2 arguments"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor : l'argument %d n'est pas numérique"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor : l'argument %d est négatif (%g) ce qui est interdit"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl : l'argument n'est pas numérique"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f) : les valeurs négatives sont interdites"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f) : les valeurs non entières seront tronquées"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext : « %s » n'est pas dans un catégorie valide de la locale"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv : le 3e argument n'est pas un tableau"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv : le premier argument n'est pas numérique"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv : le second argument reçu n'est pas numérique"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv : tentative de division par zéro"
+
+#: builtin.c:4046
+msgid "typeof: second argument is not an array"
+msgstr "typeof : le 2e argument n'est pas un tableau"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+"typeof : utilisation de drapeaux incorrects « %s ». Merci de nous remonter "
+"l'erreur."
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof : type de paramètre incorrect « %s »"
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof : type d'argument inconnu « %s »"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Entrez des instructions (g)awk. Terminez avec « end »\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "numéro de trame incorrect : %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info : option incorrecte - « %s »"
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "import source « %s » : déjà intégré."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "sauve « %s » : commande interdite."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+"Impossible d'utiliser « commands » pour des points d'arrêt ou de surveillance"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "Aucun point d'arrêt ou de surveillance défini"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "numéro de point d'arrêt ou de surveillance incorrect"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr ""
+"Entrez les commandes exécutées lors de l'appui de %s %d, une par ligne.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Terminez par la commande « end »\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "« end » n'est valable que dans « commands » ou « eval »"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "« silent » n'est valable que dans « commands »"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace : option incorrecte - « %s »"
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition : numéro de point d'arrêt ou de surveillance incorrect"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "l'argument n'est pas une chaîne"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option : paramètre incorrect - « %s »"
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "fonction inconnue - « %s »"
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable : option incorrecte - « %s »"
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "spécification de plage incorrecte : %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "numéro de champ non numérique"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "valeur non numérique trouvée, nombre attendu"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "valeur entière non nulle"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - affiche la trace de tout ou des N dernières trames (du début "
+"si N < 0)."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[fichier:]N|fonction] - définit un point d'arrêt à l'endroit indiqué."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr "clear [[fichier:]N|fonction] - détruit un point d'arrêt existant."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [no] - débute une liste de commande à lancer aux points d'arrêt ou "
+"de surveillance."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition no [expr] - défini ou détruit une condition d'arrêt ou de "
+"surveillance."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [NB] - continue le programme en cours."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr "delete [points d'arrêt] [plage] - détruit les points d'arrêt indiqués."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+"disable [points d'arrêt] [plage] - désactive les points d'arrêt indiqués."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr "display [var] - affiche la valeur de la variable à chaque arrêt."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - descend de N trames dans la pile."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+"dump [fichier] - vide les instructions vers la sortie standard ou un fichier."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [points d'arrêt] [plage] - active les points d'arrêt."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - termine une liste de commandes ou d'instructions awk."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval instructions|[p1, p2, ...] - évalue des instructions awk."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (identique à quit) sort du débogueur."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - exécute jusqu'au retour de la trame sélectionnée de la pile."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - sélectionne et affiche la trame N de la pile."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+"help [commande] - affiche la liste des commandes ou explique la commande."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr "ignore N NB - ignore les NB prochaines occurrences du point d'arrêt N."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info sujet - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[fichier:]no_ligne|fonction|plage] - affiche les lignes indiquées."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr "next [NB] - avance ligne par ligne, sans détailler les sous-routines."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [NB] - avance d'une instruction, sans détailler les sous-routines."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [nom[=valeur]] - affiche ou définit les options du débogueur."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [var] - affiche la valeur d'une variable ou d'un tableau."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf format, [arg], ... - sortie formatée."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - sort du débogueur."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr "return [valeur] - fait revenir à son appelant la trame sélecionnée."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - démarre et redémarre l'exécution du programme."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr ""
+"save fichier - enregistre les commandes de la sessions dans un fichier."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set var = valeur - assigne une valeur à une variable scalaire."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - suspend les messages habituels lors des points d'arrêt et de "
+"surveillance."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source fichier - exécute les commandes du fichier."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr "step [NB] - avance jusqu'à une ligne différente du code source."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [NB] - avance d'une instruction exactement."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[fichier:]N|fonction] - définit un point d'arrêt temporaire."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - affiche les instructions avant de les exécuter."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+"undisplay [N] - retire la ou les variables de la liste d'affichage "
+"automatique."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[fichier:]N|fonction] - exécution jusqu'à dépasser la ligne courant "
+"ou la ligne N, dans la trame actuelle."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - enlève la ou les variables de la liste de surveillance."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - remonte de N trames dans la pile."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch var - définit un point de surveillance pour une variable."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where [N] - (identique à backtrace) affiche la trace de tout ou des N "
+"dernières trames (du début si N < 0)."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "impossible de lire la commande (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "impossible de lire la commande (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "la commande contient un caractère incorrect"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "commande inconnue - « %.*s », essayez « help »"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "Caractère incorrect"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "commande inconnue : %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr "affiche ou définit le nombre de lignes du fichier d'historique."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "affiche ou définit la taille de fenêtre pour la commande list."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "affiche ou définit le fichier de sortie de gawk."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "affiche ou définit l'invite du débogueur."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+"affiche ou (dés)active l'enregistrement de l'historique (valeur=on|off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "affiche ou (dés)active l'enregistrement des options (valeur=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "affiche ou (dés)active le traçage des instructions (valeur=on|off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "le programme n'est pas en cours."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "impossible de lire le fichier source « %s » (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "le fichier source « %s » est vide.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "pas de fichier source courant."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "impossible de trouver le fichier source nommé « %s » (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+"ATTENTION : fichier source « %s » modifié après compilation du programme.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "numéro de ligne %d hors limite ; « %s » a %d lignes"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "fin de fichier inattendue lors de la lecture de « %s », ligne %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "fichier source « %s » modifié depuis le début d'exécution du programme"
+
+# c-format
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Fichier source courant : %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Nombre de lignes : %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Fichier source (lignes) : %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Numéro  Post  Activé   Position\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tnb occurrences = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tignore %ld prochaines occurrences\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tcondition d'arrêt : %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tcommandes :\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Trame courante : "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Appelée par la trame : "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Appelant de la trame : "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Aucune dans main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Aucun argument.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Aucune variable locale.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Liste des variables définies :\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Liste des fonctions définies :\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Variables affichées automatiquement :\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Variables inspectées :\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "pas de symbole « %s » dans le contexte actuel\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "« %s » n'est pas un tableau\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = champ non initialisé\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "le tableau « %s » est vide\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%.*s\"] n'est pas dans le tableau « %s »\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "« %s[\"%.*s\"] » n'est pas un tableau\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "« %s » n'est pas une variable scalaire"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr ""
+"tentative d'utilisation du tableau « %s[\"%.*s\"] » en contexte scalaire"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "tentative d'utiliser le scalaire « %s[\"%.*s\"] » comme tableau"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "« %s » est une fonction"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "le point de surveillance %d est inconditionnel\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "Aucune entrée d'affichage numéro %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Aucune entrée de surveillance numéro %ld"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%.*s\"] n'est pas dans le tableau « %s »\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "tentative d'utiliser un scalaire comme tableau"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+"Point de surveillance %d détruit, car son paramètre est hors contexte.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "Affichage %d détruit, car son paramètre est hors contexte\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr "dans le fichier « %s », ligne %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " à « %s »:%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tdans "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "D'autres trames de la pile suivent...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "Numéro de trame incorrect"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Note : point d'arrêt %d (activé, ignore %ld occurrences) déjà défini à %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Note : point d'arrêt %d (activé) déjà défini à %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Note : point d'arrêt %d (désactivé, ignore %ld occurrences) déjà défini à %s:"
+"%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Note : point d'arrêt %d (désactivé) déjà défini à %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Point d'arrêt %d défini dans le fichier « %s » ligne %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "Impossible de définir un point d'arrêt dans le fichier « %s »\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "numéro de ligne %d dans le fichier « %s » hors limite"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Règle introuvable !!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "Impossible de définir un point d'arrêt à « %s »:%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Impossible de définir un point d'arrêt dans la fonction « %s »\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr ""
+"le point d'arrêt %d défini sur le fichier « %s », ligne %d est "
+"inconditionnel\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Point d'arrêt %d supprimé"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "Aucun point d'arrêt à l'appel de la fonction « %s »\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Pas de point d'arrêt sur le fichier « %s », ligne #%d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "Numéro de point d'arrêt incorrect"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Supprimer tous les points d'arrêt (o ou n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "o"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Ignorera les prochaines %ld occurrences du point d'arrêt %d.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "S'arrêtera à la prochaine occurrence du point d'arrêt %d.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr ""
+"Seuls les programmes fournis via l'option « -f » peuvent être débogués.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Échec de redémarrage du débogueur"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Programme en cours. Reprendre depuis le début (o/n) ? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Programme non redémarré\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "erreur : impossible de redémarrer, opération interdite\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "erreur (%s) : impossible de redémarrer, suite des commandes ignorées\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Démarrage du programme :\n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Le programme s'est terminé en erreur avec le code de retour : %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Le programme s'est terminé correctement avec le code de retour : %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "Le programme est en cours. Sortir quand même (o/n) ?"
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Auncun arrêt à un point d'arrêt : argument ignoré.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "point d'arrêt %d incorrect."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Les %ld prochaines occurrences du point d'arrêt %d seront ignorées.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "« finish » n'a pas de sens dans la trame initiale main()\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "S'exécute jusqu'au retour de "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "« return » n'a pas de sens dans la trame initiale main()\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "Impossible de trouver la position indiquée dans la fonction « %s »\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "ligne source %d incorrecte dans le fichier « %s »"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "Position %d introuvable dans le fichier « %s »\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "élément absent du tableau\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "variable sans type\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Arrêt dans %s...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "« finish » n'a pas de sens avec un saut non local « %s »\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "« until » n'a pas de sens avec un saut non local « %s »\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t---« [Entrée] » continuer ; « q [Entrée] » quitter---"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] est absent du tableau « %s »"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "envoi de la sortie vers stdout\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "nombre incorrect"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "« %s » interdit dans ce contexte ; instruction ignorée"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "« return » interdit dans ce contexte ; instruction ignorée"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Pas de symbole « %s » dans le contexte actuel"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "type de nœud %d inconnu"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "code opération %d inconnu"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "le code opération %s n'est pas un opérateur ou un mot-clef"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "débordement de tampon dans genflag2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Pile des appels de fonctions :\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "« IGNORECASE » est une extension gawk"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "« BINMODE » est une extension gawk"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "la valeur « %s » de BINMODE n'est pas valide, 3 utilisé à la place"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "spécification de « %sFMT » erronée « %s »"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "désactivation de « --lint » en raison d'une affectation à « LINT »"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "référence à un argument non initialisé « %s »"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "référence à une variable non initialisée « %s »"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "tentative de référence à un champ via une valeur non numérique"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "tentative de référence à un champ via une chaîne nulle"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "tentative d'accès au champ %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "référence à un champ non initialisé « $%ld »"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "la fonction « %s » a été appelée avec trop d'arguments"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: type « %s » inattendu"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "tentative de division par zéro dans « /= »"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "tentative de division par zéro dans « %%= »"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "les extensions sont interdites en isolement (mode sandbox)"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load est une extension gawk"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext : lib_name reçu NULL"
+
+#: ext.c:60
+#, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext : impossible d'ouvrir la bibliothèque « %s » (%s)"
+
+#: ext.c:66
+#, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext : bibliothèque « %s » : ne définit pas "
+"« plugin_is_GPL_compatible » (%s)"
+
+#: ext.c:72
+#, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr ""
+"load_ext : bibliothèque « %s » : impossible d'appeler la fonction « %s » (%s)"
+
+#: ext.c:76
+#, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr ""
+"load_ext : bibliothèque « %s » : échec de la routine d'initialisation « %s »"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin : nom de fonction manquant"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin : impossible d'utiliser la fonction gawk « %s » comme nom de "
+"fonction"
+
+#: ext.c:109
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin : impossible d'utiliser la fonction gawk « %s » comme espace de "
+"noms"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin : impossible de redéfinir la fonction « %s »"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin : fonction « %s » déjà définie"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin : nom de la fonction « %s » déjà défini"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin : la fonction « %s » a un nombre négatif d'arguments"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+"fonction « %s » : argument #%d : tentative d'utilisation d'un scalaire comme "
+"tableau"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr ""
+"fonction « %s » : argument #%d : tentative d'utiliser un tableau comme "
+"scalaire"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "chargement dynamique des bibliothèques impossible"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat : impossible de lire le lien symbolique « %s »"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat : paramètres incorrects"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init : impossible de créer la variable %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "fts n'est pas compatible avec ce système"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element : impossible de créer le tableau"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element : impossible de définir l'élément"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element : impossible de définir l'élément"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element : impossible de définir l'élément"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process : impossible de créer le tableau"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process : impossible de définir l'élément"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts : appelé avec un nombre d'arguments incorrects, attendu : 3"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts : premier paramètre incorrect"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts : deuxième paramètre incorrect"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts : troisième paramètre incorrect"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts : impossible d'aplatir le tableau\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts : on ignore le drapeau sournois FTS_NOSTAT..."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts : échec de clear_array()\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch : impossible d'obtenir le 1er argument"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch : impossible d'obtenir le 2e argument"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch : impossible d'obtenir le 3e argument"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch n'est pas disponible sur ce système\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init : impossible d'ajouter la variable FNM_NOMATCH"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init : impossible de définir l'élément de tableau %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init : impossible d'installer le tableau FNM"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork : PROCINFO n'est pas un tableau !"
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace::begin : modification sur place déjà active"
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace::begin : 2 arguments attendus, appelé avec %d"
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace::begin : impossible de récupérer le 1er argument comme nom de fichier"
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace::begin : modification sur place annulée pour le fichier incorrect "
+"« %s »"
+
+#: extension/inplace.c:152
+#, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace::begin : stat impossible sur « %s » (%s)"
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace::begin : « %s » n'est pas un fichier ordinaire"
+
+#: extension/inplace.c:170
+#, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace::begin : échec de mkstemp('%s') (%s)"
+
+#: extension/inplace.c:182
+#, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace::begin : échec de la chmod (%s)"
+
+#: extension/inplace.c:189
+#, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace::begin : échec de dup(stdout) (%s)"
+
+#: extension/inplace.c:192
+#, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::begin : échec de dup2(%d, stdout) (%s)"
+
+#: extension/inplace.c:195
+#, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace::begin : échec de close(%d) (%s)"
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace::end : 2 arguments attendus, appelé avec %d"
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace::end : impossible de récupérer le 1er argument comme nom de fichier"
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace::end : modification sur place non active"
+
+#: extension/inplace.c:227
+#, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::end : échec de dup2(%d, stdout) (%s)"
+
+#: extension/inplace.c:230
+#, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace::end : échec de close(%d) (%s)"
+
+#: extension/inplace.c:234
+#, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace::end : échec de fsetpos(stdout) (%s)"
+
+#: extension/inplace.c:247
+#, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace::end : échec de link('%s', '%s') (%s)"
+
+#: extension/inplace.c:257
+#, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace::end : échec de rename('%s', '%s') (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord : appelé avec des arguments incorrects"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr : appelé avec des arguments incorrects"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of : échec de opendir/fdopendir : %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile : appelé avec un mauvais type d'argument"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput : impossible d'initialiser la variable REVOUT"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea : l'argument 0 n'est pas une chaîne\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea : l'argument 1 n'est pas un tableau\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array : impossible d'aplatir le tableau\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array : impossible de libérer le tableau aplati\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "le tableau est de type inconnu %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada : l'argument 0 n'est pas une chaîne\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada : l'argument 1 n'est pas un tableau\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada : échec de clear_array\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array : échec de set_array_element\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+"valeur récupérée avec un code de type inconnu %d traitée comme une chaîne"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday : n'est pas disponible sur cette plateforme"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep : l'argument numérique requis est absent"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep : l'argument est négatif"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep : n'est pas disponible sur cette plateforme"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "champ d'entrée trop grand"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "une valeur négative a été assignée à NF"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr "décrémenter NF n'est pas portable vers de nombreux awk"
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr "accéder aux champs depuis un END pourrait ne pas être portable"
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split : le 4e argument est une extension gawk"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split : le 4e argument n'est pas un tableau"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split : le 2e argument n'est pas un tableau"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr "split : impossible d'utiliser le même tableau comme 2e et 4e argument"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split : impossible d'utiliser un sous-tableau du 2e argument en 4e argument"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split : impossible d'utiliser un sous-tableau du 4e argument en 2e argument"
+
+#: field.c:1036
+msgid "split: null string for third arg is a non-standard extension"
+msgstr ""
+"split : utiliser une chaîne vide en 3e argument est une extension non "
+"standard"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit : le 4e argument n'est pas un tableau"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit : le 2e argument n'est pas un tableau"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit : le 3e argument n'est pas un tableau"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit : impossible d'utiliser le même tableau comme 2e et 4e argument"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit : impossible d'utiliser un sous-tableau du 2e argument en 4e "
+"argument"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit : impossible d'utiliser un sous-tableau du 4e argument en 2e "
+"argument"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "« FIELDWIDTHS » est une extension gawk"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "« * » doit être le dernier élément de FIELDWIDTHS"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "valeur de FIELDWIDTHS incorrecte, pour le champ %d, près de « %s »"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "utiliser une chaîne vide pour « FS » est une extension gawk"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr ""
+"l'ancien awk n'accepte pas les expr. rationnelles comme valeur de « FS »"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "« FPAT » est une extension gawk"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node : retval nul reçu"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node : mode MPFR non utilisé"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node : MPFR non disponible"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node : type numérique incorrect « %d »"
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "add_ext_func : réception d'un espace de noms NULL"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+"node_to_awk_value : utilisation de drapeaux numériques incorrects « %s ». "
+"Merci de nous remonter l'erreur."
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value : node nul reçu"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value : val nul reçu"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+"node_to_awk_value : utilisation de drapeaux incorrects « %s ». Merci de nous "
+"remonter l'erreur."
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element : tableau nul reçu"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element : indice nul reçu"
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array_typed : impossible de convertir l'indice %d en %s"
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array_typed : impossible de convertir la valeur %d en %s"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr : MPFR non disponible"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "fin de la règle BEGINFILE non trouvée"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "impossible d'ouvrir le type de fichier « %s » inconnu en « %s »"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "L'argument « %s » de la ligne de commande est un répertoire : ignoré"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "impossible d'ouvrir le fichier « %s » en lecture (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "échec de la fermeture du fd %d (« %s ») : %s"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "les redirections sont interdites en isolement (mode sandbox)"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "l'expression dans la redirection « %s » est un nombre"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "l'expression dans la redirection « %s » donne une chaîne nulle"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"le fichier « %.*s » de la redirection « %s » pourrait être le résultat d'une "
+"expression booléenne"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "mélange non nécessaire de « > » et « >> » pour le fichier « %.*s »"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file : impossible de créer le tube « %s » avec le fd %d"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "impossible d'ouvrir le tube « %s » en sortie (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "impossible d'ouvrir le tube « %s » en entrée (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"création d'un connecteur via get_file non disponible sur cette plateforme "
+"pour « %s » avec le fd %d"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr ""
+"impossible d'ouvrir un tube bidirectionnel « %s » en entrées-sorties (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "impossible de rediriger depuis « %s » (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "impossible de rediriger vers « %s » (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"limite système du nombre de fichiers ouverts atteinte : début du "
+"multiplexage des descripteurs de fichiers"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "échec de la fermeture de « %s » (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "trop de fichiers d'entrées ou de tubes ouverts"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close : le second argument doit être « to » ou « from »"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr ""
+"close : « %.*s » n'est ni un fichier ouvert, ni un tube ou un co-processus"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "fermeture d'une redirection qui n'a jamais été ouverte"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close : la redirection « %s » n'a pas été ouverte avec « |& », second "
+"argument ignoré"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "résultat d'échec (%d) sur la fermeture du tube « %s » (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "résultat d'échec (%d) sur la fermeture du fichier « %s » (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "aucune fermeture explicite du connecteur « %s » fournie"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "aucune fermeture explicite du co-processus « %s » fournie"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "aucune fermeture explicite du tube « %s » fournie"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "aucune fermeture explicite du fichier « %s » fournie"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush : impossible de vider la sortie standard : %s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush : impossible de vider la sortie d'erreur standard : %s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "erreur lors de l'écriture vers la sortie standard (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "erreur lors de l'écriture vers l'erreur standard (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "échec du vidage du tube « %s » (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "échec du vidage du tube vers « %s » par le co-processus (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "échec du vidage vers le fichier « %s » (%s)."
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "port local %s incorrect dans « /inet » : %s"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "port local %s incorrect dans « /inet »"
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "informations sur l'hôte et le port distants (%s, %s) incorrectes : %s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "informations sur l'hôte et le port distants (%s, %s) incorrectes"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "les communications TCP/IP ne sont pas disponibles"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "impossible d'ouvrir « %s », mode « %s »"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "échec de la fermeture du pty maître (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "échec de la fermeture de stdout du processus fils (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"échec du déplacement du pty esclave vers le stdout du processus fils (dup : "
+"%s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "échec de fermeture du stdin du processus fils (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"échec du déplacement du pty esclave vers le stdin du processus fils (dup : "
+"%s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "échec de la fermeture du pty esclave (%s)"
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr "impossible de créer un processus fils ou d'ouvrir un pty"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr "échec du déplacement du tube vers stdout du processus fils (dup : %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr "échec de déplacement du tube vers stdin du processus fils (dup : %s)"
+
+#: io.c:2386 io.c:2655
+msgid "restoring stdout in parent process failed"
+msgstr "échec de la restauration du stdout dans le processus parent"
+
+#: io.c:2394
+msgid "restoring stdin in parent process failed"
+msgstr "échec de la restauration du stdin dans le processus parent"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "échec de la fermeture du tube (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "« |& » non disponible"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "impossible d'ouvrir le tube « %s » (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "impossible de créer le processus fils pour « %s » (fork : %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+"getline : tentative de lecture vers un tube bidirectionnel fermé côté lecture"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser : pointeur NULL reçu"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"l'analyseur d'entrée « %s » est en conflit avec l'analyseur « %s » déjà "
+"installé"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "l'analyseur d'entrée « %s » n'a pu ouvrir « %s »"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper : pointeur NULL reçu"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"le filtre de sortie « %s » est en conflit avec le filtre « %s » déjà installé"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "le filtre de sortie « %s » n'a pu ouvrir « %s »"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor : pointeur NULL reçu"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"le gestionnaire bidirectionnel « %s » est en conflit avec le gestionnaire "
+"« %s » déjà installé"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "le gestionnaire bidirectionnel « %s » n'a pu ouvrir « %s »"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "le fichier de données « %s » est vide"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "impossible d'allouer plus de mémoire d'entrée"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr ""
+"l'utilisation d'un « RS » de plusieurs caractères est une extension gawk"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "les communications IPv6 ne sont pas disponibles"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+"variable d'environnement « POSIXLY__CORRECT » définie : activation de « --"
+"posix »"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "« --posix » prend le pas sur « --traditional »"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr ""
+"« --posix » et « --traditional » prennent le pas sur « --non-decimal-data »"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "« --posix » prend le pas sur « --characters-as-bytes »"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr ""
+"l'exécution de %s en mode setuid root peut être un problème de sécurité"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "impossible d'activer le mode binaire sur stdin (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "impossible d'activer le mode binaire sur stdout (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "impossible d'activer le mode binaire sur stderr (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "aucun programme !"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"Utilisation : %s [options GNU ou POSIX] -f fichier_prog [--] fichier ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+"Utilisation : %s [options GNU ou POSIX] [--] %cprogramme%c fichier ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "Options POSIX :\t\tOptions longues GNU : (standard)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f fichier_prog\t\t--file=fichier_prog\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=valeur\t\t--assign=var=valeur\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Options POSIX :\t\tOptions longues GNU : (extensions)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[fichier]\t\t--dump-variables[=fichier]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[fichier]\t\t--debug[=fichier]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'programme'\t\t--source='programme'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E fichier\t\t--exec=fichier\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i fichier\t\t--include=fichier\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l bibliothèque\t\t--load=bibliothèque\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[fichier]\t\t--pretty-print[=fichier]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[fichier]\t\t--profile[=fichier]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr "\t-Z nom-locale\t\t--locale=nom-locale\n"
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Pour signaler une anomalie, consultez le nœud « Bugs » de\n"
+"« gawk.info », qui est dans la section « Reporting Problems and Bugs »\n"
+"de la version imprimée. Vous trouverez les mêmes informations sur\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"MERCI de ne PAS essayer de signaler une anomalie via comp.lang.awk,\n"
+"\n"
+"ou en utilisant un forum internet tel que Stack Overflow.\n"
+"\n"
+"Pour signaler une erreur de traduction, envoyez un message à la liste\n"
+"traduc@traduc.org.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk est un langage de recherche et de traitement des motifs.\n"
+"Par défaut, il lit l'entrée standard et écrit sur la sortie standard.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Exemples :\n"
+"\tgawk '{ somme += $1 }; END { print somme }' fichier\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright © 1998, 1991-%d Free Software Foundation.\n"
+"\n"
+"Ce programme est un logiciel libre ; vous pouvez le redistribuer et le\n"
+"modifier selon les termes de la licence publique générale GNU (GNU\n"
+"General Public License), telle que publiée par la Free Software\n"
+"Foundation ; soit selon la version 3 de cette licence, soit selon une\n"
+"version ultérieure de votre choix.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Ce logiciel est distribué en espérant qu'il sera utile, mais SANS AUCUNE\n"
+"GARANTIE, y compris les garanties implicites D'ADAPTATION À UN BUT\n"
+"SPÉCIFIQUE et de COMMERCIALISATION. Pour plus d'informations à ce\n"
+"sujet, consultez le texte de la licence publique générale GNU (GNU\n"
+"General Public License).\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Vous devriez avoir reçu copie de la licence publique générale GNU\n"
+"(GNU General Public License) avec ce programme. Sinon, consultez\n"
+"http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft ne définit pas le FS comme étant une tabulation en awk POSIX"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s : « %s » l'argument de « -v » ne respecte pas la forme « var=valeur »\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "« %s » n'est pas un nom de variable autorisé"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "« %s » n'est pas un nom de variable, recherche du fichier « %s=%s »"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "impossible d'utiliser le mot clef gawk « %s » comme variable"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "impossible d'utiliser la fonction « %s » comme variable"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "exception du traitement en virgule flottante"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "fatal : erreur interne"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "fatal : erreur interne : erreur de segmentation"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "fatal : erreur interne : débordement de la pile"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "aucun descripteur fd %d pré-ouvert"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "impossible de pré-ouvrir /dev/null pour le descripteur fd %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "argument vide de l'option « -e / --source » ignoré"
+
+#: main.c:1662 main.c:1667
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "« --profile » prend le pas sur « --pretty-print »"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M sans effet : version compilée sans MPFR/GMP"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s : option « -W %s » non reconnue, ignorée\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s : l'option requiert un argument - %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "la valeur « %.*s » de PREC est incorrecte"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "la valeur « %.*s » de RNDMODE est incorrecte"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s : argument reçu non numérique"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg) : valeur négative interdite"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg) : les valeurs non entières seront tronquées"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd) : les valeurs négatives sont interdites"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s : argument reçu non numérique #%d"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s : l'argument #%d a une valeur incorrecte %Rg, utilisation de 0"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s : argument #%d : la valeur négative %Rg est interdite"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s : argument #%d : la valeur non entière %Rg sera tronquée"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s : argument #%d : la valeur négative %Zd est interdite"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "ligne de commande:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "impossible de créer une expression rationnelle typée"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "l'ancien awk ne dispose pas de la séquence d'échappement « \\%c »"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX n'autorise pas les séquences d'échappement « \\x »"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "aucun chiffre hexadécimal dans la séquence d'échappement « \\x » "
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"la séquence d'échappement hexa. \\x%.*s de %d caractères ne sera "
+"probablement pas interprétée comme vous l'imaginez"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "séquence d'échappement « \\%c » traitée comme un simple « %c »"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Données multioctets incorrectes détectées. Possible incohérence entre "
+"données et paramètres régionaux (locale)."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr ""
+"%s %s « %s » : impossible d'obtenir les drapeaux du fd : (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr ""
+"%s %s « %s »: impossible de positionner close-on-exec: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr "Trop de niveaux d'indentation. Envisagez de restructurer votre code"
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "impossible d'ouvrir « %s » en écriture : %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "envoi du profil vers la sortie d'erreur standard"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s règle(s)\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Règle(s)\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "erreur interne : %s avec un vname nul"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "erreur interne : fonction interne avec un fname nul"
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"%s# Extensions chargées (via -l ou @load)\n"
+"\n"
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\n"
+"# Fichiers inclus (via -i ou @include)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# profile gawk, créé %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Fonctions, par ordre alphabétique\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str : type de redirection %d inconnu"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+"le comportement d'une exp. rationnelle incluant des caractères NUL est non "
+"défini pour POSIX"
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr "octet NUL invalide dans une exp. rationnelle dynamique"
+
+#: re.c:172
+#, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr ""
+"séquence d'échappement d'exp. rationnelle « \\%c » traitée comme un simple "
+"« %c »"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+"séquence d'échappement d'exp. rationnelle « \\%c » n'est pas un opérateur "
+"connu"
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr ""
+"le composant d'expression rationnelle « %.*s » devrait probablement être "
+"« [%.*s] »"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "[ non apparié"
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "classe de caractères incorrecte"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "la syntaxe des classes de caractères est [[:space:]], et non [:space:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "échappement \\ non terminé"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "contenu de \\{\\} incorrect"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "expression rationnelle trop grande"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "( non apparié"
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "aucune syntaxe indiquée"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ") non apparié"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s : l'option « %s » est ambiguë ; possibilités :"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s : l'option « --%s » n'accepte pas d'argument\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s : l'option « %c%s » n'accepte pas d'argument\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s : l'option « --%s » nécessite un argument\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s : option non reconnue « --%s »\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s : option non reconnue « %c%s »\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s : option incorrecte - « %c »\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s : l'option requiert un argument - « %c »\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s : l'option « -W %s » est ambiguë\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s : l'option « -W %s » n'accepte pas d'argument\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s : l'option « -W %s » nécessite un argument\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Succès"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Aucune correspondance"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expression rationnelle incorrecte"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Caractère d'interclassement incorrect"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nom de classe de caractères incorrect"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barre oblique inverse finale"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Référence arrière incorrecte"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [. ou [= sans correspondance"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( ou \\( sans correspondance"
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ sans correspondance"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Contenu de \\{\\} incorrect"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Borne finale incorrecte"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Mémoire épuisée"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Expression rationnelle précédente incorrecte"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fin prématurée de l'expression rationnelle"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Expression rationnelle trop grande"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") ou \\) sans correspondance"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Aucune expression rationnelle précédente"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr ""
+"fonction « %s » : impossible d'utiliser la fonction « %s » comme paramètre"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "impossible de rétablir (pop) le contexte principal (main)"
+
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "échec de setenv(TZ, %s) : %s"
+
+#~ msgid "setenv(TZ, %s) restoration failed (%s)"
+#~ msgstr "échec de la retauration de setenv(TZ, %s) : %s"
+
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "échec de unsetenv(TZ) : %s"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "barre oblique inverse à la fin de la chaîne"
+
+#~ msgid "`isarray' is deprecated. Use `typeof' instead"
+#~ msgstr "« isarray » est obsolète. Utilisez « typeof »"
+
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr ""
+#~ "tentative d'utilisation du tableau « %s[\".*%s\"] » en contexte scalaire"
+
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "tentative d'utiliser le scalaire « %s[\".*%s\"] » comme tableau"
diff --git a/gawk-5.0.1/po/gawk.pot b/gawk-5.0.1/po/gawk.pot
new file mode 100644
index 00000000000..1740c949312
--- /dev/null
+++ b/gawk-5.0.1/po/gawk.pot
@@ -0,0 +1,3572 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 5.0.1\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr ""
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr ""
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr ""
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr ""
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr ""
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr ""
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr ""
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr ""
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr ""
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr ""
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr ""
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr ""
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr ""
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr ""
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr ""
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr ""
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr ""
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr ""
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr ""
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr ""
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr ""
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr ""
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr ""
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr ""
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr ""
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr ""
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr ""
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr ""
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr ""
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr ""
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr ""
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr ""
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr ""
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr ""
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr ""
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr ""
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr ""
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr ""
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr ""
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr ""
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr ""
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr ""
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr ""
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr ""
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr ""
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr ""
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr ""
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr ""
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr ""
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr ""
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr ""
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr ""
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr ""
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr ""
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr ""
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr ""
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr ""
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr ""
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr ""
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr ""
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr ""
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr ""
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr ""
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr ""
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr ""
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr ""
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr ""
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr ""
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr ""
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr ""
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr ""
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr ""
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr ""
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr ""
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr ""
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr ""
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr ""
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr ""
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr ""
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr ""
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr ""
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr ""
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr ""
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr ""
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr ""
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr ""
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr ""
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr ""
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr ""
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr ""
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr ""
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr ""
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr ""
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr ""
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr ""
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr ""
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr ""
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr ""
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr ""
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr ""
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr ""
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+msgid "@namespace is a gawk extension"
+msgstr ""
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr ""
+
+#: builtin.c:147
+msgid "standard output"
+msgstr ""
+
+#: builtin.c:148
+msgid "standard error"
+msgstr ""
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr ""
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr ""
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr ""
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr ""
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr ""
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr ""
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr ""
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr ""
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr ""
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr ""
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr ""
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr ""
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr ""
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr ""
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr ""
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr ""
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr ""
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr ""
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr ""
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr ""
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr ""
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr ""
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr ""
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr ""
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr ""
+
+#: builtin.c:1504
+#, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr ""
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr ""
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr ""
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr ""
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr ""
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr ""
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr ""
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr ""
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr ""
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr ""
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr ""
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr ""
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr ""
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr ""
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr ""
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr ""
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr ""
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr ""
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr ""
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr ""
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr ""
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr ""
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr ""
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr ""
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr ""
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr ""
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr ""
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr ""
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr ""
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr ""
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr ""
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr ""
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr ""
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr ""
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr ""
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr ""
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr ""
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr ""
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr ""
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr ""
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr ""
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr ""
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr ""
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr ""
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr ""
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr ""
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr ""
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr ""
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr ""
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr ""
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr ""
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr ""
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr ""
+
+#: builtin.c:4046
+msgid "typeof: second argument is not an array"
+msgstr ""
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr ""
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr ""
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr ""
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr ""
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr ""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr ""
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr ""
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr ""
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr ""
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr ""
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr ""
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr ""
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr ""
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr ""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr ""
+
+#: command.y:451
+msgid "argument not a string"
+msgstr ""
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr ""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr ""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr ""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr ""
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr ""
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr ""
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr ""
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr ""
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr ""
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr ""
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr ""
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr ""
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr ""
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr ""
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr ""
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr ""
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr ""
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr ""
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr ""
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr ""
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr ""
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr ""
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr ""
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr ""
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr ""
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr ""
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr ""
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr ""
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr ""
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr ""
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr ""
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr ""
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr ""
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: command.y:1293
+msgid "invalid character"
+msgstr ""
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr ""
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr ""
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr ""
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr ""
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr ""
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr ""
+
+#: debug.c:358
+msgid "program not running."
+msgstr ""
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr ""
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr ""
+
+#: debug.c:493
+msgid "no current source file."
+msgstr ""
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr ""
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr ""
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr ""
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr ""
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr ""
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr ""
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr ""
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr ""
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr ""
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr ""
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr ""
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr ""
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr ""
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr ""
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr ""
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr ""
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr ""
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr ""
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr ""
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr ""
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr ""
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr ""
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr ""
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr ""
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr ""
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr ""
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr ""
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr ""
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr ""
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr ""
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr ""
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr ""
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr ""
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr ""
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr ""
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr ""
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr ""
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr ""
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr ""
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr ""
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr ""
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr ""
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr ""
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr ""
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr ""
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr ""
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr ""
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr ""
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr ""
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr ""
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr ""
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr ""
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr ""
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr ""
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr ""
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr ""
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr ""
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr ""
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr ""
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr ""
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr ""
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr ""
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr ""
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr ""
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr ""
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr ""
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr ""
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr ""
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr ""
+
+#: debug.c:4324
+msgid "q"
+msgstr ""
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr ""
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr ""
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr ""
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr ""
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr ""
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr ""
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr ""
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr ""
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr ""
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr ""
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr ""
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr ""
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr ""
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr ""
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr ""
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr ""
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr ""
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr ""
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr ""
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr ""
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr ""
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr ""
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr ""
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr ""
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr ""
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr ""
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr ""
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr ""
+
+#: ext.c:60
+#, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr ""
+
+#: ext.c:66
+#, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+
+#: ext.c:72
+#, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr ""
+
+#: ext.c:76
+#, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr ""
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr ""
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+
+#: ext.c:109
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr ""
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr ""
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr ""
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr ""
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr ""
+
+#: ext.c:232
+msgid "dynamic loading of libraries is not supported"
+msgstr ""
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr ""
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr ""
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr ""
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr ""
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr ""
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr ""
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr ""
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr ""
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr ""
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr ""
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr ""
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr ""
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr ""
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr ""
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr ""
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr ""
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr ""
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr ""
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr ""
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr ""
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr ""
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr ""
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr ""
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+
+#: extension/inplace.c:152
+#, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr ""
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr ""
+
+#: extension/inplace.c:170
+#, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:182
+#, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:189
+#, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:192
+#, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:195
+#, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr ""
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr ""
+
+#: extension/inplace.c:227
+#, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:230
+#, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:234
+#, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:247
+#, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:257
+#, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr ""
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr ""
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr ""
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr ""
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr ""
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr ""
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr ""
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr ""
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr ""
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr ""
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr ""
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr ""
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr ""
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr ""
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr ""
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr ""
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr ""
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr ""
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr ""
+
+#: field.c:284
+msgid "input record too large"
+msgstr ""
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr ""
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr ""
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr ""
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr ""
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+
+#: field.c:1036
+msgid "split: null string for third arg is a non-standard extension"
+msgstr ""
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr ""
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr ""
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr ""
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr ""
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr ""
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr ""
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr ""
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr ""
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr ""
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr ""
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr ""
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr ""
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr ""
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr ""
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr ""
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr ""
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr ""
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr ""
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr ""
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr ""
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr ""
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr ""
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr ""
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr ""
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr ""
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr ""
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr ""
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr ""
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr ""
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr ""
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr ""
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr ""
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr ""
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr ""
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr ""
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr ""
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr ""
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr ""
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr ""
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr ""
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr ""
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr ""
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr ""
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr ""
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr ""
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr ""
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr ""
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr ""
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr ""
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr ""
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr ""
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr ""
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr ""
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr ""
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr ""
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr ""
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr ""
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr ""
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr ""
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr ""
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr ""
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr ""
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr ""
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+
+#: io.c:2386 io.c:2655
+msgid "restoring stdout in parent process failed"
+msgstr ""
+
+#: io.c:2394
+msgid "restoring stdin in parent process failed"
+msgstr ""
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr ""
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr ""
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr ""
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr ""
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr ""
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr ""
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr ""
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr ""
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr ""
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr ""
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr ""
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr ""
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr ""
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr ""
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr ""
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr ""
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr ""
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr ""
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr ""
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr ""
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr ""
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr ""
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr ""
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr ""
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr ""
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr ""
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr ""
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr ""
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr ""
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr ""
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr ""
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr ""
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr ""
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr ""
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr ""
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr ""
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr ""
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr ""
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr ""
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr ""
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr ""
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr ""
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr ""
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr ""
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr ""
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr ""
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr ""
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr ""
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr ""
+
+#: main.c:625
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr ""
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr ""
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr ""
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr ""
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr ""
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr ""
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr ""
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr ""
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr ""
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr ""
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr ""
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr ""
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr ""
+
+#: main.c:1662 main.c:1667
+msgid "`--profile' overrides `--pretty-print'"
+msgstr ""
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr ""
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr ""
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr ""
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr ""
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr ""
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr ""
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr ""
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr ""
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr ""
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr ""
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr ""
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr ""
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr ""
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr ""
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr ""
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr ""
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr ""
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr ""
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr ""
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr ""
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr ""
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr ""
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr ""
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr ""
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr ""
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr ""
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr ""
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr ""
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr ""
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr ""
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr ""
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr ""
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr ""
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr ""
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr ""
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr ""
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr ""
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr ""
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ""
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr ""
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr ""
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr ""
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr ""
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr ""
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr ""
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr ""
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr ""
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr ""
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr ""
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr ""
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr ""
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr ""
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr ""
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr ""
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr ""
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr ""
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr ""
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr ""
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr ""
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr ""
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr ""
diff --git a/gawk-5.0.1/po/id.po b/gawk-5.0.1/po/id.po
new file mode 100644
index 00000000000..f62f1ef667e
--- /dev/null
+++ b/gawk-5.0.1/po/id.po
@@ -0,0 +1,4045 @@
+# Pesan bahasa indonesia untuk gawk.
+# Copyright (C) 2008 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Arif E. Nugroho <arif_endro@yahoo.com>, 2008, 2009, 2010, 2011, 2012, 2013, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.1.0b\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2014-08-03 07:30+0700\n"
+"Last-Translator: Arif E. Nugroho <arif_endro@yahoo.com>\n"
+"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
+"Language: id\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "dari %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "mencoba untuk menggunakan skalar sebagai sebuah array"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "mencoba untuk menggunakan parameter `%s' sebagai sebuah array"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "mencoba untuk menggunakan skalar `%s' sebagai sebuah array"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "mencoba menggunakan array `%s' dalam sebuah konteks skalar"
+
+#: array.c:574
+#, fuzzy, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: indeks `%s' tidak dalam array `%s'"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "mencoba untuk menggunakan skalar `%s[\"%.*s\"]' sebagai sebuah array"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: argumen ketiga bukan sebuah array"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: argumen kedua bukan sebuah array"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: argumen kedua bukan sebuah array"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: argumen ketiga bukan sebuah array"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: argumen ketiga bukan sebuah array"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr "asort: cannot use a subarray of first arg for second arg"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr "asorti: cannot use a subarray of first arg for second arg"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr "asort: cannot use a subarray of second arg for first arg"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr "asorti: cannot use a subarray of second arg for first arg"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "`%s' digunakan dalam aksi"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "fungsi `%s' tidak didefinisikan"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s blok harus memiliki sebuah bagian aksi"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "setiap aturan harus memiliki sebuah pola atau sebuah bagian aksi"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "awk lama tidak mendukung multiple aturan `BEGIN' atau `END'"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "`%s' adalah sebuah fungsi bawaan, ini tidak dapat di redefinisi"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "konstanta regexp `//' tampak seperti sebuah komentar C++, tetapi bukan"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "konstanta regexp `/%s/' tampak seperti sebuah komentar C, tetapi bukan"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "duplikasi nilai case dalam tubuh switch: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "Duplikasi `default' terdeteksi dalam tubuh switch"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "`break' diluar sebuah loop tidak diijinkan"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "`continue' diluar sebuah loop tidak diijinkan"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "`next' digunakan dalam aksi %s"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "`nextfile' digunakan dalam aksi %s"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "`return' digunakan diluar konteks fungsi"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"plain `print' dalam aturan BEGIN atau AKHIR seharusnya berupa `print \"\"'"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "`delete' is not allowed with SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "`delete' is not allowed with FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "`delete(array)' adalah sebuah ekstensi tidak portabel tawk"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "multi tahap dua jalur pipe lines tidak bekerja"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "ekspresi regular di penempatan kanan"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "ekspresi regular di kiri dari operator `~' atau `!~'"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "awk lama tidak mendukung kata kunci `in' kecuali setelah `for'"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "ekspresi regular di kanan dari perbandingan"
+
+#: awkgram.y:1794
+#, fuzzy, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "`getline' invalid inside `%s' rule"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "tidak terdireksi `getline' tidak terdefinisi didalam aksi END"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "awk lama tidak mendukung array multi dimensi"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "panggilan dari `length' tanpa tanda kurung tidak portabel"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "indirect adalah sebuah ekstensi gawk"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr "tidak dapat menggunakan variabel `%s' sebagai fungsi parameter"
+
+#: awkgram.y:2039
+#, fuzzy, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "mencoba untuk menggunakan fungsi `%s' sebagai sebuah array"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "ekspresi subscript tidak valid"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "peringatan: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fatal: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "tidak terduga baris baru atau akhir dari string"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "tidak dapat membuka berkas sumber `%s' untuk pembacaan (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "tidak dapat membuka berkas sumber `%s' untuk pembacaan (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "alasan tidak diketahui"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "can't include `%s' and use it as a program file"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "tidak dapat membaca berkas sumber `%s'"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "already loaded shared library `%s'"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include adalah sebuah ekstensi gawk"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "empty filename after @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load adalah sebuah ekstensi gawk"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "empty filename after @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "aplikasi teks kosong di baris perintah"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "tidak dapat membaca berkas sumber `%s' (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "berkas sumber `%s' kosong"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr ""
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "berkas sumber tidak berakhir dalam baris baru"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "tidak terakhiri regexp akhir denga `\\' diakhir dari berkas"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "%s: %d: tawk regex pemodifikasi `/.../%c' tidak bekerja dalam gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "tawk regex pemodifikasi `/.../%c' tidak bekerja dalam gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "tidak terselesaikan regexp"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "tidak terselesaikan di akhir dari berkas"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "penggunaan dari `\\ #...' kelanjutan baris tidak portabel"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "backslash bukan karakter terakhir di baris"
+
+#: awkgram.y:3858 awkgram.y:3860
+#, fuzzy
+msgid "multidimensional arrays are a gawk extension"
+msgstr "indirect adalah sebuah ekstensi gawk"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX tidak mengijinkan operator `**='"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "awk lama tidak mendukung operator `**='"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX tidak mengijinkan operator `**'"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "awk lama tidak mendukung operator `**'"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "operator `^=' tidak didukung dalam awk lama"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "operator `^' tidak didukung dalam awk lama"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "string tidak terselesaikan"
+
+#: awkgram.y:4048 main.c:1220
+#, fuzzy
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX tidak mengijinkan escapes `\\x'"
+
+#: awkgram.y:4050 node.c:453
+#, fuzzy
+msgid "backslash string continuation is not portable"
+msgstr "penggunaan dari `\\ #...' kelanjutan baris tidak portabel"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "karakter '%c' tidak valid dalam ekspresi"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "`%s' adalah sebuah ekstensi gawk"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX tidak mengijinkan `%s'"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "`%s' tidak didukung dalam awk lama"
+
+#: awkgram.y:4494
+#, fuzzy
+msgid "`goto' considered harmful!"
+msgstr "`goto' dipertimbangkan berbahaya!\n"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d tidak valid sebagai jumlah dari argumen untuk %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s: literal string sebagai argumen terakhir dari pergantian tidak memiliki "
+"efek"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "%s parameter ketika bukan sebuah objek yang dapat diubah"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "cocok: argumen ketiga adalah sebuah ekstensi gawk"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "tutup: argumen kedua adalah sebuah ekstensi gawk"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"penggunaan dari dcgettext(_\"...\") adalah tidak benar: hapus garis bawah "
+"yang mengawali"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"penggunaan dari dcngettext(_\"...\") adalah tidak benar: hapus garis bawah "
+"yang mengawali"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: diterima argumen kedua bukan string"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "fungsi `%s': parameter `%s' bayangan variabel global"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "tidak dapat membuka `%s' untuk menulis (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "mengirim profile ke standar error"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: tutup gagal (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() dipanggil dua kali!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "disana tidak ada variabel bayangan."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "nama fungsi `%s' sebelumnya telah didefinisikan"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr ""
+"fungsi `%s': tidak dapat menggunakan nama fungsi sebagai nama parameter"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"fungsi `%s': tidak dapat menggunakan variabel `%s' sebagai fungsi parameter"
+
+#: awkgram.y:5092
+#, fuzzy, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "fungsi `%s': parameter `%s' bayangan variabel global"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "fungsi `%s': parameter #%d, `%s', duplikasi paramter #%d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "fungsi `%s' dipanggil tetapi tidak pernah didefinisikan"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "fungsi `%s' didefinisikan tetapi tidak pernah dipanggil"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "konstanta regexp untuk parameter #%d menghasilkan nilai boolean"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"fungsi `%s' dipanggil dengan spasi diantara nama dan `(',\n"
+"atau gunakan sebagai sebuah variabel atau sebuah array"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "pembagian dengan nol telah dicoba"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "pembagian dengan nol dicoba dalam `%%'"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"cannot assign a value to the result of a field post-increment expression"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "tidak valid sebagai jumlah dari argumen untuk %s"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "@include adalah sebuah ekstensi gawk"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s ke \"%s\" gagal (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "standar keluaran"
+
+#: builtin.c:148
+#, fuzzy
+msgid "standard error"
+msgstr "standar keluaran"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: diterima argumen bukan-numerik"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: argumen %g diluar dari jangkauan"
+
+#: builtin.c:245
+#, fuzzy, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: tidak dapat flush: pipe `%s' dibuka untuk dibaca, bukan ditulis"
+
+#: builtin.c:248
+#, fuzzy, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: tidak dapat flush: berkas `%s' dibuka untuk dibaca, bukan ditulis"
+
+#: builtin.c:259
+#, fuzzy, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr ""
+"fflush: tidak dapat flush: berkas `%s' dibuka untuk dibaca, bukan ditulis"
+
+#: builtin.c:264
+#, fuzzy, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: tidak dapat flush: pipe `%s' dibuka untuk dibaca, bukan ditulis"
+
+#: builtin.c:270
+#, fuzzy, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: `%s' bukan sebuah berkas terbuka, pipe atau co-proses"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "indeks: diterima argumen pertama bukan string"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "indeks: diterima argumen kedua bukan string"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: diterima argumen bukan numerik"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: diterima argumen bukan-string"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "`length(array)' adalah sebuah ekstensi gawk"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: diterima argumen bukan-string"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: diterima argumen bukan numerik"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: diterima argumen negatif %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "harus menggunakan `count$' di semua format atau tidak sama sekali"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "lebar daerah diabaikan untuk penspesifikasi `%%'"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "ketepatan diabaikan untuk penspesifikasi `%%'"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "lebar daerah dan presisi diabaikan untuk penspesifikasi `%%'"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "`$' tidak diijinkan dalam format awk"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "arg count dengan `$' harus > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"arg count %ld lebih besar dari jumlah total dari argumen yang diberikan"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "`$' tidak diijinkan setelah periode dalam format"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr "tidak ada `$' yang diberikan untuk posisional field width atau presisi"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "`l' tidak berarti dalam format awk; diabaikan"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "`l' tidak diijinkan dalam format POSIX awk"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "`L' tidak berarti dalam format awk; diabaikan"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "`L' tidak diijinkan dalam format awk POSIX"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "`h' tidak berarti dalam format awk; diabaikan"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "`h' tidak diijinkan dalam format awk POSIX"
+
+#: builtin.c:1091
+#, fuzzy, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: nilai %g diluar dari jangkauan untuk format `%%%c'"
+
+#: builtin.c:1104
+#, fuzzy, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: nilai %g diluar dari jangkauan untuk format `%%%c'"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: nilai %g diluar dari jangkauan untuk format `%%%c'"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: nilai %g diluar dari jangkauan untuk format `%%%c'"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"mengabaikan format tidak dikenal karakter penspesifikasi `%c': tidak ada "
+"argumen yang diubah"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "tidak cukup argumen untuk memuaskan format string"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ kehabisan untuk yang ini"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: penspesifikasi format tidak memiliki pengontrol huruf"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "terlalu banyak argumen diberikan untuk format string"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: tidak ada argumen"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: tidak ada argumen"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: diterima argumen bukan numerik"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: dipanggil dengan argumen %g negatif"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: panjang %g tidak >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: panjang %g tidak >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: panjang bukan integer %g akan dipotong"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+"substr: panjang %g terlalu besar untuk pengindeksan string, dipotong ke %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: awal indeks %g tidak valid, menggunakan 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: awal indeks %g bukan integer akan dipotong"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: sumber string memiliki panjang nol"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: awal indeks %g melewati akhir dari string"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: panjang %g di awal indeks %g melewati panjang dari argumen pertama "
+"(%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: diterima argumen kedua bukan numerik"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: second argument less than 0 or too big for time_t"
+
+#: builtin.c:2023
+#, fuzzy
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: second argument less than 0 or too big for time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: diterima argumen pertama bukan string"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: diterima format string kosong"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: diterima argumen bukan string"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: at least one of the values is out of the default range"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "'system' function not allowed in sandbox mode"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: diterima argumen bukan string"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "referensi ke field tidak terinisialisasi `$%d'"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: diterima argumen bukan string"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: diterima argumen bukan string"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: diterima argumen pertama bukan numerik"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: diterima argumen kedua bukan numerik"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: diterima argumen bukan numerik"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: diterima argumen bukan numerik"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: diterima argumen bukan numerik"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: argumen ketiga bukan sebuah array"
+
+#: builtin.c:2919
+#, fuzzy, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: argumen ketiga dari 0 diperlakukan sebagai 1"
+
+#: builtin.c:3241
+#, fuzzy, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "and: dipanggil dengan argumen negatif"
+
+#: builtin.c:3341
+#, fuzzy, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "and: dipanggil dengan argumen negatif"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: diterima argumen pertama bukan numerik"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: diterima argumen kedua bukan numerik"
+
+#: builtin.c:3404
+#, fuzzy, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): nilai negatif akan memberikan hasil aneh"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): nilai pecahan akan dipotong"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): nilai shift terlalu besar akan memberikan hasil aneh"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: diterima argumen pertama bukan numerik"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: diterima argumen kedua bukan-numerik"
+
+#: builtin.c:3443
+#, fuzzy, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f. %f): nilai negatif akan memberikan hasil aneh"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): nilai pecahan akan dipotong"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): nilai shift terlalu besar akan memberikan hasil aneh"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: dipanggil dengan argumen negatif"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: argumen %d diluar dari jangkauan"
+
+#: builtin.c:3483
+#, fuzzy, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: nilai %d negatif akan memberikan %g hasil aneh"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: dipanggil dengan argumen negatif"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: argumen %d diluar dari jangkauan"
+
+#: builtin.c:3515
+#, fuzzy, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: nilai %d negatif akan memberikan %g hasil aneh"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: dipanggil dengan argumen negatif"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: argumen %d diluar dari jangkauan"
+
+#: builtin.c:3547
+#, fuzzy, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: nilai %d negatif akan memberikan %g hasil aneh"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: diterima argumen bukan numerik"
+
+#: builtin.c:3577
+#, fuzzy, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): nilai negatif akan memberikan hasil aneh"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): nilai pecahan akan dipotong"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: `%s' bukan sebuah kategori lokal yang valid"
+
+#: builtin.c:3988 mpfr.c:1203
+#, fuzzy
+msgid "intdiv: third argument is not an array"
+msgstr "match: argumen ketiga bukan sebuah array"
+
+#: builtin.c:3996 mpfr.c:1211
+#, fuzzy
+msgid "intdiv: received non-numeric first argument"
+msgstr "and: diterima argumen pertama tidak numerik"
+
+#: builtin.c:3998 mpfr.c:1213
+#, fuzzy
+msgid "intdiv: received non-numeric second argument"
+msgstr "and: diterima argumen kedua bukan numerik"
+
+#: builtin.c:4007 mpfr.c:1252
+#, fuzzy
+msgid "intdiv: division by zero attempted"
+msgstr "pembagian dengan nol telah dicoba"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: argumen kedua bukan sebuah array"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+
+#: builtin.c:4101
+#, fuzzy, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "option: invalid parameter - \"%s\""
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr ""
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Type (g)awk statement(s). End with the command \"end\"\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "Akhir jangkauan tidak valid: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: pilihan tidak valid - \"%s\""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\": already sourced."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": command not permitted."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr "Can't use command `commands' for breakpoint/watchpoint commands"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "no breakpoint/watchpoint has been set yet"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "invalid breakpoint/watchpoint number"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Type commands for when %s %d is hit, one per line.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "End with the command \"end\"\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "`end' valid only in command `commands' or `eval'"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "`silent' valid only in command `commands'"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: pilihan tidak valid - \"%s\""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: invalid breakpoint/watchpoint number"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "tidak cukup argumen untuk memuaskan format string"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: invalid parameter - \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "no such function - \"%s\""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: pilihan tidak valid - \"%s\""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "Akhir jangkauan tidak valid: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "non-numeric value for field number"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "non-numeric value found, numeric expected"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "non-zero integer value"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr "clear [[filename:]N|function] - delete breakpoints previously set."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition num [expr] - set or clear breakpoint or watchpoint condition."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [COUNT] - continue program being debugged."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr "delete [breakpoints] [range] - delete specified breakpoints."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr "disable [breakpoints] [range] - disable specified breakpoints."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr "display [var] - print value of variable each time the program stops."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - move N frames down the stack."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr "dump [filename] - dump instructions to file or stdout."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - end a list of commands or awk statements."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+
+#: command.y:847
+#, fuzzy
+msgid "exit - (same as quit) exit debugger."
+msgstr "quit - exit debugger."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - execute until selected stack frame returns."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - select and print stack frame number N."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr "help [command] - print list of commands or explanation of command."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr "next [COUNT] - step program, proceeding through subroutine calls."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [COUNT] - stepp one instruction, but proceed through subroutine calls."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [name[=value]] - set or display debugger option(s)."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [var] - print value of a variable or array."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf format, [arg], ... - formatted output."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - exit debugger."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr "return [value] - make selected stack frame return to its caller."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - start or restart executing program."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save filename - save commands from the session to file."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set var = value - assign value to a scalar variable."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source file - execute commads from file."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr "step [COUNT] - step program until it reaches a different source line."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [COUNT] - step one instruction exactly."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[filename:]N|function] - set a temporary breakpoint."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - print instruction before executing."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr "undisplay [N] - remove variable(s) from automatic display list."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - remove variable(s) from watch list."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - move N frames up the stack."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch var - set a watchpoint for a variable."
+
+#: command.y:905
+#, fuzzy
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "tidak dapat redirek dari (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "tidak dapat redirek dari (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "nama kelas karakter tidak valid"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "unknown command - \"%.*s\", try help"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "Karakter kolasi tidak valid"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "undefined command: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr "set or show the number of lines to keep in history file."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "set or show the list command window size."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "set or show gawk output file."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "set or show debugger prompt."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr "(un)set or show saving of command history (value=on|off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "(un)set or show saving of options (value=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "(un)set or show instruction tracing (value=on|off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "program not running."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "tidak dapat membaca berkas sumber `%s' (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "berkas sumber `%s' kosong.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "no current source file."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "tidak dapat membaca berkas sumber `%s' (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr "WARNING: source file `%s' modified since program compilation.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "line number %d out of range; `%s' has %d lines"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "tidak terduga baris baru atau akhir dari string `%s', %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "source file `%s' modified since start of program execution"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Current source file: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Number of lines: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Source file (lines): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tno of hits = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tignore next %ld hit(s)\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tstop condition: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tcommands:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Current frame: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Called by frame: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Caller of frame: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "None in main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "tidak ada argumen\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "No locals.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"All defined variables:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"All defined functions:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Auto-display variables:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Watch variables:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "no symbol `%s' in current context\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "`%s' bukan sebuah nama variabel legal\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "referensi ke field tidak terinisialisasi $%ld\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "berkas data `%s' kosong\n"
+
+#: debug.c:1132 debug.c:1184
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "indeks [\"%s\"] tidak dalam array `%s'\n"
+
+#: debug.c:1188
+#, fuzzy, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "`%s[\"%s\"]' is no an array\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "`%s' bukan sebuah nama variabel legal"
+
+#: debug.c:1272 debug.c:5133
+#, fuzzy, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "mencoba menggunakan array `%s[\"%s\"]' dalam sebuah konteks skalar"
+
+#: debug.c:1295 debug.c:5144
+#, fuzzy, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "mencoba untuk menggunakan skalar `%s[\"%s\"]' sebagai sebuah array"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "`%s' digunakan dalam aksi"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "watchpoint %d is unconditional\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "No display item numbered %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "No watch item numbered %ld"
+
+#: debug.c:1543
+#, fuzzy, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: indeks [\"%s\"] tidak dalam array `%s'\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "mencoba untuk menggunakan skalar sebagai sebuah array"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr "Watchpoint %d deleted because parameter is out of scope.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "Display %d deleted because parameter is out of scope.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " in file `%s', line %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " at `%s':%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tin"
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "More stack frames follow ...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "Akhir jangkauan tidak valid"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr "Note: breakpoint %d (enabled, ignore next %ld hits), alse set at %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Note: breakpoint %d (enabled), also set at %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Note: breakpoint %d (disabled), also set at %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Breakpoint %d set at file `%s', line %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "Can't set breakpoint in file `%s'\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "argumen %d diluar dari jangkauan `%s'"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Can't find rule!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "Can't set breakpoint at `%s':%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Can't set breakpoint in function `%s'\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "breakpoint %d set at file `%s', line %d is unconditional\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Deleted breakpoint %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "No breakpoint(s) at entry to function `%s'\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "error membaca berkas masukan `%s': %d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "invalid breakpoint number"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Delete all breakpoints? (y or n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "y"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "Will stop next time breakpoint %d is reached.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "Can only debug programs provided with the `-f' option.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Failed to restart debugger"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Program already running. Restart from beginning (y/n)? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Program not restarted\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "error: cannot restart, operation not allowed\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "error (%s): cannot restart, ignoring rest of the commands\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Starting program: \n"
+
+#: debug.c:2977
+#, fuzzy, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Program exited %s with exit value: %d\n"
+
+#: debug.c:2978
+#, fuzzy, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Program exited %s with exit value: %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "The program is running. Exit anyway (y/n)? "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Not stopped at any breakpoint; argument ignored.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "invalid breakpoint number %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Will ignore next %ld crossings of breakpoint %d.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "'finish' not meaningful in the outermost frame main()\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Run till return from"
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "'return' not meaningful in the outermost frame main()\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "Can't find specified location in function `%s'\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "invalid source line %d in file `%s'"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "Can't find specified location %d in file `%s'\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "tidak dalam array\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "untyped variable\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Stopping in %s ...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "'finish' not meaningful with non-local jump '%s'\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "'until' not meaningful with non-local jump '%s'\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t------[Enter] to continue or q [Enter] to quit------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%s\"] tidak dalam array `%s'"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "sending output to stdout\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "invalid number"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "`%s' not allowed in current context; statement ignored"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "`return' not allowed in current context; statement ignored"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "No symbol `%s' in current context"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "tipe titik %d tidak diketahui"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "tipe titik %d tidak diketahui"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "opcode %s not an operator or keyword"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "buffer overflow dalam genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Fungsi Call Stack:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "`IGNORECASE' adalah ekstensi gawk"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "`BINMODE' adalah ekstensi gawk"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "BINMODE nilai `%s' tidak valid, diperlakukan sebagai 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "buruk `%sFMT' spesifikasi `%s'"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "menonaktifkan `--lint' karena penempatan ke `LINT'"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "referensi ke argumen `%s' tidak terinisialisasi"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "referensi ke variabel `%s' tidak terinisialisasi"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "mencoba untuk mereferensi field dari nilai bukan numerik"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "mencoba untuk mereferensi dari null string"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "mencoba untuk mengakses field %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "referensi ke field tidak terinisialisasi `$%ld'"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "fungsi `%s' dipanggil argumen lebih dari yang dideklarasikan"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: unexpected type `%s'"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "pembagian dengan nol dicoba dalam `/='"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "pembagian dengan nol dicoba dalam `%%='"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "extensions are not allowed in sandbox mode"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "adalah sebuah ekstensi gawk"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: received NULL lib_name"
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: tidak dapat membuka `%s' (%s)\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: perpustakaan `%s': tidak dapat memanggil fungsi `%s' (%s)\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: library `%s' initialization routine `%s' failed\n"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: hilang nama fungsi"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: tidak dapat menggunakan gawk bawaan `%s' sebagai nama fungsi"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: tidak dapat menggunakan gawk bawaan `%s' sebagai nama fungsi"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: tidak dapat meredefinisi fungsi `%s'"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: fungsi `%s' telah didefinisikan"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: nama fungsi `%s' telah didefinisikan sebelumnya"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: negative argument count for function `%s'"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+"fungsi `%s': argumen #%d: mencoba menggunaka skalar sebagai sebuah array"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr ""
+"fungsi `%s': argumen #%d: mencoba untuk menggunakan array sebagai sebuah "
+"skalar"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "dynamic loading of library not supported"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: unable to read symbolic link `%s'"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: adalah parameter"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init: could not create variable %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "tidak didukung dalam awk lama"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: could not create array"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: could not set element"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: could not set element"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: could not set element"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: could not create array"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: could not set element"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: dipanggil dengan argumen negatif"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: adalah parameter"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: adalah parameter"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: adalah parameter"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: could not flatten array\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() failed\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: diterima argumen pertama bukan string"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: diterima argumen kedua bukan string"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: could not get third argument"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch is not implemented on this system\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: could not add FNM_NOMATCH variable"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: could not set array element %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: could not install FNM array"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO is not an array!"
+
+#: extension/inplace.c:131
+#, fuzzy
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace_begin: in-place editing already active"
+
+#: extension/inplace.c:134
+#, fuzzy, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace_begin: expects 2 arguments but called with %d"
+
+#: extension/inplace.c:137
+#, fuzzy
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr "inplace_begin: cannot retrieve 1st argument as a string filename"
+
+#: extension/inplace.c:145
+#, fuzzy, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr "inplace_begin: disabling in-place editing for invalid FILENAME `%s'"
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace_begin: tidak dapat membuka `%s' (%s)"
+
+#: extension/inplace.c:159
+#, fuzzy, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace_begin: `%s' is not a regular file"
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace_begin: mkstemp(`%s') failed (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace_begin: tutup gagal (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace_begin: dup(stdout) failed (%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_begin: dup2(%d, stdout) failed (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace_begin: tutup(%d) gagal (%s)"
+
+#: extension/inplace.c:211
+#, fuzzy, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace_begin: expects 2 arguments but called with %d"
+
+#: extension/inplace.c:214
+#, fuzzy
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr "inplace_end: cannot retrieve 1st argument as a string filename"
+
+#: extension/inplace.c:221
+#, fuzzy
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace_end: in-place editing not active"
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_end: dup2(%d, stdout) failed (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace_end: tutup(%d) gagal (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace_end: fsetpos(stdout) failed (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace_end: pipe flush dari (`%s',`%s') gagal (%s)."
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace_end: penutupan dari fd (`%s',`%s') gagal (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: dipanggil dengan argumen negatif"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: dipanggil dengan argumen negatif"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir failed: %s"
+
+#: extension/readfile.c:131
+#, fuzzy
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: dipanggil dengan argumen negatif"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr ""
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_write: argumen diluar dari jangkauan\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: argumen kedua bukan sebuah array\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: could not flatten array\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: could not release flattened array\n"
+
+#: extension/rwarray.c:255
+#, fuzzy, c-format
+msgid "array value has unknown type %d"
+msgstr "tipe titik %d tidak diketahui"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: argumen diluar dari jangkauan\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: argumen ketiga bukan sebuah array\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array failed\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element failed\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: not supported on this platform"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: diterima argumen bukan-numerik"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: argumen diluar dari jangkauan"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: not supported on this platform"
+
+#: field.c:284
+msgid "input record too large"
+msgstr ""
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF set ke nilai negatif"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: argumen ketiga adalah sebuah ekstensi gawk"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: argumen kedua bukan sebuah array"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: argumen kedua bukan sebuah array"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr "split: cannot use the same array for second and fourth args"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr "split: cannot use a subarray of second arg for fourth arg"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr "split: cannot use a subarray of fourth arg for secod arg"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: null string untuk arg ketika adalah sebuah ekstensi gawk"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: argumen kedua bukan sebuah array"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: argumen kedua bukan sebuah array"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: argumen ketiga bukan sebuah array"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr "patsplit: cannot use the same array for second and fourth args"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr "patsplit: cannot use a subarray of second arg for fourth arg"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr "patsplit: cannot use a subarray of fourth arg for second arg"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "`FIELDWIDTHS' adalah sebuah ekstensi gawk"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr ""
+
+#: field.c:1239
+#, fuzzy, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "nilai FIELDWIDTHS tidak valid, didekat `%s'"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "null string untuk `FS' adalah sebuah ekstensi gawk"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "awk lama tidak mendukung regexps sebagai nilai dari `FS'"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "`FPAT' adalah sebuah ekstensi gawk"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: received null retval"
+
+#: gawkapi.c:178 gawkapi.c:189
+#, fuzzy
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: received null retval"
+
+#: gawkapi.c:183 gawkapi.c:194
+#, fuzzy
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: received null retval"
+
+#: gawkapi.c:198
+#, fuzzy, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: received null retval"
+
+#: gawkapi.c:385
+#, fuzzy
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "load_ext: received NULL lib_name"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: received null node"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: received null val"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: received null array"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: received null subscript"
+
+#: gawkapi.c:1217
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array: could not convert index %d\n"
+
+#: gawkapi.c:1222
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array: could not convert value %d\n"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:1365
+#, fuzzy
+msgid "cannot find end of BEGINFILE rule"
+msgstr "`next' tidak dapat dipanggil dari sebuah aturan BEGIN"
+
+#: gawkapi.c:1419
+#, fuzzy, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "tidak dapat membuka berkas sumber `%s' untuk pembacaan (%s)"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "command line argument `%s' is a directory: skipped"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "tidak dapat membuka berkas `%s' untuk membaca (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "penutupan dari fd %d (`%s') gagal (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "redirection not allowed in sandbox mode"
+
+#: io.c:787
+#, fuzzy, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "ekspresi dalam `%s' redireksi hanya memiliki nilai numerik"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "ekspresi untuk `%s' redireksi hanya memiliki nilai string null"
+
+#: io.c:796
+#, fuzzy, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"nama berkas `%s' untuk `%s' redireksi hanya menghasilkan ekspresi logikal"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "pencampuran tidak perlu dari `>' dan `>>' untuk berkas `%.*s'"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr ""
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "tidak dapat membuka pipe `%s' untuk keluaran (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "tidak dapat membuka pipe `%s' untuk masukan (%s)"
+
+#: io.c:950
+#, fuzzy, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr "gettimeofday: not supported on this platform"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "tidak dapat membuka pipe dua arah `%s' untuk input/output (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "tidak dapat redirek dari `%s' (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "tidak dapat redirek ke `%s' (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"batas sistem tercapi untuk berkas terbuka: mulai untuk multiplex berkas "
+"deskripsi"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "penutupan dari `%s' gagal (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "terlalu banyak pipes atau berkas masukan terbuka"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: argumen kedua harus berupa `to' atau `from'"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: `%.*s' bukan sebuah berkas terbuka, pipe atau co-proses"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "penutupan dari redireksi yang tidak pernah terbuka"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: redireksi `%s' tidak dibuka dengan `|&', argumen kedua diabaikan"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "status gagal (%d) di tutup pipe  dari `%s' (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "status gagal (%d) di tutup berkas dari `%s' (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "tidak ada eksplisit tutup dari socket `%s' yang disediakan"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "tidak ada eksplisit tutup dari co-proses `%s' yang disediakan"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "tidak ada eksplisit tutup dari pipe `%s' disediakan"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "tidak ada eksplisit close dari berkas `%s' disediakan"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr ""
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr ""
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "error menulis standar keluaran (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "error menulis standar error (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "pipe flush dari `%s' gagal (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "co-proses flush dari pipe ke `%s' gagal (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "file flush dari `%s' gagal (%s)."
+
+#: io.c:1610
+#, fuzzy, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "lokal port %s tidak valid dalam `/inet'"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "lokal port %s tidak valid dalam `/inet'"
+
+#: io.c:1636
+#, fuzzy, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "remote host dan informasi port (%s, %s) tidak valid"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "remote host dan informasi port (%s, %s) tidak valid"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "komunikasi TCP/IP tidak didukung"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "tidak dapat membuka `%s', mode `%s'"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "penutupan dari master pty gagal (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "penutupan dari stdout dalam child gagal (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr "memindahkan slave pty ke stdout dalam child gagal (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "penutupan dari stdin dalam anak gagal (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr "memindahkan slave pty ke stdin dalam anak gagal (dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "penutupan dari pty budak gagal (%s)"
+
+#: io.c:2265
+#, fuzzy
+msgid "could not create child process or open pty"
+msgstr "tidak dapat membuat proses anak untuk `%s' (fork: %s)"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr "memindahkan pipe ke stdout dalam anak gaal (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr "memindahkan pipe ke stdin dalam anak gagal (dup: %s)"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr "mengembalikan stdout dalam proses orang tua gagal\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr "mengembalikan stdin dalam proses orang tua gagal\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "penutupan dari pipe gagal (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "`|&' tidak didukung"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "tidak dapat membuka pipe `%s' (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "tidak dapat membuat proses anak untuk `%s' (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: received NULL pointer"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"input parser `%s' conflicts with previously installed input parser `%s'"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "input parser `%s' failed to open `%s'"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: received NULL pointer"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "output wrapper `%s' failed to open `%s'"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: received NULL pointer"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "two way processor `%s' failed to open `%s'"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "berkas data `%s' kosong"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "tidak dapat mengalokasikan lebih dari masukan memori"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "nilai multi karakter dari `RS' adalah sebuah ekstensi gawk"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "IPv6 komunikasi TCP/IP tidak didukung"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr "variabel lingkungan `POSIXLY_CORRECT' set: mengaktifkan `--posix'"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "`--posix' overrides `--traditional'"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "`--posix'/`--traditional' overrides `--non-decimal-data'"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "`--posix' overrides `--characters-as-bytes'"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "menjalankan %s setuid root mungkin sebuah masalah keamanan"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "tidak dapat menset mode binari di stdin (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "tidak dapat menset mode binari di stdout (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "tidak dapat menset mode binari di stderr (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "tidak ada teks aplikasi apapun!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"Penggunaan: %s [pilihan POSIX atau gaya GNU] -f progfile [--] berkas ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+"Penggunaan: %s[ pilihan POSIX atau gaya GNU] [--] %cprogram%c berkas ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "pilihan POSIX:\t\tpilihan panjang GNU:\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f progfile\t\t--file=progfile\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=val\t\t--assign=var=val\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "pilihan POSIX:\t\tpilihan panjang GNU:\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C hak cipta\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d tampilkan variabel[=berkas]\t\t--dump-variables[=berkas]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D profile[=file]\t\t--profile[=file]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e sumber=teks-program\t\t--source=teks-program\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E exec=berkas\t\t\t--exec=berkas\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g gen-po\t\t\t--gen-po\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h bantuan\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i includefile\t\t--include=includefile\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-I library\t\t--load=library\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L lint[=fatal]\t\t--lint[=fatal]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--optimize\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N use-lc-numeric\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n non-decimal-data\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-W profile[=file]\t\t--profile[=file]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-0\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p profile[=file]\t\t--profile[=file]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P posix\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r re-interval\t\t\t--re-interval\n"
+
+#: main.c:617
+#, fuzzy
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-0\t\t\t--optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t lint-old\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V versi\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y parsedebug\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Untuk melaporkan bugs, lihat titik `Bugs' dalam `gawk.info', dalam\n"
+"daerah `Reporting Problems and Bugs' dalam versi tercetak.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk adalah sebuah pencarian pola dan bahasa pemrosesan.\n"
+"Secara baku ini membaca standar masukan dan menulis standa keluaran.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Contoh:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' berkas\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Hak Cipta (C) 1989, 1991-%d Free Software Foundationn.\n"
+"\n"
+"Aplikasi ini adalah aplikasi bebas; anda dapat meredistribusikannya dan/atau "
+"memodifikasinya\n"
+"dibawah ketentuan dari GNU General Public License seperti dipublikasikan "
+"oleh\n"
+"Free Software Foundation; baik versi 3 dari Lisensi, atau\n"
+"(di pilihan anda) untuk versi selanjutnya.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Aplikasi ini didistribusikan dengan harapan ini akan berguna,\n"
+"tetapi TANPA GARANSI APAPUN; bahkan tanpa garansi yang diimplisikasikan "
+"dari\n"
+"PERDAGANGAN atau KESESUAIAN UNTUK SEBUAH TUJUAN TERTENTU. Lihat\n"
+"GNU General Public License untuk lebih lengkapnya.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Anda seharusnya menerima salinan dari GNU General Public License\n"
+"bersama dengan aplikasi ini. Jika tidak, lihat http://www.gnu.org/"
+"licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft tidak menset FS ke tab dalam POSIX awk"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: `%s' argumen ke `-v' tidak dalam bentuk `var=value'\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "`%s' bukan sebuah nama variabel legal"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "`%s' bukan sebuah nama variabel, pencarian untuk berkas `%s=%s'"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "tidak dapat menggunakan gawk bawaan `%s' sebagai nama fungsi"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr ""
+"tidak dapat menggunakan nama fungsi `%s' sebagai sebuah variabel atau array"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "eksepsi titik pecahan"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "fatal error: internal error"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "fatal error: internal error: segfault"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "fatal error: internal error: stack overflow"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "tidak ada pre-opened fd %d"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "tidak dapat pre-open /dev/null untuk fd %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "argumen kosong ke `-e/--source' diabaikan"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "`--posix' overrides `--traditional'"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr ""
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: pilihan `-W %s' tidak dikenal, diabaikan\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: pilihan membutuhkan sebuah argumen -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "PREC nilai `%.*s' tidak valid, diperlakukan sebagai 3"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "RNDMODE nilai `%.*s' tidak valid, diperlakukan sebagai 3"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: diterima argumen bukan numerik"
+
+#: mpfr.c:816
+#, fuzzy
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): nilai negatif akan memberikan hasil aneh"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg): nilai pecahan akan dipotong"
+
+#: mpfr.c:832
+#, fuzzy, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): nilai negatif akan memberikan hasil aneh"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: diterima argumen bukan numerik #%d"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: argument #%d has invalid value %Rg, using 0"
+
+#: mpfr.c:871
+#, fuzzy
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: #%d nilai negatif %Rg akan memberikan hasil aneh"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: #%d nilai pecahan %Rg akan dipotong"
+
+#: mpfr.c:892
+#, fuzzy, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: #%d nilai negatif %Zd akan memberikan hasil aneh"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "cmd. baris:"
+
+#: node.c:481
+#, fuzzy
+msgid "could not make typed regex"
+msgstr "tidak terselesaikan regexp"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "awk lama tidak mendukung escape sequence `\\%c'"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX tidak mengijinkan escapes `\\x'"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "tidak ada digit heksa dalam escape sequence `\\x'"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"hex escape \\x%.*s dari karakter %d mungkin tidak dapat diinterpretrasikan "
+"seperti yang anda kira"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "escape sequence `\\%c' diperlakukan sebagai plain `%c'"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s `%s': tidak dapat menset close-on-exec: (fcntl: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s `%s': tidak dapat menset close-on-exec: (fcntl: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "tidak dapat membuka `%s' untuk penulisan: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "mengirim profile ke standar error"
+
+#: profile.c:271
+#, fuzzy, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# Aturan\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Aturan\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "internal error: %s dengan null vname"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "internal error: dengan null vname"
+
+#: profile.c:1302
+#, fuzzy, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"\t# Loaded extensions (-l and/or @load)\n"
+"\n"
+
+#: profile.c:1333
+#, fuzzy, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\t# Loaded extensions (-l and/or @load)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# gawk profile, dibuat %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Fungsi, terdaftar secara alphabet\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: unknown redirection type %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "escape sequence `\\%c' diperlakukan sebagai plain `%c'"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "regexp component `%.*s' should probably be `[%.*s]'"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "unbalanced ["
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "nama kelas karakter tidak valid"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "character class syntax is [[:space:]], not [:space:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "unfinished \\ escape"
+
+#: support/dfa.c:1492
+#, fuzzy
+msgid "invalid content of \\{\\}"
+msgstr "Isi dari \\{\\} tidak valid"
+
+#: support/dfa.c:1495
+#, fuzzy
+msgid "regular expression too big"
+msgstr "Ekspresi regular terlalu besar"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "unbalanced ("
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "no syntax specified"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr "unbalanced )"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: pilihan '%s' adalah ambigu"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: pilihan '--%s' tidak mengijinkan sebuah argumen\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: pilihan '%c%s' tidak mengijinkan sebuah argumen\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: pilihan '--%s' membutuhkan sebuah argumen\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: pilihan tidak dikenal '--%s'\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: pilihan tidak dikenal '%c%s'\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: pilihan tidak valid -- '%c'\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: pilihan membutuhkan sebuah argumen -- '%c'\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: pilihan '-W %s' adalah ambigu\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: pilihan '-W %s' tidak mengijinkan sebuah argumen\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: pilihan '-w %s' membutuhkan sebuah argumen\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Sukses"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Tidak cocok"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ekspresi regular tidak valid"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Karakter kolasi tidak valid"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "nama kelas karakter tidak valid"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Akhiran backslash"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Referensi balik tidak valid"
+
+#: support/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Tidak cocok [ atau [^"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Tidak cocok ( atau \\("
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Tidak cocok \\{"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Isi dari \\{\\} tidak valid"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Akhir jangkauan tidak valid"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Kehabisan memori"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Ekspresi regular yang mengawali tidak valid"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Akhir dari ekspresi regular prematur"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Ekspresi regular terlalu besar"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Tidak cocok ) atau \\)"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Tidak ada ekspresi regular sebelumnya"
+
+#: symbol.c:688
+#, fuzzy, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr ""
+"fungsi `%s': tidak dapat menggunakan nama fungsi sebagai nama parameter"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "can not pop main context"
+
+#, fuzzy
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "%s ke \"%s\" gagal (%s)"
+
+#, fuzzy
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "%s: tutup gagal (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "backslash di akhir dari string"
+
+#, fuzzy
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "mencoba menggunakan array `%s[\"%s\"]' dalam sebuah konteks skalar"
+
+#, fuzzy
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "mencoba untuk menggunakan skalar `%s[\"%s\"]' sebagai sebuah array"
+
+#, fuzzy
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: argumen ketiga dari 0 diperlakukan sebagai 1"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "`extension' adalah sebuah ekstensi gawk"
+
+#~ msgid "extension: received NULL lib_name"
+#~ msgstr "extension: received NULL lib_name"
+
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "extension: tidak dapat membuka `%s' (%s)"
+
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr "extension: perpustakaan `%s': tidak dapat memanggil fungsi (%s)"
+
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr ""
+#~ "extension: perpustakaan `%s': tidak dapat memanggil fungsi `%s' (%s)"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension: hilang nama fungsi"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: karakter `%c' tidak legal dalam nama fungsi `%s'"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: tidak dapat meredefinisi fungsi `%s'"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: fungsi `%s' telah didefinisikan"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension: nama fungsi `%s' telah didefinisikan sebelumnya"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr ""
+#~ "extension: tidak dapat menggunakan gawk bawaan `%s' sebagai nama fungsi"
+
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr "chdir: dipanggil dengan argumen %g negatif"
+
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "stat: dipanggil dengan argumen negatif"
+
+#, fuzzy
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "stat: dipanggil dengan argumen negatif"
+
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "fnmatch: dipanggil dengan argumen negatif"
+
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "fnmatch: dipanggil dengan argumen negatif"
+
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "fork: dipanggil dengan argumen negatif"
+
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "waitpid: dipanggil dengan argumen negatif"
+
+#~ msgid "wait: called with no arguments"
+#~ msgstr "wait: dipanggil dengan argumen negatif"
+
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "wait: dipanggil dengan argumen negatif"
+
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "ord: dipanggil dengan argumen negatif"
+
+#~ msgid "ord: called with no arguments"
+#~ msgstr "ord: dipanggil dengan argumen negatif"
+
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "chr: dipanggil dengan argumen negatif"
+
+#~ msgid "chr: called with no arguments"
+#~ msgstr "chr: dipanggil dengan argumen negatif"
+
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "readfile: dipanggil dengan argumen negatif"
+
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "writea: dipanggil dengan argumen negatif"
+
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "reada: dipanggil dengan argumen negatif"
+
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "gettimeofday: diterima argumen bukan string"
+
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sleep: dipanggil dengan argumen negatif"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "unknown value for field spec: %d\n"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr "fungsi `%s' didefinisikan untuk mengambil lebih dari %d argumen"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "fungsi `%s': hilang argumen #%d"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "`getline var' invalid inside `%s' rule"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr ""
+#~ "tidak (diketahui) protokol yang diberikan dalam nama berkas spesial `%s'"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "nama berkas spesial `%s' tidak lengkap"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "harus memberikan sebuah remote hostname ke `/inet'"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "harus memberikan sebuah remote port ke `/inet'"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# %s END blok\n"
+#~ "\n"
+
+#~ msgid "reference to uninitialized element `%s[\"%s\"]'"
+#~ msgstr "referensi ke elemen tidak terinisialisasi `%s[\"%s\"]'"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "subscript dari array `%s' adalah string null"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: kosong (null)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: kosong (nol)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: table_size = %d, array_size = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: array_ref ke %s\n"
+
+#~ msgid "statement may have no effect"
+#~ msgstr "pernyataan mungkin tidak memiliki pengaruh"
+
+#~ msgid "`delete array' is a gawk extension"
+#~ msgstr "`delete array' adalah sebuah ekstensi gawk"
+
+#~ msgid "call of `length' without parentheses is deprecated by POSIX"
+#~ msgstr ""
+#~ "panggilan dari `length' tanpa tanda kurung sudah ditinggalkan oleh POSIX"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "penggunaan dari bukan array sebagai array"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "`%s' adalah sebuah ekstensi Bell Labs"
+
+#~ msgid "length: untyped argument will be forced to scalar"
+#~ msgstr "length: argument tidak terketik akan dipaksa ke skalar"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: diterima argumen pertama bukan numerik"
+
+#~ msgid "or: received non-numeric second argument"
+#~ msgstr "or: diterima argumen kedua bukan numerik"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): nilai negatif akan memberikan hasil aneh"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): nilai pecahan akan dipotong"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: diterima argumen pertama bukan numerik"
+
+#~ msgid "xor: received non-numeric second argument"
+#~ msgstr "xor: diterima argumen kedua bukan numerik"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): nilai pecahan akan dipotong"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr ""
+#~ "for loop: array `%s' berubah ukuran dari %ld ke %ld selama eksekusi loop"
+
+#~ msgid "`break' outside a loop is not portable"
+#~ msgstr "`break' diluar sebuah loop adalah tidak portabel"
+
+#~ msgid "`continue' outside a loop is not portable"
+#~ msgstr "`continue' diluar sebuah loop tidak portabel"
+
+#~ msgid "`next' cannot be called from an END rule"
+#~ msgstr "`next' tidak dapat dipanggil dari sebuah aturan END"
+
+#~ msgid "`nextfile' cannot be called from a BEGIN rule"
+#~ msgstr "`nextfile' tidak dapat dipanggil dari sebuah aturan BEGIN"
+
+#~ msgid "`nextfile' cannot be called from an END rule"
+#~ msgstr "`nextfile' tidak dapat dipanggil dari sebuah aturan END"
+
+#~ msgid "statement has no effect"
+#~ msgstr "pernyataan tidak memiliki efek"
+
+#~ msgid ""
+#~ "concatenation: side effects in one expression have changed the length of "
+#~ "another!"
+#~ msgstr ""
+#~ "concatenation: efek samping dalam satu ekspresi telah mengubah panjang "
+#~ "dari yang lain!"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "penempatan digunakan dalam konteks kondisional"
+
+#~ msgid "illegal type (%s) in tree_eval"
+#~ msgstr "tipe (%s) tidak legal dalam tree_eval"
+
+#~ msgid "\t# -- main --\n"
+#~ msgstr "\t# -- main --\n"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr "penempatan tidak diijinkan untuk menghasilkan fungsi bawaan"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "Operasi Tidak Didukung"
+
+#~ msgid "invalid tree type %s in redirect()"
+#~ msgstr "tipe tree %s tidak valid dalam redirect()"
+
+#~ msgid "can't open two way socket `%s' for input/output (%s)"
+#~ msgstr "tidak dapat membuka socket dua arah `%s' untuk input/output (%s)"
+
+#~ msgid "/inet/raw client not ready yet, sorry"
+#~ msgstr "/inet/raw client belum siap, maaf"
+
+#~ msgid "only root may use `/inet/raw'."
+#~ msgstr "hanya root yang boleh menggunakan `/inet/raw'."
+
+#~ msgid "/inet/raw server not ready yet, sorry"
+#~ msgstr "/inet/raw server belum siap, maaf"
+
+#~ msgid "file `%s' is a directory"
+#~ msgstr "berkas `%s' adalah sebuah direktori"
+
+#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'"
+#~ msgstr "lebih baik gunakan `PROCINFO[\"%s\"]' daripada `%s'"
+
+#~ msgid "use `PROCINFO[...]' instead of `/dev/user'"
+#~ msgstr "lebih baik gunakan `PROCINFO[...]' daripada `/dev/user'"
+
+#~ msgid "out of memory"
+#~ msgstr "kehabisan memori"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "pilihan `-m[fr]' tidak relevan dalam gawk"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "penggunaan pilihan -m: `-m[fr] nnn'"
+
+#~ msgid "\t-m[fr] val\n"
+#~ msgstr "\t-m[fr] val\n"
+
+#~ msgid "\t-W compat\t\t--compat\n"
+#~ msgstr "\t-W compabilitas\t\t--compat\n"
+
+#~ msgid "\t-W copyleft\t\t--copyleft\n"
+#~ msgstr "\t-W copyleft\t\t--copyleft\n"
+
+#~ msgid "\t-W usage\t\t--usage\n"
+#~ msgstr "\t-W penggunaan\t\t--usage\n"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "tidak dapat menemukan grup: %s"
+
+#~ msgid "can't convert string to float"
+#~ msgstr "tidak dapat mengubah string ke float"
+
+#~ msgid "# treated internally as `delete'"
+#~ msgstr "# diperlakukan secara internal sebagai `delete'"
+
+#~ msgid "# this is a dynamically loaded extension function"
+#~ msgstr "# ini adalah sebuah fungsi yang secara dinamis diload ekstensi"
+
+#~ msgid ""
+#~ "\t# BEGIN block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t # BEGIN blok\n"
+#~ "\n"
+
+#~ msgid "unexpected type %s in prec_level"
+#~ msgstr "tipe %s tidak terduga dalam prec_level"
+
+#~ msgid "Unknown node type %s in pp_var"
+#~ msgstr "tipe titik %s dalam pp_var tidak diketahui"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: pilihan tidak legal -- %c\n"
diff --git a/gawk-5.0.1/po/insert-header.sin b/gawk-5.0.1/po/insert-header.sin
new file mode 100644
index 00000000000..b26de01f6c8
--- /dev/null
+++ b/gawk-5.0.1/po/insert-header.sin
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/gawk-5.0.1/po/it.po b/gawk-5.0.1/po/it.po
new file mode 100644
index 00000000000..230bde399a1
--- /dev/null
+++ b/gawk-5.0.1/po/it.po
@@ -0,0 +1,3780 @@
+# Italian messages for GNU Awk
+# Copyright (C) 2002-2019 Free Software Foundation, Inc.
+# Antonio Colombo <azc100@gmail.com>.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU Awk 4.2.2, API: 2.0\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2019-02-17 20:00+0100\n"
+"Last-Translator: Antonio Colombo <azc100@gmail.com>\n"
+"Language-Team: Italian <it@li.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "da %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "tentativo di usare valore scalare come vettore"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "tentativo di usare il parametro scalare `%s' come un vettore"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "tentativo di usare scalare '%s' come vettore"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "tentativo di usare vettore `%s' in un contesto scalare"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: indice `%.*s' non presente nel vettore `%s'"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "tentativo di usare scalare`%s[\"%.*s\"]' come vettore"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: il primo argomento non � un vettore"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: il secondo argomento non � un vettore"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: il secondo argomento non � un vettore"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: il primo argomento non � un vettore"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: il primo argomento non � un vettore"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: non consentito un secondo argomento che sia un sottovettore del primo "
+"argomento"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: non consentito un secondo argomento che sia un sottovettore del "
+"primo argomento"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: non consentito un primo argomento che sia un sottovettore del secondo "
+"argomento"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: non consentito un primo argomento che sia un sottovettore del "
+"secondo argomento"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "`%s' non � un nome funzione valido"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "funzione di confronto del sort `%s' non definita"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "blocchi %s richiedono una `azione'"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "ogni regola deve avere una parte `espressione' o una parte `azione'"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "il vecchio awk non supporta pi� di una regola `BEGIN' o `END'"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "`%s' � una funzione interna, non si pu� ridefinire"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "espressione regolare costante `//' sembra un commento C++, ma non lo �"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "espressione regolare costante `/%s/' sembra un commento C, ma non lo �"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "valori di `case' doppi all'interno di uno `switch': %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "valori di default doppi all'interno di uno `switch'"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "`break' non consentito fuori da un ciclo o da uno `switch'"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "`continue' non consentito fuori da un un ciclo"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "`next' usato in `azione' %s"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "`nextfile' usato in `azione' %s"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "`return' usato fuori da una funzione"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr "`print' da solo in BEGIN o END dovrebbe forse essere `print \"\"'"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "`delete' non consentito in SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "`delete' non consentito in FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "`delete(array)' � un'estensione tawk non-portabile"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "`pipeline' multistadio bidirezionali non funzionano"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr "concatenazione in I/O `>' destinazione della ridirezione ambigua"
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "espressione regolare usata per assegnare un valore"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "espressione regolare prima di operatore `~' o `!~'"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "il vecchio awk non supporta la parola-chiave `in' se non dopo `for'"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "espressione regolare a destra in un confronto"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "`getline' non ridiretta invalida all'interno della regola `%s'"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "`getline' non ri-diretta indefinita dentro `azione' END"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "il vecchio awk non supporta vettori multidimensionali"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "chiamata a `length' senza parentesi non-portabile"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "chiamate a funzione indirette sono un'estensione gawk"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"non riesco a usare la variabile speciale `%s' come parametro indiretto di "
+"funzione"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "tentativo di usare la non-funzione `%s' in una chiamata di funzione"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "espressione indice invalida"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "attenzione: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fatale: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "carattere 'a capo' o fine stringa non previsti"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+"i file sorgente / gli argomenti sulla riga di comando devono contenere "
+"funzioni o regole complete"
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "non riesco ad aprire file sorgente `%s' in lettura (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "non riesco ad aprire shared library `%s' in lettura (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "ragione indeterminata"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "non riesco a includere `%s' per usarlo come file di programma"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "file sorgente `%s' gi� incluso"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "shared library `%s' gi� inclusa"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include � un'estensione gawk"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "nome-file mancante dopo @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load � un'estensione gawk"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "nome-file mancante dopo @include"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "programma nullo sulla riga comandi"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "non riesco a leggere file sorgente `%s' (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "file sorgente `%s' vuoto"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "errore PEBKAC: carattere invalido '\\%03o' nel codice sorgente"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "file sorgente non termina con carattere 'a capo'"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "espressione regolare non completata termina con `\\' a fine file"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"%s: %d: modificatore di espressione regolare tawk `/.../%c' non valido in "
+"gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "modificatore di espressione regolare tawk `/.../%c' non valido in gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "espressione regolare non completata"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "espressione regolare non completata a fine file"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "uso di `\\ #...' continuazione riga non-portabile"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "la barra inversa non � l'ultimo carattere della riga"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "i vettori multidimensionali sono un'estensione gawk"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX non consente l'operatore `**='"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "il vecchio awk non supporta l'operatore `**='"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX non consente l'operatore `**'"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "il vecchio awk non supporta l'operatore `**'"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "l'operatore `^=' non � supportato nel vecchio awk"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "l'operatore `^' non � supportato nel vecchio awk"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "stringa non terminata"
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr ""
+"POSIX non consente dei caratteri di ritorno a capo nei valori assegnati a "
+"una stringa"
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr "uso di barra inversa per continuazione stringa non-portabile"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "carattere '%c' non valido in un'espressione"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "`%s' � un'estensione gawk"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX non consente `%s'"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "`%s' non � supportato nel vecchio awk"
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr "`goto' considerato pericoloso!"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d non valido come numero di argomenti per %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr "%s: una stringa come ultimo argomento di `substitute' non ha effetto"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "il terzo parametro di '%s'  non � un oggetto modificabile"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: il terzo argomento � un'estensione gawk"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: il secondo argomento � un'estensione gawk"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"uso scorretto di dcgettext(_\"...\"): togliere il carattere '_' iniziale"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"uso scorretto di dcngettext(_\"...\"): togliere il carattere '_' iniziale"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: espressione regolare come secondo argomento non consentita"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "funzione `%s': il parametro `%s' nasconde variabile globale"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "non riesco ad aprire `%s' in scrittura (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "mando lista variabili a `standard error'"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: `close' non riuscita (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() chiamata due volte!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "c'erano variabili nascoste."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "funzione di nome `%s' definita in precedenza"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr ""
+"funzione `%s': non � possibile usare nome della funzione come nome parametro"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"funzione `%s': non � possibile usare la variabile speciale `%s' come "
+"parametro di funzione"
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "funzione `%s': il parametro `%s' non pu� contenere un nome-di-spazio"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "funzione `%s': il parametro #%d, `%s', duplica il parametro #%d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "funzione `%s' chiamata ma mai definita"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "funzione `%s' definita ma mai chiamata direttamente"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr ""
+"espressione regolare di valore costante per parametro #%d genera valore "
+"booleano"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"funzione `%s' chiamata con spazio tra il nome e `(',\n"
+"o usata come variabile o vettore"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "tentativo di dividere per zero"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "tentativo di dividere per zero in `%%'"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"impossibile assegnare un valore al risultato di un'espressione di post-"
+"incremento di un campo"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "destinazione di assegnazione non valida (codice operativo %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+"identificativo %s: nomi qualificati non consentiti in modo tradizionale / "
+"POSIX"
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+"identificativo %s: il separatore dello spazio-dei-nomi � costituito  da due "
+"caratteri ':', non da uno solo"
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr "l'identificativo qualificato `%s' non � nel formato richiesto"
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+"identificativo `%s': il separatore dello spazio-dei-nomi pu� apparire una "
+"sola volta in un identificativo qualificato"
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+"l'uso dell'identificativo riservato `%s' come nome-di-spazio  non � "
+"consentito"
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+"l'uso dell'identificativo riservato `%s' come secondo componente di un "
+"identificativo qualificato non � consentito"
+
+#: awkgram.y:6799
+msgid "@namespace is a gawk extension"
+msgstr "@namespace � un'estensione gawk"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+"il nome dello spazio-dei-nomi `%s' deve rispettare le regole di assegnazione "
+"degli identificativi"
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s a \"%s\" non riuscita (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "standard output"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "standard error"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: l'argomento ricevuto non � numerico"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: argomento %g fuori intervallo"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: non riesco a scaricare: `pipe' `%.*s' aperta in lettura, non in "
+"scrittura"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: non riesco a scaricare: file `%.*s' aperto in lettura, non in "
+"scrittura"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: non riesco a scaricare file `%.*s': %s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: non riesco a scaricare: `pipe' bidirezionale `%.*s' ha chiuso il "
+"lato in scrittura"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: `%.*s' non � un file aperto, una `pipe' o un co-processo"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: il primo argomento ricevuto non � una stringa"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: il secondo argomento ricevuto non � una stringa"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: l'argomento ricevuto non � numerico"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: l'argomento ricevuto � un vettore"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "`length(array)' � un'estensione gawk"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: l'argomento ricevuto non � una stringa"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: l'argomento ricevuto non � numerico"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: argomento ricevuto negativo %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "fatale: `count$' va usato per tutti i formati o per nessuno"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "larghezza campo ignorata per la specifica `%%'"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "precisione ignorata per la specifica `%%'"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "larghezza campo e precisone ignorate per la specifica `%%'"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fatale: operatore `$' non consentito nei formati awk"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fatale: numero argomenti con `$' dev'essere > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr "fatale: numero argomenti %ld > del numero totale argomenti specificati"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fatale: `$' non consentito dopo il punto in un formato"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr "fatale: manca `$' per i campi posizionali larghezza o precisione"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "`l' non ha senso nei formati awk; ignorato"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fatale: `l' non consentito nei formati POSIX awk"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "`L' non ha senso nei formati awk; ignorato"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fatale: `L' non consentito nei formati POSIX awk"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "`h' non ha senso nei formati awk; ignorato"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fatale: `h' non consentito nei formati POSIX awk"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: valore %g troppo elevato per il formato %%c"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: valore %g non � un carattere multibyte valido "
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: valore %g fuori intervallo per il formato `%%%c'"
+
+#: builtin.c:1504
+#, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: valore %s fuori intervallo per il formato `%%%c'"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr "il formato %%%c � nello standard POSIX ma non-portabile ad altri awk"
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr "carattere di formato ignoto `%c' ignorato: nessun argomento convertito"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr ""
+"fatale: argomenti in numero minore di quelli richiesti dalla stringa di "
+"formato"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ esauriti a questo punto"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: specifica di formato senza un carattere di controllo"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "troppi argomenti specificati per questa stringa di formato"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: nessun argomento"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: nessun argomento"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"printf: tentativo di scrivere al lato in scrittura, chiuso, di una `pipe' "
+"bidirezionale"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: l'argomento ricevuto non � numerico"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: chiamata con argomento negativo %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: lunghezza %g non >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: lunghezza %g non >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: lunghezza non intera %g: sar� troncata"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr "substr: lunghezza %g troppo elevata per indice stringa, tronco a %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: indice di partenza %g non valido, uso 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: indice di partenza non intero %g: sar� troncato"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: stringa di partenza lunga zero"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: indice di partenza %g oltre la fine della stringa"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: lunghezza %g all'indice di partenza %g supera la lunghezza del primo "
+"argomento (%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr ""
+"strftime: il valore del formato in PROCINFO[\"strftime\"] � di tipo numerico"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: il secondo argomento ricevuto non � numerico"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: il secondo argomento � < 0 o troppo elevato per time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: il secondo argomento � fuori intervallo per time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: il primo argomento ricevuto non � una stringa"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: il formato ricevuto � una stringa nulla"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: l'argomento ricevuto non � una stringa"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: almeno un valore � fuori dall'intervallo di default"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "funzione 'system' non consentita in modo `sandbox'"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: l'argomento ricevuto non � una stringa"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"print: tentativo di scrivere al lato in scrittura, chiuso, di una `pipe' "
+"bidirezionale"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "riferimento a variabile non inizializzata `$%d'"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: l'argomento ricevuto non � una stringa"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: l'argomento ricevuto non � una stringa"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: il primo argomento ricevuto non � numerico"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: il secondo argomento ricevuto non � numerico"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: l'argomento ricevuto non � numerico"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: l'argomento ricevuto non � numerico"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: l'argomento ricevuto non � numerico"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: il terzo argomento non � un vettore"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: il terzo argomento `%.*s' trattato come 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: pu� essere chiamata indirettamente solo con due argomenti"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "chiamata indiretta a %s richiede almeno due argomenti"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: il primo argomento ricevuto non � numerico"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: il secondo argomento ricevuto non � numerico"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): valori negativi non sono consentiti"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): valori decimali saranno troncati"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): valori troppo alti daranno risultati strani"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: il primo argomento ricevuto non � numerico"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: il secondo argomento ricevuto non � numerico"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): valori negativi non sono consentiti"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): valori decimali saranno troncati"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): valori troppo alti daranno risultati strani"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: chiamata con meno di due argomenti"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: l'argomento %d non � numerico"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: argomento %d, valore negativo %g non consentito"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: chiamata con meno di due argomenti"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: l'argomento %d non � numerico"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: argomento %d, valore negativo %g non consentito"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: chiamata con meno di due argomenti"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: l'argomento %d non � numerico"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: argomento %d, valore negativo %g non consentito"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: l'argomento ricevuto non � numerico"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): valore negativo non consentito"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): valori decimali saranno troncati"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: `%s' non � una categoria `locale' valida"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv: il terzo argomento non � un vettore"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv: il primo argomento ricevuto non � numerico"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv: il secondo argomento ricevuto non � numerico"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv: tentativo di dividere per zero"
+
+#: builtin.c:4046
+msgid "typeof: second argument is not an array"
+msgstr "typeof: il secondo argomento non � un vettore"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+"typeof ha trovato una combinazione di flag `%s' non valida; siete pregati di "
+"notificare questo bug."
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof: tipo di argomento sconosciuto `%s'"
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof: tipo di argomento sconosciuto `%s'"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Immetti istruzioni (g)awk. Termina col comando \"end\"\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "numero elemento non valido: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: opzione non valida - \"%s\""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "sorgente \"%s\": gi� immesso."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": comando non consentito."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+"Non � possibile usare il comando `commands' con comandi di breakpoint/"
+"watchpoint"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "non � stato ancora impostato alcun breakpoint/watchpoint"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "numero di breakpoint/watchpoint non valido"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Immetti comandi per quando si incontra %s %d, uno per riga.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Termina col comando \"end\"\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "`end' valido solo nei comandi `commands' o `eval'"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "`silent' valido solo nel comando `commands'"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: opzione non valida - \"%s\""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: numero di breakpoint/watchpoint non valido"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "l'argomento non � una stringa"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: paramtro non valido - \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "funzione non esistente - \"%s\""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: opzione non valida - \"%s\""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "intervallo specificato non valido: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "valore non-numerico per campo numerico"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "trovato valore non-numerico, invece che numerico"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "valore intero diverso da zero"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - stampe trace di tutti gli elementi o degli N pi� interni "
+"(pi� esterni se N <0)"
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[nome-file:]N|funzione] - metti breakpoint nel punto specificato."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr "clear [[nome-file:]N|funzione] - togli breakpoint impostati prima."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [num] - inizia una lista di comandi da eseguire se si raggiunge un "
+"breakpoint (watchpoint)."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition num [espr.] - imposta o togli condizione di breakpoint o "
+"watchpoint."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [COUNT] - continua il programma che stai testando."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr "delete [breakpoints] [range] - togli breakpoint specificati."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr "disbale [breakpoints] [range] - disabilita breakpoint specificati."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr "display [var] - stampa valore variabile a ogni arresto di programma."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - discendi N elementi nello stack."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr "dump [nome-file] - elenca istruzioni su file o stdout."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [breakpoints] [range] - abilita breakpoint specificati."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - termina una lista di comandi o istruzioni awk."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval stmt|[p1, p2, ...] - calcola valore di istruzione/i awk."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (equivale a quit) esci dal debugger."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - esegui fino al ritorno dell'elemento di stack selezionato."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - seleziona e stampa elemento di stack numero N."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr "help [command] - stampa lista comandi o spiegazione di un comando."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+"ignore N CONTATORE - imposta a CONTATORE il numero delle volte in cui "
+"ignorare il breakpoint numero N."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info argomento - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[nome-file:]num_riga|funzione|intervallo] - elenca riga/he "
+"richiesta/e."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+"next [COUNT] - esegui la/e prossima/e istruzione/i, incluse chiamate a "
+"subroutine."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [COUNT] - esegui la prossima istruzione, anche se � una chiamate a "
+"subroutine."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [name[=value]] - imposta o mostra opzione/i debugger."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [var] - stampa valore di variabile/i o vettore/i."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf format, [arg], ... - output secondo formato."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - esci dal debugger."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+"return [value] - fa tornare al suo chiamante l'elemento di stack selezionato."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - inizia o ricomincia esecuzione programma."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save nome-file - salva i comandi dalla sessione al file."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set var = value - assegna valore a una variabile scalare."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - sospendi messaggio che segnala stop a un breakpoint/watchpoint."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source file - esegui comandi contenuti nel file."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [CONTATORE] - esegui il programma finch� non arriva a un'istruzione con "
+"numero di riga differente."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [COUNT] - esegui esattamente un'istruzione."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[nome-file:]N|funzione] - imposta un breakpoint temporaneo."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - stampa istruzione prima di eseguirla."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+"undisplay [N] - togli variabile/i dalla lista visualizzazioni automatiche."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[nome-file:]N|funzione] - esegui finch� il programma arriva una riga "
+"differente, o alla riga N nell'elemento di stack corrente."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - togli variabile/i dalla watchlist."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - spostati di N elementi dello stack verso l'alto."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch var - imposta un watchpoint per una variabile."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"dove [N] - (equivalente a backtrace) stampa tracia di tutti gli elementi o "
+"degli N pi� interni (pi� esterni se N <0)"
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "non riesco a leggere comando (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "non riesco a leggere comando (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "carattere non valido nel comando"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "comando sconosciuto - \"%.*s\", vedere help"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "carattere non valido"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "comando non definito: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+"imposta o mostra il numero di righe da tenere nel file che contiene la "
+"storia comandi."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "imposta o mostra dimensioni finestra lista comandi"
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "imposta o mostra file di outpu gawk"
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "imposta o mostra prompt di debug"
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr "(dis)imposta o mostra salvataggio storia comandi (valore=on|off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "(dis)imposta o mostra salvataggio opzioni (valore=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "(dis)imposta o mostra tracciamento istruzioni (valore=on|off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "programma non in esecuzione."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "non riesco a leggere file sorgente `%s' (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "file sorgente `%s' vuoto.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "file sorgente non disponibile."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "non riesco a leggere file di nome `%s' (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+"ATTENZIONE: file sorgente `%s' modificato dopo la compilazione del "
+"programma.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "numero riga %d non ammesso; `%s' ha %d righe"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "fine-file inattesa durante lettura file `%s', riga %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "file sorgente `%s' modificato dopo l'inizio esecuzione del programma."
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "File sorgente corrente: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Numero di righe: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "File sorgente (righe): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Numero  Disp  Abilit.  Posizione\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tn. di occorrenze = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tignora prossime %ld occorrenze\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tcondizione per stop: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tcomandi:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Elemento corrente: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Chiamato da elemento: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Chiamante di elemento: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Assente in main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Nessun argomento.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Nessun `locale'.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Tutte le variabili definite:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Tutte le funzioni definite:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Auto-visualizzazione variabili:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Variabili Watch [da tenere sott'occhio]:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "nessun simbolo `%s' nel contesto corrente\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "`%s' non � un vettore\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "%ld = variabile non inizializzata\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "vettore `%s' vuoto\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%.*s\"] non presente nel vettore `%s'\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "`%s[\"%.*s\"]' non � un vettore\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "`%s' non � una variabile scalare"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "tentativo di usare vettore `%s[\"%.*s\"]' in un contesto scalare"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "tentativo di usare scalare `%s[\"%.*s\"]' come vettore"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "`%s' � una funzione"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "watchpoint %d non soggetto a condizioni\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "Nessun elemento numerato da visualizzare %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Nessun elemento numerato watch [da sorvegliare] da visualizzare %ld"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%.*s\"] non presente nel vettore `%s'\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "tentativo di usare valore scalare come vettore"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr "Watchpoint %d cancellato perch� il parametro � fuori intervallo.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr ""
+"Visualizzazione %d cancellata perch� il parametro � fuori intervallo.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " nel file `%s', riga %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " a `%s':%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tin "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Ulteriori elementi stack seguono...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "numero elemento non valido"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: breakpoint %d (abilitato, ignora prossimi %ld passaggi), anche "
+"impostato a %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Nota: breakpoint %d (abilitato), anche impostato a %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: breakpoint %d (disabilitato, ignora prossimi %ld passaggi), anche "
+"impostato a %s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Nota: breakpoint %d (disabilitato), anche impostato a %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Breakpoint %d impostato al file `%s', riga %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "Non riesco a impostare breakpoint nel file `%s'\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "numero riga %d nel file `%s' fuori intervallo"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Non riesco a trovare la regola!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "Non riesco a impostare breakpoint a `%s':%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Non riesco a impostare breakpoint nella funzione `%s'\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "breakpoint %d impostato al file `%s', riga %d � senza condizioni\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Cancellato breakpoint %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "No breakpoint all'entrata nella funzione `%s'\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "No breakpoint al file `%s', riga #%d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "numero breakpoint non valido"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Cancello tutti i breakpoint? (y oppure n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "y"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Prossimi %ld passaggi dal breakpoint %d ignorati.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "Far� uno stop al prossimo passaggio dal breakpoint %d.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "Debug possibile solo per programmi con opzione `-f' specificata.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Non sono riuscito a far ripartire il debugger"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Programma gi� in esecuzione. Lo faccio ripartire dall'inizio (y/n)? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Programma non fatto ripartire\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "errore: non riesco a far ripartire, operazione non consentita\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "errore (%s): non riesco a far ripartire, ignoro i comandi rimanenti\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Partenza del programma: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Programma completato anormalmente, valore in uscita: %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Programma completato normalmente, valore in uscita: %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "Il programma � in esecuzione. Esco comunque (y/n)? "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Non interrotto ad alcun breakpoint: argomento ignorato.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "numero di breakpoint non valido %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Prossimi %ld passaggi dal breakpoint %d ignorati.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "'finish' non significativo nell'elemento iniziale main()\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Esegui fino al ritorno da "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "'return' non significativo nell'elemento iniziale main()\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "Non trovo la posizione specificata nella funzione `%s'\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "riga sorgente invalida %d nel file `%s'"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "Non trovo posizione specificata %d nel file `%s'\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "elemento non presente nel vettore\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "variabile di tipo sconosciuto\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Mi fermo in %s ...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "'finish' not significativo per salti non-locali '%s'\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "'until' not significativo per salti non-locali '%s'\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t------[Invio] per continuare o q [Invio] per uscire------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] non presente nel vettore `%s'"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "output inviato a stdout\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "numero non valido"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "`%s' non consentito nel contesto corrente; istruzione ignorata"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "`return' non consentito nel contesto corrente; istruzione ignorata"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Simbolo `%s' non esiste nel contesto corrente"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "tipo nodo sconosciuto %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "codice operativo sconosciuto %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "codice operativo %s non � un operatore o una parola chiave"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "superamento limiti buffer in 'genflags2str'"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# `Stack' (Pila) Chiamate Funzione:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "`IGNORECASE' � un'estensione gawk"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "`BINMODE' � un'estensione gawk"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "valore di BINMODE `%s' non valido, considerato come 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "specificazione invalida `%sFMT' `%s'"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "disabilito `--lint' a causa di assegnamento a `LINT'"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "riferimento ad argomento non inizializzato `%s'"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "riferimento a variabile non inizializzata `%s'"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "tentativo di riferimento a un campo da valore non-numerico"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "tentativo di riferimento a un campo da una stringa nulla"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "tentativo di accedere al campo %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "riferimento a campo non inizializzato `$%ld'"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "funzione `%s' chiamata con pi� argomenti di quelli previsti"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: tipo non previsto `%s'"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "divisione per zero tentata in `/='"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "divisione per zero tentata in `%%='"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "le estensioni non sono consentite in modo `sandbox'"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load sono estensioni gawk"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: il nome libreria ricevuto � NULL"
+
+#: ext.c:60
+#, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: non riesco ad aprire libreria `%s' (%s)"
+
+#: ext.c:66
+#, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr "load_ext: libreria `%s': non definisce `plugin_is_GPL_compatible' (%s)"
+
+#: ext.c:72
+#, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: libreria `%s': non riesco a chiamare funzione `%s' (%s)"
+
+#: ext.c:76
+#, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: libreria `%s' routine di inizializzazione `%s' non riuscita"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: manca nome di funzione"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: nome funzione interna gawk `%s' non ammesso come nome funzione"
+
+#: ext.c:109
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: nome funzione interna gawk `%s' non ammesso come nome di uno "
+"spazio-dei-nomi"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: non riesco a ridefinire funzione `%s'"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: funzione `%s' gi� definita"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: funzione di nome `%s' definita in precedenza"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: contatore argomenti negativo per la funzione `%s'"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr "funzione `%s': argomento #%d: tentativo di usare scalare come vettore"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "funzione `%s': argomento #%d: tentativo di usare vettore come scalare"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "caricamento dinamico di libreria non supportato"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: non riesco a leggere il link simbolico `%s'"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: parametri errati"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "ftp init: non riesco a creare variabile %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "fts non disponibile su questo sistema"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: non riesco a creare vettore"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: non riesco a impostare elemento"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: non riesco a impostare elemento"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: non riesco a impostare elemento"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: non riesco a creare vettore"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: non riesco a impostare elemento"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: chiamata con numero di argomenti errato, 3 previsti"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: primo parametro errato"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: secondo parametro errato"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: terzo parametro errato"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: non sono riuscito a appiattire un vettore\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: ignoro flag infido FTS_NOSTAT. nooo, nooo, nooo."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() non riuscita\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: primo argomento non disponibile"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: secondo argomento non disponibile"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: terzo argomento non disponibile"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch non disponibile su questo sistema\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: non riesco ad aggiungere variabile FNM_NOMATCH"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: non riesco a impostare elemento vettoriale %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: non riesco a installare vettore FNM"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO non � un vettore!"
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace::begin: modifica in-place gi� attiva"
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace::begin: 2 argumenti richiesti, ma chiamata con %d"
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace::begin: non riesco a trovare il 1� argomento come stringa nome-file"
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace::begin: modifica in-place disabilitato, FILENAME non valido `%s'"
+
+#: extension/inplace.c:152
+#, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace::begin: Non riesco a trovare `%s' (%s)"
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace::begin: `%s' non � un file regolare"
+
+#: extension/inplace.c:170
+#, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace::begin: mkstemp(`%s') non riuscita (%s)"
+
+#: extension/inplace.c:182
+#, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace::begin: chmod non riuscita (%s)"
+
+#: extension/inplace.c:189
+#, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace::begin: dup(stdout) non riuscita (%s)"
+
+#: extension/inplace.c:192
+#, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::begin: dup2(%d, stdout) non riuscita (%s)"
+
+#: extension/inplace.c:195
+#, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace::begin: close(%d) non riuscita (%s)"
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace::end: 2 argumenti richiesti, ma chiamata con %d"
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace::end: non riesco a trovare il 1� argomento come stringa nome-file"
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace::end: modifica in-place non attiva"
+
+#: extension/inplace.c:227
+#, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::end: dup2(%d, stdout) non riuscita (%s)"
+
+#: extension/inplace.c:230
+#, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace::end: close(%d) non riuscita (%s)"
+
+#: extension/inplace.c:234
+#, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace::end: fsetpos(stdout) non riuscita (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace::end: link(`%s', `%s') non riuscita (%s)"
+
+#: extension/inplace.c:257
+#, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace::end: rename(`%s', `%s') non riuscito (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: chiamata con argomento/i non corretto/i"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: chiamata con argomento/i non corretto/i"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir non riuscita: %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: chiamata con un tipo di argomento errato"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: non riesco a inizializzare la variabile REVOUT"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: argomento 0 non � una stringa\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: l'argomento 1 non � un vettore\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: non sono riuscito a appiattire un vettore\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: non sono riuscito a rilasciare un vettore appiattito\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "valore di vettore di tipo sconosciuto %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: argomento 0 non � una stringa\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: l'argomento 1 non � un vettore\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array non riuscita\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element non riuscita\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+"valore recuperato, con codice di tipo sconosciuto %d, trattato come stringa"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: non supportato in questa architettura"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: manca necessario argomento numerico"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: l'argomento � negativo"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: non supportato in questa architettura"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "record in input troppo lungo"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF impostato a un valore negativo"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr "diminuire NF � non-portabile a molte versioni awk"
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr "utilizzare campi da una regola END pu� essere non-portabile"
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: il quarto argomento � un'estensione gawk"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: il quarto argomento non � un vettore"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: il secondo argomento non � un vettore"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split: non si pu� usare un unico vettore come secondo e quarto argomento"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: non consentito un quarto argomento che sia un sottovettore del "
+"secondo argomento"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: non consentito un secondo argomento che sia un sottovettore del "
+"quarto argomento"
+
+#: field.c:1036
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: la stringa nulla come terzo arg. � un'estensione non-standard"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: il quarto argomento non � un vettore"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: il secondo argomento non � un vettore"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: il terzo argomento non pu� essere nullo"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: non si pu� usare un unico vettore come secondo e quarto argomento"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: non consentito un quarto argomento che sia un sottovettore del "
+"secondo argomento"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: non consentito un secondo argomento che sia un sottovettore del "
+"quarto argomento"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "`FIELDWIDTHS' � un'estensione gawk"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "`*' deve essere l'ultimo  elemento specificato per FIELDWIDTHS"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "valore di FIELDWIDTHS non valido, per il campo %d, vicino a `%s'"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "la stringa nulla usata come `FS' � un'estensione gawk"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "il vecchio awk non supporta espressioni come valori di `FS'"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "`FPAT' � un'estensione gawk"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: ricevuto retval nullo"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: non in modalit� MPFR"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: MPFR non disponibile"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: tipo di numero non valido `%d'"
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "add_ext_func: il nome dello spazio-dei-nomi ricevuto � NULL"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+"node_to_awk_value: trovata combinazione numerica di flag non valida `%s'; "
+"siete pregati di notificare questo bug."
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: ricevuto nodo nullo"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: ricevuto valore nullo"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+"node_to_awk_value ha trovato la combinazione flag invalida `%s'; siete "
+"pregati di notificare questo bug."
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: ricevuto vettore nullo"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: ricevuto indice nullo"
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr ""
+"api_flatten_array_typed: non sono riuscito a convertire l'indice %d a %s"
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr ""
+"api_flatten_array_typed: non sono riuscito a convertire il valore %d a %s"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr: MPFR non disponibile"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "non riesco a trovare la fine di una regola BEGINFILE"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "non riesco ad aprire file di tipo non riconosciuto `%s' per `%s'"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "l'argomento in riga comando `%s' � una directory: ignorata"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "non riesco ad aprire file `%s' in lettura (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "chiusura di fd %d (`%s') non riuscita (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "ri-direzione non consentita in modo `sandbox'"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "espressione nella ri-direzione `%s' � un numero"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "espressione nella ri-direzione `%s' ha per valore la stringa nulla"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"nome-file `%.*s' per la ri-direzione `%s' pu� essere il risultato di una "
+"espressione logica"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "mistura non necessaria di `>' e `>>' per il file `%.*s'"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file non riesce a creare una `pipe' `%s' con fd %d"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "non riesco ad aprire `pipe' `%s' in scrittura (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "non riesco ad aprire `pipe' `%s' in lettura (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"creazione di socket get_file non disponibile su questa piattaforma per `%s' "
+"con fd %d"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr ""
+"non riesco ad aprire `pipe' bidirezionale `%s' in lettura/scrittura (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "non riesco a ri-dirigere da `%s' (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "non riesco a ri-dirigere a `%s' (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"numero massimo consentito di file aperti raggiunto: comincio a riutilizzare "
+"i descrittori di file"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "chiusura di `%s' non riuscita (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "troppe `pipe' o file di input aperti"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: il secondo argomento deve essere `a' o `da'"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: `%.*s' non � un file aperto, una `pipe' o un co-processo"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "chiusura di una ri-direzione mai aperta"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr "close: ri-direzione `%s' non aperta con `|&', ignoro secondo argomento"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "errore ritornato (%d) dalla chiusura della `pipe' `%s' (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "errore ritornato (%d) dalla chiusura del file `%s' (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "nessuna chiusura esplicita richiesta per `socket' `%s'"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "nessuna chiusura esplicita richiesta per co-processo `%s'"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "nessuna chiusura esplicita richiesta per `pipe' `%s'"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "nessuna chiusura esplicita richiesta per file `%s'"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush: non riesco a terminare lo standard output: %s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush: non riesco a terminare lo standard error: %s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "errore scrivendo 'standard output' (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "errore scrivendo 'standard error' (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "scaricamento di `pipe' `%s' non riuscito (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "scaricamento da co-processo di `pipe' a `%s' non riuscito (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "scaricamento di file `%s' non riuscito (%s)."
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "porta locale %s invalida in `/inet: %s'"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "porta locale %s invalida in `/inet'"
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "host remoto e informazione di porta (%s, %s) invalidi: %s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "host remoto e informazione di porta (%s, %s) invalidi"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "comunicazioni TCP/IP non supportate"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "non riesco ad aprire `%s', modo `%s'"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "close di `pty' principale non riuscita (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "close di `stdout' nel processo-figlio non riuscita (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"trasferimento di `pty' secondaria a `stdout' nel processo-figlio non "
+"riuscita (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "close di `stdin' nel processo-figlio non riuscita (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"trasferimento di 'pty' secondaria a 'stdin' nel processo-figlio non riuscito "
+"(dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "close di 'pty' secondaria non riuscita (%s)"
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr "non riesco a creare processo-figlio o ad aprire pty"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+"passaggio di `pipe' a `stdout' nel processo-figlio non riuscito (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+"passaggio di `pipe' a `stdin' nel processo-figlio  non riuscito (dup: %s)"
+
+#: io.c:2386 io.c:2655
+msgid "restoring stdout in parent process failed"
+msgstr "ripristino di `stdout' nel processo-padre non riuscito"
+
+#: io.c:2394
+msgid "restoring stdin in parent process failed"
+msgstr "ripristino di `stdin' nel processo-padre non riuscito"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "close di `pipe' non riuscita (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "`|&' non supportato"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "non riesco ad aprire `pipe' `%s' (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "non riesco a creare processo-figlio per `%s' (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+"getline: tentativo di elggere dal lato in scrittura, chiuso, di una `pipe' "
+"bidirezionale"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: ricevuto puntatore NULL"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"input parser `%s' in conflitto con l'input parser `%s' installato in "
+"precedenza"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "l'input parser `%s' non � riuscito ad aprire `%s'"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: ricevuto puntatore NULL"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"output wrapper `%s' in conflitto con l'output wrapper `%s' installato in "
+"precedenza"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "l'output wrapper `%s' non � riuscito ad aprire `%s'"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: ricevuto puntatore NULL"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"processore doppio `%s' in conflitto con il processore doppio installato in "
+"precedenza `%s'"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "il processore doppio `%s' non � riuscito ad aprire `%s'"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "file dati `%s' vuoto"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "non riesco ad allocare ulteriore memoria per l'input"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "valore multicarattere per `RS' � un'estensione gawk"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "comunicazioni IPv6 non supportate"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr "variable d'ambiente `POSIXLY_CORRECT' impostata: attivo `--posix'"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "`--posix' annulla `--traditional'"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "`--posix'/`--traditional' annulla `--non-decimal-data'"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "`--posix' annulla `--characters-as-bytes'"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "eseguire %s con `setuid' root pu� essere un rischio per la sicurezza"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "non � possibile impostare modalit� binaria su `stdin'(%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "non � possibile impostare modalit� binaria su `stdout'(%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "non � possibile impostare modalit� binaria su `stderr'(%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "manca del tutto il testo del programma!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr "Uso: %s [opzioni in stile POSIX o GNU] -f file-prog. [--] file ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr "Usage: %s [opzioni in stile POSIX o GNU] [--] %cprogramma%c file ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "Opzioni POSIX:\t\topzioni lunghe GNU: (standard)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f fileprog\t\t--file=file-prog.\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=valore\t\t--assign=var=valore\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Opzioni brevi:\t\topzioni lunghe GNU: (estensioni)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[file]\t\t--dump-variables[=file]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[file]\t\t--debug[=file]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'testo-del-programma'\t--source='testo-del-programma'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E file\t\t\t--exec=file\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i include_file\t\t--include=include_file\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l libreria\t\t--load=libreria\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[file]\t\t--pretty-print[=file]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[file]\t\t--profile[=file]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr "\t-Z locale-name\t\t--locale=locale-name\n"
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Per segnalare problemi, vedere nodo `Bugs' in `gawk.info', oppure la\n"
+"sezione `Segnalazione di problemi e bug' nella versione a stampa.\n"
+"La stessa informazione � disponibile in\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"Siete pregati di NON segnalare bug scrivendo a comp.lang.awk.\n"
+"Per problemi di traduzione, contattare: azc100@gmail.com.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk � un linguaggio per scandire e processare espressioni.\n"
+"Senza parametri, legge da 'standard input' e scrive su 'standard output'.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Esempi:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Questo software � libero; lo puoi distribuire e/o modificare\n"
+"alle condizioni stabilite nella 'GNU General Public License' pubblicata\n"
+"dalla Free Software Foundation; fai riferimento alla versione 3 della\n"
+"Licenza, o (a tua scelta) a una qualsiasi versione successiva.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Questo programma � distribuito con la speranza che sia utile,\n"
+"ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita\n"
+"di COMMERCIABILIT� o IDONEIT� AD UN PARTICOLARE SCOPO.\n"
+"Vedi la 'GNU General Public License' per ulteriori dettagli.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Dovresti aver ricevuto una copia della GNU General Public License\n"
+"assieme a questo programma; se non � cos�, vedi http://www.gnu.org/"
+"licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft non imposta FS a `tab' nell'awk POSIX"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: `%s' argomento di `-v' non in forma `var=valore'\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "`%s' non � un nome di variabile ammesso"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "`%s' non � un nome di variabile, cerco il file `%s=%s'"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "nome funzione interna gawk `%s' non ammesso come nome variabile"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "non � possibile usare nome di funzione `%s' come nome di variabile"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "eccezione floating point"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "errore fatale: errore interno"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "errore fatale: errore interno: segfault"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "errore fatale: errore interno: stack overflow"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "manca `fd' pre-aperta %d"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "non riesco a pre-aprire /dev/null per `fd' %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "argomento di `-e/--source' nullo, ignorato"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "`--posix' annulla `--traditional'"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M ignorato: supporto per MPFR/GMP non generato"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: opzione `-W %s' non riconosciuta, ignorata\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: l'opzione richiede un argomento -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "valore PREC `%.*s' non valido"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "valore di RNDMODE `%.*s' non valido"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: l'argomento ricevuto non � numerico"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): valore negativo non consentito"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "comp(%Rg): valore decimale sar� troncato"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): non sono consentiti valori negativi"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: l'argomento ricevuto non � numerico #%d"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: argomento #%d con valore non valido %Rg, uso 0"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: argomento #%d con valore negativo %Rg non consentito"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: argomento #%d, valore decimale sar� troncato"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: argomento #%d con valore negativo %Zd non consentito"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "riga com.:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "non sono riuscito a creare una `typed regex'"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "il vecchio awk non supporta la sequenza di protezione '\\%c'"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX non consente escape `\\x'"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "niente cifre esadecimali nella sequenza di protezione `\\x'"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"sequenza di escape esadec.\\x%.*s di %d caratteri probabilmente non "
+"interpretata nel modo previsto"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "sequenza di protezione `\\%c' considerata come semplice `%c'"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Trovati dati multi-byte invalidi. Pu� esserci una differenza tra i dati e la "
+"codifica locale."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s `%s': non riesco a ottenere flag `fd': (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr ""
+"%s %s `%s': non riesco a impostare 'close-on-exec': (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+"Nidificazione del programma troppo alta. Si consideri una riscrittura del "
+"codice"
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "non riesco ad aprire `%s' in scrittura: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "mando profilo a 'standard error'"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s regola(e)\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regola(e)\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "errore interno: %s con `vname' nullo"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "errore interno: funzione interna con `fname' nullo"
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"%s# Estensioni caricate (-l e/o @load)\n"
+"\n"
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\n"
+"# File inclusi (-i e/o @include)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# profilo gawk, creato %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funzioni, in ordine alfabetico\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: tipo di ri-direzione non noto %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+"la regola per la corrispondenza di un'espressione regolare che contiene dei "
+"caratteri NUL non � definita in POSIX"
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr "byte NUL non valido un'espressione regolare dinamica"
+
+#: re.c:172
+#, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "la sequenza di protezione `\\%c' considerata come semplice `%c'"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+"la sequenza di protezione `\\%c' non � un operatore noto per un'espressione "
+"regolare"
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr ""
+"componente di espressione `%.*s' dovrebbe probabilmente essere `[%.*s]'"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "[ non chiusa"
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "character class non valida"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "sintassi character class � [[:spazio:]], non [:spazio:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "sequenza escape \\ non completa"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "contenuto di \\{\\} non valido"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "espressione regolare troppo complessa"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "( non chiusa"
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "nessuna sintassi specificata"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ") non aperta"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: opzione '%s' ambigua; possibilit�:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: l'opzione '--%s' non ammette un argomento\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: l'opzione '%c%s' non ammette un argomento\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: l'opzione '--%s' richiede un argomento\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: opzione sconosciuta '--%s'\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: opzione sconosciuta '%c%s'\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opzione non valida -- '%c'\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: l'opzione richiede un argomento -- '%c'\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: l'opzione '-W %s' � ambigua\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: l'opzione '-W %s' non ammette un argomento\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: l'opzione '-W %s' richiede un argomento\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Successo"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Nessuna corrispondenza"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Espressione regolare invalida"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Carattere di ordinamento non valido"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nome di 'classe di caratteri' non valido"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "'\\' finale"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Riferimento indietro non valido"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [. o [= non chiusa"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( o \\( non chiusa"
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ non chiusa"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Contenuto di \\{\\} non valido"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Fine di intervallo non valido"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memoria esaurita"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Espressione regolare precedente invalida"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fine di espressione regolare inaspettata"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Espressione regolare troppo complessa"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") o \\) non aperta"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Nessuna espressione regolare precedente"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr ""
+"funzione `%s': non � possibile come nome parametro quello della funzione `%s'"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "non posso salire pi� in alto nello stack"
diff --git a/gawk-5.0.1/po/ja.po b/gawk-5.0.1/po/ja.po
new file mode 100644
index 00000000000..adfc20cda60
--- /dev/null
+++ b/gawk-5.0.1/po/ja.po
@@ -0,0 +1,3982 @@
+# Japanese messages for gawk.
+# Copyright (C) 2003, 2014 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Makoto Hosoya <mhosoya@ozemail.com.au>, 2003.
+# Yasuaki Taniguchi <yasuakit@gmail.com>, 2011, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.1.0b\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2014-11-07 12:26+0000\n"
+"Last-Translator: Yasuaki Taniguchi <yasuakit@gmail.com>\n"
+"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "%s から"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "スカラー値を配列として使用する試みです"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "スカラー仮引数 `%s' を配列として使用する試みです"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "スカラー `%s' を配列として使用する試みです"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "スカラーコンテキストで配列 `%s' を使用する試みです"
+
+#: array.c:574
+#, fuzzy, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: 配列 `%2$s' 内にインデックス `%1$s' がありません"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "スカラー `%s[\"%.*s\"]' を配列として使用する試みです"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: 第一引数が配列ではありません"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: 第二引数が配列ではありません"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: 第二引数が配列ではありません"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: 第一引数が配列ではありません"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: 第一引数が配列ではありません"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr "asort: 第一引数の部分配列を第二引数用に使用することは出来ません"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr "asorti: 第一引数の部分配列を第二引数用に使用することは出来ません"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr "asort: 第二引数の部分配列を第一引数用に使用することは出来ません"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr "asorti: 第二引数の部分配列を第一引数用に使用することは出来ません"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "`%s' は関数名としては無効です"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "ソート比較関数 `%s' が定義されていません"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s ブロックにはアクション部が必須です"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "各ルールにはパターンまたはアクション部が必須です。"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "古い awk は複数の `BEGIN' または `END' ルールをサポートしません"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "`%s' は組込み関数です。再定義できません"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "正規表現定数 `//' は C++コメントに似ていますが、違います。"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "正規表現定数 `/%s/' は C コメントに似ていますが、異なります"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "switch 文の中で重複した case 値が使用されています: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "switch 文の中で重複した `default' が検出されました"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "`break' はループまたは switch の外では許可されていません"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "`continue' はループの外では許可されていません"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "%s アクション内で `next' が使用されました"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "`nextfile' が %s アクション内で使用されました"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "`return' が関数定義文の外で使われました"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"BEGIN または END ルール内の引数の無い `print' は `print \"\"' だと思われます"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr ""
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr ""
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "`delete(array)' は移植性の無い tawk 拡張です"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "多段階で双方向パイプを利用した式は使用できません"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "正規表現が代入式の右辺に使用されています"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "`~' や `!~' 演算子の左辺に正規表現が使用されています"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "古い awk では `in' 予約語は `for' の後を除きサポートしません"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "比較式の右辺に正規表現が使用されています。"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "`%s' ルールの内側ではリダイレクトされていない `getline' は無効です"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "リダイレクトされていない `getline' は END アクションでは未定義です。"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "古い awk は多次元配列をサポートしません"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "小括弧が無い `length' は移植性がありません"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "間接関数呼び出しは gawk 拡張です"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr "特別な変数 `%s' は間接関数呼び出し用には使用出来ません"
+
+#: awkgram.y:2039
+#, fuzzy, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "関数 `%s' を配列として使用する試みです"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "添字の式が無効です"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "警告: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "致命的: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "予期しない改行または文字列終端です"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "ソースファイル `%s' を読み込み用に開けません (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "共有ライブラリ `%s' を読み込み用に開けません (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "原因不明"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr ""
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "ソースファイル `%s' は既に読み込まれています"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "共有ライブラリ `%s' は既に読み込まれています"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include は gawk 拡張です"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "@include の後に空のファイル名があります"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load は gawk 拡張です"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "@load の後に空のファイル名があります"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "コマンド行のプログラム表記が空です"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "ソースファイル `%s' を読み込めません (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "ソースファイル `%s' は空です"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr ""
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "ソースファイルが改行で終っていません"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "終端されていない正規表現がファイル最後の `\\' で終っています。"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "%s: %d: tawk の正規表現修飾子 `/.../%c' は gawk で使用できません"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "tawk の正規表現修飾子 `/.../%c' は gawk で使用できません"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "正規表現が終端されていません"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "ファイルの中で正規表現が終端されていません"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "`\\ #...' 形式の行継続は移植性がありません"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "バックスラッシュが行最後の文字になっていません。"
+
+#: awkgram.y:3858 awkgram.y:3860
+#, fuzzy
+msgid "multidimensional arrays are a gawk extension"
+msgstr "間接関数呼び出しは gawk 拡張です"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX では演算子 `**=' は許可されていません"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "古い awk は演算子 `**=' をサポートしません"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX では演算子 `**' は許可されていません"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "古い awk は演算子 `**' をサポートしません"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "古い awk は演算子 `^=' をサポートしません"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "古い awk は演算子 `^' をサポートしません"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "文字列が終端されていません"
+
+#: awkgram.y:4048 main.c:1220
+#, fuzzy
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX では `\\x' エスケープは許可されていません"
+
+#: awkgram.y:4050 node.c:453
+#, fuzzy
+msgid "backslash string continuation is not portable"
+msgstr "`\\ #...' 形式の行継続は移植性がありません"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "式内に無効な文字 '%c' があります"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "`%s' は gawk 拡張です"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX では `%s' は許可されていません"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "古い awk は `%s' をサポートしません"
+
+#: awkgram.y:4494
+#, fuzzy
+msgid "`goto' considered harmful!"
+msgstr "`goto' は有害だと見なされています!\n"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d は %s 用の引数の数としては無効です"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr "%s: 文字列リテラルを置き換え最後の引数に使用すると効果がありません"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "%s 第三仮引数は可変オブジェクトではありません"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: 第三引数は gawk 拡張です"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: 第二引数は gawk 拡張です"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"dcgettext(_\"...\")の使用法が間違っています: 先頭のアンダースコア(_)を削除し"
+"てください"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"dcngettext(_\"...\")の使用法が間違っています: 先頭のアンダースコア(_)を削除し"
+"てください"
+
+#: awkgram.y:4813
+#, fuzzy
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: 文字列では無い第二引数を受け取りました"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "関数 `%s': 仮引数 `%s' が大域変数を覆い隠しています"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "`%s' を書込み用に開けませんでした (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "変数リストを標準エラーに送っています"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() を二回呼び出しています!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "覆い隠された変数がありました"
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "関数名 `%s' は前に定義されています"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "関数 `%s': 関数名を仮引数名として使用出来ません"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr "関数 `%s': 特別な変数 `%s' は関数の仮引数として使用出来ません"
+
+#: awkgram.y:5092
+#, fuzzy, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "関数 `%s': 仮引数 `%s' が大域変数を覆い隠しています"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "関数 `%s': 仮引数 #%d, `%s' が仮引数 #%d と重複しています"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "未定義の関数 `%s' を呼び出しました"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "関数 `%s' は定義されていますが、一度も直接呼び出されていません"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "仮引数 #%d 用の正規表現定数は真偽値を出力します"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"関数名と `(' の間にスペースを入れて関数 `%s' を呼び出しています。\n"
+"または、変数か配列として使われています。"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "ゼロによる除算が試みられました"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "`%%' 内でゼロによる除算が試みられました"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+
+#: awkgram.y:5805
+#, fuzzy, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "%d は %s 用の引数の数としては無効です"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "@include は gawk 拡張です"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s から \"%s\" へ出力できません (%s)。"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "標準出力"
+
+#: builtin.c:148
+#, fuzzy
+msgid "standard error"
+msgstr "標準出力"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: 引数が数値ではありません"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: 引数 %g が範囲外です"
+
+#: builtin.c:245
+#, fuzzy, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: flush できません: パイプ `%s' は読み込み用に開かれています。書き込み"
+"用ではありません"
+
+#: builtin.c:248
+#, fuzzy, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: flush できません: ファイル `%s' は読み込み用に開かれています。書き込"
+"み用ではありません"
+
+#: builtin.c:259
+#, fuzzy, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr ""
+"fflush: flush できません: ファイル `%s' は読み込み用に開かれています。書き込"
+"み用ではありません"
+
+#: builtin.c:264
+#, fuzzy, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: flush できません: パイプ `%s' は読み込み用に開かれています。書き込み"
+"用ではありません"
+
+#: builtin.c:270
+#, fuzzy, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: `%s' が開かれたファイル、パイプ、プロセス共有ではありません"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: 文字列では無い第一引数を受け取りました"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: 文字列では無い第二引数を受け取りました"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: 数値では無い引数を受け取りました"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: 配列引数を受け取りました"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "`length(array)' は gawk 拡張です"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: 文字列では無い引数を受け取りました"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: 数値では無い引数を受け取りました"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: 負の引数 %g を受け取りました"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr ""
+"致命的: `count$’ は全ての書式使用する、または全てに使用しないのいずれかでなけ"
+"ればいけません"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "`%%' 指定用のフィールド幅は無視されます"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "`%%' 指定用のフィールド幅は無視されます"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "`%%' 指定用のフィールド幅および精度は無視されます"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "致命的: `$' は awk 形式内では許可されていません"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "致命的: `$' で指定する引数の番号は正でなければいけません"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr "致命的: 引数の番号 %ld は引数として与えられた数より大きいです"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "致命的: `$' は書式指定内のピリオド `.' の後に使用できません"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr "致命的: フィールド幅、または精度の指定子に `$' が与えられていません"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "awk の書式指定では `l' は無意味です。無視します"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "致命的: POSIX awk 書式内では `l' は許可されていません"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "awk の書式指定では `L' は無意味です。無視します。"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "致命的: POSIX awk 書式内では `L' は許可されていません"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "awk の書式指定では `h' は無意味です。無視します。"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "致命的: POSIX awk 書式内では `h' は許可されていません"
+
+#: builtin.c:1091
+#, fuzzy, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: 値 %g は書式 `%%%c' の範囲外です"
+
+#: builtin.c:1104
+#, fuzzy, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: 値 %g は書式 `%%%c' の範囲外です"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: 値 %g は書式 `%%%c' の範囲外です"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: 値 %g は書式 `%%%c' の範囲外です"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr "不明な書式指定文字 `%c' を無視しています: 変換される引数はありません"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "致命的: 書式文字列を満たす十分な数の引数がありません"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ ここから足りません"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: 書式指定子に制御文字がありません"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "書式文字列に与えられている引数が多すぎます"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: 引数がありません"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: 引数がありません"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: 数値では無い引数を受け取りました"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: 長さ %g が 1 以上ではありません"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: 長さ %g が 0 以上ではありません"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: 文字数 %g の小数点以下は切り捨てます。"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr "substr: 文字数 %g は最大値を超えています。%g を使います。"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: 開始インデックス %g が無効です。1を使用します"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: 開始インデックス %g が非整数のため、値は切り捨てられます"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: 文字列の長さがゼロです。"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: 開始インデックス %g が文字列終端の後にあります"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: 開始インデックス %2$g からの長さ %1$g は第一引数の長さを超えています "
+"(%3$lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime: PROCINFO[\"strftime\"] の書式の値は数値型です"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: 非数値の第二引数を受け取りました"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr ""
+
+#: builtin.c:2023
+#, fuzzy
+msgid "strftime: second argument out of range for time_t"
+msgstr "asorti: 第二引数が配列ではありません"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: 非文字列の第一引数を受け取りました"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: 空の書式文字列を受け取りました"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: 非文字列引数を受け取りました"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: 一つ以上の値がデフォルトの範囲を超えています"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "サンドボックスモードでは 'system' 関数は許可されていません"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: 文字列では無い引数を受け取りました"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "初期化されていないフィールド `$%d' への参照です"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: 非文字列引数を受け取りました"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: 非文字列引数を受け取りました"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: 非数値の第一引数を受け取りました"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: 非数値の第二引数を受け取りました"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: 非数値の引数を受け取りました"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: 非数値の引数を受け取りました"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: 非数値の引数を受け取りました"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: 第三引数が配列ではありません"
+
+#: builtin.c:2919
+#, fuzzy, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: 第三引数が 0 です。1 を代わりに使用します"
+
+#: builtin.c:3241
+#, fuzzy, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "and: 2個未満の引数で呼び出されました"
+
+#: builtin.c:3341
+#, fuzzy, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "and: 2個未満の引数で呼び出されました"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: 非数値の第一引数を受け取りました"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: 非数値の第二引数を受け取りました"
+
+#: builtin.c:3404
+#, fuzzy, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): 負の数値を使用すると異常な結果になります"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): 小数点以下は切り捨てられます"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): シフト値が大き過ぎると異常な結果になります"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: 非数値の第一引数を受け取りました"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: 非数値の第二引数を受け取りました"
+
+#: builtin.c:3443
+#, fuzzy, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): 負の数値を使用すると異常な結果になります"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): 小数点以下は切り捨てられます"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): シフト値が大き過ぎると異常な結果になります"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: 2個未満の引数で呼び出されました"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: 引数 %d が非数値です"
+
+#: builtin.c:3483
+#, fuzzy, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and(%lf, %lf): 負の数値を使用すると異常な結果になります"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: 2個未満の引数で呼び出されました"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: 引数 %d が非数値です"
+
+#: builtin.c:3515
+#, fuzzy, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "compl(%lf): 負の数値を使用すると異常な結果になります"
+
+#: builtin.c:3537 mpfr.c:1045
+#, fuzzy
+msgid "xor: called with less than two arguments"
+msgstr "xor: 2個未満の引数で呼び出されました"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: 引数 %d が非数値です"
+
+#: builtin.c:3547
+#, fuzzy, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor(%lf, %lf): 負の数値を使用すると異常な結果になります"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: 非数値の引数を受け取りました"
+
+#: builtin.c:3577
+#, fuzzy, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): 負の数値を使用すると異常な結果になります"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): 小数点以下は切り捨てられます"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: `%s' は無効なロケール区分です"
+
+#: builtin.c:3988 mpfr.c:1203
+#, fuzzy
+msgid "intdiv: third argument is not an array"
+msgstr "match: 第三引数が配列ではありません"
+
+#: builtin.c:3996 mpfr.c:1211
+#, fuzzy
+msgid "intdiv: received non-numeric first argument"
+msgstr "and: 非数値の第一引数を受け取りました"
+
+#: builtin.c:3998 mpfr.c:1213
+#, fuzzy
+msgid "intdiv: received non-numeric second argument"
+msgstr "and: 非数値の第二引数を受け取りました"
+
+#: builtin.c:4007 mpfr.c:1252
+#, fuzzy
+msgid "intdiv: division by zero attempted"
+msgstr "ゼロによる除算が試みられました"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: 第二引数が配列ではありません"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+
+#: builtin.c:4101
+#, fuzzy, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "option: 無効なパラメーター - \"%s\""
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr ""
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr ""
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "無効なフレーム番号です: %d"
+
+#: command.y:297
+#, fuzzy, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: 無効なオプション - \"%s\""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\": 既に読み込まれて(source)います。"
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": コマンドは許可されていません。"
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "まだ一つもブレークポイント/ウオッチポイントは設定されていません"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "無効なブレークポイント/ウオッチポイント番号です"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr ""
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr ""
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr ""
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr ""
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: 無効なオプション - \"%s\""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr ""
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "引数が文字列ではありません"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: 無効なパラメーター - \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "そのような関数はありません - \"%s\""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: 無効なオプション - \"%s\""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "無効な範囲指定: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "フィールド番号に対して非数値が指定されています"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "非数値が見つかりました。数値が予期されます。"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "非ゼロ整数"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr ""
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr ""
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr ""
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr ""
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr ""
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr ""
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr ""
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr ""
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr ""
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr ""
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr ""
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr ""
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr ""
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr ""
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr ""
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr ""
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr ""
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr ""
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr ""
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr ""
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr ""
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: command.y:1060
+#, fuzzy, c-format
+msgid "can't read command (%s)\n"
+msgstr "`%s' からリダイレクトできません (%s)"
+
+#: command.y:1074
+#, fuzzy, c-format
+msgid "can't read command (%s)"
+msgstr "`%s' からリダイレクトできません (%s)"
+
+#: command.y:1125
+#, fuzzy
+msgid "invalid character in command"
+msgstr "無効な文字クラス名です"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr ""
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "無効な文字です"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr ""
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr ""
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr ""
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr ""
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr ""
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr ""
+
+#: debug.c:358
+msgid "program not running."
+msgstr ""
+
+#: debug.c:461 debug.c:619
+#, fuzzy, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "ソースファイル `%s' を読み込めません (%s)"
+
+#: debug.c:466
+#, fuzzy, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "ソースファイル `%s' は空です"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr ""
+
+#: debug.c:518
+#, fuzzy, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "ソースファイル `%s' を読み込めません (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr ""
+
+#: debug.c:624
+#, fuzzy, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "予期しない改行または文字列終端です"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr ""
+
+#: debug.c:745
+#, fuzzy, c-format
+msgid "Current source file: %s\n"
+msgstr "ソースファイル `%s' は既に読み込まれています"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr ""
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr ""
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr ""
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr ""
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr ""
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr ""
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr ""
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr ""
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr ""
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr ""
+
+#: debug.c:861
+#, fuzzy
+msgid "No arguments.\n"
+msgstr "printf: 引数がありません"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr ""
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr ""
+
+#: debug.c:1054 debug.c:1442
+#, fuzzy, c-format
+msgid "`%s' is not an array\n"
+msgstr "`%s' は不正な変数名です"
+
+#: debug.c:1068
+#, fuzzy, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "初期化されていないフィールド `$%d' への参照です"
+
+#: debug.c:1089
+#, fuzzy, c-format
+msgid "array `%s' is empty\n"
+msgstr "データファイル `%s' は空です。"
+
+#: debug.c:1132 debug.c:1184
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "delete: 配列 `%2$s' 内にインデックス `%1$s' がありません"
+
+#: debug.c:1188
+#, fuzzy, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "`%s' は不正な変数名です"
+
+#: debug.c:1249 debug.c:5103
+#, fuzzy, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "`%s' は不正な変数名です"
+
+#: debug.c:1272 debug.c:5133
+#, fuzzy, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "スカラーコンテキスト内で配列 `%s[\"%.*s\"]' の使用の試みです"
+
+#: debug.c:1295 debug.c:5144
+#, fuzzy, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "スカラー `%s[\"%.*s\"]' を配列として使用する試みです"
+
+#: debug.c:1438
+#, fuzzy, c-format
+msgid "`%s' is a function"
+msgstr "`%s' は関数名としては無効です"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr ""
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr ""
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr ""
+
+#: debug.c:1543
+#, fuzzy, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "delete: 配列 `%2$s' 内にインデックス `%1$s' がありません"
+
+#: debug.c:1782
+#, fuzzy
+msgid "attempt to use scalar value as array"
+msgstr "スカラー値を配列として使用する試みです"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr ""
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr ""
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr ""
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr ""
+
+#: debug.c:2034
+#, fuzzy
+msgid "invalid frame number"
+msgstr "無効な範囲終了です"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr ""
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr ""
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, fuzzy, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "exp: 引数 %g が範囲外です"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr ""
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr ""
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr ""
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr ""
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr ""
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr ""
+
+#: debug.c:2558
+#, fuzzy, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "入力ファイル `%s' を読み込み中にエラーが発生しました: %s"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr ""
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr ""
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr ""
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr ""
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr ""
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr ""
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr ""
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr ""
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr ""
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr ""
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr ""
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr ""
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr ""
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr ""
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr ""
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr ""
+
+#: debug.c:3394
+#, fuzzy, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "ソースファイル `%s' は既に読み込まれています"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr ""
+
+#: debug.c:3441
+#, fuzzy, c-format
+msgid "element not in array\n"
+msgstr "adump: 引数が配列ではありません"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr ""
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr ""
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr ""
+
+#: debug.c:4324
+msgid "q"
+msgstr ""
+
+#: debug.c:5140
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "delete: 配列 `%2$s' 内にインデックス `%1$s' がありません"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr ""
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr ""
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr ""
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr ""
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr ""
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "不明なノード型 %d です"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "不明なオペコード %d です"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "オペコード %s は演算子または予約語ではありません"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "genflags2str 内でバッファオーバーフローが発生しました"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# 呼出関数スタック:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "`IGNORECASE' は gawk 拡張です"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "`BINMODE' は gawk 拡張です"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "BINMODE 値 `%s' は無効です。代わりに 3 を使用します"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "誤った `%sFMT' 指定 `%s' です"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "`LINT' への代入に従い `--lint' を無効にします"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "初期化されていない引数 `%s' への参照です"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "初期化されていない変数 `%s' への参照です"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "非数値を使用したフイールド参照の試みです"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "NULL 文字列を使用してフィールドの参照を試みています"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "フィールド %ld へのアクセスの試みです"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "初期化されていないフィールド `$%ld' への参照です"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "宣言されている数より多い引数を使って関数 `%s' を呼び出しました"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: 予期しない型 `%s' です"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "`/=' 内でゼロによる除算が行われました"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "`%%=' 内でゼロによる除算が行われました"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "サンドボックスモード内では拡張は許可されていません"
+
+#: ext.c:54
+#, fuzzy
+msgid "-l / @load are gawk extensions"
+msgstr "@include は gawk 拡張です"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr ""
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "致命的: extension: `%s' を開くことが出来ません (%s)\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"致命的: extension: ライブラリ `%s': `plugin_is_GPL_compatible' が定義されてい"
+"ません (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr ""
+"致命的: extension: ライブラリ `%s': 関数 `%s' を呼び出すことが出来ません "
+"(%s)\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr ""
+"致命的: extension: ライブラリ `%s': 関数 `%s' を呼び出すことが出来ません "
+"(%s)\n"
+
+#: ext.c:92
+#, fuzzy
+msgid "make_builtin: missing function name"
+msgstr "extension: 関数名がありません"
+
+#: ext.c:100 ext.c:111
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr "extension: gawk に組み込まれている `%s' は関数名として使用出来ません"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr "extension: gawk に組み込まれている `%s' は関数名として使用出来ません"
+
+#: ext.c:126
+#, fuzzy, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "extension: 関数 `%s' を再定義できません"
+
+#: ext.c:130
+#, fuzzy, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "extension: 関数 `%s' は既に定義されています"
+
+#: ext.c:134
+#, fuzzy, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "extension: 関数名 `%s' は前に定義されています"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: 関数 `%s' の引数の数が負です"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr "関数 `%s': 引数 #%d: スカラーを配列として使用する試みです"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "関数 `%s': 引数 #%d: 配列をスカラーとして使用する試みです"
+
+#: ext.c:232
+msgid "dynamic loading of libraries is not supported"
+msgstr ""
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr ""
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+#, fuzzy
+msgid "stat: bad parameters"
+msgstr "%s: 仮引数です\n"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr ""
+
+#: extension/filefuncs.c:606
+#, fuzzy
+msgid "fts is not supported on this system"
+msgstr "古い awk は `%s' をサポートしません"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr ""
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr ""
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:841
+#, fuzzy
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#: extension/filefuncs.c:844
+#, fuzzy
+msgid "fts: bad first parameter"
+msgstr "%s: 仮引数です\n"
+
+#: extension/filefuncs.c:850
+#, fuzzy
+msgid "fts: bad second parameter"
+msgstr "%s: 仮引数です\n"
+
+#: extension/filefuncs.c:856
+#, fuzzy
+msgid "fts: bad third parameter"
+msgstr "%s: 仮引数です\n"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr ""
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr ""
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr ""
+
+#: extension/fnmatch.c:120
+#, fuzzy
+msgid "fnmatch: could not get first argument"
+msgstr "strftime: 非文字列の第一引数を受け取りました"
+
+#: extension/fnmatch.c:125
+#, fuzzy
+msgid "fnmatch: could not get second argument"
+msgstr "index: 文字列では無い第二引数を受け取りました"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr ""
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr ""
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr ""
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr ""
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr ""
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr ""
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr ""
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr ""
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "致命的: extension: `%s' を開くことが出来ません (%s)\n"
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr ""
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr ""
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr ""
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "パイプ `%s' をフラッシュできません (%s)。"
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "fd %d (`%s') を閉じることができません (%s)"
+
+#: extension/ordchr.c:72
+#, fuzzy
+msgid "ord: called with inappropriate argument(s)"
+msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#: extension/ordchr.c:99
+#, fuzzy
+msgid "chr: called with inappropriate argument(s)"
+msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr ""
+
+#: extension/readfile.c:131
+#, fuzzy
+msgid "readfile: called with wrong kind of argument"
+msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr ""
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, fuzzy, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "exp: 引数 %g が範囲外です"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, fuzzy, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "split: 第四引数が配列ではありません"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr ""
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr ""
+
+#: extension/rwarray.c:255
+#, fuzzy, c-format
+msgid "array value has unknown type %d"
+msgstr "不明なノード型 %d です"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, fuzzy, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "exp: 引数 %g が範囲外です"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, fuzzy, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "adump: 引数が配列ではありません"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr ""
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr ""
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr ""
+
+#: extension/time.c:162
+#, fuzzy
+msgid "sleep: missing required numeric argument"
+msgstr "exp: 引数が数値ではありません"
+
+#: extension/time.c:168
+#, fuzzy
+msgid "sleep: argument is negative"
+msgstr "exp: 引数 %g が範囲外です"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr ""
+
+#: field.c:284
+msgid "input record too large"
+msgstr ""
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF が負の値に設定されています"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: 第四引数は gawk 拡張です"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: 第四引数が配列ではありません"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: 第二引数が配列ではありません"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr "split: 第二引数と第四引数に同じ配列を使用することは出来ません"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr "split: 第四引数に第二引数の部分配列を使用することは出来ません"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr "split: 第二引数に第四引数の部分配列を使用することは出来ません"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: 第三引数に NULL 文字列を使用することは gawk 拡張です"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: 第四引数が配列ではありません"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: 第二引数が配列ではありません"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: 第三引数は非 NULL でなければいけません"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr "patsplit: 第二引数と第四引数に同じ配列を使用することは出来ません"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr "patsplit: 第四引数に第二引数の部分配列を使用することは出来ません"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr "patsplit: 第二引数に第四引数の部分配列を使用することは出来ません"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "`FIELDWIDTHS' は gawk 拡張です"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr ""
+
+#: field.c:1239
+#, fuzzy, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "`%s' 付近の FIELDWIDTHS 値が無効です"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "`FS' に NULL 文字列を使用するのは gawk 拡張です"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "古い awk は `FS' の値として正規表現をサポートしません"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "`FPAT' は gawk 拡張です"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr ""
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr ""
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr ""
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr ""
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr ""
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr ""
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+
+#: gawkapi.c:1082
+#, fuzzy
+msgid "remove_element: received null array"
+msgstr "length: 配列引数を受け取りました"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr ""
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr ""
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr ""
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr ""
+
+#: gawkapi.c:1419
+#, fuzzy, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "ソースファイル `%s' を読み込み用に開けません (%s)"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "コマンドライン引数 `%s' はディレクトリです: スキップされました"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "ファイル `%s' を読み込み用に開けません (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "fd %d (`%s') を閉じることができません (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "サンドボックスモード内ではリダイレクトは許可されていません"
+
+#: io.c:787
+#, fuzzy, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "`%s' リダイレクトの命令式に数値しか記述されていません。"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "`%s' リダイレクトの命令式が空列です。"
+
+#: io.c:796
+#, fuzzy, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"`%2$s' リダイレクトに論理演算の結果と思われるファイル名 `%1$s' が使われていま"
+"す。"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "ファイル `%.*s' で必要以上に `>' と `>>' を組合せています。"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr ""
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "出力用にパイプ `%s' を開けません (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "入力用にパイプ `%s' を開けません (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "入出力用の双方向パイプ `%s' が開けません (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "`%s' からリダイレクトできません (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "`%s' にリダイレクトできません (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"開いているファイルの数がシステム制限に達しました。ファイル記述子を多重化しま"
+"す。"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "`%s' を閉じるのに失敗しました (%s)"
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "開いているパイプまたは入力ファイルの数が多過ぎます。"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: 第二引数は `to' または `from' でなければいけません"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: `%.*s' は開いているファイル、パイプ、プロセス共有ではありません"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "開いてないリダイレクトを閉じようとしています"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: リダイレクト `%s' は `|&' を使用して開かれていません。第二引数は無視さ"
+"れました"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "パイプ `%2$s' を閉じたときの状態コードが失敗 (%1$d) でした (%3$s)。"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "ファイル `%2$s' を閉じたときの状態コードが失敗 (%1$d) でした (%3$s)。"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "ソケット `%s' を明示して閉じていません。"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "並行プロセス `%s' を明示して閉じていません。"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "パイプ `%s' を明示して閉じていません。"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "ファイル `%s' を明示して閉じていません。"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr ""
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr ""
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "標準出力への書込みエラー (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "標準エラーへの書込みエラー (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "パイプ `%s' をフラッシュできません (%s)。"
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "`%s' へ接続するパイプを並行プロセスからフラッシュできません (%s)。"
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "ファイル `%s' をフラッシュできません (%s)。"
+
+#: io.c:1610
+#, fuzzy, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "`/inet' 内のローカルポート %s が無効です"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "`/inet' 内のローカルポート %s が無効です"
+
+#: io.c:1636
+#, fuzzy, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "リモートのホストおよびポート情報 (%s, %s) が無効です"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "リモートのホストおよびポート情報 (%s, %s) が無効です"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "TCP/IP 通信はサポートされていません"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "`%s' をモード `%s' で開けません"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "マスター pty を閉じるのに失敗しました (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "子プロセスが標準出力を閉じるのに失敗しました (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr "子プロセスがスレーブ pty を標準出力に移動できません (dup: %s)。"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "子プロセスが標準入力を閉じられません (%s)。"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr "子プロセスがスレーブ pty を標準入力に移動できません (dup: %s)。"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "スレーブ pty を閉じるのに失敗しました (%s)"
+
+#: io.c:2265
+#, fuzzy
+msgid "could not create child process or open pty"
+msgstr "`%s' 用の子プロセスを実行できません (fork: %s)。"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr "子プロセスがパイプを標準出力に移動できません (dup: %s)。"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr "子プロセスがパイプを標準入力に移動できません (dup: %s)。"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr "親プロセスが標準出力を復旧できません。\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr "親プロセスが標準入力を復旧できません。\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "パイプを閉じられません (%s)。"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "`|&' は使用できません。"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "パイプ `%s' が開けません (%s)。"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "`%s' 用の子プロセスを実行できません (fork: %s)。"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr ""
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr ""
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr ""
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "データファイル `%s' は空です。"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "入力用メモリーをこれ以上確保できません。"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "複数の文字を `RS' に使用するのは gawk 特有の拡張です。"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "IPv6 通信はサポートされていません"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+"環境変数 `POSIXLY_CORRECT' が指定されています。オプション `--posix' を有効に"
+"します"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "オプション `--posix' は `--traditional' を無効にします。"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr ""
+"オプション `--posix'/`--traditional' は `--non-decimal-data' を無効にします。"
+
+#: main.c:358
+#, fuzzy
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "`--posix' は `--binary' を上書きします"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr ""
+"setuid root で %s を実行すると、セキュリティ上の問題が発生する場合がありま"
+"す。"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "標準入力をバイナリモードに設定できません (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "標準出力をバイナリモードに設定できません (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "標準エラーをバイナリモードに設定できません (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "プログラム文が全くありません!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"使用法: %s [POSIX または GNU 形式のオプション] -f progfile [--] file ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+"使用法: %s [POSIX または GNU 形式のオプション] [--] %cprogram%c file ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "POSIX オプション:\t\tGNU 長い形式のオプション: (標準)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f progfile\t\t--file=progfile\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=val\t\t--assign=var=val\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "短いオプション:\t\tGNU 長い形式のオプション: (拡張)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[file]\t\t--dump-variables[=file]\n"
+
+#: main.c:597
+#, fuzzy
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-p[file]\t\t--profile[=file]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'program-text'\t--source='program-text'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E file\t\t\t--exec=file\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr ""
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr ""
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L [fatal]\t\t--lint[=fatal]\n"
+
+#: main.c:609
+#, fuzzy
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+#, fuzzy
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-p[file]\t\t--profile[=file]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[file]\t\t--profile[=file]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+#, fuzzy
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"バグを報告するには、`gawk.info（英文）' の `Bugs' ノードを\n"
+"参照してください。 印刷されたマニュアルで対応するセクション\n"
+"は、`Reporting Problems and Bugs' です。\n"
+"\n"
+"翻訳に関するバグは<translation-team-ja@lists.sourceforge.net>に報告してくださ"
+"い。\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk は、パターンを検索をして、それを処理する言語です。\n"
+"デフォルト設定では、標準入力を読み込み、標準出力に書き出します。\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"使用例:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "POSIX awk では -Ft は FS をタブに設定しません"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: オプション `-v' の引数 `%s' が `変数=代入値' の形式になっていません。\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "`%s' は不正な変数名です"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "`%s' は変数名ではありません。`%s=%s' のファイルを探します。"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "gawk に組み込みの `%s' は変数名として使用出来ません"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "関数 `%s' は変数名として使用出来ません"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "浮動小数点例外"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "致命的エラー: 内部エラー"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "致命的エラー: 内部エラー: セグメンテーション違反"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "致命的エラー: 内部エラー: スタックオーバーフロー"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "fd %d が事前に開いていません。"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "事前に fd %d 用に /dev/null を開けません。"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "`-e/--source' への空の引数は無視されました"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "オプション `--posix' は `--traditional' を無効にします。"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr ""
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: オプション `-W %s' は認識できません。無視されました\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: 引数が必要なオプション -- %c\n"
+
+#: mpfr.c:551
+#, fuzzy, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "BINMODE 値 `%s' は無効です。代わりに 3 を使用します"
+
+#: mpfr.c:610
+#, fuzzy, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "BINMODE 値 `%s' は無効です。代わりに 3 を使用します"
+
+#: mpfr.c:707
+#, fuzzy, c-format
+msgid "%s: received non-numeric argument"
+msgstr "cos: 非数値の引数を受け取りました"
+
+#: mpfr.c:816
+#, fuzzy
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%lf): 負の数値を使用すると異常な結果になります"
+
+#: mpfr.c:821
+#, fuzzy
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%lf): 小数点以下は切り捨てられます"
+
+#: mpfr.c:832
+#, fuzzy, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%lf): 負の数値を使用すると異常な結果になります"
+
+#: mpfr.c:850
+#, fuzzy, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "cos: 非数値の引数を受け取りました"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr ""
+
+#: mpfr.c:871
+#, fuzzy
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "and(%lf, %lf): 負の数値を使用すると異常な結果になります"
+
+#: mpfr.c:878
+#, fuzzy
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "and(%lf, %lf): 小数点以下は切り捨てられます"
+
+#: mpfr.c:892
+#, fuzzy, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "and(%lf, %lf): 負の数値を使用すると異常な結果になります"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "コマンドライン:"
+
+#: node.c:481
+#, fuzzy
+msgid "could not make typed regex"
+msgstr "正規表現が終端されていません"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "古い awk は `\\%c' エスケープシーケンスをサポートしません"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX では `\\x' エスケープは許可されていません"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "`\\x' エスケープシーケンスに十六進数がありません"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"十六進エスケープ \\x%.*s (%d 文字) はおそらく予期したようには解釈されないで"
+"しょう"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "エスケープシーケンス `\\%c' は `%c' と同等に扱われます"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"無効なマルチバイトデータが検出されました。データとロケールが一致していないよ"
+"うです。"
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s `%s': fd フラグを取得できません: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s `%s': close-on-exec を設定できません: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "`%s' を書込み用に開けませんでした: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "プロファイルを標準エラーに送っています"
+
+#: profile.c:271
+#, fuzzy, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# ルール\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# ルール\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "内部エラー: %s の vname が無効です。"
+
+#: profile.c:658
+#, fuzzy
+msgid "internal error: builtin with null fname"
+msgstr "内部エラー: %s の vname が無効です。"
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# gawk プロファイル、作成日時 %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# 関数一覧（アルファベット順）\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: 不明なリダイレクト型 %d です"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "エスケープシーケンス `\\%c' は `%c' と同等に扱われます"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "正規表現の要素 `%.*s' はおそらく `[%.*s]' であるべきです"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr ""
+
+#: support/dfa.c:1138
+#, fuzzy
+msgid "invalid character class"
+msgstr "無効な文字クラス名です"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr ""
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr ""
+
+#: support/dfa.c:1492
+#, fuzzy
+msgid "invalid content of \\{\\}"
+msgstr "\\{\\} の中身が無効です"
+
+#: support/dfa.c:1495
+#, fuzzy
+msgid "regular expression too big"
+msgstr "正規表現が大きすぎます"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr ""
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr ""
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ""
+
+#: support/getopt.c:605 support/getopt.c:634
+#, fuzzy, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: オプション '%s' は曖昧です\n"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: オプション '--%s' は引数を取ることができません\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: オプション '%c%s' は引数を取ることができません\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: オプション '--%s' には引数が必要です\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: オプション '--%s' を認識できません\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: オプション '%c%s' を認識できません\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: 無効なオプション -- '%c'\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: オプションには引数が必要です -- '%c'\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: オプション '-W %s' は曖昧です\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: オプション '-W %s' は引数を取ることができません\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: オプション '-W %s' には引数が必要です\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "成功です"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "一致しません"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "無効な正規表現です"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "無効な照合文字です"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "無効な文字クラス名です"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "終端のバックスラッシュ"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "無効な前方参照です"
+
+#: support/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[ または [^ が不一致です"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( または \\( が不一致です"
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ が不一致です"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "\\{\\} の中身が無効です"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "無効な範囲終了です"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "メモリを使い果たしました"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "無効な前方正規表現です"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "正規表現が途中で終了しました"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "正規表現が大きすぎます"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") または \\) が不一致です"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "以前に正規表現がありません"
+
+#: symbol.c:688
+#, fuzzy, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "関数 `%s': 関数名を仮引数名として使用出来ません"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr ""
+
+#, fuzzy
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "%s から \"%s\" へ出力できません (%s)。"
+
+#, fuzzy
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "%s: 閉じるのに失敗しました (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "文字列の終りにバックスラッシュが使われています。"
+
+#, fuzzy
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "スカラーコンテキスト内で配列 `%s[\"%.*s\"]' の使用の試みです"
+
+#, fuzzy
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "スカラー `%s[\"%.*s\"]' を配列として使用する試みです"
+
+#, fuzzy
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: 第三引数が 0 です。1 を代わりに使用します"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "`extension' は gawk 拡張です"
+
+#, fuzzy
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "致命的: extension: `%s' を開くことが出来ません (%s)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr ""
+#~ "致命的: extension: ライブラリ `%s': `plugin_is_GPL_compatible' が定義され"
+#~ "ていません (%s)\n"
+
+#, fuzzy
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr ""
+#~ "致命的: extension: ライブラリ `%s': 関数 `%s' を呼び出すことが出来ません "
+#~ "(%s)\n"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension: 関数名がありません"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: 関数名 `%2$s' の中で不正な文字 `%1$c' が使用されています"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: 関数 `%s' を再定義できません"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: 関数 `%s' は既に定義されています"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension: 関数名 `%s' は前に定義されています"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr ""
+#~ "extension: gawk に組み込まれている `%s' は関数名として使用出来ません"
+
+#, fuzzy
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "wait: called with no arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "ord: called with no arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "chr: called with no arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#, fuzzy
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "mktime: 非文字列引数を受け取りました"
+
+#, fuzzy
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sqrt: 負の値 %g を引数に使用して呼び出されました"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "フィールド指定に不明な値があります: %d\n"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr "関数 `%s' に使える引数の数は `%d' 以下と定義されています"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "関数 `%s': 引数 #%d がありません"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "`%s' ルールの内部では `getline var' は無効です"
+
+#~ msgid "`getline' invalid inside `%s' rule"
+#~ msgstr "`%s' ルールの内部では `getline' は無効です"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr ""
+#~ "スペシャルファイル名 `%s' に（認識できる）プロトコルが指定されていません"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "スペシャルファイル名 `%s' は不完全です"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "`/inet' にはリモートホスト名を与えなければいけません"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "`/inet' にはリモートポート番号を与えなければいけません"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# %s ブロック\n"
+#~ "\n"
+
+#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'"
+#~ msgstr "初期化されていない要素 `%s[\"%.*s\"]' への参照です"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "配列 `%s' の添字が NULL 文字列です"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: 空 (null)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: 空 (zero)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr ""
+#~ "%s: テーブルサイズ (table_size) = %d, 配列サイズ (array_size) = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: %s への配列参照 (array_ref) です\n"
+
+#~ msgid "`nextfile' is a gawk extension"
+#~ msgstr "`nextfile' は gawk 拡張です"
+
+#~ msgid "`delete array' is a gawk extension"
+#~ msgstr "`delete array' は gawk 拡張です"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "配列でないものを配列として使用しています"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "`%s' はベル研究所による拡張です"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: 非数値の第一引数を受け取りました"
+
+#~ msgid "or: received non-numeric second argument"
+#~ msgstr "or: 非数値の第二引数を受け取りました"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): 負の数値を使用すると異常な結果になります"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): 小数点以下は切り捨てられます"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: 非数値の第一引数を受け取りました"
+
+#~ msgid "xor: received non-numeric second argument"
+#~ msgstr "xor: 非数値の第二引数を受け取りました"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): 小数点以下は切り捨てられます"
+
+#~ msgid "can't use function name `%s' as variable or array"
+#~ msgstr "関数名 `%s' は変数または配列として使用出来ません"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr "組込関数の戻り値への代入は許可されていません"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "条件コンテキスト内で代入が使用されました"
+
+#~ msgid "statement has no effect"
+#~ msgstr "文に効果がありません"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr ""
+#~ "for ループ: ループ実行中に配列 `%s' のサイズが %ld から %ld へ変更されまし"
+#~ "た"
+
+#~ msgid "function called indirectly through `%s' does not exist"
+#~ msgstr "`%s' を通して間接的に呼び出された関数が存在しません"
+
+#~ msgid "function `%s' not defined"
+#~ msgstr "関数 `%s' は定義されていません"
+
+#~ msgid "`nextfile' cannot be called from a `%s' rule"
+#~ msgstr "`nextfile' は `%s' ルールから呼び出すことが出来ません"
+
+#~ msgid "`next' cannot be called from a `%s' rule"
+#~ msgstr "`next' は `%s' から呼び出すことが出来ません"
+
+#~ msgid "Sorry, don't know how to interpret `%s'"
+#~ msgstr "申し訳ありませんが `%s' をどのように解釈するか分かりません"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "この操作はサポートされていません"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "gawk ではオプション `-m[fr]' に効果はありません。"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "-m オプションの使用法: `-m[fr] 数値'"
+
+#~ msgid "\t-R file\t\t\t--command=file\n"
+#~ msgstr "\t-R file\t\t\t--command=file\n"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "グループが見つかりません: %s"
+
+#~ msgid "range of the form `[%c-%c]' is locale dependant"
+#~ msgstr "`[%c-%c]' 形式の範囲はロケール依存です"
diff --git a/gawk-5.0.1/po/ko.po b/gawk-5.0.1/po/ko.po
new file mode 100644
index 00000000000..194b2d7a0d1
--- /dev/null
+++ b/gawk-5.0.1/po/ko.po
@@ -0,0 +1,3721 @@
+# Korean translation for the gawk.
+# Copyright (C) 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Seong-ho Cho <darkcircle.0426@gmail.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.2.63\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2019-03-04 16:44+0900\n"
+"Last-Translator: Seong-ho Cho <darkcircle.0426@gmail.com>\n"
+"Language-Team: Korean <translation-team-ko@googlegroups.com>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Poedit 2.2\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "%s에서"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "스칼라 값을 배열 값으로 취급하려고 합니다"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "`%s' 스칼라 매개변수를 배열로 취급하려고 합니다"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "`%s' 스칼라 구조를 배열 구조로 취급하려고 합니다"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "스칼라 컨텍스트의 `%s' 배열 구조를 취급하려고 합니다"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: `%.*s' 인덱스는 `%s' 배열에 없습니다"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "`%s[\"%.*s\"]' 스칼라 구조를 배열 구조로 취급하려고 합니다"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: 첫번째 인자는 배열이 아닙니다"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: 두번째 인자는 배열이 아닙니다"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: 두번째 인자는 배열이 아닙니다"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: 첫번째 인자는 배열이 아닙니다"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: 첫번째 인자는 배열이 아닙니다"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr "asort: 두번째 인자에 대한 첫번째 인자를 하위 배열로 취급할 수 없습니다"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: 두번째 인자에 대한 첫번째 인자를 하위 배열로 취급할 수 없습니다"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr "asort: 첫번째 인자에 대한 두번째 인자를 하위 배열로 취급할 수 없습니다"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: 첫번째 인자에 대한 두번째 인자를 하위 배열로 취급할 수 없습니다"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "`%s' 명칭은 함수 이름으로 적절치 않습니다"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "`%s' 정렬 비교 함수를 정의하지 않았습니다"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s 블록에 동작 부분이 있어야 합니다"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "각 규칙에는 패턴 또는 동작 부분이 있어야 합니다"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "awk 이전 버전에서는 다중 `BEGIN', `END' 규칙을 지원하지 않습니다"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "`%s' 함수는 내장 함수이므로, 재정의할 수 없습니다"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "`//' 정규 표현식 상수는 C++ 주석문 표시 같지만, 그렇지 않습니다"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "`/%s/' 정규 표현식 상수는 C 주석문 표시 같지만, 그렇지 않습니다"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "switch문에 중복된 case 값: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "switch문에 중복된 `default' 절"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "`break' 구문은 루프문 또는 switch문 밖에서 사용할 수 없습니다"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "`continue' 구문은 루프문 밖에서 사용할 수 없습니다"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "`next' 구문을 %s 동작 내에서 취급했습니다"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "`nextfile' 구문을 %s 동작 내에서 취급했습니다"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "`return' 구문을 함수 밖 영역에서 취급했습니다"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"BEGIN과 END 안에 있는 순수한 `print' 구문은 `print \"\"'와 같은 모양새여야 합"
+"니다"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "`delete' 구문은 SYMTAB과 함께 취급할 수 없습니다"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "`delete' 구문은 FUNCTAB과 함께 취급할 수 없습니다"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "`delete(array)'는 이식 불가능한 tawk 확장 기능입니다"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "다중 스테이지 이중 파이프라인이 동작하지 않습니다"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr "`>' 입출력 리다이렉션 결합의 대상이 모호합니다"
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "할당문의 우항에 정규 표현식이 있습니다"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "`~' 또는 `!~' 연산자 좌항에 정규 표현식이 있습니다'"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr ""
+"awk 이전 버전에서는 `for' 다음을 제외한 부분에서 `in' 키워드를 취급하지 않습"
+"니다"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "비교문 우항에 정규 표현식이 있습니다"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr ""
+"`%s' 규칙 내에서 리다이렉션 처리하지 않는 `getline' 취급이 잘못되었습니다"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr ""
+"END 동작 내에서 리다이렉션 처리하지 않는 `getline'을 정의하지 않았습니다"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "awk 이전 버전에서는 다차원 배열을 지원하지 않습니다"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "괄호를 뺀 `length' 호출은 이식 가능하지 않습니다"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "간접 함수 호출 방식은 gawk 확장 기능입니다"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr "간접 함수 호출시 `%s' 특수 변수를 취급할 수 없습니다"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "함수가 아닌 `%s' 이름을 함수 호출 구역 안에서 취급하려고 합니다"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "잘못된 하위스크립트 연산식"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "경고: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "실패: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "예상치 못한 개행 문자 또는 문자열 끝"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+"원본 파일 / 명령행 인자에 완전한 함수 이름 또는 규칙이 들어있어야 합니다"
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "읽을 `%s' 파일을 열 수 없습니다(%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "읽을 `%s' 공유 라이브러리를 열 수 없습니다(%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "원인을 알 수 없음"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "`%s' 요소를 프로그램 파일로 넣어 쓸 수 없습니다"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "이미 `%s' 원본 파일을 넣었습니다"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "이미 `%s' 공유 라이브러리를 불러왔습니다"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include는 gawk 확장 기능입니다"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "@include 다음에 파일 이름이 없습니다"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load는 gawk 확장 기능입니다"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "@load 다음에 파일 이름이 없습니다"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "명령행에 프로그램 텍스트가 없습니다"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "`%s' 원본 파일을 읽을 수 없습니다(%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "`%s' 원본 파일이 비었습니다"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "PEBKAC 오류: 소스 코드에 잘못된 문자 '\\%03o'"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "원본 파일이 개행 문자로 끝나지 않았습니다"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "파일 끝에 `\\' 문자로 끝나지 않은 정규 표현식이 있습니다"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"%s: %d: gawk에서는 `/.../%c' tawk 정규표현식 수정자가 동작하지 않습니다"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "gawk에서는 `/.../%c' tawk 정규 표현식 수정자가 동작하지 않습니다"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "끝나지 않은 정규 표현식"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "파일 끝에 끝나지 않은 정규 표현식"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "`\\ #...' 행 연속 표현자는 이식 불가능합니다"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "행의 백슬래시 문자는 마지막 문자가 아닙니다"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "다차원 배열은 gawk 확장 기능입니다"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX에서는 `**=' 연산자를 허용하지 않습니다"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "오래된 awk 버전에서는 `**=' 연산자를 지원하지 않습니다"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX에서는 `**' 연산자를 지원하지 않습니다"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "오래된 awk 버전에서는 `**' 연산자를 지원하지 않습니다"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "오래된 awk 버전에서는 `^=' 연산자를 지원하지 않습니다"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "오래된 awk 버전에서는 `^' 연산자를 지원하지 않습니다"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "끝나지 않은 문자열"
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX에서는 문자열 값에 물리 개행 문자를 허용하지 않습니다"
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr "백슬래시 문자열 연속 표현자는 이식 불가능합니다"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "표현식에 잘못된 문자 '%c'"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "`%s'은(는) gawk 확장 기능입니다"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX에서는 `%s'을(를) 허용하지 않습니다"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "오래된 awk 버전에서는 `%s'을(를) 지원하지 않습니다"
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr "`goto' 사용은 바람직하지 않습니다!"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d은(는) %s의 잘못된 인자 숫자입니다"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr "%s: 인자의 마지막 부분으로서 문자열 그 자체는 반영하지 않습니다"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "세번째 %s 매개변수는 값을 바꿀 수 없는 개체입니다"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: 세번째 인자는 gawk 확장 기능입니다"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: 두번째 인자는 gawk 확장 기능입니다"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"dcgettext(_\"...\") 사용이 올바르지 않습니다: 앞서 표기한 언더스코어 문자를 "
+"제거하십시오"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"dcngettext(_\"...\") 사용이 올바르지 않습니다: 앞서 표기한 언더스코어 문자를 "
+"제거하십시오"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: 두번째 인자 위치에는 정규표현식 상수를 허용하지 않습니다"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "`%s' 함수: `%s' 매개 변수와 전역 변수가 겹칩니다"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "기록할 `%s'을(를) 열 수 없습니다(%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "STDERR로 변수 목록 보내는 중"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: 닫기 실패 (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() 함수를 두번 호출했습니다!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "중복 변수가 있습니다."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "`%s' 함수 이름은 이미 앞에서 정의했습니다"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "`%s' 함수: 함수 이름을 매개변수 이름으로 사용할 수 없습니다"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr "`%s' 함수: `%s' 특수 변수를 함수 이름으로 활용할 수 없습니다"
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "`%s' 함수: `%s' 매개변수에 이름 공간 명칭을 넣을 수 없습니다"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "`%s' 함수: 매개변수 #%d, `%s'이(가) 매개변수 #%d와(과) 중복됩니다"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "`%s' 함수를 호출했지만 정의하지 않았습니다"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "`%s' 함수를 정의했지만 직접 호출한 적이 없습니다"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "#%d 매개변수의 정규표현식 상수에서 부울린 값을 넘겨줍니다"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"이름과 `(' 괄호 사이에 공백을 넣어 `%s' 함수를 호출했거나,\n"
+"변수 또는 배열로 사용했습니다"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "0으로 나누기를 시도했습니다"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "`%%'에서 0으로 나누기를 시도했습니다"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr "필드 후위 증가 연산자의 결과에 값을 할당할 수 없습니다"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "할당 대상이 잘못되었습니다(opcode %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr "%s 식별자: 기존 / POSIX 모드에서 한정 이름은 허용하지 않습니다"
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr "%s 식별자: 이름 공간은 콜론 하나가 아닌 두개로 구분합니다."
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr "`%s' 한정 식별자의 구성이 올바르지 않습니다"
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+"`%s' 식별자: 이름 공간 구분자는 한정 명칭에서 한번만 나타내레 수 있습니다"
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr "`%s' 예약 식별자는 이름 공간 명칭으로 허용하지 않습니다"
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+"한정 명칭의 두번째 요소로서의 `%s' 예약 식별자 활용은 허용하지 않습니다"
+
+#: awkgram.y:6799
+msgid "@namespace is a gawk extension"
+msgstr "@namespace는 gawk 확장 기능입니다"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr "`%s' 이름 공간 명칭에는 식별자 이름 규칙을 따라야합니다"
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s을(를) \"%s\"(으)로 실패(%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "표준 출력"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "표준 오류"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: 숫자가 아닌 인자 값을 받았습니다"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: %g 인자 값이 범위를 벗어납니다"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: 플러싱 불가: `%.*s' 파이프를 기록용이 아닌 읽기용으로 열었습니다"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr "fflush: 플러싱 불가: `%.*s' 파일을 기록용이 아닌 읽기용으로 열었습니다"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: `%.*s' 파일 플러싱 불가: %s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr "fflush: 플러싱 불가: `%.*s' 양방향 파이프가 기록 끝에 닫혔습니다"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: `%.*s'은(는) 열어둔 파일, 파이프 또는 병행프로세스가 아닙니다"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: 문자열이 아닌 첫번째 인자값을 받았습니다"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: 문자열이 아닌 두번째 인자값을 받았습니다"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: 숫자가 아닌 인자 값을 받았습니다"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: 배열 인자 값을 받았습니다"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "`length(array)'는 gawk 확장 기능입니다"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: 문자열이 아닌 인자 값을 받았습니다"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: 숫자가 아닌 인자 값을 받았습니다"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: 음수인 %g 인자 값을 받았습니다"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr ""
+"fatal: 모든 형식에 대해 `count$'를 쓰거나 아니면 아얘 쓰지 말아야 합니다"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "`%%' 지정자의 필드 폭은 무시합니다"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "`%%' 지정자의 정밀도는 무시합니다"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "`%%' 지정자의 필드 폭과 정밀도는 무시합니다"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fatal: `$'은(는) awk 형식에서 허용하지 않습니다"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fatal: `$'의 인자 갯수는 0보타 커야합니다"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr "fatal: 인자 갯수 %ld은(는) 지정 인자 전체 갯수보다 많아야 합니다"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fatal: 형식에 따르면 구두점 다음에 `$'을(를) 허용하지 않습니다"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr "fatal: 위치별 필드 폭 또는 정밀도로서의 `$'이(가) 없습니다"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "awk 형식에서 `l'은 의미가 없습니다. 무시함"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fatal: `l'은 POSIX awk 형식에서 허용하지 않습니다"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "awk 형식에서 `L'은 의미가 없습니다. 무시함"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fatal: `L'은 POSIX awk 형식에서 허용하지 않습니다"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "awk 형식에서 `h'는 의미가 없습니다. 무시함"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fatal: `h'는 POSIX awk 형식에서 허용하지 않습니다"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: %%2$c 형식에 대해 %1$g 값이 너무 큽니다"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: %g 값은 올바른 범위의 문자가 아닙니다"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: `%%%2$c' 형식에 대해  %1$g 값의 범위를 넘었습니다"
+
+#: builtin.c:1504
+#, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: `%%%2$c' 형식에 대해 %1$s 값의 범위를 넘었습니다"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr "%%%c 형식은 POSIX 표준이지만 다른 awk 프로그램에 이식할 수 없습니다."
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr "알 수 없는 `%c' 형식 지정 문자 무시: 변환한 인자 값 없음"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "fatal: 인자 값이 형식 문자열에서 지정한 만큼 충분하지 않습니다"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ 이 부분에 맞는 요소 빠짐"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: 형식 지정자에 제어 문자가 없습니다"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "형식 문자열에 너무나 많은 인자 값을 넣었습니다"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: 인자 값 없음"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: 인자 값 없음"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr "printf: 이미 닫힌 양방향 파이프라인의 쓰기 끝 지점에서 쓰기 시도"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: 숫자가 아닌 인자 값을 받았습니다"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "substr: 음의 %g 인자 값을 넣어 호출했습니다"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: %g 길이가 1보다 크거나 같지 않습니다"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: %g 길이가 0보다 크거나 같지 않습니다"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: 숫자가 아닌 %g 길이 값을 자릅니다"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+"substr: 문자열 인덱싱 번호로는 %g 길이 값이 너무 커서 %g 값으로 자릅니다"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: %g 시작 인덱스 값이 잘못되어 1을 사용합니다"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: 시작 인덱스로 사용하는 %g 비 정수값을 자릅니다"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: 원본 문자열 길이가 0입니다"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: %g 시작 인덱스 값이 문자열 길이보다 큽니다"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: %2$g 시작 인덱스로부터의 %1$g 길이는 첫번째 인자 값의 길이를 초과합니"
+"다(%3$lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime: PROCINFO[\"strftime\"]의 형식 값에 숫자 값이 있습니다"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: 숫자가 아닌 두번째 인자 값을 받았습니다"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: 두번째 인자 값이 0보다 작거나 time_t보다 큽니다"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: 두번째 인자 값이 time_t 범위를 벗어납니다"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: 문자열이 아닌 첫번째 인자 값을 받았습니다"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: 빈 형식 문자열을 받았습니다"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: 문자열이 아닌 인자 값을 받았습니다"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: 지정 값 중 최소 한개 이상이 기본 범위를 벗어납니다"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "샌드박스 모드에서는 'system' 함수 실행을 허용하지 않습니다"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: 문자열이 아닌 인자값을 받았습니다"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr "print: 이미 닫힌 양방향 파이프라인의 쓰기 끝 지점에서 쓰기 시도"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "초기화하지 않은 `$%d'번 필드 참조"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: 문자열이 아닌 인자 값을 받았습니다"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: 문자열이 아닌 인자 값을 받았습니다"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: 숫자가 아닌 첫번째 인자 값을 받았습니다"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: 숫자가 아닌 두번째 인자 값을 받았습니다"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: 숫자가 아닌 인자 값을 받았습니다"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: 숫자가 아닌 인자 값을 받았습니다"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: 숫자가 아닌 인자 값을 받았습니다"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: 세번째 인자 값이 배열이 아닙니다"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: 세번째 `%.*s' 인자 값을 1로 취급합니다"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: 인자 값 2개만을 사용하여 간접 호출할 수 있습니다"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "%s 간접 호출시 최소 인자 값 2개가 필요합니다"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: 숫자가 아닌 첫번째 인자 값을 받았습니다"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: 숫자가 아닌 두번째 인자 값을 받았습니다"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): 음수 값은 허용하지 않습니다"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): 소숫점 아래 값은 잘립니다"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): 쉬프팅한 값이 크면 이상한 결과를 가져올 수 있습니다"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: 숫자가 아닌 첫번째 인자 값을 받았습니다"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: 숫자가 아닌 두번째 인자 값을 받았습니다"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): 음수 값은 허용하지 않습니다"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): 소숫점 아래 값은 잘립니다"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): 쉬프팅한 값이 크면 이상한 결과를 가져올 수 있습니다"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: 인자 갯수가 둘 미만입니다"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: %d번째 인자 값은 숫자가 아닙니다"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: %d번째 %g 음수 인자 값은 허용하지 않습니다"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: 인자 갯수가 둘 미만입니다"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: %d번째 인자 값은 숫자가 아닙니다"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: %d번째 %g 음수 인자 값은 허용하지 않습니다"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: 인자 갯수가 둘 미만입니다"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: %d번째 인자 값은 숫자가 아닙니다"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: %d번째 %g 음수 인자 값은 허용하지 않습니다"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: 숫자가 아닌 인자 값을 받았습니다"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): 음수 값은 허용하지 않습니다"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): 소숫점 아래 값은 잘립니다"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: `%s'은(는) 유효한 로캘 분류가 아닙니다"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv: 세번째 인자 값이 배열이 아닙니다"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv: 숫자가 아닌 첫번째 인자 값을 받았습니다"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv: 숫자가 아닌 두번째 인자 값을 받았습니다"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv: 0으로 나누기를 시도했습니다"
+
+#: builtin.c:4046
+msgid "typeof: second argument is not an array"
+msgstr "typeof: 두번째 인자 값이 배열이 아닙니다"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+"typeof에서 잘못된 `%s' 플래그 조합을 발견했습니다. 오류 보고서를 제출해주십시"
+"오."
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof: 잘못된 `%s' 인자 형식"
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof: 알 수 없는 `%s' 인자 형식"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "(g)awk <구문> 을 입력하십시오. 명령의 끝은 \"end\"로 끝내십시오\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "잘못된 프레임 번호: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: 잘못된 옵션 - \"%s\""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\": 이미 소스로 반영했습니다."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": 명령을 허용하지 않습니다."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr "`commands' 명령은 breakpoint/watchpoint 명령에 활용할 수 없습니다"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "아직 중단점/관찰점을 설정하지 않았습니다"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "잘못된 중단점/관찰점 번호"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "%s %d에 도달 하였을 때, 줄 당 하나씩 명령을 입력하십시오.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "\"end\" 명령으로 끝내십시오\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "`end'는 `commands' 명령 또는 `eval' 명령에만 유효합니다"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "`silent'는 `commands' 명령에만 유효합니다"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: 잘못된 옵션 - \"%s\""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: 잘못된 중단점/관찰점 번호"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "인자 값이 문자열이 아닙니다"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: 잘못된 매개 변수 - \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "함수 아님 - \"%s\""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: 잘못된 옵션 - \"%s\""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "잘못된 범위 지정: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "필드 번호 값이 숫자가 아닙니다"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "숫자 값이어야 하지만, 숫자가 아닌 값입니다"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "0이 아닌 정수값"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - 전체 또는 안쪽 프레임 N개(N이 음수이면 바깥 프레임 N개) 추적 "
+"단계를 출력합니다."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr "break [[<파일 이름>:]N|<함수이름>] - 지정 위치에 중단점을 설정합니다."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr "clear [[<파일 이름>:]N|<함수이름>] - 앞서 설정한 중단점을 삭제합니다."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [<번호>] - 중단점(관찰점) 도달시 실행할 명령 조회를 시작합니다."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition <번호> [<수식>] - 중단점 또는 관찰점 상태를 설정하거나 소거합니다."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [<갯수>] - 디버깅 중인 프로그램 실행을 계속합니다."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr "delete [<중단점>] [<범위>] - 지정 중단점을 삭제합니다."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+"disable [<중단점>] [<범위>] - 지정 중단점을 사용하지 않도록 설정합니다."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr "display [<변수>] - 프로그램 실행을 멈출 때마다 변수 값을 출력합니다."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - N 프레임만큼 스택을 따라 내려갑니다."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+"dump [<파일 이름>] - 파일 또는 표준 출력을 대상으로 다수의 명령을 저장합니다."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [<중단점>] [<범위>] - 지정 중단점을 사용하도록 설정합니다."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - awk 구문 또는 명령의 조회를 끝냅니다."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr ""
+"eval <구문>|[<매개변수1>, <매개변수2>, ...] - awk 구문을 연산 실행합니다."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (quit와 동일) 디버거를 빠져나갑니다."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - 선택한 스택 프레임을 반환하기까지 실행합니다."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - N 번 스택 프레임을 선택하고 출력합니다."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr "help [명령] - 명령 목록과 명령 설명을 출력합니다."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr "ignore N <갯수> - N번부터 <갯수>만큼 중단점 무시 갯수를 설정합니다."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[<파일 이름>:]<행번호>|<함수이름>|<범위>] - 지정 행을 나타냅니다."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+"next [<갯수>] - 프로그램을 지정 횟수만큼 단계 실행하며, 하위 루틴 호출은 단"
+"일 단계로 간주합니다."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [<갯수>] - 명령 하나를 실행하며, 하위 루틴 호출은 단일 단계로 간주합니"
+"다."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [<이름>[=<값>]] - 디버거 옵션을 설정하거나 표시합니다."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print <변수> [<변수>] - 변수 값 또는 배열 값을 출력합니다."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf <형식>, [<인자값>], ... - 지정 형식대로 출력."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - 디버거를 빠져나갑니다."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr "return [<값>] - 선택한 스택 프레임에서 호출자로 값을 반환하도록합니다."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - 프로그램 실행을 시작하거나 다시 시작합니다."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save <파일 이름> - 세션에서 실행한 명령(목록)을 파일에 저장합니다."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set <변수> = <값> - 변수에 스칼라 값을 할당합니다."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - 중단점/관찰점에 도달하여 멈췄을 경우 일반적으로 나타나는 메시지를 숨"
+"깁니다."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source <파일> - 파일에 들어있는 명령을 실행합니다."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [<갯수>] - 다른 소스 코드 행에 도달할 때까지 프로그램을 단계 별로 진행합"
+"니다."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [<갯수>] - 정확하게 명령 한 개 실행을 진행합니다."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[<파일 이름>:]<N>|<함수이름>] - 임시 중단점을 설정합니다."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - 실행 전 명령을 출력합니다."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr "undisplay [N] - 자동 표시 목록에서 변수를 제거합니다."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[<파일 이름>:]<N>|<함수이름>] - 현재 프레임 영역에서 다른 행 또는 N 번"
+"째 행에 도달하기까지 프로그램을 실행합니다."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - 관찰 목록에서 변수를 제거합니다."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - 스택에서 N 번째 상단 프레임으로 이동합니다."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch <변수> - 변수를 관찰대상(관찰점)으로 설정합니다."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where [N] - (backtrace와 동일) 전체 또는 안쪽 프레임 N개(N이 음수이면 바깥 프"
+"레임 N개) 추적 단계를 출력합니다."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "명령을 읽을 수 없음(%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "명령을 읽을 수 없음(%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "명령에 잘못된 문자가 있습니다"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "알 수 없는 명령 - \"%.*s\", 도움말을 참고하십시오"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "잘못된 문자"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "정의하지 않은 명령: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr "기록 파일의 유지 행 갯수를 설정하거나 표시합니다."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "명령 목록 창 크기를 설정하거나 표시합니다."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "gawk 출력 파일을 설정하거나 표시합니다."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "디버거 프롬프트를 설정하거나 표시합니다."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr "명령 기록 저장을 설정(해제) 하거나 표시합니다(값=on|off)"
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "옵션 저장을 설정(해제) 하거나 표시합니다(값=on|off)"
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "명령문 추적을 설정(해제) 하거나 표시합니다(값=on|off)"
+
+#: debug.c:358
+msgid "program not running."
+msgstr "프로그램을 실행하고 있지 않습니다."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "`%s' 소스 파일을 읽을 수 없습니다(%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "`%s' 소스 파일이 비었습니다.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "현재 소스 파일이 아닙니다."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "`%s' 소스 파일을 찾을 수 없습니다(%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr "경고: 프로그램 컴파일 후 `%s' 소스 파일을 수정했습니다.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "행 번호 %d번 범위 초과 `%s' 행 갯수는 %d개 입니다"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "`%s' 파일, 행 번호 %d번 읽는 중 예상치 못한 파일 끝 발견"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "프로그램 시작 후 `%s' 소스 파일을 수정했습니다"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "현재 소스 파일: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "행 번호: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "소스 파일(행 갯수): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"번호  디스플레이  활성  위치\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\t도달횟수 = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\t다음 %ld번 도달 무시\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\t중단 상태: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\t명령:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "현재 프레임: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "프레임에서 호출함: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "프레임 호출자: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "main()에 없습니다.\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "인자가 없습니다.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "로컬 요소 아님.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"정의한 모든 변수:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"정의한 모든 함수:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"자동 표시 변수:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"관찰 변수:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "현재 컨텍스트에 `%s' 심볼이 없습니다\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "`%s'은(는) 배열이 아닙니다\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = 초기화 하지 않은 필드\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "`%s' 배열이 비어있습니다\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%.*s\"] 값은 `%s' 배열에 없습니다\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "`%s[\"%.*s\"]'은(는) 배열이 아닙니다\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "`%s'은(는) 스칼라 변수가 아닙니다"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "스칼라 컨텍스트에서 `%s[\"%.*s\"]' 배열을 취급하려고 합니다"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "`%s[\"%.*s\"]' 스칼라 구조를 배열 구조로 취급하려고 합니다"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "`%s'은(는) 함수입니다"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "관찰점 %d번 상태 정보가 없습니다\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "%ld번 항목 표시 안 함"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "%ld번 항목 관찰 안 함"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%.*s\"] 은(는) `%s' 배열이 아닙니다\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "스칼라 값을 배열로 사용하려고 합니다"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr "매개변수가 범위를 벗어나 관찰점 %d번을 삭제했습니다.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "매개변수가 범위를 벗어나 %d 디스플레이를 삭제했습니다.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr "`%s' 파일, 행 번호 %d번\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr "`%s':%d 위치"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tin "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "스택 프레임 더 따라가보기 ...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "잘못된 프레임 번호"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"참고: 중단점 %d번(활성, 다음 %ld번 도달 무시)을 %s:%d 위치에도 설정했습니다"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "참고: 중단점 %d번(활성)을 %s:%d 위치에도 설정했습니다"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"참고: 중단점 %d번(비활성, 다음 %ld번 도달 무시)을 %s:%d 위치에도 설정했습니다"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "참고: 중단점 %d번(비활성)을 %s:%d 위치에도 설정했습니다"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr ""
+"`%2$s' 파일, %3$d번째 행에 중단점 %1$d번 설정\n"
+" \n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "`%s' 파일에 중단점을 설정할 수 없습니다\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "`%2$s' 파일의 행 번호 %1$d번은 범위를 벗어납니다"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "규칙을 찾을 수 없습니다!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "`%s'에 중단점을 설정할 수 없습니다: %d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "`%s' 함수에 중단점을 설정할 수 없습니다\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr ""
+"`%2$s' 파일, 행 번호 %3$d번에 지정한 중단점 %1$d번 상태 정보가 없습니다\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "중단점 %d번을 삭제했습니다"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "`%s' 함수에 대한 중단점 항목이 없습니다\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "`%s' 파일, 행 번호 #%d 위치에 중단점 없음\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "잘못된 중단점 번호"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "모든 중단점을 삭제하시겠습니까? (y 또는 n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "y"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "중단점 %2$d번에 다음 %1$ld회 도달시 무시합니다.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "다음에 중단점 %d번에 도달했을 때 멈춥니다.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "`-f' 옵션을 붙였을 경우에만 프로그램을 디버깅할 수 있습니다.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "디버거 다시 시작에 실패했습니다"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "프로그램을 이미 실행 중입니다. 처음부터 다시 시작하시겠습니까(y/n)? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "프로그램을 다시 시작하지 않음\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "error: 다시 시작할 수 없습니다. 실행을 허용하지 않음\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "error (%s): 다시 시작할 수 없습니다. 나머지 명령 무시\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "프로그램 시작: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "비정상 종료 값을 반환하며 프로그램을 빠져나왔습니다: %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "정상 종료 값을 반환하며 프로그램을 빠져나왔습니다: %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "프로그램을 실행중입니다. 그래도 빠져나가시겠습니까(y/n)?"
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "어떤 중단점에서도 멈추지 않았습니다. 인자 값을 무시합니다.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "잘못된 중단점 번호 %d번."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "중단점 %2$d의 다음 %1$ld회 도달을 무시합니다.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "main() 프레임 바깥 우선 부분에서 'finish'는 의미없습니다\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "다음 위치에서 return 문까지 실행 "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr ""
+"main() 프레임 바깥 우선 부분에서 'return'은 의미없습니다\n"
+"\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "`%s' 함수의 지정 위치를 찾을 수 없습니다\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "`%2$s' 파일에서 잘못된 소스 행 번호 %1$d번"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "`%2$s' 파일의 %1$d번째 지정 위치를 찾을 수 없습니다\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "배열에 원소가 없습니다\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "형식을 지정하지 않은 변수\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "%s에서 중단 중 ...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "전역 jump '%s'에서 'finish'는 의미없습니다\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "전역 jump '%s'에서 'until'은 의미없습니다\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr ""
+"\t------계속하려면 [Enter] 를, 끝내려면 q [Enter] 를 입력하십시오------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] 값은 `%s' 배열에 없습니다"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "출력 내용을 표준 출력으로 보내는 중\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "잘못된 숫자 값"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "현재 컨텍스트에 `%s'을(를) 허용하지 않습니다. 구문 무시함"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "현재 컨텍스트에 `return'을 허용하지 않습니다. 구문 무시함"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "현재 컨텍스트에 `%s' 심볼이 없습니다"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "알 수 없는 노드 형식 %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "알 수 없는 opcode %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "%s opcode는 연산자나 키워드가 아닙니다"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "genflags2str에서 버퍼 넘침"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# 함수 콜 스택:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "`IGNORECASE'는 gawk 확장 기능입니다"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "`BINMODE'는 gawk 확장기능입니다"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "`%s' BINMODE 값이 잘못되어 3값으로 취급합니다"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "잘못된 `%2$s' `%1$sFMT' 정의"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "`LINT'에 값을 할당하여 `--lint' 옵션을 끕니다"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "초기화 하지 않은 `%s' 인자 값으로 참조"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "초기화 하지 않은 `%s' 값으로 참조"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "숫자가 아닌 값으로 필드 참조 시도"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "null 문자열로 필드 참조 시도"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "%ld번 필드 접근 시도"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "초기화하지 않은 `$%ld'번 필드를 참조했습니다"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "`%s' 함수를 선언 갯수보다 더 많은 인자 값으로 호출했습니다"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: 예상치 못한 `%s' 형식"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "`/=' 연산자로 0으로 나누기를 시도했습니다"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "`%%=' 연산자로 0으로 나누기를 시도했습니다"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "확장 기능은 샌드박스 모드에서 실행할 수 없습니다"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load는 gawk 확장 기능입니다"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: NULL lib_name을 받았습니다"
+
+#: ext.c:60
+#, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: `%s' 라이브러리를 열 수 없음(%s)"
+
+#: ext.c:66
+#, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: `%s' 라이브러리: `plugin_is_GPL_compatible'을 정의하지 않음(%s)"
+
+#: ext.c:72
+#, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: `%s' 라이브러리: `%s' 함수를 호출할 수 없음(%s)"
+
+#: ext.c:76
+#, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: `%s' 라이브러리의 `%s' 초기화 루틴 실행 실패"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: 함수 이름 빠짐"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr "make_builtin: `%s' gawk 내장 명칭을 함수 명칭으로 사용할 수 없습니다"
+
+#: ext.c:109
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: `%s' gawk 내장 명칭을 이름 영역 명칭으로 사용할 수 없습니다"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: `%s' 함수를 재정의할 수 없습니다"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: `%s' 함수를 이미 정의했습니다"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: 이미 `%s' 이름의 함수를 정의했습니다"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: `%s' 함수에 음수 인자 값"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr "`%s' 함수: 인자 #%d: 스칼라 값을 배열로 사용 시도"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "`%s' 함수: 인자 #%d: 배열을 스칼라 값으로 사용 시도"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "라이브러리 동작 불러오기를 지원하지 않습니다"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: `%s' 심볼링 링크를 읽을 수 없음"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: 잘못된 매개변수"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init: %s 변수를 만들 수 없습니다"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "이 시스템에서 fts를 지원하지 않습니다"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: 배열을 만들 수 없습니다"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: 원소를 설정할 수 없습니다"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: 원소를 설정할 수 없습니다"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: 원소를 설정할 수 없습니다"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: 배열을 설정할 수 없습니다"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: 원소를 설정할 수 없습니다"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: 인자가 3개 필요하나, 잘못된 인자 갯수로 호출했습니다"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: 첫번째 매개변수가 올바르지 않습니다"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: 두번째 매개변수가 올바르지 않습니다"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: 세번째 매개변수가 올바르지 않습니다"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: 배열을 평활화할 수 없습니다\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: 얍삽한 FTS_NOSTAT 플래그를 무시합니다. 메에에에에롱."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() 동작 실패\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: 첫번째 인자 값을 가져올 수 없습니다"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: 두번째 인자 값을 가져올 수 없습니다"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: 세번째 인자 값을 가져올 수 없습니다"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch 기능은 이 시스템을 대상으로 구현하지 않았습니다\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: FNM_NOMATCH 변수를 추가할 수 없습니다"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: %s 배열 원소를 설정할 수 없습니다"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: FNM 배열을 설치할 수 없습니다"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO는 배열 구조가 아닙니다!"
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace::begin: 제자리 편집 기능을 이미 사용중입니다"
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace::begin: 인자 값 2개가 필요하나 %d개로 호출했습니다"
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace::begin: 첫번째 인자 값을 문자열 파일 이름으로 가져올 수 없습니다"
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace::begin: 잘못된 `%s' <파일 이름>에 대한 제자리 편집 기능을 사용하지 않"
+"습니다"
+
+#: extension/inplace.c:152
+#, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace::begin: `%s' 대상으로 stat 명령을 실행할 수 없음(%s)"
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace::begin: `%s'은(는) 일반 파일이 아닙니다"
+
+#: extension/inplace.c:170
+#, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace::begin: mkstemp(`%s') 동작 실패(%s)"
+
+#: extension/inplace.c:182
+#, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace::begin: chmod 동작 실패(%s)"
+
+#: extension/inplace.c:189
+#, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace::begin: dup(stdout) 동작 실패(%s)"
+
+#: extension/inplace.c:192
+#, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::begin: dup2(%d, stdout) 동작 실패(%s)"
+
+#: extension/inplace.c:195
+#, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace::begin: close(%d) 동작 실패(%s)"
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace::end: 인자 값 2개가 필요하나 %d개로 호출했습니다"
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr "inplace::end: 첫번째 인자 값을 문자열 파일 이름으로 가져올 수 없습니다"
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace::end: 제자리 편집 기능을 활성화하지 않음"
+
+#: extension/inplace.c:227
+#, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::end: dup2(%d, stdout) 동작 실패(%s)"
+
+#: extension/inplace.c:230
+#, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace::end: close(%d) 동작 실패(%s)"
+
+#: extension/inplace.c:234
+#, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace::end: fsetpos(stdout) 동작 실패(%s)"
+
+#: extension/inplace.c:247
+#, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace::end: link(`%s', `%s') 동작 실패(%s)"
+
+#: extension/inplace.c:257
+#, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace::end: rename(`%s', `%s') 동작 실패(%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: 적절하지 않은 인자값으로 호출"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: 적절하지 않은 인자값으로 호출"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir 동작 실패: %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: 잘못된 종류의 인자 값으로 호출함"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: REVOUT 변수를 초기화할 수 없습니다"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: 0번 인자 값은 문자열이 아닙니다\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: 1번 인자 값은 배열이 아닙니다\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: 배열 평활화 불가\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: 평활화 배열을 릴리스할 수 없음\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "배열 값에 알 수 없는 %d 형식 값이 있습니다"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: 0번 인자 값은 문자열 이 아닙니다\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: 1번 인자 값은 배열이 아닙니다\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array 처리 실패\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element 처리 실패\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr "복원한 알 수 없는 %d 형식 코드 값을 문자열로 취급합니다"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: 이 플랫폼에서 지원하지 않습니다"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: 필요한 숫자 인자값이 빠짐"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: 인자 값이 음수입니다"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: 이 플랫폼에서 지원하지 않습니다"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "입력 레코드가 너무 큽니다"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF 값을 음수 값으로 설정했습니다"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr "대부분의 awk 버전에 NF 값 감소 코드를 이식할 수 없습니다"
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr "END 규칙에서의 필드 접근 코드는 이식 불가능합니다"
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: 네번째 인자 대입은 gawk 확장 기능입니다"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: 네번째 인자 값이 배열이 아닙니다"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: 두번째 인자 값이 배열이 아닙니다"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split: 두번째 인자와 네번째 인자 값으로 동일한 배열을 사용할 수 없습니다"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: 네번째 인자에 대한 두번째 인자 값으로 하위 배열을 사용할 수 없습니다"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: 두번째 인자에 대한 네번째 인자 값으로 하위 배열을 사용할 수 없습니다"
+
+#: field.c:1036
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: 세번째 null 문자열 인자 값은 비 표준 확장 기능입니다"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: 네번째 인자 값은 배열이 아닙니다"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: 두번째 인자 값은 배열이 아닙니다"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: 세번째 인자 값은 null 값이 아니어야 합니다"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: 두번째 인자와 네번째 인자 값으로 동일한 배열을 사용할 수 없습니다"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: 네번째 인자에 대한 두번째 인자 값으로 하위 배열을 사용할 수 없습니"
+"다"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: 두번째 인자에 대한 네번째 인자 값으로 하위 배열을 사용할 수 없습니"
+"다"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "`FIELDWIDTHS'는 gawk 확장 기능입니다"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "`*'는 FIELDWIDTHS의 마지막 지시자여야합니다"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "%d번째 필드 `%s' 부근에 잘못된 FIELDWIDTHS 값"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "`FS'에 대한 null 문자열 대입은 gawk 확장 기능입니다"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "오래된 awk 버전에서는 `FS'의 정규 표현식값 사용을 지원하지 않습니다"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "`FPAT'은 gawk 확장 기능입니다"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: received null retval"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: MPFR 모드가 아닙니다"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: MPFR을 지원하지 않음"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: 잘못된 `%d' 숫자 형식"
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "add_ext_func: NULL name_space 매개변수를 받았습니다"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+"node_to_awk_value: 잘못된 `%s' 숫자 플래그 조합 발견. 오류 보고서를 제출해주"
+"십시오."
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: null 노드를 받았습니다"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: null 값을 받았습니다"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+"node_to_awk_value에서 잘못된 `%s' 플래그 조합 발견. 오류 보고서를 제출해주십"
+"시오."
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: null 배열을 받았습니다"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: null 인덱스 지시자를 받았습니다"
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array_typed: %d 인덱스를 %s(으)로 변환할 수 없음"
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array_typed: %d 값을 %s(으)로 변환할 수 없음"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr: MPFR을 지원하지 않음"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "BEGINFILE 규칙의 끝을 찾을 수 없음"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "`%2$s'의 인식할 수 없는 `%1$s' 파일 형식을 열 수 없음"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "`%s' 명령행 인자 값은 디렉터리입니다. 건너뜀"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "읽을 `%s' 파일을 열 수 없음(%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "%d(`%s') 파일 서술자 닫기 실패(%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "샌드박스 모드에서는 리다이렉션을 허용하지 않습니다"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "`%s' 리다이렉션 표현식은 숫자입니다"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "`%s' 리다이렉션의 표현식에 널 문자열 값이 있습니다"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"`%.*s' 파일 이름(`%s' 리다이렉션)은 논리 표현식의 결과 값인 것 같습니다"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr ""
+"`%.*s' 파일에 대해 `>'와 `>>' 리다이렉션 연산자를 조합할 필요가 없습니다"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file에서 파일 서술자 %2$d 번에 `%1$s' 파이프를 만들 수 없습니다"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "출력할 `%s' 파이프를 열 수 없음(%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "입력할 `%s' 파이프를 열 수 없음(%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"파일 서술자 %2$d번의 `%1$s'에 대해 이 플랫폼에서 get_file socket 생성을 지원"
+"하지 않음"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "입출력을 수행할 `%s' 양방향 파이프를 열 수 없음(%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "`%s'에서 리다이렉션 수행 불가(%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "`%s'(으)로 리다이렉션 수행 불가(%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr "파일 열기 동작이 시스템 한계에 도달: 다중 파일 서술자로 시작합니다"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "`%s' 닫기 실패(%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "열어둔 파이프 또는 입력 파일이 너무 많습니다"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: 두번째 인자 값은 `to' 또는 `from' 이어야 합니다"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: `%.*s'은(는) 열어둔 파일, 파이프 또는 병행프로세스가 아닙니다"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "연 적이 없는 리다이렉션을 닫습니다"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: `%s' 리다이렉션을 `|&' 연산자로 열지 않아 두번째 인자 값은 무시합니다"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "`%2$s'의 파이프 닫기 과정에서 실패 상태 반환(%1$d)(%3$s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "`%2$s'의 파일 닫기 과정에서 실패 상태 반환(%1$d)(%3$s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "`%s' 소켓의 닫기 동작을 명시하지 않았습니다"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "`%s' 병행 프로세스의 닫기 동작을 명시하지 않았습니다"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "`%s' 파이프의 닫기 동작을 명시하지 않았습니다"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "`%s' 파일의 닫기 동작을 명시하지 않았습니다"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush: 표준 출력을 플러싱할 수 없음: %s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush: 표준 오류를 플러싱할 수 없음: %s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "표준 출력으로의 기록 오류(%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "표준 오류로의 기록 오류(%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "`%s' 파이프 플러싱 실패(%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "`%s'(으)로의 병행프로세스 파이프 플러싱 실패(%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "`%s'의 파일 플러싱 실패(%s)"
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "`/inet'의 지역 포트 %s이(가) 올바르지 않습니다: %s"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "`/inet'의 지역 포트 %s이(가) 올바르지 않습니다"
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "월격 호스트 및 포트 정보(%s, %s)가 올바르지 않습니다: %s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "원격 호스트 및 포트 정보(%s, %s)가 올바르지 않습니다"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "TCP/IP 통신은 지원하지 않습니다"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "`%2$s' 모드로 `%1$s'을(를) 열 수 없습니다"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "주 pty 닫기 실패(%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "하위 프로세스에서 표준 출력 닫기 실패(%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr "하위 프로세스에서 표준 출력으로의 부 pty 이동 실패(dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "하위 프로세스에서 표준 입력 닫기 실패(%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr "하위 프로세스에서 표준 입력으로의 부 pty 이동 실패(dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "부 pty 닫기 실패(%s)"
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr "하위 프로세스를 만들거나 pty를 개방할 수 없습니다"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr "하위 프로세스에서 표준 출력으로의 파이프 이동 실패(dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr "하위 프로세스에서 표준 입력으로의 파이프 이동 실패(dup: %s)"
+
+#: io.c:2386 io.c:2655
+msgid "restoring stdout in parent process failed"
+msgstr "상위 프로세스의 표준 출력 복원 실패"
+
+#: io.c:2394
+msgid "restoring stdin in parent process failed"
+msgstr "상위 프로세스의 표준 입력 복원 실패"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "파이프 닫기 실패(%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "`|&' 파이프는 지원하지 않습니다"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "`%s' 파이프를 열 수 없음(%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "`%s'의 하위 프로세스를 만들 수 없음(fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr "getline: 이미 닫힌 양방향 파이프라인의 읽기 끝 지점에서 읽기 시도"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: NULL 포인터를 받았습니다"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr "`%s' 입력 파서가 앞서 설치한 `%s' 입력 파서와 동시에 동작합니다"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "`%s' 입력 파서에서 `%s' 열기 실패"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: NULL 포인터를 받았습니다"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr "`%s' 출력 래퍼는 이미 설치한 `%s' 출력 래퍼와 동시에 동작합니다"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "`%s' 출력 래퍼에서  `%s' 열기 실패"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: NULL 포인터를 받았습니다"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"`%s' 양방향 처리자는 이미 설치한 `%s' 양방향 처리자와 동시에 동작합니다"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "`%s' 양방향 처리자에서 `%s' 열기 실패"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "`%s' 데이터 파일이 비어있습니다"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "더 많은 입력 메모리를 할당할 수 없습니다"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "`RS'의 다중 문자 값은 gawk 확장 기능입니다"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "IPv6 통신은 지원하지 않습니다"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr "`POSIXLY_CORRECT' 환경 변수 설정: `--posix' 활성화"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "`--posix' 옵션은 `--traditional' 옵션에 우선합니다"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr ""
+"`--posix'/`--traditional' 옵션은 `--non-decimal-data' 옵션에 우선합니다"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "`--posix' 옵션은 `--characters-as-bytes' 옵션에 우선합니다"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "root 계정으로의 %s 실행은 보안 문제를 야기할 수 있습니다"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "표준 출력에 이진 모드를 설정할 수 없음(%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "표준 출력에 이진 모드를 설정할 수 없음(%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "표준 오류에 이진 모드를 설정할 수 없음(%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "어떤 프로그램 구문도 없습니다!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"사용법: %s [<POSIX 또는 GNU 방식 옵션>] -f <프로그램파일> [--] <파일> ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+"사용법: %s [<POSIX 또는 GNU 방식 옵션>] [--] %c<프로그램구문>%c <파일> ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "POSIX 옵션:\t\tGNU 버전 긴 옵션: (표준)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f <프로그램-파일>\t\t--file=<프로그램-파일>\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F <필드-구분자>\t\t\t--field-separator=<필드-구분자>\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v <변수>=<값>\t\t--assign=<변수>=<값>\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "짧은 옵션:\t\tGNU 버전 긴 옵션: (확장 기능)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[<파일>]\t\t--dump-variables[=<파일>]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[<파일>]\t\t--debug[=<파일>]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e '<프로그램-구문>'\t--source='<프로그램-구문>'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E <파일>\t\t\t--exec=<파일>\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i <포함파일>\t\t--include=<포함파일>\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l <라이브러리>\t\t--load=<라이브러리>\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[<파일>]\t\t--pretty-print[=<파일>]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[<파일>]\t\t--profile[=<파일>]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr "\t-Z <로캘-이름>\t\t--locale=<로캘-이름>\n"
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"오류를 보고하려면, `gawk.info' 인쇄 버전 설명서에 있는\n"
+"`Reporting Problems and Bugs' 섹션의 `Bugs' 노드를 \n"
+"참고하십시오. 동일한 정보는 다음 주소에서 찾아보실 수 있습니다.\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"comp.lang.awk \n"
+"\n"
+"또는 \n"
+"\n"
+"스택오버플로우같은 사용자 포럼에 오류 정보를 게시하지 마십시오.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk는 패턴 검색 처리 언어입니다.\n"
+"기본적으로 표준 입력을 읽고 표준 출력에 기록합니다.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"예제:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' <파일>\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"이 프로그램은 자유 소프트웨어입니다. 자유 소프트웨어 재단에서 출시한\n"
+"GNU 일반 공중 사용 허가서 버전 3 (또는 취향에 따라) 이상의 조항에 따라\n"
+"자유롭게 수정하고 재배포할 수 있습니다.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"이 프로그램이 유용하길 바라며 배포하나, 어떤 보증도 하지 않습니다.\n"
+"심지어 암묵적 상업성 또는 일부 목적에 대한 적합성도 보증하지 않습니다.\n"
+"자세한 내용은 GNU 일반 공중 사용 허가서를 참고하십시오.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"이 프로그램과 함께 GNU 일반 공중 사용 허가서를 받으셔야합니다.\n"
+"사용 허가서가 없을 경우 http://www.gnu.org/licenses/ 주소를 참고하십시오.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft 옵션에 POSIX awk의 탭에 대한 필드 구분자가 없습니다"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: `<변수>=<값>' 형식이 아닌 `-v'의 `%s' 인자값\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "`%s'은(는) 적절한 변수 이름이 아닙니다"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "`%s'은(는) 변수 이름이 아닙니다. `%s=%s' 파일을 살펴보는 중"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "`%s' gawk 내장 요소를 변수 이름으로 취급할 수 없습니다"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "`%s' 함수를 변수 이름으로 취급할 수 없습니다"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "소숫점 예외"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "치명적 오류: 내부 오류"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "치명적 오류: 내부 오류: 세그먼테이션 오류"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "치명적 오류: 내부 오류: 스택 오버플로우"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "파일 서술자 %d번 미리 열지 않음"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "파일 서술자 %d번에 대해 /dev/null을 미리 열 수 없습니다"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "`-e/--source'의 빈 인자 값 대입은 무시합니다"
+
+#: main.c:1662 main.c:1667
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "`--profile' 옵션은 `--pretty-print' 옵션에 우선합니다"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M 무시함: MPFR/GMP 기능을 넣어 컴파일하지 않았습니다"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: `-W %s' 옵션은 인식할 수 없습니다. 무시함\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: 옵션에 인자 값이 필요합니다 -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "`%.*s' PREC 값은 올바르지 않습니다"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "`%.*s' RNDMODE 값은 올바르지 않습니다"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: 숫자가 아닌 인자 값을 받았습니다"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): 음수 값은 허용하지 않습니다"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "comp(%Rg): 소숫점 아래 값은 자릅니다"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): 음수 값은 허용하지 않습니다"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: 숫자가 아닌 #%d번째 인자 값을 받았습니다"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: #d번째 인자 값이 잘못된 %Rg 값을 취하여 0 값을 사용합니다"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: #%d번째 인자 %Rg 음수 값은 허용하지 않습니다"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: #%d번째 %Rg 인자 값의 소숫점 아래 값은 자릅니다"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: #%d번째 %Zd 인자 값은 허용하지 않습니다"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "명령행:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "형식 지정 정규표현식을 구성할 수 없습니다"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "awk 이전 버전에서는 `\\%c' 이스케이프 시퀀스를 지원하지 않습니다"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX에서 `\\x' 이스케이프를 허용하지 않습니다"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "`\\x' 이스케이프 시퀀스에 16진수가 없습니다"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"\\x%.*s 16진수 이스케이프(%d번째 문자)를 원하는 방식대로 해석하지 않았을 수"
+"도 있습니다"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "`\\%c' 이스케이프 시퀀스는 일반 `%c' 문자처럼 취급합니다"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"잘못된 멀티바이트 데이터를 발견했습니다. 데이터와 로캘의 불일치가 있을 수 있"
+"습니다."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s `%s': 파일 서술자 플래그를 가져올 수 없음: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s `%s': close-on-exec 설정 불가: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr "프로그램 들여쓰기 깊이가 너무 많습니다. 코드를 다시 작성해보십시오"
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "기록할 `%s'을(를) 열 수 없습니다: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "STDERR로 프로파일 보내는 중"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s 규칙\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# 규칙\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "내부 오류: null 변수 이름과 %s"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "내부 오류: null 함수 이름 내장"
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"%s# 불러온 확장 기능 (-l and/or @load)\n"
+"\n"
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\n"
+"# 포함한 파일 (-i and/or @include)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# gawk 프로파일, created %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# 알파벳 순 함수\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: 알 수 없는 %d 리다이렉션 형식"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr "NUL 문자가 들어간 정규 표현식에 대응하는 동작은 POSIX에 없습니다"
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr "동적 정규 표현식에 잘못된 NUL 바이트"
+
+#: re.c:172
+#, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "정규 표현식의 `\\%c' 이스케이프 시퀀스는 단순 `%c' 문자로 취급합니다"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+"정규 표현식의 `\\%c' 이스케이프 시퀀스는 알려진 정규 표현식 연산자가 아닙니다"
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "정규 표현식의 `%.*s' 구성 요소는 `[%.*s]' 이어야 할 것 같습니다"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "짝이 맞지 않는 [ 괄호"
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "잘못된 문자 클래스"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "문자 클래스 표기 방식은 [:space:]가 아닌 [[:space:]]입니다"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "끝나지 않은 \\ 이스케이프 문자"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "잘못된 \\{\\} 내용"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "정규 표현식이 너무 깁니다"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "짝이 맞지 않는 ( 괄호"
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "구문을 지정하지 않았습니다"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr "짝이 맞지 않는 ) 괄호"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: '%s' 옵션이 모호합니다. 가능한 옵션:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr ""
+"%s: '--%s' 옵션에서는 인자 값을 받지 않습니다\n"
+"\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: '%c%s' 옵션에서는 인자 값을 받지 않습니다\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: '--%s' 옵션에 인자 값이 필요합니다\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: 인식할 수 없는 '--%s' 옵션\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: 인식할 수 없는 '%c%s' 옵션\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: 잘못된 옵션 -- '%c'\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: 옵션에 인자가 필요합니다 -- '%c'\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: '-W %s' 옵션이 모호합니다\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: '-W %s' 옵션에서는 인자 값을 받지 않습니다\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: '-W %s' 옵션에 인자 값이 필요합니다\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "성공"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "일치 항목 없음"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "잘못된 정규 표현식"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "잘못된 문자 조합"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "잘못된 문자 클래스 이름"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "역슬래시 문자가 따라옴"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "잘못된 후위 참조"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "일치하지 않는 [, [^, [:, [., [="
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "일치하지 않는 ( 또는 \\( 괄호"
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "일치하지 않는 \\{ 괄호"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "잘못된 \\{\\} 내용"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "잘못된 범위 끝"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "메모리가 바닥남"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "잘못된 선행 정규 표현식"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "정규 표현식 마감 표현이 앞서있습니다"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "정규 표현식이 너무 깁니다"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "일치하지 않는 ) 또는 \\) 괄호"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "이전 정규 표현식 없음"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "`%s' 함수: `%s' 함수를 매개변수 이름으로 사용할 수 없습니다"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "주 컨텍스트를 빠져나올 수 없습니다"
diff --git a/gawk-5.0.1/po/ms.po b/gawk-5.0.1/po/ms.po
new file mode 100644
index 00000000000..9b90c4b2630
--- /dev/null
+++ b/gawk-5.0.1/po/ms.po
@@ -0,0 +1,3582 @@
+# gawk Bahasa Melayu (Malay).
+# Copyright (C) 2013 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Sharuzzaman Ahmat Raslan <sharuzzaman@gmail.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.0.75\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2013-04-19 10:45+0800\n"
+"Last-Translator: Sharuzzaman Ahmat Raslan <sharuzzaman@gmail.com>\n"
+"Language-Team: Malay <translation-team-ms@lists.sourceforge.net>\n"
+"Language: ms\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "dari %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "cubaan untuk menggunakan nilai skalar sebagai tatasusunan"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "cubaan untuk menggunakan parameter skalar `%s' sebagai tatasusunan"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "cubaan untuk menggunakan skalar `%s' sebagai tatasusunan"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "cubaan untuk menggunakan tatasusunan `%s' dalam konteks skalar"
+
+#: array.c:574
+#, fuzzy, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "padam: indeks `%s' tiada dalam tatasusunan `%s'"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr ""
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr ""
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr ""
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr ""
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr ""
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr ""
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr ""
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr ""
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr ""
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr ""
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr ""
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr ""
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr ""
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr ""
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr ""
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr ""
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr ""
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr ""
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr ""
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr ""
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr ""
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr ""
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr ""
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr ""
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr ""
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr ""
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr ""
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr ""
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr ""
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr ""
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr ""
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr ""
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr ""
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr ""
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr ""
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr ""
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr ""
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr ""
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr ""
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr ""
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr ""
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr ""
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr ""
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr ""
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr ""
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr ""
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr ""
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr ""
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr ""
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr ""
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr ""
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr ""
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr ""
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr ""
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr ""
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr ""
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr ""
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr ""
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr ""
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr ""
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr ""
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr ""
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr ""
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr ""
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr ""
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr ""
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr ""
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr ""
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr ""
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr ""
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr ""
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr ""
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr ""
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr ""
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr ""
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr ""
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr ""
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr ""
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr ""
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr ""
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr ""
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr ""
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr ""
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr ""
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr ""
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr ""
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr ""
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr ""
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr ""
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr ""
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr ""
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr ""
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr ""
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr ""
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr ""
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+msgid "@namespace is a gawk extension"
+msgstr ""
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr ""
+
+#: builtin.c:147
+msgid "standard output"
+msgstr ""
+
+#: builtin.c:148
+msgid "standard error"
+msgstr ""
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr ""
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr ""
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr ""
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr ""
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr ""
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr ""
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr ""
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr ""
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr ""
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr ""
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr ""
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr ""
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr ""
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr ""
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr ""
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr ""
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr ""
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr ""
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr ""
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr ""
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr ""
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr ""
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr ""
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr ""
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr ""
+
+#: builtin.c:1504
+#, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr ""
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr ""
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr ""
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr ""
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr ""
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr ""
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr ""
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr ""
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr ""
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr ""
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr ""
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr ""
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr ""
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr ""
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr ""
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr ""
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr ""
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr ""
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr ""
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr ""
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr ""
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr ""
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr ""
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr ""
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr ""
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr ""
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr ""
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr ""
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr ""
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr ""
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr ""
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr ""
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr ""
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr ""
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr ""
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr ""
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr ""
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr ""
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr ""
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr ""
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr ""
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr ""
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr ""
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr ""
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr ""
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr ""
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr ""
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr ""
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr ""
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr ""
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr ""
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr ""
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr ""
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr ""
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr ""
+
+#: builtin.c:4046
+msgid "typeof: second argument is not an array"
+msgstr ""
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr ""
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr ""
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr ""
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr ""
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr ""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr ""
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr ""
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr ""
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr ""
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr ""
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr ""
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr ""
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr ""
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr ""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr ""
+
+#: command.y:451
+msgid "argument not a string"
+msgstr ""
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr ""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr ""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr ""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr ""
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr ""
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr ""
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr ""
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr ""
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr ""
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr ""
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr ""
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr ""
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr ""
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr ""
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr ""
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr ""
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr ""
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr ""
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr ""
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr ""
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr ""
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr ""
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr ""
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr ""
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr ""
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr ""
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr ""
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr ""
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr ""
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr ""
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr ""
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr ""
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr ""
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: command.y:1293
+msgid "invalid character"
+msgstr ""
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr ""
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr ""
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr ""
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr ""
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr ""
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr ""
+
+#: debug.c:358
+msgid "program not running."
+msgstr ""
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr ""
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr ""
+
+#: debug.c:493
+msgid "no current source file."
+msgstr ""
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr ""
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr ""
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr ""
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr ""
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr ""
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr ""
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr ""
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr ""
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr ""
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr ""
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr ""
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr ""
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr ""
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr ""
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr ""
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr ""
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr ""
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr ""
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr ""
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr ""
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr ""
+
+#: debug.c:1132 debug.c:1184
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "padam: indeks `%s' tiada dalam tatasusunan `%s'"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr ""
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr ""
+
+#: debug.c:1272 debug.c:5133
+#, fuzzy, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "cubaan untuk menggunakan tatasusunan `%s' dalam konteks skalar"
+
+#: debug.c:1295 debug.c:5144
+#, fuzzy, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "cubaan untuk menggunakan skalar `%s' sebagai tatasusunan"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr ""
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr ""
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr ""
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr ""
+
+#: debug.c:1543
+#, fuzzy, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "padam: indeks `%s' tiada dalam tatasusunan `%s'"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr ""
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr ""
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr ""
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr ""
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr ""
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr ""
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr ""
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr ""
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr ""
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr ""
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr ""
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr ""
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr ""
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr ""
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr ""
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr ""
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr ""
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr ""
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr ""
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr ""
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr ""
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr ""
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr ""
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr ""
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr ""
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr ""
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr ""
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr ""
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr ""
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr ""
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr ""
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr ""
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr ""
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr ""
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr ""
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr ""
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr ""
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr ""
+
+#: debug.c:4324
+msgid "q"
+msgstr ""
+
+#: debug.c:5140
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "padam: indeks `%s' tiada dalam tatasusunan `%s'"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr ""
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr ""
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr ""
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr ""
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr ""
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr ""
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr ""
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr ""
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr ""
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr ""
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr ""
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr ""
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr ""
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr ""
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr ""
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr ""
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr ""
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr ""
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr ""
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr ""
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr ""
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr ""
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr ""
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr ""
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr ""
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr ""
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr ""
+
+#: ext.c:60
+#, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr ""
+
+#: ext.c:66
+#, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+
+#: ext.c:72
+#, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr ""
+
+#: ext.c:76
+#, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr ""
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr ""
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+
+#: ext.c:109
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr ""
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr ""
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr ""
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr ""
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr ""
+
+#: ext.c:232
+msgid "dynamic loading of libraries is not supported"
+msgstr ""
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr ""
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr ""
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr ""
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr ""
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr ""
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr ""
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr ""
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr ""
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr ""
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr ""
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr ""
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr ""
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr ""
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr ""
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr ""
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr ""
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr ""
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr ""
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr ""
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr ""
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr ""
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr ""
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr ""
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr ""
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+
+#: extension/inplace.c:152
+#, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr ""
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr ""
+
+#: extension/inplace.c:170
+#, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:182
+#, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:189
+#, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:192
+#, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:195
+#, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr ""
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr ""
+
+#: extension/inplace.c:227
+#, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:230
+#, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:234
+#, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:247
+#, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr ""
+
+#: extension/inplace.c:257
+#, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr ""
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr ""
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr ""
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr ""
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr ""
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr ""
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr ""
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr ""
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr ""
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr ""
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr ""
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr ""
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr ""
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr ""
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr ""
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr ""
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr ""
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr ""
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr ""
+
+#: field.c:284
+msgid "input record too large"
+msgstr ""
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr ""
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr ""
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr ""
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr ""
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+
+#: field.c:1036
+msgid "split: null string for third arg is a non-standard extension"
+msgstr ""
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr ""
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr ""
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr ""
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr ""
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr ""
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr ""
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr ""
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr ""
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr ""
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr ""
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr ""
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr ""
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr ""
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr ""
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr ""
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr ""
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr ""
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr ""
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr ""
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr ""
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr ""
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr ""
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr ""
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr ""
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr ""
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr ""
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr ""
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr ""
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr ""
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr ""
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr ""
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr ""
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr ""
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr ""
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr ""
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr ""
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr ""
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr ""
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr ""
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr ""
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr ""
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr ""
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr ""
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr ""
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr ""
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr ""
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr ""
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr ""
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr ""
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr ""
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr ""
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr ""
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr ""
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr ""
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr ""
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr ""
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr ""
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr ""
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr ""
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr ""
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr ""
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr ""
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr ""
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+
+#: io.c:2386 io.c:2655
+msgid "restoring stdout in parent process failed"
+msgstr ""
+
+#: io.c:2394
+msgid "restoring stdin in parent process failed"
+msgstr ""
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr ""
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr ""
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr ""
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr ""
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr ""
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr ""
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr ""
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr ""
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr ""
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr ""
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr ""
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr ""
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr ""
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr ""
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr ""
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr ""
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr ""
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr ""
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr ""
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr ""
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr ""
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr ""
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr ""
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr ""
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr ""
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr ""
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr ""
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr ""
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr ""
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr ""
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr ""
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr ""
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr ""
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr ""
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr ""
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr ""
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr ""
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr ""
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr ""
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr ""
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr ""
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr ""
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr ""
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr ""
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr ""
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr ""
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr ""
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr ""
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr ""
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr ""
+
+#: main.c:625
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr ""
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr ""
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr ""
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr ""
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr ""
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr ""
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr ""
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr ""
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr ""
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr ""
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr ""
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr ""
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr ""
+
+#: main.c:1662 main.c:1667
+msgid "`--profile' overrides `--pretty-print'"
+msgstr ""
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr ""
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr ""
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr ""
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr ""
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr ""
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr ""
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr ""
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr ""
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr ""
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr ""
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr ""
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr ""
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr ""
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr ""
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr ""
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr ""
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr ""
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr ""
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr ""
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr ""
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr ""
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr ""
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr ""
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr ""
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr ""
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr ""
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr ""
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr ""
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr ""
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr ""
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr ""
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr ""
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr ""
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr ""
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr ""
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr ""
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr ""
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr ""
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ""
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr ""
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr ""
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr ""
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr ""
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr ""
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr ""
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr ""
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr ""
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr ""
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr ""
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr ""
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr ""
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr ""
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr ""
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr ""
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr ""
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr ""
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr ""
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr ""
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr ""
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr ""
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr ""
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr ""
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr ""
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr ""
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr ""
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr ""
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ""
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr ""
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr ""
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr ""
+
+#, fuzzy
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "cubaan untuk menggunakan tatasusunan `%s' dalam konteks skalar"
+
+#, fuzzy
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "cubaan untuk menggunakan skalar `%s' sebagai tatasusunan"
diff --git a/gawk-5.0.1/po/nl.po b/gawk-5.0.1/po/nl.po
new file mode 100644
index 00000000000..81f8352d014
--- /dev/null
+++ b/gawk-5.0.1/po/nl.po
@@ -0,0 +1,4117 @@
+# Dutch translations for GNU gawk.
+# Copyright (C) 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+#
+# “Flierefluiten!!”
+#
+# Erwin Poeze <erwin.poeze@gmail.com>, 2009.
+# Benno Schulenberg <benno@vertaalt.nl>, 2005, 2007, 2010, 2011, 2012, 2013.
+# Benno Schulenberg <benno@vertaalt.nl>, 2014, 2015, 2016, 2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.2.63\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2019-03-04 10:51+0100\n"
+"Last-Translator: Benno Schulenberg <vertaling@coevern.nl>\n"
+"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"X-Generator: Lokalize 1.0\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "van %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "scalaire waarde wordt gebruikt als array"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "scalaire parameter '%s' wordt gebruikt als array"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "scalair '%s' wordt gebruikt als array"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "array '%s' wordt gebruikt in een scalaire context"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: index '%.*s' niet in array '%s'"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "scalair '%s[\"%.*s\"]' wordt gebruikt als array"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: eerste argument is geen array"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: tweede argument is geen array"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: tweede argument is geen array"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: eerste argument is geen array"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: eerste argument is geen array"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: een subarray van het eerste argument kan niet als tweede argument "
+"gebruikt worden"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: een subarray van het eerste argument kan niet als tweede argument "
+"gebruikt worden"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: een subarray van het tweede argument kan niet als eerste argument "
+"gebruikt worden"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: een subarray van het tweede argument kan niet als eerste argument "
+"gebruikt worden"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "'%s' is ongeldig als functienaam"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "sorteervergelijkingsfunctie '%s' is niet gedefinieerd"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s-blokken horen een actiedeel te hebben"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "elke regel hoort een patroon of een actiedeel te hebben"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "oude 'awk' staat meerdere 'BEGIN'- en 'END'-regels niet toe"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "'%s' is een ingebouwde functie en is niet te herdefiniëren"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "regexp-constante '//' lijkt op C-commentaar, maar is het niet"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "regexp-constante '/%s/' lijkt op C-commentaar, maar is het niet"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "dubbele 'case'-waarde in 'switch'-opdracht: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "dubbele 'default' in 'switch'-opdracht"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "'break' buiten een lus of 'switch'-opdracht is niet toegestaan"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "'continue' buiten een lus is niet toegestaan"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "'next' wordt gebruikt in %s-actie"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "'nextfile' wordt gebruikt in %s-actie"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "'return' wordt gebruikt buiten functiecontext"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"kale 'print' in BEGIN- of END-regel moet vermoedelijk 'print \"\"' zijn"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "'delete' is niet toegestaan met SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "'delete' is niet toegestaan met FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "'delete(array)' is een niet-overdraagbare 'tawk'-uitbreiding"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "meerfase-tweerichtings-pijplijnen werken niet"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "reguliere expressie rechts van toewijzing"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "reguliere expressie links van operator '~' of '!~'"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "oude 'awk' kent het sleutelwoord 'in' niet, behalve na 'for'"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "reguliere expressie rechts van vergelijking"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "niet-omgeleide 'getline' is ongeldig binnen een '%s'-regel"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "niet-omgeleide 'getline' is ongedefinieerd binnen een END-actie"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "oude 'awk' kent geen meerdimensionale arrays"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "aanroep van 'length' zonder haakjes is niet overdraagbaar"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "indirecte functieaanroepen zijn een gawk-uitbreiding"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"kan speciale variabele '%s' niet voor indirecte functieaanroep gebruiken"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "niet-functie '%s' wordt gebruikt in functie-aanroep"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "ongeldige index-expressie"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "waarschuwing: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fataal: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "onverwacht regeleinde of einde van string"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "kan bronbestand '%s' niet openen om te lezen (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "kan gedeelde bibliotheek '%s' niet openen om te lezen (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "reden onbekend"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "kan '%s' niet invoegen en als programmabestand gebruiken"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "bronbestand '%s' is reeds ingesloten"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "gedeelde bibliotheek '%s' is reeds geladen"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "'@include' is een gawk-uitbreiding"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "lege bestandsnaam na '@include'"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "'@load' is een gawk-uitbreiding"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "lege bestandsnaam na '@load'"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "lege programmatekst op opdrachtregel"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "kan bronbestand '%s' niet lezen (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "bronbestand '%s' is leeg"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "PEBKAC-fout: ongeldig teken '\\%03o' in brontekst"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "bronbestand eindigt niet met een regeleindeteken (LF)"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "onafgesloten reguliere expressie eindigt met '\\' aan bestandseinde"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "%s: %d: regexp-optie '/.../%c' van 'tawk' werkt niet in gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "regexp-optie '/.../%c' van 'tawk' werkt niet in gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "onafgesloten reguliere expressie"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "onafgesloten reguliere expressie aan bestandseinde"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "gebruik van regelvoortzetting '\\ #...' is niet overdraagbaar"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "backslash is niet het laatste teken op de regel"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "meerdimensionale arrays zijn een gawk-uitbreiding"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX staat operator '**=' niet toe"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "oude 'awk' kent de operator '**=' niet"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX staat operator '**' niet toe"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "oude 'awk' kent de operator '**' niet"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "oude 'awk' kent de operator '^=' niet"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "oude 'awk' kent de operator '^' niet"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "onafgesloten string"
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX staat geen nieuweregeltekens toe in tekenreeksen"
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr "een backslash-regelvoortzetting is niet overdraagbaar"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "ongeldig teken '%c' in expressie"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "'%s' is een gawk-uitbreiding"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX staat '%s' niet toe"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "oude 'awk' kent '%s' niet"
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr "'goto' wordt als schadelijk beschouwd!"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d is een ongeldig aantal argumenten voor %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr "%s: een stringwaarde als laatste vervangingsargument heeft geen effect"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "%s: derde parameter is geen veranderbaar object"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: derde argument is een gawk-uitbreiding"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: tweede argument is een gawk-uitbreiding"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "dcgettext(_\"...\") is onjuist: verwijder het liggende streepje"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "dcngettext(_\"...\") is onjuist: verwijder het liggende streepje"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr ""
+"index: een reguliere-expressie-constante als tweede argument is niet "
+"toegestaan"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "functie '%s': parameter '%s' schaduwt een globale variabele"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "kan '%s' niet openen om te schrijven (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "variabelenlijst gaat naar standaardfoutuitvoer"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: sluiten is mislukt (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() twee keer aangeroepen!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "er waren geschaduwde variabelen."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "functienaam '%s' is al eerder gedefinieerd"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "functie '%s': kan functienaam niet als parameternaam gebruiken"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"functie '%s': kan speciale variabele '%s' niet als functieparameter gebruiken"
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "functie '%s': parameter '%s' mag geen naamsruimte bevatten"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "functie '%s': parameter #%d, '%s', dupliceert parameter #%d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "functie '%s' wordt aangeroepen maar is nergens gedefinieerd"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "functie '%s' is gedefinieerd maar wordt nergens direct aangeroepen"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "regexp-constante als parameter #%d levert booleanwaarde op"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"functie '%s' wordt aangeroepen met een spatie tussen naam en '(',\n"
+"of wordt gebruikt als variabele of array"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "deling door nul"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "deling door nul in '%%'"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"kan geen waarde toewijzen aan het resultaat van een post-increment-expressie "
+"van een veld"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "ongeldig doel van toewijzing (opcode %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "'@include' is een gawk-uitbreiding"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s naar \"%s\" is mislukt (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "standaarduitvoer"
+
+#: builtin.c:148
+#, fuzzy
+msgid "standard error"
+msgstr "standaarduitvoer"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: argument is geen getal"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: argument %g ligt buiten toegestane bereik"
+
+#: builtin.c:245
+#, fuzzy, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: kan pijp niet leegmaken: '%s' is geopend om te lezen, niet om te "
+"schrijven"
+
+#: builtin.c:248
+#, fuzzy, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: kan bestand niet leegmaken: '%s' is geopend om te lezen, niet om te "
+"schrijven"
+
+#: builtin.c:259
+#, fuzzy, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr ""
+"fflush: kan bestand niet leegmaken: '%s' is geopend om te lezen, niet om te "
+"schrijven"
+
+#: builtin.c:264
+#, fuzzy, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: kan pijp niet leegmaken: tweewegpijp '%s' heeft de schrijfkant "
+"gesloten"
+
+#: builtin.c:270
+#, fuzzy, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: '%s' is geen open bestand, pijp, of co-proces"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: eerste argument is geen string"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: tweede argument is geen string"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: argument is geen getal"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: argument is een array"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "'length(array)' is een gawk-uitbreiding"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: argument is geen string"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: argument is geen getal"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: argument %g is negatief"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "fataal: 'count$' hoort in alle opmaken gebruikt te worden, of in geen"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "veldbreedte wordt genegeerd voor opmaakaanduiding '%%'"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "veldprecisie wordt genegeerd voor opmaakaanduiding '%%'"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "veldbreedte en -precisie worden genegeerd voor opmaakaanduiding '%%'"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fataal: '$' is niet toegestaan in awk-opmaak"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fataal: het aantal argumenten met '$' moet > 0 zijn"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr "fataal: argumentental %ld is groter dan het gegeven aantal argumenten"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fataal: '$' is niet toegestaan na een punt in de opmaak"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr "fataal: geen '$' opgegeven bij positionele veldbreedte of -precisie"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "'l' is betekenisloos in awk-opmaak; genegeerd"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fataal: 'l' is niet toegestaan in POSIX awk-opmaak"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "'L' is betekenisloos in awk-opmaak; genegeerd"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fataal: 'L' is niet toegestaan in POSIX awk-opmaak"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "'h' is betekenisloos in awk-opmaak; genegeerd"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fataal: 'h' is niet toegestaan in POSIX awk-opmaak"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: waarde %g is te groot voor opmaak %%c"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: waarde %g is geen geldig breed teken"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: waarde %g ligt buiten toegestaan bereik voor opmaak '%%%c'"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: waarde %g ligt buiten toegestaan bereik voor opmaak '%%%c'"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"onbekend opmaakteken '%c' wordt genegeerd: geen argument is geconverteerd"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "fataal: niet genoeg argumenten voor opmaakstring"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "niet genoeg ^ voor deze"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: opmaakaanduiding mist een stuurletter"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "te veel argumenten voor opmaakstring"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: geen argumenten"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: geen argumenten"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr "printf: poging tot schrijven naar gesloten schrijfkant van tweewegpijp"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: argument is geen getal"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: argument %g is negatief"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: lengte %g is niet >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: lengte %g is niet >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: lengte %g is geen integer; wordt afgekapt"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+"substr: lengte %g is te groot voor stringindexering; wordt verkort tot %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: startindex %g is ongeldig; 1 wordt gebruikt"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: startindex %g is geen integer; wordt afgekapt"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: bronstring heeft lengte nul"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: startindex %g ligt voorbij het einde van de string"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: lengte %g bij startindex %g is groter dan de lengte van het eerste "
+"argument (%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime: opmaakwaarde in PROCINFO[\"strftime\"] is numeriek"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: tweede argument is geen getal"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: tweede argument is kleiner dan nul of te groot voor 'time_t'"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: tweede argument ligt buiten toegestaan bereik voor 'time_t'"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: eerste argument is geen string"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: opmaakstring is leeg"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: argument is geen string"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: minstens één van waarden valt buiten het standaardbereik"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "'system'-functie is niet toegestaan in sandbox-modus"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: argument is geen string"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr "print: poging tot schrijven naar gesloten schrijfkant van tweewegpijp"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "verwijzing naar ongeïnitialiseerd veld '$%d'"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: argument is geen string"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: argument is geen string"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: eerste argument is geen getal"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: tweede argument is geen getal"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: argument is geen getal"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: argument is geen getal"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: argument is geen getal"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: derde argument is geen array"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: derde argument is '%.*s'; wordt beschouwd als 1"
+
+# FIXME: ambiguous
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: kan alleen indirect aangeroepen worden met twee argumenten"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "indirecte aanroep van %s vereist minstens twee argumenten"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: eerste argument is geen getal"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: tweede argument is geen getal"
+
+#: builtin.c:3404
+#, fuzzy, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): negatieve waarden geven rare resultaten"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): cijfers na de komma worden afgekapt"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): te grote opschuifwaarden geven rare resultaten"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: eerste argument is geen getal"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: tweede argument is geen getal"
+
+#: builtin.c:3443
+#, fuzzy, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): negatieve waarden geven rare resultaten"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): cijfers na de komma worden afgekapt"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): te grote opschuifwaarden geven rare resultaten"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: aangeroepen met minder dan twee argumenten"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: argument %d is niet-numeriek"
+
+#: builtin.c:3483
+#, fuzzy, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: negatieve waarde %2$g van argument %1$d geeft rare resultaten"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: aangeroepen met minder dan twee argumenten"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: argument %d is niet-numeriek"
+
+#: builtin.c:3515
+#, fuzzy, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: negatieve waarde %2$g van argument %1$d geeft rare resultaten"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: aangeroepen met minder dan twee argumenten"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: argument %d is niet-numeriek"
+
+#: builtin.c:3547
+#, fuzzy, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: negatieve waarde %2$g van argument %1$d geeft rare resultaten"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: argument is geen getal"
+
+#: builtin.c:3577
+#, fuzzy, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): negatieve waarden geven rare resultaten"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): cijfers na de komma worden afgekapt"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: '%s' is geen geldige taalregio-deelcategorie"
+
+#: builtin.c:3988 mpfr.c:1203
+#, fuzzy
+msgid "intdiv: third argument is not an array"
+msgstr "match: derde argument is geen array"
+
+#: builtin.c:3996 mpfr.c:1211
+#, fuzzy
+msgid "intdiv: received non-numeric first argument"
+msgstr "and: eerste argument is geen getal"
+
+#: builtin.c:3998 mpfr.c:1213
+#, fuzzy
+msgid "intdiv: received non-numeric second argument"
+msgstr "and: tweede argument is geen getal"
+
+#: builtin.c:4007 mpfr.c:1252
+#, fuzzy
+msgid "intdiv: division by zero attempted"
+msgstr "deling door nul"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: tweede argument is geen array"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+
+#: builtin.c:4101
+#, fuzzy, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "option: ongeldige parameter -- \"%s\""
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr ""
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Typ (g)awk statement(s).  Eindig met het commando \"end\".\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "ongeldig framenummer: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: ongeldige optie -- \"%s\""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\": is reeds ingelezen."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": commando niet toegestaan."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+"Kan commando 'commands' niet voor breekpunt-/kijkpunt-commando's gebruiken"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "er is nog geen breekpunt/kijkpunt gezet"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "ongeldig nummer van breekpunt/kijkpunt"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Typ de commando's voor wanneer %s %d getroffen wordt, één per regel.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Eindig met het commando 'end'.\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "'end' is alleen geldig bij de commando's 'commands' en 'eval'"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "'silent' is alleen geldig bij het commando 'commands'"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: ongeldige optie -- \"%s\""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: ongeldig nummer van breekpunt/kijkpunt"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "argument is geen string"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: ongeldige parameter -- \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "functie \"%s\" bestaat niet"
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: ongeldige optie -- \"%s\""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "ongeldig bereik: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "niet-numerieke waarde voor veldnummer"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "niet-numerieke waarde gevonden, numerieke wordt verwacht"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "niet-nul geheel getal"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - een trace weergeven van alle of N binnenste frames (of "
+"buitenste als N < 0)"
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[BESTANDSNAAM:]REGELNUMMER|FUNCTIE] - breekpunt zetten op gegeven "
+"positie"
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+"clear [[BESTANDSNAAM:]REGELNUMMER|FUNCTIE] - eerder gezet breekpunt "
+"verwijderen"
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [NUMMER] - een lijst van commando's beginnen die uitgevoerd moeten "
+"worden wanneer een breekpunt/kijkpunt getroffen wordt"
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition NUMMER [EXPRESSIE] - de conditie van een breekpunt/kijkpunt zetten "
+"of wissen"
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [AANTAL] - doorgaan met het programma in de debugger"
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr "delete [BREEKPUNTEN] [BEREIK] - de gegeven breekpunten verwijderen"
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr "disable [BREEKPUNTEN] [BEREIK] - de gegeven breekpunten uitschakelen"
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+"display [VAR] - waarde van variabele weergeven elke keer dat het programma "
+"stopt"
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [AANTAL] - dit aantal frames naar beneden in de stack gaan"
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+"dump [BESTANDSNAAM] - instructies dumpen op standaarduitvoer (of naar "
+"bestand)"
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [BREEKPUNTEN] [BEREIK] - de gegeven breekpunten inschakelen"
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - een lijst van commando's of awk-statements beëindigen"
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval STATEMENT|[p1, p2, ...] - awk-statement(s) evalueren"
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (hetzelfde als 'quit') de debugger verlaten"
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - uitvoeren totdat het geselecteerde stack-frame terugkeert"
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [NUMMER] - stack-frame met dit nummer selecteren en weergeven"
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+"help [COMMANDO] - lijst van beschikbare commando's (of uitleg van commando) "
+"tonen"
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+"ignore NUMMER AANTAL - het aantal keren dat dit breekpuntnummer genegeerd "
+"moet worden"
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info THEMA - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch"
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[BESTANDSNAAM:]REGELNUMMER|FUNCTIE|BEREIK] - aangegeven regels "
+"tonen"
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+"next [AANTAL] - programma uitvoeren tot de volgende bronregel bereikt is"
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [AANTAL] - één instructie (of dit aantal) uitvoeren, waarbij een "
+"functie-aanroep als één telt"
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [NAAM[=WAARDE]] - opties van debugger tonen of instellen"
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print VAR [VAR] - waarde van variabele of array weergeven"
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf OPMAAK [, ARGUMENT...] - opgemaakte uitvoer"
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - de debugger verlaten"
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr "return [WAARDE] - gekozen stack-frame terug laten keren naar aanroeper"
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - programma starten of herstarten"
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save BESTANDSNAAM - commando's van de sessie opslaan in bestand"
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set VAR = WAARDE - een waarde aan een scalaire variabele toekennen"
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - de gewone meldingen bij het stoppen bij een breekpunt/kijkpunt "
+"onderdrukken"
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source BESTANDSNAAM - commando's uit dit bestand uitvoeren"
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [AANTAL] - programma uitvoeren tot een andere bronregel bereikt is"
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [AANTAL] - precies één (of dit aantal) instructies uitvoeren"
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr ""
+"tbreak [[BESTANDSNAAM:]REGELNUMMER|FUNCTIE] - een tijdelijk breekpunt zetten"
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - instructie weergeven alvorens deze uit te voeren"
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+"undisplay [AANTAL] - variabele(n) van automatische weergavelijst verwijderen"
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[BESTANDSNAAM:]N|FUNCTIE] - programma uitvoeren totdat deze een "
+"andere regel bereikt of regel N binnen het huidige frame"
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [AANTAL] - variabele(n) van de kijklijst verwijderen"
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [AANTAL] - dit aantal frames naar boven in de stack gaan"
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch VAR - een kijkpunt voor een variabele zetten"
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where[N] - (zelfde als backtrace) een trace weergeven van alle of N "
+"binnenste frames (of buitenste als N < 0)"
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "fout: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "kan commando niet lezen (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "kan commando niet lezen (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "ongeldig teken in commando"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "onbekend commando - \"%.*s\", probeer help"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "ongeldig teken"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "ongedefinieerd commando: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr "zetten of tonen van maximum aantal regels in geschiedenisbestand"
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "zetten of tonen van venstergrootte van list-commando"
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "zetten of tonen van gawk-uitvoerbestand"
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "zetten of tonen van debugger-prompt"
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr "zetten of tonen van opslaan van commandogeschiedenis (waarde=on|off)"
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "zetten of tonen van opslaan van opties (waarde=on|off)"
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "zetten of tonen van instructie-tracing (waarde=on|off)"
+
+#: debug.c:358
+msgid "program not running."
+msgstr "programma draait niet."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "kan bronbestand '%s' niet lezen (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "bronbestand '%s' is leeg\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "geen huidig bronbestand"
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "kan geen bronbestand met naam '%s' vinden (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+"Waarschuwing: bronbestand '%s' is gewijzigd sinds programmacompilatie.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "regelnummer %d valt buiten bereik;  '%s' heeft %d regels"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "onverwacht einde-van-bestand tijdens lezen van bestand '%s', regel %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "bronbestand '%s' is gewijzigd sinds start van programma-uitvoering"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Huidig bronbestand: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Aantal regels: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Bronbestand (regels): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Nummer  Toon  Actief   Locatie\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\taantal treffers = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tvolgende %ld treffer(s) negeren\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tstopconditie: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tcommando's:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Huidig frame: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Aangeroepen door frame: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Aanroeper van frame: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Geen in main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Geen argumenten.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Geen lokalen.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Alle gedefinieerde variabelen:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Alle gedefinieerde functies:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Automatisch weer te geven variabelen:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Kijkvariabelen:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "geen symbool '%s' in huidige context\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "'%s' is geen array\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = ongeïnitialiseerd veld\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "array '%s' is leeg\n"
+
+#: debug.c:1132 debug.c:1184
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%s\"] niet in array '%s'\n"
+
+#: debug.c:1188
+#, fuzzy, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "'%s[\"%s\"]' is geen array\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "'%s' is geen scalaire variabele"
+
+#: debug.c:1272 debug.c:5133
+#, fuzzy, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "array '%s[\"%s\"]' wordt gebruikt in een scalaire context"
+
+#: debug.c:1295 debug.c:5144
+#, fuzzy, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "scalair '%s[\"%s\"]' wordt gebruikt als array"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "'%s' is een functie"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "kijkpunt %d is zonder conditie\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "Er is geen weergave-item met nummer %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Er is geen kijk-item met nummer %ld"
+
+#: debug.c:1543
+#, fuzzy, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%s\"] niet in array '%s'\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "scalaire waarde wordt gebruikt als array"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr "Kijkpunt %d is verwijderd omdat parameter buiten bereik is.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "Weergave %d is verwijderd omdat parameter buiten bereik is.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " in bestand '%s', regel %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " op '%s':%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tin "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Er volgen meer stack-frames...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "ongeldig framenummer"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Opmerking: breekpunt %d (ingeschakeld, volgende %ld passages genegeerd), ook "
+"gezet op %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Opmerking: breekpunt %d (ingeschakeld), ook gezet op %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Opmerking: breekpunt %d (uitgeschakeld, volgende %ld passages genegeerd), "
+"ook gezet op %s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Opmerking: breekpunt %d (uitgeschakeld), ook gezet op %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Breekpunt %d is gezet in bestand '%s', op regel %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "Kan geen breekpunt zetten in bestand '%s'\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "regelnummer %d in bestand '%s' valt buiten bereik"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Kan regel niet vinden!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "Kan geen breekpunt zetten op '%s':%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Kan geen breekpunt zetten in functie '%s'\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "breekpunt %d (gezet in bestand '%s', op regel %d) is onconditioneel\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Breekpunt %d is verwijderd"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "Geen breekpunt(en) bij binnengaan van functie '%s'\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Geen breekpunt in bestand '%s', op regel #%d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "ongeldig breekpuntnummer"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Alle breekpunten verwijderen? (j of n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "j"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Zal de volgende %ld passage(s) van breekpunt %d negeren.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "Zal de volgende keer dat breekpunt %d wordt bereikt stoppen.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "Kan alleen programma's debuggen die met optie '-f' gegeven zijn.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Herstarten van debugger is mislukt"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Programma draait al. Herstarten vanaf begin (j/n)? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Programma is niet herstart\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "fout: kan niet herstarten; operatie is niet toegestaan\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr ""
+"fout(%s): kan niet herstarten; de resterende commando's worden genegeerd\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Starten van programma: \n"
+
+#: debug.c:2977
+#, fuzzy, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Programma verliet %s met afsluitwaarde %d\n"
+
+#: debug.c:2978
+#, fuzzy, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Programma verliet %s met afsluitwaarde %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "Het programma draait. Toch afsluiten (j/n)? "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Niet gestopt op een breekpunt; argument is genegeerd.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "ongeldig breekpuntnummer %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Zal de volgende %ld passages van breekpunt %d negeren.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "'finish' is niet zinvol in het buitenste frame van main()\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Draaien tot terugkeer uit "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "'return' is niet zinvol in het buitenste frame van main()\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "Kan gegeven locatie in functie '%s' niet vinden\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "ongeldige bronregel %d in bestand '%s'"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "Kan gegeven locatie %d in bestand '%s' niet vinden\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "element niet in array\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "ongetypeerde variabele\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Stoppend in %s...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "'finish' is niet zinvol met een niet-lokale sprong '%s'\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "'until' is niet zinvol met een niet-lokale sprong '%s'\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr ""
+"\t------[Enter] om verder te gaan, of [q] [Enter] om af te sluiten------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%s\"] niet in array '%s'"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "uitvoer wordt naar standaarduitvoer gestuurd\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "ongeldig nummer"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "'%s' is niet toegestaan in huidige context; statement is genegeerd"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "'return' is niet toegestaan in huidige context; statement is genegeerd"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Geen symbool '%s' in huidige context"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "onbekend knooptype %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "onbekende opcode %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "opcode %s is geen operator noch sleutelwoord"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "bufferoverloop in genflags2str()"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Functieaanroepen-stack:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "'IGNORECASE' is een gawk-uitbreiding"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "'BINMODE' is een gawk-uitbreiding"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "BINMODE-waarde '%s' is ongeldig, wordt behandeld als 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "onjuiste opgave van '%sFMT': '%s'"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "'--lint' wordt uitgeschakeld wegens toewijzing aan 'LINT'"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "verwijzing naar ongeïnitialiseerd argument '%s'"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "verwijzing naar ongeïnitialiseerde variabele '%s'"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "veldverwijzingspoging via een waarde die geen getal is"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "veldverwijzingspoging via een lege string"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "toegangspoging tot veld %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "verwijzing naar ongeïnitialiseerd veld '$%ld'"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "functie '%s' aangeroepen met meer argumenten dan gedeclareerd"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack(): onverwacht type '%s'"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "deling door nul in '/='"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "deling door nul in '%%='"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "uitbreidingen zijn niet toegestaan in sandbox-modus"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / '@load' zijn gawk-uitbreidingen"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: lege bibliotheeknaam ontvangen"
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: kan bibliotheek '%s' niet openen (%s)\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: bibliotheek '%s' definieert 'plugin_is_GPL_compatible' niet (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: bibliotheek '%s' kan functie '%s' niet aanroepen (%s)\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: bibliotheek '%s': initialisatiefunctie '%s' is mislukt\n"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: ontbrekende functienaam"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: kan in gawk ingebouwde '%s' niet als functienaam gebruiken"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: kan in gawk ingebouwde '%s' niet als functienaam gebruiken"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: kan functie '%s' niet herdefiniëren"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: functie '%s' is al gedefinieerd"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: functienaam '%s' is al eerder gedefinieerd"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: negatief aantal argumenten voor functie '%s'"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr "functie '%s': argument #%d: een scalair wordt gebruikt als array"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "functie '%s': argument #%d: een array wordt gebruikt als scalair"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "het dynamisch laden van de bibliotheek wordt niet ondersteund"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: kan symbolische koppeling '%s' niet lezen"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: onjuiste parameters"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts-initialisatie: kan variabele %s niet aanmaken"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "'fts' wordt op dit systeem niet ondersteund"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: kan array niet aanmaken"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: kan element niet instellen"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: kan element niet instellen"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: kan element niet instellen"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-verwerking: kan array niet aanmaken"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-verwerking: kan element niet instellen"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr ""
+"fts: aangeroepen met onjuist aantal argumenten; drie worden er verwacht"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: onjuiste eerste parameter"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: onjuiste tweede parameter"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: onjuiste derde parameter"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: kan array niet pletten\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: listige FTS_NOSTAT-vlag wordt genegeerd -- lekker puh :)"
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() is mislukt\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: kan eerste argument niet verkrijgen"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: kan tweede argument niet verkrijgen"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: kan derde argument niet verkrijgen"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "'fnmatch' is niet geïmplementeerd op dit systeem\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch()-initialisatie: kan de variabele FNM_NOMATCH niet toevoegen"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch()-initialisatie: kan array-element %s niet instellen"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch()-initialisatie: kan array FNM niet installeren"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO is geen array!"
+
+#: extension/inplace.c:131
+#, fuzzy
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace_begin(): in-situ-bewerken is al actief"
+
+#: extension/inplace.c:134
+#, fuzzy, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace_begin(): verwachtte twee argumenten maar is aangeroepen met %d"
+
+#: extension/inplace.c:137
+#, fuzzy
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace_begin(): kan eerste argument niet als bestandsnaamstring oppakken"
+
+#: extension/inplace.c:145
+#, fuzzy, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace_begin(): in-situ-bewerken wordt uitgeschakeld voor ongeldige "
+"bestandsnaam '%s'"
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace_begin(): Kan status van '%s' niet bepalen (%s)"
+
+#: extension/inplace.c:159
+#, fuzzy, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace_begin(): '%s' is geen normaal bestand"
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace_begin(): mkstemp('%s') is mislukt (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace_begin(): chmod is mislukt (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace_begin(): dup(stdout) is mislukt (%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_begin(): dup2(%d, stdout) is mislukt (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace_begin(): close(%d) is mislukt (%s)"
+
+#: extension/inplace.c:211
+#, fuzzy, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace_begin(): verwachtte twee argumenten maar is aangeroepen met %d"
+
+#: extension/inplace.c:214
+#, fuzzy
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace_end(): kan eerste argument niet als bestandsnaamstring oppakken"
+
+#: extension/inplace.c:221
+#, fuzzy
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace_end(): in-situ-bewerken is niet actief"
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_end(): dup2(%d, stdout) is mislukt (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace_end(): close(%d) is mislukt (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace_end(): fsetpos(stdout) is mislukt (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace_end(): link('%s', '%s') is mislukt (%s)"
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace_end(): rename('%s', '%s') is mislukt (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: aangeroepen met onjuiste argumenten"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: aangeroepen met onjuiste argumenten"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of(): opendir()/fdopendir() is mislukt: %s"
+
+#: extension/readfile.c:131
+#, fuzzy
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: aangeroepen zonder argumenten"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: kan variabele REVOUT niet initialiseren"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: argument 0 is geen string\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: argument 1 is geen array\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: kan array niet pletten\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: kan geplet array niet vrijgeven\n"
+
+#: extension/rwarray.c:255
+#, fuzzy, c-format
+msgid "array value has unknown type %d"
+msgstr "onbekend knooptype %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: argument 0 is geen string\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: argument 1 is geen array\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array() is mislukt\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element() is mislukt\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: wordt op dit platform niet ondersteund"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: vereist numeriek argument ontbreekt"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: argument is negatief"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: wordt op dit platform niet ondersteund"
+
+#: field.c:284
+msgid "input record too large"
+msgstr ""
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF is op een negatieve waarde gezet"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: vierde argument is een gawk-uitbreiding"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: vierde argument is geen array"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: tweede argument is geen array"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split: hetzelfde array kan niet zowel als tweede als als vierde argument "
+"gebruikt worden"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: een subarray van het tweede argument kan niet als vierde argument "
+"gebruikt worden"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: een subarray van het vierde argument kan niet als tweede argument "
+"gebruikt worden"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: lege string als derde argument is een gawk-uitbreiding"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: vierde argument is geen array"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: tweede argument is geen array"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: derde argument moet niet-nil zijn"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: hetzelfde array kan niet zowel als tweede als als vierde argument "
+"gebruikt worden"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: een subarray van het tweede argument kan niet als vierde argument "
+"gebruikt worden"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: een subarray van het vierde argument kan niet als tweede argument "
+"gebruikt worden"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "'FIELDWIDTHS' is een gawk-uitbreiding"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr ""
+
+#: field.c:1239
+#, fuzzy, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "ongeldige waarde voor FIELDWIDTHS, nabij '%s'"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "een lege string als 'FS' is een gawk-uitbreiding"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "oude 'awk' staat geen reguliere expressies toe als waarde van 'FS'"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "'FPAT' is een gawk-uitbreiding"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node(): lege returnwaarde ontvangen"
+
+#: gawkapi.c:178 gawkapi.c:189
+#, fuzzy
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node(): lege returnwaarde ontvangen"
+
+#: gawkapi.c:183 gawkapi.c:194
+#, fuzzy
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node(): lege returnwaarde ontvangen"
+
+#: gawkapi.c:198
+#, fuzzy, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node(): lege returnwaarde ontvangen"
+
+#: gawkapi.c:385
+#, fuzzy
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "load_ext: lege bibliotheeknaam ontvangen"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value(): lege knoop ontvangen"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value(): lege waarde ontvangen"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element(): leeg array ontvangen"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element(): lege index ontvangen"
+
+#: gawkapi.c:1217
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array(): kan index %d niet converteren\n"
+
+#: gawkapi.c:1222
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array(): kan waarde %d niet converteren\n"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:1365
+#, fuzzy
+msgid "cannot find end of BEGINFILE rule"
+msgstr "'next' kan niet aangeroepen worden in een BEGIN-regel"
+
+#: gawkapi.c:1419
+#, fuzzy, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "kan bronbestand '%s' niet openen om te lezen (%s)"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "opdrachtregelargument '%s' is een map -- overgeslagen"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "kan bestand '%s' niet openen om te lezen (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "sluiten van bestandsdescriptor %d ('%s') is mislukt (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "omleiding is niet toegestaan in sandbox-modus"
+
+#: io.c:787
+#, fuzzy, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "expressie in omleiding '%s' heeft alleen een getal als waarde"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "expressie voor omleiding '%s' heeft een lege string als waarde"
+
+#: io.c:796
+#, fuzzy, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"bestandsnaam '%s' voor omleiding '%s' kan het resultaat zijn van een "
+"logische expressie"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "onnodige mix van '>' en '>>' voor bestand '%.*s'"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr ""
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "kan pijp '%s' niet openen voor uitvoer (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "kan pijp '%s' niet openen voor invoer (%s)"
+
+#: io.c:950
+#, fuzzy, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr "gettimeofday: wordt op dit platform niet ondersteund"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "kan tweerichtings-pijp '%s' niet openen voor in- en uitvoer (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "kan niet omleiden van '%s' (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "kan niet omleiden naar '%s' (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"systeemgrens voor aantal open bestanden is bereikt: begonnen met multiplexen"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "sluiten van '%s' is mislukt (%s)"
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "te veel pijpen of invoerbestanden geopend"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: tweede argument moet 'to' of 'from' zijn"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: '%.*s' is geen open bestand, pijp, of co-proces"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "sluiten van een nooit-geopende omleiding"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: omleiding '%s' is niet geopend met '|&'; tweede argument wordt "
+"genegeerd"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "afsluitwaarde %d bij mislukte sluiting van pijp '%s' (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "afsluitwaarde %d bij mislukte sluiting van bestand '%s' (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "geen expliciete sluiting van socket '%s' aangegeven"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "geen expliciete sluiting van co-proces '%s' aangegeven"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "geen expliciete sluiting van pijp '%s' aangegeven"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "geen expliciete sluiting van bestand '%s' aangegeven"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr ""
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr ""
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "fout tijdens schrijven van standaarduitvoer (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "fout tijdens schrijven van standaardfoutuitvoer (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "leegmaken van pijp '%s' is mislukt (%s)"
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "leegmaken door co-proces van pijp naar '%s' is mislukt (%s)"
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "leegmaken van bestand '%s' is mislukt (%s)"
+
+#: io.c:1610
+#, fuzzy, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "lokale poort %s is ongeldig in '/inet'"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "lokale poort %s is ongeldig in '/inet'"
+
+#: io.c:1636
+#, fuzzy, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "host- en poortinformatie (%s, %s) zijn ongeldig"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "host- en poortinformatie (%s, %s) zijn ongeldig"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "TCP/IP-communicatie wordt niet ondersteund"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "kan '%s' niet openen -- modus '%s'"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "kan meester-pty van dochterproces niet sluiten (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "kan standaarduitvoer van dochterproces niet sluiten (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"kan slaaf-pty niet overzetten naar standaarduitvoer van dochterproces (dup: "
+"%s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "kan standaardinvoer van dochterproces niet sluiten (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"kan slaaf-pty niet overzetten naar standaardinvoer van dochterproces (dup: "
+"%s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "kan slaaf-pty niet sluiten (%s)"
+
+#: io.c:2265
+#, fuzzy
+msgid "could not create child process or open pty"
+msgstr "kan voor '%s' geen dochterproces starten (fork: %s)"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+"kan pijp niet overzetten naar standaarduitvoer van dochterproces (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+"kan pijp niet overzetten naar standaardinvoer van dochterproces (dup: %s)"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr "kan standaarduitvoer van ouderproces niet herstellen\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr "kan standaardinvoer van ouderproces niet herstellen\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "kan pijp niet sluiten (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "'|&' wordt niet ondersteund"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "kan pijp '%s' niet openen (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "kan voor '%s' geen dochterproces starten (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr "getline: poging tot lezen uit gesloten leeskant van tweewegpijp"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser(): NULL-pointer gekregen"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr "invoer-parser '%s' botst met eerder geïnstalleerde invoer-parser '%s'"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "invoer-parser '%s' kan '%s' niet openen"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper(): NULL-pointer gekregen"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"uitvoer-wrapper '%s' botst met eerder geïnstalleerde uitvoer-wrapper '%s'"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "uitvoer-wrapper '%s' kan '%s' niet openen"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor(): NULL-pointer gekregen"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"tweeweg-processor '%s' botst met eerder geïnstalleerde tweeweg-processor '%s'"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "tweeweg-processor '%s' kan '%s' niet openen"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "databestand '%s' is leeg"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "kan geen extra invoergeheugen meer toewijzen"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "een 'RS' van meerdere tekens is een gawk-uitbreiding"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "IPv6-communicatie wordt niet ondersteund"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr "omgevingsvariabele 'POSIXLY_CORRECT' is gezet: '--posix' ingeschakeld"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "'--posix' overstijgt '--traditional'"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "'--posix'/'--traditional' overstijgen '--non-decimal-data'"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "'--posix' overstijgt '--characters-as-bytes'"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "het uitvoeren van %s als 'setuid root' kan een veiligheidsrisico zijn"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "kan standaardinvoer niet in binaire modus zetten (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "kan standaarduitvoer niet in binaire modus zetten (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "kan standaardfoutuitvoer niet in binaire modus zetten (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "helemaal geen programmatekst!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr "Gebruik:  %s [opties] -f programmabestand [--]  bestand...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+"     of:  %s [opties] [--] %cprogrammatekst%c  bestand...\n"
+"\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "\tPOSIX-opties:\t\tEquivalente GNU-opties: (standaard)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f programmabestand\t--file=programmabestand\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F veldscheidingsteken\t--field-separator=veldscheidingsteken\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr ""
+"\t-v var=waarde\t\t--assign=var=waarde\n"
+"\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "\tKorte opties:\t\tEquivalente GNU-opties: (uitbreidingen)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[bestand]\t\t--dump-variables[=bestand]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[bestand]\t\t--debug[=bestand]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'programmatekst'\t--source='programmatekst'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E bestand\t\t--exec=bestand\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i include-bestand\t\t--include=include-bestand\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l bibliotheek\t\t--load=bibliotheek\n"
+
+# FIXME: are arguments literal or translatable?
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[bestand]\t\t--pretty-print[=bestand]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[bestand]\t\t--profile[=bestand]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+#, fuzzy
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t\t--nostalgia\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"'gawk' is een patroonherkennings- en bewerkingsprogramma.\n"
+"Standaard leest het van standaardinvoer en schrijft naar standaarduitvoer.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Voorbeelden:\n"
+"\tgawk '{ som += $1 }; END { print som }' bestand\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Dit programma is vrije software; u mag het verder verspreiden en/of\n"
+"wijzigen onder de voorwaarden van de GNU General Public License zoals\n"
+"uitgegeven door de Free Software Foundation, naar keuze ofwel onder\n"
+"versie 3 of onder een nieuwere versie van die licentie.\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Dit programma wordt uitgegeven in de hoop dat het nuttig is,\n"
+"maar ZONDER ENIGE GARANTIE; zelfs zonder de impliciete garantie\n"
+"van VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD DOEL.\n"
+"Zie de GNU General Public License voor meer details.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Bij dit programma hoort u een kopie van de GNU General Public License\n"
+"ontvangen te hebben; is dit niet het geval, dan kunt u deze licentie\n"
+"ook vinden op http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft maakt van FS geen tab in POSIX-awk"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: argument '%s' van '-v' is niet van de vorm 'var=waarde'\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "'%s' is geen geldige variabelenaam"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "'%s' is geen variabelenaam; zoekend naar bestand '%s=%s'"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "kan in gawk ingebouwde '%s' niet als variabelenaam gebruiken"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "kan functie '%s' niet als variabelenaam gebruiken"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "drijvendekomma-berekeningsfout"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "fatale fout: **interne fout**"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "fatale fout: **interne fout**: segmentatiefout"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "fatale fout: **interne fout**: stack is vol"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "geen reeds-geopende bestandsdescriptor %d"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "kan /dev/null niet openen voor bestandsdescriptor %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "argument van '-e/--source' is leeg; genegeerd"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "'--posix' overstijgt '--traditional'"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr ""
+"optie '-M' is genegeerd; ondersteuning voor MPFR/GMP is niet meegecompileerd"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: optie '-W %s' is onbekend; genegeerd\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: optie vereist een argument -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "PREC-waarde '%.*s' is ongeldig"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "RNDMODE-waarde '%.*s' is ongeldig"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: niet-numeriek argument ontvangen"
+
+#: mpfr.c:816
+#, fuzzy
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): negatieve waarden geven rare resultaten"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg): cijfers na de komma worden afgekapt"
+
+#: mpfr.c:832
+#, fuzzy, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): negatieve waarden geven rare resultaten"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: niet-numeriek argument #%d ontvangen"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: argument #%d heeft ongeldige waarde %Rg;  0 wordt gebruikt"
+
+#: mpfr.c:871
+#, fuzzy
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: negatieve waarde %2$Rg van argument #%1$d geeft rare resultaten"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr ""
+"%s: cijfers na de komma van waarde %2$Rg van argument #%1$d worden afgekapt"
+
+#: mpfr.c:892
+#, fuzzy, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%1$s: negatieve waarde %3$Zd van argument #%2$d geeft rare resultaten"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "commandoregel:"
+
+#: node.c:481
+#, fuzzy
+msgid "could not make typed regex"
+msgstr "onafgesloten reguliere expressie"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "oude 'awk' kent de stuurcodereeks '\\%c' niet"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX staat stuurcode '\\x' niet toe"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "geen hex cijfers in stuurcodereeks '\\x'"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"hexadecimale stuurcode \\x%.*s van %d tekens wordt waarschijnlijk niet "
+"afgehandeld zoals u verwacht"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "stuurcodereeks '\\%c' behandeld als normale '%c'"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Ongeldige multibyte-gegevens gevonden.\n"
+"Uw gegevens passen vermoedelijk niet bij uw taalregio."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr ""
+"%s %s '%s': kan bestandsdescriptorvlaggen niet verkrijgen: (fcntl F_GETFD: "
+"%s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s '%s': kan 'close-on-exec' niet activeren: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "kan '%s' niet openen om te schrijven: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "profiel gaat naar standaardfoutuitvoer"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s regel(s)\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regel(s)\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "**interne fout**: %s met lege 'vname'"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "**interne fout**: ingebouwde functie met lege 'fname'"
+
+#: profile.c:1302
+#, fuzzy, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"\t# Geladen uitbreidingen ('-l' en/of '@load')\n"
+"\n"
+
+#: profile.c:1333
+#, fuzzy, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\t# Geladen uitbreidingen ('-l' en/of '@load')\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# gawk-profiel, gemaakt op %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Functies, alfabetisch geordend\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str(): onbekend omleidingstype %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "stuurcodereeks '\\%c' behandeld als normale '%c'"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr ""
+"component '%.*s' van reguliere expressie moet vermoedelijk '[%.*s]' zijn"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "ongepaarde ["
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "ongeldige tekenklasse"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "syntax van tekenklasse is [[:space:]], niet [:space:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "onafgemaakte \\-stuurcode"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "ongeldige inhoud van \\{\\}"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "reguliere expressie is te groot"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "ongepaarde ("
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "geen syntax opgegeven"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr "ongepaarde )"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: optie '%s' is niet eenduidig; mogelijkheden zijn:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: optie '--%s' staat geen argument toe\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: optie '%c%s' staat geen argument toe\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: optie '--%s' vereist een argument\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: onbekende optie '--%s'\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: onbekende optie '%c%s'\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ongeldige optie -- '%c'\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: optie vereist een argument -- '%c'\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: optie '-W %s' is niet eenduidig\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: optie '-W %s' staat geen argument toe\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: optie '-W %s' vereist een argument\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Gelukt"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Geen overeenkomsten"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ongeldige reguliere expressie"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ongeldig samengesteld teken"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ongeldige tekenklassenaam"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Backslash aan het eind"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Ongeldige terugverwijzing"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Ongepaarde [, [^, [:, [., of [="
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Ongepaarde ( of \\("
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Ongepaarde \\{"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ongeldige inhoud van \\{\\}"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ongeldig bereikeinde"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Onvoldoende geheugen beschikbaar"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Ongeldige voorafgaande reguliere expressie"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Voortijdig einde van reguliere expressie"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Reguliere expressie is te groot"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Ongepaarde ) of \\)"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Geen eerdere reguliere expressie"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "functie '%s': kan functie '%s' niet als parameternaam gebruiken"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "kan hoofdcontext niet poppen"
+
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: derde argument is %g; wordt beschouwd als 1"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "'extension' is een gawk-uitbreiding"
+
+#~ msgid "extension: received NULL lib_name"
+#~ msgstr "uitbreiding: lege bibliotheeknaam ontvangen"
+
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "extension: kan bibliotheek '%s' niet openen (%s)"
+
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr ""
+#~ "extension: bibliotheek '%s' definieert 'plugin_is_GPL_compatible' niet "
+#~ "(%s)"
+
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr "extension: bibliotheek '%s' kan functie '%s' niet aanroepen (%s)"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension: ontbrekende functienaam"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: ongeldig teken '%c' in functienaam '%s'"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: kan functie '%s' niet herdefiniëren"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: functie '%s' is al gedefinieerd"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension: functienaam '%s' is al eerder gedefinieerd"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr ""
+#~ "extension: kan in gawk ingebouwde '%s' niet als functienaam gebruiken"
+
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr ""
+#~ "chdir: aangeroepen met onjuist aantal argumenten; één wordt er verwacht"
+
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "stat: aangeroepen met onjuist aantal argumenten"
+
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "statvfs: aangeroepen met onjuist aantal argumenten"
+
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "fnmatch: aangeroepen met minder dan drie argumenten"
+
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "fnmatch: aangeroepen met meer dan drie argumenten"
+
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "fork: aangeroepen met te veel argumenten"
+
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "waitpid: aangeroepen met te veel argumenten"
+
+#~ msgid "wait: called with no arguments"
+#~ msgstr "wait: aangeroepen zonder argumenten"
+
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "wait: aangeroepen met te veel argumenten"
+
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "ord: aangeroepen met te veel argumenten"
+
+#~ msgid "ord: called with no arguments"
+#~ msgstr "ord: aangeroepen zonder argumenten"
+
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "chr: aangeroepen met te veel argumenten"
+
+#~ msgid "chr: called with no arguments"
+#~ msgstr "chr: aangeroepen zonder argumenten"
+
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "readfile: aangeroepen met te veel argumenten"
+
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "writea: aangeroepen met te veel argumenten"
+
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "reada: aangeroepen met te veel argumenten"
+
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "gettimeofday: argumenten worden genegeerd"
+
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sleep: aangeroepen met te veel argumenten"
+
+#~ msgid ""
+#~ "\n"
+#~ "To report bugs, see node `Bugs' in `gawk.info', which is\n"
+#~ "section `Reporting Problems and Bugs' in the printed version.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Voor het rapporteren van programmagebreken, zie 'info gawk bugs'\n"
+#~ "of de sectie 'Reporting Problems and Bugs' in de gedrukte versie.\n"
+#~ "Meld fouten in de vertaling aan <vertaling@vrijschrift.org>.\n"
+#~ "\n"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "onbekende waarde voor veldspecificatie: %d\n"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "backslash aan het einde van de string"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr ""
+#~ "functie '%s' is gedefinieerd om niet meer dan %d argument(en) te "
+#~ "accepteren"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "functie '%s': ontbrekend argument #%d"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "'getline var' is ongeldig binnen een '%s'-regel"
+
+#~ msgid "`getline' invalid inside `%s' rule"
+#~ msgstr "'getline' is ongeldig binnen een '%s'-regel"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr "geen (bekend) protocol aangegeven in speciale bestandsnaam '%s'"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "speciale bestandsnaam '%s' is onvolledig"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "'/inet' heeft een gindse hostnaam nodig"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "'/inet' heeft een gindse poort nodig"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# %s-blok(ken)\n"
+#~ "\n"
+
+#~ msgid "range of the form `[%c-%c]' is locale dependent"
+#~ msgstr ""
+#~ "de betekenis van een bereik van de vorm '[%c-%c]' is afhankelijk van de "
+#~ "taalregio"
+
+#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'"
+#~ msgstr "verwijzing naar ongeïnitialiseerd element '%s[\"%.*s\"]'"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "index van array '%s' is lege string"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: leeg (nil)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: leeg (nul)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: tabelgrootte = %d, arraygrootte = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: array-verwijzing naar %s\n"
+
+#~ msgid "`nextfile' is a gawk extension"
+#~ msgstr "'nextfile' is een gawk-uitbreiding"
+
+#~ msgid "`delete array' is a gawk extension"
+#~ msgstr "'delete array' is een gawk-uitbreiding"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "non-array wordt gebruikt als array"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "'%s' is een uitbreiding door Bell Labs"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: eerste argument is geen getal"
+
+#~ msgid "or: received non-numeric second argument"
+#~ msgstr "or: tweede argument is geen getal"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): negatieve waarden geven rare resultaten"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): cijfers na de komma worden afgekapt"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: eerste argument is geen getal"
+
+#~ msgid "xor: received non-numeric second argument"
+#~ msgstr "xor: tweede argument is geen getal"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): cijfers na de komma worden afgekapt"
+
+#~ msgid "can't use function name `%s' as variable or array"
+#~ msgstr "kan functienaam '%s' niet als variabele of array gebruiken"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "toewijzing wordt gebruikt in een conditionele context"
+
+#~ msgid "statement has no effect"
+#~ msgstr "opdracht heeft geen effect"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr ""
+#~ "for: array '%s' veranderde van grootte %ld naar %ld tijdens uitvoer van "
+#~ "de lus"
+
+#~ msgid "function called indirectly through `%s' does not exist"
+#~ msgstr "indirect (via '%s') aangeroepen functie bestaat niet"
+
+#~ msgid "function `%s' not defined"
+#~ msgstr "functie '%s' is niet gedefinieerd"
+
+#~ msgid "`nextfile' cannot be called from a `%s' rule"
+#~ msgstr "'nextfile' kan niet aangeroepen worden in een '%s'-regel"
+
+#~ msgid "`next' cannot be called from a `%s' rule"
+#~ msgstr "'next' kan niet aangeroepen worden in een '%s'-regel"
+
+#~ msgid "Sorry, don't know how to interpret `%s'"
+#~ msgstr "Kan '%s' niet interpreteren"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "Actie wordt niet ondersteund"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "optie '-m[fr]' is irrelevant in gawk"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "gebruikswijze van optie -m: '-m[fr] nnn'"
+
+#~ msgid "\t-R file\t\t\t--command=file\n"
+#~ msgstr "\t-R bestand\t\t\t--command=bestand\n"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "kan groepen niet vinden: %s"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr ""
+#~ "toewijzing aan het resultaat van een ingebouwde functie is niet toegestaan"
+
+#~ msgid "attempt to use array in a scalar context"
+#~ msgstr "array wordt gebruikt in een scalaire context"
+
+#~ msgid "statement may have no effect"
+#~ msgstr "opdracht heeft mogelijk geen effect"
+
+#~ msgid "out of memory"
+#~ msgstr "onvoldoende geheugen beschikbaar"
+
+#~ msgid "attempt to use scalar `%s' as array"
+#~ msgstr "scalair '%s' wordt gebruikt als array"
+
+#~ msgid "call of `length' without parentheses is deprecated by POSIX"
+#~ msgstr "aanroep van 'length' zonder haakjes wordt door POSIX afgeraden"
+
+#~ msgid "division by zero attempted in `/'"
+#~ msgstr "deling door nul in '/'"
+
+#~ msgid "length: untyped parameter argument will be forced to scalar"
+#~ msgstr "length: typeloos parameterargument wordt omgezet naar scalair"
+
+#~ msgid "length: untyped argument will be forced to scalar"
+#~ msgstr "length: typeloos argument wordt omgezet naar scalair"
+
+#~ msgid "`break' outside a loop is not portable"
+#~ msgstr "'break' buiten een lus is niet overdraagbaar"
+
+#~ msgid "`continue' outside a loop is not portable"
+#~ msgstr "'continue' buiten een lus is niet overdraagbaar"
+
+#~ msgid "`nextfile' cannot be called from a BEGIN rule"
+#~ msgstr "'nextfile' kan niet aangeroepen worden in een BEGIN-regel"
+
+#~ msgid ""
+#~ "concatenation: side effects in one expression have changed the length of "
+#~ "another!"
+#~ msgstr ""
+#~ "concatenation: neveneffecten in de ene expressie hebben de lengte van een "
+#~ "andere veranderd!"
+
+#~ msgid "illegal type (%s) in tree_eval"
+#~ msgstr "ongeldig type (%s) in tree_eval()"
+
+#~ msgid "\t# -- main --\n"
+#~ msgstr "\t# -- hoofd --\n"
+
+#~ msgid "invalid tree type %s in redirect()"
+#~ msgstr "ongeldig boomtype %s in redirect()"
+
+#~ msgid "/inet/raw client not ready yet, sorry"
+#~ msgstr "cliënt van '/inet/raw' is nog niet klaar, sorry"
+
+#~ msgid "only root may use `/inet/raw'."
+#~ msgstr "Alleen root mag '/inet/raw' gebruiken."
+
+#~ msgid "/inet/raw server not ready yet, sorry"
+#~ msgstr "server van '/inet/raw' is nog niet klaar, sorry"
+
+#~ msgid "file `%s' is a directory"
+#~ msgstr "'%s' is een map"
+
+#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'"
+#~ msgstr "gebruik 'PROCINFO[\"%s\"]' in plaats van '%s'"
+
+#~ msgid "use `PROCINFO[...]' instead of `/dev/user'"
+#~ msgstr "gebruik 'PROCINFO[...]' in plaats van '/dev/user'"
+
+#~ msgid "\t-m[fr] val\n"
+#~ msgstr "\t-m[fr] waarde\n"
+
+#~ msgid "can't convert string to float"
+#~ msgstr "kan string niet converteren naar drijvende-komma-getal"
+
+#~ msgid "# treated internally as `delete'"
+#~ msgstr "# wordt intern behandeld als 'delete'"
+
+#~ msgid "# this is a dynamically loaded extension function"
+#~ msgstr "# dit is een dynamisch geladen uitbreidingsfunctie"
+
+#~ msgid ""
+#~ "\t# BEGIN block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# BEGIN-blok(ken)\n"
+#~ "\n"
+
+#~ msgid "unexpected type %s in prec_level"
+#~ msgstr "onverwacht type %s in prec_level()"
+
+#~ msgid "Unknown node type %s in pp_var"
+#~ msgstr "onbekend knooptype %s in pp_var()"
+
+#~ msgid "can't open two way socket `%s' for input/output (%s)"
+#~ msgstr "kan tweerichtings-socket '%s' niet openen voor in- en uitvoer (%s)"
diff --git a/gawk-5.0.1/po/pl.po b/gawk-5.0.1/po/pl.po
new file mode 100644
index 00000000000..8f2ae059d1e
--- /dev/null
+++ b/gawk-5.0.1/po/pl.po
@@ -0,0 +1,4161 @@
+# Polish translations for GNU AWK package.
+# Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+#
+# Wojciech Polak <polak@gnu.org>, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014.
+# additional help by Sergey Poznyakoff <gray@gnu.org>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.1.0b\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2014-03-22 17:49+0100\n"
+"Last-Translator: Wojciech Polak <polak@gnu.org>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"Language: pl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "od %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "próba użycia wartości skalarnej jako tablicy"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "próba użycia parametru `%s' skalaru jako tablicy"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "próba użycia skalaru `%s' jako tablicy"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "próba użycia tablicy `%s' w kontekście skalaru"
+
+#: array.c:574
+#, fuzzy, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: indeks `%s' nie jest w tablicy `%s'"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "próba użycia skalaru `%s[\"%.*s\"]' jako tablicy"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: pierwszy argument nie jest tablicą"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: drugi argument nie jest tablicą"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: drugi argument nie jest tablicą"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: pierwszy argument nie jest tablicą"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: pierwszy argument nie jest tablicą"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: nie można użyć podtablicy pierwszego argumentu dla drugiego argumentu"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: nie można użyć podtablicy pierwszego argumentu dla drugiego argumentu"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: nie można użyć podtablicy drugiego argumentu dla pierwszego argumentu"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: nie można użyć podtablicy drugiego argumentu dla pierwszego argumentu"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "nieprawidłowa nazwa funkcji `%s'"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "funkcja porównująca w sortowaniu `%s' nie została zdefiniowna"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s bloków musi posiadać część dotyczącą akcji"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "każda reguła musi posiadać wzorzec lub część dotyczącą akcji"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "stary awk nie wspiera wielokrotnych reguł `BEGIN' lub `END'"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr ""
+"`%s' jest funkcją wbudowaną, więc nie może zostać ponownie zdefiniowana"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr ""
+"stałe wyrażenie regularne `//' wygląda jak komentarz C++, ale nim nie jest"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr ""
+"stałe wyrażenie regularne `/%s/' wygląda jak komentarz C, ale nim nie jest"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "powielone wartości case w ciele switch: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "wykryto powielony `default' w ciele switch"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "instrukcja `break' poza pętlą lub switch'em jest niedozwolona"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "instrukcja `continue' poza pętlą jest niedozwolona"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "`next' użyty w akcji %s"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "`nextfile' użyty w akcji %s"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "`return' użyty poza kontekstem funkcji"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"zwykły `print' w regułach BEGIN lub END powinien prawdopodobnie być jako "
+"`print \"\"'"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "`delete' nie jest dozwolony z SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "`delete' nie jest dozwolony z FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "`delete(tablica)' jest nieprzenośnym rozszerzeniem tawk"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "wieloetapowe dwukierunkowe linie potokowe nie działają"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "wyrażanie regularne po prawej stronie przypisania"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "wyrażenie regularne po lewej stronie operatora `~' lub `!~'"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr ""
+"stary awk nie wspiera słowa kluczowego `in', z wyjątkiem po słowie `for'"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "wyrażenie regularne po prawej stronie porównania"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr ""
+"komenda `getline' bez przekierowania jest nieprawidłowa wewnątrz reguły `%s'"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr ""
+"komenda `getline' bez przekierowania nie jest zdefiniowana wewnątrz akcji END"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "stary awk nie wspiera wielowymiarowych tablic"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "wywołanie `length' bez nawiasów jest nieprzenośne"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "pośrednie wywołania funkcji są rozszerzeniem gawk"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"nie można użyć specjalnej zmiennej `%s' do pośredniego wywołania funkcji"
+
+#: awkgram.y:2039
+#, fuzzy, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "próba użycia funkcji `%s' jako tablicy"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "nieprawidłowe wyrażenie indeksowe"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "ostrzeżenie: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fatalny błąd: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "niespodziewany znak nowego wiersza lub końca łańcucha"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "nie można otworzyć pliku źródłowego `%s' do czytania (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "nie można otworzyć współdzielonej biblioteki `%s' do czytania (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "nieznany powód"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "nie można dołączyć `%s' i używać go jako pliku programu"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "plik źródłowy `%s' jest już załączony"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "biblioteka współdzielona jest już załadowana `%s'"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include jest rozszerzeniem gawk"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "pusta nazwa pliku po @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load jest rozszerzeniem gawk"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "pusta nazwa pliku po @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "pusty tekst programu w linii poleceń"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "nie można otworzyć pliku źródłowego `%s' (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "plik źródłowy `%s' jest pusty"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr ""
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "plik źródłowy nie posiada na końcu znaku nowego wiersza"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr ""
+"niezakończone prawidłowo wyrażenie regularne kończy się znakiem `\\' na "
+"końcu pliku"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"%s: %d: modyfikator wyrażenia regularnego `/.../%c' tawk nie działa w gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "modyfikator wyrażenia regularnego `/.../%c' tawk nie działa w gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "niezakończone wyrażenie regularne"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "niezakończone wyrażenie regularne na końcu pliku"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "użycie `\\ #...' kontynuacji linii nie jest przenośne"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "backslash nie jest ostatnim znakiem w wierszu"
+
+#: awkgram.y:3858 awkgram.y:3860
+#, fuzzy
+msgid "multidimensional arrays are a gawk extension"
+msgstr "pośrednie wywołania funkcji są rozszerzeniem gawk"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX nie zezwala na operator `**='"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "stary awk nie wspiera operatora `**='"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX nie zezwala na operator `**'"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "stary awk nie wspiera operatora `**'"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "operator `^=' nie jest wspierany w starym awk"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "operator `^' nie jest wspierany w starym awk"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "niezakończony łańcuch"
+
+#: awkgram.y:4048 main.c:1220
+#, fuzzy
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX nie zezwala na sekwencję ucieczki `\\x'"
+
+#: awkgram.y:4050 node.c:453
+#, fuzzy
+msgid "backslash string continuation is not portable"
+msgstr "użycie `\\ #...' kontynuacji linii nie jest przenośne"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "nieprawidłowy znak '%c' w wyrażeniu"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "`%s' jest rozszerzeniem gawk"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX nie zezwala na `%s'"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "`%s' nie jest wspierany w starym awk"
+
+#: awkgram.y:4494
+#, fuzzy
+msgid "`goto' considered harmful!"
+msgstr "`goto' uważane za szkodliwe!\n"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d jest nieprawidłowe jako liczba argumentów dla %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s: literał łańcuchowy jako ostatni argument podstawienia nie ma żadnego "
+"efektu"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "%s trzeci parametr nie jest zmiennym obiektem"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: trzeci argument jest rozszerzeniem gawk"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: drugi argument jest rozszerzeniem gawk"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "nieprawidłowe użycie dcgettext(_\"...\"): usuń znak podkreślenia"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "nieprawidłowe użycie dcngettext(_\"...\"): usuń znak podkreślenia"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: stały regexp jako drugi argument nie jest dozwolony"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "funkcja `%s': parametr `%s' zasłania globalną zmienną"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "nie można otworzyć `%s' do zapisu (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "wysyłanie listy zmiennych na standardowe wyjście diagnostyczne"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: zamknięcie nie powiodło się (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() wywołana podwójnie!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "wystąpiły przykryte zmienne."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "nazwa funkcji `%s' została zdefiniowana poprzednio"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "funkcja `%s': nie można użyć nazwy funkcji jako nazwy parametru"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"funkcja `%s': nie można użyć specjalnej zmiennej `%s' jako parametru funkcji"
+
+#: awkgram.y:5092
+#, fuzzy, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "funkcja `%s': parametr `%s' zasłania globalną zmienną"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "funkcja `%s': parametr #%d, `%s', powiela parametr #%d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "funkcja `%s' została wywołana, ale nigdy nie została zdefiniowana"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr ""
+"funkcja `%s' została zdefiniowana, ale nigdy nie została wywołana "
+"bezpośrednio"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "stałe wyrażenie regularne dla parametru #%d daje wartość logiczną"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"funkcja `%s' została wywołana z białymi znakami pomiędzy jej nazwą a znakiem "
+"`(',\n"
+"lub użyta jako zmienna lub jako tablica"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "próba dzielenia przez zero"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "próba dzielenia przez zero w `%%'"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr "nie można przypisać wartości do wyniku tego wyrażenia"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "nieprawidłowy cel przypisania (opcode %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "@include jest rozszerzeniem gawk"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s do \"%s\" nie powiódł się (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "standardowe wyjście"
+
+#: builtin.c:148
+#, fuzzy
+msgid "standard error"
+msgstr "standardowe wyjście"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: otrzymano argument nie będący liczbą"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: argument %g jest poza zasięgiem"
+
+#: builtin.c:245
+#, fuzzy, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: nie można opróżnić: potok `%s' otwarty do czytania, a nie do zapisu"
+
+#: builtin.c:248
+#, fuzzy, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: nie można opróżnić: plik `%s' otwarty do czytania, a nie do zapisu"
+
+#: builtin.c:259
+#, fuzzy, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr ""
+"fflush: nie można opróżnić: plik `%s' otwarty do czytania, a nie do zapisu"
+
+#: builtin.c:264
+#, fuzzy, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: nie można opróżnić: potok `%s' otwarty do czytania, a nie do zapisu"
+
+#: builtin.c:270
+#, fuzzy, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: `%s' nie jest ani otwartym plikiem, ani potokiem, ani procesem"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: otrzymano pierwszy argument, który nie jest łańcuchem"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: otrzymano drugi argument, który nie jest łańcuchem"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: otrzymano argument, który nie jest liczbą"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: otrzymano argument, który jest tablicą"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "`length(tablica)' jest rozszerzeniem gawk"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: otrzymano argument, który nie jest łańcuchem"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: otrzymano argument, który nie jest liczbą"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: otrzymano ujemny argument %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "fatal: należy użyć `count$' we wszystkich formatach lub nic"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "szerokość pola jest ignorowana dla specyfikatora `%%'"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "precyzja jest ignorowana dla specyfikatora `%%'"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "szerokość pola i precyzja są ignorowane dla specyfikatora `%%'"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fatal: `$' jest niedozwolony w formatach awk"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fatal: argument count z `$' musi być > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"fatal: argument count %ld większy niż całkowita suma argumentów dostarczonych"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fatal: `$' jest niedozwolony po kropce w formacie"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr "fatal: brak `$' dla pozycyjnej szerokości pola lub precyzji"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "`l' jest bezsensowny w formatach awk; zignorowany"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fatal: `l' jest niedozwolony w formatach POSIX awk"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "`L' jest bezsensowny w formatach awk; zignorowany"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fatal: `L' jest niedozwolony w formatach POSIX awk"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "`h' jest bezsensowny w formatach awk; zignorowany"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fatal: `h' jest niedozwolony w formatach POSIX awk"
+
+#: builtin.c:1091
+#, fuzzy, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: wartość %g jest poza zasięgiem dla formatu `%%%c'"
+
+#: builtin.c:1104
+#, fuzzy, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: wartość %g jest poza zasięgiem dla formatu `%%%c'"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: wartość %g jest poza zasięgiem dla formatu `%%%c'"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: wartość %g jest poza zasięgiem dla formatu `%%%c'"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"pominięcie nieznanego formatu specyfikatora znaku `%c': nie skonwertowano "
+"argumentu"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr ""
+"fatal: brak wystarczającej liczby argumentów, aby zaspokoić łańcuch "
+"formatujący"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "zabrakło ^"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: specyfikator formatu nie posiada kontrolnej litery"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "zbyt dużo podanych argumentów w łańcuchu formatującym"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: brak argumentów"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: brak argumentów"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: otrzymano argument, który nie jest liczbą"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: wywołana z ujemnym argumentem %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: długość %g nie jest >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: długość %g nie jest >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: długość %g, która nie jest liczbą całkowitą, zostanie obcięta"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr "substr: długość %g zbyt duża dla indeksu łańcucha, obcinanie do %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: początkowy indeks %g jest nieprawidłowy, nastąpi użycie 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr ""
+"substr: początkowy indeks %g, który nie jest liczbą całkowitą, zostanie "
+"obcięty"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: łańcuch źródłowy ma zerową długość"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: początkowy indeks %g leży poza końcem łańcucha"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: długość %g zaczynając od %g przekracza długość pierwszego argumentu "
+"(%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr ""
+"strftime: wartość formatu w PROCINFO[\"strftime\"] posiada typ numeryczny"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: otrzymano drugi argument, który nie jest liczbą"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: drugi argument mniejszy od 0 lub zbyt duży dla time_t"
+
+#: builtin.c:2023
+#, fuzzy
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: drugi argument mniejszy od 0 lub zbyt duży dla time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: otrzymano pierwszy argument, który nie jest łańcuchem"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: otrzymano pusty łańcuch formatujący"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: otrzymano argument, który nie jest łańcuchem"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: przynajmniej jedna z wartości jest poza domyślnym zakresem"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "funkcja 'system' nie jest dozwolona w trybie piaskownicy"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: otrzymano argument, który nie jest łańcuchem"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "odwołanie do niezainicjowanego pola `$%d'"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: otrzymano argument, który nie jest łańcuchem"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: otrzymano argument, który nie jest łańcuchem"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: otrzymano pierwszy argument, który nie jest liczbą"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: otrzymano drugi argument, który nie jest liczbą"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: otrzymano argument, który nie jest liczbą"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: otrzymano argument, który nie jest liczbą"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: otrzymano argument, który nie jest liczbą"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: otrzymano trzeci argument, który nie jest tablicą"
+
+#: builtin.c:2919
+#, fuzzy, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: trzeci argument 0 potraktowany jako 1"
+
+#: builtin.c:3241
+#, fuzzy, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "and: wywołano z mniej niż dwoma argumentami"
+
+#: builtin.c:3341
+#, fuzzy, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "and: wywołano z mniej niż dwoma argumentami"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: otrzymano pierwszy argument, który nie jest liczbą"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: otrzymano drugi argument, który nie jest liczbą"
+
+#: builtin.c:3404
+#, fuzzy, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): ujemne wartości spowodują dziwne wyniki"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): ułamkowe wartości zostaną obcięte"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): zbyt duża wartość przesunięcia spowoduje dziwne wyniki"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: otrzymano pierwszy argument, który nie jest liczbą"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: otrzymano drugi argument, który nie jest liczbą"
+
+#: builtin.c:3443
+#, fuzzy, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): ujemne wartości spowodują dziwne wyniki"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): ułamkowe wartości zostaną obcięte"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): zbyt duża wartość przesunięcia spowoduje dziwne wyniki"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: wywołano z mniej niż dwoma argumentami"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: argument %d nie jest liczbą"
+
+#: builtin.c:3483
+#, fuzzy, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: argument %d ujemna wartość %g spowoduje dziwne wyniki"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: wywołano z mniej niż dwoma argumentami"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: argument %d nie jest liczbą"
+
+#: builtin.c:3515
+#, fuzzy, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: argument %d ujemna wartość %g spowoduje dziwne wyniki"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: wywołano z mniej niż dwoma argumentami"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: argument %d nie jest liczbą"
+
+#: builtin.c:3547
+#, fuzzy, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: argument %d ujemna wartość %g spowoduje dziwne wyniki"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: otrzymano argument, który nie jest liczbą"
+
+#: builtin.c:3577
+#, fuzzy, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): ujemne wartości spowodują dziwne wyniki"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): ułamkowe wartości zostaną obcięte"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: `%s' nie jest prawidłową kategorią lokalizacji"
+
+#: builtin.c:3988 mpfr.c:1203
+#, fuzzy
+msgid "intdiv: third argument is not an array"
+msgstr "match: otrzymano trzeci argument, który nie jest tablicą"
+
+#: builtin.c:3996 mpfr.c:1211
+#, fuzzy
+msgid "intdiv: received non-numeric first argument"
+msgstr "and: otrzymano pierwszy argument, który nie jest liczbą"
+
+#: builtin.c:3998 mpfr.c:1213
+#, fuzzy
+msgid "intdiv: received non-numeric second argument"
+msgstr "and: otrzymano drugi argument, który nie jest liczbą"
+
+#: builtin.c:4007 mpfr.c:1252
+#, fuzzy
+msgid "intdiv: division by zero attempted"
+msgstr "próba dzielenia przez zero"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: drugi argument nie jest tablicą"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+
+#: builtin.c:4101
+#, fuzzy, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "option: nieprawidłowy parametr - \"%s\""
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr ""
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Podaj komendy (g)awk. Zakończ poleceniem \"end\"\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "nieprawidłowy numer ramki: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: nieprawidłowa opcja - \"%s\""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\": stanowi już źródło."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": niedozwolona komenda."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr "Nie można użyć polecenia `commands' dla komend breakpoint/watchpoint."
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "nie ustawiono jeszcze breakpoint/watchpoint"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "nieprawidłowy numer breakpoint/watchpoint"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr ""
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Zakończ komendą \"end\"\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "`end' dozwolony jedynie dla komendy `commands' lub `eval'"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "polecenie `silent' dozwolone jedynie w komendzie `commands'"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: nieprawidłowa opcja - \"%s\""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: nieprawidłowy numer breakpoint/watchpoint"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "argument nie jest łańcuchem tekstowym"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: nieprawidłowy parametr - \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "brak takiej funkcji - \"%s\""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: nieprawidłowa opcja - \"%s\""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "nieprawidłowy zakres specyfikacji: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "nienumeryczna wartość dla numeru pola"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "znaleziono nienumeryczną wartość, spodziewano się numerycznej"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "niezerowa wartość"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr ""
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr ""
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr ""
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr ""
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr ""
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr ""
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr ""
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr ""
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr ""
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr ""
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr ""
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr ""
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr ""
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr ""
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr ""
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr ""
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr ""
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr ""
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr ""
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr ""
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr ""
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "błąd: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "nie można odczytać komendy (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "nie można odczytać komendy (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "nieprawidłowy znak w komendzie"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "nieznana komenda - \"%.*s\", spróbuj pomoc"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "nieprawidłowy znak"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "niezdefiniowana komenda: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr ""
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr ""
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr ""
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr ""
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr ""
+
+#: debug.c:358
+msgid "program not running."
+msgstr ""
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "nie można odczytać pliku źródłowego `%s' (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "plik źródłowy `%s' jest pusty.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "brak aktualnego pliku źródłowego."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "nie można znaleźć pliku źródłowego `%s' (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr "UWAGA: plik źródłowy `%s' uległ zmianie od kompilacji programu.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr ""
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "niespodziewany koniec pliku podczas czytania `%s', linia %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "plik źródłowy `%s' uległ zmianie od rozpoczęcia działania programu"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Aktualny plik źródłowy: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Ilość linii: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Plik źródłowy (linie): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Numer  Disp  Enabled  Lokacja\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr ""
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr ""
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tkoniec warunku: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tkomendy:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Aktualna ramka: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr ""
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr ""
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr ""
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Brak argumentów.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr ""
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Wszystkie zdefiniowane zmienne:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Wszystkie zdefiniowane funkcje:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Obserwowane zmienne:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "brak symbolu `%s' w bieżącym kontekście\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "`%s' nie jest tablicą\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = niezainicjowane pole\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "tablica `%s' jest pusta\n"
+
+#: debug.c:1132 debug.c:1184
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%s\"] nie ma w tablicy `%s'\n"
+
+#: debug.c:1188
+#, fuzzy, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "`%s[\"%s\"]' nie jest tablicą\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "`%s' nie jest zmienną skalarną"
+
+#: debug.c:1272 debug.c:5133
+#, fuzzy, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "próba użycia tablicy `%s[\"%s\"]' w kontekście skalaru"
+
+#: debug.c:1295 debug.c:5144
+#, fuzzy, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "próba użycia skalaru `%s[\"%s\"]' jako tablicy"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "`%s' jest funkcją"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr ""
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr ""
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr ""
+
+#: debug.c:1543
+#, fuzzy, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%s\"] nie ma w tablicy `%s'\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "próba użycia wartości skalarnej jako tablicy"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr ""
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " w pliku `%s', linia %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " w `%s':%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tw "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr ""
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "nieprawidłowy numer ramki"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr ""
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Breakpoint %d ustawiony w pliku `%s', linia %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr ""
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "numer linii %d w pliku `%s' jest poza zasięgiem"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Nie można znaleźć reguły!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr ""
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr ""
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr ""
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Skasowany breakpoint %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr ""
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Brak breakpointa w pliku `%s', linii #%d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr ""
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Czy skasować wszystkie breakpointy? (y lub n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "t"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr ""
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr ""
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr ""
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr ""
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr ""
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr ""
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr ""
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Uruchamianie programu: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr ""
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr ""
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr ""
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr ""
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr ""
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr ""
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr ""
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr ""
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "nieprawidłowa linia źródłowa %d w pliku `%s'"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr ""
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "brak elementu w tablicy\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "zmienna bez typu\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr ""
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr ""
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr ""
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, fuzzy, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%s\"] nie ma w tablicy `%s'"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "wysyłanie wyjścia na stdout\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "nieprawidłowa liczba"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "polecenie `%s' nie może być wywołane w tym kontekście; zignorowano"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr ""
+"instrukcja `return' nie może być wywołana w tym kontekście; zignorowano"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Brak symbolu `%s' w bieżącym kontekście"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "nieznany typ węzła %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "nieznany opcode %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "opcode %s nie jest operatorem ani słowem kluczowym"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "przepełnienie bufora w genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Stos Wywoławczy Funkcji:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "`IGNORECASE' jest rozszerzeniem gawk"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "`BINMODE' jest rozszerzeniem gawk"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "wartość BINMODE `%s' jest nieprawidłowa, przyjęto ją jako 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "zła specyfikacja `%sFMT' `%s'"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "wyłączenie `--lint' z powodu przypisania do `LINT'"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "odwołanie do niezainicjowanego argumentu `%s'"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "odwołanie do niezainicjowanej zmiennej `%s'"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "próba odwołania do pola poprzez nienumeryczną wartość"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "próba odwołania z zerowego łańcucha"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "próba dostępu do pola %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "odwołanie do niezainicjowanego pola `$%ld'"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr ""
+"funkcja `%s' została wywołana z większą ilością argumentów niż zostało to "
+"zadeklarowane"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: niespodziewany typ `%s'"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "próba dzielenia przez zero w `/='"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "próba dzielenia przez zero w `%%='"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "rozszerzenia nie są dozwolone w trybie piaskownicy"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load są rozszerzeniami gawk"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: otrzymano NULL lib_name"
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: nie można otworzyć biblioteki `%s' (%s)\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: biblioteka `%s': nie definiuje `plugin_is_GPL_compatible' (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: biblioteka `%s': nie można wywołać funkcji `%s' (%s)\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr ""
+"load_ext: funkcja inicjalizująca `%s' biblioteki `%s' nie powiodła się\n"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: brakująca nazwa funkcji"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr "make_builtin: nie można użyć wbudowanej w gawk `%s' jako nazwy funkcji"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr "make_builtin: nie można użyć wbudowanej w gawk `%s' jako nazwy funkcji"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: nie można zredefiniować funkcji `%s'"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: funkcja `%s' została już zdefiniowana"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: nazwa funkcji `%s' została zdefiniowana wcześniej"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: ujemny licznik argumentów dla funkcji `%s'"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr "funkcja `%s': argument #%d: próba użycia skalaru jako tablicy"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "funkcja `%s': argument #%d: próba użycia tablicy jako skalaru"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "dynamiczne ładowanie biblioteki nie jest wspierane"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: nie można odczytać dowiązania symbolicznego `%s'"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: złe parametry"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init: nie można utworzyć zmiennej %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "funkcja fts nie jest wspierana w tym systemie"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: nie można utworzyć tablicy"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: nie można ustawić elementu"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: nie można ustawić elementu"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: nie można ustawić elementu"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: nie można utworzyć tablicy"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: nie można ustawić elementu"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: wywołano z nieprawidłową ilością argumentów, powinny być 3"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: nieprawidłowy pierwszy parametr"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: nieprawidłowy drugi parametr"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: nieprawidłowy trzeci parametr"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: nie można spłaszczyć tablicy\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: zignorowano flagę FTS_NOSTAT. nyah, nyah, nyah."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() nie powiodła się\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: nie można pobrać pierwszego argumentu"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: nie można pobrać drugiego argumentu"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: nie można pobrać trzeciego argumentu"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "funkcja fnmatch nie została zaimplementowana w tym systemie\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: nie można było dodać zmiennej FNM_NOMATCH"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: nie można było ustawić elementu tablicy %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: nie można było zainstalować tablicy FNM"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO nie jest tablicą!"
+
+#: extension/inplace.c:131
+#, fuzzy
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace_begin: edycja w miejscu jest już aktywna"
+
+#: extension/inplace.c:134
+#, fuzzy, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace_begin: spodziewano się 2 argumentów, a otrzymano %d"
+
+#: extension/inplace.c:137
+#, fuzzy
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr "inplace_begin: nie można pobrać pierwszego argumentu jako nazwy pliku"
+
+#: extension/inplace.c:145
+#, fuzzy, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace_begin: wyłączenie edycji w miejscu dla nieprawidłowej nazwy pliku `"
+"%s'"
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace_begin: nie można sprawdzić `%s' (%s)"
+
+#: extension/inplace.c:159
+#, fuzzy, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace_begin: `%s' nie jest zwykłym plikiem"
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace_begin: wywołanie mkstemp(`%s') nie powiodło się (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace_begin: funkcja chmod nie powiodła się (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace_begin: wywołanie dup(stdout) nie powiodło się (%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_begin: wywołanie dup2(%d, stdout) nie powiodło się (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace_begin: wywołanie close(%d) nie powiodło się (%s)"
+
+#: extension/inplace.c:211
+#, fuzzy, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace_begin: spodziewano się 2 argumentów, a otrzymano %d"
+
+#: extension/inplace.c:214
+#, fuzzy
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr "inplace_end: nie można pobrać pierwszego argumentu jako nazwy pliku"
+
+#: extension/inplace.c:221
+#, fuzzy
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace_end: edycja w miejscu nie jest aktywna"
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_end: wywołanie dup2(%d, stdout) nie powiodło się (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace_end: wywołanie close(%d) nie powiodło się (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace_end: wywołanie fsetpos(stdout) nie powiodło się (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace_end: wywołanie link(`%s', `%s') nie powiodło się (%s)"
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace_end: wywołanie rename(`%s', `%s') nie powiodło się (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: wywołano z nieprawidłowymi argumentami"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: wywołano z nieprawidłowymi argumentami"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: wywołanie opendir/fdopendir nie powiodło się: %s"
+
+#: extension/readfile.c:131
+#, fuzzy
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: wywołano bez argumentów"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr ""
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: argument 0 nie jest tekstem\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: argument 1 nie jest tablicą\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: nie można spłaszczyć tablicy\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: nie można było zwolnić spłaszczonej tablicy\n"
+
+#: extension/rwarray.c:255
+#, fuzzy, c-format
+msgid "array value has unknown type %d"
+msgstr "nieznany typ węzła %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: argument 0 nie jest tekstem\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: argument 1 nie jest tablicą\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array nie powiodła się\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element nie powiodła się\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: funkcja nie jest wspierana na tej platformie"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: brakuje wymaganego argumentu numerycznego"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: argument jest ujemny"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: funkcja nie jest wspierana na tej platformie"
+
+#: field.c:284
+msgid "input record too large"
+msgstr ""
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF ustawiony na wartość ujemną"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: czwarty argument jest rozszerzeniem gawk"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: czwarty argument nie jest tablicą"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: drugi argument nie jest tablicą"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split: nie można użyć tej samej tablicy dla drugiego i czwartego argumentu"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: nie można użyć podtablicy drugiego argumentu dla czwartego argumentu"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: nie można użyć podtablicy czwartego argumentu dla drugiego argumentu"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: zerowy łańcuch dla trzeciego argumentu jest rozszerzeniem gawk"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: czwarty argument nie jest tablicą"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: drugi argument nie jest tablicą"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: trzeci argument nie może być pusty"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: nie można użyć tej samej tablicy dla drugiego i czwartego argumentu"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: nie można użyć podtablicy drugiego argumentu dla czwartego "
+"argumentu"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: nie można użyć podtablicy czwartego argumentu dla drugiego "
+"argumentu"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "`FIELDWIDTHS' jest rozszerzeniem gawk"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr ""
+
+#: field.c:1239
+#, fuzzy, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "nieprawidłowa wartość FIELDWIDTHS, w pobliżu `%s'"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "zerowy łańcuch dla `FS' jest rozszerzeniem gawk"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "stary awk nie wspiera wyrażeń regularnych jako wartości `FS'"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "`FPAT' jest rozszerzeniem gawk"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: otrzymano null retval"
+
+#: gawkapi.c:178 gawkapi.c:189
+#, fuzzy
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: otrzymano null retval"
+
+#: gawkapi.c:183 gawkapi.c:194
+#, fuzzy
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: otrzymano null retval"
+
+#: gawkapi.c:198
+#, fuzzy, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: otrzymano null retval"
+
+#: gawkapi.c:385
+#, fuzzy
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "load_ext: otrzymano NULL lib_name"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: otrzymano null node"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: otrzymano null val"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: otrzymano tablicę null"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: otrzymano null subscript"
+
+#: gawkapi.c:1217
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array: nie można było skonwertować indeksu %d\n"
+
+#: gawkapi.c:1222
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array: nie można było skonwertować wartości %d\n"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr ""
+
+#: gawkapi.c:1365
+#, fuzzy
+msgid "cannot find end of BEGINFILE rule"
+msgstr "instrukcja `next' nie może być wywołana z wnętrza reguły BEGIN"
+
+#: gawkapi.c:1419
+#, fuzzy, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "nie można otworzyć pliku źródłowego `%s' do czytania (%s)"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "argument linii poleceń `%s' jest katalogiem: pominięto"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "nie można otworzyć pliku `%s' do czytania (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "zamknięcie fd %d (`%s') nie powiodło się (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "przekierowanie nie jest dozwolone w trybie piaskownicy"
+
+#: io.c:787
+#, fuzzy, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "wyrażenie w przekierowaniu `%s' ma tylko wartość numeryczną"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "wyrażenie dla przekierowania `%s' ma zerową wartość łańcucha"
+
+#: io.c:796
+#, fuzzy, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"nazwa pliku `%s' dla przekierowania `%s' może być rezultatem logicznego "
+"wyrażenia"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "niepotrzebne mieszanie `>' i `>>' dla pliku `%.*s'"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr ""
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "nie można otworzyć potoku `%s' jako wyjścia (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "nie można otworzyć potoku `%s' jako wejścia (%s)"
+
+#: io.c:950
+#, fuzzy, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr "gettimeofday: funkcja nie jest wspierana na tej platformie"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr ""
+"nie można otworzyć dwukierunkowego potoku `%s' jako wejścia/wyjścia (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "nie można przekierować z `%s' (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "nie można przekierować do `%s' (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"osiągnięto systemowy limit otwartych plików: rozpoczęcie multipleksowania "
+"deskryptorów plików"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "zamknięcie `%s' nie powiodło się (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "zbyt dużo otwartych potoków lub plików wejściowych"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: drugim argumentem musi być `to' lub `from'"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr ""
+"close: `%.*s' nie jest ani otwartym plikiem, ani potokiem, ani procesem"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "zamknięcie przekierowania, które nigdy nie zostało otwarte"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: przekierowanie `%s' nie zostało otwarte z `|&', drugi argument "
+"zignorowany"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "status awarii (%d) podczas zamykania potoku `%s' (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "status awarii (%d) podczas zamykania pliku `%s' (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "brak jawnego zamknięcia gniazdka `%s'"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "brak jawnego zamknięcia procesu pomocniczego `%s'"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "brak jawnego zamknięcia potoku `%s'"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "brak jawnego zamknięcia pliku `%s'"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr ""
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr ""
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "błąd podczas zapisu na standardowe wyjście (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "błąd podczas zapisu na standardowe wyjście diagnostyczne (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "opróżnienie potoku `%s' nie powiodło się (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr ""
+"opróżnienie potoku do `%s' przez proces pomocniczy nie powiodło się (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "opróżnienie pliku `%s' nie powiodło się (%s)."
+
+#: io.c:1610
+#, fuzzy, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "nieprawidłowy lokalny port %s w `/inet'"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "nieprawidłowy lokalny port %s w `/inet'"
+
+#: io.c:1636
+#, fuzzy, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "informacje o zdalnym hoście i porcie są nieprawidłowe (%s, %s)"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "informacje o zdalnym hoście i porcie są nieprawidłowe (%s, %s)"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "Komunikacja TCP/IP nie jest wspierana"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "nie można otworzyć `%s', tryb `%s'"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "zamknięcie nadrzędnego pty nie powiodło się (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr ""
+"zamknięcie standardowego wyjścia w procesie potomnym nie powiodło się (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"przesunięcie podległego pty na standardowe wyjście w procesie potomnym nie "
+"powiodło się (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr ""
+"zamknięcie standardowego wejścia w procesie potomnym nie powiodło się (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"przesunięcie podległego pty na standardowe wejście w procesie potomnym nie "
+"powiodło się (dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "zamknięcie podległego pty nie powiodło się (%s)"
+
+#: io.c:2265
+#, fuzzy
+msgid "could not create child process or open pty"
+msgstr "nie można utworzyć procesu potomnego dla `%s' (fork: %s)"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+"przesunięcie potoku na standardowe wyjście w procesie potomnym nie powiodło "
+"się (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+"przesunięcie potoku na standardowe wejście w procesie potomnym nie powiodło "
+"się (dup: %s)"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr ""
+"odzyskanie standardowego wyjścia w procesie potomnym nie powiodło się\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr ""
+"odzyskanie standardowego wejścia w procesie potomnym nie powiodło się\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "zamknięcie potoku nie powiodło się (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "`|&' nie jest wspierany"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "nie można otworzyć potoku `%s' (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "nie można utworzyć procesu potomnego dla `%s' (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: otrzymano wskaźnik NULL"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"parser wejścia `%s' konfliktuje z poprzednio zainstalowanym parserem `%s'"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "parser wejścia `%s': nie powiodło się otwarcie `%s'"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: otrzymano wskaźnik NULL"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"otoczka wyjścia `%s' konfliktuje z poprzednio zainstalowaną otoczką `%s'"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "otoczka wyjścia `%s': nie powiodło się otwarcie `%s'"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: otrzymano wskaźnik NULL"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"dwukierunkowy procesor `%s' konfliktuje z poprzednio zainstalowanym "
+"procesorem `%s'"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "dwukierunkowy procesor `%s' zawiódł w otwarciu `%s'"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "plik danych `%s' jest pusty"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "nie można zarezerwować więcej pamięci wejściowej"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "wieloznakowa wartość `RS' jest rozszerzeniem gawk"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "Komunikacja IPv6 nie jest wspierana"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+"zmienna środowiskowa `POSIXLY_CORRECT' ustawiona: `--posix' został włączony"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "opcja `--posix' zostanie użyta nad `--traditional'"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "`--posix'/`--traditional' użyte nad opcją `--non-decimal-data'"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "opcja `--posix' zostanie użyta nad `--characters-as-bytes'"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr ""
+"uruchamianie %s setuid root może być problemem pod względem bezpieczeństwa"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "nie można ustawić trybu binarnego na standardowym wejściu (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "nie można ustawić trybu binarnego na standardowym wyjściu (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "nie można ustawić trybu binarnego na wyjściu diagnostycznym (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "brak tekstu programu!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"Użycie: %s [styl opcji POSIX lub GNU] -f plik_z_programem [--] plik ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr "Użycie: %s [styl opcji POSIX lub GNU] [--] %cprogram%c plik ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "Opcje POSIX:\t\tDługie opcje GNU (standard):\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f program\t\t--file=program\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v zmienna=wartość\t--assign=zmienna=wartość\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Krótkie opcje:\t\tDługie opcje GNU: (rozszerzenia)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[plik]\t\t--dump-variables[=plik]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[plik]\t\t--debug[=plik]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'tekst-programu'\t--source='tekst-programu'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E plik\t\t\t--exec=plik\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i plikinclude\t\t--include=plikinclude\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l biblioteka\t\t--load=biblioteka\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L [fatal]\t\t--lint[=fatal]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[plik]\t\t--pretty-print[=plik]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[plik]\t\t--profile[=plik]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+#, fuzzy
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Aby zgłosić błąd, prosimy zobaczyć węzeł `Bugs' w `gawk.info'\n"
+"lub rozdział p.t. `Reporting Problems and Bugs' w wydrukowanej\n"
+"dokumentacji.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk jest językiem skanowania i przetwarzania wzorców.\n"
+"Program domyślnie czyta standardowe wejście i zapisuje standardowe wyjście.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Przykłady:\n"
+"\tgawk '{ suma += $1 }; END { print suma }' plik\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Ten program jest wolnym oprogramowaniem; możesz go rozprowadzać dalej\n"
+"i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU,\n"
+"wydanej przez Fundację Wolnego Oprogramowania - według wersji 3-ciej\n"
+"tej Licencji lub którejś z późniejszych wersji.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Ten program rozpowszechniany jest z nadzieją, iż będzie on\n"
+"użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej\n"
+"gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH\n"
+"ZASTOSOWAŃ. W celu uzyskania bliższych informacji przeczytaj\n"
+"Powszechną Licencję Publiczną GNU.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz\n"
+"Powszechnej Licencji Publicznej GNU (GNU General Public License);\n"
+"jeśli zaś nie - odwiedź stronę http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft nie ustawia FS na znak tabulatora w POSIX awk"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: argument `%s' dla `-v' nie jest zgodny ze składnią `zmienna=wartość'\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "`%s' nie jest dozwoloną nazwą zmiennej"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "`%s' nie jest nazwą zmiennej, szukanie pliku `%s=%s'"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "nie można użyć wbudowanej w gawk `%s' jako nazwy zmiennej"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "nie można użyć funkcji `%s' jako nazwy zmiennej"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "wyjątek zmiennopozycyjny"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "fatalny błąd: wewnętrzny błąd"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "fatalny błąd: wewnętrzny błąd: błąd segmentacji"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "fatalny błąd: wewnętrzny błąd: przepełnienie stosu"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "brak już otwartego fd %d"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "nie można otworzyć zawczasu /dev/null dla fd %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "pusty argument dla opcji `-e/--source' został zignorowany"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "opcja `--posix' zostanie użyta nad `--traditional'"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr ""
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: opcja `-W %s' nierozpoznana i zignorowana\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: opcja musi mieć argument -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "wartość PREC `%.*s' jest nieprawidłowa"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "wartość RNDMODE `%.*s' jest nieprawidłowa"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: otrzymano argument, który nie jest liczbą"
+
+#: mpfr.c:816
+#, fuzzy
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): ujemne wartości spowodują dziwne wyniki"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg): ułamkowe wartości zostaną obcięte"
+
+#: mpfr.c:832
+#, fuzzy, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "cmpl(%Zd): ujemne wartości spowodują dziwne wyniki"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: otrzymano argument #%d, który nie jest liczbą"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: argument #%d ma nieprawidłową wartość %Rg, użyto 0"
+
+#: mpfr.c:871
+#, fuzzy
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: argument #%d ujemna wartość %Rg spowoduje dziwne wyniki"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: argument #%d ułamkowa wartość %Rg zostanie obcięta"
+
+#: mpfr.c:892
+#, fuzzy, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: argument #%d ujemna wartość %Zd spowoduje dziwne wyniki"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "linia poleceń:"
+
+#: node.c:481
+#, fuzzy
+msgid "could not make typed regex"
+msgstr "niezakończone wyrażenie regularne"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "stary awk nie wspiera sekwencji ucieczki `\\%c'"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX nie zezwala na sekwencję ucieczki `\\x'"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "brak liczb szesnastkowych w sekwencji ucieczki `\\x'"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"szesnastkowa sekwencja ucieczki \\x%.*s %d znaków prawdopodobnie nie została "
+"zinterpretowana jak tego oczekujesz"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "sekwencja ucieczki `\\%c' potraktowana jako zwykłe `%c'"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Wykryto nieprawidłowe dane. Możliwe jest niedopasowanie pomiędzy Twoimi "
+"danymi a ustawieniami regionalnymi."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s `%s': nie można uzyskać flag fd: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s `%s': nie można ustawić close-on-exec: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "nie można otworzyć `%s' do zapisu: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "wysyłanie profilu na standardowe wyjście diagnostyczne"
+
+#: profile.c:271
+#, fuzzy, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# Reguła(i)\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Reguła(i)\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "wewnętrzny błąd: %s z zerowym vname"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "wewnętrzny błąd: builtin z fname null"
+
+#: profile.c:1302
+#, fuzzy, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"\t# Załadowane rozszerzenia (-l i/lub @load)\n"
+"\n"
+
+#: profile.c:1333
+#, fuzzy, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\t# Załadowane rozszerzenia (-l i/lub @load)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# profil programu gawk, utworzony %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funkcje, spis alfabetyczny\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: nieznany typ przekierowania %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "sekwencja ucieczki `\\%c' potraktowana jako zwykłe `%c'"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "komponent regexp `%.*s' powinien być prawdopodobnie `[%.*s]'"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "[ nie do pary"
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "nieprawidłowa klasa znaku"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "składnia klasy znaku to [[:space:]], a nie [:space:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "niedokończona sekwencja ucieczki \\"
+
+#: support/dfa.c:1492
+#, fuzzy
+msgid "invalid content of \\{\\}"
+msgstr "Nieprawidłowa zawartość \\{\\}"
+
+#: support/dfa.c:1495
+#, fuzzy
+msgid "regular expression too big"
+msgstr "Wyrażenie regularne jest zbyt duże"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "( nie do pary"
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "nie podano składni"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ") nie do pary"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: opcja '%s' jest niejednoznaczna; możliwości:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: opcja '--%s' nie może mieć argumentów\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: opcja '%c%s' nie może mieć argumentów\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: opcja '--%s' wymaga argumentu\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: nieznana opcja '--%s'\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: nieznana opcja '%c%s'\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: błędna opcja -- '%c'\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: opcja wymaga argumentu -- '%c'\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: opcja '-W %s' jest niejednoznaczna\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: opcja '-W %s' nie może mieć argumentów\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: opcja '-W %s' wymaga argumentu\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Sukces"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Brak dopasowania"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Nieprawidłowe wyrażenie regularne"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Nieprawidłowy znak porównania"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nieprawidłowa nazwa klasy znaku"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Końcowy znak backslash"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Nieprawidłowe odwołanie wsteczne"
+
+#: support/regcomp.c:156
+#, fuzzy
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Niedopasowany znak [ lub [^"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Niedopasowany znak ( lub \\("
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Niedopasowany znak \\{"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Nieprawidłowa zawartość \\{\\}"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Nieprawidłowy koniec zakresu"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Pamięć wyczerpana"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Nieprawidłowe poprzedzające wyrażenie regularne"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Przedwczesny koniec wyrażenia regularnego"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Wyrażenie regularne jest zbyt duże"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Niedopasowany znak ) lub \\)"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Brak poprzedniego wyrażenia regularnego"
+
+#: symbol.c:688
+#, fuzzy, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "funkcja `%s': nie można użyć nazwy funkcji jako nazwy parametru"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "nie można zdjąć głównego kontekstu"
+
+#, fuzzy
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "%s do \"%s\" nie powiódł się (%s)"
+
+#, fuzzy
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "%s: zamknięcie nie powiodło się (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "backslash na końcu łańcucha"
+
+#, fuzzy
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "próba użycia tablicy `%s[\"%s\"]' w kontekście skalaru"
+
+#, fuzzy
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "próba użycia skalaru `%s[\"%s\"]' jako tablicy"
+
+#, fuzzy
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: trzeci argument 0 potraktowany jako 1"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "`extension' jest rozszerzeniem gawk"
+
+#~ msgid "extension: received NULL lib_name"
+#~ msgstr "extension: otrzymano NULL lib_name"
+
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "extension: nie można otworzyć biblioteki `%s' (%s)"
+
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr ""
+#~ "extension: biblioteka `%s': nie definiuje `plugin_is_GPL_compatible' (%s)"
+
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr "extension: biblioteka `%s': nie można wywołać funkcji `%s' (%s)"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension: brakująca nazwa funkcji"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: nieprawidłowy znak `%c' w nazwie funkcji `%s'"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: nie można zredefiniować funkcji `%s'"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: funkcja `%s' została już zdefiniowana"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension: nazwa funkcji `%s' została zdefiniowana wcześniej"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr "extension: nie można użyć wbudowanej w gawk `%s' jako nazwy funkcji"
+
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr ""
+#~ "chdir: wywołano z nieprawidłową ilością argumentów, spodziewano się 1"
+
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "stat: wywołano z nieprawidłową ilością argumentów"
+
+#, fuzzy
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "stat: wywołano z nieprawidłową ilością argumentów"
+
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "fnmatch: wywołano z mniej niż trzema argumentami"
+
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "fnmatch: wywołano z więcej niż trzema argumentami"
+
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "fork: wywołana ze zbyt dużą ilością argumentów"
+
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "waitpid: wywołana ze zbyt dużą ilością argumentów"
+
+#~ msgid "wait: called with no arguments"
+#~ msgstr "wait: wywołano bez argumentów"
+
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "wait: wywołana ze zbyt dużą ilością argumentów"
+
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "ord: wywołana ze zbyt dużą ilością argumentów"
+
+#~ msgid "ord: called with no arguments"
+#~ msgstr "ord: wywołano bez argumentów"
+
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "chr: wywołana ze zbyt dużą ilością argumentów"
+
+#~ msgid "chr: called with no arguments"
+#~ msgstr "chr: wywołano bez argumentów"
+
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "readfile: wywołana ze zbyt dużą ilością argumentów"
+
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "writea: wywołana ze zbyt dużą ilością argumentów"
+
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "reada: wywołana ze zbyt dużą ilością argumentów"
+
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "gettimeofday: zignorowano argumenty"
+
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sleep: wywołana ze zbyt dużą ilością argumentów"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "nieznana wartość dla specyfikacji pola: %d\n"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr "funkcja `%s' zdefiniowana aby pobrać nie więcej niż %d argument(ów)"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "funkcja `%s': brakuje #%d argumentu"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "nieprawidłowy `getline var' wewnątrz reguły `%s'"
+
+#~ msgid "`getline' invalid inside `%s' rule"
+#~ msgstr "nieprawidłowy `getline' wewnątrz reguły `%s'"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr "nie dostarczono (znanego) protokołu w specjalnym pliku `%s'"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "specjalna nazwa pliku `%s' jest niekompletna"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "należy dostarczyć nazwę zdalnego hosta do `/inet'"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "należy dostarczyć numer zdalnego portu do `/inet'"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# %s blok(i)\n"
+#~ "\n"
+
+#~ msgid "range of the form `[%c-%c]' is locale dependent"
+#~ msgstr "zasięg formy `[%c-%c]' jest zależny od lokalizacji"
+
+#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'"
+#~ msgstr "odwołanie do niezainicjowanego elementu `%s[\"%.*s\"]'"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "indeks tablicy `%s' jest zerowym łańcuchem"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: pusty (null)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: pusty (zero)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: table_size = %d, array_size = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: array_ref do %s\n"
+
+#~ msgid "`nextfile' is a gawk extension"
+#~ msgstr "`nextfile' jest rozszerzeniem gawk"
+
+#~ msgid "`delete array' is a gawk extension"
+#~ msgstr "`delete tablica' jest rozszerzeniem gawk"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "użycie nie-tablicy jako tablicy"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "`%s' jest rozszerzeniem Bell Labs"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: otrzymano pierwszy argument, który nie jest liczbą"
+
+#~ msgid "or: received non-numeric second argument"
+#~ msgstr "or: otrzymano drugi argument, który nie jest liczbą"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): ujemne wartości spowodują dziwne wyniki"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): ułamkowe wartości zostaną obcięte"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: otrzymano pierwszy argument, który nie jest liczbą"
+
+#~ msgid "xor: received non-numeric second argument"
+#~ msgstr "xor: otrzymano drugi argument, który nie jest liczbą"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): ułamkowe wartości zostaną obcięte"
+
+#~ msgid "can't use function name `%s' as variable or array"
+#~ msgstr "nie można użyć nazwy funkcji `%s' jako zmiennej lub tablicy"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "przypisanie użyte w kontekście warunkowym"
+
+#~ msgid "statement has no effect"
+#~ msgstr "instrukcja nie ma żadnego efektu"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr ""
+#~ "pętla for: tablica `%s' zmieniła rozmiar z %ld do %ld podczas wykonywania "
+#~ "pętli"
+
+#~ msgid "function called indirectly through `%s' does not exist"
+#~ msgstr "pośrednio wywołana funkcja poprzez `%s' nie istnieje"
+
+#~ msgid "function `%s' not defined"
+#~ msgstr "funkcja `%s' nie została zdefiniowana"
+
+#~ msgid "error reading input file `%s': %s"
+#~ msgstr "błąd podczas czytania z pliku `%s': %s"
+
+#~ msgid "`nextfile' cannot be called from a `%s' rule"
+#~ msgstr "instrukcja `nextfile' nie może być wywołana z wnętrza reguły `%s'"
+
+#~ msgid "`next' cannot be called from a `%s' rule"
+#~ msgstr "instrukcja `next' nie może być wywołana z wnętrza reguły `%s'"
+
+#~ msgid "Sorry, don't know how to interpret `%s'"
+#~ msgstr "Niestety nie wiem jak zinterpretować `%s'"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "Operacja nie jest wspierana"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "nieistotna opcja `-m[fr]' w gawk"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "użycie opcji -m: `-m[fr] nnn'"
+
+#~ msgid "\t-R file\t\t\t--command=file\n"
+#~ msgstr "\t-R plik\t\t\t--command=plik\n"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "nie można znaleźć grup: %s"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr "przypisanie do wyniku wbudowanej funkcji nie jest dozwolone"
+
+#~ msgid "attempt to use array in a scalar context"
+#~ msgstr "próba użycia tablicy w kontekście skalaru"
+
+#~ msgid "statement may have no effect"
+#~ msgstr "instrukcja może nie mieć żadnego efektu"
+
+#~ msgid "out of memory"
+#~ msgstr "brak pamięci"
+
+#~ msgid "attempt to use scalar `%s' as array"
+#~ msgstr "próba użycia skalaru `%s' jako tablicy"
+
+#~ msgid "call of `length' without parentheses is deprecated by POSIX"
+#~ msgstr ""
+#~ "wywołanie `length' bez podania nawiasów jest niezalecane przez POSIX"
+
+#~ msgid "division by zero attempted in `/'"
+#~ msgstr "próba dzielenia przez zero w `/'"
+
+#~ msgid "length: untyped parameter argument will be forced to scalar"
+#~ msgstr "length: argument bez określonego typu zostanie uznany za skalar"
+
+#~ msgid "length: untyped argument will be forced to scalar"
+#~ msgstr "length: argument bez określonego typu zostanie uznany za skalar"
+
+#~ msgid "`break' outside a loop is not portable"
+#~ msgstr "instrukcja `break' poza pętlą jest nieprzenośna"
+
+#~ msgid "`continue' outside a loop is not portable"
+#~ msgstr "instrukcja `continue' poza pętlą jest nieprzenośna"
+
+#~ msgid "`nextfile' cannot be called from a BEGIN rule"
+#~ msgstr "instrukcja `nextfile' nie może być wywołana z wnętrza reguły BEGIN"
+
+#~ msgid ""
+#~ "concatenation: side effects in one expression have changed the length of "
+#~ "another!"
+#~ msgstr ""
+#~ "konkatenacja: skutki uboczne w jednym wyrażeniu spowodowały zmianę "
+#~ "długości innego wyrażenia!"
+
+#~ msgid "illegal type (%s) in tree_eval"
+#~ msgstr "nieprawidłowy typ (%s) w tree_eval"
+
+#~ msgid "\t# -- main --\n"
+#~ msgstr "\t# -- główne --\n"
+
+#~ msgid "invalid tree type %s in redirect()"
+#~ msgstr "nieprawidłowy typ drzewa %s w funkcji redirect()"
+
+#~ msgid "/inet/raw client not ready yet, sorry"
+#~ msgstr "klient /inet/raw nie jest jeszcze gotowy, przykro mi"
+
+#~ msgid "only root may use `/inet/raw'."
+#~ msgstr "tylko superużytkownik (root) może użyć `/inet/raw'."
+
+#~ msgid "/inet/raw server not ready yet, sorry"
+#~ msgstr "serwer /inet/raw nie jest jeszcze gotowy, przykro mi"
+
+#~ msgid "file `%s' is a directory"
+#~ msgstr "plik `%s' jest katalogiem"
+
+#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'"
+#~ msgstr "użyj `PROCINFO[\"%s\"]' zamiast `%s'"
+
+#~ msgid "use `PROCINFO[...]' instead of `/dev/user'"
+#~ msgstr "użyj `PROCINFO[...]' zamiast `/dev/user'"
+
+#~ msgid "\t-m[fr] val\n"
+#~ msgstr "\t-m[fr] wartość\n"
+
+#~ msgid "\t-W compat\t\t--compat\n"
+#~ msgstr "\t-W compat\t\t--compat\n"
+
+#~ msgid "\t-W copyleft\t\t--copyleft\n"
+#~ msgstr "\t-W copyleft\t\t--copyleft\n"
+
+#~ msgid "\t-W usage\t\t--usage\n"
+#~ msgstr "\t-W usage\t\t--usage\n"
+
+#~ msgid "can't convert string to float"
+#~ msgstr "nie można zamienić łańcucha do liczby zmiennopozycyjnej"
+
+#~ msgid "# treated internally as `delete'"
+#~ msgstr "# potraktowany wewnętrznie jako `delete'"
+
+#~ msgid "# this is a dynamically loaded extension function"
+#~ msgstr "# to jest dynamicznie ładowana funkcja rozszerzenie"
+
+#~ msgid ""
+#~ "\t# BEGIN block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# blok(i) BEGIN\n"
+#~ "\n"
+
+#~ msgid "unexpected type %s in prec_level"
+#~ msgstr "niespodziewany typ %s w prec_level"
+
+#~ msgid "Unknown node type %s in pp_var"
+#~ msgstr "Nieznany typ węzła %s w pp_var"
+
+#~ msgid "can't open two way socket `%s' for input/output (%s)"
+#~ msgstr ""
+#~ "nie można otworzyć dwukierunkowego gniazda `%s' jako wejścia/wyjścia (%s)"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: niewłaściwa opcja -- %c\n"
+
+#~ msgid "function %s called\n"
+#~ msgstr "wywołano funkcję %s\n"
+
+#~ msgid "field %d in FIELDWIDTHS, must be > 0"
+#~ msgstr "pole nr %d w FIELDWIDTHS musi być większe od zera"
+
+#~ msgid "delete: illegal use of variable `%s' as array"
+#~ msgstr "delete: nieprawidłowe użycie zmiennej `%s' jako tablicy"
+
+#~ msgid ""
+#~ "\n"
+#~ "To report bugs, see node `Bugs' in `gawk.info', which is\n"
+#~ msgstr ""
+#~ "\n"
+#~ "Aby zgłosić błędy, prosimy zobaczyć węzeł `Bugs' w `gawk.info', który "
+#~ "jest\n"
+
+#~ msgid "invalid syntax in name `%s' for variable assignment"
+#~ msgstr "błąd składni w nazwie `%s' dla przypisania zmiennej"
+
+#~ msgid "internal error: Node_var_array with null vname"
+#~ msgstr "wewnętrzny błąd: Node_var_array z zerowym vname"
+
+#~ msgid "or used in other expression context"
+#~ msgstr "lub użyty w innym kontekście wyrażenia"
+
+#~ msgid "`%s' is a function, assignment is not allowed"
+#~ msgstr "`%s' jest funkcją, zatem przypisanie nie jest dozwolone"
+
+#~ msgid "BEGIN blocks must have an action part"
+#~ msgstr "Blok BEGIN musi posiadać część dotyczącą akcji"
+
+#~ msgid "`nextfile' used in BEGIN or END action"
+#~ msgstr "`nextfile' użyty w akcji BEGIN lub END"
+
+#~ msgid "non-redirected `getline' undefined inside BEGIN or END action"
+#~ msgstr ""
+#~ "komenda `getline' bez przekierowania nie jest zdefiniowana wewnątrz akcji "
+#~ "BEGIN lub END"
+
+#~ msgid "fptr %x not in tokentab\n"
+#~ msgstr "brak fptr %x w tokentab\n"
+
+#~ msgid "gsub third parameter is not a changeable object"
+#~ msgstr "trzeci parametr gsub nie jest zmiennym obiektem"
+
+#~ msgid "unfinished repeat count"
+#~ msgstr "niedokończona liczba powtórzeń"
+
+#~ msgid "malformed repeat count"
+#~ msgstr "źle sformatowana liczba powtórzeń"
diff --git a/gawk-5.0.1/po/pt.po b/gawk-5.0.1/po/pt.po
new file mode 100644
index 00000000000..c8f383bb5c9
--- /dev/null
+++ b/gawk-5.0.1/po/pt.po
@@ -0,0 +1,3766 @@
+# Portuguese (Portugal) Translation for the gawk Package.
+# Copyright (C)  2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Pedro Albuquerque <palbuquerque73@gmail.com>, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.2.63\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2019-05-26 08:43+0100\n"
+"Last-Translator: Pedro Albuquerque <palbuquerque73@gmail.com>\n"
+"Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\\n\n"
+"X-Generator: Gtranslator 2.91.7\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "de %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "tentativa de usar um valor escalar como matriz"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "tentativa de usar o parâmetro escalar \"%s\" como matriz"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "tentativa de usar o escalar \"%s\" como matriz"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "tentativa de usar a matriz \"%s\" num contexto escalar"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "eliminar: índice \"%.*s\" não está na matriz \"%s\""
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "tentativa de usar o escalar '%s[\"%.*s\"]' como matriz"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: o primeiro argumento não é uma matriz"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: o segundo argumento não é uma matriz"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: o segundo argumento não é uma matriz"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: o primeiro argumento não é uma matriz"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: o primeiro argumento não é uma matriz"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: impossível usar uma sub-matriz do 1º argumento para 2º argumento"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: impossível usar uma sub-matriz do 1º argumento para 2º argumento"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: impossível usar uma sub-matriz do 2º argumento para 1º argumento"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: impossível usar uma sub-matriz do 2º argumento para 1º argumento"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "\"%s\" é inválido como nome de função"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "função de comparação de ordem \"%s\" não definida"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s blocos têm de ter uma parte de acção"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "cada regra tem de ter um padrão ou uma parte de acção"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "o awk antigo não suporta múltiplas regras \"BEGIN\" ou \"END\""
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "\"%s\" é uma função interna, não pode ser redefinida"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "constante regexp \"//\" parece-se com um comentário C++, mas não é"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "constante regexp \"/%s/\" parece-se com um comentário C, mas não é"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "valores de \"case\" duplicados no corpo do \"switch\": %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "\"default\" duplicado detectado no corpo do \"switch\""
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "\"break\" não é permitido fora de um ciclo ou \"switch\""
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "\"continue\" não é permitido fora de um ciclo"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "\"next\" usado em acção \"%s\""
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "\"nextfile\" usado em acção \"%s\""
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "\"return\" usado fora do contexto da função"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"\"print\" simples em regra BEGIN ou END devia provavelmente ser 'print \"\"'"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "\"delete\" não é permitido com SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "\"delete\" não é permitido com FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "\"delete(array)\" é uma extensão tawk não-portável"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "túneis multi-estágio de duas vias não funcionam"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr "concatenação como alvo de redireccionamento \">\" de E/S é ambíguo"
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "expressão regular à direita de atribuição"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "expressão regular à esquerda de operador \"~\" ou \"!~\""
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "o awk antigo não suporta a palavra-chave \"in\", excepto após \"for\""
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "expressão regular à direita de comparação"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "\"getline\" não redireccionado inválido dentro de regra \"%s\""
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "\"getline\" não redireccionado indefinido dentro de acção END"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "o awk antigo não suporta matrizes multi-dimensionais"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "chamada de \"length\" sem parênteses não é portável"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "chamadas de função indirectas são uma extensão gawk"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"impossível usar a variável especial \"%s\" para chamada de função indirecta"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "tentativa de usar a não-função \"%s\" em chamada de função"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "expressão subscrita inválida"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "aviso: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fatal: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "nova linha ou fim de cadeia inesperados"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+"ficheiros-fonte/argumentos de linha de comandos têm de conter funções ou "
+"regras completas"
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "impossível abrir ficheiro-fonte \"%s\" para leitura (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "impossível abrir biblioteca partilhada \"%s\" para leitura (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "motivo desconhecido"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "impossível incluir \"%s\" e usá-la como ficheiro de programa"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "ficheiro-fonte \"%s\" já incluído"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "biblioteca partilhada \"%s\" já incluída"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include é uma extensão gawk"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "nome de ficheiro vazio após @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load é uma extensão gawk"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "nome de ficheiro vazio após @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "texto de programa vazio na linha de comandos"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "impossível ler ficheiro-fonte \"%s\" (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "ficheiro-fonte \"%s\" vazio"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "erro PEBKAC: carácter \"\\%03o\" inválido no código-fonte"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "ficheiro-fonte não termina com nova linha"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "regexp não terminada acaba com \"\\\" no fim do ficheiro"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "%s: %d: modificador regexp tawk \"/.../%c\" não funciona no gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "modificador regexp tawk \"/.../%c\" não funciona no gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "regexp não terminada"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "regexp não terminada no fim do ficheiro"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "uso de continuação de linha \"\\ #...\" não é portável"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "a barra invertida não é o último carácter na linha"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "matrizes multi-dimensionais são uma extensão gawk"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX não permite o operador \"**=\""
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "o awk antigo não suporta o operador \"**=\""
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX não permite o operador  \"**\""
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "o awk antigo não suporta o operador  \"**\""
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "o awk antigo não suporta o operador  \"^=\""
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "o awk antigo não suporta o operador  \"^\""
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "cadeia indeterminada"
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX não permite novas linhas físicas em valores de cadeia"
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr "continuação de cadeia com barra invertida não é portável"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "carácter \"%c\" inválido em expressão"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "\"%s\" é uma extensão gawk"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX não permite \"%s\""
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "o awk antigo não suporta \"%s\""
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr "\"goto\" considerado perigoso"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d é inválido como nº de argumentos para %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s: literal de cadeia como último argumento de substituto não tem efeito"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "o terceiro parâmetro de %s não é um objecto alterável"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: o terceiro argumento é uma extensão gawk"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: o segundo argumento é uma extensão gawk"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"o uso de dcgettext(_\"...\") está incorrecto: remova o sublinhado inicial"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"o uso de dcngettext(_\"...\") está incorrecto: remova o sublinhado inicial"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: constante regexp como segundo argumento não é permitido"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "função \"%s\": o parâmetro \"%s\" sombreia uma variável global"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "impossível abrir \"%s\" para escrita (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "a enviar lista de variáveis para erro padrão"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: falha ao fechar (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() chamada duas vezes!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "houve variáveis sombreadas."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "nome de função \"%s\" previamente definido"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "função \"%s\": impossível usar o nome da função como nome de parâmetro"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"função \"%s\": impossível usar a variável especial \"%s\" como parâmetro da "
+"função"
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "função \"%s\": o parâmetro \"%s\" não pode conter um namespace"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "função \"%s\": o parâmetro nº %d, \"%s\", duplica o parâmetro nº %d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "função \"%s\" chamada, mas não foi definida"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "função \"%s\" definida, mas nunca é chamada directamente"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "constante regexp para o parâmetro nº %d entrega um valor booleano"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"função \"%s\" chamada com espaço entre o nome e \"(\",\n"
+"ou usada como variável ou matriz"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "tentativa de dividir por zero"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "tentativa de dividir por zero em \"%%\""
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"impossível atribuir um valor ao resultado de uma expressão de pós-incremento "
+"de campo"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "alvo de atribuição inválido (opcode %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+"identificador %s: nomes qualificados não são permitidos em modo tradicional/"
+"POSIX"
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+"identificador %s: o separador de espaços de nome é duplo dois-pontos, não "
+"dois-pontos único"
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr "identificador %s qualificado está mal formado"
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+"identificador %s: o separador de espaços de nome só pode aparecer uma vez "
+"num nome qualificado"
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr "não é permitido usar o identificador reservado %s como namespace"
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+"não é permitido usar o identificador reservado %s como 2º componente de nome "
+"qualificado"
+
+#: awkgram.y:6799
+msgid "@namespace is a gawk extension"
+msgstr "@namespace é uma extensão gawk"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+"nome do namespace \"%s\" tem de cumprir regras de nome de identificador"
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s para \"%s\" falhou (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "saída padrão"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "erro padrão"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: recebido argumento não-numérico"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: argumento %g fora do intervalo"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: impossível despejar: túnel \"%.*s\" aberto para leitura, não escrita"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: impossível despejar: ficheiro \"%.*s\" aberto para leitura, não "
+"escrita"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: impossível despejar ficheiro \"%.*s\": %s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: impossível despejar: túnel de duas vias \"%.*s\" fechou o lado de "
+"escrita"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: \"%.*s\" não é um ficheiro, túnel ou co-processo aberto"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: recebido 1º argumento não-cadeia"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: recebido 2º argumento não-cadeia"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: recebido argumento nã numérico"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: recebido argumento matriz"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "\"length(array)\" é uma extensão gawk"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: recebido argumento não-cadeia"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: recebido argumento não-numérico"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: recebido argumento %g negativo"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "fatal: tem de usar \"count$\" em todos os formatos ou em nenhum"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "largura de campo ignorada para especificador \"%%\""
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "precisão ignorada para especificador \"%%\""
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "largura de campo e precisão ignoradas para especificador \"%%\""
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fatal: \"$\" não é permitido em formatos awk"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fatal: total de argumentos com \"$\" tem de ser > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"fatal: total de argumentos %ld maior que o total de argumentos fornecidos"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fatal: \"$\" não permitido após um ponto no formato"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+"fatal: sem \"$\" fornecido para largura de campo ou precisão posicionais"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "\"l\" não tem significado em formatos awk; ignorado"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fatal: \"l\" não é permitido em formatos awk POSIX"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "\"L\" não tem significado em formatos awk; ignorado"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fatal: \"L\" não é permitido em formatos awk POSIX"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "\"h\" não tem significado em formatos awk; ignorado"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fatal: \"h\" não é permitido em formatos awk POSIX"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: valor %g muito grande para formato %%c"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: valor %g não é um carácter largo válido"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: valor %g fora do intervalo para formato \"%%%c\""
+
+#: builtin.c:1504
+#, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: valor %s fora do intervalo para formato \"%%%c\""
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr "o formato %%%c é padrão POSIX, mas não é portável para outros awks"
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"a ignorar carácter especificador de formato \"%c\" desconhecido: nenhum "
+"argumento convertido"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "fatal: argumentos insuficientes para satisfazer a cadeia de formato"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ esgotou-se para esta"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: especificador de formato não tem letra de controlo"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "demasiados argumentos para cadeia de formato"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: sem argumentos"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: sem argumentos"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"printf: tentativa de escrever no lado de escrita fechado de um túnel de duas "
+"vias"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: recebido argumento não-numérico"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: chamada com argumento %g negativo"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: tamanho %g não é >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: tamanho %g não é >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: tamanho não-inteiro %g será truncado"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+"substr: tamanho %g muito grande para indexação da cadeia, a truncar para %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: índice inicial %g inválido, a usar 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: índice inicial não-inteiro %g será truncado"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: cadeia-fonte tem tamanho zero"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: índice inicial %g está para lá do fim da cadeia"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: tamanho %g no índice inicial %g excede o tamanho do 1º argumento "
+"(%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime: valor de formato em PROCINFO[\"strftime\"] tem tipo numérico"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: recebido 2º argumento não-numérico"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: 2º argumento menor que 0 ou muito grande para time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: 2º argumento fora do intervalo para time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: recebido 1º argumento não-cadeia"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: recebida cadeia de formato vazia"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: recebido argumento não-cadeia"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: pelo menos um dos valores está fora do intervalo predefinido"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "função \"system\" não permitida em modo sandbox"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: recebido argumento não-cadeia"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"print: tentativa de escrever no lado de escrita fechado de um túnel de duas "
+"vias"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "referência a campo não inicializado \"$%d\""
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: recebido argumento não-cadeia"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: recebido argumento não-cadeia"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: recebido 1º argumento não-numérico"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: recebido 2º argumento não-numérico"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: recebido argumento não-numérico"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: recebido argumento não-numérico"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: recebido argumento não-numérico"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: o 3º argumento não é uma matriz"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: 3º argumento \"%.*s\" tratado como 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: pode ser chamada indirectamente só com dois argumentos"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "chamada indirecta a %s requer pelo menos dois argumentos"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: recebido 1º argumento não-numérico"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: recebido 2º argumento não-numérico"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): não são permitidos valores negativos"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): valores fraccionais serão truncados"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"lshift(%f, %f): um valor de deslocamento muito grande dará resultados "
+"estranhos"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: recebido 1º argumento não-numérico"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: recebido 2º argumento não-numérico"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): não são permitidos valores negativos"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): valores fraccionais serão truncados"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"rshift(%f, %f): um valor de deslocamento muito grande dará resultados "
+"estranhos"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: chamada com menos de dois argumentos"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: argumento %d é não-numérico"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: valor negativo do argumento %d %g não é permitido"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: chamada com menos de dois argumentos"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: argumento %d é não-numérico"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: valor negativo do argumento %d %g não é permitido"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: chamada com menos de dois argumentos"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: argumento %d é não-numérico"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: valor negativo do argumento %d %g não é permitido"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: recebido argumento não-numérico"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): valor negativo não é permitido"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): valores fraccionais serão truncados"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: \"%s\" não é uma categoria regional válida"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv: 3º argumento não é uma matriz"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv: recebido 1º argumento não-numérico"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv: recebido 2º argumento não-numérico"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv: tentativa de dividir por zero"
+
+#: builtin.c:4046
+msgid "typeof: second argument is not an array"
+msgstr "typeof: 2º argumento não é uma matriz"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+"typeof detectou uma combinação de bandeira \"%s\" inválida; por favor, faça "
+"um relatório de erro."
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof: tipo de argumento \"%s\" inválido"
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof: tipo de argumento \"%s\" desconhecido"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Digite a(s) declaração(ões) (g)awk. Termine com o comando \"end\"\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "número de quadro errado: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: opção inválida - \"%s\""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\": já baseado."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": comando não permitido."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+"Impossível usar o comando \"commands\" para comandos breakpoint/watchpoint"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "sem breakpoint/watchpoint definidos"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "número de breakpoint/watchpoint inválido"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Digite comandos para quando %s %d for premido, um por linha.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Termine com o comando \"end\"\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "\"end\" só é válido no comando \"commands\" ou \"eval\""
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "\"silent\" só é válido no comando \"commands\""
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: opção inválida - \"%s\""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: número de  breakpoint/watchpoint inválido"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "argumento não-cadeia"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "opção: parâmetro inválido - \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "sem tal função - \"%s\""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: opção inválida - \"%s\""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "especificação de intervalo inválida: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "valor não-numérico em número de campo"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "valor não-numérico encontrado, esperado um número"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "valor inteiro não-zero"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - imprime traço de todos ou N mais interior (mais exterior se "
+"N < 0) os quadros."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[nomefich:]N|função] - define breakpoint na localização especificada."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+"clear [[nomefich:]N|função] - elimina breakpoints anteriormente definidos."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [núm] - inicia uma lista de comandos a executar num "
+"breakpoint(watchpoint)."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition núm [expr] - define ou limpa condição de breakpoint ou watchpoint."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [COUNT] - continua o programa em depuração."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+"delete [breakpoints] [intervalo] - elimina os breakpoints especificados."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+"disable [breakpoints] [intervalo] - desactiva os breakpoints especificados."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+"display [var] - imprime o valor da variável cada vez que o programa pára."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - move N quadros abaixo na pilha."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr "dump [filename] - despeja instruções para ficheiro ou stdout."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [breakpoints] [intervalo] - activa os breakpoints "
+"especificados."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - termina uma lista de comandos ou declarações awk."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval stmt|[p1, p2, ...] - avalia declarações awk."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (igual a quit) sai do depurador."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - executa até que o quadro da pilha seleccionado retorne."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - selecciona e imprime o quadro da pilha número N."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+"help [command] - imprime uma lista de comandos ou a explicação de um comando."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr "ignore N CONT - define ignore-count do breakpoint número N como CONT."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info tópico - fonte|fontes|variáveis|funções|quebra|quadro|argumentos|locais|"
+"mostrar|observar."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[nomefich:]numlin|função|intervalo] - lista as linhas "
+"especificadas."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+"next [CONT] - executa o programa, continuando pelas chamadas a sub-rotinas."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [CONT] - executa uma instrução, mas continuando pelas chamadas a sub-"
+"rotinas."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [nome[=valor]] - define ou mostra opções do depurador."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [var] - imprime o valor de uma variável ou matriz."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf format, [arg], ... - saída formatada."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - sai do depurador."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+"return [value] - faz com que o quadro da pilha seleccionado retorne ao seu "
+"chamador."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - começa ou reinicia a execução do programa."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save nomefich - grava os comandos da sessão no ficheiro."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set var = valor - atribui um valor a uma variável escalar."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - suspende a mensagem habitual quando parado num breakpoint/"
+"watchpoint."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source ficheiro - executa comandos a partir do ficheiro."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [CONT] - executa o programa até que atinja uma linha fonte diferente."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [CONT] - executa exactamente uma instrução."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[nomefich:]N|função] - define um breakpoint temporário."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - imprime a instrução antes de a executar."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr "undisplay [N] - remove variáveis da lista de exibição automática."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[nomefich:]N|função] - executa até o programa atingir uma linha "
+"diferente ou até à linha N dentro do quadro actual."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - remove variáveis da lista de observação."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - move N quadros acima na pilha."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch var - define um watchpoint para uma variável."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where [N] - (igual a backtrace) imprime o traço de todos ou N mais interior "
+"(mais exterior se N < 0) os quadros."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "impossível ler o comando (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "impossível ler o comando (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "carácter inválido no comando"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "comando desconhecido - \"%.*s\", tente help"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "carácter inválido"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "comando indefinido: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr "define ou mostra o número de linhas a manter no ficheiro de histórico."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "define ou mostra o tamanho da janela do comando de lista"
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "define ou mostra o ficheiro de saída do gawk."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "define ou mostra a entrada do depurador."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+"define/remove ou mostra a gravação do histórico de comandos (valor=on|off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "define/remove ou mostra a gravação de opções (valor=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "define/remove ou mostra o traço de instruções (valor=on|off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "programa não em execução."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "impossível ler ficheiro-fonte \"%s\" (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "ficheiro-fonte \"%s\" vazio.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "sem ficheiro-fonte actual."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "impossível encontrar ficheiro-fonte chamado \"%s\" (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+"AVISO: ficheiro-fonte \"%s\" modificado desde a compilação do programa.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "número de linha %d fora do intervalo; \"%s\" tem %d linhas"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "eof inesperado ao ler \"%s\", linha %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr ""
+"ficheiro-fonte \"%s\" modificado desde o início da execução do programa"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Ficheiro-fonte actual: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Número de linhas: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Ficheiro-fonte (linhas): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Número  Most  Activas  Localiz.\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tnº de hits = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tignora %ld hit(s) seguintes\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tcondição de paragem: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tcomandos:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Quadro actual: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Chamada pelo quadro: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Chamador do quadro: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Nada em main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Sem argumentos.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Sem locais.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Todas as variáveis definidas:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Todas as funções definidas:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Mostrar variáveis automaticamente:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Observar variáveis: \n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "sem símbolo \"%s\" no contexto actual\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "\"%s\" não é uma matriz\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = campo não inicializado\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "matriz \"%s\" está vazia\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%.*s\"] não está na matriz \"%s\"\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "'%s[\"%.*s\"]' não é uma matriz\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "\"%s\" não é uma variável escalar"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "tentativa de usar matriz '%s[\"%.*s\"]' num contexto escalar"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "tentativa de usar o escalar '%s[\"%.*s\"]' como matriz"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "\"%s\" é uma função"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "watchpoint %d é incondicional\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "Sem item de exibição numerado %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Sem item de observação numerado %ld"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%.*s\"] não está na matriz \"%s\"\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "tentativa de usar valor escalar como matriz"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr "Watchpoint %d eliminado por o parâmetro estar fora do âmbito.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "Exibição %d eliminada por o parâmetro estar fora do âmbito.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " no ficheiro \"%s\", linha %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " em 2%s\":%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tem "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Seguem-se mais quadros da pilha...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "número de quadro inválido"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: breakpoint %d (activo, ignora %ld hits seguintes), também definido em "
+"%s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Nota: breakpoint %d (activo), também definido em %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: breakpoint %d (inactivo, ignora %ld hits seguintes), também definido "
+"em %s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Nota: breakpoint %d (inactivo), também definido em %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Breakpoint %d definido no ficheiro \"%s\", linha %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "Impossível definir breakpoint no ficheiro \"%s\"\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "número de linha %d no ficheiro \"%s\" fora do intervalo"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Impossível encontrar a regra!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "Impossível definir breakpoint em \"%s\":%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Impossível definir breakpoint na função \"%s\"\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "breakpoint %d definido no ficheiro \"%s\", linha %d é incondicional\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Breakpoint %d eliminado"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "Sem breakpoints na entrada da função \"%s\"\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Sem breakpoint no ficheiro \"%s\", linha %d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "Número de breakpoint inválido"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Eliminar todos os breakpoints? (s ou n) "
+
+# I'm assuming this is the translation of the 'y' from the previous string.
+#
+# Presume-se que esta cadeia seja a tradução do "y" da cadeia anterior.
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "s"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Vai ignorar os %ld cruzamentos seguintes do breakpoint %d.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "Vai parar da próxima vez que o breakpoint %d seja atingido.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "Só se pode depurar programas indicando a opção \"-f\".\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Falha ao reiniciar o depurador"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Programa já em execução. Recomeçar do início (y/n)? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Programa não reiniciado\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "erro: impossível reiniciar, operação não permitida\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "erro (%s): impossível reiniciar, a ignorar o resto dos comandos\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "A iniciar o programa: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "O programa saiu anormalmente com o código %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "O programa saiu normalmente com o código %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "O programa está em execução. Sair mesmo assim (y/n)? "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Não parado em nenhum breakpoint; argumento ignorado.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "número de breakpoint %d inválido."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Vai ignorar os %ld cruzamentos seguintes do breakpoint %d.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "\"finish\" não tem significado no quadro main() mais exterior\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Executar até voltar de "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "\"return\" não tem significado no quadro main() mais exterior\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "Impossível encontrar a localização especificada na função \"%s\"\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "linha fonte %d inválida no ficheiro \"%s\""
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr ""
+"Impossível encontrar a localização especificada %d no ficheiro \"%s\"\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "elemento não está na matriz\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "variável sem tipo\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "A parar em %s...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "\"finish\" sem significado com salto não-local \"%s\"\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "\"until\" sem significado com salto não-local \"%s\"\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t------[Enter] para continuar ou q [Enter] para sair------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] não está na matriz \"%s\""
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "a enviar saída para stdout\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "número inválido"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "\"%s\" não permitido no contexto actual; declaração ignorada"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "\"return\" não permitido no contexto actual; declaração ignorada"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Sem símbolo \"%s\" no contexto actual"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "nodetype %d desconhecido"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "opcode %d desconhecido"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "opcode %s não é um operador ou palavra-chave"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "transporte de buffer em genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Pilha de chamadas de função:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "\"IGNORECASE\" é uma extensão gawk"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "\"BINMODE\" é uma extensão gawk"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "valor BINMODE \"%s\" inválido, tratado como 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "má \"%sFMT\" especificação \"%s\""
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "a desligar \"--lint\" devido a atribuição a \"LINT\""
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "referência a argumento \"%s\" não inicializado"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "referência a variável \"%s\" não inicializada"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "tentativa de referenciar campo a partir de valor não-numérico"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "tentativa de referenciar campo a partir de cadeia nula"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "tentativa de aceder ao campo %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "referência a campo \"$%ld\" não inicializado"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "função \"%s\" chamada com mais argumentos do que os declarados"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: tipo \"%s\" inesperado"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "tentativa de dividir por zero em \"/=\""
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "tentativa de dividir por zero em \"%%=\""
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "não são permitidas extensões em modo sandbox"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l/@load são extensões gawk"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: recebido NULL lib_name"
+
+#: ext.c:60
+#, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: impossível abrir biblioteca \"%s\" (%s)"
+
+#: ext.c:66
+#, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: biblioteca \"%s\": não define \"plugin_is_GPL_compatible\" (%s)"
+
+#: ext.c:72
+#, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: biblioteca \"%s\": impossível chamar a função \"%s\" (%s)"
+
+#: ext.c:76
+#, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: biblioteca \"%s\": rotina de inicialização \"%s\" falhou"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: nome de função em falta"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: impossível usar \"%s\" interna do gawk como nome de função"
+
+#: ext.c:109
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: impossível usar \"%s\" interna do gawk como nome de namespace"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: impossível redefinir função \"%s\""
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: função \"%s\" já definida"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: nome de função \"%s\" anteriormente definido"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: total de argumentos negativo para a função \"%s\""
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+"função \"%s\": argumento nº %d: tentativa de usar um escalar como matriz"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr ""
+"função \"%s\": argumento nº %d: tentativa de usar uma matriz como escalar"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "carregamento dinâmico de biblioteca não suportado"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: impossível ler ligação simbólica \"%s\""
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: maus parâmetros"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init: impossível criar variável %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "fts não suportado neste sistema"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: impossível criar matriz"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: impossível definir elemento"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: impossível definir elemento"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: impossível definir elemento"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: impossível criar matriz"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: impossível definir elemento"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: chamada com número incorrecto de argumentos, esperados 3"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: mau 1º parâmetro"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: mau 2º parâmetro"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: mau 3º parâmetro"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: impossível aplanar matriz\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: a ignorar bandeira FTS_NOSTAT furtiva. nyah, nyah, nyah."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() falhou\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: impossível obter o 1º argumento"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: impossível obter o 2º argumento"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: impossível obter o 3º argumento"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch não está implementado neste sistema\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: impossível adicionar a variável FNM_NOMATCH"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: impossível definir elemento de matriz %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: impossível instalar matriz FNM"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO não é uma matriz!"
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace::begin: edição in-loco já está activa"
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace::begin: espera 2 argumentos, mas foi chamado com %d"
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace::begin: impossível obter o 1º argumento como nome de ficheiro de "
+"cadeia"
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace::begin: a desactivar edição in-loco para NOMEFICH \"%s\" inválido"
+
+#: extension/inplace.c:152
+#, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace::begin: impossível analisar \"%s\" (%s)"
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace::begin: \"%s\" não é um ficheiro normal"
+
+#: extension/inplace.c:170
+#, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace::begin: mkstemp(`%s') falhou (%s)"
+
+#: extension/inplace.c:182
+#, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace::begin: chmod falhou (%s)"
+
+#: extension/inplace.c:189
+#, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace::begin: dup(stdout) falhou (%s)"
+
+#: extension/inplace.c:192
+#, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::begin: dup2(%d, stdout) falhou (%s)"
+
+#: extension/inplace.c:195
+#, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace::begin: close(%d) falhou (%s)"
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace::end: espera 2 argumentos, mas foi chamado com %d"
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace::end: impossível obter o 1º argumento como nome de ficheiro de cadeia"
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace::end: edição in-loco não activa"
+
+#: extension/inplace.c:227
+#, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::end: dup2(%d, stdout) falhou (%s)"
+
+#: extension/inplace.c:230
+#, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace::end: close(%d) falhou (%s)"
+
+#: extension/inplace.c:234
+#, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace::end: fsetpos(stdout) falhou (%s)"
+
+#: extension/inplace.c:247
+#, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace::end: link(`%s', `%s') falhou (%s)"
+
+#: extension/inplace.c:257
+#, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace::end: rename(`%s', `%s') falhou (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: chamada com argumentos inapropriados"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: chamada com argumentos inapropriados"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir falhou: %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: chamada com tipo de argumento errado"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: impossível inicializar a variável REVOUT"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: argumento 0 não é uma cadeia\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: argumento 1 não é uma matriz\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: impossível aplanar a matriz\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: impossível libertar a matriz aplanada\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "valor de matriz tem um tipo %d desconhecido"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: argumento 0 não é uma cadeia\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: argumento 1 não é uma matriz\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array falhou\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element falhou\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+"a tratar o valor recuperado com tipo desconhecido de código %d como cadeia"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: não suportado nesta plataforma"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: argumento numérico requerido em falta"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: argumento é negativo"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: não suportado nesta plataforma"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "registo de entrada muito grande"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF definido como valor negativo"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr "decrementar NF não é portável para muitas versões awk"
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr "aceder a campos a partir de uma regra END pode não ser portável"
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: o 4º argumento é uma extensão gawk"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: o 4º argumento não é uma matriz"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: 2º argumento não é uma matriz"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr "split: impossível usar a mesma matriz para 2º e 4º argumentos"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: impossível usar uma sub-matriz do 2º argumento como 4º argumento"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: impossível usar uma sub-matriz do 4º argumento como 2º argumento"
+
+#: field.c:1036
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: cadeia nula para 3º argumento é uma extensão não-padrão"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: o 4º argumento não é uma matriz"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: o 2º argumento não é uma matriz"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: o 3º argumento não pode ser nulo"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr "patsplit:  impossível usar a mesma matriz para 2º e 4º argumentos"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: impossível usar uma sub-matriz do 2º argumento como 4º argumento"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: impossível usar uma sub-matriz do 4º argumento como 2º argumento"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "\"FIELDWIDTHS\" é uma extensão gawk"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "\"*\" tem de ser o último designador em FIELDWIDTHS"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "valor FIELDWIDTHS inválido, para o campo %d, perto de \"%s\""
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "cadeia nula para \"FS\" é uma extensão gawk"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "o awk antigo não suporta regexps como valores de \"FS\""
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "\"FPAT\" é uma extensão gawk"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: recebido retval nulo"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: não está em modo MPFR"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: MPFR não suportado"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: tipo de número \"%d\" inválido"
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "add_ext_func: recebido parâmetro name_space NULL"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+"node_to_awk_value: detectada combinação de bandeiras numéricas \"%s\" "
+"inválida; por favor, faça um relatório de erro."
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: recebido nó nulo"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: recebido valor nulo"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+"node_to_awk_value: detectada combinação de bandeiras \"%s\" inválida; por "
+"favor, faça um relatório de erro."
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: recebida matriz nula"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: recebido subscrito nulo"
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array_typed: impossível converter índice %d para %s"
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array_typed:  impossível converter valor %d para %s"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr: MPFR não suportado"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "impossível encontrar o fim da regra BEGINFILE"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "impossível abrir tipo de ficheiro \"%s\" desconhecido para \"%s\""
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "argumento de linha de comandos \"%s\" é uma pasta: saltado"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "impossível abrir o ficheiro \"%s\" para leitura (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "fecho de fd %d (\"%s\") falhou (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "redireccionamento não permitido em modo sandbox"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "expressão em redireccionamento \"%s\" é um número"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "expressão para redireccionamento \"%s\" tem um valor de cadeia nulo"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"nome de ficheiro \"%.*s\" para redireccionamento \"%s\" pode ser o resultado "
+"de uma expressão lógica"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "mistura desnecessária de \">\" e \">>\" para o ficheiro \"%.*s\""
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file não pode criar túnel \"%s\" com fd %d"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "impossível abrir túnel \"%s\" para saída (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "impossível abrir túnel \"%s\" para entrada (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"criação de socket get_file não suportada nesta plataforma para \"%s\" com fd "
+"%d"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "impossível abrir túnel de duas vias \"%s\" para entrada/saída (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "impossível redireccionar de \"%s\" (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "impossível redireccionar para \"%s\" (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"atingido o limite do sistema para ficheiros abertos: a iniciar a "
+"multiplexagem de descritores de ficheiros"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "falha ao fechar \"%s\" (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "demasiados túneis ou ficheiros de entrada abertos"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: o 2º argumento tem de ser \"to\" ou \"from\""
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: \"%.*s\" não é um ficheiro, túnel ou co-processo aberto"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "fecho de redireccionamento que nunca aconteceu"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: redireccionamento \"%s\" não aberto com \"|&\", 2º argumento ignorado"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "estado da falha (%d) ao fechar túnel \"%s\" (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "estado da falha (%d) ao fechar ficheiro \"%s\" (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "sem fecho de socket \"%s\" específico fornecido"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "sem fecho de co-processo \"%s\" específico fornecido"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "sem fecho de túnel \"%s\" específico fornecido"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "sem fecho de ficheiro \"%s\" específico fornecido"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush: impossível despejar a saída padrão: %s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush: impossível despejar o erro padrão: %s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "erro ao escrever na saída padrão (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "erro ao escrever no erro padrão (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "falhou o despejo de túnel \"%s\" (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "falhou o despejo de co-processo \"%s\" (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "falhou o despejo de ficheiro \"%s\" (%s)."
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "porta local %s inválida em \"/inet\": %s"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "porta local %s inválida em \"/inet\""
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "informação de anfitrião remoto e porta (%s, %s) inválidas: %s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "informação de anfitrião remoto e porta (%s, %s) inválidas"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "comunicações TCP/IP não suportadas"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "impossível abrir \"%s\", modo \"%s\""
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "falha ao fechar pty mestre (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "falha ao fechar stdout em filho (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr "falha ao mover pty escravo para stdout em filho (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "falha ao fechar stdin em filho (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr "falha ao mover pty escravo para stdin em filho (dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "falha ao fechar pty escravo (%s)"
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr "impossível criar processo-filho ou pty aberto"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr "falha ao mover túnel para stdout em filho (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr "falha ao mover túnel para stdin em filho (dup: %s)"
+
+#: io.c:2386 io.c:2655
+msgid "restoring stdout in parent process failed"
+msgstr "falha ao restaurar stdout em processo-mãe"
+
+#: io.c:2394
+msgid "restoring stdin in parent process failed"
+msgstr "falha ao restaurar stdin em processo-mãe"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "falha ao fechar túnel (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "\"|&\" não suportado"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "impossível abrir túnel \"%s\" (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "impossível criar processo-filho para \"%s\" (bifurcação: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+"getline: tentativa de ler do lado de leitura fechado de um túnel de duas vias"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: recebido ponteiro NULL"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"processador de entrada \"%s\" conflitua com o processador de entrada \"%s\" "
+"anteriormente instalado"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "processador de entrada \"%s\" falhou ao abrir \"%s\""
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: recebido ponteiro NULL"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"invólucro de saída \"%s\" conflitua com o invólucro de saída \"%s\" "
+"anteriormente instalado"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "invólucro de saída \"%s\" falhou ao abrir \"%s\""
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: recebido ponteiro NULL"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"processador de duas vias \"%s\" conflitua com o processador de duas vias \"%s"
+"\" anteriormente instalado"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "processador de duas vias \"%s\" falhou ao abrir \"%s\""
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "ficheiro de dados \"%s\" está vazio"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "impossível alocar mais memória de entrada"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "valor multi-carácter de \"RS\" é uma extensão gawk"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "comunicação IPv6 não suportada"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr "variável de ambiente \"POSIXLY_CORRECT\" definida: a ligar \"--posix\""
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "\"--posix\" sobrepõe-se a \"--traditional\""
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "\"--posix\"/\"--traditional\" sobrepõe-se a \"--non-decimal-data\""
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "\"--posix\" sobrepõe-se a \"--characters-as-bytes\""
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "executar %s setuid root pode ser um problema de segurança"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "impossível definir o modo binário em stdin (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "impossível definir o modo binário em stdout (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "impossível definir o modo binário em stderr (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "sem texto de programa!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"Uso: %s [opções de estilo POSIX ou GNU] -f fichprog [--] ficheiro ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+"Uso: %s [opções de estilo POSIX ou GNU] [--] %cprograma%c ficheiro ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "Opções POSIX:\t\topções longas GNU: (padrão)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f fichprog\t\t--file=fichprog\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=val\t\t--assign=var=val\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Opções curtas:\t\topções longas GNU: (extensões)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[fich]\t\t--dump-variables[=fich]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[fich]\t\t--debug[=fich]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'program-text'\t--source='program-text'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E fich\t\t\t--exec=fich\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i fichinclude\t\t--include=fichinclude\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l biblioteca\t\t--load=biblioteca\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[fich]\t\t--pretty-print[=fich]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[fich]\t\t--profile[=fich]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr "\t-Z nome-idioma\t\t--locale=nome-idioma\n"
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Para reportar erros, veja o nó \"Bugs\" em \"gawk.info\"\n"
+"que é a secção \"Reporting Problems and Bugs\" na versão\n"
+"impressa. Esta mesma informação pode ser encontrada em\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"POR FAVOR NÃO tente reportar erros através de comp.lang.awk,\n"
+"\n"
+"ou usando um fórum web como o Stack Overflow.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"O gawk é uma linguagem de análise e processamento de padrões.\n"
+"Por predefinição, lê da entrada padrão e escreve na saída padrão.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Exemplos:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' ficheiro\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Este é um programa grátis: pode redistribuí-lo e/ou modificá-lo.\"\n"
+"sob os termos da GNU General Public License tal como publicada pela\n"
+"Free Software Foundation; seja a versão 3 da License, ou\n"
+"(à sua escolha) qualquer versão posterior.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Este programa é distribuído na esperança de ser útil, mas\n"
+"sem QUALQUER GARANTIA; nem mesmo a garantia implícita de\n"
+"COMERCIALIZAÇÃO ou CONFORMIDADE PARA UM DETERMINADO FIM.\n"
+"Veja a GNU General Public License para mais detalhes.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Deverá ter recebido uma cópia da GNU General Public License\n"
+"juntamente com este programa. Se não recebeu, veja http://www.gnu.org/"
+"licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft não define FS para tabulação em awk POSIX"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: argumento \"%s\" para \"-v\" não está no formato \"var=valor\"\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "\"%s\" não é um nome de variável legal"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "\"%s\" não é um nome de variável, a procurar o ficheiro \"%s=%s\""
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "impossível usar \"%s\" interna do gawk como nome de variável"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "impossível usar a função \"%s\" como nome de variável"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "excepção de vírgula flutuante"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "erro fatal: erro interno"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "erro fatal: erro interno: segfault"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "erro fatal: erro interno: transporte de pilha"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "sem fd %d pré-aberto"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "impossível pré-abrir /dev/null para fd %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "argumento vazio para \"-e/--source\" ignorado"
+
+#: main.c:1662 main.c:1667
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "\"--profile\" sobrepõe-se a \"--pretty-print\""
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M ignorado: suporte a MPFR/GMP não compilado"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: opção \"-W %s\" não reconhecida, ignorado\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: a opção requer um argumento -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "valor PREC \"%.*s\" inválido"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "valor RNDMODE \"%.*s\" inválido"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: recebido argumento não-numérico"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): valor negativo não permitido"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "comp(%Rg): valor fraccional será truncado"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): valores negativos não permitidos"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: recebido argumento não-numérico nº %d"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: argumento nº %d tem valor %Rg inválido, a usar 0"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: argumento nº %d com valor %Rg negativo não é permitido"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: argumento nº %d valor %Rg fraccional será truncado"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: argumento nº %d com valor %Zd negativo não é permitido"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "linha de comandos:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "impossível fazer regexp digitada"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "o awl antigo não suporta a sequência de escape \"\\%c\""
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX não permite escapes \"\\x\""
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "sem dígitos hexadecimais na sequência de escape \"\\x\""
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"escape hexadecimal \\x%.*s de %d caracteres provavelmente não será "
+"interpretado da forma esperada"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "sequência de escape \"\\%c\" tratada como \"%c\" simples"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Detectados dados multi-byte inválidos. Pode haver confusão entre os dados e "
+"as definições regionais."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s \"%s\": impossível obter bandeiras fd: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s \"%s\": impossível definir close-on-exec: (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+"Nível de indentação do programa muito profundo. Considere re-fabricar o "
+"código"
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "impossível abrir \"%s\" para escrita: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "a enviar perfil para erro padrão"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s regra(s)\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regra(s)\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "erro interno: %s com vname nulo"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "erro interno: interno com fname nulo"
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"%s# Extensões carregadas (-l e/ou @load)\n"
+"\n"
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\n"
+"# Ficheiros incluídos (-i e/ou @include)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# perfil gawk, criado %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funções, listadas alfabeticamente\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: tipo de redireccionamento %d desconhecido"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+"o comportamento de comparação de uma regexp contendo caracteres NUL não é "
+"definido pelo POSIX"
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr "byte NUL inválido em regexp dinâmica"
+
+#: re.c:172
+#, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "sequência de escape de regexp \"\\%c\" tratada como \"%c\" simples"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+"sequência de escape de regexp \"\\%c\" não é um operador regexp conhecido"
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "componente regexp \"%.*s\" provavelmente deveria ser \"[%.*s]\""
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "[ sem par"
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "classe de carácter inválida"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "a sintaxe da classe de carácter é [[:espaço:]], não [:espaço:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "escape \\ não terminado"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "conteúdo de \\{\\} inválido"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "expressão regular muito grande"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "( sem par"
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "sem sintaxe especificada"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ") sem par"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: opção \"%s\" é ambígua; possibilidades:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: a opção \"--%s\" não permite um argumento\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: a opção \"%c%s\" não permite um argumento\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: a opção \"--%s\" requer um argumento\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: opção não reconhecida \"--%s\"\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: opção não reconhecida \"%c%s\"\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opção inválida -- \"%c\"\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: a opção requer um argumento -- \"%c\"\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: a opção \"-W %s\" é ambígua\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: a opção \"-W %s\" não permite argumentos\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: a opção \"-W %s\" requer um argumento\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Sucesso"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Sem correspondência"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expressão regular inválida"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Carácter de agrupamento inválido"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nome de classe de carácter inválido"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barra invertida final"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Referência de recuo inválida"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [., ou [= sem par"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( ou \\( sem par"
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ sem par"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Conteúdo de \\{\\} inválido"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Fim de intervalo inválido"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memória esgotada"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Expressão regular precedente inválida"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fim prematuro de expressão regular"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Expressão regular muito grande"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") ou \\) sem par"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Sem expressão regular anterior"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "função \"%s\": impossível usar a função \"%s\" como nome de parâmetro"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "impossível abrir o contexto principal"
diff --git a/gawk-5.0.1/po/pt_BR.po b/gawk-5.0.1/po/pt_BR.po
new file mode 100644
index 00000000000..559e135f748
--- /dev/null
+++ b/gawk-5.0.1/po/pt_BR.po
@@ -0,0 +1,4115 @@
+# Brazilian Portuguese translation for gawk package
+# Traduções em português brasileiro para o pacote gawk
+# Copyright (C) 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Juan Carlos Castro y Castro <jcastro@vialink.com.br>, 2003.
+# Rafael Fontenelle <rafaelff@gnome.org>, 2017-2019.
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.2.63\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2019-03-07 08:07-0200\n"
+"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
+"Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
+"net>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Virtaal 1.0.0-beta1\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "de %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "tentativa de usar valor escalar como vetor"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "tentativa de usar parâmetro escalar \"%s\" como um vetor"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "tentativa de usar escalar \"%s\" como um vetor"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "tentativa de usar vetor \"%s\" em um contexto escalar"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: índice \"%.*s\" não está no vetor \"%s\""
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "tentativa de usar escalar '%s[\"%.*s\"]' em um vetor"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: primeiro argumento não é um vetor"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: segundo argumento não é um vetor"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: segundo argumento não é um vetor"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: primeiro argumento não é um vetor"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: primeiro argumento não é um vetor"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: não é possível usar um subvetor do primeiro arg para o segundo arg"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: não é possível usar um subvetor do primeiro arg para o segundo arg"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: não é possível usar um subvetor do segundo arg para o primeiro arg"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: não é possível usar um subvetor do segundo arg para o primeiro arg"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "\"%s\" é inválido como um nome de função"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "a função de comparação de ordem \"%s\" não está definida"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "blocos %s devem ter uma parte de ação"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "cada regra deve ter um padrão ou uma parte de ação"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr ""
+"o velho awk não oferece suporte regras múltiplas de \"BEGIN\" ou \"END\""
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "\"%s\" é uma função intrínseca, não pode ser redefinida"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr ""
+"a constante de expr. reg. \"//\" parece ser um comentário C++, mas não é"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr ""
+"a constante de expr. reg. \"/%s/\" parece ser um comentário C, mas não é"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "valores de case duplicados no corpo do switch: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "\"default\" duplicados detectados no corpo do switch"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "\"break\" não é permitido fora um loop ou switch"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "\"continue\" não é permitido fora de um loop"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "\"next\" usado na ação %s"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "\"nextfile\" usado na ação %s"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "\"return\" usado fora do contexto de função"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"\"print\" sozinho em regra BEGIN ou END provavelmente deveria ser 'print "
+"\"\"'"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "\"delete\" não é permitido com SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "\"delete\" não é permitido com FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "\"delete(array)\" é uma extensão não portável do tawk"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "pipelines bidirecionais de múltiplos estágios não funcionam"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr "concatenação como alvo de redirecionamento de E/S \">\" é amgíguo"
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "expressão regular à direita de atribuição"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "expressão regular à esquerda de operador \"~\" ou \"!~\""
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr ""
+"o velho awk não oferece suporte à palavra-chave \"in\", exceto após \"for\""
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "expressão regular à direita de comparação"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "\"getline\" não redirecionado inválido dentro da regra \"%s\""
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "\"getline\" não redirecionado indefinido dentro da ação END"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "o velho awk não oferece suporte a vetores multidimensionais"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "chamada de \"length\" sem parênteses não é portável"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "chamadas indiretas de função são uma extensão do gawk"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"não é possível usar a variável especial \"%s\" para chamada indireta de "
+"função"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "tentativa de usar não função \"%s\" em chamada de função"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "expressão de índice inválida"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "aviso: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "fatal: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "nova linha ou fim de string inesperado"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+"arquivos-fonte/argumentos de linha de comando devem conter funções ou regras "
+"completas"
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "não foi possível abrir arquivo-fonte \"%s\" para leitura (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr ""
+"não foi possível abrir a biblioteca compartilhada \"%s\" para leitura (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "motivo desconhecido"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "não é possível incluir \"%s\" e usá-lo como um arquivo de programa"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "arquivo-fonte \"%s\" já incluso"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "biblioteca compartilhada \"%s\" já carregada"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include é uma extensão do gawk"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "nome de arquivo vazio após @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load é uma extensão do gawk"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "nome de arquivo vazio após @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "texto de programa vazio na linha de comando"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "não foi possível ler arquivo-fonte \"%s\" (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "arquivo-fonte \"%s\" está vazio"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "erro PEBKAC: caractere inválido \"\\%03o\" no código-fonte"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "arquivo-fonte não termina em nova linha"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "expressão regular inacabada termina com \"\\\" no fim do arquivo"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "%s: %d: modificador tawk regex \"/../%c\" não funciona no gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "modificador tawk regex \"/../%c\" não funciona no gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "expressão regular inacabada"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "expressão regular inacabada no fim do arquivo"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "uso da continuação de linha \"\\ #...\" não é portável"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "barra invertida não é o último caractere da linha"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "vetores multidimensionais são é uma extensão do gawk"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX não permite o operador \"**=\""
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "o velho awk não oferece suporte ao operador \"**=\""
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX não permite o operador \"**\""
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "o velho awk não oferece suporte ao operador \"**\""
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "sem suporte ao operador `^=' no velho awk"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "sem suporte ao operador \"^\" no velho awk"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "string inacabada"
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX não permite novas linhas físicas em valores de string"
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr "continuação de string com barra invertida não é portável"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "caractere inválido \"%c\" em expressão"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "\"%s\" é uma extensão do gawk"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX não permite \"%s\""
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "não há suporte a \"%s\" no velho awk"
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr "\"goto\" é considerado danoso!"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d é inválido como número de argumentos para %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s: string literal como último argumento de substituição não tem efeito"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "terceiro parâmetro %s não é um objeto modificável"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: terceiro argumento é uma extensão do gawk"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: segundo argumento é uma extensão do gawk"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "uso de dcgettext(_\"...\") é incorreto: remova o sublinhado precedente"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"uso de dcngettext(_\"...\") é incorreto: remova o sublinhado precedente"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: constante de exp. reg. como segundo argumento não é permitido"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "função \"%s\": parâmetro \"%s\" encobre variável global"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "não foi possível abrir \"%s\" para escrita (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "enviando lista de variáveis para saída de erro padrão"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: \"close\" falhou (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() chamada duas vezes!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "houve variáveis encobertas."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "nome de função \"%s\" definido anteriormente"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr ""
+"função \"%s\": não é possível usar o nome da função como nome de parâmetro"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"função \"%s\": não é possível usar a variável especial \"%s\" como um "
+"parâmetro de função"
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "função \"%s\": parâmetro \"%s\" não pode conter um espaço de nome"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "função \"%s\": parâmetro nº %d, \"%s\", duplica parâmetro nº %d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "função \"%s\" chamada, mas nunca definida"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "função \"%s\" definida, mas nunca chamada diretamente"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "constante com expr. reg. para parâmetro nº %d retorna valor booleano"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"função \"%s\" chamada com espaço entre o nome e o \"(\",\n"
+"ou usada como uma variável ou um vetor"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "tentativa de divisão por zero"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "tentativa de divisão por zero em \"%%\""
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"não é possível atribuir um valor ao resultado de uma expressão de campo pós-"
+"incremento"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "alvo de atribuição inválido (código de operação %s)o"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+"identificador %s: nomes qualificados não são permitidos no modo POSIX / "
+"tradicional"
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+"identificador %s: separador de espaço de nome é dois caracteres de dois "
+"pontos, e não um"
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr "identificador qualificado \"%s\" está malformado"
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+"identificador \"%s\": separador de espaço de nome só pode aparecer uma vez "
+"em um nome qualificado"
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+"o uso de identificador reservado \"%s\" como um espaço de nome não é "
+"permitido"
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+"o uso de identificador reservado \"%s\" como segundo componente de um nome "
+"qualificado não é permitido"
+
+#: awkgram.y:6799
+msgid "@namespace is a gawk extension"
+msgstr "@namespace é uma extensão do gawk"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+"o nome de espaço de nome \"%s\" deve atender as regras de nomenclatura de "
+"identificador"
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s para \"%s\" falhou (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "saída padrão"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "saída padrão de erro"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: recebeu argumento não numérico"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: argumento %g está fora da faixa"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: erro ao descarregar: pipe \"%.*s\" aberto para leitura, não gravação"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: erro ao descarregar: arquivo \"%.*s\" aberto para leitura, não "
+"gravação"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: erro ao descarregar o arquivo \"%.*s\": %s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: erro ao descarregar: pipe bidirecional \"%.*s\" fechou a escrita"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: \"%.*s\" não é um arquivo aberto, pipe ou coprocesso"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: recebeu primeiro argumento não string"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: recebeu segundo argumento não string"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: recebeu argumento não numérico"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: recebeu argumento vetorial"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "\"length(array)\" é uma extensão do gawk"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: recebeu argumento não string"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: recebeu argumento não numérico"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: recebeu argumento negativo %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "fatal: deve usar \"count$\" em todos os formatos ou nenhum"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "largura de campo é ignorada para o especificador \"%%\""
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "precisão é ignorada para o especificador \"%%\""
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "largura de campo e precisão são ignorados para o especificador \"%%\""
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "fatal: \"$\" não é permitido formatos awk"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "fatal: nº de argumentos com \"$\" deve ser > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"fatal: nº de argumentos %ld maior que nº total de argumentos fornecidos"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "fatal: \"$\" não é permitido depois de ponto no formato"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+"fatal: nenhum \"$\" fornecido para tamanho ou precisão de campo posicional"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "\"l\" não faz sentido em formatos awk; ignorado"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "fatal: \"l\" não é permitido em formatos POSIX awk"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "\"L\" não faz sentido em formatos awk; ignorado"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "fatal: \"L\" não é permitido em formatos POSIX awk"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "\"h\" não faz sentido em formatos awk; ignorado"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "fatal: \"h\" não é permitido em formatos POSIX awk"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: valor %g é grande demais para formato \"%%c\""
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: valor %g não é um caractere amplamente válido"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: valor %g está fora da faixa para formato \"%%%c\""
+
+#: builtin.c:1504
+#, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: valor %s está fora da faixa para formato \"%%%c\""
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr "formato %%%c é de padrão POSIX, mas não portável para outros awks"
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"ignorando caractere especificador de formato \"%c\" desconhecido: nenhum "
+"argumento convertido"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "fatal: argumentos insuficientes para satisfazer a string de formato"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ acabou para este aqui"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: especificador de formato não tem letra de controle"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "excesso de argumentos fornecidos para a string de formato"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: nenhum argumento"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: nenhum argumento"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"printf: tentativa de escrever para lado de escrita fechado de pipe "
+"bidirecional"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: recebeu argumento não numérico"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: chamada com argumento negativo %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: comprimento %g não é >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: comprimento %g não é >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: comprimento não inteiro %g será truncado"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr "substr: comprimento %g grande demais para indexação, truncando para %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: posição inicial %g é inválida, usando 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: posição inicial não inteira %g será truncada"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: string origem tem comprimento zero"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: posição inicial %g está além do fim da string"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: comprimento %g a partir da posição inicial %g excede tamanho do 1º "
+"argumento (%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr ""
+"strftime: valor de formato em PROCINFO[\"strftime\"] possui tipo numérico"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: recebeu segundo argumento não numérico"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: segundo argumento menor que 0 ou grande demais para time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: segundo argumento não é um vetor para time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: recebeu primeiro argumento não string"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: recebeu string de formato vazia"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: recebeu argumento não string"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: pelo menos um dos valores está fora da faixa padrão"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "função \"system\" não é permitido no modo sandbox"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: recebeu argumento não string"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr ""
+"print: tentativa de escrever para lado de escrita fechado de pipe "
+"bidirecional"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "referência a campo não inicializado \"$%d\""
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: recebeu argumento não string"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: recebeu argumento não string"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: recebeu primeiro argumento não numérico"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: recebeu segundo argumento não numérico"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: recebeu argumento não numérico"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: recebeu argumento não numérico"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: recebeu argumento não numérico"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: terceiro argumento não é um vetor"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: terceiro argumento \"%.*s\" tratado como 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: pode ser chamado indiretamente somente com dois argumentos"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "chamada indireta para %s requer pelo menos dois argumentos"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: recebeu primeiro argumento não numérico"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: recebeu segundo argumento não numérico"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): valores negativos não são permitidos"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f) valores fracionários serão truncados"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): deslocamento excessivo dará resultados estranhos"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: recebeu primeiro argumento não numérico"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: recebeu segundo argumento não numérico"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): valores negativos não são permitidos"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): valores fracionários serão truncados"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): deslocamento excessivo dará resultados estranhos"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: chamada com menos de dois argumentos"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: argumento %d é não numérico"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: o argumento %d com valor negativo %g não é permitido"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: chamada com menos de dois argumentos"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: argumento %d é não numérico"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: o argumento %d com valor negativo %g não é permitido"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: chamada com menos de dois argumentos"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: argumento %d é não numérico"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: o argumento %d com valor negativo %g não é permitido"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: recebeu primeiro argumento não numérico"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): valor negativo não é permitida"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): valores fracionários serão truncados"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: \"%s\" não é uma categoria de \"locale\" válida"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv: terceiro argumento não é um vetor"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv: recebeu primeiro argumento não numérico"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv: recebeu segundo argumento não numérico"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv: tentativa de divisão por zero"
+
+#: builtin.c:4046
+msgid "typeof: second argument is not an array"
+msgstr "typeof: segundo argumento não é um vetor"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+"typeof detectou combinação inválida de flags \"%s\"; por favor, faça um "
+"relato de erro."
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof: tipo de argumento inválido \"%s\""
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof: tipo de argumento desconhecido \"%s\""
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Digite instruções do (g)awk. Termine-as com o comando \"end\"\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "número de quadro inválido: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: opção inválida - \"%s\""
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\": já carregado."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": comando não permitido."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+"Não foi possível usar o comando \"commands\" para comandos de breakpoint/"
+"watchpoint"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "nenhum breakpoint/watchpoint foi definido ainda"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "número de breakpoint/watchpoint inválido"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Digite comandos para quando %s %d for atingido, um por linha.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Termine com o comando \"end\"\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "\"end\" válido apenas no comando \"commands\" ou \"eval\""
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "\"silent\" válido apenas no comando \"commands\""
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: opção inválida - \"%s\""
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: número de breakpoint/watchpoint inválido"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "argumentos não é uma string"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: parâmetro inválido - \"%s\""
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "função inexistente - \"%s\""
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: opção inválida - \"%s\""
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "especificação de faixa inválida: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "valor não numérico para o número de campo"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "valor não numérico localizado, numérico esperado"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "valor inteiro não zero"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - exibe rastro de todos quadros ou os N mais internos (mais "
+"externos, se N < 0)."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr ""
+"break [[arquivo:]N|função] - define o breakpoint na localização especificada."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+"clear [[arquivo:]N|função] - exclui breakpoints definidos anteriormente."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [núm] - inicia uma lista de comandos para serem executados em um "
+"breakpoint(watchpoint) atingido."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition núm [expr] - deinfe ou limpa condição de breakpoint ou watchpoint."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [QTDE] - continua o programa sendo depurado."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr ""
+"delete [breakpoints] [intervalo] - exclui os breakpoints especificados."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr ""
+"disable [breakpoints] [intervalo] - desabilita os breakpoints especificados."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+"display [var] - exibe o valor da variável toda vez em que o programa é "
+"interrompido."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - move N quadros para baixo na pilha."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+"dump [arquivo] - despeja instruções para arquivo ou saída padrão (stdout)."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [breakpoints] [intervalo] - habilita breakpoints "
+"especificados."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - termina uma lista de comandos ou instruções do awk."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval stmt|[p1, p2, ...] - avalia instruções do awk."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (igual a \"quit\") sai do depurador."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - executa até o quadro de pilha selecionado ser retornado."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - seleciona ou exibe o quadro número N."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+"help [comando] - exibe a lista de comandos ou explicação de um comando."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+"ignore N QTDE - define quantidade a ser ignorada do breakpoint número N para "
+"QTDE."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr ""
+"list [-|+|[arquivo:]nº linha|função|intervalo] - lista de linha(s) "
+"especificada."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr "next [QTDE] - avança programa, seguindo pelas chamadas de sub-rotinas."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [QTDE] - avança uma instrução, mas segue pelas chamadas de sub-rotinas."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [nome[=valor]] - define ou exibe opções de depuração."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [var] - exibe valor de uma variável ou vetor."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf formato, [arg], ... - saída formatada."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - sai do depurador."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+"return [valor] - faz o quadro da pilha selecionado retornar seu chamador."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - inicia ou reinicia execução do programa."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save arquivo - salva comandos a partir da sessão para o arquivo."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set var = valor - atribui valor para uma variável escalar."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - suspende mensagem usual quando interrompido em um breakpoint/"
+"watchpoint."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source arquivo - executa comandos a partir do arquivo."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [QTDE] - avança programa até ele atingir uma linha fonte diferente."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [QTDE] - avança exatamente uma instrução."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[arquivo:]N|função] - define um breakpoint temporário."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - exibe instrução antes da execução."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr ""
+"undisplay [N] - remove variáveis a partir da lista automática de exibição."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[arquivo:]N|função] - executa até o programa atingir uma linha "
+"diferente ou linha N dentro do quadro atual."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - remove variáveis da lista de monitoramento."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - move N quadros para cima na pilha."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch var - define um watchpoint para uma variável."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where [N] - (igual a \"backtrace\") exibe rastro de todos quadros ou os N "
+"mais internos (mais externos, se N < 0)."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "não foi possível ler o comando (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "não foi possível ler (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "caractere inválido no comando"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "comando desconhecido - \"%.*s\", tente \"help\""
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "caractere inválido"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "comando indefinido: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr ""
+"define ou mostra o número de linhas para manter no arquivo de histórico."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "define ou mostra o tamanho da janela do comando \"list\"."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "define ou mostra o arquivo de saída do gawk."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "define ou mostra o prompt de depuração."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr ""
+"define/remove definição ou mostra o salvamento do comando \"history"
+"\" (valor=on|off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr ""
+"define/remove definição ou mostra o salvamento de opções (valor=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr ""
+"define/remove definição ou mostra o rastreamento de instrução (valor=on|off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "o programa não está em execução."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "não foi possível ler arquivo-fonte \"%s\" (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "arquivo-fonte \"%s\" está vazio.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "nenhum arquivo-fonte atual."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "não foi possível localizar o arquivo-fonte \"%s\" (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr ""
+"AVISO: o arquivo-fonte \"%s\" foi modificado após a compilação do programa.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "número de linha %d fora da faixa; \"%s\" possui %d linhas"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "fim de arquivo inesperado enquanto lia o arquivo \"%s\", linha %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr ""
+"o arquivo fonte \"%s\" foi modificado após o início da execução do programa"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Arquivo-fonte atual: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Número de linhas: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Arquivo-fonte (linhas): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Número  Exib  Habilit  Localização\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tnº de acertos = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tignorar próximos %ld acertos(s)\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tcondição de parada: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tcomandos:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Quadro atual: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Chamado pelo quadro: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Chamador do quadro: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Nenhum em main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Nenhum argumento.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Nenhum local.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Todas as variáveis definidas:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Todas as funções definidas:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Variáveis exibidas automaticamente:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Variáveis monitoradas:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "nenhum símbolo \"%s\" no contexto atual\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "\"%s\" não é um vetor\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = campo não inicializado\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "o vetor \"%s\" está vazio\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%.*s\"] não está no vetor \"%s\"\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "'%s[\"%.*s\"]' não está no vetor\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "\"%s\" não é uma variável escalar"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "tentativa de usar vetor '%s[\"%.*s\"]' em um contexto escalar"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "tentativa de usar vetor '%s[\"%.*s\"]' como um vetor"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "\"%s\" é uma função"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "o watchpoint %d é incondicional\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "Nenhum item de exibição com número %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Nenhum item monitorado com número %ld"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%.*s\"] não está no vetor \"%s\"\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "tentativa de usar valor escalar como vetor"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr "Watchpoint %d excluído porque parâmetro está fora do escopo.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "Exibição %d excluída porque parâmetro está fora do escopo.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " no arquivo \"%s\" na linha %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " em \"%s\":%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\tem "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Mais quadros de pilhas a seguir ...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "número de quadro inválido"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: breakpoint %d (habilitado, ignora próximos %ld acertos), também "
+"definido em %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Nota: breakpoint %d (habilitado), também definido em %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Nota: breakpoint %d (desabilitado, ignora próximos %ld acertos), também "
+"definido em %s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Nota: breakpoint %d (desabilitado), também definido em %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Breakpoint %d definido no arquivo \"%s\", linha %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "Não foi possível definir breakpoint no arquivo \"%s\"\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "número de linha %d no arquivo \"%s\" fora do intervalo"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Não foi possível localizar regra!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "Não foi possível definir breakpoint em \"%s\":%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Não foi possível definir breakpoint na função \"%s\"\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "breakpoint %d definido no arquivo \"%s\", linha %d é incondicional\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Excluído breakpoint %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "Nenhum breakpoint(s) na entrada para a função \"%s\"\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Nenhum breakpoint no arquivo \"%s\", linha nº %d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "número de breakpoint inválido"
+
+# o código-fonte aceita tradução da opção 'y'; vide msgid de "y" -- Rafael
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Excluir todos breakpoints? (s ou n) "
+
+# referente à resposta yes/sim em um prompt interativo -- Rafael
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "s"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Vai ignorar próximos %ld encontro(s) de breakpoint %d.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "Vai parar na próxima vez que o breakpoint %d for atingido.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "Só é possível depurar programas fornecidos com a opção \"-f\".\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Falha ao reiniciar o depurador"
+
+# o código-fonte aceita tradução da opção 'y'; vide msgid "y" -- Rafael
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Programa já está em execução. Reiniciar desde o começo (s/n)? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Programa não reiniciado\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "erro: não foi possível reiniciar, operação não permitida\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr ""
+"erro (%s): não foi possível reiniciar, ignorando o resto dos comandos\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Iniciando programa: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Programa foi terminado abnormalmente com valor de saída: %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Programa foi terminado normalmente com valor de saída: %d\n"
+
+# o código-fonte aceita tradução da opção 'y'; vide msgid "y" -- Rafael
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "O programa está em execução. Sair mesmo assim (s/n)? "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Não parado em qualquer breakpoint; argumento ignorado.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "número de breakpoint inválido %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Vai ignorar próximos %ld encontros de breakpoint %d.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "\"finish\" não tem sentido no arquivo mais externo do main()\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Executa até retornar de "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "\"return\" não tem sentido no arquivo mais externo do main()\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr ""
+"Não foi possível encontrar a localização especificada na função \"%s\"\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "linha fonte inválida %d no arquivo \"%s\""
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr ""
+"Não foi possível encontrar a localização %d especificada no arquivo \"%s\"\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "elemento não está no vetor\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "variável sem tipo\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Parando em %s ...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "\"finish\" não tem sentido com pulo não local \"%s\"\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "\"until\" não tem sentido com pulo não local \"%s\"\n"
+
+# o código-fonte aceita tradução da opção 'q'; vide msgid "q" -- Rafael
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t----[Enter] para continuar ou s [Enter] para sair---"
+
+# referente à resposta quit/sair em um prompt interativo -- Rafael
+#: debug.c:4324
+msgid "q"
+msgstr "s"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] não está no vetor \"%s\""
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "enviando a saída para stdout\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "número inválido"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "\"%s\" não permitido no contexto atual; instrução ignorada"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "\"return\" não permitido no contexto atual; instrução ignorada"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Nenhum símbolo \"%s\" no contexto atual"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "tipo de nodo desconhecido %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "código de operação inválido %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "código de operação %s não é um operador ou palavra-chave"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "estouro de buffer em genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Pilha de Chamadas de Função:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "\"IGNORECASE\" é uma extensão do gawk"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "\"BINMODE\" é uma extensão do gawk"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "valor de BINMODE \"%s\" é inválido, tratado como 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "especificação de \"%sFMT\" inválida \"%s\""
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "desativando \"--lint\" devido a atribuição a \"LINT\""
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "referência a argumento não inicializado \"%s\""
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "referência a variável não inicializada \"%s\""
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "tentativa de referência a campo a partir de valor não numérico"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "tentativa de referência a campo a partir de string nula"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "tentativa de acessar campo %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "referência a campo não inicializado \"$%ld\""
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "função \"%s\" chamada com mais argumentos que os declarados"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: tipo inesperado \"%s\""
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "tentativa de divisão por zero em \"/=\""
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "tentativa de divisão por zero em \"%%=\""
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "extensões não são permitidas no modo sandbox"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load são extensões do gawk"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: recebido lib_name NULL"
+
+#: ext.c:60
+#, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: não foi possível abrir a biblioteca \"%s\" (%s)"
+
+#: ext.c:66
+#, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: biblioteca \"%s\": não define \"plugin_is_GPL_compatible\" (%s)"
+
+#: ext.c:72
+#, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr ""
+"load_ext: biblioteca \"%s\": não foi possível chamar a função \"%s\" (%s)"
+
+#: ext.c:76
+#, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: biblioteca \"%s\" falhou na rotina de inicialização \"%s\""
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: faltando nome de função"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: não é possível usar \"%s\" intrínseco do gawk como nome de "
+"função"
+
+#: ext.c:109
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: não é possível usar \"%s\" intrínseco do gawk como nome de "
+"espaço de nome"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: não foi possível redefinir \"%s\""
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: função \"%s\" já definida"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: nome da função \"%s\" definido anteriormente"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: quantidade negativa de argumentos para função \"%s\""
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr ""
+"função \"%s\": argumento nº %d: tentativa de usar escalar como um vetor"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "função \"%s\": argumento nº %d: tentativa de usar vetor como escalar"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "sem suporte a carregamento dinâmico da biblioteca"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: não foi possível ler link simbólico \"%s\""
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: parâmetros inválidos"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init: não foi possível criar a variável %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "Este sistema não possui suporte a fts"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: não foi possível criar vetor"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: não foi possível definir elemento"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: não foi possível definir elemento"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: não foi possível definir elemento"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: não foi possível criar vetor"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: não foi possível definir elemento"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: chamada com número incorreto de argumentos, esperava 3"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: primeiro parâmetro inválido"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: segundo parâmetro inválido"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: terceiro parâmetro inválido"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: não foi possível nivelar o vetor\n"
+
+# A flag tentou passar despercebida, mas falhou e recebeu um "nyah" zombando
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: ignorando flag sorrateira FTS_NOSTAT; nã, nã, não."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() falhou\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: não foi possível obter o primeiro argumento"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: não foi possível obter o segundo argumento"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: não foi possível obter o terceiro argumento"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch não está implementado neste sistema\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: não foi possível adicionar a variável FNM_NOMATCH"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: não foi possível definir elemento %s de vetor"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: não foi possível instalar vetor FNM"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO não é um vetor!"
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace::begin: edição in-loco já está ativa"
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace::begin: esperava 2 argumentos, mas foi chamado com %d"
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace::begin: não foi possível obter 1º argumento como uma string de nome "
+"de arquivo"
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace::begin: desabilitando edição in-loco para FILENAME inválido \"%s\""
+
+# Iniciei a mensagem de erro com letra minúscula para combinar com as demais -- Rafael
+#: extension/inplace.c:152
+#, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace::begin: não foi possível obter estado de \"%s\" (%s)"
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace::begin: \"%s\" não é um arquivo comum"
+
+#: extension/inplace.c:170
+#, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace::begin: mkstemp(\"%s\") falhou (%s)"
+
+#: extension/inplace.c:182
+#, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace::begin: chmod falhou (%s)"
+
+#: extension/inplace.c:189
+#, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace::begin: dup(stdout) falhou (%s)"
+
+#: extension/inplace.c:192
+#, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::begin: dup2(%d, stdout) falhou (%s)"
+
+#: extension/inplace.c:195
+#, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace::begin: close(%d) falhou (%s)"
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace::end: esperava 2 argumentos, mas foi chamado com %d"
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr ""
+"inplace::end: não foi possível obter 1º argumento como uma string de nome de "
+"arquivo"
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace::end: edição in-loco não está ativa"
+
+#: extension/inplace.c:227
+#, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::end: dup2(%d, stdout) falhou (%s)"
+
+#: extension/inplace.c:230
+#, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace::end: close(%d) falhou (%s)"
+
+#: extension/inplace.c:234
+#, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace::end: fsetpos(stdout) falhou (%s)"
+
+#: extension/inplace.c:247
+#, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace::end: link(`%s', `%s') falhou (%s)"
+
+#: extension/inplace.c:257
+#, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace::end: rename(`%s', `%s') falhou (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: chamada com argumento(s) inapropriados"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: chamada com argumento(s) inapropriados"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir falhou: %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: chamada com tipo errado de argumento"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: não foi possível inicializar a variável REVOUT"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: argumento 0 não é uma string\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: argumento 1 não é um vetor\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: não foi possível nivelar o vetor\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: não foi liberar vetor nivelado\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "valor de vetor possui tipo desconhecido %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: argumento 0 não é uma string\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: argumento 1 não é um vetor\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array falhou\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element falhou\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr ""
+"tratando valor recuperado com código de tipo desconhecido %d como uma string"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: sem suporte nesta plataforma"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: faltando argumento numérico necessário"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: argumento é negativo"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: sem suporte nesta plataforma"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "registro de entrada grande demais"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF definido para valor negativo"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr "o decremento de NF não é portável para muitas versões awk"
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr "o acesso a campos de uma regra END não pode ser portável"
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: quarto argumento é uma extensão do gawk"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: quarto argumento não é um vetor"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: segundo argumento não é um vetor"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr "split: não é possível usar o mesmo vetor para segundo e quarto args"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: não é possível usar um subvetor do segundo arg para o quarto arg"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: não é possível usar um subvetor do quarto arg para o segundo arg"
+
+#: field.c:1036
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: string nula para segundo argumento é uma extensão não padrão"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: quarto argumento não é um vetor"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: segundo argumento não é um vetor"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: terceiro argumento não é um vetor"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: não é possível usar o mesmo vetor para segundo e quarto argumentos"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: não é possível usar um subvetor do segundo arg para o quarto arg"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: não é possível usar um subvetor do quarto arg para o segundo arg"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "\"FIELDWIDTHS\" é uma extensão do gawk"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "\"*\" deve ser o último designador em FIELDWIDTHS"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "valor FIELDWIDTHS inválido, para campo %d, próximo a \"%s\""
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "string nula para \"FS\" é uma extensão do gawk"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "o velho awk não oferece suporte a expr. reg. como valor de \"FS\""
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "\"FPAT\" é uma extensão do gawk"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: recebeu código de retorno nulo"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: não está no modo MPFR"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: sem suporte a MPFR"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: tipo de número inválido \"%d\""
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "add_ext_func: recebido parâmetro name_space NULO"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+"node_to_awk_value: detectada combinação inválida de flags numéricas \"%s\"; "
+"por favor, faça um relato de erro."
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: recebeu nó nulo"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: recebeu valor nulo"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+"node_to_awk_value detectou combinação inválida de flags \"%s\"; por favor, "
+"faça um relato de erro."
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: recebeu vetor nulo"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: recebeu índice nulo"
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr ""
+"api_flatten_array_typed: não foi possível converter o índice %d para %s"
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array_typed: não foi possível converter o valor %d para %s"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr: sem suporte a MPFR"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "não foi possível localizar o fim da regra BEGINFILE"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr ""
+"não foi possível abrir tipo de arquivo não reconhecido \"%s\" para \"%s\""
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "o argumento de linha de comando \"%s\" é um diretório: ignorado"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "não foi possível abrir arquivo \"%s\" para leitura (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "fechamento do descritor %d (\"%s\") falhou (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "redirecionamento não permitido no modo sandbox"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "expressão no redirecionamento \"%s\" é um número"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "expressão para o redirecionamento \"%s\" tem valor nulo na string"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"nome de arquivo \"%.*s\" para redirecionamento \"%s\" pode ser resultado de "
+"expressão lógica"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "mistura desnecessária de \">\" e \">>\" para arquivo \"%.*s\""
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file não pode criar pipe \"%s\" com fd %d"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "não foi possível abrir pipe \"%s\" para saída (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "não foi possível abrir pipe \"%s\" para entrada (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"sem suporte à criação de soquete de get_file nesta de plataforma para \"%s\" "
+"com fd %d"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr ""
+"não foi possível abrir pipe bidirecional \"%s\" para entrada/saída (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "não foi possível redirecionar de \"%s\" (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "não foi possível redirecionar para \"%s\" (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"alcançado limite do sistema para arquivos abertos; começando a multiplexar "
+"descritores de arquivos"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "fechamento de \"%s\" falhou (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "excesso de pipes ou arquivos de entrada abertos"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: segundo argumento deve ser \"to\" ou \"from\""
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: \"%.*s\" não é um arquivo aberto, pipe ou coprocesso"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "fechamento de redirecionamento que nunca foi aberto"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: redirecionamento \"%s\" não foi aberto com \"|&\", segundo argumento "
+"ignorado"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "status de falha (%d) ao fechar pipe de \"%s\" (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "status de falha (%d) ao fechar arquivo de \"%s\" (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "fechamento explícito do soquete \"%s\" não fornecido"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "fechamento explícito do coprocesso \"%s\" não fornecido"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "fechamento explícito do pipe \"%s\" não fornecido"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "fechamento explícito do arquivo \"%s\" não fornecido"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush: não foi possível descarregar a saída padrão: %s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush: não foi possível descarregar a saída padrão de erros: %s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "erro ao escrever na saída padrão (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "erro ao escrever na saída padrão de erros (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "descarga de pipe de \"%s\" falhou (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "descarga de coprocesso de pipe para \"%s\" falhou (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "descarga de arquivo de \"%s\" falhou (%s)."
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "porta local %s inválida em \"/inet\": %s"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "porta local %s inválida em \"/inet\""
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "informação de host e porta remotos (%s, %s) inválida: %s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "informação de host e porta remotos (%s, %s) inválida"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "Não há suporte a comunicações TCP/IP"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "não foi possível abrir \"%s\", modo \"%s\""
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "falha ao fechar pty mestre (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "falha ao fechar stdout em filho (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr "falha ao mover pty escrava para stdout em filho (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "falha ao fechar stdin em filho (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr "falha ao mover pty escrava para stdin em filho (dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "falha ao fechar pty escrava (%s)"
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr "não foi possível criar processo filho ou abrir pty"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr "falha ao mover pipe para stdout em filho (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr "falha ao mover pipe para stdin em filho (dup: %s)"
+
+#: io.c:2386 io.c:2655
+msgid "restoring stdout in parent process failed"
+msgstr "falha ao restaurar stdout em processo pai"
+
+#: io.c:2394
+msgid "restoring stdin in parent process failed"
+msgstr "falha ao restaurar stdin em processo pai"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "falha ao fechar pipe (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "sem suporte a \"|&\""
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "não foi possível abrir pipe \"%s\" (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "não foi possível criar processo filho para \"%s\" (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr ""
+"getline: tentativa de ler de lado de leitura fechado de pipe bidirecional"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: recebido ponteiro NULL"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"o analisador de entrada \"%s\" conflita com outro analisador de entrada "
+"previamente instalado \"%s\""
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "analisador de entrada \"%s\": falha ao abrir \"%s\""
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: recebido ponteiro NULL"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"wrapper de saída \"%s\" conflita com outro wrapper previamente instalado \"%s"
+"\""
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "wrapper de saída \"%s\": falha ao abrir \"%s\""
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: recebido ponteiro NULL"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"processador bidirecional \"%s\" conflita com processador bidirecional "
+"previamente instalado \"%s\""
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "processador bidirecional \"%s\" falhou ao abrir \"%s\""
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "arquivo de dados \"%s\" está vazio"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "não foi possível alocar mais memória de entrada"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "valor de múltiplos caracteres para \"RS\" é uma extensão do gawk"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "Não há suporte a comunicação IPv6"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr "variável de ambiente \"POSIXLY_CORRECT\" definida: ligando \"--posix\""
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "\"--posix\" sobrepõe \"--traditional\""
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "\"--posix\"/\"--traditional\" sobrepõe \"--non-decimal-data\""
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "\"--posix\" sobrepõe \"--characters-as-bytes\""
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "executar %s com setuid root pode ser um problema de segurança"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "não foi possível definir modo binário em stdin (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "não foi possível definir modo binário em stdout (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "não foi possível definir modo binário em stderr (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "nenhum texto de programa!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr "Uso: %s [opções estilo POSIX ou GNU] -f arqprog [--] arquivo ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr "Uso: %s [opções estilo POSIX ou GNU] [--] %cprograma%c arquivo ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "Opções POSIX: \t\tOpções longas GNU: (padrão)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f arqprog \t\t--file=arqprog\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=val\t\t--assign=var=val\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Opções curtas: \t\tOpções longas GNU: (extensões)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[arquivo]\t\t--dump-variables[=arquivo]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[arquivo]\t\t--debug[=arquivo]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e \"texto-programa\"\t--source=\"texto-programa\"\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E arquivo\t\t--exec=arquivo\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i arq-include\t\t--include=arq-include\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l biblioteca\t\t--load=biblioteca\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[arquivo]\t\t--pretty-print[=arquivo]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[arquivo]\t\t--profile[=arquivo]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr "\t-Z nome-locale\t\t--locale=nome-locale\n"
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Para relatar erros, veja o nó \"Bugs\" no \"gawk.info\",\n"
+"que é a seção \"Reporting Problems and Bugs\" na\n"
+"versão impressa. A mesma informação pode ser localizada em\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"POR FAVOR NÃO tente relatar erros publicando na comp.lang.awk,\n"
+"\n"
+"ou usando um fórum web, tal como o Stack Overflow.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk é uma linguagem de busca e processamento de padrões.\n"
+"Por padrão, ele lê a entrada padrão e escreve na saída padrão.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Exemplos:\n"
+"\tgawk '{ soma += $1 }; END { print soma }' arquivo\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Este programa é software livre; você pode redistribuí-lo e/ou\n"
+"modificá-lo sob os termos da Licença Pública Geral GNU, conforme\n"
+"publicada pela Free Software Foundation; tanto a versão 3 da\n"
+"Licença como (a seu critério) qualquer versão mais nova.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Este programa é distribuído na expectativa de ser útil, mas SEM\n"
+"QUALQUER GARANTIA; sem mesmo a garantia implícita de\n"
+"COMERCIALIZAÇÃO ou de ADEQUAÇÃO A QUALQUER PROPÓSITO EM\n"
+"PARTICULAR. Consulte a Licença Pública Geral GNU para obter mais\n"
+"detalhes.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Você deve ter recebido uma cópia da Licença Pública Geral GNU\n"
+"junto com este programa; se não http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft não define FS com tab no awk POSIX"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: argumento \"%s\" para \"-v\" não está na forma \"var=valor\"\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "\"%s\" não é um nome legal de variável"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "\"%s\" não é um nome de variável, procurando pelo arquivo \"%s=%s\""
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "não é possível usar o \"%s\" intrínseco do gawk como nome de variável"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "não foi possível usar a função \"%s\" como nome de variável"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "exceção de ponto flutuante"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "erro fatal: erro interno"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "erro fatal: erro interno: falha de segmentação"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "erro fatal: erro interno: estouro de pilha"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "nenhum descritor pré-aberto %d"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "não foi possível pré-abrir /dev/null para descritor %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "argumento vazio para \"-e/--source\" ignorado"
+
+#: main.c:1662 main.c:1667
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "\"--profile\" sobrepõe \"--pretty-print\""
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M ignorado: suporte a MPFR/GMP não compilado"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: opção desconhecida \"-W %s\", ignorada\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: a opção exige um argumento -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "valor de PREC \"%.*s\" é inválido"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "valor de RNDMODE \"%.*s\" é inválido"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: recebeu argumento não numérico"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): valor negativo não é permitida"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "comp(%Rg): valor fracionário será truncado"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): valores negativos não são permitidos"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: recebeu argumento não numérico nº %d"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: argumento nº %d possui valor inválido %Rg, usando 0"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: o argumento nº %d com valor negativo %Rg não é permitido"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: argumento nº %d com valor fracionário %Rg será truncado"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: o argumento nº %d com valor negativo %Zd não é permitido"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "lin. de com.:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "não foi possível fazer a expressão regular tipada"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "o velho awk não oferece suporte à sequência de escape \"\\%c\""
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX não permite escapes do tipo \"\\x\""
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "nenhum dígito hexa na sequência de escape \"\\x\""
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"escape hexa \\x%.*s de %d caracteres provavelmente não interpretado na forma "
+"que você esperava"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "sequência de escape \"\\%c\" tratada como \"%c\" normal"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Dados com múltiplos bytes inválidos detectados. Pode haver uma "
+"incompatibilidade entre seus dados e seu \"locale\"."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr ""
+"%s %s \"%s\": não foi possível obter flags do descritor: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr ""
+"%s %s \"%s\": não foi possível definir fechar-ao-executar: (fcntl F_SETFD: "
+"%s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+"Nível de recuo do programa está profundo demais. Considere refatorar seu "
+"código"
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "não foi possível abrir \"%s\" para escrita: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "enviando perfil para saída de erros"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s regra(s)\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regra(s)\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "erro interno: %s com vname nulo"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "erro interno: intrínseco com fname nulo"
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"%s# Extensões carregadas (-l e/ou @load)\n"
+"\n"
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\n"
+"# Arquivos incluídos (-i e/ou @include)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# perfil gawk, criado %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funções, listadas alfabeticamente\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: tipo de redirecionamento desconhecido %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+"comportamento de correspondência à regexp contendo caracteres NUL não está "
+"definido pelo POSIX"
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr "byte NUL inválido em regexp dinâmica"
+
+#: re.c:172
+#, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "sequência de escape \"\\%c\" da regexp tratada como \"%c\" normal"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+"sequência de escape \"\\%c\" da regexp não é um operador de regexp conhecido"
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "componente de expr. reg. \"%.*s\" deve provavelmente ser \"[%.*s]\""
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "[ sem correspondente"
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "classe de caracteres inválida"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "a sintaxe de classe de caracteres é [[:space:]], e não [:space:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "escape \\ não terminado"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "conteúdo inválido de \\{\\}"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "expressão regular grande demais"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "( sem correspondente"
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "nenhuma sintaxe especificada"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ") sem correspondente"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: a opção \"%s\" é ambígua; possibilidades:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: a opção \"--%s\" não permite um argumento\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: a opção \"%c%s\" não permite um argumento\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: a opção \"--%s\" requer um argumento\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: opção não reconhecida \"--%s\"\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: opção não reconhecida \"%c%s\"\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: opção inválida -- \"%c\"\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: a opção requer um argumento -- \"%c\"\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: a opção \"-W %s\" é ambígua\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: a opção \"-W %s\" não permite um argumento\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: a opção \"-W %s\" requer um argumento\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Sucesso"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Nenhuma ocorrência do padrão"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Expressão regular inválida"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Caractere de combinação inválido"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Nome inválido de classe de caractere"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Barra invertida no final"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Retrorreferência inválida"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[, [^, [:, [. ou [= sem correspondente"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "( ou \\( sem correspondente"
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "\\{ sem correspondente"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Conteúdo inválido de \\{\\}"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Fim de intervalo inválido"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Memória esgotada"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "A expressão regular precedente é inválida"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Fim prematuro da expressão regular"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Expressão regular grande demais"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr ") ou \\) sem correspondente"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Nenhuma expressão regular anterior"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr ""
+"função \"%s\": não é possível usar a função \"%s\" como um nome de parâmetro"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "não foi possível trazer contexto principal"
+
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "setenv(TZ, %s) falhou (%s)"
+
+#~ msgid "setenv(TZ, %s) restoration failed (%s)"
+#~ msgstr "restauração de setenv(TZ, %s) falhou (%s)"
+
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "unsetenv(TZ) falhou (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "barra invertida no fim da string"
+
+#~ msgid "`isarray' is deprecated. Use `typeof' instead"
+#~ msgstr "\"isarray\" está obsoleto. Em vez disso, use \"typeof\""
+
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "tentativa de usar vetor '%s[\".*%s\"]' em um contexto escalar"
+
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "tentativa de usar vetor '%s[\".*%s\"]' como um vetor"
+
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: terceiro argumento %g tratado como 1"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "\"extension\" é uma extensão do gawk"
+
+#~ msgid "extension: received NULL lib_name"
+#~ msgstr "extension: recebido lib_name NULL"
+
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "extension: não foi possível abrir a biblioteca \"%s\" (%s)"
+
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr ""
+#~ "extension: biblioteca \"%s\": não define \"plugin_is_GPL_compatible\" (%s)"
+
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr ""
+#~ "extension: biblioteca \"%s\": não foi possível chamar a função \"%s\" (%s)"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension: faltando nome de função"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: caractere ilegal \"%c\" no nome de função \"%s\""
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: não foi possível redefinir \"%s\""
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: função \"%s\" já definida"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension: nome da função \"%s\" definido anteriormente"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr ""
+#~ "extension: não é possível usar \"%s\" intrínseco do gawk como nome de "
+#~ "função"
+
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr "chdir: chamada com número incorreto de argumentos, esperava 1"
+
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "stat: chamada com número errado de argumentos"
+
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "statvfs: chamada com número errado de argumentos"
+
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "fnmatch: chamada com menos de três argumentos"
+
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "fnmatch: chamada com mais de três argumentos"
+
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "fork: chamada com número excessivo de argumentos"
+
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "waitpid: chamada com número excessivo de argumentos"
+
+#~ msgid "wait: called with no arguments"
+#~ msgstr "wait: chamada com nenhum argumento"
+
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "wait: chamada com número excessivo de argumentos"
+
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "ord: chamada com número excessivo de argumentos"
+
+#~ msgid "ord: called with no arguments"
+#~ msgstr "ord: chamada com nenhum argumento"
+
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "chr: chamada com número excessivo de argumentos"
+
+#~ msgid "chr: called with no arguments"
+#~ msgstr "chr: chamada com nenhum argumento"
+
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "readfile: chamada com número excessivo de argumentos"
+
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "writea: chamada com número excessivo de argumentos"
+
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "reada: chamada com número excessivo de argumentos"
+
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "gettimeofday: ignorando argumentos"
+
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sleep: chamada com número excessivo de argumentos"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "valor desconhecido para especificação de campo: %d\n"
+
+#~ msgid "reference to uninitialized element `%s[\"%s\"]'"
+#~ msgstr "referência a elemento não inicializado `%s[\"%s\"]'"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "índice do vetor `%s' é uma string nula"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: vazio (nulo)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: vazio (zero)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: table_size = %d, array_size = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: array_ref para %s\n"
+
+#~ msgid "statement may have no effect"
+#~ msgstr "declaração pode não ter efeito"
+
+#~ msgid "call of `length' without parentheses is deprecated by POSIX"
+#~ msgstr "chamada a `length' sem parênteses é obsoleta de acordo com POSIX"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "uso de não vetor como vetor"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "`%s' é uma extensão da Bell Labs"
+
+#~ msgid "or used as a variable or an array"
+#~ msgstr "ou usado como uma variável ou vetor"
+
+#~ msgid "substr: length %g is < 0"
+#~ msgstr "substr: comprimento %g é < 0"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: recebeu primeiro argumento não numérico"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): valores negativos darão resultados estranhos"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): valores fracionários serão truncados"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: recebeu primeiro argumento não numérico"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): valores fracionários serão truncados"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr ""
+#~ "loop for: vetor `%s' mudou de tamanho de %ld para %ld durante a execução"
+
+#~ msgid "`break' outside a loop is not portable"
+#~ msgstr "`break' fora de um loop não é portável"
+
+#~ msgid "`continue' outside a loop is not portable"
+#~ msgstr "`continue' fora de um loop não é portável"
+
+#~ msgid "`next' cannot be called from an END rule"
+#~ msgstr "`next' não pode ser chamado de uma regra END"
+
+#~ msgid "`nextfile' cannot be called from a BEGIN rule"
+#~ msgstr "`nextfile' não pode ser chamado de uma regra BEGIN"
+
+#~ msgid "`nextfile' cannot be called from an END rule"
+#~ msgstr "`nextfile' não pode ser chamado de uma regra END"
+
+#~ msgid "statement has no effect"
+#~ msgstr "declaração não tem efeito"
+
+#~ msgid ""
+#~ "concatenation: side effects in one expression have changed the length of "
+#~ "another!"
+#~ msgstr ""
+#~ "concatenação: efeitos colaterais em um contexto mudaram o comprimento de "
+#~ "outro!"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "atribuição usada em contexto condicional"
+
+#~ msgid "illegal type (%s) in tree_eval"
+#~ msgstr "tipo ilegal (%s) em tree_eval"
+
+#~ msgid "function %s called\n"
+#~ msgstr "função %s chamada\n"
+
+#~ msgid "\t# -- main --\n"
+#~ msgstr "\t# -- main --\n"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr "atribuição não pode resultar de funções intrínsecas"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "Operação Não Suportada"
+
+#~ msgid "field %d in FIELDWIDTHS, must be > 0"
+#~ msgstr "campo %d em FIELDWIDTHS deve ser > 0"
+
+#~ msgid "%s: illegal option -- %c\n"
+#~ msgstr "%s: opção ilegal -- %c\n"
+
+#~ msgid "invalid tree type %s in redirect()"
+#~ msgstr "tipo de árvore %s inválido em redirect()"
+
+#~ msgid "can't open two way socket `%s' for input/output (%s)"
+#~ msgstr "impossível abrir socket bidirecional `%s' para entrada/saída (%s)"
+
+#~ msgid "/inet/raw client not ready yet, sorry"
+#~ msgstr "infelizmente, o cliente de /inet/raw não está concluído"
+
+#~ msgid "only root may use `/inet/raw'."
+#~ msgstr "apenas root pode usar `/inet/raw'."
+
+#~ msgid "/inet/raw server not ready yet, sorry"
+#~ msgstr "infelizmente, o servidor de /inet/raw não está concluído"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr ""
+#~ "nenhum protocolo (conhecido) fornecido em nome de arquivo especial `%s'"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "nome de arquivo especial `%s' está incompleto"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "deve ser fornecido um nome de host remoto para `/inet'"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "deve ser fornecida uma porta remota para `/inet'"
+
+#~ msgid "remote port invalid in `%s'"
+#~ msgstr "porta remota inválida em `%s'"
+
+#~ msgid "file `%s' is a directory"
+#~ msgstr "arquivo `%s' é um diretório"
+
+#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'"
+#~ msgstr "use `PROCINFO[\"%s\"]' em vez de `%s'"
+
+#~ msgid "use `PROCINFO[...]' instead of `/dev/user'"
+#~ msgstr "use `PROCINFO[...]' em vez de `/dev/user'"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "opção `-m[fr] é irrelevante no gawk"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "uso da opção -m: `-m[fr] nnn'"
+
+#~ msgid "\t-m[fr] val\n"
+#~ msgstr "\t-m[fr] val\n"
+
+#~ msgid "\t-W compat\t\t--compat\n"
+#~ msgstr "\t-W compat\t\t--compat\n"
+
+#~ msgid "\t-W copyleft\t\t--copyleft\n"
+#~ msgstr "\t-W copyleft\t\t--copyleft\n"
+
+#~ msgid "\t-W usage\t\t--usage\n"
+#~ msgstr "\t-W usage\t\t--usage\n"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "impossível achar grupos: %s"
+
+#~ msgid "can't convert string to float"
+#~ msgstr "impossível converter string para float"
+
+#~ msgid "# treated internally as `delete'"
+#~ msgstr "# tratado internamente como `delete'"
+
+#~ msgid ""
+#~ "\t# BEGIN block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# bloco(s) BEGIN\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "\t# END block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# bloco(s) END\n"
+#~ "\n"
+
+#~ msgid "unexpected type %s in prec_level"
+#~ msgstr "tipo inesperado %s em prec_level"
+
+#~ msgid "regex match failed, not enough memory to match string \"%.*s%s\""
+#~ msgstr ""
+#~ "busca por exp. reg. falhou, memória insuficiente para testar string \"%.*s"
+#~ "%s\""
+
+#~ msgid "delete: illegal use of variable `%s' as array"
+#~ msgstr "delete: uso ilegal da variável `%s' como vetor"
+
+#~ msgid "internal error: Node_var_array with null vname"
+#~ msgstr "erro interno: Node_var_array com vname nulo"
diff --git a/gawk-5.0.1/po/quot.sed b/gawk-5.0.1/po/quot.sed
new file mode 100644
index 00000000000..0122c46318d
--- /dev/null
+++ b/gawk-5.0.1/po/quot.sed
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
diff --git a/gawk-5.0.1/po/remove-potcdate.sin b/gawk-5.0.1/po/remove-potcdate.sin
new file mode 100644
index 00000000000..2436c49e786
--- /dev/null
+++ b/gawk-5.0.1/po/remove-potcdate.sin
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/gawk-5.0.1/po/stamp-po b/gawk-5.0.1/po/stamp-po
new file mode 100644
index 00000000000..9788f70238c
--- /dev/null
+++ b/gawk-5.0.1/po/stamp-po
@@ -0,0 +1 @@
+timestamp
diff --git a/gawk-5.0.1/po/sv.po b/gawk-5.0.1/po/sv.po
new file mode 100644
index 00000000000..42a34473759
--- /dev/null
+++ b/gawk-5.0.1/po/sv.po
@@ -0,0 +1,3741 @@
+# Swedish translation of gawk
+# Copyright © 2003, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+#
+# Martin Sjögren <md9ms@mdstud.chalmers.se>, 2001-2002.
+# Christer Andersson <klamm@comhem.se>, 2007.
+# Göran Uddeborg <goeran@uddeborg.se>, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019.
+#
+# $Revision: 1.32 $
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.2.63\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2019-03-09 21:06+0100\n"
+"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "från %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "försök att använda ett skalärt värde som vektor"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "försök att använda skalärparametern ”%s” som en vektor"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "försök att använda skalären ”%s” som en vektor"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "försök att använda vektorn ”%s” i skalärsammanhang"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: indexet ”%.*s” finns inte i vektorn ”%s”"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "försök att använda skalären ”%s[\"%.*s\"]” som en vektor"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: första argumentet är inte en vektor"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: andra argumentet är inte en vektor"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: andra argumentet är inte en vektor"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: första argumentet är inte en vektor"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: första argumentet är inte en vektor"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort: det går inte att använda en delvektor av första argumentet som andra "
+"argument"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti: det går inte att använda en delvektor av första argumentet som andra "
+"argument"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort: det går inte att använda en delvektor av andra argumentet som första "
+"argument"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti: det går inte att använda en delvektor av andra argumentet som första "
+"argument"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "”%s” är ogiltigt som ett funktionsnamn"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "jämförelsefunktionen ”%s” för sortering är inte definierad"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s-block måste ha en åtgärdsdel"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "varje regel måste ha ett mönster eller en åtgärdsdel"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "gamla awk stöder inte flera ”BEGIN”- eller ”END”-regler"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "”%s“ är en inbyggd funktion, den kan inte definieras om"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "regexp-konstanten ”//” ser ut som en C++-kommentar men är inte det"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "regexp-konstanten ”/%s/” ser ut som en C-kommentar men är inte det"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "upprepade case-värden i switch-sats: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "flera ”default” upptäcktes i switch-sats"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "”break” är inte tillåtet utanför en slinga eller switch"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "”continue” är inte tillåtet utanför en slinga"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "”next” använt i %s-åtgärd"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "”nextfile” använt i %s-åtgärd"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "”return” använd utanför funktion"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr "ensamt ”print” i BEGIN eller END-regel bör troligen vara 'print \"\"'"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "”delete” är inte tillåtet med SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "”delete” är inte tillåtet med FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "”delete(array)” är en icke portabel tawk-utökning"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "flerstegs dubbelriktade rör fungerar inte"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr "konkatenering som omdirigeringsmålet för I/O ”>” är tvetydig"
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "reguljärt uttryck i högerledet av en tilldelning"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "reguljärt uttryck på vänster sida om en ”~”- eller ”!~”-operator"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "gamla awk stöder inte operatorn ”**”"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "reguljärt uttryck i högerledet av en jämförelse"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "icke omdirigerad ”getline” är ogiltigt inuti ”%s”-regel"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "icke omdirigerad ”getline” odefinierad inuti END-åtgärd"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "gamla awk stöder inte flerdimensionella vektorer"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "anrop av ”length” utan parenteser är inte portabelt"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "indirekta funktionsanrop är en gawk-utökning"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr ""
+"det går inte att använda specialvariabeln ”%s” för indirekta fuktionsanrop"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "försök att använda en icke-funktion ”%s” i ett funktionsanrop"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "ogiltig indexuttryck"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "varning: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "ödesdigert: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "oväntat nyradstecken eller slut på strängen"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+"källkodsfiler/kommandoradsargument måste innehålla kompletta funktioner "
+"eller regler"
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "kan inte öppna källfilen ”%s” för läsning (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "kan inte öppna det delade biblioteket ”%s” för läsning (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "okänd anledning"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "kan inte inkludera ”%s” och använda den som en programfil"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "inkluderade redan källfilen ”%s”"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "inkluderade redan det delade biblioteket ”%s”"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include är en gawk-utökning"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "tomt filnamn efter @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load är en gawk-utökning"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "tomt filnamn efter @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "tom programtext på kommandoraden"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "kan inte läsa källfilen ”%s” (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "källfilen ”%s” är tom"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "PEBKAC-fel: ogiltigt tecken ”\\%03o” i källkoden"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "källfilen slutar inte med en ny rad"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "oavslutat reguljärt uttryck slutar med ”\\” i slutet av filen"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"%s: %d: tawk-modifierare för reguljära uttryck ”/.../%c” fungerar inte i gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "tawk-modifierare för reguljära uttryck ”/.../%c” fungerar inte i gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "oavslutat reguljärt uttryck"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "oavslutat reguljärt uttryck i slutet av filen"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "Användning av ”\\ #...” för radfortsättning är inte portabelt"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "sista tecknet på raden är inte ett omvänt snedstreck"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "flerdimensionella matriser är en gawk-utökning"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX tillåter inte operatorn ”**=”"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "gamla awk stöder inte operatorn ”**=”"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX tillåter inte operatorn ”**”"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "gamla awk stöder inte operatorn ”**”"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "operatorn ”^=” stöds inte i gamla awk"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "operatorn ”^” stöds inte i gamla awk"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "oavslutad sträng"
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX tillåter inte fysiska nyrader i strängvärden"
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr "strängfortsättning med omvänt snedstreck är inte portabelt"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "ogiltigt tecken ”%c” i uttryck"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "”%s” är en gawk-utökning"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX tillåter inte ”%s”"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "”%s” stöds inte i gamla awk"
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr "”goto” anses skadligt!"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d är ett ogiltigt antal argument för %s"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s: bokstavlig sträng som sista argument till ersättning har ingen effekt"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "%s: tredje argumentet är inte ett ändringsbart objekt"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: tredje argumentet är en gawk-utökning"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: andra argumentet är en gawk-utökning"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"användandet av dcgettext(_\"...\") är felaktigt: ta bort det inledande "
+"understrykningstecknet"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr ""
+"användandet av dcngettext(_\"...\") är felaktigt: ta bort det inledande "
+"understrykningstecknet"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index: reguljäruttryck som andra argumentet är inte tillåtet"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "funktionen ”%s”: parametern ”%s” överskuggar en global variabel"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "kunde inte öppna ”%s” för skrivning (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "skickar variabellista till standard fel"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: misslyckades att stänga (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() anropad två gånger!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "det fanns överskuggade variabler."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "funktionsnamnet ”%s” är definierat sedan tidigare"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "funktionen ”%s”: kan inte använda funktionsnamn som parameternamn"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr ""
+"funktionen ”%s”: det går inte att använda specialvariabeln ”%s” som en "
+"funktionsparameter"
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "funktionen ”%s”: parametern ”%s” får inte innehålla en namnrymd"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "funktionen ”%s”: parameter %d, ”%s”, är samma som parameter %d"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "funktionen ”%s” anropad men aldrig definierad"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "funktionen ”%s” definierad men aldrig anropad direkt"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "konstant reguljärt uttryck för parameter %d ger ett booleskt värde"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"funktionen ”%s” anropad med blanktecken mellan namnet och ”(”,\n"
+"eller använd som variabel eller vektor"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "försökte dividera med noll"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "försökte dividera med noll i ”%%”"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr ""
+"kan inte tilldela ett värde till uttryck som är en efterinkrementering av "
+"ett fält"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "ogiltigt mål för tilldelning (op-kod %s)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+"identifierare %s: kvalificerade namn är inte tillåtna i traditionellt/POSIX-"
+"läge"
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr "identifierare %s: namnrymdsseparatorn är två kolon, inte ett"
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr "den kvalificerade identifieraren ”%s” är felaktigt formad"
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+"identifierare ”%s”: namnrymdsseparatorn kan endast förekomma in gång i ett "
+"kvalificerat namn"
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+"att använda den reserverade identifieraren ”%s” som en namnrymd är inte "
+"tillåtet"
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+"att använda den reserverade identifieraren ”%s” som den andra komponenten i "
+"ett kvalificerat namn är inte tillåtet"
+
+#: awkgram.y:6799
+msgid "@namespace is a gawk extension"
+msgstr "@namespace är en gawk-utökning"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+"namnrymdsnamnet ”%s” måste följa namngivningsreglerna för identifierare"
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s till \"%s\" misslyckades (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "standard ut"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "standard fel"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: fick ett ickenumeriskt argument"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: argumentet %g är inte inom tillåten gräns"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: kan inte spola: röret ”%.*s” är öppnat för läsning, inte skrivning"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: kan inte spola: filen ”%.*s” är öppnad för läsning, inte skrivning"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: kan inte spola filen ”%.*s”: %s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr "fflush: kan inte spola: tvåvägsröret ”%.*s” har en stängd skrivände"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush: ”%.*s” är inte en öppen fil, rör eller koprocess"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: första argumentet är inte en sträng"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: andra argumentet är inte en sträng"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: fick ett ickenumeriskt argument"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: fick ett vektorargument"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "”length(array)” är en gawk-utökning"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: fick ett argument som inte är en sträng"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: fick ett ickenumeriskt argument"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: fick ett negativt argumentet %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "ödesdigert: måste använda ”count$” på alla eller inga format"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "fältbredd ignoreras för ”%%”-specificerare"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "precision ignoreras för ”%%”-specificerare"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "fältbredd och precision ignoreras för ”%%”-specificerare"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "ödesdigert: ”$” tillåts inte i awk-format"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "ödesdigert: argumentantalet med ”$” måste vara > 0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr "ödesdigert: argumentantalet %ld är större än antalet givna argument"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "ödesdigert: ”$” tillåts inte efter en punkt i formatet"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+"ödesdigert: inget ”$” bifogat för positionsangiven fältbredd eller precision"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "”l” är meningslös i awk-format, ignorerad"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "ödesdigert: ”l” tillåts inte i POSIX awk-format"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "”L” är meningslös i awk-format, ignorerad"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "ödesdigert: ”L” tillåts inte i POSIX awk-format"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "”h” är meningslös i awk-format, ignorerad"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "ödesdigert: ”h” tillåts inte i POSIX awk-format"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: värdet %g är utanför formatet %%c giltiga intervall"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: värdet %g är inte ett giltigt brett tecken "
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: värdet %g är utanför ”%%%c”-formatets giltiga intervall"
+
+#: builtin.c:1504
+#, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: värdet %s är utanför formatet ”%%%c” giltiga intervall"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr "formatet %%%c är POSIX-standard men inte portabelt till andra awk:ar"
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"ignorerar okänt formatspecifikationstecken ”%c”: inget argument konverterat"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "ödesdigert: för få argument för formatsträngen"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ tog slut här"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: formatspecificeraren har ingen kommandobokstav"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "för många argument för formatsträngen"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: inga argument"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: inga argument"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr "printf: försök att skriva till stängd skrivände av ett tvåvägsrör"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: fick ickenumeriskt argument"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: anropad med negativt argument %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: längden %g är inte >= 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: längden %g är inte >= 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: längden %g som inte är ett heltal kommer huggas av"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr "substr: längden %g är för stor för strängindexering, huggas av till %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: startindex %g är ogiltigt, använder 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr: startindex %g som inte är ett heltal kommer huggas av"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: källsträngen är tom"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: startindex %g är bortom strängens slut"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: längden %g vid startindex %g överskrider det första argumentets "
+"längd (%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime: formatvärde i PROCINFO[\"strftime\"] har numerisk typ"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: fick ett ickenumeriskt andra argument"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: andra argumentet mindre än 0 eller för stort för time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: andra argumentet utanför intervallet för för time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: fick ett första argument som inte är en sträng"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: fick en tom formatsträng"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: fick ett argument som inte är en sträng"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: åtminstone ett av värdena är utanför standardintervallet"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "funktionen ”system” är inte tillåten i sandlådeläge"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: fick ett argument som inte är en sträng"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr "print: försök att skriva till stängd skrivände av ett tvåvägsrör"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "referens till icke initierat fält ”$%d”"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: fick ett argument som inte är en sträng"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: fick ett argument som inte är en sträng"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: fick ett ickenumeriskt första argument"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: fick ett ickenumeriskt andra argument"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: fick ett ickenumeriskt argument"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: fick ett ickenumeriskt argument"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: fick ett ickenumeriskt argument"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: tredje argumentet är inte en vektor"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: tredje argumentet ”%.*s” behandlat som 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: kan anropas indirekt endast med två argument"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "indirekt anrop till %s kräver åtminstone två argument"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: fick ett ickenumeriskt första argument"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: fick ett ickenumeriskt andra argument"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): negativa värden är inte tillåtna"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): flyttalsvärden kommer huggas av"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f): för stort skiftvärde kommer ge konstiga resultat"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: fick ett ickenumeriskt första argument"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: fick ett ickenumeriskt andra argument"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): negativa värden är inte tillåtna"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): flyttalsvärden kommer huggas av"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f): för stor skiftvärde kommer ge konstiga resultat"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: anropad med mindre än två argument"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: argument %d är inte numeriskt"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: argument %d med negativt värde %g är inte tillåtet"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: anropad med färre än två argument"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: argument %d är inte numeriskt"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: argument %d med negativt värde %g är inte tillåtet"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: anropad med färre än två argument"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: argument %d är inte numeriskt"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: argument %d med negativt värde %g är inte tillåtet"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: fick ett ickenumeriskt argument"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): negativt värde är inte tillåtet"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): flyttalsvärde kommer huggas av"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: ”%s” är inte en giltig lokalkategori"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv: tredje argumentet är inte en vektor"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv: fick ett ickenumeriskt första argument"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv: fick ett ickenumeriskt andra argument"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv: försökte dividera med noll"
+
+#: builtin.c:4046
+msgid "typeof: second argument is not an array"
+msgstr "typeof: andra argumentet är inte en vektor"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+"typeof upptäckte en ogiltig flaggkompination ”%s”, skicka gärna en "
+"felrapport."
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof: felaktig argumenttyp ”%s”"
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof: okänd argumenttyp ”%s”"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Skriv (g)awk-satser.  Avsluta med kommandot ”end”\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "ogiltigt ramnummer: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: ogiltig flagga — ”%s”"
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\": redan inläst."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\": kommandot inte tillåtet."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr ""
+"Det går inte att använda kommandot ”commands” i brytpunkts-/"
+"observationspunktskommandon"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "ingen brytpunkt/observationspunkt har satts ännu"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "ogiltigt brytpunkts-/observationspunktsnummer"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Skriv kommandon att användas när %s %d träffas, ett per rad.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Avsluta med kommandot ”end”\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "”end” är giltigt endast i kommandona ”commands” och ”eval”"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "”silent” är giltigt endast i kommandot ”commands”"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: ogiltig flagga — ”%s”"
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: ogiltigt brytpunkts-/observationspunktsnummer"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "argumentet är inte en sträng"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: ogiltig parameter — ”%s”"
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "ingen sådan funktion — ”%s”"
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: ogiltig flagga — ”%s”"
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "ogiltigt intervallspecifikation: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "icke numeriskt värde som fältnummer"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "ickenumeriskt värde fanns, numeriskt förväntades"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "heltalsvärde som inte är noll"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] — skriv ett spår över alla eller N innersta (yttersta om N < "
+"0) ramar."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr "break [[filename:]N|function] — sätt brytpunkt på den angivna platsen."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr "clear [[filnamn:]N|funktion] — radera tidigare satta brytpunkter."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [num] — startar en lista av kommandon att köra när en "
+"brytpunkt(observationspunkt) träffas."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition num [uttr] — sätt eller töm en brytpunkts eller observationspunkts "
+"villkor."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [ANTAL] — fortsätt programmet som felsöks."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr "delete [brytpunkter] [intervall] — radera angivna brytpunkter."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr "disable [brytpunkter] [intervall] — avaktivera angivna brytpunkter."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr ""
+"display [var] — skriv ut värdet på variabeln varje gång programmet stoppar."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] — flytta N ramar ner i stacken."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr "dump [filnamn] — skriv instruktioner till filen eller standard ut."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr ""
+"enable [once|del] [brytpunkter] [intervall] — aktivera angivna brytpunkter."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end — avsluta en lista av kommandon eller awk-satser."
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval sats|[p1, p2, ...] — utför awk-sats(er)."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit — (samma som quit) avsluta felsökaren."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish — kör tills den valda stackramen returnerar."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] — välj och skriv ut stackram nummer N."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr ""
+"help [kommando] — skriv listan av kommandon eller en förklaring av kommando."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr ""
+"ignore N ANTAL — sätt ignoreringsantal på brytpunkt nummer N till ANTAL."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info topic — source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr "list [-|+|[filnamn:]radnr|funktion|intervall] — lista angivna rad(er)."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr "next [ANTAL] — stega programmet, passera genom subrutinanrop."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr "nexti [ANTAL] — stega en instruktion, men passera genom subrutinanrop."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [namn[=värde]] — sätt eller visa felsökningsalternativ."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [var] — skriv värdet på en variabel eller vektor."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf format, [arg], … — formaterad utskrift."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit — avsluta felsökaren."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr "return [värde] — låt den valda stackramen returnera till sin anropare."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run — starta eller starta om körningen av programmet."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save filnamn — spara kommandon från sessionen i en fil."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set var = värde — tilldela värde till en skalär variabel."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent — undertrycker normala meddelanden vid stopp på en brytpunkt/"
+"observationspunkt. "
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source fil — kör kommandon från fil."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr "step [ANTAL] — stega programmet tills det når en annan källkodsrad."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [ANTAL] — stega exakt en instruktion."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[filenamn:]N|funktion] — sätt en tillfällig brytpunkt."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off — skriv ut instruktioner före de körs."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr "undisplay [N] — ta bort variabler från listan över automatiskt visade."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[filenamn:]N|funktion] — kör tills programmet når en annan rad eller "
+"rad N inom aktuell ram."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] — ta bort variabler från observationslistan."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] — flytta N ramar uppåt i stacken."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch var — sätt en observationspunkt för en variabel."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where [N] — (samma som backtrace) skriv ett spår över alla eller N innersta "
+"(yttersta om N < 0) ramar."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "kan inte läsa kommando (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "kan inte läsa kommandot (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "ogiltigt tecken i kommandot"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "okänt kommando — ”%.*s”, försök med help"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "ogiltigt tecken"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "odefinierat kommando: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr "sätt eller visa antalet rader att behålla i historikfilen."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "sätt eller visa fönsterstorleken för listkommandot."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "sätt eller visa gawks utmatningsfil."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "sätt eller visa felsökningsprompten."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr "slå av/på eller visa sparandet av kommandohistorik (värde=on|off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "slå av/på eller visa sparandet av flaggor (värde=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "slå av/på eller visa instruktionsspårande (värde=on|off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "programmet kör inte."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "kan inte läsa källfilen ”%s” (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "källfilen ”%s” är tom.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "ingen aktuell källkodsfil."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "kan inte hitta någon källfil med namnet ”%s” (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr "VARNING: källfilen ”%s” ändrad sedan programmet kompilerades.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "radnummer %d utanför intervallet; ”%s” har %d rader"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "oväntat filslut när filen ”%s” lästes, rad %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "källfilen ”%s” ändrad sedan början av programkörningen"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Aktuell källfil: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Antalet rader: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Källfilen (rader): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Nummer  Visa  Aktiv    Plats\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tantal träffar = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tignorera nästa %ld träffar\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tstoppvillkor: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tkommandon:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Aktuell ram: "
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Anropad av ramen: "
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Anropare av ramen: "
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Ingen i main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Inga argument.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Inga lokala.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Alla definierade variabler:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Alla definierade funktioner:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Automatvisade variabler:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Observerade variabler:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "ingen symbol ”%s” i aktuellt sammanhang\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "”%s” är inte en vektor\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = oinitierat fält\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "vektorn ”%s” är tom\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%.*s\"] finns inte i vektorn ”%s”\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "”%s[\"%.*s\"]” är inte en vektor\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "”%s” är inte en skalär variabel"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "försök att använda vektorn ”%s[\"%.*s\"]” i skalärt sammanhang"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "försök att använda skalären ”%s[\"%.*s\"]” som en vektor"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "”%s” är en funktion"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "observationspunkt %d är ovillkorlig\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "Ingen visningspost med numret %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Ingen observationspost med numret %ld"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%.*s\"] finns inte i vektorn ”%s”\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "försök att använda ett skalärt värde som vektor"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr ""
+"Observationspunkt %d raderad för att parametern är utanför sin räckvidd.\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "Visning %d raderad för att parametern är utanför sin räckvidd.\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " i filen ”%s”, rad %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " vid ”%s”:%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\ti "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Fler stackramar följer …\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "Ogiltigt ramnummer"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Observera: brytpunkt %d (aktiverad, ignorera följande %ld träffar), är också "
+"satt vid %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Observera: brytpunkt %d (aktiverad), är också satt vid %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Observera: brytpunkt %d (avaktiverad, ignorera följande %ld träffar), är "
+"också satt vid %s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Observera: brytpunkt %d (avaktiverad), är också satt vid %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Brytpunkt %d satt vid filen ”%s”, rad %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "Kan inte sätta en brytpunkt i filen ”%s”\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "radnummer %d i filen ”%s” är utanför tillåtet intervall"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Kan inte hitta regeln!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "Kan inte sätta en brytpunkt vid ”%s”:%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Kan inte sätta en brytpunkt i funktionen ”%s”\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "brytpunkt %d satt i filen ”%s”, rad %d är ovillkorlig\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Raderade brytpunkt %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "Inga brytpunkter vid ingången till funktionen ”%s”\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Ingen brytpunkt i filen ”%s”, rad nr. %d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "ogiltigt brytpunktsnummer"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Radera alla brytpunkter? (j eller n)"
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "j"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Kommer ignorera följande %ld passager av brytpunkt %d.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "Kommer stanna nästa gång brytpunkt %d nås.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "Kan bara felsöka program som getts flaggan ”-f”.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Misslyckades att starta om felsökaren"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Programmet kör redan.  Starta om från början (j/n)? "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Programmet inte omstartat\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "fel: kan inte starta om, åtgärden är inte tillåten\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "fel (%s): kan inte starta om, ignorerar resten av kommandona\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Startar programmet: \n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Programmet avslutade onormalt med slutvärdet: %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Programmet avslutade normalt med slutvärdet: %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "Programmet kör.  Avsluta ändå (j/n)? "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Inte stoppad vid någon brytpunkt, argumentet ignoreras.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "ogiltigt brytpunktsnummer %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Kommer ignorera de nästa %ld passagerna av brytpunkt %d.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "”finish” är inte meningsfullt i den yttersta ramen main()\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Kör till retur från "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "”return” är inte meningsfullt i den yttersta ramen main()\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "Kan inte hitta angiven plats i funktionen ”%s”\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "ogiltig källrad %d i filen ”%s”"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "Kan inte hitta angiven plats %d i filen ”%s”\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "elementet finns inte i vektorn\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "otypad variabel\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Stannar i %s …\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "”finish” är inte meningsfullt med icke lokalt hopp ”%s”\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "”until” är inte meningsfullt med icke lokalt hopp ”%s”\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr ""
+"\t------[Retur] för att fortsätta eller a [Retur] för att avsluta------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "a"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] finns inte i vektorn ”%s”"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "skickar utdata till standard ut\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "ogiltigt tal"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "”%s” är inte tillåtet i det aktuella sammanhanget; satsen ignoreras"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr ""
+"”return” är inte tillåtet i det aktuella sammanhanget; satsen ignoreras"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Ingen symbol ”%s” i aktuell omgivning"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "okänd nodtyp %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "okänd op-kod %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "op-kod %s är inte en operator eller ett nyckelord"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "buffertöverflöd i genflags2str"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Funktionsanropsstack:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "”IGNORECASE” är en gawk-utökning"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "”BINMODE” är en gawk-utökning"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "BINMODE-värde ”%s” är ogiltigt, behandlas som 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "felaktig ”%sFMT”-specifikation ”%s”"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "slår av ”--lint” på grund av en tilldelning till ”LINT”"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "referens till icke initierat argument ”%s”"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "referens till icke initierad variabel ”%s”"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "försök att fältreferera från ickenumeriskt värde"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "försök till fältreferens från en tom sträng"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "försök att komma åt fält nummer %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "referens till icke initierat fält ”$%ld”"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "funktionen ”%s” anropad med fler argument än vad som deklarerats"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: oväntad typ ”%s”"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "försökte dividera med noll i ”/=”"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "försökte dividera med noll i ”%%=”"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "utökningar är inte tillåtna i sandlådeläge"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load är gawk-utökningar"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: mottog NULL-lib_name"
+
+#: ext.c:60
+#, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: kan inte öppna biblioteket ”%s” (%s)"
+
+#: ext.c:66
+#, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: biblioteket ”%s”: definierar inte ”plugin_is_GPL_compatible” (%s)"
+
+#: ext.c:72
+#, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: biblioteket ”%s”: kan inte anropa funktionen ”%s” (%s)"
+
+#: ext.c:76
+#, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: initieringsrutinen ”%2$s” i biblioteket ”%1$s” misslyckades"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: funktionsnamn saknas"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: kan inte använda gawks inbyggda ”%s” som ett funktionsnamn"
+
+#: ext.c:109
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: kan inte använda gawks inbyggda ”%s” som ett namnrymdsnamn"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: det går inte att definiera om funktionen ”%s”"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: funktionen ”%s” är redan definierad"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: funktionsnamnet ”%s” är definierat sedan tidigare"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: negativt argumentantal för funktionen ”%s”"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr "funktionen ”%s”: argument %d: försök att använda skalär som vektor"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "funktionen ”%s”: argument %d: försök att använda vektor som skalär"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "dynamisk laddning av bibliotek stödjs inte"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: kan inte läsa den symboliska länken ”%s”"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: felaktiga parametrar"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init: kunde inte skapa variabeln %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "fts stödjs inte på detta system"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: kunde inte skapa en vektor"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: kunde inte sätta ett element"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: kunde inte sätta ett element"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: kunde inte sätta ett element"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: kunde inte skapa en vektor"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: kunde inte sätta ett element"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: anropad med felaktigt antal argument, förväntade 3"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: felaktig första parameter"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: felaktig andra parameter"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: felaktig tredje parameter"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: kunde inte platta till en vektor\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: ignorerar lömsk FTS_NOSTAT-flagga, nä, nä, nä."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() misslyckades\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: kunde inte hämta första argumentet"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: kunde inte hämta andra argumentet"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: kunde inte hämta ett tredje argument"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch är inte implementerat på detta system\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init: kunde inte lägga till en FNM_NOMATCH-variabel"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: kunde inte sätta vektorelement %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init: kunde inte installera en FNM-vektor"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO är inte en vektor!"
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace::begin: redigering på plats är redan aktivt"
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace::begin: förväntar sig 2 argument men anropad med %d"
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr "inplace::begin: kan inte hämta 1:a argumentet som en filnamnssträng"
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr ""
+"inplace::begin: avaktiverar redigering på plats för ogiltigt FILNAMN ”%s”"
+
+#: extension/inplace.c:152
+#, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace::begin: kan inte ta status på ”%s” (%s)"
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace::begin: ”%s” är inte en vanlig fil"
+
+#: extension/inplace.c:170
+#, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace::begin: mkstemp(”%s”) misslyckades (%s)"
+
+#: extension/inplace.c:182
+#, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace::begin: chmod misslyckades (%s)"
+
+#: extension/inplace.c:189
+#, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace::begin: dup(standard ut) misslyckades (%s)"
+
+#: extension/inplace.c:192
+#, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::begin: dup2(%d, standard ut) misslyckades (%s)"
+
+#: extension/inplace.c:195
+#, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace::begin: close(%d) misslyckades (%s)"
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace::end: förväntar sig 2 argument men anropad med %d"
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr "inplace::end: kan inte hämta 1:a argumentet som en filnamnssträng"
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace::end: redigering på plats är inte aktivt"
+
+#: extension/inplace.c:227
+#, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::end: dup2(%d, standard ut) misslyckades (%s)"
+
+#: extension/inplace.c:230
+#, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace::end: close(%d) misslyckades (%s)"
+
+#: extension/inplace.c:234
+#, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace::end: fsetpos(standard ut) misslyckades (%s)"
+
+#: extension/inplace.c:247
+#, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace::end: link(”%s”, ”%s”) misslyckades (%s)"
+
+#: extension/inplace.c:257
+#, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace::end: rename(”%s”, ”%s”) misslyckades (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: anropad med felaktiga argument"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: anropad med felaktiga argument"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir misslyckades: %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: anropad med fel sorts argument"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: kunde inte initiera REVOUT-variabeln"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: argument 0 är inte en sträng\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: argument 1 är inte en vektor\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: kunde inte platta till vektor\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: kunde inte släppa en tillplattad vektor\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "vektorvärde har en okänd typ %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: argument 0 är inte en sträng\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: argument 1 är inte en vektor\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array misslyckades\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element misslyckades\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr "hanterar återvunnet värde med okänd typkod %d som en sträng"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: stödjs inte på denna plattform"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: nödvändigt numeriskt argument saknas"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: argumentet är negativt"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: stödjs inte på denna plattform"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "indataposten är för stor"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF satt till ett negativt värde"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr "dekrementering av NF är inte portabelt till många awk-versioner"
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr "att komma åt fält från en END-regel är inte med säkerhet portabelt"
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split: fjärde argumentet är en gawk-utökning"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split: fjärde argumentet är inte en vektor"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: andra argumentet är inte en vektor"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split: det går inte att använda samma vektor som andra och fjärde argument"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split: det går inte att använda en delvektor av andra argumentet som fjärde "
+"argument"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split: det går inte att använda en delvektor av fjärde argumentet som andra "
+"argument"
+
+#: field.c:1036
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split: tom sträng som tredje argument är en icke-standard-utökning"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: fjärde argumentet är inte en vektor"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: andra argumentet är inte en vektor"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: tredje argumentet får inte vara tomt"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit: det går inte att använda samma vektor som andra och fjärde argument"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit: det går inte att använda en delvektor av andra argumentet som "
+"fjärde argument"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit: det går inte att använda en delvektor av fjärde argumentet som "
+"andra argument"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "”FIELDWIDTHS” är en gawk-utökning"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "”*” måste vara den sista beteckningen i FIELDWIDTHS"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "ogiltigt FIELDWITHS-värde, för fält %d, i närheten av ”%s”"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "tom sträng som ”FS” är en gawk-utökning"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "gamla awk stöder inte reguljära uttryck som värden på ”FS”"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "”FPAT” är en gawk-utökning"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: mottog null-returvärde"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: inte i MPFR-läge"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: MPFR stödjs inte"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: felaktig numerisk typ ”%d”"
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "add_ext_func: mottog NULL-name_space-parameter"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+"node_to_awk_value: upptäckte felaktig kombination av numeriska flaggor ”%s”, "
+"vänligen skicka en felrapport."
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: mottog null-nod"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: mottog null-värde"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+"node_to_awk_value upptäckte felaktig kombination av numeriska flaggor ”%s”, "
+"vänligen skicka en felrapport."
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: fick en null-vektor"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: mottog null-index"
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array_typed: kunde inte konvertera index %d till %s"
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array_typed: kunde inte konvertera värdet %d till %s"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr: MPFR stödjs inte"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "kan inte hitta sluten på BEGINFILE-regeln"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "kan inte öppna okänd filtyp ”%s” för ”%s”"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "kommandoradsargumentet ”%s” är en katalog: hoppas över"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "kan inte öppna filen ”%s” för läsning (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "stängning av fd %d (”%s”) misslyckades (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "omdirigering är inte tillåten i sandlådeläge"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "uttrycket i ”%s”-omdirigering är ett tal"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "uttrycket för ”%s”-omdirigering har en tom sträng som värde"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"filnamnet ”%.*s” för ”%s”-omdirigering kan vara resultatet av ett logiskt "
+"uttryck"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "onödig blandning av ”>” och ”>>” för filen ”%.*s”"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file kan inte skapa röret ”%s” med fb %d"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "kan inte öppna röret ”%s” för utmatning (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "kan inte öppna röret ”%s” för inmatning (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"att get_file skapar ett uttag stödjs inte på denna plattform för ”%s” med fd "
+"%d"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "kan inte öppna tvåvägsröret ”%s” för in-/utmatning (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "kan inte dirigera om från ”%s” (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "kan inte dirigera om till ”%s” (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"nådde systembegränsningen för öppna filer: börjar multiplexa fildeskriptorer"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "stängning av ”%s” misslyckades (%s)."
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "för många rör eller indatafiler öppna"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: andra argumentet måste vara ”to” eller ”from”"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close: ”%.*s” är inte en öppen fil, rör eller koprocess"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "stängning av omdirigering som aldrig öppnades"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: omdirigeringen ”%s” öppnades inte med ”|&”, andra argumentet ignorerat"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "felstatus (%d) från rörstängning av ”%s” (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "felstatus (%d) från filstängning av ”%s” (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "ingen explicit stängning av uttaget ”%s” tillhandahållen"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "ingen explicit stängning av koprocessen ”%s” tillhandahållen"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "ingen explicit stängning av röret ”%s” tillhandahållen"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "ingen explicit stängning av filen ”%s” tillhandahållen"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush: kan inte spola standard ut: %s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush: kan inte spola standard fel: %s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "fel vid skrivning till standard ut (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "fel vid skrivning till standard fel (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "rörspolning av ”%s” misslyckades (%s)."
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "koprocesspolning av röret till ”%s” misslyckades (%s)."
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "filspolning av ”%s” misslyckades (%s)."
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "lokal port %s ogiltig i ”/inet“: %s"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "lokal port %s ogiltig i ”/inet”"
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "ogiltig information (%s, %s) för fjärrvärd och fjärrport: %s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "ogiltig information (%s, %s) för fjärrvärd och fjärrport"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "TCP/IP-kommunikation stöds inte"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "kunde inte öppna ”%s”, läge ”%s”"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "stängning av huvudpty misslyckades (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "stängning av standard ut i barnet misslyckades (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr "flyttandet av slavpty till standard ut i barnet misslyckades (dup: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "stängning av standard in i barnet misslyckades (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr "flyttandet av slavpty till standard in i barnet misslyckades (dup: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "stängning av slavpty misslyckades (%s)"
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr "kan inte skapa barnprocess eller öppna en pty"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr "flyttande av rör till standard ut i barnet misslyckades (dup: %s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr "flyttande av rör till standard in i barnet misslyckades (dup: %s)"
+
+#: io.c:2386 io.c:2655
+msgid "restoring stdout in parent process failed"
+msgstr "återställande av standard ut i föräldraprocessen misslyckades"
+
+#: io.c:2394
+msgid "restoring stdin in parent process failed"
+msgstr "återställande av standard in i föräldraprocessen misslyckades"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "stängning av röret misslyckades (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "”|&” stöds inte"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "kan inte öppna röret ”%s” (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "kan inte skapa barnprocess för ”%s” (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr "getline: försök att läsa från stängd läsände av ett tvåvägsrör"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: mottog NULL-pekare"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"inmatningstolken ”%s” står i konflikt med tidigare installerad "
+"inmatningstolk ”%s”"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "inmatningstolken ”%s” misslyckades att öppna ”%s”"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: mottog NULL-pekare"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"utmatningsomslag ”%s” står i konflikt med tidigare installerat "
+"utmatningsomslag ”%s”"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "utmatningsomslag ”%s” misslyckades att öppna ”%s”"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: mottog NULL-pekare"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"tvåvägsprocessorn ”%s” står i konflikt med tidigare installerad "
+"tvåvägsprocessor ”%s”"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "tvåvägsprocessorn ”%s” misslyckades att öppna ”%s”"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "datafilen ”%s” är tom"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "kunde inte allokera mer indataminne"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "flerteckensvärdet av ”RS” är en gawk-utökning"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "IPv6-kommunikation stöds inte"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr "miljövariabeln ”POSIXLY_CORRECT” satt: slår på ”--posix”"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "”--posix” åsidosätter ”--traditional”"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "”--posix”/”--traditional” åsidosätter ”--non-decimal-data”"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "”--posix” åsidosätter ”--character-as-bytes”"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "att köra %s setuid root kan vara ett säkerhetsproblem"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "kan inte sätta binärläge på standard in (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "kan inte sätta binärläge på standard ut (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "kan inte sätta binärläge på standard fel (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "ingen programtext alls!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"Användning: %s [POSIX- eller GNU-stilsflaggor] -f progfil [--] fil ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr "Användning: %s [POSIX- eller GNU-stilsflaggor] %cprogram%c fil ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "POSIX-flaggor:\t\tGNU långa flaggor: (standard)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f progfil\t\t--file=progfil\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=värde\t\t--assign=var=värde\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Korta flaggor:\t\tGNU långa flaggor: (utökningar)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[fil]\t\t\t--dump-variables[=fil]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[fil]\t\t\t--debug[=fil]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e 'programtext'\t--source='programtext'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E fil\t\t\t--exec=fil\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i inkluderingsfil\t--include=inkluderingsfil\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l bibliotek\t\t--load=bibliotek\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[fil]\t\t\t--pretty-print[=fil]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[fil]\t\t\t--profile[=fil]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr "\t-Z lokalnamn\t\t--locale=lokalnamn\n"
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"För att rapportera fel, se noden ”Bugs” i ”gawk.info”, vilket är\n"
+"avsnittet ”Reporting Problems and Bugs” i den utskrivna versionen.\n"
+"Samma information finns på\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"Vänligen försök INTE rapportera fel genom att skriva i comp.lang.awk. \n"
+"\n"
+"eller genom att använda ett webbforum såsom Stack Overflow.\n"
+"\n"
+"Rapportera synpunkter på översättningen till <tp-sv@listor.tp-sv.se>.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk är ett mönsterskannande och -bearbetande språk.\n"
+"Normalt läser det från standard in och skriver till standard ut.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Exempel:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' fil\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Copyright © 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"Detta program är fri programvara. Du kan distribuera det och/eller\n"
+"modifiera det under villkoren i GNU General Public License, publicerad\n"
+"av Free Software Foundation, antingen version 3 eller (om du så vill)\n"
+"någon senare version.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Detta program distribueras i hopp om att det ska vara användbart,\n"
+"men UTAN NÅGON SOM HELST GARANTI, även utan underförstådd garanti\n"
+"om SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT SPECIELLT ÄNDAMÅL. Se GNU\n"
+"General Public License för ytterligare information.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Du bör ha fått en kopia av GNU General Public License tillsammans\n"
+"med detta program.  Om inte, se http://www.gnu.org/licenses/.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft sätter inte FS till tab i POSIX-awk"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr "%s: Argumentet ”%s” till ”-v” är inte på formatet ”var=värde”\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "”%s” är inte ett giltigt variabelnamn"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "”%s” är inte ett variabelnamn, letar efter filen ”%s=%s”"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "kan inte använda gawks inbyggda ”%s” som ett funktionsnamn"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "kan inte använda funktionen ”%s” som variabelnamn"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "flyttalsundantag"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "ödesdigert fel: internt fel"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "ödesdigert fel: internt fel: segmenteringsfel"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "ödesdigert fel: internt fel: stackspill"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "ingen föröppnad fd %d"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "kunde inte föröppna /dev/null för fd %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "tomt argument till ”-e/--source” ignorerat"
+
+#: main.c:1662 main.c:1667
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "”--profile” åsidosätter ”--pretty-print”"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M ignoreras: MPFR/GMP-stöd är inte inkompilerat"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: flaggan ”-W %s” okänd, ignorerad\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: flaggan kräver ett argument -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "PREC-värdet ”%.*s” är ogiltigt"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "RNDMODE-värdet ”%.*s” är ogiltigt"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: fick ett ickenumeriskt argument"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): negativt värde är inte tillåtet"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg): flyttalsvärden kommer huggas av"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): negativa värden är inte tillåtna"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: fick ett ickenumeriskt argument nr. %d"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: argument nr. %d har ogiltigt värde %Rg, använder 0"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: argument nr. %d:s negativa värde %Rg är inte tillåtet"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: argument nr. %d flyttalsvärde %Rg kommer huggas av"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: argument nr. %d:s negativa värde %Zd är inte tillåtet"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "kommandorad:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "kunde inte göra ett typat reguljärt uttryck"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "gamla awk stöder inte kontrollsekvensen ”\\%c”"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX tillåter inte ”\\x”-kontrollsekvenser"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "inga hexadecimala siffror i ”\\x”-kontrollsekvenser"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"hexkod \\x%.*s med %d tecken tolkas förmodligen inte på det sätt du "
+"förväntar dig"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "kontrollsekvensen ”\\%c” behandlad som bara ”%c”"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Ogiltig multibytedata upptäckt.  Dina data och din lokal stämmer kanske inte "
+"överens."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s ”%s”: kunde inte hämta fb-flaggor: (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s ”%s”: kunde inte sätta stäng-vid-exec (fcntl F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr "Programindenteringsnivån är för djup.  Överväg att refkatorera din kod"
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "kunde inte öppna ”%s” för skrivning: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "skickar profilen till standard fel"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s-regler\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Regel/regler\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "internt fel: %s med null vname"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "internt fel: inbyggd med tomt fname"
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"%s# Inlästa utvidgningar (-l och/eller @load)\n"
+"\n"
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\n"
+"# Inkluderade filer (-i och/eller @include)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# gawkprofil, skapad %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Funktioner, listade alfabetiskt\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: okänd omdirigeringstyp %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+"beteendet vid matchning av ett reguljäruttryck som innehåller NULL-tecken är "
+"inte definierat av POSIX"
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr "felaktig NULL-byte i dynamiskt reguljäruttryck"
+
+#: re.c:172
+#, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "kontrollsekvensen ”\\%c” i reguljäruttryck behandlad som bara ”%c”"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+"kontrollsekvensen ”\\%c” i reguljäruttryck är inte en känd operator i "
+"reguljäruttryck"
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "komponenten ”%.*s” i reguljäruttryck skall förmodligen vara ”[%.*s]”"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "obalanserad ["
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "ogiltig teckenklass"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "syntaxen för teckenklass är [[:space:]], inte [:space:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "oavslutad \\-följd"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "ogiltigt innehåll i \\{\\}"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "reguljärt uttryck för stort"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "obalanserad ("
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "ingen syntax angiven"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr "obalanserad )"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: flaggan ”%s” är tvetydig; möjligheter:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: flaggan ”--%s” tillåter inte något argument\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: flaggan ”%c%s” tillåter inte något argument\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: flaggan ”%s” kräver ett argument\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: okänd flagga ”--%s”\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: okänd flagga ”%c%s”\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: ogiltig flagga -- ”%c”\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: flaggan kräver ett argument -- ”%c”\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: flaggan ”-W %s” är tvetydig\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: flaggan ”-W %s” tillåter inte något argument\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: flaggan ”-W %s” kräver ett argument\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Lyckades"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Misslyckades"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Ogiltigt reguljärt uttryck"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ogiltigt kollationeringstecken"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Ogiltigt teckenklassnamn"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Eftersläpande omvänt snedstreck"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Ogiltig bakåtrerefens"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Obalanserad [, [^, [:, [. eller [="
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Obalanserad ( eller \\("
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Obalanserad \\{"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Ogiltigt innehåll i \\{\\}"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Ogiltigt omfångsslut"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Minnet slut"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Ogiltigt föregående reguljärt uttryck"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "För tidigt slut på reguljärt uttryck"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Reguljärt uttryck för stort"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Obalanserad ) eller \\)"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Inget föregående reguljärt uttryck"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr ""
+"funktionen ”%s”: kan inte använda funktionen ”%s” som ett parameternamn"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "kan inte poppa huvudsammanhang"
diff --git a/gawk-5.0.1/po/vi.po b/gawk-5.0.1/po/vi.po
new file mode 100644
index 00000000000..ef38c84f2a7
--- /dev/null
+++ b/gawk-5.0.1/po/vi.po
@@ -0,0 +1,4015 @@
+# Vietnamese translation for Gawk.
+# Bản dịch Tiếng Việt dành cho Gawk.
+# Copyright © 2016 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# Clytie Siddall <clytie@riverland.net.au>, 2005-2010.
+# Trần Ngọc Quân <vnwildman@gmail.com>, 2012-2014, 2015, 2016, 2017, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.2.0e\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2018-01-30 08:07+0700\n"
+"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
+"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
+"Language: vi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Gtranslator 2.91.7\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "từ %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "cố dùng giá trị vô hướng như là một mảng"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "cố dùng tham số vô hướng “%s” như là mảng"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "cố dùng “%s” vô hướng như là mảng"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "cố gắng dùng mảng “%s” trong một ngữ cảnh vô hướng"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete: (xóa) chỉ số “%.*s” không nằm trong mảng “%s”"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "cố dùng “%s[\"%.*s\"]” vô hướng như là mảng"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump: đối số thứ nhất không phải là một mảng"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort: đối số thứ hai không phải là một mảng"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti: đối số thứ hai không phải là một mảng"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort: đối số thứ nhất không phải là một mảng"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti: đối số thứ nhất không phải là một mảng"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asort (một chương trình xắp xếp thứ tự): không thể sử dụng mảng con của tham "
+"số thứ nhất cho tham số thứ hai"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr ""
+"asorti (một chương trình xắp xếp thứ tự): không thể sử dụng mảng con của "
+"tham số thứ nhất cho tham số thứ hai"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asort (một chương trình xắp xếp thứ tự): không thể sử dụng mảng con của tham "
+"số thứ hai cho tham số thứ nhất"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr ""
+"asorti (một chương trình xắp xếp thứ tự): không thể sử dụng mảng con của "
+"tham số thứ hai cho tham số thứ nhất"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "“%s” không phải là tên hàm hợp lệ"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "chưa định nghĩa hàm so sánh xắp xếp “%s”"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "Mọi khối %s phải có một phần kiểu hành động"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "Mọi quy tắc phải có một mẫu hay phần kiểu hành động"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr ""
+"awk cũ không hỗ trợ nhiều quy tắc kiểu “BEGIN” (bắt đầu) hay “END” (kết thúc)"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "“%s” là một hàm có sẵn nên nó không thể được định nghĩa lại."
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr ""
+"hằng biểu thức chính quy “//” trông giống như một chú thích C++, nhưng mà "
+"không phải"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr ""
+"hằng biểu thức chính quy “/%s/” trông giống như một chú thích C, nhưng mà "
+"không phải"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "gặp giá trị case bị trùng trong phần thân switch: %s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr ""
+"đã phát hiện trùng “default” trong thân cấu trúc điều khiển chọn lựa (switch)"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr ""
+"không cho phép “break” (ngắt) nằm ở ngoại vòng lặp hay cấu trúc chọn lựa"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "không cho phép “continue” (tiếp tục) ở ngoài một vòng lặp"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "“next” (kế tiếp) được dùng trong hành động %s"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "“nextfile” (tập tin kế tiếp) được dùng trong hành động %s"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "“return” (trở về) được dùng ở ngoại ngữ cảnh hàm"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr ""
+"“print” (in) thường trong quy tắc “BEGIN” (bắt đầu) hay “END” (kết thúc) gần "
+"như chắc chắn nên là “print”””"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "“delete” không được phép với SYMTAB"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "“delete” không được phép với FUNCTAB"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "“delete array” (xóa mảng) là phần mở rộng gawk không khả chuyển"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "đường ống dẫn hai chiếu đa giai đoạn không phải hoạt động được"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr ""
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "biểu thức chính quy nằm bên phải phép gán"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "biểu thức chính quy nằm bên trái toán tử “~” hay “!~”"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "awk cũ không hỗ trợ từ khóa “in”, trừ khi nằm sau “for”"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "biểu thức chính quy nằm bên phải sự so sánh"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "“getline” không-chuyển-hướng không hợp lệ trong quy tắc “%s”"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr ""
+"trong hành động “END” (kết thúc) có “getline” (lấy dòng) không được chuyển "
+"hướng lại và chưa được định nghĩa."
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "awk cũ không hỗ trợ mảng đa chiều"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr ""
+"lời gọi “length” (độ dài) mà không có dấu ngoặc đơn là không tương thích "
+"trên các hệ thống khác"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "cuộc gọi hàm gián tiếp là một phần mở rộng gawk"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr "không thể dùng biến đặc biệt “%s” cho cú gọi hàm gián tiếp"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "cố gắng dùng không-phải-hàm “%s” trong cú gọi hàm"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "biểu thức in thấp không hợp lệ"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "cảnh báo: "
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "lỗi nghiêm trọng: "
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "gặp dòng mới hay kết thúc chuỗi bất ngờ"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr ""
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "không thể mở tập tin nguồn “%s” để đọc (%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "không thể mở tập thư viện chia sẻ “%s” để đọc (%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "không rõ lý do"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "không thể bao gồm “%s” và dùng nó như là tập tin chương trình"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "đã sẵn bao gồm tập tin nguồn “%s”"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "thư viện dùng chung “%s” đã được sẵn được tải rồi"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include là phần mở rộng của gawk"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "tập tin trống sau @include"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load là một phần mở rộng gawk"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "tên tập tin trống sau @load"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "gặp đoạn chữ chương trình rỗng nằm trên dòng lệnh"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "không thể đọc tập tin nguồn “%s” (%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "tập tin nguồn “%s” là rỗng"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "Lỗi PEBKAC: gặp ký tự không hợp lệ “\\%03o” trong mã nguồn"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "tập tin nguồn không kết thúc bằng một dòng trống"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr ""
+"biểu thức chính quy chưa được chấm dứt kết thúc với “\\” tại kết thúc của "
+"tập tin"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"%s: %d: bộ sửa đổi biểu thức chính quy tawk “/…/%c” không hoạt động được "
+"trong gawk"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr ""
+"bộ sửa đổi biểu thức chính quy tawk “/…/%c” không hoạt động được trong gawk"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "biểu thức chính quy chưa được chấm dứt"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "biểu thức chính quy chưa được chấm dứt nằm tại kết thúc của tập tin"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "không thể mang khả năng dùng “\\#…” để tiếp tục dòng"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "dấu gạch ngược không phải là ký tự cuối cùng nằm trên dòng"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "mảng nhiều chiều là một phần mở rộng gawk"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX không cho phép toán tử “**=”"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "awk cũ không hỗ trợ toán tử “**=”"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX không cho phép toán tử “**”"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "awk cũ không hỗ trợ toán tử “**”"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "awk cũ không hỗ trợ toán tử “^=”"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "awk cũ không hỗ trợ toán tử “^”"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "chuỗi không được chấm dứt"
+
+#: awkgram.y:4048 main.c:1220
+#, fuzzy
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX không cho phép thoát chuỗi “\\x”"
+
+#: awkgram.y:4050 node.c:453
+#, fuzzy
+msgid "backslash string continuation is not portable"
+msgstr "không thể mang khả năng dùng “\\#…” để tiếp tục dòng"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "có ký tự không hợp lệ “%c” nằm trong biểu thức"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "“%s” là một phần mở rộng gawk"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX không cho phép “%s”"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "awk kiểu cũ không hỗ trợ “%s”"
+
+#: awkgram.y:4494
+#, fuzzy
+msgid "`goto' considered harmful!"
+msgstr "“goto” được xem là có hại!\n"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "“%d” không hợp lệ khi là số đối số cho “%s”"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr ""
+"%s: khi đối số cuối cùng của sự thay thế, hằng mã nguồn chuỗi không có tác "
+"dụng"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "tham số thứ ba %s không phải là một đối tượng có thể thay đổi"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match: (khớp) đối số thứ ba là phần mở rộng gawk"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close: (đóng) đối số thứ hai là phần mở rộng gawk"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "dùng “dcgettext(_\"…\")” không đúng: hãy gỡ bỏ gạch dưới nằm trước"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "dùng “dcgettext(_\"…\")” không đúng: hãy gỡ bỏ gạch dưới nằm trước"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr ""
+"index: (chỉ mục) không cho phép hằng biểu thức chính quy làm đối số thứ hai"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "hàm “%s”: tham số “%s” che biến toàn cục"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "không mở được “%s” để ghi (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "đang gởi danh sách biến tới thiết bị lỗi chuẩn"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s: gặp lỗi khi đóng (%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() (hàm bóng) được gọi hai lần!"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "có biến bị bóng."
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "tên hàm “%s” trước đây đã được định nghĩa rồi"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "hàm “%s”: không thể dùng tên hàm như là tên tham số"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr "hàm “%s”: không thể dùng biến đặc biệt “%s” như là tham số hàm"
+
+#: awkgram.y:5092
+#, fuzzy, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "hàm “%s”: tham số “%s” che biến toàn cục"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "hàm “%s”: tham số “#%d”, “%s”, nhân đôi tham số “#%d”"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "hàm “%s” được gọi nhưng mà chưa định nghĩa"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "hàm “%s” được định nghĩa nhưng mà chưa được gọi trực tiếp bao giờ"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "hằng biểu thức chính quy cho tham số “#%d” làm giá trị luận lý (bun)"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"hàm “%s” được gọi với dấu cách nằm giữa tên và “(”\n"
+"hoặc được dùng như là biến hay mảng"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "gặp phép chia cho số không"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "gặp phép chia cho số không trong “%%”"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr "không thể gán giá trị cho kết quả của biểu thức trường tăng-trước"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "gán đich không hợp lệ (mã thi hành “%s”)"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr ""
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr ""
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr ""
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr ""
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr ""
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr ""
+
+#: awkgram.y:6799
+#, fuzzy
+msgid "@namespace is a gawk extension"
+msgstr "@include là phần mở rộng của gawk"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr ""
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s tới “%s” gặp lỗi (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "đầu ra tiêu chuẩn"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "lỗi tiêu chuẩn"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp: đã nhận đối số không phải thuộc số"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp: đối số “%g” nằm ngoài phạm vi"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: không thể flush (đẩy dữ liệu lên đĩa): ống dẫn “%.*s” được mở để "
+"đọc, không phải để ghi"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr ""
+"fflush: không thể flush (đẩy dữ liệu vào đĩa): tập tin “%.*s” được mở để "
+"đọc, không phải để ghi"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush: không thể flush (đẩy dữ liệu vào đĩa) tập tin “%.*s”: %s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr ""
+"fflush: không thể flush (đẩy dữ liệu lên đĩa): ống dẫn hai chiều “%.*s” đã "
+"đóng kết thúc ghi"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr ""
+"fflush: “%.*s” không phải là một tập tin, ống dẫn hay đồng tiến trình được mở"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index: (chỉ số) đã nhận đối số thứ nhất không phải là chuỗi"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index: (chỉ số) đã nhận đối số thứ hai không phải là chuỗi"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int: (số nguyên?) đã nhận đối số không phải thuộc số"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length: (chiều dài) đã nhận mảng đối số"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "“length(array)” (độ dài mảng) là một phần mở rộng gawk"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length: (chiều dài) đã nhận đối số không phải chuỗi"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log: (nhật ký) đã nhận đối số không phải thuộc số"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log: (nhật ký) đã nhận đối số âm “%g”"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "lỗi nghiêm trọng: phải dùng “count$” với mọi dạng thức hay không gì cả"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "chiều rộng trường bị bỏ qua đối với bộ chỉ định “%%”"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "độ chính xác bị bỏ qua đối với bộ chỉ định “%%”"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "chiều rộng trường và độ chính xác bị bỏ qua đối với bộ chỉ định “%%”"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "lỗi nghiêm trọng: không cho phép “$” trong định dạng awk"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "lỗi nghiêm trọng: số lượng đối số với “$” phải >0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr ""
+"lỗi nghiêm trọng: số lượng đối số %ld lớn hơn tổng số đối số được cung cấp"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "lỗi nghiêm trọng: không cho phép “$” nằm sau dấu chấm trong định dạng"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr ""
+"lỗi nghiêm trọng: chưa cung cấp “$” cho độ rộng trường thuộc vị trí hay cho "
+"độ chính xác"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "chữ “l” không có nghĩa trong định dạng awk nên bị bỏ qua"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "lỗi nghiêm trọng: không cho phép chữ “l” nằm trong định dạng awk POSIX"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "chữ “L” không có nghĩa trong định dạng awk nên bị bỏ qua"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "lỗi nghiêm trọng: không cho phép chữ “L” nằm trong định dạng awk POSIX"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "chữ “h” không có nghĩa trong định dạng awk nên bị bỏ qua"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "lỗi nghiêm trọng: không cho phép chữ “h” nằm trong định dạng awk POSIX"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf: giá trị %g quá lớn cho định dạng “%%c”"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf: giá trị %g phải là một ký tự rộng hợp lệ"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf: giá trị %g ở ngoại phạm vi cho dạng thức “%%%c”"
+
+#: builtin.c:1504
+#, fuzzy, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf: giá trị %g ở ngoại phạm vi cho dạng thức “%%%c”"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr ""
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr ""
+"đang bỏ qua ký tự ghi rõ định dạng không rõ “%c”: không có đối số được "
+"chuyển đổi"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "lỗi nghiêm trọng: chưa có đủ đối số để đáp ứng chuỗi định dạng"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "bị hết “^” cho cái này"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf: chỉ định định dạng không có ký hiệu điều khiển"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "quá nhiều đối số được cung cấp cho chuỗi định dạng"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf: không có đối số"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf: không có đối số"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr "printf: cố ghi vào một đường ống hai chiều mà chiều ghi đã đóng"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt: (căn bậc hai) đã nhận đối số không phải thuộc số"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt: (căn bậc hai) đã gọi với đối số âm “%g”"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr: (chuỗi con) độ dài %g không ≥1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr: (chuỗi con) độ dài %g không ≥0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr: (chuỗi con) sẽ cắt xén độ dài không phải số nguyên “%g”"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr ""
+"substr: (chuỗi con) độ dài %g là quá lớn cho chỉ số chuỗi, nên xén ngắn "
+"thành %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr: (chuỗi con) chỉ số đầu “%g” không hợp lệ nên dùng 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr ""
+"substr: (chuỗi con) chỉ số đầu không phải số nguyên “%g” sẽ bị cắt ngắn"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr: (chuỗi con) chuỗi nguồn có độ dài số không"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr: (chuỗi con) chỉ số đầu %g nằm sau kết thúc của chuỗi"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr ""
+"substr: (chuỗi con) độ dài %g chỉ số đầu %g vượt quá độ dài của đối số đầu "
+"(%lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr ""
+"strftime: giá trị định dạng trong PROCINFO[\"strftime\"] phải thuộc kiểu số"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime: đã nhận đối số thứ hai khác thuộc số"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime: tham số thứ hai nhỏ hơn 0 hay quá lớn dành cho time_t"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime: tham số thứ hai nằm ngoài phạm vi cho phép của kiểu time_t"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime: đã nhận đối số thứ nhất khác chuỗi"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime: đã nhận chuỗi định dạng rỗng"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime: đã nhận đối số khác chuỗi"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime: ít nhất một của những giá trị nằm ở ngoại phạm vi mặc định"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "hàm “system” không cho phép ở chế độ khuôn đúc"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system: (hệ thống) đã nhận đối số khác chuỗi"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr "print: cố ghi vào một đường ống hai chiều mà chiều ghi đã đóng"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "gặp tham chiếu đến trường chưa được khởi tạo “$%d”"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower: (thành chư thường) đã nhận đối số khác chuỗi"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper: (thành chữ HOA) đã nhận đối số khác chuỗi"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2: đã nhận đối số thứ nhất khác thuộc số"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2: đã nhận đối số thứ hai khác thuộc số"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin: đã nhận đối số không thuộc kiểu số học"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos: đã nhận đối số không thuộc kiểu số học"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand: đã nhận đối số không thuộc kiểu số học"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match: (khớp) đối số thứ ba không phải là mảng"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub: đối số thứ ba “%.*s” được xử lý như 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s: được gọi một cách gián tiếp với ít hơn hai đối số"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "cú gọi gián tiếp đến %s cần ít nhất hai đối số"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift: đã nhận đối số đầu không phải thuộc số"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift: (dịch bên trái) đã nhận đối số thứ hai khác thuộc số"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f): giá trị âm l không được phép"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f): giá trị thuộc phân số sẽ bị cắt ngắn"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"lshift(%f, %f): giá trị dịch quá lớn sẽ gây ra kết quả không như mong muốn"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift: đã nhận đối số thứ nhất khác thuộc số"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift: (dịch phải) đã nhận đối số thứ hai khác thuộc số"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f): giá trị âm là không được phép"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f): giá trị thuộc kiểu phân số sẽ bị xén ngắn"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr ""
+"rshift(%f, %f): giá trị dịch quá lớn sẽ gây ra kết quả không như mong muốn"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and: được gọi với ít hơn hai đối số"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and: đối số %d không phải thuộc số"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and: (và) đối số %d giá trị âm %g là không được phép"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or: (hoặc) được gọi với ít hơn hai đối số"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or: (hoặc) đối số %d không thuộc kiểu số"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or: (hoặc) đối số %d giá trị âm %g là không được phép"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor: được gọi với ít hơn hai đối số"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor: đối số %d không thuộc kiểu số"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor: đối số %d giá trị âm %g là không được phép"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl: (biên dịch) đã nhận được đối số không-phải-số"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f): giá trị âm là không được phép"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f): giá trị thuộc phân số sẽ bị cắt ngắn"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext: “%s” không phải là một phân loại miền địa phương hợp lệ"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv: đối số thứ ba không phải là mảng"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv: đã nhận đối số đầu không phải thuộc số"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv: đã nhận đối số thứ hai không thuộc số"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv: gặp phép chia cho số không"
+
+#: builtin.c:4046
+#, fuzzy
+msgid "typeof: second argument is not an array"
+msgstr "split: (chia tách) đối số thứ hai không phải là mảng"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr ""
+"typeof dò tìm thấy tổ hợp các cờ không hợp lệ “%s”; vui lòng báo cáo lỗi này."
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof: tùy chọn không hợp lệ “%s”"
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof: không biết kiểu tham số “%s”"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "Gõ các câu lệnh (g)awk. Kết thúc bằng lệnh “end”\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "số khung không hợp lệ: %d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info: tùy chọn không hợp lệ - “%s”"
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "nguồn “%s”: đã sẵn có trong nguồn rồi."
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "ghi “%s”: lệnh không đủ thẩm quyền."
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr "Không thể dùng lệnh “commands” cho lệnh breakpoint/watchpoint"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "chưa có điểm ngắt hay điểm theo dõi nào được đặt cả"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "số điểm ngắt hay điểm theo dõi không hợp lệ"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "Gõ lệnh cho %s khi %d được gợi ý, mỗi lệnh một dòng.\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "Kết thúc với lệnh “end”\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "“end” chỉ hợp lệ trong “commands” hay “eval”"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "“silent” chỉ hợp lệ với lệnh “commands”"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace: tùy chọn không hợp lệ - “%s”"
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition: điều kiện: số hiệu điểm ngắt hay điểm theo dõi không hợp lệ"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "tham số không phải là một chuỗi"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option: tùy chọn không hợp lệ - “%s”"
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "không có hàm nào như thế cả - “%s”"
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable: tùy chọn không hợp lệ - “%s”"
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "đặc tả vùng không hợp lệ: %d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "giá trị cho trường số mà không thuộc kiểu số"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "cần giá trị kiểu số nhưng lại nhận được giá trị không thuộc kiểu này"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "giá trị số nguyên khác không"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr ""
+"backtrace [N] - in vết của tất cả hay N khung trong cùng nhất (ngoài cùng "
+"nhất nếu N < 0)."
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr "break [[tên_tập_tin:]N|hàm] - đặt điểm ngắt tại vị trí đã cho."
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr ""
+"clear [[tên_tập_tin:]N|function] - xóa các điểm ngắt được đặt trước đây."
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr ""
+"commands [số] - chạy một danh sách các câu lệnh được thực thi tại điểm ngắt "
+"(hay điểm theo dõi) tìm được."
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr ""
+"condition num [expr] - đặt hay xóa điểm ngắt hay điều kiện điểm theo dõi."
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [SỐ_LƯỢNG] - tiếp tục chương trình đang được gỡ lỗi."
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr "delete [điểm_ngắt] [vùng] - xóa các điểm ngắt đã chỉ ra."
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr "disable [điểm_ngắt] [vùng] - tắt các điểm ngắt đã chỉ định."
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr "display [var] - in giá trị của biến mỗi lần chương trình dừng."
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - chuyển xuống N khung stack."
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr ""
+"dump [tên_tập_tin] - dump các chỉ lệnh ra tập tin hay đầu ra tiêu chuẩn."
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr "enable [once|del] [điểm_ngắt] [range] - bật các điểm ngắt đã chỉ ra."
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - kết thúc một danh sách các câu lệnh hay biểu thức awk"
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval stmt|[p1, p2, …] - định giá các câu lệnh awk."
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - (giống với quit) thoát khỏi gỡ lỗi."
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - thực thi cho đến khi khung stack đã chọn trả về."
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - chọn và in khung stack số hiệu N."
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr "help [lệnh] - hiển thị danh sách các lệnh hay giải thích câu lệnh."
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr "ignore N SỐ-LƯỢNG - đặt số lượng điểm ngắt bị bỏ qua."
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info chủ_đề - nguồn|nguồn|biến|hàm|break|frame|args|locals|display|watch."
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr "list [-|+|[tập_tin:]số_dòng|hàm|vùng] - liệt kê các dòng đã chỉ định."
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr ""
+"next [SỐ_LƯỢNG] - nhảy một chỉ lệnh, nhưng được xử lý thông qua gọi thủ tục "
+"con."
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr ""
+"nexti [SỐ_LƯỢNG] - nhảy từng chỉ lệnh, nhưng được xử lý thông qua gọi thủ "
+"tục con."
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [tên[=giá trị]] - đặt hay hiển thị tùy chọn gỡ lỗi."
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [var] - in giá trị của biến hay mảng."
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf format, [arg], … - kết xuất có định dạng."
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - thoát khỏi chương trình gỡ lỗi."
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr ""
+"return [giá-trị] - làm cho khung stack đã chọn trả về giá trị này cho bộ gọi "
+"nó."
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - khởi chạy hay khởi động lại chương trình."
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save tên_tập_tin - ghi các câu lệnh từ phiên làm việc vào tập tin."
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set biến = giá_trị - gán giá trị cho một biến vô hướng."
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr ""
+"silent - chặn các lời nhắn thông thường khi dừng tại điểm ngăt hay điểm theo "
+"dõi."
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source file - thực hiện các câu lệnh từ tập tin."
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr ""
+"step [SỐ_LƯỢNG] - chạy từng bước chương trình cho đến khi nó gặp một dòng "
+"nguồn khác."
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [SỐ_LƯỢNG] - chạy từng lệnh một."
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[tên_tập_tin:]N|hàm] - đặt điểm ngắt tạm thời."
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - hiển thị chỉ lệnh trước khi thực hiện."
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr "undisplay [N] - gỡ bỏ các biến từ danh sách hiển thị tự động."
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr ""
+"until [[tên_tập_tin:]N|hàm] - thực hiện cho đến khi chương trình đạt đến "
+"dòng khác hay dòng N trong khung hiện tại."
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - gỡ bỏ các biến từ danh sách theo dõi."
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - chuyển xuống N khung stack."
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch var - đặt điểm theo dõi cho một biến."
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where [N] - (giống như backtrace) in vết của tất cả hay N khung trong cùng "
+"nhất (ngoài cùng nhất nếu N < 0)."
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "lỗi: "
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "không thể đọc lệnh (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "không thể đọc lệnh (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "ký tự trong câu lệnh không hợp lệ"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "không hiểu lệnh - “%.*s”, hãy gõ lệnh trợ giúp “help”"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "ký tự không hợp lệ"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "lệnh chưa định nghĩa: %s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr "đặt hay hiển thị số dòng được lưu giữ trong tập tin lịch sử."
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "đặt hay hiển thị kích thước cửa sổ danh sách lệnh."
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "đặt hay hiển thị tập tin kết xuất gawk."
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "đặt hay hiển thị dấu nhắc gỡ lỗi."
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr "(bỏ) đặt hay ghi lại lịch sử lệnh (giá trị=on|off)."
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "đặt/bỏ đặt hay hiển thị các tùy chọn được ghi lại (giá_trị=on|off)."
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "(bỏ) đặt hay hiển thị việc theo vết chỉ lệnh (giá trị=on|off)."
+
+#: debug.c:358
+msgid "program not running."
+msgstr "chương trình không chạy."
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "không thể đọc tập tin nguồn “%s” (%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "tập tin nguồn “%s” bị trống rỗng.\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "không có tập tin nguồn hiện tại."
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "không thể tìm thấy tập tin nguồn có tên “%s” (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr "CẢNH BÁO: tập tin nguồn “%s” bị sửa đổi kể từ lúc nó được dịch.\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "số dòng %d nằm ngoài phạm vi; “%s” có %d dòng"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "gặp kết thúc tập tin bất ngờ khi đang đọc tập tin “%s”, dòng %d"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "tập tin nguồn “%s” đã bị sửa đổi kể từ lúc chưong trình được khởi chạy"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "Tập tin nguồn hiện tại: %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "Số dòng: %d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "Tập tin nguồn (dòng): %s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"Số      Hthị  Bật      Vị trí\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\tkhông gợi ý = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\tbỏ qua %ld gợi ý tiếp\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\tdừng điều kiện: %s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\tlệnh:\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "Khung hiện tại:"
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "Được gọi bởi khung:"
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "Bộ gọi của khung:"
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "Không có gì trong main().\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "Không có đối số nào.\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "Không có nội bộ.\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"Tất cả các biến đã định nghĩa:\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"Tất cả các hàm đã định nghĩa:\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"Các biến hiển thị tự động:\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"Các biến theo dõi:\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "không có ký hiệu “%s” trong ngữ cảnh hiện tại\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "“%s” không phải là một mảng\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = trường chưa được khởi tạo\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "mảng “%s” trống rỗng\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[“%.*s”] không nằm trong mảng “%s”\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "“%s[\"%.*s\"]” không phải là một mảng\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "“%s” không phải là biến scalar"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "cố dùng mảng “%s[\"%.*s\"]” trong một ngữ cảnh vô hướng"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "cố dùng kiểu vô hướng “%s[\"%.*s\"]” như là mảng"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "“%s” là một hàm"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "điểm kiểm tra %d là vô điều kiện\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "Không có mục tin hiển thị nào đánh số %ld"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "Không có mục tin theo dõi nào đánh số %ld"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d: [\"%.*s\"] không trong mảng “%s”\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "cố dùng biến vô hướng như là một mảng"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr "Điểm theo dõi %d bị xóa bởi vì đối số nằm ngoài phạm vi\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "Trình bày %d bị xóa bởi vì đối số nằm ngoài phạm vi\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr " tại tập tin “%s”, dòng %d\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr " tại “%s”:%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\ttrong "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "Nhiều khung ngăn xếp theo sau …\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "số khung không hợp lệ"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Chú ý: điểm ngắt %d (được bật, bỏ qua %ld gợi ý tiếp), đồng thời được đặt "
+"tại %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "Chú ý: điểm ngắt %d (được bật), đồng thời được đặt tại %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr ""
+"Chú ý: điểm ngắt %d (bị tắt, bỏ qua %ld gợi ý tiếp), đồng thời được đặt tại "
+"%s:%d"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "Chú ý: điểm ngắt %d (bị tắt), đồng thời được đặt tại %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "Điểm ngắt %d đặt tại tập tin “%s”, dòng %d\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "Không thể đặt điểm ngắt trong tập tin “%s”\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "số dòng %d trong tập tin “%s” nằm ngoài phạm vi"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "Không tìm thấy quy tắc!!!\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "Không thể đặt điểm ngắt tại “%s”:%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "Không thể đặt điểm ngắt trong hàm “%s”\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "điểm ngắt %d đặt tại tập tin “%s”, dòng %d là vô điều kiện\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "Xóa điểm dừng %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "Không có điểm ngắt tại điểm vào của hàm “%s”\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "Không có điểm ngắt tại tập tin “%s”, dòng #%d\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "số điểm ngắt không hợp lệ"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "Xóa tất cả các điểm ngắt? (c hay k) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "c"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "Sẽ bỏ qua %ld điểm giao chéo của điểm ngắt %d.\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "Sẽ dừng lần gặp điểm ngắt %d tiếp theo.\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr ""
+"Chỉ có thể gỡ lỗi các chương trình được cung cấp cùng với tùy chọn “-f”.\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "Gặp lỗi khi khởi động lại bộ gỡ lỗi"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "Chương trình đang chạy. Khởi động từ đầu (c/không)?"
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "Chương trình không khởi động lại\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "lỗi: không thể khởi động lại, thao tác không được cho phép\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "lỗi (%s): không thể khởi động lại, bỏ qua các lệnh còn lại\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "Đang khởi động chương trình:\n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "Chương trình đã thoát ra dị thường với mã thoát là: %d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "Chương trình đã thoát bình thường với mã thoát là: %d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "Chương trình này đang chạy. Vẫn thoát (c/k)?"
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "Không dừng tại bất ký điểm ngắt nào; đối số bị bỏ qua.\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "số điểm ngắt không hợp lệ %d."
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "Sẽ bỏ qua %ld điểm ngắt xuyên chéo %d kế tiếp.\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "“finish” không có nghĩa trong khung ngoài cùng nhất main()\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "Chạy cho đến khi có trả về từ "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "“return” không có nghĩa trong khung ngoài cùng nhất main()\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "Không tìm thấy vị trí đã cho trong hàm “%s”\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "dòng nguồn không hợp lệ %d trong tập tin “%s”"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "Không thể tìm thấy vị trí %d được chỉ ra trong tập tin “%s”\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "phần tử không trong mảng\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "biến chưa định kiểu\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "Dừng trong %s …\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "“finish” không có nghĩa với lệnh nhảy non-local “%s”\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "“until” không có nghĩa với cú nhảy non-local “%s”\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t------Nhấn [Enter] để tiếp tục hay t [Enter] để thoát------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "t"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] không trong mảng “%s”"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "gửi kết xuất ra stdout\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "số không hợp lệ"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "“%s” không được phép trong ngữ cảnh hiện hành; câu lệnh bị bỏ qua"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "“return” không được phép trong ngữ cảnh hiện hành; câu lệnh bị bỏ qua"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "Không có ký hiệu “%s” trong ngữ cảnh hiện thời"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "không biết kiểu nút %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "gặp opcode (mã thao tác) không rõ %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "mã lệnh %s không phải là một toán tử hoặc từ khóa"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "tràn bộ đệm trong “genflags2str” (tạo ra cờ đến chuỗi)"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# Ngăn xếp gọi hàm:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "“IGNORECASE” (bỏ qua chữ HOA/thường) là phần mở rộng gawk"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "“BINMODE” (chế độ nhị phân) là phần mở rộng gawk"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "Giá trị BINMODE (chế độ nhị phân) “%s” không hợp lệ nên đã coi là 3"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "đặc tả “%sFMT” sai “%s”"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "đang tắt “--lint” do việc gán cho “LINT”"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "gặp tham chiếu đến đối số chưa được khởi tạo “%s”"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "gặp tham chiếu đến biến chưa được khởi tạo “%s”"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "cố gắng tham chiếu trường từ giá trị khác thuộc số"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "cố gắng tham chiếu trường từ chuỗi trống rỗng"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "cố gắng để truy cập trường %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "tham chiếu đến trường chưa được khởi tạo “$%ld”"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "hàm “%s” được gọi với nhiều số đối số hơn số được khai báo"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack: không cần kiểu “%s”"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "gặp phép chia cho số không trong “/=”"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "gặp phép chia cho số không trong “%%=”"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "phần mở rộng không cho phép ở chế độ khuôn đúc"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load là một phần mở rộng gawk"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext: nhận được NULL lib_name"
+
+#: ext.c:60
+#, fuzzy, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext: không thể mở thư viện “%s” (%s)\n"
+
+#: ext.c:66
+#, fuzzy, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr ""
+"load_ext: thư viện “%s”: chưa định nghĩa “plugin_is_GPL_compatible” (%s)\n"
+
+#: ext.c:72
+#, fuzzy, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext: thư viện “%s”: không thể gọi hàm “%s” (%s)\n"
+
+#: ext.c:76
+#, fuzzy, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext: thư viện “%s” thủ tục khởi tạo “%s” gặp lỗi\n"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin: thiếu tên hàm"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr ""
+"make_builtin: không thể sử dụng “%s” như là một hàm được xây dựng sẵn trong "
+"gawk"
+
+#: ext.c:109
+#, fuzzy, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr ""
+"make_builtin: không thể sử dụng “%s” như là một hàm được xây dựng sẵn trong "
+"gawk"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin: không thể định nghĩa lại hàm “%s”"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin: hàm “%s” đã được định nghĩa rồi"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin: hàm “%s” đã được định nghĩa trước đây rồi"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin: đối số dành cho số đếm bị âm cho hàm “%s”"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr "hàm “%s”: đối số thứ %d: cố gắng dùng kiểu vô hướng như là mảng"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "hàm “%s”: đối số thứ %d: cố gắng dùng mảng như là kiểu vô hướng"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "tải động của thư viện không được hỗ trợ"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat: không thể đọc liên kết mềm “%s”"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat: các đối số sai"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "khởi tạo fts: không thể tạo biến %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "fts không được hỗ trợ trên hệ thống này"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element: không thể tạo mảng"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element: không thể đặt phần tử"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element: không thể đặt phần tử"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element: không thể đặt phần tử"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process: không thể tạo mảng"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process: không thể đặt phần tử"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts: được gọi với số lượng đối số không đúng, cần 3"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts: đối số đầu tiên sai"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts: đối số thứ hai sai"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts: đối số thứ ba sai"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts: không thể làm phẳng mảng\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts: bỏ qua cờ FTS_NOSTAT vụng trộm. nyah, nyah, nyah."
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts: clear_array() gặp lỗi\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch: không lấy được đối số đầu tiên"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch: không lấy được đối số thứ hai"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch: không thể lấy tham số thứ ba"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "fnmatch không được hỗ trợ trên hệ thống này\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "khởi tạo fnmatch: không thể thêm biến FNM_NOMATCH"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "fnmatch init: không thể đặt phần tử mảng %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "khởi tạo fnmatch: không thể cài đặt mảng FNM"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork: PROCINFO không phải là mảng!"
+
+#: extension/inplace.c:131
+#, fuzzy
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace_begin: sửa in-place đã sẵn được kích hoạt rồi"
+
+#: extension/inplace.c:134
+#, fuzzy, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace_begin: cần 2 đối số như lại được gọi với %d"
+
+#: extension/inplace.c:137
+#, fuzzy
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr "inplace_begin: không thể lấy đối số thứ nhất như là tên tập tin"
+
+#: extension/inplace.c:145
+#, fuzzy, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr "inplace_begin: tắt sửa chữa in-place cho TÊN_TẬP_TIN không hợp lệ “%s”"
+
+#: extension/inplace.c:152
+#, fuzzy, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace_begin: Không thể lấy thông tin thống kê của “%s” (%s)"
+
+#: extension/inplace.c:159
+#, fuzzy, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "inplace_begin: “%s” không phải là tập tin thường"
+
+#: extension/inplace.c:170
+#, fuzzy, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace_begin: mkstemp(“%s”) gặp lỗi (%s)"
+
+#: extension/inplace.c:182
+#, fuzzy, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace_begin: chmod gặp lỗi (%s)"
+
+#: extension/inplace.c:189
+#, fuzzy, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace_begin: dup(stdout) gặp lỗi (%s)"
+
+#: extension/inplace.c:192
+#, fuzzy, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_begin: dup2(%d, stdout) gặp lỗi (%s)"
+
+#: extension/inplace.c:195
+#, fuzzy, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace_begin: close(%d) gặp lỗi (%s)"
+
+#: extension/inplace.c:211
+#, fuzzy, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace_end: cần 2 đối số như lại được gọi với %d"
+
+#: extension/inplace.c:214
+#, fuzzy
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr "inplace_end: không thể lấy lại đối số thứ nhất như là một tên tập tin"
+
+#: extension/inplace.c:221
+#, fuzzy
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace_end: việc sửa in-place không được kích hoạt"
+
+#: extension/inplace.c:227
+#, fuzzy, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace_end: dup2(%d, stdout) gặp lỗi (%s)"
+
+#: extension/inplace.c:230
+#, fuzzy, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace_end: close(%d) gặp lỗi (%s)"
+
+#: extension/inplace.c:234
+#, fuzzy, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace_end: fsetpos(stdout) gặp lỗi (%s)"
+
+#: extension/inplace.c:247
+#, fuzzy, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace_end: link(“%s”, “%s”) gặp lỗi (%s)"
+
+#: extension/inplace.c:257
+#, fuzzy, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace_end: rename(“%s”, “%s”) gặp lỗi (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord: được gọi với đối số không thích hợp"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr: được gọi với đối số không thích hợp"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of: opendir/fdopendir gặp lỗi: %s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile: được gọi với tham số sai kiểu"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput: không thể khởi tạo biến REVOUT"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea: đối số 0 không phải là một chuỗi\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea: đối số 1 không phải là một mảng\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array: không thể làm phẳng mảng\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array: không thể giải phóng mảng được làm phẳng\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "giá trị mảng có kiểu chưa biết %d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada: đối số 0 không phải là một chuỗi\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada: đối số 1 không phải là một mảng\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada: clear_array gặp lỗi\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array: set_array_element gặp lỗi\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr "coi giá trị đã được phục hồi với kiểu chưa biết mã %d như là một chuỗi"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday: không được hỗ trợ trên nền tảng này"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep: thiếu đối số dạng số cần thiết"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep: đối số âm"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep: không được hỗ trợ trên nền tảng này"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "bản ghi đầu vào quá lớn"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "“NF” được đặt thành giá trị âm"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr ""
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr ""
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split (chia tách): đối số thứ tư là phần mở rộng gawk"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split (chia tách): đối số thứ tư không phải là mảng"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split: (chia tách) đối số thứ hai không phải là mảng"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr ""
+"split (chia tách): không thể sử dụng cùng một mảng có cả đối số thứ hai và "
+"thứ tư"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"split (phân tách): không thể sử dụng mảng con của tham số thứ hai cho tham "
+"số thứ tư"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"split (phân tách): không thể sử dụng mảng con của tham số thứ tư cho tham số "
+"thứ hai"
+
+#: field.c:1036
+#, fuzzy
+msgid "split: null string for third arg is a non-standard extension"
+msgstr ""
+"split: (chia tách) chuỗi vô giá trị cho đối số thứ ba là phần mở rộng gawk"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit: đối số thứ tư không phải là mảng"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit: đối số thứ hai không phải là mảng"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit: đối số thứ ba không phải không rỗng"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr ""
+"patsplit (chương trình chia tách): không thể sử dụng cùng một mảng cho cả "
+"hai đối số thứ hai và thứ tư"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr ""
+"patsplit (chương trình phân tách): không thể sử dụng mảng con của tham số "
+"thứ hai cho tham số thứ tư"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr ""
+"patsplit (chương trình phân tách): không thể sử dụng mảng con của tham số "
+"thứ tư cho tham số thứ hai"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "“FIELDWIDTHS” (độ rộng trường) là phần mở rộng gawk"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "“*” phải là bộ định danh cuối cùng trong FIELDWIDTHS"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr ""
+"giá trị FIELDWIDTHS (độ rộng trường) không hợp lệ, cho trường %d, gần “%s”"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "chuỗi vô giá trị cho “FS” là phần mở rộng gawk"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "awk cũ không hỗ trợ biểu thức chính quy làm giá trị của “FS”"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "“FPAT” là phần mở rộng của gawk"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node: retval nhận được là null"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node: không trong chế độ MPFR"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node: không hỗ trợ MPFR"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node: kiểu số không hợp lệ “%d”"
+
+#: gawkapi.c:385
+#, fuzzy
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "load_ext: nhận được NULL lib_name"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr ""
+"node_to_awk_value: tìm thấy tổ hợp cờ dạng số không hợp lệ “%s”; vui lòng "
+"báo cáo đây là lỗi."
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value: nút nhận được là null"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value: biến nhận được là null"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr ""
+"node_to_awk_value tìm thấy tổ hợp cờ dạng số không hợp lệ “%s”; vui lòng báo "
+"cáo đây là lỗi."
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element: mảng nhận được là null"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element: nhận được là null"
+
+#: gawkapi.c:1217
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array_typed: không thể chuyển đổi chỉ số %d sang %s\n"
+
+#: gawkapi.c:1222
+#, fuzzy, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array_typed: không thể chuyển đổi giá trị %d sang %s\n"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr: không hỗ trợ MPFR"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "không thể tìm thấy điểm kết thúc của quy tắc BEGINFILE"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "không thể mở kiểu tập tin chưa biết “%s” cho “%s”"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "tham số dòng lệnh “%s” là một thư mục: đã bị bỏ qua"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "không mở được tập tin “%s” để đọc (%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "lỗi đóng fd %d (“%s”) (%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "chuyển hướng không cho phép ở chế độ khuôn đúc"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "biểu thức trong điều chuyển hướng “%s” là một con số"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "biểu thức cho điều chuyển hướng “%s” có giá trị chuỗi vô giá trị"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr ""
+"tên tập tin “%.*s” cho điều chuyển hướng “%s” có lẽ là kết quả của biểu thức "
+"luận lý"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "không cần hợp “>” và “>>” cho tập tin “%.*s”"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file không thể tạo đường ống “%s” với fd %d"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "không thể mở ống dẫn “%s” để xuất (%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "không thể mở ống dẫn “%s” để nhập (%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr ""
+"việc tạo ổ cắm mạng get_file không được hỗ trợ trên nền tảng này cho “%s” "
+"với fd %d"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "không thể mở ống dẫn hai chiều “%s” để nhập/xuất (%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "không thể chuyển hướng từ “%s” (%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "không thể chuyển hướng đến “%s” (%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr ""
+"đã tới giới hạn hệ thống về tập tin được mở nên bắt đầu phối hợp nhiều dòng "
+"điều mô tả tập tin"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "lỗi đóng “%s” (%s)"
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "quá nhiều ống dẫn hay tập tin nhập được mở"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close: (đóng) đối số thứ hai phải là “to” (đến) hay “from” (từ)"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr ""
+"close: (đóng) “%.*s” không phải là tập tin, ống dẫn hay đồng tiến trình đã "
+"được mở"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "đóng một chuyển hướng mà nó chưa từng được mở"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr ""
+"close: chuyển hướng “%s” không được mở bởi “|&” nên đối số thứ hai bị bỏ qua"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "trạng thái thất bại (%d) khi đóng ống dẫn “%s” (%s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "trạng thái thất bại (%d) khi đóng tập tin “%s” (%s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "không cung cấp lệnh đóng ổ cắm “%s” rõ ràng"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "không cung cấp lệnh đóng đồng tiến trình “%s” rõ ràng"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "không cung cấp lệnh đóng đường ống dẫn lệnh “%s” rõ ràng"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "không cung cấp lệnh đóng tập tin “%s” rõ ràng"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush: không thể đẩy dữ liệu lên đĩa đầu ra tiêu chuẩn: %s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush: không thể đẩy dữ liệu lên đĩa đầu ra lỗi tiêu chuẩn: %s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "gặp lỗi khi ghi đầu ra tiêu chuẩn (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "gặp lỗi khi ghi thiết bị lỗi chuẩn (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "lỗi xóa sạch ống dẫn “%s” (%s)"
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "lỗi xóa sạch ống dẫn đồng tiến trình đến “%s” (%s)"
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "lỗi xóa sạch tập tin “%s” (%s)"
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "cổng cục bộ %s không hợp lệ trong “/inet”: %s"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "cổng cục bộ %s không hợp lệ trong “/inet”"
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "thông tin về máy/cổng máy mạng (%s, %s) không hợp lệ: %s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "thông tin về máy/cổng ở xa (%s, %s) không phải hợp lệ"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "truyền thông TCP/IP không được hỗ trợ"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "không mở được “%s”, chế độ “%s”"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "gặp lỗi khi đóng thiết bị cuối giả (%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "lỗi đóng đầu ra tiêu chuẩn trong tiến trình con (%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr ""
+"gặp lỗi khi di chuyển pty (thiết bị cuối giả) phụ thuộc đến thiết bị đầu ra "
+"tiêu chuẩn trong con (trùng: %s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "lỗi đóng thiết bị nhập chuẩn trong tiến trình con (%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr ""
+"lỗi di chuyển pty (thiết bị cuối giả) phụ tới thiết bị nhập chuẩn trong điều "
+"con (nhân đôi: %s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "đóng pty (thiết bị cuối giả) phụ thuộc gặp lỗi (%s)"
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr "không thể tạo tiến trình con hoặc mở tpy"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr ""
+"lỗi di chuyển ống dẫn đến thiết bị xuất chuẩn trong tiến trình con (trùng: "
+"%s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr ""
+"lỗi di chuyển ống dẫn đến thiết bị nhập chuẩn trong tiến trình con (trùng: "
+"%s)"
+
+#: io.c:2386 io.c:2655
+#, fuzzy
+msgid "restoring stdout in parent process failed"
+msgstr "phục hồi đầu ra tiêu chuẩn trong tiến trình mẹ gặp lỗi\n"
+
+#: io.c:2394
+#, fuzzy
+msgid "restoring stdin in parent process failed"
+msgstr "phục hồi đầu vào tiêu chuẩn trong tiến trình mẹ gặp lỗi\n"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "đóng ống dẫn gặp lỗi (%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "“|&” không được hỗ trợ"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "không thể mở ống dẫn “%s” (%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "không thể tạo tiến trình con cho “%s” (fork: %s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr "getline: cố ghi vào một đường ống hai chiều mà chiều ghi đã đóng"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser: nhận được con trỏ NULL"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr ""
+"bộ phân tích đầu vào “%s” xung đột với bộ phân tích đầu vào được cài đặt "
+"trước đó “%s”"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "bộ phân tích đầu vào “%s” gặp lỗi khi mở “%s”"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_wrapper: nhận được con trỏ NULL"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr ""
+"bộ bao kết xuất “%s” xung đột với bộ bao kết xuất được cài đặt trước đó “%s”"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "bộ bao kết xuất “%s” gặp lỗi khi mở “%s”"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor: nhận được con trỏ NULL"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr ""
+"bộ xử lý hai hướng “%s” xung đột với bộ xử lý hai hướng đã được cài đặt "
+"trước đó “%s”"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "bộ xử lý hai hướng “%s” gặp lỗi khi mở “%s”"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "tập tin dữ liệu “%s” là rỗng"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "không thể cấp phát bộ nhớ nhập thêm nữa"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "giá trị đa ký tự của “RS” là phần mở rộng gawk"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "Truyền thông trên IPv6 không được hỗ trợ"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr ""
+"biến môi trường “POSIXLY_CORRECT” (đúng kiểu POSIX) đã được đặt; đang bật "
+"tùy chọn “--posix”"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "tùy chọn “--posix” có quyền cao hơn “--traditional” (truyền thống)"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr ""
+"“--posix”/“--traditional” (cổ điển) có quyền cao hơn “--non-decimal-"
+"data” (dữ liệu khác thập phân)"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "“--posix” đè lên “--characters-as-bytes”"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "việc chạy %s với tư cách “setuid root” có thể rủi rỏ bảo mật"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "không thể đặt chế độ nhị phân trên đầu vào tiêu chuẩn (%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "không thể đặt chế độ nhị phân trên đầu ra tiêu chuẩn (%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "không thể đặt chế độ nhị phân trên đầu ra lỗi tiêu chuẩn (%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "không có đoạn chữ chương trình nào cả!"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr ""
+"Cách dùng: %s [tùy chọn kiểu POSIX hay GNU] -f tập_tin_chương_trình [--] "
+"tập_tin …\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr ""
+"Cách dùng: %s [tùy chọn kiểu POSIX hay GNU] [--] %cchương_trình%c tập_tin …\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "Tùy chọn POSIX:\t\t\tTùy chọn dài GNU: (tiêu chuẩn)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f tập_tin_chương_trình\t--file=tập_tin_chương_trình\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=ký_hiệu_phân_cách_trường\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr ""
+"\t-v var=giá_trị\t\t--assign=biến=giá_trị\n"
+"(assign: gán)\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "Tùy chọn ngắn:\t\t\tTùy chọn GNU dạng dài: (mở rộng)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[tập_tin]\t\t--dump-variables[=tập_tin]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[tập_tin]\t\t--debug[=tập_tin]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e “program-text”\t--source=“program-text”\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E file\t\t\t--exec=tập_tin\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i includefile\t\t--include=tập-tin-bao-gồm\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l library\t\t--load=thư-viện\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L [fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[tập_tin]\t\t--pretty-print[=tập_tin]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize (tối_ưu_hóa)\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[tập_tin]\t\t--profile[=tập_tin]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr ""
+"\t-W nostalgia\t\t--nostalgia\n"
+"(nỗi luyến tiếc quá khứ)\n"
+
+#: main.c:625
+#, fuzzy
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr ""
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"Để thông báo lỗi, xem nút “Bugs” (lỗi) trong tập tin thông tin\n"
+"“gawk.info”, cái mà nằm trong phần “Reporting Problems and Bugs”\n"
+"(thông báo trục trặc và lỗi) trong bản in. Cùng thông tin đó có thể\n"
+"tìm thấy ở\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"VUI LÒNG ĐỪNG cố báo cáo lỗi bằng gửi trong comp.lang.awk.\n"
+"\n"
+"Thông báo lỗi dịch cho: <http://translationproject.org/team/vi.html>.\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk là ngôn ngữ quét và xử lý mẫu.\n"
+"Mặc định, nó đọc từ đầu vào tiêu chuẩn và ghi ra đầu ra tiêu chuẩn.\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"Ví dụ:\n"
+"\tgawk \"{ sum += $1 }; END { print sum }\" tập_tin\n"
+"\tgawk -F: \"{ print $1 }\" /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"Tác quyền © năm 1989, 1991-%d của Tổ chức Phần mềm Tự do.\n"
+"\n"
+"Chương trình này là phần mềm tự do; bạn có thể phát hành lại nó\n"
+"và/hoặc sửa đổi nó với các điều điều khoản của Giấy Phép Công Cộng GNU\n"
+"được xuất bản bởi Tổ Chức Phần Mềm Tự Do; hoặc là phiên bản 3\n"
+"của Giấy Phép này, hoặc là (tùy chọn) bất kỳ phiên bản mới hơn.\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"Chúng tôi phân phối chương trình này vì mong muốn nó hữu ích,\n"
+"nhưng mà KHÔNG BẢO ĐẢM GÌ CẢ, không ngay cả khi nó ĐƯỢC BÁN\n"
+"hoặc PHÙ HỢP VỚI CÁC MỤC ĐÍCH ĐẶC THÙ.\n"
+"Hãy xem Giấy phép Công Chung GNU (GPL) để biết chi tiết.\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"Bạn nên nhận một bản sao của Giấy Phép Công Cộng GNU cùng với chương\n"
+"trình này. Nếu chưa có, bạn xem tại <http://www.gnu.org/licenses/>.\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "-Ft không đặt FS (hệ thống tập tin?) vào tab trong awk POSIX"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s: đối số “%s” cho “-v” không có dạng “biến=giá_trị”\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "“%s” không phải là tên biến hợp lệ"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "“%s” không phải là tên biến; đang tìm tập tin “%s=%s”"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "không thể dùng builtin (dựng sẵn) của gawk “%s” như là tên biến"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "không thể dùng hàm “%s” như là tên biến"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "ngoại lệ số thực dấu chấm động"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "lỗi nghiêm trọng: lỗi nội bộ"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "lỗi nghiêm trọng: lỗi nội bộ: lỗi phân đoạn"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "lỗi nghiêm trọng: lỗi nội bộ: tràn ngăn xếp"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "không có fd (bộ mô tả tập tin) %d đã mở trước"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "không thể mở trước “/dev/null” cho fd %d"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "đối số rỗng cho tùy chọn “-e/--source” bị bỏ qua"
+
+#: main.c:1662 main.c:1667
+#, fuzzy
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "tùy chọn “--posix” có quyền cao hơn “--traditional” (truyền thống)"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "-M bị bỏ qua: chưa biên dịch phần hỗ trợ MPFR/GMP"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s: tùy chọn “-W %s” không được nhận diện nên bị bỏ qua\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s: tùy chọn cần đến đối số “-- %c”\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "giá trị PREC “%.*s” là không hợp lệ"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "giá trị RNDMODE “%.*s” là không hợp lệ"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s: đã nhận đối số không phải thuộc số"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg): giá trị âm là không được phép"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg): giá trị thuộc phân số sẽ bị cắt ngắn"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd): giá trị âm là không được phép"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s: đã nhận đối số không phải thuộc số #%d"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s: đối số #%d có giá trị không hợp lệ %Rg, dùng 0"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s: đối số #%d giá trị âm %Rg là không được phép"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s: đối số #%d giá trị phần phân số %Rg sẽ bị cắt cụt"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s: đối số #%d có giá trị âm %Zd là không được phép"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "dòng lệnh:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "không thể tạo biểu thức chính quy kiểu mẫu"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "awk cũ không hỗ trợ thoát chuỗi “\\%c”"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX không cho phép thoát chuỗi “\\x”"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "không có số thập lúc nằm trong thoát chuỗi “\\x”"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr ""
+"thoát chuỗi thập lục \\x%.*s chứa %d ký tự mà rất có thể không phải được đọc "
+"bằng cách dự định"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "thoát chuỗi “\\%c” được xử lý như là “%c” chuẩn"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr ""
+"Dữ liệu dạng đa byte (multibyte) không hợp lệ được tìm thấy. Tại đó có lẽ "
+"không khớp giữa dữ liệu của bạn và nơi xảy ra."
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s “%s”: không thể lấy cờ mô tả (fd): (fcntl F_GETFD: %s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr ""
+"%s %s “%s”: không thể đặt “close-on-exec” (đóng một khi thực hiện): (fcntl "
+"F_SETFD: %s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr ""
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "không thể mở “%s” để ghi: %s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "đang gửi hồ sơ cho thiết bị lỗi chuẩn"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# Quy tắc %s\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# Quy tắc\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "lỗi nội bộ: %s với vname (tên biến?) vô giá trị"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "lỗi nội bộ: phần dựng sẵn với fname là null"
+
+#: profile.c:1302
+#, fuzzy, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"\t# Các phần mở rộng được tải (-l và/hoặc @load)\n"
+"\n"
+
+#: profile.c:1333
+#, fuzzy, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\t# Các phần mở rộng được tải (-l và/hoặc @load)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# hồ sơ gawk, được tạo %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# Danh sách các hàm theo thứ tự abc\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str: không hiểu kiểu chuyển hướng %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr ""
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr ""
+
+#: re.c:172
+#, fuzzy, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "thoát chuỗi “\\%c” được xử lý như là “%c” chuẩn"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr ""
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr ""
+"thành phần của biểu thức chính qui (regexp) “%.*s” gần như chắc chắn nên là "
+"“[%.*s]”"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "thiếu dấu ngoặc vuông mở ["
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "sai lớp ký tự"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "cú pháp lớp ký tự là [[:dấu_cách:]], không phải [:dấu_cách:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "chưa kết thúc dãy thoát \\"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "nội dung của “\\{\\}” không hợp lệ"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "biểu thức chính quy quá lớn"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "thiếu dấu ("
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "chưa chỉ rõ cú pháp"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr "thiếu dấu )"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s: tùy chọn “%s” chưa rõ ràng; khả năng là:"
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s: tùy chọn “--%s” không cho phép đối số\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s: tùy chọn “%c%s” không cho phép đối số\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s: tùy chọn “--%s” yêu cầu một đối số\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s: không nhận ra tùy chọn “--%s”\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s: không nhận ra tùy chọn “%c%s”\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s: tùy chọn không hợp lệ -- “%c”\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s: tùy chọn yêu cầu một đối số -- “%c”\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s: tùy chọn “-W %s” vẫn mơ hồ\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s: tùy chọn “-W %s” không cho phép đối số\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s: tùy chọn “-W %s” yêu cầu một đối số\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "Thành công"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "Không khớp"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "Biểu thức chính quy không hợp lệ"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "Ký tự đối chiếu không hợp lệ"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "Tên hạng ký tự không hợp lệ"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "Gặp dấu gạch ngược thừa"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "Tham chiếu ngược không hợp lệ"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "Chưa khớp [, [^, [:, [., hay [="
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "Chưa khớp “(” hay “\\(”"
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "Chưa khớp “\\{”"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "Nội dung của “\\{\\}” không hợp lệ"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "Kết thúc phạm vi không hợp lệ"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "Hết bộ nhớ"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "Biểu thức chính quy nằm trước không hợp lệ"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "Kết thúc quá sớm của biểu thức chính quy"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "Biểu thức chính quy quá lớn"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "Chưa khớp “)” hoặc “\\)”"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "Không có biểu thức chính quy nằm trước"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "hàm “%s”: không thể dùng hàm “%s” như là tên tham số"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "không thể pop (lấy ra) ngữ cảnh chính"
+
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "setenv(TZ, %s) gặp lỗi (%s)"
+
+#~ msgid "setenv(TZ, %s) restoration failed (%s)"
+#~ msgstr "setenv(TZ, %s) phục hồi gặp lỗi (%s)"
+
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "unsetenv(TZ) gặp lỗi (%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "gặp dấu gạch ngược tại kết thúc của chuỗi"
+
+#~ msgid "`isarray' is deprecated. Use `typeof' instead"
+#~ msgstr "“isarray” đã lạc hậu. Dùng “typeof” để thay thế"
+
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "cố dùng mảng “%s[\".*%s\"]” trong một ngữ cảnh vô hướng"
+
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "cố dùng kiểu vô hướng “%s[\".*%s\"]” như là mảng"
+
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub: đối số thứ ba %g được xử lý như 1"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "“extension” là một phần mở rộng gawk"
+
+#~ msgid "extension: received NULL lib_name"
+#~ msgstr "extension: nhận được tên_thư_viện NULL"
+
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "phần mở rộng: không thể mở thư viện “%s” (%s)"
+
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr ""
+#~ "phần mở rộng: thư viện “%s”: chưa định nghĩa "
+#~ "“plugin_is_GPL_compatible” (%s)"
+
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr "phần mở rộng: thư viện “%s”: không thể gọi hàm “%s” (%s)"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension: (phần mở rộng) tên hàm còn thiếu"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension: (phần mở rộng) gặp ký tự cấm “%c” nằm trong tên hàm “%s”"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension: (phần mở rộng) không thể định nghĩa lại hàm “%s”"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension: (phần mở rộng) hàm “%s” đã được định nghĩa"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "tên hàm “%s” đã được định nghĩa trước đó"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr ""
+#~ "extension: (phần mở rộng) không thể dùng điều có sẵn của gawk “%s” như là "
+#~ "tên hàm"
+
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr "chdir: được gọi với số lượng đối số không đúng, cần 1"
+
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "stat: được gọi với số lượng đối số không đúng"
+
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "statvfs: được gọi với số lượng đối số không đúng"
+
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "fnmatch: được gọi với ít hơn ba đối số"
+
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "fnmatch: được gọi với nhiều hơn ba đối số"
+
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "fork: được gọi với quá nhiều đối số"
+
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "waitpid: được gọi với quá nhiều đối số"
+
+#~ msgid "wait: called with no arguments"
+#~ msgstr "wait: được gọi mà không truyền đối số"
+
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "wait: được gọi với quá nhiều đối số"
+
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "ord: được gọi với quá nhiều đối số"
+
+#~ msgid "ord: called with no arguments"
+#~ msgstr "ord: được gọi mà không có đối số"
+
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "chr: được gọi với quá nhiều đối số"
+
+#~ msgid "chr: called with no arguments"
+#~ msgstr "chr: được gọi mà không có đối số"
+
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "readfile: được gọi với quá nhiều đối số"
+
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "writea: được gọi với quá nhiều đối số"
+
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "reada: được gọi với quá nhiều đối số"
+
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "gettimeofday: đang lờ đi các đối số"
+
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sleep: được gọi với quá nhiều đối số"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "không hiểu giá trị dành cho đặc tả trường: %d\n"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr "hàm “%s” được định nghĩa để chấp nhận tối đa %d đối số"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "hàm “%s”: thiếu đối số #%d"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "“getline var” không hợp lệ bên trong quy tắc “%s”"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr ""
+#~ "trong tên tập tin đặc biệt “%s” không cung cấp giao thức (đã biết) nào"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "tên tập tin đặc biệt “%s” chưa xong"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "phải cung cấp một tên máy chủ cho </inet>"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "phải cung cấp một cổng máy chủ cho </inet>"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# %s khối\n"
+#~ "\n"
+
+#~ msgid "range of the form `[%c-%c]' is locale dependent"
+#~ msgstr "vùng của dạng thức “[%c-%c]” phụ thuộc vào vị trí"
+
+#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'"
+#~ msgstr "tham chiếu đến phần tử chưa khởi tạo “%s[”%.*s”]”"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "chữ in dưới mảng “%s” là chuỗi rỗng"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: rỗng (vô giá trị)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: rỗng (số không)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: cỡ_bảng = %d, cỡ_mảng = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: “array_ref” (mảng tham chiếu) đến “%s”\n"
+
+#~ msgid "`nextfile' is a gawk extension"
+#~ msgstr "“nextfile” (tập tin kế tiếp) là một phần mở rộng gawk"
+
+#~ msgid "`delete array' is a gawk extension"
+#~ msgstr "“delete array” (xóa mảng) là một phần mở rộng gawk"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "việc dùng cái khác mảng như là mảng"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "“%s” là một phần mở rộng của Bell Labs (Phòng thí nghiệm Bell)"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: (hoặc) đã nhận đối số đầu không phải thuộc số"
+
+#~ msgid "or: received non-numeric second argument"
+#~ msgstr "or: (hoặc) đã nhận đối số thứ hai khác thuộc số"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): (hoặc) giá trị âm sẽ gây ra kết quả lạ"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): (hoặc) giá trị thuộc phân số sẽ bị xén ngắn"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: (không hoặc) đã nhận đối số thứ nhất khác thuộc số"
+
+#~ msgid "xor: received non-numeric second argument"
+#~ msgstr "xor: đã nhận đối số thứ hai khác thuộc số"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): (không hoặc) giá trị thuộc phân số sẽ bị xén ngắn"
+
+#~ msgid "can't use function name `%s' as variable or array"
+#~ msgstr "không thể dùng tên hàm “%s” như là biến hay mảng"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "điều gán được dùng trong ngữ cảnh điều kiện"
+
+#~ msgid "statement has no effect"
+#~ msgstr "câu không có tác dụng"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr ""
+#~ "cho loop: (cho vòng lặp) mảng “%s” đã thay đổi kích thước từ %ld đến %ld "
+#~ "trong khi thực hiện vòng lặp"
+
+#~ msgid "function called indirectly through `%s' does not exist"
+#~ msgstr "hàm được gọi gián tiếp thông qua “%s” không tồn tại"
+
+#~ msgid "function `%s' not defined"
+#~ msgstr "chưa định nghĩa hàm “%s”"
diff --git a/gawk-5.0.1/po/zh_CN.po b/gawk-5.0.1/po/zh_CN.po
new file mode 100644
index 00000000000..628fbb3010c
--- /dev/null
+++ b/gawk-5.0.1/po/zh_CN.po
@@ -0,0 +1,3965 @@
+# Chinese translations for gawk package
+# gawk 软件包的简体中文翻译.
+# Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gawk package.
+# LI Daobing <lidaobing@gmail.com>, 2007, 2009.
+# Aron Xu <happyaron.xu@gmail.com>, 2010.
+# Tianze Wang <zwpwjwtz@126.com>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gawk 4.2.63\n"
+"Report-Msgid-Bugs-To: bug-gawk@gnu.org\n"
+"POT-Creation-Date: 2019-06-18 20:07+0300\n"
+"PO-Revision-Date: 2019-03-19 17:46+0100\n"
+"Last-Translator: Tianze Wang <zwpwjwtz@126.com>\n"
+"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
+"Language: zh_CN\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Bugs: Report translation errors to the Language-Team address.\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Poedit 2.0.7\n"
+
+#: array.c:247
+#, c-format
+msgid "from %s"
+msgstr "从 %s"
+
+#: array.c:348
+msgid "attempt to use a scalar value as array"
+msgstr "试图把标量当数组使用"
+
+#: array.c:350
+#, c-format
+msgid "attempt to use scalar parameter `%s' as an array"
+msgstr "试图把标量参数“%s”当数组使用"
+
+#: array.c:353
+#, c-format
+msgid "attempt to use scalar `%s' as an array"
+msgstr "试图把标量“%s”当数组使用"
+
+#: array.c:400 array.c:567 builtin.c:88 builtin.c:1686 builtin.c:1732
+#: builtin.c:1745 builtin.c:2240 builtin.c:2267 eval.c:1151 eval.c:1155
+#: eval.c:1530
+#, c-format
+msgid "attempt to use array `%s' in a scalar context"
+msgstr "试图在标量环境中使用数组“%s”"
+
+#: array.c:574
+#, c-format
+msgid "delete: index `%.*s' not in array `%s'"
+msgstr "delete：索引“%.*s”不在数组“%s”中"
+
+#: array.c:588
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as an array"
+msgstr "试图把标量“%s[\"%.*s\"]”当数组使用"
+
+#: array.c:782
+msgid "adump: first argument not an array"
+msgstr "adump：第一个参数不是数组"
+
+#: array.c:824
+msgid "asort: second argument not an array"
+msgstr "asort：第二个参数不是数组"
+
+#: array.c:825
+msgid "asorti: second argument not an array"
+msgstr "asorti：第二个参数不是数组"
+
+#: array.c:832
+msgid "asort: first argument not an array"
+msgstr "asort：第一个参数不是数组"
+
+#: array.c:833
+msgid "asorti: first argument not an array"
+msgstr "asorti：第一个参数不是数组"
+
+#: array.c:840
+msgid "asort: cannot use a subarray of first arg for second arg"
+msgstr "asort：无法将第一个参数的子数组作为第二个参数"
+
+#: array.c:841
+msgid "asorti: cannot use a subarray of first arg for second arg"
+msgstr "asorti：无法将第一个参数的子数组作为第二个参数"
+
+#: array.c:846
+msgid "asort: cannot use a subarray of second arg for first arg"
+msgstr "asort：无法将第二个参数的子数组作为第一个参数"
+
+#: array.c:847
+msgid "asorti: cannot use a subarray of second arg for first arg"
+msgstr "asorti：无法将第二个参数的子数组作为第一个参数"
+
+#: array.c:1310
+#, c-format
+msgid "`%s' is invalid as a function name"
+msgstr "“%s”用于函数名是无效的"
+
+#: array.c:1314
+#, c-format
+msgid "sort comparison function `%s' is not defined"
+msgstr "排序比较函数“%s”未定义"
+
+#: awkgram.y:275
+#, c-format
+msgid "%s blocks must have an action part"
+msgstr "%s 块必须有一个行为部分"
+
+#: awkgram.y:278
+msgid "each rule must have a pattern or an action part"
+msgstr "每个规则必须有一个模式或行为部分"
+
+#: awkgram.y:419 awkgram.y:431
+msgid "old awk does not support multiple `BEGIN' or `END' rules"
+msgstr "老的 awk 不支持多个“BEGIN”或“END”规则"
+
+#: awkgram.y:484
+#, c-format
+msgid "`%s' is a built-in function, it cannot be redefined"
+msgstr "“%s”是内置函数，不能被重定义"
+
+#: awkgram.y:548
+msgid "regexp constant `//' looks like a C++ comment, but is not"
+msgstr "正则表达式常量“//”看起来像 C++ 注释，但其实不是"
+
+#: awkgram.y:552
+#, c-format
+msgid "regexp constant `/%s/' looks like a C comment, but is not"
+msgstr "正则表达式常量“/%s/”看起来像 C 注释，但其实不是"
+
+#: awkgram.y:679
+#, c-format
+msgid "duplicate case values in switch body: %s"
+msgstr "switch 中有重复的 case 值：%s"
+
+#: awkgram.y:700
+msgid "duplicate `default' detected in switch body"
+msgstr "switch 中有重复的“default”"
+
+#: awkgram.y:1035 awkgram.y:4457
+msgid "`break' is not allowed outside a loop or switch"
+msgstr "“break”在循环或 switch外使用是不允许的"
+
+#: awkgram.y:1045 awkgram.y:4449
+msgid "`continue' is not allowed outside a loop"
+msgstr "“continue”在循环外使用是不允许的"
+
+#: awkgram.y:1056
+#, c-format
+msgid "`next' used in %s action"
+msgstr "“next”被用于 %s 操作"
+
+#: awkgram.y:1067
+#, c-format
+msgid "`nextfile' used in %s action"
+msgstr "“nextfile”被用于 %s 操作"
+
+#: awkgram.y:1095
+msgid "`return' used outside function context"
+msgstr "“return”在函数外使用"
+
+#: awkgram.y:1168
+msgid "plain `print' in BEGIN or END rule should probably be `print \"\"'"
+msgstr "在 BEGIN 或 END 规则中，“print”也许应该写做“print \"\"”"
+
+#: awkgram.y:1238 awkgram.y:1287
+msgid "`delete' is not allowed with SYMTAB"
+msgstr "“delete”不能与 SYMTAB 共用"
+
+#: awkgram.y:1240 awkgram.y:1289
+msgid "`delete' is not allowed with FUNCTAB"
+msgstr "“delete”不能与 FUNCTAB 共用"
+
+#: awkgram.y:1274 awkgram.y:1278
+msgid "`delete(array)' is a non-portable tawk extension"
+msgstr "“delete(array)”是不可移植的 tawk 扩展"
+
+#: awkgram.y:1414
+msgid "multistage two-way pipelines don't work"
+msgstr "多阶双向管道无法工作"
+
+#: awkgram.y:1416
+msgid "concatenation as I/O `>' redirection target is ambiguous"
+msgstr "输入输出重定向符“>”（合并内容）的目标有歧义"
+
+#: awkgram.y:1620
+msgid "regular expression on right of assignment"
+msgstr "正则表达式在赋值算符的右边"
+
+#: awkgram.y:1635 awkgram.y:1648
+msgid "regular expression on left of `~' or `!~' operator"
+msgstr "正则表达式在“~”或“!~”算符的左边"
+
+#: awkgram.y:1665 awkgram.y:1814
+msgid "old awk does not support the keyword `in' except after `for'"
+msgstr "老 awk 只支持关键词“in”在“for”的后面"
+
+#: awkgram.y:1675
+msgid "regular expression on right of comparison"
+msgstr "正则表达式在比较算符的右边"
+
+#: awkgram.y:1794
+#, c-format
+msgid "non-redirected `getline' invalid inside `%s' rule"
+msgstr "非重定向的“getline” 在“%s”规则中无效"
+
+#: awkgram.y:1797
+msgid "non-redirected `getline' undefined inside END action"
+msgstr "在 END 环境中，非重定向的“getline”未定义"
+
+#: awkgram.y:1816
+msgid "old awk does not support multidimensional arrays"
+msgstr "老 awk 不支持多维数组"
+
+#: awkgram.y:1919
+msgid "call of `length' without parentheses is not portable"
+msgstr "不带括号调用“length”是不可以移植的"
+
+#: awkgram.y:1993
+msgid "indirect function calls are a gawk extension"
+msgstr "间接函数调用是一个 gawk 扩展"
+
+#: awkgram.y:2006
+#, c-format
+msgid "can not use special variable `%s' for indirect function call"
+msgstr "无法使用特殊变量“%s”作为间接函数的参数"
+
+#: awkgram.y:2039
+#, c-format
+msgid "attempt to use non-function `%s' in function call"
+msgstr "试图把非函数“%s”当函数来调用"
+
+#: awkgram.y:2104
+msgid "invalid subscript expression"
+msgstr "无效的下标表达式"
+
+#: awkgram.y:2477 awkgram.y:2497 gawkapi.c:273 gawkapi.c:290 msg.c:137
+msgid "warning: "
+msgstr "警告："
+
+#: awkgram.y:2495 gawkapi.c:245 gawkapi.c:288 msg.c:169
+msgid "fatal: "
+msgstr "致命错误："
+
+#: awkgram.y:2548
+msgid "unexpected newline or end of string"
+msgstr "未预期的新行或字符串结束"
+
+#: awkgram.y:2569
+msgid ""
+"source files / command-line arguments must contain complete functions or "
+"rules"
+msgstr "源文件 / 命令行中的参数必须包含完整的函数或规则"
+
+#: awkgram.y:2851 awkgram.y:2929 awkgram.y:3167 debug.c:536 debug.c:552
+#: debug.c:2829 debug.c:5194
+#, c-format
+msgid "can't open source file `%s' for reading (%s)"
+msgstr "无法打开源文件“%s”进行读取(%s)"
+
+#: awkgram.y:2852 awkgram.y:2989
+#, c-format
+msgid "can't open shared library `%s' for reading (%s)"
+msgstr "无法打开共享库“%s”进行读取(%s)"
+
+#: awkgram.y:2854 awkgram.y:2930 awkgram.y:2990 builtin.c:149 debug.c:5345
+msgid "reason unknown"
+msgstr "未知原因"
+
+#: awkgram.y:2863 awkgram.y:2887
+#, c-format
+msgid "can't include `%s' and use it as a program file"
+msgstr "无法包含“%s”并将其作为程序文件使用"
+
+#: awkgram.y:2876
+#, c-format
+msgid "already included source file `%s'"
+msgstr "已经包含了源文件“%s”"
+
+#: awkgram.y:2877
+#, c-format
+msgid "already loaded shared library `%s'"
+msgstr "已经加载了共享库“%s”"
+
+#: awkgram.y:2914
+msgid "@include is a gawk extension"
+msgstr "@include 是 gawk 扩展"
+
+#: awkgram.y:2920
+msgid "empty filename after @include"
+msgstr "@include 后的文件名为空"
+
+#: awkgram.y:2969
+msgid "@load is a gawk extension"
+msgstr "@load 是 gawk 扩展"
+
+#: awkgram.y:2976
+msgid "empty filename after @load"
+msgstr "@load 后的文件名为空"
+
+#: awkgram.y:3119
+msgid "empty program text on command line"
+msgstr "命令行中程序体为空"
+
+#: awkgram.y:3234
+#, c-format
+msgid "can't read sourcefile `%s' (%s)"
+msgstr "无法读取源文件“%s”(%s)"
+
+#: awkgram.y:3245
+#, c-format
+msgid "source file `%s' is empty"
+msgstr "源文件“%s”为空"
+
+#: awkgram.y:3304
+#, c-format
+msgid "PEBKAC error: invalid character '\\%03o' in source code"
+msgstr "PEBKAC 错误：源代码中有无效的字符“\\%03o”"
+
+#: awkgram.y:3531
+msgid "source file does not end in newline"
+msgstr "源文件不以换行符结束"
+
+#: awkgram.y:3652
+msgid "unterminated regexp ends with `\\' at end of file"
+msgstr "未终止的正则表达式在文件结束处以“\\”结束"
+
+#: awkgram.y:3679
+#, c-format
+msgid "%s: %d: tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "%s：%d：tawk 正则表达式修饰符“/.../%c”无法在 gawk 中工作"
+
+#: awkgram.y:3683
+#, c-format
+msgid "tawk regex modifier `/.../%c' doesn't work in gawk"
+msgstr "tawk 正则表达式修饰符“/.../%c”无法在 gawk 中工作"
+
+#: awkgram.y:3696
+msgid "unterminated regexp"
+msgstr "未终止的正则表达式"
+
+#: awkgram.y:3700
+msgid "unterminated regexp at end of file"
+msgstr "未终止的正则表达式在文件结束处"
+
+#: awkgram.y:3789
+msgid "use of `\\ #...' line continuation is not portable"
+msgstr "使用“\\ #...”来续行是不可移植的"
+
+#: awkgram.y:3811
+msgid "backslash not last character on line"
+msgstr "反斜杠不是行的最后一个字符"
+
+#: awkgram.y:3858 awkgram.y:3860
+msgid "multidimensional arrays are a gawk extension"
+msgstr "多维数组是一个 gawk 扩展"
+
+#: awkgram.y:3885
+msgid "POSIX does not allow operator `**='"
+msgstr "POSIX 不允许操作符“**=”"
+
+#: awkgram.y:3887
+msgid "old awk does not support operator `**='"
+msgstr "老 awk 不支持操作符“**=”"
+
+#: awkgram.y:3896
+msgid "POSIX does not allow operator `**'"
+msgstr "POSIX 不允许操作符“**”"
+
+#: awkgram.y:3898
+msgid "old awk does not support operator `**'"
+msgstr "老 awk 不支持操作符“**”"
+
+#: awkgram.y:3933
+msgid "operator `^=' is not supported in old awk"
+msgstr "老 awk 不支持操作符“^=”"
+
+#: awkgram.y:3941
+msgid "operator `^' is not supported in old awk"
+msgstr "老 awk 不支持操作符“^”"
+
+#: awkgram.y:4038 awkgram.y:4060 command.y:1187
+msgid "unterminated string"
+msgstr "未结束的字符串"
+
+#: awkgram.y:4048 main.c:1220
+msgid "POSIX does not allow physical newlines in string values"
+msgstr "POSIX 不允许字符串的值中包含换行符"
+
+#: awkgram.y:4050 node.c:453
+msgid "backslash string continuation is not portable"
+msgstr "使用“\\ #...”来续行会导致代码缺乏兼容性（可移植性）"
+
+#: awkgram.y:4288
+#, c-format
+msgid "invalid char '%c' in expression"
+msgstr "表达式中的无效字符“%c”"
+
+#: awkgram.y:4383
+#, c-format
+msgid "`%s' is a gawk extension"
+msgstr "“%s”是 gawk 扩展"
+
+#: awkgram.y:4388
+#, c-format
+msgid "POSIX does not allow `%s'"
+msgstr "POSIX 不允许“%s”"
+
+#: awkgram.y:4396
+#, c-format
+msgid "`%s' is not supported in old awk"
+msgstr "老 awk 不支持“%s”"
+
+#: awkgram.y:4494
+msgid "`goto' considered harmful!"
+msgstr "“goto”有害，请慎用！"
+
+#: awkgram.y:4563
+#, c-format
+msgid "%d is invalid as number of arguments for %s"
+msgstr "%d 是 %s 的无效参数个数"
+
+#: awkgram.y:4598
+#, c-format
+msgid "%s: string literal as last arg of substitute has no effect"
+msgstr "%s：字符串作为 substitute 的最后一个参数无任何效果"
+
+#: awkgram.y:4603
+#, c-format
+msgid "%s third parameter is not a changeable object"
+msgstr "%s 第三个参数不是一个可变对象"
+
+#: awkgram.y:4707 awkgram.y:4710
+msgid "match: third argument is a gawk extension"
+msgstr "match：第三个参数是 gawk 扩展"
+
+#: awkgram.y:4764 awkgram.y:4767
+msgid "close: second argument is a gawk extension"
+msgstr "close：第二个参数是 gawk 扩展"
+
+#: awkgram.y:4779
+msgid "use of dcgettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "使用 dcgettext(_\"...\") 是错误的：去掉开始的下划线"
+
+#: awkgram.y:4794
+msgid "use of dcngettext(_\"...\") is incorrect: remove leading underscore"
+msgstr "使用 dcngettext(_\"...\") 是错误的：去掉开始的下划线"
+
+#: awkgram.y:4813
+msgid "index: regexp constant as second argument is not allowed"
+msgstr "index：不允许将正则表达式常量作为第二个参数"
+
+#: awkgram.y:4866
+#, c-format
+msgid "function `%s': parameter `%s' shadows global variable"
+msgstr "函数“%s”：参数“%s”掩盖了公共变量"
+
+#: awkgram.y:4915 debug.c:4179 debug.c:4222 debug.c:5343
+#, c-format
+msgid "could not open `%s' for writing (%s)"
+msgstr "无法以写模式打开“%s” (%s)"
+
+#: awkgram.y:4916
+msgid "sending variable list to standard error"
+msgstr "发送变量列表到标准错误输出"
+
+#: awkgram.y:4924
+#, c-format
+msgid "%s: close failed (%s)"
+msgstr "%s：关闭失败(%s)"
+
+#: awkgram.y:4949
+msgid "shadow_funcs() called twice!"
+msgstr "shadow_funcs() 被调用两次！"
+
+#: awkgram.y:4957
+msgid "there were shadowed variables."
+msgstr "有变量被掩盖。"
+
+#: awkgram.y:5034
+#, c-format
+msgid "function name `%s' previously defined"
+msgstr "函数名“%s”前面已定义"
+
+#: awkgram.y:5085
+#, c-format
+msgid "function `%s': can't use function name as parameter name"
+msgstr "函数“%s”：无法使用函数名作为参数名"
+
+#: awkgram.y:5088
+#, c-format
+msgid "function `%s': can't use special variable `%s' as a function parameter"
+msgstr "函数“%s”：无法使用特殊变量“%s”作为函数参数"
+
+#: awkgram.y:5092
+#, c-format
+msgid "function `%s': parameter `%s' cannot contain a namespace"
+msgstr "函数“%s”：参数“%s”中不允许包含命名空间（namespace）"
+
+#: awkgram.y:5099
+#, c-format
+msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
+msgstr "函数“%s”：第 %d 个参数, “%s”, 与第 %d 个参数重复"
+
+#: awkgram.y:5188
+#, c-format
+msgid "function `%s' called but never defined"
+msgstr "调用了函数“%s”，但其未被定义"
+
+#: awkgram.y:5192
+#, c-format
+msgid "function `%s' defined but never called directly"
+msgstr "定义了函数“%s”，但从未被调用"
+
+#: awkgram.y:5224
+#, c-format
+msgid "regexp constant for parameter #%d yields boolean value"
+msgstr "第 %d 个参数的正则表达式常量产生布尔值"
+
+#: awkgram.y:5239
+#, c-format
+msgid ""
+"function `%s' called with space between name and `(',\n"
+"or used as a variable or an array"
+msgstr ""
+"函数“%s”被调用时名字与“(”间有空格，\n"
+"或被用作变量或数组"
+
+#: awkgram.y:5454
+msgid "division by zero attempted"
+msgstr "试图除0"
+
+#: awkgram.y:5463
+#, c-format
+msgid "division by zero attempted in `%%'"
+msgstr "在“%%”中试图除 0"
+
+#: awkgram.y:5802
+msgid ""
+"cannot assign a value to the result of a field post-increment expression"
+msgstr "无法将值赋给字段后增表达式"
+
+#: awkgram.y:5805
+#, c-format
+msgid "invalid target of assignment (opcode %s)"
+msgstr "赋值的目标无效（操作码 %s）"
+
+#: awkgram.y:6697
+#, c-format
+msgid "identifier %s: qualified names not allowed in traditional / POSIX mode"
+msgstr "标识符 %s：传统 / POSIX 模式下不允许使用合规名称（qualified name）"
+
+#: awkgram.y:6702
+#, c-format
+msgid "identifier %s: namespace separator is two colons, not one"
+msgstr "标识符 %s：命名空间的分隔符应为双冒号（::）"
+
+#: awkgram.y:6708
+#, c-format
+msgid "qualified identifier `%s' is badly formed"
+msgstr "合规标识符“%s”格式错误"
+
+#: awkgram.y:6715
+#, c-format
+msgid ""
+"identifier `%s': namespace separator can only appear once in a qualified name"
+msgstr "标识符“%s”：合规名称中的命名空间分隔符最多只能出现一次"
+
+#: awkgram.y:6764 awkgram.y:6815
+#, c-format
+msgid "using reserved identifier `%s' as a namespace is not allowed"
+msgstr "不允许将反向标识符“%s”作为命名空间"
+
+#: awkgram.y:6771 awkgram.y:6781
+#, c-format
+msgid ""
+"using reserved identifier `%s' as second component of a qualified name is "
+"not allowed"
+msgstr "不允许将反向标识符“%s”作为合规名称的第二个组成部分"
+
+#: awkgram.y:6799
+msgid "@namespace is a gawk extension"
+msgstr "@namespace 是 gawk 保留字"
+
+#: awkgram.y:6806
+#, c-format
+msgid "namespace name `%s' must meet identifier naming rules"
+msgstr "命名空间“%s”必须符合标识符的命名规则"
+
+#: builtin.c:143
+#, c-format
+msgid "%s to \"%s\" failed (%s)"
+msgstr "%s 到 \"%s\" 失败 (%s)"
+
+#: builtin.c:147
+msgid "standard output"
+msgstr "标准输出"
+
+#: builtin.c:148
+msgid "standard error"
+msgstr "标准错误输出"
+
+#: builtin.c:162
+msgid "exp: received non-numeric argument"
+msgstr "exp：收到非数字参数"
+
+#: builtin.c:168
+#, c-format
+msgid "exp: argument %g is out of range"
+msgstr "exp：参数 %g 超出范围"
+
+#: builtin.c:245
+#, c-format
+msgid "fflush: cannot flush: pipe `%.*s' opened for reading, not writing"
+msgstr "fflush：无法使用：管道“%.*s”以只读方式打开，不可写"
+
+#: builtin.c:248
+#, c-format
+msgid "fflush: cannot flush: file `%.*s' opened for reading, not writing"
+msgstr "fflush：无法使用：文件“%.*s”以只读方式打开，不可写"
+
+#: builtin.c:259
+#, c-format
+msgid "fflush: cannot flush file `%.*s': %s"
+msgstr "fflush：无法刷新缓存到文件“%.*s”：%s"
+
+#: builtin.c:264
+#, c-format
+msgid "fflush: cannot flush: two-way pipe `%.*s' has closed write end"
+msgstr "fflush：无法刷新：双向管道“%.*s”的写入端已被关闭"
+
+#: builtin.c:270
+#, c-format
+msgid "fflush: `%.*s' is not an open file, pipe or co-process"
+msgstr "fflush：“%.*s”不是一个已打开文件、管道或合作进程"
+
+#: builtin.c:377
+msgid "index: received non-string first argument"
+msgstr "index：第一个参数不是字符串"
+
+#: builtin.c:379
+msgid "index: received non-string second argument"
+msgstr "index：第二个参数不是字符串"
+
+#: builtin.c:492 mpfr.c:774
+msgid "int: received non-numeric argument"
+msgstr "int：收到非数字参数"
+
+#: builtin.c:531
+msgid "length: received array argument"
+msgstr "length：收到数组参数"
+
+#: builtin.c:534
+msgid "`length(array)' is a gawk extension"
+msgstr "“length(array)”是 gawk 扩展"
+
+#: builtin.c:553
+msgid "length: received non-string argument"
+msgstr "length：收到非字符串参数"
+
+#: builtin.c:582
+msgid "log: received non-numeric argument"
+msgstr "log：收到非数字参数"
+
+#: builtin.c:585
+#, c-format
+msgid "log: received negative argument %g"
+msgstr "log：收到负数参数 %g"
+
+#: builtin.c:785 builtin.c:790 builtin.c:943
+msgid "fatal: must use `count$' on all formats or none"
+msgstr "致命错误：要么在所有格式上使用“count$”，要么完全不使用"
+
+#: builtin.c:862
+#, c-format
+msgid "field width is ignored for `%%' specifier"
+msgstr "“%%”限定符的字段宽度被忽略"
+
+#: builtin.c:864
+#, c-format
+msgid "precision is ignored for `%%' specifier"
+msgstr "“%%”描述符的精度被忽略"
+
+#: builtin.c:866
+#, c-format
+msgid "field width and precision are ignored for `%%' specifier"
+msgstr "“%%”描述符的字段宽度和精度被忽略"
+
+#: builtin.c:917
+msgid "fatal: `$' is not permitted in awk formats"
+msgstr "致命错误：awk 格式中不允许 “$”"
+
+#: builtin.c:926
+msgid "fatal: arg count with `$' must be > 0"
+msgstr "致命错误：含有“$”的参数个数必须大于0"
+
+#: builtin.c:930
+#, c-format
+msgid "fatal: arg count %ld greater than total number of supplied arguments"
+msgstr "致命错误：参数个数 %ld 大于提供参数的总数"
+
+#: builtin.c:934
+msgid "fatal: `$' not permitted after period in format"
+msgstr "致命错误：不允许在格式中的“.”后使用“$”"
+
+#: builtin.c:953
+msgid "fatal: no `$' supplied for positional field width or precision"
+msgstr "致命错误：没有为格式宽度或精度提供“$”"
+
+#: builtin.c:1023
+msgid "`l' is meaningless in awk formats; ignored"
+msgstr "“l”在 awk 格式中无意义；忽略"
+
+#: builtin.c:1027
+msgid "fatal: `l' is not permitted in POSIX awk formats"
+msgstr "致命错误：不允许在 POSIX awk 格式中使用“l”"
+
+#: builtin.c:1040
+msgid "`L' is meaningless in awk formats; ignored"
+msgstr "“L”在 awk 格式中无意义；忽略"
+
+#: builtin.c:1044
+msgid "fatal: `L' is not permitted in POSIX awk formats"
+msgstr "致命错误：不允许在 POSIX awk 格式中使用“L”"
+
+#: builtin.c:1057
+msgid "`h' is meaningless in awk formats; ignored"
+msgstr "“h”在 awk 格式中无意义；忽略"
+
+#: builtin.c:1061
+msgid "fatal: `h' is not permitted in POSIX awk formats"
+msgstr "致命错误：不允许在 POSIX awk 格式中使用“h”"
+
+#: builtin.c:1091
+#, c-format
+msgid "[s]printf: value %g is too big for %%c format"
+msgstr "[s]printf：值 %g 对“%%c”格式来说超出范围"
+
+#: builtin.c:1104
+#, c-format
+msgid "[s]printf: value %g is not a valid wide character"
+msgstr "[s]printf：值 %g 不是有效的宽字符"
+
+#: builtin.c:1496
+#, c-format
+msgid "[s]printf: value %g is out of range for `%%%c' format"
+msgstr "[s]printf：值 %g 对“%%%c”格式来说超出范围"
+
+#: builtin.c:1504
+#, c-format
+msgid "[s]printf: value %s is out of range for `%%%c' format"
+msgstr "[s]printf：值 %s 对“%%%c”格式来说超出范围"
+
+#: builtin.c:1529
+#, c-format
+msgid "%%%c format is POSIX standard but not portable to other awks"
+msgstr "%%%c 格式符合 POSIX 规范，但可能无法与其他的 awk 兼容"
+
+#: builtin.c:1629
+#, c-format
+msgid "ignoring unknown format specifier character `%c': no argument converted"
+msgstr "忽略位置的格式化字符“%c”：无参数被转化"
+
+#: builtin.c:1634
+msgid "fatal: not enough arguments to satisfy format string"
+msgstr "致命错误：参数数量少于格式数量"
+
+#: builtin.c:1636
+msgid "^ ran out for this one"
+msgstr "^ 跑出范围"
+
+#: builtin.c:1643
+msgid "[s]printf: format specifier does not have control letter"
+msgstr "[s]printf：指定格式不含控制字符"
+
+#: builtin.c:1646
+msgid "too many arguments supplied for format string"
+msgstr "相对格式来说参数个数过多"
+
+#: builtin.c:1705
+msgid "sprintf: no arguments"
+msgstr "sprintf：没有参数"
+
+#: builtin.c:1728 builtin.c:1739
+msgid "printf: no arguments"
+msgstr "printf：没有参数"
+
+#: builtin.c:1754
+msgid "printf: attempt to write to closed write end of two-way pipe"
+msgstr "printf：试图向写入端已被关闭的双向管道中写入数据"
+
+#: builtin.c:1795
+msgid "sqrt: received non-numeric argument"
+msgstr "sqrt：收到非数字参数"
+
+#: builtin.c:1799
+#, c-format
+msgid "sqrt: called with negative argument %g"
+msgstr "sqrt：收到负数参数 %g"
+
+#: builtin.c:1830
+#, c-format
+msgid "substr: length %g is not >= 1"
+msgstr "substr：长度 %g 小于 1"
+
+#: builtin.c:1832
+#, c-format
+msgid "substr: length %g is not >= 0"
+msgstr "substr：长度 %g 小于 0"
+
+#: builtin.c:1846
+#, c-format
+msgid "substr: non-integer length %g will be truncated"
+msgstr "substr：非整数的长度 %g 会被截断"
+
+#: builtin.c:1851
+#, c-format
+msgid "substr: length %g too big for string indexing, truncating to %g"
+msgstr "substr：长度 %g 作为字符串索引过大，截断至 %g"
+
+#: builtin.c:1863
+#, c-format
+msgid "substr: start index %g is invalid, using 1"
+msgstr "substr：开始坐标 %g 无效，使用 1"
+
+#: builtin.c:1868
+#, c-format
+msgid "substr: non-integer start index %g will be truncated"
+msgstr "substr：非整数的开始索引 %g 会被截断"
+
+#: builtin.c:1891
+msgid "substr: source string is zero length"
+msgstr "substr：源字符串长度为0"
+
+#: builtin.c:1905
+#, c-format
+msgid "substr: start index %g is past end of string"
+msgstr "substr：开始坐标 %g 超出字符串尾部"
+
+#: builtin.c:1913
+#, c-format
+msgid ""
+"substr: length %g at start index %g exceeds length of first argument (%lu)"
+msgstr "substr：在开始坐标 %2$g 下长度 %1$g 超出第一个参数的长度 (%3$lu)"
+
+#: builtin.c:1986
+msgid "strftime: format value in PROCINFO[\"strftime\"] has numeric type"
+msgstr "strftime：PROCINFO[\"strftime\"] 中的格式值含有数值类型"
+
+#: builtin.c:2006
+msgid "strftime: received non-numeric second argument"
+msgstr "strftime：第二个参数不是数字"
+
+#: builtin.c:2016
+msgid "strftime: second argument less than 0 or too big for time_t"
+msgstr "strftime：第二个参数小于0，或对于 time_t 来说太大"
+
+#: builtin.c:2023
+msgid "strftime: second argument out of range for time_t"
+msgstr "strftime：第二个参数对于 time_t 来说太大"
+
+#: builtin.c:2032
+msgid "strftime: received non-string first argument"
+msgstr "strftime：第一个参数不是字符串"
+
+#: builtin.c:2039
+msgid "strftime: received empty format string"
+msgstr "strftime：收到空格式字符串"
+
+#: builtin.c:2122
+msgid "mktime: received non-string argument"
+msgstr "mktime：收到非字符串参数"
+
+#: builtin.c:2139
+msgid "mktime: at least one of the values is out of the default range"
+msgstr "mktime：至少有一个值超出默认范围"
+
+#: builtin.c:2175
+msgid "'system' function not allowed in sandbox mode"
+msgstr "沙箱模式中不允许使用\"system\"函数"
+
+#: builtin.c:2180
+msgid "system: received non-string argument"
+msgstr "system：收到非字符串参数"
+
+#: builtin.c:2249 builtin.c:2322
+msgid "print: attempt to write to closed write end of two-way pipe"
+msgstr "print：试图向写入端已被关闭的双向管道中写入数据"
+
+#: builtin.c:2345
+#, c-format
+msgid "reference to uninitialized field `$%d'"
+msgstr "引用未初始化的字段“$%d”"
+
+#: builtin.c:2430
+msgid "tolower: received non-string argument"
+msgstr "tolower：收到非字符串参数"
+
+#: builtin.c:2461
+msgid "toupper: received non-string argument"
+msgstr "toupper：收到非字符串参数"
+
+#: builtin.c:2494 mpfr.c:674
+msgid "atan2: received non-numeric first argument"
+msgstr "atan2：第一个参数不是数字"
+
+#: builtin.c:2496 mpfr.c:676
+msgid "atan2: received non-numeric second argument"
+msgstr "atan2：第二个参数不是数字"
+
+#: builtin.c:2515
+msgid "sin: received non-numeric argument"
+msgstr "sin：收到非数字参数"
+
+#: builtin.c:2531
+msgid "cos: received non-numeric argument"
+msgstr "cos：收到非数字参数"
+
+#: builtin.c:2645 mpfr.c:1169
+msgid "srand: received non-numeric argument"
+msgstr "srand：收到非数字参数"
+
+#: builtin.c:2676
+msgid "match: third argument is not an array"
+msgstr "match：第三个参数不是数组"
+
+#: builtin.c:2919
+#, c-format
+msgid "gensub: third argument `%.*s' treated as 1"
+msgstr "gensub：第三个参数“%.*s”被当作 1"
+
+#: builtin.c:3241
+#, c-format
+msgid "%s: can be called indirectly only with two arguments"
+msgstr "%s：间接调用时只能传递两个参数"
+
+#: builtin.c:3341
+#, c-format
+msgid "indirect call to %s requires at least two arguments"
+msgstr "间接调用 %s 需要传递至少两个参数"
+
+#: builtin.c:3396
+msgid "lshift: received non-numeric first argument"
+msgstr "lshift：第一个参数不是数字"
+
+#: builtin.c:3398
+msgid "lshift: received non-numeric second argument"
+msgstr "lshift：第二个参数不是数字"
+
+#: builtin.c:3404
+#, c-format
+msgid "lshift(%f, %f): negative values are not allowed"
+msgstr "lshift(%f, %f)：不允许传入负值"
+
+#: builtin.c:3408
+#, c-format
+msgid "lshift(%f, %f): fractional values will be truncated"
+msgstr "lshift(%f, %f)：小数部分会被截断"
+
+#: builtin.c:3410
+#, c-format
+msgid "lshift(%f, %f): too large shift value will give strange results"
+msgstr "lshift(%f, %f)：过大的移位会得到奇怪的结果"
+
+#: builtin.c:3435
+msgid "rshift: received non-numeric first argument"
+msgstr "rshift：第一个参数不是数字"
+
+#: builtin.c:3437
+msgid "rshift: received non-numeric second argument"
+msgstr "rshift：第二个参数不是数字"
+
+#: builtin.c:3443
+#, c-format
+msgid "rshift(%f, %f): negative values are not allowed"
+msgstr "rshift(%f, %f)：不允许传入负值"
+
+#: builtin.c:3447
+#, c-format
+msgid "rshift(%f, %f): fractional values will be truncated"
+msgstr "rshift(%f, %f)：小数部分会被截断"
+
+#: builtin.c:3449
+#, c-format
+msgid "rshift(%f, %f): too large shift value will give strange results"
+msgstr "rshift(%f, %f)：过大的移位会得到奇怪的结果"
+
+#: builtin.c:3474 mpfr.c:982
+msgid "and: called with less than two arguments"
+msgstr "and：调用时传递的参数不足2个"
+
+#: builtin.c:3479
+#, c-format
+msgid "and: argument %d is non-numeric"
+msgstr "and：参数 %d 不是数值"
+
+#: builtin.c:3483
+#, c-format
+msgid "and: argument %d negative value %g is not allowed"
+msgstr "and：参数 %d 不允许为负值 %g"
+
+#: builtin.c:3506 mpfr.c:1014
+msgid "or: called with less than two arguments"
+msgstr "or：调用时传递的参数不足2个"
+
+#: builtin.c:3511
+#, c-format
+msgid "or: argument %d is non-numeric"
+msgstr "or：参数 %d 不是数值"
+
+#: builtin.c:3515
+#, c-format
+msgid "or: argument %d negative value %g is not allowed"
+msgstr "or：数 %d 不允许为负值 %g"
+
+#: builtin.c:3537 mpfr.c:1045
+msgid "xor: called with less than two arguments"
+msgstr "xor：调用时传递的参数不足2个"
+
+#: builtin.c:3543
+#, c-format
+msgid "xor: argument %d is non-numeric"
+msgstr "xor：参数 %d 不是数值"
+
+#: builtin.c:3547
+#, c-format
+msgid "xor: argument %d negative value %g is not allowed"
+msgstr "xor：数 %d 不允许为负值 %g"
+
+#: builtin.c:3572 mpfr.c:804
+msgid "compl: received non-numeric argument"
+msgstr "compl：收到非数字参数"
+
+#: builtin.c:3577
+#, c-format
+msgid "compl(%f): negative value is not allowed"
+msgstr "compl(%f)：不允许使用负值"
+
+#: builtin.c:3580
+#, c-format
+msgid "compl(%f): fractional value will be truncated"
+msgstr "compl(%f)：小数部分会被截断"
+
+#: builtin.c:3764
+#, c-format
+msgid "dcgettext: `%s' is not a valid locale category"
+msgstr "dcgettext：“%s”不是一个有效的区域目录"
+
+#: builtin.c:3988 mpfr.c:1203
+msgid "intdiv: third argument is not an array"
+msgstr "intdiv：第三个参数不是数组"
+
+#: builtin.c:3996 mpfr.c:1211
+msgid "intdiv: received non-numeric first argument"
+msgstr "intdiv：第一个参数不是数字"
+
+#: builtin.c:3998 mpfr.c:1213
+msgid "intdiv: received non-numeric second argument"
+msgstr "intdiv：第二个参数不是数字"
+
+#: builtin.c:4007 mpfr.c:1252
+msgid "intdiv: division by zero attempted"
+msgstr "intdiv：试图除0"
+
+#: builtin.c:4046
+msgid "typeof: second argument is not an array"
+msgstr "typeof：第二个参数不是数组"
+
+#: builtin.c:4082
+#, c-format
+msgid ""
+"typeof detected invalid flags combination `%s'; please file a bug report."
+msgstr "typeof 函数发现一个无效的选项组合“%s”；请向开发者汇报此错误。"
+
+#: builtin.c:4101
+#, c-format
+msgid "typeof: invalid argument type `%s'"
+msgstr "typeof：参数类型“%s”无效"
+
+#: builtin.c:4105
+#, c-format
+msgid "typeof: unknown argument type `%s'"
+msgstr "typeof：参数类型“%s”未知"
+
+#: cint_array.c:1268 cint_array.c:1296
+#, c-format
+msgid "cannot add a new file (%.*s) to ARGV in sandbox mode"
+msgstr ""
+
+#: command.y:227
+#, c-format
+msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+msgstr "输入 (g)awk 语句，并以“end”命令结束\n"
+
+#: command.y:291
+#, c-format
+msgid "invalid frame number: %d"
+msgstr "层数无效：%d"
+
+#: command.y:297
+#, c-format
+msgid "info: invalid option - \"%s\""
+msgstr "info：选项无效 - “%s”"
+
+#: command.y:323
+#, c-format
+msgid "source \"%s\": already sourced."
+msgstr "source \"%s\"：已经添加。"
+
+#: command.y:328
+#, c-format
+msgid "save \"%s\": command not permitted."
+msgstr "save \"%s\"：不允许使用该命令。"
+
+#: command.y:341
+msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+msgstr "无法对断点/监视点使用命令“commands”"
+
+#: command.y:343
+msgid "no breakpoint/watchpoint has been set yet"
+msgstr "尚未设置断点/监视点"
+
+#: command.y:345
+msgid "invalid breakpoint/watchpoint number"
+msgstr "断点/监视点编号无效"
+
+#: command.y:350
+#, c-format
+msgid "Type commands for when %s %d is hit, one per line.\n"
+msgstr "当命中 %s %d 时，请输入命令，每行一句。\n"
+
+#: command.y:352
+#, c-format
+msgid "End with the command \"end\"\n"
+msgstr "以命令“end”结束\n"
+
+#: command.y:359
+msgid "`end' valid only in command `commands' or `eval'"
+msgstr "“end”仅在命令“commands”或“eval”中有效"
+
+#: command.y:369
+msgid "`silent' valid only in command `commands'"
+msgstr "“silent”仅在命令“commands”中有效"
+
+#: command.y:375
+#, c-format
+msgid "trace: invalid option - \"%s\""
+msgstr "trace：选项无效 - “%s”"
+
+#: command.y:389
+msgid "condition: invalid breakpoint/watchpoint number"
+msgstr "condition：断点/监视点编号无效"
+
+#: command.y:451
+msgid "argument not a string"
+msgstr "参数不是字符串"
+
+#: command.y:461 command.y:466
+#, c-format
+msgid "option: invalid parameter - \"%s\""
+msgstr "option：参数无效 - “%s”"
+
+#: command.y:476
+#, c-format
+msgid "no such function - \"%s\""
+msgstr "函数不存在 - “%s”"
+
+#: command.y:533
+#, c-format
+msgid "enable: invalid option - \"%s\""
+msgstr "enable：选项无效 - “%s”"
+
+#: command.y:599
+#, c-format
+msgid "invalid range specification: %d - %d"
+msgstr "指定的范围无效：%d - %d"
+
+#: command.y:661
+msgid "non-numeric value for field number"
+msgstr "字段编号不是数值"
+
+#: command.y:682 command.y:689
+msgid "non-numeric value found, numeric expected"
+msgstr "发现了非数字值，请提供数值"
+
+#: command.y:714 command.y:720
+msgid "non-zero integer value"
+msgstr "非零整数值"
+
+#: command.y:819
+msgid ""
+"backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+"frames."
+msgstr "backtrace [N] - 显示所有或最近 N 层 (若 N < 0，则显示最远 N 层) 调用。"
+
+#: command.y:821
+msgid ""
+"break [[filename:]N|function] - set breakpoint at the specified location."
+msgstr "break [[文件名:]N|函数] - 在指定处设置断点。"
+
+#: command.y:823
+msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+msgstr "clear [[文件名:]N|函数] - 删除之前设置的断点。"
+
+#: command.y:825
+msgid ""
+"commands [num] - starts a list of commands to be executed at a "
+"breakpoint(watchpoint) hit."
+msgstr "commands [编号] - 在断点 (监视点) 处执行一系列命令。"
+
+#: command.y:827
+msgid "condition num [expr] - set or clear breakpoint or watchpoint condition."
+msgstr "condition 编号 [表达式] - 设置或清除断点/监视点条件。"
+
+#: command.y:829
+msgid "continue [COUNT] - continue program being debugged."
+msgstr "continue [次数] - 继续运行所调试的程序。"
+
+#: command.y:831
+msgid "delete [breakpoints] [range] - delete specified breakpoints."
+msgstr "delete [断点] [范围] - 删除指定断点。"
+
+#: command.y:833
+msgid "disable [breakpoints] [range] - disable specified breakpoints."
+msgstr "disable [断点] [范围] - 禁用指定断点。"
+
+#: command.y:835
+msgid "display [var] - print value of variable each time the program stops."
+msgstr "display [变量] - 每当程序停止时，显示指定变量的值。"
+
+#: command.y:837
+msgid "down [N] - move N frames down the stack."
+msgstr "down [N] - 在栈中向下移动 N 层。"
+
+#: command.y:839
+msgid "dump [filename] - dump instructions to file or stdout."
+msgstr "dump [文件名] - 将指令转储到文件或标准输出。"
+
+#: command.y:841
+msgid "enable [once|del] [breakpoints] [range] - enable specified breakpoints."
+msgstr "enable [once|del] [断点] [范围] - 启用指定断点。"
+
+#: command.y:843
+msgid "end - end a list of commands or awk statements."
+msgstr "end - 结束一系列命令或 awk 语句。"
+
+#: command.y:845
+msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+msgstr "eval 语句|[p1, p2, ...] - 对 awk 语句求值。"
+
+#: command.y:847
+msgid "exit - (same as quit) exit debugger."
+msgstr "exit - （与 quit 相同）退出调试器。"
+
+#: command.y:849
+msgid "finish - execute until selected stack frame returns."
+msgstr "finish - 执行到选定的栈层结束。"
+
+#: command.y:851
+msgid "frame [N] - select and print stack frame number N."
+msgstr "frame [N] - 选定并显示栈的第 N 层。"
+
+#: command.y:853
+msgid "help [command] - print list of commands or explanation of command."
+msgstr "help [命令] - 显示命令列表，或有关命令的说明。"
+
+#: command.y:855
+msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+msgstr "ignore N 次数 - 设置忽略断点 N 的次数。"
+
+#: command.y:857
+msgid ""
+"info topic - source|sources|variables|functions|break|frame|args|locals|"
+"display|watch."
+msgstr ""
+"info 主题 - 查看 info 信息，主题可以为 source|sources|variables|functions|"
+"break|frame|args|locals|display|watch。"
+
+#: command.y:859
+msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+msgstr "list [-|+|[文件名:]行号|函数|范围] - 列出指定行。"
+
+#: command.y:861
+msgid "next [COUNT] - step program, proceeding through subroutine calls."
+msgstr "next [次数] - 单步运行程序，并且步过子调用。"
+
+#: command.y:863
+msgid ""
+"nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+msgstr "nexti [次数] - 单运行一步指令，但步过其子调用。"
+
+#: command.y:865
+msgid "option [name[=value]] - set or display debugger option(s)."
+msgstr "option [名称[=值]] - 设置或显示调试器选项。"
+
+#: command.y:867
+msgid "print var [var] - print value of a variable or array."
+msgstr "print var [变量] - 显示变量或数组的值"
+
+#: command.y:869
+msgid "printf format, [arg], ... - formatted output."
+msgstr "printf 格式, [参数], ... - 格式化输出。"
+
+#: command.y:871
+msgid "quit - exit debugger."
+msgstr "quit - 退出调试器。"
+
+#: command.y:873
+msgid "return [value] - make selected stack frame return to its caller."
+msgstr "return [值] - 使选定的栈层返回到上层调用。"
+
+#: command.y:875
+msgid "run - start or restart executing program."
+msgstr "run - 开始或重新开始程序。"
+
+#: command.y:878
+msgid "save filename - save commands from the session to file."
+msgstr "save 文件名 - 保存会话中的命令到文件。"
+
+#: command.y:881
+msgid "set var = value - assign value to a scalar variable."
+msgstr "set 变量 = 值 - 给标量变量赋值。"
+
+#: command.y:883
+msgid ""
+"silent - suspends usual message when stopped at a breakpoint/watchpoint."
+msgstr "silent - 在断点/监视点处中断时，隐藏常规消息。"
+
+#: command.y:885
+msgid "source file - execute commands from file."
+msgstr "source 文件 - 执行指定文件中的命令。"
+
+#: command.y:887
+msgid "step [COUNT] - step program until it reaches a different source line."
+msgstr "set [次数] - 单步执行程序，在源文件中的下一行处暂停。"
+
+#: command.y:889
+msgid "stepi [COUNT] - step one instruction exactly."
+msgstr "stepi [次数] - 执行一步指令。"
+
+#: command.y:891
+msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+msgstr "tbreak [[文件名:]N|函数] - 设置一个临时断点。"
+
+#: command.y:893
+msgid "trace on|off - print instruction before executing."
+msgstr "trace on|off - 执行前显示指令。"
+
+#: command.y:895
+msgid "undisplay [N] - remove variable(s) from automatic display list."
+msgstr "undisplay [N] - 从自动显示列表中移除指定变量。"
+
+#: command.y:897
+msgid ""
+"until [[filename:]N|function] - execute until program reaches a different "
+"line or line N within current frame."
+msgstr "until [[文件名:]N|函数] - 在当前层中执行，在下一行或第 N 行处暂停。"
+
+#: command.y:899
+msgid "unwatch [N] - remove variable(s) from watch list."
+msgstr "unwatch [N] - 从监视列表中移除变量。"
+
+#: command.y:901
+msgid "up [N] - move N frames up the stack."
+msgstr "up [N] - 在栈中向上移动 N 层。"
+
+#: command.y:903
+msgid "watch var - set a watchpoint for a variable."
+msgstr "watch 变量 - 为变量设置监视点。"
+
+#: command.y:905
+msgid ""
+"where [N] - (same as backtrace) print trace of all or N innermost (outermost "
+"if N < 0) frames."
+msgstr ""
+"where [N] - (与backtrace相同) 显示所有或最近 N 层 (若 N < 0，则显示最远 N "
+"层) 调用。"
+
+#: command.y:1016 debug.c:414 gawkapi.c:259 msg.c:146
+#, c-format
+msgid "error: "
+msgstr "错误："
+
+#: command.y:1060
+#, c-format
+msgid "can't read command (%s)\n"
+msgstr "无法读取命令 (%s)\n"
+
+#: command.y:1074
+#, c-format
+msgid "can't read command (%s)"
+msgstr "无法读取命令 (%s)"
+
+#: command.y:1125
+msgid "invalid character in command"
+msgstr "命令中有无效的字符"
+
+#: command.y:1161
+#, c-format
+msgid "unknown command - \"%.*s\", try help"
+msgstr "未知命令 - \"%.*s\"，请查看帮助"
+
+#: command.y:1231
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: command.y:1293
+msgid "invalid character"
+msgstr "字符无效"
+
+#: command.y:1497
+#, c-format
+msgid "undefined command: %s\n"
+msgstr "变量未定义：%s\n"
+
+#: debug.c:257
+msgid "set or show the number of lines to keep in history file."
+msgstr "设置或显示需要保存在历史文件中的行的编号。"
+
+#: debug.c:259
+msgid "set or show the list command window size."
+msgstr "设置或显示列表式命令窗口大小。"
+
+#: debug.c:261
+msgid "set or show gawk output file."
+msgstr "设置或显示 gawk 输出文件。"
+
+#: debug.c:263
+msgid "set or show debugger prompt."
+msgstr "设置或显示调试器提示。"
+
+#: debug.c:265
+msgid "(un)set or show saving of command history (value=on|off)."
+msgstr "(取消)设置或显示保存的命令历史 (值=on|off)。"
+
+#: debug.c:267
+msgid "(un)set or show saving of options (value=on|off)."
+msgstr "(取消)设置或显示保存的选项 (值=on|off)。"
+
+#: debug.c:269
+msgid "(un)set or show instruction tracing (value=on|off)."
+msgstr "(取消)设置或显示指令跟踪 (值=on|off)。"
+
+#: debug.c:358
+msgid "program not running."
+msgstr "程序未运行。"
+
+#: debug.c:461 debug.c:619
+#, c-format
+msgid "can't read source file `%s' (%s)"
+msgstr "无法读取源文件“%s”(%s)"
+
+#: debug.c:466
+#, c-format
+msgid "source file `%s' is empty.\n"
+msgstr "源文件“%s”为空。\n"
+
+#: debug.c:493
+msgid "no current source file."
+msgstr "当前没有源文件。"
+
+#: debug.c:518
+#, c-format
+msgid "cannot find source file named `%s' (%s)"
+msgstr "无法找到名为“%s”的源文件 (%s)"
+
+#: debug.c:542
+#, c-format
+msgid "WARNING: source file `%s' modified since program compilation.\n"
+msgstr "警告：源文件“%s”在程序编译之后被修改。\n"
+
+#: debug.c:564
+#, c-format
+msgid "line number %d out of range; `%s' has %d lines"
+msgstr "行号 %d 超出范围；“%s” 只有 %d 行"
+
+#: debug.c:624
+#, c-format
+msgid "unexpected eof while reading file `%s', line %d"
+msgstr "未读取文件“%s”遇到 EOF，于第 %d 行"
+
+#: debug.c:633
+#, c-format
+msgid "source file `%s' modified since start of program execution"
+msgstr "源文件“%s”在程序执行之后被修改。"
+
+#: debug.c:745
+#, c-format
+msgid "Current source file: %s\n"
+msgstr "当前源文件： %s\n"
+
+#: debug.c:746
+#, c-format
+msgid "Number of lines: %d\n"
+msgstr "行编号：%d\n"
+
+#: debug.c:753
+#, c-format
+msgid "Source file (lines): %s (%d)\n"
+msgstr "源文件 (行)：%s (%d)\n"
+
+#: debug.c:767
+msgid ""
+"Number  Disp  Enabled  Location\n"
+"\n"
+msgstr ""
+"编号        显示   启用         位置\n"
+"\n"
+
+#: debug.c:778
+#, c-format
+msgid "\tno of hits = %ld\n"
+msgstr "\t命中次数 = %ld\n"
+
+#: debug.c:780
+#, c-format
+msgid "\tignore next %ld hit(s)\n"
+msgstr "\t忽略后续 %ld 次命中\n"
+
+#: debug.c:782 debug.c:922
+#, c-format
+msgid "\tstop condition: %s\n"
+msgstr "\t停止条件：%s\n"
+
+#: debug.c:784 debug.c:924
+msgid "\tcommands:\n"
+msgstr "\t命令：\n"
+
+#: debug.c:806
+#, c-format
+msgid "Current frame: "
+msgstr "当前层："
+
+#: debug.c:809
+#, c-format
+msgid "Called by frame: "
+msgstr "调用层："
+
+#: debug.c:813
+#, c-format
+msgid "Caller of frame: "
+msgstr "调用者："
+
+#: debug.c:831
+#, c-format
+msgid "None in main().\n"
+msgstr "不在 main() 中。\n"
+
+#: debug.c:861
+msgid "No arguments.\n"
+msgstr "没有参数。\n"
+
+#: debug.c:862
+msgid "No locals.\n"
+msgstr "没有本地变量。\n"
+
+#: debug.c:870
+msgid ""
+"All defined variables:\n"
+"\n"
+msgstr ""
+"所有已定义的变量：\n"
+"\n"
+
+#: debug.c:880
+msgid ""
+"All defined functions:\n"
+"\n"
+msgstr ""
+"所有已定义的函数：\n"
+"\n"
+
+#: debug.c:899
+msgid ""
+"Auto-display variables:\n"
+"\n"
+msgstr ""
+"自动显示变量：\n"
+"\n"
+
+#: debug.c:902
+msgid ""
+"Watch variables:\n"
+"\n"
+msgstr ""
+"监视变量：\n"
+"\n"
+
+#: debug.c:1042
+#, c-format
+msgid "no symbol `%s' in current context\n"
+msgstr "当前上下文中找不到符号“%s”\n"
+
+#: debug.c:1054 debug.c:1442
+#, c-format
+msgid "`%s' is not an array\n"
+msgstr "“%s”不是一个数组\n"
+
+#: debug.c:1068
+#, c-format
+msgid "$%ld = uninitialized field\n"
+msgstr "$%ld = 未初始化的字段\n"
+
+#: debug.c:1089
+#, c-format
+msgid "array `%s' is empty\n"
+msgstr "数组“%s”为空\n"
+
+#: debug.c:1132 debug.c:1184
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'\n"
+msgstr "[\"%.*s\"] 不在数组“%s”中\n"
+
+#: debug.c:1188
+#, c-format
+msgid "`%s[\"%.*s\"]' is not an array\n"
+msgstr "“%s[\"%.*s\"]”不是数组\n"
+
+#: debug.c:1249 debug.c:5103
+#, c-format
+msgid "`%s' is not a scalar variable"
+msgstr "“%s”不是标量"
+
+#: debug.c:1272 debug.c:5133
+#, c-format
+msgid "attempt to use array `%s[\"%.*s\"]' in a scalar context"
+msgstr "试图在标量环境中使用数组“%s[\"%.*s\"]”"
+
+#: debug.c:1295 debug.c:5144
+#, c-format
+msgid "attempt to use scalar `%s[\"%.*s\"]' as array"
+msgstr "试图把标量“%s[\"%.*s\"]”当数组使用"
+
+#: debug.c:1438
+#, c-format
+msgid "`%s' is a function"
+msgstr "“%s”是一个函数"
+
+#: debug.c:1480
+#, c-format
+msgid "watchpoint %d is unconditional\n"
+msgstr "断点 %d 为无条件断点\n"
+
+#: debug.c:1514
+#, c-format
+msgid "No display item numbered %ld"
+msgstr "没有编号为 %ld 的显示项目"
+
+#: debug.c:1517
+#, c-format
+msgid "No watch item numbered %ld"
+msgstr "没有编号为 %ld 的监视项目"
+
+#: debug.c:1543
+#, c-format
+msgid "%d: [\"%.*s\"] not in array `%s'\n"
+msgstr "%d：[\"%.*s\"] 不在数组“%s”中\n"
+
+#: debug.c:1782
+msgid "attempt to use scalar value as array"
+msgstr "试图把标量当数组使用"
+
+#: debug.c:1873
+#, c-format
+msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+msgstr "断点 %d 已被删除，因为参数超出范围。\n"
+
+#: debug.c:1884
+#, c-format
+msgid "Display %d deleted because parameter is out of scope.\n"
+msgstr "显示 %d 已被删除，因为参数超出范围。\n"
+
+#: debug.c:1917
+#, c-format
+msgid " in file `%s', line %d\n"
+msgstr "于文件“%s”，第 %d 行\n"
+
+#: debug.c:1938
+#, c-format
+msgid " at `%s':%d"
+msgstr "于“%s”:%d"
+
+#: debug.c:1954 debug.c:2017
+#, c-format
+msgid "#%ld\tin "
+msgstr "#%ld\t于 "
+
+#: debug.c:1991
+#, c-format
+msgid "More stack frames follow ...\n"
+msgstr "更多栈层 ...\n"
+
+#: debug.c:2034
+msgid "invalid frame number"
+msgstr "层数无效"
+
+#: debug.c:2217
+#, c-format
+msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+msgstr "注意：断点 %d (已启用，忽略后续 %ld 次命中)，也设置于 %s:%d"
+
+#: debug.c:2224
+#, c-format
+msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+msgstr "注意：断点 %d (已启用)，也设置于 %s:%d"
+
+#: debug.c:2231
+#, c-format
+msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at %s:%d"
+msgstr "注意：断点 %d (已禁用，忽略后续 %ld 次命中)，也在 %s:%d 处设置"
+
+#: debug.c:2238
+#, c-format
+msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+msgstr "注意：断点 %d (已禁用)，也设置于 %s:%d"
+
+#: debug.c:2255
+#, c-format
+msgid "Breakpoint %d set at file `%s', line %d\n"
+msgstr "断点 %d 设置于文件“%s”，第 %d 行\n"
+
+#: debug.c:2357
+#, c-format
+msgid "Can't set breakpoint in file `%s'\n"
+msgstr "无法在文件“%s”中设置断点\n"
+
+#: debug.c:2386 debug.c:2509 debug.c:3367
+#, c-format
+msgid "line number %d in file `%s' out of range"
+msgstr "文件“%2$s”中的行号 %1$d 超出范围"
+
+#: debug.c:2390
+#, c-format
+msgid "Can't find rule!!!\n"
+msgstr "无法找到规则！\n"
+
+#: debug.c:2392
+#, c-format
+msgid "Can't set breakpoint at `%s':%d\n"
+msgstr "无法设置断点于“%s”:%d\n"
+
+#: debug.c:2404
+#, c-format
+msgid "Can't set breakpoint in function `%s'\n"
+msgstr "无法在函数“%s”中设置断点\n"
+
+#: debug.c:2420
+#, c-format
+msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+msgstr "设置于文件“%2$s”，第 %1$d 行的断点 %3$d 为无条件断点\n"
+
+#: debug.c:2525 debug.c:2547
+#, c-format
+msgid "Deleted breakpoint %d"
+msgstr "已删除断点 %d"
+
+#: debug.c:2531
+#, c-format
+msgid "No breakpoint(s) at entry to function `%s'\n"
+msgstr "函数“%s”入口处无断点\n"
+
+#: debug.c:2558
+#, c-format
+msgid "No breakpoint at file `%s', line #%d\n"
+msgstr "文件“%s”第 #%d 行处无断点\n"
+
+#: debug.c:2613 debug.c:2654 debug.c:2674 debug.c:2717
+msgid "invalid breakpoint number"
+msgstr "断点编号无效"
+
+#: debug.c:2629
+msgid "Delete all breakpoints? (y or n) "
+msgstr "删除所有断点吗？(y or n) "
+
+#: debug.c:2630 debug.c:2940 debug.c:2993
+msgid "y"
+msgstr "y"
+
+#: debug.c:2679
+#, c-format
+msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+msgstr "将忽略后续 %ld 次命中断点 %d。\n"
+
+#: debug.c:2683
+#, c-format
+msgid "Will stop next time breakpoint %d is reached.\n"
+msgstr "以后命中断点 %d 时将会停止。\n"
+
+#: debug.c:2800
+#, c-format
+msgid "Can only debug programs provided with the `-f' option.\n"
+msgstr "只能调试使用了“-f”选项的程序。\n"
+
+#: debug.c:2925
+#, c-format
+msgid "Failed to restart debugger"
+msgstr "重启调试器失败"
+
+#: debug.c:2939
+msgid "Program already running. Restart from beginning (y/n)? "
+msgstr "程序已经在运行了。重新开始运行吗？(y/n) "
+
+#: debug.c:2943
+#, c-format
+msgid "Program not restarted\n"
+msgstr "程序未重新运行\n"
+
+#: debug.c:2953
+#, c-format
+msgid "error: cannot restart, operation not allowed\n"
+msgstr "错误：无法重新运行，不允许该操作\n"
+
+#: debug.c:2959
+#, c-format
+msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+msgstr "错误 (%s)：无法重新运行，忽略剩余命令\n"
+
+#: debug.c:2967
+#, c-format
+msgid "Starting program: \n"
+msgstr "开始运行程序：\n"
+
+#: debug.c:2977
+#, c-format
+msgid "Program exited abnormally with exit value: %d\n"
+msgstr "程序异常退出，状态码：%d\n"
+
+#: debug.c:2978
+#, c-format
+msgid "Program exited normally with exit value: %d\n"
+msgstr "程序正常退出，状态码：%d\n"
+
+#: debug.c:2992
+msgid "The program is running. Exit anyway (y/n)? "
+msgstr "程序已经在运行了。仍然要退出吗？(y/n) "
+
+#: debug.c:3027
+#, c-format
+msgid "Not stopped at any breakpoint; argument ignored.\n"
+msgstr "未在断点处停止；已忽略参数。\n"
+
+#: debug.c:3032
+#, c-format
+msgid "invalid breakpoint number %d."
+msgstr "断点编号 %d 无效。"
+
+#: debug.c:3037
+#, c-format
+msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+msgstr "将忽略后续 %ld 次命中断点 %d。\n"
+
+#: debug.c:3224
+#, c-format
+msgid "'finish' not meaningful in the outermost frame main()\n"
+msgstr "“finish”对于最外层的 main() 来说无意义\n"
+
+#: debug.c:3229
+#, c-format
+msgid "Run till return from "
+msgstr "运行直到返回自 "
+
+#: debug.c:3272
+#, c-format
+msgid "'return' not meaningful in the outermost frame main()\n"
+msgstr "“return”对于最外层的 main() 来说无意义\n"
+
+#: debug.c:3386
+#, c-format
+msgid "Can't find specified location in function `%s'\n"
+msgstr "找不到函数“%s”中的指定位置\n"
+
+#: debug.c:3394
+#, c-format
+msgid "invalid source line %d in file `%s'"
+msgstr "源代码行号“%d”对于文件“%s”来说无效"
+
+#: debug.c:3409
+#, c-format
+msgid "Can't find specified location %d in file `%s'\n"
+msgstr "找不到文件“%2$s”中的指定位置 %1$d\n"
+
+#: debug.c:3441
+#, c-format
+msgid "element not in array\n"
+msgstr "元素不在数组中\n"
+
+#: debug.c:3441
+#, c-format
+msgid "untyped variable\n"
+msgstr "无类型变量\n"
+
+#: debug.c:3483
+#, c-format
+msgid "Stopping in %s ...\n"
+msgstr "停止于 %s ...\n"
+
+#: debug.c:3560
+#, c-format
+msgid "'finish' not meaningful with non-local jump '%s'\n"
+msgstr "“finish”对于非本地跳转“%s”来说无效\n"
+
+#: debug.c:3567
+#, c-format
+msgid "'until' not meaningful with non-local jump '%s'\n"
+msgstr "“until”对于非本地跳转“%s”来说无效\n"
+
+#: debug.c:4323
+msgid "\t------[Enter] to continue or q [Enter] to quit------"
+msgstr "\t------ 按 [Enter] 继续，按 q [Enter] 退出 ------"
+
+#: debug.c:4324
+msgid "q"
+msgstr "q"
+
+#: debug.c:5140
+#, c-format
+msgid "[\"%.*s\"] not in array `%s'"
+msgstr "[\"%.*s\"] 不在数组“%s”中"
+
+#: debug.c:5346
+#, c-format
+msgid "sending output to stdout\n"
+msgstr "输出到标准输出\n"
+
+#: debug.c:5386
+msgid "invalid number"
+msgstr "编号无效"
+
+#: debug.c:5520
+#, c-format
+msgid "`%s' not allowed in current context; statement ignored"
+msgstr "当前上下文中不允许“%s”；语句已忽略"
+
+#: debug.c:5528
+msgid "`return' not allowed in current context; statement ignored"
+msgstr "当前上下文中不允许“%s”；语句已忽略"
+
+#: debug.c:5743
+#, c-format
+msgid "No symbol `%s' in current context"
+msgstr "当前上下文中找不到符号“%s”"
+
+#: eval.c:401
+#, c-format
+msgid "unknown nodetype %d"
+msgstr "未知的结点类型 %d"
+
+#: eval.c:412 eval.c:428
+#, c-format
+msgid "unknown opcode %d"
+msgstr "未知的操作码 %d"
+
+#: eval.c:425
+#, c-format
+msgid "opcode %s not an operator or keyword"
+msgstr "操作码 %s 不是操作符或关键字"
+
+#: eval.c:483
+msgid "buffer overflow in genflags2str"
+msgstr "genflags2str 时缓冲区溢出"
+
+#: eval.c:685
+#, c-format
+msgid ""
+"\n"
+"\t# Function Call Stack:\n"
+"\n"
+msgstr ""
+"\n"
+"\t# 函数调用栈:\n"
+"\n"
+
+#: eval.c:711
+msgid "`IGNORECASE' is a gawk extension"
+msgstr "“IGNORECASE”是 gawk 扩展"
+
+#: eval.c:732
+msgid "`BINMODE' is a gawk extension"
+msgstr "“BINMODE”是 gawk 扩展"
+
+#: eval.c:789
+#, c-format
+msgid "BINMODE value `%s' is invalid, treated as 3"
+msgstr "BINMODE 值 “%s” 非法，按 3 处理"
+
+#: eval.c:912
+#, c-format
+msgid "bad `%sFMT' specification `%s'"
+msgstr "错误的“%sFMT”实现“%s”"
+
+#: eval.c:982
+msgid "turning off `--lint' due to assignment to `LINT'"
+msgstr "由于对“LINT”赋值所以关闭“--lint”"
+
+#: eval.c:1176
+#, c-format
+msgid "reference to uninitialized argument `%s'"
+msgstr "引用未初始化的参数“%s”"
+
+#: eval.c:1177
+#, c-format
+msgid "reference to uninitialized variable `%s'"
+msgstr "引用未初始化的变量“%s”"
+
+#: eval.c:1195
+msgid "attempt to field reference from non-numeric value"
+msgstr "试图从非数值引用字段编号"
+
+#: eval.c:1197
+msgid "attempt to field reference from null string"
+msgstr "试图从空字符串引用字段编号"
+
+#: eval.c:1205
+#, c-format
+msgid "attempt to access field %ld"
+msgstr "试图访问字段 %ld"
+
+#: eval.c:1214
+#, c-format
+msgid "reference to uninitialized field `$%ld'"
+msgstr "引用未初始化的字段“$%ld”"
+
+#: eval.c:1278
+#, c-format
+msgid "function `%s' called with more arguments than declared"
+msgstr "函数“%s”被调用时提供了比声明时更多的参数"
+
+#: eval.c:1475
+#, c-format
+msgid "unwind_stack: unexpected type `%s'"
+msgstr "unwind_stack：未预期的类型“%s”"
+
+#: eval.c:1568
+msgid "division by zero attempted in `/='"
+msgstr "在“/=”中试图除0"
+
+#: eval.c:1575
+#, c-format
+msgid "division by zero attempted in `%%='"
+msgstr "在“%%=”中试图除0"
+
+#: ext.c:51
+msgid "extensions are not allowed in sandbox mode"
+msgstr "沙箱模式中不允许使用扩展"
+
+#: ext.c:54
+msgid "-l / @load are gawk extensions"
+msgstr "-l / @load 是 gawk 扩展"
+
+#: ext.c:57
+msgid "load_ext: received NULL lib_name"
+msgstr "load_ext：收到空 lib_name"
+
+#: ext.c:60
+#, c-format
+msgid "load_ext: cannot open library `%s' (%s)"
+msgstr "load_ext：无法打开库“%s”(%s)"
+
+#: ext.c:66
+#, c-format
+msgid "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+msgstr "load_ext：库“%s”：未定义“plugin_is_GPL_compatible”(%s)"
+
+#: ext.c:72
+#, c-format
+msgid "load_ext: library `%s': cannot call function `%s' (%s)"
+msgstr "load_ext：库“%s”：无法调用函数“%s”(%s)"
+
+#: ext.c:76
+#, c-format
+msgid "load_ext: library `%s' initialization routine `%s' failed"
+msgstr "load_ext：库”%s“初始化程序”%s“失败"
+
+#: ext.c:92
+msgid "make_builtin: missing function name"
+msgstr "make_builtin：缺少函数名"
+
+#: ext.c:100 ext.c:111
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as function name"
+msgstr "make_builtin：无法使用 gawk 内置的 “%s” 作为函数名"
+
+#: ext.c:109
+#, c-format
+msgid "make_builtin: can't use gawk built-in `%s' as namespace name"
+msgstr "make_builtin：无法使用 gawk 内置的 “%s” 作为命名空间"
+
+#: ext.c:126
+#, c-format
+msgid "make_builtin: can't redefine function `%s'"
+msgstr "make_builtin：无法重定义函数“%s”"
+
+#: ext.c:130
+#, c-format
+msgid "make_builtin: function `%s' already defined"
+msgstr "make_builtin：函数“%s”已经被定义"
+
+#: ext.c:134
+#, c-format
+msgid "make_builtin: function name `%s' previously defined"
+msgstr "make_builtin：函数名“%s”前面已被定义"
+
+#: ext.c:138
+#, c-format
+msgid "make_builtin: negative argument count for function `%s'"
+msgstr "make_builtin：函数”%s“参数个数为负值"
+
+#: ext.c:214
+#, c-format
+msgid "function `%s': argument #%d: attempt to use scalar as an array"
+msgstr "函数“%s”：第 %d 个参数：试图把标量当作数组使用"
+
+#: ext.c:218
+#, c-format
+msgid "function `%s': argument #%d: attempt to use array as a scalar"
+msgstr "函数“%s”：第 %d 个参数：试图把数组当标量使用"
+
+#: ext.c:232
+#, fuzzy
+msgid "dynamic loading of libraries is not supported"
+msgstr "不支持动态加载库"
+
+#: extension/filefuncs.c:442
+#, c-format
+msgid "stat: unable to read symbolic link `%s'"
+msgstr "stat：无法读取符号链接”%s“"
+
+#: extension/filefuncs.c:476 extension/filefuncs.c:520
+msgid "stat: bad parameters"
+msgstr "stat：参数有误"
+
+#: extension/filefuncs.c:585
+#, c-format
+msgid "fts init: could not create variable %s"
+msgstr "fts init：无法创建变量 %s"
+
+#: extension/filefuncs.c:606
+msgid "fts is not supported on this system"
+msgstr "该系统不支持 fts"
+
+#: extension/filefuncs.c:625
+msgid "fill_stat_element: could not create array"
+msgstr "fill_stat_element：无法创建数组"
+
+#: extension/filefuncs.c:634
+msgid "fill_stat_element: could not set element"
+msgstr "fill_stat_element：无法设置元素"
+
+#: extension/filefuncs.c:649
+msgid "fill_path_element: could not set element"
+msgstr "fill_path_element：无法设置元素"
+
+#: extension/filefuncs.c:665
+msgid "fill_error_element: could not set element"
+msgstr "fill_error_element：无法设置元素"
+
+#: extension/filefuncs.c:717 extension/filefuncs.c:764
+msgid "fts-process: could not create array"
+msgstr "fts-process：无法创建数组"
+
+#: extension/filefuncs.c:727 extension/filefuncs.c:774
+#: extension/filefuncs.c:792
+msgid "fts-process: could not set element"
+msgstr "fts-process：无法设置元素"
+
+#: extension/filefuncs.c:841
+msgid "fts: called with incorrect number of arguments, expecting 3"
+msgstr "fts：调用时的参数个数有误，应为 3 个"
+
+#: extension/filefuncs.c:844
+msgid "fts: bad first parameter"
+msgstr "fts：第一个参数有误"
+
+#: extension/filefuncs.c:850
+msgid "fts: bad second parameter"
+msgstr "fts：第二个参数有误"
+
+#: extension/filefuncs.c:856
+msgid "fts: bad third parameter"
+msgstr "fts：第三个参数有误"
+
+#: extension/filefuncs.c:863
+msgid "fts: could not flatten array\n"
+msgstr "fts：无法展开数组\n"
+
+#: extension/filefuncs.c:881
+msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+msgstr "fts：忽略猥琐的 FTS_NOSTAT 标志。嘿嘿嘿。"
+
+#: extension/filefuncs.c:897
+msgid "fts: clear_array() failed\n"
+msgstr "fts：clear_array() 失败\n"
+
+#: extension/fnmatch.c:120
+msgid "fnmatch: could not get first argument"
+msgstr "fnmatch：无法获取第一个参数"
+
+#: extension/fnmatch.c:125
+msgid "fnmatch: could not get second argument"
+msgstr "fnmatch：无法获取第二个参数"
+
+#: extension/fnmatch.c:130
+msgid "fnmatch: could not get third argument"
+msgstr "fnmatch：无法获取第三个参数"
+
+#: extension/fnmatch.c:143
+msgid "fnmatch is not implemented on this system\n"
+msgstr "该系统未实现 fnmatch\n"
+
+#: extension/fnmatch.c:175
+msgid "fnmatch init: could not add FNM_NOMATCH variable"
+msgstr "fnmatch init：无法添加 FNM_NOMATCH 变量"
+
+#: extension/fnmatch.c:185
+#, c-format
+msgid "fnmatch init: could not set array element %s"
+msgstr "nmatch init：无法设置数组元素 %s"
+
+#: extension/fnmatch.c:195
+msgid "fnmatch init: could not install FNM array"
+msgstr "fnmatch init：无法设置 FNM 数组"
+
+#: extension/fork.c:92
+msgid "fork: PROCINFO is not an array!"
+msgstr "fork：PROCINFO 不是数组"
+
+#: extension/inplace.c:131
+msgid "inplace::begin: in-place editing already active"
+msgstr "inplace::begin：已启用原位编辑"
+
+#: extension/inplace.c:134
+#, c-format
+msgid "inplace::begin: expects 2 arguments but called with %d"
+msgstr "inplace::begin：需要 2 个参数，但调用时传递了 %d 个"
+
+#: extension/inplace.c:137
+msgid "inplace::begin: cannot retrieve 1st argument as a string filename"
+msgstr "inplace::begin：无法将第 1 个参数作为文件名字符串处理"
+
+#: extension/inplace.c:145
+#, c-format
+msgid "inplace::begin: disabling in-place editing for invalid FILENAME `%s'"
+msgstr "inplace::begin：对于无效的文件名“%s”禁用原位编辑"
+
+#: extension/inplace.c:152
+#, c-format
+msgid "inplace::begin: Cannot stat `%s' (%s)"
+msgstr "inplace::begin：无法对“%s”执行 stat (%s)"
+
+#: extension/inplace.c:159
+#, c-format
+msgid "inplace::begin: `%s' is not a regular file"
+msgstr "ininplace::begin：“%s”不是普通文件"
+
+#: extension/inplace.c:170
+#, c-format
+msgid "inplace::begin: mkstemp(`%s') failed (%s)"
+msgstr "inplace::begin：mkstemp(“%s”) 失败 (%s)"
+
+#: extension/inplace.c:182
+#, c-format
+msgid "inplace::begin: chmod failed (%s)"
+msgstr "inplace::begin：chmod 失败 (%s)"
+
+#: extension/inplace.c:189
+#, c-format
+msgid "inplace::begin: dup(stdout) failed (%s)"
+msgstr "inplace::begin：dup(stdout) 失败 (%s)"
+
+#: extension/inplace.c:192
+#, c-format
+msgid "inplace::begin: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::begin：dup2(%d, stdout) 失败 (%s)"
+
+#: extension/inplace.c:195
+#, c-format
+msgid "inplace::begin: close(%d) failed (%s)"
+msgstr "inplace::begin：close(%d) 失败 (%s)"
+
+#: extension/inplace.c:211
+#, c-format
+msgid "inplace::end: expects 2 arguments but called with %d"
+msgstr "inplace::end：需要 2 个参数，但调用时传递了 %d 个"
+
+#: extension/inplace.c:214
+msgid "inplace::end: cannot retrieve 1st argument as a string filename"
+msgstr "inplace::end：无法将第 1 个参数作为文件名字符串处理"
+
+#: extension/inplace.c:221
+msgid "inplace::end: in-place editing not active"
+msgstr "inplace::end：原位编辑未启用"
+
+#: extension/inplace.c:227
+#, c-format
+msgid "inplace::end: dup2(%d, stdout) failed (%s)"
+msgstr "inplace::end：dup2(%d, stdout) 失败 (%s)"
+
+#: extension/inplace.c:230
+#, c-format
+msgid "inplace::end: close(%d) failed (%s)"
+msgstr "inplace::end：close(%d) 失败 (%s)"
+
+#: extension/inplace.c:234
+#, c-format
+msgid "inplace::end: fsetpos(stdout) failed (%s)"
+msgstr "inplace::end：fsetpos(stdout) 失败 (%s)"
+
+#: extension/inplace.c:247
+#, c-format
+msgid "inplace::end: link(`%s', `%s') failed (%s)"
+msgstr "inplace::end：link(“%s”, “%s”) 失败 (%s)"
+
+#: extension/inplace.c:257
+#, c-format
+msgid "inplace::end: rename(`%s', `%s') failed (%s)"
+msgstr "inplace::end：rename(“%s”, “%s”) 失败 (%s)"
+
+#: extension/ordchr.c:72
+msgid "ord: called with inappropriate argument(s)"
+msgstr "ord：参数有误"
+
+#: extension/ordchr.c:99
+msgid "chr: called with inappropriate argument(s)"
+msgstr "chr：参数有误"
+
+#: extension/readdir.c:273
+#, c-format
+msgid "dir_take_control_of: opendir/fdopendir failed: %s"
+msgstr "dir_take_control_of：opendir/fdopendir 失败：%s"
+
+#: extension/readfile.c:131
+msgid "readfile: called with wrong kind of argument"
+msgstr "readfile：参数类型错误"
+
+#: extension/revoutput.c:127
+msgid "revoutput: could not initialize REVOUT variable"
+msgstr "revoutput：无法初始化 REVOUT 变量"
+
+#: extension/rwarray.c:119 extension/rwarray0.c:114
+#, c-format
+msgid "do_writea: argument 0 is not a string\n"
+msgstr "do_writea：参数 0 不是字符串\n"
+
+#: extension/rwarray.c:125 extension/rwarray0.c:120
+#, c-format
+msgid "do_writea: argument 1 is not an array\n"
+msgstr "do_writea：参数 1 不是数组\n"
+
+#: extension/rwarray.c:172 extension/rwarray0.c:167
+#, c-format
+msgid "write_array: could not flatten array\n"
+msgstr "write_array：无法展开数组\n"
+
+#: extension/rwarray.c:188 extension/rwarray0.c:181
+#, c-format
+msgid "write_array: could not release flattened array\n"
+msgstr "write_array：无法释放展开的数组\n"
+
+#: extension/rwarray.c:255
+#, c-format
+msgid "array value has unknown type %d"
+msgstr "数组的值的类型未知：%d"
+
+#: extension/rwarray.c:292 extension/rwarray0.c:267
+#, c-format
+msgid "do_reada: argument 0 is not a string\n"
+msgstr "do_reada：参数 0 不是字符串\n"
+
+#: extension/rwarray.c:298 extension/rwarray0.c:273
+#, c-format
+msgid "do_reada: argument 1 is not an array\n"
+msgstr "do_reada：参数 1 不是字数组\n"
+
+#: extension/rwarray.c:342 extension/rwarray0.c:317
+#, c-format
+msgid "do_reada: clear_array failed\n"
+msgstr "do_reada：clear_array 失败\n"
+
+#: extension/rwarray.c:379 extension/rwarray0.c:353
+#, c-format
+msgid "read_array: set_array_element failed\n"
+msgstr "read_array：set_array_element 失败\n"
+
+#: extension/rwarray.c:489
+#, c-format
+msgid "treating recovered value with unknown type code %d as a string"
+msgstr "将未知类型（%d）的恢复值当作字符串来处理"
+
+#: extension/time.c:141
+msgid "gettimeofday: not supported on this platform"
+msgstr "gettimeofday：不被此平台支持"
+
+#: extension/time.c:162
+msgid "sleep: missing required numeric argument"
+msgstr "sleep：缺少所需的数值参数"
+
+#: extension/time.c:168
+msgid "sleep: argument is negative"
+msgstr "sleep：参数为负值"
+
+#: extension/time.c:202
+msgid "sleep: not supported on this platform"
+msgstr "sleep：不被此平台支持"
+
+#: field.c:284
+msgid "input record too large"
+msgstr "输入的记录太长"
+
+#: field.c:398
+msgid "NF set to negative value"
+msgstr "NF 被设置为负值"
+
+#: field.c:403
+msgid "decrementing NF is not portable to many awk versions"
+msgstr "降序 NF 无法被大多数 awk 所兼容"
+
+#: field.c:847
+msgid "accessing fields from an END rule may not be portable"
+msgstr "其他 awk 可能不支持使用 END "
+
+#: field.c:976 field.c:983
+msgid "split: fourth argument is a gawk extension"
+msgstr "split：第四个参数是 gawk 扩展"
+
+#: field.c:980
+msgid "split: fourth argument is not an array"
+msgstr "split：第四个参数不是数组"
+
+#: field.c:990
+msgid "split: second argument is not an array"
+msgstr "split：第二个参数不是数组"
+
+#: field.c:994
+msgid "split: cannot use the same array for second and fourth args"
+msgstr "split：无法将同一个数组用于第二和第四个参数"
+
+#: field.c:999
+msgid "split: cannot use a subarray of second arg for fourth arg"
+msgstr "split：无法将第二个参数的子数组用于第四个参数"
+
+#: field.c:1002
+msgid "split: cannot use a subarray of fourth arg for second arg"
+msgstr "split：无法将第四个参数的子数组用于第二个参数"
+
+#: field.c:1036
+msgid "split: null string for third arg is a non-standard extension"
+msgstr "split：第三个参数为空字符串：其他 awk 可能不支持这一特性"
+
+#: field.c:1073
+msgid "patsplit: fourth argument is not an array"
+msgstr "patsplit：第四个参数不是数组"
+
+#: field.c:1078
+msgid "patsplit: second argument is not an array"
+msgstr "patsplit：第二个参数不是数组"
+
+#: field.c:1087
+msgid "patsplit: third argument must be non-null"
+msgstr "patsplit：第三个参数必须不为空"
+
+#: field.c:1091
+msgid "patsplit: cannot use the same array for second and fourth args"
+msgstr "patsplit：无法将同一个数组用于第二和第四个参数"
+
+#: field.c:1096
+msgid "patsplit: cannot use a subarray of second arg for fourth arg"
+msgstr "patsplit：无法将第二个参数的子数组用于第四个参数"
+
+#: field.c:1099
+msgid "patsplit: cannot use a subarray of fourth arg for second arg"
+msgstr "patsplit：无法将第四个参数的子数组用于第二个参数"
+
+#: field.c:1149
+msgid "`FIELDWIDTHS' is a gawk extension"
+msgstr "“FIELDWIDTHS”是 gawk 扩展"
+
+#: field.c:1218
+msgid "`*' must be the last designator in FIELDWIDTHS"
+msgstr "FIELDWIDTHS中的“*”必须位于所有通配符的末尾"
+
+#: field.c:1239
+#, c-format
+msgid "invalid FIELDWIDTHS value, for field %d, near `%s'"
+msgstr "第 %d 字段中的 FIELDWIDTHS 值无效（位于“%s”附近）"
+
+#: field.c:1312
+msgid "null string for `FS' is a gawk extension"
+msgstr "给“FS”传递了空字符串，应为 gawk 扩展"
+
+#: field.c:1316
+msgid "old awk does not support regexps as value of `FS'"
+msgstr "老 awk 不支持把“FS”设置为正则表达式"
+
+#: field.c:1443
+msgid "`FPAT' is a gawk extension"
+msgstr "“FPAT”是 gawk 扩展"
+
+#: gawkapi.c:161
+msgid "awk_value_to_node: received null retval"
+msgstr "awk_value_to_node：返回值为空"
+
+#: gawkapi.c:178 gawkapi.c:189
+msgid "awk_value_to_node: not in MPFR mode"
+msgstr "awk_value_to_node：不在 MPFR 模式中"
+
+#: gawkapi.c:183 gawkapi.c:194
+msgid "awk_value_to_node: MPFR not supported"
+msgstr "awk_value_to_node：不支持 MPFR 模式"
+
+#: gawkapi.c:198
+#, c-format
+msgid "awk_value_to_node: invalid number type `%d'"
+msgstr "awk_value_to_node：数值类型“%d”无效"
+
+#: gawkapi.c:385
+msgid "add_ext_func: received NULL name_space parameter"
+msgstr "add_ext_func：name_space 参数为空"
+
+#: gawkapi.c:523
+#, c-format
+msgid ""
+"node_to_awk_value: detected invalid numeric flags combination `%s'; please "
+"file a bug report."
+msgstr "node_to_awk_value：发现一个无效的选项组合“%s”；请向开发者汇报此错误。"
+
+#: gawkapi.c:551
+msgid "node_to_awk_value: received null node"
+msgstr "node_to_awk_value：结点为空"
+
+#: gawkapi.c:554
+msgid "node_to_awk_value: received null val"
+msgstr "node_to_awk_value：值为空"
+
+#: gawkapi.c:610 gawkapi.c:644 gawkapi.c:671 gawkapi.c:704
+#, c-format
+msgid ""
+"node_to_awk_value detected invalid flags combination `%s'; please file a bug "
+"report."
+msgstr "node_to_awk_value 发现了一个无效的选项组合“%s”；请向开发者汇报此错误。"
+
+#: gawkapi.c:1082
+msgid "remove_element: received null array"
+msgstr "remove_element：数组为空"
+
+#: gawkapi.c:1085
+msgid "remove_element: received null subscript"
+msgstr "remove_element：下标为空"
+
+#: gawkapi.c:1217
+#, c-format
+msgid "api_flatten_array_typed: could not convert index %d to %s"
+msgstr "api_flatten_array_typed：无法将索引 %d 转换为 %s"
+
+#: gawkapi.c:1222
+#, c-format
+msgid "api_flatten_array_typed: could not convert value %d to %s"
+msgstr "api_flatten_array_typed：无法将索引 %d 转换为 %s"
+
+#: gawkapi.c:1318 gawkapi.c:1334
+msgid "api_get_mpfr: MPFR not supported"
+msgstr "api_get_mpfr：不支持 MPFR 模式"
+
+#: gawkapi.c:1365
+msgid "cannot find end of BEGINFILE rule"
+msgstr "找不到 BEGINFILE 规则的结束位置"
+
+#: gawkapi.c:1419
+#, c-format
+msgid "cannot open unrecognized file type `%s' for `%s'"
+msgstr "无法打开未知文件类型（%s）的“%s”"
+
+#: io.c:426
+#, c-format
+msgid "command line argument `%s' is a directory: skipped"
+msgstr "命令行参数“%s”为目录；已跳过"
+
+#: io.c:429 io.c:546
+#, c-format
+msgid "cannot open file `%s' for reading (%s)"
+msgstr "无法以读模式打开文件“%s”(%s)"
+
+#: io.c:675
+#, c-format
+msgid "close of fd %d (`%s') failed (%s)"
+msgstr "关闭文件号 %d (“%s”)失败(%s)"
+
+#: io.c:753
+msgid "redirection not allowed in sandbox mode"
+msgstr "沙箱模式中不允许使用重定向"
+
+#: io.c:787
+#, c-format
+msgid "expression in `%s' redirection is a number"
+msgstr "“%s”重定向中的表达式中只有个数字"
+
+#: io.c:791
+#, c-format
+msgid "expression for `%s' redirection has null string value"
+msgstr "“%s”重定向中的表达式是空字符串"
+
+#: io.c:796
+#, c-format
+msgid ""
+"filename `%.*s' for `%s' redirection may be result of logical expression"
+msgstr "“%3$s”重定向中的文件名“%2$.*1$s”可能是逻辑表达式的结果"
+
+#: io.c:844
+#, c-format
+msgid "unnecessary mixing of `>' and `>>' for file `%.*s'"
+msgstr "在文件“%.*s”中不必要的混合使用“>”和“>>”"
+
+#: io.c:896 io.c:921
+#, c-format
+msgid "get_file cannot create pipe `%s' with fd %d"
+msgstr "get_file 无法创建文件描述符为 %2$d 的管道“%1$s”"
+
+#: io.c:911
+#, c-format
+msgid "can't open pipe `%s' for output (%s)"
+msgstr "无法为输出打开管道“%s”(%s)"
+
+#: io.c:926
+#, c-format
+msgid "can't open pipe `%s' for input (%s)"
+msgstr "无法为输入打开管道“%s”(%s)"
+
+#: io.c:950
+#, c-format
+msgid ""
+"get_file socket creation not supported on this platform for `%s' with fd %d"
+msgstr "此平台不支持使用 get_file 创建文件描述符为 %2$d 的套接字“%1$s”"
+
+#: io.c:961
+#, c-format
+msgid "can't open two way pipe `%s' for input/output (%s)"
+msgstr "无法为输入/输出打开双向管道“%s”(%s)"
+
+#: io.c:1048
+#, c-format
+msgid "can't redirect from `%s' (%s)"
+msgstr "无法自“%s”重定向(%s)"
+
+#: io.c:1051
+#, c-format
+msgid "can't redirect to `%s' (%s)"
+msgstr "无法重定向到“%s”(%s)"
+
+#: io.c:1153
+msgid ""
+"reached system limit for open files: starting to multiplex file descriptors"
+msgstr "打开的文件数达到系统限制：开始复用文件描述符"
+
+#: io.c:1169
+#, c-format
+msgid "close of `%s' failed (%s)."
+msgstr "关闭“%s”失败(%s)。"
+
+#: io.c:1177
+msgid "too many pipes or input files open"
+msgstr "打开过多管道或输入文件"
+
+#: io.c:1203
+msgid "close: second argument must be `to' or `from'"
+msgstr "close：第二个参数必须是“to”或“from”"
+
+#: io.c:1221
+#, c-format
+msgid "close: `%.*s' is not an open file, pipe or co-process"
+msgstr "close：“%.*s”不是一个已打开文件、管道或合作进程"
+
+#: io.c:1226
+msgid "close of redirection that was never opened"
+msgstr "关闭一个从未被打开的重定向"
+
+#: io.c:1325
+#, c-format
+msgid "close: redirection `%s' not opened with `|&', second argument ignored"
+msgstr "close：重定向“%s”不是用“|&”打开，第二个参数被忽略"
+
+#: io.c:1342
+#, c-format
+msgid "failure status (%d) on pipe close of `%s' (%s)"
+msgstr "关闭管道“%2$s”时失败，失败状态为(%1$d)(%3$s)"
+
+#: io.c:1345
+#, c-format
+msgid "failure status (%d) on file close of `%s' (%s)"
+msgstr "关闭文件“%2$s”时失败，失败状态为(%1$d)(%3$s)"
+
+#: io.c:1365
+#, c-format
+msgid "no explicit close of socket `%s' provided"
+msgstr "未显式关闭端口“%s”"
+
+#: io.c:1368
+#, c-format
+msgid "no explicit close of co-process `%s' provided"
+msgstr "未显式关闭合作进程“%s”"
+
+#: io.c:1371
+#, c-format
+msgid "no explicit close of pipe `%s' provided"
+msgstr "未显式关闭管道“%s”"
+
+#: io.c:1374
+#, c-format
+msgid "no explicit close of file `%s' provided"
+msgstr "未显式关闭文件“%s”"
+
+#: io.c:1411
+#, c-format
+msgid "fflush: cannot flush standard output: %s"
+msgstr "fflush：无法刷新输出缓存：%s"
+
+#: io.c:1412
+#, c-format
+msgid "fflush: cannot flush standard error: %s"
+msgstr "fflush：无法刷新错误输出缓存：%s"
+
+#: io.c:1417 io.c:1508 main.c:664 main.c:711
+#, c-format
+msgid "error writing standard output (%s)"
+msgstr "向标准输出写时发生错误 (%s)"
+
+#: io.c:1418 io.c:1521 main.c:666
+#, c-format
+msgid "error writing standard error (%s)"
+msgstr "向标准错误输出写时发生错误 (%s)"
+
+#: io.c:1457
+#, c-format
+msgid "pipe flush of `%s' failed (%s)."
+msgstr "刷新管道“%s”时出错(%s)。"
+
+#: io.c:1460
+#, c-format
+msgid "co-process flush of pipe to `%s' failed (%s)."
+msgstr "刷新合作进程管道“%s”时出错(%s)。"
+
+#: io.c:1463
+#, c-format
+msgid "file flush of `%s' failed (%s)."
+msgstr "刷新文件“%s”时出错(%s)。"
+
+#: io.c:1610
+#, c-format
+msgid "local port %s invalid in `/inet': %s"
+msgstr "本地端口 %s 在“/inet”中无效：%s"
+
+#: io.c:1613
+#, c-format
+msgid "local port %s invalid in `/inet'"
+msgstr "本地端口 %s 在“/inet”中无效"
+
+#: io.c:1636
+#, c-format
+msgid "remote host and port information (%s, %s) invalid: %s"
+msgstr "远程主机和端口信息 (%s, %s) 无效：%s"
+
+#: io.c:1639
+#, c-format
+msgid "remote host and port information (%s, %s) invalid"
+msgstr "远程主机和端口信息 (%s, %s) 无效"
+
+#: io.c:1881
+msgid "TCP/IP communications are not supported"
+msgstr "TCP/IP 通讯不被支持"
+
+#: io.c:2009 io.c:2052
+#, c-format
+msgid "could not open `%s', mode `%s'"
+msgstr "无法以模式“%2$s”打开“%1$s”"
+
+#: io.c:2017 io.c:2069
+#, c-format
+msgid "close of master pty failed (%s)"
+msgstr "关闭主 pty 失败(%s)"
+
+#: io.c:2019 io.c:2071 io.c:2418 io.c:2662
+#, c-format
+msgid "close of stdout in child failed (%s)"
+msgstr "在子进程中关闭标准输出失败(%s)"
+
+#: io.c:2022 io.c:2074
+#, c-format
+msgid "moving slave pty to stdout in child failed (dup: %s)"
+msgstr "在子进程中将从 pty 改为标准输出失败(dup：%s)"
+
+#: io.c:2024 io.c:2076 io.c:2423
+#, c-format
+msgid "close of stdin in child failed (%s)"
+msgstr "在子进程中关闭标准输入失败(%s)"
+
+#: io.c:2027 io.c:2079
+#, c-format
+msgid "moving slave pty to stdin in child failed (dup: %s)"
+msgstr "在子进程中将从 pty 改为标准输入失败(dup：%s)"
+
+#: io.c:2029 io.c:2081 io.c:2103
+#, c-format
+msgid "close of slave pty failed (%s)"
+msgstr "关闭从 pty 失败(%s)"
+
+#: io.c:2265
+msgid "could not create child process or open pty"
+msgstr "无法创建子进程或打开 pty"
+
+#: io.c:2353 io.c:2421 io.c:2633 io.c:2665
+#, c-format
+msgid "moving pipe to stdout in child failed (dup: %s)"
+msgstr "在子进程中将管道改为标准输出失败(dup：%s)"
+
+#: io.c:2360 io.c:2426
+#, c-format
+msgid "moving pipe to stdin in child failed (dup: %s)"
+msgstr "在子进程中将管道改为标准输入失败(dup：%s)"
+
+#: io.c:2386 io.c:2655
+msgid "restoring stdout in parent process failed"
+msgstr "在父进程中恢复标准输出失败"
+
+#: io.c:2394
+msgid "restoring stdin in parent process failed"
+msgstr "在父进程中恢复标准输入失败"
+
+#: io.c:2429 io.c:2667 io.c:2682
+#, c-format
+msgid "close of pipe failed (%s)"
+msgstr "关闭管道失败(%s)"
+
+#: io.c:2488
+msgid "`|&' not supported"
+msgstr "“|&”不被支持"
+
+#: io.c:2618
+#, c-format
+msgid "cannot open pipe `%s' (%s)"
+msgstr "无法打开管道“%s”(%s)"
+
+#: io.c:2676
+#, c-format
+msgid "cannot create child process for `%s' (fork: %s)"
+msgstr "无法为“%s”创建子进程(fork：%s)"
+
+#: io.c:2814
+msgid "getline: attempt to read from closed read end of two-way pipe"
+msgstr "getline：试图从读取端已被关闭的双向管道中读取数据"
+
+#: io.c:3138
+msgid "register_input_parser: received NULL pointer"
+msgstr "register_input_parser：指针为空"
+
+#: io.c:3166
+#, c-format
+msgid "input parser `%s' conflicts with previously installed input parser `%s'"
+msgstr "输入解析器“%s”与之前设置的“%s”相冲突"
+
+#: io.c:3173
+#, c-format
+msgid "input parser `%s' failed to open `%s'"
+msgstr "输入解析器“%s”打开“%s”失败"
+
+#: io.c:3193
+msgid "register_output_wrapper: received NULL pointer"
+msgstr "register_output_parser：指针为空"
+
+#: io.c:3221
+#, c-format
+msgid ""
+"output wrapper `%s' conflicts with previously installed output wrapper `%s'"
+msgstr "输出解析器“%s”与之前设置的“%s”相冲突"
+
+#: io.c:3228
+#, c-format
+msgid "output wrapper `%s' failed to open `%s'"
+msgstr "输出解析器“%s”打开“%s”失败"
+
+#: io.c:3249
+msgid "register_output_processor: received NULL pointer"
+msgstr "register_output_processor：指针为空"
+
+#: io.c:3278
+#, c-format
+msgid ""
+"two-way processor `%s' conflicts with previously installed two-way processor "
+"`%s'"
+msgstr "双向处理器“%s”与之前设置的“%s”相冲突"
+
+#: io.c:3287
+#, c-format
+msgid "two way processor `%s' failed to open `%s'"
+msgstr "双向处理器“%s”打开“%s”失败"
+
+#: io.c:3411
+#, c-format
+msgid "data file `%s' is empty"
+msgstr "数据文件“%s”为空"
+
+#: io.c:3453 io.c:3461
+msgid "could not allocate more input memory"
+msgstr "无法分配更多的输入内存"
+
+#: io.c:4079
+msgid "multicharacter value of `RS' is a gawk extension"
+msgstr "“RS”设置为多字符是 gawk 扩展"
+
+#: io.c:4233
+msgid "IPv6 communication is not supported"
+msgstr "不支持 IPv6 通讯"
+
+#: main.c:335
+msgid "environment variable `POSIXLY_CORRECT' set: turning on `--posix'"
+msgstr "环境变量“POSIXLY_CORRECT”被设置：打开“--posix”"
+
+#: main.c:342
+msgid "`--posix' overrides `--traditional'"
+msgstr "“--posix”覆盖“--traditional”"
+
+#: main.c:353
+msgid "`--posix'/`--traditional' overrides `--non-decimal-data'"
+msgstr "“--posix”或“--traditional”覆盖“--non-decimal-data”"
+
+#: main.c:358
+msgid "`--posix' overrides `--characters-as-bytes'"
+msgstr "“--posix”覆盖“--characters-as-bytes”"
+
+#: main.c:367
+#, c-format
+msgid "running %s setuid root may be a security problem"
+msgstr "以设置 root ID 方式运行“%s”可能存在安全漏洞"
+
+#: main.c:420
+#, c-format
+msgid "can't set binary mode on stdin (%s)"
+msgstr "无法在标准输入上设置二进制模式(%s)"
+
+#: main.c:423
+#, c-format
+msgid "can't set binary mode on stdout (%s)"
+msgstr "无法在标准输出上设置二进制模式(%s)"
+
+#: main.c:425
+#, c-format
+msgid "can't set binary mode on stderr (%s)"
+msgstr "无法在标准错误输出上设置二进制模式(%s)"
+
+#: main.c:487
+msgid "no program text at all!"
+msgstr "完全没有程序正文！"
+
+#: main.c:581
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] -f progfile [--] file ...\n"
+msgstr "用法：%s [POSIX 或 GNU 风格选项] -f 脚本文件 [--] 文件 ...\n"
+
+#: main.c:583
+#, c-format
+msgid "Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ...\n"
+msgstr "用法：%s [POSIX 或 GNU 风格选项] [--] %c程序%c 文件 ...\n"
+
+#: main.c:588
+msgid "POSIX options:\t\tGNU long options: (standard)\n"
+msgstr "POSIX 选项：\t\tGNU 长选项：(标准)\n"
+
+#: main.c:589
+msgid "\t-f progfile\t\t--file=progfile\n"
+msgstr "\t-f 脚本文件\t\t--file=脚本文件\n"
+
+#: main.c:590
+msgid "\t-F fs\t\t\t--field-separator=fs\n"
+msgstr "\t-F fs\t\t\t--field-separator=fs\n"
+
+#: main.c:591
+msgid "\t-v var=val\t\t--assign=var=val\n"
+msgstr "\t-v var=val\t\t--assign=var=val\n"
+
+#: main.c:592
+msgid "Short options:\t\tGNU long options: (extensions)\n"
+msgstr "短选项：\t\tGNU 长选项：(扩展)\n"
+
+#: main.c:593
+msgid "\t-b\t\t\t--characters-as-bytes\n"
+msgstr "\t-b\t\t\t--characters-as-bytes\n"
+
+#: main.c:594
+msgid "\t-c\t\t\t--traditional\n"
+msgstr "\t-c\t\t\t--traditional\n"
+
+#: main.c:595
+msgid "\t-C\t\t\t--copyright\n"
+msgstr "\t-C\t\t\t--copyright\n"
+
+#: main.c:596
+msgid "\t-d[file]\t\t--dump-variables[=file]\n"
+msgstr "\t-d[文件]\t\t--dump-variables[=文件]\n"
+
+#: main.c:597
+msgid "\t-D[file]\t\t--debug[=file]\n"
+msgstr "\t-D[文件]\t\t--debug[=文件]\n"
+
+#: main.c:598
+msgid "\t-e 'program-text'\t--source='program-text'\n"
+msgstr "\t-e '程序文本'\t--source='程序文本'\n"
+
+#: main.c:599
+msgid "\t-E file\t\t\t--exec=file\n"
+msgstr "\t-E 文件\t\t\t--exec=文件\n"
+
+#: main.c:600
+msgid "\t-g\t\t\t--gen-pot\n"
+msgstr "\t-g\t\t\t--gen-pot\n"
+
+#: main.c:601
+msgid "\t-h\t\t\t--help\n"
+msgstr "\t-h\t\t\t--help\n"
+
+#: main.c:602
+msgid "\t-i includefile\t\t--include=includefile\n"
+msgstr "\t-i 包含文件\t\t--include=包含文件\n"
+
+#: main.c:603
+msgid "\t-l library\t\t--load=library\n"
+msgstr "\t-l 库\t\t--load=库\n"
+
+#. TRANSLATORS: the "fatal", "invalid" and "no-ext" here are literal
+#. values, they should not be translated. Thanks.
+#.
+#: main.c:608
+#, fuzzy
+msgid "\t-L[fatal|invalid|no-ext]\t--lint[=fatal|invalid|no-ext]\n"
+msgstr "\t-L[fatal|invalid]\t--lint[=fatal|invalid]\n"
+
+#: main.c:609
+msgid "\t-M\t\t\t--bignum\n"
+msgstr "\t-M\t\t\t--bignum\n"
+
+#: main.c:610
+msgid "\t-N\t\t\t--use-lc-numeric\n"
+msgstr "\t-N\t\t\t--use-lc-numeric\n"
+
+#: main.c:611
+msgid "\t-n\t\t\t--non-decimal-data\n"
+msgstr "\t-n\t\t\t--non-decimal-data\n"
+
+#: main.c:612
+msgid "\t-o[file]\t\t--pretty-print[=file]\n"
+msgstr "\t-o[文件]\t\t--pretty-print[=文件]\n"
+
+#: main.c:613
+msgid "\t-O\t\t\t--optimize\n"
+msgstr "\t-O\t\t\t--optimize\n"
+
+#: main.c:614
+msgid "\t-p[file]\t\t--profile[=file]\n"
+msgstr "\t-p[文件]\t\t--profile[=文件]\n"
+
+#: main.c:615
+msgid "\t-P\t\t\t--posix\n"
+msgstr "\t-P\t\t\t--posix\n"
+
+#: main.c:616
+msgid "\t-r\t\t\t--re-interval\n"
+msgstr "\t-r\t\t\t--re-interval\n"
+
+#: main.c:617
+msgid "\t-s\t\t\t--no-optimize\n"
+msgstr "\t-s\t\t\t--no-optimize\n"
+
+#: main.c:618
+msgid "\t-S\t\t\t--sandbox\n"
+msgstr "\t-S\t\t\t--sandbox\n"
+
+#: main.c:619
+msgid "\t-t\t\t\t--lint-old\n"
+msgstr "\t-t\t\t\t--lint-old\n"
+
+#: main.c:620
+msgid "\t-V\t\t\t--version\n"
+msgstr "\t-V\t\t\t--version\n"
+
+#: main.c:622
+msgid "\t-W nostalgia\t\t--nostalgia\n"
+msgstr "\t-W nostalgia\t\t--nostalgia\n"
+
+#: main.c:625
+msgid "\t-Y\t\t\t--parsedebug\n"
+msgstr "\t-Y\t\t\t--parsedebug\n"
+
+#: main.c:628
+msgid "\t-Z locale-name\t\t--locale=locale-name\n"
+msgstr "\t-Z locale-name\t\t--locale=locale-name\n"
+
+#. TRANSLATORS: --help output 5 (end)
+#. TRANSLATORS: the placeholder indicates the bug-reporting address
+#. for this application.  Please add _another line_ with the
+#. address for translation bugs.
+#. no-wrap
+#: main.c:637
+#, fuzzy
+msgid ""
+"\n"
+"To report bugs, see node `Bugs' in `gawk.info'\n"
+"which is section `Reporting Problems and Bugs' in the\n"
+"printed version.  This same information may be found at\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.\n"
+"PLEASE do NOT try to report bugs by posting in comp.lang.awk,\n"
+"or by using a web forum such as Stack Overflow.\n"
+"\n"
+msgstr ""
+"\n"
+"如需提交错误报告，请参考“gawk.info”中的“Bugs”页，\n"
+"它位于“Reporting Problems and Bugs”一节。您也可以在\n"
+"https://www.gnu.org/software/gawk/manual/html_node/Bugs.html\n"
+"中找到相同的信息。\n"
+"请勿在群组 comp.lang.awk 上提交错误报告，\n"
+"或者使用 Stack Overflow 等论坛报告错误。\n"
+"\n"
+
+#: main.c:645
+msgid ""
+"gawk is a pattern scanning and processing language.\n"
+"By default it reads standard input and writes standard output.\n"
+"\n"
+msgstr ""
+"gawk 是一个模式扫描及处理语言。缺省情况下它从标准输入读入并写至标准输出。\n"
+"\n"
+
+#: main.c:649
+msgid ""
+"Examples:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+msgstr ""
+"范例:\n"
+"\tgawk '{ sum += $1 }; END { print sum }' file\n"
+"\tgawk -F: '{ print $1 }' /etc/passwd\n"
+
+#: main.c:681
+#, c-format
+msgid ""
+"Copyright (C) 1989, 1991-%d Free Software Foundation.\n"
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 3 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+msgstr ""
+"版权所有 © 1989, 1991-%d 自由软件基金会(FSF)。\n"
+"\n"
+"该程序为自由软件，你可以在自由软件基金会发布的 GNU 通用公共许可证(GPL)第\n"
+"3版或以后版本下修改或重新发布。\n"
+"\n"
+
+#: main.c:689
+msgid ""
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+msgstr ""
+"该程序之所以被发布是因为希望他能对你有所用处，但我们不作任何担保。这包含\n"
+"但不限于任何商业适售性以及针对特定目的的适用性的担保。详情参见 GNU 通用公\n"
+"共许可证(GPL)。\n"
+"\n"
+
+#: main.c:695
+msgid ""
+"You should have received a copy of the GNU General Public License\n"
+"along with this program. If not, see http://www.gnu.org/licenses/.\n"
+msgstr ""
+"你应该收到程序附带的一份 GNU 通用公共许可证(GPL)。如果没有收到，请参看 "
+"http://www.gnu.org/licenses/ 。\n"
+
+#: main.c:736
+msgid "-Ft does not set FS to tab in POSIX awk"
+msgstr "在 POSIX awk 中 -Ft 不会将 FS 设为制表符(tab)"
+
+#: main.c:1151
+#, c-format
+msgid ""
+"%s: `%s' argument to `-v' not in `var=value' form\n"
+"\n"
+msgstr ""
+"%s：“-v”的参数“%s”不是“var=value”形式\n"
+"\n"
+
+#: main.c:1177
+#, c-format
+msgid "`%s' is not a legal variable name"
+msgstr "“%s”不是一个合法的变量名"
+
+#: main.c:1180
+#, c-format
+msgid "`%s' is not a variable name, looking for file `%s=%s'"
+msgstr "“%s”不是一个变量名，查找文件“%s=%s”"
+
+#: main.c:1194
+#, c-format
+msgid "cannot use gawk builtin `%s' as variable name"
+msgstr "无法将 gawk 内置的 “%s” 作为变量名"
+
+#: main.c:1199
+#, c-format
+msgid "cannot use function `%s' as variable name"
+msgstr "无法将函数名“%s”作为变量名"
+
+#: main.c:1277
+msgid "floating point exception"
+msgstr "浮点数异常"
+
+#: main.c:1287
+msgid "fatal error: internal error"
+msgstr "致命错误：内部错误"
+
+#: main.c:1307
+msgid "fatal error: internal error: segfault"
+msgstr "致命错误：内部错误：段错误"
+
+#: main.c:1320
+msgid "fatal error: internal error: stack overflow"
+msgstr "致命错误：内部错误：栈溢出"
+
+#: main.c:1380
+#, c-format
+msgid "no pre-opened fd %d"
+msgstr "文件描述符 %d 未被打开"
+
+#: main.c:1387
+#, c-format
+msgid "could not pre-open /dev/null for fd %d"
+msgstr "无法为文件描述符 %d 预打开 /dev/null"
+
+#: main.c:1601
+msgid "empty argument to `-e/--source' ignored"
+msgstr "“-e/--source”的空参数被忽略"
+
+#: main.c:1662 main.c:1667
+msgid "`--profile' overrides `--pretty-print'"
+msgstr "“--profile”覆盖“--pretty-print”"
+
+#: main.c:1679
+msgid "-M ignored: MPFR/GMP support not compiled in"
+msgstr "忽略 -M ignored：未将 MPFR/GMP 支持编译于"
+
+#: main.c:1704
+#, c-format
+msgid "%s: option `-W %s' unrecognized, ignored\n"
+msgstr "%s：选项“-W %s”无法识别，忽略\n"
+
+#: main.c:1757
+#, c-format
+msgid "%s: option requires an argument -- %c\n"
+msgstr "%s：选项需要一个参数 -- %c\n"
+
+#: mpfr.c:551
+#, c-format
+msgid "PREC value `%.*s' is invalid"
+msgstr "PREC 值 “%.*s” 无效"
+
+#: mpfr.c:610
+#, c-format
+msgid "RNDMODE value `%.*s' is invalid"
+msgstr "RNDMODE 值 “%.*s” 无效"
+
+#: mpfr.c:707
+#, c-format
+msgid "%s: received non-numeric argument"
+msgstr "%s：收到非数字参数"
+
+#: mpfr.c:816
+msgid "compl(%Rg): negative value is not allowed"
+msgstr "compl(%Rg)：不允许使用负值"
+
+#: mpfr.c:821
+msgid "comp(%Rg): fractional value will be truncated"
+msgstr "compl(%Rg)：小数部分会被截断"
+
+#: mpfr.c:832
+#, c-format
+msgid "compl(%Zd): negative values are not allowed"
+msgstr "compl(%Zd)：不允许使用负值"
+
+#: mpfr.c:850
+#, c-format
+msgid "%s: received non-numeric argument #%d"
+msgstr "%s：第 %d 个参数不是数值"
+
+#: mpfr.c:860
+msgid "%s: argument #%d has invalid value %Rg, using 0"
+msgstr "%s：第 %d 个参数的值 %Rg 无效，改为 0"
+
+#: mpfr.c:871
+msgid "%s: argument #%d negative value %Rg is not allowed"
+msgstr "%s：第 %d 个参数 %Rg 不能为负值"
+
+#: mpfr.c:878
+msgid "%s: argument #%d fractional value %Rg will be truncated"
+msgstr "%s：第 %d 个参数 %Rg 的小数部分会被截断"
+
+#: mpfr.c:892
+#, c-format
+msgid "%s: argument #%d negative value %Zd is not allowed"
+msgstr "%s：第 %d 个参数 %Zd 不能为负值"
+
+#: msg.c:75
+#, c-format
+msgid "cmd. line:"
+msgstr "命令行:"
+
+#: node.c:481
+msgid "could not make typed regex"
+msgstr "无法创建有类型的正则表达式"
+
+#: node.c:555
+#, c-format
+msgid "old awk does not support the `\\%c' escape sequence"
+msgstr "老 awk 不支持“\\%c”转义序列"
+
+#: node.c:606
+msgid "POSIX does not allow `\\x' escapes"
+msgstr "POSIX 不允许“\\x”转义符"
+
+#: node.c:612
+msgid "no hex digits in `\\x' escape sequence"
+msgstr "“\\x”转义序列中没有十六进制数"
+
+#: node.c:633
+#, c-format
+msgid ""
+"hex escape \\x%.*s of %d characters probably not interpreted the way you "
+"expect"
+msgstr "十六进制转义符 \\x%.*s 表示的 %d 个字符可能不会被如期望情况解释"
+
+#: node.c:648
+#, c-format
+msgid "escape sequence `\\%c' treated as plain `%c'"
+msgstr "转义序列“\\%c”被当作单纯的“%c”"
+
+#: node.c:784
+msgid ""
+"Invalid multibyte data detected. There may be a mismatch between your data "
+"and your locale."
+msgstr "检测到了无效的多字节数据。可能你的数据和区域设置不匹配。"
+
+#: posix/gawkmisc.c:177
+#, c-format
+msgid "%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"
+msgstr "%s %s “%s”：无法获取 fd 标志：(fcntl F_GETFD：%s)"
+
+#: posix/gawkmisc.c:189
+#, c-format
+msgid "%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"
+msgstr "%s %s “%s”：无法设置 close-on-exec：(fcntl F_SETFD：%s)"
+
+#: profile.c:73
+msgid "Program indentation level too deep. Consider refactoring your code"
+msgstr "代码缩进的层次太深。请考虑重构您的代码"
+
+#: profile.c:110
+#, c-format
+msgid "could not open `%s' for writing: %s"
+msgstr "无法以写模式打开“%s”：%s"
+
+#: profile.c:112
+msgid "sending profile to standard error"
+msgstr "发送配置到标准错误输出"
+
+#: profile.c:271
+#, c-format
+msgid ""
+"\t# %s rule(s)\n"
+"\n"
+msgstr ""
+"\t# %s 规则\n"
+"\n"
+
+#: profile.c:279
+#, c-format
+msgid ""
+"\t# Rule(s)\n"
+"\n"
+msgstr ""
+"\t# 规则\n"
+"\n"
+
+#: profile.c:367
+#, c-format
+msgid "internal error: %s with null vname"
+msgstr "内部错误：%s 带有空的 vname"
+
+#: profile.c:658
+msgid "internal error: builtin with null fname"
+msgstr "内部错误：内置操作的 fname 为空"
+
+#: profile.c:1302
+#, c-format
+msgid ""
+"%s# Loaded extensions (-l and/or @load)\n"
+"\n"
+msgstr ""
+"%s# 已加载扩展 (-l 和/或 @load)\n"
+"\n"
+
+#: profile.c:1333
+#, c-format
+msgid ""
+"\n"
+"# Included files (-i and/or @include)\n"
+"\n"
+msgstr ""
+"\n"
+"# 已加载扩展 (-l 和/或 @load)\n"
+"\n"
+
+#: profile.c:1397
+#, c-format
+msgid "\t# gawk profile, created %s\n"
+msgstr "\t# gawk 配置, 创建 %s\n"
+
+#: profile.c:1962
+#, c-format
+msgid ""
+"\n"
+"\t# Functions, listed alphabetically\n"
+msgstr ""
+"\n"
+"\t# 函数列表，字典序\n"
+
+#: profile.c:2023
+#, c-format
+msgid "redir2str: unknown redirection type %d"
+msgstr "redir2str：未知重定向类型 %d"
+
+#: re.c:58 re.c:161
+msgid ""
+"behavior of matching a regexp containing NUL characters is not defined by "
+"POSIX"
+msgstr "POSIX 规范中不支持匹配包含 NUL 字符的正则表达式"
+
+#: re.c:125
+msgid "invalid NUL byte in dynamic regexp"
+msgstr "动态正则表达式中含有无效的 NUL 字节"
+
+#: re.c:172
+#, c-format
+msgid "regexp escape sequence `\\%c' treated as plain `%c'"
+msgstr "正则表达式中的转义序列“\\%c”将被当作纯文本“%c”"
+
+#: re.c:191
+#, c-format
+msgid "regexp escape sequence `\\%c' is not a known regexp operator"
+msgstr "正则表达式中的转义序列“\\%c”不是有效的操作符"
+
+#: re.c:650
+#, c-format
+msgid "regexp component `%.*s' should probably be `[%.*s]'"
+msgstr "正则表达式成分“%.*s”可能应为“[%.*s]”"
+
+#: support/dfa.c:1017
+msgid "unbalanced ["
+msgstr "[ 不配对"
+
+#: support/dfa.c:1138
+msgid "invalid character class"
+msgstr "无效的字符类型名"
+
+#: support/dfa.c:1264
+msgid "character class syntax is [[:space:]], not [:space:]"
+msgstr "字符类型的语法为 [[:space:]]，而不是 [:space:]"
+
+#: support/dfa.c:1331
+msgid "unfinished \\ escape"
+msgstr "不完整的 \\ 转义"
+
+#: support/dfa.c:1492
+msgid "invalid content of \\{\\}"
+msgstr "\\{\\} 中内容无效"
+
+#: support/dfa.c:1495
+msgid "regular expression too big"
+msgstr "正则表达式过大"
+
+#: support/dfa.c:1910
+msgid "unbalanced ("
+msgstr "( 不配对"
+
+#: support/dfa.c:2028
+msgid "no syntax specified"
+msgstr "未指定语法"
+
+#: support/dfa.c:2039
+msgid "unbalanced )"
+msgstr ") 不配对"
+
+#: support/getopt.c:605 support/getopt.c:634
+#, c-format
+msgid "%s: option '%s' is ambiguous; possibilities:"
+msgstr "%s：选项“%s”有歧义；可能为："
+
+#: support/getopt.c:680 support/getopt.c:684
+#, c-format
+msgid "%s: option '--%s' doesn't allow an argument\n"
+msgstr "%s：选项“--%s”不允许有参数\n"
+
+#: support/getopt.c:693 support/getopt.c:698
+#, c-format
+msgid "%s: option '%c%s' doesn't allow an argument\n"
+msgstr "%s：选项“%c%s”不允许有参数\n"
+
+#: support/getopt.c:741 support/getopt.c:760
+#, c-format
+msgid "%s: option '--%s' requires an argument\n"
+msgstr "%s：选项“%s”需要一个参数\n"
+
+#: support/getopt.c:798 support/getopt.c:801
+#, c-format
+msgid "%s: unrecognized option '--%s'\n"
+msgstr "%s：无法识别选项“--%s”\n"
+
+#: support/getopt.c:809 support/getopt.c:812
+#, c-format
+msgid "%s: unrecognized option '%c%s'\n"
+msgstr "%s：无法识别选项“%c%s”\n"
+
+#: support/getopt.c:861 support/getopt.c:864
+#, c-format
+msgid "%s: invalid option -- '%c'\n"
+msgstr "%s：无效选项 -- “%c”\n"
+
+#: support/getopt.c:917 support/getopt.c:934 support/getopt.c:1144
+#: support/getopt.c:1162
+#, c-format
+msgid "%s: option requires an argument -- '%c'\n"
+msgstr "%s：选项需要一个参数 -- “%c”\n"
+
+#: support/getopt.c:990 support/getopt.c:1006
+#, c-format
+msgid "%s: option '-W %s' is ambiguous\n"
+msgstr "%s：选项“-W %s”有歧义\n"
+
+#: support/getopt.c:1030 support/getopt.c:1048
+#, c-format
+msgid "%s: option '-W %s' doesn't allow an argument\n"
+msgstr "%s：选项“-W %s”不允许参数\n"
+
+#: support/getopt.c:1069 support/getopt.c:1087
+#, c-format
+msgid "%s: option '-W %s' requires an argument\n"
+msgstr "%s：选项“-W %s”需要一个参数\n"
+
+#: support/regcomp.c:135
+msgid "Success"
+msgstr "成功"
+
+#: support/regcomp.c:138
+msgid "No match"
+msgstr "无匹配"
+
+#: support/regcomp.c:141
+msgid "Invalid regular expression"
+msgstr "无效的正则表达式"
+
+#: support/regcomp.c:144
+msgid "Invalid collation character"
+msgstr "无效的收集字符"
+
+#: support/regcomp.c:147
+msgid "Invalid character class name"
+msgstr "无效的字符类型名"
+
+#: support/regcomp.c:150
+msgid "Trailing backslash"
+msgstr "尾端的反斜杠"
+
+#: support/regcomp.c:153
+msgid "Invalid back reference"
+msgstr "无效的回引用"
+
+#: support/regcomp.c:156
+msgid "Unmatched [, [^, [:, [., or [="
+msgstr "[、[^、 [:、[. 或 [= 不配对"
+
+#: support/regcomp.c:159
+msgid "Unmatched ( or \\("
+msgstr "未匹配的 ( 或 \\("
+
+#: support/regcomp.c:162
+msgid "Unmatched \\{"
+msgstr "未匹配的 \\{"
+
+#: support/regcomp.c:165
+msgid "Invalid content of \\{\\}"
+msgstr "\\{\\} 中内容无效"
+
+#: support/regcomp.c:168
+msgid "Invalid range end"
+msgstr "无效的范围结束"
+
+#: support/regcomp.c:171
+msgid "Memory exhausted"
+msgstr "内存耗尽"
+
+#: support/regcomp.c:174
+msgid "Invalid preceding regular expression"
+msgstr "无效的前置正则表达式"
+
+#: support/regcomp.c:177
+msgid "Premature end of regular expression"
+msgstr "正则表达式非正常结束"
+
+#: support/regcomp.c:180
+msgid "Regular expression too big"
+msgstr "正则表达式过大"
+
+#: support/regcomp.c:183
+msgid "Unmatched ) or \\)"
+msgstr "未匹配的 ) 或 \\)"
+
+#: support/regcomp.c:676
+msgid "No previous regular expression"
+msgstr "前面没有正则表达式"
+
+#: symbol.c:688
+#, c-format
+msgid "function `%s': can't use function `%s' as a parameter name"
+msgstr "函数“%s”：无法将函数名“%s”作为参数名"
+
+#: symbol.c:818
+msgid "can not pop main context"
+msgstr "无法弹出 main 的上下文"
+
+#~ msgid "setenv(TZ, %s) failed (%s)"
+#~ msgstr "sevenv(TZ, %s) 执行失败（%s）"
+
+#~ msgid "setenv(TZ, %s) restoration failed (%s)"
+#~ msgstr "sevenv(TZ, %s) 恢复原始值失败（%s）"
+
+#~ msgid "unsetenv(TZ) failed (%s)"
+#~ msgstr "unsetenv(TZ) 执行失败(%s)"
+
+#~ msgid "backslash at end of string"
+#~ msgstr "字符串尾部的反斜杠"
+
+#~ msgid "`isarray' is deprecated. Use `typeof' instead"
+#~ msgstr "“isarray”语法已被弃用，请改用“typeof”"
+
+#~ msgid "attempt to use array `%s[\".*%s\"]' in a scalar context"
+#~ msgstr "试图在标量环境中使用数组“%s[\"%s\"]”"
+
+#~ msgid "attempt to use scalar `%s[\".*%s\"]' as array"
+#~ msgstr "试图把标量“%s[\".*%s\"]”当数组使用"
+
+#~ msgid "gensub: third argument %g treated as 1"
+#~ msgstr "gensub：第三个参数 %g 被当作 1"
+
+#~ msgid "`extension' is a gawk extension"
+#~ msgstr "“extension”是 gawk 扩展"
+
+#~ msgid "extension: received NULL lib_name"
+#~ msgstr "extension：收到空 lib_name"
+
+#~ msgid "extension: cannot open library `%s' (%s)"
+#~ msgstr "extension：无法打开库“%s”(%s)"
+
+#~ msgid ""
+#~ "extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)"
+#~ msgstr "extension：库“%s”：未定义“plugin_is_GPL_compatible”(%s)"
+
+#~ msgid "extension: library `%s': cannot call function `%s' (%s)"
+#~ msgstr "extension：库“%s”：无法调用函数“%s”(%s)"
+
+#~ msgid "extension: missing function name"
+#~ msgstr "extension：缺少函数名"
+
+#~ msgid "extension: illegal character `%c' in function name `%s'"
+#~ msgstr "extension：函数名“%2$s”中有非法字符“%1$c”"
+
+#~ msgid "extension: can't redefine function `%s'"
+#~ msgstr "extension：无法重定义函数“%s”"
+
+#~ msgid "extension: function `%s' already defined"
+#~ msgstr "extension：函数“%s”已经被定义"
+
+#~ msgid "extension: function name `%s' previously defined"
+#~ msgstr "extension：函数名“%s”前面已被定义"
+
+#~ msgid "extension: can't use gawk built-in `%s' as function name"
+#~ msgstr "extension：无法使用 gawk 内置的 “%s” 作为函数名"
+
+#~ msgid "chdir: called with incorrect number of arguments, expecting 1"
+#~ msgstr "chdir：调用时的参数个数有误，应为 1 个"
+
+#~ msgid "stat: called with wrong number of arguments"
+#~ msgstr "stat：调用时的参数个数有误"
+
+#~ msgid "statvfs: called with wrong number of arguments"
+#~ msgstr "statvfs：调用时的参数个数有误"
+
+#~ msgid "fnmatch: called with less than three arguments"
+#~ msgstr "fnmatch：调用时传递的参数不足3个"
+
+#~ msgid "fnmatch: called with more than three arguments"
+#~ msgstr "fnmatch：调用时传递的参数超过3个"
+
+#~ msgid "fork: called with too many arguments"
+#~ msgstr "fork：参数太多"
+
+#~ msgid "waitpid: called with too many arguments"
+#~ msgstr "waitpid：参数太多"
+
+#~ msgid "wait: called with no arguments"
+#~ msgstr "wait：缺少参数"
+
+#~ msgid "wait: called with too many arguments"
+#~ msgstr "wait：参数太多"
+
+#~ msgid "ord: called with too many arguments"
+#~ msgstr "ord：参数太多"
+
+#~ msgid "ord: called with no arguments"
+#~ msgstr "ord：缺少参数"
+
+#~ msgid "chr: called with too many arguments"
+#~ msgstr "chr：参数太多"
+
+#~ msgid "chr: called with no arguments"
+#~ msgstr "chr：缺少参数"
+
+#~ msgid "readfile: called with too many arguments"
+#~ msgstr "readfile：参数太多"
+
+#~ msgid "writea: called with too many arguments"
+#~ msgstr "readfile：参数太多"
+
+#~ msgid "reada: called with too many arguments"
+#~ msgstr "reada：参数太多"
+
+#~ msgid "gettimeofday: ignoring arguments"
+#~ msgstr "gettimeofday：忽略参数"
+
+#~ msgid "sleep: called with too many arguments"
+#~ msgstr "sleep：参数太多"
+
+#~ msgid "unknown value for field spec: %d\n"
+#~ msgstr "未知的字段规范：%d\n"
+
+#~ msgid "function `%s' defined to take no more than %d argument(s)"
+#~ msgstr "函数“%s”被定义为支持不超过 %d 个参数"
+
+#~ msgid "function `%s': missing argument #%d"
+#~ msgstr "函数“%s”：缺少第 %d 个参数"
+
+#~ msgid "reference to uninitialized element `%s[\"%.*s\"]'"
+#~ msgstr "引用未初始化的元素“%s[\"%.*s\"]”"
+
+#~ msgid "subscript of array `%s' is null string"
+#~ msgstr "数组“%s”的下标是空字符串"
+
+#~ msgid "%s: empty (null)\n"
+#~ msgstr "%s: 空(null)\n"
+
+#~ msgid "%s: empty (zero)\n"
+#~ msgstr "%s: 空(zero)\n"
+
+#~ msgid "%s: table_size = %d, array_size = %d\n"
+#~ msgstr "%s: 表格大小 = %d, 数组大小 = %d\n"
+
+#~ msgid "%s: array_ref to %s\n"
+#~ msgstr "%s: 数组引用到 %s\n"
+
+#~ msgid "statement may have no effect"
+#~ msgstr "表达式可能无任何效果"
+
+#~ msgid "`delete array' is a gawk extension"
+#~ msgstr "“delete array”是 gawk 扩展"
+
+#~ msgid "call of `length' without parentheses is deprecated by POSIX"
+#~ msgstr "POSIX 认为不带括号调用“length”是已过时的"
+
+#~ msgid "use of non-array as array"
+#~ msgstr "把非数组做数组使用"
+
+#~ msgid "`%s' is a Bell Labs extension"
+#~ msgstr "“%s”是贝尔实验室扩展"
+
+#~ msgid "division by zero attempted in `/'"
+#~ msgstr "在“/”中试图除 0"
+
+#~ msgid "length: untyped parameter argument will be forced to scalar"
+#~ msgstr "length: 无类型的参数会被强制转换为标量"
+
+#~ msgid "length: untyped argument will be forced to scalar"
+#~ msgstr "length: 无类型的参数会被强制转换为标量"
+
+#~ msgid "or: received non-numeric first argument"
+#~ msgstr "or: 第一个参数不是数字"
+
+#~ msgid "or: received non-numeric second argument"
+#~ msgstr "or: 第二个参数不是数字"
+
+#~ msgid "or(%lf, %lf): negative values will give strange results"
+#~ msgstr "or(%lf, %lf): 负值会得到奇怪的结果"
+
+#~ msgid "or(%lf, %lf): fractional values will be truncated"
+#~ msgstr "or(%lf, %lf): 小数部分会被截断"
+
+#~ msgid "xor: received non-numeric first argument"
+#~ msgstr "xor: 第一个参数不是数字"
+
+#~ msgid "xor: received non-numeric second argument"
+#~ msgstr "xor: 第二个参数不是数字"
+
+#~ msgid "xor(%lf, %lf): fractional values will be truncated"
+#~ msgstr "xor(%lf, %lf): 小数部分会被截断"
+
+#~ msgid ""
+#~ "for loop: array `%s' changed size from %ld to %ld during loop execution"
+#~ msgstr "for loop: 数组“%s”在循环执行时大小从 %ld 改变为 %ld"
+
+#~ msgid "`break' outside a loop is not portable"
+#~ msgstr "“break”在循环外使用是不可移植的"
+
+#~ msgid "`continue' outside a loop is not portable"
+#~ msgstr "“continue”在循环外使用是不可移植的"
+
+#~ msgid "`next' cannot be called from an END rule"
+#~ msgstr "在 END 规则中不允许调用“next”"
+
+#~ msgid "`nextfile' cannot be called from a BEGIN rule"
+#~ msgstr "在 BEGIN 规则中不允许调用“nextfile”"
+
+#~ msgid "`nextfile' cannot be called from an END rule"
+#~ msgstr "在 END 规则中不允许调用“nextfile”"
+
+#~ msgid "statement has no effect"
+#~ msgstr "表达式无任何作用"
+
+#~ msgid ""
+#~ "concatenation: side effects in one expression have changed the length of "
+#~ "another!"
+#~ msgstr "concatenation: 一个表达式的额外效应已改变另一个的长度！"
+
+#~ msgid "assignment used in conditional context"
+#~ msgstr "在条件表达式中赋值"
+
+#~ msgid "illegal type (%s) in tree_eval"
+#~ msgstr "tree_eval 中的非法类型 (%s)"
+
+#~ msgid "\t# -- main --\n"
+#~ msgstr "\t# -- main --\n"
+
+#~ msgid "assignment is not allowed to result of builtin function"
+#~ msgstr "不允许对内置函数的结果赋值"
+
+#~ msgid "Operation Not Supported"
+#~ msgstr "操作不被支持"
+
+#~ msgid "invalid tree type %s in redirect()"
+#~ msgstr "在 redirect() 中的无效的树类型 %s"
+
+#~ msgid "/inet/raw client not ready yet, sorry"
+#~ msgstr "/inet/raw 客户端未准备好，对不起"
+
+#~ msgid "only root may use `/inet/raw'."
+#~ msgstr "仅 root 能使用 “/inet/raw”"
+
+#~ msgid "/inet/raw server not ready yet, sorry"
+#~ msgstr "/inet/raw 服务器未准备好，对不起"
+
+#~ msgid "no (known) protocol supplied in special filename `%s'"
+#~ msgstr "未提供特殊文件名的“%s”的访问协议"
+
+#~ msgid "special file name `%s' is incomplete"
+#~ msgstr "特殊文件名“%s”是不完整的"
+
+#~ msgid "must supply a remote hostname to `/inet'"
+#~ msgstr "必须提供远程主机名给“/inet”"
+
+#~ msgid "must supply a remote port to `/inet'"
+#~ msgstr "必须提供远程端口给“/inet”"
+
+#~ msgid "file `%s' is a directory"
+#~ msgstr "文件“%s”是一个目录"
+
+#~ msgid "use `PROCINFO[\"%s\"]' instead of `%s'"
+#~ msgstr "使用“PROCINFO[\"%s\"]”而不是“%s”"
+
+#~ msgid "use `PROCINFO[...]' instead of `/dev/user'"
+#~ msgstr "使用“PROCINFO[...]”而不是“/dev/user”"
+
+#~ msgid "out of memory"
+#~ msgstr "内存不足"
+
+#~ msgid "`-m[fr]' option irrelevant in gawk"
+#~ msgstr "“-m[fr]”选项在 gawk 中不相关"
+
+#~ msgid "-m option usage: `-m[fr] nnn'"
+#~ msgstr "-m 选项用法: “-m[fr] nnn”"
+
+#~ msgid "\t-m[fr] val\n"
+#~ msgstr "\t-m[fr] val\n"
+
+#~ msgid "\t-W compat\t\t--compat\n"
+#~ msgstr "\t-W compat\t\t--compat\n"
+
+#~ msgid "\t-W copyleft\t\t--copyleft\n"
+#~ msgstr "\t-W copyleft\t\t--copyleft\n"
+
+#~ msgid "\t-W usage\t\t--usage\n"
+#~ msgstr "\t-W usage\t\t--usage\n"
+
+#~ msgid "could not find groups: %s"
+#~ msgstr "无法找到组: %s"
+
+#~ msgid "can't convert string to float"
+#~ msgstr "无法将字符串转化为浮点数"
+
+#~ msgid "# treated internally as `delete'"
+#~ msgstr "# 内部处理为“delete”"
+
+#~ msgid "# this is a dynamically loaded extension function"
+#~ msgstr "# 这是一个动态加载的扩展函数"
+
+#~ msgid ""
+#~ "\t# BEGIN block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# BEGIN 块\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\t# END block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# BEGIN 块\n"
+#~ "\n"
+
+#~ msgid "unexpected type %s in prec_level"
+#~ msgstr "在 prec_level 中未预期的类型 %s"
+
+#~ msgid "Unknown node type %s in pp_var"
+#~ msgstr "pp_var 中的未知的结点类型 %s"
+
+#~ msgid "can't open two way socket `%s' for input/output (%s)"
+#~ msgstr "无法为输入/输出打开双向端口“%s”(%s)"
+
+#~ msgid "`getline var' invalid inside `%s' rule"
+#~ msgstr "“getline var” 在“%s”规则中无效"
+
+#~ msgid ""
+#~ "\t# %s block(s)\n"
+#~ "\n"
+#~ msgstr ""
+#~ "\t# %s 块\n"
+#~ "\n"
+
+#~ msgid "range of the form `[%c-%c]' is locale dependent"
+#~ msgstr "范围的表示方式“[%c-%c]”与区域设置有关"
diff --git a/gawk-5.0.1/posix/ChangeLog b/gawk-5.0.1/posix/ChangeLog
new file mode 100644
index 00000000000..6df93c56d1e
--- /dev/null
+++ b/gawk-5.0.1/posix/ChangeLog
@@ -0,0 +1,9 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/posix/ChangeLog.0 b/gawk-5.0.1/posix/ChangeLog.0
new file mode 100644
index 00000000000..42b17852050
--- /dev/null
+++ b/gawk-5.0.1/posix/ChangeLog.0
@@ -0,0 +1,174 @@
+Mon Jun 20 20:19:03 2011  Corinna Vinschen  <vinschen@redhat.com>
+
+	* gawkmisc.c: Add include of <windows.h> for Cygwin to
+	remove a compiler warning.
+
+Mon May  2 23:38:06 2011  Corinna Vinschen  <vinschen@redhat.com>
+
+	* gawkmisc.c (cygwin_premain0): Use the real type for the secondnd
+	argument.
+
+Fri Apr  1 11:50:59 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.c (os_iastty): New function.
+
+Sun Feb 13 20:23:34 2011  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.c (files_are_same): Change arguments; call `stat' as
+	part of the body.
+
+Tue Feb  1 23:05:51 2011  Corinna Vinschen  <vinschen@redhat.com>
+
+	Make values of ctype macros into unsigned char to fix
+	warnings found on Cygwin / Newlib.
+
+	* gawkmisc.c (optimal_bufsize): Add cast.
+
+Mon Jan 24 22:21:08 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Everything: Move to ANSI headers on the function definitions.
+
+Mon Jan 24 22:20:43 2011  Corinna Vinschen  <vinschen@redhat.com>
+
+	* gawkmisc.c: Update CYGWIN code.
+
+Wed Nov 24 17:26:24 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.c (os_close_on_exec): After discussion on the Bash
+	list, change the routine to follow POSIX and use read/modify/write
+	on the flags value.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Tue Apr 13 22:38:01 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.c: Remove use of ISxxx in favor of standard names.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Sun Apr  2 21:43:02 2006  Corinna Vinschen  <vinschen@redhat.com>
+
+	* gawkmisc.c (os_setbinmode): Call `setmode' for Cygwin.
+	(cygwin_premain0, cygwin_premain2): Change type of `myself'
+	parameter to `void *'.
+
+Sun Mar 12 22:45:11 2006  Corinna Vinschen  <vinschen@redhat.com>
+
+	* gawkmisc.c (cygwin_premain2): New function.
+	Fixes CR-LF problem with already open stdin.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+Sun May 25 16:23:43 2003  Corinna Vinschen  <vinschen@redhat.com>
+
+	* gawkmisc.c (cygwin_premain0): New function.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Tue Feb  4 14:28:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	All relevant files: Copyright year updated to 2003.
+
+Tue Dec 17 11:05:11 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.c (optimal_bufsize): Stat the file first, so that
+	stb is always valid for higher level code.
+
+Thu Nov 28 10:20:05 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.c (optimal_bufsize): Enhance to use AWKBUFSIZE
+	environment variable for debugging.
+
+Tue Jun 11 22:18:42 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	* gawkmisc.c (DEFBLKSIZE): Add check for st_blksize > 0,
+	fixes weird bug on some versions of HP-UX.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+Tue Sep 25 15:19:53 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.c (os_close_on_exec): If fd <= 2, return.
+
+Sun Jun  3 13:04:44 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.0: Release tar file made.  And there was
+	rejoicing.
+
+Sun Jan 28 15:50:02 2001  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* gawkmisc.c (os_restore_mode): New function.
+
+Sun Dec  3 16:53:37 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.c (os_setbinmode): New function.
+
+Tue Nov 14 16:13:08 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.c: Remove all includes.  Done by ../gawkmisc.c.
+
+Tue Nov  7 14:09:14 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.c (os_is_setuid): new function.
+
+Mon Aug  7 15:23:00 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.6: Release tar file made.
+
+Sun Jun 25 15:08:19 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.5: Release tar file made.
+
+Wed Jun 30 16:14:36 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Release 3.0.4: Release tar file made.  This time for sure.
+
+Wed Jul 30 19:53:52 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Close-on-exec changes:
+	gawkmisc.c: (os_close_on_exec, os_isdir): new functions.
+
+Thu May 15 12:49:08 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.3: Release tar file made.
+
+Fri Apr 18 07:55:47 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* BETA Release 3.0.34: Release tar file made.
+
+Wed Dec 25 11:25:22 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.2: Release tar file made.
+
+Tue Dec 10 23:09:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.1: Release tar file made.
+
+Wed Jan 10 22:58:55 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* ChangeLog created.
diff --git a/gawk-5.0.1/posix/ChangeLog.1 b/gawk-5.0.1/posix/ChangeLog.1
new file mode 100644
index 00000000000..9ec9907ce9c
--- /dev/null
+++ b/gawk-5.0.1/posix/ChangeLog.1
@@ -0,0 +1,95 @@
+2018-03-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.c (cygwin_premain0, cygwin_premain2): Restored for
+	use in MSYS environment only.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-02-20         Corinna Vinschen      <vinschen@redhat.com>
+
+	* gawkmisc.c (cygwin_premain0, cygwin_premain2): Remove.
+	No longer needed.
+
+2016-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* General: Remove trailing whitespace from all relevant files.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2013-06-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.c (init_sockets): Remove ifdefs.
+
+2013-06-01  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.c (init_sockets): New dummy function.
+
+2013-05-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.c (optimal_bufsize): Change check from HAVE_ST_BLKSIZE
+	to HAVE_STRUCT_STAT_ST_BLKSIZE.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-10-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.c (os_isreadable): Change name of input parameter to
+	awk_inputbuf_t.
+
+2012-08-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.pc (os_isreadable): Take IOBUF_PUBLIC instead of fd and
+	use passed in info.
+
+2012-07-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.c (os_isreadable): Add isdir pointer parameter to be
+	set to true if fd is for a directory.
+
+2012-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.c (os_isreadable): New function.
+
+2012-05-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.c: Use `bool', `true', and `false' everywhere.
+
+2012-03-20         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkmisc.c (deflibpath): New global variable.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/posix/gawkmisc.c b/gawk-5.0.1/posix/gawkmisc.c
new file mode 100644
index 00000000000..16cfeb03904
--- /dev/null
+++ b/gawk-5.0.1/posix/gawkmisc.c
@@ -0,0 +1,311 @@
+/* gawkmisc.c --- miscellaneous gawk routines that are OS specific.
+
+   Copyright (C) 1986, 1988, 1989, 1991 - 1998, 2001 - 2004, 2011
+   the Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifdef __CYGWIN__
+#include <stdio.h>
+#include <windows.h>
+#include <sys/cygwin.h>
+#include <io.h>
+#endif
+
+char quote = '\'';
+char *defpath = DEFPATH;
+char *deflibpath = DEFLIBPATH;
+char envsep = ':';
+
+#ifndef INVALID_HANDLE
+/* FIXME: is this value for INVALID_HANDLE correct? */
+#define INVALID_HANDLE -1
+#endif
+
+/* gawk_name --- pull out the "gawk" part from how the OS called us */
+
+char *
+gawk_name(const char *filespec)
+{
+	char *p;
+
+	/* "path/name" -> "name" */
+	p = strrchr(filespec, '/');
+	return (p == NULL ? (char *) filespec : p + 1);
+}
+
+/* os_arg_fixup --- fixup the command line */
+
+void
+os_arg_fixup(int *argcp, char ***argvp)
+{
+	/* no-op */
+	return;
+}
+
+/* os_devopen --- open special per-OS devices */
+
+int
+os_devopen(const char *name, int flag)
+{
+	/* no-op */
+	return INVALID_HANDLE;
+}
+
+/* optimal_bufsize --- determine optimal buffer size */
+
+/*
+ * Enhance this for debugging purposes, as follows:
+ *
+ * Always stat the file, stat buffer is used by higher-level code.
+ *
+ * if (AWKBUFSIZE == "exact")
+ * 	return the file size
+ * else if (AWKBUFSIZE == a number)
+ * 	always return that number
+ * else
+ * 	if the size is < default_blocksize
+ * 		return the size
+ *	else
+ *		return default_blocksize
+ *	end if
+ * endif
+ *
+ * Hair comes in an effort to only deal with AWKBUFSIZE
+ * once, the first time this routine is called, instead of
+ * every time.  Performance, dontyaknow.
+ */
+
+size_t
+optimal_bufsize(int fd, struct stat *stb)
+{
+	char *val;
+	static size_t env_val = 0;
+	static bool first = true;
+	static bool exact = false;
+
+	/* force all members to zero in case OS doesn't use all of them. */
+	memset(stb, '\0', sizeof(struct stat));
+
+	/* always stat, in case stb is used by higher level code. */
+	if (fstat(fd, stb) == -1)
+		fatal("can't stat fd %d (%s)", fd, strerror(errno));
+
+	if (first) {
+		first = false;
+
+		if ((val = getenv("AWKBUFSIZE")) != NULL) {
+			if (strcmp(val, "exact") == 0)
+				exact = true;
+			else if (isdigit((unsigned char) *val)) {
+				for (; *val && isdigit((unsigned char) *val); val++)
+					env_val = (env_val * 10) + *val - '0';
+
+				return env_val;
+			}
+		}
+	} else if (! exact && env_val > 0)
+		return env_val;
+	/* else
+	  	fall through */
+
+	/*
+	 * System V.n, n < 4, doesn't have the file system block size in the
+	 * stat structure. So we have to make some sort of reasonable
+	 * guess. We use stdio's BUFSIZ, since that is what it was
+	 * meant for in the first place.
+	 */
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
+#define DEFBLKSIZE	(stb->st_blksize > 0 ? stb->st_blksize : BUFSIZ)
+#else
+#define DEFBLKSIZE	BUFSIZ
+#endif
+
+	if (S_ISREG(stb->st_mode)		/* regular file */
+	    && 0 < stb->st_size			/* non-zero size */
+	    && (stb->st_size < DEFBLKSIZE	/* small file */
+		|| exact))			/* or debugging */
+		return stb->st_size;		/* use file size */
+
+	return DEFBLKSIZE;
+}
+
+/* ispath --- return true if path has directory components */
+
+int
+ispath(const char *file)
+{
+	return (strchr(file, '/') != NULL);
+}
+
+/* isdirpunct --- return true if char is a directory separator */
+
+int
+isdirpunct(int c)
+{
+	return (c == '/');
+}
+
+/* os_close_on_exec --- set close on exec flag, print warning if fails */
+
+void
+os_close_on_exec(int fd, const char *name, const char *what, const char *dir)
+{
+	int curflags = 0;
+
+	if (fd <= 2)	/* sanity */
+		return;
+
+	/*
+	 * Per POSIX, use Read/Modify/Write - get the flags,
+	 * add FD_CLOEXEC, set the flags back.
+	 */
+
+	if ((curflags = fcntl(fd, F_GETFD)) < 0) {
+		warning(_("%s %s `%s': could not get fd flags: (fcntl F_GETFD: %s)"),
+			what, dir, name, strerror(errno));
+		return;
+	}
+
+#ifndef FD_CLOEXEC
+#define FD_CLOEXEC	1
+#endif
+
+	curflags |= FD_CLOEXEC;
+
+	if (fcntl(fd, F_SETFD, curflags) < 0)
+		warning(_("%s %s `%s': could not set close-on-exec: (fcntl F_SETFD: %s)"),
+			what, dir, name, strerror(errno));
+}
+
+/* os_isdir --- is this an fd on a directory? */
+
+#if ! defined(S_ISDIR) && defined(S_IFDIR)
+#define	S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#endif
+
+int
+os_isdir(int fd)
+{
+	struct stat sbuf;
+
+	return (fstat(fd, &sbuf) == 0 && S_ISDIR(sbuf.st_mode));
+}
+
+/* os_isreadable --- fd can be read from */
+
+int
+os_isreadable(const awk_input_buf_t *iobuf, bool *isdir)
+{
+	*isdir = false;
+
+	if (iobuf->fd == INVALID_HANDLE)
+		return false;
+
+	switch (iobuf->sbuf.st_mode & S_IFMT) {
+	case S_IFREG:
+	case S_IFCHR:	/* ttys, /dev/null, .. */
+#ifdef S_IFSOCK
+	case S_IFSOCK:
+#endif
+#ifdef S_IFIFO
+	case S_IFIFO:
+#endif
+		return true;
+	case S_IFDIR:
+		*isdir = true;
+		/* fall through */
+	default:
+		return false;
+	}
+}
+
+/* os_is_setuid --- true if running setuid root */
+
+int
+os_is_setuid()
+{
+	long uid, euid;
+
+	uid = getuid();
+	euid = geteuid();
+
+	return (euid == 0 && euid != uid);
+}
+
+/* os_setbinmode --- set binary mode on file */
+
+int
+os_setbinmode(int fd, int mode)
+{
+#ifdef __CYGWIN__
+	setmode (fd, mode);
+#endif
+	return 0;
+}
+
+/* os_restore_mode --- restore the original mode of the console device */
+
+void
+os_restore_mode(int fd)
+{
+	/* no-op */
+	return;
+}
+
+/* os_isatty --- return true if fd is a tty */
+
+int
+os_isatty(int fd)
+{
+	return isatty(fd);
+}
+
+/* files_are_same --- return true if files are identical */
+
+int
+files_are_same(char *path, SRCFILE *src)
+{
+	struct stat st;
+
+	return (stat(path, & st) == 0
+		&& st.st_dev == src->sbuf.st_dev
+		&& st.st_ino == src->sbuf.st_ino);
+}
+
+void
+init_sockets(void)
+{
+}
+
+// For MSYS, restore behavior of working in text mode.
+#ifdef __MSYS__
+void
+cygwin_premain0(int argc, char **argv, struct per_process *myself)
+{
+	static struct __cygwin_perfile pf[] = {
+		{ "", O_RDONLY | O_TEXT },
+		/*{ "", O_WRONLY | O_BINARY },*/
+		{ NULL, 0 }
+	};
+	cygwin_internal(CW_PERFILE, pf);
+}
+
+void
+cygwin_premain2(int argc, char **argv, struct per_process *myself)
+{
+	setmode(fileno (stdin), O_TEXT);
+}
+#endif
diff --git a/gawk-5.0.1/profile.c b/gawk-5.0.1/profile.c
new file mode 100644
index 00000000000..910a821dd8c
--- /dev/null
+++ b/gawk-5.0.1/profile.c
@@ -0,0 +1,2101 @@
+/*
+ * profile.c - gawk bytecode pretty-printer with counts
+ */
+
+/*
+ * Copyright (C) 1999-2019 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+static void pprint(INSTRUCTION *startp, INSTRUCTION *endp, int flags);
+static INSTRUCTION *end_line(INSTRUCTION *ip);
+static void pp_parenthesize(NODE *n);
+static void parenthesize(int type, NODE *left, NODE *right);
+static char *pp_list(int nargs, const char *paren, const char *delim);
+static char *pp_group3(const char *s1, const char *s2, const char *s3);
+static char *pp_concat(int nargs);
+static char *pp_string_or_typed_regex(const char *in_str, size_t len, int delim, bool typed_regex);
+static char *pp_typed_regex(const char *in_str, size_t len, int delim);
+static bool is_binary(int type);
+static bool is_scalar(int type);
+static int prec_level(int type);
+static void pp_push(int type, char *s, int flag, INSTRUCTION *comment);
+static NODE *pp_pop(void);
+static void print_comment(INSTRUCTION *pc, long in);
+const char *redir2str(int redirtype);
+static void pp_namespace(const char *name, INSTRUCTION *comment);
+static void pp_namespace_list(INSTRUCTION *list);
+static char *adjust_namespace(char *name, bool *malloced);
+
+#define pp_str	vname
+#define pp_len	sub.nodep.reserved
+#define pp_next	rnode
+#define pp_comment	sub.nodep.x.cmnt
+
+#define DONT_FREE 1
+#define CAN_FREE  2
+
+static void dump_and_exit(int signum) ATTRIBUTE_NORETURN;
+static void just_dump(int signum);
+
+/* pretty printing related functions and variables */
+
+static NODE *pp_stack = NULL;
+static NODE *func_params;	/* function parameters */
+static FILE *prof_fp;	/* where to send the profile */
+
+static long indent_level = 0;
+
+static const char tabs[] = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
+static const size_t tabs_len = sizeof(tabs) - 1;
+
+#define check_indent_level() \
+	if (indent_level + 1 > tabs_len) \
+		/* We're allowed to be snarky, occasionally. */ \
+		fatal(_("Program indentation level too deep. Consider refactoring your code"));
+
+
+#define SPACEOVER	0
+
+#define NO_PPRINT_FLAGS	0
+#define IN_FOR_HEADER	1
+#define IN_ELSE_IF	2
+
+/* set_prof_file --- set the output file for profiling or pretty-printing */
+
+void
+set_prof_file(const char *file)
+{
+	int fd;
+
+	assert(file != NULL);
+	fd = devopen_simple(file, "w", true);
+	if (fd == INVALID_HANDLE)
+		prof_fp = NULL;
+	else if (fd == fileno(stdout))
+		prof_fp = stdout;
+	else if (fd == fileno(stderr))
+		prof_fp = stderr;
+	else
+		prof_fp = fdopen(fd, "w");
+
+	if (prof_fp == NULL) {
+		/* don't leak file descriptors */
+		int e = errno;
+
+		if (   fd != INVALID_HANDLE
+		    && fd != fileno(stdout)
+		    && fd != fileno(stderr))
+			(void) close(fd);
+
+		errno = e;
+		warning(_("could not open `%s' for writing: %s"),
+				file, strerror(errno));
+		warning(_("sending profile to standard error"));
+		prof_fp = stderr;
+	}
+}
+
+/* init_profiling_signals --- set up signal handling for gawk --profile */
+
+void
+init_profiling_signals()
+{
+#ifdef __DJGPP__
+	signal(SIGINT, dump_and_exit);
+	signal(SIGQUIT, just_dump);
+#else  /* !__DJGPP__ */
+#ifdef SIGHUP
+	signal(SIGHUP, dump_and_exit);
+#endif
+#ifdef SIGUSR1
+	signal(SIGUSR1, just_dump);
+#endif
+#endif /* !__DJGPP__ */
+}
+
+/* indent --- print out enough tabs */
+
+static void
+indent(long count)
+{
+	int i;
+
+	if (do_profile) {
+		if (count == 0)
+			fprintf(prof_fp, "\t");
+		else
+			fprintf(prof_fp, "%6ld  ", count);
+	}
+
+	assert(indent_level >= 0);
+	for (i = 0; i < indent_level; i++)
+		fprintf(prof_fp, "\t");
+}
+
+/* indent_in --- increase the level, with error checking */
+
+static void
+indent_in(void)
+{
+	assert(indent_level >= 0);
+	indent_level++;
+}
+
+/* indent_out --- decrease the level, with error checking */
+
+static void
+indent_out(void)
+{
+	indent_level--;
+	assert(indent_level >= 0);
+}
+
+/* pp_push --- push a pretty printed string onto the stack */
+
+static void
+pp_push(int type, char *s, int flag, INSTRUCTION *comment)
+{
+	NODE *n;
+	getnode(n);
+	n->pp_str = s;
+	n->pp_len = strlen(s);
+	n->flags = flag;
+	n->type = type;
+	n->pp_next = pp_stack;
+	n->pp_comment = comment;
+	pp_stack = n;
+}
+
+/* pp_pop --- pop a pretty printed string off the stack */
+
+static NODE *
+pp_pop()
+{
+	NODE *n;
+	n = pp_stack;
+	pp_stack = n->pp_next;
+	return n;
+}
+
+/* pp_free --- release a pretty printed node */
+
+static void
+pp_free(NODE *n)
+{
+	if ((n->flags & CAN_FREE) != 0)
+		efree(n->pp_str);
+	freenode(n);
+}
+
+/* pprint --- pretty print a program segment */
+
+static void
+pprint(INSTRUCTION *startp, INSTRUCTION *endp, int flags)
+{
+	INSTRUCTION *pc;
+	NODE *t1;
+	char *str;
+	NODE *t2;
+	INSTRUCTION *ip1;
+	INSTRUCTION *ip2;
+	NODE *m;
+	char *tmp;
+	int rule;
+	static int rule_count[MAXRULE];
+	static bool skip_comment = false;
+
+	for (pc = startp; pc != endp; pc = pc->nexti) {
+		if (pc->source_line > 0)
+			sourceline = pc->source_line;
+
+		/* skip leading EOL comment as it has already been printed  */
+		if (pc->opcode == Op_comment
+		    && pc->memory->comment_type == EOL_COMMENT
+		    && skip_comment) {
+			skip_comment = false;
+			continue;
+		}
+		skip_comment = false;
+
+		switch (pc->opcode) {
+		case Op_rule:
+			/*
+			 * Rules are four instructions long.
+			 * See append_rule in awkgram.y.
+			 * The first has the Rule Op Code, nexti etc.
+			 * The second, (pc + 1) has firsti and lasti:
+			 * 	the first/last ACTION instructions for this rule.
+			 * The third has first_line and last_line:
+			 * 	the first and last source line numbers.
+			 * The fourth holds the namespace name if there is one.
+			 *	(there should be one if we're in this file)
+			 * This can actually be a list in reverse order if
+			 * there were several @namespace directives one
+			 * after the other.
+			 */
+			source = pc->source_file;
+			rule = pc->in_rule;
+
+			pp_namespace_list(pc[3].nexti);
+
+			if (rule != Rule) {
+				/* Allow for pre-non-rule-block comment  */
+				if (pc->nexti != (pc+1)->firsti
+				    && pc->nexti->opcode == Op_comment
+				    && pc->nexti->memory->comment_type == BLOCK_COMMENT)
+					print_comment(pc->nexti, -1);
+				ip1 = (pc + 1)->firsti;
+				ip2 = (pc + 1)->lasti;
+
+				if (do_profile) {
+					if (! rule_count[rule]++)
+						fprintf(prof_fp, _("\t# %s rule(s)\n\n"), ruletab[rule]);
+					indent(0);
+				}
+				fprintf(prof_fp, "%s {", ruletab[rule]);
+				end_line(pc);
+				skip_comment = true;
+			} else {
+				if (do_profile && ! rule_count[rule]++)
+					fprintf(prof_fp, _("\t# Rule(s)\n\n"));
+				ip1 = pc->nexti;
+				indent(ip1->exec_count);
+				if (ip1 != (pc + 1)->firsti) {		/* non-empty pattern */
+					pprint(ip1->nexti, (pc + 1)->firsti, NO_PPRINT_FLAGS);
+					/* Allow for case where the "pattern" is just a comment  */
+					if (ip1->nexti->nexti->nexti != (pc +1)->firsti
+					    || ip1->nexti->opcode != Op_comment) {
+						t1 = pp_pop();
+						fprintf(prof_fp, "%s {", t1->pp_str);
+						pp_free(t1);
+					} else
+						fprintf(prof_fp, "{");
+					ip1 = (pc + 1)->firsti;
+					ip2 = (pc + 1)->lasti;
+
+					if (do_profile && ip1->exec_count > 0)
+						fprintf(prof_fp, " # %ld", ip1->exec_count);
+
+					end_line(ip1);
+					skip_comment = true;
+				} else {
+					fprintf(prof_fp, "{\n");
+					ip1 = (pc + 1)->firsti;
+					ip2 = (pc + 1)->lasti;
+				}
+				ip1 = ip1->nexti;
+			}
+			indent_in();
+			pprint(ip1, ip2, NO_PPRINT_FLAGS);
+			indent_out();
+			if (do_profile)
+				indent(0);
+			fprintf(prof_fp, "}\n\n");
+			pc = (pc + 1)->lasti;
+			break;
+
+		case Op_atexit:
+			break;
+
+		case Op_stop:
+			memset(rule_count, 0, MAXRULE * sizeof(int));
+			break;
+
+		case Op_push_i:
+			m = pc->memory;
+			if (m == Nnull_string)	/* optional return or exit value; don't print 0 or "" */
+				pp_push(pc->opcode, m->stptr, DONT_FREE, pc->comment);
+			else if ((m->flags & NUMBER) != 0)
+				pp_push(pc->opcode, pp_number(m), CAN_FREE, pc->comment);
+			else {
+				str = pp_string(m->stptr, m->stlen, '"');
+				if ((m->flags & INTLSTR) != 0) {
+					char *tmp = str;
+					str = pp_group3("_", tmp, "");
+					efree(tmp);
+				}
+				pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			}
+			break;
+
+		case Op_store_var:
+			if (pc->initval != NULL)
+				pp_push(Op_push_i, pp_node(pc->initval), CAN_FREE, pc->comment);
+			/* fall through */
+		case Op_store_sub:
+		case Op_assign_concat:
+		case Op_push_lhs:
+		case Op_push_param:
+		case Op_push_array:
+		case Op_push:
+		case Op_push_arg:
+		case Op_push_arg_untyped:
+			m = pc->memory;
+			switch (m->type) {
+			case Node_param_list:
+				pp_push(pc->opcode, func_params[m->param_cnt].param, DONT_FREE, pc->comment);
+				break;
+
+			case Node_var:
+			case Node_var_new:
+			case Node_var_array:
+				if (m->vname != NULL) {
+					bool malloced = false;
+					char *name = adjust_namespace(m->vname, & malloced);
+
+					pp_push(pc->opcode, name, malloced ? CAN_FREE : DONT_FREE, pc->comment);
+				} else
+					fatal(_("internal error: %s with null vname"),
+							nodetype2str(m->type));
+				break;
+
+			default:
+				cant_happen();
+			}
+
+			switch (pc->opcode) {
+			case Op_store_var:
+				t2 = pp_pop(); /* l.h.s. */
+				t1 = pp_pop(); /* r.h.s. */
+				fprintf(prof_fp, "%s%s%s", t2->pp_str, op2str(pc->opcode), t1->pp_str);
+				goto cleanup;
+
+			case Op_store_sub:
+				t1 = pp_pop();	/* array */
+				tmp = pp_list(pc->expr_count, op2str(Op_subscript), ", "); /*subscript*/
+				t2 = pp_pop(); /* r.h.s. */
+				fprintf(prof_fp, "%s%s%s%s", t1->pp_str, tmp,
+									op2str(pc->opcode), t2->pp_str);
+				efree(tmp);
+				goto cleanup;
+
+			case Op_assign_concat:
+				t2 = pp_pop(); /* l.h.s. */
+				t1 = pp_pop();
+				tmp = pp_group3(t2->pp_str, op2str(Op_concat), t1->pp_str);
+				fprintf(prof_fp, "%s%s%s", t2->pp_str, op2str(Op_assign), tmp);
+				efree(tmp);
+cleanup:
+				pp_free(t2);
+				pp_free(t1);
+				if ((flags & IN_FOR_HEADER) == 0)
+					pc = end_line(pc);
+				break;
+
+			default:
+				break;
+			}
+			break;
+
+		case Op_sub_array:
+		case Op_subscript_lhs:
+		case Op_subscript:
+			tmp = pp_list(pc->sub_count, op2str(pc->opcode), ", ");
+			t1 = pp_pop();
+			str = pp_group3(t1->pp_str, tmp, "");
+			efree(tmp);
+			pp_free(t1);
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			break;
+
+		case Op_and:
+		case Op_or:
+			pprint(pc->nexti, pc->target_jmp, flags);
+			t2 = pp_pop();
+			t1 = pp_pop();
+			parenthesize(pc->opcode, t1, t2);
+			if (pc->comment == NULL)
+				str = pp_group3(t1->pp_str, op2str(pc->opcode), t2->pp_str);
+			else {
+				check_indent_level();
+
+				size_t len = strlen(t1->pp_str)
+						+ strlen(op2str(pc->opcode)) + strlen(t2->pp_str)	// foo && bar
+						+ indent_level + 1				// indent
+						+ pc->comment->memory->stlen + 3;		// tab comment
+
+				emalloc(str, char *, len, "pprint");
+				sprintf(str, "%s%s%s%.*s %s", t1->pp_str, op2str(pc->opcode),
+						pc->comment->memory->stptr,
+						(int) (indent_level + 1), tabs, t2->pp_str);
+			}
+			pp_free(t1);
+			pp_free(t2);
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			pc = pc->target_jmp;
+			break;
+
+		case Op_plus_i:
+		case Op_minus_i:
+		case Op_times_i:
+		case Op_exp_i:
+		case Op_quotient_i:
+		case Op_mod_i:
+			m = pc->memory;
+			t1 = pp_pop();
+			if (prec_level(pc->opcode) > prec_level(t1->type)
+					&& is_binary(t1->type))  /* (a - b) * 1 */
+				pp_parenthesize(t1);
+			if ((m->flags & NUMBER) != 0)
+				tmp = pp_number(m);
+			else
+				tmp = pp_string(m->stptr, m->stlen, '"');
+			str = pp_group3(t1->pp_str, op2str(pc->opcode), tmp);
+			efree(tmp);
+			pp_free(t1);
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			break;
+
+		case Op_parens:
+			t1 = pp_pop();
+			str = pp_group3("(", t1->pp_str, ")");
+			pp_free(t1);
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			break;
+
+		case Op_plus:
+		case Op_minus:
+		case Op_times:
+		case Op_exp:
+		case Op_quotient:
+		case Op_mod:
+		case Op_equal:
+		case Op_notequal:
+		case Op_less:
+		case Op_greater:
+		case Op_leq:
+		case Op_geq:
+			t2 = pp_pop();
+			t1 = pp_pop();
+			parenthesize(pc->opcode, t1, t2);
+			str = pp_group3(t1->pp_str, op2str(pc->opcode), t2->pp_str);
+			pp_free(t1);
+			pp_free(t2);
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			break;
+
+		case Op_preincrement:
+		case Op_predecrement:
+		case Op_postincrement:
+		case Op_postdecrement:
+			t1 = pp_pop();
+			if (pc->opcode == Op_preincrement || pc->opcode == Op_predecrement)
+				str = pp_group3(op2str(pc->opcode), t1->pp_str, "");
+			else
+				str = pp_group3(t1->pp_str, op2str(pc->opcode), "");
+			pp_free(t1);
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			break;
+
+		case Op_field_spec:
+		case Op_field_spec_lhs:
+		case Op_unary_minus:
+		case Op_unary_plus:
+		case Op_not:
+			t1 = pp_pop();
+			if (is_binary(t1->type)
+			    || (((OPCODE) t1->type) == pc->opcode
+				    && (pc->opcode == Op_unary_minus
+					    || pc->opcode == Op_unary_plus)))
+				pp_parenthesize(t1);
+
+			/* optypes table (eval.c) includes space after ! */
+			str = pp_group3(op2str(pc->opcode), t1->pp_str, "");
+			pp_free(t1);
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			break;
+
+		case Op_assign:
+		case Op_assign_plus:
+		case Op_assign_minus:
+		case Op_assign_times:
+		case Op_assign_quotient:
+		case Op_assign_mod:
+		case Op_assign_exp:
+			t2 = pp_pop(); /* l.h.s. */
+			t1 = pp_pop();
+			str = pp_group3(t2->pp_str, op2str(pc->opcode), t1->pp_str);
+			pp_free(t2);
+			pp_free(t1);
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			break;
+
+		case Op_store_field:
+			t1 = pp_pop(); /* field num */
+			if (is_binary(t1->type))
+				pp_parenthesize(t1);
+			t2 = pp_pop(); /* r.h.s. */
+			fprintf(prof_fp, "$%s%s%s", t1->pp_str, op2str(pc->opcode), t2->pp_str);
+			pp_free(t2);
+			pp_free(t1);
+			if ((flags & IN_FOR_HEADER) == 0)
+				pc = end_line(pc);
+			break;
+
+		case Op_concat:
+			str = pp_concat(pc->expr_count);
+			pp_push(Op_concat, str, CAN_FREE, pc->comment);
+			break;
+
+		case Op_K_delete:
+		{
+			char *array;
+			t1 = pp_pop();
+			array = t1->pp_str;
+			if (pc->expr_count > 0) {
+				char *sub;
+				sub = pp_list(pc->expr_count, NULL, pc->expr_count > 1 ? "][" : ", ");
+				fprintf(prof_fp, "%s %s[%s]", op2str(Op_K_delete), array, sub);
+				efree(sub);
+			} else
+				fprintf(prof_fp, "%s %s", op2str(Op_K_delete), array);
+			if ((flags & IN_FOR_HEADER) == 0)
+				pc = end_line(pc);
+			pp_free(t1);
+		}
+			break;
+
+		case Op_K_delete_loop:
+			/* Efficency hack not in effect because of exec_count instruction */
+			cant_happen();
+			break;
+
+		case Op_in_array:
+		{
+			char *array, *sub;
+			t1 = pp_pop();
+			array = t1->pp_str;
+			if (pc->expr_count > 1) {
+				sub = pp_list(pc->expr_count, "()", ", ");
+				str = pp_group3(sub, op2str(Op_in_array), array);
+				efree(sub);
+			} else {
+				t2 = pp_pop();
+				if (prec_level(t2->type) < prec_level(Op_in_array)) {
+					pp_parenthesize(t2);
+				}
+				sub = t2->pp_str;
+				str = pp_group3(sub, op2str(Op_in_array), array);
+				pp_free(t2);
+			}
+			pp_free(t1);
+			pp_push(Op_in_array, str, CAN_FREE, pc->comment);
+		}
+			break;
+
+		case Op_var_update:
+		case Op_var_assign:
+		case Op_field_assign:
+		case Op_subscript_assign:
+		case Op_arrayfor_init:
+		case Op_arrayfor_incr:
+		case Op_arrayfor_final:
+		case Op_newfile:
+		case Op_get_record:
+		case Op_lint:
+		case Op_jmp:
+		case Op_jmp_false:
+		case Op_jmp_true:
+		case Op_no_op:
+		case Op_and_final:
+		case Op_or_final:
+		case Op_cond_pair:
+		case Op_after_beginfile:
+		case Op_after_endfile:
+			break;
+
+		case Op_sub_builtin:
+		{
+			const char *fname = "sub";
+			if ((pc->sub_flags & GSUB) != 0)
+				fname = "gsub";
+			else if ((pc->sub_flags & GENSUB) != 0)
+				fname = "gensub";
+			tmp = pp_list(pc->expr_count, "()", ", ");
+			str = pp_group3(fname, tmp, "");
+			efree(tmp);
+			pp_push(Op_sub_builtin, str, CAN_FREE, pc->comment);
+		}
+			break;
+
+		case Op_builtin:
+		case Op_ext_builtin:
+		{
+			const char *fname;
+			if (pc->opcode == Op_builtin) {
+				bool prepend_awk = (current_namespace != awk_namespace && strcmp(current_namespace, "awk") != 0);
+				fname = getfname(pc->builtin, prepend_awk);
+			} else
+				fname = (pc + 1)->func_name;
+			if (fname != NULL) {
+				if (pc->expr_count > 0) {
+					tmp = pp_list(pc->expr_count, "()", ", ");
+					str = pp_group3(fname, tmp, "");
+					efree(tmp);
+				} else
+					str = pp_group3(fname, "()", "");
+				pp_push(Op_builtin, str, CAN_FREE, pc->comment);
+			} else
+				fatal(_("internal error: builtin with null fname"));
+		}
+			break;
+
+		case Op_K_print:
+		case Op_K_printf:
+		case Op_K_print_rec:
+			if (pc->opcode == Op_K_print_rec)
+				// instead of `print $0', just `print'
+				tmp = strdup("");
+			else if (pc->redir_type != 0)
+				tmp = pp_list(pc->expr_count, "()", ", ");
+			else {
+				tmp = pp_list(pc->expr_count, "  ", ", ");
+				tmp[strlen(tmp) - 1] = '\0';	/* remove trailing space */
+			}
+
+			if (pc->redir_type != 0) {
+				t1 = pp_pop();
+				if (is_binary(t1->type))
+					pp_parenthesize(t1);
+				fprintf(prof_fp, "%s%s%s%s", op2str(pc->opcode),
+							tmp, redir2str(pc->redir_type), t1->pp_str);
+				pp_free(t1);
+			} else
+				fprintf(prof_fp, "%s%s", op2str(pc->opcode), tmp);
+			efree(tmp);
+			if ((flags & IN_FOR_HEADER) == 0)
+				pc = end_line(pc);
+			break;
+
+		case Op_push_re:
+			if (pc->memory->type != Node_regex && (pc->memory->flags & REGEX) == 0)
+				break;
+			/* else
+				fall through */
+		case Op_match_rec:
+		{
+			if (pc->memory->type == Node_regex) {
+				NODE *re = pc->memory->re_exp;
+				str = pp_string(re->stptr, re->stlen, '/');
+			} else {
+				assert((pc->memory->flags & REGEX) != 0);
+				str = pp_typed_regex(pc->memory->stptr, pc->memory->stlen, '/');
+			}
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+		}
+			break;
+
+		case Op_nomatch:
+		case Op_match:
+		{
+			char *restr, *txt;
+			t1 = pp_pop();
+			if (is_binary(t1->type))
+				pp_parenthesize(t1);
+			txt = t1->pp_str;
+			m = pc->memory;
+			if (m->type == Node_dynregex) {
+				restr = txt;
+				t2 = pp_pop();
+				if (is_binary(t2->type))
+					pp_parenthesize(t2);
+				txt = t2->pp_str;
+				str = pp_group3(txt, op2str(pc->opcode), restr);
+				pp_free(t2);
+			} else if (m->type == Node_val && (m->flags & REGEX) != 0) {
+				restr = pp_typed_regex(m->stptr, m->stlen, '/');
+				str = pp_group3(txt, op2str(pc->opcode), restr);
+				efree(restr);
+			} else {
+				NODE *re = m->re_exp;
+				restr = pp_string(re->stptr, re->stlen, '/');
+				str = pp_group3(txt, op2str(pc->opcode), restr);
+				efree(restr);
+			}
+			pp_free(t1);
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+		}
+			break;
+
+		case Op_K_getline:
+		case Op_K_getline_redir:
+			if (pc->into_var) {
+				t1 = pp_pop();
+				tmp = pp_group3(op2str(Op_K_getline), " ", t1->pp_str);
+				pp_free(t1);
+			} else
+				tmp = pp_group3(op2str(Op_K_getline), "", "");
+
+			if (pc->redir_type != 0) {
+				int before = (pc->redir_type == redirect_pipein
+							|| pc->redir_type == redirect_twoway);
+
+				t2 = pp_pop();
+				if (is_binary(t2->type))
+					pp_parenthesize(t2);
+				if (before)
+					str = pp_group3(t2->pp_str, redir2str(pc->redir_type), tmp);
+				else
+					str = pp_group3(tmp, redir2str(pc->redir_type), t2->pp_str);
+				efree(tmp);
+				pp_free(t2);
+			} else
+				str = tmp;
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			break;
+
+		case Op_indirect_func_call:
+		case Op_func_call:
+		{
+			char *pre;
+ 			int pcount;
+			bool malloced = false;
+			char *fname = adjust_namespace(pc->func_name, & malloced);
+
+			if (pc->opcode == Op_indirect_func_call)
+				pre = "@";
+			else
+				pre = "";
+			pcount = (pc + 1)->expr_count;
+			if (pcount > 0) {
+				tmp = pp_list(pcount, "()", ", ");
+				str = pp_group3(pre, fname, tmp);
+				efree(tmp);
+			} else
+				str = pp_group3(pre, fname, "()");
+			if (pc->opcode == Op_indirect_func_call) {
+				t1 = pp_pop();	/* indirect var */
+				pp_free(t1);
+			}
+
+			pp_push(pc->opcode, str, CAN_FREE, pc->comment);
+			if (malloced)
+				efree((void *) fname);
+		}
+			break;
+
+		case Op_K_continue:
+		case Op_K_break:
+		case Op_K_nextfile:
+		case Op_K_next:
+			fprintf(prof_fp, "%s", op2str(pc->opcode));
+			pc = end_line(pc);
+			break;
+
+		case Op_K_return:
+		case Op_K_exit:
+			t1 = pp_pop();
+			if (is_binary(t1->type))
+				pp_parenthesize(t1);
+			if (pc->source_line > 0) {	/* don't print implicit 'return' at end of function */
+				// avoid final trailing space to keep whiny users happy
+				if (t1->pp_str[0] != '\0')
+					fprintf(prof_fp, "%s %s", op2str(pc->opcode), t1->pp_str);
+				else
+					fprintf(prof_fp, "%s", op2str(pc->opcode));
+				pc = end_line(pc);
+			}
+			pp_free(t1);
+			break;
+
+		case Op_pop:
+			t1 = pp_pop();
+			fprintf(prof_fp, "%s", t1->pp_str);
+			if ((flags & IN_FOR_HEADER) == 0)
+				pc = end_line(pc);
+			pp_free(t1);
+			break;
+
+		case Op_line_range:
+			ip1 = pc + 1;
+			pprint(pc->nexti, ip1->condpair_left, NO_PPRINT_FLAGS);
+			pprint(ip1->condpair_left->nexti, ip1->condpair_right, NO_PPRINT_FLAGS);
+			t2 = pp_pop();
+			t1 = pp_pop();
+			str = pp_group3(t1->pp_str, ", ", t2->pp_str);
+			pp_free(t1);
+			pp_free(t2);
+			pp_push(Op_line_range, str, CAN_FREE, pc->comment);
+			pc = ip1->condpair_right;
+			break;
+
+		case Op_K_while:
+			ip1 = pc + 1;
+			indent(ip1->while_body->exec_count);
+			fprintf(prof_fp, "%s (", op2str(pc->opcode));
+			pprint(pc->nexti, ip1->while_body, NO_PPRINT_FLAGS);
+			t1 = pp_pop();
+			fprintf(prof_fp, "%s) {", t1->pp_str);
+			pp_free(t1);
+			ip1->while_body = end_line(ip1->while_body);
+			indent_in();
+			pprint(ip1->while_body->nexti, pc->target_break, NO_PPRINT_FLAGS);
+			indent_out();
+			indent(SPACEOVER);
+			fprintf(prof_fp, "}");
+			pc = end_line(pc->target_break);
+			break;
+
+		case Op_K_do:
+			ip1 = pc + 1;
+			indent(pc->nexti->exec_count);
+			fprintf(prof_fp, "%s {", op2str(pc->opcode));
+			end_line(pc->nexti);
+			skip_comment = true;
+			indent_in();
+			pprint(pc->nexti->nexti, ip1->doloop_cond, NO_PPRINT_FLAGS);
+			indent_out();
+			pprint(ip1->doloop_cond, pc->target_break, NO_PPRINT_FLAGS);
+			indent(SPACEOVER);
+			t1 = pp_pop();
+			fprintf(prof_fp, "} %s (%s)", op2str(Op_K_while), t1->pp_str);
+			if (pc->comment)
+				fprintf(prof_fp, "\t%s", pc->comment->memory->stptr);
+			else {
+				end_line(pc->target_break);
+				skip_comment = true;
+			}
+			pp_free(t1);
+			pc = pc->target_break;
+			break;
+
+		case Op_K_for:
+		{
+			INSTRUCTION *comment1 = NULL, *comment2 = NULL;
+
+			if (pc->comment != NULL) {
+				comment1 = pc->comment;
+				pc->comment = NULL;
+				if (comment1 != NULL && comment1->comment != NULL) {
+					comment2 = comment1->comment;
+					comment1->comment = NULL;
+				}
+				if (comment2 == NULL && comment1->memory->comment_type == FOR_COMMENT) {
+					comment2 = comment1;
+					comment2->memory->comment_type = EOL_COMMENT;
+					comment1 = NULL;
+				}
+			}
+
+			ip1 = pc + 1;
+			indent(ip1->forloop_body->exec_count);
+			fprintf(prof_fp, "%s (", op2str(pc->opcode));
+
+			/* If empty for looop header, print it a little more nicely. */
+			if (   pc->nexti->opcode == Op_no_op
+			    && ip1->forloop_cond == pc->nexti
+			    && pc->target_continue->opcode == Op_jmp
+			    && comment1 == NULL && comment2 == NULL) {
+				fprintf(prof_fp, ";;");
+			} else {
+				pprint(pc->nexti, ip1->forloop_cond, IN_FOR_HEADER);
+				fprintf(prof_fp, "; ");
+
+				if (comment1 != NULL) {
+					print_comment(comment1, 0);
+					indent(ip1->forloop_body->exec_count);
+					indent(1);
+				}
+
+				if (ip1->forloop_cond->opcode == Op_no_op &&
+						ip1->forloop_cond->nexti == ip1->forloop_body)
+					fprintf(prof_fp, "; ");
+				else {
+					pprint(ip1->forloop_cond, ip1->forloop_body, IN_FOR_HEADER);
+					t1 = pp_pop();
+					fprintf(prof_fp, "%s; ", t1->pp_str);
+					pp_free(t1);
+				}
+
+				if (comment2 != NULL) {
+					print_comment(comment2, 0);
+					indent(ip1->forloop_body->exec_count);
+					indent(1);
+				}
+
+				pprint(pc->target_continue, pc->target_break, IN_FOR_HEADER);
+			}
+			fprintf(prof_fp, ") {");
+			end_line(ip1->forloop_body);
+			skip_comment = true;
+			indent_in();
+			pprint(ip1->forloop_body->nexti, pc->target_continue, NO_PPRINT_FLAGS);
+			indent_out();
+			indent(SPACEOVER);
+			fprintf(prof_fp, "}");
+			end_line(pc->target_break);
+			skip_comment = true;
+			pc = pc->target_break;
+		}
+			break;
+
+		case Op_K_arrayfor:
+		{
+			char *array;
+			const char *item;
+
+			ip1 = pc + 1;
+			t1 = pp_pop();
+			array = t1->pp_str;
+			m = ip1->forloop_cond->array_var;
+			if (m->type == Node_param_list)
+				item = func_params[m->param_cnt].param;
+			else
+				item = m->vname;
+			indent(ip1->forloop_body->exec_count);
+			fprintf(prof_fp, "%s (%s%s%s) {", op2str(Op_K_arrayfor),
+						item, op2str(Op_in_array), array);
+			end_line(ip1->forloop_body);
+			skip_comment = true;
+			indent_in();
+			pp_free(t1);
+			pprint(ip1->forloop_body->nexti, pc->target_break, NO_PPRINT_FLAGS);
+			indent_out();
+			indent(SPACEOVER);
+			fprintf(prof_fp, "}");
+			end_line(pc->target_break);
+			skip_comment = true;
+			pc = pc->target_break;
+		}
+			break;
+
+		case Op_K_switch:
+			ip1 = pc + 1;
+			fprintf(prof_fp, "%s (", op2str(pc->opcode));
+			pprint(pc->nexti, ip1->switch_start, NO_PPRINT_FLAGS);
+			t1 = pp_pop();
+			fprintf(prof_fp, "%s) {\n", t1->pp_str);
+			if (pc->comment)
+				print_comment(pc->comment, 0);
+			pp_free(t1);
+			pprint(ip1->switch_start, ip1->switch_end, NO_PPRINT_FLAGS);
+			indent(SPACEOVER);
+			fprintf(prof_fp, "}\n");
+			if (ip1->switch_end->comment)
+				print_comment(ip1->switch_end->comment, 0);
+			pc = pc->target_break;
+			break;
+
+		case Op_K_case:
+		case Op_K_default:
+			indent(pc->stmt_start->exec_count);
+			if (pc->opcode == Op_K_case) {
+				t1 = pp_pop();
+				fprintf(prof_fp, "%s %s:", op2str(pc->opcode), t1->pp_str);
+				pp_free(t1);
+			} else
+				fprintf(prof_fp, "%s:", op2str(pc->opcode));
+
+			indent_in();
+			if (pc->comment != NULL) {
+				if (pc->comment->memory->comment_type == EOL_COMMENT)
+					fprintf(prof_fp, "\t%s", pc->comment->memory->stptr);
+				else {
+					fprintf(prof_fp, "\n");
+					print_comment(pc->comment, indent_level);
+				}
+			} else
+				fprintf(prof_fp, "\n");
+			pprint(pc->stmt_start->nexti, pc->stmt_end->nexti, NO_PPRINT_FLAGS);
+			indent_out();
+			break;
+
+		case Op_K_if:
+			fprintf(prof_fp, "%s (", op2str(pc->opcode));
+			pprint(pc->nexti, pc->branch_if, NO_PPRINT_FLAGS);
+			t1 = pp_pop();
+			fprintf(prof_fp, "%s) {", t1->pp_str);
+			pp_free(t1);
+
+			ip1 = pc->branch_if;
+			if (ip1->exec_count > 0)
+				fprintf(prof_fp, " # %ld", ip1->exec_count);
+			ip1 = end_line(ip1);
+			indent_in();
+			if (pc->comment != NULL)
+				print_comment(pc->comment, indent_level);
+			pprint(ip1->nexti, pc->branch_else, NO_PPRINT_FLAGS);
+			indent_out();
+			pc = pc->branch_else;
+			if (pc->nexti->opcode == Op_no_op) {	/* no following else */
+				indent(SPACEOVER);
+				fprintf(prof_fp, "}");
+				if (pc->nexti->nexti->opcode != Op_comment
+				    || pc->nexti->nexti->memory->comment_type == BLOCK_COMMENT)
+					fprintf(prof_fp, "\n");
+				/* else
+				 	It will be printed at the top. */
+			}
+			/*
+			 * See next case; turn off the flag so that the
+			 * following else is correctly indented.
+			 */
+			flags &= ~IN_ELSE_IF;
+			break;
+
+		case Op_K_else:
+			/*
+			 * If possible, chain else-if's together on the
+			 * same line.
+			 *
+			 * See awkgram.y:mk_condition to understand
+			 * what is being checked here.
+			 *
+			 * Op_exec_count follows Op_K_else, check the
+			 * opcode of the following instruction.
+			 * Additionally, check that the subsequent if
+			 * terminates where this else does; in that case
+			 * it's ok to compact the if to follow the else.
+			 */
+
+			fprintf(prof_fp, "} %s ", op2str(pc->opcode));
+			if (pc->nexti->nexti->opcode == Op_K_if
+			    && pc->branch_end == pc->nexti->nexti->branch_else->lasti) {
+				pprint(pc->nexti, pc->branch_end, IN_ELSE_IF);
+			} else {
+				fprintf(prof_fp, "{");
+				end_line(pc);
+				skip_comment = true;
+				indent_in();
+				if (pc->comment != NULL)
+					print_comment(pc->comment, indent_level);
+				pprint(pc->nexti, pc->branch_end, NO_PPRINT_FLAGS);
+				indent_out();
+				indent(SPACEOVER);
+				fprintf(prof_fp, "}");
+				end_line(pc->branch_end);
+				skip_comment = true;
+			}
+			/*
+			 * Don't do end_line() here, we get multiple blank lines after
+			 * the final else in a chain of else-ifs since they all point
+			 * to the same branch_end.
+			 */
+			pc = pc->branch_end;
+			break;
+
+		case Op_cond_exp:
+		{
+			NODE *f, *t, *cond;
+			size_t len;
+			INSTRUCTION *qm_comment = NULL, *colon_comment = NULL;
+
+			qm_comment = pc->comment;
+
+			pprint(pc->nexti, pc->branch_if, NO_PPRINT_FLAGS);
+			ip1 = pc->branch_if;
+			pprint(ip1->nexti, pc->branch_else, NO_PPRINT_FLAGS);
+			ip1 = pc->branch_else->nexti;
+
+			pc = ip1->nexti;
+			colon_comment = pc->comment;
+			assert(pc->opcode == Op_cond_exp);
+			pprint(pc->nexti, pc->branch_end, NO_PPRINT_FLAGS);
+
+			f = pp_pop();
+			t = pp_pop();
+			cond = pp_pop();
+
+			/*
+			 * This stuff handles comments that come after a ?, :, or both.
+			 * Allowing newlines after ? and : is a gawk extension.
+			 * Theoretically this is fragile, since ?: expressions can be nested.
+			 * In practice, it's not, since if there was a comment following ? or :
+			 * in the original code, then it wasn't nested.
+			 */
+
+			len = f->pp_len + t->pp_len + cond->pp_len + 12;
+			if (qm_comment == NULL && colon_comment == NULL) {
+				// easy case
+				emalloc(str, char *, len, "pprint");
+				sprintf(str, "%s ? %s : %s", cond->pp_str, t->pp_str, f->pp_str);
+			} else if (qm_comment != NULL && colon_comment != NULL) {
+				check_indent_level();
+				len += qm_comment->memory->stlen +		// comments
+					colon_comment->memory->stlen +
+					2 * (indent_level + 1) + 3 +		// indentation
+					t->pp_len + 6;
+				emalloc(str, char *, len, "pprint");
+				sprintf(str,
+					"%s ? %s"	// cond ? comment
+					"%.*s   %s"	// indent true-part
+					" : %s"		// : comment
+					"%.*s   %s",	// indent false-part
+					cond->pp_str,	// condition
+					qm_comment->memory->stptr,	// comment
+					(int) (indent_level + 1), tabs,		// indent
+					t->pp_str,			// true part
+					colon_comment->memory->stptr,	// comment
+					(int) (indent_level + 1), tabs,		// indent
+					f->pp_str			// false part
+					);
+			} else if (qm_comment != NULL) {
+				check_indent_level();
+				len += qm_comment->memory->stlen +	// comment
+					1 * (indent_level + 1) + 3 +	// indentation
+					t->pp_len + 3;
+				emalloc(str, char *, len, "pprint");
+				sprintf(str,
+					"%s ? %s"	// cond ? comment
+					"%.*s   %s"	// indent true-part
+					" : %s",	// : false-part
+					cond->pp_str,	// condition
+					qm_comment->memory->stptr,	// comment
+					(int) (indent_level + 1), tabs,		// indent
+					t->pp_str,			// true part
+					f->pp_str			// false part
+					);
+			} else {
+				check_indent_level();
+				len += colon_comment->memory->stlen +		// comment
+					1 * (indent_level + 1) + 3 +		// indentation
+					t->pp_len + 3;
+				emalloc(str, char *, len, "pprint");
+				sprintf(str,
+					"%s ? %s"	// cond ? true-part
+					" : %s"		// : comment
+					"%.*s   %s",	// indent false-part
+					cond->pp_str,			// condition
+					t->pp_str,			// true part
+					colon_comment->memory->stptr,	// comment
+					(int) (indent_level + 1), tabs,		// indent
+					f->pp_str			// false part
+					);
+			}
+
+			pp_free(cond);
+			pp_free(t);
+			pp_free(f);
+			pp_push(Op_cond_exp, str, CAN_FREE, pc->comment);
+			pc = pc->branch_end;
+		}
+			break;
+
+		case Op_exec_count:
+			if (flags == NO_PPRINT_FLAGS)
+				indent(pc->exec_count);
+			break;
+
+		case Op_comment:
+			print_comment(pc, 0);
+			break;
+
+		case Op_list:
+			break;
+
+		default:
+			cant_happen();
+		}
+
+		if (pc == endp)
+			break;
+	}
+}
+
+/* end_line --- end pretty print line with new line or on-line comment  */
+
+INSTRUCTION *
+end_line(INSTRUCTION *ip)
+{
+	INSTRUCTION *ret = ip;
+
+	if (ip->nexti->opcode == Op_comment
+	    && ip->nexti->memory->comment_type == EOL_COMMENT) {
+		fprintf(prof_fp, "\t");
+		print_comment(ip->nexti, -1);
+		ret = ip->nexti;
+	}
+	else
+		fprintf(prof_fp, "\n");
+
+	return ret;
+}
+
+/* pp_string_fp --- pretty print a string to the fp */
+
+/*
+ * This routine concentrates string pretty printing in one place,
+ * so that it can be called from multiple places within gawk.
+ */
+
+void
+pp_string_fp(Func_print print_func, FILE *fp, const char *in_str,
+		size_t len, int delim, bool breaklines)
+{
+	char *s = pp_string(in_str, len, delim);
+	int count;
+	size_t slen;
+	const char *str = (const char *) s;
+#define BREAKPOINT	70 /* arbitrary */
+
+	slen = strlen(str);
+	for (count = 0; slen > 0; slen--, str++) {
+		print_func(fp, "%c", *str);
+		if (++count >= BREAKPOINT && breaklines) {
+			print_func(fp, "%c\n%c", delim, delim);
+			count = 0;
+		}
+	}
+	efree(s);
+}
+
+
+/* just_dump --- dump the profile and function stack and keep going */
+
+static void
+just_dump(int signum)
+{
+	extern INSTRUCTION *code_block;
+
+	dump_prog(code_block);
+	dump_funcs();
+	dump_fcall_stack(prof_fp);
+	fflush(prof_fp);
+	signal(signum, just_dump);	/* for OLD Unix systems ... */
+}
+
+/* dump_and_exit --- dump the profile, the function stack, and exit */
+
+static void
+dump_and_exit(int signum)
+{
+	just_dump(signum);
+	final_exit(EXIT_FAILURE);
+}
+
+/* print_lib_list --- print a list of all libraries loaded */
+
+static void
+print_lib_list(FILE *prof_fp)
+{
+	SRCFILE *s;
+	static bool printed_header = false;
+	const char *indent = "";
+	bool found = false;
+
+	if (do_profile)
+		indent = "\t";
+
+	for (s = srcfiles->next; s != srcfiles; s = s->next) {
+		if (s->stype == SRC_EXTLIB) {
+			if (do_profile && ! printed_header) {
+				printed_header = true;
+				fprintf(prof_fp, _("%s# Loaded extensions (-l and/or @load)\n\n"), indent);
+			}
+			found = true;
+			fprintf(prof_fp, "%s@load \"%s\"", indent, s->src);
+			if (s->comment != NULL) {
+				fprintf(prof_fp, "\t");
+				print_comment(s->comment, indent_level + 1);
+			} else
+				fprintf(prof_fp, "\n");
+		}
+	}
+	if (found)	/* we found some */
+		fprintf(prof_fp, "\n");
+}
+
+/* print_include_list --- print a list of all files included */
+
+static void
+print_include_list(FILE *prof_fp)
+{
+	SRCFILE *s;
+	static bool printed_header = false;
+	bool found = false;
+
+	if (do_profile)
+		return;
+
+	for (s = srcfiles->next; s != srcfiles; s = s->next) {
+		if (s->stype == SRC_INC) {
+			if (! printed_header) {
+				printed_header = true;
+				fprintf(prof_fp, _("\n# Included files (-i and/or @include)\n\n"));
+			}
+			found = true;
+			fprintf(prof_fp, "# @include \"%s\"", s->src);
+			if (s->comment != NULL) {
+				fprintf(prof_fp, "\t");
+				print_comment(s->comment, indent_level + 1);
+			} else
+				fprintf(prof_fp, "\n");
+		}
+	}
+	if (found)	/* we found some */
+		fprintf(prof_fp, "\n");
+}
+
+/* print_comment --- print comment text with proper indentation */
+
+static void
+print_comment(INSTRUCTION* pc, long in)
+{
+	char *text;
+	size_t count;
+	bool after_newline = false;
+
+	count = pc->memory->stlen;
+	text = pc->memory->stptr;
+
+	if (in >= 0)
+		indent(in);    /* is this correct? Where should comments go?  */
+	for (; count > 0; count--, text++) {
+		if (after_newline) {
+			indent(in);
+			after_newline = false;
+		}
+		putc(*text, prof_fp);
+		after_newline = (*text == '\n');
+	}
+
+	if (pc->comment) {
+		// chaining should only be two deep
+		assert(pc->comment->comment == NULL);
+		// if first was EOL comment, next must be block comment,
+		// it needs to be indented.
+		if (pc->memory->comment_type == EOL_COMMENT)
+			in++;
+		print_comment(pc->comment, in);
+	}
+}
+
+/* dump_prog --- dump the program */
+
+/*
+ * XXX: I am not sure it is right to have the strings in the dump
+ * be translated, but I'll leave it alone for now.
+ */
+
+void
+dump_prog(INSTRUCTION *code)
+{
+	time_t now;
+
+	(void) time(& now);
+	/* \n on purpose, with \n in ctime() output */
+	if (do_profile)
+		fprintf(prof_fp, _("\t# gawk profile, created %s\n"), ctime(& now));
+	print_lib_list(prof_fp);
+	pprint(code, NULL, NO_PPRINT_FLAGS);
+	print_include_list(prof_fp);
+}
+
+/* prec_level --- return the precedence of an operator, for paren tests */
+
+static int
+prec_level(int type)
+{
+	switch (type) {
+	case Op_push_lhs:
+	case Op_push_param:
+	case Op_push_array:
+	case Op_push:
+	case Op_push_i:
+	case Op_push_re:
+	case Op_match_rec:
+	case Op_subscript:
+	case Op_subscript_lhs:
+	case Op_func_call:
+	case Op_K_delete_loop:
+	case Op_builtin:
+		return 16;
+
+	case Op_field_spec:
+	case Op_field_spec_lhs:
+		return 15;
+
+	case Op_preincrement:
+	case Op_predecrement:
+	case Op_postincrement:
+	case Op_postdecrement:
+		return 14;
+
+	case Op_exp:
+	case Op_exp_i:
+		return 13;
+
+	case Op_unary_minus:
+	case Op_unary_plus:
+	case Op_not:
+		return 12;
+
+	case Op_times:
+	case Op_times_i:
+	case Op_quotient:
+	case Op_quotient_i:
+	case Op_mod:
+	case Op_mod_i:
+		return 11;
+
+	case Op_plus:
+	case Op_plus_i:
+	case Op_minus:
+	case Op_minus_i:
+		return 10;
+
+	case Op_concat:
+	case Op_assign_concat:
+		return 9;
+
+	case Op_equal:
+	case Op_notequal:
+	case Op_greater:
+	case Op_less:
+	case Op_leq:
+	case Op_geq:
+		return 8;
+
+	case Op_match:
+	case Op_nomatch:
+		return 7;
+
+	case Op_K_getline:
+	case Op_K_getline_redir:
+		return 6;
+
+	case Op_in_array:
+		return 5;
+
+	case Op_and:
+		return 4;
+
+	case Op_or:
+		return 3;
+
+	case Op_cond_exp:
+		return 2;
+
+	case Op_assign:
+	case Op_assign_times:
+	case Op_assign_quotient:
+	case Op_assign_mod:
+	case Op_assign_plus:
+	case Op_assign_minus:
+	case Op_assign_exp:
+		return 1;
+
+	default:
+		return 0;
+	}
+}
+
+/* is_scalar --- return true if scalar, false otherwise */
+
+static bool
+is_scalar(int type)
+{
+	switch (type) {
+	case Op_push_lhs:
+	case Op_push_param:
+	case Op_push_array:
+	case Op_push:
+	case Op_push_i:
+	case Op_push_re:
+	case Op_subscript:
+	case Op_subscript_lhs:
+	case Op_func_call:
+	case Op_builtin:
+	case Op_field_spec:
+	case Op_field_spec_lhs:
+	case Op_preincrement:
+	case Op_predecrement:
+	case Op_postincrement:
+	case Op_postdecrement:
+	case Op_unary_minus:
+	case Op_unary_plus:
+	case Op_not:
+		return true;
+
+	default:
+		return false;
+	}
+}
+
+/* is_binary --- return true if type represents a binary operator */
+
+static bool
+is_binary(int type)
+{
+	switch (type) {
+	case Op_geq:
+	case Op_leq:
+	case Op_greater:
+	case Op_less:
+	case Op_notequal:
+	case Op_equal:
+	case Op_exp:
+	case Op_times:
+	case Op_quotient:
+	case Op_mod:
+	case Op_plus:
+	case Op_minus:
+	case Op_exp_i:
+	case Op_times_i:
+	case Op_quotient_i:
+	case Op_mod_i:
+	case Op_plus_i:
+	case Op_minus_i:
+	case Op_concat:
+	case Op_assign_concat:
+	case Op_match:
+	case Op_nomatch:
+	case Op_assign:
+	case Op_assign_times:
+	case Op_assign_quotient:
+	case Op_assign_mod:
+	case Op_assign_plus:
+	case Op_assign_minus:
+	case Op_assign_exp:
+	case Op_cond_exp:
+	case Op_and:
+	case Op_or:
+	case Op_in_array:
+	case Op_K_getline_redir:	/* sometimes */
+	case Op_K_getline:
+		return true;
+
+	default:
+		return false;
+	}
+}
+
+/* pp_parenthesize --- parenthesize an expression in stack */
+
+static void
+pp_parenthesize(NODE *sp)
+{
+	char *p = sp->pp_str;
+	size_t len = sp->pp_len;
+
+	if (p[0] == '(')	// already parenthesized
+		return;
+
+	emalloc(p, char *, len + 3, "pp_parenthesize");
+	*p = '(';
+	memcpy(p + 1, sp->pp_str, len);
+	p[len + 1] = ')';
+	p[len + 2] = '\0';
+	if ((sp->flags & CAN_FREE) != 0)
+		efree(sp->pp_str);
+	sp->pp_str = p;
+	sp->pp_len += 2;
+	sp->flags |= CAN_FREE;
+}
+
+/* parenthesize --- parenthesize two nodes relative to parent node type */
+
+static void
+parenthesize(int type, NODE *left, NODE *right)
+{
+	int rprec = prec_level(right->type);
+	int lprec = prec_level(left->type);
+	int prec = prec_level(type);
+
+	if (lprec < prec)
+		pp_parenthesize(left);
+	if (rprec < prec)
+		pp_parenthesize(right);
+}
+
+/* pp_string --- pretty format a string or regular regex constant */
+
+char *
+pp_string(const char *in_str, size_t len, int delim)
+{
+	return pp_string_or_typed_regex(in_str, len, delim, false);
+}
+
+/* pp_typed_regex --- pretty format a hard regex constant */
+
+static char *
+pp_typed_regex(const char *in_str, size_t len, int delim)
+{
+	return pp_string_or_typed_regex(in_str, len, delim, true);
+}
+
+/* pp_string_or_typed_regex --- pretty format a string, regex, or typed regex constant */
+
+char *
+pp_string_or_typed_regex(const char *in_str, size_t len, int delim, bool typed_regex)
+{
+	static char str_escapes[] = "\a\b\f\n\r\t\v\\";
+	static char str_printables[] = "abfnrtv\\";
+	static char re_escapes[] = "\a\b\f\n\r\t\v";
+	static char re_printables[] = "abfnrtv";
+	char *escapes;
+	char *printables;
+	char *cp;
+	int i;
+	const unsigned char *str = (const unsigned char *) in_str;
+	size_t ofre, osiz;
+	char *obuf, *obufout;
+
+	assert(delim == '"' || delim == '/');
+
+	if (delim == '/') {
+		escapes = re_escapes;
+		printables = re_printables;
+	} else {
+		escapes = str_escapes;
+		printables = str_printables;
+	}
+
+/* make space for something l big in the buffer */
+#define chksize(l)  if ((l) > ofre) { \
+		long olen = obufout - obuf; \
+		erealloc(obuf, char *, osiz * 2, "pp_string"); \
+		obufout = obuf + olen; \
+		ofre += osiz; \
+		osiz *= 2; \
+	} ofre -= (l)
+
+	/* initial size; 3 for delim + terminating null, 1 for @ */
+	osiz = len + 3 + 1 + (typed_regex == true);
+	emalloc(obuf, char *, osiz, "pp_string");
+	obufout = obuf;
+	ofre = osiz - 1;
+
+	if (typed_regex)
+		*obufout++ = '@';
+
+	*obufout++ = delim;
+	for (; len > 0; len--, str++) {
+		chksize(2);		/* make space for 2 chars */
+		if (delim != '/' && *str == delim) {
+			*obufout++ = '\\';
+			*obufout++ = delim;
+		} else if (*str == '\0') {
+			*obufout++ = '\\';
+			*obufout++ = '0';
+			chksize(2);	/* need 2 more chars for this case */
+			*obufout++ = '0';
+			*obufout++ = '0';
+		} else if ((cp = strchr(escapes, *str)) != NULL) {
+			i = cp - escapes;
+			*obufout++ = '\\';
+			*obufout++ = printables[i];
+		/* NB: Deliberate use of lower-case versions. */
+		} else if (isascii(*str) && isprint(*str)) {
+			*obufout++ = *str;
+			ofre += 1;	/* used 1 less than expected */
+		} else {
+			size_t len;
+
+			chksize(8);		/* total available space is 10 */
+
+			sprintf(obufout, "\\%03o", *str & 0xff);
+			len = strlen(obufout);
+			ofre += (10 - len);	 /* adjust free space count */
+			obufout += len;
+		}
+	}
+	chksize(2);
+	*obufout++ = delim;
+	*obufout = '\0';
+	return obuf;
+#undef chksize
+}
+
+/* pp_number --- pretty format a number */
+
+char *
+pp_number(NODE *n)
+{
+	char *str;
+
+	assert((n->flags & NUMCONSTSTR) != 0);
+	emalloc(str, char *, n->stlen + 1, "pp_number");
+	strcpy(str, n->stptr);
+	return str;
+}
+
+/* pp_node --- pretty format a node */
+
+char *
+pp_node(NODE *n)
+{
+	if ((n->flags & NUMBER) != 0)
+		return pp_number(n);
+	return pp_string(n->stptr, n->stlen, '"');
+}
+
+/* pp_list --- pretty print a list, with surrounding characters and separator */
+
+static NODE **pp_args = NULL;
+static int npp_args;
+
+static char *
+pp_list(int nargs, const char *paren, const char *delim)
+{
+	NODE *r;
+ 	char *str, *s;
+	size_t len;
+	size_t delimlen;
+	int i;
+	INSTRUCTION *comment = NULL;
+
+	if (pp_args == NULL) {
+		npp_args = nargs;
+		emalloc(pp_args, NODE **, (nargs + 2) * sizeof(NODE *), "pp_list");
+	} else if (nargs > npp_args) {
+		npp_args = nargs;
+		erealloc(pp_args, NODE **, (nargs + 2) * sizeof(NODE *), "pp_list");
+	}
+
+	delimlen = strlen(delim);
+	if (nargs == 0)
+		len = 2;
+	else {
+		len = -delimlen;
+		for (i = 1; i <= nargs; i++) {
+			r = pp_args[i] = pp_pop();
+			len += r->pp_len + delimlen;
+			if (r->pp_comment != NULL) {
+				comment = (INSTRUCTION *) r->pp_comment;
+				len += comment->memory->stlen + indent_level + 1;	// comment\n ident
+			}
+		}
+		if (paren != NULL) {
+			assert(strlen(paren) == 2);
+			len += 2;
+		}
+	}
+	comment = NULL;
+
+	emalloc(str, char *, len + 1, "pp_list");
+	s = str;
+	if (paren != NULL)
+		*s++ = paren[0];
+	if (nargs > 0) {
+		r = pp_args[nargs];
+		memcpy(s, r->pp_str, r->pp_len);
+		s += r->pp_len;
+		pp_free(r);
+		for (i = nargs - 1; i > 0; i--) {
+			if (delimlen > 0) {
+				memcpy(s, delim, delimlen);
+				s += delimlen;
+			}
+			if (r->pp_comment != NULL) {
+				check_indent_level();
+				comment = (INSTRUCTION *) r->pp_comment;
+				memcpy(s, comment->memory->stptr, comment->memory->stlen);
+				s += comment->memory->stlen;
+				memcpy(s, tabs, indent_level + 1);
+				s += indent_level + 1;
+			}
+			r = pp_args[i];
+			memcpy(s, r->pp_str, r->pp_len);
+			s += r->pp_len;
+			pp_free(r);
+		}
+	}
+	if (paren != NULL)
+		*s++ = paren[1];
+	*s = '\0';
+	return str;
+}
+
+/* is_unary_minus --- return true if string starts with unary minus */
+
+static bool
+is_unary_minus(const char *str)
+{
+	return str[0] == '-' && str[1] != '-';
+}
+
+/* pp_concat --- handle concatenation and correct parenthesizing of expressions */
+
+static char *
+pp_concat(int nargs)
+{
+	NODE *r;
+ 	char *str, *s;
+	size_t len;
+	static const size_t delimlen = 1;	/* " " */
+	int i;
+	int pl_l, pl_r;
+
+	if (pp_args == NULL) {
+		npp_args = nargs;
+		emalloc(pp_args, NODE **, (nargs + 2) * sizeof(NODE *), "pp_concat");
+	} else if (nargs > npp_args) {
+		npp_args = nargs;
+		erealloc(pp_args, NODE **, (nargs + 2) * sizeof(NODE *), "pp_concat");
+	}
+
+	/*
+	 * items are on the stack in reverse order that they
+	 * will be printed to pop them off backwards.
+	 */
+
+	len = -delimlen;
+	for (i = nargs; i >= 1; i--) {
+		r = pp_args[i] = pp_pop();
+		len += r->pp_len + delimlen + 2;
+	}
+
+	emalloc(str, char *, len + 1, "pp_concat");
+	s = str;
+
+	/* now copy in */
+	for (i = 1; i < nargs; i++) {
+		r = pp_args[i];
+
+		if (r->pp_str[0] != '(') {
+			pl_l = prec_level(pp_args[i]->type);
+			pl_r = prec_level(pp_args[i+1]->type);
+
+			if (i >= 2 && is_unary_minus(r->pp_str)) {
+				*s++ = '(';
+				memcpy(s, r->pp_str, r->pp_len);
+				s += r->pp_len;
+				*s++ = ')';
+			} else if (is_scalar(pp_args[i]->type) && is_scalar(pp_args[i+1]->type)) {
+				memcpy(s, r->pp_str, r->pp_len);
+				s += r->pp_len;
+			} else if (pl_l <= pl_r || is_scalar(pp_args[i+1]->type)) {
+				*s++ = '(';
+				memcpy(s, r->pp_str, r->pp_len);
+				s += r->pp_len;
+				*s++ = ')';
+			} else {
+				memcpy(s, r->pp_str, r->pp_len);
+				s += r->pp_len;
+			}
+		} else {
+			memcpy(s, r->pp_str, r->pp_len);
+			s += r->pp_len;
+		}
+		pp_free(r);
+
+		if (i < nargs) {
+			*s++ = ' ';
+		}
+	}
+
+	pl_l = prec_level(pp_args[nargs-1]->type);
+	pl_r = prec_level(pp_args[nargs]->type);
+	r = pp_args[nargs];
+	if (r->pp_str[0] == '(') {
+		memcpy(s, r->pp_str, r->pp_len);
+		s += r->pp_len;
+	} else if (is_unary_minus(r->pp_str) || ((pl_l >= pl_r && ! is_scalar(pp_args[nargs]->type)))) {
+		*s++ = '(';
+		memcpy(s, r->pp_str, r->pp_len);
+		s += r->pp_len;
+		*s++ = ')';
+	} else {
+		memcpy(s, r->pp_str, r->pp_len);
+		s += r->pp_len;
+	}
+	pp_free(r);
+
+	*s = '\0';
+	return str;
+}
+
+/* pp_group3 --- string together up to 3 strings */
+
+static char *
+pp_group3(const char *s1, const char *s2, const char *s3)
+{
+	size_t len1, len2, len3, l;
+	char *str, *s;
+
+	len1 = strlen(s1);
+	len2 = strlen(s2);
+	len3 = strlen(s3);
+	l = len1 + len2 + len3 + 1;
+	emalloc(str, char *, l, "pp_group3");
+	s = str;
+	if (len1 > 0) {
+		memcpy(s, s1, len1);
+		s += len1;
+	}
+	if (len2 > 0) {
+		memcpy(s, s2, len2);
+		s += len2;
+	}
+	if (len3 > 0) {
+		memcpy(s, s3, len3);
+		s += len3;
+	}
+	*s = '\0';
+	return str;
+}
+
+/* pp_func --- pretty print a function */
+
+int
+pp_func(INSTRUCTION *pc, void *data ATTRIBUTE_UNUSED)
+{
+	int j;
+	static bool first = true;
+	NODE *func;
+	int pcount;
+	INSTRUCTION *fp;
+
+	if (first) {
+		first = false;
+		if (do_profile)
+			fprintf(prof_fp, _("\n\t# Functions, listed alphabetically\n"));
+	}
+
+	pp_namespace_list(pc[3].nexti);
+
+	fp = pc->nexti->nexti;
+	func = pc->func_body;
+	fprintf(prof_fp, "\n");
+
+	/* print any function comment */
+	if (pc->comment != NULL)
+		print_comment(pc->comment, -1);	/* -1 ==> don't indent */
+
+	indent(pc->nexti->exec_count);
+	
+	bool malloced = false;
+	char *name = adjust_namespace(func->vname, & malloced);
+	fprintf(prof_fp, "%s %s(", op2str(Op_K_function), name);
+	if (malloced)
+		free(name);
+	pcount = func->param_cnt;
+	func_params = func->fparms;
+	for (j = 0; j < pcount; j++) {
+		fprintf(prof_fp, "%s", func_params[j].param);
+		if (j < pcount - 1)
+			fprintf(prof_fp, ", ");
+	}
+	if (fp->opcode == Op_comment
+		&& fp->memory->comment_type == EOL_COMMENT) {
+		fprintf(prof_fp, ")");
+		fp = end_line(fp);
+	} else
+		fprintf(prof_fp, ")\n");
+	if (do_profile)
+		indent(0);
+	fprintf(prof_fp, "{\n");
+	indent_in();
+	pprint(fp, NULL, NO_PPRINT_FLAGS);	/* function body */
+	indent_out();
+	if (do_profile)
+		indent(0);
+	fprintf(prof_fp, "}\n");
+	return 0;
+}
+
+/* redir2str --- convert a redirection type into a printable value */
+
+const char *
+redir2str(int redirtype)
+{
+	static const char *const redirtab[] = {
+		"",
+		" > ",	/* redirect_output */
+		" >> ",	/* redirect_append */
+		" | ",	/* redirect_pipe */
+		" | ",	/* redirect_pipein */
+		" < ",	/* redirect_input */
+		" |& ",	/* redirect_twoway */
+	};
+
+	if (redirtype < 0 || redirtype > redirect_twoway)
+		fatal(_("redir2str: unknown redirection type %d"), redirtype);
+	return redirtab[redirtype];
+}
+
+/* pp_namespace --- print @namespace directive */
+
+static void
+pp_namespace(const char *name, INSTRUCTION *comment)
+{
+	// Don't print the initial `@namespace "awk"' unless
+	// @namespace was used at some point in the program
+	if (! namespace_changed)
+		return;
+
+	if (strcmp(current_namespace, name) == 0)
+		return;
+
+	// don't need to free current_namespace, it comes from
+	// info saved in Op_namespace instructions.
+	current_namespace = name;
+
+	if (do_profile)
+		indent(SPACEOVER);
+
+	fprintf(prof_fp, "@namespace \"%s\"", name);
+
+	if (comment != NULL) {
+		putc('\t', prof_fp);
+		print_comment(comment, 0);
+		putc('\n', prof_fp);
+	} else
+		fprintf(prof_fp, "\n\n");
+}
+
+/* pp_namespace_list --- print the list, back to front, using recursion */
+
+static void
+pp_namespace_list(INSTRUCTION *list)
+{
+	if (list == NULL)
+		return;
+
+	pp_namespace_list(list->nexti);
+	pp_namespace(list->ns_name, list->comment);
+}
+
+/* adjust_namespace --- remove leading namespace or add leading awk:: */
+
+static char *
+adjust_namespace(char *name, bool *malloced)
+{
+	*malloced = false;
+
+	// unadorned name from symbol table, add awk:: if not in awk:: n.s.
+	if (strchr(name, ':') == NULL &&
+	    current_namespace != awk_namespace &&	// can be equal if namespace never changed
+	    strcmp(current_namespace, "awk") != 0 &&
+	    ! is_all_upper(name)) {
+		char *buf;
+		size_t len = 5 + strlen(name) + 1;
+
+		emalloc(buf, char *, len, "adjust_namespace");
+		sprintf(buf, "awk::%s", name);
+		*malloced = true;
+
+		return buf;
+	}
+
+	// qualifed name, remove <ns>:: if in that n.s.
+	size_t len = strlen(current_namespace);
+
+	if (strncmp(current_namespace, name, len) == 0) {
+		char *ret = name + len + 2;
+
+		return ret;
+	}
+
+	return name;
+}
diff --git a/gawk-5.0.1/protos.h b/gawk-5.0.1/protos.h
new file mode 100644
index 00000000000..4dd4a221390
--- /dev/null
+++ b/gawk-5.0.1/protos.h
@@ -0,0 +1,152 @@
+/*
+ * protos.h -- function prototypes for when the headers don't have them.
+ */
+
+/*
+ * Copyright (C) 1991 - 2002, 2011 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifndef STDC_HEADERS
+
+#define aptr_t void *	/* arbitrary pointer type */
+extern aptr_t malloc(size_t);
+extern aptr_t realloc(aptr_t, size_t);
+extern aptr_t calloc(size_t, size_t);
+
+extern void free(aptr_t);
+extern char *getenv(const char *);
+
+#if ! defined(HAVE_STRING_H) && ! defined(HAVE_STRINGS_H)
+extern char *strcpy(char *, const char *);
+extern char *strcat(char *, const char *);
+extern char *strncpy(char *, const char *, size_t);
+extern int strcmp(const char *, const char *);
+extern int strncmp(const char *, const char *, size_t);
+extern char *strchr(const char *, int);
+extern char *strrchr(const char *, int);
+extern char *strstr(const char *s1, const char *s2);
+extern size_t strlen(const char *);
+extern long strtol(const char *, char **, int);
+
+extern aptr_t memset(aptr_t, int, size_t);
+extern aptr_t memcpy(aptr_t, const aptr_t, size_t);
+extern aptr_t memmove(aptr_t, const aptr_t, size_t);
+extern aptr_t memchr(const aptr_t, int, size_t);
+extern int memcmp(const aptr_t, const aptr_t, size_t);
+#endif /* ! defined(HAVE_STRING_H) && ! defined(HAVE_STRINGS_H) */
+
+#ifndef VMS
+extern char *strerror(int);
+#else
+extern char *strerror(int,...);
+#endif
+
+#if ! defined(__GNU_LIBRARY__)
+extern size_t strftime(char *, size_t, const char *, const struct tm *);
+#endif
+extern time_t time(time_t *);
+
+extern FILE *fdopen(int, const char *);
+extern int fprintf(FILE *, const char *, ...);
+#if ! defined(__GNU_LIBRARY__)
+extern size_t fwrite(const aptr_t, size_t, size_t, FILE *);
+#endif
+extern int fputs(const char *, FILE *);
+extern int unlink(const char *);
+extern int fflush(FILE *);
+extern int fclose(FILE *);
+extern FILE *popen(const char *, const char *);
+extern int pclose(FILE *);
+extern void abort();
+extern int isatty(int);
+extern void exit(int);
+extern int system(const char *);
+extern int sscanf(const char *, const char *, ...);
+#ifndef toupper
+extern int toupper(int);
+#endif
+#ifndef tolower
+extern int tolower(int);
+#endif
+
+extern double pow(double x, double y);
+extern double atof(const char *);
+extern double strtod(const char *, char **);
+extern int fstat(int, struct stat *);
+extern int stat(const char *, struct stat *);
+extern off_t lseek(int, off_t, int);
+extern int close(int);
+extern int creat(const char *, mode_t);
+extern int open(const char *, int, ...);
+extern int pipe(int *);
+extern int dup(int);
+extern int dup2(int,int);
+extern int fork();
+extern int execl(const char *, const char *, ...);
+#ifndef HAVE_SYS_WAIT_H
+extern int wait(int *);
+#endif
+extern void _exit(int);
+
+#undef aptr_t
+
+#endif /* STDC_HEADERS */
+
+
+/* prototypes for missing functions defined in missing_d/ */
+
+#ifndef HAVE_STRNCASECMP
+extern int strcasecmp(const char *s1, const char *s2);
+extern int strncasecmp(const char *s1, const char *s2, register size_t n);
+#endif
+
+#ifndef HAVE_STRTOUL
+extern unsigned long int strtoul(const char *, char **endptr, int base);
+#endif
+
+#ifndef HAVE_TZSET
+extern void tzset();
+#endif
+
+#ifndef HAVE_MKTIME
+extern time_t mktime(struct tm *tp);
+#endif
+
+#ifndef HAVE_TIMEGM
+extern time_t timegm(struct tm *);
+#endif
+
+#ifndef HAVE_SNPRINTF
+extern int snprintf(char *restrict buf, size_t len, const char *restrict fmt, ...);
+#endif
+
+#ifndef HAVE_USLEEP
+extern int usleep(unsigned int);
+#endif
+
+#ifndef HAVE_SETENV
+extern int setenv(const char *, const char *, int);
+extern int unsetenv(const char *);
+#endif
+
+#if !defined(HAVE_STRCOLL)
+extern int strcoll(const char *, const char *);
+#endif
+
diff --git a/gawk-5.0.1/re.c b/gawk-5.0.1/re.c
new file mode 100644
index 00000000000..174f54f80bf
--- /dev/null
+++ b/gawk-5.0.1/re.c
@@ -0,0 +1,661 @@
+/*
+ * re.c - compile regular expressions.
+ */
+
+/*
+ * Copyright (C) 1991-2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+#include "localeinfo.h"
+
+static reg_syntax_t syn;
+static void check_bracket_exp(char *s, size_t len);
+const char *regexflags2str(int flags);
+
+static struct localeinfo localeinfo;
+
+/* make_regexp --- generate compiled regular expressions */
+
+Regexp *
+make_regexp(const char *s, size_t len, bool ignorecase, bool dfa, bool canfatal)
+{
+	static char metas[] = ".*+(){}[]|?^$\\";
+	Regexp *rp;
+	const char *rerr;
+	const char *src = s;
+	static char *buf = NULL;
+	static size_t buflen;
+	const char *end = s + len;
+	char *dest;
+	int c, c2;
+	static bool first = true;
+	static bool no_dfa = false;
+	int i;
+	static struct dfa* dfaregs[2] = { NULL, NULL };
+	static bool nul_warned = false;
+
+	if (do_lint && ! nul_warned && memchr(s, '\0', len) != NULL) {
+		nul_warned = true;
+		lintwarn(_("behavior of matching a regexp containing NUL characters is not defined by POSIX"));
+	}
+
+	/*
+	 * The number of bytes in the current multibyte character.
+	 * It is 0, when the current character is a singlebyte character.
+	 */
+	size_t is_multibyte = 0;
+	mbstate_t mbs;
+
+	memset(&mbs, 0, sizeof(mbstate_t)); /* Initialize.  */
+
+	if (first) {
+		/* for debugging and testing */
+		no_dfa = (getenv("GAWK_NO_DFA") != NULL);
+		/* don't set first to false here, we do it below */
+	}
+
+	/* always check */
+	check_bracket_exp((char *) s, len);
+
+	/* Handle escaped characters first. */
+
+	/*
+	 * Build a copy of the string (in buf) with the
+	 * escaped characters translated, and generate the regex
+	 * from that.
+	 */
+	if (buf == NULL) {
+		emalloc(buf, char *, len + 1, "make_regexp");
+		buflen = len;
+	} else if (len > buflen) {
+		erealloc(buf, char *, len + 1, "make_regexp");
+		buflen = len;
+	}
+	dest = buf;
+
+	while (src < end) {
+		if (gawk_mb_cur_max > 1 && ! is_multibyte) {
+			/* The previous byte is a singlebyte character, or last byte
+			   of a multibyte character.  We check the next character.  */
+			is_multibyte = mbrlen(src, end - src, &mbs);
+			if (   is_multibyte == 1
+			    || is_multibyte == (size_t) -1
+			    || is_multibyte == (size_t) -2
+			    || is_multibyte == 0) {
+				/* We treat it as a single-byte character.  */
+				is_multibyte = 0;
+			}
+		}
+
+		const char *ok_to_escape;
+		if (do_traditional)
+			ok_to_escape = "()|*+?.^$\\[]/-";
+		else
+			ok_to_escape = "<>`'BywWsS{}()|*+?.^$\\[]/-";
+
+		/* We skip multibyte character, since it must not be a special
+		   character.  */
+		if ((gawk_mb_cur_max == 1 || ! is_multibyte) &&
+		    (*src == '\\')) {
+			c = *++src;
+			switch (c) {
+			case '\0':	/* \\ before \0, either dynamic data or real end of string */
+				if (src >= s + len)
+					*dest++ = '\\';	// at end of string, will fatal below
+				else
+					fatal(_("invalid NUL byte in dynamic regexp"));
+				break;
+			case 'a':
+			case 'b':
+			case 'f':
+			case 'n':
+			case 'r':
+			case 't':
+			case 'v':
+			case 'x':
+			case '0':
+			case '1':
+			case '2':
+			case '3':
+			case '4':
+			case '5':
+			case '6':
+			case '7':
+				c2 = parse_escape(&src);
+				if (c2 < 0)
+					cant_happen();
+				/*
+				 * Unix awk treats octal (and hex?) chars
+				 * literally in re's, so escape regexp
+				 * metacharacters.
+				 */
+				if (do_traditional
+				    && ! do_posix
+				    && (isdigit(c) || c == 'x')
+				    && strchr("()|*+?.^$\\[]", c2) != NULL)
+					*dest++ = '\\';
+				*dest++ = (char) c2;
+				if (do_lint
+				    && ! nul_warned
+				    && c2 == '\0') {
+					nul_warned = true;
+					lintwarn(_("behavior of matching a regexp containing NUL characters is not defined by POSIX"));
+				}
+				break;
+			case '8':
+			case '9':	/* a\9b not valid */
+				*dest++ = c;
+				src++;
+			{
+				static bool warned[2];
+
+				if (! warned[c - '8']) {
+					warning(_("regexp escape sequence `\\%c' treated as plain `%c'"), c, c);
+					warned[c - '8'] = true;
+				}
+			}
+				break;
+			case 'y':	/* normally \b */
+				/* gnu regex op */
+				if (! do_traditional) {
+					*dest++ = '\\';
+					*dest++ = 'b';
+					src++;
+					break;
+				}
+				/* else, fall through */
+			default:
+				if (strchr(ok_to_escape, c) == NULL) {
+					static bool warned[256];
+
+					if (! warned[c & 0xFF]) {
+						warning(_("regexp escape sequence `\\%c' is not a known regexp operator"), c);
+						warned[c & 0xFF] = true;
+					}
+				}
+				*dest++ = '\\';
+				*dest++ = (char) c;
+				src++;
+				break;
+			} /* switch */
+		} else {
+			c = *src;
+			*dest++ = *src++;	/* not '\\' */
+		}
+		if (gawk_mb_cur_max > 1 && is_multibyte)
+			is_multibyte--;
+	} /* while */
+
+	*dest = '\0';
+	len = dest - buf;
+
+	ezalloc(rp, Regexp *, sizeof(*rp), "make_regexp");
+	rp->pat.allocated = 0;	/* regex will allocate the buffer */
+	emalloc(rp->pat.fastmap, char *, 256, "make_regexp");
+
+	/*
+	 * Lo these many years ago, had I known what a P.I.T.A. IGNORECASE
+	 * was going to turn out to be, I wouldn't have bothered with it.
+	 *
+	 * In the case where we have a multibyte character set, we have no
+	 * choice but to use RE_ICASE, since the casetable is for single-byte
+	 * character sets only.
+	 *
+	 * On the other hand, if we do have a single-byte character set,
+	 * using the casetable should give  a performance improvement, since
+	 * it's computed only once, not each time a regex is compiled.  We
+	 * also think it's probably better for portability.  See the
+	 * discussion by the definition of casetable[] in eval.c.
+	 */
+
+	ignorecase = !! ignorecase;	/* force to 1 or 0 */
+	if (ignorecase) {
+		if (gawk_mb_cur_max > 1) {
+			syn |= RE_ICASE;
+			rp->pat.translate = NULL;
+		} else {
+			syn &= ~RE_ICASE;
+			rp->pat.translate = (RE_TRANSLATE_TYPE) casetable;
+		}
+	} else {
+		rp->pat.translate = NULL;
+		syn &= ~RE_ICASE;
+	}
+
+	/* initialize dfas to hold syntax */
+	if (first) {
+		first = false;
+		dfaregs[0] = dfaalloc();
+		dfaregs[1] = dfaalloc();
+		dfasyntax(dfaregs[0], & localeinfo, syn, DFA_ANCHOR);
+		dfasyntax(dfaregs[1], & localeinfo, syn | RE_ICASE, DFA_ANCHOR);
+	}
+
+	re_set_syntax(syn);
+
+	if ((rerr = re_compile_pattern(buf, len, &(rp->pat))) != NULL) {
+		refree(rp);
+		if (! canfatal) {
+			/* rerr already gettextized inside regex routines */
+			error("%s: /%s/", rerr, buf);
+ 			return NULL;
+		}
+		fatal("invalid regexp: %s: /%s/", rerr, buf);
+	}
+
+	/* gack. this must be done *after* re_compile_pattern */
+	rp->pat.newline_anchor = false; /* don't get \n in middle of string */
+	if (dfa && ! no_dfa) {
+		rp->dfareg = dfaalloc();
+		dfacopysyntax(rp->dfareg, dfaregs[ignorecase]);
+		dfacomp(buf, len, rp->dfareg, true);
+	} else
+		rp->dfareg = NULL;
+
+	/* Additional flags that help with RS as regexp. */
+	for (i = 0; i < len; i++) {
+		if (strchr(metas, buf[i]) != NULL) {
+			rp->has_meta = true;
+			break;
+		}
+	}
+
+	for (i = len - 1; i >= 0; i--) {
+		if (strchr("*+|?", buf[i]) != NULL) {
+			rp->maybe_long = true;
+			break;
+		}
+	}
+
+	return rp;
+}
+
+/* research --- do a regexp search. use dfa if possible */
+
+int
+research(Regexp *rp, char *str, int start,
+	 size_t len, int flags)
+{
+	const char *ret = str;
+	bool try_backref = false;
+	int need_start;
+	int no_bol;
+	int res;
+
+	need_start = ((flags & RE_NEED_START) != 0);
+	no_bol = ((flags & RE_NO_BOL) != 0);
+
+	if (no_bol)
+		rp->pat.not_bol = 1;
+
+	/*
+	 * Always do dfa search if can; if it fails, then even if
+	 * need_start is true, we won't bother with the regex search.
+	 *
+	 * The dfa matcher doesn't have a no_bol flag, so don't bother
+	 * trying it in that case.
+	 *
+	 * 7/2008: Skip the dfa matcher if need_start. The dfa matcher
+	 * has bugs in certain multibyte cases and it's too difficult
+	 * to try to special case things.
+	 * 7/2017: Apparently there are some cases where DFA gets
+	 * stuck, even in the C locale, so we use dfa only if not need_start.
+	 *
+	 * Should that issue ever get resolved, note this comment:
+	 *
+	 * 7/2016: The dfa matcher can't handle a case where searching
+	 * starts in the middle of a string, so don't bother trying it
+	 * in that case.
+	 *	if (rp->dfa && ! no_bol && start == 0) ...
+	 */
+	if (rp->dfareg != NULL && ! no_bol && ! need_start) {
+		struct dfa *superset = dfasuperset(rp->dfareg);
+		if (superset)
+			ret = dfaexec(superset, str+start, str+start+len,
+							true, NULL, NULL);
+
+		if (ret && (! need_start
+				|| (! superset && dfaisfast(rp->dfareg))))
+			ret = dfaexec(rp->dfareg, str+start, str+start+len,
+						true, NULL, &try_backref);
+	}
+
+	if (ret) {
+		if (   rp->dfareg == NULL
+			|| start != 0
+			|| no_bol
+			|| need_start
+			|| try_backref) {
+			/*
+			 * Passing NULL as last arg speeds up search for cases
+			 * where we don't need the start/end info.
+			 */
+			res = re_search(&(rp->pat), str, start+len,
+				start, len, need_start ? &(rp->regs) : NULL);
+		} else
+			res = 1;
+	} else
+		res = -1;
+
+	rp->pat.not_bol = 0;
+	return res;
+}
+
+/* refree --- free up the dynamic memory used by a compiled regexp */
+
+void
+refree(Regexp *rp)
+{
+	if (rp == NULL)
+		return;
+	rp->pat.translate = NULL;
+	regfree(& rp->pat);
+	if (rp->regs.start)
+		free(rp->regs.start);
+	if (rp->regs.end)
+		free(rp->regs.end);
+	if (rp->dfareg != NULL) {
+		dfafree(rp->dfareg);
+		free(rp->dfareg);
+	}
+	efree(rp);
+}
+
+/* dfaerror --- print an error message for the dfa routines */
+
+void
+dfaerror(const char *s)
+{
+	fatal("%s", s);
+	exit(EXIT_FATAL);	/* for DJGPP */
+}
+
+/* re_update --- recompile a dynamic regexp */
+
+Regexp *
+re_update(NODE *t)
+{
+	NODE *t1;
+
+	if (t->type == Node_val && (t->flags & REGEX) != 0)
+		return t->typed_re->re_reg[IGNORECASE];
+
+	if ((t->re_flags & CONSTANT) != 0) {
+		/* it's a constant, so just return it as is */
+		assert(t->type == Node_regex);
+		return t->re_reg[IGNORECASE];
+	}
+	t1 = t->re_exp;
+	if (t->re_text != NULL) {
+		/* if contents haven't changed, just return it */
+		if (cmp_nodes(t->re_text, t1, true) == 0)
+			return t->re_reg[IGNORECASE];
+		/* things changed, fall through to recompile */
+		unref(t->re_text);
+	}
+	/* get fresh copy of the text of the regexp */
+	t->re_text = dupnode(t1);
+
+	/* text changed */
+
+	/* free old */
+	if (t->re_reg[0] != NULL)
+		refree(t->re_reg[0]);
+	if (t->re_reg[1] != NULL)
+		refree(t->re_reg[1]);
+	if (t->re_cnt > 0)
+		t->re_cnt++;
+	if (t->re_cnt > 10)
+		t->re_cnt = 0;
+	if (t->re_text == NULL) {
+		/* reset regexp text if needed */
+		t1 = t->re_exp;
+		unref(t->re_text);
+		t->re_text = dupnode(t1);
+	}
+	/* compile it */
+	t->re_reg[0] = make_regexp(t->re_text->stptr, t->re_text->stlen,
+				false, t->re_cnt, true);
+	t->re_reg[1] = make_regexp(t->re_text->stptr, t->re_text->stlen,
+				true, t->re_cnt, true);
+
+	return t->re_reg[IGNORECASE];
+}
+
+/* resetup --- choose what kind of regexps we match */
+
+void
+resetup()
+{
+	// init localeinfo for dfa
+	init_localeinfo(& localeinfo);
+
+	/*
+	 * Syntax bits: _that_ is yet another mind trip.  Recreational drugs
+	 * are helpful for recovering from the experience.
+	 *
+	 *	Aharon Robbins <arnold@skeeve.com>
+	 *	Sun, 21 Oct 2007 23:55:33 +0200
+	 */
+	if (do_posix)
+		syn = RE_SYNTAX_POSIX_AWK;	/* strict POSIX re's */
+	else if (do_traditional)
+		syn = RE_SYNTAX_AWK;		/* traditional Unix awk re's */
+	else
+		syn = RE_SYNTAX_GNU_AWK;	/* POSIX re's + GNU ops */
+
+	/*
+	 * Interval expressions are now on by default, as POSIX is
+	 * wide-spread enough that people want it. The do_intervals
+	 * variable remains for use with --traditional.
+	 */
+	if (do_intervals)
+		syn |= RE_INTERVALS | RE_INVALID_INTERVAL_ORD | RE_NO_BK_BRACES;
+
+	(void) re_set_syntax(syn);
+}
+
+/* using_utf8 --- are we using utf8 */
+
+bool
+using_utf8(void)
+{
+	return localeinfo.using_utf8;
+}
+
+/* reisstring --- return true if the RE match is a simple string match */
+
+int
+reisstring(const char *text, size_t len, Regexp *re, const char *buf)
+{
+	int res;
+	const char *matched;
+
+	/* simple checking for meta characters in re */
+	if (re->has_meta)
+		return false;	/* give up early, can't be string match */
+
+	/* make accessable to gdb */
+	matched = &buf[RESTART(re, buf)];
+
+	res = (memcmp(text, matched, len) == 0);
+
+	return res;
+}
+
+/* reflags2str --- make a regex flags value readable */
+
+const char *
+reflags2str(int flagval)
+{
+	static const struct flagtab values[] = {
+		{ RE_BACKSLASH_ESCAPE_IN_LISTS, "RE_BACKSLASH_ESCAPE_IN_LISTS" },
+		{ RE_BK_PLUS_QM, "RE_BK_PLUS_QM" },
+		{ RE_CHAR_CLASSES, "RE_CHAR_CLASSES" },
+		{ RE_CONTEXT_INDEP_ANCHORS, "RE_CONTEXT_INDEP_ANCHORS" },
+		{ RE_CONTEXT_INDEP_OPS, "RE_CONTEXT_INDEP_OPS" },
+		{ RE_CONTEXT_INVALID_OPS, "RE_CONTEXT_INVALID_OPS" },
+		{ RE_DOT_NEWLINE, "RE_DOT_NEWLINE" },
+		{ RE_DOT_NOT_NULL, "RE_DOT_NOT_NULL" },
+		{ RE_HAT_LISTS_NOT_NEWLINE, "RE_HAT_LISTS_NOT_NEWLINE" },
+		{ RE_INTERVALS, "RE_INTERVALS" },
+		{ RE_LIMITED_OPS, "RE_LIMITED_OPS" },
+		{ RE_NEWLINE_ALT, "RE_NEWLINE_ALT" },
+		{ RE_NO_BK_BRACES, "RE_NO_BK_BRACES" },
+		{ RE_NO_BK_PARENS, "RE_NO_BK_PARENS" },
+		{ RE_NO_BK_REFS, "RE_NO_BK_REFS" },
+		{ RE_NO_BK_VBAR, "RE_NO_BK_VBAR" },
+		{ RE_NO_EMPTY_RANGES, "RE_NO_EMPTY_RANGES" },
+		{ RE_UNMATCHED_RIGHT_PAREN_ORD, "RE_UNMATCHED_RIGHT_PAREN_ORD" },
+		{ RE_NO_POSIX_BACKTRACKING, "RE_NO_POSIX_BACKTRACKING" },
+		{ RE_NO_GNU_OPS, "RE_NO_GNU_OPS" },
+		{ RE_INVALID_INTERVAL_ORD, "RE_INVALID_INTERVAL_ORD" },
+		{ RE_ICASE, "RE_ICASE" },
+		{ RE_CARET_ANCHORS_HERE, "RE_CARET_ANCHORS_HERE" },
+		{ RE_CONTEXT_INVALID_DUP, "RE_CONTEXT_INVALID_DUP" },
+		{ RE_NO_SUB, "RE_NO_SUB" },
+		{ 0,	NULL },
+	};
+
+	if (flagval == RE_SYNTAX_EMACS) /* == 0 */
+		return "RE_SYNTAX_EMACS";
+
+	return genflags2str(flagval, values);
+}
+
+/*
+ * dfawarn() is called by the dfa routines whenever a regex is compiled
+ * must supply a dfawarn.
+ */
+
+void
+dfawarn(const char *dfa_warning)
+{
+	/*
+	 * This routine does nothing, since gawk does its own
+	 * (better) check for bad [[:foo:]] syntax.
+	 */
+}
+
+/* check_bracket_exp --- look for /[:space:]/ that should be /[[:space:]]/ */
+
+static void
+check_bracket_exp(char *s, size_t length)
+{
+	static struct reclass {
+		const char *name;
+		size_t len;
+		bool warned;
+	} classes[] = {
+		/*
+		 * Ordered by what we hope is frequency,
+		 * since it's linear searched.
+		 */
+		{ "[:alpha:]", 9, false },
+		{ "[:digit:]", 9, false },
+		{ "[:alnum:]", 9, false },
+		{ "[:upper:]", 9, false },
+		{ "[:lower:]", 9, false },
+		{ "[:space:]", 9, false },
+		{ "[:xdigit:]", 10, false },
+		{ "[:punct:]", 9, false },
+		{ "[:print:]", 9, false },
+		{ "[:graph:]", 9, false },
+		{ "[:cntrl:]", 9, false },
+		{ "[:blank:]", 9, false },
+		{ NULL, 0 }
+	};
+	int i;
+	bool found = false;
+	char save;
+	char *sp, *sp2, *end;
+	int len;
+	int count = 0;
+
+	if (length == 0)
+		return;
+
+	end = s + length;
+	save = s[length];
+	s[length] = '\0';
+	sp = s;
+
+again:
+	sp = sp2 = memchr(sp, '[', (end - sp));
+	if (sp == NULL)
+		goto done;
+
+	for (count++, sp++; *sp != '\0'; sp++) {
+		if (*sp == '[')
+			count++;
+		/*
+		 * ] as first char after open [ is skipped
+		 * \] is skipped
+		 * [^]] is skipped
+		 */
+		if (*sp == ']' && sp > sp2) {
+			 if (sp[-1] != '['
+			     && sp[-1] != '\\')
+				 ;
+			 else if ((sp - sp2) >= 2
+				  && sp[-1] == '^' && sp[-2] == '[')
+				 ;
+			 else
+				count--;
+		}
+
+		if (count == 0) {
+			sp++;	/* skip past ']' */
+			break;
+		}
+	}
+
+	if (count > 0) {	/* bad regex, give up */
+		goto done;
+	}
+
+	/* sp2 has start */
+
+	for (i = 0; classes[i].name != NULL; i++) {
+		if (classes[i].warned)
+			continue;
+		len = classes[i].len;
+		if (   len == (sp - sp2)
+		    && memcmp(sp2, classes[i].name, len) == 0) {
+			found = true;
+			break;
+		}
+	}
+
+	if (found && ! classes[i].warned) {
+		warning(_("regexp component `%.*s' should probably be `[%.*s]'"),
+				len, sp2, len, sp2);
+		classes[i].warned = true;
+	}
+
+	if (sp < end) {
+		found = false;
+		goto again;
+	}
+done:
+	s[length] = save;
+}
diff --git a/gawk-5.0.1/replace.c b/gawk-5.0.1/replace.c
new file mode 100644
index 00000000000..77670b06232
--- /dev/null
+++ b/gawk-5.0.1/replace.c
@@ -0,0 +1,120 @@
+/*
+ * replace.c -- Get replacement versions of functions.
+ */
+
+/*
+ * Copyright (C) 1989, 1991-2014, 2018 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/*
+ * Do all necessary includes here, so that we don't have to worry about
+ * overlapping includes in the files in missing.d.
+ */
+#include "awk.h"	/* includes config.h for us */
+
+
+#ifndef HAVE_SYSTEM
+#include "missing_d/system.c"
+#endif /* HAVE_SYSTEM */
+
+#ifndef HAVE_MEMCMP
+#include "missing_d/memcmp.c"
+#endif	/* HAVE_MEMCMP */
+
+#ifndef HAVE_MEMCPY
+#include "missing_d/memcpy.c"
+#endif	/* HAVE_MEMCPY */
+
+#ifndef HAVE_MEMSET
+#include "missing_d/memset.c"
+#endif	/* HAVE_MEMSET */
+
+#ifndef HAVE_MEMMOVE
+#include "missing_d/memmove.c"
+#endif	/* HAVE_MEMMOVE */
+
+#if !defined(HAVE_STRNCASECMP) || !defined(HAVE_STRCASECMP)
+#include "missing_d/strncasecmp.c"
+#endif	/* HAVE_STRCASE */
+
+#ifndef HAVE_STRERROR
+#include "missing_d/strerror.c"
+#endif	/* HAVE_STRERROR */
+
+#ifndef HAVE_STRFTIME
+# ifdef __MINGW32__
+/* Need to use underlying_strftime in replacement strftime.  */
+#  define HAVE_STRFTIME 1
+# endif
+#include "missing_d/strftime.c"
+# ifdef __MINGW32__
+#  undef HAVE_STRFTIME
+# endif
+#endif	/* HAVE_STRFTIME */
+
+#ifndef HAVE_STRCHR
+#include "missing_d/strchr.c"
+#endif	/* HAVE_STRCHR */
+
+#if !defined(HAVE_STRTOD)
+#include "missing_d/strtod.c"
+#endif	/* HAVE_STRTOD */
+
+#ifndef HAVE_STRTOUL
+#include "missing_d/strtoul.c"
+#endif	/* HAVE_STRTOUL */
+
+#ifndef HAVE_TZSET
+#include "missing_d/tzset.c"
+#endif /* HAVE_TZSET */
+
+#ifndef HAVE_MKTIME
+/* mktime.c defines main() if DEBUG is set */
+#undef DEBUG
+#include "missing_d/mktime.c"
+#endif /* HAVE_MKTIME */
+
+#ifndef HAVE_TIMEGM
+#include "missing_d/timegm.c"
+#endif /* HAVE_TIMEGM */
+
+#ifndef HAVE_SNPRINTF
+#include "missing_d/snprintf.c"
+#endif
+
+#if defined(HAVE_SOCKETS) && ! defined(HAVE_GETADDRINFO)
+#include "missing_d/getaddrinfo.c"
+#endif
+
+#ifndef HAVE_USLEEP
+#include "missing_d/usleep.c"
+#endif
+
+#ifndef HAVE_SETENV
+#include "missing_d/setenv.c"
+#endif
+
+#ifndef HAVE_STRCOLL
+#include "missing_d/strcoll.c"
+#endif
+
+#if defined(__DJGPP__)
+#include "missing_d/wcmisc.c"
+#endif
diff --git a/gawk-5.0.1/str_array.c b/gawk-5.0.1/str_array.c
new file mode 100644
index 00000000000..c90f7861988
--- /dev/null
+++ b/gawk-5.0.1/str_array.c
@@ -0,0 +1,835 @@
+/*
+ * str_array.c - routines for associative arrays of string indices.
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2013, 2016, 2017, 2018, 2019,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+/*
+ * Tree walks (``for (iggy in foo)'') and array deletions use expensive
+ * linear searching.  So what we do is start out with small arrays and
+ * grow them as needed, so that our arrays are hopefully small enough,
+ * most of the time, that they're pretty full and we're not looking at
+ * wasted space.
+ *
+ * The decision is made to grow the array if the average chain length is
+ * ``too big''. This is defined as the total number of entries in the table
+ * divided by the size of the array being greater than some constant.
+ *
+ * 11/2002: We make the constant a variable, so that it can be tweaked
+ * via environment variable.
+ * 11/2002: Modern machines are bigger, cut this down from 10.
+ */
+
+static size_t STR_CHAIN_MAX = 2;
+
+extern FILE *output_fp;
+extern void indent(int indent_level);
+
+static NODE **str_array_init(NODE *symbol, NODE *subs);
+static NODE **str_lookup(NODE *symbol, NODE *subs);
+static NODE **str_exists(NODE *symbol, NODE *subs);
+static NODE **str_clear(NODE *symbol, NODE *subs);
+static NODE **str_remove(NODE *symbol, NODE *subs);
+static NODE **str_list(NODE *symbol, NODE *subs);
+static NODE **str_copy(NODE *symbol, NODE *newsymb);
+static NODE **str_dump(NODE *symbol, NODE *ndump);
+
+const array_funcs_t str_array_func = {
+	"str",
+	str_array_init,
+	(afunc_t) 0,
+	str_lookup,
+	str_exists,
+	str_clear,
+	str_remove,
+	str_list,
+	str_copy,
+	str_dump,
+	(afunc_t) 0,
+};
+
+static NODE **env_remove(NODE *symbol, NODE *subs);
+static NODE **env_store(NODE *symbol, NODE *subs);
+static NODE **env_clear(NODE *symbol, NODE *subs);
+
+/* special case for ENVIRON */
+const array_funcs_t env_array_func = {
+	"env",
+	str_array_init,
+	(afunc_t) 0,
+	str_lookup,
+	str_exists,
+	env_clear,
+	env_remove,
+	str_list,
+	str_copy,
+	str_dump,
+	env_store,
+};
+
+static inline NODE **str_find(NODE *symbol, NODE *s1, size_t code1, unsigned long hash1);
+static void grow_table(NODE *symbol);
+
+static unsigned long gst_hash_string(const char *str, size_t len, unsigned long hsize, size_t *code);
+static unsigned long scramble(unsigned long x);
+static unsigned long awk_hash(const char *s, size_t len, unsigned long hsize, size_t *code);
+
+unsigned long (*hash)(const char *s, size_t len, unsigned long hsize, size_t *code) = awk_hash;
+
+
+/* str_array_init --- array initialization routine */
+
+static NODE **
+str_array_init(NODE *symbol ATTRIBUTE_UNUSED, NODE *subs ATTRIBUTE_UNUSED)
+{
+	if (symbol == NULL) {		/* first time */
+		long newval;
+		const char *val;
+
+		/* check relevant environment variables */
+		if ((newval = getenv_long("STR_CHAIN_MAX")) > 0)
+			STR_CHAIN_MAX = newval;
+		if ((val = getenv("AWK_HASH")) != NULL && strcmp(val, "gst") == 0)
+			hash = gst_hash_string;
+	} else
+		null_array(symbol);
+
+	return & success_node;
+}
+
+
+/*
+ * str_lookup:
+ * Find SYMBOL[SUBS] in the assoc array.  Install it with value "" if it
+ * isn't there. Returns a pointer ala get_lhs to where its value is stored.
+ *
+ * SYMBOL is the address of the node (or other pointer) being dereferenced.
+ * SUBS is a number or string used as the subscript.
+ */
+
+static NODE **
+str_lookup(NODE *symbol, NODE *subs)
+{
+	unsigned long hash1;
+	NODE **lhs;
+	BUCKET *b;
+	size_t code1;
+
+	subs = force_string(subs);
+
+	if (symbol->buckets == NULL)
+		grow_table(symbol);
+	hash1 = hash(subs->stptr, subs->stlen,
+			(unsigned long) symbol->array_size, & code1);
+	if ((lhs = str_find(symbol, subs, code1, hash1)) != NULL)
+		return lhs;
+
+	/* It's not there, install it. */
+	/* first see if we would need to grow the array, before installing */
+
+	symbol->table_size++;
+	if ((symbol->flags & ARRAYMAXED) == 0
+			&& (symbol->table_size / symbol->array_size) > STR_CHAIN_MAX) {
+		grow_table(symbol);
+		/* have to recompute hash value for new size */
+		hash1 = code1 % (unsigned long) symbol->array_size;
+	}
+
+
+	/*
+	 * Repeat after me: "Array indices are always strings."
+	 * "Array indices are always strings."
+	 * "Array indices are always strings."
+	 * "Array indices are always strings."
+	 * ....
+	 */
+	// Special cases:
+	// 1. The string was generated using CONVFMT.
+	// 2. The string was from an unassigned variable.
+	// 3. The string was from an unassigned field.
+	if (   subs->stfmt != STFMT_UNUSED
+	    || subs == Nnull_string
+	    || (subs->flags & NULL_FIELD) != 0) {
+		NODE *tmp;
+
+		/*
+		 * Need to freeze this string value --- it must never
+		 * change, no matter what happens to the value
+		 * that created it or to CONVFMT, etc.; So, get
+		 * a private copy.
+		 */
+
+		tmp = make_string(subs->stptr, subs->stlen);
+
+		/*
+		* Set the numeric value for the index if it's  available. Useful
+		* for numeric sorting by index.  Do this only if the numeric
+		* value is available, instead of all the time, since doing it
+		* all the time is a big performance hit for something that may
+		* never be used.
+		*/
+
+		if ((subs->flags & (MPFN|MPZN|NUMCUR)) == NUMCUR) {
+			tmp->numbr = subs->numbr;
+			tmp->flags |= NUMCUR;
+		}
+		subs = tmp;
+	} else {
+		/* string value already "frozen" */
+
+		subs = dupnode(subs);
+	}
+
+	getbucket(b);
+	b->ahnext = symbol->buckets[hash1];
+	symbol->buckets[hash1] = b;
+	b->ahname = subs;
+	b->ahname_str = subs->stptr;
+	b->ahname_len = subs->stlen;
+	b->ahvalue = dupnode(Nnull_string);
+	b->ahcode = code1;
+	return & (b->ahvalue);
+}
+
+/* str_exists --- test whether the array element symbol[subs] exists or not,
+ * 		return pointer to value if it does.
+ */
+
+static NODE **
+str_exists(NODE *symbol, NODE *subs)
+{
+	unsigned long hash1;
+	size_t code1;
+
+	if (symbol->table_size == 0)
+		return NULL;
+
+	subs = force_string(subs);
+	hash1 = hash(subs->stptr, subs->stlen, (unsigned long) symbol->array_size, & code1);
+	return str_find(symbol, subs, code1, hash1);
+}
+
+/* str_clear --- flush all the values in symbol[] */
+
+static NODE **
+str_clear(NODE *symbol, NODE *subs ATTRIBUTE_UNUSED)
+{
+	unsigned long i;
+	BUCKET *b, *next;
+	NODE *r;
+
+	for (i = 0; i < symbol->array_size; i++) {
+		for (b = symbol->buckets[i]; b != NULL; b = next) {
+			next = b->ahnext;
+			r = b->ahvalue;
+			if (r->type == Node_var_array) {
+				assoc_clear(r);	/* recursively clear all sub-arrays */
+				efree(r->vname);
+				freenode(r);
+			} else
+				unref(r);
+			unref(b->ahname);
+			freebucket(b);
+		}
+		symbol->buckets[i] = NULL;
+	}
+
+	if (symbol->buckets != NULL)
+		efree(symbol->buckets);
+	symbol->ainit(symbol, NULL);	/* re-initialize symbol */
+	return NULL;
+}
+
+
+/* str_remove --- If SUBS is already in the table, remove it. */
+
+static NODE **
+str_remove(NODE *symbol, NODE *subs)
+{
+	unsigned long hash1;
+	BUCKET *b, *prev;
+	NODE *s2;
+	size_t s1_len;
+
+	if (symbol->table_size == 0)
+		return NULL;
+
+	s2 = force_string(subs);
+	hash1 = hash(s2->stptr, s2->stlen, (unsigned long) symbol->array_size, NULL);
+
+	for (b = symbol->buckets[hash1], prev = NULL; b != NULL;
+				prev = b, b = b->ahnext) {
+
+		/* Array indexes are strings; compare as such, always! */
+		s1_len = b->ahname_len;
+
+		if (s1_len != s2->stlen)
+			continue;
+		if (s1_len == 0		/* "" is a valid index */
+			    || memcmp(b->ahname_str, s2->stptr, s1_len) == 0) {
+			/* item found */
+
+			unref(b->ahname);
+			if (prev != NULL)
+				prev->ahnext = b->ahnext;
+			else
+				symbol->buckets[hash1] = b->ahnext;
+
+			/* delete bucket */
+			freebucket(b);
+
+			/* one less element in array */
+			if (--symbol->table_size == 0) {
+				if (symbol->buckets != NULL)
+					efree(symbol->buckets);
+				symbol->ainit(symbol, NULL);	/* re-initialize symbol */
+			}
+
+			return & success_node;	/* return success */
+		}
+	}
+
+	return NULL;
+}
+
+
+/* str_copy --- duplicate input array "symbol" */
+
+static NODE **
+str_copy(NODE *symbol, NODE *newsymb)
+{
+	BUCKET **old, **new, **pnew;
+	BUCKET *chain, *newchain;
+	unsigned long cursize, i;
+
+	assert(symbol->table_size > 0);
+
+	/* find the current hash size */
+	cursize = symbol->array_size;
+
+	/* allocate new table */
+	ezalloc(new, BUCKET **, cursize * sizeof(BUCKET *), "str_copy");
+
+	old = symbol->buckets;
+
+	for (i = 0; i < cursize; i++) {
+		for (chain = old[i], pnew = & new[i]; chain != NULL;
+				chain = chain->ahnext
+		) {
+			NODE *oldval, *newsubs;
+
+			getbucket(newchain);
+
+			/*
+			 * copy the corresponding name and
+			 * value from the original input list
+			 */
+
+			newsubs = newchain->ahname = dupnode(chain->ahname);
+			newchain->ahname_str = newsubs->stptr;
+			newchain->ahname_len = newsubs->stlen;
+
+			oldval = chain->ahvalue;
+			if (oldval->type == Node_val)
+				newchain->ahvalue = dupnode(oldval);
+			else {
+				NODE *r;
+
+				r = make_array();
+				r->vname = estrdup(oldval->vname, strlen(oldval->vname));
+				r->parent_array = newsymb;
+				newchain->ahvalue = assoc_copy(oldval, r);
+			}
+			newchain->ahcode = chain->ahcode;
+
+			*pnew = newchain;
+			newchain->ahnext = NULL;
+			pnew = & newchain->ahnext;
+		}
+	}
+
+	newsymb->table_size = symbol->table_size;
+	newsymb->buckets = new;
+	newsymb->array_size = cursize;
+	newsymb->flags = symbol->flags;
+	return NULL;
+}
+
+
+/* str_list --- return a list of array items */
+
+static NODE**
+str_list(NODE *symbol, NODE *t)
+{
+	NODE **list;
+	NODE *subs, *val;
+	BUCKET *b;
+	unsigned long num_elems, list_size, i, k = 0;
+	int elem_size = 1;
+	assoc_kind_t assoc_kind;
+
+	if (symbol->table_size == 0)
+		return NULL;
+
+	assoc_kind = (assoc_kind_t) t->flags;
+	if ((assoc_kind & (AINDEX|AVALUE)) == (AINDEX|AVALUE))
+		elem_size = 2;
+
+	/* allocate space for array */
+	num_elems = symbol->table_size;
+	if ((assoc_kind & (AINDEX|AVALUE|ADELETE)) == (AINDEX|ADELETE))
+		num_elems = 1;
+	list_size =  elem_size * num_elems;
+
+	emalloc(list, NODE **, list_size * sizeof(NODE *), "str_list");
+
+	/* populate it */
+
+	for (i = 0; i < symbol->array_size; i++) {
+		for (b = symbol->buckets[i]; b != NULL;	b = b->ahnext) {
+			/* index */
+			subs = b->ahname;
+			if ((assoc_kind & AINUM) != 0)
+				(void) force_number(subs);
+			list[k++] = dupnode(subs);
+
+			/* value */
+			if ((assoc_kind & AVALUE) != 0) {
+				val = b->ahvalue;
+				if (val->type == Node_val) {
+					if ((assoc_kind & AVNUM) != 0)
+						(void) force_number(val);
+					else if ((assoc_kind & AVSTR) != 0)
+						val = force_string(val);
+				}
+				list[k++] = val;
+			}
+			if (k >= list_size)
+				return list;
+		}
+	}
+	return list;
+}
+
+
+/* str_kilobytes --- calculate memory consumption of the assoc array */
+
+AWKNUM
+str_kilobytes(NODE *symbol)
+{
+	unsigned long bucket_cnt;
+	AWKNUM kb;
+
+	bucket_cnt = symbol->table_size;
+
+	/* This does not include extra memory for indices with stfmt != STFMT_UNUSED */
+	kb = (((AWKNUM) bucket_cnt) * sizeof (BUCKET) +
+		((AWKNUM) symbol->array_size) * sizeof (BUCKET *)) / 1024.0;
+	return kb;
+}
+
+
+/* str_dump --- dump array info */
+
+static NODE **
+str_dump(NODE *symbol, NODE *ndump)
+{
+#define HCNT	31
+
+	int indent_level;
+	unsigned long i, bucket_cnt;
+	BUCKET *b;
+	static size_t hash_dist[HCNT + 1];
+
+	indent_level = ndump->alevel;
+
+	if ((symbol->flags & XARRAY) == 0)
+		fprintf(output_fp, "%s `%s'\n",
+				(symbol->parent_array == NULL) ? "array" : "sub-array",
+				array_vname(symbol));
+	indent_level++;
+	indent(indent_level);
+	fprintf(output_fp, "array_func: str_array_func\n");
+	if (symbol->flags != 0) {
+		indent(indent_level);
+		fprintf(output_fp, "flags: %s\n", flags2str(symbol->flags));
+	}
+	indent(indent_level);
+	fprintf(output_fp, "STR_CHAIN_MAX: %lu\n", (unsigned long) STR_CHAIN_MAX);
+	indent(indent_level);
+	fprintf(output_fp, "array_size: %lu\n", (unsigned long) symbol->array_size);
+	indent(indent_level);
+	fprintf(output_fp, "table_size: %lu\n", (unsigned long) symbol->table_size);
+	indent(indent_level);
+	fprintf(output_fp, "Avg # of items per chain: %.2g\n",
+				((AWKNUM) symbol->table_size) / symbol->array_size);
+
+	indent(indent_level);
+	fprintf(output_fp, "memory: %.2g kB\n", str_kilobytes(symbol));
+
+	/* hash value distribution */
+
+	memset(hash_dist, '\0', (HCNT + 1) * sizeof(size_t));
+	for (i = 0; i < symbol->array_size; i++) {
+		bucket_cnt = 0;
+		for (b = symbol->buckets[i]; b != NULL;	b = b->ahnext)
+			bucket_cnt++;
+		if (bucket_cnt >= HCNT)
+			bucket_cnt = HCNT;
+		hash_dist[bucket_cnt]++;
+	}
+
+	indent(indent_level);
+	fprintf(output_fp, "Hash distribution:\n");
+	indent_level++;
+	for (i = 0; i <= HCNT; i++) {
+		if (hash_dist[i] > 0) {
+			indent(indent_level);
+			if (i == HCNT)
+				fprintf(output_fp, "[>=%lu]:%lu\n",
+					(unsigned long) HCNT, (unsigned long) hash_dist[i]);
+			else
+				fprintf(output_fp, "[%lu]:%lu\n",
+					(unsigned long) i, (unsigned long) hash_dist[i]);
+		}
+	}
+	indent_level--;
+
+	/* dump elements */
+
+	if (ndump->adepth >= 0) {
+		const char *aname;
+
+		fprintf(output_fp, "\n");
+		aname = make_aname(symbol);
+		for (i = 0; i < symbol->array_size; i++) {
+			for (b = symbol->buckets[i]; b != NULL;	b = b->ahnext)
+				assoc_info(b->ahname, b->ahvalue, ndump, aname);
+		}
+	}
+
+	return NULL;
+
+#undef HCNT
+}
+
+
+/* awk_hash --- calculate the hash function of the string in subs */
+
+static unsigned long
+awk_hash(const char *s, size_t len, unsigned long hsize, size_t *code)
+{
+	unsigned long h = 0;
+	unsigned long htmp;
+
+	/*
+	 * Ozan Yigit's original sdbm hash, copied from Margo Seltzers
+	 * db package.
+	 *
+	 * This is INCREDIBLY ugly, but fast.  We break the string up into
+	 * 8 byte units.  On the first time through the loop we get the
+	 * "leftover bytes" (strlen % 8).  On every other iteration, we
+	 * perform 8 HASHC's so we handle all 8 bytes.  Essentially, this
+	 * saves us 7 cmp & branch instructions.  If this routine is
+	 * heavily used enough, it's worth the ugly coding.
+	 */
+
+	/*
+	 * Even more speed:
+	 * #define HASHC   h = *s++ + 65599 * h
+	 * Because 65599 = pow(2, 6) + pow(2, 16) - 1 we multiply by shifts
+	 *
+	 * 4/2011: Force the results to 32 bits, to get the same
+	 * result on both 32- and 64-bit systems. This may be a
+	 * bad idea.
+	 */
+#define HASHC   htmp = (h << 6);  \
+		h = *s++ + htmp + (htmp << 10) - h ; \
+		htmp &= 0xFFFFFFFF; \
+		h &= 0xFFFFFFFF
+
+	h = 0;
+
+	/* "Duff's Device" */
+	if (len > 0) {
+		size_t loop = (len + 8 - 1) >> 3;
+
+		switch (len & (8 - 1)) {
+		case 0:
+			do {	/* All fall throughs */
+				HASHC;
+		case 7:		HASHC;
+		case 6:		HASHC;
+		case 5:		HASHC;
+		case 4:		HASHC;
+		case 3:		HASHC;
+		case 2:		HASHC;
+		case 1:		HASHC;
+			} while (--loop);
+		}
+	}
+
+	if (code != NULL)
+		*code = h;
+
+	if (h >= hsize)
+		h %= hsize;
+	return h;
+}
+
+
+/* str_find --- locate symbol[subs] */
+
+static inline NODE **
+str_find(NODE *symbol, NODE *s1, size_t code1, unsigned long hash1)
+{
+	BUCKET *b;
+	size_t s2_len;
+
+	for (b = symbol->buckets[hash1]; b != NULL; b = b->ahnext) {
+		/*
+		 * This used to use cmp_nodes() here.  That's wrong.
+		 * Array indexes are strings; compare as such, always!
+	 	 */
+		s2_len = b->ahname_len;
+
+		if (code1 == b->ahcode
+			&& s1->stlen == s2_len
+			&& (s2_len == 0		/* "" is a valid index */
+				|| memcmp(s1->stptr, b->ahname_str, s2_len) == 0)
+		)
+			return & (b->ahvalue);
+	}
+	return NULL;
+}
+
+
+/* grow_table --- grow a hash table */
+
+static void
+grow_table(NODE *symbol)
+{
+	BUCKET **old, **new;
+	BUCKET *chain, *next;
+	int i, j;
+	unsigned long oldsize, newsize, k;
+	unsigned long hash1;
+
+	/*
+	 * This is an array of primes. We grow the table by an order of
+	 * magnitude each time (not just doubling) so that growing is a
+	 * rare operation. We expect, on average, that it won't happen
+	 * more than twice.  The final size is also chosen to be small
+	 * enough so that MS-DOG mallocs can handle it. When things are
+	 * very large (> 8K), we just double more or less, instead of
+	 * just jumping from 8K to 64K.
+	 */
+
+	static const unsigned long sizes[] = {
+		13, 127, 1021, 8191, 16381, 32749, 65497,
+		131101, 262147, 524309, 1048583, 2097169,
+		4194319, 8388617, 16777259, 33554467,
+		67108879, 134217757, 268435459, 536870923,
+		1073741827
+	};
+
+	/* find next biggest hash size */
+	newsize = oldsize = symbol->array_size;
+
+	for (i = 0, j = sizeof(sizes)/sizeof(sizes[0]); i < j; i++) {
+		if (oldsize < sizes[i]) {
+			newsize = sizes[i];
+			break;
+		}
+	}
+	if (newsize == oldsize) {	/* table already at max (!) */
+		symbol->flags |= ARRAYMAXED;
+		return;
+	}
+
+	/* allocate new table */
+	ezalloc(new, BUCKET **, newsize * sizeof(BUCKET *), "grow_table");
+
+	old = symbol->buckets;
+	symbol->buckets = new;
+	symbol->array_size = newsize;
+
+	/* brand new hash table, set things up and return */
+	if (old == NULL) {
+		symbol->table_size = 0;
+		return;
+	}
+
+	/* old hash table there, move stuff to new, free old */
+
+	/*
+	 * note that symbol->table_size does not change if an old array,
+	 * and is explicitly set to 0 if a new one.
+	 */
+
+	for (k = 0; k < oldsize; k++) {
+		for (chain = old[k]; chain != NULL; chain = next) {
+			next = chain->ahnext;
+			hash1 = chain->ahcode % newsize;
+
+			/* remove from old list, add to new */
+			chain->ahnext = new[hash1];
+			new[hash1] = chain;
+		}
+	}
+	efree(old);
+}
+
+
+
+/*
+From bonzini@gnu.org  Mon Oct 28 16:05:26 2002
+Date: Mon, 28 Oct 2002 13:33:03 +0100
+From: Paolo Bonzini <bonzini@gnu.org>
+To: arnold@skeeve.com
+Subject: Hash function
+Message-ID: <20021028123303.GA6832@biancaneve>
+
+Here is the hash function I'm using in GNU Smalltalk.  The scrambling is
+needed if you use powers of two as the table sizes.  If you use primes it
+is not needed.
+
+To use double-hashing with power-of-two size, you should use the
+_gst_hash_string(str, len) as the primary hash and
+scramble(_gst_hash_string (str, len)) | 1 as the secondary hash.
+
+Paolo
+
+*/
+/*
+ * ADR: Slightly modified to work w/in the context of gawk.
+ */
+
+static unsigned long
+gst_hash_string(const char *str, size_t len, unsigned long hsize, size_t *code)
+{
+	unsigned long hashVal = 1497032417;    /* arbitrary value */
+	unsigned long ret;
+
+	while (len--) {
+		hashVal += *str++;
+		hashVal += (hashVal << 10);
+		hashVal ^= (hashVal >> 6);
+	}
+
+	ret = scramble(hashVal);
+
+	if (code != NULL)
+		*code = ret;
+
+	if (ret >= hsize)
+		ret %= hsize;
+
+	return ret;
+}
+
+static unsigned long
+scramble(unsigned long x)
+{
+	if (sizeof(long) == 4) {
+		int y = ~x;
+
+		x += (y << 10) | (y >> 22);
+		x += (x << 6)  | (x >> 26);
+		x -= (x << 16) | (x >> 16);
+	} else {
+		x ^= (~x) >> 31;
+		x += (x << 21) | (x >> 11);
+		x += (x << 5) | (x >> 27);
+		x += (x << 27) | (x >> 5);
+		x += (x << 31);
+	}
+
+	return x;
+}
+
+/* env_remove --- for ENVIRON, remove value from real environment */
+
+static NODE **
+env_remove(NODE *symbol, NODE *subs)
+{
+	NODE **val = str_remove(symbol, subs);
+	char save;
+
+	if (val != NULL) {
+		str_terminate(subs, save);
+		(void) unsetenv(subs->stptr);
+		str_restore(subs, save);
+	}
+
+	return val;
+}
+
+/* env_clear --- clear out the environment when ENVIRON is deleted */
+
+static NODE **
+env_clear(NODE *symbol, NODE *subs)
+{
+	extern char **environ;
+	NODE **val = str_clear(symbol, subs);
+
+	environ = NULL;	/* ZAP! */
+
+	/* str_clear zaps the vtable, reset it */
+	symbol->array_funcs = & env_array_func;
+
+	return val;
+}
+
+/* env_store --- post assign function for ENVIRON, put new value into env */
+
+static NODE **
+env_store(NODE *symbol, NODE *subs)
+{
+	NODE **val = str_exists(symbol, subs);
+	const char *newval;
+
+	assert(val != NULL);
+
+	newval = (*val)->stptr;
+	if (newval == NULL)
+		newval = "";
+
+	(void) setenv(subs->stptr, newval, 1);
+
+	return val;
+}
+
+/* init_env_array --- set up the pointers for ENVIRON. A bit hacky. */
+
+void
+init_env_array(NODE *env_node)
+{
+	/* If POSIX simply don't reset the vtable and things work as before */
+	if (do_posix)
+		return;
+
+	env_node->array_funcs = & env_array_func;
+}
diff --git a/gawk-5.0.1/support/ChangeLog b/gawk-5.0.1/support/ChangeLog
new file mode 100644
index 00000000000..1796c2eb62e
--- /dev/null
+++ b/gawk-5.0.1/support/ChangeLog
@@ -0,0 +1,17 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-05-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* cdefs.h, dfa.h, dfa.c, verify.h: Sync from GNULIB.
+
+2019-04-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regcomp.c, regex_internal.h: Sync from GNULIB.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/support/Makefile.am b/gawk-5.0.1/support/Makefile.am
new file mode 100644
index 00000000000..3a72c15e305
--- /dev/null
+++ b/gawk-5.0.1/support/Makefile.am
@@ -0,0 +1,66 @@
+#
+# Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 2000-2016, 2018, 2019 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+## process this file with automake to produce Makefile.in
+
+# This insures that make flags get passed down to child makes.
+AM_MAKEFLAGS = 'CFLAGS=$(CFLAGS)' 'LDFLAGS=$(LDFLAGS)'
+
+# Stuff to include in the dist that doesn't need it's own
+# Makefile.am files
+EXTRA_DIST = \
+	Makefile.am \
+	Makefile.in \
+	cdefs.h \
+	libc-config.h \
+	regcomp.c \
+	regex_internal.c \
+	regex_internal.h \
+	regexec.c
+
+# what to make and install
+noinst_LIBRARIES = libsupport.a
+libsupport_a_SOURCES = \
+	dfa.c \
+	dfa.h \
+	getopt.c \
+	getopt.h \
+	getopt_int.h \
+	getopt1.c \
+	intprops.h \
+	localeinfo.c \
+	localeinfo.h \
+	random.c \
+	random.h \
+	regex.c \
+	regex.h \
+	verify.h \
+	xalloc.h
+
+# For some make's, e.g. OpenBSD, that don't define this
+RM = rm -f
+
+DEFS = -DGAWK -DHAVE_CONFIG_H -I"$(srcdir)/.."
+
+distclean-local:
+	rm -fr .deps
diff --git a/gawk-5.0.1/support/Makefile.in b/gawk-5.0.1/support/Makefile.in
new file mode 100644
index 00000000000..ac697798fca
--- /dev/null
+++ b/gawk-5.0.1/support/Makefile.in
@@ -0,0 +1,671 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 2000-2016, 2018, 2019 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = support
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \
+	$(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libsigsegv.m4 $(top_srcdir)/m4/longlong.m4 \
+	$(top_srcdir)/m4/mpfr.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/noreturn.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/readline.m4 \
+	$(top_srcdir)/m4/socket.m4 $(top_srcdir)/m4/ulonglong.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libsupport_a_AR = $(AR) $(ARFLAGS)
+libsupport_a_LIBADD =
+am_libsupport_a_OBJECTS = dfa.$(OBJEXT) getopt.$(OBJEXT) \
+	getopt1.$(OBJEXT) localeinfo.$(OBJEXT) random.$(OBJEXT) \
+	regex.$(OBJEXT)
+libsupport_a_OBJECTS = $(am_libsupport_a_OBJECTS)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ./$(DEPDIR)/dfa.Po ./$(DEPDIR)/getopt.Po \
+	./$(DEPDIR)/getopt1.Po ./$(DEPDIR)/localeinfo.Po \
+	./$(DEPDIR)/random.Po ./$(DEPDIR)/regex.Po
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libsupport_a_SOURCES)
+DIST_SOURCES = $(libsupport_a_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+	$(top_srcdir)/mkinstalldirs ChangeLog
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = -DGAWK -DHAVE_CONFIG_H -I"$(srcdir)/.."
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GAWKLIBEXT = @GAWKLIBEXT@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_LIBSIGSEGV = @HAVE_LIBSIGSEGV@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMPFR = @LIBMPFR@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBSIGSEGV = @LIBSIGSEGV@
+LIBSIGSEGV_PREFIX = @LIBSIGSEGV_PREFIX@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSIGSEGV = @LTLIBSIGSEGV@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+ZOS_FAIL = @ZOS_FAIL@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+acl_shlibext = @acl_shlibext@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgextensiondir = @pkgextensiondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# This insures that make flags get passed down to child makes.
+AM_MAKEFLAGS = 'CFLAGS=$(CFLAGS)' 'LDFLAGS=$(LDFLAGS)'
+
+# Stuff to include in the dist that doesn't need it's own
+# Makefile.am files
+EXTRA_DIST = \
+	Makefile.am \
+	Makefile.in \
+	cdefs.h \
+	libc-config.h \
+	regcomp.c \
+	regex_internal.c \
+	regex_internal.h \
+	regexec.c
+
+
+# what to make and install
+noinst_LIBRARIES = libsupport.a
+libsupport_a_SOURCES = \
+	dfa.c \
+	dfa.h \
+	getopt.c \
+	getopt.h \
+	getopt_int.h \
+	getopt1.c \
+	intprops.h \
+	localeinfo.c \
+	localeinfo.h \
+	random.c \
+	random.h \
+	regex.c \
+	regex.h \
+	verify.h \
+	xalloc.h
+
+
+# For some make's, e.g. OpenBSD, that don't define this
+RM = rm -f
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu support/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu support/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+libsupport.a: $(libsupport_a_OBJECTS) $(libsupport_a_DEPENDENCIES) $(EXTRA_libsupport_a_DEPENDENCIES) 
+	$(AM_V_at)-rm -f libsupport.a
+	$(AM_V_AR)$(libsupport_a_AR) libsupport.a $(libsupport_a_OBJECTS) $(libsupport_a_LIBADD)
+	$(AM_V_at)$(RANLIB) libsupport.a
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dfa.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localeinfo.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+	@$(MKDIR_P) $(@D)
+	@echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+		-rm -f ./$(DEPDIR)/dfa.Po
+	-rm -f ./$(DEPDIR)/getopt.Po
+	-rm -f ./$(DEPDIR)/getopt1.Po
+	-rm -f ./$(DEPDIR)/localeinfo.Po
+	-rm -f ./$(DEPDIR)/random.Po
+	-rm -f ./$(DEPDIR)/regex.Po
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-local distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+		-rm -f ./$(DEPDIR)/dfa.Po
+	-rm -f ./$(DEPDIR)/getopt.Po
+	-rm -f ./$(DEPDIR)/getopt1.Po
+	-rm -f ./$(DEPDIR)/localeinfo.Po
+	-rm -f ./$(DEPDIR)/random.Po
+	-rm -f ./$(DEPDIR)/regex.Po
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+	clean-generic clean-noinstLIBRARIES cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-local distclean-tags distdir dvi dvi-am html html-am \
+	info info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
+	ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+distclean-local:
+	rm -fr .deps
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/support/cdefs.h b/gawk-5.0.1/support/cdefs.h
new file mode 100644
index 00000000000..4f921754436
--- /dev/null
+++ b/gawk-5.0.1/support/cdefs.h
@@ -0,0 +1,514 @@
+/* Copyright (C) 1992-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef	_SYS_CDEFS_H
+#define	_SYS_CDEFS_H	1
+
+/* We are almost always included from features.h. */
+#ifndef _FEATURES_H
+# include <features.h>
+#endif
+
+/* The GNU libc does not support any K&R compilers or the traditional mode
+   of ISO C compilers anymore.  Check for some of the combinations not
+   anymore supported.  */
+#if defined __GNUC__ && !defined __STDC__
+# error "You need a ISO C conforming compiler to use the glibc headers"
+#endif
+
+/* Some user header file might have defined this before.  */
+#undef	__P
+#undef	__PMT
+
+#ifdef __GNUC__
+
+/* All functions, except those with callbacks or those that
+   synchronize memory, are leaf functions.  */
+# if __GNUC_PREREQ (4, 6) && !defined _LIBC
+#  define __LEAF , __leaf__
+#  define __LEAF_ATTR __attribute__ ((__leaf__))
+# else
+#  define __LEAF
+#  define __LEAF_ATTR
+# endif
+
+/* GCC can always grok prototypes.  For C++ programs we add throw()
+   to help it optimize the function calls.  But this works only with
+   gcc 2.8.x and egcs.  For gcc 3.2 and up we even mark C functions
+   as non-throwing using a function attribute since programs can use
+   the -fexceptions options for C code as well.  */
+# if !defined __cplusplus && __GNUC_PREREQ (3, 3)
+#  define __THROW	__attribute__ ((__nothrow__ __LEAF))
+#  define __THROWNL	__attribute__ ((__nothrow__))
+#  define __NTH(fct)	__attribute__ ((__nothrow__ __LEAF)) fct
+#  define __NTHNL(fct)  __attribute__ ((__nothrow__)) fct
+# else
+#  if defined __cplusplus && __GNUC_PREREQ (2,8)
+#   define __THROW	throw ()
+#   define __THROWNL	throw ()
+#   define __NTH(fct)	__LEAF_ATTR fct throw ()
+#   define __NTHNL(fct) fct throw ()
+#  else
+#   define __THROW
+#   define __THROWNL
+#   define __NTH(fct)	fct
+#   define __NTHNL(fct) fct
+#  endif
+# endif
+
+#else	/* Not GCC.  */
+
+# if (defined __cplusplus						\
+      || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
+#  define __inline	inline
+# else
+#  define __inline		/* No inline functions.  */
+# endif
+
+# define __THROW
+# define __THROWNL
+# define __NTH(fct)	fct
+
+#endif	/* GCC.  */
+
+/* Compilers that are not clang may object to
+       #if defined __clang__ && __has_extension(...)
+   even though they do not need to evaluate the right-hand side of the &&.  */
+#if defined __clang__ && defined __has_extension
+# define __glibc_clang_has_extension(ext) __has_extension (ext)
+#else
+# define __glibc_clang_has_extension(ext) 0
+#endif
+
+/* These two macros are not used in glibc anymore.  They are kept here
+   only because some other projects expect the macros to be defined.  */
+#define __P(args)	args
+#define __PMT(args)	args
+
+/* For these things, GCC behaves the ANSI way normally,
+   and the non-ANSI way under -traditional.  */
+
+#define __CONCAT(x,y)	x ## y
+#define __STRING(x)	#x
+
+/* This is not a typedef so `const __ptr_t' does the right thing.  */
+#define __ptr_t void *
+
+
+/* C++ needs to know that types and declarations are C, not C++.  */
+#ifdef	__cplusplus
+# define __BEGIN_DECLS	extern "C" {
+# define __END_DECLS	}
+#else
+# define __BEGIN_DECLS
+# define __END_DECLS
+#endif
+
+
+/* Fortify support.  */
+#define __bos(ptr) __builtin_object_size (ptr, __USE_FORTIFY_LEVEL > 1)
+#define __bos0(ptr) __builtin_object_size (ptr, 0)
+
+#if __GNUC_PREREQ (4,3)
+# define __warndecl(name, msg) \
+  extern void name (void) __attribute__((__warning__ (msg)))
+# define __warnattr(msg) __attribute__((__warning__ (msg)))
+# define __errordecl(name, msg) \
+  extern void name (void) __attribute__((__error__ (msg)))
+#else
+# define __warndecl(name, msg) extern void name (void)
+# define __warnattr(msg)
+# define __errordecl(name, msg) extern void name (void)
+#endif
+
+/* Support for flexible arrays.
+   Headers that should use flexible arrays only if they're "real"
+   (e.g. only if they won't affect sizeof()) should test
+   #if __glibc_c99_flexarr_available.  */
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L && !defined __HP_cc
+# define __flexarr	[]
+# define __glibc_c99_flexarr_available 1
+#elif __GNUC_PREREQ (2,97)
+/* GCC 2.97 supports C99 flexible array members as an extension,
+   even when in C89 mode or compiling C++ (any version).  */
+# define __flexarr	[]
+# define __glibc_c99_flexarr_available 1
+#elif defined __GNUC__
+/* Pre-2.97 GCC did not support C99 flexible arrays but did have
+   an equivalent extension with slightly different notation.  */
+# define __flexarr	[0]
+# define __glibc_c99_flexarr_available 1
+#else
+/* Some other non-C99 compiler.  Approximate with [1].  */
+# define __flexarr	[1]
+# define __glibc_c99_flexarr_available 0
+#endif
+
+
+/* __asm__ ("xyz") is used throughout the headers to rename functions
+   at the assembly language level.  This is wrapped by the __REDIRECT
+   macro, in order to support compilers that can do this some other
+   way.  When compilers don't support asm-names at all, we have to do
+   preprocessor tricks instead (which don't have exactly the right
+   semantics, but it's the best we can do).
+
+   Example:
+   int __REDIRECT(setpgrp, (__pid_t pid, __pid_t pgrp), setpgid); */
+
+#if defined __GNUC__ && __GNUC__ >= 2
+
+# define __REDIRECT(name, proto, alias) name proto __asm__ (__ASMNAME (#alias))
+# ifdef __cplusplus
+#  define __REDIRECT_NTH(name, proto, alias) \
+     name proto __THROW __asm__ (__ASMNAME (#alias))
+#  define __REDIRECT_NTHNL(name, proto, alias) \
+     name proto __THROWNL __asm__ (__ASMNAME (#alias))
+# else
+#  define __REDIRECT_NTH(name, proto, alias) \
+     name proto __asm__ (__ASMNAME (#alias)) __THROW
+#  define __REDIRECT_NTHNL(name, proto, alias) \
+     name proto __asm__ (__ASMNAME (#alias)) __THROWNL
+# endif
+# define __ASMNAME(cname)  __ASMNAME2 (__USER_LABEL_PREFIX__, cname)
+# define __ASMNAME2(prefix, cname) __STRING (prefix) cname
+
+/*
+#elif __SOME_OTHER_COMPILER__
+
+# define __REDIRECT(name, proto, alias) name proto; \
+	_Pragma("let " #name " = " #alias)
+*/
+#endif
+
+/* GCC has various useful declarations that can be made with the
+   `__attribute__' syntax.  All of the ways we use this do fine if
+   they are omitted for compilers that don't understand it. */
+#if !defined __GNUC__ || __GNUC__ < 2
+# define __attribute__(xyz)	/* Ignore */
+#endif
+
+/* At some point during the gcc 2.96 development the `malloc' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.  */
+#if __GNUC_PREREQ (2,96)
+# define __attribute_malloc__ __attribute__ ((__malloc__))
+#else
+# define __attribute_malloc__ /* Ignore */
+#endif
+
+/* Tell the compiler which arguments to an allocation function
+   indicate the size of the allocation.  */
+#if __GNUC_PREREQ (4, 3)
+# define __attribute_alloc_size__(params) \
+  __attribute__ ((__alloc_size__ params))
+#else
+# define __attribute_alloc_size__(params) /* Ignore.  */
+#endif
+
+/* At some point during the gcc 2.96 development the `pure' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.  */
+#if __GNUC_PREREQ (2,96)
+# define __attribute_pure__ __attribute__ ((__pure__))
+#else
+# define __attribute_pure__ /* Ignore */
+#endif
+
+/* This declaration tells the compiler that the value is constant.  */
+#if __GNUC_PREREQ (2,5)
+# define __attribute_const__ __attribute__ ((__const__))
+#else
+# define __attribute_const__ /* Ignore */
+#endif
+
+/* At some point during the gcc 3.1 development the `used' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.  */
+#if __GNUC_PREREQ (3,1)
+# define __attribute_used__ __attribute__ ((__used__))
+# define __attribute_noinline__ __attribute__ ((__noinline__))
+#else
+# define __attribute_used__ __attribute__ ((__unused__))
+# define __attribute_noinline__ /* Ignore */
+#endif
+
+/* Since version 3.2, gcc allows marking deprecated functions.  */
+#if __GNUC_PREREQ (3,2)
+# define __attribute_deprecated__ __attribute__ ((__deprecated__))
+#else
+# define __attribute_deprecated__ /* Ignore */
+#endif
+
+/* Since version 4.5, gcc also allows one to specify the message printed
+   when a deprecated function is used.  clang claims to be gcc 4.2, but
+   may also support this feature.  */
+#if __GNUC_PREREQ (4,5) || \
+    __glibc_clang_has_extension (__attribute_deprecated_with_message__)
+# define __attribute_deprecated_msg__(msg) \
+	 __attribute__ ((__deprecated__ (msg)))
+#else
+# define __attribute_deprecated_msg__(msg) __attribute_deprecated__
+#endif
+
+/* At some point during the gcc 2.8 development the `format_arg' attribute
+   for functions was introduced.  We don't want to use it unconditionally
+   (although this would be possible) since it generates warnings.
+   If several `format_arg' attributes are given for the same function, in
+   gcc-3.0 and older, all but the last one are ignored.  In newer gccs,
+   all designated arguments are considered.  */
+#if __GNUC_PREREQ (2,8)
+# define __attribute_format_arg__(x) __attribute__ ((__format_arg__ (x)))
+#else
+# define __attribute_format_arg__(x) /* Ignore */
+#endif
+
+/* At some point during the gcc 2.97 development the `strfmon' format
+   attribute for functions was introduced.  We don't want to use it
+   unconditionally (although this would be possible) since it
+   generates warnings.  */
+#if __GNUC_PREREQ (2,97)
+# define __attribute_format_strfmon__(a,b) \
+  __attribute__ ((__format__ (__strfmon__, a, b)))
+#else
+# define __attribute_format_strfmon__(a,b) /* Ignore */
+#endif
+
+/* The nonnull function attribute marks pointer parameters that
+   must not be NULL.  Do not define __nonnull if it is already defined,
+   for portability when this file is used in Gnulib.  */
+#ifndef __nonnull
+# if __GNUC_PREREQ (3,3)
+#  define __nonnull(params) __attribute__ ((__nonnull__ params))
+# else
+#  define __nonnull(params)
+# endif
+#endif
+
+/* If fortification mode, we warn about unused results of certain
+   function calls which can lead to problems.  */
+#if __GNUC_PREREQ (3,4)
+# define __attribute_warn_unused_result__ \
+   __attribute__ ((__warn_unused_result__))
+# if defined __USE_FORTIFY_LEVEL && __USE_FORTIFY_LEVEL > 0
+#  define __wur __attribute_warn_unused_result__
+# endif
+#else
+# define __attribute_warn_unused_result__ /* empty */
+#endif
+#ifndef __wur
+# define __wur /* Ignore */
+#endif
+
+/* Forces a function to be always inlined.  */
+#if __GNUC_PREREQ (3,2)
+/* The Linux kernel defines __always_inline in stddef.h (283d7573), and
+   it conflicts with this definition.  Therefore undefine it first to
+   allow either header to be included first.  */
+# undef __always_inline
+# define __always_inline __inline __attribute__ ((__always_inline__))
+#else
+# undef __always_inline
+# define __always_inline __inline
+#endif
+
+/* Associate error messages with the source location of the call site rather
+   than with the source location inside the function.  */
+#if __GNUC_PREREQ (4,3)
+# define __attribute_artificial__ __attribute__ ((__artificial__))
+#else
+# define __attribute_artificial__ /* Ignore */
+#endif
+
+/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
+   inline semantics, unless -fgnu89-inline is used.  Using __GNUC_STDC_INLINE__
+   or __GNUC_GNU_INLINE is not a good enough check for gcc because gcc versions
+   older than 4.3 may define these macros and still not guarantee GNU inlining
+   semantics.
+
+   clang++ identifies itself as gcc-4.2, but has support for GNU inlining
+   semantics, that can be checked for by using the __GNUC_STDC_INLINE_ and
+   __GNUC_GNU_INLINE__ macro definitions.  */
+#if (!defined __cplusplus || __GNUC_PREREQ (4,3) \
+     || (defined __clang__ && (defined __GNUC_STDC_INLINE__ \
+			       || defined __GNUC_GNU_INLINE__)))
+# if defined __GNUC_STDC_INLINE__ || defined __cplusplus
+#  define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
+#  define __extern_always_inline \
+  extern __always_inline __attribute__ ((__gnu_inline__))
+# else
+#  define __extern_inline extern __inline
+#  define __extern_always_inline extern __always_inline
+# endif
+#endif
+
+#ifdef __extern_always_inline
+# define __fortify_function __extern_always_inline __attribute_artificial__
+#endif
+
+/* GCC 4.3 and above allow passing all anonymous arguments of an
+   __extern_always_inline function to some other vararg function.  */
+#if __GNUC_PREREQ (4,3)
+# define __va_arg_pack() __builtin_va_arg_pack ()
+# define __va_arg_pack_len() __builtin_va_arg_pack_len ()
+#endif
+
+/* It is possible to compile containing GCC extensions even if GCC is
+   run in pedantic mode if the uses are carefully marked using the
+   `__extension__' keyword.  But this is not generally available before
+   version 2.8.  */
+#if !__GNUC_PREREQ (2,8)
+# define __extension__		/* Ignore */
+#endif
+
+/* __restrict is known in EGCS 1.2 and above. */
+#if !__GNUC_PREREQ (2,92)
+# if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#  define __restrict	restrict
+# else
+#  define __restrict	/* Ignore */
+# endif
+#endif
+
+/* ISO C99 also allows to declare arrays as non-overlapping.  The syntax is
+     array_name[restrict]
+   GCC 3.1 supports this.  */
+#if __GNUC_PREREQ (3,1) && !defined __GNUG__
+# define __restrict_arr	__restrict
+#else
+# ifdef __GNUC__
+#  define __restrict_arr	/* Not supported in old GCC.  */
+# else
+#  if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#   define __restrict_arr	restrict
+#  else
+/* Some other non-C99 compiler.  */
+#   define __restrict_arr	/* Not supported.  */
+#  endif
+# endif
+#endif
+
+#if __GNUC__ >= 3
+# define __glibc_unlikely(cond)	__builtin_expect ((cond), 0)
+# define __glibc_likely(cond)	__builtin_expect ((cond), 1)
+#else
+# define __glibc_unlikely(cond)	(cond)
+# define __glibc_likely(cond)	(cond)
+#endif
+
+#ifdef __has_attribute
+# define __glibc_has_attribute(attr)	__has_attribute (attr)
+#else
+# define __glibc_has_attribute(attr)	0
+#endif
+
+#if (!defined _Noreturn \
+     && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
+     &&  !__GNUC_PREREQ (4,7))
+# if __GNUC_PREREQ (2,8)
+#  define _Noreturn __attribute__ ((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+
+#if __GNUC_PREREQ (8, 0)
+/* Describes a char array whose address can safely be passed as the first
+   argument to strncpy and strncat, as the char array is not necessarily
+   a NUL-terminated string.  */
+# define __attribute_nonstring__ __attribute__ ((__nonstring__))
+#else
+# define __attribute_nonstring__
+#endif
+
+#if (!defined _Static_assert && !defined __cplusplus \
+     && (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
+     && (!__GNUC_PREREQ (4, 6) || defined __STRICT_ANSI__))
+# define _Static_assert(expr, diagnostic) \
+    extern int (*__Static_assert_function (void)) \
+      [!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
+#endif
+
+/* The #ifndef lets Gnulib avoid including these on non-glibc
+   platforms, where the includes typically do not exist.  */
+#ifndef __WORDSIZE
+# include <bits/wordsize.h>
+# include <bits/long-double.h>
+#endif
+
+#if defined __LONG_DOUBLE_MATH_OPTIONAL && defined __NO_LONG_DOUBLE_MATH
+# define __LDBL_COMPAT 1
+# ifdef __REDIRECT
+#  define __LDBL_REDIR1(name, proto, alias) __REDIRECT (name, proto, alias)
+#  define __LDBL_REDIR(name, proto) \
+  __LDBL_REDIR1 (name, proto, __nldbl_##name)
+#  define __LDBL_REDIR1_NTH(name, proto, alias) __REDIRECT_NTH (name, proto, alias)
+#  define __LDBL_REDIR_NTH(name, proto) \
+  __LDBL_REDIR1_NTH (name, proto, __nldbl_##name)
+#  define __LDBL_REDIR1_DECL(name, alias) \
+  extern __typeof (name) name __asm (__ASMNAME (#alias));
+#  define __LDBL_REDIR_DECL(name) \
+  extern __typeof (name) name __asm (__ASMNAME ("__nldbl_" #name));
+#  define __REDIRECT_LDBL(name, proto, alias) \
+  __LDBL_REDIR1 (name, proto, __nldbl_##alias)
+#  define __REDIRECT_NTH_LDBL(name, proto, alias) \
+  __LDBL_REDIR1_NTH (name, proto, __nldbl_##alias)
+# endif
+#endif
+#if !defined __LDBL_COMPAT || !defined __REDIRECT
+# define __LDBL_REDIR1(name, proto, alias) name proto
+# define __LDBL_REDIR(name, proto) name proto
+# define __LDBL_REDIR1_NTH(name, proto, alias) name proto __THROW
+# define __LDBL_REDIR_NTH(name, proto) name proto __THROW
+# define __LDBL_REDIR_DECL(name)
+# ifdef __REDIRECT
+#  define __REDIRECT_LDBL(name, proto, alias) __REDIRECT (name, proto, alias)
+#  define __REDIRECT_NTH_LDBL(name, proto, alias) \
+  __REDIRECT_NTH (name, proto, alias)
+# endif
+#endif
+
+/* __glibc_macro_warning (MESSAGE) issues warning MESSAGE.  This is
+   intended for use in preprocessor macros.
+
+   Note: MESSAGE must be a _single_ string; concatenation of string
+   literals is not supported.  */
+#if __GNUC_PREREQ (4,8) || __glibc_clang_prereq (3,5)
+# define __glibc_macro_warning1(message) _Pragma (#message)
+# define __glibc_macro_warning(message) \
+  __glibc_macro_warning1 (GCC warning message)
+#else
+# define __glibc_macro_warning(msg)
+#endif
+
+/* Generic selection (ISO C11) is a C-only feature, available in GCC
+   since version 4.9.  Previous versions do not provide generic
+   selection, even though they might set __STDC_VERSION__ to 201112L,
+   when in -std=c11 mode.  Thus, we must check for !defined __GNUC__
+   when testing __STDC_VERSION__ for generic selection support.
+   On the other hand, Clang also defines __GNUC__, so a clang-specific
+   check is required to enable the use of generic selection.  */
+#if !defined __cplusplus \
+    && (__GNUC_PREREQ (4, 9) \
+	|| __glibc_clang_has_extension (c_generic_selections) \
+	|| (!defined __GNUC__ && defined __STDC_VERSION__ \
+	    && __STDC_VERSION__ >= 201112L))
+# define __HAVE_GENERIC_SELECTION 1
+#else
+# define __HAVE_GENERIC_SELECTION 0
+#endif
+
+#endif	 /* sys/cdefs.h */
diff --git a/gawk-5.0.1/support/dfa.c b/gawk-5.0.1/support/dfa.c
new file mode 100644
index 00000000000..fec637a6ef9
--- /dev/null
+++ b/gawk-5.0.1/support/dfa.c
@@ -0,0 +1,4391 @@
+/* dfa.c - deterministic extended regexp routines for GNU
+   Copyright (C) 1988, 1998, 2000, 2002, 2004-2005, 2007-2019 Free Software
+   Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc.,
+   51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA */
+
+/* Written June, 1988 by Mike Haertel
+   Modified July, 1988 by Arthur David Olson to assist BMG speedups  */
+
+#include <config.h>
+
+#include <assert.h>
+#include <ctype.h>
+#ifndef VMS
+#include <stdint.h>
+#else
+#define SIZE_MAX __INT32_MAX
+#define PTRDIFF_MAX __INT32_MAX
+#endif
+#include <stdio.h>
+
+#ifndef VMS
+#include <sys/types.h>
+#else
+#include <stddef.h>
+#endif
+#include <stdlib.h>
+#include <limits.h>
+#include <string.h>
+#if HAVE_SETLOCALE
+#include <locale.h>
+#endif
+
+#include "dfa.h"	// gets stdbool.h for us
+
+static bool
+streq (char const *a, char const *b)
+{
+  return strcmp (a, b) == 0;
+}
+
+static bool
+isasciidigit (char c)
+{
+  return '0' <= c && c <= '9';
+}
+
+/* Gawk doesn't use Gnulib, so don't assume that setlocale is present.  */
+#ifndef LC_ALL
+# define setlocale(category, locale) NULL
+#endif
+
+#include "gettext.h"
+#define _(str) gettext (str)
+
+#include <wchar.h>
+
+#include "intprops.h"
+#include "xalloc.h"
+#include "localeinfo.h"
+
+#ifndef FALLTHROUGH
+# if __GNUC__ < 7
+#  define FALLTHROUGH ((void) 0)
+# else
+#  define FALLTHROUGH __attribute__ ((__fallthrough__))
+# endif
+#endif
+
+#ifndef MIN
+# define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#if defined(__DJGPP__)
+#include "mbsupport.h"
+#endif
+
+#ifdef GAWK
+static int
+is_blank (int c)
+{
+   return (c == ' ' || c == '\t');
+}
+#endif /* GAWK */
+
+/* HPUX defines these as macros in sys/param.h.  */
+#ifdef setbit
+# undef setbit
+#endif
+#ifdef clrbit
+# undef clrbit
+#endif
+
+/* First integer value that is greater than any character code.  */
+enum { NOTCHAR = 1 << CHAR_BIT };
+
+/* This represents part of a character class.  It must be unsigned and
+   at least CHARCLASS_WORD_BITS wide.  Any excess bits are zero.  */
+typedef unsigned long int charclass_word;
+
+/* CHARCLASS_WORD_BITS is the number of bits used in a charclass word.
+   CHARCLASS_PAIR (LO, HI) is part of a charclass initializer, and
+   represents 64 bits' worth of a charclass, where LO and HI are the
+   low and high-order 32 bits of the 64-bit quantity.  */
+#if ULONG_MAX >> 31 >> 31 < 3
+enum { CHARCLASS_WORD_BITS = 32 };
+# define CHARCLASS_PAIR(lo, hi) lo, hi
+#else
+enum { CHARCLASS_WORD_BITS = 64 };
+# define CHARCLASS_PAIR(lo, hi) (((charclass_word) (hi) << 32) + (lo))
+#endif
+
+/* An initializer for a charclass whose 32-bit words are A through H.  */
+#define CHARCLASS_INIT(a, b, c, d, e, f, g, h)		\
+   {{							\
+      CHARCLASS_PAIR (a, b), CHARCLASS_PAIR (c, d),	\
+      CHARCLASS_PAIR (e, f), CHARCLASS_PAIR (g, h)	\
+   }}
+
+/* The maximum useful value of a charclass_word; all used bits are 1.  */
+static charclass_word const CHARCLASS_WORD_MASK
+  = ((charclass_word) 1 << (CHARCLASS_WORD_BITS - 1) << 1) - 1;
+
+/* Number of words required to hold a bit for every character.  */
+enum
+{
+  CHARCLASS_WORDS = (NOTCHAR + CHARCLASS_WORD_BITS - 1) / CHARCLASS_WORD_BITS
+};
+
+/* Sets of unsigned characters are stored as bit vectors in arrays of ints.  */
+typedef struct { charclass_word w[CHARCLASS_WORDS]; } charclass;
+
+/* Convert a possibly-signed character to an unsigned character.  This is
+   a bit safer than casting to unsigned char, since it catches some type
+   errors that the cast doesn't.  */
+static unsigned char
+to_uchar (char ch)
+{
+  return ch;
+}
+
+/* Contexts tell us whether a character is a newline or a word constituent.
+   Word-constituent characters are those that satisfy iswalnum, plus '_'.
+   Each character has a single CTX_* value; bitmasks of CTX_* values denote
+   a particular character class.
+
+   A state also stores a context value, which is a bitmask of CTX_* values.
+   A state's context represents a set of characters that the state's
+   predecessors must match.  For example, a state whose context does not
+   include CTX_LETTER will never have transitions where the previous
+   character is a word constituent.  A state whose context is CTX_ANY
+   might have transitions from any character.  */
+
+enum
+  {
+    CTX_NONE = 1,
+    CTX_LETTER = 2,
+    CTX_NEWLINE = 4,
+    CTX_ANY = 7
+  };
+
+/* Sometimes characters can only be matched depending on the surrounding
+   context.  Such context decisions depend on what the previous character
+   was, and the value of the current (lookahead) character.  Context
+   dependent constraints are encoded as 9-bit integers.  Each bit that
+   is set indicates that the constraint succeeds in the corresponding
+   context.
+
+   bit 6-8  - valid contexts when next character is CTX_NEWLINE
+   bit 3-5  - valid contexts when next character is CTX_LETTER
+   bit 0-2  - valid contexts when next character is CTX_NONE
+
+   succeeds_in_context determines whether a given constraint
+   succeeds in a particular context.  Prev is a bitmask of possible
+   context values for the previous character, curr is the (single-bit)
+   context value for the lookahead character.  */
+static int
+newline_constraint (int constraint)
+{
+  return (constraint >> 6) & 7;
+}
+static int
+letter_constraint (int constraint)
+{
+  return (constraint >> 3) & 7;
+}
+static int
+other_constraint (int constraint)
+{
+  return constraint & 7;
+}
+
+static bool
+succeeds_in_context (int constraint, int prev, int curr)
+{
+  return !! (((curr & CTX_NONE      ? other_constraint (constraint) : 0) \
+              | (curr & CTX_LETTER  ? letter_constraint (constraint) : 0) \
+              | (curr & CTX_NEWLINE ? newline_constraint (constraint) : 0)) \
+             & prev);
+}
+
+/* The following describe what a constraint depends on.  */
+static bool
+prev_newline_dependent (int constraint)
+{
+  return ((constraint ^ constraint >> 2) & 0111) != 0;
+}
+static bool
+prev_letter_dependent (int constraint)
+{
+  return ((constraint ^ constraint >> 1) & 0111) != 0;
+}
+
+/* Tokens that match the empty string subject to some constraint actually
+   work by applying that constraint to determine what may follow them,
+   taking into account what has gone before.  The following values are
+   the constraints corresponding to the special tokens previously defined.  */
+enum
+  {
+    NO_CONSTRAINT = 0777,
+    BEGLINE_CONSTRAINT = 0444,
+    ENDLINE_CONSTRAINT = 0700,
+    BEGWORD_CONSTRAINT = 0050,
+    ENDWORD_CONSTRAINT = 0202,
+    LIMWORD_CONSTRAINT = 0252,
+    NOTLIMWORD_CONSTRAINT = 0525
+  };
+
+/* The regexp is parsed into an array of tokens in postfix form.  Some tokens
+   are operators and others are terminal symbols.  Most (but not all) of these
+   codes are returned by the lexical analyzer.  */
+
+typedef ptrdiff_t token;
+static ptrdiff_t const TOKEN_MAX = PTRDIFF_MAX;
+
+/* States are indexed by state_num values.  These are normally
+   nonnegative but -1 is used as a special value.  */
+typedef ptrdiff_t state_num;
+
+/* Predefined token values.  */
+enum
+{
+  END = -1,                     /* END is a terminal symbol that matches the
+                                   end of input; any value of END or less in
+                                   the parse tree is such a symbol.  Accepting
+                                   states of the DFA are those that would have
+                                   a transition on END.  This is -1, not some
+                                   more-negative value, to tweak the speed of
+                                   comparisons to END.  */
+
+  /* Ordinary character values are terminal symbols that match themselves.  */
+
+  /* CSET must come last in the following list of special tokens.  Otherwise,
+     the list order matters only for performance.  Related special tokens
+     should have nearby values so that code like (t == ANYCHAR || t == MBCSET
+     || CSET <= t) can be done with a single machine-level comparison.  */
+
+  EMPTY = NOTCHAR,              /* EMPTY is a terminal symbol that matches
+                                   the empty string.  */
+
+  QMARK,                        /* QMARK is an operator of one argument that
+                                   matches zero or one occurrences of its
+                                   argument.  */
+
+  STAR,                         /* STAR is an operator of one argument that
+                                   matches the Kleene closure (zero or more
+                                   occurrences) of its argument.  */
+
+  PLUS,                         /* PLUS is an operator of one argument that
+                                   matches the positive closure (one or more
+                                   occurrences) of its argument.  */
+
+  REPMN,                        /* REPMN is a lexical token corresponding
+                                   to the {m,n} construct.  REPMN never
+                                   appears in the compiled token vector.  */
+
+  CAT,                          /* CAT is an operator of two arguments that
+                                   matches the concatenation of its
+                                   arguments.  CAT is never returned by the
+                                   lexical analyzer.  */
+
+  OR,                           /* OR is an operator of two arguments that
+                                   matches either of its arguments.  */
+
+  LPAREN,                       /* LPAREN never appears in the parse tree,
+                                   it is only a lexeme.  */
+
+  RPAREN,                       /* RPAREN never appears in the parse tree.  */
+
+  WCHAR,                        /* Only returned by lex.  wctok contains
+                                   the wide character representation.  */
+
+  ANYCHAR,                      /* ANYCHAR is a terminal symbol that matches
+                                   a valid multibyte (or single byte) character.
+                                   It is used only if MB_CUR_MAX > 1.  */
+
+  BEG,                          /* BEG is an initial symbol that matches the
+                                   beginning of input.  */
+
+  BEGLINE,                      /* BEGLINE is a terminal symbol that matches
+                                   the empty string at the beginning of a
+                                   line.  */
+
+  ENDLINE,                      /* ENDLINE is a terminal symbol that matches
+                                   the empty string at the end of a line.  */
+
+  BEGWORD,                      /* BEGWORD is a terminal symbol that matches
+                                   the empty string at the beginning of a
+                                   word.  */
+
+  ENDWORD,                      /* ENDWORD is a terminal symbol that matches
+                                   the empty string at the end of a word.  */
+
+  LIMWORD,                      /* LIMWORD is a terminal symbol that matches
+                                   the empty string at the beginning or the
+                                   end of a word.  */
+
+  NOTLIMWORD,                   /* NOTLIMWORD is a terminal symbol that
+                                   matches the empty string not at
+                                   the beginning or end of a word.  */
+
+  BACKREF,                      /* BACKREF is generated by \<digit>
+                                   or by any other construct that
+                                   is not completely handled.  If the scanner
+                                   detects a transition on backref, it returns
+                                   a kind of "semi-success" indicating that
+                                   the match will have to be verified with
+                                   a backtracking matcher.  */
+
+  MBCSET,                       /* MBCSET is similar to CSET, but for
+                                   multibyte characters.  */
+
+  CSET                          /* CSET and (and any value greater) is a
+                                   terminal symbol that matches any of a
+                                   class of characters.  */
+};
+
+
+/* States of the recognizer correspond to sets of positions in the parse
+   tree, together with the constraints under which they may be matched.
+   So a position is encoded as an index into the parse tree together with
+   a constraint.  */
+typedef struct
+{
+  size_t index;                 /* Index into the parse array.  */
+  unsigned int constraint;      /* Constraint for matching this position.  */
+} position;
+
+/* Sets of positions are stored as arrays.  */
+typedef struct
+{
+  position *elems;              /* Elements of this position set.  */
+  ptrdiff_t nelem;              /* Number of elements in this set.  */
+  ptrdiff_t alloc;              /* Number of elements allocated in ELEMS.  */
+} position_set;
+
+/* A state of the dfa consists of a set of positions, some flags,
+   and the token value of the lowest-numbered position of the state that
+   contains an END token.  */
+typedef struct
+{
+  size_t hash;                  /* Hash of the positions of this state.  */
+  position_set elems;           /* Positions this state could match.  */
+  unsigned char context;        /* Context from previous state.  */
+  unsigned short constraint;    /* Constraint for this state to accept.  */
+  token first_end;              /* Token value of the first END in elems.  */
+  position_set mbps;            /* Positions which can match multibyte
+                                   characters or the follows, e.g., period.
+                                   Used only if MB_CUR_MAX > 1.  */
+  state_num mb_trindex;         /* Index of this state in MB_TRANS, or
+                                   negative if the state does not have
+                                   ANYCHAR.  */
+} dfa_state;
+
+/* Maximum for any transition table count.  This should be at least 3,
+   for the initial state setup.  */
+enum { MAX_TRCOUNT = 1024 };
+
+/* A bracket operator.
+   e.g., [a-c], [[:alpha:]], etc.  */
+struct mb_char_classes
+{
+  ptrdiff_t cset;
+  bool invert;
+  wchar_t *chars;               /* Normal characters.  */
+  ptrdiff_t nchars;
+  ptrdiff_t nchars_alloc;
+};
+
+struct regex_syntax
+{
+  /* Syntax bits controlling the behavior of the lexical analyzer.  */
+  reg_syntax_t syntax_bits;
+  bool syntax_bits_set;
+
+  /* Flag for case-folding letters into sets.  */
+  bool case_fold;
+
+  /* True if ^ and $ match only the start and end of data, and do not match
+     end-of-line within data.  */
+  bool anchor;
+
+  /* End-of-line byte in data.  */
+  unsigned char eolbyte;
+
+  /* Cache of char-context values.  */
+  char sbit[NOTCHAR];
+
+  /* If never_trail[B], the byte B cannot be a non-initial byte in a
+     multibyte character.  */
+  bool never_trail[NOTCHAR];
+
+  /* Set of characters considered letters.  */
+  charclass letters;
+
+  /* Set of characters that are newline.  */
+  charclass newline;
+};
+
+/* Lexical analyzer.  All the dross that deals with the obnoxious
+   GNU Regex syntax bits is located here.  The poor, suffering
+   reader is referred to the GNU Regex documentation for the
+   meaning of the @#%!@#%^!@ syntax bits.  */
+struct lexer_state
+{
+  char const *ptr;	/* Pointer to next input character.  */
+  size_t left;		/* Number of characters remaining.  */
+  token lasttok;	/* Previous token returned; initially END.  */
+  size_t parens;	/* Count of outstanding left parens.  */
+  int minrep, maxrep;	/* Repeat counts for {m,n}.  */
+
+  /* Wide character representation of the current multibyte character,
+     or WEOF if there was an encoding error.  Used only if
+     MB_CUR_MAX > 1.  */
+  wint_t wctok;
+
+  /* Length of the multibyte representation of wctok.  */
+  int cur_mb_len;
+
+  /* The most recently analyzed multibyte bracket expression.  */
+  struct mb_char_classes brack;
+
+  /* We're separated from beginning or (, | only by zero-width characters.  */
+  bool laststart;
+};
+
+/* Recursive descent parser for regular expressions.  */
+
+struct parser_state
+{
+  token tok;               /* Lookahead token.  */
+  size_t depth;            /* Current depth of a hypothetical stack
+                              holding deferred productions.  This is
+                              used to determine the depth that will be
+                              required of the real stack later on in
+                              dfaanalyze.  */
+};
+
+/* A compiled regular expression.  */
+struct dfa
+{
+  /* Syntax configuration */
+  struct regex_syntax syntax;
+
+  /* Fields filled by the scanner.  */
+  charclass *charclasses;       /* Array of character sets for CSET tokens.  */
+  ptrdiff_t cindex;             /* Index for adding new charclasses.  */
+  ptrdiff_t calloc;             /* Number of charclasses allocated.  */
+  size_t canychar;              /* Index of anychar class, or (size_t) -1.  */
+
+  /* Scanner state */
+  struct lexer_state lex;
+
+  /* Parser state */
+  struct parser_state parse;
+
+  /* Fields filled by the parser.  */
+  token *tokens;                /* Postfix parse array.  */
+  size_t tindex;                /* Index for adding new tokens.  */
+  size_t talloc;                /* Number of tokens currently allocated.  */
+  size_t depth;                 /* Depth required of an evaluation stack
+                                   used for depth-first traversal of the
+                                   parse tree.  */
+  size_t nleaves;               /* Number of leaves on the parse tree.  */
+  size_t nregexps;              /* Count of parallel regexps being built
+                                   with dfaparse.  */
+  bool fast;			/* The DFA is fast.  */
+  token utf8_anychar_classes[5]; /* To lower ANYCHAR in UTF-8 locales.  */
+  mbstate_t mbs;		/* Multibyte conversion state.  */
+
+  /* The following are valid only if MB_CUR_MAX > 1.  */
+
+  /* The value of multibyte_prop[i] is defined by following rule.
+     if tokens[i] < NOTCHAR
+     bit 0 : tokens[i] is the first byte of a character, including
+     single-byte characters.
+     bit 1 : tokens[i] is the last byte of a character, including
+     single-byte characters.
+
+     e.g.
+     tokens
+     = 'single_byte_a', 'multi_byte_A', single_byte_b'
+     = 'sb_a', 'mb_A(1st byte)', 'mb_A(2nd byte)', 'mb_A(3rd byte)', 'sb_b'
+     multibyte_prop
+     = 3     , 1               ,  0              ,  2              , 3
+   */
+  char *multibyte_prop;
+
+  /* Fields filled by the superset.  */
+  struct dfa *superset;             /* Hint of the dfa.  */
+
+  /* Fields filled by the state builder.  */
+  dfa_state *states;            /* States of the dfa.  */
+  state_num sindex;             /* Index for adding new states.  */
+  ptrdiff_t salloc;		/* Number of states currently allocated.  */
+
+  /* Fields filled by the parse tree->NFA conversion.  */
+  position_set *follows;        /* Array of follow sets, indexed by position
+                                   index.  The follow of a position is the set
+                                   of positions containing characters that
+                                   could conceivably follow a character
+                                   matching the given position in a string
+                                   matching the regexp.  Allocated to the
+                                   maximum possible position index.  */
+  bool searchflag;		/* We are supposed to build a searching
+                                   as opposed to an exact matcher.  A searching
+                                   matcher finds the first and shortest string
+                                   matching a regexp anywhere in the buffer,
+                                   whereas an exact matcher finds the longest
+                                   string matching, but anchored to the
+                                   beginning of the buffer.  */
+
+  /* Fields filled by dfaanalyze.  */
+  int *constraints;             /* Array of union of accepting constraints
+                                   in the follow of a position.  */
+  int *separates;               /* Array of contexts on follow of a
+                                   position.  */
+
+  /* Fields filled by dfaexec.  */
+  state_num tralloc;            /* Number of transition tables that have
+                                   slots so far, not counting trans[-1] and
+                                   trans[-2].  */
+  int trcount;                  /* Number of transition tables that have
+                                   been built, other than for initial
+                                   states.  */
+  int min_trcount;              /* Number of initial states.  Equivalently,
+                                   the minimum state number for which trcount
+                                   counts transitions.  */
+  state_num **trans;            /* Transition tables for states that can
+                                   never accept.  If the transitions for a
+                                   state have not yet been computed, or the
+                                   state could possibly accept, its entry in
+                                   this table is NULL.  This points to two
+                                   past the start of the allocated array,
+                                   and trans[-1] and trans[-2] are always
+                                   NULL.  */
+  state_num **fails;            /* Transition tables after failing to accept
+                                   on a state that potentially could do so.
+                                   If trans[i] is non-null, fails[i] must
+                                   be null.  */
+  char *success;                /* Table of acceptance conditions used in
+                                   dfaexec and computed in build_state.  */
+  state_num *newlines;          /* Transitions on newlines.  The entry for a
+                                   newline in any transition table is always
+                                   -1 so we can count lines without wasting
+                                   too many cycles.  The transition for a
+                                   newline is stored separately and handled
+                                   as a special case.  Newline is also used
+                                   as a sentinel at the end of the buffer.  */
+  state_num initstate_notbol;   /* Initial state for CTX_LETTER and CTX_NONE
+                                   context in multibyte locales, in which we
+                                   do not distinguish between their contexts,
+                                   as not supported word.  */
+  position_set mb_follows;      /* Follow set added by ANYCHAR on demand.  */
+  state_num **mb_trans;         /* Transition tables for states with
+                                   ANYCHAR.  */
+  state_num mb_trcount;         /* Number of transition tables for states with
+                                   ANYCHAR that have actually been built.  */
+
+  /* Information derived from the locale.  This is at the end so that
+     a quick memset need not clear it specially.  */
+
+  /* dfaexec implementation.  */
+  char *(*dfaexec) (struct dfa *, char const *, char *,
+                    bool, size_t *, bool *);
+
+  /* The locale is simple, like the C locale.  These locales can be
+     processed more efficiently, as they are single-byte, their native
+     character set is in collating-sequence order, and they do not
+     have multi-character collating elements.  */
+  bool simple_locale;
+
+  /* Other cached information derived from the locale.  */
+  struct localeinfo localeinfo;
+};
+
+/* User access to dfa internals.  */
+
+/* S could possibly be an accepting state of R.  */
+static bool
+accepting (state_num s, struct dfa const *r)
+{
+  return r->states[s].constraint != 0;
+}
+
+/* STATE accepts in the specified context.  */
+static bool
+accepts_in_context (int prev, int curr, state_num state, struct dfa const *dfa)
+{
+  return succeeds_in_context (dfa->states[state].constraint, prev, curr);
+}
+
+static void regexp (struct dfa *dfa);
+
+/* Store into *PWC the result of converting the leading bytes of the
+   multibyte buffer S of length N bytes, using D->localeinfo.sbctowc
+   and updating the conversion state in *D.  On conversion error,
+   convert just a single byte, to WEOF.  Return the number of bytes
+   converted.
+
+   This differs from mbrtowc (PWC, S, N, &D->mbs) as follows:
+
+   * PWC points to wint_t, not to wchar_t.
+   * The last arg is a dfa *D instead of merely a multibyte conversion
+     state D->mbs.
+   * N must be at least 1.
+   * S[N - 1] must be a sentinel byte.
+   * Shift encodings are not supported.
+   * The return value is always in the range 1..N.
+   * D->mbs is always valid afterwards.
+   * *PWC is always set to something.  */
+static size_t
+mbs_to_wchar (wint_t *pwc, char const *s, size_t n, struct dfa *d)
+{
+  unsigned char uc = s[0];
+  wint_t wc = d->localeinfo.sbctowc[uc];
+
+  if (wc == WEOF)
+    {
+      wchar_t wch;
+      size_t nbytes = mbrtowc (&wch, s, n, &d->mbs);
+      if (0 < nbytes && nbytes < (size_t) -2)
+        {
+          *pwc = wch;
+          return nbytes;
+        }
+      memset (&d->mbs, 0, sizeof d->mbs);
+    }
+
+  *pwc = wc;
+  return 1;
+}
+
+#ifdef DEBUG
+
+static void
+prtok (token t)
+{
+  if (t <= END)
+    fprintf (stderr, "END");
+  else if (0 <= t && t < NOTCHAR)
+    {
+      unsigned int ch = t;
+      fprintf (stderr, "0x%02x", ch);
+    }
+  else
+    {
+      char const *s;
+      switch (t)
+        {
+        case BEG:
+          s = "BEG";
+          break;
+        case EMPTY:
+          s = "EMPTY";
+          break;
+        case BACKREF:
+          s = "BACKREF";
+          break;
+        case BEGLINE:
+          s = "BEGLINE";
+          break;
+        case ENDLINE:
+          s = "ENDLINE";
+          break;
+        case BEGWORD:
+          s = "BEGWORD";
+          break;
+        case ENDWORD:
+          s = "ENDWORD";
+          break;
+        case LIMWORD:
+          s = "LIMWORD";
+          break;
+        case NOTLIMWORD:
+          s = "NOTLIMWORD";
+          break;
+        case QMARK:
+          s = "QMARK";
+          break;
+        case STAR:
+          s = "STAR";
+          break;
+        case PLUS:
+          s = "PLUS";
+          break;
+        case CAT:
+          s = "CAT";
+          break;
+        case OR:
+          s = "OR";
+          break;
+        case LPAREN:
+          s = "LPAREN";
+          break;
+        case RPAREN:
+          s = "RPAREN";
+          break;
+        case ANYCHAR:
+          s = "ANYCHAR";
+          break;
+        case MBCSET:
+          s = "MBCSET";
+          break;
+        default:
+          s = "CSET";
+          break;
+        }
+      fprintf (stderr, "%s", s);
+    }
+}
+#endif /* DEBUG */
+
+/* Stuff pertaining to charclasses.  */
+
+static bool
+tstbit (unsigned int b, charclass const *c)
+{
+  return c->w[b / CHARCLASS_WORD_BITS] >> b % CHARCLASS_WORD_BITS & 1;
+}
+
+static void
+setbit (unsigned int b, charclass *c)
+{
+  charclass_word one = 1;
+  c->w[b / CHARCLASS_WORD_BITS] |= one << b % CHARCLASS_WORD_BITS;
+}
+
+static void
+clrbit (unsigned int b, charclass *c)
+{
+  charclass_word one = 1;
+  c->w[b / CHARCLASS_WORD_BITS] &= ~(one << b % CHARCLASS_WORD_BITS);
+}
+
+static void
+zeroset (charclass *s)
+{
+  memset (s, 0, sizeof *s);
+}
+
+static void
+fillset (charclass *s)
+{
+  for (int i = 0; i < CHARCLASS_WORDS; i++)
+    s->w[i] = CHARCLASS_WORD_MASK;
+}
+
+static void
+notset (charclass *s)
+{
+  for (int i = 0; i < CHARCLASS_WORDS; ++i)
+    s->w[i] = CHARCLASS_WORD_MASK & ~s->w[i];
+}
+
+static bool
+equal (charclass const *s1, charclass const *s2)
+{
+  charclass_word w = 0;
+  for (int i = 0; i < CHARCLASS_WORDS; i++)
+    w |= s1->w[i] ^ s2->w[i];
+  return w == 0;
+}
+
+static bool
+emptyset (charclass const *s)
+{
+  charclass_word w = 0;
+  for (int i = 0; i < CHARCLASS_WORDS; i++)
+    w |= s->w[i];
+  return w == 0;
+}
+
+/* Grow PA, which points to an array of *NITEMS items, and return the
+   location of the reallocated array, updating *NITEMS to reflect its
+   new size.  The new array will contain at least NITEMS_INCR_MIN more
+   items, but will not contain more than NITEMS_MAX items total.
+   ITEM_SIZE is the size of each item, in bytes.
+
+   ITEM_SIZE and NITEMS_INCR_MIN must be positive.  *NITEMS must be
+   nonnegative.  If NITEMS_MAX is -1, it is treated as if it were
+   infinity.
+
+   If PA is null, then allocate a new array instead of reallocating
+   the old one.
+
+   Thus, to grow an array A without saving its old contents, do
+   { free (A); A = xpalloc (NULL, &AITEMS, ...); }.  */
+
+static void *
+xpalloc (void *pa, ptrdiff_t *nitems, ptrdiff_t nitems_incr_min,
+         ptrdiff_t nitems_max, ptrdiff_t item_size)
+{
+  ptrdiff_t n0 = *nitems;
+
+  /* The approximate size to use for initial small allocation
+     requests.  This is the largest "small" request for the GNU C
+     library malloc.  */
+  enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
+
+  /* If the array is tiny, grow it to about (but no greater than)
+     DEFAULT_MXFAST bytes.  Otherwise, grow it by about 50%.
+     Adjust the growth according to three constraints: NITEMS_INCR_MIN,
+     NITEMS_MAX, and what the C language can represent safely.  */
+
+  ptrdiff_t n, nbytes;
+  if (INT_ADD_WRAPV (n0, n0 >> 1, &n))
+    n = PTRDIFF_MAX;
+  if (0 <= nitems_max && nitems_max < n)
+    n = nitems_max;
+
+  ptrdiff_t adjusted_nbytes
+    = ((INT_MULTIPLY_WRAPV (n, item_size, &nbytes) || SIZE_MAX < nbytes)
+       ? MIN (PTRDIFF_MAX, SIZE_MAX)
+       : nbytes < DEFAULT_MXFAST ? DEFAULT_MXFAST : 0);
+  if (adjusted_nbytes)
+    {
+      n = adjusted_nbytes / item_size;
+      nbytes = adjusted_nbytes - adjusted_nbytes % item_size;
+    }
+
+  if (! pa)
+    *nitems = 0;
+  if (n - n0 < nitems_incr_min
+      && (INT_ADD_WRAPV (n0, nitems_incr_min, &n)
+          || (0 <= nitems_max && nitems_max < n)
+          || INT_MULTIPLY_WRAPV (n, item_size, &nbytes)))
+    xalloc_die ();
+  pa = xrealloc (pa, nbytes);
+  *nitems = n;
+  return pa;
+}
+
+/* Ensure that the array addressed by PA holds at least I + 1 items.
+   Either return PA, or reallocate the array and return its new address.
+   Although PA may be null, the returned value is never null.
+
+   The array holds *NITEMS items, where 0 <= I <= *NITEMS; *NITEMS
+   is updated on reallocation.  If PA is null, *NITEMS must be zero.
+   Do not allocate more than NITEMS_MAX items total; -1 means no limit.
+   ITEM_SIZE is the size of one item; it must be positive.
+   Avoid O(N**2) behavior on arrays growing linearly.  */
+static void *
+maybe_realloc (void *pa, ptrdiff_t i, ptrdiff_t *nitems,
+               ptrdiff_t nitems_max, ptrdiff_t item_size)
+{
+  if (i < *nitems)
+    return pa;
+  return xpalloc (pa, nitems, 1, nitems_max, item_size);
+}
+
+/* In DFA D, find the index of charclass S, or allocate a new one.  */
+static ptrdiff_t
+charclass_index (struct dfa *d, charclass *s)
+{
+  ptrdiff_t i;
+
+  for (i = 0; i < d->cindex; ++i)
+    if (equal (s, &d->charclasses[i]))
+      return i;
+  d->charclasses = maybe_realloc (d->charclasses, d->cindex, &d->calloc,
+                                  TOKEN_MAX - CSET, sizeof *d->charclasses);
+  ++d->cindex;
+  d->charclasses[i] = *s;
+  return i;
+}
+
+static bool
+unibyte_word_constituent (struct dfa const *dfa, unsigned char c)
+{
+  return dfa->localeinfo.sbctowc[c] != WEOF && (isalnum (c) || (c) == '_');
+}
+
+static int
+char_context (struct dfa const *dfa, unsigned char c)
+{
+  if (c == dfa->syntax.eolbyte && !dfa->syntax.anchor)
+    return CTX_NEWLINE;
+  if (unibyte_word_constituent (dfa, c))
+    return CTX_LETTER;
+  return CTX_NONE;
+}
+
+/* Copy the syntax settings from one dfa instance to another.
+   Saves considerable computation time if compiling many regular expressions
+   based on the same setting.  */
+void
+dfacopysyntax (struct dfa *to, const struct dfa *from)
+{
+  to->dfaexec = from->dfaexec;
+  to->simple_locale = from->simple_locale;
+  to->localeinfo = from->localeinfo;
+
+  to->fast = from->fast;
+
+  to->canychar = from->canychar;
+  to->lex.cur_mb_len = from->lex.cur_mb_len;
+  to->syntax = from->syntax;
+}
+
+/* Set a bit in the charclass for the given wchar_t.  Do nothing if WC
+   is represented by a multi-byte sequence.  Even for MB_CUR_MAX == 1,
+   this may happen when folding case in weird Turkish locales where
+   dotless i/dotted I are not included in the chosen character set.
+   Return whether a bit was set in the charclass.  */
+static bool
+setbit_wc (wint_t wc, charclass *c)
+{
+  int b = wctob (wc);
+  if (b < 0)
+    return false;
+
+  setbit (b, c);
+  return true;
+}
+
+/* Set a bit for B and its case variants in the charclass C.
+   MB_CUR_MAX must be 1.  */
+static void
+setbit_case_fold_c (int b, charclass *c)
+{
+  int ub = toupper (b);
+  for (int i = 0; i < NOTCHAR; i++)
+    if (toupper (i) == ub)
+      setbit (i, c);
+}
+
+/* Return true if the locale compatible with the C locale.  */
+
+static bool
+using_simple_locale (bool multibyte)
+{
+  /* The native character set is known to be compatible with
+     the C locale.  The following test isn't perfect, but it's good
+     enough in practice, as only ASCII and EBCDIC are in common use
+     and this test correctly accepts ASCII and rejects EBCDIC.  */
+  enum { native_c_charset =
+    ('\b' == 8 && '\t' == 9 && '\n' == 10 && '\v' == 11 && '\f' == 12
+     && '\r' == 13 && ' ' == 32 && '!' == 33 && '"' == 34 && '#' == 35
+     && '%' == 37 && '&' == 38 && '\'' == 39 && '(' == 40 && ')' == 41
+     && '*' == 42 && '+' == 43 && ',' == 44 && '-' == 45 && '.' == 46
+     && '/' == 47 && '0' == 48 && '9' == 57 && ':' == 58 && ';' == 59
+     && '<' == 60 && '=' == 61 && '>' == 62 && '?' == 63 && 'A' == 65
+     && 'Z' == 90 && '[' == 91 && '\\' == 92 && ']' == 93 && '^' == 94
+     && '_' == 95 && 'a' == 97 && 'z' == 122 && '{' == 123 && '|' == 124
+     && '}' == 125 && '~' == 126)
+  };
+
+  if (!native_c_charset || multibyte)
+    return false;
+  else
+    {
+      /* Treat C and POSIX locales as being compatible.  Also, treat
+         errors as compatible, as these are invariably from stubs.  */
+      char const *loc = setlocale (LC_ALL, NULL);
+      return !loc || streq (loc, "C") || streq (loc, "POSIX");
+    }
+}
+
+/* Fetch the next lexical input character from the pattern.  There
+   must at least one byte of pattern input.  Set DFA->lex.wctok to the
+   value of the character or to WEOF depending on whether the input is
+   a valid multibyte character (possibly of length 1).  Then return
+   the next input byte value, except return EOF if the input is a
+   multibyte character of length greater than 1.  */
+static int
+fetch_wc (struct dfa *dfa)
+{
+  size_t nbytes = mbs_to_wchar (&dfa->lex.wctok, dfa->lex.ptr, dfa->lex.left,
+                                dfa);
+  dfa->lex.cur_mb_len = nbytes;
+  int c = nbytes == 1 ? to_uchar (dfa->lex.ptr[0]) : EOF;
+  dfa->lex.ptr += nbytes;
+  dfa->lex.left -= nbytes;
+  return c;
+}
+
+/* If there is no more input, report an error about unbalanced brackets.
+   Otherwise, behave as with fetch_wc (DFA).  */
+static int
+bracket_fetch_wc (struct dfa *dfa)
+{
+  if (! dfa->lex.left)
+    dfaerror (_("unbalanced ["));
+  return fetch_wc (dfa);
+}
+
+typedef int predicate (int);
+
+/* The following list maps the names of the Posix named character classes
+   to predicate functions that determine whether a given character is in
+   the class.  The leading [ has already been eaten by the lexical
+   analyzer.  */
+struct dfa_ctype
+{
+  const char *name;
+  predicate *func;
+  bool single_byte_only;
+};
+
+static const struct dfa_ctype prednames[] = {
+  {"alpha", isalpha, false},
+  {"upper", isupper, false},
+  {"lower", islower, false},
+  {"digit", isdigit, true},
+  {"xdigit", isxdigit, false},
+  {"space", isspace, false},
+  {"punct", ispunct, false},
+  {"alnum", isalnum, false},
+  {"print", isprint, false},
+  {"graph", isgraph, false},
+  {"cntrl", iscntrl, false},
+  {"blank", is_blank, false},
+  {NULL, NULL, false}
+};
+
+static const struct dfa_ctype *_GL_ATTRIBUTE_PURE
+find_pred (const char *str)
+{
+  for (unsigned int i = 0; prednames[i].name; ++i)
+    if (streq (str, prednames[i].name))
+      return &prednames[i];
+  return NULL;
+}
+
+/* Parse a bracket expression, which possibly includes multibyte
+   characters.  */
+static token
+parse_bracket_exp (struct dfa *dfa)
+{
+  /* This is a bracket expression that dfaexec is known to
+     process correctly.  */
+  bool known_bracket_exp = true;
+
+  /* Used to warn about [:space:].
+     Bit 0 = first character is a colon.
+     Bit 1 = last character is a colon.
+     Bit 2 = includes any other character but a colon.
+     Bit 3 = includes ranges, char/equiv classes or collation elements.  */
+  int colon_warning_state;
+
+  dfa->lex.brack.nchars = 0;
+  charclass ccl;
+  zeroset (&ccl);
+  int c = bracket_fetch_wc (dfa);
+  bool invert = c == '^';
+  if (invert)
+    {
+      c = bracket_fetch_wc (dfa);
+      known_bracket_exp = dfa->simple_locale;
+    }
+  wint_t wc = dfa->lex.wctok;
+  int c1;
+  wint_t wc1;
+  colon_warning_state = (c == ':');
+  do
+    {
+      c1 = NOTCHAR;	/* Mark c1 as not initialized.  */
+      colon_warning_state &= ~2;
+
+      /* Note that if we're looking at some other [:...:] construct,
+         we just treat it as a bunch of ordinary characters.  We can do
+         this because we assume regex has checked for syntax errors before
+         dfa is ever called.  */
+      if (c == '[')
+        {
+          c1 = bracket_fetch_wc (dfa);
+          wc1 = dfa->lex.wctok;
+
+          if ((c1 == ':' && (dfa->syntax.syntax_bits & RE_CHAR_CLASSES))
+              || c1 == '.' || c1 == '=')
+            {
+              enum { MAX_BRACKET_STRING_LEN = 32 };
+              char str[MAX_BRACKET_STRING_LEN + 1];
+              size_t len = 0;
+              for (;;)
+                {
+                  c = bracket_fetch_wc (dfa);
+                  if (dfa->lex.left == 0
+                      || (c == c1 && dfa->lex.ptr[0] == ']'))
+                    break;
+                  if (len < MAX_BRACKET_STRING_LEN)
+                    str[len++] = c;
+                  else
+                    /* This is in any case an invalid class name.  */
+                    str[0] = '\0';
+                }
+              str[len] = '\0';
+
+              /* Fetch bracket.  */
+              c = bracket_fetch_wc (dfa);
+              wc = dfa->lex.wctok;
+              if (c1 == ':')
+                /* Build character class.  POSIX allows character
+                   classes to match multicharacter collating elements,
+                   but the regex code does not support that, so do not
+                   worry about that possibility.  */
+                {
+                  char const *class
+                    = (dfa->syntax.case_fold && (streq (str, "upper")
+                                                 || streq (str, "lower"))
+                       ? "alpha" : str);
+                  const struct dfa_ctype *pred = find_pred (class);
+                  if (!pred)
+                    dfaerror (_("invalid character class"));
+
+                  if (dfa->localeinfo.multibyte && !pred->single_byte_only)
+                    known_bracket_exp = false;
+                  else
+                    for (int c2 = 0; c2 < NOTCHAR; ++c2)
+                      if (pred->func (c2))
+                        setbit (c2, &ccl);
+                }
+              else
+                known_bracket_exp = false;
+
+              colon_warning_state |= 8;
+
+              /* Fetch new lookahead character.  */
+              c1 = bracket_fetch_wc (dfa);
+              wc1 = dfa->lex.wctok;
+              continue;
+            }
+
+          /* We treat '[' as a normal character here.  c/c1/wc/wc1
+             are already set up.  */
+        }
+
+      if (c == '\\'
+          && (dfa->syntax.syntax_bits & RE_BACKSLASH_ESCAPE_IN_LISTS))
+        {
+          c = bracket_fetch_wc (dfa);
+          wc = dfa->lex.wctok;
+        }
+
+      if (c1 == NOTCHAR)
+        {
+          c1 = bracket_fetch_wc (dfa);
+          wc1 = dfa->lex.wctok;
+        }
+
+      if (c1 == '-')
+        /* build range characters.  */
+        {
+          int c2 = bracket_fetch_wc (dfa);
+          wint_t wc2 = dfa->lex.wctok;
+
+          /* A bracket expression like [a-[.aa.]] matches an unknown set.
+             Treat it like [-a[.aa.]] while parsing it, and
+             remember that the set is unknown.  */
+          if (c2 == '[' && dfa->lex.ptr[0] == '.')
+            {
+              known_bracket_exp = false;
+              c2 = ']';
+            }
+
+          if (c2 == ']')
+            {
+              /* In the case [x-], the - is an ordinary hyphen,
+                 which is left in c1, the lookahead character.  */
+              dfa->lex.ptr -= dfa->lex.cur_mb_len;
+              dfa->lex.left += dfa->lex.cur_mb_len;
+            }
+          else
+            {
+              if (c2 == '\\' && (dfa->syntax.syntax_bits
+                                 & RE_BACKSLASH_ESCAPE_IN_LISTS))
+                {
+                  c2 = bracket_fetch_wc (dfa);
+                  wc2 = dfa->lex.wctok;
+                }
+
+              colon_warning_state |= 8;
+              c1 = bracket_fetch_wc (dfa);
+              wc1 = dfa->lex.wctok;
+
+              /* Treat [x-y] as a range if x != y.  */
+              if (wc != wc2 || wc == WEOF)
+                {
+                  if (dfa->simple_locale
+                      || (isasciidigit (c) & isasciidigit (c2)))
+                    {
+                      for (int ci = c; ci <= c2; ci++)
+                        if (dfa->syntax.case_fold && isalpha (ci))
+                          setbit_case_fold_c (ci, &ccl);
+                        else
+                          setbit (ci, &ccl);
+                    }
+                  else
+                    known_bracket_exp = false;
+
+                  continue;
+                }
+            }
+        }
+
+      colon_warning_state |= (c == ':') ? 2 : 4;
+
+      if (!dfa->localeinfo.multibyte)
+        {
+          if (dfa->syntax.case_fold && isalpha (c))
+            setbit_case_fold_c (c, &ccl);
+          else
+            setbit (c, &ccl);
+          continue;
+        }
+
+      if (wc == WEOF)
+        known_bracket_exp = false;
+      else
+        {
+          wchar_t folded[CASE_FOLDED_BUFSIZE + 1];
+          unsigned int n = (dfa->syntax.case_fold
+                            ? case_folded_counterparts (wc, folded + 1) + 1
+                            : 1);
+          folded[0] = wc;
+          for (unsigned int i = 0; i < n; i++)
+            if (!setbit_wc (folded[i], &ccl))
+              {
+                dfa->lex.brack.chars
+                  = maybe_realloc (dfa->lex.brack.chars, dfa->lex.brack.nchars,
+                                   &dfa->lex.brack.nchars_alloc, -1,
+                                   sizeof *dfa->lex.brack.chars);
+                dfa->lex.brack.chars[dfa->lex.brack.nchars++] = folded[i];
+              }
+        }
+    }
+  while ((wc = wc1, (c = c1) != ']'));
+
+  if (colon_warning_state == 7)
+    dfawarn (_("character class syntax is [[:space:]], not [:space:]"));
+
+  if (! known_bracket_exp)
+    return BACKREF;
+
+  if (dfa->localeinfo.multibyte && (invert || dfa->lex.brack.nchars != 0))
+    {
+      dfa->lex.brack.invert = invert;
+      dfa->lex.brack.cset = emptyset (&ccl) ? -1 : charclass_index (dfa, &ccl);
+      return MBCSET;
+    }
+
+  if (invert)
+    {
+      notset (&ccl);
+      if (dfa->syntax.syntax_bits & RE_HAT_LISTS_NOT_NEWLINE)
+        clrbit ('\n', &ccl);
+    }
+
+  return CSET + charclass_index (dfa, &ccl);
+}
+
+struct lexptr
+{
+  char const *ptr;
+  size_t left;
+};
+
+static void
+push_lex_state (struct dfa *dfa, struct lexptr *ls, char const *s)
+{
+  ls->ptr = dfa->lex.ptr;
+  ls->left = dfa->lex.left;
+  dfa->lex.ptr = s;
+  dfa->lex.left = strlen (s);
+}
+
+static void
+pop_lex_state (struct dfa *dfa, struct lexptr const *ls)
+{
+  dfa->lex.ptr = ls->ptr;
+  dfa->lex.left = ls->left;
+}
+
+static token
+lex (struct dfa *dfa)
+{
+  bool backslash = false;
+
+  /* Basic plan: We fetch a character.  If it's a backslash,
+     we set the backslash flag and go through the loop again.
+     On the plus side, this avoids having a duplicate of the
+     main switch inside the backslash case.  On the minus side,
+     it means that just about every case begins with
+     "if (backslash) ...".  */
+  for (int i = 0; i < 2; ++i)
+    {
+      if (! dfa->lex.left)
+        return dfa->lex.lasttok = END;
+      int c = fetch_wc (dfa);
+
+      switch (c)
+        {
+        case '\\':
+          if (backslash)
+            goto normal_char;
+          if (dfa->lex.left == 0)
+            dfaerror (_("unfinished \\ escape"));
+          backslash = true;
+          break;
+
+        case '^':
+          if (backslash)
+            goto normal_char;
+          if (dfa->syntax.syntax_bits & RE_CONTEXT_INDEP_ANCHORS
+              || dfa->lex.lasttok == END || dfa->lex.lasttok == LPAREN
+              || dfa->lex.lasttok == OR)
+            return dfa->lex.lasttok = BEGLINE;
+          goto normal_char;
+
+        case '$':
+          if (backslash)
+            goto normal_char;
+          if (dfa->syntax.syntax_bits & RE_CONTEXT_INDEP_ANCHORS
+              || dfa->lex.left == 0
+              || ((dfa->lex.left
+                   > !(dfa->syntax.syntax_bits & RE_NO_BK_PARENS))
+                  && (dfa->lex.ptr[!(dfa->syntax.syntax_bits & RE_NO_BK_PARENS)
+                                   & (dfa->lex.ptr[0] == '\\')]
+                      == ')'))
+              || ((dfa->lex.left
+                   > !(dfa->syntax.syntax_bits & RE_NO_BK_VBAR))
+                  && (dfa->lex.ptr[!(dfa->syntax.syntax_bits & RE_NO_BK_VBAR)
+                                   & (dfa->lex.ptr[0] == '\\')]
+                      == '|'))
+              || ((dfa->syntax.syntax_bits & RE_NEWLINE_ALT)
+                  && dfa->lex.left > 0 && dfa->lex.ptr[0] == '\n'))
+            return dfa->lex.lasttok = ENDLINE;
+          goto normal_char;
+
+        case '1':
+        case '2':
+        case '3':
+        case '4':
+        case '5':
+        case '6':
+        case '7':
+        case '8':
+        case '9':
+          if (backslash && !(dfa->syntax.syntax_bits & RE_NO_BK_REFS))
+            {
+              dfa->lex.laststart = false;
+              return dfa->lex.lasttok = BACKREF;
+            }
+          goto normal_char;
+
+        case '`':
+          if (backslash && !(dfa->syntax.syntax_bits & RE_NO_GNU_OPS))
+            {
+              /* FIXME: should be beginning of string */
+              return dfa->lex.lasttok = BEGLINE;
+            }
+          goto normal_char;
+
+        case '\'':
+          if (backslash && !(dfa->syntax.syntax_bits & RE_NO_GNU_OPS))
+            {
+              /* FIXME: should be end of string */
+              return dfa->lex.lasttok = ENDLINE;
+            }
+          goto normal_char;
+
+        case '<':
+          if (backslash && !(dfa->syntax.syntax_bits & RE_NO_GNU_OPS))
+            return dfa->lex.lasttok = BEGWORD;
+          goto normal_char;
+
+        case '>':
+          if (backslash && !(dfa->syntax.syntax_bits & RE_NO_GNU_OPS))
+            return dfa->lex.lasttok = ENDWORD;
+          goto normal_char;
+
+        case 'b':
+          if (backslash && !(dfa->syntax.syntax_bits & RE_NO_GNU_OPS))
+            return dfa->lex.lasttok = LIMWORD;
+          goto normal_char;
+
+        case 'B':
+          if (backslash && !(dfa->syntax.syntax_bits & RE_NO_GNU_OPS))
+            return dfa->lex.lasttok = NOTLIMWORD;
+          goto normal_char;
+
+        case '?':
+          if (dfa->syntax.syntax_bits & RE_LIMITED_OPS)
+            goto normal_char;
+          if (backslash != ((dfa->syntax.syntax_bits & RE_BK_PLUS_QM) != 0))
+            goto normal_char;
+          if (!(dfa->syntax.syntax_bits & RE_CONTEXT_INDEP_OPS)
+              && dfa->lex.laststart)
+            goto normal_char;
+          return dfa->lex.lasttok = QMARK;
+
+        case '*':
+          if (backslash)
+            goto normal_char;
+          if (!(dfa->syntax.syntax_bits & RE_CONTEXT_INDEP_OPS)
+              && dfa->lex.laststart)
+            goto normal_char;
+          return dfa->lex.lasttok = STAR;
+
+        case '+':
+          if (dfa->syntax.syntax_bits & RE_LIMITED_OPS)
+            goto normal_char;
+          if (backslash != ((dfa->syntax.syntax_bits & RE_BK_PLUS_QM) != 0))
+            goto normal_char;
+          if (!(dfa->syntax.syntax_bits & RE_CONTEXT_INDEP_OPS)
+              && dfa->lex.laststart)
+            goto normal_char;
+          return dfa->lex.lasttok = PLUS;
+
+        case '{':
+          if (!(dfa->syntax.syntax_bits & RE_INTERVALS))
+            goto normal_char;
+          if (backslash != ((dfa->syntax.syntax_bits & RE_NO_BK_BRACES) == 0))
+            goto normal_char;
+          if (!(dfa->syntax.syntax_bits & RE_CONTEXT_INDEP_OPS)
+              && dfa->lex.laststart)
+            goto normal_char;
+
+          /* Cases:
+             {M} - exact count
+             {M,} - minimum count, maximum is infinity
+             {,N} - 0 through N
+             {,} - 0 to infinity (same as '*')
+             {M,N} - M through N */
+          {
+            char const *p = dfa->lex.ptr;
+            char const *lim = p + dfa->lex.left;
+            dfa->lex.minrep = dfa->lex.maxrep = -1;
+            for (; p != lim && isasciidigit (*p); p++)
+              dfa->lex.minrep = (dfa->lex.minrep < 0
+                                 ? *p - '0'
+                                 : MIN (RE_DUP_MAX + 1,
+                                        dfa->lex.minrep * 10 + *p - '0'));
+            if (p != lim)
+              {
+                if (*p != ',')
+                  dfa->lex.maxrep = dfa->lex.minrep;
+                else
+                  {
+                    if (dfa->lex.minrep < 0)
+                      dfa->lex.minrep = 0;
+                    while (++p != lim && isasciidigit (*p))
+                      dfa->lex.maxrep
+                        = (dfa->lex.maxrep < 0
+                           ? *p - '0'
+                           : MIN (RE_DUP_MAX + 1,
+                                  dfa->lex.maxrep * 10 + *p - '0'));
+                  }
+              }
+            if (! ((! backslash || (p != lim && *p++ == '\\'))
+                   && p != lim && *p++ == '}'
+                   && 0 <= dfa->lex.minrep
+                   && (dfa->lex.maxrep < 0
+                       || dfa->lex.minrep <= dfa->lex.maxrep)))
+              {
+                if (dfa->syntax.syntax_bits & RE_INVALID_INTERVAL_ORD)
+                  goto normal_char;
+                dfaerror (_("invalid content of \\{\\}"));
+              }
+            if (RE_DUP_MAX < dfa->lex.maxrep)
+              dfaerror (_("regular expression too big"));
+            dfa->lex.ptr = p;
+            dfa->lex.left = lim - p;
+          }
+          dfa->lex.laststart = false;
+          return dfa->lex.lasttok = REPMN;
+
+        case '|':
+          if (dfa->syntax.syntax_bits & RE_LIMITED_OPS)
+            goto normal_char;
+          if (backslash != ((dfa->syntax.syntax_bits & RE_NO_BK_VBAR) == 0))
+            goto normal_char;
+          dfa->lex.laststart = true;
+          return dfa->lex.lasttok = OR;
+
+        case '\n':
+          if (dfa->syntax.syntax_bits & RE_LIMITED_OPS
+              || backslash || !(dfa->syntax.syntax_bits & RE_NEWLINE_ALT))
+            goto normal_char;
+          dfa->lex.laststart = true;
+          return dfa->lex.lasttok = OR;
+
+        case '(':
+          if (backslash != ((dfa->syntax.syntax_bits & RE_NO_BK_PARENS) == 0))
+            goto normal_char;
+          dfa->lex.parens++;
+          dfa->lex.laststart = true;
+          return dfa->lex.lasttok = LPAREN;
+
+        case ')':
+          if (backslash != ((dfa->syntax.syntax_bits & RE_NO_BK_PARENS) == 0))
+            goto normal_char;
+          if (dfa->lex.parens == 0
+              && dfa->syntax.syntax_bits & RE_UNMATCHED_RIGHT_PAREN_ORD)
+            goto normal_char;
+          dfa->lex.parens--;
+          dfa->lex.laststart = false;
+          return dfa->lex.lasttok = RPAREN;
+
+        case '.':
+          if (backslash)
+            goto normal_char;
+          if (dfa->canychar == (size_t) -1)
+            {
+              charclass ccl;
+              fillset (&ccl);
+              if (!(dfa->syntax.syntax_bits & RE_DOT_NEWLINE))
+                clrbit ('\n', &ccl);
+              if (dfa->syntax.syntax_bits & RE_DOT_NOT_NULL)
+                clrbit ('\0', &ccl);
+              if (dfa->localeinfo.multibyte)
+                for (int c2 = 0; c2 < NOTCHAR; c2++)
+                  if (dfa->localeinfo.sbctowc[c2] == WEOF)
+                    clrbit (c2, &ccl);
+              dfa->canychar = charclass_index (dfa, &ccl);
+            }
+          dfa->lex.laststart = false;
+          return dfa->lex.lasttok = (dfa->localeinfo.multibyte
+                                     ? ANYCHAR
+                                     : CSET + dfa->canychar);
+
+        case 's':
+        case 'S':
+          if (!backslash || (dfa->syntax.syntax_bits & RE_NO_GNU_OPS))
+            goto normal_char;
+          if (!dfa->localeinfo.multibyte)
+            {
+              charclass ccl;
+              zeroset (&ccl);
+              for (int c2 = 0; c2 < NOTCHAR; ++c2)
+                if (isspace (c2))
+                  setbit (c2, &ccl);
+              if (c == 'S')
+                notset (&ccl);
+              dfa->lex.laststart = false;
+              return dfa->lex.lasttok = CSET + charclass_index (dfa, &ccl);
+            }
+
+          /* FIXME: see if optimizing this, as is done with ANYCHAR and
+             add_utf8_anychar, makes sense.  */
+
+          /* \s and \S are documented to be equivalent to [[:space:]] and
+             [^[:space:]] respectively, so tell the lexer to process those
+             strings, each minus its "already processed" '['.  */
+          {
+            struct lexptr ls;
+            push_lex_state (dfa, &ls, &"^[:space:]]"[c == 's']);
+            dfa->lex.lasttok = parse_bracket_exp (dfa);
+            pop_lex_state (dfa, &ls);
+          }
+
+          dfa->lex.laststart = false;
+          return dfa->lex.lasttok;
+
+        case 'w':
+        case 'W':
+          if (!backslash || (dfa->syntax.syntax_bits & RE_NO_GNU_OPS))
+            goto normal_char;
+
+          if (!dfa->localeinfo.multibyte)
+            {
+              charclass ccl;
+              zeroset (&ccl);
+              for (int c2 = 0; c2 < NOTCHAR; ++c2)
+                if (dfa->syntax.sbit[c2] == CTX_LETTER)
+                  setbit (c2, &ccl);
+              if (c == 'W')
+                notset (&ccl);
+              dfa->lex.laststart = false;
+              return dfa->lex.lasttok = CSET + charclass_index (dfa, &ccl);
+            }
+
+          /* FIXME: see if optimizing this, as is done with ANYCHAR and
+             add_utf8_anychar, makes sense.  */
+
+          /* \w and \W are documented to be equivalent to [_[:alnum:]] and
+             [^_[:alnum:]] respectively, so tell the lexer to process those
+             strings, each minus its "already processed" '['.  */
+          {
+            struct lexptr ls;
+            push_lex_state (dfa, &ls, &"^_[:alnum:]]"[c == 'w']);
+            dfa->lex.lasttok = parse_bracket_exp (dfa);
+            pop_lex_state (dfa, &ls);
+          }
+
+          dfa->lex.laststart = false;
+          return dfa->lex.lasttok;
+
+        case '[':
+          if (backslash)
+            goto normal_char;
+          dfa->lex.laststart = false;
+          return dfa->lex.lasttok = parse_bracket_exp (dfa);
+
+        default:
+        normal_char:
+          dfa->lex.laststart = false;
+          /* For multibyte character sets, folding is done in atom.  Always
+             return WCHAR.  */
+          if (dfa->localeinfo.multibyte)
+            return dfa->lex.lasttok = WCHAR;
+
+          if (dfa->syntax.case_fold && isalpha (c))
+            {
+              charclass ccl;
+              zeroset (&ccl);
+              setbit_case_fold_c (c, &ccl);
+              return dfa->lex.lasttok = CSET + charclass_index (dfa, &ccl);
+            }
+
+          return dfa->lex.lasttok = c;
+        }
+    }
+
+  /* The above loop should consume at most a backslash
+     and some other character.  */
+  abort ();
+  return END;                   /* keeps pedantic compilers happy.  */
+}
+
+static void
+addtok_mb (struct dfa *dfa, token t, char mbprop)
+{
+  if (dfa->talloc == dfa->tindex)
+    {
+      dfa->tokens = x2nrealloc (dfa->tokens, &dfa->talloc,
+                                sizeof *dfa->tokens);
+      if (dfa->localeinfo.multibyte)
+        dfa->multibyte_prop = xnrealloc (dfa->multibyte_prop, dfa->talloc,
+                                         sizeof *dfa->multibyte_prop);
+    }
+  if (dfa->localeinfo.multibyte)
+    dfa->multibyte_prop[dfa->tindex] = mbprop;
+  dfa->tokens[dfa->tindex++] = t;
+
+  switch (t)
+    {
+    case QMARK:
+    case STAR:
+    case PLUS:
+      break;
+
+    case CAT:
+    case OR:
+      dfa->parse.depth--;
+      break;
+
+    case BACKREF:
+      dfa->fast = false;
+      FALLTHROUGH;
+    default:
+      dfa->nleaves++;
+      FALLTHROUGH;
+    case EMPTY:
+      dfa->parse.depth++;
+      break;
+    }
+  if (dfa->parse.depth > dfa->depth)
+    dfa->depth = dfa->parse.depth;
+}
+
+static void addtok_wc (struct dfa *dfa, wint_t wc);
+
+/* Add the given token to the parse tree, maintaining the depth count and
+   updating the maximum depth if necessary.  */
+static void
+addtok (struct dfa *dfa, token t)
+{
+  if (dfa->localeinfo.multibyte && t == MBCSET)
+    {
+      bool need_or = false;
+
+      /* Extract wide characters into alternations for better performance.
+         This does not require UTF-8.  */
+      for (ptrdiff_t i = 0; i < dfa->lex.brack.nchars; i++)
+        {
+          addtok_wc (dfa, dfa->lex.brack.chars[i]);
+          if (need_or)
+            addtok (dfa, OR);
+          need_or = true;
+        }
+      dfa->lex.brack.nchars = 0;
+
+      /* Wide characters have been handled above, so it is possible
+         that the set is empty now.  Do nothing in that case.  */
+      if (dfa->lex.brack.cset != -1)
+        {
+          addtok (dfa, CSET + dfa->lex.brack.cset);
+          if (need_or)
+            addtok (dfa, OR);
+        }
+    }
+  else
+    {
+      addtok_mb (dfa, t, 3);
+    }
+}
+
+/* We treat a multibyte character as a single atom, so that DFA
+   can treat a multibyte character as a single expression.
+
+   e.g., we construct the following tree from "<mb1><mb2>".
+   <mb1(1st-byte)><mb1(2nd-byte)><CAT><mb1(3rd-byte)><CAT>
+   <mb2(1st-byte)><mb2(2nd-byte)><CAT><mb2(3rd-byte)><CAT><CAT> */
+static void
+addtok_wc (struct dfa *dfa, wint_t wc)
+{
+  unsigned char buf[MB_LEN_MAX];
+  mbstate_t s = { 0 };
+  size_t stored_bytes = wcrtomb ((char *) buf, wc, &s);
+
+  if (stored_bytes != (size_t) -1)
+    dfa->lex.cur_mb_len = stored_bytes;
+  else
+    {
+      /* This is merely stop-gap.  buf[0] is undefined, yet skipping
+         the addtok_mb call altogether can corrupt the heap.  */
+      dfa->lex.cur_mb_len = 1;
+      buf[0] = 0;
+    }
+
+  addtok_mb (dfa, buf[0], dfa->lex.cur_mb_len == 1 ? 3 : 1);
+  for (int i = 1; i < dfa->lex.cur_mb_len; i++)
+    {
+      addtok_mb (dfa, buf[i], i == dfa->lex.cur_mb_len - 1 ? 2 : 0);
+      addtok (dfa, CAT);
+    }
+}
+
+static void
+add_utf8_anychar (struct dfa *dfa)
+{
+  static charclass const utf8_classes[5] = {
+    /* 80-bf: non-leading bytes.  */
+    CHARCLASS_INIT (0, 0, 0, 0, 0xffffffff, 0xffffffff, 0, 0),
+
+    /* 00-7f: 1-byte sequence.  */
+    CHARCLASS_INIT (0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0, 0, 0, 0),
+
+    /* c2-df: 2-byte sequence.  */
+    CHARCLASS_INIT (0, 0, 0, 0, 0, 0, 0xfffffffc, 0),
+
+    /* e0-ef: 3-byte sequence.  */
+    CHARCLASS_INIT (0, 0, 0, 0, 0, 0, 0, 0xffff),
+
+    /* f0-f7: 4-byte sequence.  */
+    CHARCLASS_INIT (0, 0, 0, 0, 0, 0, 0, 0xff0000)
+  };
+  const unsigned int n = sizeof (utf8_classes) / sizeof (utf8_classes[0]);
+
+  /* Define the five character classes that are needed below.  */
+  if (dfa->utf8_anychar_classes[0] == 0)
+    for (unsigned int i = 0; i < n; i++)
+      {
+        charclass c = utf8_classes[i];
+        if (i == 1)
+          {
+            if (!(dfa->syntax.syntax_bits & RE_DOT_NEWLINE))
+              clrbit ('\n', &c);
+            if (dfa->syntax.syntax_bits & RE_DOT_NOT_NULL)
+              clrbit ('\0', &c);
+          }
+        dfa->utf8_anychar_classes[i] = CSET + charclass_index (dfa, &c);
+      }
+
+  /* A valid UTF-8 character is
+
+     ([0x00-0x7f]
+     |[0xc2-0xdf][0x80-0xbf]
+     |[0xe0-0xef[0x80-0xbf][0x80-0xbf]
+     |[0xf0-f7][0x80-0xbf][0x80-0xbf][0x80-0xbf])
+
+     which I'll write more concisely "B|CA|DAA|EAAA".  Factor the [0x00-0x7f]
+     and you get "B|(C|(D|EA)A)A".  And since the token buffer is in reverse
+     Polish notation, you get "B C D E A CAT OR A CAT OR A CAT OR".  */
+  unsigned int i;
+  for (i = 1; i < n; i++)
+    addtok (dfa, dfa->utf8_anychar_classes[i]);
+  while (--i > 1)
+    {
+      addtok (dfa, dfa->utf8_anychar_classes[0]);
+      addtok (dfa, CAT);
+      addtok (dfa, OR);
+    }
+}
+
+/* The grammar understood by the parser is as follows.
+
+   regexp:
+     regexp OR branch
+     branch
+
+   branch:
+     branch closure
+     closure
+
+   closure:
+     closure QMARK
+     closure STAR
+     closure PLUS
+     closure REPMN
+     atom
+
+   atom:
+     <normal character>
+     <multibyte character>
+     ANYCHAR
+     MBCSET
+     CSET
+     BACKREF
+     BEGLINE
+     ENDLINE
+     BEGWORD
+     ENDWORD
+     LIMWORD
+     NOTLIMWORD
+     LPAREN regexp RPAREN
+     <empty>
+
+   The parser builds a parse tree in postfix form in an array of tokens.  */
+
+static void
+atom (struct dfa *dfa)
+{
+  if ((0 <= dfa->parse.tok && dfa->parse.tok < NOTCHAR)
+      || dfa->parse.tok >= CSET
+      || dfa->parse.tok == BEG || dfa->parse.tok == BACKREF
+      || dfa->parse.tok == BEGLINE || dfa->parse.tok == ENDLINE
+      || dfa->parse.tok == BEGWORD || dfa->parse.tok == ENDWORD
+      || dfa->parse.tok == LIMWORD || dfa->parse.tok == NOTLIMWORD
+      || dfa->parse.tok == ANYCHAR || dfa->parse.tok == MBCSET)
+    {
+      if (dfa->parse.tok == ANYCHAR && dfa->localeinfo.using_utf8)
+        {
+          /* For UTF-8 expand the period to a series of CSETs that define a
+             valid UTF-8 character.  This avoids using the slow multibyte
+             path.  I'm pretty sure it would be both profitable and correct to
+             do it for any encoding; however, the optimization must be done
+             manually as it is done above in add_utf8_anychar.  So, let's
+             start with UTF-8: it is the most used, and the structure of the
+             encoding makes the correctness more obvious.  */
+          add_utf8_anychar (dfa);
+        }
+      else
+        addtok (dfa, dfa->parse.tok);
+      dfa->parse.tok = lex (dfa);
+    }
+  else if (dfa->parse.tok == WCHAR)
+    {
+      if (dfa->lex.wctok == WEOF)
+        addtok (dfa, BACKREF);
+      else
+        {
+          addtok_wc (dfa, dfa->lex.wctok);
+
+          if (dfa->syntax.case_fold)
+            {
+              wchar_t folded[CASE_FOLDED_BUFSIZE];
+              unsigned int n = case_folded_counterparts (dfa->lex.wctok,
+                                                         folded);
+              for (unsigned int i = 0; i < n; i++)
+                {
+                  addtok_wc (dfa, folded[i]);
+                  addtok (dfa, OR);
+                }
+            }
+        }
+
+      dfa->parse.tok = lex (dfa);
+    }
+  else if (dfa->parse.tok == LPAREN)
+    {
+      dfa->parse.tok = lex (dfa);
+      regexp (dfa);
+      if (dfa->parse.tok != RPAREN)
+        dfaerror (_("unbalanced ("));
+      dfa->parse.tok = lex (dfa);
+    }
+  else
+    addtok (dfa, EMPTY);
+}
+
+/* Return the number of tokens in the given subexpression.  */
+static size_t _GL_ATTRIBUTE_PURE
+nsubtoks (struct dfa const *dfa, size_t tindex)
+{
+  switch (dfa->tokens[tindex - 1])
+    {
+    default:
+      return 1;
+    case QMARK:
+    case STAR:
+    case PLUS:
+      return 1 + nsubtoks (dfa, tindex - 1);
+    case CAT:
+    case OR:
+      {
+        size_t ntoks1 = nsubtoks (dfa, tindex - 1);
+        return 1 + ntoks1 + nsubtoks (dfa, tindex - 1 - ntoks1);
+      }
+    }
+}
+
+/* Copy the given subexpression to the top of the tree.  */
+static void
+copytoks (struct dfa *dfa, size_t tindex, size_t ntokens)
+{
+  if (dfa->localeinfo.multibyte)
+    for (size_t i = 0; i < ntokens; ++i)
+      addtok_mb (dfa, dfa->tokens[tindex + i],
+                 dfa->multibyte_prop[tindex + i]);
+  else
+    for (size_t i = 0; i < ntokens; ++i)
+      addtok_mb (dfa, dfa->tokens[tindex + i], 3);
+}
+
+static void
+closure (struct dfa *dfa)
+{
+  atom (dfa);
+  while (dfa->parse.tok == QMARK || dfa->parse.tok == STAR
+         || dfa->parse.tok == PLUS || dfa->parse.tok == REPMN)
+    if (dfa->parse.tok == REPMN && (dfa->lex.minrep || dfa->lex.maxrep))
+      {
+        size_t ntokens = nsubtoks (dfa, dfa->tindex);
+        size_t tindex = dfa->tindex - ntokens;
+        if (dfa->lex.maxrep < 0)
+          addtok (dfa, PLUS);
+        if (dfa->lex.minrep == 0)
+          addtok (dfa, QMARK);
+        int i;
+        for (i = 1; i < dfa->lex.minrep; i++)
+          {
+            copytoks (dfa, tindex, ntokens);
+            addtok (dfa, CAT);
+          }
+        for (; i < dfa->lex.maxrep; i++)
+          {
+            copytoks (dfa, tindex, ntokens);
+            addtok (dfa, QMARK);
+            addtok (dfa, CAT);
+          }
+        dfa->parse.tok = lex (dfa);
+      }
+    else if (dfa->parse.tok == REPMN)
+      {
+        dfa->tindex -= nsubtoks (dfa, dfa->tindex);
+        dfa->parse.tok = lex (dfa);
+        closure (dfa);
+      }
+    else
+      {
+        addtok (dfa, dfa->parse.tok);
+        dfa->parse.tok = lex (dfa);
+      }
+}
+
+static void
+branch (struct dfa* dfa)
+{
+  closure (dfa);
+  while (dfa->parse.tok != RPAREN && dfa->parse.tok != OR
+         && dfa->parse.tok >= 0)
+    {
+      closure (dfa);
+      addtok (dfa, CAT);
+    }
+}
+
+static void
+regexp (struct dfa *dfa)
+{
+  branch (dfa);
+  while (dfa->parse.tok == OR)
+    {
+      dfa->parse.tok = lex (dfa);
+      branch (dfa);
+      addtok (dfa, OR);
+    }
+}
+
+/* Main entry point for the parser.  S is a string to be parsed, len is the
+   length of the string, so s can include NUL characters.  D is a pointer to
+   the struct dfa to parse into.  */
+static void
+dfaparse (char const *s, size_t len, struct dfa *d)
+{
+  d->lex.ptr = s;
+  d->lex.left = len;
+  d->lex.lasttok = END;
+  d->lex.laststart = true;
+
+  if (!d->syntax.syntax_bits_set)
+    dfaerror (_("no syntax specified"));
+
+  if (!d->nregexps)
+    addtok (d, BEG);
+
+  d->parse.tok = lex (d);
+  d->parse.depth = d->depth;
+
+  regexp (d);
+
+  if (d->parse.tok != END)
+    dfaerror (_("unbalanced )"));
+
+  addtok (d, END - d->nregexps);
+  addtok (d, CAT);
+
+  if (d->nregexps)
+    addtok (d, OR);
+
+  ++d->nregexps;
+}
+
+/* Some primitives for operating on sets of positions.  */
+
+/* Copy one set to another.  */
+static void
+copy (position_set const *src, position_set *dst)
+{
+  if (dst->alloc < src->nelem)
+    {
+      free (dst->elems);
+      dst->elems = xpalloc (NULL, &dst->alloc, src->nelem - dst->alloc, -1,
+                            sizeof *dst->elems);
+    }
+  dst->nelem = src->nelem;
+  if (src->nelem != 0)
+    memcpy (dst->elems, src->elems, src->nelem * sizeof *dst->elems);
+}
+
+static void
+alloc_position_set (position_set *s, size_t size)
+{
+  s->elems = xnmalloc (size, sizeof *s->elems);
+  s->alloc = size;
+  s->nelem = 0;
+}
+
+/* Insert position P in set S.  S is maintained in sorted order on
+   decreasing index.  If there is already an entry in S with P.index
+   then merge (logically-OR) P's constraints into the one in S.
+   S->elems must point to an array large enough to hold the resulting set.  */
+static void
+insert (position p, position_set *s)
+{
+  ptrdiff_t count = s->nelem;
+  ptrdiff_t lo = 0, hi = count;
+  while (lo < hi)
+    {
+      ptrdiff_t mid = (lo + hi) >> 1;
+      if (s->elems[mid].index < p.index)
+        lo = mid + 1;
+      else if (s->elems[mid].index == p.index)
+        {
+          s->elems[mid].constraint |= p.constraint;
+          return;
+        }
+      else
+        hi = mid;
+    }
+
+  s->elems = maybe_realloc (s->elems, count, &s->alloc, -1, sizeof *s->elems);
+  for (ptrdiff_t i = count; i > lo; i--)
+    s->elems[i] = s->elems[i - 1];
+  s->elems[lo] = p;
+  ++s->nelem;
+}
+
+static void
+append (position p, position_set *s)
+{
+  ptrdiff_t count = s->nelem;
+  s->elems = maybe_realloc (s->elems, count, &s->alloc, -1, sizeof *s->elems);
+  s->elems[s->nelem++] = p;
+}
+
+/* Merge S1 and S2 (with the additional constraint C2) into M.  The
+   result is as if the positions of S1, and of S2 with the additional
+   constraint C2, were inserted into an initially empty set.  */
+static void
+merge_constrained (position_set const *s1, position_set const *s2,
+                   unsigned int c2, position_set *m)
+{
+  ptrdiff_t i = 0, j = 0;
+
+  if (m->alloc - s1->nelem < s2->nelem)
+    {
+      free (m->elems);
+      m->alloc = s1->nelem;
+      m->elems = xpalloc (NULL, &m->alloc, s2->nelem, -1, sizeof *m->elems);
+    }
+  m->nelem = 0;
+  while (i < s1->nelem || j < s2->nelem)
+    if (! (j < s2->nelem)
+        || (i < s1->nelem && s1->elems[i].index <= s2->elems[j].index))
+      {
+        unsigned int c = ((i < s1->nelem && j < s2->nelem
+                           && s1->elems[i].index == s2->elems[j].index)
+                          ? s2->elems[j++].constraint & c2
+                          : 0);
+        m->elems[m->nelem].index = s1->elems[i].index;
+        m->elems[m->nelem++].constraint = s1->elems[i++].constraint | c;
+      }
+    else
+      {
+        if (s2->elems[j].constraint & c2)
+          {
+            m->elems[m->nelem].index = s2->elems[j].index;
+            m->elems[m->nelem++].constraint = s2->elems[j].constraint & c2;
+          }
+        j++;
+      }
+}
+
+/* Merge two sets of positions into a third.  The result is exactly as if
+   the positions of both sets were inserted into an initially empty set.  */
+static void
+merge (position_set const *s1, position_set const *s2, position_set *m)
+{
+  merge_constrained (s1, s2, -1, m);
+}
+
+static void
+merge2 (position_set *dst, position_set const *src, position_set *m)
+{
+  if (src->nelem < 4)
+    {
+      for (ptrdiff_t i = 0; i < src->nelem; ++i)
+        insert (src->elems[i], dst);
+    }
+   else
+    {
+      merge (src, dst, m);
+      copy (m, dst);
+    }
+}
+
+/* Delete a position from a set.  Return the nonzero constraint of the
+   deleted position, or zero if there was no such position.  */
+static unsigned int
+delete (size_t del, position_set *s)
+{
+  size_t count = s->nelem;
+  size_t lo = 0, hi = count;
+  while (lo < hi)
+    {
+      size_t mid = (lo + hi) >> 1;
+      if (s->elems[mid].index < del)
+        lo = mid + 1;
+      else if (s->elems[mid].index == del)
+        {
+          unsigned int c = s->elems[mid].constraint;
+          size_t i;
+          for (i = mid; i + 1 < count; i++)
+            s->elems[i] = s->elems[i + 1];
+          s->nelem = i;
+          return c;
+        }
+      else
+        hi = mid;
+    }
+  return 0;
+}
+
+/* Replace a position with the followed set.  */
+static void
+replace (position_set *dst, size_t del, position_set *add,
+         unsigned int constraint, position_set *tmp)
+{
+  unsigned int c = delete (del, dst) & constraint;
+
+  if (c)
+    {
+      copy (dst, tmp);
+      merge_constrained (tmp, add, c, dst);
+    }
+}
+
+/* Find the index of the state corresponding to the given position set with
+   the given preceding context, or create a new state if there is no such
+   state.  Context tells whether we got here on a newline or letter.  */
+static state_num
+state_index (struct dfa *d, position_set const *s, int context)
+{
+  size_t hash = 0;
+  int constraint = 0;
+  state_num i;
+  token first_end = 0;
+
+  for (i = 0; i < s->nelem; ++i)
+    hash ^= s->elems[i].index + s->elems[i].constraint;
+
+  /* Try to find a state that exactly matches the proposed one.  */
+  for (i = 0; i < d->sindex; ++i)
+    {
+      if (hash != d->states[i].hash || s->nelem != d->states[i].elems.nelem
+          || context != d->states[i].context)
+        continue;
+      state_num j;
+      for (j = 0; j < s->nelem; ++j)
+        if (s->elems[j].constraint != d->states[i].elems.elems[j].constraint
+            || s->elems[j].index != d->states[i].elems.elems[j].index)
+          break;
+      if (j == s->nelem)
+        return i;
+    }
+
+#ifdef DEBUG
+  fprintf (stderr, "new state %zd\n nextpos:", i);
+  for (state_num j = 0; j < s->nelem; j++)
+    {
+      fprintf (stderr, " %zu:", s->elems[j].index);
+      prtok (d->tokens[s->elems[j].index]);
+    }
+  fprintf (stderr, "\n context:");
+  if (context ^ CTX_ANY)
+    {
+      if (context & CTX_NONE)
+        fprintf (stderr, " CTX_NONE");
+      if (context & CTX_LETTER)
+        fprintf (stderr, " CTX_LETTER");
+      if (context & CTX_NEWLINE)
+        fprintf (stderr, " CTX_NEWLINE");
+    }
+  else
+    fprintf (stderr, " CTX_ANY");
+  fprintf (stderr, "\n");
+#endif
+
+  for (state_num j = 0; j < s->nelem; j++)
+    {
+      int c = d->constraints[s->elems[j].index];
+
+      if (c != 0)
+        {
+          if (succeeds_in_context (c, context, CTX_ANY))
+            constraint |= c;
+          if (!first_end)
+            first_end = d->tokens[s->elems[j].index];
+        }
+      else if (d->tokens[s->elems[j].index] == BACKREF)
+        constraint = NO_CONSTRAINT;
+    }
+
+
+  /* Create a new state.  */
+  d->states = maybe_realloc (d->states, d->sindex, &d->salloc, -1,
+                             sizeof *d->states);
+  d->states[i].hash = hash;
+  alloc_position_set (&d->states[i].elems, s->nelem);
+  copy (s, &d->states[i].elems);
+  d->states[i].context = context;
+  d->states[i].constraint = constraint;
+  d->states[i].first_end = first_end;
+  d->states[i].mbps.nelem = 0;
+  d->states[i].mbps.elems = NULL;
+  d->states[i].mb_trindex = -1;
+
+  ++d->sindex;
+
+  return i;
+}
+
+/* Find the epsilon closure of a set of positions.  If any position of the set
+   contains a symbol that matches the empty string in some context, replace
+   that position with the elements of its follow labeled with an appropriate
+   constraint.  Repeat exhaustively until no funny positions are left.
+   S->elems must be large enough to hold the result.  */
+static void
+epsclosure (struct dfa const *d)
+{
+  position_set tmp;
+  alloc_position_set (&tmp, d->nleaves);
+  for (size_t i = 0; i < d->tindex; ++i)
+    if (d->follows[i].nelem > 0 && d->tokens[i] >= NOTCHAR
+        && d->tokens[i] != BACKREF && d->tokens[i] != ANYCHAR
+        && d->tokens[i] != MBCSET && d->tokens[i] < CSET)
+      {
+        unsigned int constraint;
+        switch (d->tokens[i])
+          {
+          case BEGLINE:
+            constraint = BEGLINE_CONSTRAINT;
+            break;
+          case ENDLINE:
+            constraint = ENDLINE_CONSTRAINT;
+            break;
+          case BEGWORD:
+            constraint = BEGWORD_CONSTRAINT;
+            break;
+          case ENDWORD:
+            constraint = ENDWORD_CONSTRAINT;
+            break;
+          case LIMWORD:
+            constraint = LIMWORD_CONSTRAINT;
+            break;
+          case NOTLIMWORD:
+            constraint = NOTLIMWORD_CONSTRAINT;
+            break;
+          default:
+            constraint = NO_CONSTRAINT;
+            break;
+          }
+
+        delete (i, &d->follows[i]);
+
+        for (size_t j = 0; j < d->tindex; j++)
+          if (i != j && d->follows[j].nelem > 0)
+            replace (&d->follows[j], i, &d->follows[i], constraint, &tmp);
+      }
+  free (tmp.elems);
+}
+
+/* Returns the set of contexts for which there is at least one
+   character included in C.  */
+
+static int
+charclass_context (struct dfa const *dfa, charclass const *c)
+{
+  int context = 0;
+
+  for (unsigned int j = 0; j < CHARCLASS_WORDS; ++j)
+    {
+      if (c->w[j] & dfa->syntax.newline.w[j])
+        context |= CTX_NEWLINE;
+      if (c->w[j] & dfa->syntax.letters.w[j])
+        context |= CTX_LETTER;
+      if (c->w[j] & ~(dfa->syntax.letters.w[j] | dfa->syntax.newline.w[j]))
+        context |= CTX_NONE;
+    }
+
+  return context;
+}
+
+/* Returns the contexts on which the position set S depends.  Each context
+   in the set of returned contexts (let's call it SC) may have a different
+   follow set than other contexts in SC, and also different from the
+   follow set of the complement set (sc ^ CTX_ANY).  However, all contexts
+   in the complement set will have the same follow set.  */
+
+static int _GL_ATTRIBUTE_PURE
+state_separate_contexts (struct dfa *d, position_set const *s)
+{
+  int separate_contexts = 0;
+
+  for (size_t j = 0; j < s->nelem; j++)
+    separate_contexts |= d->separates[s->elems[j].index];
+
+  return separate_contexts;
+}
+
+enum
+{
+  /* Single token is repeated.  It is distinguished from non-repeated.  */
+  OPT_REPEAT = (1 << 0),
+
+  /* Multiple tokens are repeated.  This flag is on at head of tokens.  The
+     node is not merged.  */
+  OPT_LPAREN = (1 << 1),
+
+  /* Multiple branches are joined.  The node is not merged.  */
+  OPT_RPAREN = (1 << 2),
+
+  /* The node is walked.  If the node is found in walking again, OPT_RPAREN
+     flag is turned on. */
+  OPT_WALKED = (1 << 3),
+
+  /* The node is queued.  The node is not queued again.  */
+  OPT_QUEUED = (1 << 4)
+};
+
+static void
+merge_nfa_state (struct dfa *d, size_t tindex, char *flags,
+                 position_set *merged)
+{
+  position_set *follows = d->follows;
+  ptrdiff_t nelem = 0;
+
+  d->constraints[tindex] = 0;
+
+  for (ptrdiff_t i = 0; i < follows[tindex].nelem; i++)
+    {
+      size_t sindex = follows[tindex].elems[i].index;
+
+      /* Skip the node as pruned in future.  */
+      unsigned int iconstraint = follows[tindex].elems[i].constraint;
+      if (iconstraint == 0)
+        continue;
+
+      if (d->tokens[follows[tindex].elems[i].index] <= END)
+        {
+          d->constraints[tindex] |= follows[tindex].elems[i].constraint;
+          continue;
+        }
+
+      if (!(flags[sindex] & (OPT_LPAREN | OPT_RPAREN)))
+        {
+          ptrdiff_t j;
+
+          for (j = 0; j < nelem; j++)
+            {
+              size_t dindex = follows[tindex].elems[j].index;
+
+              if (follows[tindex].elems[j].constraint != iconstraint)
+                continue;
+
+              if (flags[dindex] & (OPT_LPAREN | OPT_RPAREN))
+                continue;
+
+              if (d->tokens[sindex] != d->tokens[dindex])
+                continue;
+
+              if ((flags[sindex] ^ flags[dindex]) & OPT_REPEAT)
+                continue;
+
+              if (flags[sindex] & OPT_REPEAT)
+                delete (sindex, &follows[sindex]);
+
+              merge2 (&follows[dindex], &follows[sindex], merged);
+
+              break;
+            }
+
+          if (j < nelem)
+            continue;
+        }
+
+      follows[tindex].elems[nelem++] = follows[tindex].elems[i];
+      flags[sindex] |= OPT_QUEUED;
+    }
+
+  follows[tindex].nelem = nelem;
+}
+
+static int
+compare (const void *a, const void *b)
+{
+  int aindex;
+  int bindex;
+
+  aindex = (int) ((position *) a)->index;
+  bindex = (int) ((position *) b)->index;
+
+  return aindex - bindex;
+}
+
+static void
+reorder_tokens (struct dfa *d)
+{
+  ptrdiff_t nleaves;
+  ptrdiff_t *map;
+  token *tokens;
+  position_set *follows;
+  int *constraints;
+  char *multibyte_prop;
+
+  nleaves = 0;
+
+  map = xnmalloc (d->tindex, sizeof *map);
+
+  map[0] = nleaves++;
+
+  for (ptrdiff_t i = 1; i < d->tindex; i++)
+    map[i] = -1;
+
+  tokens = xnmalloc (d->nleaves, sizeof *tokens);
+  follows = xnmalloc (d->nleaves, sizeof *follows);
+  constraints = xnmalloc (d->nleaves, sizeof *constraints);
+
+  if (d->localeinfo.multibyte)
+    multibyte_prop = xnmalloc (d->nleaves, sizeof *multibyte_prop);
+  else
+    multibyte_prop = NULL;
+
+  for (ptrdiff_t i = 0; i < d->tindex; i++)
+    {
+      if (map[i] == -1)
+        {
+          free (d->follows[i].elems);
+          d->follows[i].elems = NULL;
+          d->follows[i].nelem = 0;
+          continue;
+        }
+
+      tokens[map[i]] = d->tokens[i];
+      follows[map[i]] = d->follows[i];
+      constraints[map[i]] = d->constraints[i];
+
+      if (multibyte_prop != NULL)
+        multibyte_prop[map[i]] = d->multibyte_prop[i];
+
+      for (ptrdiff_t j = 0; j < d->follows[i].nelem; j++)
+        {
+          if (map[d->follows[i].elems[j].index] == -1)
+            map[d->follows[i].elems[j].index] = nleaves++;
+
+          d->follows[i].elems[j].index = map[d->follows[i].elems[j].index];
+        }
+
+      qsort (d->follows[i].elems, d->follows[i].nelem,
+             sizeof *d->follows[i].elems, compare);
+    }
+
+  for (ptrdiff_t i = 0; i < nleaves; i++)
+    {
+      d->tokens[i] = tokens[i];
+      d->follows[i] = follows[i];
+      d->constraints[i] = constraints[i];
+
+      if (multibyte_prop != NULL)
+        d->multibyte_prop[i] = multibyte_prop[i];
+    }
+
+  d->tindex = d->nleaves = nleaves;
+
+  free (tokens);
+  free (follows);
+  free (constraints);
+  free (multibyte_prop);
+  free (map);
+}
+
+static void
+dfaoptimize (struct dfa *d)
+{
+  char *flags;
+  position_set merged0;
+  position_set *merged;
+
+  flags = xmalloc (d->tindex * sizeof *flags);
+  memset (flags, 0, d->tindex * sizeof *flags);
+
+  for (size_t i = 0; i < d->tindex; i++)
+    {
+      for (ptrdiff_t j = 0; j < d->follows[i].nelem; j++)
+        {
+          if (d->follows[i].elems[j].index == i)
+            flags[d->follows[i].elems[j].index] |= OPT_REPEAT;
+          else if (d->follows[i].elems[j].index < i)
+            flags[d->follows[i].elems[j].index] |= OPT_LPAREN;
+          else if (flags[d->follows[i].elems[j].index] &= OPT_WALKED)
+            flags[d->follows[i].elems[j].index] |= OPT_RPAREN;
+          else
+            flags[d->follows[i].elems[j].index] |= OPT_WALKED;
+        }
+    }
+
+  flags[0] |= OPT_QUEUED;
+
+  merged = &merged0;
+  alloc_position_set (merged, d->nleaves);
+
+  d->constraints = xnmalloc (d->tindex, sizeof *d->constraints);
+
+  for (ptrdiff_t i = 0; i < d->tindex; i++)
+    if (flags[i] & OPT_QUEUED)
+      merge_nfa_state (d, i, flags, merged);
+
+  reorder_tokens (d);
+
+  free (merged->elems);
+  free (flags);
+}
+
+/* Perform bottom-up analysis on the parse tree, computing various functions.
+   Note that at this point, we're pretending constructs like \< are real
+   characters rather than constraints on what can follow them.
+
+   Nullable:  A node is nullable if it is at the root of a regexp that can
+   match the empty string.
+   *  EMPTY leaves are nullable.
+   * No other leaf is nullable.
+   * A QMARK or STAR node is nullable.
+   * A PLUS node is nullable if its argument is nullable.
+   * A CAT node is nullable if both its arguments are nullable.
+   * An OR node is nullable if either argument is nullable.
+
+   Firstpos:  The firstpos of a node is the set of positions (nonempty leaves)
+   that could correspond to the first character of a string matching the
+   regexp rooted at the given node.
+   * EMPTY leaves have empty firstpos.
+   * The firstpos of a nonempty leaf is that leaf itself.
+   * The firstpos of a QMARK, STAR, or PLUS node is the firstpos of its
+     argument.
+   * The firstpos of a CAT node is the firstpos of the left argument, union
+     the firstpos of the right if the left argument is nullable.
+   * The firstpos of an OR node is the union of firstpos of each argument.
+
+   Lastpos:  The lastpos of a node is the set of positions that could
+   correspond to the last character of a string matching the regexp at
+   the given node.
+   * EMPTY leaves have empty lastpos.
+   * The lastpos of a nonempty leaf is that leaf itself.
+   * The lastpos of a QMARK, STAR, or PLUS node is the lastpos of its
+     argument.
+   * The lastpos of a CAT node is the lastpos of its right argument, union
+     the lastpos of the left if the right argument is nullable.
+   * The lastpos of an OR node is the union of the lastpos of each argument.
+
+   Follow:  The follow of a position is the set of positions that could
+   correspond to the character following a character matching the node in
+   a string matching the regexp.  At this point we consider special symbols
+   that match the empty string in some context to be just normal characters.
+   Later, if we find that a special symbol is in a follow set, we will
+   replace it with the elements of its follow, labeled with an appropriate
+   constraint.
+   * Every node in the firstpos of the argument of a STAR or PLUS node is in
+     the follow of every node in the lastpos.
+   * Every node in the firstpos of the second argument of a CAT node is in
+     the follow of every node in the lastpos of the first argument.
+
+   Because of the postfix representation of the parse tree, the depth-first
+   analysis is conveniently done by a linear scan with the aid of a stack.
+   Sets are stored as arrays of the elements, obeying a stack-like allocation
+   scheme; the number of elements in each set deeper in the stack can be
+   used to determine the address of a particular set's array.  */
+static void
+dfaanalyze (struct dfa *d, bool searchflag)
+{
+  /* Array allocated to hold position sets.  */
+  position *posalloc = xnmalloc (d->nleaves, 2 * sizeof *posalloc);
+  /* Firstpos and lastpos elements.  */
+  position *firstpos = posalloc;
+  position *lastpos = firstpos + d->nleaves;
+  position pos;
+  position_set tmp;
+
+  /* Stack for element counts and nullable flags.  */
+  struct
+  {
+    /* Whether the entry is nullable.  */
+    bool nullable;
+
+    /* Counts of firstpos and lastpos sets.  */
+    size_t nfirstpos;
+    size_t nlastpos;
+  } *stkalloc = xnmalloc (d->depth, sizeof *stkalloc), *stk = stkalloc;
+
+  position_set merged;          /* Result of merging sets.  */
+
+  addtok (d, CAT);
+
+#ifdef DEBUG
+  fprintf (stderr, "dfaanalyze:\n");
+  for (size_t i = 0; i < d->tindex; ++i)
+    {
+      fprintf (stderr, " %zu:", i);
+      prtok (d->tokens[i]);
+    }
+  putc ('\n', stderr);
+#endif
+
+  d->searchflag = searchflag;
+  alloc_position_set (&merged, d->nleaves);
+  d->follows = xcalloc (d->tindex, sizeof *d->follows);
+
+  for (size_t i = 0; i < d->tindex; ++i)
+    {
+      switch (d->tokens[i])
+        {
+        case EMPTY:
+          /* The empty set is nullable.  */
+          stk->nullable = true;
+
+          /* The firstpos and lastpos of the empty leaf are both empty.  */
+          stk->nfirstpos = stk->nlastpos = 0;
+          stk++;
+          break;
+
+        case STAR:
+        case PLUS:
+          /* Every element in the firstpos of the argument is in the follow
+             of every element in the lastpos.  */
+          {
+            tmp.elems = firstpos - stk[-1].nfirstpos;
+            tmp.nelem = stk[-1].nfirstpos;
+            position *p = lastpos - stk[-1].nlastpos;
+            for (size_t j = 0; j < stk[-1].nlastpos; j++)
+              {
+                merge (&tmp, &d->follows[p[j].index], &merged);
+                copy (&merged, &d->follows[p[j].index]);
+              }
+          }
+          FALLTHROUGH;
+        case QMARK:
+          /* A QMARK or STAR node is automatically nullable.  */
+          if (d->tokens[i] != PLUS)
+            stk[-1].nullable = true;
+          break;
+
+        case CAT:
+          /* Every element in the firstpos of the second argument is in the
+             follow of every element in the lastpos of the first argument.  */
+          {
+            tmp.nelem = stk[-1].nfirstpos;
+            tmp.elems = firstpos - stk[-1].nfirstpos;
+            position *p = lastpos - stk[-1].nlastpos - stk[-2].nlastpos;
+            for (size_t j = 0; j < stk[-2].nlastpos; j++)
+              {
+                merge (&tmp, &d->follows[p[j].index], &merged);
+                copy (&merged, &d->follows[p[j].index]);
+              }
+          }
+
+          /* The firstpos of a CAT node is the firstpos of the first argument,
+             union that of the second argument if the first is nullable.  */
+          if (stk[-2].nullable)
+            stk[-2].nfirstpos += stk[-1].nfirstpos;
+          else
+            firstpos -= stk[-1].nfirstpos;
+
+          /* The lastpos of a CAT node is the lastpos of the second argument,
+             union that of the first argument if the second is nullable.  */
+          if (stk[-1].nullable)
+            stk[-2].nlastpos += stk[-1].nlastpos;
+          else
+            {
+              position *p = lastpos - stk[-1].nlastpos - stk[-2].nlastpos;
+              for (size_t j = 0; j < stk[-1].nlastpos; j++)
+                p[j] = p[j + stk[-2].nlastpos];
+              lastpos -= stk[-2].nlastpos;
+              stk[-2].nlastpos = stk[-1].nlastpos;
+            }
+
+          /* A CAT node is nullable if both arguments are nullable.  */
+          stk[-2].nullable &= stk[-1].nullable;
+          stk--;
+          break;
+
+        case OR:
+          /* The firstpos is the union of the firstpos of each argument.  */
+          stk[-2].nfirstpos += stk[-1].nfirstpos;
+
+          /* The lastpos is the union of the lastpos of each argument.  */
+          stk[-2].nlastpos += stk[-1].nlastpos;
+
+          /* An OR node is nullable if either argument is nullable.  */
+          stk[-2].nullable |= stk[-1].nullable;
+          stk--;
+          break;
+
+        default:
+          /* Anything else is a nonempty position.  (Note that special
+             constructs like \< are treated as nonempty strings here;
+             an "epsilon closure" effectively makes them nullable later.
+             Backreferences have to get a real position so we can detect
+             transitions on them later.  But they are nullable.  */
+          stk->nullable = d->tokens[i] == BACKREF;
+
+          /* This position is in its own firstpos and lastpos.  */
+          stk->nfirstpos = stk->nlastpos = 1;
+          stk++;
+
+          firstpos->index = lastpos->index = i;
+          firstpos->constraint = lastpos->constraint = NO_CONSTRAINT;
+          firstpos++, lastpos++;
+
+          break;
+        }
+#ifdef DEBUG
+      /* ... balance the above nonsyntactic #ifdef goo...  */
+      fprintf (stderr, "node %zu:", i);
+      prtok (d->tokens[i]);
+      putc ('\n', stderr);
+      fprintf (stderr,
+               stk[-1].nullable ? " nullable: yes\n" : " nullable: no\n");
+      fprintf (stderr, " firstpos:");
+      for (size_t j = 0; j < stk[-1].nfirstpos; j++)
+        {
+          fprintf (stderr, " %zu:", firstpos[j - stk[-1].nfirstpos].index);
+          prtok (d->tokens[firstpos[j - stk[-1].nfirstpos].index]);
+        }
+      fprintf (stderr, "\n lastpos:");
+      for (size_t j = 0; j < stk[-1].nlastpos; j++)
+        {
+          fprintf (stderr, " %zu:", lastpos[j - stk[-1].nlastpos].index);
+          prtok (d->tokens[lastpos[j - stk[-1].nlastpos].index]);
+        }
+      putc ('\n', stderr);
+#endif
+    }
+
+  /* For each follow set that is the follow set of a real position, replace
+     it with its epsilon closure.  */
+  epsclosure (d);
+
+  dfaoptimize (d);
+
+#ifdef DEBUG
+  for (size_t i = 0; i < d->tindex; ++i)
+    if (d->tokens[i] == BEG || d->tokens[i] < NOTCHAR
+        || d->tokens[i] == BACKREF || d->tokens[i] == ANYCHAR
+        || d->tokens[i] == MBCSET || d->tokens[i] >= CSET)
+      {
+        fprintf (stderr, "follows(%zu:", i);
+        prtok (d->tokens[i]);
+        fprintf (stderr, "):");
+        for (size_t j = 0; j < d->follows[i].nelem; j++)
+          {
+            fprintf (stderr, " %zu:", d->follows[i].elems[j].index);
+            prtok (d->tokens[d->follows[i].elems[j].index]);
+          }
+        putc ('\n', stderr);
+      }
+#endif
+
+  pos.index = 0;
+  pos.constraint = NO_CONSTRAINT;
+
+  alloc_position_set (&tmp, 1);
+
+  append (pos, &tmp);
+
+  d->separates = xnmalloc (d->tindex, sizeof *d->separates);
+
+  for (ptrdiff_t i = 0; i < d->tindex; i++)
+    {
+      d->separates[i] = 0;
+
+      if (prev_newline_dependent (d->constraints[i]))
+        d->separates[i] |= CTX_NEWLINE;
+      if (prev_letter_dependent (d->constraints[i]))
+        d->separates[i] |= CTX_LETTER;
+
+      for (ptrdiff_t j = 0; j < d->follows[i].nelem; j++)
+        {
+          if (prev_newline_dependent (d->follows[i].elems[j].constraint))
+            d->separates[i] |= CTX_NEWLINE;
+          if (prev_letter_dependent (d->follows[i].elems[j].constraint))
+            d->separates[i] |= CTX_LETTER;
+        }
+    }
+
+  /* Context wanted by some position.  */
+  int separate_contexts = state_separate_contexts (d, &tmp);
+
+  /* Build the initial state.  */
+  if (separate_contexts & CTX_NEWLINE)
+    state_index (d, &tmp, CTX_NEWLINE);
+  d->initstate_notbol = d->min_trcount
+    = state_index (d, &tmp, separate_contexts ^ CTX_ANY);
+  if (separate_contexts & CTX_LETTER)
+    d->min_trcount = state_index (d, &tmp, CTX_LETTER);
+  d->min_trcount++;
+  d->trcount = 0;
+
+  free (posalloc);
+  free (stkalloc);
+  free (merged.elems);
+  free (tmp.elems);
+}
+
+/* Make sure D's state arrays are large enough to hold NEW_STATE.  */
+static void
+realloc_trans_if_necessary (struct dfa *d)
+{
+  state_num oldalloc = d->tralloc;
+  if (oldalloc < d->sindex)
+    {
+      state_num **realtrans = d->trans ? d->trans - 2 : NULL;
+      ptrdiff_t newalloc1 = realtrans ? d->tralloc + 2 : 0;
+      realtrans = xpalloc (realtrans, &newalloc1, d->sindex - oldalloc,
+                           -1, sizeof *realtrans);
+      realtrans[0] = realtrans[1] = NULL;
+      d->trans = realtrans + 2;
+      ptrdiff_t newalloc = d->tralloc = newalloc1 - 2;
+      d->fails = xnrealloc (d->fails, newalloc, sizeof *d->fails);
+      d->success = xnrealloc (d->success, newalloc, sizeof *d->success);
+      d->newlines = xnrealloc (d->newlines, newalloc, sizeof *d->newlines);
+      if (d->localeinfo.multibyte)
+        {
+          realtrans = d->mb_trans ? d->mb_trans - 2 : NULL;
+          realtrans = xnrealloc (realtrans, newalloc1, sizeof *realtrans);
+          if (oldalloc == 0)
+            realtrans[0] = realtrans[1] = NULL;
+          d->mb_trans = realtrans + 2;
+        }
+      for (; oldalloc < newalloc; oldalloc++)
+        {
+          d->trans[oldalloc] = NULL;
+          d->fails[oldalloc] = NULL;
+          if (d->localeinfo.multibyte)
+            d->mb_trans[oldalloc] = NULL;
+        }
+    }
+}
+
+/*
+   Calculate the transition table for a new state derived from state s
+   for a compiled dfa d after input character uc, and return the new
+   state number.
+
+   Do not worry about all possible input characters; calculate just the group
+   of positions that match uc.  Label it with the set of characters that
+   every position in the group matches (taking into account, if necessary,
+   preceding context information of s).  Then find the union
+   of these positions' follows, i.e., the set of positions of the
+   new state.  For each character in the group's label, set the transition
+   on this character to be to a state corresponding to the set's positions,
+   and its associated backward context information, if necessary.
+
+   When building a searching matcher, include the positions of state
+   0 in every state.
+
+   The group is constructed by building an equivalence-class
+   partition of the positions of s.
+
+   For each position, find the set of characters C that it matches.  Eliminate
+   any characters from C that fail on grounds of backward context.
+
+   Check whether the group's label L has nonempty
+   intersection with C.  If L - C is nonempty, create a new group labeled
+   L - C and having the same positions as the current group, and set L to
+   the intersection of L and C.  Insert the position in the group, set
+   C = C - L, and resume scanning.
+
+   If after comparing with every group there are characters remaining in C,
+   create a new group labeled with the characters of C and insert this
+   position in that group.  */
+
+static state_num
+build_state (state_num s, struct dfa *d, unsigned char uc)
+{
+  position_set follows;         /* Union of the follows for each
+                                   position of the current state.  */
+  position_set group;           /* Positions that match the input char.  */
+  position_set tmp;             /* Temporary space for merging sets.  */
+  state_num state;              /* New state.  */
+  state_num state_newline;      /* New state on a newline transition.  */
+  state_num state_letter;       /* New state on a letter transition.  */
+
+#ifdef DEBUG
+  fprintf (stderr, "build state %td\n", s);
+#endif
+
+  /* A pointer to the new transition table, and the table itself.  */
+  state_num **ptrans = (accepting (s, d) ? d->fails : d->trans) + s;
+  state_num *trans = *ptrans;
+
+  if (!trans)
+    {
+      /* MAX_TRCOUNT is an arbitrary upper limit on the number of
+         transition tables that can exist at once, other than for
+         initial states.  Often-used transition tables are quickly
+         rebuilt, whereas rarely-used ones are cleared away.  */
+      if (MAX_TRCOUNT <= d->trcount)
+        {
+          for (state_num i = d->min_trcount; i < d->tralloc; i++)
+            {
+              free (d->trans[i]);
+              free (d->fails[i]);
+              d->trans[i] = d->fails[i] = NULL;
+            }
+          d->trcount = 0;
+        }
+
+      d->trcount++;
+      *ptrans = trans = xmalloc (NOTCHAR * sizeof *trans);
+
+      /* Fill transition table with a default value which means that the
+         transited state has not been calculated yet.  */
+      for (int i = 0; i < NOTCHAR; i++)
+        trans[i] = -2;
+    }
+
+  /* Set up the success bits for this state.  */
+  d->success[s] = 0;
+  if (accepts_in_context (d->states[s].context, CTX_NEWLINE, s, d))
+    d->success[s] |= CTX_NEWLINE;
+  if (accepts_in_context (d->states[s].context, CTX_LETTER, s, d))
+    d->success[s] |= CTX_LETTER;
+  if (accepts_in_context (d->states[s].context, CTX_NONE, s, d))
+    d->success[s] |= CTX_NONE;
+
+  alloc_position_set (&follows, d->nleaves);
+
+  /* Find the union of the follows of the positions of the group.
+     This is a hideously inefficient loop.  Fix it someday.  */
+  for (size_t j = 0; j < d->states[s].elems.nelem; ++j)
+    for (size_t k = 0;
+         k < d->follows[d->states[s].elems.elems[j].index].nelem; ++k)
+      insert (d->follows[d->states[s].elems.elems[j].index].elems[k],
+              &follows);
+
+  /* Positions that match the input char.  */
+  alloc_position_set (&group, d->nleaves);
+
+  /* The group's label.  */
+  charclass label;
+  fillset (&label);
+
+  for (size_t i = 0; i < follows.nelem; ++i)
+    {
+      charclass matches;            /* Set of matching characters.  */
+      position pos = follows.elems[i];
+      bool matched = false;
+      if (d->tokens[pos.index] >= 0 && d->tokens[pos.index] < NOTCHAR)
+        {
+          zeroset (&matches);
+          setbit (d->tokens[pos.index], &matches);
+          if (d->tokens[pos.index] == uc)
+            matched = true;
+        }
+      else if (d->tokens[pos.index] >= CSET)
+        {
+          matches = d->charclasses[d->tokens[pos.index] - CSET];
+          if (tstbit (uc, &matches))
+            matched = true;
+        }
+      else if (d->tokens[pos.index] == ANYCHAR)
+        {
+          matches = d->charclasses[d->canychar];
+          if (tstbit (uc, &matches))
+            matched = true;
+
+          /* ANYCHAR must match with a single character, so we must put
+             it to D->states[s].mbps which contains the positions which
+             can match with a single character not a byte.  If all
+             positions which has ANYCHAR does not depend on context of
+             next character, we put the follows instead of it to
+             D->states[s].mbps to optimize.  */
+          if (succeeds_in_context (pos.constraint, d->states[s].context,
+                                   CTX_NONE))
+            {
+              if (d->states[s].mbps.nelem == 0)
+                alloc_position_set (&d->states[s].mbps, 1);
+              insert (pos, &d->states[s].mbps);
+            }
+        }
+      else
+        continue;
+
+      /* Some characters may need to be eliminated from matches because
+         they fail in the current context.  */
+      if (pos.constraint != NO_CONSTRAINT)
+        {
+          if (!succeeds_in_context (pos.constraint,
+                                    d->states[s].context, CTX_NEWLINE))
+            for (size_t j = 0; j < CHARCLASS_WORDS; ++j)
+              matches.w[j] &= ~d->syntax.newline.w[j];
+          if (!succeeds_in_context (pos.constraint,
+                                    d->states[s].context, CTX_LETTER))
+            for (size_t j = 0; j < CHARCLASS_WORDS; ++j)
+              matches.w[j] &= ~d->syntax.letters.w[j];
+          if (!succeeds_in_context (pos.constraint,
+                                    d->states[s].context, CTX_NONE))
+            for (size_t j = 0; j < CHARCLASS_WORDS; ++j)
+              matches.w[j] &= d->syntax.letters.w[j] | d->syntax.newline.w[j];
+
+          /* If there are no characters left, there's no point in going on.  */
+          if (emptyset (&matches))
+            continue;
+
+          /* If we have reset the bit that made us declare "matched", reset
+             that indicator, too.  This is required to avoid an infinite loop
+             with this command: echo cx | LC_ALL=C grep -E 'c\b[x ]'  */
+          if (!tstbit (uc, &matches))
+            matched = false;
+        }
+
+#ifdef DEBUG
+      fprintf (stderr, " nextpos %zu:", pos.index);
+      prtok (d->tokens[pos.index]);
+      fprintf (stderr, " of");
+      for (size_t j = 0; j < NOTCHAR; j++)
+        if (tstbit (j, &matches))
+          fprintf (stderr, " 0x%02zx", j);
+      fprintf (stderr, "\n");
+#endif
+
+      if (matched)
+        {
+          for (size_t k = 0; k < CHARCLASS_WORDS; ++k)
+            label.w[k] &= matches.w[k];
+          append (pos, &group);
+        }
+      else
+        {
+          for (size_t k = 0; k < CHARCLASS_WORDS; ++k)
+            label.w[k] &= ~matches.w[k];
+        }
+    }
+
+  alloc_position_set (&tmp, d->nleaves);
+
+  if (group.nelem > 0)
+    {
+      /* If we are building a searching matcher, throw in the positions
+         of state 0 as well, if possible.  */
+      if (d->searchflag)
+        {
+          /* If a token in follows.elems is not 1st byte of a multibyte
+             character, or the states of follows must accept the bytes
+             which are not 1st byte of the multibyte character.
+             Then, if a state of follows encounters a byte, it must not be
+             a 1st byte of a multibyte character nor a single byte character.
+             In this case, do not add state[0].follows to next state, because
+             state[0] must accept 1st-byte.
+
+             For example, suppose <sb a> is a certain single byte character,
+             <mb A> is a certain multibyte character, and the codepoint of
+             <sb a> equals the 2nd byte of the codepoint of <mb A>.  When
+             state[0] accepts <sb a>, state[i] transits to state[i+1] by
+             accepting the 1st byte of <mb A>, and state[i+1] accepts the
+             2nd byte of <mb A>, if state[i+1] encounters the codepoint of
+             <sb a>, it must not be <sb a> but the 2nd byte of <mb A>, so do
+             not add state[0].  */
+
+          bool mergeit = !d->localeinfo.multibyte;
+          if (!mergeit)
+            {
+              mergeit = true;
+              for (size_t j = 0; mergeit && j < group.nelem; j++)
+                mergeit &= d->multibyte_prop[group.elems[j].index];
+            }
+          if (mergeit)
+            {
+              merge (&d->states[0].elems, &group, &tmp);
+              copy (&tmp, &group);
+            }
+        }
+
+      /* Find out if the new state will want any context information,
+         by calculating possible contexts that the group can match,
+         and separate contexts that the new state wants to know.  */
+      int possible_contexts = charclass_context (d, &label);
+      int separate_contexts = state_separate_contexts (d, &group);
+
+      /* Find the state(s) corresponding to the union of the follows.  */
+      if (possible_contexts & ~separate_contexts)
+        state = state_index (d, &group, separate_contexts ^ CTX_ANY);
+      else
+        state = -1;
+      if (separate_contexts & possible_contexts & CTX_NEWLINE)
+        state_newline = state_index (d, &group, CTX_NEWLINE);
+      else
+        state_newline = state;
+      if (separate_contexts & possible_contexts & CTX_LETTER)
+        state_letter = state_index (d, &group, CTX_LETTER);
+      else
+        state_letter = state;
+
+      /* Reallocate now, to reallocate any newline transition properly.  */
+      realloc_trans_if_necessary (d);
+    }
+
+  /* If we are a searching matcher, the default transition is to a state
+     containing the positions of state 0, otherwise the default transition
+     is to fail miserably.  */
+  else if (d->searchflag)
+    {
+      state_newline = 0;
+      state_letter = d->min_trcount - 1;
+      state = d->initstate_notbol;
+    }
+  else
+    {
+      state_newline = -1;
+      state_letter = -1;
+      state = -1;
+    }
+
+  /* Set the transitions for each character in the label.  */
+  for (size_t i = 0; i < NOTCHAR; i++)
+    if (tstbit (i, &label))
+      switch (d->syntax.sbit[i])
+        {
+        case CTX_NEWLINE:
+          trans[i] = state_newline;
+          break;
+        case CTX_LETTER:
+          trans[i] = state_letter;
+          break;
+        default:
+          trans[i] = state;
+          break;
+        }
+
+#ifdef DEBUG
+  fprintf (stderr, "trans table %td", s);
+  for (size_t i = 0; i < NOTCHAR; ++i)
+    {
+      if (!(i & 0xf))
+        fprintf (stderr, "\n");
+      fprintf (stderr, " %2td", trans[i]);
+    }
+  fprintf (stderr, "\n");
+#endif
+
+  free (group.elems);
+  free (follows.elems);
+  free (tmp.elems);
+
+  /* Keep the newline transition in a special place so we can use it as
+     a sentinel.  */
+  if (tstbit (d->syntax.eolbyte, &label))
+    {
+      d->newlines[s] = trans[d->syntax.eolbyte];
+      trans[d->syntax.eolbyte] = -1;
+    }
+
+  return trans[uc];
+}
+
+/* Multibyte character handling sub-routines for dfaexec.  */
+
+/* Consume a single byte and transit state from 's' to '*next_state'.
+   This function is almost same as the state transition routin in dfaexec.
+   But state transition is done just once, otherwise matching succeed or
+   reach the end of the buffer.  */
+static state_num
+transit_state_singlebyte (struct dfa *d, state_num s, unsigned char const **pp)
+{
+  state_num *t;
+
+  if (d->trans[s])
+    t = d->trans[s];
+  else if (d->fails[s])
+    t = d->fails[s];
+  else
+    {
+      build_state (s, d, **pp);
+      if (d->trans[s])
+        t = d->trans[s];
+      else
+        {
+          t = d->fails[s];
+          assert (t);
+        }
+    }
+
+  if (t[**pp] == -2)
+    build_state (s, d, **pp);
+
+  return t[*(*pp)++];
+}
+
+/* Transit state from s, then return new state and update the pointer of
+   the buffer.  This function is for a period operator which can match a
+   multi-byte character.  */
+static state_num
+transit_state (struct dfa *d, state_num s, unsigned char const **pp,
+               unsigned char const *end)
+{
+  wint_t wc;
+
+  int mbclen = mbs_to_wchar (&wc, (char const *) *pp, end - *pp, d);
+
+  /* This state has some operators which can match a multibyte character.  */
+  d->mb_follows.nelem = 0;
+
+  /* Calculate the state which can be reached from the state 's' by
+     consuming 'mbclen' single bytes from the buffer.  */
+  state_num s1 = s;
+  int mbci;
+  for (mbci = 0; mbci < mbclen && (mbci == 0 || d->min_trcount <= s); mbci++)
+    s = transit_state_singlebyte (d, s, pp);
+  *pp += mbclen - mbci;
+
+  if (wc == WEOF)
+    {
+      /* It is an invalid character, so ANYCHAR is not accepted.  */
+      return s;
+    }
+
+  /* If all positions which have ANYCHAR do not depend on the context
+     of the next character, calculate the next state with
+     pre-calculated follows and cache the result.  */
+  if (d->states[s1].mb_trindex < 0)
+    {
+      if (MAX_TRCOUNT <= d->mb_trcount)
+        {
+          state_num s3;
+          for (s3 = -1; s3 < d->tralloc; s3++)
+            {
+              free (d->mb_trans[s3]);
+              d->mb_trans[s3] = NULL;
+            }
+
+          for (state_num i = 0; i < d->sindex; i++)
+            d->states[i].mb_trindex = -1;
+          d->mb_trcount = 0;
+        }
+      d->states[s1].mb_trindex = d->mb_trcount++;
+    }
+
+  if (! d->mb_trans[s])
+    {
+      enum { TRANSPTR_SIZE = sizeof *d->mb_trans[s] };
+      enum { TRANSALLOC_SIZE = MAX_TRCOUNT * TRANSPTR_SIZE };
+      d->mb_trans[s] = xmalloc (TRANSALLOC_SIZE);
+      for (int i = 0; i < MAX_TRCOUNT; i++)
+        d->mb_trans[s][i] = -1;
+    }
+  else if (d->mb_trans[s][d->states[s1].mb_trindex] >= 0)
+    return d->mb_trans[s][d->states[s1].mb_trindex];
+
+  if (s == -1)
+    copy (&d->states[s1].mbps, &d->mb_follows);
+  else
+    merge (&d->states[s1].mbps, &d->states[s].elems, &d->mb_follows);
+
+  int separate_contexts = state_separate_contexts (d, &d->mb_follows);
+  state_num s2 = state_index (d, &d->mb_follows, separate_contexts ^ CTX_ANY);
+  realloc_trans_if_necessary (d);
+
+  d->mb_trans[s][d->states[s1].mb_trindex] = s2;
+
+  return s2;
+}
+
+/* The initial state may encounter a byte which is not a single byte character
+   nor the first byte of a multibyte character.  But it is incorrect for the
+   initial state to accept such a byte.  For example, in Shift JIS the regular
+   expression "\\" accepts the codepoint 0x5c, but should not accept the second
+   byte of the codepoint 0x815c.  Then the initial state must skip the bytes
+   that are not a single byte character nor the first byte of a multibyte
+   character.
+
+   Given DFA state d, use mbs_to_wchar to advance MBP until it reaches
+   or exceeds P, and return the advanced MBP.  If WCP is non-NULL and
+   the result is greater than P, set *WCP to the final wide character
+   processed, or to WEOF if no wide character is processed.  Otherwise,
+   if WCP is non-NULL, *WCP may or may not be updated.
+
+   Both P and MBP must be no larger than END.  */
+static unsigned char const *
+skip_remains_mb (struct dfa *d, unsigned char const *p,
+                 unsigned char const *mbp, char const *end)
+{
+  if (d->syntax.never_trail[*p])
+    return p;
+  while (mbp < p)
+    {
+      wint_t wc;
+      mbp += mbs_to_wchar (&wc, (char const *) mbp,
+                           end - (char const *) mbp, d);
+    }
+  return mbp;
+}
+
+/* Search through a buffer looking for a match to the struct dfa *D.
+   Find the first occurrence of a string matching the regexp in the
+   buffer, and the shortest possible version thereof.  Return a pointer to
+   the first character after the match, or NULL if none is found.  BEGIN
+   points to the beginning of the buffer, and END points to the first byte
+   after its end.  Note however that we store a sentinel byte (usually
+   newline) in *END, so the actual buffer must be one byte longer.
+   When ALLOW_NL, newlines may appear in the matching string.
+   If COUNT is non-NULL, increment *COUNT once for each newline processed.
+   If MULTIBYTE, the input consists of multibyte characters and/or
+   encoding-error bytes.  Otherwise, it consists of single-byte characters.
+   Here is the list of features that make this DFA matcher punt:
+    - [M-N] range in non-simple locale: regex is up to 25% faster on [a-z]
+    - [^...] in non-simple locale
+    - [[=foo=]] or [[.foo.]]
+    - [[:alpha:]] etc. in multibyte locale (except [[:digit:]] works OK)
+    - back-reference: (.)\1
+    - word-delimiter in multibyte locale: \<, \>, \b, \B
+   See using_simple_locale for the definition of "simple locale".  */
+
+static inline char *
+dfaexec_main (struct dfa *d, char const *begin, char *end, bool allow_nl,
+              size_t *count, bool multibyte)
+{
+  if (MAX_TRCOUNT <= d->sindex)
+    {
+      for (state_num s = d->min_trcount; s < d->sindex; s++)
+        {
+          free (d->states[s].elems.elems);
+          free (d->states[s].mbps.elems);
+        }
+      d->sindex = d->min_trcount;
+
+      if (d->trans)
+        {
+          for (state_num s = 0; s < d->tralloc; s++)
+            {
+              free (d->trans[s]);
+              free (d->fails[s]);
+              d->trans[s] = d->fails[s] = NULL;
+            }
+          d->trcount = 0;
+        }
+
+      if (d->localeinfo.multibyte && d->mb_trans)
+        {
+          for (state_num s = -1; s < d->tralloc; s++)
+            {
+              free (d->mb_trans[s]);
+              d->mb_trans[s] = NULL;
+            }
+          for (state_num s = 0; s < d->min_trcount; s++)
+            d->states[s].mb_trindex = -1;
+          d->mb_trcount = 0;
+        }
+    }
+
+  if (!d->tralloc)
+    realloc_trans_if_necessary (d);
+
+  /* Current state.  */
+  state_num s = 0, s1 = 0;
+
+  /* Current input character.  */
+  unsigned char const *p = (unsigned char const *) begin;
+  unsigned char const *mbp = p;
+
+  /* Copy of d->trans so it can be optimized into a register.  */
+  state_num **trans = d->trans;
+  unsigned char eol = d->syntax.eolbyte;  /* Likewise for eolbyte.  */
+  unsigned char saved_end = *(unsigned char *) end;
+  *end = eol;
+
+  if (multibyte)
+    {
+      memset (&d->mbs, 0, sizeof d->mbs);
+      if (d->mb_follows.alloc == 0)
+        alloc_position_set (&d->mb_follows, d->nleaves);
+    }
+
+  size_t nlcount = 0;
+  for (;;)
+    {
+      state_num *t;
+      while ((t = trans[s]) != NULL)
+        {
+          if (s < d->min_trcount)
+            {
+              if (!multibyte || d->states[s].mbps.nelem == 0)
+                {
+                  while (t[*p] == s)
+                    p++;
+                }
+              if (multibyte)
+                p = mbp = skip_remains_mb (d, p, mbp, end);
+            }
+
+          if (multibyte)
+            {
+              s1 = s;
+
+              if (d->states[s].mbps.nelem == 0
+                  || d->localeinfo.sbctowc[*p] != WEOF || (char *) p >= end)
+                {
+                  /* If an input character does not match ANYCHAR, do it
+                     like a single-byte character.  */
+                  s = t[*p++];
+                }
+              else
+                {
+                  s = transit_state (d, s, &p, (unsigned char *) end);
+                  mbp = p;
+                  trans = d->trans;
+                }
+            }
+          else
+            {
+              s1 = t[*p++];
+              t = trans[s1];
+              if (! t)
+                {
+                  state_num tmp = s;
+                  s = s1;
+                  s1 = tmp;     /* swap */
+                  break;
+                }
+              if (s < d->min_trcount)
+                {
+                  while (t[*p] == s1)
+                    p++;
+                }
+              s = t[*p++];
+            }
+        }
+
+      if (s < 0)
+        {
+          if (s == -2)
+            {
+              s = build_state (s1, d, p[-1]);
+              trans = d->trans;
+            }
+          else if ((char *) p <= end && p[-1] == eol && 0 <= d->newlines[s1])
+            {
+              /* The previous character was a newline.  Count it, and skip
+                 checking of multibyte character boundary until here.  */
+              nlcount++;
+              mbp = p;
+
+              s = (allow_nl ? d->newlines[s1]
+                   : d->syntax.sbit[eol] == CTX_NEWLINE ? 0
+                   : d->syntax.sbit[eol] == CTX_LETTER ? d->min_trcount - 1
+                   : d->initstate_notbol);
+            }
+          else
+            {
+              p = NULL;
+              goto done;
+            }
+        }
+      else if (d->fails[s])
+        {
+          if ((d->success[s] & d->syntax.sbit[*p])
+              || ((char *) p == end
+                  && accepts_in_context (d->states[s].context, CTX_NEWLINE, s,
+                                         d)))
+            goto done;
+
+          if (multibyte && s < d->min_trcount)
+            p = mbp = skip_remains_mb (d, p, mbp, end);
+
+          s1 = s;
+          if (!multibyte || d->states[s].mbps.nelem == 0
+              || d->localeinfo.sbctowc[*p] != WEOF || (char *) p >= end)
+            {
+              /* If a input character does not match ANYCHAR, do it
+                 like a single-byte character.  */
+              s = d->fails[s][*p++];
+            }
+          else
+            {
+              s = transit_state (d, s, &p, (unsigned char *) end);
+              mbp = p;
+              trans = d->trans;
+            }
+        }
+      else
+        {
+          build_state (s, d, p[0]);
+          trans = d->trans;
+        }
+    }
+
+ done:
+  if (count)
+    *count += nlcount;
+  *end = saved_end;
+  return (char *) p;
+}
+
+/* Specialized versions of dfaexec for multibyte and single-byte cases.
+   This is for performance, as dfaexec_main is an inline function.  */
+
+static char *
+dfaexec_mb (struct dfa *d, char const *begin, char *end,
+            bool allow_nl, size_t *count, bool *backref)
+{
+  return dfaexec_main (d, begin, end, allow_nl, count, true);
+}
+
+static char *
+dfaexec_sb (struct dfa *d, char const *begin, char *end,
+            bool allow_nl, size_t *count, bool *backref)
+{
+  return dfaexec_main (d, begin, end, allow_nl, count, false);
+}
+
+/* Always set *BACKREF and return BEGIN.  Use this wrapper for
+   any regexp that uses a construct not supported by this code.  */
+static char *
+dfaexec_noop (struct dfa *d, char const *begin, char *end,
+              bool allow_nl, size_t *count, bool *backref)
+{
+  *backref = true;
+  return (char *) begin;
+}
+
+/* Like dfaexec_main (D, BEGIN, END, ALLOW_NL, COUNT, D->localeinfo.multibyte),
+   but faster and set *BACKREF if the DFA code does not support this
+   regexp usage.  */
+
+char *
+dfaexec (struct dfa *d, char const *begin, char *end,
+         bool allow_nl, size_t *count, bool *backref)
+{
+  return d->dfaexec (d, begin, end, allow_nl, count, backref);
+}
+
+struct dfa *
+dfasuperset (struct dfa const *d)
+{
+  return d->superset;
+}
+
+bool
+dfaisfast (struct dfa const *d)
+{
+  return d->fast;
+}
+
+static void
+free_mbdata (struct dfa *d)
+{
+  free (d->multibyte_prop);
+  free (d->lex.brack.chars);
+  free (d->mb_follows.elems);
+
+  if (d->mb_trans)
+    {
+      state_num s;
+      for (s = -1; s < d->tralloc; s++)
+        free (d->mb_trans[s]);
+      free (d->mb_trans - 2);
+    }
+}
+
+/* Return true if every construct in D is supported by this DFA matcher.  */
+static bool _GL_ATTRIBUTE_PURE
+dfa_supported (struct dfa const *d)
+{
+  for (size_t i = 0; i < d->tindex; i++)
+    {
+      switch (d->tokens[i])
+        {
+        case BEGWORD:
+        case ENDWORD:
+        case LIMWORD:
+        case NOTLIMWORD:
+          if (!d->localeinfo.multibyte)
+            continue;
+          FALLTHROUGH;
+        case BACKREF:
+        case MBCSET:
+          return false;
+        }
+    }
+  return true;
+}
+
+/* Disable use of the superset DFA if it is not likely to help
+   performance.  */
+static void
+maybe_disable_superset_dfa (struct dfa *d)
+{
+  if (!d->localeinfo.using_utf8)
+    return;
+
+  bool have_backref = false;
+  for (size_t i = 0; i < d->tindex; ++i)
+    {
+      switch (d->tokens[i])
+        {
+        case ANYCHAR:
+          /* Lowered.  */
+          abort ();
+        case BACKREF:
+          have_backref = true;
+          break;
+        case MBCSET:
+          /* Requires multi-byte algorithm.  */
+          return;
+        default:
+          break;
+        }
+    }
+
+  if (!have_backref && d->superset)
+    {
+      /* The superset DFA is not likely to be much faster, so remove it.  */
+      dfafree (d->superset);
+      free (d->superset);
+      d->superset = NULL;
+    }
+
+  free_mbdata (d);
+  d->localeinfo.multibyte = false;
+  d->dfaexec = dfaexec_sb;
+  d->fast = true;
+}
+
+static void
+dfassbuild (struct dfa *d)
+{
+  struct dfa *sup = dfaalloc ();
+
+  *sup = *d;
+  sup->localeinfo.multibyte = false;
+  sup->dfaexec = dfaexec_sb;
+  sup->multibyte_prop = NULL;
+  sup->superset = NULL;
+  sup->states = NULL;
+  sup->sindex = 0;
+  sup->constraints = NULL;
+  sup->separates = NULL;
+  sup->follows = NULL;
+  sup->tralloc = 0;
+  sup->trans = NULL;
+  sup->fails = NULL;
+  sup->success = NULL;
+  sup->newlines = NULL;
+
+  sup->charclasses = xnmalloc (sup->calloc, sizeof *sup->charclasses);
+  if (d->cindex)
+    {
+      memcpy (sup->charclasses, d->charclasses,
+              d->cindex * sizeof *sup->charclasses);
+    }
+
+  sup->tokens = xnmalloc (d->tindex, 2 * sizeof *sup->tokens);
+  sup->talloc = d->tindex * 2;
+
+  bool have_achar = false;
+  bool have_nchar = false;
+  size_t j;
+  for (size_t i = j = 0; i < d->tindex; i++)
+    {
+      switch (d->tokens[i])
+        {
+        case ANYCHAR:
+        case MBCSET:
+        case BACKREF:
+          {
+            charclass ccl;
+            fillset (&ccl);
+            sup->tokens[j++] = CSET + charclass_index (sup, &ccl);
+            sup->tokens[j++] = STAR;
+            if (d->tokens[i + 1] == QMARK || d->tokens[i + 1] == STAR
+                || d->tokens[i + 1] == PLUS)
+              i++;
+            have_achar = true;
+          }
+          break;
+        case BEGWORD:
+        case ENDWORD:
+        case LIMWORD:
+        case NOTLIMWORD:
+          if (d->localeinfo.multibyte)
+            {
+              /* These constraints aren't supported in a multibyte locale.
+                 Ignore them in the superset DFA.  */
+              sup->tokens[j++] = EMPTY;
+              break;
+            }
+          FALLTHROUGH;
+        default:
+          sup->tokens[j++] = d->tokens[i];
+          if ((0 <= d->tokens[i] && d->tokens[i] < NOTCHAR)
+              || d->tokens[i] >= CSET)
+            have_nchar = true;
+          break;
+        }
+    }
+  sup->tindex = j;
+
+  if (have_nchar && (have_achar || d->localeinfo.multibyte))
+    d->superset = sup;
+  else
+    {
+      dfafree (sup);
+      free (sup);
+    }
+}
+
+/* Parse and analyze a single string of the given length.  */
+void
+dfacomp (char const *s, size_t len, struct dfa *d, bool searchflag)
+{
+  dfaparse (s, len, d);
+  dfassbuild (d);
+
+  if (dfa_supported (d))
+    {
+      maybe_disable_superset_dfa (d);
+      dfaanalyze (d, searchflag);
+    }
+  else
+    {
+      d->dfaexec = dfaexec_noop;
+    }
+
+  if (d->superset)
+    {
+      d->fast = true;
+      dfaanalyze (d->superset, searchflag);
+    }
+}
+
+/* Free the storage held by the components of a dfa.  */
+void
+dfafree (struct dfa *d)
+{
+  free (d->charclasses);
+  free (d->tokens);
+
+  if (d->localeinfo.multibyte)
+    free_mbdata (d);
+
+  free (d->constraints);
+  free (d->separates);
+
+  for (size_t i = 0; i < d->sindex; ++i)
+    {
+      free (d->states[i].elems.elems);
+      free (d->states[i].mbps.elems);
+    }
+  free (d->states);
+
+  if (d->follows)
+    {
+      for (size_t i = 0; i < d->tindex; ++i)
+        free (d->follows[i].elems);
+      free (d->follows);
+    }
+
+  if (d->trans)
+    {
+      for (size_t i = 0; i < d->tralloc; ++i)
+        {
+          free (d->trans[i]);
+          free (d->fails[i]);
+        }
+
+      free (d->trans - 2);
+      free (d->fails);
+      free (d->newlines);
+      free (d->success);
+    }
+
+  if (d->superset)
+    {
+      dfafree (d->superset);
+      free (d->superset);
+    }
+}
+
+/* Having found the postfix representation of the regular expression,
+   try to find a long sequence of characters that must appear in any line
+   containing the r.e.
+   Finding a "longest" sequence is beyond the scope here;
+   we take an easy way out and hope for the best.
+   (Take "(ab|a)b"--please.)
+
+   We do a bottom-up calculation of sequences of characters that must appear
+   in matches of r.e.'s represented by trees rooted at the nodes of the postfix
+   representation:
+        sequences that must appear at the left of the match ("left")
+        sequences that must appear at the right of the match ("right")
+        lists of sequences that must appear somewhere in the match ("in")
+        sequences that must constitute the match ("is")
+
+   When we get to the root of the tree, we use one of the longest of its
+   calculated "in" sequences as our answer.
+
+   The sequences calculated for the various types of node (in pseudo ANSI c)
+   are shown below.  "p" is the operand of unary operators (and the left-hand
+   operand of binary operators); "q" is the right-hand operand of binary
+   operators.
+
+   "ZERO" means "a zero-length sequence" below.
+
+        Type	left		right		is		in
+        ----	----		-----		--		--
+        char c	# c		# c		# c		# c
+
+        ANYCHAR	ZERO		ZERO		ZERO		ZERO
+
+        MBCSET	ZERO		ZERO		ZERO		ZERO
+
+        CSET	ZERO		ZERO		ZERO		ZERO
+
+        STAR	ZERO		ZERO		ZERO		ZERO
+
+        QMARK	ZERO		ZERO		ZERO		ZERO
+
+        PLUS	p->left		p->right	ZERO		p->in
+
+        CAT	(p->is==ZERO)?	(q->is==ZERO)?	(p->is!=ZERO &&	p->in plus
+                p->left :	q->right :	q->is!=ZERO) ?	q->in plus
+                p->is##q->left	p->right##q->is	p->is##q->is : p->right##q->left
+                                                ZERO
+
+        OR	longest common	longest common	(do p->is and substrings common
+                leading		trailing	to q->is have same p->in and
+                (sub)sequence	(sub)sequence	q->in length and content) ?
+                of p->left	of p->right
+                and q->left	and q->right	p->is : NULL
+
+   If there's anything else we recognize in the tree, all four sequences get set
+   to zero-length sequences.  If there's something we don't recognize in the
+   tree, we just return a zero-length sequence.
+
+   Break ties in favor of infrequent letters (choosing 'zzz' in preference to
+   'aaa')?
+
+   And ... is it here or someplace that we might ponder "optimizations" such as
+        egrep 'psi|epsilon'	->	egrep 'psi'
+        egrep 'pepsi|epsilon'	->	egrep 'epsi'
+                                        (Yes, we now find "epsi" as a "string
+                                        that must occur", but we might also
+                                        simplify the *entire* r.e. being sought)
+        grep '[c]'		->	grep 'c'
+        grep '(ab|a)b'		->	grep 'ab'
+        grep 'ab*'		->	grep 'a'
+        grep 'a*b'		->	grep 'b'
+
+   There are several issues:
+
+   Is optimization easy (enough)?
+
+   Does optimization actually accomplish anything,
+   or is the automaton you get from "psi|epsilon" (for example)
+   the same as the one you get from "psi" (for example)?
+
+   Are optimizable r.e.'s likely to be used in real-life situations
+   (something like 'ab*' is probably unlikely; something like is
+   'psi|epsilon' is likelier)?  */
+
+static char *
+icatalloc (char *old, char const *new)
+{
+  size_t newsize = strlen (new);
+  if (newsize == 0)
+    return old;
+  size_t oldsize = strlen (old);
+  char *result = xrealloc (old, oldsize + newsize + 1);
+  memcpy (result + oldsize, new, newsize + 1);
+  return result;
+}
+
+static void
+freelist (char **cpp)
+{
+  while (*cpp)
+    free (*cpp++);
+}
+
+static char **
+enlist (char **cpp, char *new, size_t len)
+{
+  new = memcpy (xmalloc (len + 1), new, len);
+  new[len] = '\0';
+  /* Is there already something in the list that's new (or longer)?  */
+  size_t i;
+  for (i = 0; cpp[i] != NULL; ++i)
+    if (strstr (cpp[i], new) != NULL)
+      {
+        free (new);
+        return cpp;
+      }
+  /* Eliminate any obsoleted strings.  */
+  for (size_t j = 0; cpp[j] != NULL; )
+    if (strstr (new, cpp[j]) == NULL)
+      ++j;
+    else
+      {
+        free (cpp[j]);
+        if (--i == j)
+          break;
+        cpp[j] = cpp[i];
+        cpp[i] = NULL;
+      }
+  /* Add the new string.  */
+  cpp = xnrealloc (cpp, i + 2, sizeof *cpp);
+  cpp[i] = new;
+  cpp[i + 1] = NULL;
+  return cpp;
+}
+
+/* Given pointers to two strings, return a pointer to an allocated
+   list of their distinct common substrings.  */
+static char **
+comsubs (char *left, char const *right)
+{
+  char **cpp = xzalloc (sizeof *cpp);
+
+  for (char *lcp = left; *lcp != '\0'; lcp++)
+    {
+      size_t len = 0;
+      char *rcp = strchr (right, *lcp);
+      while (rcp != NULL)
+        {
+          size_t i;
+          for (i = 1; lcp[i] != '\0' && lcp[i] == rcp[i]; ++i)
+            continue;
+          if (i > len)
+            len = i;
+          rcp = strchr (rcp + 1, *lcp);
+        }
+      if (len != 0)
+        cpp = enlist (cpp, lcp, len);
+    }
+  return cpp;
+}
+
+static char **
+addlists (char **old, char **new)
+{
+  for (; *new; new++)
+    old = enlist (old, *new, strlen (*new));
+  return old;
+}
+
+/* Given two lists of substrings, return a new list giving substrings
+   common to both.  */
+static char **
+inboth (char **left, char **right)
+{
+  char **both = xzalloc (sizeof *both);
+
+  for (size_t lnum = 0; left[lnum] != NULL; ++lnum)
+    {
+      for (size_t rnum = 0; right[rnum] != NULL; ++rnum)
+        {
+          char **temp = comsubs (left[lnum], right[rnum]);
+          both = addlists (both, temp);
+          freelist (temp);
+          free (temp);
+        }
+    }
+  return both;
+}
+
+typedef struct must must;
+
+struct must
+{
+  char **in;
+  char *left;
+  char *right;
+  char *is;
+  bool begline;
+  bool endline;
+  must *prev;
+};
+
+static must *
+allocmust (must *mp, size_t size)
+{
+  must *new_mp = xmalloc (sizeof *new_mp);
+  new_mp->in = xzalloc (sizeof *new_mp->in);
+  new_mp->left = xzalloc (size);
+  new_mp->right = xzalloc (size);
+  new_mp->is = xzalloc (size);
+  new_mp->begline = false;
+  new_mp->endline = false;
+  new_mp->prev = mp;
+  return new_mp;
+}
+
+static void
+resetmust (must *mp)
+{
+  freelist (mp->in);
+  mp->in[0] = NULL;
+  mp->left[0] = mp->right[0] = mp->is[0] = '\0';
+  mp->begline = false;
+  mp->endline = false;
+}
+
+static void
+freemust (must *mp)
+{
+  freelist (mp->in);
+  free (mp->in);
+  free (mp->left);
+  free (mp->right);
+  free (mp->is);
+  free (mp);
+}
+
+struct dfamust *
+dfamust (struct dfa const *d)
+{
+  must *mp = NULL;
+  char const *result = "";
+  bool exact = false;
+  bool begline = false;
+  bool endline = false;
+  bool need_begline = false;
+  bool need_endline = false;
+  bool case_fold_unibyte = d->syntax.case_fold && MB_CUR_MAX == 1;
+
+  for (size_t ri = 1; ri + 1 < d->tindex; ri++)
+    {
+      token t = d->tokens[ri];
+      switch (t)
+        {
+        case BEGLINE:
+          mp = allocmust (mp, 2);
+          mp->begline = true;
+          need_begline = true;
+          break;
+        case ENDLINE:
+          mp = allocmust (mp, 2);
+          mp->endline = true;
+          need_endline = true;
+          break;
+        case LPAREN:
+        case RPAREN:
+          assert (!"neither LPAREN nor RPAREN may appear here");
+
+        case EMPTY:
+        case BEGWORD:
+        case ENDWORD:
+        case LIMWORD:
+        case NOTLIMWORD:
+        case BACKREF:
+        case ANYCHAR:
+        case MBCSET:
+          mp = allocmust (mp, 2);
+          break;
+
+        case STAR:
+        case QMARK:
+          resetmust (mp);
+          break;
+
+        case OR:
+          {
+            char **new;
+            must *rmp = mp;
+            must *lmp = mp = mp->prev;
+            size_t j, ln, rn, n;
+
+            /* Guaranteed to be.  Unlikely, but ...  */
+            if (streq (lmp->is, rmp->is))
+              {
+                lmp->begline &= rmp->begline;
+                lmp->endline &= rmp->endline;
+              }
+            else
+              {
+                lmp->is[0] = '\0';
+                lmp->begline = false;
+                lmp->endline = false;
+              }
+            /* Left side--easy */
+            size_t i = 0;
+            while (lmp->left[i] != '\0' && lmp->left[i] == rmp->left[i])
+              ++i;
+            lmp->left[i] = '\0';
+            /* Right side */
+            ln = strlen (lmp->right);
+            rn = strlen (rmp->right);
+            n = ln;
+            if (n > rn)
+              n = rn;
+            for (i = 0; i < n; ++i)
+              if (lmp->right[ln - i - 1] != rmp->right[rn - i - 1])
+                break;
+            for (j = 0; j < i; ++j)
+              lmp->right[j] = lmp->right[(ln - i) + j];
+            lmp->right[j] = '\0';
+            new = inboth (lmp->in, rmp->in);
+            freelist (lmp->in);
+            free (lmp->in);
+            lmp->in = new;
+            freemust (rmp);
+          }
+          break;
+
+        case PLUS:
+          mp->is[0] = '\0';
+          break;
+
+        case END:
+          assert (!mp->prev);
+          for (size_t i = 0; mp->in[i] != NULL; ++i)
+            if (strlen (mp->in[i]) > strlen (result))
+              result = mp->in[i];
+          if (streq (result, mp->is))
+            {
+              if ((!need_begline || mp->begline) && (!need_endline
+                                                     || mp->endline))
+                exact = true;
+              begline = mp->begline;
+              endline = mp->endline;
+            }
+          goto done;
+
+        case CAT:
+          {
+            must *rmp = mp;
+            must *lmp = mp = mp->prev;
+
+            /* In.  Everything in left, plus everything in
+               right, plus concatenation of
+               left's right and right's left.  */
+            lmp->in = addlists (lmp->in, rmp->in);
+            if (lmp->right[0] != '\0' && rmp->left[0] != '\0')
+              {
+                size_t lrlen = strlen (lmp->right);
+                size_t rllen = strlen (rmp->left);
+                char *tp = xmalloc (lrlen + rllen);
+                memcpy (tp, lmp->right, lrlen);
+                memcpy (tp + lrlen, rmp->left, rllen);
+                lmp->in = enlist (lmp->in, tp, lrlen + rllen);
+                free (tp);
+              }
+            /* Left-hand */
+            if (lmp->is[0] != '\0')
+              lmp->left = icatalloc (lmp->left, rmp->left);
+            /* Right-hand */
+            if (rmp->is[0] == '\0')
+              lmp->right[0] = '\0';
+            lmp->right = icatalloc (lmp->right, rmp->right);
+            /* Guaranteed to be */
+            if ((lmp->is[0] != '\0' || lmp->begline)
+                && (rmp->is[0] != '\0' || rmp->endline))
+              {
+                lmp->is = icatalloc (lmp->is, rmp->is);
+                lmp->endline = rmp->endline;
+              }
+            else
+              {
+                lmp->is[0] = '\0';
+                lmp->begline = false;
+                lmp->endline = false;
+              }
+            freemust (rmp);
+          }
+          break;
+
+        case '\0':
+          /* Not on *my* shift.  */
+          goto done;
+
+        default:
+          if (CSET <= t)
+            {
+              /* If T is a singleton, or if case-folding in a unibyte
+                 locale and T's members all case-fold to the same char,
+                 convert T to one of its members.  Otherwise, do
+                 nothing further with T.  */
+              charclass *ccl = &d->charclasses[t - CSET];
+              int j;
+              for (j = 0; j < NOTCHAR; j++)
+                if (tstbit (j, ccl))
+                  break;
+              if (! (j < NOTCHAR))
+                {
+                  mp = allocmust (mp, 2);
+                  break;
+                }
+              t = j;
+              while (++j < NOTCHAR)
+                if (tstbit (j, ccl)
+                    && ! (case_fold_unibyte
+                          && toupper (j) == toupper (t)))
+                  break;
+              if (j < NOTCHAR)
+                {
+                  mp = allocmust (mp, 2);
+                  break;
+                }
+            }
+
+          size_t rj = ri + 2;
+          if (d->tokens[ri + 1] == CAT)
+            {
+              for (; rj < d->tindex - 1; rj += 2)
+                {
+                  if ((rj != ri && (d->tokens[rj] <= 0
+                                    || NOTCHAR <= d->tokens[rj]))
+                      || d->tokens[rj + 1] != CAT)
+                    break;
+                }
+            }
+          mp = allocmust (mp, ((rj - ri) >> 1) + 1);
+          mp->is[0] = mp->left[0] = mp->right[0]
+            = case_fold_unibyte ? toupper (t) : t;
+
+          size_t i;
+          for (i = 1; ri + 2 < rj; i++)
+            {
+              ri += 2;
+              t = d->tokens[ri];
+              mp->is[i] = mp->left[i] = mp->right[i]
+                = case_fold_unibyte ? toupper (t) : t;
+            }
+          mp->is[i] = mp->left[i] = mp->right[i] = '\0';
+          mp->in = enlist (mp->in, mp->is, i);
+          break;
+        }
+    }
+ done:;
+
+  struct dfamust *dm = NULL;
+  if (*result)
+    {
+      dm = xmalloc (sizeof *dm);
+      dm->exact = exact;
+      dm->begline = begline;
+      dm->endline = endline;
+      dm->must = xstrdup (result);
+    }
+
+  while (mp)
+    {
+      must *prev = mp->prev;
+      freemust (mp);
+      mp = prev;
+    }
+
+  return dm;
+}
+
+void
+dfamustfree (struct dfamust *dm)
+{
+  free (dm->must);
+  free (dm);
+}
+
+struct dfa *
+dfaalloc (void)
+{
+  return xzalloc (sizeof (struct dfa));
+}
+
+/* Initialize DFA.  */
+void
+dfasyntax (struct dfa *dfa, struct localeinfo const *linfo,
+           reg_syntax_t bits, int dfaopts)
+{
+  memset (dfa, 0, offsetof (struct dfa, dfaexec));
+  dfa->dfaexec = linfo->multibyte ? dfaexec_mb : dfaexec_sb;
+  dfa->simple_locale = using_simple_locale (linfo->multibyte);
+  dfa->localeinfo = *linfo;
+
+  dfa->fast = !dfa->localeinfo.multibyte;
+
+  dfa->canychar = -1;
+  dfa->lex.cur_mb_len = 1;
+  dfa->syntax.syntax_bits_set = true;
+  dfa->syntax.case_fold = (bits & RE_ICASE) != 0;
+  dfa->syntax.anchor = (dfaopts & DFA_ANCHOR) != 0;
+  dfa->syntax.eolbyte = dfaopts & DFA_EOL_NUL ? '\0' : '\n';
+  dfa->syntax.syntax_bits = bits;
+
+  for (int i = CHAR_MIN; i <= CHAR_MAX; ++i)
+    {
+      unsigned char uc = i;
+
+      dfa->syntax.sbit[uc] = char_context (dfa, uc);
+      switch (dfa->syntax.sbit[uc])
+        {
+        case CTX_LETTER:
+          setbit (uc, &dfa->syntax.letters);
+          break;
+        case CTX_NEWLINE:
+          setbit (uc, &dfa->syntax.newline);
+          break;
+        }
+
+      /* POSIX requires that the five bytes in "\n\r./" (including the
+         terminating NUL) cannot occur inside a multibyte character.  */
+      dfa->syntax.never_trail[uc] = (dfa->localeinfo.using_utf8
+                                     ? (uc & 0xc0) != 0x80
+                                     : strchr ("\n\r./", uc) != NULL);
+    }
+}
+
+/* vim:set shiftwidth=2: */
diff --git a/gawk-5.0.1/support/dfa.h b/gawk-5.0.1/support/dfa.h
new file mode 100644
index 00000000000..2e25ef9f1ae
--- /dev/null
+++ b/gawk-5.0.1/support/dfa.h
@@ -0,0 +1,122 @@
+/* dfa.h - declarations for GNU deterministic regexp compiler
+   Copyright (C) 1988, 1998, 2007, 2009-2019 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc.,
+   51 Franklin Street - Fifth Floor, Boston, MA  02110-1301, USA */
+
+/* Written June, 1988 by Mike Haertel */
+
+#include <regex.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+struct localeinfo; /* See localeinfo.h.  */
+
+/* Element of a list of strings, at least one of which is known to
+   appear in any R.E. matching the DFA. */
+struct dfamust
+{
+  bool exact;
+  bool begline;
+  bool endline;
+  char *must;
+};
+
+/* The dfa structure. It is completely opaque. */
+struct dfa;
+
+/* Entry points. */
+
+/* Allocate a struct dfa.  The struct dfa is completely opaque.
+   The returned pointer should be passed directly to free() after
+   calling dfafree() on it. */
+extern struct dfa *dfaalloc (void) /* _GL_ATTRIBUTE_MALLOC */;
+
+/* DFA options that can be ORed together, for dfasyntax's 4th arg.  */
+enum
+  {
+    /* ^ and $ match only the start and end of data, and do not match
+       end-of-line within data.  This is always false for grep, but
+       possibly true for other apps.  */
+    DFA_ANCHOR = 1 << 0,
+
+    /* '\0' in data is end-of-line, instead of the traditional '\n'.  */
+    DFA_EOL_NUL = 1 << 1
+  };
+
+/* Initialize or reinitialize a DFA.  This must be called before
+   any of the routines below.  The arguments are:
+   1. The DFA to operate on.
+   2. Information about the current locale.
+   3. Syntax bits described in regex.h.
+   4. Additional DFA options described above.  */
+extern void dfasyntax (struct dfa *, struct localeinfo const *,
+                       reg_syntax_t, int);
+
+/* Build and return the struct dfamust from the given struct dfa. */
+extern struct dfamust *dfamust (struct dfa const *);
+
+/* Free the storage held by the components of a struct dfamust. */
+extern void dfamustfree (struct dfamust *);
+
+/* Compile the given string of the given length into the given struct dfa.
+   Final argument is a flag specifying whether to build a searching or an
+   exact matcher. */
+extern void dfacomp (char const *, size_t, struct dfa *, bool);
+
+/* Search through a buffer looking for a match to the given struct dfa.
+   Find the first occurrence of a string matching the regexp in the
+   buffer, and the shortest possible version thereof.  Return a pointer to
+   the first character after the match, or NULL if none is found.  BEGIN
+   points to the beginning of the buffer, and END points to the first byte
+   after its end.  Note however that we store a sentinel byte (usually
+   newline) in *END, so the actual buffer must be one byte longer.
+   When ALLOW_NL is true, newlines may appear in the matching string.
+   If COUNT is non-NULL, increment *COUNT once for each newline processed.
+   Finally, if BACKREF is non-NULL set *BACKREF to indicate whether we
+   encountered a back-reference.  The caller can use this to decide
+   whether to fall back on a backtracking matcher.  */
+extern char *dfaexec (struct dfa *d, char const *begin, char *end,
+                      bool allow_nl, size_t *count, bool *backref);
+
+/* Return a superset for D.  The superset matches everything that D
+   matches, along with some other strings (though the latter should be
+   rare, for efficiency reasons).  Return a null pointer if no useful
+   superset is available.  */
+extern struct dfa *dfasuperset (struct dfa const *d) _GL_ATTRIBUTE_PURE;
+
+/* The DFA is likely to be fast.  */
+extern bool dfaisfast (struct dfa const *) _GL_ATTRIBUTE_PURE;
+
+/* Copy the syntax settings from one dfa instance to another.
+   Saves considerable computation time if compiling many regular expressions
+   based on the same setting.  */
+extern void dfacopysyntax (struct dfa *to, const struct dfa *from);
+
+/* Free the storage held by the components of a struct dfa. */
+extern void dfafree (struct dfa *);
+
+/* Error handling. */
+
+/* dfawarn() is called by the regexp routines whenever a regex is compiled
+   that likely doesn't do what the user wanted.  It takes a single
+   argument, a NUL-terminated string describing the situation.  The user
+   must supply a dfawarn.  */
+extern void dfawarn (const char *);
+
+/* dfaerror() is called by the regexp routines whenever an error occurs.  It
+   takes a single argument, a NUL-terminated string describing the error.
+   The user must supply a dfaerror.  */
+extern _Noreturn void dfaerror (const char *);
diff --git a/gawk-5.0.1/support/getopt.c b/gawk-5.0.1/support/getopt.c
new file mode 100644
index 00000000000..eeb71ba9e26
--- /dev/null
+++ b/gawk-5.0.1/support/getopt.c
@@ -0,0 +1,1294 @@
+/* Getopt for GNU.
+   NOTE: getopt is part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to drepper@gnu.org
+   before changing it!
+   Copyright (C) 1987-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+   Ditto for AIX 3.2 and <stdlib.h>.  */
+#ifndef _NO_PROTO
+# define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>	/* For malloc and free */
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+# include <gnu-versions.h>
+# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#  define ELIDE_CODE
+# endif
+#endif
+
+/* !@#$%^&*() !!!!!!!! */
+#ifdef GAWK
+#undef ELIDE_CODE
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#if defined (__GNU_LIBRARY__) || defined (__CYGWIN__) || defined(__DJGPP__) || defined(__APPLE__) || defined(__MINGW32__) || defined(__sun) /* Illumos */
+/* Don't include stdlib.h for
+ * non-GNU C libraries
+ * non-Cygwin
+ * non-DJGPP
+ * non-MinGW
+ * because some of them contain conflicting prototypes for getopt.  */
+# include <stdlib.h>
+# include <unistd.h>
+#endif	/* GNU C library.  */
+
+#include <string.h>
+
+#ifdef VMS
+# include <unixlib.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#if defined _LIBC
+# include <wchar.h>
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+#include "getopt_int.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* 1003.2 says this must be 1 before any call.  */
+int optind = 1;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int optopt = '?';
+
+/* Keep a global copy of all internal members of getopt_data.  */
+
+static struct _getopt_data getopt_data;
+
+
+#ifndef __GNU_LIBRARY__
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+#ifndef getenv
+extern char *getenv ();
+#endif
+
+#endif /* not __GNU_LIBRARY__ */
+
+#ifdef _LIBC
+/* Stored original parameters.
+   XXX This is no good solution.  We should rather copy the args so
+   that we can compare them later.  But we must not use malloc(3).  */
+extern int __libc_argc;
+extern char **__libc_argv;
+
+/* Bash 2.0 gives us an environment variable containing flags
+   indicating ARGV elements that should not be considered arguments.  */
+
+# ifdef USE_NONOPTION_FLAGS
+/* Defined in getopt_init.c  */
+extern char *__getopt_nonoption_flags;
+# endif
+
+# ifdef USE_NONOPTION_FLAGS
+#  define SWAP_FLAGS(ch1, ch2) \
+  if (d->__nonoption_flags_len > 0)					      \
+    {									      \
+      char __tmp = __getopt_nonoption_flags[ch1];			      \
+      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];	      \
+      __getopt_nonoption_flags[ch2] = __tmp;				      \
+    }
+# else
+#  define SWAP_FLAGS(ch1, ch2)
+# endif
+#else	/* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif	/* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+static void
+exchange (char **argv, struct _getopt_data *d)
+{
+  int bottom = d->__first_nonopt;
+  int middle = d->__last_nonopt;
+  int top = d->optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+  /* First make sure the handling of the `__getopt_nonoption_flags'
+     string can work normally.  Our top argument must be in the range
+     of the string.  */
+  if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
+    {
+      /* We must extend the array.  The user plays games with us and
+	 presents new arguments.  */
+      char *new_str = malloc (top + 1);
+      if (new_str == NULL)
+	d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
+      else
+	{
+	  memset (__mempcpy (new_str, __getopt_nonoption_flags,
+			     d->__nonoption_flags_max_len),
+		  '\0', top + 1 - d->__nonoption_flags_max_len);
+	  d->__nonoption_flags_max_len = top + 1;
+	  __getopt_nonoption_flags = new_str;
+	}
+    }
+#endif
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+	{
+	  /* Bottom segment is the short one.  */
+	  int len = middle - bottom;
+	  int i;
+
+	  /* Swap it with the top part of the top segment.  */
+	  for (i = 0; i < len; i++)
+	    {
+	      tem = argv[bottom + i];
+	      argv[bottom + i] = argv[top - (middle - bottom) + i];
+	      argv[top - (middle - bottom) + i] = tem;
+	      SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+	    }
+	  /* Exclude the moved bottom segment from further swapping.  */
+	  top -= len;
+	}
+      else
+	{
+	  /* Top segment is the short one.  */
+	  int len = top - middle;
+	  int i;
+
+	  /* Swap it with the bottom part of the bottom segment.  */
+	  for (i = 0; i < len; i++)
+	    {
+	      tem = argv[bottom + i];
+	      argv[bottom + i] = argv[middle + i];
+	      argv[middle + i] = tem;
+	      SWAP_FLAGS (bottom + i, middle + i);
+	    }
+	  /* Exclude the moved top segment from further swapping.  */
+	  bottom += len;
+	}
+    }
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  d->__first_nonopt += (d->optind - d->__last_nonopt);
+  d->__last_nonopt = d->optind;
+}
+
+/* Initialize the internal data when the first call is made.  */
+
+static const char *
+_getopt_initialize (int argc, char *const *argv, const char *optstring,
+		    struct _getopt_data *d, int posixly_correct)
+{
+  /* Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  d->__first_nonopt = d->__last_nonopt = d->optind;
+
+  d->__nextchar = NULL;
+
+  d->__posixly_correct = posixly_correct | !!getenv ("POSIXLY_CORRECT");
+
+  /* Determine how to handle the ordering of options and nonoptions.  */
+
+  if (optstring[0] == '-')
+    {
+      d->__ordering = RETURN_IN_ORDER;
+      ++optstring;
+    }
+  else if (optstring[0] == '+')
+    {
+      d->__ordering = REQUIRE_ORDER;
+      ++optstring;
+    }
+  else if (d->__posixly_correct)
+    d->__ordering = REQUIRE_ORDER;
+  else
+    d->__ordering = PERMUTE;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+  if (!d->__posixly_correct
+      && argc == __libc_argc && argv == __libc_argv)
+    {
+      if (d->__nonoption_flags_max_len == 0)
+	{
+	  if (__getopt_nonoption_flags == NULL
+	      || __getopt_nonoption_flags[0] == '\0')
+	    d->__nonoption_flags_max_len = -1;
+	  else
+	    {
+	      const char *orig_str = __getopt_nonoption_flags;
+	      int len = d->__nonoption_flags_max_len = strlen (orig_str);
+	      if (d->__nonoption_flags_max_len < argc)
+		d->__nonoption_flags_max_len = argc;
+	      __getopt_nonoption_flags =
+		(char *) malloc (d->__nonoption_flags_max_len);
+	      if (__getopt_nonoption_flags == NULL)
+		d->__nonoption_flags_max_len = -1;
+	      else
+		memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+			'\0', d->__nonoption_flags_max_len - len);
+	    }
+	}
+      d->__nonoption_flags_len = d->__nonoption_flags_max_len;
+    }
+  else
+    d->__nonoption_flags_len = 0;
+#endif
+
+  return optstring;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns -1.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal_r (int argc, char *const *argv, const char *optstring,
+		    const struct option *longopts, int *longind,
+		    int long_only, struct _getopt_data *d, int posixly_correct)
+{
+  int print_errors = d->opterr;
+
+  if (argc < 1)
+    return -1;
+
+  d->optarg = NULL;
+
+  if (d->optind == 0 || !d->__initialized)
+    {
+      if (d->optind == 0)
+	d->optind = 1;	/* Don't scan ARGV[0], the program name.  */
+      optstring = _getopt_initialize (argc, argv, optstring, d,
+				      posixly_correct);
+      d->__initialized = 1;
+    }
+  else if (optstring[0] == '-' || optstring[0] == '+')
+    optstring++;
+  if (optstring[0] == ':')
+    print_errors = 0;
+
+  /* Test whether ARGV[optind] points to a non-option argument.
+     Either it does not have option syntax, or there is an environment flag
+     from the shell indicating it is not an option.  The later information
+     is only used when the used in the GNU libc.  */
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
+		      || (d->optind < d->__nonoption_flags_len		      \
+			  && __getopt_nonoption_flags[d->optind] == '1'))
+#else
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
+#endif
+
+  if (d->__nextchar == NULL || *d->__nextchar == '\0')
+    {
+      /* Advance to the next ARGV-element.  */
+
+      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+	 moved back by the user (who may also have changed the arguments).  */
+      if (d->__last_nonopt > d->optind)
+	d->__last_nonopt = d->optind;
+      if (d->__first_nonopt > d->optind)
+	d->__first_nonopt = d->optind;
+
+      if (d->__ordering == PERMUTE)
+	{
+	  /* If we have just processed some options following some non-options,
+	     exchange them so that the options come first.  */
+
+	  if (d->__first_nonopt != d->__last_nonopt
+	      && d->__last_nonopt != d->optind)
+	    exchange ((char **) argv, d);
+	  else if (d->__last_nonopt != d->optind)
+	    d->__first_nonopt = d->optind;
+
+	  /* Skip any additional non-options
+	     and extend the range of non-options previously skipped.  */
+
+	  while (d->optind < argc && NONOPTION_P)
+	    d->optind++;
+	  d->__last_nonopt = d->optind;
+	}
+
+      /* The special ARGV-element `--' means premature end of options.
+	 Skip it like a null option,
+	 then exchange with previous non-options as if it were an option,
+	 then skip everything else like a non-option.  */
+
+      if (d->optind != argc && !strcmp (argv[d->optind], "--"))
+	{
+	  d->optind++;
+
+	  if (d->__first_nonopt != d->__last_nonopt
+	      && d->__last_nonopt != d->optind)
+	    exchange ((char **) argv, d);
+	  else if (d->__first_nonopt == d->__last_nonopt)
+	    d->__first_nonopt = d->optind;
+	  d->__last_nonopt = argc;
+
+	  d->optind = argc;
+	}
+
+      /* If we have done all the ARGV-elements, stop the scan
+	 and back over any non-options that we skipped and permuted.  */
+
+      if (d->optind == argc)
+	{
+	  /* Set the next-arg-index to point at the non-options
+	     that we previously skipped, so the caller will digest them.  */
+	  if (d->__first_nonopt != d->__last_nonopt)
+	    d->optind = d->__first_nonopt;
+	  return -1;
+	}
+
+      /* If we have come to a non-option and did not permute it,
+	 either stop the scan or describe it to the caller and pass it by.  */
+
+      if (NONOPTION_P)
+	{
+	  if (d->__ordering == REQUIRE_ORDER)
+	    return -1;
+	  d->optarg = argv[d->optind++];
+	  return 1;
+	}
+
+      /* We have found another option-ARGV-element.
+	 Skip the initial punctuation.  */
+
+      d->__nextchar = (argv[d->optind] + 1
+		  + (longopts != NULL && argv[d->optind][1] == '-'));
+    }
+
+  /* Decode the current option-ARGV-element.  */
+
+  /* Check whether the ARGV-element is a long option.
+
+     If long_only and the ARGV-element has the form "-f", where f is
+     a valid short option, don't consider it an abbreviated form of
+     a long option that starts with f.  Otherwise there would be no
+     way to give the -f short option.
+
+     On the other hand, if there's a long option "fubar" and
+     the ARGV-element is "-fu", do consider that an abbreviation of
+     the long option, just like "--fu", and not "-f" with arg "u".
+
+     This distinction seems to be the most useful approach.  */
+
+  if (longopts != NULL
+      && (argv[d->optind][1] == '-'
+	  || (long_only && (argv[d->optind][2]
+			    || !strchr (optstring, argv[d->optind][1])))))
+    {
+      char *nameend;
+      unsigned int namelen;
+      const struct option *p;
+      const struct option *pfound = NULL;
+      struct option_list
+      {
+	const struct option *p;
+	struct option_list *next;
+	int needs_free;
+      } *ambig_list = NULL;
+      int exact = 0;
+      int indfound = -1;
+      int option_index;
+
+      for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
+	/* Do nothing.  */ ;
+      namelen = nameend - d->__nextchar;
+
+      /* Test all long options for either exact match
+	 or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name; p++, option_index++)
+	if (!strncmp (p->name, d->__nextchar, namelen))
+	  {
+	    if (namelen == (unsigned int) strlen (p->name))
+	      {
+		/* Exact match found.  */
+		pfound = p;
+		indfound = option_index;
+		exact = 1;
+		break;
+	      }
+	    else if (pfound == NULL)
+	      {
+		/* First nonexact match found.  */
+		pfound = p;
+		indfound = option_index;
+	      }
+	    else if (long_only
+		     || pfound->has_arg != p->has_arg
+		     || pfound->flag != p->flag
+		     || pfound->val != p->val)
+	      {
+		/* Second or later nonexact match found.  */
+		struct option_list *newp = malloc (sizeof (*newp));
+		newp->p = p;
+		newp->needs_free = 1;
+		newp->next = ambig_list;
+		ambig_list = newp;
+	      }
+	  }
+
+      if (ambig_list != NULL && !exact)
+	{
+	  if (print_errors)
+	    {
+	      struct option_list first;
+	      first.p = pfound;
+	      first.next = ambig_list;
+	      first.needs_free = 0;
+	      ambig_list = &first;
+
+#if defined _LIBC
+	      char *buf = NULL;
+	      size_t buflen = 0;
+
+	      FILE *fp = __open_memstream (&buf, &buflen);
+	      if (fp != NULL)
+		{
+		  fprintf (fp,
+			   _("%s: option '%s' is ambiguous; possibilities:"),
+			   argv[0], argv[d->optind]);
+
+		  do
+		    {
+		      fprintf (fp, " '--%s'", ambig_list->p->name);
+		      ambig_list = ambig_list->next;
+		    }
+		  while (ambig_list != NULL);
+
+		  fputc_unlocked ('\n', fp);
+
+		  if (__glibc_likely (fclose (fp) != EOF))
+		    {
+		      _IO_flockfile (stderr);
+
+		      int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+		      ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+		      __fxprintf (NULL, "%s", buf);
+
+		      ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+		      _IO_funlockfile (stderr);
+
+		      free (buf);
+		    }
+		}
+#else
+	      fprintf (stderr,
+		       _("%s: option '%s' is ambiguous; possibilities:"),
+		       argv[0], argv[d->optind]);
+	      do
+		{
+		  struct option_list *tmp_next;
+
+		  fprintf (stderr, " '--%s'", ambig_list->p->name);
+		  tmp_next = ambig_list->next;
+		  if (ambig_list->needs_free)
+		    free(ambig_list);
+		  ambig_list = tmp_next;
+		}
+	      while (ambig_list != NULL);
+
+	      fputc ('\n', stderr);
+#endif
+	    }
+	  d->__nextchar += strlen (d->__nextchar);
+	  d->optind++;
+	  d->optopt = 0;
+	  return '?';
+	}
+
+      if (pfound != NULL)
+	{
+	  option_index = indfound;
+	  d->optind++;
+	  if (*nameend)
+	    {
+	      /* Don't test has_arg with >, because some C compilers don't
+		 allow it to be used on enums.  */
+	      if (pfound->has_arg)
+		d->optarg = nameend + 1;
+	      else
+		{
+		  if (print_errors)
+		    {
+#if defined _LIBC
+		      char *buf;
+		      int n;
+#endif
+
+		      if (argv[d->optind - 1][1] == '-')
+			{
+			  /* --option */
+#if defined _LIBC
+			  n = __asprintf (&buf, _("\
+%s: option '--%s' doesn't allow an argument\n"),
+					  argv[0], pfound->name);
+#else
+			  fprintf (stderr, _("\
+%s: option '--%s' doesn't allow an argument\n"),
+				   argv[0], pfound->name);
+#endif
+			}
+		      else
+			{
+			  /* +option or -option */
+#if defined _LIBC
+			  n = __asprintf (&buf, _("\
+%s: option '%c%s' doesn't allow an argument\n"),
+					  argv[0], argv[d->optind - 1][0],
+					  pfound->name);
+#else
+			  fprintf (stderr, _("\
+%s: option '%c%s' doesn't allow an argument\n"),
+				   argv[0], argv[d->optind - 1][0],
+				   pfound->name);
+#endif
+			}
+
+#if defined _LIBC
+		      if (n >= 0)
+			{
+			  _IO_flockfile (stderr);
+
+			  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+			  ((_IO_FILE *) stderr)->_flags2
+			    |= _IO_FLAGS2_NOTCANCEL;
+
+			  __fxprintf (NULL, "%s", buf);
+
+			  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+			  _IO_funlockfile (stderr);
+
+			  free (buf);
+			}
+#endif
+		    }
+
+		  d->__nextchar += strlen (d->__nextchar);
+
+		  d->optopt = pfound->val;
+		  return '?';
+		}
+	    }
+	  else if (pfound->has_arg == 1)
+	    {
+	      if (d->optind < argc)
+		d->optarg = argv[d->optind++];
+	      else
+		{
+		  if (print_errors)
+		    {
+#if defined _LIBC
+		      char *buf;
+
+		      if (__asprintf (&buf, _("\
+%s: option '--%s' requires an argument\n"),
+				      argv[0], pfound->name) >= 0)
+			{
+			  _IO_flockfile (stderr);
+
+			  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+			  ((_IO_FILE *) stderr)->_flags2
+			    |= _IO_FLAGS2_NOTCANCEL;
+
+			  __fxprintf (NULL, "%s", buf);
+
+			  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+			  _IO_funlockfile (stderr);
+
+			  free (buf);
+			}
+#else
+		      fprintf (stderr,
+			       _("%s: option '--%s' requires an argument\n"),
+			       argv[0], pfound->name);
+#endif
+		    }
+		  d->__nextchar += strlen (d->__nextchar);
+		  d->optopt = pfound->val;
+		  return optstring[0] == ':' ? ':' : '?';
+		}
+	    }
+	  d->__nextchar += strlen (d->__nextchar);
+	  if (longind != NULL)
+	    *longind = option_index;
+	  if (pfound->flag)
+	    {
+	      *(pfound->flag) = pfound->val;
+	      return 0;
+	    }
+	  return pfound->val;
+	}
+
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+	 or the option starts with '--' or is not a valid short
+	 option, then it's an error.
+	 Otherwise interpret it as a short option.  */
+      if (!long_only || argv[d->optind][1] == '-'
+	  || strchr (optstring, *d->__nextchar) == NULL)
+	{
+	  if (print_errors)
+	    {
+#if defined _LIBC
+	      char *buf;
+	      int n;
+#endif
+
+	      if (argv[d->optind][1] == '-')
+		{
+		  /* --option */
+#if defined _LIBC
+		  n = __asprintf (&buf, _("%s: unrecognized option '--%s'\n"),
+				  argv[0], d->__nextchar);
+#else
+		  fprintf (stderr, _("%s: unrecognized option '--%s'\n"),
+			   argv[0], d->__nextchar);
+#endif
+		}
+	      else
+		{
+		  /* +option or -option */
+#if defined _LIBC
+		  n = __asprintf (&buf, _("%s: unrecognized option '%c%s'\n"),
+				  argv[0], argv[d->optind][0], d->__nextchar);
+#else
+		  fprintf (stderr, _("%s: unrecognized option '%c%s'\n"),
+			   argv[0], argv[d->optind][0], d->__nextchar);
+#endif
+		}
+
+#if defined _LIBC
+	      if (n >= 0)
+		{
+		  _IO_flockfile (stderr);
+
+		  int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+		  ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+		  __fxprintf (NULL, "%s", buf);
+
+		  ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+		  _IO_funlockfile (stderr);
+
+		  free (buf);
+		}
+#endif
+	    }
+	  d->__nextchar = (char *) "";
+	  d->optind++;
+	  d->optopt = 0;
+	  return '?';
+	}
+    }
+
+  /* Look at and handle the next short option-character.  */
+
+  {
+    char c = *d->__nextchar++;
+    char *temp = strchr (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*d->__nextchar == '\0')
+      ++d->optind;
+
+    if (temp == NULL || c == ':' || c == ';')
+      {
+	if (print_errors)
+	  {
+#if defined _LIBC
+	    char *buf;
+	    int n;
+#endif
+
+#if defined _LIBC
+	    n = __asprintf (&buf, _("%s: invalid option -- '%c'\n"),
+			    argv[0], c);
+#else
+	    fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
+#endif
+
+#if defined _LIBC
+	    if (n >= 0)
+	      {
+		_IO_flockfile (stderr);
+
+		int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+		((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+		__fxprintf (NULL, "%s", buf);
+
+		((_IO_FILE *) stderr)->_flags2 = old_flags2;
+		_IO_funlockfile (stderr);
+
+		free (buf);
+	      }
+#endif
+	  }
+	d->optopt = c;
+	return '?';
+      }
+    /* Convenience. Treat POSIX -W foo same as long option --foo */
+    if (temp[0] == 'W' && temp[1] == ';')
+      {
+	char *nameend;
+	const struct option *p;
+	const struct option *pfound = NULL;
+	int exact = 0;
+	int ambig = 0;
+	int indfound = 0;
+	int option_index;
+
+	if (longopts == NULL)
+	  goto no_longs;
+
+	/* This is an option that requires an argument.  */
+	if (*d->__nextchar != '\0')
+	  {
+	    d->optarg = d->__nextchar;
+	    /* If we end this ARGV-element by taking the rest as an arg,
+	       we must advance to the next element now.  */
+	    d->optind++;
+	  }
+	else if (d->optind == argc)
+	  {
+	    if (print_errors)
+	      {
+#if defined _LIBC
+		char *buf;
+
+		if (__asprintf (&buf,
+				_("%s: option requires an argument -- '%c'\n"),
+				argv[0], c) >= 0)
+		  {
+		    _IO_flockfile (stderr);
+
+		    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+		    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+		    __fxprintf (NULL, "%s", buf);
+
+		    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+		    _IO_funlockfile (stderr);
+
+		    free (buf);
+		  }
+#else
+		fprintf (stderr,
+			 _("%s: option requires an argument -- '%c'\n"),
+			 argv[0], c);
+#endif
+	      }
+	    d->optopt = c;
+	    if (optstring[0] == ':')
+	      c = ':';
+	    else
+	      c = '?';
+	    return c;
+	  }
+	else
+	  /* We already incremented `d->optind' once;
+	     increment it again when taking next ARGV-elt as argument.  */
+	  d->optarg = argv[d->optind++];
+
+	/* optarg is now the argument, see if it's in the
+	   table of longopts.  */
+
+	for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';
+	     nameend++)
+	  /* Do nothing.  */ ;
+
+	/* Test all long options for either exact match
+	   or abbreviated matches.  */
+	for (p = longopts, option_index = 0; p->name; p++, option_index++)
+	  if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+	    {
+	      if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name))
+		{
+		  /* Exact match found.  */
+		  pfound = p;
+		  indfound = option_index;
+		  exact = 1;
+		  break;
+		}
+	      else if (pfound == NULL)
+		{
+		  /* First nonexact match found.  */
+		  pfound = p;
+		  indfound = option_index;
+		}
+	      else if (long_only
+		       || pfound->has_arg != p->has_arg
+		       || pfound->flag != p->flag
+		       || pfound->val != p->val)
+		/* Second or later nonexact match found.  */
+		ambig = 1;
+	    }
+	if (ambig && !exact)
+	  {
+	    if (print_errors)
+	      {
+#if defined _LIBC
+		char *buf;
+
+		if (__asprintf (&buf, _("%s: option '-W %s' is ambiguous\n"),
+				argv[0], d->optarg) >= 0)
+		  {
+		    _IO_flockfile (stderr);
+
+		    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+		    ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+		    __fxprintf (NULL, "%s", buf);
+
+		    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+		    _IO_funlockfile (stderr);
+
+		    free (buf);
+		  }
+#else
+		fprintf (stderr, _("%s: option '-W %s' is ambiguous\n"),
+			 argv[0], d->optarg);
+#endif
+	      }
+	    d->__nextchar += strlen (d->__nextchar);
+	    d->optind++;
+	    return '?';
+	  }
+	if (pfound != NULL)
+	  {
+	    option_index = indfound;
+	    if (*nameend)
+	      {
+		/* Don't test has_arg with >, because some C compilers don't
+		   allow it to be used on enums.  */
+		if (pfound->has_arg)
+		  d->optarg = nameend + 1;
+		else
+		  {
+		    if (print_errors)
+		      {
+#if defined _LIBC
+			char *buf;
+
+			if (__asprintf (&buf, _("\
+%s: option '-W %s' doesn't allow an argument\n"),
+					argv[0], pfound->name) >= 0)
+			  {
+			    _IO_flockfile (stderr);
+
+			    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+			    ((_IO_FILE *) stderr)->_flags2
+			      |= _IO_FLAGS2_NOTCANCEL;
+
+			    __fxprintf (NULL, "%s", buf);
+
+			    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+			    _IO_funlockfile (stderr);
+
+			    free (buf);
+			  }
+#else
+			fprintf (stderr, _("\
+%s: option '-W %s' doesn't allow an argument\n"),
+				 argv[0], pfound->name);
+#endif
+		      }
+
+		    d->__nextchar += strlen (d->__nextchar);
+		    return '?';
+		  }
+	      }
+	    else if (pfound->has_arg == 1)
+	      {
+		if (d->optind < argc)
+		  d->optarg = argv[d->optind++];
+		else
+		  {
+		    if (print_errors)
+		      {
+#if defined _LIBC
+			char *buf;
+
+			if (__asprintf (&buf, _("\
+%s: option '-W %s' requires an argument\n"),
+					argv[0], pfound->name) >= 0)
+			  {
+			    _IO_flockfile (stderr);
+
+			    int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+			    ((_IO_FILE *) stderr)->_flags2
+			      |= _IO_FLAGS2_NOTCANCEL;
+
+			    __fxprintf (NULL, "%s", buf);
+
+			    ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+			    _IO_funlockfile (stderr);
+
+			    free (buf);
+			  }
+#else
+			fprintf (stderr, _("\
+%s: option '-W %s' requires an argument\n"),
+				 argv[0], pfound->name);
+#endif
+		      }
+		    d->__nextchar += strlen (d->__nextchar);
+		    return optstring[0] == ':' ? ':' : '?';
+		  }
+	      }
+	    else
+	      d->optarg = NULL;
+	    d->__nextchar += strlen (d->__nextchar);
+	    if (longind != NULL)
+	      *longind = option_index;
+	    if (pfound->flag)
+	      {
+		*(pfound->flag) = pfound->val;
+		return 0;
+	      }
+	    return pfound->val;
+	  }
+
+      no_longs:
+	d->__nextchar = NULL;
+	return 'W';	/* Let the application handle it.   */
+      }
+    if (temp[1] == ':')
+      {
+	if (temp[2] == ':')
+	  {
+	    /* This is an option that accepts an argument optionally.  */
+	    if (*d->__nextchar != '\0')
+	      {
+		d->optarg = d->__nextchar;
+		d->optind++;
+	      }
+	    else
+	      d->optarg = NULL;
+	    d->__nextchar = NULL;
+	  }
+	else
+	  {
+	    /* This is an option that requires an argument.  */
+	    if (*d->__nextchar != '\0')
+	      {
+		d->optarg = d->__nextchar;
+		/* If we end this ARGV-element by taking the rest as an arg,
+		   we must advance to the next element now.  */
+		d->optind++;
+	      }
+	    else if (d->optind == argc)
+	      {
+		if (print_errors)
+		  {
+#if defined _LIBC
+		    char *buf;
+
+		    if (__asprintf (&buf, _("\
+%s: option requires an argument -- '%c'\n"),
+				    argv[0], c) >= 0)
+		      {
+			_IO_flockfile (stderr);
+
+			int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+			((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+			__fxprintf (NULL, "%s", buf);
+
+			((_IO_FILE *) stderr)->_flags2 = old_flags2;
+			_IO_funlockfile (stderr);
+
+			free (buf);
+		      }
+#else
+		    fprintf (stderr,
+			     _("%s: option requires an argument -- '%c'\n"),
+			     argv[0], c);
+#endif
+		  }
+		d->optopt = c;
+		if (optstring[0] == ':')
+		  c = ':';
+		else
+		  c = '?';
+	      }
+	    else
+	      /* We already incremented `optind' once;
+		 increment it again when taking next ARGV-elt as argument.  */
+	      d->optarg = argv[d->optind++];
+	    d->__nextchar = NULL;
+	  }
+      }
+    return c;
+  }
+}
+
+int
+_getopt_internal (int argc, char *const *argv, const char *optstring,
+		  const struct option *longopts, int *longind, int long_only,
+		  int posixly_correct)
+{
+  int result;
+
+  getopt_data.optind = optind;
+  getopt_data.opterr = opterr;
+
+  result = _getopt_internal_r (argc, argv, optstring, longopts,
+			       longind, long_only, &getopt_data,
+			       posixly_correct);
+
+  optind = getopt_data.optind;
+  optarg = getopt_data.optarg;
+  optopt = getopt_data.optopt;
+
+  return result;
+}
+
+int
+getopt (int argc, char *const *argv, const char *optstring)
+{
+  return _getopt_internal (argc, argv, optstring,
+			   (const struct option *) 0,
+			   (int *) 0,
+			   0, 0);
+}
+
+#ifdef _LIBC
+int
+__posix_getopt (int argc, char *const *argv, const char *optstring)
+{
+  return _getopt_internal (argc, argv, optstring,
+			   (const struct option *) 0,
+			   (int *) 0,
+			   0, 1);
+}
+#endif
+
+#endif	/* Not ELIDE_CODE.  */
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (int argc, char **argv)
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == -1)
+	break;
+
+      switch (c)
+	{
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	  if (digit_optind != 0 && digit_optind != this_option_optind)
+	    printf ("digits occur in two different argv-elements.\n");
+	  digit_optind = this_option_optind;
+	  printf ("option %c\n", c);
+	  break;
+
+	case 'a':
+	  printf ("option a\n");
+	  break;
+
+	case 'b':
+	  printf ("option b\n");
+	  break;
+
+	case 'c':
+	  printf ("option c with value '%s'\n", optarg);
+	  break;
+
+	case '?':
+	  break;
+
+	default:
+	  printf ("?? getopt returned character code 0%o ??\n", c);
+	}
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+	printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/gawk-5.0.1/support/getopt.h b/gawk-5.0.1/support/getopt.h
new file mode 100644
index 00000000000..8393569d1d5
--- /dev/null
+++ b/gawk-5.0.1/support/getopt.h
@@ -0,0 +1,206 @@
+/* Declarations for getopt.
+   Copyright (C) 1989-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _GETOPT_H
+
+#ifndef __need_getopt
+# define _GETOPT_H 1
+#endif
+
+/* If __GNU_LIBRARY__ is not already defined, either we are being used
+   standalone, or this is the first header included in the source file.
+   If we are being used with glibc, we need to include <features.h>, but
+   that does not exist if we are standalone.  So: if __GNU_LIBRARY__ is
+   not defined, include <ctype.h>, which will pull in <features.h> for us
+   if it's from glibc.  (Why ctype.h?  It's guaranteed to exist and it
+   doesn't flood the namespace with stuff the way some other headers do.)  */
+#if !defined __GNU_LIBRARY__
+# include <ctype.h>
+#endif
+
+#ifndef __THROW
+# ifndef __GNUC_PREREQ
+#  define __GNUC_PREREQ(maj, min) (0)
+# endif
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+#  define __THROW	throw ()
+# else
+#  define __THROW
+# endif
+#endif
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#ifdef __KLIBC__
+/* OS/2 kLIBC has already getopt(). So to avoid name clash, rename
+   them here. */
+
+# define optarg		gawk_optarg
+# define optind		gawk_optind
+# define opterr		gawk_opterr
+# define optopt		gawk_optopt
+
+# define getopt				gawk_getopt
+# define getopt_long		gawk_getopt_long
+# define getopt_long_only	gawk_getopt_long_only
+#endif
+
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument		(or 0) if the option does not take an argument,
+   required_argument	(or 1) if the option requires an argument,
+   optional_argument 	(or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+  const char *name;
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+# define no_argument		0
+# define required_argument	1
+# define optional_argument	2
+#endif	/* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+   arguments in ARGV (ARGC of them, minus the program name) for
+   options given in OPTS.
+
+   Return the option character from OPTS just read.  Return -1 when
+   there are no more options.  For unrecognized options, or options
+   missing arguments, `optopt' is set to the option letter, and '?' is
+   returned.
+
+   The OPTS string is a list of characters which are recognized option
+   letters, optionally followed by colons, specifying that that letter
+   takes an argument, to be placed in `optarg'.
+
+   If a letter in OPTS is followed by two colons, its argument is
+   optional.  This behavior is specific to the GNU `getopt'.
+
+   The argument `--' causes premature termination of argument
+   scanning, explicitly telling `getopt' that there are no more
+   options.
+
+   If OPTS begins with `--', then non-option arguments are treated as
+   arguments to the option '\0'.  This behavior is specific to the GNU
+   `getopt'.  */
+
+#ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
+       __THROW;
+
+# if defined __need_getopt && defined __USE_POSIX2 \
+  && !defined __USE_POSIX_IMPLICITLY && !defined __USE_GNU
+/* The GNU getopt has more functionality than the standard version.  The
+   additional functionality can be disable at runtime.  This redirection
+   helps to also do this at runtime.  */
+#  ifdef __REDIRECT
+  extern int __REDIRECT_NTH (getopt, (int ___argc, char *const *___argv,
+				      const char *__shortopts),
+			     __posix_getopt);
+#  else
+extern int __posix_getopt (int ___argc, char *const *___argv,
+			   const char *__shortopts) __THROW;
+#   define getopt __posix_getopt
+#  endif
+# endif
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* __GNU_LIBRARY__ */
+
+#ifndef __need_getopt
+extern int getopt_long (int ___argc, char *const *___argv,
+			const char *__shortopts,
+		        const struct option *__longopts, int *__longind)
+       __THROW;
+extern int getopt_long_only (int ___argc, char *const *___argv,
+			     const char *__shortopts,
+		             const struct option *__longopts, int *__longind)
+       __THROW;
+
+#endif
+
+#ifdef	__cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations.  */
+#undef __need_getopt
+
+#endif /* getopt.h */
diff --git a/gawk-5.0.1/support/getopt1.c b/gawk-5.0.1/support/getopt1.c
new file mode 100644
index 00000000000..438fe52b455
--- /dev/null
+++ b/gawk-5.0.1/support/getopt1.c
@@ -0,0 +1,195 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+   Copyright (C) 1987-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef _LIBC
+# include <getopt.h>
+#else
+# include "getopt.h"
+#endif
+#include "getopt_int.h"
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+#include <gnu-versions.h>
+#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#define ELIDE_CODE
+#endif
+#endif
+
+/* !@#$%^&*() !!!!!!!! */
+#ifdef GAWK
+#undef ELIDE_CODE
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef	NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (int argc, char *const *argv, const char *options,
+	     const struct option *long_options, int *opt_index)
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0, 0);
+}
+
+int
+_getopt_long_r (int argc, char *const *argv, const char *options,
+		const struct option *long_options, int *opt_index,
+		struct _getopt_data *d)
+{
+  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+			     0, d, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (int argc, char *const *argv, const char *options,
+		  const struct option *long_options, int *opt_index)
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1, 0);
+}
+
+int
+_getopt_long_only_r (int argc, char *const *argv, const char *options,
+		     const struct option *long_options, int *opt_index,
+		     struct _getopt_data *d)
+{
+  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+			     1, d, 0);
+}
+
+#endif	/* Not ELIDE_CODE.  */
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+      int option_index = 0;
+      static struct option long_options[] =
+      {
+	{"add", 1, 0, 0},
+	{"append", 0, 0, 0},
+	{"delete", 1, 0, 0},
+	{"verbose", 0, 0, 0},
+	{"create", 0, 0, 0},
+	{"file", 1, 0, 0},
+	{0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "abc:d:0123456789",
+		       long_options, &option_index);
+      if (c == -1)
+	break;
+
+      switch (c)
+	{
+	case 0:
+	  printf ("option %s", long_options[option_index].name);
+	  if (optarg)
+	    printf (" with arg %s", optarg);
+	  printf ("\n");
+	  break;
+
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	  if (digit_optind != 0 && digit_optind != this_option_optind)
+	    printf ("digits occur in two different argv-elements.\n");
+	  digit_optind = this_option_optind;
+	  printf ("option %c\n", c);
+	  break;
+
+	case 'a':
+	  printf ("option a\n");
+	  break;
+
+	case 'b':
+	  printf ("option b\n");
+	  break;
+
+	case 'c':
+	  printf ("option c with value `%s'\n", optarg);
+	  break;
+
+	case 'd':
+	  printf ("option d with value `%s'\n", optarg);
+	  break;
+
+	case '?':
+	  break;
+
+	default:
+	  printf ("?? getopt returned character code 0%o ??\n", c);
+	}
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+	printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/gawk-5.0.1/support/getopt_int.h b/gawk-5.0.1/support/getopt_int.h
new file mode 100644
index 00000000000..514a1beba4c
--- /dev/null
+++ b/gawk-5.0.1/support/getopt_int.h
@@ -0,0 +1,129 @@
+/* Internal declarations for getopt.
+   Copyright (C) 1989-2016 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _GETOPT_INT_H
+#define _GETOPT_INT_H	1
+
+extern int _getopt_internal (int ___argc, char *const *___argv,
+			     const char *__shortopts,
+		             const struct option *__longopts, int *__longind,
+			     int __long_only, int posixly_correct);
+
+
+/* Reentrant versions which can handle parsing multiple argument
+   vectors at the same time.  */
+
+/* Data type for reentrant functions.  */
+struct _getopt_data
+{
+  /* These have exactly the same meaning as the corresponding global
+     variables, except that they are used for the reentrant
+     versions of getopt.  */
+  int optind;
+  int opterr;
+  int optopt;
+  char *optarg;
+
+  /* Internal members.  */
+
+  /* True if the internal members have been initialized.  */
+  int __initialized;
+
+  /* The next char to be scanned in the option-element
+     in which the last option character we returned was found.
+     This allows us to pick up the scan where we left off.
+
+     If this is zero, or a null string, it means resume the scan
+     by advancing to the next ARGV-element.  */
+  char *__nextchar;
+
+  /* Describe how to deal with options that follow non-option ARGV-elements.
+
+     If the caller did not specify anything,
+     the default is REQUIRE_ORDER if the environment variable
+     POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+     REQUIRE_ORDER means don't recognize them as options;
+     stop option processing when the first non-option is seen.
+     This is what Unix does.
+     This mode of operation is selected by either setting the environment
+     variable POSIXLY_CORRECT, or using `+' as the first character
+     of the list of option characters.
+
+     PERMUTE is the default.  We permute the contents of ARGV as we
+     scan, so that eventually all the non-options are at the end.
+     This allows options to be given in any order, even with programs
+     that were not written to expect this.
+
+     RETURN_IN_ORDER is an option available to programs that were
+     written to expect options and other ARGV-elements in any order
+     and that care about the ordering of the two.  We describe each
+     non-option ARGV-element as if it were the argument of an option
+     with character code 1.  Using `-' as the first character of the
+     list of option characters selects this mode of operation.
+
+     The special argument `--' forces an end of option-scanning regardless
+     of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+     `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
+
+  enum
+    {
+      REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+    } __ordering;
+
+  /* If the POSIXLY_CORRECT environment variable is set.  */
+  int __posixly_correct;
+
+
+  /* Handle permutation of arguments.  */
+
+  /* Describe the part of ARGV that contains non-options that have
+     been skipped.  `first_nonopt' is the index in ARGV of the first
+     of them; `last_nonopt' is the index after the last of them.  */
+
+  int __first_nonopt;
+  int __last_nonopt;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+  int __nonoption_flags_max_len;
+  int __nonoption_flags_len;
+# endif
+};
+
+/* The initializer is necessary to set OPTIND and OPTERR to their
+   default values and to clear the initialization flag.  */
+#define _GETOPT_DATA_INITIALIZER	{ 1, 1 }
+
+extern int _getopt_internal_r (int ___argc, char *const *___argv,
+			       const char *__shortopts,
+			       const struct option *__longopts, int *__longind,
+			       int __long_only, struct _getopt_data *__data,
+			       int posixly_correct);
+
+extern int _getopt_long_r (int ___argc, char *const *___argv,
+			   const char *__shortopts,
+			   const struct option *__longopts, int *__longind,
+			   struct _getopt_data *__data);
+
+extern int _getopt_long_only_r (int ___argc, char *const *___argv,
+				const char *__shortopts,
+				const struct option *__longopts,
+				int *__longind,
+				struct _getopt_data *__data);
+
+#endif /* getopt_int.h */
diff --git a/gawk-5.0.1/support/intprops.h b/gawk-5.0.1/support/intprops.h
new file mode 100644
index 00000000000..140f6d2a4be
--- /dev/null
+++ b/gawk-5.0.1/support/intprops.h
@@ -0,0 +1,455 @@
+/* intprops.h -- properties of integer types
+
+   Copyright (C) 2001-2019 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2.1 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert.  */
+
+#ifndef _GL_INTPROPS_H
+#define _GL_INTPROPS_H
+
+#include <limits.h>
+
+/* Return a value with the common real type of E and V and the value of V.
+   Do not evaluate E.  */
+#define _GL_INT_CONVERT(e, v) ((1 ? 0 : (e)) + (v))
+
+/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
+   <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00406.html>.  */
+#define _GL_INT_NEGATE_CONVERT(e, v) ((1 ? 0 : (e)) - (v))
+
+/* The extra casts in the following macros work around compiler bugs,
+   e.g., in Cray C 5.0.3.0.  */
+
+/* True if the arithmetic type T is an integer type.  bool counts as
+   an integer.  */
+#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
+
+/* True if the real type T is signed.  */
+#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
+
+/* Return 1 if the real expression E, after promotion, has a
+   signed or floating type.  Do not evaluate E.  */
+#define EXPR_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
+
+
+/* Minimum and maximum values for integer types and expressions.  */
+
+/* The width in bits of the integer type or expression T.
+   Do not evaluate T.
+   Padding bits are not supported; this is checked at compile-time below.  */
+#define TYPE_WIDTH(t) (sizeof (t) * CHAR_BIT)
+
+/* The maximum and minimum values for the integer type T.  */
+#define TYPE_MINIMUM(t) ((t) ~ TYPE_MAXIMUM (t))
+#define TYPE_MAXIMUM(t)                                                 \
+  ((t) (! TYPE_SIGNED (t)                                               \
+        ? (t) -1                                                        \
+        : ((((t) 1 << (TYPE_WIDTH (t) - 2)) - 1) * 2 + 1)))
+
+/* The maximum and minimum values for the type of the expression E,
+   after integer promotion.  E is not evaluated.  */
+#define _GL_INT_MINIMUM(e)                                              \
+  (EXPR_SIGNED (e)                                                      \
+   ? ~ _GL_SIGNED_INT_MAXIMUM (e)                                       \
+   : _GL_INT_CONVERT (e, 0))
+#define _GL_INT_MAXIMUM(e)                                              \
+  (EXPR_SIGNED (e)                                                      \
+   ? _GL_SIGNED_INT_MAXIMUM (e)                                         \
+   : _GL_INT_NEGATE_CONVERT (e, 1))
+#define _GL_SIGNED_INT_MAXIMUM(e)                                       \
+  (((_GL_INT_CONVERT (e, 1) << (TYPE_WIDTH ((e) + 0) - 2)) - 1) * 2 + 1)
+
+/* Work around OpenVMS incompatibility with C99.  */
+#if !defined LLONG_MAX && defined __INT64_MAX
+# define LLONG_MAX __INT64_MAX
+# define LLONG_MIN __INT64_MIN
+#endif
+
+/* This include file assumes that signed types are two's complement without
+   padding bits; the above macros have undefined behavior otherwise.
+   If this is a problem for you, please let us know how to fix it for your host.
+   This assumption is tested by the intprops-tests module.  */
+
+/* Does the __typeof__ keyword work?  This could be done by
+   'configure', but for now it's easier to do it by hand.  */
+#if (2 <= __GNUC__ \
+     || (1210 <= __IBMC__ && defined __IBM__TYPEOF__) \
+     || (0x5110 <= __SUNPRO_C && !__STDC__))
+# define _GL_HAVE___TYPEOF__ 1
+#else
+# define _GL_HAVE___TYPEOF__ 0
+#endif
+
+/* Return 1 if the integer type or expression T might be signed.  Return 0
+   if it is definitely unsigned.  This macro does not evaluate its argument,
+   and expands to an integer constant expression.  */
+#if _GL_HAVE___TYPEOF__
+# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t))
+#else
+# define _GL_SIGNED_TYPE_OR_EXPR(t) 1
+#endif
+
+/* Bound on length of the string representing an unsigned integer
+   value representable in B bits.  log10 (2.0) < 146/485.  The
+   smallest value of B where this bound is not tight is 2621.  */
+#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
+
+/* Bound on length of the string representing an integer type or expression T.
+   Subtract 1 for the sign bit if T is signed, and then add 1 more for
+   a minus sign if needed.
+
+   Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 0 when its argument is
+   signed, this macro may overestimate the true bound by one byte when
+   applied to unsigned types of size 2, 4, 16, ... bytes.  */
+#define INT_STRLEN_BOUND(t)                                     \
+  (INT_BITS_STRLEN_BOUND (TYPE_WIDTH (t) - _GL_SIGNED_TYPE_OR_EXPR (t)) \
+   + _GL_SIGNED_TYPE_OR_EXPR (t))
+
+/* Bound on buffer size needed to represent an integer type or expression T,
+   including the terminating null.  */
+#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
+
+
+/* Range overflow checks.
+
+   The INT_<op>_RANGE_OVERFLOW macros return 1 if the corresponding C
+   operators might not yield numerically correct answers due to
+   arithmetic overflow.  They do not rely on undefined or
+   implementation-defined behavior.  Their implementations are simple
+   and straightforward, but they are a bit harder to use than the
+   INT_<op>_OVERFLOW macros described below.
+
+   Example usage:
+
+     long int i = ...;
+     long int j = ...;
+     if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX))
+       printf ("multiply would overflow");
+     else
+       printf ("product is %ld", i * j);
+
+   Restrictions on *_RANGE_OVERFLOW macros:
+
+   These macros do not check for all possible numerical problems or
+   undefined or unspecified behavior: they do not check for division
+   by zero, for bad shift counts, or for shifting negative numbers.
+
+   These macros may evaluate their arguments zero or multiple times,
+   so the arguments should not have side effects.  The arithmetic
+   arguments (including the MIN and MAX arguments) must be of the same
+   integer type after the usual arithmetic conversions, and the type
+   must have minimum value MIN and maximum MAX.  Unsigned types should
+   use a zero MIN of the proper type.
+
+   These macros are tuned for constant MIN and MAX.  For commutative
+   operations such as A + B, they are also tuned for constant B.  */
+
+/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  */
+#define INT_ADD_RANGE_OVERFLOW(a, b, min, max)          \
+  ((b) < 0                                              \
+   ? (a) < (min) - (b)                                  \
+   : (max) - (b) < (a))
+
+/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  */
+#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max)     \
+  ((b) < 0                                              \
+   ? (max) + (b) < (a)                                  \
+   : (a) < (min) + (b))
+
+/* Return 1 if - A would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  */
+#define INT_NEGATE_RANGE_OVERFLOW(a, min, max)          \
+  ((min) < 0                                            \
+   ? (a) < - (max)                                      \
+   : 0 < (a))
+
+/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  Avoid && and || as they tickle
+   bugs in Sun C 5.11 2010/08/13 and other compilers; see
+   <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00401.html>.  */
+#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max)     \
+  ((b) < 0                                              \
+   ? ((a) < 0                                           \
+      ? (a) < (max) / (b)                               \
+      : (b) == -1                                       \
+      ? 0                                               \
+      : (min) / (b) < (a))                              \
+   : (b) == 0                                           \
+   ? 0                                                  \
+   : ((a) < 0                                           \
+      ? (a) < (min) / (b)                               \
+      : (max) / (b) < (a)))
+
+/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  Do not check for division by zero.  */
+#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max)       \
+  ((min) < 0 && (b) == -1 && (a) < - (max))
+
+/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  Do not check for division by zero.
+   Mathematically, % should never overflow, but on x86-like hosts
+   INT_MIN % -1 traps, and the C standard permits this, so treat this
+   as an overflow too.  */
+#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max)    \
+  INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max)
+
+/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic.
+   See above for restrictions.  Here, MIN and MAX are for A only, and B need
+   not be of the same type as the other arguments.  The C standard says that
+   behavior is undefined for shifts unless 0 <= B < wordwidth, and that when
+   A is negative then A << B has undefined behavior and A >> B has
+   implementation-defined behavior, but do not check these other
+   restrictions.  */
+#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max)   \
+  ((a) < 0                                              \
+   ? (a) < (min) >> (b)                                 \
+   : (max) >> (b) < (a))
+
+/* True if __builtin_add_overflow (A, B, P) works when P is non-null.  */
+#if 5 <= __GNUC__ && !defined __ICC
+# define _GL_HAS_BUILTIN_OVERFLOW 1
+#else
+# define _GL_HAS_BUILTIN_OVERFLOW 0
+#endif
+
+/* True if __builtin_add_overflow_p (A, B, C) works.  */
+#define _GL_HAS_BUILTIN_OVERFLOW_P (7 <= __GNUC__)
+
+/* The _GL*_OVERFLOW macros have the same restrictions as the
+   *_RANGE_OVERFLOW macros, except that they do not assume that operands
+   (e.g., A and B) have the same type as MIN and MAX.  Instead, they assume
+   that the result (e.g., A + B) has that type.  */
+#if _GL_HAS_BUILTIN_OVERFLOW_P
+# define _GL_ADD_OVERFLOW(a, b, min, max)                               \
+   __builtin_add_overflow_p (a, b, (__typeof__ ((a) + (b))) 0)
+# define _GL_SUBTRACT_OVERFLOW(a, b, min, max)                          \
+   __builtin_sub_overflow_p (a, b, (__typeof__ ((a) - (b))) 0)
+# define _GL_MULTIPLY_OVERFLOW(a, b, min, max)                          \
+   __builtin_mul_overflow_p (a, b, (__typeof__ ((a) * (b))) 0)
+#else
+# define _GL_ADD_OVERFLOW(a, b, min, max)                                \
+   ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max)                  \
+    : (a) < 0 ? (b) <= (a) + (b)                                         \
+    : (b) < 0 ? (a) <= (a) + (b)                                         \
+    : (a) + (b) < (b))
+# define _GL_SUBTRACT_OVERFLOW(a, b, min, max)                           \
+   ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max)             \
+    : (a) < 0 ? 1                                                        \
+    : (b) < 0 ? (a) - (b) <= (a)                                         \
+    : (a) < (b))
+# define _GL_MULTIPLY_OVERFLOW(a, b, min, max)                           \
+   (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a))))       \
+    || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
+#endif
+#define _GL_DIVIDE_OVERFLOW(a, b, min, max)                             \
+  ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \
+   : (a) < 0 ? (b) <= (a) + (b) - 1                                     \
+   : (b) < 0 && (a) + (b) <= (a))
+#define _GL_REMAINDER_OVERFLOW(a, b, min, max)                          \
+  ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \
+   : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b)                     \
+   : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max))
+
+/* Return a nonzero value if A is a mathematical multiple of B, where
+   A is unsigned, B is negative, and MAX is the maximum value of A's
+   type.  A's type must be the same as (A % B)'s type.  Normally (A %
+   -B == 0) suffices, but things get tricky if -B would overflow.  */
+#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max)                            \
+  (((b) < -_GL_SIGNED_INT_MAXIMUM (b)                                   \
+    ? (_GL_SIGNED_INT_MAXIMUM (b) == (max)                              \
+       ? (a)                                                            \
+       : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1))   \
+    : (a) % - (b))                                                      \
+   == 0)
+
+/* Check for integer overflow, and report low order bits of answer.
+
+   The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators
+   might not yield numerically correct answers due to arithmetic overflow.
+   The INT_<op>_WRAPV macros also store the low-order bits of the answer.
+   These macros work correctly on all known practical hosts, and do not rely
+   on undefined behavior due to signed arithmetic overflow.
+
+   Example usage, assuming A and B are long int:
+
+     if (INT_MULTIPLY_OVERFLOW (a, b))
+       printf ("result would overflow\n");
+     else
+       printf ("result is %ld (no overflow)\n", a * b);
+
+   Example usage with WRAPV flavor:
+
+     long int result;
+     bool overflow = INT_MULTIPLY_WRAPV (a, b, &result);
+     printf ("result is %ld (%s)\n", result,
+             overflow ? "after overflow" : "no overflow");
+
+   Restrictions on these macros:
+
+   These macros do not check for all possible numerical problems or
+   undefined or unspecified behavior: they do not check for division
+   by zero, for bad shift counts, or for shifting negative numbers.
+
+   These macros may evaluate their arguments zero or multiple times, so the
+   arguments should not have side effects.
+
+   The WRAPV macros are not constant expressions.  They support only
+   +, binary -, and *.  The result type must be signed.
+
+   These macros are tuned for their last argument being a constant.
+
+   Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,
+   A % B, and A << B would overflow, respectively.  */
+
+#define INT_ADD_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)
+#define INT_SUBTRACT_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)
+#if _GL_HAS_BUILTIN_OVERFLOW_P
+# define INT_NEGATE_OVERFLOW(a) INT_SUBTRACT_OVERFLOW (0, a)
+#else
+# define INT_NEGATE_OVERFLOW(a) \
+   INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
+#endif
+#define INT_MULTIPLY_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)
+#define INT_DIVIDE_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW)
+#define INT_REMAINDER_OVERFLOW(a, b) \
+  _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW)
+#define INT_LEFT_SHIFT_OVERFLOW(a, b) \
+  INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \
+                                 _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
+
+/* Return 1 if the expression A <op> B would overflow,
+   where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test,
+   assuming MIN and MAX are the minimum and maximum for the result type.
+   Arguments should be free of side effects.  */
+#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow)        \
+  op_result_overflow (a, b,                                     \
+                      _GL_INT_MINIMUM (_GL_INT_CONVERT (a, b)), \
+                      _GL_INT_MAXIMUM (_GL_INT_CONVERT (a, b)))
+
+/* Store the low-order bits of A + B, A - B, A * B, respectively, into *R.
+   Return 1 if the result overflows.  See above for restrictions.  */
+#define INT_ADD_WRAPV(a, b, r) \
+  _GL_INT_OP_WRAPV (a, b, r, +, __builtin_add_overflow, INT_ADD_OVERFLOW)
+#define INT_SUBTRACT_WRAPV(a, b, r) \
+  _GL_INT_OP_WRAPV (a, b, r, -, __builtin_sub_overflow, INT_SUBTRACT_OVERFLOW)
+#define INT_MULTIPLY_WRAPV(a, b, r) \
+  _GL_INT_OP_WRAPV (a, b, r, *, __builtin_mul_overflow, INT_MULTIPLY_OVERFLOW)
+
+/* Nonzero if this compiler has GCC bug 68193 or Clang bug 25390.  See:
+   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68193
+   https://llvm.org/bugs/show_bug.cgi?id=25390
+   For now, assume all versions of GCC-like compilers generate bogus
+   warnings for _Generic.  This matters only for older compilers that
+   lack __builtin_add_overflow.  */
+#if __GNUC__
+# define _GL__GENERIC_BOGUS 1
+#else
+# define _GL__GENERIC_BOGUS 0
+#endif
+
+/* Store the low-order bits of A <op> B into *R, where OP specifies
+   the operation.  BUILTIN is the builtin operation, and OVERFLOW the
+   overflow predicate.  Return 1 if the result overflows.  See above
+   for restrictions.  */
+#if _GL_HAS_BUILTIN_OVERFLOW
+# define _GL_INT_OP_WRAPV(a, b, r, op, builtin, overflow) builtin (a, b, r)
+#elif 201112 <= __STDC_VERSION__ && !_GL__GENERIC_BOGUS
+# define _GL_INT_OP_WRAPV(a, b, r, op, builtin, overflow) \
+   (_Generic \
+    (*(r), \
+     signed char: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                        signed char, SCHAR_MIN, SCHAR_MAX), \
+     short int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                        short int, SHRT_MIN, SHRT_MAX), \
+     int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                        int, INT_MIN, INT_MAX), \
+     long int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+                        long int, LONG_MIN, LONG_MAX), \
+     long long int: \
+       _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+                        long long int, LLONG_MIN, LLONG_MAX)))
+#else
+# define _GL_INT_OP_WRAPV(a, b, r, op, builtin, overflow) \
+   (sizeof *(r) == sizeof (signed char) \
+    ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                       signed char, SCHAR_MIN, SCHAR_MAX) \
+    : sizeof *(r) == sizeof (short int) \
+    ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                       short int, SHRT_MIN, SHRT_MAX) \
+    : sizeof *(r) == sizeof (int) \
+    ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned int, \
+                       int, INT_MIN, INT_MAX) \
+    : _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow))
+# ifdef LLONG_MAX
+#  define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
+    (sizeof *(r) == sizeof (long int) \
+     ? _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+                        long int, LONG_MIN, LONG_MAX) \
+     : _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long long int, \
+                        long long int, LLONG_MIN, LLONG_MAX))
+# else
+#  define _GL_INT_OP_WRAPV_LONGISH(a, b, r, op, overflow) \
+    _GL_INT_OP_CALC (a, b, r, op, overflow, unsigned long int, \
+                     long int, LONG_MIN, LONG_MAX)
+# endif
+#endif
+
+/* Store the low-order bits of A <op> B into *R, where the operation
+   is given by OP.  Use the unsigned type UT for calculation to avoid
+   overflow problems.  *R's type is T, with extrema TMIN and TMAX.
+   T must be a signed integer type.  Return 1 if the result overflows.  */
+#define _GL_INT_OP_CALC(a, b, r, op, overflow, ut, t, tmin, tmax) \
+  (sizeof ((a) op (b)) < sizeof (t) \
+   ? _GL_INT_OP_CALC1 ((t) (a), (t) (b), r, op, overflow, ut, t, tmin, tmax) \
+   : _GL_INT_OP_CALC1 (a, b, r, op, overflow, ut, t, tmin, tmax))
+#define _GL_INT_OP_CALC1(a, b, r, op, overflow, ut, t, tmin, tmax) \
+  ((overflow (a, b) \
+    || (EXPR_SIGNED ((a) op (b)) && ((a) op (b)) < (tmin)) \
+    || (tmax) < ((a) op (b))) \
+   ? (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 1) \
+   : (*(r) = _GL_INT_OP_WRAPV_VIA_UNSIGNED (a, b, op, ut, t), 0))
+
+/* Return the low-order bits of A <op> B, where the operation is given
+   by OP.  Use the unsigned type UT for calculation to avoid undefined
+   behavior on signed integer overflow, and convert the result to type T.
+   UT is at least as wide as T and is no narrower than unsigned int,
+   T is two's complement, and there is no padding or trap representations.
+   Assume that converting UT to T yields the low-order bits, as is
+   done in all known two's-complement C compilers.  E.g., see:
+   https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
+
+   According to the C standard, converting UT to T yields an
+   implementation-defined result or signal for values outside T's
+   range.  However, code that works around this theoretical problem
+   runs afoul of a compiler bug in Oracle Studio 12.3 x86.  See:
+   https://lists.gnu.org/r/bug-gnulib/2017-04/msg00049.html
+   As the compiler bug is real, don't try to work around the
+   theoretical problem.  */
+
+#define _GL_INT_OP_WRAPV_VIA_UNSIGNED(a, b, op, ut, t) \
+  ((t) ((ut) (a) op (ut) (b)))
+
+#endif /* _GL_INTPROPS_H */
diff --git a/gawk-5.0.1/support/libc-config.h b/gawk-5.0.1/support/libc-config.h
new file mode 100644
index 00000000000..f24fbfa6af0
--- /dev/null
+++ b/gawk-5.0.1/support/libc-config.h
@@ -0,0 +1,174 @@
+/* System definitions for code taken from the GNU C Library
+
+   Copyright 2017-2019 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this program; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert.  */
+
+/* This is intended to be a good-enough substitute for glibc system
+   macros like those defined in <sys/cdefs.h>, so that Gnulib code
+   shared with glibc can do this as the first #include:
+
+     #ifndef _LIBC
+     # include <libc-config.h>
+     #endif
+
+   When compiled as part of glibc this is a no-op; when compiled as
+   part of Gnulib this includes Gnulib's <config.h> and defines macros
+   that glibc library code would normally assume.  */
+
+#include <config.h>
+
+/* On glibc this includes <features.h> and <sys/cdefs.h> and #defines
+   _FEATURES_H, __WORDSIZE, and __set_errno.  On FreeBSD 11 it
+   includes <sys/cdefs.h> which defines __nonnull.  Elsewhere it
+   is harmless.  */
+#include <errno.h>
+
+/* From glibc <errno.h>.  */
+#ifndef __set_errno
+# define __set_errno(val) (errno = (val))
+#endif
+
+/* From glibc <features.h>.  */
+
+#ifndef __GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+#  define __GNUC_PREREQ(maj, min) ((maj) < __GNUC__ + ((min) <= __GNUC_MINOR__))
+# else
+#  define __GNUC_PREREQ(maj, min) 0
+# endif
+#endif
+
+#ifndef __glibc_clang_prereq
+# if defined __clang_major__ && defined __clang_minor__
+#  define __glibc_clang_prereq(maj, min) \
+     ((maj) < __clang_major__ + ((min) <= __clang_minor__))
+# else
+#  define __glibc_clang_prereq(maj, min) 0
+# endif
+#endif
+
+
+/* Prepare to include <cdefs.h>, which is our copy of glibc
+   <sys/cdefs.h>.  */
+
+/* Define _FEATURES_H so that <cdefs.h> does not include <features.h>.  */
+#ifndef _FEATURES_H
+# define _FEATURES_H 1
+#endif
+/* Define __WORDSIZE so that <cdefs.h> does not attempt to include
+   nonexistent files.  Make it a syntax error, since Gnulib does not
+   use __WORDSIZE now, and if Gnulib uses it later the syntax error
+   will let us know that __WORDSIZE needs configuring.  */
+#ifndef __WORDSIZE
+# define __WORDSIZE %%%
+#endif
+/* Undef the macros unconditionally defined by our copy of glibc
+   <sys/cdefs.h>, so that they do not clash with any system-defined
+   versions.  */
+#undef _SYS_CDEFS_H
+#undef __ASMNAME
+#undef __ASMNAME2
+#undef __BEGIN_DECLS
+#undef __CONCAT
+#undef __END_DECLS
+#undef __HAVE_GENERIC_SELECTION
+#undef __LDBL_COMPAT
+#undef __LDBL_REDIR
+#undef __LDBL_REDIR1
+#undef __LDBL_REDIR1_DECL
+#undef __LDBL_REDIR1_NTH
+#undef __LDBL_REDIR_DECL
+#undef __LDBL_REDIR_NTH
+#undef __LEAF
+#undef __LEAF_ATTR
+#undef __NTH
+#undef __NTHNL
+#undef __P
+#undef __PMT
+#undef __REDIRECT
+#undef __REDIRECT_LDBL
+#undef __REDIRECT_NTH
+#undef __REDIRECT_NTHNL
+#undef __REDIRECT_NTH_LDBL
+#undef __STRING
+#undef __THROW
+#undef __THROWNL
+#undef __always_inline
+#undef __attribute__
+#undef __attribute_alloc_size__
+#undef __attribute_artificial__
+#undef __attribute_const__
+#undef __attribute_deprecated__
+#undef __attribute_deprecated_msg__
+#undef __attribute_format_arg__
+#undef __attribute_format_strfmon__
+#undef __attribute_malloc__
+#undef __attribute_noinline__
+#undef __attribute_nonstring__
+#undef __attribute_pure__
+#undef __attribute_used__
+#undef __attribute_warn_unused_result__
+#undef __bos
+#undef __bos0
+#undef __errordecl
+#undef __extension__
+#undef __extern_always_inline
+#undef __extern_inline
+#undef __flexarr
+#undef __fortify_function
+#undef __glibc_c99_flexarr_available
+#undef __glibc_clang_has_extension
+#undef __glibc_likely
+#undef __glibc_macro_warning
+#undef __glibc_macro_warning1
+#undef __glibc_unlikely
+#undef __inline
+#undef __ptr_t
+#undef __restrict
+#undef __restrict_arr
+#undef __va_arg_pack
+#undef __va_arg_pack_len
+#undef __warnattr
+#undef __warndecl
+
+/* Include our copy of glibc <sys/cdefs.h>.  */
+#include <cdefs.h>
+
+/* <cdefs.h> __inline is too pessimistic for non-GCC.  */
+#undef __inline
+#ifndef HAVE___INLINE
+# if 199901 <= __STDC_VERSION__ || defined inline
+#  define __inline inline
+# else
+#  define __inline
+# endif
+#endif
+
+
+/* A substitute for glibc <libc-symbols.h>, good enough for Gnulib.  */
+#define attribute_hidden
+#define libc_hidden_proto(name, ...)
+#define libc_hidden_def(name)
+#define libc_hidden_weak(name)
+#define libc_hidden_ver(local, name)
+#define strong_alias(name, aliasname)
+#define weak_alias(name, aliasname)
+
+/* A substitute for glibc <shlib-compat.h>, good enough for Gnulib.  */
+#define SHLIB_COMPAT(lib, introduced, obsoleted) 0
+#define versioned_symbol(lib, local, symbol, version)
diff --git a/gawk-5.0.1/support/localeinfo.c b/gawk-5.0.1/support/localeinfo.c
new file mode 100644
index 00000000000..5c38849e819
--- /dev/null
+++ b/gawk-5.0.1/support/localeinfo.c
@@ -0,0 +1,117 @@
+/* locale information
+
+   Copyright 2016-2019 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
+
+/* Written by Paul Eggert.  */
+
+#include <config.h>
+
+#include <localeinfo.h>
+
+#include <verify.h>
+
+#include <limits.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wctype.h>
+
+#if defined(__DJGPP__)
+#include "mbsupport.h"
+#endif
+
+/* The sbclen implementation relies on this.  */
+verify (MB_LEN_MAX <= SCHAR_MAX);
+
+/* Return true if the locale uses UTF-8.  */
+
+static bool
+is_using_utf8 (void)
+{
+  wchar_t wc;
+  mbstate_t mbs = {0};
+  return mbrtowc (&wc, "\xc4\x80", 2, &mbs) == 2 && wc == 0x100;
+}
+
+/* Initialize *LOCALEINFO from the current locale.  */
+
+void
+init_localeinfo (struct localeinfo *localeinfo)
+{
+  int i;
+
+  localeinfo->multibyte = MB_CUR_MAX > 1;
+  localeinfo->using_utf8 = is_using_utf8 ();
+
+  for (i = CHAR_MIN; i <= CHAR_MAX; i++)
+    {
+      char c = i;
+      unsigned char uc = i;
+      mbstate_t s = {0};
+      wchar_t wc;
+      size_t len = mbrtowc (&wc, &c, 1, &s);
+      localeinfo->sbclen[uc] = len <= 1 ? 1 : - (int) - len;
+      localeinfo->sbctowc[uc] = len <= 1 ? wc : WEOF;
+    }
+}
+
+/* The set of wchar_t values C such that there's a useful locale
+   somewhere where C != towupper (C) && C != towlower (towupper (C)).
+   For example, 0x00B5 (U+00B5 MICRO SIGN) is in this table, because
+   towupper (0x00B5) == 0x039C (U+039C GREEK CAPITAL LETTER MU), and
+   towlower (0x039C) == 0x03BC (U+03BC GREEK SMALL LETTER MU).  */
+static short const lonesome_lower[] =
+  {
+    0x00B5, 0x0131, 0x017F, 0x01C5, 0x01C8, 0x01CB, 0x01F2, 0x0345,
+    0x03C2, 0x03D0, 0x03D1, 0x03D5, 0x03D6, 0x03F0, 0x03F1,
+
+    /* U+03F2 GREEK LUNATE SIGMA SYMBOL lacks a specific uppercase
+       counterpart in locales predating Unicode 4.0.0 (April 2003).  */
+    0x03F2,
+
+    0x03F5, 0x1E9B, 0x1FBE,
+  };
+
+/* Verify that the worst case fits.  This is 1 for towupper, 1 for
+   towlower, and 1 for each entry in LONESOME_LOWER.  */
+verify (1 + 1 + sizeof lonesome_lower / sizeof *lonesome_lower
+        <= CASE_FOLDED_BUFSIZE);
+
+/* Find the characters equal to C after case-folding, other than C
+   itself, and store them into FOLDED.  Return the number of characters
+   stored; this is zero if C is WEOF.  */
+
+int
+case_folded_counterparts (wint_t c, wchar_t folded[CASE_FOLDED_BUFSIZE])
+{
+  int i;
+  int n = 0;
+  wint_t uc = towupper (c);
+  wint_t lc = towlower (uc);
+  if (uc != c)
+    folded[n++] = uc;
+  if (lc != uc && lc != c && towupper (lc) == uc)
+    folded[n++] = lc;
+  for (i = 0; i < sizeof lonesome_lower / sizeof *lonesome_lower; i++)
+    {
+      wint_t li = lonesome_lower[i];
+      if (li != lc && li != uc && li != c && towupper (li) == uc)
+        folded[n++] = li;
+    }
+  return n;
+}
diff --git a/gawk-5.0.1/support/localeinfo.h b/gawk-5.0.1/support/localeinfo.h
new file mode 100644
index 00000000000..a5140164fde
--- /dev/null
+++ b/gawk-5.0.1/support/localeinfo.h
@@ -0,0 +1,54 @@
+/* locale information
+
+   Copyright 2016-2019 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
+
+/* Written by Paul Eggert.  */
+
+#include <limits.h>
+#include <stdbool.h>
+#include <wchar.h>
+
+struct localeinfo
+{
+  /* MB_CUR_MAX > 1.  */
+  bool multibyte;
+
+  /* The locale uses UTF-8.  */
+  bool using_utf8;
+
+  /* An array indexed by byte values B that contains 1 if B is a
+     single-byte character, -1 if B is an encoding error, and -2 if B
+     is the leading byte of a multibyte character that contains more
+     than one byte.  */
+  signed char sbclen[UCHAR_MAX + 1];
+
+  /* An array indexed by byte values B that contains the corresponding
+     wide character (if any) for B if sbclen[B] == 1.  WEOF means the
+     byte is not a valid single-byte character, i.e., sbclen[B] == -1
+     or -2.  */
+  wint_t sbctowc[UCHAR_MAX + 1];
+};
+
+extern void init_localeinfo (struct localeinfo *);
+
+/* Maximum number of characters that can be the case-folded
+   counterparts of a single character, not counting the character
+   itself.  This is a generous upper bound.  */
+enum { CASE_FOLDED_BUFSIZE = 32 };
+
+extern int case_folded_counterparts (wint_t, wchar_t[CASE_FOLDED_BUFSIZE]);
diff --git a/gawk-5.0.1/support/random.c b/gawk-5.0.1/support/random.c
new file mode 100644
index 00000000000..1aab2b506fc
--- /dev/null
+++ b/gawk-5.0.1/support/random.c
@@ -0,0 +1,642 @@
+/*
+ * Copyright (c) 1983, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Per the statement at http://opensource.org/licenses/bsd-license.php,
+ *
+ *	The advertising clause in the license appearing on BSD Unix files was
+ *	officially rescinded by the Director of the Office of Technology
+ *	Licensing of the University of California on July 22 1999. He states
+ *	that clause 3 is "hereby deleted in its entirety."
+ *
+ * I removed the advertising clause in the above copyright.
+ * The above web site points to
+ * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change.
+ *
+ * Arnold Robbins
+ * 15 September 2007
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static const char sccsid[] = "@(#)random.c	8.2 (Berkeley) 5/19/95";
+#endif /* LIBC_SCCS and not lint */
+
+#ifdef HAVE_CONFIG_H		/* gawk addition */
+#include <config.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <assert.h>
+
+#include "random.h"		/* gawk addition */
+
+#ifdef HAVE_SYS_TIME_H		/* gawk addition */
+#include <sys/time.h>
+#endif
+
+#if 0
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: /repoman/r/ncvs/src/lib/libc/stdlib/random.c,v 1.24 2004/01/20 03:02:18 das Exp $");
+
+#include "namespace.h"
+#include <sys/time.h>          /* for srandomdev() */
+#include <fcntl.h>             /* for srandomdev() */
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>            /* for srandomdev() */
+#include "un-namespace.h"
+#endif
+
+/*
+ * random.c:
+ *
+ * An improved random number generation package.  In addition to the standard
+ * rand()/srand() like interface, this package also has a special state info
+ * interface.  The initstate() routine is called with a seed, an array of
+ * bytes, and a count of how many bytes are being passed in; this array is
+ * then initialized to contain information for random number generation with
+ * that much state information.  Good sizes for the amount of state
+ * information are 32, 64, 128, and 256 bytes.  The state can be switched by
+ * calling the setstate() routine with the same array as was initiallized
+ * with initstate().  By default, the package runs with 128 bytes of state
+ * information and generates far better random numbers than a linear
+ * congruential generator.  If the amount of state information is less than
+ * 32 bytes, a simple linear congruential R.N.G. is used.
+ *
+ * Internally, the state information is treated as an array of uint32_t's; the
+ * zeroeth element of the array is the type of R.N.G. being used (small
+ * integer); the remainder of the array is the state information for the
+ * R.N.G.  Thus, 32 bytes of state information will give 7 ints worth of
+ * state information, which will allow a degree seven polynomial.  (Note:
+ * the zeroeth word of state information also has some other information
+ * stored in it -- see setstate() for details).
+ *
+ * The random number generation technique is a linear feedback shift register
+ * approach, employing trinomials (since there are fewer terms to sum up that
+ * way).  In this approach, the least significant bit of all the numbers in
+ * the state table will act as a linear feedback shift register, and will
+ * have period 2^deg - 1 (where deg is the degree of the polynomial being
+ * used, assuming that the polynomial is irreducible and primitive).  The
+ * higher order bits will have longer periods, since their values are also
+ * influenced by pseudo-random carries out of the lower bits.  The total
+ * period of the generator is approximately deg*(2**deg - 1); thus doubling
+ * the amount of state information has a vast influence on the period of the
+ * generator.  Note: the deg*(2**deg - 1) is an approximation only good for
+ * large deg, when the period of the shift is the dominant factor.
+ * With deg equal to seven, the period is actually much longer than the
+ * 7*(2**7 - 1) predicted by this formula.
+ *
+ * Modified 28 December 1994 by Jacob S. Rosenberg.
+ * The following changes have been made:
+ * All references to the type u_int have been changed to unsigned long.
+ * All references to type int have been changed to type long.  Other
+ * cleanups have been made as well.  A warning for both initstate and
+ * setstate has been inserted to the effect that on Sparc platforms
+ * the 'arg_state' variable must be forced to begin on word boundaries.
+ * This can be easily done by casting a long integer array to char *.
+ * The overall logic has been left STRICTLY alone.  This software was
+ * tested on both a VAX and Sun SpacsStation with exactly the same
+ * results.  The new version and the original give IDENTICAL results.
+ * The new version is somewhat faster than the original.  As the
+ * documentation says:  "By default, the package runs with 128 bytes of
+ * state information and generates far better random numbers than a linear
+ * congruential generator.  If the amount of state information is less than
+ * 32 bytes, a simple linear congruential R.N.G. is used."  For a buffer of
+ * 128 bytes, this new version runs about 19 percent faster and for a 16
+ * byte buffer it is about 5 percent faster.
+ *
+ * Modified 06 February 2016 by Nelson H. F. Beebe to interface to a
+ * shuffle buffer, producing a huge period, and removing long-range
+ * correlations of the basic low-level generator.  See comments and
+ * literature references in random() at the end of this file.
+ */
+
+#define SHUFFLE_BITS	9			/* see comments in random() below for this choice */
+#define SHUFFLE_MAX	(1 << SHUFFLE_BITS)	/* MUST be power of two */
+#define SHUFFLE_MASK	(SHUFFLE_MAX - 1)	/* (k & SHUFFLE_MASK) is in [0, SHUFFLE_MAX - 1] */
+
+static int  shuffle_init = 1;
+static long shuffle_buffer[SHUFFLE_MAX];
+
+/*
+ * For each of the currently supported random number generators, we have a
+ * break value on the amount of state information (you need at least this
+ * many bytes of state info to support this random number generator), a degree
+ * for the polynomial (actually a trinomial) that the R.N.G. is based on, and
+ * the separation between the two lower order coefficients of the trinomial.
+ */
+#define	TYPE_0		0		/* linear congruential */
+#define	BREAK_0		8
+#define	DEG_0		0
+#define	SEP_0		0
+
+#define	TYPE_1		1		/* x**7 + x**3 + 1 */
+#define	BREAK_1		32
+#define	DEG_1		7
+#define	SEP_1		3
+
+#define	TYPE_2		2		/* x**15 + x + 1 */
+#define	BREAK_2		64
+#define	DEG_2		15
+#define	SEP_2		1
+
+#define	TYPE_3		3		/* x**31 + x**3 + 1 */
+#define	BREAK_3		128
+#define	DEG_3		31
+#define	SEP_3		3
+
+#define	TYPE_4		4		/* x**63 + x + 1 */
+#define	BREAK_4		256
+#define	DEG_4		63
+#define	SEP_4		1
+
+/*
+ * Array versions of the above information to make code run faster --
+ * relies on fact that TYPE_i == i.
+ */
+#define	MAX_TYPES	5		/* max number of types above */
+
+#ifdef  USE_WEAK_SEEDING
+#define NSHUFF 0
+#else   /* !USE_WEAK_SEEDING */
+#define NSHUFF 50       /* to drop some "seed -> 1st value" linearity */
+#endif  /* !USE_WEAK_SEEDING */
+
+static const int degrees[MAX_TYPES] =	{ DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 };
+static const int seps [MAX_TYPES] =	{ SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 };
+
+/*
+ * Initially, everything is set up as if from:
+ *
+ *	initstate(1, randtbl, 128);
+ *
+ * Note that this initialization takes advantage of the fact that srandom()
+ * advances the front and rear pointers 10*rand_deg times, and hence the
+ * rear pointer which starts at 0 will also end up at zero; thus the zeroeth
+ * element of the state information, which contains info about the current
+ * position of the rear pointer is just
+ *
+ *	MAX_TYPES * (rptr - state) + TYPE_3 == TYPE_3.
+ */
+
+static uint32_t randtbl[DEG_3 + 1] = {
+	TYPE_3,
+#ifdef  USE_WEAK_SEEDING
+/* Historic implementation compatibility */
+/* The random sequences do not vary much with the seed */
+	0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, 0xde3b81e0, 0xdf0a6fb5,
+	0xf103bc02, 0x48f340fb, 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd,
+	0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88,
+	0xe369735d, 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc,
+	0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b,
+	0x27fb47b9,
+#else   /* !USE_WEAK_SEEDING */
+	0x991539b1, 0x16a5bce3, 0x6774a4cd, 0x3e01511e, 0x4e508aaa, 0x61048c05,
+	0xf5500617, 0x846b7115, 0x6a19892c, 0x896a97af, 0xdb48f936, 0x14898454,
+	0x37ffd106, 0xb58bff9c, 0x59e17104, 0xcf918a49, 0x09378c83, 0x52c7a471,
+	0x8d293ea9, 0x1f4fc301, 0xc3db71be, 0x39b44e1c, 0xf8a44ef9, 0x4c8b80b1,
+	0x19edc328, 0x87bf4bdd, 0xc9b240e5, 0xe9ee4b1b, 0x4382aee7, 0x535b6b41,
+	0xf3bec5da
+#endif  /* !USE_WEAK_SEEDING */
+};
+
+/*
+ * fptr and rptr are two pointers into the state info, a front and a rear
+ * pointer.  These two pointers are always rand_sep places aparts, as they
+ * cycle cyclically through the state information.  (Yes, this does mean we
+ * could get away with just one pointer, but the code for random() is more
+ * efficient this way).  The pointers are left positioned as they would be
+ * from the call
+ *
+ *	initstate(1, randtbl, 128);
+ *
+ * (The position of the rear pointer, rptr, is really 0 (as explained above
+ * in the initialization of randtbl) because the state table pointer is set
+ * to point to randtbl[1] (as explained below).
+ */
+static uint32_t *fptr = &randtbl[SEP_3 + 1];
+static uint32_t *rptr = &randtbl[1];
+
+/*
+ * The following things are the pointer to the state information table, the
+ * type of the current generator, the degree of the current polynomial being
+ * used, and the separation between the two pointers.  Note that for efficiency
+ * of random(), we remember the first location of the state information, not
+ * the zeroeth.  Hence it is valid to access state[-1], which is used to
+ * store the type of the R.N.G.  Also, we remember the last location, since
+ * this is more efficient than indexing every time to find the address of
+ * the last element to see if the front and rear pointers have wrapped.
+ */
+static uint32_t *state = &randtbl[1];
+static int rand_type = TYPE_3;
+static int rand_deg = DEG_3;
+static int rand_sep = SEP_3;
+static uint32_t *end_ptr = &randtbl[DEG_3 + 1];
+
+static inline uint32_t good_rand(int32_t);
+
+static inline uint32_t good_rand (x)
+	int32_t x;
+{
+#ifdef  USE_WEAK_SEEDING
+/*
+ * Historic implementation compatibility.
+ * The random sequences do not vary much with the seed,
+ * even with overflowing.
+ */
+	return (1103515245 * x + 12345);
+#else   /* !USE_WEAK_SEEDING */
+/*
+ * Compute x = (7^5 * x) mod (2^31 - 1)
+ * wihout overflowing 31 bits:
+ *      (2^31 - 1) = 127773 * (7^5) + 2836
+ * From "Random number generators: good ones are hard to find",
+ * Park and Miller, Communications of the ACM, vol. 31, no. 10,
+ * October 1988, p. 1195.
+ */
+	int32_t hi, lo;
+
+	/* Can't be initialized with 0, so use another value. */
+	if (x == 0)
+		x = 123459876;
+	hi = x / 127773;
+	lo = x % 127773;
+	x = 16807 * lo - 2836 * hi;
+	if (x < 0)
+		x += 0x7fffffff;
+	return (x);
+#endif  /* !USE_WEAK_SEEDING */
+}
+
+/*
+ * srandom:
+ *
+ * Initialize the random number generator based on the given seed.  If the
+ * type is the trivial no-state-information type, just remember the seed.
+ * Otherwise, initializes state[] based on the given "seed" via a linear
+ * congruential generator.  Then, the pointers are set to known locations
+ * that are exactly rand_sep places apart.  Lastly, it cycles the state
+ * information a given number of times to get rid of any initial dependencies
+ * introduced by the L.C.R.N.G.  Note that the initialization of randtbl[]
+ * for default usage relies on values produced by this routine.
+ */
+void
+srandom(x)
+	unsigned long x;
+{
+	int i, lim;
+
+	shuffle_init = 1;
+
+	state[0] = (uint32_t)x;
+	if (rand_type == TYPE_0)
+		lim = NSHUFF;
+	else {
+		for (i = 1; i < rand_deg; i++)
+			state[i] = good_rand(state[i - 1]);
+		fptr = &state[rand_sep];
+		rptr = &state[0];
+		lim = 10 * rand_deg;
+	}
+	for (i = 0; i < lim; i++)
+		(void)random();
+}
+
+#if 0 /* gawk doesn't use this */
+/*
+ * srandomdev:
+ *
+ * Many programs choose the seed value in a totally predictable manner.
+ * This often causes problems.  We seed the generator using the much more
+ * secure random(4) interface.  Note that this particular seeding
+ * procedure can generate states which are impossible to reproduce by
+ * calling srandom() with any value, since the succeeding terms in the
+ * state buffer are no longer derived from the LC algorithm applied to
+ * a fixed seed.
+ */
+void
+srandomdev()
+{
+	int fd, done;
+	size_t len;
+
+	if (rand_type == TYPE_0)
+		len = sizeof state[0];
+	else
+		len = rand_deg * sizeof state[0];
+
+	done = 0;
+	fd = open("/dev/random", O_RDONLY, 0);
+	if (fd >= 0) {
+		if (read(fd, (void *) state, len) == (ssize_t) len)
+			done = 1;
+		close(fd);
+	}
+
+	if (!done) {
+		struct timeval tv;
+		unsigned long junk;
+
+		gettimeofday(&tv, NULL);
+		srandom((getpid() << 16) ^ tv.tv_sec ^ tv.tv_usec ^ junk);
+		return;
+	}
+
+	if (rand_type != TYPE_0) {
+		fptr = &state[rand_sep];
+		rptr = &state[0];
+	}
+}
+#endif
+
+/*
+ * initstate:
+ *
+ * Initialize the state information in the given array of n bytes for future
+ * random number generation.  Based on the number of bytes we are given, and
+ * the break values for the different R.N.G.'s, we choose the best (largest)
+ * one we can and set things up for it.  srandom() is then called to
+ * initialize the state information.
+ *
+ * Note that on return from srandom(), we set state[-1] to be the type
+ * multiplexed with the current value of the rear pointer; this is so
+ * successive calls to initstate() won't lose this information and will be
+ * able to restart with setstate().
+ *
+ * Note: the first thing we do is save the current state, if any, just like
+ * setstate() so that it doesn't matter when initstate is called.
+ *
+ * Returns a pointer to the old state.
+ *
+ * Note: The Sparc platform requires that arg_state begin on an int
+ * word boundary; otherwise a bus error will occur. Even so, lint will
+ * complain about mis-alignment, but you should disregard these messages.
+ */
+char *
+initstate(seed, arg_state, n)
+	unsigned long seed;		/* seed for R.N.G. */
+	char *arg_state;		/* pointer to state array */
+	long n;				/* # bytes of state info */
+{
+	char *ostate = (char *)(&state[-1]);
+	uint32_t *int_arg_state = (uint32_t *)arg_state;
+
+	if (rand_type == TYPE_0)
+		state[-1] = rand_type;
+	else
+		state[-1] = MAX_TYPES * (rptr - state) + rand_type;
+	if (n < BREAK_0) {
+		(void)fprintf(stderr,
+		    "random: not enough state (%ld bytes); ignored.\n", n);
+		return(0);
+	}
+	if (n < BREAK_1) {
+		rand_type = TYPE_0;
+		rand_deg = DEG_0;
+		rand_sep = SEP_0;
+	} else if (n < BREAK_2) {
+		rand_type = TYPE_1;
+		rand_deg = DEG_1;
+		rand_sep = SEP_1;
+	} else if (n < BREAK_3) {
+		rand_type = TYPE_2;
+		rand_deg = DEG_2;
+		rand_sep = SEP_2;
+	} else if (n < BREAK_4) {
+		rand_type = TYPE_3;
+		rand_deg = DEG_3;
+		rand_sep = SEP_3;
+	} else {
+		rand_type = TYPE_4;
+		rand_deg = DEG_4;
+		rand_sep = SEP_4;
+	}
+	state = int_arg_state + 1; /* first location */
+	end_ptr = &state[rand_deg];	/* must set end_ptr before srandom */
+	srandom(seed);
+	if (rand_type == TYPE_0)
+		int_arg_state[0] = rand_type;
+	else
+		int_arg_state[0] = MAX_TYPES * (rptr - state) + rand_type;
+	return(ostate);
+}
+
+/*
+ * setstate:
+ *
+ * Restore the state from the given state array.
+ *
+ * Note: it is important that we also remember the locations of the pointers
+ * in the current state information, and restore the locations of the pointers
+ * from the old state information.  This is done by multiplexing the pointer
+ * location into the zeroeth word of the state information.
+ *
+ * Note that due to the order in which things are done, it is OK to call
+ * setstate() with the same state as the current state.
+ *
+ * Returns a pointer to the old state information.
+ *
+ * Note: The Sparc platform requires that arg_state begin on an int
+ * word boundary; otherwise a bus error will occur. Even so, lint will
+ * complain about mis-alignment, but you should disregard these messages.
+ */
+char *
+setstate(arg_state)
+	char *arg_state;		/* pointer to state array */
+{
+	uint32_t *new_state = (uint32_t *)arg_state;
+	uint32_t type = new_state[0] % MAX_TYPES;
+	uint32_t rear = new_state[0] / MAX_TYPES;
+	char *ostate = (char *)(&state[-1]);
+
+	if (rand_type == TYPE_0)
+		state[-1] = rand_type;
+	else
+		state[-1] = MAX_TYPES * (rptr - state) + rand_type;
+	switch(type) {
+	case TYPE_0:
+	case TYPE_1:
+	case TYPE_2:
+	case TYPE_3:
+	case TYPE_4:
+		rand_type = type;
+		rand_deg = degrees[type];
+		rand_sep = seps[type];
+		break;
+	default:
+		(void)fprintf(stderr,
+		    "random: state info corrupted; not changed.\n");
+	}
+	state = new_state + 1;
+	if (rand_type != TYPE_0) {
+		rptr = &state[rear];
+		fptr = &state[(rear + rand_sep) % rand_deg];
+	}
+	end_ptr = &state[rand_deg];		/* set end_ptr too */
+	return(ostate);
+}
+
+/*
+ * random:
+ *
+ * If we are using the trivial TYPE_0 R.N.G., just do the old linear
+ * congruential bit.  Otherwise, we do our fancy trinomial stuff, which is
+ * the same in all the other cases due to all the global variables that have
+ * been set up.  The basic operation is to add the number at the rear pointer
+ * into the one at the front pointer.  Then both pointers are advanced to
+ * the next location cyclically in the table.  The value returned is the sum
+ * generated, reduced to 31 bits by throwing away the "least random" low bit.
+ *
+ * Note: the code takes advantage of the fact that both the front and
+ * rear pointers can't wrap on the same call by not testing the rear
+ * pointer if the front one has wrapped.
+ *
+ * Returns a 31-bit random number.
+ */
+static long
+random_old()
+{
+	uint32_t i;
+	uint32_t *f, *r;
+
+	if (rand_type == TYPE_0) {
+		i = state[0];
+		state[0] = i = (good_rand(i)) & 0x7fffffff;
+	} else {
+		/*
+		 * Use local variables rather than static variables for speed.
+		 */
+		f = fptr; r = rptr;
+		*f += *r;
+		i = (*f >> 1) & 0x7fffffff;	/* chucking least random bit */
+		if (++f >= end_ptr) {
+			f = state;
+			++r;
+		}
+		else if (++r >= end_ptr) {
+			r = state;
+		}
+
+		fptr = f; rptr = r;
+	}
+	return((long)i);
+}
+
+long
+random()
+{
+	/*
+	 * This function is a wrapper to the original random(), now renamed
+	 * random_old(), to interpose a shuffle buffer to dramatically extend
+	 * the generator period at nearly zero additional execution cost,
+	 * and an additional storage cost set by the size of the
+	 * shuffle buffer (default: 512 longs, or 2K or 4K bytes).
+	 * The algorithm was first described in
+	 *
+	 *     Carter Bays and S. D. Durham
+	 *     Improving a Poor Random Number Generator
+	 *     ACM Transactions on Mathematical Software (TOMS) 2(1) 59--64 (March 1976)
+	 *     http://dx.doi.org/10.1145/355666.355670
+	 * 
+	 * and later revisited in
+	 * 
+	 *     Carter Bays
+	 *     C364. Improving a random number generator: a comparison between two shuffling methods
+	 *     Journal of Statistical Computation and Simulation 36(1) 57--59 (May 1990)
+	 *     http://dx.doi.org/10.1080/00949659008811264
+	 *
+	 * The second paper is critically important because it
+	 * emphasizes how an apparently trivial change to the final
+	 * element selection can destroy the period-lengthening
+	 * feature of the original shuffle algorithm.
+	 * 
+	 * Here is a table of the increase in period size for a
+	 * shuffle generator using 32-bit and 64-bit unsigned integer
+	 * linear congruential generators, which are known to have
+	 * significant correlations, and are thus inadvisable for
+	 * serious work with random numbers:
+	 *
+	 * hocd128> for (n = 32; n < 4096; n *= 2) \
+	 *              printf("%7d\t%12.3.4e\t%12.3.4e\n",
+	 *              n, \
+	 *              sqrt(PI * gamma(n + 1)/(2**32 - 1)) / (2**32 - 1), \\
+	 *              sqrt(PI * gamma(n + 1)/(2**64 - 1)) / (2**64 - 1))
+	 * 
+	 *      32    3.230e+03       1.148e-11
+	 *      64    2.243e+30       7.969e+15
+	 *     128    3.910e+93       1.389e+79
+	 *     256   1.844e+239      6.552e+224
+	 *     512   1.174e+569      4.172e+554
+	 *    1024  4.635e+1305     1.647e+1291
+	 *    2048  8.144e+2932     2.893e+2918
+	 *
+	 * A generator giving one result per nanosecond would produce
+	 * about 3.16e16 random numbers per year, so even for
+	 * massively parallel operations with, say, one million CPU
+	 * cores, it could not produce more than 10**23 values per
+	 * year.  The main benefit of an enormous period is that it
+	 * makes long-range correlations vanishingly unlikely, even
+	 * when starting seeds are similar (e.g., seeds of 0, 1, 2,
+	 * ...), and therefore makes possible families of generators
+	 * (needed in parallel computations) where the probability of
+	 * sequence overlap between family members is essentially
+	 * zero.
+	 */
+
+	int k;
+	long r;
+	static long s = 0xcafefeedL;
+
+	if (shuffle_init) {	/* first time, or seed changed by srand() */
+		for (k = 0; k < SHUFFLE_MAX; k++)
+			shuffle_buffer[k] = random_old();
+
+		s = random_old();
+		shuffle_init = 0;
+	}
+
+	r = random_old();
+	k = s & SHUFFLE_MASK;		/* random index into shuffle_buffer[] */
+
+	assert(0L <= k && k < SHUFFLE_MAX);
+
+	s = shuffle_buffer[k];
+	shuffle_buffer[k] = r;
+
+	return (s);
+}
diff --git a/gawk-5.0.1/support/random.h b/gawk-5.0.1/support/random.h
new file mode 100644
index 00000000000..84b3141426d
--- /dev/null
+++ b/gawk-5.0.1/support/random.h
@@ -0,0 +1,43 @@
+/*
+ * random.h - redefine name of random lib routines to avoid conflicts
+ */
+
+/*
+ * Copyright (C) 1996, 2001, 2004, 2005, 2013 the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#define initstate gawk_initstate
+#define setstate gawk_setstate
+#define random gawk_random
+#define srandom gawk_srandom
+
+#if SIZEOF_UNSIGNED_INT == 4
+typedef unsigned int gawk_uint32_t;
+typedef          int gawk_int32_t;
+#else
+#if SIZEOF_UNSIGNED_LONG == 4
+typedef unsigned long gawk_uint32_t;
+typedef          long gawk_int32_t;
+#endif
+#endif
+#define uint32_t gawk_uint32_t
+#define int32_t  gawk_int32_t
+
+extern long random (void);
diff --git a/gawk-5.0.1/support/regcomp.c b/gawk-5.0.1/support/regcomp.c
new file mode 100644
index 00000000000..7525355a9b1
--- /dev/null
+++ b/gawk-5.0.1/support/regcomp.c
@@ -0,0 +1,3934 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifdef _LIBC
+# include <locale/weight.h>
+#endif
+
+static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
+					  size_t length, reg_syntax_t syntax);
+static void re_compile_fastmap_iter (regex_t *bufp,
+				     const re_dfastate_t *init_state,
+				     char *fastmap);
+static reg_errcode_t init_dfa (re_dfa_t *dfa, size_t pat_len);
+#ifdef RE_ENABLE_I18N
+static void free_charset (re_charset_t *cset);
+#endif /* RE_ENABLE_I18N */
+static void free_workarea_compile (regex_t *preg);
+static reg_errcode_t create_initial_state (re_dfa_t *dfa);
+#ifdef RE_ENABLE_I18N
+static void optimize_utf8 (re_dfa_t *dfa);
+#endif
+static reg_errcode_t analyze (regex_t *preg);
+static reg_errcode_t preorder (bin_tree_t *root,
+			       reg_errcode_t (fn (void *, bin_tree_t *)),
+			       void *extra);
+static reg_errcode_t postorder (bin_tree_t *root,
+				reg_errcode_t (fn (void *, bin_tree_t *)),
+				void *extra);
+static reg_errcode_t optimize_subexps (void *extra, bin_tree_t *node);
+static reg_errcode_t lower_subexps (void *extra, bin_tree_t *node);
+static bin_tree_t *lower_subexp (reg_errcode_t *err, regex_t *preg,
+				 bin_tree_t *node);
+static reg_errcode_t calc_first (void *extra, bin_tree_t *node);
+static reg_errcode_t calc_next (void *extra, bin_tree_t *node);
+static reg_errcode_t link_nfa_nodes (void *extra, bin_tree_t *node);
+static Idx duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint);
+static Idx search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
+				   unsigned int constraint);
+static reg_errcode_t calc_eclosure (re_dfa_t *dfa);
+static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa,
+					 Idx node, bool root);
+static reg_errcode_t calc_inveclosure (re_dfa_t *dfa);
+static Idx fetch_number (re_string_t *input, re_token_t *token,
+			 reg_syntax_t syntax);
+static int peek_token (re_token_t *token, re_string_t *input,
+			reg_syntax_t syntax);
+static bin_tree_t *parse (re_string_t *regexp, regex_t *preg,
+			  reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_reg_exp (re_string_t *regexp, regex_t *preg,
+				  re_token_t *token, reg_syntax_t syntax,
+				  Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_branch (re_string_t *regexp, regex_t *preg,
+				 re_token_t *token, reg_syntax_t syntax,
+				 Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_expression (re_string_t *regexp, regex_t *preg,
+				     re_token_t *token, reg_syntax_t syntax,
+				     Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_sub_exp (re_string_t *regexp, regex_t *preg,
+				  re_token_t *token, reg_syntax_t syntax,
+				  Idx nest, reg_errcode_t *err);
+static bin_tree_t *parse_dup_op (bin_tree_t *dup_elem, re_string_t *regexp,
+				 re_dfa_t *dfa, re_token_t *token,
+				 reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa,
+				      re_token_t *token, reg_syntax_t syntax,
+				      reg_errcode_t *err);
+static reg_errcode_t parse_bracket_element (bracket_elem_t *elem,
+					    re_string_t *regexp,
+					    re_token_t *token, int token_len,
+					    re_dfa_t *dfa,
+					    reg_syntax_t syntax,
+					    bool accept_hyphen);
+static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem,
+					  re_string_t *regexp,
+					  re_token_t *token);
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t build_equiv_class (bitset_t sbcset,
+					re_charset_t *mbcset,
+					Idx *equiv_class_alloc,
+					const unsigned char *name);
+static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
+				      bitset_t sbcset,
+				      re_charset_t *mbcset,
+				      Idx *char_class_alloc,
+				      const char *class_name,
+				      reg_syntax_t syntax);
+#else  /* not RE_ENABLE_I18N */
+static reg_errcode_t build_equiv_class (bitset_t sbcset,
+					const unsigned char *name);
+static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
+				      bitset_t sbcset,
+				      const char *class_name,
+				      reg_syntax_t syntax);
+#endif /* not RE_ENABLE_I18N */
+static bin_tree_t *build_charclass_op (re_dfa_t *dfa,
+				       RE_TRANSLATE_TYPE trans,
+				       const char *class_name,
+				       const char *extra,
+				       bool non_match, reg_errcode_t *err);
+static bin_tree_t *create_tree (re_dfa_t *dfa,
+				bin_tree_t *left, bin_tree_t *right,
+				re_token_type_t type);
+static bin_tree_t *create_token_tree (re_dfa_t *dfa,
+				      bin_tree_t *left, bin_tree_t *right,
+				      const re_token_t *token);
+static bin_tree_t *duplicate_tree (const bin_tree_t *src, re_dfa_t *dfa);
+static void free_token (re_token_t *node);
+static reg_errcode_t free_tree (void *extra, bin_tree_t *node);
+static reg_errcode_t mark_opt_subexp (void *extra, bin_tree_t *node);
+
+/* This table gives an error message for each of the error codes listed
+   in regex.h.  Obviously the order here has to be same as there.
+   POSIX doesn't require that we do anything for REG_NOERROR,
+   but why not be nice?  */
+
+static const char __re_error_msgid[] =
+  {
+#define REG_NOERROR_IDX	0
+    gettext_noop ("Success")	/* REG_NOERROR */
+    "\0"
+#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
+    gettext_noop ("No match")	/* REG_NOMATCH */
+    "\0"
+#define REG_BADPAT_IDX	(REG_NOMATCH_IDX + sizeof "No match")
+    gettext_noop ("Invalid regular expression") /* REG_BADPAT */
+    "\0"
+#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
+    gettext_noop ("Invalid collation character") /* REG_ECOLLATE */
+    "\0"
+#define REG_ECTYPE_IDX	(REG_ECOLLATE_IDX + sizeof "Invalid collation character")
+    gettext_noop ("Invalid character class name") /* REG_ECTYPE */
+    "\0"
+#define REG_EESCAPE_IDX	(REG_ECTYPE_IDX + sizeof "Invalid character class name")
+    gettext_noop ("Trailing backslash") /* REG_EESCAPE */
+    "\0"
+#define REG_ESUBREG_IDX	(REG_EESCAPE_IDX + sizeof "Trailing backslash")
+    gettext_noop ("Invalid back reference") /* REG_ESUBREG */
+    "\0"
+#define REG_EBRACK_IDX	(REG_ESUBREG_IDX + sizeof "Invalid back reference")
+    gettext_noop ("Unmatched [, [^, [:, [., or [=")	/* REG_EBRACK */
+    "\0"
+#define REG_EPAREN_IDX	(REG_EBRACK_IDX + sizeof "Unmatched [, [^, [:, [., or [=")
+    gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */
+    "\0"
+#define REG_EBRACE_IDX	(REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
+    gettext_noop ("Unmatched \\{") /* REG_EBRACE */
+    "\0"
+#define REG_BADBR_IDX	(REG_EBRACE_IDX + sizeof "Unmatched \\{")
+    gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */
+    "\0"
+#define REG_ERANGE_IDX	(REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
+    gettext_noop ("Invalid range end")	/* REG_ERANGE */
+    "\0"
+#define REG_ESPACE_IDX	(REG_ERANGE_IDX + sizeof "Invalid range end")
+    gettext_noop ("Memory exhausted") /* REG_ESPACE */
+    "\0"
+#define REG_BADRPT_IDX	(REG_ESPACE_IDX + sizeof "Memory exhausted")
+    gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */
+    "\0"
+#define REG_EEND_IDX	(REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
+    gettext_noop ("Premature end of regular expression") /* REG_EEND */
+    "\0"
+#define REG_ESIZE_IDX	(REG_EEND_IDX + sizeof "Premature end of regular expression")
+    gettext_noop ("Regular expression too big") /* REG_ESIZE */
+    "\0"
+#define REG_ERPAREN_IDX	(REG_ESIZE_IDX + sizeof "Regular expression too big")
+    gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */
+  };
+
+static const size_t __re_error_msgid_idx[] =
+  {
+    REG_NOERROR_IDX,
+    REG_NOMATCH_IDX,
+    REG_BADPAT_IDX,
+    REG_ECOLLATE_IDX,
+    REG_ECTYPE_IDX,
+    REG_EESCAPE_IDX,
+    REG_ESUBREG_IDX,
+    REG_EBRACK_IDX,
+    REG_EPAREN_IDX,
+    REG_EBRACE_IDX,
+    REG_BADBR_IDX,
+    REG_ERANGE_IDX,
+    REG_ESPACE_IDX,
+    REG_BADRPT_IDX,
+    REG_EEND_IDX,
+    REG_ESIZE_IDX,
+    REG_ERPAREN_IDX
+  };
+
+/* Entry points for GNU code.  */
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+   compiles PATTERN (of length LENGTH) and puts the result in BUFP.
+   Returns 0 if the pattern was valid, otherwise an error string.
+
+   Assumes the 'allocated' (and perhaps 'buffer') and 'translate' fields
+   are set in BUFP on entry.  */
+
+const char *
+re_compile_pattern (const char *pattern, size_t length,
+		    struct re_pattern_buffer *bufp)
+{
+  reg_errcode_t ret;
+
+  /* And GNU code determines whether or not to get register information
+     by passing null for the REGS argument to re_match, etc., not by
+     setting no_sub, unless RE_NO_SUB is set.  */
+  bufp->no_sub = !!(re_syntax_options & RE_NO_SUB);
+
+  /* Match anchors at newline.  */
+  bufp->newline_anchor = 1;
+
+  ret = re_compile_internal (bufp, pattern, length, re_syntax_options);
+
+  if (!ret)
+    return NULL;
+  return gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+weak_alias (__re_compile_pattern, re_compile_pattern)
+
+/* Set by 're_set_syntax' to the current regexp syntax to recognize.  Can
+   also be assigned to arbitrarily: each pattern buffer stores its own
+   syntax, so it can be changed between regex compilations.  */
+/* This has no initializer because initialized variables in Emacs
+   become read-only after dumping.  */
+reg_syntax_t re_syntax_options;
+
+
+/* Specify the precise syntax of regexps for compilation.  This provides
+   for compatibility for various utilities which historically have
+   different, incompatible syntaxes.
+
+   The argument SYNTAX is a bit mask comprised of the various bits
+   defined in regex.h.  We return the old syntax.  */
+
+reg_syntax_t
+re_set_syntax (reg_syntax_t syntax)
+{
+  reg_syntax_t ret = re_syntax_options;
+
+  re_syntax_options = syntax;
+  return ret;
+}
+weak_alias (__re_set_syntax, re_set_syntax)
+
+int
+re_compile_fastmap (struct re_pattern_buffer *bufp)
+{
+  re_dfa_t *dfa = bufp->buffer;
+  char *fastmap = bufp->fastmap;
+
+  memset (fastmap, '\0', sizeof (char) * SBC_MAX);
+  re_compile_fastmap_iter (bufp, dfa->init_state, fastmap);
+  if (dfa->init_state != dfa->init_state_word)
+    re_compile_fastmap_iter (bufp, dfa->init_state_word, fastmap);
+  if (dfa->init_state != dfa->init_state_nl)
+    re_compile_fastmap_iter (bufp, dfa->init_state_nl, fastmap);
+  if (dfa->init_state != dfa->init_state_begbuf)
+    re_compile_fastmap_iter (bufp, dfa->init_state_begbuf, fastmap);
+  bufp->fastmap_accurate = 1;
+  return 0;
+}
+weak_alias (__re_compile_fastmap, re_compile_fastmap)
+
+static inline void
+__attribute__ ((always_inline))
+re_set_fastmap (char *fastmap, bool icase, int ch)
+{
+  fastmap[ch] = 1;
+  if (icase)
+    fastmap[tolower (ch)] = 1;
+}
+
+/* Helper function for re_compile_fastmap.
+   Compile fastmap for the initial_state INIT_STATE.  */
+
+static void
+re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
+			 char *fastmap)
+{
+  re_dfa_t *dfa = bufp->buffer;
+  Idx node_cnt;
+  bool icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE));
+  for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt)
+    {
+      Idx node = init_state->nodes.elems[node_cnt];
+      re_token_type_t type = dfa->nodes[node].type;
+
+      if (type == CHARACTER)
+	{
+	  re_set_fastmap (fastmap, icase, dfa->nodes[node].opr.c);
+#ifdef RE_ENABLE_I18N
+	  if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
+	    {
+	      unsigned char buf[MB_LEN_MAX];
+	      unsigned char *p;
+	      wchar_t wc;
+	      mbstate_t state;
+
+	      p = buf;
+	      *p++ = dfa->nodes[node].opr.c;
+	      while (++node < dfa->nodes_len
+		     &&	dfa->nodes[node].type == CHARACTER
+		     && dfa->nodes[node].mb_partial)
+		*p++ = dfa->nodes[node].opr.c;
+	      memset (&state, '\0', sizeof (state));
+	      if (__mbrtowc (&wc, (const char *) buf, p - buf,
+			     &state) == p - buf
+		  && (__wcrtomb ((char *) buf, __towlower (wc), &state)
+		      != (size_t) -1))
+		re_set_fastmap (fastmap, false, buf[0]);
+	    }
+#endif
+	}
+      else if (type == SIMPLE_BRACKET)
+	{
+	  int i, ch;
+	  for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+	    {
+	      int j;
+	      bitset_word_t w = dfa->nodes[node].opr.sbcset[i];
+	      for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+		if (w & ((bitset_word_t) 1 << j))
+		  re_set_fastmap (fastmap, icase, ch);
+	    }
+	}
+#ifdef RE_ENABLE_I18N
+      else if (type == COMPLEX_BRACKET)
+	{
+	  re_charset_t *cset = dfa->nodes[node].opr.mbcset;
+	  Idx i;
+
+# ifdef _LIBC
+	  /* See if we have to try all bytes which start multiple collation
+	     elements.
+	     e.g. In da_DK, we want to catch 'a' since "aa" is a valid
+		  collation element, and don't catch 'b' since 'b' is
+		  the only collation element which starts from 'b' (and
+		  it is caught by SIMPLE_BRACKET).  */
+	      if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0
+		  && (cset->ncoll_syms || cset->nranges))
+		{
+		  const int32_t *table = (const int32_t *)
+		    _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+		  for (i = 0; i < SBC_MAX; ++i)
+		    if (table[i] < 0)
+		      re_set_fastmap (fastmap, icase, i);
+		}
+# endif /* _LIBC */
+
+	  /* See if we have to start the match at all multibyte characters,
+	     i.e. where we would not find an invalid sequence.  This only
+	     applies to multibyte character sets; for single byte character
+	     sets, the SIMPLE_BRACKET again suffices.  */
+	  if (dfa->mb_cur_max > 1
+	      && (cset->nchar_classes || cset->non_match || cset->nranges
+# ifdef _LIBC
+		  || cset->nequiv_classes
+# endif /* _LIBC */
+		 ))
+	    {
+	      unsigned char c = 0;
+	      do
+		{
+		  mbstate_t mbs;
+		  memset (&mbs, 0, sizeof (mbs));
+		  if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2)
+		    re_set_fastmap (fastmap, false, (int) c);
+		}
+	      while (++c != 0);
+	    }
+
+	  else
+	    {
+	      /* ... Else catch all bytes which can start the mbchars.  */
+	      for (i = 0; i < cset->nmbchars; ++i)
+		{
+		  char buf[256];
+		  mbstate_t state;
+		  memset (&state, '\0', sizeof (state));
+		  if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
+		    re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
+		  if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
+		    {
+		      if (__wcrtomb (buf, __towlower (cset->mbchars[i]), &state)
+			  != (size_t) -1)
+			re_set_fastmap (fastmap, false, *(unsigned char *) buf);
+		    }
+		}
+	    }
+	}
+#endif /* RE_ENABLE_I18N */
+      else if (type == OP_PERIOD
+#ifdef RE_ENABLE_I18N
+	       || type == OP_UTF8_PERIOD
+#endif /* RE_ENABLE_I18N */
+	       || type == END_OF_RE)
+	{
+	  memset (fastmap, '\1', sizeof (char) * SBC_MAX);
+	  if (type == END_OF_RE)
+	    bufp->can_be_null = 1;
+	  return;
+	}
+    }
+}
+
+/* Entry point for POSIX code.  */
+/* regcomp takes a regular expression as a string and compiles it.
+
+   PREG is a regex_t *.  We do not expect any fields to be initialized,
+   since POSIX says we shouldn't.  Thus, we set
+
+     'buffer' to the compiled pattern;
+     'used' to the length of the compiled pattern;
+     'syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+       REG_EXTENDED bit in CFLAGS is set; otherwise, to
+       RE_SYNTAX_POSIX_BASIC;
+     'newline_anchor' to REG_NEWLINE being set in CFLAGS;
+     'fastmap' to an allocated space for the fastmap;
+     'fastmap_accurate' to zero;
+     're_nsub' to the number of subexpressions in PATTERN.
+
+   PATTERN is the address of the pattern string.
+
+   CFLAGS is a series of bits which affect compilation.
+
+     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+     use POSIX basic syntax.
+
+     If REG_NEWLINE is set, then . and [^...] don't match newline.
+     Also, regexec will try a match beginning after every newline.
+
+     If REG_ICASE is set, then we considers upper- and lowercase
+     versions of letters to be equivalent when matching.
+
+     If REG_NOSUB is set, then when PREG is passed to regexec, that
+     routine will report only success or failure, and nothing about the
+     registers.
+
+   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
+   the return codes and their meanings.)  */
+
+int
+regcomp (regex_t *__restrict preg, const char *__restrict pattern, int cflags)
+{
+  reg_errcode_t ret;
+  reg_syntax_t syntax = ((cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED
+			 : RE_SYNTAX_POSIX_BASIC);
+
+  preg->buffer = NULL;
+  preg->allocated = 0;
+  preg->used = 0;
+
+  /* Try to allocate space for the fastmap.  */
+  preg->fastmap = re_malloc (char, SBC_MAX);
+  if (__glibc_unlikely (preg->fastmap == NULL))
+    return REG_ESPACE;
+
+  syntax |= (cflags & REG_ICASE) ? RE_ICASE : 0;
+
+  /* If REG_NEWLINE is set, newlines are treated differently.  */
+  if (cflags & REG_NEWLINE)
+    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
+      syntax &= ~RE_DOT_NEWLINE;
+      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+      /* It also changes the matching behavior.  */
+      preg->newline_anchor = 1;
+    }
+  else
+    preg->newline_anchor = 0;
+  preg->no_sub = !!(cflags & REG_NOSUB);
+  preg->translate = NULL;
+
+  ret = re_compile_internal (preg, pattern, strlen (pattern), syntax);
+
+  /* POSIX doesn't distinguish between an unmatched open-group and an
+     unmatched close-group: both are REG_EPAREN.  */
+  if (ret == REG_ERPAREN)
+    ret = REG_EPAREN;
+
+  /* We have already checked preg->fastmap != NULL.  */
+  if (__glibc_likely (ret == REG_NOERROR))
+    /* Compute the fastmap now, since regexec cannot modify the pattern
+       buffer.  This function never fails in this implementation.  */
+    (void) re_compile_fastmap (preg);
+  else
+    {
+      /* Some error occurred while compiling the expression.  */
+      re_free (preg->fastmap);
+      preg->fastmap = NULL;
+    }
+
+  return (int) ret;
+}
+libc_hidden_def (__regcomp)
+weak_alias (__regcomp, regcomp)
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+   from either regcomp or regexec.   We don't use PREG here.  */
+
+size_t
+regerror (int errcode, const regex_t *__restrict preg, char *__restrict errbuf,
+	  size_t errbuf_size)
+{
+  const char *msg;
+  size_t msg_size;
+  int nerrcodes = sizeof __re_error_msgid_idx / sizeof __re_error_msgid_idx[0];
+
+  if (__glibc_unlikely (errcode < 0 || errcode >= nerrcodes))
+    /* Only error codes returned by the rest of the code should be passed
+       to this routine.  If we are given anything else, or if other regex
+       code generates an invalid error code, then the program has a bug.
+       Dump core so we can fix it.  */
+    abort ();
+
+  msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
+
+  msg_size = strlen (msg) + 1; /* Includes the null.  */
+
+  if (__glibc_likely (errbuf_size != 0))
+    {
+      size_t cpy_size = msg_size;
+      if (__glibc_unlikely (msg_size > errbuf_size))
+	{
+	  cpy_size = errbuf_size - 1;
+	  errbuf[cpy_size] = '\0';
+	}
+      memcpy (errbuf, msg, cpy_size);
+    }
+
+  return msg_size;
+}
+weak_alias (__regerror, regerror)
+
+
+#ifdef RE_ENABLE_I18N
+/* This static array is used for the map to single-byte characters when
+   UTF-8 is used.  Otherwise we would allocate memory just to initialize
+   it the same all the time.  UTF-8 is the preferred encoding so this is
+   a worthwhile optimization.  */
+static const bitset_t utf8_sb_map =
+{
+  /* Set the first 128 bits.  */
+# if defined __GNUC__ && !defined __STRICT_ANSI__
+  [0 ... 0x80 / BITSET_WORD_BITS - 1] = BITSET_WORD_MAX
+# else
+#  if 4 * BITSET_WORD_BITS < ASCII_CHARS
+#   error "bitset_word_t is narrower than 32 bits"
+#  elif 3 * BITSET_WORD_BITS < ASCII_CHARS
+  BITSET_WORD_MAX, BITSET_WORD_MAX, BITSET_WORD_MAX,
+#  elif 2 * BITSET_WORD_BITS < ASCII_CHARS
+  BITSET_WORD_MAX, BITSET_WORD_MAX,
+#  elif 1 * BITSET_WORD_BITS < ASCII_CHARS
+  BITSET_WORD_MAX,
+#  endif
+  (BITSET_WORD_MAX
+   >> (SBC_MAX % BITSET_WORD_BITS == 0
+       ? 0
+       : BITSET_WORD_BITS - SBC_MAX % BITSET_WORD_BITS))
+# endif
+};
+#endif
+
+
+static void
+free_dfa_content (re_dfa_t *dfa)
+{
+  Idx i, j;
+
+  if (dfa->nodes)
+    for (i = 0; i < dfa->nodes_len; ++i)
+      free_token (dfa->nodes + i);
+  re_free (dfa->nexts);
+  for (i = 0; i < dfa->nodes_len; ++i)
+    {
+      if (dfa->eclosures != NULL)
+	re_node_set_free (dfa->eclosures + i);
+      if (dfa->inveclosures != NULL)
+	re_node_set_free (dfa->inveclosures + i);
+      if (dfa->edests != NULL)
+	re_node_set_free (dfa->edests + i);
+    }
+  re_free (dfa->edests);
+  re_free (dfa->eclosures);
+  re_free (dfa->inveclosures);
+  re_free (dfa->nodes);
+
+  if (dfa->state_table)
+    for (i = 0; i <= dfa->state_hash_mask; ++i)
+      {
+	struct re_state_table_entry *entry = dfa->state_table + i;
+	for (j = 0; j < entry->num; ++j)
+	  {
+	    re_dfastate_t *state = entry->array[j];
+	    free_state (state);
+	  }
+	re_free (entry->array);
+      }
+  re_free (dfa->state_table);
+#ifdef RE_ENABLE_I18N
+  if (dfa->sb_char != utf8_sb_map)
+    re_free (dfa->sb_char);
+#endif
+  re_free (dfa->subexp_map);
+#ifdef DEBUG
+  re_free (dfa->re_str);
+#endif
+
+  re_free (dfa);
+}
+
+
+/* Free dynamically allocated space used by PREG.  */
+
+void
+regfree (regex_t *preg)
+{
+  re_dfa_t *dfa = preg->buffer;
+  if (__glibc_likely (dfa != NULL))
+    {
+      lock_fini (dfa->lock);
+      free_dfa_content (dfa);
+    }
+  preg->buffer = NULL;
+  preg->allocated = 0;
+
+  re_free (preg->fastmap);
+  preg->fastmap = NULL;
+
+  re_free (preg->translate);
+  preg->translate = NULL;
+}
+libc_hidden_def (__regfree)
+weak_alias (__regfree, regfree)
+
+/* Entry points compatible with 4.2 BSD regex library.  We don't define
+   them unless specifically requested.  */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+
+/* BSD has one and only one pattern buffer.  */
+static struct re_pattern_buffer re_comp_buf;
+
+char *
+# ifdef _LIBC
+/* Make these definitions weak in libc, so POSIX programs can redefine
+   these names if they don't use our functions, and still use
+   regcomp/regexec above without link errors.  */
+weak_function
+# endif
+re_comp (const char *s)
+{
+  reg_errcode_t ret;
+  char *fastmap;
+
+  if (!s)
+    {
+      if (!re_comp_buf.buffer)
+	return gettext ("No previous regular expression");
+      return 0;
+    }
+
+  if (re_comp_buf.buffer)
+    {
+      fastmap = re_comp_buf.fastmap;
+      re_comp_buf.fastmap = NULL;
+      __regfree (&re_comp_buf);
+      memset (&re_comp_buf, '\0', sizeof (re_comp_buf));
+      re_comp_buf.fastmap = fastmap;
+    }
+
+  if (re_comp_buf.fastmap == NULL)
+    {
+      re_comp_buf.fastmap = re_malloc (char, SBC_MAX);
+      if (re_comp_buf.fastmap == NULL)
+	return (char *) gettext (__re_error_msgid
+				 + __re_error_msgid_idx[(int) REG_ESPACE]);
+    }
+
+  /* Since 're_exec' always passes NULL for the 'regs' argument, we
+     don't need to initialize the pattern buffer fields which affect it.  */
+
+  /* Match anchors at newlines.  */
+  re_comp_buf.newline_anchor = 1;
+
+  ret = re_compile_internal (&re_comp_buf, s, strlen (s), re_syntax_options);
+
+  if (!ret)
+    return NULL;
+
+  /* Yes, we're discarding 'const' here if !HAVE_LIBINTL.  */
+  return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+
+#ifdef _LIBC
+libc_freeres_fn (free_mem)
+{
+  __regfree (&re_comp_buf);
+}
+#endif
+
+#endif /* _REGEX_RE_COMP */
+
+/* Internal entry point.
+   Compile the regular expression PATTERN, whose length is LENGTH.
+   SYNTAX indicate regular expression's syntax.  */
+
+static reg_errcode_t
+re_compile_internal (regex_t *preg, const char * pattern, size_t length,
+		     reg_syntax_t syntax)
+{
+  reg_errcode_t err = REG_NOERROR;
+  re_dfa_t *dfa;
+  re_string_t regexp;
+
+  /* Initialize the pattern buffer.  */
+  preg->fastmap_accurate = 0;
+  preg->syntax = syntax;
+  preg->not_bol = preg->not_eol = 0;
+  preg->used = 0;
+  preg->re_nsub = 0;
+  preg->can_be_null = 0;
+  preg->regs_allocated = REGS_UNALLOCATED;
+
+  /* Initialize the dfa.  */
+  dfa = preg->buffer;
+  if (__glibc_unlikely (preg->allocated < sizeof (re_dfa_t)))
+    {
+      /* If zero allocated, but buffer is non-null, try to realloc
+	 enough space.  This loses if buffer's address is bogus, but
+	 that is the user's responsibility.  If ->buffer is NULL this
+	 is a simple allocation.  */
+      dfa = re_realloc (preg->buffer, re_dfa_t, 1);
+      if (dfa == NULL)
+	return REG_ESPACE;
+      preg->allocated = sizeof (re_dfa_t);
+      preg->buffer = dfa;
+    }
+  preg->used = sizeof (re_dfa_t);
+
+  err = init_dfa (dfa, length);
+  if (__glibc_unlikely (err == REG_NOERROR && lock_init (dfa->lock) != 0))
+    err = REG_ESPACE;
+  if (__glibc_unlikely (err != REG_NOERROR))
+    {
+      free_dfa_content (dfa);
+      preg->buffer = NULL;
+      preg->allocated = 0;
+      return err;
+    }
+#ifdef DEBUG
+  /* Note: length+1 will not overflow since it is checked in init_dfa.  */
+  dfa->re_str = re_malloc (char, length + 1);
+  strncpy (dfa->re_str, pattern, length + 1);
+#endif
+
+  err = re_string_construct (&regexp, pattern, length, preg->translate,
+			     (syntax & RE_ICASE) != 0, dfa);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    {
+    re_compile_internal_free_return:
+      free_workarea_compile (preg);
+      re_string_destruct (&regexp);
+      lock_fini (dfa->lock);
+      free_dfa_content (dfa);
+      preg->buffer = NULL;
+      preg->allocated = 0;
+      return err;
+    }
+
+  /* Parse the regular expression, and build a structure tree.  */
+  preg->re_nsub = 0;
+  dfa->str_tree = parse (&regexp, preg, syntax, &err);
+  if (__glibc_unlikely (dfa->str_tree == NULL))
+    goto re_compile_internal_free_return;
+
+  /* Analyze the tree and create the nfa.  */
+  err = analyze (preg);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    goto re_compile_internal_free_return;
+
+#ifdef RE_ENABLE_I18N
+  /* If possible, do searching in single byte encoding to speed things up.  */
+  if (dfa->is_utf8 && !(syntax & RE_ICASE) && preg->translate == NULL)
+    optimize_utf8 (dfa);
+#endif
+
+  /* Then create the initial state of the dfa.  */
+  err = create_initial_state (dfa);
+
+  /* Release work areas.  */
+  free_workarea_compile (preg);
+  re_string_destruct (&regexp);
+
+  if (__glibc_unlikely (err != REG_NOERROR))
+    {
+      lock_fini (dfa->lock);
+      free_dfa_content (dfa);
+      preg->buffer = NULL;
+      preg->allocated = 0;
+    }
+
+  return err;
+}
+
+/* Initialize DFA.  We use the length of the regular expression PAT_LEN
+   as the initial length of some arrays.  */
+
+static reg_errcode_t
+init_dfa (re_dfa_t *dfa, size_t pat_len)
+{
+  __re_size_t table_size;
+#ifndef _LIBC
+  const char *codeset_name;
+#endif
+#ifdef RE_ENABLE_I18N
+  size_t max_i18n_object_size = MAX (sizeof (wchar_t), sizeof (wctype_t));
+#else
+  size_t max_i18n_object_size = 0;
+#endif
+  size_t max_object_size =
+    MAX (sizeof (struct re_state_table_entry),
+	 MAX (sizeof (re_token_t),
+	      MAX (sizeof (re_node_set),
+		   MAX (sizeof (regmatch_t),
+			max_i18n_object_size))));
+
+  memset (dfa, '\0', sizeof (re_dfa_t));
+
+  /* Force allocation of str_tree_storage the first time.  */
+  dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
+
+  /* Avoid overflows.  The extra "/ 2" is for the table_size doubling
+     calculation below, and for similar doubling calculations
+     elsewhere.  And it's <= rather than <, because some of the
+     doubling calculations add 1 afterwards.  */
+  if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) / 2
+			<= pat_len))
+    return REG_ESPACE;
+
+  dfa->nodes_alloc = pat_len + 1;
+  dfa->nodes = re_malloc (re_token_t, dfa->nodes_alloc);
+
+  /*  table_size = 2 ^ ceil(log pat_len) */
+  for (table_size = 1; ; table_size <<= 1)
+    if (table_size > pat_len)
+      break;
+
+  dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size);
+  dfa->state_hash_mask = table_size - 1;
+
+  dfa->mb_cur_max = MB_CUR_MAX;
+#ifdef _LIBC
+  if (dfa->mb_cur_max == 6
+      && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0)
+    dfa->is_utf8 = 1;
+  dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII)
+		       != 0);
+#else
+  codeset_name = nl_langinfo (CODESET);
+  if ((codeset_name[0] == 'U' || codeset_name[0] == 'u')
+      && (codeset_name[1] == 'T' || codeset_name[1] == 't')
+      && (codeset_name[2] == 'F' || codeset_name[2] == 'f')
+      && strcmp (codeset_name + 3 + (codeset_name[3] == '-'), "8") == 0)
+    dfa->is_utf8 = 1;
+
+  /* We check exhaustively in the loop below if this charset is a
+     superset of ASCII.  */
+  dfa->map_notascii = 0;
+#endif
+
+#ifdef RE_ENABLE_I18N
+  if (dfa->mb_cur_max > 1)
+    {
+      if (dfa->is_utf8)
+	dfa->sb_char = (re_bitset_ptr_t) utf8_sb_map;
+      else
+	{
+	  int i, j, ch;
+
+	  dfa->sb_char = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+	  if (__glibc_unlikely (dfa->sb_char == NULL))
+	    return REG_ESPACE;
+
+	  /* Set the bits corresponding to single byte chars.  */
+	  for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
+	    for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+	      {
+		wint_t wch = __btowc (ch);
+		if (wch != WEOF)
+		  dfa->sb_char[i] |= (bitset_word_t) 1 << j;
+# ifndef _LIBC
+		if (isascii (ch) && wch != ch)
+		  dfa->map_notascii = 1;
+# endif
+	      }
+	}
+    }
+#endif
+
+  if (__glibc_unlikely (dfa->nodes == NULL || dfa->state_table == NULL))
+    return REG_ESPACE;
+  return REG_NOERROR;
+}
+
+/* Initialize WORD_CHAR table, which indicate which character is
+   "word".  In this case "word" means that it is the word construction
+   character used by some operators like "\<", "\>", etc.  */
+
+static void
+init_word_char (re_dfa_t *dfa)
+{
+  int i = 0;
+  int j;
+  int ch = 0;
+  dfa->word_ops_used = 1;
+  if (__glibc_likely (dfa->map_notascii == 0))
+    {
+      /* Avoid uint32_t and uint64_t as some non-GCC platforms lack
+	 them, an issue when this code is used in Gnulib.  */
+      bitset_word_t bits0 = 0x00000000;
+      bitset_word_t bits1 = 0x03ff0000;
+      bitset_word_t bits2 = 0x87fffffe;
+      bitset_word_t bits3 = 0x07fffffe;
+      if (BITSET_WORD_BITS == 64)
+	{
+	  /* Pacify gcc -Woverflow on 32-bit platformns.  */
+	  dfa->word_char[0] = bits1 << 31 << 1 | bits0;
+	  dfa->word_char[1] = bits3 << 31 << 1 | bits2;
+	  i = 2;
+	}
+      else if (BITSET_WORD_BITS == 32)
+	{
+	  dfa->word_char[0] = bits0;
+	  dfa->word_char[1] = bits1;
+	  dfa->word_char[2] = bits2;
+	  dfa->word_char[3] = bits3;
+	  i = 4;
+	}
+      else
+        goto general_case;
+      ch = 128;
+
+      if (__glibc_likely (dfa->is_utf8))
+	{
+	  memset (&dfa->word_char[i], '\0', (SBC_MAX - ch) / 8);
+	  return;
+	}
+    }
+
+ general_case:
+  for (; i < BITSET_WORDS; ++i)
+    for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
+      if (isalnum (ch) || ch == '_')
+	dfa->word_char[i] |= (bitset_word_t) 1 << j;
+}
+
+/* Free the work area which are only used while compiling.  */
+
+static void
+free_workarea_compile (regex_t *preg)
+{
+  re_dfa_t *dfa = preg->buffer;
+  bin_tree_storage_t *storage, *next;
+  for (storage = dfa->str_tree_storage; storage; storage = next)
+    {
+      next = storage->next;
+      re_free (storage);
+    }
+  dfa->str_tree_storage = NULL;
+  dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
+  dfa->str_tree = NULL;
+  re_free (dfa->org_indices);
+  dfa->org_indices = NULL;
+}
+
+/* Create initial states for all contexts.  */
+
+static reg_errcode_t
+create_initial_state (re_dfa_t *dfa)
+{
+  Idx first, i;
+  reg_errcode_t err;
+  re_node_set init_nodes;
+
+  /* Initial states have the epsilon closure of the node which is
+     the first node of the regular expression.  */
+  first = dfa->str_tree->first->node_idx;
+  dfa->init_node = first;
+  err = re_node_set_init_copy (&init_nodes, dfa->eclosures + first);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    return err;
+
+  /* The back-references which are in initial states can epsilon transit,
+     since in this case all of the subexpressions can be null.
+     Then we add epsilon closures of the nodes which are the next nodes of
+     the back-references.  */
+  if (dfa->nbackref > 0)
+    for (i = 0; i < init_nodes.nelem; ++i)
+      {
+	Idx node_idx = init_nodes.elems[i];
+	re_token_type_t type = dfa->nodes[node_idx].type;
+
+	Idx clexp_idx;
+	if (type != OP_BACK_REF)
+	  continue;
+	for (clexp_idx = 0; clexp_idx < init_nodes.nelem; ++clexp_idx)
+	  {
+	    re_token_t *clexp_node;
+	    clexp_node = dfa->nodes + init_nodes.elems[clexp_idx];
+	    if (clexp_node->type == OP_CLOSE_SUBEXP
+		&& clexp_node->opr.idx == dfa->nodes[node_idx].opr.idx)
+	      break;
+	  }
+	if (clexp_idx == init_nodes.nelem)
+	  continue;
+
+	if (type == OP_BACK_REF)
+	  {
+	    Idx dest_idx = dfa->edests[node_idx].elems[0];
+	    if (!re_node_set_contains (&init_nodes, dest_idx))
+	      {
+		reg_errcode_t merge_err
+                  = re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx);
+		if (merge_err != REG_NOERROR)
+		  return merge_err;
+		i = 0;
+	      }
+	  }
+      }
+
+  /* It must be the first time to invoke acquire_state.  */
+  dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0);
+  /* We don't check ERR here, since the initial state must not be NULL.  */
+  if (__glibc_unlikely (dfa->init_state == NULL))
+    return err;
+  if (dfa->init_state->has_constraint)
+    {
+      dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes,
+						       CONTEXT_WORD);
+      dfa->init_state_nl = re_acquire_state_context (&err, dfa, &init_nodes,
+						     CONTEXT_NEWLINE);
+      dfa->init_state_begbuf = re_acquire_state_context (&err, dfa,
+							 &init_nodes,
+							 CONTEXT_NEWLINE
+							 | CONTEXT_BEGBUF);
+      if (__glibc_unlikely (dfa->init_state_word == NULL
+			    || dfa->init_state_nl == NULL
+			    || dfa->init_state_begbuf == NULL))
+	return err;
+    }
+  else
+    dfa->init_state_word = dfa->init_state_nl
+      = dfa->init_state_begbuf = dfa->init_state;
+
+  re_node_set_free (&init_nodes);
+  return REG_NOERROR;
+}
+
+#ifdef RE_ENABLE_I18N
+/* If it is possible to do searching in single byte encoding instead of UTF-8
+   to speed things up, set dfa->mb_cur_max to 1, clear is_utf8 and change
+   DFA nodes where needed.  */
+
+static void
+optimize_utf8 (re_dfa_t *dfa)
+{
+  Idx node;
+  int i;
+  bool mb_chars = false;
+  bool has_period = false;
+
+  for (node = 0; node < dfa->nodes_len; ++node)
+    switch (dfa->nodes[node].type)
+      {
+      case CHARACTER:
+	if (dfa->nodes[node].opr.c >= ASCII_CHARS)
+	  mb_chars = true;
+	break;
+      case ANCHOR:
+	switch (dfa->nodes[node].opr.ctx_type)
+	  {
+	  case LINE_FIRST:
+	  case LINE_LAST:
+	  case BUF_FIRST:
+	  case BUF_LAST:
+	    break;
+	  default:
+	    /* Word anchors etc. cannot be handled.  It's okay to test
+	       opr.ctx_type since constraints (for all DFA nodes) are
+	       created by ORing one or more opr.ctx_type values.  */
+	    return;
+	  }
+	break;
+      case OP_PERIOD:
+	has_period = true;
+	break;
+      case OP_BACK_REF:
+      case OP_ALT:
+      case END_OF_RE:
+      case OP_DUP_ASTERISK:
+      case OP_OPEN_SUBEXP:
+      case OP_CLOSE_SUBEXP:
+	break;
+      case COMPLEX_BRACKET:
+	return;
+      case SIMPLE_BRACKET:
+	/* Just double check.  */
+	{
+	  int rshift = (ASCII_CHARS % BITSET_WORD_BITS == 0
+			? 0
+			: BITSET_WORD_BITS - ASCII_CHARS % BITSET_WORD_BITS);
+	  for (i = ASCII_CHARS / BITSET_WORD_BITS; i < BITSET_WORDS; ++i)
+	    {
+	      if (dfa->nodes[node].opr.sbcset[i] >> rshift != 0)
+		return;
+	      rshift = 0;
+	    }
+	}
+	break;
+      default:
+	abort ();
+      }
+
+  if (mb_chars || has_period)
+    for (node = 0; node < dfa->nodes_len; ++node)
+      {
+	if (dfa->nodes[node].type == CHARACTER
+	    && dfa->nodes[node].opr.c >= ASCII_CHARS)
+	  dfa->nodes[node].mb_partial = 0;
+	else if (dfa->nodes[node].type == OP_PERIOD)
+	  dfa->nodes[node].type = OP_UTF8_PERIOD;
+      }
+
+  /* The search can be in single byte locale.  */
+  dfa->mb_cur_max = 1;
+  dfa->is_utf8 = 0;
+  dfa->has_mb_node = dfa->nbackref > 0 || has_period;
+}
+#endif
+
+/* Analyze the structure tree, and calculate "first", "next", "edest",
+   "eclosure", and "inveclosure".  */
+
+static reg_errcode_t
+analyze (regex_t *preg)
+{
+  re_dfa_t *dfa = preg->buffer;
+  reg_errcode_t ret;
+
+  /* Allocate arrays.  */
+  dfa->nexts = re_malloc (Idx, dfa->nodes_alloc);
+  dfa->org_indices = re_malloc (Idx, dfa->nodes_alloc);
+  dfa->edests = re_malloc (re_node_set, dfa->nodes_alloc);
+  dfa->eclosures = re_malloc (re_node_set, dfa->nodes_alloc);
+  if (__glibc_unlikely (dfa->nexts == NULL || dfa->org_indices == NULL
+			|| dfa->edests == NULL || dfa->eclosures == NULL))
+    return REG_ESPACE;
+
+  dfa->subexp_map = re_malloc (Idx, preg->re_nsub);
+  if (dfa->subexp_map != NULL)
+    {
+      Idx i;
+      for (i = 0; i < preg->re_nsub; i++)
+	dfa->subexp_map[i] = i;
+      preorder (dfa->str_tree, optimize_subexps, dfa);
+      for (i = 0; i < preg->re_nsub; i++)
+	if (dfa->subexp_map[i] != i)
+	  break;
+      if (i == preg->re_nsub)
+	{
+	  re_free (dfa->subexp_map);
+	  dfa->subexp_map = NULL;
+	}
+    }
+
+  ret = postorder (dfa->str_tree, lower_subexps, preg);
+  if (__glibc_unlikely (ret != REG_NOERROR))
+    return ret;
+  ret = postorder (dfa->str_tree, calc_first, dfa);
+  if (__glibc_unlikely (ret != REG_NOERROR))
+    return ret;
+  preorder (dfa->str_tree, calc_next, dfa);
+  ret = preorder (dfa->str_tree, link_nfa_nodes, dfa);
+  if (__glibc_unlikely (ret != REG_NOERROR))
+    return ret;
+  ret = calc_eclosure (dfa);
+  if (__glibc_unlikely (ret != REG_NOERROR))
+    return ret;
+
+  /* We only need this during the prune_impossible_nodes pass in regexec.c;
+     skip it if p_i_n will not run, as calc_inveclosure can be quadratic.  */
+  if ((!preg->no_sub && preg->re_nsub > 0 && dfa->has_plural_match)
+      || dfa->nbackref)
+    {
+      dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len);
+      if (__glibc_unlikely (dfa->inveclosures == NULL))
+	return REG_ESPACE;
+      ret = calc_inveclosure (dfa);
+    }
+
+  return ret;
+}
+
+/* Our parse trees are very unbalanced, so we cannot use a stack to
+   implement parse tree visits.  Instead, we use parent pointers and
+   some hairy code in these two functions.  */
+static reg_errcode_t
+postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
+	   void *extra)
+{
+  bin_tree_t *node, *prev;
+
+  for (node = root; ; )
+    {
+      /* Descend down the tree, preferably to the left (or to the right
+	 if that's the only child).  */
+      while (node->left || node->right)
+	if (node->left)
+	  node = node->left;
+	else
+	  node = node->right;
+
+      do
+	{
+	  reg_errcode_t err = fn (extra, node);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+	  if (node->parent == NULL)
+	    return REG_NOERROR;
+	  prev = node;
+	  node = node->parent;
+	}
+      /* Go up while we have a node that is reached from the right.  */
+      while (node->right == prev || node->right == NULL);
+      node = node->right;
+    }
+}
+
+static reg_errcode_t
+preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
+	  void *extra)
+{
+  bin_tree_t *node;
+
+  for (node = root; ; )
+    {
+      reg_errcode_t err = fn (extra, node);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	return err;
+
+      /* Go to the left node, or up and to the right.  */
+      if (node->left)
+	node = node->left;
+      else
+	{
+	  bin_tree_t *prev = NULL;
+	  while (node->right == prev || node->right == NULL)
+	    {
+	      prev = node;
+	      node = node->parent;
+	      if (!node)
+		return REG_NOERROR;
+	    }
+	  node = node->right;
+	}
+    }
+}
+
+/* Optimization pass: if a SUBEXP is entirely contained, strip it and tell
+   re_search_internal to map the inner one's opr.idx to this one's.  Adjust
+   backreferences as well.  Requires a preorder visit.  */
+static reg_errcode_t
+optimize_subexps (void *extra, bin_tree_t *node)
+{
+  re_dfa_t *dfa = (re_dfa_t *) extra;
+
+  if (node->token.type == OP_BACK_REF && dfa->subexp_map)
+    {
+      int idx = node->token.opr.idx;
+      node->token.opr.idx = dfa->subexp_map[idx];
+      dfa->used_bkref_map |= 1 << node->token.opr.idx;
+    }
+
+  else if (node->token.type == SUBEXP
+	   && node->left && node->left->token.type == SUBEXP)
+    {
+      Idx other_idx = node->left->token.opr.idx;
+
+      node->left = node->left->left;
+      if (node->left)
+	node->left->parent = node;
+
+      dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx];
+      if (other_idx < BITSET_WORD_BITS)
+	dfa->used_bkref_map &= ~((bitset_word_t) 1 << other_idx);
+    }
+
+  return REG_NOERROR;
+}
+
+/* Lowering pass: Turn each SUBEXP node into the appropriate concatenation
+   of OP_OPEN_SUBEXP, the body of the SUBEXP (if any) and OP_CLOSE_SUBEXP.  */
+static reg_errcode_t
+lower_subexps (void *extra, bin_tree_t *node)
+{
+  regex_t *preg = (regex_t *) extra;
+  reg_errcode_t err = REG_NOERROR;
+
+  if (node->left && node->left->token.type == SUBEXP)
+    {
+      node->left = lower_subexp (&err, preg, node->left);
+      if (node->left)
+	node->left->parent = node;
+    }
+  if (node->right && node->right->token.type == SUBEXP)
+    {
+      node->right = lower_subexp (&err, preg, node->right);
+      if (node->right)
+	node->right->parent = node;
+    }
+
+  return err;
+}
+
+static bin_tree_t *
+lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node)
+{
+  re_dfa_t *dfa = preg->buffer;
+  bin_tree_t *body = node->left;
+  bin_tree_t *op, *cls, *tree1, *tree;
+
+  if (preg->no_sub
+      /* We do not optimize empty subexpressions, because otherwise we may
+	 have bad CONCAT nodes with NULL children.  This is obviously not
+	 very common, so we do not lose much.  An example that triggers
+	 this case is the sed "script" /\(\)/x.  */
+      && node->left != NULL
+      && (node->token.opr.idx >= BITSET_WORD_BITS
+	  || !(dfa->used_bkref_map
+	       & ((bitset_word_t) 1 << node->token.opr.idx))))
+    return node->left;
+
+  /* Convert the SUBEXP node to the concatenation of an
+     OP_OPEN_SUBEXP, the contents, and an OP_CLOSE_SUBEXP.  */
+  op = create_tree (dfa, NULL, NULL, OP_OPEN_SUBEXP);
+  cls = create_tree (dfa, NULL, NULL, OP_CLOSE_SUBEXP);
+  tree1 = body ? create_tree (dfa, body, cls, CONCAT) : cls;
+  tree = create_tree (dfa, op, tree1, CONCAT);
+  if (__glibc_unlikely (tree == NULL || tree1 == NULL
+			|| op == NULL || cls == NULL))
+    {
+      *err = REG_ESPACE;
+      return NULL;
+    }
+
+  op->token.opr.idx = cls->token.opr.idx = node->token.opr.idx;
+  op->token.opt_subexp = cls->token.opt_subexp = node->token.opt_subexp;
+  return tree;
+}
+
+/* Pass 1 in building the NFA: compute FIRST and create unlinked automaton
+   nodes.  Requires a postorder visit.  */
+static reg_errcode_t
+calc_first (void *extra, bin_tree_t *node)
+{
+  re_dfa_t *dfa = (re_dfa_t *) extra;
+  if (node->token.type == CONCAT)
+    {
+      node->first = node->left->first;
+      node->node_idx = node->left->node_idx;
+    }
+  else
+    {
+      node->first = node;
+      node->node_idx = re_dfa_add_node (dfa, node->token);
+      if (__glibc_unlikely (node->node_idx == -1))
+	return REG_ESPACE;
+      if (node->token.type == ANCHOR)
+	dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type;
+    }
+  return REG_NOERROR;
+}
+
+/* Pass 2: compute NEXT on the tree.  Preorder visit.  */
+static reg_errcode_t
+calc_next (void *extra, bin_tree_t *node)
+{
+  switch (node->token.type)
+    {
+    case OP_DUP_ASTERISK:
+      node->left->next = node;
+      break;
+    case CONCAT:
+      node->left->next = node->right->first;
+      node->right->next = node->next;
+      break;
+    default:
+      if (node->left)
+	node->left->next = node->next;
+      if (node->right)
+	node->right->next = node->next;
+      break;
+    }
+  return REG_NOERROR;
+}
+
+/* Pass 3: link all DFA nodes to their NEXT node (any order will do).  */
+static reg_errcode_t
+link_nfa_nodes (void *extra, bin_tree_t *node)
+{
+  re_dfa_t *dfa = (re_dfa_t *) extra;
+  Idx idx = node->node_idx;
+  reg_errcode_t err = REG_NOERROR;
+
+  switch (node->token.type)
+    {
+    case CONCAT:
+      break;
+
+    case END_OF_RE:
+      assert (node->next == NULL);
+      break;
+
+    case OP_DUP_ASTERISK:
+    case OP_ALT:
+      {
+	Idx left, right;
+	dfa->has_plural_match = 1;
+	if (node->left != NULL)
+	  left = node->left->first->node_idx;
+	else
+	  left = node->next->node_idx;
+	if (node->right != NULL)
+	  right = node->right->first->node_idx;
+	else
+	  right = node->next->node_idx;
+	assert (left > -1);
+	assert (right > -1);
+	err = re_node_set_init_2 (dfa->edests + idx, left, right);
+      }
+      break;
+
+    case ANCHOR:
+    case OP_OPEN_SUBEXP:
+    case OP_CLOSE_SUBEXP:
+      err = re_node_set_init_1 (dfa->edests + idx, node->next->node_idx);
+      break;
+
+    case OP_BACK_REF:
+      dfa->nexts[idx] = node->next->node_idx;
+      if (node->token.type == OP_BACK_REF)
+	err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]);
+      break;
+
+    default:
+      assert (!IS_EPSILON_NODE (node->token.type));
+      dfa->nexts[idx] = node->next->node_idx;
+      break;
+    }
+
+  return err;
+}
+
+/* Duplicate the epsilon closure of the node ROOT_NODE.
+   Note that duplicated nodes have constraint INIT_CONSTRAINT in addition
+   to their own constraint.  */
+
+static reg_errcode_t
+duplicate_node_closure (re_dfa_t *dfa, Idx top_org_node, Idx top_clone_node,
+			Idx root_node, unsigned int init_constraint)
+{
+  Idx org_node, clone_node;
+  bool ok;
+  unsigned int constraint = init_constraint;
+  for (org_node = top_org_node, clone_node = top_clone_node;;)
+    {
+      Idx org_dest, clone_dest;
+      if (dfa->nodes[org_node].type == OP_BACK_REF)
+	{
+	  /* If the back reference epsilon-transit, its destination must
+	     also have the constraint.  Then duplicate the epsilon closure
+	     of the destination of the back reference, and store it in
+	     edests of the back reference.  */
+	  org_dest = dfa->nexts[org_node];
+	  re_node_set_empty (dfa->edests + clone_node);
+	  clone_dest = duplicate_node (dfa, org_dest, constraint);
+	  if (__glibc_unlikely (clone_dest == -1))
+	    return REG_ESPACE;
+	  dfa->nexts[clone_node] = dfa->nexts[org_node];
+	  ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+	  if (__glibc_unlikely (! ok))
+	    return REG_ESPACE;
+	}
+      else if (dfa->edests[org_node].nelem == 0)
+	{
+	  /* In case of the node can't epsilon-transit, don't duplicate the
+	     destination and store the original destination as the
+	     destination of the node.  */
+	  dfa->nexts[clone_node] = dfa->nexts[org_node];
+	  break;
+	}
+      else if (dfa->edests[org_node].nelem == 1)
+	{
+	  /* In case of the node can epsilon-transit, and it has only one
+	     destination.  */
+	  org_dest = dfa->edests[org_node].elems[0];
+	  re_node_set_empty (dfa->edests + clone_node);
+	  /* If the node is root_node itself, it means the epsilon closure
+	     has a loop.  Then tie it to the destination of the root_node.  */
+	  if (org_node == root_node && clone_node != org_node)
+	    {
+	      ok = re_node_set_insert (dfa->edests + clone_node, org_dest);
+	      if (__glibc_unlikely (! ok))
+	        return REG_ESPACE;
+	      break;
+	    }
+	  /* In case the node has another constraint, append it.  */
+	  constraint |= dfa->nodes[org_node].constraint;
+	  clone_dest = duplicate_node (dfa, org_dest, constraint);
+	  if (__glibc_unlikely (clone_dest == -1))
+	    return REG_ESPACE;
+	  ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+	  if (__glibc_unlikely (! ok))
+	    return REG_ESPACE;
+	}
+      else /* dfa->edests[org_node].nelem == 2 */
+	{
+	  /* In case of the node can epsilon-transit, and it has two
+	     destinations. In the bin_tree_t and DFA, that's '|' and '*'.   */
+	  org_dest = dfa->edests[org_node].elems[0];
+	  re_node_set_empty (dfa->edests + clone_node);
+	  /* Search for a duplicated node which satisfies the constraint.  */
+	  clone_dest = search_duplicated_node (dfa, org_dest, constraint);
+	  if (clone_dest == -1)
+	    {
+	      /* There is no such duplicated node, create a new one.  */
+	      reg_errcode_t err;
+	      clone_dest = duplicate_node (dfa, org_dest, constraint);
+	      if (__glibc_unlikely (clone_dest == -1))
+		return REG_ESPACE;
+	      ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+	      if (__glibc_unlikely (! ok))
+		return REG_ESPACE;
+	      err = duplicate_node_closure (dfa, org_dest, clone_dest,
+					    root_node, constraint);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		return err;
+	    }
+	  else
+	    {
+	      /* There is a duplicated node which satisfies the constraint,
+		 use it to avoid infinite loop.  */
+	      ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+	      if (__glibc_unlikely (! ok))
+		return REG_ESPACE;
+	    }
+
+	  org_dest = dfa->edests[org_node].elems[1];
+	  clone_dest = duplicate_node (dfa, org_dest, constraint);
+	  if (__glibc_unlikely (clone_dest == -1))
+	    return REG_ESPACE;
+	  ok = re_node_set_insert (dfa->edests + clone_node, clone_dest);
+	  if (__glibc_unlikely (! ok))
+	    return REG_ESPACE;
+	}
+      org_node = org_dest;
+      clone_node = clone_dest;
+    }
+  return REG_NOERROR;
+}
+
+/* Search for a node which is duplicated from the node ORG_NODE, and
+   satisfies the constraint CONSTRAINT.  */
+
+static Idx
+search_duplicated_node (const re_dfa_t *dfa, Idx org_node,
+			unsigned int constraint)
+{
+  Idx idx;
+  for (idx = dfa->nodes_len - 1; dfa->nodes[idx].duplicated && idx > 0; --idx)
+    {
+      if (org_node == dfa->org_indices[idx]
+	  && constraint == dfa->nodes[idx].constraint)
+	return idx; /* Found.  */
+    }
+  return -1; /* Not found.  */
+}
+
+/* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT.
+   Return the index of the new node, or -1 if insufficient storage is
+   available.  */
+
+static Idx
+duplicate_node (re_dfa_t *dfa, Idx org_idx, unsigned int constraint)
+{
+  Idx dup_idx = re_dfa_add_node (dfa, dfa->nodes[org_idx]);
+  if (__glibc_likely (dup_idx != -1))
+    {
+      dfa->nodes[dup_idx].constraint = constraint;
+      dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].constraint;
+      dfa->nodes[dup_idx].duplicated = 1;
+
+      /* Store the index of the original node.  */
+      dfa->org_indices[dup_idx] = org_idx;
+    }
+  return dup_idx;
+}
+
+static reg_errcode_t
+calc_inveclosure (re_dfa_t *dfa)
+{
+  Idx src, idx;
+  bool ok;
+  for (idx = 0; idx < dfa->nodes_len; ++idx)
+    re_node_set_init_empty (dfa->inveclosures + idx);
+
+  for (src = 0; src < dfa->nodes_len; ++src)
+    {
+      Idx *elems = dfa->eclosures[src].elems;
+      for (idx = 0; idx < dfa->eclosures[src].nelem; ++idx)
+	{
+	  ok = re_node_set_insert_last (dfa->inveclosures + elems[idx], src);
+	  if (__glibc_unlikely (! ok))
+	    return REG_ESPACE;
+	}
+    }
+
+  return REG_NOERROR;
+}
+
+/* Calculate "eclosure" for all the node in DFA.  */
+
+static reg_errcode_t
+calc_eclosure (re_dfa_t *dfa)
+{
+  Idx node_idx;
+  bool incomplete;
+#ifdef DEBUG
+  assert (dfa->nodes_len > 0);
+#endif
+  incomplete = false;
+  /* For each nodes, calculate epsilon closure.  */
+  for (node_idx = 0; ; ++node_idx)
+    {
+      reg_errcode_t err;
+      re_node_set eclosure_elem;
+      if (node_idx == dfa->nodes_len)
+	{
+	  if (!incomplete)
+	    break;
+	  incomplete = false;
+	  node_idx = 0;
+	}
+
+#ifdef DEBUG
+      assert (dfa->eclosures[node_idx].nelem != -1);
+#endif
+
+      /* If we have already calculated, skip it.  */
+      if (dfa->eclosures[node_idx].nelem != 0)
+	continue;
+      /* Calculate epsilon closure of 'node_idx'.  */
+      err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, true);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	return err;
+
+      if (dfa->eclosures[node_idx].nelem == 0)
+	{
+	  incomplete = true;
+	  re_node_set_free (&eclosure_elem);
+	}
+    }
+  return REG_NOERROR;
+}
+
+/* Calculate epsilon closure of NODE.  */
+
+static reg_errcode_t
+calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root)
+{
+  reg_errcode_t err;
+  Idx i;
+  re_node_set eclosure;
+  bool ok;
+  bool incomplete = false;
+  err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    return err;
+
+  /* This indicates that we are calculating this node now.
+     We reference this value to avoid infinite loop.  */
+  dfa->eclosures[node].nelem = -1;
+
+  /* If the current node has constraints, duplicate all nodes
+     since they must inherit the constraints.  */
+  if (dfa->nodes[node].constraint
+      && dfa->edests[node].nelem
+      && !dfa->nodes[dfa->edests[node].elems[0]].duplicated)
+    {
+      err = duplicate_node_closure (dfa, node, node, node,
+				    dfa->nodes[node].constraint);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	return err;
+    }
+
+  /* Expand each epsilon destination nodes.  */
+  if (IS_EPSILON_NODE(dfa->nodes[node].type))
+    for (i = 0; i < dfa->edests[node].nelem; ++i)
+      {
+	re_node_set eclosure_elem;
+	Idx edest = dfa->edests[node].elems[i];
+	/* If calculating the epsilon closure of 'edest' is in progress,
+	   return intermediate result.  */
+	if (dfa->eclosures[edest].nelem == -1)
+	  {
+	    incomplete = true;
+	    continue;
+	  }
+	/* If we haven't calculated the epsilon closure of 'edest' yet,
+	   calculate now. Otherwise use calculated epsilon closure.  */
+	if (dfa->eclosures[edest].nelem == 0)
+	  {
+	    err = calc_eclosure_iter (&eclosure_elem, dfa, edest, false);
+	    if (__glibc_unlikely (err != REG_NOERROR))
+	      return err;
+	  }
+	else
+	  eclosure_elem = dfa->eclosures[edest];
+	/* Merge the epsilon closure of 'edest'.  */
+	err = re_node_set_merge (&eclosure, &eclosure_elem);
+	if (__glibc_unlikely (err != REG_NOERROR))
+	  return err;
+	/* If the epsilon closure of 'edest' is incomplete,
+	   the epsilon closure of this node is also incomplete.  */
+	if (dfa->eclosures[edest].nelem == 0)
+	  {
+	    incomplete = true;
+	    re_node_set_free (&eclosure_elem);
+	  }
+      }
+
+  /* An epsilon closure includes itself.  */
+  ok = re_node_set_insert (&eclosure, node);
+  if (__glibc_unlikely (! ok))
+    return REG_ESPACE;
+  if (incomplete && !root)
+    dfa->eclosures[node].nelem = 0;
+  else
+    dfa->eclosures[node] = eclosure;
+  *new_set = eclosure;
+  return REG_NOERROR;
+}
+
+/* Functions for token which are used in the parser.  */
+
+/* Fetch a token from INPUT.
+   We must not use this function inside bracket expressions.  */
+
+static void
+fetch_token (re_token_t *result, re_string_t *input, reg_syntax_t syntax)
+{
+  re_string_skip_bytes (input, peek_token (result, input, syntax));
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+   We must not use this function inside bracket expressions.  */
+
+static int
+peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
+{
+  unsigned char c;
+
+  if (re_string_eoi (input))
+    {
+      token->type = END_OF_RE;
+      return 0;
+    }
+
+  c = re_string_peek_byte (input, 0);
+  token->opr.c = c;
+
+  token->word_char = 0;
+#ifdef RE_ENABLE_I18N
+  token->mb_partial = 0;
+  if (input->mb_cur_max > 1
+      && !re_string_first_byte (input, re_string_cur_idx (input)))
+    {
+      token->type = CHARACTER;
+      token->mb_partial = 1;
+      return 1;
+    }
+#endif
+  if (c == '\\')
+    {
+      unsigned char c2;
+      if (re_string_cur_idx (input) + 1 >= re_string_length (input))
+	{
+	  token->type = BACK_SLASH;
+	  return 1;
+	}
+
+      c2 = re_string_peek_byte_case (input, 1);
+      token->opr.c = c2;
+      token->type = CHARACTER;
+#ifdef RE_ENABLE_I18N
+      if (input->mb_cur_max > 1)
+	{
+	  wint_t wc = re_string_wchar_at (input,
+					  re_string_cur_idx (input) + 1);
+	  token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
+	}
+      else
+#endif
+	token->word_char = IS_WORD_CHAR (c2) != 0;
+
+      switch (c2)
+	{
+	case '|':
+	  if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_NO_BK_VBAR))
+	    token->type = OP_ALT;
+	  break;
+	case '1': case '2': case '3': case '4': case '5':
+	case '6': case '7': case '8': case '9':
+	  if (!(syntax & RE_NO_BK_REFS))
+	    {
+	      token->type = OP_BACK_REF;
+	      token->opr.idx = c2 - '1';
+	    }
+	  break;
+	case '<':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    {
+	      token->type = ANCHOR;
+	      token->opr.ctx_type = WORD_FIRST;
+	    }
+	  break;
+	case '>':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    {
+	      token->type = ANCHOR;
+	      token->opr.ctx_type = WORD_LAST;
+	    }
+	  break;
+	case 'b':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    {
+	      token->type = ANCHOR;
+	      token->opr.ctx_type = WORD_DELIM;
+	    }
+	  break;
+	case 'B':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    {
+	      token->type = ANCHOR;
+	      token->opr.ctx_type = NOT_WORD_DELIM;
+	    }
+	  break;
+	case 'w':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    token->type = OP_WORD;
+	  break;
+	case 'W':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    token->type = OP_NOTWORD;
+	  break;
+	case 's':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    token->type = OP_SPACE;
+	  break;
+	case 'S':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    token->type = OP_NOTSPACE;
+	  break;
+	case '`':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    {
+	      token->type = ANCHOR;
+	      token->opr.ctx_type = BUF_FIRST;
+	    }
+	  break;
+	case '\'':
+	  if (!(syntax & RE_NO_GNU_OPS))
+	    {
+	      token->type = ANCHOR;
+	      token->opr.ctx_type = BUF_LAST;
+	    }
+	  break;
+	case '(':
+	  if (!(syntax & RE_NO_BK_PARENS))
+	    token->type = OP_OPEN_SUBEXP;
+	  break;
+	case ')':
+	  if (!(syntax & RE_NO_BK_PARENS))
+	    token->type = OP_CLOSE_SUBEXP;
+	  break;
+	case '+':
+	  if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+	    token->type = OP_DUP_PLUS;
+	  break;
+	case '?':
+	  if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+	    token->type = OP_DUP_QUESTION;
+	  break;
+	case '{':
+	  if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+	    token->type = OP_OPEN_DUP_NUM;
+	  break;
+	case '}':
+	  if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+	    token->type = OP_CLOSE_DUP_NUM;
+	  break;
+	default:
+	  break;
+	}
+      return 2;
+    }
+
+  token->type = CHARACTER;
+#ifdef RE_ENABLE_I18N
+  if (input->mb_cur_max > 1)
+    {
+      wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input));
+      token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
+    }
+  else
+#endif
+    token->word_char = IS_WORD_CHAR (token->opr.c);
+
+  switch (c)
+    {
+    case '\n':
+      if (syntax & RE_NEWLINE_ALT)
+	token->type = OP_ALT;
+      break;
+    case '|':
+      if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_NO_BK_VBAR))
+	token->type = OP_ALT;
+      break;
+    case '*':
+      token->type = OP_DUP_ASTERISK;
+      break;
+    case '+':
+      if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+	token->type = OP_DUP_PLUS;
+      break;
+    case '?':
+      if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+	token->type = OP_DUP_QUESTION;
+      break;
+    case '{':
+      if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+	token->type = OP_OPEN_DUP_NUM;
+      break;
+    case '}':
+      if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+	token->type = OP_CLOSE_DUP_NUM;
+      break;
+    case '(':
+      if (syntax & RE_NO_BK_PARENS)
+	token->type = OP_OPEN_SUBEXP;
+      break;
+    case ')':
+      if (syntax & RE_NO_BK_PARENS)
+	token->type = OP_CLOSE_SUBEXP;
+      break;
+    case '[':
+      token->type = OP_OPEN_BRACKET;
+      break;
+    case '.':
+      token->type = OP_PERIOD;
+      break;
+    case '^':
+      if (!(syntax & (RE_CONTEXT_INDEP_ANCHORS | RE_CARET_ANCHORS_HERE))
+	  && re_string_cur_idx (input) != 0)
+	{
+	  char prev = re_string_peek_byte (input, -1);
+	  if (!(syntax & RE_NEWLINE_ALT) || prev != '\n')
+	    break;
+	}
+      token->type = ANCHOR;
+      token->opr.ctx_type = LINE_FIRST;
+      break;
+    case '$':
+      if (!(syntax & RE_CONTEXT_INDEP_ANCHORS)
+	  && re_string_cur_idx (input) + 1 != re_string_length (input))
+	{
+	  re_token_t next;
+	  re_string_skip_bytes (input, 1);
+	  peek_token (&next, input, syntax);
+	  re_string_skip_bytes (input, -1);
+	  if (next.type != OP_ALT && next.type != OP_CLOSE_SUBEXP)
+	    break;
+	}
+      token->type = ANCHOR;
+      token->opr.ctx_type = LINE_LAST;
+      break;
+    default:
+      break;
+    }
+  return 1;
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+   We must not use this function out of bracket expressions.  */
+
+static int
+peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
+{
+  unsigned char c;
+  if (re_string_eoi (input))
+    {
+      token->type = END_OF_RE;
+      return 0;
+    }
+  c = re_string_peek_byte (input, 0);
+  token->opr.c = c;
+
+#ifdef RE_ENABLE_I18N
+  if (input->mb_cur_max > 1
+      && !re_string_first_byte (input, re_string_cur_idx (input)))
+    {
+      token->type = CHARACTER;
+      return 1;
+    }
+#endif /* RE_ENABLE_I18N */
+
+  if (c == '\\' && (syntax & RE_BACKSLASH_ESCAPE_IN_LISTS)
+      && re_string_cur_idx (input) + 1 < re_string_length (input))
+    {
+      /* In this case, '\' escape a character.  */
+      unsigned char c2;
+      re_string_skip_bytes (input, 1);
+      c2 = re_string_peek_byte (input, 0);
+      token->opr.c = c2;
+      token->type = CHARACTER;
+      return 1;
+    }
+  if (c == '[') /* '[' is a special char in a bracket exps.  */
+    {
+      unsigned char c2;
+      int token_len;
+      if (re_string_cur_idx (input) + 1 < re_string_length (input))
+	c2 = re_string_peek_byte (input, 1);
+      else
+	c2 = 0;
+      token->opr.c = c2;
+      token_len = 2;
+      switch (c2)
+	{
+	case '.':
+	  token->type = OP_OPEN_COLL_ELEM;
+	  break;
+
+	case '=':
+	  token->type = OP_OPEN_EQUIV_CLASS;
+	  break;
+
+	case ':':
+	  if (syntax & RE_CHAR_CLASSES)
+	    {
+	      token->type = OP_OPEN_CHAR_CLASS;
+	      break;
+	    }
+	  FALLTHROUGH;
+	default:
+	  token->type = CHARACTER;
+	  token->opr.c = c;
+	  token_len = 1;
+	  break;
+	}
+      return token_len;
+    }
+  switch (c)
+    {
+    case '-':
+      token->type = OP_CHARSET_RANGE;
+      break;
+    case ']':
+      token->type = OP_CLOSE_BRACKET;
+      break;
+    case '^':
+      token->type = OP_NON_MATCH_LIST;
+      break;
+    default:
+      token->type = CHARACTER;
+    }
+  return 1;
+}
+
+/* Functions for parser.  */
+
+/* Entry point of the parser.
+   Parse the regular expression REGEXP and return the structure tree.
+   If an error occurs, ERR is set by error code, and return NULL.
+   This function build the following tree, from regular expression <reg_exp>:
+	   CAT
+	   / \
+	  /   \
+   <reg_exp>  EOR
+
+   CAT means concatenation.
+   EOR means end of regular expression.  */
+
+static bin_tree_t *
+parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax,
+       reg_errcode_t *err)
+{
+  re_dfa_t *dfa = preg->buffer;
+  bin_tree_t *tree, *eor, *root;
+  re_token_t current_token;
+  dfa->syntax = syntax;
+  fetch_token (&current_token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+  tree = parse_reg_exp (regexp, preg, &current_token, syntax, 0, err);
+  if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+    return NULL;
+  eor = create_tree (dfa, NULL, NULL, END_OF_RE);
+  if (tree != NULL)
+    root = create_tree (dfa, tree, eor, CONCAT);
+  else
+    root = eor;
+  if (__glibc_unlikely (eor == NULL || root == NULL))
+    {
+      *err = REG_ESPACE;
+      return NULL;
+    }
+  return root;
+}
+
+/* This function build the following tree, from regular expression
+   <branch1>|<branch2>:
+	   ALT
+	   / \
+	  /   \
+   <branch1> <branch2>
+
+   ALT means alternative, which represents the operator '|'.  */
+
+static bin_tree_t *
+parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
+	       reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+  re_dfa_t *dfa = preg->buffer;
+  bin_tree_t *tree, *branch = NULL;
+  bitset_word_t initial_bkref_map = dfa->completed_bkref_map;
+  tree = parse_branch (regexp, preg, token, syntax, nest, err);
+  if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+    return NULL;
+
+  while (token->type == OP_ALT)
+    {
+      fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+      if (token->type != OP_ALT && token->type != END_OF_RE
+	  && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+	{
+	  bitset_word_t accumulated_bkref_map = dfa->completed_bkref_map;
+	  dfa->completed_bkref_map = initial_bkref_map;
+	  branch = parse_branch (regexp, preg, token, syntax, nest, err);
+	  if (__glibc_unlikely (*err != REG_NOERROR && branch == NULL))
+	    {
+	      if (tree != NULL)
+		postorder (tree, free_tree, NULL);
+	      return NULL;
+	    }
+	  dfa->completed_bkref_map |= accumulated_bkref_map;
+	}
+      else
+	branch = NULL;
+      tree = create_tree (dfa, tree, branch, OP_ALT);
+      if (__glibc_unlikely (tree == NULL))
+	{
+	  *err = REG_ESPACE;
+	  return NULL;
+	}
+    }
+  return tree;
+}
+
+/* This function build the following tree, from regular expression
+   <exp1><exp2>:
+	CAT
+	/ \
+       /   \
+   <exp1> <exp2>
+
+   CAT means concatenation.  */
+
+static bin_tree_t *
+parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
+	      reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+  bin_tree_t *tree, *expr;
+  re_dfa_t *dfa = preg->buffer;
+  tree = parse_expression (regexp, preg, token, syntax, nest, err);
+  if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+    return NULL;
+
+  while (token->type != OP_ALT && token->type != END_OF_RE
+	 && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+    {
+      expr = parse_expression (regexp, preg, token, syntax, nest, err);
+      if (__glibc_unlikely (*err != REG_NOERROR && expr == NULL))
+	{
+	  if (tree != NULL)
+	    postorder (tree, free_tree, NULL);
+	  return NULL;
+	}
+      if (tree != NULL && expr != NULL)
+	{
+	  bin_tree_t *newtree = create_tree (dfa, tree, expr, CONCAT);
+	  if (newtree == NULL)
+	    {
+	      postorder (expr, free_tree, NULL);
+	      postorder (tree, free_tree, NULL);
+	      *err = REG_ESPACE;
+	      return NULL;
+	    }
+	  tree = newtree;
+	}
+      else if (tree == NULL)
+	tree = expr;
+      /* Otherwise expr == NULL, we don't need to create new tree.  */
+    }
+  return tree;
+}
+
+/* This function build the following tree, from regular expression a*:
+	 *
+	 |
+	 a
+*/
+
+static bin_tree_t *
+parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
+		  reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+  re_dfa_t *dfa = preg->buffer;
+  bin_tree_t *tree;
+  switch (token->type)
+    {
+    case CHARACTER:
+      tree = create_token_tree (dfa, NULL, NULL, token);
+      if (__glibc_unlikely (tree == NULL))
+	{
+	  *err = REG_ESPACE;
+	  return NULL;
+	}
+#ifdef RE_ENABLE_I18N
+      if (dfa->mb_cur_max > 1)
+	{
+	  while (!re_string_eoi (regexp)
+		 && !re_string_first_byte (regexp, re_string_cur_idx (regexp)))
+	    {
+	      bin_tree_t *mbc_remain;
+	      fetch_token (token, regexp, syntax);
+	      mbc_remain = create_token_tree (dfa, NULL, NULL, token);
+	      tree = create_tree (dfa, tree, mbc_remain, CONCAT);
+	      if (__glibc_unlikely (mbc_remain == NULL || tree == NULL))
+		{
+		  *err = REG_ESPACE;
+		  return NULL;
+		}
+	    }
+	}
+#endif
+      break;
+
+    case OP_OPEN_SUBEXP:
+      tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err);
+      if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+	return NULL;
+      break;
+
+    case OP_OPEN_BRACKET:
+      tree = parse_bracket_exp (regexp, dfa, token, syntax, err);
+      if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+	return NULL;
+      break;
+
+    case OP_BACK_REF:
+      if (!__glibc_likely (dfa->completed_bkref_map & (1 << token->opr.idx)))
+	{
+	  *err = REG_ESUBREG;
+	  return NULL;
+	}
+      dfa->used_bkref_map |= 1 << token->opr.idx;
+      tree = create_token_tree (dfa, NULL, NULL, token);
+      if (__glibc_unlikely (tree == NULL))
+	{
+	  *err = REG_ESPACE;
+	  return NULL;
+	}
+      ++dfa->nbackref;
+      dfa->has_mb_node = 1;
+      break;
+
+    case OP_OPEN_DUP_NUM:
+      if (syntax & RE_CONTEXT_INVALID_DUP)
+	{
+	  *err = REG_BADRPT;
+	  return NULL;
+	}
+      FALLTHROUGH;
+    case OP_DUP_ASTERISK:
+    case OP_DUP_PLUS:
+    case OP_DUP_QUESTION:
+      if (syntax & RE_CONTEXT_INVALID_OPS)
+	{
+	  *err = REG_BADRPT;
+	  return NULL;
+	}
+      else if (syntax & RE_CONTEXT_INDEP_OPS)
+	{
+	  fetch_token (token, regexp, syntax);
+	  return parse_expression (regexp, preg, token, syntax, nest, err);
+	}
+      FALLTHROUGH;
+    case OP_CLOSE_SUBEXP:
+      if ((token->type == OP_CLOSE_SUBEXP)
+	  && !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD))
+	{
+	  *err = REG_ERPAREN;
+	  return NULL;
+	}
+      FALLTHROUGH;
+    case OP_CLOSE_DUP_NUM:
+      /* We treat it as a normal character.  */
+
+      /* Then we can these characters as normal characters.  */
+      token->type = CHARACTER;
+      /* mb_partial and word_char bits should be initialized already
+	 by peek_token.  */
+      tree = create_token_tree (dfa, NULL, NULL, token);
+      if (__glibc_unlikely (tree == NULL))
+	{
+	  *err = REG_ESPACE;
+	  return NULL;
+	}
+      break;
+
+    case ANCHOR:
+      if ((token->opr.ctx_type
+	   & (WORD_DELIM | NOT_WORD_DELIM | WORD_FIRST | WORD_LAST))
+	  && dfa->word_ops_used == 0)
+	init_word_char (dfa);
+      if (token->opr.ctx_type == WORD_DELIM
+	  || token->opr.ctx_type == NOT_WORD_DELIM)
+	{
+	  bin_tree_t *tree_first, *tree_last;
+	  if (token->opr.ctx_type == WORD_DELIM)
+	    {
+	      token->opr.ctx_type = WORD_FIRST;
+	      tree_first = create_token_tree (dfa, NULL, NULL, token);
+	      token->opr.ctx_type = WORD_LAST;
+	    }
+	  else
+	    {
+	      token->opr.ctx_type = INSIDE_WORD;
+	      tree_first = create_token_tree (dfa, NULL, NULL, token);
+	      token->opr.ctx_type = INSIDE_NOTWORD;
+	    }
+	  tree_last = create_token_tree (dfa, NULL, NULL, token);
+	  tree = create_tree (dfa, tree_first, tree_last, OP_ALT);
+	  if (__glibc_unlikely (tree_first == NULL || tree_last == NULL
+				|| tree == NULL))
+	    {
+	      *err = REG_ESPACE;
+	      return NULL;
+	    }
+	}
+      else
+	{
+	  tree = create_token_tree (dfa, NULL, NULL, token);
+	  if (__glibc_unlikely (tree == NULL))
+	    {
+	      *err = REG_ESPACE;
+	      return NULL;
+	    }
+	}
+      /* We must return here, since ANCHORs can't be followed
+	 by repetition operators.
+	 eg. RE"^*" is invalid or "<ANCHOR(^)><CHAR(*)>",
+	     it must not be "<ANCHOR(^)><REPEAT(*)>".  */
+      fetch_token (token, regexp, syntax);
+      return tree;
+
+    case OP_PERIOD:
+      tree = create_token_tree (dfa, NULL, NULL, token);
+      if (__glibc_unlikely (tree == NULL))
+	{
+	  *err = REG_ESPACE;
+	  return NULL;
+	}
+      if (dfa->mb_cur_max > 1)
+	dfa->has_mb_node = 1;
+      break;
+
+    case OP_WORD:
+    case OP_NOTWORD:
+      tree = build_charclass_op (dfa, regexp->trans,
+				 "alnum",
+				 "_",
+				 token->type == OP_NOTWORD, err);
+      if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+	return NULL;
+      break;
+
+    case OP_SPACE:
+    case OP_NOTSPACE:
+      tree = build_charclass_op (dfa, regexp->trans,
+				 "space",
+				 "",
+				 token->type == OP_NOTSPACE, err);
+      if (__glibc_unlikely (*err != REG_NOERROR && tree == NULL))
+	return NULL;
+      break;
+
+    case OP_ALT:
+    case END_OF_RE:
+      return NULL;
+
+    case BACK_SLASH:
+      *err = REG_EESCAPE;
+      return NULL;
+
+    default:
+      /* Must not happen?  */
+#ifdef DEBUG
+      assert (0);
+#endif
+      return NULL;
+    }
+  fetch_token (token, regexp, syntax);
+
+  while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS
+	 || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM)
+    {
+      bin_tree_t *dup_tree = parse_dup_op (tree, regexp, dfa, token,
+					   syntax, err);
+      if (__glibc_unlikely (*err != REG_NOERROR && dup_tree == NULL))
+	{
+	  if (tree != NULL)
+	    postorder (tree, free_tree, NULL);
+	  return NULL;
+	}
+      tree = dup_tree;
+      /* In BRE consecutive duplications are not allowed.  */
+      if ((syntax & RE_CONTEXT_INVALID_DUP)
+	  && (token->type == OP_DUP_ASTERISK
+	      || token->type == OP_OPEN_DUP_NUM))
+	{
+	  if (tree != NULL)
+	    postorder (tree, free_tree, NULL);
+	  *err = REG_BADRPT;
+	  return NULL;
+	}
+    }
+
+  return tree;
+}
+
+/* This function build the following tree, from regular expression
+   (<reg_exp>):
+	 SUBEXP
+	    |
+	<reg_exp>
+*/
+
+static bin_tree_t *
+parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
+	       reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
+{
+  re_dfa_t *dfa = preg->buffer;
+  bin_tree_t *tree;
+  size_t cur_nsub;
+  cur_nsub = preg->re_nsub++;
+
+  fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
+
+  /* The subexpression may be a null string.  */
+  if (token->type == OP_CLOSE_SUBEXP)
+    tree = NULL;
+  else
+    {
+      tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
+      if (__glibc_unlikely (*err == REG_NOERROR
+			    && token->type != OP_CLOSE_SUBEXP))
+	{
+	  if (tree != NULL)
+	    postorder (tree, free_tree, NULL);
+	  *err = REG_EPAREN;
+	}
+      if (__glibc_unlikely (*err != REG_NOERROR))
+	return NULL;
+    }
+
+  if (cur_nsub <= '9' - '1')
+    dfa->completed_bkref_map |= 1 << cur_nsub;
+
+  tree = create_tree (dfa, tree, NULL, SUBEXP);
+  if (__glibc_unlikely (tree == NULL))
+    {
+      *err = REG_ESPACE;
+      return NULL;
+    }
+  tree->token.opr.idx = cur_nsub;
+  return tree;
+}
+
+/* This function parse repetition operators like "*", "+", "{1,3}" etc.  */
+
+static bin_tree_t *
+parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa,
+	      re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err)
+{
+  bin_tree_t *tree = NULL, *old_tree = NULL;
+  Idx i, start, end, start_idx = re_string_cur_idx (regexp);
+  re_token_t start_token = *token;
+
+  if (token->type == OP_OPEN_DUP_NUM)
+    {
+      end = 0;
+      start = fetch_number (regexp, token, syntax);
+      if (start == -1)
+	{
+	  if (token->type == CHARACTER && token->opr.c == ',')
+	    start = 0; /* We treat "{,m}" as "{0,m}".  */
+	  else
+	    {
+	      *err = REG_BADBR; /* <re>{} is invalid.  */
+	      return NULL;
+	    }
+	}
+      if (__glibc_likely (start != -2))
+	{
+	  /* We treat "{n}" as "{n,n}".  */
+	  end = ((token->type == OP_CLOSE_DUP_NUM) ? start
+		 : ((token->type == CHARACTER && token->opr.c == ',')
+		    ? fetch_number (regexp, token, syntax) : -2));
+	}
+      if (__glibc_unlikely (start == -2 || end == -2))
+	{
+	  /* Invalid sequence.  */
+	  if (__glibc_unlikely (!(syntax & RE_INVALID_INTERVAL_ORD)))
+	    {
+	      if (token->type == END_OF_RE)
+		*err = REG_EBRACE;
+	      else
+		*err = REG_BADBR;
+
+	      return NULL;
+	    }
+
+	  /* If the syntax bit is set, rollback.  */
+	  re_string_set_index (regexp, start_idx);
+	  *token = start_token;
+	  token->type = CHARACTER;
+	  /* mb_partial and word_char bits should be already initialized by
+	     peek_token.  */
+	  return elem;
+	}
+
+      if (__glibc_unlikely ((end != -1 && start > end)
+			    || token->type != OP_CLOSE_DUP_NUM))
+	{
+	  /* First number greater than second.  */
+	  *err = REG_BADBR;
+	  return NULL;
+	}
+
+      if (__glibc_unlikely (RE_DUP_MAX < (end == -1 ? start : end)))
+	{
+	  *err = REG_ESIZE;
+	  return NULL;
+	}
+    }
+  else
+    {
+      start = (token->type == OP_DUP_PLUS) ? 1 : 0;
+      end = (token->type == OP_DUP_QUESTION) ? 1 : -1;
+    }
+
+  fetch_token (token, regexp, syntax);
+
+  if (__glibc_unlikely (elem == NULL))
+    return NULL;
+  if (__glibc_unlikely (start == 0 && end == 0))
+    {
+      postorder (elem, free_tree, NULL);
+      return NULL;
+    }
+
+  /* Extract "<re>{n,m}" to "<re><re>...<re><re>{0,<m-n>}".  */
+  if (__glibc_unlikely (start > 0))
+    {
+      tree = elem;
+      for (i = 2; i <= start; ++i)
+	{
+	  elem = duplicate_tree (elem, dfa);
+	  tree = create_tree (dfa, tree, elem, CONCAT);
+	  if (__glibc_unlikely (elem == NULL || tree == NULL))
+	    goto parse_dup_op_espace;
+	}
+
+      if (start == end)
+	return tree;
+
+      /* Duplicate ELEM before it is marked optional.  */
+      elem = duplicate_tree (elem, dfa);
+      if (__glibc_unlikely (elem == NULL))
+        goto parse_dup_op_espace;
+      old_tree = tree;
+    }
+  else
+    old_tree = NULL;
+
+  if (elem->token.type == SUBEXP)
+    {
+      uintptr_t subidx = elem->token.opr.idx;
+      postorder (elem, mark_opt_subexp, (void *) subidx);
+    }
+
+  tree = create_tree (dfa, elem, NULL,
+		      (end == -1 ? OP_DUP_ASTERISK : OP_ALT));
+  if (__glibc_unlikely (tree == NULL))
+    goto parse_dup_op_espace;
+
+  /* This loop is actually executed only when end != -1,
+     to rewrite <re>{0,n} as (<re>(<re>...<re>?)?)?...  We have
+     already created the start+1-th copy.  */
+  if (TYPE_SIGNED (Idx) || end != -1)
+    for (i = start + 2; i <= end; ++i)
+      {
+	elem = duplicate_tree (elem, dfa);
+	tree = create_tree (dfa, tree, elem, CONCAT);
+	if (__glibc_unlikely (elem == NULL || tree == NULL))
+	  goto parse_dup_op_espace;
+
+	tree = create_tree (dfa, tree, NULL, OP_ALT);
+	if (__glibc_unlikely (tree == NULL))
+	  goto parse_dup_op_espace;
+      }
+
+  if (old_tree)
+    tree = create_tree (dfa, old_tree, tree, CONCAT);
+
+  return tree;
+
+ parse_dup_op_espace:
+  *err = REG_ESPACE;
+  return NULL;
+}
+
+/* Size of the names for collating symbol/equivalence_class/character_class.
+   I'm not sure, but maybe enough.  */
+#define BRACKET_NAME_BUF_SIZE 32
+
+#ifndef _LIBC
+
+# ifdef RE_ENABLE_I18N
+/* Convert the byte B to the corresponding wide character.  In a
+   unibyte locale, treat B as itself.  In a multibyte locale, return
+   WEOF if B is an encoding error.  */
+static wint_t
+parse_byte (unsigned char b, re_charset_t *mbcset)
+{
+  return mbcset == NULL ? b : __btowc (b);
+}
+# endif
+
+  /* Local function for parse_bracket_exp only used in case of NOT _LIBC.
+     Build the range expression which starts from START_ELEM, and ends
+     at END_ELEM.  The result are written to MBCSET and SBCSET.
+     RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+     mbcset->range_ends, is a pointer argument since we may
+     update it.  */
+
+static reg_errcode_t
+# ifdef RE_ENABLE_I18N
+build_range_exp (const reg_syntax_t syntax,
+                 bitset_t sbcset,
+                 re_charset_t *mbcset,
+                 Idx *range_alloc,
+                 const bracket_elem_t *start_elem,
+                 const bracket_elem_t *end_elem)
+# else /* not RE_ENABLE_I18N */
+build_range_exp (const reg_syntax_t syntax,
+                 bitset_t sbcset,
+                 const bracket_elem_t *start_elem,
+                 const bracket_elem_t *end_elem)
+# endif /* not RE_ENABLE_I18N */
+{
+  unsigned int start_ch, end_ch;
+  /* Equivalence Classes and Character Classes can't be a range start/end.  */
+  if (__glibc_unlikely (start_elem->type == EQUIV_CLASS
+			|| start_elem->type == CHAR_CLASS
+			|| end_elem->type == EQUIV_CLASS
+			|| end_elem->type == CHAR_CLASS))
+    return REG_ERANGE;
+
+  /* We can handle no multi character collating elements without libc
+     support.  */
+  if (__glibc_unlikely ((start_elem->type == COLL_SYM
+			 && strlen ((char *) start_elem->opr.name) > 1)
+			|| (end_elem->type == COLL_SYM
+			    && strlen ((char *) end_elem->opr.name) > 1)))
+    return REG_ECOLLATE;
+
+# ifdef RE_ENABLE_I18N
+  {
+    wchar_t wc;
+    wint_t start_wc;
+    wint_t end_wc;
+
+    start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch
+		: ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+		   : 0));
+    end_ch = ((end_elem->type == SB_CHAR) ? end_elem->opr.ch
+	      : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+		 : 0));
+    start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM)
+		? parse_byte (start_ch, mbcset) : start_elem->opr.wch);
+    end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM)
+	      ? parse_byte (end_ch, mbcset) : end_elem->opr.wch);
+    if (start_wc == WEOF || end_wc == WEOF)
+      return REG_ECOLLATE;
+    else if (__glibc_unlikely ((syntax & RE_NO_EMPTY_RANGES)
+			       && start_wc > end_wc))
+      return REG_ERANGE;
+
+    /* Got valid collation sequence values, add them as a new entry.
+       However, for !_LIBC we have no collation elements: if the
+       character set is single byte, the single byte character set
+       that we build below suffices.  parse_bracket_exp passes
+       no MBCSET if dfa->mb_cur_max == 1.  */
+    if (mbcset)
+      {
+	/* Check the space of the arrays.  */
+	if (__glibc_unlikely (*range_alloc == mbcset->nranges))
+	  {
+	    /* There is not enough space, need realloc.  */
+	    wchar_t *new_array_start, *new_array_end;
+	    Idx new_nranges;
+
+	    /* +1 in case of mbcset->nranges is 0.  */
+	    new_nranges = 2 * mbcset->nranges + 1;
+	    /* Use realloc since mbcset->range_starts and mbcset->range_ends
+	       are NULL if *range_alloc == 0.  */
+	    new_array_start = re_realloc (mbcset->range_starts, wchar_t,
+					  new_nranges);
+	    new_array_end = re_realloc (mbcset->range_ends, wchar_t,
+					new_nranges);
+
+	    if (__glibc_unlikely (new_array_start == NULL
+				  || new_array_end == NULL))
+	      {
+		re_free (new_array_start);
+		re_free (new_array_end);
+		return REG_ESPACE;
+	      }
+
+	    mbcset->range_starts = new_array_start;
+	    mbcset->range_ends = new_array_end;
+	    *range_alloc = new_nranges;
+	  }
+
+	mbcset->range_starts[mbcset->nranges] = start_wc;
+	mbcset->range_ends[mbcset->nranges++] = end_wc;
+      }
+
+    /* Build the table for single byte characters.  */
+    for (wc = 0; wc < SBC_MAX; ++wc)
+      {
+	if (start_wc <= wc && wc <= end_wc)
+	  bitset_set (sbcset, wc);
+      }
+  }
+# else /* not RE_ENABLE_I18N */
+  {
+    unsigned int ch;
+    start_ch = ((start_elem->type == SB_CHAR ) ? start_elem->opr.ch
+		: ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+		   : 0));
+    end_ch = ((end_elem->type == SB_CHAR ) ? end_elem->opr.ch
+	      : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+		 : 0));
+    if (start_ch > end_ch)
+      return REG_ERANGE;
+    /* Build the table for single byte characters.  */
+    for (ch = 0; ch < SBC_MAX; ++ch)
+      if (start_ch <= ch  && ch <= end_ch)
+	bitset_set (sbcset, ch);
+  }
+# endif /* not RE_ENABLE_I18N */
+  return REG_NOERROR;
+}
+#endif /* not _LIBC */
+
+#ifndef _LIBC
+/* Helper function for parse_bracket_exp only used in case of NOT _LIBC..
+   Build the collating element which is represented by NAME.
+   The result are written to MBCSET and SBCSET.
+   COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+   pointer argument since we may update it.  */
+
+static reg_errcode_t
+# ifdef RE_ENABLE_I18N
+build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
+			Idx *coll_sym_alloc, const unsigned char *name)
+# else /* not RE_ENABLE_I18N */
+build_collating_symbol (bitset_t sbcset, const unsigned char *name)
+# endif /* not RE_ENABLE_I18N */
+{
+  size_t name_len = strlen ((const char *) name);
+  if (__glibc_unlikely (name_len != 1))
+    return REG_ECOLLATE;
+  else
+    {
+      bitset_set (sbcset, name[0]);
+      return REG_NOERROR;
+    }
+}
+#endif /* not _LIBC */
+
+/* This function parse bracket expression like "[abc]", "[a-c]",
+   "[[.a-a.]]" etc.  */
+
+static bin_tree_t *
+parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
+		   reg_syntax_t syntax, reg_errcode_t *err)
+{
+#ifdef _LIBC
+  const unsigned char *collseqmb;
+  const char *collseqwc;
+  uint32_t nrules;
+  int32_t table_size;
+  const int32_t *symb_table;
+  const unsigned char *extra;
+
+  /* Local function for parse_bracket_exp used in _LIBC environment.
+     Seek the collating symbol entry corresponding to NAME.
+     Return the index of the symbol in the SYMB_TABLE,
+     or -1 if not found.  */
+
+  auto inline int32_t
+  __attribute__ ((always_inline))
+  seek_collating_symbol_entry (const unsigned char *name, size_t name_len)
+    {
+      int32_t elem;
+
+      for (elem = 0; elem < table_size; elem++)
+	if (symb_table[2 * elem] != 0)
+	  {
+	    int32_t idx = symb_table[2 * elem + 1];
+	    /* Skip the name of collating element name.  */
+	    idx += 1 + extra[idx];
+	    if (/* Compare the length of the name.  */
+		name_len == extra[idx]
+		/* Compare the name.  */
+		&& memcmp (name, &extra[idx + 1], name_len) == 0)
+	      /* Yep, this is the entry.  */
+	      return elem;
+	  }
+      return -1;
+    }
+
+  /* Local function for parse_bracket_exp used in _LIBC environment.
+     Look up the collation sequence value of BR_ELEM.
+     Return the value if succeeded, UINT_MAX otherwise.  */
+
+  auto inline unsigned int
+  __attribute__ ((always_inline))
+  lookup_collation_sequence_value (bracket_elem_t *br_elem)
+    {
+      if (br_elem->type == SB_CHAR)
+	{
+	  /*
+	  if (MB_CUR_MAX == 1)
+	  */
+	  if (nrules == 0)
+	    return collseqmb[br_elem->opr.ch];
+	  else
+	    {
+	      wint_t wc = __btowc (br_elem->opr.ch);
+	      return __collseq_table_lookup (collseqwc, wc);
+	    }
+	}
+      else if (br_elem->type == MB_CHAR)
+	{
+	  if (nrules != 0)
+	    return __collseq_table_lookup (collseqwc, br_elem->opr.wch);
+	}
+      else if (br_elem->type == COLL_SYM)
+	{
+	  size_t sym_name_len = strlen ((char *) br_elem->opr.name);
+	  if (nrules != 0)
+	    {
+	      int32_t elem, idx;
+	      elem = seek_collating_symbol_entry (br_elem->opr.name,
+						  sym_name_len);
+	      if (elem != -1)
+		{
+		  /* We found the entry.  */
+		  idx = symb_table[2 * elem + 1];
+		  /* Skip the name of collating element name.  */
+		  idx += 1 + extra[idx];
+		  /* Skip the byte sequence of the collating element.  */
+		  idx += 1 + extra[idx];
+		  /* Adjust for the alignment.  */
+		  idx = (idx + 3) & ~3;
+		  /* Skip the multibyte collation sequence value.  */
+		  idx += sizeof (unsigned int);
+		  /* Skip the wide char sequence of the collating element.  */
+		  idx += sizeof (unsigned int) *
+		    (1 + *(unsigned int *) (extra + idx));
+		  /* Return the collation sequence value.  */
+		  return *(unsigned int *) (extra + idx);
+		}
+	      else if (sym_name_len == 1)
+		{
+		  /* No valid character.  Match it as a single byte
+		     character.  */
+		  return collseqmb[br_elem->opr.name[0]];
+		}
+	    }
+	  else if (sym_name_len == 1)
+	    return collseqmb[br_elem->opr.name[0]];
+	}
+      return UINT_MAX;
+    }
+
+  /* Local function for parse_bracket_exp used in _LIBC environment.
+     Build the range expression which starts from START_ELEM, and ends
+     at END_ELEM.  The result are written to MBCSET and SBCSET.
+     RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+     mbcset->range_ends, is a pointer argument since we may
+     update it.  */
+
+  auto inline reg_errcode_t
+  __attribute__ ((always_inline))
+  build_range_exp (bitset_t sbcset, re_charset_t *mbcset, int *range_alloc,
+		   bracket_elem_t *start_elem, bracket_elem_t *end_elem)
+    {
+      unsigned int ch;
+      uint32_t start_collseq;
+      uint32_t end_collseq;
+
+      /* Equivalence Classes and Character Classes can't be a range
+	 start/end.  */
+      if (__glibc_unlikely (start_elem->type == EQUIV_CLASS
+			    || start_elem->type == CHAR_CLASS
+			    || end_elem->type == EQUIV_CLASS
+			    || end_elem->type == CHAR_CLASS))
+	return REG_ERANGE;
+
+      /* FIXME: Implement rational ranges here, too.  */
+      start_collseq = lookup_collation_sequence_value (start_elem);
+      end_collseq = lookup_collation_sequence_value (end_elem);
+      /* Check start/end collation sequence values.  */
+      if (__glibc_unlikely (start_collseq == UINT_MAX
+			    || end_collseq == UINT_MAX))
+	return REG_ECOLLATE;
+      if (__glibc_unlikely ((syntax & RE_NO_EMPTY_RANGES)
+			    && start_collseq > end_collseq))
+	return REG_ERANGE;
+
+      /* Got valid collation sequence values, add them as a new entry.
+	 However, if we have no collation elements, and the character set
+	 is single byte, the single byte character set that we
+	 build below suffices. */
+      if (nrules > 0 || dfa->mb_cur_max > 1)
+	{
+	  /* Check the space of the arrays.  */
+	  if (__glibc_unlikely (*range_alloc == mbcset->nranges))
+	    {
+	      /* There is not enough space, need realloc.  */
+	      uint32_t *new_array_start;
+	      uint32_t *new_array_end;
+	      Idx new_nranges;
+
+	      /* +1 in case of mbcset->nranges is 0.  */
+	      new_nranges = 2 * mbcset->nranges + 1;
+	      new_array_start = re_realloc (mbcset->range_starts, uint32_t,
+					    new_nranges);
+	      new_array_end = re_realloc (mbcset->range_ends, uint32_t,
+					  new_nranges);
+
+	      if (__glibc_unlikely (new_array_start == NULL
+				    || new_array_end == NULL))
+		return REG_ESPACE;
+
+	      mbcset->range_starts = new_array_start;
+	      mbcset->range_ends = new_array_end;
+	      *range_alloc = new_nranges;
+	    }
+
+	  mbcset->range_starts[mbcset->nranges] = start_collseq;
+	  mbcset->range_ends[mbcset->nranges++] = end_collseq;
+	}
+
+      /* Build the table for single byte characters.  */
+      for (ch = 0; ch < SBC_MAX; ch++)
+	{
+	  uint32_t ch_collseq;
+	  /*
+	  if (MB_CUR_MAX == 1)
+	  */
+	  if (nrules == 0)
+	    ch_collseq = collseqmb[ch];
+	  else
+	    ch_collseq = __collseq_table_lookup (collseqwc, __btowc (ch));
+	  if (start_collseq <= ch_collseq && ch_collseq <= end_collseq)
+	    bitset_set (sbcset, ch);
+	}
+      return REG_NOERROR;
+    }
+
+  /* Local function for parse_bracket_exp used in _LIBC environment.
+     Build the collating element which is represented by NAME.
+     The result are written to MBCSET and SBCSET.
+     COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+     pointer argument since we may update it.  */
+
+  auto inline reg_errcode_t
+  __attribute__ ((always_inline))
+  build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
+			  Idx *coll_sym_alloc, const unsigned char *name)
+    {
+      int32_t elem, idx;
+      size_t name_len = strlen ((const char *) name);
+      if (nrules != 0)
+	{
+	  elem = seek_collating_symbol_entry (name, name_len);
+	  if (elem != -1)
+	    {
+	      /* We found the entry.  */
+	      idx = symb_table[2 * elem + 1];
+	      /* Skip the name of collating element name.  */
+	      idx += 1 + extra[idx];
+	    }
+	  else if (name_len == 1)
+	    {
+	      /* No valid character, treat it as a normal
+		 character.  */
+	      bitset_set (sbcset, name[0]);
+	      return REG_NOERROR;
+	    }
+	  else
+	    return REG_ECOLLATE;
+
+	  /* Got valid collation sequence, add it as a new entry.  */
+	  /* Check the space of the arrays.  */
+	  if (__glibc_unlikely (*coll_sym_alloc == mbcset->ncoll_syms))
+	    {
+	      /* Not enough, realloc it.  */
+	      /* +1 in case of mbcset->ncoll_syms is 0.  */
+	      Idx new_coll_sym_alloc = 2 * mbcset->ncoll_syms + 1;
+	      /* Use realloc since mbcset->coll_syms is NULL
+		 if *alloc == 0.  */
+	      int32_t *new_coll_syms = re_realloc (mbcset->coll_syms, int32_t,
+						   new_coll_sym_alloc);
+	      if (__glibc_unlikely (new_coll_syms == NULL))
+		return REG_ESPACE;
+	      mbcset->coll_syms = new_coll_syms;
+	      *coll_sym_alloc = new_coll_sym_alloc;
+	    }
+	  mbcset->coll_syms[mbcset->ncoll_syms++] = idx;
+	  return REG_NOERROR;
+	}
+      else
+	{
+	  if (__glibc_unlikely (name_len != 1))
+	    return REG_ECOLLATE;
+	  else
+	    {
+	      bitset_set (sbcset, name[0]);
+	      return REG_NOERROR;
+	    }
+	}
+    }
+#endif
+
+  re_token_t br_token;
+  re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+  re_charset_t *mbcset;
+  Idx coll_sym_alloc = 0, range_alloc = 0, mbchar_alloc = 0;
+  Idx equiv_class_alloc = 0, char_class_alloc = 0;
+#endif /* not RE_ENABLE_I18N */
+  bool non_match = false;
+  bin_tree_t *work_tree;
+  int token_len;
+  bool first_round = true;
+#ifdef _LIBC
+  collseqmb = (const unsigned char *)
+    _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+  nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+  if (nrules)
+    {
+      /*
+      if (MB_CUR_MAX > 1)
+      */
+      collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+      table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB);
+      symb_table = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+						  _NL_COLLATE_SYMB_TABLEMB);
+      extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+						   _NL_COLLATE_SYMB_EXTRAMB);
+    }
+#endif
+  sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+#ifdef RE_ENABLE_I18N
+  mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+#endif /* RE_ENABLE_I18N */
+#ifdef RE_ENABLE_I18N
+  if (__glibc_unlikely (sbcset == NULL || mbcset == NULL))
+#else
+  if (__glibc_unlikely (sbcset == NULL))
+#endif /* RE_ENABLE_I18N */
+    {
+      re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+      re_free (mbcset);
+#endif
+      *err = REG_ESPACE;
+      return NULL;
+    }
+
+  token_len = peek_token_bracket (token, regexp, syntax);
+  if (__glibc_unlikely (token->type == END_OF_RE))
+    {
+      *err = REG_BADPAT;
+      goto parse_bracket_exp_free_return;
+    }
+  if (token->type == OP_NON_MATCH_LIST)
+    {
+#ifdef RE_ENABLE_I18N
+      mbcset->non_match = 1;
+#endif /* not RE_ENABLE_I18N */
+      non_match = true;
+      if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
+	bitset_set (sbcset, '\n');
+      re_string_skip_bytes (regexp, token_len); /* Skip a token.  */
+      token_len = peek_token_bracket (token, regexp, syntax);
+      if (__glibc_unlikely (token->type == END_OF_RE))
+	{
+	  *err = REG_BADPAT;
+	  goto parse_bracket_exp_free_return;
+	}
+    }
+
+  /* We treat the first ']' as a normal character.  */
+  if (token->type == OP_CLOSE_BRACKET)
+    token->type = CHARACTER;
+
+  while (1)
+    {
+      bracket_elem_t start_elem, end_elem;
+      unsigned char start_name_buf[BRACKET_NAME_BUF_SIZE];
+      unsigned char end_name_buf[BRACKET_NAME_BUF_SIZE];
+      reg_errcode_t ret;
+      int token_len2 = 0;
+      bool is_range_exp = false;
+      re_token_t token2;
+
+      start_elem.opr.name = start_name_buf;
+      start_elem.type = COLL_SYM;
+      ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa,
+				   syntax, first_round);
+      if (__glibc_unlikely (ret != REG_NOERROR))
+	{
+	  *err = ret;
+	  goto parse_bracket_exp_free_return;
+	}
+      first_round = false;
+
+      /* Get information about the next token.  We need it in any case.  */
+      token_len = peek_token_bracket (token, regexp, syntax);
+
+      /* Do not check for ranges if we know they are not allowed.  */
+      if (start_elem.type != CHAR_CLASS && start_elem.type != EQUIV_CLASS)
+	{
+	  if (__glibc_unlikely (token->type == END_OF_RE))
+	    {
+	      *err = REG_EBRACK;
+	      goto parse_bracket_exp_free_return;
+	    }
+	  if (token->type == OP_CHARSET_RANGE)
+	    {
+	      re_string_skip_bytes (regexp, token_len); /* Skip '-'.  */
+	      token_len2 = peek_token_bracket (&token2, regexp, syntax);
+	      if (__glibc_unlikely (token2.type == END_OF_RE))
+		{
+		  *err = REG_EBRACK;
+		  goto parse_bracket_exp_free_return;
+		}
+	      if (token2.type == OP_CLOSE_BRACKET)
+		{
+		  /* We treat the last '-' as a normal character.  */
+		  re_string_skip_bytes (regexp, -token_len);
+		  token->type = CHARACTER;
+		}
+	      else
+		is_range_exp = true;
+	    }
+	}
+
+      if (is_range_exp == true)
+	{
+	  end_elem.opr.name = end_name_buf;
+	  end_elem.type = COLL_SYM;
+	  ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2,
+				       dfa, syntax, true);
+	  if (__glibc_unlikely (ret != REG_NOERROR))
+	    {
+	      *err = ret;
+	      goto parse_bracket_exp_free_return;
+	    }
+
+	  token_len = peek_token_bracket (token, regexp, syntax);
+
+#ifdef _LIBC
+	  *err = build_range_exp (sbcset, mbcset, &range_alloc,
+				  &start_elem, &end_elem);
+#else
+# ifdef RE_ENABLE_I18N
+	  *err = build_range_exp (syntax, sbcset,
+				  dfa->mb_cur_max > 1 ? mbcset : NULL,
+				  &range_alloc, &start_elem, &end_elem);
+# else
+	  *err = build_range_exp (syntax, sbcset, &start_elem, &end_elem);
+# endif
+#endif /* RE_ENABLE_I18N */
+	  if (__glibc_unlikely (*err != REG_NOERROR))
+	    goto parse_bracket_exp_free_return;
+	}
+      else
+	{
+	  switch (start_elem.type)
+	    {
+	    case SB_CHAR:
+	      bitset_set (sbcset, start_elem.opr.ch);
+	      break;
+#ifdef RE_ENABLE_I18N
+	    case MB_CHAR:
+	      /* Check whether the array has enough space.  */
+	      if (__glibc_unlikely (mbchar_alloc == mbcset->nmbchars))
+		{
+		  wchar_t *new_mbchars;
+		  /* Not enough, realloc it.  */
+		  /* +1 in case of mbcset->nmbchars is 0.  */
+		  mbchar_alloc = 2 * mbcset->nmbchars + 1;
+		  /* Use realloc since array is NULL if *alloc == 0.  */
+		  new_mbchars = re_realloc (mbcset->mbchars, wchar_t,
+					    mbchar_alloc);
+		  if (__glibc_unlikely (new_mbchars == NULL))
+		    goto parse_bracket_exp_espace;
+		  mbcset->mbchars = new_mbchars;
+		}
+	      mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch;
+	      break;
+#endif /* RE_ENABLE_I18N */
+	    case EQUIV_CLASS:
+	      *err = build_equiv_class (sbcset,
+#ifdef RE_ENABLE_I18N
+					mbcset, &equiv_class_alloc,
+#endif /* RE_ENABLE_I18N */
+					start_elem.opr.name);
+	      if (__glibc_unlikely (*err != REG_NOERROR))
+		goto parse_bracket_exp_free_return;
+	      break;
+	    case COLL_SYM:
+	      *err = build_collating_symbol (sbcset,
+#ifdef RE_ENABLE_I18N
+					     mbcset, &coll_sym_alloc,
+#endif /* RE_ENABLE_I18N */
+					     start_elem.opr.name);
+	      if (__glibc_unlikely (*err != REG_NOERROR))
+		goto parse_bracket_exp_free_return;
+	      break;
+	    case CHAR_CLASS:
+	      *err = build_charclass (regexp->trans, sbcset,
+#ifdef RE_ENABLE_I18N
+				      mbcset, &char_class_alloc,
+#endif /* RE_ENABLE_I18N */
+				      (const char *) start_elem.opr.name,
+				      syntax);
+	      if (__glibc_unlikely (*err != REG_NOERROR))
+	       goto parse_bracket_exp_free_return;
+	      break;
+	    default:
+	      assert (0);
+	      break;
+	    }
+	}
+      if (__glibc_unlikely (token->type == END_OF_RE))
+	{
+	  *err = REG_EBRACK;
+	  goto parse_bracket_exp_free_return;
+	}
+      if (token->type == OP_CLOSE_BRACKET)
+	break;
+    }
+
+  re_string_skip_bytes (regexp, token_len); /* Skip a token.  */
+
+  /* If it is non-matching list.  */
+  if (non_match)
+    bitset_not (sbcset);
+
+#ifdef RE_ENABLE_I18N
+  /* Ensure only single byte characters are set.  */
+  if (dfa->mb_cur_max > 1)
+    bitset_mask (sbcset, dfa->sb_char);
+
+  if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes
+      || mbcset->nranges || (dfa->mb_cur_max > 1 && (mbcset->nchar_classes
+						     || mbcset->non_match)))
+    {
+      bin_tree_t *mbc_tree;
+      int sbc_idx;
+      /* Build a tree for complex bracket.  */
+      dfa->has_mb_node = 1;
+      br_token.type = COMPLEX_BRACKET;
+      br_token.opr.mbcset = mbcset;
+      mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+      if (__glibc_unlikely (mbc_tree == NULL))
+	goto parse_bracket_exp_espace;
+      for (sbc_idx = 0; sbc_idx < BITSET_WORDS; ++sbc_idx)
+	if (sbcset[sbc_idx])
+	  break;
+      /* If there are no bits set in sbcset, there is no point
+	 of having both SIMPLE_BRACKET and COMPLEX_BRACKET.  */
+      if (sbc_idx < BITSET_WORDS)
+	{
+	  /* Build a tree for simple bracket.  */
+	  br_token.type = SIMPLE_BRACKET;
+	  br_token.opr.sbcset = sbcset;
+	  work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+	  if (__glibc_unlikely (work_tree == NULL))
+	    goto parse_bracket_exp_espace;
+
+	  /* Then join them by ALT node.  */
+	  work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT);
+	  if (__glibc_unlikely (work_tree == NULL))
+	    goto parse_bracket_exp_espace;
+	}
+      else
+	{
+	  re_free (sbcset);
+	  work_tree = mbc_tree;
+	}
+    }
+  else
+#endif /* not RE_ENABLE_I18N */
+    {
+#ifdef RE_ENABLE_I18N
+      free_charset (mbcset);
+#endif
+      /* Build a tree for simple bracket.  */
+      br_token.type = SIMPLE_BRACKET;
+      br_token.opr.sbcset = sbcset;
+      work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+      if (__glibc_unlikely (work_tree == NULL))
+	goto parse_bracket_exp_espace;
+    }
+  return work_tree;
+
+ parse_bracket_exp_espace:
+  *err = REG_ESPACE;
+ parse_bracket_exp_free_return:
+  re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+  free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+  return NULL;
+}
+
+/* Parse an element in the bracket expression.  */
+
+static reg_errcode_t
+parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp,
+		       re_token_t *token, int token_len, re_dfa_t *dfa,
+		       reg_syntax_t syntax, bool accept_hyphen)
+{
+#ifdef RE_ENABLE_I18N
+  int cur_char_size;
+  cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp));
+  if (cur_char_size > 1)
+    {
+      elem->type = MB_CHAR;
+      elem->opr.wch = re_string_wchar_at (regexp, re_string_cur_idx (regexp));
+      re_string_skip_bytes (regexp, cur_char_size);
+      return REG_NOERROR;
+    }
+#endif /* RE_ENABLE_I18N */
+  re_string_skip_bytes (regexp, token_len); /* Skip a token.  */
+  if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS
+      || token->type == OP_OPEN_EQUIV_CLASS)
+    return parse_bracket_symbol (elem, regexp, token);
+  if (__glibc_unlikely (token->type == OP_CHARSET_RANGE) && !accept_hyphen)
+    {
+      /* A '-' must only appear as anything but a range indicator before
+	 the closing bracket.  Everything else is an error.  */
+      re_token_t token2;
+      (void) peek_token_bracket (&token2, regexp, syntax);
+      if (token2.type != OP_CLOSE_BRACKET)
+	/* The actual error value is not standardized since this whole
+	   case is undefined.  But ERANGE makes good sense.  */
+	return REG_ERANGE;
+    }
+  elem->type = SB_CHAR;
+  elem->opr.ch = token->opr.c;
+  return REG_NOERROR;
+}
+
+/* Parse a bracket symbol in the bracket expression.  Bracket symbols are
+   such as [:<character_class>:], [.<collating_element>.], and
+   [=<equivalent_class>=].  */
+
+static reg_errcode_t
+parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp,
+		      re_token_t *token)
+{
+  unsigned char ch, delim = token->opr.c;
+  int i = 0;
+  if (re_string_eoi(regexp))
+    return REG_EBRACK;
+  for (;; ++i)
+    {
+      if (i >= BRACKET_NAME_BUF_SIZE)
+	return REG_EBRACK;
+      if (token->type == OP_OPEN_CHAR_CLASS)
+	ch = re_string_fetch_byte_case (regexp);
+      else
+	ch = re_string_fetch_byte (regexp);
+      if (re_string_eoi(regexp))
+	return REG_EBRACK;
+      if (ch == delim && re_string_peek_byte (regexp, 0) == ']')
+	break;
+      elem->opr.name[i] = ch;
+    }
+  re_string_skip_bytes (regexp, 1);
+  elem->opr.name[i] = '\0';
+  switch (token->type)
+    {
+    case OP_OPEN_COLL_ELEM:
+      elem->type = COLL_SYM;
+      break;
+    case OP_OPEN_EQUIV_CLASS:
+      elem->type = EQUIV_CLASS;
+      break;
+    case OP_OPEN_CHAR_CLASS:
+      elem->type = CHAR_CLASS;
+      break;
+    default:
+      break;
+    }
+  return REG_NOERROR;
+}
+
+  /* Helper function for parse_bracket_exp.
+     Build the equivalence class which is represented by NAME.
+     The result are written to MBCSET and SBCSET.
+     EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes,
+     is a pointer argument since we may update it.  */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_equiv_class (bitset_t sbcset, re_charset_t *mbcset,
+		   Idx *equiv_class_alloc, const unsigned char *name)
+#else /* not RE_ENABLE_I18N */
+build_equiv_class (bitset_t sbcset, const unsigned char *name)
+#endif /* not RE_ENABLE_I18N */
+{
+#ifdef _LIBC
+  uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+  if (nrules != 0)
+    {
+      const int32_t *table, *indirect;
+      const unsigned char *weights, *extra, *cp;
+      unsigned char char_buf[2];
+      int32_t idx1, idx2;
+      unsigned int ch;
+      size_t len;
+      /* Calculate the index for equivalence class.  */
+      cp = name;
+      table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+      weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+					       _NL_COLLATE_WEIGHTMB);
+      extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+						   _NL_COLLATE_EXTRAMB);
+      indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+						_NL_COLLATE_INDIRECTMB);
+      idx1 = findidx (table, indirect, extra, &cp, -1);
+      if (__glibc_unlikely (idx1 == 0 || *cp != '\0'))
+	/* This isn't a valid character.  */
+	return REG_ECOLLATE;
+
+      /* Build single byte matching table for this equivalence class.  */
+      len = weights[idx1 & 0xffffff];
+      for (ch = 0; ch < SBC_MAX; ++ch)
+	{
+	  char_buf[0] = ch;
+	  cp = char_buf;
+	  idx2 = findidx (table, indirect, extra, &cp, 1);
+/*
+	  idx2 = table[ch];
+*/
+	  if (idx2 == 0)
+	    /* This isn't a valid character.  */
+	    continue;
+	  /* Compare only if the length matches and the collation rule
+	     index is the same.  */
+	  if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24)
+	      && memcmp (weights + (idx1 & 0xffffff) + 1,
+			 weights + (idx2 & 0xffffff) + 1, len) == 0)
+	    bitset_set (sbcset, ch);
+	}
+      /* Check whether the array has enough space.  */
+      if (__glibc_unlikely (*equiv_class_alloc == mbcset->nequiv_classes))
+	{
+	  /* Not enough, realloc it.  */
+	  /* +1 in case of mbcset->nequiv_classes is 0.  */
+	  Idx new_equiv_class_alloc = 2 * mbcset->nequiv_classes + 1;
+	  /* Use realloc since the array is NULL if *alloc == 0.  */
+	  int32_t *new_equiv_classes = re_realloc (mbcset->equiv_classes,
+						   int32_t,
+						   new_equiv_class_alloc);
+	  if (__glibc_unlikely (new_equiv_classes == NULL))
+	    return REG_ESPACE;
+	  mbcset->equiv_classes = new_equiv_classes;
+	  *equiv_class_alloc = new_equiv_class_alloc;
+	}
+      mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1;
+    }
+  else
+#endif /* _LIBC */
+    {
+      if (__glibc_unlikely (strlen ((const char *) name) != 1))
+	return REG_ECOLLATE;
+      bitset_set (sbcset, *name);
+    }
+  return REG_NOERROR;
+}
+
+  /* Helper function for parse_bracket_exp.
+     Build the character class which is represented by NAME.
+     The result are written to MBCSET and SBCSET.
+     CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes,
+     is a pointer argument since we may update it.  */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
+		 re_charset_t *mbcset, Idx *char_class_alloc,
+		 const char *class_name, reg_syntax_t syntax)
+#else /* not RE_ENABLE_I18N */
+build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
+		 const char *class_name, reg_syntax_t syntax)
+#endif /* not RE_ENABLE_I18N */
+{
+  int i;
+  const char *name = class_name;
+
+  /* In case of REG_ICASE "upper" and "lower" match the both of
+     upper and lower cases.  */
+  if ((syntax & RE_ICASE)
+      && (strcmp (name, "upper") == 0 || strcmp (name, "lower") == 0))
+    name = "alpha";
+
+#ifdef RE_ENABLE_I18N
+  /* Check the space of the arrays.  */
+  if (__glibc_unlikely (*char_class_alloc == mbcset->nchar_classes))
+    {
+      /* Not enough, realloc it.  */
+      /* +1 in case of mbcset->nchar_classes is 0.  */
+      Idx new_char_class_alloc = 2 * mbcset->nchar_classes + 1;
+      /* Use realloc since array is NULL if *alloc == 0.  */
+      wctype_t *new_char_classes = re_realloc (mbcset->char_classes, wctype_t,
+					       new_char_class_alloc);
+      if (__glibc_unlikely (new_char_classes == NULL))
+	return REG_ESPACE;
+      mbcset->char_classes = new_char_classes;
+      *char_class_alloc = new_char_class_alloc;
+    }
+  mbcset->char_classes[mbcset->nchar_classes++] = __wctype (name);
+#endif /* RE_ENABLE_I18N */
+
+#define BUILD_CHARCLASS_LOOP(ctype_func)	\
+  do {						\
+    if (__glibc_unlikely (trans != NULL))			\
+      {						\
+	for (i = 0; i < SBC_MAX; ++i)		\
+	  if (ctype_func (i))			\
+	    bitset_set (sbcset, trans[i]);	\
+      }						\
+    else					\
+      {						\
+	for (i = 0; i < SBC_MAX; ++i)		\
+	  if (ctype_func (i))			\
+	    bitset_set (sbcset, i);		\
+      }						\
+  } while (0)
+
+  if (strcmp (name, "alnum") == 0)
+    BUILD_CHARCLASS_LOOP (isalnum);
+  else if (strcmp (name, "cntrl") == 0)
+    BUILD_CHARCLASS_LOOP (iscntrl);
+  else if (strcmp (name, "lower") == 0)
+    BUILD_CHARCLASS_LOOP (islower);
+  else if (strcmp (name, "space") == 0)
+    BUILD_CHARCLASS_LOOP (isspace);
+  else if (strcmp (name, "alpha") == 0)
+    BUILD_CHARCLASS_LOOP (isalpha);
+  else if (strcmp (name, "digit") == 0)
+    BUILD_CHARCLASS_LOOP (isdigit);
+  else if (strcmp (name, "print") == 0)
+    BUILD_CHARCLASS_LOOP (isprint);
+  else if (strcmp (name, "upper") == 0)
+    BUILD_CHARCLASS_LOOP (isupper);
+  else if (strcmp (name, "blank") == 0)
+    BUILD_CHARCLASS_LOOP (isblank);
+  else if (strcmp (name, "graph") == 0)
+    BUILD_CHARCLASS_LOOP (isgraph);
+  else if (strcmp (name, "punct") == 0)
+    BUILD_CHARCLASS_LOOP (ispunct);
+  else if (strcmp (name, "xdigit") == 0)
+    BUILD_CHARCLASS_LOOP (isxdigit);
+  else
+    return REG_ECTYPE;
+
+  return REG_NOERROR;
+}
+
+static bin_tree_t *
+build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans,
+		    const char *class_name,
+		    const char *extra, bool non_match,
+		    reg_errcode_t *err)
+{
+  re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+  re_charset_t *mbcset;
+  Idx alloc = 0;
+#endif /* not RE_ENABLE_I18N */
+  reg_errcode_t ret;
+  re_token_t br_token;
+  bin_tree_t *tree;
+
+  sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
+  if (__glibc_unlikely (sbcset == NULL))
+    {
+      *err = REG_ESPACE;
+      return NULL;
+    }
+#ifdef RE_ENABLE_I18N
+  mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+  if (__glibc_unlikely (mbcset == NULL))
+    {
+      re_free (sbcset);
+      *err = REG_ESPACE;
+      return NULL;
+    }
+  mbcset->non_match = non_match;
+#endif /* RE_ENABLE_I18N */
+
+  /* We don't care the syntax in this case.  */
+  ret = build_charclass (trans, sbcset,
+#ifdef RE_ENABLE_I18N
+			 mbcset, &alloc,
+#endif /* RE_ENABLE_I18N */
+			 class_name, 0);
+
+  if (__glibc_unlikely (ret != REG_NOERROR))
+    {
+      re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+      free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+      *err = ret;
+      return NULL;
+    }
+  /* \w match '_' also.  */
+  for (; *extra; extra++)
+    bitset_set (sbcset, *extra);
+
+  /* If it is non-matching list.  */
+  if (non_match)
+    bitset_not (sbcset);
+
+#ifdef RE_ENABLE_I18N
+  /* Ensure only single byte characters are set.  */
+  if (dfa->mb_cur_max > 1)
+    bitset_mask (sbcset, dfa->sb_char);
+#endif
+
+  /* Build a tree for simple bracket.  */
+#if defined GCC_LINT || defined lint
+  memset (&br_token, 0, sizeof br_token);
+#endif
+  br_token.type = SIMPLE_BRACKET;
+  br_token.opr.sbcset = sbcset;
+  tree = create_token_tree (dfa, NULL, NULL, &br_token);
+  if (__glibc_unlikely (tree == NULL))
+    goto build_word_op_espace;
+
+#ifdef RE_ENABLE_I18N
+  if (dfa->mb_cur_max > 1)
+    {
+      bin_tree_t *mbc_tree;
+      /* Build a tree for complex bracket.  */
+      br_token.type = COMPLEX_BRACKET;
+      br_token.opr.mbcset = mbcset;
+      dfa->has_mb_node = 1;
+      mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
+      if (__glibc_unlikely (mbc_tree == NULL))
+	goto build_word_op_espace;
+      /* Then join them by ALT node.  */
+      tree = create_tree (dfa, tree, mbc_tree, OP_ALT);
+      if (__glibc_likely (mbc_tree != NULL))
+	return tree;
+    }
+  else
+    {
+      free_charset (mbcset);
+      return tree;
+    }
+#else /* not RE_ENABLE_I18N */
+  return tree;
+#endif /* not RE_ENABLE_I18N */
+
+ build_word_op_espace:
+  re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+  free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+  *err = REG_ESPACE;
+  return NULL;
+}
+
+/* This is intended for the expressions like "a{1,3}".
+   Fetch a number from 'input', and return the number.
+   Return -1 if the number field is empty like "{,1}".
+   Return RE_DUP_MAX + 1 if the number field is too large.
+   Return -2 if an error occurred.  */
+
+static Idx
+fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax)
+{
+  Idx num = -1;
+  unsigned char c;
+  while (1)
+    {
+      fetch_token (token, input, syntax);
+      c = token->opr.c;
+      if (__glibc_unlikely (token->type == END_OF_RE))
+	return -2;
+      if (token->type == OP_CLOSE_DUP_NUM || c == ',')
+	break;
+      num = ((token->type != CHARACTER || c < '0' || '9' < c || num == -2)
+	     ? -2
+	     : num == -1
+	     ? c - '0'
+	     : MIN (RE_DUP_MAX + 1, num * 10 + c - '0'));
+    }
+  return num;
+}
+
+#ifdef RE_ENABLE_I18N
+static void
+free_charset (re_charset_t *cset)
+{
+  re_free (cset->mbchars);
+# ifdef _LIBC
+  re_free (cset->coll_syms);
+  re_free (cset->equiv_classes);
+# endif
+  re_free (cset->range_starts);
+  re_free (cset->range_ends);
+  re_free (cset->char_classes);
+  re_free (cset);
+}
+#endif /* RE_ENABLE_I18N */
+
+/* Functions for binary tree operation.  */
+
+/* Create a tree node.  */
+
+static bin_tree_t *
+create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
+	     re_token_type_t type)
+{
+  re_token_t t;
+#if defined GCC_LINT || defined lint
+  memset (&t, 0, sizeof t);
+#endif
+  t.type = type;
+  return create_token_tree (dfa, left, right, &t);
+}
+
+static bin_tree_t *
+create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
+		   const re_token_t *token)
+{
+  bin_tree_t *tree;
+  if (__glibc_unlikely (dfa->str_tree_storage_idx == BIN_TREE_STORAGE_SIZE))
+    {
+      bin_tree_storage_t *storage = re_malloc (bin_tree_storage_t, 1);
+
+      if (storage == NULL)
+	return NULL;
+      storage->next = dfa->str_tree_storage;
+      dfa->str_tree_storage = storage;
+      dfa->str_tree_storage_idx = 0;
+    }
+  tree = &dfa->str_tree_storage->data[dfa->str_tree_storage_idx++];
+
+  tree->parent = NULL;
+  tree->left = left;
+  tree->right = right;
+  tree->token = *token;
+  tree->token.duplicated = 0;
+  tree->token.opt_subexp = 0;
+  tree->first = NULL;
+  tree->next = NULL;
+  tree->node_idx = -1;
+
+  if (left != NULL)
+    left->parent = tree;
+  if (right != NULL)
+    right->parent = tree;
+  return tree;
+}
+
+/* Mark the tree SRC as an optional subexpression.
+   To be called from preorder or postorder.  */
+
+static reg_errcode_t
+mark_opt_subexp (void *extra, bin_tree_t *node)
+{
+  Idx idx = (uintptr_t) extra;
+  if (node->token.type == SUBEXP && node->token.opr.idx == idx)
+    node->token.opt_subexp = 1;
+
+  return REG_NOERROR;
+}
+
+/* Free the allocated memory inside NODE. */
+
+static void
+free_token (re_token_t *node)
+{
+#ifdef RE_ENABLE_I18N
+  if (node->type == COMPLEX_BRACKET && node->duplicated == 0)
+    free_charset (node->opr.mbcset);
+  else
+#endif /* RE_ENABLE_I18N */
+    if (node->type == SIMPLE_BRACKET && node->duplicated == 0)
+      re_free (node->opr.sbcset);
+}
+
+/* Worker function for tree walking.  Free the allocated memory inside NODE
+   and its children. */
+
+static reg_errcode_t
+free_tree (void *extra, bin_tree_t *node)
+{
+  free_token (&node->token);
+  return REG_NOERROR;
+}
+
+
+/* Duplicate the node SRC, and return new node.  This is a preorder
+   visit similar to the one implemented by the generic visitor, but
+   we need more infrastructure to maintain two parallel trees --- so,
+   it's easier to duplicate.  */
+
+static bin_tree_t *
+duplicate_tree (const bin_tree_t *root, re_dfa_t *dfa)
+{
+  const bin_tree_t *node;
+  bin_tree_t *dup_root;
+  bin_tree_t **p_new = &dup_root, *dup_node = root->parent;
+
+  for (node = root; ; )
+    {
+      /* Create a new tree and link it back to the current parent.  */
+      *p_new = create_token_tree (dfa, NULL, NULL, &node->token);
+      if (*p_new == NULL)
+	return NULL;
+      (*p_new)->parent = dup_node;
+      (*p_new)->token.duplicated = 1;
+      dup_node = *p_new;
+
+      /* Go to the left node, or up and to the right.  */
+      if (node->left)
+	{
+	  node = node->left;
+	  p_new = &dup_node->left;
+	}
+      else
+	{
+	  const bin_tree_t *prev = NULL;
+	  while (node->right == prev || node->right == NULL)
+	    {
+	      prev = node;
+	      node = node->parent;
+	      dup_node = dup_node->parent;
+	      if (!node)
+		return dup_root;
+	    }
+	  node = node->right;
+	  p_new = &dup_node->right;
+	}
+    }
+}
diff --git a/gawk-5.0.1/support/regex.c b/gawk-5.0.1/support/regex.c
new file mode 100644
index 00000000000..d4459f7b615
--- /dev/null
+++ b/gawk-5.0.1/support/regex.c
@@ -0,0 +1,81 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _LIBC
+# include <libc-config.h>
+
+# if __GNUC_PREREQ (4, 6)
+#  pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
+# endif
+# if __GNUC_PREREQ (4, 3)
+#  pragma GCC diagnostic ignored "-Wold-style-definition"
+#  pragma GCC diagnostic ignored "-Wtype-limits"
+# endif
+#endif
+
+/* Make sure no one compiles this code with a C++ compiler.  */
+#if defined __cplusplus && defined _LIBC
+# error "This is C code, use a C compiler"
+#endif
+
+#ifdef _LIBC
+/* We have to keep the namespace clean.  */
+# define regfree(preg) __regfree (preg)
+# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
+# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
+# define regerror(errcode, preg, errbuf, errbuf_size) \
+	__regerror(errcode, preg, errbuf, errbuf_size)
+# define re_set_registers(bu, re, nu, st, en) \
+	__re_set_registers (bu, re, nu, st, en)
+# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
+	__re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+# define re_match(bufp, string, size, pos, regs) \
+	__re_match (bufp, string, size, pos, regs)
+# define re_search(bufp, string, size, startpos, range, regs) \
+	__re_search (bufp, string, size, startpos, range, regs)
+# define re_compile_pattern(pattern, length, bufp) \
+	__re_compile_pattern (pattern, length, bufp)
+# define re_set_syntax(syntax) __re_set_syntax (syntax)
+# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
+	__re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
+# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
+
+# include "../locale/localeinfo.h"
+#endif
+
+/* On some systems, limits.h sets RE_DUP_MAX to a lower value than
+   GNU regex allows.  Include it before <regex.h>, which correctly
+   #undefs RE_DUP_MAX and sets it to the right value.  */
+#include <limits.h>
+
+#include <regex.h>
+#include "regex_internal.h"
+
+#include "regex_internal.c"
+#include "regcomp.c"
+#include "regexec.c"
+
+/* Binary backward compatibility.  */
+#if _LIBC
+# include <shlib-compat.h>
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
+link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.")
+int re_max_failures = 2000;
+# endif
+#endif
diff --git a/gawk-5.0.1/support/regex.h b/gawk-5.0.1/support/regex.h
new file mode 100644
index 00000000000..840e51508e7
--- /dev/null
+++ b/gawk-5.0.1/support/regex.h
@@ -0,0 +1,658 @@
+/* Definitions for data structures and routines for the regular
+   expression library.
+   Copyright (C) 1985, 1989-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _REGEX_H
+#define _REGEX_H 1
+
+#include <sys/types.h>
+
+/* Allow the use in C++ code.  */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Define __USE_GNU to declare GNU extensions that violate the
+   POSIX name space rules.  */
+#ifdef _GNU_SOURCE
+# define __USE_GNU 1
+#endif
+
+#ifdef _REGEX_LARGE_OFFSETS
+
+/* Use types and values that are wide enough to represent signed and
+   unsigned byte offsets in memory.  This currently works only when
+   the regex code is used outside of the GNU C library; it is not yet
+   supported within glibc itself, and glibc users should not define
+   _REGEX_LARGE_OFFSETS.  */
+
+/* The type of object sizes.  */
+typedef size_t __re_size_t;
+
+/* The type of object sizes, in places where the traditional code
+   uses unsigned long int.  */
+typedef size_t __re_long_size_t;
+
+#else
+
+/* The traditional GNU regex implementation mishandles strings longer
+   than INT_MAX.  */
+typedef unsigned int __re_size_t;
+typedef unsigned long int __re_long_size_t;
+
+#endif
+
+/* The following two types have to be signed and unsigned integer type
+   wide enough to hold a value of a pointer.  For most ANSI compilers
+   ptrdiff_t and size_t should be likely OK.  Still size of these two
+   types is 2 for Microsoft C.  Ugh... */
+typedef long int s_reg_t;
+typedef unsigned long int active_reg_t;
+
+/* The following bits are used to determine the regexp syntax we
+   recognize.  The set/not-set meanings are chosen so that Emacs syntax
+   remains the value 0.  The bits are given in alphabetical order, and
+   the definitions shifted by one from the previous bit; thus, when we
+   add or remove a bit, only one other definition need change.  */
+typedef unsigned long int reg_syntax_t;
+
+#ifdef __USE_GNU
+/* If this bit is not set, then \ inside a bracket expression is literal.
+   If set, then such a \ quotes the following character.  */
+# define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+     literals.
+   If set, then \+ and \? are operators and + and ? are literals.  */
+# define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported.  They are:
+     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
+     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+   If not set, then character classes are not supported.  */
+# define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+     expressions, of course).
+   If this bit is not set, then it depends:
+	^  is an anchor if it is at the beginning of a regular
+	   expression or after an open-group or an alternation operator;
+	$  is an anchor if it is at the end of a regular expression, or
+	   before a close-group or an alternation operator.
+
+   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+   POSIX draft 11.2 says that * etc. in leading positions is undefined.
+   We already implemented a previous draft which made those constructs
+   invalid, though, so we haven't changed the code back.  */
+# define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+     regardless of where they are in the pattern.
+   If this bit is not set, then special characters are special only in
+     some contexts; otherwise they are ordinary.  Specifically,
+     * + ? and intervals are only special when not after the beginning,
+     open-group, or alternation operator.  */
+# define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+     immediately after an alternation or begin-group operator.  */
+# define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+   If not set, then it doesn't.  */
+# define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+   If not set, then it does.  */
+# define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+   If not set, they do.  */
+# define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+     interval, depending on RE_NO_BK_BRACES.
+   If not set, \{, \}, {, and } are literals.  */
+# define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+   If not set, they are.  */
+# define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+   If not set, newline is literal.  */
+# define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then '{...}' defines an interval, and \{ and \}
+     are literals.
+  If not set, then '\{...\}' defines an interval.  */
+# define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+   If not set, \(...\) defines a group, and ( and ) are literals.  */
+# define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+   If not set, then \<digit> is a back-reference.  */
+# define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal.
+   If not set, then \| is an alternation operator, and | is literal.  */
+# define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+     than the starting range point, as in [z-a], is invalid.
+   If not set, then when ending range point collates higher than the
+     starting range point, the range is ignored.  */
+# define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+   If not set, then an unmatched ) is invalid.  */
+# define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* If this bit is set, succeed as soon as we match the whole pattern,
+   without further backtracking.  */
+# define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
+
+/* If this bit is set, do not process the GNU regex operators.
+   If not set, then the GNU regex operators are recognized. */
+# define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
+
+/* If this bit is set, turn on internal regex debugging.
+   If not set, and debugging was on, turn it off.
+   This only works if regex.c is compiled -DDEBUG.
+   We define this bit always, so that all that's needed to turn on
+   debugging is to recompile regex.c; the calling code can always have
+   this bit set, and it won't affect anything in the normal case. */
+# define RE_DEBUG (RE_NO_GNU_OPS << 1)
+
+/* If this bit is set, a syntactically invalid interval is treated as
+   a string of ordinary characters.  For example, the ERE 'a{1' is
+   treated as 'a\{1'.  */
+# define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
+
+/* If this bit is set, then ignore case when matching.
+   If not set, then case is significant.  */
+# define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
+
+/* This bit is used internally like RE_CONTEXT_INDEP_ANCHORS but only
+   for ^, because it is difficult to scan the regex backwards to find
+   whether ^ should be special.  */
+# define RE_CARET_ANCHORS_HERE (RE_ICASE << 1)
+
+/* If this bit is set, then \{ cannot be first in a regex or
+   immediately after an alternation, open-group or \} operator.  */
+# define RE_CONTEXT_INVALID_DUP (RE_CARET_ANCHORS_HERE << 1)
+
+/* If this bit is set, then no_sub will be set to 1 during
+   re_compile_pattern.  */
+# define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1)
+#endif
+
+/* This global variable defines the particular regexp syntax to use (for
+   some interfaces).  When a regexp is compiled, the syntax used is
+   stored in the pattern buffer, so changing this does not affect
+   already-compiled regexps.  */
+extern reg_syntax_t re_syntax_options;
+
+#ifdef __USE_GNU
+/* Define combinations of the above bits for the standard possibilities.
+   (The [[[ comments delimit what gets put into the Texinfo file, so
+   don't delete them!)  */
+/* [[[begin syntaxes]]] */
+# define RE_SYNTAX_EMACS 0
+
+# define RE_SYNTAX_AWK							\
+  (RE_BACKSLASH_ESCAPE_IN_LISTS   | RE_DOT_NOT_NULL			\
+   | RE_NO_BK_PARENS              | RE_NO_BK_REFS			\
+   | RE_NO_BK_VBAR                | RE_NO_EMPTY_RANGES			\
+   | RE_DOT_NEWLINE		  | RE_CONTEXT_INDEP_ANCHORS		\
+   | RE_CHAR_CLASSES							\
+   | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
+
+# define RE_SYNTAX_GNU_AWK						\
+  ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS		\
+    | RE_INVALID_INTERVAL_ORD)						\
+   & ~(RE_DOT_NOT_NULL | RE_CONTEXT_INDEP_OPS				\
+      | RE_CONTEXT_INVALID_OPS ))
+
+# define RE_SYNTAX_POSIX_AWK						\
+  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS		\
+   | RE_INTERVALS	    | RE_NO_GNU_OPS				\
+   | RE_INVALID_INTERVAL_ORD)
+
+# define RE_SYNTAX_GREP							\
+  ((RE_SYNTAX_POSIX_BASIC | RE_NEWLINE_ALT)				\
+   & ~(RE_CONTEXT_INVALID_DUP | RE_DOT_NOT_NULL))
+
+# define RE_SYNTAX_EGREP						\
+  ((RE_SYNTAX_POSIX_EXTENDED | RE_INVALID_INTERVAL_ORD | RE_NEWLINE_ALT) \
+   & ~(RE_CONTEXT_INVALID_OPS | RE_DOT_NOT_NULL))
+
+/* POSIX grep -E behavior is no longer incompatible with GNU.  */
+# define RE_SYNTAX_POSIX_EGREP						\
+  RE_SYNTAX_EGREP
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
+# define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+# define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax.  */
+# define _RE_SYNTAX_POSIX_COMMON					\
+  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL		\
+   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
+
+# define RE_SYNTAX_POSIX_BASIC						\
+  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
+   isn't minimal, since other operators, such as \`, aren't disabled.  */
+# define RE_SYNTAX_POSIX_MINIMAL_BASIC					\
+  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+# define RE_SYNTAX_POSIX_EXTENDED					\
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INDEP_OPS   | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS        | RE_NO_BK_VBAR				\
+   | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
+   removed and RE_NO_BK_REFS is added.  */
+# define RE_SYNTAX_POSIX_MINIMAL_EXTENDED				\
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS        | RE_NO_BK_REFS				\
+   | RE_NO_BK_VBAR	    | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+
+/* Maximum number of duplicates an interval can allow.  POSIX-conforming
+   systems might define this in <limits.h>, but we want our
+   value, so remove any previous define.  */
+# ifdef _REGEX_INCLUDE_LIMITS_H
+#  include <limits.h>
+# endif
+# ifdef RE_DUP_MAX
+#  undef RE_DUP_MAX
+# endif
+
+/* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored
+   the counter as a 2-byte signed integer.  This is no longer true, so
+   RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to
+   ((SIZE_MAX - 9) / 10) if _REGEX_LARGE_OFFSETS is defined.
+   However, there would be a huge performance problem if someone
+   actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains
+   its historical value.  */
+# define RE_DUP_MAX (0x7fff)
+#endif
+
+
+/* POSIX 'cflags' bits (i.e., information for 'regcomp').  */
+
+/* If this bit is set, then use extended regular expression syntax.
+   If not set, then use basic regular expression syntax.  */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+   If not set, then case is significant.  */
+#define REG_ICASE (1 << 1)
+
+/* If this bit is set, then anchors do not match at newline
+     characters in the string.
+   If not set, then anchors do match at newlines.  */
+#define REG_NEWLINE (1 << 2)
+
+/* If this bit is set, then report only success or fail in regexec.
+   If not set, then returns differ between not matching and errors.  */
+#define REG_NOSUB (1 << 3)
+
+
+/* POSIX 'eflags' bits (i.e., information for regexec).  */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+     the beginning of the string (presumably because it's not the
+     beginning of a line).
+   If not set, then the beginning-of-line operator does match the
+     beginning of the string.  */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line.  */
+#define REG_NOTEOL (1 << 1)
+
+/* Use PMATCH[0] to delimit the start and end of the search in the
+   buffer.  */
+#define REG_STARTEND (1 << 2)
+
+
+/* If any error codes are removed, changed, or added, update the
+   '__re_error_msgid' table in regcomp.c.  */
+
+typedef enum
+{
+  _REG_ENOSYS = -1,	/* This will never happen for this implementation.  */
+  _REG_NOERROR = 0,	/* Success.  */
+  _REG_NOMATCH,		/* Didn't find a match (for regexec).  */
+
+  /* POSIX regcomp return error codes.  (In the order listed in the
+     standard.)  */
+  _REG_BADPAT,		/* Invalid pattern.  */
+  _REG_ECOLLATE,	/* Invalid collating element.  */
+  _REG_ECTYPE,		/* Invalid character class name.  */
+  _REG_EESCAPE,		/* Trailing backslash.  */
+  _REG_ESUBREG,		/* Invalid back reference.  */
+  _REG_EBRACK,		/* Unmatched left bracket.  */
+  _REG_EPAREN,		/* Parenthesis imbalance.  */
+  _REG_EBRACE,		/* Unmatched \{.  */
+  _REG_BADBR,		/* Invalid contents of \{\}.  */
+  _REG_ERANGE,		/* Invalid range end.  */
+  _REG_ESPACE,		/* Ran out of memory.  */
+  _REG_BADRPT,		/* No preceding re for repetition op.  */
+
+  /* Error codes we've added.  */
+  _REG_EEND,		/* Premature end.  */
+  _REG_ESIZE,		/* Too large (e.g., repeat count too large).  */
+  _REG_ERPAREN		/* Unmatched ) or \); not returned from regcomp.  */
+} reg_errcode_t;
+
+#if defined _XOPEN_SOURCE || defined __USE_XOPEN2K
+# define REG_ENOSYS	_REG_ENOSYS
+#endif
+#define REG_NOERROR	_REG_NOERROR
+#define REG_NOMATCH	_REG_NOMATCH
+#define REG_BADPAT	_REG_BADPAT
+#define REG_ECOLLATE	_REG_ECOLLATE
+#define REG_ECTYPE	_REG_ECTYPE
+#define REG_EESCAPE	_REG_EESCAPE
+#define REG_ESUBREG	_REG_ESUBREG
+#define REG_EBRACK	_REG_EBRACK
+#define REG_EPAREN	_REG_EPAREN
+#define REG_EBRACE	_REG_EBRACE
+#define REG_BADBR	_REG_BADBR
+#define REG_ERANGE	_REG_ERANGE
+#define REG_ESPACE	_REG_ESPACE
+#define REG_BADRPT	_REG_BADRPT
+#define REG_EEND	_REG_EEND
+#define REG_ESIZE	_REG_ESIZE
+#define REG_ERPAREN	_REG_ERPAREN
+
+/* This data structure represents a compiled pattern.  Before calling
+   the pattern compiler, the fields 'buffer', 'allocated', 'fastmap',
+   and 'translate' can be set.  After the pattern has been compiled,
+   the fields 're_nsub', 'not_bol' and 'not_eol' are available.  All
+   other fields are private to the regex routines.  */
+
+#ifndef RE_TRANSLATE_TYPE
+# define __RE_TRANSLATE_TYPE unsigned char *
+# ifdef __USE_GNU
+#  define RE_TRANSLATE_TYPE __RE_TRANSLATE_TYPE
+# endif
+#endif
+
+#ifdef __USE_GNU
+# define __REPB_PREFIX(name) name
+#else
+# define __REPB_PREFIX(name) __##name
+#endif
+
+struct re_pattern_buffer
+{
+  /* Space that holds the compiled pattern.  The type
+     'struct re_dfa_t' is private and is not declared here.  */
+  struct re_dfa_t *__REPB_PREFIX(buffer);
+
+  /* Number of bytes to which 'buffer' points.  */
+  __re_long_size_t __REPB_PREFIX(allocated);
+
+  /* Number of bytes actually used in 'buffer'.  */
+  __re_long_size_t __REPB_PREFIX(used);
+
+  /* Syntax setting with which the pattern was compiled.  */
+  reg_syntax_t __REPB_PREFIX(syntax);
+
+  /* Pointer to a fastmap, if any, otherwise zero.  re_search uses the
+     fastmap, if there is one, to skip over impossible starting points
+     for matches.  */
+  char *__REPB_PREFIX(fastmap);
+
+  /* Either a translate table to apply to all characters before
+     comparing them, or zero for no translation.  The translation is
+     applied to a pattern when it is compiled and to a string when it
+     is matched.  */
+  __RE_TRANSLATE_TYPE __REPB_PREFIX(translate);
+
+  /* Number of subexpressions found by the compiler.  */
+  size_t re_nsub;
+
+  /* Zero if this pattern cannot match the empty string, one else.
+     Well, in truth it's used only in 're_search_2', to see whether or
+     not we should use the fastmap, so we don't set this absolutely
+     perfectly; see 're_compile_fastmap' (the "duplicate" case).  */
+  unsigned __REPB_PREFIX(can_be_null) : 1;
+
+  /* If REGS_UNALLOCATED, allocate space in the 'regs' structure
+     for 'max (RE_NREGS, re_nsub + 1)' groups.
+     If REGS_REALLOCATE, reallocate space if necessary.
+     If REGS_FIXED, use what's there.  */
+#ifdef __USE_GNU
+# define REGS_UNALLOCATED 0
+# define REGS_REALLOCATE 1
+# define REGS_FIXED 2
+#endif
+  unsigned __REPB_PREFIX(regs_allocated) : 2;
+
+  /* Set to zero when 're_compile_pattern' compiles a pattern; set to
+     one by 're_compile_fastmap' if it updates the fastmap.  */
+  unsigned __REPB_PREFIX(fastmap_accurate) : 1;
+
+  /* If set, 're_match_2' does not return information about
+     subexpressions.  */
+  unsigned __REPB_PREFIX(no_sub) : 1;
+
+  /* If set, a beginning-of-line anchor doesn't match at the beginning
+     of the string.  */
+  unsigned __REPB_PREFIX(not_bol) : 1;
+
+  /* Similarly for an end-of-line anchor.  */
+  unsigned __REPB_PREFIX(not_eol) : 1;
+
+  /* If true, an anchor at a newline matches.  */
+  unsigned __REPB_PREFIX(newline_anchor) : 1;
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+/* Type for byte offsets within the string.  POSIX mandates this.  */
+#ifdef _REGEX_LARGE_OFFSETS
+/* POSIX 1003.1-2008 requires that regoff_t be at least as wide as
+   ptrdiff_t and ssize_t.  We don't know of any hosts where ptrdiff_t
+   is wider than ssize_t, so ssize_t is safe.  ptrdiff_t is not
+   visible here, so use ssize_t.  */
+typedef ssize_t regoff_t;
+#else
+/* The traditional GNU regex implementation mishandles strings longer
+   than INT_MAX.  */
+typedef int regoff_t;
+#endif
+
+
+#ifdef __USE_GNU
+/* This is the structure we store register match data in.  See
+   regex.texinfo for a full description of what registers match.  */
+struct re_registers
+{
+  __re_size_t num_regs;
+  regoff_t *start;
+  regoff_t *end;
+};
+
+
+/* If 'regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+   're_match_2' returns information about at least this many registers
+   the first time a 'regs' structure is passed.  */
+# ifndef RE_NREGS
+#  define RE_NREGS 30
+# endif
+#endif
+
+
+/* POSIX specification for registers.  Aside from the different names than
+   're_registers', POSIX uses an array of structures, instead of a
+   structure of arrays.  */
+typedef struct
+{
+  regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
+  regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
+} regmatch_t;
+
+/* Declarations for routines.  */
+
+#ifdef __USE_GNU
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+   You can also simply assign to the 're_syntax_options' variable.  */
+extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
+
+/* Compile the regular expression PATTERN, with length LENGTH
+   and syntax given by the global 're_syntax_options', into the buffer
+   BUFFER.  Return NULL if successful, and an error string if not.
+
+   To free the allocated storage, you must call 'regfree' on BUFFER.
+   Note that the translate table must either have been initialized by
+   'regcomp', with a malloc'ed value, or set to NULL before calling
+   'regfree'.  */
+extern const char *re_compile_pattern (const char *__pattern, size_t __length,
+				       struct re_pattern_buffer *__buffer);
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+   accelerate searches.  Return 0 if successful and -2 if was an
+   internal error.  */
+extern int re_compile_fastmap (struct re_pattern_buffer *__buffer);
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+   compiled into BUFFER.  Start searching at position START, for RANGE
+   characters.  Return the starting position of the match, -1 for no
+   match, or -2 for an internal error.  Also return register
+   information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
+extern regoff_t re_search (struct re_pattern_buffer *__buffer,
+			   const char *__String, regoff_t __length,
+			   regoff_t __start, regoff_t __range,
+			   struct re_registers *__regs);
+
+
+/* Like 're_search', but search in the concatenation of STRING1 and
+   STRING2.  Also, stop searching at index START + STOP.  */
+extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
+			     const char *__string1, regoff_t __length1,
+			     const char *__string2, regoff_t __length2,
+			     regoff_t __start, regoff_t __range,
+			     struct re_registers *__regs,
+			     regoff_t __stop);
+
+
+/* Like 're_search', but return how many characters in STRING the regexp
+   in BUFFER matched, starting at position START.  */
+extern regoff_t re_match (struct re_pattern_buffer *__buffer,
+			  const char *__String, regoff_t __length,
+			  regoff_t __start, struct re_registers *__regs);
+
+
+/* Relates to 're_match' as 're_search_2' relates to 're_search'.  */
+extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
+			    const char *__string1, regoff_t __length1,
+			    const char *__string2, regoff_t __length2,
+			    regoff_t __start, struct re_registers *__regs,
+			    regoff_t __stop);
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using BUFFER and REGS will use this memory
+   for recording register information.  STARTS and ENDS must be
+   allocated with malloc, and must each be at least 'NUM_REGS * sizeof
+   (regoff_t)' bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   BUFFER will allocate its own register data, without
+   freeing the old data.  */
+extern void re_set_registers (struct re_pattern_buffer *__buffer,
+			      struct re_registers *__regs,
+			      __re_size_t __num_regs,
+			      regoff_t *__starts, regoff_t *__ends);
+#endif	/* Use GNU */
+
+#if defined _REGEX_RE_COMP || (defined _LIBC && defined __USE_MISC)
+# ifndef _CRAY
+/* 4.2 bsd compatibility.  */
+extern char *re_comp (const char *);
+extern int re_exec (const char *);
+# endif
+#endif
+
+/* For plain 'restrict', use glibc's __restrict if defined.
+   Otherwise, GCC 2.95 and later have "__restrict"; C99 compilers have
+   "restrict", and "configure" may have defined "restrict".
+   Other compilers use __restrict, __restrict__, and _Restrict, and
+   'configure' might #define 'restrict' to those words, so pick a
+   different name.  */
+#ifndef _Restrict_
+# if defined __restrict || 2 < __GNUC__ + (95 <= __GNUC_MINOR__)
+#  define _Restrict_ __restrict
+# elif 199901L <= __STDC_VERSION__ || defined restrict
+#  define _Restrict_ restrict
+# else
+#  define _Restrict_
+# endif
+#endif
+/* For [restrict], use glibc's __restrict_arr if available.
+   Otherwise, GCC 3.1 (not in C++ mode) and C99 support [restrict].  */
+#ifndef _Restrict_arr_
+# ifdef __restrict_arr
+#  define _Restrict_arr_ __restrict_arr
+# elif ((199901L <= __STDC_VERSION__ || 3 < __GNUC__ + (1 <= __GNUC_MINOR__)) \
+        && !defined __GNUG__)
+#  define _Restrict_arr_ _Restrict_
+# else
+#  define _Restrict_arr_
+# endif
+#endif
+
+/* POSIX compatibility.  */
+extern int regcomp (regex_t *_Restrict_ __preg,
+		    const char *_Restrict_ __pattern,
+		    int __cflags);
+
+extern int regexec (const regex_t *_Restrict_ __preg,
+		    const char *_Restrict_ __String, size_t __nmatch,
+		    regmatch_t __pmatch[_Restrict_arr_],
+		    int __eflags);
+
+extern size_t regerror (int __errcode, const regex_t *_Restrict_ __preg,
+			char *_Restrict_ __errbuf, size_t __errbuf_size);
+
+extern void regfree (regex_t *__preg);
+
+
+#ifdef __cplusplus
+}
+#endif	/* C++ */
+
+#endif /* regex.h */
diff --git a/gawk-5.0.1/support/regex_internal.c b/gawk-5.0.1/support/regex_internal.c
new file mode 100644
index 00000000000..9004ce809eb
--- /dev/null
+++ b/gawk-5.0.1/support/regex_internal.c
@@ -0,0 +1,1746 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+static void re_string_construct_common (const char *str, Idx len,
+					re_string_t *pstr,
+					RE_TRANSLATE_TYPE trans, bool icase,
+					const re_dfa_t *dfa);
+static re_dfastate_t *create_ci_newstate (const re_dfa_t *dfa,
+					  const re_node_set *nodes,
+					  re_hashval_t hash);
+static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa,
+					  const re_node_set *nodes,
+					  unsigned int context,
+					  re_hashval_t hash);
+static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
+						Idx new_buf_len);
+#ifdef RE_ENABLE_I18N
+static void build_wcs_buffer (re_string_t *pstr);
+static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr);
+#endif /* RE_ENABLE_I18N */
+static void build_upper_buffer (re_string_t *pstr);
+static void re_string_translate_buffer (re_string_t *pstr);
+static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
+					  int eflags) __attribute__ ((pure));
+
+/* Functions for string operation.  */
+
+/* This function allocate the buffers.  It is necessary to call
+   re_string_reconstruct before using the object.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_string_allocate (re_string_t *pstr, const char *str, Idx len, Idx init_len,
+		    RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
+{
+  reg_errcode_t ret;
+  Idx init_buf_len;
+
+  /* Ensure at least one character fits into the buffers.  */
+  if (init_len < dfa->mb_cur_max)
+    init_len = dfa->mb_cur_max;
+  init_buf_len = (len + 1 < init_len) ? len + 1: init_len;
+  re_string_construct_common (str, len, pstr, trans, icase, dfa);
+
+  ret = re_string_realloc_buffers (pstr, init_buf_len);
+  if (__glibc_unlikely (ret != REG_NOERROR))
+    return ret;
+
+  pstr->word_char = dfa->word_char;
+  pstr->word_ops_used = dfa->word_ops_used;
+  pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
+  pstr->valid_len = (pstr->mbs_allocated || dfa->mb_cur_max > 1) ? 0 : len;
+  pstr->valid_raw_len = pstr->valid_len;
+  return REG_NOERROR;
+}
+
+/* This function allocate the buffers, and initialize them.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_string_construct (re_string_t *pstr, const char *str, Idx len,
+		     RE_TRANSLATE_TYPE trans, bool icase, const re_dfa_t *dfa)
+{
+  reg_errcode_t ret;
+  memset (pstr, '\0', sizeof (re_string_t));
+  re_string_construct_common (str, len, pstr, trans, icase, dfa);
+
+  if (len > 0)
+    {
+      ret = re_string_realloc_buffers (pstr, len + 1);
+      if (__glibc_unlikely (ret != REG_NOERROR))
+	return ret;
+    }
+  pstr->mbs = pstr->mbs_allocated ? pstr->mbs : (unsigned char *) str;
+
+  if (icase)
+    {
+#ifdef RE_ENABLE_I18N
+      if (dfa->mb_cur_max > 1)
+	{
+	  while (1)
+	    {
+	      ret = build_wcs_upper_buffer (pstr);
+	      if (__glibc_unlikely (ret != REG_NOERROR))
+		return ret;
+	      if (pstr->valid_raw_len >= len)
+		break;
+	      if (pstr->bufs_len > pstr->valid_len + dfa->mb_cur_max)
+		break;
+	      ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
+	      if (__glibc_unlikely (ret != REG_NOERROR))
+		return ret;
+	    }
+	}
+      else
+#endif /* RE_ENABLE_I18N  */
+	build_upper_buffer (pstr);
+    }
+  else
+    {
+#ifdef RE_ENABLE_I18N
+      if (dfa->mb_cur_max > 1)
+	build_wcs_buffer (pstr);
+      else
+#endif /* RE_ENABLE_I18N  */
+	{
+	  if (trans != NULL)
+	    re_string_translate_buffer (pstr);
+	  else
+	    {
+	      pstr->valid_len = pstr->bufs_len;
+	      pstr->valid_raw_len = pstr->bufs_len;
+	    }
+	}
+    }
+
+  return REG_NOERROR;
+}
+
+/* Helper functions for re_string_allocate, and re_string_construct.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len)
+{
+#ifdef RE_ENABLE_I18N
+  if (pstr->mb_cur_max > 1)
+    {
+      wint_t *new_wcs;
+
+      /* Avoid overflow in realloc.  */
+      const size_t max_object_size = MAX (sizeof (wint_t), sizeof (Idx));
+      if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size)
+			    < new_buf_len))
+	return REG_ESPACE;
+
+      new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len);
+      if (__glibc_unlikely (new_wcs == NULL))
+	return REG_ESPACE;
+      pstr->wcs = new_wcs;
+      if (pstr->offsets != NULL)
+	{
+	  Idx *new_offsets = re_realloc (pstr->offsets, Idx, new_buf_len);
+	  if (__glibc_unlikely (new_offsets == NULL))
+	    return REG_ESPACE;
+	  pstr->offsets = new_offsets;
+	}
+    }
+#endif /* RE_ENABLE_I18N  */
+  if (pstr->mbs_allocated)
+    {
+      unsigned char *new_mbs = re_realloc (pstr->mbs, unsigned char,
+					   new_buf_len);
+      if (__glibc_unlikely (new_mbs == NULL))
+	return REG_ESPACE;
+      pstr->mbs = new_mbs;
+    }
+  pstr->bufs_len = new_buf_len;
+  return REG_NOERROR;
+}
+
+
+static void
+re_string_construct_common (const char *str, Idx len, re_string_t *pstr,
+			    RE_TRANSLATE_TYPE trans, bool icase,
+			    const re_dfa_t *dfa)
+{
+  pstr->raw_mbs = (const unsigned char *) str;
+  pstr->len = len;
+  pstr->raw_len = len;
+  pstr->trans = trans;
+  pstr->icase = icase;
+  pstr->mbs_allocated = (trans != NULL || icase);
+  pstr->mb_cur_max = dfa->mb_cur_max;
+  pstr->is_utf8 = dfa->is_utf8;
+  pstr->map_notascii = dfa->map_notascii;
+  pstr->stop = pstr->len;
+  pstr->raw_stop = pstr->stop;
+}
+
+#ifdef RE_ENABLE_I18N
+
+/* Build wide character buffer PSTR->WCS.
+   If the byte sequence of the string are:
+     <mb1>(0), <mb1>(1), <mb2>(0), <mb2>(1), <sb3>
+   Then wide character buffer will be:
+     <wc1>   , WEOF    , <wc2>   , WEOF    , <wc3>
+   We use WEOF for padding, they indicate that the position isn't
+   a first byte of a multibyte character.
+
+   Note that this function assumes PSTR->VALID_LEN elements are already
+   built and starts from PSTR->VALID_LEN.  */
+
+static void
+build_wcs_buffer (re_string_t *pstr)
+{
+#ifdef _LIBC
+  unsigned char buf[MB_LEN_MAX];
+  assert (MB_LEN_MAX >= pstr->mb_cur_max);
+#else
+  unsigned char buf[64];
+#endif
+  mbstate_t prev_st;
+  Idx byte_idx, end_idx, remain_len;
+  size_t mbclen;
+
+  /* Build the buffers from pstr->valid_len to either pstr->len or
+     pstr->bufs_len.  */
+  end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+  for (byte_idx = pstr->valid_len; byte_idx < end_idx;)
+    {
+      wchar_t wc;
+      const char *p;
+
+      remain_len = end_idx - byte_idx;
+      prev_st = pstr->cur_state;
+      /* Apply the translation if we need.  */
+      if (__glibc_unlikely (pstr->trans != NULL))
+	{
+	  int i, ch;
+
+	  for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
+	    {
+	      ch = pstr->raw_mbs [pstr->raw_mbs_idx + byte_idx + i];
+	      buf[i] = pstr->mbs[byte_idx + i] = pstr->trans[ch];
+	    }
+	  p = (const char *) buf;
+	}
+      else
+	p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx;
+      mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
+      if (__glibc_unlikely (mbclen == (size_t) -1 || mbclen == 0
+			    || (mbclen == (size_t) -2
+				&& pstr->bufs_len >= pstr->len)))
+	{
+	  /* We treat these cases as a singlebyte character.  */
+	  mbclen = 1;
+	  wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+	  if (__glibc_unlikely (pstr->trans != NULL))
+	    wc = pstr->trans[wc];
+	  pstr->cur_state = prev_st;
+	}
+      else if (__glibc_unlikely (mbclen == (size_t) -2))
+	{
+	  /* The buffer doesn't have enough space, finish to build.  */
+	  pstr->cur_state = prev_st;
+	  break;
+	}
+
+      /* Write wide character and padding.  */
+      pstr->wcs[byte_idx++] = wc;
+      /* Write paddings.  */
+      for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+	pstr->wcs[byte_idx++] = WEOF;
+    }
+  pstr->valid_len = byte_idx;
+  pstr->valid_raw_len = byte_idx;
+}
+
+/* Build wide character buffer PSTR->WCS like build_wcs_buffer,
+   but for REG_ICASE.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+build_wcs_upper_buffer (re_string_t *pstr)
+{
+  mbstate_t prev_st;
+  Idx src_idx, byte_idx, end_idx, remain_len;
+  size_t mbclen;
+#ifdef _LIBC
+  char buf[MB_LEN_MAX];
+  assert (MB_LEN_MAX >= pstr->mb_cur_max);
+#else
+  char buf[64];
+#endif
+
+  byte_idx = pstr->valid_len;
+  end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+  /* The following optimization assumes that ASCII characters can be
+     mapped to wide characters with a simple cast.  */
+  if (! pstr->map_notascii && pstr->trans == NULL && !pstr->offsets_needed)
+    {
+      while (byte_idx < end_idx)
+	{
+	  wchar_t wc;
+
+	  if (isascii (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx])
+	      && mbsinit (&pstr->cur_state))
+	    {
+	      /* In case of a singlebyte character.  */
+	      pstr->mbs[byte_idx]
+		= toupper (pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]);
+	      /* The next step uses the assumption that wchar_t is encoded
+		 ASCII-safe: all ASCII values can be converted like this.  */
+	      pstr->wcs[byte_idx] = (wchar_t) pstr->mbs[byte_idx];
+	      ++byte_idx;
+	      continue;
+	    }
+
+	  remain_len = end_idx - byte_idx;
+	  prev_st = pstr->cur_state;
+	  mbclen = __mbrtowc (&wc,
+			      ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx
+			       + byte_idx), remain_len, &pstr->cur_state);
+	  if (__glibc_likely (0 < mbclen && mbclen < (size_t) -2))
+	    {
+	      wchar_t wcu = __towupper (wc);
+	      if (wcu != wc)
+		{
+		  size_t mbcdlen;
+
+		  mbcdlen = __wcrtomb (buf, wcu, &prev_st);
+		  if (__glibc_likely (mbclen == mbcdlen))
+		    memcpy (pstr->mbs + byte_idx, buf, mbclen);
+		  else
+		    {
+		      src_idx = byte_idx;
+		      goto offsets_needed;
+		    }
+		}
+	      else
+		memcpy (pstr->mbs + byte_idx,
+			pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx, mbclen);
+	      pstr->wcs[byte_idx++] = wcu;
+	      /* Write paddings.  */
+	      for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+		pstr->wcs[byte_idx++] = WEOF;
+	    }
+	  else if (mbclen == (size_t) -1 || mbclen == 0
+		   || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
+	    {
+	      /* It is an invalid character, an incomplete character
+		 at the end of the string, or '\0'.  Just use the byte.  */
+	      int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+	      pstr->mbs[byte_idx] = ch;
+	      /* And also cast it to wide char.  */
+	      pstr->wcs[byte_idx++] = (wchar_t) ch;
+	      if (__glibc_unlikely (mbclen == (size_t) -1))
+		pstr->cur_state = prev_st;
+	    }
+	  else
+	    {
+	      /* The buffer doesn't have enough space, finish to build.  */
+	      pstr->cur_state = prev_st;
+	      break;
+	    }
+	}
+      pstr->valid_len = byte_idx;
+      pstr->valid_raw_len = byte_idx;
+      return REG_NOERROR;
+    }
+  else
+    for (src_idx = pstr->valid_raw_len; byte_idx < end_idx;)
+      {
+	wchar_t wc;
+	const char *p;
+      offsets_needed:
+	remain_len = end_idx - byte_idx;
+	prev_st = pstr->cur_state;
+	if (__glibc_unlikely (pstr->trans != NULL))
+	  {
+	    int i, ch;
+
+	    for (i = 0; i < pstr->mb_cur_max && i < remain_len; ++i)
+	      {
+		ch = pstr->raw_mbs [pstr->raw_mbs_idx + src_idx + i];
+		buf[i] = pstr->trans[ch];
+	      }
+	    p = (const char *) buf;
+	  }
+	else
+	  p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + src_idx;
+	mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
+	if (__glibc_likely (0 < mbclen && mbclen < (size_t) -2))
+	  {
+	    wchar_t wcu = __towupper (wc);
+	    if (wcu != wc)
+	      {
+		size_t mbcdlen;
+
+		mbcdlen = __wcrtomb ((char *) buf, wcu, &prev_st);
+		if (__glibc_likely (mbclen == mbcdlen))
+		  memcpy (pstr->mbs + byte_idx, buf, mbclen);
+		else if (mbcdlen != (size_t) -1)
+		  {
+		    size_t i;
+
+		    if (byte_idx + mbcdlen > pstr->bufs_len)
+		      {
+			pstr->cur_state = prev_st;
+			break;
+		      }
+
+		    if (pstr->offsets == NULL)
+		      {
+			pstr->offsets = re_malloc (Idx, pstr->bufs_len);
+
+			if (pstr->offsets == NULL)
+			  return REG_ESPACE;
+		      }
+		    if (!pstr->offsets_needed)
+		      {
+			for (i = 0; i < (size_t) byte_idx; ++i)
+			  pstr->offsets[i] = i;
+			pstr->offsets_needed = 1;
+		      }
+
+		    memcpy (pstr->mbs + byte_idx, buf, mbcdlen);
+		    pstr->wcs[byte_idx] = wcu;
+		    pstr->offsets[byte_idx] = src_idx;
+		    for (i = 1; i < mbcdlen; ++i)
+		      {
+			pstr->offsets[byte_idx + i]
+			  = src_idx + (i < mbclen ? i : mbclen - 1);
+			pstr->wcs[byte_idx + i] = WEOF;
+		      }
+		    pstr->len += mbcdlen - mbclen;
+		    if (pstr->raw_stop > src_idx)
+		      pstr->stop += mbcdlen - mbclen;
+		    end_idx = (pstr->bufs_len > pstr->len)
+			      ? pstr->len : pstr->bufs_len;
+		    byte_idx += mbcdlen;
+		    src_idx += mbclen;
+		    continue;
+		  }
+		else
+		  memcpy (pstr->mbs + byte_idx, p, mbclen);
+	      }
+	    else
+	      memcpy (pstr->mbs + byte_idx, p, mbclen);
+
+	    if (__glibc_unlikely (pstr->offsets_needed != 0))
+	      {
+		size_t i;
+		for (i = 0; i < mbclen; ++i)
+		  pstr->offsets[byte_idx + i] = src_idx + i;
+	      }
+	    src_idx += mbclen;
+
+	    pstr->wcs[byte_idx++] = wcu;
+	    /* Write paddings.  */
+	    for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+	      pstr->wcs[byte_idx++] = WEOF;
+	  }
+	else if (mbclen == (size_t) -1 || mbclen == 0
+		 || (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
+	  {
+	    /* It is an invalid character or '\0'.  Just use the byte.  */
+	    int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx];
+
+	    if (__glibc_unlikely (pstr->trans != NULL))
+	      ch = pstr->trans [ch];
+	    pstr->mbs[byte_idx] = ch;
+
+	    if (__glibc_unlikely (pstr->offsets_needed != 0))
+	      pstr->offsets[byte_idx] = src_idx;
+	    ++src_idx;
+
+	    /* And also cast it to wide char.  */
+	    pstr->wcs[byte_idx++] = (wchar_t) ch;
+	    if (__glibc_unlikely (mbclen == (size_t) -1))
+	      pstr->cur_state = prev_st;
+	  }
+	else
+	  {
+	    /* The buffer doesn't have enough space, finish to build.  */
+	    pstr->cur_state = prev_st;
+	    break;
+	  }
+      }
+  pstr->valid_len = byte_idx;
+  pstr->valid_raw_len = src_idx;
+  return REG_NOERROR;
+}
+
+/* Skip characters until the index becomes greater than NEW_RAW_IDX.
+   Return the index.  */
+
+static Idx
+re_string_skip_chars (re_string_t *pstr, Idx new_raw_idx, wint_t *last_wc)
+{
+  mbstate_t prev_st;
+  Idx rawbuf_idx;
+  size_t mbclen;
+  wint_t wc = WEOF;
+
+  /* Skip the characters which are not necessary to check.  */
+  for (rawbuf_idx = pstr->raw_mbs_idx + pstr->valid_raw_len;
+       rawbuf_idx < new_raw_idx;)
+    {
+      wchar_t wc2;
+      Idx remain_len = pstr->raw_len - rawbuf_idx;
+      prev_st = pstr->cur_state;
+      mbclen = __mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx,
+			  remain_len, &pstr->cur_state);
+      if (__glibc_unlikely (mbclen == (size_t) -2 || mbclen == (size_t) -1
+			    || mbclen == 0))
+	{
+	  /* We treat these cases as a single byte character.  */
+	  if (mbclen == 0 || remain_len == 0)
+	    wc = L'\0';
+	  else
+	    wc = *(unsigned char *) (pstr->raw_mbs + rawbuf_idx);
+	  mbclen = 1;
+	  pstr->cur_state = prev_st;
+	}
+      else
+	wc = wc2;
+      /* Then proceed the next character.  */
+      rawbuf_idx += mbclen;
+    }
+  *last_wc = wc;
+  return rawbuf_idx;
+}
+#endif /* RE_ENABLE_I18N  */
+
+/* Build the buffer PSTR->MBS, and apply the translation if we need.
+   This function is used in case of REG_ICASE.  */
+
+static void
+build_upper_buffer (re_string_t *pstr)
+{
+  Idx char_idx, end_idx;
+  end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+  for (char_idx = pstr->valid_len; char_idx < end_idx; ++char_idx)
+    {
+      int ch = pstr->raw_mbs[pstr->raw_mbs_idx + char_idx];
+      if (__glibc_unlikely (pstr->trans != NULL))
+	ch = pstr->trans[ch];
+      pstr->mbs[char_idx] = toupper (ch);
+    }
+  pstr->valid_len = char_idx;
+  pstr->valid_raw_len = char_idx;
+}
+
+/* Apply TRANS to the buffer in PSTR.  */
+
+static void
+re_string_translate_buffer (re_string_t *pstr)
+{
+  Idx buf_idx, end_idx;
+  end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+  for (buf_idx = pstr->valid_len; buf_idx < end_idx; ++buf_idx)
+    {
+      int ch = pstr->raw_mbs[pstr->raw_mbs_idx + buf_idx];
+      pstr->mbs[buf_idx] = pstr->trans[ch];
+    }
+
+  pstr->valid_len = buf_idx;
+  pstr->valid_raw_len = buf_idx;
+}
+
+/* This function re-construct the buffers.
+   Concretely, convert to wide character in case of pstr->mb_cur_max > 1,
+   convert to upper case in case of REG_ICASE, apply translation.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags)
+{
+  Idx offset;
+
+  if (__glibc_unlikely (pstr->raw_mbs_idx <= idx))
+    offset = idx - pstr->raw_mbs_idx;
+  else
+    {
+      /* Reset buffer.  */
+#ifdef RE_ENABLE_I18N
+      if (pstr->mb_cur_max > 1)
+	memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
+#endif /* RE_ENABLE_I18N */
+      pstr->len = pstr->raw_len;
+      pstr->stop = pstr->raw_stop;
+      pstr->valid_len = 0;
+      pstr->raw_mbs_idx = 0;
+      pstr->valid_raw_len = 0;
+      pstr->offsets_needed = 0;
+      pstr->tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+			   : CONTEXT_NEWLINE | CONTEXT_BEGBUF);
+      if (!pstr->mbs_allocated)
+	pstr->mbs = (unsigned char *) pstr->raw_mbs;
+      offset = idx;
+    }
+
+  if (__glibc_likely (offset != 0))
+    {
+      /* Should the already checked characters be kept?  */
+      if (__glibc_likely (offset < pstr->valid_raw_len))
+	{
+	  /* Yes, move them to the front of the buffer.  */
+#ifdef RE_ENABLE_I18N
+	  if (__glibc_unlikely (pstr->offsets_needed))
+	    {
+	      Idx low = 0, high = pstr->valid_len, mid;
+	      do
+		{
+		  mid = (high + low) / 2;
+		  if (pstr->offsets[mid] > offset)
+		    high = mid;
+		  else if (pstr->offsets[mid] < offset)
+		    low = mid + 1;
+		  else
+		    break;
+		}
+	      while (low < high);
+	      if (pstr->offsets[mid] < offset)
+		++mid;
+	      pstr->tip_context = re_string_context_at (pstr, mid - 1,
+							eflags);
+	      /* This can be quite complicated, so handle specially
+		 only the common and easy case where the character with
+		 different length representation of lower and upper
+		 case is present at or after offset.  */
+	      if (pstr->valid_len > offset
+		  && mid == offset && pstr->offsets[mid] == offset)
+		{
+		  memmove (pstr->wcs, pstr->wcs + offset,
+			   (pstr->valid_len - offset) * sizeof (wint_t));
+		  memmove (pstr->mbs, pstr->mbs + offset, pstr->valid_len - offset);
+		  pstr->valid_len -= offset;
+		  pstr->valid_raw_len -= offset;
+		  for (low = 0; low < pstr->valid_len; low++)
+		    pstr->offsets[low] = pstr->offsets[low + offset] - offset;
+		}
+	      else
+		{
+		  /* Otherwise, just find out how long the partial multibyte
+		     character at offset is and fill it with WEOF/255.  */
+		  pstr->len = pstr->raw_len - idx + offset;
+		  pstr->stop = pstr->raw_stop - idx + offset;
+		  pstr->offsets_needed = 0;
+		  while (mid > 0 && pstr->offsets[mid - 1] == offset)
+		    --mid;
+		  while (mid < pstr->valid_len)
+		    if (pstr->wcs[mid] != WEOF)
+		      break;
+		    else
+		      ++mid;
+		  if (mid == pstr->valid_len)
+		    pstr->valid_len = 0;
+		  else
+		    {
+		      pstr->valid_len = pstr->offsets[mid] - offset;
+		      if (pstr->valid_len)
+			{
+			  for (low = 0; low < pstr->valid_len; ++low)
+			    pstr->wcs[low] = WEOF;
+			  memset (pstr->mbs, 255, pstr->valid_len);
+			}
+		    }
+		  pstr->valid_raw_len = pstr->valid_len;
+		}
+	    }
+	  else
+#endif
+	    {
+	      pstr->tip_context = re_string_context_at (pstr, offset - 1,
+							eflags);
+#ifdef RE_ENABLE_I18N
+	      if (pstr->mb_cur_max > 1)
+		memmove (pstr->wcs, pstr->wcs + offset,
+			 (pstr->valid_len - offset) * sizeof (wint_t));
+#endif /* RE_ENABLE_I18N */
+	      if (__glibc_unlikely (pstr->mbs_allocated))
+		memmove (pstr->mbs, pstr->mbs + offset,
+			 pstr->valid_len - offset);
+	      pstr->valid_len -= offset;
+	      pstr->valid_raw_len -= offset;
+#if defined DEBUG && DEBUG
+	      assert (pstr->valid_len > 0);
+#endif
+	    }
+	}
+      else
+	{
+#ifdef RE_ENABLE_I18N
+	  /* No, skip all characters until IDX.  */
+	  Idx prev_valid_len = pstr->valid_len;
+
+	  if (__glibc_unlikely (pstr->offsets_needed))
+	    {
+	      pstr->len = pstr->raw_len - idx + offset;
+	      pstr->stop = pstr->raw_stop - idx + offset;
+	      pstr->offsets_needed = 0;
+	    }
+#endif
+	  pstr->valid_len = 0;
+#ifdef RE_ENABLE_I18N
+	  if (pstr->mb_cur_max > 1)
+	    {
+	      Idx wcs_idx;
+	      wint_t wc = WEOF;
+
+	      if (pstr->is_utf8)
+		{
+		  const unsigned char *raw, *p, *end;
+
+		  /* Special case UTF-8.  Multi-byte chars start with any
+		     byte other than 0x80 - 0xbf.  */
+		  raw = pstr->raw_mbs + pstr->raw_mbs_idx;
+		  end = raw + (offset - pstr->mb_cur_max);
+		  if (end < pstr->raw_mbs)
+		    end = pstr->raw_mbs;
+		  p = raw + offset - 1;
+#ifdef _LIBC
+		  /* We know the wchar_t encoding is UCS4, so for the simple
+		     case, ASCII characters, skip the conversion step.  */
+		  if (isascii (*p) && __glibc_likely (pstr->trans == NULL))
+		    {
+		      memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
+		      /* pstr->valid_len = 0; */
+		      wc = (wchar_t) *p;
+		    }
+		  else
+#endif
+		    for (; p >= end; --p)
+		      if ((*p & 0xc0) != 0x80)
+			{
+			  mbstate_t cur_state;
+			  wchar_t wc2;
+			  Idx mlen = raw + pstr->len - p;
+			  unsigned char buf[6];
+			  size_t mbclen;
+
+			  const unsigned char *pp = p;
+			  if (__glibc_unlikely (pstr->trans != NULL))
+			    {
+			      int i = mlen < 6 ? mlen : 6;
+			      while (--i >= 0)
+				buf[i] = pstr->trans[p[i]];
+			      pp = buf;
+			    }
+			  /* XXX Don't use mbrtowc, we know which conversion
+			     to use (UTF-8 -> UCS4).  */
+			  memset (&cur_state, 0, sizeof (cur_state));
+			  mbclen = __mbrtowc (&wc2, (const char *) pp, mlen,
+					      &cur_state);
+			  if (raw + offset - p <= mbclen
+			      && mbclen < (size_t) -2)
+			    {
+			      memset (&pstr->cur_state, '\0',
+				      sizeof (mbstate_t));
+			      pstr->valid_len = mbclen - (raw + offset - p);
+			      wc = wc2;
+			    }
+			  break;
+			}
+		}
+
+	      if (wc == WEOF)
+		pstr->valid_len = re_string_skip_chars (pstr, idx, &wc) - idx;
+	      if (wc == WEOF)
+		pstr->tip_context
+		  = re_string_context_at (pstr, prev_valid_len - 1, eflags);
+	      else
+		pstr->tip_context = ((__glibc_unlikely (pstr->word_ops_used != 0)
+				      && IS_WIDE_WORD_CHAR (wc))
+				     ? CONTEXT_WORD
+				     : ((IS_WIDE_NEWLINE (wc)
+					 && pstr->newline_anchor)
+					? CONTEXT_NEWLINE : 0));
+	      if (__glibc_unlikely (pstr->valid_len))
+		{
+		  for (wcs_idx = 0; wcs_idx < pstr->valid_len; ++wcs_idx)
+		    pstr->wcs[wcs_idx] = WEOF;
+		  if (pstr->mbs_allocated)
+		    memset (pstr->mbs, 255, pstr->valid_len);
+		}
+	      pstr->valid_raw_len = pstr->valid_len;
+	    }
+	  else
+#endif /* RE_ENABLE_I18N */
+	    {
+	      int c = pstr->raw_mbs[pstr->raw_mbs_idx + offset - 1];
+	      pstr->valid_raw_len = 0;
+	      if (pstr->trans)
+		c = pstr->trans[c];
+	      pstr->tip_context = (bitset_contain (pstr->word_char, c)
+				   ? CONTEXT_WORD
+				   : ((IS_NEWLINE (c) && pstr->newline_anchor)
+				      ? CONTEXT_NEWLINE : 0));
+	    }
+	}
+      if (!__glibc_unlikely (pstr->mbs_allocated))
+	pstr->mbs += offset;
+    }
+  pstr->raw_mbs_idx = idx;
+  pstr->len -= offset;
+  pstr->stop -= offset;
+
+  /* Then build the buffers.  */
+#ifdef RE_ENABLE_I18N
+  if (pstr->mb_cur_max > 1)
+    {
+      if (pstr->icase)
+	{
+	  reg_errcode_t ret = build_wcs_upper_buffer (pstr);
+	  if (__glibc_unlikely (ret != REG_NOERROR))
+	    return ret;
+	}
+      else
+	build_wcs_buffer (pstr);
+    }
+  else
+#endif /* RE_ENABLE_I18N */
+    if (__glibc_unlikely (pstr->mbs_allocated))
+      {
+	if (pstr->icase)
+	  build_upper_buffer (pstr);
+	else if (pstr->trans != NULL)
+	  re_string_translate_buffer (pstr);
+      }
+    else
+      pstr->valid_len = pstr->len;
+
+  pstr->cur_idx = 0;
+  return REG_NOERROR;
+}
+
+static unsigned char
+__attribute__ ((pure))
+re_string_peek_byte_case (const re_string_t *pstr, Idx idx)
+{
+  int ch;
+  Idx off;
+
+  /* Handle the common (easiest) cases first.  */
+  if (__glibc_likely (!pstr->mbs_allocated))
+    return re_string_peek_byte (pstr, idx);
+
+#ifdef RE_ENABLE_I18N
+  if (pstr->mb_cur_max > 1
+      && ! re_string_is_single_byte_char (pstr, pstr->cur_idx + idx))
+    return re_string_peek_byte (pstr, idx);
+#endif
+
+  off = pstr->cur_idx + idx;
+#ifdef RE_ENABLE_I18N
+  if (pstr->offsets_needed)
+    off = pstr->offsets[off];
+#endif
+
+  ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
+
+#ifdef RE_ENABLE_I18N
+  /* Ensure that e.g. for tr_TR.UTF-8 BACKSLASH DOTLESS SMALL LETTER I
+     this function returns CAPITAL LETTER I instead of first byte of
+     DOTLESS SMALL LETTER I.  The latter would confuse the parser,
+     since peek_byte_case doesn't advance cur_idx in any way.  */
+  if (pstr->offsets_needed && !isascii (ch))
+    return re_string_peek_byte (pstr, idx);
+#endif
+
+  return ch;
+}
+
+static unsigned char
+re_string_fetch_byte_case (re_string_t *pstr)
+{
+  if (__glibc_likely (!pstr->mbs_allocated))
+    return re_string_fetch_byte (pstr);
+
+#ifdef RE_ENABLE_I18N
+  if (pstr->offsets_needed)
+    {
+      Idx off;
+      int ch;
+
+      /* For tr_TR.UTF-8 [[:islower:]] there is
+	 [[: CAPITAL LETTER I WITH DOT lower:]] in mbs.  Skip
+	 in that case the whole multi-byte character and return
+	 the original letter.  On the other side, with
+	 [[: DOTLESS SMALL LETTER I return [[:I, as doing
+	 anything else would complicate things too much.  */
+
+      if (!re_string_first_byte (pstr, pstr->cur_idx))
+	return re_string_fetch_byte (pstr);
+
+      off = pstr->offsets[pstr->cur_idx];
+      ch = pstr->raw_mbs[pstr->raw_mbs_idx + off];
+
+      if (! isascii (ch))
+	return re_string_fetch_byte (pstr);
+
+      re_string_skip_bytes (pstr,
+			    re_string_char_size_at (pstr, pstr->cur_idx));
+      return ch;
+    }
+#endif
+
+  return pstr->raw_mbs[pstr->raw_mbs_idx + pstr->cur_idx++];
+}
+
+static void
+re_string_destruct (re_string_t *pstr)
+{
+#ifdef RE_ENABLE_I18N
+  re_free (pstr->wcs);
+  re_free (pstr->offsets);
+#endif /* RE_ENABLE_I18N  */
+  if (pstr->mbs_allocated)
+    re_free (pstr->mbs);
+}
+
+/* Return the context at IDX in INPUT.  */
+
+static unsigned int
+re_string_context_at (const re_string_t *input, Idx idx, int eflags)
+{
+  int c;
+  if (__glibc_unlikely (idx < 0))
+    /* In this case, we use the value stored in input->tip_context,
+       since we can't know the character in input->mbs[-1] here.  */
+    return input->tip_context;
+  if (__glibc_unlikely (idx == input->len))
+    return ((eflags & REG_NOTEOL) ? CONTEXT_ENDBUF
+	    : CONTEXT_NEWLINE | CONTEXT_ENDBUF);
+#ifdef RE_ENABLE_I18N
+  if (input->mb_cur_max > 1)
+    {
+      wint_t wc;
+      Idx wc_idx = idx;
+      while(input->wcs[wc_idx] == WEOF)
+	{
+#if defined DEBUG && DEBUG
+	  /* It must not happen.  */
+	  assert (wc_idx >= 0);
+#endif
+	  --wc_idx;
+	  if (wc_idx < 0)
+	    return input->tip_context;
+	}
+      wc = input->wcs[wc_idx];
+      if (__glibc_unlikely (input->word_ops_used != 0)
+	  && IS_WIDE_WORD_CHAR (wc))
+	return CONTEXT_WORD;
+      return (IS_WIDE_NEWLINE (wc) && input->newline_anchor
+	      ? CONTEXT_NEWLINE : 0);
+    }
+  else
+#endif
+    {
+      c = re_string_byte_at (input, idx);
+      if (bitset_contain (input->word_char, c))
+	return CONTEXT_WORD;
+      return IS_NEWLINE (c) && input->newline_anchor ? CONTEXT_NEWLINE : 0;
+    }
+}
+
+/* Functions for set operation.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_alloc (re_node_set *set, Idx size)
+{
+  set->alloc = size;
+  set->nelem = 0;
+  set->elems = re_malloc (Idx, size);
+  if (__glibc_unlikely (set->elems == NULL)
+      && (MALLOC_0_IS_NONNULL || size != 0))
+    return REG_ESPACE;
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_init_1 (re_node_set *set, Idx elem)
+{
+  set->alloc = 1;
+  set->nelem = 1;
+  set->elems = re_malloc (Idx, 1);
+  if (__glibc_unlikely (set->elems == NULL))
+    {
+      set->alloc = set->nelem = 0;
+      return REG_ESPACE;
+    }
+  set->elems[0] = elem;
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_init_2 (re_node_set *set, Idx elem1, Idx elem2)
+{
+  set->alloc = 2;
+  set->elems = re_malloc (Idx, 2);
+  if (__glibc_unlikely (set->elems == NULL))
+    return REG_ESPACE;
+  if (elem1 == elem2)
+    {
+      set->nelem = 1;
+      set->elems[0] = elem1;
+    }
+  else
+    {
+      set->nelem = 2;
+      if (elem1 < elem2)
+	{
+	  set->elems[0] = elem1;
+	  set->elems[1] = elem2;
+	}
+      else
+	{
+	  set->elems[0] = elem2;
+	  set->elems[1] = elem1;
+	}
+    }
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_init_copy (re_node_set *dest, const re_node_set *src)
+{
+  dest->nelem = src->nelem;
+  if (src->nelem > 0)
+    {
+      dest->alloc = dest->nelem;
+      dest->elems = re_malloc (Idx, dest->alloc);
+      if (__glibc_unlikely (dest->elems == NULL))
+	{
+	  dest->alloc = dest->nelem = 0;
+	  return REG_ESPACE;
+	}
+      memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
+    }
+  else
+    re_node_set_init_empty (dest);
+  return REG_NOERROR;
+}
+
+/* Calculate the intersection of the sets SRC1 and SRC2. And merge it to
+   DEST. Return value indicate the error code or REG_NOERROR if succeeded.
+   Note: We assume dest->elems is NULL, when dest->alloc is 0.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
+			   const re_node_set *src2)
+{
+  Idx i1, i2, is, id, delta, sbase;
+  if (src1->nelem == 0 || src2->nelem == 0)
+    return REG_NOERROR;
+
+  /* We need dest->nelem + 2 * elems_in_intersection; this is a
+     conservative estimate.  */
+  if (src1->nelem + src2->nelem + dest->nelem > dest->alloc)
+    {
+      Idx new_alloc = src1->nelem + src2->nelem + dest->alloc;
+      Idx *new_elems = re_realloc (dest->elems, Idx, new_alloc);
+      if (__glibc_unlikely (new_elems == NULL))
+	return REG_ESPACE;
+      dest->elems = new_elems;
+      dest->alloc = new_alloc;
+    }
+
+  /* Find the items in the intersection of SRC1 and SRC2, and copy
+     into the top of DEST those that are not already in DEST itself.  */
+  sbase = dest->nelem + src1->nelem + src2->nelem;
+  i1 = src1->nelem - 1;
+  i2 = src2->nelem - 1;
+  id = dest->nelem - 1;
+  for (;;)
+    {
+      if (src1->elems[i1] == src2->elems[i2])
+	{
+	  /* Try to find the item in DEST.  Maybe we could binary search?  */
+	  while (id >= 0 && dest->elems[id] > src1->elems[i1])
+	    --id;
+
+	  if (id < 0 || dest->elems[id] != src1->elems[i1])
+            dest->elems[--sbase] = src1->elems[i1];
+
+	  if (--i1 < 0 || --i2 < 0)
+	    break;
+	}
+
+      /* Lower the highest of the two items.  */
+      else if (src1->elems[i1] < src2->elems[i2])
+	{
+	  if (--i2 < 0)
+	    break;
+	}
+      else
+	{
+	  if (--i1 < 0)
+	    break;
+	}
+    }
+
+  id = dest->nelem - 1;
+  is = dest->nelem + src1->nelem + src2->nelem - 1;
+  delta = is - sbase + 1;
+
+  /* Now copy.  When DELTA becomes zero, the remaining
+     DEST elements are already in place; this is more or
+     less the same loop that is in re_node_set_merge.  */
+  dest->nelem += delta;
+  if (delta > 0 && id >= 0)
+    for (;;)
+      {
+	if (dest->elems[is] > dest->elems[id])
+	  {
+	    /* Copy from the top.  */
+	    dest->elems[id + delta--] = dest->elems[is--];
+	    if (delta == 0)
+	      break;
+	  }
+	else
+	  {
+	    /* Slide from the bottom.  */
+	    dest->elems[id + delta] = dest->elems[id];
+	    if (--id < 0)
+	      break;
+	  }
+      }
+
+  /* Copy remaining SRC elements.  */
+  memcpy (dest->elems, dest->elems + sbase, delta * sizeof (Idx));
+
+  return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets SRC1 and SRC2. And store it to
+   DEST. Return value indicate the error code or REG_NOERROR if succeeded.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_init_union (re_node_set *dest, const re_node_set *src1,
+			const re_node_set *src2)
+{
+  Idx i1, i2, id;
+  if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0)
+    {
+      dest->alloc = src1->nelem + src2->nelem;
+      dest->elems = re_malloc (Idx, dest->alloc);
+      if (__glibc_unlikely (dest->elems == NULL))
+	return REG_ESPACE;
+    }
+  else
+    {
+      if (src1 != NULL && src1->nelem > 0)
+	return re_node_set_init_copy (dest, src1);
+      else if (src2 != NULL && src2->nelem > 0)
+	return re_node_set_init_copy (dest, src2);
+      else
+	re_node_set_init_empty (dest);
+      return REG_NOERROR;
+    }
+  for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;)
+    {
+      if (src1->elems[i1] > src2->elems[i2])
+	{
+	  dest->elems[id++] = src2->elems[i2++];
+	  continue;
+	}
+      if (src1->elems[i1] == src2->elems[i2])
+	++i2;
+      dest->elems[id++] = src1->elems[i1++];
+    }
+  if (i1 < src1->nelem)
+    {
+      memcpy (dest->elems + id, src1->elems + i1,
+	     (src1->nelem - i1) * sizeof (Idx));
+      id += src1->nelem - i1;
+    }
+  else if (i2 < src2->nelem)
+    {
+      memcpy (dest->elems + id, src2->elems + i2,
+	     (src2->nelem - i2) * sizeof (Idx));
+      id += src2->nelem - i2;
+    }
+  dest->nelem = id;
+  return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets DEST and SRC. And store it to
+   DEST. Return value indicate the error code or REG_NOERROR if succeeded.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_node_set_merge (re_node_set *dest, const re_node_set *src)
+{
+  Idx is, id, sbase, delta;
+  if (src == NULL || src->nelem == 0)
+    return REG_NOERROR;
+  if (dest->alloc < 2 * src->nelem + dest->nelem)
+    {
+      Idx new_alloc = 2 * (src->nelem + dest->alloc);
+      Idx *new_buffer = re_realloc (dest->elems, Idx, new_alloc);
+      if (__glibc_unlikely (new_buffer == NULL))
+	return REG_ESPACE;
+      dest->elems = new_buffer;
+      dest->alloc = new_alloc;
+    }
+
+  if (__glibc_unlikely (dest->nelem == 0))
+    {
+      dest->nelem = src->nelem;
+      memcpy (dest->elems, src->elems, src->nelem * sizeof (Idx));
+      return REG_NOERROR;
+    }
+
+  /* Copy into the top of DEST the items of SRC that are not
+     found in DEST.  Maybe we could binary search in DEST?  */
+  for (sbase = dest->nelem + 2 * src->nelem,
+       is = src->nelem - 1, id = dest->nelem - 1; is >= 0 && id >= 0; )
+    {
+      if (dest->elems[id] == src->elems[is])
+	is--, id--;
+      else if (dest->elems[id] < src->elems[is])
+	dest->elems[--sbase] = src->elems[is--];
+      else /* if (dest->elems[id] > src->elems[is]) */
+	--id;
+    }
+
+  if (is >= 0)
+    {
+      /* If DEST is exhausted, the remaining items of SRC must be unique.  */
+      sbase -= is + 1;
+      memcpy (dest->elems + sbase, src->elems, (is + 1) * sizeof (Idx));
+    }
+
+  id = dest->nelem - 1;
+  is = dest->nelem + 2 * src->nelem - 1;
+  delta = is - sbase + 1;
+  if (delta == 0)
+    return REG_NOERROR;
+
+  /* Now copy.  When DELTA becomes zero, the remaining
+     DEST elements are already in place.  */
+  dest->nelem += delta;
+  for (;;)
+    {
+      if (dest->elems[is] > dest->elems[id])
+	{
+	  /* Copy from the top.  */
+	  dest->elems[id + delta--] = dest->elems[is--];
+	  if (delta == 0)
+	    break;
+	}
+      else
+	{
+	  /* Slide from the bottom.  */
+	  dest->elems[id + delta] = dest->elems[id];
+	  if (--id < 0)
+	    {
+	      /* Copy remaining SRC elements.  */
+	      memcpy (dest->elems, dest->elems + sbase,
+		      delta * sizeof (Idx));
+	      break;
+	    }
+	}
+    }
+
+  return REG_NOERROR;
+}
+
+/* Insert the new element ELEM to the re_node_set* SET.
+   SET should not already have ELEM.
+   Return true if successful.  */
+
+static bool
+__attribute_warn_unused_result__
+re_node_set_insert (re_node_set *set, Idx elem)
+{
+  Idx idx;
+  /* In case the set is empty.  */
+  if (set->alloc == 0)
+    return __glibc_likely (re_node_set_init_1 (set, elem) == REG_NOERROR);
+
+  if (__glibc_unlikely (set->nelem) == 0)
+    {
+      /* We already guaranteed above that set->alloc != 0.  */
+      set->elems[0] = elem;
+      ++set->nelem;
+      return true;
+    }
+
+  /* Realloc if we need.  */
+  if (set->alloc == set->nelem)
+    {
+      Idx *new_elems;
+      set->alloc = set->alloc * 2;
+      new_elems = re_realloc (set->elems, Idx, set->alloc);
+      if (__glibc_unlikely (new_elems == NULL))
+	return false;
+      set->elems = new_elems;
+    }
+
+  /* Move the elements which follows the new element.  Test the
+     first element separately to skip a check in the inner loop.  */
+  if (elem < set->elems[0])
+    {
+      idx = 0;
+      for (idx = set->nelem; idx > 0; idx--)
+	set->elems[idx] = set->elems[idx - 1];
+    }
+  else
+    {
+      for (idx = set->nelem; set->elems[idx - 1] > elem; idx--)
+	set->elems[idx] = set->elems[idx - 1];
+    }
+
+  /* Insert the new element.  */
+  set->elems[idx] = elem;
+  ++set->nelem;
+  return true;
+}
+
+/* Insert the new element ELEM to the re_node_set* SET.
+   SET should not already have any element greater than or equal to ELEM.
+   Return true if successful.  */
+
+static bool
+__attribute_warn_unused_result__
+re_node_set_insert_last (re_node_set *set, Idx elem)
+{
+  /* Realloc if we need.  */
+  if (set->alloc == set->nelem)
+    {
+      Idx *new_elems;
+      set->alloc = (set->alloc + 1) * 2;
+      new_elems = re_realloc (set->elems, Idx, set->alloc);
+      if (__glibc_unlikely (new_elems == NULL))
+	return false;
+      set->elems = new_elems;
+    }
+
+  /* Insert the new element.  */
+  set->elems[set->nelem++] = elem;
+  return true;
+}
+
+/* Compare two node sets SET1 and SET2.
+   Return true if SET1 and SET2 are equivalent.  */
+
+static bool
+__attribute__ ((pure))
+re_node_set_compare (const re_node_set *set1, const re_node_set *set2)
+{
+  Idx i;
+  if (set1 == NULL || set2 == NULL || set1->nelem != set2->nelem)
+    return false;
+  for (i = set1->nelem ; --i >= 0 ; )
+    if (set1->elems[i] != set2->elems[i])
+      return false;
+  return true;
+}
+
+/* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise.  */
+
+static Idx
+__attribute__ ((pure))
+re_node_set_contains (const re_node_set *set, Idx elem)
+{
+  __re_size_t idx, right, mid;
+  if (set->nelem <= 0)
+    return 0;
+
+  /* Binary search the element.  */
+  idx = 0;
+  right = set->nelem - 1;
+  while (idx < right)
+    {
+      mid = (idx + right) / 2;
+      if (set->elems[mid] < elem)
+	idx = mid + 1;
+      else
+	right = mid;
+    }
+  return set->elems[idx] == elem ? idx + 1 : 0;
+}
+
+static void
+re_node_set_remove_at (re_node_set *set, Idx idx)
+{
+  if (idx < 0 || idx >= set->nelem)
+    return;
+  --set->nelem;
+  for (; idx < set->nelem; idx++)
+    set->elems[idx] = set->elems[idx + 1];
+}
+
+
+/* Add the token TOKEN to dfa->nodes, and return the index of the token.
+   Or return -1 if an error occurred.  */
+
+static Idx
+re_dfa_add_node (re_dfa_t *dfa, re_token_t token)
+{
+  if (__glibc_unlikely (dfa->nodes_len >= dfa->nodes_alloc))
+    {
+      size_t new_nodes_alloc = dfa->nodes_alloc * 2;
+      Idx *new_nexts, *new_indices;
+      re_node_set *new_edests, *new_eclosures;
+      re_token_t *new_nodes;
+
+      /* Avoid overflows in realloc.  */
+      const size_t max_object_size = MAX (sizeof (re_token_t),
+					  MAX (sizeof (re_node_set),
+					       sizeof (Idx)));
+      if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size)
+			    < new_nodes_alloc))
+	return -1;
+
+      new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc);
+      if (__glibc_unlikely (new_nodes == NULL))
+	return -1;
+      dfa->nodes = new_nodes;
+      new_nexts = re_realloc (dfa->nexts, Idx, new_nodes_alloc);
+      new_indices = re_realloc (dfa->org_indices, Idx, new_nodes_alloc);
+      new_edests = re_realloc (dfa->edests, re_node_set, new_nodes_alloc);
+      new_eclosures = re_realloc (dfa->eclosures, re_node_set, new_nodes_alloc);
+      if (__glibc_unlikely (new_nexts == NULL || new_indices == NULL
+			    || new_edests == NULL || new_eclosures == NULL))
+	{
+	   re_free (new_nexts);
+	   re_free (new_indices);
+	   re_free (new_edests);
+	   re_free (new_eclosures);
+	   return -1;
+	}
+      dfa->nexts = new_nexts;
+      dfa->org_indices = new_indices;
+      dfa->edests = new_edests;
+      dfa->eclosures = new_eclosures;
+      dfa->nodes_alloc = new_nodes_alloc;
+    }
+  dfa->nodes[dfa->nodes_len] = token;
+  dfa->nodes[dfa->nodes_len].constraint = 0;
+#ifdef RE_ENABLE_I18N
+  dfa->nodes[dfa->nodes_len].accept_mb =
+    ((token.type == OP_PERIOD && dfa->mb_cur_max > 1)
+     || token.type == COMPLEX_BRACKET);
+#endif
+  dfa->nexts[dfa->nodes_len] = -1;
+  re_node_set_init_empty (dfa->edests + dfa->nodes_len);
+  re_node_set_init_empty (dfa->eclosures + dfa->nodes_len);
+  return dfa->nodes_len++;
+}
+
+static re_hashval_t
+calc_state_hash (const re_node_set *nodes, unsigned int context)
+{
+  re_hashval_t hash = nodes->nelem + context;
+  Idx i;
+  for (i = 0 ; i < nodes->nelem ; i++)
+    hash += nodes->elems[i];
+  return hash;
+}
+
+/* Search for the state whose node_set is equivalent to NODES.
+   Return the pointer to the state, if we found it in the DFA.
+   Otherwise create the new one and return it.  In case of an error
+   return NULL and set the error code in ERR.
+   Note: - We assume NULL as the invalid state, then it is possible that
+	   return value is NULL and ERR is REG_NOERROR.
+	 - We never return non-NULL value in case of any errors, it is for
+	   optimization.  */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa,
+		  const re_node_set *nodes)
+{
+  re_hashval_t hash;
+  re_dfastate_t *new_state;
+  struct re_state_table_entry *spot;
+  Idx i;
+#if defined GCC_LINT || defined lint
+  /* Suppress bogus uninitialized-variable warnings.  */
+  *err = REG_NOERROR;
+#endif
+  if (__glibc_unlikely (nodes->nelem == 0))
+    {
+      *err = REG_NOERROR;
+      return NULL;
+    }
+  hash = calc_state_hash (nodes, 0);
+  spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+  for (i = 0 ; i < spot->num ; i++)
+    {
+      re_dfastate_t *state = spot->array[i];
+      if (hash != state->hash)
+	continue;
+      if (re_node_set_compare (&state->nodes, nodes))
+	return state;
+    }
+
+  /* There are no appropriate state in the dfa, create the new one.  */
+  new_state = create_ci_newstate (dfa, nodes, hash);
+  if (__glibc_unlikely (new_state == NULL))
+    *err = REG_ESPACE;
+
+  return new_state;
+}
+
+/* Search for the state whose node_set is equivalent to NODES and
+   whose context is equivalent to CONTEXT.
+   Return the pointer to the state, if we found it in the DFA.
+   Otherwise create the new one and return it.  In case of an error
+   return NULL and set the error code in ERR.
+   Note: - We assume NULL as the invalid state, then it is possible that
+	   return value is NULL and ERR is REG_NOERROR.
+	 - We never return non-NULL value in case of any errors, it is for
+	   optimization.  */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa,
+			  const re_node_set *nodes, unsigned int context)
+{
+  re_hashval_t hash;
+  re_dfastate_t *new_state;
+  struct re_state_table_entry *spot;
+  Idx i;
+#if defined GCC_LINT || defined lint
+  /* Suppress bogus uninitialized-variable warnings.  */
+  *err = REG_NOERROR;
+#endif
+  if (nodes->nelem == 0)
+    {
+      *err = REG_NOERROR;
+      return NULL;
+    }
+  hash = calc_state_hash (nodes, context);
+  spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+  for (i = 0 ; i < spot->num ; i++)
+    {
+      re_dfastate_t *state = spot->array[i];
+      if (state->hash == hash
+	  && state->context == context
+	  && re_node_set_compare (state->entrance_nodes, nodes))
+	return state;
+    }
+  /* There are no appropriate state in 'dfa', create the new one.  */
+  new_state = create_cd_newstate (dfa, nodes, context, hash);
+  if (__glibc_unlikely (new_state == NULL))
+    *err = REG_ESPACE;
+
+  return new_state;
+}
+
+/* Finish initialization of the new state NEWSTATE, and using its hash value
+   HASH put in the appropriate bucket of DFA's state table.  Return value
+   indicates the error code if failed.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+register_state (const re_dfa_t *dfa, re_dfastate_t *newstate,
+		re_hashval_t hash)
+{
+  struct re_state_table_entry *spot;
+  reg_errcode_t err;
+  Idx i;
+
+  newstate->hash = hash;
+  err = re_node_set_alloc (&newstate->non_eps_nodes, newstate->nodes.nelem);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    return REG_ESPACE;
+  for (i = 0; i < newstate->nodes.nelem; i++)
+    {
+      Idx elem = newstate->nodes.elems[i];
+      if (!IS_EPSILON_NODE (dfa->nodes[elem].type))
+	if (! re_node_set_insert_last (&newstate->non_eps_nodes, elem))
+	  return REG_ESPACE;
+    }
+
+  spot = dfa->state_table + (hash & dfa->state_hash_mask);
+  if (__glibc_unlikely (spot->alloc <= spot->num))
+    {
+      Idx new_alloc = 2 * spot->num + 2;
+      re_dfastate_t **new_array = re_realloc (spot->array, re_dfastate_t *,
+					      new_alloc);
+      if (__glibc_unlikely (new_array == NULL))
+	return REG_ESPACE;
+      spot->array = new_array;
+      spot->alloc = new_alloc;
+    }
+  spot->array[spot->num++] = newstate;
+  return REG_NOERROR;
+}
+
+static void
+free_state (re_dfastate_t *state)
+{
+  re_node_set_free (&state->non_eps_nodes);
+  re_node_set_free (&state->inveclosure);
+  if (state->entrance_nodes != &state->nodes)
+    {
+      re_node_set_free (state->entrance_nodes);
+      re_free (state->entrance_nodes);
+    }
+  re_node_set_free (&state->nodes);
+  re_free (state->word_trtable);
+  re_free (state->trtable);
+  re_free (state);
+}
+
+/* Create the new state which is independent of contexts.
+   Return the new state if succeeded, otherwise return NULL.  */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
+		    re_hashval_t hash)
+{
+  Idx i;
+  reg_errcode_t err;
+  re_dfastate_t *newstate;
+
+  newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
+  if (__glibc_unlikely (newstate == NULL))
+    return NULL;
+  err = re_node_set_init_copy (&newstate->nodes, nodes);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    {
+      re_free (newstate);
+      return NULL;
+    }
+
+  newstate->entrance_nodes = &newstate->nodes;
+  for (i = 0 ; i < nodes->nelem ; i++)
+    {
+      re_token_t *node = dfa->nodes + nodes->elems[i];
+      re_token_type_t type = node->type;
+      if (type == CHARACTER && !node->constraint)
+	continue;
+#ifdef RE_ENABLE_I18N
+      newstate->accept_mb |= node->accept_mb;
+#endif /* RE_ENABLE_I18N */
+
+      /* If the state has the halt node, the state is a halt state.  */
+      if (type == END_OF_RE)
+	newstate->halt = 1;
+      else if (type == OP_BACK_REF)
+	newstate->has_backref = 1;
+      else if (type == ANCHOR || node->constraint)
+	newstate->has_constraint = 1;
+    }
+  err = register_state (dfa, newstate, hash);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    {
+      free_state (newstate);
+      newstate = NULL;
+    }
+  return newstate;
+}
+
+/* Create the new state which is depend on the context CONTEXT.
+   Return the new state if succeeded, otherwise return NULL.  */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
+		    unsigned int context, re_hashval_t hash)
+{
+  Idx i, nctx_nodes = 0;
+  reg_errcode_t err;
+  re_dfastate_t *newstate;
+
+  newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
+  if (__glibc_unlikely (newstate == NULL))
+    return NULL;
+  err = re_node_set_init_copy (&newstate->nodes, nodes);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    {
+      re_free (newstate);
+      return NULL;
+    }
+
+  newstate->context = context;
+  newstate->entrance_nodes = &newstate->nodes;
+
+  for (i = 0 ; i < nodes->nelem ; i++)
+    {
+      re_token_t *node = dfa->nodes + nodes->elems[i];
+      re_token_type_t type = node->type;
+      unsigned int constraint = node->constraint;
+
+      if (type == CHARACTER && !constraint)
+	continue;
+#ifdef RE_ENABLE_I18N
+      newstate->accept_mb |= node->accept_mb;
+#endif /* RE_ENABLE_I18N */
+
+      /* If the state has the halt node, the state is a halt state.  */
+      if (type == END_OF_RE)
+	newstate->halt = 1;
+      else if (type == OP_BACK_REF)
+	newstate->has_backref = 1;
+
+      if (constraint)
+	{
+	  if (newstate->entrance_nodes == &newstate->nodes)
+	    {
+	      newstate->entrance_nodes = re_malloc (re_node_set, 1);
+	      if (__glibc_unlikely (newstate->entrance_nodes == NULL))
+		{
+		  free_state (newstate);
+		  return NULL;
+		}
+	      if (re_node_set_init_copy (newstate->entrance_nodes, nodes)
+		  != REG_NOERROR)
+		return NULL;
+	      nctx_nodes = 0;
+	      newstate->has_constraint = 1;
+	    }
+
+	  if (NOT_SATISFY_PREV_CONSTRAINT (constraint,context))
+	    {
+	      re_node_set_remove_at (&newstate->nodes, i - nctx_nodes);
+	      ++nctx_nodes;
+	    }
+	}
+    }
+  err = register_state (dfa, newstate, hash);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    {
+      free_state (newstate);
+      newstate = NULL;
+    }
+  return  newstate;
+}
diff --git a/gawk-5.0.1/support/regex_internal.h b/gawk-5.0.1/support/regex_internal.h
new file mode 100644
index 00000000000..5462419b787
--- /dev/null
+++ b/gawk-5.0.1/support/regex_internal.h
@@ -0,0 +1,874 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef _REGEX_INTERNAL_H
+#define _REGEX_INTERNAL_H 1
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <langinfo.h>
+#include <locale.h>
+#include <wchar.h>
+#include <wctype.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <intprops.h>
+
+#ifdef _LIBC
+# include <libc-lock.h>
+# define lock_define(name) __libc_lock_define (, name)
+# define lock_init(lock) (__libc_lock_init (lock), 0)
+# define lock_fini(lock) ((void) 0)
+# define lock_lock(lock) __libc_lock_lock (lock)
+# define lock_unlock(lock) __libc_lock_unlock (lock)
+#elif defined GNULIB_LOCK && !defined USE_UNLOCKED_IO
+# include "glthread/lock.h"
+  /* Use gl_lock_define if empty macro arguments are known to work.
+     Otherwise, fall back on less-portable substitutes.  */
+# if ((defined __GNUC__ && !defined __STRICT_ANSI__) \
+      || (defined __STDC_VERSION__ && 199901L <= __STDC_VERSION__))
+#  define lock_define(name) gl_lock_define (, name)
+# elif USE_POSIX_THREADS
+#  define lock_define(name) pthread_mutex_t name;
+# elif USE_PTH_THREADS
+#  define lock_define(name) pth_mutex_t name;
+# elif USE_SOLARIS_THREADS
+#  define lock_define(name) mutex_t name;
+# elif USE_WINDOWS_THREADS
+#  define lock_define(name) gl_lock_t name;
+# else
+#  define lock_define(name)
+# endif
+# define lock_init(lock) glthread_lock_init (&(lock))
+# define lock_fini(lock) glthread_lock_destroy (&(lock))
+# define lock_lock(lock) glthread_lock_lock (&(lock))
+# define lock_unlock(lock) glthread_lock_unlock (&(lock))
+#elif defined GNULIB_PTHREAD && !defined USE_UNLOCKED_IO
+# include <pthread.h>
+# define lock_define(name) pthread_mutex_t name;
+# define lock_init(lock) pthread_mutex_init (&(lock), 0)
+# define lock_fini(lock) pthread_mutex_destroy (&(lock))
+# define lock_lock(lock) pthread_mutex_lock (&(lock))
+# define lock_unlock(lock) pthread_mutex_unlock (&(lock))
+#else
+# define lock_define(name)
+# define lock_init(lock) 0
+# define lock_fini(lock) ((void) 0)
+  /* The 'dfa' avoids an "unused variable 'dfa'" warning from GCC.  */
+# define lock_lock(lock) ((void) dfa)
+# define lock_unlock(lock) ((void) 0)
+#endif
+
+/* In case that the system doesn't have isblank().  */
+#if !defined _LIBC && ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK))
+# define isblank(ch) ((ch) == ' ' || (ch) == '\t')
+#endif
+
+#ifdef _LIBC
+# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
+#  define _RE_DEFINE_LOCALE_FUNCTIONS 1
+#   include <locale/localeinfo.h>
+#   include <locale/coll-lookup.h>
+# endif
+#endif
+
+/* This is for other GNU distributions with internationalized messages.  */
+#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
+# include <libintl.h>
+# ifdef _LIBC
+#  undef gettext
+#  define gettext(msgid) \
+  __dcgettext (_libc_intl_domainname, msgid, LC_MESSAGES)
+# endif
+#else
+# undef gettext
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef gettext_noop
+/* This define is so xgettext can find the internationalizable
+   strings.  */
+# define gettext_noop(String) String
+#endif
+
+#if (defined MB_CUR_MAX && HAVE_WCTYPE_H && HAVE_ISWCTYPE) || _LIBC
+# define RE_ENABLE_I18N
+#endif
+
+/* Number of ASCII characters.  */
+#define ASCII_CHARS 0x80
+
+/* Number of single byte characters.  */
+#define SBC_MAX (UCHAR_MAX + 1)
+
+#define COLL_ELEM_LEN_MAX 8
+
+/* The character which represents newline.  */
+#define NEWLINE_CHAR '\n'
+#define WIDE_NEWLINE_CHAR L'\n'
+
+/* Rename to standard API for using out of glibc.  */
+#ifndef _LIBC
+# undef __wctype
+# undef __iswalnum
+# undef __iswctype
+# undef __towlower
+# undef __towupper
+# define __wctype wctype
+# define __iswalnum iswalnum
+# define __iswctype iswctype
+# define __towlower towlower
+# define __towupper towupper
+# define __btowc btowc
+# define __mbrtowc mbrtowc
+# define __wcrtomb wcrtomb
+# define __regfree regfree
+#endif /* not _LIBC */
+
+#ifndef SSIZE_MAX
+# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
+#endif
+
+/* The type of indexes into strings.  This is signed, not size_t,
+   since the API requires indexes to fit in regoff_t anyway, and using
+   signed integers makes the code a bit smaller and presumably faster.
+   The traditional GNU regex implementation uses int for indexes.
+   The POSIX-compatible implementation uses a possibly-wider type.
+   The name 'Idx' is three letters to minimize the hassle of
+   reindenting a lot of regex code that formerly used 'int'.  */
+typedef regoff_t Idx;
+#ifdef _REGEX_LARGE_OFFSETS
+# define IDX_MAX SSIZE_MAX
+#else
+# define IDX_MAX INT_MAX
+#endif
+
+/* A hash value, suitable for computing hash tables.  */
+typedef __re_size_t re_hashval_t;
+
+/* An integer used to represent a set of bits.  It must be unsigned,
+   and must be at least as wide as unsigned int.  */
+typedef unsigned long int bitset_word_t;
+/* All bits set in a bitset_word_t.  */
+#define BITSET_WORD_MAX ULONG_MAX
+
+/* Number of bits in a bitset_word_t.  For portability to hosts with
+   padding bits, do not use '(sizeof (bitset_word_t) * CHAR_BIT)';
+   instead, deduce it directly from BITSET_WORD_MAX.  Avoid
+   greater-than-32-bit integers and unconditional shifts by more than
+   31 bits, as they're not portable.  */
+#if BITSET_WORD_MAX == 0xffffffffUL
+# define BITSET_WORD_BITS 32
+#elif BITSET_WORD_MAX >> 31 >> 4 == 1
+# define BITSET_WORD_BITS 36
+#elif BITSET_WORD_MAX >> 31 >> 16 == 1
+# define BITSET_WORD_BITS 48
+#elif BITSET_WORD_MAX >> 31 >> 28 == 1
+# define BITSET_WORD_BITS 60
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 1 == 1
+# define BITSET_WORD_BITS 64
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 9 == 1
+# define BITSET_WORD_BITS 72
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 3 == 1
+# define BITSET_WORD_BITS 128
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 == 1
+# define BITSET_WORD_BITS 256
+#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 > 1
+# define BITSET_WORD_BITS 257 /* any value > SBC_MAX will do here */
+# if BITSET_WORD_BITS <= SBC_MAX
+#  error "Invalid SBC_MAX"
+# endif
+#else
+# error "Add case for new bitset_word_t size"
+#endif
+
+/* Number of bitset_word_t values in a bitset_t.  */
+#define BITSET_WORDS ((SBC_MAX + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
+
+typedef bitset_word_t bitset_t[BITSET_WORDS];
+typedef bitset_word_t *re_bitset_ptr_t;
+typedef const bitset_word_t *re_const_bitset_ptr_t;
+
+#define PREV_WORD_CONSTRAINT 0x0001
+#define PREV_NOTWORD_CONSTRAINT 0x0002
+#define NEXT_WORD_CONSTRAINT 0x0004
+#define NEXT_NOTWORD_CONSTRAINT 0x0008
+#define PREV_NEWLINE_CONSTRAINT 0x0010
+#define NEXT_NEWLINE_CONSTRAINT 0x0020
+#define PREV_BEGBUF_CONSTRAINT 0x0040
+#define NEXT_ENDBUF_CONSTRAINT 0x0080
+#define WORD_DELIM_CONSTRAINT 0x0100
+#define NOT_WORD_DELIM_CONSTRAINT 0x0200
+
+typedef enum
+{
+  INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+  WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+  WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
+  INSIDE_NOTWORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
+  LINE_FIRST = PREV_NEWLINE_CONSTRAINT,
+  LINE_LAST = NEXT_NEWLINE_CONSTRAINT,
+  BUF_FIRST = PREV_BEGBUF_CONSTRAINT,
+  BUF_LAST = NEXT_ENDBUF_CONSTRAINT,
+  WORD_DELIM = WORD_DELIM_CONSTRAINT,
+  NOT_WORD_DELIM = NOT_WORD_DELIM_CONSTRAINT
+} re_context_type;
+
+typedef struct
+{
+  Idx alloc;
+  Idx nelem;
+  Idx *elems;
+} re_node_set;
+
+typedef enum
+{
+  NON_TYPE = 0,
+
+  /* Node type, These are used by token, node, tree.  */
+  CHARACTER = 1,
+  END_OF_RE = 2,
+  SIMPLE_BRACKET = 3,
+  OP_BACK_REF = 4,
+  OP_PERIOD = 5,
+#ifdef RE_ENABLE_I18N
+  COMPLEX_BRACKET = 6,
+  OP_UTF8_PERIOD = 7,
+#endif /* RE_ENABLE_I18N */
+
+  /* We define EPSILON_BIT as a macro so that OP_OPEN_SUBEXP is used
+     when the debugger shows values of this enum type.  */
+#define EPSILON_BIT 8
+  OP_OPEN_SUBEXP = EPSILON_BIT | 0,
+  OP_CLOSE_SUBEXP = EPSILON_BIT | 1,
+  OP_ALT = EPSILON_BIT | 2,
+  OP_DUP_ASTERISK = EPSILON_BIT | 3,
+  ANCHOR = EPSILON_BIT | 4,
+
+  /* Tree type, these are used only by tree. */
+  CONCAT = 16,
+  SUBEXP = 17,
+
+  /* Token type, these are used only by token.  */
+  OP_DUP_PLUS = 18,
+  OP_DUP_QUESTION,
+  OP_OPEN_BRACKET,
+  OP_CLOSE_BRACKET,
+  OP_CHARSET_RANGE,
+  OP_OPEN_DUP_NUM,
+  OP_CLOSE_DUP_NUM,
+  OP_NON_MATCH_LIST,
+  OP_OPEN_COLL_ELEM,
+  OP_CLOSE_COLL_ELEM,
+  OP_OPEN_EQUIV_CLASS,
+  OP_CLOSE_EQUIV_CLASS,
+  OP_OPEN_CHAR_CLASS,
+  OP_CLOSE_CHAR_CLASS,
+  OP_WORD,
+  OP_NOTWORD,
+  OP_SPACE,
+  OP_NOTSPACE,
+  BACK_SLASH
+
+} re_token_type_t;
+
+#ifdef RE_ENABLE_I18N
+typedef struct
+{
+  /* Multibyte characters.  */
+  wchar_t *mbchars;
+
+  /* Collating symbols.  */
+# ifdef _LIBC
+  int32_t *coll_syms;
+# endif
+
+  /* Equivalence classes. */
+# ifdef _LIBC
+  int32_t *equiv_classes;
+# endif
+
+  /* Range expressions. */
+# ifdef _LIBC
+  uint32_t *range_starts;
+  uint32_t *range_ends;
+# else /* not _LIBC */
+  wchar_t *range_starts;
+  wchar_t *range_ends;
+# endif /* not _LIBC */
+
+  /* Character classes. */
+  wctype_t *char_classes;
+
+  /* If this character set is the non-matching list.  */
+  unsigned int non_match : 1;
+
+  /* # of multibyte characters.  */
+  Idx nmbchars;
+
+  /* # of collating symbols.  */
+  Idx ncoll_syms;
+
+  /* # of equivalence classes. */
+  Idx nequiv_classes;
+
+  /* # of range expressions. */
+  Idx nranges;
+
+  /* # of character classes. */
+  Idx nchar_classes;
+} re_charset_t;
+#endif /* RE_ENABLE_I18N */
+
+typedef struct
+{
+  union
+  {
+    unsigned char c;		/* for CHARACTER */
+    re_bitset_ptr_t sbcset;	/* for SIMPLE_BRACKET */
+#ifdef RE_ENABLE_I18N
+    re_charset_t *mbcset;	/* for COMPLEX_BRACKET */
+#endif /* RE_ENABLE_I18N */
+    Idx idx;			/* for BACK_REF */
+    re_context_type ctx_type;	/* for ANCHOR */
+  } opr;
+#if __GNUC__ >= 2 && !defined __STRICT_ANSI__
+  re_token_type_t type : 8;
+#else
+  re_token_type_t type;
+#endif
+  unsigned int constraint : 10;	/* context constraint */
+  unsigned int duplicated : 1;
+  unsigned int opt_subexp : 1;
+#ifdef RE_ENABLE_I18N
+  unsigned int accept_mb : 1;
+  /* These 2 bits can be moved into the union if needed (e.g. if running out
+     of bits; move opr.c to opr.c.c and move the flags to opr.c.flags).  */
+  unsigned int mb_partial : 1;
+#endif
+  unsigned int word_char : 1;
+} re_token_t;
+
+#define IS_EPSILON_NODE(type) ((type) & EPSILON_BIT)
+
+struct re_string_t
+{
+  /* Indicate the raw buffer which is the original string passed as an
+     argument of regexec(), re_search(), etc..  */
+  const unsigned char *raw_mbs;
+  /* Store the multibyte string.  In case of "case insensitive mode" like
+     REG_ICASE, upper cases of the string are stored, otherwise MBS points
+     the same address that RAW_MBS points.  */
+  unsigned char *mbs;
+#ifdef RE_ENABLE_I18N
+  /* Store the wide character string which is corresponding to MBS.  */
+  wint_t *wcs;
+  Idx *offsets;
+  mbstate_t cur_state;
+#endif
+  /* Index in RAW_MBS.  Each character mbs[i] corresponds to
+     raw_mbs[raw_mbs_idx + i].  */
+  Idx raw_mbs_idx;
+  /* The length of the valid characters in the buffers.  */
+  Idx valid_len;
+  /* The corresponding number of bytes in raw_mbs array.  */
+  Idx valid_raw_len;
+  /* The length of the buffers MBS and WCS.  */
+  Idx bufs_len;
+  /* The index in MBS, which is updated by re_string_fetch_byte.  */
+  Idx cur_idx;
+  /* length of RAW_MBS array.  */
+  Idx raw_len;
+  /* This is RAW_LEN - RAW_MBS_IDX + VALID_LEN - VALID_RAW_LEN.  */
+  Idx len;
+  /* End of the buffer may be shorter than its length in the cases such
+     as re_match_2, re_search_2.  Then, we use STOP for end of the buffer
+     instead of LEN.  */
+  Idx raw_stop;
+  /* This is RAW_STOP - RAW_MBS_IDX adjusted through OFFSETS.  */
+  Idx stop;
+
+  /* The context of mbs[0].  We store the context independently, since
+     the context of mbs[0] may be different from raw_mbs[0], which is
+     the beginning of the input string.  */
+  unsigned int tip_context;
+  /* The translation passed as a part of an argument of re_compile_pattern.  */
+  RE_TRANSLATE_TYPE trans;
+  /* Copy of re_dfa_t's word_char.  */
+  re_const_bitset_ptr_t word_char;
+  /* true if REG_ICASE.  */
+  unsigned char icase;
+  unsigned char is_utf8;
+  unsigned char map_notascii;
+  unsigned char mbs_allocated;
+  unsigned char offsets_needed;
+  unsigned char newline_anchor;
+  unsigned char word_ops_used;
+  int mb_cur_max;
+};
+typedef struct re_string_t re_string_t;
+
+
+struct re_dfa_t;
+typedef struct re_dfa_t re_dfa_t;
+
+#ifndef _LIBC
+# define IS_IN(libc) false
+#endif
+
+#define re_string_peek_byte(pstr, offset) \
+  ((pstr)->mbs[(pstr)->cur_idx + offset])
+#define re_string_fetch_byte(pstr) \
+  ((pstr)->mbs[(pstr)->cur_idx++])
+#define re_string_first_byte(pstr, idx) \
+  ((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF)
+#define re_string_is_single_byte_char(pstr, idx) \
+  ((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \
+				|| (pstr)->wcs[(idx) + 1] != WEOF))
+#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx)
+#define re_string_cur_idx(pstr) ((pstr)->cur_idx)
+#define re_string_get_buffer(pstr) ((pstr)->mbs)
+#define re_string_length(pstr) ((pstr)->len)
+#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx])
+#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))
+#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))
+
+#if defined _LIBC || HAVE_ALLOCA
+# include <alloca.h>
+#endif
+
+#ifndef _LIBC
+# if HAVE_ALLOCA
+/* The OS usually guarantees only one guard page at the bottom of the stack,
+   and a page size can be as small as 4096 bytes.  So we cannot safely
+   allocate anything larger than 4096 bytes.  Also care for the possibility
+   of a few compiler-allocated temporary stack slots.  */
+#  define __libc_use_alloca(n) ((n) < 4032)
+# else
+/* alloca is implemented with malloc, so just use malloc.  */
+#  define __libc_use_alloca(n) 0
+#  undef alloca
+#  define alloca(n) malloc (n)
+# endif
+#endif
+
+#ifdef _LIBC
+# define MALLOC_0_IS_NONNULL 1
+#elif !defined MALLOC_0_IS_NONNULL
+# define MALLOC_0_IS_NONNULL 0
+#endif
+
+#ifndef MAX
+# define MAX(a,b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef MIN
+# define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))
+#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))
+#define re_free(p) free (p)
+
+struct bin_tree_t
+{
+  struct bin_tree_t *parent;
+  struct bin_tree_t *left;
+  struct bin_tree_t *right;
+  struct bin_tree_t *first;
+  struct bin_tree_t *next;
+
+  re_token_t token;
+
+  /* 'node_idx' is the index in dfa->nodes, if 'type' == 0.
+     Otherwise 'type' indicate the type of this node.  */
+  Idx node_idx;
+};
+typedef struct bin_tree_t bin_tree_t;
+
+#define BIN_TREE_STORAGE_SIZE \
+  ((1024 - sizeof (void *)) / sizeof (bin_tree_t))
+
+struct bin_tree_storage_t
+{
+  struct bin_tree_storage_t *next;
+  bin_tree_t data[BIN_TREE_STORAGE_SIZE];
+};
+typedef struct bin_tree_storage_t bin_tree_storage_t;
+
+#define CONTEXT_WORD 1
+#define CONTEXT_NEWLINE (CONTEXT_WORD << 1)
+#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1)
+#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1)
+
+#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD)
+#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE)
+#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF)
+#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF)
+#define IS_ORDINARY_CONTEXT(c) ((c) == 0)
+
+#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_')
+#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR)
+#define IS_WIDE_WORD_CHAR(ch) (__iswalnum (ch) || (ch) == L'_')
+#define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR)
+
+#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \
+ ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+  || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+  || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\
+  || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context)))
+
+#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \
+ ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+  || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+  || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \
+  || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context)))
+
+struct re_dfastate_t
+{
+  re_hashval_t hash;
+  re_node_set nodes;
+  re_node_set non_eps_nodes;
+  re_node_set inveclosure;
+  re_node_set *entrance_nodes;
+  struct re_dfastate_t **trtable, **word_trtable;
+  unsigned int context : 4;
+  unsigned int halt : 1;
+  /* If this state can accept "multi byte".
+     Note that we refer to multibyte characters, and multi character
+     collating elements as "multi byte".  */
+  unsigned int accept_mb : 1;
+  /* If this state has backreference node(s).  */
+  unsigned int has_backref : 1;
+  unsigned int has_constraint : 1;
+};
+typedef struct re_dfastate_t re_dfastate_t;
+
+struct re_state_table_entry
+{
+  Idx num;
+  Idx alloc;
+  re_dfastate_t **array;
+};
+
+/* Array type used in re_sub_match_last_t and re_sub_match_top_t.  */
+
+typedef struct
+{
+  Idx next_idx;
+  Idx alloc;
+  re_dfastate_t **array;
+} state_array_t;
+
+/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP.  */
+
+typedef struct
+{
+  Idx node;
+  Idx str_idx; /* The position NODE match at.  */
+  state_array_t path;
+} re_sub_match_last_t;
+
+/* Store information about the node NODE whose type is OP_OPEN_SUBEXP.
+   And information about the node, whose type is OP_CLOSE_SUBEXP,
+   corresponding to NODE is stored in LASTS.  */
+
+typedef struct
+{
+  Idx str_idx;
+  Idx node;
+  state_array_t *path;
+  Idx alasts; /* Allocation size of LASTS.  */
+  Idx nlasts; /* The number of LASTS.  */
+  re_sub_match_last_t **lasts;
+} re_sub_match_top_t;
+
+struct re_backref_cache_entry
+{
+  Idx node;
+  Idx str_idx;
+  Idx subexp_from;
+  Idx subexp_to;
+  char more;
+  char unused;
+  unsigned short int eps_reachable_subexps_map;
+};
+
+typedef struct
+{
+  /* The string object corresponding to the input string.  */
+  re_string_t input;
+#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+  const re_dfa_t *const dfa;
+#else
+  const re_dfa_t *dfa;
+#endif
+  /* EFLAGS of the argument of regexec.  */
+  int eflags;
+  /* Where the matching ends.  */
+  Idx match_last;
+  Idx last_node;
+  /* The state log used by the matcher.  */
+  re_dfastate_t **state_log;
+  Idx state_log_top;
+  /* Back reference cache.  */
+  Idx nbkref_ents;
+  Idx abkref_ents;
+  struct re_backref_cache_entry *bkref_ents;
+  int max_mb_elem_len;
+  Idx nsub_tops;
+  Idx asub_tops;
+  re_sub_match_top_t **sub_tops;
+} re_match_context_t;
+
+typedef struct
+{
+  re_dfastate_t **sifted_states;
+  re_dfastate_t **limited_states;
+  Idx last_node;
+  Idx last_str_idx;
+  re_node_set limits;
+} re_sift_context_t;
+
+struct re_fail_stack_ent_t
+{
+  Idx idx;
+  Idx node;
+  regmatch_t *regs;
+  re_node_set eps_via_nodes;
+};
+
+struct re_fail_stack_t
+{
+  Idx num;
+  Idx alloc;
+  struct re_fail_stack_ent_t *stack;
+};
+
+struct re_dfa_t
+{
+  re_token_t *nodes;
+  size_t nodes_alloc;
+  size_t nodes_len;
+  Idx *nexts;
+  Idx *org_indices;
+  re_node_set *edests;
+  re_node_set *eclosures;
+  re_node_set *inveclosures;
+  struct re_state_table_entry *state_table;
+  re_dfastate_t *init_state;
+  re_dfastate_t *init_state_word;
+  re_dfastate_t *init_state_nl;
+  re_dfastate_t *init_state_begbuf;
+  bin_tree_t *str_tree;
+  bin_tree_storage_t *str_tree_storage;
+  re_bitset_ptr_t sb_char;
+  int str_tree_storage_idx;
+
+  /* number of subexpressions 're_nsub' is in regex_t.  */
+  re_hashval_t state_hash_mask;
+  Idx init_node;
+  Idx nbackref; /* The number of backreference in this dfa.  */
+
+  /* Bitmap expressing which backreference is used.  */
+  bitset_word_t used_bkref_map;
+  bitset_word_t completed_bkref_map;
+
+  unsigned int has_plural_match : 1;
+  /* If this dfa has "multibyte node", which is a backreference or
+     a node which can accept multibyte character or multi character
+     collating element.  */
+  unsigned int has_mb_node : 1;
+  unsigned int is_utf8 : 1;
+  unsigned int map_notascii : 1;
+  unsigned int word_ops_used : 1;
+  int mb_cur_max;
+  bitset_t word_char;
+  reg_syntax_t syntax;
+  Idx *subexp_map;
+#ifdef DEBUG
+  char* re_str;
+#endif
+  lock_define (lock)
+};
+
+#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set))
+#define re_node_set_remove(set,id) \
+  (re_node_set_remove_at (set, re_node_set_contains (set, id) - 1))
+#define re_node_set_empty(p) ((p)->nelem = 0)
+#define re_node_set_free(set) re_free ((set)->elems)
+
+
+typedef enum
+{
+  SB_CHAR,
+  MB_CHAR,
+  EQUIV_CLASS,
+  COLL_SYM,
+  CHAR_CLASS
+} bracket_elem_type;
+
+typedef struct
+{
+  bracket_elem_type type;
+  union
+  {
+    unsigned char ch;
+    unsigned char *name;
+    wchar_t wch;
+  } opr;
+} bracket_elem_t;
+
+
+/* Functions for bitset_t operation.  */
+
+static inline void
+bitset_set (bitset_t set, Idx i)
+{
+  set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS;
+}
+
+static inline void
+bitset_clear (bitset_t set, Idx i)
+{
+  set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS);
+}
+
+static inline bool
+bitset_contain (const bitset_t set, Idx i)
+{
+  return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1;
+}
+
+static inline void
+bitset_empty (bitset_t set)
+{
+  memset (set, '\0', sizeof (bitset_t));
+}
+
+static inline void
+bitset_set_all (bitset_t set)
+{
+  memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS));
+  if (SBC_MAX % BITSET_WORD_BITS != 0)
+    set[BITSET_WORDS - 1] =
+      ((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1;
+}
+
+static inline void
+bitset_copy (bitset_t dest, const bitset_t src)
+{
+  memcpy (dest, src, sizeof (bitset_t));
+}
+
+static inline void
+bitset_not (bitset_t set)
+{
+  int bitset_i;
+  for (bitset_i = 0; bitset_i < SBC_MAX / BITSET_WORD_BITS; ++bitset_i)
+    set[bitset_i] = ~set[bitset_i];
+  if (SBC_MAX % BITSET_WORD_BITS != 0)
+    set[BITSET_WORDS - 1] =
+      ((((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1)
+       & ~set[BITSET_WORDS - 1]);
+}
+
+static inline void
+bitset_merge (bitset_t dest, const bitset_t src)
+{
+  int bitset_i;
+  for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
+    dest[bitset_i] |= src[bitset_i];
+}
+
+static inline void
+bitset_mask (bitset_t dest, const bitset_t src)
+{
+  int bitset_i;
+  for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
+    dest[bitset_i] &= src[bitset_i];
+}
+
+#ifdef RE_ENABLE_I18N
+/* Functions for re_string.  */
+static int
+__attribute__ ((pure, unused))
+re_string_char_size_at (const re_string_t *pstr, Idx idx)
+{
+  int byte_idx;
+  if (pstr->mb_cur_max == 1)
+    return 1;
+  for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx)
+    if (pstr->wcs[idx + byte_idx] != WEOF)
+      break;
+  return byte_idx;
+}
+
+static wint_t
+__attribute__ ((pure, unused))
+re_string_wchar_at (const re_string_t *pstr, Idx idx)
+{
+  if (pstr->mb_cur_max == 1)
+    return (wint_t) pstr->mbs[idx];
+  return (wint_t) pstr->wcs[idx];
+}
+
+# ifdef _LIBC
+#  include <locale/weight.h>
+# endif
+
+static int
+__attribute__ ((pure, unused))
+re_string_elem_size_at (const re_string_t *pstr, Idx idx)
+{
+# ifdef _LIBC
+  const unsigned char *p, *extra;
+  const int32_t *table, *indirect;
+  uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+
+  if (nrules != 0)
+    {
+      table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+      extra = (const unsigned char *)
+	_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+      indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+						_NL_COLLATE_INDIRECTMB);
+      p = pstr->mbs + idx;
+      findidx (table, indirect, extra, &p, pstr->len - idx);
+      return p - pstr->mbs - idx;
+    }
+  else
+# endif /* _LIBC */
+    return 1;
+}
+#endif /* RE_ENABLE_I18N */
+
+#ifndef FALLTHROUGH
+# if __GNUC__ < 7
+#  define FALLTHROUGH ((void) 0)
+# else
+#  define FALLTHROUGH __attribute__ ((__fallthrough__))
+# endif
+#endif
+
+#endif /*  _REGEX_INTERNAL_H */
diff --git a/gawk-5.0.1/support/regexec.c b/gawk-5.0.1/support/regexec.c
new file mode 100644
index 00000000000..4ff30a79c09
--- /dev/null
+++ b/gawk-5.0.1/support/regexec.c
@@ -0,0 +1,4336 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
+				     Idx n);
+static void match_ctx_clean (re_match_context_t *mctx);
+static void match_ctx_free (re_match_context_t *cache);
+static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, Idx node,
+					  Idx str_idx, Idx from, Idx to);
+static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx);
+static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, Idx node,
+					   Idx str_idx);
+static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop,
+						    Idx node, Idx str_idx);
+static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
+			   re_dfastate_t **limited_sts, Idx last_node,
+			   Idx last_str_idx);
+static reg_errcode_t re_search_internal (const regex_t *preg,
+					 const char *string, Idx length,
+					 Idx start, Idx last_start, Idx stop,
+					 size_t nmatch, regmatch_t pmatch[],
+					 int eflags);
+static regoff_t re_search_2_stub (struct re_pattern_buffer *bufp,
+				  const char *string1, Idx length1,
+				  const char *string2, Idx length2,
+				  Idx start, regoff_t range,
+				  struct re_registers *regs,
+				  Idx stop, bool ret_len);
+static regoff_t re_search_stub (struct re_pattern_buffer *bufp,
+				const char *string, Idx length, Idx start,
+				regoff_t range, Idx stop,
+				struct re_registers *regs,
+				bool ret_len);
+static unsigned re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
+                              Idx nregs, int regs_allocated);
+static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx);
+static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,
+			   Idx *p_match_first);
+static Idx check_halt_state_context (const re_match_context_t *mctx,
+				     const re_dfastate_t *state, Idx idx);
+static void update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
+			 regmatch_t *prev_idx_match, Idx cur_node,
+			 Idx cur_idx, Idx nmatch);
+static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs,
+				      Idx str_idx, Idx dest_node, Idx nregs,
+				      regmatch_t *regs,
+				      re_node_set *eps_via_nodes);
+static reg_errcode_t set_regs (const regex_t *preg,
+			       const re_match_context_t *mctx,
+			       size_t nmatch, regmatch_t *pmatch,
+			       bool fl_backtrack);
+static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs);
+
+#ifdef RE_ENABLE_I18N
+static int sift_states_iter_mb (const re_match_context_t *mctx,
+				re_sift_context_t *sctx,
+				Idx node_idx, Idx str_idx, Idx max_str_idx);
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t sift_states_backward (const re_match_context_t *mctx,
+					   re_sift_context_t *sctx);
+static reg_errcode_t build_sifted_states (const re_match_context_t *mctx,
+					  re_sift_context_t *sctx, Idx str_idx,
+					  re_node_set *cur_dest);
+static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx,
+					      re_sift_context_t *sctx,
+					      Idx str_idx,
+					      re_node_set *dest_nodes);
+static reg_errcode_t add_epsilon_src_nodes (const re_dfa_t *dfa,
+					    re_node_set *dest_nodes,
+					    const re_node_set *candidates);
+static bool check_dst_limits (const re_match_context_t *mctx,
+			      const re_node_set *limits,
+			      Idx dst_node, Idx dst_idx, Idx src_node,
+			      Idx src_idx);
+static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx,
+					int boundaries, Idx subexp_idx,
+					Idx from_node, Idx bkref_idx);
+static int check_dst_limits_calc_pos (const re_match_context_t *mctx,
+				      Idx limit, Idx subexp_idx,
+				      Idx node, Idx str_idx,
+				      Idx bkref_idx);
+static reg_errcode_t check_subexp_limits (const re_dfa_t *dfa,
+					  re_node_set *dest_nodes,
+					  const re_node_set *candidates,
+					  re_node_set *limits,
+					  struct re_backref_cache_entry *bkref_ents,
+					  Idx str_idx);
+static reg_errcode_t sift_states_bkref (const re_match_context_t *mctx,
+					re_sift_context_t *sctx,
+					Idx str_idx, const re_node_set *candidates);
+static reg_errcode_t merge_state_array (const re_dfa_t *dfa,
+					re_dfastate_t **dst,
+					re_dfastate_t **src, Idx num);
+static re_dfastate_t *find_recover_state (reg_errcode_t *err,
+					 re_match_context_t *mctx);
+static re_dfastate_t *transit_state (reg_errcode_t *err,
+				     re_match_context_t *mctx,
+				     re_dfastate_t *state);
+static re_dfastate_t *merge_state_with_log (reg_errcode_t *err,
+					    re_match_context_t *mctx,
+					    re_dfastate_t *next_state);
+static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx,
+						re_node_set *cur_nodes,
+						Idx str_idx);
+#if 0
+static re_dfastate_t *transit_state_sb (reg_errcode_t *err,
+					re_match_context_t *mctx,
+					re_dfastate_t *pstate);
+#endif
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t transit_state_mb (re_match_context_t *mctx,
+				       re_dfastate_t *pstate);
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t transit_state_bkref (re_match_context_t *mctx,
+					  const re_node_set *nodes);
+static reg_errcode_t get_subexp (re_match_context_t *mctx,
+				 Idx bkref_node, Idx bkref_str_idx);
+static reg_errcode_t get_subexp_sub (re_match_context_t *mctx,
+				     const re_sub_match_top_t *sub_top,
+				     re_sub_match_last_t *sub_last,
+				     Idx bkref_node, Idx bkref_str);
+static Idx find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
+			     Idx subexp_idx, int type);
+static reg_errcode_t check_arrival (re_match_context_t *mctx,
+				    state_array_t *path, Idx top_node,
+				    Idx top_str, Idx last_node, Idx last_str,
+				    int type);
+static reg_errcode_t check_arrival_add_next_nodes (re_match_context_t *mctx,
+						   Idx str_idx,
+						   re_node_set *cur_nodes,
+						   re_node_set *next_nodes);
+static reg_errcode_t check_arrival_expand_ecl (const re_dfa_t *dfa,
+					       re_node_set *cur_nodes,
+					       Idx ex_subexp, int type);
+static reg_errcode_t check_arrival_expand_ecl_sub (const re_dfa_t *dfa,
+						   re_node_set *dst_nodes,
+						   Idx target, Idx ex_subexp,
+						   int type);
+static reg_errcode_t expand_bkref_cache (re_match_context_t *mctx,
+					 re_node_set *cur_nodes, Idx cur_str,
+					 Idx subexp_num, int type);
+static bool build_trtable (const re_dfa_t *dfa, re_dfastate_t *state);
+#ifdef RE_ENABLE_I18N
+static int check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
+				    const re_string_t *input, Idx idx);
+# ifdef _LIBC
+static unsigned int find_collation_sequence_value (const unsigned char *mbs,
+						   size_t name_len);
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+static Idx group_nodes_into_DFAstates (const re_dfa_t *dfa,
+				       const re_dfastate_t *state,
+				       re_node_set *states_node,
+				       bitset_t *states_ch);
+static bool check_node_accept (const re_match_context_t *mctx,
+			       const re_token_t *node, Idx idx);
+static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len);
+
+/* Entry point for POSIX code.  */
+
+/* regexec searches for a given pattern, specified by PREG, in the
+   string STRING.
+
+   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+   'regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
+   least NMATCH elements, and we set them to the offsets of the
+   corresponding matched substrings.
+
+   EFLAGS specifies "execution flags" which affect matching: if
+   REG_NOTBOL is set, then ^ does not match at the beginning of the
+   string; if REG_NOTEOL is set, then $ does not match at the end.
+
+   We return 0 if we find a match and REG_NOMATCH if not.  */
+
+int
+regexec (const regex_t *__restrict preg, const char *__restrict string,
+	 size_t nmatch, regmatch_t pmatch[], int eflags)
+{
+  reg_errcode_t err;
+  Idx start, length;
+  re_dfa_t *dfa = preg->buffer;
+
+  if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND))
+    return REG_BADPAT;
+
+  if (eflags & REG_STARTEND)
+    {
+      start = pmatch[0].rm_so;
+      length = pmatch[0].rm_eo;
+    }
+  else
+    {
+      start = 0;
+      length = strlen (string);
+    }
+
+  lock_lock (dfa->lock);
+  if (preg->no_sub)
+    err = re_search_internal (preg, string, length, start, length,
+			      length, 0, NULL, eflags);
+  else
+    err = re_search_internal (preg, string, length, start, length,
+			      length, nmatch, pmatch, eflags);
+  lock_unlock (dfa->lock);
+  return err != REG_NOERROR;
+}
+
+#ifdef _LIBC
+libc_hidden_def (__regexec)
+
+# include <shlib-compat.h>
+versioned_symbol (libc, __regexec, regexec, GLIBC_2_3_4);
+
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
+__typeof__ (__regexec) __compat_regexec;
+
+int
+attribute_compat_text_section
+__compat_regexec (const regex_t *__restrict preg,
+		  const char *__restrict string, size_t nmatch,
+		  regmatch_t pmatch[], int eflags)
+{
+  return regexec (preg, string, nmatch, pmatch,
+		  eflags & (REG_NOTBOL | REG_NOTEOL));
+}
+compat_symbol (libc, __compat_regexec, regexec, GLIBC_2_0);
+# endif
+#endif
+
+/* Entry points for GNU code.  */
+
+/* re_match, re_search, re_match_2, re_search_2
+
+   The former two functions operate on STRING with length LENGTH,
+   while the later two operate on concatenation of STRING1 and STRING2
+   with lengths LENGTH1 and LENGTH2, respectively.
+
+   re_match() matches the compiled pattern in BUFP against the string,
+   starting at index START.
+
+   re_search() first tries matching at index START, then it tries to match
+   starting from index START + 1, and so on.  The last start position tried
+   is START + RANGE.  (Thus RANGE = 0 forces re_search to operate the same
+   way as re_match().)
+
+   The parameter STOP of re_{match,search}_2 specifies that no match exceeding
+   the first STOP characters of the concatenation of the strings should be
+   concerned.
+
+   If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match
+   and all groups is stored in REGS.  (For the "_2" variants, the offsets are
+   computed relative to the concatenation, not relative to the individual
+   strings.)
+
+   On success, re_match* functions return the length of the match, re_search*
+   return the position of the start of the match.  Return value -1 means no
+   match was found and -2 indicates an internal error.  */
+
+regoff_t
+re_match (struct re_pattern_buffer *bufp, const char *string, Idx length,
+	  Idx start, struct re_registers *regs)
+{
+  return re_search_stub (bufp, string, length, start, 0, length, regs, true);
+}
+#ifdef _LIBC
+weak_alias (__re_match, re_match)
+#endif
+
+regoff_t
+re_search (struct re_pattern_buffer *bufp, const char *string, Idx length,
+	   Idx start, regoff_t range, struct re_registers *regs)
+{
+  return re_search_stub (bufp, string, length, start, range, length, regs,
+			 false);
+}
+#ifdef _LIBC
+weak_alias (__re_search, re_search)
+#endif
+
+regoff_t
+re_match_2 (struct re_pattern_buffer *bufp, const char *string1, Idx length1,
+	    const char *string2, Idx length2, Idx start,
+	    struct re_registers *regs, Idx stop)
+{
+  return re_search_2_stub (bufp, string1, length1, string2, length2,
+			   start, 0, regs, stop, true);
+}
+#ifdef _LIBC
+weak_alias (__re_match_2, re_match_2)
+#endif
+
+regoff_t
+re_search_2 (struct re_pattern_buffer *bufp, const char *string1, Idx length1,
+	     const char *string2, Idx length2, Idx start, regoff_t range,
+	     struct re_registers *regs, Idx stop)
+{
+  return re_search_2_stub (bufp, string1, length1, string2, length2,
+			   start, range, regs, stop, false);
+}
+#ifdef _LIBC
+weak_alias (__re_search_2, re_search_2)
+#endif
+
+static regoff_t
+re_search_2_stub (struct re_pattern_buffer *bufp, const char *string1,
+		  Idx length1, const char *string2, Idx length2, Idx start,
+		  regoff_t range, struct re_registers *regs,
+		  Idx stop, bool ret_len)
+{
+  const char *str;
+  regoff_t rval;
+  Idx len;
+  char *s = NULL;
+
+  if (__glibc_unlikely ((length1 < 0 || length2 < 0 || stop < 0
+			 || INT_ADD_WRAPV (length1, length2, &len))))
+    return -2;
+
+  /* Concatenate the strings.  */
+  if (length2 > 0)
+    if (length1 > 0)
+      {
+	s = re_malloc (char, len);
+
+	if (__glibc_unlikely (s == NULL))
+	  return -2;
+#ifdef _LIBC
+	memcpy (__mempcpy (s, string1, length1), string2, length2);
+#else
+	memcpy (s, string1, length1);
+	memcpy (s + length1, string2, length2);
+#endif
+	str = s;
+      }
+    else
+      str = string2;
+  else
+    str = string1;
+
+  rval = re_search_stub (bufp, str, len, start, range, stop, regs,
+			 ret_len);
+  re_free (s);
+  return rval;
+}
+
+/* The parameters have the same meaning as those of re_search.
+   Additional parameters:
+   If RET_LEN is true the length of the match is returned (re_match style);
+   otherwise the position of the match is returned.  */
+
+static regoff_t
+re_search_stub (struct re_pattern_buffer *bufp, const char *string, Idx length,
+		Idx start, regoff_t range, Idx stop, struct re_registers *regs,
+		bool ret_len)
+{
+  reg_errcode_t result;
+  regmatch_t *pmatch;
+  Idx nregs;
+  regoff_t rval;
+  int eflags = 0;
+  re_dfa_t *dfa = bufp->buffer;
+  Idx last_start = start + range;
+
+  /* Check for out-of-range.  */
+  if (__glibc_unlikely (start < 0 || start > length))
+    return -1;
+  if (__glibc_unlikely (length < last_start
+			|| (0 <= range && last_start < start)))
+    last_start = length;
+  else if (__glibc_unlikely (last_start < 0
+			     || (range < 0 && start <= last_start)))
+    last_start = 0;
+
+  lock_lock (dfa->lock);
+
+  eflags |= (bufp->not_bol) ? REG_NOTBOL : 0;
+  eflags |= (bufp->not_eol) ? REG_NOTEOL : 0;
+
+  /* Compile fastmap if we haven't yet.  */
+  if (start < last_start && bufp->fastmap != NULL && !bufp->fastmap_accurate)
+    re_compile_fastmap (bufp);
+
+  if (__glibc_unlikely (bufp->no_sub))
+    regs = NULL;
+
+  /* We need at least 1 register.  */
+  if (regs == NULL)
+    nregs = 1;
+  else if (__glibc_unlikely (bufp->regs_allocated == REGS_FIXED
+			     && regs->num_regs <= bufp->re_nsub))
+    {
+      nregs = regs->num_regs;
+      if (__glibc_unlikely (nregs < 1))
+	{
+	  /* Nothing can be copied to regs.  */
+	  regs = NULL;
+	  nregs = 1;
+	}
+    }
+  else
+    nregs = bufp->re_nsub + 1;
+  pmatch = re_malloc (regmatch_t, nregs);
+  if (__glibc_unlikely (pmatch == NULL))
+    {
+      rval = -2;
+      goto out;
+    }
+
+  result = re_search_internal (bufp, string, length, start, last_start, stop,
+			       nregs, pmatch, eflags);
+
+  rval = 0;
+
+  /* I hope we needn't fill their regs with -1's when no match was found.  */
+  if (result != REG_NOERROR)
+    rval = result == REG_NOMATCH ? -1 : -2;
+  else if (regs != NULL)
+    {
+      /* If caller wants register contents data back, copy them.  */
+      bufp->regs_allocated = re_copy_regs (regs, pmatch, nregs,
+					   bufp->regs_allocated);
+      if (__glibc_unlikely (bufp->regs_allocated == REGS_UNALLOCATED))
+	rval = -2;
+    }
+
+  if (__glibc_likely (rval == 0))
+    {
+      if (ret_len)
+	{
+	  assert (pmatch[0].rm_so == start);
+	  rval = pmatch[0].rm_eo - start;
+	}
+      else
+	rval = pmatch[0].rm_so;
+    }
+  re_free (pmatch);
+ out:
+  lock_unlock (dfa->lock);
+  return rval;
+}
+
+static unsigned
+re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, Idx nregs,
+	      int regs_allocated)
+{
+  int rval = REGS_REALLOCATE;
+  Idx i;
+  Idx need_regs = nregs + 1;
+  /* We need one extra element beyond 'num_regs' for the '-1' marker GNU code
+     uses.  */
+
+  /* Have the register data arrays been allocated?  */
+  if (regs_allocated == REGS_UNALLOCATED)
+    { /* No.  So allocate them with malloc.  */
+      regs->start = re_malloc (regoff_t, need_regs);
+      if (__glibc_unlikely (regs->start == NULL))
+	return REGS_UNALLOCATED;
+      regs->end = re_malloc (regoff_t, need_regs);
+      if (__glibc_unlikely (regs->end == NULL))
+	{
+	  re_free (regs->start);
+	  return REGS_UNALLOCATED;
+	}
+      regs->num_regs = need_regs;
+    }
+  else if (regs_allocated == REGS_REALLOCATE)
+    { /* Yes.  If we need more elements than were already
+	 allocated, reallocate them.  If we need fewer, just
+	 leave it alone.  */
+      if (__glibc_unlikely (need_regs > regs->num_regs))
+	{
+	  regoff_t *new_start = re_realloc (regs->start, regoff_t, need_regs);
+	  regoff_t *new_end;
+	  if (__glibc_unlikely (new_start == NULL))
+	    return REGS_UNALLOCATED;
+	  new_end = re_realloc (regs->end, regoff_t, need_regs);
+	  if (__glibc_unlikely (new_end == NULL))
+	    {
+	      re_free (new_start);
+	      return REGS_UNALLOCATED;
+	    }
+	  regs->start = new_start;
+	  regs->end = new_end;
+	  regs->num_regs = need_regs;
+	}
+    }
+  else
+    {
+      assert (regs_allocated == REGS_FIXED);
+      /* This function may not be called with REGS_FIXED and nregs too big.  */
+      assert (regs->num_regs >= nregs);
+      rval = REGS_FIXED;
+    }
+
+  /* Copy the regs.  */
+  for (i = 0; i < nregs; ++i)
+    {
+      regs->start[i] = pmatch[i].rm_so;
+      regs->end[i] = pmatch[i].rm_eo;
+    }
+  for ( ; i < regs->num_regs; ++i)
+    regs->start[i] = regs->end[i] = -1;
+
+  return rval;
+}
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
+   this memory for recording register information.  STARTS and ENDS
+   must be allocated using the malloc library routine, and must each
+   be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+
+void
+re_set_registers (struct re_pattern_buffer *bufp, struct re_registers *regs,
+		  __re_size_t num_regs, regoff_t *starts, regoff_t *ends)
+{
+  if (num_regs)
+    {
+      bufp->regs_allocated = REGS_REALLOCATE;
+      regs->num_regs = num_regs;
+      regs->start = starts;
+      regs->end = ends;
+    }
+  else
+    {
+      bufp->regs_allocated = REGS_UNALLOCATED;
+      regs->num_regs = 0;
+      regs->start = regs->end = NULL;
+    }
+}
+#ifdef _LIBC
+weak_alias (__re_set_registers, re_set_registers)
+#endif
+
+/* Entry points compatible with 4.2 BSD regex library.  We don't define
+   them unless specifically requested.  */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+int
+# ifdef _LIBC
+weak_function
+# endif
+re_exec (const char *s)
+{
+  return 0 == regexec (&re_comp_buf, s, 0, NULL, 0);
+}
+#endif /* _REGEX_RE_COMP */
+
+/* Internal entry point.  */
+
+/* Searches for a compiled pattern PREG in the string STRING, whose
+   length is LENGTH.  NMATCH, PMATCH, and EFLAGS have the same
+   meaning as with regexec.  LAST_START is START + RANGE, where
+   START and RANGE have the same meaning as with re_search.
+   Return REG_NOERROR if we find a match, and REG_NOMATCH if not,
+   otherwise return the error code.
+   Note: We assume front end functions already check ranges.
+   (0 <= LAST_START && LAST_START <= LENGTH)  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+re_search_internal (const regex_t *preg, const char *string, Idx length,
+		    Idx start, Idx last_start, Idx stop, size_t nmatch,
+		    regmatch_t pmatch[], int eflags)
+{
+  reg_errcode_t err;
+  const re_dfa_t *dfa = preg->buffer;
+  Idx left_lim, right_lim;
+  int incr;
+  bool fl_longest_match;
+  int match_kind;
+  Idx match_first;
+  Idx match_last = -1;
+  Idx extra_nmatch;
+  bool sb;
+  int ch;
+#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+  re_match_context_t mctx = { .dfa = dfa };
+#else
+  re_match_context_t mctx;
+#endif
+  char *fastmap = ((preg->fastmap != NULL && preg->fastmap_accurate
+		    && start != last_start && !preg->can_be_null)
+		   ? preg->fastmap : NULL);
+  RE_TRANSLATE_TYPE t = preg->translate;
+
+#if !(defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L))
+  memset (&mctx, '\0', sizeof (re_match_context_t));
+  mctx.dfa = dfa;
+#endif
+
+  extra_nmatch = (nmatch > preg->re_nsub) ? nmatch - (preg->re_nsub + 1) : 0;
+  nmatch -= extra_nmatch;
+
+  /* Check if the DFA haven't been compiled.  */
+  if (__glibc_unlikely (preg->used == 0 || dfa->init_state == NULL
+			|| dfa->init_state_word == NULL
+			|| dfa->init_state_nl == NULL
+			|| dfa->init_state_begbuf == NULL))
+    return REG_NOMATCH;
+
+#ifdef DEBUG
+  /* We assume front-end functions already check them.  */
+  assert (0 <= last_start && last_start <= length);
+#endif
+
+  /* If initial states with non-begbuf contexts have no elements,
+     the regex must be anchored.  If preg->newline_anchor is set,
+     we'll never use init_state_nl, so do not check it.  */
+  if (dfa->init_state->nodes.nelem == 0
+      && dfa->init_state_word->nodes.nelem == 0
+      && (dfa->init_state_nl->nodes.nelem == 0
+	  || !preg->newline_anchor))
+    {
+      if (start != 0 && last_start != 0)
+        return REG_NOMATCH;
+      start = last_start = 0;
+    }
+
+  /* We must check the longest matching, if nmatch > 0.  */
+  fl_longest_match = (nmatch != 0 || dfa->nbackref);
+
+  err = re_string_allocate (&mctx.input, string, length, dfa->nodes_len + 1,
+			    preg->translate, (preg->syntax & RE_ICASE) != 0,
+			    dfa);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    goto free_return;
+  mctx.input.stop = stop;
+  mctx.input.raw_stop = stop;
+  mctx.input.newline_anchor = preg->newline_anchor;
+
+  err = match_ctx_init (&mctx, eflags, dfa->nbackref * 2);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    goto free_return;
+
+  /* We will log all the DFA states through which the dfa pass,
+     if nmatch > 1, or this dfa has "multibyte node", which is a
+     back-reference or a node which can accept multibyte character or
+     multi character collating element.  */
+  if (nmatch > 1 || dfa->has_mb_node)
+    {
+      /* Avoid overflow.  */
+      if (__glibc_unlikely ((MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *))
+			     <= mctx.input.bufs_len)))
+	{
+	  err = REG_ESPACE;
+	  goto free_return;
+	}
+
+      mctx.state_log = re_malloc (re_dfastate_t *, mctx.input.bufs_len + 1);
+      if (__glibc_unlikely (mctx.state_log == NULL))
+	{
+	  err = REG_ESPACE;
+	  goto free_return;
+	}
+    }
+  else
+    mctx.state_log = NULL;
+
+  match_first = start;
+  mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+			   : CONTEXT_NEWLINE | CONTEXT_BEGBUF;
+
+  /* Check incrementally whether the input string matches.  */
+  incr = (last_start < start) ? -1 : 1;
+  left_lim = (last_start < start) ? last_start : start;
+  right_lim = (last_start < start) ? start : last_start;
+  sb = dfa->mb_cur_max == 1;
+  match_kind =
+    (fastmap
+     ? ((sb || !(preg->syntax & RE_ICASE || t) ? 4 : 0)
+	| (start <= last_start ? 2 : 0)
+	| (t != NULL ? 1 : 0))
+     : 8);
+
+  for (;; match_first += incr)
+    {
+      err = REG_NOMATCH;
+      if (match_first < left_lim || right_lim < match_first)
+	goto free_return;
+
+      /* Advance as rapidly as possible through the string, until we
+	 find a plausible place to start matching.  This may be done
+	 with varying efficiency, so there are various possibilities:
+	 only the most common of them are specialized, in order to
+	 save on code size.  We use a switch statement for speed.  */
+      switch (match_kind)
+	{
+	case 8:
+	  /* No fastmap.  */
+	  break;
+
+	case 7:
+	  /* Fastmap with single-byte translation, match forward.  */
+	  while (__glibc_likely (match_first < right_lim)
+		 && !fastmap[t[(unsigned char) string[match_first]]])
+	    ++match_first;
+	  goto forward_match_found_start_or_reached_end;
+
+	case 6:
+	  /* Fastmap without translation, match forward.  */
+	  while (__glibc_likely (match_first < right_lim)
+		 && !fastmap[(unsigned char) string[match_first]])
+	    ++match_first;
+
+	forward_match_found_start_or_reached_end:
+	  if (__glibc_unlikely (match_first == right_lim))
+	    {
+	      ch = match_first >= length
+		       ? 0 : (unsigned char) string[match_first];
+	      if (!fastmap[t ? t[ch] : ch])
+		goto free_return;
+	    }
+	  break;
+
+	case 4:
+	case 5:
+	  /* Fastmap without multi-byte translation, match backwards.  */
+	  while (match_first >= left_lim)
+	    {
+	      ch = match_first >= length
+		       ? 0 : (unsigned char) string[match_first];
+	      if (fastmap[t ? t[ch] : ch])
+		break;
+	      --match_first;
+	    }
+	  if (match_first < left_lim)
+	    goto free_return;
+	  break;
+
+	default:
+	  /* In this case, we can't determine easily the current byte,
+	     since it might be a component byte of a multibyte
+	     character.  Then we use the constructed buffer instead.  */
+	  for (;;)
+	    {
+	      /* If MATCH_FIRST is out of the valid range, reconstruct the
+		 buffers.  */
+	      __re_size_t offset = match_first - mctx.input.raw_mbs_idx;
+	      if (__glibc_unlikely (offset
+				    >= (__re_size_t) mctx.input.valid_raw_len))
+		{
+		  err = re_string_reconstruct (&mctx.input, match_first,
+					       eflags);
+		  if (__glibc_unlikely (err != REG_NOERROR))
+		    goto free_return;
+
+		  offset = match_first - mctx.input.raw_mbs_idx;
+		}
+	      /* If MATCH_FIRST is out of the buffer, leave it as '\0'.
+		 Note that MATCH_FIRST must not be smaller than 0.  */
+	      ch = (match_first >= length
+		    ? 0 : re_string_byte_at (&mctx.input, offset));
+	      if (fastmap[ch])
+		break;
+	      match_first += incr;
+	      if (match_first < left_lim || match_first > right_lim)
+		{
+		  err = REG_NOMATCH;
+		  goto free_return;
+		}
+	    }
+	  break;
+	}
+
+      /* Reconstruct the buffers so that the matcher can assume that
+	 the matching starts from the beginning of the buffer.  */
+      err = re_string_reconstruct (&mctx.input, match_first, eflags);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	goto free_return;
+
+#ifdef RE_ENABLE_I18N
+     /* Don't consider this char as a possible match start if it part,
+	yet isn't the head, of a multibyte character.  */
+      if (!sb && !re_string_first_byte (&mctx.input, 0))
+	continue;
+#endif
+
+      /* It seems to be appropriate one, then use the matcher.  */
+      /* We assume that the matching starts from 0.  */
+      mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0;
+      match_last = check_matching (&mctx, fl_longest_match,
+				   start <= last_start ? &match_first : NULL);
+      if (match_last != -1)
+	{
+	  if (__glibc_unlikely (match_last == -2))
+	    {
+	      err = REG_ESPACE;
+	      goto free_return;
+	    }
+	  else
+	    {
+	      mctx.match_last = match_last;
+	      if ((!preg->no_sub && nmatch > 1) || dfa->nbackref)
+		{
+		  re_dfastate_t *pstate = mctx.state_log[match_last];
+		  mctx.last_node = check_halt_state_context (&mctx, pstate,
+							     match_last);
+		}
+	      if ((!preg->no_sub && nmatch > 1 && dfa->has_plural_match)
+		  || dfa->nbackref)
+		{
+		  err = prune_impossible_nodes (&mctx);
+		  if (err == REG_NOERROR)
+		    break;
+		  if (__glibc_unlikely (err != REG_NOMATCH))
+		    goto free_return;
+		  match_last = -1;
+		}
+	      else
+		break; /* We found a match.  */
+	    }
+	}
+
+      match_ctx_clean (&mctx);
+    }
+
+#ifdef DEBUG
+  assert (match_last != -1);
+  assert (err == REG_NOERROR);
+#endif
+
+  /* Set pmatch[] if we need.  */
+  if (nmatch > 0)
+    {
+      Idx reg_idx;
+
+      /* Initialize registers.  */
+      for (reg_idx = 1; reg_idx < nmatch; ++reg_idx)
+	pmatch[reg_idx].rm_so = pmatch[reg_idx].rm_eo = -1;
+
+      /* Set the points where matching start/end.  */
+      pmatch[0].rm_so = 0;
+      pmatch[0].rm_eo = mctx.match_last;
+      /* FIXME: This function should fail if mctx.match_last exceeds
+	 the maximum possible regoff_t value.  We need a new error
+	 code REG_OVERFLOW.  */
+
+      if (!preg->no_sub && nmatch > 1)
+	{
+	  err = set_regs (preg, &mctx, nmatch, pmatch,
+			  dfa->has_plural_match && dfa->nbackref > 0);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    goto free_return;
+	}
+
+      /* At last, add the offset to each register, since we slid
+	 the buffers so that we could assume that the matching starts
+	 from 0.  */
+      for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+	if (pmatch[reg_idx].rm_so != -1)
+	  {
+#ifdef RE_ENABLE_I18N
+	    if (__glibc_unlikely (mctx.input.offsets_needed != 0))
+	      {
+		pmatch[reg_idx].rm_so =
+		  (pmatch[reg_idx].rm_so == mctx.input.valid_len
+		   ? mctx.input.valid_raw_len
+		   : mctx.input.offsets[pmatch[reg_idx].rm_so]);
+		pmatch[reg_idx].rm_eo =
+		  (pmatch[reg_idx].rm_eo == mctx.input.valid_len
+		   ? mctx.input.valid_raw_len
+		   : mctx.input.offsets[pmatch[reg_idx].rm_eo]);
+	      }
+#else
+	    assert (mctx.input.offsets_needed == 0);
+#endif
+	    pmatch[reg_idx].rm_so += match_first;
+	    pmatch[reg_idx].rm_eo += match_first;
+	  }
+      for (reg_idx = 0; reg_idx < extra_nmatch; ++reg_idx)
+	{
+	  pmatch[nmatch + reg_idx].rm_so = -1;
+	  pmatch[nmatch + reg_idx].rm_eo = -1;
+	}
+
+      if (dfa->subexp_map)
+	for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++)
+	  if (dfa->subexp_map[reg_idx] != reg_idx)
+	    {
+	      pmatch[reg_idx + 1].rm_so
+		= pmatch[dfa->subexp_map[reg_idx] + 1].rm_so;
+	      pmatch[reg_idx + 1].rm_eo
+		= pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo;
+	    }
+    }
+
+ free_return:
+  re_free (mctx.state_log);
+  if (dfa->nbackref)
+    match_ctx_free (&mctx);
+  re_string_destruct (&mctx.input);
+  return err;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+prune_impossible_nodes (re_match_context_t *mctx)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  Idx halt_node, match_last;
+  reg_errcode_t ret;
+  re_dfastate_t **sifted_states;
+  re_dfastate_t **lim_states = NULL;
+  re_sift_context_t sctx;
+#ifdef DEBUG
+  assert (mctx->state_log != NULL);
+#endif
+  match_last = mctx->match_last;
+  halt_node = mctx->last_node;
+
+  /* Avoid overflow.  */
+  if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *))
+			<= match_last))
+    return REG_ESPACE;
+
+  sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
+  if (__glibc_unlikely (sifted_states == NULL))
+    {
+      ret = REG_ESPACE;
+      goto free_return;
+    }
+  if (dfa->nbackref)
+    {
+      lim_states = re_malloc (re_dfastate_t *, match_last + 1);
+      if (__glibc_unlikely (lim_states == NULL))
+	{
+	  ret = REG_ESPACE;
+	  goto free_return;
+	}
+      while (1)
+	{
+	  memset (lim_states, '\0',
+		  sizeof (re_dfastate_t *) * (match_last + 1));
+	  sift_ctx_init (&sctx, sifted_states, lim_states, halt_node,
+			 match_last);
+	  ret = sift_states_backward (mctx, &sctx);
+	  re_node_set_free (&sctx.limits);
+	  if (__glibc_unlikely (ret != REG_NOERROR))
+	      goto free_return;
+	  if (sifted_states[0] != NULL || lim_states[0] != NULL)
+	    break;
+	  do
+	    {
+	      --match_last;
+	      if (match_last < 0)
+		{
+		  ret = REG_NOMATCH;
+		  goto free_return;
+		}
+	    } while (mctx->state_log[match_last] == NULL
+		     || !mctx->state_log[match_last]->halt);
+	  halt_node = check_halt_state_context (mctx,
+						mctx->state_log[match_last],
+						match_last);
+	}
+      ret = merge_state_array (dfa, sifted_states, lim_states,
+			       match_last + 1);
+      re_free (lim_states);
+      lim_states = NULL;
+      if (__glibc_unlikely (ret != REG_NOERROR))
+	goto free_return;
+    }
+  else
+    {
+      sift_ctx_init (&sctx, sifted_states, lim_states, halt_node, match_last);
+      ret = sift_states_backward (mctx, &sctx);
+      re_node_set_free (&sctx.limits);
+      if (__glibc_unlikely (ret != REG_NOERROR))
+	goto free_return;
+      if (sifted_states[0] == NULL)
+	{
+	  ret = REG_NOMATCH;
+	  goto free_return;
+	}
+    }
+  re_free (mctx->state_log);
+  mctx->state_log = sifted_states;
+  sifted_states = NULL;
+  mctx->last_node = halt_node;
+  mctx->match_last = match_last;
+  ret = REG_NOERROR;
+ free_return:
+  re_free (sifted_states);
+  re_free (lim_states);
+  return ret;
+}
+
+/* Acquire an initial state and return it.
+   We must select appropriate initial state depending on the context,
+   since initial states may have constraints like "\<", "^", etc..  */
+
+static inline re_dfastate_t *
+__attribute__ ((always_inline))
+acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx,
+			    Idx idx)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  if (dfa->init_state->has_constraint)
+    {
+      unsigned int context;
+      context = re_string_context_at (&mctx->input, idx - 1, mctx->eflags);
+      if (IS_WORD_CONTEXT (context))
+	return dfa->init_state_word;
+      else if (IS_ORDINARY_CONTEXT (context))
+	return dfa->init_state;
+      else if (IS_BEGBUF_CONTEXT (context) && IS_NEWLINE_CONTEXT (context))
+	return dfa->init_state_begbuf;
+      else if (IS_NEWLINE_CONTEXT (context))
+	return dfa->init_state_nl;
+      else if (IS_BEGBUF_CONTEXT (context))
+	{
+	  /* It is relatively rare case, then calculate on demand.  */
+	  return re_acquire_state_context (err, dfa,
+					   dfa->init_state->entrance_nodes,
+					   context);
+	}
+      else
+	/* Must not happen?  */
+	return dfa->init_state;
+    }
+  else
+    return dfa->init_state;
+}
+
+/* Check whether the regular expression match input string INPUT or not,
+   and return the index where the matching end.  Return -1 if
+   there is no match, and return -2 in case of an error.
+   FL_LONGEST_MATCH means we want the POSIX longest matching.
+   If P_MATCH_FIRST is not NULL, and the match fails, it is set to the
+   next place where we may want to try matching.
+   Note that the matcher assumes that the matching starts from the current
+   index of the buffer.  */
+
+static Idx
+__attribute_warn_unused_result__
+check_matching (re_match_context_t *mctx, bool fl_longest_match,
+		Idx *p_match_first)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  reg_errcode_t err;
+  Idx match = 0;
+  Idx match_last = -1;
+  Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+  re_dfastate_t *cur_state;
+  bool at_init_state = p_match_first != NULL;
+  Idx next_start_idx = cur_str_idx;
+
+  err = REG_NOERROR;
+  cur_state = acquire_init_state_context (&err, mctx, cur_str_idx);
+  /* An initial state must not be NULL (invalid).  */
+  if (__glibc_unlikely (cur_state == NULL))
+    {
+      assert (err == REG_ESPACE);
+      return -2;
+    }
+
+  if (mctx->state_log != NULL)
+    {
+      mctx->state_log[cur_str_idx] = cur_state;
+
+      /* Check OP_OPEN_SUBEXP in the initial state in case that we use them
+	 later.  E.g. Processing back references.  */
+      if (__glibc_unlikely (dfa->nbackref))
+	{
+	  at_init_state = false;
+	  err = check_subexp_matching_top (mctx, &cur_state->nodes, 0);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+
+	  if (cur_state->has_backref)
+	    {
+	      err = transit_state_bkref (mctx, &cur_state->nodes);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		return err;
+	    }
+	}
+    }
+
+  /* If the RE accepts NULL string.  */
+  if (__glibc_unlikely (cur_state->halt))
+    {
+      if (!cur_state->has_constraint
+	  || check_halt_state_context (mctx, cur_state, cur_str_idx))
+	{
+	  if (!fl_longest_match)
+	    return cur_str_idx;
+	  else
+	    {
+	      match_last = cur_str_idx;
+	      match = 1;
+	    }
+	}
+    }
+
+  while (!re_string_eoi (&mctx->input))
+    {
+      re_dfastate_t *old_state = cur_state;
+      Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1;
+
+      if ((__glibc_unlikely (next_char_idx >= mctx->input.bufs_len)
+	   && mctx->input.bufs_len < mctx->input.len)
+	  || (__glibc_unlikely (next_char_idx >= mctx->input.valid_len)
+	      && mctx->input.valid_len < mctx->input.len))
+	{
+	  err = extend_buffers (mctx, next_char_idx + 1);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    {
+	      assert (err == REG_ESPACE);
+	      return -2;
+	    }
+	}
+
+      cur_state = transit_state (&err, mctx, cur_state);
+      if (mctx->state_log != NULL)
+	cur_state = merge_state_with_log (&err, mctx, cur_state);
+
+      if (cur_state == NULL)
+	{
+	  /* Reached the invalid state or an error.  Try to recover a valid
+	     state using the state log, if available and if we have not
+	     already found a valid (even if not the longest) match.  */
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return -2;
+
+	  if (mctx->state_log == NULL
+	      || (match && !fl_longest_match)
+	      || (cur_state = find_recover_state (&err, mctx)) == NULL)
+	    break;
+	}
+
+      if (__glibc_unlikely (at_init_state))
+	{
+	  if (old_state == cur_state)
+	    next_start_idx = next_char_idx;
+	  else
+	    at_init_state = false;
+	}
+
+      if (cur_state->halt)
+	{
+	  /* Reached a halt state.
+	     Check the halt state can satisfy the current context.  */
+	  if (!cur_state->has_constraint
+	      || check_halt_state_context (mctx, cur_state,
+					   re_string_cur_idx (&mctx->input)))
+	    {
+	      /* We found an appropriate halt state.  */
+	      match_last = re_string_cur_idx (&mctx->input);
+	      match = 1;
+
+	      /* We found a match, do not modify match_first below.  */
+	      p_match_first = NULL;
+	      if (!fl_longest_match)
+		break;
+	    }
+	}
+    }
+
+  if (p_match_first)
+    *p_match_first += next_start_idx;
+
+  return match_last;
+}
+
+/* Check NODE match the current context.  */
+
+static bool
+check_halt_node_context (const re_dfa_t *dfa, Idx node, unsigned int context)
+{
+  re_token_type_t type = dfa->nodes[node].type;
+  unsigned int constraint = dfa->nodes[node].constraint;
+  if (type != END_OF_RE)
+    return false;
+  if (!constraint)
+    return true;
+  if (NOT_SATISFY_NEXT_CONSTRAINT (constraint, context))
+    return false;
+  return true;
+}
+
+/* Check the halt state STATE match the current context.
+   Return 0 if not match, if the node, STATE has, is a halt node and
+   match the context, return the node.  */
+
+static Idx
+check_halt_state_context (const re_match_context_t *mctx,
+			  const re_dfastate_t *state, Idx idx)
+{
+  Idx i;
+  unsigned int context;
+#ifdef DEBUG
+  assert (state->halt);
+#endif
+  context = re_string_context_at (&mctx->input, idx, mctx->eflags);
+  for (i = 0; i < state->nodes.nelem; ++i)
+    if (check_halt_node_context (mctx->dfa, state->nodes.elems[i], context))
+      return state->nodes.elems[i];
+  return 0;
+}
+
+/* Compute the next node to which "NFA" transit from NODE("NFA" is a NFA
+   corresponding to the DFA).
+   Return the destination node, and update EPS_VIA_NODES;
+   return -1 in case of errors.  */
+
+static Idx
+proceed_next_node (const re_match_context_t *mctx, Idx nregs, regmatch_t *regs,
+		   Idx *pidx, Idx node, re_node_set *eps_via_nodes,
+		   struct re_fail_stack_t *fs)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  Idx i;
+  bool ok;
+  if (IS_EPSILON_NODE (dfa->nodes[node].type))
+    {
+      re_node_set *cur_nodes = &mctx->state_log[*pidx]->nodes;
+      re_node_set *edests = &dfa->edests[node];
+      Idx dest_node;
+      ok = re_node_set_insert (eps_via_nodes, node);
+      if (__glibc_unlikely (! ok))
+	return -2;
+      /* Pick up a valid destination, or return -1 if none
+	 is found.  */
+      for (dest_node = -1, i = 0; i < edests->nelem; ++i)
+	{
+	  Idx candidate = edests->elems[i];
+	  if (!re_node_set_contains (cur_nodes, candidate))
+	    continue;
+          if (dest_node == -1)
+	    dest_node = candidate;
+
+	  else
+	    {
+	      /* In order to avoid infinite loop like "(a*)*", return the second
+		 epsilon-transition if the first was already considered.  */
+	      if (re_node_set_contains (eps_via_nodes, dest_node))
+		return candidate;
+
+	      /* Otherwise, push the second epsilon-transition on the fail stack.  */
+	      else if (fs != NULL
+		       && push_fail_stack (fs, *pidx, candidate, nregs, regs,
+					   eps_via_nodes))
+		return -2;
+
+	      /* We know we are going to exit.  */
+	      break;
+	    }
+	}
+      return dest_node;
+    }
+  else
+    {
+      Idx naccepted = 0;
+      re_token_type_t type = dfa->nodes[node].type;
+
+#ifdef RE_ENABLE_I18N
+      if (dfa->nodes[node].accept_mb)
+	naccepted = check_node_accept_bytes (dfa, node, &mctx->input, *pidx);
+      else
+#endif /* RE_ENABLE_I18N */
+      if (type == OP_BACK_REF)
+	{
+	  Idx subexp_idx = dfa->nodes[node].opr.idx + 1;
+	  naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so;
+	  if (fs != NULL)
+	    {
+	      if (regs[subexp_idx].rm_so == -1 || regs[subexp_idx].rm_eo == -1)
+		return -1;
+	      else if (naccepted)
+		{
+		  char *buf = (char *) re_string_get_buffer (&mctx->input);
+		  if (mctx->input.valid_len - *pidx < naccepted
+		      || (memcmp (buf + regs[subexp_idx].rm_so, buf + *pidx,
+				  naccepted)
+			  != 0))
+		    return -1;
+		}
+	    }
+
+	  if (naccepted == 0)
+	    {
+	      Idx dest_node;
+	      ok = re_node_set_insert (eps_via_nodes, node);
+	      if (__glibc_unlikely (! ok))
+		return -2;
+	      dest_node = dfa->edests[node].elems[0];
+	      if (re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+					dest_node))
+		return dest_node;
+	    }
+	}
+
+      if (naccepted != 0
+	  || check_node_accept (mctx, dfa->nodes + node, *pidx))
+	{
+	  Idx dest_node = dfa->nexts[node];
+	  *pidx = (naccepted == 0) ? *pidx + 1 : *pidx + naccepted;
+	  if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL
+		     || !re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+					       dest_node)))
+	    return -1;
+	  re_node_set_empty (eps_via_nodes);
+	  return dest_node;
+	}
+    }
+  return -1;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+push_fail_stack (struct re_fail_stack_t *fs, Idx str_idx, Idx dest_node,
+		 Idx nregs, regmatch_t *regs, re_node_set *eps_via_nodes)
+{
+  reg_errcode_t err;
+  Idx num = fs->num++;
+  if (fs->num == fs->alloc)
+    {
+      struct re_fail_stack_ent_t *new_array;
+      new_array = re_realloc (fs->stack, struct re_fail_stack_ent_t,
+                              fs->alloc * 2);
+      if (new_array == NULL)
+	return REG_ESPACE;
+      fs->alloc *= 2;
+      fs->stack = new_array;
+    }
+  fs->stack[num].idx = str_idx;
+  fs->stack[num].node = dest_node;
+  fs->stack[num].regs = re_malloc (regmatch_t, nregs);
+  if (fs->stack[num].regs == NULL)
+    return REG_ESPACE;
+  memcpy (fs->stack[num].regs, regs, sizeof (regmatch_t) * nregs);
+  err = re_node_set_init_copy (&fs->stack[num].eps_via_nodes, eps_via_nodes);
+  return err;
+}
+
+static Idx
+pop_fail_stack (struct re_fail_stack_t *fs, Idx *pidx, Idx nregs,
+		regmatch_t *regs, re_node_set *eps_via_nodes)
+{
+  Idx num = --fs->num;
+  assert (num >= 0);
+  *pidx = fs->stack[num].idx;
+  memcpy (regs, fs->stack[num].regs, sizeof (regmatch_t) * nregs);
+  re_node_set_free (eps_via_nodes);
+  re_free (fs->stack[num].regs);
+  *eps_via_nodes = fs->stack[num].eps_via_nodes;
+  return fs->stack[num].node;
+}
+
+/* Set the positions where the subexpressions are starts/ends to registers
+   PMATCH.
+   Note: We assume that pmatch[0] is already set, and
+   pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch,
+	  regmatch_t *pmatch, bool fl_backtrack)
+{
+  const re_dfa_t *dfa = preg->buffer;
+  Idx idx, cur_node;
+  re_node_set eps_via_nodes;
+  struct re_fail_stack_t *fs;
+  struct re_fail_stack_t fs_body = { 0, 2, NULL };
+  regmatch_t *prev_idx_match;
+  bool prev_idx_match_malloced = false;
+
+#ifdef DEBUG
+  assert (nmatch > 1);
+  assert (mctx->state_log != NULL);
+#endif
+  if (fl_backtrack)
+    {
+      fs = &fs_body;
+      fs->stack = re_malloc (struct re_fail_stack_ent_t, fs->alloc);
+      if (fs->stack == NULL)
+	return REG_ESPACE;
+    }
+  else
+    fs = NULL;
+
+  cur_node = dfa->init_node;
+  re_node_set_init_empty (&eps_via_nodes);
+
+  if (__libc_use_alloca (nmatch * sizeof (regmatch_t)))
+    prev_idx_match = (regmatch_t *) alloca (nmatch * sizeof (regmatch_t));
+  else
+    {
+      prev_idx_match = re_malloc (regmatch_t, nmatch);
+      if (prev_idx_match == NULL)
+	{
+	  free_fail_stack_return (fs);
+	  return REG_ESPACE;
+	}
+      prev_idx_match_malloced = true;
+    }
+  memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
+
+  for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;)
+    {
+      update_regs (dfa, pmatch, prev_idx_match, cur_node, idx, nmatch);
+
+      if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node)
+	{
+	  Idx reg_idx;
+	  if (fs)
+	    {
+	      for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+		if (pmatch[reg_idx].rm_so > -1 && pmatch[reg_idx].rm_eo == -1)
+		  break;
+	      if (reg_idx == nmatch)
+		{
+		  re_node_set_free (&eps_via_nodes);
+		  if (prev_idx_match_malloced)
+		    re_free (prev_idx_match);
+		  return free_fail_stack_return (fs);
+		}
+	      cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+					 &eps_via_nodes);
+	    }
+	  else
+	    {
+	      re_node_set_free (&eps_via_nodes);
+	      if (prev_idx_match_malloced)
+		re_free (prev_idx_match);
+	      return REG_NOERROR;
+	    }
+	}
+
+      /* Proceed to next node.  */
+      cur_node = proceed_next_node (mctx, nmatch, pmatch, &idx, cur_node,
+				    &eps_via_nodes, fs);
+
+      if (__glibc_unlikely (cur_node < 0))
+	{
+	  if (__glibc_unlikely (cur_node == -2))
+	    {
+	      re_node_set_free (&eps_via_nodes);
+	      if (prev_idx_match_malloced)
+		re_free (prev_idx_match);
+	      free_fail_stack_return (fs);
+	      return REG_ESPACE;
+	    }
+	  if (fs)
+	    cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+				       &eps_via_nodes);
+	  else
+	    {
+	      re_node_set_free (&eps_via_nodes);
+	      if (prev_idx_match_malloced)
+		re_free (prev_idx_match);
+	      return REG_NOMATCH;
+	    }
+	}
+    }
+  re_node_set_free (&eps_via_nodes);
+  if (prev_idx_match_malloced)
+    re_free (prev_idx_match);
+  return free_fail_stack_return (fs);
+}
+
+static reg_errcode_t
+free_fail_stack_return (struct re_fail_stack_t *fs)
+{
+  if (fs)
+    {
+      Idx fs_idx;
+      for (fs_idx = 0; fs_idx < fs->num; ++fs_idx)
+	{
+	  re_node_set_free (&fs->stack[fs_idx].eps_via_nodes);
+	  re_free (fs->stack[fs_idx].regs);
+	}
+      re_free (fs->stack);
+    }
+  return REG_NOERROR;
+}
+
+static void
+update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
+	     regmatch_t *prev_idx_match, Idx cur_node, Idx cur_idx, Idx nmatch)
+{
+  int type = dfa->nodes[cur_node].type;
+  if (type == OP_OPEN_SUBEXP)
+    {
+      Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
+
+      /* We are at the first node of this sub expression.  */
+      if (reg_num < nmatch)
+	{
+	  pmatch[reg_num].rm_so = cur_idx;
+	  pmatch[reg_num].rm_eo = -1;
+	}
+    }
+  else if (type == OP_CLOSE_SUBEXP)
+    {
+      Idx reg_num = dfa->nodes[cur_node].opr.idx + 1;
+      if (reg_num < nmatch)
+	{
+	  /* We are at the last node of this sub expression.  */
+	  if (pmatch[reg_num].rm_so < cur_idx)
+	    {
+	      pmatch[reg_num].rm_eo = cur_idx;
+	      /* This is a non-empty match or we are not inside an optional
+		 subexpression.  Accept this right away.  */
+	      memcpy (prev_idx_match, pmatch, sizeof (regmatch_t) * nmatch);
+	    }
+	  else
+	    {
+	      if (dfa->nodes[cur_node].opt_subexp
+		  && prev_idx_match[reg_num].rm_so != -1)
+		/* We transited through an empty match for an optional
+		   subexpression, like (a?)*, and this is not the subexp's
+		   first match.  Copy back the old content of the registers
+		   so that matches of an inner subexpression are undone as
+		   well, like in ((a?))*.  */
+		memcpy (pmatch, prev_idx_match, sizeof (regmatch_t) * nmatch);
+	      else
+		/* We completed a subexpression, but it may be part of
+		   an optional one, so do not update PREV_IDX_MATCH.  */
+		pmatch[reg_num].rm_eo = cur_idx;
+	    }
+	}
+    }
+}
+
+/* This function checks the STATE_LOG from the SCTX->last_str_idx to 0
+   and sift the nodes in each states according to the following rules.
+   Updated state_log will be wrote to STATE_LOG.
+
+   Rules: We throw away the Node 'a' in the STATE_LOG[STR_IDX] if...
+     1. When STR_IDX == MATCH_LAST(the last index in the state_log):
+	If 'a' isn't the LAST_NODE and 'a' can't epsilon transit to
+	the LAST_NODE, we throw away the node 'a'.
+     2. When 0 <= STR_IDX < MATCH_LAST and 'a' accepts
+	string 's' and transit to 'b':
+	i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw
+	   away the node 'a'.
+	ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is
+	    thrown away, we throw away the node 'a'.
+     3. When 0 <= STR_IDX < MATCH_LAST and 'a' epsilon transit to 'b':
+	i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the
+	   node 'a'.
+	ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is thrown away,
+	    we throw away the node 'a'.  */
+
+#define STATE_NODE_CONTAINS(state,node) \
+  ((state) != NULL && re_node_set_contains (&(state)->nodes, node))
+
+static reg_errcode_t
+sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx)
+{
+  reg_errcode_t err;
+  int null_cnt = 0;
+  Idx str_idx = sctx->last_str_idx;
+  re_node_set cur_dest;
+
+#ifdef DEBUG
+  assert (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL);
+#endif
+
+  /* Build sifted state_log[str_idx].  It has the nodes which can epsilon
+     transit to the last_node and the last_node itself.  */
+  err = re_node_set_init_1 (&cur_dest, sctx->last_node);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    return err;
+  err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    goto free_return;
+
+  /* Then check each states in the state_log.  */
+  while (str_idx > 0)
+    {
+      /* Update counters.  */
+      null_cnt = (sctx->sifted_states[str_idx] == NULL) ? null_cnt + 1 : 0;
+      if (null_cnt > mctx->max_mb_elem_len)
+	{
+	  memset (sctx->sifted_states, '\0',
+		  sizeof (re_dfastate_t *) * str_idx);
+	  re_node_set_free (&cur_dest);
+	  return REG_NOERROR;
+	}
+      re_node_set_empty (&cur_dest);
+      --str_idx;
+
+      if (mctx->state_log[str_idx])
+	{
+	  err = build_sifted_states (mctx, sctx, str_idx, &cur_dest);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    goto free_return;
+	}
+
+      /* Add all the nodes which satisfy the following conditions:
+	 - It can epsilon transit to a node in CUR_DEST.
+	 - It is in CUR_SRC.
+	 And update state_log.  */
+      err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	goto free_return;
+    }
+  err = REG_NOERROR;
+ free_return:
+  re_node_set_free (&cur_dest);
+  return err;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx,
+		     Idx str_idx, re_node_set *cur_dest)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  const re_node_set *cur_src = &mctx->state_log[str_idx]->non_eps_nodes;
+  Idx i;
+
+  /* Then build the next sifted state.
+     We build the next sifted state on 'cur_dest', and update
+     'sifted_states[str_idx]' with 'cur_dest'.
+     Note:
+     'cur_dest' is the sifted state from 'state_log[str_idx + 1]'.
+     'cur_src' points the node_set of the old 'state_log[str_idx]'
+     (with the epsilon nodes pre-filtered out).  */
+  for (i = 0; i < cur_src->nelem; i++)
+    {
+      Idx prev_node = cur_src->elems[i];
+      int naccepted = 0;
+      bool ok;
+
+#ifdef DEBUG
+      re_token_type_t type = dfa->nodes[prev_node].type;
+      assert (!IS_EPSILON_NODE (type));
+#endif
+#ifdef RE_ENABLE_I18N
+      /* If the node may accept "multi byte".  */
+      if (dfa->nodes[prev_node].accept_mb)
+	naccepted = sift_states_iter_mb (mctx, sctx, prev_node,
+					 str_idx, sctx->last_str_idx);
+#endif /* RE_ENABLE_I18N */
+
+      /* We don't check backreferences here.
+	 See update_cur_sifted_state().  */
+      if (!naccepted
+	  && check_node_accept (mctx, dfa->nodes + prev_node, str_idx)
+	  && STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + 1],
+				  dfa->nexts[prev_node]))
+	naccepted = 1;
+
+      if (naccepted == 0)
+	continue;
+
+      if (sctx->limits.nelem)
+	{
+	  Idx to_idx = str_idx + naccepted;
+	  if (check_dst_limits (mctx, &sctx->limits,
+				dfa->nexts[prev_node], to_idx,
+				prev_node, str_idx))
+	    continue;
+	}
+      ok = re_node_set_insert (cur_dest, prev_node);
+      if (__glibc_unlikely (! ok))
+	return REG_ESPACE;
+    }
+
+  return REG_NOERROR;
+}
+
+/* Helper functions.  */
+
+static reg_errcode_t
+clean_state_log_if_needed (re_match_context_t *mctx, Idx next_state_log_idx)
+{
+  Idx top = mctx->state_log_top;
+
+  if ((next_state_log_idx >= mctx->input.bufs_len
+       && mctx->input.bufs_len < mctx->input.len)
+      || (next_state_log_idx >= mctx->input.valid_len
+	  && mctx->input.valid_len < mctx->input.len))
+    {
+      reg_errcode_t err;
+      err = extend_buffers (mctx, next_state_log_idx + 1);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	return err;
+    }
+
+  if (top < next_state_log_idx)
+    {
+      memset (mctx->state_log + top + 1, '\0',
+	      sizeof (re_dfastate_t *) * (next_state_log_idx - top));
+      mctx->state_log_top = next_state_log_idx;
+    }
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+merge_state_array (const re_dfa_t *dfa, re_dfastate_t **dst,
+		   re_dfastate_t **src, Idx num)
+{
+  Idx st_idx;
+  reg_errcode_t err;
+  for (st_idx = 0; st_idx < num; ++st_idx)
+    {
+      if (dst[st_idx] == NULL)
+	dst[st_idx] = src[st_idx];
+      else if (src[st_idx] != NULL)
+	{
+	  re_node_set merged_set;
+	  err = re_node_set_init_union (&merged_set, &dst[st_idx]->nodes,
+					&src[st_idx]->nodes);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+	  dst[st_idx] = re_acquire_state (&err, dfa, &merged_set);
+	  re_node_set_free (&merged_set);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+	}
+    }
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+update_cur_sifted_state (const re_match_context_t *mctx,
+			 re_sift_context_t *sctx, Idx str_idx,
+			 re_node_set *dest_nodes)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  reg_errcode_t err = REG_NOERROR;
+  const re_node_set *candidates;
+  candidates = ((mctx->state_log[str_idx] == NULL) ? NULL
+		: &mctx->state_log[str_idx]->nodes);
+
+  if (dest_nodes->nelem == 0)
+    sctx->sifted_states[str_idx] = NULL;
+  else
+    {
+      if (candidates)
+	{
+	  /* At first, add the nodes which can epsilon transit to a node in
+	     DEST_NODE.  */
+	  err = add_epsilon_src_nodes (dfa, dest_nodes, candidates);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+
+	  /* Then, check the limitations in the current sift_context.  */
+	  if (sctx->limits.nelem)
+	    {
+	      err = check_subexp_limits (dfa, dest_nodes, candidates, &sctx->limits,
+					 mctx->bkref_ents, str_idx);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		return err;
+	    }
+	}
+
+      sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	return err;
+    }
+
+  if (candidates && mctx->state_log[str_idx]->has_backref)
+    {
+      err = sift_states_bkref (mctx, sctx, str_idx, candidates);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	return err;
+    }
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes,
+		       const re_node_set *candidates)
+{
+  reg_errcode_t err = REG_NOERROR;
+  Idx i;
+
+  re_dfastate_t *state = re_acquire_state (&err, dfa, dest_nodes);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    return err;
+
+  if (!state->inveclosure.alloc)
+    {
+      err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	return REG_ESPACE;
+      for (i = 0; i < dest_nodes->nelem; i++)
+	{
+	  err = re_node_set_merge (&state->inveclosure,
+				   dfa->inveclosures + dest_nodes->elems[i]);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return REG_ESPACE;
+	}
+    }
+  return re_node_set_add_intersect (dest_nodes, candidates,
+				    &state->inveclosure);
+}
+
+static reg_errcode_t
+sub_epsilon_src_nodes (const re_dfa_t *dfa, Idx node, re_node_set *dest_nodes,
+		       const re_node_set *candidates)
+{
+    Idx ecl_idx;
+    reg_errcode_t err;
+    re_node_set *inv_eclosure = dfa->inveclosures + node;
+    re_node_set except_nodes;
+    re_node_set_init_empty (&except_nodes);
+    for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+      {
+	Idx cur_node = inv_eclosure->elems[ecl_idx];
+	if (cur_node == node)
+	  continue;
+	if (IS_EPSILON_NODE (dfa->nodes[cur_node].type))
+	  {
+	    Idx edst1 = dfa->edests[cur_node].elems[0];
+	    Idx edst2 = ((dfa->edests[cur_node].nelem > 1)
+			 ? dfa->edests[cur_node].elems[1] : -1);
+	    if ((!re_node_set_contains (inv_eclosure, edst1)
+		 && re_node_set_contains (dest_nodes, edst1))
+		|| (edst2 > 0
+		    && !re_node_set_contains (inv_eclosure, edst2)
+		    && re_node_set_contains (dest_nodes, edst2)))
+	      {
+		err = re_node_set_add_intersect (&except_nodes, candidates,
+						 dfa->inveclosures + cur_node);
+		if (__glibc_unlikely (err != REG_NOERROR))
+		  {
+		    re_node_set_free (&except_nodes);
+		    return err;
+		  }
+	      }
+	  }
+      }
+    for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+      {
+	Idx cur_node = inv_eclosure->elems[ecl_idx];
+	if (!re_node_set_contains (&except_nodes, cur_node))
+	  {
+	    Idx idx = re_node_set_contains (dest_nodes, cur_node) - 1;
+	    re_node_set_remove_at (dest_nodes, idx);
+	  }
+      }
+    re_node_set_free (&except_nodes);
+    return REG_NOERROR;
+}
+
+static bool
+check_dst_limits (const re_match_context_t *mctx, const re_node_set *limits,
+		  Idx dst_node, Idx dst_idx, Idx src_node, Idx src_idx)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  Idx lim_idx, src_pos, dst_pos;
+
+  Idx dst_bkref_idx = search_cur_bkref_entry (mctx, dst_idx);
+  Idx src_bkref_idx = search_cur_bkref_entry (mctx, src_idx);
+  for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+    {
+      Idx subexp_idx;
+      struct re_backref_cache_entry *ent;
+      ent = mctx->bkref_ents + limits->elems[lim_idx];
+      subexp_idx = dfa->nodes[ent->node].opr.idx;
+
+      dst_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
+					   subexp_idx, dst_node, dst_idx,
+					   dst_bkref_idx);
+      src_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx],
+					   subexp_idx, src_node, src_idx,
+					   src_bkref_idx);
+
+      /* In case of:
+	 <src> <dst> ( <subexp> )
+	 ( <subexp> ) <src> <dst>
+	 ( <subexp1> <src> <subexp2> <dst> <subexp3> )  */
+      if (src_pos == dst_pos)
+	continue; /* This is unrelated limitation.  */
+      else
+	return true;
+    }
+  return false;
+}
+
+static int
+check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries,
+			     Idx subexp_idx, Idx from_node, Idx bkref_idx)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  const re_node_set *eclosures = dfa->eclosures + from_node;
+  Idx node_idx;
+
+  /* Else, we are on the boundary: examine the nodes on the epsilon
+     closure.  */
+  for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx)
+    {
+      Idx node = eclosures->elems[node_idx];
+      switch (dfa->nodes[node].type)
+	{
+	case OP_BACK_REF:
+	  if (bkref_idx != -1)
+	    {
+	      struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx;
+	      do
+		{
+		  Idx dst;
+		  int cpos;
+
+		  if (ent->node != node)
+		    continue;
+
+		  if (subexp_idx < BITSET_WORD_BITS
+		      && !(ent->eps_reachable_subexps_map
+			   & ((bitset_word_t) 1 << subexp_idx)))
+		    continue;
+
+		  /* Recurse trying to reach the OP_OPEN_SUBEXP and
+		     OP_CLOSE_SUBEXP cases below.  But, if the
+		     destination node is the same node as the source
+		     node, don't recurse because it would cause an
+		     infinite loop: a regex that exhibits this behavior
+		     is ()\1*\1*  */
+		  dst = dfa->edests[node].elems[0];
+		  if (dst == from_node)
+		    {
+		      if (boundaries & 1)
+			return -1;
+		      else /* if (boundaries & 2) */
+			return 0;
+		    }
+
+		  cpos =
+		    check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
+						 dst, bkref_idx);
+		  if (cpos == -1 /* && (boundaries & 1) */)
+		    return -1;
+		  if (cpos == 0 && (boundaries & 2))
+		    return 0;
+
+		  if (subexp_idx < BITSET_WORD_BITS)
+		    ent->eps_reachable_subexps_map
+		      &= ~((bitset_word_t) 1 << subexp_idx);
+		}
+	      while (ent++->more);
+	    }
+	  break;
+
+	case OP_OPEN_SUBEXP:
+	  if ((boundaries & 1) && subexp_idx == dfa->nodes[node].opr.idx)
+	    return -1;
+	  break;
+
+	case OP_CLOSE_SUBEXP:
+	  if ((boundaries & 2) && subexp_idx == dfa->nodes[node].opr.idx)
+	    return 0;
+	  break;
+
+	default:
+	    break;
+	}
+    }
+
+  return (boundaries & 2) ? 1 : 0;
+}
+
+static int
+check_dst_limits_calc_pos (const re_match_context_t *mctx, Idx limit,
+			   Idx subexp_idx, Idx from_node, Idx str_idx,
+			   Idx bkref_idx)
+{
+  struct re_backref_cache_entry *lim = mctx->bkref_ents + limit;
+  int boundaries;
+
+  /* If we are outside the range of the subexpression, return -1 or 1.  */
+  if (str_idx < lim->subexp_from)
+    return -1;
+
+  if (lim->subexp_to < str_idx)
+    return 1;
+
+  /* If we are within the subexpression, return 0.  */
+  boundaries = (str_idx == lim->subexp_from);
+  boundaries |= (str_idx == lim->subexp_to) << 1;
+  if (boundaries == 0)
+    return 0;
+
+  /* Else, examine epsilon closure.  */
+  return check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx,
+				      from_node, bkref_idx);
+}
+
+/* Check the limitations of sub expressions LIMITS, and remove the nodes
+   which are against limitations from DEST_NODES. */
+
+static reg_errcode_t
+check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes,
+		     const re_node_set *candidates, re_node_set *limits,
+		     struct re_backref_cache_entry *bkref_ents, Idx str_idx)
+{
+  reg_errcode_t err;
+  Idx node_idx, lim_idx;
+
+  for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+    {
+      Idx subexp_idx;
+      struct re_backref_cache_entry *ent;
+      ent = bkref_ents + limits->elems[lim_idx];
+
+      if (str_idx <= ent->subexp_from || ent->str_idx < str_idx)
+	continue; /* This is unrelated limitation.  */
+
+      subexp_idx = dfa->nodes[ent->node].opr.idx;
+      if (ent->subexp_to == str_idx)
+	{
+	  Idx ops_node = -1;
+	  Idx cls_node = -1;
+	  for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+	    {
+	      Idx node = dest_nodes->elems[node_idx];
+	      re_token_type_t type = dfa->nodes[node].type;
+	      if (type == OP_OPEN_SUBEXP
+		  && subexp_idx == dfa->nodes[node].opr.idx)
+		ops_node = node;
+	      else if (type == OP_CLOSE_SUBEXP
+		       && subexp_idx == dfa->nodes[node].opr.idx)
+		cls_node = node;
+	    }
+
+	  /* Check the limitation of the open subexpression.  */
+	  /* Note that (ent->subexp_to = str_idx != ent->subexp_from).  */
+	  if (ops_node >= 0)
+	    {
+	      err = sub_epsilon_src_nodes (dfa, ops_node, dest_nodes,
+					   candidates);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		return err;
+	    }
+
+	  /* Check the limitation of the close subexpression.  */
+	  if (cls_node >= 0)
+	    for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+	      {
+		Idx node = dest_nodes->elems[node_idx];
+		if (!re_node_set_contains (dfa->inveclosures + node,
+					   cls_node)
+		    && !re_node_set_contains (dfa->eclosures + node,
+					      cls_node))
+		  {
+		    /* It is against this limitation.
+		       Remove it form the current sifted state.  */
+		    err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
+						 candidates);
+		    if (__glibc_unlikely (err != REG_NOERROR))
+		      return err;
+		    --node_idx;
+		  }
+	      }
+	}
+      else /* (ent->subexp_to != str_idx)  */
+	{
+	  for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+	    {
+	      Idx node = dest_nodes->elems[node_idx];
+	      re_token_type_t type = dfa->nodes[node].type;
+	      if (type == OP_CLOSE_SUBEXP || type == OP_OPEN_SUBEXP)
+		{
+		  if (subexp_idx != dfa->nodes[node].opr.idx)
+		    continue;
+		  /* It is against this limitation.
+		     Remove it form the current sifted state.  */
+		  err = sub_epsilon_src_nodes (dfa, node, dest_nodes,
+					       candidates);
+		  if (__glibc_unlikely (err != REG_NOERROR))
+		    return err;
+		}
+	    }
+	}
+    }
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx,
+		   Idx str_idx, const re_node_set *candidates)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  reg_errcode_t err;
+  Idx node_idx, node;
+  re_sift_context_t local_sctx;
+  Idx first_idx = search_cur_bkref_entry (mctx, str_idx);
+
+  if (first_idx == -1)
+    return REG_NOERROR;
+
+  local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized.  */
+
+  for (node_idx = 0; node_idx < candidates->nelem; ++node_idx)
+    {
+      Idx enabled_idx;
+      re_token_type_t type;
+      struct re_backref_cache_entry *entry;
+      node = candidates->elems[node_idx];
+      type = dfa->nodes[node].type;
+      /* Avoid infinite loop for the REs like "()\1+".  */
+      if (node == sctx->last_node && str_idx == sctx->last_str_idx)
+	continue;
+      if (type != OP_BACK_REF)
+	continue;
+
+      entry = mctx->bkref_ents + first_idx;
+      enabled_idx = first_idx;
+      do
+	{
+	  Idx subexp_len;
+	  Idx to_idx;
+	  Idx dst_node;
+	  bool ok;
+	  re_dfastate_t *cur_state;
+
+	  if (entry->node != node)
+	    continue;
+	  subexp_len = entry->subexp_to - entry->subexp_from;
+	  to_idx = str_idx + subexp_len;
+	  dst_node = (subexp_len ? dfa->nexts[node]
+		      : dfa->edests[node].elems[0]);
+
+	  if (to_idx > sctx->last_str_idx
+	      || sctx->sifted_states[to_idx] == NULL
+	      || !STATE_NODE_CONTAINS (sctx->sifted_states[to_idx], dst_node)
+	      || check_dst_limits (mctx, &sctx->limits, node,
+				   str_idx, dst_node, to_idx))
+	    continue;
+
+	  if (local_sctx.sifted_states == NULL)
+	    {
+	      local_sctx = *sctx;
+	      err = re_node_set_init_copy (&local_sctx.limits, &sctx->limits);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		goto free_return;
+	    }
+	  local_sctx.last_node = node;
+	  local_sctx.last_str_idx = str_idx;
+	  ok = re_node_set_insert (&local_sctx.limits, enabled_idx);
+	  if (__glibc_unlikely (! ok))
+	    {
+	      err = REG_ESPACE;
+	      goto free_return;
+	    }
+	  cur_state = local_sctx.sifted_states[str_idx];
+	  err = sift_states_backward (mctx, &local_sctx);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    goto free_return;
+	  if (sctx->limited_states != NULL)
+	    {
+	      err = merge_state_array (dfa, sctx->limited_states,
+				       local_sctx.sifted_states,
+				       str_idx + 1);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		goto free_return;
+	    }
+	  local_sctx.sifted_states[str_idx] = cur_state;
+	  re_node_set_remove (&local_sctx.limits, enabled_idx);
+
+	  /* mctx->bkref_ents may have changed, reload the pointer.  */
+	  entry = mctx->bkref_ents + enabled_idx;
+	}
+      while (enabled_idx++, entry++->more);
+    }
+  err = REG_NOERROR;
+ free_return:
+  if (local_sctx.sifted_states != NULL)
+    {
+      re_node_set_free (&local_sctx.limits);
+    }
+
+  return err;
+}
+
+
+#ifdef RE_ENABLE_I18N
+static int
+sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx,
+		     Idx node_idx, Idx str_idx, Idx max_str_idx)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  int naccepted;
+  /* Check the node can accept "multi byte".  */
+  naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx);
+  if (naccepted > 0 && str_idx + naccepted <= max_str_idx
+      && !STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted],
+			       dfa->nexts[node_idx]))
+    /* The node can't accept the "multi byte", or the
+       destination was already thrown away, then the node
+       couldn't accept the current input "multi byte".   */
+    naccepted = 0;
+  /* Otherwise, it is sure that the node could accept
+     'naccepted' bytes input.  */
+  return naccepted;
+}
+#endif /* RE_ENABLE_I18N */
+
+
+/* Functions for state transition.  */
+
+/* Return the next state to which the current state STATE will transit by
+   accepting the current input byte, and update STATE_LOG if necessary.
+   If STATE can accept a multibyte char/collating element/back reference
+   update the destination of STATE_LOG.  */
+
+static re_dfastate_t *
+__attribute_warn_unused_result__
+transit_state (reg_errcode_t *err, re_match_context_t *mctx,
+	       re_dfastate_t *state)
+{
+  re_dfastate_t **trtable;
+  unsigned char ch;
+
+#ifdef RE_ENABLE_I18N
+  /* If the current state can accept multibyte.  */
+  if (__glibc_unlikely (state->accept_mb))
+    {
+      *err = transit_state_mb (mctx, state);
+      if (__glibc_unlikely (*err != REG_NOERROR))
+	return NULL;
+    }
+#endif /* RE_ENABLE_I18N */
+
+  /* Then decide the next state with the single byte.  */
+#if 0
+  if (0)
+    /* don't use transition table  */
+    return transit_state_sb (err, mctx, state);
+#endif
+
+  /* Use transition table  */
+  ch = re_string_fetch_byte (&mctx->input);
+  for (;;)
+    {
+      trtable = state->trtable;
+      if (__glibc_likely (trtable != NULL))
+	return trtable[ch];
+
+      trtable = state->word_trtable;
+      if (__glibc_likely (trtable != NULL))
+	{
+	  unsigned int context;
+	  context
+	    = re_string_context_at (&mctx->input,
+				    re_string_cur_idx (&mctx->input) - 1,
+				    mctx->eflags);
+	  if (IS_WORD_CONTEXT (context))
+	    return trtable[ch + SBC_MAX];
+	  else
+	    return trtable[ch];
+	}
+
+      if (!build_trtable (mctx->dfa, state))
+	{
+	  *err = REG_ESPACE;
+	  return NULL;
+	}
+
+      /* Retry, we now have a transition table.  */
+    }
+}
+
+/* Update the state_log if we need */
+static re_dfastate_t *
+merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx,
+		      re_dfastate_t *next_state)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  Idx cur_idx = re_string_cur_idx (&mctx->input);
+
+  if (cur_idx > mctx->state_log_top)
+    {
+      mctx->state_log[cur_idx] = next_state;
+      mctx->state_log_top = cur_idx;
+    }
+  else if (mctx->state_log[cur_idx] == 0)
+    {
+      mctx->state_log[cur_idx] = next_state;
+    }
+  else
+    {
+      re_dfastate_t *pstate;
+      unsigned int context;
+      re_node_set next_nodes, *log_nodes, *table_nodes = NULL;
+      /* If (state_log[cur_idx] != 0), it implies that cur_idx is
+	 the destination of a multibyte char/collating element/
+	 back reference.  Then the next state is the union set of
+	 these destinations and the results of the transition table.  */
+      pstate = mctx->state_log[cur_idx];
+      log_nodes = pstate->entrance_nodes;
+      if (next_state != NULL)
+	{
+	  table_nodes = next_state->entrance_nodes;
+	  *err = re_node_set_init_union (&next_nodes, table_nodes,
+					     log_nodes);
+	  if (__glibc_unlikely (*err != REG_NOERROR))
+	    return NULL;
+	}
+      else
+	next_nodes = *log_nodes;
+      /* Note: We already add the nodes of the initial state,
+	 then we don't need to add them here.  */
+
+      context = re_string_context_at (&mctx->input,
+				      re_string_cur_idx (&mctx->input) - 1,
+				      mctx->eflags);
+      next_state = mctx->state_log[cur_idx]
+	= re_acquire_state_context (err, dfa, &next_nodes, context);
+      /* We don't need to check errors here, since the return value of
+	 this function is next_state and ERR is already set.  */
+
+      if (table_nodes != NULL)
+	re_node_set_free (&next_nodes);
+    }
+
+  if (__glibc_unlikely (dfa->nbackref) && next_state != NULL)
+    {
+      /* Check OP_OPEN_SUBEXP in the current state in case that we use them
+	 later.  We must check them here, since the back references in the
+	 next state might use them.  */
+      *err = check_subexp_matching_top (mctx, &next_state->nodes,
+					cur_idx);
+      if (__glibc_unlikely (*err != REG_NOERROR))
+	return NULL;
+
+      /* If the next state has back references.  */
+      if (next_state->has_backref)
+	{
+	  *err = transit_state_bkref (mctx, &next_state->nodes);
+	  if (__glibc_unlikely (*err != REG_NOERROR))
+	    return NULL;
+	  next_state = mctx->state_log[cur_idx];
+	}
+    }
+
+  return next_state;
+}
+
+/* Skip bytes in the input that correspond to part of a
+   multi-byte match, then look in the log for a state
+   from which to restart matching.  */
+static re_dfastate_t *
+find_recover_state (reg_errcode_t *err, re_match_context_t *mctx)
+{
+  re_dfastate_t *cur_state;
+  do
+    {
+      Idx max = mctx->state_log_top;
+      Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+
+      do
+	{
+	  if (++cur_str_idx > max)
+	    return NULL;
+	  re_string_skip_bytes (&mctx->input, 1);
+	}
+      while (mctx->state_log[cur_str_idx] == NULL);
+
+      cur_state = merge_state_with_log (err, mctx, NULL);
+    }
+  while (*err == REG_NOERROR && cur_state == NULL);
+  return cur_state;
+}
+
+/* Helper functions for transit_state.  */
+
+/* From the node set CUR_NODES, pick up the nodes whose types are
+   OP_OPEN_SUBEXP and which have corresponding back references in the regular
+   expression. And register them to use them later for evaluating the
+   corresponding back references.  */
+
+static reg_errcode_t
+check_subexp_matching_top (re_match_context_t *mctx, re_node_set *cur_nodes,
+			   Idx str_idx)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  Idx node_idx;
+  reg_errcode_t err;
+
+  /* TODO: This isn't efficient.
+	   Because there might be more than one nodes whose types are
+	   OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
+	   nodes.
+	   E.g. RE: (a){2}  */
+  for (node_idx = 0; node_idx < cur_nodes->nelem; ++node_idx)
+    {
+      Idx node = cur_nodes->elems[node_idx];
+      if (dfa->nodes[node].type == OP_OPEN_SUBEXP
+	  && dfa->nodes[node].opr.idx < BITSET_WORD_BITS
+	  && (dfa->used_bkref_map
+	      & ((bitset_word_t) 1 << dfa->nodes[node].opr.idx)))
+	{
+	  err = match_ctx_add_subtop (mctx, node, str_idx);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+	}
+    }
+  return REG_NOERROR;
+}
+
+#if 0
+/* Return the next state to which the current state STATE will transit by
+   accepting the current input byte.  */
+
+static re_dfastate_t *
+transit_state_sb (reg_errcode_t *err, re_match_context_t *mctx,
+		  re_dfastate_t *state)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  re_node_set next_nodes;
+  re_dfastate_t *next_state;
+  Idx node_cnt, cur_str_idx = re_string_cur_idx (&mctx->input);
+  unsigned int context;
+
+  *err = re_node_set_alloc (&next_nodes, state->nodes.nelem + 1);
+  if (__glibc_unlikely (*err != REG_NOERROR))
+    return NULL;
+  for (node_cnt = 0; node_cnt < state->nodes.nelem; ++node_cnt)
+    {
+      Idx cur_node = state->nodes.elems[node_cnt];
+      if (check_node_accept (mctx, dfa->nodes + cur_node, cur_str_idx))
+	{
+	  *err = re_node_set_merge (&next_nodes,
+				    dfa->eclosures + dfa->nexts[cur_node]);
+	  if (__glibc_unlikely (*err != REG_NOERROR))
+	    {
+	      re_node_set_free (&next_nodes);
+	      return NULL;
+	    }
+	}
+    }
+  context = re_string_context_at (&mctx->input, cur_str_idx, mctx->eflags);
+  next_state = re_acquire_state_context (err, dfa, &next_nodes, context);
+  /* We don't need to check errors here, since the return value of
+     this function is next_state and ERR is already set.  */
+
+  re_node_set_free (&next_nodes);
+  re_string_skip_bytes (&mctx->input, 1);
+  return next_state;
+}
+#endif
+
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t
+transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  reg_errcode_t err;
+  Idx i;
+
+  for (i = 0; i < pstate->nodes.nelem; ++i)
+    {
+      re_node_set dest_nodes, *new_nodes;
+      Idx cur_node_idx = pstate->nodes.elems[i];
+      int naccepted;
+      Idx dest_idx;
+      unsigned int context;
+      re_dfastate_t *dest_state;
+
+      if (!dfa->nodes[cur_node_idx].accept_mb)
+	continue;
+
+      if (dfa->nodes[cur_node_idx].constraint)
+	{
+	  context = re_string_context_at (&mctx->input,
+					  re_string_cur_idx (&mctx->input),
+					  mctx->eflags);
+	  if (NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[cur_node_idx].constraint,
+					   context))
+	    continue;
+	}
+
+      /* How many bytes the node can accept?  */
+      naccepted = check_node_accept_bytes (dfa, cur_node_idx, &mctx->input,
+					   re_string_cur_idx (&mctx->input));
+      if (naccepted == 0)
+	continue;
+
+      /* The node can accepts 'naccepted' bytes.  */
+      dest_idx = re_string_cur_idx (&mctx->input) + naccepted;
+      mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted
+			       : mctx->max_mb_elem_len);
+      err = clean_state_log_if_needed (mctx, dest_idx);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	return err;
+#ifdef DEBUG
+      assert (dfa->nexts[cur_node_idx] != -1);
+#endif
+      new_nodes = dfa->eclosures + dfa->nexts[cur_node_idx];
+
+      dest_state = mctx->state_log[dest_idx];
+      if (dest_state == NULL)
+	dest_nodes = *new_nodes;
+      else
+	{
+	  err = re_node_set_init_union (&dest_nodes,
+					dest_state->entrance_nodes, new_nodes);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+	}
+      context = re_string_context_at (&mctx->input, dest_idx - 1,
+				      mctx->eflags);
+      mctx->state_log[dest_idx]
+	= re_acquire_state_context (&err, dfa, &dest_nodes, context);
+      if (dest_state != NULL)
+	re_node_set_free (&dest_nodes);
+      if (__glibc_unlikely (mctx->state_log[dest_idx] == NULL
+			    && err != REG_NOERROR))
+	return err;
+    }
+  return REG_NOERROR;
+}
+#endif /* RE_ENABLE_I18N */
+
+static reg_errcode_t
+transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  reg_errcode_t err;
+  Idx i;
+  Idx cur_str_idx = re_string_cur_idx (&mctx->input);
+
+  for (i = 0; i < nodes->nelem; ++i)
+    {
+      Idx dest_str_idx, prev_nelem, bkc_idx;
+      Idx node_idx = nodes->elems[i];
+      unsigned int context;
+      const re_token_t *node = dfa->nodes + node_idx;
+      re_node_set *new_dest_nodes;
+
+      /* Check whether 'node' is a backreference or not.  */
+      if (node->type != OP_BACK_REF)
+	continue;
+
+      if (node->constraint)
+	{
+	  context = re_string_context_at (&mctx->input, cur_str_idx,
+					  mctx->eflags);
+	  if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+	    continue;
+	}
+
+      /* 'node' is a backreference.
+	 Check the substring which the substring matched.  */
+      bkc_idx = mctx->nbkref_ents;
+      err = get_subexp (mctx, node_idx, cur_str_idx);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	goto free_return;
+
+      /* And add the epsilon closures (which is 'new_dest_nodes') of
+	 the backreference to appropriate state_log.  */
+#ifdef DEBUG
+      assert (dfa->nexts[node_idx] != -1);
+#endif
+      for (; bkc_idx < mctx->nbkref_ents; ++bkc_idx)
+	{
+	  Idx subexp_len;
+	  re_dfastate_t *dest_state;
+	  struct re_backref_cache_entry *bkref_ent;
+	  bkref_ent = mctx->bkref_ents + bkc_idx;
+	  if (bkref_ent->node != node_idx || bkref_ent->str_idx != cur_str_idx)
+	    continue;
+	  subexp_len = bkref_ent->subexp_to - bkref_ent->subexp_from;
+	  new_dest_nodes = (subexp_len == 0
+			    ? dfa->eclosures + dfa->edests[node_idx].elems[0]
+			    : dfa->eclosures + dfa->nexts[node_idx]);
+	  dest_str_idx = (cur_str_idx + bkref_ent->subexp_to
+			  - bkref_ent->subexp_from);
+	  context = re_string_context_at (&mctx->input, dest_str_idx - 1,
+					  mctx->eflags);
+	  dest_state = mctx->state_log[dest_str_idx];
+	  prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0
+			: mctx->state_log[cur_str_idx]->nodes.nelem);
+	  /* Add 'new_dest_node' to state_log.  */
+	  if (dest_state == NULL)
+	    {
+	      mctx->state_log[dest_str_idx]
+		= re_acquire_state_context (&err, dfa, new_dest_nodes,
+					    context);
+	      if (__glibc_unlikely (mctx->state_log[dest_str_idx] == NULL
+				    && err != REG_NOERROR))
+		goto free_return;
+	    }
+	  else
+	    {
+	      re_node_set dest_nodes;
+	      err = re_node_set_init_union (&dest_nodes,
+					    dest_state->entrance_nodes,
+					    new_dest_nodes);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		{
+		  re_node_set_free (&dest_nodes);
+		  goto free_return;
+		}
+	      mctx->state_log[dest_str_idx]
+		= re_acquire_state_context (&err, dfa, &dest_nodes, context);
+	      re_node_set_free (&dest_nodes);
+	      if (__glibc_unlikely (mctx->state_log[dest_str_idx] == NULL
+				    && err != REG_NOERROR))
+		goto free_return;
+	    }
+	  /* We need to check recursively if the backreference can epsilon
+	     transit.  */
+	  if (subexp_len == 0
+	      && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem)
+	    {
+	      err = check_subexp_matching_top (mctx, new_dest_nodes,
+					       cur_str_idx);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		goto free_return;
+	      err = transit_state_bkref (mctx, new_dest_nodes);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		goto free_return;
+	    }
+	}
+    }
+  err = REG_NOERROR;
+ free_return:
+  return err;
+}
+
+/* Enumerate all the candidates which the backreference BKREF_NODE can match
+   at BKREF_STR_IDX, and register them by match_ctx_add_entry().
+   Note that we might collect inappropriate candidates here.
+   However, the cost of checking them strictly here is too high, then we
+   delay these checking for prune_impossible_nodes().  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  Idx subexp_num, sub_top_idx;
+  const char *buf = (const char *) re_string_get_buffer (&mctx->input);
+  /* Return if we have already checked BKREF_NODE at BKREF_STR_IDX.  */
+  Idx cache_idx = search_cur_bkref_entry (mctx, bkref_str_idx);
+  if (cache_idx != -1)
+    {
+      const struct re_backref_cache_entry *entry
+	= mctx->bkref_ents + cache_idx;
+      do
+	if (entry->node == bkref_node)
+	  return REG_NOERROR; /* We already checked it.  */
+      while (entry++->more);
+    }
+
+  subexp_num = dfa->nodes[bkref_node].opr.idx;
+
+  /* For each sub expression  */
+  for (sub_top_idx = 0; sub_top_idx < mctx->nsub_tops; ++sub_top_idx)
+    {
+      reg_errcode_t err;
+      re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx];
+      re_sub_match_last_t *sub_last;
+      Idx sub_last_idx, sl_str, bkref_str_off;
+
+      if (dfa->nodes[sub_top->node].opr.idx != subexp_num)
+	continue; /* It isn't related.  */
+
+      sl_str = sub_top->str_idx;
+      bkref_str_off = bkref_str_idx;
+      /* At first, check the last node of sub expressions we already
+	 evaluated.  */
+      for (sub_last_idx = 0; sub_last_idx < sub_top->nlasts; ++sub_last_idx)
+	{
+	  regoff_t sl_str_diff;
+	  sub_last = sub_top->lasts[sub_last_idx];
+	  sl_str_diff = sub_last->str_idx - sl_str;
+	  /* The matched string by the sub expression match with the substring
+	     at the back reference?  */
+	  if (sl_str_diff > 0)
+	    {
+	      if (__glibc_unlikely (bkref_str_off + sl_str_diff
+				    > mctx->input.valid_len))
+		{
+		  /* Not enough chars for a successful match.  */
+		  if (bkref_str_off + sl_str_diff > mctx->input.len)
+		    break;
+
+		  err = clean_state_log_if_needed (mctx,
+						   bkref_str_off
+						   + sl_str_diff);
+		  if (__glibc_unlikely (err != REG_NOERROR))
+		    return err;
+		  buf = (const char *) re_string_get_buffer (&mctx->input);
+		}
+	      if (memcmp (buf + bkref_str_off, buf + sl_str, sl_str_diff) != 0)
+		/* We don't need to search this sub expression any more.  */
+		break;
+	    }
+	  bkref_str_off += sl_str_diff;
+	  sl_str += sl_str_diff;
+	  err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
+				bkref_str_idx);
+
+	  /* Reload buf, since the preceding call might have reallocated
+	     the buffer.  */
+	  buf = (const char *) re_string_get_buffer (&mctx->input);
+
+	  if (err == REG_NOMATCH)
+	    continue;
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+	}
+
+      if (sub_last_idx < sub_top->nlasts)
+	continue;
+      if (sub_last_idx > 0)
+	++sl_str;
+      /* Then, search for the other last nodes of the sub expression.  */
+      for (; sl_str <= bkref_str_idx; ++sl_str)
+	{
+	  Idx cls_node;
+	  regoff_t sl_str_off;
+	  const re_node_set *nodes;
+	  sl_str_off = sl_str - sub_top->str_idx;
+	  /* The matched string by the sub expression match with the substring
+	     at the back reference?  */
+	  if (sl_str_off > 0)
+	    {
+	      if (__glibc_unlikely (bkref_str_off >= mctx->input.valid_len))
+		{
+		  /* If we are at the end of the input, we cannot match.  */
+		  if (bkref_str_off >= mctx->input.len)
+		    break;
+
+		  err = extend_buffers (mctx, bkref_str_off + 1);
+		  if (__glibc_unlikely (err != REG_NOERROR))
+		    return err;
+
+		  buf = (const char *) re_string_get_buffer (&mctx->input);
+		}
+	      if (buf [bkref_str_off++] != buf[sl_str - 1])
+		break; /* We don't need to search this sub expression
+			  any more.  */
+	    }
+	  if (mctx->state_log[sl_str] == NULL)
+	    continue;
+	  /* Does this state have a ')' of the sub expression?  */
+	  nodes = &mctx->state_log[sl_str]->nodes;
+	  cls_node = find_subexp_node (dfa, nodes, subexp_num,
+				       OP_CLOSE_SUBEXP);
+	  if (cls_node == -1)
+	    continue; /* No.  */
+	  if (sub_top->path == NULL)
+	    {
+	      sub_top->path = calloc (sizeof (state_array_t),
+				      sl_str - sub_top->str_idx + 1);
+	      if (sub_top->path == NULL)
+		return REG_ESPACE;
+	    }
+	  /* Can the OP_OPEN_SUBEXP node arrive the OP_CLOSE_SUBEXP node
+	     in the current context?  */
+	  err = check_arrival (mctx, sub_top->path, sub_top->node,
+			       sub_top->str_idx, cls_node, sl_str,
+			       OP_CLOSE_SUBEXP);
+	  if (err == REG_NOMATCH)
+	      continue;
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	      return err;
+	  sub_last = match_ctx_add_sublast (sub_top, cls_node, sl_str);
+	  if (__glibc_unlikely (sub_last == NULL))
+	    return REG_ESPACE;
+	  err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node,
+				bkref_str_idx);
+	  buf = (const char *) re_string_get_buffer (&mctx->input);
+	  if (err == REG_NOMATCH)
+	    continue;
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+	}
+    }
+  return REG_NOERROR;
+}
+
+/* Helper functions for get_subexp().  */
+
+/* Check SUB_LAST can arrive to the back reference BKREF_NODE at BKREF_STR.
+   If it can arrive, register the sub expression expressed with SUB_TOP
+   and SUB_LAST.  */
+
+static reg_errcode_t
+get_subexp_sub (re_match_context_t *mctx, const re_sub_match_top_t *sub_top,
+		re_sub_match_last_t *sub_last, Idx bkref_node, Idx bkref_str)
+{
+  reg_errcode_t err;
+  Idx to_idx;
+  /* Can the subexpression arrive the back reference?  */
+  err = check_arrival (mctx, &sub_last->path, sub_last->node,
+		       sub_last->str_idx, bkref_node, bkref_str,
+		       OP_OPEN_SUBEXP);
+  if (err != REG_NOERROR)
+    return err;
+  err = match_ctx_add_entry (mctx, bkref_node, bkref_str, sub_top->str_idx,
+			     sub_last->str_idx);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    return err;
+  to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx;
+  return clean_state_log_if_needed (mctx, to_idx);
+}
+
+/* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX.
+   Search '(' if FL_OPEN, or search ')' otherwise.
+   TODO: This function isn't efficient...
+	 Because there might be more than one nodes whose types are
+	 OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
+	 nodes.
+	 E.g. RE: (a){2}  */
+
+static Idx
+find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
+		  Idx subexp_idx, int type)
+{
+  Idx cls_idx;
+  for (cls_idx = 0; cls_idx < nodes->nelem; ++cls_idx)
+    {
+      Idx cls_node = nodes->elems[cls_idx];
+      const re_token_t *node = dfa->nodes + cls_node;
+      if (node->type == type
+	  && node->opr.idx == subexp_idx)
+	return cls_node;
+    }
+  return -1;
+}
+
+/* Check whether the node TOP_NODE at TOP_STR can arrive to the node
+   LAST_NODE at LAST_STR.  We record the path onto PATH since it will be
+   heavily reused.
+   Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node,
+	       Idx top_str, Idx last_node, Idx last_str, int type)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  reg_errcode_t err = REG_NOERROR;
+  Idx subexp_num, backup_cur_idx, str_idx, null_cnt;
+  re_dfastate_t *cur_state = NULL;
+  re_node_set *cur_nodes, next_nodes;
+  re_dfastate_t **backup_state_log;
+  unsigned int context;
+
+  subexp_num = dfa->nodes[top_node].opr.idx;
+  /* Extend the buffer if we need.  */
+  if (__glibc_unlikely (path->alloc < last_str + mctx->max_mb_elem_len + 1))
+    {
+      re_dfastate_t **new_array;
+      Idx old_alloc = path->alloc;
+      Idx incr_alloc = last_str + mctx->max_mb_elem_len + 1;
+      Idx new_alloc;
+      if (__glibc_unlikely (IDX_MAX - old_alloc < incr_alloc))
+	return REG_ESPACE;
+      new_alloc = old_alloc + incr_alloc;
+      if (__glibc_unlikely (SIZE_MAX / sizeof (re_dfastate_t *) < new_alloc))
+	return REG_ESPACE;
+      new_array = re_realloc (path->array, re_dfastate_t *, new_alloc);
+      if (__glibc_unlikely (new_array == NULL))
+	return REG_ESPACE;
+      path->array = new_array;
+      path->alloc = new_alloc;
+      memset (new_array + old_alloc, '\0',
+	      sizeof (re_dfastate_t *) * (path->alloc - old_alloc));
+    }
+
+  str_idx = path->next_idx ? path->next_idx : top_str;
+
+  /* Temporary modify MCTX.  */
+  backup_state_log = mctx->state_log;
+  backup_cur_idx = mctx->input.cur_idx;
+  mctx->state_log = path->array;
+  mctx->input.cur_idx = str_idx;
+
+  /* Setup initial node set.  */
+  context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
+  if (str_idx == top_str)
+    {
+      err = re_node_set_init_1 (&next_nodes, top_node);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	return err;
+      err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
+      if (__glibc_unlikely (err != REG_NOERROR))
+	{
+	  re_node_set_free (&next_nodes);
+	  return err;
+	}
+    }
+  else
+    {
+      cur_state = mctx->state_log[str_idx];
+      if (cur_state && cur_state->has_backref)
+	{
+	  err = re_node_set_init_copy (&next_nodes, &cur_state->nodes);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+	}
+      else
+	re_node_set_init_empty (&next_nodes);
+    }
+  if (str_idx == top_str || (cur_state && cur_state->has_backref))
+    {
+      if (next_nodes.nelem)
+	{
+	  err = expand_bkref_cache (mctx, &next_nodes, str_idx,
+				    subexp_num, type);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    {
+	      re_node_set_free (&next_nodes);
+	      return err;
+	    }
+	}
+      cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
+      if (__glibc_unlikely (cur_state == NULL && err != REG_NOERROR))
+	{
+	  re_node_set_free (&next_nodes);
+	  return err;
+	}
+      mctx->state_log[str_idx] = cur_state;
+    }
+
+  for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;)
+    {
+      re_node_set_empty (&next_nodes);
+      if (mctx->state_log[str_idx + 1])
+	{
+	  err = re_node_set_merge (&next_nodes,
+				   &mctx->state_log[str_idx + 1]->nodes);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    {
+	      re_node_set_free (&next_nodes);
+	      return err;
+	    }
+	}
+      if (cur_state)
+	{
+	  err = check_arrival_add_next_nodes (mctx, str_idx,
+					      &cur_state->non_eps_nodes,
+					      &next_nodes);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    {
+	      re_node_set_free (&next_nodes);
+	      return err;
+	    }
+	}
+      ++str_idx;
+      if (next_nodes.nelem)
+	{
+	  err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, type);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    {
+	      re_node_set_free (&next_nodes);
+	      return err;
+	    }
+	  err = expand_bkref_cache (mctx, &next_nodes, str_idx,
+				    subexp_num, type);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    {
+	      re_node_set_free (&next_nodes);
+	      return err;
+	    }
+	}
+      context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags);
+      cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
+      if (__glibc_unlikely (cur_state == NULL && err != REG_NOERROR))
+	{
+	  re_node_set_free (&next_nodes);
+	  return err;
+	}
+      mctx->state_log[str_idx] = cur_state;
+      null_cnt = cur_state == NULL ? null_cnt + 1 : 0;
+    }
+  re_node_set_free (&next_nodes);
+  cur_nodes = (mctx->state_log[last_str] == NULL ? NULL
+	       : &mctx->state_log[last_str]->nodes);
+  path->next_idx = str_idx;
+
+  /* Fix MCTX.  */
+  mctx->state_log = backup_state_log;
+  mctx->input.cur_idx = backup_cur_idx;
+
+  /* Then check the current node set has the node LAST_NODE.  */
+  if (cur_nodes != NULL && re_node_set_contains (cur_nodes, last_node))
+    return REG_NOERROR;
+
+  return REG_NOMATCH;
+}
+
+/* Helper functions for check_arrival.  */
+
+/* Calculate the destination nodes of CUR_NODES at STR_IDX, and append them
+   to NEXT_NODES.
+   TODO: This function is similar to the functions transit_state*(),
+	 however this function has many additional works.
+	 Can't we unify them?  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx,
+			      re_node_set *cur_nodes, re_node_set *next_nodes)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  bool ok;
+  Idx cur_idx;
+#ifdef RE_ENABLE_I18N
+  reg_errcode_t err = REG_NOERROR;
+#endif
+  re_node_set union_set;
+  re_node_set_init_empty (&union_set);
+  for (cur_idx = 0; cur_idx < cur_nodes->nelem; ++cur_idx)
+    {
+      int naccepted = 0;
+      Idx cur_node = cur_nodes->elems[cur_idx];
+#ifdef DEBUG
+      re_token_type_t type = dfa->nodes[cur_node].type;
+      assert (!IS_EPSILON_NODE (type));
+#endif
+#ifdef RE_ENABLE_I18N
+      /* If the node may accept "multi byte".  */
+      if (dfa->nodes[cur_node].accept_mb)
+	{
+	  naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input,
+					       str_idx);
+	  if (naccepted > 1)
+	    {
+	      re_dfastate_t *dest_state;
+	      Idx next_node = dfa->nexts[cur_node];
+	      Idx next_idx = str_idx + naccepted;
+	      dest_state = mctx->state_log[next_idx];
+	      re_node_set_empty (&union_set);
+	      if (dest_state)
+		{
+		  err = re_node_set_merge (&union_set, &dest_state->nodes);
+		  if (__glibc_unlikely (err != REG_NOERROR))
+		    {
+		      re_node_set_free (&union_set);
+		      return err;
+		    }
+		}
+	      ok = re_node_set_insert (&union_set, next_node);
+	      if (__glibc_unlikely (! ok))
+		{
+		  re_node_set_free (&union_set);
+		  return REG_ESPACE;
+		}
+	      mctx->state_log[next_idx] = re_acquire_state (&err, dfa,
+							    &union_set);
+	      if (__glibc_unlikely (mctx->state_log[next_idx] == NULL
+				    && err != REG_NOERROR))
+		{
+		  re_node_set_free (&union_set);
+		  return err;
+		}
+	    }
+	}
+#endif /* RE_ENABLE_I18N */
+      if (naccepted
+	  || check_node_accept (mctx, dfa->nodes + cur_node, str_idx))
+	{
+	  ok = re_node_set_insert (next_nodes, dfa->nexts[cur_node]);
+	  if (__glibc_unlikely (! ok))
+	    {
+	      re_node_set_free (&union_set);
+	      return REG_ESPACE;
+	    }
+	}
+    }
+  re_node_set_free (&union_set);
+  return REG_NOERROR;
+}
+
+/* For all the nodes in CUR_NODES, add the epsilon closures of them to
+   CUR_NODES, however exclude the nodes which are:
+    - inside the sub expression whose number is EX_SUBEXP, if FL_OPEN.
+    - out of the sub expression whose number is EX_SUBEXP, if !FL_OPEN.
+*/
+
+static reg_errcode_t
+check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes,
+			  Idx ex_subexp, int type)
+{
+  reg_errcode_t err;
+  Idx idx, outside_node;
+  re_node_set new_nodes;
+#ifdef DEBUG
+  assert (cur_nodes->nelem);
+#endif
+  err = re_node_set_alloc (&new_nodes, cur_nodes->nelem);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    return err;
+  /* Create a new node set NEW_NODES with the nodes which are epsilon
+     closures of the node in CUR_NODES.  */
+
+  for (idx = 0; idx < cur_nodes->nelem; ++idx)
+    {
+      Idx cur_node = cur_nodes->elems[idx];
+      const re_node_set *eclosure = dfa->eclosures + cur_node;
+      outside_node = find_subexp_node (dfa, eclosure, ex_subexp, type);
+      if (outside_node == -1)
+	{
+	  /* There are no problematic nodes, just merge them.  */
+	  err = re_node_set_merge (&new_nodes, eclosure);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    {
+	      re_node_set_free (&new_nodes);
+	      return err;
+	    }
+	}
+      else
+	{
+	  /* There are problematic nodes, re-calculate incrementally.  */
+	  err = check_arrival_expand_ecl_sub (dfa, &new_nodes, cur_node,
+					      ex_subexp, type);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    {
+	      re_node_set_free (&new_nodes);
+	      return err;
+	    }
+	}
+    }
+  re_node_set_free (cur_nodes);
+  *cur_nodes = new_nodes;
+  return REG_NOERROR;
+}
+
+/* Helper function for check_arrival_expand_ecl.
+   Check incrementally the epsilon closure of TARGET, and if it isn't
+   problematic append it to DST_NODES.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes,
+			      Idx target, Idx ex_subexp, int type)
+{
+  Idx cur_node;
+  for (cur_node = target; !re_node_set_contains (dst_nodes, cur_node);)
+    {
+      bool ok;
+
+      if (dfa->nodes[cur_node].type == type
+	  && dfa->nodes[cur_node].opr.idx == ex_subexp)
+	{
+	  if (type == OP_CLOSE_SUBEXP)
+	    {
+	      ok = re_node_set_insert (dst_nodes, cur_node);
+	      if (__glibc_unlikely (! ok))
+		return REG_ESPACE;
+	    }
+	  break;
+	}
+      ok = re_node_set_insert (dst_nodes, cur_node);
+      if (__glibc_unlikely (! ok))
+	return REG_ESPACE;
+      if (dfa->edests[cur_node].nelem == 0)
+	break;
+      if (dfa->edests[cur_node].nelem == 2)
+	{
+	  reg_errcode_t err;
+	  err = check_arrival_expand_ecl_sub (dfa, dst_nodes,
+					      dfa->edests[cur_node].elems[1],
+					      ex_subexp, type);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    return err;
+	}
+      cur_node = dfa->edests[cur_node].elems[0];
+    }
+  return REG_NOERROR;
+}
+
+
+/* For all the back references in the current state, calculate the
+   destination of the back references by the appropriate entry
+   in MCTX->BKREF_ENTS.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes,
+		    Idx cur_str, Idx subexp_num, int type)
+{
+  const re_dfa_t *const dfa = mctx->dfa;
+  reg_errcode_t err;
+  Idx cache_idx_start = search_cur_bkref_entry (mctx, cur_str);
+  struct re_backref_cache_entry *ent;
+
+  if (cache_idx_start == -1)
+    return REG_NOERROR;
+
+ restart:
+  ent = mctx->bkref_ents + cache_idx_start;
+  do
+    {
+      Idx to_idx, next_node;
+
+      /* Is this entry ENT is appropriate?  */
+      if (!re_node_set_contains (cur_nodes, ent->node))
+	continue; /* No.  */
+
+      to_idx = cur_str + ent->subexp_to - ent->subexp_from;
+      /* Calculate the destination of the back reference, and append it
+	 to MCTX->STATE_LOG.  */
+      if (to_idx == cur_str)
+	{
+	  /* The backreference did epsilon transit, we must re-check all the
+	     node in the current state.  */
+	  re_node_set new_dests;
+	  reg_errcode_t err2, err3;
+	  next_node = dfa->edests[ent->node].elems[0];
+	  if (re_node_set_contains (cur_nodes, next_node))
+	    continue;
+	  err = re_node_set_init_1 (&new_dests, next_node);
+	  err2 = check_arrival_expand_ecl (dfa, &new_dests, subexp_num, type);
+	  err3 = re_node_set_merge (cur_nodes, &new_dests);
+	  re_node_set_free (&new_dests);
+	  if (__glibc_unlikely (err != REG_NOERROR || err2 != REG_NOERROR
+				|| err3 != REG_NOERROR))
+	    {
+	      err = (err != REG_NOERROR ? err
+		     : (err2 != REG_NOERROR ? err2 : err3));
+	      return err;
+	    }
+	  /* TODO: It is still inefficient...  */
+	  goto restart;
+	}
+      else
+	{
+	  re_node_set union_set;
+	  next_node = dfa->nexts[ent->node];
+	  if (mctx->state_log[to_idx])
+	    {
+	      bool ok;
+	      if (re_node_set_contains (&mctx->state_log[to_idx]->nodes,
+					next_node))
+		continue;
+	      err = re_node_set_init_copy (&union_set,
+					   &mctx->state_log[to_idx]->nodes);
+	      ok = re_node_set_insert (&union_set, next_node);
+	      if (__glibc_unlikely (err != REG_NOERROR || ! ok))
+		{
+		  re_node_set_free (&union_set);
+		  err = err != REG_NOERROR ? err : REG_ESPACE;
+		  return err;
+		}
+	    }
+	  else
+	    {
+	      err = re_node_set_init_1 (&union_set, next_node);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		return err;
+	    }
+	  mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set);
+	  re_node_set_free (&union_set);
+	  if (__glibc_unlikely (mctx->state_log[to_idx] == NULL
+				&& err != REG_NOERROR))
+	    return err;
+	}
+    }
+  while (ent++->more);
+  return REG_NOERROR;
+}
+
+/* Build transition table for the state.
+   Return true if successful.  */
+
+static bool
+build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
+{
+  reg_errcode_t err;
+  Idx i, j;
+  int ch;
+  bool need_word_trtable = false;
+  bitset_word_t elem, mask;
+  bool dests_node_malloced = false;
+  bool dest_states_malloced = false;
+  Idx ndests; /* Number of the destination states from 'state'.  */
+  re_dfastate_t **trtable;
+  re_dfastate_t **dest_states = NULL, **dest_states_word, **dest_states_nl;
+  re_node_set follows, *dests_node;
+  bitset_t *dests_ch;
+  bitset_t acceptable;
+
+  struct dests_alloc
+  {
+    re_node_set dests_node[SBC_MAX];
+    bitset_t dests_ch[SBC_MAX];
+  } *dests_alloc;
+
+  /* We build DFA states which corresponds to the destination nodes
+     from 'state'.  'dests_node[i]' represents the nodes which i-th
+     destination state contains, and 'dests_ch[i]' represents the
+     characters which i-th destination state accepts.  */
+  if (__libc_use_alloca (sizeof (struct dests_alloc)))
+    dests_alloc = (struct dests_alloc *) alloca (sizeof (struct dests_alloc));
+  else
+    {
+      dests_alloc = re_malloc (struct dests_alloc, 1);
+      if (__glibc_unlikely (dests_alloc == NULL))
+	return false;
+      dests_node_malloced = true;
+    }
+  dests_node = dests_alloc->dests_node;
+  dests_ch = dests_alloc->dests_ch;
+
+  /* Initialize transition table.  */
+  state->word_trtable = state->trtable = NULL;
+
+  /* At first, group all nodes belonging to 'state' into several
+     destinations.  */
+  ndests = group_nodes_into_DFAstates (dfa, state, dests_node, dests_ch);
+  if (__glibc_unlikely (ndests <= 0))
+    {
+      if (dests_node_malloced)
+	re_free (dests_alloc);
+      /* Return false in case of an error, true otherwise.  */
+      if (ndests == 0)
+	{
+	  state->trtable = (re_dfastate_t **)
+	    calloc (sizeof (re_dfastate_t *), SBC_MAX);
+          if (__glibc_unlikely (state->trtable == NULL))
+            return false;
+	  return true;
+	}
+      return false;
+    }
+
+  err = re_node_set_alloc (&follows, ndests + 1);
+  if (__glibc_unlikely (err != REG_NOERROR))
+    goto out_free;
+
+  /* Avoid arithmetic overflow in size calculation.  */
+  size_t ndests_max
+    = ((SIZE_MAX - (sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX)
+       / (3 * sizeof (re_dfastate_t *)));
+  if (__glibc_unlikely (ndests_max < ndests))
+    goto out_free;
+
+  if (__libc_use_alloca ((sizeof (re_node_set) + sizeof (bitset_t)) * SBC_MAX
+			 + ndests * 3 * sizeof (re_dfastate_t *)))
+    dest_states = (re_dfastate_t **)
+      alloca (ndests * 3 * sizeof (re_dfastate_t *));
+  else
+    {
+      dest_states = re_malloc (re_dfastate_t *, ndests * 3);
+      if (__glibc_unlikely (dest_states == NULL))
+	{
+out_free:
+	  if (dest_states_malloced)
+	    re_free (dest_states);
+	  re_node_set_free (&follows);
+	  for (i = 0; i < ndests; ++i)
+	    re_node_set_free (dests_node + i);
+	  if (dests_node_malloced)
+	    re_free (dests_alloc);
+	  return false;
+	}
+      dest_states_malloced = true;
+    }
+  dest_states_word = dest_states + ndests;
+  dest_states_nl = dest_states_word + ndests;
+  bitset_empty (acceptable);
+
+  /* Then build the states for all destinations.  */
+  for (i = 0; i < ndests; ++i)
+    {
+      Idx next_node;
+      re_node_set_empty (&follows);
+      /* Merge the follows of this destination states.  */
+      for (j = 0; j < dests_node[i].nelem; ++j)
+	{
+	  next_node = dfa->nexts[dests_node[i].elems[j]];
+	  if (next_node != -1)
+	    {
+	      err = re_node_set_merge (&follows, dfa->eclosures + next_node);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		goto out_free;
+	    }
+	}
+      dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0);
+      if (__glibc_unlikely (dest_states[i] == NULL && err != REG_NOERROR))
+	goto out_free;
+      /* If the new state has context constraint,
+	 build appropriate states for these contexts.  */
+      if (dest_states[i]->has_constraint)
+	{
+	  dest_states_word[i] = re_acquire_state_context (&err, dfa, &follows,
+							  CONTEXT_WORD);
+	  if (__glibc_unlikely (dest_states_word[i] == NULL
+				&& err != REG_NOERROR))
+	    goto out_free;
+
+	  if (dest_states[i] != dest_states_word[i] && dfa->mb_cur_max > 1)
+	    need_word_trtable = true;
+
+	  dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows,
+							CONTEXT_NEWLINE);
+	  if (__glibc_unlikely (dest_states_nl[i] == NULL && err != REG_NOERROR))
+	    goto out_free;
+	}
+      else
+	{
+	  dest_states_word[i] = dest_states[i];
+	  dest_states_nl[i] = dest_states[i];
+	}
+      bitset_merge (acceptable, dests_ch[i]);
+    }
+
+  if (!__glibc_unlikely (need_word_trtable))
+    {
+      /* We don't care about whether the following character is a word
+	 character, or we are in a single-byte character set so we can
+	 discern by looking at the character code: allocate a
+	 256-entry transition table.  */
+      trtable = state->trtable =
+	(re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX);
+      if (__glibc_unlikely (trtable == NULL))
+	goto out_free;
+
+      /* For all characters ch...:  */
+      for (i = 0; i < BITSET_WORDS; ++i)
+	for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
+	     elem;
+	     mask <<= 1, elem >>= 1, ++ch)
+	  if (__glibc_unlikely (elem & 1))
+	    {
+	      /* There must be exactly one destination which accepts
+		 character ch.  See group_nodes_into_DFAstates.  */
+	      for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
+		;
+
+	      /* j-th destination accepts the word character ch.  */
+	      if (dfa->word_char[i] & mask)
+		trtable[ch] = dest_states_word[j];
+	      else
+		trtable[ch] = dest_states[j];
+	    }
+    }
+  else
+    {
+      /* We care about whether the following character is a word
+	 character, and we are in a multi-byte character set: discern
+	 by looking at the character code: build two 256-entry
+	 transition tables, one starting at trtable[0] and one
+	 starting at trtable[SBC_MAX].  */
+      trtable = state->word_trtable =
+	(re_dfastate_t **) calloc (sizeof (re_dfastate_t *), 2 * SBC_MAX);
+      if (__glibc_unlikely (trtable == NULL))
+	goto out_free;
+
+      /* For all characters ch...:  */
+      for (i = 0; i < BITSET_WORDS; ++i)
+	for (ch = i * BITSET_WORD_BITS, elem = acceptable[i], mask = 1;
+	     elem;
+	     mask <<= 1, elem >>= 1, ++ch)
+	  if (__glibc_unlikely (elem & 1))
+	    {
+	      /* There must be exactly one destination which accepts
+		 character ch.  See group_nodes_into_DFAstates.  */
+	      for (j = 0; (dests_ch[j][i] & mask) == 0; ++j)
+		;
+
+	      /* j-th destination accepts the word character ch.  */
+	      trtable[ch] = dest_states[j];
+	      trtable[ch + SBC_MAX] = dest_states_word[j];
+	    }
+    }
+
+  /* new line */
+  if (bitset_contain (acceptable, NEWLINE_CHAR))
+    {
+      /* The current state accepts newline character.  */
+      for (j = 0; j < ndests; ++j)
+	if (bitset_contain (dests_ch[j], NEWLINE_CHAR))
+	  {
+	    /* k-th destination accepts newline character.  */
+	    trtable[NEWLINE_CHAR] = dest_states_nl[j];
+	    if (need_word_trtable)
+	      trtable[NEWLINE_CHAR + SBC_MAX] = dest_states_nl[j];
+	    /* There must be only one destination which accepts
+	       newline.  See group_nodes_into_DFAstates.  */
+	    break;
+	  }
+    }
+
+  if (dest_states_malloced)
+    re_free (dest_states);
+
+  re_node_set_free (&follows);
+  for (i = 0; i < ndests; ++i)
+    re_node_set_free (dests_node + i);
+
+  if (dests_node_malloced)
+    re_free (dests_alloc);
+
+  return true;
+}
+
+/* Group all nodes belonging to STATE into several destinations.
+   Then for all destinations, set the nodes belonging to the destination
+   to DESTS_NODE[i] and set the characters accepted by the destination
+   to DEST_CH[i].  This function return the number of destinations.  */
+
+static Idx
+group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
+			    re_node_set *dests_node, bitset_t *dests_ch)
+{
+  reg_errcode_t err;
+  bool ok;
+  Idx i, j, k;
+  Idx ndests; /* Number of the destinations from 'state'.  */
+  bitset_t accepts; /* Characters a node can accept.  */
+  const re_node_set *cur_nodes = &state->nodes;
+  bitset_empty (accepts);
+  ndests = 0;
+
+  /* For all the nodes belonging to 'state',  */
+  for (i = 0; i < cur_nodes->nelem; ++i)
+    {
+      re_token_t *node = &dfa->nodes[cur_nodes->elems[i]];
+      re_token_type_t type = node->type;
+      unsigned int constraint = node->constraint;
+
+      /* Enumerate all single byte character this node can accept.  */
+      if (type == CHARACTER)
+	bitset_set (accepts, node->opr.c);
+      else if (type == SIMPLE_BRACKET)
+	{
+	  bitset_merge (accepts, node->opr.sbcset);
+	}
+      else if (type == OP_PERIOD)
+	{
+#ifdef RE_ENABLE_I18N
+	  if (dfa->mb_cur_max > 1)
+	    bitset_merge (accepts, dfa->sb_char);
+	  else
+#endif
+	    bitset_set_all (accepts);
+	  if (!(dfa->syntax & RE_DOT_NEWLINE))
+	    bitset_clear (accepts, '\n');
+	  if (dfa->syntax & RE_DOT_NOT_NULL)
+	    bitset_clear (accepts, '\0');
+	}
+#ifdef RE_ENABLE_I18N
+      else if (type == OP_UTF8_PERIOD)
+	{
+	  if (ASCII_CHARS % BITSET_WORD_BITS == 0)
+	    memset (accepts, -1, ASCII_CHARS / CHAR_BIT);
+	  else
+	    bitset_merge (accepts, utf8_sb_map);
+	  if (!(dfa->syntax & RE_DOT_NEWLINE))
+	    bitset_clear (accepts, '\n');
+	  if (dfa->syntax & RE_DOT_NOT_NULL)
+	    bitset_clear (accepts, '\0');
+	}
+#endif
+      else
+	continue;
+
+      /* Check the 'accepts' and sift the characters which are not
+	 match it the context.  */
+      if (constraint)
+	{
+	  if (constraint & NEXT_NEWLINE_CONSTRAINT)
+	    {
+	      bool accepts_newline = bitset_contain (accepts, NEWLINE_CHAR);
+	      bitset_empty (accepts);
+	      if (accepts_newline)
+		bitset_set (accepts, NEWLINE_CHAR);
+	      else
+		continue;
+	    }
+	  if (constraint & NEXT_ENDBUF_CONSTRAINT)
+	    {
+	      bitset_empty (accepts);
+	      continue;
+	    }
+
+	  if (constraint & NEXT_WORD_CONSTRAINT)
+	    {
+	      bitset_word_t any_set = 0;
+	      if (type == CHARACTER && !node->word_char)
+		{
+		  bitset_empty (accepts);
+		  continue;
+		}
+#ifdef RE_ENABLE_I18N
+	      if (dfa->mb_cur_max > 1)
+		for (j = 0; j < BITSET_WORDS; ++j)
+		  any_set |= (accepts[j] &= (dfa->word_char[j] | ~dfa->sb_char[j]));
+	      else
+#endif
+		for (j = 0; j < BITSET_WORDS; ++j)
+		  any_set |= (accepts[j] &= dfa->word_char[j]);
+	      if (!any_set)
+		continue;
+	    }
+	  if (constraint & NEXT_NOTWORD_CONSTRAINT)
+	    {
+	      bitset_word_t any_set = 0;
+	      if (type == CHARACTER && node->word_char)
+		{
+		  bitset_empty (accepts);
+		  continue;
+		}
+#ifdef RE_ENABLE_I18N
+	      if (dfa->mb_cur_max > 1)
+		for (j = 0; j < BITSET_WORDS; ++j)
+		  any_set |= (accepts[j] &= ~(dfa->word_char[j] & dfa->sb_char[j]));
+	      else
+#endif
+		for (j = 0; j < BITSET_WORDS; ++j)
+		  any_set |= (accepts[j] &= ~dfa->word_char[j]);
+	      if (!any_set)
+		continue;
+	    }
+	}
+
+      /* Then divide 'accepts' into DFA states, or create a new
+	 state.  Above, we make sure that accepts is not empty.  */
+      for (j = 0; j < ndests; ++j)
+	{
+	  bitset_t intersec; /* Intersection sets, see below.  */
+	  bitset_t remains;
+	  /* Flags, see below.  */
+	  bitset_word_t has_intersec, not_subset, not_consumed;
+
+	  /* Optimization, skip if this state doesn't accept the character.  */
+	  if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c))
+	    continue;
+
+	  /* Enumerate the intersection set of this state and 'accepts'.  */
+	  has_intersec = 0;
+	  for (k = 0; k < BITSET_WORDS; ++k)
+	    has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k];
+	  /* And skip if the intersection set is empty.  */
+	  if (!has_intersec)
+	    continue;
+
+	  /* Then check if this state is a subset of 'accepts'.  */
+	  not_subset = not_consumed = 0;
+	  for (k = 0; k < BITSET_WORDS; ++k)
+	    {
+	      not_subset |= remains[k] = ~accepts[k] & dests_ch[j][k];
+	      not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k];
+	    }
+
+	  /* If this state isn't a subset of 'accepts', create a
+	     new group state, which has the 'remains'. */
+	  if (not_subset)
+	    {
+	      bitset_copy (dests_ch[ndests], remains);
+	      bitset_copy (dests_ch[j], intersec);
+	      err = re_node_set_init_copy (dests_node + ndests, &dests_node[j]);
+	      if (__glibc_unlikely (err != REG_NOERROR))
+		goto error_return;
+	      ++ndests;
+	    }
+
+	  /* Put the position in the current group. */
+	  ok = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]);
+	  if (__glibc_unlikely (! ok))
+	    goto error_return;
+
+	  /* If all characters are consumed, go to next node. */
+	  if (!not_consumed)
+	    break;
+	}
+      /* Some characters remain, create a new group. */
+      if (j == ndests)
+	{
+	  bitset_copy (dests_ch[ndests], accepts);
+	  err = re_node_set_init_1 (dests_node + ndests, cur_nodes->elems[i]);
+	  if (__glibc_unlikely (err != REG_NOERROR))
+	    goto error_return;
+	  ++ndests;
+	  bitset_empty (accepts);
+	}
+    }
+  return ndests;
+ error_return:
+  for (j = 0; j < ndests; ++j)
+    re_node_set_free (dests_node + j);
+  return -1;
+}
+
+#ifdef RE_ENABLE_I18N
+/* Check how many bytes the node 'dfa->nodes[node_idx]' accepts.
+   Return the number of the bytes the node accepts.
+   STR_IDX is the current index of the input string.
+
+   This function handles the nodes which can accept one character, or
+   one collating element like '.', '[a-z]', opposite to the other nodes
+   can only accept one byte.  */
+
+# ifdef _LIBC
+#  include <locale/weight.h>
+# endif
+
+static int
+check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
+			 const re_string_t *input, Idx str_idx)
+{
+  const re_token_t *node = dfa->nodes + node_idx;
+  int char_len, elem_len;
+  Idx i;
+
+  if (__glibc_unlikely (node->type == OP_UTF8_PERIOD))
+    {
+      unsigned char c = re_string_byte_at (input, str_idx), d;
+      if (__glibc_likely (c < 0xc2))
+	return 0;
+
+      if (str_idx + 2 > input->len)
+	return 0;
+
+      d = re_string_byte_at (input, str_idx + 1);
+      if (c < 0xe0)
+	return (d < 0x80 || d > 0xbf) ? 0 : 2;
+      else if (c < 0xf0)
+	{
+	  char_len = 3;
+	  if (c == 0xe0 && d < 0xa0)
+	    return 0;
+	}
+      else if (c < 0xf8)
+	{
+	  char_len = 4;
+	  if (c == 0xf0 && d < 0x90)
+	    return 0;
+	}
+      else if (c < 0xfc)
+	{
+	  char_len = 5;
+	  if (c == 0xf8 && d < 0x88)
+	    return 0;
+	}
+      else if (c < 0xfe)
+	{
+	  char_len = 6;
+	  if (c == 0xfc && d < 0x84)
+	    return 0;
+	}
+      else
+	return 0;
+
+      if (str_idx + char_len > input->len)
+	return 0;
+
+      for (i = 1; i < char_len; ++i)
+	{
+	  d = re_string_byte_at (input, str_idx + i);
+	  if (d < 0x80 || d > 0xbf)
+	    return 0;
+	}
+      return char_len;
+    }
+
+  char_len = re_string_char_size_at (input, str_idx);
+  if (node->type == OP_PERIOD)
+    {
+      if (char_len <= 1)
+	return 0;
+      /* FIXME: I don't think this if is needed, as both '\n'
+	 and '\0' are char_len == 1.  */
+      /* '.' accepts any one character except the following two cases.  */
+      if ((!(dfa->syntax & RE_DOT_NEWLINE)
+	   && re_string_byte_at (input, str_idx) == '\n')
+	  || ((dfa->syntax & RE_DOT_NOT_NULL)
+	      && re_string_byte_at (input, str_idx) == '\0'))
+	return 0;
+      return char_len;
+    }
+
+  elem_len = re_string_elem_size_at (input, str_idx);
+  if ((elem_len <= 1 && char_len <= 1) || char_len == 0)
+    return 0;
+
+  if (node->type == COMPLEX_BRACKET)
+    {
+      const re_charset_t *cset = node->opr.mbcset;
+# ifdef _LIBC
+      const unsigned char *pin
+	= ((const unsigned char *) re_string_get_buffer (input) + str_idx);
+      Idx j;
+      uint32_t nrules;
+# endif /* _LIBC */
+      int match_len = 0;
+      wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars)
+		    ? re_string_wchar_at (input, str_idx) : 0);
+
+      /* match with multibyte character?  */
+      for (i = 0; i < cset->nmbchars; ++i)
+	if (wc == cset->mbchars[i])
+	  {
+	    match_len = char_len;
+	    goto check_node_accept_bytes_match;
+	  }
+      /* match with character_class?  */
+      for (i = 0; i < cset->nchar_classes; ++i)
+	{
+	  wctype_t wt = cset->char_classes[i];
+	  if (__iswctype (wc, wt))
+	    {
+	      match_len = char_len;
+	      goto check_node_accept_bytes_match;
+	    }
+	}
+
+# ifdef _LIBC
+      nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+      if (nrules != 0)
+	{
+	  unsigned int in_collseq = 0;
+	  const int32_t *table, *indirect;
+	  const unsigned char *weights, *extra;
+	  const char *collseqwc;
+
+	  /* match with collating_symbol?  */
+	  if (cset->ncoll_syms)
+	    extra = (const unsigned char *)
+	      _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+	  for (i = 0; i < cset->ncoll_syms; ++i)
+	    {
+	      const unsigned char *coll_sym = extra + cset->coll_syms[i];
+	      /* Compare the length of input collating element and
+		 the length of current collating element.  */
+	      if (*coll_sym != elem_len)
+		continue;
+	      /* Compare each bytes.  */
+	      for (j = 0; j < *coll_sym; j++)
+		if (pin[j] != coll_sym[1 + j])
+		  break;
+	      if (j == *coll_sym)
+		{
+		  /* Match if every bytes is equal.  */
+		  match_len = j;
+		  goto check_node_accept_bytes_match;
+		}
+	    }
+
+	  if (cset->nranges)
+	    {
+	      if (elem_len <= char_len)
+		{
+		  collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+		  in_collseq = __collseq_table_lookup (collseqwc, wc);
+		}
+	      else
+		in_collseq = find_collation_sequence_value (pin, elem_len);
+	    }
+	  /* match with range expression?  */
+	  /* FIXME: Implement rational ranges here, too.  */
+	  for (i = 0; i < cset->nranges; ++i)
+	    if (cset->range_starts[i] <= in_collseq
+		&& in_collseq <= cset->range_ends[i])
+	      {
+		match_len = elem_len;
+		goto check_node_accept_bytes_match;
+	      }
+
+	  /* match with equivalence_class?  */
+	  if (cset->nequiv_classes)
+	    {
+	      const unsigned char *cp = pin;
+	      table = (const int32_t *)
+		_NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+	      weights = (const unsigned char *)
+		_NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
+	      extra = (const unsigned char *)
+		_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+	      indirect = (const int32_t *)
+		_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+	      int32_t idx = findidx (table, indirect, extra, &cp, elem_len);
+	      int32_t rule = idx >> 24;
+	      idx &= 0xffffff;
+	      if (idx > 0)
+		{
+		  size_t weight_len = weights[idx];
+		  for (i = 0; i < cset->nequiv_classes; ++i)
+		    {
+		      int32_t equiv_class_idx = cset->equiv_classes[i];
+		      int32_t equiv_class_rule = equiv_class_idx >> 24;
+		      equiv_class_idx &= 0xffffff;
+		      if (weights[equiv_class_idx] == weight_len
+			  && equiv_class_rule == rule
+			  && memcmp (weights + idx + 1,
+				     weights + equiv_class_idx + 1,
+				     weight_len) == 0)
+			{
+			  match_len = elem_len;
+			  goto check_node_accept_bytes_match;
+			}
+		    }
+		}
+	    }
+	}
+      else
+# endif /* _LIBC */
+	{
+	  /* match with range expression?  */
+	  for (i = 0; i < cset->nranges; ++i)
+	    {
+	      if (cset->range_starts[i] <= wc && wc <= cset->range_ends[i])
+		{
+		  match_len = char_len;
+		  goto check_node_accept_bytes_match;
+		}
+	    }
+	}
+    check_node_accept_bytes_match:
+      if (!cset->non_match)
+	return match_len;
+      else
+	{
+	  if (match_len > 0)
+	    return 0;
+	  else
+	    return (elem_len > char_len) ? elem_len : char_len;
+	}
+    }
+  return 0;
+}
+
+# ifdef _LIBC
+static unsigned int
+find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len)
+{
+  uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+  if (nrules == 0)
+    {
+      if (mbs_len == 1)
+	{
+	  /* No valid character.  Match it as a single byte character.  */
+	  const unsigned char *collseq = (const unsigned char *)
+	    _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+	  return collseq[mbs[0]];
+	}
+      return UINT_MAX;
+    }
+  else
+    {
+      int32_t idx;
+      const unsigned char *extra = (const unsigned char *)
+	_NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+      int32_t extrasize = (const unsigned char *)
+	_NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB + 1) - extra;
+
+      for (idx = 0; idx < extrasize;)
+	{
+	  int mbs_cnt;
+	  bool found = false;
+	  int32_t elem_mbs_len;
+	  /* Skip the name of collating element name.  */
+	  idx = idx + extra[idx] + 1;
+	  elem_mbs_len = extra[idx++];
+	  if (mbs_len == elem_mbs_len)
+	    {
+	      for (mbs_cnt = 0; mbs_cnt < elem_mbs_len; ++mbs_cnt)
+		if (extra[idx + mbs_cnt] != mbs[mbs_cnt])
+		  break;
+	      if (mbs_cnt == elem_mbs_len)
+		/* Found the entry.  */
+		found = true;
+	    }
+	  /* Skip the byte sequence of the collating element.  */
+	  idx += elem_mbs_len;
+	  /* Adjust for the alignment.  */
+	  idx = (idx + 3) & ~3;
+	  /* Skip the collation sequence value.  */
+	  idx += sizeof (uint32_t);
+	  /* Skip the wide char sequence of the collating element.  */
+	  idx = idx + sizeof (uint32_t) * (*(int32_t *) (extra + idx) + 1);
+	  /* If we found the entry, return the sequence value.  */
+	  if (found)
+	    return *(uint32_t *) (extra + idx);
+	  /* Skip the collation sequence value.  */
+	  idx += sizeof (uint32_t);
+	}
+      return UINT_MAX;
+    }
+}
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+
+/* Check whether the node accepts the byte which is IDX-th
+   byte of the INPUT.  */
+
+static bool
+check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
+		   Idx idx)
+{
+  unsigned char ch;
+  ch = re_string_byte_at (&mctx->input, idx);
+  switch (node->type)
+    {
+    case CHARACTER:
+      if (node->opr.c != ch)
+        return false;
+      break;
+
+    case SIMPLE_BRACKET:
+      if (!bitset_contain (node->opr.sbcset, ch))
+        return false;
+      break;
+
+#ifdef RE_ENABLE_I18N
+    case OP_UTF8_PERIOD:
+      if (ch >= ASCII_CHARS)
+        return false;
+      FALLTHROUGH;
+#endif
+    case OP_PERIOD:
+      if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE))
+	  || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL)))
+	return false;
+      break;
+
+    default:
+      return false;
+    }
+
+  if (node->constraint)
+    {
+      /* The node has constraints.  Check whether the current context
+	 satisfies the constraints.  */
+      unsigned int context = re_string_context_at (&mctx->input, idx,
+						   mctx->eflags);
+      if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+	return false;
+    }
+
+  return true;
+}
+
+/* Extend the buffers, if the buffers have run out.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+extend_buffers (re_match_context_t *mctx, int min_len)
+{
+  reg_errcode_t ret;
+  re_string_t *pstr = &mctx->input;
+
+  /* Avoid overflow.  */
+  if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *)) / 2
+			<= pstr->bufs_len))
+    return REG_ESPACE;
+
+  /* Double the lengths of the buffers, but allocate at least MIN_LEN.  */
+  ret = re_string_realloc_buffers (pstr,
+				   MAX (min_len,
+					MIN (pstr->len, pstr->bufs_len * 2)));
+  if (__glibc_unlikely (ret != REG_NOERROR))
+    return ret;
+
+  if (mctx->state_log != NULL)
+    {
+      /* And double the length of state_log.  */
+      /* XXX We have no indication of the size of this buffer.  If this
+	 allocation fail we have no indication that the state_log array
+	 does not have the right size.  */
+      re_dfastate_t **new_array = re_realloc (mctx->state_log, re_dfastate_t *,
+					      pstr->bufs_len + 1);
+      if (__glibc_unlikely (new_array == NULL))
+	return REG_ESPACE;
+      mctx->state_log = new_array;
+    }
+
+  /* Then reconstruct the buffers.  */
+  if (pstr->icase)
+    {
+#ifdef RE_ENABLE_I18N
+      if (pstr->mb_cur_max > 1)
+	{
+	  ret = build_wcs_upper_buffer (pstr);
+	  if (__glibc_unlikely (ret != REG_NOERROR))
+	    return ret;
+	}
+      else
+#endif /* RE_ENABLE_I18N  */
+	build_upper_buffer (pstr);
+    }
+  else
+    {
+#ifdef RE_ENABLE_I18N
+      if (pstr->mb_cur_max > 1)
+	build_wcs_buffer (pstr);
+      else
+#endif /* RE_ENABLE_I18N  */
+	{
+	  if (pstr->trans != NULL)
+	    re_string_translate_buffer (pstr);
+	}
+    }
+  return REG_NOERROR;
+}
+
+
+/* Functions for matching context.  */
+
+/* Initialize MCTX.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+match_ctx_init (re_match_context_t *mctx, int eflags, Idx n)
+{
+  mctx->eflags = eflags;
+  mctx->match_last = -1;
+  if (n > 0)
+    {
+      /* Avoid overflow.  */
+      size_t max_object_size =
+	MAX (sizeof (struct re_backref_cache_entry),
+	     sizeof (re_sub_match_top_t *));
+      if (__glibc_unlikely (MIN (IDX_MAX, SIZE_MAX / max_object_size) < n))
+	return REG_ESPACE;
+
+      mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n);
+      mctx->sub_tops = re_malloc (re_sub_match_top_t *, n);
+      if (__glibc_unlikely (mctx->bkref_ents == NULL || mctx->sub_tops == NULL))
+	return REG_ESPACE;
+    }
+  /* Already zero-ed by the caller.
+     else
+       mctx->bkref_ents = NULL;
+     mctx->nbkref_ents = 0;
+     mctx->nsub_tops = 0;  */
+  mctx->abkref_ents = n;
+  mctx->max_mb_elem_len = 1;
+  mctx->asub_tops = n;
+  return REG_NOERROR;
+}
+
+/* Clean the entries which depend on the current input in MCTX.
+   This function must be invoked when the matcher changes the start index
+   of the input, or changes the input string.  */
+
+static void
+match_ctx_clean (re_match_context_t *mctx)
+{
+  Idx st_idx;
+  for (st_idx = 0; st_idx < mctx->nsub_tops; ++st_idx)
+    {
+      Idx sl_idx;
+      re_sub_match_top_t *top = mctx->sub_tops[st_idx];
+      for (sl_idx = 0; sl_idx < top->nlasts; ++sl_idx)
+	{
+	  re_sub_match_last_t *last = top->lasts[sl_idx];
+	  re_free (last->path.array);
+	  re_free (last);
+	}
+      re_free (top->lasts);
+      if (top->path)
+	{
+	  re_free (top->path->array);
+	  re_free (top->path);
+	}
+      re_free (top);
+    }
+
+  mctx->nsub_tops = 0;
+  mctx->nbkref_ents = 0;
+}
+
+/* Free all the memory associated with MCTX.  */
+
+static void
+match_ctx_free (re_match_context_t *mctx)
+{
+  /* First, free all the memory associated with MCTX->SUB_TOPS.  */
+  match_ctx_clean (mctx);
+  re_free (mctx->sub_tops);
+  re_free (mctx->bkref_ents);
+}
+
+/* Add a new backreference entry to MCTX.
+   Note that we assume that caller never call this function with duplicate
+   entry, and call with STR_IDX which isn't smaller than any existing entry.
+*/
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from,
+		     Idx to)
+{
+  if (mctx->nbkref_ents >= mctx->abkref_ents)
+    {
+      struct re_backref_cache_entry* new_entry;
+      new_entry = re_realloc (mctx->bkref_ents, struct re_backref_cache_entry,
+			      mctx->abkref_ents * 2);
+      if (__glibc_unlikely (new_entry == NULL))
+	{
+	  re_free (mctx->bkref_ents);
+	  return REG_ESPACE;
+	}
+      mctx->bkref_ents = new_entry;
+      memset (mctx->bkref_ents + mctx->nbkref_ents, '\0',
+	      sizeof (struct re_backref_cache_entry) * mctx->abkref_ents);
+      mctx->abkref_ents *= 2;
+    }
+  if (mctx->nbkref_ents > 0
+      && mctx->bkref_ents[mctx->nbkref_ents - 1].str_idx == str_idx)
+    mctx->bkref_ents[mctx->nbkref_ents - 1].more = 1;
+
+  mctx->bkref_ents[mctx->nbkref_ents].node = node;
+  mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx;
+  mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from;
+  mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to;
+
+  /* This is a cache that saves negative results of check_dst_limits_calc_pos.
+     If bit N is clear, means that this entry won't epsilon-transition to
+     an OP_OPEN_SUBEXP or OP_CLOSE_SUBEXP for the N+1-th subexpression.  If
+     it is set, check_dst_limits_calc_pos_1 will recurse and try to find one
+     such node.
+
+     A backreference does not epsilon-transition unless it is empty, so set
+     to all zeros if FROM != TO.  */
+  mctx->bkref_ents[mctx->nbkref_ents].eps_reachable_subexps_map
+    = (from == to ? -1 : 0);
+
+  mctx->bkref_ents[mctx->nbkref_ents++].more = 0;
+  if (mctx->max_mb_elem_len < to - from)
+    mctx->max_mb_elem_len = to - from;
+  return REG_NOERROR;
+}
+
+/* Return the first entry with the same str_idx, or -1 if none is
+   found.  Note that MCTX->BKREF_ENTS is already sorted by MCTX->STR_IDX.  */
+
+static Idx
+search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx)
+{
+  Idx left, right, mid, last;
+  last = right = mctx->nbkref_ents;
+  for (left = 0; left < right;)
+    {
+      mid = (left + right) / 2;
+      if (mctx->bkref_ents[mid].str_idx < str_idx)
+	left = mid + 1;
+      else
+	right = mid;
+    }
+  if (left < last && mctx->bkref_ents[left].str_idx == str_idx)
+    return left;
+  else
+    return -1;
+}
+
+/* Register the node NODE, whose type is OP_OPEN_SUBEXP, and which matches
+   at STR_IDX.  */
+
+static reg_errcode_t
+__attribute_warn_unused_result__
+match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx)
+{
+#ifdef DEBUG
+  assert (mctx->sub_tops != NULL);
+  assert (mctx->asub_tops > 0);
+#endif
+  if (__glibc_unlikely (mctx->nsub_tops == mctx->asub_tops))
+    {
+      Idx new_asub_tops = mctx->asub_tops * 2;
+      re_sub_match_top_t **new_array = re_realloc (mctx->sub_tops,
+						   re_sub_match_top_t *,
+						   new_asub_tops);
+      if (__glibc_unlikely (new_array == NULL))
+	return REG_ESPACE;
+      mctx->sub_tops = new_array;
+      mctx->asub_tops = new_asub_tops;
+    }
+  mctx->sub_tops[mctx->nsub_tops] = calloc (1, sizeof (re_sub_match_top_t));
+  if (__glibc_unlikely (mctx->sub_tops[mctx->nsub_tops] == NULL))
+    return REG_ESPACE;
+  mctx->sub_tops[mctx->nsub_tops]->node = node;
+  mctx->sub_tops[mctx->nsub_tops++]->str_idx = str_idx;
+  return REG_NOERROR;
+}
+
+/* Register the node NODE, whose type is OP_CLOSE_SUBEXP, and which matches
+   at STR_IDX, whose corresponding OP_OPEN_SUBEXP is SUB_TOP.  */
+
+static re_sub_match_last_t *
+match_ctx_add_sublast (re_sub_match_top_t *subtop, Idx node, Idx str_idx)
+{
+  re_sub_match_last_t *new_entry;
+  if (__glibc_unlikely (subtop->nlasts == subtop->alasts))
+    {
+      Idx new_alasts = 2 * subtop->alasts + 1;
+      re_sub_match_last_t **new_array = re_realloc (subtop->lasts,
+						    re_sub_match_last_t *,
+						    new_alasts);
+      if (__glibc_unlikely (new_array == NULL))
+	return NULL;
+      subtop->lasts = new_array;
+      subtop->alasts = new_alasts;
+    }
+  new_entry = calloc (1, sizeof (re_sub_match_last_t));
+  if (__glibc_likely (new_entry != NULL))
+    {
+      subtop->lasts[subtop->nlasts] = new_entry;
+      new_entry->node = node;
+      new_entry->str_idx = str_idx;
+      ++subtop->nlasts;
+    }
+  return new_entry;
+}
+
+static void
+sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
+	       re_dfastate_t **limited_sts, Idx last_node, Idx last_str_idx)
+{
+  sctx->sifted_states = sifted_sts;
+  sctx->limited_states = limited_sts;
+  sctx->last_node = last_node;
+  sctx->last_str_idx = last_str_idx;
+  re_node_set_init_empty (&sctx->limits);
+}
diff --git a/gawk-5.0.1/support/verify.h b/gawk-5.0.1/support/verify.h
new file mode 100644
index 00000000000..f8e4eff026d
--- /dev/null
+++ b/gawk-5.0.1/support/verify.h
@@ -0,0 +1,285 @@
+/* Compile-time assert-like macros.
+
+   Copyright (C) 2005-2006, 2009-2019 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Paul Eggert, Bruno Haible, and Jim Meyering.  */
+
+#ifndef _GL_VERIFY_H
+#define _GL_VERIFY_H
+
+
+/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert (R, DIAGNOSTIC)
+   works as per C11.  This is supported by GCC 4.6.0 and later, in C
+   mode.
+
+   Define _GL_HAVE__STATIC_ASSERT1 to 1 if _Static_assert (R) works as
+   per C2X, and define _GL_HAVE_STATIC_ASSERT1 if static_assert (R)
+   works as per C++17.  This is supported by GCC 9.1 and later.
+
+   Support compilers claiming conformance to the relevant standard,
+   and also support GCC when not pedantic.  If we were willing to slow
+   'configure' down we could also use it with other compilers, but
+   since this affects only the quality of diagnostics, why bother?  */
+#ifndef __cplusplus
+# if (201112L <= __STDC_VERSION__ \
+      || (!defined __STRICT_ANSI__ && 4 < __GNUC__ + (6 <= __GNUC_MINOR__)))
+#  define _GL_HAVE__STATIC_ASSERT 1
+# endif
+# if (202000L <= __STDC_VERSION__ \
+      || (!defined __STRICT_ANSI__ && 9 <= __GNUC__))
+#  define _GL_HAVE__STATIC_ASSERT1 1
+# endif
+#else
+# if 201703L <= __cplusplus || 9 <= __GNUC__
+#  define _GL_HAVE_STATIC_ASSERT1 1
+# endif
+#endif
+
+/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
+   system headers, defines a conflicting _Static_assert that is no
+   better than ours; override it.  */
+#ifndef _GL_HAVE__STATIC_ASSERT
+# include <stddef.h>
+# undef _Static_assert
+#endif
+
+/* Each of these macros verifies that its argument R is nonzero.  To
+   be portable, R should be an integer constant expression.  Unlike
+   assert (R), there is no run-time overhead.
+
+   If _Static_assert works, verify (R) uses it directly.  Similarly,
+   _GL_VERIFY_TRUE works by packaging a _Static_assert inside a struct
+   that is an operand of sizeof.
+
+   The code below uses several ideas for C++ compilers, and for C
+   compilers that do not support _Static_assert:
+
+   * The first step is ((R) ? 1 : -1).  Given an expression R, of
+     integral or boolean or floating-point type, this yields an
+     expression of integral type, whose value is later verified to be
+     constant and nonnegative.
+
+   * Next this expression W is wrapped in a type
+     struct _gl_verify_type {
+       unsigned int _gl_verify_error_if_negative: W;
+     }.
+     If W is negative, this yields a compile-time error.  No compiler can
+     deal with a bit-field of negative size.
+
+     One might think that an array size check would have the same
+     effect, that is, that the type struct { unsigned int dummy[W]; }
+     would work as well.  However, inside a function, some compilers
+     (such as C++ compilers and GNU C) allow local parameters and
+     variables inside array size expressions.  With these compilers,
+     an array size check would not properly diagnose this misuse of
+     the verify macro:
+
+       void function (int n) { verify (n < 0); }
+
+   * For the verify macro, the struct _gl_verify_type will need to
+     somehow be embedded into a declaration.  To be portable, this
+     declaration must declare an object, a constant, a function, or a
+     typedef name.  If the declared entity uses the type directly,
+     such as in
+
+       struct dummy {...};
+       typedef struct {...} dummy;
+       extern struct {...} *dummy;
+       extern void dummy (struct {...} *);
+       extern struct {...} *dummy (void);
+
+     two uses of the verify macro would yield colliding declarations
+     if the entity names are not disambiguated.  A workaround is to
+     attach the current line number to the entity name:
+
+       #define _GL_CONCAT0(x, y) x##y
+       #define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+       extern struct {...} * _GL_CONCAT (dummy, __LINE__);
+
+     But this has the problem that two invocations of verify from
+     within the same macro would collide, since the __LINE__ value
+     would be the same for both invocations.  (The GCC __COUNTER__
+     macro solves this problem, but is not portable.)
+
+     A solution is to use the sizeof operator.  It yields a number,
+     getting rid of the identity of the type.  Declarations like
+
+       extern int dummy [sizeof (struct {...})];
+       extern void dummy (int [sizeof (struct {...})]);
+       extern int (*dummy (void)) [sizeof (struct {...})];
+
+     can be repeated.
+
+   * Should the implementation use a named struct or an unnamed struct?
+     Which of the following alternatives can be used?
+
+       extern int dummy [sizeof (struct {...})];
+       extern int dummy [sizeof (struct _gl_verify_type {...})];
+       extern void dummy (int [sizeof (struct {...})]);
+       extern void dummy (int [sizeof (struct _gl_verify_type {...})]);
+       extern int (*dummy (void)) [sizeof (struct {...})];
+       extern int (*dummy (void)) [sizeof (struct _gl_verify_type {...})];
+
+     In the second and sixth case, the struct type is exported to the
+     outer scope; two such declarations therefore collide.  GCC warns
+     about the first, third, and fourth cases.  So the only remaining
+     possibility is the fifth case:
+
+       extern int (*dummy (void)) [sizeof (struct {...})];
+
+   * GCC warns about duplicate declarations of the dummy function if
+     -Wredundant-decls is used.  GCC 4.3 and later have a builtin
+     __COUNTER__ macro that can let us generate unique identifiers for
+     each dummy function, to suppress this warning.
+
+   * This implementation exploits the fact that older versions of GCC,
+     which do not support _Static_assert, also do not warn about the
+     last declaration mentioned above.
+
+   * GCC warns if -Wnested-externs is enabled and 'verify' is used
+     within a function body; but inside a function, you can always
+     arrange to use verify_expr instead.
+
+   * In C++, any struct definition inside sizeof is invalid.
+     Use a template type to work around the problem.  */
+
+/* Concatenate two preprocessor tokens.  */
+#define _GL_CONCAT(x, y) _GL_CONCAT0 (x, y)
+#define _GL_CONCAT0(x, y) x##y
+
+/* _GL_COUNTER is an integer, preferably one that changes each time we
+   use it.  Use __COUNTER__ if it works, falling back on __LINE__
+   otherwise.  __LINE__ isn't perfect, but it's better than a
+   constant.  */
+#if defined __COUNTER__ && __COUNTER__ != __COUNTER__
+# define _GL_COUNTER __COUNTER__
+#else
+# define _GL_COUNTER __LINE__
+#endif
+
+/* Generate a symbol with the given prefix, making it unique if
+   possible.  */
+#define _GL_GENSYM(prefix) _GL_CONCAT (prefix, _GL_COUNTER)
+
+/* Verify requirement R at compile-time, as an integer constant expression
+   that returns 1.  If R is false, fail at compile-time.  */
+
+#define _GL_VERIFY_TRUE(R) (!!sizeof (_GL_VERIFY_TYPE (R)))
+
+#ifdef __cplusplus
+# if !GNULIB_defined_struct__gl_verify_type
+template <int w>
+  struct _gl_verify_type {
+    unsigned int _gl_verify_error_if_negative: w;
+  };
+#  define GNULIB_defined_struct__gl_verify_type 1
+# endif
+# define _GL_VERIFY_TYPE(R) _gl_verify_type<(R) ? 1 : -1>
+#elif defined _GL_HAVE__STATIC_ASSERT1
+# define _GL_VERIFY_TYPE(R) \
+    struct {                                   \
+      _Static_assert (R); \
+      int _gl_dummy;                          \
+    }
+#else
+# define _GL_VERIFY_TYPE(R)                                             \
+    struct { unsigned int _gl_verify_error_if_negative: (R) ? 1 : -1; }
+#endif
+
+/* Verify requirement R at compile-time, as a declaration without a
+   trailing ';'.  If R is false, fail at compile-time.
+
+   This macro requires three or more arguments but uses at most the first
+   two, so that the _Static_assert macro optionally defined below supports
+   both the C11 two-argument syntax and the C2X one-argument syntax.
+
+   Unfortunately, unlike C11, this implementation must appear as an
+   ordinary declaration, and cannot appear inside struct { ... }.  */
+
+#if defined _GL_HAVE__STATIC_ASSERT
+# define _GL_VERIFY(R, DIAGNOSTIC, ...) _Static_assert (R, DIAGNOSTIC)
+#else
+# define _GL_VERIFY(R, DIAGNOSTIC, ...)                                \
+    extern int (*_GL_GENSYM (_gl_verify_function) (void))	       \
+      [_GL_VERIFY_TRUE (R)]
+#endif
+
+/* _GL_STATIC_ASSERT_H is defined if this code is copied into assert.h.  */
+#ifdef _GL_STATIC_ASSERT_H
+# if !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert
+#  define _Static_assert(...) \
+     _GL_VERIFY (__VA_ARGS__, "static assertion failed", -)
+# endif
+# if !defined _GL_HAVE_STATIC_ASSERT1 && !defined static_assert
+#  define static_assert _Static_assert /* C11 requires this #define.  */
+# endif
+#endif
+
+/* @assert.h omit start@  */
+
+/* Each of these macros verifies that its argument R is nonzero.  To
+   be portable, R should be an integer constant expression.  Unlike
+   assert (R), there is no run-time overhead.
+
+   There are two macros, since no single macro can be used in all
+   contexts in C.  verify_expr (R, E) is for scalar contexts, including
+   integer constant expression contexts.  verify (R) is for declaration
+   contexts, e.g., the top level.  */
+
+/* Verify requirement R at compile-time.  Return the value of the
+   expression E.  */
+
+#define verify_expr(R, E) (_GL_VERIFY_TRUE (R) ? (E) : (E))
+
+/* Verify requirement R at compile-time, as a declaration without a
+   trailing ';'.  verify (R) acts like static_assert (R) except that
+   it is portable to C11/C++14 and earlier, and its name is shorter
+   and may be more convenient.  */
+
+#ifdef _GL_HAVE__STATIC_ASSERT1
+# define verify(R) _Static_assert (R)
+#else
+# define verify(R) _GL_VERIFY (R, "verify (...)", -)
+#endif
+
+#ifndef __has_builtin
+# define __has_builtin(x) 0
+#endif
+
+/* Assume that R always holds.  This lets the compiler optimize
+   accordingly.  R should not have side-effects; it may or may not be
+   evaluated.  Behavior is undefined if R is false.  */
+
+#if (__has_builtin (__builtin_unreachable) \
+     || 4 < __GNUC__ + (5 <= __GNUC_MINOR__))
+# define assume(R) ((R) ? (void) 0 : __builtin_unreachable ())
+#elif 1200 <= _MSC_VER
+# define assume(R) __assume (R)
+#elif ((defined GCC_LINT || defined lint) \
+       && (__has_builtin (__builtin_trap) \
+           || 3 < __GNUC__ + (3 < __GNUC_MINOR__ + (4 <= __GNUC_PATCHLEVEL__))))
+  /* Doing it this way helps various packages when configured with
+     --enable-gcc-warnings, which compiles with -Dlint.  It's nicer
+     when 'assume' silences warnings even with older GCCs.  */
+# define assume(R) ((R) ? (void) 0 : __builtin_trap ())
+#else
+  /* Some tools grok NOTREACHED, e.g., Oracle Studio 12.6.  */
+# define assume(R) ((R) ? (void) 0 : /*NOTREACHED*/ (void) 0)
+#endif
+
+/* @assert.h omit end@  */
+
+#endif
diff --git a/gawk-5.0.1/support/xalloc.h b/gawk-5.0.1/support/xalloc.h
new file mode 100644
index 00000000000..722c3872c3f
--- /dev/null
+++ b/gawk-5.0.1/support/xalloc.h
@@ -0,0 +1,375 @@
+/* xalloc.h -- malloc with out-of-memory checking
+
+   Copyright (C) 1990-2000, 2003-2004, 2006-2019 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+#ifndef XALLOC_H_
+# define XALLOC_H_
+
+# include <stddef.h>
+
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+
+# ifndef __attribute__
+#  if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+#   define __attribute__(arg)
+#  endif
+# endif
+
+# ifndef ATTRIBUTE_NORETURN
+#  define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
+# endif
+
+# ifndef ATTRIBUTE_MALLOC
+#  if __GNUC__ >= 3
+#   define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+#  else
+#   define ATTRIBUTE_MALLOC
+#  endif
+# endif
+
+/* This function is always triggered when memory is exhausted.
+   It must be defined by the application, either explicitly
+   or by using gnulib's xalloc-die module.  This is the
+   function to call when one wants the program to die because of a
+   memory allocation failure.  */
+extern void xalloc_die (void) ATTRIBUTE_NORETURN;
+
+void *xmalloc (size_t s) ATTRIBUTE_MALLOC;
+void *xzalloc (size_t s) ATTRIBUTE_MALLOC;
+void *xcalloc (size_t n, size_t s) ATTRIBUTE_MALLOC;
+void *xrealloc (void *p, size_t s);
+void *x2realloc (void *p, size_t *pn);
+void *xmemdup (void const *p, size_t s) ATTRIBUTE_MALLOC;
+char *xstrdup (char const *str) ATTRIBUTE_MALLOC;
+
+/* Return 1 if an array of N objects, each of size S, cannot exist due
+   to size arithmetic overflow.  S must be positive and N must be
+   nonnegative.  This is a macro, not an inline function, so that it
+   works correctly even when SIZE_MAX < N.
+
+   By gnulib convention, SIZE_MAX represents overflow in size
+   calculations, so the conservative dividend to use here is
+   SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value.
+   However, malloc (SIZE_MAX) fails on all known hosts where
+   sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for
+   exactly-SIZE_MAX allocations on such hosts; this avoids a test and
+   branch when S is known to be 1.  */
+# define xalloc_oversized(n, s) \
+    ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n))
+
+
+/* In the following macros, T must be an elementary or structure/union or
+   typedef'ed type, or a pointer to such a type.  To apply one of the
+   following macros to a function pointer or array type, you need to typedef
+   it first and use the typedef name.  */
+
+/* Allocate an object of type T dynamically, with error checking.  */
+/* extern t *XMALLOC (typename t); */
+# define XMALLOC(t) ((t *) xmalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking.  */
+/* extern t *XNMALLOC (size_t n, typename t); */
+# define XNMALLOC(n, t) \
+    ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t))))
+
+/* Allocate an object of type T dynamically, with error checking,
+   and zero it.  */
+/* extern t *XZALLOC (typename t); */
+# define XZALLOC(t) ((t *) xzalloc (sizeof (t)))
+
+/* Allocate memory for N elements of type T, with error checking,
+   and zero it.  */
+/* extern t *XCALLOC (size_t n, typename t); */
+# define XCALLOC(n, t) \
+    ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t))))
+
+/*
+ * Gawk uses this file only to keep dfa.c happy.
+ * We're therefore safe in manually defining HAVE_INLINE to
+ * make the !@#$%^&*() thing just work.
+ */
+#ifdef GAWK
+#define HAVE_INLINE	1	/* so there. nyah, nyah, nyah. */
+#endif
+
+# if HAVE_INLINE
+#  define static_inline static inline
+# else
+void *xnmalloc (size_t n, size_t s) ATTRIBUTE_MALLOC;
+void *xnrealloc (void *p, size_t n, size_t s);
+void *x2nrealloc (void *p, size_t *pn, size_t s);
+char *xcharalloc (size_t n) ATTRIBUTE_MALLOC;
+# endif
+
+# ifdef static_inline
+
+/* Allocate an array of N objects, each with S bytes of memory,
+   dynamically, with error checking.  S must be nonzero.  */
+
+static_inline void *xnmalloc (size_t n, size_t s) ATTRIBUTE_MALLOC;
+static_inline void *
+xnmalloc (size_t n, size_t s)
+{
+  if (xalloc_oversized (n, s))
+    xalloc_die ();
+  return xmalloc (n * s);
+}
+
+#ifdef GAWK
+#include <errno.h>
+extern void r_fatal(const char *msg, ...) ATTRIBUTE_NORETURN ;
+
+void *
+xmalloc(size_t bytes)
+{
+  void *p;
+  if (bytes == 0)
+    bytes = 1;	/* avoid dfa.c mishegos */
+  if ((p = malloc(bytes)) == NULL)
+    xalloc_die ();
+  return p;
+}
+
+/* Allocate an array of N objects, each with S bytes of memory,
+   dynamically, with error checking.  S must be nonzero.
+   Clear the contents afterwards.  */
+
+void *
+xcalloc(size_t nmemb, size_t size)
+{
+  void *p;
+
+  if (nmemb == 0 || size == 0)
+    nmemb = size = 1; 	/* avoid dfa.c mishegos */
+  if ((p = calloc(nmemb, size)) == NULL)
+    xalloc_die ();
+  return p;
+}
+
+/* Reallocate a pointer to a new size, with error checking. */
+
+void *
+xrealloc(void *p, size_t size)
+{
+   void *new_p = realloc(p, size);
+   if (new_p ==  0)
+     xalloc_die ();
+
+   return new_p;
+}
+
+/* xalloc_die --- fatal error message when malloc fails, needed by dfa.c */
+
+void
+xalloc_die (void)
+{
+	r_fatal(_("xalloc: malloc failed: %s"), strerror(errno));
+}
+
+/* Clone an object P of size S, with error checking.  There's no need
+   for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any
+   need for an arithmetic overflow check.  */
+
+void *
+xmemdup (void const *p, size_t s)
+{
+  return memcpy (xmalloc (s), p, s);
+}
+
+/* xstrdup --- strdup and die if fails */
+char *xstrdup(const char *s)
+{
+	char *p;
+	int l;
+
+	if (s == NULL)
+		r_fatal(_("xstrdup: null parameter"));
+
+	l = strlen(s);
+	p = xmemdup(s, l + 1);
+	p[l] = '\0';
+
+	return p;
+}
+#endif
+
+/* Change the size of an allocated block of memory P to an array of N
+   objects each of S bytes, with error checking.  S must be nonzero.  */
+
+static_inline void *
+xnrealloc (void *p, size_t n, size_t s)
+{
+  if (xalloc_oversized (n, s))
+    xalloc_die ();
+  return xrealloc (p, n * s);
+}
+
+/* If P is null, allocate a block of at least *PN such objects;
+   otherwise, reallocate P so that it contains more than *PN objects
+   each of S bytes.  *PN must be nonzero unless P is null, and S must
+   be nonzero.  Set *PN to the new number of objects, and return the
+   pointer to the new block.  *PN is never set to zero, and the
+   returned pointer is never null.
+
+   Repeated reallocations are guaranteed to make progress, either by
+   allocating an initial block with a nonzero size, or by allocating a
+   larger block.
+
+   In the following implementation, nonzero sizes are increased by a
+   factor of approximately 1.5 so that repeated reallocations have
+   O(N) overall cost rather than O(N**2) cost, but the
+   specification for this function does not guarantee that rate.
+
+   Here is an example of use:
+
+     int *p = NULL;
+     size_t used = 0;
+     size_t allocated = 0;
+
+     void
+     append_int (int value)
+       {
+         if (used == allocated)
+           p = x2nrealloc (p, &allocated, sizeof *p);
+         p[used++] = value;
+       }
+
+   This causes x2nrealloc to allocate a block of some nonzero size the
+   first time it is called.
+
+   To have finer-grained control over the initial size, set *PN to a
+   nonzero value before calling this function with P == NULL.  For
+   example:
+
+     int *p = NULL;
+     size_t used = 0;
+     size_t allocated = 0;
+     size_t allocated1 = 1000;
+
+     void
+     append_int (int value)
+       {
+         if (used == allocated)
+           {
+             p = x2nrealloc (p, &allocated1, sizeof *p);
+             allocated = allocated1;
+           }
+         p[used++] = value;
+       }
+
+   */
+
+static_inline void *
+x2nrealloc (void *p, size_t *pn, size_t s)
+{
+  size_t n = *pn;
+
+  if (! p)
+    {
+      if (! n)
+        {
+          /* The approximate size to use for initial small allocation
+             requests, when the invoking code specifies an old size of
+             zero.  64 bytes is the largest "small" request for the
+             GNU C library malloc.  */
+          enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 };
+
+          n = DEFAULT_MXFAST / s;
+          n += !n;
+        }
+    }
+  else
+    {
+      /* Set N = ceil (1.5 * N) so that progress is made if N == 1.
+         Check for overflow, so that N * S stays in size_t range.
+         The check is slightly conservative, but an exact check isn't
+         worth the trouble.  */
+      if ((size_t) -1 / 3 * 2 / s <= n)
+        xalloc_die ();
+      n += n / 2 + 1;
+    }
+
+  *pn = n;
+  return xrealloc (p, n * s);
+}
+
+/* Return a pointer to a new buffer of N bytes.  This is like xmalloc,
+   except it returns char *.  */
+
+static_inline char *xcharalloc (size_t n) ATTRIBUTE_MALLOC;
+static_inline char *
+xcharalloc (size_t n)
+{
+  return XNMALLOC (n, char);
+}
+
+/* Allocate S bytes of zeroed memory dynamically, with error checking.
+   There's no need for xnzalloc (N, S), since it would be equivalent
+   to xcalloc (N, S).  */
+
+inline void *
+xzalloc (size_t s)
+{
+  return xcalloc(1, s);
+}
+
+# endif
+
+# ifdef __cplusplus
+}
+
+/* C++ does not allow conversions from void * to other pointer types
+   without a cast.  Use templates to work around the problem when
+   possible.  */
+
+template <typename T> inline T *
+xrealloc (T *p, size_t s)
+{
+  return (T *) xrealloc ((void *) p, s);
+}
+
+template <typename T> inline T *
+xnrealloc (T *p, size_t n, size_t s)
+{
+  return (T *) xnrealloc ((void *) p, n, s);
+}
+
+template <typename T> inline T *
+x2realloc (T *p, size_t *pn)
+{
+  return (T *) x2realloc ((void *) p, pn);
+}
+
+template <typename T> inline T *
+x2nrealloc (T *p, size_t *pn, size_t s)
+{
+  return (T *) x2nrealloc ((void *) p, pn, s);
+}
+
+template <typename T> inline T *
+xmemdup (T const *p, size_t s)
+{
+  return (T *) xmemdup ((void const *) p, s);
+}
+
+# endif
+
+
+#endif /* !XALLOC_H_ */
diff --git a/gawk-5.0.1/symbol.c b/gawk-5.0.1/symbol.c
new file mode 100644
index 00000000000..fe928112032
--- /dev/null
+++ b/gawk-5.0.1/symbol.c
@@ -0,0 +1,975 @@
+/*
+ * symbol.c - routines for symbol table management and code allocation
+ */
+
+/*
+ * Copyright (C) 1986, 1988, 1989, 1991-2015, 2017, 2018, 2019,
+ * the Free Software Foundation, Inc.
+ *
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ *
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include "awk.h"
+
+extern SRCFILE *srcfiles;
+extern INSTRUCTION *rule_list;
+
+#define HASHSIZE	1021
+
+static int func_count;	/* total number of functions */
+static int var_count;	/* total number of global variables and functions */
+
+static NODE *symbol_list;
+static void (*install_func)(NODE *) = NULL;
+static NODE *make_symbol(const char *name, NODETYPE type);
+static NODE *install(const char *name, NODE *parm, NODETYPE type);
+static void free_bcpool(INSTRUCTION_POOL *pl);
+
+static AWK_CONTEXT *curr_ctxt = NULL;
+static int ctxt_level;
+
+static NODE *global_table, *param_table;
+NODE *symbol_table, *func_table;
+
+/* Use a flag to avoid a strcmp() call inside install() */
+static bool installing_specials = false;
+
+/* init_symbol_table --- make sure the symbol tables are initialized */
+
+void
+init_symbol_table()
+{
+	getnode(global_table);
+	memset(global_table, '\0', sizeof(NODE));
+	null_array(global_table);
+
+	getnode(param_table);
+	memset(param_table, '\0', sizeof(NODE));
+	null_array(param_table);
+
+	installing_specials = true;
+	func_table = install_symbol(estrdup("FUNCTAB", 7), Node_var_array);
+
+	symbol_table = install_symbol(estrdup("SYMTAB", 6), Node_var_array);
+	installing_specials = false;
+}
+
+/*
+ * install_symbol:
+ * Install a global name in the symbol table, even if it is already there.
+ * Caller must check against redefinition if that is desired.
+ */
+
+NODE *
+install_symbol(const char *name, NODETYPE type)
+{
+	return install(name, NULL, type);
+}
+
+
+/*
+ * lookup --- find the most recent global or param node for name
+ *	installed by install_symbol
+ */
+
+NODE *
+lookup(const char *name)
+{
+	NODE *n;
+	NODE *tmp;
+	NODE *tables[5];	/* manual init below, for z/OS */
+	int i;
+
+	/* ``It's turtles, all the way down.'' */
+	tables[0] = param_table;	/* parameters shadow everything */
+	tables[1] = global_table;	/* SYMTAB and FUNCTAB found first, can't be redefined */
+	tables[2] = func_table;		/* then functions */
+	tables[3] = symbol_table;	/* then globals */
+	tables[4] = NULL;
+
+	if (strncmp(name, "awk::", 5) == 0)
+		tmp = make_string(name + 5, strlen(name) - 5);
+	else
+		tmp = make_string(name, strlen(name));
+
+	n = NULL;
+	for (i = 0; tables[i] != NULL; i++) {
+		if (assoc_empty(tables[i]))
+			continue;
+
+		if ((do_posix || do_traditional) && tables[i] == global_table)
+			continue;
+
+		n = in_array(tables[i], tmp);
+		if (n != NULL)
+			break;
+	}
+
+	unref(tmp);
+	if (n == NULL || n->type == Node_val)	/* non-variable in SYMTAB */
+		return NULL;
+	return n;	/* new place */
+}
+
+/* make_params --- allocate function parameters for the symbol table */
+
+NODE *
+make_params(char **pnames, int pcount)
+{
+	NODE *p, *parms;
+	int i;
+
+	if (pcount <= 0 || pnames == NULL)
+		return NULL;
+
+	ezalloc(parms, NODE *, pcount * sizeof(NODE), "make_params");
+
+	for (i = 0, p = parms; i < pcount; i++, p++) {
+		p->type = Node_param_list;
+		p->param = pnames[i];	/* shadows pname and vname */
+		p->param_cnt = i;
+	}
+
+	return parms;
+}
+
+/* install_params --- install function parameters into the symbol table */
+
+void
+install_params(NODE *func)
+{
+	int i, pcount;
+	NODE *parms;
+
+	if (func == NULL)
+		return;
+
+	assert(func->type == Node_func);
+
+	if (   (pcount = func->param_cnt) <= 0
+	    || (parms = func->fparms) == NULL)
+		return;
+
+	for (i = 0; i < pcount; i++)
+		(void) install(parms[i].param, parms + i, Node_param_list);
+}
+
+
+/*
+ * remove_params --- remove function parameters out of the symbol table.
+ */
+
+void
+remove_params(NODE *func)
+{
+	NODE *parms, *p;
+	int i, pcount;
+
+	if (func == NULL)
+		return;
+
+	assert(func->type == Node_func);
+
+	if (   (pcount = func->param_cnt) <= 0
+	    || (parms = func->fparms) == NULL)
+		return;
+
+	for (i = pcount - 1; i >= 0; i--) {
+		NODE *tmp;
+		NODE *tmp2;
+
+		p = parms + i;
+		assert(p->type == Node_param_list);
+		tmp = make_string(p->vname, strlen(p->vname));
+		tmp2 = in_array(param_table, tmp);
+		if (tmp2 != NULL && tmp2->dup_ent != NULL)
+			tmp2->dup_ent = tmp2->dup_ent->dup_ent;
+		else
+			(void) assoc_remove(param_table, tmp);
+
+		unref(tmp);
+	}
+
+	assoc_clear(param_table);	/* shazzam! */
+}
+
+
+/* remove_symbol --- remove a symbol from the symbol table */
+
+NODE *
+remove_symbol(NODE *r)
+{
+	NODE *n = in_array(symbol_table, r);
+
+	if (n == NULL)
+		return n;
+
+	n = dupnode(n);
+
+	(void) assoc_remove(symbol_table, r);
+
+	return n;
+}
+
+
+/*
+ * destroy_symbol --- remove a symbol from symbol table
+ *	and free all associated memory.
+ */
+
+void
+destroy_symbol(NODE *r)
+{
+	r = remove_symbol(r);
+	if (r == NULL)
+		return;
+
+	switch (r->type) {
+	case Node_func:
+		if (r->param_cnt > 0) {
+			NODE *n;
+			int i;
+			int pcount = r->param_cnt;
+
+			/* function parameters of type Node_param_list */
+			for (i = 0; i < pcount; i++) {
+				n = r->fparms + i;
+				efree(n->param);
+			}
+			efree(r->fparms);
+		}
+		break;
+
+	case Node_ext_func:
+		bcfree(r->code_ptr);
+		break;
+
+	case Node_var_array:
+		assoc_clear(r);
+		break;
+
+	case Node_var:
+		unref(r->var_value);
+		break;
+
+	default:
+		/* Node_param_list -- YYABORT */
+		break;	/* use break so that storage is freed */
+	}
+
+	efree(r->vname);
+	freenode(r);
+}
+
+
+/* make_symbol --- allocates a global symbol for the symbol table. */
+
+static NODE *
+make_symbol(const char *name, NODETYPE type)
+{
+	NODE *r;
+
+	getnode(r);
+	memset(r, '\0', sizeof(NODE));
+	if (type == Node_var_array)
+		null_array(r);
+	else if (type == Node_var)
+		r->var_value = dupnode(Nnull_string);
+	r->vname = (char *) name;
+	r->type = type;
+
+	return r;
+}
+
+/* install --- install a global name or function parameter in the symbol table */
+
+static NODE *
+install(const char *name, NODE *parm, NODETYPE type)
+{
+	NODE *r;
+	NODE *table;
+	NODE *n_name;
+	NODE *prev;
+
+	n_name = make_string(name, strlen(name));
+
+	table = symbol_table;
+
+	if (type == Node_param_list) {
+		table = param_table;
+	} else if (   type == Node_func
+		   || type == Node_ext_func
+		   || type == Node_builtin_func) {
+		table = func_table;
+	} else if (installing_specials) {
+		table = global_table;
+	}
+
+	if (parm != NULL)
+		r = parm;
+	else {
+		/* global symbol */
+		r = make_symbol(name, type);
+		if (type == Node_func)
+			func_count++;
+		if (type != Node_ext_func && type != Node_builtin_func && table != global_table)
+			var_count++;	/* total, includes Node_func */
+	}
+
+	if (type == Node_param_list) {
+		prev = in_array(table, n_name);
+		if (prev == NULL)
+			goto simple;
+		r->dup_ent = prev->dup_ent;
+		prev->dup_ent = r;
+		unref(n_name);
+	} else {
+simple:
+		/* the simple case */
+		assoc_set(table, n_name, r);
+	}
+
+	if (install_func)
+		(*install_func)(r);
+
+	return r;
+}
+
+/* comp_symbol --- compare two (variable or function) names */
+
+static int
+comp_symbol(const void *v1, const void *v2)
+{
+	const NODE *const *npp1, *const *npp2;
+	const NODE *n1, *n2;
+
+	npp1 = (const NODE *const *) v1;
+	npp2 = (const NODE *const *) v2;
+	n1 = *npp1;
+	n2 = *npp2;
+
+	return strcmp(n1->vname, n2->vname);
+}
+
+
+typedef enum { FUNCTION = 1, VARIABLE } SYMBOL_TYPE;
+
+/* get_symbols --- return a list of optionally sorted symbols */
+
+static NODE **
+get_symbols(SYMBOL_TYPE what, bool sort)
+{
+	int i;
+	NODE **table;
+	NODE **list;
+	NODE *r;
+	long count = 0;
+	long max;
+	NODE *the_table;
+
+	/*
+	 * assoc_list() returns an array with two elements per awk array
+	 * element. Elements i and i+1 in the C array represent the key
+	 * and value of element j in the awk array. Thus the loops use += 2
+	 * to go through the awk array.
+	 */
+
+	if (what == FUNCTION) {
+		the_table = func_table;
+		max = the_table->table_size * 2;
+
+		list = assoc_list(the_table, "@unsorted", ASORTI);
+		emalloc(table, NODE **, (func_count + 1) * sizeof(NODE *), "get_symbols");
+
+		for (i = count = 0; i < max; i += 2) {
+			r = list[i+1];
+			if (r->type == Node_ext_func || r->type == Node_builtin_func)
+				continue;
+			assert(r->type == Node_func);
+			table[count++] = r;
+		}
+	} else {	/* what == VARIABLE */
+		update_global_values();
+
+		the_table = symbol_table;
+		max = the_table->table_size * 2;
+
+		list = assoc_list(the_table, "@unsorted", ASORTI);
+		/* add three: one for FUNCTAB, one for SYMTAB, and one for a final NULL */
+		emalloc(table, NODE **, (var_count + 1 + 1 + 1) * sizeof(NODE *), "get_symbols");
+
+		for (i = count = 0; i < max; i += 2) {
+			r = list[i+1];
+			if (r->type == Node_val)	/* non-variable in SYMTAB */
+				continue;
+			table[count++] = r;
+		}
+
+		table[count++] = func_table;
+		table[count++] = symbol_table;
+	}
+
+	efree(list);
+
+	if (sort && count > 1)
+		qsort(table, count, sizeof(NODE *), comp_symbol);	/* Shazzam! */
+	table[count] = NULL; /* null terminate the list */
+	return table;
+}
+
+
+/* variable_list --- list of global variables */
+
+NODE **
+variable_list()
+{
+	return get_symbols(VARIABLE, true);
+}
+
+/* function_list --- list of functions */
+
+NODE **
+function_list(bool sort)
+{
+	return get_symbols(FUNCTION, sort);
+}
+
+/* print_vars --- print names and values of global variables */
+
+void
+print_vars(NODE **table, int (*print_func)(FILE *, const char *, ...), FILE *fp)
+{
+	int i;
+	NODE *r;
+
+	assert(table != NULL);
+
+	for (i = 0; (r = table[i]) != NULL; i++) {
+		if (r->type == Node_func || r->type == Node_ext_func)
+			continue;
+		print_func(fp, "%s: ", r->vname);
+		if (r->type == Node_var_array)
+			print_func(fp, "array, %ld elements\n", assoc_length(r));
+		else if (r->type == Node_var_new)
+			print_func(fp, "untyped variable\n");
+		else if (r->type == Node_var)
+			valinfo(r->var_value, print_func, fp);
+	}
+}
+
+
+/* foreach_func --- execute given function for each awk function in table. */
+
+int
+foreach_func(NODE **table, int (*pfunc)(INSTRUCTION *, void *), void *data)
+{
+	int i;
+	NODE *r;
+	int ret = 0;
+
+	assert(table != NULL);
+
+	for (i = 0; (r = table[i]) != NULL; i++) {
+		if ((ret = pfunc(r->code_ptr, data)) != 0)
+			break;
+	}
+	return ret;
+}
+
+/* release_all_vars --- free all variable memory */
+
+void
+release_all_vars()
+{
+	assoc_clear(symbol_table);
+	assoc_clear(func_table);
+	assoc_clear(global_table);
+}
+
+
+/* append_symbol --- append symbol to the list of symbols
+ *	installed in the symbol table.
+ */
+
+void
+append_symbol(NODE *r)
+{
+	NODE *p;
+
+	getnode(p);
+	p->lnode = r;
+	p->rnode = symbol_list->rnode;
+	symbol_list->rnode = p;
+}
+
+/* release_symbols --- free symbol list and optionally remove symbol from symbol table */
+
+void
+release_symbols(NODE *symlist, int keep_globals)
+{
+	NODE *p, *next;
+
+	for (p = symlist->rnode; p != NULL; p = next) {
+		if (! keep_globals) {
+			/*
+			 * destroys globals, function, and params
+			 * if still in symbol table
+			 */
+			destroy_symbol(p->lnode);
+		}
+		next = p->rnode;
+		freenode(p);
+	}
+	symlist->rnode = NULL;
+}
+
+/* load_symbols --- fill in symbols' information */
+
+void
+load_symbols()
+{
+	NODE *r;
+	NODE *tmp;
+	NODE *sym_array;
+	NODE **aptr;
+	long i, j, max;
+	NODE *user, *extension, *untyped, *scalar, *array, *built_in;
+	NODE **list;
+	NODE *tables[4];
+
+	if (PROCINFO_node == NULL)
+		return;
+
+	tables[0] = func_table;
+	tables[1] = symbol_table;
+	tables[2] = global_table;
+	tables[3] = NULL;
+
+	tmp = make_string("identifiers", 11);
+	aptr = assoc_lookup(PROCINFO_node, tmp);
+
+	getnode(sym_array);
+	memset(sym_array, '\0', sizeof(NODE));	/* PPC Mac OS X wants this */
+	null_array(sym_array);
+
+	unref(tmp);
+	unref(*aptr);
+	*aptr = sym_array;
+
+	sym_array->parent_array = PROCINFO_node;
+	sym_array->vname = estrdup("identifiers", 11);
+
+	user = make_string("user", 4);
+	extension = make_string("extension", 9);
+	scalar = make_string("scalar", 6);
+	untyped = make_string("untyped", 7);
+	array = make_string("array", 5);
+	built_in = make_string("builtin", 7);
+
+	for (i = 0; tables[i] != NULL; i++) {
+		list = assoc_list(tables[i], "@unsorted", ASORTI);
+		max = tables[i]->table_size * 2;
+		if (max == 0)
+			continue;
+		for (j = 0; j < max; j += 2) {
+			r = list[j+1];
+			if (   r->type == Node_ext_func
+			    || r->type == Node_func
+			    || r->type == Node_builtin_func
+			    || r->type == Node_var
+			    || r->type == Node_var_array
+			    || r->type == Node_var_new) {
+				tmp = make_string(r->vname, strlen(r->vname));
+				aptr = assoc_lookup(sym_array, tmp);
+				unref(tmp);
+				unref(*aptr);
+				switch (r->type) {
+				case Node_ext_func:
+					*aptr = dupnode(extension);
+					break;
+				case Node_func:
+					*aptr = dupnode(user);
+					break;
+				case Node_builtin_func:
+					*aptr = dupnode(built_in);
+					break;
+				case Node_var:
+					*aptr = dupnode(scalar);
+					break;
+				case Node_var_array:
+					*aptr = dupnode(array);
+					break;
+				case Node_var_new:
+					*aptr = dupnode(untyped);
+					break;
+				default:
+					cant_happen();
+					break;
+				}
+			}
+		}
+		efree(list);
+	}
+
+	unref(user);
+	unref(extension);
+	unref(scalar);
+	unref(untyped);
+	unref(array);
+}
+
+/* check_param_names --- make sure no parameter is the name of a function */
+
+bool
+check_param_names(void)
+{
+	int i, j;
+	NODE **list;
+	NODE *f;
+	long max;
+	bool result = true;
+	NODE n;
+
+	if (assoc_empty(func_table))
+		return result;
+
+	max = func_table->table_size * 2;
+
+	memset(& n, 0, sizeof n);
+	n.type = Node_val;
+	n.flags = STRING|STRCUR;
+	n.stfmt = STFMT_UNUSED;
+#ifdef HAVE_MPFR
+	n.strndmode = MPFR_round_mode;
+#endif
+
+	/*
+	 * assoc_list() returns an array with two elements per awk array
+	 * element. Elements i and i+1 in the C array represent the key
+	 * and value of element j in the awk array. Thus the loops use += 2
+	 * to go through the awk array.
+	 *
+	 * In this case, the name is in list[i], and the function is
+	 * in list[i+1]. Just what we need.
+	 */
+
+	list = assoc_list(func_table, "@unsorted", ASORTI);
+
+	for (i = 0; i < max; i += 2) {
+		f = list[i+1];
+		if (f->type == Node_builtin_func || f->param_cnt == 0)
+			continue;
+
+		/* loop over each param in function i */
+		for (j = 0; j < f->param_cnt; j++) {
+			/* compare to function names */
+
+			/* use a fake node to avoid malloc/free of make_string */
+			n.stptr = f->fparms[j].param;
+			n.stlen = strlen(f->fparms[j].param);
+
+			if (in_array(func_table, & n)) {
+				error(
+			_("function `%s': can't use function `%s' as a parameter name"),
+					list[i]->stptr,
+					f->fparms[j].param);
+				result = false;
+			}
+		}
+	}
+
+	efree(list);
+	return result;
+}
+
+static INSTRUCTION_POOL *pools;
+
+/*
+ * For best performance, the INSTR_CHUNK value should be divisible by all
+ * possible sizes, i.e. 1 through MAX_INSTRUCTION_ALLOC. Otherwise, there
+ * will be wasted space at the end of the block.
+ */
+#define INSTR_CHUNK (2*3*21)
+
+struct instruction_block {
+	struct instruction_block *next;
+	INSTRUCTION i[INSTR_CHUNK];
+};
+
+/* bcfree --- deallocate instruction */
+
+void
+bcfree(INSTRUCTION *cp)
+{
+	assert(cp->pool_size >= 1 && cp->pool_size <= MAX_INSTRUCTION_ALLOC);
+
+	cp->opcode = Op_illegal;
+	cp->nexti = pools->pool[cp->pool_size - 1].free_list;
+	pools->pool[cp->pool_size - 1].free_list = cp;
+}
+
+/* bcalloc --- allocate a new instruction */
+
+INSTRUCTION *
+bcalloc(OPCODE op, int size, int srcline)
+{
+	INSTRUCTION *cp;
+	struct instruction_mem_pool *pool;
+
+	assert(size >= 1 && size <= MAX_INSTRUCTION_ALLOC);
+	pool = &pools->pool[size - 1];
+
+	if (pool->free_list != NULL) {
+		cp = pool->free_list;
+		pool->free_list = cp->nexti;
+	} else if (pool->free_space && pool->free_space + size <= & pool->block_list->i[INSTR_CHUNK]) {
+		cp = pool->free_space;
+		pool->free_space += size;
+	} else {
+		struct instruction_block *block;
+		emalloc(block, struct instruction_block *, sizeof(struct instruction_block), "bcalloc");
+		block->next = pool->block_list;
+		pool->block_list = block;
+		cp = &block->i[0];
+		pool->free_space = &block->i[size];
+	}
+
+	memset(cp, 0, size * sizeof(INSTRUCTION));
+	cp->pool_size = size;
+	cp->opcode = op;
+	cp->source_line = srcline;
+	return cp;
+}
+
+/* new_context --- create a new execution context. */
+
+AWK_CONTEXT *
+new_context()
+{
+	AWK_CONTEXT *ctxt;
+
+	ezalloc(ctxt, AWK_CONTEXT *, sizeof(AWK_CONTEXT), "new_context");
+	ctxt->srcfiles.next = ctxt->srcfiles.prev = & ctxt->srcfiles;
+	ctxt->rule_list.opcode = Op_list;
+	ctxt->rule_list.lasti = & ctxt->rule_list;
+	return ctxt;
+}
+
+/* set_context --- change current execution context. */
+
+static void
+set_context(AWK_CONTEXT *ctxt)
+{
+	pools = & ctxt->pools;
+	symbol_list = & ctxt->symbols;
+	srcfiles = & ctxt->srcfiles;
+	rule_list = & ctxt->rule_list;
+	install_func = ctxt->install_func;
+	curr_ctxt = ctxt;
+}
+
+/*
+ * push_context:
+ *
+ * Switch to the given context after saving the current one. The set
+ * of active execution contexts forms a stack; the global or main context
+ * is at the bottom of the stack.
+ */
+
+void
+push_context(AWK_CONTEXT *ctxt)
+{
+	ctxt->prev = curr_ctxt;
+	/* save current source and sourceline */
+	if (curr_ctxt != NULL) {
+		curr_ctxt->sourceline = sourceline;
+		curr_ctxt->source = source;
+	}
+	sourceline = 0;
+	source = NULL;
+	set_context(ctxt);
+	ctxt_level++;
+}
+
+/* pop_context --- switch to previous execution context. */
+
+void
+pop_context()
+{
+	AWK_CONTEXT *ctxt;
+
+	assert(curr_ctxt != NULL);
+	if (curr_ctxt->prev == NULL)
+		fatal(_("can not pop main context"));
+	ctxt = curr_ctxt->prev;
+	/* restore source and sourceline */
+	sourceline = ctxt->sourceline;
+	source = ctxt->source;
+	set_context(ctxt);
+	ctxt_level--;
+}
+
+/* in_main_context --- are we in the main context ? */
+
+int
+in_main_context()
+{
+	assert(ctxt_level > 0);
+	return (ctxt_level == 1);
+}
+
+/* free_context --- free context structure and related data. */
+
+void
+free_context(AWK_CONTEXT *ctxt, bool keep_globals)
+{
+	SRCFILE *s, *sn;
+
+	if (ctxt == NULL)
+		return;
+
+	assert(curr_ctxt != ctxt);
+
+ 	/* free all code including function codes */
+
+	free_bcpool(& ctxt->pools);
+
+	/* free symbols */
+
+	release_symbols(& ctxt->symbols, keep_globals);
+
+	/* free srcfiles */
+
+	for (s = & ctxt->srcfiles; s != & ctxt->srcfiles; s = sn) {
+		sn = s->next;
+		if (s->stype != SRC_CMDLINE && s->stype != SRC_STDIN)
+			efree(s->fullpath);
+		efree(s->src);
+		efree(s);
+	}
+
+	efree(ctxt);
+}
+
+/* free_bc_internal --- free internal memory of an instruction. */
+
+static void
+free_bc_internal(INSTRUCTION *cp)
+{
+	NODE *m;
+
+	switch(cp->opcode) {
+	case Op_func_call:
+		if (cp->func_name != NULL)
+			efree(cp->func_name);
+		break;
+	case Op_push_re:
+	case Op_match_rec:
+	case Op_match:
+	case Op_nomatch:
+		m = cp->memory;
+		if (m->re_reg[0] != NULL)
+			refree(m->re_reg[0]);
+		if (m->re_reg[1] != NULL)
+			refree(m->re_reg[1]);
+		if (m->re_exp != NULL)
+			unref(m->re_exp);
+		if (m->re_text != NULL)
+			unref(m->re_text);
+		freenode(m);
+		break;
+	case Op_token:
+		/* token lost during error recovery in yyparse */
+		if (cp->lextok != NULL)
+			efree(cp->lextok);
+		break;
+	case Op_push_i:
+		m = cp->memory;
+		unref(m);
+		break;
+	case Op_store_var:
+		m = cp->initval;
+		if (m != NULL)
+			unref(m);
+		break;
+	case Op_illegal:
+		cant_happen();
+	default:
+		break;
+	}
+}
+
+/* free_bc_mempool --- free a single pool */
+
+static void
+free_bc_mempool(struct instruction_mem_pool *pool, int size)
+{
+	bool first = true;
+	struct instruction_block *block, *next;
+
+	for (block = pool->block_list; block; block = next) {
+		INSTRUCTION *cp, *end;
+
+		end = (first ? pool->free_space : & block->i[INSTR_CHUNK]);
+		for (cp = & block->i[0]; cp + size <= end; cp += size) {
+			if (cp->opcode != Op_illegal)
+				free_bc_internal(cp);
+		}
+		next = block->next;
+		efree(block);
+		first = false;
+	}
+}
+
+
+/* free_bcpool --- free list of instruction memory pools */
+
+static void
+free_bcpool(INSTRUCTION_POOL *pl)
+{
+	int i;
+
+	for (i = 0; i < MAX_INSTRUCTION_ALLOC; i++)
+		free_bc_mempool(& pl->pool[i], i + 1);
+}
+
+/* is_all_upper --- return true if name is all uppercase letters */
+
+/*
+ * DON'T use isupper(), it's locale aware!
+ */
+
+bool
+is_all_upper(const char *name)
+{
+	for (; *name != '\0'; name++) {
+		switch (*name) {
+		case 'A': case 'B': case 'C': case 'D': case 'E':
+		case 'F': case 'G': case 'H': case 'I': case 'J':
+		case 'K': case 'L': case 'M': case 'N': case 'O':
+		case 'P': case 'Q': case 'R': case 'S': case 'T':
+		case 'U': case 'V': case 'W': case 'X': case 'Y':
+		case 'Z':
+			break;
+		default:
+			return false;
+		}
+	}
+
+	return true;
+}
diff --git a/gawk-5.0.1/test/ChangeLog b/gawk-5.0.1/test/ChangeLog
new file mode 100644
index 00000000000..9d8f0d03d33
--- /dev/null
+++ b/gawk-5.0.1/test/ChangeLog
@@ -0,0 +1,40 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-05-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* badargs.ok: Updated after code changes.
+
+2019-05-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Gentests: Finish handlinig NEED_SANDBOX.
+
+2019-05-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): New test: sandbox1.
+	(NEED_SANDBOX): New list of tests.
+	* Gentests: Handle NEED_SANDBOX.
+	* sandbox1.awk, sandbox1.ok: New files.
+
+2019-02-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): New test: assignnumfield2.
+	* assignnumfield2.awk, assignnumfield2.ok: New files.
+
+2019-04-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): New test: fscaret.
+	* fscaret.awk, fscaret.in, fscaret.ok: New files.
+
+2019-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.1 to the list. Ooops.
+	(synerr3): New test.
+	* synerr3.awk, synerr3.ok: New files.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/test/ChangeLog.0 b/gawk-5.0.1/test/ChangeLog.0
new file mode 100644
index 00000000000..c1b18f4d7f2
--- /dev/null
+++ b/gawk-5.0.1/test/ChangeLog.0
@@ -0,0 +1,1785 @@
+Mon Jun 20 20:35:04 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dfastress.awk, dfastress.ok: New files.
+	* Makefile.am (dfastress): New test.
+
+Sun Jun  5 21:45:27 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* fpat1.ok, fpat1.in: Updated to test things better.
+
+Tue May 31 22:50:28 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* regrange.awk, regrange.ok: New files.
+	* Makefile.am (regrange): New test.
+
+Thu May 26 22:08:27 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* fpat2.awk, fpat2.ok: New files. Thanks to Pat Rankin for the cases.
+	* Makefile.am (fpat2): New test.
+
+Mon May 23 14:03:15 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* fpatnull.awk, fpatnull.in, fpatnull.ok: New files.
+	* Makefile.am (fpatnull): New test.
+
+Sun May 22 11:58:58 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* dumpvars.ok: Updated.
+
+Thu May 19 16:56:31 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* badargs.ok: Updated.
+
+Sat May 14 22:28:56 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* delargv.awk, delargv.ok: New files.
+	* Makefile.am (delargv): New test.
+
+Mon May  9 15:06:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: Put next and exit tests into gawk specific tests
+	since they use BEGINFILE and ENDFILE. Thanks to Pat Rankin.
+
+Sun May  8 20:32:59 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* arraysort.ok, sort1.ok: Updated.
+
+Wed May  4 23:37:27 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Revise tests for array sorting.
+
+	* arraysort.awk, arraysort.ok, sort1.awk, sort1.ok,
+	sortfor.awk: Revised.
+
+Wed May  4 23:07:39 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* nastyparm.awk, nastyparm.ok: New files from John Haque.
+	* Makefile.am (nastyparm): New test.
+
+Wed May  4 23:03:06 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* delsub.awk, delsub.ok: New files.
+	* Makefile.am (delsub): New test.
+
+Fri Apr 22 16:07:01 2011  John Haque         <j.eh@mchsi.com>
+
+	* sortu.awk, sortu.ok: New files.
+
+Fri Apr 22 09:19:06 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* arraysort.ok: Updated.
+
+Mon Apr 18 10:22:28 2011  John Haque         <j.eh@mchsi.com>
+
+	* arraysort.awk, arraysort.ok, sort1.awk, sort1.ok: Updated.
+
+Fri Apr 15 13:49:36 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* ofmta.awk, ofmta.ok: New files from John Haque.
+	* Makefile.am (ofmta): New test.
+
+Thu Apr  7 21:44:06 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* arraysort.awk, arraysort.ok: Added more test cases.
+
+Fri Apr  1 11:56:54 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* arraysort.awk, arraysort.ok: New files from John Haque,
+	edited somewhat.
+	* Makefile.am (arraysort): New test.
+
+Wed Mar 30 22:00:59 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* next.sh, exit.sh: New files from John Haque, edited somewhat.
+	* Makefile.am (next, exit): New tests.
+
+Mon Feb 21 20:32:36 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (GAWK_EXT_TESTS): Include profile3. Thanks to
+	Scott Deifik for pointing out the omission.
+
+Tue Feb 15 17:11:26 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* sortfor.awk: New values for PROCINFO["sorted_in"].
+	* sortfor.ok: Sync with updated sortfor.awk.
+
+Wed Feb 16 21:09:50 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (lintwarn): New test.
+	* lintwarn.awk, lintwarn.ok: New files from John Haque.
+	* funsmnam.ok, noeffect.ok, paramdup.ok, paramres.ok: Adjust
+	after fixes to lint warnings.
+
+Mon Feb 14 21:31:10 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (profile2): Add -v sortcmd=sort to pgawk invocation.
+	(profile1): Remove awkprof.out. Thanks to Pat Rankin for noticing.
+
+Sun Feb 13 20:27:35 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* xref.awk: Allow sortcmd to be preset via -v option.
+	* profile2.ok: Sync with updated xref.awk.
+
+Sun Feb 13 19:55:15 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (profile3): New test.
+	* profile3.awk, profile3.ok: New files.
+
+Fri Feb 11 10:29:48 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (manyfiles): Bump limit up above 1024, which is
+	what most modern systems have for number of open file descriptors.
+
+Tue Feb  8 22:49:17 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* aryprm4.ok, scalar.ok, sclforin.ok, sclifin.ok: Fixed to match
+	output message changes.
+
+Mon Feb  7 21:39:39 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (negrange): New test.
+	* negrange.awk, negrange.ok: New files.
+
+Tue Feb  1 23:21:39 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* xref.awk: Change sort command to just "sort"; avoids
+	problems for Windows and is good enough for the test.
+	* profile2.ok: Update.
+
+Tue Feb  1 10:20:47 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* sortfor.awk: Change magic string to match code.
+
+Thu Jan 27 22:56:19 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (sortfor): New test.
+	* sortfor.awk, sortfor.in, sortfor.ok: New files.
+
+Thu Jan 27 22:03:22 2011  John Haque         <j.eh@mchsi.com>
+
+	* xref.awk, profile2.ok: Fixed to be character set independent.
+
+Sun Dec 26 13:54:21 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Include profile2.ok in the list. Oops.
+
+Mon Dec 13 13:54:56 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* localenl.sh: Use --posix option.
+
+Sun Dec 12 13:58:36 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gsubtst5.ok: Adjust contents.
+
+Tue Dec  7 22:31:51 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (profile1, profile2): New tests.
+	* dtdgport.awk, xref.original, xref.awk, profile2.ok: New files.
+	* Gentests: Use POSIX character classes instead of ranges.
+
+Mon Dec  6 19:47:09 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (whiny): Removed test.
+	* whiny.awk, whiny.in, whiny.ok: Removed.
+
+Wed Dec  1 08:11:46 2010  Corinna Vinschen   <vinschen@redhat.com>
+
+	* Makefile.am (beginfile1): Refer to Makefile instead of
+	$(srcdir)/Makefile for building out of the source directory.
+
+Tue Nov 30 13:51:35 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* badargs.ok: Updated.
+
+Mon Nov 29 21:52:49 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* funstack.awk, gsubtst5.ok, igncfs.awk, longwrds.awk,
+	ofmtbig.awk, subamp.awk: Fix regexes to remove ranges.
+
+Fri Nov 12 11:58:40 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (dumpvars): New test.
+	* dumpvars.in, dumpvars.ok: New files.
+
+Thu Nov 11 16:29:06 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* backgsub.ok: Updated to match change in code.
+	* posix2008sub.awk, posix2008.ok: New files, renamed from ...
+	* psx96sub.awk, psx96sub.ok: Removed.
+	* Makefile.am (posix2008sub): Renamed from `psx96sub'.
+
+Tue Nov  2 12:14:50 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* badargs.ok: Updated.
+
+Mon Nov  1 21:44:48 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	New tests for arrays of arrays, courtesy of John Haque
+	<j.eh@mchsi.com>.
+
+	* Makefile.am (aadelete1, aadelete2, aarray1,
+	aasort, aasorti): New tests.
+	* aadelete1.awk, aadelete1.ok, aadelete2.awk, aadelete2.ok,
+	aarray1.awk, aarray1.ok, aasort.awk, aasort.ok,
+	aasorti.awk, aasorti.ok: New files.
+
+	Unrelated:
+	* badargs.ok: Updated.
+
+Tue Oct 26 20:49:41 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (switch2): Made into a test.
+	* switch2.ok: New file.
+
+Tue Oct 19 08:26:03 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (gsubtst6, mbstr1, mbprintf3, printfbad2):
+	Re-enable these tests that got lost during the merge. Thanks
+	to Scott Deifik for noticing.
+
+Fri Oct 15 14:20:22 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (beginfile1, range1): New tests.
+	* beginfile1.awk, beginfile1.in, beginfile1.ok: New files.
+	* range1.awk, range1.in, range1.ok: New files.
+
+Sun Jun 27 22:01:38 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* badargs.ok: Updated with new usage message.
+
+Tue Jun 22 20:55:47 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fpat1, patsplit): New tests.
+	* fpat1.awk, fpat1.in, fpat1.ok, patsplit.awk, patsplit.ok: new files.
+
+Fri Jan 16 11:36:02 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* badargs.ok, funstack.awk, gsubtst4.ok: Adjust to change in
+	--gen-po option, removal of -r, and enabling interval expressions.
+
+Fri Jan 16 11:36:02 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (indirectcall): New test.
+	* indirectcall.awk, indirectcall.in, indirectcall.ok: New files.
+
+Tue Dec 30 22:27:08 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* badargs.ok: Updated.
+
+Tue Dec  9 06:58:00 2008  Steffen Schuler    <schuler.steffen@googlemail.com>
+
+	* Makefile.am (splitarg4): New test.
+	* splitarg4.awk, splitarg4.in, splitarg4.ok: New files.
+
+Wed Dec 26 22:01:52 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* pid.awk: Fix to use PROCINFO now that /dev/pid, /dev/ppid gone.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Wed Apr 21 22:23:30 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add Gentests.vms so it'll be
+	in the dist.
+	* localenl.sh, localenl.ok: Remove UNKNOWN locale per
+	request from Nelson Beebe.
+	* lc_num1.awk, lc_num1.ok: Revised to not fail on systems
+	where the quote flag isn't supported.  Also per Nelson Beebe.
+
+Thu Feb 18 22:50:54 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fcall_exit2): New test.
+	* fcall_exit2.awk, fcall_exit2.in, fcall_exit2.ok: New files.
+
+Wed Feb 17 23:25:27 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fcall_exit): New test.
+	* fcall_exit.awk, fcall_exit.ok: New files.
+
+Fri Feb  5 13:02:10 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (forref): New test.
+	* forref.awk, forref.ok: New files.
+
+Tue Oct  6 19:49:22 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (uninit5): New test.
+	* uninit5.awk, uninit5.ok: New files.
+
+Tue Aug  4 06:04:04 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* hsprint.ok: Updated.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Fri Jul  3 13:04:55 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (charset-tests): Moved tests that can fail based on
+	character set and locale issues into a separate section.
+
+Wed Jun 24 22:30:31 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* lintold.awk: Changed to avoid floating point problems on VMS.
+
+Wed Jun 24 05:39:00 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* printfbad2.awk, printfbad2.ok: Adjusted for systems where sed
+	will add a final newline if the input didn't contain one.
+
+Mon Jun 22 00:44:50 2009  Pat Rankin  <rankin@pactechdata.com>
+
+	* getlndir.awk (SRCDIR): Allow caller to override "." as directory.
+	* intformat.awk (HUGEVAL): Allow caller to override the largest
+	value, and restructure 10^x and 2^y loops to use it without
+	overflowing on non-IEEE floating pointing hosts.
+
+Tue Jun 23 05:26:52 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (MACHINE_TESTS): Move fmtspcl to here per Pat Rankin.
+
+Fri Jun 19 14:26:55 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (GAWK_EXT_TESTS): Fixed sorting of tests.
+	Removed ovrflow1 test since double1 is a superset; thanks
+	to Pat Rankin.
+	* (ovrflow1.awk, ovrflow1.ok): Removed.
+
+Thu Jun 18 05:46:32 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (localenl): Per Michal Jaegermann, send stderr output
+	to /dev/null.
+	* (machine-tests): Moved several tests to new section for tests
+	whose output can vary by hardware.
+
+Thu Jun 11 04:50:44 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (lc_num1): Don't need --posix, changed command line
+	so that AWKPATH influences again. Thanks to Corinna Vinschen
+	for making me fix this.
+
+Wed Jun 10 08:28:13 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (lc_num1, printfbad2): Fix so building outside the
+	source directory works.
+
+Thu May 21 21:10:53 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* badargs.ok: Updated.
+
+Fri May 15 14:38:16 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (paramres): New test.
+	* paramres.awk, paramres.ok: New files.
+
+Fri Mar 27 10:57:49 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (printfbad2): New test.
+	* printfbad2.awk, printfbad2.in, printfbad2.ok: New files.
+
+Tue Feb  3 22:08:27 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (uparrfs): New test.
+	* uparrfs.awk, uparrfs.in, uparrfs.ok: New files.
+
+Mon Jan  5 22:53:26 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (getlndir): New test.
+	* getlndir.awk, getlndir.ok: New files.
+
+Mon Dec 29 22:46:10 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (mbprintf3): New test.
+	* mbprintf3.awk, mbprintf3.in, mbprintf3.ok: New files.
+
+Thu Dec 18 20:57:39 2008  Stepan Kasal  <skasal@redhat.com>
+
+	* lc_num1.awk, lc_num1.ok: Test that the quote modifier in
+	printf is not sticky.
+	* Makefile.am: Add it.
+	* Gentests: Allow _ in test names.
+
+Thu Dec 11 21:36:11 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (mbstr1): New test.
+	* mbstr1.awk, mbstr1.ok: New files.
+
+Thu Dec  4 22:44:39 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (closebad): New test.
+	* closebad.awk, closebad.ok: New files.
+
+Thu Jul 31 21:44:21 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (match3, gsubtst6): New tests.
+	* match3.awk, match3.in, match3.ok: New files.
+	* gsubtst6.awk, gsubtst6.ok: New files.
+
+Fri May  2 12:43:51 2008  Steffen Schuler    <schuler.steffen@googlemail.com>
+
+	* Makefile.am (mbfw1): Add code for test to use a UTF locale.
+
+Wed Apr 23 22:13:47 2008  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (funlen, mbfw1, mbprintf1, mbprintf2): New tests.
+	* funlen.awk, funlen.in, funlen.ok: New files.
+	* mbfw1.awk, mbfw1.in, mbfw1.ok: New files.
+	* mbprintf1.awk, mbprintf1.in, mbprintf1.ok: New files.
+	* mbprintf2.awk, mbprintf2.ok: New files.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Wed Sep 26 14:32:28 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (localenl): New test.
+	(regtest): Fixed invocation of shell script.
+	* localenl.sh, localenl.ok: New files.
+	* reg/func2.good: Revised to match current gawk output.
+
+Wed Sep 26 14:49:04 2007 Eli Zaretskii  <eliz@gnu.org>
+
+	* exitval2.w32: New file, a Windows version for exitval2.awk.
+
+Tue May 29 13:22:33 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* badargs.ok: Updated.
+
+Thu May 17 21:10:51 2007  Pat Rankin  <rankin@pactechdata.com>
+
+	* icasers.awk: Modify pattern to work on VMS too, doesn't
+	break Unix/Linux.
+
+Tue May 15 22:05:24 2007  Pat Rankin  <rankin@pactechdata.com>
+
+	Steps towards generating VMS .mms file to run test suite.
+
+	* Makefile.am (FAIL_CODE1): New macro, list of programs
+	that exit 1.
+	* Gentests: Add VMS code.
+	* Gentests.vms: New file.
+
+Wed May  2 19:30:54 2007  Stepan Kasal  <kasal@ucw.cz>
+
+	Revert precedence of concatenation and | getline.
+	From mail dated 2005-10-31.
+
+	* parsefld.awk, parsefld.in, parsefld.ok: New files.
+	* Makefile.am (parsefld): New basic test, check for $/regex/ and
+	for /re1/+/re2/.
+	* getline.awk, getline.ok: Add precedence check "echo " "date"|getline
+
+Sun Apr 29 22:43:28 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* hsprint.awk: Add extra "%" to format string. Thanks to Nelson Beebe.
+	* hsprint.ok: Revised.
+
+Tue Apr 24 23:15:01 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* fmtspcl.tok: Provide correct version.
+
+Tue Apr 17 22:23:41 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* double2.awk, double2.ok: Limit to 2^63 for portability across
+	different platforms. Sigh.
+
+Thu Apr 12 20:00:27 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* Makefile.am, Makefile.in (fmtspcl): Use fmtspcl.tok to build
+	a fmtspcl.ok file suitable for the given platform.
+	(diffout): Handle case where the .ok file is in the build directory.
+
+Mon Mar 26 08:24:04 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fmtspcl.ok): Don't remove for cleaning, add
+	to EXTRA_DIST.
+
+Fri Mar  9 11:38:34 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fmtspcl.tok): Removed use of and reference
+	to this file.
+
+Tue Feb  6 08:21:02 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (double1, double2, zero2): New tests.
+	* double1.awk, double1.ok, double2.awk, double2.ok,
+	zero2.awk, zero2.ok: New files.
+
+Sun Feb  4 16:32:45 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (parse1): New test.
+	* parse1.awk, parse1.in, parse1.ok: New files.
+
+Thu Feb  1 17:41:48 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* Makefile.am (fmtspcl): New test.
+	(CLEANFILES): Add fmtpspcl.ok to list.
+	* fmtspcl.awk, fmtspcl.tok: New files.
+
+Mon Jan 29 15:31:35 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* Makefile.am (diffout): Make it work if no problems.
+	(valgrind-scan): New target to show problems.
+
+Mon Jan 29 12:51:16 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (reint2): New test.
+	* reint2.awk, reint2.in, reint2.ok: New files.
+
+Fri Jan 26 20:01:38 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* Makefile.am (intformat): New test.
+	* intformat.awk, intformat.ok: New files.
+
+Tue Jan 23 08:10:48 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fwtest2): New test.
+	* fwtest2.awk, fwtest2.in, fwtest2.ok: New files.
+
+Sun Jan 21 13:09:33 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (synerr2, wideidx2): New test.
+	* synerr2.awk, synerr2.ok, wideidx2.awk, wideidx2.ok: New files.
+
+Fri Jan 19 15:11:12 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (strnum1, widesub4): New test.
+	* strnum1.awk, strnum1.ok, widesub4.awk, widesub4.ok: New files.
+
+Thu Jan 18 13:37:00 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* Makeilfe.am (devfd, wideidx, widesub, widesub2, widesub3): New
+	tests.
+	* devfd.in4, devfd.in5, devfd.ok, wideidx.awk, wideidx.in, wideidx.ok,
+	widesub.awk, widesub.ok, widesub2.awk, widesub2.ok, widesub3.awk,
+	widesub3.in, widesub3.ok: New files.
+
+Tue Jan 16 12:16:39 2007  Andrew J. Schorr <ajschorr@users.sourceforge.net>
+
+	* Makefile.am: In pid test, no further need to remove _pid.in,
+	since the test no longer creates that file.
+	* pid.awk: Do not read correct values from stdin (they are now passed
+	as command-line variables with -v).  Make sure to produce output
+	if the comparisons are successful.
+	* pid.ok: No longer empty, should contain 3 lines if all goes well.
+	* pid.sh: Do not create _pid.in; instead, pass values in with -v.
+
+Sun Jan 14 18:03:12 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* fnarray.ok: Updated.
+
+2007-01-13  Eli Zaretskii  <eliz@gnu.org>
+
+	* pipeio2.awk: Don't use empty lines, because Windows ECHO does
+	something different when invoked without arguments.
+
+	* pipeio2.ok: Update.
+
+	* Makefile.am (EXTRA_DIST): Add exitval2.w32.
+
+	* exitval2.w32: New file.
+
+Sat Jan 13 21:25:11 2007  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de> 
+
+	* lintold.awk, lintold.in, lintold.ok: New `--lint-old' test.
+	* Gentests, Makefile.am: Adjust. 
+
+Sat Jan 13 21:17:51 2007  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+
+	* Makefile.am (Maketests): Allow rebuilding from a VPATH build.
+
+Fri Jan 12 14:04:24 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (mtchi18n): new test.
+	* mtchi18n.awk, mtchi18n.in, mtchi18n.ok: new files.
+
+Wed Sep  6 02:09:26 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (mixed1): new test.
+	* mixed1.ok: new file.
+
+Tue Jun 20 05:37:53 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (devfd1, devfd2): new tests.
+	* devfd.in1, devfd.in2, devfd1.awk, devfd1.ok, devfd2.ok: new files.
+
+Sun Mar 12 23:48:31 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (concat4): new test.
+	* concat4.awk, concat4.in, concat4.ok: new files.
+
+Sun Mar 12 23:33:26 2006  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (subi18n): new test (from
+	KIMURA Koichi <kimura.koichi@canon.co.jp>).
+	* subi18n.awk, subi18n.ok: New files.
+
+Mon Dec 19 05:41:56 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (ovrflow1): new test.
+	* ovrflow1.awk, ovrflow1.ok: new files.
+
+Wed Dec 14 19:01:08 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (binmode1): new test.
+	* binmode1.ok: new file.
+
+Fri Oct  7 12:28:41 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fwtest): new test.
+	* fwtest.awk, fwtest.in, fwtest.ok: new files.
+
+Fri Aug 12 14:40:47 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (nofile): New test.
+	* nofile.ok: New file.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Sun Jul 10 18:31:45 2005  Scott Deifik       <scottd@amgen.com>
+
+	* regtest.sh: Changed to use diff instead of cmp for djgpp.
+	This addresses DOS vs. UNIX end-of-line issues.
+
+Thu Jun  9 23:40:14 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (Maketests): Don't use $< in rule, it breaks
+	on some non-GNU versions of make. Sigh.
+
+Wed Apr 27 22:22:05 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (longdbl): new test.
+	* longdbl.awk, longdbl.in, longdbl.ok: new files.
+
+Wed Feb  2 16:44:41 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (exitval2): new test.
+	* exitval2.awk, exitval2.ok: new files.
+
+Mon Jan 31 10:00:52 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (gnuops3): new test.
+	* gnuops3.awk, gnuops3.ok: new files.
+
+Wed Jan 19 18:04:40 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (hex): new test.
+	* hex.awk, hex.ok: new files.
+
+Sun Jan  9 11:53:09 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (strftime, igncras2, subamp): Use `GAWKLOCALE',
+	not `GAWK_LOCALE'. Grrr!
+
+Mon Jan  3 12:20:08 2005  William J. Poser   <wjposer@ldc.upenn.edu>
+
+	* Makefile.am (wjposer1): new test.
+	* wjposer1.awk, wjposer1.in, wjposer1.ok: new files.
+
+Mon Jan  3 11:55:48 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (rsstart1, rsstart2, rsstart3): new tests.
+	* rsstart1.in, rsstart1.awk, rsstart1.ok, rsstart2.awk,
+	rsstart2.ok, rsstart3.ok: new files.
+
+Sun Dec 19 17:31:48 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (gensub2): new test.
+	* gensub2.awk, gensub2.ok: new files.
+
+	Thanks to "John H. DuBois III" <spcecdt@armory.com>.
+
+Thu Dec  9 15:22:58 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fsspcoln): new test.
+	* fsspcoln.awk, fsspcoln.in, fsspcoln.ok: new files.
+
+Mon Nov 29 18:41:33 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Makefile.am (iobug1): new test.
+	* iobug1.awk, iobug1.ok: new files.
+
+Tue Sep 28 18:39:53 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* nondec.awk, nondec.ok: Add 00.34 as value to print, it should
+	not be treated as octal.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+Wed Jul 14 16:04:46 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (rstest6): new test.
+	* rstest6.awk, rstest6.in, rstest6.ok: new files.
+
+Tue Jul 13 10:53:32 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* strftlng: Use `$(CMP) ... >/dev/null 2>&1' instead of `-s'
+	for OS/2 and other systems that use `CMP = diff -a'.
+
+Mon Jun 14 18:44:39 2004  Pat Rankin  <rankin@pactechdata.com>
+
+	* longwrds.awk: allow caller the means to override SORT command.
+
+Tue Jun  8 14:12:52 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fordel, printfbad1): new tests.
+	* fordel.awk, fordel.ok: new files.
+	* printfbad1.awk, printfbad1.ok: new files.
+
+Mon Apr 19 20:29:52 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (manglprm): new test.
+	* manglprm.awk, manglprm.in, manglprm.ok: new files.
+
+Mon Feb 23 18:39:24 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* inftest.awk: Add loop limit per Nelson H.F. Beebe.
+	* Makefile.am (strftime): Use LC_ALL=C for `date' invocation.
+
+Thu Feb 12 02:08:15 2004  Stepan Kasal  <kasal@ucw.cz>
+
+	* Makefile.am (diffout): Use $(srcdir), when we are not building
+	in the source tree.
+
+Wed Feb 11 10:23:39 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (strcat1): new test.
+	* strcat1.awk, strcat1.ok: new files.
+
+Fri Feb  6 12:09:55 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (CLEANFILES): Added.
+
+Thu Feb  5 15:34:14 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (exitval1): new test.
+	* exitval1.awk, exitval1.ok: new files.
+
+Mon Feb  2 10:29:19 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (subamp): new test.
+	* subamp.awk, subamp.in, subamp.ok: new files.
+
+	* subamp, ignrcas2, strftime: Set GAWK_LOCALE, not LC_ALL.
+
+Wed Jan 14 15:28:34 2004  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (backw): new test.
+	* backw.awk, backw.in, backw.ok: new files.
+
+Mon Dec  1 10:29:22 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (concat3): new test.
+	* concat3.awk, concat3.ok: new files.
+
+Sun Nov  2 16:05:21 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (concat2): new test.
+	* concat2.awk, concat2.ok: new files.
+
+Wed Oct 29 13:35:37 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (subsepnm): new test.
+	* subsepnm.awk, subsepnm.ok: new files.
+
+Mon Sep 15 16:05:37 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (ignrcas2): new test.
+	* ignrcas2.awk, ignrcas2.ok: new files.
+
+Tue Sep  9 16:03:34 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (unterm): new test.
+	* unterm.awk, unterm.ok: new files.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+Fri Jul  4 11:12:07 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (poundbang2): Removed.
+	(poundbang): Added env var settings.
+
+Thu Jun 26 15:44:33 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (match2, whiny): new tests.
+	* match2.awk, match2.ok: new files.
+	* whiny.awk, whiny.ok: new files.
+
+Thu Jun 26 14:51:40 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: Use double quotes for sed invocation to make
+	life easier (eventually) for DOS version of Makefile.
+	* pipeio2.awk, pipio2.ok: Ditto.
+
+Wed Jun 18 12:32:14 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (AWK): Use LC_ALL=$${GAWKLOCALE:-C} and
+	same for LANG when running awk.  Provides sane locale for
+	tests with ability to override it if need be.
+	(all tests): Removed explicit setting of LC_ALL and LANG.
+	* Gentests: Ditto.
+
+Wed May 28 08:02:33 CEST 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* Makefile.am (uninit4): new test.
+	* uninit4.awk, uninit4.ok: new files.
+
+Wed May 28 06:30:23 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* Makefile.am (aryprm4 aryprm5 aryprm6 aryprm7 aryprm8 scalar uninit3):
+	new tests.
+	* aryprm4.awk aryprm4.ok aryprm5.awk aryprm5.ok aryprm6.awk aryprm6.ok,
+	aryprm7.awk aryprm7.ok aryprm8.awk aryprm8.ok scalar.awk scalar.ok,
+	uninit3.awk uninit3.ok: new files.
+
+Tue May 27 14:27:50 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* Makefile.am (aryprm1, aryprm2, aryprm3, sortempty): New tests.
+	* aryprm1.awk, aryprm1.ok, aryprm2.awk, aryprm2.ok: New files.
+	* aryprm3.awk, aryprm3.ok, sortempty.awk, sortempty.ok: dtto
+	* prmarscl.ok: The actual error message has changed.
+
+Tue May 27 08:23:51 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* arrayref3.ok, arrayref4.ok, fnaryscl.ok: Error messages reformatted.
+
+Sun Jun  8 17:18:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fmttest, strtonum, nested, gsubtst5, delarpm2): New tests.
+	* fmttest.awk, fmttest.ok: New files. From Nelson Beebe,
+	<beebe@math.utah.edu>.
+	* strtonum.awk, strtonum.ok: New files.
+	* nested.awk, nested.in, nested.ok: New files.
+	* gsubtst5.awk, gsubtst5.in, gsubtst5.ok: New files.
+	* delarpm2.awk, delarpm2.ok: New files. (Also from Nelson Beebe.)
+
+	* switch2.awk: Currently unused test for switch code.
+
+Wed May 14 16:49:53 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Gentests: Add LC_ALL=C LANG=C to generated tests.
+	* Makefile.am: All other manual tests: ditto.
+
+Sun May 11 15:27:55 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* Makefile.am (rsnulbig, rsnulbig2): New tests.
+	* rsnulbig.ok, rsnulbig2.ok: New files.
+
+Sun May 11 15:00:20 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (arrayprm2, arrayprm3, arryref2, arryref3, arryref4,
+	arryref5, rstest3, rstest4, rstest5): New tests.
+	* arrayprm2.awk, arrayprm2.ok, arrayprm3.awk, arrayprm3.ok, arryref2.ok,
+	arryref3.ok, arryref4.ok, arryref5.ok, rstest3.awk, rstest3.ok, rstest4.awk,
+	rstest4.ok, rstest5.awk, rstest5.ok: New files.
+
+Sun May 11 12:20:59 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* strftime.awk: Remove seconds from input and strftime output,
+	to decrease chance of failing on second boundary.
+	* Makefile.am (strftime): Tweak message appropriately.
+
+Tue Mar 25 08:35:42 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fnarray2): New test.
+	* fnarray2.awk, fnarray2.ok: New files.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Wed Mar 19 14:00:00 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (synerr1): New test.
+	* synerr1.awk, synerr1.ok: New files.
+
+Tue Mar  4 10:32:23 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (clean): Remove `core*' for modern Linux which
+	drops core in `core.PID' files.
+
+2003-02-17  Jim Meyering  <jim@meyering.net>
+
+	* Makefile.am (check): Don't depend on the pass-fail rule that
+	reports any failures.  Otherwise, for `make -j' that rule's commands
+	could run before all tests had completed, resulting in spurious
+	failures or potentially, even unreported failures.  Instead, just
+	`$(MAKE) pass-fail'.
+
+Sun Feb  9 11:48:32 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: Moved `space' into UNIX_TESTS. Breaks in
+	MS environments.
+
+Tue Feb  4 14:28:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	All relevant files: Copyright year updated to 2003.
+
+Tue Feb  4 12:22:41 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (fnmisc): New test case.
+	* fnmisc.awk, fnmisc.ok: New files.
+
+Sun Feb  2 15:33:33 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* getline3.awk, getline3.ok: Renamed from getline2.awk, getline2.ok
+	* Makefile.am (getline, getline2): getline renamed to getline2,
+	new test under the name getline.
+	* getline.awk, getline.ok, getline2.awk, getline2.ok:
+	rename getline.* getline2.*; new files getline.* .
+	* getline.awk, getline.ok: add tests for ``cmd | getline ''
+	* Makefile.am (printf0): New test.
+	* printf0.awk, printf0.ok: New files.
+	* fnarray.ok: The error message has changed.
+
+Thu Jan 30 15:32:56 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* Makefile.am (splitarr, getline2, inputred, prec): New tests.
+	* splitarr.awk, splitarr.ok: New files.
+	* getline2.awk, getline2.ok: New files.
+	* inputred.awk, inputred.ok: New files.
+	* prec.awk, prec.ok: New files.
+	* noeffect.awk: add second no-effect command; two error messages
+	should be generated.  Add some empty statements, to check that --lint
+	doesn't abort on them.
+
+Tue Jan 28 18:34:22 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* arrymem1.awk: Enhanced test.
+	* arrayme1.ok: Updated for new output
+
+Mon Jan 27 14:07:16 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* nfldstr.awk: Add tests for automatic number conversion.
+
+Mon Jan 27 12:25:41 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (asort, asorti, match1): New tests.
+	* match1.awk, match1.in: New files.
+	* asort.awk, asort.in: New files.
+	* asorti.awk, asorti.in: New files.
+
+Mon Jan 27 12:10:16 2003  Stepan Kasal  <kasal@math.cas.cz>
+
+	* strtod.awk, strtod.in, strtod.ok: Added test for 0e0 and similar.
+
+Sun Jan 26 16:49:41 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (zeroe0): New test.
+	* zeroe0.awk, zeroe0.in: New files.
+
+Thu Jan  2 11:09:12 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* parseme.ok, noparms.ok: Revised for bison 1.875.
+
+Tue Dec 31 16:54:44 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: (poundbang): Fix code.
+	(efence): New target to remove _* files run with Electric Fence
+	but that are otherwise OK.
+
+Thu Dec 26 16:44:37 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (poundbang): Add code to handle systems with limits on
+	paths for #! files.
+
+Mon Dec  9 14:20:44 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	* Makefile.am (space): New test: ``gawk -f " " file'' should try
+	to include file ` '.
+
+Sun Nov 17 21:47:11 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (manyfiles): Reference $(srcdir)/$@.ok so can build
+	and test in a different directory.
+
+Sun Nov  3 14:47:59 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Move tests with inline input and/or programs into separate files so can let
+	Gentests do more work. Per Nelson Beebe, just print the name of each test.
+
+	* Makefile.am (fstabplus, longwrds, fieldwdth, ignrcase, posix, rs, fsbs):
+	removed targets so will be generated by Gentests.
+	(negexp, resplit, childin, back89, nfldstr, nondec): ditto.
+	* Gentests: print name of test, make cmp not echo by prefixing with @.
+	* fstabplus.in: new file.
+	* fieldwdth.awk, fieldwdth.in: new files.
+	* ignrcase.awk, ignrcase.in: new files.
+	* longwrds.awk: send output to sort instead of letting makefile do it.
+	* longwrds.in: renamed from manpage.
+	* posix.in: new file.
+	* manyfiles.ok: new file.
+	* rs.awk: new file.
+	* fsbs.awk: new file.
+	* negexp.awk: new file.
+	* resplit.awk, resplit.in: new files.
+	* childin.awk, childin.in: new files.
+	* back89.awk: new file.
+	* nfldstr.awk, nfldstr.in: new files.
+
+Sun Nov  3 14:37:39 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (uninit2): new test case, requires lint.
+	* uninit2.awk, uninit2.ok: new files.
+
+Fri Nov  1 11:34:45 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (nondec): Always run this test.
+
+Tue Oct 29 10:40:47 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Added Gentests to list of files
+	to distribute.
+
+Mon Oct 28 15:36:42 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (icasers, icasefs, rstest1, rstest2): new test cases.
+	(argarray): Remove argarray.in if not in srcdir.
+	* icasers.awk, icasers.in, icasers.ok: new files.
+	* icasefs.awk, icasefs.ok: new files.
+	* rstest1.awk, rstest1.ok: new files.
+	* rstest2.awk, rstest2.ok: new files.
+
+Mon Oct 28 12:25:25 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	* Makefile.am (uninitialized): New test.
+	* uninitialized.awk, uninitialized.ok: New files.
+
+Mon Oct 28 11:24:16 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	* Gentests: new script
+	* Maketests: new file, generated automatically by Gentests
+	* Makefile.am: new rules and variables to make use of Gentests;
+	Most targets removed, Gentests will take care.
+
+Sun Oct 13 16:58:07 2002  Stepan Kasal  <kasal@math.cas.cz>
+
+	* Makefile.am (nfneg): new test case.
+	* nfneg.awk, nfneg.ok: new files.
+
+Mon Oct  7 09:38:07 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (noloop1, noloop2): new test cases.
+	* noloop.awk, noloop1.in, noloop1.ok, noloop2.in, noloop2.ok:
+	new files.
+
+Tue Oct  1 18:28:40 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (poundbang): Rewrote rule to avoid problems
+	with hardcoding of /tmp pathname.
+	(poundbang.awk): Changed the way it works.
+	(poundbang.ok): Removed.
+
+Thu Sep  5 13:31:28 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (rebuf): new test case.
+	* rebuf.awk, rebuf.in, rebuf.ok: new files.
+
+Wed Aug 21 15:31:57 2002 Andreas Buening  <andreas.buening@nexgo.de>
+
+	* Makefile.am (AWKPROG): Add $(EXEEXT) macro.
+	(PATH_SEPERATOR): Removed.
+	(poundbag): Added $(EXEEXT) and use of ${TMPDIR-/tmp}.
+
+Wed Aug  7 13:47:09 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (nulrsend): new test case.
+	* nulrsend.awk, nulrsend.in, nulrsend.ok: new files.
+
+Sun Aug  4 00:25:23 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (gsubtst3, gsubtst4): new test cases.
+	* gsubtst3.awk, gsubtst3.ok, gsubtst4.awk, gsubtst4.ok: new files.
+
+Thu May  9 22:31:36 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (gsubtst2): new test case.
+	* gsubtest.awk, gsubtest.ok: Added new test.
+	* gsubtst2.awk, gsubtst2.ok: new files.
+
+Sun May  5 12:38:55 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: Minor mods to use LC_ALL=C so that checks will
+	use the English messages, not any translations.
+	(manyfiles): Fixed (hopefully) to leave a file around if the
+	test fails, so that we don't get a spurious "ALL TESTS PASSED"
+	message.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+Tue Apr 16 17:07:25 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (pass-fail): New target that prints an
+	`all passed' or `x tests failed' message, for use in
+	grep-ing build logs.
+	(check): Add pass-fail as last dependency.
+
+	Thanks to Nelson Beebe for the thought, beebe@math.utah.edu.
+
+Sun Mar 10 17:00:51 2002  Scott Deifik       <scottd@amgen.com>
+
+	* Makefile.am (strftime): Add TZ=GMT0 into environment, to
+	regularize things, esp. for some DJGPP systems.
+
+Mon Feb 18 14:55:19 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (longsub): new test case.
+	* longsub.awk, longsub.in, longsub.ok: new files.
+
+Wed Jan 23 15:03:36 2002  Andreas Buening    <andreas.buening@nexgo.de>
+
+	* Makefile.am (PATH_SEPARATOR): Added.
+	(awkpath): Make use of PATH_SEPARATOR.
+
+Wed Jan 23 14:50:38 2002 Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (concat1): new test case.
+	* concat1.awk, concat1.in, concat1.ok: new files.
+
+Mon Jan  7 22:21:25 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (forsimp): new test case.
+	* forsimp.awk, forsimp.ok: new files.
+
+Wed Dec 26 22:01:52 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (inftest): Add sed to fix case issues between
+	different libc versions. Ugh.
+
+Wed Dec 19 16:01:58 2001  Peter J. Farley III  <pjfarley@dorsai.org>
+
+	* Makefile.am (manyfiles): Also delete \15 in tr.
+
+Tue Dec 18 20:56:07 2001  Andreas Buening    <andreas.buening@nexgo.de>
+
+	* Makefile.am (nors): Add \15 to list of chars to delete so
+	test will run on OS/2 also.
+
+Thu Oct  4 18:34:49 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (membug1): new test case.
+	* membug1.awk, membug1.in, membug1.ok: new files.
+
+Thu Aug 23 14:04:10 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (minusstr): new test case.
+	* minusstr.awk, minusstr.ok: new files.
+
+Sat Aug  4 23:42:37 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (arrymem1): new test case.
+	(compare2): new test case.
+	(regtest): Make test work, use regtest.sh, not .awk.
+	* arrymem1.awk, arrymem1.ok: new files.
+	* compare2.awk, compare2.ok: new files.
+
+Mon Jul 23 17:32:03 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (onlynl): new test case.
+	* onlynl.awk, onlynl.in, onlynl.ok: new files.
+
+Wed Jun 13 18:12:43 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (ofmtfidl): new test case.
+	* ofmtfidl.awk, ofmtfidl.in, ofmtfidl.ok: new files.
+
+Sun Jun  3 13:04:44 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.0: Release tar file made.  And there was
+	rejoicing.
+
+Sun May  6 13:30:20 2001  Arnold Robbins  <arnold@skeeve.com>
+
+	* inftest.awk: Changed test to use < so that it will
+	work for MSC and DJGPP combination, per Scott Deifik.
+
+Tue Mar 20 11:09:51 2001  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (funsemnl): new test case.
+	* funsemnl.awk, funsemnl.ok: new files.
+
+Wed Mar  7 11:31:41 2001  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (leadnl): new test case.
+	* leadnl.awk, leadnl.in, leadnl.ok: new files.
+
+Tue Feb  6 18:08:15 2001  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (rebt8b1, rebt8b2): new test case.
+	* rebt8b1.awk, rebt8b1.ok: new files.
+	* rebt8b2.awk, rebt8b2.ok: new files.
+
+Sun Dec  3 15:36:41 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (gnuops2): New test case.
+	* gnuops2.awk, gnuops2.ok: New files, based on bug report from
+	Servatius.Brandt@fujitsu-siemens.com.
+
+Mon Nov 27 15:52:46 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* regx8bit.awk, regx8bit.ok: Updated to what should
+	work on all systems.
+
+Wed Nov 22 13:27:59 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (poundbang): Added some smarts for /tmp mounted
+	noexec.  Hopefully it'll even work.
+
+Tue Nov 14 17:45:02 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am: Added - to all cmp calls for consistency.
+
+Sun Nov 12 17:50:18 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (addcomma): new test case.
+	* addcomma.awk, addcomma.in, addcomma.ok: new files.
+
+Tue Nov  7 16:03:06 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (regx8bit, psx96sub): new test cases.
+	* regx8bit.awk, regx8bit.ok, psx96sub.awk, psx96sub.ok: new files.
+
+Sun Oct 22 12:09:43 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (shadow): new test case.
+	* shadow.awk, shadow.ok: new files.
+
+Tue Oct 17 10:51:09 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (arynasty): new test case.
+	* arynasty.awk, arynasty.ok: new files.
+
+Mon Oct  2 10:17:13 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (clsflnam): Add redirect of stderr.
+	* clsflnam.awk, clsflnam.ok: modified to reflect changed
+	semantics of close() for a non-open file. See ../ChangeLog.
+
+Sun Sep 24 16:46:29 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (nasty2): new test case.
+	* nasty2.awk, nasty2.ok: new files.
+
+Wed Sep 13 11:09:49 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (check): Added calls to new targets that
+	print messages.
+	(clos1way, basic-msg-start, basic-msg-end, unix-msg-start,
+	unix-msg-end, extend-msg-start, extend-msg-end): new targets.
+	* clos1way.awk, clos1way.ok: new files.
+
+Tue Sep 12 16:29:54 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (leaddig): new test case.
+	* leaddig.awk, leaddig.ok: new files.
+
+Wed Sep  6 14:09:15 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (strtod): new test case.
+	* strtod.awk, strtod.in, strtod.ok: new files.
+
+Mon Sep  4 09:33:28 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (octsub): new test case.
+	* octsub.awk, octsub.ok: new files.
+
+Sun Aug 13 12:37:16 2000  Arnold Robbins  <arnold@skeeve.com>
+
+	* Makefile.am (sort1, diffout): new test cases.
+	* sort1.awk, sort1.ok: new files.
+
+2000-02-15  Arnold Robbins  <arnold@skeeve.com>
+
+	* MOVED TO AUTOMAKE AND GETTEXT.
+	Just about every file touched.  Work done by Arno Peters.
+
+Wed May 19 15:41:41 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (datanonl,regeq,redfilnm): new test cases.
+	* datanonl.awk, datanonl.in, datanonl.ok: new files.
+	* regeq.awk, regeq.in, regeq.ok: new files.
+	* redfilnm.awk, redfilnm.in, redfilnm.ok: new files.
+
+Mon May 10 17:11:30 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (rsnul1nl): new test case.
+	* rsnul1nl.awk, rsnul1nl.in, rsnul1nl.ok: new files.
+
+Sun Apr 25 13:02:35 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (inetechu,inetecht,inetdayu,inetdayt,inet): new
+	tests, courtesy of Juergen Khars.
+	(paramtyp): new test for bug from Juergen.
+	* paramtyp.awk, paramtyp.in: new files.
+
+Sun Oct 25 23:11:46 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (ofmtbig,procinfs): new test cases.
+	* procinfs.awk, procinfs.ok: new files.
+	* ofmtbig.awk, ofmtbig.in, ofmtbig.ok: new files.
+
+Tue Oct 20 22:07:10 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (lint): new test case.
+	* lint.awk, lint.ok: new files.
+	* badargs.ok: updated output corresponding to change made to
+	main.c (see main ChangeLog).
+
+Tue May 26 20:39:07 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* pipeio2.awk: change "\'" to "'" to avoid new warning.
+
+Mon Mar 23 21:53:36 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (fnasgnm): new test case.
+	* fnasgnm.awk, fnasgnm.in, fnasgnm.ok: new files.
+
+Fri Mar 20 11:01:38 1998 Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (fnaryscl): new test case.
+	* fnaryscl.awk, fnaryscl.ok: new files.
+
+Mon Mar 16 15:23:22 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (splitdef): new test case.
+	* splitdef.awk, splitdef.ok: new files.
+
+Fri Sep 26 01:10:14 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (parseme): new test case.
+	* parseme.awk, parseme.ok: new files.
+
+Sun Sep 14 23:25:10 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (ofmts): new test case.
+	* ofmts.awk, ofmts.in, ofmts.ok: new files.
+
+Sun Aug 17 07:17:35 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (fsfwfs): new test case.
+	* fsfwfs.awk, fsfwfs.in, fsfwfs.ok: new files.
+
+Sun Jul 27 23:08:53 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (hsprint): new test case.
+	* hsprint.awk, hsprint.ok, printfloat.awk: new files.
+
+Thu Jul 17 20:07:31 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (ofmt): new test case.
+	* ofmt.awk, ofmt.in, ofmt.ok: new files.
+
+Sun Jun 22 16:17:35 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (nlinstr): new test case.
+	* nlinstr.awk, nlinstr.in, nlinstr.ok: new files.
+
+Wed Jun  4 13:18:21 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* pid.sh: send errors to /dev/null to toss warning about
+	using PROCINFO["pid"] etc. This test explicitly tests
+	the special files. It'll need changing in 3.2.
+
+Thu Apr 24 23:24:59 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (messages): remove special case if /dev/fd exists.
+	Finally.
+
+Mon Aug  7 15:23:00 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.6: Release tar file made.
+
+Thu Aug  3 17:51:56 2000  Arnold D. Robbins  <arnold@skeeve.com>
+	
+	* Makefile.in (nlstrina): new test case.
+	* nlstrina.awk, nlstrina.ok: new files.
+
+Tue Jul 11 14:22:55 2000  Arnold D. Robbins  <arnold@skeeve.com>
+	
+	* Makefile.in (fnparydl): new test case.
+	* fnparydl.awk, fnparydl.ok: new files.
+
+Fri Jun 30 22:00:03 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (arysubnm): new test case.
+	* arysubnm.awk, arysubnm.ok: new files.
+
+Sun Jun 25 15:08:19 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.5: Release tar file made.
+
+Wed Jun 14 13:17:59 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (getlnbuf): new test case.
+	* getlnbuf.awk, gtlnbufv.awk, getlnbuf.in, getlnbuf.ok: new files.
+
+Mon Jun  5 15:51:39 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* pipeio2.awk: Change use of tr to sed, fixes problems
+	on SCO OS5.
+	* pipeio2.ok: Updated to reflect use of sed.
+
+Tue May  2 13:28:04 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (strftime): moved test code into a separate
+	file for the PC guys.
+	* strftime.awk: new file.
+
+Mon Apr 10 15:58:13 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (longwrds): Add setting LC_ALL=C to sort
+	call to preserve traditional output.  (Theme from the
+	Twilight Zone plays eerily in the background...)
+
+Sun Apr  2 17:51:40 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (igncdym): new test case.
+	* igncdym.awk, igncdym.in, igncdym.ok: new files.
+
+Wed Mar  8 13:43:44 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (arynocls): new test case.
+	* arynocls.awk, arynocls.in, arynocls.ok: new files.
+
+Sun Feb  6 11:45:15 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (opasnidx): new test case.
+	* opasnidx.awk, opasnidx.ok: new files.
+
+Tue Feb  1 18:40:45 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (opasnslf): new test case.
+	* opasnslf.awk, opasnslf.ok: new files.
+
+Thu Jan 27 18:09:18 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (subslash): new test case.
+	* subslash.awk, subslash.ok: new files.
+
+Fri Nov 26 11:03:07 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (numindex): new test case.
+	* numindex.awk, numindex.in, numindex.ok: new files.
+
+Sun Oct 24 08:46:16 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (strftime): Add tweak for $NF that should
+	hopefully avoid cygwin problems with lack of timezone.
+
+Thu Jul 29 19:25:02 1999  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Makefile.in (fsmnam, fnamedat): new test cases.
+	* fsmnam.awk, fsmnam.ok: new files.
+	* fnamedat.awk, fnamedat.in, fnamedat.ok: new files.
+
+Wed Jun 30 16:14:36 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Release 3.0.4: Release tar file made.  This time for sure.
+
+Tue May 25 16:37:50 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (printf1): new test case.
+	* printf1.awk, printf1.ok: new files.
+
+Wed May 19 15:32:09 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* reg/*: moved exp and log tests to new `Obsolete' directory; they
+	would only succeed under SunOS 4.x.
+
+Mon May  3 11:53:33 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (gawk.extensions): removed `nondec' until the
+	associated features get documented in 3.1.
+
+Tue Nov  3 16:46:39 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (getnr2tm, getnr2tb): new test cases.
+	* getnr2tm.awk, getnr2tm.in, getnr2tm.ok: new files.
+	* getnr2tb.awk, getnr2tb.in, getnr2tb.ok: new files.
+
+Sun Nov  1 13:20:08 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (zeroflag): new test case.
+	* zeroflag.awk, zeroflag.ok: new files
+
+Wed Oct 28 18:44:19 1998  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (nasty): new test case.
+	* nasty.awk, nasty.ok: new files
+
+Sun Nov 16 20:08:59 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* gsubtest.awk, gsubtest.ok: fix for count of matches in gsub
+	from Geert.Debyser@esat.kuleuven.ac.be.
+
+Sun Nov 16 19:54:50 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Makefile.in (strftime): fix a typo (LANC -> LANG).
+
+Thu May 15 12:49:08 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.3: Release tar file made.
+
+Tue May 13 12:53:46 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (messages): more testing for OK failure on Linux.
+
+Sun May 11 14:57:11 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (nondec): new test case.
+	* nondec.awk, nondec.ok: new files.
+
+Sun May 11 07:07:05 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (prdupval): new test case.
+	* prdupval.awk, prdupval.in, prdupval.ok: new files.
+
+Wed May  7 21:54:34 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (delarprm): new test case.
+	* delarprm.awk, delarprm.ok: new files.
+
+Wed May  7 17:54:00 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (pid): several fixes from ghazi@caip.rutgers.edu.
+
+Tue May  6 20:28:30 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (strftime): Use the right locale stuff.
+	(clobber): don't need an input file.
+
+Thu Apr 24 22:24:42 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (pid): new test case, from jco@convex.com.
+	(specfile): removed test case, pid does it better.
+	* pid.awk, pid.ok, pid.sh: new files.
+	* specfile.awk: removed.
+
+Wed Apr 23 23:37:10 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (pipeio2): new test case.
+	* pipeio2.awk, pipeio2.ok, pipeio2.in: new files.
+
+Sun Apr 20 12:22:52 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (clobber): new test case.
+	* clobber.awk, clobber.ok: new files.
+
+Fri Apr 18 07:55:47 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* BETA Release 3.0.34: Release tar file made.
+
+Tue Apr 15 05:57:29 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (strftlng): More wizardry for bizarre Unix systems.
+	(nlfldsep): use program and input file, not shell script
+	(basic, unix-tests, gawk.extensions): moved specfile, pipeio1
+	and strftlng into unix-tests per Pat Rankin.
+	* nlfldsep.awk, nlfldsep.in: new files.
+	* nlfldsep.sh: removed.
+
+Wed Apr  9 23:32:47 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (funstack): new test case.
+	* funstack.awk, funstack.in, funstack.ok: new files.
+	* substr.awk: added many more tests.
+	* substr.ok: updated
+
+Wed Mar 19 20:10:21 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (pipeio1): new test case.
+	* pipeio1.awk, pipeio1.ok: new files.
+
+Tue Mar 18 06:38:36 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (noparm): new test case.
+	* noparm.awk, noparm.ok: new files.
+
+Fri Feb 21 06:30:18 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (reint): new test case.
+	* reint.awk, reint.in, reint.ok: new files.
+
+Wed Feb  5 18:17:51 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (fnarydel): new test case.
+	* fnarydel.awk, fnarydel.ok: new files.
+
+Sun Jan 19 17:06:18 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (nors): new test case.
+	* nors.ok: new file.
+
+Sun Jan 19 17:06:18 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (specfile, strftlng, nfldstr): new test cases.
+	* specfile.awk, strftlng.awk, strftlng.ok, nfldstr.ok: new files.
+
+Fri Dec 27 11:27:13 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (intest): new test case.
+	* intest.awk, intest.ok: new files.
+
+Wed Dec 25 11:25:22 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.2: Release tar file made.
+
+Tue Dec 10 23:09:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.1: Release tar file made.
+
+Thu Nov  7 09:12:20 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (splitvar): new test case.
+	* splitvar.awk, splitvar.in, splitvar.ok: new files.
+
+Sun Nov  3 10:55:50 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (nlfldsep): new test case.
+	* nlfldsep.sh, nlfldsep.ok: new files.
+
+Fri Oct 25 10:29:56 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* rand.awk: call srand with fixed seed.
+	* rand.ok: new file.
+	* Makefile.in (rand): changed to compare output with rand.ok.
+
+Sat Oct 19 21:52:04 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (tradanch): new test case.
+	* tradanch.awk, tradanch.in, tradanch.ok: new files.
+
+Thu Oct 17 21:22:05 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* tweakfld.awk: move `rm' out into Makefile.in.
+	* eofsplit.awk: fixed buggy code so won't loop forever.
+	* Makefile.in (all): add unix-tests.
+	(unix-tests): new target, has pound-bang, fflush, getlnhd.
+	(basic): removed fflush, getlnhd.
+	(tweakfld): added rm from tweakfld.awk.
+
+Sun Oct  6 22:00:35 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (back89): new test case.
+	* back89.in, back89.ok: new files.
+
+Sun Oct  6 20:45:54 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (splitwht): new test case.
+	* splitwht.awk, splitwht.ok: new files.
+
+Sun Sep 29 23:14:20 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (gsubtest): new test case.
+	* gsubtest.awk, gsubtest.ok: new files.
+
+Fri Sep 20 11:58:40 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (prtoeval): new test case.
+	* prtoeval.awk, prtoeval.ok: new files.
+
+Tue Sep 10 06:26:44 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (gsubasgn): new test case.
+	* gsubasgn.awk, gsubasgn.ok: new files.
+
+Wed Aug 28 22:06:33 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* badargs.ok: updated output corresponding to change made to
+	main.c (see main ChangeLog).
+
+Thu Aug  1 07:20:28 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (clean): remove out[123] files from `messages' test.
+	Thanks to Pat Rankin (rankin@eql.caltech.edu).
+
+Sat Jul 27 23:56:57 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (prt1eval): new test case.
+	* prt1eval.awk, prt1eval.ok: new files.
+
+Mon Jul 22 22:06:10 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (eofsplit): new test case.
+	* eofsplit.awk, eofsplit.ok: new files.
+
+Sun Jul 14 07:07:45 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (fldchgnf): new test case.
+	* fldchgnf.awk, fldchgnf.ok: new files.
+
+Tue May 21 23:23:22 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (substr): new test case.
+	* substr.awk, substr.ok: new files.
+
+Tue May 14 15:05:23 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (dynlj): new test case.
+	* dynlj.awk, dynlj.ok: new files.
+
+Sun May 12 20:45:34 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (fnarray): new test case.
+	* fnarray.awk, fnarray.ok: new files.
+
+Fri Mar 15 06:46:48 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (clean): added `*~' to list of files to be removed.
+	* tweakfld.awk (END): added to do clean up action.
+
+Thu Mar 14 16:41:32 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (mmap8k): new test case.
+	* mmap8k.in, mmap8k.ok: new files.
+
+Sun Mar 10 22:58:35 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (clsflnam): new test case.
+	* clsflnam.in, clsflnam.awk, clsflnam.ok: new files.
+	* tweakfld.awk: changed to have a fixed date.
+
+Thu Mar  7 09:56:09 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (tweakfld): new test case.
+	* tweakfld.in, tweakfld.awk, tweakfld.ok: new files.
+
+Sun Mar  3 06:51:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (getlnhd, backgsub) : new test cases.
+	* getlnhd.awk, getlnhd.ok: new files.
+	* backgsub.in, backgsub.awk, backgsub.ok: new files.
+
+Mon Feb 26 22:30:02 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (sprintfc): new test case.
+	* sprintfc.in, sprintfc.awk, sprintfc.ok: new files.
+	* gensub.awk: updated for case of no match of regex.
+
+Wed Jan 24 10:06:16 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Makefile.in (distclean, maintainer-clean): new targets.
+	(reindops): added test from Rick Adams (rick@uunet.uu.net).
+	(arrayparm, paramdup, defref, strftime, prmarscl, sclforin,
+	sclifin): Fix from Larry Schwimmer (schwim@cyclone.stanford.edu)
+	so that tests that are supposed to fail use `... || exit 0' to
+	cause a clean `make clean'.
+
+Wed Jan 10 22:58:55 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* ChangeLog created.
diff --git a/gawk-5.0.1/test/ChangeLog.1 b/gawk-5.0.1/test/ChangeLog.1
new file mode 100644
index 00000000000..389edc9a791
--- /dev/null
+++ b/gawk-5.0.1/test/ChangeLog.1
@@ -0,0 +1,2423 @@
+2019-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): New test: range2. Needs LC_ALL=C.
+	* range2.awk, range2.ok: New files.
+
+2019-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mbprintf5): Add a minus so that the tests
+	will keep going if this one fails.
+
+2019-03-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* badargs.ok: Update after code changes.
+
+2019-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nsprof2.ok, profile5.ok: Updated after code changes.
+
+2019-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXPECTED_FAIL_ZOS): New group of tests expected to
+	fail on ZOS.
+	(ZOS_FAIL): New macro set by autoconf.
+
+2019-02-22  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.in (EXPECTED_FAIL_MINGW):
+	* Makefile.am (EXPECTED_FAIL_MINGW): Remove readdir_test and
+	readdir_retest.
+
+2019-02-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): New test: dbugeval3.
+	* dbugeval3.awk, dbugeval3.in, dbugeval3.ok: New files.
+
+2019-02-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* timeout.awk, timeout.ok: Increase READ_TIMEOUT to 400 to increase
+	the scheduler margin of error from 100 ms to 200 ms to reduce the
+	likelihood of spurious test failures.
+
+2019-02-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile11.ok: Updated after code fix.
+	* Makefile.am (EXTRA_DIST): Add profile12 files, new test.
+	* profile12.awk, profile12.in, profil12.ok: New files.
+
+2019-02-05  Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* Makefile.am (EXPECTED_FAIL_DJGPP): Add randtest and symtab6
+	to the list.
+
+2019-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (symtab6): Fix the test's recipe.
+	Update copyright year.
+	* symtab6.ok: Adjust to have correct content.
+
+2019-01-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Use correct filenames for dfacheck test.
+	(symtab6, eofsrc1): Make tests work for out of tree builds.
+	* symtab6.ok, eofsrc1.ok: Update after change.
+
+2018-01-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* badargs.ok: Adjust after code changes.
+
+2018-01-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): New test: nsforloop.
+	* nsforloop.awk, nsforloop.ok: New files.
+
+2018-01-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nsprof2.ok: Adjust after code changes.
+
+2018-01-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): New test: nsfuncrecurse.
+	* nsfuncrecurse.awk, nsfuncrecurse.ok: New files.
+
+2019-01-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): New test: arraytype.
+	* arraytype.awk, arraytype.ok: New files.
+
+2018-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (inetdayt, inetdayu, inetecht, inetechu): Add
+	leading '-' so that if it fails tests keep going.
+
+2018-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inftest.ok: Updated after code changes.
+
+2018-12-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): New test: dfacheck1.
+	* dfacheck1.awk, dfacheck1.in, dfacheck1.ok: New files.
+
+2018-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nsprof2.awk: Add extra @namespace lines for testing.
+	* nsprof2.ok: Adjusted.
+
+2018-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nsprof2.awk, nsprof2.ok: Updated after code changes.
+
+2018-11-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile11.ok: Updated after code change.
+
+2018-11-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile11.awk: Disambiguate some comments.
+	* profile5.ok, profile11.ok: Updated after code change.
+
+2018-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile5.ok: Updated after code change.
+	* Makefile.am (GAWK_EXT_TESTS): New test, profile11.ok. Add
+	to the other relevant macros.
+	* profile11.awk, profile11.ok: New files.
+
+2018-11-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (GAWK_EXT_TESTS): Fix layout of the list.
+
+2018-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile5.ok: Updated after code change.
+
+2018-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* spacere.awk: Move setting of LC_ALL=C out to ...
+	* Makefile.am (spacere): ... here. Added test.
+	Per request from Eli Zaretskii to help porting to MinGW.
+
+	Unrelated:
+
+	* Makefile.am (EXTRA_DIST): New test: typedregex4.
+	* typedregex4.awk, typedregex4.ok: New files.
+
+2018-11-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile10.ok: Updated after code change.
+
+2018-10-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile0.ok: Updated after code change.
+
+2018-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (profile1): Add minus to ignore errors on final
+	step of the recipe.  Allows make to keep going.
+
+2018-09-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Maefile.am (EXTRA_DIST): New test: mpfrbigint2.
+	* mpfrbigint2.awk, mpfrbigint2.in, mpfrbigint2.ok: New files.
+
+2018-09-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Maefile.am (EXTRA_DIST): New test: trailbs.
+	* trailbs.awk, trailbs.in, trailbs.ok: New files.
+
+2018-09-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.in: Regenerated, using Automake 1.16.1.
+
+2018-08-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (fmtspcl): Disable test. It was causing too many
+	portability problems.
+
+2018-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add assignnumfield files.
+	* assignnumfield.awk, assignnumfield.in, assignnumfield.ok: New files.
+
+2018-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add arraysort2 files.
+	* arraysort2.awk, arraysort2.ok: New files.
+
+2018-07-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* back89.ok, funstack.ok, gsubtst5.ok: Update after code changes.
+	* lintwarn.ok: Ditto.
+
+2018-07-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fmtspcl.awk, fmtspcl.tok, numrange.ok: Revised after code changes
+	in gawk.
+	* fix-fmtscl.awk: New file.
+	* Makefile.am (fmtspcl.tok): Use fix-fmtscpl.awk instead of
+	inline program.
+
+2018-07-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fmtspcl.awk: Improve the formatting, add testing of uppercase
+	formats, fix a bug.
+	* fmtspcl.tok: Adjust for code changes.
+
+2018-06-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add files for numrange.
+	* numrange.awk, numrange.ok: New files.
+
+2018-05-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* noeffect.awk, noeffect.ok: Updated.
+
+2018-05-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add files for spacere.
+	* spacere.awk, spacere.ok: New files.
+
+2018-05-12  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.am (readfile): Fix a typo.
+
+2018-05-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readfile): Use $(srcdir)/Makefile.am as the
+	target to read and compare against. We hope this avoids
+	issues with CR/LF on Windows...
+
+2018-05-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (SORT): New variable, to improve consistency with
+	PC test suite.
+	(profile2): Use $(SORT) instead of literal "sort".
+	(msg): Use $(CMP) in message instead of literal "cmp".
+	Thanks to Eli Z. for the suggested changes.
+
+2018-05-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXPECTED_FAIL_MINGW): Per Eli Z., remove clos1way5.
+
+2018-04-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir0.awk: Handle symbolic links in the top level
+	source directory. (Useful if testing for PC where the PC
+	test makefile wants a gawk.exe to exist.)
+
+2018-04-24         Scott Deifik          <scottd.mail@sbcglobal.net>
+
+	* Makefile.am (EXPECTED_FAIL_MINGW): Add clos1way5.
+
+2018-04-24         Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* Makefile.am (EXPECTED_FAIL_DJGPP): Add mpfrsqrt.
+
+2018-04-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXPECTED_FAIL_MINGW): Remove fmtspcl and
+	and add readdir_retest.
+	(mbprintf5): Add checks for MinGW and DJGPP along with Cygwin.
+	Thanks to Scott Deifik for the report.
+	(nlstringtest): Redirect $(CMP) output to /dev/null. Not sure
+	why this is necessary but it seems to be.
+
+2018-04-22         Juan Manuel Guerrero  <juan.guerrero@gmx.de>
+
+	* Makefile.am (EXPECTED_FAIL_DJGPP): Add gnuops3, gnureops,
+	regx8bit and sigpipe1 to the list.
+
+2018-04-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readdir_retest): Use $(srcdir) to reference source
+	files so that out of tree builds can run make check. Thanks
+	to Juan Manuel Guerrero <juan.guerrero@gmx.de> for the report.
+
+2018-04-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXPECTED_FAIL_MINGW): Add clos1way6.
+	(readdir, fts): Move the 'echo $@' to be the first line.
+	(nonfatal1): Adapt inline awk script to work with MSYS too.
+	(charset-tests-all): Check for MinGW or DJGPP and just run
+	the tests if so, otherwise check for needed locales as
+	previously.
+
+2018-04-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nonfatal1.awk, nonfatal1.ok: Change to use 1.2.3.4.5
+	as the host. Thanks again to Mike Burkett <vidgizmo@gmail.com>.
+
+2018-04-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (NEED_TESTOUTCMP): New list of tests that need
+	a different cmp program.
+	(charasbytes): Add -v BINMODE=2.
+	(longwrds): Need an explicit recipe to have sort command.
+
+2018-04-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nonfatal1.awk, nonfatal1.ok: Add a bunch of bad characters
+	to the hostname so that ISPs who resove local:host don't
+	cause the test to time out instead of failing. Thanks to
+	Mike Burkett <vidgizmo@gmail.com> for the report.
+
+	Unrelated:
+
+	* Makefile.am (NEED_RE_INTERVAL): Spell the macro correctly.
+	(strftime): Pass -v DATECMD="$(DATE)" to match pc usage.
+
+2018-04-14         Manuel Collado       <m-collado@users.sourceforge.net>
+
+	* Makefile.am (readdir_retest): Add new test.
+	* readdir_retest.awk: New file.
+
+2018-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Gentests: Remove VMS stuff. It hasn't been used in years.
+	* Gentests.vms: Removed.
+	* Makefile.am (EXTRA_DIST): Remove Gentests.vms.
+	(regtest): Add an echo $@ and make last line start with @,
+	for consistency with other tests.
+
+2018-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Gentests: Add support tests that need --re-interval.
+	* Makefile.am (NEED_RE_INTERVAL): New list of tests.
+	(NEED_LOCALE_EN): Add reint2 to the list.
+	* gsubtst3.awk, leaddig.awk: Modified to support automating.
+
+	Unrelated: Start on being able to generate pc/Makefile.tst.
+	
+	* Makfile.am (EXPECTED_FAIL_DJGPP, EXPECTED_FAIL_MINGW):
+	New lists of test expected to fail on the given platforms.
+
+2018-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Gentests: Add support for tests that need a specific locale.
+	* Makefile.am (NEED_LOCALE_C, NEED_LOCALE_EN, NEED_LOCALE_JP,
+	NEED_LOCALE_RU): New lists of such tests.
+
+	Unrelated:
+
+	* Makefile.am: Add printing exit status to results for many
+	tests that lacked it. This makes the tests more consistent
+	with each other and with the auto-generated tests.
+
+2018-04-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (RUN_SHELL): List of tests that run a .sh file.
+	* Gentests: Add support for such tests.
+	* randtest.sh: Use $AWK, not $GAWK so it can be generated.
+
+	Unrelated:
+
+	* Makefile.am (clos1way): Use standard locale verbiage in
+	preparation for later automation of specialized locale tests.
+
+2018-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (manyfiles, pid): Use echo $@ to echo test name.
+	(EXTRA_DIST): Remove longdbl.* files.
+	(TESTS_WE_ARE_NOT_DOING_YET_FIXME_ONE_DAY): Removed.
+	* longdbl.awk, longdbl.in, longdbl.ok: Removed.
+
+2018-04-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Gentests: Add support for tests needing --debug and
+	--non-decimal-data.
+	* Makefile.am (NEED_DEBUG, NEED_NONDEC):  New macros.
+
+2018-04-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Gentests: Add support for tests needing --pretty-print.
+	Improve checking in the END rule.
+	* Makefile.am (NEED_PRETTY):  New macro.
+
+2018-04-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Gentests: Add special support for MPFR tests, tests needing
+	--posix and --traditional.
+	* Makefile.am (NEED_MPFR): Renamed from MPFR_TESTS.
+	(NEED_POSIX, NEED_TRADITIONAL): New groupings.  Removed related
+	individual recipes.
+	(GENTESTS_UNUSED): Updated.
+	* litoct.in, nonl.in: New files.
+
+2018-04-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add files for mpfrfield.
+	(MPFR_TESTS): Add mpfrfield.
+	* mpfrfield.awk, mpfrfield.in, mpfrfield.ok: New files.
+
+2018-03-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fwtest3.in, mmap8k.awk, mmap8k.ok, rsstart2.in: New files.
+	* Makefile.am (fwtest3, mmap8k, rsstart1, rsstart2): Remove manual
+	recipes, they can be autogenerated.
+	(errno): Note that manual recipe is needed as-is.
+	(clean-local): Don't remove mmap8k.ok.
+
+2018-03-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add tailrecurse.awk, tailrecurse.ok.
+	* tailrecurse.awk, tailrecurse.ok: New files.
+
+2018-03-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Update copyright year.
+
+2018-03-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add nlstringtest-nogettext.ok.
+	* (nlstringtest): Compare to nlstringtest-nogettext.ok first,
+	in case gawk was built without GNU gettext.
+	* nlstringtest-nogettext.ok: New file.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-02-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mtchi18n): Move into locale tests.
+	Thanks to Kiyoshi KANAZAWA <yoi_no_myoujou@yahoo.co.jp>
+	for the report.
+
+2018-02-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (uplus, mpfruplus): Add new tests.
+	* uplus.awk, uplus.ok, mpfruplus.ok: New files.
+
+2018-02-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (MPFR_TESTS): Sort tests and use backslash
+	continuation to get the full list. A HUGE thank you to
+	Eli Zaretskii <eliz@gnu.org> for the report.
+
+2018-02-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (AWK): Move LANGUAGE= to here instead of
+	having it in individual tests.
+
+2018-01-24         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* lintold.awk: Minor change to allow test to run on
+	32 bit VAX/VMS with out a floating overflow.
+
+2018-01-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pty2): Instead of sed, use simpler awk goop
+	to canonicalize the output from od. Thanks to Michal
+	Jaegermann for the tip.
+	* pty2.ok: Updated.
+
+2018-01-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (charset-tests-all): Add punctuation in the message.
+	(charset-msg-start): Add fr_FR.UTF-8 to list of desired locales,
+	reformat the message.
+	(isarrayunset): New test.
+	* isarrayunset.awk, isarrayunset.ok: New files.
+	* pty2: Add some sed goop to canonicalize the output of od;
+	this works around the Mac OS X od which produces different
+	output, avoiding a spurious test failure.
+
+2018-01-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (nlstringtest): New test.
+	* nlstringtest.awk, nlstringtest.ok, nlstringtest.po,
+	fr/LC_MESSAGES/nlstringtest.mo: New files. Thanks to
+	Bruno Haible <bruno@clisp.org> for the test.
+
+2018-01-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Thanks to Andrew Schorr for the basics of this test.
+
+	* Makefile.am (pty2): New test. 
+	* pty2.awk, pty2.ok: New files.
+
+2018-01-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Thanks to Nethox <nethox@gmail.com> for this test.
+
+	* Makefile.am (mpfrrndeval): New test. 
+	* mpfrrndeval.awk, mpfrrndeval.ok: New files.
+
+2017-12-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add numstr1 files.
+	* numstr1.awk, numstr1.ok: New files.
+
+2017-11-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add new tests setrec0 and setrec1.
+	(BASIC_TESTS): Add setrec0 and setrec1.
+	* setrec0.awk, setrec0.in, setrec0.ok: New files.
+	* setrec1.awk, setrec1.ok: New files.
+
+2017-11-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* badargs.ok: Updated after code change.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-10-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* forcenum.awk: Convert values manually to number and then
+	to string and remove leading sign, to avoid C library
+	differences across platforms. Thanks to Corinna Vinschen
+	for the report.
+	* forcenum.ok: Adjust for above change.
+
+2017-10-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fork.awk: Close the file in the parent after reading it.
+	* fork2.awk: Ditto.
+
+2017-10-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (randtest): Minor fix from Andreas for OS/2.
+
+2017-09-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (nonfatal1): New rule with postprocessing to remove
+	the platform-specific portion of the error message.
+	* nonfatal1.ok: Remove the platform-specific portion of the error
+	message.
+
+2017-09-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readdir): Add to message that test can fail on
+	a JFS filesystem also. Thanks to Nelson Beebe for the info
+	and suggestion.
+
+2017-08-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nonfatal1.ok: Update after code change.
+
+2017-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (testext): Fix spelling of testexttmp.txt.
+
+2017-08-21        Eli Zaretskii          <eliz@gnu.org>
+
+	* Makefile.am (testext): Remove testexttmp.txt.
+
+2017-08-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add aryunasgn files.
+	(arrdbg): Make test work on out-of-tree builds in order
+	to pass `make distcheck'.
+
+2017-08-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Sort and prettify the lists of tests.
+
+2017-08-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* badargs.ok: Update after code changes.
+
+	Unrelated:
+
+	* Makefile.am (aryunasgn): New test. 
+	* aryunasgn.awk, aryunasgn.ok: New files.
+
+2017-08-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Update copyright year.
+
+2017-07-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mprintf5): Put an @ on the echo statement.
+	Thanks to Hermann Peifer for the report.
+
+2017-07-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* inplace1.ok, inplace2.ok, inplace3.ok: Update after
+	adding license to inplace.awk.
+
+2017-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (nsbad_cmd, nsindirect1, nsindirect2): New tests.
+	* nsbad_cmd.ok, nsindirect1.awk, nsindirect1.ok, nsindirect2.awk,
+	nsindirect2.ok: New files.
+
+2017-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (nsbad): New test.
+	* nsbad.awk, nsbad.ok: New files.
+
+2017-07-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (inplace1, inplace2, inplace3): Update to use
+	inplace::suffix instead of INPLACE_SUFFIX.
+	* inplace1.ok, inplace2.ok, inplace3.ok: Update after code
+	changes.
+
+2017-07-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (eofsrc1): New test.
+	* eofsrc1a.awk, eofsrc1b.awk, eofsrc1.ok: New files.
+	* unterm.ok: Updated after code change.
+
+2017-07-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (nsprof2): New test.
+	* nsprof2.awk, nsprof2.ok: New files.
+
+2017-06-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (nsprof1): New test.
+	* nsprof1.awk, nsprof1.ok: New files.
+
+2017-06-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mbprintf5): Skip this test on Cygwin.
+
+2017-06-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile4.ok, profile5.ok, profile7.ok: Updated after code changes.
+	* profile7.awk: Added two more statements.
+
+2017-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mbprintf5): New test.
+	* mbprintf5.awk, mbprintf5.in, mbprintf5.ok: New files.
+
+2017-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* sourceplit.ok: Revise to match changed code.
+
+2017-05-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* fwtest8.ok: Fix field number in error message, thanks to a bug
+	report from Michal Jaegermann.
+
+2017-05-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (fwtest5, fwtest6, fwtest7, fwtest8): New tests.
+	* fwtest5.awk, fwtest5.in, fwtest5.ok, fwtest6.awk, fwtest6.in,
+	fwtest6.ok, fwtest7.awk, fwtest7.in, fwtest7.ok, fwtest8.awk,
+	fwtest8.in, fwtest8.ok: New files.
+
+2017-05-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* noeffect.awk, noeffect.ok: Updated after code change.
+
+2017-05-01         Aharon Robbins       <aharon.robbins@intel.com>
+
+	* Makefile.am (sourcesplit): New test.
+	* sourcesplit.ok: New file.
+	Thanks to Hermann Peifer for the report.
+
+	Unrelated:
+
+	* Makefile.am (charset-msg-start): Document that having
+	el_GR.iso88597 is helpful.
+
+2017-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* mpfrsqrt.awk: Add `@load intdiv'.
+	* dumpvars.ok, id.ok, symtab6.ok, symtab8.ok: Updated.
+
+2017-04-12         Manuel Collado        <m-collado@users.sourceforge.net>
+
+	* Makefile.am (fpat6): New test.
+	* fpat6.awk, fpat6.in, fpat6.ok: New files.
+	Check for the bug reported by Ed Morton in the bug-gawk mailing list.
+	* patsplit.ok: Updated to the new patsplit behavior.
+
+2017-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (memleak): New test.
+	* memleak.awk, memleak.ok: New files.
+
+2017-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fwtest4: Renamed from fwtest3.
+	* fwtest3: Renamed from fwtest2b.
+	* Makefile.am: Updated.
+
+2017-03-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (fwtest2b): Add new test of enhanced FIELDWIDTHS syntax.
+	* fwtest2b.awk, fwtest2b.ok: New files.
+
+2017-03-19         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (argarray): Always copy argarray.in to the local
+	directory as argarray.input instead of trying to figure out whether
+	$(srcdir) is the current directory.
+	* argarray.ok: Replace argarray.in with argarray.input.
+
+2017-03-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (readdir_test): New test to check whether get_record
+	field_width parsing is working by comparing the results from the
+	readdir and readdir_test extensions.
+	(SHLIB_TESTS): Add readdir_test.
+
+2017-02-21         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (mktime): New test.
+	* mktime.awk, mktime.in, mktime.ok: New files.
+
+2017-02-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (typeof5): New test.
+	* typeof5.awk, typeof5.in, typeof5.ok: New files.
+	Thanks to Andrew Schorr for part of the tests.
+
+2017-01-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (gensub3): New test.
+	* gensub3.awk, gensub3.in, gensub3.ok: New files.
+
+2017-01-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (strftfld): New test.
+	* strftfld.awk, strftfld.in, strftfld.ok: New files.
+
+2017-01-15         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (concat5): New test.
+	* concat5.awk, concat5.ok: New files.
+	Check for bug forwarded by Corinna Vinschen from Cygwin mailing list.
+
+2016-12-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* rwarray.awk: Check that strnum is recreated correctly.
+
+2016-11-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray.awk: Use typeof() to verify that typed regex is
+	created correctly upon reading.
+
+2016-11-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* rwarray.awk: Add a typed regex into the array before
+	writing it out and reading it back.
+
+2016-11-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add valgrind.awk to the list.
+
+2016-11-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* valgrind.awk: New file. Based on original valgrind-scan code.
+	Having it in a separate file makes it easier to adjust.
+	Commented out several checks that just produced false positives.
+	Add check for invalid read and write.
+	* Makefile.am (valgrind-scan): Use valgrind.awk.
+
+2016-11-04         Fabio Berton          <fabio.berton@ossystems.com.br>
+
+	* arrayind1.awk: Remove "#!/usr/local/bin/awk -f" as none of the
+	other awk scripts in the test suite have a hashbang.
+
+2016-10-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* mpfrmemok1.ok: Update after code change.
+
+2016-09-09         Norihiro Tanaka      <noritnk@kcn.ne.jp>
+
+	* Makefile.am (anchor): New test.
+	* anchor.awk, anchor.in, anchor.ok: New files.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-08-16         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (arrdbg): New test using adump.
+	(ARRAYDEBUG_TESTS): New test group requiring ARRAYDEBUG compilation.
+	(check): Add arraydebug-tests.
+	(arraydebug-tests): Check $(ARRAYDEBUG_TESTS) when compiled with
+	ARRAYDEBUG.
+	* arrdbg.awk: New test using adump to check array type.
+
+2016-08-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* intarray.awk, intarray.ok: Updated.
+
+2016-08-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Restore typed regexp tests.
+
+	* typeof1.awk, typeof1.ok: Adjusted.
+	* typeof3.awk, typeof3.ok: Adjusted.
+	* gsubind.awk, gsubind.ok: Adjusted.
+	* Makefile.am (TYPED_RE_TESTS): Removed.
+	(dbugtypedre1, dbugtypedre2, typedregex1, typedregex2,
+	typedregex3): Moved back into regular tests.
+
+2016-08-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Remove typed regexes until they can be done correctly.
+
+	* typeof1.awk, typeof1.ok: Adjusted.
+	* typeof3.awk, typeof3.ok: Adjusted.
+	* gsubind.awk, gsubind.ok: Adjusted.
+	* Makefile.am (TYPED_RE_TESTS): New macro to hold typed regexp tests.
+	(dbugtypedre1, dbugtypedre2, typedregex1, typedregex2,
+	typedregex3): Moved into it.
+
+2016-08-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (ignrcas3): Adjust to check that the el_GR.xxx locale
+	is present. Move it to extra tests so it's not run by default.
+
+2016-08-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (sortfor2): New test.
+	* sortfor2.awk, sortfor2.in, sortfor2.ok: New files.
+	Thanks Christian Schneider <software@chschneider.eu>
+	for the report.
+
+	Unrelated:
+
+	* Makefile.am (ignrcas3): New test.
+	* ignrcas3.awk, ignrcas3.ok: New files.
+	Based on test code from Norihiro Tanaka <noritnk@kcn.ne.jp>.
+
+	* Makefile.am (ignrcas4): New test.
+	* ignrcas4.awk, ignrcas4.ok: Andrew Schorr's files, renamed.
+
+2016-07-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (status-close): New test.
+	* status-close.awk, status-close.ok: New files.
+
+2015-06-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (ofmtstrnum): New test.
+	* ofmtstrnum.awk, ofmtstrnum.ok: New files.
+
+2016-07-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Remove clos1way6.ok2.
+	(close1way6): Removed test, it will be autogenerated back into
+	the right place.
+	* clos1way6.awk: Use gensub on ERRNO to force the right text.
+	Thanks to Andrew Schorr for the suggestion.
+	* clos1way6.ok2: Removed.
+
+2016-07-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (clos1way6): Add additional file to check result
+	against for 32 bit Solaris. Thanks to Dagobert Michelsen for
+	the report.
+	* clos1way6.ok2: New file.
+
+2016-07-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (apiterm, fldterm): New tests to make sure that we
+	are handling unterminated field string values properly.
+	* apiterm.awk, apiterm.in, apiterm.ok: New files.
+	* fldterm.awk, fldterm.in, fldterm.ok: New files.
+
+2016-07-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* forcenum.awk: We no longer need to force the strnum conversion,
+	since typeof now does this automatically.
+	* forcenum.ok: Change "number" to "strnum" for the numeric strings.
+	* rebuild.in: Change input to include a strnum.
+	* rebuild.ok: Update results.
+
+2016-07-04         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (arrayind3): New test.
+	* arrayind3.awk, arrayind3.ok: New files.
+
+2016-07-03         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (rebuild): New test.
+	* rebuild.awk, rebuild.in, rebuild.ok: New files.
+
+2016-07-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* arrayind1.awk, arrayind1.ok: Comment out prints to stderr to
+	avoid buffer flushing on obscure systems.
+	* dumpvars.ok, symtab6.ok, symtab8.ok: Update after code changes.
+
+2016-06-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* strnum2.ok: Fix results, since print for a strnum should not be
+	affected by OFMT or CONVFMT.
+
+2016-06-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* strnum2.awk, strnum2.ok: Improve test case to show both OFMT and
+	CONVFMT conversions.
+
+2016-06-20         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (strnum2): New test.
+	* strnum2.awk, strnum2.ok: New files.
+
+2016-06-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (subback): New test.
+	* subback.awk, subback.in, subback.ok: New files.
+	Thanks to Mike Brennan for the test.
+
+	Unrelated:
+
+	* Makefile.am (FAIL_CODE1): Update the list.
+
+2016-06-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (GAWK_EXT_TESTS): Add mixed1. Who knows
+	how long that's been broken...
+	* mixed1.ok: Adjust to match what the code produces.
+	Thanks to John E. Malmberg <wb8tyw@qsl.net> for the report.
+
+2016-06-13         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (forcenum, ignrcas3, intarray, lintexp, lintindex,
+	lintint, lintlength, lintset, mpfrstrtonum, mpgforcenum, printfchar,
+	strtonum1): New tests.
+	* forcenum.awk, forcenum.ok, ignrcas3.awk, ignrcas3.ok, intarray.awk,
+	intarray.ok, lintexp.awk, lintexp.ok, lintindex.awk, lintindex.ok,
+	lintint.awk, lintint.ok, lintlength.awk, lintlength.ok, lintset.awk,
+	lintset.ok, mpfrstrtonum.awk, mpfrstrtonum.ok, mpgforcenum.awk,
+	mpgforcenum.ok, printfchar.awk, printfchar.ok, strtonum1.awk,
+	strtonum1.ok: New files.
+
+2016-06-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symtab10.awk, symtab10.in, symtab10.ok: New files.
+	* Makefile.am (symtab10): New test.
+	Thanks to Hermann Peifer for the report.
+
+2016-06-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (hex2): New test.
+	* hex2.awk, hex2.in, hex2.ok: New files.
+
+2016-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (fsnul1): New test.
+	* fsnul1.awk, fsnul1.in, fsnul1.ok: New files.
+
+2016-05-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (arrayind2): New test.
+	* arrayind2.awk, arrayind2.ok: New files.
+	Thanks to Andrew J. Schorr <aschorr@telemetry-investments.com>.
+
+2016-05-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* arrayind1.awk: Flush writes to stderr. We hope this helps
+	with the MinGW version.
+
+2016-05-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (arrayind1): New test.
+	* arrayind1.awk, arrayind1.in, arrayind1.ok: New files.
+	* Makefile.am (sigpipe1): New test.
+	* sigpipe1.awk, sigpipe1.ok: New files.
+
+2016-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (rscompat): New test.
+	* rscompat.awk, rscompat.in, rscompat.ok: New files.
+
+2016-04-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pty1): Ignore errors.
+
+2016-04-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pty1): Really disable test on z/OS.
+
+2016-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* clos1way2.ok, clos1way3.ok, clos1way4.ok, clos1way5.ok: Update
+	after Eli's code changes.
+	* Makefile.am (pty1): Disable test on z/OS.
+
+2016-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* clos1way2.awk:
+	* clos1way3.awk:
+	* clos1way4.awk:
+	* clos1way5.awk: Use "&&" instead of ";" to chain commands, so
+	that it works with stock MS-Windows shells as well.
+	* clos1way2.ok: Adjust the error message to the change in command.
+
+2016-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* watchpoint1: Use $(srcdir) on input file so out-of-tree
+	builds can run the test suite.
+
+2016-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* clos1way2.ok, clos1way3.ok, clos1way4.ok: Updated after
+	code changes.
+
+2016-04-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (clos1way6): New test.
+	* clos1way6.awk, clos1way6.ok: New files.
+
+2016-04-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (clos1way2, clos1way3, clos1way4, clos1way5):
+	New tests.
+	* clos1way2.awk, clos1way2.in, clos1way2.ok, clos1way3.awk,
+	clos1way3.ok, clos1way4.awk, clos1way4.ok, clos1way5.awk,
+	clos1way5.ok: New files.
+	* clos1way2.awk: Add call to fflush() to test it too.
+	* clos1way2.ok: Updated after code change.
+
+2016-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile5.ok: Adjust after code changes.
+
+2016-03-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile5.ok, profile10.awk, profile10.ok: Adjust after code changes.
+
+2016-03-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile5.ok: Adjust after code changes.
+	* Makefile.am (profile10): New test.
+	* profile10.awk, profile10.ok: New files.
+
+2016-02-21         Nelson H.F. Beebe     <beebe@math.utah.edu>
+
+	* rand.ok: Updated after code change.
+
+2016-02-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile2.ok, profile5.ok: Adjust after code changes.
+
+2016-02-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* badargs.ok: Update after adding Yet Another Command Line Option.
+
+2016-01-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add profile9.awk and profile9.ok.
+
+2016-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (aryprm9): New test.
+	* aryprm9.awk, aryprm9.ok: New files.
+
+	Unrelated:
+
+	* ChangeLog: Remove spurious whitespace.
+
+2015-12-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	These came in from gawk-4.1-stable:
+
+	* Makefile.am (profile8): New test.
+	* profile8.awk, profile8.ok: New files.
+
+	These used to be profile8:
+
+	* Makefile.am (profile9): Renamed.
+	* profile9.awk, profile9.ok: Renamed files.
+
+2015-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (watchpoint1): New test.
+	* watchpoint1.awk, watchpoint1.in, watchpoint1.ok,
+	watchpoint1.script: New files.
+
+2015-10-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (nulinsrc): New test.
+	* nulinsrc.awk, nulinsrc.ok: New files.
+
+2015-10-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* id.awk: Sort the output. Helps on z/OS.
+	* id.ok: Adjust.
+
+2015-10-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readbuf): New test.
+	* readbuf.awk, readbuf.ok: New files.
+
+2015-09-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (muldimposix): New test.
+	* muldimposix.awk, muldimposix.ok: New files.
+
+2015-09-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (fpat5): New test.
+	* fpat5.awk, fpat5.in, fpat5.ok: New files.
+
+2015-09-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile.ok: Updated after code change.
+
+2015-08-28	Daniel Richard G.	<skunk@iSKUNK.ORG>
+
+	* Makefile.am: Generate the Maketests file without
+	reference to its directory, because putting it directly into
+	srcdir can be problematic (e.g. srcdir could be read-only).
+	(clean-local): Renamed from "clean", as Automake already defines
+	"clean" and warns us as much.
+
+2015-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* mbstr1.ok: Updated after code change.
+	* Makefile.am (mbstr2): New test.
+	* mbstr2.awk, mbstr2.in, mbstr2.ok: New files.
+
+2015-06-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dbugeval2, typedregex3): New tests.
+	* dbugeval2.awk, dbugeval2.in, dbugeval2.ok: New files.
+	* typedregex3.awk, typedregex3.ok: New files.
+	Thanks to Hermann Peifer for the reports.
+
+2015-06-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (typedregex2): New test.
+	* typedregex2.awk, typedregex2.ok: New files.
+	Thanks to Hermann Peifer for the report.
+
+2015-06-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dbugtypedre1): Renamed from dbugtypedre.
+	(dbugtypedre2): New test.
+	* dbugtypedre1.awk, dbugtypedre1.in, dbugtypedre1.ok: Renamed files.
+	* dbugtypedre2.awk, dbugtypedre2.in, dbugtypedre2.ok: New files.
+
+	Unrelated:
+
+	* id.ok: Update after code changes.
+
+	Unrelated:
+
+	* Makefile.am (getfile, dbugtypedre1, dbugtypedre2): Fixed to
+	work if building out of the source tree.
+
+	Unrelated:
+
+	* dbugtypedre1.ok, typedregex1.awk, typeof1.ok, typeof3.ok:
+	Update after code changes.
+
+2015-06-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (negtime): Fix out-of-tree test run.
+
+	Unrelated:
+
+	* Makefile.am (typeof3, typeof4): New tests.
+	* typeof2.awk, typeof2.ok, typeof3.awk, typeof3.ok: New files.
+
+	Unrelated:
+
+	* Makefile.am (dbugtypedre): New tests.
+	* dbugtypedre.awk, dbugtypedre.in, dbugtypedre.ok: New files.
+
+2015-06-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (typeof2): New test.
+	* typeof2.awk, typeof2.ok: New files.
+
+2015-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (gsubind, typedregex1, typeof1): New tests.
+	* gsubind.awk, gsubind.ok, typedregex1.awk, typedregex1.ok,
+	typeof1.awk, typeof1.ok: New files.
+
+2015-06-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* inplace1.ok, inplace2.ok, inplace3.ok: Update line number in error
+	messages, since inplace.awk changed a bit.
+
+2015-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* checknegtime.awk: New file.
+	* Makefile.am (negtime): Use checknegtime.awk to test results.
+	Should solve some problems with BSD and also MinGW.
+
+2015-05-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fts.awk: Really remove atime from the output.
+	This avoids spurious failures on heavily loaded systems.
+
+	* Makefile.am: Add list of needed locales to "inadequate locale
+	support" message.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-05-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dbugeval): Wrap in test for interactive terminal
+	to avoid Mac OS X failure. Thanks to Nelson H.F. Beebe for
+	the report.
+
+2015-05-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (rebrackloc): New test.
+	* rebrackloc.awk, rebrackloc.in, rebrackloc.ok: New files.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-04-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (inpref): New test.
+	* inpref.awk, inpref.in, inpref.ok: New files.
+
+2015-04-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (regexpbrack2): New test.
+	* regexpbrack2.awk, regexpbrack2.in, regexpbrack2.ok: New files.
+	Thanks to Nelson Beebe.
+
+2015-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (shadowbuiltin): New test.
+	* shadowbuiltin.awk, shadowbuiltin.ok: New files.
+
+2015-04-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* indirectbuiltin.awk: Add another test (gensub 3 args).
+	* indirectbuiltin.ok: Update good results.
+
+2015-04-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (negtime): New test.
+	* negtime.awk, negtime.ok: New files.
+
+2015-04-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fts.awk: Skip atime to avoid spurious timestamp
+	differences. Thanks to Nelson Beebe for pointing this out.
+	* Makefile.am (charset-all): Group the charset tests
+	inside a check for locale support. Thanks to Nelson Beebe
+	for finally motivating me to do this.
+	(charset-msg-start): Update test of message some.
+
+2015-04-08  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.am (mpfrmemok1): Use -p- for portability and
+	compatibility with pc/Makefile.tst.
+
+2015-04-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* id.ok, mpfrsqrt.awk: Update after rename of div() --> intdiv().
+
+2015-03-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (indirectbuiltin): New test.
+	* indirectbuiltin.awk, indirectbuiltin.ok: New files.
+
+2015-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Remove defvar test and reference to files; test
+	code moved into extension/testext.c.
+	* defvar.awk, defvar.ok: Removed.
+	* testext.ok: Updated.
+
+2015-03-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* id.ok: Update after fixes in code.
+
+2015-03-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add exitval3.awk and exitval3.ok.
+	(BASIC_TESTS): Add new test exitval3.
+	* exitval3.awk, exitval3.ok: New files.
+
+2015-03-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* inplace1.ok, inplace2.ok, inplace3.ok: Update error message line
+	numbers to reflect changes to inplace.awk.
+
+2015-03-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mpfrmemok1): New test.
+	* mpfrmemok1.awk, mpfrmemok1.ok: New files.
+
+2015-03-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (fpat4): New test.
+	* fpat4.awk, fpat4.ok: New files.
+
+2015-03-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nonfatal3.awk, nonfatal3.ok: Adjust for portability.
+	Thanks to Hermann Peifer for the report.
+
+2015-03-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* charasbytes.awk, ofs1.awk, range1.awk, sortglos.awk,
+	sortglos.in: Remove execute permission.
+
+2015-03-02         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* nonfatal1.awk: Do not print ERRNO, since the value appears to be
+	platform-dependent.  Instead, print (ERRNO != "").
+	* nonfatal1.ok: Update.
+
+2015-02-28         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add nonfatal3.{awk,ok}.
+	(GAWK_EXT_TESTS): Add nonfatal3.
+	* nonfatal1.awk: Replace "ti10/357" with "local:host/25", since
+	"local:host" should be a universally bad hostname due to the
+	invalid ":" character.
+	* nonfatal1.ok: Update.
+	* nonfatal3.{awk,ok}: New test for connecting to a TCP port where
+	nobody is listening.
+
+2015-02-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nonfatal1.ok: Update after code changes.
+	* id.ok: Updated after code change.
+
+2015-02-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add profile0.in which got forgotten
+	earlier. Ooops.
+
+2015-02-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (crlf): New test.
+	* crlf.awk, crlf.ok: New files.
+
+2015-02-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (profile0): New test.
+	* profile0.awk, profile0.in, profile0.ok: New files.
+
+2015-02-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* nonfatal1.awk, nonfatal2.awk: String is now "NONFATAL".
+
+2015-02-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (nonfatal1, nonfatal2): New tests.
+	* nonfatal1.awk, nonfatal1.ok: New files.
+	* nonfatal2.awk, nonfatal2.ok: New files.
+
+2015-02-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (paramasfunc1, paramasfunc2): Now need --posix.
+	* indirectcall.awk: Restore after code change.
+
+2015-01-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (callparam, paramasfunc1, paramasfunc2): New tests.
+	* callparam.awk, callparam.ok: New files.
+	* paramasfunc1.awk, paramasfunc1.ok: New files.
+	* paramasfunc2.awk, paramasfunc2.ok: New files.
+	* exit.sh, indirectcall.awk: Update after code change.
+
+2015-01-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (profile8): Actually add the test and the files.
+	Thanks to Hermann Peifer for the report.
+
+2015-01-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (profile8): New test.
+	* profile8.awk, profile8.ok: New files.
+
+2015-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dumpvars): Grep out ENVIRON and PROCINFO since
+	those can be different depending on who runs the test.
+	* dumpvars.ok, id.ok: Updated after code changes.
+
+2015-01-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (regexpbrack): New test.
+	* regexpbrack.awk, regexpbrack.in, regexpbrack.ok: New files.
+
+	Unrelated:
+
+	* Makefile.am (printfbad4): New test.
+	* printfbad4.awk, printfbad4.ok: New files.
+
+	Unrelated:
+
+	* testext.ok: Adjust for code changes.
+
+2015-01-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add defvar.awk and defvar.ok.
+	(SHLIB_TESTS): Add defvar.
+	(defvar): New test.
+	* defvar.awk, defvar.ok: New files.
+
+2015-01-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add getfile.awk and getfile.ok.
+	(SHLIB_TESTS): Add getfile.
+	(getfile): New test.
+	* getfile.awk, getfile.ok: New files.
+
+2015-01-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add timeout.awk and timeout.ok.
+	(BASIC_TESTS): Remove errno.
+	(GAWK_EXT_TESTS): Add errno and timeout.
+	* timeout.awk, timeout.ok: New files.
+
+2015-01-05         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add errno.awk, errno.in, and errno.ok.
+	(BASIC_TESTS): Add errno.
+	(errno): New test.
+	* errno.awk, errno.in, errno.ok: New files.
+
+2014-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (badbuild): New test.
+	* badbuild.awk, badbuild.in, badbuild.ok: New files.
+
+2014-12-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (check): If tests don't pass, run 'make diffout'
+	and exit 1. Should help distros to notice when they have built
+	gawk incorrectly. (Can you say "Fedora", boys and girls?)
+
+2014-12-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile5.ok: Updated after code changes.
+
+2014-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Gentests: Fix gensub call after adding warning.
+
+2014-11-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gensub2.ok: Update after code changes.
+
+2014-11-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (sortglos): New test.
+	* sortglos.awk, sortglos.in, sortglos.ok: New files.
+	Thanks to Antonio Columbo.
+
+2014-11-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* mbprintf4.awk: Add record and line number for debugging.
+	* mpprint4.ok: Adjust.
+
+2014-11-06         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* testext.ok: Add results from new test_get_file test.
+
+2014-11-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (profile7): New test.
+	(profile6): Add missing @ in front of gawk run.
+	* profile7.awk, profile7.ok: New files.
+
+2014-11-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (profile6): Actually run profiling. Should make test
+	output consistent with what's in master.
+	* profile6.ok: Updated.
+
+2014-10-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (profile6): New test.
+	* profile6.awk, profile6.ok: New files.
+
+2014-10-17         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (profile1, testext): Use explicit ./foo.awk to avoid
+	assumptions about AWKPATH in the environment.
+
+2014-10-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (charset-msg-start): Add a list of needed locales.
+	Suggested by Shaun Jackman <sjackman@gmail.com>.
+
+2014-10-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile2.ok, profile3.ok, profile4.ok, profile5.ok:
+	Adjusted after minor code change. Again.
+
+2014-10-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (genpot): New test.
+	* genpot.awk, genpot.ok: New files.
+
+2014-09-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.ok: Adjusted after minor code change.
+
+2014-09-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile2.ok, profile3.ok, profile4.ok, profile5.ok:
+	Adjusted after minor code change.
+
+2014-09-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* filefuncs.awk: Change to build directory instead of "..".
+	* Makefile.am (filefuncs): Pass in $(abs_top_builddir).
+
+2014-09-13         Stephen Davies        <sdavies@sdc.com.au>
+
+	* Makefile.am (profile4, profile5): Changes processing to not delete
+	the first two lines. This is no longer needed.
+	* profile4.ok, profile5.ok: Changed to suit new rules and comments.
+
+2014-09-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile2.ok, profile4.ok, profile5.ok: Update for new code.
+
+2014-09-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* functab4.awk: Changed to use stat instead of chdir since
+	/tmp isn't /tmp on all systems (e.g. Mac OS X). Thanks to
+	Hermann Peifer for the report.
+
+	Sort of related:
+
+	* indirectcall2.awk, indirectcall2.ok: New files.
+	* id.ok: Updated.
+
+2014-09-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile2.ok: Update after code improvement in profiler.
+	* functab4.ok: Update after making indirect calls of
+	extension functions work. :-)
+
+2014-08-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* badargs.ok: Adjust after revising text for -L option.
+
+2014-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ofs1.ok: Updated to match corrected behavior in gawk.
+
+2014-08-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mpfrsqrt): New test.
+	* mpfrsqrt.awk, mpfrsqrt.ok: New files.
+	Test from Katie Wasserman <katie@wass.net>.
+
+2014-07-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* printhuge.awk: Add a newline to output.
+	* printhuge.ok: Adjust.
+
+2014-07-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* badargs.ok: Adjust after correctly alphabetizing options.
+
+2014-07-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (printhuge): New test.
+	* printhuge.awk, printhuge.ok: New files.
+	Test from mail.green.fox@gmail.com.
+
+2014-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (profile1, profile4, profile5): Adjust for change to
+	--pretty-print option.
+
+2014-06-19         Michael Forney       <forney@google.com>
+
+	* Makefile.am (poundbang): Fix relative path of AWKPROG.
+
+2014-06-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dbugeval): Add leading @ to recipe. Ooops.
+
+2014-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (regnul1, regnul2): New tests.
+	* regnul1.awk, regnul1.ok, regnul1.awk, regnul2.ok: New files.
+
+2014-05-22         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* lintwarn.ok: Updated.
+
+2014-05-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Forgot dbugeval.ok. Ooops.
+
+2014-05-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dbugeval): New test.
+	* dbugeval.in, dbugeval.ok: New files.
+
+2014-05-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (rsglstdin): New test.
+	* rsglstdin.ok: New file.
+
+2014-05-09         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (rebuf): Force buffer size to 4096 via AWKBUFSIZE
+	environment variable.
+	(rsgetline): New test.
+	* rsgetline.awk, rsgetline.in, rsgetline.ok: New files.
+
+2014-04-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (charset-msg-start): Add a warning message that tests
+	may fail without adequate locale support, per request from
+	Nelson H.F. Beebe.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-04-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Prettify list of tests a little bit.
+
+2014-04-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add readfile2.ok. Oops.
+
+2014-03-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readfile2): New test.
+	* readfile2.awk, readfile2.ok: New files.
+
+2014-02-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* regrange.ok: Update after code improvements.
+
+2014-02-03         Stepan Kasal         <kasal@ucw.cz>
+
+	* strftime.awk: the default format uses %e, not %d (Introduced on
+	2014-01-16; the previous code mangled the output of command "date"
+	to match %d.) Remove the "mucking" for cygwin, it's obsolete and
+	incompatible with %e.
+
+2014-01-28         Eli Zaretskii        <eliz@gnu.org>
+
+	* strftime.awk: If DATECMD variable is non-empty, use it instead
+	of the literal "date" as the 'date'-like command.
+
+2014-01-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mpfrnegzero): New test.
+	* mpfrnegzero.awk, mpfrnegzero.ok: New files.
+
+2014-01-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readdir): Run ls commands outside the awk script.
+	* readdir0.awk: Read ls results from files. Helps with MinGW.
+	Thanks to Eli Zaretskii for the problem report.
+
+2014-01-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Quote instances of $(top_srcdir) also.
+
+2014-01-16         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (strftime): Remove comment about the race condition, since
+	this should be fixed.  And gawk now calls date inside the script.
+	* strftime.awk: Based on an idea from Pat Rankin, fix the race
+	condition by looping repeatedly over strftime/date/strftime until
+	the before and after strftime results match.  That should fix
+	the race condition where the seconds field might increment between
+	invocations.
+
+2014-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (split_after_fpat): New test.
+	* split_after_fpat.awk, split_after_fpat.ok,
+	split_after_fpat.in: New files.
+
+2013-12-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (ignrcas2): Change to use en_US.UTF-8; it
+	seems that plain en_US doesn't exist anymore. Thanks to
+	Richard Palo.
+
+2013-12-29         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* fts.awk: Adjust for VMS.
+	* rwarray.awk: Adjust for VMS.
+
+2013-12-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Remove instances of "" that were incorrect.
+	Thanks to Scott Deifik for the report.
+
+2013-12-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (fts): Add a check for Cygwin on NFS and print
+	a message, similar to that of IRIX. Per Corinna Vinschen.
+
+2013-11-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pipeio3): Removed test and reference to files.
+	It was too ful of race conditions to work reliably everywhere.
+	* pipeio3.awk, pipeio3.ok, pipeio3.ok2: Removed.
+
+2013-11-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir0.awk: Take argument which is directory to read.
+	* Makefile.am (readdir): Pass $(top_srcdir) to readdir0.awk.
+
+2013-11-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* readdir0.awk: Restore fix so that we do not fail on filesysystems
+	such as XFS where the dirent does not contain the file type.
+
+2013-11-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (ordchr2): Use --load instead of -l to make sure the
+	long option works properly.  Note that the readfile test still uses
+	the short version.
+	(include2): Use --include instead of -i to make sure that the long
+	option works properly.  Note that many other tests use the -i short
+	version.
+
+2013-11-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir0.awk: Use `ls -lan' to get numeric user and group ID
+	numbers. This keeps the number of fields correct and consistent, even
+	on systems (like, oh, say, Windows with Cygwin) where group names
+	can contain spaces.
+
+2013-11-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Solaris fixes.
+
+	* readdir0.awk: Run ls -afi and ls -la separately since POSIX
+	says that -f turns off -l. Thanks to Dagobert Michelsen
+	<dam@opencsw.org> for the report.
+	* Makefile.am (diffout): Don't use POSIX or bash-isms so that
+	it will work on Solaris. Sigh.
+
+2013-11-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (backsmalls2): New test.
+	(pipeio3): Check results against pipeio3.ok2 if
+	the first check fails.
+	* backsmalls2.awk, backsmalls2.ok: New files.
+	* pipeio3.ok2: New file. This is the results on PPC Mac OS X.
+
+2013-10-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pipeio3): Enhance test, again, to be more resilient
+	to variations in error messages produced by different Bourne shells
+	when a command is not found.  This time for Cygwin.
+
+	Unrelated:
+
+	(charasbytes): Translit any tabs to spaces. Should help on
+	some System V systems such as Solaris. We hope.
+
+	Unrelated:
+
+	(pass-fail): Exit non-zero if tests fail. Useful for buildbots.
+
+2013-10-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pipeio3): Enhance test to be more resilient to
+	variations in error messages produced by different Bourne shells
+	when a command is not found. Initially for Mac OS X.
+
+2013-10-17         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (pipeio3): New test.
+	* pipeio3.awk, pipeio3.ok: New files.
+
+2013-10-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (backbigs1, backsmalls1): New tests.
+	* backbigs1.awk, backbigs1.in, backbigs1.ok: New files.
+	* backsmalls1.awk, backsmalls1.in, backsmalls1.ok: New files.
+
+2013-10-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (badassign1): New test.
+	* badassign1.awk, badassign1.ok: New files.
+
+2013-09-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (randtest): New test.
+	* randtest.sh, randtest.ok: New files.
+	* rand.ok: Updated to reflect new results based on code change.
+
+2013-09-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Fix quoting for generation of Maketests file so
+	that it will happen correctly.
+
+	Unrelated:
+
+	* Makefile.am (nfloop): New test.
+	* nfloop.awk, nfloop.ok: New files.
+
+2013-08-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Quote $(srcdir) everywhere so that tests can run
+	in locations with spaces in their names (think Windows or Mac OS X).
+	* Gentests: Ditto for when creating Maketests file.
+
+2013-07-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* profile2.ok, profile5.ok: Update.
+
+2013-07-04         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mbprintf4): New test.
+	* mbprintf4.awk, mbprintf4.in, mbprintf4.ok: New files.
+	Test cases from Nethox <nethox@gmail.com>.
+
+2013-06-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (dfamb1): New test.
+	* dfamb1.awk, dfamb1.in, dfamb1.ok: New files.
+	Test case from Steven Daniels <stevendaniels88@gmail.com>.
+
+2013-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (clos1way): Move to here since Maketests gets
+	regenerated whenever Makefile.am is touched.
+
+2013-06-22	Eli Zaretskii  <eliz@gnu.org>
+
+	* Maketests (clos1way): Set LC_ALL=C, since clos1way.awk no longer
+	does.
+
+2013-06-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (exit2): New test.
+	* exit2.awk, exit2.ok: New files.
+
+2013-06-01  Eli Zaretskii  <eliz@gnu.org>
+
+	* clos1way.awk: Don't use features of POSIX shells, to allow this
+	test to work on Windows.
+
+	* beginfile2.sh: Leave one blank between the left quote and the
+	following slash.  Use non-absolute name for a non-existent file.
+	This is to avoid breakage on Windows due to MSYS transformation of
+	POSIX style /foo/bar absolute file names.
+
+	* beginfile2.ok: Adapt to changes in beginfile2.sh.
+
+2013-05-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (profile4, profile5): New tests.
+	* profile4.awk, profile4.in, profile5.awk, profile5.in: New files.
+
+2013-05-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (mpfr-tests, shlib-tests): Propagate Eli's changes
+	and comment of 2013-05-14 to here, so that they get passed into
+	Makefile.in whenever Makefile.am is modified.
+
+2013-05-14  Eli Zaretskii  <eliz@gnu.org>
+
+	* Makefile.in (mpfr-tests, shlib-tests): Add a blank character
+	between ' and /FOO/ in Gawk command lines, for the benefit of
+	testing under MSYS Bash.
+
+	* filefuncs.awk (BEGIN): Call 'stat' on gawkapi.o, not on gawk,
+	which does not exist on systems that produce gawk.exe.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2013-05-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symtab9.awk: Don't remove test file in END rule, breaks on Windows.
+	* Makefile.am (symtab9): Add explicit rule and remove test file file.
+
+2013-04-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (LOCALES): New variable split out from AWK.
+	(AWK): Adjust.
+	(next): Add LOCALES to the test so that it will pass everywhere.
+	Thanks to Juergen Kahrs for the report.
+
+2013-04-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Prettify the lists of tests.
+	(GENTESTS_UNUSED): Bring the list up to date.
+
+2013-03-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readdir): Add a check for GNU/Linux and NFS directory
+	and issue a warning if so.
+	(fts): Ditto for IRIX - can't check for NFS so just print the message.
+	(fnmatch.awk, fnmatch.ok): Improve portability.
+
+2013-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readdir): Add -a to ls options. -f does not
+	automatically mean -a on all systems.
+	* jarebug.sh: Send error output of locale to /dev/null in case
+	it doesn't exist.
+
+2013-03-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (colonwarn): New test.
+	* colonwarn.awk, colonwarn.in, colonwarn.ok: New files.
+
+2013-02-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* parseme.ok: Update after change in grammar. Now with new and
+	improved error message!
+
+2013-01-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Move functab4 into shlib tests, since it uses
+	@load. Thanks to Anders Wallin for the report.
+	(shlib-tests): Check --version output for "API" and run tests
+	if there.
+
+2013-01-31         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am: To decide whether to run MPFR tests, use the output
+	of gawk --version instead of the automake TEST_MPFR conditional (which
+	has now been removed from configure.ac).
+
+2013-01-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add all the mpfr test files. Duh.
+	(reginttrad): Use $(srcdir)/$@.awk. Double Duh.
+
+2013-01-27         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am: Add mpfr tests if MPFR is available.
+
+2013-01-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (reginttrad): New test.
+	* reginttrad.awk, reginttrad.ok: New files.
+
+2013-01-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	Fix tests to work with make diffout:
+
+	* rtlenmb.ok: New file.
+	* Makefile.am (clobber, mmap8k, rtlenmb): Tests adjusted.
+	(EXTRA_DIST): Add rtlenmb.ok.
+
+2013-01-15         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Gentests: Remove a debugging printf.
+
+2013-01-15         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (readdir): Try to protect against failure on filesystems
+	lacking type information by invoking readdir.awk before readdir0.awk
+	and passing the results of readdir to readdir0 for inspection.
+	* readdir0.awk: Analyze the results of the readdir extension.
+	If all file types are set to "u", we infer that this filesystem lacks
+	type information.
+
+2013-01-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (rand): Let Gentests create the test.
+	(fmtspcl): Add $(AWKFLAGS).
+	* Gentests: For MPFR tests, add $(AWKFLAGS) on the command line.
+	* mpfr-rand.ok: Updated.
+
+2013-01-14         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (symtab8): Use grep to remove FILENAME from the output
+	so the test will succeed when building outside the source tree.
+	* symtab8.ok: Remove FILENAME.
+
+2013-01-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* inplace.1.in, inplace.2.in, inplace.in, inplace1.1.ok, inplace1.2.ok,
+	inplace1.ok, inplace2.1.bak.ok, inplace2.1.ok, inplace2.2.bak.ok,
+	inplace2.2.ok, inplace2.ok, inplace3.1.bak.ok, inplace3.1.ok,
+	inplace3.2.bak.ok, inplace3.2.ok, inplace3.ok: New files.
+	* Makefile.am (EXTRA_DIST): Add new files.
+	(SHLIB_TESTS): Add inplace1, inplace2, and inplace3.
+	(inplace1, inplace2, inplace3): New tests.
+
+2012-12-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* assignconst.awk, assignconst.ok: Removed.
+	* Makefile.am (EXTRA_DIST): Removed assignconst.awk, assignconst.ok.
+	(SHLIB_TESTS): Removed assignconst.
+	(assignconst): Removed test.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (paramuninitglobal): New test.
+	* paramuninitglobal.awk, paramuninitglobal.ok: New files.
+	Thanks to John Haque.
+
+2012-12-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symtab9.awk, symtab9.ok: New files.
+	* Makefile.am (EXTRA_DIST): Add new files.
+	(symtab9): New test.
+	* symtab1.ok, testext.ok: Updated.
+
+2012-12-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symtab7.awk, symtab7.in, symtab7.ok, symtab8.awk, symtab8.in,
+	symtab8.ok: New files.
+	* Makefile.am (EXTRA_DIST): Add new files.
+	(symtab7, symtab8): New tests.
+	Thanks to Assaf Gordon <gordon@cshl.edu>.
+
+2012-11-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readdir): Add a 'this could fail message'.
+	* readdir.awk: Revise to match simplified behavior of the extension.
+
+2012-11-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (GAWK_EXTRA_TESTS): Move to sorted order of tests.
+
+2012-11-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symtab6.ok: Remove PROCINFO.
+	* Makefile.am (symtab6): Adjust recipe.
+
+2012-11-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symtab4.awk, symtab4.in, symtab4.ok, symtab5.awk, symtab5.in,
+	symtab5.ok, symtab6.awk: New files.
+	* Makefile.am (EXTRA_DIST): Add new files.
+	(symtab4, symtab5, symtab6): New tests.
+	Thanks to Assaf Gordon <gordon@cshl.edu>.
+
+2012-10-28         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* messages.awk, fts.awk: Adjusted so make diffout will work.
+	* Makefile.am (messages): Adjust to use standard failure test for
+	make diffout.
+
+2012-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* symtab1.awk: Adjust to not print ENVIRON and PROCINFO which won't
+	be the same as on the author's machine.
+	* lintwarn.ok: Adjust.
+
+2012-10-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add jarebug.sh.
+
+2012-10-11         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (readdir): Use $(top_srcdir) instead of `.'. Helps
+	when running the valgrind tests.
+
+2012-10-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.ok: Updated.
+
+2012-10-04         Akim Demaille         <akim@lrde.epita.fr>
+
+	Fix VPATH builds.
+
+	* Makefile.am (shlib-tests): config.h is in builddir.
+	(beginfile2): So is gawk itself.
+
+	* Makefile.am (functab1, functab2, functab3, functab4, id, symtab1,
+	symtab2, symtab3): New tests.
+	* functab1.awk, functab1.ok, functab2.awk, functab2.ok, functab3.awk,
+	functab3.ok, functab4.awk, functab4.ok, id.awk, id.ok, symtab1.awk,
+	symtab1.ok, symtab2.awk, symtab2.ok, symtab3.awk, symtab3.ok:
+	New files.
+
+2012-09-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* lintwarn.ok: Updated.
+
+2012-09-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.ok: Updated. Twice.
+
+2012-09-11         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (shlib-tests): Check if DYNAMIC is enabled and
+	only if so run the tests. A bit hacky. Needed at least for
+	z/OS.
+
+2012-09-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* readdir.awk: Change argument to readdir_do_ftype().
+
+2012-08-28         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add jarebug.sh.
+	(readdir): Use standard output filenames readdir.ok and _readdir
+	instead of readdir.out1 and readdir.out2.  The standard names are
+	required for the pass-fail and diffout rules to work correctly.
+	(clean): Remove readdir.ok
+
+2012-08-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (charasbytes): Revise test to canonicalize
+	whitespace. (For Mac OS X 10.5, at least.)
+	* charasbytes.ok: Updated.
+
+2012-08-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (revout, revtwoway): New tests.
+	* revout.awk, revout.ok, revtwoway.awk, revtwoway.ok: New files.
+
+2012-08-11         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add inchello.awk and incdupe[4-7].ok.
+	(GAWK_EXT_TESTS): Add incdupe[4-7].
+	(incdupe[4-7]): New tests to ensure that mixing -f with include
+	causes a fatal error.
+	* incdupe[4-7].ok, inchello.awk: New files.
+
+2012-08-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (fts): New test.
+	* fts.awk: New file.
+
+2012-07-30         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (assignconst): Use AWKPATH to get results that will
+	be consistent no matter where the test is run.
+	* assignconst.ok: Updated.
+
+2012-07-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readdir): New test.
+	* readdir0.awk, readdir.awk: New files.
+
+2012-07-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fnmatch.awk, fnmatch.ok: Portability updates.
+
+2012-07-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.ok: Update contents.
+
+2012-07-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (fnmatch): New test.
+	* fnmatch.awk, fnmatch.ok: New files.
+
+	* Makefile.am (assignconst): New test.
+	* assignconst.awk, assignconst.ok: New files.
+
+2012-06-28         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* time.awk: Avoid possibly throwing a spurious error by protecting
+	a race condition that depends on the order of expression evaluation.
+
+2012-06-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (rwarray): New test.
+	* rwarray.awk, rwarray.in, rwarray.ok: New files.
+
+2012-06-21         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.ok: Update contents.
+
+2012-06-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.ok: Update contents.
+
+2012-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* testext.ok: Update contents.
+
+2012-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (testext): New test.
+	(EXTRA_DIST): Add new file testext.ok.
+	(SHLIB_TESTS): Add testext.
+	(clean): Add testext.awk to the list.
+	* testext.ok: New file.
+
+2012-06-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (clean): Add fork.tmp.* to the list.
+
+2012-06-10         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add new files time.awk and time.ok.
+	(SHLIB_TESTS): Add time.
+	* time.awk, time.ok: New files.
+
+2012-05-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (clean): Add readfile.ok to list of files to removed.
+
+2012-05-26         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (readfile): Revert previous patch, and add comment
+	explaining that we need to create readfile.ok on failure so that
+	"make diffout" will work properly.
+	(ordchr.awk, ordchr.ok): Add more tests to catch type conversion
+	problems.
+
+2012-05-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (readfile): Don't copy the Makefile over readfile.ok
+	if there's a problem.
+
+2012-05-24         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (fmtspcl, include2, incdupe, incdup2, incdupe3): Fix
+	paths to work properly when built in another directory.
+
+2012-05-19         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add new files hello.awk, inclib.awk,
+	include.awk, include.ok, include2.ok, incdupe.ok, incdupe2.ok and
+	incdupe3.ok.
+	(GAWK_EXT_TESTS): Add include, include2, incdupe, incdupe2 and incdupe3.
+	(include2, incdupe, incdupe2, incdupe3): New tests.
+	* badargs.ok: Fix usage message to include new -i option.
+	* hello.awk, incdupe.ok, incdupe2.ok, incdupe3.ok, inclib.awk,
+	include.awk, include.ok, include2.ok: New files.
+
+2012-08-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (regexprange): New test.
+	* regexprange.awk, regexprange.ok: New files.
+
+2012-08-05         Arnold D. Robbins     <arnold@skeeve.com>
+
+	New test from Nelson Beebe.
+
+	* Makefile.am (ofs1): New test.
+	* ofs1.awk, ofs1.in, ofs1.ok: New files.
+
+2012-07-13         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (getline5): New test.
+	* getline5.awk, getline5.ok: New files.
+
+2012-06-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (charasbytes): New test.
+	* charasbytes.awk, charasbytes.in, charasbytes.ok: New files.
+
+2012-05-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* jarebug.sh: New file. Handles Mac OS X also.
+	* Makefile.am (jarebug): Use jarebug.sh to run the test.
+
+2012-05-16         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (jarebug): Remove leading `-' from $(CMP) line.
+
+2012-05-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (jarebug): Move to charset tests. Adjust to check
+	for existence of needed Japanese locale before running the test.
+
+2012-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (jarebug): New test.
+	* jarebug.awk, jarebug.in, jarebug.ok: New files.
+
+2012-04-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (VALGRIND): Set to empty to protect against random
+	values in the environment.
+
+2012-04-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (EXTRA_DIST): Add missing files fork.ok, fork2.ok
+	and ordchr2.ok.
+
+2012-04-08         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (AWK, PGAWK): Include new $(VALGRIND) variable in
+	command line (now passed in by top-level Makefile).
+
+2012-04-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (ordchr2, readfile): Fix so "make diffout" will work
+	properly.
+	* orchr2.ok: New file.
+
+2012-04-07         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (check): Add new shlib-tests target.
+	(SHLIB_TESTS): Add tests ordchr, ordchr2, fork, fork2, readfile and
+	filefuncs.
+	* ordchr.awk, ordchr.ok, fork.awk, fork.ok, fork2.awk, fork2.ok,
+	filefuncs.awk, filefuncs.ok: New files.
+
+2012-04-01         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* Makefile.am (valgrind-scan): Update to match modern valgrind output.
+
+2012-04-01         John Haque      <j.eh@mchsi.com>
+
+	* Makefile.am (mpfr-test): Add target for manual testing of MPFR
+	and GMP numbers.
+	* mpfrbigint.awk, mpfrexprange.awk, mpfrieee.awk, mpfrnr.awk,
+	mpfrrnd.awk, mpfrsort.awk: New tests.
+	(MPFR_TESTS): Add the new tests.
+	* mpfrnr.in, mpfrbigint.ok, mpfrexprange.ok, mpfrieee.ok, mpfrnr.ok,
+	mpfrrnd.ok, mpfrsort.ok: New files.
+	(AWK): Add AWKFLAGS; useful for testing with 'gawk -M' invocation.
+
+2012-02-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* fmtspcl-mpfr.ok, fnarydel-mpfr.ok, fnparydl-mpfr.ok,
+	rand-mpfr.ok: New files.
+	* Makefile.am (EXTRA_DIST): Add them.
+	(CHECK_MPFR): New list of files that have MPFR variant .ok file.
+	* Gentests: Deal with MPFR files by modifying the generated
+	comparison command.
+
+2011-12-26         John Haque      <j.eh@mchsi.com>
+
+	* badargs.ok: Adjust for new and changed command line options.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2012-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (printfbad3): New test.
+	* printfbad3.awk, printfbad3.ok: New files.
+
+2012-02-22         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (beginfile2, next): Set LC_ALL=C so that error
+	messages will be in English for comparison with .ok files.
+	Thanks to Jeroen Schot <schot@a-eskwadraat.nl>.
+
+2011-12-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (rri1): New test.
+	* rri1.awk, rri1.in, rri1.ok: New files.
+
+2011-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am: Rationalize the $(CMP) lines wherever possible.
+
+2011-10-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* beginfile2.sh: Use `...` instead of $(...) for broken systems
+	where /bin/sh doesn't support $(...).  Thanks to Nelson Beebe for
+	the report.
+
+2011-10-21         John Haque      <j.eh@mchsi.com>
+
+	* beginfile2.in, beginfile2.sh, beginfile2.ok: Adjust input file names.
+
+2011-10-21         Corinna Vinschen      <vinschen@redhat.com>
+
+	* Makefile.am (beginfile2): Adjust for running out of srcdir.
+	* beginfile2.sh: Same.
+
+2011-10-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (rtlen, rtlen01, rtlenmb): New tests.
+	* rtlen.ok, rtlen.sh, rtlen01.ok, rtlen01.sh: New files.
+	Thanks to Rogier <rogier777@gmail.com> as forwarded by
+	Jeroen Schot <schot@A-Eskwadraat.nl>.
+
+2011-08-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (beginfile2, fpat3, fwtest3): New tests.
+	* beginfile2.awk, beginfile2.in, beginfile2.ok: New files.
+	* fpat3.awk, fpat3.in, fpat3.ok: New files.
+	* fwtest3.awk, fwtest3.in, fwtest3.ok: New files.
+
+2011-08-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* pty1.awk, pty1.ok: New files.
+	* Makefile.am (pty1): New test.
+	(profile1, profile2, profile3): Use unique names for the profile
+	files to avoid problems with parallel 'make check'
+
+2011-07-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (next): Redirect output to output file!
+
+2011-07-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* sortu.awk, sortu.ok: Modified to make numeric comparison do
+	a stable sort.  Thanks to Peter Fales <Peter.Fales@alcatel-lucent.com>.
+	* backgsub.ok: Update for change in code.
+	* Makefile.am (posix2008sub): Add --posix to invocation.
+
+2011-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (getline4, gsubtst8): New tests.
+	* getline4.awk, getline4.in, getline4.ok: New files.
+	* gsubtst8.awk, gsubtst8.in, gsubtst8.ok: New files.
+
+2011-07-15         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (gsubtst7): New test.
+	* gsubtst7.awk, gsubtst7.in, gsubtst7.ok: New files.
+
+2011-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* Makefile.am (EXTRA_DIST): Add ChangeLog.0.
+	* 4.0.0: Remake the tar ball.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/test/Gentests b/gawk-5.0.1/test/Gentests
new file mode 100755
index 00000000000..78833f0f6d3
--- /dev/null
+++ b/gawk-5.0.1/test/Gentests
@@ -0,0 +1,313 @@
+#!/usr/bin/gawk -f
+
+# This program should generate Maketests
+
+BEGIN {
+	# read the list of files
+	for (i = 2; i < ARGC; i++)
+		files[ARGV[i]]
+
+	# throw it away
+	ARGC = 2
+
+	ntests = 0
+
+	Locale["C"] = "C"
+	Locale["EN"] = "en_US.UTF-8"
+	Locale["FR"] = "fr_FR.UTF-8"
+	Locale["GR"] = "el_GR.iso88597"
+	Locale["JA"] = "ja_JP.UTF-8"
+	Locale["RU"] = "ru_RU.UTF-8"
+}
+
+# process the file Makefile.am:
+
+/^[[:upper:]_]*_TESTS *=/,/[^\\]$/ {
+	gsub(/(^[[:upper:]_]*_TESTS *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		tests[++ntests] = $i
+	next
+}
+
+/^NEED_DEBUG *=/,/[^\\]$/ {
+	gsub(/(^NEED_DEBUG *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		debug[$i]
+	next
+}
+
+/^NEED_LINT *=/,/[^\\]$/ {
+	gsub(/(^NEED_LINT *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		lint[$i]
+	next
+}
+
+/^NEED_LINT_OLD *=/,/[^\\]$/ {
+	gsub(/(^NEED_LINT_OLD *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		lint_old[$i]
+	next
+}
+
+/^NEED_MPFR *=/,/[^\\]$/ {
+	gsub(/(^NEED_MPFR *=|\\$)/,"")
+	for (i = 1; i <= NF; i++) {
+		simple_mpfr[$i]
+		tests[++ntests] = $i
+	}
+	next
+}
+
+/^NEED_NONDEC *=/,/[^\\]$/ {
+	gsub(/(^NEED_NONDEC *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		nondec[$i]
+	next
+}
+
+/^NEED_PRETTY *=/,/[^\\]$/ {
+	gsub(/(^NEED_PRETTY *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		pretty[$i]
+	next
+}
+
+/^NEED_POSIX *=/,/[^\\]$/ {
+	gsub(/(^NEED_POSIX *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		posix[$i]
+	next
+}
+
+/^NEED_RE_INTERVAL *=/,/[^\\]$/ {
+	gsub(/(^NEED_RE_INTERVAL *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		re_interval[$i]
+	next
+}
+
+/^NEED_TRADITIONAL *=/,/[^\\]$/ {
+	gsub(/(^NEED_TRADITIONAL *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		traditional[$i]
+	next
+}
+
+/^NEED_SANDBOX *=/,/[^\\]$/ {
+	gsub(/(^NEED_SANDBOX *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		sandbox[$i]
+	next
+}
+
+/^GENTESTS_UNUSED *=/,/[^\\]$/ {
+	gsub(/(^GENTESTS_UNUSED *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+		unused[$i]
+	next
+}
+
+/^CHECK_MPFR *=/,/[^\\]$/ {
+	gsub(/(^CHECK_MPFR *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+	{
+		mpfr[$i]
+	}
+	next
+}
+
+# Tests needing a particular locale
+/^NEED_LOCALE_.* *=/,/[^\\]$/ {
+	if (/^NEED/)
+		cur_locale = gensub(/^NEED_LOCALE_([[:alnum:]]+).*/, "\\1", 1, $1)
+
+	gsub(/^NEED_LOCALE_.* *=|\\$/, "")
+	for (i = 1; i <= NF; i++) {
+		locale_tests[cur_locale][$i]
+		all_locale_tests[$i]
+ 	}
+}
+
+# Tests that fail on z/OS
+/EXPECTED_FAIL_ZOS *=/,/[^\\]$/ {
+	gsub(/(^EXPECTED_FAIL_ZOS *=|\\$)/,"")
+	for (i = 1; i <= NF; i++)
+	{
+		zos_fail[$i]
+	}
+	next
+}
+
+/^[[:alpha:]_][[:alnum:]_]*:/ {
+	# remember all targets from Makefile.am
+	sub(/:.*/,"")
+	targets[$0]
+}
+
+# Now write the output file:
+END {
+	# this line tells automake to keep the comment with the rules:
+	print "Gt-dummy:"
+	print "# file Maketests, generated from Makefile.am by the Gentests program"
+
+	for (i = 1; i <= ntests; i++) {
+		x = tests[i]
+		if (!(x in targets))
+			generate(x)
+	}
+
+	print "# end of file Maketests"
+}
+
+function generate_shell(x,	s)
+{
+	delete files[x".sh"]
+
+	s = ""
+	if (x".in" in files) {
+		s = "\"$(srcdir)\"/$@.in"
+		delete files[x".in"]
+	}
+
+	print x ":"
+	printf "\t@echo $@\n"
+
+	printf "\t@-$(LOCALES) AWK=\"$(AWKPROG)\" \"$(srcdir)\"/$@.sh %s > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@\n", s
+	printf "\t@-$(CMP) \"$(srcdir)\"/$@.ok _$@ && rm -f _$@\n\n"
+	
+}
+
+function generate(x,	s, i, locale_string)
+{
+	if (x".sh" in files)
+		return generate_shell(x)
+
+	if (!(x".awk" in files))
+		printf "WARNING: file `%s.awk' not found.\n", x > "/dev/stderr"
+	else
+		delete files[x".awk"]
+
+	print x ":"
+
+	s = ""
+	if (x in lint) {
+		s = s " --lint"
+		delete lint[x]
+	}
+	if (x in lint_old) {
+		s = s " --lint-old"
+		delete lint_old[x]
+	}
+	if (x in simple_mpfr) {
+		s = s " -M"
+		delete simple_mpfr[x]
+	}
+	if (x in posix) {
+		s = s " --posix"
+		delete posix[x]
+	}
+	if (x in traditional) {
+		s = s " --traditional"
+		delete traditional[x]
+	}
+	if (x in sandbox) {
+		s = s " --sandbox"
+		delete sandbox[x]
+	}
+	if (x in pretty) {
+		s = s " --pretty-print=_$@"
+		delete pretty[x]
+	}
+	if (x in debug) {
+		s = s " --debug"
+		delete debug[x]
+	}
+	if (x in nondec) {
+		s = s " --non-decimal-data"
+		delete nondec[x]
+	}
+	if (x in re_interval) {
+		s = s " --re-interval"
+		delete re_interval[x]
+	}
+	if (x".in" in files) {
+		s = s " < \"$(srcdir)\"/$@.in"
+		delete files[x".in"]
+	}
+
+	if (x in zos_fail) {
+		printf "\t@echo $@ $(ZOS_FAIL)\n"
+		delete zos_fail[x]
+	} else
+		printf "\t@echo $@\n"
+
+	# default is the leading tab and @
+	locale_string = "\t@"
+	if (x in all_locale_tests) {
+		delete all_locale_tests[x]
+		for (i in locale_tests) {
+			if (x in locale_tests[i]) {
+				locale_string = sprintf("\t@[ -z \"$$GAWKLOCALE\" ] && GAWKLOCALE=%s; export GAWKLOCALE; \\\n\t", Locale[i])
+				delete locale_tests[i][x]
+				break
+			}
+		}
+	}
+
+	if (x in mpfr) {
+		delete mpfr[x]
+		printf "%s", locale_string
+		printf "AWKPATH=\"$(srcdir)\" $(AWK) $(AWKFLAGS) -f $@.awk %s >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@\n", s
+		printf "\t@-if test -z \"$$AWKFLAGS\" ; then $(CMP) \"$(srcdir)\"/$@.ok _$@ && rm -f _$@ ; else \\\n"
+		printf "\t$(CMP) \"$(srcdir)\"/$@-mpfr.ok _$@ && rm -f _$@ ; \\\n"
+		printf "\tfi\n\n"
+	} else {
+		printf "%s", locale_string
+		printf "AWKPATH=\"$(srcdir)\" $(AWK) -f $@.awk %s >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@\n", s
+		printf "\t@-$(CMP) \"$(srcdir)\"/$@.ok _$@ && rm -f _$@\n\n"
+	}
+}
+
+END {
+	for (x in lint)
+		if (!(x in targets))
+			printf "WARNING: --lint target `%s' is missing.\n", x > "/dev/stderr"
+	for (x in lint_old)
+		if (!(x in targets))
+			printf "WARNING: --lint-old target `%s' is missing.\n", x > "/dev/stderr"
+	for (x in simple_mpfr)
+		if (!(x in targets))
+			printf "WARNING: -M target `%s' is missing.\n", x > "/dev/stderr"
+	for (x in posix)
+		if (!(x in targets))
+			printf "WARNING: --posix target `%s' is missing.\n", x > "/dev/stderr"
+	for (x in traditional)
+		if (!(x in targets))
+			printf "WARNING: --traditional target `%s' is missing.\n", x > "/dev/stderr"
+	for (x in sandbox)
+		if (!(x in targets))
+			printf "WARNING: --sandbox target `%s' is missing.\n", x > "/dev/stderr"
+	for (x in pretty)
+		if (!(x in targets))
+			printf "WARNING: --pretty-print target `%s' is missing.\n", x > "/dev/stderr"
+	for (x in debug)
+		if (!(x in targets))
+			printf "WARNING: --debug target `%s' is missing.\n", x > "/dev/stderr"
+	for (x in nondec)
+		if (!(x in targets))
+			printf "WARNING: --non-decimal-data target `%s' is missing.\n", x > "/dev/stderr"
+
+	for (x in re_interval)
+		if (!(x in targets))
+			printf "WARNING: --re-interval target `%s' is missing.\n", x > "/dev/stderr"
+	for (x in locale_tests)
+		for (y in locale_tests[x])
+			if (!(y in targets))
+				printf("WARNING: Locale `%s' target `%s' is missing.\n", x, y) > "/dev/stderr"
+
+	for (x in files)
+		if (!(x in unused) && \
+		    !(gensub(/\.(awk|in|sh)$/,"",1,x) in targets))
+			printf "WARNING: unused file `%s'.\n", x > "/dev/stderr"
+}
diff --git a/gawk-5.0.1/test/Makefile.am b/gawk-5.0.1/test/Makefile.am
new file mode 100644
index 00000000000..3db7c04dbcb
--- /dev/null
+++ b/gawk-5.0.1/test/Makefile.am
@@ -0,0 +1,2361 @@
+#
+# test/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 1988-2019 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+
+## process this file with automake to produce Makefile.in
+
+EXTRA_DIST = \
+	reg \
+	lib \
+	ChangeLog.0 \
+	ChangeLog.1 \
+	Gentests \
+	Maketests \
+	README \
+	aadelete1.awk \
+	aadelete1.ok \
+	aadelete2.awk \
+	aadelete2.ok \
+	aarray1.awk \
+	aarray1.ok \
+	aasort.awk \
+	aasort.ok \
+	aasorti.awk \
+	aasorti.ok \
+	addcomma.awk \
+	addcomma.in \
+	addcomma.ok \
+	anchgsub.awk \
+	anchgsub.in \
+	anchgsub.ok \
+	anchor.awk \
+	anchor.in \
+	anchor.ok \
+	apiterm.awk \
+	apiterm.in \
+	apiterm.ok \
+	argarray.awk \
+	argarray.in \
+	argarray.ok \
+	argtest.awk \
+	argtest.ok \
+	arrayind1.awk \
+	arrayind1.in \
+	arrayind1.ok \
+	arrayind2.awk \
+	arrayind2.ok \
+	arrayind3.awk \
+	arrayind3.ok \
+	arrayparm.awk \
+	arrayparm.ok \
+	arrayprm2.awk \
+	arrayprm2.ok \
+	arrayprm3.awk \
+	arrayprm3.ok \
+	arrayref.awk \
+	arrayref.ok \
+	arraysort.awk \
+	arraysort.ok \
+	arraysort2.awk \
+	arraysort2.ok \
+	arraytype.awk \
+	arraytype.ok \
+	arrdbg.awk \
+	arrymem1.awk \
+	arrymem1.ok \
+	arryref2.awk \
+	arryref2.ok \
+	arryref3.awk \
+	arryref3.ok \
+	arryref4.awk \
+	arryref4.ok \
+	arryref5.awk \
+	arryref5.ok \
+	arynasty.awk \
+	arynasty.ok \
+	arynocls.awk \
+	arynocls.in \
+	arynocls.ok \
+	aryprm1.awk \
+	aryprm1.ok \
+	aryprm2.awk \
+	aryprm2.ok \
+	aryprm3.awk \
+	aryprm3.ok \
+	aryprm4.awk \
+	aryprm4.ok \
+	aryprm5.awk \
+	aryprm5.ok \
+	aryprm6.awk \
+	aryprm6.ok \
+	aryprm7.awk \
+	aryprm7.ok \
+	aryprm8.awk \
+	aryprm8.ok \
+	aryprm9.awk \
+	aryprm9.ok \
+	arysubnm.awk \
+	arysubnm.ok \
+	aryunasgn.awk \
+	aryunasgn.ok \
+	asgext.awk \
+	asgext.in \
+	asgext.ok \
+	asort.awk \
+	asort.ok \
+	asorti.awk \
+	asorti.ok \
+	assignnumfield.awk \
+	assignnumfield.in \
+	assignnumfield.ok \
+	assignnumfield2.awk \
+	assignnumfield2.ok \
+	awkpath.ok \
+	back89.awk \
+	back89.in \
+	back89.ok \
+	backgsub.awk \
+	backgsub.in \
+	backgsub.ok \
+	backw.awk \
+	backw.in \
+	backw.ok \
+	backbigs1.awk \
+	backbigs1.in \
+	backbigs1.ok \
+	backsmalls1.awk \
+	backsmalls1.in \
+	backsmalls1.ok \
+	backsmalls2.awk \
+	backsmalls2.ok \
+	badargs.ok \
+	badassign1.awk \
+	badassign1.ok \
+	badbuild.awk \
+	badbuild.in \
+	badbuild.ok \
+	beginfile1.awk \
+	beginfile1.ok \
+	beginfile2.in \
+	beginfile2.ok \
+	beginfile2.sh \
+	binmode1.ok \
+	callparam.awk \
+	callparam.ok \
+	charasbytes.awk \
+	charasbytes.in \
+	charasbytes.ok \
+	checknegtime.awk \
+	childin.awk \
+	childin.in \
+	childin.ok \
+	clobber.awk \
+	clobber.ok \
+	clos1way.awk \
+	clos1way.ok \
+	clos1way2.awk \
+	clos1way2.in \
+	clos1way2.ok \
+	clos1way3.awk \
+	clos1way3.ok \
+	clos1way4.awk \
+	clos1way4.ok \
+	clos1way5.awk \
+	clos1way5.ok \
+	clos1way6.awk \
+	clos1way6.ok \
+	closebad.awk \
+	closebad.ok \
+	clsflnam.awk \
+	clsflnam.in \
+	clsflnam.ok \
+	colonwarn.awk \
+	colonwarn.in \
+	colonwarn.ok \
+	compare.awk \
+	compare.in \
+	compare.ok \
+	compare2.awk \
+	compare2.ok \
+	concat1.awk \
+	concat1.in \
+	concat1.ok \
+	concat2.awk \
+	concat2.ok \
+	concat3.awk \
+	concat3.ok \
+	concat4.awk \
+	concat4.in \
+	concat4.ok \
+	concat5.awk \
+	concat5.ok \
+	convfmt.awk \
+	convfmt.ok \
+	crlf.awk \
+	crlf.ok \
+	datanonl.awk \
+	datanonl.in \
+	datanonl.ok \
+	dbugeval.in \
+	dbugeval.ok \
+	dbugeval2.awk \
+	dbugeval2.in \
+	dbugeval2.ok \
+	dbugeval3.awk \
+	dbugeval3.in \
+	dbugeval3.ok \
+	dbugtypedre1.awk \
+	dbugtypedre1.in \
+	dbugtypedre1.ok \
+	dbugtypedre2.awk \
+	dbugtypedre2.in \
+	dbugtypedre2.ok \
+	defref.awk \
+	defref.ok \
+	delargv.awk \
+	delargv.ok \
+	delarpm2.awk \
+	delarpm2.ok \
+	delarprm.awk \
+	delarprm.ok \
+	delfunc.awk \
+	delfunc.ok \
+	delsub.awk \
+	delsub.ok \
+	devfd.in1 \
+	devfd.in2 \
+	devfd.in4 \
+	devfd.in5 \
+	devfd.ok \
+	devfd1.awk \
+	devfd1.ok \
+	devfd2.ok \
+	dfacheck1.awk \
+	dfacheck1.in \
+	dfacheck1.ok \
+	dfamb1.awk \
+	dfamb1.in \
+	dfamb1.ok \
+	dfastress.awk \
+	dfastress.ok \
+	double1.awk \
+	double1.ok \
+	double2.awk \
+	double2.ok \
+	dtdgport.awk \
+	dumpvars.in \
+	dumpvars.ok \
+	dynlj.awk \
+	dynlj.ok \
+	eofsplit.awk \
+	eofsplit.ok \
+	eofsrc1a.awk \
+	eofsrc1b.awk \
+	eofsrc1.ok \
+	errno.awk \
+	errno.in \
+	errno.ok \
+	exit.ok \
+	exit.sh \
+	exit2.awk \
+	exit2.ok \
+	exitval1.awk \
+	exitval1.ok \
+	exitval2.awk \
+	exitval2.ok \
+	exitval2.w32 \
+	exitval3.awk \
+	exitval3.ok \
+	fcall_exit.awk \
+	fcall_exit.ok \
+	fcall_exit2.awk \
+	fcall_exit2.in \
+	fcall_exit2.ok \
+	fflush.ok \
+	fflush.sh \
+	fieldwdth.awk \
+	fieldwdth.in \
+	fieldwdth.ok \
+	filefuncs.awk \
+	filefuncs.ok \
+	fix-fmtspcl.awk \
+	fldchg.awk \
+	fldchg.in \
+	fldchg.ok \
+	fldchgnf.awk \
+	fldchgnf.in \
+	fldchgnf.ok \
+	fldterm.awk \
+	fldterm.in \
+	fldterm.ok \
+	fmtspcl-mpfr.ok \
+	fmtspcl.awk \
+	fmtspcl.tok \
+	fmttest.awk \
+	fmttest.ok \
+	fnamedat.awk \
+	fnamedat.in \
+	fnamedat.ok \
+	fnarray.awk \
+	fnarray.ok \
+	fnarray2.awk \
+	fnarray2.in \
+	fnarray2.ok \
+	fnarydel-mpfr.ok \
+	fnarydel.awk \
+	fnarydel.ok \
+	fnaryscl.awk \
+	fnaryscl.ok \
+	fnasgnm.awk \
+	fnasgnm.in \
+	fnasgnm.ok \
+	fnmatch.awk \
+	fnmatch.ok \
+	fnmisc.awk \
+	fnmisc.ok \
+	fnparydl-mpfr.ok \
+	fnparydl.awk \
+	fnparydl.ok \
+	forcenum.awk \
+	forcenum.ok \
+	fordel.awk \
+	fordel.ok \
+	fork.awk \
+	fork.ok \
+	fork2.awk \
+	fork2.ok \
+	forref.awk \
+	forref.ok \
+	forsimp.awk \
+	forsimp.ok \
+	fpat1.awk \
+	fpat1.in \
+	fpat1.ok \
+	fpat2.awk \
+	fpat2.ok \
+	fpat3.awk \
+	fpat3.in \
+	fpat3.ok \
+	fpat4.awk \
+	fpat4.ok \
+	fpat5.awk \
+	fpat5.in \
+	fpat5.ok \
+	fpat6.awk \
+	fpat6.in \
+	fpat6.ok \
+	fpatnull.awk \
+	fpatnull.in \
+	fpatnull.ok \
+	fsbs.awk \
+	fsbs.in \
+	fsbs.ok \
+	fscaret.awk \
+	fscaret.in \
+	fscaret.ok \
+	fsfwfs.awk \
+	fsfwfs.in \
+	fsfwfs.ok \
+	fsnul1.awk \
+	fsnul1.in \
+	fsnul1.ok \
+	fsrs.awk \
+	fsrs.in \
+	fsrs.ok \
+	fsspcoln.awk \
+	fsspcoln.in \
+	fsspcoln.ok \
+	fstabplus.awk \
+	fstabplus.in \
+	fstabplus.ok \
+	fts.awk \
+	functab1.awk \
+	functab1.ok \
+	functab2.awk \
+	functab2.ok \
+	functab3.awk \
+	functab3.ok \
+	functab4.awk \
+	functab4.ok \
+	funlen.awk \
+	funlen.in \
+	funlen.ok \
+	funsemnl.awk \
+	funsemnl.ok \
+	funsmnam.awk \
+	funsmnam.ok \
+	funstack.awk \
+	funstack.in \
+	funstack.ok \
+	fwtest.awk \
+	fwtest.in \
+	fwtest.ok \
+	fwtest2.awk \
+	fwtest2.in \
+	fwtest2.ok \
+	fwtest3.awk \
+	fwtest3.in \
+	fwtest3.ok \
+	fwtest4.awk \
+	fwtest4.in \
+	fwtest4.ok \
+	fwtest5.awk \
+	fwtest5.in \
+	fwtest5.ok \
+	fwtest6.awk \
+	fwtest6.in \
+	fwtest6.ok \
+	fwtest7.awk \
+	fwtest7.in \
+	fwtest7.ok \
+	fwtest8.awk \
+	fwtest8.in \
+	fwtest8.ok \
+	genpot.awk \
+	genpot.ok \
+	gensub.awk \
+	gensub.in \
+	gensub.ok \
+	gensub2.awk \
+	gensub2.ok \
+	gensub3.awk \
+	gensub3.in \
+	gensub3.ok \
+	getfile.awk \
+	getfile.ok \
+	getline.awk \
+	getline.in \
+	getline.ok \
+	getline2.awk \
+	getline2.ok \
+	getline3.awk \
+	getline3.ok \
+	getline4.awk \
+	getline4.in \
+	getline4.ok \
+	getline5.awk \
+	getline5.ok \
+	getlnbuf.awk \
+	getlnbuf.in \
+	getlnbuf.ok \
+	getlndir.awk \
+	getlndir.ok \
+	getlnhd.awk \
+	getlnhd.ok \
+	getnr2tb.awk \
+	getnr2tb.in \
+	getnr2tb.ok \
+	getnr2tm.awk \
+	getnr2tm.in \
+	getnr2tm.ok \
+	gnuops2.awk \
+	gnuops2.ok \
+	gnuops3.awk \
+	gnuops3.ok \
+	gnureops.awk \
+	gnureops.ok \
+	gsubasgn.awk \
+	gsubasgn.ok \
+	gsubind.awk \
+	gsubind.ok \
+	gsubtest.awk \
+	gsubtest.ok \
+	gsubtst2.awk \
+	gsubtst2.ok \
+	gsubtst3.awk \
+	gsubtst3.in \
+	gsubtst3.ok \
+	gsubtst4.awk \
+	gsubtst4.ok \
+	gsubtst5.awk \
+	gsubtst5.in \
+	gsubtst5.ok \
+	gsubtst6.awk \
+	gsubtst6.ok \
+	gsubtst7.awk \
+	gsubtst7.in \
+	gsubtst7.ok \
+	gsubtst8.awk \
+	gsubtst8.in \
+	gsubtst8.ok \
+	gtlnbufv.awk \
+	hello.awk \
+	hex.awk \
+	hex.ok \
+	hex2.awk \
+	hex2.in \
+	hex2.ok \
+	hsprint.awk \
+	hsprint.ok \
+	icasefs.awk \
+	icasefs.ok \
+	icasers.awk \
+	icasers.in \
+	icasers.ok \
+	inpref.awk \
+	inpref.in \
+	inpref.ok \
+	id.awk \
+	id.ok \
+	igncdym.awk \
+	igncdym.in \
+	igncdym.ok \
+	igncfs.awk \
+	igncfs.in \
+	igncfs.ok \
+	ignrcas2.awk \
+	ignrcas2.ok \
+	ignrcas3.awk \
+	ignrcas3.ok \
+	ignrcas4.awk \
+	ignrcas4.ok \
+	ignrcase.awk \
+	ignrcase.in \
+	ignrcase.ok \
+	incdupe.ok \
+	incdupe2.ok \
+	incdupe3.ok \
+	incdupe4.ok \
+	incdupe5.ok \
+	incdupe6.ok \
+	incdupe7.ok \
+	inchello.awk \
+	inclib.awk \
+	include.awk \
+	include.ok \
+	include2.ok \
+	indirectbuiltin.awk \
+	indirectbuiltin.ok \
+	indirectcall.awk \
+	indirectcall.in \
+	indirectcall.ok \
+	indirectcall2.awk \
+	indirectcall2.ok \
+	inftest.awk \
+	inftest.ok \
+	inplace.in \
+	inplace.1.in \
+	inplace.2.in \
+	inplace1.ok \
+	inplace1.1.ok \
+	inplace1.2.ok \
+	inplace2.ok \
+	inplace2.1.ok \
+	inplace2.1.bak.ok \
+	inplace2.2.ok \
+	inplace2.2.bak.ok \
+	inplace3.ok \
+	inplace3.1.ok \
+	inplace3.1.bak.ok \
+	inplace3.2.ok \
+	inplace3.2.bak.ok \
+	inputred.awk \
+	inputred.ok \
+	intarray.awk \
+	intarray.ok \
+	intest.awk \
+	intest.ok \
+	intformat.awk \
+	intformat.ok \
+	intprec.awk \
+	intprec.ok \
+	iobug1.awk \
+	iobug1.ok \
+	isarrayunset.awk \
+	isarrayunset.ok \
+	jarebug.awk \
+	jarebug.in \
+	jarebug.ok \
+	jarebug.sh \
+	lc_num1.awk \
+	lc_num1.ok \
+	leaddig.awk \
+	leaddig.ok \
+	leadnl.awk \
+	leadnl.in \
+	leadnl.ok \
+	lint.awk \
+	lint.ok \
+	lintexp.awk \
+	lintexp.ok \
+	lintindex.awk \
+	lintindex.ok \
+	lintint.awk \
+	lintint.ok \
+	lintlength.awk \
+	lintlength.ok \
+	lintold.awk \
+	lintold.in \
+	lintold.ok \
+	lintset.awk \
+	lintset.ok \
+	lintwarn.awk \
+	lintwarn.ok \
+	litoct.awk \
+	litoct.in \
+	litoct.ok \
+	localenl.ok \
+	localenl.sh \
+	longsub.awk \
+	longsub.in \
+	longsub.ok \
+	longwrds.awk \
+	longwrds.in \
+	longwrds.ok \
+	manglprm.awk \
+	manglprm.in \
+	manglprm.ok \
+	manyfiles.awk \
+	manyfiles.ok \
+	muldimposix.awk \
+	muldimposix.ok \
+	match1.awk \
+	match1.ok \
+	match2.awk \
+	match2.ok \
+	match3.awk \
+	match3.in \
+	match3.ok \
+	math.awk \
+	math.ok \
+	mbfw1.awk \
+	mbfw1.in \
+	mbfw1.ok \
+	mbprintf1.awk \
+	mbprintf1.in \
+	mbprintf1.ok \
+	mbprintf2.awk \
+	mbprintf2.ok \
+	mbprintf3.awk \
+	mbprintf3.in \
+	mbprintf3.ok \
+	mbprintf4.awk \
+	mbprintf4.in \
+	mbprintf4.ok \
+	mbprintf5.awk \
+	mbprintf5.in \
+	mbprintf5.ok \
+	mbstr1.awk \
+	mbstr1.ok \
+	mbstr2.awk \
+	mbstr2.in \
+	mbstr2.ok \
+	membug1.awk \
+	membug1.in \
+	membug1.ok \
+	memleak.awk \
+	memleak.ok \
+	messages.awk \
+	minusstr.awk \
+	minusstr.ok \
+	mixed1.ok \
+	mktime.awk \
+	mktime.in \
+	mktime.ok \
+	mmap8k.awk \
+	mmap8k.in \
+	mmap8k.ok \
+	mpfrbigint.awk \
+	mpfrbigint.ok \
+	mpfrbigint2.awk \
+	mpfrbigint2.in \
+	mpfrbigint2.ok \
+	mpfrexprange.awk \
+	mpfrexprange.ok \
+	mpfrfield.awk \
+	mpfrfield.in \
+	mpfrfield.ok \
+	mpfrieee.awk \
+	mpfrieee.ok \
+	mpfrmemok1.awk \
+	mpfrmemok1.ok \
+	mpfrnegzero.awk \
+	mpfrnegzero.ok \
+	mpfrnr.awk \
+	mpfrnr.in \
+	mpfrnr.ok \
+	mpfrrem.awk \
+	mpfrrem.ok \
+	mpfrrnd.awk \
+	mpfrrnd.ok \
+	mpfrrndeval.awk \
+	mpfrrndeval.ok \
+	mpfrsort.awk \
+	mpfrsort.ok \
+	mpfrsqrt.awk \
+	mpfrsqrt.ok \
+	mpfrstrtonum.awk \
+	mpfrstrtonum.ok \
+	mpfruplus.ok \
+	mpgforcenum.awk \
+	mpgforcenum.ok \
+	mtchi18n.awk \
+	mtchi18n.in \
+	mtchi18n.ok \
+	nasty.awk \
+	nasty.ok \
+	nasty2.awk \
+	nasty2.ok \
+	nastyparm.awk \
+	nastyparm.ok \
+	negexp.awk \
+	negexp.ok \
+	negrange.awk \
+	negrange.ok \
+	negtime.awk \
+	negtime.ok \
+	nested.awk \
+	nested.in \
+	nested.ok \
+	next.ok \
+	next.sh \
+	nfldstr.awk \
+	nfldstr.in \
+	nfldstr.ok \
+	nfloop.awk \
+	nfloop.ok \
+	nfneg.awk \
+	nfneg.ok \
+	nfset.awk \
+	nfset.in \
+	nfset.ok \
+	nlfldsep.awk \
+	nlfldsep.in \
+	nlfldsep.ok \
+	nlinstr.awk \
+	nlinstr.in \
+	nlinstr.ok \
+	nlstrina.awk \
+	nlstrina.ok \
+	nlstringtest.awk \
+	nlstringtest.ok \
+	nlstringtest.po \
+	nlstringtest-nogettext.ok \
+	fr \
+	noeffect.awk \
+	noeffect.ok \
+	nofile.ok \
+	nofmtch.awk \
+	nofmtch.ok \
+	noloop1.awk \
+	noloop1.in \
+	noloop1.ok \
+	noloop2.awk \
+	noloop2.in \
+	noloop2.ok \
+	nondec.awk \
+	nondec.ok \
+	nondec2.awk \
+	nondec2.ok \
+	nonfatal1.awk \
+	nonfatal1.ok \
+	nonfatal2.awk \
+	nonfatal2.ok \
+	nonfatal3.awk \
+	nonfatal3.ok \
+	nonl.awk \
+	nonl.in \
+	nonl.ok \
+	noparms.awk \
+	noparms.ok \
+	nors.in \
+	nors.ok \
+	nsbad.awk \
+	nsbad.ok \
+	nsbad_cmd.ok \
+	nsforloop.awk \
+	nsforloop.ok \
+	nsfuncrecurse.awk \
+	nsfuncrecurse.ok \
+	nsindirect1.awk \
+	nsindirect1.ok \
+	nsindirect2.awk \
+	nsindirect2.ok \
+	nsprof1.awk \
+	nsprof1.ok \
+	nsprof2.awk \
+	nsprof2.ok \
+	nulinsrc.awk \
+	nulinsrc.ok \
+	nulrsend.awk \
+	nulrsend.in \
+	nulrsend.ok \
+	numindex.awk \
+	numindex.in \
+	numindex.ok \
+	numrange.awk \
+	numrange.ok \
+	numstr1.awk \
+	numstr1.ok \
+	numsubstr.awk \
+	numsubstr.in \
+	numsubstr.ok \
+	octsub.awk \
+	octsub.ok \
+	ofmt.awk \
+	ofmt.in \
+	ofmt.ok \
+	ofmta.awk \
+	ofmta.ok \
+	ofmtbig.awk \
+	ofmtbig.in \
+	ofmtbig.ok \
+	ofmtfidl.awk \
+	ofmtfidl.in \
+	ofmtfidl.ok \
+	ofmts.awk \
+	ofmts.in \
+	ofmts.ok \
+	ofmtstrnum.awk \
+	ofmtstrnum.ok \
+	ofs1.awk \
+	ofs1.in \
+	ofs1.ok \
+	onlynl.awk \
+	onlynl.in \
+	onlynl.ok \
+	opasnidx.awk \
+	opasnidx.ok \
+	opasnslf.awk \
+	opasnslf.ok \
+	ordchr.awk \
+	ordchr.ok \
+	ordchr2.ok \
+	out1.ok \
+	out2.ok \
+	out3.ok \
+	paramasfunc1.awk \
+	paramasfunc1.ok \
+	paramasfunc2.awk \
+	paramasfunc2.ok \
+	paramdup.awk \
+	paramdup.ok \
+	paramres.awk \
+	paramres.ok \
+	paramtyp.awk \
+	paramtyp.ok \
+	paramuninitglobal.awk \
+	paramuninitglobal.ok \
+	parse1.awk \
+	parse1.in \
+	parse1.ok \
+	parsefld.awk \
+	parsefld.in \
+	parsefld.ok \
+	parseme.awk \
+	parseme.ok \
+	patsplit.awk \
+	patsplit.ok \
+	pcntplus.awk \
+	pcntplus.ok \
+	pid.awk \
+	pid.ok \
+	pid.sh \
+	pipeio1.awk \
+	pipeio1.ok \
+	pipeio2.awk \
+	pipeio2.in \
+	pipeio2.ok \
+	posix.awk \
+	posix.in \
+	posix.ok \
+	posix2008sub.awk \
+	posix2008sub.ok \
+	poundbang.awk \
+	prdupval.awk \
+	prdupval.in \
+	prdupval.ok \
+	prec.awk \
+	prec.ok \
+	printf0.awk \
+	printf0.ok \
+	printf1.awk \
+	printf1.ok \
+	printfbad1.awk \
+	printfbad1.ok \
+	printfbad2.awk \
+	printfbad2.in \
+	printfbad2.ok \
+	printfbad3.awk \
+	printfbad3.ok \
+	printfbad4.awk \
+	printfbad4.ok \
+	printfchar.awk \
+	printfchar.ok \
+	printfloat.awk \
+	printhuge.awk \
+	printhuge.ok \
+	printlang.awk \
+	prmarscl.awk \
+	prmarscl.ok \
+	prmreuse.awk \
+	prmreuse.ok \
+	procinfs.awk \
+	procinfs.ok \
+	profile0.awk \
+	profile0.in \
+	profile0.ok \
+	profile2.ok \
+	profile3.awk \
+	profile3.ok \
+	profile4.awk \
+	profile4.ok \
+	profile5.awk \
+	profile5.ok \
+	profile6.awk \
+	profile6.ok \
+	profile7.awk \
+	profile7.ok \
+	profile8.awk \
+	profile8.ok \
+	profile9.awk \
+	profile9.ok \
+	profile10.awk \
+	profile10.ok \
+	profile11.awk \
+	profile11.ok \
+	profile12.awk \
+	profile12.in \
+	profile12.ok \
+	prt1eval.awk \
+	prt1eval.ok \
+	prtoeval.awk \
+	prtoeval.ok \
+	pty1.awk \
+	pty1.ok \
+	pty2.awk \
+	pty2.ok \
+	rand-mpfr.ok \
+	rand.awk \
+	rand.ok \
+	randtest.sh \
+	randtest.ok \
+	range1.awk \
+	range1.in \
+	range1.ok \
+	range2.awk \
+	range2.ok \
+	readbuf.awk \
+	readbuf.ok \
+	readdir.awk \
+	readdir0.awk \
+	readdir_retest.awk \
+	readfile2.awk \
+	readfile2.ok \
+	rebrackloc.awk \
+	rebrackloc.in \
+	rebrackloc.ok \
+	rebt8b1.awk \
+	rebt8b1.ok \
+	rebt8b2.awk \
+	rebt8b2.ok \
+	rebuf.awk \
+	rebuf.in \
+	rebuf.ok \
+	rebuild.awk \
+	rebuild.in \
+	rebuild.ok \
+	redfilnm.awk \
+	redfilnm.in \
+	redfilnm.ok \
+	regeq.awk \
+	regeq.in \
+	regeq.ok \
+	regexpbrack.awk \
+	regexpbrack.in \
+	regexpbrack.ok \
+	regexpbrack2.awk \
+	regexpbrack2.in \
+	regexpbrack2.ok \
+	regexprange.awk \
+	regexprange.ok \
+	reginttrad.awk \
+	reginttrad.ok \
+	regnul1.awk \
+	regnul1.ok \
+	regnul2.awk \
+	regnul2.ok \
+	regrange.awk \
+	regrange.ok \
+	regtest.sh \
+	regx8bit.awk \
+	regx8bit.ok \
+	reindops.awk \
+	reindops.in \
+	reindops.ok \
+	reint.awk \
+	reint.in \
+	reint.ok \
+	reint2.awk \
+	reint2.in \
+	reint2.ok \
+	reparse.awk \
+	reparse.in \
+	reparse.ok \
+	resplit.awk \
+	resplit.in \
+	resplit.ok \
+	revout.awk \
+	revout.ok \
+	revtwoway.awk \
+	revtwoway.ok \
+	rri1.awk \
+	rri1.in \
+	rri1.ok \
+	rs.awk \
+	rs.in \
+	rs.ok \
+	rscompat.awk \
+	rscompat.in \
+	rscompat.ok \
+	rsgetline.awk \
+	rsgetline.in \
+	rsgetline.ok \
+	rsglstdin.ok \
+	rsnul1nl.awk \
+	rsnul1nl.in \
+	rsnul1nl.ok \
+	rsnulbig.ok \
+	rsnulbig2.ok \
+	rsstart1.awk \
+	rsstart1.in \
+	rsstart1.ok \
+	rsstart2.awk \
+	rsstart2.in \
+	rsstart2.ok \
+	rsstart3.ok \
+	rstest1.awk \
+	rstest1.ok \
+	rstest2.awk \
+	rstest2.ok \
+	rstest3.awk \
+	rstest3.ok \
+	rstest4.awk \
+	rstest4.ok \
+	rstest5.awk \
+	rstest5.ok \
+	rstest6.awk \
+	rstest6.in \
+	rstest6.ok \
+	rswhite.awk \
+	rswhite.in \
+	rswhite.ok \
+	rtlen.ok \
+	rtlen.sh \
+	rtlenmb.ok \
+	rtlen01.ok \
+	rtlen01.sh \
+	rwarray.awk \
+	rwarray.in \
+	rwarray.ok \
+	sandbox1.awk \
+	sandbox1.ok \
+	scalar.awk \
+	scalar.ok \
+	sclforin.awk \
+	sclforin.ok \
+	sclifin.awk \
+	sclifin.ok \
+	setrec0.awk \
+	setrec0.in \
+	setrec0.ok \
+	setrec1.awk \
+	setrec1.ok \
+	shadow.awk \
+	shadow.ok \
+	shadowbuiltin.awk \
+	shadowbuiltin.ok \
+	sigpipe1.awk \
+	sigpipe1.ok \
+	sort1.awk \
+	sort1.ok \
+	sortempty.awk \
+	sortempty.ok \
+	sortfor.awk \
+	sortfor.in \
+	sortfor.ok \
+	sortfor2.awk \
+	sortfor2.in \
+	sortfor2.ok \
+	sortglos.awk \
+	sortglos.in \
+	sortglos.ok \
+	sortu.awk \
+	sortu.ok \
+	sourcesplit.ok \
+	space.ok \
+	spacere.awk \
+	spacere.ok \
+	split_after_fpat.awk \
+	split_after_fpat.in \
+	split_after_fpat.ok \
+	splitarg4.awk \
+	splitarg4.in \
+	splitarg4.ok \
+	splitargv.awk \
+	splitargv.in \
+	splitargv.ok \
+	splitarr.awk \
+	splitarr.ok \
+	splitdef.awk \
+	splitdef.ok \
+	splitvar.awk \
+	splitvar.in \
+	splitvar.ok \
+	splitwht.awk \
+	splitwht.ok \
+	sprintfc.awk \
+	sprintfc.in \
+	sprintfc.ok \
+	status-close.awk \
+	status-close.ok \
+	strcat1.awk \
+	strcat1.ok \
+	strftime.awk \
+	strftlng.awk \
+	strftlng.ok \
+	strftfld.awk \
+	strftfld.in \
+	strftfld.ok \
+	strnum1.awk \
+	strnum1.ok \
+	strnum2.awk \
+	strnum2.ok \
+	strtod.awk \
+	strtod.in \
+	strtod.ok \
+	strtonum.awk \
+	strtonum.ok \
+	strtonum1.awk \
+	strtonum1.ok \
+	subamp.awk \
+	subamp.in \
+	subamp.ok \
+	subback.awk \
+	subback.in \
+	subback.ok \
+	subi18n.awk \
+	subi18n.ok \
+	subsepnm.awk \
+	subsepnm.ok \
+	subslash.awk \
+	subslash.ok \
+	substr.awk \
+	substr.ok \
+	swaplns.awk \
+	swaplns.in \
+	swaplns.ok \
+	switch2.awk \
+	switch2.ok \
+	symtab1.awk \
+	symtab1.ok \
+	symtab2.awk \
+	symtab2.ok \
+	symtab3.awk \
+	symtab3.ok \
+	symtab4.awk \
+	symtab4.in \
+	symtab4.ok \
+	symtab5.awk \
+	symtab5.in \
+	symtab5.ok \
+	symtab6.awk \
+	symtab6.ok \
+	symtab7.awk \
+	symtab7.in \
+	symtab7.ok \
+	symtab8.awk \
+	symtab8.in \
+	symtab8.ok \
+	symtab9.awk \
+	symtab9.ok \
+	symtab10.awk \
+	symtab10.in \
+	symtab10.ok \
+	synerr1.awk \
+	synerr1.ok \
+	synerr2.awk \
+	synerr2.ok \
+	synerr3.awk \
+	synerr3.ok \
+	tailrecurse.awk \
+	tailrecurse.ok \
+	testext.ok \
+	time.awk \
+	time.ok \
+	timeout.awk \
+	timeout.ok \
+	tradanch.awk \
+	tradanch.in \
+	tradanch.ok \
+	trailbs.awk \
+	trailbs.in \
+	trailbs.ok \
+	tweakfld.awk \
+	tweakfld.in \
+	tweakfld.ok \
+	typedregex1.awk \
+	typedregex1.ok \
+	typedregex2.awk \
+	typedregex2.ok \
+	typedregex3.awk \
+	typedregex3.ok \
+	typedregex4.awk \
+	typedregex4.ok \
+	typeof1.awk \
+	typeof1.ok \
+	typeof2.awk \
+	typeof2.ok \
+	typeof3.awk \
+	typeof3.ok \
+	typeof4.awk \
+	typeof4.ok \
+	typeof5.awk \
+	typeof5.in \
+	typeof5.ok \
+	uninit2.awk \
+	uninit2.ok \
+	uninit3.awk \
+	uninit3.ok \
+	uninit4.awk \
+	uninit4.ok \
+	uninit5.awk \
+	uninit5.ok \
+	uninitialized.awk \
+	uninitialized.ok \
+	unterm.awk \
+	unterm.ok \
+	uparrfs.awk \
+	uparrfs.in \
+	uparrfs.ok \
+	uplus.awk \
+	uplus.ok \
+	valgrind.awk \
+	watchpoint1.awk \
+	watchpoint1.in \
+	watchpoint1.ok \
+	watchpoint1.script \
+	wideidx.awk \
+	wideidx.in \
+	wideidx.ok \
+	wideidx2.awk \
+	wideidx2.ok \
+	widesub.awk \
+	widesub.ok \
+	widesub2.awk \
+	widesub2.ok \
+	widesub3.awk \
+	widesub3.in \
+	widesub3.ok \
+	widesub4.awk \
+	widesub4.ok \
+	wjposer1.awk \
+	wjposer1.in \
+	wjposer1.ok \
+	xref.awk \
+	xref.original \
+	zero2.awk \
+	zero2.ok \
+	zeroe0.awk \
+	zeroe0.ok \
+	zeroflag.awk \
+	zeroflag.ok
+
+
+# Get rid of core files when cleaning and generated .ok file
+CLEANFILES = core core.* fmtspcl.ok
+
+# try to keep these sorted. each letter starts a new line
+BASIC_TESTS = \
+	addcomma anchgsub anchor argarray arrayind1 arrayind2 arrayind3 arrayparm \
+	arrayprm2 arrayprm3 arrayref arrymem1 arryref2 arryref3 arryref4 arryref5 \
+	arynasty arynocls aryprm1 aryprm2 aryprm3 aryprm4 aryprm5 aryprm6 aryprm7 \
+	aryprm8 aryprm9 arysubnm aryunasgn asgext awkpath \
+	assignnumfield assignnumfield2 \
+	back89 backgsub badassign1 badbuild \
+	callparam childin clobber closebad clsflnam compare compare2 \
+	concat1 concat2 concat3 concat4 concat5 convfmt \
+	datanonl defref delargv delarpm2 delarprm delfunc dfamb1 dfastress dynlj \
+	eofsplit eofsrc1 exit2 exitval1 exitval2 exitval3 \
+	fcall_exit fcall_exit2 fldchg fldchgnf fldterm fnamedat fnarray fnarray2 \
+	fnaryscl fnasgnm fnmisc fordel forref forsimp fsbs fscaret fsnul1 \
+	fsrs fsspcoln fstabplus funsemnl funsmnam funstack \
+	getline getline2 getline3 getline4 getline5 getlnbuf getnr2tb getnr2tm \
+	gsubasgn gsubtest gsubtst2 gsubtst3 gsubtst4 gsubtst5 gsubtst6 gsubtst7 \
+	gsubtst8 \
+	hex hex2 hsprint \
+	inpref inputred intest intprec iobug1 \
+	leaddig leadnl litoct longsub longwrds \
+	manglprm math membug1 memleak messages minusstr mmap8k \
+	nasty nasty2 negexp negrange nested nfldstr nfloop nfneg nfset nlfldsep \
+	nlinstr nlstrina noeffect nofile nofmtch noloop1 noloop2 nonl noparms \
+	nors nulinsrc nulrsend numindex numrange numstr1 numsubstr \
+	octsub ofmt ofmta ofmtbig ofmtfidl ofmts ofmtstrnum ofs1 onlynl \
+	opasnidx opasnslf \
+	paramasfunc1 paramasfunc2 paramdup paramres paramtyp paramuninitglobal \
+	parse1 parsefld parseme pcntplus posix2008sub prdupval prec printf0 \
+	printf1 printfchar prmarscl prmreuse prt1eval prtoeval \
+	rand randtest range1 range2 readbuf rebrackloc rebt8b1 rebuild redfilnm regeq \
+	regexpbrack regexpbrack2 regexprange regrange reindops reparse resplit \
+	rri1 rs rscompat rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 rstest3 \
+	rstest4 rstest5 rswhite \
+	scalar sclforin sclifin setrec0 setrec1 \
+	sigpipe1 sortempty sortglos spacere splitargv splitarr \
+	splitdef splitvar splitwht status-close strcat1 strnum1 strnum2 strtod \
+	subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 synerr3 \
+	tailrecurse tradanch trailbs tweakfld \
+	uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs uplus \
+	wideidx wideidx2 widesub widesub2 widesub3 widesub4 wjposer1 \
+	zero2 zeroe0 zeroflag
+
+UNIX_TESTS = \
+	fflush getlnhd localenl pid pipeio1 pipeio2 poundbang rtlen rtlen01 \
+	space strftlng
+
+GAWK_EXT_TESTS = \
+	aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort arraysort2 \
+	arraytype \
+	backw badargs beginfile1 beginfile2 binmode1 \
+	charasbytes colonwarn clos1way clos1way2 clos1way3 clos1way4 clos1way5 \
+	clos1way6 crlf \
+	dbugeval dbugeval2 dbugeval3 dbugtypedre1 dbugtypedre2 delsub \
+	devfd devfd1 devfd2 dfacheck1 dumpvars \
+	errno exit \
+	fieldwdth forcenum fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpatnull fsfwfs \
+	funlen functab1 functab2 functab3 fwtest fwtest2 fwtest3 fwtest4 \
+	fwtest5 fwtest6 fwtest7 fwtest8 \
+	genpot gensub gensub2 gensub3 getlndir gnuops2 gnuops3 gnureops gsubind \
+	icasefs icasers id igncdym igncfs ignrcas2 ignrcas4 ignrcase incdupe \
+	incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 include include2 \
+	indirectbuiltin indirectcall indirectcall2 intarray isarrayunset \
+	lint lintexp lintindex lintint lintlength lintold lintset lintwarn \
+	manyfiles match1 match2 match3 mbstr1 mbstr2 mixed1 mktime muldimposix \
+	nastyparm negtime next nondec nondec2 nonfatal1 nonfatal2 nonfatal3 \
+	nsbad nsbad_cmd nsforloop nsfuncrecurse nsindirect1 nsindirect2 nsprof1 nsprof2 \
+	patsplit posix printfbad1 printfbad2 printfbad3 printfbad4 printhuge \
+	procinfs profile0 profile1 profile2 profile3 profile4 profile5 profile6 \
+	profile7 profile8 profile9 profile10 profile11 profile12 pty1 pty2 \
+	rebuf regnul1 regnul2 regx8bit reginttrad reint reint2 rsgetline rsglstdin \
+	rsstart1 rsstart2 rsstart3 rstest6 \
+	sandbox1 shadow shadowbuiltin sortfor sortfor2 sortu \
+	sourcesplit split_after_fpat \
+	splitarg4 strftfld strftime strtonum strtonum1 switch2 symtab1 symtab2 \
+	symtab3 symtab4 symtab5 symtab6 symtab7 symtab8 symtab9 symtab10 \
+	timeout typedregex1 typedregex2 typedregex3 typedregex4 \
+	typeof1 typeof2 typeof3 typeof4 typeof5 \
+	watchpoint1
+
+ARRAYDEBUG_TESTS = arrdbg
+
+EXTRA_TESTS = inftest regtest ignrcas3 
+
+INET_TESTS = inetdayu inetdayt inetechu inetecht
+
+MACHINE_TESTS = double1 double2 intformat
+
+LOCALE_CHARSET_TESTS = \
+	asort asorti backbigs1 backsmalls1 backsmalls2 \
+	fmttest fnarydel fnparydl jarebug lc_num1 mbfw1 \
+	mbprintf1 mbprintf2 mbprintf3 mbprintf4 mbprintf5 \
+	mtchi18n nlstringtest rebt8b2 rtlenmb sort1 sprintfc
+
+SHLIB_TESTS = \
+	apiterm \
+	filefuncs fnmatch fork fork2 fts functab4 \
+	getfile \
+	inplace1 inplace2 inplace3 \
+	ordchr ordchr2 \
+	readdir readdir_test readdir_retest readfile readfile2 revout \
+	revtwoway rwarray \
+	testext time
+
+# List of the tests which should be run with --debug option:
+NEED_DEBUG = dbugtypedre1 dbugtypedre2 dbugeval2 dbugeval3 symtab10
+
+# List of the tests which should be run with --lint option:
+NEED_LINT = \
+	defref fmtspcl lintexp lintindex lintint lintlength lintwarn \
+	noeffect nofmtch nonl shadow uninit2 uninit3 uninit4 uninit5 uninitialized
+
+# List of the tests which should be run with --lint-old option:
+NEED_LINT_OLD = lintold
+
+# List of tests that must be run with -M
+NEED_MPFR = mpfrbigint mpfrbigint2 mpfrexprange mpfrfield mpfrieee mpfrmemok1 \
+	mpfrnegzero mpfrnr mpfrrem mpfrrnd mpfrrndeval mpfrsort mpfrsqrt \
+	mpfrstrtonum mpgforcenum mpfruplus
+
+# List of tests that need --non-decimal-data
+NEED_NONDEC = mpfrbigint2 nondec2 intarray forcenum
+
+# List of tests that need --posix
+NEED_POSIX = printf0 posix2008sub paramasfunc1 paramasfunc2 muldimposix
+
+# List of tests that need --pretty-print
+NEED_PRETTY = nsprof1 nsprof2 \
+	profile4 profile5 profile8 profile9 profile10 profile11
+
+# List of tests that need --re-interval
+NEED_RE_INTERVAL = gsubtst3 reint reint2
+
+# List of tests that need --sandbox
+NEED_SANDBOX = sandbox1
+
+# List of tests that need --traditional
+NEED_TRADITIONAL = litoct tradanch rscompat
+
+# Lists of tests that run a shell script
+RUN_SHELL = exit fflush localenl next randtest rtlen rtlen01
+
+# List of the tests which fail with EXIT CODE 1
+FAIL_CODE1 = \
+	badassign1 badbuild callparam delfunc fcall_exit fcall_exit2 \
+	fnamedat fnarray fnarray2 fnasgnm fnmisc funsmnam gsubasgn \
+	incdupe2 lintwarn match2 mixed1 noparms paramasfunc1 paramasfunc2 \
+	paramdup paramres parseme readbuf synerr1 synerr2 unterm
+
+# List of files which have .ok versions for MPFR
+CHECK_MPFR = \
+	rand fnarydel fnparydl
+
+# Lists of tests that need particular locales
+NEED_LOCALE_C = \
+	clos1way gsubtst6 range2
+
+NEED_LOCALE_EN = \
+	backbigs1 backsmalls1 backsmalls2 concat4 dfamb1 ignrcas2 lc_num1 \
+	mbfw1 mbprintf1 mbprintf3 mbprintf4 mbstr1 mbstr2 printhuge reint2 \
+	rri1 subamp subi18n wideidx wideidx2 widesub widesub2 widesub3 widesub4
+
+# Unused at the moment, since nlstringtest has additional stufff it does
+# NEED_LOCALE_FR =
+# Same for ignrcas3
+# NEED_LOCALE_GR =
+
+NEED_LOCALE_JP = mbprintf2
+
+NEED_LOCALE_RU = mtchi18n
+
+# List of tests that fail on DJGPP
+EXPECTED_FAIL_DJGPP = \
+	backbigs1 backsmalls1 backw beginfile1 clos1way clos1way2 \
+	clos1way3 clos1way4 clos1way5 clos1way6 errno getlndir \
+	getlnhd gnuops3 gnureops id ignrcas3 inetdayt inetdayu \
+	inetecht inetechu inftest jarebug mbfw1 mbprintf1 mbprintf4 \
+	mbstr1 mbstr2 mpfrsqrt nonfatal1 nonfatal2 nonfatal3 pid pty1 pty2 \
+	randtest regx8bit strtod sigpipe1 symtab6 timeout
+
+# List of tests that fail on MinGW
+EXPECTED_FAIL_MINGW = \
+	backbigs1 backsmalls1 clos1way6 devfd devfd1 devfd2 \
+	errno exitval2 fork fork2 fts getfile getlnhd ignrcas3 inetdayt \
+	inetecht mbfw1 mbprintf1 mbprintf4 mbstr1 mbstr2 pid pipeio2 \
+	pty1 pty2 readdir rstest4 rstest5 status-close timeout
+
+# List of tests that fail on z/OS
+EXPECTED_FAIL_ZOS = \
+	aasort aasorti arraysort asort asorti backbigs1 backsmalls1 \
+	backsmalls2 charasbytes concat4 dfamb1 double1 double2 fmttest \
+	forcenum gsubtst5 ignrcas2 lc_num1 localenl mbfw1 mbprintf1 \
+	mbprintf2 mbprintf3 mbprintf4 mbprintf5 mbstr1 mbstr2 numrange \
+	printhuge profile5 regrange reint2 rri1 sigpipe1 sortfor sortu \
+	subamp subi18n symtab1 symtab8 timeout wideidx wideidx2 \
+	widesub widesub2 widesub3 widesub4 \
+	beginfile1 beginfile2 clos1way6 errno getlndir nofile nonfatal2 space
+
+ZOS_FAIL = @ZOS_FAIL@
+
+# List of the files that appear in manual tests or are for reserve testing:
+GENTESTS_UNUSED = Makefile.in checknegtime.awk dtdgport.awk fix-fmtspcl.awk \
+	fmtspcl-mpfr.ok fmtspcl.awk fmtspcl.tok gtlnbufv.awk hello.awk \
+	inchello.awk inclib.awk inplace.1.in inplace.2.in inplace.in \
+	printfloat.awk readdir0.awk valgrind.awk xref.awk
+
+# List of tests on MinGW or DJGPP that need a different cmp program
+NEED_TESTOUTCMP = \
+	beginfile2 double2 exit fmttest hsprint posix profile5 space
+
+CMP = cmp
+AWKPROG = ../gawk$(EXEEXT)
+SORT = sort
+
+# Default for VALGRIND is empty unless overridden by a command-line argument.
+# This protects against cruft in the environment.
+VALGRIND = 
+
+# This business forces the locale to be C for running the tests,
+# unless we override it to something else for testing.
+#
+# This can also be done in individual tests where we wish to
+# check things specifically not in the C locale.
+
+#
+# And we set AWKLIBPATH to find the extension libraries we built.
+LOCALES = LANGUAGE= LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C}
+AWK = $(LOCALES) AWKLIBPATH=../extension/.libs $(VALGRIND) $(AWKPROG)
+
+# Message stuff is to make it a little easier to follow.
+# Make the pass-fail last and dependent on others to avoid
+# spurious errors if `make -j' in effect.
+check:	msg \
+	printlang \
+	basic-msg-start  basic           basic-msg-end \
+	unix-msg-start   unix-tests      unix-msg-end \
+	extend-msg-start gawk-extensions arraydebug-tests extend-msg-end \
+	machine-msg-start machine-tests machine-msg-end \
+	charset-tests-all \
+	shlib-msg-start  shlib-tests     shlib-msg-end \
+	mpfr-msg-start   mpfr-tests      mpfr-msg-end
+	@$(MAKE) pass-fail || { $(MAKE) diffout; exit 1; }
+
+basic:	$(BASIC_TESTS)
+
+unix-tests: $(UNIX_TESTS)
+
+gawk-extensions: $(GAWK_EXT_TESTS)
+
+charset-tests-all:
+	@case `uname` in \
+	*MINGW* | *MS-DOS*) \
+		$(MAKE) charset-msg-start charset-tests charset-msg-end ;; \
+	*) \
+		if locale -a | grep -i 'en_US.UTF.*8' > /dev/null && \
+		   locale -a | grep -i 'fr_FR.UTF.*8' > /dev/null && \
+		   locale -a | grep -i 'ru_RU.UTF.*8' > /dev/null && \
+		   locale -a | grep -i 'ja_JP.UTF.*8' > /dev/null  ; \
+		then \
+			$(MAKE) charset-msg-start charset-tests charset-msg-end; \
+		else \
+			echo %%%%%%%%%% Inadequate locale support: skipping charset tests. ; \
+			echo %%%%%%%%%% At least en_US.UTF-8, fr_FR.UTF-8, ru_RU.UTF-8 and ja_JP.UTF-8 are needed. ; \
+		fi ;; \
+	esac
+
+charset-tests: $(LOCALE_CHARSET_TESTS)
+
+extra:	$(EXTRA_TESTS) inet
+
+inet:	inetmesg $(INET_TESTS)
+
+machine-tests: $(MACHINE_TESTS)
+
+# The blank between ' and /MPFR/ is for running tests on Windows under
+# MSYS, which thinks /MPFR is a Unix-style file name and converts it
+# to Windows format, butchering it in the process.  Likewise for /API/
+# in the next shlib-tests.
+mpfr-tests:
+	@if $(AWK) --version | $(AWK) ' /MPFR/ { exit 1 }' ; then \
+	echo MPFR tests not supported on this system ; \
+	else $(MAKE) $(NEED_MPFR) ; \
+	fi
+
+arraydebug-tests:
+	@if echo $(CFLAGS) | grep ARRAYDEBUG > /dev/null ; then \
+	$(MAKE) $(ARRAYDEBUG_TESTS) ; \
+	else echo gawk is not compiled to support the array debug tests ; \
+	fi
+
+shlib-tests:
+	@if $(AWK) --version | $(AWK) ' /API/ { exit 1 }' ; then \
+	echo shlib tests not supported on this system ; \
+	else $(MAKE) shlib-real-tests ; \
+	fi
+
+shlib-real-tests: $(SHLIB_TESTS)
+
+msg::
+	@echo ''
+	@echo 'Any output from "$(CMP)" is bad news, although some differences'
+	@echo 'in floating point values are probably benign -- in particular,'
+	@echo 'some systems may omit a leading zero and the floating point'
+	@echo 'precision may lead to slightly different output in a few cases.'
+
+printlang::
+	@$(AWK) -f "$(srcdir)"/printlang.awk
+
+basic-msg-start:
+	@echo "======== Starting basic tests ========"
+
+basic-msg-end:
+	@echo "======== Done with basic tests ========"
+
+unix-msg-start:
+	@echo "======== Starting Unix tests ========"
+
+unix-msg-end:
+	@echo "======== Done with Unix tests ========"
+
+extend-msg-start:
+	@echo "======== Starting gawk extension tests ========"
+
+extend-msg-end:
+	@echo "======== Done with gawk extension tests ========"
+
+machine-msg-start:
+	@echo "======== Starting machine-specific tests ========"
+
+machine-msg-end:
+	@echo "======== Done with machine-specific tests ========"
+
+charset-msg-start:
+	@echo "======== Starting tests that can vary based on character set or locale support ========"
+	@echo "**************************************************************************"
+	@echo "* Some or all of these tests may fail if you have inadequate or missing  *"
+	@echo "* locale support. At least en_US.UTF-8, fr_FR.UTF-8, ru_RU.UTF-8 and     *"
+	@echo "* ja_JP.UTF-8 are needed. The el_GR.iso88597 is optional but helpful.    *"
+	@echo "* However, if you see this message, the Makefile thinks you have what    *"
+	@echo "* you need ...                                                           *"
+	@echo "**************************************************************************"
+
+charset-msg-end:
+	@echo "======== Done with tests that can vary based on character set or locale support ========"
+
+shlib-msg-start:
+	@echo "======== Starting shared library tests ========"
+
+shlib-msg-end:
+	@echo "======== Done with shared library tests ========"
+
+mpfr-msg-start:
+	@echo "======== Starting MPFR tests ========"
+
+mpfr-msg-end:
+	@echo "======== Done with MPFR tests ========"
+
+
+# This test is a PITA because increasingly, /tmp is getting
+# mounted noexec.  So, we'll test it locally.  Sigh.
+#
+# More PITA; some systems have medium short limits on #! paths,
+# so this can still fail
+poundbang::
+	@echo $@
+	@sed "s;/tmp/gawk;`pwd`/$(AWKPROG);" < "$(srcdir)"/poundbang.awk > ./_pbd.awk
+	@chmod +x ./_pbd.awk
+	@if ./_pbd.awk "$(srcdir)"/poundbang.awk > _`basename $@` ; \
+	then : ; \
+	else \
+		sed "s;/tmp/gawk;$(AWKPROG);" < "$(srcdir)"/poundbang.awk > ./_pbd.awk ; \
+		chmod +x ./_pbd.awk ; \
+		LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C} ./_pbd.awk "$(srcdir)"/poundbang.awk > _`basename $@`;  \
+	fi
+	@-$(CMP) "$(srcdir)"/poundbang.awk _`basename $@` && rm -f _`basename $@` _pbd.awk
+
+messages::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/messages.awk >_out2 2>_out3 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/out1.ok _out1 && $(CMP) "$(srcdir)"/out2.ok _out2 && $(CMP) "$(srcdir)"/out3.ok _out3 && rm -f _out1 _out2 _out3
+
+argarray::
+	@echo $@
+	@cp "$(srcdir)"/argarray.in ./argarray.input
+	@TEST=test echo just a test | $(AWK) -f "$(srcdir)"/argarray.awk ./argarray.input - >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f ./argarray.input
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regtest::
+	@echo $@
+	@echo 'Some of the output from regtest is very system specific, do not'
+	@echo 'be distressed if your output differs from that distributed.'
+	@echo 'Manual inspection is called for.'
+	@AWK=$(AWKPROG) "$(srcdir)"/regtest.sh
+
+manyfiles::
+	@echo $@
+	@rm -rf junk
+	@mkdir junk
+	@$(AWK) 'BEGIN { for (i = 1; i <= 1030; i++) print i, i}' >_$@
+	@$(AWK) -f "$(srcdir)"/manyfiles.awk _$@ _$@ || echo EXIT CODE: $$? >> _$@
+	@wc -l junk/* | $(AWK) '$$1 != 2' | wc -l | sed "s/  *//g" > _$@
+	@rm -rf junk
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+compare::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/compare.awk 0 1 "$(srcdir)"/compare.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inftest::
+	@echo $@
+	@echo This test is very machine specific...
+	@$(AWK) -f "$(srcdir)"/inftest.awk | sed "s/inf/Inf/g" >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline2::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/getline2.awk "$(srcdir)"/getline2.awk "$(srcdir)"/getline2.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+awkpath::
+	@echo $@
+	@AWKPATH="$(srcdir)$(PATH_SEPARATOR)$(srcdir)/lib" $(AWK) -f awkpath.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+argtest::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/argtest.awk -x -y abc >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+badargs::
+	@echo $@
+	@-$(AWK) -f 2>&1 | grep -v patchlevel >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strftime::
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C ; export GAWKLOCALE; \
+	TZ=GMT0; export TZ; \
+	$(AWK) -v OUTPUT=_$@ -v DATECMD="$(DATE)" -f "$(srcdir)"/strftime.awk || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) strftime.ok _$@ && rm -f _$@ strftime.ok || exit 0
+
+devfd::
+	@echo $@
+	@$(AWK) 1 /dev/fd/4 /dev/fd/5 4<"$(srcdir)"/devfd.in4 5<"$(srcdir)"/devfd.in5 >_$@ 2>&1 || echo EXIT CODE: $$? >> _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# This cannot be autogenerated; we want it to read the input name
+# on the command line.
+errno:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+tweakfld::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/tweakfld.awk "$(srcdir)"/tweakfld.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f errors.cleanup
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# AIX /bin/sh exec's the last command in a list, therefore issue a ":"
+# command so that pid.sh is fork'ed as a child before being exec'ed.
+pid::
+	@echo $@
+	@AWKPATH="$(srcdir)" AWK=$(AWKPROG) $(SHELL) "$(srcdir)"/pid.sh $$$$ > _`basename $@` ; :
+	@-$(CMP) "$(srcdir)"/pid.ok _`basename $@` && rm -f _`basename $@`
+
+strftlng::
+	@echo $@
+	@TZ=UTC; export TZ; $(AWK) -f "$(srcdir)"/strftlng.awk >_$@
+	@if $(CMP) "$(srcdir)"/strftlng.ok _$@ >/dev/null 2>&1 ; then : ; else \
+	TZ=UTC0; export TZ; $(AWK) -f "$(srcdir)"/strftlng.awk >_$@ ; \
+	fi
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nors::
+	@echo $@
+	@echo A B C D E | tr -d '\12\15' | $(AWK) '{ print $$NF }' - "$(srcdir)"/nors.in > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# fmtspcl.ok: fmtspcl.tok Makefile fix-fmtspcl.awk
+# 	@$(AWK) -v "sd=$(srcdir)" -f "$(srcdir)/fix-fmtspcl.awk" < "$(srcdir)"/fmtspcl.tok > $@ 2>/dev/null
+# 
+# fmtspcl: fmtspcl.ok
+# 	@echo $@
+# 	@$(AWK) $(AWKFLAGS) -f "$(srcdir)"/fmtspcl.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+# 	@-if test -z "$$AWKFLAGS" ; then $(CMP) $@.ok _$@ && rm -f _$@ ; else \
+# 	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+# 	fi
+
+rebuf::
+	@echo $@
+	@AWKBUFSIZE=4096 AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsglstdin:: 
+	@echo $@
+	@cat  "$(srcdir)"/rsgetline.in | AWKPATH="$(srcdir)" $(AWK) -f rsgetline.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pipeio1::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/pipeio1.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f test1 test2
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pipeio2::
+	@echo $@
+	@$(AWK) -v SRCDIR="$(srcdir)" -f "$(srcdir)"/pipeio2.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clobber::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/clobber.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/clobber.ok seq && $(CMP) "$(srcdir)"/clobber.ok _$@ && rm -f _$@
+	@rm -f seq
+
+arynocls::
+	@echo $@
+	@-AWKPATH="$(srcdir)" $(AWK) -v INPUT="$(srcdir)"/arynocls.in -f arynocls.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getlnbuf::
+	@echo $@
+	@-AWKPATH="$(srcdir)" $(AWK) -f getlnbuf.awk "$(srcdir)"/getlnbuf.in > _$@ || echo EXIT CODE: $$? >> _$@
+	@-AWKPATH="$(srcdir)" $(AWK) -f gtlnbufv.awk "$(srcdir)"/getlnbuf.in > _2$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/getlnbuf.ok _$@ && $(CMP) "$(srcdir)"/getlnbuf.ok _2$@ && rm -f _$@ _2$@
+
+inetmesg::
+	@echo These tests only work if your system supports the services
+	@echo "'discard'" at port 9 and "'daytimed'" at port 13. Check your
+	@echo file /etc/services and do "'netstat -a'".
+
+inetechu::
+	@echo This test is for establishing UDP connections
+	@-$(AWK) 'BEGIN {print "" |& "/inet/udp/0/127.0.0.1/9"}'
+
+inetecht::
+	@echo This test is for establishing TCP connections
+	@-$(AWK) 'BEGIN {print "" |& "/inet/tcp/0/127.0.0.1/9"}'
+
+inetdayu::
+	@echo This test is for bidirectional UDP transmission
+	@-$(AWK) 'BEGIN { print "" |& "/inet/udp/0/127.0.0.1/13"; \
+	"/inet/udp/0/127.0.0.1/13" |& getline; print $0}'
+
+inetdayt::
+	@echo This test is for bidirectional TCP transmission
+	@-$(AWK) 'BEGIN { print "" |& "/inet/tcp/0/127.0.0.1/13"; \
+	"/inet/tcp/0/127.0.0.1/13" |& getline; print $0}'
+
+redfilnm::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/redfilnm.awk srcdir="$(srcdir)" "$(srcdir)"/redfilnm.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+space::
+	@echo $@ $(ZOS_FAIL)
+	@$(AWK) -f ' ' "$(srcdir)"/space.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsnulbig::
+	@echo $@
+	@ : Suppose that block size for pipe is at most 128kB:
+	@$(AWK) 'BEGIN { for (i = 1; i <= 128*64+1; i++) print "abcdefgh123456\n" }' 2>&1 | \
+	$(AWK) 'BEGIN { RS = ""; ORS = "\n\n" }; { print }' 2>&1 | \
+	$(AWK) ' /^[^a]/; END{ print NR }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsnulbig2::
+	@echo $@
+	@$(AWK) 'BEGIN { ORS = ""; n = "\n"; for (i = 1; i <= 10; i++) n = (n n); \
+		for (i = 1; i <= 128; i++) print n; print "abc\n" }' 2>&1 | \
+		$(AWK) 'BEGIN { RS = ""; ORS = "\n\n" };{ print }' 2>&1 | \
+		$(AWK) ' /^[^a]/; END { print NR }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# This test makes sure gawk exits with a zero code.
+# Thus, unconditionally generate the exit code.
+exitval1::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/exitval1.awk >_$@ 2>&1; echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsspcoln::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk 'FS=[ :]+' "$(srcdir)"/$@.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsstart3::
+	@echo $@
+	@head "$(srcdir)"/rsstart1.in | $(AWK) -f "$(srcdir)"/rsstart2.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# FIXME: Gentests can't really deal with something that is both a shell script
+# and requires a locale. We might can fix that ...
+rtlenmb::
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE ; \
+	"$(srcdir)"/rtlen.sh >_$@ || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nofile::
+	@echo $@ $(ZOS_FAIL)
+	@$(AWK) '{}' no/such/file >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+binmode1::
+	@echo $@
+	@$(AWK) -v BINMODE=3 'BEGIN { print BINMODE }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+devfd1::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk 4< "$(srcdir)"/devfd.in1 5< "$(srcdir)"/devfd.in2 >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# The program text is the '1' which will print each record. How compact can you get?
+devfd2::
+	@echo $@
+	@$(AWK) 1 /dev/fd/4 /dev/fd/5 4< "$(srcdir)"/devfd.in1 5< "$(srcdir)"/devfd.in2 >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mixed1::
+	@echo $@
+	@$(AWK) -f /dev/null --source 'BEGIN {return junk}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf5::
+	@echo $@ $(ZOS_FAIL)
+	@-case `uname` in \
+	CYGWIN* | MINGW32* | *MS-DOS*) echo this test fails on this system --- skipping $@ ;; \
+	*) \
+	[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE ; \
+	$(AWK) -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >> _$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	esac
+
+printfbad2: printfbad2.ok
+	@echo $@
+	@$(AWK) --lint -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in 2>&1 | sed 's;$(srcdir)/;;g' >_$@ || echo EXIT CODE: $$?  >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+beginfile1::
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk "$(srcdir)"/$@.awk . ./no/such/file Makefile  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+beginfile2:
+	@echo $@ $(ZOS_FAIL)
+	@-( cd "$(srcdir)" && LC_ALL=C AWK="$(abs_builddir)/$(AWKPROG)" $(abs_srcdir)/$@.sh $(abs_srcdir)/$@.in ) > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dumpvars::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --dump-variables 1 < "$(srcdir)"/$@.in >/dev/null 2>&1 || echo EXIT CODE: $$? >>_$@ || echo EXIT CODE: $$? >> _$@
+	@grep -v ENVIRON < awkvars.out | grep -v PROCINFO > _$@; rm awkvars.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile0:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile1:
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/xref.awk "$(srcdir)"/dtdgport.awk > _$@.out1
+	@$(AWK) --pretty-print=ap-$@.out -f "$(srcdir)"/xref.awk
+	@$(AWK) -f ./ap-$@.out "$(srcdir)"/dtdgport.awk > _$@.out2 ; rm ap-$@.out
+	@-$(CMP) _$@.out1 _$@.out2 && rm _$@.out[12] || { echo EXIT CODE: $$? >>_$@ ; \
+	cp "$(srcdir)"/dtdgport.awk $@.ok ; }
+
+profile2:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -v sortcmd=$(SORT) -f "$(srcdir)"/xref.awk "$(srcdir)"/dtdgport.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile3:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile6:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile7:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile12:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrieee:
+	@echo $@
+	@$(AWK) -M -vPREC=double -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrexprange:
+	@echo $@
+	@$(AWK) -M -vPREC=53 -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrrnd:
+	@echo $@
+	@$(AWK) -M -vPREC=53 -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrsort:
+	@echo $@
+	@$(AWK) -M -vPREC=53 -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfruplus:
+	@echo $@
+	@$(AWK) -M -f "$(srcdir)"/uplus.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrmemok1:
+	@echo $@
+	@$(AWK) -p- -M -f "$(srcdir)"/$@.awk 2>&1 | sed 1d > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+jarebug::
+	@echo $@
+	@"$(srcdir)"/$@.sh "$(AWKPROG)" "$(srcdir)"/$@.awk "$(srcdir)"/$@.in "_$@" || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ordchr2::
+	@echo $@
+	@$(AWK) --load ordchr 'BEGIN {print chr(ord("z"))}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# N.B. If the test fails, create readfile.ok so that "make diffout" will work
+readfile::
+	@echo $@
+	@$(AWK) -l readfile 'BEGIN {printf "%s", readfile("$(srcdir)/Makefile.am")}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)/Makefile.am" _$@ && rm -f _$@ || cp -p "$(srcdir)/Makefile.am" $@.ok
+
+readfile2::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.awk "$(srcdir)"/readdir.awk > _$@ || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+include2::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --include inclib 'BEGIN {print sandwich("a", "b", "c")}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -i inclib -i inclib.awk 'BEGIN {print sandwich("a", "b", "c")}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe2::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f inclib -f inclib.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe3::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f hello -f hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe4::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f hello -i hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe5::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -i hello -f hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe6::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -i inchello -f hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe7::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f hello -i inchello >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inplace1::
+	@echo $@
+	@cp "$(srcdir)"/inplace.1.in _$@.1
+	@cp "$(srcdir)"/inplace.2.in _$@.2
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+	@-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1
+	@-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2
+
+inplace2::
+	@echo $@
+	@cp "$(srcdir)"/inplace.1.in _$@.1
+	@cp "$(srcdir)"/inplace.2.in _$@.2
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+	@-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1
+	@-$(CMP) "$(srcdir)"/$@.1.bak.ok _$@.1.bak && rm -f _$@.1.bak
+	@-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2
+	@-$(CMP) "$(srcdir)"/$@.2.bak.ok _$@.2.bak && rm -f _$@.2.bak
+
+inplace3::
+	@echo $@
+	@cp "$(srcdir)"/inplace.1.in _$@.1
+	@cp "$(srcdir)"/inplace.2.in _$@.2
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "Before"} {gsub(/bar/, "foo"); print} END {print "After"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+	@-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1
+	@-$(CMP) "$(srcdir)"/$@.1.bak.ok _$@.1.bak && rm -f _$@.1.bak
+	@-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2
+	@-$(CMP) "$(srcdir)"/$@.2.bak.ok _$@.2.bak && rm -f _$@.2.bak
+
+testext::
+	@echo $@
+	@$(AWK) ' /^(@load|BEGIN)/,/^}/' "$(top_srcdir)"/extension/testext.c > testext.awk
+	@$(AWK) -f ./testext.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ testext.awk testexttmp.txt
+
+getfile:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -v TESTEXT_QUIET=1 -ltestext -f $@.awk < $(srcdir)/$@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+readdir:
+	@echo $@
+	@if [ "`uname`" = Linux ] && [ "`stat -f . 2>/dev/null | awk 'NR == 2 { print $$NF }'`" = nfs ];  then \
+	echo This test may fail on GNU/Linux systems when run on NFS or JFS filesystems.; \
+	echo If it does, try rerunning on an ext'[234]' filesystem. ; \
+	fi
+	@$(AWK) -f "$(srcdir)"/readdir.awk "$(top_srcdir)" > _$@ || echo EXIT CODE: $$? >> _$@
+	@ls -afi "$(top_srcdir)" > _dirlist
+	@ls -lna "$(top_srcdir)" | sed 1d > _longlist
+	@$(AWK) -f "$(srcdir)"/readdir0.awk -v extout=_$@  \
+		-v dirlist=_dirlist -v longlist=_longlist > $@.ok
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@ _dirlist _longlist
+
+readdir_test:
+	@echo $@
+	@$(AWK) -lreaddir -F/ '{printf "[%s] [%s] [%s] [%s]\n", $$1, $$2, $$3, $$4}' "$(top_srcdir)" > $@.ok
+	@$(AWK) -lreaddir_test '{printf "[%s] [%s] [%s] [%s]\n", $$1, $$2, $$3, $$4}' "$(top_srcdir)" > _$@
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@
+
+readdir_retest:
+	@echo $@
+	@$(AWK) -lreaddir -F/ -f "$(srcdir)"/$@.awk "$(top_srcdir)" > $@.ok
+	@$(AWK) -lreaddir_test -F/ -f "$(srcdir)"/$@.awk "$(top_srcdir)" > _$@
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@
+
+fts:
+	@echo $@
+	@case `uname` in \
+	IRIX) \
+	echo This test may fail on IRIX systems when run on an NFS filesystem.; \
+	echo If it does, try rerunning on an xfs filesystem. ;; \
+	CYGWIN*) \
+	echo This test may fail on CYGWIN systems when run on an NFS filesystem.; \
+	echo If it does, try rerunning on an ntfs filesystem. ;; \
+	esac
+	@$(AWK) -f "$(srcdir)"/fts.awk || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@
+
+# BINMODE=2 is needed for PC tests.
+charasbytes:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -b -v BINMODE=2 -f $@.awk "$(srcdir)"/$@.in | \
+	od -c -t x1 | tr '	' ' ' | sed -e 's/  */ /g' -e 's/ *$$//' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab8:
+	@echo $@ $(ZOS_FAIL)
+	@$(AWK) -d__$@ -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in >_$@
+	@grep -v '^ENVIRON' __$@ | grep -v '^PROCINFO' | grep -v '^FILENAME' >> _$@ ; rm __$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab9:
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f testit.txt
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reginttrad:
+	@echo $@
+	@$(AWK) --traditional -r -f "$(srcdir)"/$@.awk > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+colonwarn:
+	@echo $@
+	@for i in 1 2 3 ; \
+	do $(AWK) -f "$(srcdir)"/$@.awk $$i < "$(srcdir)"/$@.in ; \
+	done > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugeval::
+	@echo $@
+	@if [ -t 0 ]; then \
+	$(AWK) --debug -f /dev/null < "$(srcdir)"/$@.in > _$@  2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	fi
+
+filefuncs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk -v builddir="$(abs_top_builddir)"  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+genpot:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk --gen-pot >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+negtime::
+	@echo $@
+	@TZ=GMT AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@AWKPATH="$(srcdir)" $(AWK) -f checknegtime.awk "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+watchpoint1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -D -f $@.awk $(srcdir)/$@.in < $(srcdir)/$@.script >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pty1:
+	@echo $@
+	@-case `uname` in \
+	*[Oo][Ss]/390*) : ;; \
+	*) AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ;; \
+	esac
+
+## 1/2018: The awk goop is to compensate for different output of od on
+## Mac OS X systems. Sigh.
+pty2:
+	@echo $@
+	@-case `uname` in \
+	*[Oo][Ss]/390*) : ;; \
+	*) AWKPATH="$(srcdir)" $(AWK) -f $@.awk | od -c | $(AWK) '{ $$1 = $$1 ; print }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ;; \
+	esac
+
+ignrcas3::
+	@echo $@
+	@if locale -a | grep el_GR.iso88597 > /dev/null ; then \
+	[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=el_GR.iso88597 ; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	fi
+
+arrdbg:
+	@echo $@
+	@$(AWK) -v "okfile=./$@.ok" -f "$(srcdir)"/$@.awk | grep array_f >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) ./$@.ok _$@ && rm -f _$@ ./$@.ok
+
+sourcesplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --source='BEGIN { a = 5;' --source='print a }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+eofsrc1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@a.awk -f $@b.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsbad_cmd:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -v foo:bar=3 -v foo:::blat=4 1 /dev/null >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+
+# Use [:] in the regexp to keep MSYS from converting the /'s to \'s.
+nonfatal1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk 2>&1 | $(AWK) '{print gensub(/invalid[:].*$$/, "invalid", 1, $$0)}' >_$@ || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# 4/2018: On first call to $(CMP), send to /dev/null even with -s for MinGW.
+nlstringtest::
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=fr_FR.UTF-8 ; export GAWKLOCALE ; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk "$(srcdir)" >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if $(CMP) -s "$(srcdir)"/nlstringtest-nogettext.ok _$@ > /dev/null ; \
+	then \
+		rm -f _$@ ; \
+	else \
+		$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	fi
+
+
+longwrds:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk -v SORT="$(SORT)" < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+
+spacere:
+	@echo $@
+	@LC_ALL=C AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex4:
+	@echo $@
+	@$(AWK) -v x=@/foo/ -f "$(srcdir)"/$@.awk y=@/bar/ /dev/null >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# Targets generated for other tests:
+include Maketests
+
+Maketests: $(srcdir)/Makefile.am $(srcdir)/Gentests
+	files=`cd "$(srcdir)" && echo *.awk *.in *.sh`; \
+	$(AWK) -f "$(srcdir)"/Gentests "$(srcdir)"/Makefile.am $$files > $@
+
+clean-local:
+	rm -fr _* core core.* fmtspcl.ok junk strftime.ok test1 test2 \
+	seq *~ readfile.ok fork.tmp.* testext.awk fts.ok readdir.ok \
+	readdir_test.ok readdir_retest.ok \
+	profile1.ok
+
+# An attempt to print something that can be grepped for in build logs
+pass-fail:
+	@COUNT=`ls _* 2>/dev/null | wc -l` ; \
+	if test $$COUNT = 0 ; \
+	then	echo ALL TESTS PASSED ; \
+	else	echo $$COUNT TESTS FAILED ; exit 1; \
+	fi
+
+# This target for my convenience to look at all the results
+# Don't use POSIX or bash-isms so that it'll work on !@#$%^&*() Solaris.
+diffout:
+	for i in _* ; \
+	do  \
+		if [ "$$i" != "_*" ]; then \
+		echo ============== $$i ============= ; \
+		base=`echo $$i | sed 's/^_//'` ; \
+		if [ -r $${base}.ok ]; then \
+		diff -c $${base}.ok $$i ; \
+		else \
+		diff -c "$(srcdir)"/$${base}.ok  $$i ; \
+		fi ; \
+		fi ; \
+	done | more
+
+# convenient way to scan valgrind results for errors
+valgrind-scan:
+	@echo "Scanning valgrind log files for problems:"
+	@$(AWK) -f "$(srcdir)"/valgrind.awk log.[0-9]*
+
+# This target is for testing with electric fence.
+efence:
+	for i in $$(ls _* | sed 's;_\(.*\);\1;') ; \
+	do \
+		bad=$$(wc -l < _$$i) \
+		ok=$$(wc -l < $$i.ok) ; \
+		if (( $$bad == $$ok + 2 )) ; \
+		then \
+			rm _$$i ; \
+		fi ; \
+	done
diff --git a/gawk-5.0.1/test/Makefile.in b/gawk-5.0.1/test/Makefile.in
new file mode 100644
index 00000000000..5496d3cff7a
--- /dev/null
+++ b/gawk-5.0.1/test/Makefile.in
@@ -0,0 +1,5016 @@
+# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+#
+# test/Makefile.am --- automake input file for gawk
+#
+# Copyright (C) 1988-2019 the Free Software Foundation, Inc.
+#
+# This file is part of GAWK, the GNU implementation of the
+# AWK Programming Language.
+#
+# GAWK is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# GAWK is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+#
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = test
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/arch.m4 \
+	$(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/lib-ld.m4 \
+	$(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \
+	$(top_srcdir)/m4/libsigsegv.m4 $(top_srcdir)/m4/longlong.m4 \
+	$(top_srcdir)/m4/mpfr.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/noreturn.m4 $(top_srcdir)/m4/po.m4 \
+	$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/readline.m4 \
+	$(top_srcdir)/m4/socket.m4 $(top_srcdir)/m4/ulonglong.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Maketests \
+	$(top_srcdir)/mkinstalldirs ChangeLog README
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = $(LOCALES) AWKLIBPATH=../extension/.libs $(VALGRIND) $(AWKPROG)
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+GAWKLIBEXT = @GAWKLIBEXT@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GREP = @GREP@
+HAVE_LIBSIGSEGV = @HAVE_LIBSIGSEGV@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+LDFLAGS = @LDFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBMPFR = @LIBMPFR@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBSIGSEGV = @LIBSIGSEGV@
+LIBSIGSEGV_PREFIX = @LIBSIGSEGV_PREFIX@
+LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+LTLIBSIGSEGV = @LTLIBSIGSEGV@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SOCKET_LIBS = @SOCKET_LIBS@
+STRIP = @STRIP@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+YACC = @YACC@
+YFLAGS = @YFLAGS@
+ZOS_FAIL = @ZOS_FAIL@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+acl_shlibext = @acl_shlibext@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgextensiondir = @pkgextensiondir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = \
+	reg \
+	lib \
+	ChangeLog.0 \
+	ChangeLog.1 \
+	Gentests \
+	Maketests \
+	README \
+	aadelete1.awk \
+	aadelete1.ok \
+	aadelete2.awk \
+	aadelete2.ok \
+	aarray1.awk \
+	aarray1.ok \
+	aasort.awk \
+	aasort.ok \
+	aasorti.awk \
+	aasorti.ok \
+	addcomma.awk \
+	addcomma.in \
+	addcomma.ok \
+	anchgsub.awk \
+	anchgsub.in \
+	anchgsub.ok \
+	anchor.awk \
+	anchor.in \
+	anchor.ok \
+	apiterm.awk \
+	apiterm.in \
+	apiterm.ok \
+	argarray.awk \
+	argarray.in \
+	argarray.ok \
+	argtest.awk \
+	argtest.ok \
+	arrayind1.awk \
+	arrayind1.in \
+	arrayind1.ok \
+	arrayind2.awk \
+	arrayind2.ok \
+	arrayind3.awk \
+	arrayind3.ok \
+	arrayparm.awk \
+	arrayparm.ok \
+	arrayprm2.awk \
+	arrayprm2.ok \
+	arrayprm3.awk \
+	arrayprm3.ok \
+	arrayref.awk \
+	arrayref.ok \
+	arraysort.awk \
+	arraysort.ok \
+	arraysort2.awk \
+	arraysort2.ok \
+	arraytype.awk \
+	arraytype.ok \
+	arrdbg.awk \
+	arrymem1.awk \
+	arrymem1.ok \
+	arryref2.awk \
+	arryref2.ok \
+	arryref3.awk \
+	arryref3.ok \
+	arryref4.awk \
+	arryref4.ok \
+	arryref5.awk \
+	arryref5.ok \
+	arynasty.awk \
+	arynasty.ok \
+	arynocls.awk \
+	arynocls.in \
+	arynocls.ok \
+	aryprm1.awk \
+	aryprm1.ok \
+	aryprm2.awk \
+	aryprm2.ok \
+	aryprm3.awk \
+	aryprm3.ok \
+	aryprm4.awk \
+	aryprm4.ok \
+	aryprm5.awk \
+	aryprm5.ok \
+	aryprm6.awk \
+	aryprm6.ok \
+	aryprm7.awk \
+	aryprm7.ok \
+	aryprm8.awk \
+	aryprm8.ok \
+	aryprm9.awk \
+	aryprm9.ok \
+	arysubnm.awk \
+	arysubnm.ok \
+	aryunasgn.awk \
+	aryunasgn.ok \
+	asgext.awk \
+	asgext.in \
+	asgext.ok \
+	asort.awk \
+	asort.ok \
+	asorti.awk \
+	asorti.ok \
+	assignnumfield.awk \
+	assignnumfield.in \
+	assignnumfield.ok \
+	assignnumfield2.awk \
+	assignnumfield2.ok \
+	awkpath.ok \
+	back89.awk \
+	back89.in \
+	back89.ok \
+	backgsub.awk \
+	backgsub.in \
+	backgsub.ok \
+	backw.awk \
+	backw.in \
+	backw.ok \
+	backbigs1.awk \
+	backbigs1.in \
+	backbigs1.ok \
+	backsmalls1.awk \
+	backsmalls1.in \
+	backsmalls1.ok \
+	backsmalls2.awk \
+	backsmalls2.ok \
+	badargs.ok \
+	badassign1.awk \
+	badassign1.ok \
+	badbuild.awk \
+	badbuild.in \
+	badbuild.ok \
+	beginfile1.awk \
+	beginfile1.ok \
+	beginfile2.in \
+	beginfile2.ok \
+	beginfile2.sh \
+	binmode1.ok \
+	callparam.awk \
+	callparam.ok \
+	charasbytes.awk \
+	charasbytes.in \
+	charasbytes.ok \
+	checknegtime.awk \
+	childin.awk \
+	childin.in \
+	childin.ok \
+	clobber.awk \
+	clobber.ok \
+	clos1way.awk \
+	clos1way.ok \
+	clos1way2.awk \
+	clos1way2.in \
+	clos1way2.ok \
+	clos1way3.awk \
+	clos1way3.ok \
+	clos1way4.awk \
+	clos1way4.ok \
+	clos1way5.awk \
+	clos1way5.ok \
+	clos1way6.awk \
+	clos1way6.ok \
+	closebad.awk \
+	closebad.ok \
+	clsflnam.awk \
+	clsflnam.in \
+	clsflnam.ok \
+	colonwarn.awk \
+	colonwarn.in \
+	colonwarn.ok \
+	compare.awk \
+	compare.in \
+	compare.ok \
+	compare2.awk \
+	compare2.ok \
+	concat1.awk \
+	concat1.in \
+	concat1.ok \
+	concat2.awk \
+	concat2.ok \
+	concat3.awk \
+	concat3.ok \
+	concat4.awk \
+	concat4.in \
+	concat4.ok \
+	concat5.awk \
+	concat5.ok \
+	convfmt.awk \
+	convfmt.ok \
+	crlf.awk \
+	crlf.ok \
+	datanonl.awk \
+	datanonl.in \
+	datanonl.ok \
+	dbugeval.in \
+	dbugeval.ok \
+	dbugeval2.awk \
+	dbugeval2.in \
+	dbugeval2.ok \
+	dbugeval3.awk \
+	dbugeval3.in \
+	dbugeval3.ok \
+	dbugtypedre1.awk \
+	dbugtypedre1.in \
+	dbugtypedre1.ok \
+	dbugtypedre2.awk \
+	dbugtypedre2.in \
+	dbugtypedre2.ok \
+	defref.awk \
+	defref.ok \
+	delargv.awk \
+	delargv.ok \
+	delarpm2.awk \
+	delarpm2.ok \
+	delarprm.awk \
+	delarprm.ok \
+	delfunc.awk \
+	delfunc.ok \
+	delsub.awk \
+	delsub.ok \
+	devfd.in1 \
+	devfd.in2 \
+	devfd.in4 \
+	devfd.in5 \
+	devfd.ok \
+	devfd1.awk \
+	devfd1.ok \
+	devfd2.ok \
+	dfacheck1.awk \
+	dfacheck1.in \
+	dfacheck1.ok \
+	dfamb1.awk \
+	dfamb1.in \
+	dfamb1.ok \
+	dfastress.awk \
+	dfastress.ok \
+	double1.awk \
+	double1.ok \
+	double2.awk \
+	double2.ok \
+	dtdgport.awk \
+	dumpvars.in \
+	dumpvars.ok \
+	dynlj.awk \
+	dynlj.ok \
+	eofsplit.awk \
+	eofsplit.ok \
+	eofsrc1a.awk \
+	eofsrc1b.awk \
+	eofsrc1.ok \
+	errno.awk \
+	errno.in \
+	errno.ok \
+	exit.ok \
+	exit.sh \
+	exit2.awk \
+	exit2.ok \
+	exitval1.awk \
+	exitval1.ok \
+	exitval2.awk \
+	exitval2.ok \
+	exitval2.w32 \
+	exitval3.awk \
+	exitval3.ok \
+	fcall_exit.awk \
+	fcall_exit.ok \
+	fcall_exit2.awk \
+	fcall_exit2.in \
+	fcall_exit2.ok \
+	fflush.ok \
+	fflush.sh \
+	fieldwdth.awk \
+	fieldwdth.in \
+	fieldwdth.ok \
+	filefuncs.awk \
+	filefuncs.ok \
+	fix-fmtspcl.awk \
+	fldchg.awk \
+	fldchg.in \
+	fldchg.ok \
+	fldchgnf.awk \
+	fldchgnf.in \
+	fldchgnf.ok \
+	fldterm.awk \
+	fldterm.in \
+	fldterm.ok \
+	fmtspcl-mpfr.ok \
+	fmtspcl.awk \
+	fmtspcl.tok \
+	fmttest.awk \
+	fmttest.ok \
+	fnamedat.awk \
+	fnamedat.in \
+	fnamedat.ok \
+	fnarray.awk \
+	fnarray.ok \
+	fnarray2.awk \
+	fnarray2.in \
+	fnarray2.ok \
+	fnarydel-mpfr.ok \
+	fnarydel.awk \
+	fnarydel.ok \
+	fnaryscl.awk \
+	fnaryscl.ok \
+	fnasgnm.awk \
+	fnasgnm.in \
+	fnasgnm.ok \
+	fnmatch.awk \
+	fnmatch.ok \
+	fnmisc.awk \
+	fnmisc.ok \
+	fnparydl-mpfr.ok \
+	fnparydl.awk \
+	fnparydl.ok \
+	forcenum.awk \
+	forcenum.ok \
+	fordel.awk \
+	fordel.ok \
+	fork.awk \
+	fork.ok \
+	fork2.awk \
+	fork2.ok \
+	forref.awk \
+	forref.ok \
+	forsimp.awk \
+	forsimp.ok \
+	fpat1.awk \
+	fpat1.in \
+	fpat1.ok \
+	fpat2.awk \
+	fpat2.ok \
+	fpat3.awk \
+	fpat3.in \
+	fpat3.ok \
+	fpat4.awk \
+	fpat4.ok \
+	fpat5.awk \
+	fpat5.in \
+	fpat5.ok \
+	fpat6.awk \
+	fpat6.in \
+	fpat6.ok \
+	fpatnull.awk \
+	fpatnull.in \
+	fpatnull.ok \
+	fsbs.awk \
+	fsbs.in \
+	fsbs.ok \
+	fscaret.awk \
+	fscaret.in \
+	fscaret.ok \
+	fsfwfs.awk \
+	fsfwfs.in \
+	fsfwfs.ok \
+	fsnul1.awk \
+	fsnul1.in \
+	fsnul1.ok \
+	fsrs.awk \
+	fsrs.in \
+	fsrs.ok \
+	fsspcoln.awk \
+	fsspcoln.in \
+	fsspcoln.ok \
+	fstabplus.awk \
+	fstabplus.in \
+	fstabplus.ok \
+	fts.awk \
+	functab1.awk \
+	functab1.ok \
+	functab2.awk \
+	functab2.ok \
+	functab3.awk \
+	functab3.ok \
+	functab4.awk \
+	functab4.ok \
+	funlen.awk \
+	funlen.in \
+	funlen.ok \
+	funsemnl.awk \
+	funsemnl.ok \
+	funsmnam.awk \
+	funsmnam.ok \
+	funstack.awk \
+	funstack.in \
+	funstack.ok \
+	fwtest.awk \
+	fwtest.in \
+	fwtest.ok \
+	fwtest2.awk \
+	fwtest2.in \
+	fwtest2.ok \
+	fwtest3.awk \
+	fwtest3.in \
+	fwtest3.ok \
+	fwtest4.awk \
+	fwtest4.in \
+	fwtest4.ok \
+	fwtest5.awk \
+	fwtest5.in \
+	fwtest5.ok \
+	fwtest6.awk \
+	fwtest6.in \
+	fwtest6.ok \
+	fwtest7.awk \
+	fwtest7.in \
+	fwtest7.ok \
+	fwtest8.awk \
+	fwtest8.in \
+	fwtest8.ok \
+	genpot.awk \
+	genpot.ok \
+	gensub.awk \
+	gensub.in \
+	gensub.ok \
+	gensub2.awk \
+	gensub2.ok \
+	gensub3.awk \
+	gensub3.in \
+	gensub3.ok \
+	getfile.awk \
+	getfile.ok \
+	getline.awk \
+	getline.in \
+	getline.ok \
+	getline2.awk \
+	getline2.ok \
+	getline3.awk \
+	getline3.ok \
+	getline4.awk \
+	getline4.in \
+	getline4.ok \
+	getline5.awk \
+	getline5.ok \
+	getlnbuf.awk \
+	getlnbuf.in \
+	getlnbuf.ok \
+	getlndir.awk \
+	getlndir.ok \
+	getlnhd.awk \
+	getlnhd.ok \
+	getnr2tb.awk \
+	getnr2tb.in \
+	getnr2tb.ok \
+	getnr2tm.awk \
+	getnr2tm.in \
+	getnr2tm.ok \
+	gnuops2.awk \
+	gnuops2.ok \
+	gnuops3.awk \
+	gnuops3.ok \
+	gnureops.awk \
+	gnureops.ok \
+	gsubasgn.awk \
+	gsubasgn.ok \
+	gsubind.awk \
+	gsubind.ok \
+	gsubtest.awk \
+	gsubtest.ok \
+	gsubtst2.awk \
+	gsubtst2.ok \
+	gsubtst3.awk \
+	gsubtst3.in \
+	gsubtst3.ok \
+	gsubtst4.awk \
+	gsubtst4.ok \
+	gsubtst5.awk \
+	gsubtst5.in \
+	gsubtst5.ok \
+	gsubtst6.awk \
+	gsubtst6.ok \
+	gsubtst7.awk \
+	gsubtst7.in \
+	gsubtst7.ok \
+	gsubtst8.awk \
+	gsubtst8.in \
+	gsubtst8.ok \
+	gtlnbufv.awk \
+	hello.awk \
+	hex.awk \
+	hex.ok \
+	hex2.awk \
+	hex2.in \
+	hex2.ok \
+	hsprint.awk \
+	hsprint.ok \
+	icasefs.awk \
+	icasefs.ok \
+	icasers.awk \
+	icasers.in \
+	icasers.ok \
+	inpref.awk \
+	inpref.in \
+	inpref.ok \
+	id.awk \
+	id.ok \
+	igncdym.awk \
+	igncdym.in \
+	igncdym.ok \
+	igncfs.awk \
+	igncfs.in \
+	igncfs.ok \
+	ignrcas2.awk \
+	ignrcas2.ok \
+	ignrcas3.awk \
+	ignrcas3.ok \
+	ignrcas4.awk \
+	ignrcas4.ok \
+	ignrcase.awk \
+	ignrcase.in \
+	ignrcase.ok \
+	incdupe.ok \
+	incdupe2.ok \
+	incdupe3.ok \
+	incdupe4.ok \
+	incdupe5.ok \
+	incdupe6.ok \
+	incdupe7.ok \
+	inchello.awk \
+	inclib.awk \
+	include.awk \
+	include.ok \
+	include2.ok \
+	indirectbuiltin.awk \
+	indirectbuiltin.ok \
+	indirectcall.awk \
+	indirectcall.in \
+	indirectcall.ok \
+	indirectcall2.awk \
+	indirectcall2.ok \
+	inftest.awk \
+	inftest.ok \
+	inplace.in \
+	inplace.1.in \
+	inplace.2.in \
+	inplace1.ok \
+	inplace1.1.ok \
+	inplace1.2.ok \
+	inplace2.ok \
+	inplace2.1.ok \
+	inplace2.1.bak.ok \
+	inplace2.2.ok \
+	inplace2.2.bak.ok \
+	inplace3.ok \
+	inplace3.1.ok \
+	inplace3.1.bak.ok \
+	inplace3.2.ok \
+	inplace3.2.bak.ok \
+	inputred.awk \
+	inputred.ok \
+	intarray.awk \
+	intarray.ok \
+	intest.awk \
+	intest.ok \
+	intformat.awk \
+	intformat.ok \
+	intprec.awk \
+	intprec.ok \
+	iobug1.awk \
+	iobug1.ok \
+	isarrayunset.awk \
+	isarrayunset.ok \
+	jarebug.awk \
+	jarebug.in \
+	jarebug.ok \
+	jarebug.sh \
+	lc_num1.awk \
+	lc_num1.ok \
+	leaddig.awk \
+	leaddig.ok \
+	leadnl.awk \
+	leadnl.in \
+	leadnl.ok \
+	lint.awk \
+	lint.ok \
+	lintexp.awk \
+	lintexp.ok \
+	lintindex.awk \
+	lintindex.ok \
+	lintint.awk \
+	lintint.ok \
+	lintlength.awk \
+	lintlength.ok \
+	lintold.awk \
+	lintold.in \
+	lintold.ok \
+	lintset.awk \
+	lintset.ok \
+	lintwarn.awk \
+	lintwarn.ok \
+	litoct.awk \
+	litoct.in \
+	litoct.ok \
+	localenl.ok \
+	localenl.sh \
+	longsub.awk \
+	longsub.in \
+	longsub.ok \
+	longwrds.awk \
+	longwrds.in \
+	longwrds.ok \
+	manglprm.awk \
+	manglprm.in \
+	manglprm.ok \
+	manyfiles.awk \
+	manyfiles.ok \
+	muldimposix.awk \
+	muldimposix.ok \
+	match1.awk \
+	match1.ok \
+	match2.awk \
+	match2.ok \
+	match3.awk \
+	match3.in \
+	match3.ok \
+	math.awk \
+	math.ok \
+	mbfw1.awk \
+	mbfw1.in \
+	mbfw1.ok \
+	mbprintf1.awk \
+	mbprintf1.in \
+	mbprintf1.ok \
+	mbprintf2.awk \
+	mbprintf2.ok \
+	mbprintf3.awk \
+	mbprintf3.in \
+	mbprintf3.ok \
+	mbprintf4.awk \
+	mbprintf4.in \
+	mbprintf4.ok \
+	mbprintf5.awk \
+	mbprintf5.in \
+	mbprintf5.ok \
+	mbstr1.awk \
+	mbstr1.ok \
+	mbstr2.awk \
+	mbstr2.in \
+	mbstr2.ok \
+	membug1.awk \
+	membug1.in \
+	membug1.ok \
+	memleak.awk \
+	memleak.ok \
+	messages.awk \
+	minusstr.awk \
+	minusstr.ok \
+	mixed1.ok \
+	mktime.awk \
+	mktime.in \
+	mktime.ok \
+	mmap8k.awk \
+	mmap8k.in \
+	mmap8k.ok \
+	mpfrbigint.awk \
+	mpfrbigint.ok \
+	mpfrbigint2.awk \
+	mpfrbigint2.in \
+	mpfrbigint2.ok \
+	mpfrexprange.awk \
+	mpfrexprange.ok \
+	mpfrfield.awk \
+	mpfrfield.in \
+	mpfrfield.ok \
+	mpfrieee.awk \
+	mpfrieee.ok \
+	mpfrmemok1.awk \
+	mpfrmemok1.ok \
+	mpfrnegzero.awk \
+	mpfrnegzero.ok \
+	mpfrnr.awk \
+	mpfrnr.in \
+	mpfrnr.ok \
+	mpfrrem.awk \
+	mpfrrem.ok \
+	mpfrrnd.awk \
+	mpfrrnd.ok \
+	mpfrrndeval.awk \
+	mpfrrndeval.ok \
+	mpfrsort.awk \
+	mpfrsort.ok \
+	mpfrsqrt.awk \
+	mpfrsqrt.ok \
+	mpfrstrtonum.awk \
+	mpfrstrtonum.ok \
+	mpfruplus.ok \
+	mpgforcenum.awk \
+	mpgforcenum.ok \
+	mtchi18n.awk \
+	mtchi18n.in \
+	mtchi18n.ok \
+	nasty.awk \
+	nasty.ok \
+	nasty2.awk \
+	nasty2.ok \
+	nastyparm.awk \
+	nastyparm.ok \
+	negexp.awk \
+	negexp.ok \
+	negrange.awk \
+	negrange.ok \
+	negtime.awk \
+	negtime.ok \
+	nested.awk \
+	nested.in \
+	nested.ok \
+	next.ok \
+	next.sh \
+	nfldstr.awk \
+	nfldstr.in \
+	nfldstr.ok \
+	nfloop.awk \
+	nfloop.ok \
+	nfneg.awk \
+	nfneg.ok \
+	nfset.awk \
+	nfset.in \
+	nfset.ok \
+	nlfldsep.awk \
+	nlfldsep.in \
+	nlfldsep.ok \
+	nlinstr.awk \
+	nlinstr.in \
+	nlinstr.ok \
+	nlstrina.awk \
+	nlstrina.ok \
+	nlstringtest.awk \
+	nlstringtest.ok \
+	nlstringtest.po \
+	nlstringtest-nogettext.ok \
+	fr \
+	noeffect.awk \
+	noeffect.ok \
+	nofile.ok \
+	nofmtch.awk \
+	nofmtch.ok \
+	noloop1.awk \
+	noloop1.in \
+	noloop1.ok \
+	noloop2.awk \
+	noloop2.in \
+	noloop2.ok \
+	nondec.awk \
+	nondec.ok \
+	nondec2.awk \
+	nondec2.ok \
+	nonfatal1.awk \
+	nonfatal1.ok \
+	nonfatal2.awk \
+	nonfatal2.ok \
+	nonfatal3.awk \
+	nonfatal3.ok \
+	nonl.awk \
+	nonl.in \
+	nonl.ok \
+	noparms.awk \
+	noparms.ok \
+	nors.in \
+	nors.ok \
+	nsbad.awk \
+	nsbad.ok \
+	nsbad_cmd.ok \
+	nsforloop.awk \
+	nsforloop.ok \
+	nsfuncrecurse.awk \
+	nsfuncrecurse.ok \
+	nsindirect1.awk \
+	nsindirect1.ok \
+	nsindirect2.awk \
+	nsindirect2.ok \
+	nsprof1.awk \
+	nsprof1.ok \
+	nsprof2.awk \
+	nsprof2.ok \
+	nulinsrc.awk \
+	nulinsrc.ok \
+	nulrsend.awk \
+	nulrsend.in \
+	nulrsend.ok \
+	numindex.awk \
+	numindex.in \
+	numindex.ok \
+	numrange.awk \
+	numrange.ok \
+	numstr1.awk \
+	numstr1.ok \
+	numsubstr.awk \
+	numsubstr.in \
+	numsubstr.ok \
+	octsub.awk \
+	octsub.ok \
+	ofmt.awk \
+	ofmt.in \
+	ofmt.ok \
+	ofmta.awk \
+	ofmta.ok \
+	ofmtbig.awk \
+	ofmtbig.in \
+	ofmtbig.ok \
+	ofmtfidl.awk \
+	ofmtfidl.in \
+	ofmtfidl.ok \
+	ofmts.awk \
+	ofmts.in \
+	ofmts.ok \
+	ofmtstrnum.awk \
+	ofmtstrnum.ok \
+	ofs1.awk \
+	ofs1.in \
+	ofs1.ok \
+	onlynl.awk \
+	onlynl.in \
+	onlynl.ok \
+	opasnidx.awk \
+	opasnidx.ok \
+	opasnslf.awk \
+	opasnslf.ok \
+	ordchr.awk \
+	ordchr.ok \
+	ordchr2.ok \
+	out1.ok \
+	out2.ok \
+	out3.ok \
+	paramasfunc1.awk \
+	paramasfunc1.ok \
+	paramasfunc2.awk \
+	paramasfunc2.ok \
+	paramdup.awk \
+	paramdup.ok \
+	paramres.awk \
+	paramres.ok \
+	paramtyp.awk \
+	paramtyp.ok \
+	paramuninitglobal.awk \
+	paramuninitglobal.ok \
+	parse1.awk \
+	parse1.in \
+	parse1.ok \
+	parsefld.awk \
+	parsefld.in \
+	parsefld.ok \
+	parseme.awk \
+	parseme.ok \
+	patsplit.awk \
+	patsplit.ok \
+	pcntplus.awk \
+	pcntplus.ok \
+	pid.awk \
+	pid.ok \
+	pid.sh \
+	pipeio1.awk \
+	pipeio1.ok \
+	pipeio2.awk \
+	pipeio2.in \
+	pipeio2.ok \
+	posix.awk \
+	posix.in \
+	posix.ok \
+	posix2008sub.awk \
+	posix2008sub.ok \
+	poundbang.awk \
+	prdupval.awk \
+	prdupval.in \
+	prdupval.ok \
+	prec.awk \
+	prec.ok \
+	printf0.awk \
+	printf0.ok \
+	printf1.awk \
+	printf1.ok \
+	printfbad1.awk \
+	printfbad1.ok \
+	printfbad2.awk \
+	printfbad2.in \
+	printfbad2.ok \
+	printfbad3.awk \
+	printfbad3.ok \
+	printfbad4.awk \
+	printfbad4.ok \
+	printfchar.awk \
+	printfchar.ok \
+	printfloat.awk \
+	printhuge.awk \
+	printhuge.ok \
+	printlang.awk \
+	prmarscl.awk \
+	prmarscl.ok \
+	prmreuse.awk \
+	prmreuse.ok \
+	procinfs.awk \
+	procinfs.ok \
+	profile0.awk \
+	profile0.in \
+	profile0.ok \
+	profile2.ok \
+	profile3.awk \
+	profile3.ok \
+	profile4.awk \
+	profile4.ok \
+	profile5.awk \
+	profile5.ok \
+	profile6.awk \
+	profile6.ok \
+	profile7.awk \
+	profile7.ok \
+	profile8.awk \
+	profile8.ok \
+	profile9.awk \
+	profile9.ok \
+	profile10.awk \
+	profile10.ok \
+	profile11.awk \
+	profile11.ok \
+	profile12.awk \
+	profile12.in \
+	profile12.ok \
+	prt1eval.awk \
+	prt1eval.ok \
+	prtoeval.awk \
+	prtoeval.ok \
+	pty1.awk \
+	pty1.ok \
+	pty2.awk \
+	pty2.ok \
+	rand-mpfr.ok \
+	rand.awk \
+	rand.ok \
+	randtest.sh \
+	randtest.ok \
+	range1.awk \
+	range1.in \
+	range1.ok \
+	range2.awk \
+	range2.ok \
+	readbuf.awk \
+	readbuf.ok \
+	readdir.awk \
+	readdir0.awk \
+	readdir_retest.awk \
+	readfile2.awk \
+	readfile2.ok \
+	rebrackloc.awk \
+	rebrackloc.in \
+	rebrackloc.ok \
+	rebt8b1.awk \
+	rebt8b1.ok \
+	rebt8b2.awk \
+	rebt8b2.ok \
+	rebuf.awk \
+	rebuf.in \
+	rebuf.ok \
+	rebuild.awk \
+	rebuild.in \
+	rebuild.ok \
+	redfilnm.awk \
+	redfilnm.in \
+	redfilnm.ok \
+	regeq.awk \
+	regeq.in \
+	regeq.ok \
+	regexpbrack.awk \
+	regexpbrack.in \
+	regexpbrack.ok \
+	regexpbrack2.awk \
+	regexpbrack2.in \
+	regexpbrack2.ok \
+	regexprange.awk \
+	regexprange.ok \
+	reginttrad.awk \
+	reginttrad.ok \
+	regnul1.awk \
+	regnul1.ok \
+	regnul2.awk \
+	regnul2.ok \
+	regrange.awk \
+	regrange.ok \
+	regtest.sh \
+	regx8bit.awk \
+	regx8bit.ok \
+	reindops.awk \
+	reindops.in \
+	reindops.ok \
+	reint.awk \
+	reint.in \
+	reint.ok \
+	reint2.awk \
+	reint2.in \
+	reint2.ok \
+	reparse.awk \
+	reparse.in \
+	reparse.ok \
+	resplit.awk \
+	resplit.in \
+	resplit.ok \
+	revout.awk \
+	revout.ok \
+	revtwoway.awk \
+	revtwoway.ok \
+	rri1.awk \
+	rri1.in \
+	rri1.ok \
+	rs.awk \
+	rs.in \
+	rs.ok \
+	rscompat.awk \
+	rscompat.in \
+	rscompat.ok \
+	rsgetline.awk \
+	rsgetline.in \
+	rsgetline.ok \
+	rsglstdin.ok \
+	rsnul1nl.awk \
+	rsnul1nl.in \
+	rsnul1nl.ok \
+	rsnulbig.ok \
+	rsnulbig2.ok \
+	rsstart1.awk \
+	rsstart1.in \
+	rsstart1.ok \
+	rsstart2.awk \
+	rsstart2.in \
+	rsstart2.ok \
+	rsstart3.ok \
+	rstest1.awk \
+	rstest1.ok \
+	rstest2.awk \
+	rstest2.ok \
+	rstest3.awk \
+	rstest3.ok \
+	rstest4.awk \
+	rstest4.ok \
+	rstest5.awk \
+	rstest5.ok \
+	rstest6.awk \
+	rstest6.in \
+	rstest6.ok \
+	rswhite.awk \
+	rswhite.in \
+	rswhite.ok \
+	rtlen.ok \
+	rtlen.sh \
+	rtlenmb.ok \
+	rtlen01.ok \
+	rtlen01.sh \
+	rwarray.awk \
+	rwarray.in \
+	rwarray.ok \
+	sandbox1.awk \
+	sandbox1.ok \
+	scalar.awk \
+	scalar.ok \
+	sclforin.awk \
+	sclforin.ok \
+	sclifin.awk \
+	sclifin.ok \
+	setrec0.awk \
+	setrec0.in \
+	setrec0.ok \
+	setrec1.awk \
+	setrec1.ok \
+	shadow.awk \
+	shadow.ok \
+	shadowbuiltin.awk \
+	shadowbuiltin.ok \
+	sigpipe1.awk \
+	sigpipe1.ok \
+	sort1.awk \
+	sort1.ok \
+	sortempty.awk \
+	sortempty.ok \
+	sortfor.awk \
+	sortfor.in \
+	sortfor.ok \
+	sortfor2.awk \
+	sortfor2.in \
+	sortfor2.ok \
+	sortglos.awk \
+	sortglos.in \
+	sortglos.ok \
+	sortu.awk \
+	sortu.ok \
+	sourcesplit.ok \
+	space.ok \
+	spacere.awk \
+	spacere.ok \
+	split_after_fpat.awk \
+	split_after_fpat.in \
+	split_after_fpat.ok \
+	splitarg4.awk \
+	splitarg4.in \
+	splitarg4.ok \
+	splitargv.awk \
+	splitargv.in \
+	splitargv.ok \
+	splitarr.awk \
+	splitarr.ok \
+	splitdef.awk \
+	splitdef.ok \
+	splitvar.awk \
+	splitvar.in \
+	splitvar.ok \
+	splitwht.awk \
+	splitwht.ok \
+	sprintfc.awk \
+	sprintfc.in \
+	sprintfc.ok \
+	status-close.awk \
+	status-close.ok \
+	strcat1.awk \
+	strcat1.ok \
+	strftime.awk \
+	strftlng.awk \
+	strftlng.ok \
+	strftfld.awk \
+	strftfld.in \
+	strftfld.ok \
+	strnum1.awk \
+	strnum1.ok \
+	strnum2.awk \
+	strnum2.ok \
+	strtod.awk \
+	strtod.in \
+	strtod.ok \
+	strtonum.awk \
+	strtonum.ok \
+	strtonum1.awk \
+	strtonum1.ok \
+	subamp.awk \
+	subamp.in \
+	subamp.ok \
+	subback.awk \
+	subback.in \
+	subback.ok \
+	subi18n.awk \
+	subi18n.ok \
+	subsepnm.awk \
+	subsepnm.ok \
+	subslash.awk \
+	subslash.ok \
+	substr.awk \
+	substr.ok \
+	swaplns.awk \
+	swaplns.in \
+	swaplns.ok \
+	switch2.awk \
+	switch2.ok \
+	symtab1.awk \
+	symtab1.ok \
+	symtab2.awk \
+	symtab2.ok \
+	symtab3.awk \
+	symtab3.ok \
+	symtab4.awk \
+	symtab4.in \
+	symtab4.ok \
+	symtab5.awk \
+	symtab5.in \
+	symtab5.ok \
+	symtab6.awk \
+	symtab6.ok \
+	symtab7.awk \
+	symtab7.in \
+	symtab7.ok \
+	symtab8.awk \
+	symtab8.in \
+	symtab8.ok \
+	symtab9.awk \
+	symtab9.ok \
+	symtab10.awk \
+	symtab10.in \
+	symtab10.ok \
+	synerr1.awk \
+	synerr1.ok \
+	synerr2.awk \
+	synerr2.ok \
+	synerr3.awk \
+	synerr3.ok \
+	tailrecurse.awk \
+	tailrecurse.ok \
+	testext.ok \
+	time.awk \
+	time.ok \
+	timeout.awk \
+	timeout.ok \
+	tradanch.awk \
+	tradanch.in \
+	tradanch.ok \
+	trailbs.awk \
+	trailbs.in \
+	trailbs.ok \
+	tweakfld.awk \
+	tweakfld.in \
+	tweakfld.ok \
+	typedregex1.awk \
+	typedregex1.ok \
+	typedregex2.awk \
+	typedregex2.ok \
+	typedregex3.awk \
+	typedregex3.ok \
+	typedregex4.awk \
+	typedregex4.ok \
+	typeof1.awk \
+	typeof1.ok \
+	typeof2.awk \
+	typeof2.ok \
+	typeof3.awk \
+	typeof3.ok \
+	typeof4.awk \
+	typeof4.ok \
+	typeof5.awk \
+	typeof5.in \
+	typeof5.ok \
+	uninit2.awk \
+	uninit2.ok \
+	uninit3.awk \
+	uninit3.ok \
+	uninit4.awk \
+	uninit4.ok \
+	uninit5.awk \
+	uninit5.ok \
+	uninitialized.awk \
+	uninitialized.ok \
+	unterm.awk \
+	unterm.ok \
+	uparrfs.awk \
+	uparrfs.in \
+	uparrfs.ok \
+	uplus.awk \
+	uplus.ok \
+	valgrind.awk \
+	watchpoint1.awk \
+	watchpoint1.in \
+	watchpoint1.ok \
+	watchpoint1.script \
+	wideidx.awk \
+	wideidx.in \
+	wideidx.ok \
+	wideidx2.awk \
+	wideidx2.ok \
+	widesub.awk \
+	widesub.ok \
+	widesub2.awk \
+	widesub2.ok \
+	widesub3.awk \
+	widesub3.in \
+	widesub3.ok \
+	widesub4.awk \
+	widesub4.ok \
+	wjposer1.awk \
+	wjposer1.in \
+	wjposer1.ok \
+	xref.awk \
+	xref.original \
+	zero2.awk \
+	zero2.ok \
+	zeroe0.awk \
+	zeroe0.ok \
+	zeroflag.awk \
+	zeroflag.ok
+
+
+# Get rid of core files when cleaning and generated .ok file
+CLEANFILES = core core.* fmtspcl.ok
+
+# try to keep these sorted. each letter starts a new line
+BASIC_TESTS = \
+	addcomma anchgsub anchor argarray arrayind1 arrayind2 arrayind3 arrayparm \
+	arrayprm2 arrayprm3 arrayref arrymem1 arryref2 arryref3 arryref4 arryref5 \
+	arynasty arynocls aryprm1 aryprm2 aryprm3 aryprm4 aryprm5 aryprm6 aryprm7 \
+	aryprm8 aryprm9 arysubnm aryunasgn asgext awkpath \
+	assignnumfield assignnumfield2 \
+	back89 backgsub badassign1 badbuild \
+	callparam childin clobber closebad clsflnam compare compare2 \
+	concat1 concat2 concat3 concat4 concat5 convfmt \
+	datanonl defref delargv delarpm2 delarprm delfunc dfamb1 dfastress dynlj \
+	eofsplit eofsrc1 exit2 exitval1 exitval2 exitval3 \
+	fcall_exit fcall_exit2 fldchg fldchgnf fldterm fnamedat fnarray fnarray2 \
+	fnaryscl fnasgnm fnmisc fordel forref forsimp fsbs fscaret fsnul1 \
+	fsrs fsspcoln fstabplus funsemnl funsmnam funstack \
+	getline getline2 getline3 getline4 getline5 getlnbuf getnr2tb getnr2tm \
+	gsubasgn gsubtest gsubtst2 gsubtst3 gsubtst4 gsubtst5 gsubtst6 gsubtst7 \
+	gsubtst8 \
+	hex hex2 hsprint \
+	inpref inputred intest intprec iobug1 \
+	leaddig leadnl litoct longsub longwrds \
+	manglprm math membug1 memleak messages minusstr mmap8k \
+	nasty nasty2 negexp negrange nested nfldstr nfloop nfneg nfset nlfldsep \
+	nlinstr nlstrina noeffect nofile nofmtch noloop1 noloop2 nonl noparms \
+	nors nulinsrc nulrsend numindex numrange numstr1 numsubstr \
+	octsub ofmt ofmta ofmtbig ofmtfidl ofmts ofmtstrnum ofs1 onlynl \
+	opasnidx opasnslf \
+	paramasfunc1 paramasfunc2 paramdup paramres paramtyp paramuninitglobal \
+	parse1 parsefld parseme pcntplus posix2008sub prdupval prec printf0 \
+	printf1 printfchar prmarscl prmreuse prt1eval prtoeval \
+	rand randtest range1 range2 readbuf rebrackloc rebt8b1 rebuild redfilnm regeq \
+	regexpbrack regexpbrack2 regexprange regrange reindops reparse resplit \
+	rri1 rs rscompat rsnul1nl rsnulbig rsnulbig2 rstest1 rstest2 rstest3 \
+	rstest4 rstest5 rswhite \
+	scalar sclforin sclifin setrec0 setrec1 \
+	sigpipe1 sortempty sortglos spacere splitargv splitarr \
+	splitdef splitvar splitwht status-close strcat1 strnum1 strnum2 strtod \
+	subamp subback subi18n subsepnm subslash substr swaplns synerr1 synerr2 synerr3 \
+	tailrecurse tradanch trailbs tweakfld \
+	uninit2 uninit3 uninit4 uninit5 uninitialized unterm uparrfs uplus \
+	wideidx wideidx2 widesub widesub2 widesub3 widesub4 wjposer1 \
+	zero2 zeroe0 zeroflag
+
+UNIX_TESTS = \
+	fflush getlnhd localenl pid pipeio1 pipeio2 poundbang rtlen rtlen01 \
+	space strftlng
+
+GAWK_EXT_TESTS = \
+	aadelete1 aadelete2 aarray1 aasort aasorti argtest arraysort arraysort2 \
+	arraytype \
+	backw badargs beginfile1 beginfile2 binmode1 \
+	charasbytes colonwarn clos1way clos1way2 clos1way3 clos1way4 clos1way5 \
+	clos1way6 crlf \
+	dbugeval dbugeval2 dbugeval3 dbugtypedre1 dbugtypedre2 delsub \
+	devfd devfd1 devfd2 dfacheck1 dumpvars \
+	errno exit \
+	fieldwdth forcenum fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 fpatnull fsfwfs \
+	funlen functab1 functab2 functab3 fwtest fwtest2 fwtest3 fwtest4 \
+	fwtest5 fwtest6 fwtest7 fwtest8 \
+	genpot gensub gensub2 gensub3 getlndir gnuops2 gnuops3 gnureops gsubind \
+	icasefs icasers id igncdym igncfs ignrcas2 ignrcas4 ignrcase incdupe \
+	incdupe2 incdupe3 incdupe4 incdupe5 incdupe6 incdupe7 include include2 \
+	indirectbuiltin indirectcall indirectcall2 intarray isarrayunset \
+	lint lintexp lintindex lintint lintlength lintold lintset lintwarn \
+	manyfiles match1 match2 match3 mbstr1 mbstr2 mixed1 mktime muldimposix \
+	nastyparm negtime next nondec nondec2 nonfatal1 nonfatal2 nonfatal3 \
+	nsbad nsbad_cmd nsforloop nsfuncrecurse nsindirect1 nsindirect2 nsprof1 nsprof2 \
+	patsplit posix printfbad1 printfbad2 printfbad3 printfbad4 printhuge \
+	procinfs profile0 profile1 profile2 profile3 profile4 profile5 profile6 \
+	profile7 profile8 profile9 profile10 profile11 profile12 pty1 pty2 \
+	rebuf regnul1 regnul2 regx8bit reginttrad reint reint2 rsgetline rsglstdin \
+	rsstart1 rsstart2 rsstart3 rstest6 \
+	sandbox1 shadow shadowbuiltin sortfor sortfor2 sortu \
+	sourcesplit split_after_fpat \
+	splitarg4 strftfld strftime strtonum strtonum1 switch2 symtab1 symtab2 \
+	symtab3 symtab4 symtab5 symtab6 symtab7 symtab8 symtab9 symtab10 \
+	timeout typedregex1 typedregex2 typedregex3 typedregex4 \
+	typeof1 typeof2 typeof3 typeof4 typeof5 \
+	watchpoint1
+
+ARRAYDEBUG_TESTS = arrdbg
+EXTRA_TESTS = inftest regtest ignrcas3 
+INET_TESTS = inetdayu inetdayt inetechu inetecht
+MACHINE_TESTS = double1 double2 intformat
+LOCALE_CHARSET_TESTS = \
+	asort asorti backbigs1 backsmalls1 backsmalls2 \
+	fmttest fnarydel fnparydl jarebug lc_num1 mbfw1 \
+	mbprintf1 mbprintf2 mbprintf3 mbprintf4 mbprintf5 \
+	mtchi18n nlstringtest rebt8b2 rtlenmb sort1 sprintfc
+
+SHLIB_TESTS = \
+	apiterm \
+	filefuncs fnmatch fork fork2 fts functab4 \
+	getfile \
+	inplace1 inplace2 inplace3 \
+	ordchr ordchr2 \
+	readdir readdir_test readdir_retest readfile readfile2 revout \
+	revtwoway rwarray \
+	testext time
+
+
+# List of the tests which should be run with --debug option:
+NEED_DEBUG = dbugtypedre1 dbugtypedre2 dbugeval2 dbugeval3 symtab10
+
+# List of the tests which should be run with --lint option:
+NEED_LINT = \
+	defref fmtspcl lintexp lintindex lintint lintlength lintwarn \
+	noeffect nofmtch nonl shadow uninit2 uninit3 uninit4 uninit5 uninitialized
+
+
+# List of the tests which should be run with --lint-old option:
+NEED_LINT_OLD = lintold
+
+# List of tests that must be run with -M
+NEED_MPFR = mpfrbigint mpfrbigint2 mpfrexprange mpfrfield mpfrieee mpfrmemok1 \
+	mpfrnegzero mpfrnr mpfrrem mpfrrnd mpfrrndeval mpfrsort mpfrsqrt \
+	mpfrstrtonum mpgforcenum mpfruplus
+
+
+# List of tests that need --non-decimal-data
+NEED_NONDEC = mpfrbigint2 nondec2 intarray forcenum
+
+# List of tests that need --posix
+NEED_POSIX = printf0 posix2008sub paramasfunc1 paramasfunc2 muldimposix
+
+# List of tests that need --pretty-print
+NEED_PRETTY = nsprof1 nsprof2 \
+	profile4 profile5 profile8 profile9 profile10 profile11
+
+
+# List of tests that need --re-interval
+NEED_RE_INTERVAL = gsubtst3 reint reint2
+
+# List of tests that need --sandbox
+NEED_SANDBOX = sandbox1
+
+# List of tests that need --traditional
+NEED_TRADITIONAL = litoct tradanch rscompat
+
+# Lists of tests that run a shell script
+RUN_SHELL = exit fflush localenl next randtest rtlen rtlen01
+
+# List of the tests which fail with EXIT CODE 1
+FAIL_CODE1 = \
+	badassign1 badbuild callparam delfunc fcall_exit fcall_exit2 \
+	fnamedat fnarray fnarray2 fnasgnm fnmisc funsmnam gsubasgn \
+	incdupe2 lintwarn match2 mixed1 noparms paramasfunc1 paramasfunc2 \
+	paramdup paramres parseme readbuf synerr1 synerr2 unterm
+
+
+# List of files which have .ok versions for MPFR
+CHECK_MPFR = \
+	rand fnarydel fnparydl
+
+
+# Lists of tests that need particular locales
+NEED_LOCALE_C = \
+	clos1way gsubtst6 range2
+
+NEED_LOCALE_EN = \
+	backbigs1 backsmalls1 backsmalls2 concat4 dfamb1 ignrcas2 lc_num1 \
+	mbfw1 mbprintf1 mbprintf3 mbprintf4 mbstr1 mbstr2 printhuge reint2 \
+	rri1 subamp subi18n wideidx wideidx2 widesub widesub2 widesub3 widesub4
+
+
+# Unused at the moment, since nlstringtest has additional stufff it does
+# NEED_LOCALE_FR =
+# Same for ignrcas3
+# NEED_LOCALE_GR =
+NEED_LOCALE_JP = mbprintf2
+NEED_LOCALE_RU = mtchi18n
+
+# List of tests that fail on DJGPP
+EXPECTED_FAIL_DJGPP = \
+	backbigs1 backsmalls1 backw beginfile1 clos1way clos1way2 \
+	clos1way3 clos1way4 clos1way5 clos1way6 errno getlndir \
+	getlnhd gnuops3 gnureops id ignrcas3 inetdayt inetdayu \
+	inetecht inetechu inftest jarebug mbfw1 mbprintf1 mbprintf4 \
+	mbstr1 mbstr2 mpfrsqrt nonfatal1 nonfatal2 nonfatal3 pid pty1 pty2 \
+	randtest regx8bit strtod sigpipe1 symtab6 timeout
+
+
+# List of tests that fail on MinGW
+EXPECTED_FAIL_MINGW = \
+	backbigs1 backsmalls1 clos1way6 devfd devfd1 devfd2 \
+	errno exitval2 fork fork2 fts getfile getlnhd ignrcas3 inetdayt \
+	inetecht mbfw1 mbprintf1 mbprintf4 mbstr1 mbstr2 pid pipeio2 \
+	pty1 pty2 readdir rstest4 rstest5 status-close timeout
+
+
+# List of tests that fail on z/OS
+EXPECTED_FAIL_ZOS = \
+	aasort aasorti arraysort asort asorti backbigs1 backsmalls1 \
+	backsmalls2 charasbytes concat4 dfamb1 double1 double2 fmttest \
+	forcenum gsubtst5 ignrcas2 lc_num1 localenl mbfw1 mbprintf1 \
+	mbprintf2 mbprintf3 mbprintf4 mbprintf5 mbstr1 mbstr2 numrange \
+	printhuge profile5 regrange reint2 rri1 sigpipe1 sortfor sortu \
+	subamp subi18n symtab1 symtab8 timeout wideidx wideidx2 \
+	widesub widesub2 widesub3 widesub4 \
+	beginfile1 beginfile2 clos1way6 errno getlndir nofile nonfatal2 space
+
+
+# List of the files that appear in manual tests or are for reserve testing:
+GENTESTS_UNUSED = Makefile.in checknegtime.awk dtdgport.awk fix-fmtspcl.awk \
+	fmtspcl-mpfr.ok fmtspcl.awk fmtspcl.tok gtlnbufv.awk hello.awk \
+	inchello.awk inclib.awk inplace.1.in inplace.2.in inplace.in \
+	printfloat.awk readdir0.awk valgrind.awk xref.awk
+
+
+# List of tests on MinGW or DJGPP that need a different cmp program
+NEED_TESTOUTCMP = \
+	beginfile2 double2 exit fmttest hsprint posix profile5 space
+
+CMP = cmp
+AWKPROG = ../gawk$(EXEEXT)
+SORT = sort
+
+# Default for VALGRIND is empty unless overridden by a command-line argument.
+# This protects against cruft in the environment.
+VALGRIND = 
+
+# This business forces the locale to be C for running the tests,
+# unless we override it to something else for testing.
+#
+# This can also be done in individual tests where we wish to
+# check things specifically not in the C locale.
+
+#
+# And we set AWKLIBPATH to find the extension libraries we built.
+LOCALES = LANGUAGE= LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C}
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Maketests $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu test/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+	esac;
+$(srcdir)/Maketests $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(BUILT_SOURCES)
+	$(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-local mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-local \
+	cscopelist-am ctags-am distclean distclean-generic distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+	pdf-am ps ps-am tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Message stuff is to make it a little easier to follow.
+# Make the pass-fail last and dependent on others to avoid
+# spurious errors if `make -j' in effect.
+check:	msg \
+	printlang \
+	basic-msg-start  basic           basic-msg-end \
+	unix-msg-start   unix-tests      unix-msg-end \
+	extend-msg-start gawk-extensions arraydebug-tests extend-msg-end \
+	machine-msg-start machine-tests machine-msg-end \
+	charset-tests-all \
+	shlib-msg-start  shlib-tests     shlib-msg-end \
+	mpfr-msg-start   mpfr-tests      mpfr-msg-end
+	@$(MAKE) pass-fail || { $(MAKE) diffout; exit 1; }
+
+basic:	$(BASIC_TESTS)
+
+unix-tests: $(UNIX_TESTS)
+
+gawk-extensions: $(GAWK_EXT_TESTS)
+
+charset-tests-all:
+	@case `uname` in \
+	*MINGW* | *MS-DOS*) \
+		$(MAKE) charset-msg-start charset-tests charset-msg-end ;; \
+	*) \
+		if locale -a | grep -i 'en_US.UTF.*8' > /dev/null && \
+		   locale -a | grep -i 'fr_FR.UTF.*8' > /dev/null && \
+		   locale -a | grep -i 'ru_RU.UTF.*8' > /dev/null && \
+		   locale -a | grep -i 'ja_JP.UTF.*8' > /dev/null  ; \
+		then \
+			$(MAKE) charset-msg-start charset-tests charset-msg-end; \
+		else \
+			echo %%%%%%%%%% Inadequate locale support: skipping charset tests. ; \
+			echo %%%%%%%%%% At least en_US.UTF-8, fr_FR.UTF-8, ru_RU.UTF-8 and ja_JP.UTF-8 are needed. ; \
+		fi ;; \
+	esac
+
+charset-tests: $(LOCALE_CHARSET_TESTS)
+
+extra:	$(EXTRA_TESTS) inet
+
+inet:	inetmesg $(INET_TESTS)
+
+machine-tests: $(MACHINE_TESTS)
+
+# The blank between ' and /MPFR/ is for running tests on Windows under
+# MSYS, which thinks /MPFR is a Unix-style file name and converts it
+# to Windows format, butchering it in the process.  Likewise for /API/
+# in the next shlib-tests.
+mpfr-tests:
+	@if $(AWK) --version | $(AWK) ' /MPFR/ { exit 1 }' ; then \
+	echo MPFR tests not supported on this system ; \
+	else $(MAKE) $(NEED_MPFR) ; \
+	fi
+
+arraydebug-tests:
+	@if echo $(CFLAGS) | grep ARRAYDEBUG > /dev/null ; then \
+	$(MAKE) $(ARRAYDEBUG_TESTS) ; \
+	else echo gawk is not compiled to support the array debug tests ; \
+	fi
+
+shlib-tests:
+	@if $(AWK) --version | $(AWK) ' /API/ { exit 1 }' ; then \
+	echo shlib tests not supported on this system ; \
+	else $(MAKE) shlib-real-tests ; \
+	fi
+
+shlib-real-tests: $(SHLIB_TESTS)
+
+msg::
+	@echo ''
+	@echo 'Any output from "$(CMP)" is bad news, although some differences'
+	@echo 'in floating point values are probably benign -- in particular,'
+	@echo 'some systems may omit a leading zero and the floating point'
+	@echo 'precision may lead to slightly different output in a few cases.'
+
+printlang::
+	@$(AWK) -f "$(srcdir)"/printlang.awk
+
+basic-msg-start:
+	@echo "======== Starting basic tests ========"
+
+basic-msg-end:
+	@echo "======== Done with basic tests ========"
+
+unix-msg-start:
+	@echo "======== Starting Unix tests ========"
+
+unix-msg-end:
+	@echo "======== Done with Unix tests ========"
+
+extend-msg-start:
+	@echo "======== Starting gawk extension tests ========"
+
+extend-msg-end:
+	@echo "======== Done with gawk extension tests ========"
+
+machine-msg-start:
+	@echo "======== Starting machine-specific tests ========"
+
+machine-msg-end:
+	@echo "======== Done with machine-specific tests ========"
+
+charset-msg-start:
+	@echo "======== Starting tests that can vary based on character set or locale support ========"
+	@echo "**************************************************************************"
+	@echo "* Some or all of these tests may fail if you have inadequate or missing  *"
+	@echo "* locale support. At least en_US.UTF-8, fr_FR.UTF-8, ru_RU.UTF-8 and     *"
+	@echo "* ja_JP.UTF-8 are needed. The el_GR.iso88597 is optional but helpful.    *"
+	@echo "* However, if you see this message, the Makefile thinks you have what    *"
+	@echo "* you need ...                                                           *"
+	@echo "**************************************************************************"
+
+charset-msg-end:
+	@echo "======== Done with tests that can vary based on character set or locale support ========"
+
+shlib-msg-start:
+	@echo "======== Starting shared library tests ========"
+
+shlib-msg-end:
+	@echo "======== Done with shared library tests ========"
+
+mpfr-msg-start:
+	@echo "======== Starting MPFR tests ========"
+
+mpfr-msg-end:
+	@echo "======== Done with MPFR tests ========"
+
+# This test is a PITA because increasingly, /tmp is getting
+# mounted noexec.  So, we'll test it locally.  Sigh.
+#
+# More PITA; some systems have medium short limits on #! paths,
+# so this can still fail
+poundbang::
+	@echo $@
+	@sed "s;/tmp/gawk;`pwd`/$(AWKPROG);" < "$(srcdir)"/poundbang.awk > ./_pbd.awk
+	@chmod +x ./_pbd.awk
+	@if ./_pbd.awk "$(srcdir)"/poundbang.awk > _`basename $@` ; \
+	then : ; \
+	else \
+		sed "s;/tmp/gawk;$(AWKPROG);" < "$(srcdir)"/poundbang.awk > ./_pbd.awk ; \
+		chmod +x ./_pbd.awk ; \
+		LC_ALL=$${GAWKLOCALE:-C} LANG=$${GAWKLOCALE:-C} ./_pbd.awk "$(srcdir)"/poundbang.awk > _`basename $@`;  \
+	fi
+	@-$(CMP) "$(srcdir)"/poundbang.awk _`basename $@` && rm -f _`basename $@` _pbd.awk
+
+messages::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/messages.awk >_out2 2>_out3 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/out1.ok _out1 && $(CMP) "$(srcdir)"/out2.ok _out2 && $(CMP) "$(srcdir)"/out3.ok _out3 && rm -f _out1 _out2 _out3
+
+argarray::
+	@echo $@
+	@cp "$(srcdir)"/argarray.in ./argarray.input
+	@TEST=test echo just a test | $(AWK) -f "$(srcdir)"/argarray.awk ./argarray.input - >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f ./argarray.input
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regtest::
+	@echo $@
+	@echo 'Some of the output from regtest is very system specific, do not'
+	@echo 'be distressed if your output differs from that distributed.'
+	@echo 'Manual inspection is called for.'
+	@AWK=$(AWKPROG) "$(srcdir)"/regtest.sh
+
+manyfiles::
+	@echo $@
+	@rm -rf junk
+	@mkdir junk
+	@$(AWK) 'BEGIN { for (i = 1; i <= 1030; i++) print i, i}' >_$@
+	@$(AWK) -f "$(srcdir)"/manyfiles.awk _$@ _$@ || echo EXIT CODE: $$? >> _$@
+	@wc -l junk/* | $(AWK) '$$1 != 2' | wc -l | sed "s/  *//g" > _$@
+	@rm -rf junk
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+compare::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/compare.awk 0 1 "$(srcdir)"/compare.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inftest::
+	@echo $@
+	@echo This test is very machine specific...
+	@$(AWK) -f "$(srcdir)"/inftest.awk | sed "s/inf/Inf/g" >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline2::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/getline2.awk "$(srcdir)"/getline2.awk "$(srcdir)"/getline2.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+awkpath::
+	@echo $@
+	@AWKPATH="$(srcdir)$(PATH_SEPARATOR)$(srcdir)/lib" $(AWK) -f awkpath.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+argtest::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/argtest.awk -x -y abc >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+badargs::
+	@echo $@
+	@-$(AWK) -f 2>&1 | grep -v patchlevel >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strftime::
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C ; export GAWKLOCALE; \
+	TZ=GMT0; export TZ; \
+	$(AWK) -v OUTPUT=_$@ -v DATECMD="$(DATE)" -f "$(srcdir)"/strftime.awk || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) strftime.ok _$@ && rm -f _$@ strftime.ok || exit 0
+
+devfd::
+	@echo $@
+	@$(AWK) 1 /dev/fd/4 /dev/fd/5 4<"$(srcdir)"/devfd.in4 5<"$(srcdir)"/devfd.in5 >_$@ 2>&1 || echo EXIT CODE: $$? >> _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# This cannot be autogenerated; we want it to read the input name
+# on the command line.
+errno:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+tweakfld::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/tweakfld.awk "$(srcdir)"/tweakfld.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f errors.cleanup
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# AIX /bin/sh exec's the last command in a list, therefore issue a ":"
+# command so that pid.sh is fork'ed as a child before being exec'ed.
+pid::
+	@echo $@
+	@AWKPATH="$(srcdir)" AWK=$(AWKPROG) $(SHELL) "$(srcdir)"/pid.sh $$$$ > _`basename $@` ; :
+	@-$(CMP) "$(srcdir)"/pid.ok _`basename $@` && rm -f _`basename $@`
+
+strftlng::
+	@echo $@
+	@TZ=UTC; export TZ; $(AWK) -f "$(srcdir)"/strftlng.awk >_$@
+	@if $(CMP) "$(srcdir)"/strftlng.ok _$@ >/dev/null 2>&1 ; then : ; else \
+	TZ=UTC0; export TZ; $(AWK) -f "$(srcdir)"/strftlng.awk >_$@ ; \
+	fi
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nors::
+	@echo $@
+	@echo A B C D E | tr -d '\12\15' | $(AWK) '{ print $$NF }' - "$(srcdir)"/nors.in > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# fmtspcl.ok: fmtspcl.tok Makefile fix-fmtspcl.awk
+# 	@$(AWK) -v "sd=$(srcdir)" -f "$(srcdir)/fix-fmtspcl.awk" < "$(srcdir)"/fmtspcl.tok > $@ 2>/dev/null
+# 
+# fmtspcl: fmtspcl.ok
+# 	@echo $@
+# 	@$(AWK) $(AWKFLAGS) -f "$(srcdir)"/fmtspcl.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+# 	@-if test -z "$$AWKFLAGS" ; then $(CMP) $@.ok _$@ && rm -f _$@ ; else \
+# 	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+# 	fi
+
+rebuf::
+	@echo $@
+	@AWKBUFSIZE=4096 AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsglstdin:: 
+	@echo $@
+	@cat  "$(srcdir)"/rsgetline.in | AWKPATH="$(srcdir)" $(AWK) -f rsgetline.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pipeio1::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/pipeio1.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f test1 test2
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pipeio2::
+	@echo $@
+	@$(AWK) -v SRCDIR="$(srcdir)" -f "$(srcdir)"/pipeio2.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clobber::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/clobber.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/clobber.ok seq && $(CMP) "$(srcdir)"/clobber.ok _$@ && rm -f _$@
+	@rm -f seq
+
+arynocls::
+	@echo $@
+	@-AWKPATH="$(srcdir)" $(AWK) -v INPUT="$(srcdir)"/arynocls.in -f arynocls.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getlnbuf::
+	@echo $@
+	@-AWKPATH="$(srcdir)" $(AWK) -f getlnbuf.awk "$(srcdir)"/getlnbuf.in > _$@ || echo EXIT CODE: $$? >> _$@
+	@-AWKPATH="$(srcdir)" $(AWK) -f gtlnbufv.awk "$(srcdir)"/getlnbuf.in > _2$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/getlnbuf.ok _$@ && $(CMP) "$(srcdir)"/getlnbuf.ok _2$@ && rm -f _$@ _2$@
+
+inetmesg::
+	@echo These tests only work if your system supports the services
+	@echo "'discard'" at port 9 and "'daytimed'" at port 13. Check your
+	@echo file /etc/services and do "'netstat -a'".
+
+inetechu::
+	@echo This test is for establishing UDP connections
+	@-$(AWK) 'BEGIN {print "" |& "/inet/udp/0/127.0.0.1/9"}'
+
+inetecht::
+	@echo This test is for establishing TCP connections
+	@-$(AWK) 'BEGIN {print "" |& "/inet/tcp/0/127.0.0.1/9"}'
+
+inetdayu::
+	@echo This test is for bidirectional UDP transmission
+	@-$(AWK) 'BEGIN { print "" |& "/inet/udp/0/127.0.0.1/13"; \
+	"/inet/udp/0/127.0.0.1/13" |& getline; print $0}'
+
+inetdayt::
+	@echo This test is for bidirectional TCP transmission
+	@-$(AWK) 'BEGIN { print "" |& "/inet/tcp/0/127.0.0.1/13"; \
+	"/inet/tcp/0/127.0.0.1/13" |& getline; print $0}'
+
+redfilnm::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/redfilnm.awk srcdir="$(srcdir)" "$(srcdir)"/redfilnm.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+space::
+	@echo $@ $(ZOS_FAIL)
+	@$(AWK) -f ' ' "$(srcdir)"/space.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsnulbig::
+	@echo $@
+	@ : Suppose that block size for pipe is at most 128kB:
+	@$(AWK) 'BEGIN { for (i = 1; i <= 128*64+1; i++) print "abcdefgh123456\n" }' 2>&1 | \
+	$(AWK) 'BEGIN { RS = ""; ORS = "\n\n" }; { print }' 2>&1 | \
+	$(AWK) ' /^[^a]/; END{ print NR }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsnulbig2::
+	@echo $@
+	@$(AWK) 'BEGIN { ORS = ""; n = "\n"; for (i = 1; i <= 10; i++) n = (n n); \
+		for (i = 1; i <= 128; i++) print n; print "abc\n" }' 2>&1 | \
+		$(AWK) 'BEGIN { RS = ""; ORS = "\n\n" };{ print }' 2>&1 | \
+		$(AWK) ' /^[^a]/; END { print NR }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# This test makes sure gawk exits with a zero code.
+# Thus, unconditionally generate the exit code.
+exitval1::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/exitval1.awk >_$@ 2>&1; echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsspcoln::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk 'FS=[ :]+' "$(srcdir)"/$@.in >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsstart3::
+	@echo $@
+	@head "$(srcdir)"/rsstart1.in | $(AWK) -f "$(srcdir)"/rsstart2.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# FIXME: Gentests can't really deal with something that is both a shell script
+# and requires a locale. We might can fix that ...
+rtlenmb::
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE ; \
+	"$(srcdir)"/rtlen.sh >_$@ || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nofile::
+	@echo $@ $(ZOS_FAIL)
+	@$(AWK) '{}' no/such/file >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+binmode1::
+	@echo $@
+	@$(AWK) -v BINMODE=3 'BEGIN { print BINMODE }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+devfd1::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk 4< "$(srcdir)"/devfd.in1 5< "$(srcdir)"/devfd.in2 >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# The program text is the '1' which will print each record. How compact can you get?
+devfd2::
+	@echo $@
+	@$(AWK) 1 /dev/fd/4 /dev/fd/5 4< "$(srcdir)"/devfd.in1 5< "$(srcdir)"/devfd.in2 >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mixed1::
+	@echo $@
+	@$(AWK) -f /dev/null --source 'BEGIN {return junk}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf5::
+	@echo $@ $(ZOS_FAIL)
+	@-case `uname` in \
+	CYGWIN* | MINGW32* | *MS-DOS*) echo this test fails on this system --- skipping $@ ;; \
+	*) \
+	[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE ; \
+	$(AWK) -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >> _$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	esac
+
+printfbad2: printfbad2.ok
+	@echo $@
+	@$(AWK) --lint -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in 2>&1 | sed 's;$(srcdir)/;;g' >_$@ || echo EXIT CODE: $$?  >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+beginfile1::
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk "$(srcdir)"/$@.awk . ./no/such/file Makefile  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+beginfile2:
+	@echo $@ $(ZOS_FAIL)
+	@-( cd "$(srcdir)" && LC_ALL=C AWK="$(abs_builddir)/$(AWKPROG)" $(abs_srcdir)/$@.sh $(abs_srcdir)/$@.in ) > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dumpvars::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --dump-variables 1 < "$(srcdir)"/$@.in >/dev/null 2>&1 || echo EXIT CODE: $$? >>_$@ || echo EXIT CODE: $$? >> _$@
+	@grep -v ENVIRON < awkvars.out | grep -v PROCINFO > _$@; rm awkvars.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile0:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile1:
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/xref.awk "$(srcdir)"/dtdgport.awk > _$@.out1
+	@$(AWK) --pretty-print=ap-$@.out -f "$(srcdir)"/xref.awk
+	@$(AWK) -f ./ap-$@.out "$(srcdir)"/dtdgport.awk > _$@.out2 ; rm ap-$@.out
+	@-$(CMP) _$@.out1 _$@.out2 && rm _$@.out[12] || { echo EXIT CODE: $$? >>_$@ ; \
+	cp "$(srcdir)"/dtdgport.awk $@.ok ; }
+
+profile2:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -v sortcmd=$(SORT) -f "$(srcdir)"/xref.awk "$(srcdir)"/dtdgport.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile3:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile6:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile7:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk > /dev/null
+	@sed 1,2d < ap-$@.out > _$@; rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile12:
+	@echo $@
+	@$(AWK) --profile=ap-$@.out -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@rm ap-$@.out
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrieee:
+	@echo $@
+	@$(AWK) -M -vPREC=double -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrexprange:
+	@echo $@
+	@$(AWK) -M -vPREC=53 -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrrnd:
+	@echo $@
+	@$(AWK) -M -vPREC=53 -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrsort:
+	@echo $@
+	@$(AWK) -M -vPREC=53 -f "$(srcdir)"/$@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfruplus:
+	@echo $@
+	@$(AWK) -M -f "$(srcdir)"/uplus.awk > _$@ 2>&1 || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrmemok1:
+	@echo $@
+	@$(AWK) -p- -M -f "$(srcdir)"/$@.awk 2>&1 | sed 1d > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+jarebug::
+	@echo $@
+	@"$(srcdir)"/$@.sh "$(AWKPROG)" "$(srcdir)"/$@.awk "$(srcdir)"/$@.in "_$@" || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ordchr2::
+	@echo $@
+	@$(AWK) --load ordchr 'BEGIN {print chr(ord("z"))}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# N.B. If the test fails, create readfile.ok so that "make diffout" will work
+readfile::
+	@echo $@
+	@$(AWK) -l readfile 'BEGIN {printf "%s", readfile("$(srcdir)/Makefile.am")}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)/Makefile.am" _$@ && rm -f _$@ || cp -p "$(srcdir)/Makefile.am" $@.ok
+
+readfile2::
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.awk "$(srcdir)"/readdir.awk > _$@ || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+include2::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --include inclib 'BEGIN {print sandwich("a", "b", "c")}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -i inclib -i inclib.awk 'BEGIN {print sandwich("a", "b", "c")}' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe2::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f inclib -f inclib.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe3::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f hello -f hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe4::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f hello -i hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe5::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -i hello -f hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe6::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -i inchello -f hello.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+incdupe7::
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --lint -f hello -i inchello >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inplace1::
+	@echo $@
+	@cp "$(srcdir)"/inplace.1.in _$@.1
+	@cp "$(srcdir)"/inplace.2.in _$@.2
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+	@-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1
+	@-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2
+
+inplace2::
+	@echo $@
+	@cp "$(srcdir)"/inplace.1.in _$@.1
+	@cp "$(srcdir)"/inplace.2.in _$@.2
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+	@-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1
+	@-$(CMP) "$(srcdir)"/$@.1.bak.ok _$@.1.bak && rm -f _$@.1.bak
+	@-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2
+	@-$(CMP) "$(srcdir)"/$@.2.bak.ok _$@.2.bak && rm -f _$@.2.bak
+
+inplace3::
+	@echo $@
+	@cp "$(srcdir)"/inplace.1.in _$@.1
+	@cp "$(srcdir)"/inplace.2.in _$@.2
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "Before"} {gsub(/bar/, "foo"); print} END {print "After"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+	@-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1
+	@-$(CMP) "$(srcdir)"/$@.1.bak.ok _$@.1.bak && rm -f _$@.1.bak
+	@-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2
+	@-$(CMP) "$(srcdir)"/$@.2.bak.ok _$@.2.bak && rm -f _$@.2.bak
+
+testext::
+	@echo $@
+	@$(AWK) ' /^(@load|BEGIN)/,/^}/' "$(top_srcdir)"/extension/testext.c > testext.awk
+	@$(AWK) -f ./testext.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ testext.awk testexttmp.txt
+
+getfile:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -v TESTEXT_QUIET=1 -ltestext -f $@.awk < $(srcdir)/$@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+readdir:
+	@echo $@
+	@if [ "`uname`" = Linux ] && [ "`stat -f . 2>/dev/null | awk 'NR == 2 { print $$NF }'`" = nfs ];  then \
+	echo This test may fail on GNU/Linux systems when run on NFS or JFS filesystems.; \
+	echo If it does, try rerunning on an ext'[234]' filesystem. ; \
+	fi
+	@$(AWK) -f "$(srcdir)"/readdir.awk "$(top_srcdir)" > _$@ || echo EXIT CODE: $$? >> _$@
+	@ls -afi "$(top_srcdir)" > _dirlist
+	@ls -lna "$(top_srcdir)" | sed 1d > _longlist
+	@$(AWK) -f "$(srcdir)"/readdir0.awk -v extout=_$@  \
+		-v dirlist=_dirlist -v longlist=_longlist > $@.ok
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@ _dirlist _longlist
+
+readdir_test:
+	@echo $@
+	@$(AWK) -lreaddir -F/ '{printf "[%s] [%s] [%s] [%s]\n", $$1, $$2, $$3, $$4}' "$(top_srcdir)" > $@.ok
+	@$(AWK) -lreaddir_test '{printf "[%s] [%s] [%s] [%s]\n", $$1, $$2, $$3, $$4}' "$(top_srcdir)" > _$@
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@
+
+readdir_retest:
+	@echo $@
+	@$(AWK) -lreaddir -F/ -f "$(srcdir)"/$@.awk "$(top_srcdir)" > $@.ok
+	@$(AWK) -lreaddir_test -F/ -f "$(srcdir)"/$@.awk "$(top_srcdir)" > _$@
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@
+
+fts:
+	@echo $@
+	@case `uname` in \
+	IRIX) \
+	echo This test may fail on IRIX systems when run on an NFS filesystem.; \
+	echo If it does, try rerunning on an xfs filesystem. ;; \
+	CYGWIN*) \
+	echo This test may fail on CYGWIN systems when run on an NFS filesystem.; \
+	echo If it does, try rerunning on an ntfs filesystem. ;; \
+	esac
+	@$(AWK) -f "$(srcdir)"/fts.awk || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) $@.ok _$@ && rm -f $@.ok _$@
+
+# BINMODE=2 is needed for PC tests.
+charasbytes:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -b -v BINMODE=2 -f $@.awk "$(srcdir)"/$@.in | \
+	od -c -t x1 | tr '	' ' ' | sed -e 's/  */ /g' -e 's/ *$$//' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab8:
+	@echo $@ $(ZOS_FAIL)
+	@$(AWK) -d__$@ -f "$(srcdir)"/$@.awk "$(srcdir)"/$@.in >_$@
+	@grep -v '^ENVIRON' __$@ | grep -v '^PROCINFO' | grep -v '^FILENAME' >> _$@ ; rm __$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab9:
+	@echo $@
+	@$(AWK) -f "$(srcdir)"/$@.awk >_$@ || echo EXIT CODE: $$? >> _$@
+	@rm -f testit.txt
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reginttrad:
+	@echo $@
+	@$(AWK) --traditional -r -f "$(srcdir)"/$@.awk > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+colonwarn:
+	@echo $@
+	@for i in 1 2 3 ; \
+	do $(AWK) -f "$(srcdir)"/$@.awk $$i < "$(srcdir)"/$@.in ; \
+	done > _$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugeval::
+	@echo $@
+	@if [ -t 0 ]; then \
+	$(AWK) --debug -f /dev/null < "$(srcdir)"/$@.in > _$@  2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	fi
+
+filefuncs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk -v builddir="$(abs_top_builddir)"  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+genpot:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk --gen-pot >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+negtime::
+	@echo $@
+	@TZ=GMT AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@AWKPATH="$(srcdir)" $(AWK) -f checknegtime.awk "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+watchpoint1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -D -f $@.awk $(srcdir)/$@.in < $(srcdir)/$@.script >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pty1:
+	@echo $@
+	@-case `uname` in \
+	*[Oo][Ss]/390*) : ;; \
+	*) AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ;; \
+	esac
+
+pty2:
+	@echo $@
+	@-case `uname` in \
+	*[Oo][Ss]/390*) : ;; \
+	*) AWKPATH="$(srcdir)" $(AWK) -f $@.awk | od -c | $(AWK) '{ $$1 = $$1 ; print }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ;; \
+	esac
+
+ignrcas3::
+	@echo $@
+	@if locale -a | grep el_GR.iso88597 > /dev/null ; then \
+	[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=el_GR.iso88597 ; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ ; \
+	$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	fi
+
+arrdbg:
+	@echo $@
+	@$(AWK) -v "okfile=./$@.ok" -f "$(srcdir)"/$@.awk | grep array_f >_$@ || echo EXIT CODE: $$? >> _$@
+	@-$(CMP) ./$@.ok _$@ && rm -f _$@ ./$@.ok
+
+sourcesplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) --source='BEGIN { a = 5;' --source='print a }' >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+eofsrc1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@a.awk -f $@b.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsbad_cmd:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -v foo:bar=3 -v foo:::blat=4 1 /dev/null >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# Use [:] in the regexp to keep MSYS from converting the /'s to \'s.
+nonfatal1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk 2>&1 | $(AWK) '{print gensub(/invalid[:].*$$/, "invalid", 1, $$0)}' >_$@ || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# 4/2018: On first call to $(CMP), send to /dev/null even with -s for MinGW.
+nlstringtest::
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=fr_FR.UTF-8 ; export GAWKLOCALE ; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk "$(srcdir)" >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if $(CMP) -s "$(srcdir)"/nlstringtest-nogettext.ok _$@ > /dev/null ; \
+	then \
+		rm -f _$@ ; \
+	else \
+		$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; \
+	fi
+
+longwrds:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk -v SORT="$(SORT)" < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+spacere:
+	@echo $@
+	@LC_ALL=C AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex4:
+	@echo $@
+	@$(AWK) -v x=@/foo/ -f "$(srcdir)"/$@.awk y=@/bar/ /dev/null >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+Gt-dummy:
+# file Maketests, generated from Makefile.am by the Gentests program
+addcomma:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+anchgsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+anchor:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayind1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayind2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayind3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayparm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayprm2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayprm3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrymem1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arynasty:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm9:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arysubnm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryunasgn:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+asgext:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+assignnumfield:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+assignnumfield2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+back89:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backgsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+badassign1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+badbuild:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+callparam:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+childin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+closebad:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clsflnam:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+compare2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat4:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+convfmt:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+datanonl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+defref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delargv:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delarpm2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delarprm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delfunc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dfamb1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dfastress:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dynlj:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+eofsplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exit2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exitval2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exitval3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fcall_exit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fcall_exit2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fldchg:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fldchgnf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fldterm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnamedat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnarray:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnarray2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnaryscl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnasgnm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnmisc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fordel:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+forref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+forsimp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsbs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fscaret:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsnul1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsrs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fstabplus:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funsemnl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funsmnam:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funstack:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getnr2tb:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getnr2tm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubasgn:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtest:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --re-interval < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst5:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst6:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+hex:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+hex2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+hsprint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inpref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inputred:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intest:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intprec:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+iobug1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+leaddig:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+leadnl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+litoct:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --traditional < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+longsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+manglprm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+math:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+membug1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+memleak:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+minusstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mmap8k:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nasty:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nasty2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+negexp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+negrange:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nested:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfldstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfloop:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfneg:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfset:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nlfldsep:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nlinstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nlstrina:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noeffect:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nofmtch:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noloop1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noloop2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nonl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noparms:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nulinsrc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nulrsend:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numindex:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numrange:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numstr1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numsubstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+octsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmt:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmta:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmtbig:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmtfidl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmts:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmtstrnum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofs1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+onlynl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+opasnidx:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+opasnslf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramasfunc1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramasfunc2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramdup:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramres:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramtyp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramuninitglobal:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+parse1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+parsefld:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+parseme:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pcntplus:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+posix2008sub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prdupval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prec:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printf0:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printf1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfchar:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prmarscl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prmreuse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prt1eval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prtoeval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rand:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+	fi
+
+randtest:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+range1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+range2:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+readbuf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebrackloc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebt8b1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebuild:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regeq:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regexpbrack:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regexpbrack2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regexprange:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regrange:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reindops:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reparse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+resplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rri1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rscompat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --traditional < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsnul1nl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rswhite:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+scalar:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sclforin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sclifin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+setrec0:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+setrec1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sigpipe1:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortempty:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortglos:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitargv:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitarr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitdef:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitvar:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitwht:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+status-close:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strcat1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strnum1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strnum2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strtod:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subamp:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subback:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subi18n:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subsepnm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subslash:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+substr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+swaplns:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+synerr1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+synerr2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+synerr3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+tailrecurse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+tradanch:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --traditional < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+trailbs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninitialized:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+unterm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uparrfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uplus:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+wideidx:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+wideidx2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub3:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub4:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+wjposer1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+zero2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+zeroe0:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+zeroflag:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fflush:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getlnhd:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+localenl:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rtlen:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rtlen01:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aadelete1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aadelete2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aarray1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aasort:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aasorti:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arraysort:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arraysort2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arraytype:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backw:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way6:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+crlf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugeval2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugeval3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugtypedre1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugtypedre2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dfacheck1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exit:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fieldwdth:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+forcenum:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpatnull:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsfwfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funlen:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gensub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gensub2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gensub3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getlndir:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gnuops2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gnuops3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gnureops:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubind:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+icasefs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+icasers:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+id:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+igncdym:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+igncfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ignrcas2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ignrcas4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ignrcase:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+include:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+indirectbuiltin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+indirectcall:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+indirectcall2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intarray:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+isarrayunset:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintexp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintindex:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintlength:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintold:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint-old < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintset:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintwarn:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+match1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+match2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+match3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbstr1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbstr2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mktime:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+muldimposix:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nastyparm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+next:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nondec:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nondec2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nonfatal2:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nonfatal3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsbad:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsforloop:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsfuncrecurse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsindirect1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsindirect2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsprof1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsprof2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+patsplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+posix:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfbad1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfbad3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfbad4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printhuge:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+procinfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile5:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile9:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile10:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile11:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regnul1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regnul2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regx8bit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --re-interval < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reint2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --re-interval < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsgetline:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsstart1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsstart2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sandbox1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --sandbox >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+shadow:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+shadowbuiltin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortfor:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortfor2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortu:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+split_after_fpat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitarg4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strftfld:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strtonum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strtonum1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+switch2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab1:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab10:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+timeout:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+double1:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+double2:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intformat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+asort:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+asorti:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backbigs1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backsmalls1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backsmalls2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fmttest:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnarydel:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+	fi
+
+fnparydl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+	fi
+
+lc_num1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbfw1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf3:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf4:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mtchi18n:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ru_RU.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebt8b2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sort1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sprintfc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+apiterm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnmatch:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fork:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fork2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ordchr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+revout:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+revtwoway:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rwarray:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+time:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrbigint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrbigint2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M --non-decimal-data < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrfield:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrnegzero:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrnr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrrem:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrrndeval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrsqrt:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrstrtonum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpgforcenum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# end of file Maketests
+
+# Targets generated for other tests:
+
+Maketests: $(srcdir)/Makefile.am $(srcdir)/Gentests
+	files=`cd "$(srcdir)" && echo *.awk *.in *.sh`; \
+	$(AWK) -f "$(srcdir)"/Gentests "$(srcdir)"/Makefile.am $$files > $@
+
+clean-local:
+	rm -fr _* core core.* fmtspcl.ok junk strftime.ok test1 test2 \
+	seq *~ readfile.ok fork.tmp.* testext.awk fts.ok readdir.ok \
+	readdir_test.ok readdir_retest.ok \
+	profile1.ok
+
+# An attempt to print something that can be grepped for in build logs
+pass-fail:
+	@COUNT=`ls _* 2>/dev/null | wc -l` ; \
+	if test $$COUNT = 0 ; \
+	then	echo ALL TESTS PASSED ; \
+	else	echo $$COUNT TESTS FAILED ; exit 1; \
+	fi
+
+# This target for my convenience to look at all the results
+# Don't use POSIX or bash-isms so that it'll work on !@#$%^&*() Solaris.
+diffout:
+	for i in _* ; \
+	do  \
+		if [ "$$i" != "_*" ]; then \
+		echo ============== $$i ============= ; \
+		base=`echo $$i | sed 's/^_//'` ; \
+		if [ -r $${base}.ok ]; then \
+		diff -c $${base}.ok $$i ; \
+		else \
+		diff -c "$(srcdir)"/$${base}.ok  $$i ; \
+		fi ; \
+		fi ; \
+	done | more
+
+# convenient way to scan valgrind results for errors
+valgrind-scan:
+	@echo "Scanning valgrind log files for problems:"
+	@$(AWK) -f "$(srcdir)"/valgrind.awk log.[0-9]*
+
+# This target is for testing with electric fence.
+efence:
+	for i in $$(ls _* | sed 's;_\(.*\);\1;') ; \
+	do \
+		bad=$$(wc -l < _$$i) \
+		ok=$$(wc -l < $$i.ok) ; \
+		if (( $$bad == $$ok + 2 )) ; \
+		then \
+			rm _$$i ; \
+		fi ; \
+	done
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gawk-5.0.1/test/Maketests b/gawk-5.0.1/test/Maketests
new file mode 100644
index 00000000000..cf85ef8dd8d
--- /dev/null
+++ b/gawk-5.0.1/test/Maketests
@@ -0,0 +1,2208 @@
+Gt-dummy:
+# file Maketests, generated from Makefile.am by the Gentests program
+addcomma:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+anchgsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+anchor:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayind1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayind2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayind3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayparm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayprm2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayprm3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrayref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arrymem1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arryref5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arynasty:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryprm9:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arysubnm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aryunasgn:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+asgext:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+assignnumfield:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+assignnumfield2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+back89:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backgsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+badassign1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+badbuild:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+callparam:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+childin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+closebad:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clsflnam:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+compare2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat4:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+concat5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+convfmt:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+datanonl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+defref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delargv:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delarpm2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delarprm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delfunc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dfamb1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dfastress:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dynlj:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+eofsplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exit2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exitval2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exitval3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fcall_exit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fcall_exit2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fldchg:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fldchgnf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fldterm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnamedat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnarray:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnarray2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnaryscl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnasgnm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnmisc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fordel:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+forref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+forsimp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsbs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fscaret:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsnul1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsrs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fstabplus:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funsemnl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funsmnam:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funstack:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getline5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getnr2tb:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getnr2tm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubasgn:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtest:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --re-interval < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst5:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst6:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubtst8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+hex:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+hex2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+hsprint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inpref:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+inputred:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intest:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intprec:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+iobug1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+leaddig:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+leadnl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+litoct:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --traditional < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+longsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+manglprm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+math:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+membug1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+memleak:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+minusstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mmap8k:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nasty:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nasty2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+negexp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+negrange:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nested:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfldstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfloop:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfneg:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nfset:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nlfldsep:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nlinstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nlstrina:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noeffect:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nofmtch:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noloop1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noloop2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nonl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+noparms:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nulinsrc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nulrsend:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numindex:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numrange:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numstr1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+numsubstr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+octsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmt:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmta:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmtbig:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmtfidl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmts:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofmtstrnum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ofs1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+onlynl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+opasnidx:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+opasnslf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramasfunc1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramasfunc2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramdup:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramres:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramtyp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+paramuninitglobal:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+parse1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+parsefld:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+parseme:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+pcntplus:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+posix2008sub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prdupval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prec:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printf0:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printf1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfchar:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prmarscl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prmreuse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prt1eval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+prtoeval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rand:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+	fi
+
+randtest:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+range1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+range2:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+readbuf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebrackloc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebt8b1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebuild:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regeq:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regexpbrack:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regexpbrack2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regexprange:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regrange:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reindops:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reparse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+resplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rri1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rscompat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --traditional < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsnul1nl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rswhite:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+scalar:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sclforin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sclifin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+setrec0:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+setrec1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sigpipe1:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortempty:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortglos:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitargv:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitarr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitdef:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitvar:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitwht:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+status-close:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strcat1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strnum1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strnum2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strtod:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subamp:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subback:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subi18n:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subsepnm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+subslash:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+substr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+swaplns:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+synerr1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+synerr2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+synerr3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+tailrecurse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+tradanch:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --traditional < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+trailbs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninit5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uninitialized:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+unterm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uparrfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+uplus:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+wideidx:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+wideidx2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub3:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+widesub4:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+wjposer1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+zero2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+zeroe0:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+zeroflag:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fflush:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getlnhd:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+localenl:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rtlen:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rtlen01:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aadelete1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aadelete2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aarray1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aasort:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+aasorti:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arraysort:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arraysort2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+arraytype:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backw:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=C; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+clos1way6:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+crlf:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugeval2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugeval3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugtypedre1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dbugtypedre2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+delsub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+dfacheck1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+exit:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fieldwdth:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+forcenum:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpat6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fpatnull:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fsfwfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+funlen:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fwtest8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gensub:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gensub2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gensub3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+getlndir:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gnuops2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gnuops3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gnureops:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+gsubind:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+icasefs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+icasers:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+id:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+igncdym:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+igncfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ignrcas2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ignrcas4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ignrcase:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+include:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+indirectbuiltin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+indirectcall:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+indirectcall2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intarray:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+isarrayunset:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintexp:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintindex:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintlength:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintold:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint-old < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintset:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+lintwarn:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+match1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+match2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+match3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbstr1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbstr2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mktime:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+muldimposix:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --posix >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nastyparm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+next:
+	@echo $@
+	@-$(LOCALES) AWK="$(AWKPROG)" "$(srcdir)"/$@.sh  > _$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nondec:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nondec2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nonfatal2:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nonfatal3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsbad:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsforloop:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsfuncrecurse:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsindirect1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsindirect2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsprof1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+nsprof2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+patsplit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+posix:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfbad1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfbad3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printfbad4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+printhuge:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+procinfs:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile5:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile8:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile9:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile10:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+profile11:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --pretty-print=_$@ >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regnul1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regnul2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+regx8bit:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --re-interval < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+reint2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --re-interval < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsgetline:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsstart1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rsstart2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rstest6:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sandbox1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --sandbox >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+shadow:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --lint >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+shadowbuiltin:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortfor:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortfor2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sortu:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+split_after_fpat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+splitarg4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strftfld:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strtonum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+strtonum1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+switch2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab1:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab7:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+symtab10:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  --debug < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+timeout:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typedregex3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof3:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+typeof5:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+double1:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+double2:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+intformat:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+asort:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+asorti:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backbigs1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backsmalls1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+backsmalls2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fmttest:
+	@echo $@ $(ZOS_FAIL)
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnarydel:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+	fi
+
+fnparydl:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+	$(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+	fi
+
+lc_num1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbfw1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf1:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf2:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf3:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mbprintf4:
+	@echo $@ $(ZOS_FAIL)
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mtchi18n:
+	@echo $@
+	@[ -z "$$GAWKLOCALE" ] && GAWKLOCALE=ru_RU.UTF-8; export GAWKLOCALE; \
+	AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rebt8b2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sort1:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+sprintfc:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+apiterm:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fnmatch:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fork:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+fork2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+functab4:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+ordchr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+revout:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+revtwoway:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+rwarray:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+time:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrbigint:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrbigint2:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M --non-decimal-data < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrfield:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrnegzero:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrnr:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrrem:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrrndeval:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrsqrt:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpfrstrtonum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+mpgforcenum:
+	@echo $@
+	@AWKPATH="$(srcdir)" $(AWK) -f $@.awk  -M >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+	@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
+# end of file Maketests
diff --git a/gawk-5.0.1/test/README b/gawk-5.0.1/test/README
new file mode 100644
index 00000000000..61976b8ad3e
--- /dev/null
+++ b/gawk-5.0.1/test/README
@@ -0,0 +1,24 @@
+Mon Jan 22 13:08:58 EST 1996
+============================
+
+This directory contains the tests for gawk.  The tests use the
+following conventions.
+
+Given some aspect of gawk named `foo', there will be one or more
+of the following files:
+
+foo.awk		--- actual code for the test if not inline in the Makefile
+foo.in		--- the data for the test, if it needs data
+foo.ok		--- the expected results
+_foo		--- the actual results; generated at run time
+
+The _foo file will be left around if a test fails, allowing you to
+compare actual and expected results, in case they differ.
+
+If they do differ (other than strftime.ok and _strftime!), send in a
+bug report.  See the manual for the bug report procedure.
+
+Known Issues:
+=============
+May 2017: On a system with no ptys available, the pty1 test will hang.
+There isn't anything that can be done about this.
diff --git a/gawk-5.0.1/test/aadelete1.awk b/gawk-5.0.1/test/aadelete1.awk
new file mode 100644
index 00000000000..2484a057b1e
--- /dev/null
+++ b/gawk-5.0.1/test/aadelete1.awk
@@ -0,0 +1,19 @@
+BEGIN {
+	a[1][1] = 11
+	a[1][2] = 12
+	a[2] = 2
+	delete a[1][1]
+	f(a, a[1])
+	print a[1][1]
+	print length(a), length(a[1])
+	delete a
+	print length(a), length(a[1]), length(a)
+	a[1][1] = 11
+}
+
+function f(c, b) {
+	delete b
+	b[1] = 1
+	print c[1][1], b[1]
+	delete c[2]
+}
diff --git a/gawk-5.0.1/test/aadelete1.ok b/gawk-5.0.1/test/aadelete1.ok
new file mode 100644
index 00000000000..d4b678b5cdb
--- /dev/null
+++ b/gawk-5.0.1/test/aadelete1.ok
@@ -0,0 +1,6 @@
+1 1
+1
+1 1
+0 0 1
+gawk: aadelete1.awk:11: fatal: attempt to use scalar `a["1"]' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/aadelete2.awk b/gawk-5.0.1/test/aadelete2.awk
new file mode 100644
index 00000000000..54bd49a75a4
--- /dev/null
+++ b/gawk-5.0.1/test/aadelete2.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	a[1][1]=1;
+	b[1][1]=11;
+#	delete b[a[1]][1];
+	f(b, a)
+}
+
+function f(arr, s) {
+	delete arr[s[1]][1]
+}
diff --git a/gawk-5.0.1/test/aadelete2.ok b/gawk-5.0.1/test/aadelete2.ok
new file mode 100644
index 00000000000..65a21efbf79
--- /dev/null
+++ b/gawk-5.0.1/test/aadelete2.ok
@@ -0,0 +1,2 @@
+gawk: aadelete2.awk:9: fatal: attempt to use array `a["1"]' in a scalar context
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/aarray1.awk b/gawk-5.0.1/test/aarray1.awk
new file mode 100644
index 00000000000..a3c4f936bcc
--- /dev/null
+++ b/gawk-5.0.1/test/aarray1.awk
@@ -0,0 +1,28 @@
+BEGIN {
+	a[1][1] = 10;
+	a[1][2] = 20;
+	a[1][3] = 30;
+	a[2] = "hello world! we have multi-dimensional array"
+	a[3, "X"] = "Y"
+	print length(a), length(a[1])
+	delete a[2]
+	delete a[3, "X"] 
+	a[2][1] = 100;
+	a[2][2] = 200;
+	a[2][3] = 300;
+	for (i in a) {
+		sum[i] = 0
+		for (j in a[i])
+			sum[i] += a[i][j]
+	}
+	print sum[1], sum[2]
+	f(a[1])
+	print a[1][1]
+}
+
+function f(x,   i)
+{
+	for (i=1;i<=length(x);i++)
+		print x[i]
+	x[1] = 1001
+}
diff --git a/gawk-5.0.1/test/aarray1.ok b/gawk-5.0.1/test/aarray1.ok
new file mode 100644
index 00000000000..a3354988094
--- /dev/null
+++ b/gawk-5.0.1/test/aarray1.ok
@@ -0,0 +1,6 @@
+3 3
+60 600
+10
+20
+30
+1001
diff --git a/gawk-5.0.1/test/aasort.awk b/gawk-5.0.1/test/aasort.awk
new file mode 100644
index 00000000000..a072a82761b
--- /dev/null
+++ b/gawk-5.0.1/test/aasort.awk
@@ -0,0 +1,34 @@
+function init(b, 	a, i)
+{
+	a[1] = "aardvark"
+	a[2] = "animal"
+	a[3] = "zebra"
+	a[4] = "zoo"
+	a[5] = "Iguana"
+	a[6] = "Alligator"
+	a[7] = "Nouns"
+	a[8] = "people"
+	for (i in a)
+		b[IGNORECASE][i] = a[i]
+}
+
+BEGIN {
+
+	for (IGNORECASE = 0; IGNORECASE < 2; IGNORECASE++) {
+		init(b)
+
+		n = asort(b[IGNORECASE])
+
+		for (i = 1; i <= n; i++)
+			printf("b[%d][%d] = \"%s\"\n", IGNORECASE, i, b[IGNORECASE][i])
+
+		print "============"
+	}
+
+	IGNORECASE = 1
+	init(b)
+	b[2][1] = ""
+	n = asort(b[1], b[2])
+	for (i = 1; i <= n; i++)
+		printf("b[2][%d] = \"%s\"\n", i, b[2][i])
+}
diff --git a/gawk-5.0.1/test/aasort.ok b/gawk-5.0.1/test/aasort.ok
new file mode 100644
index 00000000000..ed5f6f2ac3a
--- /dev/null
+++ b/gawk-5.0.1/test/aasort.ok
@@ -0,0 +1,26 @@
+b[0][1] = "Alligator"
+b[0][2] = "Iguana"
+b[0][3] = "Nouns"
+b[0][4] = "aardvark"
+b[0][5] = "animal"
+b[0][6] = "people"
+b[0][7] = "zebra"
+b[0][8] = "zoo"
+============
+b[1][1] = "aardvark"
+b[1][2] = "Alligator"
+b[1][3] = "animal"
+b[1][4] = "Iguana"
+b[1][5] = "Nouns"
+b[1][6] = "people"
+b[1][7] = "zebra"
+b[1][8] = "zoo"
+============
+b[2][1] = "aardvark"
+b[2][2] = "Alligator"
+b[2][3] = "animal"
+b[2][4] = "Iguana"
+b[2][5] = "Nouns"
+b[2][6] = "people"
+b[2][7] = "zebra"
+b[2][8] = "zoo"
diff --git a/gawk-5.0.1/test/aasorti.awk b/gawk-5.0.1/test/aasorti.awk
new file mode 100644
index 00000000000..0416437220e
--- /dev/null
+++ b/gawk-5.0.1/test/aasorti.awk
@@ -0,0 +1,35 @@
+function init(b, a, i)
+{
+	delete a
+
+	a["aardvark"] = 1
+	a["animal"] = 2
+	a["zebra"] = 3
+	a["zoo"] = 4
+	a["Iguana"] = 5
+	a["Alligator"] = 6
+	a["Nouns"] = 7
+	a["people"] = 8
+	for (i in a)
+		b[IGNORECASE][i] = a[i]
+}
+
+BEGIN {
+
+	for (IGNORECASE = 0; IGNORECASE < 2; IGNORECASE++) {
+		init(b)
+
+		n = asorti(b[IGNORECASE])
+
+		for (i = 1; i <= n; i++)
+			printf("b[%d][%d] = \"%s\"\n", IGNORECASE, i, b[IGNORECASE][i])
+
+		print "============"
+
+	}
+	
+	n = asorti(b)
+	for (i = 1; i <= n; i++)
+		printf("b[%d] = \"%s\"\n", i, b[i])
+
+}
diff --git a/gawk-5.0.1/test/aasorti.ok b/gawk-5.0.1/test/aasorti.ok
new file mode 100644
index 00000000000..7a91424173c
--- /dev/null
+++ b/gawk-5.0.1/test/aasorti.ok
@@ -0,0 +1,20 @@
+b[0][1] = "Alligator"
+b[0][2] = "Iguana"
+b[0][3] = "Nouns"
+b[0][4] = "aardvark"
+b[0][5] = "animal"
+b[0][6] = "people"
+b[0][7] = "zebra"
+b[0][8] = "zoo"
+============
+b[1][1] = "aardvark"
+b[1][2] = "Alligator"
+b[1][3] = "animal"
+b[1][4] = "Iguana"
+b[1][5] = "Nouns"
+b[1][6] = "people"
+b[1][7] = "zebra"
+b[1][8] = "zoo"
+============
+b[1] = "0"
+b[2] = "1"
diff --git a/gawk-5.0.1/test/addcomma.awk b/gawk-5.0.1/test/addcomma.awk
new file mode 100644
index 00000000000..8f52f36b508
--- /dev/null
+++ b/gawk-5.0.1/test/addcomma.awk
@@ -0,0 +1,15 @@
+# addcomma - put commas in numbers
+#   input:  a number per line
+#   output: the input number followed by
+#      the number with commas and two decimal places 
+
+{ printf("%-12s %20s\n", $0, addcomma($0)) }
+
+function addcomma(x,   num) {
+ 	if (x < 0)
+ 	    return "-" addcomma(-x)
+ 	num = sprintf("%.2f", x)   # num is dddddd.dd
+ 	while (num ~ /[0-9][0-9][0-9][0-9]/)
+ 	    sub(/[0-9][0-9][0-9][,.]/, ",&", num)
+ 	return num
+}
diff --git a/gawk-5.0.1/test/addcomma.in b/gawk-5.0.1/test/addcomma.in
new file mode 100644
index 00000000000..be70ac90abb
--- /dev/null
+++ b/gawk-5.0.1/test/addcomma.in
@@ -0,0 +1,7 @@
+0
+-1
+-12.34
+12345
+-1234567.89
+-123.
+-123456
diff --git a/gawk-5.0.1/test/addcomma.ok b/gawk-5.0.1/test/addcomma.ok
new file mode 100644
index 00000000000..57c5886a23b
--- /dev/null
+++ b/gawk-5.0.1/test/addcomma.ok
@@ -0,0 +1,7 @@
+0                            0.00
+-1                          -1.00
+-12.34                     -12.34
+12345                   12,345.00
+-1234567.89         -1,234,567.89
+-123.                     -123.00
+-123456               -123,456.00
diff --git a/gawk-5.0.1/test/anchgsub.awk b/gawk-5.0.1/test/anchgsub.awk
new file mode 100644
index 00000000000..52e8aa4dab7
--- /dev/null
+++ b/gawk-5.0.1/test/anchgsub.awk
@@ -0,0 +1 @@
+{ gsub(/^[ 	]*/, "", $0) ; print }
diff --git a/gawk-5.0.1/test/anchgsub.in b/gawk-5.0.1/test/anchgsub.in
new file mode 100644
index 00000000000..b829d84ee13
--- /dev/null
+++ b/gawk-5.0.1/test/anchgsub.in
@@ -0,0 +1 @@
+  	This is a test, this is only a test.
diff --git a/gawk-5.0.1/test/anchgsub.ok b/gawk-5.0.1/test/anchgsub.ok
new file mode 100644
index 00000000000..c33dfb95b7c
--- /dev/null
+++ b/gawk-5.0.1/test/anchgsub.ok
@@ -0,0 +1 @@
+This is a test, this is only a test.
diff --git a/gawk-5.0.1/test/anchor.awk b/gawk-5.0.1/test/anchor.awk
new file mode 100644
index 00000000000..56f4756962b
--- /dev/null
+++ b/gawk-5.0.1/test/anchor.awk
@@ -0,0 +1,33 @@
+BEGIN { RS = "" }
+
+{
+	if (/^A/)
+		print "ok"
+	else
+		print "not ok"
+
+	if (/B$/)
+		print "not ok"
+	else
+		print "ok"
+
+	if (/^C/)
+		print "not ok"
+	else
+		print "ok"
+
+	if (/D$/)
+		print "not ok"
+	else
+		print "ok"
+
+	if (/^E/)
+		print "not ok"
+	else
+		print "ok"
+
+	if (/F$/)
+		print "ok"
+	else
+		print "not ok"
+}
diff --git a/gawk-5.0.1/test/anchor.in b/gawk-5.0.1/test/anchor.in
new file mode 100644
index 00000000000..a97e9859348
--- /dev/null
+++ b/gawk-5.0.1/test/anchor.in
@@ -0,0 +1,3 @@
+A line1 B
+C line2 D
+E line3 F
diff --git a/gawk-5.0.1/test/anchor.ok b/gawk-5.0.1/test/anchor.ok
new file mode 100644
index 00000000000..7780b88b467
--- /dev/null
+++ b/gawk-5.0.1/test/anchor.ok
@@ -0,0 +1,6 @@
+ok
+ok
+ok
+ok
+ok
+ok
diff --git a/gawk-5.0.1/test/apiterm.awk b/gawk-5.0.1/test/apiterm.awk
new file mode 100644
index 00000000000..95e4b120056
--- /dev/null
+++ b/gawk-5.0.1/test/apiterm.awk
@@ -0,0 +1,8 @@
+@load "filefuncs"
+
+{
+	print $1
+	# check whether API terminates field strings properly
+	print chdir($1)
+	print ERRNO
+}
diff --git a/gawk-5.0.1/test/apiterm.in b/gawk-5.0.1/test/apiterm.in
new file mode 100644
index 00000000000..c4732514ea4
--- /dev/null
+++ b/gawk-5.0.1/test/apiterm.in
@@ -0,0 +1 @@
+. fubar
diff --git a/gawk-5.0.1/test/apiterm.ok b/gawk-5.0.1/test/apiterm.ok
new file mode 100644
index 00000000000..ef4043be27f
--- /dev/null
+++ b/gawk-5.0.1/test/apiterm.ok
@@ -0,0 +1,3 @@
+.
+0
+
diff --git a/gawk-5.0.1/test/argarray.awk b/gawk-5.0.1/test/argarray.awk
new file mode 100644
index 00000000000..1960f9bd3b2
--- /dev/null
+++ b/gawk-5.0.1/test/argarray.awk
@@ -0,0 +1,14 @@
+BEGIN {
+	argn =  " argument" (ARGC > 1 ? "s" : "")
+	are  = ARGC > 1 ? "are" : "is"
+	print "here we have " ARGC argn
+	print "which " are
+	for (x = 0; x < ARGC; x++)
+		print "\t", ARGV[x]
+	print "Environment variable TEST=" ENVIRON["TEST"]
+	print "and the current input file is called \"" FILENAME "\""
+}
+
+FNR == 1 {
+	print "in main loop, this input file is known as \"" FILENAME "\""
+}
diff --git a/gawk-5.0.1/test/argarray.in b/gawk-5.0.1/test/argarray.in
new file mode 100644
index 00000000000..bc93338c883
--- /dev/null
+++ b/gawk-5.0.1/test/argarray.in
@@ -0,0 +1 @@
+this is a simple test file
diff --git a/gawk-5.0.1/test/argarray.ok b/gawk-5.0.1/test/argarray.ok
new file mode 100644
index 00000000000..3c026634b16
--- /dev/null
+++ b/gawk-5.0.1/test/argarray.ok
@@ -0,0 +1,9 @@
+here we have 3 arguments
+which are
+	 gawk
+	 ./argarray.input
+	 -
+Environment variable TEST=
+and the current input file is called ""
+in main loop, this input file is known as "./argarray.input"
+in main loop, this input file is known as "-"
diff --git a/gawk-5.0.1/test/argtest.awk b/gawk-5.0.1/test/argtest.awk
new file mode 100644
index 00000000000..e7a1145d07f
--- /dev/null
+++ b/gawk-5.0.1/test/argtest.awk
@@ -0,0 +1,4 @@
+BEGIN {
+	for (i = 0; i < ARGC; i++)
+		printf("ARGV[%d] = %s\n", i, ARGV[i])
+}
diff --git a/gawk-5.0.1/test/argtest.ok b/gawk-5.0.1/test/argtest.ok
new file mode 100644
index 00000000000..591bc641525
--- /dev/null
+++ b/gawk-5.0.1/test/argtest.ok
@@ -0,0 +1,4 @@
+ARGV[0] = gawk
+ARGV[1] = -x
+ARGV[2] = -y
+ARGV[3] = abc
diff --git a/gawk-5.0.1/test/arrayind1.awk b/gawk-5.0.1/test/arrayind1.awk
new file mode 100644
index 00000000000..59e8b4ea310
--- /dev/null
+++ b/gawk-5.0.1/test/arrayind1.awk
@@ -0,0 +1,100 @@
+# this script renums pedigrees with metafounders
+# so that they are added *before*regular animals
+# mf are ascertained because they are not in the 1st column
+# also ordered by generation assuming that all metafounders
+# start at generation 1
+#
+#
+	function maxval (a,b) { 
+		max=b 
+		if (a>b){max=a} 
+		return max 
+	}
+BEGIN{
+	pos[0]=0 # actual position in the original data file
+	changed=1
+	posout[0]=0 # position in the new file
+	last=0
+	cum[0]=0 #number of times it acts as parent
+	gen[0]=0
+}
+# read and store pedigree file
+{
+	pos[$1]=NR
+	dam[$1]=$2
+	sire[$1]=$3
+	included[$1]=0
+	gen[$1]=9999
+}
+END{
+    #printf("%10s%10s\n",NR,"animals") > "/dev/stderr" 
+    # find out who is a genetic group
+    for (x in sire){
+        if(! (sire[x] in pos)){ 
+            is_group[sire[x]]=1 
+		#printf("%10s%10s\n","sire",sire[x]) > "/dev/stderr"
+		cum[sire[x],"sire"]++
+	}
+    }
+    for (x in dam){
+        if(! (dam[x] in pos)){ 
+            is_group[dam[x]]=1 
+		#printf("%10s%10s\n","dam",dam[x]) > "/dev/stderr"
+		cum[dam[x],"dam"]++
+        }
+    }
+    # compute numbers, but don't write them out
+    #printf("%16s\n","info on mf") > "/dev/stderr"
+    for (x in is_group){
+        nmf++
+        posout[x]=posout[last]+1
+	printf("%16s%16s%16s%16s%16s%16s%16s\n", posout[x],0,0,x,0,0,0)
+        included[x]=1
+        gen[x]=0
+        last=x
+        cumgen[0]++
+	#printf("%10s%16s%10s%16s%10s%10s%10s\n","group",last," included as",posout[x]," as sire, as dam",cum[x,"sire"],cum[x,"dam"]) > "/dev/stderr"
+    }
+    # regular individuals
+#	printf("%16s\n","recoding animals") > "/dev/stderr"
+	iter=1
+	#--> comment next line and this element of the associative array becomes null
+	#printf("%s%16s\n","at the beginning it should be empty: ",posout["00000779770060"]) > "/dev/stderr"
+	#-->
+	while (changed){
+		changed=0
+		for (x in pos){
+			if(x!=0 && !included[x]){
+			# change to number of generation
+				#	if(included[dam[x]] && included[sire[x]]){
+						if((gen[dam[x]]<iter) && (gen[sire[x]]<iter)){
+							# the new code is actually the order animals are printed
+							posout[x]=posout[last]+1
+							gen[x]=maxval(gen[dam[x]],gen[sire[x]])+1
+							printf("%16s%16s%16s%16s%16s%16s%16s\n", posout[x],posout[dam[x]],posout[sire[x]],x,dam[x],sire[x],gen[x])
+							included[x]=1
+							changed=1
+							last=x
+							nanim++
+							cumgen[gen[x]]++
+						}
+				#	}
+			}
+        	}
+		iter++
+		#-->
+#		printf("%s%16s\n","in the loop: ",posout["00000779770060"]) > "/dev/stderr"
+#		fflush("/dev/stderr")
+		#-->
+		#printf("%10s%10s%10s%10s%16s%16s\n","round",iter,"included",posout[last],"last ",last) > "/dev/stderr"
+	}
+	#printf("%10s%10s%10s%10s%10s%10s\n","metafounders:",nmf," animals",nanim," total",posout[last]) > "/dev/stderr"
+	#printf("%16s%16s\n","pseudogenerations:",gen[last]) > "/dev/stderr"
+	    for (x in cumgen){
+		#printf("%10s%16s%10s%16s\n","pseudogeneration:",x," including: ",cumgen[x]) > "/dev/stderr"
+	    }
+	#--> this is the guilty line
+#	printf("%s%16s\n","at the end:  ",posout["00000779770060"]) > "/dev/stderr"
+#	fflush("/dev/stderr")
+	#-->
+}
diff --git a/gawk-5.0.1/test/arrayind1.in b/gawk-5.0.1/test/arrayind1.in
new file mode 100644
index 00000000000..915d865724d
--- /dev/null
+++ b/gawk-5.0.1/test/arrayind1.in
@@ -0,0 +1,2 @@
+64000757790003 00000779770060 00000757740011 1979 2 1975 0
+00000779770060 1975su1du1 1975su1du1 1975 1 1975 1975su1du1
diff --git a/gawk-5.0.1/test/arrayind1.ok b/gawk-5.0.1/test/arrayind1.ok
new file mode 100644
index 00000000000..2b11bb5d1d0
--- /dev/null
+++ b/gawk-5.0.1/test/arrayind1.ok
@@ -0,0 +1,4 @@
+               1               0               0  00000757740011               0               0               0
+               2               0               0      1975su1du1               0               0               0
+               3               2               2  00000779770060      1975su1du1      1975su1du1               1
+               4               3               1  64000757790003  00000779770060  00000757740011               2
diff --git a/gawk-5.0.1/test/arrayind2.awk b/gawk-5.0.1/test/arrayind2.awk
new file mode 100644
index 00000000000..200694eb96c
--- /dev/null
+++ b/gawk-5.0.1/test/arrayind2.awk
@@ -0,0 +1,8 @@
+BEGIN {
+        pos[0] = 0
+        posout[0] = 0
+        split("00000779770060", f)      # f[1] is a strnum
+        print typeof(f[1])
+        pos[f[1]] = 1
+        print typeof(f[1])
+}
diff --git a/gawk-5.0.1/test/arrayind2.ok b/gawk-5.0.1/test/arrayind2.ok
new file mode 100644
index 00000000000..335b2005a39
--- /dev/null
+++ b/gawk-5.0.1/test/arrayind2.ok
@@ -0,0 +1,2 @@
+strnum
+strnum
diff --git a/gawk-5.0.1/test/arrayind3.awk b/gawk-5.0.1/test/arrayind3.awk
new file mode 100644
index 00000000000..ca4c58b509b
--- /dev/null
+++ b/gawk-5.0.1/test/arrayind3.awk
@@ -0,0 +1,19 @@
+BEGIN {
+	# initialize cint arrays
+        pos[0] = 0
+        posout[0] = 0
+        split("00000779770060", f)      # f[1] is a strnum
+        pos[f[1]] = 1                   # subscripts must be strings!
+        for (x in pos) {
+                # if x is a strnum, then the
+                # x != 0 test may convert it to an integral NUMBER,
+		# and we might lose the unusual string representation
+		# if the cint code is not careful to recognize that this is
+		# actually a string
+                if (x != 0)
+                        posout[x] = pos[x]
+        }
+        # which array element is populated?
+        print posout[779770060]
+        print posout["00000779770060"]
+}
diff --git a/gawk-5.0.1/test/arrayind3.ok b/gawk-5.0.1/test/arrayind3.ok
new file mode 100644
index 00000000000..a464d9da742
--- /dev/null
+++ b/gawk-5.0.1/test/arrayind3.ok
@@ -0,0 +1,2 @@
+
+1
diff --git a/gawk-5.0.1/test/arrayparm.awk b/gawk-5.0.1/test/arrayparm.awk
new file mode 100644
index 00000000000..d6f34d9640a
--- /dev/null
+++ b/gawk-5.0.1/test/arrayparm.awk
@@ -0,0 +1,21 @@
+#
+# Test program from:
+#
+# Date: Tue, 21 Feb 95 16:09:29 EST
+# From: emory!blackhawk.com!aaron (Aaron Sosnick)
+# 
+BEGIN {
+    foo[1]=1;
+    foo[2]=2;
+    bug1(foo);
+}
+function bug1(i) {
+    for (i in foo) {
+	bug2(i);
+	delete foo[i];
+	print i,1,bot[1];
+    }
+}
+function bug2(arg) {
+    bot[arg]=arg;
+}
diff --git a/gawk-5.0.1/test/arrayparm.ok b/gawk-5.0.1/test/arrayparm.ok
new file mode 100644
index 00000000000..5fe09aa3a86
--- /dev/null
+++ b/gawk-5.0.1/test/arrayparm.ok
@@ -0,0 +1,2 @@
+gawk: arrayparm.awk:13: fatal: attempt to use array `i (from foo)' in a scalar context
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/arrayprm2.awk b/gawk-5.0.1/test/arrayprm2.awk
new file mode 100644
index 00000000000..35a92cc81fc
--- /dev/null
+++ b/gawk-5.0.1/test/arrayprm2.awk
@@ -0,0 +1,67 @@
+# From spcecdt@armory.com  Wed Apr 30 11:08:48 2003
+# Return-Path: <spcecdt@armory.com>
+# Received: from localhost (skeeve [127.0.0.1])
+# 	by skeeve.com (8.12.5/8.12.5) with ESMTP id h3U7uZWr015489
+# 	for <arnold@localhost>; Wed, 30 Apr 2003 11:08:48 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Wed, 30 Apr 2003 11:08:48 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Wed Apr 30 11:05:01 2003)
+# X-From_: spcecdt@armory.com Wed Apr 30 04:06:46 2003
+# Received: from smtp1.actcom.net.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id h3U16iv04111 for <arobbins@actcom.co.il>;
+# 	Wed, 30 Apr 2003 04:06:45 +0300 (EET DST)  
+# 	(rfc931-sender: mail.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by smtp1.actcom.net.il (8.12.8/8.12.8) with ESMTP id h3U16nEv009589
+# 	for <arobbins@actcom.co.il>; Wed, 30 Apr 2003 04:06:50 +0300
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by f7.net (8.11.7/8.11.6) with ESMTP id h3U16gj29182
+# 	for <arnold@skeeve.com>; Tue, 29 Apr 2003 21:06:42 -0400
+# Received: from monty-python.gnu.org ([199.232.76.173])
+# 	by fencepost.gnu.org with esmtp (Exim 4.10)
+# 	id 19Ag3W-00029w-00
+# 	for bug-gawk@gnu.org; Tue, 29 Apr 2003 21:06:42 -0400
+# Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10.13)
+# 	id 19Ag1V-0001AN-00
+# 	for bug-gawk@gnu.org; Tue, 29 Apr 2003 21:04:39 -0400
+# Received: from deepthought.armory.com ([192.122.209.42] helo=armory.com)
+# 	by monty-python.gnu.org with smtp (Exim 4.10.13)
+# 	id 19Ag1V-0001A3-00
+# 	for bug-gawk@gnu.org; Tue, 29 Apr 2003 21:04:37 -0400
+# Date: Tue, 29 Apr 2003 18:04:35 -0700
+# From: "John H. DuBois III" <spcecdt@armory.com>
+# To: bug-gawk@gnu.org
+# Subject: gawk 3.1.2a bug
+# Message-ID: <20030430010434.GA4278@armory.com>
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# Content-Disposition: inline
+# User-Agent: Mutt/1.3.28i
+# X-Www: http://www.armory.com./~spcecdt/
+# Sender: spcecdt@armory.com
+# X-Spam-Status: No, hits=-7.2 required=5.0
+# 	tests=SIGNATURE_SHORT_DENSE,SPAM_PHRASE_00_01,USER_AGENT,
+# 	      USER_AGENT_MUTT
+# 	version=2.41
+# X-Spam-Level: 
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: RO
+# 
+# gawk-3.1.2a 'BEGIN {foo(bar)};function foo(baz){split("x",baz)}'
+# gawk-3.1.2a: cmd. line:1: fatal: split: second argument is not an array
+# 
+# 	John
+# -- 
+# John DuBois  spcecdt@armory.com  KC6QKZ/AE  http://www.armory.com/~spcecdt/
+# 
+BEGIN {
+	foo(bar)
+}
+
+function foo(baz)
+{
+	split("x", baz)
+}
diff --git a/gawk-5.0.1/test/arrayprm2.ok b/gawk-5.0.1/test/arrayprm2.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/arrayprm3.awk b/gawk-5.0.1/test/arrayprm3.awk
new file mode 100644
index 00000000000..a41e587cbed
--- /dev/null
+++ b/gawk-5.0.1/test/arrayprm3.awk
@@ -0,0 +1,56 @@
+# From spcecdt@armory.com  Fri May  2 13:24:46 2003
+# Return-Path: <spcecdt@armory.com>
+# Received: from localhost (skeeve [127.0.0.1])
+# 	by skeeve.com (8.12.5/8.12.5) with ESMTP id h42AChum021950
+# 	for <arnold@localhost>; Fri, 2 May 2003 13:24:46 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Fri, 02 May 2003 13:24:46 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Fri May  2 13:23:37 2003)
+# X-From_: spcecdt@armory.com Fri May  2 00:43:51 2003
+# Received: from smtp1.actcom.net.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id h41Lhm500217 for <arobbins@actcom.co.il>;
+# 	Fri, 2 May 2003 00:43:49 +0300 (EET DST)  
+# 	(rfc931-sender: lmail.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by smtp1.actcom.net.il (8.12.8/8.12.8) with ESMTP id h41LiGcO022817
+# 	for <arobbins@actcom.co.il>; Fri, 2 May 2003 00:44:18 +0300
+# Received: from armory.com (deepthought.armory.com [192.122.209.42])
+# 	by f7.net (8.11.7/8.11.6) with SMTP id h41Lhj106516
+# 	for <arnold@skeeve.com>; Thu, 1 May 2003 17:43:46 -0400
+# Date: Thu, 1 May 2003 14:43:45 -0700
+# From: "John H. DuBois III" <spcecdt@armory.com>
+# To: Aharon Robbins <arnold@skeeve.com>
+# Subject: Re: gawk 3.1.2a bug
+# Message-ID: <20030501214345.GA24615@armory.com>
+# References: <200305011738.h41Hcg76017565@localhost.localdomain>
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# Content-Disposition: inline
+# In-Reply-To: <200305011738.h41Hcg76017565@localhost.localdomain>
+# User-Agent: Mutt/1.3.28i
+# X-Www: http://www.armory.com./~spcecdt/
+# Sender: spcecdt@armory.com
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: RO
+# 
+# On Thu, May 01, 2003 at 08:38:42PM +0300, Aharon Robbins wrote:
+# > > That worked, thanks.
+# > 
+# > Great.  Your report motivated me to find everywhere such additional
+# > code ought to be needed.  I think I did so.  --Arnold
+# 
+# Here's another one (perhaps fixed by your additional work):
+# 
+BEGIN { foo(a) }
+function foo(a) { bar(a); print "" in a }
+function bar(a) { a[""]; }
+# 
+# Prints 1 with gawk-3.1.1; 0 with 3.1.2a.
+# 
+# 	John
+# -- 
+# John DuBois  spcecdt@armory.com  KC6QKZ/AE  http://www.armory.com/~spcecdt/
+# 
diff --git a/gawk-5.0.1/test/arrayprm3.ok b/gawk-5.0.1/test/arrayprm3.ok
new file mode 100644
index 00000000000..d00491fd7e5
--- /dev/null
+++ b/gawk-5.0.1/test/arrayprm3.ok
@@ -0,0 +1 @@
+1
diff --git a/gawk-5.0.1/test/arrayref.awk b/gawk-5.0.1/test/arrayref.awk
new file mode 100644
index 00000000000..144d41a0687
--- /dev/null
+++ b/gawk-5.0.1/test/arrayref.awk
@@ -0,0 +1,13 @@
+	BEGIN { # foo[10] = 0		# put this line in and it will work
+		test(foo); print foo[1]
+		test2(foo2); print foo2[1]
+	}
+
+	function test(foo)
+	{
+		test2(foo)
+	}
+	function test2(bar)
+	{
+		bar[1] = 1
+	}
diff --git a/gawk-5.0.1/test/arrayref.ok b/gawk-5.0.1/test/arrayref.ok
new file mode 100644
index 00000000000..6ed281c757a
--- /dev/null
+++ b/gawk-5.0.1/test/arrayref.ok
@@ -0,0 +1,2 @@
+1
+1
diff --git a/gawk-5.0.1/test/arraysort.awk b/gawk-5.0.1/test/arraysort.awk
new file mode 100644
index 00000000000..b053a1d9ba6
--- /dev/null
+++ b/gawk-5.0.1/test/arraysort.awk
@@ -0,0 +1,90 @@
+# From: j.eh@mchsi.com
+# March and April 2010
+
+BEGIN {
+	print "--- test1 ---"
+	a[1] = b[3] = 5
+	a[2] = b[2] = "3D"
+	a[3] = b[1] = 10
+	asort(a)
+	asort(b)
+	for (i = 1; i <= 3; ++i)
+		printf("  %2s  %-2s\n", (a[i] ""), (b[i] ""))
+
+	delete a
+	delete b
+}
+
+BEGIN {
+	print "--- test2 ---"
+	a[100] = a[1] = a["x"] = a["y"] = 1
+	PROCINFO["sorted_in"] = "@ind_num_asc"
+	for (i in a)
+		print i, a[i]
+	delete a
+}
+
+BEGIN {
+	print "--- test3 ---"
+	a[100] = a[1] = a["x"] = 1
+	PROCINFO["sorted_in"] = "@ind_num_asc"
+	for (i in a)
+		print i, a[i]
+	delete a
+}
+
+BEGIN {
+	print "--- test4 ---"
+	a[0] = a[100] = a[1] = a["x"] = 1
+	PROCINFO["sorted_in"] = "@ind_num_asc"
+	for (i in a)
+		print i, a[i]
+	delete a
+}
+
+BEGIN {
+	print "--- test5 ---"
+	a[""] = a["y"] = a[0] = 1
+	PROCINFO["sorted_in"] = "@ind_num_asc"
+	for (i in a)
+		print i, a[i]
+	delete a
+}
+
+BEGIN {
+	print "--- test6 ---"
+	a[2] = a[1] = a[4] = a["3 "] = 1
+	PROCINFO["sorted_in"] = "@ind_num_asc"
+	for (i in a)
+		print "\""i"\""
+	delete a
+}
+
+
+BEGIN {
+        print "--- test7 ---"
+	n = split(" 4 \n 3\n3D\nD3\n3\n0\n2\n4\n1\n5", a, "\n")
+	for (i = 1; i <= n; i++)
+		b[a[i]] = a[i]
+	print "--unsorted--"
+	PROCINFO["sorted_in"] = "@unsorted"
+	for (i in b)
+		print "|"i"|"b[i]"|"
+
+	print "--asc ind str--"
+	PROCINFO["sorted_in"] = "@ind_str_asc"
+	for (i in b)
+		print "|"i"|"b[i]"|"
+	print "--asc val str--"
+	PROCINFO["sorted_in"] = "@val_str_asc"
+	for (i in b)
+		print "|"i"|"b[i]"|"
+	print "--asc ind num--"
+	PROCINFO["sorted_in"] = "@ind_num_asc"
+	for (i in b)
+		print "|"i"|"b[i]"|"
+	print "--asc val num--"
+	PROCINFO["sorted_in"] = "@val_num_asc"
+	for (i in b)
+		print "|"i"|"b[i]"|"
+}
diff --git a/gawk-5.0.1/test/arraysort.ok b/gawk-5.0.1/test/arraysort.ok
new file mode 100644
index 00000000000..d2d8ca702ba
--- /dev/null
+++ b/gawk-5.0.1/test/arraysort.ok
@@ -0,0 +1,83 @@
+--- test1 ---
+   5  5 
+  10  10
+  3D  3D
+--- test2 ---
+x 1
+y 1
+1 1
+100 1
+--- test3 ---
+x 1
+1 1
+100 1
+--- test4 ---
+0 1
+x 1
+1 1
+100 1
+--- test5 ---
+ 1
+0 1
+y 1
+--- test6 ---
+"1"
+"2"
+"3 "
+"4"
+--- test7 ---
+--unsorted--
+|4|4|
+|5|5|
+|D3|D3|
+|3D|3D|
+| 3| 3|
+|0|0|
+|1|1|
+| 4 | 4 |
+|2|2|
+|3|3|
+--asc ind str--
+| 3| 3|
+| 4 | 4 |
+|0|0|
+|1|1|
+|2|2|
+|3|3|
+|3D|3D|
+|4|4|
+|5|5|
+|D3|D3|
+--asc val str--
+| 3| 3|
+| 4 | 4 |
+|0|0|
+|1|1|
+|2|2|
+|3|3|
+|3D|3D|
+|4|4|
+|5|5|
+|D3|D3|
+--asc ind num--
+|0|0|
+|D3|D3|
+|1|1|
+|2|2|
+| 3| 3|
+|3|3|
+|3D|3D|
+| 4 | 4 |
+|4|4|
+|5|5|
+--asc val num--
+|0|0|
+|D3|D3|
+|1|1|
+|2|2|
+| 3| 3|
+|3|3|
+|3D|3D|
+| 4 | 4 |
+|4|4|
+|5|5|
diff --git a/gawk-5.0.1/test/arraysort2.awk b/gawk-5.0.1/test/arraysort2.awk
new file mode 100644
index 00000000000..e52d2a7c58a
--- /dev/null
+++ b/gawk-5.0.1/test/arraysort2.awk
@@ -0,0 +1,34 @@
+# This should no longer core dump ... 7/31/2018
+function init(b, 	a, i)
+{
+	a[1] = "aardvark"
+	a[2] = "animal"
+	a[3] = "zebra"
+	a[4] = "zoo"
+	a[5] = "Iguana"
+	a[6] = "Alligator"
+	a[7] =a[8] = "people"
+	for (i in a)
+		b[IGNORECASE][i] = a[i]
+}
+
+BEGIN {
+
+	for (IGNORECASE = 0; IGNORECASE < 2; IGNORECASE++) {
+		init(b)
+
+		n = asort(b[IGNORECASE])
+
+		for (i = 1; i <= n; i++)
+			printf("b[%d][%d] = \"%s\"\n", IGNORECASE, i, b[IGi])
+
+		print "===="
+	}
+
+	IGNORECASE = 1
+	init(b)
+	b[2][1] = ""
+	n = asort(b[1], b[2])
+	for (i = 1; i <= n; i++)
+		printf("b[2][%d] = \"%s\"\n", i, b[2][i])
+}
diff --git a/gawk-5.0.1/test/arraysort2.ok b/gawk-5.0.1/test/arraysort2.ok
new file mode 100644
index 00000000000..8fda0bfdbf8
--- /dev/null
+++ b/gawk-5.0.1/test/arraysort2.ok
@@ -0,0 +1,26 @@
+b[0][1] = ""
+b[0][2] = ""
+b[0][3] = ""
+b[0][4] = ""
+b[0][5] = ""
+b[0][6] = ""
+b[0][7] = ""
+b[0][8] = ""
+====
+b[1][1] = ""
+b[1][2] = ""
+b[1][3] = ""
+b[1][4] = ""
+b[1][5] = ""
+b[1][6] = ""
+b[1][7] = ""
+b[1][8] = ""
+====
+b[2][1] = "aardvark"
+b[2][2] = "Alligator"
+b[2][3] = "animal"
+b[2][4] = "Iguana"
+b[2][5] = "people"
+b[2][6] = "people"
+b[2][7] = "zebra"
+b[2][8] = "zoo"
diff --git a/gawk-5.0.1/test/arraytype.awk b/gawk-5.0.1/test/arraytype.awk
new file mode 100644
index 00000000000..70fd72b01d7
--- /dev/null
+++ b/gawk-5.0.1/test/arraytype.awk
@@ -0,0 +1,35 @@
+BEGIN {
+	# N.B. This relies upon the undocumented 2nd argument to typeof
+	x[0] = 0
+	print typeof(x, a)
+	print a["array_type"]
+
+	# make sure it resets
+	delete x[0]
+	print typeof(x, a)
+	print a["array_type"]
+
+	x["fubar"] = 0
+	print typeof(x, a)
+	print a["array_type"]
+
+	delete x["fubar"]
+	print typeof(x, a)
+	print a["array_type"]
+
+	x[-2] = 0
+	print typeof(x, a)
+	print a["array_type"]
+
+	delete x[-2]
+	print typeof(x, a)
+	print a["array_type"]
+
+	x[2] = 0
+	print typeof(x, a)
+	print a["array_type"]
+
+	delete x
+	print typeof(x, a)
+	print a["array_type"]
+}
diff --git a/gawk-5.0.1/test/arraytype.ok b/gawk-5.0.1/test/arraytype.ok
new file mode 100644
index 00000000000..6595bb89008
--- /dev/null
+++ b/gawk-5.0.1/test/arraytype.ok
@@ -0,0 +1,16 @@
+array
+cint
+array
+null
+array
+str
+array
+null
+array
+int
+array
+null
+array
+cint
+array
+null
diff --git a/gawk-5.0.1/test/arrdbg.awk b/gawk-5.0.1/test/arrdbg.awk
new file mode 100644
index 00000000000..951acb41923
--- /dev/null
+++ b/gawk-5.0.1/test/arrdbg.awk
@@ -0,0 +1,17 @@
+function check(x, exptype,   f) {
+	f[x]
+	printf "array_f subscript [%s]\n", x
+	printf "array_f subscript [%s]\n", x > okfile
+	adump(f, -1)
+	printf "    array_func: %s_array_func\n", exptype > okfile
+}
+
+BEGIN {
+	check(3.0, "cint")
+	check(-3, "int")
+	check("3.0", "str")
+	split(" 3", f, "|")	# create a maybe_num value
+	check(f[1], "str")
+	check("0", "cint")
+	check("-1", "int")
+}
diff --git a/gawk-5.0.1/test/arrymem1.awk b/gawk-5.0.1/test/arrymem1.awk
new file mode 100644
index 00000000000..0a4ae8990ae
--- /dev/null
+++ b/gawk-5.0.1/test/arrymem1.awk
@@ -0,0 +1,81 @@
+# From spcecdt@armory.com  Thu Jun 14 13:24:32 2001
+# Received: from mail.actcom.co.il [192.114.47.13]
+# 	by localhost with POP3 (fetchmail-5.5.0)
+# 	for arnold@localhost (single-drop); Thu, 14 Jun 2001 13:24:32 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Thu Jun 14 13:25:13 2001)
+# X-From_: spcecdt@armory.com Thu Jun 14 06:34:47 2001
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.9.1a/actcom-0.2) id GAA29661 for <arobbins@actcom.co.il>;
+# 	Thu, 14 Jun 2001 06:34:46 +0300 (EET DST)  
+# 	(rfc931-sender: lmail.actcom.co.il [192.114.47.13])
+# Received: from billohost.com (www.billohost.com [209.196.35.10])
+# 	by lmail.actcom.co.il (8.11.2/8.11.2) with ESMTP id f5E3YiO27337
+# 	for <arobbins@actcom.co.il>; Thu, 14 Jun 2001 06:34:45 +0300
+# Received: from fencepost.gnu.org (we-refuse-to-spy-on-our-users@fencepost.gnu.org [199.232.76.164])
+# 	by billohost.com (8.9.3/8.9.3) with ESMTP id XAA02681
+# 	for <arnold@skeeve.com>; Wed, 13 Jun 2001 23:33:57 -0400
+# Received: from deepthought.armory.com ([192.122.209.42])
+# 	by fencepost.gnu.org with smtp (Exim 3.16 #1 (Debian))
+# 	id 15ANu2-00005C-00
+# 	for <bug-gawk@gnu.org>; Wed, 13 Jun 2001 23:34:38 -0400
+# Date: Wed, 13 Jun 2001 20:32:42 -0700
+# From: "John H. DuBois III" <spcecdt@armory.com>
+# To: bug-gawk@gnu.org
+# Subject: gawk 3.1.0 bug
+# Message-ID: <20010613203242.A29975@armory.com>
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# X-Mailer: Mutt 1.0.1i
+# X-Www: http://www.armory.com./~spcecdt/
+# Sender: spcecdt@armory.com
+# Status: RO
+# 
+# Under SCO OpenServer 5.0.6a using gawk 3.1.0 compiled with gcc 2.95.2, this
+# program:
+
+    BEGIN {
+	f1(Procs,b)
+	print "test"
+    }
+
+    function f1(Procs,a) {
+	# a[""]
+	a[""] = "a"	# ADR: Give it a value so can trace it
+	f2()
+    }
+
+    function f2() {
+	# b[""]
+	b[""] = "b"	# ADR: Give it a value so can trace it
+    }
+
+    # ADR: 1/28/2003: Added this:
+    BEGIN { for (i in b) printf("b[\"%s\"] = \"%s\"\n", i, b[i]) }
+    # END ADR added.
+
+# gives:
+# 
+#     gawk: ./gtest:5: fatal error: internal error
+# 
+# and dumps core.
+# 
+# gdb gives me this stack backtrace:
+# 
+# #0  0x80019943 in kill () from /usr/lib/libc.so.1
+# #1  0x8003e754 in abort () from /usr/lib/libc.so.1
+# #2  0x8062a87 in catchsig (sig=0, code=0) at main.c:947
+# #3  0x80053a0c in _sigreturn () from /usr/lib/libc.so.1
+# #4  0x80023d36 in cleanfree () from /usr/lib/libc.so.1
+# #5  0x80023156 in _real_malloc () from /usr/lib/libc.so.1
+# #6  0x80023019 in malloc () from /usr/lib/libc.so.1
+# #7  0x8053b95 in do_print (tree=0x0) at builtin.c:1336
+# #8  0x806b47c in interpret (tree=0x8084ee4) at eval.c:606
+# #9  0x806ad8d in interpret (tree=0x8084f0c) at eval.c:384
+# #10 0x806ad21 in interpret (tree=0x8084f5c) at eval.c:367
+# #11 0x8061d5b in main (argc=4, argv=0x80478ac) at main.c:506
+# 
+# 	John
+# --
+# John DuBois  spcecdt@armory.com.  KC6QKZ/AE  http://www.armory.com./~spcecdt/
+# 
diff --git a/gawk-5.0.1/test/arrymem1.ok b/gawk-5.0.1/test/arrymem1.ok
new file mode 100644
index 00000000000..e37775bc8f8
--- /dev/null
+++ b/gawk-5.0.1/test/arrymem1.ok
@@ -0,0 +1,2 @@
+test
+b[""] = "b"
diff --git a/gawk-5.0.1/test/arryref2.awk b/gawk-5.0.1/test/arryref2.awk
new file mode 100644
index 00000000000..202a0409f58
--- /dev/null
+++ b/gawk-5.0.1/test/arryref2.awk
@@ -0,0 +1,18 @@
+BEGIN {
+	foo(a)
+
+	for (i in a)
+		print i, a[i]
+}
+
+function foo(b)
+{
+	bar(b)
+	b[2] = "local"
+}
+
+function bar(c)
+{
+	a[3] = "global"
+	c[1] = "local2"
+}
diff --git a/gawk-5.0.1/test/arryref2.ok b/gawk-5.0.1/test/arryref2.ok
new file mode 100644
index 00000000000..71aa9ed9afb
--- /dev/null
+++ b/gawk-5.0.1/test/arryref2.ok
@@ -0,0 +1,3 @@
+1 local2
+2 local
+3 global
diff --git a/gawk-5.0.1/test/arryref3.awk b/gawk-5.0.1/test/arryref3.awk
new file mode 100644
index 00000000000..e234ee52b16
--- /dev/null
+++ b/gawk-5.0.1/test/arryref3.awk
@@ -0,0 +1,18 @@
+BEGIN {
+	foo(a)
+
+	for (i in a)
+		print i, a[i]
+}
+
+function foo(b)
+{
+	a[1] = "global"
+	b[2] = "local"
+	bar(b)
+}
+
+function bar(c)
+{
+	c = 12
+}
diff --git a/gawk-5.0.1/test/arryref3.ok b/gawk-5.0.1/test/arryref3.ok
new file mode 100644
index 00000000000..eec04b63db7
--- /dev/null
+++ b/gawk-5.0.1/test/arryref3.ok
@@ -0,0 +1,2 @@
+gawk: arryref3.awk:17: fatal: attempt to use array `c (from b, from a)' in a scalar context
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/arryref4.awk b/gawk-5.0.1/test/arryref4.awk
new file mode 100644
index 00000000000..072eade6e01
--- /dev/null
+++ b/gawk-5.0.1/test/arryref4.awk
@@ -0,0 +1,17 @@
+BEGIN {
+	foo(a)
+
+	print  a
+}
+
+function foo(b)
+{
+	a = "global"
+	b[2] = "local"
+#	bar(b)
+}
+
+function bar(c)
+{
+	c = 12
+}
diff --git a/gawk-5.0.1/test/arryref4.ok b/gawk-5.0.1/test/arryref4.ok
new file mode 100644
index 00000000000..11cebfb4a2a
--- /dev/null
+++ b/gawk-5.0.1/test/arryref4.ok
@@ -0,0 +1,2 @@
+gawk: arryref4.awk:10: fatal: attempt to use scalar parameter `b' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/arryref5.awk b/gawk-5.0.1/test/arryref5.awk
new file mode 100644
index 00000000000..babff9c35ac
--- /dev/null
+++ b/gawk-5.0.1/test/arryref5.awk
@@ -0,0 +1,17 @@
+BEGIN {
+	foo(a)
+
+	print  a
+}
+
+function foo(b)
+{
+	b[2] = "local"
+	a = "global"
+#	bar(b)
+}
+
+function bar(c)
+{
+	c = 12
+}
diff --git a/gawk-5.0.1/test/arryref5.ok b/gawk-5.0.1/test/arryref5.ok
new file mode 100644
index 00000000000..7b542fbfe14
--- /dev/null
+++ b/gawk-5.0.1/test/arryref5.ok
@@ -0,0 +1,2 @@
+gawk: arryref5.awk:10: fatal: attempt to use array `a' in a scalar context
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/arynasty.awk b/gawk-5.0.1/test/arynasty.awk
new file mode 100644
index 00000000000..ec170931b36
--- /dev/null
+++ b/gawk-5.0.1/test/arynasty.awk
@@ -0,0 +1,16 @@
+BEGIN {
+	a = 12.153
+#print "-- stroring test[a]" > "/dev/stderr" ; fflush("/dev/stderr")
+	test[a] = "hi"
+#print "-- setting CONVFMT" > "/dev/stderr" ; fflush("/dev/stderr")
+	CONVFMT = "%.0f"
+#print "-- setting a" > "/dev/stderr" ; fflush("/dev/stderr")
+	a = 5
+#stopme()
+#print "-- starting loop" > "/dev/stderr" ; fflush("/dev/stderr")
+	for (i in test) {
+#print("-- i =", i) > "/dev/stderr" ; fflush("/dev/stderr");
+#printf("-- i = <%s>\n", i) > "/dev/stderr" ; fflush("/dev/stderr");
+		printf ("test[%s] = %s\n", i, test[i])
+	}
+}
diff --git a/gawk-5.0.1/test/arynasty.ok b/gawk-5.0.1/test/arynasty.ok
new file mode 100644
index 00000000000..125ed80ed85
--- /dev/null
+++ b/gawk-5.0.1/test/arynasty.ok
@@ -0,0 +1 @@
+test[12.153] = hi
diff --git a/gawk-5.0.1/test/arynocls.awk b/gawk-5.0.1/test/arynocls.awk
new file mode 100644
index 00000000000..724c9ac87ed
--- /dev/null
+++ b/gawk-5.0.1/test/arynocls.awk
@@ -0,0 +1,95 @@
+#To: bug-gnu-utils@gnu.org
+#From: Kristj�n J�nasson <kristjan@decode.is>
+#Subject: Gawk bug
+#Cc: arnold@gnu.org
+#
+#Hi!
+#
+#The following seems to be a bug in gawk. I have tried as I could to
+#minimize the bug-causing program, so of course it does not seem to do
+#anything useful in its present form. The error message received is:
+#
+#gawk: test.awk:15: fatal error: internal error
+#Aborted
+#
+#Note that there is an attached file that the program reads, called "a". I
+#played with the program a fair bit and my feeling is that the error is
+#related with the delete statement, and not the reading of the file and the
+#close statement. At one point I was able to remove the file reading and
+#still obtain the error. If, for example, I remove the close statement and
+#make two copies of the file instead, (reading one copy in sub1 and the
+#other in sub2), the error still occurs.
+#
+#The operating system is Red Hat Linux, version 6.0, the gawk is version
+#3.0.4, and the gawk was obtained from an rpm file gawk-3.0.4-1.i386.rpm.
+#
+#The program is:
+#
+
+# Wed Mar  8 13:41:34 IST 2000
+# ADR: modified to use INPUT, so can set it from command line.
+#      When run, no output is produced, but it shouldn't core
+#      dump, either.
+#
+# The program bug is to not close the file in sub2.
+
+function sub1(x) {
+# while (getline < "a" == 1) i++
+  while (getline < INPUT == 1) i++
+# close("a")
+  close(INPUT)
+}
+
+function sub2(x) {
+  i=0
+  delete y
+# while (getline < "a" == 1) z[++i] = $1
+  while (getline < INPUT == 1) z[++i] = $1
+  for(i in z) y[i] = x[i] + z[i]
+}
+
+function sub3(x, y, z) {
+  sub2(x)
+  for(i=1; i<=4; i++) z[i] = y[i]
+}
+
+BEGIN {
+  sub1(x)
+  sub2(x)
+  sub3(x, y, z)
+}
+#
+#And the data file is:
+#
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+# 32.440    3.830    3.383700000000000    10.08    298  865
+#
+#
diff --git a/gawk-5.0.1/test/arynocls.in b/gawk-5.0.1/test/arynocls.in
new file mode 100644
index 00000000000..8f4712c5c28
--- /dev/null
+++ b/gawk-5.0.1/test/arynocls.in
@@ -0,0 +1,30 @@
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
+ 32.440    3.830    3.383700000000000    10.08    298  865
diff --git a/gawk-5.0.1/test/arynocls.ok b/gawk-5.0.1/test/arynocls.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/aryprm1.awk b/gawk-5.0.1/test/aryprm1.awk
new file mode 100644
index 00000000000..e5bb9915bd7
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm1.awk
@@ -0,0 +1,9 @@
+function f(a) {
+	if (3 in a)
+		print 7
+	a = 5
+}
+
+BEGIN {
+	f(arr)
+}
diff --git a/gawk-5.0.1/test/aryprm1.ok b/gawk-5.0.1/test/aryprm1.ok
new file mode 100644
index 00000000000..99ffd8f813b
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm1.ok
@@ -0,0 +1,2 @@
+gawk: aryprm1.awk:4: fatal: attempt to use array `a (from arr)' in a scalar context
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/aryprm2.awk b/gawk-5.0.1/test/aryprm2.awk
new file mode 100644
index 00000000000..00dd7638325
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm2.awk
@@ -0,0 +1,8 @@
+function f(a) {
+	delete a
+	a *= 5
+}
+
+BEGIN {
+	f(arr)
+}
diff --git a/gawk-5.0.1/test/aryprm2.ok b/gawk-5.0.1/test/aryprm2.ok
new file mode 100644
index 00000000000..c8585c9adff
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm2.ok
@@ -0,0 +1,2 @@
+gawk: aryprm2.awk:3: fatal: attempt to use array `a (from arr)' in a scalar context
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/aryprm3.awk b/gawk-5.0.1/test/aryprm3.awk
new file mode 100644
index 00000000000..c38ab588550
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm3.awk
@@ -0,0 +1,10 @@
+function f(a,	i) {
+	for (i in a)
+		delete a[i]
+	if (a == 0)
+		print 7
+}
+
+BEGIN {
+	f(arr)
+}
diff --git a/gawk-5.0.1/test/aryprm3.ok b/gawk-5.0.1/test/aryprm3.ok
new file mode 100644
index 00000000000..a855deab9d5
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm3.ok
@@ -0,0 +1,2 @@
+gawk: aryprm3.awk:4: fatal: attempt to use array `a (from arr)' in a scalar context
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/aryprm4.awk b/gawk-5.0.1/test/aryprm4.awk
new file mode 100644
index 00000000000..09427f6b75a
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm4.awk
@@ -0,0 +1,7 @@
+function f(x){
+	x = 1
+}
+BEGIN {
+	f(a)
+	a[1]
+}
diff --git a/gawk-5.0.1/test/aryprm4.ok b/gawk-5.0.1/test/aryprm4.ok
new file mode 100644
index 00000000000..31c49c60e1a
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm4.ok
@@ -0,0 +1,2 @@
+gawk: aryprm4.awk:6: fatal: attempt to use scalar `a' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/aryprm5.awk b/gawk-5.0.1/test/aryprm5.awk
new file mode 100644
index 00000000000..a4aac367762
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm5.awk
@@ -0,0 +1,6 @@
+function f(x){
+	x[1] = x
+}
+BEGIN {
+	f(a)
+}
diff --git a/gawk-5.0.1/test/aryprm5.ok b/gawk-5.0.1/test/aryprm5.ok
new file mode 100644
index 00000000000..1ce41199e5a
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm5.ok
@@ -0,0 +1,2 @@
+gawk: aryprm5.awk:2: fatal: attempt to use scalar parameter `x' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/aryprm6.awk b/gawk-5.0.1/test/aryprm6.awk
new file mode 100644
index 00000000000..b12b2782fda
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm6.awk
@@ -0,0 +1,7 @@
+function f(x){
+	a
+	x[1] = 3
+}
+BEGIN {
+	f(a)
+}
diff --git a/gawk-5.0.1/test/aryprm6.ok b/gawk-5.0.1/test/aryprm6.ok
new file mode 100644
index 00000000000..8561ddf2164
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm6.ok
@@ -0,0 +1,2 @@
+gawk: aryprm6.awk:3: fatal: attempt to use scalar parameter `x' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/aryprm7.awk b/gawk-5.0.1/test/aryprm7.awk
new file mode 100644
index 00000000000..b442b4da838
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm7.awk
@@ -0,0 +1,6 @@
+function f(x, y){
+	y[1] = x
+}
+BEGIN {
+	f(a, a)
+}
diff --git a/gawk-5.0.1/test/aryprm7.ok b/gawk-5.0.1/test/aryprm7.ok
new file mode 100644
index 00000000000..00e28967c77
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm7.ok
@@ -0,0 +1,2 @@
+gawk: aryprm7.awk:2: fatal: attempt to use scalar parameter `y' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/aryprm8.awk b/gawk-5.0.1/test/aryprm8.awk
new file mode 100644
index 00000000000..b294abb6ff0
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm8.awk
@@ -0,0 +1,22 @@
+BEGIN {
+	f(0, a) # nothing
+	f(1, a)
+}
+function f(i, a) {
+	if (i == 0) return
+	g(a, a)
+	pr(a)
+}
+function g(x, y) {
+	h(y, x, y)
+}
+function h(b, c, d) {
+	b[1] = 1
+	c[1] = 2 # rewrite
+	print b[1], d[1]
+	c[2] = 1
+	b[2] = 2 # should rewrite
+}
+function pr(x) {
+	print x[1], x[2]
+}
diff --git a/gawk-5.0.1/test/aryprm8.ok b/gawk-5.0.1/test/aryprm8.ok
new file mode 100644
index 00000000000..fad54c2432c
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm8.ok
@@ -0,0 +1,2 @@
+2 2
+2 2
diff --git a/gawk-5.0.1/test/aryprm9.awk b/gawk-5.0.1/test/aryprm9.awk
new file mode 100644
index 00000000000..004e3c3486b
--- /dev/null
+++ b/gawk-5.0.1/test/aryprm9.awk
@@ -0,0 +1,16 @@
+#!/usr/bin/gawk -f
+BEGIN {
+
+     for (i = 0; i < 100; i++)
+         func_exec()
+}
+
+function func_exec(opaque)
+{
+     func_a(1, opaque)    #set additional argument, not expected by fname
+}
+
+function func_a(a,    b, loc1, loc2)
+{
+     b = 0            #unref Nnull_string
+}
diff --git a/gawk-5.0.1/test/aryprm9.ok b/gawk-5.0.1/test/aryprm9.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/arysubnm.awk b/gawk-5.0.1/test/arysubnm.awk
new file mode 100644
index 00000000000..961b54abf53
--- /dev/null
+++ b/gawk-5.0.1/test/arysubnm.awk
@@ -0,0 +1 @@
+BEGIN { n = 11 ; foo[n] = n; print (2 <= n) }
diff --git a/gawk-5.0.1/test/arysubnm.ok b/gawk-5.0.1/test/arysubnm.ok
new file mode 100644
index 00000000000..d00491fd7e5
--- /dev/null
+++ b/gawk-5.0.1/test/arysubnm.ok
@@ -0,0 +1 @@
+1
diff --git a/gawk-5.0.1/test/aryunasgn.awk b/gawk-5.0.1/test/aryunasgn.awk
new file mode 100644
index 00000000000..ccb3fd235c6
--- /dev/null
+++ b/gawk-5.0.1/test/aryunasgn.awk
@@ -0,0 +1,17 @@
+BEGIN {
+    a[i] = "null"                         # i is initially undefined
+    for (i in a) {                        # i is null string
+        print length(i), a[i] # , typeof(i)  # 0 null
+        print (i==0), (i=="")             # 1 1  should be  0 1
+    }
+    print a[""]                           # null
+    print a[0]                            #
+
+    b[$2] = "null also"                   # $2 is also undefined
+    for (j in b) {
+        print length(j), a[j] # , typeof(i)  # 0 null
+        print (j==0), (j=="")             # 1 1  should be  0 1
+    }
+    print b[""]                           # null
+    print b[0]                            #
+}
diff --git a/gawk-5.0.1/test/aryunasgn.ok b/gawk-5.0.1/test/aryunasgn.ok
new file mode 100644
index 00000000000..798c6de39fe
--- /dev/null
+++ b/gawk-5.0.1/test/aryunasgn.ok
@@ -0,0 +1,8 @@
+0 null
+0 1
+null
+
+0 null
+0 1
+null also
+
diff --git a/gawk-5.0.1/test/asgext.awk b/gawk-5.0.1/test/asgext.awk
new file mode 100644
index 00000000000..c7f17754fa6
--- /dev/null
+++ b/gawk-5.0.1/test/asgext.awk
@@ -0,0 +1 @@
+{ print $3; $4 = "a"; print }
diff --git a/gawk-5.0.1/test/asgext.in b/gawk-5.0.1/test/asgext.in
new file mode 100644
index 00000000000..3743b5b464a
--- /dev/null
+++ b/gawk-5.0.1/test/asgext.in
@@ -0,0 +1,3 @@
+1 2 3
+1
+1 2 3 4
diff --git a/gawk-5.0.1/test/asgext.ok b/gawk-5.0.1/test/asgext.ok
new file mode 100644
index 00000000000..2c0df70f423
--- /dev/null
+++ b/gawk-5.0.1/test/asgext.ok
@@ -0,0 +1,6 @@
+3
+1 2 3 a
+
+1   a
+3
+1 2 3 a
diff --git a/gawk-5.0.1/test/asort.awk b/gawk-5.0.1/test/asort.awk
new file mode 100644
index 00000000000..8a42e26ab6f
--- /dev/null
+++ b/gawk-5.0.1/test/asort.awk
@@ -0,0 +1,25 @@
+function init(a)
+{
+	a[1] = "aardvark"
+	a[2] = "animal"
+	a[3] = "zebra"
+	a[4] = "zoo"
+	a[5] = "Iguana"
+	a[6] = "Alligator"
+	a[7] = "Nouns"
+	a[8] = "people"
+}
+
+BEGIN {
+
+	for (IGNORECASE = 0; IGNORECASE < 2; IGNORECASE++) {
+		init(a)
+
+		n = asort(a)
+
+		for (i = 1; i <= n; i++)
+			printf("a[%d] = \"%s\"\n", i, a[i])
+
+		print "============"
+	}
+}
diff --git a/gawk-5.0.1/test/asort.ok b/gawk-5.0.1/test/asort.ok
new file mode 100644
index 00000000000..1d0ddd0f608
--- /dev/null
+++ b/gawk-5.0.1/test/asort.ok
@@ -0,0 +1,18 @@
+a[1] = "Alligator"
+a[2] = "Iguana"
+a[3] = "Nouns"
+a[4] = "aardvark"
+a[5] = "animal"
+a[6] = "people"
+a[7] = "zebra"
+a[8] = "zoo"
+============
+a[1] = "aardvark"
+a[2] = "Alligator"
+a[3] = "animal"
+a[4] = "Iguana"
+a[5] = "Nouns"
+a[6] = "people"
+a[7] = "zebra"
+a[8] = "zoo"
+============
diff --git a/gawk-5.0.1/test/asorti.awk b/gawk-5.0.1/test/asorti.awk
new file mode 100644
index 00000000000..3314c9f31b1
--- /dev/null
+++ b/gawk-5.0.1/test/asorti.awk
@@ -0,0 +1,27 @@
+function init(a)
+{
+	delete a
+
+	a["aardvark"] = 1
+	a["animal"] = 2
+	a["zebra"] = 3
+	a["zoo"] = 4
+	a["Iguana"] = 5
+	a["Alligator"] = 6
+	a["Nouns"] = 7
+	a["people"] = 8
+}
+
+BEGIN {
+
+	for (IGNORECASE = 0; IGNORECASE < 2; IGNORECASE++) {
+		init(a)
+
+		n = asorti(a)
+
+		for (i = 1; i <= n; i++)
+			printf("a[%d] = \"%s\"\n", i, a[i])
+
+		print "============"
+	}
+}
diff --git a/gawk-5.0.1/test/asorti.ok b/gawk-5.0.1/test/asorti.ok
new file mode 100644
index 00000000000..1d0ddd0f608
--- /dev/null
+++ b/gawk-5.0.1/test/asorti.ok
@@ -0,0 +1,18 @@
+a[1] = "Alligator"
+a[2] = "Iguana"
+a[3] = "Nouns"
+a[4] = "aardvark"
+a[5] = "animal"
+a[6] = "people"
+a[7] = "zebra"
+a[8] = "zoo"
+============
+a[1] = "aardvark"
+a[2] = "Alligator"
+a[3] = "animal"
+a[4] = "Iguana"
+a[5] = "Nouns"
+a[6] = "people"
+a[7] = "zebra"
+a[8] = "zoo"
+============
diff --git a/gawk-5.0.1/test/assignnumfield.awk b/gawk-5.0.1/test/assignnumfield.awk
new file mode 100644
index 00000000000..3a056cb0065
--- /dev/null
+++ b/gawk-5.0.1/test/assignnumfield.awk
@@ -0,0 +1 @@
+{$0 = ++i} 1
diff --git a/gawk-5.0.1/test/assignnumfield.in b/gawk-5.0.1/test/assignnumfield.in
new file mode 100644
index 00000000000..b82c4b2d003
--- /dev/null
+++ b/gawk-5.0.1/test/assignnumfield.in
@@ -0,0 +1,5 @@
+a b c
+a b c
+a b c
+a b c
+a b c
diff --git a/gawk-5.0.1/test/assignnumfield.ok b/gawk-5.0.1/test/assignnumfield.ok
new file mode 100644
index 00000000000..8a1218a1024
--- /dev/null
+++ b/gawk-5.0.1/test/assignnumfield.ok
@@ -0,0 +1,5 @@
+1
+2
+3
+4
+5
diff --git a/gawk-5.0.1/test/assignnumfield2.awk b/gawk-5.0.1/test/assignnumfield2.awk
new file mode 100644
index 00000000000..48b42db6136
--- /dev/null
+++ b/gawk-5.0.1/test/assignnumfield2.awk
@@ -0,0 +1,4 @@
+BEGIN {
+	$0 = 1
+	print $1
+}
diff --git a/gawk-5.0.1/test/assignnumfield2.ok b/gawk-5.0.1/test/assignnumfield2.ok
new file mode 100644
index 00000000000..d00491fd7e5
--- /dev/null
+++ b/gawk-5.0.1/test/assignnumfield2.ok
@@ -0,0 +1 @@
+1
diff --git a/gawk-5.0.1/test/awkpath.ok b/gawk-5.0.1/test/awkpath.ok
new file mode 100644
index 00000000000..6cffe1b7a95
--- /dev/null
+++ b/gawk-5.0.1/test/awkpath.ok
@@ -0,0 +1 @@
+Found it.
diff --git a/gawk-5.0.1/test/back89.awk b/gawk-5.0.1/test/back89.awk
new file mode 100644
index 00000000000..0da3362576a
--- /dev/null
+++ b/gawk-5.0.1/test/back89.awk
@@ -0,0 +1 @@
+/a\8b/
diff --git a/gawk-5.0.1/test/back89.in b/gawk-5.0.1/test/back89.in
new file mode 100644
index 00000000000..b0a88f248e0
--- /dev/null
+++ b/gawk-5.0.1/test/back89.in
@@ -0,0 +1,2 @@
+a8b
+a\8b
diff --git a/gawk-5.0.1/test/back89.ok b/gawk-5.0.1/test/back89.ok
new file mode 100644
index 00000000000..8eebce474c9
--- /dev/null
+++ b/gawk-5.0.1/test/back89.ok
@@ -0,0 +1,2 @@
+gawk: back89.awk:1: warning: regexp escape sequence `\8' treated as plain `8'
+a8b
diff --git a/gawk-5.0.1/test/backbigs1.awk b/gawk-5.0.1/test/backbigs1.awk
new file mode 100644
index 00000000000..fb4d811f78d
--- /dev/null
+++ b/gawk-5.0.1/test/backbigs1.awk
@@ -0,0 +1 @@
+/\S/
diff --git a/gawk-5.0.1/test/backbigs1.in b/gawk-5.0.1/test/backbigs1.in
new file mode 100644
index 00000000000..16b415f4374
--- /dev/null
+++ b/gawk-5.0.1/test/backbigs1.in
@@ -0,0 +1 @@
+�
diff --git a/gawk-5.0.1/test/backbigs1.ok b/gawk-5.0.1/test/backbigs1.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/backgsub.awk b/gawk-5.0.1/test/backgsub.awk
new file mode 100644
index 00000000000..bec735490fc
--- /dev/null
+++ b/gawk-5.0.1/test/backgsub.awk
@@ -0,0 +1,4 @@
+{
+        gsub( "\\\\", "\\\\")
+        print
+}
diff --git a/gawk-5.0.1/test/backgsub.in b/gawk-5.0.1/test/backgsub.in
new file mode 100644
index 00000000000..2d3f17f0184
--- /dev/null
+++ b/gawk-5.0.1/test/backgsub.in
@@ -0,0 +1 @@
+\x\y\z
diff --git a/gawk-5.0.1/test/backgsub.ok b/gawk-5.0.1/test/backgsub.ok
new file mode 100644
index 00000000000..e2e265fac75
--- /dev/null
+++ b/gawk-5.0.1/test/backgsub.ok
@@ -0,0 +1 @@
+\\x\\y\\z
diff --git a/gawk-5.0.1/test/backsmalls1.awk b/gawk-5.0.1/test/backsmalls1.awk
new file mode 100644
index 00000000000..f3e0aba4d50
--- /dev/null
+++ b/gawk-5.0.1/test/backsmalls1.awk
@@ -0,0 +1 @@
+/^\s$/
diff --git a/gawk-5.0.1/test/backsmalls1.in b/gawk-5.0.1/test/backsmalls1.in
new file mode 100644
index 00000000000..491807cd5fd
--- /dev/null
+++ b/gawk-5.0.1/test/backsmalls1.in
@@ -0,0 +1,36 @@
+# U+00A0 NO-BREAK SPACE: c2 a0
+# 
+# U+2007 FIGURE SPACE: e2 80 87
+# 
+# U+200B ZERO WIDTH SPACE: e2 80 8b
+#​
+# U+202F NARROW NO-BREAK SPACE: e2 80 af
+# 
+U+0020 SPACE: 20
+ 
+U+1680 OGHAM SPACE MARK: e1 9a 80
+ 
+U+2000 EN QUAD: e2 80 80
+ 
+U+2001 EM QUAD: e2 80 81
+ 
+U+2002 EN SPACE: e2 80 82
+ 
+U+2003 EM SPACE: e2 80 83
+ 
+U+2004 THREE-PER-EM SPACE: e2 80 84
+ 
+U+2005 FOUR-PER-EM SPACE: e2 80 85
+ 
+U+2006 SIX-PER-EM SPACE: e2 80 86
+ 
+U+2008 PUNCTUATION SPACE: e2 80 88
+ 
+U+2009 THIN SPACE: e2 80 89
+ 
+U+200A HAIR SPACE: e2 80 8a
+ 
+U+205F MEDIUM MATHEMATICAL SPACE: e2 81 9f
+ 
+U+3000 IDEOGRAPHIC SPACE: e3 80 80
+　
diff --git a/gawk-5.0.1/test/backsmalls1.ok b/gawk-5.0.1/test/backsmalls1.ok
new file mode 100644
index 00000000000..1f678123eb2
--- /dev/null
+++ b/gawk-5.0.1/test/backsmalls1.ok
@@ -0,0 +1,14 @@
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+ 
+　
diff --git a/gawk-5.0.1/test/backsmalls2.awk b/gawk-5.0.1/test/backsmalls2.awk
new file mode 100644
index 00000000000..02326f58bc0
--- /dev/null
+++ b/gawk-5.0.1/test/backsmalls2.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	pat["^\\s*$"] = pat["^\\s+$"] = pat["^\\s?$"] = pat["^\\s{1}$"] = 1
+	for (i in pat) {
+		if (" " !~ i) {
+			printf("pattern \"%s\" failed!\n", i) > "/dev/stderr"
+			exit 1
+		}
+	}
+	exit 0
+}
diff --git a/gawk-5.0.1/test/backsmalls2.ok b/gawk-5.0.1/test/backsmalls2.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/backw.awk b/gawk-5.0.1/test/backw.awk
new file mode 100644
index 00000000000..078a5d8952a
--- /dev/null
+++ b/gawk-5.0.1/test/backw.awk
@@ -0,0 +1 @@
+/\w+/
diff --git a/gawk-5.0.1/test/backw.in b/gawk-5.0.1/test/backw.in
new file mode 100644
index 00000000000..ec09f608b26
--- /dev/null
+++ b/gawk-5.0.1/test/backw.in
@@ -0,0 +1,3 @@
+123
+abc
+456
diff --git a/gawk-5.0.1/test/backw.ok b/gawk-5.0.1/test/backw.ok
new file mode 100644
index 00000000000..ec09f608b26
--- /dev/null
+++ b/gawk-5.0.1/test/backw.ok
@@ -0,0 +1,3 @@
+123
+abc
+456
diff --git a/gawk-5.0.1/test/badargs.ok b/gawk-5.0.1/test/badargs.ok
new file mode 100644
index 00000000000..dfbd1c192d0
--- /dev/null
+++ b/gawk-5.0.1/test/badargs.ok
@@ -0,0 +1,46 @@
+gawk: option requires an argument -- f
+Usage: gawk [POSIX or GNU style options] -f progfile [--] file ...
+Usage: gawk [POSIX or GNU style options] [--] 'program' file ...
+POSIX options:		GNU long options: (standard)
+	-f progfile		--file=progfile
+	-F fs			--field-separator=fs
+	-v var=val		--assign=var=val
+Short options:		GNU long options: (extensions)
+	-b			--characters-as-bytes
+	-c			--traditional
+	-C			--copyright
+	-d[file]		--dump-variables[=file]
+	-D[file]		--debug[=file]
+	-e 'program-text'	--source='program-text'
+	-E file			--exec=file
+	-g			--gen-pot
+	-h			--help
+	-i includefile		--include=includefile
+	-l library		--load=library
+	-L[fatal|invalid|no-ext]	--lint[=fatal|invalid|no-ext]
+	-M			--bignum
+	-N			--use-lc-numeric
+	-n			--non-decimal-data
+	-o[file]		--pretty-print[=file]
+	-O			--optimize
+	-p[file]		--profile[=file]
+	-P			--posix
+	-r			--re-interval
+	-s			--no-optimize
+	-S			--sandbox
+	-t			--lint-old
+	-V			--version
+
+To report bugs, see node `Bugs' in `gawk.info'
+which is section `Reporting Problems and Bugs' in the
+printed version.  This same information may be found at
+https://www.gnu.org/software/gawk/manual/html_node/Bugs.html.
+PLEASE do NOT try to report bugs by posting in comp.lang.awk,
+or by using a web forum such as Stack Overflow.
+
+gawk is a pattern scanning and processing language.
+By default it reads standard input and writes standard output.
+
+Examples:
+	gawk '{ sum += $1 }; END { print sum }' file
+	gawk -F: '{ print $1 }' /etc/passwd
diff --git a/gawk-5.0.1/test/badassign1.awk b/gawk-5.0.1/test/badassign1.awk
new file mode 100644
index 00000000000..5614f4a43b5
--- /dev/null
+++ b/gawk-5.0.1/test/badassign1.awk
@@ -0,0 +1 @@
+BEGIN { $i++ = 3 ; print i }
diff --git a/gawk-5.0.1/test/badassign1.ok b/gawk-5.0.1/test/badassign1.ok
new file mode 100644
index 00000000000..c5ade3b3d86
--- /dev/null
+++ b/gawk-5.0.1/test/badassign1.ok
@@ -0,0 +1,3 @@
+gawk: badassign1.awk:1: BEGIN { $i++ = 3 ; print i }
+gawk: badassign1.awk:1:                  ^ cannot assign a value to the result of a field post-increment expression
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/badbuild.awk b/gawk-5.0.1/test/badbuild.awk
new file mode 100644
index 00000000000..12a6caebadf
--- /dev/null
+++ b/gawk-5.0.1/test/badbuild.awk
@@ -0,0 +1,6 @@
+$1 == $2 == $3 {
+	print "Gawk was built incorrectly."
+	print "Use bison, not byacc or something else!"
+	print "(Really, why aren't you using the awkgram.c in the distribution?)"
+	exit 42
+}
diff --git a/gawk-5.0.1/test/badbuild.in b/gawk-5.0.1/test/badbuild.in
new file mode 100644
index 00000000000..560711d4685
--- /dev/null
+++ b/gawk-5.0.1/test/badbuild.in
@@ -0,0 +1 @@
+a a 1
diff --git a/gawk-5.0.1/test/badbuild.ok b/gawk-5.0.1/test/badbuild.ok
new file mode 100644
index 00000000000..6d60f5a9f3c
--- /dev/null
+++ b/gawk-5.0.1/test/badbuild.ok
@@ -0,0 +1,3 @@
+gawk: badbuild.awk:1: $1 == $2 == $3 {
+gawk: badbuild.awk:1:          ^ syntax error
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/beginfile1.awk b/gawk-5.0.1/test/beginfile1.awk
new file mode 100644
index 00000000000..0cd148be4f7
--- /dev/null
+++ b/gawk-5.0.1/test/beginfile1.awk
@@ -0,0 +1,19 @@
+BEGINFILE {
+	print "In BEGINFILE:"
+	filename = FILENAME
+	gsub(/.*[/]/, "", filename)
+	printf "\tFILENAME = %s, FNR = %d, ERRNO = \"%s\"\n", filename, FNR, ERRNO
+
+	if (ERRNO != "")
+		nextfile
+}
+
+FNR == 1 {	print "processing", filename }
+FNR > 1	{ nextfile }
+
+ENDFILE {
+	print "In ENDFILE:"
+	filename = FILENAME
+	gsub(/.*[/]/, "", filename)
+	printf "\tFILENAME = %s, FNR = %d, ERRNO = \"%s\"\n", filename, FNR, ERRNO
+}
diff --git a/gawk-5.0.1/test/beginfile1.ok b/gawk-5.0.1/test/beginfile1.ok
new file mode 100644
index 00000000000..1318c7d5f0c
--- /dev/null
+++ b/gawk-5.0.1/test/beginfile1.ok
@@ -0,0 +1,14 @@
+In BEGINFILE:
+	FILENAME = beginfile1.awk, FNR = 0, ERRNO = ""
+processing beginfile1.awk
+In ENDFILE:
+	FILENAME = beginfile1.awk, FNR = 2, ERRNO = ""
+In BEGINFILE:
+	FILENAME = ., FNR = 0, ERRNO = "Is a directory"
+In BEGINFILE:
+	FILENAME = file, FNR = 0, ERRNO = "No such file or directory"
+In BEGINFILE:
+	FILENAME = Makefile, FNR = 0, ERRNO = ""
+processing Makefile
+In ENDFILE:
+	FILENAME = Makefile, FNR = 2, ERRNO = ""
diff --git a/gawk-5.0.1/test/beginfile2.in b/gawk-5.0.1/test/beginfile2.in
new file mode 100644
index 00000000000..34043e727ec
--- /dev/null
+++ b/gawk-5.0.1/test/beginfile2.in
@@ -0,0 +1,242 @@
+#TEST1#
+BEGINFILE {
+	print "In BEGINFILE:", FILENAME
+}
+BEGIN {
+	count = 0
+	print "In BEGIN"
+	while (getline > 0)
+		count++;
+	print count == NR
+}
+
+#TEST2#
+BEGINFILE {
+        print "In BEGINFILE:", FILENAME
+        nextfile
+}
+ENDFILE{
+        print "In ENDFILE:", FILENAME
+}
+
+
+#TEST3#
+BEGINFILE {
+	print "In BEGINFILE:", FILENAME
+}
+END {
+	print "executing END rule"
+	ARGV[ARGC++] = src;
+	count = 0
+	while (getline> 0)
+		count++;
+	print count == FNR
+	print "Done executing END rule"
+}
+ENDFILE {
+	print "In ENDFILE:", FILENAME
+}
+
+#TEST4#
+BEGINFILE {
+	print "In BEGINFILE:", FILENAME
+	nextfile
+}
+END {
+	print "executing END rule"
+	ARGV[ARGC++] = src;
+	getline
+	print $0
+	print "Done executing END rule"
+}
+ENDFILE {
+	print "ENDFILE:", FILENAME
+}
+
+
+#TEST5#
+BEGIN {
+	getline
+	count++
+	print NR, count
+}
+{
+	count++
+}
+END {
+	print NR == count
+}
+
+#TEST6#
+BEGINFILE {
+	print "In BEGINFILE:", FILENAME
+	count = 0
+}
+BEGIN {
+	getline
+	count++
+	print FNR, count
+}
+{
+	count++
+}
+ENDFILE {
+	print "In ENDFILE:", FILENAME
+	print count == FNR
+}
+
+#TEST7#
+BEGINFILE {
+	print "In BEGINFILE:", FILENAME
+	count = 0
+	if (ARGIND == 1)
+		nextfile
+}
+BEGIN {
+	getline
+	print "In BEGIN:", FILENAME
+}
+{ count++ }
+ENDFILE {
+	print "In ENDFILE:", FILENAME
+	print (FNR - count)
+}
+
+#TEST8#
+function f(a, b) {
+	getline
+	print FILENAME
+	print a, b
+}
+function g(x, y) {
+	return x
+}
+BEGINFILE { nextfile }
+BEGIN { g(3, f(1, 2)) }
+
+#TEST9#
+function f(a, b) {
+	b = b ":" a;
+	if (skip || ERRNO != "") {
+		print "Skipping:", b
+		nextfile
+	}
+	return b
+}
+BEGINFILE { print "In BEGINFILE:", f(FILENAME, ++i)}
+FNR == 1 { print "In Rule:", FILENAME }
+ENDFILE { print "In ENDFILE:", FILENAME }
+
+#TEST10#
+function f() {
+	nextfile
+}
+function g(	cnt) {
+	cnt = 0
+	while (getline > 0)
+		cnt++;
+	return cnt
+}
+BEGINFILE { if (ARGIND == 1) f(); }
+BEGIN {
+		print g(), NR		
+}
+
+#TEST11#
+function f(a, b) {
+	print a
+	nextfile
+	print b
+}
+function g(x, y) {
+	print x
+	getline
+	return y
+}
+BEGINFILE { ARGIND == 1 ? g(3, f(FILENAME, 2)) : f(3, g(FILENAME, 2)) }
+
+#TEST12#
+BEGINFILE {
+	print "In BEGINFILE:", FILENAME
+}
+function g() {
+	nextfile
+}
+function f(	cnt) {
+	print cnt + 0
+	while (getline > 0) {
+		if (++cnt == 2) {
+			g()
+			print "shouldn't see this line"
+		}
+	}
+}
+{
+	print FNR
+	f()
+}
+ENDFILE {
+	print "In ENDFILE:", FILENAME
+}
+
+#TEST13#
+# exit in BEGINFILE
+BEGINFILE {
+	print "In BEGINFILE:", FILENAME
+	exit(0)
+}
+ENDFILE {
+	print "In ENDFILE:", FILENAME
+}
+END {
+	print "In END:", FILENAME
+	while (getline > 0)
+		;
+	print "shouldn't see this line"
+}
+
+#TEST14#
+# exit in ENDFILE
+BEGINFILE {
+        print "In BEGINFILE:", FILENAME
+}
+ENDFILE {
+        print "In ENDFILE:", FILENAME
+        exit(0)
+}
+END {
+        print "In END:", FILENAME
+        while (getline > 0)
+			;
+        print "shouldn't see this line"
+}
+
+#TEST15#
+BEGINFILE {
+	print "BEGINFILE:", FILENAME
+}
+{ nextfile }
+END {
+	print NR
+}
+
+#TEST16#
+BEGINFILE {
+	print "In BEGINFILE:", FILENAME
+}
+BEGIN {
+	getline
+	print "In BEGIN:", FILENAME
+}
+{
+	if (NR == FNR) {
+		print "In Rule:", FILENAME
+		nextfile
+	}
+	exit(0)
+}
+
+ENDFILE {
+	print "In ENDFILE: ", FILENAME
+}
+
diff --git a/gawk-5.0.1/test/beginfile2.ok b/gawk-5.0.1/test/beginfile2.ok
new file mode 100644
index 00000000000..fed71bb2b3d
--- /dev/null
+++ b/gawk-5.0.1/test/beginfile2.ok
@@ -0,0 +1,93 @@
+--Test 1a--
+In BEGIN
+In BEGINFILE: beginfile2.in
+1
+--Test 1b--
+In BEGIN
+In BEGINFILE: beginfile2.in
+In BEGINFILE: file/does/not/exist
+gawk: cmd. line:3: fatal: cannot open file `file/does/not/exist' for reading (No such file or directory)
+--Test 2--
+In BEGINFILE: beginfile2.in
+In ENDFILE: beginfile2.in
+In BEGINFILE: file/does/not/exist
+--Test 3--
+In BEGINFILE: beginfile2.in
+In ENDFILE: beginfile2.in
+executing END rule
+In BEGINFILE: beginfile2.sh
+In ENDFILE: beginfile2.sh
+1
+Done executing END rule
+--Test 4--
+In BEGINFILE: beginfile2.in
+ENDFILE: beginfile2.in
+executing END rule
+In BEGINFILE: beginfile2.sh
+ENDFILE: beginfile2.sh
+
+Done executing END rule
+--Test 5--
+1 1
+1
+--Test 6--
+In BEGINFILE: beginfile2.in
+1 1
+In ENDFILE: beginfile2.in
+1
+--Test 7--
+In BEGINFILE: beginfile2.in
+In ENDFILE: beginfile2.in
+0
+In BEGINFILE: beginfile2.sh
+In BEGIN: beginfile2.sh
+In ENDFILE: beginfile2.sh
+1
+--Test 8--
+beginfile2.in
+1 2
+--Test 9a--
+Skipping: 1:file/does/not/exist
+In BEGINFILE: 2:beginfile2.in
+In Rule: beginfile2.in
+In ENDFILE: beginfile2.in
+--Test 9b--
+Skipping: 1:file/does/not/exist
+Skipping: 2:beginfile2.in
+In ENDFILE: beginfile2.in
+--Test 10--
+82 82
+--Test 11--
+beginfile2.in
+beginfile2.sh
+gawk: cmd. line:9: fatal: non-redirected `getline' invalid inside `BEGINFILE' rule
+--Test 12--
+In BEGINFILE: beginfile2.in
+1
+0
+In ENDFILE: beginfile2.in
+In BEGINFILE: beginfile2.sh
+1
+0
+In ENDFILE: beginfile2.sh
+--Test 13--
+In BEGINFILE: beginfile2.in
+In END: beginfile2.in
+In ENDFILE: beginfile2.in
+In BEGINFILE: beginfile2.sh
+--Test 14--
+In BEGINFILE: beginfile2.in
+In ENDFILE: beginfile2.in
+In END: beginfile2.in
+In BEGINFILE: beginfile2.sh
+In ENDFILE: beginfile2.sh
+--Test 15--
+BEGINFILE: beginfile2.in
+BEGINFILE: beginfile2.sh
+2
+--Test 16--
+In BEGINFILE: beginfile2.in
+In BEGIN: beginfile2.in
+In Rule: beginfile2.in
+In ENDFILE:  beginfile2.in
+In BEGINFILE: beginfile2.sh
diff --git a/gawk-5.0.1/test/beginfile2.sh b/gawk-5.0.1/test/beginfile2.sh
new file mode 100755
index 00000000000..dffaa88b4c5
--- /dev/null
+++ b/gawk-5.0.1/test/beginfile2.sh
@@ -0,0 +1,82 @@
+#!/bin/sh
+
+# beginfile2.sh --- test BEGINFILE/ENDFILE/getline/nextfile/exit combinations
+
+#AWK="../gawk"
+AWKPROG="beginfile2.in"
+SCRIPT=`basename $0`
+
+if [ "$AWK" = "" ]
+then
+        echo $0: You must set AWK >&2
+        exit 1
+fi
+
+echo "--Test 1a--"
+prog=`$AWK ' /#TEST1#/, /#TEST2#/' $AWKPROG`
+$AWK "$prog" $AWKPROG
+echo "--Test 1b--"
+$AWK "$prog" $AWKPROG file/does/not/exist
+
+echo "--Test 2--"
+prog=`$AWK ' /#TEST2#/, /#TEST3#/' $AWKPROG`
+$AWK "$prog" $AWKPROG file/does/not/exist
+
+echo "--Test 3--"
+prog=`$AWK ' /#TEST3#/, /#TEST4#/' $AWKPROG`
+$AWK -vsrc=$SCRIPT "$prog" $AWKPROG
+
+echo "--Test 4--"
+prog=`$AWK ' /#TEST4#/, /#TEST5#/' $AWKPROG`
+$AWK -vsrc=$SCRIPT "$prog" $AWKPROG
+
+echo "--Test 5--"
+prog=`$AWK ' /#TEST5#/, /#TEST6#/' $AWKPROG`
+$AWK "$prog" $AWKPROG
+
+echo "--Test 6--"
+prog=`$AWK ' /#TEST6#/, /#TEST7#/' $AWKPROG`
+$AWK "$prog" $AWKPROG
+
+echo "--Test 7--"
+prog=`$AWK ' /#TEST7#/, /#TEST8#/' $AWKPROG`
+$AWK "$prog" $AWKPROG $SCRIPT
+
+echo "--Test 8--"
+prog=`$AWK ' /#TEST8#/, /#TEST9#/' $AWKPROG`
+$AWK "$prog" $AWKPROG
+
+echo "--Test 9a--"
+prog=`$AWK ' /#TEST9#/, /#TEST10#/' $AWKPROG`
+$AWK "$prog" file/does/not/exist $AWKPROG
+echo "--Test 9b--"
+$AWK -vskip=1 "$prog" file/does/not/exist $AWKPROG
+
+echo "--Test 10--"
+prog=`$AWK ' /#TEST10#/, /#TEST11#/' $AWKPROG`
+$AWK "$prog" $AWKPROG $SCRIPT
+
+echo "--Test 11--"
+prog=`$AWK ' /#TEST11#/, /#TEST12#/' $AWKPROG`
+$AWK "$prog" $AWKPROG $SCRIPT
+
+echo "--Test 12--"
+prog=`$AWK ' /#TEST12#/, /#TEST13#/' $AWKPROG`
+$AWK "$prog" $AWKPROG $SCRIPT
+
+echo "--Test 13--"
+prog=`$AWK ' /#TEST13#/, /#TEST14#/' $AWKPROG`
+$AWK "$prog" $AWKPROG $SCRIPT
+
+echo "--Test 14--"
+prog=`$AWK ' /#TEST14#/, /#TEST15#/' $AWKPROG`
+$AWK "$prog" $AWKPROG $SCRIPT
+
+echo "--Test 15--"
+prog=`$AWK ' /#TEST15#/, /#TEST16#/' $AWKPROG`
+$AWK "$prog" $AWKPROG $SCRIPT
+
+echo "--Test 16--"
+prog=`$AWK ' /#TEST16#/, /#TEST17#/' $AWKPROG`
+$AWK "$prog" $AWKPROG $SCRIPT
+
diff --git a/gawk-5.0.1/test/binmode1.ok b/gawk-5.0.1/test/binmode1.ok
new file mode 100644
index 00000000000..00750edc07d
--- /dev/null
+++ b/gawk-5.0.1/test/binmode1.ok
@@ -0,0 +1 @@
+3
diff --git a/gawk-5.0.1/test/callparam.awk b/gawk-5.0.1/test/callparam.awk
new file mode 100644
index 00000000000..b925db019f3
--- /dev/null
+++ b/gawk-5.0.1/test/callparam.awk
@@ -0,0 +1,6 @@
+BEGIN { f() }
+
+function f(	a, b)
+{
+	a = b()
+}
diff --git a/gawk-5.0.1/test/callparam.ok b/gawk-5.0.1/test/callparam.ok
new file mode 100644
index 00000000000..00a027e8d86
--- /dev/null
+++ b/gawk-5.0.1/test/callparam.ok
@@ -0,0 +1,2 @@
+gawk: callparam.awk:5: error: attempt to use non-function `b' in function call
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/charasbytes.awk b/gawk-5.0.1/test/charasbytes.awk
new file mode 100644
index 00000000000..feb195c83fa
--- /dev/null
+++ b/gawk-5.0.1/test/charasbytes.awk
@@ -0,0 +1 @@
+{ print gensub(/\xE2\x80./, "ZZZ", "g", $0) }
diff --git a/gawk-5.0.1/test/charasbytes.in b/gawk-5.0.1/test/charasbytes.in
new file mode 100644
index 00000000000..4a8d4a1e93e
--- /dev/null
+++ b/gawk-5.0.1/test/charasbytes.in
@@ -0,0 +1 @@
+–
diff --git a/gawk-5.0.1/test/charasbytes.ok b/gawk-5.0.1/test/charasbytes.ok
new file mode 100644
index 00000000000..f60f2ab4ec1
--- /dev/null
+++ b/gawk-5.0.1/test/charasbytes.ok
@@ -0,0 +1,3 @@
+0000000 Z Z Z \n
+ 5a 5a 5a 0a
+0000004
diff --git a/gawk-5.0.1/test/checknegtime.awk b/gawk-5.0.1/test/checknegtime.awk
new file mode 100644
index 00000000000..06dfcae91f4
--- /dev/null
+++ b/gawk-5.0.1/test/checknegtime.awk
@@ -0,0 +1,22 @@
+NR == 1 {
+	# Tue Dec 15 07:00:00 GMT 1959
+	Weekday = $1
+	Month = $2
+	Day = $3
+	Time = $4
+	Timezone = $5
+	Year = $6
+}
+
+NR == 2 {
+	if (NF == 0)	# MinGW gives an empty line
+		exit 0
+
+	# Some BSDs give us UTC in the timezone
+	if ($1 == Weekday && $2 == Month && $3 == Day &&
+	    $4 == Time && $6 == Year)
+		exit 0
+
+	# Some other mismatch
+	exit 1
+}
diff --git a/gawk-5.0.1/test/childin.awk b/gawk-5.0.1/test/childin.awk
new file mode 100644
index 00000000000..041c6ec1487
--- /dev/null
+++ b/gawk-5.0.1/test/childin.awk
@@ -0,0 +1 @@
+BEGIN { "cat" | getline; print; close("cat") }
diff --git a/gawk-5.0.1/test/childin.in b/gawk-5.0.1/test/childin.in
new file mode 100644
index 00000000000..45b983be36b
--- /dev/null
+++ b/gawk-5.0.1/test/childin.in
@@ -0,0 +1 @@
+hi
diff --git a/gawk-5.0.1/test/childin.ok b/gawk-5.0.1/test/childin.ok
new file mode 100644
index 00000000000..45b983be36b
--- /dev/null
+++ b/gawk-5.0.1/test/childin.ok
@@ -0,0 +1 @@
+hi
diff --git a/gawk-5.0.1/test/clobber.awk b/gawk-5.0.1/test/clobber.awk
new file mode 100644
index 00000000000..6526de0588e
--- /dev/null
+++ b/gawk-5.0.1/test/clobber.awk
@@ -0,0 +1,98 @@
+BEGIN {
+	print "000800" > "seq"
+	close("seq")
+	ARGV[1] = "seq"
+	ARGC = 2
+}
+
+{ printf "%06d", $1 + 1 >"seq";
+  printf "%06d", $1 + 1 }
+# Date: Mon, 20 Jan 1997 15:14:06 -0600 (CST)
+# From: Dave Bodenstab <emory!synet.net!imdave>
+# To: bug-gnu-utils@prep.ai.mit.edu
+# Subject: GNU awk 3.0.2 core dump
+# Cc: arnold@gnu.ai.mit.edu
+# 
+# The following program produces a core file on my FreeBSD system:
+# 
+# bash$ echo 000800 >/tmp/seq
+# bash$ gawk '{ printf "%06d", $1 + 1 >"/tmp/seq";
+# 	      printf "%06d", $1 + 1 }' /tmp/seq                  
+# 
+# This fragment comes from mgetty+sendfax.
+# 
+# Here is the trace:
+# 
+# Script started on Mon Jan 20 15:09:04 1997
+# bash$ gawk --version
+# GNU Awk 3.0.2
+# Copyright (C) 1989, 1991-1996 Free Software Foundation.
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+# bash$ gdb gawk
+# GDB is free software and you are welcome to distribute copies of it
+#  under certain conditions; type "show copying" to see the conditions.
+# There is absolutely no warranty for GDB; type "show warranty" for details.
+# GDB 4.13 (i386-unknown-freebsd), 
+# Copyright 1994 Free Software Foundation, Inc...
+# (gdb) shell echo 000800 >/tmp/seq
+# (gdb) r '{ printf "%06d", $1 + 1 >"/tmp/seq"; printf "%06d", $1 + 1 }(gdb) r '{ printf "%06d", $1 + 1 >"/tmp/seq"; printf "%06d", $1 + 1 }' /tmp/seq
+# Starting program: /scratch/archive/src/cmd/gnuawk-3.0.2/gawk '{ printf "%06d", $1 + 1 >"/tmp/seq"; printf "%06d", $1 + 1 }' /tmp/seq
+# 
+# Program received signal SIGBUS, Bus error.
+# 0xd86f in def_parse_field (up_to=1, buf=0x37704, len=6, fs=0x3b240, rp=0x0, 
+#     set=0xce6c <set_field>, n=0x0) at field.c:391
+# 391		sav = *end;
+# (gdb) bt
+# #0  0xd86f in def_parse_field (up_to=1, buf=0x37704, len=6, fs=0x3b240, 
+#     rp=0x0, set=0xce6c <set_field>, n=0x0) at field.c:391
+# #1  0xddb1 in get_field (requested=1, assign=0x0) at field.c:669
+# #2  0xc25d in r_get_lhs (ptr=0x3b9b4, assign=0x0) at eval.c:1339
+# #3  0x9ab0 in r_tree_eval (tree=0x3b9b4, iscond=0) at eval.c:604
+# #4  0xa5f1 in r_tree_eval (tree=0x3b9fc, iscond=0) at eval.c:745
+# #5  0x4661 in format_tree (fmt_string=0x3e040 "%06d", n0=0, carg=0x3ba20)
+#     at builtin.c:620
+# #6  0x5beb in do_sprintf (tree=0x3b96c) at builtin.c:809
+# #7  0x5cd5 in do_printf (tree=0x3ba8c) at builtin.c:844
+# #8  0x9271 in interpret (tree=0x3ba8c) at eval.c:465
+# #9  0x8ca3 in interpret (tree=0x3bbd0) at eval.c:308
+# #10 0x8c34 in interpret (tree=0x3bc18) at eval.c:292
+# #11 0xf069 in do_input () at io.c:312
+# #12 0x12ba9 in main (argc=3, argv=0xefbfd538) at main.c:393
+# (gdb) l
+# 386			*buf += len;
+# 387			return nf;
+# 388		}
+# 389	
+# 390		/* before doing anything save the char at *end */
+# 391		sav = *end;
+# 392		/* because it will be destroyed now: */
+# 393	
+# 394		*end = ' ';	/* sentinel character */
+# 395		for (; nf < up_to; scan++) {
+# (gdb) print end
+# $1 = 0x804d006 <Error reading address 0x804d006: No such file or directory>
+# (gdb) print buf
+# $2 = (char **) 0x37704
+# (gdb) print *buf
+# $3 = 0x804d000 <Error reading address 0x804d000: No such file or directory>
+# (gdb) q
+# The program is running.  Quit anyway (and kill it)? (y or n) y
+# bash$ exit
+# 
+# Script done on Mon Jan 20 15:11:07 1997
+# 
+# Dave Bodenstab
+# imdave@synet.net
diff --git a/gawk-5.0.1/test/clobber.ok b/gawk-5.0.1/test/clobber.ok
new file mode 100644
index 00000000000..71057085a90
--- /dev/null
+++ b/gawk-5.0.1/test/clobber.ok
@@ -0,0 +1 @@
+000801
\ No newline at end of file
diff --git a/gawk-5.0.1/test/clos1way.awk b/gawk-5.0.1/test/clos1way.awk
new file mode 100644
index 00000000000..c9dab09affb
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way.awk
@@ -0,0 +1,21 @@
+BEGIN {
+	command = "sort"
+
+	n = split("abcdefghijklmnopqrstuvwxyz", a, "")
+	for (i = n; i > 0; i--) {
+#		print "printing", a[i] > "/dev/stderr"
+		print a[i] |& command
+	}
+
+	close(command, "to")
+
+#	print "starting read loop" > "/dev/stderr"
+	do {
+		if (line)
+			print "got", line
+#		stopme();
+	} while ((command |& getline line) > 0)
+
+#	print "doing final close" > "/dev/stderr"
+	close(command)
+}
diff --git a/gawk-5.0.1/test/clos1way.ok b/gawk-5.0.1/test/clos1way.ok
new file mode 100644
index 00000000000..09d732a62ad
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way.ok
@@ -0,0 +1,26 @@
+got a
+got b
+got c
+got d
+got e
+got f
+got g
+got h
+got i
+got j
+got k
+got l
+got m
+got n
+got o
+got p
+got q
+got r
+got s
+got t
+got u
+got v
+got w
+got x
+got y
+got z
diff --git a/gawk-5.0.1/test/clos1way2.awk b/gawk-5.0.1/test/clos1way2.awk
new file mode 100644
index 00000000000..c734c142fc8
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way2.awk
@@ -0,0 +1,7 @@
+{
+	# We use "&&" and not ";" so it works with Windows shells as well.
+	cmd = "cat - 1>&2 && sleep 2"
+	print |& cmd; close(cmd, "to")
+	fflush(cmd)
+	print |& cmd; print ERRNO
+}
diff --git a/gawk-5.0.1/test/clos1way2.in b/gawk-5.0.1/test/clos1way2.in
new file mode 100644
index 00000000000..9daeafb9864
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way2.in
@@ -0,0 +1 @@
+test
diff --git a/gawk-5.0.1/test/clos1way2.ok b/gawk-5.0.1/test/clos1way2.ok
new file mode 100644
index 00000000000..c13a79c3e1a
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way2.ok
@@ -0,0 +1,4 @@
+gawk: clos1way2.awk:5: (FILENAME=- FNR=1) warning: fflush: cannot flush: two-way pipe `cat - 1>&2 && sleep 2' has closed write end
+test
+gawk: clos1way2.awk:6: (FILENAME=- FNR=1) fatal: print: attempt to write to closed write end of two-way pipe
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/clos1way3.awk b/gawk-5.0.1/test/clos1way3.awk
new file mode 100644
index 00000000000..2c4a6f4f8ee
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way3.awk
@@ -0,0 +1,8 @@
+BEGIN {
+	# We use "&&" and not ";" so it works with Windows shells as well.
+	cmd = "cat - 1>&2 && sleep 2"
+	print "test1" |& cmd
+	close(cmd, "to")
+	print "test2" |& cmd
+	print ERRNO
+}
diff --git a/gawk-5.0.1/test/clos1way3.ok b/gawk-5.0.1/test/clos1way3.ok
new file mode 100644
index 00000000000..6677fdf01a1
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way3.ok
@@ -0,0 +1,3 @@
+test1
+gawk: clos1way3.awk:6: fatal: print: attempt to write to closed write end of two-way pipe
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/clos1way4.awk b/gawk-5.0.1/test/clos1way4.awk
new file mode 100644
index 00000000000..106e44673c6
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way4.awk
@@ -0,0 +1,8 @@
+BEGIN {
+	# We use "&&" and not ";" so it works with Windows shells as well.
+	cmd = "cat - 1>&2 && sleep 2"
+	printf "%s\n", "test1" |& cmd
+	close(cmd, "to")
+	printf "%s\n", "test2" |& cmd
+	print ERRNO
+}
diff --git a/gawk-5.0.1/test/clos1way4.ok b/gawk-5.0.1/test/clos1way4.ok
new file mode 100644
index 00000000000..132a4b954b2
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way4.ok
@@ -0,0 +1,3 @@
+test1
+gawk: clos1way4.awk:6: fatal: printf: attempt to write to closed write end of two-way pipe
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/clos1way5.awk b/gawk-5.0.1/test/clos1way5.awk
new file mode 100644
index 00000000000..0af1909393e
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way5.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	# We use "&&" and not ";" so it works with Windows shells as well.
+	cmd = "echo test1&& echo test2&& sleep 2"
+	cmd |& getline x
+	print x
+	close(cmd, "from")
+	cmd |& getline x
+	print x
+	print ERRNO
+}
diff --git a/gawk-5.0.1/test/clos1way5.ok b/gawk-5.0.1/test/clos1way5.ok
new file mode 100644
index 00000000000..5820598289f
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way5.ok
@@ -0,0 +1,3 @@
+test1
+gawk: clos1way5.awk:7: fatal: getline: attempt to read from closed read end of two-way pipe
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/clos1way6.awk b/gawk-5.0.1/test/clos1way6.awk
new file mode 100644
index 00000000000..f10c019315e
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way6.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	cmd = "cat - 1>&2; sleep 2"
+	PROCINFO[cmd, "NONFATAL"] = 1
+	print "test1" |& cmd; close(cmd, "to")
+	fflush(cmd)
+	print "test2" |& cmd; print gensub(/number/, "descriptor", 1, ERRNO)
+}
diff --git a/gawk-5.0.1/test/clos1way6.ok b/gawk-5.0.1/test/clos1way6.ok
new file mode 100644
index 00000000000..5768617d35b
--- /dev/null
+++ b/gawk-5.0.1/test/clos1way6.ok
@@ -0,0 +1,3 @@
+gawk: clos1way6.awk:5: warning: fflush: cannot flush: two-way pipe `cat - 1>&2; sleep 2' has closed write end
+test1
+Bad file descriptor
diff --git a/gawk-5.0.1/test/closebad.awk b/gawk-5.0.1/test/closebad.awk
new file mode 100644
index 00000000000..83133ae86af
--- /dev/null
+++ b/gawk-5.0.1/test/closebad.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	f = "/no/such/file/1"
+	print (getline junk < f)
+	print close(f)
+	f = "/no/such/file/2"
+	print close(f)
+}
diff --git a/gawk-5.0.1/test/closebad.ok b/gawk-5.0.1/test/closebad.ok
new file mode 100644
index 00000000000..64861d87dae
--- /dev/null
+++ b/gawk-5.0.1/test/closebad.ok
@@ -0,0 +1,3 @@
+-1
+-1
+-1
diff --git a/gawk-5.0.1/test/clsflnam.awk b/gawk-5.0.1/test/clsflnam.awk
new file mode 100644
index 00000000000..0ba601f04f6
--- /dev/null
+++ b/gawk-5.0.1/test/clsflnam.awk
@@ -0,0 +1,12 @@
+#! /usr/bin/awk -f
+BEGIN {
+  getline
+# print ("FILENAME =", FILENAME) > "/dev/stderr"
+  #Rewind the file
+  if (close(FILENAME)) {
+      print "Error `" ERRNO "' closing input file" > "/dev/stderr";
+      exit;   
+  }
+}
+{  print "Analysing ", $0 }
+
diff --git a/gawk-5.0.1/test/clsflnam.in b/gawk-5.0.1/test/clsflnam.in
new file mode 100644
index 00000000000..a92d664bc20
--- /dev/null
+++ b/gawk-5.0.1/test/clsflnam.in
@@ -0,0 +1,3 @@
+line 1
+line 2
+line 3
diff --git a/gawk-5.0.1/test/clsflnam.ok b/gawk-5.0.1/test/clsflnam.ok
new file mode 100644
index 00000000000..9addfc78be3
--- /dev/null
+++ b/gawk-5.0.1/test/clsflnam.ok
@@ -0,0 +1 @@
+Error `close of redirection that was never opened' closing input file
diff --git a/gawk-5.0.1/test/colonwarn.awk b/gawk-5.0.1/test/colonwarn.awk
new file mode 100644
index 00000000000..0b0650e0a54
--- /dev/null
+++ b/gawk-5.0.1/test/colonwarn.awk
@@ -0,0 +1,4 @@
+BEGIN { pattern = ARGV[1] + 0; delete ARGV }
+pattern == 1	{ sub(/[][:space:]]/,""); print }
+pattern == 2	{ sub(/[\][:space:]]/,""); print }
+pattern == 3	{ sub(/[^][:space:]]/,""); print }
diff --git a/gawk-5.0.1/test/colonwarn.in b/gawk-5.0.1/test/colonwarn.in
new file mode 100644
index 00000000000..d34368d7407
--- /dev/null
+++ b/gawk-5.0.1/test/colonwarn.in
@@ -0,0 +1 @@
+a]b
diff --git a/gawk-5.0.1/test/colonwarn.ok b/gawk-5.0.1/test/colonwarn.ok
new file mode 100644
index 00000000000..d084ee3dfca
--- /dev/null
+++ b/gawk-5.0.1/test/colonwarn.ok
@@ -0,0 +1,3 @@
+ab
+ab
+]b
diff --git a/gawk-5.0.1/test/compare.awk b/gawk-5.0.1/test/compare.awk
new file mode 100644
index 00000000000..39a88f317ad
--- /dev/null
+++ b/gawk-5.0.1/test/compare.awk
@@ -0,0 +1,13 @@
+BEGIN {
+	if (ARGV[1]) print 1
+	ARGV[1] = ""
+	if (ARGV[2]) print 2
+	ARGV[2] = ""
+	if ("0") print "zero"
+	if ("") print "null"
+	if (0) print 0
+}
+{
+	if ($0) print $0
+	if ($1) print $1
+}
diff --git a/gawk-5.0.1/test/compare.in b/gawk-5.0.1/test/compare.in
new file mode 100644
index 00000000000..1ab098bc454
--- /dev/null
+++ b/gawk-5.0.1/test/compare.in
@@ -0,0 +1,4 @@
+0
+1
+0 1
+
diff --git a/gawk-5.0.1/test/compare.ok b/gawk-5.0.1/test/compare.ok
new file mode 100644
index 00000000000..8241359bf0e
--- /dev/null
+++ b/gawk-5.0.1/test/compare.ok
@@ -0,0 +1,5 @@
+2
+zero
+1
+1
+0 1
diff --git a/gawk-5.0.1/test/compare2.awk b/gawk-5.0.1/test/compare2.awk
new file mode 100644
index 00000000000..f2c2786ec8a
--- /dev/null
+++ b/gawk-5.0.1/test/compare2.awk
@@ -0,0 +1,165 @@
+# From beebe@math.utah.edu  Thu Aug  2 15:35:07 2001
+# Received: from mail.actcom.co.il [192.114.47.13]
+# 	by localhost with POP3 (fetchmail-5.7.4)
+# 	for arnold@localhost (single-drop); Thu, 02 Aug 2001 15:35:07 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Thu Aug  2 16:02:36 2001)
+# X-From_: beebe@sunshine.math.utah.edu Thu Aug  2 15:41:13 2001
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.9.1a/actcom-0.2) id PAA01349 for <arobbins@actcom.co.il>;
+# 	Thu, 2 Aug 2001 15:41:06 +0300 (EET DST)  
+# 	(rfc931-sender: mail.actcom.co.il [192.114.47.13])
+# Received: from billohost.com (www.billohost.com [209.196.35.10])
+# 	by lmail.actcom.co.il (8.11.2/8.11.2) with ESMTP id f72Cf3I21032
+# 	for <arobbins@actcom.co.il>; Thu, 2 Aug 2001 15:41:05 +0300
+# Received: from fencepost.gnu.org (we-refuse-to-spy-on-our-users@fencepost.gnu.org [199.232.76.164])
+# 	by billohost.com (8.9.3/8.9.3) with ESMTP id IAA28585
+# 	for <arnold@skeeve.com>; Thu, 2 Aug 2001 08:34:38 -0400
+# Received: from sunshine.math.utah.edu ([128.110.198.2])
+# 	by fencepost.gnu.org with esmtp (Exim 3.22 #1 (Debian))
+# 	id 15SHjG-00036x-00
+# 	for <arnold@gnu.org>; Thu, 02 Aug 2001 08:37:30 -0400
+# Received: from suncore.math.utah.edu (IDENT:GsUbUdUYCtFLRE4HvnnvhN4JsjooYcfR@suncore0.math.utah.edu [128.110.198.5])
+# 	by sunshine.math.utah.edu (8.9.3/8.9.3) with ESMTP id GAA00190;
+# 	Thu, 2 Aug 2001 06:37:04 -0600 (MDT)
+# Received: (from beebe@localhost)
+# 	by suncore.math.utah.edu (8.9.3/8.9.3) id GAA20469;
+# 	Thu, 2 Aug 2001 06:37:03 -0600 (MDT)
+# Date: Thu, 2 Aug 2001 06:37:03 -0600 (MDT)
+# From: "Nelson H. F. Beebe" <beebe@math.utah.edu>
+# To: arnold@gnu.org
+# Cc: beebe@math.utah.edu
+# X-US-Mail: "Center for Scientific Computing, Department of Mathematics, 322
+#         INSCC, University of Utah, 155 S 1400 E RM 233, Salt Lake City, UT
+#         84112-0090, USA"
+# X-Telephone: +1 801 581 5254
+# X-FAX: +1 801 585 1640, +1 801 581 4148
+# X-URL: http://www.math.utah.edu/~beebe
+# Subject: awk implementations: a bug, or new dark corner?
+# Message-ID: <CMM.0.92.0.996755823.beebe@suncore.math.utah.edu>
+# Status: RO
+# 
+# Consider the following program:
+# 
+# % cat bug.awk
+BEGIN {
+    split("00/00/00",mdy,"/")
+    if ((mdy[1] == 0) && (mdy[2] == 0) && (mdy[3] == 0))
+    {
+        print "OK: zero strings compare equal to number zero"
+        exit(0)
+    }
+    else
+    {
+        print "ERROR: zero strings compare unequal to number zero"
+        exit(1)
+    }
+}
+# 
+# Here are the awk implementation versions (on Sun Solaris 2.7):
+# 
+# 	% awk -V
+# 	awk version 19990416
+# 
+# 	% mawk -W version
+# 	mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
+# 
+# 	% nawk -V
+# 	awk version 20001115
+# 
+# 	% gawk --version
+# 	GNU Awk 3.1.10
+# 	...
+# 
+# Here's what they say about the test program:
+# 
+# 	foreach f (awk mawk nawk gawk gawk-*)
+# 		echo ======== $f
+# 		$f -f ~/bug.awk
+# 	end
+# 
+# 	======== awk
+# 	OK: zero strings compare equal to number zero
+# 	======== mawk
+# 	OK: zero strings compare equal to number zero
+# 	======== nawk
+# 	OK: zero strings compare equal to number zero
+# 	======== gawk
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.0.0
+# 	OK: zero strings compare equal to number zero
+# 	======== gawk-3.0.1
+# 	OK: zero strings compare equal to number zero
+# 	======== gawk-3.0.3
+# 	OK: zero strings compare equal to number zero
+# 	======== gawk-3.0.4
+# 	OK: zero strings compare equal to number zero
+# 	======== gawk-3.0.5
+# 	OK: zero strings compare equal to number zero
+# 	======== gawk-3.0.6
+# 	OK: zero strings compare equal to number zero
+# 	======== gawk-3.0.60
+# 	OK: zero strings compare equal to number zero
+# 	======== gawk-3.0.90
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.0.91
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.0.92
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.0.93
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.0.94
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.0.95
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.0.96
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.0.97
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.1.0
+# 	ERROR: zero strings compare unequal to number zero
+# 	======== gawk-3.1.10
+# 	ERROR: zero strings compare unequal to number zero
+# 
+# Identical results were obtained on Apple Rhapsody, Apple Darwin,
+# Compaq/DEC Alpha OSF/1, Intel x86 GNU/Linux, SGI IRIX 6.5, DEC Alpha
+# GNU/Linux, and Sun SPARC GNU/Linux, so it definitely is not a C
+# compiler problem.
+# 
+# However, the gray awk book, p. 44, says:
+# 
+# 	In a comparison expression like:
+# 		x == y
+# 	if both operands have a numeric type, the comparison is numeric;
+# 	otherwise, any numeric operand is converted to a string and the
+# 	comparison is made on the string values.
+# 
+# and the new green gawk book, p. 95, says:
+# 
+# 	When comparing operands of mixed types, numeric operands are
+# 	converted to strings using the value of `CONVFMT'
+# 
+# This suggests that the OK response in bug.awk is wrong, and the ERROR
+# response is correct.  Only recent gawk releases do the right thing,
+# and it is awk, mawk, and nawk that have a bug.
+# 
+# If I change the test program from "00/00/00" to "0/0/0", all versions
+# tested produce the OK response.
+# 
+# Comments?
+# 
+# After reading the two book excerpts, I changed my code to read
+# 
+#     if (((0 + mdy[1]) == 0) && ((0 + mdy[2]) == 0) && ((0 + mdy[3]) == 0))
+# 
+# and output from all implementations now agrees.
+# 
+# -------------------------------------------------------------------------------
+# - Nelson H. F. Beebe                    Tel: +1 801 581 5254                  -
+# - Center for Scientific Computing       FAX: +1 801 585 1640, +1 801 581 4148 -
+# - University of Utah                    Internet e-mail: beebe@math.utah.edu  -
+# - Department of Mathematics, 322 INSCC      beebe@acm.org  beebe@computer.org -
+# - 155 S 1400 E RM 233                       beebe@ieee.org                    -
+# - Salt Lake City, UT 84112-0090, USA    URL: http://www.math.utah.edu/~beebe  -
+# -------------------------------------------------------------------------------
+# 
diff --git a/gawk-5.0.1/test/compare2.ok b/gawk-5.0.1/test/compare2.ok
new file mode 100644
index 00000000000..fd1043a34b5
--- /dev/null
+++ b/gawk-5.0.1/test/compare2.ok
@@ -0,0 +1 @@
+OK: zero strings compare equal to number zero
diff --git a/gawk-5.0.1/test/concat1.awk b/gawk-5.0.1/test/concat1.awk
new file mode 100644
index 00000000000..4ccb11794ff
--- /dev/null
+++ b/gawk-5.0.1/test/concat1.awk
@@ -0,0 +1,78 @@
+#From deep@cicada-semi.com  Wed Jan 23 13:15:52 2002
+#X-From_: deep@cicada-semi.com Wed Jan 23 01:24:54 2002
+#From: "Mandeep Chadha" <deep@cicada-semi.com>
+#To: <bug-gawk@gnu.org>
+#Subject: gawk version 3.1.0 will not print a ";"
+#Date: Tue, 22 Jan 2002 17:23:57 -0600
+#Message-ID: <NCBBLGONGLINHCDGFCPNOENHCOAA.deep@cicada-semi.com>
+#MIME-Version: 1.0
+#Content-Type: text/plain;
+#	charset="iso-8859-1"
+#Content-Transfer-Encoding: 7bit
+#X-Priority: 3 (Normal)
+#X-MSMail-Priority: Normal
+#X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0)
+#Importance: Normal
+#X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4807.1700
+#
+#
+#The file "tmp" contains the following lines:
+#
+#A
+#B
+#C
+#D
+#
+#and when I run the command:
+#
+#	gawk '{print "Input = "$_" ; "}' tmp
+{print "Input = "$_" ; "}
+#
+#I get the following output:
+#
+#Input = A
+#Input = B
+#Input = C
+#Input = D
+#
+#while I expect the following output:
+#
+#Input = A ;
+#Input = B ;
+#Input = C ;
+#Input = D ;
+#
+#Running gawk --version produces the following output:
+#
+#GNU Awk 3.1.0
+#Copyright (C) 1989, 1991-2001 Free Software Foundation.
+#
+#This program is free software; you can redistribute it and/or modify
+#it under the terms of the GNU General Public License as published by
+#the Free Software Foundation; either version 2 of the License, or
+#(at your option) any later version.
+#
+#This program is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#GNU General Public License for more details.
+#
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, write to the Free Software
+#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+#
+#I am running this on a i686 machine that is running RedHat 7.2 (out of the box).
+#
+#Thanks,
+#
+#Mandeep Chadha
+#
+#----------------------------------------
+#Mandeep Chadha
+#Cicada Semiconductor Corp.
+#811 Barton Springs Road, Suite 550
+#Austin, TX 78704
+#Ph:      (512) 327-3500 x111
+#E-mail:  deep@cicada-semi.com
+#URL:     http://www.cicada-semi.com
+#----------------------------------------
diff --git a/gawk-5.0.1/test/concat1.in b/gawk-5.0.1/test/concat1.in
new file mode 100644
index 00000000000..8422d40f127
--- /dev/null
+++ b/gawk-5.0.1/test/concat1.in
@@ -0,0 +1,4 @@
+A
+B
+C
+D
diff --git a/gawk-5.0.1/test/concat1.ok b/gawk-5.0.1/test/concat1.ok
new file mode 100644
index 00000000000..b0aad60e629
--- /dev/null
+++ b/gawk-5.0.1/test/concat1.ok
@@ -0,0 +1,4 @@
+Input = A ; 
+Input = B ; 
+Input = C ; 
+Input = D ; 
diff --git a/gawk-5.0.1/test/concat2.awk b/gawk-5.0.1/test/concat2.awk
new file mode 100644
index 00000000000..a94b29b581a
--- /dev/null
+++ b/gawk-5.0.1/test/concat2.awk
@@ -0,0 +1,8 @@
+function f(s, x) {
+	x = 1
+	s = 3
+	s = s x
+	print s
+}
+
+BEGIN { for (i = 1; i <=12; i++) f() }
diff --git a/gawk-5.0.1/test/concat2.ok b/gawk-5.0.1/test/concat2.ok
new file mode 100644
index 00000000000..b7b86e5c6dd
--- /dev/null
+++ b/gawk-5.0.1/test/concat2.ok
@@ -0,0 +1,12 @@
+31
+31
+31
+31
+31
+31
+31
+31
+31
+31
+31
+31
diff --git a/gawk-5.0.1/test/concat3.awk b/gawk-5.0.1/test/concat3.awk
new file mode 100644
index 00000000000..554c9a904b2
--- /dev/null
+++ b/gawk-5.0.1/test/concat3.awk
@@ -0,0 +1 @@
+BEGIN { a; a = a (b "c"); print a; print b }
diff --git a/gawk-5.0.1/test/concat3.ok b/gawk-5.0.1/test/concat3.ok
new file mode 100644
index 00000000000..880233128be
--- /dev/null
+++ b/gawk-5.0.1/test/concat3.ok
@@ -0,0 +1,2 @@
+c
+
diff --git a/gawk-5.0.1/test/concat4.awk b/gawk-5.0.1/test/concat4.awk
new file mode 100644
index 00000000000..91820d8ba6a
--- /dev/null
+++ b/gawk-5.0.1/test/concat4.awk
@@ -0,0 +1,9 @@
+{
+	a = $0
+	print a
+	print index(a,"b")
+	getline
+	a = a $0
+	print a
+	print index(a,"b")
+}
diff --git a/gawk-5.0.1/test/concat4.in b/gawk-5.0.1/test/concat4.in
new file mode 100644
index 00000000000..3bd1f0e2974
--- /dev/null
+++ b/gawk-5.0.1/test/concat4.in
@@ -0,0 +1,2 @@
+foo
+bar
diff --git a/gawk-5.0.1/test/concat4.ok b/gawk-5.0.1/test/concat4.ok
new file mode 100644
index 00000000000..38db1f81939
--- /dev/null
+++ b/gawk-5.0.1/test/concat4.ok
@@ -0,0 +1,4 @@
+foo
+0
+foobar
+4
diff --git a/gawk-5.0.1/test/concat5.awk b/gawk-5.0.1/test/concat5.awk
new file mode 100644
index 00000000000..6bfbb856c58
--- /dev/null
+++ b/gawk-5.0.1/test/concat5.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	OFMT = "%.8g"
+	x = 1
+	x += .1
+	x = (x "a")
+	print x
+}
diff --git a/gawk-5.0.1/test/concat5.ok b/gawk-5.0.1/test/concat5.ok
new file mode 100644
index 00000000000..eea55936d3a
--- /dev/null
+++ b/gawk-5.0.1/test/concat5.ok
@@ -0,0 +1 @@
+1.1a
diff --git a/gawk-5.0.1/test/convfmt.awk b/gawk-5.0.1/test/convfmt.awk
new file mode 100644
index 00000000000..90fd204b2fc
--- /dev/null
+++ b/gawk-5.0.1/test/convfmt.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	CONVFMT = "%2.2f"
+	a = 123.456
+	b = a ""                # give `a' string value also
+	printf "a = %s\n", a
+	CONVFMT = "%.6g"
+	printf "a = %s\n", a
+	a += 0                  # make `a' numeric only again
+	printf "a = %s\n", a    # use `a' as string
+}
diff --git a/gawk-5.0.1/test/convfmt.ok b/gawk-5.0.1/test/convfmt.ok
new file mode 100644
index 00000000000..a7b66f78575
--- /dev/null
+++ b/gawk-5.0.1/test/convfmt.ok
@@ -0,0 +1,3 @@
+a = 123.46
+a = 123.456
+a = 123.456
diff --git a/gawk-5.0.1/test/crlf.awk b/gawk-5.0.1/test/crlf.awk
new file mode 100644
index 00000000000..79be9eb6d06
--- /dev/null
+++ b/gawk-5.0.1/test/crlf.awk
@@ -0,0 +1,11 @@
+BEGIN {
+	print \
+		"hi there"
+	print "hello \
+world"
+	if ("foo" ~ /fo\
+o/)
+		print "matches"
+	else
+		print "does not match!"
+}
diff --git a/gawk-5.0.1/test/crlf.ok b/gawk-5.0.1/test/crlf.ok
new file mode 100644
index 00000000000..0ba071b5391
--- /dev/null
+++ b/gawk-5.0.1/test/crlf.ok
@@ -0,0 +1,3 @@
+hi there
+hello world
+matches
diff --git a/gawk-5.0.1/test/datanonl.awk b/gawk-5.0.1/test/datanonl.awk
new file mode 100644
index 00000000000..29e668e98f6
--- /dev/null
+++ b/gawk-5.0.1/test/datanonl.awk
@@ -0,0 +1,3 @@
+# example program from alex@bofh.torun.pl
+BEGIN { IGNORECASE=1 }
+/\w+@([[:alnum:]]+\.)+[[:alnum:]]+[[:blank:]]+/ {print $0}
diff --git a/gawk-5.0.1/test/datanonl.in b/gawk-5.0.1/test/datanonl.in
new file mode 100644
index 00000000000..5340d7bab38
--- /dev/null
+++ b/gawk-5.0.1/test/datanonl.in
@@ -0,0 +1 @@
+bleble@foo1.bh.pl       deny
\ No newline at end of file
diff --git a/gawk-5.0.1/test/datanonl.ok b/gawk-5.0.1/test/datanonl.ok
new file mode 100644
index 00000000000..7b0fcafcd34
--- /dev/null
+++ b/gawk-5.0.1/test/datanonl.ok
@@ -0,0 +1 @@
+bleble@foo1.bh.pl       deny
diff --git a/gawk-5.0.1/test/dbugeval.in b/gawk-5.0.1/test/dbugeval.in
new file mode 100644
index 00000000000..6a3c2459449
--- /dev/null
+++ b/gawk-5.0.1/test/dbugeval.in
@@ -0,0 +1,2 @@
+eval ""
+eval ""
diff --git a/gawk-5.0.1/test/dbugeval.ok b/gawk-5.0.1/test/dbugeval.ok
new file mode 100644
index 00000000000..284f2abb3ad
--- /dev/null
+++ b/gawk-5.0.1/test/dbugeval.ok
@@ -0,0 +1 @@
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/dbugeval2.awk b/gawk-5.0.1/test/dbugeval2.awk
new file mode 100644
index 00000000000..4997d1b41dc
--- /dev/null
+++ b/gawk-5.0.1/test/dbugeval2.awk
@@ -0,0 +1,4 @@
+BEGIN {
+	a = 2
+	b = 3
+}
diff --git a/gawk-5.0.1/test/dbugeval2.in b/gawk-5.0.1/test/dbugeval2.in
new file mode 100644
index 00000000000..165f71470ca
--- /dev/null
+++ b/gawk-5.0.1/test/dbugeval2.in
@@ -0,0 +1,3 @@
+b 3
+r
+eval "print and(a, 3)"
diff --git a/gawk-5.0.1/test/dbugeval2.ok b/gawk-5.0.1/test/dbugeval2.ok
new file mode 100644
index 00000000000..4d645269b84
--- /dev/null
+++ b/gawk-5.0.1/test/dbugeval2.ok
@@ -0,0 +1,7 @@
+Breakpoint 1 set at file `dbugeval2.awk', line 3
+Starting program: 
+Stopping in BEGIN ...
+Breakpoint 1, main() at `dbugeval2.awk':3
+3       	b = 3
+2
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/dbugeval3.awk b/gawk-5.0.1/test/dbugeval3.awk
new file mode 100644
index 00000000000..cc69752a945
--- /dev/null
+++ b/gawk-5.0.1/test/dbugeval3.awk
@@ -0,0 +1,4 @@
+
+function isnumeric(x) {
+    return (length(x) && x == x+0)
+}
diff --git a/gawk-5.0.1/test/dbugeval3.in b/gawk-5.0.1/test/dbugeval3.in
new file mode 100644
index 00000000000..5ea49024d8f
--- /dev/null
+++ b/gawk-5.0.1/test/dbugeval3.in
@@ -0,0 +1,2 @@
+eval "print isnumeric(\"hello\")"
+eval "print isnumeric(\"42.5\")"
diff --git a/gawk-5.0.1/test/dbugeval3.ok b/gawk-5.0.1/test/dbugeval3.ok
new file mode 100644
index 00000000000..22550206e71
--- /dev/null
+++ b/gawk-5.0.1/test/dbugeval3.ok
@@ -0,0 +1,3 @@
+0
+1
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/dbugtypedre1.awk b/gawk-5.0.1/test/dbugtypedre1.awk
new file mode 100644
index 00000000000..b8c0b6d70b3
--- /dev/null
+++ b/gawk-5.0.1/test/dbugtypedre1.awk
@@ -0,0 +1 @@
+@include "typeof1.awk"
diff --git a/gawk-5.0.1/test/dbugtypedre1.in b/gawk-5.0.1/test/dbugtypedre1.in
new file mode 100644
index 00000000000..00158c65ad8
--- /dev/null
+++ b/gawk-5.0.1/test/dbugtypedre1.in
@@ -0,0 +1,4 @@
+watch e
+run
+next
+p e
diff --git a/gawk-5.0.1/test/dbugtypedre1.ok b/gawk-5.0.1/test/dbugtypedre1.ok
new file mode 100644
index 00000000000..dffee0e8502
--- /dev/null
+++ b/gawk-5.0.1/test/dbugtypedre1.ok
@@ -0,0 +1,17 @@
+Watchpoint 1: e
+Starting program: 
+number
+untyped
+regexp
+string
+array number
+Stopping in BEGIN ...
+Watchpoint 1: e
+  Old value: untyped variable
+  New value: @/foo/
+main() at `typeof1.awk':7
+7       	e = @/foo/ ; print typeof(e)
+regexp
+8       	print typeof(@/bar/)
+e = @/foo/
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/dbugtypedre2.awk b/gawk-5.0.1/test/dbugtypedre2.awk
new file mode 100644
index 00000000000..a78de32b9f2
--- /dev/null
+++ b/gawk-5.0.1/test/dbugtypedre2.awk
@@ -0,0 +1 @@
+BEGIN { x = 0; x = @/[a-z]/; x = "" }
diff --git a/gawk-5.0.1/test/dbugtypedre2.in b/gawk-5.0.1/test/dbugtypedre2.in
new file mode 100644
index 00000000000..d01ce5a5cde
--- /dev/null
+++ b/gawk-5.0.1/test/dbugtypedre2.in
@@ -0,0 +1,4 @@
+w x 
+ r 
+ n 
+ n
diff --git a/gawk-5.0.1/test/dbugtypedre2.ok b/gawk-5.0.1/test/dbugtypedre2.ok
new file mode 100644
index 00000000000..9c04e1e7a1b
--- /dev/null
+++ b/gawk-5.0.1/test/dbugtypedre2.ok
@@ -0,0 +1,15 @@
+Watchpoint 1: x
+Starting program: 
+Stopping in BEGIN ...
+Watchpoint 1: x
+  Old value: untyped variable
+  New value: 0
+main() at `dbugtypedre2.awk':1
+1       BEGIN { x = 0; x = @/[a-z]/; x = "" }
+Watchpoint 1: x
+  Old value: 0
+  New value: @/[a-z]/
+main() at `dbugtypedre2.awk':1
+1       BEGIN { x = 0; x = @/[a-z]/; x = "" }
+Program exited normally with exit value: 0
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/defref.awk b/gawk-5.0.1/test/defref.awk
new file mode 100644
index 00000000000..b4e8f107821
--- /dev/null
+++ b/gawk-5.0.1/test/defref.awk
@@ -0,0 +1 @@
+BEGIN { foo() }
diff --git a/gawk-5.0.1/test/defref.ok b/gawk-5.0.1/test/defref.ok
new file mode 100644
index 00000000000..962b3fd0234
--- /dev/null
+++ b/gawk-5.0.1/test/defref.ok
@@ -0,0 +1,3 @@
+gawk: warning: function `foo' called but never defined
+gawk: defref.awk:1: fatal: function `foo' not defined
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/delargv.awk b/gawk-5.0.1/test/delargv.awk
new file mode 100644
index 00000000000..6c193a197ee
--- /dev/null
+++ b/gawk-5.0.1/test/delargv.awk
@@ -0,0 +1,12 @@
+BEGIN {
+	ARGV[1] = "/dev/null"
+	ARGV[2] = "/dev/null"
+	ARGV[3] = "/dev/null"
+	ARGC = 4
+	delete ARGV[2]
+}
+
+END {
+	for (i in ARGV)
+		printf("length of ARGV[%d] is %d\n", i, length(ARGV[i]))
+}
diff --git a/gawk-5.0.1/test/delargv.ok b/gawk-5.0.1/test/delargv.ok
new file mode 100644
index 00000000000..9cb53836792
--- /dev/null
+++ b/gawk-5.0.1/test/delargv.ok
@@ -0,0 +1,3 @@
+length of ARGV[0] is 4
+length of ARGV[1] is 9
+length of ARGV[3] is 9
diff --git a/gawk-5.0.1/test/delarpm2.awk b/gawk-5.0.1/test/delarpm2.awk
new file mode 100644
index 00000000000..ad0ed3dfa6d
--- /dev/null
+++ b/gawk-5.0.1/test/delarpm2.awk
@@ -0,0 +1,95 @@
+# From beebe@math.utah.edu  Sat May 17 21:31:27 2003
+# Return-Path: <beebe@math.utah.edu>
+# Received: from localhost (aahz [127.0.0.1])
+# 	by skeeve.com (8.12.5/8.12.5) with ESMTP id h4HIQmCw001380
+# 	for <arnold@localhost>; Sat, 17 May 2003 21:31:27 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Sat, 17 May 2003 21:31:27 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Sat May 17 21:34:07 2003)
+# X-From_: beebe@sunshine.math.utah.edu Fri May 16 20:38:45 2003
+# Received: from smtp1.actcom.net.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id h4GHcd226764 for <arobbins@actcom.co.il>;
+# 	Fri, 16 May 2003 20:38:40 +0300 (EET DST)  
+# 	(rfc931-sender: mail.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by smtp1.actcom.net.il (8.12.8/8.12.8) with ESMTP id h4GHgBc2023067
+# 	for <arobbins@actcom.co.il>; Fri, 16 May 2003 20:42:13 +0300
+# Received: from sunshine.math.utah.edu (sunshine.math.utah.edu [128.110.198.2])
+# 	by f7.net (8.11.7/8.11.6) with ESMTP id h4GHcbf09202
+# 	for <arnold@skeeve.com>; Fri, 16 May 2003 13:38:37 -0400
+# Received: from suncore.math.utah.edu (IDENT:r8KQWmkF4jVMLBhxpojXGNCAnBZB38ET@suncore.math.utah.edu [128.110.198.5])
+# 	by sunshine.math.utah.edu (8.9.3p2/8.9.3) with ESMTP id LAA09111;
+# 	Fri, 16 May 2003 11:38:34 -0600 (MDT)
+# Received: (from beebe@localhost)
+# 	by suncore.math.utah.edu (8.9.3p2/8.9.3) id LAA01743;
+# 	Fri, 16 May 2003 11:38:34 -0600 (MDT)
+# Date: Fri, 16 May 2003 11:38:34 -0600 (MDT)
+# From: "Nelson H. F. Beebe" <beebe@math.utah.edu>
+# To: "Arnold Robbins" <arnold@skeeve.com>
+# Cc: beebe@math.utah.edu
+# X-US-Mail: "Center for Scientific Computing, Department of Mathematics, 110
+#         LCB, University of Utah, 155 S 1400 E RM 233, Salt Lake City, UT
+#         84112-0090, USA"
+# X-Telephone: +1 801 581 5254
+# X-FAX: +1 801 585 1640, +1 801 581 4148
+# X-URL: http://www.math.utah.edu/~beebe
+# Subject: gawk-3.1.2[ab]: bug in delete
+# Message-ID: <CMM.0.92.0.1053106714.beebe@suncore.math.utah.edu>
+# 
+# I discovered yesterday that one of my tools got broken by the upgrade
+# to gawk-3.1.2a and gawk-3.1.2b.  For now, I've temporarily reset
+# /usr/local/bin/gawk on the Sun Solaris and Intel GNU/Linux systems
+# back to be gawk-3.1.2.
+# 
+# This morning, I isolated the problem to the following small test case:
+# 
+# 	% cat bug.awk
+	BEGIN {
+	    clear_array(table)
+	    foo(table)
+	    for (key in table)
+		print key, table[k]
+	    clear_array(table)
+	    exit(0)
+	}
+
+	function clear_array(array, key)
+	{
+	    for (key in array)
+		delete array[key]
+	}
+
+	function foo(a)
+	{
+	    a[1] = "one"
+	    a[2] = "two"
+	}
+# 
+# With nawk, mawk, and also gawk-3.1.2 or earlier, I get this:
+# 
+# 	% mawk -f bug.awk
+# 	1
+# 	2
+# 
+# However, with the two most recent gawk releases, I get:
+# 
+# 	% gawk-3.1.2b -f bug.awk
+# 	gawk-3.1.2b: bug.awk:12: fatal: delete: illegal use of variable `table' as
+# 	array
+# 
+# If the first clear_array() statement is commented out, it runs.
+# However, the problem is that in a large program, it may not be easy to
+# identify places where it is safe to invoke delete, so I believe the
+# old behavior is more desirable.
+# 
+# -------------------------------------------------------------------------------
+# - Nelson H. F. Beebe                    Tel: +1 801 581 5254                  -
+# - Center for Scientific Computing       FAX: +1 801 581 4148                  -
+# - University of Utah                    Internet e-mail: beebe@math.utah.edu  -
+# - Department of Mathematics, 110 LCB        beebe@acm.org  beebe@computer.org -
+# - 155 S 1400 E RM 233                       beebe@ieee.org                    -
+# - Salt Lake City, UT 84112-0090, USA    URL: http://www.math.utah.edu/~beebe  -
+# -------------------------------------------------------------------------------
+# 
diff --git a/gawk-5.0.1/test/delarpm2.ok b/gawk-5.0.1/test/delarpm2.ok
new file mode 100644
index 00000000000..bea5b8a4f24
--- /dev/null
+++ b/gawk-5.0.1/test/delarpm2.ok
@@ -0,0 +1,2 @@
+1 
+2 
diff --git a/gawk-5.0.1/test/delarprm.awk b/gawk-5.0.1/test/delarprm.awk
new file mode 100644
index 00000000000..d59de31f77c
--- /dev/null
+++ b/gawk-5.0.1/test/delarprm.awk
@@ -0,0 +1,50 @@
+# From dragon!unagi.cis.upenn.edu!sjanet Tue Mar 25 17:12:20 1997
+# Return-Path: <dragon!unagi.cis.upenn.edu!sjanet>
+# Received: by skeeve.atl.ga.us (/\==/\ Smail3.1.22.1 #22.1)
+# 	id <m0w9eS4-000GWyC@skeeve.atl.ga.us>; Tue, 25 Mar 97 17:12 EST
+# Received: by vecnet.com (DECUS UUCP /2.0/2.0/2.0/);
+#           Tue, 25 Mar 97 16:58:36 EDT
+# Received: from gnu-life.ai.mit.edu by antaries.vec.net (MX V4.2 VAX) with SMTP;
+#           Tue, 25 Mar 1997 16:58:26 EST
+# Received: from linc.cis.upenn.edu by gnu-life.ai.mit.edu (8.8.5/8.6.12GNU) with
+#           ESMTP id QAA24350 for <bug-gnu-utils@prep.ai.mit.edu>; Tue, 25 Mar
+#           1997 16:56:59 -0500 (EST)
+# Received: from unagi.cis.upenn.edu (UNAGI.CIS.UPENN.EDU [158.130.8.153]) by
+#           linc.cis.upenn.edu (8.8.5/8.8.5) with ESMTP id QAA09424; Tue, 25 Mar
+#           1997 16:56:54 -0500 (EST)
+# Received: (from sjanet@localhost) by unagi.cis.upenn.edu (8.8.5/8.8.5) id
+#           QAA03969; Tue, 25 Mar 1997 16:56:50 -0500 (EST)
+# Date: Tue, 25 Mar 1997 16:56:50 -0500 (EST)
+# From: Stan Janet <sjanet@unagi.cis.upenn.edu>
+# Message-ID: <199703252156.QAA03969@unagi.cis.upenn.edu>
+# To: bug-gnu-utils@prep.ai.mit.edu
+# CC: arnold@gnu.ai.mit.edu
+# Subject: GNU awk 3.0.2 bug: fatal error deleting local array inside function
+# Status: ORf
+# 
+# Version: GNU Awk 3.0.2
+# Platforms: SunOS 4.1.1 (compiled with Sun cc)
+#            IRIX 5.3 (compiled with SGI cc)
+# Problem: Deleting local array inside function causes fatal internal error (and
+# 	core dump. The error does not occur when the variable "x", unused in
+# 	the example, is removed or when the function is declared foo(x,p).
+# 	When the function is declared foo(p,x), adding a dummy line that uses
+# 	"x", e.g. "x=1" does not prevent the error. If "p" is not deleted,
+# 	there is no error. If "p[1]" is used to delete the lone element, there
+# 	is no error.
+# 
+# ==== The program x.gawk ====
+
+function foo(p,x) {
+	p[1]="bar"
+	delete p
+	return 0
+}
+
+BEGIN {
+	foo()
+}
+
+# ==== The output for "gawk -f x.gawk" (SunOS) ====
+# 
+# gawk: x.gawk:4: fatal error: internal error
diff --git a/gawk-5.0.1/test/delarprm.ok b/gawk-5.0.1/test/delarprm.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/delfunc.awk b/gawk-5.0.1/test/delfunc.awk
new file mode 100644
index 00000000000..365a76ba977
--- /dev/null
+++ b/gawk-5.0.1/test/delfunc.awk
@@ -0,0 +1,7 @@
+# from Stepan Kasal, 9 July 2003
+function f()
+{
+	delete f
+}
+
+BEGIN { f() }
diff --git a/gawk-5.0.1/test/delfunc.ok b/gawk-5.0.1/test/delfunc.ok
new file mode 100644
index 00000000000..29a7450dce8
--- /dev/null
+++ b/gawk-5.0.1/test/delfunc.ok
@@ -0,0 +1,3 @@
+gawk: delfunc.awk:4: error: function `f' called with space between name and `(',
+or used as a variable or an array
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/delsub.awk b/gawk-5.0.1/test/delsub.awk
new file mode 100644
index 00000000000..0c3ffb0e3ad
--- /dev/null
+++ b/gawk-5.0.1/test/delsub.awk
@@ -0,0 +1,2 @@
+function f(c, d, x) { delete c; x = d[0] }
+BEGIN { a[0][0] = 1; f(a, a[0]); print "still here" }
diff --git a/gawk-5.0.1/test/delsub.ok b/gawk-5.0.1/test/delsub.ok
new file mode 100644
index 00000000000..ae3eb5bbaa2
--- /dev/null
+++ b/gawk-5.0.1/test/delsub.ok
@@ -0,0 +1 @@
+still here
diff --git a/gawk-5.0.1/test/devfd.in1 b/gawk-5.0.1/test/devfd.in1
new file mode 100644
index 00000000000..0e50e690481
--- /dev/null
+++ b/gawk-5.0.1/test/devfd.in1
@@ -0,0 +1,20 @@
+this is file f1, line 1
+this is file f1, line 2
+this is file f1, line 3
+this is file f1, line 4
+this is file f1, line 5
+this is file f1, line 6
+this is file f1, line 7
+this is file f1, line 8
+this is file f1, line 9
+this is file f1, line 10
+this is file f1, line 11
+this is file f1, line 12
+this is file f1, line 13
+this is file f1, line 14
+this is file f1, line 15
+this is file f1, line 16
+this is file f1, line 17
+this is file f1, line 18
+this is file f1, line 19
+this is file f1, line 20
diff --git a/gawk-5.0.1/test/devfd.in2 b/gawk-5.0.1/test/devfd.in2
new file mode 100644
index 00000000000..d3299a9d3ad
--- /dev/null
+++ b/gawk-5.0.1/test/devfd.in2
@@ -0,0 +1,20 @@
+this is file f2, line 1
+this is file f2, line 2
+this is file f2, line 3
+this is file f2, line 4
+this is file f2, line 5
+this is file f2, line 6
+this is file f2, line 7
+this is file f2, line 8
+this is file f2, line 9
+this is file f2, line 10
+this is file f2, line 11
+this is file f2, line 12
+this is file f2, line 13
+this is file f2, line 14
+this is file f2, line 15
+this is file f2, line 16
+this is file f2, line 17
+this is file f2, line 18
+this is file f2, line 19
+this is file f2, line 20
diff --git a/gawk-5.0.1/test/devfd.in4 b/gawk-5.0.1/test/devfd.in4
new file mode 100644
index 00000000000..57da1f80d9a
--- /dev/null
+++ b/gawk-5.0.1/test/devfd.in4
@@ -0,0 +1 @@
+file on fd 4
diff --git a/gawk-5.0.1/test/devfd.in5 b/gawk-5.0.1/test/devfd.in5
new file mode 100644
index 00000000000..4469cb4d4c5
--- /dev/null
+++ b/gawk-5.0.1/test/devfd.in5
@@ -0,0 +1 @@
+file on fd 5
diff --git a/gawk-5.0.1/test/devfd.ok b/gawk-5.0.1/test/devfd.ok
new file mode 100644
index 00000000000..14f8f2e57c2
--- /dev/null
+++ b/gawk-5.0.1/test/devfd.ok
@@ -0,0 +1,2 @@
+file on fd 4
+file on fd 5
diff --git a/gawk-5.0.1/test/devfd1.awk b/gawk-5.0.1/test/devfd1.awk
new file mode 100644
index 00000000000..6795704d62a
--- /dev/null
+++ b/gawk-5.0.1/test/devfd1.awk
@@ -0,0 +1,11 @@
+BEGIN {
+	while (1) {
+		if ((getline l1 < "/dev/fd/4") <= 0)
+			break
+		print l1
+
+		if ((getline l2 < "/dev/fd/5") <= 0)
+			break
+		print l2
+	}
+}
diff --git a/gawk-5.0.1/test/devfd1.ok b/gawk-5.0.1/test/devfd1.ok
new file mode 100644
index 00000000000..359d7d342c5
--- /dev/null
+++ b/gawk-5.0.1/test/devfd1.ok
@@ -0,0 +1,40 @@
+this is file f1, line 1
+this is file f2, line 1
+this is file f1, line 2
+this is file f2, line 2
+this is file f1, line 3
+this is file f2, line 3
+this is file f1, line 4
+this is file f2, line 4
+this is file f1, line 5
+this is file f2, line 5
+this is file f1, line 6
+this is file f2, line 6
+this is file f1, line 7
+this is file f2, line 7
+this is file f1, line 8
+this is file f2, line 8
+this is file f1, line 9
+this is file f2, line 9
+this is file f1, line 10
+this is file f2, line 10
+this is file f1, line 11
+this is file f2, line 11
+this is file f1, line 12
+this is file f2, line 12
+this is file f1, line 13
+this is file f2, line 13
+this is file f1, line 14
+this is file f2, line 14
+this is file f1, line 15
+this is file f2, line 15
+this is file f1, line 16
+this is file f2, line 16
+this is file f1, line 17
+this is file f2, line 17
+this is file f1, line 18
+this is file f2, line 18
+this is file f1, line 19
+this is file f2, line 19
+this is file f1, line 20
+this is file f2, line 20
diff --git a/gawk-5.0.1/test/devfd2.ok b/gawk-5.0.1/test/devfd2.ok
new file mode 100644
index 00000000000..be928c1b729
--- /dev/null
+++ b/gawk-5.0.1/test/devfd2.ok
@@ -0,0 +1,40 @@
+this is file f1, line 1
+this is file f1, line 2
+this is file f1, line 3
+this is file f1, line 4
+this is file f1, line 5
+this is file f1, line 6
+this is file f1, line 7
+this is file f1, line 8
+this is file f1, line 9
+this is file f1, line 10
+this is file f1, line 11
+this is file f1, line 12
+this is file f1, line 13
+this is file f1, line 14
+this is file f1, line 15
+this is file f1, line 16
+this is file f1, line 17
+this is file f1, line 18
+this is file f1, line 19
+this is file f1, line 20
+this is file f2, line 1
+this is file f2, line 2
+this is file f2, line 3
+this is file f2, line 4
+this is file f2, line 5
+this is file f2, line 6
+this is file f2, line 7
+this is file f2, line 8
+this is file f2, line 9
+this is file f2, line 10
+this is file f2, line 11
+this is file f2, line 12
+this is file f2, line 13
+this is file f2, line 14
+this is file f2, line 15
+this is file f2, line 16
+this is file f2, line 17
+this is file f2, line 18
+this is file f2, line 19
+this is file f2, line 20
diff --git a/gawk-5.0.1/test/dfacheck1.awk b/gawk-5.0.1/test/dfacheck1.awk
new file mode 100644
index 00000000000..e7c812d149f
--- /dev/null
+++ b/gawk-5.0.1/test/dfacheck1.awk
@@ -0,0 +1 @@
+/.\<x/
diff --git a/gawk-5.0.1/test/dfacheck1.in b/gawk-5.0.1/test/dfacheck1.in
new file mode 100644
index 00000000000..b85da3c9c75
--- /dev/null
+++ b/gawk-5.0.1/test/dfacheck1.in
@@ -0,0 +1 @@
+123-x
diff --git a/gawk-5.0.1/test/dfacheck1.ok b/gawk-5.0.1/test/dfacheck1.ok
new file mode 100644
index 00000000000..b85da3c9c75
--- /dev/null
+++ b/gawk-5.0.1/test/dfacheck1.ok
@@ -0,0 +1 @@
+123-x
diff --git a/gawk-5.0.1/test/dfamb1.awk b/gawk-5.0.1/test/dfamb1.awk
new file mode 100644
index 00000000000..7647adf51bc
--- /dev/null
+++ b/gawk-5.0.1/test/dfamb1.awk
@@ -0,0 +1,4 @@
+# The first of these used to core dump gawk. As of 7/2013 it's fixed.
+# This file is to make sure that remains true.
+{match($0, /(([^ \?.]*\?pos=ad |([^ \?.]*\?pos=(jj|va) )地\?pos=dev ){0,2})/ , arr)}  { if(arr[0]) print arr[1], arr[4], $6}
+{match($0, /(([^ \?.]*\?pos=ad |([^ \?.]*\?pos=(jj|va) )[地]\?pos=dev ){0,2})/ , arr)}  { if(arr[0]) print arr[1], arr[4], $6} 
diff --git a/gawk-5.0.1/test/dfamb1.in b/gawk-5.0.1/test/dfamb1.in
new file mode 100644
index 00000000000..8347590fbe9
--- /dev/null
+++ b/gawk-5.0.1/test/dfamb1.in
@@ -0,0 +1 @@
+很?pos=ad 宽广?pos=va ， 更?pos=ad 是?pos=vc1
diff --git a/gawk-5.0.1/test/dfamb1.ok b/gawk-5.0.1/test/dfamb1.ok
new file mode 100644
index 00000000000..ad443a2383b
--- /dev/null
+++ b/gawk-5.0.1/test/dfamb1.ok
@@ -0,0 +1,2 @@
+很?pos=ad   
+很?pos=ad   
diff --git a/gawk-5.0.1/test/dfastress.awk b/gawk-5.0.1/test/dfastress.awk
new file mode 100644
index 00000000000..40dd3ee70bf
--- /dev/null
+++ b/gawk-5.0.1/test/dfastress.awk
@@ -0,0 +1 @@
+BEGIN { print "a" ~ /(^| )*(a|b)*(c|d)( |$)/ }
diff --git a/gawk-5.0.1/test/dfastress.ok b/gawk-5.0.1/test/dfastress.ok
new file mode 100644
index 00000000000..573541ac970
--- /dev/null
+++ b/gawk-5.0.1/test/dfastress.ok
@@ -0,0 +1 @@
+0
diff --git a/gawk-5.0.1/test/double1.awk b/gawk-5.0.1/test/double1.awk
new file mode 100644
index 00000000000..70a6fb65f5a
--- /dev/null
+++ b/gawk-5.0.1/test/double1.awk
@@ -0,0 +1,4 @@
+BEGIN {
+	print 9223372036854775808
+	printf("%d\n", 9223372036854775808)
+}
diff --git a/gawk-5.0.1/test/double1.ok b/gawk-5.0.1/test/double1.ok
new file mode 100644
index 00000000000..e07477e1747
--- /dev/null
+++ b/gawk-5.0.1/test/double1.ok
@@ -0,0 +1,2 @@
+9223372036854775808
+9223372036854775808
diff --git a/gawk-5.0.1/test/double2.awk b/gawk-5.0.1/test/double2.awk
new file mode 100644
index 00000000000..e826eecaea3
--- /dev/null
+++ b/gawk-5.0.1/test/double2.awk
@@ -0,0 +1,46 @@
+# Date: Mon, 19 Dec 2005 18:14:13 -0800
+# From: David Ellsworth <ellswort@nas.nasa.gov>
+# Subject: Re: gawk number to string bug
+# To: eggert@CS.UCLA.EDU, eliz@gnu.org
+# Cc: arnold@skeeve.com, aschorr@telemetry-investments.com,
+#         bug-gnu-utils@gnu.org, ellswort@nas.nasa.gov
+# Message-id: <200512200214.jBK2EDuu020216@ece03.nas.nasa.gov>
+# 
+# Since you are taking my bug report seriously (which is really great),
+# let me add some more fuel to the fire.  Consider this program:
+# 
+# BEGIN { x=2**60; for(i=60;i<=65;i++) { printf "2^%d= %s %d %g\n",i,x,x,x; x*=2}}
+# 
+# which prints out powers of two around 2^63.  On an Opteron (as well as
+# an Itanium), you get
+# 
+# 2^60= 1152921504606846976 1152921504606846976 1.15292e+18
+# 2^61= 2305843009213693952 2305843009213693952 2.30584e+18
+# 2^62= 4611686018427387904 4611686018427387904 4.61169e+18
+# 2^63= -9223372036854775808 9223372036854775808 9.22337e+18
+# 2^64= 1.84467e+19 0 1.84467e+19
+# 2^65= 3.68935e+19 3.68935e+19 3.68935e+19
+# 
+# On a Xeon, you get
+# 
+# 2^60= 1.15292e+18 1152921504606846976 1.15292e+18
+# 2^61= 2.30584e+18 2305843009213693952 2.30584e+18
+# 2^62= 4.61169e+18 4611686018427387904 4.61169e+18
+# 2^63= 9.22337e+18 9223372036854775808 9.22337e+18
+# 2^64= 1.84467e+19 0 1.84467e+19
+# 2^65= 3.68935e+19 3.68935e+19 3.68935e+19
+# 
+# The 2^64 value for %d is probably also a bug since the outputs
+# for 2^63 and 2^65 are reasonable.
+# 
+# - David
+# 
+
+BEGIN {
+	x = 2 ^ 60
+#	for (i = 60; i <= 65; i++) {
+	for (i = 60; i <= 63; i++) {
+		printf "2^%d= %s %d %g %o\n", i, x, x, x, x
+		x *= 2
+	}
+}
diff --git a/gawk-5.0.1/test/double2.ok b/gawk-5.0.1/test/double2.ok
new file mode 100644
index 00000000000..f7224e2a947
--- /dev/null
+++ b/gawk-5.0.1/test/double2.ok
@@ -0,0 +1,4 @@
+2^60= 1152921504606846976 1152921504606846976 1.15292e+18 100000000000000000000
+2^61= 2305843009213693952 2305843009213693952 2.30584e+18 200000000000000000000
+2^62= 4611686018427387904 4611686018427387904 4.61169e+18 400000000000000000000
+2^63= 9223372036854775808 9223372036854775808 9.22337e+18 1000000000000000000000
diff --git a/gawk-5.0.1/test/dtdgport.awk b/gawk-5.0.1/test/dtdgport.awk
new file mode 100644
index 00000000000..42b9545bd71
--- /dev/null
+++ b/gawk-5.0.1/test/dtdgport.awk
@@ -0,0 +1,325 @@
+# dtdgport.awk
+# Reads an XML document from standard input and
+# prints a DTD for this document to standard output.
+# http://saxon.sourceforge.net/dtdgen.html
+# JK 2004-10-09
+# JK 2006-03-05
+# JK 2007-08-05 Converted for portability from the original dtd_generator.awk
+
+# The program makes an internal list of all the elements
+# and attributes that appear in your document, noting how
+# they are nested, and noting which elements contain
+# character data.
+
+BEGIN {
+  while (getXMLEVENT(ARGV[1])) {
+    # Remember each element.
+    if ( XMLEVENT == "STARTELEM" ) {
+      # Remember the parent names of each child node.
+      name[XMLDEPTH] = XMLSTARTELEM
+      if (XMLDEPTH>1)
+        child[name[XMLDEPTH-1], XMLSTARTELEM] ++
+      # Count how often the element occurs.
+      elem[XMLSTARTELEM] ++
+      # Remember all the attributes with the element.
+      for (a in XMLATTR)
+        attr[XMLSTARTELEM,a] ++
+    }
+  }
+}
+
+END { print_elem(1, name[1]) }   # name[1] is the root
+
+# Print one element (including sub-elements) but only once.
+function print_elem(depth, element,   c, atn, chl, n, i, myChildren) {
+  if (already_printed[element]++)
+    return 
+  indent=sprintf("%*s", 2*depth-2, "")
+  myChildren=""
+  for (c in child) {
+    split(c, chl, SUBSEP)
+    if (element == chl[1]) {
+      if (myChildren=="")
+        myChildren = chl[2]
+      else
+        myChildren = myChildren " | " chl[2]
+    }
+  }
+  # If an element has no child nodes, declare it as such.
+  if (myChildren=="")
+    print indent "<!ELEMENT", element , "( #PCDATA ) >"
+  else
+    print indent "<!ELEMENT", element , "(", myChildren, ")* >"
+  # After the element name itself, list its attributes.
+  for (a in attr) {
+    split(a, atn, SUBSEP)
+    # Treat only those attributes that belong to the current element.
+    if (element == atn[1]) {
+      # If an attribute occured each time with its element, notice this. 
+      if (attr[element, atn[2]] == elem[element])
+        print indent "<!ATTLIST", element, atn[2], "CDATA #REQUIRED>"
+      else
+        print indent "<!ATTLIST", element, atn[2], "CDATA #IMPLIED>"
+    }
+  }
+  # Now go through the child nodes of this elements and print them.
+  gsub(/[\|]/, " ", myChildren)
+  n=split(myChildren, chl)
+  for(i=1; i<=n; i++) {
+    print_elem(depth+1, chl[i])
+    split(myChildren, chl)
+  }
+}
+
+##
+# getXMLEVENT( file ): # read next xml-data into XMLEVENT,XMLNAME,XMLATTR
+#                      # referenced entities are not resolved
+# Parameters:
+#   file       -- path to xml file
+# External variables:
+#   XMLEVENT   -- type of item read, e.g. "STARTELEM"(tag), "ENDELEM"(end tag),
+#                 "COMMENT"(comment), "CHARDATA"(data)
+#   XMLNAME    -- value of item, e.g. tagname if type is "STARTELEM" or "ENDELEM"
+#   XMLATTR    -- Map of attributes, only set if XMLEVENT=="STARTELEM"
+#   XMLPATH    -- Path to current tag, e.g. /TopLevelTag/SubTag1/SubTag2
+#   XMLROW     -- current line number in input file
+#   XMLERROR   -- error text, set on parse error
+# Returns:
+#    1         on successful read: XMLEVENT, XMLNAME, XMLATTR are set accordingly
+#    ""        at end of file or parse error, XMLERROR is set on error
+# Private Data:
+#   _XMLIO     -- buffer, XMLROW, XMLPATH for open files
+##
+
+function getXMLEVENT( file            ,end,p,q,tag,att,accu,mline,mode,S0,ex,dtd) {
+    XMLEVENT=XMLNAME=XMLERROR=XMLSTARTELEM=XMLENDELEM = ""
+    split("", XMLATTR)
+    S0    = _XMLIO[file,"S0"]
+    XMLROW  = _XMLIO[file,"line"];
+    XMLPATH = _XMLIO[file,"path"];
+    XMLDEPTH=_XMLIO[file,"depth"]+0;
+    dtd   = _XMLIO[file,"dtd"];
+    while (!XMLEVENT) {
+        if (S0 == "") {
+            if (1 != (getline S0 < file))
+                break;
+             XMLROW ++;
+             S0 = S0 RS;
+        }
+        if (mode == "") {
+            mline = XMLROW
+            accu=""
+            p = substr(S0,1,1)
+            if (p != "<" && !(dtd && p=="]"))
+                mode="CHARDATA"
+            else if (p == "]") {
+                S0 = substr(S0,2)
+                mode="ENDDOCT"
+                end=">"
+                dtd=0
+            } else if ( substr(S0,1,4) == "<!--" ) {
+                S0=substr(S0,5)
+                mode="COMMENT"
+                end="-->"
+            } else if ( substr(S0,1,9) == "<!DOCTYPE" ) {
+                S0 = substr(S0,10)
+                mode = "STARTDOCT"
+                end  = ">"
+            } else if (substr(S0,1,9) == "<![CDATA[" ) {
+                S0 = substr(S0,10)
+                mode = "CDA"
+                end = "]]>"
+            } else if ( substr(S0,1,2) == "<!" ) {
+                S0 = substr(S0,3)
+                mode = "DEC"
+                end = ">"
+            } else if (substr(S0,1,2) == "<?") {
+                S0 = substr(S0,3)
+                mode = "PROCINST"
+                end = "?>"
+            } else if ( substr(S0,1,2)=="</" ) {
+                S0 = substr(S0,3)
+                mode = "ENDELEM"
+                end = ">";
+                tag = S0
+                sub(/[ \n\r\t>].*$/,"",tag)
+                S0 = substr(S0,length(tag)+1)
+                ex = XMLPATH
+                sub(/\/[^\/]*$/,"",XMLPATH)
+                ex = substr(ex, length(XMLPATH)+2)
+                if (tag != ex) {
+                    XMLERROR = "unexpected close tag <" ex ">..</" tag ">"
+                    break
+                }
+            } else {
+                S0 = substr(S0,2)
+                mode = "STARTELEM"
+                tag = S0
+                sub(/[ \n\r\t\/>].*$/,"",tag)
+                S0 = substr(S0, length(tag)+1)
+                if (tag !~ /^[A-Za-z:_][0-9A-Za-z:_.-]*$/ ) { # /^[[:alpha:]:_][[:alnum:]:_.-]*$/
+                    XMLERROR = "invalid tag name '" tag "'"
+                    break
+                }
+                XMLPATH = XMLPATH "/" tag;
+            }
+        } else if (mode == "CHARDATA") {                            # terminated by "<" or EOF
+            p = index(S0, "<")
+            if (dtd && (q=index(S0,"]")) && (!p || q<p) )
+                p = q
+            if (p) {
+                XMLEVENT = "CHARDATA"
+                XMLNAME = accu unescapeXML(substr(S0, 1, p-1))
+                S0 = substr(S0, p)
+                mode = ""
+            } else {
+                accu = accu unescapeXML(S0)
+                S0 = ""
+            }
+        } else if ( mode == "STARTELEM" ) {
+            sub(/^[ \n\r\t]*/,"",S0)
+            if (S0 == "") 
+                continue
+            if (substr(S0, 1, 2) == "/>" ) {
+                S0 = substr(S0, 3)
+                mode = ""
+                XMLEVENT = "STARTELEM"
+                XMLNAME = XMLSTARTELEM = tag
+                XMLDEPTH ++
+                S0 = "</" tag ">" S0
+            } else if (substr(S0, 1, 1) == ">" ) {
+                S0 = substr(S0, 2)
+                mode = ""
+                XMLEVENT = "STARTELEM"
+                XMLNAME = XMLSTARTELEM = tag
+                XMLDEPTH ++
+            } else {
+                att = S0
+                sub(/[= \n\r\t\/>].*$/,"",att)
+                S0 = substr(S0, length(att) + 1)
+                mode = "ATTR"
+                if (att !~ /^[A-Za-z:_][0-9A-Za-z:_.-]*$/ ) { # /^[[:alpha:]:_][[:alnum:]:_.-]*$/
+                    XMLERROR = "invalid attribute name '" att "'"
+                    break
+                }
+            }
+        } else if (mode == "ATTR") {
+            sub(/^[ \n\r\t]*/, "", S0)
+            if (S0 == "") 
+                continue
+            if (substr(S0,1,1) == "=" ) {
+                S0 = substr(S0,2)
+                mode = "EQ"
+            } else {
+                XMLATTR[att] = att
+                mode = "STARTELEM"
+            }
+        } else if (mode == "EQ") {
+            sub(/^[ \n\r\t]*/,"",S0)
+            if (S0 == "") 
+              continue
+            end = substr(S0,1,1)
+            if (end == "\"" || end == "'") {
+                S0 = substr(S0,2)
+                accu = ""
+                mode = "VALUE"
+            } else {
+                accu = S0
+                sub(/[ \n\r\t\/>].*$/,"", accu)
+                S0 = substr(S0, length(accu)+1)
+                XMLATTR[att] = unescapeXML(accu)
+                mode = "STARTELEM"
+            } 
+        } else if (mode == "VALUE") {                          # terminated by end
+            if (p = index(S0, end)) {
+                XMLATTR[att] = accu unescapeXML(substr(S0,1,p-1))
+                S0 = substr(S0, p+length(end))
+                mode = "STARTELEM"
+            } else {
+                accu = accu unescapeXML(S0)
+                S0=""
+            }
+        } else if (mode == "STARTDOCT") {                      # terminated by "[" or ">"
+            if ((q = index(S0, "[")) && (!(p = index(S0,end)) || q<p )) {
+                XMLEVENT = mode
+                XMLNAME = accu substr(S0, 1, q-1)
+                S0 = substr(S0, q+1)
+                mode = ""
+                dtd = 1
+            } else if (p = index(S0,end)) {
+                XMLEVENT = mode
+                XMLNAME = accu substr(S0, 1, p-1)
+                S0 = "]" substr(S0, p)
+                mode = ""
+                dtd = 1
+            } else {
+                accu = accu S0
+                S0 = ""
+            }
+        } else if (p = index(S0,end)) {  # terminated by end
+            XMLEVENT = mode
+            XMLNAME = XMLENDELEM = ( mode=="ENDELEM" ? tag : accu substr(S0,1,p-1))
+            if (mode=="ENDELEM") XMLDEPTH --
+            S0 = substr(S0, p+length(end))
+            mode = ""
+        } else {
+            accu = accu S0
+            S0 = ""
+        }
+    }
+    _XMLIO[file, "S0"]   = S0;
+    _XMLIO[file, "line"] = XMLROW;
+    _XMLIO[file, "path"] = XMLPATH; 
+    _XMLIO[file, "depth"] = XMLDEPTH; 
+    _XMLIO[file, "dtd"]  = dtd;
+    if (mode == "CHARDATA") {
+        mode = ""
+        if (accu != "")
+            XMLEVENT = "CHARDATA"
+        XMLNAME = ""
+        $0 = accu
+    }
+    if (XMLEVENT) {
+        if (XMLEVENT == "STARTELEM") {
+            # Copy attributes into $0.
+            NF=0
+            for (ex in XMLATTR) {
+                NF ++
+                $NF = ex
+            }
+        }
+        return 1
+    }
+    close(file);
+    delete _XMLIO[file, "S0"];
+    delete _XMLIO[file, "line"];
+    delete _XMLIO[file, "path"]; 
+    delete _XMLIO[file, "depth"]; 
+    delete _XMLIO[file, "dtd"];
+    if (XMLERROR)
+        XMLERROR = file ":" XMLROW": " XMLERROR 
+    else if (mode) XMLERROR=file ":" mline ": " "unterminated " mode
+    else if (XMLPATH) XMLERROR=file ":" XMLROW": "  "unclosed tag(s) " XMLPATH 
+} # func. getXMLEVENT
+
+# unescape data and attribute values, used by getXMLEVENT
+function unescapeXML(text) {
+    gsub( "&apos;", "'",  text )
+    gsub( "&quot;", "\"", text )
+    gsub( "&gt;",   ">",  text )
+    gsub( "&lt;",   "<",  text )
+    gsub( "&amp;",  "\\&",  text)
+    return text
+}
+
+# close xml file
+function closeXMLEVENT(file) {
+    close(file);
+    delete _XMLIO[file,"S0"]
+    delete _XMLIO[file,"line"]
+    delete _XMLIO[file,"path"];
+    delete _XMLIO[file,"depth"];
+    delete _XMLIO[file,"dtd"]
+    delete _XMLIO[file,"open"]
+    delete _XMLIO[file,"IND"]
+}
diff --git a/gawk-5.0.1/test/dumpvars.in b/gawk-5.0.1/test/dumpvars.in
new file mode 100644
index 00000000000..b1e67221afe
--- /dev/null
+++ b/gawk-5.0.1/test/dumpvars.in
@@ -0,0 +1,3 @@
+A
+B
+C
diff --git a/gawk-5.0.1/test/dumpvars.ok b/gawk-5.0.1/test/dumpvars.ok
new file mode 100644
index 00000000000..85d1c8597d6
--- /dev/null
+++ b/gawk-5.0.1/test/dumpvars.ok
@@ -0,0 +1,28 @@
+ARGC: 1
+ARGIND: 0
+ARGV: array, 1 elements
+BINMODE: 0
+CONVFMT: "%.6g"
+ERRNO: ""
+FIELDWIDTHS: ""
+FILENAME: "-"
+FNR: 3
+FPAT: "[^[:space:]]+"
+FS: " "
+FUNCTAB: array, 41 elements
+IGNORECASE: 0
+LINT: 0
+NF: 1
+NR: 3
+OFMT: "%.6g"
+OFS: " "
+ORS: "\n"
+PREC: 53
+RLENGTH: 0
+ROUNDMODE: "N"
+RS: "\n"
+RSTART: 0
+RT: "\n"
+SUBSEP: "\034"
+SYMTAB: array, 28 elements
+TEXTDOMAIN: "messages"
diff --git a/gawk-5.0.1/test/dynlj.awk b/gawk-5.0.1/test/dynlj.awk
new file mode 100644
index 00000000000..ec6851bb170
--- /dev/null
+++ b/gawk-5.0.1/test/dynlj.awk
@@ -0,0 +1 @@
+BEGIN { printf "%*sworld\n", -20, "hello" }
diff --git a/gawk-5.0.1/test/dynlj.ok b/gawk-5.0.1/test/dynlj.ok
new file mode 100644
index 00000000000..c8f3fe9d149
--- /dev/null
+++ b/gawk-5.0.1/test/dynlj.ok
@@ -0,0 +1 @@
+hello               world
diff --git a/gawk-5.0.1/test/eofsplit.awk b/gawk-5.0.1/test/eofsplit.awk
new file mode 100644
index 00000000000..22042b4471f
--- /dev/null
+++ b/gawk-5.0.1/test/eofsplit.awk
@@ -0,0 +1,68 @@
+# Date: 	Sat, 30 Mar 1996 12:47:17 -0800 (PST)
+# From: Charles Howes <chowes@grid.direct.ca>
+# To: bug-gnu-utils@prep.ai.mit.edu, arnold@gnu.ai.mit.edu
+# Subject: Bug in Gawk 3.0.0, sample code:
+# 
+#!/usr/local/bin/gawk -f
+#
+# Hello!  This is a bug report from chowes@direct.ca
+#
+# uname -a
+# SunOS hostname 5.5 Generic sun4m
+#
+# Gnu Awk (gawk) 3.0, patchlevel 0:
+BEGIN{
+FS=":"
+while ((getline < "/etc/passwd") > 0) {
+  r=$3
+  z=0
+  n[0]=1
+  }
+FS=" "
+}
+#gawk: fp.new:16: fatal error: internal error
+#Abort
+
+# #!/usr/local/bin/gawk -f
+# # Gnu Awk (gawk) 2.15, patchlevel 6
+# 
+# BEGIN{
+# f="/etc/passwd"
+# while (getline < f) n[0]=1
+# FS=" "
+# }
+# #gawk: /staff/chowes/bin/fp:7: fatal error: internal error
+# #Abort
+
+# These examples are not perfect coding style because I took a real
+# piece of code and tried to strip away anything that didn't make the error
+# message go away.
+# 
+# The interesting part of the 'truss' is:
+# 
+# fstat(3, 0xEFFFF278)				= 0
+# lseek(3, 0, SEEK_SET)				= 0
+# read(3, " r o o t : x : 0 : 1 : S".., 2291)	= 2291
+# brk(0x00050020)					= 0
+# brk(0x00052020)					= 0
+# read(3, 0x0004F4B8, 2291)			= 0
+# close(3)					= 0
+#     Incurred fault #6, FLTBOUNDS  %pc = 0x0001B810
+#       siginfo: SIGSEGV SEGV_MAPERR addr=0x00053000
+#     Received signal #11, SIGSEGV [caught]
+#       siginfo: SIGSEGV SEGV_MAPERR addr=0x00053000
+# write(2, " g a w k", 4)				= 4
+# write(2, " :  ", 2)				= 2
+# 
+# --
+# Charles Howes -- chowes@direct.ca                 Voice: (604) 691-1607
+# System Administrator                                Fax: (604) 691-1605
+# Internet Direct - 1050 - 555 West Hastings St - Vancouver, BC V6B 4N6
+# 
+# A sysadmin's life is a sorry one.  The only advantage he has over Emergency
+# Room doctors is that malpractice suits are rare.  On the other hand, ER
+# doctors never have to deal with patients installing new versions of their
+# own innards!   -Michael O'Brien
+# 
+#  "I think I know what may have gone wrong in the original s/w.
+#   It's a bug in the way it was written."  - Vagueness**n
diff --git a/gawk-5.0.1/test/eofsplit.ok b/gawk-5.0.1/test/eofsplit.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/eofsrc1.ok b/gawk-5.0.1/test/eofsrc1.ok
new file mode 100644
index 00000000000..fd24515e455
--- /dev/null
+++ b/gawk-5.0.1/test/eofsrc1.ok
@@ -0,0 +1,3 @@
+gawk: eofsrc1a.awk:2: (END OF FILE)
+gawk: eofsrc1a.awk:2: ^ source files / command-line arguments must contain complete functions or rules
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/eofsrc1a.awk b/gawk-5.0.1/test/eofsrc1a.awk
new file mode 100644
index 00000000000..55143c2bd4b
--- /dev/null
+++ b/gawk-5.0.1/test/eofsrc1a.awk
@@ -0,0 +1,2 @@
+BEGIN {
+	n = 5
diff --git a/gawk-5.0.1/test/eofsrc1b.awk b/gawk-5.0.1/test/eofsrc1b.awk
new file mode 100644
index 00000000000..0dad2163903
--- /dev/null
+++ b/gawk-5.0.1/test/eofsrc1b.awk
@@ -0,0 +1,2 @@
+	print n
+}
diff --git a/gawk-5.0.1/test/errno.awk b/gawk-5.0.1/test/errno.awk
new file mode 100644
index 00000000000..bcb77614db3
--- /dev/null
+++ b/gawk-5.0.1/test/errno.awk
@@ -0,0 +1,10 @@
+BEGIN {
+  # check that PROCINFO["errno"] is working properly
+  getline
+  if (close(FILENAME)) {
+      print "Error `" ERRNO "' closing input file"
+      print "errno =", PROCINFO["errno"]
+  }
+  getline < (FILENAME "/bogus")
+  print (PROCINFO["errno"] > 0), ERRNO
+}
diff --git a/gawk-5.0.1/test/errno.in b/gawk-5.0.1/test/errno.in
new file mode 100644
index 00000000000..a92d664bc20
--- /dev/null
+++ b/gawk-5.0.1/test/errno.in
@@ -0,0 +1,3 @@
+line 1
+line 2
+line 3
diff --git a/gawk-5.0.1/test/errno.ok b/gawk-5.0.1/test/errno.ok
new file mode 100644
index 00000000000..181afdaf2d4
--- /dev/null
+++ b/gawk-5.0.1/test/errno.ok
@@ -0,0 +1,3 @@
+Error `close of redirection that was never opened' closing input file
+errno = 0
+1 Not a directory
diff --git a/gawk-5.0.1/test/exit.ok b/gawk-5.0.1/test/exit.ok
new file mode 100644
index 00000000000..724b44935ac
--- /dev/null
+++ b/gawk-5.0.1/test/exit.ok
@@ -0,0 +1,25 @@
+1
+3
+-- 1
+2
+-- 2
+2
+-- 3
+2
+2
+-- 4
+0
+-- 5
+1 null
+-- 6
+1 null
+-- 7
+0 exit.sh
+-- 8
+1
+0 exit.sh
+-- 9
+0 null
+-- 10
+1 null
+-- 11
diff --git a/gawk-5.0.1/test/exit.sh b/gawk-5.0.1/test/exit.sh
new file mode 100755
index 00000000000..3922f83c03a
--- /dev/null
+++ b/gawk-5.0.1/test/exit.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+# exit.sh --- test exit invoked in various ways
+
+if [ "$AWK" = "" ]
+then
+	echo $0: You must set AWK >&2
+	exit 1
+fi
+
+# Use awk to print the string instead of echo or printf.
+
+x='BEGIN{print 1; exit; print 2}; NR>1{print}; END{print 3; exit; print 4}'
+$AWK 'BEGIN { print "a\nb" }' | $AWK "$x"
+echo "-- 1"
+
+x='function f(){ exit}; END{print NR;f();print NR}'
+$AWK 'BEGIN { print "a\nb" }' | $AWK "$x"
+echo "-- 2"
+
+x='function f(){ exit}; NR>1 {f()}; END{print NR; f();print NR}'
+$AWK 'BEGIN { print "a\nb" }' | $AWK "$x"
+echo "-- 3"
+
+x='function f(){ exit}; NR>1{ f()}; END{print NR;print NR}'
+$AWK 'BEGIN { print "a\nb" }' | $AWK "$x"
+echo "-- 4"
+
+x='function f(){ exit}; BEGINFILE {f()}; NR>1{ f()}; END{print NR}'
+$AWK 'BEGIN { print "a\nb" }' | $AWK "$x"
+echo "-- 5"
+
+y='function strip(val) { sub(/.*\//, "", val); return val };'
+
+x='BEGINFILE{if(++i==1) exit;}; END{print i, strip(FILENAME)}'
+$AWK "$y$x" /dev/null $0
+echo "-- 6"
+
+x='BEGINFILE{if(++i==1) exit;}; ENDFILE{print i++}; END{print i, strip(FILENAME)}'
+$AWK "$y$x" /dev/null $0
+echo "-- 7"
+
+x='function f(){ exit}; BEGINFILE{i++ && f()}; END{print NR,strip(FILENAME)}'
+$AWK "$y$x" /dev/null $0
+echo "-- 8"
+
+x='function f(){ exit}; BEGINFILE{i++ && f()}; ENDFILE{ print i}; END{print NR,strip(FILENAME)}'
+$AWK "$y$x" /dev/null $0
+echo "-- 9"
+
+x='function f(){ exit}; BEGINFILE{i++}; ENDFILE{ f(); print i}; END{print NR,strip(FILENAME)}'
+$AWK "$y$x" /dev/null $0
+echo "-- 10"
+
+x='function f(){ exit}; BEGINFILE{i++}; ENDFILE{ i>1 && f(); print i, strip(FILENAME)}'
+$AWK "$y$x" /dev/null $0
+echo "-- 11"
diff --git a/gawk-5.0.1/test/exit2.awk b/gawk-5.0.1/test/exit2.awk
new file mode 100644
index 00000000000..ffbb0430859
--- /dev/null
+++ b/gawk-5.0.1/test/exit2.awk
@@ -0,0 +1,2 @@
+function _fn0() { exit }
+BEGIN { ARRAY[_fn0()] }
diff --git a/gawk-5.0.1/test/exit2.ok b/gawk-5.0.1/test/exit2.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/exitval1.awk b/gawk-5.0.1/test/exitval1.awk
new file mode 100644
index 00000000000..550200d2cec
--- /dev/null
+++ b/gawk-5.0.1/test/exitval1.awk
@@ -0,0 +1,3 @@
+# This should exit 0, even though child exits 1
+BEGIN { "exit 1" | getline junk ; exit 12 }
+END { exit 0 }
diff --git a/gawk-5.0.1/test/exitval1.ok b/gawk-5.0.1/test/exitval1.ok
new file mode 100644
index 00000000000..eca5994be86
--- /dev/null
+++ b/gawk-5.0.1/test/exitval1.ok
@@ -0,0 +1 @@
+EXIT CODE: 0
diff --git a/gawk-5.0.1/test/exitval2.awk b/gawk-5.0.1/test/exitval2.awk
new file mode 100644
index 00000000000..ed05e76b679
--- /dev/null
+++ b/gawk-5.0.1/test/exitval2.awk
@@ -0,0 +1,3 @@
+BEGIN { print "foo" | "read x ; echo $x ; exit 12" }
+# this should still exit 0, as pointed out by kenny mccormack in
+# comp.lang.awk on 2 feb 2005
diff --git a/gawk-5.0.1/test/exitval2.ok b/gawk-5.0.1/test/exitval2.ok
new file mode 100644
index 00000000000..257cc5642cb
--- /dev/null
+++ b/gawk-5.0.1/test/exitval2.ok
@@ -0,0 +1 @@
+foo
diff --git a/gawk-5.0.1/test/exitval2.w32 b/gawk-5.0.1/test/exitval2.w32
new file mode 100644
index 00000000000..7f003663915
--- /dev/null
+++ b/gawk-5.0.1/test/exitval2.w32
@@ -0,0 +1,3 @@
+BEGIN { print "foo" | "sh -c \"read x ; echo $x ; exit 12\"" }
+# this should still exit 0, as pointed out by kenny mccormack in
+# comp.lang.awk on 2 feb 2005
diff --git a/gawk-5.0.1/test/exitval3.awk b/gawk-5.0.1/test/exitval3.awk
new file mode 100644
index 00000000000..33e8c433dc6
--- /dev/null
+++ b/gawk-5.0.1/test/exitval3.awk
@@ -0,0 +1,2 @@
+BEGIN { exit 42 }
+END { exit }
diff --git a/gawk-5.0.1/test/exitval3.ok b/gawk-5.0.1/test/exitval3.ok
new file mode 100644
index 00000000000..20f64b8cb92
--- /dev/null
+++ b/gawk-5.0.1/test/exitval3.ok
@@ -0,0 +1 @@
+EXIT CODE: 42
diff --git a/gawk-5.0.1/test/fcall_exit.awk b/gawk-5.0.1/test/fcall_exit.awk
new file mode 100644
index 00000000000..931b60730b7
--- /dev/null
+++ b/gawk-5.0.1/test/fcall_exit.awk
@@ -0,0 +1,24 @@
+#!/bin/awk -f
+
+function crash () {
+    exit 1
+}
+
+function true (a,b,c) {
+    return 0
+}
+
+BEGIN {
+    if (ARGV[1] == 1) {
+        print "true(1, 1, crash()) => crash properly."
+        true(1, 1, crash())
+    } else if (ARGV[1] == 2) {
+        print "true(1, crash(), 1) => do not crash properly."
+        true(1, crash(),1)
+    } else {
+        print "true(1, crash()) => do not crash properly."
+        true(1, crash())
+    }
+}
+
+# FdF
diff --git a/gawk-5.0.1/test/fcall_exit.ok b/gawk-5.0.1/test/fcall_exit.ok
new file mode 100644
index 00000000000..b289c6d569c
--- /dev/null
+++ b/gawk-5.0.1/test/fcall_exit.ok
@@ -0,0 +1,2 @@
+true(1, crash()) => do not crash properly.
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/fcall_exit2.awk b/gawk-5.0.1/test/fcall_exit2.awk
new file mode 100644
index 00000000000..cbf208207eb
--- /dev/null
+++ b/gawk-5.0.1/test/fcall_exit2.awk
@@ -0,0 +1,25 @@
+#!/bin/awk -f
+
+function crash () {
+    exit 1
+}
+
+function true (a,b,c) {
+    return 1
+}
+
+BEGIN {
+    if (ARGV[2] == 1) {
+        print "<BEGIN CONTEXT> true(1, crash()) => crash properly."
+        true(1, crash())
+	# ADR: Added:
+	delete ARGV[2]
+    }
+}
+
+{
+        print "<RULE CONTEXT> true(1, crash()) => do not crash properly."
+        true(1, crash())
+}
+
+# FdF
diff --git a/gawk-5.0.1/test/fcall_exit2.in b/gawk-5.0.1/test/fcall_exit2.in
new file mode 100644
index 00000000000..f7050c9ff25
--- /dev/null
+++ b/gawk-5.0.1/test/fcall_exit2.in
@@ -0,0 +1 @@
+dummy input line
diff --git a/gawk-5.0.1/test/fcall_exit2.ok b/gawk-5.0.1/test/fcall_exit2.ok
new file mode 100644
index 00000000000..6cc3da201d7
--- /dev/null
+++ b/gawk-5.0.1/test/fcall_exit2.ok
@@ -0,0 +1,2 @@
+<RULE CONTEXT> true(1, crash()) => do not crash properly.
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/fflush.ok b/gawk-5.0.1/test/fflush.ok
new file mode 100644
index 00000000000..4cf0df6c2c8
--- /dev/null
+++ b/gawk-5.0.1/test/fflush.ok
@@ -0,0 +1,16 @@
+1st
+2nd
+1st
+2nd
+1st
+2nd
+1st
+2nd
+1st
+2nd
+1st
+2nd
+1st
+2nd
+1st
+2nd
diff --git a/gawk-5.0.1/test/fflush.sh b/gawk-5.0.1/test/fflush.sh
new file mode 100755
index 00000000000..42d624c9149
--- /dev/null
+++ b/gawk-5.0.1/test/fflush.sh
@@ -0,0 +1,16 @@
+#! /bin/sh
+../gawk 'BEGIN{print "1st";fflush("/dev/stdout");print "2nd"|"cat"}'
+
+../gawk 'BEGIN{print "1st";fflush("/dev/stdout");print "2nd"|"cat"}'|cat
+
+../gawk 'BEGIN{print "1st";fflush("/dev/stdout");close("/dev/stdout");print "2nd"|"cat"}'|cat
+
+../gawk 'BEGIN{print "1st";fflush("/dev/stdout");print "2nd"|"cat";close("cat")}'|cat
+
+../gawk 'BEGIN{print "1st";fflush("/dev/stdout");print "2nd"|"cat";close("cat")}'|cat
+
+../gawk 'BEGIN{print "1st";fflush("/dev/stdout");print "2nd"|"cat";close("cat")}'|cat
+
+../gawk 'BEGIN{print "1st";fflush("/dev/stdout");print "2nd"|"sort"}'|cat
+
+../gawk 'BEGIN{print "1st";fflush("/dev/stdout");print "2nd"|"sort";close("sort")}'|cat
diff --git a/gawk-5.0.1/test/fieldwdth.awk b/gawk-5.0.1/test/fieldwdth.awk
new file mode 100644
index 00000000000..f2eeb6ce7f7
--- /dev/null
+++ b/gawk-5.0.1/test/fieldwdth.awk
@@ -0,0 +1,2 @@
+BEGIN { FIELDWIDTHS = "2 3 4" }
+{ print $2 }
diff --git a/gawk-5.0.1/test/fieldwdth.in b/gawk-5.0.1/test/fieldwdth.in
new file mode 100644
index 00000000000..28d14454c38
--- /dev/null
+++ b/gawk-5.0.1/test/fieldwdth.in
@@ -0,0 +1 @@
+123456789
diff --git a/gawk-5.0.1/test/fieldwdth.ok b/gawk-5.0.1/test/fieldwdth.ok
new file mode 100644
index 00000000000..51b4008129f
--- /dev/null
+++ b/gawk-5.0.1/test/fieldwdth.ok
@@ -0,0 +1 @@
+345
diff --git a/gawk-5.0.1/test/filefuncs.awk b/gawk-5.0.1/test/filefuncs.awk
new file mode 100644
index 00000000000..7aa5ae6a344
--- /dev/null
+++ b/gawk-5.0.1/test/filefuncs.awk
@@ -0,0 +1,25 @@
+@load "filefuncs"
+
+BEGIN {
+   if (chdir(builddir) < 0) {
+      printf "Error: chdir failed with ERRNO %s\n", ERRNO
+      exit 1
+   }
+
+   if (stat(ARGV[0] "api.o", st) < 0) {
+      printf "Error: stat(%s) failed with ERRNO %s\n", ARGV[0] "api.o", ERRNO
+      exit 1
+   }
+
+   nf = split("name dev ino mode nlink uid gid size blocks atime mtime ctime pmode type", f)
+
+   for (i = 1; i <= nf; i++) {
+      if (!(f[i] in st)) {
+	 printf "stat value for %s is missing\n",f[i]
+	 rc = 1
+      }
+      else
+	 delete st[f[i]]
+   }
+   exit rc+0
+}
diff --git a/gawk-5.0.1/test/filefuncs.ok b/gawk-5.0.1/test/filefuncs.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/fix-fmtspcl.awk b/gawk-5.0.1/test/fix-fmtspcl.awk
new file mode 100644
index 00000000000..018f519d39d
--- /dev/null
+++ b/gawk-5.0.1/test/fix-fmtspcl.awk
@@ -0,0 +1,23 @@
+BEGIN {
+	pnan = sprintf("%g",sqrt(-1))
+	nnan = sprintf("%g",-sqrt(-1))
+	pinf = sprintf("%g",-log(0))
+	ninf = sprintf("%g",log(0))
+
+	pnanu = toupper(pnan)
+	nnanu = toupper(nnan)
+	pinfu = toupper(pinf)
+	ninfu = toupper(ninf)
+}
+{
+	sub(/positive_nan/, pnan)
+	sub(/negative_nan/, nnan)
+	sub(/positive_infinity/, pinf)
+	sub(/negative_infinity/, ninf)
+	sub(/POSITIVE_NAN/, pnanu)
+	sub(/NEGATIVE_NAN/, nnanu)
+	sub(/POSITIVE_INFINITY/, pinfu)
+	sub(/NEGATIVE_INFINITY/, ninfu)
+	sub(/fmtspcl/,(sd "/fmtspcl"))
+	print
+}
diff --git a/gawk-5.0.1/test/fldchg.awk b/gawk-5.0.1/test/fldchg.awk
new file mode 100644
index 00000000000..a8018f7859e
--- /dev/null
+++ b/gawk-5.0.1/test/fldchg.awk
@@ -0,0 +1,8 @@
+{
+#	print "0:", $0
+	gsub("aa", "+")
+	print "1:", $0
+	$3 = "<" $3 ">"
+	print "2:", $0
+	print "2a:" "%" $1 "%" $2 "%" $3 "%" $4 "%" $5
+}
diff --git a/gawk-5.0.1/test/fldchg.in b/gawk-5.0.1/test/fldchg.in
new file mode 100644
index 00000000000..f500c36acd6
--- /dev/null
+++ b/gawk-5.0.1/test/fldchg.in
@@ -0,0 +1 @@
+aa aab c d e f
diff --git a/gawk-5.0.1/test/fldchg.ok b/gawk-5.0.1/test/fldchg.ok
new file mode 100644
index 00000000000..cc5032a8f6a
--- /dev/null
+++ b/gawk-5.0.1/test/fldchg.ok
@@ -0,0 +1,3 @@
+1: + +b c d e f
+2: + +b <c> d e f
+2a:%+%+b%<c>%d%e
diff --git a/gawk-5.0.1/test/fldchgnf.awk b/gawk-5.0.1/test/fldchgnf.awk
new file mode 100644
index 00000000000..fbb8f118a70
--- /dev/null
+++ b/gawk-5.0.1/test/fldchgnf.awk
@@ -0,0 +1 @@
+{ OFS = ":"; $2 = ""; print $0; print NF }
diff --git a/gawk-5.0.1/test/fldchgnf.in b/gawk-5.0.1/test/fldchgnf.in
new file mode 100644
index 00000000000..8e13e468a00
--- /dev/null
+++ b/gawk-5.0.1/test/fldchgnf.in
@@ -0,0 +1 @@
+a b c d
diff --git a/gawk-5.0.1/test/fldchgnf.ok b/gawk-5.0.1/test/fldchgnf.ok
new file mode 100644
index 00000000000..10b38eddf1d
--- /dev/null
+++ b/gawk-5.0.1/test/fldchgnf.ok
@@ -0,0 +1,2 @@
+a::c:d
+4
diff --git a/gawk-5.0.1/test/fldterm.awk b/gawk-5.0.1/test/fldterm.awk
new file mode 100644
index 00000000000..26fe01fbacb
--- /dev/null
+++ b/gawk-5.0.1/test/fldterm.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	# choose a field separator that is numeric, so we can test whether
+	# force_number properly handles unterminated numeric field strings
+	FS = "3"
+}
+
+{
+	print $1+0
+	print $1
+}
diff --git a/gawk-5.0.1/test/fldterm.in b/gawk-5.0.1/test/fldterm.in
new file mode 100644
index 00000000000..14a41cae12c
--- /dev/null
+++ b/gawk-5.0.1/test/fldterm.in
@@ -0,0 +1 @@
+5.53apple
diff --git a/gawk-5.0.1/test/fldterm.ok b/gawk-5.0.1/test/fldterm.ok
new file mode 100644
index 00000000000..ecd7600eec6
--- /dev/null
+++ b/gawk-5.0.1/test/fldterm.ok
@@ -0,0 +1,2 @@
+5.5
+5.5
diff --git a/gawk-5.0.1/test/fmtspcl-mpfr.ok b/gawk-5.0.1/test/fmtspcl-mpfr.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/fmtspcl.awk b/gawk-5.0.1/test/fmtspcl.awk
new file mode 100644
index 00000000000..b3313f775bb
--- /dev/null
+++ b/gawk-5.0.1/test/fmtspcl.awk
@@ -0,0 +1,48 @@
+function display(x, str,	i, res) {
+	for (i = 0; i < n; i++) {
+		if ((res = sprintf(formats[i],x)) != str)
+			printf "sprintf(%s,%s) = %s (!= %s)\n",
+			       formats[i], x, res, str
+	}
+}
+
+BEGIN {
+	nan = sqrt(-1)
+	nan_str =  sprintf("%Pf", nan)
+	nnan_str = sprintf("%Pf", -nan)
+	if (nan_str == "nan")
+		nan_str = "+" nan_str
+	if (nnan_str == "nan")
+		nnan_str = "+" nnan_str
+	inf = -log(0)
+	inf_str = "+" sprintf("%Pf", inf)
+	ninf_str = sprintf("%Pf", -inf)
+
+	n = 0
+	formats[n++] = "%a"
+	formats[n++] = "%e"
+	formats[n++] = "%f"
+	formats[n++] = "%g"
+	formats[n++] = "%x"
+	formats[n++] = "%d"
+	formats[n++] = "%s"
+	display(nan, nan_str)
+	display(-nan, nnan_str)
+	display(inf, inf_str)
+	display(-inf, ninf_str)
+
+	# Now test uppercase floating-point format strings
+	for (j = 0; j < n; j++)
+		formats[j] = toupper(formats[j])
+
+	n -= 3		# interger and string formats don't count (%x, %d, %s)
+	nan_str = toupper(nan_str)
+	nnan_str = toupper(nnan_str)
+	inf_str = toupper(inf_str)
+	ninf_str = toupper(ninf_str)
+
+	display(nan, nan_str)
+	display(-nan, nnan_str)
+	display(inf, inf_str)
+	display(-inf, ninf_str)
+}
diff --git a/gawk-5.0.1/test/fmtspcl.tok b/gawk-5.0.1/test/fmtspcl.tok
new file mode 100644
index 00000000000..e85e170cccb
--- /dev/null
+++ b/gawk-5.0.1/test/fmtspcl.tok
@@ -0,0 +1,42 @@
+gawk: fmtspcl.awk:10: warning: sqrt: called with negative argument -1
+gawk: fmtspcl.awk:3: warning: %a format is POSIX standard but not portable to other awks
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_nan is out of range for `%a' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_nan is out of range for `%e' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_nan is out of range for `%f' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_nan is out of range for `%g' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_nan is out of range for `%x' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_nan is out of range for `%d' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_nan is out of range for `%a' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_nan is out of range for `%e' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_nan is out of range for `%f' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_nan is out of range for `%g' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_nan is out of range for `%x' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_nan is out of range for `%d' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_infinity is out of range for `%a' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_infinity is out of range for `%e' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_infinity is out of range for `%f' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_infinity is out of range for `%g' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_infinity is out of range for `%x' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value positive_infinity is out of range for `%d' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_infinity is out of range for `%a' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_infinity is out of range for `%e' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_infinity is out of range for `%f' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_infinity is out of range for `%g' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_infinity is out of range for `%x' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value negative_infinity is out of range for `%d' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value POSITIVE_NAN is out of range for `%A' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value POSITIVE_NAN is out of range for `%E' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value POSITIVE_NAN is out of range for `%F' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value POSITIVE_NAN is out of range for `%G' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value NEGATIVE_NAN is out of range for `%A' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value NEGATIVE_NAN is out of range for `%E' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value NEGATIVE_NAN is out of range for `%F' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value NEGATIVE_NAN is out of range for `%G' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value POSITIVE_INFINITY is out of range for `%A' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value POSITIVE_INFINITY is out of range for `%E' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value POSITIVE_INFINITY is out of range for `%F' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value POSITIVE_INFINITY is out of range for `%G' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value NEGATIVE_INFINITY is out of range for `%A' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value NEGATIVE_INFINITY is out of range for `%E' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value NEGATIVE_INFINITY is out of range for `%F' format
+gawk: fmtspcl.awk:3: warning: [s]printf: value NEGATIVE_INFINITY is out of range for `%G' format
diff --git a/gawk-5.0.1/test/fmttest.awk b/gawk-5.0.1/test/fmttest.awk
new file mode 100644
index 00000000000..e8db0fb7037
--- /dev/null
+++ b/gawk-5.0.1/test/fmttest.awk
@@ -0,0 +1,164 @@
+### /u/sy/beebe/xml/shbook/fmttest.awk, Sat May 31 09:13:52 2003
+### Edit by Nelson H. F. Beebe <beebe@math.utah.edu>
+### ====================================================================
+### Test the degree of support for printf format items in awk
+### implementations.
+###
+### Usage:
+###	awk -f fmttest.awk
+### [31-May-2003]
+### ====================================================================
+
+BEGIN {
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: c\n"
+
+    printf("ABC with %%c : %c\n", "ABC")
+    printf("123 with %%c : %c\n", 123)
+
+    printf("ABC with %%.15c : %.15c\n", "ABC")
+    printf("123 with %%.15c : %.15c\n", 123)
+
+    printf("ABC with %%15c : %15c\n", "ABC")
+    printf("123 with %%15c : %15c\n", 123)
+
+    printf("ABC with %%-15c : %-15c\n", "ABC")
+    printf("123 with %%-15c : %-15c\n", 123)
+
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: d\n"
+
+    printf("ABC with %%d : %d\n", "ABC")
+    printf("123 with %%d : %d\n", 123)
+
+    printf("ABC with %%.15d : %.15d\n", "ABC")
+    printf("123 with %%.15d : %.15d\n", 123)
+
+    printf("ABC with %%15d : %15d\n", "ABC")
+    printf("123 with %%15d : %15d\n", 123)
+
+    printf("ABC with %%-15d : %-15d\n", "ABC")
+    printf("123 with %%-15d : %-15d\n", 123)
+
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: e\n"
+
+    printf("ABC with %%e : %e\n", "ABC")
+    printf("123 with %%e : %e\n", 123)
+
+    printf("ABC with %%.25e : %.25e\n", "ABC")
+    printf("123 with %%.25e : %.25e\n", 123)
+
+    printf("ABC with %%25e : %25e\n", "ABC")
+    printf("123 with %%25e : %25e\n", 123)
+
+    printf("ABC with %%-25e : %-25e\n", "ABC")
+    printf("123 with %%-25e : %-25e\n", 123)
+
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: f\n"
+
+    printf("ABC with %%f : %f\n", "ABC")
+    printf("123 with %%f : %f\n", 123)
+
+    printf("ABC with %%.25f : %.25f\n", "ABC")
+    printf("123 with %%.25f : %.25f\n", 123)
+
+    printf("ABC with %%25f : %25f\n", "ABC")
+    printf("123 with %%25f : %25f\n", 123)
+
+    printf("ABC with %%-25f : %-25f\n", "ABC")
+    printf("123 with %%-25f : %-25f\n", 123)
+
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: g\n"
+
+    printf("ABC with %%g : %g\n", "ABC")
+    printf("123 with %%g : %g\n", 123)
+
+    printf("ABC with %%.25g : %.25g\n", "ABC")
+    printf("123 with %%.25g : %.25g\n", 123)
+
+    printf("ABC with %%25g : %25g\n", "ABC")
+    printf("123 with %%25g : %25g\n", 123)
+
+    printf("ABC with %%-25g : %-25g\n", "ABC")
+    printf("123 with %%-25g : %-25g\n", 123)
+
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: o\n"
+
+    printf("ABC with %%o : %o\n", "ABC")
+    printf("123 with %%o : %o\n", 123)
+
+    printf("ABC with %%.15o : %.15o\n", "ABC")
+    printf("123 with %%.15o : %.15o\n", 123)
+
+    printf("ABC with %%15o : %15o\n", "ABC")
+    printf("123 with %%15o : %15o\n", 123)
+
+    printf("ABC with %%-15o : %-15o\n", "ABC")
+    printf("123 with %%-15o : %-15o\n", 123)
+
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: s\n"
+
+    printf("ABC with %%s : %s\n", "ABC")
+    printf("123 with %%s : %s\n", 123)
+
+    printf("ABC with %%.15s : %.15s\n", "ABC")
+    printf("123 with %%.15s : %.15s\n", 123)
+
+    printf("ABC with %%15s : %15s\n", "ABC")
+    printf("123 with %%15s : %15s\n", 123)
+
+    printf("ABC with %%-15s : %-15s\n", "ABC")
+    printf("123 with %%-15s : %-15s\n", 123)
+
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: u\n"
+
+    printf("ABC with %%u : %u\n", "ABC")
+    printf("123 with %%u : %u\n", 123)
+
+    printf("ABC with %%.15u : %.15u\n", "ABC")
+    printf("123 with %%.15u : %.15u\n", 123)
+
+    printf("ABC with %%15u : %15u\n", "ABC")
+    printf("123 with %%15u : %15u\n", 123)
+
+    printf("ABC with %%-15u : %-15u\n", "ABC")
+    printf("123 with %%-15u : %-15u\n", 123)
+
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: x\n"
+
+    printf("ABC with %%x : %x\n", "ABC")
+    printf("123 with %%x : %x\n", 123)
+
+    printf("ABC with %%.15x : %.15x\n", "ABC")
+    printf("123 with %%.15x : %.15x\n", 123)
+
+    printf("ABC with %%15x : %15x\n", "ABC")
+    printf("123 with %%15x : %15x\n", 123)
+
+    printf("ABC with %%-15x : %-15x\n", "ABC")
+    printf("123 with %%-15x : %-15x\n", 123)
+
+    ## -----------------------------------------------------------------
+    print "\n\nFormat item: X\n"
+
+    printf("ABC with %%X : %X\n", "ABC")
+    printf("123 with %%X : %X\n", 123)
+
+    printf("ABC with %%.15X : %.15X\n", "ABC")
+    printf("123 with %%.15X : %.15X\n", 123)
+
+    printf("ABC with %%15X : %15X\n", "ABC")
+    printf("123 with %%15X : %15X\n", 123)
+
+    printf("ABC with %%-15X : %-15X\n", "ABC")
+    printf("123 with %%-15X : %-15X\n", 123)
+
+    exit(0)
+}
diff --git a/gawk-5.0.1/test/fmttest.ok b/gawk-5.0.1/test/fmttest.ok
new file mode 100644
index 00000000000..753567ace9e
--- /dev/null
+++ b/gawk-5.0.1/test/fmttest.ok
@@ -0,0 +1,120 @@
+
+
+Format item: c
+
+ABC with %c : A
+123 with %c : {
+ABC with %.15c : A
+123 with %.15c : {
+ABC with %15c :               A
+123 with %15c :               {
+ABC with %-15c : A              
+123 with %-15c : {              
+
+
+Format item: d
+
+ABC with %d : 0
+123 with %d : 123
+ABC with %.15d : 000000000000000
+123 with %.15d : 000000000000123
+ABC with %15d :               0
+123 with %15d :             123
+ABC with %-15d : 0              
+123 with %-15d : 123            
+
+
+Format item: e
+
+ABC with %e : 0.000000e+00
+123 with %e : 1.230000e+02
+ABC with %.25e : 0.0000000000000000000000000e+00
+123 with %.25e : 1.2300000000000000000000000e+02
+ABC with %25e :              0.000000e+00
+123 with %25e :              1.230000e+02
+ABC with %-25e : 0.000000e+00             
+123 with %-25e : 1.230000e+02             
+
+
+Format item: f
+
+ABC with %f : 0.000000
+123 with %f : 123.000000
+ABC with %.25f : 0.0000000000000000000000000
+123 with %.25f : 123.0000000000000000000000000
+ABC with %25f :                  0.000000
+123 with %25f :                123.000000
+ABC with %-25f : 0.000000                 
+123 with %-25f : 123.000000               
+
+
+Format item: g
+
+ABC with %g : 0
+123 with %g : 123
+ABC with %.25g : 0
+123 with %.25g : 123
+ABC with %25g :                         0
+123 with %25g :                       123
+ABC with %-25g : 0                        
+123 with %-25g : 123                      
+
+
+Format item: o
+
+ABC with %o : 0
+123 with %o : 173
+ABC with %.15o : 000000000000000
+123 with %.15o : 000000000000173
+ABC with %15o :               0
+123 with %15o :             173
+ABC with %-15o : 0              
+123 with %-15o : 173            
+
+
+Format item: s
+
+ABC with %s : ABC
+123 with %s : 123
+ABC with %.15s : ABC
+123 with %.15s : 123
+ABC with %15s :             ABC
+123 with %15s :             123
+ABC with %-15s : ABC            
+123 with %-15s : 123            
+
+
+Format item: u
+
+ABC with %u : 0
+123 with %u : 123
+ABC with %.15u : 000000000000000
+123 with %.15u : 000000000000123
+ABC with %15u :               0
+123 with %15u :             123
+ABC with %-15u : 0              
+123 with %-15u : 123            
+
+
+Format item: x
+
+ABC with %x : 0
+123 with %x : 7b
+ABC with %.15x : 000000000000000
+123 with %.15x : 00000000000007b
+ABC with %15x :               0
+123 with %15x :              7b
+ABC with %-15x : 0              
+123 with %-15x : 7b             
+
+
+Format item: X
+
+ABC with %X : 0
+123 with %X : 7B
+ABC with %.15X : 000000000000000
+123 with %.15X : 00000000000007B
+ABC with %15X :               0
+123 with %15X :              7B
+ABC with %-15X : 0              
+123 with %-15X : 7B             
diff --git a/gawk-5.0.1/test/fnamedat.awk b/gawk-5.0.1/test/fnamedat.awk
new file mode 100644
index 00000000000..33a07049cda
--- /dev/null
+++ b/gawk-5.0.1/test/fnamedat.awk
@@ -0,0 +1 @@
+function foo() { print foo } {foo()}
diff --git a/gawk-5.0.1/test/fnamedat.in b/gawk-5.0.1/test/fnamedat.in
new file mode 100644
index 00000000000..257cc5642cb
--- /dev/null
+++ b/gawk-5.0.1/test/fnamedat.in
@@ -0,0 +1 @@
+foo
diff --git a/gawk-5.0.1/test/fnamedat.ok b/gawk-5.0.1/test/fnamedat.ok
new file mode 100644
index 00000000000..d7b71c41f38
--- /dev/null
+++ b/gawk-5.0.1/test/fnamedat.ok
@@ -0,0 +1,3 @@
+gawk: fnamedat.awk:1: error: function `foo' called with space between name and `(',
+or used as a variable or an array
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/fnarray.awk b/gawk-5.0.1/test/fnarray.awk
new file mode 100644
index 00000000000..92a18b98eab
--- /dev/null
+++ b/gawk-5.0.1/test/fnarray.awk
@@ -0,0 +1,7 @@
+function foo(N) {
+  return 0
+}
+BEGIN {
+  Num = foo[c]
+}
+
diff --git a/gawk-5.0.1/test/fnarray.ok b/gawk-5.0.1/test/fnarray.ok
new file mode 100644
index 00000000000..6cab9134036
--- /dev/null
+++ b/gawk-5.0.1/test/fnarray.ok
@@ -0,0 +1,3 @@
+gawk: fnarray.awk:5: error: function `foo' called with space between name and `(',
+or used as a variable or an array
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/fnarray2.awk b/gawk-5.0.1/test/fnarray2.awk
new file mode 100644
index 00000000000..1723fbf6b29
--- /dev/null
+++ b/gawk-5.0.1/test/fnarray2.awk
@@ -0,0 +1,5 @@
+function pile(c, r)
+{
+	r = ++pile[c]
+}
+{ pile($1) }
diff --git a/gawk-5.0.1/test/fnarray2.in b/gawk-5.0.1/test/fnarray2.in
new file mode 100644
index 00000000000..587be6b4c3f
--- /dev/null
+++ b/gawk-5.0.1/test/fnarray2.in
@@ -0,0 +1 @@
+x
diff --git a/gawk-5.0.1/test/fnarray2.ok b/gawk-5.0.1/test/fnarray2.ok
new file mode 100644
index 00000000000..82815055950
--- /dev/null
+++ b/gawk-5.0.1/test/fnarray2.ok
@@ -0,0 +1,3 @@
+gawk: fnarray2.awk:3: error: function `pile' called with space between name and `(',
+or used as a variable or an array
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/fnarydel-mpfr.ok b/gawk-5.0.1/test/fnarydel-mpfr.ok
new file mode 100644
index 00000000000..7f3e45312ea
--- /dev/null
+++ b/gawk-5.0.1/test/fnarydel-mpfr.ok
@@ -0,0 +1,27 @@
+first loop
+4
+5
+6
+7
+8
+9
+1
+2
+3
+second loop
+third loop
+4
+5
+6
+7
+8
+9
+1
+2
+3
+call func
+fourth loop
+You should just see: 4 4
+4 4
+You should see nothing between this line
+And this one
diff --git a/gawk-5.0.1/test/fnarydel.awk b/gawk-5.0.1/test/fnarydel.awk
new file mode 100644
index 00000000000..8a1264cbed6
--- /dev/null
+++ b/gawk-5.0.1/test/fnarydel.awk
@@ -0,0 +1,60 @@
+#!/usr/local/bin/gawk -f
+BEGIN {
+  process()
+}
+
+function process(aa,a) {
+  delete aa
+}
+
+BEGIN {
+	for (i = 1; i < 10; i++)
+		a[i] = i;
+
+	print "first loop"
+	for (i in a)
+		print a[i]
+
+	delete a
+
+	print "second loop"
+	for (i in a)
+		print a[i]
+
+	for (i = 1; i < 10; i++)
+		a[i] = i;
+
+	print "third loop"
+	for (i in a)
+		print a[i]
+
+	print "call func"
+	delit(a)
+
+	print "fourth loop"
+	for (i in a)
+		print a[i]
+
+	stressit()
+}
+
+function delit(arr)
+{
+	delete arr
+}
+
+function stressit(	array, i)
+{
+	delete array
+	array[4] = 4
+	array[5] = 5
+	delete array[5]
+	print "You should just see: 4 4"
+	for (i in array)
+		print i, array[i]
+	delete array
+	print "You should see nothing between this line"
+	for (i in array)
+		print i, array[i]
+	print "And this one"
+}
diff --git a/gawk-5.0.1/test/fnarydel.ok b/gawk-5.0.1/test/fnarydel.ok
new file mode 100644
index 00000000000..7078c015710
--- /dev/null
+++ b/gawk-5.0.1/test/fnarydel.ok
@@ -0,0 +1,27 @@
+first loop
+1
+2
+3
+4
+5
+6
+7
+8
+9
+second loop
+third loop
+1
+2
+3
+4
+5
+6
+7
+8
+9
+call func
+fourth loop
+You should just see: 4 4
+4 4
+You should see nothing between this line
+And this one
diff --git a/gawk-5.0.1/test/fnaryscl.awk b/gawk-5.0.1/test/fnaryscl.awk
new file mode 100644
index 00000000000..b88778ec14e
--- /dev/null
+++ b/gawk-5.0.1/test/fnaryscl.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	foo[1] = 4
+	f1(foo)
+}
+
+function f1(a) { f2(a) }
+
+function f2(b) { f3(b) }
+
+function f3(c) { c = 6 }
diff --git a/gawk-5.0.1/test/fnaryscl.ok b/gawk-5.0.1/test/fnaryscl.ok
new file mode 100644
index 00000000000..ac840772e94
--- /dev/null
+++ b/gawk-5.0.1/test/fnaryscl.ok
@@ -0,0 +1,2 @@
+gawk: fnaryscl.awk:10: fatal: attempt to use array `c (from b, from a, from foo)' in a scalar context
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/fnasgnm.awk b/gawk-5.0.1/test/fnasgnm.awk
new file mode 100644
index 00000000000..a18a848ca92
--- /dev/null
+++ b/gawk-5.0.1/test/fnasgnm.awk
@@ -0,0 +1,14 @@
+# AFP_Bug1.awk - illustrate a problem with `gawk' (GNU Awk 3.0.3 on OS/2)
+# Arthur Pool .. pool@commerce.uq.edu.au
+# $Id: fnasgnm.awk,v 1.1.1.1 2008/11/16 19:21:15 arnold Exp $
+
+# Assignment to a variable with the same name as a function from within
+# that function causes an ABEND.
+#
+# Yes, I do realise that it's not a smart thing to do, but an error
+# message would be a kinder response than a core dump (and would make
+# debugging a whole lot easier).
+
+{ShowMe()}
+
+function ShowMe() {ShowMe = 1}
diff --git a/gawk-5.0.1/test/fnasgnm.in b/gawk-5.0.1/test/fnasgnm.in
new file mode 100644
index 00000000000..a9419310101
--- /dev/null
+++ b/gawk-5.0.1/test/fnasgnm.in
@@ -0,0 +1 @@
+junk
diff --git a/gawk-5.0.1/test/fnasgnm.ok b/gawk-5.0.1/test/fnasgnm.ok
new file mode 100644
index 00000000000..5cacff2767a
--- /dev/null
+++ b/gawk-5.0.1/test/fnasgnm.ok
@@ -0,0 +1,3 @@
+gawk: fnasgnm.awk:14: error: function `ShowMe' called with space between name and `(',
+or used as a variable or an array
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/fnmatch.awk b/gawk-5.0.1/test/fnmatch.awk
new file mode 100644
index 00000000000..b3717549e79
--- /dev/null
+++ b/gawk-5.0.1/test/fnmatch.awk
@@ -0,0 +1,13 @@
+@load "fnmatch"
+
+BEGIN {
+	# can't print the values; they vary from system to system
+	for (i in FNM)
+		printf("\"%s\" is an element in FNM\n", i)
+	# can't even print this
+	# print "FNM_NOMATCH =", FNM_NOMATCH 
+
+	printf("fnmatch(\"*.a\", \"foo.a\", 0)  = %d\n", fnmatch("*.a", "foo.a", 0) )
+	if (fnmatch("*.a", "foo.c", 0) == FNM_NOMATCH)
+		printf("fnmatch(\"*.a\", \"foo.c\", 0) == FNM_NOMATCH\n")
+}
diff --git a/gawk-5.0.1/test/fnmatch.ok b/gawk-5.0.1/test/fnmatch.ok
new file mode 100644
index 00000000000..15bb191675d
--- /dev/null
+++ b/gawk-5.0.1/test/fnmatch.ok
@@ -0,0 +1,8 @@
+"LEADING_DIR" is an element in FNM
+"CASEFOLD" is an element in FNM
+"NOESCAPE" is an element in FNM
+"PERIOD" is an element in FNM
+"PATHNAME" is an element in FNM
+"FILE_NAME" is an element in FNM
+fnmatch("*.a", "foo.a", 0)  = 0
+fnmatch("*.a", "foo.c", 0) == FNM_NOMATCH
diff --git a/gawk-5.0.1/test/fnmisc.awk b/gawk-5.0.1/test/fnmisc.awk
new file mode 100644
index 00000000000..4dcc94eee09
--- /dev/null
+++ b/gawk-5.0.1/test/fnmisc.awk
@@ -0,0 +1,13 @@
+# Tue Feb  4 12:20:10 IST 2003
+
+# Misc functions tests, in case we start mucking around in the grammar again.
+
+# Empty body shouldn't hurt anything:
+function f() {}
+BEGIN { f() }
+
+# Using a built-in function name should manage the symbol table
+# correctly:
+function split(x) { return x }
+
+function x(a) { return a }
diff --git a/gawk-5.0.1/test/fnmisc.ok b/gawk-5.0.1/test/fnmisc.ok
new file mode 100644
index 00000000000..a265e401511
--- /dev/null
+++ b/gawk-5.0.1/test/fnmisc.ok
@@ -0,0 +1,3 @@
+gawk: fnmisc.awk:11: function split(x) { return x }
+gawk: fnmisc.awk:11:          ^ `split' is a built-in function, it cannot be redefined
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/fnparydl-mpfr.ok b/gawk-5.0.1/test/fnparydl-mpfr.ok
new file mode 100644
index 00000000000..26a5c3902c8
--- /dev/null
+++ b/gawk-5.0.1/test/fnparydl-mpfr.ok
@@ -0,0 +1,10 @@
+BEFORE LOOP
+DELETING KEY 4
+DELETING KEY 5
+DELETING KEY 6
+DELETING KEY 7
+DELETING KEY 1
+DELETING KEY 2
+DELETING KEY 3
+AFTER LOOP
+0 elements still in q[]
diff --git a/gawk-5.0.1/test/fnparydl.awk b/gawk-5.0.1/test/fnparydl.awk
new file mode 100644
index 00000000000..ef3a82255b3
--- /dev/null
+++ b/gawk-5.0.1/test/fnparydl.awk
@@ -0,0 +1,31 @@
+# fnparydl.awk --- check that deleting works with arrays
+# 		   that are parameters.
+#
+# Tue Jul 11 14:20:58 EDT 2000
+
+function delit(a,	k)
+{
+	print "BEFORE LOOP"
+	for (k in a) {
+		print "DELETING KEY", k
+		delete a[k]
+	}
+	print "AFTER LOOP"
+}
+
+BEGIN {
+	for (i = 1 ; i <= 7; i++) {
+		q[i] = sprintf("element %d", i)
+		x[i] = i
+		y[i] = q[i]
+	}
+#	adump(q)
+	delit(q)
+#	for (i in q)
+#		delete q[i]
+	j = 0;
+	for (i in q)
+		j++
+	print j, "elements still in q[]"
+#	adump(q)
+}
diff --git a/gawk-5.0.1/test/fnparydl.ok b/gawk-5.0.1/test/fnparydl.ok
new file mode 100644
index 00000000000..9f79822456c
--- /dev/null
+++ b/gawk-5.0.1/test/fnparydl.ok
@@ -0,0 +1,10 @@
+BEFORE LOOP
+DELETING KEY 1
+DELETING KEY 2
+DELETING KEY 3
+DELETING KEY 4
+DELETING KEY 5
+DELETING KEY 6
+DELETING KEY 7
+AFTER LOOP
+0 elements still in q[]
diff --git a/gawk-5.0.1/test/forcenum.awk b/gawk-5.0.1/test/forcenum.awk
new file mode 100644
index 00000000000..d4ff5d5e47c
--- /dev/null
+++ b/gawk-5.0.1/test/forcenum.awk
@@ -0,0 +1,17 @@
+BEGIN {
+	# make some strnums
+	nf = split("|5apple|NaN|-NaN|+NaN| 6|0x1az|011Q|027", f, "|")
+
+	for (i = 1; i <= nf; i++) {
+		# NaN values on some systems can come out with
+		# a sign in front of them. So instead of using %g to
+		# convert the strnum to a double, do it manually, and
+		# then remove any leading sign so that the test will
+		# work across systems.
+		val = f[i] + 0
+		val = val ""
+		val = tolower(val)
+		sub(/^[-+]/, "", val)
+		printf "[%s] -> %s (type %s)\n", f[i], val, typeof(f[i])
+	}
+}
diff --git a/gawk-5.0.1/test/forcenum.ok b/gawk-5.0.1/test/forcenum.ok
new file mode 100644
index 00000000000..0ad1714f39e
--- /dev/null
+++ b/gawk-5.0.1/test/forcenum.ok
@@ -0,0 +1,9 @@
+[] -> 0 (type string)
+[5apple] -> 5 (type string)
+[NaN] -> 0 (type string)
+[-NaN] -> nan (type strnum)
+[+NaN] -> nan (type strnum)
+[ 6] -> 6 (type strnum)
+[0x1az] -> 26 (type string)
+[011Q] -> 9 (type string)
+[027] -> 23 (type strnum)
diff --git a/gawk-5.0.1/test/fordel.awk b/gawk-5.0.1/test/fordel.awk
new file mode 100644
index 00000000000..58ede20fbd4
--- /dev/null
+++ b/gawk-5.0.1/test/fordel.awk
@@ -0,0 +1,65 @@
+#Date: Mon, 7 Jun 2004 10:40:28 -0500
+#From: mary1john8@earthlink.net
+#To: arnold@skeeve.com
+#Subject: gawk internal errors
+#Message-ID: <20040607154028.GA2457@apollo>
+#
+#Hello,
+#
+#    gawk-3.1.3i internal errors:
+#
+#[1]
+#
+#$> ./gawk 'BEGIN { for (i in a) delete a; }'
+BEGIN { for (i in a) delete a; }
+#gawk: fatal error: internal error
+#Aborted
+#
+#------------------------------------------------------------------
+#--- awkgram.y.orig	2004-06-07 09:42:14.000000000 -0500
+#+++ awkgram.y	2004-06-07 09:45:58.000000000 -0500
+#@@ -387,7 +387,7 @@
+# 		 * Check that the body is a `delete a[i]' statement,
+# 		 * and that both the loop var and array names match.
+# 		 */
+#-		if ($8 != NULL && $8->type == Node_K_delete) {
+#+		if ($8 != NULL && $8->type == Node_K_delete && $8->rnode != NULL) {
+# 			NODE *arr, *sub;
+# 
+# 			assert($8->rnode->type == Node_expression_list);
+#------------------------------------------------------------------
+#
+#
+#[2]
+#
+#$> ./gawk 'BEGIN { printf("%3$*10$.*1$s\n", 20, 10, "hello"); }'
+#gawk: fatal error: internal error
+#Aborted
+#
+#------------------------------------------------------------------
+#--- builtin.c.orig	2004-06-07 10:04:20.000000000 -0500
+#+++ builtin.c	2004-06-07 10:06:08.000000000 -0500
+#@@ -780,7 +780,10 @@
+# 					s1++;
+# 					n0--;
+# 				}
+#-
+#+				if (val >= num_args) {
+#+					toofew = TRUE;
+#+					break;
+#+				}
+# 				arg = the_args[val];
+# 			} else {
+# 				parse_next_arg();
+#------------------------------------------------------------------
+#
+#
+#    Finally, a test for the rewritten get_src_buf():
+#
+#$> AWKBUFSIZE=2 make check
+#
+#I get 3 failed tests. Not sure this is of any interest.
+#
+#
+#Thanks,
+#John
diff --git a/gawk-5.0.1/test/fordel.ok b/gawk-5.0.1/test/fordel.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/fork.awk b/gawk-5.0.1/test/fork.awk
new file mode 100644
index 00000000000..af608ad5225
--- /dev/null
+++ b/gawk-5.0.1/test/fork.awk
@@ -0,0 +1,34 @@
+@load "fork"
+
+BEGIN {
+   fn = ("fork.tmp." PROCINFO["pid"])
+   switch (pid = fork()) {
+   case -1:
+      printf "Error: fork failed with ERRNO %s\n", ERRNO
+      exit 1
+   case 0:
+      # child
+      printf "pid %s ppid %s\n", PROCINFO["pid"], PROCINFO["ppid"] > fn
+      exit 0
+   default:
+      # parent
+      erc = 1
+      if ((rc = wait()) < 0)
+	 printf "Error: wait failed with ERRNO %s\n", ERRNO
+      else if (rc != pid)
+	 printf "Error: wait returned %s instead of child pid %s\n", rc, pid
+      else if ((getline x < fn) != 1)
+	 printf "Error: getline failed on temp file %s\n", fn
+      else {
+	 close(fn)	# required on non-POSIX systems
+	 expected = ("pid " pid " ppid " PROCINFO["pid"])
+	 if (x != expected)
+	    printf "Error: child data (%s) != expected (%s)\n", x, expected
+	 else if ((rc = system("rm  " fn)) != 0)
+	    printf "Error removing temp file %s with ERRNO %s\n", fn, ERRNO
+	 else
+	    erc = 0
+      }
+      exit erc
+   }
+}
diff --git a/gawk-5.0.1/test/fork.ok b/gawk-5.0.1/test/fork.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/fork2.awk b/gawk-5.0.1/test/fork2.awk
new file mode 100644
index 00000000000..a8ae5622803
--- /dev/null
+++ b/gawk-5.0.1/test/fork2.awk
@@ -0,0 +1,36 @@
+@load "fork"
+
+BEGIN {
+   # avoid instantiating PROCINFO prior to the fork
+   switch (pid = fork()) {
+   case -1:
+      printf "Error: fork failed with ERRNO %s\n", ERRNO
+      exit 1
+   case 0:
+      # child
+      fn = ("fork.tmp." PROCINFO["pid"])
+      printf "pid %s ppid %s\n", PROCINFO["pid"], PROCINFO["ppid"] > fn
+      exit 0
+   default:
+      # parent
+      erc = 1
+      fn = ("fork.tmp." pid)
+      if ((rc = wait()) < 0)
+	 printf "Error: wait failed with ERRNO %s\n", ERRNO
+      else if (rc != pid)
+	 printf "Error: wait returned %s instead of child pid %s\n", rc, pid
+      else if ((getline x < fn) != 1)
+	 printf "Error: getline failed on temp file %s\n", fn
+      else {
+	 close(fn)	# needed on non-POSIX systems
+	 expected = ("pid " pid " ppid " PROCINFO["pid"])
+	 if (x != expected)
+	    printf "Error: child data (%s) != expected (%s)\n", x, expected
+	 else if ((rc = system("rm  " fn)) != 0)
+	    printf "Error removing temp file %s with ERRNO %s\n", fn, ERRNO
+	 else
+	    erc = 0
+      }
+      exit erc
+   }
+}
diff --git a/gawk-5.0.1/test/fork2.ok b/gawk-5.0.1/test/fork2.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/forref.awk b/gawk-5.0.1/test/forref.awk
new file mode 100644
index 00000000000..5f9ad350d19
--- /dev/null
+++ b/gawk-5.0.1/test/forref.awk
@@ -0,0 +1,11 @@
+BEGIN {
+	names[1] = "s"
+	names[2] = "m"
+	for (i in names) {
+		x[names[i]] = i
+		print i, names[i], x[names[i]]
+	}
+	print x["s"]
+#	adump(x)
+#	adump(names)
+}
diff --git a/gawk-5.0.1/test/forref.ok b/gawk-5.0.1/test/forref.ok
new file mode 100644
index 00000000000..e8088d01817
--- /dev/null
+++ b/gawk-5.0.1/test/forref.ok
@@ -0,0 +1,3 @@
+1 s 1
+2 m 2
+1
diff --git a/gawk-5.0.1/test/forsimp.awk b/gawk-5.0.1/test/forsimp.awk
new file mode 100644
index 00000000000..880548ba12c
--- /dev/null
+++ b/gawk-5.0.1/test/forsimp.awk
@@ -0,0 +1 @@
+BEGIN { for (print 9; 0;); }
diff --git a/gawk-5.0.1/test/forsimp.ok b/gawk-5.0.1/test/forsimp.ok
new file mode 100644
index 00000000000..ec635144f60
--- /dev/null
+++ b/gawk-5.0.1/test/forsimp.ok
@@ -0,0 +1 @@
+9
diff --git a/gawk-5.0.1/test/fpat1.awk b/gawk-5.0.1/test/fpat1.awk
new file mode 100644
index 00000000000..60c6bca656d
--- /dev/null
+++ b/gawk-5.0.1/test/fpat1.awk
@@ -0,0 +1,22 @@
+BEGIN {
+#	if (t == 0)
+		FPAT = "([^,]+)|(\"[^\"]+\")"
+#	else
+#		FPAT = "([^,]*)|(\"[^\"]+\")"
+}
+FNR == 1 {
+	# This part was added later
+	print $1
+	print $1, $3
+	for (i = 1; i <= NF; i++)
+		print i, $i
+
+	# Reset for original part of test
+	FPAT = "([^,]*)|(\"[^\"]+\")"
+	$0 = $0
+}
+{
+	print "NF =", NF
+	for (i = 1; i <= NF; i++)
+		printf("$%d = <%s>\n", i, $i)
+}
diff --git a/gawk-5.0.1/test/fpat1.in b/gawk-5.0.1/test/fpat1.in
new file mode 100644
index 00000000000..03f2a3f346b
--- /dev/null
+++ b/gawk-5.0.1/test/fpat1.in
@@ -0,0 +1,2 @@
+Robbins,Arnold,"1234 A Pretty Place, NE",Sometown,NY,12345-6789,USA
+Smith,,"1234 A Pretty Place, NE",Sometown,NY,12345-6789,USA
diff --git a/gawk-5.0.1/test/fpat1.ok b/gawk-5.0.1/test/fpat1.ok
new file mode 100644
index 00000000000..c5888e3f6d6
--- /dev/null
+++ b/gawk-5.0.1/test/fpat1.ok
@@ -0,0 +1,25 @@
+Robbins
+Robbins "1234 A Pretty Place, NE"
+1 Robbins
+2 Arnold
+3 "1234 A Pretty Place, NE"
+4 Sometown
+5 NY
+6 12345-6789
+7 USA
+NF = 7
+$1 = <Robbins>
+$2 = <Arnold>
+$3 = <"1234 A Pretty Place, NE">
+$4 = <Sometown>
+$5 = <NY>
+$6 = <12345-6789>
+$7 = <USA>
+NF = 7
+$1 = <Smith>
+$2 = <>
+$3 = <"1234 A Pretty Place, NE">
+$4 = <Sometown>
+$5 = <NY>
+$6 = <12345-6789>
+$7 = <USA>
diff --git a/gawk-5.0.1/test/fpat2.awk b/gawk-5.0.1/test/fpat2.awk
new file mode 100644
index 00000000000..aa9e6be526a
--- /dev/null
+++ b/gawk-5.0.1/test/fpat2.awk
@@ -0,0 +1,11 @@
+BEGIN {
+	FPAT = " "
+	$0 = ""
+	print NF
+
+	$0 = "abc"
+	print NF
+
+	$0 = "a b c"
+	print NF
+}
diff --git a/gawk-5.0.1/test/fpat2.ok b/gawk-5.0.1/test/fpat2.ok
new file mode 100644
index 00000000000..67bbf9c57c5
--- /dev/null
+++ b/gawk-5.0.1/test/fpat2.ok
@@ -0,0 +1,3 @@
+0
+0
+2
diff --git a/gawk-5.0.1/test/fpat3.awk b/gawk-5.0.1/test/fpat3.awk
new file mode 100644
index 00000000000..801bb58ed7c
--- /dev/null
+++ b/gawk-5.0.1/test/fpat3.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	FPAT = "[^,]*"
+
+}
+
+{
+	if (x) NF
+	for (i = 1; i <= 4; ++i)
+		print i, $i
+}
diff --git a/gawk-5.0.1/test/fpat3.in b/gawk-5.0.1/test/fpat3.in
new file mode 100644
index 00000000000..28416a42eea
--- /dev/null
+++ b/gawk-5.0.1/test/fpat3.in
@@ -0,0 +1 @@
+a,b,,c
diff --git a/gawk-5.0.1/test/fpat3.ok b/gawk-5.0.1/test/fpat3.ok
new file mode 100644
index 00000000000..543bb429aa4
--- /dev/null
+++ b/gawk-5.0.1/test/fpat3.ok
@@ -0,0 +1,4 @@
+1 a
+2 b
+3 
+4 c
diff --git a/gawk-5.0.1/test/fpat4.awk b/gawk-5.0.1/test/fpat4.awk
new file mode 100644
index 00000000000..79cd6a7fef7
--- /dev/null
+++ b/gawk-5.0.1/test/fpat4.awk
@@ -0,0 +1,105 @@
+BEGIN {
+	false = 0
+	true = 1
+
+	fpat[1] = "([^,]*)|(\"[^\"]+\")"
+	fpat[2] = fpat[1]
+	fpat[3] = fpat[1]
+	fpat[4] = "aa+"
+	fpat[5] = fpat[4]
+	fpat[6] = "[a-z]"
+
+	data[1] = "Robbins,,Arnold,"
+	data[2] = "Smith,,\"1234 A Pretty Place, NE\",Sometown,NY,12345-6789,USA"
+	data[3] = "Robbins,Arnold,\"1234 A Pretty Place, NE\",Sometown,NY,12345-6789,USA"
+	data[4] = "bbbaaacccdddaaaaaqqqq"
+	data[5] = "bbbaaacccdddaaaaaqqqqa" # should get trailing qqqa
+	data[6] = "aAbBcC"
+
+	for (i = 1; i in data; i++) {
+		printf("Splitting: <%s>\n", data[i])
+		n = mypatsplit(data[i], fields, fpat[i], seps)
+		m = patsplit(data[i], fields2, fpat[i], seps2)
+		print "n =", n, "m =", m
+		if (n != m) {
+			printf("ERROR: counts wrong!\n") > "/dev/stderr"
+			exit 1
+		}
+		for (j = 1; j <= n; j++) {
+			printf("fields[%d] = <%s>\tfields2[%d] = <%s>\n", j, fields[j], j, fields2[j])
+			if (fields[j] != fields2[j]) {
+				printf("ERROR: data %d, field %d mismatch!\n", i, j) > "/dev/stderr"
+				exit 1
+			}
+		}
+		for (j = 0; j in seps; j++) {
+			printf("seps[%d] = <%s>\tseps2[%d] = <%s>\n", j, seps[j], j, seps2[j])
+			if (seps[j] != seps2[j]) {
+				printf("ERROR: data %d, separator %d mismatch!\n", i, j) > "/dev/stderr"
+				exit 1
+			}
+		}
+	}
+}
+
+function mypatsplit(string, array, pattern, seps,
+			eosflag, non_empty, nf) # locals
+{
+	delete array
+	delete seps
+	if (length(string) == 0)
+		return 0
+
+	eosflag = non_empty = false
+	nf = 0
+	while (match(string, pattern)) {
+		if (RLENGTH > 0) {	# easy case
+			non_empty = true
+			if (! (nf in seps)) {
+				if (RSTART == 1)	# match at front of string
+					seps[nf] = ""
+				else
+					seps[nf] = substr(string, 1, RSTART - 1)
+			}
+			array[++nf] = substr(string, RSTART, RLENGTH)
+			string = substr(string, RSTART+RLENGTH)
+			if (length(string) == 0)
+				break
+		} else if (non_empty) {
+			# last match was non-empty, and at the
+			# current character we get a zero length match,
+			# which we don't want, so skip over it
+			non_empty = false
+			seps[nf] = substr(string, 1, 1)
+			string = substr(string, 2)
+		} else {
+			# 0 length match
+			if (! (nf in seps)) {
+				if (RSTART == 1)
+					seps[nf] = ""
+				else
+					seps[nf] = substr(string, 1, RSTART - 1)
+			}
+			array[++nf] = ""
+			if (! non_empty && ! eosflag) { # prev was empty
+				seps[nf] = substr(string, 1, 1)
+			}
+			if (RSTART == 1) {
+				string = substr(string, 2)
+			} else {
+				string = substr(string, RSTART + 1)
+			}
+			non_empty = false
+		}
+		if (length(string) == 0) {
+			if (eosflag)
+				break
+			else
+				eosflag = true
+		}
+	}
+	if (length(string) > 0)
+		seps[nf] = string
+
+	return length(array)
+}
diff --git a/gawk-5.0.1/test/fpat4.ok b/gawk-5.0.1/test/fpat4.ok
new file mode 100644
index 00000000000..b4430aba7cd
--- /dev/null
+++ b/gawk-5.0.1/test/fpat4.ok
@@ -0,0 +1,65 @@
+Splitting: <Robbins,,Arnold,>
+n = 4 m = 4
+fields[1] = <Robbins>	fields2[1] = <Robbins>
+fields[2] = <>	fields2[2] = <>
+fields[3] = <Arnold>	fields2[3] = <Arnold>
+fields[4] = <>	fields2[4] = <>
+seps[0] = <>	seps2[0] = <>
+seps[1] = <,>	seps2[1] = <,>
+seps[2] = <,>	seps2[2] = <,>
+seps[3] = <,>	seps2[3] = <,>
+Splitting: <Smith,,"1234 A Pretty Place, NE",Sometown,NY,12345-6789,USA>
+n = 7 m = 7
+fields[1] = <Smith>	fields2[1] = <Smith>
+fields[2] = <>	fields2[2] = <>
+fields[3] = <"1234 A Pretty Place, NE">	fields2[3] = <"1234 A Pretty Place, NE">
+fields[4] = <Sometown>	fields2[4] = <Sometown>
+fields[5] = <NY>	fields2[5] = <NY>
+fields[6] = <12345-6789>	fields2[6] = <12345-6789>
+fields[7] = <USA>	fields2[7] = <USA>
+seps[0] = <>	seps2[0] = <>
+seps[1] = <,>	seps2[1] = <,>
+seps[2] = <,>	seps2[2] = <,>
+seps[3] = <,>	seps2[3] = <,>
+seps[4] = <,>	seps2[4] = <,>
+seps[5] = <,>	seps2[5] = <,>
+seps[6] = <,>	seps2[6] = <,>
+Splitting: <Robbins,Arnold,"1234 A Pretty Place, NE",Sometown,NY,12345-6789,USA>
+n = 7 m = 7
+fields[1] = <Robbins>	fields2[1] = <Robbins>
+fields[2] = <Arnold>	fields2[2] = <Arnold>
+fields[3] = <"1234 A Pretty Place, NE">	fields2[3] = <"1234 A Pretty Place, NE">
+fields[4] = <Sometown>	fields2[4] = <Sometown>
+fields[5] = <NY>	fields2[5] = <NY>
+fields[6] = <12345-6789>	fields2[6] = <12345-6789>
+fields[7] = <USA>	fields2[7] = <USA>
+seps[0] = <>	seps2[0] = <>
+seps[1] = <,>	seps2[1] = <,>
+seps[2] = <,>	seps2[2] = <,>
+seps[3] = <,>	seps2[3] = <,>
+seps[4] = <,>	seps2[4] = <,>
+seps[5] = <,>	seps2[5] = <,>
+seps[6] = <,>	seps2[6] = <,>
+Splitting: <bbbaaacccdddaaaaaqqqq>
+n = 2 m = 2
+fields[1] = <aaa>	fields2[1] = <aaa>
+fields[2] = <aaaaa>	fields2[2] = <aaaaa>
+seps[0] = <bbb>	seps2[0] = <bbb>
+seps[1] = <cccddd>	seps2[1] = <cccddd>
+seps[2] = <qqqq>	seps2[2] = <qqqq>
+Splitting: <bbbaaacccdddaaaaaqqqqa>
+n = 2 m = 2
+fields[1] = <aaa>	fields2[1] = <aaa>
+fields[2] = <aaaaa>	fields2[2] = <aaaaa>
+seps[0] = <bbb>	seps2[0] = <bbb>
+seps[1] = <cccddd>	seps2[1] = <cccddd>
+seps[2] = <qqqqa>	seps2[2] = <qqqqa>
+Splitting: <aAbBcC>
+n = 3 m = 3
+fields[1] = <a>	fields2[1] = <a>
+fields[2] = <b>	fields2[2] = <b>
+fields[3] = <c>	fields2[3] = <c>
+seps[0] = <>	seps2[0] = <>
+seps[1] = <A>	seps2[1] = <A>
+seps[2] = <B>	seps2[2] = <B>
+seps[3] = <C>	seps2[3] = <C>
diff --git a/gawk-5.0.1/test/fpat5.awk b/gawk-5.0.1/test/fpat5.awk
new file mode 100644
index 00000000000..b508f068e7f
--- /dev/null
+++ b/gawk-5.0.1/test/fpat5.awk
@@ -0,0 +1,8 @@
+BEGIN {
+	FPAT = "([^,]*)|(\"[^\"]+\")"
+	OFS = ";"
+}
+
+p != 0 { print NF }
+
+{ $1 = $1 ; print }
diff --git a/gawk-5.0.1/test/fpat5.in b/gawk-5.0.1/test/fpat5.in
new file mode 100644
index 00000000000..15d874ef378
--- /dev/null
+++ b/gawk-5.0.1/test/fpat5.in
@@ -0,0 +1 @@
+"A","B","C"
diff --git a/gawk-5.0.1/test/fpat5.ok b/gawk-5.0.1/test/fpat5.ok
new file mode 100644
index 00000000000..cc9295ce70d
--- /dev/null
+++ b/gawk-5.0.1/test/fpat5.ok
@@ -0,0 +1 @@
+"A";"B";"C"
diff --git a/gawk-5.0.1/test/fpat6.awk b/gawk-5.0.1/test/fpat6.awk
new file mode 100644
index 00000000000..de7824a4ed5
--- /dev/null
+++ b/gawk-5.0.1/test/fpat6.awk
@@ -0,0 +1,8 @@
+BEGIN {
+		FPAT = "([^,]*)|(\"[^\"]+\")"
+}
+{
+	print "NF =", NF
+	for (i = 1; i <= NF; i++)
+		printf("$%d = <%s>\n", i, $i)
+}
diff --git a/gawk-5.0.1/test/fpat6.in b/gawk-5.0.1/test/fpat6.in
new file mode 100644
index 00000000000..1924cd97524
--- /dev/null
+++ b/gawk-5.0.1/test/fpat6.in
@@ -0,0 +1,13 @@
+,,3
+,,3
+,,a,,b,,
+,,a,,b,,
+"a",,"b"
+
+
+""
+""
+xx
+xx
+,
+,
diff --git a/gawk-5.0.1/test/fpat6.ok b/gawk-5.0.1/test/fpat6.ok
new file mode 100644
index 00000000000..f9c393a1a6b
--- /dev/null
+++ b/gawk-5.0.1/test/fpat6.ok
@@ -0,0 +1,44 @@
+NF = 3
+$1 = <>
+$2 = <>
+$3 = <3>
+NF = 3
+$1 = <>
+$2 = <>
+$3 = <3>
+NF = 7
+$1 = <>
+$2 = <>
+$3 = <a>
+$4 = <>
+$5 = <b>
+$6 = <>
+$7 = <>
+NF = 7
+$1 = <>
+$2 = <>
+$3 = <a>
+$4 = <>
+$5 = <b>
+$6 = <>
+$7 = <>
+NF = 3
+$1 = <"a">
+$2 = <>
+$3 = <"b">
+NF = 0
+NF = 0
+NF = 1
+$1 = <"">
+NF = 1
+$1 = <"">
+NF = 1
+$1 = <xx>
+NF = 1
+$1 = <xx>
+NF = 2
+$1 = <>
+$2 = <>
+NF = 2
+$1 = <>
+$2 = <>
diff --git a/gawk-5.0.1/test/fpatnull.awk b/gawk-5.0.1/test/fpatnull.awk
new file mode 100644
index 00000000000..1d00adf4887
--- /dev/null
+++ b/gawk-5.0.1/test/fpatnull.awk
@@ -0,0 +1,2 @@
+BEGIN { FPAT = "" }
+{ print NF }
diff --git a/gawk-5.0.1/test/fpatnull.in b/gawk-5.0.1/test/fpatnull.in
new file mode 100644
index 00000000000..4b5fa63702d
--- /dev/null
+++ b/gawk-5.0.1/test/fpatnull.in
@@ -0,0 +1 @@
+hello, world
diff --git a/gawk-5.0.1/test/fpatnull.ok b/gawk-5.0.1/test/fpatnull.ok
new file mode 100644
index 00000000000..b1bd38b62a0
--- /dev/null
+++ b/gawk-5.0.1/test/fpatnull.ok
@@ -0,0 +1 @@
+13
diff --git a/gawk-5.0.1/test/fr/LC_MESSAGES/nlstringtest.mo b/gawk-5.0.1/test/fr/LC_MESSAGES/nlstringtest.mo
new file mode 100644
index 0000000000000000000000000000000000000000..72af97e7d0ae7a8a94d1238248c48a06b1dd5a11
GIT binary patch
diff --git a/gawk-5.0.1/test/fsbs.awk b/gawk-5.0.1/test/fsbs.awk
new file mode 100644
index 00000000000..1c6f9d68616
--- /dev/null
+++ b/gawk-5.0.1/test/fsbs.awk
@@ -0,0 +1,2 @@
+BEGIN { FS = "\\" }
+{ print $1, $2}
diff --git a/gawk-5.0.1/test/fsbs.in b/gawk-5.0.1/test/fsbs.in
new file mode 100644
index 00000000000..0a102c32d6c
--- /dev/null
+++ b/gawk-5.0.1/test/fsbs.in
@@ -0,0 +1 @@
+1\2
diff --git a/gawk-5.0.1/test/fsbs.ok b/gawk-5.0.1/test/fsbs.ok
new file mode 100644
index 00000000000..8d04f961a03
--- /dev/null
+++ b/gawk-5.0.1/test/fsbs.ok
@@ -0,0 +1 @@
+1 2
diff --git a/gawk-5.0.1/test/fscaret.awk b/gawk-5.0.1/test/fscaret.awk
new file mode 100644
index 00000000000..134820d7e5d
--- /dev/null
+++ b/gawk-5.0.1/test/fscaret.awk
@@ -0,0 +1,8 @@
+BEGIN {
+	FS="^."
+	OFS="|"
+}
+{
+	$1 = $1
+}
+1
diff --git a/gawk-5.0.1/test/fscaret.in b/gawk-5.0.1/test/fscaret.in
new file mode 100644
index 00000000000..257cc5642cb
--- /dev/null
+++ b/gawk-5.0.1/test/fscaret.in
@@ -0,0 +1 @@
+foo
diff --git a/gawk-5.0.1/test/fscaret.ok b/gawk-5.0.1/test/fscaret.ok
new file mode 100644
index 00000000000..38287d5834b
--- /dev/null
+++ b/gawk-5.0.1/test/fscaret.ok
@@ -0,0 +1 @@
+|oo
diff --git a/gawk-5.0.1/test/fsfwfs.awk b/gawk-5.0.1/test/fsfwfs.awk
new file mode 100644
index 00000000000..beed10a3a0e
--- /dev/null
+++ b/gawk-5.0.1/test/fsfwfs.awk
@@ -0,0 +1 @@
+BEGIN{FIELDWIDTHS="6 6 6 5";OFS=",";FS=FS}{print $1,$2,$3,$4}
diff --git a/gawk-5.0.1/test/fsfwfs.in b/gawk-5.0.1/test/fsfwfs.in
new file mode 100644
index 00000000000..fc10928046f
--- /dev/null
+++ b/gawk-5.0.1/test/fsfwfs.in
@@ -0,0 +1,16 @@
+00000113000 00000000000
+00000275000 00000000000
+00000321334 00000000000
+00000048709 00000010000
+00000117000 00000100000
+00000152000 00000138000
+00000000000 00000150000
+00000189425 00000000000
+00000146128 00000000000
+00000146128 00000000000
+00000146128 00000000000
+00000000000 00000050000
+00000000000 00000050000
+00000000000 00000000000
+00000158014 00000000000
+00000113656 00000000000
diff --git a/gawk-5.0.1/test/fsfwfs.ok b/gawk-5.0.1/test/fsfwfs.ok
new file mode 100644
index 00000000000..36bea48a24f
--- /dev/null
+++ b/gawk-5.0.1/test/fsfwfs.ok
@@ -0,0 +1,16 @@
+00000113000,00000000000,,
+00000275000,00000000000,,
+00000321334,00000000000,,
+00000048709,00000010000,,
+00000117000,00000100000,,
+00000152000,00000138000,,
+00000000000,00000150000,,
+00000189425,00000000000,,
+00000146128,00000000000,,
+00000146128,00000000000,,
+00000146128,00000000000,,
+00000000000,00000050000,,
+00000000000,00000050000,,
+00000000000,00000000000,,
+00000158014,00000000000,,
+00000113656,00000000000,,
diff --git a/gawk-5.0.1/test/fsnul1.awk b/gawk-5.0.1/test/fsnul1.awk
new file mode 100644
index 00000000000..5a1b473b75e
--- /dev/null
+++ b/gawk-5.0.1/test/fsnul1.awk
@@ -0,0 +1,2 @@
+BEGIN { FS = "\0" ; RS = "" }
+{ print $2 }
diff --git a/gawk-5.0.1/test/fsnul1.in b/gawk-5.0.1/test/fsnul1.in
new file mode 100644
index 0000000000000000000000000000000000000000..7dec250cc3cae31a70fe7581d6b90c3bce4a6df8
GIT binary patch
diff --git a/gawk-5.0.1/test/fsnul1.ok b/gawk-5.0.1/test/fsnul1.ok
new file mode 100644
index 00000000000..ab4a98190cf
--- /dev/null
+++ b/gawk-5.0.1/test/fsnul1.ok
@@ -0,0 +1 @@
+ho
diff --git a/gawk-5.0.1/test/fsrs.awk b/gawk-5.0.1/test/fsrs.awk
new file mode 100644
index 00000000000..a0014891a28
--- /dev/null
+++ b/gawk-5.0.1/test/fsrs.awk
@@ -0,0 +1,8 @@
+BEGIN {
+       RS=""; FS="\n";
+       ORS=""; OFS="\n";
+      }
+{
+        split ($2,f," ")
+        print $0;
+}
diff --git a/gawk-5.0.1/test/fsrs.in b/gawk-5.0.1/test/fsrs.in
new file mode 100644
index 00000000000..4b49d81c716
--- /dev/null
+++ b/gawk-5.0.1/test/fsrs.in
@@ -0,0 +1,7 @@
+a b
+c d
+e f
+
+1 2
+3 4
+5 6
diff --git a/gawk-5.0.1/test/fsrs.ok b/gawk-5.0.1/test/fsrs.ok
new file mode 100644
index 00000000000..7dafd658fca
--- /dev/null
+++ b/gawk-5.0.1/test/fsrs.ok
@@ -0,0 +1,5 @@
+a b
+c d
+e f1 2
+3 4
+5 6
\ No newline at end of file
diff --git a/gawk-5.0.1/test/fsspcoln.awk b/gawk-5.0.1/test/fsspcoln.awk
new file mode 100644
index 00000000000..8087c2e5b9c
--- /dev/null
+++ b/gawk-5.0.1/test/fsspcoln.awk
@@ -0,0 +1,41 @@
+# Date: Wed, 08 Dec 2004 12:59:42 +0600
+# From: Alexander Sashnov <asashnov@sw-soft.com>
+# Subject: addon to gawk test suite
+# Sender: asashnov@sashnov.plesk.ru
+# To: "Arnold D. Robbins" <arnold@skeeve.com>
+# Message-id: <lzy8g9xokh.fsf@sashnov.plesk.ru>
+# 
+# 
+# Hello, Arnold.
+# 
+# I'm hit bug on SuSE 9.1 with awk:
+# 
+# vsuse91:~ # echo "a:b:c" | awk '{ print $2 }' 'FS=[ :]'
+# b
+# vsuse91:~ # echo "a:b:c" | awk '{ print $2 }' 'FS=[ :]+'
+# awk: cmd. line:2: fatal: Trailing backslash: /[ :]+/
+# 
+# vsuse91:~ # awk --version
+# GNU Awk 3.1.3
+# 
+# 
+# 
+# But on my Debian machine all OK:
+# 
+# asashnov@sashnov:~$ echo "a:b:c" | awk '{ print $2 }' 'FS=[ :]'
+# b
+# asashnov@sashnov:~$ echo "a:b:c" | awk '{ print $2 }' 'FS=[ :]+'
+# b
+# asashnov@sashnov:~$ awk --version
+# GNU Awk 3.1.4
+# 
+# 
+# Need add test for this sample to gawk test suite for avoid this problems in future.
+# -- 
+# Alexander Sashnov
+# Plesk QA Engineer
+# SWsoft, Inc.
+# E-mail: asashnov@sw-soft.com
+# ICQ UIN: 79404252
+
+{ print $2 }
diff --git a/gawk-5.0.1/test/fsspcoln.in b/gawk-5.0.1/test/fsspcoln.in
new file mode 100644
index 00000000000..af0abb2c935
--- /dev/null
+++ b/gawk-5.0.1/test/fsspcoln.in
@@ -0,0 +1 @@
+a:b:c
diff --git a/gawk-5.0.1/test/fsspcoln.ok b/gawk-5.0.1/test/fsspcoln.ok
new file mode 100644
index 00000000000..61780798228
--- /dev/null
+++ b/gawk-5.0.1/test/fsspcoln.ok
@@ -0,0 +1 @@
+b
diff --git a/gawk-5.0.1/test/fstabplus.awk b/gawk-5.0.1/test/fstabplus.awk
new file mode 100644
index 00000000000..748a44f42aa
--- /dev/null
+++ b/gawk-5.0.1/test/fstabplus.awk
@@ -0,0 +1,2 @@
+BEGIN   { FS = "\t+" }
+        { print $1, $2 }
diff --git a/gawk-5.0.1/test/fstabplus.in b/gawk-5.0.1/test/fstabplus.in
new file mode 100644
index 00000000000..c35ba0a2811
--- /dev/null
+++ b/gawk-5.0.1/test/fstabplus.in
@@ -0,0 +1 @@
+1		2
diff --git a/gawk-5.0.1/test/fstabplus.ok b/gawk-5.0.1/test/fstabplus.ok
new file mode 100644
index 00000000000..8d04f961a03
--- /dev/null
+++ b/gawk-5.0.1/test/fstabplus.ok
@@ -0,0 +1 @@
+1 2
diff --git a/gawk-5.0.1/test/fts.awk b/gawk-5.0.1/test/fts.awk
new file mode 100644
index 00000000000..dea5b6840e0
--- /dev/null
+++ b/gawk-5.0.1/test/fts.awk
@@ -0,0 +1,156 @@
+@load "filefuncs"
+
+BEGIN {
+	Level = 0
+
+	os = ""
+	if (ENVIRON["AWKLIBPATH"] == "sys$disk:[-]") {
+		os = "VMS"
+		system("create/dir/prot=o:rwed [.d1]")
+		system("create/dir/prot=o:rwed [.d2]")
+		system("copy fts.awk [.d1]f1")
+		system("copy fts.awk [.d1]f2")
+		system("copy fts.awk [.d2]f1")
+		system("copy fts.awk [.d2]f2")
+	} else {
+		system("rm -fr d1 d2")
+		system("mkdir d1 d2 ; touch d1/f1 d1/f2 d2/f1 d2/f2")
+	}
+	pathlist[1] = "d1"
+	pathlist[2] = "d2"
+	flags = FTS_PHYSICAL
+	fts(pathlist, flags, data)
+
+	output = "fts.ok"
+	traverse(data)
+	close(output)
+
+	ftswalk(pathlist, data2)
+	output = "_fts"
+	traverse(data2)
+	close(output)
+
+	if (os == "VMS") {
+		system("delete [.d1]*.*;*")
+		system("delete [.d2]*.*;*")
+		system("delete d1.dir;*")
+		system("delete d2.dir;*")
+	} else {
+		system("rm -fr d1 d2")
+	}
+}
+
+function indent(        i)
+{
+	for (i = 1; i <= Level; i++)
+		printf("\t") > output
+}
+
+function sort_traverse(data,	sorted, i)
+{
+	asorti(data, sorted)
+	for (i = 1; i in sorted; i++) {
+		# 5/2015: skip for atime, since there can
+		# occasionally be small differences.
+		if (sorted[i] == "atime")
+			continue
+
+		indent()
+		printf("%s --> %s\n", sorted[i], data[sorted[i]]) > output
+	}
+}
+
+function traverse(data,         i)
+{
+	for (i in data) {
+		if (isarray(data[i])) {
+			indent()
+			printf("%s:\n", i) > output
+
+			Level++
+			if (("mtime" in data[i]) && ! isarray(data[i]["mtime"])) {
+				sort_traverse(data[i])
+			} else {
+				traverse(data[i])
+			}
+			Level--
+#		} else {
+#			JUNK = 1
+#			if (i != "atime") {
+#				# 4/2015: skip for atime, since there can
+#				# occasionally be small differences.
+#				indent()
+#				printf("%s --> %s\n", i, data[i]) > output
+#			}
+		}
+	}
+}
+
+
+function ftswalk(pathlist, data,	i, toppath)
+{
+	delete data
+	for (i = 1; i in pathlist; i++) {
+		toppath = pathlist[i]
+		data[toppath]["junk"]++	# create array
+		delete data[toppath]["junk"]
+		process(pathlist[i], data)
+	}
+}
+
+# enter process with pathname, array for that path already created but
+# empty
+
+function process(pathname, data_array,
+		stat_data, i, direntry, command, shortname)	# locals
+{
+	stat(pathname, stat_data)
+	if (stat_data["type"] == "file") {
+		shortname = strrstr(pathname, "/")
+		data_array["path"] = pathname
+		for (i in stat_data) {
+			if (i == "name")
+				data_array["stat"][i] = shortname
+			else
+				data_array["stat"][i] = stat_data[i]
+		}
+
+		return
+	}
+
+	# stuff for a directory
+
+	data_array[pathname]["."]["path"] = pathname
+	for (i in stat_data)
+		data_array[pathname]["."]["stat"][i] = stat_data[i]
+
+	os = ""
+	if (ENVIRON["AWKLIBPATH"] == "sys$disk:[-]") {
+		os = "VMS"
+		# Command in next section not valid on VMS.
+		return
+	}
+
+	command = ("ls -f " pathname)
+	while ((command | getline direntry) > 0) {
+		if (direntry == "." || direntry == "..")
+			continue
+		data_array[pathname][direntry]["junk"]++
+		delete data_array[pathname][direntry]["junk"]
+		process(pathname "/" direntry,
+			data_array[pathname][direntry])
+	}
+	close(command)
+}
+
+function strrstr(string, delim,		ind)
+{
+	if ((ind = index(string, delim)) == 0)
+		return string
+
+	do {
+		string = substr(string, ind + 1)
+	} while ((ind = index(string, delim)) > 0)
+
+	return string
+}
diff --git a/gawk-5.0.1/test/functab1.awk b/gawk-5.0.1/test/functab1.awk
new file mode 100644
index 00000000000..056926845bc
--- /dev/null
+++ b/gawk-5.0.1/test/functab1.awk
@@ -0,0 +1,3 @@
+BEGIN {
+	delete FUNCTAB 
+}
diff --git a/gawk-5.0.1/test/functab1.ok b/gawk-5.0.1/test/functab1.ok
new file mode 100644
index 00000000000..2a60a4cb50d
--- /dev/null
+++ b/gawk-5.0.1/test/functab1.ok
@@ -0,0 +1,2 @@
+gawk: functab1.awk:3: fatal: `delete' is not allowed with FUNCTAB
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/functab2.awk b/gawk-5.0.1/test/functab2.awk
new file mode 100644
index 00000000000..9a07dfc3bc7
--- /dev/null
+++ b/gawk-5.0.1/test/functab2.awk
@@ -0,0 +1,8 @@
+function foo()
+{
+	print "foo!"
+}
+
+BEGIN {
+	FUNCTAB["a"] = "something"
+}
diff --git a/gawk-5.0.1/test/functab2.ok b/gawk-5.0.1/test/functab2.ok
new file mode 100644
index 00000000000..32b07ad3419
--- /dev/null
+++ b/gawk-5.0.1/test/functab2.ok
@@ -0,0 +1,2 @@
+gawk: functab2.awk:7: fatal: cannot assign to elements of FUNCTAB
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/functab3.awk b/gawk-5.0.1/test/functab3.awk
new file mode 100644
index 00000000000..98fa49b1588
--- /dev/null
+++ b/gawk-5.0.1/test/functab3.awk
@@ -0,0 +1,10 @@
+function foo()
+{
+	print "foo!"
+}
+
+BEGIN {
+	x = FUNCTAB["foo"]
+	print "x =", x
+	@x()
+}
diff --git a/gawk-5.0.1/test/functab3.ok b/gawk-5.0.1/test/functab3.ok
new file mode 100644
index 00000000000..66f53d72447
--- /dev/null
+++ b/gawk-5.0.1/test/functab3.ok
@@ -0,0 +1,2 @@
+x = foo
+foo!
diff --git a/gawk-5.0.1/test/functab4.awk b/gawk-5.0.1/test/functab4.awk
new file mode 100644
index 00000000000..196fcc6db48
--- /dev/null
+++ b/gawk-5.0.1/test/functab4.awk
@@ -0,0 +1,30 @@
+@load "filefuncs"
+
+function foo()
+{
+	print "foo!"
+}
+
+BEGIN {
+	f = FUNCTAB["foo"]
+	@f()
+
+	ret1 = stat(".", data1)
+	print "ret1 =", ret1
+
+	f = "stat"
+	ret2 = @f(".", data2)
+	print "ret2 =", ret2
+
+	problem = 0
+	for (i in data1) {
+		if (! isarray(data1[i])) {
+#			print i, data1[i]
+			if (! (i in data2) || data1[i] != data2[i]) {
+				printf("mismatch element \"%s\"\n", i)
+				problems++
+			}
+		}
+	}
+	print(problems ? (problems+0) "encountered" : "no problems encountered")
+}
diff --git a/gawk-5.0.1/test/functab4.ok b/gawk-5.0.1/test/functab4.ok
new file mode 100644
index 00000000000..2b76cd88e11
--- /dev/null
+++ b/gawk-5.0.1/test/functab4.ok
@@ -0,0 +1,4 @@
+foo!
+ret1 = 0
+ret2 = 0
+no problems encountered
diff --git a/gawk-5.0.1/test/funlen.awk b/gawk-5.0.1/test/funlen.awk
new file mode 100644
index 00000000000..e881fcbff4d
--- /dev/null
+++ b/gawk-5.0.1/test/funlen.awk
@@ -0,0 +1,69 @@
+# Date: Sat, 15 Mar 2008 16:21:19 +0100
+# From: Hermann Peifer <peifer@gmx.net>
+# Subject: [Fwd: Gawk length(array) bug]
+# To: bug-gawk@gnu.org
+# Cc: Aharon Robbins <arnold@skeeve.com>
+# Message-id: <47DBE96F.1060406@gmx.net>
+# 
+# See below. Regards, Hermann
+# 
+# -------- Original Message --------
+# Subject: Re: Gawk length(array) question
+# Date: Sat, 15 Mar 2008 08:02:03 -0500
+# From: Ed Morton <morton@lsupcaemnt.com>
+# Newsgroups: comp.lang.awk
+# References: <47DBAE29.4050709@gmx.eu>
+# 
+# On 3/15/2008 6:08 AM, Hermann Peifer wrote:
+# > Hi All,
+# > 
+# > The Gawk man page says:
+# >  > Starting with version 3.1.5, as a non-standard extension,
+# >  > with an array  argument, length() returns the number
+# >  > of elements in the array.
+# > 
+# > It looks like Gawk's length(array) extension does not work inside 
+# > functions. Is this a bug or feature or am I missing something? See the 
+# > example below. I am using GNU Awk 3.1.6
+# > 
+# > $ cat testdata
+# > CD NAME
+# > AT Austria
+# > BG Bulgaria
+# > CH Switzerland
+# > DE Germany
+# > EE Estonia
+# > FR France
+# > GR Greece
+# > 
+# > $ cat test.awk
+# > 
+# Populate array
+NR > 1 { array[$1] = $2 }
+
+# Print array length and call function A
+END { print "array:",length(array) ; A(array) }
+
+function A(array_A) { print "array_A:", length(array_A) }
+# > 
+# > $ gawk -f test.awk testdata
+# > array: 7
+# > gawk: test.awk:8: (FILENAME=data FNR=8) fatal: attempt to use array 
+# > `array_A (from array)' in a scalar context
+# > 
+# > BTW, there is no such error if I have asort(array_A) or asorti(array_A) 
+# > inside the function.
+# > 
+# > Hermann
+# 
+# I get the same result with gawk 3.1.6 for cygwin. Obviously you can work
+# around
+# it since asort() returns the number of elements in an array just like
+# length()
+# is supposed to (or "for (i in array) lgth++" if you don't want to be
+# gawk-specific) but it does seem like a bug. Anyone know if there's a list of
+# known gawk bugs on-line somewhere?
+# 
+# 	Ed.
+# 
+# 
diff --git a/gawk-5.0.1/test/funlen.in b/gawk-5.0.1/test/funlen.in
new file mode 100644
index 00000000000..d0e0b04fa7d
--- /dev/null
+++ b/gawk-5.0.1/test/funlen.in
@@ -0,0 +1,8 @@
+CD NAME
+AT Austria
+BG Bulgaria
+CH Switzerland
+DE Germany
+EE Estonia
+FR France
+GR Greece
diff --git a/gawk-5.0.1/test/funlen.ok b/gawk-5.0.1/test/funlen.ok
new file mode 100644
index 00000000000..2e2ba9df6e7
--- /dev/null
+++ b/gawk-5.0.1/test/funlen.ok
@@ -0,0 +1,2 @@
+array: 7
+array_A: 7
diff --git a/gawk-5.0.1/test/funsemnl.awk b/gawk-5.0.1/test/funsemnl.awk
new file mode 100644
index 00000000000..6b39dca518e
--- /dev/null
+++ b/gawk-5.0.1/test/funsemnl.awk
@@ -0,0 +1,3 @@
+# make sure that ; + \n at end after function works
+function foo() { print "foo" } ;
+BEGIN { foo() }
diff --git a/gawk-5.0.1/test/funsemnl.ok b/gawk-5.0.1/test/funsemnl.ok
new file mode 100644
index 00000000000..257cc5642cb
--- /dev/null
+++ b/gawk-5.0.1/test/funsemnl.ok
@@ -0,0 +1 @@
+foo
diff --git a/gawk-5.0.1/test/funsmnam.awk b/gawk-5.0.1/test/funsmnam.awk
new file mode 100644
index 00000000000..1e8ca50650c
--- /dev/null
+++ b/gawk-5.0.1/test/funsmnam.awk
@@ -0,0 +1,6 @@
+function foo( \
+	foo)
+{
+	print foo
+}
+{ foo() }
diff --git a/gawk-5.0.1/test/funsmnam.ok b/gawk-5.0.1/test/funsmnam.ok
new file mode 100644
index 00000000000..cce0d275841
--- /dev/null
+++ b/gawk-5.0.1/test/funsmnam.ok
@@ -0,0 +1,2 @@
+gawk: funsmnam.awk:2: error: function `foo': can't use function name as parameter name
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/funstack.awk b/gawk-5.0.1/test/funstack.awk
new file mode 100644
index 00000000000..95456903d4f
--- /dev/null
+++ b/gawk-5.0.1/test/funstack.awk
@@ -0,0 +1,981 @@
+### ====================================================================
+###  @Awk-file{
+###     author          = "Nelson H. F. Beebe",
+###     version         = "1.00",
+###     date            = "09 October 1996",
+###     time            = "15:57:06 MDT",
+###     filename        = "journal-toc.awk",
+###     address         = "Center for Scientific Computing
+###                        Department of Mathematics
+###                        University of Utah
+###                        Salt Lake City, UT 84112
+###                        USA",
+###     telephone       = "+1 801 581 5254",
+###     FAX             = "+1 801 581 4148",
+###     URL             = "http://www.math.utah.edu/~beebe",
+###     checksum        = "25092 977 3357 26493",
+###     email           = "beebe@math.utah.edu (Internet)",
+###     codetable       = "ISO/ASCII",
+###     keywords        = "BibTeX, bibliography, HTML, journal table of
+###                        contents",
+###     supported       = "yes",
+###     docstring       = "Create a journal cover table of contents from
+###                        <at>Article{...} entries in a journal BibTeX
+###                        .bib file for checking the bibliography
+###                        database against the actual journal covers.
+###                        The output can be either plain text, or HTML.
+###
+###                        Usage:
+###                            bibclean -max-width 0 BibTeX-file(s) | \
+###                                bibsort -byvolume | \
+###                                awk -f journal-toc.awk \
+###                                    [-v HTML=nnn] [-v INDENT=nnn] \
+###                                    [-v BIBFILEURL=url] >foo.toc
+###
+###                            or if the bibliography is already sorted
+###                            by volume,
+###
+###                            bibclean -max-width 0 BibTeX-file(s) | \
+###                                awk -f journal-toc.awk \
+###                                    [-v HTML=nnn] [-v INDENT=nnn] \
+###                                    [-v BIBFILEURL=url] >foo.toc
+###
+###                        A non-zero value of the command-line option,
+###                        HTML=nnn, results in HTML output instead of
+###                        the default plain ASCII text (corresponding
+###                        to HTML=0).  The
+###
+###                        The INDENT=nnn command-line option specifies
+###                        the number of blanks to indent each logical
+###                        level of HTML.  The default is INDENT=4.
+###                        INDENT=0 suppresses indentation.  The INDENT
+###                        option has no effect when the default HTML=0
+###                        (plain text output) option is in effect.
+###
+###                        When HTML output is selected, the
+###                        BIBFILEURL=url command-line option provides a
+###                        way to request hypertext links from table of
+###                        contents page numbers to the complete BibTeX
+###                        entry for the article.  These links are
+###                        created by appending a sharp (#) and the
+###                        citation label to the BIBFILEURL value, which
+###                        conforms with the practice of
+###                        bibtex-to-html.awk.
+###
+###                        The HTML output form may be useful as a more
+###                        compact representation of journal article
+###                        bibliography data than the original BibTeX
+###                        file provides.  Of course, the
+###                        table-of-contents format provides less
+###                        information, and is considerably more
+###                        troublesome for a computer program to parse.
+###
+###                        When URL key values are provided, they will
+###                        be used to create hypertext links around
+###                        article titles.  This supports journals that
+###                        provide article contents on the World-Wide
+###                        Web.
+###
+###                        For parsing simplicity, this program requires
+###                        that BibTeX
+###
+###                            key = "value"
+###
+###                        and
+###
+###                            @String{name = "value"}
+###
+###                        specifications be entirely contained on
+###                        single lines, which is readily provided by
+###                        the `bibclean -max-width 0' filter.  It also
+###                        requires that bibliography entries begin and
+###                        end at the start of a line, and that
+###                        quotation marks, rather than balanced braces,
+###                        delimit string values.  This is a
+###                        conventional format that again can be
+###                        guaranteed by bibclean.
+###
+###                        This program requires `new' awk, as described
+###                        in the book
+###
+###                            Alfred V. Aho, Brian W. Kernighan, and
+###                            Peter J. Weinberger,
+###                            ``The AWK Programming Language'',
+###                            Addison-Wesley (1988), ISBN
+###                            0-201-07981-X,
+###
+###                        such as provided by programs named (GNU)
+###                        gawk, nawk, and recent AT&T awk.
+###
+###                        The checksum field above contains a CRC-16
+###                        checksum as the first value, followed by the
+###                        equivalent of the standard UNIX wc (word
+###                        count) utility output of lines, words, and
+###                        characters.  This is produced by Robert
+###                        Solovay's checksum utility.",
+###  }
+### ====================================================================
+
+BEGIN						{ initialize() }
+
+/^ *@ *[Ss][Tt][Rr][Ii][Nn][Gg] *\{/		{ do_String(); next }
+
+/^ *@ *[Pp][Rr][Ee][Aa][Mm][Bb][Ll][Ee]/	{ next }
+
+/^ *@ *[Aa][Rr][Tt][Ii][Cc][Ll][Ee]/		{ do_Article(); next }
+
+/^ *@/						{ do_Other(); next }
+
+/^ *author *= *\"/ 				{ do_author(); next }
+
+/^ *journal *= */				{ do_journal(); next }
+
+/^ *volume *= *\"/				{ do_volume(); next }
+
+/^ *number *= *\"/				{ do_number(); next }
+
+/^ *year *= *\"/				{ do_year(); next }
+
+/^ *month *= */					{ do_month(); next }
+
+/^ *title *= *\"/				{ do_title(); next }
+
+/^ *pages *= *\"/				{ do_pages(); next }
+
+/^ *URL *= *\"/					{ do_URL(); next }
+
+/^ *} *$/					{ if (In_Article) do_end_entry(); next }
+
+END						{ terminate() }
+
+
+########################################################################
+# NB: The programming conventions for variables in this program are:   #
+#	UPPERCASE		global constants and user options      #
+#	Initialuppercase	global variables                       #
+#	lowercase		local variables                        #
+# Any deviation is an error!                                           #
+########################################################################
+
+
+function do_Article()
+{
+	In_Article = 1
+
+	Citation_label = $0
+	sub(/^[^\{]*\{/,"",Citation_label)
+	sub(/ *, *$/,"",Citation_label)
+
+	Author = ""
+        Title = ""
+        Journal = ""
+        Volume = ""
+        Number = ""
+        Month = ""
+        Year = ""
+        Pages = ""
+        Url = ""
+}
+
+
+function do_author()
+{
+	Author = TeX_to_HTML(get_value($0))
+}
+
+
+function do_end_entry( k,n,parts)
+{
+	n = split(Author,parts," and ")
+	if (Last_number != Number)
+		do_new_issue()
+	for (k = 1; k < n; ++k)
+		print_toc_line(parts[k] " and", "", "")
+	Title_prefix = html_begin_title()
+	Title_suffix = html_end_title()
+	if (html_length(Title) <= (MAX_TITLE_CHARS + MIN_LEADERS)) # complete title fits on line
+		print_toc_line(parts[n], Title, html_begin_pages() Pages html_end_pages())
+	else			# need to split long title over multiple lines
+		do_long_title(parts[n], Title, html_begin_pages() Pages html_end_pages())
+}
+
+
+function do_journal()
+{
+	if ($0 ~ /[=] *"/)	# have journal = "quoted journal name",
+		Journal = get_value($0)
+	else			# have journal = journal-abbreviation,
+	{
+        	Journal = get_abbrev($0)
+		if (Journal in String) # replace abbrev by its expansion
+			Journal = String[Journal]
+	}
+	gsub(/\\-/,"",Journal)	# remove discretionary hyphens
+}
+
+
+function do_long_title(author,title,pages, last_title,n)
+{
+	title = trim(title)			# discard leading and trailing space
+	while (length(title) > 0)
+	{
+		n = html_breakpoint(title,MAX_TITLE_CHARS+MIN_LEADERS)
+		last_title = substr(title,1,n)
+		title = substr(title,n+1)
+		sub(/^ +/,"",title)		# discard any leading space
+		print_toc_line(author, last_title, (length(title) == 0) ? pages : "")
+		author = ""
+	}
+}
+
+
+function do_month( k,n,parts)
+{
+	Month = ($0 ~ /[=] *"/) ? get_value($0) : get_abbrev($0)
+	gsub(/[\"]/,"",Month)
+	gsub(/ *# *\\slash *# */," / ",Month)
+	gsub(/ *# *-+ *# */," / ",Month)
+	n = split(Month,parts," */ *")
+	Month = ""
+	for (k = 1; k <= n; ++k)
+		Month = Month ((k > 1) ? " / " : "") \
+			((parts[k] in Month_expansion) ? Month_expansion[parts[k]] : parts[k])
+}
+
+
+function do_new_issue()
+{
+	Last_number = Number
+	if (HTML)
+	{
+		if (Last_volume != Volume)
+		{
+			Last_volume = Volume
+			print_line(prefix(2) "<BR>")
+		}
+		html_end_toc()
+		html_begin_issue()
+		print_line(prefix(2) Journal "<BR>")
+	}
+	else
+	{
+		print_line("")
+		print_line(Journal)
+	}
+
+	print_line(strip_html(vol_no_month_year()))
+
+	if (HTML)
+	{
+		html_end_issue()
+		html_toc_entry()
+		html_begin_toc()
+	}
+	else
+		print_line("")
+}
+
+
+function do_number()
+{
+	Number = get_value($0)
+}
+
+
+function do_Other()
+{
+	In_Article = 0
+}
+
+
+function do_pages()
+{
+	Pages = get_value($0)
+	sub(/--[?][?]/,"",Pages)
+}
+
+
+function do_String()
+{
+	sub(/^[^\{]*\{/,"",$0)	# discard up to and including open brace
+	sub(/\} *$/,"",$0)	# discard from optional whitespace and trailing brace to end of line
+	String[get_key($0)] = get_value($0)
+}
+
+
+function do_title()
+{
+	Title = TeX_to_HTML(get_value($0))
+}
+
+
+function do_URL( parts)
+{
+	Url = get_value($0)
+	split(Url,parts,"[,;]")			# in case we have multiple URLs
+	Url = trim(parts[1])
+}
+
+
+function do_volume()
+{
+	Volume = get_value($0)
+}
+
+
+function do_year()
+{
+	Year = get_value($0)
+}
+
+
+function get_abbrev(s)
+{	# return abbrev from ``key = abbrev,''
+	sub(/^[^=]*= */,"",s)	# discard text up to start of non-blank value
+	sub(/ *,? *$/,"",s)	# discard trailing optional whitspace, quote,
+				# optional comma, and optional space
+	return (s)
+}
+
+
+function get_key(s)
+{	# return kay from ``key = "value",''
+	sub(/^ */,"",s)		# discard leading space
+	sub(/ *=.*$/,"",s)	# discard everthing after key
+
+	return (s)
+}
+
+
+function get_value(s)
+{	# return value from ``key = "value",''
+	sub(/^[^\"]*\" */,"",s)	# discard text up to start of non-blank value
+	sub(/ *\",? *$/,"",s)	# discard trailing optional whitspace, quote,
+				# optional comma, and optional space
+	return (s)
+}
+
+
+function html_accents(s)
+{
+	if (index(s,"\\") > 0)			# important optimization
+	{
+		# Convert common lower-case accented letters according to the
+		# table on p. 169 of in Peter Flynn's ``The World Wide Web
+		# Handbook'', International Thomson Computer Press, 1995, ISBN
+		# 1-85032-205-8.  The official table of ISO Latin 1 SGML
+		# entities used in HTML can be found in the file
+		# /usr/local/lib/html-check/lib/ISOlat1.sgml (your path
+		# may differ).
+
+		gsub(/{\\\a}/,	"\\&agrave;",	s)
+		gsub(/{\\'a}/,	"\\&aacute;",	s)
+		gsub(/{\\[\^]a}/,"\\&acirc;",	s)
+		gsub(/{\\~a}/,	"\\&atilde;",	s)
+		gsub(/{\\\"a}/,	"\\&auml;",	s)
+		gsub(/{\\aa}/,	"\\&aring;",	s)
+		gsub(/{\\ae}/,	"\\&aelig;",	s)
+
+		gsub(/\{\\c\{c\}\}/,"\\&ccedil;",	s)
+
+		gsub(/\{\\\e\}/,	"\\&egrave;",	s)
+		gsub(/\{\\'e\}/,	"\\&eacute;",	s)
+		gsub(/\{\\[\^]e\}/,"\\&ecirc;",	s)
+		gsub(/\{\\\"e\}/,	"\\&euml;",	s)
+
+		gsub(/\{\\\i\}/,	"\\&igrave;",	s)
+		gsub(/\{\\'i\}/,	"\\&iacute;",	s)
+		gsub(/\{\\[\^]i\}/,"\\&icirc;",	s)
+		gsub(/\{\\\"i\}/,	"\\&iuml;",	s)
+
+		# ignore eth and thorn
+
+		gsub(/\{\\~n\}/,	"\\&ntilde;",	s)
+
+		gsub(/\{\\\o\}/,	"\\&ograve;",	s)
+		gsub(/\{\\'o\}/,	"\\&oacute;",	s)
+		gsub(/\{\\[\^]o\}/, "\\&ocirc;",	s)
+		gsub(/\{\\~o\}/,	"\\&otilde;",	s)
+		gsub(/\{\\\"o\}/,	"\\&ouml;",	s)
+		gsub(/\{\\o\}/,	"\\&oslash;",	s)
+
+		gsub(/\{\\\u\}/,	"\\&ugrave;",	s)
+		gsub(/\{\\'u\}/,	"\\&uacute;",	s)
+		gsub(/\{\\[\^]u\}/,"\\&ucirc;",	s)
+		gsub(/\{\\\"u\}/,	"\\&uuml;",	s)
+
+		gsub(/\{\\'y\}/,	"\\&yacute;",	s)
+		gsub(/\{\\\"y\}/,	"\\&yuml;",	s)
+
+		# Now do the same for upper-case accents
+
+		gsub(/\{\\\A\}/,	"\\&Agrave;",	s)
+		gsub(/\{\\'A\}/,	"\\&Aacute;",	s)
+		gsub(/\{\\[\^]A\}/,	"\\&Acirc;",	s)
+		gsub(/\{\\~A\}/,	"\\&Atilde;",	s)
+		gsub(/\{\\\"A\}/,	"\\&Auml;",	s)
+		gsub(/\{\\AA\}/,	"\\&Aring;",	s)
+		gsub(/\{\\AE\}/,	"\\&AElig;",	s)
+
+		gsub(/\{\\c\{C\}\}/,"\\&Ccedil;",	s)
+
+		gsub(/\{\\\e\}/,	"\\&Egrave;",	s)
+		gsub(/\{\\'E\}/,	"\\&Eacute;",	s)
+		gsub(/\{\\[\^]E\}/,	"\\&Ecirc;",	s)
+		gsub(/\{\\\"E\}/,	"\\&Euml;",	s)
+
+		gsub(/\{\\\I\}/,	"\\&Igrave;",	s)
+		gsub(/\{\\'I\}/,	"\\&Iacute;",	s)
+		gsub(/\{\\[\^]I\}/,	"\\&Icirc;",	s)
+		gsub(/\{\\\"I\}/,	"\\&Iuml;",	s)
+
+		# ignore eth and thorn
+
+		gsub(/\{\\~N\}/,	"\\&Ntilde;",	s)
+
+		gsub(/\{\\\O\}/,	"\\&Ograve;",	s)
+		gsub(/\{\\'O\}/,	"\\&Oacute;",	s)
+		gsub(/\{\\[\^]O\}/,	"\\&Ocirc;",	s)
+		gsub(/\{\\~O\}/,	"\\&Otilde;",	s)
+		gsub(/\{\\\"O\}/,	"\\&Ouml;",	s)
+		gsub(/\{\\O\}/,	"\\&Oslash;",	s)
+
+		gsub(/\{\\\U\}/,	"\\&Ugrave;",	s)
+		gsub(/\{\\'U\}/,	"\\&Uacute;",	s)
+		gsub(/\{\\[\^]U\}/,	"\\&Ucirc;",	s)
+		gsub(/\{\\\"U\}/,	"\\&Uuml;",	s)
+
+		gsub(/\{\\'Y\}/,	"\\&Yacute;",	s)
+
+		gsub(/\{\\ss\}/,	"\\&szlig;",	s)
+
+		# Others not mentioned in Flynn's book
+		gsub(/\{\\'\\i\}/,"\\&iacute;",	s)
+		gsub(/\{\\'\\j\}/,"j",		s)
+	}
+	return (s)
+}
+
+
+function html_begin_issue()
+{
+	print_line("")
+	print_line(prefix(2) "<HR>")
+	print_line("")
+	print_line(prefix(2) "<H1>")
+	print_line(prefix(3) "<A NAME=\"" html_label() "\">")
+}
+
+
+function html_begin_pages()
+{
+	return ((HTML && (BIBFILEURL != "")) ? ("<A HREF=\"" BIBFILEURL "#" Citation_label "\">") : "")
+}
+
+
+function html_begin_pre()
+{
+	In_PRE = 1
+	print_line("<PRE>")
+}
+
+
+function html_begin_title()
+{
+	return ((HTML && (Url != "")) ? ("<A HREF=\"" Url "\">") : "")
+}
+
+
+function html_begin_toc()
+{
+	html_end_toc()
+	html_begin_pre()
+}
+
+
+function html_body( k)
+{
+	for (k = 1; k <= BodyLines; ++k)
+		print Body[k]
+}
+
+function html_breakpoint(title,maxlength, break_after,k)
+{
+	# Return the largest character position in title AFTER which we
+	# can break the title across lines, without exceeding maxlength
+	# visible characters.
+	if (html_length(title) > maxlength)	# then need to split title across lines
+	{
+		# In the presence of HTML markup, the initialization of
+		# k here is complicated, because we need to advance it
+		# until html_length(title) is at least maxlength,
+		# without invoking the expensive html_length() function
+		# too frequently.  The need to split the title makes the
+		# alternative of delayed insertion of HTML markup much
+		# more complicated.
+		break_after = 0
+		for (k = min(maxlength,length(title)); k < length(title); ++k)
+		{
+			if (substr(title,k+1,1) == " ")
+			{		# could break after position k
+				if (html_length(substr(title,1,k)) <= maxlength)
+					break_after = k
+				else	# advanced too far, retreat back to last break_after
+					break
+			}
+		}
+		if (break_after == 0)		# no breakpoint found by forward scan
+		{				# so switch to backward scan
+			for (k = min(maxlength,length(title)) - 1; \
+				(k > 0) && (substr(title,k+1,1) != " "); --k)
+				;		# find space at which to break title
+			if (k < 1)		# no break point found
+				k = length(title) # so must print entire string
+		}
+		else
+			k = break_after
+	}
+	else					# title fits on one line
+		k = length(title)
+	return (k)
+}
+
+
+
+function html_end_issue()
+{
+	print_line(prefix(3) "</A>")
+	print_line(prefix(2) "</H1>")
+}
+
+
+function html_end_pages()
+{
+	return ((HTML && (BIBFILEURL != "")) ? "</A>" : "")
+}
+
+
+function html_end_pre()
+{
+	if (In_PRE)
+	{
+		print_line("</PRE>")
+		In_PRE = 0
+	}
+}
+
+
+function html_end_title()
+{
+	return ((HTML && (Url != "")) ? "</A>" : "")
+}
+
+
+function html_end_toc()
+{
+	html_end_pre()
+}
+
+
+function html_fonts(s, arg,control_word,k,level,n,open_brace)
+{
+	open_brace = index(s,"{")
+	if (open_brace > 0)			# important optimization
+	{
+		level = 1
+		for (k = open_brace + 1; (level != 0) && (k <= length(s)); ++k)
+		{
+			if (substr(s,k,1) == "{")
+				level++
+			else if (substr(s,k,1) == "}")
+				level--
+		}
+
+		# {...} is now found at open_brace ... (k-1)
+		for (control_word in Font_decl_map)	# look for {\xxx ...}
+		{
+			if (substr(s,open_brace+1,length(control_word)+1) ~ \
+				("\\" control_word "[^A-Za-z]"))
+			{
+				n = open_brace + 1 + length(control_word)
+				arg = trim(substr(s,n,k - n))
+				if (Font_decl_map[control_word] == "toupper") # arg -> ARG
+					arg = toupper(arg)
+				else if (Font_decl_map[control_word] != "") # arg -> <TAG>arg</TAG>
+					arg = "<" Font_decl_map[control_word] ">" arg "</" Font_decl_map[control_word] ">"
+				return (substr(s,1,open_brace-1) arg html_fonts(substr(s,k)))
+			}
+		}
+		for (control_word in Font_cmd_map)	# look for \xxx{...}
+		{
+			if (substr(s,open_brace - length(control_word),length(control_word)) ~ \
+				("\\" control_word))
+			{
+				n = open_brace + 1
+				arg = trim(substr(s,n,k - n))
+				if (Font_cmd_map[control_word] == "toupper") # arg -> ARG
+					arg = toupper(arg)
+				else if (Font_cmd_map[control_word] != "") # arg -> <TAG>arg</TAG>
+					arg = "<" Font_cmd_map[control_word] ">" arg "</" Font_cmd_map[control_word] ">"
+				n = open_brace - length(control_word) - 1
+				return (substr(s,1,n) arg html_fonts(substr(s,k)))
+			}
+		}
+	}
+	return (s)
+}
+
+
+function html_header()
+{
+	USER = ENVIRON["USER"]
+	if (USER == "")
+	    USER = ENVIRON["LOGNAME"]
+	if (USER == "")
+	    USER = "????"
+	"hostname" | getline HOSTNAME
+	"date" | getline DATE
+	("ypcat passwd | grep '^" USER ":' | awk -F: '{print $5}'") | getline PERSONAL_NAME
+	if (PERSONAL_NAME == "")
+	    ("grep  '^" USER ":' /etc/passwd | awk -F: '{print $5}'") | getline PERSONAL_NAME
+
+
+	print "<!-- WARNING: Do NOT edit this file.  It was converted from -->"
+	print "<!-- BibTeX format to HTML by journal-toc.awk version " VERSION_NUMBER " " VERSION_DATE " -->"
+	print "<!-- on " DATE " -->"
+	print "<!-- for " PERSONAL_NAME " (" USER "@" HOSTNAME ") -->"
+	print ""
+	print ""
+	print "<!DOCTYPE HTML public \"-//IETF//DTD HTML//EN\">"
+	print ""
+	print "<HTML>"
+	print prefix(1) "<HEAD>"
+	print prefix(2) "<TITLE>"
+	print prefix(3)  Journal
+	print prefix(2) "</TITLE>"
+	print prefix(2) "<LINK REV=\"made\" HREF=\"mailto:" USER "@" HOSTNAME "\">"
+	print prefix(1) "</HEAD>"
+	print ""
+	print prefix(1) "<BODY>"
+}
+
+
+function html_label( label)
+{
+	label = Volume "(" Number "):" Month ":" Year
+	# gsub(/[^A-Za-z0-9():,;.\/\-]/,"",label)
+	gsub(/[^[:alnum:]():,;.\/\-]/,"",label)
+	return (label)
+}
+
+
+function html_length(s)
+{	# Return visible length of s, ignoring any HTML markup
+	if (HTML)
+	{
+		gsub(/<\/?[^>]*>/,"",s)		# remove SGML tags
+		# gsub(/&[A-Za-z0-9]+;/,"",s)	# remove SGML entities
+		gsub(/&[[:alnum:]]+;/,"",s)	# remove SGML entities
+	}
+	return (length(s))
+}
+
+
+function html_toc()
+{
+	print prefix(2) "<H1>"
+	print prefix(3) "Table of contents for issues of " Journal
+	print prefix(2) "</H1>"
+	print HTML_TOC
+}
+
+
+function html_toc_entry()
+{
+	HTML_TOC = HTML_TOC "        <A HREF=\"#" html_label() "\">"
+	HTML_TOC = HTML_TOC vol_no_month_year()
+	HTML_TOC = HTML_TOC "</A><BR>" "\n"
+}
+
+
+function html_trailer()
+{
+	html_end_pre()
+	print prefix(1) "</BODY>"
+	print "</HTML>"
+}
+
+
+function initialize()
+{
+	# NB: Update these when the program changes
+	VERSION_DATE = "[09-Oct-1996]"
+	VERSION_NUMBER = "1.00"
+
+	HTML = (HTML == "") ? 0 : (0 + HTML)
+
+	if (INDENT == "")
+		INDENT = 4
+
+	if (HTML == 0)
+		INDENT = 0	# indentation suppressed in ASCII mode
+
+	LEADERS = " . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ."
+
+	MAX_TITLE_CHARS = 36	# 36 produces a 79-char output line when there is
+				# just an initial page number.  If this is
+				# increased, the LEADERS string may need to be
+				# lengthened.
+
+	MIN_LEADERS = 4		# Minimum number of characters from LEADERS
+				# required when leaders are used.  The total
+				# number of characters that can appear in a
+				# title line is MAX_TITLE_CHARS + MIN_LEADERS.
+				# Leaders are omitted when the title length is
+				# between MAX_TITLE_CHARS and this sum.
+
+	MIN_LEADERS_SPACE = "        "	# must be at least MIN_LEADERS characters long
+
+	Month_expansion["jan"]	= "January"
+	Month_expansion["feb"]	= "February"
+	Month_expansion["mar"]	= "March"
+	Month_expansion["apr"]	= "April"
+	Month_expansion["may"]	= "May"
+	Month_expansion["jun"]	= "June"
+	Month_expansion["jul"]	= "July"
+	Month_expansion["aug"]	= "August"
+	Month_expansion["sep"]	= "September"
+	Month_expansion["oct"]	= "October"
+	Month_expansion["nov"]	= "November"
+	Month_expansion["dec"]	= "December"
+
+	Font_cmd_map["\\emph"]		= "EM"
+	Font_cmd_map["\\textbf"]	= "B"
+	Font_cmd_map["\\textit"]	= "I"
+	Font_cmd_map["\\textmd"]	= ""
+	Font_cmd_map["\\textrm"]	= ""
+	Font_cmd_map["\\textsc"]	= "toupper"
+	Font_cmd_map["\\textsl"]	= "I"
+	Font_cmd_map["\\texttt"]	= "t"
+	Font_cmd_map["\\textup"]	= ""
+
+	Font_decl_map["\\bf"]		= "B"
+	Font_decl_map["\\em"]		= "EM"
+	Font_decl_map["\\it"]		= "I"
+	Font_decl_map["\\rm"]		= ""
+	Font_decl_map["\\sc"]		= "toupper"
+	Font_decl_map["\\sf"]		= ""
+	Font_decl_map["\\tt"]		= "TT"
+	Font_decl_map["\\itshape"]	= "I"
+	Font_decl_map["\\upshape"]	= ""
+	Font_decl_map["\\slshape"]	= "I"
+	Font_decl_map["\\scshape"]	= "toupper"
+	Font_decl_map["\\mdseries"]	= ""
+	Font_decl_map["\\bfseries"]	= "B"
+	Font_decl_map["\\rmfamily"]	= ""
+	Font_decl_map["\\sffamily"]	= ""
+	Font_decl_map["\\ttfamily"]	= "TT"
+}
+
+function min(a,b)
+{
+	return (a < b) ? a : b
+}
+
+
+function prefix(level)
+{
+	# Return a prefix of up to 60 blanks
+
+	if (In_PRE)
+		return ("")
+	else
+		return (substr("                                                            ", \
+			1, INDENT * level))
+}
+
+
+function print_line(line)
+{
+	if (HTML)		# must buffer in memory so that we can accumulate TOC
+		Body[++BodyLines] = line
+	else
+		print line
+}
+
+
+function print_toc_line(author,title,pages, extra,leaders,n,t)
+{
+	# When we have a multiline title, the hypertext link goes only
+	# on the first line.  A multiline hypertext link looks awful
+	# because of long underlines under the leading indentation.
+
+	if (pages == "")	# then no leaders needed in title lines other than last one
+		t = sprintf("%31s   %s%s%s", author, Title_prefix, title, Title_suffix)
+	else					# last title line, with page number
+	{
+		n = html_length(title)		# potentially expensive
+		extra = n % 2			# extra space for aligned leader dots
+		if (n <= MAX_TITLE_CHARS) 	# then need leaders
+			leaders = substr(LEADERS, 1, MAX_TITLE_CHARS + MIN_LEADERS - extra - \
+				   min(MAX_TITLE_CHARS,n))
+		else				# title (almost) fills line, so no leaders
+			leaders = substr(MIN_LEADERS_SPACE,1, \
+					 (MAX_TITLE_CHARS + MIN_LEADERS - extra - n))
+		t = sprintf("%31s   %s%s%s%s%s %4s", \
+			    author, Title_prefix, title, Title_suffix, \
+			    (extra ? " " : ""), leaders, pages)
+	}
+
+	Title_prefix = ""	# forget any hypertext
+	Title_suffix = ""	# link material
+
+	# Efficency note: an earlier version accumulated the body in a
+	# single scalar like this: "Body = Body t".  Profiling revealed
+	# this statement as the major hot spot, and the change to array
+	# storage made the program more than twice as fast.  This
+	# suggests that awk might benefit from an optimization of
+	# "s = s t" that uses realloc() instead of malloc().
+	if (HTML)
+		Body[++BodyLines] = t
+	else
+		print t
+}
+
+
+function protect_SGML_characters(s)
+{
+    gsub(/&/,"\\&amp;",s)	# NB: this one MUST be first
+    gsub(/</,"\\&lt;",s)
+    gsub(/>/,"\\&gt;",s)
+    gsub(/\"/,"\\&quot;",s)
+    return (s)
+}
+
+
+function strip_braces(s, k)
+{	# strip non-backslashed braces from s and return the result
+
+	return (strip_char(strip_char(s,"{"),"}"))
+}
+
+
+function strip_char(s,c, k)
+{	# strip non-backslashed instances of c from s, and return the result
+	k = index(s,c)
+	if (k > 0)		# then found the character
+	{
+		if (substr(s,k-1,1) != "\\") # then not backslashed char
+			s = substr(s,1,k-1) strip_char(substr(s,k+1),c) # so remove it (recursively)
+		else		# preserve backslashed char
+			s = substr(s,1,k) strip_char(s,k+1,c)
+	}
+	return (s)
+}
+
+
+function strip_html(s)
+{
+	gsub(/<\/?[^>]*>/,"",s)
+	return (s)
+}
+
+
+function terminate()
+{
+	if (HTML)
+	{
+		html_end_pre()
+
+		HTML = 0	# NB: stop line buffering
+		html_header()
+		html_toc()
+		html_body()
+		html_trailer()
+	}
+}
+
+
+function TeX_to_HTML(s, k,n,parts)
+{
+	# First convert the four SGML reserved characters to SGML entities
+	if (HTML)
+	{
+	    gsub(/>/,	"\\&gt;",	s)
+	    gsub(/</,	"\\&lt;",	s)
+	    gsub(/"/,	"\\&quot;",	s)
+	}
+
+	gsub(/[$][$]/,"$$",s)	# change display math to triple dollars for split
+	n = split(s,parts,/[$]/)# split into non-math (odd) and math (even) parts
+
+	s = ""
+	for (k = 1; k <= n; ++k) # unbrace non-math part, leaving math mode intact
+		s = s ((k > 1) ? "$" : "") \
+			((k % 2) ? strip_braces(TeX_to_HTML_nonmath(parts[k])) : \
+			TeX_to_HTML_math(parts[k]))
+
+	gsub(/[$][$][$]/,"$$",s) # restore display math
+
+	return (s)
+}
+
+
+function TeX_to_HTML_math(s)
+{
+	# Mostly a dummy for now, but HTML 3 could support some math translation
+
+	gsub(/\\&/,"\\&amp;",s)	# reduce TeX ampersands to SGML entities
+
+	return (s)
+}
+
+
+function TeX_to_HTML_nonmath(s)
+{
+	if (index(s,"\\") > 0)			# important optimization
+	{
+		gsub(/\\slash +/,"/",s)		# replace TeX slashes with conventional ones
+		gsub(/ *\\emdash +/," --- ",s)	# replace BibNet emdashes with conventional ones
+		gsub(/\\%/,"%",s)		# reduce TeX percents to conventional ones
+		gsub(/\\[$]/,"$",s)		# reduce TeX dollars to conventional ones
+		gsub(/\\#/,"#",s)		# reduce TeX sharps to conventional ones
+
+		if (HTML)			# translate TeX markup to HTML
+		{
+			gsub(/\\&/,"\\&amp;",s)	# reduce TeX ampersands to SGML entities
+			s = html_accents(s)
+			s = html_fonts(s)
+		}
+		else				# plain ASCII text output: discard all TeX markup
+		{
+			gsub(/\\\&/, "\\&", s)	# reduce TeX ampersands to conventional ones
+
+			#gsub(/\\[a-z][a-z] +/,"",s) # remove TeX font changes
+			gsub(/\\[[:lower:]][[:lower:]] +/,"",s) # remove TeX font changes
+			#gsub(/\\[^A-Za-z]/,"",s) # remove remaining TeX control symbols
+			gsub(/\\[^[:alpha:]]/,"",s) # remove remaining TeX control symbols
+		}
+	}
+	return (s)
+}
+
+
+function trim(s)
+{
+    gsub(/^[ \t]+/,"",s)
+    gsub(/[ \t]+$/,"",s)
+    return (s)
+}
+
+
+function vol_no_month_year()
+{
+	return ("Volume " wrap(Volume)  ",  Number " wrap(Number) ", " wrap(Month) ", " wrap(Year))
+}
+
+
+function wrap(value)
+{
+	return (HTML ? ("<STRONG>" value "</STRONG>") : value)
+}
diff --git a/gawk-5.0.1/test/funstack.in b/gawk-5.0.1/test/funstack.in
new file mode 100644
index 00000000000..7a29a254a39
--- /dev/null
+++ b/gawk-5.0.1/test/funstack.in
@@ -0,0 +1,206 @@
+%%% ====================================================================
+%%%  BibTeX-file{
+%%%     author          = "Nelson H. F. Beebe",
+%%%     version         = "2.09",
+%%%     date            = "26 March 1997",
+%%%     time            = "08:21:19 MST",
+%%%     filename        = "cacm1970.bib",
+%%%     address         = "Center for Scientific Computing
+%%%                        Department of Mathematics
+%%%                        University of Utah
+%%%                        Salt Lake City, UT 84112
+%%%                        USA",
+%%%     telephone       = "+1 801 581 5254",
+%%%     FAX             = "+1 801 581 4148",
+%%%     checksum        = "50673 40670 196033 1787829",
+%%%     email           = "beebe at math.utah.edu (Internet)",
+%%%     codetable       = "ISO/ASCII",
+%%%     keywords        = "bibliography, CACM, Communications of the
+%%%                        ACM",
+%%%     supported       = "yes",
+%%%     docstring       = "This is a bibliography of the journal
+%%%                        Communications of the ACM, covering
+%%%                        (incompletely) 1970 -- 1979.
+%%%
+%%%                        At version 2.09, the year coverage looked
+%%%                        like this:
+%%%
+%%%                             1961 (  1)     1972 (168)     1983 (  0)
+%%%                             1962 (  1)     1973 (158)     1984 (  0)
+%%%                             1963 (  2)     1974 (127)     1985 (  2)
+%%%                             1964 (  2)     1975 (107)     1986 (  0)
+%%%                             1965 (  1)     1976 ( 97)     1987 (  0)
+%%%                             1966 (  2)     1977 (117)     1988 (  0)
+%%%                             1967 (  1)     1978 (118)     1989 (  0)
+%%%                             1968 (  1)     1979 ( 78)     1990 (  2)
+%%%                             1969 (  3)     1980 (  1)     1991 (  4)
+%%%                             1970 (157)     1981 (  2)     1992 (  1)
+%%%                             1971 (104)     1982 (  1)
+%%%
+%%%                             Article:       1252
+%%%                             Book:             2
+%%%                             InProceedings:    1
+%%%                             Manual:           1
+%%%                             MastersThesis:    1
+%%%                             PhdThesis:        1
+%%%
+%%%                             Total entries: 1258
+%%%
+%%%                        The size of the original cacm.bib file
+%%%                        covering 1958--1996 became too large (about
+%%%                        4000 entries) for BibTeX and TeX to handle,
+%%%                        so at version 1.44, it was split into
+%%%                        cacm1950.bib, cacm1960.bib, cacm1970.bib,
+%%%                        cacm1980.bib, and cacm1990.bib, each covering
+%%%                        the decade starting with the year embedded in
+%%%                        the filename.  Version numbers for these
+%%%                        files begin at 2.00.
+%%%
+%%%                        Volumes from the 1990s average more than 200
+%%%                        articles yearly, so a complete bibliography
+%%%                        for this journal could contain more than 6000
+%%%                        entries from 1958 to 2000.
+%%%
+%%%                        These bibliographies also include ACM
+%%%                        Algorithms 1--492.  For Algorithms 493--686,
+%%%                        including Algorithm 568, published in ACM
+%%%                        Transactions on Programming Languages and
+%%%                        Systems (TOPLAS), see the companion
+%%%                        bibliographies, toms.bib and toplas.bib.
+%%%
+%%%                        All published Remarks and Corrigenda are
+%%%                        cross-referenced in both directions, so
+%%%                        that citing a paper will automatically
+%%%                        generate citations for those Remarks and
+%%%                        Corrigenda.  Cross-referenced entries are
+%%%                        duplicated in cacm19*.bib and toms.bib, so
+%%%                        that each is completely self-contained.
+%%%
+%%%                        Source code for ACM Algorithms from 380
+%%%                        onwards, with some omissions, is available
+%%%                        via the Netlib service at
+%%%                        http://netlib.ornl.gov/, and
+%%%                        ftp://netlib.bell-labs.com/netlib/toms.
+%%%
+%%%                        There is a World Wide Web search facility
+%%%                        for articles published in this journal from
+%%%                        1959 to 1979 at
+%%%                        http://ciir.cs.umass.edu/cgi-bin/web_query_form/public/cacm2.1.
+%%%
+%%%                        The initial draft of entries for 1981 --
+%%%                        1990 was extracted from the ACM Computing
+%%%                        Archive CD ROM for the 1980s, with manual
+%%%                        corrections and additions.  Additions were
+%%%                        then made from all of the bibliographies in
+%%%                        the TeX User Group collection, from
+%%%                        bibliographies in the author's personal
+%%%                        files, from the Compendex database
+%%%                        (1970--1979), from the IEEE INSPEC database
+%%%                        (1970--1979), from tables of contents
+%%%                        information at http://www.acm.org/pubs/cacm/,
+%%%                        from Zentralblatt fur Mathematik Mathematics
+%%%                        Abstracts at
+%%%                        http://www.emis.de/cgi-bin/MATH/, from
+%%%                        bibliographies at Internet host
+%%%                        netlib.bell-labs.com, and from the computer
+%%%                        science bibliography collection on
+%%%                        ftp.ira.uka.de in /pub/bibliography to which
+%%%                        many people of have contributed.  The
+%%%                        snapshot of this collection was taken on
+%%%                        5-May-1994, and it consists of 441 BibTeX
+%%%                        files, 2,672,675 lines, 205,289 entries, and
+%%%                        6,375 <at>String{} abbreviations, occupying
+%%%                        94.8MB of disk space.
+%%%
+%%%                        Numerous errors in the sources noted above
+%%%                        have been corrected.   Spelling has been
+%%%                        verified with the UNIX spell and GNU ispell
+%%%                        programs using the exception dictionary
+%%%                        stored in the companion file with extension
+%%%                        .sok.
+%%%
+%%%                        BibTeX citation tags are uniformly chosen
+%%%                        as name:year:abbrev, where name is the
+%%%                        family name of the first author or editor,
+%%%                        year is a 4-digit number, and abbrev is a
+%%%                        3-letter condensation of important title
+%%%                        words. Citation tags were automatically
+%%%                        generated by software developed for the
+%%%                        BibNet Project.
+%%%
+%%%                        In this bibliography, entries are sorted in
+%%%                        publication order within each journal,
+%%%                        using bibsort -byvolume.
+%%%
+%%%                        The checksum field above contains a CRC-16
+%%%                        checksum as the first value, followed by the
+%%%                        equivalent of the standard UNIX wc (word
+%%%                        count) utility output of lines, words, and
+%%%                        characters.  This is produced by Robert
+%%%                        Solovay's checksum utility.",
+%%%  }
+%%% ====================================================================
+
+@Preamble{"\input bibnames.sty " # "\input path.sty " # "\def \TM {${}^{\sc TM}$} " # "\hyphenation{ al-pha-mer-ic Balz-er Blom-quist Bo-ta-fo-go Bran-din Brans-comb Bu-tera Chris-tina Christ-o-fi-des Col-lins Cor-dell data-base econ-omies Fletch-er
+ flow-chart flow-charts Fry-styk ge-dank-en Gar-fink-el Ge-ha-ni Glush-ko Goud-reau Gua-dan-go Hari-di Haw-thorn Hem-men-ding-er Hor-o-witz Hour-vitz Hirsch-berg Ike-da Ka-chi-tvi-chyan-u-kul Kat-ze-nel-son Kitz-miller Ko-ba-yashi Le-Me-tay-er Ken-ne-dy
+ Law-rence Mac-kay Mai-net-ti Mar-sa-glia Max-well Mer-ner Mo-ran-di Na-ray-an New-ell Nich-ols para-digm pat-ent-ed Phi-lo-kyp-rou Prep-a-ra-ta pseu-do-chain-ing QUIK-SCRIPT Rad-e-mach-er re-eval-u-a-tion re-wind Ros-witha Scheu-er-mann Schwach-heim
+ Schob-bens Schon-berg Sho-sha-ni Si-tha-ra-ma Skwa-rec-ki Streck-er Strin-gi-ni Tes-ler Te-zu-ka Teu-ho-la Till-quist Town-send Tsi-chri-tzis Tur-ski Vuille-min Wald-ing-er Za-bo-row-ski Za-mora }"}
+
+%=======================================================================
+% Acknowledgement abbreviations:
+
+@String{ack-nhfb = "Nelson H. F. Beebe, Center for Scientific Computing, Department of Mathematics, University of Utah, Salt Lake City, UT 84112, USA, Tel: +1 801 581 5254, FAX: +1 801 581 4148, e-mail: \path|beebe@math.utah.edu|"}
+
+@String{ack-nj = "Norbert Juffa, 2445 Mission College Blvd. Santa Clara, CA 95054 USA email: \path=norbert@iit.com="}
+
+%=======================================================================
+% Journal abbreviations:
+
+@String{j-CACM = "Communications of the ACM"}
+
+@String{j-COMP-SURV = "Computing Surveys"}
+
+@String{j-J-ACM = "Journal of the ACM"}
+
+@String{j-MANAGEMENT-SCIENCE = "Management Science"}
+
+@String{j-SIAM-J-COMPUT = "SIAM Journal of Computing"}
+
+@String{j-SPE =  "Software --- Practice and Experience"}
+
+@String{j-TOMS = "ACM Transactions on Mathematical Software"}
+
+%=======================================================================
+% Publisher abbreviations:
+
+@String{pub-ANSI = "American National Standards Institute"}
+
+@String{pub-ANSI:adr = "1430 Broadway, New York, NY 10018, USA"}
+
+@String{pub-AW = "Ad{\-d}i{\-s}on-Wes{\-l}ey"}
+
+@String{pub-AW:adr = "Reading, MA, USA"}
+
+@String{pub-SUCSLI = "Stanford University Center for the Study of Language and Information"}
+
+@String{pub-SUCSLI:adr = "Stanford, CA, USA"}
+
+@String{pub-SV = "Spring{\-}er-Ver{\-}lag"}
+
+@String{pub-SV:adr = "Berlin, Germany~/ Heidelberg, Germany~/ London, UK~/ etc."}
+@MastersThesis{Dittmer:1976:IEP,
+  author =       "Ingo Dittmer",
+  title =        "{Implementation eines Einschrittcompilers f{\"u}r die Progammiersprache PASCAL auf der Rechenanlage IBM\slash 360 der Universit{\"a}t M{\"u}nster}. ({English} title: Implementation of a One-Step Compiler for the Programming Language
+ {PASCAL} on the {IBM}\slash 360 of the {University of Muenster})",
+  type =         "Diplomearbeit",
+  school =       "Universit{\"a}t M{\"u}nster",
+  address =      "M{\"u}nster, Germany",
+  pages =        "??",
+  month =        "??",
+  year =         "1976",
+  bibdate =      "Sat Feb 17 13:24:29 1996",
+  note =         "Diplomearbeit M{\"u}nster 1976 und doert angegebene Literatur (English: Muenster diploma work 1976 and the literature cited therein). The hashing method was rediscovered fourteen years later by Pearson \cite{Pearson:1990:FHV}, and then
+ commented on by several authors \cite{Dittmer:1991:NFH,Savoy:1991:NFH,Litsios:1991:NFH,Pearson:1991:NFH}.",
+  acknowledgement = ack-nhfb,
+  xxnote =       "Cannot find in Dissertation Abstracts, European.",
+}
diff --git a/gawk-5.0.1/test/funstack.ok b/gawk-5.0.1/test/funstack.ok
new file mode 100644
index 00000000000..04030d3b721
--- /dev/null
+++ b/gawk-5.0.1/test/funstack.ok
@@ -0,0 +1,10 @@
+gawk: funstack.awk:129: warning: regexp escape sequence `\"' is not a known regexp operator
+gawk: funstack.awk:381: warning: regexp escape sequence `\e' is not a known regexp operator
+gawk: funstack.awk:386: warning: regexp escape sequence `\i' is not a known regexp operator
+gawk: funstack.awk:395: warning: regexp escape sequence `\o' is not a known regexp operator
+gawk: funstack.awk:402: warning: regexp escape sequence `\u' is not a known regexp operator
+gawk: funstack.awk:412: warning: regexp escape sequence `\A' is not a known regexp operator
+gawk: funstack.awk:427: warning: regexp escape sequence `\I' is not a known regexp operator
+gawk: funstack.awk:436: warning: regexp escape sequence `\O' is not a known regexp operator
+gawk: funstack.awk:443: warning: regexp escape sequence `\U' is not a known regexp operator
+gawk: funstack.awk:952: warning: regexp escape sequence `\&' is not a known regexp operator
diff --git a/gawk-5.0.1/test/fwtest.awk b/gawk-5.0.1/test/fwtest.awk
new file mode 100644
index 00000000000..730aeda8ae4
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest.awk
@@ -0,0 +1,2 @@
+BEGIN {  FIELDWIDTHS = "1 1 1" }
+{ print NF, $1, $2, $3 }
diff --git a/gawk-5.0.1/test/fwtest.in b/gawk-5.0.1/test/fwtest.in
new file mode 100644
index 00000000000..8baef1b4abc
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest.in
@@ -0,0 +1 @@
+abc
diff --git a/gawk-5.0.1/test/fwtest.ok b/gawk-5.0.1/test/fwtest.ok
new file mode 100644
index 00000000000..f2e4bc6ba77
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest.ok
@@ -0,0 +1 @@
+3 a b c
diff --git a/gawk-5.0.1/test/fwtest2.awk b/gawk-5.0.1/test/fwtest2.awk
new file mode 100644
index 00000000000..f9df5833f70
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest2.awk
@@ -0,0 +1,59 @@
+# Date: Fri, 24 Mar 2006 15:17:24 +0100
+# From: =?UTF-8?Q?Ram=C3=B3n_Garc=C3=ADa?= <ramon.garcia.f@gmail.com>
+# Subject: Re: Bug when parsing FIELDWIDTHS
+# In-reply-to: <200603241144.k2OBiFOX030158@skeeve.com>
+# To: Aharon Robbins <arnold@skeeve.com>
+# Message-id: <daa40b5d0603240617j1b7e8861g3963035eafdeba1e@mail.gmail.com>
+# MIME-version: 1.0
+# Content-type: multipart/mixed; boundary="----=_Part_9022_17179442.1143209844259"
+# DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;        s=beta; d=gmail.com;
+#  h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references;
+#  b=QVst9uUwAllKuDwXhuHbNjpRJStt3nEGc7p+BMG+HNk/qyHmnG/TYXSvIVKgZFja1thLhYbPYncw2MyEHtKyZuiTJCYqvpjWeST9qQNfxVMeu8FahqAky7n8ldsjOK6ncbCoE3hZe/g/Z9ZsVFC9LORXvM5uo7y1MGkUhgxO4qU=
+# 
+# ------=_Part_9022_17179442.1143209844259
+# Content-Type: text/plain; charset=UTF-8
+# Content-Transfer-Encoding: base64
+# Content-Disposition: inline
+# 
+# DQpTdXJlLiBIZXJlIGl0IGlzLg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
+# IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpUaGlz
+# IE1haWwgV2FzIFNjYW5uZWQgYnkgMDEyLm5ldCBBbnRpVmlydXMgU2VydmljZTItIFBvd2VyZWQg
+# YnkgVHJlbmRNaWNybyBJbnRlcnNjYW4NCg==
+# ------=_Part_9022_17179442.1143209844259
+# Content-Type: application/octet-stream; name=bug_data
+# Content-Transfer-Encoding: 7bit
+# X-Attachment-Id: f_el6ll617
+# Content-Disposition: attachment; filename="bug_data"
+# 
+#    0.4867373206   1.3206333033  -0.2333178127 
+#    0.5668176165   1.3711756314  -0.2193558040 
+#    0.4325251781   1.3399488722  -0.1568307497 
+#    0.4900487563   1.3295759570  -0.2217392402 
+#   -0.6790064191   1.2536623801  -0.2955415433 
+#   -0.6311440220   1.2966579993  -0.2246692210 
+#   -0.7209390351   1.1783407099  -0.2539408209 
+#   -0.6782473356   1.2495242556  -0.2811436366 
+#   -0.7062054082   1.1223820964  -1.1619805834 
+#   -0.6491590119   1.1248946162  -1.0851579675 
+#   -0.7948856821   1.1208852325  -1.1259821556 
+#   -0.7102549262   1.1225121126  -1.1475381286         
+# 
+# ------=_Part_9022_17179442.1143209844259
+# Content-Type: application/octet-stream; name=bug.awk
+# Content-Transfer-Encoding: 7bit
+# X-Attachment-Id: f_el6llnjj
+# Content-Disposition: attachment; filename="bug.awk"
+# 
+#!/usr/bin/awk -f
+BEGIN {
+   FIELDWIDTHS = "15 15 15";
+}
+{
+   x = $1;
+   y = $2;
+   z = $3;
+   print "x y z", x, y, z
+}
+# 
+# ------=_Part_9022_17179442.1143209844259--
+# 
diff --git a/gawk-5.0.1/test/fwtest2.in b/gawk-5.0.1/test/fwtest2.in
new file mode 100644
index 00000000000..93f4f0072e5
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest2.in
@@ -0,0 +1,12 @@
+   0.4867373206   1.3206333033  -0.2333178127 
+   0.5668176165   1.3711756314  -0.2193558040 
+   0.4325251781   1.3399488722  -0.1568307497 
+   0.4900487563   1.3295759570  -0.2217392402 
+  -0.6790064191   1.2536623801  -0.2955415433 
+  -0.6311440220   1.2966579993  -0.2246692210 
+  -0.7209390351   1.1783407099  -0.2539408209 
+  -0.6782473356   1.2495242556  -0.2811436366 
+  -0.7062054082   1.1223820964  -1.1619805834 
+  -0.6491590119   1.1248946162  -1.0851579675 
+  -0.7948856821   1.1208852325  -1.1259821556 
+  -0.7102549262   1.1225121126  -1.1475381286         
diff --git a/gawk-5.0.1/test/fwtest2.ok b/gawk-5.0.1/test/fwtest2.ok
new file mode 100644
index 00000000000..a53d2dfbdb4
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest2.ok
@@ -0,0 +1,12 @@
+x y z    0.4867373206    1.3206333033   -0.2333178127
+x y z    0.5668176165    1.3711756314   -0.2193558040
+x y z    0.4325251781    1.3399488722   -0.1568307497
+x y z    0.4900487563    1.3295759570   -0.2217392402
+x y z   -0.6790064191    1.2536623801   -0.2955415433
+x y z   -0.6311440220    1.2966579993   -0.2246692210
+x y z   -0.7209390351    1.1783407099   -0.2539408209
+x y z   -0.6782473356    1.2495242556   -0.2811436366
+x y z   -0.7062054082    1.1223820964   -1.1619805834
+x y z   -0.6491590119    1.1248946162   -1.0851579675
+x y z   -0.7948856821    1.1208852325   -1.1259821556
+x y z   -0.7102549262    1.1225121126   -1.1475381286
diff --git a/gawk-5.0.1/test/fwtest3.awk b/gawk-5.0.1/test/fwtest3.awk
new file mode 100644
index 00000000000..5e96c1aa258
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest3.awk
@@ -0,0 +1,6 @@
+BEGIN {
+   FIELDWIDTHS = "2:13 2:13 2:13";
+}
+{
+   printf "%s|%s|%s\n", $1, $2, $3
+}
diff --git a/gawk-5.0.1/test/fwtest3.in b/gawk-5.0.1/test/fwtest3.in
new file mode 100644
index 00000000000..93f4f0072e5
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest3.in
@@ -0,0 +1,12 @@
+   0.4867373206   1.3206333033  -0.2333178127 
+   0.5668176165   1.3711756314  -0.2193558040 
+   0.4325251781   1.3399488722  -0.1568307497 
+   0.4900487563   1.3295759570  -0.2217392402 
+  -0.6790064191   1.2536623801  -0.2955415433 
+  -0.6311440220   1.2966579993  -0.2246692210 
+  -0.7209390351   1.1783407099  -0.2539408209 
+  -0.6782473356   1.2495242556  -0.2811436366 
+  -0.7062054082   1.1223820964  -1.1619805834 
+  -0.6491590119   1.1248946162  -1.0851579675 
+  -0.7948856821   1.1208852325  -1.1259821556 
+  -0.7102549262   1.1225121126  -1.1475381286         
diff --git a/gawk-5.0.1/test/fwtest3.ok b/gawk-5.0.1/test/fwtest3.ok
new file mode 100644
index 00000000000..f4d28232d6a
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest3.ok
@@ -0,0 +1,12 @@
+ 0.4867373206| 1.3206333033|-0.2333178127
+ 0.5668176165| 1.3711756314|-0.2193558040
+ 0.4325251781| 1.3399488722|-0.1568307497
+ 0.4900487563| 1.3295759570|-0.2217392402
+-0.6790064191| 1.2536623801|-0.2955415433
+-0.6311440220| 1.2966579993|-0.2246692210
+-0.7209390351| 1.1783407099|-0.2539408209
+-0.6782473356| 1.2495242556|-0.2811436366
+-0.7062054082| 1.1223820964|-1.1619805834
+-0.6491590119| 1.1248946162|-1.0851579675
+-0.7948856821| 1.1208852325|-1.1259821556
+-0.7102549262| 1.1225121126|-1.1475381286
diff --git a/gawk-5.0.1/test/fwtest4.awk b/gawk-5.0.1/test/fwtest4.awk
new file mode 100644
index 00000000000..d1384eafe05
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest4.awk
@@ -0,0 +1 @@
+BEGIN { FIELDWIDTHS="5" } { print $1 }
diff --git a/gawk-5.0.1/test/fwtest4.in b/gawk-5.0.1/test/fwtest4.in
new file mode 100644
index 00000000000..a32a4347a4e
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest4.in
@@ -0,0 +1 @@
+1234567890
diff --git a/gawk-5.0.1/test/fwtest4.ok b/gawk-5.0.1/test/fwtest4.ok
new file mode 100644
index 00000000000..e56e15bb7dd
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest4.ok
@@ -0,0 +1 @@
+12345
diff --git a/gawk-5.0.1/test/fwtest5.awk b/gawk-5.0.1/test/fwtest5.awk
new file mode 100644
index 00000000000..be030eabbf5
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest5.awk
@@ -0,0 +1,2 @@
+BEGIN { FIELDWIDTHS = "2 3 4" }
+{ print NF }
diff --git a/gawk-5.0.1/test/fwtest5.in b/gawk-5.0.1/test/fwtest5.in
new file mode 100644
index 00000000000..c24c70ed5bb
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest5.in
@@ -0,0 +1,4 @@
+12
+12345
+123456789
+123456789abcd
diff --git a/gawk-5.0.1/test/fwtest5.ok b/gawk-5.0.1/test/fwtest5.ok
new file mode 100644
index 00000000000..7d8164bf9e4
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest5.ok
@@ -0,0 +1,4 @@
+1
+2
+3
+3
diff --git a/gawk-5.0.1/test/fwtest6.awk b/gawk-5.0.1/test/fwtest6.awk
new file mode 100644
index 00000000000..b36d75a214a
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest6.awk
@@ -0,0 +1,4 @@
+# BEGIN { FIELDWIDTHS = "2 2 *" }
+BEGIN { FIELDWIDTHS = "2 2 * " }
+{ print NF, $1, $2, $3 }
+END { FIELDWIDTHS = "2 * 2" }
diff --git a/gawk-5.0.1/test/fwtest6.in b/gawk-5.0.1/test/fwtest6.in
new file mode 100644
index 00000000000..fea8d6472fd
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest6.in
@@ -0,0 +1 @@
+1234abcdefghi
diff --git a/gawk-5.0.1/test/fwtest6.ok b/gawk-5.0.1/test/fwtest6.ok
new file mode 100644
index 00000000000..9ba87f2a2e2
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest6.ok
@@ -0,0 +1,3 @@
+3 12 34 abcdefghi
+gawk: fwtest6.awk:4: (FILENAME=- FNR=1) fatal: `*' must be the last designator in FIELDWIDTHS
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/fwtest7.awk b/gawk-5.0.1/test/fwtest7.awk
new file mode 100644
index 00000000000..af424d9406c
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest7.awk
@@ -0,0 +1,2 @@
+BEGIN { FIELDWIDTHS = "2 1:*" }
+{ print $1, $2 }
diff --git a/gawk-5.0.1/test/fwtest7.in b/gawk-5.0.1/test/fwtest7.in
new file mode 100644
index 00000000000..1accfe88e84
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest7.in
@@ -0,0 +1 @@
+abcdefghijklmn
diff --git a/gawk-5.0.1/test/fwtest7.ok b/gawk-5.0.1/test/fwtest7.ok
new file mode 100644
index 00000000000..c321c19ca12
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest7.ok
@@ -0,0 +1 @@
+ab defghijklmn
diff --git a/gawk-5.0.1/test/fwtest8.awk b/gawk-5.0.1/test/fwtest8.awk
new file mode 100644
index 00000000000..27cbff446b1
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest8.awk
@@ -0,0 +1,2 @@
+BEGIN { FIELDWIDTHS = "2:1 3:-1 4" }
+{ print $2 }
diff --git a/gawk-5.0.1/test/fwtest8.in b/gawk-5.0.1/test/fwtest8.in
new file mode 100644
index 00000000000..b378a015ea8
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest8.in
@@ -0,0 +1 @@
+ssAsssBCCCC
diff --git a/gawk-5.0.1/test/fwtest8.ok b/gawk-5.0.1/test/fwtest8.ok
new file mode 100644
index 00000000000..8ecd1678b99
--- /dev/null
+++ b/gawk-5.0.1/test/fwtest8.ok
@@ -0,0 +1,2 @@
+gawk: fwtest8.awk:1: fatal: invalid FIELDWIDTHS value, for field 2, near `-1 4'
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/genpot.awk b/gawk-5.0.1/test/genpot.awk
new file mode 100644
index 00000000000..990b0b5c7bb
--- /dev/null
+++ b/gawk-5.0.1/test/genpot.awk
@@ -0,0 +1 @@
+{print _"This string is so long that gawk --gen-pot will break it and lose a letter at the break."}
diff --git a/gawk-5.0.1/test/genpot.ok b/gawk-5.0.1/test/genpot.ok
new file mode 100644
index 00000000000..35c0cc996d8
--- /dev/null
+++ b/gawk-5.0.1/test/genpot.ok
@@ -0,0 +1,5 @@
+#: genpot.awk:1
+msgid "This string is so long that gawk --gen-pot will break it and lose a l"
+"etter at the break."
+msgstr ""
+
diff --git a/gawk-5.0.1/test/gensub.awk b/gawk-5.0.1/test/gensub.awk
new file mode 100644
index 00000000000..f91d84dc4c8
--- /dev/null
+++ b/gawk-5.0.1/test/gensub.awk
@@ -0,0 +1,7 @@
+BEGIN { a = "this is a test of gawk"
+	b = gensub(/(this).*(test).*(gawk)/, "3 = <\\3>, 2 = <\\2>, 1 = <\\1>", 1, a)
+	print b
+}
+NR == 1 { print gensub(/b/, "BB", 2) }
+NR == 2 { print gensub(/c/, "CC", "global") }
+END { print gensub(/foo/, "bar", 1, "DON'T PANIC") }
diff --git a/gawk-5.0.1/test/gensub.in b/gawk-5.0.1/test/gensub.in
new file mode 100644
index 00000000000..96c9fafc727
--- /dev/null
+++ b/gawk-5.0.1/test/gensub.in
@@ -0,0 +1,2 @@
+a b c a b c a b c
+a b c a b c a b c
diff --git a/gawk-5.0.1/test/gensub.ok b/gawk-5.0.1/test/gensub.ok
new file mode 100644
index 00000000000..b9ea3dece06
--- /dev/null
+++ b/gawk-5.0.1/test/gensub.ok
@@ -0,0 +1,4 @@
+3 = <gawk>, 2 = <test>, 1 = <this>
+a b c a BB c a b c
+a b CC a b CC a b CC
+DON'T PANIC
diff --git a/gawk-5.0.1/test/gensub2.awk b/gawk-5.0.1/test/gensub2.awk
new file mode 100644
index 00000000000..53554daef68
--- /dev/null
+++ b/gawk-5.0.1/test/gensub2.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	print gensub("x","y",2,"xx")
+	print gensub("x","y","2","xx")
+	print gensub("x","y","a","xx")
+}
diff --git a/gawk-5.0.1/test/gensub2.ok b/gawk-5.0.1/test/gensub2.ok
new file mode 100644
index 00000000000..318f940cbed
--- /dev/null
+++ b/gawk-5.0.1/test/gensub2.ok
@@ -0,0 +1,4 @@
+xy
+xy
+gawk: gensub2.awk:4: warning: gensub: third argument `a' treated as 1
+yx
diff --git a/gawk-5.0.1/test/gensub3.awk b/gawk-5.0.1/test/gensub3.awk
new file mode 100644
index 00000000000..be0f7538fc0
--- /dev/null
+++ b/gawk-5.0.1/test/gensub3.awk
@@ -0,0 +1,8 @@
+/apple/ {
+   $0 = $0
+   x = $0
+}
+
+END {
+   print x
+}
diff --git a/gawk-5.0.1/test/gensub3.in b/gawk-5.0.1/test/gensub3.in
new file mode 100644
index 00000000000..f38fe2fa983
--- /dev/null
+++ b/gawk-5.0.1/test/gensub3.in
@@ -0,0 +1,2 @@
+apple
+pear
diff --git a/gawk-5.0.1/test/gensub3.ok b/gawk-5.0.1/test/gensub3.ok
new file mode 100644
index 00000000000..4c479defff9
--- /dev/null
+++ b/gawk-5.0.1/test/gensub3.ok
@@ -0,0 +1 @@
+apple
diff --git a/gawk-5.0.1/test/getfile.awk b/gawk-5.0.1/test/getfile.awk
new file mode 100644
index 00000000000..6ee783f6687
--- /dev/null
+++ b/gawk-5.0.1/test/getfile.awk
@@ -0,0 +1,35 @@
+function basename(x) {
+	return gensub(/^.*\//, "", 1, x)
+}
+
+BEGIN {
+	print "BEGIN"
+
+	cmd = "echo hello; echo goodbye"
+	rc = get_file(cmd, "<<", -1, res)
+	print "expected error result", rc, ERRNO
+	print "get_file returned", get_file(cmd, "|<", -1, res)
+	print "input_name", basename(res["input_name"])
+	print (cmd | getline x)
+	print x
+
+	# check that calling get_file on "" triggers the BEGINFILE rule
+	print "get_file returned", get_file("", "", -1, res)
+	print "input_name", basename(res["input_name"])
+	print "end BEGIN"
+}
+
+BEGINFILE {
+	printf "BEGINFILE (%s) ERRNO (%s)\n", basename(FILENAME), ERRNO
+}
+
+ENDFILE {
+	printf "ENDFILE (%s) ERRNO (%s)\n", basename(FILENAME), ERRNO
+}
+
+END {
+	print "END"
+	print (cmd | getline x)
+	print x
+	print close(cmd)
+}
diff --git a/gawk-5.0.1/test/getfile.ok b/gawk-5.0.1/test/getfile.ok
new file mode 100644
index 00000000000..1109a30333d
--- /dev/null
+++ b/gawk-5.0.1/test/getfile.ok
@@ -0,0 +1,17 @@
+BEGIN
+gawk: getfile.awk:9: warning: cannot open unrecognized file type `<<' for `echo hello; echo goodbye'
+get_file: get_file(echo hello; echo goodbye, <<, -1) failed
+expected error result 0 
+get_file returned 1
+input_name echo hello; echo goodbye
+1
+hello
+BEGINFILE (-) ERRNO ()
+get_file returned 1
+input_name -
+end BEGIN
+ENDFILE (-) ERRNO ()
+END
+1
+goodbye
+0
diff --git a/gawk-5.0.1/test/getline.awk b/gawk-5.0.1/test/getline.awk
new file mode 100644
index 00000000000..4601ca11e10
--- /dev/null
+++ b/gawk-5.0.1/test/getline.awk
@@ -0,0 +1,33 @@
+BEGIN {
+	x = y = "s"
+	a = (getline x y)
+	print a, x
+	a = (getline x + 1)
+	print a, x
+	a = (getline x - 2)
+	print a, x
+
+	cmd = "echo A"
+	a = (cmd | getline x y)
+	close(cmd)
+	print a, x
+
+	cmd = "echo B"
+	a = (cmd | getline x + 1)
+	close(cmd)
+	print a, x
+
+	cmd = "echo C"
+	a = (cmd | getline x - 2)
+	close(cmd)
+	print a, x
+
+	cmd = "echo D"
+	a = cmd | getline x
+	close(cmd)
+	print a, x
+
+	# Concatenation has higher precedence than IO.
+	"echo " "date" | getline
+	print
+}
diff --git a/gawk-5.0.1/test/getline.in b/gawk-5.0.1/test/getline.in
new file mode 100644
index 00000000000..b1e67221afe
--- /dev/null
+++ b/gawk-5.0.1/test/getline.in
@@ -0,0 +1,3 @@
+A
+B
+C
diff --git a/gawk-5.0.1/test/getline.ok b/gawk-5.0.1/test/getline.ok
new file mode 100644
index 00000000000..a033cb65813
--- /dev/null
+++ b/gawk-5.0.1/test/getline.ok
@@ -0,0 +1,8 @@
+1s A
+2 B
+-1 C
+1s A
+2 B
+-1 C
+1 D
+date
diff --git a/gawk-5.0.1/test/getline2.awk b/gawk-5.0.1/test/getline2.awk
new file mode 100644
index 00000000000..f4e413f936a
--- /dev/null
+++ b/gawk-5.0.1/test/getline2.awk
@@ -0,0 +1 @@
+BEGIN { while( getline > 0) { print } }
diff --git a/gawk-5.0.1/test/getline2.ok b/gawk-5.0.1/test/getline2.ok
new file mode 100644
index 00000000000..9b7f2b90efe
--- /dev/null
+++ b/gawk-5.0.1/test/getline2.ok
@@ -0,0 +1,2 @@
+BEGIN { while( getline > 0) { print } }
+BEGIN { while( getline > 0) { print } }
diff --git a/gawk-5.0.1/test/getline3.awk b/gawk-5.0.1/test/getline3.awk
new file mode 100644
index 00000000000..03e1239df8f
--- /dev/null
+++ b/gawk-5.0.1/test/getline3.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	cmd = "echo 3"
+	y = 7
+	cmd | getline x y
+	close(cmd)
+	print (cmd | getline x y)
+}
diff --git a/gawk-5.0.1/test/getline3.ok b/gawk-5.0.1/test/getline3.ok
new file mode 100644
index 00000000000..98d9bcb75a6
--- /dev/null
+++ b/gawk-5.0.1/test/getline3.ok
@@ -0,0 +1 @@
+17
diff --git a/gawk-5.0.1/test/getline4.awk b/gawk-5.0.1/test/getline4.awk
new file mode 100644
index 00000000000..275faaab1d5
--- /dev/null
+++ b/gawk-5.0.1/test/getline4.awk
@@ -0,0 +1 @@
+END { getline $2; print}
diff --git a/gawk-5.0.1/test/getline4.in b/gawk-5.0.1/test/getline4.in
new file mode 100644
index 00000000000..42771a3c1c2
--- /dev/null
+++ b/gawk-5.0.1/test/getline4.in
@@ -0,0 +1 @@
+ aaa bbb
diff --git a/gawk-5.0.1/test/getline4.ok b/gawk-5.0.1/test/getline4.ok
new file mode 100644
index 00000000000..42771a3c1c2
--- /dev/null
+++ b/gawk-5.0.1/test/getline4.ok
@@ -0,0 +1 @@
+ aaa bbb
diff --git a/gawk-5.0.1/test/getline5.awk b/gawk-5.0.1/test/getline5.awk
new file mode 100644
index 00000000000..4757bcfefa3
--- /dev/null
+++ b/gawk-5.0.1/test/getline5.awk
@@ -0,0 +1,35 @@
+# Message-ID: <4F7832BD.9030709@gmx.com>
+# Date: Sun, 01 Apr 2012 11:49:33 +0100
+# From: Duncan Moore <duncan.moore@gmx.com>
+# To: "bug-gawk@gnu.org" <bug-gawk@gnu.org>
+# Subject: [bug-gawk] getline difference from gawk versions >=4.0.0
+# 
+# Hi
+# 
+# b.awk:
+# 
+# BEGIN {
+#    system("echo 1 > f")
+#    while ((getline a[++c] < "f") > 0) {}
+#    print c
+# }
+# 
+# gawk -f b.awk
+# 
+# Prior to gawk 4.0.0 this outputs:
+# 
+# 1
+# 
+# For 4.0.0 and 4.0.1 it outputs:
+# 
+# 2
+# 
+# Regards
+# Duncan Moore
+
+BEGIN {
+    system("echo 1 > f")
+    while ((getline a[++c] < "f") > 0) {}
+    print c
+    system("rm -f f")
+}
diff --git a/gawk-5.0.1/test/getline5.ok b/gawk-5.0.1/test/getline5.ok
new file mode 100644
index 00000000000..0cfbf08886f
--- /dev/null
+++ b/gawk-5.0.1/test/getline5.ok
@@ -0,0 +1 @@
+2
diff --git a/gawk-5.0.1/test/getlnbuf.awk b/gawk-5.0.1/test/getlnbuf.awk
new file mode 100644
index 00000000000..8a4483ef46c
--- /dev/null
+++ b/gawk-5.0.1/test/getlnbuf.awk
@@ -0,0 +1,18 @@
+#Date: Tue, 21 Dec 1999 16:11:07 +0100
+#From: Daniel Schnell <Daniel.Schnell.GP@icn.siemens.de>
+#To: bug-gnu-utils@gnu.org
+#CC: arnold@gnu.org
+#Subject: BUG in gawk (version 3.0.4 linux, windows): Text mangeling in between
+
+# search for "@K@CODE" segment
+
+$0 ~ /@K@CODE/  {
+                # get next record
+                getline temp
+                printf ("@K@CODE\n")
+                printf ("%s\n",temp)
+                }
+
+$0 !~ /@K@CODE/ {
+                printf ("%s\n", $0)
+                }
diff --git a/gawk-5.0.1/test/getlnbuf.in b/gawk-5.0.1/test/getlnbuf.in
new file mode 100644
index 00000000000..062b377f282
--- /dev/null
+++ b/gawk-5.0.1/test/getlnbuf.in
@@ -0,0 +1,1708 @@
+EXTRA_INFO.TYP3.EC  := EC;
+EXTRA_INFO.TYP3.TEXT:= 'CONNECT_SERVICE TO OAM FAILED';
+ 
+G9PXYA1S!G9TE500_EHP_P(
+'G9IBSA1C003',                      /*@@ID*/
+G9PXYA1S!G9TE102_ERR_CLASS_SWERR,   /*@@CLASS*/
+ADDR(EXTRA_INFO.ERROR_HANDLER),     /* EXTRA-INFO ADDR */
+G9PXYA1S!G9TE100_GB_LM,             /* USER-ID */
+NULL                                /* OPTIONAL-SWET-INFO ADDR */
+);
+/***@@@ END OF ERROR ***/
+ 
+@K@FREEZE
+917596041
+@K@NAME
+T_ERR4_1
+@K@INSCRIPT
+ERROR_HANDLING:
+DB_OVERFLOW
+MP/NSEI
+@K@CODE
+/***@@@ ERROR ***/
+/*@@ERRORTEXT
+*@ DB-OVERFLOW
+*@
+*@
+*@@DESCRIPTION
+*@ THE INSTANCE-CREATION WAS NOT POSSIBLE
+*@ BECAUSE THE DATABASE WOULD OVERFLOW
+*@
+*@@EXTRA INFO
+*@ (EXTRA_INFO_4_STRUCT)
+*@  NSEI
+*@  NSVCI
+*@  TEXT
+*@
+*/
+ 
+EXTRA_INFO.TYP4.NSEI := EVD_PTR->.KEYS.INT_ARR(0);
+EXTRA_INFO.TYP4.NSVCI:= EVD_PTR->.KEYS.INT_ARR(1);
+EXTRA_INFO.TYP4.TEXT := 'NSVC-HAND.: MP/NSEI-OVERFLOW';
+ 
+G9PXYA1S!G9TE500_EHP_P(
+'G9IBSA1C004',                          /*@@ID*/
+G9PXYA1S!G9TE102_ERR_CLASS_ESC_MAX_ANY, /*@@CLASS*/
+ADDR(EXTRA_INFO.ERROR_HANDLER),         /* EXTRA-INFO ADDR */
+G9PXYA1S!G9TE100_GB_LM,                 /* USER-ID */
+NULL                                    /* OPTIONAL-SWET-INFO ADDR */
+);
+/***@@@ END OF ERROR ***/
+ 
+@K@FREEZE
+920903219
+@K@NAME
+T_ERR4_2
+@K@INSCRIPT
+ERROR_HANDLING:
+DB_OVERFLOW
+MP/NSVCI
+@K@CODE
+/***@@@ ERROR ***/
+/*@@ERRORTEXT
+*@ DB-OVERFLOW
+*@
+*@
+*@@DESCRIPTION
+*@ THE INSTANCE-CREATION WAS NOT POSSIBLE
+*@ BECAUSE THE DATABASE WOULD OVERFLOW
+*@
+*@@EXTRA INFO
+*@ (EXTRA_INFO_4_STRUCT)
+*@  NSEI
+*@  NSVCI
+*@  TEXT
+*@
+*/
+ 
+EXTRA_INFO.TYP4.NSEI := EVD_PTR->.KEYS.INT_ARR(0);
+EXTRA_INFO.TYP4.NSVCI:= EVD_PTR->.KEYS.INT_ARR(1);
+EXTRA_INFO.TYP4.TEXT := 'NSVC-HAND.: MP/NSVCI-OVERFLOW';
+ 
+G9PXYA1S!G9TE500_EHP_P(
+'G9IBSA1C004',                          /*@@ID*/
+G9PXYA1S!G9TE102_ERR_CLASS_ESC_MAX_ANY, /*@@CLASS*/
+ADDR(EXTRA_INFO.ERROR_HANDLER),         /* EXTRA-INFO ADDR */
+G9PXYA1S!G9TE100_GB_LM,                 /* USER-ID */
+NULL                                    /* OPTIONAL-SWET-INFO ADDR */
+);
+/***@@@ END OF ERROR ***/
+ 
+@K@FREEZE
+920903222
+@K@NAME
+T_ERR4_3
+@K@INSCRIPT
+ERROR_HANDLING:
+DB_OVERFLOW
+NSEI/NSVCI
+@K@CODE
+/***@@@ ERROR ***/
+/*@@ERRORTEXT
+*@ DB-OVERFLOW
+*@
+*@
+*@@DESCRIPTION
+*@ THE INSTANCE-CREATION WAS NOT POSSIBLE
+*@ BECAUSE THE DATABASE WOULD OVERFLOW
+*@
+*@@EXTRA INFO
+*@ (EXTRA_INFO_4_STRUCT)
+*@  NSEI
+*@  NSVCI
+*@  TEXT
+*@
+*/
+ 
+EXTRA_INFO.TYP4.NSEI := EVD_PTR->.KEYS.INT_ARR(0);
+EXTRA_INFO.TYP4.NSVCI:= EVD_PTR->.KEYS.INT_ARR(1);
+EXTRA_INFO.TYP4.TEXT := 'NSVC-HAND.: NSEI/NSVC-OVERFLOW';
+ 
+G9PXYA1S!G9TE500_EHP_P(
+'G9IBSA1C004',                          /*@@ID*/
+G9PXYA1S!G9TE102_ERR_CLASS_ESC_MAX_ANY, /*@@CLASS*/
+ADDR(EXTRA_INFO.ERROR_HANDLER),         /* EXTRA-INFO ADDR */
+G9PXYA1S!G9TE100_GB_LM,                 /* USER-ID */
+NULL                                    /* OPTIONAL-SWET-INFO ADDR */
+);
+/***@@@ END OF ERROR ***/
+ 
+@K@FREEZE
+920903226
+@K@NAME
+TR_RESET
+@K@INSCRIPT
+RESTART_
+TNS_RESET_
+TIMER
+@K@CODE
+/* TIMER EVENT DESCRIPTOR STILL THERE */
+ 
+/* INITIALIZATION OF THE TIMER-EVENT-DESCRIPTOR STILL VALID */
+NSVCI_CON_PTR->.TIM_EVD_PTR->.TIMER:= TNS_RESET_MAP;
+ 
+/* START TIMER */
+G9PX508_START_TIMER_P
+(
+NSVCI_CON_PTR->.TIM_EVD_PTR
+);
+ 
+@K@FREEZE
+924684867
+@K@NAME
+TX_AUDIT
+@K@INSCRIPT
+FOR
+AUDIT
+ 
+@K@NAME
+M_BLKOACKM
+@K@INSCRIPT
+NS_
+BLOCK_ACK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9IBDF4_NS_LM_M) + G9IBD44_NS_PDU_DATA_OFFSET_C),
+TX_EVD_PTR
+);
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBD40_NS_LM_PDU_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBDL_HANDLE;
+ 
+IF
+/* 'OTHER' ALIVE NSVC TO THIS NSEI EXISTING? */
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR /= NULL
+THEN
+/* USE THIS 'OTHER' FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(0):=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI; 
+/* NSEI TO BE USED FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+/* NSVCI TO BE USED FOR TRANSPORT */
+ELSE
+/* USE AFFECTED NSVC AGAIN FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(0):=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;  /* NSEI TO BE USED FOR
+TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVCI TO BE USED FOR
+TRANSPORT */
+FI;
+ 
+ 
+/* POINTER TO PDU IN POOL-ELEMENT */
+NS_PDU_PTR:= NS_PDU_REF_M (INT(TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT)
+                           + G9IBD44_NS_PDU_DATA_OFFSET_C);
+/* OFFSET OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= G9IBD44_NS_PDU_DATA_OFFSET_C;
+/* LENGTH OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(NS_PDU_PTR->.G9IBDF4_PDU_TYPE) +
+SIZE(NS_PDU_PTR->.D3);
+ 
+/* NOW THE POOL-ELEMENT */
+NS_PDU_PTR->.G9IBDF4_PDU_TYPE:= G9IBDR2_NS_BLOCK_ACK_C; /* PDU-TYPE */
+ 
+NS_PDU_PTR->.D3.NSVCI_TLV.NSVCI_VAL :=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVC TO BE BLOCKED */
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+938805885
+@K@NAME
+T_RCTRUE
+@K@INSCRIPT
+RC
+=
+TRUE
+@K@CODE
+RC:= TRUE;
+ 
+@K@FREEZE
+922176328
+@K@NAME
+M_AC_SBVCN
+@K@INSCRIPT
+G9IBME0_
+ACT_
+SIGN_BVC_C
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB512_GET_MSG_LESS_EV_DESCR_P
+(
+SID_GBNSVC,
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBME0_ACT_SIGN_BVC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBBVC_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=   EVD_PTR->.KEYS.INT_ARR(0);
+TX_EVD_PTR->.KEYS.INT_ARR(1):=   SIGN_BVCI;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+938788211
+@K@NAME
+T_RC_EOD
+@K@INSCRIPT
+RC
+=
+END OF DATA
+ 
+@K@CODE
+RC:= G9IBSM4_RC_END_OF_DATA;
+ 
+@K@FREEZE
+921083785
+@K@NAME
+T_RC_EMP
+@K@INSCRIPT
+RC
+=
+EMPTY
+ 
+@K@CODE
+RC:= G9IBSM4_RC_EMPTY;
+ 
+@K@FREEZE
+921083757
+@K@NAME
+T_RC_ERR
+@K@INSCRIPT
+RC
+=
+ERROR
+ 
+@K@CODE
+RC:= G9IBSM4_RC_ERROR;
+ 
+@K@FREEZE
+921083731
+@K@NAME
+S_UNUSED
+@K@INSCRIPT
+G9IBSM0_
+UNUSED
+@K@CODE
+ 
+ 
+@K@FREEZE
+919416670
+@K@NAME
+TA_UNBLOCK
+@K@INSCRIPT
+START_
+TNS_UNBLOCK_
+TIMER
+@K@CODE
+/* GET TIMER-EVENT DESCRIPTOR */
+G9PB513_GET_TIMER_EV_DESCR_P
+(
+SID_GBNSVC,
+NSVCI_CON_PTR->.TIM_EVD_PTR
+);
+ 
+/* INITIALIZATION OF THE TIMER-EVENT-DESCRIPTOR */
+NSVCI_CON_PTR->.TIM_EVD_PTR->.EVENT_CMD:= G9IBSE4_TO_TNS_C;
+NSVCI_CON_PTR->.TIM_EVD_PTR->.EVENT_DESTINATION:= GBNSVC_HANDLE;
+NSVCI_CON_PTR->.TIM_EVD_PTR->.KEYS.INT_ARR(0):=
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;
+NSVCI_CON_PTR->.TIM_EVD_PTR->.KEYS.INT_ARR(1):=
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+NSVCI_CON_PTR->.TIM_EVD_PTR->.TIMER:= TNS_UNBLOCK_MAP;
+ 
+/* START TIMER */
+G9PX508_START_TIMER_P
+(
+NSVCI_CON_PTR->.TIM_EVD_PTR
+);
+ 
+@K@FREEZE
+924686210
+@K@NAME
+M_BLK_ACKM
+@K@INSCRIPT
+NS_
+BLOCK_ACK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9IBDF4_NS_LM_M) + G9IBD44_NS_PDU_DATA_OFFSET_C),
+TX_EVD_PTR
+);
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBD40_NS_LM_PDU_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBDL_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;  /* NSEI TO BE USED FOR
+TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVCI TO BE USED FOR
+TRANSPORT */
+/* POINTER TO PDU IN POOL-ELEMENT */
+NS_PDU_PTR:= NS_PDU_REF_M (INT(TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT)
+                           + G9IBD44_NS_PDU_DATA_OFFSET_C);
+/* OFFSET OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= G9IBD44_NS_PDU_DATA_OFFSET_C;
+/* LENGTH OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(NS_PDU_PTR->.G9IBDF4_PDU_TYPE) +
+SIZE(NS_PDU_PTR->.D3);
+ 
+/* NOW THE POOL-ELEMENT */
+NS_PDU_PTR->.G9IBDF4_PDU_TYPE:= G9IBDR2_NS_BLOCK_ACK_C; /* PDU-TYPE */
+ 
+NS_PDU_PTR->.D3.NSVCI_TLV.NSVCI_VAL :=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVC TO BE BLOCKED */
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+926348442
+@K@NAME
+TA_NXTALIV
+@K@INSCRIPT
+DEFINE
+NEW 'NEXT_
+ALIVE'
+@K@CODE
+IF
+/* ALIVE NSVC TO THE NSEI EXISTING? */
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR /= NULL
+ 
+THEN
+/* TAKE NEXT ELEMENT IN THE LINKED LIST AS THE NEXT ALIVE NSVC */
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR:=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.NEXT_ALV_NSVCI_CON_PTR;
+ 
+FI;
+ 
+@K@FREEZE
+938801086
+@K@NAME
+M_DE_CBVCN
+@K@INSCRIPT
+G9IBME2_
+DEACT_
+CELL_BVC_C
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB512_GET_MSG_LESS_EV_DESCR_P
+(
+SID_GBNSVC,
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBME2_DEACT_CELL_BVC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBBVC_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;
+TX_EVD_PTR->.KEYS.INT_ARR(1):=   EVD_PTR->.ADD_DATA(3);
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+933318270
+@K@NAME
+TA_NXTRESP
+@K@INSCRIPT
+DEFINE
+NEW 'NEXT_
+RESPONSIBLE'
+@K@CODE
+NSEI_CON_PTR->.NEXT_RESP_NSVCI_CON_PTR:=
+ NSEI_CON_PTR->.NEXT_RESP_NSVCI_CON_PTR->.NEXT_LSP_NSVCI_CON_PTR;
+ 
+ 
+@K@FREEZE
+938005006
+@K@NAME
+TA_NXTSUBS
+@K@INSCRIPT
+DEFINE
+NEW 'NEXT_
+SUBSTITUTE'
+@K@CODE
+NSEI_CON_PTR->.NEXT_SUBS_NSVCI_CON_PTR:=
+ NSEI_CON_PTR->.NEXT_SUBS_NSVCI_CON_PTR->.NEXT_UBL_NSVCI_CON_PTR;
+ 
+@K@NAME
+M_BLK_O__M
+@K@INSCRIPT
+NS_
+BLOCK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9IBDF4_NS_LM_M) + G9IBD44_NS_PDU_DATA_OFFSET_C),
+TX_EVD_PTR
+);
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBD40_NS_LM_PDU_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBDL_HANDLE;
+ 
+IF
+/* 'OTHER' ALIVE NSVC TO THIS NSEI EXISTING? */
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR /= NULL
+THEN
+/* USE THIS 'OTHER' FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(0):=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI; 
+/* NSEI TO BE USED FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+/* NSVCI TO BE USED FOR TRANSPORT */
+ELSE
+/* USE AFFECTED NSVC AGAIN FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(0):=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;  /* NSEI TO BE USED FOR
+TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVCI TO BE USED FOR
+TRANSPORT */
+FI;
+ 
+ 
+/* POINTER TO PDU IN POOL-ELEMENT */
+NS_PDU_PTR:= NS_PDU_REF_M (INT(TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT)
+                           + G9IBD44_NS_PDU_DATA_OFFSET_C);
+/* OFFSET OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= G9IBD44_NS_PDU_DATA_OFFSET_C;
+/* LENGTH OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(NS_PDU_PTR->.G9IBDF4_PDU_TYPE) +
+SIZE(NS_PDU_PTR->.D2);
+ 
+ 
+/* NOW THE POOL-ELEMENT */
+NS_PDU_PTR->.G9IBDF4_PDU_TYPE:= G9IBDR1_NS_BLOCK_C; /* PDU-TYPE */
+ 
+NS_PDU_PTR->.D2.CAUSE_TLV.CAUSE_VAL:=
+ G9IBBA2_NS_TRANSIT_NETWORK_FAILURE;       /* CAUSE FOR BLOCK */
+NS_PDU_PTR->.D2.NSVCI_TLV.NSVCI_VAL :=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVC TO BE BLOCKED */
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@TEXT
+GSM 8.16 CHAP. 7.2:
+THE NS-BLOCK-PDU MAY BE SENT IN ANY ALIVE
+(BLOCKED OR UNBLOCKED) NS-VC...
+@K@FREEZE
+938803215
+@K@NAME
+M_DE_SBVCN
+@K@INSCRIPT
+G9IBME1_
+DEACT_
+SIGN_BVC_C
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB512_GET_MSG_LESS_EV_DESCR_P
+(
+SID_GBNSVC,
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBME1_DEACT_SIGN_BVC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBBVC_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=   EVD_PTR->.KEYS.INT_ARR(0);
+TX_EVD_PTR->.KEYS.INT_ARR(1):=   SIGN_BVCI;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+938788201
+@K@NAME
+M_OAME401M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+RESET_PDU
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSE */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSE;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSE_ID:=      EVD_PTR->.KEYS.INT_ARR(0); /*
+USED NSEI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_RESET_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.ADD_DATA(0); /* AFFECTED NSEI (FROM PDU) */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.ADD_DATA(1); /* AFFECTED NSVCI (FROM PDU) */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+935766108
+@K@NAME
+M_OAME402M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+RESET_PDU
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     EVD_PTR->.KEYS.INT_ARR(1); /*
+USED NSVCI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_RESET_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.ADD_DATA(0); /* NSEI FROM PDU */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.ADD_DATA(1); /* NSVCI FROM PDU */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+935766407
+@K@NAME
+M_OAME411M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+RESET_ACK_PDU
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSE */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSE;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSE_ID:=      EVD_PTR->.KEYS.INT_ARR(0); /*
+USED NSEI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_RESET_ACK_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.ADD_DATA(0); /* NSEI FROM PDU */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.ADD_DATA(1); /* NSVCI FROM PDU */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+935767332
+@K@NAME
+M_OAME412M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+RESET_ACK_PDU
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     EVD_PTR->.KEYS.INT_ARR(1); /*
+USED NSVCI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_RESET_ACK_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.ADD_DATA(0); /* NSEI FROM PDU */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.ADD_DATA(1); /* NSVCI FROM PDU */
+ 
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+935767189
+@K@NAME
+C_CON
+@K@INSCRIPT
+RC_DB
+@K@CODE
+RC_DB
+ 
+@K@FREEZE
+922176673
+@K@NAME
+M_BLK____M
+@K@INSCRIPT
+NS_
+BLOCK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9IBDF4_NS_LM_M) + G9IBD44_NS_PDU_DATA_OFFSET_C),
+TX_EVD_PTR
+);
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBD40_NS_LM_PDU_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBDL_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;  /* NSEI TO BE USED FOR
+TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVCI TO BE USED FOR
+TRANSPORT */
+/* POINTER TO PDU IN POOL-ELEMENT */
+NS_PDU_PTR:= NS_PDU_REF_M (INT(TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT)
+                           + G9IBD44_NS_PDU_DATA_OFFSET_C);
+/* OFFSET OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= G9IBD44_NS_PDU_DATA_OFFSET_C;
+/* LENGTH OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(NS_PDU_PTR->.G9IBDF4_PDU_TYPE) +
+SIZE(NS_PDU_PTR->.D2);
+ 
+ 
+/* NOW THE POOL-ELEMENT */
+NS_PDU_PTR->.G9IBDF4_PDU_TYPE:= G9IBDR1_NS_BLOCK_C; /* PDU-TYPE */
+ 
+NS_PDU_PTR->.D2.CAUSE_TLV.CAUSE_VAL:=
+ G9IBBA2_NS_OAM_INTERVENTION;              /* CAUSE FOR BLOCK */
+NS_PDU_PTR->.D2.NSVCI_TLV.NSVCI_VAL :=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVC TO BE BLOCKED */
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@TEXT
+GSM 8.16 CHAP. 7.2:
+THE NS-BLOCK-PDU MAY BE SENT IN ANY ALIVE
+(BLOCKED OR UNBLOCKED) NS-VC...
+@K@FREEZE
+926348613
+@K@NAME
+S_BLOCKED
+@K@INSCRIPT
+G9IBSM0_
+BLOCKED
+@K@CODE
+ 
+ 
+@K@FREEZE
+922176496
+@K@NAME
+D_CON
+@K@INSCRIPT
+CONTEXT
+GOT
+@K@CODE
+RC_DB = G9IBSR0_RC_OK
+ 
+@K@FREEZE
+921772339
+@K@NAME
+M_OAME901M
+@K@INSCRIPT
+ERROR_MESSAGE:
+OPERATIONAL_STATE_CHANGE
+UBL->BLK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = OPERATIONAL_STATE_CHANGE */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_OPERATIONAL_STATE_CHANGE;
+/* ADDITIONAL_OPERATIONAL_STATE_INFO */
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_OLD:=
+ G9OC101_UNBLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_OLD:=
+ G9OC102_ENABLED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_NEW:=
+ G9OC102_ENABLED;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+925970975
+@K@NAME
+M_OAME902M
+@K@INSCRIPT
+ERROR_MESSAGE:
+OPERATIONAL_STATE_CHANGE
+UBL->BLK
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = OPERATIONAL_STATE_CHANGE */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_OPERATIONAL_STATE_CHANGE;
+/* ADDITIONAL_OPERATIONAL_STATE_INFO */
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_OLD:=
+ G9OC101_UNBLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_OLD:=
+ G9OC102_ENABLED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_NEW:=
+ G9OC102_DISABLED;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+925970987
+@K@NAME
+M_OAME10SM
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_BEGIN_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_BEGIN_NS_ALIVE_TEST*/
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_BEGIN_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ TRUE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@NAME
+M_OAME911M
+@K@INSCRIPT
+ERROR_MESSAGE:
+OPERATIONAL_STATE_CHANGE
+BLK->UBL
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = OPERATIONAL_STATE_CHANGE */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_OPERATIONAL_STATE_CHANGE;
+/* ADDITIONAL_OPERATIONAL_STATE_INFO */
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_NEW:=
+ G9OC101_UNBLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_OLD:=
+ G9OC102_ENABLED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_NEW:=
+ G9OC102_ENABLED;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+925970996
+@K@NAME
+M_OAME20SM
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_END_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_END_NS_ALIVE_TEST */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_END_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ TRUE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@NAME
+M_OAME10_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_BEGIN_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_BEGIN_NS_ALIVE_TEST*/
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_BEGIN_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ TRUE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443813
+@K@NAME
+D_SEM
+@K@INSCRIPT
+CALL_SEM
+=
+TRUE
+@K@CODE
+CALL_SEM = TRUE
+ 
+@K@FREEZE
+922176624
+@K@NAME
+D_N_0
+@K@INSCRIPT
+N = 0
+ 
+@K@CODE
+NSVCI_CON_PTR->.N = 0
+ 
+@K@FREEZE
+921511000
+@K@NAME
+M_OAME12_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_BEGIN_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_BEGIN_NS_ALIVE_TEST*/
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_BEGIN_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ FALSE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_ALIVE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443829
+@K@NAME
+M_OAME21_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_END_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_END_NS_ALIVE_TEST */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_END_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ TRUE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ FALSE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443856
+@K@NAME
+M_OAME13_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_BEGIN_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_BEGIN_NS_ALIVE_TEST*/
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_BEGIN_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ FALSE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_UNBLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_ALIVE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443838
+@K@NAME
+M_OAME22_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_END_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_END_NS_ALIVE_TEST */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_END_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ FALSE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_ALIVE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443864
+@K@NAME
+M_OAME30_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+NO_ANSWER_FORM_BSS
+RESET_PROCEDURE
+ 
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = NO_ANSWER_FROM_BSS */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_NO_ANSWER_FROM_BSS;
+/* INITIATED_PROCEDURE */
+OAM_MSG_PTR->.INITIATED_PROCEDURE:=
+ G9OC123_RESET_PROCEDURE;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922175973
+@K@NAME
+M_OAME31_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+NO_ANSWER_FROM_BSS
+BLOCK_PROCEDURE
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = NO_ANSWER_FROM_BSS */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_NO_ANSWER_FROM_BSS;
+/* INITIATED_PROCEDURE */
+OAM_MSG_PTR->.INITIATED_PROCEDURE:=
+ G9OC123_BLOCK_PROCEDURE;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922175976
+@K@NAME
+M_OAME32_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+NO_ANSWER_FROM_BSS
+UNBLOCK_PROCEDURE
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = NO_ANSWER_FROM_BSS */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_NO_ANSWER_FROM_BSS;
+/* INITIATED_PROCEDURE */
+OAM_MSG_PTR->.INITIATED_PROCEDURE:=
+ G9OC123_UNBLOCK_PROCEDURE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922175980
+@K@NAME
+M_OAME42_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+BLOCK_PDU
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     EVD_PTR->.ADD_DATA(1); /*
+USED NSVCI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_BLOCK_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.KEYS.INT_ARR(0); /* AFFECTED NSEI (FROM PDU) */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.KEYS.INT_ARR(1); /* AFFECTED NSVCI (FROM PDU) */
+ 
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+934296141
+@K@NAME
+M_OAME50_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+STATUS_PDU_CONTAINS_ERROR_INFO
+RECEIVED
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR-CAUSE = STATUS_PDU_CONTAINS_ERROR_INFO */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_STATUS_PDU_CONTAINS_ERROR_INFO;
+/* ADDITIONAL_STATUS_PDU_INFO */
+INT_CAUSE_PTR.INT_PTR:= ADDR(EVD_PTR->.ADD_DATA(2));
+OAM_MSG_PTR->.ADDITIONAL_STATUS_PDU_INFO:=
+  INT_CAUSE_PTR.CAUSE_PTR->; /* CAUSE */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@TEXT
+NICHT OK
+ 
+@K@FREEZE
+934298924
+@K@NAME
+M_OAME43_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+BLOCK_ACK_PDU
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     EVD_PTR->.ADD_DATA(1); /*
+USED NSVCI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_BLOCK_ACK_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.KEYS.INT_ARR(0); /* AFFECTED NSEI (FROM PDU) */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.KEYS.INT_ARR(1); /* AFFECTED NSVCI (FROM PDU) */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+934297710
diff --git a/gawk-5.0.1/test/getlnbuf.ok b/gawk-5.0.1/test/getlnbuf.ok
new file mode 100644
index 00000000000..062b377f282
--- /dev/null
+++ b/gawk-5.0.1/test/getlnbuf.ok
@@ -0,0 +1,1708 @@
+EXTRA_INFO.TYP3.EC  := EC;
+EXTRA_INFO.TYP3.TEXT:= 'CONNECT_SERVICE TO OAM FAILED';
+ 
+G9PXYA1S!G9TE500_EHP_P(
+'G9IBSA1C003',                      /*@@ID*/
+G9PXYA1S!G9TE102_ERR_CLASS_SWERR,   /*@@CLASS*/
+ADDR(EXTRA_INFO.ERROR_HANDLER),     /* EXTRA-INFO ADDR */
+G9PXYA1S!G9TE100_GB_LM,             /* USER-ID */
+NULL                                /* OPTIONAL-SWET-INFO ADDR */
+);
+/***@@@ END OF ERROR ***/
+ 
+@K@FREEZE
+917596041
+@K@NAME
+T_ERR4_1
+@K@INSCRIPT
+ERROR_HANDLING:
+DB_OVERFLOW
+MP/NSEI
+@K@CODE
+/***@@@ ERROR ***/
+/*@@ERRORTEXT
+*@ DB-OVERFLOW
+*@
+*@
+*@@DESCRIPTION
+*@ THE INSTANCE-CREATION WAS NOT POSSIBLE
+*@ BECAUSE THE DATABASE WOULD OVERFLOW
+*@
+*@@EXTRA INFO
+*@ (EXTRA_INFO_4_STRUCT)
+*@  NSEI
+*@  NSVCI
+*@  TEXT
+*@
+*/
+ 
+EXTRA_INFO.TYP4.NSEI := EVD_PTR->.KEYS.INT_ARR(0);
+EXTRA_INFO.TYP4.NSVCI:= EVD_PTR->.KEYS.INT_ARR(1);
+EXTRA_INFO.TYP4.TEXT := 'NSVC-HAND.: MP/NSEI-OVERFLOW';
+ 
+G9PXYA1S!G9TE500_EHP_P(
+'G9IBSA1C004',                          /*@@ID*/
+G9PXYA1S!G9TE102_ERR_CLASS_ESC_MAX_ANY, /*@@CLASS*/
+ADDR(EXTRA_INFO.ERROR_HANDLER),         /* EXTRA-INFO ADDR */
+G9PXYA1S!G9TE100_GB_LM,                 /* USER-ID */
+NULL                                    /* OPTIONAL-SWET-INFO ADDR */
+);
+/***@@@ END OF ERROR ***/
+ 
+@K@FREEZE
+920903219
+@K@NAME
+T_ERR4_2
+@K@INSCRIPT
+ERROR_HANDLING:
+DB_OVERFLOW
+MP/NSVCI
+@K@CODE
+/***@@@ ERROR ***/
+/*@@ERRORTEXT
+*@ DB-OVERFLOW
+*@
+*@
+*@@DESCRIPTION
+*@ THE INSTANCE-CREATION WAS NOT POSSIBLE
+*@ BECAUSE THE DATABASE WOULD OVERFLOW
+*@
+*@@EXTRA INFO
+*@ (EXTRA_INFO_4_STRUCT)
+*@  NSEI
+*@  NSVCI
+*@  TEXT
+*@
+*/
+ 
+EXTRA_INFO.TYP4.NSEI := EVD_PTR->.KEYS.INT_ARR(0);
+EXTRA_INFO.TYP4.NSVCI:= EVD_PTR->.KEYS.INT_ARR(1);
+EXTRA_INFO.TYP4.TEXT := 'NSVC-HAND.: MP/NSVCI-OVERFLOW';
+ 
+G9PXYA1S!G9TE500_EHP_P(
+'G9IBSA1C004',                          /*@@ID*/
+G9PXYA1S!G9TE102_ERR_CLASS_ESC_MAX_ANY, /*@@CLASS*/
+ADDR(EXTRA_INFO.ERROR_HANDLER),         /* EXTRA-INFO ADDR */
+G9PXYA1S!G9TE100_GB_LM,                 /* USER-ID */
+NULL                                    /* OPTIONAL-SWET-INFO ADDR */
+);
+/***@@@ END OF ERROR ***/
+ 
+@K@FREEZE
+920903222
+@K@NAME
+T_ERR4_3
+@K@INSCRIPT
+ERROR_HANDLING:
+DB_OVERFLOW
+NSEI/NSVCI
+@K@CODE
+/***@@@ ERROR ***/
+/*@@ERRORTEXT
+*@ DB-OVERFLOW
+*@
+*@
+*@@DESCRIPTION
+*@ THE INSTANCE-CREATION WAS NOT POSSIBLE
+*@ BECAUSE THE DATABASE WOULD OVERFLOW
+*@
+*@@EXTRA INFO
+*@ (EXTRA_INFO_4_STRUCT)
+*@  NSEI
+*@  NSVCI
+*@  TEXT
+*@
+*/
+ 
+EXTRA_INFO.TYP4.NSEI := EVD_PTR->.KEYS.INT_ARR(0);
+EXTRA_INFO.TYP4.NSVCI:= EVD_PTR->.KEYS.INT_ARR(1);
+EXTRA_INFO.TYP4.TEXT := 'NSVC-HAND.: NSEI/NSVC-OVERFLOW';
+ 
+G9PXYA1S!G9TE500_EHP_P(
+'G9IBSA1C004',                          /*@@ID*/
+G9PXYA1S!G9TE102_ERR_CLASS_ESC_MAX_ANY, /*@@CLASS*/
+ADDR(EXTRA_INFO.ERROR_HANDLER),         /* EXTRA-INFO ADDR */
+G9PXYA1S!G9TE100_GB_LM,                 /* USER-ID */
+NULL                                    /* OPTIONAL-SWET-INFO ADDR */
+);
+/***@@@ END OF ERROR ***/
+ 
+@K@FREEZE
+920903226
+@K@NAME
+TR_RESET
+@K@INSCRIPT
+RESTART_
+TNS_RESET_
+TIMER
+@K@CODE
+/* TIMER EVENT DESCRIPTOR STILL THERE */
+ 
+/* INITIALIZATION OF THE TIMER-EVENT-DESCRIPTOR STILL VALID */
+NSVCI_CON_PTR->.TIM_EVD_PTR->.TIMER:= TNS_RESET_MAP;
+ 
+/* START TIMER */
+G9PX508_START_TIMER_P
+(
+NSVCI_CON_PTR->.TIM_EVD_PTR
+);
+ 
+@K@FREEZE
+924684867
+@K@NAME
+TX_AUDIT
+@K@INSCRIPT
+FOR
+AUDIT
+ 
+@K@NAME
+M_BLKOACKM
+@K@INSCRIPT
+NS_
+BLOCK_ACK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9IBDF4_NS_LM_M) + G9IBD44_NS_PDU_DATA_OFFSET_C),
+TX_EVD_PTR
+);
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBD40_NS_LM_PDU_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBDL_HANDLE;
+ 
+IF
+/* 'OTHER' ALIVE NSVC TO THIS NSEI EXISTING? */
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR /= NULL
+THEN
+/* USE THIS 'OTHER' FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(0):=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI; 
+/* NSEI TO BE USED FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+/* NSVCI TO BE USED FOR TRANSPORT */
+ELSE
+/* USE AFFECTED NSVC AGAIN FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(0):=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;  /* NSEI TO BE USED FOR
+TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVCI TO BE USED FOR
+TRANSPORT */
+FI;
+ 
+ 
+/* POINTER TO PDU IN POOL-ELEMENT */
+NS_PDU_PTR:= NS_PDU_REF_M (INT(TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT)
+                           + G9IBD44_NS_PDU_DATA_OFFSET_C);
+/* OFFSET OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= G9IBD44_NS_PDU_DATA_OFFSET_C;
+/* LENGTH OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(NS_PDU_PTR->.G9IBDF4_PDU_TYPE) +
+SIZE(NS_PDU_PTR->.D3);
+ 
+/* NOW THE POOL-ELEMENT */
+NS_PDU_PTR->.G9IBDF4_PDU_TYPE:= G9IBDR2_NS_BLOCK_ACK_C; /* PDU-TYPE */
+ 
+NS_PDU_PTR->.D3.NSVCI_TLV.NSVCI_VAL :=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVC TO BE BLOCKED */
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+938805885
+@K@NAME
+T_RCTRUE
+@K@INSCRIPT
+RC
+=
+TRUE
+@K@CODE
+RC:= TRUE;
+ 
+@K@FREEZE
+922176328
+@K@NAME
+M_AC_SBVCN
+@K@INSCRIPT
+G9IBME0_
+ACT_
+SIGN_BVC_C
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB512_GET_MSG_LESS_EV_DESCR_P
+(
+SID_GBNSVC,
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBME0_ACT_SIGN_BVC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBBVC_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=   EVD_PTR->.KEYS.INT_ARR(0);
+TX_EVD_PTR->.KEYS.INT_ARR(1):=   SIGN_BVCI;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+938788211
+@K@NAME
+T_RC_EOD
+@K@INSCRIPT
+RC
+=
+END OF DATA
+ 
+@K@CODE
+RC:= G9IBSM4_RC_END_OF_DATA;
+ 
+@K@FREEZE
+921083785
+@K@NAME
+T_RC_EMP
+@K@INSCRIPT
+RC
+=
+EMPTY
+ 
+@K@CODE
+RC:= G9IBSM4_RC_EMPTY;
+ 
+@K@FREEZE
+921083757
+@K@NAME
+T_RC_ERR
+@K@INSCRIPT
+RC
+=
+ERROR
+ 
+@K@CODE
+RC:= G9IBSM4_RC_ERROR;
+ 
+@K@FREEZE
+921083731
+@K@NAME
+S_UNUSED
+@K@INSCRIPT
+G9IBSM0_
+UNUSED
+@K@CODE
+ 
+ 
+@K@FREEZE
+919416670
+@K@NAME
+TA_UNBLOCK
+@K@INSCRIPT
+START_
+TNS_UNBLOCK_
+TIMER
+@K@CODE
+/* GET TIMER-EVENT DESCRIPTOR */
+G9PB513_GET_TIMER_EV_DESCR_P
+(
+SID_GBNSVC,
+NSVCI_CON_PTR->.TIM_EVD_PTR
+);
+ 
+/* INITIALIZATION OF THE TIMER-EVENT-DESCRIPTOR */
+NSVCI_CON_PTR->.TIM_EVD_PTR->.EVENT_CMD:= G9IBSE4_TO_TNS_C;
+NSVCI_CON_PTR->.TIM_EVD_PTR->.EVENT_DESTINATION:= GBNSVC_HANDLE;
+NSVCI_CON_PTR->.TIM_EVD_PTR->.KEYS.INT_ARR(0):=
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;
+NSVCI_CON_PTR->.TIM_EVD_PTR->.KEYS.INT_ARR(1):=
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+NSVCI_CON_PTR->.TIM_EVD_PTR->.TIMER:= TNS_UNBLOCK_MAP;
+ 
+/* START TIMER */
+G9PX508_START_TIMER_P
+(
+NSVCI_CON_PTR->.TIM_EVD_PTR
+);
+ 
+@K@FREEZE
+924686210
+@K@NAME
+M_BLK_ACKM
+@K@INSCRIPT
+NS_
+BLOCK_ACK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9IBDF4_NS_LM_M) + G9IBD44_NS_PDU_DATA_OFFSET_C),
+TX_EVD_PTR
+);
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBD40_NS_LM_PDU_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBDL_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;  /* NSEI TO BE USED FOR
+TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVCI TO BE USED FOR
+TRANSPORT */
+/* POINTER TO PDU IN POOL-ELEMENT */
+NS_PDU_PTR:= NS_PDU_REF_M (INT(TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT)
+                           + G9IBD44_NS_PDU_DATA_OFFSET_C);
+/* OFFSET OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= G9IBD44_NS_PDU_DATA_OFFSET_C;
+/* LENGTH OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(NS_PDU_PTR->.G9IBDF4_PDU_TYPE) +
+SIZE(NS_PDU_PTR->.D3);
+ 
+/* NOW THE POOL-ELEMENT */
+NS_PDU_PTR->.G9IBDF4_PDU_TYPE:= G9IBDR2_NS_BLOCK_ACK_C; /* PDU-TYPE */
+ 
+NS_PDU_PTR->.D3.NSVCI_TLV.NSVCI_VAL :=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVC TO BE BLOCKED */
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+926348442
+@K@NAME
+TA_NXTALIV
+@K@INSCRIPT
+DEFINE
+NEW 'NEXT_
+ALIVE'
+@K@CODE
+IF
+/* ALIVE NSVC TO THE NSEI EXISTING? */
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR /= NULL
+ 
+THEN
+/* TAKE NEXT ELEMENT IN THE LINKED LIST AS THE NEXT ALIVE NSVC */
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR:=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.NEXT_ALV_NSVCI_CON_PTR;
+ 
+FI;
+ 
+@K@FREEZE
+938801086
+@K@NAME
+M_DE_CBVCN
+@K@INSCRIPT
+G9IBME2_
+DEACT_
+CELL_BVC_C
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB512_GET_MSG_LESS_EV_DESCR_P
+(
+SID_GBNSVC,
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBME2_DEACT_CELL_BVC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBBVC_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;
+TX_EVD_PTR->.KEYS.INT_ARR(1):=   EVD_PTR->.ADD_DATA(3);
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+933318270
+@K@NAME
+TA_NXTRESP
+@K@INSCRIPT
+DEFINE
+NEW 'NEXT_
+RESPONSIBLE'
+@K@CODE
+NSEI_CON_PTR->.NEXT_RESP_NSVCI_CON_PTR:=
+ NSEI_CON_PTR->.NEXT_RESP_NSVCI_CON_PTR->.NEXT_LSP_NSVCI_CON_PTR;
+ 
+ 
+@K@FREEZE
+938005006
+@K@NAME
+TA_NXTSUBS
+@K@INSCRIPT
+DEFINE
+NEW 'NEXT_
+SUBSTITUTE'
+@K@CODE
+NSEI_CON_PTR->.NEXT_SUBS_NSVCI_CON_PTR:=
+ NSEI_CON_PTR->.NEXT_SUBS_NSVCI_CON_PTR->.NEXT_UBL_NSVCI_CON_PTR;
+ 
+@K@NAME
+M_BLK_O__M
+@K@INSCRIPT
+NS_
+BLOCK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9IBDF4_NS_LM_M) + G9IBD44_NS_PDU_DATA_OFFSET_C),
+TX_EVD_PTR
+);
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBD40_NS_LM_PDU_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBDL_HANDLE;
+ 
+IF
+/* 'OTHER' ALIVE NSVC TO THIS NSEI EXISTING? */
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR /= NULL
+THEN
+/* USE THIS 'OTHER' FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(0):=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI; 
+/* NSEI TO BE USED FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=
+
+NSVCI_CON_PTR->.OWN_NSEI_CON_PTR->.NEXT_ALIV_NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+/* NSVCI TO BE USED FOR TRANSPORT */
+ELSE
+/* USE AFFECTED NSVC AGAIN FOR TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(0):=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;  /* NSEI TO BE USED FOR
+TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVCI TO BE USED FOR
+TRANSPORT */
+FI;
+ 
+ 
+/* POINTER TO PDU IN POOL-ELEMENT */
+NS_PDU_PTR:= NS_PDU_REF_M (INT(TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT)
+                           + G9IBD44_NS_PDU_DATA_OFFSET_C);
+/* OFFSET OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= G9IBD44_NS_PDU_DATA_OFFSET_C;
+/* LENGTH OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(NS_PDU_PTR->.G9IBDF4_PDU_TYPE) +
+SIZE(NS_PDU_PTR->.D2);
+ 
+ 
+/* NOW THE POOL-ELEMENT */
+NS_PDU_PTR->.G9IBDF4_PDU_TYPE:= G9IBDR1_NS_BLOCK_C; /* PDU-TYPE */
+ 
+NS_PDU_PTR->.D2.CAUSE_TLV.CAUSE_VAL:=
+ G9IBBA2_NS_TRANSIT_NETWORK_FAILURE;       /* CAUSE FOR BLOCK */
+NS_PDU_PTR->.D2.NSVCI_TLV.NSVCI_VAL :=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVC TO BE BLOCKED */
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@TEXT
+GSM 8.16 CHAP. 7.2:
+THE NS-BLOCK-PDU MAY BE SENT IN ANY ALIVE
+(BLOCKED OR UNBLOCKED) NS-VC...
+@K@FREEZE
+938803215
+@K@NAME
+M_DE_SBVCN
+@K@INSCRIPT
+G9IBME1_
+DEACT_
+SIGN_BVC_C
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB512_GET_MSG_LESS_EV_DESCR_P
+(
+SID_GBNSVC,
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBME1_DEACT_SIGN_BVC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBBVC_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=   EVD_PTR->.KEYS.INT_ARR(0);
+TX_EVD_PTR->.KEYS.INT_ARR(1):=   SIGN_BVCI;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+938788201
+@K@NAME
+M_OAME401M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+RESET_PDU
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSE */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSE;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSE_ID:=      EVD_PTR->.KEYS.INT_ARR(0); /*
+USED NSEI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_RESET_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.ADD_DATA(0); /* AFFECTED NSEI (FROM PDU) */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.ADD_DATA(1); /* AFFECTED NSVCI (FROM PDU) */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+935766108
+@K@NAME
+M_OAME402M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+RESET_PDU
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     EVD_PTR->.KEYS.INT_ARR(1); /*
+USED NSVCI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_RESET_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.ADD_DATA(0); /* NSEI FROM PDU */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.ADD_DATA(1); /* NSVCI FROM PDU */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+935766407
+@K@NAME
+M_OAME411M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+RESET_ACK_PDU
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSE */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSE;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSE_ID:=      EVD_PTR->.KEYS.INT_ARR(0); /*
+USED NSEI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_RESET_ACK_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.ADD_DATA(0); /* NSEI FROM PDU */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.ADD_DATA(1); /* NSVCI FROM PDU */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+935767332
+@K@NAME
+M_OAME412M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+RESET_ACK_PDU
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     EVD_PTR->.KEYS.INT_ARR(1); /*
+USED NSVCI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_RESET_ACK_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.ADD_DATA(0); /* NSEI FROM PDU */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.ADD_DATA(1); /* NSVCI FROM PDU */
+ 
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+935767189
+@K@NAME
+C_CON
+@K@INSCRIPT
+RC_DB
+@K@CODE
+RC_DB
+ 
+@K@FREEZE
+922176673
+@K@NAME
+M_BLK____M
+@K@INSCRIPT
+NS_
+BLOCK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9IBDF4_NS_LM_M) + G9IBD44_NS_PDU_DATA_OFFSET_C),
+TX_EVD_PTR
+);
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9IBD40_NS_LM_PDU_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= GBDL_HANDLE;
+TX_EVD_PTR->.KEYS.INT_ARR(0):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSEI;  /* NSEI TO BE USED FOR
+TRANSPORT */
+TX_EVD_PTR->.KEYS.INT_ARR(1):=  
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVCI TO BE USED FOR
+TRANSPORT */
+/* POINTER TO PDU IN POOL-ELEMENT */
+NS_PDU_PTR:= NS_PDU_REF_M (INT(TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT)
+                           + G9IBD44_NS_PDU_DATA_OFFSET_C);
+/* OFFSET OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= G9IBD44_NS_PDU_DATA_OFFSET_C;
+/* LENGTH OF THE PDU IN POOL-ELEMENT */
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(NS_PDU_PTR->.G9IBDF4_PDU_TYPE) +
+SIZE(NS_PDU_PTR->.D2);
+ 
+ 
+/* NOW THE POOL-ELEMENT */
+NS_PDU_PTR->.G9IBDF4_PDU_TYPE:= G9IBDR1_NS_BLOCK_C; /* PDU-TYPE */
+ 
+NS_PDU_PTR->.D2.CAUSE_TLV.CAUSE_VAL:=
+ G9IBBA2_NS_OAM_INTERVENTION;              /* CAUSE FOR BLOCK */
+NS_PDU_PTR->.D2.NSVCI_TLV.NSVCI_VAL :=
+ NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI; /* NSVC TO BE BLOCKED */
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@TEXT
+GSM 8.16 CHAP. 7.2:
+THE NS-BLOCK-PDU MAY BE SENT IN ANY ALIVE
+(BLOCKED OR UNBLOCKED) NS-VC...
+@K@FREEZE
+926348613
+@K@NAME
+S_BLOCKED
+@K@INSCRIPT
+G9IBSM0_
+BLOCKED
+@K@CODE
+ 
+ 
+@K@FREEZE
+922176496
+@K@NAME
+D_CON
+@K@INSCRIPT
+CONTEXT
+GOT
+@K@CODE
+RC_DB = G9IBSR0_RC_OK
+ 
+@K@FREEZE
+921772339
+@K@NAME
+M_OAME901M
+@K@INSCRIPT
+ERROR_MESSAGE:
+OPERATIONAL_STATE_CHANGE
+UBL->BLK
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = OPERATIONAL_STATE_CHANGE */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_OPERATIONAL_STATE_CHANGE;
+/* ADDITIONAL_OPERATIONAL_STATE_INFO */
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_OLD:=
+ G9OC101_UNBLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_OLD:=
+ G9OC102_ENABLED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_NEW:=
+ G9OC102_ENABLED;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+925970975
+@K@NAME
+M_OAME902M
+@K@INSCRIPT
+ERROR_MESSAGE:
+OPERATIONAL_STATE_CHANGE
+UBL->BLK
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = OPERATIONAL_STATE_CHANGE */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_OPERATIONAL_STATE_CHANGE;
+/* ADDITIONAL_OPERATIONAL_STATE_INFO */
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_OLD:=
+ G9OC101_UNBLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_OLD:=
+ G9OC102_ENABLED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_NEW:=
+ G9OC102_DISABLED;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+925970987
+@K@NAME
+M_OAME10SM
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_BEGIN_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_BEGIN_NS_ALIVE_TEST*/
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_BEGIN_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ TRUE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@NAME
+M_OAME911M
+@K@INSCRIPT
+ERROR_MESSAGE:
+OPERATIONAL_STATE_CHANGE
+BLK->UBL
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = OPERATIONAL_STATE_CHANGE */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_OPERATIONAL_STATE_CHANGE;
+/* ADDITIONAL_OPERATIONAL_STATE_INFO */
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.OPER_STATE_NEW:=
+ G9OC101_UNBLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_OLD:=
+ G9OC102_ENABLED;
+OAM_MSG_PTR->.ADDITIONAL_OPERATIONAL_STATE_INFO.ADMIN_STATE_NEW:=
+ G9OC102_ENABLED;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+925970996
+@K@NAME
+M_OAME20SM
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_END_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_END_NS_ALIVE_TEST */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_END_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ TRUE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@NAME
+M_OAME10_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_BEGIN_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_BEGIN_NS_ALIVE_TEST*/
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_BEGIN_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ TRUE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443813
+@K@NAME
+D_SEM
+@K@INSCRIPT
+CALL_SEM
+=
+TRUE
+@K@CODE
+CALL_SEM = TRUE
+ 
+@K@FREEZE
+922176624
+@K@NAME
+D_N_0
+@K@INSCRIPT
+N = 0
+ 
+@K@CODE
+NSVCI_CON_PTR->.N = 0
+ 
+@K@FREEZE
+921511000
+@K@NAME
+M_OAME12_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_BEGIN_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_BEGIN_NS_ALIVE_TEST*/
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_BEGIN_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ FALSE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_ALIVE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443829
+@K@NAME
+M_OAME21_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_END_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_END_NS_ALIVE_TEST */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_END_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ TRUE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ FALSE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443856
+@K@NAME
+M_OAME13_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_BEGIN_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_BEGIN_NS_ALIVE_TEST*/
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_BEGIN_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ FALSE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_UNBLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_ALIVE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443838
+@K@NAME
+M_OAME22_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ALARM_END_NS_ALIVE_TEST
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = ALARM_END_NS_ALIVE_TEST */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ALARM_END_NS_ALIVE_TEST;
+/* ADDITIONAL_ALARM_INFO */
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.ADMINISTRATIVE_STATE_CHANGED:=
+ FALSE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_OLD:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.OPER_STATE_NEW:=
+ G9OC101_BLOCKED;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_OLD:=
+ G9OC103_DEAD;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.AVAIL_STATE_NEW:=
+ G9OC103_ALIVE;
+OAM_MSG_PTR->.ADDITIONAL_ALARM_INFO.CONFIGURATION_OF_NSVC:=
+ TRUE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922443864
+@K@NAME
+M_OAME30_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+NO_ANSWER_FORM_BSS
+RESET_PROCEDURE
+ 
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = NO_ANSWER_FROM_BSS */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_NO_ANSWER_FROM_BSS;
+/* INITIATED_PROCEDURE */
+OAM_MSG_PTR->.INITIATED_PROCEDURE:=
+ G9OC123_RESET_PROCEDURE;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922175973
+@K@NAME
+M_OAME31_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+NO_ANSWER_FROM_BSS
+BLOCK_PROCEDURE
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = NO_ANSWER_FROM_BSS */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_NO_ANSWER_FROM_BSS;
+/* INITIATED_PROCEDURE */
+OAM_MSG_PTR->.INITIATED_PROCEDURE:=
+ G9OC123_BLOCK_PROCEDURE;
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922175976
+@K@NAME
+M_OAME32_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+NO_ANSWER_FROM_BSS
+UNBLOCK_PROCEDURE
+ 
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=    
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR_CAUSE = NO_ANSWER_FROM_BSS */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_NO_ANSWER_FROM_BSS;
+/* INITIATED_PROCEDURE */
+OAM_MSG_PTR->.INITIATED_PROCEDURE:=
+ G9OC123_UNBLOCK_PROCEDURE;
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+922175980
+@K@NAME
+M_OAME42_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+BLOCK_PDU
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     EVD_PTR->.ADD_DATA(1); /*
+USED NSVCI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_BLOCK_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.KEYS.INT_ARR(0); /* AFFECTED NSEI (FROM PDU) */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.KEYS.INT_ARR(1); /* AFFECTED NSVCI (FROM PDU) */
+ 
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+934296141
+@K@NAME
+M_OAME50_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+STATUS_PDU_CONTAINS_ERROR_INFO
+RECEIVED
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     
+NSVCI_CON_PTR->.DBMS.NSVC_INSTANCE.NSVCI;
+ 
+/* ERROR-CAUSE = STATUS_PDU_CONTAINS_ERROR_INFO */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_STATUS_PDU_CONTAINS_ERROR_INFO;
+/* ADDITIONAL_STATUS_PDU_INFO */
+INT_CAUSE_PTR.INT_PTR:= ADDR(EVD_PTR->.ADD_DATA(2));
+OAM_MSG_PTR->.ADDITIONAL_STATUS_PDU_INFO:=
+  INT_CAUSE_PTR.CAUSE_PTR->; /* CAUSE */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@TEXT
+NICHT OK
+ 
+@K@FREEZE
+934298924
+@K@NAME
+M_OAME43_M
+@K@INSCRIPT
+ERROR_MESSAGE:
+ERRONOUS_PDU
+BLOCK_ACK_PDU
+@K@CODE
+/* GETTING THE EVENT DESCRIPTOR */
+G9PB511_GET_MSG_BOUND_EV_DESCR_P
+(
+SID_GBNSVC,
+(SIZE(G9OC109_REPORTED_EVENT_STR_M)),
+TX_EVD_PTR
+);
+ 
+ 
+/* COMPOSING THE EVENT */
+/* FIRST THE DESCRIPTOR */
+TX_EVD_PTR->.EVENT_CMD:=         G9PX040_SEND_MBC_C;
+TX_EVD_PTR->.EVENT_DESTINATION:= RXTX_HANDLE;
+TX_EVD_PTR->.KEYS.UBI_INDEX:=    OAM_UBI_INDEX;
+TX_EVD_PTR->.BOUND.DATA_OFFSET:= 0;
+TX_EVD_PTR->.BOUND.DATA_LENGTH:= SIZE(G9OC109_REPORTED_EVENT_STR_M);
+ 
+/* NOW THE POOL-ELEMENT */
+/* INITIALIZATION OF THE POINTER WITH THE POOL-ELEMENT-START */
+OAM_MSG_PTR:= OAM_MSG_PTR_M (TX_EVD_PTR->.BOUND.PTR_TO_POOL_ELEMENT);
+ 
+/* COMPOSING THE MESSAGE */
+/* HANDLED OBJECT = AFFECTED INSTANCE, TYPE NSVC */
+OAM_MSG_PTR->.HANDLED_OBJECT.OBJECT_TYPE:= G9OC104_NSVC;
+OAM_MSG_PTR->.HANDLED_OBJECT.NSVC_ID:=     EVD_PTR->.ADD_DATA(1); /*
+USED NSVCI (FROM ECI) */
+ 
+/* ERROR-CAUSE = ERRONEOUS_PDU */
+OAM_MSG_PTR->.ERROR_CAUSE:= G9OC108_ERRONEOUS_PDU;
+/* ADDITIONAL_PDU_INFO */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_PDU_TYPE:=
+ G9OC124_BLOCK_ACK_PDU;
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSEI:=
+ EVD_PTR->.KEYS.INT_ARR(0); /* AFFECTED NSEI (FROM PDU) */
+OAM_MSG_PTR->.ADDITIONAL_PDU_INFO.G9OC120_REPORTED_NSVC:=
+ EVD_PTR->.KEYS.INT_ARR(1); /* AFFECTED NSVCI (FROM PDU) */
+ 
+ 
+ 
+/* SENDING */
+G9PX503_POST_EVENT_P(TX_EVD_PTR);
+ 
+@K@FREEZE
+934297710
diff --git a/gawk-5.0.1/test/getlndir.awk b/gawk-5.0.1/test/getlndir.awk
new file mode 100644
index 00000000000..250c5abb767
--- /dev/null
+++ b/gawk-5.0.1/test/getlndir.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	if (!SRCDIR) SRCDIR = "."
+	OFS = ", "
+	x = 4
+	ret = (getline x < SRCDIR)
+	print x, ret, ERRNO
+}
diff --git a/gawk-5.0.1/test/getlndir.ok b/gawk-5.0.1/test/getlndir.ok
new file mode 100644
index 00000000000..a9bafa01eeb
--- /dev/null
+++ b/gawk-5.0.1/test/getlndir.ok
@@ -0,0 +1 @@
+4, -1, Is a directory
diff --git a/gawk-5.0.1/test/getlnhd.awk b/gawk-5.0.1/test/getlnhd.awk
new file mode 100644
index 00000000000..f0f801b2657
--- /dev/null
+++ b/gawk-5.0.1/test/getlnhd.awk
@@ -0,0 +1,10 @@
+BEGIN { pipe =      "cat <<EOF\n"
+        pipe = pipe "select * from user\n"
+        pipe = pipe "  where Name = 'O\\'Donell'\n"
+        pipe = pipe "EOF\n"
+        
+        while ((pipe | getline) > 0)
+                print
+        
+        exit 0
+}       
diff --git a/gawk-5.0.1/test/getlnhd.ok b/gawk-5.0.1/test/getlnhd.ok
new file mode 100644
index 00000000000..d8cb4530159
--- /dev/null
+++ b/gawk-5.0.1/test/getlnhd.ok
@@ -0,0 +1,2 @@
+select * from user
+  where Name = 'O\'Donell'
diff --git a/gawk-5.0.1/test/getnr2tb.awk b/gawk-5.0.1/test/getnr2tb.awk
new file mode 100644
index 00000000000..204acf463e3
--- /dev/null
+++ b/gawk-5.0.1/test/getnr2tb.awk
@@ -0,0 +1,111 @@
+#From vp@dmat.uevora.pt Thu Jun 18 09:10 EDT 1998
+#Received: from mescaline.gnu.org (we-refuse-to-spy-on-our-users@mescaline.gnu.org [158.121.106.21]) by cssun.mathcs.emory.edu (8.7.5/8.6.9-940818.01cssun) with ESMTP id JAA23649 for <arnold@mathcs.emory.edu>; Thu, 18 Jun 1998 09:10:54 -0400 (EDT)
+#Received: from khromeleque.dmat.uevora.pt by mescaline.gnu.org (8.8.5/8.6.12GNU) with ESMTP id JAA21732 for <arnold@gnu.ai.mit.edu>; Thu, 18 Jun 1998 09:11:19 -0400
+#Received: from khromeleque.dmat.uevora.pt (vp@localhost [127.0.0.1])
+#	by khromeleque.dmat.uevora.pt (8.8.8/8.8.8/Debian/GNU) with ESMTP id OAA11817
+#	for <arnold@gnu.ai.mit.edu>; Thu, 18 Jun 1998 14:13:57 +0100
+#Message-Id: <199806181313.OAA11817@khromeleque.dmat.uevora.pt>
+#To: arnold@gnu.org
+#Subject: concatenation bug in gawk 3.0.3
+#Date: Thu, 18 Jun 1998 14:13:57 +0200
+#From: Vasco Pedro <vp@dmat.uevora.pt>
+#Content-Type: text
+#Content-Length: 2285
+#Status: RO
+#
+#Hi,
+#
+#The gawk program '{print NR " " 10/NR}' will print:
+#
+#1 10
+#5 5
+#3 3.33333
+#2 2.5
+#2 2
+#1 1.66667
+#
+#instead of the correct:
+#
+#1 10
+#2 5
+#3 3.33333
+#4 2.5
+#5 2
+#6 1.66667
+#
+#You'll notice, on the incorrect output, that the first column is
+#the first digit of the second.
+#
+#I think the problem comes from the way builtin variables are handled.
+#Since the items to be concatenated are processed in reverse order and
+#the return value of tree_eval(``NR'') is a pointer to the value part
+#of `NR_node', the `unref()' of `NR_node' due to its second occurrence
+#will leave a dangling pointer in `strlist'. The reason that it doesn't
+#reuse the freed space with objects of the same type. (Using Electric
+#Fence with EF_PROTECT_FREE set confirms that freed space is being
+#accessed.)
+#
+#The enclosed patch (hack would be a better word to describe it) is
+#all I could come up with. With it installed, things seem to work ok,
+#but I doubt this is the correct way to do it. (If I treated the
+#case for `Node_field_spec' as the I did others, `make check' would
+#fail in several places.)
+#
+#Regards,
+#vasco
+#
+#*** eval.c~	Tue May  6 21:39:55 1997
+#--- eval.c	Thu Jun 18 13:39:25 1998
+#***************
+#*** 685,697 ****
+#  		return func_call(tree->rnode, tree->lnode);
+#  
+#  		/* unary operations */
+#  	case Node_NR:
+#  	case Node_FNR:
+#  	case Node_NF:
+#  	case Node_FIELDWIDTHS:
+#  	case Node_FS:
+#  	case Node_RS:
+#- 	case Node_field_spec:
+#  	case Node_subscript:
+#  	case Node_IGNORECASE:
+#  	case Node_OFS:
+#--- 685,700 ----
+#  		return func_call(tree->rnode, tree->lnode);
+#  
+#  		/* unary operations */
+#+ 	case Node_field_spec:
+#+ 		lhs = get_lhs(tree, (Func_ptr *) NULL);
+#+ 		return *lhs;
+#+ 
+#  	case Node_NR:
+#  	case Node_FNR:
+#  	case Node_NF:
+#  	case Node_FIELDWIDTHS:
+#  	case Node_FS:
+#  	case Node_RS:
+#  	case Node_subscript:
+#  	case Node_IGNORECASE:
+#  	case Node_OFS:
+#***************
+#*** 699,705 ****
+#  	case Node_OFMT:
+#  	case Node_CONVFMT:
+#  		lhs = get_lhs(tree, (Func_ptr *) NULL);
+#! 		return *lhs;
+#  
+#  	case Node_var_array:
+#  		fatal("attempt to use array `%s' in a scalar context",
+#--- 702,710 ----
+#  	case Node_OFMT:
+#  	case Node_CONVFMT:
+#  		lhs = get_lhs(tree, (Func_ptr *) NULL);
+#! 		r = dupnode(*lhs);
+#! 		r->flags |= TEMP;
+#! 		return r;
+#  
+#  	case Node_var_array:
+#  		fatal("attempt to use array `%s' in a scalar context",
+#
+{ print NR " " 10/NR }
diff --git a/gawk-5.0.1/test/getnr2tb.in b/gawk-5.0.1/test/getnr2tb.in
new file mode 100644
index 00000000000..f9858572241
--- /dev/null
+++ b/gawk-5.0.1/test/getnr2tb.in
@@ -0,0 +1,6 @@
+line 1
+line 2
+line 3
+line 4
+line 5
+line 6
diff --git a/gawk-5.0.1/test/getnr2tb.ok b/gawk-5.0.1/test/getnr2tb.ok
new file mode 100644
index 00000000000..7b40e8d7519
--- /dev/null
+++ b/gawk-5.0.1/test/getnr2tb.ok
@@ -0,0 +1,6 @@
+1 10
+2 5
+3 3.33333
+4 2.5
+5 2
+6 1.66667
diff --git a/gawk-5.0.1/test/getnr2tm.awk b/gawk-5.0.1/test/getnr2tm.awk
new file mode 100644
index 00000000000..dfe377a8488
--- /dev/null
+++ b/gawk-5.0.1/test/getnr2tm.awk
@@ -0,0 +1,75 @@
+#From dhw@gamgee.acad.emich.edu  Sat Oct 31 22:54:07 1998
+#Return-Path: <dhw@gamgee.acad.emich.edu>
+#Received: from cssun.mathcs.emory.edu (cssun.mathcs.emory.edu [170.140.150.1])
+#	by amx.netvision.net.il (8.9.0.Beta5/8.8.6) with ESMTP id HAA08891
+#	for <arobbins@netvision.net.il>; Sat, 31 Oct 1998 07:14:07 +0200 (IST)
+#Received: from mescaline.gnu.org (we-refuse-to-spy-on-our-users@mescaline.gnu.org [158.121.106.21]) by cssun.mathcs.emory.edu (8.7.5/8.6.9-940818.01cssun) with ESMTP id AAA14947 for <arnold@mathcs.emory.edu>; Sat, 31 Oct 1998 00:14:32 -0500 (EST)
+#Received: from gamgee.acad.emich.edu (gamgee.acad.emich.edu [164.76.102.76])
+#	by mescaline.gnu.org (8.9.1a/8.9.1) with SMTP id AAA20645
+#	for <arnold@gnu.ai.mit.edu>; Sat, 31 Oct 1998 00:17:54 -0500
+#Received: by gamgee.acad.emich.edu (Smail3.1.29.1 #57)
+#	id m0zZUKY-000IDSC; Sat, 31 Oct 98 00:16 CST
+#Message-Id: <m0zZUKY-000IDSC@gamgee.acad.emich.edu>
+#Date: Sat, 31 Oct 98 00:16 CST
+#From: dhw@gamgee.acad.emich.edu (David H. West)
+#To: bug-gnu-utils@gnu.org
+#Subject: gawk 3.0.3 bug report
+#Cc: arnold@gnu.org
+#X-UIDL: 7474b825cff989adf38f13883d84fdd7
+#Status: RO
+#
+#gawk version: 3.03
+#System used: Linux, kernel 2.0.28, libc 5.4.33, AMD K5PR133 (i586 clone)
+#Remark: There seems to be at least one bug shown by the demo below. 
+#        There may also be a Dark Corner involving the value of NR in an
+#        END block, a topic on which the info file is silent.  In gawk
+#        3.0.3, NR often seems to have the least-surprise value in an
+#        END block, but sometimes it doesn't - see example below.
+#Problem descr: the log below shows a case where:
+#        a) (this may be a red herring) the output of the gawk script
+#           is different depending on whether its input file is named on
+#           the command line or catted to stdin, without any use of the
+#           legitimate means which could produce this effect.
+#        b) NR is clearly getting clobbered; I have tried to simplify
+#           the 19-line script "awkerr1" below, but seemingly unrelated
+#           changes, like shortening constant strings which appear only in
+#           print statements, or removing unexecuted or irrelevant code,
+#           cause the clobbering to go away.  Some previous (larger)
+#           versions of this code would clobber NR also when reading from
+#           stdin, but I thought you'd prefer a shorter example :-).
+#Reproduce-By: using the gawk script "awkerr1", the contents of
+#              which appear in the transcript below as the output of the
+#              command "cat awkerr1".  Comments following # were added
+#              to the transcript later as explanation.
+#---------------------------------------------- Script started on Fri
+#Oct 30 20:04:16 1998 chipmunk:/ram0# ls -l a1 awkerr1 -rw-r--r--   1
+#root     root            2 Oct 30 18:42 a1 -rwxr-xr-x   1 root     root
+#389 Oct 30 19:54 awkerr1 chipmunk:/ram0# cat a1            #a1 contains
+#one printable char and a newline a chipmunk:/ram0# od -c xc a1
+#0000000 0a61
+#          a  \n
+#0000002 chipmunk:/ram0# cat a1 | awkerr1           #no surprises here
+#1 lines in 1 sec: 1 lines/sec;  nlines=1 chipmunk:/ram0# awkerr1 a1 �
+#lines in 1 sec: 1 lines/sec;  nlines=1    #?! first char is an uppercase
+#E-grave chipmunk:/ram0# awkerr1 a1 | od -N1 -xc 0000000 00c8
+#        310  \0
+#0000001 chipmunk:/ram0# cat awkerr1   #the apparent ^M's are not
+#actually in the file
+#!/usr/bin/awk -f
+function process(w) {
+   if(w in ws) {
+      printf " : found\n"; lc[p " " w]++; rc[w " " n]++; }
+   }
+BEGIN {IGNORECASE=1;
+      }
+/^/ {if(NR % 10 ==0)print "processing line " NR;
+     process($1); nlines++;
+    }
+END {p=w; w=n; n="";
+     if(w)process(w); t=1; print NR " lines in " t " sec: " NR+0 " lines/sec;  nlines=" nlines;
+    }
+#chipmunk:/ram0# exit Script done on Fri Oct 30 20:07:31 1998
+#---------------------------------------------
+#
+#-David West     dhw@gamgee.acad.emich.edu
+#
diff --git a/gawk-5.0.1/test/getnr2tm.in b/gawk-5.0.1/test/getnr2tm.in
new file mode 100644
index 00000000000..78981922613
--- /dev/null
+++ b/gawk-5.0.1/test/getnr2tm.in
@@ -0,0 +1 @@
+a
diff --git a/gawk-5.0.1/test/getnr2tm.ok b/gawk-5.0.1/test/getnr2tm.ok
new file mode 100644
index 00000000000..d63fca0990e
--- /dev/null
+++ b/gawk-5.0.1/test/getnr2tm.ok
@@ -0,0 +1 @@
+1 lines in 1 sec: 1 lines/sec;  nlines=1
diff --git a/gawk-5.0.1/test/gnuops2.awk b/gawk-5.0.1/test/gnuops2.awk
new file mode 100644
index 00000000000..1b0d4d7f8e7
--- /dev/null
+++ b/gawk-5.0.1/test/gnuops2.awk
@@ -0,0 +1,72 @@
+# From Servatius.Brandt@fujitsu-siemens.com  Fri Dec  1 13:44:48 2000
+# Received: from mail.actcom.co.il
+# 	by localhost with POP3 (fetchmail-5.1.0)
+# 	for arnold@localhost (single-drop); Fri, 01 Dec 2000 13:44:48 +0200 (IST)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Fri Dec  1 13:44:10 2000)
+# X-From_: Servatius.Brandt@fujitsu-siemens.com Fri Dec  1 13:11:23 2000
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.9.1a/actcom-0.2) id NAA11033 for <arobbins@actcom.co.il>;
+# 	Fri, 1 Dec 2000 13:11:21 +0200 (EET)  
+# 	(rfc931-sender: lmail.actcom.co.il [192.114.47.13])
+# Received: from billohost.com (10-209.196.35.dellhost.com [209.196.35.10] (may be forged))
+# 	by lmail.actcom.co.il (8.9.3/8.9.1) with ESMTP id NAA30286
+# 	for <arobbins@actcom.co.il>; Fri, 1 Dec 2000 13:12:25 +0200
+# Received: from fencepost.gnu.org (we-refuse-to-spy-on-our-users@fencepost.gnu.org [199.232.76.164])
+# 	by billohost.com (8.9.3/8.9.3) with ESMTP id GAA26074
+# 	for <arnold@skeeve.com>; Fri, 1 Dec 2000 06:09:08 -0500
+# Received: from energy.pdb.sbs.de ([192.109.2.19])
+# 	by fencepost.gnu.org with esmtp (Exim 3.16 #1 (Debian))
+# 	id 141o5z-0000RJ-00; Fri, 01 Dec 2000 06:11:16 -0500
+# Received: from trulli.pdb.fsc.net ([172.25.96.20])
+# 	by energy.pdb.sbs.de (8.9.3/8.9.3) with ESMTP id MAA32687;
+# 	Fri, 1 Dec 2000 12:11:13 +0100
+# Received: from pdbrd02e.pdb.fsc.net (pdbrd02e.pdb.fsc.net [172.25.96.15])
+# 	by trulli.pdb.fsc.net (8.9.3/8.9.3) with ESMTP id MAA27384;
+# 	Fri, 1 Dec 2000 12:11:13 +0100
+# Received: from Fujitsu-Siemens.com (pgtd1181.mch.fsc.net [172.25.126.152]) by pdbrd02e.pdb.fsc.net with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2650.21)
+# 	id XC2QLXS2; Fri, 1 Dec 2000 12:11:13 +0100
+# Message-ID: <3A2786CF.1000903@Fujitsu-Siemens.com>
+# Date: Fri, 01 Dec 2000 12:09:03 +0100
+# From: Servatius Brandt <Servatius.Brandt@fujitsu-siemens.com>
+# Organization: Fujitsu Siemens Computers
+# User-Agent: Mozilla/5.0 (Windows; U; Win95; en-US; m18) Gecko/20001108 Netscape6/6.0
+# X-Accept-Language: de, en
+# MIME-Version: 1.0
+# To: bug-gnu-utils@gnu.org
+# CC: arnold@gnu.org
+# Subject: Bug Report: \y, \B, \<, \> do not work with _
+# Content-Type: text/plain; charset=us-ascii; format=flowed
+# Content-Transfer-Encoding: 7bit
+# Status: R
+# 
+# Hello,
+# 
+# The \y, \B, \<, \> patterns do not regard _ as
+# word-constituent (unlike \w and \W, which do).
+# 
+# Operating system: ReliantUNIX-Y 5.44 C2001 RM600 R10000
+# Version of gawk: 3.0.6
+# C-Compiler: Fujitsu Siemens Computers CDS++ V2.0C0004
+# 
+# Test program:
+# 
+#!/usr/local/bin/gawk -f
+
+BEGIN {
+     print match("X _abc Y", /\<_abc/)		# bug
+     print match("X _abc Y", /\y_abc/)		# bug
+     print match("X abc_ Y", /abc_\>/)		# bug
+     print match("X abc_ Y", /abc_\y/)		# bug
+     print match("X abc_def Y", /abc_\Bdef/)	# bug
+
+     print match("X a_c Y", /a\wc/)		# ok!
+     print match("X a.c Y", /a\Wc/)		# ok!
+     exit
+}
+# 
+# 
+# Regards,
+# Servatius Brandt
+# 
+# 
diff --git a/gawk-5.0.1/test/gnuops2.ok b/gawk-5.0.1/test/gnuops2.ok
new file mode 100644
index 00000000000..aa0ecae5683
--- /dev/null
+++ b/gawk-5.0.1/test/gnuops2.ok
@@ -0,0 +1,7 @@
+3
+3
+3
+3
+3
+3
+3
diff --git a/gawk-5.0.1/test/gnuops3.awk b/gawk-5.0.1/test/gnuops3.awk
new file mode 100644
index 00000000000..bcd40aa1788
--- /dev/null
+++ b/gawk-5.0.1/test/gnuops3.awk
@@ -0,0 +1,14 @@
+# Mon Jan 31 09:57:30 IST 2005
+# test both dfa and regex matchers on \B
+# tests from Stepan Kasal, kasal@ucw.cz
+BEGIN {
+
+	print ("  " ~ / \B /)	# test dfa matcher
+	print ("a b" ~ /\B/)
+	print (" b" ~ /\B/)
+	print ("a " ~ /\B/)
+
+	a = "  "
+	gsub(/\B/, "x", a)	# test regex matcher
+	print a
+}
diff --git a/gawk-5.0.1/test/gnuops3.ok b/gawk-5.0.1/test/gnuops3.ok
new file mode 100644
index 00000000000..27db3078f0a
--- /dev/null
+++ b/gawk-5.0.1/test/gnuops3.ok
@@ -0,0 +1,5 @@
+1
+0
+1
+1
+x x x
diff --git a/gawk-5.0.1/test/gnureops.awk b/gawk-5.0.1/test/gnureops.awk
new file mode 100644
index 00000000000..15b9b841e2c
--- /dev/null
+++ b/gawk-5.0.1/test/gnureops.awk
@@ -0,0 +1,45 @@
+# test the gnu regexp ops
+
+BEGIN {
+	if ("a rat is here" ~ /\yrat/)	print "test  1 ok (\\y)"
+	else				print "test  1 failed (\\y)"
+	if ("a rat is here" ~ /rat\y/)	print "test  2 ok (\\y)"
+	else				print "test  2 failed (\\y)"
+	if ("what a brat" !~ /\yrat/)	print "test  3 ok (\\y)"
+	else				print "test  3 failed (\\y)"
+
+	if ("in the crate" ~ /\Brat/)	print "test  4 ok (\\B)"
+	else				print "test  4 failed (\\B)"
+	if ("a rat" !~ /\Brat/)	print "test  5 ok (\\B)"
+	else				print "test  5 failed (\\B)"
+
+	if ("a word" ~ /\<word/)	print "test  6 ok (\\<)"
+	else				print "test  6 failed (\\<)"
+	if ("foreword" !~ /\<word/)	print "test  7 ok (\\<)"
+	else				print "test  7 failed (\\<)"
+
+	if ("a word" ~ /word\>/)	print "test  8 ok (\\>)"
+	else				print "test  8 failed (\\\\>)"
+	if ("wordy" !~ /word\>/)	print "test  9 ok (\\>)"
+	else				print "test  9 failed (\\>)"
+
+	if ("a" ~ /\w/)		print "test 10 ok (\\w)"
+	else				print "test 10 failed (\\\\w)"
+	if ("+" !~ /\w/)		print "test 11 ok (\\w)"
+	else				print "test 11 failed (\\w)"
+
+	if ("a" !~ /\W/)		print "test 12 ok (\\W)"
+	else				print "test 12 failed (\\W)"
+	if ("+" ~ /\W/)		print "test 13 ok (\\W)"
+	else				print "test 13 failed (\\W)"
+
+	if ("a" ~ /\`a/)		print "test 14 ok (\\`)"
+	else				print "test 14 failed (\\`)"
+	if ("b" !~ /\`a/)		print "test 15 ok (\\`)"
+	else				print "test 15 failed (\\`)"
+
+	if ("a" ~ /a\'/)		print "test 16 ok (\\')"
+	else				print "test 16 failed (\\')"
+	if ("b" !~ /a\'/)		print "test 17 ok (\\')"
+	else				print "test 17 failed (\\')"
+}
diff --git a/gawk-5.0.1/test/gnureops.ok b/gawk-5.0.1/test/gnureops.ok
new file mode 100644
index 00000000000..0fb5f504b20
--- /dev/null
+++ b/gawk-5.0.1/test/gnureops.ok
@@ -0,0 +1,17 @@
+test  1 ok (\y)
+test  2 ok (\y)
+test  3 ok (\y)
+test  4 ok (\B)
+test  5 ok (\B)
+test  6 ok (\<)
+test  7 ok (\<)
+test  8 ok (\>)
+test  9 ok (\>)
+test 10 ok (\w)
+test 11 ok (\w)
+test 12 ok (\W)
+test 13 ok (\W)
+test 14 ok (\`)
+test 15 ok (\`)
+test 16 ok (\')
+test 17 ok (\')
diff --git a/gawk-5.0.1/test/gsubasgn.awk b/gawk-5.0.1/test/gsubasgn.awk
new file mode 100644
index 00000000000..f0b770127b6
--- /dev/null
+++ b/gawk-5.0.1/test/gsubasgn.awk
@@ -0,0 +1,13 @@
+# tests for assigning to a function within that function
+
+#1 - should be bad
+function test1 (r) { gsub(r, "x", test1) }
+BEGIN { test1("") }
+
+#2 - should be bad
+function test2 () { gsub(/a/, "x", test2) }
+BEGIN { test2() }
+
+#3 - should be ok
+function test3 (r) { gsub(/a/, "x", r) }
+BEGIN { test3("") }
diff --git a/gawk-5.0.1/test/gsubasgn.ok b/gawk-5.0.1/test/gsubasgn.ok
new file mode 100644
index 00000000000..8a309c7ced6
--- /dev/null
+++ b/gawk-5.0.1/test/gsubasgn.ok
@@ -0,0 +1,5 @@
+gawk: gsubasgn.awk:4: error: function `test1' called with space between name and `(',
+or used as a variable or an array
+gawk: gsubasgn.awk:8: error: function `test2' called with space between name and `(',
+or used as a variable or an array
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/gsubind.awk b/gawk-5.0.1/test/gsubind.awk
new file mode 100644
index 00000000000..fce0d81846b
--- /dev/null
+++ b/gawk-5.0.1/test/gsubind.awk
@@ -0,0 +1,9 @@
+BEGIN {
+	f = "foo"
+	p = @/o/
+	gsub(p, "q", f)
+	print f
+	fun = "gsub"
+	@fun(p, "q", f)
+	print f
+}
diff --git a/gawk-5.0.1/test/gsubind.ok b/gawk-5.0.1/test/gsubind.ok
new file mode 100644
index 00000000000..d25f018a18c
--- /dev/null
+++ b/gawk-5.0.1/test/gsubind.ok
@@ -0,0 +1,3 @@
+fqq
+gawk: gsubind.awk:7: fatal: gsub: can be called indirectly only with two arguments
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/gsubtest.awk b/gawk-5.0.1/test/gsubtest.awk
new file mode 100644
index 00000000000..1d6fd1cf927
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtest.awk
@@ -0,0 +1,9 @@
+BEGIN {
+	str = "abc"; print gsub("b+", "FOO", str), str
+	str = "abc"; print gsub("x*", "X", str), str
+	str = "abc"; print gsub("b*", "X", str), str
+	str = "abc"; print gsub("c", "X", str), str
+	str = "abc"; print gsub("c+", "X", str), str
+	str = "abc"; print gsub("x*$", "X", str), str
+	str = "abc"; print gsub("b|$", "X", str), str
+}
diff --git a/gawk-5.0.1/test/gsubtest.ok b/gawk-5.0.1/test/gsubtest.ok
new file mode 100644
index 00000000000..f909d0d2637
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtest.ok
@@ -0,0 +1,7 @@
+1 aFOOc
+4 XaXbXcX
+3 XaXcX
+1 abX
+1 abX
+1 abcX
+2 aXcX
diff --git a/gawk-5.0.1/test/gsubtst2.awk b/gawk-5.0.1/test/gsubtst2.awk
new file mode 100644
index 00000000000..fafbf96387c
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst2.awk
@@ -0,0 +1,241 @@
+#From arnold  Thu May  9 17:27:03 2002
+#Return-Path: <arnold@skeeve.com>
+#Received: (from arnold@localhost)
+#	by skeeve.com (8.11.6/8.11.6) id g49ER3K27925
+#	for arnold; Thu, 9 May 2002 17:27:03 +0300
+#Date: Thu, 9 May 2002 17:27:03 +0300
+#From: Aharon Robbins <arnold@skeeve.com>
+#Message-Id: <200205091427.g49ER3K27925@skeeve.com>
+#To: arnold@skeeve.com
+#Subject: fixme
+#X-SpamBouncer: 1.4 (10/07/01)
+#X-SBRule: Pattern Match (Other Patterns) (Score: 4850)
+#X-SBRule: Pattern Match (Spam Phone #) (Score: 0)
+#X-SBClass: Blocked
+#Status: O
+#
+#Path: ord-read.news.verio.net!dfw-artgen!iad-peer.news.verio.net!news.verio.net!fu-berlin.de!uni-berlin.de!host213-120-137-48.in-addr.btopenworld.COM!not-for-mail
+#From: laura@madonnaweb.com (laura fairhead)
+#Newsgroups: comp.lang.awk
+#Subject: bug in gawk3.1.0 regex code
+#Date: Wed, 08 May 2002 23:31:40 GMT
+#Organization: that'll be the daewooo :)
+#Lines: 211
+#Message-ID: <3cd9b0f7.29675926@NEWS.CIS.DFN.DE>
+#Reply-To: laura@madonnaweb.com
+#NNTP-Posting-Host: host213-120-137-48.in-addr.btopenworld.com (213.120.137.48)
+#X-Trace: fu-berlin.de 1020900891 18168286 213.120.137.48 (16 [53286])
+#X-Newsreader: Forte Free Agent 1.21/32.243
+#Xref: dfw-artgen comp.lang.awk:13059
+#
+#
+#I believe I've just found a bug in gawk3.1.0 implementation of
+#extended regular expressions. It seems to be down to the alternation
+#operator; when using an end anchor '$' as a subexpression in an
+#alternation and the entire matched RE is a nul-string it fails
+#to match the end of string, for example;
+#
+#gsub(/$|2/,"x")
+#print
+#
+#input           = 12345
+#expected output = 1x345x
+#actual output   = 1x345
+#
+#The start anchor '^' always works as expected;
+#
+#gsub(/^|2/,"x")
+#print
+#
+#input           = 12345
+#expected output = x1x345
+#actual output   = x1x345
+#
+#This was with POSIX compliance enabled althought that doesn't
+#effect the result.
+#
+#I checked on gawk3.0.6 and got exactly the same results however
+#gawk2.15.6 gives the expected results.
+#
+#I'm about to post a bug report about this into gnu.utils.bug
+#but I thought I'd post it here first in case anyone has
+#any input/comments/whatever ....
+#
+#Complete test results were as follows;
+#
+#input          12345
+#output         gsub(/regex/,"x",input)
+#
+#regex          output
+#(^)            x12345
+#($)            12345x
+#(^)|($)        x12345x
+#($)|(^)        x12345x
+#(2)            1x345
+#(^)|2          x1x345
+#2|(^)          x1x345
+#($)|2          1x345
+#2|($)          1x345
+#(2)|(^)        x1x345
+#(^)|(2)        x1x345
+#(2)|($)        1x345
+#($)|(2)        1x345
+#.((2)|(^))     x345
+#.((^)|(2))     x345
+#.((2)|($))     x34x
+#.(($)|(2))     x34x
+#x{0}((2)|(^))  x1x345
+#x{0}((^)|(2))  x1x345
+#x{0}((2)|($))  1x345
+#x{0}(($)|(2))  1x345
+#x*((2)|(^))    x1x345
+#x*((^)|(2))    x1x345
+#x*((2)|($))    1x345
+#x*(($)|(2))    1x345
+#
+#Here's the test program I used, a few of the cases use ERE {n[,[m]]}
+#operators so that will have to be commented out or have a check
+#added or something (should have put a conditional in I know... ;-)
+#
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+#
+BEGIN{
+
+TESTSTR="12345"
+
+print "input          "TESTSTR
+print "output         gsub(/regex/,\"x\",input)"
+print ""
+
+print "regex          output"
+$0=TESTSTR
+gsub(/(^)/,"x")
+print "(^)            "$0
+
+$0=TESTSTR
+gsub(/($)/,"x")
+print "($)            "$0
+
+$0=TESTSTR
+gsub(/(^)|($)/,"x")
+print "(^)|($)        "$0
+
+$0=TESTSTR
+gsub(/($)|(^)/,"x")
+print "($)|(^)        "$0
+
+$0=TESTSTR
+gsub(/2/,"x")
+print "(2)            "$0
+
+$0=TESTSTR
+gsub(/(^)|2/,"x")
+print "(^)|2          "$0
+
+$0=TESTSTR
+gsub(/2|(^)/,"x")
+print "2|(^)          "$0
+
+$0=TESTSTR
+gsub(/($)|2/,"x")
+print "($)|2          "$0
+
+$0=TESTSTR
+gsub(/2|($)/,"x")
+print "2|($)          "$0
+
+$0=TESTSTR
+gsub(/(2)|(^)/,"x")
+print "(2)|(^)        "$0
+
+$0=TESTSTR
+gsub(/(^)|(2)/,"x")
+print "(^)|(2)        "$0
+
+$0=TESTSTR
+gsub(/(2)|($)/,"x")
+print "(2)|($)        "$0
+
+$0=TESTSTR
+gsub(/($)|(2)/,"x")
+print "($)|(2)        "$0
+
+$0=TESTSTR
+gsub(/.((2)|(^))/,"x")
+print ".((2)|(^))     "$0
+
+$0=TESTSTR
+gsub(/.((^)|(2))/,"x")
+print ".((^)|(2))     "$0
+
+$0=TESTSTR
+gsub(/.((2)|($))/,"x")
+print ".((2)|($))     "$0
+
+$0=TESTSTR
+gsub(/.(($)|(2))/,"x")
+print ".(($)|(2))     "$0
+
+# $0=TESTSTR
+# gsub(/x{0}((2)|(^))/,"x")
+# print "x{0}((2)|(^))  "$0
+# 
+# $0=TESTSTR
+# gsub(/x{0}((^)|(2))/,"x")
+# print "x{0}((^)|(2))  "$0
+# 
+# $0=TESTSTR
+# gsub(/x{0}((2)|($))/,"x")
+# print "x{0}((2)|($))  "$0
+# 
+# $0=TESTSTR
+# gsub(/x{0}(($)|(2))/,"x")
+# print "x{0}(($)|(2))  "$0
+
+$0=TESTSTR
+gsub(/x*((2)|(^))/,"x")
+print "x*((2)|(^))    "$0
+
+$0=TESTSTR
+gsub(/x*((^)|(2))/,"x")
+print "x*((^)|(2))    "$0
+
+$0=TESTSTR
+gsub(/x*((2)|($))/,"x")
+print "x*((2)|($))    "$0
+
+$0=TESTSTR
+gsub(/x*(($)|(2))/,"x")
+print "x*(($)|(2))    "$0
+
+# $0=TESTSTR
+# gsub(/x{0}^/,"x")
+# print "x{0}^          "$0
+# 
+# $0=TESTSTR
+# gsub(/x{0}$/,"x")
+# print "x{0}$          "$0
+# 
+# $0=TESTSTR
+# gsub(/(x{0}^)|2/,"x")
+# print "(x{0}^)|2      "$0
+# 
+# $0=TESTSTR
+# gsub(/(x{0}$)|2/,"x")
+# print "(x{0}$)|2      "$0
+
+
+}
+#
+#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+#
+#byefrom
+#
+#-- 
+#laura fairhead  # laura@madonnaweb.com  http://lf.8k.com
+#                # if you are bored crack my sig.
+#1F8B0808CABB793C0000666667002D8E410E83300C04EF91F2877D00CA138A7A
+#EAA98F30C494480157B623C4EF1B508FDED1CEFA9152A23DE35D661593C5318E
+#630C313CD701BE92E390563326EE17A3CA818F5266E4C2461547F1F5267659CA
+#8EE2092F76C329ED02CA430C5373CC62FF94BAC6210B36D9F9BC4AB53378D978
+#80F2978A1A6E5D6F5133B67B6113178DC1059526698AFE5C17A5187E7D930492
diff --git a/gawk-5.0.1/test/gsubtst2.ok b/gawk-5.0.1/test/gsubtst2.ok
new file mode 100644
index 00000000000..a038528b39a
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst2.ok
@@ -0,0 +1,25 @@
+input          12345
+output         gsub(/regex/,"x",input)
+
+regex          output
+(^)            x12345
+($)            12345x
+(^)|($)        x12345x
+($)|(^)        x12345x
+(2)            1x345
+(^)|2          x1x345
+2|(^)          x1x345
+($)|2          1x345x
+2|($)          1x345x
+(2)|(^)        x1x345
+(^)|(2)        x1x345
+(2)|($)        1x345x
+($)|(2)        1x345x
+.((2)|(^))     x345
+.((^)|(2))     x345
+.((2)|($))     x34x
+.(($)|(2))     x34x
+x*((2)|(^))    x1x345
+x*((^)|(2))    x1x345
+x*((2)|($))    1x345x
+x*(($)|(2))    1x345x
diff --git a/gawk-5.0.1/test/gsubtst3.awk b/gawk-5.0.1/test/gsubtst3.awk
new file mode 100644
index 00000000000..6c518966c06
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst3.awk
@@ -0,0 +1,291 @@
+# From laura_fairhead@talk21.com  Fri May 10 11:24:41 2002
+# Return-Path: <laura_fairhead@talk21.com>
+# Received: from localhost (aahz [127.0.0.1])
+# 	by skeeve.com (8.11.2/8.11.2) with ESMTP id g4A8OdU01822
+# 	for <arnold@localhost>; Fri, 10 May 2002 11:24:40 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.7.4)
+# 	for arnold@localhost (single-drop); Fri, 10 May 2002 11:24:40 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Fri May 10 11:30:42 2002)
+# X-From_: laura_fairhead@talk21.com Fri May 10 05:39:57 2002
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id g4A2dpw26380 for <arobbins@actcom.co.il>;
+# 	Fri, 10 May 2002 05:39:52 +0300 (EET DST)  
+# 	(rfc931-sender: mail.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by lmail.actcom.co.il (8.11.6/8.11.6) with ESMTP id g4A2dxl10851
+# 	for <arobbins@actcom.co.il>; Fri, 10 May 2002 05:39:59 +0300
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by f7.net (8.11.6/8.11.6) with ESMTP id g4A2dwN11097
+# 	for <arnold@skeeve.com>; Thu, 9 May 2002 22:39:58 -0400
+# Received: from [194.73.242.6] (helo=wmpmta04-app.mail-store.com)
+# 	by fencepost.gnu.org with smtp (Exim 3.34 #1 (Debian))
+# 	id 1760K4-0001QX-00
+# 	for <bug-gawk@gnu.org>; Thu, 09 May 2002 22:39:56 -0400
+# Received: from wmpmtavirtual ([10.216.84.15])
+#           by wmpmta04-app.mail-store.com
+#           (InterMail vM.5.01.02.00 201-253-122-103-101-20001108) with SMTP
+#           id <20020510023921.EEW24107.wmpmta04-app.mail-store.com@wmpmtavirtual>
+#           for <bug-gawk@gnu.org>; Fri, 10 May 2002 03:39:21 +0100
+# Received: from 213.1.102.243 by t21web05-lrs ([10.216.84.15]); Fri, 10 May 02 03:38:42 GMT+01:00
+# X-Mailer: talk21 v1.24 - http://talk21.btopenworld.com
+# From: laura_fairhead@talk21.com
+# To: bug-gawk@gnu.org
+# X-Talk21Ref: none
+# Date: Fri, 10 May 2002 03:38:42 GMT+01:00
+# Subject: bug in gawk 3.1.0 regex code
+# Mime-Version: 1.0
+# Content-type: multipart/mixed; boundary="--GgOuLpDpIyE--1020998322088--"
+# Message-Id: <20020510023921.EEW24107.wmpmta04-app.mail-store.com@wmpmtavirtual>
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: RO
+# 
+# Multipart Message Boundary - attachment/bodypart follows:
+# 
+# 
+# ----GgOuLpDpIyE--1020998322088--
+# Content-Type: text/plain
+# Content-Transfer-Encoding: 7bit
+# 
+# 
+# I believe I've just found a bug in gawk3.1.0 implementation of
+# extended regular expressions. It seems to be down to the alternation
+# operator; when using an end anchor '$' as a subexpression in an
+# alternation and the entire matched RE is a nul-string it fails
+# to match the end of string, for example;
+# 
+# gsub(/$|2/,"x")
+# print
+# 
+# input           = 12345
+# expected output = 1x345x
+# actual output   = 1x345
+# 
+# The start anchor '^' always works as expected;
+# 
+# gsub(/^|2/,"x")
+# print
+# 
+# input           = 12345
+# expected output = x1x345
+# actual output   = x1x345
+# 
+# This was with POSIX compliance enabled althought that doesn't
+# effect the result.
+# 
+# I checked on gawk3.0.6 and got exactly the same results however
+# gawk2.15.6 gives the expected results.
+# 
+# All the follow platforms produced the same results;
+# 
+# gawk3.0.6 / Win98 / i386
+# gawk3.1.0 / Win98 / i386
+# gawk3.0.5 / Linux2.2.16 / i386
+# 
+# Complete test results were as follows;
+# 
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# regex               input     expected  actual    bug?      
+# -------------------------------------------------------------
+# (^)                 12345     x12345    x12345              
+# ($)                 12345     12345x    12345x              
+# (^)|($)             12345     x12345x   x12345x             
+# ($)|(^)             12345     x12345x   x12345x             
+# 2                   12345     1x345     1x345               
+# (^)|2               12345     x1x345    x1x345              
+# 2|(^)               12345     x1x345    x1x345              
+# ($)|2               12345     1x345x    1x345     **BUG**   
+# 2|($)               12345     1x345x    1x345     **BUG**   
+# (2)|(^)             12345     x1x345    x1x345              
+# (^)|(2)             12345     x1x345    x1x345              
+# (2)|($)             12345     1x345x    1x345     **BUG**   
+# ($)|(2)             12345     1x345x    1x345     **BUG**   
+# ((2)|(^)).          12345     xx45      xx45                
+# ((^)|(2)).          12345     xx45      xx45                
+# .((2)|($))          12345     x34x      x34x                
+# .(($)|(2))          12345     x34x      x34x                
+# (^)|6               12345     x12345    x12345              
+# 6|(^)               12345     x12345    x12345              
+# ($)|6               12345     12345x    12345x              
+# 6|($)               12345     12345x    12345x              
+# 2|6|(^)             12345     x1x345    x1x345              
+# 2|(^)|6             12345     x1x345    x1x345              
+# 6|2|(^)             12345     x1x345    x1x345              
+# 6|(^)|2             12345     x1x345    x1x345              
+# (^)|6|2             12345     x1x345    x1x345              
+# (^)|2|6             12345     x1x345    x1x345              
+# 2|6|($)             12345     1x345x    1x345     **BUG**   
+# 2|($)|6             12345     1x345x    1x345     **BUG**   
+# 6|2|($)             12345     1x345x    1x345     **BUG**   
+# 6|($)|2             12345     1x345x    1x345     **BUG**   
+# ($)|6|2             12345     1x345x    1x345     **BUG**   
+# ($)|2|6             12345     1x345x    1x345     **BUG**   
+# 2|4|(^)             12345     x1x3x5    x1x3x5              
+# 2|(^)|4             12345     x1x3x5    x1x3x5              
+# 4|2|(^)             12345     x1x3x5    x1x3x5              
+# 4|(^)|2             12345     x1x3x5    x1x3x5              
+# (^)|4|2             12345     x1x3x5    x1x3x5              
+# (^)|2|4             12345     x1x3x5    x1x3x5              
+# 2|4|($)             12345     1x3x5x    1x3x5     **BUG**   
+# 2|($)|4             12345     1x3x5x    1x3x5     **BUG**   
+# 4|2|($)             12345     1x3x5x    1x3x5     **BUG**   
+# 4|($)|2             12345     1x3x5x    1x3x5     **BUG**   
+# ($)|4|2             12345     1x3x5x    1x3x5     **BUG**   
+# ($)|2|4             12345     1x3x5x    1x3x5     **BUG**   
+# x{0}((2)|(^))       12345     x1x345    x1x345              
+# x{0}((^)|(2))       12345     x1x345    x1x345              
+# x{0}((2)|($))       12345     1x345x    1x345     **BUG**   
+# x{0}(($)|(2))       12345     1x345x    1x345     **BUG**   
+# x*((2)|(^))         12345     x1x345    x1x345              
+# x*((^)|(2))         12345     x1x345    x1x345              
+# x*((2)|($))         12345     1x345x    1x345     **BUG**   
+# x*(($)|(2))         12345     1x345x    1x345     **BUG**   
+# x{0}^               12345     x12345    x12345              
+# x{0}$               12345     12345x    12345x              
+# (x{0}^)|2           12345     x1x345    x1x345              
+# (x{0}$)|2           12345     1x345x    1x345     **BUG**   
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# 
+# 
+# Here's the test program I used, a few of the cases use ERE {n[,[m]]}
+# operators so need '-W posix', (although the same results minus
+# those tests came out without POSIX compliance enabled)
+# 
+# [ Invocation was 'gawk -W posix -f tregex.awk' ]
+# 
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# tregex.awk
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+BEGIN{
+print _=sprintf("%-20s%-10s%-10s%-10s%-10s\n","regex","input","expected","actual","bug?")
+OFS="-"
+$(length(_)+1)=""
+print $0
+
+#while(getline <ARGV[1]) # ADR: was testre.dat
+while(getline) # ADR: use stdin so can automate generation of test
+{
+RE=$1;IN=$2;OUT=$3
+$0=IN
+gsub(RE,"x")
+printf "%-20s%-10s%-10s%-10s%-10s\n",RE,IN,OUT,$0,$0==OUT?"":"**BUG**"
+}
+}
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# 
+# This is the test data file used;
+# 
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# testre.dat
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# (^)             12345           x12345
+# ($)             12345           12345x
+# (^)|($)         12345           x12345x
+# ($)|(^)         12345           x12345x
+# 2               12345           1x345
+# (^)|2           12345           x1x345
+# 2|(^)           12345           x1x345
+# ($)|2           12345           1x345x
+# 2|($)           12345           1x345x
+# (2)|(^)         12345           x1x345
+# (^)|(2)         12345           x1x345
+# (2)|($)         12345           1x345x
+# ($)|(2)         12345           1x345x
+# ((2)|(^)).      12345           xx45
+# ((^)|(2)).      12345           xx45
+# .((2)|($))      12345           x34x
+# .(($)|(2))      12345           x34x
+# (^)|6           12345           x12345
+# 6|(^)           12345           x12345
+# ($)|6           12345           12345x
+# 6|($)           12345           12345x
+# 2|6|(^)         12345           x1x345
+# 2|(^)|6         12345           x1x345
+# 6|2|(^)         12345           x1x345
+# 6|(^)|2         12345           x1x345
+# (^)|6|2         12345           x1x345
+# (^)|2|6         12345           x1x345
+# 2|6|($)         12345           1x345x
+# 2|($)|6         12345           1x345x
+# 6|2|($)         12345           1x345x
+# 6|($)|2         12345           1x345x
+# ($)|6|2         12345           1x345x
+# ($)|2|6         12345           1x345x
+# 2|4|(^)         12345           x1x3x5
+# 2|(^)|4         12345           x1x3x5
+# 4|2|(^)         12345           x1x3x5
+# 4|(^)|2         12345           x1x3x5
+# (^)|4|2         12345           x1x3x5
+# (^)|2|4         12345           x1x3x5
+# 2|4|($)         12345           1x3x5x
+# 2|($)|4         12345           1x3x5x
+# 4|2|($)         12345           1x3x5x
+# 4|($)|2         12345           1x3x5x
+# ($)|4|2         12345           1x3x5x
+# ($)|2|4         12345           1x3x5x
+# x{0}((2)|(^))   12345           x1x345
+# x{0}((^)|(2))   12345           x1x345
+# x{0}((2)|($))   12345           1x345x
+# x{0}(($)|(2))   12345           1x345x
+# x*((2)|(^))     12345           x1x345
+# x*((^)|(2))     12345           x1x345
+# x*((2)|($))     12345           1x345x
+# x*(($)|(2))     12345           1x345x
+# x{0}^           12345           x12345
+# x{0}$           12345           12345x
+# (x{0}^)|2       12345           x1x345
+# (x{0}$)|2       12345           1x345x
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# 
+# I've attached a full copy of this e-mail in ZIP format
+# in case of e-mail transport errors corrupting the data.
+# 
+# I've posted the same bug report to gnu.utils.bug and
+# it's being discussed in this thread on comp.lang.awk;
+# 
+# From: laura@madonnaweb.com (laura fairhead)
+# Newsgroups: comp.lang.awk
+# Subject: bug in gawk3.1.0 regex code
+# Date: Wed, 08 May 2002 23:31:40 GMT
+# Message-ID: <3cd9b0f7.29675926@NEWS.CIS.DFN.DE>
+# 
+# 
+# byefrom
+# 
+# Laura Fairhead
+# 
+# 
+# 
+# 
+# --------------------
+# talk21 your FREE portable and private address on the net at http://www.talk21.com
+# ----GgOuLpDpIyE--1020998322088--
+# Content-Type: : application/zip;; Name="COPY.ZIP"
+# Content-Transfer-Encoding: base64
+# Content-Disposition: attachment; filename="COPY.ZIP"
+# 
+# UEsDBBQAAAAIALoaqiyj8d/bjwMAAKsaAAADAAAARklMrVjfa+JAEH4P5H8ISwrRU9EYfbheKBR6
+# xRcLvevbYbFtzsqJlBrpQr3722+zMWZ31pk1MaG0Q/m+nR87O9kvruM6/5p4XOc9WSTc05/l
+# +m2bSivhb8lzmrx43vw53c5X2f+etourHOc63XMe1wlmLQ8+g3AYjaTFD2ZplY9g+xRbWly3
+# NPastYMrQN9cs4DvHYz+dHbomY8SOTctGDlcQfXND1Uz6cK3EXcVdpY37ltSuB55u339cNtu
+# F76NPTudHYR0zS2RZ/sd1maHVLdYI/cp31b2PvFW72jkvIi2tLTI94nXY/eCfeZK8Ap7GO1b
+# u7QAO8+8FjsLfFx7OowtfW6dLYRv22wZ031uYYc7M/aK5xvEfjp7vDPnQxW2OZuqndDxWeyw
+# dt6y5rXPt5xrqG8bW9a8tm8ZN1q1UyYTXvNT2HjN7VWLLL3GR7pl9nlUkx1Z+5xm2/qcYsu4
+# z2KHtfOWNad6jR92jGN9jvm2sSNbn1vYlj4n2TLus9h4zW1s/tn/e3iHV55MOXumvUarsvVX
+# +OknNGfrr/AK7DbMulLkbZh1VTa8uFSLHF5cqlVt5tW9eWRsH2VbVY10rp+TCu9Q6Rxj2/Ju
+# SJE2KG5TqW57848/jS15fXM7mX66ztv7cp16j/FGGr8DdtEN+5uL7sD49WvNOkwGIv5KaS3+
+# FsJamLmyFkYmrFnLde6+/4hZl7mOH6yS9SJ9DR5bXwatmLHCrd/PivTxulwlwSJJV8t14n1j
+# abIRCfde5mm2iojx/ib2B5eTaeyHl3cPP2N/KNbsx5Op6yw226fg/qbDeIbNc/DoHAR6Mu2I
+# dTp+X/zEsTCvGPvK9j0govsrfxqqdJN9cKhMY0vilwdPOebmRwqIy4+x+Tni+Hrc/PKAAnGZ
+# 7pXH2fyaYK6X4+B9CcPBt/RRt9z8FoDhoOpH/QJ9j+KAkkf9As2O4oA6N/xy6RWo8OMoqLYN
+# 1DDipqo+joIqEGtQqDWJRibXK9oO6igMB1Uu2XeKZwwHlSuO0zue6idVGVE4VQPheeiVIc8F
+# sV6Bg6oRx+knkup3Kl8VR+Vb5qGru2N14SNTx2E4qNhwnH1/+chUYRROvfvjeejK6khdeLm/
+# +HoFDqolHGfdX17sG5WviqPyLXBQ1WB9D/ULjSvHH9ZXUJOgOKA+UL9AZ1A4dThTftXxTOWh
+# qgRs7kI9gF4gwM0fnVfgjo/F19A96T9QSwECFAAUAAAACAC6Gqoso/Hf248DAACrGgAAAwAA
+# AAAAAAABACAAAAAAAAAARklMUEsFBgAAAAABAAEAMQAAALADAAAAAA==
+# ----GgOuLpDpIyE--1020998322088----
+# 
+# 
+# 
diff --git a/gawk-5.0.1/test/gsubtst3.in b/gawk-5.0.1/test/gsubtst3.in
new file mode 100644
index 00000000000..2dcf75afeb1
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst3.in
@@ -0,0 +1,57 @@
+(^)             12345           x12345
+($)             12345           12345x
+(^)|($)         12345           x12345x
+($)|(^)         12345           x12345x
+2               12345           1x345
+(^)|2           12345           x1x345
+2|(^)           12345           x1x345
+($)|2           12345           1x345x
+2|($)           12345           1x345x
+(2)|(^)         12345           x1x345
+(^)|(2)         12345           x1x345
+(2)|($)         12345           1x345x
+($)|(2)         12345           1x345x
+((2)|(^)).      12345           xx45
+((^)|(2)).      12345           xx45
+.((2)|($))      12345           x34x
+.(($)|(2))      12345           x34x
+(^)|6           12345           x12345
+6|(^)           12345           x12345
+($)|6           12345           12345x
+6|($)           12345           12345x
+2|6|(^)         12345           x1x345
+2|(^)|6         12345           x1x345
+6|2|(^)         12345           x1x345
+6|(^)|2         12345           x1x345
+(^)|6|2         12345           x1x345
+(^)|2|6         12345           x1x345
+2|6|($)         12345           1x345x
+2|($)|6         12345           1x345x
+6|2|($)         12345           1x345x
+6|($)|2         12345           1x345x
+($)|6|2         12345           1x345x
+($)|2|6         12345           1x345x
+2|4|(^)         12345           x1x3x5
+2|(^)|4         12345           x1x3x5
+4|2|(^)         12345           x1x3x5
+4|(^)|2         12345           x1x3x5
+(^)|4|2         12345           x1x3x5
+(^)|2|4         12345           x1x3x5
+2|4|($)         12345           1x3x5x
+2|($)|4         12345           1x3x5x
+4|2|($)         12345           1x3x5x
+4|($)|2         12345           1x3x5x
+($)|4|2         12345           1x3x5x
+($)|2|4         12345           1x3x5x
+x{0}((2)|(^))   12345           x1x345
+x{0}((^)|(2))   12345           x1x345
+x{0}((2)|($))   12345           1x345x
+x{0}(($)|(2))   12345           1x345x
+x*((2)|(^))     12345           x1x345
+x*((^)|(2))     12345           x1x345
+x*((2)|($))     12345           1x345x
+x*(($)|(2))     12345           1x345x
+x{0}^           12345           x12345
+x{0}$           12345           12345x
+(x{0}^)|2       12345           x1x345
+(x{0}$)|2       12345           1x345x
diff --git a/gawk-5.0.1/test/gsubtst3.ok b/gawk-5.0.1/test/gsubtst3.ok
new file mode 100644
index 00000000000..190a20ac433
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst3.ok
@@ -0,0 +1,60 @@
+regex               input     expected  actual    bug?      
+
+-------------------------------------------------------------
+(^)                 12345     x12345    x12345              
+($)                 12345     12345x    12345x              
+(^)|($)             12345     x12345x   x12345x             
+($)|(^)             12345     x12345x   x12345x             
+2                   12345     1x345     1x345               
+(^)|2               12345     x1x345    x1x345              
+2|(^)               12345     x1x345    x1x345              
+($)|2               12345     1x345x    1x345x              
+2|($)               12345     1x345x    1x345x              
+(2)|(^)             12345     x1x345    x1x345              
+(^)|(2)             12345     x1x345    x1x345              
+(2)|($)             12345     1x345x    1x345x              
+($)|(2)             12345     1x345x    1x345x              
+((2)|(^)).          12345     xx45      xx45                
+((^)|(2)).          12345     xx45      xx45                
+.((2)|($))          12345     x34x      x34x                
+.(($)|(2))          12345     x34x      x34x                
+(^)|6               12345     x12345    x12345              
+6|(^)               12345     x12345    x12345              
+($)|6               12345     12345x    12345x              
+6|($)               12345     12345x    12345x              
+2|6|(^)             12345     x1x345    x1x345              
+2|(^)|6             12345     x1x345    x1x345              
+6|2|(^)             12345     x1x345    x1x345              
+6|(^)|2             12345     x1x345    x1x345              
+(^)|6|2             12345     x1x345    x1x345              
+(^)|2|6             12345     x1x345    x1x345              
+2|6|($)             12345     1x345x    1x345x              
+2|($)|6             12345     1x345x    1x345x              
+6|2|($)             12345     1x345x    1x345x              
+6|($)|2             12345     1x345x    1x345x              
+($)|6|2             12345     1x345x    1x345x              
+($)|2|6             12345     1x345x    1x345x              
+2|4|(^)             12345     x1x3x5    x1x3x5              
+2|(^)|4             12345     x1x3x5    x1x3x5              
+4|2|(^)             12345     x1x3x5    x1x3x5              
+4|(^)|2             12345     x1x3x5    x1x3x5              
+(^)|4|2             12345     x1x3x5    x1x3x5              
+(^)|2|4             12345     x1x3x5    x1x3x5              
+2|4|($)             12345     1x3x5x    1x3x5x              
+2|($)|4             12345     1x3x5x    1x3x5x              
+4|2|($)             12345     1x3x5x    1x3x5x              
+4|($)|2             12345     1x3x5x    1x3x5x              
+($)|4|2             12345     1x3x5x    1x3x5x              
+($)|2|4             12345     1x3x5x    1x3x5x              
+x{0}((2)|(^))       12345     x1x345    x1x345              
+x{0}((^)|(2))       12345     x1x345    x1x345              
+x{0}((2)|($))       12345     1x345x    1x345x              
+x{0}(($)|(2))       12345     1x345x    1x345x              
+x*((2)|(^))         12345     x1x345    x1x345              
+x*((^)|(2))         12345     x1x345    x1x345              
+x*((2)|($))         12345     1x345x    1x345x              
+x*(($)|(2))         12345     1x345x    1x345x              
+x{0}^               12345     x12345    x12345              
+x{0}$               12345     12345x    12345x              
+(x{0}^)|2           12345     x1x345    x1x345              
+(x{0}$)|2           12345     1x345x    1x345x              
diff --git a/gawk-5.0.1/test/gsubtst4.awk b/gawk-5.0.1/test/gsubtst4.awk
new file mode 100644
index 00000000000..48b8413e8c6
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst4.awk
@@ -0,0 +1,242 @@
+# From arnold  Thu May  9 17:27:03 2002
+# Return-Path: <arnold@skeeve.com>
+# Received: (from arnold@localhost)
+# 	by skeeve.com (8.11.6/8.11.6) id g49ER3K27925
+# 	for arnold; Thu, 9 May 2002 17:27:03 +0300
+# Date: Thu, 9 May 2002 17:27:03 +0300
+# From: Aharon Robbins <arnold@skeeve.com>
+# Message-Id: <200205091427.g49ER3K27925@skeeve.com>
+# To: arnold@skeeve.com
+# Subject: fixme
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBRule: Pattern Match (Other Patterns) (Score: 4850)
+# X-SBRule: Pattern Match (Spam Phone #) (Score: 0)
+# X-SBClass: Blocked
+# Status: RO
+# 
+# Path: ord-read.news.verio.net!dfw-artgen!iad-peer.news.verio.net!news.verio.net!fu-berlin.de!uni-berlin.de!host213-120-137-48.in-addr.btopenworld.COM!not-for-mail
+# From: laura@madonnaweb.com (laura fairhead)
+# Newsgroups: comp.lang.awk
+# Subject: bug in gawk3.1.0 regex code
+# Date: Wed, 08 May 2002 23:31:40 GMT
+# Organization: that'll be the daewooo :)
+# Lines: 211
+# Message-ID: <3cd9b0f7.29675926@NEWS.CIS.DFN.DE>
+# Reply-To: laura@madonnaweb.com
+# NNTP-Posting-Host: host213-120-137-48.in-addr.btopenworld.com (213.120.137.48)
+# X-Trace: fu-berlin.de 1020900891 18168286 213.120.137.48 (16 [53286])
+# X-Newsreader: Forte Free Agent 1.21/32.243
+# Xref: dfw-artgen comp.lang.awk:13059
+# 
+# 
+# I believe I've just found a bug in gawk3.1.0 implementation of
+# extended regular expressions. It seems to be down to the alternation
+# operator; when using an end anchor '$' as a subexpression in an
+# alternation and the entire matched RE is a nul-string it fails
+# to match the end of string, for example;
+# 
+# gsub(/$|2/,"x")
+# print
+# 
+# input           = 12345
+# expected output = 1x345x
+# actual output   = 1x345
+# 
+# The start anchor '^' always works as expected;
+# 
+# gsub(/^|2/,"x")
+# print
+# 
+# input           = 12345
+# expected output = x1x345
+# actual output   = x1x345
+# 
+# This was with POSIX compliance enabled althought that doesn't
+# effect the result.
+# 
+# I checked on gawk3.0.6 and got exactly the same results however
+# gawk2.15.6 gives the expected results.
+# 
+# I'm about to post a bug report about this into gnu.utils.bug
+# but I thought I'd post it here first in case anyone has
+# any input/comments/whatever ....
+# 
+# Complete test results were as follows;
+# 
+# input          12345
+# output         gsub(/regex/,"x",input)
+# 
+# regex          output
+# (^)            x12345
+# ($)            12345x
+# (^)|($)        x12345x
+# ($)|(^)        x12345x
+# (2)            1x345
+# (^)|2          x1x345
+# 2|(^)          x1x345
+# ($)|2          1x345
+# 2|($)          1x345
+# (2)|(^)        x1x345
+# (^)|(2)        x1x345
+# (2)|($)        1x345
+# ($)|(2)        1x345
+# .((2)|(^))     x345
+# .((^)|(2))     x345
+# .((2)|($))     x34x
+# .(($)|(2))     x34x
+# x{0}((2)|(^))  x1x345
+# x{0}((^)|(2))  x1x345
+# x{0}((2)|($))  1x345
+# x{0}(($)|(2))  1x345
+# x*((2)|(^))    x1x345
+# x*((^)|(2))    x1x345
+# x*((2)|($))    1x345
+# x*(($)|(2))    1x345
+# 
+# Here's the test program I used, a few of the cases use ERE {n[,[m]]}
+# operators so that will have to be commented out or have a check
+# added or something (should have put a conditional in I know... ;-)
+# 
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# 
+BEGIN{
+
+TESTSTR="12345"
+
+print "input          "TESTSTR
+print "output         gsub(/regex/,\"x\",input)"
+print ""
+
+print "regex          output"
+$0=TESTSTR
+gsub(/(^)/,"x")
+print "(^)            "$0
+
+$0=TESTSTR
+gsub(/($)/,"x")
+print "($)            "$0
+
+$0=TESTSTR
+gsub(/(^)|($)/,"x")
+print "(^)|($)        "$0
+
+$0=TESTSTR
+gsub(/($)|(^)/,"x")
+print "($)|(^)        "$0
+
+$0=TESTSTR
+gsub(/2/,"x")
+print "(2)            "$0
+
+$0=TESTSTR
+gsub(/(^)|2/,"x")
+print "(^)|2          "$0
+
+$0=TESTSTR
+gsub(/2|(^)/,"x")
+print "2|(^)          "$0
+
+$0=TESTSTR
+gsub(/($)|2/,"x")
+print "($)|2          "$0
+
+$0=TESTSTR
+gsub(/2|($)/,"x")
+print "2|($)          "$0
+
+$0=TESTSTR
+gsub(/(2)|(^)/,"x")
+print "(2)|(^)        "$0
+
+$0=TESTSTR
+gsub(/(^)|(2)/,"x")
+print "(^)|(2)        "$0
+
+$0=TESTSTR
+gsub(/(2)|($)/,"x")
+print "(2)|($)        "$0
+
+$0=TESTSTR
+gsub(/($)|(2)/,"x")
+print "($)|(2)        "$0
+
+$0=TESTSTR
+gsub(/.((2)|(^))/,"x")
+print ".((2)|(^))     "$0
+
+$0=TESTSTR
+gsub(/.((^)|(2))/,"x")
+print ".((^)|(2))     "$0
+
+$0=TESTSTR
+gsub(/.((2)|($))/,"x")
+print ".((2)|($))     "$0
+
+$0=TESTSTR
+gsub(/.(($)|(2))/,"x")
+print ".(($)|(2))     "$0
+
+$0=TESTSTR
+gsub(/x{0}((2)|(^))/,"x")
+print "x{0}((2)|(^))  "$0
+
+$0=TESTSTR
+gsub(/x{0}((^)|(2))/,"x")
+print "x{0}((^)|(2))  "$0
+
+$0=TESTSTR
+gsub(/x{0}((2)|($))/,"x")
+print "x{0}((2)|($))  "$0
+
+$0=TESTSTR
+gsub(/x{0}(($)|(2))/,"x")
+print "x{0}(($)|(2))  "$0
+
+$0=TESTSTR
+gsub(/x*((2)|(^))/,"x")
+print "x*((2)|(^))    "$0
+
+$0=TESTSTR
+gsub(/x*((^)|(2))/,"x")
+print "x*((^)|(2))    "$0
+
+$0=TESTSTR
+gsub(/x*((2)|($))/,"x")
+print "x*((2)|($))    "$0
+
+$0=TESTSTR
+gsub(/x*(($)|(2))/,"x")
+print "x*(($)|(2))    "$0
+
+$0=TESTSTR
+gsub(/x{0}^/,"x")
+print "x{0}^          "$0
+
+$0=TESTSTR
+gsub(/x{0}$/,"x")
+print "x{0}$          "$0
+
+$0=TESTSTR
+gsub(/(x{0}^)|2/,"x")
+print "(x{0}^)|2      "$0
+
+$0=TESTSTR
+gsub(/(x{0}$)|2/,"x")
+print "(x{0}$)|2      "$0
+
+
+}
+# 
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+# 
+# byefrom
+# 
+# -- 
+# laura fairhead  # laura@madonnaweb.com  http://lf.8k.com
+#                 # if you are bored crack my sig.
+# 1F8B0808CABB793C0000666667002D8E410E83300C04EF91F2877D00CA138A7A
+# EAA98F30C494480157B623C4EF1B508FDED1CEFA9152A23DE35D661593C5318E
+# 630C313CD701BE92E390563326EE17A3CA818F5266E4C2461547F1F5267659CA
+# 8EE2092F76C329ED02CA430C5373CC62FF94BAC6210B36D9F9BC4AB53378D978
+# 80F2978A1A6E5D6F5133B67B6113178DC1059526698AFE5C17A5187E7D930492
+# 
diff --git a/gawk-5.0.1/test/gsubtst4.ok b/gawk-5.0.1/test/gsubtst4.ok
new file mode 100644
index 00000000000..71bf8dcf64b
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst4.ok
@@ -0,0 +1,33 @@
+input          12345
+output         gsub(/regex/,"x",input)
+
+regex          output
+(^)            x12345
+($)            12345x
+(^)|($)        x12345x
+($)|(^)        x12345x
+(2)            1x345
+(^)|2          x1x345
+2|(^)          x1x345
+($)|2          1x345x
+2|($)          1x345x
+(2)|(^)        x1x345
+(^)|(2)        x1x345
+(2)|($)        1x345x
+($)|(2)        1x345x
+.((2)|(^))     x345
+.((^)|(2))     x345
+.((2)|($))     x34x
+.(($)|(2))     x34x
+x{0}((2)|(^))  x1x345
+x{0}((^)|(2))  x1x345
+x{0}((2)|($))  1x345x
+x{0}(($)|(2))  1x345x
+x*((2)|(^))    x1x345
+x*((^)|(2))    x1x345
+x*((2)|($))    1x345x
+x*(($)|(2))    1x345x
+x{0}^          x12345
+x{0}$          12345x
+(x{0}^)|2      x1x345
+(x{0}$)|2      1x345x
diff --git a/gawk-5.0.1/test/gsubtst5.awk b/gawk-5.0.1/test/gsubtst5.awk
new file mode 100644
index 00000000000..4bef854fbe2
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst5.awk
@@ -0,0 +1,97 @@
+# From jose@monkey.org  Thu Jun  5 11:48:35 2003
+# Return-Path: <jose@monkey.org>
+# Received: from localhost (skeeve [127.0.0.1])
+# 	by skeeve.com (8.12.5/8.12.5) with ESMTP id h558eVvA012655
+# 	for <arnold@localhost>; Thu, 5 Jun 2003 11:48:35 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Thu, 05 Jun 2003 11:48:35 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Thu Jun  5 11:47:59 2003)
+# X-From_: jose@monkey.org Thu Jun  5 07:14:45 2003
+# Received: from smtp1.actcom.net.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id h554EdY08108 for <arobbins@actcom.co.il>;
+# 	Thu, 5 Jun 2003 07:14:41 +0300 (EET DST)  
+# 	(rfc931-sender: smtp.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by smtp1.actcom.net.il (8.12.8/8.12.8) with ESMTP id h554G3To008304
+# 	for <arobbins@actcom.co.il>; Thu, 5 Jun 2003 07:16:05 +0300
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by f7.net (8.11.7/8.11.6) with ESMTP id h554Ean08172
+# 	for <arnold@skeeve.com>; Thu, 5 Jun 2003 00:14:36 -0400
+# Received: from monty-python.gnu.org ([199.232.76.173])
+# 	by fencepost.gnu.org with esmtp (Exim 4.20)
+# 	id 19Nm96-0001xE-1i
+# 	for arnold@gnu.ai.mit.edu; Thu, 05 Jun 2003 00:14:36 -0400
+# Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.20)
+# 	id 19Nm8x-0005ge-Dz
+# 	for arnold@gnu.ai.mit.edu; Thu, 05 Jun 2003 00:14:28 -0400
+# Received: from naughty.monkey.org ([66.93.9.164])
+# 	by monty-python.gnu.org with esmtp (Exim 4.20)
+# 	id 19Nm8w-0005VM-Ko
+# 	for arnold@gnu.ai.mit.edu; Thu, 05 Jun 2003 00:14:26 -0400
+# Received: by naughty.monkey.org (Postfix, from userid 1203)
+# 	id C15511BA97B; Thu,  5 Jun 2003 00:14:19 -0400 (EDT)
+# Received: from localhost (localhost [127.0.0.1])
+# 	by naughty.monkey.org (Postfix) with ESMTP
+# 	id BF9821BA969; Thu,  5 Jun 2003 00:14:19 -0400 (EDT)
+# Date: Thu, 5 Jun 2003 00:14:19 -0400 (EDT)
+# From: Jose Nazario <jose@monkey.org>
+# To: bug-gnu-utils@prep.ai.mit.edu, arnold@gnu.ai.mit.edu,
+#    netbsd-bugs@netbsd.org
+# Subject: bug in gawk/gsub() (not present in nawk)
+# Message-ID: <Pine.BSO.4.51.0306050007160.31577@naughty.monkey.org>
+# MIME-Version: 1.0
+# Content-Type: TEXT/PLAIN; charset=US-ASCII
+# X-Spam-Status: No, hits=-1.2 required=5.0
+# 	tests=SPAM_PHRASE_00_01,USER_AGENT_PINE
+# 	version=2.41
+# X-Spam-Level: 
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: R
+# 
+# while playing with some tools in data massaging, i had to migrate from an
+# openbsd/nawk system to a netbsd/gawk system. i found the folllowing
+# behavior, which seems to be a bug.
+# 
+# the following gsub() pattern has a strange effect under gawk which is not
+# visible in nawk (at least as compiled on openbsd). the intention is to
+# take a string like "This Is a Title: My Title?" and turn it into a
+# normalized string: "ThisIsaTitleMyTitle". to do this, i wrote the
+# following gross gsub line in an awk script:
+# 
+# 	gsub(/[\ \"-\/\\:;\[\]\@\?\.\,\$]/, "", $2)
+# 	print $2
+# 
+# in gawk, as found in netbsd-macppc/1.5.2, this will drop the first letter
+# of every word. the resulting string will be "hissitleyitle", while in nawk
+# as built on openbsd-3.3 this will get it correct.
+# 
+# any insights? the inconsistency with this relatively naive pattern seems a
+# bit odd. (i would up installing nawk built from openbsd sources.)
+# 
+# thanks. sorry i didn't send a better bug report, netbsd folks, i'm not
+# much of a netbsd user, and i dont have send-pr set up. yes, this is a
+# slightly older version of netbsd and gawk:
+# 
+# $ uname -a
+# NetBSD entropy 1.5.2 NetBSD 1.5.2 (GENERIC) #0: Sun Feb 10 02:00:04 EST
+# 2002     jose@entropy:/usr/src/sys/arch/macppc/compile/GENERIC macppc
+# $ awk --version
+# GNU Awk 3.0.3
+# Copyright (C) 1989, 1991-1997 Free Software Foundation.
+# 
+# 
+# 
+# thanks.
+# 
+# ___________________________
+# jose nazario, ph.d.			jose@monkey.org
+# 					http://monkey.org/~jose/
+# 
+# 
+{
+	gsub(/[\ \"-\/\\:;\[\]\@\?\.\,\$]/, "")
+ 	print
+}
diff --git a/gawk-5.0.1/test/gsubtst5.in b/gawk-5.0.1/test/gsubtst5.in
new file mode 100644
index 00000000000..5d1f1a97630
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst5.in
@@ -0,0 +1 @@
+This Is a Title: My Title?
diff --git a/gawk-5.0.1/test/gsubtst5.ok b/gawk-5.0.1/test/gsubtst5.ok
new file mode 100644
index 00000000000..66488fd1ec3
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst5.ok
@@ -0,0 +1,5 @@
+gawk: gsubtst5.awk:95: warning: regexp escape sequence `\ ' is not a known regexp operator
+gawk: gsubtst5.awk:95: warning: regexp escape sequence `\"' is not a known regexp operator
+gawk: gsubtst5.awk:95: warning: regexp escape sequence `\@' is not a known regexp operator
+gawk: gsubtst5.awk:95: warning: regexp escape sequence `\,' is not a known regexp operator
+ThisIsaTitleMyTitle
diff --git a/gawk-5.0.1/test/gsubtst6.awk b/gawk-5.0.1/test/gsubtst6.awk
new file mode 100644
index 00000000000..2b1df51d797
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst6.awk
@@ -0,0 +1,24 @@
+# From: "T. X. G." <leopardie333@yahoo.com>
+# Subject: Bug in regular expression \B using DFA
+# Date: Wed, 16 Jul 2008 05:23:09 -0700 (PDT)
+# To: bug-gawk@gnu.org
+# 
+# ~ gawk --version
+# GNU Awk 3.1.6
+# Copyright (C) 1989, 1991-2007 Free Software Foundation.
+# 
+# ......
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see http://www.gnu.org/licenses/.
+# 
+# ~ LC_ALL=C gawk 'BEGIN{x="abcd";gsub(/\B/,":",x);print x}'
+# a:b:cd
+# 
+# ~ LC_ALL=en_US.UTF-8 gawk 'BEGIN{x="abcd";gsub(/\B/,":",x);print x}'
+# a:b:c:d
+# 
+# ~ GAWK_NO_DFA=1 gawk 'BEGIN{x="abcd";gsub(/\B/,":",x);print x}'
+# a:b:c:d
+
+BEGIN { x = "abcd"; gsub(/\B/,":",x); print x }
diff --git a/gawk-5.0.1/test/gsubtst6.ok b/gawk-5.0.1/test/gsubtst6.ok
new file mode 100644
index 00000000000..5b6bb798c31
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst6.ok
@@ -0,0 +1 @@
+a:b:c:d
diff --git a/gawk-5.0.1/test/gsubtst7.awk b/gawk-5.0.1/test/gsubtst7.awk
new file mode 100644
index 00000000000..e649f46ecc6
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst7.awk
@@ -0,0 +1,92 @@
+# From bug-gawk-bounces+arnold=skeeve.com@gnu.org  Tue Jul 12 08:18:24 2011
+# Return-Path: <bug-gawk-bounces+arnold=skeeve.com@gnu.org>
+# Received: from localhost (localhost [127.0.0.1])
+# 	by skeeve.com (8.14.3/8.14.3) with ESMTP id p6C5HArm002260
+# 	for <arnold@localhost>; Tue, 12 Jul 2011 08:18:23 +0300
+# X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on sls-af11p1
+# X-Spam-Level: 
+# X-Spam-Status: No, score=-5.5 required=5.0 tests=BAYES_00,DNS_FROM_OPENWHOIS,
+# 	RCVD_IN_DNSWL_MED autolearn=ham version=3.2.5
+# X-Envelope-From: bug-gawk-bounces+arnold=skeeve.com@gnu.org
+# Received: from server1.f7.net [66.148.120.132]
+# 	by localhost with IMAP (fetchmail-6.3.11)
+# 	for <arnold@localhost> (single-drop); Tue, 12 Jul 2011 08:18:23 +0300 (IDT)
+# Received: from lists.gnu.org (lists.gnu.org [140.186.70.17])
+# 	by freefriends.org (8.14.4/8.14.4) with ESMTP id p6BIYi4t032040;
+# 	Mon, 11 Jul 2011 14:34:48 -0400
+# Received: from localhost ([::1]:38787 helo=lists.gnu.org)
+# 	by lists.gnu.org with esmtp (Exim 4.71)
+# 	(envelope-from <bug-gawk-bounces+arnold=skeeve.com@gnu.org>)
+# 	id 1QgLJb-0004tM-Eg
+# 	for arnold@skeeve.com; Mon, 11 Jul 2011 14:34:43 -0400
+# Received: from eggs.gnu.org ([140.186.70.92]:54022)
+# 	by lists.gnu.org with esmtp (Exim 4.71)
+# 	(envelope-from <kornet@camk.edu.pl>) id 1QgD0R-0004Vi-HZ
+# 	for bug-gawk@gnu.org; Mon, 11 Jul 2011 05:42:24 -0400
+# Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
+# 	(envelope-from <kornet@camk.edu.pl>) id 1QgD0Q-0000SE-8u
+# 	for bug-gawk@gnu.org; Mon, 11 Jul 2011 05:42:23 -0400
+# Received: from moat.camk.edu.pl ([148.81.175.50]:34696)
+# 	by eggs.gnu.org with esmtp (Exim 4.71)
+# 	(envelope-from <kornet@camk.edu.pl>) id 1QgD0P-0000Px-V3
+# 	for bug-gawk@gnu.org; Mon, 11 Jul 2011 05:42:22 -0400
+# Received: from localhost (localhost.localdomain [127.0.0.1])
+# 	by moat.camk.edu.pl (Postfix) with ESMTP id 72C1D5F004C
+# 	for <bug-gawk@gnu.org>; Mon, 11 Jul 2011 11:42:13 +0200 (CEST)
+# X-Virus-Scanned: amavisd-new at camk.edu.pl
+# Received: from moat.camk.edu.pl ([127.0.0.1])
+# 	by localhost (liam.camk.edu.pl [127.0.0.1]) (amavisd-new, port 10024)
+# 	with LMTP id oh+-Yw+zHhK6 for <bug-gawk@gnu.org>;
+# 	Mon, 11 Jul 2011 11:42:07 +0200 (CEST)
+# Received: from gatekeeper.camk.edu.pl (gatekeeper.camk.edu.pl [192.168.1.23])
+# 	by moat.camk.edu.pl (Postfix) with ESMTP id 89AA55F0046
+# 	for <bug-gawk@gnu.org>; Mon, 11 Jul 2011 11:42:07 +0200 (CEST)
+# Received: by gatekeeper.camk.edu.pl (Postfix, from userid 1293)
+# 	id 796C8809FB; Mon, 11 Jul 2011 11:42:07 +0200 (CEST)
+# Date: Mon, 11 Jul 2011 11:42:07 +0200
+# From: Kacper Kornet <draenog@pld-linux.org>
+# To: bug-gawk@gnu.org
+# Message-ID: <20110711094207.GA2616@camk.edu.pl>
+# MIME-Version: 1.0
+# Content-Type: text/plain; charset=iso-8859-2
+# Content-Disposition: inline
+# User-Agent: Mutt/1.5.20 (2009-06-14)
+# X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3)
+# X-Received-From: 148.81.175.50
+# X-Mailman-Approved-At: Mon, 11 Jul 2011 14:34:26 -0400
+# Subject: [bug-gawk] Change in behavior of gsub inside loop
+# X-BeenThere: bug-gawk@gnu.org
+# X-Mailman-Version: 2.1.14
+# Precedence: list
+# List-Id: "Bug reports and all discussion about gawk." <bug-gawk.gnu.org>
+# List-Unsubscribe: <https://lists.gnu.org/mailman/options/bug-gawk>,
+# 	<mailto:bug-gawk-request@gnu.org?subject=unsubscribe>
+# List-Archive: </archive/html/bug-gawk>
+# List-Post: <mailto:bug-gawk@gnu.org>
+# List-Help: <mailto:bug-gawk-request@gnu.org?subject=help>
+# List-Subscribe: <https://lists.gnu.org/mailman/listinfo/bug-gawk>,
+# 	<mailto:bug-gawk-request@gnu.org?subject=subscribe>
+# Errors-To: bug-gawk-bounces+arnold=skeeve.com@gnu.org
+# Sender: bug-gawk-bounces+arnold=skeeve.com@gnu.org
+# Status: R
+# 
+# Hi,
+# 
+# I have observed the following changed behavior between gawk-3.8.1 and
+# gakw-4.0.0. While in the former 
+# 
+# echo -ne ' aaa' | gawk '{for (c = 1; c <= NF; c++) {gsub("foo", "bar", $c); print}}'
+# 
+# prints:
+# 
+#  aaa
+# 
+# the gawk-4.0.0 does not preserve the leading spaces and prints:
+# 
+# aaa
+# 
+# Best regards,
+# -- 
+#   Kacper
+# 
+{for (c = 1; c <= NF; c++) {gsub("foo", "bar", $c); print}}
diff --git a/gawk-5.0.1/test/gsubtst7.in b/gawk-5.0.1/test/gsubtst7.in
new file mode 100644
index 00000000000..88069bf78e7
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst7.in
@@ -0,0 +1 @@
+ aaa
\ No newline at end of file
diff --git a/gawk-5.0.1/test/gsubtst7.ok b/gawk-5.0.1/test/gsubtst7.ok
new file mode 100644
index 00000000000..88f42c8c1b1
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst7.ok
@@ -0,0 +1 @@
+ aaa
diff --git a/gawk-5.0.1/test/gsubtst8.awk b/gawk-5.0.1/test/gsubtst8.awk
new file mode 100644
index 00000000000..818b0ea32dc
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst8.awk
@@ -0,0 +1,5 @@
+{
+        OFS = " " $2 " "
+        gsub("foo", "_", OFS)
+        print $1, $2
+}
diff --git a/gawk-5.0.1/test/gsubtst8.in b/gawk-5.0.1/test/gsubtst8.in
new file mode 100644
index 00000000000..f2b45c7d41c
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst8.in
@@ -0,0 +1,2 @@
+a bar b
+c foo d
diff --git a/gawk-5.0.1/test/gsubtst8.ok b/gawk-5.0.1/test/gsubtst8.ok
new file mode 100644
index 00000000000..d3b28cc04c3
--- /dev/null
+++ b/gawk-5.0.1/test/gsubtst8.ok
@@ -0,0 +1,2 @@
+a bar bar
+c _ foo
diff --git a/gawk-5.0.1/test/gtlnbufv.awk b/gawk-5.0.1/test/gtlnbufv.awk
new file mode 100644
index 00000000000..ce7d243c9c7
--- /dev/null
+++ b/gawk-5.0.1/test/gtlnbufv.awk
@@ -0,0 +1,2 @@
+/@K@CODE/ { print ; getline temp ; print temp ;next }
+{print}
diff --git a/gawk-5.0.1/test/hello.awk b/gawk-5.0.1/test/hello.awk
new file mode 100644
index 00000000000..9e6d569d296
--- /dev/null
+++ b/gawk-5.0.1/test/hello.awk
@@ -0,0 +1,3 @@
+BEGIN {
+	print "Hello"
+}
diff --git a/gawk-5.0.1/test/hex.awk b/gawk-5.0.1/test/hex.awk
new file mode 100644
index 00000000000..f9d1ad58f05
--- /dev/null
+++ b/gawk-5.0.1/test/hex.awk
@@ -0,0 +1,22 @@
+# Test program from Paul Eggert, eggert@cs.ucla.edu, Jan. 14, 2005
+
+BEGIN {
+	e = "1(e)"
+	ex = "3e2(ex)"
+	x = "6e5(x)"
+
+	print e+0, x+0
+	print 0x
+	print 0e+x
+	print 0ex
+	print 010e2
+	print 0e9.3
+}
+
+# Expected results:
+# 1 600000
+# 06e5(x)
+# 0600001
+# 03e2(ex)
+# 1000
+# 00.3
diff --git a/gawk-5.0.1/test/hex.ok b/gawk-5.0.1/test/hex.ok
new file mode 100644
index 00000000000..59714c30d97
--- /dev/null
+++ b/gawk-5.0.1/test/hex.ok
@@ -0,0 +1,6 @@
+1 600000
+06e5(x)
+0600001
+03e2(ex)
+1000
+00.3
diff --git a/gawk-5.0.1/test/hex2.awk b/gawk-5.0.1/test/hex2.awk
new file mode 100644
index 00000000000..49c6203de1c
--- /dev/null
+++ b/gawk-5.0.1/test/hex2.awk
@@ -0,0 +1 @@
+{ print $1 + 7}
diff --git a/gawk-5.0.1/test/hex2.in b/gawk-5.0.1/test/hex2.in
new file mode 100644
index 00000000000..60f06f0fffe
--- /dev/null
+++ b/gawk-5.0.1/test/hex2.in
@@ -0,0 +1,2 @@
+0x4
+-0x4
diff --git a/gawk-5.0.1/test/hex2.ok b/gawk-5.0.1/test/hex2.ok
new file mode 100644
index 00000000000..49019db8078
--- /dev/null
+++ b/gawk-5.0.1/test/hex2.ok
@@ -0,0 +1,2 @@
+7
+7
diff --git a/gawk-5.0.1/test/hsprint.awk b/gawk-5.0.1/test/hsprint.awk
new file mode 100644
index 00000000000..facc109df12
--- /dev/null
+++ b/gawk-5.0.1/test/hsprint.awk
@@ -0,0 +1,71 @@
+# Test which attempts to repeat examples of formatted output
+# from "C a reference manual" by Harbison and Steele.
+#
+# In the second series of outputs formats of a type "%5%" are skipped
+# since my old copy of H&S explicitely requires padding ("...%05% will
+# print 0000%..."), whereas Standard says "...the complete conversion
+# specification shall be %%".
+#
+# Michal Jaegermann - michal@phys.ualberta.ca
+
+
+BEGIN {
+    zero = "0";
+    alt  = "#";
+    spc  = " ";
+    plus = "+";
+    just = "-";
+    value[0] = 45;
+    value[1] = 45;
+    value[2] = 45;
+    value[3] = 12.678;
+    value[4] = 12.678;
+    value[5] = 12.678;
+    value[6] = "zap";
+    value[7] = "*";
+    value[8] = -3.4567;
+    value[9] = -3.4567;
+    value[10]= -3.4567;
+    value[11]= -3.4567;
+    oper[0]  = "5d";
+    oper[1]  = "5o";
+    oper[2]  = "5x";
+    oper[3]  = "7.2f";
+    oper[4]  = "10.2e";
+    oper[5]  = "10.4g";
+    oper[6]  = "5s";
+    oper[7]  = "5c";
+    oper[8]  = "7.1G";
+    oper[9]  = "7.2f";
+    oper[10] = "10.2e";
+    oper[11] = "10.4g";
+
+    
+    for (r = 0; r < 12; r += 6) {
+	for (j = 2; j > 0; --j) {
+	    for (p = 2; p > 0; --p) {
+		for (s = 2; s > 0; --s) {
+		    for (a = 2; a > 0; --a) {
+			for (z = 2; z > 0; --z) {
+			    fmt = "%" substr(just,j,1) substr(plus,p,1) \
+			      substr(spc,s,1) substr(alt,a,1) substr(zero,z,1);
+			    fstr = sprintf(\
+				     "%6s|%s%s|%s%s|%s%s|%s%s|%s%s|%s%s|\n",
+					   "%" fmt, 
+					   fmt, oper[r],
+					   fmt, oper[r+1],
+					   fmt, oper[r+2],
+					   fmt, oper[r+3],
+					   fmt, oper[r+4],
+					   fmt, oper[r+5]);
+			    printf(fstr, value[r],   value[r+1],
+					 value[r+2], value[r+3],
+					 value[r+4], value[r+5]);
+			}
+		    }
+		}
+	    }
+	}
+	print "";
+    }
+}
diff --git a/gawk-5.0.1/test/hsprint.ok b/gawk-5.0.1/test/hsprint.ok
new file mode 100644
index 00000000000..f0a9e9cb921
--- /dev/null
+++ b/gawk-5.0.1/test/hsprint.ok
@@ -0,0 +1,66 @@
+    %|   45|   55|   2d|  12.68|  1.27e+01|     12.68|
+   %0|00045|00055|0002d|0012.68|001.27e+01|0000012.68|
+   %#|   45|  055| 0x2d|  12.68|  1.27e+01|     12.68|
+  %#0|00045|00055|0x02d|0012.68|001.27e+01|0000012.68|
+   % |   45|   55|   2d|  12.68|  1.27e+01|     12.68|
+  % 0| 0045|00055|0002d| 012.68| 01.27e+01| 000012.68|
+  % #|   45|  055| 0x2d|  12.68|  1.27e+01|     12.68|
+ % #0| 0045|00055|0x02d| 012.68| 01.27e+01| 000012.68|
+   %+|  +45|   55|   2d| +12.68| +1.27e+01|    +12.68|
+  %+0|+0045|00055|0002d|+012.68|+01.27e+01|+000012.68|
+  %+#|  +45|  055| 0x2d| +12.68| +1.27e+01|    +12.68|
+ %+#0|+0045|00055|0x02d|+012.68|+01.27e+01|+000012.68|
+  %+ |  +45|   55|   2d| +12.68| +1.27e+01|    +12.68|
+ %+ 0|+0045|00055|0002d|+012.68|+01.27e+01|+000012.68|
+ %+ #|  +45|  055| 0x2d| +12.68| +1.27e+01|    +12.68|
+%+ #0|+0045|00055|0x02d|+012.68|+01.27e+01|+000012.68|
+   %-|45   |55   |2d   |12.68  |1.27e+01  |12.68     |
+  %-0|45   |55   |2d   |12.68  |1.27e+01  |12.68     |
+  %-#|45   |055  |0x2d |12.68  |1.27e+01  |12.68     |
+ %-#0|45   |055  |0x2d |12.68  |1.27e+01  |12.68     |
+  %- | 45  |55   |2d   | 12.68 | 1.27e+01 | 12.68    |
+ %- 0| 45  |55   |2d   | 12.68 | 1.27e+01 | 12.68    |
+ %- #| 45  |055  |0x2d | 12.68 | 1.27e+01 | 12.68    |
+%- #0| 45  |055  |0x2d | 12.68 | 1.27e+01 | 12.68    |
+  %-+|+45  |55   |2d   |+12.68 |+1.27e+01 |+12.68    |
+ %-+0|+45  |55   |2d   |+12.68 |+1.27e+01 |+12.68    |
+ %-+#|+45  |055  |0x2d |+12.68 |+1.27e+01 |+12.68    |
+%-+#0|+45  |055  |0x2d |+12.68 |+1.27e+01 |+12.68    |
+ %-+ |+45  |55   |2d   |+12.68 |+1.27e+01 |+12.68    |
+%-+ 0|+45  |55   |2d   |+12.68 |+1.27e+01 |+12.68    |
+%-+ #|+45  |055  |0x2d |+12.68 |+1.27e+01 |+12.68    |
+%-+ #0|+45  |055  |0x2d |+12.68 |+1.27e+01 |+12.68    |
+
+    %|  zap|    *|     -3|  -3.46| -3.46e+00|    -3.457|
+   %0|  zap|    *|-000003|-003.46|-03.46e+00|-00003.457|
+   %#|  zap|    *|    -3.|  -3.46| -3.46e+00|    -3.457|
+  %#0|  zap|    *|-00003.|-003.46|-03.46e+00|-00003.457|
+   % |  zap|    *|     -3|  -3.46| -3.46e+00|    -3.457|
+  % 0|  zap|    *|-000003|-003.46|-03.46e+00|-00003.457|
+  % #|  zap|    *|    -3.|  -3.46| -3.46e+00|    -3.457|
+ % #0|  zap|    *|-00003.|-003.46|-03.46e+00|-00003.457|
+   %+|  zap|    *|     -3|  -3.46| -3.46e+00|    -3.457|
+  %+0|  zap|    *|-000003|-003.46|-03.46e+00|-00003.457|
+  %+#|  zap|    *|    -3.|  -3.46| -3.46e+00|    -3.457|
+ %+#0|  zap|    *|-00003.|-003.46|-03.46e+00|-00003.457|
+  %+ |  zap|    *|     -3|  -3.46| -3.46e+00|    -3.457|
+ %+ 0|  zap|    *|-000003|-003.46|-03.46e+00|-00003.457|
+ %+ #|  zap|    *|    -3.|  -3.46| -3.46e+00|    -3.457|
+%+ #0|  zap|    *|-00003.|-003.46|-03.46e+00|-00003.457|
+   %-|zap  |*    |-3     |-3.46  |-3.46e+00 |-3.457    |
+  %-0|zap  |*    |-3     |-3.46  |-3.46e+00 |-3.457    |
+  %-#|zap  |*    |-3.    |-3.46  |-3.46e+00 |-3.457    |
+ %-#0|zap  |*    |-3.    |-3.46  |-3.46e+00 |-3.457    |
+  %- |zap  |*    |-3     |-3.46  |-3.46e+00 |-3.457    |
+ %- 0|zap  |*    |-3     |-3.46  |-3.46e+00 |-3.457    |
+ %- #|zap  |*    |-3.    |-3.46  |-3.46e+00 |-3.457    |
+%- #0|zap  |*    |-3.    |-3.46  |-3.46e+00 |-3.457    |
+  %-+|zap  |*    |-3     |-3.46  |-3.46e+00 |-3.457    |
+ %-+0|zap  |*    |-3     |-3.46  |-3.46e+00 |-3.457    |
+ %-+#|zap  |*    |-3.    |-3.46  |-3.46e+00 |-3.457    |
+%-+#0|zap  |*    |-3.    |-3.46  |-3.46e+00 |-3.457    |
+ %-+ |zap  |*    |-3     |-3.46  |-3.46e+00 |-3.457    |
+%-+ 0|zap  |*    |-3     |-3.46  |-3.46e+00 |-3.457    |
+%-+ #|zap  |*    |-3.    |-3.46  |-3.46e+00 |-3.457    |
+%-+ #0|zap  |*    |-3.    |-3.46  |-3.46e+00 |-3.457    |
+
diff --git a/gawk-5.0.1/test/icasefs.awk b/gawk-5.0.1/test/icasefs.awk
new file mode 100644
index 00000000000..86481d8658c
--- /dev/null
+++ b/gawk-5.0.1/test/icasefs.awk
@@ -0,0 +1,43 @@
+BEGIN {
+	# 1. Should print aCa
+	IGNORECASE = 1
+	FS = "[c]"
+	IGNORECASE = 0
+	$0 = "aCa"
+	print $1
+
+	# 2. Should print a
+	IGNORECASE = 1
+	FS = "[c]"
+	$0 = "aCa"
+	print $1
+
+	# 3. Should print a
+	IGNORECASE = 1
+	FS = "C"
+	IGNORECASE = 0
+	$0 = "aCa"
+	print $1
+
+	# 4. Should print aCa
+	IGNORECASE = 1
+	FS = "c"
+	$0 = "aCa"
+	print $1
+
+	# 5. Should print aCa
+	FS = "xy"
+	IGNORECASE = 0
+	FS = "c"
+	IGNORECASE = 1
+	$0 = "aCa"
+	print $1
+
+	# 6. Should print aCa
+	FS = "xy"
+	IGNORECASE = 0
+	FS = "c"
+	IGNORECASE = 1
+	split("aCa",a)
+	print a[1]
+}
diff --git a/gawk-5.0.1/test/icasefs.ok b/gawk-5.0.1/test/icasefs.ok
new file mode 100644
index 00000000000..658fac78392
--- /dev/null
+++ b/gawk-5.0.1/test/icasefs.ok
@@ -0,0 +1,6 @@
+aCa
+a
+a
+aCa
+aCa
+aCa
diff --git a/gawk-5.0.1/test/icasers.awk b/gawk-5.0.1/test/icasers.awk
new file mode 100644
index 00000000000..8fdc826bcfa
--- /dev/null
+++ b/gawk-5.0.1/test/icasers.awk
@@ -0,0 +1,2 @@
+BEGIN { RS = "[[:upper:]\\n]+" }
+{ print ; IGNORECASE = ! IGNORECASE }
diff --git a/gawk-5.0.1/test/icasers.in b/gawk-5.0.1/test/icasers.in
new file mode 100644
index 00000000000..b3476994e56
--- /dev/null
+++ b/gawk-5.0.1/test/icasers.in
@@ -0,0 +1 @@
+1111AAAA2222bbbb
\ No newline at end of file
diff --git a/gawk-5.0.1/test/icasers.ok b/gawk-5.0.1/test/icasers.ok
new file mode 100644
index 00000000000..4f142ee300f
--- /dev/null
+++ b/gawk-5.0.1/test/icasers.ok
@@ -0,0 +1,2 @@
+1111
+2222
diff --git a/gawk-5.0.1/test/id.awk b/gawk-5.0.1/test/id.awk
new file mode 100644
index 00000000000..9c2ae2d4fae
--- /dev/null
+++ b/gawk-5.0.1/test/id.awk
@@ -0,0 +1,12 @@
+function function1()
+{
+	print "function1"
+}
+
+BEGIN { 
+	an_array[1] = 1
+
+	for (i in PROCINFO["identifiers"])
+	      printf("%s -> %s\n", i, PROCINFO["identifiers"][i]) | "sort"
+	close("sort")
+}
diff --git a/gawk-5.0.1/test/id.ok b/gawk-5.0.1/test/id.ok
new file mode 100644
index 00000000000..791306573ab
--- /dev/null
+++ b/gawk-5.0.1/test/id.ok
@@ -0,0 +1,74 @@
+ARGC -> scalar
+ARGIND -> scalar
+ARGV -> array
+BINMODE -> scalar
+CONVFMT -> scalar
+ENVIRON -> array
+ERRNO -> scalar
+FIELDWIDTHS -> scalar
+FILENAME -> scalar
+FNR -> scalar
+FPAT -> scalar
+FS -> scalar
+FUNCTAB -> array
+IGNORECASE -> scalar
+LINT -> scalar
+NF -> scalar
+NR -> scalar
+OFMT -> scalar
+OFS -> scalar
+ORS -> scalar
+PREC -> scalar
+PROCINFO -> array
+RLENGTH -> scalar
+ROUNDMODE -> scalar
+RS -> scalar
+RSTART -> scalar
+RT -> scalar
+SUBSEP -> scalar
+SYMTAB -> array
+TEXTDOMAIN -> scalar
+an_array -> untyped
+and -> builtin
+asort -> builtin
+asorti -> builtin
+atan2 -> builtin
+bindtextdomain -> builtin
+close -> builtin
+compl -> builtin
+cos -> builtin
+dcgettext -> builtin
+dcngettext -> builtin
+exp -> builtin
+fflush -> builtin
+function1 -> user
+gensub -> builtin
+gsub -> builtin
+i -> untyped
+index -> builtin
+int -> builtin
+isarray -> builtin
+length -> builtin
+log -> builtin
+lshift -> builtin
+match -> builtin
+mktime -> builtin
+or -> builtin
+patsplit -> builtin
+rand -> builtin
+rshift -> builtin
+sin -> builtin
+split -> builtin
+sprintf -> builtin
+sqrt -> builtin
+srand -> builtin
+strftime -> builtin
+strtonum -> builtin
+sub -> builtin
+substr -> builtin
+system -> builtin
+systime -> builtin
+tolower -> builtin
+toupper -> builtin
+typeof -> builtin
+xor -> builtin
diff --git a/gawk-5.0.1/test/igncdym.awk b/gawk-5.0.1/test/igncdym.awk
new file mode 100644
index 00000000000..3119c3e9c36
--- /dev/null
+++ b/gawk-5.0.1/test/igncdym.awk
@@ -0,0 +1,56 @@
+#From Jeffrey.B.Woodward@Hitchcock.ORG  Mon Feb 21 09:33:32 2000
+#Message-id: <12901034@mailbox2.Hitchcock.ORG>
+#Date: 20 Feb 2000 18:14:11 EST
+#From: Jeffrey.B.Woodward@Hitchcock.ORG (Jeffrey B. Woodward)
+#Subject: gawk 3.0.4 bug
+#To: bug-gnu-utils@gnu.org
+#Cc: arnold@gnu.org
+#
+#O/S: Digital UNIX 4.0D
+#
+#C Compiler: DEC C
+#
+#gawk version: 3.0.4
+#
+#Sample Program:
+#gawk '
+  BEGIN {
+    pattern[1] = "bar" ; ignore[1] = 1
+    pattern[2] = "foo" ; ignore[2] = 0
+  }
+
+  {
+    for (i = 1 ; i <= 2 ; i++) {
+      IGNORECASE = ignore[i]
+      print match($0, pattern[i]) " " pattern[i] ":" $0
+    }
+  }
+#' << -EOF-
+#This is foo
+#This is bar
+#-EOF-
+#
+#Program Output:
+#0 bar:This is foo
+#0 foo:This is foo
+#9 bar:This is bar
+#9 foo:This is bar
+#
+#
+#**Expected** Output:
+#0 bar:This is foo
+#9 foo:This is foo
+#9 bar:This is bar
+#0 foo:This is bar
+#
+#
+#This problem appears to be directly related to IGNORECASE. If
+#IGNORECASE remains constant, the program behaves as expected;
+#however, switching IGNORECASE seems to causes problems - it is
+#almost as though the pattern stored in the variable is treated
+#as a constant and the regexp() is not recompiled(?) - just a
+#guess...
+#
+#
+#Thanks,
+#-Jeff Woodward
diff --git a/gawk-5.0.1/test/igncdym.in b/gawk-5.0.1/test/igncdym.in
new file mode 100644
index 00000000000..43e361aa648
--- /dev/null
+++ b/gawk-5.0.1/test/igncdym.in
@@ -0,0 +1,2 @@
+This is foo
+This is bar
diff --git a/gawk-5.0.1/test/igncdym.ok b/gawk-5.0.1/test/igncdym.ok
new file mode 100644
index 00000000000..e715a6de5c2
--- /dev/null
+++ b/gawk-5.0.1/test/igncdym.ok
@@ -0,0 +1,4 @@
+0 bar:This is foo
+9 foo:This is foo
+9 bar:This is bar
+0 foo:This is bar
diff --git a/gawk-5.0.1/test/igncfs.awk b/gawk-5.0.1/test/igncfs.awk
new file mode 100644
index 00000000000..5e3c6b667d5
--- /dev/null
+++ b/gawk-5.0.1/test/igncfs.awk
@@ -0,0 +1,8 @@
+BEGIN   {
+        IGNORECASE=1
+        FS="[^[:lower:]]+"
+}
+{
+        for (i=1; i<NF; i++) printf "%s, ", $i
+        printf "%s\n", $NF
+}
diff --git a/gawk-5.0.1/test/igncfs.in b/gawk-5.0.1/test/igncfs.in
new file mode 100644
index 00000000000..559801723ef
--- /dev/null
+++ b/gawk-5.0.1/test/igncfs.in
@@ -0,0 +1,2 @@
+this is handled ok
+This is Not hanDLed Well
diff --git a/gawk-5.0.1/test/igncfs.ok b/gawk-5.0.1/test/igncfs.ok
new file mode 100644
index 00000000000..41df9a4ca6c
--- /dev/null
+++ b/gawk-5.0.1/test/igncfs.ok
@@ -0,0 +1,2 @@
+this, is, handled, ok
+This, is, Not, hanDLed, Well
diff --git a/gawk-5.0.1/test/ignrcas2.awk b/gawk-5.0.1/test/ignrcas2.awk
new file mode 100644
index 00000000000..b7ef0cdf8c5
--- /dev/null
+++ b/gawk-5.0.1/test/ignrcas2.awk
@@ -0,0 +1,13 @@
+# Based on test program submitted by:
+# Date: Sun, 7 Sep 2003 23:11:51 +0200
+# From: Michael Mauch <michael.mauch@gmx.de>
+# To: bug-gawk@gnu.org
+# Subject: Internal error in gawk-3.1.3 with character class
+
+BEGIN {
+	IGNORECASE = 1
+	if ("a" ~ /[[:alnum:]]/)
+		print "OK"
+	else
+		print "NOT OK"
+}
diff --git a/gawk-5.0.1/test/ignrcas2.ok b/gawk-5.0.1/test/ignrcas2.ok
new file mode 100644
index 00000000000..d86bac9de59
--- /dev/null
+++ b/gawk-5.0.1/test/ignrcas2.ok
@@ -0,0 +1 @@
+OK
diff --git a/gawk-5.0.1/test/ignrcas3.awk b/gawk-5.0.1/test/ignrcas3.awk
new file mode 100644
index 00000000000..fd88744ddf0
--- /dev/null
+++ b/gawk-5.0.1/test/ignrcas3.awk
@@ -0,0 +1,20 @@
+BEGIN {
+	dfapat[1] = data[1] = "b\323"
+	dfapat[2] = data[2] = "b\362"
+	dfapat[3] = data[3] = "b\363"
+
+	regexpat[1] = "[a-c]\323"
+	regexpat[2] = "[a-c]\362"
+	regexpat[3] = "[a-c]\363"
+
+	IGNORECASE = 1
+
+	for (i = 1; i <= 3; i++) {
+		for (j = 1; j <= 3; j++) {
+			printf("data[%d] ~ dfa[%d] = %s\n", i, j,
+				data[i] ~ dfapat[j] ? "ok" : "bad")
+			printf("data[%d] ~ regex[%d] = %s\n", i, j,
+				data[i] ~ regexpat[j] ? "ok" : "bad")
+		}
+	}
+}
diff --git a/gawk-5.0.1/test/ignrcas3.ok b/gawk-5.0.1/test/ignrcas3.ok
new file mode 100644
index 00000000000..0222feb59dd
--- /dev/null
+++ b/gawk-5.0.1/test/ignrcas3.ok
@@ -0,0 +1,18 @@
+data[1] ~ dfa[1] = ok
+data[1] ~ regex[1] = ok
+data[1] ~ dfa[2] = ok
+data[1] ~ regex[2] = ok
+data[1] ~ dfa[3] = ok
+data[1] ~ regex[3] = ok
+data[2] ~ dfa[1] = ok
+data[2] ~ regex[1] = ok
+data[2] ~ dfa[2] = ok
+data[2] ~ regex[2] = ok
+data[2] ~ dfa[3] = ok
+data[2] ~ regex[3] = ok
+data[3] ~ dfa[1] = ok
+data[3] ~ regex[1] = ok
+data[3] ~ dfa[2] = ok
+data[3] ~ regex[2] = ok
+data[3] ~ dfa[3] = ok
+data[3] ~ regex[3] = ok
diff --git a/gawk-5.0.1/test/ignrcas4.awk b/gawk-5.0.1/test/ignrcas4.awk
new file mode 100644
index 00000000000..e74eea642a7
--- /dev/null
+++ b/gawk-5.0.1/test/ignrcas4.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	x = "0"
+	print x+0	# trigger NUMCUR
+	IGNORECASE = x	# should enable ignorecase, since x is a non-null string
+	y = "aBc"
+	print (y ~ /abc/)
+}
diff --git a/gawk-5.0.1/test/ignrcas4.ok b/gawk-5.0.1/test/ignrcas4.ok
new file mode 100644
index 00000000000..0d66ea1aee9
--- /dev/null
+++ b/gawk-5.0.1/test/ignrcas4.ok
@@ -0,0 +1,2 @@
+0
+1
diff --git a/gawk-5.0.1/test/ignrcase.awk b/gawk-5.0.1/test/ignrcase.awk
new file mode 100644
index 00000000000..61d7a8331cf
--- /dev/null
+++ b/gawk-5.0.1/test/ignrcase.awk
@@ -0,0 +1,2 @@
+BEGIN { IGNORECASE = 1 }
+{ sub(/y/, ""); print }
diff --git a/gawk-5.0.1/test/ignrcase.in b/gawk-5.0.1/test/ignrcase.in
new file mode 100644
index 00000000000..aba8e51eaf6
--- /dev/null
+++ b/gawk-5.0.1/test/ignrcase.in
@@ -0,0 +1 @@
+xYz
diff --git a/gawk-5.0.1/test/ignrcase.ok b/gawk-5.0.1/test/ignrcase.ok
new file mode 100644
index 00000000000..d66e95ca507
--- /dev/null
+++ b/gawk-5.0.1/test/ignrcase.ok
@@ -0,0 +1 @@
+xz
diff --git a/gawk-5.0.1/test/incdupe.ok b/gawk-5.0.1/test/incdupe.ok
new file mode 100644
index 00000000000..63c85e413dc
--- /dev/null
+++ b/gawk-5.0.1/test/incdupe.ok
@@ -0,0 +1,3 @@
+gawk: warning: already included source file `inclib.awk'
+Include library loaded.
+abc
diff --git a/gawk-5.0.1/test/incdupe2.ok b/gawk-5.0.1/test/incdupe2.ok
new file mode 100644
index 00000000000..11787238bdd
--- /dev/null
+++ b/gawk-5.0.1/test/incdupe2.ok
@@ -0,0 +1,2 @@
+gawk: inclib.awk:5: error: function name `sandwich' previously defined
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/incdupe3.ok b/gawk-5.0.1/test/incdupe3.ok
new file mode 100644
index 00000000000..af17d2f8731
--- /dev/null
+++ b/gawk-5.0.1/test/incdupe3.ok
@@ -0,0 +1,2 @@
+Hello
+Hello
diff --git a/gawk-5.0.1/test/incdupe4.ok b/gawk-5.0.1/test/incdupe4.ok
new file mode 100644
index 00000000000..a6fc26e24b0
--- /dev/null
+++ b/gawk-5.0.1/test/incdupe4.ok
@@ -0,0 +1,2 @@
+gawk: fatal: can't include `hello.awk' and use it as a program file
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/incdupe5.ok b/gawk-5.0.1/test/incdupe5.ok
new file mode 100644
index 00000000000..a6fc26e24b0
--- /dev/null
+++ b/gawk-5.0.1/test/incdupe5.ok
@@ -0,0 +1,2 @@
+gawk: fatal: can't include `hello.awk' and use it as a program file
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/incdupe6.ok b/gawk-5.0.1/test/incdupe6.ok
new file mode 100644
index 00000000000..42a4f9fdbbe
--- /dev/null
+++ b/gawk-5.0.1/test/incdupe6.ok
@@ -0,0 +1,3 @@
+gawk: inchello:1: warning: `include' is a gawk extension
+gawk: inchello:2: fatal: can't include `hello' and use it as a program file
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/incdupe7.ok b/gawk-5.0.1/test/incdupe7.ok
new file mode 100644
index 00000000000..42a4f9fdbbe
--- /dev/null
+++ b/gawk-5.0.1/test/incdupe7.ok
@@ -0,0 +1,3 @@
+gawk: inchello:1: warning: `include' is a gawk extension
+gawk: inchello:2: fatal: can't include `hello' and use it as a program file
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/inchello.awk b/gawk-5.0.1/test/inchello.awk
new file mode 100644
index 00000000000..148d4bef72c
--- /dev/null
+++ b/gawk-5.0.1/test/inchello.awk
@@ -0,0 +1 @@
+@include "hello"
diff --git a/gawk-5.0.1/test/inclib.awk b/gawk-5.0.1/test/inclib.awk
new file mode 100644
index 00000000000..517852832cb
--- /dev/null
+++ b/gawk-5.0.1/test/inclib.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	print "Include library loaded."
+}
+
+function sandwich(pfx,x,sfx) {
+	return (pfx x sfx)
+}
diff --git a/gawk-5.0.1/test/include.awk b/gawk-5.0.1/test/include.awk
new file mode 100644
index 00000000000..8fc7837d543
--- /dev/null
+++ b/gawk-5.0.1/test/include.awk
@@ -0,0 +1,5 @@
+@include "inclib.awk"
+
+BEGIN {
+	print sandwich("a", "b", "c")
+}
diff --git a/gawk-5.0.1/test/include.ok b/gawk-5.0.1/test/include.ok
new file mode 100644
index 00000000000..a720efcadc4
--- /dev/null
+++ b/gawk-5.0.1/test/include.ok
@@ -0,0 +1,2 @@
+Include library loaded.
+abc
diff --git a/gawk-5.0.1/test/include2.ok b/gawk-5.0.1/test/include2.ok
new file mode 100644
index 00000000000..a720efcadc4
--- /dev/null
+++ b/gawk-5.0.1/test/include2.ok
@@ -0,0 +1,2 @@
+Include library loaded.
+abc
diff --git a/gawk-5.0.1/test/indirectbuiltin.awk b/gawk-5.0.1/test/indirectbuiltin.awk
new file mode 100644
index 00000000000..c9e752178c5
--- /dev/null
+++ b/gawk-5.0.1/test/indirectbuiltin.awk
@@ -0,0 +1,377 @@
+function print_result(category, fname, builtin_result, indirect_result)
+{
+	if (builtin_result == indirect_result)
+		printf("%s: %s: pass\n", category, fname)
+	else {
+		printf("%s: %s: fail: builtin: %s \tindirect: %s\n", category, fname,
+				builtin_result, indirect_result)
+		exit 1
+	}
+}
+
+
+BEGIN {
+# math functions
+
+	fun = "and"
+	b1 = and(0x11, 0x01)
+	i1 = @fun(0x11, 0x01)
+	print_result("math", fun, b1, i1)
+
+	fun = "atan2"
+	b1 = atan2(-1, 0)
+	i1 = @fun(-1, 0)
+	print_result("math", fun, b1, i1)
+
+	fun = "compl"
+	b1 = compl(0x1111)
+	i1 = @fun(0x1111)
+	print_result("math", fun, b1, i1)
+
+	fun = "cos"
+	b1 = cos(3.1415927 / 4)
+	i1 = @fun(3.1415927 / 4)
+	print_result("math", fun, b1, i1)
+
+	fun = "exp"
+	b1 = exp(2)
+	i1 = @fun(2)
+	print_result("math", fun, b1, i1)
+
+	fun = "int"
+	b1 = int(3.1415927)
+	i1 = @fun(3.1415927)
+	print_result("math", fun, b1, i1)
+
+	fun = "log"
+	b1 = log(10)
+	i1 = @fun(10)
+	print_result("math", fun, b1, i1)
+
+	fun = "lshift"
+	b1 = lshift(1, 2)
+	i1 = @fun(1, 2)
+	print_result("math", fun, b1, i1)
+
+	fun = "or"
+	b1 = or(0x10, 0x01)
+	i1 = @fun(0x10, 0x01)
+	print_result("math", fun, b1, i1)
+
+	fun = "rand"
+	srand(1)
+	b1 = rand();
+	srand(1)
+	i1 = @fun()
+	print_result("math", fun, b1, i1)
+
+	fun = "rshift"
+	b1 = rshift(0x10, 1)
+	i1 = @fun(0x10, 1)
+	print_result("math", fun, b1, i1)
+
+	fun = "sin"
+	b1 = sin(3.1415927 / 4)
+	i1 = @fun(3.1415927 / 4)
+	print_result("math", fun, b1, i1)
+
+	fun = "sqrt"
+	b1 = sqrt(2)
+	i1 = @fun(2)
+	print_result("math", fun, b1, i1)
+
+	srand()
+	fun = "srand"
+	b1 = srand()
+	i1 = @fun()
+	print_result("math", fun, b1, i1)
+
+	fun = "xor"
+	b1 = xor(0x11, 0x01)
+	i1 = @fun(0x11, 0x01)
+	print_result("math", fun, b1, i1)
+
+# string functions
+
+	fun = "gensub"
+	b1 = gensub("f", "q", "g", "ff11bb")
+	i1 = @fun("f", "q", "g", "ff11bb")
+	print_result("string", fun, b1, i1)
+
+	fun = "gensub"
+	$0 = "ff11bb"
+	b1 = gensub("f", "q", "g")
+	i1 = @fun("f", "q", "g")
+	print_result("string", fun " (3 args)", b1, i1)
+
+	fun = "gsub"
+	$0 = "ff11bb"
+	b1 = gsub("f", "q")
+	b2 = $0
+	$0 = "ff11bb"
+	i1 = @fun("f", "q")
+	i2 = $0
+	print_result("string", fun, b1, i1)
+	if (b2 != i2) {
+		printf("string: %s: fail: $0 (%s) != $0 (%s)\n",
+			fun, b2, i2)
+		exit 1
+	}
+
+	fun = "index"
+	b1 = index("hi, how are you", "how")
+	i1 = @fun("hi, how are you", "how")
+	print_result("string", fun, b1, i1)
+
+	fun = "dcgettext"
+	b1 = dcgettext("hello, world")
+	i1 = @fun("hello, world")
+	print_result("string", fun, b1, i1)
+
+	fun = "dcngettext"
+	b1 = dcngettext("hello, world", "howdy", 2)
+	i1 = @fun("hello, world", "howdy", 2)
+	print_result("string", fun, b1, i1)
+
+	fun = "length"
+	b1 = length("hi, how are you")
+	i1 = @fun("hi, how are you")
+	print_result("string", fun, b1, i1)
+
+	fun = "sprintf"
+	b1 = sprintf("%s world", "hello")
+	i1 = @fun("%s world", "hello")
+	print_result("string", fun, b1, i1)
+
+	fun = "strtonum"
+	b1 = strtonum("0xdeadbeef")
+	i1 = @fun("0xdeadbeef")
+	print_result("string", fun, b1, i1)
+
+	fun = "sub"
+	$0 = "ff11bb"
+	b1 = sub("f", "q")
+	b2 = $0
+	$0 = "ff11bb"
+	i1 = @fun("f", "q")
+	i2 = $0
+	print_result("string", fun, b1, i1)
+	if (b2 != i2) {
+		printf("string: %s: fail: $0 (%s) != $0 (%s)\n",
+			fun, b2, i2)
+		exit 1
+	}
+
+	fun = "substr"
+	b1 = substr("0xdeadbeef", 7, 4)
+	i1 = @fun("0xdeadbeef", 7, 4)
+	print_result("string", fun, b1, i1)
+
+	fun = "tolower"
+	b1 = tolower("0xDeAdBeEf")
+	i1 = @fun("0xDeAdBeEf")
+	print_result("string", fun, b1, i1)
+
+	fun = "toupper"
+	b1 = toupper("0xDeAdBeEf")
+	i1 = @fun("0xDeAdBeEf")
+	print_result("string", fun, b1, i1)
+
+# time functions
+
+	fun = "mktime"
+	b1 = mktime("1990 02 11 12 00 00")
+	i1 = @fun("1990 02 11 12 00 00")
+	print_result("time", fun, b1, i1)
+
+	then = b1
+	fun = "strftime"
+	b1 = strftime(PROCINFO["strftime"], then)
+	i1 = @fun(PROCINFO["strftime"], then)
+	print_result("time", fun, b1, i1)
+
+	fun = "systime"
+	b1 = systime()
+	i1 = @fun()
+	print_result("time", fun, b1, i1)
+
+# regexp functions
+
+	fun = "match"
+	b1 = match("o+", "fooob")
+	rstart = RSTART
+	rlength = RLENGTH
+	i1 = @fun("o+", "fooob")
+	print_result("regexp", fun, b1, i1)
+	if (rstart != RSTART) {
+		printf("match: failure: biRSTART (%d) != iRSTART (%d)\n",
+			rstart, RSTART)
+		exit 1
+	}
+	if (rlength != RLENGTH) {
+		printf("match: failure: biRLENGTH (%d) != iRLENGTH (%d)\n",
+			rlength, RLENGTH)
+		exit 1
+	}
+
+	############## start patsplit ##############
+	fun = "patsplit"
+	delete data
+	delete data2
+	delete seps
+	delete seps2
+	b1 = patsplit("a:b:c:d", data, ":", seps)
+	i1 = @fun("a:b:c:d", data2, ":", seps2)
+	print_result("regexp", fun, b1, i1)
+	for (i in data) {
+		if ((! (i in data2)) || data[i] != data2[i]) {
+			printf("patsplit1a: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n",
+				i, data[i], i, data2[i])
+			exit 1
+		}
+	}
+	for (i in seps) {
+		if ((! (i in seps2)) || seps[i] != seps2[i]) {
+			printf("patsplit1b: fail: builtin seps[%d] (%s) != indirect seps[%d] (%s)\n",
+				i, seps[i], i, seps2[i])
+			exit 1
+		}
+	}
+
+	fun = "patsplit"
+	delete data
+	delete data2
+	b1 = patsplit("a:b:c:d", data, ":")
+	i1 = @fun("a:b:c:d", data2, ":")
+	print_result("regexp", fun, b1, i1)
+	for (i in data) {
+		if ((! (i in data2)) || data[i] != data2[i]) {
+			printf("patsplit2: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n",
+				i, data[i], i, data2[i])
+			exit 1
+		}
+	}
+
+	fun = "patsplit"
+	delete data
+	delete data2
+	FPAT = "[a-z]+"
+	b1 = patsplit("a b c d", data)
+	i1 = @fun("a b c d", data2)
+	print_result("regexp", fun, b1, i1)
+	for (i in data) {
+		if ((! (i in data2)) || data[i] != data2[i]) {
+			printf("patsplit3: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n",
+				i, data[i], i, data2[i])
+			exit 1
+		}
+	}
+	############## end patsplit ##############
+
+	############## start split ##############
+	fun = "split"
+	delete data
+	delete data2
+	delete seps
+	delete seps2
+	b1 = split("a:b:c:d", data, ":", seps)
+	i1 = @fun("a:b:c:d", data2, ":", seps2)
+	print_result("regexp", fun, b1, i1)
+	for (i in data) {
+		if ((! (i in data2)) || data[i] != data2[i]) {
+			printf("split1a: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n",
+				i, data[i], i, data2[i])
+			exit 1
+		}
+	}
+	for (i in seps) {
+		if ((! (i in seps2)) || seps[i] != seps2[i]) {
+			printf("split1b: fail: builtin seps[%d] (%s) != indirect seps[%d] (%s)\n",
+				i, seps[i], i, seps2[i])
+			exit 1
+		}
+	}
+
+	fun = "split"
+	delete data
+	delete data2
+	b1 = split("a:b:c:d", data, ":")
+	i1 = @fun("a:b:c:d", data2, ":")
+	print_result("regexp", fun, b1, i1)
+	for (i in data) {
+		if ((! (i in data2)) || data[i] != data2[i]) {
+			printf("split2: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n",
+				i, data[i], i, data2[i])
+			exit 1
+		}
+	}
+
+	fun = "split"
+	delete data
+	delete data2
+	b1 = split("a b c d", data)
+	i1 = @fun("a b c d", data2)
+	print_result("regexp", fun, b1, i1)
+	for (i in data) {
+		if ((! (i in data2)) || data[i] != data2[i]) {
+			printf("split3: fail: builtin data[%d] (%s) != indirect data[%d] (%s)\n",
+				i, data[i], i, data2[i])
+			exit 1
+		}
+	}
+	############## end split ##############
+
+# array functions
+
+	split("z y x w v u t", data)
+	fun = "asort"
+	asort(data, newdata)
+	@fun(data, newdata2)
+	print_result("array", fun, b1, i1)
+	for (i in newdata) {
+		if (! (i in newdata2) || newdata[i] != newdata2[i]) {
+			print fun ": failed, index", i
+			exit
+		}
+	}
+
+	for (i in data)
+		data2[data[i]] = i
+
+	fun = "asorti"
+	asorti(data2, newdata)
+	@fun(data2, newdata2)
+	print_result("array", fun, b1, i1)
+	for (i in newdata) {
+		if (! (i in newdata2) || newdata[i] != newdata2[i]) {
+			print fun ": failed, index", i, "value", newdata[i], newdata2[i]
+			exit
+		}
+	}
+
+	arr[1] = arr[2] = 42
+	fun = "isarray"
+	b1 = isarray(arr)
+	i1 = @fun(arr)
+	print_result("array", fun, b1, i1)
+
+# i/o functions
+
+	print("hi") > "x1.out"
+	print("hi") > "x2.out"
+
+	fun = "fflush"
+	b1 = fflush("x1.out")
+	i1 = @fun("x2.out")
+	print_result("i/o", fun, b1, i1)
+
+	fun = "close"
+	b1 = close("x1.out")
+	i1 = @fun("x2.out")
+	print_result("i/o", fun, b1, i1)
+
+	fun = "system"
+	b1 = system("rm x1.out")
+	i1 = @fun("rm x2.out")
+	print_result("i/o", fun, b1, i1)
+}
diff --git a/gawk-5.0.1/test/indirectbuiltin.ok b/gawk-5.0.1/test/indirectbuiltin.ok
new file mode 100644
index 00000000000..08c8761081d
--- /dev/null
+++ b/gawk-5.0.1/test/indirectbuiltin.ok
@@ -0,0 +1,44 @@
+math: and: pass
+math: atan2: pass
+math: compl: pass
+math: cos: pass
+math: exp: pass
+math: int: pass
+math: log: pass
+math: lshift: pass
+math: or: pass
+math: rand: pass
+math: rshift: pass
+math: sin: pass
+math: sqrt: pass
+math: srand: pass
+math: xor: pass
+string: gensub: pass
+string: gensub (3 args): pass
+string: gsub: pass
+string: index: pass
+string: dcgettext: pass
+string: dcngettext: pass
+string: length: pass
+string: sprintf: pass
+string: strtonum: pass
+string: sub: pass
+string: substr: pass
+string: tolower: pass
+string: toupper: pass
+time: mktime: pass
+time: strftime: pass
+time: systime: pass
+regexp: match: pass
+regexp: patsplit: pass
+regexp: patsplit: pass
+regexp: patsplit: pass
+regexp: split: pass
+regexp: split: pass
+regexp: split: pass
+array: asort: pass
+array: asorti: pass
+array: isarray: pass
+i/o: fflush: pass
+i/o: close: pass
+i/o: system: pass
diff --git a/gawk-5.0.1/test/indirectcall.awk b/gawk-5.0.1/test/indirectcall.awk
new file mode 100644
index 00000000000..5cfdd235e57
--- /dev/null
+++ b/gawk-5.0.1/test/indirectcall.awk
@@ -0,0 +1,130 @@
+# funcptrdemo.awk --- Demonstrate function pointers
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# January 2009
+
+# average --- return the average of the values in fields $first - $last
+
+function average(first, last,	sum, i)
+{
+	sum = 0;
+	for (i = first; i <= last; i++)
+		sum += $i
+
+	return sum / (last - first + 1)
+}
+
+# sum --- return the average of the values in fields $first - $last
+
+function sum(first, last,	ret, i)
+{
+	ret = 0;
+	for (i = first; i <= last; i++)
+		ret += $i
+
+	return ret
+}
+
+# For each record, print the class name and the requested statistics
+
+{
+	class_name = $1
+	gsub(/_/, " ", class_name)	# Replace _ with spaces
+
+	# find start
+	for (i = 1; i <= NF; i++) {
+		if ($i == "data:") {
+			start = i + 1
+			break
+		}
+	}
+
+	printf("%s:\n", class_name)
+	for (i = 2; $i != "data:"; i++) {
+		the_function = $i
+		printf("\t%s: <%s>\n", $i, @the_function(start, NF) "")
+	}
+	print ""
+}
+
+# do_sort --- sort the data in ascending order and print it
+
+function do_sort(first, last, compare,		data, i, retval)
+{
+	delete data
+	for (i = 1; first <= last; first++) {
+		data[i] = $first
+		i++
+	}
+
+	quicksort(data, 1, i-1, compare)
+
+	retval = data[1]
+	for (i = 2; i in data; i++)
+		retval = retval " " data[i]
+	
+	return retval
+}
+
+# sort --- sort the data in ascending order and print it
+
+function sort(first, last)
+{
+	return do_sort(first, last, "num_lt")
+}
+
+# rsort --- sort the data in descending order and print it
+
+function rsort(first, last)
+{
+	return do_sort(first, last, "num_ge")
+}
+
+# num_lt --- do a numeric less than comparison
+
+function num_lt(left, right)
+{
+	return ((left + 0) < (right + 0))
+}
+
+# num_ge --- do a numeric greater than or equal to comparison
+
+function num_ge(left, right)
+{
+	return ((left + 0) >= (right + 0))
+}
+
+# quicksort.awk --- Quicksort algorithm, with user-supplied
+#                   comparison function
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# January 2009
+
+# quicksort --- C.A.R. Hoare's quick sort algorithm. See Wikipedia
+#               or almost any algorithms or computer science text
+#
+# Adapted from K&R-II, page 110
+
+function quicksort(data, left, right, less_than,	i, last)
+{
+	if (left >= right)	# do nothing if array contains fewer
+		return		# than two elements
+
+	quicksort_swap(data, left, int((left + right) / 2))
+	last = left
+	for (i = left + 1; i <= right; i++)
+		if (@less_than(data[i], data[left]))
+			quicksort_swap(data, ++last, i)
+	quicksort_swap(data, left, last)
+	quicksort(data, left, last - 1, less_than)
+	quicksort(data, last + 1, right, less_than)
+}
+
+# quicksort_swap --- helper function for quicksort, should really be inline
+
+function quicksort_swap(data, i, j,	temp)
+{
+	temp = data[i]
+	data[i] = data[j]
+	data[j] = temp
+}
diff --git a/gawk-5.0.1/test/indirectcall.in b/gawk-5.0.1/test/indirectcall.in
new file mode 100644
index 00000000000..f5de0e29049
--- /dev/null
+++ b/gawk-5.0.1/test/indirectcall.in
@@ -0,0 +1,3 @@
+Biology_101 sum average sort rsort data: 87.0 92.4 78.5 94.9
+Chemistry_305 sum average sort rsort data: 75.2 98.3 94.7 88.2
+English_401 sum average sort rsort data: 100.0 95.6 87.1 93.4
diff --git a/gawk-5.0.1/test/indirectcall.ok b/gawk-5.0.1/test/indirectcall.ok
new file mode 100644
index 00000000000..d3f281ca82e
--- /dev/null
+++ b/gawk-5.0.1/test/indirectcall.ok
@@ -0,0 +1,18 @@
+Biology 101:
+	sum: <352.8>
+	average: <88.2>
+	sort: <78.5 87.0 92.4 94.9>
+	rsort: <94.9 92.4 87.0 78.5>
+
+Chemistry 305:
+	sum: <356.4>
+	average: <89.1>
+	sort: <75.2 88.2 94.7 98.3>
+	rsort: <98.3 94.7 88.2 75.2>
+
+English 401:
+	sum: <376.1>
+	average: <94.025>
+	sort: <87.1 93.4 95.6 100.0>
+	rsort: <100.0 95.6 93.4 87.1>
+
diff --git a/gawk-5.0.1/test/indirectcall2.awk b/gawk-5.0.1/test/indirectcall2.awk
new file mode 100644
index 00000000000..8f3c9483b39
--- /dev/null
+++ b/gawk-5.0.1/test/indirectcall2.awk
@@ -0,0 +1,11 @@
+BEGIN {
+	Quarter_pi = 3.1415927 / 4
+	print sin(Quarter_pi)
+
+	f = "sin"
+	print @f(Quarter_pi)
+
+	print substr("abcdefgh", 2, 3)
+	f = "substr"
+	print @f("abcdefgh", 2, 3)
+}
diff --git a/gawk-5.0.1/test/indirectcall2.ok b/gawk-5.0.1/test/indirectcall2.ok
new file mode 100644
index 00000000000..05bee4b14e3
--- /dev/null
+++ b/gawk-5.0.1/test/indirectcall2.ok
@@ -0,0 +1,4 @@
+0.707107
+0.707107
+bcd
+bcd
diff --git a/gawk-5.0.1/test/inftest.awk b/gawk-5.0.1/test/inftest.awk
new file mode 100644
index 00000000000..a8226178e95
--- /dev/null
+++ b/gawk-5.0.1/test/inftest.awk
@@ -0,0 +1,8 @@
+BEGIN {
+  k = 0
+  x = 100
+  # Added k limit test after finding some systems that didn't terminate
+  # the loop correctly, sigh...
+  do { k++; y = x ; x *= 1000; print x,y } while ( y < x  && k < 1700)
+  print "loop terminated"
+}
diff --git a/gawk-5.0.1/test/inftest.ok b/gawk-5.0.1/test/inftest.ok
new file mode 100644
index 00000000000..407df9b4e97
--- /dev/null
+++ b/gawk-5.0.1/test/inftest.ok
@@ -0,0 +1,105 @@
+100000 100
+100000000 100000
+100000000000 100000000
+100000000000000 100000000000
+100000000000000000 100000000000000
+100000000000000000000 100000000000000000
+99999999999999991611392 100000000000000000000
+99999999999999987584860160 99999999999999991611392
+99999999999999991433150857216 99999999999999987584860160
+99999999999999987351763694911488 99999999999999991433150857216
+99999999999999978416622034208423936 99999999999999987351763694911488
+99999999999999978859343891977453174784 99999999999999978416622034208423936
+99999999999999981277195531206711524196352 99999999999999978859343891977453174784
+99999999999999989014320776740338242315878400 99999999999999981277195531206711524196352
+99999999999999984102174700855949311516153479168 99999999999999989014320776740338242315878400
+99999999999999986860582406952576489172979654066176 99999999999999984102174700855949311516153479168
+99999999999999978054446934877508831185257879708893184 99999999999999986860582406952576489172979654066176
+99999999999999987412212025203316576428059584082518999040 99999999999999978054446934877508831185257879708893184
+99999999999999986018415450295152630082077192041996404916224 99999999999999987412212025203316576428059584082518999040
+99999999999999980666236602647803076113504806606389643480924160 99999999999999986018415450295152630082077192041996404916224
+99999999999999975825012428989187159563798798233702140870647611392 99999999999999980666236602647803076113504806606389643480924160
+99999999999999971335279399108653394842078992129280704487622839369728 99999999999999975825012428989187159563798798233702140870647611392
+99999999999999967408259575639813195298814735056613421464603838774247424 99999999999999971335279399108653394842078992129280704487622839369728
+99999999999999970056411870256069142542038397972347690757785041907511984128 99999999999999967408259575639813195298814735056613421464603838774247424
+99999999999999972567252564410741448076354167255414257198727219693125789286400 99999999999999970056411870256069142542038397972347690757785041907511984128
+99999999999999973698536947569070602057895480263592729374358127316211945338568704 99999999999999972567252564410741448076354167255414257198727219693125789286400
+99999999999999976120719655945885896110010116988012672708945321528841504187721187328 99999999999999973698536947569070602057895480263592729374358127316211945338568704
+99999999999999973856084135905232153357980849678363696123425190035433415775017926393856 99999999999999976120719655945885896110010116988012672708945321528841504187721187328
+99999999999999971205813538737655658983034598563985922382199344722004978592608624454926336 99999999999999973856084135905232153357980849678363696123425190035433415775017926393856
+99999999999999975389707388132869751436283080323216967861681212523470671424572109115849965568 99999999999999971205813538737655658983034598563985922382199344722004978592608624454926336
+99999999999999972379113067962648670423437470097331363676661611216816006398674924910108594929664 99999999999999975389707388132869751436283080323216967861681212523470671424572109115849965568
+99999999999999969414835583487354067580020253874920922632950003776417566988560774307532476147302400 99999999999999972379113067962648670423437470097331363676661611216816006398674924910108594929664
+99999999999999966622249050912868528133293762816112494334490172638967005189080435307857566164815183872 99999999999999969414835583487354067580020253874920922632950003776417566988560774307532476147302400
+99999999999999968362880378347121775677131631329985434686086700429684016230704354433915805708681998237696 99999999999999966622249050912868528133293762816112494334490172638967005189080435307857566164815183872
+99999999999999964288808425678149603140240254511229112583149913097811514958423455725153206182008585870901248 99999999999999968362880378347121775677131631329985434686086700429684016230704354433915805708681998237696
+99999999999999968982139315152805545902739120606436395645733092104128636424091051037647720836736356917448802304 99999999999999964288808425678149603140240254511229112583149913097811514958423455725153206182008585870901248
+99999999999999967380149038212122984106472840979272309693704700336639058963809845170982926501255944400227237101568 99999999999999968982139315152805545902739120606436395645733092104128636424091051037647720836736356917448802304
+99999999999999966559930016418493512466784505810164297686266163751684395304145867767250551801489973191409795717922816 99999999999999967380149038212122984106472840979272309693704700336639058963809845170982926501255944400227237101568
+99999999999999958580839372410066012355896381285081556877904079853245427222934695583742010722166605272033725937822466048 99999999999999966559930016418493512466784505810164297686266163751684395304145867767250551801489973191409795717922816
+99999999999999964744616902883383199809977537409440210268672488243000947267704701436097240209969526960208587421285248663552 99999999999999958580839372410066012355896381285081556877904079853245427222934695583742010722166605272033725937822466048
+99999999999999973698435499708622381138622312668787627138462205955970454339251530402644148459414217665561018763215928972804096 99999999999999964744616902883383199809977537409440210268672488243000947267704701436097240209969526960208587421285248663552
+99999999999999969038927015485337257005892808638742964825108028921863830855986242882741442632031065833582205967834822157445103616 99999999999999973698435499708622381138622312668787627138462205955970454339251530402644148459414217665561018763215928972804096
+99999999999999971501552402759992207773332814897718827642591733325954247602754580648099053350606729046973846898142049707859353010176 99999999999999969038927015485337257005892808638742964825108028921863830855986242882741442632031065833582205967834822157445103616
+99999999999999971974376477116725958320681296099442193303548604571539607618134101499047714608573256383945041956761037397538888893857792 99999999999999971501552402759992207773332814897718827642591733325954247602754580648099053350606729046973846898142049707859353010176
+99999999999999961968158199529955173403994504587771180275938657358298495399329094904038179293313627194069297996226940583414097499461255168 99999999999999971974376477116725958320681296099442193303548604571539607618134101499047714608573256383945041956761037397538888893857792
+99999999999999963620798121505576670783782774669698779846950364769001543610951083090052657384091991757042324095515152702392127562019650928640 99999999999999961968158199529955173403994504587771180275938657358298495399329094904038179293313627194069297996226940583414097499461255168
+99999999999999959051579265227378354828144165547185352553017196119889755915458610153359828358707969413334501536203103835841670045058198329622528 99999999999999963620798121505576670783782774669698779846950364769001543610951083090052657384091991757042324095515152702392127562019650928640
+99999999999999949000651624039424488856392748028506927595932797882554670922470130425357587563315085893427279408697133232798530309970250449591205888 99999999999999959051579265227378354828144165547185352553017196119889755915458610153359828358707969413334501536203103835841670045058198329622528
+99999999999999948113397321920763733791300209102720142496272933762293366867916664628678769065514886520635469455372468241633342802321107464319475384320 99999999999999949000651624039424488856392748028506927595932797882554670922470130425357587563315085893427279408697133232798530309970250449591205888
+99999999999999946478010192255648230055321641354709940200579872215827731234563716472240370810369559036705605349404445729917669188222207113866621719937024 99999999999999948113397321920763733791300209102720142496272933762293366867916664628678769065514886520635469455372468241633342802321107464319475384320
+99999999999999941174994859794900356607455139003828857556412504641155163420811223250296124735018310448815699341785471398594311548904172910798168237564493824 99999999999999946478010192255648230055321641354709940200579872215827731234563716472240370810369559036705605349404445729917669188222207113866621719937024
+99999999999999946510014354963832392659989467263634555857239408609611720064878292922562279944578696396604449694432883048689164539589319460636017298848184532992 99999999999999941174994859794900356607455139003828857556412504641155163420811223250296124735018310448815699341785471398594311548904172910798168237564493824
+99999999999999941339618318502970259434219055418702861961123734820753251454399578543040337524341888072347466495524305815225809869759600290050307580026961994448896 99999999999999946510014354963832392659989467263634555857239408609611720064878292922562279944578696396604449694432883048689164539589319460636017298848184532992
+99999999999999936244924684387270937819452376396255450979411565991520333252255420434433659770484396036007906295905408882388258279623991724679211271428480374583328768 99999999999999941339618318502970259434219055418702861961123734820753251454399578543040337524341888072347466495524305815225809869759600290050307580026961994448896
+99999999999999938393087270819114040015608114939367394621582908707281601350665380747521463661052072678153904384780012012657644738335288324478035879665769565830174998528 99999999999999936244924684387270937819452376396255450979411565991520333252255420434433659770484396036007906295905408882388258279623991724679211271428480374583328768
+99999999999999936402865781218259783047588779268187110073864544713098209344824228945072115447009943309125688250630284464918540788778765150873943899767450589406430224187392 99999999999999938393087270819114040015608114939367394621582908707281601350665380747521463661052072678153904384780012012657644738335288324478035879665769565830174998528
+99999999999999932755942024273873371963453979756196963399477041511967210604015516252752299267005165619015879149232552133229875362054559318652887774917983563976477694532517888 99999999999999936402865781218259783047588779268187110073864544713098209344824228945072115447009943309125688250630284464918540788778765150873943899767450589406430224187392
+99999999999999930449370010469988507729535311264848842396946780663816593047475793966409789645392732105835839886983821660858314734516991018179899807013191242951604188717858684928 99999999999999932755942024273873371963453979756196963399477041511967210604015516252752299267005165619015879149232552133229875362054559318652887774917983563976477694532517888
+99999999999999926062929060790372034489260266271016529998992090319447875774239110669868148490692058544771170935690235939685426866834118273051840402906249046168301887374323926171648 99999999999999930449370010469988507729535311264848842396946780663816593047475793966409789645392732105835839886983821660858314734516991018179899807013191242951604188717858684928
+99999999999999932742916262928110023686347842483162394048718371574133692602240984883924588271717248394482781662747380635887994975485943351991473842104185224408145227922919218275680256 99999999999999926062929060790372034489260266271016529998992090319447875774239110669868148490692058544771170935690235939685426866834118273051840402906249046168301887374323926171648
+99999999999999937578305619730709881245839649374381910536023685232697991459255307073630546336657965129832648296622676548394350483652119629822535399195325784877482862571061024201468018688 99999999999999932742916262928110023686347842483162394048718371574133692602240984883924588271717248394482781662747380635887994975485943351991473842104185224408145227922919218275680256
+99999999999999940476708761993653639767353567573372418760219182512524240452181745662269903053828283531977973233064610020242062507278752512846344394977566526684664367671371585724203629805568 99999999999999937578305619730709881245839649374381910536023685232697991459255307073630546336657965129832648296622676548394350483652119629822535399195325784877482862571061024201468018688
+99999999999999943939334382617117116614388861848433079252058069929489999249064530962831054545274423916407588090467239874609462471504703263765454875272083466230310539097875936556698439887355904 99999999999999940476708761993653639767353567573372418760219182512524240452181745662269903053828283531977973233064610020242062507278752512846344394977566526684664367671371585724203629805568
+99999999999999945838831865930559938199048223279323498721866831026796929789068801756281743363439163784437548240813825394719579023308653389983938338747932758781065010280415466156238449989365268480 99999999999999943939334382617117116614388861848433079252058069929489999249064530962831054545274423916407588090467239874609462471504703263765454875272083466230310539097875936556698439887355904
+99999999999999945320142419820435818384997240317928354845311051996492317289611635544950141936825645484474167122425851108694843196896054742184544454321460845295205656016170005273590724564176578019328 99999999999999945838831865930559938199048223279323498721866831026796929789068801756281743363439163784437548240813825394719579023308653389983938338747932758781065010280415466156238449989365268480
+99999999999999945984064910841394691746982498508514139007302449155282221288916808295454591762890948908427294953962458194806505054704181011367768626387344894557105629474404195203379813108418101808988160 99999999999999945320142419820435818384997240317928354845311051996492317289611635544950141936825645484474167122425851108694843196896054742184544454321460845295205656016170005273590724564176578019328
+99999999999999946663921541646856578069655402895673981989181639845883082984205305191971148384781819614555297853455943850984846797099702311011390178582810161001291202295636005691483839777721422169600163840 99999999999999945984064910841394691746982498508514139007302449155282221288916808295454591762890948908427294953962458194806505054704181011367768626387344894557105629474404195203379813108418101808988160
+99999999999999950423256767348738624679507494994913049741780812688629607814472577630949099881189578271160702686495122135388605295849976889520759913602854898331059745767919424966503865648301062435640300273664 99999999999999946663921541646856578069655402895673981989181639845883082984205305191971148384781819614555297853455943850984846797099702311011390178582810161001291202295636005691483839777721422169600163840
+99999999999999952561900806859142633417556685166924608285481675461392075273469070396234334510257103195807332991512965781627187908472355316406090251747591460011994739387707325709626369254675257786987577889259520 99999999999999950423256767348738624679507494994913049741780812688629607814472577630949099881189578271160702686495122135388605295849976889520759913602854898331059745767919424966503865648301062435640300273664
+99999999999999953583887505206514362393179124843789865061564861085069499723208194405671971965000837773131802726604159332043065252957502554000360109335689571620590875005483303878073176311374606605551396952498765824 99999999999999952561900806859142633417556685166924608285481675461392075273469070396234334510257103195807332991512965781627187908472355316406090251747591460011994739387707325709626369254675257786987577889259520
+99999999999999952387871071940561618997707835439092695988754367280903005281456350993484382532249312964925794716623151108470655652097170243947180298855446753006645226008223187712942284395877311531026424700205065568256 99999999999999953583887505206514362393179124843789865061564861085069499723208194405671971965000837773131802726604159332043065252957502554000360109335689571620590875005483303878073176311374606605551396952498765824
+99999999999999949479159106237764547059921659606869180803679246349170090799115867815044165031797604631368783236349339108742555502804842065897846999767496218137529407646886585199343955257387889909781692182626786546286592 99999999999999952387871071940561618997707835439092695988754367280903005281456350993484382532249312964925794716623151108470655652097170243947180298855446753006645226008223187712942284395877311531026424700205065568256
+99999999999999944462702596124645891625322848571590225772913900944379346496098343983932109923650153122211091016053956392579903624277946816512554707950971843053782716275082490927470794772649923189521302964942310388818509824 99999999999999949479159106237764547059921659606869180803679246349170090799115867815044165031797604631368783236349339108742555502804842065897846999767496218137529407646886585199343955257387889909781692182626786546286592
+99999999999999935312685921678317464112614617243241411796797910926041028887394380515983721406389201569507460406235178318299226597844889881633781567677631382901028751212911822975574150048487871891766353031885825877596727934976 99999999999999944462702596124645891625322848571590225772913900944379346496098343983932109923650153122211091016053956392579903624277946816512554707950971843053782716275082490927470794772649923189521302964942310388818509824
+99999999999999925121172612428343793833196719162992122293014542956141676109475130820315172455795108724278546368407554066019724438999593062658631582946511398090887633074892676187328287237126462895417822131010561164466052696899584 99999999999999935312685921678317464112614617243241411796797910926041028887394380515983721406389201569507460406235178318299226597844889881633781567677631382901028751212911822975574150048487871891766353031885825877596727934976
+99999999999999923774577821631960175979503309145679183912127553433409168077915219634719740955742418263179913081344910551912084411817969328125656926899457609130167051788011178598791027428244645758351900112623945543014980252539551744 99999999999999925121172612428343793833196719162992122293014542956141676109475130820315172455795108724278546368407554066019724438999593062658631582946511398090887633074892676187328287237126462895417822131010561164466052696899584
+99999999999999931186235550175255608646231837880969596760529543766528892283620970800236995932032426561066790693337700453560535121425626362995149433782441663569973131191006941326100105416330167280762734901823877923481682986297169281024 99999999999999923774577821631960175979503309145679183912127553433409168077915219634719740955742418263179913081344910551912084411817969328125656926899457609130167051788011178598791027428244645758351900112623945543014980252539551744
+99999999999999926244211122435874988985291364022870835895660198026268224087667591790522792799935051725787428951685205754489270499428632351279379918495257505223505226338851255072206945321576956278656608039592704406906303898336741140987904 99999999999999931186235550175255608646231837880969596760529543766528892283620970800236995932032426561066790693337700453560535121425626362995149433782441663569973131191006941326100105416330167280762734901823877923481682986297169281024
+99999999999999929678212096225067465275407716143698317730906554837786494102684339719558490519152427611330116881884882071101074945341972190277308907403380897537393781938977720492054992564559758894977208190720194118995253024599530065721556992 99999999999999926244211122435874988985291364022870835895660198026268224087667591790522792799935051725787428951685205754489270499428632351279379918495257505223505226338851255072206945321576956278656608039592704406906303898336741140987904
+99999999999999934027464697975758399456742447587676871566873309064753633557492919833469807883112792522366919110954619485992994007787162184258685917355227282413257687305369471221698329872724925324405572508442926352243067328514674943868432023552 99999999999999929678212096225067465275407716143698317730906554837786494102684339719558490519152427611330116881884882071101074945341972190277308907403380897537393781938977720492054992564559758894977208190720194118995253024599530065721556992
+99999999999999931658510089362616103392015444928828978413665885485809829939554629388445771191253529932525597045759188042988033837604250187536914609806987549374489262254739070824275575934660494247950974071555650923069789750211957733643751155302400 99999999999999934027464697975758399456742447587676871566873309064753633557492919833469807883112792522366919110954619485992994007787162184258685917355227282413257687305369471221698329872724925324405572508442926352243067328514674943868432023552
+99999999999999930008959616293112859796224738437420013453224492299319680604311838985766633961978088205967287665322305220594819971902484905979610812934997258464934032523484110419542163912507469600794108087982303296227853106888209685820101373122838528 99999999999999931658510089362616103392015444928828978413665885485809829939554629388445771191253529932525597045759188042988033837604250187536914609806987549374489262254739070824275575934660494247950974071555650923069789750211957733643751155302400
+99999999999999928518542247684432282053204429513417560406613915867290933910821882480757719383056277328324015189821686388126598502656654628054893970584775442678418248483950216783265386932491560272539433881647796263975373880920399684962968393459422986240 99999999999999930008959616293112859796224738437420013453224492299319680604311838985766633961978088205967287665322305220594819971902484905979610812934997258464934032523484110419542163912507469600794108087982303296227853106888209685820101373122838528
+99999999999999928518542247684432282053204429513417560406613915867290933910821882480757719383056277328324015189821686388126598502656654628054893970584775442678418248483950216783265386932491560272539433881647796263975373880920399684962968393459422986240000 99999999999999928518542247684432282053204429513417560406613915867290933910821882480757719383056277328324015189821686388126598502656654628054893970584775442678418248483950216783265386932491560272539433881647796263975373880920399684962968393459422986240
+99999999999999922996592795455802961330827165322375947146110930199429488582670882113664381815329718099637973843065789366637766292469752383803230100767176235502514017647481584860713016397448254045302728360926807035301219893389307418875317674924228479494914048 99999999999999928518542247684432282053204429513417560406613915867290933910821882480757719383056277328324015189821686388126598502656654628054893970584775442678418248483950216783265386932491560272539433881647796263975373880920399684962968393459422986240000
+99999999999999924596916259346967987109991595095477818460852927555247447077772756937033318891561415264781702052238819144940944834893730090816542497755823854789719470206880795923550835480811748076441516979762172970252823766002091894481097203918579189374244618240 99999999999999922996592795455802961330827165322375947146110930199429488582670882113664381815329718099637973843065789366637766292469752383803230100767176235502514017647481584860713016397448254045302728360926807035301219893389307418875317674924228479494914048
+99999999999999917714245105843845444238961215527321290310410545327345571182038613696688194314104132096931555770227452674414634559636686768493688540787048173759306259839416668984497943167082032947319814887875031157212965830669028421795760605619675656325219701751808 99999999999999924596916259346967987109991595095477818460852927555247447077772756937033318891561415264781702052238819144940944834893730090816542497755823854789719470206880795923550835480811748076441516979762172970252823766002091894481097203918579189374244618240
+99999999999999917154891513686131358215156841822734601038501577120887513966385299198425225459555222734718972453340179716809956645203098485790624854125458785078739344965108473271355866839363046574921352749613726933677028169892754057031491980488082226337743391078481920 99999999999999917714245105843845444238961215527321290310410545327345571182038613696688194314104132096931555770227452674414634559636686768493688540787048173759306259839416668984497943167082032947319814887875031157212965830669028421795760605619675656325219701751808
+99999999999999916696669050990531978944456298883937185186953750366157073495322103961448201373908756185194424200146125709940204497699102964600275082012284757871618928300075199343149877911695652938652532565950066513756388038184830097416603122780280888492002797374893195264 99999999999999917154891513686131358215156841822734601038501577120887513966385299198425225459555222734718972453340179716809956645203098485790624854125458785078739344965108473271355866839363046574921352749613726933677028169892754057031491980488082226337743391078481920
+99999999999999916462059150090385096757857620899272908270961263067735087974137748000115965042057765311837855494510770058422891398177057257750815998690339655941573274967578163091908411580729947396882896631914272378757020290750373030093780027633886603514983613398655768199168 99999999999999916696669050990531978944456298883937185186953750366157073495322103961448201373908756185194424200146125709940204497699102964600275082012284757871618928300075199343149877911695652938652532565950066513756388038184830097416603122780280888492002797374893195264
+99999999999999919104705073829639577707705129718531323452700639997160332884758333548562275084027326509326245394787416117113906151193380099703123113228729284081607514104824779425892288332727654619376075792893457515389898597852097436418059371362871829496127701706994146657435648 99999999999999916462059150090385096757857620899272908270961263067735087974137748000115965042057765311837855494510770058422891398177057257750815998690339655941573274967578163091908411580729947396882896631914272378757020290750373030093780027633886603514983613398655768199168
+99999999999999917628667205152005074893535757519847350463918209828579541545589890129502808820585418873201821072305623991241397547326808505070852666708377840873210208172166305720801657535975480694376249177888356289983316387049097913467480072465518626911750494564591328725835972608 99999999999999919104705073829639577707705129718531323452700639997160332884758333548562275084027326509326245394787416117113906151193380099703123113228729284081607514104824779425892288332727654619376075792893457515389898597852097436418059371362871829496127701706994146657435648
+99999999999999922666876463571664177832567214624688644932295571470668642649951510333225786999800463604506522759710141114219560248524706214749002457497844100357873012422307229300844343988889567691708990690439101806037783666590002951805457412701817558399758028277326280599029531279360 99999999999999917628667205152005074893535757519847350463918209828579541545589890129502808820585418873201821072305623991241397547326808505070852666708377840873210208172166305720801657535975480694376249177888356289983316387049097913467480072465518626911750494564591328725835972608
+99999999999999925375417760898072911572590525964251324838495241089455743403656317354747260068946471652055930386858809519532620516688696023471975785026261161456827735987182989817475292225976180861475072527586382595468665276071193500415954030812851863967710878401292590726058388421083136 99999999999999922666876463571664177832567214624688644932295571470668642649951510333225786999800463604506522759710141114219560248524706214749002457497844100357873012422307229300844343988889567691708990690439101806037783666590002951805457412701817558399758028277326280599029531279360
+99999999999999922998092370787579302987061493839926595503682273926908893827833126734714698563684604017178278892401463993497843047031616968501411767264176243829402332903954893729735214230453302102183242983667397856859617189120845681749826713430824039194924833949628446523134774381262143488 99999999999999925375417760898072911572590525964251324838495241089455743403656317354747260068946471652055930386858809519532620516688696023471975785026261161456827735987182989817475292225976180861475072527586382595468665276071193500415954030812851863967710878401292590726058388421083136
+99999999999999919617007371519321726332086870374220313783059387295731152208884588964001722200645503380907841211395461467581715090185993423654387386446988805425952870741141601516060436636820763422301529854538175117504526576569239895202445639820828910629184681840594996990087856635738954137600 99999999999999922998092370787579302987061493839926595503682273926908893827833126734714698563684604017178278892401463993497843047031616968501411767264176243829402332903954893729735214230453302102183242983667397856859617189120845681749826713430824039194924833949628446523134774381262143488
+99999999999999921555856753499711351089115518454394923972933375405513716362854438463239371366266645249770760995191543556043059505759547789211465047382796770104026930323785255803070101100113406402892899431306036605160309737430832717440175842671744517153922714665999138290318281147731771838693376 99999999999999919617007371519321726332086870374220313783059387295731152208884588964001722200645503380907841211395461467581715090185993423654387386446988805425952870741141601516060436636820763422301529854538175117504526576569239895202445639820828910629184681840594996990087856635738954137600
+99999999999999925526620287795549302591510189722592525641795303054348407750184690237678076857458743797202020712405919673211892868854187129872360096979331481764722604349039459782865893920936739227144024324526616931879353650875374817383047298110419679316586205892426819673190190548293062490532610048 99999999999999921555856753499711351089115518454394923972933375405513716362854438463239371366266645249770760995191543556043059505759547789211465047382796770104026930323785255803070101100113406402892899431306036605160309737430832717440175842671744517153922714665999138290318281147731771838693376
+99999999999999930899630601631288884967321950615787908928575328581457293010297853781604279487826109145954719575470858327758062813887390534835216941233385308743309664972926291225241001006485111871616403608610236482548322786324903784620029930384009841602978861449101533681556294240023997498278499319808 99999999999999925526620287795549302591510189722592525641795303054348407750184690237678076857458743797202020712405919673211892868854187129872360096979331481764722604349039459782865893920936739227144024324526616931879353650875374817383047298110419679316586205892426819673190190548293062490532610048
+99999999999999931494437365022402110086546949875748132981079409245215076632606597507980542351987858564022045373933398563677552329964579755017051039451347591859641897413884141538429337185469061448690967542329331230644001099265478667047129413135161876865818437588564766886374336421681562627784638845681664 99999999999999930899630601631288884967321950615787908928575328581457293010297853781604279487826109145954719575470858327758062813887390534835216941233385308743309664972926291225241001006485111871616403608610236482548322786324903784620029930384009841602978861449101533681556294240023997498278499319808
+99999999999999935453471182153651736480108544950043384274546570143186884422693595750740947975848462690678165888500066373957674548974351204547338797190104548281949236540899593223010902792786229833699265085163625873968835950197945084481903570326829823575278656372832047097643225182794316129777503529896771584 99999999999999931494437365022402110086546949875748132981079409245215076632606597507980542351987858564022045373933398563677552329964579755017051039451347591859641897413884141538429337185469061448690967542329331230644001099265478667047129413135161876865818437588564766886374336421681562627784638845681664
+99999999999999941222697076902451192049310918572154864313272869839431340328494218420806572909572715350322284890650139835338184957968282769155167357390336223856117715957990417585527301167018263517206741135275385698826195289895225377703777542160595791457125916730459689891664596620526624002220028805109925281792 99999999999999935453471182153651736480108544950043384274546570143186884422693595750740947975848462690678165888500066373957674548974351204547338797190104548281949236540899593223010902792786229833699265085163625873968835950197945084481903570326829823575278656372832047097643225182794316129777503529896771584
++Inf 99999999999999941222697076902451192049310918572154864313272869839431340328494218420806572909572715350322284890650139835338184957968282769155167357390336223856117715957990417585527301167018263517206741135275385698826195289895225377703777542160595791457125916730459689891664596620526624002220028805109925281792
++Inf +Inf
+loop terminated
diff --git a/gawk-5.0.1/test/inplace.1.in b/gawk-5.0.1/test/inplace.1.in
new file mode 100644
index 00000000000..d87f79a1a99
--- /dev/null
+++ b/gawk-5.0.1/test/inplace.1.in
@@ -0,0 +1,2 @@
+is foo replaced?
+and again foo here?
diff --git a/gawk-5.0.1/test/inplace.2.in b/gawk-5.0.1/test/inplace.2.in
new file mode 100644
index 00000000000..4644a91530d
--- /dev/null
+++ b/gawk-5.0.1/test/inplace.2.in
@@ -0,0 +1,2 @@
+another input file containing foo and foo and more foo
+but nothing to replace here
diff --git a/gawk-5.0.1/test/inplace.in b/gawk-5.0.1/test/inplace.in
new file mode 100644
index 00000000000..bf2cf9895d2
--- /dev/null
+++ b/gawk-5.0.1/test/inplace.in
@@ -0,0 +1,3 @@
+stdin start
+is foo replaced?
+stdin end
diff --git a/gawk-5.0.1/test/inplace1.1.ok b/gawk-5.0.1/test/inplace1.1.ok
new file mode 100644
index 00000000000..8faa542e4c4
--- /dev/null
+++ b/gawk-5.0.1/test/inplace1.1.ok
@@ -0,0 +1,2 @@
+is bar replaced?
+and again bar here?
diff --git a/gawk-5.0.1/test/inplace1.2.ok b/gawk-5.0.1/test/inplace1.2.ok
new file mode 100644
index 00000000000..64427be3f26
--- /dev/null
+++ b/gawk-5.0.1/test/inplace1.2.ok
@@ -0,0 +1,2 @@
+another input file containing bar and bar and more bar
+but nothing to replace here
diff --git a/gawk-5.0.1/test/inplace1.ok b/gawk-5.0.1/test/inplace1.ok
new file mode 100644
index 00000000000..753079b3a91
--- /dev/null
+++ b/gawk-5.0.1/test/inplace1.ok
@@ -0,0 +1,6 @@
+before
+gawk: inplace:53: warning: inplace::begin: disabling in-place editing for invalid FILENAME `-'
+stdin start
+is bar replaced?
+stdin end
+after
diff --git a/gawk-5.0.1/test/inplace2.1.bak.ok b/gawk-5.0.1/test/inplace2.1.bak.ok
new file mode 100644
index 00000000000..d87f79a1a99
--- /dev/null
+++ b/gawk-5.0.1/test/inplace2.1.bak.ok
@@ -0,0 +1,2 @@
+is foo replaced?
+and again foo here?
diff --git a/gawk-5.0.1/test/inplace2.1.ok b/gawk-5.0.1/test/inplace2.1.ok
new file mode 100644
index 00000000000..8faa542e4c4
--- /dev/null
+++ b/gawk-5.0.1/test/inplace2.1.ok
@@ -0,0 +1,2 @@
+is bar replaced?
+and again bar here?
diff --git a/gawk-5.0.1/test/inplace2.2.bak.ok b/gawk-5.0.1/test/inplace2.2.bak.ok
new file mode 100644
index 00000000000..4644a91530d
--- /dev/null
+++ b/gawk-5.0.1/test/inplace2.2.bak.ok
@@ -0,0 +1,2 @@
+another input file containing foo and foo and more foo
+but nothing to replace here
diff --git a/gawk-5.0.1/test/inplace2.2.ok b/gawk-5.0.1/test/inplace2.2.ok
new file mode 100644
index 00000000000..64427be3f26
--- /dev/null
+++ b/gawk-5.0.1/test/inplace2.2.ok
@@ -0,0 +1,2 @@
+another input file containing bar and bar and more bar
+but nothing to replace here
diff --git a/gawk-5.0.1/test/inplace2.ok b/gawk-5.0.1/test/inplace2.ok
new file mode 100644
index 00000000000..753079b3a91
--- /dev/null
+++ b/gawk-5.0.1/test/inplace2.ok
@@ -0,0 +1,6 @@
+before
+gawk: inplace:53: warning: inplace::begin: disabling in-place editing for invalid FILENAME `-'
+stdin start
+is bar replaced?
+stdin end
+after
diff --git a/gawk-5.0.1/test/inplace3.1.bak.ok b/gawk-5.0.1/test/inplace3.1.bak.ok
new file mode 100644
index 00000000000..8faa542e4c4
--- /dev/null
+++ b/gawk-5.0.1/test/inplace3.1.bak.ok
@@ -0,0 +1,2 @@
+is bar replaced?
+and again bar here?
diff --git a/gawk-5.0.1/test/inplace3.1.ok b/gawk-5.0.1/test/inplace3.1.ok
new file mode 100644
index 00000000000..d87f79a1a99
--- /dev/null
+++ b/gawk-5.0.1/test/inplace3.1.ok
@@ -0,0 +1,2 @@
+is foo replaced?
+and again foo here?
diff --git a/gawk-5.0.1/test/inplace3.2.bak.ok b/gawk-5.0.1/test/inplace3.2.bak.ok
new file mode 100644
index 00000000000..64427be3f26
--- /dev/null
+++ b/gawk-5.0.1/test/inplace3.2.bak.ok
@@ -0,0 +1,2 @@
+another input file containing bar and bar and more bar
+but nothing to replace here
diff --git a/gawk-5.0.1/test/inplace3.2.ok b/gawk-5.0.1/test/inplace3.2.ok
new file mode 100644
index 00000000000..4644a91530d
--- /dev/null
+++ b/gawk-5.0.1/test/inplace3.2.ok
@@ -0,0 +1,2 @@
+another input file containing foo and foo and more foo
+but nothing to replace here
diff --git a/gawk-5.0.1/test/inplace3.ok b/gawk-5.0.1/test/inplace3.ok
new file mode 100644
index 00000000000..7802a0c872f
--- /dev/null
+++ b/gawk-5.0.1/test/inplace3.ok
@@ -0,0 +1,12 @@
+before
+gawk: inplace:53: warning: inplace::begin: disabling in-place editing for invalid FILENAME `-'
+stdin start
+is bar replaced?
+stdin end
+after
+Before
+gawk: inplace:53: warning: inplace::begin: disabling in-place editing for invalid FILENAME `-'
+stdin start
+is foo replaced?
+stdin end
+After
diff --git a/gawk-5.0.1/test/inpref.awk b/gawk-5.0.1/test/inpref.awk
new file mode 100644
index 00000000000..d64ffe7f66a
--- /dev/null
+++ b/gawk-5.0.1/test/inpref.awk
@@ -0,0 +1,9 @@
+function test(x) {
+	print x
+	getline
+	print x
+}
+
+{
+	test($0)
+}
diff --git a/gawk-5.0.1/test/inpref.in b/gawk-5.0.1/test/inpref.in
new file mode 100644
index 00000000000..a32119c8aa4
--- /dev/null
+++ b/gawk-5.0.1/test/inpref.in
@@ -0,0 +1,2 @@
+hello
+goodbye
diff --git a/gawk-5.0.1/test/inpref.ok b/gawk-5.0.1/test/inpref.ok
new file mode 100644
index 00000000000..317e9677c3b
--- /dev/null
+++ b/gawk-5.0.1/test/inpref.ok
@@ -0,0 +1,2 @@
+hello
+hello
diff --git a/gawk-5.0.1/test/inputred.awk b/gawk-5.0.1/test/inputred.awk
new file mode 100644
index 00000000000..6524df626ce
--- /dev/null
+++ b/gawk-5.0.1/test/inputred.awk
@@ -0,0 +1 @@
+BEGIN { print getline < "file" ".txt" }
diff --git a/gawk-5.0.1/test/inputred.ok b/gawk-5.0.1/test/inputred.ok
new file mode 100644
index 00000000000..7de4d5d7cf6
--- /dev/null
+++ b/gawk-5.0.1/test/inputred.ok
@@ -0,0 +1 @@
+-1.txt
diff --git a/gawk-5.0.1/test/intarray.awk b/gawk-5.0.1/test/intarray.awk
new file mode 100644
index 00000000000..8785ea9e406
--- /dev/null
+++ b/gawk-5.0.1/test/intarray.awk
@@ -0,0 +1,19 @@
+BEGIN {
+	nf = split("5 |05|0x4|00| 5|-0x12| 011|-013|1.0|5.1e1|-5|-05|+2", f, "|")
+	for (i = 1; i <= nf; i++) {
+		delete g
+		g[f[i]]
+		for (x in g) {
+			if (x"" != f[i]"")
+				printf "Error in string test: [%s] != [%s]\n", x, f[i]
+		}
+
+		delete g
+		z = f[i]+0	# trigger numeric conversion
+		g[f[i]]
+		for (x in g) {
+			if (x"" != f[i]"")
+				printf "Error in strnum test: [%s] != [%s]\n", x, f[i]
+		}
+	}
+}
diff --git a/gawk-5.0.1/test/intarray.ok b/gawk-5.0.1/test/intarray.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/intest.awk b/gawk-5.0.1/test/intest.awk
new file mode 100644
index 00000000000..f030d07a41f
--- /dev/null
+++ b/gawk-5.0.1/test/intest.awk
@@ -0,0 +1,4 @@
+BEGIN {
+	bool = ((b = 1) in c);
+	print bool, b	# gawk-3.0.1 prints "0 "; should print "0 1"
+} 
diff --git a/gawk-5.0.1/test/intest.ok b/gawk-5.0.1/test/intest.ok
new file mode 100644
index 00000000000..6e8183b72e5
--- /dev/null
+++ b/gawk-5.0.1/test/intest.ok
@@ -0,0 +1 @@
+0 1
diff --git a/gawk-5.0.1/test/intformat.awk b/gawk-5.0.1/test/intformat.awk
new file mode 100644
index 00000000000..2f2352909f8
--- /dev/null
+++ b/gawk-5.0.1/test/intformat.awk
@@ -0,0 +1,88 @@
+function abs(x) {
+	return (x+0 >= 0) ? x : -x
+}
+
+function check(x,what,  f,res) {
+	for (f in formats) {
+		res = sprintf(f,x)
+		if (formats[f] == "non-decimal") {
+			if ((x >= 0) && (res !~ /e+/)) {
+				if (abs(strtonum(res)-x) > 1e-5*abs(x))
+				       printf "(sprintf(%s,%s) = %s)-%g = %g\n",
+					      f,what,res,x,strtonum(res)-x
+			}
+		}
+		else if (abs(res-x) > 1e-5*abs(x))
+			printf "(sprintf(%s,%s) = %s)-%g = %g\n",
+			       f,what,res,x,res-x
+	}
+}
+
+function check_cons(fmt,base,rot,mexp,  i,j,dig,res,s) {
+	# first off, check that zero formats properly
+	if ((s = sprintf(fmt,0)) != "0")
+		printf "(sprintf(%s,0) = %s) != 0\n",fmt,s
+
+	res = "1"
+	dig = 1
+	j = 0
+	for (i = 0; i <= mexp; i++) {
+		s = sprintf(fmt,base^i)
+		if (s ~ /e+/)
+			return
+		if (s != res)
+			printf "(sprintf(%s,%d^%d) = %s) != %s\n",
+			       fmt,base,i,s,res
+		if (++j == rot) {
+			dig = 1
+			res = ("10"substr(res,2))
+			j = 0
+		}
+		else {
+			dig *= 2
+			res = (dig substr(res,2))
+		}
+	}
+}
+
+BEGIN {
+	# this doesn't necessarily have to be exact since we're checking
+	# magnitude rather than precision
+	if (!HUGEVAL) HUGEVAL = 1.7976931348623157e+308
+
+	formats["%s"] = ""
+	formats["%d"] = ""
+	formats["%.0f"] = ""
+	formats["0%o"] = "non-decimal"
+	formats["0x%x"] = "non-decimal"
+
+	check(0,"0")
+	limit = HUGEVAL / 10
+	value = 1
+	for (i = 0; ; i++) {
+		check(10^i,"10^"i)
+		check(-10^i,"-10^"i)
+		#[probably should test value against 10^i here]
+		if (value >= limit) break
+		value *= 10
+	}
+	limit = HUGEVAL / 2
+	value = 1
+	for (i = 0; ; i++) {
+		check(2^i,"2^"i)
+		check(-2^i,"-2^"i)
+		#[probably should test value against 2^i here]
+		if (value >= limit) break
+		value *= 2
+	}
+
+	check_cons("%d",10,1,9)
+	check_cons("%x",2,4,31)
+	check_cons("%o",2,3,31)
+
+	# make sure basic %d and %x are working properly
+	printf "%d %d %x\n",3.7,-3.7,23.7
+
+	# check another problem in gawk 3.1.5: precision over 30 crashes
+	printf "%.55d\n",1
+}
diff --git a/gawk-5.0.1/test/intformat.ok b/gawk-5.0.1/test/intformat.ok
new file mode 100644
index 00000000000..868f9f11ca2
--- /dev/null
+++ b/gawk-5.0.1/test/intformat.ok
@@ -0,0 +1,2 @@
+3 -3 17
+0000000000000000000000000000000000000000000000000000001
diff --git a/gawk-5.0.1/test/intprec.awk b/gawk-5.0.1/test/intprec.awk
new file mode 100644
index 00000000000..978e9eacc63
--- /dev/null
+++ b/gawk-5.0.1/test/intprec.awk
@@ -0,0 +1 @@
+BEGIN { printf "%.10d:%.10x\n", 5, 14 }
diff --git a/gawk-5.0.1/test/intprec.ok b/gawk-5.0.1/test/intprec.ok
new file mode 100644
index 00000000000..8783fac1fab
--- /dev/null
+++ b/gawk-5.0.1/test/intprec.ok
@@ -0,0 +1 @@
+0000000005:000000000e
diff --git a/gawk-5.0.1/test/iobug1.awk b/gawk-5.0.1/test/iobug1.awk
new file mode 100644
index 00000000000..5606d022e98
--- /dev/null
+++ b/gawk-5.0.1/test/iobug1.awk
@@ -0,0 +1,53 @@
+# From arnold@f7.net  Fri Nov 26 11:53:12 2004
+# X-Envelope-From: james@nocrew.org
+# X-Envelope-To: <arnold@skeeve.com>
+# To: bug-gawk@gnu.org
+# Subject: gawk 3.1.4: reproducible hang, regression from 3.1.3
+# From: James Troup <james@nocrew.org>
+# Date: Fri, 26 Nov 2004 03:14:05 +0000
+# Message-ID: <877jo9qp36.fsf@shiri.gloaming.local>
+# User-Agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux)
+# MIME-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# 
+# 
+# Hi,
+# 
+# A Debian user reported[0] gawk 3.1.4 broke a (relatively) complex
+# program that makes extensive use of awk, called 'apt-move'.  I finally
+# managed to reduced the problem down to a 3 line test case, enclosed
+# below[1].
+# 
+# I believe the problem comes from the following code, introduced in
+# 3.1.4:
+# 
+# [io.c, line 560]
+# | 	for (rp = red_head; rp != NULL; rp = rp->next) {
+# | 		if ((rp->flag & RED_EOF) && tree->type == Node_redirect_pipein) {
+# | 			if (rp->pid != -1)
+# | 				wait_any(0);
+# | 		}
+# 
+# The problem is that, if we have an existing redirect which is a simple
+# file redirect[b] and it's hit EOF and we try to create a new '|'
+# redirect[c], this new code will try to wait(2) and if there are any
+# other redirects which _did_ spawn a child (like [a]) the wait() will
+# hang indefinitely waiting for it to exit.
+# 
+# Hope that makes sense :)
+# 
+# -- 
+# James
+# 
+# [0] http://bugs.debian.org/263964
+# 
+# [1] 
+# ================================================================================
+#!/usr/bin/gawk -f
+
+BEGIN {
+	printf "" | "cat"             # [a]
+	getline line < "/dev/null"    # [b]
+	"true" | getline line         # [c]
+}
+# ================================================================================
diff --git a/gawk-5.0.1/test/iobug1.ok b/gawk-5.0.1/test/iobug1.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/isarrayunset.awk b/gawk-5.0.1/test/isarrayunset.awk
new file mode 100644
index 00000000000..8b54cdcacf9
--- /dev/null
+++ b/gawk-5.0.1/test/isarrayunset.awk
@@ -0,0 +1 @@
+BEGIN { print isarray(a) }
diff --git a/gawk-5.0.1/test/isarrayunset.ok b/gawk-5.0.1/test/isarrayunset.ok
new file mode 100644
index 00000000000..573541ac970
--- /dev/null
+++ b/gawk-5.0.1/test/isarrayunset.ok
@@ -0,0 +1 @@
+0
diff --git a/gawk-5.0.1/test/jarebug.awk b/gawk-5.0.1/test/jarebug.awk
new file mode 100644
index 00000000000..906d18464e6
--- /dev/null
+++ b/gawk-5.0.1/test/jarebug.awk
@@ -0,0 +1 @@
+/.*/ { gsub ("��", "ERROR"); print; }
diff --git a/gawk-5.0.1/test/jarebug.in b/gawk-5.0.1/test/jarebug.in
new file mode 100644
index 00000000000..6ce66826468
--- /dev/null
+++ b/gawk-5.0.1/test/jarebug.in
@@ -0,0 +1,4 @@
+aa��a����
+aaa��a����
+aaaa��a����
+aaaaa��a����
diff --git a/gawk-5.0.1/test/jarebug.ok b/gawk-5.0.1/test/jarebug.ok
new file mode 100644
index 00000000000..6ce66826468
--- /dev/null
+++ b/gawk-5.0.1/test/jarebug.ok
@@ -0,0 +1,4 @@
+aa��a����
+aaa��a����
+aaaa��a����
+aaaaa��a����
diff --git a/gawk-5.0.1/test/jarebug.sh b/gawk-5.0.1/test/jarebug.sh
new file mode 100755
index 00000000000..6dc728a6383
--- /dev/null
+++ b/gawk-5.0.1/test/jarebug.sh
@@ -0,0 +1,21 @@
+#! /bin/sh
+
+awk=$1
+prog=$2
+infile=$3
+out=$4
+
+# GLIBC gives us ja_JP.EUC-JP but Mac OS X uses ja_JP.eucJP
+
+cp $infile $out	# set up default
+
+for locale in ja_JP.EUC-JP ja_JP.eucJP
+do
+	if locale -a 2>/dev/null | grep $locale > /dev/null
+	then
+		LANG=$locale
+		LC_ALL=$locale
+		export LANG LC_ALL
+		$awk -f $prog $infile  >$out 2>&1 || echo EXIT CODE: $? >> $out
+	fi
+done
diff --git a/gawk-5.0.1/test/lc_num1.awk b/gawk-5.0.1/test/lc_num1.awk
new file mode 100644
index 00000000000..c9b98ecfb51
--- /dev/null
+++ b/gawk-5.0.1/test/lc_num1.awk
@@ -0,0 +1,19 @@
+# Bug reported by Ulrich Drepper.
+# BEGIN {
+#   printf("%'d %d\n", 1000000, 1000000)
+# }
+
+# April 2010:
+# This needs to be a smarter test so that systems without the %'d flag
+# don't generate a needless failure.
+
+BEGIN {
+	s = sprintf("%'d", 1234)
+	if (s == "1,234" || s == "1234")
+		print "ok, or at least the quote flag isn't supported"
+	else {
+		command = "od -c"
+		print("fail:", s) | command
+		close(command)
+	}
+}
diff --git a/gawk-5.0.1/test/lc_num1.ok b/gawk-5.0.1/test/lc_num1.ok
new file mode 100644
index 00000000000..36a9eae3187
--- /dev/null
+++ b/gawk-5.0.1/test/lc_num1.ok
@@ -0,0 +1 @@
+ok, or at least the quote flag isn't supported
diff --git a/gawk-5.0.1/test/leaddig.awk b/gawk-5.0.1/test/leaddig.awk
new file mode 100644
index 00000000000..1e6ca51854a
--- /dev/null
+++ b/gawk-5.0.1/test/leaddig.awk
@@ -0,0 +1,12 @@
+# check that values with leading digits get converted the
+# right way, based on a note in comp.lang.awk.
+#
+# run with gawk -v x=2E -f leaddig.awk
+
+BEGIN {
+	# 4/2018: Put it into the program to make generation of the
+	# recipe automatable
+	x = "2E"
+
+	print "x =", x, (x == 2), (x == 2E0), (x == 2E), (x == 2D)
+}
diff --git a/gawk-5.0.1/test/leaddig.ok b/gawk-5.0.1/test/leaddig.ok
new file mode 100644
index 00000000000..7a9d866ede4
--- /dev/null
+++ b/gawk-5.0.1/test/leaddig.ok
@@ -0,0 +1 @@
+x = 2E 0 0 0 0
diff --git a/gawk-5.0.1/test/leadnl.awk b/gawk-5.0.1/test/leadnl.awk
new file mode 100644
index 00000000000..0b7d0a97712
--- /dev/null
+++ b/gawk-5.0.1/test/leadnl.awk
@@ -0,0 +1,10 @@
+BEGIN {
+    RS = ""; FS = "\n"
+}
+
+{
+    print "Name is: ", $1
+    print "Address is: ", $2
+    print "City and State are: ", $3
+    print ""
+}
diff --git a/gawk-5.0.1/test/leadnl.in b/gawk-5.0.1/test/leadnl.in
new file mode 100644
index 00000000000..67c0239b04e
--- /dev/null
+++ b/gawk-5.0.1/test/leadnl.in
@@ -0,0 +1,9 @@
+
+Jane Doe
+123 Main Street
+Anywhere, SE 12345-6789
+
+John Smith
+456 Tree-lined Avenue
+Smallville, MW 98765-4321
+
diff --git a/gawk-5.0.1/test/leadnl.ok b/gawk-5.0.1/test/leadnl.ok
new file mode 100644
index 00000000000..19cb29920aa
--- /dev/null
+++ b/gawk-5.0.1/test/leadnl.ok
@@ -0,0 +1,8 @@
+Name is:  Jane Doe
+Address is:  123 Main Street
+City and State are:  Anywhere, SE 12345-6789
+
+Name is:  John Smith
+Address is:  456 Tree-lined Avenue
+City and State are:  Smallville, MW 98765-4321
+
diff --git a/gawk-5.0.1/test/lib/awkpath.awk b/gawk-5.0.1/test/lib/awkpath.awk
new file mode 100644
index 00000000000..6663ca4b379
--- /dev/null
+++ b/gawk-5.0.1/test/lib/awkpath.awk
@@ -0,0 +1 @@
+BEGIN { print "Found it." }
diff --git a/gawk-5.0.1/test/lint.awk b/gawk-5.0.1/test/lint.awk
new file mode 100644
index 00000000000..ea7b8e3834a
--- /dev/null
+++ b/gawk-5.0.1/test/lint.awk
@@ -0,0 +1,14 @@
+# lint.awk --- test lint variable
+
+BEGIN {
+	a[1] = 1
+	LINT = 1
+	delete a[2]
+	LINT = ""
+	delete a[3]
+	LINT = "true"
+	delete a[4]
+	LINT = 0
+	delete a[5]
+	print "done"
+}
diff --git a/gawk-5.0.1/test/lint.ok b/gawk-5.0.1/test/lint.ok
new file mode 100644
index 00000000000..fb6e3dfc06f
--- /dev/null
+++ b/gawk-5.0.1/test/lint.ok
@@ -0,0 +1,5 @@
+gawk: lint.awk:6: warning: delete: index `2' not in array `a'
+gawk: lint.awk:7: warning: turning off `--lint' due to assignment to `LINT'
+gawk: lint.awk:10: warning: delete: index `4' not in array `a'
+gawk: lint.awk:11: warning: turning off `--lint' due to assignment to `LINT'
+done
diff --git a/gawk-5.0.1/test/lintexp.awk b/gawk-5.0.1/test/lintexp.awk
new file mode 100644
index 00000000000..082d7447e92
--- /dev/null
+++ b/gawk-5.0.1/test/lintexp.awk
@@ -0,0 +1,9 @@
+BEGIN {
+	split("0|0a", f, "|")
+	z = exp(f[1])	# no warning, since strnum converted to number
+	x = f[2]+0	# trigger NUMCUR
+	z = exp(f[2])	# should print a warning
+	x = "0"
+	y = x+0		# trigger NUMCUR
+	z = exp(x)	# should print a warning, since x is still a string!
+}
diff --git a/gawk-5.0.1/test/lintexp.ok b/gawk-5.0.1/test/lintexp.ok
new file mode 100644
index 00000000000..33122f6d8ab
--- /dev/null
+++ b/gawk-5.0.1/test/lintexp.ok
@@ -0,0 +1,2 @@
+gawk: lintexp.awk:5: warning: exp: received non-numeric argument
+gawk: lintexp.awk:8: warning: exp: received non-numeric argument
diff --git a/gawk-5.0.1/test/lintindex.awk b/gawk-5.0.1/test/lintindex.awk
new file mode 100644
index 00000000000..8e6d7e56f03
--- /dev/null
+++ b/gawk-5.0.1/test/lintindex.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	x = 537
+	y = 3
+	z = index(x, y)	# should print lint warning
+	# now that STRCUR has been trigged on x and y, check that we still
+	# get the warning
+	z = index(x, y)	# should print lint warning
+	if (z != 2)
+		print "oops"
+}
diff --git a/gawk-5.0.1/test/lintindex.ok b/gawk-5.0.1/test/lintindex.ok
new file mode 100644
index 00000000000..b89db6a5356
--- /dev/null
+++ b/gawk-5.0.1/test/lintindex.ok
@@ -0,0 +1,4 @@
+gawk: lintindex.awk:4: warning: index: received non-string first argument
+gawk: lintindex.awk:4: warning: index: received non-string second argument
+gawk: lintindex.awk:7: warning: index: received non-string first argument
+gawk: lintindex.awk:7: warning: index: received non-string second argument
diff --git a/gawk-5.0.1/test/lintint.awk b/gawk-5.0.1/test/lintint.awk
new file mode 100644
index 00000000000..f4f687b0bf2
--- /dev/null
+++ b/gawk-5.0.1/test/lintint.awk
@@ -0,0 +1,9 @@
+BEGIN {
+	split("0|0a", f, "|")
+	z = int(f[1])	# no warning, since strnum converted to number
+	x = f[2]+0	# trigger NUMCUR
+	z = int(f[2])	# should print a warning
+	x = "0"
+	y = x+0		# trigger NUMCUR
+	z = int(x)	# should print a warning, since x is still a string!
+}
diff --git a/gawk-5.0.1/test/lintint.ok b/gawk-5.0.1/test/lintint.ok
new file mode 100644
index 00000000000..5bd5d5895a5
--- /dev/null
+++ b/gawk-5.0.1/test/lintint.ok
@@ -0,0 +1,2 @@
+gawk: lintint.awk:5: warning: int: received non-numeric argument
+gawk: lintint.awk:8: warning: int: received non-numeric argument
diff --git a/gawk-5.0.1/test/lintlength.awk b/gawk-5.0.1/test/lintlength.awk
new file mode 100644
index 00000000000..ad21791223c
--- /dev/null
+++ b/gawk-5.0.1/test/lintlength.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	x = 5
+	z =  length(x)	# should issue a warning
+	y = (x "")	# trigger STRCUR
+	z = length(x)	# should still issue a warning
+}
diff --git a/gawk-5.0.1/test/lintlength.ok b/gawk-5.0.1/test/lintlength.ok
new file mode 100644
index 00000000000..cb369f7f35b
--- /dev/null
+++ b/gawk-5.0.1/test/lintlength.ok
@@ -0,0 +1,2 @@
+gawk: lintlength.awk:3: warning: length: received non-string argument
+gawk: lintlength.awk:5: warning: length: received non-string argument
diff --git a/gawk-5.0.1/test/lintold.awk b/gawk-5.0.1/test/lintold.awk
new file mode 100644
index 00000000000..d312fc6675e
--- /dev/null
+++ b/gawk-5.0.1/test/lintold.awk
@@ -0,0 +1,21 @@
+# lintold.awk --- test --lint-old
+
+BEGIN {
+	a[1] = 1
+	for (i in a)
+	  print a[i]
+	delete a[1]
+	if (2 in a)
+	  a[2] **= 2;
+	if ((2,3) in a)
+	  a[2,3] ^= 2 ** 3 ^ 4;
+}
+BEGIN {
+	FS = "ab"
+	foo = "\b\f\r"
+}
+END {
+}
+END {
+        print "done"
+}
diff --git a/gawk-5.0.1/test/lintold.in b/gawk-5.0.1/test/lintold.in
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/gawk-5.0.1/test/lintold.in
@@ -0,0 +1 @@
+
diff --git a/gawk-5.0.1/test/lintold.ok b/gawk-5.0.1/test/lintold.ok
new file mode 100644
index 00000000000..e3867e4e5c0
--- /dev/null
+++ b/gawk-5.0.1/test/lintold.ok
@@ -0,0 +1,16 @@
+gawk: lintold.awk:7: warning: `delete' is not supported in old awk
+gawk: lintold.awk:8: warning: old awk does not support the keyword `in' except after `for'
+gawk: lintold.awk:9: warning: old awk does not support operator `**='
+gawk: lintold.awk:10: warning: old awk does not support the keyword `in' except after `for'
+gawk: lintold.awk:10: warning: old awk does not support multidimensional arrays
+gawk: lintold.awk:11: warning: operator `^=' is not supported in old awk
+gawk: lintold.awk:11: warning: old awk does not support operator `**'
+gawk: lintold.awk:11: warning: operator `^' is not supported in old awk
+gawk: lintold.awk:13: warning: old awk does not support multiple `BEGIN' or `END' rules
+gawk: lintold.awk:15: warning: old awk does not support the `\b' escape sequence
+gawk: lintold.awk:15: warning: old awk does not support the `\f' escape sequence
+gawk: lintold.awk:15: warning: old awk does not support the `\r' escape sequence
+gawk: lintold.awk:19: warning: old awk does not support multiple `BEGIN' or `END' rules
+1
+gawk: lintold.awk:14: warning: old awk does not support regexps as value of `FS'
+done
diff --git a/gawk-5.0.1/test/lintset.awk b/gawk-5.0.1/test/lintset.awk
new file mode 100644
index 00000000000..8d52eeb431f
--- /dev/null
+++ b/gawk-5.0.1/test/lintset.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	split("0a", f)	# set f[0] to a strnum that is really a string
+	LINT = f[1]	# lint should be enabled
+	x = exp("0")	# should generate a warning
+}
diff --git a/gawk-5.0.1/test/lintset.ok b/gawk-5.0.1/test/lintset.ok
new file mode 100644
index 00000000000..7d67c614586
--- /dev/null
+++ b/gawk-5.0.1/test/lintset.ok
@@ -0,0 +1 @@
+gawk: lintset.awk:4: warning: exp: received non-numeric argument
diff --git a/gawk-5.0.1/test/lintwarn.awk b/gawk-5.0.1/test/lintwarn.awk
new file mode 100644
index 00000000000..d430a2b4203
--- /dev/null
+++ b/gawk-5.0.1/test/lintwarn.awk
@@ -0,0 +1,43 @@
+# gawk --lint -f lintwarn.awk
+BEGINFILE {
+	getline var
+	getline
+}
+
+BEGIN {
+        PROCINFO["sorted_in"]
+	print
+	nextfile
+	delete a
+	delete(a)
+	y = /a/
+	y == /a/
+	/b/ ~ x
+	length
+	switch(s) {
+	case 1:
+	default:
+	case 1:
+	default:
+	}
+	break
+	continue
+	next
+	a[]
+	f(/pqr/)
+	//
+	/* */
+}
+END {
+	getline
+}
+function zz(aa, aa)
+{
+	return aa
+}
+@include ""
+BEGIN {
+	print "foo" > "foo" 1	# should warn
+	print "foo" > ("foo" 1)	# should not warn
+	system("rm -f foo1 foo2")
+}
diff --git a/gawk-5.0.1/test/lintwarn.ok b/gawk-5.0.1/test/lintwarn.ok
new file mode 100644
index 00000000000..d0993ea736b
--- /dev/null
+++ b/gawk-5.0.1/test/lintwarn.ok
@@ -0,0 +1,39 @@
+gawk: lintwarn.awk:2: warning: `BEGINFILE' is a gawk extension
+gawk: lintwarn.awk:3: error: non-redirected `getline' invalid inside `BEGINFILE' rule
+gawk: lintwarn.awk:4: error: non-redirected `getline' invalid inside `BEGINFILE' rule
+gawk: lintwarn.awk:8: warning: statement may have no effect
+gawk: lintwarn.awk:9: warning: plain `print' in BEGIN or END rule should probably be `print ""'
+gawk: lintwarn.awk:10: error: `nextfile' used in BEGIN action
+gawk: lintwarn.awk:12: warning: `delete(array)' is a non-portable tawk extension
+gawk: lintwarn.awk:13: warning: regular expression on right of assignment
+gawk: lintwarn.awk:14: warning: regular expression on right of comparison
+gawk: lintwarn.awk:14: warning: statement may have no effect
+gawk: lintwarn.awk:15: warning: regular expression on left of `~' or `!~' operator
+gawk: lintwarn.awk:15: warning: statement may have no effect
+gawk: lintwarn.awk:16: warning: call of `length' without parentheses is not portable
+gawk: lintwarn.awk:17: warning: `switch' is a gawk extension
+gawk: lintwarn.awk:18: warning: `case' is a gawk extension
+gawk: lintwarn.awk:19: warning: `default' is a gawk extension
+gawk: lintwarn.awk:19: error: duplicate `default' detected in switch body
+gawk: lintwarn.awk:18: error: duplicate case values in switch body: 1
+gawk: lintwarn.awk:24: error: `continue' is not allowed outside a loop
+gawk: lintwarn.awk:23: error: `break' is not allowed outside a loop or switch
+gawk: lintwarn.awk:24: error: `continue' is not allowed outside a loop
+gawk: lintwarn.awk:25: error: `next' used in BEGIN action
+gawk: lintwarn.awk:26: 	a[]
+gawk: lintwarn.awk:26: 	  ^ syntax error
+gawk: lintwarn.awk:26: error: invalid subscript expression
+gawk: lintwarn.awk:26: warning: statement may have no effect
+gawk: lintwarn.awk:27: warning: regexp constant for parameter #1 yields boolean value
+gawk: lintwarn.awk:28: warning: regexp constant `//' looks like a C++ comment, but is not
+gawk: lintwarn.awk:28: warning: statement may have no effect
+gawk: lintwarn.awk:29: warning: regexp constant `/* */' looks like a C comment, but is not
+gawk: lintwarn.awk:29: warning: statement may have no effect
+gawk: lintwarn.awk:32: warning: non-redirected `getline' undefined inside END action
+gawk: lintwarn.awk:34: error: function `zz': parameter #2, `aa', duplicates parameter #1
+gawk: lintwarn.awk:38: warning: `include' is a gawk extension
+gawk: lintwarn.awk:38: warning: empty filename after @include
+gawk: lintwarn.awk:41: warning: concatenation as I/O `>' redirection target is ambiguous
+gawk: warning: function `f' called but never defined
+gawk: warning: function `zz' defined but never called directly
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/litoct.awk b/gawk-5.0.1/test/litoct.awk
new file mode 100644
index 00000000000..5cfc1284463
--- /dev/null
+++ b/gawk-5.0.1/test/litoct.awk
@@ -0,0 +1 @@
+{ if (/a\52b/) print "match" ; else print "no match" }
diff --git a/gawk-5.0.1/test/litoct.in b/gawk-5.0.1/test/litoct.in
new file mode 100644
index 00000000000..81bf3969561
--- /dev/null
+++ b/gawk-5.0.1/test/litoct.in
@@ -0,0 +1 @@
+ab
diff --git a/gawk-5.0.1/test/litoct.ok b/gawk-5.0.1/test/litoct.ok
new file mode 100644
index 00000000000..4c0be978325
--- /dev/null
+++ b/gawk-5.0.1/test/litoct.ok
@@ -0,0 +1 @@
+no match
diff --git a/gawk-5.0.1/test/localenl.ok b/gawk-5.0.1/test/localenl.ok
new file mode 100644
index 00000000000..47a0748f26a
--- /dev/null
+++ b/gawk-5.0.1/test/localenl.ok
@@ -0,0 +1,4 @@
+LC_ALL=C passed
+LC_ALL=POSIX passed
+LC_ALL=en_US.ISO-8859-1 passed
+LC_ALL=en_US.UTF-8 passed
diff --git a/gawk-5.0.1/test/localenl.sh b/gawk-5.0.1/test/localenl.sh
new file mode 100755
index 00000000000..ca3ee64ec2a
--- /dev/null
+++ b/gawk-5.0.1/test/localenl.sh
@@ -0,0 +1,75 @@
+#! /bin/sh
+# From arnold@f7.net  Sun Apr 22 20:15:25 2007
+# Date: Thu, 19 Apr 2007 17:09:02 +0300
+# From: Pekka Pessi <Pekka.Pessi@nokia.com>
+# X-Face: #V(jdpv[lI!TNUU=2*oh:="#suS*ponXW"yr6G;~L}<xZn_2^0)V{jqdc4y}@2b]ffd}SY#
+#  :9||1pew85O,WjiYA"6C7bW^zt^+.{b#B{lEE+4$9lrXL(55g}dU>uZ\JfD\"IG#G{j`hZI;=DmT\H
+#  pfDMyJ`i=:M;BM3R.`[>P^ER8+]i
+# Subject: UTF-8 locale and \n in regexps
+# To: bug-gawk@gnu.org
+# Cc: Pekka.Pessi@nokia.com
+# Message-id: <pvlkgoh2wx.fsf@nokia.com>
+# MIME-version: 1.0
+# Content-type: multipart/mixed; boundary="=-=-="
+# 
+# --=-=-=
+# 
+# Hello,
+# 
+# It looks like regexp with \n in [^] behaves badly if locale has
+# an UTF-8 ctype.
+# 
+# It looks like if there is \n and an range without \n, like /\n[^x\n]foo/,
+# and first \n ends an even-numbered line within the string, regexp
+# does not match.
+# 
+# Please see the attached script for an demonstration.
+# 
+# --Pekka Pessi
+# 
+# 
+# --=-=-=
+# Content-Disposition: inline; filename=gawk-test
+# 
+#! /bin/sh
+
+AWK=${AWK:-../gawk}
+
+# April 2010: Remove UNKNOWN, causes spurious failures on some systems
+for LC_ALL in C POSIX en_US.ISO-8859-1 en_US.UTF-8 #UNKNOWN 
+do
+export LC_ALL
+cat <<EOF |
+line1
+line2
+line3
+line4 
+line5
+line6
+line7
+line8
+line9
+EOF
+$AWK --posix '
+BEGIN { RS="\0"; }
+{ 
+  if (match($0, /\n[^2\n]*2/)) { got2=1; } else { print "no match 2"; }
+  if (match($0, /\n[^3\n]*3/)) { got3=1; } else { print "no match 3"; }
+  if (match($0, /\n[^4\n]*4/)) { got4=1; } else { print "no match 4"; }
+  if (match($0, /\n[^5\t]*5/)) { got5=1; } else { print "no match 5"; }
+  if (match($0, /\n[^6\n]*6/)) { got6=1; } else { print "no match 6"; }
+  if (match($0, /\n[a-z]*7\n/)){ got7=1; } else { print "no match 7"; }
+  if (match($0, /\n[^8\n]*8/)) { got8=1; } else { print "no match 8"; }
+  if (match($0, /8.[^9\n]+9/)) { got9=1; } else { print "no match 9"; }
+}
+
+END { exit(!(got2 && got3 && got4 && got5 && got6 && got7 && got8 && got9)); }
+' || { 
+  echo LC_ALL=$LC_ALL FAILED
+  exit 1
+}
+echo LC_ALL=$LC_ALL passed
+done
+# 
+# --=-=-=--
+# 
diff --git a/gawk-5.0.1/test/longsub.awk b/gawk-5.0.1/test/longsub.awk
new file mode 100644
index 00000000000..07a4a85f0df
--- /dev/null
+++ b/gawk-5.0.1/test/longsub.awk
@@ -0,0 +1 @@
+{sub( "^.*AA", "BB"); print}
diff --git a/gawk-5.0.1/test/longsub.in b/gawk-5.0.1/test/longsub.in
new file mode 100644
index 00000000000..ab95ee1fb6e
--- /dev/null
+++ b/gawk-5.0.1/test/longsub.in
@@ -0,0 +1 @@
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
diff --git a/gawk-5.0.1/test/longsub.ok b/gawk-5.0.1/test/longsub.ok
new file mode 100644
index 00000000000..a85633e2812
--- /dev/null
+++ b/gawk-5.0.1/test/longsub.ok
@@ -0,0 +1 @@
+BB000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
diff --git a/gawk-5.0.1/test/longwrds.awk b/gawk-5.0.1/test/longwrds.awk
new file mode 100644
index 00000000000..77654bb0c4c
--- /dev/null
+++ b/gawk-5.0.1/test/longwrds.awk
@@ -0,0 +1,27 @@
+# From Gawk Manual modified by bug fix and removal of punctuation
+
+# Invoker can customize sort command if necessary.
+BEGIN {
+	if (!SORT) SORT = "LC_ALL=C sort"
+}
+
+# Record every word which is used at least once
+{
+	for (i = 1; i <= NF; i++) {
+		tmp = tolower($i)
+		if (0 != (pos = match(tmp, /([[:lower:]]|-)+/)))
+			used[substr(tmp, pos, RLENGTH)] = 1
+	}
+}
+
+#Find a number of distinct words longer than 10 characters
+END {
+	num_long_words = 0
+	for (x in used) 
+		if (length(x) > 10) {
+			++num_long_words
+			print x | SORT
+		}
+	print(num_long_words, "long words") | SORT
+	close(SORT)
+}
diff --git a/gawk-5.0.1/test/longwrds.in b/gawk-5.0.1/test/longwrds.in
new file mode 100644
index 00000000000..09c39485c63
--- /dev/null
+++ b/gawk-5.0.1/test/longwrds.in
@@ -0,0 +1,200 @@
+.ds PX \s-1POSIX\s+1
+.ds UX \s-1UNIX\s+1
+.ds AN \s-1ANSI\s+1
+.TH GAWK 1 "May 28 1991" "Free Software Foundation" "Utility Commands"
+.SH NAME
+gawk \- pattern scanning and processing language
+.SH SYNOPSIS
+.B gawk
+[
+.B \-W
+.I gawk-options
+] [
+.BI \-F\^ fs
+] [
+.B \-v
+.IR var = val
+]
+.B \-f
+.I program-file
+[
+.B \-\^\-
+] file .\^.\^.
+.br
+.B gawk
+[
+.B \-W
+.I gawk-options
+] [
+.BI \-F\^ fs
+] [
+.B \-v
+.IR var = val
+] [
+.B \-\^\-
+]
+.I program-text
+file .\^.\^.
+.SH DESCRIPTION
+.I Gawk
+is the GNU Project's implementation of the AWK programming language.
+It conforms to the definition of the language in
+the \*(PX 1003.2 Command Language And Utilities Standard
+(draft 11).
+This version in turn is based on the description in
+.IR "The AWK Programming Language" ,
+by Aho, Kernighan, and Weinberger,
+with the additional features defined in the System V Release 4 version
+of \*(UX
+.IR awk .
+.I Gawk
+also provides some GNU-specific extensions.
+.PP
+The command line consists of options to
+.I gawk
+itself, the AWK program text (if not supplied via the
+.B \-f
+option), and values to be made
+available in the
+.B ARGC
+and
+.B ARGV
+pre-defined AWK variables.
+.SH OPTIONS
+.PP
+.I Gawk
+accepts the following options, which should be available on any implementation
+of the AWK language.
+.TP
+.BI \-F fs
+Use
+.I fs
+for the input field separator (the value of the
+.B FS
+predefined
+variable).
+.TP
+\fB\-v\fI var\fR\^=\^\fIval\fR
+Assign the value
+.IR val ,
+to the variable
+.IR var ,
+before execution of the program begins.
+Such variable values are available to the
+.B BEGIN
+block of an AWK program.
+.TP
+.BI \-f " program-file"
+Read the AWK program source from the file
+.IR program-file ,
+instead of from the first command line argument.
+Multiple
+.B \-f
+options may be used.
+.TP
+.B \-\^\-
+Signal the end of options. This is useful to allow further arguments to the
+AWK program itself to start with a ``\-''.
+This is mainly for consistency with the argument parsing convention used
+by most other \*(PX programs.
+.PP
+Following the \*(PX standard,
+.IR gawk -specific
+options are supplied via arguments to the
+.B \-W
+option.  Multiple
+.B \-W
+options may be supplied, or multiple arguments may be supplied together
+if they are separated by commas, or enclosed in quotes and separated
+by white space.
+Case is ignored in arguments to the
+.B \-W
+option.
+.PP
+The
+.B \-W
+option accepts the following arguments:
+.TP \w'\fBcopyright\fR'u+1n
+.B compat
+Run in
+.I compatibility
+mode.  In compatibility mode,
+.I gawk
+behaves identically to \*(UX
+.IR awk ;
+none of the GNU-specific extensions are recognized.
+.TP
+.PD 0
+.B copyleft
+.TP
+.PD
+.B copyright
+Print the short version of the GNU copyright information message on
+the error output.
+.TP
+.B lint
+Provide warnings about constructs that are
+dubious or non-portable to other AWK implementations.
+.TP
+.B posix
+This turns on
+.I compatibility 
+mode, with the following additional restrictions:
+.RS
+.TP \w'\(bu'u+1n
+\(bu
+.B \ex
+escape sequences are not recognized.
+.TP
+\(bu
+The synonym
+.B func
+for the keyword
+.B function
+is not recognized.
+.TP
+\(bu
+The operators
+.B **
+and
+.B **=
+cannot be used in place of
+.B ^
+and
+.BR ^= .
+.RE
+.TP
+.B version
+Print version information for this particular copy of
+.I gawk
+on the error output.
+This is useful mainly for knowing if the current copy of
+.I gawk
+on your system
+is up to date with respect to whatever the Free Software Foundation
+is distributing.
+.PP
+Any other options are flagged as illegal, but are otherwise ignored.
+.SH AWK PROGRAM EXECUTION
+.PP
+An AWK program consists of a sequence of pattern-action statements
+and optional function definitions.
+.RS
+.PP
+\fIpattern\fB	{ \fIaction statements\fB }\fR
+.br
+\fBfunction \fIname\fB(\fIparameter list\fB) { \fIstatements\fB }\fR
+.RE
+.PP
+.I Gawk
+first reads the program source from the
+.IR program-file (s)
+if specified, or from the first non-option argument on the command line.
+The
+.B \-f
+option may be used multiple times on the command line.
+.I Gawk
+will read the program text as if all the
+.IR program-file s
+had been concatenated together.  This is useful for building libraries
+of AWK functions, without having to include them in each new AWK
diff --git a/gawk-5.0.1/test/longwrds.ok b/gawk-5.0.1/test/longwrds.ok
new file mode 100644
index 00000000000..01faa84717e
--- /dev/null
+++ b/gawk-5.0.1/test/longwrds.ok
@@ -0,0 +1,21 @@
+20 long words
+compatibility
+concatenated
+consistency
+definitions
+description
+distributing
+fistatements
+gawk-options
+gnu-specific
+identically
+implementation
+implementations
+information
+non-portable
+pattern-action
+pre-defined
+program-file
+program-text
+programming
+restrictions
diff --git a/gawk-5.0.1/test/manglprm.awk b/gawk-5.0.1/test/manglprm.awk
new file mode 100644
index 00000000000..3a4306ccb49
--- /dev/null
+++ b/gawk-5.0.1/test/manglprm.awk
@@ -0,0 +1,41 @@
+# From beebe@sunshine.math.utah.edu  Thu Jul 10 00:36:16 2003
+# Date: Wed, 9 Jul 2003 06:42:54 -0600 (MDT)
+# From: "Nelson H. F. Beebe" <beebe@math.utah.edu>
+# To: "Arnold Robbins" <arnold@skeeve.com>
+# Cc: beebe@math.utah.edu
+# X-US-Mail: "Center for Scientific Computing, Department of Mathematics, 110
+#         LCB, University of Utah, 155 S 1400 E RM 233, Salt Lake City, UT
+#         84112-0090, USA"
+# X-Telephone: +1 801 581 5254
+# X-FAX: +1 801 585 1640, +1 801 581 4148
+# X-URL: http://www.math.utah.edu/~beebe
+# Subject: gawk-3.1.3 (and earlier): reproducible core dump
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# 
+# I have a reproducible core dump in gawk-3.1.3, and recent gawk
+# versions.
+# 
+# Consider the following test program,  reduced from a much larger one:
+# 
+#         % cat gawk-dump.awk
+
+				{ process($0) }
+
+	function out_debug(s)
+	{
+	     print s
+	}
+
+	function process(s,   n,parts)
+	{
+	    out_debug("Buffer = [" protect(Buffer) "]")
+	    Buffer = Buffer s
+	    n = split(Buffer,parts,"\n")
+	}
+
+	function protect(s)
+	{
+	    gsub("\n", "\\n", s)
+	    return (s)
+	}
diff --git a/gawk-5.0.1/test/manglprm.in b/gawk-5.0.1/test/manglprm.in
new file mode 100644
index 00000000000..73709ba6866
--- /dev/null
+++ b/gawk-5.0.1/test/manglprm.in
@@ -0,0 +1 @@
+Testing
diff --git a/gawk-5.0.1/test/manglprm.ok b/gawk-5.0.1/test/manglprm.ok
new file mode 100644
index 00000000000..b13c4566f59
--- /dev/null
+++ b/gawk-5.0.1/test/manglprm.ok
@@ -0,0 +1 @@
+Buffer = []
diff --git a/gawk-5.0.1/test/manyfiles.awk b/gawk-5.0.1/test/manyfiles.awk
new file mode 100644
index 00000000000..8651a3a46d6
--- /dev/null
+++ b/gawk-5.0.1/test/manyfiles.awk
@@ -0,0 +1 @@
+{ print $2 > ("junk/" $1) }
diff --git a/gawk-5.0.1/test/manyfiles.ok b/gawk-5.0.1/test/manyfiles.ok
new file mode 100644
index 00000000000..d00491fd7e5
--- /dev/null
+++ b/gawk-5.0.1/test/manyfiles.ok
@@ -0,0 +1 @@
+1
diff --git a/gawk-5.0.1/test/match1.awk b/gawk-5.0.1/test/match1.awk
new file mode 100644
index 00000000000..6d4791be2b6
--- /dev/null
+++ b/gawk-5.0.1/test/match1.awk
@@ -0,0 +1,9 @@
+BEGIN {
+	data = "foooobazbarrrrr"
+	match(data, /(fo+).+(bar*)/, arr)
+	for (i = 0; i in arr; i++) {
+		printf("arr[%d] = \"%s\"\n", i, arr[i])
+		printf("arr[%d, \"start\"] = %s, arr[%d, \"length\"] = %s\n",
+			i, arr[i, "start"], i, arr[i, "length"])
+	}
+}
diff --git a/gawk-5.0.1/test/match1.ok b/gawk-5.0.1/test/match1.ok
new file mode 100644
index 00000000000..4490db2aebe
--- /dev/null
+++ b/gawk-5.0.1/test/match1.ok
@@ -0,0 +1,6 @@
+arr[0] = "foooobazbarrrrr"
+arr[0, "start"] = 1, arr[0, "length"] = 15
+arr[1] = "foooo"
+arr[1, "start"] = 1, arr[1, "length"] = 5
+arr[2] = "barrrrr"
+arr[2, "start"] = 9, arr[2, "length"] = 7
diff --git a/gawk-5.0.1/test/match2.awk b/gawk-5.0.1/test/match2.awk
new file mode 100644
index 00000000000..b4d9544c283
--- /dev/null
+++ b/gawk-5.0.1/test/match2.awk
@@ -0,0 +1,6 @@
+function f(a, b, c)
+{
+	print match("foo", "bar", f)
+}
+
+BEGIN { f(1, 2, 3) }
diff --git a/gawk-5.0.1/test/match2.ok b/gawk-5.0.1/test/match2.ok
new file mode 100644
index 00000000000..ad2e324c72b
--- /dev/null
+++ b/gawk-5.0.1/test/match2.ok
@@ -0,0 +1,3 @@
+gawk: match2.awk:3: error: function `f' called with space between name and `(',
+or used as a variable or an array
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/match3.awk b/gawk-5.0.1/test/match3.awk
new file mode 100644
index 00000000000..f3b6b838b79
--- /dev/null
+++ b/gawk-5.0.1/test/match3.awk
@@ -0,0 +1,46 @@
+# Date: Mon, 28 Jul 2008 17:25:32 +0200
+# From: Dirk Zimoch <dirk.zimoch@psi.ch>
+# Subject: match() prevents numeric strings from beeing treated numerically
+# To: bug-gawk@gnu.org
+# Message-id: <488DE4EC.6020400@psi.ch>
+# 
+# In gawk version 3.1.5, numeric user input that is parsed with match() is not 
+# recognized as "numeric string" any more. I.e. mixed string-numeric comparison 
+# does not work any more. In version 3.1.1, it worked. (Even though the 
+# documentation never explicitly mentioned this behavior for match(), as it does 
+# for split(). But is says that "user input" should be treated that way.)
+# 
+# awk 'BEGIN{match(".5",/.*/,a);print a[0]==.5?"OK":"FAULT"}'
+# 
+# Version 3.1.1 prints OK, version 3.1.5 prints FAULT.
+# 
+# awk '{match($0,/.*/,a);print a[0]==a[0]+0?"OK":"FAULT"}' << EOF
+# 5
+# 5.0
+# 0.5
+# .5
+# EOF
+# 
+# Version 3.1.1 prints
+# OK
+# OK
+# OK
+# OK
+# 
+# Version 3.1.5 prints
+# OK
+# FAULT
+# OK
+# FAULT
+# 
+# 
+# -- 
+# Dr. Dirk Zimoch
+# Paul Scherrer Institut, WBGB/006
+# 5232 Villigen PSI, Switzerland
+# Phone +41 56 310 5182
+# 
+{
+	match($0,/.*/,a)
+	print a[0] == a[0]+0 ? "OK" : "FAULT"
+}
diff --git a/gawk-5.0.1/test/match3.in b/gawk-5.0.1/test/match3.in
new file mode 100644
index 00000000000..a45babdd590
--- /dev/null
+++ b/gawk-5.0.1/test/match3.in
@@ -0,0 +1,4 @@
+5
+5.0
+0.5
+.5
diff --git a/gawk-5.0.1/test/match3.ok b/gawk-5.0.1/test/match3.ok
new file mode 100644
index 00000000000..b462a5a7baa
--- /dev/null
+++ b/gawk-5.0.1/test/match3.ok
@@ -0,0 +1,4 @@
+OK
+OK
+OK
+OK
diff --git a/gawk-5.0.1/test/math.awk b/gawk-5.0.1/test/math.awk
new file mode 100644
index 00000000000..90a01dd8358
--- /dev/null
+++ b/gawk-5.0.1/test/math.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	pi = 3.1415927
+	printf "cos(%f) = %f\n", pi/4, cos(pi/4)
+	printf "sin(%f) = %f\n", pi/4, sin(pi/4)
+	e = exp(1)
+	printf "e = %f\n", e
+	printf "log(e) = %f\n", log(e)
+	printf "sqrt(pi ^ 2) = %f\n", sqrt(pi ^ 2)
+	printf "atan2(1, 1) = %f\n", atan2(1, 1)
+}
diff --git a/gawk-5.0.1/test/math.ok b/gawk-5.0.1/test/math.ok
new file mode 100644
index 00000000000..a396a5b3b4c
--- /dev/null
+++ b/gawk-5.0.1/test/math.ok
@@ -0,0 +1,6 @@
+cos(0.785398) = 0.707107
+sin(0.785398) = 0.707107
+e = 2.718282
+log(e) = 1.000000
+sqrt(pi ^ 2) = 3.141593
+atan2(1, 1) = 0.785398
diff --git a/gawk-5.0.1/test/mbfw1.awk b/gawk-5.0.1/test/mbfw1.awk
new file mode 100644
index 00000000000..25d8e5ccfc8
--- /dev/null
+++ b/gawk-5.0.1/test/mbfw1.awk
@@ -0,0 +1,40 @@
+# Date: Sun, 16 Mar 2008 18:51:14 +0100
+# From: Hermann Peifer <peifer@gmx.eu>
+# Subject: [Fwd: Gawk FIELDWIDTHS and multibyte characters]
+# To: bug-gawk@gnu.org
+# Message-id: <47DD5E12.2010403@gmx.eu>
+# 
+# See below. Regards, Hermann
+# 
+# --- Original Message ---
+# 
+# Newsgroups: comp.lang.awk
+# From: Hermann Peifer <peifer@gmx.eu>
+# Date: Sun, 16 Mar 2008 01:23:38 -0700 (PDT)
+# Subject: Gawk FIELDWIDTHS and multibyte characters
+# 
+# Hi,
+# 
+# It looks to me that Gawk's FIELDWIDTHS extension is not aware of
+# multibyte characters, see my example below.
+# 
+# $ cat testdata
+# CDRegion              Commune             Site
+# SEVästsverige         Hallands län        Kungsbacka
+# SESmåland med öarna   Västra Götalands länGöteborg
+# SEKronoberg           Alvesta             Stenungsund
+# 
+# $ file testdata
+# testdata: UTF-8 Unicode text
+# 
+# $ awk 'BEGIN{FIELDWIDTHS = "2 20 20 20"}{print $4}' testdata
+# Site
+#    Kungsbacka
+#   länGöteborg
+# Stenungsund
+# 
+# Can someone confirm?
+# 
+# Hermann
+BEGIN { FIELDWIDTHS = "2 20 20 20" }
+{ print $4 }
diff --git a/gawk-5.0.1/test/mbfw1.in b/gawk-5.0.1/test/mbfw1.in
new file mode 100644
index 00000000000..58ba36a3752
--- /dev/null
+++ b/gawk-5.0.1/test/mbfw1.in
@@ -0,0 +1,4 @@
+CDRegion              Commune             Site
+SEVästsverige         Hallands län        Kungsbacka
+SESmåland med öarna   Västra Götalands länGöteborg
+SEKronoberg           Alvesta             Stenungsund
diff --git a/gawk-5.0.1/test/mbfw1.ok b/gawk-5.0.1/test/mbfw1.ok
new file mode 100644
index 00000000000..c0a80f1ccee
--- /dev/null
+++ b/gawk-5.0.1/test/mbfw1.ok
@@ -0,0 +1,4 @@
+Site
+Kungsbacka
+Göteborg
+Stenungsund
diff --git a/gawk-5.0.1/test/mbprintf1.awk b/gawk-5.0.1/test/mbprintf1.awk
new file mode 100644
index 00000000000..974c109f25c
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf1.awk
@@ -0,0 +1 @@
+{ printf "%-7s|\n", $0 }
diff --git a/gawk-5.0.1/test/mbprintf1.in b/gawk-5.0.1/test/mbprintf1.in
new file mode 100644
index 00000000000..8ee09e6d376
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf1.in
@@ -0,0 +1,2 @@
+AAA
+ÅÃÆ
diff --git a/gawk-5.0.1/test/mbprintf1.ok b/gawk-5.0.1/test/mbprintf1.ok
new file mode 100644
index 00000000000..40935cc8326
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf1.ok
@@ -0,0 +1,2 @@
+AAA    |
+ÅÃÆ    |
diff --git a/gawk-5.0.1/test/mbprintf2.awk b/gawk-5.0.1/test/mbprintf2.awk
new file mode 100644
index 00000000000..46c68135db5
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf2.awk
@@ -0,0 +1,4 @@
+BEGIN {
+	printf "%c\n",  65
+	printf "%c\n", "AA"
+}
diff --git a/gawk-5.0.1/test/mbprintf2.ok b/gawk-5.0.1/test/mbprintf2.ok
new file mode 100644
index 00000000000..67aa8665845
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf2.ok
@@ -0,0 +1,2 @@
+A
+A
diff --git a/gawk-5.0.1/test/mbprintf3.awk b/gawk-5.0.1/test/mbprintf3.awk
new file mode 100644
index 00000000000..1f99bd8f5e8
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf3.awk
@@ -0,0 +1 @@
+FNR == 1 { print $0; printf "%s\n", $0 }
diff --git a/gawk-5.0.1/test/mbprintf3.in b/gawk-5.0.1/test/mbprintf3.in
new file mode 100644
index 00000000000..10971bc4a6b
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf3.in
@@ -0,0 +1 @@
+COMPONENT suspended particulates <10 �m (air), day
diff --git a/gawk-5.0.1/test/mbprintf3.ok b/gawk-5.0.1/test/mbprintf3.ok
new file mode 100644
index 00000000000..01317801a77
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf3.ok
@@ -0,0 +1,2 @@
+COMPONENT suspended particulates <10 �m (air), day
+COMPONENT suspended particulates <10 �m (air), day
diff --git a/gawk-5.0.1/test/mbprintf4.awk b/gawk-5.0.1/test/mbprintf4.awk
new file mode 100644
index 00000000000..1e436bca4bc
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf4.awk
@@ -0,0 +1,35 @@
+# printf with multi-byte text encoding, %c and %s, width and precision, and left-alignment.
+{
+	count = 1
+
+	print NR, count++, "printf %c " $0
+	printf "%d:%d: |%c|\n", NR, count++, $0
+	printf "%d:%d: |%1c|\n", NR, count++, $0
+	printf "%d:%d: |%3c|\n", NR, count++, $0
+	# precision is ignored by %c.
+	printf "%d:%d: |%3.1c|\n", NR, count++, $0
+	printf "%d:%d: |%3.5c|\n", NR, count++, $0
+	print NR, count++, "printf %-c " $0
+	printf "%d:%d: |%-c|\n", NR, count++, $0
+	printf "%d:%d: |%-1c|\n", NR, count++, $0
+	printf "%d:%d: |%-3c|\n", NR, count++, $0
+	# precision is ignored by %c.
+	printf "%d:%d: |%-3.1c|\n", NR, count++, $0
+	printf "%d:%d: |%-3.5c|\n", NR, count++, $0
+	printf ORS
+
+	print NR, count++, "printf %s " $0
+	printf "%d:%d: |%s|\n", NR, count++, $0
+	printf "%d:%d: |%1s|\n", NR, count++, $0
+	printf "%d:%d: |%3s|\n", NR, count++, $0
+	printf "%d:%d: |%3.1s|\n", NR, count++, $0
+	printf "%d:%d: |%3.5s|\n", NR, count++, $0
+
+	print NR, count++, "printf %-s " $0
+	printf "%d:%d: |%-s|\n", NR, count++, $0
+	printf "%d:%d: |%-1s|\n", NR, count++, $0
+	printf "%d:%d: |%-3s|\n", NR, count++, $0
+	printf "%d:%d: |%-3.1s|\n", NR, count++, $0
+	printf "%d:%d: |%-3.5s|\n", NR, count++, $0
+	printf ORS ORS
+}
diff --git a/gawk-5.0.1/test/mbprintf4.in b/gawk-5.0.1/test/mbprintf4.in
new file mode 100644
index 00000000000..c93d40def66
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf4.in
@@ -0,0 +1,3 @@
+ú
+último
+áé
diff --git a/gawk-5.0.1/test/mbprintf4.ok b/gawk-5.0.1/test/mbprintf4.ok
new file mode 100644
index 00000000000..e32fe4082e9
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf4.ok
@@ -0,0 +1,81 @@
+1 1 printf %c ú
+1:2: |ú|
+1:3: |ú|
+1:4: |  ú|
+1:5: |  ú|
+1:6: |  ú|
+1 7 printf %-c ú
+1:8: |ú|
+1:9: |ú|
+1:10: |ú  |
+1:11: |ú  |
+1:12: |ú  |
+
+1 13 printf %s ú
+1:14: |ú|
+1:15: |ú|
+1:16: |  ú|
+1:17: |  ú|
+1:18: |  ú|
+1 19 printf %-s ú
+1:20: |ú|
+1:21: |ú|
+1:22: |ú  |
+1:23: |ú  |
+1:24: |ú  |
+
+
+2 1 printf %c último
+2:2: |ú|
+2:3: |ú|
+2:4: |  ú|
+2:5: |  ú|
+2:6: |  ú|
+2 7 printf %-c último
+2:8: |ú|
+2:9: |ú|
+2:10: |ú  |
+2:11: |ú  |
+2:12: |ú  |
+
+2 13 printf %s último
+2:14: |último|
+2:15: |último|
+2:16: |último|
+2:17: |  ú|
+2:18: |últim|
+2 19 printf %-s último
+2:20: |último|
+2:21: |último|
+2:22: |último|
+2:23: |ú  |
+2:24: |últim|
+
+
+3 1 printf %c áé
+3:2: |á|
+3:3: |á|
+3:4: |  á|
+3:5: |  á|
+3:6: |  á|
+3 7 printf %-c áé
+3:8: |á|
+3:9: |á|
+3:10: |á  |
+3:11: |á  |
+3:12: |á  |
+
+3 13 printf %s áé
+3:14: |áé|
+3:15: |áé|
+3:16: | áé|
+3:17: |  á|
+3:18: | áé|
+3 19 printf %-s áé
+3:20: |áé|
+3:21: |áé|
+3:22: |áé |
+3:23: |á  |
+3:24: |áé |
+
+
diff --git a/gawk-5.0.1/test/mbprintf5.awk b/gawk-5.0.1/test/mbprintf5.awk
new file mode 100644
index 00000000000..c9a57b48e56
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf5.awk
@@ -0,0 +1 @@
+{printf "%-5s%s\n", $1, $2}
diff --git a/gawk-5.0.1/test/mbprintf5.in b/gawk-5.0.1/test/mbprintf5.in
new file mode 100644
index 00000000000..c63daaf682a
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf5.in
@@ -0,0 +1,3 @@
+Ö ABC
+• ABC
+🜁 ABC
diff --git a/gawk-5.0.1/test/mbprintf5.ok b/gawk-5.0.1/test/mbprintf5.ok
new file mode 100644
index 00000000000..252d95e6d03
--- /dev/null
+++ b/gawk-5.0.1/test/mbprintf5.ok
@@ -0,0 +1,3 @@
+Ö    ABC
+•    ABC
+🜁    ABC
diff --git a/gawk-5.0.1/test/mbstr1.awk b/gawk-5.0.1/test/mbstr1.awk
new file mode 100644
index 00000000000..2abcff21f27
--- /dev/null
+++ b/gawk-5.0.1/test/mbstr1.awk
@@ -0,0 +1,4 @@
+BEGIN {
+	print length("\x81\x82\x83\x84")
+	print index("\x81\x82\x83\x84", "\x81\x82")
+}
diff --git a/gawk-5.0.1/test/mbstr1.ok b/gawk-5.0.1/test/mbstr1.ok
new file mode 100644
index 00000000000..3fd1bf8efce
--- /dev/null
+++ b/gawk-5.0.1/test/mbstr1.ok
@@ -0,0 +1,3 @@
+gawk: mbstr1.awk:2: warning: Invalid multibyte data detected. There may be a mismatch between your data and your locale.
+4
+1
diff --git a/gawk-5.0.1/test/mbstr2.awk b/gawk-5.0.1/test/mbstr2.awk
new file mode 100644
index 00000000000..4f2c8cc6362
--- /dev/null
+++ b/gawk-5.0.1/test/mbstr2.awk
@@ -0,0 +1 @@
+match($0,/:deathdate=2007....:/) { print substr($0,RSTART+11,RLENGTH-16) }
diff --git a/gawk-5.0.1/test/mbstr2.in b/gawk-5.0.1/test/mbstr2.in
new file mode 100644
index 00000000000..36e971a679d
--- /dev/null
+++ b/gawk-5.0.1/test/mbstr2.in
@@ -0,0 +1,4 @@
+missile:deathdate=20070306:
+P�rr�:deathdate=20070306:
+wizard:deathdate=20071103:
+Daith�:deathdate=20071103:
diff --git a/gawk-5.0.1/test/mbstr2.ok b/gawk-5.0.1/test/mbstr2.ok
new file mode 100644
index 00000000000..29ac876a7bb
--- /dev/null
+++ b/gawk-5.0.1/test/mbstr2.ok
@@ -0,0 +1,5 @@
+2007
+gawk: mbstr2.awk:1: (FILENAME=- FNR=2) warning: Invalid multibyte data detected. There may be a mismatch between your data and your locale.
+2007
+2007
+2007
diff --git a/gawk-5.0.1/test/membug1.awk b/gawk-5.0.1/test/membug1.awk
new file mode 100644
index 00000000000..cb769581658
--- /dev/null
+++ b/gawk-5.0.1/test/membug1.awk
@@ -0,0 +1 @@
+{ one != one = $1 }
diff --git a/gawk-5.0.1/test/membug1.in b/gawk-5.0.1/test/membug1.in
new file mode 100644
index 00000000000..af7e09de93c
--- /dev/null
+++ b/gawk-5.0.1/test/membug1.in
@@ -0,0 +1,2 @@
+yes
+yes
diff --git a/gawk-5.0.1/test/membug1.ok b/gawk-5.0.1/test/membug1.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/memleak.awk b/gawk-5.0.1/test/memleak.awk
new file mode 100644
index 00000000000..3937658fbdd
--- /dev/null
+++ b/gawk-5.0.1/test/memleak.awk
@@ -0,0 +1,20 @@
+# This program doesn't do anything except allow us to
+# check for memory leak from using a user-supplied
+# sorting function.
+#
+# From Andrew Schorr.
+
+function my_func(i1, v1, i2, v2) {
+	return v2-v1
+}
+
+BEGIN {
+	a[1] = "3"
+	a[2] = "2"
+	a[3] = "4"
+	for (i = 0; i < 10000; i++) {
+		n = asort(a, b, "my_func")
+		s += n
+	}
+	print s
+}
diff --git a/gawk-5.0.1/test/memleak.ok b/gawk-5.0.1/test/memleak.ok
new file mode 100644
index 00000000000..3a05c8b3ee8
--- /dev/null
+++ b/gawk-5.0.1/test/memleak.ok
@@ -0,0 +1 @@
+30000
diff --git a/gawk-5.0.1/test/messages.awk b/gawk-5.0.1/test/messages.awk
new file mode 100644
index 00000000000..50f7d91f67f
--- /dev/null
+++ b/gawk-5.0.1/test/messages.awk
@@ -0,0 +1,9 @@
+# This is a demo of different ways of printing with gawk.  Try it
+# with and without -c (compatibility) flag, redirecting output
+# from gawk to a file or not.  Some results can be quite unexpected. 
+BEGIN {
+	print "Goes to a file out1" > "_out1"
+	print "Normal print statement"
+	print "This printed on stdout" > "/dev/stdout"
+	print "You blew it!" > "/dev/stderr"
+}
diff --git a/gawk-5.0.1/test/minusstr.awk b/gawk-5.0.1/test/minusstr.awk
new file mode 100644
index 00000000000..d427719f1cc
--- /dev/null
+++ b/gawk-5.0.1/test/minusstr.awk
@@ -0,0 +1 @@
+BEGIN { print-"6" }
diff --git a/gawk-5.0.1/test/minusstr.ok b/gawk-5.0.1/test/minusstr.ok
new file mode 100644
index 00000000000..3cfb5efd665
--- /dev/null
+++ b/gawk-5.0.1/test/minusstr.ok
@@ -0,0 +1 @@
+-6
diff --git a/gawk-5.0.1/test/mixed1.ok b/gawk-5.0.1/test/mixed1.ok
new file mode 100644
index 00000000000..bd6f447df34
--- /dev/null
+++ b/gawk-5.0.1/test/mixed1.ok
@@ -0,0 +1,3 @@
+gawk: cmd. line:1: BEGIN {return junk}
+gawk: cmd. line:1:        ^ `return' used outside function context
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/mktime.awk b/gawk-5.0.1/test/mktime.awk
new file mode 100644
index 00000000000..8a83df14bd0
--- /dev/null
+++ b/gawk-5.0.1/test/mktime.awk
@@ -0,0 +1,3 @@
+{
+	print mktime($0, 1)
+}
diff --git a/gawk-5.0.1/test/mktime.in b/gawk-5.0.1/test/mktime.in
new file mode 100644
index 00000000000..bfc7d68abfc
--- /dev/null
+++ b/gawk-5.0.1/test/mktime.in
@@ -0,0 +1 @@
+2017 1 1 0 0 0
diff --git a/gawk-5.0.1/test/mktime.ok b/gawk-5.0.1/test/mktime.ok
new file mode 100644
index 00000000000..677b3ebcc31
--- /dev/null
+++ b/gawk-5.0.1/test/mktime.ok
@@ -0,0 +1 @@
+1483228800
diff --git a/gawk-5.0.1/test/mmap8k.awk b/gawk-5.0.1/test/mmap8k.awk
new file mode 100644
index 00000000000..1751e360f4b
--- /dev/null
+++ b/gawk-5.0.1/test/mmap8k.awk
@@ -0,0 +1 @@
+{ print }
diff --git a/gawk-5.0.1/test/mmap8k.in b/gawk-5.0.1/test/mmap8k.in
new file mode 100644
index 00000000000..0500ddf2f5f
--- /dev/null
+++ b/gawk-5.0.1/test/mmap8k.in
@@ -0,0 +1,143 @@
+XXXXXXXX.com   ALTERNET    9305 930528  1500.00 startup
+XXXXXXXX.com   ALTERNET    9305 930624    94.38 Line-9305
+XXXXXXXX.com   ALTERNET    9306 930624   104.49 Line-9306
+XXXXXXXX.com   ALTERNET    9306 930624   649.16 Line-install
+XXXXXXXX.com   ALTERNET    9306 930624   166.67 TCP-slip
+XXXXXXXX.com   ALTERNET    9307 930624   104.49 Line-9307
+XXXXXXXX.com   ALTERNET    9307 930624   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9308 930701   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9308 930701   104.49 line-9308
+XXXXXXXX.com   PAYMENT     9307 930731  1500.00 1870
+XXXXXXXX.com   ALTERNET    9309 930801   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9309 930801   104.49 line-9309
+XXXXXXXX.com   INTEREST    9307 930801    22.50
+XXXXXXXX.com   CREDADJ     9308 930805    22.50 waive interest
+XXXXXXXX.com   PAYMENT     9308 930820  1723.68 1982
+XXXXXXXX.com   ALTERNET    9310 930901   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9310 930901   104.49 line-9310
+XXXXXXXX.com   PAYMENT     9310 931001   708.98 2313
+XXXXXXXX.com   ALTERNET    9311 931001   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9311 931001   104.49 line-9311
+XXXXXXXX.com   INTEREST    9309 931001     5.32
+XXXXXXXX.com   CREDADJ     9310 931007     5.32 waive int-9309
+XXXXXXXX.com   ALTERNET    9312 931101   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9312 931101   104.49 line-9312
+XXXXXXXX.com   PAYMENT     9311 931120   354.49 002701
+XXXXXXXX.com   ALTERNET    9401 931201   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9401 931201   104.49 line-9401
+XXXXXXXX.com   PAYMENT     9312 931218   354.49 2884
+XXXXXXXX.com   ALTERNET    9402 940101   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9402 940101   104.49 line-9402
+XXXXXXXX.com   INTEREST    9312 940101     5.32
+XXXXXXXX.com   PAYMENT     9401 940122   354.49 3084
+XXXXXXXX.com   ALTERNET    9403 940201   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9403 940201   104.49 line-9403
+XXXXXXXX.com   INTEREST    9401 940201     5.40
+XXXXXXXX.com   PAYMENT     9402 940207   354.49 3140
+XXXXXXXX.com   CREDADJ     9402 940211     5.32 interest-9402
+XXXXXXXX.com   CREDADJ     9402 940211     5.40 interest-9403
+XXXXXXXX.com   ALTERNET    9404 940301   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9404 940301   104.49 line-9404
+XXXXXXXX.com   INTEREST    9402 940301     5.32
+XXXXXXXX.com   PAYMENT     9403 940310   354.49 003307
+XXXXXXXX.com   PAYMENT     9403 940324   354.49 3446
+XXXXXXXX.com   ALTERNET    9405 940401   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9405 940401   104.49 line-9405
+XXXXXXXX.com   ALTERNET    9406 940501   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9406 940501   104.49 line-9406
+XXXXXXXX.com   INTEREST    9404 940501     5.40
+XXXXXXXX.com   PAYMENT     9405 940509   359.81 003819
+XXXXXXXX.com   ALTERNET    9407 940601   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9407 940601   104.49 line-9407
+XXXXXXXX.com   INTEREST    9405 940601     5.40
+XXXXXXXX.com   PAYMENT     9406 940603   354.49 004025
+XXXXXXXX.com   ALTERNET    9408 940701   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9408 940701   104.49 line-9408
+XXXXXXXX.com   INTEREST    9406 940701     5.48
+XXXXXXXX.com   PAYMENT     9407 940725   354.49 004350
+XXXXXXXX.com   ALTERNET    9409 940801   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9409 940801   104.49 line-9409
+XXXXXXXX.com   INTEREST    9407 940801     5.56
+XXXXXXXX.com   PAYMENT     9408 940808   354.49 004454
+XXXXXXXX.com   ALTERNET    9409 940811     0.00 startup
+XXXXXXXX.com   EQUIPMENT   9408 940831   399.00 ATL6402-1
+XXXXXXXX.com   EQUIPMENT   9408 940831  2295.00 NBClassicPac-1
+XXXXXXXX.com   EQUIPMENT   9408 940831  1060.00 Syn35-1+ship
+XXXXXXXX.com   ALTERNET    9410 940901   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9410 940901   104.49 line-9410
+XXXXXXXX.com   INTEREST    9408 940901     5.64
+XXXXXXXX.com   PAYMENT     9409 940906   354.49 004677
+XXXXXXXX.com   CREDADJ     9409 940921   124.95 TCP-slip-9409
+XXXXXXXX.com   CREDADJ     9409 940921    52.20 line-9409
+XXXXXXXX.com   CREDADJ     9410 940921   250.00 TCP-slip-9410
+XXXXXXXX.com   CREDADJ     9410 940921   104.49 line-9410
+XXXXXXXX.com   ALTERNET    9409 940921   397.50 TCP-56k-local recon
+XXXXXXXX.com   ALTERNET    9409 940921    87.45 line-9409 recon
+XXXXXXXX.com   ALTERNET    9410 940921   795.00 TCP-56k-local recon
+XXXXXXXX.com   ALTERNET    9410 940921   174.90 line-9410 recon
+XXXXXXXX.com   ALTERNET    9411 941001   795.00 TCP-56k-local
+XXXXXXXX.com   ALTERNET    9411 941001   174.90 line-9411
+XXXXXXXX.com   INTEREST    9409 941001    54.06
+XXXXXXXX.com   PAYMENT     9410 941017   354.49 5026
+XXXXXXXX.com   ALTERNET    9412 941101   795.00 TCP-56k-local
+XXXXXXXX.com   ALTERNET    9412 941101   174.90 line-9412
+XXXXXXXX.com   INTEREST    9410 941101    85.93
+XXXXXXXX.com   PAYMENT     9411 941114   969.90 005274
+XXXXXXXX.com   ALTERNET    9501 941201   795.00 TCP-56k-local
+XXXXXXXX.com   ALTERNET    9501 941201   174.90 line-9501
+XXXXXXXX.com   INTEREST    9411 941201    87.22
+XXXXXXXX.com   PAYMENT     9412 941219  4723.90 5590
+XXXXXXXX.com   ALTERNET    9502 950101   795.00 TCP-56k-local
+XXXXXXXX.com   ALTERNET    9502 950101   174.90 line-9502
+XXXXXXXX.com   INTEREST    9412 950101    32.22
+XXXXXXXX.com   PAYMENT     9501 950103  1893.11 5766
+XXXXXXXX.com   ALTERNET    9503 950201   795.00 TCP-56k-local-old
+XXXXXXXX.com   ALTERNET    9503 950201   174.90 line-9503
+XXXXXXXX.com   INTEREST    9501 950201    18.85
+XXXXXXXX.com   PAYMENT     9502 950207   969.90 6044
+XXXXXXXX.com   ALTERNET    9504 950301   795.00 TCP-56k-local-old
+XXXXXXXX.com   ALTERNET    9504 950301   174.90 line-9504
+XXXXXXXX.com   INTEREST    9502 950301    19.13
+XXXXXXXX.com   PAYMENT     9503 950307   969.90 6408
+XXXXXXXX.com   ALTERNET    9504 950316  3000.00 startup TCP-bt1-128k%5
+XXXXXXXX.com   PAYMENT     9503 950327   969.90 6594
+XXXXXXXX.com   ALTERNET    9505 950401  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9505 950401   556.60 line-9505
+XXXXXXXX.com   EQUIPMENT   9504 950410  1595.00 cisco2501-1
+XXXXXXXX.com   CREDADJ     9504 950417   503.50 TCP-56k-local
+XXXXXXXX.com   CREDADJ     9504 950417   116.60 line-9504
+XXXXXXXX.com   ALTERNET    9504 950417   448.80 line-install
+XXXXXXXX.com   ALTERNET    9504 950417   752.02 TCP-bt1-128k%5 recon
+XXXXXXXX.com   ALTERNET    9504 950417   371.00 line-9504 recon
+XXXXXXXX.com   PAYMENT     9504 950424  3000.00 6841
+XXXXXXXX.com   ALTERNET    9506 950501  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9506 950501   556.60 line-9506
+XXXXXXXX.com   PAYMENT     9505 950505  2049.86 6985
+XXXXXXXX.com   PAYMENT     9505 950531  3924.22 7179
+XXXXXXXX.com   ALTERNET    9507 950601  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9507 950601   556.60 line-9507
+XXXXXXXX.com   PAYMENT     9506 950607  1744.10 7232
+XXXXXXXX.com   ALTERNET    9508 950701  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9508 950701   556.60 line-9508
+XXXXXXXX.com   PAYMENT     9507 950705  1744.10 7641
+XXXXXXXX.com   ALTERNET    9509 950801  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9509 950801   556.60 line-9509
+XXXXXXXX.com   PAYMENT     9508 950803  1744.10 7914
+XXXXXXXX.com   ALTERNET    9510 950901  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9510 950901   556.60 line-9510
+XXXXXXXX.com   PAYMENT     9509 950905  1744.10 8203
+XXXXXXXX.com   ALTERNET    9511 951001  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9511 951001   556.60 line-9511
+XXXXXXXX.com   PAYMENT     9510 951003  1744.10 8508
+XXXXXXXX.com   ALTERNET    9512 951101  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9512 951101   556.60 line-9512
+XXXXXXXX.com   PAYMENT     9511 951103  2129.83 8837
+XXXXXXXX.com   ALTERNET    9601 951201  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9601 951201   556.60 line-9601
+XXXXXXXX.com   PAYMENT     9512 951204  2129.83 9131
+XXXXXXXX.com   ALTERNET    9602 960101  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9602 960101   556.60 line-9602
+XXXXXXXX.com   PAYMENT     9601 960103  1744.10 9456
+XXXXXXXX.com   ALTERNET    9603 960201  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9603 960201   556.60 line-9603
+XXXXXXXX.com   PAYMENT     9602 960205  1358.37 9834
diff --git a/gawk-5.0.1/test/mmap8k.ok b/gawk-5.0.1/test/mmap8k.ok
new file mode 100644
index 00000000000..0500ddf2f5f
--- /dev/null
+++ b/gawk-5.0.1/test/mmap8k.ok
@@ -0,0 +1,143 @@
+XXXXXXXX.com   ALTERNET    9305 930528  1500.00 startup
+XXXXXXXX.com   ALTERNET    9305 930624    94.38 Line-9305
+XXXXXXXX.com   ALTERNET    9306 930624   104.49 Line-9306
+XXXXXXXX.com   ALTERNET    9306 930624   649.16 Line-install
+XXXXXXXX.com   ALTERNET    9306 930624   166.67 TCP-slip
+XXXXXXXX.com   ALTERNET    9307 930624   104.49 Line-9307
+XXXXXXXX.com   ALTERNET    9307 930624   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9308 930701   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9308 930701   104.49 line-9308
+XXXXXXXX.com   PAYMENT     9307 930731  1500.00 1870
+XXXXXXXX.com   ALTERNET    9309 930801   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9309 930801   104.49 line-9309
+XXXXXXXX.com   INTEREST    9307 930801    22.50
+XXXXXXXX.com   CREDADJ     9308 930805    22.50 waive interest
+XXXXXXXX.com   PAYMENT     9308 930820  1723.68 1982
+XXXXXXXX.com   ALTERNET    9310 930901   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9310 930901   104.49 line-9310
+XXXXXXXX.com   PAYMENT     9310 931001   708.98 2313
+XXXXXXXX.com   ALTERNET    9311 931001   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9311 931001   104.49 line-9311
+XXXXXXXX.com   INTEREST    9309 931001     5.32
+XXXXXXXX.com   CREDADJ     9310 931007     5.32 waive int-9309
+XXXXXXXX.com   ALTERNET    9312 931101   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9312 931101   104.49 line-9312
+XXXXXXXX.com   PAYMENT     9311 931120   354.49 002701
+XXXXXXXX.com   ALTERNET    9401 931201   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9401 931201   104.49 line-9401
+XXXXXXXX.com   PAYMENT     9312 931218   354.49 2884
+XXXXXXXX.com   ALTERNET    9402 940101   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9402 940101   104.49 line-9402
+XXXXXXXX.com   INTEREST    9312 940101     5.32
+XXXXXXXX.com   PAYMENT     9401 940122   354.49 3084
+XXXXXXXX.com   ALTERNET    9403 940201   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9403 940201   104.49 line-9403
+XXXXXXXX.com   INTEREST    9401 940201     5.40
+XXXXXXXX.com   PAYMENT     9402 940207   354.49 3140
+XXXXXXXX.com   CREDADJ     9402 940211     5.32 interest-9402
+XXXXXXXX.com   CREDADJ     9402 940211     5.40 interest-9403
+XXXXXXXX.com   ALTERNET    9404 940301   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9404 940301   104.49 line-9404
+XXXXXXXX.com   INTEREST    9402 940301     5.32
+XXXXXXXX.com   PAYMENT     9403 940310   354.49 003307
+XXXXXXXX.com   PAYMENT     9403 940324   354.49 3446
+XXXXXXXX.com   ALTERNET    9405 940401   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9405 940401   104.49 line-9405
+XXXXXXXX.com   ALTERNET    9406 940501   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9406 940501   104.49 line-9406
+XXXXXXXX.com   INTEREST    9404 940501     5.40
+XXXXXXXX.com   PAYMENT     9405 940509   359.81 003819
+XXXXXXXX.com   ALTERNET    9407 940601   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9407 940601   104.49 line-9407
+XXXXXXXX.com   INTEREST    9405 940601     5.40
+XXXXXXXX.com   PAYMENT     9406 940603   354.49 004025
+XXXXXXXX.com   ALTERNET    9408 940701   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9408 940701   104.49 line-9408
+XXXXXXXX.com   INTEREST    9406 940701     5.48
+XXXXXXXX.com   PAYMENT     9407 940725   354.49 004350
+XXXXXXXX.com   ALTERNET    9409 940801   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9409 940801   104.49 line-9409
+XXXXXXXX.com   INTEREST    9407 940801     5.56
+XXXXXXXX.com   PAYMENT     9408 940808   354.49 004454
+XXXXXXXX.com   ALTERNET    9409 940811     0.00 startup
+XXXXXXXX.com   EQUIPMENT   9408 940831   399.00 ATL6402-1
+XXXXXXXX.com   EQUIPMENT   9408 940831  2295.00 NBClassicPac-1
+XXXXXXXX.com   EQUIPMENT   9408 940831  1060.00 Syn35-1+ship
+XXXXXXXX.com   ALTERNET    9410 940901   250.00 TCP-slip
+XXXXXXXX.com   ALTERNET    9410 940901   104.49 line-9410
+XXXXXXXX.com   INTEREST    9408 940901     5.64
+XXXXXXXX.com   PAYMENT     9409 940906   354.49 004677
+XXXXXXXX.com   CREDADJ     9409 940921   124.95 TCP-slip-9409
+XXXXXXXX.com   CREDADJ     9409 940921    52.20 line-9409
+XXXXXXXX.com   CREDADJ     9410 940921   250.00 TCP-slip-9410
+XXXXXXXX.com   CREDADJ     9410 940921   104.49 line-9410
+XXXXXXXX.com   ALTERNET    9409 940921   397.50 TCP-56k-local recon
+XXXXXXXX.com   ALTERNET    9409 940921    87.45 line-9409 recon
+XXXXXXXX.com   ALTERNET    9410 940921   795.00 TCP-56k-local recon
+XXXXXXXX.com   ALTERNET    9410 940921   174.90 line-9410 recon
+XXXXXXXX.com   ALTERNET    9411 941001   795.00 TCP-56k-local
+XXXXXXXX.com   ALTERNET    9411 941001   174.90 line-9411
+XXXXXXXX.com   INTEREST    9409 941001    54.06
+XXXXXXXX.com   PAYMENT     9410 941017   354.49 5026
+XXXXXXXX.com   ALTERNET    9412 941101   795.00 TCP-56k-local
+XXXXXXXX.com   ALTERNET    9412 941101   174.90 line-9412
+XXXXXXXX.com   INTEREST    9410 941101    85.93
+XXXXXXXX.com   PAYMENT     9411 941114   969.90 005274
+XXXXXXXX.com   ALTERNET    9501 941201   795.00 TCP-56k-local
+XXXXXXXX.com   ALTERNET    9501 941201   174.90 line-9501
+XXXXXXXX.com   INTEREST    9411 941201    87.22
+XXXXXXXX.com   PAYMENT     9412 941219  4723.90 5590
+XXXXXXXX.com   ALTERNET    9502 950101   795.00 TCP-56k-local
+XXXXXXXX.com   ALTERNET    9502 950101   174.90 line-9502
+XXXXXXXX.com   INTEREST    9412 950101    32.22
+XXXXXXXX.com   PAYMENT     9501 950103  1893.11 5766
+XXXXXXXX.com   ALTERNET    9503 950201   795.00 TCP-56k-local-old
+XXXXXXXX.com   ALTERNET    9503 950201   174.90 line-9503
+XXXXXXXX.com   INTEREST    9501 950201    18.85
+XXXXXXXX.com   PAYMENT     9502 950207   969.90 6044
+XXXXXXXX.com   ALTERNET    9504 950301   795.00 TCP-56k-local-old
+XXXXXXXX.com   ALTERNET    9504 950301   174.90 line-9504
+XXXXXXXX.com   INTEREST    9502 950301    19.13
+XXXXXXXX.com   PAYMENT     9503 950307   969.90 6408
+XXXXXXXX.com   ALTERNET    9504 950316  3000.00 startup TCP-bt1-128k%5
+XXXXXXXX.com   PAYMENT     9503 950327   969.90 6594
+XXXXXXXX.com   ALTERNET    9505 950401  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9505 950401   556.60 line-9505
+XXXXXXXX.com   EQUIPMENT   9504 950410  1595.00 cisco2501-1
+XXXXXXXX.com   CREDADJ     9504 950417   503.50 TCP-56k-local
+XXXXXXXX.com   CREDADJ     9504 950417   116.60 line-9504
+XXXXXXXX.com   ALTERNET    9504 950417   448.80 line-install
+XXXXXXXX.com   ALTERNET    9504 950417   752.02 TCP-bt1-128k%5 recon
+XXXXXXXX.com   ALTERNET    9504 950417   371.00 line-9504 recon
+XXXXXXXX.com   PAYMENT     9504 950424  3000.00 6841
+XXXXXXXX.com   ALTERNET    9506 950501  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9506 950501   556.60 line-9506
+XXXXXXXX.com   PAYMENT     9505 950505  2049.86 6985
+XXXXXXXX.com   PAYMENT     9505 950531  3924.22 7179
+XXXXXXXX.com   ALTERNET    9507 950601  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9507 950601   556.60 line-9507
+XXXXXXXX.com   PAYMENT     9506 950607  1744.10 7232
+XXXXXXXX.com   ALTERNET    9508 950701  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9508 950701   556.60 line-9508
+XXXXXXXX.com   PAYMENT     9507 950705  1744.10 7641
+XXXXXXXX.com   ALTERNET    9509 950801  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9509 950801   556.60 line-9509
+XXXXXXXX.com   PAYMENT     9508 950803  1744.10 7914
+XXXXXXXX.com   ALTERNET    9510 950901  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9510 950901   556.60 line-9510
+XXXXXXXX.com   PAYMENT     9509 950905  1744.10 8203
+XXXXXXXX.com   ALTERNET    9511 951001  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9511 951001   556.60 line-9511
+XXXXXXXX.com   PAYMENT     9510 951003  1744.10 8508
+XXXXXXXX.com   ALTERNET    9512 951101  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9512 951101   556.60 line-9512
+XXXXXXXX.com   PAYMENT     9511 951103  2129.83 8837
+XXXXXXXX.com   ALTERNET    9601 951201  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9601 951201   556.60 line-9601
+XXXXXXXX.com   PAYMENT     9512 951204  2129.83 9131
+XXXXXXXX.com   ALTERNET    9602 960101  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9602 960101   556.60 line-9602
+XXXXXXXX.com   PAYMENT     9601 960103  1744.10 9456
+XXXXXXXX.com   ALTERNET    9603 960201  1187.50 TCP-bt1-128k%5.00
+XXXXXXXX.com   ALTERNET    9603 960201   556.60 line-9603
+XXXXXXXX.com   PAYMENT     9602 960205  1358.37 9834
diff --git a/gawk-5.0.1/test/mpfrbigint.awk b/gawk-5.0.1/test/mpfrbigint.awk
new file mode 100644
index 00000000000..bfdd871ab23
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrbigint.awk
@@ -0,0 +1,11 @@
+BEGIN {
+	x = 5^4^3^2
+	print "# of digits =", length(x)
+	print substr(x, 1, 20), "...", substr(x, length(x) - 19, 20)
+
+	PREC = 1 + 3.321928095 * length(x);	# 1 + digits * log2(10)
+	print "floating-point computation with precision =", PREC
+	y = 5.0^4.0^3.0^2.0
+	print "# of digits =", length(y)
+	print substr(y, 1, 20), "...", substr(y, length(y) - 19, 20)
+}
diff --git a/gawk-5.0.1/test/mpfrbigint.ok b/gawk-5.0.1/test/mpfrbigint.ok
new file mode 100644
index 00000000000..670d4e07fbe
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrbigint.ok
@@ -0,0 +1,5 @@
+# of digits = 183231
+62060698786608744707 ... 92256259918212890625
+floating-point computation with precision = 608681
+# of digits = 183231
+62060698786608744707 ... 92256259918212890625
diff --git a/gawk-5.0.1/test/mpfrbigint2.awk b/gawk-5.0.1/test/mpfrbigint2.awk
new file mode 100644
index 00000000000..42adefaa101
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrbigint2.awk
@@ -0,0 +1,3 @@
+BEGIN { print 0x1F12233445566778DFEF + 0 }
+BEGIN { print strtonum("0x1F12233445566778DFEF") }
+{ print $1 + 0 }
diff --git a/gawk-5.0.1/test/mpfrbigint2.in b/gawk-5.0.1/test/mpfrbigint2.in
new file mode 100644
index 00000000000..9113a79cc5c
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrbigint2.in
@@ -0,0 +1 @@
+0x1F12233445566778DFEF
diff --git a/gawk-5.0.1/test/mpfrbigint2.ok b/gawk-5.0.1/test/mpfrbigint2.ok
new file mode 100644
index 00000000000..2a0d2077f93
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrbigint2.ok
@@ -0,0 +1,3 @@
+146727939091013295464431
+146727939091013295464431
+146727939091013295464431
diff --git a/gawk-5.0.1/test/mpfrexprange.awk b/gawk-5.0.1/test/mpfrexprange.awk
new file mode 100644
index 00000000000..68e95a39f49
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrexprange.awk
@@ -0,0 +1,7 @@
+# test change of allowed exponent range
+BEGIN {
+	x=1.0e-10000
+	print x+0
+	PREC="double"
+	print x+0
+}
diff --git a/gawk-5.0.1/test/mpfrexprange.ok b/gawk-5.0.1/test/mpfrexprange.ok
new file mode 100644
index 00000000000..4700ee2299f
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrexprange.ok
@@ -0,0 +1,2 @@
+1e-10000
+0
diff --git a/gawk-5.0.1/test/mpfrfield.awk b/gawk-5.0.1/test/mpfrfield.awk
new file mode 100644
index 00000000000..35a97b70ea6
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrfield.awk
@@ -0,0 +1,14 @@
+#! /bin/gawk -Mf
+
+NR == 1 {
+	min = $1
+}
+
+{
+	if ($1 < min)
+		min = $1
+}
+
+END {
+	print "min", min
+}
diff --git a/gawk-5.0.1/test/mpfrfield.in b/gawk-5.0.1/test/mpfrfield.in
new file mode 100644
index 00000000000..05d3344483b
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrfield.in
@@ -0,0 +1,10 @@
+7
+9
+1
+3
+9
+1
+9
+5
+0
+8
diff --git a/gawk-5.0.1/test/mpfrfield.ok b/gawk-5.0.1/test/mpfrfield.ok
new file mode 100644
index 00000000000..3736de4d7db
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrfield.ok
@@ -0,0 +1 @@
+min 0
diff --git a/gawk-5.0.1/test/mpfrieee.awk b/gawk-5.0.1/test/mpfrieee.awk
new file mode 100644
index 00000000000..dc6e120dc10
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrieee.awk
@@ -0,0 +1,13 @@
+# Test IEEE-754 binary double format
+BEGIN {
+	x = 1.0e-320
+	i = 0
+	while (x > 0) {
+		printf("%.15e\n", x)
+		x /= 2
+
+		# terminate early when the test is going to fail.
+		if (++i > 50)
+			break
+	}
+}
diff --git a/gawk-5.0.1/test/mpfrieee.ok b/gawk-5.0.1/test/mpfrieee.ok
new file mode 100644
index 00000000000..e88f5c79390
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrieee.ok
@@ -0,0 +1,12 @@
+9.999888671826830e-321
+4.999944335913415e-321
+2.499972167956708e-321
+1.249986083978354e-321
+6.225227137599706e-322
+3.112613568799853e-322
+1.581010066691989e-322
+7.905050333459945e-323
+3.952525166729972e-323
+1.976262583364986e-323
+9.881312916824931e-324
+4.940656458412465e-324
diff --git a/gawk-5.0.1/test/mpfrmemok1.awk b/gawk-5.0.1/test/mpfrmemok1.awk
new file mode 100644
index 00000000000..9331a34df7d
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrmemok1.awk
@@ -0,0 +1,7 @@
+# This program tests that -M works with profiling.
+# It does not do anything real, but there should not be glibc memory
+# errors and it should be valgrind-clean too.
+
+BEGIN {
+	v = 0x0100000000000000000000000000000000
+}
diff --git a/gawk-5.0.1/test/mpfrmemok1.ok b/gawk-5.0.1/test/mpfrmemok1.ok
new file mode 100644
index 00000000000..6bbd0309e80
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrmemok1.ok
@@ -0,0 +1,7 @@
+
+	# BEGIN rule(s)
+
+	BEGIN {
+     1  	v = 0x0100000000000000000000000000000000
+	}
+
diff --git a/gawk-5.0.1/test/mpfrnegzero.awk b/gawk-5.0.1/test/mpfrnegzero.awk
new file mode 100644
index 00000000000..cc6bf65b98f
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrnegzero.awk
@@ -0,0 +1,15 @@
+BEGIN {
+	printf("-0 -> %f, -0.0 -> %f\n", -0, -0.0)
+
+	printf("atan2(+0, -0) = %f\n", atan2(+0, -0))
+	printf("atan2(+0.0, -0.0) = %f\n", atan2(+0.0, -0.0))
+
+	printf("atan2(-0, -0) = %f\n", atan2(-0, -0))
+	printf("atan2(-0.0, -0.0) = %f\n", atan2(-0.0, -0.0))
+
+	printf("atan2(+0, +0) = %f\n", atan2(+0, +0))
+	printf("atan2(+0.0, +0.0) = %f\n", atan2(+0.0, +0.0))
+
+	printf("atan2(-0, +0) = %f\n", atan2(-0, +0))
+	printf("atan2(-0.0, +0.0) = %f\n", atan2(-0.0, +0.0))
+}
diff --git a/gawk-5.0.1/test/mpfrnegzero.ok b/gawk-5.0.1/test/mpfrnegzero.ok
new file mode 100644
index 00000000000..7af162923fc
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrnegzero.ok
@@ -0,0 +1,9 @@
+-0 -> -0.000000, -0.0 -> -0.000000
+atan2(+0, -0) = 3.141593
+atan2(+0.0, -0.0) = 3.141593
+atan2(-0, -0) = -3.141593
+atan2(-0.0, -0.0) = -3.141593
+atan2(+0, +0) = 0.000000
+atan2(+0.0, +0.0) = 0.000000
+atan2(-0, +0) = -0.000000
+atan2(-0.0, +0.0) = -0.000000
diff --git a/gawk-5.0.1/test/mpfrnr.awk b/gawk-5.0.1/test/mpfrnr.awk
new file mode 100644
index 00000000000..1a3b753adce
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrnr.awk
@@ -0,0 +1,10 @@
+# Test NR and FNR for file(s) with records > LONG_MAX
+BEGIN {
+	NR = 0x7FFFFFFF
+}
+BEGINFILE {
+	FNR = 0x7fffffffffffffff
+}
+END {
+	print NR, NR-0x7FFFFFFF, FNR, FNR-0x7fffffffffffffff
+}
diff --git a/gawk-5.0.1/test/mpfrnr.in b/gawk-5.0.1/test/mpfrnr.in
new file mode 100644
index 00000000000..6ad36e52f00
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrnr.in
@@ -0,0 +1,3 @@
+Line 1
+Line 2
+Line 3
diff --git a/gawk-5.0.1/test/mpfrnr.ok b/gawk-5.0.1/test/mpfrnr.ok
new file mode 100644
index 00000000000..e472f8bf339
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrnr.ok
@@ -0,0 +1 @@
+2147483650 3 9223372036854775810 3
diff --git a/gawk-5.0.1/test/mpfrrem.awk b/gawk-5.0.1/test/mpfrrem.awk
new file mode 100644
index 00000000000..fd8bc4d5ed9
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrrem.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	print "15 % 7 =", 15 % 7
+	print "15 % -7 =", 15 % -7
+	print "-15 % 7 =", -15 % 7
+	print "-15 % -7 =", -15 % -7
+}
diff --git a/gawk-5.0.1/test/mpfrrem.ok b/gawk-5.0.1/test/mpfrrem.ok
new file mode 100644
index 00000000000..9101045786b
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrrem.ok
@@ -0,0 +1,4 @@
+15 % 7 = 1
+15 % -7 = 1
+-15 % 7 = -1
+-15 % -7 = -1
diff --git a/gawk-5.0.1/test/mpfrrnd.awk b/gawk-5.0.1/test/mpfrrnd.awk
new file mode 100644
index 00000000000..508ac26bb25
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrrnd.awk
@@ -0,0 +1,15 @@
+BEGIN {
+	N = 22/7
+	printf("   %.15f\n", N)
+
+	printf("*  %.10f\n", N)	# default
+	ROUNDMODE="N"; printf("N  %.10f\n", N)
+	ROUNDMODE="U"; printf("U  %.10f\n", N)
+	ROUNDMODE="D"; printf("D  %.10f\n", N)
+	ROUNDMODE="Z"; printf("Z  %.10f\n", N)
+	N = -N
+	ROUNDMODE="N"; printf("N %.10f\n", N)
+	ROUNDMODE="U"; printf("U %.10f\n", N)
+	ROUNDMODE="D"; printf("D %.10f\n", N)
+	ROUNDMODE="Z"; printf("Z %.10f\n", N)
+}
diff --git a/gawk-5.0.1/test/mpfrrnd.ok b/gawk-5.0.1/test/mpfrrnd.ok
new file mode 100644
index 00000000000..fceb937bdc9
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrrnd.ok
@@ -0,0 +1,10 @@
+   3.142857142857143
+*  3.1428571429
+N  3.1428571429
+U  3.1428571429
+D  3.1428571428
+Z  3.1428571428
+N -3.1428571429
+U -3.1428571428
+D -3.1428571429
+Z -3.1428571428
diff --git a/gawk-5.0.1/test/mpfrrndeval.awk b/gawk-5.0.1/test/mpfrrndeval.awk
new file mode 100644
index 00000000000..1201005226d
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrrndeval.awk
@@ -0,0 +1,35 @@
+# Tests side effects (like caching) on the evaluation (formatting and
+# rounding) of MPFR variables vs literals.
+BEGIN {
+	pi = 3.1416
+	e = 2.7183
+	golden = 1.6180
+
+	# Evaluated as number with (default) OFMT.
+	print pi
+	print e
+	print golden
+	printf "\n"
+
+	# Evaluated as number with (custom) OFMT.
+	OFMT = "%.f"
+	ROUNDMODE = "U";  print "Variable pi U:", pi
+	ROUNDMODE = "D";  print "Variable pi D:", pi
+	ROUNDMODE = "U";  print "Literal  pi U:", 3.1416
+	ROUNDMODE = "D";  print "Literal  pi D:", 3.1416
+	printf "\n"
+
+	# Evaluated as string with (custom) CONVFMT. Absent comma.
+	CONVFMT = "%.f"
+	ROUNDMODE = "D";  print "Variable e D: " e
+	ROUNDMODE = "U";  print "Variable e U: " e
+	ROUNDMODE = "D";  print "Literal  e D: " 2.7183
+	ROUNDMODE = "U";  print "Literal  e U: " 2.7183
+	printf "\n"
+
+	# Evaluated as number with (hardcoded) printf conversion.
+	ROUNDMODE = "N";  printf "Variable golden N: %.f\n", golden
+	ROUNDMODE = "Z";  printf "Variable golden Z: %.f\n", golden
+	ROUNDMODE = "N";  printf "Literal  golden N: %.f\n", 1.6180
+	ROUNDMODE = "Z";  printf "Literal  golden Z: %.f\n", 1.6180
+}
diff --git a/gawk-5.0.1/test/mpfrrndeval.ok b/gawk-5.0.1/test/mpfrrndeval.ok
new file mode 100644
index 00000000000..034b21e0670
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrrndeval.ok
@@ -0,0 +1,18 @@
+3.1416
+2.7183
+1.618
+
+Variable pi U: 4
+Variable pi D: 3
+Literal  pi U: 4
+Literal  pi D: 3
+
+Variable e D: 2
+Variable e U: 3
+Literal  e D: 2
+Literal  e U: 3
+
+Variable golden N: 2
+Variable golden Z: 1
+Literal  golden N: 2
+Literal  golden Z: 1
diff --git a/gawk-5.0.1/test/mpfrsort.awk b/gawk-5.0.1/test/mpfrsort.awk
new file mode 100644
index 00000000000..6f7fa65c8ad
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrsort.awk
@@ -0,0 +1,8 @@
+BEGIN {
+#	s = "1.0 +nan 0.0 -1 +inf -0.0 1 nan 1.0 -nan -inf 2.0"
+	s = "1.0 +nan 0.0 -1 +inf -0.0 1 1.0 -nan -inf 2.0"
+	split(s, a)
+	PROCINFO["sorted_in"] = "@val_num_asc"
+	for (i in a)
+		print a[i]
+}
diff --git a/gawk-5.0.1/test/mpfrsort.ok b/gawk-5.0.1/test/mpfrsort.ok
new file mode 100644
index 00000000000..77a51ecfeaf
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrsort.ok
@@ -0,0 +1,11 @@
+-inf
+-1
+-0.0
+0.0
+1
+1.0
+1.0
+2.0
++inf
++nan
+-nan
diff --git a/gawk-5.0.1/test/mpfrsqrt.awk b/gawk-5.0.1/test/mpfrsqrt.awk
new file mode 100644
index 00000000000..8cc416bb1e4
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrsqrt.awk
@@ -0,0 +1,84 @@
+# Date: Sat, 02 Aug 2014 12:27:00 -0400
+# To: bug-gawk@gnu.org
+# From: Katherine Wasserman <katie@wass.net>
+# Message-ID: <E1XDc9F-0007BX-O1@eggs.gnu.org>
+# Subject: [bug-gawk] GAWK 4.1 SQRT() bug
+# 
+# In version 4.1.60 of GAWK the sqrt() function does not work correctly on bignums.
+# Here's a demo of the problem along with, a function that does work correctly.
+# 
+# Running this program (sqrt-bug.awk):
+# --------------------------------------------------------------------
+
+@load "intdiv"
+BEGIN {
+a=11111111111111111111111111111111111111111111111111111111111
+print sqrt(a^2)
+#print sq_root(a^2)
+
+# ADR: Added for gawk-4.1-stable which doesn't have built-in intdiv() function
+if (PROCINFO["version"] < "4.1.60")
+  print sq_root2(a^2)
+else
+  print sq_root(a^2)
+}
+
+
+function sq_root(x, temp,r,z)
+{  temp=substr(x,1,length(x)/2) + 0 # a good first guess
+   z=0
+   while (abs(z-temp)>1)
+    { z=temp
+      intdiv(x,temp,r)
+      temp=r["quotient"] + temp
+      intdiv(temp,2,r)
+      temp=r["quotient"]
+    }
+   return temp
+}
+
+function sq_root2(x, temp,r,z)
+{  temp=substr(x,1,length(x)/2) + 0 # a good first guess
+   z=0
+   while (abs(z-temp)>1)
+    { z=temp
+      awk_div(x,temp,r)
+      temp=r["quotient"] + temp
+      awk_div(temp,2,r)
+      temp=r["quotient"]
+    }
+   return temp
+}
+
+function abs(x)
+{ return (x<0 ? -x : x)
+}
+# 
+# --------------------------------------------------------------------
+# gawk -M -f sqrt-bug.awk
+# 
+# results in:
+# 11111111111111111261130863809439559987542611609749437808640
+# 11111111111111111111111111111111111111111111111111111111111
+# 
+# Thanks,
+# Katie
+# 
+
+# div --- do integer division
+
+function awk_div(numerator, denominator, result,    i, save_PREC)
+{
+	save_PREC = PREC
+	PREC = 400	# good enough for this test
+
+	split("", result)
+
+	numerator = int(numerator)
+	denominator = int(denominator)
+	result["quotient"] = int(numerator / denominator)
+	result["remainder"] = int(numerator % denominator)
+
+	PREC = save_PREC
+	return 0.0
+}
diff --git a/gawk-5.0.1/test/mpfrsqrt.ok b/gawk-5.0.1/test/mpfrsqrt.ok
new file mode 100644
index 00000000000..16217c782ee
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrsqrt.ok
@@ -0,0 +1,2 @@
+11111111111111111111111111111111111111111111111111111111111
+11111111111111111111111111111111111111111111111111111111111
diff --git a/gawk-5.0.1/test/mpfrstrtonum.awk b/gawk-5.0.1/test/mpfrstrtonum.awk
new file mode 100644
index 00000000000..79d6ad13a60
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrstrtonum.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	x = "011"
+	print x+0	# trigger NUMCUR
+	print strtonum(x)
+}
diff --git a/gawk-5.0.1/test/mpfrstrtonum.ok b/gawk-5.0.1/test/mpfrstrtonum.ok
new file mode 100644
index 00000000000..48a9ed43adf
--- /dev/null
+++ b/gawk-5.0.1/test/mpfrstrtonum.ok
@@ -0,0 +1,2 @@
+11
+9
diff --git a/gawk-5.0.1/test/mpfruplus.ok b/gawk-5.0.1/test/mpfruplus.ok
new file mode 100644
index 00000000000..9f6e83e2646
--- /dev/null
+++ b/gawk-5.0.1/test/mpfruplus.ok
@@ -0,0 +1,3 @@
+1
+1
+-1
diff --git a/gawk-5.0.1/test/mpgforcenum.awk b/gawk-5.0.1/test/mpgforcenum.awk
new file mode 100644
index 00000000000..b2d0b6f1439
--- /dev/null
+++ b/gawk-5.0.1/test/mpgforcenum.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	split("5apple", f)	# make a strnum
+	x = f[1]+0		# force strnum conversion to number or string
+	print typeof(f[1])	# should be string
+}
diff --git a/gawk-5.0.1/test/mpgforcenum.ok b/gawk-5.0.1/test/mpgforcenum.ok
new file mode 100644
index 00000000000..ee8a39c38d2
--- /dev/null
+++ b/gawk-5.0.1/test/mpgforcenum.ok
@@ -0,0 +1 @@
+string
diff --git a/gawk-5.0.1/test/mtchi18n.awk b/gawk-5.0.1/test/mtchi18n.awk
new file mode 100644
index 00000000000..aac6545151c
--- /dev/null
+++ b/gawk-5.0.1/test/mtchi18n.awk
@@ -0,0 +1 @@
+{print match(""," *")}
diff --git a/gawk-5.0.1/test/mtchi18n.in b/gawk-5.0.1/test/mtchi18n.in
new file mode 100644
index 00000000000..139597f9cb0
--- /dev/null
+++ b/gawk-5.0.1/test/mtchi18n.in
@@ -0,0 +1,2 @@
+
+
diff --git a/gawk-5.0.1/test/mtchi18n.ok b/gawk-5.0.1/test/mtchi18n.ok
new file mode 100644
index 00000000000..6ed281c757a
--- /dev/null
+++ b/gawk-5.0.1/test/mtchi18n.ok
@@ -0,0 +1,2 @@
+1
+1
diff --git a/gawk-5.0.1/test/muldimposix.awk b/gawk-5.0.1/test/muldimposix.awk
new file mode 100644
index 00000000000..135b32468e9
--- /dev/null
+++ b/gawk-5.0.1/test/muldimposix.awk
@@ -0,0 +1 @@
+BEGIN { a[1][2] = 3 }
diff --git a/gawk-5.0.1/test/muldimposix.ok b/gawk-5.0.1/test/muldimposix.ok
new file mode 100644
index 00000000000..3594fab0062
--- /dev/null
+++ b/gawk-5.0.1/test/muldimposix.ok
@@ -0,0 +1,2 @@
+gawk: muldimposix.awk:1: fatal: multidimensional arrays are a gawk extension
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/nasty.awk b/gawk-5.0.1/test/nasty.awk
new file mode 100644
index 00000000000..b9c20c8b6cb
--- /dev/null
+++ b/gawk-5.0.1/test/nasty.awk
@@ -0,0 +1,92 @@
+#From hankedr@manatee.dms.auburn.edu  Tue Oct 13 22:15:59 1998
+#Return-Path: <hankedr@manatee.dms.auburn.edu>
+#Received: from cssun.mathcs.emory.edu (cssun.mathcs.emory.edu [170.140.150.1])
+#	by dmx.netvision.net.il (8.9.0.Beta5/8.8.6) with ESMTP id PAA03924
+#	for <arobbins@netvision.net.il>; Tue, 13 Oct 1998 15:32:13 +0200 (IST)
+#Received: from mescaline.gnu.org (we-refuse-to-spy-on-our-users@mescaline.gnu.org [158.121.106.21]) by cssun.mathcs.emory.edu (8.7.5/8.6.9-940818.01cssun) with ESMTP id KAA11644 for <arnold@mathcs.emory.edu>; Tue, 13 Oct 1998 10:22:32 -0400 (EDT)
+#Received: from manatee.dms.auburn.edu (manatee.dms.auburn.edu [131.204.53.104])
+#	by mescaline.gnu.org (8.9.1a/8.9.1) with ESMTP id KAA03250
+#	for <arnold@gnu.org>; Tue, 13 Oct 1998 10:25:32 -0400
+#Received: (from hankedr@localhost)
+#	by manatee.dms.auburn.edu (8.9.1a/8.9.1) id JAA13348;
+#	Tue, 13 Oct 1998 09:22:29 -0500 (CDT)
+#Date: Tue, 13 Oct 1998 09:22:29 -0500 (CDT)
+#Message-Id: <199810131422.JAA13348@manatee.dms.auburn.edu>
+#From: Darrel Hankerson <hankedr@dms.auburn.edu>
+#To: arnold@gnu.org
+#In-reply-to: <199810131313.QAA31784@alpha.netvision.net.il> (message from
+#	Aharon Robbins on Tue, 13 Oct 1998 16:10:36 +0200)
+#Subject: Re: full text of bug report?
+#Mime-Version: 1.0
+#Content-Type: text/plain; charset=US-ASCII
+#X-UIDL: bf3fce492dad4ab030c561e7b2f27d0a
+#Status: RO
+#
+#   Do you have the full text of the	a = a "\n" f() 	bug report?
+#   I can't find it.... I'm not sure there really is a bug.
+#
+#Yes, see below.  
+#
+#His example has unnecessary fragments (in particular, the use of
+#gensub is irrelevant).  As I wrote to you earlier, the interesting
+#question for me is:
+#
+#   Is the concatenation result undefined?  If the result is defined or
+#   implementation-dependent, then gawk has a bug.
+#
+#
+#=== Original report =====================================================
+#From: Attila Torcsvari <arcdev@mail.matav.hu>
+#To: "'bug-gnu-utils@prep.ai.mit.edu'" <bug-gnu-utils@gnu.org>
+#Subject: gawk 3.0.3 bug
+#Date: Thu, 17 Sep 1998 18:12:13 +0200
+#MIME-Version: 1.0
+#Content-Transfer-Encoding: 7bit
+#Resent-From: bug-gnu-utils@gnu.org
+#X-Mailing-List: <bug-gnu-utils@gnu.org> archive/latest/3396
+#X-Loop: bug-gnu-utils@gnu.org
+#Precedence: list
+#Resent-Sender: bug-gnu-utils-request@gnu.org
+#Content-Transfer-Encoding: 7bit
+#Content-Type: text/plain; charset="us-ascii"
+#Content-Length: 618
+#
+#Bug-gnuers,
+#please pass it to the responsible.
+#
+#The following generates something interesting:
+#
+BEGIN{
+a="aaaaa"
+a=a a #10
+a=a a #20
+a=a a #40
+a=a a #80
+a=a a #160
+a=a a # i.e. a is long enough
+
+a=a"\n"f() # this causes the trouble
+print a # guess the result
+}
+
+function f()
+{
+#print "a before: ", a
+#a=gensub("a","123,","g",a) # 'a' will be just a bit longer (4 times, but still should fit: 4*160=640)
+gsub(/a/, "123", a)
+#print "a after: ", a
+return "X"
+}
+#
+#Possible reason:
+#during f the a is modified,
+#it can be even freed, because gensub modifies its size
+#the printout contains trash.
+#
+#Used version: VC compiled WinNT 32 bit Intel.
+#
+#Regards,
+#
+#Attila Torcsvari
+#Arcanum Development
+#
diff --git a/gawk-5.0.1/test/nasty.ok b/gawk-5.0.1/test/nasty.ok
new file mode 100644
index 00000000000..0ee1a73b963
--- /dev/null
+++ b/gawk-5.0.1/test/nasty.ok
@@ -0,0 +1,2 @@
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+X
diff --git a/gawk-5.0.1/test/nasty2.awk b/gawk-5.0.1/test/nasty2.awk
new file mode 100644
index 00000000000..cb0bd6d3385
--- /dev/null
+++ b/gawk-5.0.1/test/nasty2.awk
@@ -0,0 +1,20 @@
+# Based on nasty.awk, test same thing for printf
+#
+BEGIN {
+a="aaaaa"
+a=a a #10
+a=a a #20
+a=a a #40
+a=a a #80
+a=a a #160
+a=a a # i.e. a is long enough
+
+printf("a = %s, f() = %s\n", a, f())
+print a
+}
+
+function f()
+{
+gsub(/a/, "123", a)
+return "X"
+}
diff --git a/gawk-5.0.1/test/nasty2.ok b/gawk-5.0.1/test/nasty2.ok
new file mode 100644
index 00000000000..9b62bf08e32
--- /dev/null
+++ b/gawk-5.0.1/test/nasty2.ok
@@ -0,0 +1,2 @@
+a = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, f() = X
+123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123
diff --git a/gawk-5.0.1/test/nastyparm.awk b/gawk-5.0.1/test/nastyparm.awk
new file mode 100644
index 00000000000..a1f1c8298d8
--- /dev/null
+++ b/gawk-5.0.1/test/nastyparm.awk
@@ -0,0 +1,41 @@
+function biz(baz, bar)
+{
+	print baz, bar
+}
+
+function buz(baz, bar)
+{
+	print length(baz), bar
+}
+
+function buz2(baz, baz1, bar, baz2)
+{
+	print length(baz), length(baz1), bar, length(baz2)
+	baz2[0] = "baz2"
+#	baz[0] = "baz"	# fatal
+}
+
+function buz3(baz)
+{
+	buz2(baz, baz, split("abc", baz, ""), baz)
+} 
+
+
+BEGIN {
+	biz(foo, foo != "")
+
+	biz(fy, fy = "fy")
+
+	biz(fi = 10, fi = 20)
+	print fi
+
+	buz(a, split("abc", a, ""))
+
+	buz2(c, c, split("abc", c, ""), c)
+	print c[0], length(c)
+
+	buz3(d)
+	print d[0], length(d)
+
+	biz(b, split("abc", b, ""))
+}
diff --git a/gawk-5.0.1/test/nastyparm.ok b/gawk-5.0.1/test/nastyparm.ok
new file mode 100644
index 00000000000..c68a1c55899
--- /dev/null
+++ b/gawk-5.0.1/test/nastyparm.ok
@@ -0,0 +1,11 @@
+ 0
+ fy
+10 20
+20
+3 3
+3 3 3 3
+baz2 4
+3 3 3 3
+baz2 4
+gawk: nastyparm.awk:3: fatal: attempt to use array `baz (from b)' in a scalar context
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/negexp.awk b/gawk-5.0.1/test/negexp.awk
new file mode 100644
index 00000000000..3b3a3c06160
--- /dev/null
+++ b/gawk-5.0.1/test/negexp.awk
@@ -0,0 +1 @@
+BEGIN { a = -2; print 10^a }
diff --git a/gawk-5.0.1/test/negexp.ok b/gawk-5.0.1/test/negexp.ok
new file mode 100644
index 00000000000..6e6566ce88e
--- /dev/null
+++ b/gawk-5.0.1/test/negexp.ok
@@ -0,0 +1 @@
+0.01
diff --git a/gawk-5.0.1/test/negrange.awk b/gawk-5.0.1/test/negrange.awk
new file mode 100644
index 00000000000..d70f7308e00
--- /dev/null
+++ b/gawk-5.0.1/test/negrange.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	s = "Volume 8, Numbers 1-2 / January 1971"
+        n = split(s, parts, "[^-A-Za-z0-9]+")
+	print "n =", n
+	for (i = 1; i <= n; i++)
+		printf("s[%d] = \"%s\"\n", i, parts[i])
+}
diff --git a/gawk-5.0.1/test/negrange.ok b/gawk-5.0.1/test/negrange.ok
new file mode 100644
index 00000000000..57f4c8e20db
--- /dev/null
+++ b/gawk-5.0.1/test/negrange.ok
@@ -0,0 +1,7 @@
+n = 6
+s[1] = "Volume"
+s[2] = "8"
+s[3] = "Numbers"
+s[4] = "1-2"
+s[5] = "January"
+s[6] = "1971"
diff --git a/gawk-5.0.1/test/negtime.awk b/gawk-5.0.1/test/negtime.awk
new file mode 100644
index 00000000000..743c6d055bf
--- /dev/null
+++ b/gawk-5.0.1/test/negtime.awk
@@ -0,0 +1,4 @@
+BEGIN {
+then = mktime("1959 12 15 7 00 00")
+print strftime(PROCINFO["strftime"], then)
+}
diff --git a/gawk-5.0.1/test/negtime.ok b/gawk-5.0.1/test/negtime.ok
new file mode 100644
index 00000000000..aa2ae694153
--- /dev/null
+++ b/gawk-5.0.1/test/negtime.ok
@@ -0,0 +1 @@
+Tue Dec 15 07:00:00 GMT 1959
diff --git a/gawk-5.0.1/test/nested.awk b/gawk-5.0.1/test/nested.awk
new file mode 100644
index 00000000000..5284b550243
--- /dev/null
+++ b/gawk-5.0.1/test/nested.awk
@@ -0,0 +1,123 @@
+# From james@ruari-quinn.demon.co.uk  Thu Jun  5 11:43:58 2003
+# Return-Path: <james@ruari-quinn.demon.co.uk>
+# Received: from localhost (skeeve [127.0.0.1])
+# 	by skeeve.com (8.12.5/8.12.5) with ESMTP id h558eVui012655
+# 	for <arnold@localhost>; Thu, 5 Jun 2003 11:43:58 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Thu, 05 Jun 2003 11:43:58 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Thu Jun  5 11:43:29 2003)
+# X-From_: james@ruari-quinn.demon.co.uk Wed Jun  4 20:09:54 2003
+# Received: from smtp1.actcom.net.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id h54H9oY05088 for <arobbins@actcom.co.il>;
+# 	Wed, 4 Jun 2003 20:09:52 +0300 (EET DST)  
+# 	(rfc931-sender: smtp.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by smtp1.actcom.net.il (8.12.8/8.12.8) with ESMTP id h54HB8To002721
+# 	for <arobbins@actcom.co.il>; Wed, 4 Jun 2003 20:11:09 +0300
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by f7.net (8.11.7/8.11.6) with ESMTP id h54H9li15411
+# 	for <arnold@skeeve.com>; Wed, 4 Jun 2003 13:09:47 -0400
+# Received: from monty-python.gnu.org ([199.232.76.173])
+# 	by fencepost.gnu.org with esmtp (Exim 4.20)
+# 	id 19Nbli-0001kD-BL
+# 	for bug-gawk@gnu.org; Wed, 04 Jun 2003 13:09:46 -0400
+# Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.20)
+# 	id 19NbZ5-0004V2-71
+# 	for bug-gawk@gnu.org; Wed, 04 Jun 2003 12:56:43 -0400
+# Received: from cicero.e-mis.co.uk ([212.240.194.162])
+# 	by monty-python.gnu.org with esmtp (Exim 4.20)
+# 	id 19NbYK-0003c7-AP
+# 	for bug-gawk@gnu.org; Wed, 04 Jun 2003 12:55:56 -0400
+# Received: from [10.139.58.254] (helo=tacitus)
+# 	by cicero.e-mis.co.uk with esmtp (Exim 3.35 #1 (Debian))
+# 	id 19NbWO-0007Qv-00
+# 	for <bug-gawk@gnu.org>; Wed, 04 Jun 2003 17:53:56 +0100
+# Received: from james by tacitus with local (Exim 3.36 #1 (Debian))
+# 	id 19NbWO-0000cK-00
+# 	for <bug-gawk@gnu.org>; Wed, 04 Jun 2003 17:53:56 +0100
+# To: bug-gawk@gnu.org
+# Subject: 3.1.0 regression
+# Mail-Copies-To: never
+# From: James Troup <james@nocrew.org>
+# User-Agent: Gnus/5.090017 (Oort Gnus v0.17) Emacs/20.7 (gnu/linux)
+# Date: Wed, 04 Jun 2003 17:53:56 +0100
+# Message-ID: <874r35wzq3.fsf@nocrew.org>
+# MIME-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# Sender: James Troup <james@ruari-quinn.demon.co.uk>
+# X-Spam-Status: No, hits=-3.9 required=5.0
+# 	tests=EMAIL_ATTRIBUTION,SIGNATURE_SHORT_DENSE,SPAM_PHRASE_00_01,
+# 	      USER_AGENT
+# 	version=2.41
+# X-Spam-Level: 
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: R
+# 
+# Hi Aharon,
+# 
+# This bug report comes from the Debian bug tracking system.  You can
+# view the full log at:
+# 
+#  http://bugs.debian.org/188345
+# 
+# Like my other bug, this is a regression from 3.1.0 and I've reproduced
+# this problem with 3.1.2d.
+# 
+# "Nikita V. Youshchenko" <yoush@cs.msu.su> writes:
+# 
+# | Package: gawk
+# | Version: 1:3.1.2-2
+# | Severity: normal
+# | Tags: sid
+# | 
+# | After upgrading gawk from woody to sid, I found one of my scripts not
+# | working. I explored this a little and found minimal script to reproduce
+# | the problem.
+# | 
+# | File bug.awk is the following:
+# | 
+BEGIN  {
+  WI_total = 0
+}
+{
+  WI_total++
+  {
+    split (  $1, sws, "_" )
+    a = sws[1]
+  }
+  print(sws[1])
+  print(a)
+}
+# | 
+# | The second print should output the same what first print poutputs, but
+# | with gawk 3.1.2-2 it outputs nothing:
+# | > echo a_b | gawk -f bug.awk
+# | a
+# | 
+# | >
+# | 
+# | With gawk from stable I get what expexted:
+# | > echo a_b | gawk -f bug.awk
+# | a
+# | a
+# | >
+# | 
+# | If I remove "WI_total++" line, bug disapperas
+# | 
+# | -- System Information:
+# | Debian Release: 3.0
+# | Architecture: i386
+# | Kernel: Linux zigzag 2.4.19 16:49:13 MSK 2003 i686
+# | Locale: LANG=ru_RU.KOI8-R, LC_CTYPE=ru_RU.KOI8-R
+# | 
+# | Versions of packages gawk depends on:
+# | ii  libc6                         2.3.1-16   GNU C Library: Shared libraries an
+# | 
+# | -- no debconf information
+# 
+# -- 
+# James
+# 
diff --git a/gawk-5.0.1/test/nested.in b/gawk-5.0.1/test/nested.in
new file mode 100644
index 00000000000..31b658b1292
--- /dev/null
+++ b/gawk-5.0.1/test/nested.in
@@ -0,0 +1 @@
+a_b
diff --git a/gawk-5.0.1/test/nested.ok b/gawk-5.0.1/test/nested.ok
new file mode 100644
index 00000000000..7e8a1653bf2
--- /dev/null
+++ b/gawk-5.0.1/test/nested.ok
@@ -0,0 +1,2 @@
+a
+a
diff --git a/gawk-5.0.1/test/next.ok b/gawk-5.0.1/test/next.ok
new file mode 100644
index 00000000000..0229bd0ae0d
--- /dev/null
+++ b/gawk-5.0.1/test/next.ok
@@ -0,0 +1,4 @@
+gawk: cmd. line:1: fatal: `next' cannot be called from a `BEGIN' rule
+gawk: cmd. line:1: fatal: `next' cannot be called from a `END' rule
+gawk: cmd. line:1: fatal: `next' cannot be called from a `BEGINFILE' rule
+gawk: cmd. line:1: fatal: `next' cannot be called from a `ENDFILE' rule
diff --git a/gawk-5.0.1/test/next.sh b/gawk-5.0.1/test/next.sh
new file mode 100755
index 00000000000..77354a25a0c
--- /dev/null
+++ b/gawk-5.0.1/test/next.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# next.sh --- test next invoked in various ways
+
+if [ "$AWK" = "" ]
+then
+	echo $0: You must set AWK >&2
+	exit 1
+fi
+
+# non-fatal 
+$AWK '{next}' /dev/null
+$AWK 'function f() { next}; {f()}' /dev/null
+# fatal
+$AWK 'function f() { next}; BEGIN{f()}'
+$AWK 'function f() { next}; {f()}; END{f()}' /dev/null
+$AWK 'function f() { next}; BEGINFILE{f()}'
+$AWK 'function f() { next}; {f()}; ENDFILE{f()}' /dev/null
+
+exit 0	# for make
diff --git a/gawk-5.0.1/test/nfldstr.awk b/gawk-5.0.1/test/nfldstr.awk
new file mode 100644
index 00000000000..09b4a2b8a26
--- /dev/null
+++ b/gawk-5.0.1/test/nfldstr.awk
@@ -0,0 +1,13 @@
+$1 == 0 {
+	print "bug"
+}
+{
+	$0 = "0" 
+	if (!$0)
+		print "another bug"
+	$0 = a = "0" 
+	if (!$0)
+		print "yet another bug"
+	if ($1)
+		print "a buggie"
+}
diff --git a/gawk-5.0.1/test/nfldstr.in b/gawk-5.0.1/test/nfldstr.in
new file mode 100644
index 00000000000..8b137891791
--- /dev/null
+++ b/gawk-5.0.1/test/nfldstr.in
@@ -0,0 +1 @@
+
diff --git a/gawk-5.0.1/test/nfldstr.ok b/gawk-5.0.1/test/nfldstr.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/nfloop.awk b/gawk-5.0.1/test/nfloop.awk
new file mode 100644
index 00000000000..c37700ac48f
--- /dev/null
+++ b/gawk-5.0.1/test/nfloop.awk
@@ -0,0 +1,8 @@
+BEGIN {
+	$0 = "aaa"
+	NF = 10
+	for (j = 2; j <= NF; ++j) {
+		$j = "_"
+	}
+	print
+}
diff --git a/gawk-5.0.1/test/nfloop.ok b/gawk-5.0.1/test/nfloop.ok
new file mode 100644
index 00000000000..cc683eae66a
--- /dev/null
+++ b/gawk-5.0.1/test/nfloop.ok
@@ -0,0 +1 @@
+aaa _ _ _ _ _ _ _ _ _
diff --git a/gawk-5.0.1/test/nfneg.awk b/gawk-5.0.1/test/nfneg.awk
new file mode 100644
index 00000000000..6d54ee0c4c3
--- /dev/null
+++ b/gawk-5.0.1/test/nfneg.awk
@@ -0,0 +1 @@
+BEGIN { NF -= 2 ; print }
diff --git a/gawk-5.0.1/test/nfneg.ok b/gawk-5.0.1/test/nfneg.ok
new file mode 100644
index 00000000000..bcdb0376296
--- /dev/null
+++ b/gawk-5.0.1/test/nfneg.ok
@@ -0,0 +1,2 @@
+gawk: nfneg.awk:1: fatal: NF set to negative value
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/nfset.awk b/gawk-5.0.1/test/nfset.awk
new file mode 100644
index 00000000000..09ebd083545
--- /dev/null
+++ b/gawk-5.0.1/test/nfset.awk
@@ -0,0 +1 @@
+{ NF = 5 ; print }
diff --git a/gawk-5.0.1/test/nfset.in b/gawk-5.0.1/test/nfset.in
new file mode 100644
index 00000000000..43329b51636
--- /dev/null
+++ b/gawk-5.0.1/test/nfset.in
@@ -0,0 +1,5 @@
+1 2
+1 2 3 4
+1 2 3 4 5
+1 2 3 4 5 6 7 8
+1
diff --git a/gawk-5.0.1/test/nfset.ok b/gawk-5.0.1/test/nfset.ok
new file mode 100644
index 00000000000..3ba48aec4b8
--- /dev/null
+++ b/gawk-5.0.1/test/nfset.ok
@@ -0,0 +1,5 @@
+1 2   
+1 2 3 4 
+1 2 3 4 5
+1 2 3 4 5
+1    
diff --git a/gawk-5.0.1/test/nlfldsep.awk b/gawk-5.0.1/test/nlfldsep.awk
new file mode 100644
index 00000000000..4fac81da30d
--- /dev/null
+++ b/gawk-5.0.1/test/nlfldsep.awk
@@ -0,0 +1,2 @@
+BEGIN { RS = "A" }
+{print NF; for (i = 1; i <= NF; i++) print $i ; print ""}
diff --git a/gawk-5.0.1/test/nlfldsep.in b/gawk-5.0.1/test/nlfldsep.in
new file mode 100644
index 00000000000..7b2317f071c
--- /dev/null
+++ b/gawk-5.0.1/test/nlfldsep.in
@@ -0,0 +1,5 @@
+some stuff
+more stuffA
+junk
+stuffA
+final
diff --git a/gawk-5.0.1/test/nlfldsep.ok b/gawk-5.0.1/test/nlfldsep.ok
new file mode 100644
index 00000000000..66849161faa
--- /dev/null
+++ b/gawk-5.0.1/test/nlfldsep.ok
@@ -0,0 +1,13 @@
+4
+some
+stuff
+more
+stuff
+
+2
+junk
+stuff
+
+1
+final
+
diff --git a/gawk-5.0.1/test/nlinstr.awk b/gawk-5.0.1/test/nlinstr.awk
new file mode 100644
index 00000000000..f403715c906
--- /dev/null
+++ b/gawk-5.0.1/test/nlinstr.awk
@@ -0,0 +1,8 @@
+BEGIN { RS = "" }
+
+{
+	if (/^@/)
+		print "not ok"
+	else
+		print "ok"
+}
diff --git a/gawk-5.0.1/test/nlinstr.in b/gawk-5.0.1/test/nlinstr.in
new file mode 100644
index 00000000000..65aaaf9e46e
--- /dev/null
+++ b/gawk-5.0.1/test/nlinstr.in
@@ -0,0 +1,2 @@
+line 1
+@line 2
diff --git a/gawk-5.0.1/test/nlinstr.ok b/gawk-5.0.1/test/nlinstr.ok
new file mode 100644
index 00000000000..9766475a418
--- /dev/null
+++ b/gawk-5.0.1/test/nlinstr.ok
@@ -0,0 +1 @@
+ok
diff --git a/gawk-5.0.1/test/nlstrina.awk b/gawk-5.0.1/test/nlstrina.awk
new file mode 100644
index 00000000000..41dbd5f1230
--- /dev/null
+++ b/gawk-5.0.1/test/nlstrina.awk
@@ -0,0 +1,77 @@
+# From E.Ab@chem.rug.nl  Wed Aug  2 13:16:53 2000
+# Received: from mail.actcom.co.il
+# 	by localhost with POP3 (fetchmail-5.1.2)
+# 	for arnold@localhost (single-drop); Wed, 02 Aug 2000 13:16:53 -0400 (EDT)
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.9.1a/actcom-0.2) id MAA21699 for <arobbins@actcom.co.il>;
+# 	Wed, 2 Aug 2000 12:20:38 +0300 (EET DST)  
+# 	(rfc931-sender: lmail.actcom.co.il [192.114.47.13])
+# Received: from freefriends.org (freefriends.org [63.85.55.109])
+# 	by lmail.actcom.co.il (8.9.3/8.9.1) with ESMTP id LAA22723
+# 	for <arobbins@actcom.co.il>; Wed, 2 Aug 2000 11:23:22 +0300
+# Received: from mescaline.gnu.org (mescaline.gnu.org [158.121.106.21])
+# 	by freefriends.org (8.9.3/8.9.3) with ESMTP id FAA23582
+# 	for <arnold@skeeve.com>; Wed, 2 Aug 2000 05:18:59 -0400
+# Received: from dep.chem.rug.nl (dep.chem.rug.nl [129.125.7.81])
+# 	by mescaline.gnu.org (8.9.1a/8.9.1) with ESMTP id FAA30670;
+# 	Wed, 2 Aug 2000 05:20:24 -0400
+# Received: from rugmd34.chem.rug.nl (rugmd34.chem.rug.nl [129.125.42.34])
+# 	by dep.chem.rug.nl (8.9.3/8.9.3/Debian 8.9.3-21) with ESMTP id LAA17089;
+# 	Wed, 2 Aug 2000 11:20:23 +0200
+# Received: from chem.rug.nl (localhost [127.0.0.1]) by rugmd34.chem.rug.nl (980427.SGI.8.8.8/980728.SGI.AUTOCF) via ESMTP id LAA25392; Wed, 2 Aug 2000 11:20:22 +0200 (MDT)
+# Sender: E.Ab@chem.rug.nl
+# Message-ID: <3987E7D5.2BDC5FD3@chem.rug.nl>
+# Date: Wed, 02 Aug 2000 11:20:21 +0200
+# From: Eiso AB <E.Ab@chem.rug.nl>
+# X-Mailer: Mozilla 4.72C-SGI [en] (X11; I; IRIX 6.5 IP32)
+# X-Accept-Language: en
+# MIME-Version: 1.0
+# To: bug-gnu-utils@gnu.org, arnold@gnu.org
+# Subject: bug? [GNU Awk 3.0.5]
+#  
+# Content-Type: text/plain; charset=us-ascii
+# Content-Transfer-Encoding: 7bit
+# X-UIDL: \f8"!(8G!!ZL$#!h>X!!
+# Status: R
+# 
+# hi Arnold,
+# 
+# 
+# Please try the script beneath...
+# I'm not sure if this is a bug or not, but I would expect 
+# the empty string as an array index just to be treated 
+# like any other string
+# 
+# so if ("" in ta) would be true, and for ( i in ta ) should loop only once.
+# 
+BEGIN {
+        v=""
+        ta[v]++
+        if ( v in ta) print "a",v,++ta[v],ta[v]
+	print "b",v,++ta[v],ta[v]
+        for( i in ta) print "c",++c,i,ta[i]
+} 
+# 
+# goodluck, Eiso
+# 
+# -- 
+#                                 _________
+# _______________________________/ Eiso AB \_________________________
+# 
+#            o                 
+#                                               
+#                  o               Dept. of Biochemistry
+#                                  University of Groningen		
+#                                  The Netherlands                      
+#                   o  
+#             . .     
+#          o   ^                   mailto:eiso@chem.rug.nl
+#          |   -   _               mailto:eiso@dds.nl
+#           \__|__/                http://md.chem.rug.nl/~eiso
+#              |	                 tel 4326
+#              |
+#             / \
+#            /   \
+#            |   |
+# ________ ._|   |_. ________________________________________________
+# 
diff --git a/gawk-5.0.1/test/nlstrina.ok b/gawk-5.0.1/test/nlstrina.ok
new file mode 100644
index 00000000000..690f1a2fac7
--- /dev/null
+++ b/gawk-5.0.1/test/nlstrina.ok
@@ -0,0 +1,3 @@
+a  2 2
+b  3 3
+c 1  3
diff --git a/gawk-5.0.1/test/nlstringtest-nogettext.ok b/gawk-5.0.1/test/nlstringtest-nogettext.ok
new file mode 100644
index 00000000000..3834800c170
--- /dev/null
+++ b/gawk-5.0.1/test/nlstringtest-nogettext.ok
@@ -0,0 +1,5 @@
+2 pieces of cake
+%s is replaced by %s.
+%s is replaced by %s.
+
+FF is replaced by EUR.
diff --git a/gawk-5.0.1/test/nlstringtest.awk b/gawk-5.0.1/test/nlstringtest.awk
new file mode 100644
index 00000000000..da0d91b02d6
--- /dev/null
+++ b/gawk-5.0.1/test/nlstringtest.awk
@@ -0,0 +1,12 @@
+BEGIN {
+  n = 2
+  TEXTDOMAIN = "nlstringtest"
+#  bindtextdomain ("./")
+  bindtextdomain (ARGV[1])
+
+  printf dcngettext ("a piece of cake", "%d pieces of cake", n) "\n", n
+
+  print _"%s is replaced by %s."
+  print _"%s is replaced by %s." "\n"
+  printf _"%s is replaced by %s." "\n", "FF", "EUR"
+}
diff --git a/gawk-5.0.1/test/nlstringtest.ok b/gawk-5.0.1/test/nlstringtest.ok
new file mode 100644
index 00000000000..c06d9e4658c
--- /dev/null
+++ b/gawk-5.0.1/test/nlstringtest.ok
@@ -0,0 +1,5 @@
+2 morceaux de gateau
+%2$s remplace %1$s.
+%2$s remplace %1$s.
+
+EUR remplace FF.
diff --git a/gawk-5.0.1/test/nlstringtest.po b/gawk-5.0.1/test/nlstringtest.po
new file mode 100644
index 00000000000..6423ce387ee
--- /dev/null
+++ b/gawk-5.0.1/test/nlstringtest.po
@@ -0,0 +1,16 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+# Les gateaux allemands sont les meilleurs du monde.
+#, awk-format
+msgid "a piece of cake"
+msgid_plural "%d pieces of cake"
+msgstr[0] "un morceau de gateau"
+msgstr[1] "%d morceaux de gateau"
+
+# Reverse the arguments.
+#, awk-format
+msgid "%s is replaced by %s."
+msgstr "%2$s remplace %1$s."
diff --git a/gawk-5.0.1/test/noeffect.awk b/gawk-5.0.1/test/noeffect.awk
new file mode 100644
index 00000000000..4be76b1e658
--- /dev/null
+++ b/gawk-5.0.1/test/noeffect.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	s == "hello, world";
+	s + 1
+	;;
+	"s" 1
+	"a"
+	42
+	q = 42
+	q
+}
diff --git a/gawk-5.0.1/test/noeffect.ok b/gawk-5.0.1/test/noeffect.ok
new file mode 100644
index 00000000000..9778a4bbe4f
--- /dev/null
+++ b/gawk-5.0.1/test/noeffect.ok
@@ -0,0 +1,8 @@
+gawk: noeffect.awk:2: warning: statement may have no effect
+gawk: noeffect.awk:3: warning: statement may have no effect
+gawk: noeffect.awk:5: warning: statement may have no effect
+gawk: noeffect.awk:2: warning: reference to uninitialized variable `s'
+gawk: noeffect.awk:3: warning: reference to uninitialized variable `s'
+gawk: noeffect.awk:6: warning: statement has no effect
+gawk: noeffect.awk:7: warning: statement has no effect
+gawk: noeffect.awk:9: warning: statement has no effect
diff --git a/gawk-5.0.1/test/nofile.ok b/gawk-5.0.1/test/nofile.ok
new file mode 100644
index 00000000000..eff8c0431e1
--- /dev/null
+++ b/gawk-5.0.1/test/nofile.ok
@@ -0,0 +1,2 @@
+gawk: fatal: cannot open file `no/such/file' for reading (No such file or directory)
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/nofmtch.awk b/gawk-5.0.1/test/nofmtch.awk
new file mode 100644
index 00000000000..2ea2249209a
--- /dev/null
+++ b/gawk-5.0.1/test/nofmtch.awk
@@ -0,0 +1 @@
+BEGIN { printf "%3\n" }
diff --git a/gawk-5.0.1/test/nofmtch.ok b/gawk-5.0.1/test/nofmtch.ok
new file mode 100644
index 00000000000..297d1592d43
--- /dev/null
+++ b/gawk-5.0.1/test/nofmtch.ok
@@ -0,0 +1,2 @@
+gawk: nofmtch.awk:1: warning: [s]printf: format specifier does not have control letter
+%3
diff --git a/gawk-5.0.1/test/noloop1.awk b/gawk-5.0.1/test/noloop1.awk
new file mode 100644
index 00000000000..ae461e34958
--- /dev/null
+++ b/gawk-5.0.1/test/noloop1.awk
@@ -0,0 +1,70 @@
+# From jhart@avcnet.bates.edu  Sun Oct  6 16:05:21 2002
+# Return-Path: <jhart@avcnet.bates.edu>
+# Received: from localhost (skeeve [127.0.0.1])
+# 	by skeeve.com (8.11.6/8.11.6) with ESMTP id g96D5Jf28053
+# 	for <arnold@localhost>; Sun, 6 Oct 2002 16:05:21 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Sun, 06 Oct 2002 16:05:21 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Sun Oct  6 16:06:39 2002)
+# X-From_: jhart@avcnet.bates.edu Sun Oct  6 15:31:59 2002
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id g96CVrS27315 for <arobbins@actcom.co.il>;
+# 	Sun, 6 Oct 2002 15:31:54 +0300 (EET DST)  
+# 	(rfc931-sender: mail.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by lmail.actcom.co.il (8.11.6/8.11.6) with ESMTP id g96CVqY01629
+# 	for <arobbins@actcom.co.il>; Sun, 6 Oct 2002 15:31:52 +0300
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by f7.net (8.11.6/8.11.6) with ESMTP id g96CVp418974
+# 	for <arnold@skeeve.com>; Sun, 6 Oct 2002 08:31:51 -0400
+# Received: from monty-python.gnu.org ([199.232.76.173])
+# 	by fencepost.gnu.org with esmtp (Exim 4.10)
+# 	id 17yAZa-00055o-00
+# 	for bug-gawk@gnu.org; Sun, 06 Oct 2002 08:31:50 -0400
+# Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10)
+# 	id 17yAZE-0007eB-00
+# 	for bug-gawk@gnu.org; Sun, 06 Oct 2002 08:31:29 -0400
+# Received: from avcnet.bates.edu ([134.181.128.62])
+# 	by monty-python.gnu.org with esmtp (Exim 4.10)
+# 	id 17yAZ9-0007X3-00
+# 	for bug-gawk@gnu.org; Sun, 06 Oct 2002 08:31:23 -0400
+# Received: from a5514a.bates.edu (www.bates.edu [134.181.128.62])
+# 	by avcnet.bates.edu (8.9.3/8.9.3) with ESMTP id IAA05400
+# 	for <bug-gawk@gnu.org>; Sun, 6 Oct 2002 08:31:20 -0400
+# Date: Sun, 6 Oct 2002 08:36:54 -0400
+# Mime-Version: 1.0 (Apple Message framework v482)
+# Content-Type: text/plain; charset=US-ASCII; format=flowed
+# Subject: Infinite loop in sub/gsub
+# From: jhart@avcnet.bates.edu
+# To: bug-gawk@gnu.org
+# Content-Transfer-Encoding: 7bit
+# Message-Id: <4BC4A4F0-D928-11D6-8E78-00039384A9CC@mail.avcnet.org>
+# X-Mailer: Apple Mail (2.482)
+# X-Spam-Status: No, hits=0.3 required=5.0
+# 	tests=NO_REAL_NAME,SPAM_PHRASE_00_01,USER_AGENT_APPLEMAIL
+# 	version=2.41
+# X-Spam-Level: 
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: RO
+# 
+# This command line:
+# 
+# echo "''Italics with an apostrophe'' embedded''"|gawk -f test.awk
+# 
+# where test.awk contains this instruction:
+# 
+/''/  { sub(/''(.?[^']+)*''/, "<em>&</em>"); }
+# 
+# puts gawk 3.11 into an infinite loop. Whereas, this command works:
+# 
+# echo "''Italics with an apostrophe' embedded''"|gawk -f test.awk
+# 
+# 
+# 
+# Platform: Mac OS X 10.1.5/Darwin Kernel Version 5.5: Thu May 30 14:51:26 
+# PDT 2002; root:xnu/xnu-201.42.3.obj~1/RELEASE_PPC
+# 
+# 
diff --git a/gawk-5.0.1/test/noloop1.in b/gawk-5.0.1/test/noloop1.in
new file mode 100644
index 00000000000..da2c2f24fac
--- /dev/null
+++ b/gawk-5.0.1/test/noloop1.in
@@ -0,0 +1 @@
+''Italics with an apostrophe'' embedded''
diff --git a/gawk-5.0.1/test/noloop1.ok b/gawk-5.0.1/test/noloop1.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/noloop2.awk b/gawk-5.0.1/test/noloop2.awk
new file mode 100644
index 00000000000..ae461e34958
--- /dev/null
+++ b/gawk-5.0.1/test/noloop2.awk
@@ -0,0 +1,70 @@
+# From jhart@avcnet.bates.edu  Sun Oct  6 16:05:21 2002
+# Return-Path: <jhart@avcnet.bates.edu>
+# Received: from localhost (skeeve [127.0.0.1])
+# 	by skeeve.com (8.11.6/8.11.6) with ESMTP id g96D5Jf28053
+# 	for <arnold@localhost>; Sun, 6 Oct 2002 16:05:21 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Sun, 06 Oct 2002 16:05:21 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Sun Oct  6 16:06:39 2002)
+# X-From_: jhart@avcnet.bates.edu Sun Oct  6 15:31:59 2002
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id g96CVrS27315 for <arobbins@actcom.co.il>;
+# 	Sun, 6 Oct 2002 15:31:54 +0300 (EET DST)  
+# 	(rfc931-sender: mail.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by lmail.actcom.co.il (8.11.6/8.11.6) with ESMTP id g96CVqY01629
+# 	for <arobbins@actcom.co.il>; Sun, 6 Oct 2002 15:31:52 +0300
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by f7.net (8.11.6/8.11.6) with ESMTP id g96CVp418974
+# 	for <arnold@skeeve.com>; Sun, 6 Oct 2002 08:31:51 -0400
+# Received: from monty-python.gnu.org ([199.232.76.173])
+# 	by fencepost.gnu.org with esmtp (Exim 4.10)
+# 	id 17yAZa-00055o-00
+# 	for bug-gawk@gnu.org; Sun, 06 Oct 2002 08:31:50 -0400
+# Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10)
+# 	id 17yAZE-0007eB-00
+# 	for bug-gawk@gnu.org; Sun, 06 Oct 2002 08:31:29 -0400
+# Received: from avcnet.bates.edu ([134.181.128.62])
+# 	by monty-python.gnu.org with esmtp (Exim 4.10)
+# 	id 17yAZ9-0007X3-00
+# 	for bug-gawk@gnu.org; Sun, 06 Oct 2002 08:31:23 -0400
+# Received: from a5514a.bates.edu (www.bates.edu [134.181.128.62])
+# 	by avcnet.bates.edu (8.9.3/8.9.3) with ESMTP id IAA05400
+# 	for <bug-gawk@gnu.org>; Sun, 6 Oct 2002 08:31:20 -0400
+# Date: Sun, 6 Oct 2002 08:36:54 -0400
+# Mime-Version: 1.0 (Apple Message framework v482)
+# Content-Type: text/plain; charset=US-ASCII; format=flowed
+# Subject: Infinite loop in sub/gsub
+# From: jhart@avcnet.bates.edu
+# To: bug-gawk@gnu.org
+# Content-Transfer-Encoding: 7bit
+# Message-Id: <4BC4A4F0-D928-11D6-8E78-00039384A9CC@mail.avcnet.org>
+# X-Mailer: Apple Mail (2.482)
+# X-Spam-Status: No, hits=0.3 required=5.0
+# 	tests=NO_REAL_NAME,SPAM_PHRASE_00_01,USER_AGENT_APPLEMAIL
+# 	version=2.41
+# X-Spam-Level: 
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: RO
+# 
+# This command line:
+# 
+# echo "''Italics with an apostrophe'' embedded''"|gawk -f test.awk
+# 
+# where test.awk contains this instruction:
+# 
+/''/  { sub(/''(.?[^']+)*''/, "<em>&</em>"); }
+# 
+# puts gawk 3.11 into an infinite loop. Whereas, this command works:
+# 
+# echo "''Italics with an apostrophe' embedded''"|gawk -f test.awk
+# 
+# 
+# 
+# Platform: Mac OS X 10.1.5/Darwin Kernel Version 5.5: Thu May 30 14:51:26 
+# PDT 2002; root:xnu/xnu-201.42.3.obj~1/RELEASE_PPC
+# 
+# 
diff --git a/gawk-5.0.1/test/noloop2.in b/gawk-5.0.1/test/noloop2.in
new file mode 100644
index 00000000000..b5cb226a073
--- /dev/null
+++ b/gawk-5.0.1/test/noloop2.in
@@ -0,0 +1 @@
+''Italics with an apostrophe' embedded''
diff --git a/gawk-5.0.1/test/noloop2.ok b/gawk-5.0.1/test/noloop2.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/nondec.awk b/gawk-5.0.1/test/nondec.awk
new file mode 100644
index 00000000000..a070c910c84
--- /dev/null
+++ b/gawk-5.0.1/test/nondec.awk
@@ -0,0 +1 @@
+BEGIN  { print 0x81c3e8, 0x744018, 00.34 }
diff --git a/gawk-5.0.1/test/nondec.ok b/gawk-5.0.1/test/nondec.ok
new file mode 100644
index 00000000000..8f0404a907d
--- /dev/null
+++ b/gawk-5.0.1/test/nondec.ok
@@ -0,0 +1 @@
+8504296 7618584 0.34
diff --git a/gawk-5.0.1/test/nondec2.awk b/gawk-5.0.1/test/nondec2.awk
new file mode 100644
index 00000000000..23f9053baee
--- /dev/null
+++ b/gawk-5.0.1/test/nondec2.awk
@@ -0,0 +1,108 @@
+# From arnold@f7.net  Wed Jun 15 08:25:21 2005
+# Return-Path: <arnold@f7.net>
+# Received: from localhost (skeeve [127.0.0.1])
+# 	by skeeve.com (8.12.11/8.12.11) with ESMTP id j5F5P3VC014658
+# 	for <arnold@localhost>; Wed, 15 Jun 2005 08:25:21 +0300
+# Received: from pop.012.net.il [84.95.5.221]
+# 	by localhost with POP3 (fetchmail-6.2.5)
+# 	for arnold@localhost (single-drop); Wed, 15 Jun 2005 08:25:21 +0300 (IDT)
+# Received: from mtain2.012.net.il ([10.220.5.4])
+#  by i_mss3.012.net.il (HyperSendmail v2004.12)
+#  with ESMTP id <0II300LQOPS7DA10@i_mss3.012.net.il> for arobbins@012.net.il;
+#  Wed, 15 Jun 2005 04:07:19 +0300 (IDT)
+# Received: from VSCAN1 ([10.220.20.1])
+#  by i_mtain2.012.net.il (HyperSendmail v2004.12)
+#  with ESMTP id <0II300ETQPS7IEZ4@i_mtain2.012.net.il> for arobbins@012.net.il
+#  (ORCPT arobbins@012.net.il); Wed, 15 Jun 2005 04:07:19 +0300 (IDT)
+# Received: from i_mtain2.012.net.il ([10.220.5.4])
+#  by VSCAN1 with InterScan Messaging Security Suite; Wed,
+#  15 Jun 2005 04:03:15 +0300
+# Received: from f7.net ([209.61.216.22])
+#  by i_mtain2.012.net.il (HyperSendmail v2004.12)
+#  with ESMTP id <0II300H7VPS5P1O2@i_mtain2.012.net.il> for arobbins@012.net.il;
+#  Wed, 15 Jun 2005 04:07:18 +0300 (IDT)
+# Received: (from arnold@localhost)	by f7.net (8.11.7-20030920/8.11.7)
+#  id j5F13DT21530	for arobbins@012.net.il; Tue, 14 Jun 2005 21:03:14 -0400
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by f7.net (8.11.7-20030920/8.11.7) with ESMTP id j5F136p21454	for
+#  <arnold@skeeve.com>; Tue, 14 Jun 2005 21:03:06 -0400
+# Received: from monty-python.gnu.org ([199.232.76.173])
+# 	by fencepost.gnu.org with esmtp (Exim 4.34)
+# 	id 1DiMJ6-0002fe-Av	for bug-gawk@gnu.org; Tue, 14 Jun 2005 21:03:04 -0400
+# Received: from Debian-exim by monty-python.gnu.org with spam-scanned
+#  (Exim 4.34)	id 1DiMIp-0003lM-I4	for bug-gawk@gnu.org; Tue,
+#  14 Jun 2005 21:02:47 -0400
+# Received: from [66.187.233.31] (helo=mx1.redhat.com)
+# 	by monty-python.gnu.org with esmtp (TLS-1.0:DHE_RSA_3DES_EDE_CBC_SHA:24)
+# 	(Exim 4.34)	id 1DiMIp-0003l4-8g	for bug-gawk@gnu.org; Tue,
+#  14 Jun 2005 21:02:47 -0400
+# Received: from int-mx1.corp.redhat.com
+#  (int-mx1.corp.redhat.com [172.16.52.254])	by mx1.redhat.com (8.12.11/8.12.11)
+#  with ESMTP id j5F11EGn027669	for <bug-gawk@gnu.org>; Tue,
+#  14 Jun 2005 21:01:14 -0400
+# Received: from lacrosse.corp.redhat.com
+#  (lacrosse.corp.redhat.com [172.16.52.154])	by int-mx1.corp.redhat.com
+#  (8.11.6/8.11.6) with ESMTP id j5F11Eu01536	for <bug-gawk@gnu.org>; Tue,
+#  14 Jun 2005 21:01:14 -0400
+# Received: from [192.168.7.71] (vpn50-10.rdu.redhat.com [172.16.50.10])
+# 	by lacrosse.corp.redhat.com (8.11.6/8.11.6) with ESMTP id j5F118s03225	for
+#  <bug-gawk@gnu.org>; Tue, 14 Jun 2005 21:01:09 -0400
+# Date: Tue, 14 Jun 2005 17:57:55 -0700
+# From: Ulrich Drepper <drepper@redhat.com>
+# Subject: non-decimal variable parameters cause crashes
+# To: bug-gawk@gnu.org
+# Message-id: <42AF7D13.5010901@redhat.com>
+# Organization: Red Hat, Inc.
+# MIME-version: 1.0
+# Content-type: multipart/signed; micalg=pgp-sha1;
+#  protocol="application/pgp-signature";
+#  boundary=------------enig9DEC74140126C224E7DE3E54
+# X-Accept-Language: en-us, en
+# X-Enigmail-Version: 0.91.0.0
+# User-Agent: Mozilla Thunderbird 1.0.2-6 (X11/20050513)
+# Original-recipient: rfc822;arobbins@012.net.il
+# X-Spam-Checker-Version: SpamAssassin 2.63 (2004-01-11) on skeeve.com
+# X-Spam-Level: 
+# X-Spam-Status: No, hits=-4.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham 
+# 	version=2.63
+# Status: R
+# 
+# This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
+# --------------enig9DEC74140126C224E7DE3E54
+# Content-Type: text/plain; charset=UTF-8
+# Content-Transfer-Encoding: quoted-printable
+# 
+# Running
+# 
+#   gawk --non-decimal-data -v a=3D0x1 'BEGIN { print a+0 }'
+# 
+# currently crashes.  More details including a patch at
+# 
+# https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=3D160421
+# 
+# --=20
+# =E2=9E=A7 Ulrich Drepper =E2=9E=A7 Red Hat, Inc. =E2=9E=A7 444 Castro St =
+# =E2=9E=A7 Mountain View, CA =E2=9D=96
+# 
+# 
+# --------------enig9DEC74140126C224E7DE3E54
+# Content-Type: application/pgp-signature; name="signature.asc"
+# Content-Description: OpenPGP digital signature
+# Content-Disposition: attachment; filename="signature.asc"
+# 
+# -----BEGIN PGP SIGNATURE-----
+# Version: GnuPG v1.4.1 (GNU/Linux)
+# Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
+# 
+# iD8DBQFCr30T2ijCOnn/RHQRAp9LAKC+w/vhXW73ps1Pxcy+VGPrT1Su+ACguPnV
+# VstZcFJgJ5GZ1YvDExsOZZI=
+# =xmXh
+# -----END PGP SIGNATURE-----
+# 
+# --------------enig9DEC74140126C224E7DE3E54--
+# 
+
+# Added 4/2018 to make script self contained
+BEGIN { a = "0x1" }
+
+BEGIN { print a+0 }
diff --git a/gawk-5.0.1/test/nondec2.ok b/gawk-5.0.1/test/nondec2.ok
new file mode 100644
index 00000000000..d00491fd7e5
--- /dev/null
+++ b/gawk-5.0.1/test/nondec2.ok
@@ -0,0 +1 @@
+1
diff --git a/gawk-5.0.1/test/nonfatal1.awk b/gawk-5.0.1/test/nonfatal1.awk
new file mode 100644
index 00000000000..55883d66a61
--- /dev/null
+++ b/gawk-5.0.1/test/nonfatal1.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	PROCINFO["NONFATAL"]
+	# note the bad characters in the hostname
+	print |& "/inet/tcp/0/1.2.3.4.5/25"
+	print (ERRNO != "")
+}
diff --git a/gawk-5.0.1/test/nonfatal1.ok b/gawk-5.0.1/test/nonfatal1.ok
new file mode 100644
index 00000000000..be8dcc95f56
--- /dev/null
+++ b/gawk-5.0.1/test/nonfatal1.ok
@@ -0,0 +1,2 @@
+gawk: nonfatal1.awk:4: warning: remote host and port information (1.2.3.4.5, 25) invalid
+1
diff --git a/gawk-5.0.1/test/nonfatal2.awk b/gawk-5.0.1/test/nonfatal2.awk
new file mode 100644
index 00000000000..fedbba432ff
--- /dev/null
+++ b/gawk-5.0.1/test/nonfatal2.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	PROCINFO["NONFATAL"] = 1
+	print > "/dev/no/such/file"
+	print ERRNO
+}
diff --git a/gawk-5.0.1/test/nonfatal2.ok b/gawk-5.0.1/test/nonfatal2.ok
new file mode 100644
index 00000000000..ddc886910ed
--- /dev/null
+++ b/gawk-5.0.1/test/nonfatal2.ok
@@ -0,0 +1 @@
+No such file or directory
diff --git a/gawk-5.0.1/test/nonfatal3.awk b/gawk-5.0.1/test/nonfatal3.awk
new file mode 100644
index 00000000000..b2a4ec9ec4a
--- /dev/null
+++ b/gawk-5.0.1/test/nonfatal3.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	PROCINFO["NONFATAL"]
+	# valid host but bogus port
+	print |& "/inet/tcp/0/localhost/0"
+	print ERRNO != ""
+}
diff --git a/gawk-5.0.1/test/nonfatal3.ok b/gawk-5.0.1/test/nonfatal3.ok
new file mode 100644
index 00000000000..d00491fd7e5
--- /dev/null
+++ b/gawk-5.0.1/test/nonfatal3.ok
@@ -0,0 +1 @@
+1
diff --git a/gawk-5.0.1/test/nonl.awk b/gawk-5.0.1/test/nonl.awk
new file mode 100644
index 00000000000..c227083464f
--- /dev/null
+++ b/gawk-5.0.1/test/nonl.awk
@@ -0,0 +1 @@
+0
\ No newline at end of file
diff --git a/gawk-5.0.1/test/nonl.in b/gawk-5.0.1/test/nonl.in
new file mode 100644
index 00000000000..91195eeb342
--- /dev/null
+++ b/gawk-5.0.1/test/nonl.in
@@ -0,0 +1 @@
+junk
\ No newline at end of file
diff --git a/gawk-5.0.1/test/nonl.ok b/gawk-5.0.1/test/nonl.ok
new file mode 100644
index 00000000000..24bd9b78122
--- /dev/null
+++ b/gawk-5.0.1/test/nonl.ok
@@ -0,0 +1 @@
+gawk: nonl.awk:1: warning: source file does not end in newline
diff --git a/gawk-5.0.1/test/noparms.awk b/gawk-5.0.1/test/noparms.awk
new file mode 100644
index 00000000000..2c7ccc76780
--- /dev/null
+++ b/gawk-5.0.1/test/noparms.awk
@@ -0,0 +1 @@
+function x(a, b, c , ,) {}
diff --git a/gawk-5.0.1/test/noparms.ok b/gawk-5.0.1/test/noparms.ok
new file mode 100644
index 00000000000..504c4e41687
--- /dev/null
+++ b/gawk-5.0.1/test/noparms.ok
@@ -0,0 +1,5 @@
+gawk: noparms.awk:1: function x(a, b, c , ,) {}
+gawk: noparms.awk:1:                      ^ syntax error
+gawk: noparms.awk:1: function x(a, b, c , ,) {}
+gawk: noparms.awk:1:                       ^ syntax error
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/nors.in b/gawk-5.0.1/test/nors.in
new file mode 100644
index 00000000000..f90d9ecafed
--- /dev/null
+++ b/gawk-5.0.1/test/nors.in
@@ -0,0 +1 @@
+A B C D E
\ No newline at end of file
diff --git a/gawk-5.0.1/test/nors.ok b/gawk-5.0.1/test/nors.ok
new file mode 100644
index 00000000000..54d5aab88c2
--- /dev/null
+++ b/gawk-5.0.1/test/nors.ok
@@ -0,0 +1,2 @@
+E
+E
diff --git a/gawk-5.0.1/test/nsbad.awk b/gawk-5.0.1/test/nsbad.awk
new file mode 100644
index 00000000000..825bb35c0e0
--- /dev/null
+++ b/gawk-5.0.1/test/nsbad.awk
@@ -0,0 +1,15 @@
+@namespace "1foo"
+@namespace "for"
+@namespace "42f"
+@namespace "ab#d"
+
+BEGIN {
+	foo75::bar = 57
+	if::junk = 1
+	foo::match = 3
+}
+
+@namespace "foo"
+function gsub () {
+	print "foo::gsub"
+}
diff --git a/gawk-5.0.1/test/nsbad.ok b/gawk-5.0.1/test/nsbad.ok
new file mode 100644
index 00000000000..dfa228a71df
--- /dev/null
+++ b/gawk-5.0.1/test/nsbad.ok
@@ -0,0 +1,13 @@
+gawk: nsbad.awk:1: error: namespace name `1foo' must meet identifier naming rules
+gawk: nsbad.awk:2: error: using reserved identifier `for' as a namespace is not allowed
+gawk: nsbad.awk:3: error: namespace name `42f' must meet identifier naming rules
+gawk: nsbad.awk:4: error: namespace name `ab#d' must meet identifier naming rules
+gawk: nsbad.awk:8: error: using reserved identifier `if' as a namespace is not allowed
+gawk: nsbad.awk:8: 	if::junk = 1
+gawk: nsbad.awk:8: 	         ^ syntax error
+gawk: nsbad.awk:9: error: using reserved identifier `match' as second component of a qualified name is not allowed
+gawk: nsbad.awk:9: 	foo::match = 3
+gawk: nsbad.awk:9: 	           ^ syntax error
+gawk: nsbad.awk:13: function gsub () {
+gawk: nsbad.awk:13:          ^ `gsub' is a built-in function, it cannot be redefined
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/nsbad_cmd.ok b/gawk-5.0.1/test/nsbad_cmd.ok
new file mode 100644
index 00000000000..cbca6ea0143
--- /dev/null
+++ b/gawk-5.0.1/test/nsbad_cmd.ok
@@ -0,0 +1,3 @@
+gawk: error: identifier foo:bar: namespace separator is two colons, not one
+gawk: error: qualified identifier `foo:::blat' is badly formed
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/nsforloop.awk b/gawk-5.0.1/test/nsforloop.awk
new file mode 100644
index 00000000000..b050db64162
--- /dev/null
+++ b/gawk-5.0.1/test/nsforloop.awk
@@ -0,0 +1,20 @@
+@namespace "foo"
+
+function test(v)
+{
+	print "-- 1"
+	for (i in Data)
+		print i
+
+	print "-- 2"
+	for (v in Data)
+		print v
+	print "-- 3"
+}
+
+BEGIN {
+	Data[1] = 1
+	Data[2] = 2
+
+	test()
+}
diff --git a/gawk-5.0.1/test/nsforloop.ok b/gawk-5.0.1/test/nsforloop.ok
new file mode 100644
index 00000000000..b87cd3ef401
--- /dev/null
+++ b/gawk-5.0.1/test/nsforloop.ok
@@ -0,0 +1,7 @@
+-- 1
+1
+2
+-- 2
+1
+2
+-- 3
diff --git a/gawk-5.0.1/test/nsfuncrecurse.awk b/gawk-5.0.1/test/nsfuncrecurse.awk
new file mode 100644
index 00000000000..1a006cebef2
--- /dev/null
+++ b/gawk-5.0.1/test/nsfuncrecurse.awk
@@ -0,0 +1,18 @@
+@namespace "foo"
+
+function test(v)
+{
+	if (v <= 0)
+		return
+
+	Level++
+	v--
+	printf("Level = %d, v = %d\n", Level, v)
+	test(v)
+	Level--
+}
+
+BEGIN {
+	Level = 0
+	test(5)
+}
diff --git a/gawk-5.0.1/test/nsfuncrecurse.ok b/gawk-5.0.1/test/nsfuncrecurse.ok
new file mode 100644
index 00000000000..3dc76e41461
--- /dev/null
+++ b/gawk-5.0.1/test/nsfuncrecurse.ok
@@ -0,0 +1,5 @@
+Level = 1, v = 4
+Level = 2, v = 3
+Level = 3, v = 2
+Level = 4, v = 1
+Level = 5, v = 0
diff --git a/gawk-5.0.1/test/nsindirect1.awk b/gawk-5.0.1/test/nsindirect1.awk
new file mode 100644
index 00000000000..d04863f51db
--- /dev/null
+++ b/gawk-5.0.1/test/nsindirect1.awk
@@ -0,0 +1,13 @@
+@namespace "test"
+
+BEGIN {
+	bar = 3
+}
+
+@namespace "awk"
+
+BEGIN {
+	print "before change, direct =", test::bar, "indirect =", SYMTAB["test::bar"]
+	SYMTAB["test::bar"] = 4
+	print "after change, direct =", test::bar, "indirect =", SYMTAB["test::bar"]
+}
diff --git a/gawk-5.0.1/test/nsindirect1.ok b/gawk-5.0.1/test/nsindirect1.ok
new file mode 100644
index 00000000000..ab2e31ba961
--- /dev/null
+++ b/gawk-5.0.1/test/nsindirect1.ok
@@ -0,0 +1,2 @@
+before change, direct = 3 indirect = 3
+after change, direct = 4 indirect = 4
diff --git a/gawk-5.0.1/test/nsindirect2.awk b/gawk-5.0.1/test/nsindirect2.awk
new file mode 100644
index 00000000000..8017e8f7eba
--- /dev/null
+++ b/gawk-5.0.1/test/nsindirect2.awk
@@ -0,0 +1,44 @@
+BEGIN {
+	stftime::gensub = 3	# should be OK, not related to indirect calls
+}
+
+
+BEGIN { base_time = systime() }	# in awk namespace
+
+@namespace "testing"
+
+function strftime(mesg)
+{
+	printf("strftime(%s) - this is not the function you are looking for\n",
+		mesg)
+	return 0
+}
+
+BEGIN {
+	strftime("from 'testing'")
+	gensub = "gensub"
+	print "gensub =", gensub
+}
+
+function systime()
+{
+	return awk::base_time
+}
+
+BEGIN {
+	st = "systime"
+	now[1] = @st()
+
+	st = "awk::systime"
+	now[2] = @st()
+
+	st = "testing::systime"
+	now[3] = @st()
+
+	for (i = 1; i <= 3; i++) {
+		if (now[i] == awk::base_time || now[i] == awk::base_time + 1)
+			printf "iteration %d, got good result from systime\n", i
+		else
+			printf "iteration %d, got bad result from systime, now %d, base_time %d\n", i, now, awk::base_time
+	}
+}
diff --git a/gawk-5.0.1/test/nsindirect2.ok b/gawk-5.0.1/test/nsindirect2.ok
new file mode 100644
index 00000000000..c447220d314
--- /dev/null
+++ b/gawk-5.0.1/test/nsindirect2.ok
@@ -0,0 +1,5 @@
+strftime(from 'testing') - this is not the function you are looking for
+gensub = gensub
+iteration 1, got good result from systime
+iteration 2, got good result from systime
+iteration 3, got good result from systime
diff --git a/gawk-5.0.1/test/nsprof1.awk b/gawk-5.0.1/test/nsprof1.awk
new file mode 100644
index 00000000000..46be5bc908f
--- /dev/null
+++ b/gawk-5.0.1/test/nsprof1.awk
@@ -0,0 +1,16 @@
+@namespace "foo"
+
+BEGIN {
+	a = 5
+	a++
+	print a
+}
+
+/foo/ { print "bar" }
+
+@namespace "stuff"
+
+function stuff()
+{
+	print "stuff"
+}
diff --git a/gawk-5.0.1/test/nsprof1.ok b/gawk-5.0.1/test/nsprof1.ok
new file mode 100644
index 00000000000..eacc270798c
--- /dev/null
+++ b/gawk-5.0.1/test/nsprof1.ok
@@ -0,0 +1,19 @@
+@namespace "foo"
+
+BEGIN {
+	a = 5
+	a++
+	print a
+}
+
+/foo/ {
+	print "bar"
+}
+
+@namespace "stuff"
+
+
+function stuff()
+{
+	print "stuff"
+}
diff --git a/gawk-5.0.1/test/nsprof2.awk b/gawk-5.0.1/test/nsprof2.awk
new file mode 100644
index 00000000000..9c7da57e37d
--- /dev/null
+++ b/gawk-5.0.1/test/nsprof2.awk
@@ -0,0 +1,74 @@
+# passwd.awk --- access password file information
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+# Revised July 2017
+
+@namespace "foo"	# this is foo
+
+@namespace "bar"	# this is bar
+
+@namespace "passwd"	# move to passwd namespace
+
+BEGIN {
+    # tailor this to suit your system
+    Awklib = "/usr/local/libexec/awk/"
+}
+
+function Init(    oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+{
+    if (Inited)
+        return
+
+    oldfs = FS
+    oldrs = RS
+    olddol0 = $0
+    using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+    using_fpat = (PROCINFO["FS"] == "FPAT")
+    FS = ":"
+    RS = "\n"
+
+    pwcat = Awklib "pwcat"
+    while ((pwcat | getline) > 0) {
+        Byname[$1] = $0
+        Byuid[$3] = $0
+        Bycount[++Total] = $0
+    }
+    close(pwcat)
+    Count = 0
+    Inited = 1
+    FS = oldfs
+    if (using_fw)
+        FIELDWIDTHS = FIELDWIDTHS
+    else if (using_fpat)
+        FPAT = FPAT
+    RS = oldrs
+    $0 = olddol0
+}
+
+function awk::getpwnam(name)
+{
+    Init()
+    return Byname[name]
+}
+
+function awk::getpwuid(uid)
+{
+    Init()
+    return Byuid[uid]
+}
+
+function awk::getpwent()
+{
+    Init()
+    if (Count < Total)
+        return Bycount[++Count]
+    return ""
+}
+
+function awk::endpwent()
+{
+    Count = 0
+}
diff --git a/gawk-5.0.1/test/nsprof2.ok b/gawk-5.0.1/test/nsprof2.ok
new file mode 100644
index 00000000000..5c3e27ab2b2
--- /dev/null
+++ b/gawk-5.0.1/test/nsprof2.ok
@@ -0,0 +1,75 @@
+# passwd.awk --- access password file information
+#
+# Arnold Robbins, arnold@skeeve.com, Public Domain
+# May 1993
+# Revised October 2000
+# Revised December 2010
+# Revised July 2017
+@namespace "foo"	# this is foo
+
+@namespace "bar"	# this is bar
+
+@namespace "passwd"	# move to passwd namespace
+
+BEGIN {
+	# tailor this to suit your system
+	Awklib = "/usr/local/libexec/awk/"
+}
+
+
+function awk::endpwent()
+{
+	Count = 0
+}
+
+function awk::getpwent()
+{
+	Init()
+	if (Count < Total) {
+		return Bycount[++Count]
+	}
+	return ""
+}
+
+function awk::getpwnam(name)
+{
+	Init()
+	return Byname[name]
+}
+
+function awk::getpwuid(uid)
+{
+	Init()
+	return Byuid[uid]
+}
+
+function Init(oldfs, oldrs, olddol0, pwcat, using_fw, using_fpat)
+{
+	if (Inited) {
+		return
+	}
+	oldfs = FS
+	oldrs = RS
+	olddol0 = $0
+	using_fw = (PROCINFO["FS"] == "FIELDWIDTHS")
+	using_fpat = (PROCINFO["FS"] == "FPAT")
+	FS = ":"
+	RS = "\n"
+	pwcat = Awklib "pwcat"
+	while ((pwcat | getline) > 0) {
+		Byname[$1] = $0
+		Byuid[$3] = $0
+		Bycount[++Total] = $0
+	}
+	close(pwcat)
+	Count = 0
+	Inited = 1
+	FS = oldfs
+	if (using_fw) {
+		FIELDWIDTHS = FIELDWIDTHS
+	} else if (using_fpat) {
+		FPAT = FPAT
+	}
+	RS = oldrs
+	$0 = olddol0
+}
diff --git a/gawk-5.0.1/test/nulinsrc.awk b/gawk-5.0.1/test/nulinsrc.awk
new file mode 100644
index 0000000000000000000000000000000000000000..aecda8620b6939f3c50e928faf34060173be2f34
GIT binary patch
diff --git a/gawk-5.0.1/test/nulinsrc.ok b/gawk-5.0.1/test/nulinsrc.ok
new file mode 100644
index 00000000000..515f423c079
--- /dev/null
+++ b/gawk-5.0.1/test/nulinsrc.ok
@@ -0,0 +1,2 @@
+gawk: nulinsrc.awk:1: fatal: PEBKAC error: invalid character '\000' in source code
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/nulrsend.awk b/gawk-5.0.1/test/nulrsend.awk
new file mode 100644
index 00000000000..6b8cb8ca6e8
--- /dev/null
+++ b/gawk-5.0.1/test/nulrsend.awk
@@ -0,0 +1,112 @@
+# From murata@nips.ac.jp  Tue Aug  6 08:02:14 2002
+# Return-Path: <murata@nips.ac.jp>
+# Received: from localhost (aahz [127.0.0.1])
+# 	by skeeve.com (8.11.2/8.11.2) with ESMTP id g7652Ej01784
+# 	for <arnold@localhost>; Tue, 6 Aug 2002 08:02:14 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.7.4)
+# 	for arnold@localhost (single-drop); Mon, 05 Aug 2002 22:02:14 -0700 (PDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Tue Aug  6 08:13:06 2002)
+# X-From_: murata@nips.ac.jp Tue Aug  6 07:26:32 2002
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id g764QTu27770 for <arobbins@actcom.co.il>;
+# 	Tue, 6 Aug 2002 07:26:30 +0300 (EET DST)  
+# 	(rfc931-sender: mail.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by lmail.actcom.co.il (8.11.6/8.11.6) with ESMTP id g764QRi04673
+# 	for <arobbins@actcom.co.il>; Tue, 6 Aug 2002 07:26:28 +0300
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by f7.net (8.11.6/8.11.6) with ESMTP id g764QQ920486
+# 	for <arnold@skeeve.com>; Tue, 6 Aug 2002 00:26:26 -0400
+# Received: from ccms.nips.ac.jp ([133.48.72.2])
+# 	by fencepost.gnu.org with smtp (Exim 3.35 #1 (Debian))
+# 	id 17bvvL-00011b-00
+# 	for <bug-gawk@gnu.org>; Tue, 06 Aug 2002 00:26:23 -0400
+# Received: (from murata@localhost)
+# 	by ccms.nips.ac.jp (8.9.3+3.2W/3.7W) id NAA01026;
+# 	Tue, 6 Aug 2002 13:26:21 +0900
+# Date: Tue, 6 Aug 2002 13:26:21 +0900
+# Message-Id: <200208060426.NAA01026@ccms.nips.ac.jp>
+# To: bug-gawk@gnu.org
+# Cc: murata@nips.ac.jp
+# Subject: Bug Report (gawk)
+# From: murata@nips.ac.jp (MURATA Yasuhisa)
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=US-ASCII
+# X-Mailer: mnews [version 1.21PL5] 1999-04/04(Sun)
+# 
+# Hello, I report a bug.
+# 
+# 
+# == PROGRAM (filename: atest.awk) ==
+BEGIN {
+  RS=""
+}
+
+NR==1 {
+  print 1
+  RS="\n"
+  next
+}
+
+NR==2 {
+  print 2
+  RS=""
+  next
+}
+
+NR==3 {
+  print 3
+  RS="\n"
+  next
+}
+# ====
+# 
+# == DATA (filename: atest.txt) ==
+# 1111
+# 
+# 2222
+# 
+# ====
+# note: last line is "\n".
+# 
+# 
+# == RUN (gawk) ==
+# > gawk -f atest.awk atest.txt
+# 1
+# 2
+# (no stop!)
+# ====
+# 
+# == RUN (nawk) ==
+# > nawk -f atest.awk atest.txt
+# 1
+# 2
+# 3
+# ====
+# 
+# == VERSION ==
+# > gawk --version
+# GNU Awk 3.1.1
+# Copyright (C) 1989, 1991-2002 Free Software Foundation.
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+# ==
+# 
+# --
+# MURATA Yasuhisa, Technical Staff
+# National Institute for Physiological Sciences
+# E-mail: murata@nips.ac.jp
diff --git a/gawk-5.0.1/test/nulrsend.in b/gawk-5.0.1/test/nulrsend.in
new file mode 100644
index 00000000000..af3eba16571
--- /dev/null
+++ b/gawk-5.0.1/test/nulrsend.in
@@ -0,0 +1,4 @@
+1111
+
+2222
+
diff --git a/gawk-5.0.1/test/nulrsend.ok b/gawk-5.0.1/test/nulrsend.ok
new file mode 100644
index 00000000000..1191247b6d9
--- /dev/null
+++ b/gawk-5.0.1/test/nulrsend.ok
@@ -0,0 +1,2 @@
+1
+2
diff --git a/gawk-5.0.1/test/numindex.awk b/gawk-5.0.1/test/numindex.awk
new file mode 100644
index 00000000000..1762e456f2b
--- /dev/null
+++ b/gawk-5.0.1/test/numindex.awk
@@ -0,0 +1,55 @@
+#To: bug-gnu-utils@gnu.org
+#cc: arnold@gnu.org
+#Subject: Possible bug in GNU Awk 3.0.4
+#Date: Wed, 24 Nov 1999 21:47:24 +0000
+#From: Daniel Elphick <de397@ecs.soton.ac.uk>
+#Message-Id: <E11qkG4-0000l0-00@cameron>
+#
+#This is a multipart MIME message.
+#
+#--==_Exmh_-11192982200
+#Content-Type: text/plain; charset=us-ascii
+#
+#
+#When I use the attached awk script unique on the attached data file, it 
+#reports that all 4 lines of the data are the same. Using mawk it correctly 
+#reports that there are no repeats.
+#
+#I don't know if there are limits on the size of associative array keys for the 
+#purposes of reliable indexing but if there is then it is not (obviously) 
+#documented.
+#
+#
+#--==_Exmh_-11192982200
+#Content-Type: text/plain ; name="data"; charset=us-ascii
+#Content-Description: data
+#Content-Disposition: attachment; filename="data"
+#
+#322322111111112232231111
+#322322111111112213223111
+#322322111111112211132231
+#322322111111112211113223
+#
+#--==_Exmh_-11192982200
+#Content-Type: text/plain ; name="unique"; charset=us-ascii
+#Content-Description: unique
+#Content-Disposition: attachment; filename="unique"
+#
+{
+	if($0 in a)
+	{
+		printf("line %d has been seen before at line %d\n",  NR, a[$0])
+		repeat_count += 1
+	}
+	else
+	{
+		a[$0] = NR
+	}
+	count += 1
+}
+END {
+#	printf("%d %f%%\n", repeat_count, (float)repeat_count / count * 100)
+	printf("%d %f%%\n", repeat_count, repeat_count / count * 100)
+}
+#
+#--==_Exmh_-11192982200--
diff --git a/gawk-5.0.1/test/numindex.in b/gawk-5.0.1/test/numindex.in
new file mode 100644
index 00000000000..3852058d584
--- /dev/null
+++ b/gawk-5.0.1/test/numindex.in
@@ -0,0 +1,4 @@
+322322111111112232231111
+322322111111112213223111
+322322111111112211132231
+322322111111112211113223
diff --git a/gawk-5.0.1/test/numindex.ok b/gawk-5.0.1/test/numindex.ok
new file mode 100644
index 00000000000..8e086f62a65
--- /dev/null
+++ b/gawk-5.0.1/test/numindex.ok
@@ -0,0 +1 @@
+0 0.000000%
diff --git a/gawk-5.0.1/test/numrange.awk b/gawk-5.0.1/test/numrange.awk
new file mode 100644
index 00000000000..3ad2cab5897
--- /dev/null
+++ b/gawk-5.0.1/test/numrange.awk
@@ -0,0 +1,5 @@
+BEGIN {
+    n = split("-1.2e+931 1.2e+931", a)
+    for (i=1; i<=n; ++i)
+        print a[i], +a[i]
+}
diff --git a/gawk-5.0.1/test/numrange.ok b/gawk-5.0.1/test/numrange.ok
new file mode 100644
index 00000000000..73210bd3c6c
--- /dev/null
+++ b/gawk-5.0.1/test/numrange.ok
@@ -0,0 +1,2 @@
+-1.2e+931 -inf
+1.2e+931 +inf
diff --git a/gawk-5.0.1/test/numstr1.awk b/gawk-5.0.1/test/numstr1.awk
new file mode 100644
index 00000000000..e58404fc46f
--- /dev/null
+++ b/gawk-5.0.1/test/numstr1.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	split("1.234", f)
+	OFMT = "%.1f"
+	print f[1]
+	x = f[1]+0
+	print f[1]
+}
diff --git a/gawk-5.0.1/test/numstr1.ok b/gawk-5.0.1/test/numstr1.ok
new file mode 100644
index 00000000000..434a231cb02
--- /dev/null
+++ b/gawk-5.0.1/test/numstr1.ok
@@ -0,0 +1,2 @@
+1.234
+1.234
diff --git a/gawk-5.0.1/test/numsubstr.awk b/gawk-5.0.1/test/numsubstr.awk
new file mode 100644
index 00000000000..7a30993b83d
--- /dev/null
+++ b/gawk-5.0.1/test/numsubstr.awk
@@ -0,0 +1 @@
+{ print substr(1000+$1, 2) }
diff --git a/gawk-5.0.1/test/numsubstr.in b/gawk-5.0.1/test/numsubstr.in
new file mode 100644
index 00000000000..ac65c3641d3
--- /dev/null
+++ b/gawk-5.0.1/test/numsubstr.in
@@ -0,0 +1,3 @@
+5000
+10000
+5000
diff --git a/gawk-5.0.1/test/numsubstr.ok b/gawk-5.0.1/test/numsubstr.ok
new file mode 100644
index 00000000000..86ec13caa12
--- /dev/null
+++ b/gawk-5.0.1/test/numsubstr.ok
@@ -0,0 +1,3 @@
+000
+1000
+000
diff --git a/gawk-5.0.1/test/octsub.awk b/gawk-5.0.1/test/octsub.awk
new file mode 100644
index 00000000000..65e96897717
--- /dev/null
+++ b/gawk-5.0.1/test/octsub.awk
@@ -0,0 +1 @@
+BEGIN{ ++x[03]; print "/" x[0] "/" x[3] "/"}
diff --git a/gawk-5.0.1/test/octsub.ok b/gawk-5.0.1/test/octsub.ok
new file mode 100644
index 00000000000..95cbdc77c83
--- /dev/null
+++ b/gawk-5.0.1/test/octsub.ok
@@ -0,0 +1 @@
+//1/
diff --git a/gawk-5.0.1/test/ofmt.awk b/gawk-5.0.1/test/ofmt.awk
new file mode 100644
index 00000000000..a7b63d63cfb
--- /dev/null
+++ b/gawk-5.0.1/test/ofmt.awk
@@ -0,0 +1,53 @@
+# From dragon!knorke.saar.de!florian Wed Jul 16 10:47:27 1997
+# Return-Path: <dragon!knorke.saar.de!florian>
+# Message-ID: <19970716164451.63610@knorke.saar.de>
+# Date: Wed, 16 Jul 1997 16:44:51 +0200
+# From: Florian La Roche <florian@knorke.saar.de>
+# To: bug-gnu-utils@prep.ai.mit.edu
+# CC: arnold@gnu.ai.mit.edu
+# Subject: bug in gawk 3.0.3
+# MIME-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# X-Mailer: Mutt 0.76
+# Status: R
+# Content-Length: 1725
+# X-Lines: 177
+# X-Display-Position: 0
+# 
+# I have a problem with gawk 3.0.3 on linux with libc 5.4.33.
+# The memory is corrupted, if I use OFMT = "%.12g".
+# With OFMT = "%.6g" evrything works fine, but I don't have enough
+# digits for the computation.
+# 
+# Thanks a lot,
+# Florian La Roche
+# 
+# Here is the sample awk-Script together with sample data:
+# 
+BEGIN {
+		OFMT = "%.12g"
+		big = 99999999999
+		lowest = big
+		small = 0
+		highest = small
+		dir = ""
+	}
+$0 ~ /^[0-9]+$/ {
+	# some old awks do not think $0 is numeric, so use $1
+	if ($1 < lowest)
+		lowest = $1
+	if ($1 > highest)
+		highest = $1
+	next
+}
+$0 ~ /\/\.:$/ {
+	if (dir != "") {
+		if (highest != small)
+			print dir, highest, lowest
+		else
+			print dir, "-", "-"
+	}
+	dir = substr($0, 1, length($0)-3)	# trim off /.:
+	lowest = big
+	highest = small
+}
diff --git a/gawk-5.0.1/test/ofmt.in b/gawk-5.0.1/test/ofmt.in
new file mode 100644
index 00000000000..6fffdfee72d
--- /dev/null
+++ b/gawk-5.0.1/test/ofmt.in
@@ -0,0 +1,136 @@
+alt/binaries/warez/crypto/.:
+..
+...
+
+alt/fan/douglas-adams/.:
+..
+...
+7478
+7479
+7480
+7481
+7482
+7483
+7484
+7485
+7486
+7490
+7488
+7489
+7491
+7407
+7408
+7409
+7410
+7411
+7412
+7413
+7414
+7415
+7416
+7417
+7418
+7419
+7420
+7421
+7422
+7423
+7424
+7425
+7426
+7427
+7428
+7429
+7430
+7431
+7432
+7433
+7434
+7435
+7436
+7437
+7438
+7439
+7440
+7441
+7442
+7443
+7444
+7445
+7446
+7447
+7455
+7449
+7450
+7451
+7452
+7453
+7454
+7456
+7457
+7458
+7459
+7460
+7461
+7462
+7463
+7464
+7465
+7466
+7467
+7468
+7469
+7470
+7471
+7472
+7473
+7475
+7477
+
+alt/os/linux/.:
+..
+...
+
+
+alt/security/.:
+..
+...
+pgp
+ripem
+keydist
+index
+9617
+9618
+9619
+9620
+9625
+9621
+9626
+9622
+9623
+9624
+9627
+9628
+9629
+9630
+9631
+9632
+9633
+9634
+9636
+9637
+9638
+9639
+9640
+9641
+
+alt/security/index/.:
+..
+...
+
+alt/security/keydist/.:
+..
+...
+253
+
+/.:
diff --git a/gawk-5.0.1/test/ofmt.ok b/gawk-5.0.1/test/ofmt.ok
new file mode 100644
index 00000000000..389c1ef8783
--- /dev/null
+++ b/gawk-5.0.1/test/ofmt.ok
@@ -0,0 +1,6 @@
+alt/binaries/warez/crypto - -
+alt/fan/douglas-adams 7491 7407
+alt/os/linux - -
+alt/security 9641 9617
+alt/security/index - -
+alt/security/keydist 253 253
diff --git a/gawk-5.0.1/test/ofmta.awk b/gawk-5.0.1/test/ofmta.awk
new file mode 100644
index 00000000000..8f3bc6e84cf
--- /dev/null
+++ b/gawk-5.0.1/test/ofmta.awk
@@ -0,0 +1,30 @@
+# Date: Thu, 14 Apr 2011 08:18:55 -0500
+# From: j.eh@mchsi.com
+# To: arnold@skeeve.com
+# Subject: CONVFMT test for the test suite
+# Message-ID: <20110414131855.GA1801@apollo>
+# 
+# Hi,
+# 
+# Please consider adding this to the test suite. 3.1.8 segfaults
+# with this.
+# 
+# Thanks,
+# 
+# John
+# 
+# 
+BEGIN {
+	i=1.2345
+	i=3+i
+	a[i]="hi"
+	OFMT="%.1f"
+	print i                       
+	for (x in a) print x, a[x]
+	print a[i]
+	print "--------"
+	CONVFMT=OFMT="%.3f"
+	print i                       
+	for (x in a) print x, a[x]
+	print a[i]
+}
diff --git a/gawk-5.0.1/test/ofmta.ok b/gawk-5.0.1/test/ofmta.ok
new file mode 100644
index 00000000000..f050dc0e1e0
--- /dev/null
+++ b/gawk-5.0.1/test/ofmta.ok
@@ -0,0 +1,7 @@
+4.2
+4.2345 hi
+hi
+--------
+4.234
+4.2345 hi
+
diff --git a/gawk-5.0.1/test/ofmtbig.awk b/gawk-5.0.1/test/ofmtbig.awk
new file mode 100644
index 00000000000..df4f9bb0bbe
--- /dev/null
+++ b/gawk-5.0.1/test/ofmtbig.awk
@@ -0,0 +1,126 @@
+#
+#   [USEMAP]
+#   
+#                            Problem Report gnu/7821
+#                                       
+#   awk in free(): warning: chunk is already free.
+#   
+#   Confidential
+#          no
+#          
+#   Severity
+#          serious
+#          
+#   Priority
+#          medium
+#          
+#   Responsible
+#          freebsd-bugs@freebsd.org
+#          
+#   State
+#          suspended
+#          
+#   Class
+#          sw-bug
+#          
+#   Submitter-Id
+#          current-users
+#          
+#   Arrival-Date
+#          Thu Sep 3 10:30:00 PDT 1998
+#          
+#   Last-Modified
+#          Thu Sep 17 02:04:26 PDT 1998
+#          
+#   Originator
+#          Alexander Litvin archer@lucky.net
+#          
+#   Organization
+#          
+#
+#Lucky Net ltd.
+#
+#   Release
+#          FreeBSD 3.0-CURRENT i386
+#          
+#   Environment
+#          
+#
+#FreeBSD grape.carrier.kiev.ua 3.0-CURRENT FreeBSD 3.0-CURRENT #121: Thu Sep  3
+#1
+#1:21:44 EEST 1998     archer@grape.carrier.kiev.ua:/usr/src/sys/compile/GRAPE
+#i
+#386
+#
+#   Description
+#          
+#
+#The problem first appeared when GNU awk in 3.0-CURRENT was apgraded to
+#3.0.3. I run C-News, which uses awk extensively. After awk apgrade C-News
+#expire stopped to work. It appeared that some GNU awk 3.0.3 programms when
+#given absolutely legitimate input fail, giving out a number of messages:
+#
+#awk in free(): warning: chunk is already free.
+#
+#   How-To-Repeat
+#          
+#
+#Run the following awk program (it is cut out of C-News expire scripts).
+#I was not able to cut it down more -- omitting some portions of the
+#code (e.g. OFMT line), make error go away in this case, though it
+#certainly does not fix awk.
+#
+#----------------cut-here----------------
+#!/usr/bin/awk -f
+BEGIN {
+        OFMT = "%.12g"
+        big = 99999999999
+        lowest = big
+        small = 0
+        highest = small
+}
+
+$0 ~ /^[0-9]+$/ {
+        if ($1 < lowest)
+                lowest = $1
+        if ($1 > highest)
+                highest = $1
+        next
+}
+
+# $0 ~ /^[a-z]+/ {
+$0 ~ /^[[:lower:]]+/ {
+        print dir, highest, lowest
+        dir = $0
+        lowest = big
+        highest = small
+}
+#----------------cut-here----------------
+#
+#To get the error, just give this script the following input:
+#----------------cut-here----------------
+#a
+#1
+#b
+#----------------cut-here----------------
+#
+#   Fix
+#          
+#
+#I was not able to track the error in awk sources. As a workaround,
+#I just reverted to GNU awk 2.15.5.
+#
+#   Audit-Trail
+#          
+#
+#State-Changed-From-To: open-suspended
+#State-Changed-By: phk
+#State-Changed-When: Thu Sep 17 02:04:08 PDT 1998
+#State-Changed-Why:
+#reported to GNU maintainer.
+#
+#   Submit Followup
+#     _________________________________________________________________
+#                                      
+#   
+#    www@freebsd.org
diff --git a/gawk-5.0.1/test/ofmtbig.in b/gawk-5.0.1/test/ofmtbig.in
new file mode 100644
index 00000000000..f1e80ce43f5
--- /dev/null
+++ b/gawk-5.0.1/test/ofmtbig.in
@@ -0,0 +1,3 @@
+a
+1
+b
diff --git a/gawk-5.0.1/test/ofmtbig.ok b/gawk-5.0.1/test/ofmtbig.ok
new file mode 100644
index 00000000000..0fe9251df8c
--- /dev/null
+++ b/gawk-5.0.1/test/ofmtbig.ok
@@ -0,0 +1,2 @@
+ 0 99999999999
+a 1 1
diff --git a/gawk-5.0.1/test/ofmtfidl.awk b/gawk-5.0.1/test/ofmtfidl.awk
new file mode 100644
index 00000000000..181e0715e29
--- /dev/null
+++ b/gawk-5.0.1/test/ofmtfidl.awk
@@ -0,0 +1,85 @@
+# From djones@zoonami.com  Wed Jun 13 17:46:27 2001
+# Received: from mail.actcom.co.il [192.114.47.13]
+# 	by localhost with POP3 (fetchmail-5.5.0)
+# 	for arnold@localhost (single-drop); Wed, 13 Jun 2001 17:46:27 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Wed Jun 13 17:47:09 2001)
+# X-From_: djones@zoonami.com Wed Jun 13 17:45:40 2001
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.9.1a/actcom-0.2) id RAA07057 for <arobbins@actcom.co.il>;
+# 	Wed, 13 Jun 2001 17:45:34 +0300 (EET DST)  
+# 	(rfc931-sender: mail.actcom.co.il [192.114.47.13])
+# Received: from billohost.com (www.billohost.com [209.196.35.10])
+# 	by lmail.actcom.co.il (8.11.2/8.11.2) with ESMTP id f5DEjSO24028
+# 	for <arobbins@actcom.co.il>; Wed, 13 Jun 2001 17:45:33 +0300
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by billohost.com (8.9.3/8.9.3) with ESMTP id KAA24625
+# 	for <arnold@skeeve.com>; Wed, 13 Jun 2001 10:44:43 -0400
+# Received: from topcat.zoonami.com ([193.112.141.198])
+# 	by fencepost.gnu.org with esmtp (Exim 3.16 #1 (Debian))
+# 	id 15ABtZ-0000FQ-00
+# 	for <bug-gawk@gnu.org>; Wed, 13 Jun 2001 10:45:21 -0400
+# Received: from topcat.zoonami.com (localhost [127.0.0.1])
+# 	by topcat.zoonami.com (8.9.3/8.9.3) with ESMTP id OAA28329;
+# 	Wed, 13 Jun 2001 14:45:54 GMT
+# 	(envelope-from djones@topcat.zoonami.com)
+# Message-Id: <200106131445.OAA28329@topcat.zoonami.com>
+# To: bug-gawk@gnu.org
+# cc: David Jones <drj@pobox.com>
+# Subject: 3.1.0 core dumps.  Fiddling with OFMT?
+# Date: Wed, 13 Jun 2001 14:45:54 +0000
+# From: David Jones <djones@zoonami.com>
+# Status: R
+# 
+# The following program causes gawk to dump core:
+# 
+# jot 10|./gawk '{OFMT="%."NR"f";print NR}'
+# 
+# 'jot 10', if you didn't know, produces the numbers 1 to 10 each on its
+# own line (ie it's like awk 'BEGIN{for(i=1;i<=10;++i)print i}')
+# 
+# Here's an example run:
+# 
+# -- run being
+# 1
+# 2
+# 3
+# 4
+# gawk: cmd. line:1: (FILENAME=- FNR=5) fatal error: internal error
+# Abort trap - core dumped
+# -- run end
+# 
+# Ah.  print NR appears to be not interesting.  The following program also
+# has the same problem:
+# 
+# jot 10|./gawk '{OFMT="%."NR"f"}'
+# 
+# Cheers,
+#  djones
+# (version info follows)
+# 
+# I'm running on FreeBSD 4.1, here's the output of uname -a
+# 
+# FreeBSD topcat.zoonami.com 4.1-RELEASE FreeBSD 4.1-RELEASE #0: Fri Jul 28 14:30:31 GMT 2000     jkh@ref4.freebsd.org:/usr/src/sys/compile/GENERIC  i386
+# 
+# And ./gnu --version
+# 
+# GNU Awk 3.1.0
+# Copyright (C) 1989, 1991-2001 Free Software Foundation.
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+# 
+# 
+{ OFMT="%."NR"f"; print NR }
diff --git a/gawk-5.0.1/test/ofmtfidl.in b/gawk-5.0.1/test/ofmtfidl.in
new file mode 100644
index 00000000000..f00c965d830
--- /dev/null
+++ b/gawk-5.0.1/test/ofmtfidl.in
@@ -0,0 +1,10 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/gawk-5.0.1/test/ofmtfidl.ok b/gawk-5.0.1/test/ofmtfidl.ok
new file mode 100644
index 00000000000..f00c965d830
--- /dev/null
+++ b/gawk-5.0.1/test/ofmtfidl.ok
@@ -0,0 +1,10 @@
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/gawk-5.0.1/test/ofmts.awk b/gawk-5.0.1/test/ofmts.awk
new file mode 100644
index 00000000000..6ee37054956
--- /dev/null
+++ b/gawk-5.0.1/test/ofmts.awk
@@ -0,0 +1,2 @@
+BEGIN { OFMT= "%s" }
+{ $1 + $2; print $1, $2 }
diff --git a/gawk-5.0.1/test/ofmts.in b/gawk-5.0.1/test/ofmts.in
new file mode 100644
index 00000000000..50c37ec761f
--- /dev/null
+++ b/gawk-5.0.1/test/ofmts.in
@@ -0,0 +1 @@
+1.2 2.2
diff --git a/gawk-5.0.1/test/ofmts.ok b/gawk-5.0.1/test/ofmts.ok
new file mode 100644
index 00000000000..50c37ec761f
--- /dev/null
+++ b/gawk-5.0.1/test/ofmts.ok
@@ -0,0 +1 @@
+1.2 2.2
diff --git a/gawk-5.0.1/test/ofmtstrnum.awk b/gawk-5.0.1/test/ofmtstrnum.awk
new file mode 100644
index 00000000000..805dad73ea5
--- /dev/null
+++ b/gawk-5.0.1/test/ofmtstrnum.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	split(" 1", f, "|")
+	OFMT = "%.1f"
+	print f[1]
+	x = f[1] + 0
+	print f[1]
+}
diff --git a/gawk-5.0.1/test/ofmtstrnum.ok b/gawk-5.0.1/test/ofmtstrnum.ok
new file mode 100644
index 00000000000..ae95586813a
--- /dev/null
+++ b/gawk-5.0.1/test/ofmtstrnum.ok
@@ -0,0 +1,2 @@
+ 1
+ 1
diff --git a/gawk-5.0.1/test/ofs1.awk b/gawk-5.0.1/test/ofs1.awk
new file mode 100644
index 00000000000..83b3c2a57d5
--- /dev/null
+++ b/gawk-5.0.1/test/ofs1.awk
@@ -0,0 +1,23 @@
+# Translate this shell script into gawk:
+#
+#! /bin/sh -
+# 
+# awktest()
+# {
+#   echo a:b:c | $AWK -F":" '{$2="x"; OFS=FS; print}'
+#   echo a:b:c | $AWK -F":" '{$2="x"; print; OFS=FS; print}'
+#   echo a:b:c | $AWK -F":" '{$2="x"; print $1; OFS=FS; print}'
+#   echo a:b:c | $AWK -F":" '{$2="x"; print; $2=$2; OFS=FS; print}'
+# }
+# 
+# AWK=./gawk
+# awktest > foo.gawk
+
+BEGIN { FS = ":" }
+
+# Have to reset OFS at end since not running separate invocations
+
+FNR == 1 { $2 = "x"; OFS = FS; print ; OFS = " "}
+FNR == 2 { $2 = "x"; print; OFS = FS; print ; OFS = " "}
+FNR == 3 { $2 = "x"; print $1; OFS = FS; print ; OFS = " "}
+FNR == 4 { $2 = "x"; print; $2 = $2; OFS = FS; print }
diff --git a/gawk-5.0.1/test/ofs1.in b/gawk-5.0.1/test/ofs1.in
new file mode 100644
index 00000000000..0582b9b1428
--- /dev/null
+++ b/gawk-5.0.1/test/ofs1.in
@@ -0,0 +1,4 @@
+a:b:c
+a:b:c
+a:b:c
+a:b:c
diff --git a/gawk-5.0.1/test/ofs1.ok b/gawk-5.0.1/test/ofs1.ok
new file mode 100644
index 00000000000..d01fa1618d5
--- /dev/null
+++ b/gawk-5.0.1/test/ofs1.ok
@@ -0,0 +1,7 @@
+a x c
+a x c
+a x c
+a
+a x c
+a x c
+a x c
diff --git a/gawk-5.0.1/test/onlynl.awk b/gawk-5.0.1/test/onlynl.awk
new file mode 100644
index 00000000000..97a8d94b09b
--- /dev/null
+++ b/gawk-5.0.1/test/onlynl.awk
@@ -0,0 +1,2 @@
+BEGIN { RS = "" }
+{ print "got", $0 }
diff --git a/gawk-5.0.1/test/onlynl.in b/gawk-5.0.1/test/onlynl.in
new file mode 100644
index 00000000000..fd40910d9e7
--- /dev/null
+++ b/gawk-5.0.1/test/onlynl.in
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/gawk-5.0.1/test/onlynl.ok b/gawk-5.0.1/test/onlynl.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/opasnidx.awk b/gawk-5.0.1/test/opasnidx.awk
new file mode 100644
index 00000000000..e39886004ac
--- /dev/null
+++ b/gawk-5.0.1/test/opasnidx.awk
@@ -0,0 +1 @@
+BEGIN { b = 1; a[b] = 2; a[b++] += 1; print b,a[1] }
diff --git a/gawk-5.0.1/test/opasnidx.ok b/gawk-5.0.1/test/opasnidx.ok
new file mode 100644
index 00000000000..654d526942a
--- /dev/null
+++ b/gawk-5.0.1/test/opasnidx.ok
@@ -0,0 +1 @@
+2 3
diff --git a/gawk-5.0.1/test/opasnslf.awk b/gawk-5.0.1/test/opasnslf.awk
new file mode 100644
index 00000000000..46cd2b8176d
--- /dev/null
+++ b/gawk-5.0.1/test/opasnslf.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	print b += b += 1
+	b = 6
+	print b += b++
+	print b
+}
diff --git a/gawk-5.0.1/test/opasnslf.ok b/gawk-5.0.1/test/opasnslf.ok
new file mode 100644
index 00000000000..2fa9fd51a97
--- /dev/null
+++ b/gawk-5.0.1/test/opasnslf.ok
@@ -0,0 +1,3 @@
+2
+13
+13
diff --git a/gawk-5.0.1/test/ordchr.awk b/gawk-5.0.1/test/ordchr.awk
new file mode 100644
index 00000000000..0295105e1bf
--- /dev/null
+++ b/gawk-5.0.1/test/ordchr.awk
@@ -0,0 +1,10 @@
+@load "ordchr"
+
+BEGIN {
+   print chr(ord("A"))
+   print chr(ord("0"))
+   print ord(chr(65))
+   # test if type conversion between strings and numbers is working properly
+   print chr(ord(0))
+   print ord(chr("65"))
+}
diff --git a/gawk-5.0.1/test/ordchr.ok b/gawk-5.0.1/test/ordchr.ok
new file mode 100644
index 00000000000..86d901e9693
--- /dev/null
+++ b/gawk-5.0.1/test/ordchr.ok
@@ -0,0 +1,5 @@
+A
+0
+65
+0
+65
diff --git a/gawk-5.0.1/test/ordchr2.ok b/gawk-5.0.1/test/ordchr2.ok
new file mode 100644
index 00000000000..b68025345d5
--- /dev/null
+++ b/gawk-5.0.1/test/ordchr2.ok
@@ -0,0 +1 @@
+z
diff --git a/gawk-5.0.1/test/out1.ok b/gawk-5.0.1/test/out1.ok
new file mode 100644
index 00000000000..f54b2b4d1a2
--- /dev/null
+++ b/gawk-5.0.1/test/out1.ok
@@ -0,0 +1 @@
+Goes to a file out1
diff --git a/gawk-5.0.1/test/out2.ok b/gawk-5.0.1/test/out2.ok
new file mode 100644
index 00000000000..66b7d2f7f75
--- /dev/null
+++ b/gawk-5.0.1/test/out2.ok
@@ -0,0 +1,2 @@
+Normal print statement
+This printed on stdout
diff --git a/gawk-5.0.1/test/out3.ok b/gawk-5.0.1/test/out3.ok
new file mode 100644
index 00000000000..7eb822ffd96
--- /dev/null
+++ b/gawk-5.0.1/test/out3.ok
@@ -0,0 +1 @@
+You blew it!
diff --git a/gawk-5.0.1/test/paramasfunc1.awk b/gawk-5.0.1/test/paramasfunc1.awk
new file mode 100644
index 00000000000..b0d06849ac2
--- /dev/null
+++ b/gawk-5.0.1/test/paramasfunc1.awk
@@ -0,0 +1,9 @@
+BEGIN{ X() }
+
+function X(	abc)
+{
+	abc = "stamp out "
+	print abc abc()
+}
+
+function abc() { return "dark corners" }
diff --git a/gawk-5.0.1/test/paramasfunc1.ok b/gawk-5.0.1/test/paramasfunc1.ok
new file mode 100644
index 00000000000..9ee95116bf2
--- /dev/null
+++ b/gawk-5.0.1/test/paramasfunc1.ok
@@ -0,0 +1,3 @@
+gawk: paramasfunc1.awk:6: error: attempt to use non-function `abc' in function call
+gawk: error: function `X': can't use function `abc' as a parameter name
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/paramasfunc2.awk b/gawk-5.0.1/test/paramasfunc2.awk
new file mode 100644
index 00000000000..849b3d1b4dd
--- /dev/null
+++ b/gawk-5.0.1/test/paramasfunc2.awk
@@ -0,0 +1,10 @@
+BEGIN{ X() }
+
+function abc() { return "dark corners" }
+
+function X(	abc)
+{
+	abc = "stamp out "
+	print abc abc()
+}
+
diff --git a/gawk-5.0.1/test/paramasfunc2.ok b/gawk-5.0.1/test/paramasfunc2.ok
new file mode 100644
index 00000000000..2cdf4f665c1
--- /dev/null
+++ b/gawk-5.0.1/test/paramasfunc2.ok
@@ -0,0 +1,3 @@
+gawk: paramasfunc2.awk:8: error: attempt to use non-function `abc' in function call
+gawk: error: function `X': can't use function `abc' as a parameter name
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/paramdup.awk b/gawk-5.0.1/test/paramdup.awk
new file mode 100644
index 00000000000..1f1cc7a4552
--- /dev/null
+++ b/gawk-5.0.1/test/paramdup.awk
@@ -0,0 +1,8 @@
+BEGIN { foo(0, 1, 2) }
+
+function foo(a, b, c, b, a)
+{
+	print "a =", a
+	print "b =", b
+	print "c =", c
+}
diff --git a/gawk-5.0.1/test/paramdup.ok b/gawk-5.0.1/test/paramdup.ok
new file mode 100644
index 00000000000..cd71822a311
--- /dev/null
+++ b/gawk-5.0.1/test/paramdup.ok
@@ -0,0 +1,3 @@
+gawk: paramdup.awk:3: error: function `foo': parameter #4, `b', duplicates parameter #2
+gawk: paramdup.awk:3: error: function `foo': parameter #5, `a', duplicates parameter #1
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/paramres.awk b/gawk-5.0.1/test/paramres.awk
new file mode 100644
index 00000000000..e2f18927448
--- /dev/null
+++ b/gawk-5.0.1/test/paramres.awk
@@ -0,0 +1,6 @@
+BEGIN { foo() }
+
+function foo(a, FS, q)
+{
+	print "a =", a
+}
diff --git a/gawk-5.0.1/test/paramres.ok b/gawk-5.0.1/test/paramres.ok
new file mode 100644
index 00000000000..0687f92d659
--- /dev/null
+++ b/gawk-5.0.1/test/paramres.ok
@@ -0,0 +1,2 @@
+gawk: paramres.awk:3: error: function `foo': can't use special variable `FS' as a function parameter
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/paramtyp.awk b/gawk-5.0.1/test/paramtyp.awk
new file mode 100644
index 00000000000..58848bbf63a
--- /dev/null
+++ b/gawk-5.0.1/test/paramtyp.awk
@@ -0,0 +1,20 @@
+# Sun Apr 25 13:28:58 IDT 1999
+# from Juegen Khars.  This program should not core dump.
+  function ReadPGM(f, d) {
+print "ReadPGM"
+    d[1] = 1
+  }
+
+  function WritePGM(f, d) {
+print "WritePGM"
+    d[1] = 0
+  }
+
+  BEGIN {
+print "before ReadPGM"
+    ReadPGM("", d)
+print "after ReadPGM"
+print "before WritePGM"
+    WritePGM("", d)
+print "after WritePGM"
+  }
diff --git a/gawk-5.0.1/test/paramtyp.ok b/gawk-5.0.1/test/paramtyp.ok
new file mode 100644
index 00000000000..793f857a3b3
--- /dev/null
+++ b/gawk-5.0.1/test/paramtyp.ok
@@ -0,0 +1,6 @@
+before ReadPGM
+ReadPGM
+after ReadPGM
+before WritePGM
+WritePGM
+after WritePGM
diff --git a/gawk-5.0.1/test/paramuninitglobal.awk b/gawk-5.0.1/test/paramuninitglobal.awk
new file mode 100644
index 00000000000..0d7989d9fe5
--- /dev/null
+++ b/gawk-5.0.1/test/paramuninitglobal.awk
@@ -0,0 +1,15 @@
+function f(x)
+{
+	a = 10
+	x = 90
+	print x
+	print a
+	a++
+	x++
+	print x
+}
+
+BEGIN {
+	f(a)
+	print a
+}
diff --git a/gawk-5.0.1/test/paramuninitglobal.ok b/gawk-5.0.1/test/paramuninitglobal.ok
new file mode 100644
index 00000000000..ce1879d71df
--- /dev/null
+++ b/gawk-5.0.1/test/paramuninitglobal.ok
@@ -0,0 +1,4 @@
+90
+10
+91
+11
diff --git a/gawk-5.0.1/test/parse1.awk b/gawk-5.0.1/test/parse1.awk
new file mode 100644
index 00000000000..84906c491dd
--- /dev/null
+++ b/gawk-5.0.1/test/parse1.awk
@@ -0,0 +1,35 @@
+# Date: Fri, 06 Jan 2006 14:02:17 -0800
+# From: Paul Eggert <eggert@CS.UCLA.EDU>
+# Subject: gawk misparses $expr++ if expr ends in ++
+# To: bug-gawk@gnu.org
+# Message-id: <87irsxypzq.fsf@penguin.cs.ucla.edu>
+# 
+# Here's an example of the problem:
+# 
+# $ gawk 'BEGIN{a=3}{print $$a++++}'
+# gawk: {print $$a++++}
+# gawk:               ^ syntax error
+# 
+# But it's not a syntax error, as the expression conforms to the POSIX
+# spec: it should be treated like '$($a++)++'.
+# 
+# Mawk, Solaris awk (old awk), and Solaris nawk all accept the
+# expression.  For example:
+# 
+# $ echo '3 4 5 6 7 8 9' | nawk 'BEGIN{a=3}{print $$a++++}'
+# 7
+# 
+# This is with gawk 3.1.5 on Solaris 8 (sparc).
+# 
+# 
+# #####################################################################################
+# This Mail Was Scanned by 012.net AntiVirus Service1- Powered by TrendMicro Interscan
+# 
+BEGIN { a = 3 }
+
+{
+	print "in:", $0
+	print "a =", a
+	print $$a++++
+	print "out:", $0
+}
diff --git a/gawk-5.0.1/test/parse1.in b/gawk-5.0.1/test/parse1.in
new file mode 100644
index 00000000000..4a001d7b0b1
--- /dev/null
+++ b/gawk-5.0.1/test/parse1.in
@@ -0,0 +1 @@
+3 4 5 6 7 8 9
diff --git a/gawk-5.0.1/test/parse1.ok b/gawk-5.0.1/test/parse1.ok
new file mode 100644
index 00000000000..a452e60c826
--- /dev/null
+++ b/gawk-5.0.1/test/parse1.ok
@@ -0,0 +1,4 @@
+in: 3 4 5 6 7 8 9
+a = 3
+7
+out: 3 4 6 6 8 8 9
diff --git a/gawk-5.0.1/test/parsefld.awk b/gawk-5.0.1/test/parsefld.awk
new file mode 100644
index 00000000000..0dd2f914dc4
--- /dev/null
+++ b/gawk-5.0.1/test/parsefld.awk
@@ -0,0 +1,2 @@
+{ print $/= b/ c /= d/ }
+{ print /a/ + /b/ + !/c/}
diff --git a/gawk-5.0.1/test/parsefld.in b/gawk-5.0.1/test/parsefld.in
new file mode 100644
index 00000000000..959d6825988
--- /dev/null
+++ b/gawk-5.0.1/test/parsefld.in
@@ -0,0 +1 @@
+a = b
diff --git a/gawk-5.0.1/test/parsefld.ok b/gawk-5.0.1/test/parsefld.ok
new file mode 100644
index 00000000000..8d0316f115c
--- /dev/null
+++ b/gawk-5.0.1/test/parsefld.ok
@@ -0,0 +1,2 @@
+a0
+3
diff --git a/gawk-5.0.1/test/parseme.awk b/gawk-5.0.1/test/parseme.awk
new file mode 100644
index 00000000000..4d6ba943bd2
--- /dev/null
+++ b/gawk-5.0.1/test/parseme.awk
@@ -0,0 +1 @@
+BEGIN { toupper(substr*line,1,12)) }
diff --git a/gawk-5.0.1/test/parseme.ok b/gawk-5.0.1/test/parseme.ok
new file mode 100644
index 00000000000..83c0d0566d4
--- /dev/null
+++ b/gawk-5.0.1/test/parseme.ok
@@ -0,0 +1,5 @@
+gawk: parseme.awk:1: BEGIN { toupper(substr*line,1,12)) }
+gawk: parseme.awk:1:                       ^ syntax error
+gawk: parseme.awk:1: BEGIN { toupper(substr*line,1,12)) }
+gawk: parseme.awk:1:                                 ^ 3 is invalid as number of arguments for toupper
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/patsplit.awk b/gawk-5.0.1/test/patsplit.awk
new file mode 100644
index 00000000000..af2813aa7d7
--- /dev/null
+++ b/gawk-5.0.1/test/patsplit.awk
@@ -0,0 +1,26 @@
+BEGIN {
+	FALSE = 0
+	TRUE = 1
+
+	fpat[1] = "([^,]*)|(\"[^\"]+\")"
+	fpat[2] = fpat[1]
+	fpat[3] = fpat[1]
+	fpat[4] = "aa+"
+	fpat[5] = fpat[4]
+
+	data[1] = "Robbins,,Arnold,"
+	data[2] = "Smith,,\"1234 A Pretty Place, NE\",Sometown,NY,12345-6789,USA"
+	data[3] = "Robbins,Arnold,\"1234 A Pretty Place, NE\",Sometown,NY,12345-6789,USA"
+	data[4] = "bbbaaacccdddaaaaaqqqq"
+	data[5] = "bbbaaacccdddaaaaaqqqqa" # should get trailing qqqa
+
+	for (j = 1; j in data; j++) {
+		printf("Splitting: <%s>\n", data[j])
+		n = patsplit(data[j], fields, fpat[j], seps)
+		print "n =", n
+		for (i = 1; i <= n; i++)
+			printf("fields[%d] = <%s>\n", i, fields[i])
+		for (i = 0; i in seps; i++)
+			printf("seps[%s] = <%s>\n", i, seps[i])
+	}
+}
diff --git a/gawk-5.0.1/test/patsplit.ok b/gawk-5.0.1/test/patsplit.ok
new file mode 100644
index 00000000000..02387d86ac7
--- /dev/null
+++ b/gawk-5.0.1/test/patsplit.ok
@@ -0,0 +1,59 @@
+Splitting: <Robbins,,Arnold,>
+n = 4
+fields[1] = <Robbins>
+fields[2] = <>
+fields[3] = <Arnold>
+fields[4] = <>
+seps[0] = <>
+seps[1] = <,>
+seps[2] = <,>
+seps[3] = <,>
+seps[4] = <>
+Splitting: <Smith,,"1234 A Pretty Place, NE",Sometown,NY,12345-6789,USA>
+n = 7
+fields[1] = <Smith>
+fields[2] = <>
+fields[3] = <"1234 A Pretty Place, NE">
+fields[4] = <Sometown>
+fields[5] = <NY>
+fields[6] = <12345-6789>
+fields[7] = <USA>
+seps[0] = <>
+seps[1] = <,>
+seps[2] = <,>
+seps[3] = <,>
+seps[4] = <,>
+seps[5] = <,>
+seps[6] = <,>
+seps[7] = <>
+Splitting: <Robbins,Arnold,"1234 A Pretty Place, NE",Sometown,NY,12345-6789,USA>
+n = 7
+fields[1] = <Robbins>
+fields[2] = <Arnold>
+fields[3] = <"1234 A Pretty Place, NE">
+fields[4] = <Sometown>
+fields[5] = <NY>
+fields[6] = <12345-6789>
+fields[7] = <USA>
+seps[0] = <>
+seps[1] = <,>
+seps[2] = <,>
+seps[3] = <,>
+seps[4] = <,>
+seps[5] = <,>
+seps[6] = <,>
+seps[7] = <>
+Splitting: <bbbaaacccdddaaaaaqqqq>
+n = 2
+fields[1] = <aaa>
+fields[2] = <aaaaa>
+seps[0] = <bbb>
+seps[1] = <cccddd>
+seps[2] = <qqqq>
+Splitting: <bbbaaacccdddaaaaaqqqqa>
+n = 2
+fields[1] = <aaa>
+fields[2] = <aaaaa>
+seps[0] = <bbb>
+seps[1] = <cccddd>
+seps[2] = <qqqqa>
diff --git a/gawk-5.0.1/test/pcntplus.awk b/gawk-5.0.1/test/pcntplus.awk
new file mode 100644
index 00000000000..13999ac4801
--- /dev/null
+++ b/gawk-5.0.1/test/pcntplus.awk
@@ -0,0 +1 @@
+BEGIN { printf "%+d %d\n", 3, 4 }
diff --git a/gawk-5.0.1/test/pcntplus.ok b/gawk-5.0.1/test/pcntplus.ok
new file mode 100644
index 00000000000..b7902695aed
--- /dev/null
+++ b/gawk-5.0.1/test/pcntplus.ok
@@ -0,0 +1 @@
++3 4
diff --git a/gawk-5.0.1/test/pid.awk b/gawk-5.0.1/test/pid.awk
new file mode 100644
index 00000000000..35cc03dace8
--- /dev/null
+++ b/gawk-5.0.1/test/pid.awk
@@ -0,0 +1,49 @@
+# From: John C. Oppenheimer <jco@slinky.convex.com>
+# Subject: gawk-3.0.2 pid test
+# To: arnold@skeeve.atl.ga.us
+# Date: Mon, 10 Feb 1997 08:31:55 -0600 (CST)
+# 
+# Thanks for the very quick reply.
+# 
+# This all started when I was looking for how to do the equivalent of
+# "nextfile." I was after documentation and found our gawk down a few
+# revs.
+# 
+# Looks like the nextfile functionality was added somewhere around
+# 2.15.5.  There wasn't a way to do it, until now! Thanks for the
+# functionality!
+# 
+# Saw the /dev/xxx capability and just tried it.
+# 
+# Anyway, I wrote a pid test.  I hope that it is portable.  Wanted to
+# make a user test, but looks like id(1) is not very portable.  But a
+# little test is better than none.
+# 
+# John
+# 
+# pid.ok is a zero length file
+# 
+# ================== pid.awk ============
+BEGIN {
+#	getline pid <"/dev/pid"
+#	getline ppid <"/dev/ppid"
+# 12/2001: switch to PROCINFO. ADR
+	pid = PROCINFO["pid"]
+	ppid = PROCINFO["ppid"]
+
+	if (pid != ok_pid)
+		printf "Bad pid %d, wanted %d\n", pid, ok_pid
+	else
+		print "PID ok"
+
+	if (ppid != ok_ppid)
+		printf "Bad ppid %d, wanted %d\n", ppid, ok_ppid
+	else
+		print "PPID ok"
+
+	# ADR --- added
+#	close("/dev/pid")
+#	close("/dev/ppid")
+
+	print "All Done."
+}
diff --git a/gawk-5.0.1/test/pid.ok b/gawk-5.0.1/test/pid.ok
new file mode 100644
index 00000000000..a700d101023
--- /dev/null
+++ b/gawk-5.0.1/test/pid.ok
@@ -0,0 +1,3 @@
+PID ok
+PPID ok
+All Done.
diff --git a/gawk-5.0.1/test/pid.sh b/gawk-5.0.1/test/pid.sh
new file mode 100755
index 00000000000..da49afdf37d
--- /dev/null
+++ b/gawk-5.0.1/test/pid.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+AWK=${AWK-../gawk}
+exec $AWK -v "ok_pid=$$" -v "ok_ppid=$1" -f pid.awk 2>/dev/null
diff --git a/gawk-5.0.1/test/pipeio1.awk b/gawk-5.0.1/test/pipeio1.awk
new file mode 100644
index 00000000000..66f50adf41d
--- /dev/null
+++ b/gawk-5.0.1/test/pipeio1.awk
@@ -0,0 +1,31 @@
+# From dragon!gamgee.acad.emich.edu!dhw Tue Mar 18 01:12:15 1997
+# Return-Path: <dragon!gamgee.acad.emich.edu!dhw>
+# Message-ID: <m0w6owW-000IDSC@gamgee.acad.emich.edu>
+# Date: Mon, 17 Mar 97 20:48 CST
+# From: dhw@gamgee.acad.emich.edu (David H. West)
+# To: arnold@gnu.ai.mit.edu
+# Subject: gawk 3.0.2 bug report (cc of msg to bug-gnu-utils)
+# Status: OR
+# Content-Length: 869
+# X-Lines: 20
+# X-Display-Position: 2
+# 
+# Nature of bug: operation on a pipe side-effects a different pipe.
+# Observed-With: gawk 3.0.2, Linux kernel 2.0.28
+# Reproduce-By: running the following script, without and with the "close"
+#               statement uncommented.
+# -----------------cut here--------------------------
+BEGIN {FILE1="test1"; FILE2="test2"; 
+       print "1\n" > FILE1; close(FILE1);
+       print "2\n" > FILE2; close(FILE2); 
+       cmd1="cat " FILE1; cmd2="cat " FILE2;
+       #end of preparing commands which give easily-predictable output
+
+       while( (cmd1 | getline)==1) { #terminates as file has only 1 line
+                                     #and we never close cmd1
+          cmd2 | getline L; 
+          #BUG: uncommenting the following line causes an infinite loop
+          close(cmd2);
+          print $0,L;
+          }
+      }
diff --git a/gawk-5.0.1/test/pipeio1.ok b/gawk-5.0.1/test/pipeio1.ok
new file mode 100644
index 00000000000..706b09ef72b
--- /dev/null
+++ b/gawk-5.0.1/test/pipeio1.ok
@@ -0,0 +1,2 @@
+1 2
+ 2
diff --git a/gawk-5.0.1/test/pipeio2.awk b/gawk-5.0.1/test/pipeio2.awk
new file mode 100644
index 00000000000..a4cd3bfab09
--- /dev/null
+++ b/gawk-5.0.1/test/pipeio2.awk
@@ -0,0 +1,72 @@
+# From: megaadm@rina.quantum.de
+# Subject: Bug report - closing down pipes which read from shell com
+# To: bug-gnu-utils@prep.ai.mit.edu
+# Date: Thu, 27 Feb 1997 23:19:16 +0100 (CET)
+# CC: arnold@gnu.ai.mit.edu
+# 
+# Hello people,
+# 
+# i think i found a bug or something mysterious behaviour in
+# gawk Version 3.0 patchlevel 0.
+# 
+# I am running on linux 2.0.25 under bash.
+# 
+# Could you please have a look at the following awk program
+# an let me please know, if this is what i expect it to,
+# namely a bug.
+# 
+# ----------- cut here --------------------------------------------
+BEGIN	{
+			# OS is linux 2.0.25
+			# shell is bash
+			# Gnu Awk (gawk) 3.0, patchlevel 0
+			# The command i typed on the shell was "gawk -f <this_prog> -"
+
+			#com = "cal 01 1997"
+			com = ("cat " SRCDIR "/pipeio2.in")
+
+			# Don't use empty lines, because Windows ECHO does
+			# something different when invoked without arguments
+			while ((com | getline fnam) > 0 && fnam != "") {
+
+#				com_tr = "echo " fnam " | tr [0-9]. ..........."
+#				com_tr = "echo " fnam " | sed 's/[0-9]/./g'"
+				com_tr = "echo " fnam " | sed \"s/[0-9]/./g\""
+				# print "\'" com_tr "\'"
+				print "'" com_tr "'"
+
+				com_tr | getline nam
+				print nam
+
+				# please run that program and take a look at the
+				# output. I think this is what was expected.
+
+				# Then comment in the following 4 lines and see
+				# what happens. I expect the first pipe "com | getline"
+				# not to be close, but i think this is exactly what happens
+				# So, is this ok ?
+
+				if (close(com_tr) < 0) {
+					print ERRNO
+					break
+				}
+			}
+
+			close(com)
+		}
+# ----------- cut here --------------------------------------------
+# 
+# There is another thing i do not understand.
+# Why doesn't the awk - command "close" reports an
+# error, if i would say close("abc") which i had never
+# openend ?
+# 
+# Regards,
+# Ulrich Gvbel
+# -- 
+# /********************************************************\
+# *     Ulrich Gvbel, goebel@quantum.de                    *
+# *     Quantum Gesellschaft f|r Software mbH, Dortmund    *
+# *     phone  : +49-231-9749-201  fax: +49-231-9749-3     *
+# *     private: +49-231-803994    fax: +49-231-803994     *
+# \********************************************************/
diff --git a/gawk-5.0.1/test/pipeio2.in b/gawk-5.0.1/test/pipeio2.in
new file mode 100644
index 00000000000..2652b0ef4be
--- /dev/null
+++ b/gawk-5.0.1/test/pipeio2.in
@@ -0,0 +1,8 @@
+   January 1997
+ S  M Tu  W Th  F  S
+          1  2  3  4
+ 5  6  7  8  9 10 11
+12 13 14 15 16 17 18
+19 20 21 22 23 24 25
+26 27 28 29 30 31
+
diff --git a/gawk-5.0.1/test/pipeio2.ok b/gawk-5.0.1/test/pipeio2.ok
new file mode 100644
index 00000000000..4514fbb3163
--- /dev/null
+++ b/gawk-5.0.1/test/pipeio2.ok
@@ -0,0 +1,14 @@
+'echo    January 1997 | sed "s/[0-9]/./g"'
+January ....
+'echo  S  M Tu  W Th  F  S | sed "s/[0-9]/./g"'
+S M Tu W Th F S
+'echo           1  2  3  4 | sed "s/[0-9]/./g"'
+. . . .
+'echo  5  6  7  8  9 10 11 | sed "s/[0-9]/./g"'
+. . . . . .. ..
+'echo 12 13 14 15 16 17 18 | sed "s/[0-9]/./g"'
+.. .. .. .. .. .. ..
+'echo 19 20 21 22 23 24 25 | sed "s/[0-9]/./g"'
+.. .. .. .. .. .. ..
+'echo 26 27 28 29 30 31 | sed "s/[0-9]/./g"'
+.. .. .. .. .. ..
diff --git a/gawk-5.0.1/test/posix.awk b/gawk-5.0.1/test/posix.awk
new file mode 100644
index 00000000000..79474f30053
--- /dev/null
+++ b/gawk-5.0.1/test/posix.awk
@@ -0,0 +1,69 @@
+BEGIN {
+	a = "+2"; b = 2; c = "+2a"; d = "+2 "; e = " 2"
+
+	printf "Test #1: "
+	if (b == a) print "\"" a "\"" " compares as a number"
+	else print "\"" a "\"" " compares as a string"
+
+	printf "Test #2: "
+	if (b == c) print "\"" c "\"" " compares as a number"
+	else print "\"" c "\"" " compares as a string"
+
+	printf "Test #3: "
+	if (b == d) print "\"" d "\"" " compares as a number"
+	else print "\"" d "\"" " compares as a string"
+
+	printf "Test #4: "
+	if (b == e) print "\"" e "\"" " compares as a number"
+	else print "\"" e "\"" " compares as a string"
+
+	f = a + b + c + d + e
+	print "after addition"
+
+	printf "Test #5: "
+	if (b == a) print "\"" a "\"" " compares as a number"
+	else print "\"" a "\"" " compares as a string"
+
+	printf "Test #6: "
+	if (b == c) print "\"" c "\"" " compares as a number"
+	else print "\"" c "\"" " compares as a string"
+
+	printf "Test #7: "
+	if (b == d) print "\"" d "\"" " compares as a number"
+	else print "\"" d "\"" " compares as a string"
+
+	printf "Test #8: "
+	if (b == e) print "\"" e "\"" " compares as a number"
+	else print "\"" e "\"" " compares as a string"
+
+	printf "Test #9: "
+	if ("3e5" > "5") print "\"3e5\" > \"5\""
+	else print "\"3e5\" <= \"5\""
+
+	printf "Test #10: "
+	x = 32.14
+	y[x] = "test"
+	OFMT = "%e"
+	print y[x]
+
+	printf "Test #11: "
+	x = x + 0
+	print y[x]
+
+	printf "Test #12: "
+	OFMT="%f"
+	CONVFMT="%e"
+	print 1.5, 1.5 ""
+
+	printf "Test #13: "
+	if ( 1000000 "" == 1000001 "") print "match"
+	else print "nomatch"
+}
+{
+	printf "Test #14: "
+	FS = ":"
+	print $1
+	FS = ","
+	printf "Test #15: "
+	print $2
+}
diff --git a/gawk-5.0.1/test/posix.in b/gawk-5.0.1/test/posix.in
new file mode 100644
index 00000000000..c16777b8cb7
--- /dev/null
+++ b/gawk-5.0.1/test/posix.in
@@ -0,0 +1 @@
+1:2,3 4
diff --git a/gawk-5.0.1/test/posix.ok b/gawk-5.0.1/test/posix.ok
new file mode 100644
index 00000000000..100b1505507
--- /dev/null
+++ b/gawk-5.0.1/test/posix.ok
@@ -0,0 +1,16 @@
+Test #1: "+2" compares as a string
+Test #2: "+2a" compares as a string
+Test #3: "+2 " compares as a string
+Test #4: " 2" compares as a string
+after addition
+Test #5: "+2" compares as a string
+Test #6: "+2a" compares as a string
+Test #7: "+2 " compares as a string
+Test #8: " 2" compares as a string
+Test #9: "3e5" <= "5"
+Test #10: test
+Test #11: test
+Test #12: 1.500000 1.500000e+00
+Test #13: nomatch
+Test #14: 1:2,3
+Test #15: 4
diff --git a/gawk-5.0.1/test/posix2008sub.awk b/gawk-5.0.1/test/posix2008sub.awk
new file mode 100644
index 00000000000..3c7c9b7721f
--- /dev/null
+++ b/gawk-5.0.1/test/posix2008sub.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	text = "here is some text"
+	repl = "<FOO&BAR \\q \\ \\\\ \\& \\\\& \\\\\\&>"
+	printf "orig = \"%s\", repl = \"%s\"\n", text, repl
+	sub(/some/, repl, text)
+	printf "result is \"%s\"\n", text
+}
diff --git a/gawk-5.0.1/test/posix2008sub.ok b/gawk-5.0.1/test/posix2008sub.ok
new file mode 100644
index 00000000000..4d4406a4fca
--- /dev/null
+++ b/gawk-5.0.1/test/posix2008sub.ok
@@ -0,0 +1,2 @@
+orig = "here is some text", repl = "<FOO&BAR \q \ \\ \& \\& \\\&>"
+result is "here is <FOOsomeBAR \q \ \ & \some \&> text"
diff --git a/gawk-5.0.1/test/poundbang.awk b/gawk-5.0.1/test/poundbang.awk
new file mode 100644
index 00000000000..a6440fff776
--- /dev/null
+++ b/gawk-5.0.1/test/poundbang.awk
@@ -0,0 +1,2 @@
+#! /tmp/gawk -f 
+{ print }
diff --git a/gawk-5.0.1/test/prdupval.awk b/gawk-5.0.1/test/prdupval.awk
new file mode 100644
index 00000000000..32c67dceb86
--- /dev/null
+++ b/gawk-5.0.1/test/prdupval.awk
@@ -0,0 +1 @@
+{ print NF, $NF, "abc" $NF }
diff --git a/gawk-5.0.1/test/prdupval.in b/gawk-5.0.1/test/prdupval.in
new file mode 100644
index 00000000000..5626abf0f72
--- /dev/null
+++ b/gawk-5.0.1/test/prdupval.in
@@ -0,0 +1 @@
+one
diff --git a/gawk-5.0.1/test/prdupval.ok b/gawk-5.0.1/test/prdupval.ok
new file mode 100644
index 00000000000..62536160dda
--- /dev/null
+++ b/gawk-5.0.1/test/prdupval.ok
@@ -0,0 +1 @@
+1 one abcone
diff --git a/gawk-5.0.1/test/prec.awk b/gawk-5.0.1/test/prec.awk
new file mode 100644
index 00000000000..8b377348ce0
--- /dev/null
+++ b/gawk-5.0.1/test/prec.awk
@@ -0,0 +1,7 @@
+# check the precedence of operators:
+BEGIN {
+	$1 = i = 1
+	$+i++
+	$- -i++
+	print
+}
diff --git a/gawk-5.0.1/test/prec.ok b/gawk-5.0.1/test/prec.ok
new file mode 100644
index 00000000000..d00491fd7e5
--- /dev/null
+++ b/gawk-5.0.1/test/prec.ok
@@ -0,0 +1 @@
+1
diff --git a/gawk-5.0.1/test/printf0.awk b/gawk-5.0.1/test/printf0.awk
new file mode 100644
index 00000000000..ac8ad3c20da
--- /dev/null
+++ b/gawk-5.0.1/test/printf0.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	# bwk accepts this silently:
+	printf
+	print "X"
+}
diff --git a/gawk-5.0.1/test/printf0.ok b/gawk-5.0.1/test/printf0.ok
new file mode 100644
index 00000000000..62d8fe9f6db
--- /dev/null
+++ b/gawk-5.0.1/test/printf0.ok
@@ -0,0 +1 @@
+X
diff --git a/gawk-5.0.1/test/printf1.awk b/gawk-5.0.1/test/printf1.awk
new file mode 100644
index 00000000000..1cd7b99fff7
--- /dev/null
+++ b/gawk-5.0.1/test/printf1.awk
@@ -0,0 +1,19 @@
+# Tue May 25 16:36:16 IDT 1999
+#
+# Test cases based on email from Andreas Schwab, schwab@gnu.org
+
+BEGIN {
+	fmt[1] = "%8.5d";	data[1] = 100
+	fmt[2] = "%#o";		data[2] = 0
+	fmt[3] = "%#.1o";	data[3] = 0
+	fmt[4] = "%#.0o";	data[4] = 0
+	fmt[5] = "%#x";		data[5] = 0
+	fmt[6] = "%.0d";	data[6] = 0
+	fmt[7] = "%5.0d";	data[7] = 0
+
+	for (i = 1; i <= 7; i++) {
+		format = "%s, %d --- |" fmt[i] "|\n"
+		printf(format, fmt[i], data[i], data[i])
+	}
+
+}
diff --git a/gawk-5.0.1/test/printf1.ok b/gawk-5.0.1/test/printf1.ok
new file mode 100644
index 00000000000..32b3a7d87a0
--- /dev/null
+++ b/gawk-5.0.1/test/printf1.ok
@@ -0,0 +1,7 @@
+%8.5d, 100 --- |   00100|
+%#o, 0 --- |0|
+%#.1o, 0 --- |0|
+%#.0o, 0 --- |0|
+%#x, 0 --- |0|
+%.0d, 0 --- ||
+%5.0d, 0 --- |     |
diff --git a/gawk-5.0.1/test/printfbad1.awk b/gawk-5.0.1/test/printfbad1.awk
new file mode 100644
index 00000000000..1b478df9971
--- /dev/null
+++ b/gawk-5.0.1/test/printfbad1.awk
@@ -0,0 +1,65 @@
+#Date: Mon, 7 Jun 2004 10:40:28 -0500
+#From: mary1john8@earthlink.net
+#To: arnold@skeeve.com
+#Subject: gawk internal errors
+#Message-ID: <20040607154028.GA2457@apollo>
+#
+#Hello,
+#
+#    gawk-3.1.3i internal errors:
+#
+#[1]
+#
+#$> ./gawk 'BEGIN { for (i in a) delete a; }'
+#gawk: fatal error: internal error
+#Aborted
+#
+#------------------------------------------------------------------
+#--- awkgram.y.orig	2004-06-07 09:42:14.000000000 -0500
+#+++ awkgram.y	2004-06-07 09:45:58.000000000 -0500
+#@@ -387,7 +387,7 @@
+# 		 * Check that the body is a `delete a[i]' statement,
+# 		 * and that both the loop var and array names match.
+# 		 */
+#-		if ($8 != NULL && $8->type == Node_K_delete) {
+#+		if ($8 != NULL && $8->type == Node_K_delete && $8->rnode != NULL) {
+# 			NODE *arr, *sub;
+# 
+# 			assert($8->rnode->type == Node_expression_list);
+#------------------------------------------------------------------
+#
+#
+#[2]
+#
+#$> ./gawk 'BEGIN { printf("%3$*10$.*1$s\n", 20, 10, "hello"); }'
+BEGIN { printf("%3$*10$.*1$s\n", 20, 10, "hello"); }
+#gawk: fatal error: internal error
+#Aborted
+#
+#------------------------------------------------------------------
+#--- builtin.c.orig	2004-06-07 10:04:20.000000000 -0500
+#+++ builtin.c	2004-06-07 10:06:08.000000000 -0500
+#@@ -780,7 +780,10 @@
+# 					s1++;
+# 					n0--;
+# 				}
+#-
+#+				if (val >= num_args) {
+#+					toofew = TRUE;
+#+					break;
+#+				}
+# 				arg = the_args[val];
+# 			} else {
+# 				parse_next_arg();
+#------------------------------------------------------------------
+#
+#
+#    Finally, a test for the rewritten get_src_buf():
+#
+#$> AWKBUFSIZE=2 make check
+#
+#I get 3 failed tests. Not sure this is of any interest.
+#
+#
+#Thanks,
+#John
diff --git a/gawk-5.0.1/test/printfbad1.ok b/gawk-5.0.1/test/printfbad1.ok
new file mode 100644
index 00000000000..d02140a68e7
--- /dev/null
+++ b/gawk-5.0.1/test/printfbad1.ok
@@ -0,0 +1,5 @@
+gawk: printfbad1.awk:35: fatal: not enough arguments to satisfy format string
+	`%3$*10$.*1$s
+'
+	      ^ ran out for this one
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/printfbad2.awk b/gawk-5.0.1/test/printfbad2.awk
new file mode 100644
index 00000000000..d3bb36855c2
--- /dev/null
+++ b/gawk-5.0.1/test/printfbad2.awk
@@ -0,0 +1,2 @@
+BEGIN { FS = "a" }
+{ printf ($2 "\n") }
diff --git a/gawk-5.0.1/test/printfbad2.in b/gawk-5.0.1/test/printfbad2.in
new file mode 100644
index 00000000000..1faae6d83d0
--- /dev/null
+++ b/gawk-5.0.1/test/printfbad2.in
@@ -0,0 +1 @@
+a%28b%29%c
diff --git a/gawk-5.0.1/test/printfbad2.ok b/gawk-5.0.1/test/printfbad2.ok
new file mode 100644
index 00000000000..67d16608b8f
--- /dev/null
+++ b/gawk-5.0.1/test/printfbad2.ok
@@ -0,0 +1,3 @@
+gawk: printfbad2.awk:2: (FILENAME=printfbad2.in FNR=1) warning: ignoring unknown format specifier character `b': no argument converted
+gawk: printfbad2.awk:2: (FILENAME=printfbad2.in FNR=1) warning: field width is ignored for `%%' specifier
+%28b%c
diff --git a/gawk-5.0.1/test/printfbad3.awk b/gawk-5.0.1/test/printfbad3.awk
new file mode 100644
index 00000000000..1cabdd76881
--- /dev/null
+++ b/gawk-5.0.1/test/printfbad3.awk
@@ -0,0 +1,22 @@
+# Date: Wed, 14 Mar 2012 08:10:48 -0500
+# From: John Haque <j.eh@mchsi.com>
+# To: arnold@skeeve.com
+# Subject: gawk printf format bug 
+# 
+# Hi.
+# 
+# I think this is a bug:
+# 
+# $ gawk 'BEGIN { printf("%.0x%#x%#x\n", 0, 167, 167)}'
+# 570xa7
+# 
+# It should print 0xa70xa7.
+# 
+# The solution is to initialize base to 0 in the beginning
+# of the while loop along with other stuff (format_tree).
+# 
+# Thanks.
+# 
+# John
+ 
+BEGIN { printf(">>%.0x<< >>%#x<< >>%#x<<\n", 0, 167, 167) }
diff --git a/gawk-5.0.1/test/printfbad3.ok b/gawk-5.0.1/test/printfbad3.ok
new file mode 100644
index 00000000000..a87b0192565
--- /dev/null
+++ b/gawk-5.0.1/test/printfbad3.ok
@@ -0,0 +1 @@
+>><< >>0xa7<< >>0xa7<<
diff --git a/gawk-5.0.1/test/printfbad4.awk b/gawk-5.0.1/test/printfbad4.awk
new file mode 100644
index 00000000000..dd9220ae20f
--- /dev/null
+++ b/gawk-5.0.1/test/printfbad4.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	for (i = 1; i <= 10; i++) {
+		printf "%03$*d %2$d \n", 4, 5, i
+	}
+}
diff --git a/gawk-5.0.1/test/printfbad4.ok b/gawk-5.0.1/test/printfbad4.ok
new file mode 100644
index 00000000000..71eed3d6fca
--- /dev/null
+++ b/gawk-5.0.1/test/printfbad4.ok
@@ -0,0 +1,2 @@
+gawk: printfbad4.awk:3: fatal: fatal: must use `count$' on all formats or none
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/printfchar.awk b/gawk-5.0.1/test/printfchar.awk
new file mode 100644
index 00000000000..9e703c31f7d
--- /dev/null
+++ b/gawk-5.0.1/test/printfchar.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	x[65]
+	for (i in x) {
+		# i should be a string
+		printf "%c\n", i	# should print 1st char of string
+	}
+}
diff --git a/gawk-5.0.1/test/printfchar.ok b/gawk-5.0.1/test/printfchar.ok
new file mode 100644
index 00000000000..1e8b3149621
--- /dev/null
+++ b/gawk-5.0.1/test/printfchar.ok
@@ -0,0 +1 @@
+6
diff --git a/gawk-5.0.1/test/printfloat.awk b/gawk-5.0.1/test/printfloat.awk
new file mode 100644
index 00000000000..1cb40660d35
--- /dev/null
+++ b/gawk-5.0.1/test/printfloat.awk
@@ -0,0 +1,62 @@
+# Test program for checking sprintf operation with various floating
+# point formats
+#
+# Watch out - full output of this program will have 3000 * tot lines,
+# which will take a chunk of space if you will write it to your disk.
+# --mj
+
+BEGIN {
+    just = "-"
+    plus = "+ "
+    alt  = "#"
+    zero = "0"
+    spec = "feEgG"
+    fw[1] = ""
+    fw[2] = "1"
+    fw[3] = "5"
+    fw[4] = "10"
+    fw[5] = "15"
+    prec[1] = ".-1"
+    prec[2] = ""
+    prec[3] = ".2"
+    prec[4] = ".5"
+    prec[5] = ".10"
+
+    num = 123.6
+    factor = 1.0e-12
+    tot = 8
+    data[1] = 0
+    data[2] = 1
+    for (i = 3; i <= tot; i++) {
+	data[i] = num * factor
+	factor *= 1000
+    }
+
+    for (j = 1; j <= 2; j++) {
+	for (p = 1; p <= 3; p++) {
+	    for (a = 1; a <= 2; a++) {
+		for (z = 1; z <= 2; z++) {
+		    for (s = 1; s <= 5; s++) {
+			for (w = 1; w <= 5; w++) {
+			    for (r = 1; r <= 5; r++) {
+				frmt = "|%" substr(just, j, 1)
+				frmt = frmt substr(plus, p, 1)
+				frmt = frmt substr(alt,  a, 1)
+				frmt = frmt substr(zero, z, 1)
+				frmt = frmt fw[w] prec[r]
+				frmt = frmt substr(spec, s, 1) "|"
+				for (i = 1; i <= tot; i++) {
+				    result = sprintf(frmt, data[i])
+#				    "normalize" if you must
+#				    sub(/\|\./, "|0.", result)
+				    printf("%-16s %-25s\t%g\n", frmt,
+						 result,data[i])
+				}
+			    }
+			}
+		    }
+		}
+	    }
+	}
+    }
+}
diff --git a/gawk-5.0.1/test/printhuge.awk b/gawk-5.0.1/test/printhuge.awk
new file mode 100644
index 00000000000..1de27eccdf8
--- /dev/null
+++ b/gawk-5.0.1/test/printhuge.awk
@@ -0,0 +1,3 @@
+BEGIN {
+	printf("%c\n", sprintf("%c", (0xffffff00+255)))
+}
diff --git a/gawk-5.0.1/test/printhuge.ok b/gawk-5.0.1/test/printhuge.ok
new file mode 100644
index 00000000000..29e181ebb88
--- /dev/null
+++ b/gawk-5.0.1/test/printhuge.ok
@@ -0,0 +1 @@
+�
diff --git a/gawk-5.0.1/test/printlang.awk b/gawk-5.0.1/test/printlang.awk
new file mode 100644
index 00000000000..03e06c0e1aa
--- /dev/null
+++ b/gawk-5.0.1/test/printlang.awk
@@ -0,0 +1,4 @@
+BEGIN {
+	printf "\nLocale environment:\n\tLC_ALL=\"%s\" LANG=\"%s\"\n\n",
+		ENVIRON["LC_ALL"], ENVIRON["LANG"]
+}
diff --git a/gawk-5.0.1/test/prmarscl.awk b/gawk-5.0.1/test/prmarscl.awk
new file mode 100644
index 00000000000..3caf3d9c7f7
--- /dev/null
+++ b/gawk-5.0.1/test/prmarscl.awk
@@ -0,0 +1,6 @@
+function test(a)
+{
+	print a[1]
+}
+
+BEGIN	{ j = 4; test(j) }
diff --git a/gawk-5.0.1/test/prmarscl.ok b/gawk-5.0.1/test/prmarscl.ok
new file mode 100644
index 00000000000..a0f7ab81842
--- /dev/null
+++ b/gawk-5.0.1/test/prmarscl.ok
@@ -0,0 +1,2 @@
+gawk: prmarscl.awk:3: fatal: attempt to use scalar parameter `a' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/prmreuse.awk b/gawk-5.0.1/test/prmreuse.awk
new file mode 100644
index 00000000000..c1ffa179f85
--- /dev/null
+++ b/gawk-5.0.1/test/prmreuse.awk
@@ -0,0 +1,14 @@
+# from Pat Rankin, rankin@eql.caltech.edu, now rankin@pactechdata.com
+
+BEGIN { dummy(1); legit(); exit }
+
+function dummy(arg)
+{
+	return arg
+}
+
+function legit(         scratch)
+{
+	split("1 2 3", scratch)
+	return ""
+}
diff --git a/gawk-5.0.1/test/prmreuse.ok b/gawk-5.0.1/test/prmreuse.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/procinfs.awk b/gawk-5.0.1/test/procinfs.awk
new file mode 100644
index 00000000000..53cfa97758b
--- /dev/null
+++ b/gawk-5.0.1/test/procinfs.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	printf "Initially, PROCINFO[\"FS\"] = %s\n", PROCINFO["FS"]
+	FIELDWIDTHS = "3 4 5 6"
+	printf "After assign to FIELDWIDTHS, PROCINFO[\"FS\"] = %s\n", PROCINFO["FS"]
+	FS = FS
+	printf "After assign to FS, PROCINFO[\"FS\"] = %s\n", PROCINFO["FS"]
+}
diff --git a/gawk-5.0.1/test/procinfs.ok b/gawk-5.0.1/test/procinfs.ok
new file mode 100644
index 00000000000..23aaeff00a4
--- /dev/null
+++ b/gawk-5.0.1/test/procinfs.ok
@@ -0,0 +1,3 @@
+Initially, PROCINFO["FS"] = FS
+After assign to FIELDWIDTHS, PROCINFO["FS"] = FIELDWIDTHS
+After assign to FS, PROCINFO["FS"] = FS
diff --git a/gawk-5.0.1/test/profile0.awk b/gawk-5.0.1/test/profile0.awk
new file mode 100644
index 00000000000..a42e94df02b
--- /dev/null
+++ b/gawk-5.0.1/test/profile0.awk
@@ -0,0 +1 @@
+NR == 1
diff --git a/gawk-5.0.1/test/profile0.in b/gawk-5.0.1/test/profile0.in
new file mode 100644
index 00000000000..7bba8c8e64b
--- /dev/null
+++ b/gawk-5.0.1/test/profile0.in
@@ -0,0 +1,2 @@
+line 1
+line 2
diff --git a/gawk-5.0.1/test/profile0.ok b/gawk-5.0.1/test/profile0.ok
new file mode 100644
index 00000000000..42c464ba9d5
--- /dev/null
+++ b/gawk-5.0.1/test/profile0.ok
@@ -0,0 +1,6 @@
+	# Rule(s)
+
+     2  NR == 1 { # 1
+     1  	print
+	}
+
diff --git a/gawk-5.0.1/test/profile10.awk b/gawk-5.0.1/test/profile10.awk
new file mode 100644
index 00000000000..b78ae447470
--- /dev/null
+++ b/gawk-5.0.1/test/profile10.awk
@@ -0,0 +1,42 @@
+BEGIN {			# Comment 0
+	if (1) {	# Comment 1
+		print "ABC"	# Comment2
+	} else {	# Comment 3
+		print "XYZ"	# Comment 4
+	}			# Comment 5
+
+	while (c == d) {	# Comment 6
+		print "DEF"	# Comment 7
+	}			# Comment 8
+
+	do {			# Comment 9
+		print "GHI"	# Comment 10
+	} while (e == f)	# Comment 11
+
+	for (i in data) {	# Comment 12
+		print "JKL"	# Comment 13
+	}			# Comment 14
+
+	for (z = 1; z <= 10; z++) {	# Comment 15
+		print "MNO"		# Comment 16
+	}				# Comment 17
+
+	switch (q) {	# Comment 18
+	case "a":	# Comment 19
+	case "b":
+		# Comment 20
+		break	# Comment 21
+	default:	# Comment 22
+		break	# Comment 23
+	}		# Comment 24
+
+	if (1) {
+		print "foo"
+	}		# Comment 25
+
+	if (2) {
+		print "bar"
+	}
+	# Comment 26
+}
+# Comment 27
diff --git a/gawk-5.0.1/test/profile10.ok b/gawk-5.0.1/test/profile10.ok
new file mode 100644
index 00000000000..0f77bd38ef5
--- /dev/null
+++ b/gawk-5.0.1/test/profile10.ok
@@ -0,0 +1,38 @@
+BEGIN {	# Comment 0
+	if (1) {	# Comment 1
+		print "ABC"	# Comment2
+	} else {	# Comment 3
+		print "XYZ"	# Comment 4
+	}	# Comment 5
+	while (c == d) {	# Comment 6
+		print "DEF"	# Comment 7
+	}	# Comment 8
+	do {	# Comment 9
+		print "GHI"	# Comment 10
+	} while (e == f)	# Comment 11
+	for (i in data) {	# Comment 12
+		print "JKL"	# Comment 13
+	}	# Comment 14
+	for (z = 1; z <= 10; z++) {	# Comment 15
+		print "MNO"	# Comment 16
+	}	# Comment 17
+	switch (q) {
+	# Comment 18
+	case "a":	# Comment 19
+	case "b":
+		# Comment 20
+		break	# Comment 21
+	default:	# Comment 22
+		break	# Comment 23
+	}
+	# Comment 24
+	if (1) {
+		print "foo"
+	}	# Comment 25
+	if (2) {
+		print "bar"
+	}
+	# Comment 26
+}
+
+# Comment 27
diff --git a/gawk-5.0.1/test/profile11.awk b/gawk-5.0.1/test/profile11.awk
new file mode 100644
index 00000000000..06ede8ac1fe
--- /dev/null
+++ b/gawk-5.0.1/test/profile11.awk
@@ -0,0 +1,321 @@
+
+# comments/for.awk
+BEGIN {
+	for (i = 1; i <= 10; i++) print i
+
+	for (i = 1; i <= 10; i++)	# comment 0
+		print i
+
+	for (i = 1; # comment 1a
+		i <= 10; i++) print i
+
+	for (i = 1; i <= 10; # comment 2a
+			i++) print i
+
+	for (i = 1;	# comment 1b
+		i <= 10;	# comment 2b
+		i++) print i
+
+	for (i = 1;	# comment 1c
+		i <= 10;	# comment 2c
+		i++)	# comment 3c
+		print i
+}
+
+# comments/for0.awk
+BEGIN {
+	for (iggy in foo)	# comment 5
+		# comment 6
+		;
+}
+
+# comments/for1.awk
+BEGIN {
+	for (iggy in foo)	# comment 1
+		# comment 2
+	{
+		print iggy
+	}
+
+	for (iggy in foo)	# comment 3
+		# comment 4
+		print iggy
+
+	for (iggy in foo)	# comment 5
+		# comment 6
+		;
+}
+
+# comments/for2.awk
+BEGIN {
+	for (;;) print i
+
+	for (;;)	# comment 0
+		print i
+
+	for (; # comment 1a
+		;) print i
+
+	for (; ; # comment 2a
+			) print i
+
+	for (;	# comment 1b
+		;	# comment 2b
+		) print i
+
+	for (;	# comment 1c
+		;	# comment 2c
+		)	# comment 3c
+		print i
+}
+
+# comments/for_del.awk
+BEGIN { for (iggy in foo) delete foo[iggy] }
+
+# comments/do.awk
+BEGIN {
+	do	# DO comment
+	{	# LBRACE comment
+		# block comment
+		print 42
+	} # rbrace comment
+	while (0)	# WHILE comment
+}
+
+# comments/do2.awk
+BEGIN {
+	do	# DO comment
+	{	# LBRACE comment
+		# block comment
+		print 42
+	} # rbrace comment
+	while (0)
+}
+
+# comments2/do.awk
+BEGIN {
+	do  # do comment
+	{	# lbrace comment
+		# block comment
+		print 42
+	} # rbace EOL comment
+	# rbrace block comment
+	while (1)	# while comment
+}
+
+# comments2/if.awk
+BEGIN {
+	if (a)	# IF comment
+		print "foo"	# print comment
+
+	if (a)	# IF comment 2
+	{	# lbrace comment
+		print "bar"
+	}
+	else	# ELSE comment
+		print "baz"
+}
+
+# comments/if0.awk
+BEGIN {
+	if (a)
+		; # nothing
+	else
+		print "b"
+}
+
+# comments/switch.awk
+BEGIN {
+	a = 5
+	switch (a)	# switch EOL comment
+		# switch block comment
+	{		# lbrace EOL comment
+		# lbrace block comment
+	case 5:	# comment after case
+		print "five!"
+		break
+	# block comment after case
+	default:	# comment after default
+		print "default"		# print comment
+		break
+	}	# rbrace EOL comment
+	# rbrace block comment
+}
+
+# comments2/switch.awk
+BEGIN {
+	a = 5
+	switch (a)	# switch EOL comment
+		# switch block comment
+	{		# lbrace EOL comment
+		# lbrace block comment
+	case 5:
+		print "five!"
+		break;
+	# block comment after case
+	}	# rbrace EOL comment
+	# rbrace block comment
+}
+
+# comments2/switch0.awk
+BEGIN {
+	a = 5
+	switch (a)
+	{
+	case 5: # case comment
+		print "five!"
+		break
+    default:    # default comment
+        print "default"
+        break
+	}
+}
+
+# comments2/switch1.awk
+BEGIN {
+	a = 5
+	switch (a)
+	{
+	case 5:
+        # case comment
+		print "five!"
+		break
+    default:    # default comment
+        print "default"
+        break
+	}
+}
+
+# comments2/while.awk
+BEGIN {
+	while (1)	# while comment
+	{	# lbrace comment
+		# block comment
+		print 42
+	}
+}
+
+# comments2/while2.awk
+BEGIN {
+	while (1)	# while comment
+	{	# lbrace comment
+		# block comment
+	}
+}
+
+# comments2/f.awk
+function bar(p1,
+	p2)
+{
+	print "foo"
+}	# rbrace eol bar
+	# rbrace block bar
+
+# comments2/function.awk
+function baz(p1, # comment
+	p2)
+	# comment before braces
+{	# lbrace eol
+	# lbrace block
+	print "foo"
+}	# rbrace eol baz
+	# rbrace block baz
+
+# comments/function.awk
+function funny(param1,	# param comment 1
+		param2, param3,	# param comment 2
+		param4)
+	# Comment between header and body
+{	# lbrace EOL comment
+	# lbrace block comment
+	print "funny"
+}	# rbrace EOL comment funny
+	# rbrace block comment funny
+
+# comments/function2.awk
+function funnyhaha(param1,
+		param2, param3,
+		param4)
+{	# lbrace EOL comment
+	# lbrace block comment
+	print "funny"
+}	# rbrace EOL comment funnyhaha
+	# rbrace block comment funnyhaha
+
+# comments/callcoma.awk
+function callme(a, b, c)
+{
+	printf("a = %s, b = %s, c = %s\n",	# format comment
+		a,	# a2 comment
+		b,	# b2 comment
+		c)
+}
+
+BEGIN {
+	callme(1,	# 1 comment
+		2, # 2 comment
+		3)
+}
+
+# comments/exp.awk
+/foo/,  # range comment
+        # range comment 2
+
+# range comment b
+
+# range comment c
+/bar/   { print }
+
+# comments/load.awk
+@load "filefuncs" 	# get file functions
+
+BEGIN {
+	stat("/etc/passwd", data)
+	for (i in data)
+		print i, data[i]
+}
+
+# comments/andor.awk
+BEGIN {
+	if (a &&	# and comment
+		b ||	# or comment
+		c)
+		print "foo"
+}
+
+# comments/qmcol-qm.awk
+BEGIN {
+	a = 1 ? # qm comment
+		2 :
+		3
+	print a
+}
+
+# comments/qmcol-colon.awk
+BEGIN {
+	a = 1 ?
+		2 : # colon comment
+		3
+	print a
+}
+
+# comments/qmcolboth.awk
+BEGIN {
+	a = 1 ? # qm comment
+		2 : # colon comment
+		3
+	print a
+}
+
+# test beginning of line block comments (com2.awk)
+BEGIN {
+	print "hi" # comment 1
+# comment 2
+	print "there"
+
+	if (foo) {
+		print "hello" # comment 3
+# comment 4
+ 		print "world"
+	}
+}
diff --git a/gawk-5.0.1/test/profile11.ok b/gawk-5.0.1/test/profile11.ok
new file mode 100644
index 00000000000..be027371d75
--- /dev/null
+++ b/gawk-5.0.1/test/profile11.ok
@@ -0,0 +1,371 @@
+@load "filefuncs"	# get file functions
+
+# comments/for.awk
+BEGIN {
+	for (i = 1; i <= 10; i++) {
+		print i
+	}
+	for (i = 1; i <= 10; i++) {	# comment 0
+		print i
+	}
+	for (i = 1; 	# comment 1a
+		i <= 10; i++) {
+		print i
+	}
+	for (i = 1; i <= 10; 	# comment 2a
+		i++) {
+		print i
+	}
+	for (i = 1; 	# comment 1b
+		i <= 10; 	# comment 2b
+		i++) {
+		print i
+	}
+	for (i = 1; 	# comment 1c
+		i <= 10; 	# comment 2c
+		i++) {	# comment 3c
+		print i
+	}
+}
+
+# comments/for0.awk
+BEGIN {
+	for (iggy in foo) {
+		# comment 5
+		
+		# comment 6
+	}
+}
+
+# comments/for1.awk
+BEGIN {
+	for (iggy in foo) {
+		# comment 1
+		
+		# comment 2
+		print iggy
+	}
+	for (iggy in foo) {
+		# comment 3
+		
+		# comment 4
+		print iggy
+	}
+	for (iggy in foo) {
+		# comment 5
+		
+		# comment 6
+	}
+}
+
+# comments/for2.awk
+BEGIN {
+	for (;;) {
+		print i
+	}
+	for (;;) {	# comment 0
+		print i
+	}
+	for (; 	# comment 1a
+		; ) {
+		print i
+	}
+	for (; ; 	# comment 2a
+		) {
+		print i
+	}
+	for (; 	# comment 1b
+		; 	# comment 2b
+		) {
+		print i
+	}
+	for (; 	# comment 1c
+		; 	# comment 2c
+		) {	# comment 3c
+		print i
+	}
+}
+
+# comments/for_del.awk
+BEGIN {
+	for (iggy in foo) {
+		delete foo[iggy]
+	}
+}
+
+# comments/do.awk
+BEGIN {
+	do {	# DO comment
+		# LBRACE comment
+		# block comment
+		print 42
+	} while (0)	# WHILE comment
+	# rbrace comment
+}
+
+# comments/do2.awk
+BEGIN {
+	do {	# DO comment
+		# LBRACE comment
+		# block comment
+		print 42
+	} while (0)	# rbrace comment
+}
+
+# comments2/do.awk
+BEGIN {
+	do {	# do comment
+		# lbrace comment
+		# block comment
+		print 42
+	} while (1)	# while comment
+	# rbace EOL comment
+	# rbrace block comment
+}
+
+# comments2/if.awk
+BEGIN {
+	if (a) {
+		# IF comment
+		print "foo"	# print comment
+	}
+	if (a) {	# lbrace comment
+		# IF comment 2
+		print "bar"
+	} else {
+		# ELSE comment
+		print "baz"
+	}
+}
+
+# comments/if0.awk
+BEGIN {
+	if (a) {
+		# nothing
+	} else {
+		print "b"
+	}
+}
+
+# comments/switch.awk
+BEGIN {
+	a = 5
+	switch (a) {
+	# switch EOL comment
+	
+	# switch block comment
+	
+	# lbrace EOL comment
+	
+	# lbrace block comment
+	case 5:	# comment after case
+		print "five!"
+		break
+		# block comment after case
+	default:	# comment after default
+		print "default"	# print comment
+		break
+	}
+	# rbrace EOL comment
+	# rbrace block comment
+}
+
+# comments2/switch.awk
+BEGIN {
+	a = 5
+	switch (a) {
+	# switch EOL comment
+	
+	# switch block comment
+	
+	# lbrace EOL comment
+	
+	# lbrace block comment
+	case 5:
+		print "five!"
+		break
+		# block comment after case
+	}
+	# rbrace EOL comment
+	# rbrace block comment
+}
+
+# comments2/switch0.awk
+BEGIN {
+	a = 5
+	switch (a) {
+	case 5:	# case comment
+		print "five!"
+		break
+	default:	# default comment
+		print "default"
+		break
+	}
+}
+
+# comments2/switch1.awk
+BEGIN {
+	a = 5
+	switch (a) {
+	case 5:
+		# case comment
+		print "five!"
+		break
+	default:	# default comment
+		print "default"
+		break
+	}
+}
+
+# comments2/while.awk
+BEGIN {
+	while (1) {
+		# while comment
+		# lbrace comment
+		# block comment
+		print 42
+	}
+}
+
+# comments2/while2.awk
+BEGIN {
+	while (1) {
+		# while comment
+		# lbrace comment
+		# block comment
+	}
+}
+
+BEGIN {
+	callme(1, # 1 comment
+		2, # 2 comment
+		3)
+}
+
+# comments/load.awk
+BEGIN {
+	stat("/etc/passwd", data)
+	for (i in data) {
+		print i, data[i]
+	}
+}
+
+# comments/andor.awk
+BEGIN {
+	if (a && # and comment
+		 b || # or comment
+		 c) {
+		print "foo"
+	}
+}
+
+# comments/qmcol-qm.awk
+BEGIN {
+	a = 1 ? # qm comment
+		   2 : 3
+	print a
+}
+
+# comments/qmcol-colon.awk
+BEGIN {
+	a = 1 ? 2 : # colon comment
+		   3
+	print a
+}
+
+# comments/qmcolboth.awk
+BEGIN {
+	a = 1 ? # qm comment
+		   2 : # colon comment
+		   3
+	print a
+}
+
+# test beginning of line block comments (com2.awk)
+BEGIN {
+	print "hi"	# comment 1
+	# comment 2
+	print "there"
+	if (foo) {
+		print "hello"	# comment 3
+		# comment 4
+		print "world"
+	}
+}
+
+# comments/exp.awk
+# range comment
+# range comment 2
+
+# range comment b
+
+# range comment c
+/foo/, /bar/ {
+	print
+}
+
+
+# comments2/f.awk
+function bar(p1, p2)
+{
+	print "foo"
+}
+
+# rbrace eol bar
+
+# rbrace block bar
+
+# comments2/function.awk
+
+# comment
+
+# comment before braces
+function baz(p1, p2)
+{
+	# lbrace eol
+	# lbrace block
+	print "foo"
+}
+
+# rbrace EOL comment funnyhaha
+
+# rbrace block comment funnyhaha
+
+# comments/callcoma.awk
+function callme(a, b, c)
+{
+	printf "a = %s, b = %s, c = %s\n", # format comment
+		a, # a2 comment
+		b, # b2 comment
+		c
+}
+
+# rbrace eol baz
+
+# rbrace block baz
+
+# comments/function.awk
+
+# param comment 1
+
+# param comment 2
+
+# Comment between header and body
+function funny(param1, param2, param3, param4)
+{
+	# lbrace EOL comment
+	# lbrace block comment
+	print "funny"
+}
+
+# rbrace EOL comment funny
+
+# rbrace block comment funny
+
+# comments/function2.awk
+function funnyhaha(param1, param2, param3, param4)
+{
+	# lbrace EOL comment
+	# lbrace block comment
+	print "funny"
+}
diff --git a/gawk-5.0.1/test/profile12.awk b/gawk-5.0.1/test/profile12.awk
new file mode 100644
index 00000000000..6664e681d0c
--- /dev/null
+++ b/gawk-5.0.1/test/profile12.awk
@@ -0,0 +1,3 @@
+NR == 1
+NR == 2 { print }
+NR == 3 { print $0 }
diff --git a/gawk-5.0.1/test/profile12.in b/gawk-5.0.1/test/profile12.in
new file mode 100644
index 00000000000..e5791419fa0
--- /dev/null
+++ b/gawk-5.0.1/test/profile12.in
@@ -0,0 +1,4 @@
+Line 1
+Line 2
+Line 3
+Line 4
diff --git a/gawk-5.0.1/test/profile12.ok b/gawk-5.0.1/test/profile12.ok
new file mode 100644
index 00000000000..6ad36e52f00
--- /dev/null
+++ b/gawk-5.0.1/test/profile12.ok
@@ -0,0 +1,3 @@
+Line 1
+Line 2
+Line 3
diff --git a/gawk-5.0.1/test/profile2.ok b/gawk-5.0.1/test/profile2.ok
new file mode 100644
index 00000000000..1db4c2f0e25
--- /dev/null
+++ b/gawk-5.0.1/test/profile2.ok
@@ -0,0 +1,144 @@
+	# BEGIN rule(s)
+
+	BEGIN {
+     1  	if (sortcmd == "") {
+			sortcmd = "sort"
+		}
+     1  	asplit("BEGIN:END:atan2:break:close:continue:cos:delete:" "do:else:exit:exp:for:getline:gsub:if:in:index:int:" "length:log:match:next:print:printf:rand:return:sin:" "split:sprintf:sqrt:srand:sub:substr:system:while", keywords, ":")
+     1  	split("00:00:00:00:00:00:00:00:00:00:" "20:10:10:12:12:11:07:00:00:00:" "08:08:08:08:08:33:08:00:00:00:" "08:44:08:36:08:08:08:00:00:00:" "08:44:45:42:42:41:08", machine, ":")
+     1  	state = 1
+   571  	for (;;) {
+   571  		symb = lex()
+   571  		nextstate = substr(machine[state symb], 1, 1)
+   571  		act = substr(machine[state symb], 2, 1)
+   571  		if (act == "0") { # 12
+   559  		} else if (act == "1") { # 8
+     8  			if (! inarray(tok, names)) { # 3
+     3  				names[++nnames] = tok
+				}
+     8  			lines[tok, ++xnames[tok]] = NR
+   551  		} else if (act == "2") { # 426
+   426  			if (tok in local) { # 309
+   309  				tok = tok "(" funcname ")"
+   309  				if (! inarray(tok, names)) { # 22
+    22  					names[++nnames] = tok
+					}
+   309  				lines[tok, ++xnames[tok]] = NR
+   117  			} else {
+   117  				tok = tok "()"
+   117  				if (! inarray(tok, names)) { # 22
+    22  					names[++nnames] = tok
+					}
+   117  				lines[tok, ++xnames[tok]] = NR
+				}
+   125  		} else if (act == "3") { # 4
+     4  			funcname = tok
+     4  			flines[tok] = NR
+   121  		} else if (act == "4") { # 49
+    49  			braces++
+    72  		} else if (act == "5") { # 49
+    49  			braces--
+    49  			if (braces == 0) { # 4
+    22  				for (temp in local) {
+    22  					delete local[temp]
+					}
+     4  				funcname = ""
+     4  				nextstate = 1
+				}
+    23  		} else if (act == "6") { # 22
+    22  			local[tok] = 1
+     1  		} else if (act == "7") { # 1
+     1  			break
+			} else if (act == "8") {
+				print("error: xref.awk: line " NR ": aborting") > "/dev/con"
+				exit 1
+			}
+   570  		state = nextstate
+		}
+    47  	for (i = 1; i <= nnames; i++) {
+    47  		printf("%d ", xnames[names[i]]) | sortcmd
+    47  		if (index(names[i], "(") == 0) { # 3
+     3  			printf("%s(%d)", names[i], flines[names[i]]) | sortcmd
+    44  		} else {
+    44  			printf("%s", names[i]) | sortcmd
+			}
+   434  		for (j = 1; j <= xnames[names[i]]; j++) {
+   434  			if (lines[names[i], j] != lines[names[i], j - 1]) { # 390
+   390  				printf(" %d", lines[names[i], j]) | sortcmd
+				}
+			}
+    47  		printf("\n") | sortcmd
+		}
+     1  	close(sortcmd)
+	}
+
+
+	# Functions, listed alphabetically
+
+     1  function asplit(str, arr, fs, n)
+	{
+     1  	n = split(str, temp_asplit, fs)
+    36  	for (i = 1; i <= n; i++) {
+    36  		arr[temp_asplit[i]]++
+		}
+	}
+
+   434  function inarray(val, arr, j, tmp)
+	{
+ 16297  	for (j in arr) {
+ 16297  		tmp[arr[j]]++
+		}
+   434  	return (val in tmp)
+	}
+
+   571  function lex()
+	{
+  1702  	for (;;) {
+  1702  		if (tok == "(eof)") {
+				return 7
+			}
+   326  		while (length(line) == 0) {
+   326  			if ((getline line) == 0) { # 1
+     1  				tok = "(eof)"
+     1  				return 7
+				}
+			}
+  1701  		sub(/^[ \t]+/, "", line)
+  1701  		sub(/^"([^"]|\\")*"/, "", line)
+  1701  		sub(/^\/([^\/]|\\\/)+\//, "", line)
+  1701  		sub(/^#.*/, "", line)
+  1701  		if (line ~ /^function/) { # 4
+     4  			tok = "function"
+     4  			line = substr(line, 9)
+     4  			return 1
+  1697  		} else if (line ~ /^{/) { # 53
+    53  			tok = "{"
+    53  			line = substr(line, 2)
+    53  			return 2
+  1644  		} else if (line ~ /^}/) { # 53
+    53  			tok = "}"
+    53  			line = substr(line, 2)
+    53  			return 3
+  1591  		} else if (match(line, /^[[:alpha:]_][[:alnum:]]*\[/)) { # 43
+    43  			tok = substr(line, 1, RLENGTH - 1)
+    43  			line = substr(line, RLENGTH + 1)
+    43  			return 5
+  1548  		} else if (match(line, /^[[:alpha:]_][[:alnum:]]*\(/)) { # 87
+    87  			tok = substr(line, 1, RLENGTH - 1)
+    87  			line = substr(line, RLENGTH + 1)
+    87  			if (! (tok in keywords)) { # 12
+    12  				return 6
+				}
+  1461  		} else if (match(line, /^[[:alpha:]_][[:alnum:]]*/)) { # 525
+   525  			tok = substr(line, 1, RLENGTH)
+   525  			line = substr(line, RLENGTH + 1)
+   525  			if (! (tok in keywords)) { # 405
+   405  				return 4
+				}
+   936  		} else {
+   936  			match(line, /^[^[:alpha:]_{}]/)
+   936  			tok = substr(line, 1, RLENGTH)
+   936  			line = substr(line, RLENGTH + 1)
+			}
+		}
+	}
diff --git a/gawk-5.0.1/test/profile3.awk b/gawk-5.0.1/test/profile3.awk
new file mode 100644
index 00000000000..e519374ef40
--- /dev/null
+++ b/gawk-5.0.1/test/profile3.awk
@@ -0,0 +1,9 @@
+BEGIN {
+	the_func = "p"
+	print @the_func("Hello")
+}
+
+function p(str)
+{
+	print "! " str " !"
+}
diff --git a/gawk-5.0.1/test/profile3.ok b/gawk-5.0.1/test/profile3.ok
new file mode 100644
index 00000000000..bbf06541542
--- /dev/null
+++ b/gawk-5.0.1/test/profile3.ok
@@ -0,0 +1,14 @@
+	# BEGIN rule(s)
+
+	BEGIN {
+     1  	the_func = "p"
+     1  	print @the_func("Hello")
+	}
+
+
+	# Functions, listed alphabetically
+
+     1  function p(str)
+	{
+     1  	print "! " str " !"
+	}
diff --git a/gawk-5.0.1/test/profile4.awk b/gawk-5.0.1/test/profile4.awk
new file mode 100644
index 00000000000..11a3dbd45a4
--- /dev/null
+++ b/gawk-5.0.1/test/profile4.awk
@@ -0,0 +1,8 @@
+BEGIN {
+	a = ("foo" (c = "bar"))
+	a = (b - c) "foo"
+	a = "foo" (b - c)
+	q = (d = "x") (e = "y")
+	a = ((c = tolower("FOO")) in JUNK)
+	x = (y == 0 && z == 2 && q == 45)
+}
diff --git a/gawk-5.0.1/test/profile4.ok b/gawk-5.0.1/test/profile4.ok
new file mode 100644
index 00000000000..06b31bc16f3
--- /dev/null
+++ b/gawk-5.0.1/test/profile4.ok
@@ -0,0 +1,9 @@
+BEGIN {
+	a = ("foo" (c = "bar"))
+	a = (b - c) "foo"
+	a = "foo" (b - c)
+	q = (d = "x") (e = "y")
+	a = ((c = tolower("FOO")) in JUNK)
+	x = (y == 0 && z == 2 && q == 45)
+}
+
diff --git a/gawk-5.0.1/test/profile5.awk b/gawk-5.0.1/test/profile5.awk
new file mode 100644
index 00000000000..4e962b4b516
--- /dev/null
+++ b/gawk-5.0.1/test/profile5.awk
@@ -0,0 +1,5179 @@
+
+      
+      
+
+
+
+BEGIN{ _addlib("_BASE") } ##########################################################
+
+func	_BASE(c,t,P, A) {
+      switch ( c ) {
+            case "_lib_CMDLN":
+                        if ( match(t,/^((--([Vv])ersion)|(-([Vv])))[ \t]*/,A) )	{ t=substr(t,RLENGTH+1); _cmdln_version=A[3] A[5] }
+                  else	if ( match(t,/^((-?\?)|(--help))[ \t]*/) )				{ t=substr(t,RLENGTH+1); _cmdln_help=1 }
+                  else	if ( match(t,/^--[ \t]*/) )						return _endpass(substr(t,RLENGTH+1))
+                  return t
+      #___________________________________________________________
+
+            case "_lib_APPLY":
+                  if ( _cmdln_help )			{ match(_fbaccr(_LIBAPI,"_lib_HELP"),/^([^\x00]*)\x00([^\x01]*)\x01(.*)/,A)
+                                                _out(A[2] A[1] A[3]); return _endpass(_basexit_fl=1) }
+                  if ( _cmdln_version )		{ _out(	_ln(_PRODUCT_NAME " v" _PRODUCT_VERSION)										_ln(_PRODUCT_COPYRIGHT)										_ln()										(_cmdln_version=="v" ? "" : _lib_NAMEVER())); return _endpass(_basexit_fl=1) }
+                  return
+      #___________________________________________________________
+
+            case "_lib_HELP":
+                  return "\x00"				_ln(_PRODUCT_NAME " v" _PRODUCT_VERSION)				_ln(_PRODUCT_COPYRIGHT)				_ln()				_ln(" Usage:")				_ln()				_ln("    " _PRODUCT_FILENAME " [/key1 /key2...] [-- cmdline]")				_ln()				_ln(" keys:")				_ln() "\x01"				_ln("    -v -V --version                    - output product version and (if /V) all modules")				_ln("    ? -? --help                        - output this help page")				_ln("    --                                 - command line string edge")
+      #___________________________________________________________
+
+            case	"_lib_NAMEVER":
+                  return 				_ln("_BASE 3.0")
+      #___________________________________________________________
+
+            case "_lib_BEGIN":
+                  return
+      #___________________________________________________________
+
+            case "_lib_END":
+                  return } }
+#_____________________________________________________________________________
+func	_addlib(f) { ###########################################################
+      _addf(_LIBAPI,f) }
+#_______________________________________________________________________
+func	_lib_CMDLN(t) {
+      return _pass(_LIBAPI["F"],"_lib_CMDLN",t) }
+#_________________________________________________________________
+func	_lib_APPLY() {
+      return _ffaccr(_LIBAPI,"_lib_APPLY") }
+#_________________________________________________________________
+func	_lib_HELP() {
+      return _fbaccr(_LIBAPI,"_lib_HELP") }
+#_________________________________________________________________
+func	_lib_NAMEVER() {
+      return _fbaccr(_LIBAPI,"_lib_NAMEVER") }
+#_________________________________________________________________
+func	_lib_BEGIN(A) {
+      return _ffaccr(_LIBAPI,"_lib_BEGIN","",A) }
+#_________________________________________________________________
+func	_lib_END(A) {
+      return _ffaccr(_LIBAPI,"_lib_END","",A) }
+#___________________________________________________________________________________
+BEGIN { ############################################################################
+
+      BINMODE="rw"
+      SUBSEP="\x00"
+      _NULARR[""]; delete _NULARR[""]
+      _INITBASE() }
+#_____________________________________________________________________________
+END { ########################################################################
+
+      _EXIT() }
+      
+
+BEGIN { _addlib("_sYS") } ################################################################
+#_____________________________________________________________________________
+func	_sYS(c,t,P, a,A) { #####################################################
+      switch ( c ) {
+      #___________________________________________________________
+            case "_lib_CMDLN":				return t
+      #_____________________________________________________
+            case "_lib_APPLY":				return
+      #_____________________________________________________
+            case "_lib_HELP":					return
+      #_____________________________________________________
+            case	"_lib_NAMEVER":				return
+      #_____________________________________________________
+            case "_lib_BEGIN":				return
+      #_____________________________________________________
+            case "_lib_END":					return } }
+
+BEGIN { _addlib("_rEG") } ################################################################
+#_____________________________________________________________________________
+func	_rEG(c,t,P, a,A) { #####################################################
+      switch ( c ) {
+      #___________________________________________________________
+            case "_lib_CMDLN":				return t
+      #_____________________________________________________
+            case "_lib_APPLY":				return
+      #_____________________________________________________
+            case "_lib_HELP":					return
+      #_____________________________________________________
+            case	"_lib_NAMEVER":				return 										_ln("_reg 0.001")
+      #_____________________________________________________
+            case "_lib_BEGIN":				return
+      #_____________________________________________________
+            case "_lib_END":					return } }
+      
+      
+      
+
+
+BEGIN { _addlib("_INSTRUC") } ######################################################
+
+func	_INSTRUC(c,t,P) {
+      switch ( c ) {
+            case "_lib_CMDLN":
+                  return t
+      #___________________________________________________________
+
+            case "_lib_APPLY":
+                  return
+      #___________________________________________________________
+
+            case "_lib_HELP":
+                  return
+      #___________________________________________________________
+
+            case	"_lib_NAMEVER":
+                  return				_ln("_INSTRUC 1.0")
+      #___________________________________________________________
+
+            case "_lib_BEGIN":
+                  return
+      #___________________________________________________________
+
+            case "_lib_END":
+                  return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+      _delay_perfmsdelay		=11500 }
+      
+      
+      
+      
+
+
+BEGIN { _addlib("_ARR") } ##########################################################
+
+func	_ARR(c,t,P) {
+      switch ( c ) {
+            case "_lib_CMDLN":
+                  return t
+      #___________________________________________________________
+
+            case "_lib_APPLY":
+                  return
+      #___________________________________________________________
+
+            case "_lib_HELP":
+                  return
+      #___________________________________________________________
+
+            case	"_lib_NAMEVER":
+                  return				_ln("_ARR 1.0")
+      #___________________________________________________________
+
+            case "_lib_BEGIN":
+                  return
+      #___________________________________________________________
+
+            case "_lib_END":
+                  return } }
+#___________________________________________________________________________________
+BEGIN{ } ###########################################################################
+
+      
+      
+      
+
+
+BEGIN { _addlib("_EXTFN") } ########################################################
+
+func	_EXTFN(c,t,P) {
+      switch ( c ) {
+            case "_lib_CMDLN":
+                  return t
+      #___________________________________________________________
+
+            case "_lib_APPLY":
+                  return
+      #___________________________________________________________
+
+            case "_lib_HELP":
+                  return
+      #___________________________________________________________
+
+            case	"_lib_NAMEVER":
+                  return				_ln("_EXTFN 1.0")
+      #___________________________________________________________
+
+            case "_lib_BEGIN":
+                  return
+      #___________________________________________________________
+
+            case "_lib_END":
+                  return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+      delete _XCHR; delete _ASC; delete _CHR; t=""
+      for ( i=0; i<256; i++ )		{ _ASC[a=_CHR[i]=sprintf("%c",i)]=i; _QASC[a]=sprintf("%.3o",i)
+                                    _XCHR[_CHR[i]]=sprintf("%c", (i<128 ? i+128 : i-128)) }
+#_____________________________________________________________________________
+
+      for ( i=0; i<256; i++ ) {
+            _QSTRQ[_CHR[i]]="\\" sprintf("%.3o",i) }
+#_______________________________________________________________________
+
+      for ( i=0; i<32; i++ ) {
+            _QSTR[_CHR[i]]=_QSTRQ[_CHR[i]] }
+      for ( ; i<128; i++ ) {
+            _QSTR[_CHR[i]]=_CHR[i] }
+      for ( ; i<256; i++ ) {
+            _QSTR[_CHR[i]]=_QSTRQ[_CHR[i]] }
+      _QSTR["\\"]="\\\\"	#; _QSTR["\""]="\\\""
+#_____________________________________________________________________________
+
+      _CHR["CR"]			="\015"
+      _CHR["EOL"]			="\015\012"
+      _CHR["EOF"]			="\032"
+      
+      _QSTR[_CHR["EOL"]]	="\\015\\012"
+#_______________________________________________________________________
+
+      _CHR["MONTH"][_CHR["MONTH"]["Jan"]="01"]="Jan"
+      _CHR["MONTH"][_CHR["MONTH"]["Feb"]="02"]="Feb"
+      _CHR["MONTH"][_CHR["MONTH"]["Mar"]="03"]="Mar"
+      _CHR["MONTH"][_CHR["MONTH"]["Apr"]="04"]="Apr"
+      _CHR["MONTH"][_CHR["MONTH"]["May"]="05"]="May"
+      _CHR["MONTH"][_CHR["MONTH"]["Jun"]="06"]="Jun"
+      _CHR["MONTH"][_CHR["MONTH"]["Jul"]="07"]="Jul"
+      _CHR["MONTH"][_CHR["MONTH"]["Aug"]="08"]="Aug"
+      _CHR["MONTH"][_CHR["MONTH"]["Sep"]="09"]="Sep"
+      _CHR["MONTH"][_CHR["MONTH"]["Oct"]="10"]="Oct"
+      _CHR["MONTH"][_CHR["MONTH"]["Nov"]="11"]="Nov"
+      _CHR["MONTH"][_CHR["MONTH"]["Dec"]="12"]="Dec"
+#_____________________________________________________________________________
+
+      _TAB_STEP_DEFAULT		=8
+#_____________________________________________________________________________
+
+      for ( i=0; i<32; i++ )	_REXPSTR[_CHR[i]]=_QSTRQ[_CHR[i]]
+      for ( ; i<256; i++ )	_REXPSTR[_CHR[i]]=_CHR[i]
+      _gensubfn("\\^$.()|{,}[-]?+*",".","_rexpstr_i0") }
+#_____________________________________________________________________________
+func	_rexpstr_i0(t,A,p0) {
+      return _REXPSTR[t]="\\" t }
+      
+      
+      
+      
+
+
+BEGIN { _addlib("_SYSIO") } #########################################################
+
+func	_SYSIO(c,t,P) {
+      switch ( c ) {
+            case "_lib_CMDLN":
+                  return t
+      #___________________________________________________________
+
+            case "_lib_APPLY":
+                  return
+      #___________________________________________________________
+
+            case "_lib_HELP":
+                  return
+      #___________________________________________________________
+
+            case	"_lib_NAMEVER":
+                  return				_ln("_SYSIO 1.0")
+      #___________________________________________________________
+
+            case "_lib_BEGIN":
+                  return
+      #___________________________________________________________
+
+            case "_lib_END":
+                  return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+      _SYS_STDCON		="CON"
+      _CON_WIDTH=match(_cmd("MODE "_SYS_STDCON" 2>NUL"),/Columns:[ \t]*([0-9]+)/,A) ? strtonum(A[1]) : 80 }
+
+      
+      
+      
+
+
+BEGIN { _addlib("_FILEIO") } #######################################################
+
+func	_FILEIO(c,t,P, A) {
+      switch ( c ) {
+            case "_lib_CMDLN":
+                  if ( match(t,/^[ \t]*-[Tt]([\+-])[ \t]*/,A) )	{ t=substr(t,RLENGTH+1)
+                                                            if ( A[1]=="+" )	_fileio_notdeltmpflag=1
+                                                                        else	_fileio_notdeltmpflag="" }
+                  return t
+      #___________________________________________________________
+
+            case "_lib_APPLY":
+                  if ( _fileio_notdeltmpflag ) {
+                        _info("Temporary objects deletion DISABLED (inherited)")
+                        }
+                  return
+      #___________________________________________________________
+
+            case "_lib_HELP":
+                  return	_ln("    -[Tt][+-]                          - inherited: +enable\\-disable temporary files\\dirs deletion")				_ln()
+      #___________________________________________________________
+
+            case	"_lib_NAMEVER":
+                  return				_ln("_FILEIO 2.1")
+      #___________________________________________________________
+
+            case "_lib_BEGIN":
+                  P["ENVIRON"]["CD"]						=ENVIRON["CD"]
+                  P["_FILEIO_RD"]							=_FILEIO_RD
+                  P["_FILEIO_R"]							=_FILEIO_R
+                  P["_FILEIO_D"]							=_FILEIO_D
+                  if ( !("_FILEIO_TMPRD" in P) ) {
+                        P["_FILEIO_TMPRD"]					=_getmpdir(_filen(P["SOURCE"]) "." ++_egawk_subcntr _CHR["SUBDIR"]) }
+                  return
+      #___________________________________________________________
+
+            case "_lib_END":
+                  return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+      if ( _SYS_STDOUT=="" )		_SYS_STDOUT="/dev/stdout"
+      if ( _SYS_STDERR=="" )		_SYS_STDERR="/dev/stderr"
+      _CHR["SUBDIR"]="\\"
+      if ( _gawk_scriptlevel<1 ) {
+            match(b=_cmd("echo %CD% 2>NUL"),/[^\x00-\x1F]*/)
+            ENVIRON["CD"]=_FILEIO_RD=_filerd(substr(b,RSTART,RLENGTH) _CHR["SUBDIR"]); _FILEIO_R=_filer(_FILEIO_RD); _FILEIO_D=_filed(_FILEIO_RD)
+            _setmpath(_filerd(_FILEIO_RD "_tmp" _CHR["SUBDIR"])) } }
+
+      
+      
+      
+
+
+BEGIN { _addlib("_tOBJ") } #########################################################
+
+func	_tOBJ(c,t,P) {
+      switch ( c ) {
+      #___________________________________________________________
+            case "_lib_CMDLN":
+                  return t
+      #___________________________________________________________
+            case "_lib_APPLY":
+                  return
+      #___________________________________________________________
+            case "_lib_HELP":
+                  return
+      #___________________________________________________________
+            case	"_lib_NAMEVER":
+                  return				_ln("_tOBJ 3.0")
+      #___________________________________________________________
+            case "_lib_BEGIN":
+                  return
+      #___________________________________________________________
+            case "_lib_END":
+                  return
+      #___________________________________________________________
+            case "_lib_CLEANUP":
+                  return	_tOBJ_CLEANUP() } }
+#_______________________________________________________________________
+func	_tOBJ_CLEANUP( p) { ##############################################
+      for ( p in UIDSDEL ) {
+            delete _ptr[p]
+            delete _tPREV[p];	delete _tPARENT[p];		delete _tNEXT[p]
+            delete _tFCHLD[p];	delete _tQCHLD[p];		delete _tLCHLD[p]
+            delete _TMP0[p];	delete _TMP1[p]
+            delete _tLINK[p];	delete _tCLASS[p] } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+      _tInBy	="\x8A._tInBy"
+      _tgenuid_init()
+      _UIDS[""]; delete _UIDS[""]; _UIDSDEL[""]; delete _UIDSDEL[""]
+      _tPREV[""]; _tPARENT[""]; _tNEXT[""]; _tFCHLD[""]; _tQCHLD[""]; _tLCHLD[""]
+      _tLINK[""]; _tCLASS[""]
+      _tSTR[""]; _tDLINK[""]
+      _[""]; delete _[""]; _ptr[""]; delete _ptr[""]
+      _TMP0[""]; delete _TMP0[""]; _TMP1[""]; delete _TMP1[""] }
+
+      
+      
+
+
+BEGIN{ _addlib("_ERRLOG") } ########################################################
+
+func	_ERRLOG(c,t,P, a,b,A) {
+      switch ( c ) {
+            case "_lib_CMDLN":
+                  if ( match(t,/^[ \t]*-L:([TtVvIiWwEeFf]*)[ \t]*/,A) )		{ t=substr(t,RLENGTH+1); _errlog_errflkey=_errlog_errflkey A[1] }
+                  return t
+      #_______________________________________________________________________
+
+            case "_lib_APPLY":
+                  if ( _errlog_errflkey ) {
+                        split(_errlog_errflkey,A,"")
+                        for ( a=1; a in A; a++ ) {
+                              if ( A[a]==toupper(A[a]) ) b=1; else b=""
+                              switch ( toupper(A[a]) ) {
+                                    case "T":
+                                          _ERRLOG_TF=b; break
+                                    case "V":
+                                          _ERRLOG_VF=b; break
+                                    case "I":
+                                          _ERRLOG_IF=b; break
+                                    case "W":
+                                          _ERRLOG_WF=b; break
+                                    case "E":
+                                          _ERRLOG_EF=b; break
+                                    case "F":
+                                          _ERRLOG_FF=b; break } }
+                        if ( _ERRLOG_IF ) {
+                              _info("Log-message types inherited acc/deny: "						"TRACE "	(_ERRLOG_TF ? "ON" : "OFF") "/"						"VERBOSE "	(_ERRLOG_VF ? "ON" : "OFF") "/"						"INFO "	(_ERRLOG_IF ? "ON" : "OFF") "/"						"WARNING "	(_ERRLOG_WF ? "ON" : "OFF") "/"						"ERROR "	(_ERRLOG_EF ? "ON" : "OFF") "/"						"FATAL "	(_ERRLOG_FF ? "ON" : "OFF") ) } }
+                  return
+      #_______________________________________________________________________
+
+            case "_lib_HELP":
+                  return	_ln("    -L:TtVvIiWwEeFf                    - enable(upcase: TVIWEF) or disable(lowcase: tviwef) allowable type of")				_ln("                                         log messages. Trace/Verbose/Informational/Warning/Error/Fatal.")				_ln()
+      #_______________________________________________________________________
+
+            case	"_lib_NAMEVER":
+                  return				_ln("_ERRLOG 1.0")
+      #_______________________________________________________________________
+
+            case "_lib_BEGIN":
+                  P["_ERRLOG_TF"]				=_ERRLOG_TF
+                  P["_ERRLOG_VF"]				=_ERRLOG_VF
+                  P["_ERRLOG_IF"]				=_ERRLOG_IF
+                  P["_ERRLOG_WF"]				=_ERRLOG_WF
+                  P["_ERRLOG_EF"]				=_ERRLOG_EF
+                  P["_ERRLOG_FF"]				=_ERRLOG_FF
+                  P["_errlog_file"]				="/dev/stderr"
+                  return } }
+#___________________________________________________________________________________
+BEGIN{ #############################################################################
+
+      if ( _gawk_scriptlevel<1 ) {
+            _ERRLOG_TF				=1
+            _ERRLOG_VF				=1
+            _ERRLOG_IF				=1
+            _ERRLOG_WF				=1
+            _ERRLOG_EF				=1
+            _ERRLOG_FF				=1
+            _wrfile(_errlog_file=_getmpfile("OUTPUT.LOG"),"") } }
+
+      
+      
+      
+
+
+BEGIN { _addlib("_SHORTCUT") } #####################################################
+
+func	_SHORTCUT(c,t,P) {
+      switch ( c ) {
+            case "_lib_CMDLN":
+                  return t
+      #___________________________________________________________
+
+            case "_lib_APPLY":
+                  return
+      #___________________________________________________________
+
+            case "_lib_HELP":
+                  return
+      #___________________________________________________________
+
+            case	"_lib_NAMEVER":
+                  return				_ln("_shortcut 1.0")
+      #___________________________________________________________
+
+            case "_lib_BEGIN":
+                  return
+      #___________________________________________________________
+
+            case "_lib_END":
+                  return } }
+#___________________________________________________________________________________
+BEGIN { _shortcut_init() } #########################################################
+
+
+
+BEGIN { _addlib("_eXTFN") } ########################################################
+
+func	_eXTFN(c,t,P) {
+      switch ( c ) {
+            case "_lib_CMDLN":
+                  return t
+      #___________________________________________________________
+
+            case "_lib_APPLY":
+                  return
+      #___________________________________________________________
+
+            case "_lib_HELP":
+                  return
+      #___________________________________________________________
+
+            case	"_lib_NAMEVER":
+                  return				_ln("_extfn 1.0")
+      #___________________________________________________________
+
+            case "_lib_BEGIN":
+                  return
+      #___________________________________________________________
+
+            case "_lib_END":
+                  return } }
+#___________________________________________________________________________________
+BEGIN { _extfn_init() } ############################################################
+
+
+BEGIN { _addlib("_sHARE") } ##############################################################
+#_____________________________________________________________________________
+func	_sHARE(c,t,P, a,A) { ###################################################
+      switch ( c ) {
+      #___________________________________________________________
+            case "_lib_CMDLN":				return t
+      #_____________________________________________________
+            case "_lib_APPLY":				return
+      #_____________________________________________________
+            case "_lib_HELP":					return
+      #_____________________________________________________
+            case	"_lib_NAMEVER":				return	_ln("_share 1.000")
+      #_____________________________________________________
+            case "_lib_BEGIN":				return
+      #_____________________________________________________
+            case "_lib_END":					return } }
+
+BEGIN { _addlib("_FILEVER") } ############################################################
+#_____________________________________________________________________________
+func	_FILEVER(c,t,P, a,A) { #################################################
+      switch ( c ) {
+      #___________________________________________________________
+            case "_lib_CMDLN":				return t
+      #_____________________________________________________
+            case "_lib_APPLY":				return
+      #_____________________________________________________
+            case "_lib_HELP":					return
+      #_____________________________________________________
+            case	"_lib_NAMEVER":				return
+      #_____________________________________________________
+            case "_lib_BEGIN":				return
+      #_____________________________________________________
+            case "_lib_END":					return } }
+
+
+BEGIN { _addlib("_DS") ###############################################################################
+
+      _PRODUCT_NAME		="Deployment Solution Control"
+      _PRODUCT_VERSION		="1.0"
+      _PRODUCT_COPYRIGHT	="Copyright (C) 2013 by CosumoGEN"
+      _PRODUCT_FILENAME		="_main.ewk"
+}#____________________________________________________________________________
+func	_DS(c,t,P, a,A) { ######################################################
+      switch ( c ) {
+      #___________________________________________________________
+            case "_lib_CMDLN":				return t
+      #_____________________________________________________
+            case "_lib_APPLY":				return
+      #_____________________________________________________
+            case "_lib_HELP":			return	_ln()									_ln(	" Usage: " _PRODUCT_NAME " [/key1 /key2...] sourcefile [cmdline]")									_ln()
+      #_____________________________________________________
+            case	"_lib_NAMEVER":				return
+      #_____________________________________________________
+            case "_lib_BEGIN":				return
+      #_____________________________________________________
+            case "_lib_END":					return } }
+
+func	_INIT(f) { } #############################################################################
+
+
+
+func	_pmap(m,s1,s2,s3,s4,s5,s6,s7,s8) {
+      if ( match(m,/^([^\(]+)\(([^\)]*)\)$/,_QMAP) )	{ _qparamf1=_QMAP[1]; _QMAP[0]="r" (_qparamc1=split(_QMAP[2],_QMAP,""))
+                                                      _qparamf0="_p" _QMAP[_qparamc1--]
+                                                      return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8) } }
+      
+func	_p1(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+      _qparamf0="_p" _QMAP[_qparamc1--]
+      return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s1,p1,p2,p3,p4,p5,p6,p7) }
+
+func	_p2(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+      _qparamf0="_p" _QMAP[_qparamc1--]
+      return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s2,p1,p2,p3,p4,p5,p6,p7) }
+
+func	_p3(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+      _qparamf0="_p" _QMAP[_qparamc1--]
+      return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s3,p1,p2,p3,p4,p5,p6,p7) }
+
+func	_p4(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+      _qparamf0="_p" _QMAP[_qparamc1--]
+      return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s4,p1,p2,p3,p4,p5,p6,p7) }
+
+func	_p5(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+      _qparamf0="_p" _QMAP[_qparamc1--]
+      return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s5,p1,p2,p3,p4,p5,p6,p7) }
+
+func	_p6(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+      _qparamf0="_p" _QMAP[_qparamc1--]
+      return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s6,p1,p2,p3,p4,p5,p6,p7) }
+
+func	_p7(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+      _qparamf0="_p" _QMAP[_qparamc1--]
+      return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s7,p1,p2,p3,p4,p5,p6,p7) }
+
+func	_p8(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+      _qparamf0="_p" _QMAP[_qparamc1--]
+      return @_qparamf0(s1,s2,s3,s4,s5,s6,s7,s8,s8,p1,p2,p3,p4,p5,p6,p7) }
+
+func	_pr8(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+      return @_qparamf1(p1,p2,p3,p4,p5,p6,p7,p8) }
+
+func	_pr7(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+      return @_qparamf1(p1,p2,p3,p4,p5,p6,p7) }
+
+func	_pr6(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+      return @_qparamf1(p1,p2,p3,p4,p5,p6) }
+
+func	_pr5(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+      return @_qparamf1(p1,p2,p3,p4,p5) }
+
+func	_pr4(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+      return @_qparamf1(p1,p2,p3,p4) }
+
+func	_pr3(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+      return @_qparamf1(p1,p2,p3) }
+
+func	_pr2(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+      return @_qparamf1(p1,p2) }
+
+func	_pr1(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+      return @_qparamf1(p1) }
+
+func	_pr0(s1,s2,s3,s4,s5,s6,s7,s8,p1,p2,p3,p4,p5,p6,p7,p8) {
+
+      return @_qparamf1() }
+
+
+
+
+
+
+
+
+
+
+
+func	hujf(a,b,c)	{ _conl("hujf(" a "," b "," c ")") }
+
+
+                                                                        
+
+func	_qparam(qm,p0,p1,p2,p3,p4,p5,p6,p7) {
+
+            if ( qm==qm+0 && qm>0 )		_qparamim=substr("        ",1,qm)
+            else	if ( qm!="" )		_qparamim=qm
+                                    else	_qparamim="        "
+            _qparamask=""; return _qparam_i0(p0,p1,p2,p3,p4,p5,p6,p7) }
+
+func	_qparam_i0(p0,p1,p2,p3,p4,p5,p6,p7)	{ _qparama0=substr(_qparamim,1,1); _qparamim=substr(_qparamim,2)
+                                          switch ( _qparama0 )	{ case "":		gsub(/ +$/,"",_qparamask); return length(_qparamask)
+                                                                  default:		if ( isarray(p0) )			_qparama0="A"
+                                                                                    else	if ( p0=="" && p0==0 )		_qparama0=" "
+                                                                                    else	if ( _isptr(p0) )			_qparama0="P"
+                                                                                                                  else	_qparama0="S"
+                                                                  case	".":		_qparamask=_qparamask _qparama0
+                                                                                    return _qparam_i0(p1,p2,p3,p4,p5,p6,p7) } }
+func	tts(p,uidel,psfx,cnt,chr,p5,p6,p7, im) {
+      im="     "
+      im=".. .."
+      _conl("ret:   " _qparam(im,p,uidel,psfx,cnt,chr,p5,p6,p7) "'")
+      _conl("mask: `" _qparamask "'") }
+
+func	_uidcyc(p, i) {
+      _dumpuidgen(p)
+      for ( i=1; i<(64*8*6-1); i++ )	_conl(i ":" _var(_getuid(p)))
+      _dumpuidgen(p) }
+
+
+
+func	_dumpuidgen(p, pd,pc,ps) {
+      _conline("#" (++cntdm) ": " p "'"); _conl()
+      if ( p in _tuidel )	{ _conl("DEL:   " _var(pd=_tuidel[p]))
+                              _conl(_dumparr(_tUIDEL[pd]) _ln()) }
+      _conl("PFX: " _tUIDPFX[p] "'"); _conl("SFX: " _tUIDSFX[p] "'")
+      
+      _conl("COUNT: " (p in _tuidcnt ? (pc=_tuidcnt[p]) "'" : _th0("-",pc=-2)))
+      _con("CHARS: "); if ( p in _tuidchr )	{ _conl((ps=_tuidchr[p]) "'")
+                                                _conl("HCHR: " (pc==-2 ? "-" : _tUIDCNTH[pc] "'")); _conl(_dumparr(_tUIDCHRH[ps]) _ln())
+                                                _conl("LCHR: " (pc==-2 ? "-" : _tUIDCNTL[pc] "'")); _conl(_dumparr(_tUIDCHRL[ps]) _ln()) }
+                                          else	_conl("-") }
+
+
+
+# prefix	-
+# prichr	- aware character `{', `^',`]'
+# sechr	- aware character `.' as the first char of sechr, and character `}'
+# suffix	- aware character `]'
+# cntptr	- aware character `]'
+
+func	_tr(n,cs, H) {
+      #_tuidinitcs[p]=cs
+      #2 uidel, 5 pfx, 7 hichr,11(10) lochr,14 suffix
+      _rconline(n ": " cs); _rconl()
+      if ( match(cs,/^((([^\xB4:\[\|\]]*\xB4.)*[^\xB4:\[\|\]]*):)?((([^\xB4\[\|\]]*\xB4.)*[^\xB4\[\|\]]*)\[)?(([^\xB4\|\]]*\xB4.)*[^\xB4\|\]]*)?(\|(\.)?(([^\xB4\]]*\xB4.)*[^\xB4\]]*))?(\](.*))?$/,H) ) {
+            _rconl("delptr: " _une(H[2]) "'")
+            _rconl("pfxstr: " _une(H[5]) "'")
+            _rconl("hichr:  " _une(H[7]) "'")
+            _rconl("lochr:  " _une(H[10] ? H[7] "' and " H[11] "'" : H[11] "'"))
+            _rconl("sfxstr: " _une(H[14]) "'") }
+      else	_rconl("NOT MATCH!")
+      _rconl() }
+
+func	_une(t) {	return gensub(/\xB4(.)/,"\\1","G",t) }
+func	_rconl(t) {		_rprt=_rprt _ln(t) }
+func	_rconline(t)	{ _rprt=_rprt _ln((t=" " t " ") _getchrln("_",_CON_WIDTH-length(t)-1)) }
+
+
+
+
+
+
+
+
+
+
+
+
+func	_splitpath_test() {
+      _conl(); _conl("########################################################################################"); _conl()
+      _fpp("  ")
+      _fpp(" fi le . ex t ")
+      _fpp(" di r0 / / ")
+      _fpp(" di r0 / / fi le . ex t ")
+      _fpp(" / ")
+      _fpp(" / fi le . ex t ")
+      _fpp(" / di r0 / /  ")
+      _fpp(" / di r0 / / fi le . ex t ")
+      _conl(); _conl("########################################################################################"); _conl()
+      _fpp(" c : ")
+      _fpp(" c : fi le . ex t ")
+      _fpp(" c : di r0 / / ")
+      _fpp(" c : di r0 / / fi le . ex t ")
+      _fpp(" c : / / ")
+      _fpp(" c : / / fi le . ex t ")
+      _fpp(" c : / / di r0 / /  ")
+      _fpp(" c : / / di r0 / / fi le . ex t ")
+      _conl(); _conl("########################################################################################"); _conl()
+      _fpp(" / /  ")
+      _fpp(" / / ho st . hs t ")
+      _fpp(" / / ho st / /  ")
+      _fpp(" / / ho st / / fi le . ex t ")
+      _fpp(" / / ho st / / di r0 / / ")
+      _fpp(" / / ho st / / di r0 / / fi le . ex t ")
+      _conl(); _conl("########################################################################################"); _conl()
+      _fpp(" / / ho st / / c : ")
+      _fpp(" / / ho st / / c : fi le . ex t ")
+      _fpp(" / / ho st / / c : di r0 / / ")
+      _fpp(" / / ho st / / c : di r0 / / fi le . ex t ")
+      _fpp(" / / ho st / / c : / / ")
+      _fpp(" / / ho st / / c : / / fi le . ex t ")
+      _fpp(" / / ho st / / c : / / di r0 / / ")
+      _fpp(" / / ho st / / c : / / di r0 / / fi le . ex t ")
+      _conl(); _conl("########################################################################################"); _conl()
+      _fpp(" http : / / / ")
+      _fpp(" http : / / / si te . ex t ")
+      _fpp(" http : / / / si te / /  ")
+      _fpp(" http : / / / si te / / fi le . ex t ")
+      _fpp(" http : / / / si te / / di r0 / / ")
+      _fpp(" http : / / / si te / / di r0 / / fi le . ex t ")
+      _conl(); _conl("########################################################################################"); _conl()
+      _fpp(" ftp : / / / : po rt ")
+      _fpp(" ftp : / / / si te . ex t : po rt ")
+      _fpp(" ftp : / / / si te : po rt / /  ")
+      _fpp(" ftp : / / / si te : po rt / / fi le . ex t ")
+      _fpp(" ftp : / / / si te : po rt / / di r0 / / ")
+      _fpp(" ftp : / / / si te : po rt / / di r0 / / fi le . ex t ")
+      _conl(); _conl("##  //.  ######################################################################################"); _conl()
+      _fpp(" / / . ")
+      _fpp(" / / . / / ")
+      _fpp(" / / . / / com 56 ")
+      _fpp(" / / . / / com 56 / / ")
+      _fpp(" / / . / / c : ")
+      _fpp(" / / . / / c : / / ")
+      _fpp(" / / . / / c :  com 56 ")
+      _fpp(" / / . / / c :  com 56 / / ")
+      _fpp(" / / . / / c : / / com 56 ")
+      _fpp(" / / . / / c : / / com 56 / / ")
+      _conl(); _conl("##  //?  ######################################################################################"); _conl()
+      _fpp(" / / ? ")
+      _fpp(" / / ? / / ")
+      _fpp(" / / ? / / com 56 ")
+      _fpp(" / / ? / / com 56 / / ")
+      _fpp(" / / ? / / c : ")
+      _fpp(" / / ? / / c : / / ")
+      _fpp(" / / ? / / c :  com 56 ")
+      _fpp(" / / ? / / c :  com 56 / / ")
+      _fpp(" / / ? / / c : / / com 56 ")
+      _fpp(" / / ? / / c : / / com 56 / / ")
+      _conl(); _conl("########################################################################################"); _conl()
+      _fpp(" / /  /  ")
+      _fpp(" / /  / . hs t ")
+      _fpp(" / /  / / fi le . ex t ")
+      _fpp(" / /  / / di r0 / / ")
+      _fpp(" / /  / / di r0 / / di r1 / fi le . ex t ")
+      _fpp(" / /  / / c : ")
+      _fpp(" / /  / / c : fi le . ex t ")
+      _fpp(" / /  / / c : di r0 / / ")
+      _fpp(" / /  / / c : di r0 / / fi le . ex t ")
+      _fpp(" / /  / / c : / / ")
+      _fpp(" / /  / / c : / / fi le . ex t ")
+      _fpp(" / /  / / c : / / di r0 / / ")
+      _fpp(" / /  / / c : / / di r0 / / fi le . ex t ")
+      _conl(); _conl("########################################################################################"); _conl()
+
+
+      return }
+# this is somnitelno: that   / / . / / com 56 / / - is the DEV...; what is DEV ??? this already PROBLEM
+#_____________________________________________________________________________
+func	_patharr0(D,q, i,h,A,B) { ##############################################
+      delete D; if ( 0<q=split(gensub(/\\/,"/","G",gensub(/ *([:$\\\/]) */,"\\1","G",gensub(/(^[ \t]+)|([ \t]+$)/,"","G",q))),A,/\/+/,B) ) {
+            if ( 2>h=length(B[1]) )		{ D["type"]="FILE"; A[1]=_patharr0_i0(A[1],D,"drive"); return _patharr0_i1(D,A,1,q) }
+            i=gensub(/ *([\.\?]) */,"\\1","G",A[2]); IGNORECASE=1; match(A[1],/^((https?)|(ftp)):$/); IGNORECASE=0
+                  if ( RLENGTH>0 )		{ D["type"]=toupper(substr(A[1],1,RLENGTH-1)); _patharr0_i0(i,D,"site","port") }
+            else	if ( A[1]=="" )		{ D["type"]="UNC"; if ( h>2 )		{ D["host"]; A[2]=_patharr0_i0(A[2],D,"drive","","FILE"); return _patharr0_i1(D,A,2,q) }
+                                          if ( i=="" )				return 1
+                                          D["host"]=i; A[3]=_patharr0_i0(A[3],D,"drive","","FILE") }
+                                    else	{ D["type"]="FILE"; A[1]=_patharr0_i0(A[1],D,"drive"); return _patharr0_i1(D,A,1,q) } return _patharr0_i1(D,A,3,q) } }
+      #_____________________________________________________
+      func	_patharr0_i0(t,D,l,r,d, i) { if ( i=index(t,":") )	{ if ( d )				D["type"]=d
+                                                                  if ( i>1 )				D[l]=substr(t,1,i-1)
+                                                                  if ( (t=substr(t,i+1)) && r )	D[r]=t; return t }
+                                                            else	if ( t && r )			D[l]=t; return t }
+      #_____________________________________________________
+      func	_patharr0_i1(D,A,i,q, t,c)	{ if ( D["type"]=="UNC" )	{ if ( t=A[i++] )		D[0]=(D["share"]=D[++c]=t) "/"; else return 1 }
+                                          while ( i<q )	D[0]=D[0] (D[++c]=A[i++]) "/"
+                                          if ( i==q )		{ if ( match(t=A[i],/\.[^\.]*$/) )	{ if ( RSTART>1 )		D["name"]=substr(t,1,RSTART-1); D["ext"]=substr(t,RSTART,RLENGTH) }
+                                                                                          else	if ( t!="" )		D["name"]=t } return 1 }
+
+
+func	_fpp(q, D,S) {
+      _conl(); _conline(q); _conl();
+      q=_patharr0(S,q)
+      #_arregpath(D,S)
+      #_conl(_dumparr(D))
+      _conl( _dumparr(S)); _conl()
+      
+      return q }
+
+
+func	_rpp(q, D,S) {
+      _conl(); _conline(q); _conl();
+
+      _regpath0(D,q)
+      #_conl(_dumparr(D))
+
+      _conl(_ln("DEST:") _dumparr(D)); _conl()
+      return q }
+      
+func	_split_regpath() {
+      _rpp(" / /  / /   ")
+      _rpp(" / /  / / huj  ")
+      _rpp(" / /  / / huj /  ")
+      _rpp(" / /  / / huj / pizda.TSR  ")
+      _rpp(" / /  / / hklm  ")
+      _rpp(" / /  / / hklm /  ")
+      _rpp(" / /  / / hklm / huj ")
+      _rpp(" / /  / / hklm / huj / ")
+      _rpp(" / /  / / hklm / huj / 	pizda.TSR  ")
+      _conl(); _conl("########################################################################################"); _conl()
+      _rpp(" / /  / / hklm / software / altiris /  fi le . ex t ")
+      _rpp(" / / . / / hkcr / software / altiris /  fi le . ex t ")
+      _rpp(" / / ? / / hKcU / software / altiris /  fi le . ex t ")
+      _rpp(" / / lOcAlHoSt / / hKu / software / altiris /  fi le . ex t ")
+      _rpp(" / / ho st / / hKcc / software / altiris /  fi le . ex t ")
+      _rpp(" / / ho st / / hKPd / software / altiris /  fi le . ex t ")
+      _conl(); _conl("########################################################################################"); _conl()
+      
+      
+      
+      }
+# test with the different path types
+#	_conl(_ln("SRC:") _dumparr(S)); _conl();
+
+func	_ini(p,cs, dptr,pfx,sfx,hstr,lstr) {
+      return _inituid(p,cs, dptr,pfx,sfx,hstr,lstr,A) }
+      
+#_______________________________________________________________________
+func	_inituid(p,cs, dptr,pfx,sfx,hstr,lstr,A) { ################### 1 #
+      if ( cs==0 && cs=="" )										{ cs=p; p=_getuid() }
+
+      _conl(); _conl(); _conl(cs)
+
+      if ( match(cs,/^(([^:]*):)?(([^'\xB4]*\xB4.)*[^'\xB4]*)[']/,A) )			{ pfx=A[3]; dptr=A[2] }
+      if ( match(cs=substr(cs,1+RLENGTH),/'(([^'\xB4]*\xB4.)*[^'\xB4]*)$/,A) )	{ sfx=A[1]; cs=substr(cs,1,RSTART-1) }
+      if ( match(cs,/^(([`\^])(.*))/,A) )								{ if ( A[2]=="`" )	{ hstr=A[3] "~"; lstr="" } else { lstr=A[3] "+"; hstr="" } }
+      else	if ( match(cs,/^(([^'\xB4\|]*\xB4.)*[^'\xB4\|]*)(\|(.*))?/,A) )		{ hstr=A[1]; lstr=A[4] }
+      else	{ ERRNO="_inituid(): bad parameters"; return }
+
+      _conl(dptr ":" pfx "'" hstr "|" lstr "'" sfx)
+
+      return _cfguid(p,dptr,pfx,sfx,hstr,lstr) }
+
+#			dptr			- morg ptr; in case if object deleted then _CLASSPTR[ptr] will be deleted(object is death), but
+#							_tUIDEL[_CLASSPTR[ptr]] will be created that object can be resurrected from morg
+#							dptr can be any string containing any characters except `:'. It's not verified
+#			pfx,sfx		- uid prefix str, and uid suffix str; this strings specifies string that can be inserted before/after
+#							uid generated by uid generator:
+#
+#								class uid:			pfx uidgen sfx
+#
+#							Both can be any string(including ""), and can contains any character with B4-escaping feature.
+#							Note: that this strings cannot contains "'" character: it's should be escaped by B4-escaper.
+#			hstr,lstr		- this values configure uid-generator itself. ther is a 3 combinations regarding its:
+#
+#								hstr			lstr			function
+#
+#								`ptr			*			- specify pointer to external uid-generator
+#														All uids and chars will be generated by external uid-generator
+#								*			^ptr			- class will have it's own uid generator using external character set
+#								str			str			- class will have it's own uid generator with it's own character set
+#														character set inmplemented in hstr(high-charset) and in lstr(low-charset) in 2 ways:
+#							1)	"AB"			"AB01"			- this mean that high-charset contain chars: `A' and `B'
+#																low-charset contains chars: `A', `B', `0', `1'
+#
+#							2)	"Az,By"		"Ax,Bw,0v,1u"		- this mean that high-charset contain chars: `Az' and `By'
+#																low-charset contains chars:  `Ax', `Bw', `0v', `1u'
+#															Note: both: hstr and lstr cannot contain char `,' directly, but it's can uses
+#																	B4-escaper to escape any char including `,'
+
+
+
+# !!!! in case of using `,' in hstr/lstr - the escaped `,' will leads to interpretate hstr and lstr as divided by `,'
+# if parameters error then i should be more specific about what error in parameters detected
+# document _inituid(): parameters; document cs: uid initialization string format
+# test with escape char
+# adv hstr and lstr splitting?
+# chk if hstr len==0 ?
+# return _tclass & report error?
+# _tapi thru function
+
+# additional syntax checking ???
+# implement syntax and uid srv in docs
+# add _dumpuid() ????
+# make performance measurement
+# protection against badchar list
+# additional feature to specify _getuid() to not resurrect uid; and informative that uid was ressurected or not
+# build _defclass fn
+
+# _tuidinitcs ????
+# _tuidchrh[p]
+# _tuidchrl[p]
+# _tuidchr[p]
+# _tuidcnt[p]
+# _tUIDPFX[p]
+# _tUIDSFX[p]
+# _tUIDEL
+# _tUIDCNTH
+# _tUIDCNTL
+# _tUIDCHRL
+# _tUIDCHRH
+
+# create default class basic `new' and `del' functions
+
+
+
+func	_tstini() {
+                  _ini("uidel:pfx'hstr|lstr'sfx")
+                  _ini("uidel:pfx'hstr|lstr'")
+                  _ini("uidel:'hstr|lstr'sfx")
+                  _ini("uidel:'hstr|lstr'")
+                  _ini("uidel:pfx'hstr'sfx")
+                  _ini("uidel:pfx'hstr'")
+                  _ini("uidel:'hstr'sfx")
+                  _ini("uidel:'hstr'")
+      _conl(); _conl("########################################################################################"); _conl()
+                  _ini("pfx'hstr|lstr'sfx")
+                  _ini("pfx'hstr|lstr'")
+                  _ini("'hstr|lstr'sfx")
+                  _ini("'hstr|lstr'")
+                  _ini("pfx'hstr'sfx")
+                  _ini("pfx'hstr'")
+                  _ini("'hstr'sfx")
+                  _ini("'hstr'")
+      _conl(); _conl("########################################################################################"); _conl()
+                  _ini("uidel:pfx'`cntptr'sfx")
+                  _ini("uidel:pfx'`cntptr'")
+                  _ini("uidel:'`cntptr'sfx")
+                  _ini("uidel:'`cntptr'")
+      _conl(); _conl("########################################################################################"); _conl()
+                  _ini("pfx'`cntptr'sfx")
+                  _ini("pfx'`cntptr'")
+                  _ini("'`cntptr'sfx")
+                  _ini("'`cntptr'")
+      _conl(); _conl("########################################################################################"); _conl()
+                  _ini("uidel:pfx'^chrptr'sfx")
+                  _ini("uidel:pfx'^chrptr'")
+                  _ini("uidel:'^chrptr'sfx")
+                  _ini("uidel:'^chrptr'")
+      _conl(); _conl("########################################################################################"); _conl()
+                  _ini("pfx'^chrptr'sfx")
+                  _ini("pfx'^chrptr'")
+                  _ini("'^chrptr'sfx")
+                  _ini("'^chrptr'")
+      _conl(); _conl("########################################################################################"); _conl()
+
+
+                  }
+                  
+func	_rtn(v,A) {
+      _conl(); _conline(_val(v) " : " _val(A)); _conl()
+      
+      _rtn2(v,A)
+      
+      _conl() }
+
+func	_rtn2(v,A, r,t) {
+
+      r=isarray(A) ? _typa(v,A) : _typ(v)
+      
+      if ( "`">_t0 && _t0 )	_conl("ggggg")
+      
+      t=(r ? "TRUE" : "FALSE") " / " (r>0 ? r ">0" : r "!>0") " / " (r+0>0 ? r "+0>0" : r "+0!>0") " / " (r+0!=r ? r "+0!=" r : r "+0==" r)		" / " (r && "`">r ? "'`'>" r " && " r : "!('`'>" r " && " r")")
+
+            _conl("`" r "' : " t)
+      
+      return r }
+
+
+
+
+func	_typ(p) {
+      return _t0=isarray(p) ? "#" : p==0 ? p=="" ? 0 : p in _CLASSPTR ? "`" : p ? 3 : 4 : p in _CLASSPTR ? "`" : p+0==p ? 5 : p ? 3 : 2 }
+
+func	_typa(p,A) {
+
+      return _t0=isarray(p) ? "#" : p==0 ? p=="" ? 0 : p in A ? "`" : p ? 3 : 4 : p in A ? "`" : p+0==p ? 5 : p ? 3 : 2 }
+
+#			#		- p is array
+#			`		- p is ptr detected in array _CLASSPTR(for _typ); or p is ptr detected in array A(for _typa)
+#			0		- p is undefined
+
+#			2		- p is string==""
+#			3		- p is string!=""
+#			4		- p is number 0
+#			5		- p is any number except 0(positive and negative)
+
+# str:			_typ(p)+0		!_typ(p)+0
+# str/ptr			_typ(p)>0		_typ(p)<1
+# str/arr			"`">_typ(p0) && _t0
+# str/ptr/arr		_typ(p)		!_typ(p)
+# ptr				_typ(p)=="`"	_typ(p)<"`"  ?
+# ptr/arr			_typ(p)+0!=_t0
+# arr				_typ(p)=="#"	_typ(p)>"#"  ?
+
+func	zorr(A,i, r) {
+      if ( i in A )		_conl("`" i "' in A"); else	_conl("`" i "' not in A")
+      r=A[i]=="" && A[i]==0
+      _conl("A[" i "] status is " r)
+      return
+      
+      a=a+-a
+      _conl("``````````````" a "''''''''''''''''") }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func	test_splitstr(A) {
+
+      AA0[-1]="huj"; AA0["A"]="pizda"; AA0[1]="zhopa"
+      delete AB0[AB0[""]=""]
+      AC0[-1]="HUJ"; AC0["A"]="PIZDA"; AC0[1]="ZHOPA"
+      
+      _SPLITSTRB0["1"]
+      
+      
+      wonl=""
+      _tstv(0,A,0,"_tstv")
+      _conl(wonl)
+      _wrfile("wonl.out",wonl)
+      }
+
+
+
+func	_tstv(p,A,r,f) {
+
+      if ( f=="" )	f="tst_splitstr"
+
+      @f(_NOP,A,p)
+      @f(AA0,A,p)
+      @f(AB0,A,p)
+      @f(AC0,A,p)
+      @f("",A,p)
+      @f("a",A,p)
+      @f("�a",A,p)
+      @f("�",A,p)
+      @f("a���,ba���,",A,p)
+      @f("�,",A,p)
+
+      @f(",",A,p)
+      @f("�a,",A,p)
+      @f("ab,",A,p)
+      @f("ab,�",A,p)
+      @f("�a�,,ba",A,p)
+      @f(",a,,b�,c,,�a,,�,,,",A,p)
+
+      }
+
+func	_wonl(t) {
+      wonl=wonl _ln(t) }
+
+func	_wonline(t) {
+      wonl=wonl _ln(substr(" _ " t " _____________________________________________________________________________________________________________________________________",1,126)) }
+
+func	tst_splitstr(t,A,R, r) {
+      delete A; A["not cleared"]
+      _wonl()
+      _wonline("_splitstr(" (isarray(t) ? "ARR" (length(t)>0 ? "#" (t[1]!="zhopa" ? "U" : "l") : "") : _val0(t)) ",A" (isarray(R) ? ",        ARR" (length(R)>0 ? "#" (R[1]!="zhopa" ? "U" : "l") : "") : ",        " _val0(R)) "):")
+
+      _wonl( _val0(r=_splitstr(t,A,R)))
+      _wonl("arrary A:"); _wonl(_dumparr(A))
+      return r }
+
+
+      #_____________________________________________________________________________
+      func	_val(v,t)	{ if ( isarray(v) )	return _dumparr(v) _ln(t)
+                        if ( v==0 && v=="" )	return _ln("- (ERRNO=" ERRNO ")") _ln(t)
+                                                return _ln(v "'") _ln(t) }
+
+      #_____________________________________________________________________________
+      func	_val0(v)	{ if ( isarray(v) )	return _dumparr(v)
+                        if ( v==0 && v=="" )	return "-"
+                                                return "\"" v "\"" }
+
+# add to _dumparr: checking that if element is undefined
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+func	_cfguid(p,optr,pfx,sfx,hstrcnt,lstrchr) { #################### 0 #
+      delete _UIDOBL[p]
+      if ( _isptr(optr) )		{ if ( optr==p )		{ delete _UIDOBLV[p]; delete _UIDOBLV[_UIDOBLV[_UIDOBL[p]=p][""]=p][""] }
+                                                      else	if ( optr in _UIDOBL )		_UIDOBL[p]=_UIDOBL[optr] }
+      _UIDPFX[p]=_istr(pfx) ? pfx : ""; _UIDSFX[p]=_istr(sfx) ? sfx : ""
+      if ( _isptr(hstrcnt) )		{ if ( hstrcnt!=p )	{ _UIDCHR[p]=_UIDCHR[_UIDCNT[p]=_UIDCNT[hstrcnt]]; return p } hstrcnt=_NOP }
+      _UIDCNTL[_UIDCNT[p]=p]=_cfguidchr(p,hstrcnt,lstrchr); return p }
+      #_____________________________________________________
+      func	_cfguidchr(p,h,l, H,L) {
+            if ( _isptr(l) )				{ if ( l!=p )	return _UIDCHR[p]=_UIDCHR[l]; _UIDCHR[p]=p; l=_NOP }
+            _UIDCHR[p]=p
+            _splitstr(H,h,_UIDCHRH[_classys]); _splitstr(L,l,H)
+            delete _UIDCHRH[_UIDCHRH[p][""]=p][""]; delete _UIDCHRL[_UIDCHRL[p][""]=p][""]
+            _cfguidh(p,H,L); return _cfguidl(p,L,L) }
+            #_______________________________________________
+            func	_cfguidh(p,H,L, hi,h,li)	{ for ( hi=1; hi in H; hi++ )		{ h=H[hi]
+                                                                                    for ( li=1; li in L; li++ )	_UIDCHRH[p][h L[li]] } }
+            func	_cfguidl(p,H,L, hi,h,hl,li)	{ for ( hi=1; hi in H; hi++ )		{ h=H[hi]
+                                                                                    for ( li=1; li in L; li++ )	hl=_UIDCHRL[p][hl]=h L[li] }
+                                                return hl }
+
+# problem configuring uid by array charset: i can' understand what format of the array: possibly - remove array support
+# after removal of array format detection: there is unfinished conflicts: it is possible to totally remove array uid-gen initialization
+
+      #_____________________________________________________
+      BEGIN	{ _inituidefault() }
+            func	_inituidefault( h,l,H,L) {
+                  _classys		=""
+
+                  delete _UIDOBLV[_UIDOBLV[_UIDOBL[_classys]=_classys][""]=_classys][""]
+                  _UIDPFX[_classys]; _UIDSFX[_classys]
+                  _UIDCNT[_classys]=_UIDCHR[_classys]=_CLASSPTR[_classys]=_classys
+
+                  h	="AB"
+                  l	=h "01"
+                                                
+                  _splitstr(H,h); _splitstr(L,l);
+                  delete _UIDCHRH[_UIDCHRH[_classys][""]=_classys][""]; delete _UIDCHRL[_UIDCHRL[_classys][""]=_classys][""]
+                  _UIDCNTH[_classys]; _cfguidh(_classys,H,L); _UIDCNTL[_classys]=_cfguidl(_classys,L,L)
+                                                
+                  _CLASSFN[_classys]["del"]		="_tobjDEL"
+                  _CLASSFN[_classys]["new"]		="_tobjNEW"
+                  _drawuid(_classys)
+                  _initspecialuid() }
+                  #_________________________________________
+                  func	_initspecialuid() {
+                        _NOINDEX	=_getuid()
+                        _LEN		=_getuid()
+                        _PTR		=_getuid()
+                        _NAME		=_getuid()
+                        _TYPE		=_getuid()
+                        _FORMAT	=_getuid()
+
+                        }
+#_______________________________________________________________________
+func	_getuid(p) { ################################################# 1 #
+      if ( p in _UIDOBL )	{ for ( _tptr in _UIDOBLV[_getuida0=_UIDOBL[p]] )	{ delete _UIDOBLV[_getuida0][_tptr]; _CLASSPTR[_tptr]=p; return _tptr } }
+      _CLASSPTR[_tptr=_UIDPFX[p] _getuid_i0(_UIDCNT[p],_UIDCHRL[_tptr=_UIDCHR[p]],_UIDCHRH[_tptr]) _UIDSFX[p]]=p
+      return _tptr }
+      #_____________________________________________________
+      func	_getuid_i0(p,UL,UH)	{ if ( ""==_tptr=UL[_UIDCNTL[p]] )	{ for ( _tptr in UH )	{ delete UH[_tptr]; return (_UIDCNTH[p]=_tptr) (_UIDCNTL[p]=UL[""]) }
+                                                                        _fatal("out of UID") }
+                                    return _UIDCNTH[p] (_UIDCNTL[p]=_tptr) }
+#_______________________________________________________________________
+func	_deluid(p) { ################################################# 1 #
+      if ( p in _CLASSPTR )	{ _deluida0=_CLASSPTR[p]
+                              if ( _deluida0 in _UIDOBL )	_UIDOBLV[_UIDOBL[_deluida0]][p] }
+      delete _CLASSPTR[p]; return _deluida0 }
+            
+func	test_uid( p,i) {
+      #test_cfg()
+      #return
+
+      _fclass=_cfguid(p=_getuid(_classys),p,"pfx","sfx","abc")
+      #_fclass=_cfguid(p=_getuid(_classys),_NOP,_NOP,_NOP,"",_classys)
+      _conl("_fclass uid: " _getuid(_fclass)); _drawuid(_fclass)
+      _conl("_classys uid: " _getuid(_classys))_drawuid(_classys)
+      for ( i=1; i<81; i++ )		_conl(i ": " _getuid(_fclass))
+      _drawuid(_fclass)
+      }
+
+
+func	test_cfg( p,z,AA0,a) {
+      AA0[1]
+      
+      _fclass=_cfguid(p=_getuid(_classys),_NOP,_NOP,_NOP,_NOP,_classys); _conl(); _conline(); _conl(); _drawuid(p)
+      _fclass=_cfguid(p=_getuid(_classys),AA0,AA0,AA0,AA0,_classys); _conl(); _conline(); _conl(); _drawuid(p)
+      a=_getuid(z=_fclass=_cfguid(p=_getuid(_classys),p,"<",">","ab","cd")); _conl("### " a "########"); _conline(); _conl(); _drawuid(p)
+      a=_getuid(_fclass=_cfguid(p=_getuid(_classys),z,0,0,_NOP,z)); _conl("### " a "########"); _conline(); _conl(); _drawuid(p)
+      a=_getuid(_fclass=_cfguid(p=_getuid(_classys),z,"^","$",z,_classys)); _conl("### " a "########"); _conline(); _conl(); _drawuid(p)
+      _fclass=_cfguid(p=_getuid(_classys),"oblptr","pfx","sfx","abcd"); _conl(); _conline(); _conl(); _drawuid(p)
+      
+      
+      _conl("```````````````````" z "'''''''''" ( _isptr(z) ? " ptr" : " not ptr"))
+      _drawuid(z)
+      }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func _drawuid(p, cn,ch,o) {
+      _conl("uid: " p)
+      _conl("\toblptr: " (p in _UIDOBL ? _UIDOBL[p] "'" : "-"))
+            if ( p in _UIDOBL )	{ if ( !_isptr(o=_UIDOBL[p]) )	_conl(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> oblptr not pointer")
+                                    if ( !isarray(_UIDOBLV[o]) )	_conl(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> no OBLV array at ptr") }
+
+      _conl("\tprefix:   " (p in _UIDPFX ? _UIDPFX[p] "'" : "-"))
+      _conl("\tsuffix:   " (p in _UIDSFX ? _UIDSFX[p] "'" : "-"))
+      _conl("\tcounters: " (cn=p in _UIDCNT ? _UIDCNT[p] "'" : "-"))
+      if ( cn!="-" )	{ _conl("\t\tcntrL:   " _UIDCNTL[_UIDCNT[p]] "'")
+                        _conl("\t\tcntrH:   " _UIDCNTH[_UIDCNT[p]] "'") }
+      _conl("\tcharset:  " (ch=p in _UIDCHR ? _UIDCHR[p] "'" : "-"))
+      if ( ch!="-" )	{ _conl("chrH:    "); _conl(_dumparr(_UIDCHRH[_UIDCHR[p]])); _conl()
+                        _conl("chrL:    "); _conl(_dumparr(_UIDCHRL[_UIDCHR[p]])); _conl() }
+
+
+      }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+func	_splitstr(A,t,r) { ########################################### 1 #
+      if ( _istr(t) )	{ if ( _splitstr_i0(A,t)>0 )		return _splitstrp0
+                        if ( _istr(r) )				return _splitstr_i0(A,r) }
+                  else	{ if ( it=="A" )				if ( length(t)>0 )	{ _movarr(A,t); return 0-length(A) }; _istr(r) }
+      if ( it=="A" )							if ( length(r)>0 )	{ _movarr(A,r); return 0-length(A) } }
+      #_____________________________________________________
+      func	_splitstr_i0(A,t, C) {
+            if ( 2>_splitstrq0=patsplit(t,_SPLITSTRA0,/([^,\xB4]*\xB4.)*[^,\xB4]*/) )	_splitstrq0=split(gensub(/\xB4(.)/,"\\1","G",t),_SPLITSTRA0,"")
+            delete A; _splitstri0=_splitstrp0=0
+            while ( _splitstri0++<_splitstrq0 ) {
+                  if ( (t=gensub(/\xB4(.)/,"\\1","G",_SPLITSTRA0[_splitstri0])) in C || t=="" )		continue
+                  C[A[++_splitstrp0]=t] }
+            return _splitstrp0 }
+
+# there is problem with string's format: i can;t easilly merge 2 charsets: comma-divided and every-char-divided strings
+
+#_______________________________________________________________________
+func	_isptr(p) { ################################################## 1 #
+      if ( isarray(p) )					{ is=_NOP; it="A"; return 0 }
+      is=p; if ( p==0 && p=="" )			{ it="-"; return 0 }
+      if ( p in _CLASSPTR )				return it="P"
+      it="S"; return 0 }
+#_______________________________________________________________________
+func	_istr(p) { ################################################### 1 #
+      if ( isarray(p) )					{ is=_NOP; it="A"; return 0 }
+      is=p; if ( p==0 && p=="" )			{ it="-"; return 0 }
+      return it=p=="" ? "s" : "S" }
+
+#______________________________________________________________________________________________
+func	_START( t,i,A) { #########################################################################
+      _torexp_init()
+      test_uid()
+      return
+      _conl(patsplit("a,b,c",A,/[^,]/,B))
+      test_splitstr(); return
+
+
+      A[""]; _CLASSPTR["ptr"]; ALTARR["ptra"]
+      _conl(_dumparr(SYMTAB))
+      BB[1]=_NOP
+      zorr(1,2,3,4,5,6)
+      zorr(BB,1)
+      
+      
+      _rtn()
+      _rtn("")
+      _rtn(0); _rtn("0")
+      _rtn(1); _rtn("1")
+      _rtn(-1); _rtn("-1")
+      _rtn("huj")
+      _rtn("ptr")
+      _rtn("ptra",ALTARR)
+      _rtn(ALTARR)
+      _rtn(ALTARR,ALTARR)
+
+
+      return
+      _tstini()
+      
+      return
+
+      _splitpath_test()
+#	_split_regpath()
+      return
+
+      hh="CPU"
+      _conl("go1!")
+      _conl(_var(_sharepath(hh,"gdfsgdsgsd sdgsdighjui teretiewrotrewut 345345345 rtjtireutireu huj")))
+      _conl("go2!")
+      _conl(_var(_sharelist(AAA,hh),_dumparr(AAA)))
+      _conline()
+      A[1]="h"
+      A[3]="j"
+      t="pizda"
+      if ( match(t,/^pi(Z)da/,A) )	_conl("match")
+                              else	_conl("not match")
+      _conl(_dumparr(A))
+      return
+
+
+
+
+
+
+
+      _pathSMA="C:\\Program Files\\Altiris\\Altiris Agent\\"
+      
+      
+      DSPlugInPath		=_pathSMA "Agents\\Deployment\\Agent\\"
+      DSAutoPath			=_pathSMA
+      
+      if ( !_sysinfo(_SYS,_hostname) )		_fatal("_sysinfo: unknown error")
+      _REG[""]; delete _REG[""]
+      _servoutput=_CHR["EOL"] _cmd("sc query state= all")
+
+      _dsbasepath="\\\\CPU\\CPU\\DEV\\PROJECT\\_DS\\"
+      _rdreg(_REG,"HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris")
+      _wrfile("rego.txt",_dumparr(_REG)); _conl("fF")
+      #_______________________________________________________________________
+
+      c=_getreg_i1(DDD,"HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Altiris Agent\\Plugin Objects\\�~.*�Install path",_REG)
+#_________________________________________________________________________________________
+      pp=_n("NAME","NS")
+      #pp=_n()
+      #___________________________________________________________________________________
+            p=_defsolution(pp,"DS Plug-in","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Altiris Agent\\Plugin Objects\\Agents\\")
+                  ClientConfiguration		=_defdll(p,"Client Configuration","ClientConfiguration")
+                  ClientImagingPrep			=_defdll(p,"Client Inaging Preparation","ClientImagingPrep")
+                  ClientImaging			=_defdll(p,"Client Imaging","ClientImaging")
+                  ClientPCT				=_defdll(p,"Client PCT","ClientPCT")
+                  ClientRebootTo			=_defdll(p,"Client Reboot To","ClientRebootTo")
+                  DeploymentAgent			=_defdll(p,"Deployment Agent","Deployment Agent")
+                  DeploymentSolutionBaseAgent	=_defdll(p,"Deployment Solution Base Agent","Deployment Solution Base Agent")
+                  
+                  ClientBCDEdit			=_defile(p,"Client BCD Edit","ClientBCDEdit.dll")
+                  ClientCopyFile			=_defile(p,"Client Copy File","ClientCopyFile.dll")
+                  ClientPreImage			=_defile(p,"Client Pre Image","ClientPreImage.dll")
+                  ClientRebootTo			=_defile(p,"Client Reboot To","ClientRebootTo.dll")
+                                                 _defile(p,"ConfigService.exe","ConfigService.exe","")
+                                                 _defile(p,"config.dll","config.dll","")
+
+                                                 _defsrv(p,"DS Plug-in Service","Altiris Deployment Solution - System Configuration")
+                                                 _defreg(p,"Deployment Agent Path","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Deployment\\AgentInstallPath.STR")
+                                                 _defile(p,"Altiris_DeploymentSolutionAgent_7_1_x86.msi",										_SYS["OSArchitecture"]=="64-bit" ? 											"C:\\Program Files\\Altiris\\Altiris Agent\\Agents\\SoftwareManagement\\Software Delivery\\{9D76E4CA-377A-472D-A82E-EDAD77E7E4ED}\\cache\\Altiris_DeploymentSolutionAgent_7_1_x64.msi"										:	"C:\\Program Files\\Altiris\\Altiris Agent\\Agents\\SoftwareManagement\\Software Delivery\\{4B747D25-612F-48FC-B6B5-9916D1BB755C}\\cache\\Altiris_DeploymentSolutionAgent_7_1_x86.msi","")
+                                                 _defdir(p,"Deployment Folder",a=gensub(/[^\\]*$/,"",1,_rdsafe(_REG,"HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Deployment\\AgentInstallPath.STR","C:\\Program Files\\Altiris\\Altiris Agent\\Agents\\Deployment\\Agent\\")))
+
+       #___________________________________________________________________________________
+            p=_defsolution(pp,"DS Auto","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Altiris Agent\\Plugin Objects\\Agents\\")
+                                                 _defdir(p,"C:\\Boot\\Altiris\\iso\\boot\\fonts\\","C:\\Boot\\Altiris\\iso\\boot\\fonts\\")
+                                                 _defdir(p,"C:\\Boot\\Altiris\\iso\\sources\\","C:\\Boot\\Altiris\\iso\\sources\\")
+                                                 
+                                                 _defile(p,"C:\\Boot\\Altiris\\iso\\autoinst.exe","C:\\Boot\\Altiris\\iso\\autoinst.exe","")
+                                                 _defile(p,"C:\\Boot\\Altiris\\iso\\autoinst.ini","C:\\Boot\\Altiris\\iso\\autoinst.ini","")
+                                                 _defile(p,"C:\\Boot\\Altiris\\iso\\autoutil.exe","C:\\Boot\\Altiris\\iso\\autoutil.exe","")
+                                                 _defile(p,"C:\\Boot\\Altiris\\iso\\autoutil.ini","C:\\Boot\\Altiris\\iso\\autoutil.ini","")
+                                                 _defile(p,"C:\\Boot\\Altiris\\iso\\bcdedit.exe","C:\\Boot\\Altiris\\iso\\bcdedit.exe","")
+                                                 _defile(p,"C:\\Boot\\Altiris\\iso\\bootmgr","C:\\Boot\\Altiris\\iso\\bootmgr","")
+                                                 _defile(p,"C:\\Boot\\Altiris\\iso\\bootsect.exe","C:\\Boot\\Altiris\\iso\\bootsect.exe","")
+                                                 
+                                                 _defreg(p,"Deployment Automation reg.File","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\AutoUtil\\File.XSZ","autoutil.exe")
+                                                 _defreg(p,"Deployment Automation reg.Path","HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\AutoUtil\\Path.XSZ","%systemdrive%\\boot\\altiris\\iso")
+#_________________________________________________________________________________________
+
+      _check(pp)
+#_________________________________________________________________________________________
+      
+      _conl(_report(pp)); _wrfile("report.txt",_report(pp))
+}#______________________________________________________________________________________________
+func	_END() { #################################################################################
+
+}#______________________________________________________________________________________________
+func	_EXIT() { ################################################################################
+
+}#____________________________________________________________________________________________________
+func	_check(p) { ####################################################################################
+      _dll_check(p)
+      _file_check(p)
+      _serv_check(p)
+      _reg_check(p) }
+#_________________________________________________________________________________________
+func	_report(p) { #######################################################################
+      _report_t0=_reportparnt=""; _report_i0(p); _tframe("_report_i0",p)
+      return _report_t0 }
+            
+      func	_report_i0(p,p0,p1,p2) { if ( p in _tPARENT ) {
+                                          if ( _reportparnt!=_reportparnt=_tPARENT[p] ) {
+                                                _report_t0=_report_t0	_ln()												_ln((z="_ " _[_tPARENT[p]]["NAME"] " ") _getchrln("_",_CON_WIDTH-length(z)-2))												_ln(_getchrln("#",_CON_WIDTH-2))												_ln() } }
+            if ( "ERROR" in _[p] )	{ _report_t0=_report_t0 _reporterr(p,_[p]["ERROR"])}
+            if ( "REPORT" in _[p] )	{ _report_t0=_report_t0 _ln(_[p]["REPORT"]) } }
+#___________________________________________________________________________________
+func	_creport(p,t,f, z) {
+      _[p]["REPORT"]=_[p]["REPORT"] _ln(t (f=="" ? "" : ": " f)) }
+#___________________________________________________________________________________
+func	_reporterr(p,t3, pp,t,t2) {
+      t=""; pp=p
+      do { "NAME" in _[pp] ? t=_[pp]["NAME"] ": " t : "" } while ( pp=_rPARENT(pp) )
+      if ( match(t3,/\x00/) )		return substr(t3,1,RSTART-1) t substr(t3,RSTART+1)
+      return t t3 }
+#___________________________________________________________________________________
+func	_dllerr(p,t,f)	{ if ( t!~/\x00/ )	t="ERROR: \x00" t
+                        _errfl=1; _[p]["ERROR"]=_[p]["ERROR"] _ln(t (f=="" ? "" : ": " f)) }
+
+
+#_______________________________________________________________________________________________
+func	_defsolution(pp,n,rn, p) { ###############################################################
+      _[p=_wLCHLD(pp,_n("TYPE","solution"))]["NAME"]=n
+      _[p]["REGPATH"]=rn
+      _[p]["ERRHOST"]=pp
+      return p }
+#_________________________________________________________________________________________
+func	_defreg(pp,n,f,v, p) { #############################################################
+      _[p=_wLCHLD(pp,_n("TYPE","defreg"))]["NAME"]=n
+      _[p]["REGPATH"]=f; if ( !(v==0 && v=="") )	_[p]["VALUE"]=v }
+      #_______________________________________________________________________
+      func	_reg_check(p) { _tframe("_reg_check_i0",p,p) }
+            #_______________________________________________
+            func	_reg_check_i0(p,pp,p1,p2) {
+                  if ( _[p]["TYPE"]=="defreg" ) {
+                        if ( _[p]["REGPATH"] in _REG ) {
+                              if ( "VALUE" in _[p] )	{ if ( _[p]["VALUE"]==_REG[_[p]["REGPATH"]] )			_creport(p,substr("OK:    REGENTRY MATCH(==" _[p]["VALUE"] "): " _[p]["REGPATH"],1,126))
+                                                                                                            else	_dllerr(p,substr("REGENTRY NOT MATCH(!=" _[p]["VALUE"] "): " _[p]["REGPATH"],1,126)) }
+                                                      else	if ( _VAR[_[p]["REGPATH"]]==_REG[_[p]["REGPATH"]] )	_creport(p,substr("OK:    REGPATH MATCH(==" _VAR[_[p]["REGPATH"]] "): " _[p]["REGPATH"],1,126))
+                                                                                                            else	_dllerr(p,substr("REGPATH NOT MATCH(!=" _VAR[_[p]["REGPATH"]] "): "  _[p]["REGPATH"],1,126)) }
+                        else	{ _dllerr(p,substr("REGPATH NOT FOUND: " _[p]["REGPATH"],1,126)) } } }
+#_________________________________________________________________________________________
+func	_defdir(pp,n,f,v, p) { #############################################################
+      _[p=_wLCHLD(pp,_n("TYPE","defdir"))]["NAME"]=n
+      _[p]["DIR"]=f
+      return p }
+#_________________________________________________________________________________________
+func	_defile(pp,n,f,v, p) { #############################################################
+      _[p=_wLCHLD(pp,_n("TYPE","defile"))]["NAME"]=n
+      _[p]["FILE"]=f; if ( !(v==0 && v=="") )		_[p]["RQVERSION"]=v
+      return p }
+      #_______________________________________________________________________
+      func	_file_check(p)	{ if ( 1 || "AGENT" in _[p] )	{ _tframe("_file_check_i0",p,p) } }
+            #_______________________________________________
+            func	_file_check_i0(p,pp,p1,p2, f,v) {
+                  if ( _[p]["TYPE"]=="defile" )	{
+                        f=_[p]["FILE"]
+                        f=(match(f,/^.:/) ? "" : _[_[pp]["AGENT"]][".Install Path"] "\\") _[p]["FILE"]; if ( "RQVERSION" in _[p] )	v=_[p]["RQVERSION"]; else	v=_[pp][".Product Version"]
+                        ERRNO=""; if ( _th1(_[p]["DATA"]=_rdfile(f),ERRNO) )		{ delete _[p]["DATA"]; return _dllerr(p,"read file: " ERRNO,f) }
+                        if ( v!="" && v!=(_[p]["VERSION"]=_getfilever(f)) )		return _dllerr(p," file version mismatch: ==`" _[p]["VERSION"] "'; !=`" v "'",f)
+                        _creport(p,substr("OK:    FILE DETECTED" (v=="" ? "" : "(" v ")") ": " f,1,122)) }
+                  else	if ( _[p]["TYPE"]=="defdir" )		{ if ( _filexist(f=_[p]["DIR"]) )	_creport(p,substr("OK:    DIR DETECTED: " f,1,112))
+                                                                                          else	_dllerr(p,"directory " f " is not detected") } }
+#_________________________________________________________________________________________
+func	_defsrv(pp,n,f,v, p) { #############################################################
+      _[p=_wLCHLD(pp,_n("TYPE","defsrv"))]["NAME"]=n
+      _[p]["SERVNAME"]=f
+      return p }
+      #_______________________________________________________________________
+      func	_serv_check(p) { _tframe("_serv_check_i0",p,p) }
+            #_______________________________________________
+            func	_serv_check_i0(p,p0,p1,p2,p3, i,q,c) {
+                  if ( _[p]["TYPE"]=="defsrv" ) {
+                        i=IGNORECASE; IGNORECASE=1
+                        if ( match(_servoutput,roi="\\012DISPLAY_NAME: " _torexp(_[p]["SERVNAME"])) )		{ _creport(p,"OK:    SERVICE DETECTED: " substr(_[p]["SERVNAME"],1,112)) }
+                                                                                                                  else	{ _dllerr(p,"service " _[p]["SERVNAME"] " not detected") } }
+                        IGNORECASE=i }
+#_________________________________________________________________________________________
+func	_defdll(pp,n,rn, p) { ##############################################################
+      _[p=_wLCHLD(pp,_n("TYPE","defdll"))]["NAME"]=n
+      _[p]["REGPATH"]=_[pp]["REGPATH"] rn
+      _[p]["ERRHOST"]=pp
+      return p }
+      #_______________________________________________________________________
+      func	_dll_check(pp)	{ _dllchktv=""; _missfl=1
+                              _tframe("_dll_check_i0",pp,_REG,pp) 					#also check that all dll have same version; also check that all dlls have success and then report that DS plug-in version n - installed
+                              if ( 1 || "AGENT" in _[pp] ) {
+                                    if ( _dllchktv!=_[pp][".Product Version"] )	_dllerr(_[pp]["AGENT"],"agent version (" _[pp][".Product Version"] ") do not match all lib versions: " _dllchktv "'") }
+                              else { if ( !_missfl )						_creport(pp,"agent not detected in registry")
+                                                                              else	{ _dllerr(pp,"agent not detected in registry but some registry entries exist:")
+                                                                                    _tframe("_dll_check_i1",pp,pp) } } }
+            #_______________________________________________
+            func	_dll_check_i1(p,pp,p1,p2,p3, i) {
+                  if ( _[p]["TYPE"]=="defdll" ) {
+                        for ( i in _[p] )		{ if ( i~/^\./ )		_dllerr(pp,"          " _[p]["REGPATH"] "\\" substr(i,2)) } } }
+            #_______________________________________________
+            func	_dll_check_i0(p,R,pp,p2, i,i2,r,f,v,rs,d,tv,tf) {
+                  if ( _[p]["TYPE"]=="defdll" )	{
+                        r=toupper(_[p]["REGPATH"]); rs=0; tf=0; tv=""
+                        for ( i in R )	{
+                                          if ( toupper(substr(i,1,length(r)))==r )	{ if ( (_chka0=substr(i,1+length(r),1))=="" || _chka0=="\\" ) {
+                                                                                                rs=1; _missfl=1; _[p]["." substr(gensub(/\....$/,"",1,i),i2=2+length(r),length(i)-i2+1)]=R[i]
+                                                                                                if ( chka0!="" )		rs=1 } } }				#{ rs=_missfl=1; _[p]["." gensub(/^([^\\]+\\)+(.*)\..../,"\\2","G",i)]=R[i] } }
+                        if ( rs )	{ if ( (i=".Install Path") in _[p] && (i=".Product Version") in _[p] )	{ _[p]["STATUS"]="PRESENT"
+                                                                                                            f=_[p][".Install Path"]; v=_[p][".Product Version"]
+                                                                                                            if ( !(".Module" in _[p]) )	{ _[pp][".Product Version"]=v; _VAR["HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Deployment\\AgentInstallPath.STR"]=f; _[pp]["AGENT"]=p; _creport("OK:  DLL DETECTED(" v "): " substr(_[p]["NAME"],1,112)) }
+                                                                                                            else	{ if ( _dllchktv=="" )	_dllchktv=v
+                                                                                                                                    else	if ( v!=_dllchktv )			return _dllerr(p,"different versions detected: " _dllchktv "!=" v "'")
+                                                                                                                  ERRNO=""; if ( _th1(_[p]["DATA"]=_rdfile(f),ERRNO) )		{ delete _[p]["DATA"]; return _dllerr(p,"read lib: " ERRNO,f) }
+                                                                                                                  if ( v!=(_[p]["VERSION"]=_getfilever(f)) )			return _dllerr(p,"library file version mismatch: ==`" _[p]["VERSION"] "'; !=`" v "'",f)
+                                                                                                                  _creport(p,"OK:    LIBRARY DETECTED(" v "): " substr(f,1,100)) } }
+                                                                                                      else	{ tf=1; _dllerr(p,"registry corrupt: `" i "' not present") } }
+                                                                                                      else	_[p]["STATUS"]="MISSED" } }
+#_____________________________________________________________________________________________________
+######################################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func	_rdsafe(A,i,d)	{ if ( i in A )	return A[i]; return d }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+      #_____________________________________________________________________________
+      func	_var(v,t)	{ if ( isarray(v) )	return _dumparr(v) _ln(t)
+                        if ( v==0 && v=="" )	return _ln("- (ERRNO=" ERRNO ")") _ln(t)
+                                                return _ln(v "'") _ln(t) }
+      #_____________________________________________________________________________
+      func	_dumpval(v,n) {
+            _dumpstr=_dumpstr (v=_ln((n==0 && n=="" ? "RET" : n) ": " (v==0 && v=="" ? "-" : v "'")))
+            return v }
+
+
+func	_torexp(r)	{ return _subseqon(_TOREXPB0,gensub(/(^[ \t]+)|(([ \t]*(\\)+)+[ \t]*)|([ \t]+$)/,"\\4","G",_subseqoff(r,_TOREXPB0)),_TOREXPFN) }
+
+
+      #_______________________________________________
+      func	_torexp_init()	{ _TOREXPFN[""]		="_strtorexp"
+                                _TOREXPFN["~"]		="_torexp_rexp"
+                                _TOREXPFN["="]		="_strtorexp"
+                                _TOREXPFN[">"]		="_torexp_cmdstr"
+                                _TOREXPFN["#"]		="_torexp_fmask"
+                                _TOREXPFN["\""]		="_torexp_dqstr"
+                                _TOREXPFN["'"]		="_torexp_sqstr"
+                                }
+
+func	_subseqoff(r,B)	{ patsplit(r,B,/\x84[^\x94]*\x94/); return gensub(/\x84[^\x94]*\x94/,"\x84","G",r) }
+
+func	_subseqon(B,r,F, f,s,e,q,i,A) {
+      q=split(r,A,/\x84/); r=""; f=F[""]
+      for ( i=1; i<q; i++ )	{ s=substr(e=B[i],2,1)
+                              #_conl("curr r==`" r "': A[" i "]=`" A[i] "'")
+                              #s=s in F ? _th0(F[s],_conl("handler `" F[s] "' for `" s "' ost=`" substr(e,3,length(e)-3) "'")) : _th0(F[""],_conl("default handler for `" s "'"))
+                              s=s in F ? F[s] : F[""]
+                              #_conl("`" f "'")
+                              r=r @f(A[i]) @s(substr(e,3,length(e)-3)) }
+      return r @f(A[i]) }
+      #_______________________________________________
+      func	_torexp_rexp(t)	{ return t }
+      #_______________________________________________
+      func	_strtorexp(t)	{ gsub(/[\\\.\?\*\+\-\(\)\{\}\[\]\^\$\/\|]/,"\\\\&",t)
+                              t=split(t,_TOREXP_STRA,/[\x00-\x1F]/,_TOREXP_STRB); _torexp_strt0=""
+                              for ( _torexp_stri0=1; _torexp_stri0<t; _torexp_stri0++ )		_torexp_strt0=_torexp_strt0 _TOREXP_STRA[_torexp_stri0] "\\" _QASC[_TOREXP_STRB[_torexp_stri0]]
+                              return _torexp_strt0 _TOREXP_STRA[_torexp_stri0] }
+
+      func	_torexp_cmdstr(t)	{ return _strtorexp(gensub(/\^(.)/,"\\1","G",t)) }
+      
+      func	_torexp_fmask(t)	{ return gensub(/\\\*/,".*","G",gensub(/\\\?/,".?","G",_strtorexp(t))) }
+
+
+func	_getfilever(f) { #############################################################
+      split(_cmd(_fileverpath " \"" f "\""),_GETFILEVERA0,/[ \t]+/)
+      if ( _GETFILEVERA0[5] )		return _GETFILEVERA0[5] }
+      #_____________________________________________________
+      BEGIN	{ _initfilever() }
+            func	_initfilever()	{ _fileverpath		="\\\\CPU\\eGAWK\\LIB\\_filever\\_filever.exe" }
+
+#_________________________________________________________________________________________
+##########################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func	_sharelist(D,h, q,c,l,A,B) { #################################################
+      delete D; c=_sharextool " \\\\" (h=="" ? h=ENVIRON["COMPUTERNAME"] : h) " 2>&1"
+      if ( match(c=_cmd(c),/\x0AShare[^\x0A]*Remark/) ) {
+            gsub(/(^[^-]*\x0D?\x0A-+\x0D?\x0A[ \t]*)|(\x0D?\x0AThe command completed successfully.*$)/,"",c)
+            l=RLENGTH-7; split(c,A,/([ \t]*\x0D?\x0A)+[ \t]*/)
+            for ( c in A )			if ( match(A[c],/((([^ \t:]+[ \t]+)*[^ \t:]+)[ \t]+)([A-Za-z])[ \t]*:/,B) && ++q )				D[B[2]]=A[c]~/\.\.\.$/ ? _sharepath(h,B[2]) : gensub(/[ \t\\\/]*$/,"\\\\",1,substr(A[c],1+B[1,"length"],l-B[1,"length"]))
+            return q }
+      return _rmtsharerr(h,c) }
+#_____________________________________________________________________________
+func	_sharepath(h,s, A) { ###################################################
+      s=_sharextool " \\\\" (h=="" ? h=ENVIRON["COMPUTERNAME"] : h) "\\\"" s "\" 2>&1"
+      if ( match(s=_cmd(s),/\x0APath[ \t]+([^\x0D\x0A]+)/,_SHAREPATHA0) )	return gensub(/[ \t\\\/]*$/,"\\\\",1,_SHAREPATHA0[1])
+      return _rmtsharerr(h,s) }
+      #___________________________________________________________
+      func	_rmtsharerr(h,t)	{ gsub(/[\x0D\x0A]+/,"",t)
+                              if ( t~/^The command failed: 53/)	ERRNO="host not found: \\\\" h
+                                                            else	ERRNO=t ": \\\\" h }
+      #_____________________________________________________
+      BEGIN	{ _initshare() }
+            func	_initshare()	{ _sharextool		="\\\\CPU\\eGAWK\\LIB\\_share\\_share.exe" }
+#_________________________________________________________________________________________
+##########################################################################################
+
+
+
+
+
+
+
+
+func	_extfn_init() { ##############################################################
+
+      _formatstrs_init(); _formatstrd_init(); _formatrexp_init()
+
+      _unformatstr_init()
+      
+      _mac_init()
+
+}#__________________________________________________________________________________
+####################################################################################
+
+
+
+
+#___________________________________________________________________________________
+func	_formatstrs(t) { _formatstrq0=split(t,_FORMATSTRA,/['\x00-\x1F\x80-\xFF]/,_FORMATSTRB); _formatstrs0=""
+                    for ( t=1; t<_formatstrq0; t++ )		_formatstrs0=_formatstrs0 _FORMATSTRA[t] _FORMATSTRSESC[_FORMATSTRB[t]]
+                    return _formatstrs0 _FORMATSTRA[t] }
+      #___________________________________________________________
+      func	_formatstrs_init() { _defescarr(_FORMATSTRSESC,"[\\x00-\\x1F\\x80-\\xFF]",_QASC)
+                               _defescarr(_FORMATSTRSESC,"[\\\\']","\\")
+                               _FORMATSTRSESC["\t"]="\\t" }
+#_____________________________________________________________________________
+func	_formatstrd(t) { _formatstrq0=split(t,_FORMATSTRA,/["\x00-\x1F\x80-\xFF]/,_FORMATSTRB); _formatstrs0=""
+                     for ( t=1; t<_formatstrq0; t++ )		_formatstrs0=_formatstrs0 _FORMATSTRA[t] _FORMATSTRDESC[_FORMATSTRB[t]]
+                     return _formatstrs0 _FORMATSTRA[t] }
+      #___________________________________________________________
+      func	_formatstrd_init() { _defescarr(_FORMATSTRDESC,"[\\x00-\\x1F\\x80-\\xFF]",_QASC)
+                               _defescarr(_FORMATSTRDESC,"[\\\\\"]","\\")
+                               _FORMATSTRDESC["\t"]="\\t" }
+#_____________________________________________________________________________
+func	_formatrexp(t) { _formatstrq0=split(t,_FORMATSTRA,/[\/\x00-\x1F\x80-\xFF]/,_FORMATSTRB); _formatstrs0=""
+                     for ( t=1; t<_formatstrq0; t++ )		_formatstrs0=_formatstrs0 _FORMATSTRA[t] _FORMATREXPESC[_FORMATSTRB[t]]
+                     return _formatstrs0 _FORMATSTRA[t] }
+      #___________________________________________________________
+      func	_formatrexp_init() { _defescarr(_FORMATREXPESC,"[\\x00-\\x1F\\x80-\\xFF]",_QASC)
+                               _defescarr(_FORMATREXPESC,"\\/","\\")
+                               _FORMATREXPESC["\t"]="\\t" }
+#___________________________________________________________
+func	_defescarr(D,r,S, i,c,t) { if ( isarray(S) )	{ for ( i=0; i<256; i++ )	{ if ( (c=_CHR[i])~r )	{ D[c]="\\" S[c]; t=t c }
+                                                                                                      else	if ( D[c]=="" )	D[c]=c } }
+                                                else	{ for ( i=0; i<256; i++ )	{ if ( (c=_CHR[i])~r )	{ D[c]=S c; if ( S!="" )	t=t c }
+                                                                                                      else	if ( D[c]=="" )	D[c]=c } } return t }
+
+
+#___________________________________________________________________________________
+func	_unformatstr(t)	{ _formatstrq0=split(t,_FORMATSTRA,/(\\[0-9]{1,3})|(\\x[[:xdigit:]]+)|(\\.)/,_FORMATSTRB); _formatstrs0=""
+                        for ( t=1; t<_formatstrq0; t++ )	_formatstrs0=_formatstrs0 _FORMATSTRA[t]											(_FORMATSTRB[t] in _QESCHR ?	_QESCHR[_FORMATSTRB[t]]															:	_QESCHR[toupper(substr(_FORMATSTRB[t],length(_FORMATSTRB[t])-1))])
+                        return _formatstrs0 _FORMATSTRA[t] }
+      #___________________________________________________________
+      func	_unformatstr_init( i)	{ for ( i=0; i<256; i++ )	_QESCHR["\\" _CHR[i]]			=_CHR[i]
+                                    for ( i=0; i<256; i++ ) {	_QESCHR[sprintf("%.2X",i)]		=_CHR[i]
+                                                                  _QESCHR["\\" sprintf("%.3o",i)]	=_CHR[i]
+                                                if ( i<8 )		_QESCHR["\\" sprintf("%.1o",i)]	=_CHR[i]
+                                                if ( i<64 )		_QESCHR["\\" sprintf("%.2o",i)]	=_CHR[i]
+                                                if ( i<16 )		_QESCHR["\\x" sprintf("%.1X",i)]=_QESCHR["\\x" sprintf("%.1x",i)]	=_CHR[i] }
+                                    i="a" 7 "b" 8 "f" 12 "n" 10 "r" 13 "t" 9 "v" 11
+                                    patsplit(i,_FORMATSTRA,/[^0-9]/,_FORMATSTRB)
+                                    for ( i in _FORMATSTRA )	_QESCHR["\\" _FORMATSTRA[i]]=_CHR[_FORMATSTRB[i]+0] }
+
+
+
+#___________________________________________________________________________________
+func	_unformatrexp(t)	{ _formatstrq0=split(t,_FORMATSTRA,/(\\[0-9]{1,3})|(\\x[[:xdigit:]]+)|(\\.)/,_FORMATSTRB); _formatstrs0=""
+                        for ( t=1; t<_formatstrq0; t++ )	_formatstrs0=_formatstrs0 _FORMATSTRA[t]											(_FORMATSTRB[t] in _QESCHR ?	_QESCREXP[_FORMATSTRB[t]]															:	_QESCREXP[toupper(substr(_FORMATSTRB[t],length(_FORMATSTRB[t])-1))])
+                        return _formatstrs0 _FORMATSTRA[t] }
+      #___________________________________________________________
+      func	_unformatrexp_init( i,a) { _formatstrs0="\\^$.[]|()*+?{}-sSwW<>yB`'"; delete _FORMATSTRB
+                                       for ( i=0; i<256; i++ )	_QESCREXP["\\" _CHR[i]]			=index(_formatstrs0,_CHR[i]) ? "\\" _CHR[i] : _CHR[i]
+                                       for ( i=0; i<256; i++ )	{ a=index(_formatstrs0,_CHR[i]) ? "\\" : ""
+                                                                  _QESCREXP[sprintf("%.2X",i)]		=a _CHR[i]
+                                                                  _QESCREXP["\\" sprintf("%.3o",i)]	=a _CHR[i]
+                                                                  if ( i<8 )	_QESCREXP["\\" sprintf("%.1o",i)]	=a _CHR[i]
+                                                                  if ( i<64 )	_QESCREXP["\\" sprintf("%.2o",i)]	=a _CHR[i]
+                                                                  if ( i<16 )	_QESCREXP["\\x" sprintf("%.1X",i)]=_QESCREXP["\\x" sprintf("%.1x",i)]=a _CHR[i] }
+                                       patsplit("a" 7 "b" 8 "f" 12 "n" 10 "r" 13 "t" 9 "v" 11,_FORMATSTRA,/[^0-9]/,_FORMATSTRB)
+                                       for ( i in _FORMATSTRA )	_QESCREXP["\\" _FORMATSTRA[i]]=_CHR[_FORMATSTRB[i]+0] }
+#
+#	/rexpstr/	->	datastr
+#	(\x00\t\+)*	->	28 00 09 5B 2B 29
+#
+# unesc all non-rexp characters: replace unesc of rexp-characters but do not remove it: \* -> \*, \x2A -> \*, \052 -> \*, \\ -> \#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func	_mpudefaulthnd(F,D,C,p1,p2,p3)	{ _mpuretsub(D,_mpucc0) }
+
+
+
+
+
+func	_mpupfxsubret(F,D,C,p1,p2,p3) 	{ return 1 }
+
+func	_mpusfxsubret(F,D,C,p1,p2,p3) 	{ return -1 }
+
+func	_mpuretsub(D,t)	{ _mpuacc=D[_mpuptr++]; _accmpu(D,t); return 1 }
+
+
+      func	_mac_init() {	_MACPFX["\x84"]			="_macpfx84"
+                              _MACPFX[""]				="_mpupfxsubret"
+
+                              
+                              _MACPFX84SFX["\x84"]		="_macpfx84"
+                              _MACPFX84SFX["\x94"]		="_macsfx94"
+                              _MACPFX84SFX[""]			="_mpusfxsubret"
+
+
+                              _VLDMAXSTRING	=1000000
+
+                              }
+      
+
+func	_macpfx84(F,D,C,p1,p2,p3)	{ return _mpusub(_MACPFX84SFX,D,C,D[_mpuptr++],p1,p2,p3) }
+
+
+      
+
+
+func	_macsfx94(F,D,C,p1,p2,p3)	{ return _mpuretsub(D,_handle8494(_mpuacc)) }
+
+func	_handle8494(t) {	return gensub(/(.)/,".\\1","G",t) }
+
+
+func	_mpu(t,F,p1,p2,p3, D,C) {
+      if ( patsplit(t,C,/[\x84\x93\x94]/,D)>0 )	{ _conline("CODE"); _conl(); _conl(_dumparr(C))
+                                                _conline("DATA"); _conl(); _conl(_dumparr(D))
+                                                
+                                                _mpuptr=0; _mpucc0=""; _mpusub(F,D,C,D[_mpuptr++],p1,p2,p3)
+                                                return _mpuacc }
+      return t }
+
+func	_mpusub(F,D,C,d,p1,p2,p3, q) {
+      q=D[_ARRLEN]
+      if ( _VLDMAXSTRING<length(d) )	{ D[--D[_ARRLEN]]=d; _mpuacc="" }
+                                    else	_mpuacc=d
+      d=_mpucc0
+      _conl("_mpusub enter: in `" _mpuacc "' / _mpuptr=" _mpuptr "'")
+      do { if ( (_mpucc0=C[_mpuptr]) in F )	{ if ( isarray(F[_mpucc0]) )	_mpufn0=F[_mpucc0]
+                                                _conl("FN: `" _mpucc0 "' > CALL: `" (_mpufn0) "' : _mpuacc=" _mpuacc "'") }
+                                          else	_mpufn0="_mpudefaulthnd" } while ( !_accmpu(D,_mpuacc,@_mpufn0(F,D,C,p1,p2,p3)) )
+      if ( _mpufn0==-1 )	{ _conl("WARNING: unclosed expression: `" d _mpuacc"'")
+                              _mpuacc=d _mpuacc }
+      _retarrm(D,q,"",_mpufn0==-1 ? _th0(d,_mpusubwrng("WARNING: unclosed expression",d _mpuacc)) : "")
+      # collect: _mpuacc=_retarr(D) _mpuacc
+      _conl("mpusub exit: _mpuacc: `" _mpuacc "'") }
+
+
+
+
+
+
+func	_accmpu(A,a,n) 	{ if ( n )		return _mpufn0=n
+                        if ( _mpuacc )	{ if ( _VLDMAXSTRING<length(_mpuacc)+length(a) ) {
+                                                            if ( a )	{ if ( _VLDMAXSTRING<length(_mpuacc) )	{ A[--A[_ARRLEN]]=a; A[--A[_ARRLEN]]=_mpuacc }
+                                                                                                            else	A[--A[_ARRLEN]]=a _mpuacc }
+                                                            else	A[--A[_ARRLEN]]=_mpuacc
+                                                            _mpuacc="" }
+                                                      else	_mpuacc=a _mpuacc }
+                                    else	_mpuacc=a }
+
+
+
+
+func	_acc(A,a,t) { if ( t )	{ if ( _VLDMAXSTRING<length(t)+length(a) ) {
+                                    if ( a )	{ if ( _VLDMAXSTRING<length(t) )	{ A[--A[_ARRPTR]]=a; A[--A[_ARRPTR]]=t }
+                                                                              else	A[--A[_ARRPTR]]=a t }
+                                    else	A[++A[_ARRLEN]]=t
+                                    return "" }
+                              return a t }
+                              return a }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+      
+func	_shortcut(D,S) { #############################################################
+      if ( isarray(D) )			{ if ( isarray(S) )										{ _addarrmask(D,S,_SHORTCUTWSTRUC) }				# array,array2*		- copy from array2 to array shorcut-specific elements
+                                    else	if ( S==0 && S=="" )								{ _addarrmask(D,_SHORTCUTDEFAULT,_SHORTCUTWSTRUC) }		# array*			- define shortcut-specific elements in array by default values
+                                    else	if ( _isnotfileptr(S) )								{ _addarrmask(D,_[S],_SHORTCUTWSTRUC) }				# array,ptr*		- copy from array _[ptr] to array shorcut-specific elements
+                                    else	if ( _rd_shortcut(D,S) )								return }									# array,filepath*		- define in array shortcut-specific elements by reading its from shortcut file filepath(load shortcut)
+      else	if ( D==0 && D=="" )													return _NOP									# -*				- no action(return -)
+      else	if ( _isnotfileptr(D) )	{ if ( isarray(S) )										{ _addarrmask(_[D],S,_SHORTCUTWSTRUC) }				# ptr,array*		- copy from array to array _[ptr] shorcut-specific elements
+                                    else	if ( S==0 && S=="" )								{ _addarrmask(_[D],_SHORTCUTDEFAULT,_SHORTCUTWSTRUC) }	# ptr*			- define shortcut-specifc elements in array _[ptr] by default values
+                                    else	if ( _isnotfileptr(S) )								{ _addarrmask(_[D],_[S],_SHORTCUTWSTRUC) }			# ptr,ptr2*			- copy from array _[ptr2] to array _[ptr] shorcut-specific elements
+                                    else	if ( _rd_shortcut(_[D],S) )							return }									# ptr,filepath*		- define in array _[ptr] shortcut-specific elements by reading its from shortcut file filepath(load shortcut)
+                              else	{ if ( isarray(S) && _wr_shortcut(D,S) )						return										# filepath,array*		- [over]write shorcut file filepath; shortcut parameters will be defined by shortcut-specific elements in array(save shortcut)
+                                    else	if ( S==0 && S=="" && _wr_shortcut(D,_SHORTCUTDEFAULT) )		return										# filepath*			- [over]write shorcut file filepath; shortcut parameters will be defined by default values
+                                    else	if ( _isnotfileptr(S) && _wr_shortcut(D,_[S]) )				return										# filepath,ptr*		- [over]write shorcut file filepath; shortcut parameters will be defined by shortcut-specific elements in array _[ptr](save shortcut)
+                                    else	if ( _rd_shortcut(_SHRTCUTA1,S) || _wr_shortcut(D,_SHRTCUTA1) )	return }									# filepath,filepath2*	- [over]write shorcut file filepath; shortcut parameters will be defined from shortcut file filepath2(copy shortcut)
+      return 1 }
+      #___________________________________________________________
+      func	_wr_shortcut(f,S)	{ if ( (_shrtcutf0=_filepath(f)) ) {
+                                    ERRNO=""; _shrtcuta0=_shortcut_fpath " /A:C /F:\"" _shrtcutf0 "\" 2>&1"
+                                    for ( f in _SHORTCUTWSTRUC )	if ( f in S )		_shrtcuta0=_shrtcuta0 " " _SHORTCUTWSTRUC[f] "\"" gensub(/(\\?)$/,"\\1\\1",1,S[f]) "\""
+                                    if ( _shortcut_nerr(_cmd(_shrtcuta0),_shrtcutf0) )	return }
+                              return ERRNO ? ERRNO="write shortcut: " ERRNO : _NOP }
+      #___________________________________________________________
+      func	_rd_shortcut(D,f)	{ if ( (_shrtcutf0=_filepath(f)) && _shortcut_nerr(_shrtcuta0=_cmd(_shortcut_fpath " /A:Q /F:\"" _shrtcutf0 "\" 2>&1"),_shrtcutf0) ) {
+                                    ERRNO=""; split(_shrtcuta0,_SHRTCUTA0,/\x0D?\x0A/)
+                                    for ( _shrtcuta0 in _SHRTCUTA0 )							for ( f in _SHORTCUTRSTRUC )								if ( match(_SHRTCUTA0[_shrtcuta0],"^" f) )									D[_SHORTCUTRSTRUC[f]]=substr(_SHRTCUTA0[_shrtcuta0],1+RLENGTH) }
+                              return ERRNO ? ERRNO="read shortcut: " ERRNO : _NOP }
+            #_____________________________________________________
+            func	_shortcut_nerr(t,s, A)	{ if ( match(t,/\x0ASystem error (-?[0-9]+)[^\x0D\x0A]*[\x0D\x0A]+([^\x0D\x0A]+)/,A) ) {
+                                                ERRNO=(A[1] in _SHORTCUTERR ?	_SHORTCUTERR[A[1]]													: A[2] in _SHORTCUTERR ?	_SHORTCUTERR[A[2]]																	: tolower(gensub(/^(The )?(((.*)\.$)|(.*[^\.]$))/,"\\4\\5","G",A[2])) "(" A[1] ")")									(s ? ": `" s "'" : "") }
+                                          else	return 1 }
+      #________________________________________________
+      func	_shortcut_init( A,B,q) {
+                  _SHORTCUTERR[2]												="file not found"
+                  _SHORTCUTERR[3]												="no such filepath"
+                  _SHORTCUTERR["The system cannot find the file specified."]					="no such filepath"
+                  _SHORTCUTERR[5]												="file is folder"
+                  _SHORTCUTERR["Access is denied."]									="file is folder"
+                  _SHORTCUTERR[123]												="filepath syntax error"
+                  _SHORTCUTERR["The filename, directory name, or volume label syntax is incorrect."]	="filepath syntax error"
+            q=	"target			/T:				TargetPath=					target?			;			_target							TargetPathExpanded=							;			parameters			/P:				Arguments=					paraneters?			;			_parameters							ArgumentsExpanded=							;			startdir			/W:				WorkingDirectory=				startdir?			;			_startdir							WorkingDirectoryExpanded=						;			runstyle			/R:				RunStyle=					1				;			icon,index			/I:				IconLocation=				icon,index?			;			xicon,index							IconLocationExpanded=							;			shortcut key		/H:				HotKey=					0				;			description			/D:				Description=				_env4: default shortcut	"
+                  split(q,_SHRTCUTA0,/[ \t]*;[ \t]*/)
+                  for ( q in _SHRTCUTA0 )	if ( match(_SHRTCUTA0[q],/^([^\t]+)\t+([^\t]+)(\t+([^\t]+)(\t+([^\t]+))?)?/,B) ) {
+                                                if ( B[3]=="" )	_SHORTCUTRSTRUC[B[2]]=B[1]
+                                                            else	if ( B[5]=="" )	{ _SHORTCUTWSTRUC[_SHORTCUTRSTRUC[B[4]]=B[1]]=B[2]; delete _SHORTCUTDEFAULT[B[1]] }
+                                                                              else	{ _SHORTCUTWSTRUC[_SHORTCUTRSTRUC[B[4]]=B[1]]=B[2]; _SHORTCUTDEFAULT[B[1]]=B[6] } }
+                                    else	_fatal("_shortcut.init: _shortcut_struc: syntax error: `" _SHRTCUTA0[q] "'")
+                  _SHRTCUTA1[""]; delete _SHRTCUTA1[""]
+                  _shortcut_fpath="\\\\localhost\\eGAWK\\LIB\\_shortcut\\_shortcut.exe" }
+#_______________________________________________________________________
+########################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+END{ ###############################################################################
+
+      if ( _gawk_scriptlevel<1 ) {
+            close(_errlog_file)
+            p=_Zimport(_rdfile(_errlog_file),_N())
+            if ( (t=_get_errout(p))!="" )	_expout(t,"/dev/stderr") } }
+#___________________________________________________________________________________
+####################################################################################
+
+#_____________________________________________________________________________
+func	_expout(t,d, a,b) { ####################################################
+      a=BINMODE; b=ORS; BINMODE="rw"; ORS=""
+      print t > (d ? d : (d=_errlog_file)); fflush(d)
+      BINMODE=a; ORS=b }
+#_______________________________________________________________________
+func	_fatal(t,d, A) { #################################################
+      if ( _ERRLOG_FF ) {
+            A["TYPE"]="FATAL"; A["TEXT"]=t
+            _log(A,d) }
+      if ( !d )	exit }
+#_______________________________________________________________________
+func	_error(t,d, A) { #################################################
+      if ( _ERRLOG_EF ) {
+            A["TYPE"]="ERROR"; A["TEXT"]=t
+            _log(A,d) } }
+#_______________________________________________________________________
+func	_warning(t,d, A) { ###############################################
+      if ( _ERRLOG_WF ) {
+            A["TYPE"]="WARNING"; A["TEXT"]=t
+            _log(A,d) } }
+#_______________________________________________________________________
+func	_info(t,d, A) { ##################################################
+      if ( _ERRLOG_IF ) {
+            A["TYPE"]="INFO"; A["TEXT"]=t
+            _log(A,d) } }
+#_______________________________________________________________________
+func	_verb(t,d, A) { ##################################################
+      if ( _ERRLOG_VF ) {
+            A["TYPE"]="VERB"; A["TEXT"]=t
+            _log(A,d) } }
+#_______________________________________________________________________
+func	_trace(t,d, A) { #################################################
+      if ( _ERRLOG_TF ) {
+            A["TYPE"]="TRACE"; A["TEXT"]=t
+            _log(A,d) } }
+#_________________________________________________________________
+func	_log(A,p, a,B) { ###########################################
+      if ( isarray(A) ) {
+            A["TIME"]=_getime(); A["DATE"]=_getdate()
+            if ( p ) {
+                  _tLOG[p=_wLCHLD(p,_N())][""]; delete _tLOG[p][""]
+                  _movarr(_tLOG[p],A)
+                  return p }
+            _expout("_ERRLOG: " _Zexparr(A) "\x0A") }
+      else {
+            B["TEXT"]=A; B["TYPE"]=""
+            return _log(B,p) } }
+#_______________________________________________________________________
+func	_yexport(p) { #####################################################
+      return _tframe("_yexport_i0",p) }
+#_______________________________________________________________________
+func	_yexport_i0(p,p0,p1,p2) {
+      if ( p in _tLOG )	return "_ERRLOG: " _Zexparr(_tLOG[p]) "\x0A"
+      if ( p in _tSTR ) {
+            p=_tSTR[p]; gsub(/\x1B/,"\x1B\x3B",p); gsub(/\x0A/,"\x1B\x3A",p)
+            return p "\x0A" } }
+#_____________________________________________________________________________
+func	_Zimport(t,p,A, c,i,n,B) { ##############################################
+      if ( p ) {
+            c=split(t,B,/\x0A/)
+            for ( i=1; i<=c; i++ ) {
+                  if ( (t=B[i])=="" )	continue
+                  gsub(/\x1B\x3A/,"\x0A",t)
+                  if ( match(t,/^_ERRLOG: /) ) {
+                        _tLOG[n=_wLCHLD(p,_N())][""]; delete _tLOG[n][""]
+                        _Zimparr(_tLOG[n],substr(t,10)) }
+                  else	if ( (t=_pass(_IMPORT,t,p,A))!="" ) {
+                        gsub(/\x1B\x3B/,"\x1B",t); _wLCHLD(p,_N(_tSTR,t)) } }
+            return p }
+      else	_expout(t) }
+#_____________________________________________________________________________
+func	_export_data(t,i, A) { #################################################
+      A["DATA"]=t; A["ID"]=i
+      _expout("_DATA: " _Zexparr(A) "\x0A") }
+#_________________________________________________________________
+BEGIN { _inspass(_IMPORT,"_import_data") }
+
+func	_import_data(t,p,p2, a) {
+      if ( match(t,/^_DATA: /) ) {
+            _tDATA[a=_wLCHLD(p,_N())][""]; delete _tDATA[a][""]
+            _Zimparr(_tDATA[a],substr(t,8))
+                                                _conl("DATA: `" _tDATA[a]["ID"] "':`" _tDATA[a]["DATA"] "'")
+            return "" }
+      return t }
+
+#_____________________________________________________________________________
+func	_get_errout(p) { #######################################################
+      return _tframe("_get_errout_i0",p) }
+#_______________________________________________________________________
+func	_get_errout_i0(p, t,n,a) {
+      return p in _tLOG ? (_get_errout_i1(p) _get_errout_i3(p)) : "" }
+#_________________________________________________________________
+func	_get_errout_i1(p, t,n,a) {
+      if ( p in _tLOG ) {
+            n=""
+            if ( _tLOG[p]["TYPE"] ) {
+                  n=_tLOG[p]["TYPE"] ": " _get_errout_i2(p)
+                  if ( match(_tLOG[p]["TEXT"],/\x1F/) ) {
+                        t=n; gsub(/[^\t]/," ",t)
+                        return _ln(n substr(_tLOG[p]["TEXT"],1,RSTART-1)) _ln(t substr(_tLOG[p]["TEXT"],RSTART+1)) } }
+                  return _ln(n _tLOG[p]["TEXT"]) } }
+#_______________________________________________________________________
+func	_get_errout_i2(p) {
+      return "FILE" in _tLOG[p] ? (_tLOG[p]["FILE"] ("LINE" in _tLOG[p] ? ("(" _tLOG[p]["LINE"] ")") : "") ": ") : "" }
+#_______________________________________________________________________
+func	_get_errout_i3(p, t,ts,cl,cp,cr,a,b) {
+      if ( "LSTR" in _tLOG[p] ) {
+            t=_tLOG[p]["FULLSTR"]; ts=_tLOG[p]["TS"]; cp="^"
+            if ( "CSTR" in _tLOG[p] ) {
+                  cr=_tLOG[p]["CSTR"]
+                  cl=_tLOG[p]["CLSTR"]
+                  if ( "CPSTR" in _tLOG[p] )	cp=_tLOG[p]["CPSTR"] }
+            cr=substr(cr,length(cl)+length(cp)+1)
+            return _ln(_tabtospc(t,ts)) _ln(_getchrln(" ",a=length(_tabtospc(_tLOG[p]["LSTR"],ts))) _getchrln("-",b=length(_tabtospc(cl,ts,a))) _getchrln("^",b=length(_tabtospc(cp,ts,a=a+b))) _getchrln("-",length(_tabtospc(cr,ts,a+b)))) } }
+#_____________________________________________________________________________
+func	_get_logout(p) { #######################################################
+      return _tframe("_get_logout_i0",p) }
+#_______________________________________________________________________
+func	_get_logout_i0(p, t,n,a) {
+      if ( p in _tLOG ) {
+            n=	("DATE" in _tLOG[p] ?	(_tLOG[p]["DATE"] " ") : "")			("TIME" in _tLOG[p] ?	(_tLOG[p]["TIME"] " ") : "")
+            if ( _tLOG[p]["TYPE"] ) {
+                  n=n	_tLOG[p]["TYPE"] ": "				("FILE" in _tLOG[p] ? (					_tLOG[p]["FILE"]					("LINE" in _tLOG[p] ?	("(" _tLOG[p]["LINE"] ")") : "")					": ") : "")
+                  if ( match(_tLOG[p]["TEXT"],/\x1F/) ) {
+                        t=n; gsub(/[^\t]/," ",t)
+                        return _ln(n substr(_tLOG[p]["TEXT"],1,RSTART-1)) _ln(t substr(_tLOG[p]["TEXT"],RSTART+1)) } }
+                  return _ln(n _tLOG[p]["TEXT"]) } }
+#___________________________________________________________________________________
+
+
+####################################################################################
+
+
+#_____________________________________________________________________________
+func	_N(F,v, p) { ###########################################################
+      for ( p in _UIDS ) { delete _UIDS[p]; return _nN_i0(p,F,v) }
+      return _nN_i0(_tgenuid(),F,v) }
+#_______________________________________________________________________
+func	_n(F,v, p) { #####################################################
+      for ( p in _UIDSDEL )	{ delete _UIDSDEL[p]
+                              delete _ptr[p]
+                              delete _tPREV[p];	delete _tPARENT[p];		delete _tNEXT[p]
+                              delete _tFCHLD[p];	delete _tQCHLD[p];		delete _tLCHLD[p]
+                              delete _TMP0[p];	delete _TMP1[p]
+                              delete _tLINK[p];	delete _tCLASS[p]
+                              return _nN_i0(p,F,v) }
+      for ( p in _UIDS )		{ delete _UIDS[p]; return _nN_i0(p,F,v) }
+      return _nN_i0(_tgenuid(),F,v) }
+#_____________________________________________________
+func	_nN_i0(p,F,v) {
+      _[p][""]; delete _[p][""]; _ptr[p][""]; delete _ptr[p][""]
+      _TMP0[p][_ARRLEN]=_TMP1[p][_ARRLEN]=0
+      if ( isarray(F) )			{ delete F[p]
+                                          if ( isarray(v) )			{ F[p][""]; delete F[p][""]; _copyarr(F[p],v) }
+                                          else	if ( !(v==0 && v=="") )		F[p]=v }
+      else	{ if ( !(F==0 && F=="") )	{ if ( isarray(v) )			{ _[p][F][""]; delete _[p][F][""]; _copyarr(_[p][F],v) }
+                                          else	if ( v==0 && v=="" )		_mpu(F,p)
+                                                                        else	_[p][F]=v } }
+      return p }
+#_____________________________________________________
+#	F	v	action
+#-----------------------------------------------------
+#	-	*	no additional action
+#	A	B	delete A[p] and define A[p] as array; copy array B to array A[p]
+#	A	-	delete A[p]
+#	A	"*"	delete A[p]; A[p]="*"
+#	"*"	B	define _[p]["*"] as array; copy array B to array _[p]["*"]
+#	"*"	-	run _mpu program "*" for `p
+#	"*0"	"*1"	_[p]["*0"]="*1"
+#___________________________________________________________
+func	_tgenuid( c)	{ for ( _uidcntr in _UIDARR1 ) { delete _UIDARR1[_uidcntr]; for ( c in _UIDARR0 )	_UIDS[_uidcntr c]; delete _UIDS[_uidcntr c]; return _uidcntr c }
+                        return _fatal("_tUID: Out of UID range") }
+#_____________________________________________________
+func	_tgenuid_init( a,b,A) {
+      _ptrlength		=4
+      a=	"\x92\x93\x94\x95\x96\x97\x98\x99\x9A"							"\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7"								"\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF"		"\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF"		"\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF"
+      split(a,A,""); for (a in A) for (b in A) _UIDARR0[A[a] A[b]] _UIDARR1[A[a] A[b]]; _uidcntr=A[a] A[b] }
+
+#_____________________________________________________________________________
+func	_tdel(p, i)	{ ##########################################################
+      if ( p in _ ) {
+            _texclude(p)
+            for ( i in _ptr[p] )	{ if ( isarray(_ptr[p][i]) )	_tdel_i1(_ptr[p][i])
+                                                            else	if ( (i=_ptr[p][i]) )	_tdel(i) }
+            if ( p in _tFCHLD )	{ i=_tFCHLD[p]; do { i=(i in _tNEXT ? _tNEXT[i] : "") _tdel_i0(i) } while ( i ) }
+            delete _[p]; _UIDSDEL[p] } }
+#_____________________________________________________
+func	_tdel_i0(p, i) {
+      for ( i in _ptr[p] )	{ if ( isarray(_ptr[p][i]) )	_tdel_i1(_ptr[p][i])
+                                                      else	if ( (i=_ptr[p][i]) )	_tdel(i) }
+      if ( p in _tFCHLD )	{ i=_tFCHLD[p]; do { i=(i in _tNEXT ? _tNEXT[i] : "") _tdel_i0(i) } while ( i ) }
+      delete _[p]; _UIDSDEL[p] }
+#_____________________________________________________
+func	_tdel_i1(A, i) {
+      for ( i in A )		{ if ( isarray(A[i]) )		_tdel_i1(A[i])
+                                                      else	if ( (i=A[i]) )	_tdel(i) } }
+#_____________________________________________________________________________
+func	_texclude(p, v,pp) { ###################################################				# TEST!!!
+      if ( p in _ ) {
+            if ( p in _tPARENT ) {
+                  pp=_tPARENT[p]; delete _tPARENT[p]
+                  if ( p in _tPREV ) {
+                        if ( p in _tNEXT )	{ _tPREV[_tNEXT[v]=_tNEXT[p]]=v=_tPREV[p]; delete _tNEXT[p] }
+                                          else	delete _tNEXT[_tLCHLD[pp]=_tPREV[p]]
+                        delete _tPREV[p] }
+                  else {
+                        if ( p in _tNEXT )	{ delete _tPREV[_tFCHLD[pp]=_tNEXT[p]]; delete _tNEXT[p] }
+                                          else	{ delete _tFCHLD[pp]; delete _tLCHLD[pp]; delete _tQCHLD[pp]; return p } }
+                  --_tQCHLD[pp] }
+            else {
+                  if ( p in _tPREV ) {
+                        if ( p in _tNEXT )	{ _tPREV[_tNEXT[v]=_tNEXT[p]]=v=_tPREV[p]; delete _tNEXT[p] }
+                                          else	delete _tNEXT[_tPREV[p]]
+                        delete _tPREV[p] }
+                  else	if ( p in _tNEXT )	{ delete _tPREV[_tNEXT[p]]; delete _tNEXT[p] } }
+            return p } }
+#_______________________________________________________________________
+func	_rFBRO(p) { ######################################################
+      if ( p ) {
+            if ( p in _tPARENT ) {
+                  return _tFCHLD[_tPARENT[p]] }
+            while ( p in _tPREV ) {
+                  p=_tPREV[p] }
+            return p }
+      return p }
+#_________________________________________________________________
+func	_wFBRO(p,v ,a) { ###########################################
+      if ( p ) {
+            if ( v ) {
+                  for ( a=p; a in _tPARENT; ) {
+                        if ( (a=_tPARENT[a])==v ) {
+                              return v } }			######################## v is parentesis of p
+                  if ( p in _tPARENT ) {
+                        p=_tPARENT[p]
+                        if ( v in _tNEXT ) {
+                              if ( v in _tPREV ) {
+                                    _tPREV[_tNEXT[a]=_tNEXT[v]]=a=_tPREV[v]; delete _tPREV[v]
+                                    if ( v in _tPARENT ) {
+                                          if ( p==(a=_tPARENT[v]) ) {
+                                                return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[p]]=v }
+                                          --_tQCHLD[a] } }
+                              else {
+                                    if ( v in _tPARENT ) {
+                                          if ( p==(a=_tPARENT[v]) ) { return v }
+                                          delete _tPREV[_tFCHLD[a]=_tNEXT[v]]; --_tQCHLD[a] }
+                                    else {
+                                          delete _tPREV[_tNEXT[v]] } }
+                              ++_tQCHLD[p]; return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[_tPARENT[v]=p]]=v }
+                        else {
+                              if ( v in _tPREV ) {
+                                    if ( v in _tPARENT ) {
+                                          delete _tNEXT[_tLCHLD[a=_tPARENT[v]]=_tPREV[v]]
+                                          if ( p==a ) {
+                                                delete _tPREV[v]
+                                                return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[p]]=v }
+                                          --_tQCHLD[a] }
+                                    else {
+                                          delete _tNEXT[_tPREV[v]] }
+                                    delete _tPREV[v] }
+                              else {
+                                    if ( v in _tPARENT ) {
+                                          if ( p==(a=_tPARENT[v]) ) { return v }
+                                          delete _tFCHLD[a]; delete _tLCHLD[a]; delete _tQCHLD[a] } }
+                              ++_tQCHLD[p]; return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[_tPARENT[v]=p]]=v } }
+                  else {
+                        while ( p in _tPREV ) {
+                              p=_tPREV[p] }
+                        if ( v in _tPREV ) {
+                              if ( v in _tPARENT ) {
+                                    --_tQCHLD[a=_tPARENT[v]]; delete _tPARENT[v]
+                                    if ( v in _tNEXT ) {
+                                          _tNEXT[_tPREV[a]=_tPREV[v]]=a=_tNEXT[v] }
+                                    else {
+                                          delete _tNEXT[_tLCHLD[a]=_tPREV[v]] } }
+                              else {
+                                    if ( v in _tNEXT ) {
+                                          _tNEXT[_tPREV[a]=_tPREV[v]]=a=_tNEXT[v] }
+                                    else {
+                                          delete _tNEXT[_tPREV[v]] } }
+                              delete _tPREV[v] }
+                        else {
+                              if ( p==v ) { return v }
+                              if ( v in _tPARENT ) {
+                                    if ( v in _tNEXT ) {
+                                          delete _tPREV[_tFCHLD[a=_tPARENT[v]]=_tNEXT[v]]; --_tQCHLD[a] }
+                                    else {
+                                          delete _tLCHLD[a=_tPARENT[v]]; delete _tFCHLD[a]; delete _tQCHLD[a] }
+                                    delete _tPARENT[v] }
+                              else {
+                                    if ( v in _tNEXT ) {
+                                          delete _tPREV[_tNEXT[v]] } } }
+                        return _tPREV[_tNEXT[v]=p]=v } }
+            else {
+                  if ( v==0 ) {
+                        return v }					######################## p=ptr, v=0
+                  return v } }					######################## p=ptr, v=""
+      else {
+            if ( p==0 )		return v				######################## p=0
+            if ( v )		return _texclude(v)		######################## p="", v=ptr	- exclude v
+            return v } }						######################## p=""
+#_______________________________________________________________________
+func	_rPREV(p) { ######################################################
+      if ( (p) && (p in _tPREV) ) {
+            return _tPREV[p] }
+      return "" }
+#_________________________________________________________________
+func	_wPREV(p,v, a,b) { #########################################
+      if ( p ) {
+            if ( v ) {
+                  if ( p==v ) { return v }			######################## p=v=ptr
+                  for ( a=p; a in _tPARENT; ) {
+                        if ( (a=_tPARENT[a])==v ) {
+                              return v } }			######################## v is parentesis of p
+                  if ( v in _tNEXT ) {
+                        if ( p==(a=_tNEXT[v]) ) { return v }
+                        if ( v in _tPREV ) {
+                              _tNEXT[_tPREV[a]=_tPREV[v]]=a
+                              if ( v in _tPARENT ) {
+                                    --_tQCHLD[_tPARENT[v]] } }
+                        else {
+                              delete _tPREV[a]
+                              if ( v in _tPARENT ) {
+                                    _tFCHLD[b=_tPARENT[v]]=a
+                                    --_tQCHLD[b] } } }
+                  else {
+                        if ( v in _tPREV ) {
+                              if ( v in _tPARENT ) {
+                                    delete _tNEXT[_tLCHLD[a=_tPARENT[v]]=_tPREV[v]]
+                                    --_tQCHLD[a] }
+                              else {
+                                    delete _tNEXT[_tPREV[v]] } }
+                        else {
+                              if ( v in _tPARENT ) {
+                                    delete _tLCHLD[a=_tPARENT[v]]; delete _tFCHLD[a]; delete _tQCHLD[a] } } }
+                  if ( p in _tPREV ) {
+                        _tNEXT[_tPREV[v]=_tPREV[p]]=v
+                        if ( p in _tPARENT ) {
+                              ++_tQCHLD[_tPARENT[v]=_tPARENT[p]] }
+                        else {
+                              delete _tPARENT[v] } }
+                  else {
+                        delete _tPREV[v]
+                        if ( p in _tPARENT ) {
+                              ++_tQCHLD[_tPARENT[_tFCHLD[a]=v]=a=_tPARENT[p]] }
+                        else {
+                              delete _tPARENT[v] } }
+                  return _tPREV[_tNEXT[v]=p]=v }
+            else {
+                  if ( v==0 ) {
+                        return v }					######################## p=ptr, v=0
+                  return v } }					######################## p=ptr, v=""
+      else {
+            if ( p==0 )		return v				######################## p=0
+            if ( v )		return _texclude(v)		######################## p="", v=ptr	- exclude v
+            return v } }						######################## p=""
+#_______________________________________________________________________
+func	_rPARENT(p) { ####################################################
+      if ( (p) && (p in _tPARENT) ) {
+            return _tPARENT[p] }
+      return "" }
+#_________________________________________________________________
+func	_wPARENT(p,v) { ############################################
+      return v }
+#_______________________________________________________________________
+func	_rFCHLD(p) { #####################################################
+      if ( (p) && (p in _tFCHLD) ) {
+            return _tFCHLD[p] }
+      return "" }
+#_________________________________________________________________
+func	_wFCHLD(p,v, a) { ##########################################
+      if ( p ) {
+            if ( v ) {
+                  if ( p==v ) { return v }			######################## p=v=ptr
+                  for ( a=p; a in _tPARENT; ) {
+                        if ( (a=_tPARENT[a])==v ) {
+                              return v } }			######################## v is parentesis of p
+                  if ( v in _tNEXT ) {
+                        if ( v in _tPREV ) {
+                              _tPREV[_tNEXT[a]=_tNEXT[v]]=a=_tPREV[v]; delete _tPREV[v]
+                              if ( v in _tPARENT ) {
+                                    if ( p==(a=_tPARENT[v]) ) {
+                                          return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[p]]=v }
+                                    --_tQCHLD[a] } }
+                        else {
+                              if ( v in _tPARENT ) {
+                                    if ( p==(a=_tPARENT[v]) ) { return v }
+                                    delete _tPREV[_tFCHLD[a]=_tNEXT[v]]; --_tQCHLD[a] }
+                              else {
+                                    delete _tPREV[_tNEXT[v]] } }
+                        if ( p in _tFCHLD ) {
+                              ++_tQCHLD[p]; return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[_tPARENT[v]=p]]=v }
+                        delete _tNEXT[v] }
+                  else {
+                        if ( v in _tPREV ) {
+                              if ( v in _tPARENT ) {
+                                    delete _tNEXT[_tLCHLD[a=_tPARENT[v]]=_tPREV[v]]
+                                    if ( p==a ) {
+                                          delete _tPREV[v]
+                                          return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[p]]=v }
+                                    --_tQCHLD[a] }
+                              else {
+                                    delete _tNEXT[_tPREV[v]] }
+                              delete _tPREV[v] }
+                        else {
+                              if ( v in _tPARENT ) {
+                                    if ( p==(a=_tPARENT[v]) ) { return v }
+                                    delete _tFCHLD[a]; delete _tLCHLD[a]; delete _tQCHLD[a] } }
+                        if ( p in _tFCHLD ) {
+                              ++_tQCHLD[p]; return _tFCHLD[p]=_tPREV[_tNEXT[v]=_tFCHLD[_tPARENT[v]=p]]=v } }
+                  _tQCHLD[p]=1; return _tFCHLD[_tPARENT[v]=p]=_tLCHLD[p]=v }
+            else {
+                  if ( v==0 ) {
+                        if ( p in _tFCHLD ) {			######################## p=ptr, v=0 > delete all chld
+                              v=_tFCHLD[p]
+                              delete _tFCHLD[p]; delete _tLCHLD[p]; delete _tQCHLD[p]
+                              do{
+                                    delete _tPARENT[v] } while ( (v in _tNEXT) && (v=_tNEXT[v]) ) } }
+                  return v } }					######################## p=ptr, v="" > ignore action
+      else {
+            if ( p==0 )		return v				######################## p=0
+            return v } }						######################## p=""
+#_______________________________________________________________________
+func	_rLCHLD(p) { #####################################################
+      if ( (p) && (p in _tLCHLD) ) {
+            return _tLCHLD[p] }
+      return "" }
+#_________________________________________________________________
+func	_wLCHLD(p,v, a) { ##########################################
+      if ( p ) {
+            if ( v ) {
+                  if ( p==v ) { return v }			######################## p=v=ptr
+                  for ( a=p; a in _tPARENT; ) {
+                        if ( (a=_tPARENT[a])==v ) {
+                              return v } }			######################## v is parentesis of p
+                  if ( v in _tPREV ) {
+                        if ( v in _tNEXT ) {
+                              _tNEXT[_tPREV[a]=_tPREV[v]]=a=_tNEXT[v]; delete _tNEXT[v]
+                              if ( v in _tPARENT ) {
+                                    if ( p==(a=_tPARENT[v]) ) {
+                                          return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[p]]=v }
+                                    --_tQCHLD[a] } }
+                        else {
+                              if ( v in _tPARENT ) {
+                                    if ( p==(a=_tPARENT[v]) ) { return v }
+                                    delete _tNEXT[_tLCHLD[a]=_tPREV[v]]; --_tQCHLD[a] }
+                              else {
+                                    delete _tNEXT[_tPREV[v]] } }
+                        if ( p in _tLCHLD ) {
+                              ++_tQCHLD[p]; return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[_tPARENT[v]=p]]=v }
+                        delete _tPREV[v] }
+                  else {
+                        if ( v in _tNEXT ) {
+                              if ( v in _tPARENT ) {
+                                    delete _tPREV[_tFCHLD[a=_tPARENT[v]]=_tNEXT[v]]
+                                    if ( p==a ) {
+                                          delete _tNEXT[v]
+                                          return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[p]]=v }
+                                    --_tQCHLD[a] }
+                              else {
+                                    delete _tPREV[_tNEXT[v]] }
+                              delete _tNEXT[v] }
+                        else {
+                              if ( v in _tPARENT ) {
+                                    if ( p==(a=_tPARENT[v]) ) { return v }
+                                    delete _tLCHLD[a]; delete _tFCHLD[a]; delete _tQCHLD[a] } }
+                        if ( p in _tLCHLD ) {
+                              ++_tQCHLD[p]; return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[_tPARENT[v]=p]]=v } }
+                  _tQCHLD[p]=1; return _tLCHLD[_tPARENT[v]=p]=_tFCHLD[p]=v }
+            else {
+                  if ( v==0 ) {
+                        if ( p in _tFCHLD ) {				######################## p=ptr, v=0 > delete all chld
+                              v=_tFCHLD[p]
+                              delete _tFCHLD[p]; delete _tLCHLD[p]; delete _tQCHLD[p]
+                              do{
+                                    delete _tPARENT[v] } while ( (v in _tNEXT) && (v=_tNEXT[v]) ) } }
+                  return v } }						######################## p=ptr, v="" > ignore action
+      else {
+            if ( p==0 )		return v				######################## p=0
+            return v } }						######################## p=""
+#_______________________________________________________________________
+func	_rQCHLD(p) { #####################################################
+      if ( (p) && (p in _tQCHLD) ) {
+            return _tQCHLD[p] }
+      return "" }
+#_________________________________________________________________
+func	_wQCHLD(p,v) { #############################################
+      if ( p ) {
+            if ( v ) { }						######################## p=ptr, v=ptr
+            else {
+                  if ( v==0 ) {
+                        if ( p in _tFCHLD ) {			######################## p=ptr, v=0 > delete all chld
+                              v=_tFCHLD[p]
+                              delete _tFCHLD[p]; delete _tLCHLD[p]; delete _tQCHLD[p]
+                              do{
+                                    delete _tPARENT[v] } while ( (v in _tNEXT) && (v=_tNEXT[v]) ) } }
+                  return v } }					######################## p=ptr, v="" > ignore action
+      else {
+            if ( p==0 ) {
+                  return v }						######################## p=0
+            return v } }						######################## p=""
+#_______________________________________________________________________
+func	_rNEXT(p) { ######################################################
+      if ( (p) && (p in _tNEXT) ) {
+            return _tNEXT[p] }
+      return "" }
+#_________________________________________________________________
+func	_wNEXT(p,v, a,b) { #########################################
+      if ( p ) {
+            if ( v ) {
+                  if ( p==v ) { return v }			######################## p=v=ptr
+                  for ( a=p; a in _tPARENT; ) {
+                        if ( (a=_tPARENT[a])==v ) {
+                              return v } }			######################## v is parentesis of p
+                  if ( v in _tPREV ) {
+                        if ( p==(a=_tPREV[v]) ) { return v }
+                        if ( v in _tNEXT ) {
+                              _tPREV[_tNEXT[a]=_tNEXT[v]]=a
+                              if ( v in _tPARENT ) {
+                                    --_tQCHLD[_tPARENT[v]] } }
+                        else {
+                              delete _tNEXT[a]
+                              if ( v in _tPARENT ) {
+                                    _tLCHLD[b=_tPARENT[v]]=a
+                                    --_tQCHLD[b] } } }
+                  else {
+                        if ( v in _tNEXT ) {
+                              if ( v in _tPARENT ) {
+                                    delete _tPREV[_tFCHLD[a=_tPARENT[v]]=_tNEXT[v]]
+                                    --_tQCHLD[a] }
+                              else {
+                                    delete _tPREV[_tNEXT[v]] } }
+                        else {
+                              if ( v in _tPARENT ) {
+                                    delete _tFCHLD[a=_tPARENT[v]]; delete _tLCHLD[a]; delete _tQCHLD[a] } } }
+                  if ( p in _tNEXT ) {
+                        _tPREV[_tNEXT[v]=_tNEXT[p]]=v
+                        if ( p in _tPARENT ) {
+                              ++_tQCHLD[_tPARENT[v]=_tPARENT[p]] }
+                        else {
+                              delete _tPARENT[v] } }
+                  else {
+                        delete _tNEXT[v]
+                        if ( p in _tPARENT ) {
+                              ++_tQCHLD[_tPARENT[_tLCHLD[a]=v]=a=_tPARENT[p]] }
+                        else {
+                              delete _tPARENT[v] } }
+                  return _tNEXT[_tPREV[v]=p]=v }
+            else {
+                  if ( v==0 ) {
+                        return v }					######################## p=ptr, v=0
+                  return v } }					######################## p=ptr, v=""
+      else {
+            if ( p==0 )		return v				######################## p=0
+            if ( v )		return _texclude(v)		######################## p="", v=ptr	- exclude v
+            return v } }						######################## p="", !v
+#_______________________________________________________________________
+func	_rLBRO(p) { ######################################################
+      if ( p ) {
+            if ( p in _tPARENT ) {
+                  return _tLCHLD[_tPARENT[p]] }
+            while ( p in _tNEXT ) {
+                  p=_tNEXT[p] }
+            return p }
+      return p }
+#_________________________________________________________________
+func	_wLBRO(p,v ,a) { ###########################################
+      if ( p ) {
+            if ( v ) {
+                  for ( a=p; a in _tPARENT; ) {
+                        if ( (a=_tPARENT[a])==v ) {
+                              return v } }			######################## v is parentesis of p
+                  if ( p in _tPARENT ) {
+                        p=_tPARENT[p]
+                        if ( v in _tPREV ) {
+                              if ( v in _tNEXT ) {
+                                    _tNEXT[_tPREV[a]=_tPREV[v]]=a=_tNEXT[v]; delete _tNEXT[v]
+                                    if ( v in _tPARENT ) {
+                                          if ( p==(a=_tPARENT[v]) ) {
+                                                return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[p]]=v }
+                                          --_tQCHLD[a] } }
+                              else {
+                                    if ( v in _tPARENT ) {
+                                          if ( p==(a=_tPARENT[v]) ) { return v }
+                                          delete _tNEXT[_tLCHLD[a]=_tPREV[v]]; --_tQCHLD[a] }
+                                    else {
+                                          delete _tNEXT[_tPREV[v]] } }
+                              ++_tQCHLD[p]; return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[_tPARENT[v]=p]]=v }
+                        else {
+                              if ( v in _tNEXT ) {
+                                    if ( v in _tPARENT ) {
+                                          delete _tPREV[_tFCHLD[a=_tPARENT[v]]=_tNEXT[v]]
+                                          if ( p==a ) {
+                                                delete _tNEXT[v]
+                                                return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[p]]=v }
+                                          --_tQCHLD[a] }
+                                    else {
+                                          delete _tPREV[_tNEXT[v]] }
+                                    delete _tNEXT[v] }
+                              else {
+                                    if ( v in _tPARENT ) {
+                                          if ( p==(a=_tPARENT[v]) ) { return v }
+                                          delete _tLCHLD[a]; delete _tFCHLD[a]; delete _tQCHLD[a] } }
+                              ++_tQCHLD[p]; return _tLCHLD[p]=_tNEXT[_tPREV[v]=_tLCHLD[_tPARENT[v]=p]]=v } }
+                  else {
+                        while ( p in _tNEXT ) {
+                              p=_tNEXT[p] }
+                        if ( v in _tNEXT ) {
+                              if ( v in _tPARENT ) {
+                                    --_tQCHLD[a=_tPARENT[v]]; delete _tPARENT[v]
+                                    if ( v in _tPREV ) {
+                                          _tPREV[_tNEXT[a]=_tNEXT[v]]=a=_tPREV[v] }
+                                    else {
+                                          delete _tPREV[_tFCHLD[a]=_tNEXT[v]] } }
+                              else {
+                                    if ( v in _tPREV ) {
+                                          _tPREV[_tNEXT[a]=_tNEXT[v]]=a=_tPREV[v] }
+                                    else {
+                                          delete _tPREV[_tNEXT[v]] } }
+                              delete _tNEXT[v] }
+                        else {
+                              if ( p==v ) { return v }
+                              if ( v in _tPARENT ) {
+                                    if ( v in _tPREV ) {
+                                          delete _tNEXT[_tLCHLD[a=_tPARENT[v]]=_tPREV[v]]; --_tQCHLD[a] }
+                                    else {
+                                          delete _tFCHLD[a=_tPARENT[v]]; delete _tLCHLD[a]; delete _tQCHLD[a] }
+                                    delete _tPARENT[v] }
+                              else {
+                                    if ( v in _tPREV ) {
+                                          delete _tNEXT[_tPREV[v]] } } }
+                        return _tNEXT[_tPREV[v]=p]=v } }
+            else {
+                  if ( v==0 ) {
+                        return v }					######################## p=ptr, v=0
+                  return v } }					######################## p=ptr, v=""
+      else {
+            if ( p==0 )		return v				######################## p=0
+            if ( v )		return _texclude(v)		######################## p="", v=ptr	- exclude v
+            return v } }						######################## p=""
+#_______________________________________________________________________
+func	_rQBRO(p, c,p1) { ################################################
+      if ( p ) {
+            if ( p in _tPARENT ) {
+                  return _tQCHLD[_tPARENT[p]] }
+            c=1; p1=p
+            while ( p1 in _tPREV ) {
+                  c++; p1=_tPREV[p1] }
+            while ( p in _tNEXT ) {
+                  c++; p=_tNEXT[p] }
+            return c }
+      return p }
+#_________________________________________________________________
+func	_wQBRO(p,v) { ##############################################
+      return v }
+#_______________________________________________________________________
+func	_rLINK(p) { ######################################################
+      return p in _tLINK ? _tLINK[p] : "" }
+#_________________________________________________________________
+func	_wLINK(p,v) { ##############################################
+      return _tLINK[p]=v }
+#_____________________________________________________________________________
+func	_tpush(p,aA, a) { ######################################################
+      if ( isarray(aA) ) {
+            delete _tSTACK[p][a=++_tSTACK[p][0]]; _tSTACK[p][a][""]; delete _tSTACK[p][a][""]
+            _movarr(_tSTACK[p][a],aA); return }
+      delete _tSTACK[p][a=++_tSTACK[p][0]]; return _tSTACK[p][a]=aA }
+#_________________________________________________________________
+func	_tpop(p,aA, a) { ###########################################
+      if ( (a=_tSTACK[p][0])>0 ) {
+            _tSTACK[p][0]--
+            if ( isarray(_tSTACK[p][a]) ) {
+                  delete aA; _movarr(aA,_tSTACK[p][a]); return }
+            return _tSTACK[p][a] }
+      _fatal("^" p ": Out of tSTACK") }
+#_________________________________________________________________
+func	_tsetsp(p,v) { #############################################
+      return _tSTACK[p][0]=v }
+#_________________________________________________________________
+func	_tgetsp(p) { ###############################################
+      return _tSTACK[p][0] }
+#_______________________________________________________________________
+########################################################################
+
+
+func	_W(p,A,v) {
+      if ( isarray(v) ) {
+            if ( p ) {
+                  delete A[p]; A[p][""]; delete A[p][""]
+                  _movarr(A[p],v) }
+            return p }
+      if ( p ) {
+            delete A[p]; return A[p]=v }
+      return v }
+
+
+
+# _tDLINK progressive development: concrete _tDLINK function\processing algo; all frame's families support
+#_____________________________________________________________________________
+func	_tframe(fF,p,p0,p1,p2) { ###############################################
+      delete _t_ENDF[++_t_ENDF[0]]
+      p=_isptr(p) ? isarray(fF) ? _tframe_i1(fF,p,p0,p1,p2) : _tframe_i0(fF,p,p0,p1,p2) : ""
+      --_t_ENDF[0]
+      return p }
+#___________________________________________________________
+func	_tframe_i0(f,p,p0,p1,p2, a) {
+      while ( p in _tLINK )	p=_tLINK[p]
+      return p in _tFCHLD ?	_tmframe_i0(f,_tFCHLD[p],p0,p1,p2) :					(p in _tDLINK ? @f(_tDLINK[p],p0,p1,p2) : @f(p,p0,p1,p2)) }
+#___________________________________________________________
+func	_tframe_i1(F,p,p0,p1,p2, a) {
+      while ( p in _tLINK )	p=_tLINK[p]
+      return p in _tFCHLD ?	("." in F ? _th1(a=F["."],@a(p,p0,p1,p2)) : "") _tmframe_i1(F,_tFCHLD[p],p0,p1,p2)				:	(">" in F ? _th1(a=F[">"],p in _tDLINK ? @a(_tDLINK[p],p0,p1,p2) : @a(p,p0,p1,p2)) : "") }
+#_________________________________________________________________
+func	_tmframe(f,p,p0,p1,p2) { ###################################
+      delete _t_ENDF[++_t_ENDF[0]]
+      f=p ? _tmframe_i0(f,p,p0,p1,p2) : ""
+      --_t_ENDF[0]
+      return f }
+#___________________________________________________________
+func	_tmframe_i0(f,p,p0,p1,p2, t) {
+      while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+            t=t _tframe_i0(f,p,p0,p1,p2, p=p in _tNEXT ? _tNEXT[p] : "") }
+      return t }
+#___________________________________________________________
+func	_tmframe_i1(F,p,p0,p1,p2, t) {
+      while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+            t=t _tframe_i1(F,p,p0,p1,p2, p=p in _tNEXT ? _tNEXT[p] : "") }
+      return t }
+#_________________________________________________________________
+func	_trunframe(f,p,p0,p1,p2) { #################################
+      return _tframe(f ? f : "_trunframe_i0",p,p0,p1,p2) }
+#_________________________________________________________________
+func	_trunframe_i0(p,p0,p1,p2, f) {
+      if ( p in _tFN ) {
+            f=_tFN[p]
+            return @f(p,p0,p1,p2) } }
+#_____________________________________________________________________________
+func	_tbframe(f,p,p0,p1) { ##################################################
+      delete _t_ENDF[++_t_ENDF[0]]
+      f=p ? _tbframe_i0(f,p,p0,p1) : ""
+      --_t_ENDF[0]
+      return f }
+#___________________________________________________________
+func	_tbframe_i0(f,p,p0,p1, a) {
+      while ( p in _tLINK )	p=_tLINK[p]
+      return p in _tLCHLD ? _tmbframe(f,_tLCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func	_tmbframe(f,p,p0,p1, t) { ##################################
+      while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+            t=t _tbframe_i0(f,p,p0,p1, p=p in _tPREV ? _tPREV[p] : "") }
+      return t }
+#_________________________________________________________________
+func	_tbrunframe(f,p,p0,p1) { ###################################
+      return _tbframe(f ? f : "_trunframe_i0",p,p0,p1) }
+#_______________________________________________________________________
+func	_tframex(f,p,p0,p1) { ############################################
+      delete _t_ENDF[++_t_ENDF[0]]
+      f=p ? _tframex_i0(f,p,p0,p1) : ""
+      --_t_ENDF[0]
+      return f }
+#___________________________________________________________
+func	_tframex_i0(f,p,p0,p1) {
+      while ( p in _tLINK ) p=_tLINK[p]
+      return p in _tFCHLD ? _tmframex(f,_tFCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func	_tmframex(f,p,p0,p1, t) { ##################################
+      while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+            t=t _tframex_i0(f,p,p0,p1); p=p in _tNEXT ? _tNEXT[p] : "" }
+      return t }
+#_________________________________________________________________
+func	_trunframex(f,p,p0,p1) { ###################################
+      return _tframex(f ? f : "_trunframe_i0",p,p0,p1) }
+#_______________________________________________________________________
+func	_tbframex(f,p,p0,p1) { ###########################################
+      delete _t_ENDF[++_t_ENDF[0]]
+      f=p ? _tbframex_i0(f,p,p0,p1) : ""
+      --_t_ENDF[0]
+      return f }
+#___________________________________________________________
+func	_tbframex_i0(f,p,p0,p1) {
+      while ( p in _tLINK ) p=_tLINK[p]
+      return p in _tLCHLD ? _tmbframex(f,_tLCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func	_tmbframex(f,p,p0,p1, t) { #################################
+      while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+            t=t _tbframex_i0(f,p,p0,p1); p=p in _tPREV ? _tPREV[p] : "" }
+      return t }
+#_________________________________________________________________
+func	_tbrunframex(f,p,p0,p1) { ##################################
+      return _tbframex(f ? f : "_trunframe_i0",p,p0,p1) }
+#_____________________________________________________________________________
+func	_tpass(f,p,p0,p1) { ####################################################
+      delete _t_ENDF[++_t_ENDF[0]]
+      f=p ? _tpass_i0(f,p,p0,p1) : ""
+      --_t_ENDF[0]
+      return f }
+#___________________________________________________________
+func	_tpass_i0(f,p,p0,p1, a) {
+      while ( p in _tLINK ) p=_tLINK[p]
+      return p in _tFCHLD ? _tmpass(f,_tFCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func	_tmpass(f,p,p0,p1) { #######################################
+      while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+            p0=_tbpass_i0(f,p,p0,p1, p=p in _tNEXT ? _tNEXT[p] : "") }
+      return p0 }
+#_________________________________________________________________
+func	_trunpass(f,p,p0,p1) { #####################################
+      return _tpass(f ? f : "_trunframe_i0",p,p0,p1) }
+#_____________________________________________________________________________
+func	_tpassx(f,p,p0,p1) { ###################################################
+      delete _t_ENDF[++_t_ENDF[0]]
+      f=p ? _tpassx_i0(f,p,p0,p1) : ""
+      --_t_ENDF[0]
+      return f }
+#___________________________________________________________
+func	_tpassx_i0(f,p,p0,p1) {
+      while ( p in _tLINK ) p=_tLINK[p]
+      return p in _tFCHLD ? _tmpassx(f,_tFCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func	_tmpassx(f,p,p0,p1) { ######################################
+      while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+            p0=_tbpassx_i0(f,p,p0,p1); p=p in _tNEXT ? _tNEXT[p] : "" }
+      return p0 }
+#_________________________________________________________________
+func	_trunpassx(f,p,p0,p1) { ####################################
+      return _tpassx(f ? f : "_trunframe_i0",p,p0,p1) }
+#_____________________________________________________________________________
+func	_tbpass(f,p,p0,p1) { ###################################################
+      delete _t_ENDF[++_t_ENDF[0]]
+      f=p ? _tbpass_i0(f,p,p0,p1) : ""
+      --_t_ENDF[0]
+      return f }
+#___________________________________________________________
+func	_tbpass_i0(f,p,p0,p1, a) {
+      while ( p in _tLINK ) p=_tLINK[p]
+      return p in _tLCHLD ? _tmbpass(f,_tLCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func	_tmbpass(f,p,p0,p1) { ######################################
+      while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+            p0=_tbpass_i0(f,p,p0,p1, p=p in _tPREV ? _tPREV[p] : "") }
+      return p0 }
+#_________________________________________________________________
+func	_tbrunpass(f,p,p0,p1) { ####################################
+      return _tbpass(f ? f : "_trunframe_i0",p,p0,p1) }
+#_____________________________________________________________________________
+func	_tbpassx(f,p,p0,p1) { ##################################################
+      delete _t_ENDF[++_t_ENDF[0]]
+      f=p ? _tbpassx_i0(f,p,p0,p1) : ""
+      --_t_ENDF[0]
+      return f }
+#___________________________________________________________
+func	_tbpassx_i0(f,p,p0,p1) {
+      while ( p in _tLINK ) p=_tLINK[p]
+      return p in _tLCHLD ? _tmbpassx(f,_tLCHLD[p],p0,p1) : @f(p,p0,p1) }
+#_________________________________________________________________
+func	_tmbpassx(f,p,p0,p1) { #####################################
+      while ( (p) && (!(_t_ENDF[0] in _t_ENDF)) ) {
+            p0=_tbpassx_i0(f,p,p0,p1); p=p in _tPREV ? _tPREV[p] : "" }
+      return p0 }
+#_________________________________________________________________
+func	_tbrunpassx(f,p,p0,p1) { ###################################
+      return _tbpassx(f ? f : "_trunframe_i0",p,p0,p1) }
+#_______________________________________________________________________
+func	_tend(a,b) { #####################################################
+      if ( b=="" )	return _t_ENDF[_t_ENDF[0]]=a
+                  else	return _t_ENDF[_t_ENDF[0]+a]=b }
+#_________________________________________________________________
+func	_tifend(l) { ###############################################
+      return (_t_ENDF[0]+l) in _t_ENDF ? (_t_ENDF[_t_ENDF[0]+l] ? _t_ENDF[_t_ENDF[0]+l] : 1) : "" }
+
+
+#_____________________________________________________________________________
+func	_tdelete(p, v) { #######################################################				# REMAKE EXCLUDE
+      if ( p )	_wLCHLD(_tDELPTR,p)
+      return v }
+
+
+#_____________________________________________________________________________
+func	_tbrochld(p, f,pp) { ###################################################				# TEST!!!
+      if ( p ) {
+            if ( p in _tFCHLD ) {
+                  f=_tFCHLD[p]; delete _tFCHLD[p]; delete _tLCHLD[p]
+                  if ( p in _tPARENT ) {
+                        pp=_tPARENT[p]; delete _tPARENT[p]
+                        if ( p in _tPREV ) {
+                              _tNEXT[_tPREV[f]=_tPREV[p]]=f; delete _tPREV[p] }
+                        else {
+                              _tFCHLD[pp]=f }
+                        for ( ; f in _tNEXT; f=_tNEXT[f] )	_tPARENT[f]=pp
+                        _tPARENT[f]=pp
+                        if ( p in _tNEXT ) {
+                              _tPREV[_tNEXT[f]=_tNEXT[p]]=f; delete _tNEXT[p] }
+                        else {
+                              _tLCHLD[pp]=f }
+                        _tQCHLD[pp]=_tQCHLD[pp]+_tQCHLD[p]-1
+                        delete _tQCHLD[p]
+                        return f }
+                  else {
+                        delete _tQCHLD[p]
+                        if ( p in _tPREV ) {
+                              _tNEXT[_tPREV[f]=_tPREV[p]]=f; delete _tPREV[p] }
+                        for ( ; f in _tNEXT; f=_tNEXT[f] )	delete _tPARENT[f]
+                        delete _tPARENT[f]
+                        if ( p in _tNEXT ) {
+                              _tPREV[_tNEXT[f]=_tNEXT[p]]=f; delete _tNEXT[p] }
+                        return f } }
+            else {
+                  if ( p in _tPARENT ) {
+                        pp=_tPARENT[p]; delete _tPARENT[p]
+                        if ( p in _tPREV ) {
+                              if ( p in _tNEXT ) {
+                                    _tNEXT[_tPREV[f]=_tPREV[p]]=f=_tNEXT[p]; delete _tNEXT[p] }
+                              else {
+                                    delete _tNEXT[_tLCHLD[pp]=_tPREV[p]] }
+                              delete _tPREV[p]; _tQCHLD[pp]-- }
+                        else {
+                              if ( p in _tNEXT ) {
+                                    delete _tPREV[_tFCHLD[pp]=_tNEXT[p]]; delete _tNEXT[p]; _tQCHLD[pp]-- }
+                              else {
+                                    delete _tFCHLD[pp]; delete _tLCHLD[pp]; delete _tQCHLD[pp] } } }
+                  else {
+                        if ( p in _tPREV ) {
+                              if ( p in _tNEXT ) {
+                                    _tNEXT[_tPREV[f]=_tPREV[p]]=f=_tNEXT[p]; delete _tNEXT[p] }
+                              else {
+                                    delete _tNEXT[_tPREV[p]] }
+                              delete _tPREV[p] }
+                        else {
+                              if ( p in _tNEXT ) {
+                                    delete _tPREV[_tNEXT[p]]; delete _tNEXT[p] } } } } }
+      return p }
+
+# 	test _tbrochld fn; develope tOBJ r\w func specification for brochld func
+
+#_________________________________________________________________
+func	_tinit_i0(D,S, i) {
+      for ( i in S ) {
+            if ( isarray(S[i]) ) {
+                  if ( !isarray(D[i][""]) ) {
+                        delete D[i]; D[i][""]; delete D[i][""] }
+                  _N_i0(D[i],S[i]) }
+            else {
+                  if ( isarray(D[i]) )	delete D[i]
+                  D[i]=S[i] } } }
+#_______________________________________________________________________
+func	W(p,p0,p1) { #####################################################
+      if ( isarray(p0) ) {
+            delete p0[p]
+            if ( isarray(p1) ) {
+                  for ( i in p1 ) {
+                        if ( isarray(p1[i]) ) {
+                              p0[p][i][""]; delete p0[p][i][""]; _N_i0(p0[p][i],p1[i]) }
+                        else	p0[p][i]=p1[i] }
+                  return p }
+            return p0[p]=p1 }
+      delete _[p][p0]
+      if ( isarray(p1) ) {
+            for ( i in p1 ) {
+                  if ( isarray(p1[i]) ) {
+                        _[p][p0][i][""]; delete _[p][p0][i][""]; _N_i0(_[p][p0][i],p1[i]) }
+                  else	_[p][p0][i]=p1[i] }
+            return p }
+      return _[p][p0]=p1 }
+
+
+
+
+#___________________________________________________________________________________
+# EMMULATED FUNCTIONAL FIELDS ######################################################
+
+#_____________________________________________________________________________
+func	_rSQFIRST(g,p,A) { #####################################################
+      if ( isarray(A) )	return _rSQFIRSTA(g,p,A)
+      _SQTOPTR[g]=p; _SQSTACK[g][0]=0
+      return _rsqgetptr(g,p) }
+#_________________________________________________________________
+func	_rSQFIRSTA(g,p,A) { ########################################
+      _SQTOPTR[g]=p; _SQSTACK[g][0]=0
+      if ( (p=_rsqgetptr(g,p)) in A )		return p
+      return _rSQNEXTA(g,p,A) }
+#_______________________________________________________________________
+func	_rSQNEXT(g,p,A) { ################################################
+      if ( isarray(A) )	return _rSQNEXTA(g,p,A)
+      return _rsqnext_i0(g,p) }
+#___________________________________________________________
+func	_rsqnext_i0(g,p) {
+      if ( p==_SQTOPTR[g] ) {
+            if ( _SQSTACK[g][0]>0 ) {
+                  _SQTOPTR[g]=_SQSTACK[g][_SQSTACK[g][0]--]
+                  return _rsqnext_i0(g,_SQSTACK[g][_SQSTACK[g][0]--]) }
+            return }
+      if ( p in _tNEXT )		return _rsqgetptr(g,_tNEXT[p])
+      return _rsqnext_i0(g,_tPARENT[p]) }
+#_________________________________________________________________
+func	_rSQNEXTA(g,p,A) { #########################################
+      if ( p==_SQTOPTR[g] ) {
+            if ( _SQSTACK[g][0]>0 ) {
+                  _SQTOPTR[g]=_SQSTACK[g][_SQSTACK[g][0]--]
+                  return _rSQNEXTA(g,_SQSTACK[g][_SQSTACK[g][0]--],A) }
+            return }
+      while ( p in _tNEXT ) {
+            if ( (p=_rsqgetptr(g,_tNEXT[p])) in A )		return p }
+      return p in _tPARENT ? _rSQNEXTA(g,_tPARENT[p],A) : "" }
+#_________________________________________________________________
+func	_rsqgetptr(g,p,A) {
+            if ( p in _tLINK ) {
+                  _SQSTACK[g][++_SQSTACK[g][0]]=p
+                  _SQSTACK[g][++_SQSTACK[g][0]]=_SQTOPTR[g]
+                  while ( (p=_tLINK[p]) in _tLINK ) { _con(".") }
+                  _SQTOPTR[g]=p }
+            if ( p in _tFCHLD )		return _rsqgetptr(g,_tFCHLD[p])
+            return p }
+#___________________________________________________________________________________
+####################################################################################
+
+
+#___________________________________________________________________________________
+# OTHER tFUNCTIONs #################################################################
+
+#_____________________________________________________________________________
+func	_dumpobj(p,f,t, s) { ###################################################
+      s=_dumpobj_i0(p,f,t=t "." p "{")
+      if ( (p=_rFCHLD(p)) )	return s=s _dumpobjm(p,f,s ? _getchrln(" ",length(t)-1) : t " ")
+      return s }
+#___________________________________________________________
+func	_dumpobj_i0(p,f,t) {
+      if ( f=="" )	return _dumpobj_i2(p,t)
+      if ( f==0 )		return _dumpobj_i1(p,t " ")
+      return _dumpobj_i1(p,t " ") _dumpobj_i2(p,_getchrln(" ",length(t))) }
+#___________________________________________________________
+func	_dumpobj_i1(p,t) {
+      return _ln(t		substr(((p in _tPREV)	? "\xAB"	_tPREV[p]	: "")	"       ",1,7) " "		substr(((p in _tPARENT)	? "\x88"	_tPARENT[p]	: "")	"       ",1,7) " "		substr(			((p in _tFCHLD)	? _tFCHLD[p] : "") "\x85"			((p in _tQCHLD)	? " (" _tQCHLD[p] ") " : "\x85")			"\x85" ((p in _tLCHLD)	? _tLCHLD[p] : "") "                      ",1,22)		substr(((p in _tNEXT)	? "\xBB"	_tNEXT[p]	: "")	"        ",1,8) ) }
+#___________________________________________________________
+func	_dumpobj_i2(p,t) {
+      return	_dumpobj_i3(_[p],t " ") _dumpobj_i3(_ptr[p],_getchrln(" ",length(t)) "`","`") }
+#___________________________________________________________
+func	_dumpobj_i3(A,t,p,e, s,i,t2) {
+      if ( isarray(A) ) {
+            for ( i in A ) {
+                  t2=_getchrln(" ",length(t))
+                  for ( i in A )	{ if ( isarray(A[i]) )		s=s _dumpobj_i3(A[i],t "[" _dumpobj_i4(i) "]",p,_ln())
+                                                      else		s=s _ln(t "[" _dumpobj_i4(i) "]=" p _dumpobj_i4(A[i]) "'")
+                                    t=t2 }
+                  return s }
+            return e=="" ? "" : t e }
+      if ( A==0 && A=="" )	return
+      return _ln(t "=" _dumpobj_i4(p A) "'") }
+#___________________________________________________________
+func	_dumpobj_i4(t) {
+      if ( length(t)>64 )	return substr(t,1,28) " ... " substr(t,length(t)-28)
+      return t }
+#_________________________________________________________________
+func	_dumpobjm(p,f,t, s,t2) { ###################################
+      t2=_getchrln(" ",length(t))
+      do {	s=s _dumpobj(p,f,t); t=t2	} while ( (p=_rNEXT(p)) )
+      return s }
+#_________________________________________________________________
+func	_dumpobj_nc(p,f,t) { #######################################
+      return _dumpobj_i0(p,f,t "." p "{ ") }
+#_________________________________________________________________
+func	_dumpobjm_nc(p,f,t, s,t2) { ################################
+      t2=_getchrln(" ",length(t))
+      do {	s=s _dumpobj_nc(p,f,t); t=t2	} while ( (p=_rNEXT(p)) )
+      return s }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+func	_tapi(p,f,p0,p1,p2,p3, c) {
+      c=p
+      do {	if ( f in _[c]["API"] )					{ f=_[c]["API"][f]; return @f(p,p0,p1,p2,p3) }
+            c=_[c]["CLASS"]	} while ( "CLASS" in _[c] ) }
+
+#	if ( F in _TCLASS )				{ _[p]["CLASS"]=_TCLASS[F]; _tapi(p); return p }
+#		# ???		_mpu(F,p)		???
+#		return p }
+#	_[p][F]=v; return p }
+
+#_______________________________________________________________________
+func	_tgetitem(p,n, a,b) { ############################################
+      if ( p ) {
+            if ( isarray(_PTR[p]["ITEM"]) && (n in _PTR[p]["ITEM"]) )		a=_PTR[p]["ITEM"][n]
+                                                                        else	a=_PTR[p]["ITEM"][n]=_N()
+            if ( !(b=_rFCHLD(a)) )		{ b=_wLCHLD(a,_N()); _PTR[b]["HOST"]=p; _[b]["ITEMNAME"]=n }
+            return b } }
+#_________________________________________________________________
+func	_tdelitem(p) { #############################################
+      if ( p ) {
+            if ( "HOST" in _PTR[p] && "ITEMNAME" in _[p] ) {
+                  return _wLCHLD(_PTR[_PTR[p]["HOST"]]["ITEM"][_[p]["ITEMNAME"]],p) }
+            _tdelete(p); return p } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_____________________________________________________________________________
+func	_tframe0(f,p,p0,p1,p2,p3, A) { #########################################
+      if ( _isptr(p) )				{ if ( isarray(f) )		return _tframe0_i0(f,p)
+                                          _tframex_p0(A,f,0);	return _th0(_tframe0_i0(A,p),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func	_tframe0_i0(A,p, f)			{ if ( p in _tLINK ) {
+                                                _tframe_link=p
+                                                if ( "`" in A )	{ f=A["`"]; while ( p in _tLINK )	@f(p=_tLINK[p]) }
+                                                            else	while ( p in _tLINK )			p=_tLINK[p] }
+                                          else	_tframe_link=""
+                                          if ( p in _tFCHLD )		return	_tframe0_i2(A,"^",p) _tframe0_i1(A,_tFCHLD[p])
+                                                                  return	_tframe0_i2(A,".",p) }
+#_______________________________________________
+func	_tframe0_i1(A,p)				{ if ( _TEND[_ARRLEN] in _TEND )	return
+                                          if ( p in _tNEXT )		return	 _tframe0_i0(A,p) _tframe0_i1(A,_tNEXT[p])
+                                                                  return	 _tframe0_i0(A,p) }
+#_______________________________________________
+func	_tframe0_i2(A,m,p)			{ _tframe_dlink=p; while ( p in _tDLINK )		p=_tDLINK[p]
+                                          if ( m in A )		{ if ( (m "~") in A )	{ if ( !(_TYPEWORD in _[p]) ||	A[m "~"]!~_[p][_TYPEWORD] )	return }
+                                                            m=A[m]; return @m(p) } }
+#_____________________________________________________
+func	_tframex_p0(A,f,q, i,B,C) {
+      _tframe_qparam=q; delete _TEND[++_TEND[_ARRLEN]]
+      
+      if ( match(f,/\~(.*)$/,B) )	{ A["^~"]=A[".~"]=B[1]; f=substr(f,1,RSTART-1) }
+      A["."]=A["^"]=f; return
+      q=split(f,B,/;/); i=0
+      while ( i<q )	{ _tframex_p1(A,C[i]); while ( ++i<=q )	_tframex_p1(A,C[i],B[i]) } }
+#_______________________________________________
+func	_tframex_p1(A,v,i, r,B) {
+      gsub(/[ \t]+/,"",v)
+      while ( match(v,/^([^~]*)~\/(([^\/\\]*\\.)*[^\/\\]*)\//,B) )		{ v=B[1] substr(v,RSTART+RLENGTH); r=B[2] }
+      if ( i=="" )		{ if ( v!="" )		{ A["."]=v; delete A["`"]; delete A["^"] }
+                        if ( r!="" )			A[".~"]=A["`~"]=A["^~"]=r }
+                  else	{ if ( match(v,/!/) )	delete A[i]
+                                          else	{ A[i]=v; if ( r!="" )		A[i "~"]=r } } }
+#_________________________________________________________________
+func	_tframe1(f,p,p0,p1,p2,p3, A) { #############################
+      if ( _isptr(p) )				{ if ( isarray(f) )		return _tframe1_i0(f,p,p0)
+                                          _tframex_p0(A,f,1);	return _th0(_tframe1_i0(A,p,p0),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func	_tframe1_i0(A,p,p0)			{ _tframe_link=p; while ( p in _tLINK )	p=_tLINK[p]
+                                          if ( p in _tFCHLD )		return	_tframe1_i2(A,"^",p,p0) _tframe1_i1(A,_tFCHLD[p],p0)
+                                                                  return	_tframe1_i2(A,".",p,p0) }
+#_______________________________________________
+func	_tframe1_i1(A,p,p0)			{ if ( _TEND[_ARRLEN] in _TEND )	return
+                                          if ( p in _tNEXT )		return	 _tframe1_i0(A,p,p0) _tframe1_i1(A,_tNEXT[p],p0)
+                                                                  return	 _tframe1_i0(A,p,p0) }
+#_______________________________________________
+func	_tframe1_i2(A,m,p,p0)			{ _tframe_dlink=p; while ( p in _tDLINK )		p=_tDLINK[p]
+                                          if ( m in A )		{ if ( (m "~") in A )	{ if ( !(_TYPEWORD in _[p]) ||	A[m "~"]!~_[p][_TYPEWORD] )	return }
+                                                            m=A[m]; return @m(p,p0) } }
+#_________________________________________________________________
+func	_tframe2(f,p,p0,p1,p2,p3, A) { #############################
+      if ( _isptr(p) )				{ if ( isarray(f) )		return _tframe2_i0(f,p,p0,p1)
+                                          _tframex_p0(A,f,2);	return _th0(_tframe2_i0(A,p,p0,p1),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func	_tframe2_i0(A,p,p0,p1)			{ _tframe_link=p; while ( p in _tLINK )	p=_tLINK[p]
+                                          if ( p in _tFCHLD )		return	_tframe2_i2(A,"^",p,p0,p1) _tframe2_i1(A,_tFCHLD[p],p0,p1)
+                                                                  return	_tframe2_i2(A,".",p,p0,p1) }
+#_______________________________________________
+func	_tframe2_i1(A,p,p0,p1)			{ if ( _TEND[_ARRLEN] in _TEND )	return
+                                          if ( p in _tNEXT )		return	 _tframe2_i0(A,p,p0,p1) _tframe2_i1(A,_tNEXT[p],p0,p1)
+                                                                  return	 _tframe2_i0(A,p,p0,p1) }
+#_______________________________________________
+func	_tframe2_i2(A,m,p,p0,p1)		{ _tframe_dlink=p; while ( p in _tDLINK )		p=_tDLINK[p]
+                                          if ( m in A )		{ if ( (m "~") in A )	{ if ( !(_TYPEWORD in _[p]) ||	A[m "~"]!~_[p][_TYPEWORD] )	return }
+                                                            m=A[m]; return @m(p,p0,p1) } }
+#_________________________________________________________________
+func	_tframe3(f,p,p0,p1,p2,p3, A) { #############################
+      if ( _isptr(p) )				{ if ( isarray(f) )		return _tframe3_i0(f,p,p0,p1,p2)
+                                          _tframex_p0(A,f,3);	return _th0(_tframe3_i0(A,p,p0,p1,p2),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func	_tframe3_i0(A,p,p0,p1,p2)		{ _tframe_link=p; while ( p in _tLINK )	p=_tLINK[p]
+                                          if ( p in _tFCHLD )		return	_tframe3_i2(A,"^",p,p0,p1,p2) _tframe3_i1(A,_tFCHLD[p],p0,p1,p2)
+                                                                  return	_tframe3_i2(A,".",p,p0,p1,p2) }
+#_______________________________________________
+func	_tframe3_i1(A,p,p0,p1,p2)		{ if ( _TEND[_ARRLEN] in _TEND )	return
+                                          if ( p in _tNEXT )		return	 _tframe3_i0(A,p,p0,p1,p2) _tframe3_i1(A,_tNEXT[p],p0,p1,p2)
+                                                                  return	 _tframe3_i0(A,p,p0,p1,p2) }
+#_______________________________________________
+func	_tframe3_i2(A,m,p,p0,p1,p2)		{ _tframe_dlink=p; while ( p in _tDLINK )		p=_tDLINK[p]
+                                          if ( m in A )		{ if ( (m "~") in A )	{ if ( !(_TYPEWORD in _[p]) ||	A[m "~"]!~_[p][_TYPEWORD] )	return }
+                                                            m=A[m]; return @m(p,p0,p1,p2) } }
+#_________________________________________________________________
+func	_tframe4(f,p,p0,p1,p2,p3, A) { #############################
+      if ( _isptr(p) )				{ if ( isarray(f) )		return _tframe4_i0(f,p,p0,p1,p2,p3)
+                                          _tframex_p0(A,f,4);	return _th0(_tframe4_i0(A,p,p0,p1,p2,p3),--_TEND[_ARRLEN]) } }
+#_______________________________________________
+func	_tframe4_i0(A,p,p0,p1,p2,p3)		{ _tframe_link=p; while ( p in _tLINK )	p=_tLINK[p]
+                                          if ( p in _tFCHLD )		return	_tframe4_i2(A,"^",p,p0,p1,p2,p3) _tframe4_i1(A,_tFCHLD[p],p0,p1,p2,p3)
+                                                                  return	_tframe4_i2(A,".",p,p0,p1,p2,p3) }
+#_______________________________________________
+func	_tframe4_i1(A,p,p0,p1,p2,p3)		{ if ( _TEND[_ARRLEN] in _TEND )	return
+                                          if ( p in _tNEXT )		return	 _tframe4_i0(A,p,p0,p1,p2,p3) _tframe4_i1(A,_tNEXT[p],p0,p1,p2,p3)
+                                                                  return	 _tframe4_i0(A,p,p0,p1,p2,p3) }
+#_______________________________________________
+func	_tframe4_i2(A,m,p,p0,p1,p2,p3)	{ _tframe_dlink=p; while ( p in _tDLINK )		p=_tDLINK[p]
+                                          if ( m in A )		{ if ( (m "~") in A )	{ if ( !(_TYPEWORD in _[p]) ||	A[m "~"]!~_[p][_TYPEWORD] )	return }
+                                                                  m=A[m]; return @m(p,p0,p1,p2,p3) } }
+#_____________________________________________________
+#	_tframe0(hndstr,ptr)
+#
+#
+#			IN:
+#			MOD:
+#			OUT:
+#			RETURN:
+#
+#	handler string:
+#		Handler-string divides to words. Word splitter is char ";"
+#
+#	Note that handler-string processed left to right. This mean that next word(more rightly) will overwrite fields implemented before(leftmost).
+#	Note that if word-string contains more than one rexp-field then only last rexp-field(most rightly) will be applied.
+#_______________________________________________
+# TO DESIGN:
+#
+# 0-4: complete design of tlink handler call
+# 1-4: add new tlink handler call
+# 1-4: add new run fn (changed rexp to different for each type: see _tframe0)
+#
+# hndstr:
+#	may be add rexp for each type of handler and also total rexp for all ??? ADDED (test)
+#	may be add separator char ";" ???		ADDED (test)
+#_______________________________________________________________________
+func	_tzend(a,b) { #####################################################
+      if ( b==0 && b=="" )	return _TEND[_TEND[_ARRLEN]]=a
+                        else	return _TEND[_TEND[_ARRLEN]+a]=b }
+#_______________________________________________
+BEGIN {	_TEND[_ARRLEN]=0
+            _TYPEWORD		="_TYPE" }
+#_______________________________________________________________________
+########################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+#	_N(arr\str\mpuptr,val) \ _n(arr\str\mpuptr,val)
+#		This functions create new object and return ptr.
+#		_n() - creates object from list of deleted objects or if it's empty create new one, while _N() always create new one
+#		It is strongly recommended to use _N() for the objects that have some data outside of standart object arrays. Or - make routines
+#		that will clear outsided object data in case if object deleting.
+#
+#			IN:		arr\str\mpu,val	- (both missed) just create obj and return ptr
+#					arr,val		- create object and write arr[ptr]=val
+#					str,val		- create object and write _[ptr][str]=val
+#					mpuptr		- NOT ALLOWED (val missed) create object and run MPU-code specified by mpuptr with created object ptr as primary parameter
+#			MOD:		-
+#			OUT:		-
+#			RETURN:	ptr			- pointer to newly created object
+#_________________________________________________________________
+#	_tdel(ptr)
+#		This function exclude object from it's current structure and delete it. ptr can be later used by function: _n() for creating new object
+#		Also same story will occured with all chields and subchields of object specified by ptr.
+#		??? What happened with linked py _ptr[ptr] objects ???
+#
+#			IN:		ptr			- pointer to object that will deleted
+#			MOD:		-
+#			OUT:		-
+#			RETURN:	undefined
+#_________________________________________________________________
+#	_isptr(ptr)
+#		This function checks: is ptr is the object pointer that is currently exist?
+#		Unescaped remained data will be in data of src_dst_ptr.
+#
+#			IN:		ptr			- string that will be tested
+#			MOD:		-
+#			OUT:		-
+#			RETURN:	undefined		- if ptr is not pointer to exist object
+#					ptr			- if ptr is the pointer to exist object
+#_________________________________________________________________
+
+
+
+#_________________________________________________________________
+#
+# TO DESIGN:
+#
+# create basic objectapi interface support
+# modify everywhere checking ptr not by `if ( ptr )...', but by `if ( ptr in _ )...'
+# _TMP0, _TMP1 name change to something like _DATA name ???
+# think about redesigning routines for not depending if ptr is exist in tsysarrs: reason: performance\light code
+
+
+
+
+
+
+
+
+
+
+
+func	_tlist(L,p,f) {
+      _tlisti1=_tlisti0=L[_ARRLEN]+0
+      if ( f==0 && f=="" )	_tlist_i0(L,p)
+                        else	{ _tlistf0=f in _TAPI ? _TAPI[f] : f; _tlist_i1(L,p) }
+      return _tlisti0-_tlisti1 }
+
+func	_tlist_i0(L,p, q,i)	{ if ( isarray(p) )	{ q=p[_ARRLEN]; i=0; while ( i++<q )	_tlist_i0(L,p[i]); return }
+                              if ( p in _ )		{ while ( p in _tLINK )		p=_tLINK[p]
+                                                      L[++_tlisti0]=p
+                                                      if ( p in _tFCHLD )		for ( p=_tFCHLD[p]; p; p=p in _tNEXT ? _tNEXT[p] : "" )	_tlist_i0(L,p) } }
+
+func	_tlist_i1(L,p)		{ if ( isarray(p) )	{ q=p[_ARRLEN]; i=0; while ( i++<q )	_tlist_i1(L,p[i]); return }
+                              if ( p in _ )		{ while ( p in _tLINK )		p=_tLINK[p]
+                                                      if ( _tlistf0 in _[p] )		L[++_tlisti0]=p
+                                                      if ( p in _tFCHLD )		for ( p=_tFCHLD[p]; p; p=p in _tNEXT ? _tNEXT[p] : "" )	_tlist_i1(L,p) } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+##########################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+# _rFBRO(ptr)				- Return ptr of first-bro.				[TESTED]
+#						If !ptr then returns "".
+#_____________________________________________________________________________
+# _rLBRO(ptr)				- Return ptr of last-bro.				[TESTED]
+#						If !ptr then returns "".
+#_____________________________________________________________________________
+# _rQBRO(ptr)				- Returns brothers total quantity.			[TESTED]
+#						If !ptr then returns "".
+END{ ###############################################################################
+
+      if ( _gawk_scriptlevel<1 ) {
+            if ( !_fileio_notdeltmpflag ) {
+                  _FILEIO_TMPATHS[_FILEIO_TMPRD]
+                  _Foreach(_FILEIO_TMPATHS,"_uninit_del") } } }
+#_____________________________________________________________________________
+func	_uninit_del(A,i,p0) {
+      _del(i) }
+#___________________________________________________________________________________
+####################################################################################
+
+#___________________________________________________________________________________
+func	_out(t, a,b) { ###############################################################
+      a=BINMODE; b=ORS; BINMODE="rw"; ORS=""
+      print t > _SYS_STDOUT; fflush(_SYS_STDOUT)
+      BINMODE=a; ORS=b
+      return t }
+#_________________________________________________________________
+func	_outnl(t) { ################################################
+      return _out(t (t~/\x0A$/ ? "" : _CHR["EOL"])) }
+#_______________________________________________________________________
+func	_err(t, a,b) { ###################################################
+      a=BINMODE; b=ORS; BINMODE="rw"; ORS=""
+      print t > _SYS_STDERR; fflush(_SYS_STDERR)
+      BINMODE=a; ORS=b
+      return t }
+#_________________________________________________________________
+func	_errnl(t) { ################################################
+      return _err(t (t~/\x0A$/ ? "" : _CHR["EOL"])) }
+#_____________________________________________________________________________
+func	_getfilepath(t, f,al,b,A) { ############################################
+      ERRNO=""
+      if ( match(t,/^[ \t]*(("([^"]*)"[ \t]*)|([`']([^']*)'[ \t]*)|(([^ \t]+)[ \t]*))/,A) ) {
+            al=RLENGTH; f=A[3] A[5] A[7]; _conl("_getfilepath(" f ")        (" al ")")
+            if ( (b=_filepath(f)) )		{ if ( length(f)<=FLENGTH )	{ FLENGTH=al; return b }
+                                                                        ERRNO="Filepath `" f "' error" } }
+      FLENGTH=0 }
+#_______________________________________________________________________
+func	_filepath(f,dd) { ################################################
+      if ( (f=_filerdnehnd(f))=="" ) return ""
+      return filegetrootdir(f,dd) (f in _FILENAM ? _FILENAM[f] : "") (f in _FILEXT ? _FILEXT[f] : "") }
+#_________________________________________________________________
+func	_filerdne(f,dd) { ##########################################
+      if ( (f=_filerdnehnd(f))=="" ) return ""
+      if ( (f in _FILENAM) )	return filegetrootdir(f,dd) _FILENAM[f] (f in _FILEXT ? _FILEXT[f] : "")
+      if ( f in _FILEXT )	return filegetrootdir(f,dd) _FILEXT[f]
+      return "" }
+#_________________________________________________________________
+func	_filerdn(f,dd) { ###########################################
+      if ( (f=_filerdnehnd(f))=="" ) return ""
+      return f in _FILENAM ? (filegetrootdir(f,dd) _FILENAM[f]) : "" }
+#_________________________________________________________________
+func	_filerd(f,dd) { ############################################
+      if ( (f=_filerdnehnd(f))=="" ) return ""
+      return filegetrootdir(f,dd) }
+#_________________________________________________________________
+func	_filer(f,dd) { #############################################
+      if ( (f=_filerdnehnd(f))=="" ) return ""
+      if ( f in _FILEROOT )								return _FILEROOT[f]
+      if ( ((dd=dd ? dd : _FILEIO_RD),f) in _FILEROOT )			return _FILEROOT[dd,f]
+      return _FILEROOT[dd,f]=fileri(dd) }
+#_________________________________________________________________
+func	_filed(f,dd, d) { ##########################################
+      if ( (f=_filerdnehnd(f))=="" ) return ""
+      if ( f in _FILEDIRFL )								return _FILEDIR[f]
+      if ( f in _FILEROOT ) {
+            if ( (d=filegetdrvdir(_FILEROOT[f])) ) _FILEDIRFL[f]
+                                                                        return _FILEDIR[f]=d _FILEDIR[f] }
+      if ( ((dd=dd ? dd : _FILEIO_RD),f) in _FILEDIR ) 			return _FILEDIR[dd,f]
+      if ( (d=filedi(dd) _FILEDIR[f])~/^\\/ )					return _FILEDIR[dd,f]=d
+      return d }
+#___________________________________________________________
+func	filegetrootdir(f,dd, d) {
+      if ( f in _FILEDIRFL ) {
+            if ( f in _FILEROOT )							return _FILEROOT[f] _FILEDIR[f]
+            if ( ((dd=dd ? dd : _FILEIO_RD),f) in _FILEROOT )		return _FILEROOT[dd,f] _FILEDIR[f]
+                                                                        return (_FILEROOT[dd,f]=fileri(dd)) _FILEDIR[f] }
+      if ( f in _FILEROOT ) {
+            if ( (d=filegetdrvdir(_FILEROOT[f])) ) {
+                  _FILEDIRFL[f];							return _FILEROOT[f] (_FILEDIR[f]=d _FILEDIR[f]) }
+            else	return _FILEROOT[f] _FILEDIR[f] }
+      if ( ((dd=dd ? dd : _FILEIO_RD),f) in _FILEROOT ) {
+            if ( (dd,f) in _FILEDIR ) 						return _FILEROOT[dd,f] _FILEDIR[dd,f]
+            if ( (d=filedi(dd) _FILEDIR[f])~/^\\/ )				return _FILEROOT[dd,f] (_FILEDIR[dd,f]=d)
+                                                                        return _FILEROOT[dd,f] d }
+            if ( (dd,f) in _FILEDIR ) 						return (_FILEROOT[dd,f]=fileri(dd)) _FILEDIR[dd,f]
+            if ( (d=filedi(dd) _FILEDIR[f])~/^\\/ )				return (_FILEROOT[dd,f]=fileri(dd)) (_FILEDIR[dd,f]=d)
+                                                                        return (_FILEROOT[dd,f]=fileri(dd)) d }
+#___________________________________________________________
+func	_filerdnehnd(st, c,r,d,n,A) {
+      if ( st ) {
+            if ( (c=toupper(st)) in _FILECACHE ) {
+                  FLENGTH=length(st); return _FILECACHE[c] }
+            if ( match(st,/^[ \t]*\\[ \t]*\\/) ) {
+                  if ( match(substr(st,(FLENGTH=RLENGTH)+1),/^[ \t]*([0-9A-Za-z\-]+)[ \t]*(\\[ \t]*([A-Za-z])[ \t]*\$[ \t]*)?(\\[ \t]*([0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)+[ \t]*)?(([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/,A) ) {
+                        FLENGTH=FLENGTH+RLENGTH
+                        d=(A[3] ? ("\\" A[3] "$") : "") A[4]; gsub(/[ \t]*\\[ \t]*/,"\\",d)
+                        if ( (st=toupper((r="\\\\" A[1]) d (n=A[8]))) in _FILECACHE ) return _FILECACHE[substr(c,1,FLENGTH)]=_FILECACHE[st]
+                        _FILEDIR[c=_FILECACHE[substr(c,1,FLENGTH)]=_FILECACHE[st]=++_file_rootcntr]=d; _FILEDIRFL[c]
+                        _FILEROOT[c]=r }
+                  else {
+                        FLENGTH=0; _filepath_err="UNC"; return "" } }
+            else {
+                  match(st,/^(([ \t]*\.[ \t]*\\[ \t]*)|(([ \t]*([A-Za-z])[ \t]*(\:)[ \t]*)?([ \t]*(\\)[ \t]*)?))([ \t]*(([ \t]*[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)+)[ \t]*)?([ \t]*([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/,A)
+                  if ( !(FLENGTH=RLENGTH) ) return ""
+                  d=A[8] A[10]; gsub(/[ \t]*\\[ \t]*/,"\\",d)
+                  if ( (st=toupper((r=A[5] A[6]) d (n=A[14]))) in _FILECACHE ) return _FILECACHE[substr(c,1,FLENGTH)]=_FILECACHE[st]
+                  _FILEDIR[c=_FILECACHE[substr(c,1,FLENGTH)]=_FILECACHE[st]=++_file_rootcntr]=d
+                  if ( A[8] )	_FILEDIRFL[c]
+                  if ( r )	_FILEROOT[c]=r }
+            if ( n ) {
+                  if ( match(n,/\.[^\.]*$/) ) {
+                        _FILEXT[c]=substr(n,RSTART); _FILENAM[c]=substr(n,1,RSTART-1) }
+                  else	_FILENAM[c]=n }
+            return c }
+      return "" }
+#___________________________________________________________
+func	filedi(f, d) {
+      if ( (f=filerdnehndi(f))=="" ) return _FILEIO_D
+      if ( f in _FILEDIRFL )								return _FILEDIR[f]
+      if ( f in _FILEROOT ) {
+            if ( (d=filegetdrvdir(_FILEROOT[f])) ) _FILEDIRFL[f]
+                                                                        return _FILEDIR[f]=d _FILEDIR[f] }
+      if ( (_FILEIO_RD,f) in _FILEDIR )						return _FILEDIR[_FILEIO_RD,f]
+      return _FILEDIR[_FILEIO_RD,f]=_FILEIO_D _FILEDIR[f] }
+#_____________________________________________________
+func	fileri(f) {
+      if ( (f=filerdnehndi(f))=="" ) return _FILEIO_R
+      if ( f in _FILEROOT )								return _FILEROOT[f]
+      if ( (_FILEIO_RD,f) in _FILEROOT )						return _FILEROOT[_FILEIO_RD,f]
+      return _FILEROOT[_FILEIO_RD,f]=_FILEIO_R }
+#___________________________________________________________
+func	filerdnehndi(st, a,c,r,d,n,A) {
+      if ( st ) {
+            if ( (c=toupper(st)) in _FILECACHE ) return _FILECACHE[c]
+            if ( match(st,/^[ \t]*\\[ \t]*\\/) ) {
+                  if ( match(substr(st,a=RLENGTH+1),/^[ \t]*([0-9A-Za-z\-]+)[ \t]*(\\[ \t]*([A-Za-z])[ \t]*\$[ \t]*)?(\\[ \t]*([0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)*[ \t]*)?(([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/,A) ) {
+                        a=a+RLENGTH
+                        d=(A[3] ? ("\\" A[3] "$") : "") "\\" A[5]; gsub(/[ \t]*\\[ \t]*/,"\\",d)
+                        if ( (st=toupper((r="\\\\" A[1]) d (n=A[8]))) in _FILECACHE ) return _FILECACHE[substr(c,1,a)]=_FILECACHE[st]
+                        _FILEDIR[c=_FILECACHE[substr(c,1,a)]=_FILECACHE[st]=++_file_rootcntr]=d; _FILEDIRFL[c]
+                        _FILEROOT[c]=r }
+                  else {
+                        _filepath_err="UNC"; return "" } }
+            else {
+                  match(st,/^(([ \t]*\.[ \t]*\\[ \t]*)|(([ \t]*([A-Za-z])[ \t]*(\:)[ \t]*)?([ \t]*(\\)[ \t]*)?))([ \t]*(([ \t]*[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)+)[ \t]*)?([ \t]*([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/,A)
+                  if ( !RLENGTH ) return ""
+                  d=A[8] A[10]; gsub(/[ \t]*\\[ \t]*/,"\\",d)
+                  if ( (st=toupper((r=A[5] A[6]) d (n=A[14]))) in _FILECACHE ) return _FILECACHE[substr(c,1,RLENGTH)]=_FILECACHE[st]
+                  _FILEDIR[c=_FILECACHE[substr(c,1,RLENGTH)]=_FILECACHE[st]=++_file_rootcntr]=d
+                  if ( A[8] )	_FILEDIRFL[c]
+                  if ( r )	_FILEROOT[c]=r }
+            if ( n ) {
+                  if ( match(n,/\.[^\.]*$/) ) {
+                        _FILEXT[c]=substr(n,RSTART); _FILENAM[c]=substr(n,1,RSTART-1) }
+                  else	_FILENAM[c]=n }
+            return c }
+      return "" }
+#___________________________________________________________
+func	filegetdrvdir(t, r) {
+      if ( t in _FILEDRV ) return _FILEDRV[t]
+      if ( match(r=_cmd("cd " t " 2>NUL"),/[^\x00-\x1F]+/) ) {
+            r=gensub(/[ \t]*([\\\$\:])[ \t]*/,"\\1","G",substr(r,RSTART,RLENGTH)); gsub(/(^[ \t]*)|([ \t]*$)/,"",r)
+            if ( match (r,/\:(.*)/) ) {
+                  return _FILEDRV[tolower(t)]=_FILEDRV[toupper(t)]=substr(r,RSTART+1) (r~/\\$/ ? "" : "\\") } }
+      return "" }
+#_________________________________________________________________
+func	_filene(f) { ###############################################
+      if ( (f=_filerdnehnd(f))=="" ) return ""
+      return (f in _FILENAM ? _FILENAM[f] : "") (f in _FILEXT ? _FILEXT[f] : "") }
+#_________________________________________________________________
+func	_filen(f) { ################################################
+      if ( (f=_filerdnehnd(f))=="" ) return ""
+      return f in _FILENAM ? _FILENAM[f] : "" }
+#_________________________________________________________________
+func	_file(f) { #################################################
+      if ( (f=_filerdnehnd(f))=="" ) return ""
+      return f in _FILEXT ? _FILEXT[f] : "" }
+
+
+
+#_______________________________________________________________________
+func	_rdfile(f, i,A) { ################################################
+      if ( ((f=_filerdne(f))=="") || (_filene(f)=="") )	{ ERRNO="Filename error"; return }
+      _fio_cmda=RS; RS=".{1,}"; _fio_cmdb=BINMODE; BINMODE="rw"; ERRNO=RT=_NUL
+      getline RS < f; BINMODE=_fio_cmdb; RS=_fio_cmda
+      if ( ERRNO=="" )		close(f)
+      if ( ERRNO=="" )		return RT
+      return RT=_NOP }
+#_________________________________________________________________
+func	_wrfile(f,d, a,b) { #########################################
+      if ( ((f=_wfilerdnehnd(f))=="") || (_filene(f)=="") ) {
+            ERRNO="Filename error"; return }
+      a=BINMODE; BINMODE="rw"; b=ORS; ORS=""; ERRNO=""
+      print d > f
+      if ( ERRNO ) return ""
+      close(f)
+      BINMODE=a; ORS=b
+      if ( ERRNO ) return ""
+      return f }
+#___________________________________________________________
+func	_wrfile1(f,d, a,b) { ##################################
+      if ( ((f=_wfilerdnehnd(f))=="") || (_filene(f)=="") ) {
+            ERRNO="Filename error"; return }
+      a=BINMODE; BINMODE="rw"; b=ORS; ORS=""; ERRNO=""
+      print d > f
+      if ( ERRNO ) return ""
+      close(f)
+      BINMODE=a; ORS=b
+      if ( ERRNO ) return ""
+      return d }
+#___________________________________________________________
+func	_addfile(f,d, a,b) { ##################################
+      if ( ((f=_wfilerdnehnd(f))=="") || (_filene(f)=="") ) {
+            ERRNO="Filename error"; return }
+      a=BINMODE; BINMODE="rw"; b=ORS; ORS=""; ERRNO=""
+      print d >> f
+      if ( ERRNO ) return ""
+      close(f)
+      BINMODE=a; ORS=b
+      if ( ERRNO ) return ""
+      return d }
+#___________________________________________________________
+func	_wfilerdnehnd(f, t) {
+      if ( (f=_filerdne(f))=="" ) return ""
+      if ( !((t=_filerd(f)) in _WFILEROOTDIR) ) {
+            _cmd("md \"" t "\" 2>NUL"); _WFILEROOTDIR[t] }
+      return f }
+#_______________________________________________________________________
+func	_dir(A,rd, i,r,f,ds,pf,B,C) { ####################################
+      delete A
+      gsub(/(^[ \t]*)|([ \t]*$)/,"",rd); if ( rd=="" ) return ""
+      i=split(_cmd("dir \"" rd "\" 2>NUL"),B,/\x0D?\x0A/)-3
+      pf=(match(B[4],/Directory of ([^\x00-\x1F]+)/,C) ? (C[1] (C[1]~/\\$/ ? "" :"\\")) : "")
+      for ( r=0; i>5; i-- ) {
+            if ( match(B[i],/^([^ \t]*)[ \t]+([^ \t]*)[ \t]+((<DIR>)|([0-9\,]+))[ \t]+([^\x00-\x1F]+)$/,C) ) {
+                  if ( C[6]!~/^\.\.?$/ ) {
+                        if ( C[4] ) ds="D "
+                        else {
+                              ds=C[5] " "; gsub(/\,/,"",ds) }
+                        if ( (f=_filepath(pf C[6] (C[4] ? "\\" : "")))!="" ) {
+                        A[f]=ds C[1] " " C[2]; r++ } } } }
+      return r }
+#_________________________________________________________________
+func	_dirtree(A,f, B) { #########################################
+      gsub(/(^[ \t]*)|([ \t]*$)/,"",f)
+      delete A; A[""]; delete A[""]
+      _dirtree_i0(B,8,split(_cmd("dir \"" f "\" /-C /S 2>NUL"),B,/\x0D?\x0A/),A,f=_filerd(f))
+      return f }
+#___________________________________________________________
+func	_dirtree_i0(B,i,c,A,f, lf,a,C) {
+      delete A[f]; A[f][0]; delete A[f][0]
+      lf=length(f)
+      for ( ; i<=c; ) {
+                  if ( match(B[i],/^[ \t]*Directory of (.+)/,C) ) {
+                        if ( substr(a=_filerd(C[1] "\\"),1,lf)==f ) {
+                              i=_dirtree_i0(B,i+4,c,A[f],a) }
+                        else	return i }
+            else	if ( match(B[i++],/^([^ \t\-]+)\-([^ \t\-]+)\-([^ \t]+)[ \t]+([^ \t]+)[ \t]+([0-9]+)[ \t]+(.+)$/,C) ) {
+                        A[f][f C[6]]=C[5] " " C[1] "/" _CHR["MONTH"][C[2]] "/" C[3] " " C[4] } }
+      return i }
+#_______________________________________________________________________
+func	_filexist(f, a) { ################################################
+      if ( f=="" ) return ""
+      if ( (a=_filepath(f))=="" ) {
+            ERRNO="Filepath error `" f "'"; return "" }
+      _cmd("if exist \"" a "\" exit 1 2>NUL")
+      if ( _exitcode==1 )	return a
+      ERRNO="File not found `" f "'"
+      return _NOP }
+#_________________________________________________________________
+func	_filenotexist(f, a) { ######################################
+      if ( f=="" ) return ""
+      if ( (a=_filepath(f))=="" ) {
+            ERRNO="Filepath error `" f "'"; return "" }
+      _cmd("if exist \"" a "\" exit 1 2>NUL")
+      if ( _exitcode==1 )	return ERRNO=_NOP
+      return a }
+#_______________________________________________________________________
+func	_newdir(f) { #####################################################
+      if ( (f=_filerd(f))=="" ) return
+      if ( !(f in  _WFILEROOTDIR) ) {
+            _cmd("md " f " 2>NUL"); _WFILEROOTDIR[f] }
+      return f }
+#_________________________________________________________________
+func	_newclrdir(f) { ############################################
+      if ( (f=_filerd(f))=="" ) return
+      _cmd("rd " f " /S /Q 2>NUL"); _cmd("md " f " 2>NUL")
+      _WFILEROOTDIR[f]
+      return f }
+#_______________________________________________________________________
+func	_del(f, c,a,A) { #################################################
+      if ( match(f,/\\[ \t]*$/) ) {
+            if ( (c=toupper(_filerd(f))) && (length(f)==FLENGTH) ) {
+                  _cmd("rd " c " /S /Q 2>NUL")
+                  _deletepfx(_WFILEROOTDIR,c); _deletepfx(_FILEIO_RDTMP,c); _deletepfx(_FILEIO_RDNETMP,c) }
+            else	{
+                  _conl("HUJ TEBE!")
+                  return "" } }
+      else {
+            a=_dir(A,f); _cmd("del " f " /Q 2>NUL")
+            for ( c in A ) {
+                  if ( c~/\\$/ ) {
+                        _cmd("rd " c " /S /Q 2>NUL")
+                        _deletepfx(_WFILEROOTDIR,c); _deletepfx(_FILEIO_RDTMP,c) }
+                  _deletepfx(_FILEIO_RDNETMP,c) } }
+      return a }
+#_______________________________________________________________________
+func	_setmpath(p, a) { ################################################
+      ERRNO=""
+      if ( (p) && (a=_filerd(p)) ) {
+            if ( _FILEIO_TMPRD ) _FILEIO_TMPATHS[_FILEIO_TMPRD]
+            #if ( _filexist(a) ) _del(a)
+            #_cmd("rd " a " /S /Q 2>NUL"); _cmd("del " a " /Q 2>NUL")
+            return _FILEIO_TMPRD=a }
+      else	return _warning("`" p "': cannot set temporary folder" (ERRNO ? (": " ERRNO) : "")) }
+#_________________________________________________________________
+func	_getmpfile(f,dd) { #########################################
+      if ( (!dd) || (!(dd=_filerd(dd))) ) dd=_FILEIO_TMPRD
+      if ( (f=_filerdne(_filene(f) ? f : (f "_" ++_FILEIO_TMPCNTR),dd)) ) _FILEIO_RDNETMP[toupper(f)]
+      return f }
+#_________________________________________________________________
+func	_getmpdir(f,dd) { ##########################################
+      if ( (!dd) || (!(dd=_filerd(dd))) ) dd=_FILEIO_TMPRD
+      if ( (f=f ? _filerd(f,dd) : _filerd("_" ++_FILEIO_TMPCNTR "\\",dd)) ) _FILEIO_RDTMP[toupper(f)]
+      return f }
+#_________________________________________________________________
+func	_untmp(f, a) { #############################################
+      if ( (f=filepath(f)) ) {
+            if ( match(f,/\\$/) ) {
+                  _deletepfx(_FILEIO_RDTMP,a=toupper(f)); _deletepfx(_FILEIO_RDNETMP,a) }
+            else {
+                  delete _FILEIO_RDNETMP[toupper(f)] }
+            return f }
+      return "" }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#___________________________________________________________________________________
+# fn	_dirtree(array,pathmask)
+#
+#	Return in `array' file tree from pathmask:
+#		array["file.filerdne"]="size date time"
+#		array["subdir.filerd"]["file.filerdne"]="size date time"
+#		array["subdir.filerd"]["file.filerd"][...]
+#
+#		The array will be cleared before any action. Function return pathmask w/o ltabspc and rtabspc.
+#___________________________________________________________________________________
+
+
+
+
+
+# OK:		change internal function's names to: w\o "_"
+# OK:		FLENGTH: should cover r-spcs
+# OK:		optimize REXP
+# OK:		add new symbols to dir/file names ( ! and + )
+# OK:		create _getfilepath()
+# OK:		del - conflict with WROOTDIR (do not update it)
+# OK:		dir/del - support for filemask ( * and ? )
+# OK:		how to define code injections: header\ender; and HANDLERS
+# OK:		units in header\ender? conline division...
+# OK:		_FILEPATH problem: it will not been defined at the moment when subscript0 starts - at the start TMPRD="_tmp"
+# OK:		del:	if del("dir\\") - then all ok except it NOT deleted "dir\\"	- _del function removed(renamed to __del)
+# OK:		tmpdirs: it delete only autotmp dir and only from script0
+# OK:		MICROTEST:	global testing of filepath (UNC! CORRECT RESULTS! )
+#	question about cache: did new just now generated absolute filepath cached in FILECACHE? its seems like NO
+# check _untmp: CONFLICT: if file or dir from autotmp dir will be untmp then it anyway will be deleted; but file or dir from other point never be deleted anyway - so what is the point of untmp?????
+#ERRLOG:	_setmpath:	warning!!!!!
+
+#___________________________________________________________________________________
+####################################################################################
+# PUBLIC:
+#___________________________________________________________________________________
+#
+#	fn	_rdfile(_filepath)
+#
+#		Read and return data from file specified in _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function read and return data from file. No any changes in data occured.
+#			Function use _filerdne function internally. If some syntax error
+#				found in _filepath then function return "".
+#			If some error occured while reading data from file then fuction return ""
+#				and error-text is in ERRNO(and no close-file action will be occured!).
+#			If reading data completed successfully then function try to close
+#				file and if while closing file some error occured then function
+#				returns "" and error-text is in ERRNO.
+#			Otherwise function returns readed data.
+#_____________________________________________________________________________
+#
+#	fn	_wrfile(_filepath,_data)
+#
+#		Write data into file specified in _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function write _data to file. No any changes in data occured.
+#			Function use _filerdne function internally. If some syntax error
+#				found in _filepath then function return "".
+#			If some error occured while writing data to file then fuction return ""
+#				and error-text is in ERRNO(and no close-file action will be occured!).
+#			If writing data completed successfully then function try to close
+#				file and if while closing file some error occured then function
+#				returns "" and error-text is in ERRNO.
+#			Otherwise function returns _filepath(re-processed).
+#___________________________________________________________________________________
+#
+#	fn	_filepath(_filepath)
+#
+#		Return re-processed root-dir-name-ext of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filerdne(_filepath)
+#
+#		Return re-processed root-dir-filename of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present file-name(name
+#				and/or extension) - otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filerdn(_filepath)
+#
+#		Return re-processed root-dir-name of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present name field -
+#				- otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filerd(_filepath)
+#
+#		Return re-processed root-dir of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filer(_filepath)
+#
+#		Return re-processed root of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filed(_filepath)
+#
+#		Return re-processed dir of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			There is only one case when dir string can be =="" - when in
+#				_filepath specified unmounted drive(MS-format) and from-
+#				current-location address used(like Z:file.ext). In this
+#				case no rootdir-cache-record will be created.
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#	fn	_filene(_filepath)
+#
+#		Return re-processed name-ext of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present file-name(name
+#				and/or extension) - otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filen(_filepath)
+#
+#		Return re-processed name of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present name field -
+#				- otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_file(_filepath)
+#
+#		Return re-processed ext of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present ext field -
+#				- otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#___________________________________________________________________________________
+#
+#	fn	_dir(_ARR,_filepathmask)
+#
+#		Get file-/folder-list of root-folder of _filepathmask.
+#			If _filepathmask=="" then no action occured and return "".
+#			_filepathmask can contain symbols like `*' and `?' as like
+#				its used in `dir'-shell command.
+#			Function gets file-/folder-list of specified root-dir-_filepathmask
+#				and return this list in array _ARR - where each element:
+#
+#			index - is the _filepath of file-or-folder name-ext
+#			value - contains 3 fields separated by " ":
+#				1. =="D" if this is folder
+#				   ==/[0-9]+/ if this is file - size of file in bytes
+#				2. ==date-of-creation of file or folder
+#				3. ==time-of-creation of file or folder
+#
+#			Function returns quantity of items in ARR.
+#___________________________________________________________________________________
+#
+#	fn	_filexist(_filepath)
+#
+#		Test if file or path or drive specified in _filepath is exist.
+#				If _filepath=="" then no action occured and return "".
+#				If some syntax error found in _filepath then function return ""
+#			(and NO _filepath-cache-record will be created!).
+#				Function returns _filepath if _filepath is exist. Otherwise
+#			function return 0.
+#_____________________________________________________________________________
+#
+#	fn	_filenotexist(_filepath)
+#
+#		Test if file or path or drive specified in _filepath is not exist.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#			Function returns 1 if _filepath is not exist. Otherwise function
+#				return 0.
+#_____________________________________________________________________________
+#
+#	fn	_newdir(_filepath)
+#
+#		Create path specified in root-dir-_filepath.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#			Function returns root-dir of _filepath.
+#_______________________________________________________________________
+#
+#	fn	_newdir(_filepath)
+#
+#		Create path specified in root-dir-_filepath. If this folder
+#		already exist then it will be completely cleared.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#			Function returns root-dir of _filepath.
+#___________________________________________________________________________________
+#
+#	fn	_getmpfile(_filepath,_currfilepath)
+#
+#		Return ....
+#
+#_____________________________________________________________________________
+#
+#	fn	_getmpdir(_filepath,_currfilepath)
+#
+#		Return ...
+#
+#_____________________________________________________________________________
+#
+#	Temporary files folder.
+#
+#		Temporary files folder location is defined by _FILEIO_TMPRD.
+#		If it wasn't been initialized before program run or not been initialized
+#			by ENVIRON["TMPDIR"] then it will defined as the:
+#				`current rootdir(stored in _FILEIO_RD)\programname.TMP'
+#			In this case if its already exist then it will completely cleared when _FILEIO
+#			library initialization processed.
+#			And at the program uninitialization processed it will completely
+#			cleared if _FILEIO_TMPCLRFLAG is true.
+#___________________________________________________________________________________
+#
+#	var	_FILEIO_RD (ENVIRON["CD"])
+#
+#		This var can be set before running program. It can contain path which
+#		will be used as default current dir while program run.
+#		If this var is set before program runs - then it will be refreshed by the
+#			_filerd it will be used as default current dir while program run.
+#		If this var is not set before program runs - then ENVIRON["CD"] can also
+#			set up default current dir while program run. If it set before program
+#			begin then it will be refreshed by the _filerd - and also writed into
+#			_FILEIO_RD.
+#		If both _FILEIO_RD and ENVIRON["CD"] are not set before program begins
+#			then real current root\dir will be writed into both _FILEIO_RD and
+#			ENVIRON["CD"] and it will be used as default current dir while program run.
+#
+#___________________________________________________________________________________
+#
+#	var	_FILEIO_TMPRD (ENVIRON["TMPRD"])
+#
+#		This var can be set before running program. It can contain path which
+#		will be used as default temporary files root-folder while program run.
+#		If this var is set before program runs - then it will be refreshed by the
+#			_filerd - and also writed into ENVIRON["TMPRD"].
+#		If this var is not set before program runs - then ENVIRON["TMPRD"] can also
+#			set up default temporary files root-folder while program run. If it set
+#			before program begin then it will be refreshed by the _filerd - and
+#			also writed into _FILEIO_TMPRD.
+#		If both _FILEIO_TMPRD and ENVIRON["TMPRD"] are not set before program begins
+#			then new folder into path specified by the _FILEIO_RD(after its handling)
+#			will be writed into both _FILEIO_TMPRD and ENVIRON["TMPRD"] and it
+#			will be used as default temporary files root-folder while program run.
+#___________________________________________________________________________________
+#
+#	var	_FILEPATH
+#
+#		This var contain filepath of working script. It should be setting up externally.
+#
+#	var	_gawk_scriptlevel
+#___________________________________________________________________________________
+####################################################################################
+END{ ###############################################################################
+      if ( _constatstrln>0 )		_constat() }
+
+#_____________________________________________________________________________
+func	_cmd(c, i,A) { #######################################################
+      _fio_cmda=RS; RS=".{1,}"; _fio_cmdb=BINMODE; BINMODE="rw"; ERRNO=RT=_NUL
+      c | getline RS; BINMODE=_fio_cmdb; RS=_fio_cmda
+      if ( ERRNO || 0>_exitcode=close(c) )	return RT=_NOP
+      return RT }
+
+
+#_____________________________________________________________________________
+func	_con(t,ts, a,b,c,d,i,r,A,B) { ##########################################
+      d=RLENGTH
+      if ( (c=split(r=t,A,/\x0D?\x0A/,B))>0 ) {
+            a=BINMODE; b=ORS; BINMODE="rw"; ORS=""
+            if ( c>1 ) {
+                  if ( (i=length(t=_tabtospc(A[1],ts,_conlastrln)))<_constatstrln ) {
+                        t=t _getchrln(" ",_constatstrln-i) }
+                  print (t B[1]) > _SYS_STDCON
+                  for ( i=2; i<c; i++ ) {
+                        print (_tabtospc(A[i],ts) B[i]) > _SYS_STDCON }
+                  print (_conlastr=_tabtospc(A[c],ts)) > _SYS_STDCON; fflush(_SYS_STDCON) }
+            else {
+                  print (t=_tabtospc(t,ts,_conlastrln))  > _SYS_STDCON; fflush(_SYS_STDCON)
+                  _conlastr=_conlastr t }
+            if ( (i=length(_conlastr))>=_CON_WIDTH ) {
+                  _conlastr=substr(_conlastr,1+(int(i/_CON_WIDTH)*_CON_WIDTH)) }
+            _conlastrln=length(_conlastr)
+            if ( _constatstr ) {
+                  print ((t=_constatgtstr(_constatstr,_CON_WIDTH-1-_conlastrln)) _CHR["CR"] _conlastr) > _SYS_STDCON; fflush(_SYS_STDCON)
+                  _constatstrln=length(t) }
+            BINMODE=a; ORS=b; RLENGTH=d; return r }
+      RLENGTH=d }
+#_______________________________________________________________________
+func	_conl(t,ts) { ####################################################
+      return _con(t (t~/\x0A$/ ? "" : _CHR["EOL"]),ts) }
+#_______________________________________________________________________
+func	_conline(t,ts) { #################################################
+      return _con(_chrline(t,ts)) }
+#_______________________________________________________________________
+func	_constat(t,ts, ln,a) { ###########################################
+      if ( _constatstrln>(ln=length(t=_constatgtstr(_constatstr=_tabtospc(t,ts),_CON_WIDTH-1-_conlastrln))) ) {
+            t=t _getchrln(" ",_constatstrln-ln) }
+      _constatstrln=ln
+      ln=ORS; a=BINMODE; BINMODE="rw"; ORS=""
+      print (t _CHR["CR"] _conlastr) > _SYS_STDCON; fflush(_SYS_STDCON)
+      ORS=ln; BINMODE=a; return _constatstr }
+#_________________________________________________________________
+func	_constatgtstr(t,ln, a,b) {
+      if ( ln<1 ) {
+            return "" }
+      if ( (a=length(t))<=ln ) {
+            return t }
+      if ( ln<11 ) {
+            return substr(t,a-ln+1) }
+      if ( ln<19 ) {
+            return "..." substr(t,a-ln+4) }
+      return substr(t,1,b=int((ln-3)/2)) "..." substr(t,a-ln+b+4) }
+#_______________________________________________________________________
+func	_constatpush(t,ts) { #############################################
+      _CONSTATPUSH[++_CONSTATPUSH[0]]=_constatstr
+      if ( t )	_constat(t,ts)
+      return _constatstr }
+#_______________________________________________________________________
+func	_constatpop() { ##################################################
+      if ( _CONSTATPUSH[0]>0 ) {
+            return _constat(_CONSTATPUSH[_CONSTATPUSH[0]--]) }
+      return _constat("") }
+#_______________________________________________________________________
+func	_conin(t, a,b) { #################################################
+      _constatpush(); _constat(); a=BINMODE; b=RS; BINMODE="rw"; RS="\n"
+      _con(t); getline t < "CON"; close("CON"); _conlastrln=0; _conlastr=""
+      gsub(/[\x0D\x0A]+/,"",t)
+      BINMODE=a; RS=b; _constatpop()
+      return t }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+func	_conlq(t,ts) {
+      return _conl("`" t "'",ts) }
+
+
+
+
+
+
+
+
+####################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+#	var	_SYS_STDOUT			- (by default = "/dev/stdout") standart output pipe filename
+#	var	_SYS_STDERR			- (by default = "/dev/stderr") standart error output pipe filename
+#	var	_SYS_STDCON			- (by default = "CON") standart console output device
+#_____________________________________________________________________________
+#	var	_CHR["CR"]			- return cursor to the position 0 without newline(normally ="\x0D")
+#	var	_CHR["EOL"]			- return cursor to the position 0 & newline (MS:="\x0D\x0A" / UX:="\x0D")
+#	var	_CON_WIDTH 			- console width(columns number)
+#_____________________________________________________________________________
+#	fn	_cmd(c)			- execute shell command c and return output
+#	fn	_err				- output string w\o any addition into _SYS_STDERR device
+#	fn	_errnl			- output string with addition _CHR["EOL"] at the end of the string into _SYS_STDERR device
+#	fn	_out				- output string w\o any addition into _SYS_STDOUT device
+#	fn	_outnl			- output string with addition _CHR["EOL"] at the end of the string into _SYS_STDOUT device
+#_____________________________________________________________________________
+#	fn	_con(text[,tabspace])
+#	fn	_conl(text[,tabspace])
+#	fn	_conline(text[,tabspace])
+#	fn	_constat(status[,tabspace])
+#	fn	_constatpush([status[,tabspace]])
+#	fn	_constatpop()
+#_______________________________________________________________________
+#	var	_constatstr
+####################################################################################
+
+
+func	_unstr(t)	{ return gensub(/\\(.)/,"\\1","G",t) }
+#_____________________________________________________________________________
+func	_gensubfn(t,r,f,p0, A) { ###############################################
+      if ( match(t,r,A) ) return substr(t,1,RSTART-1) @f(_th0(substr(t,RSTART,RLENGTH),t=substr(t,RSTART+RLENGTH)),A,p0) _gensubfn(t,r,f,p0)
+      return t }
+#_____________________________________________________________________________
+func	_rexpstr(r, i,c,A) { ###################################################
+      c=split(r,A,""); r=""
+      for ( i=1; i<=c; i++ )	r=r _REXPSTR[A[i]]
+      return r }
+#_____________________________________________________________________________
+func	_hexnum(n,l) { #########################################################
+      if ( l+0<1 )		l=2
+      return sprintf("%." (l+0<1 ? 2 : l) "X",n) }
+#_____________________________________________________________________________
+func	_ln(t) { ###############################################################
+      return t~/\x0A$/ ? t : (t _CHR["EOL"]) }
+#_______________________________________________________________________
+func	_getchrln(s,w) { #################################################
+      if ( s=="" )			return
+      #if ( w!=w+0 || w<0 )	w=_CON_WIDTH
+      if ( length(s)<w )	{ if ( s in _GETCHRLN )		{ if ( length(_getchrlnt0=_GETCHRLN[s])>=w )	return substr(_getchrlnt0,1,w) }
+                                                else	_getchrlnt0=s s
+                              while ( length(_getchrlnt0)<w )	_getchrlnt0=_getchrlnt0 _getchrlnt0
+                              _GETCHRLN[s]=_getchrlnt0;		return substr(_getchrlnt0,1,w) }
+                        else	return substr(s,1,w) }
+#_______________________________________________________________________
+func	_chrline(t,ts,w,s) { #############################################
+      return (t=" " _tabtospc(t,ts) (t ? t~/[ \t]$/ ? "" : " " : "")) _getchrln(s ? s : "_",(w ? w : _CON_WIDTH-1)-length(t)) _CHR["EOL"] }
+#_______________________________________________________________________
+func	_tabtospc(t,ts,xc, a,c,n,A,B) { ##################################
+      if ( !ts ) {
+            ts=_TAB_STEP_DEFAULT }
+      c=split("." t,A,/\t+/,B); A[1]=substr(A[1],2); t=""
+      for ( n=1; n<=c; n++ ) {
+            t=t A[n] _getchrln(" ",(xc=length(B[n])*ts+int((a=xc+length(A[n]))/ts)*ts)-a) }
+      return t }
+#_________________________________________________________________
+func	_lspctab(t,ts,l, l1,l2,A) { ################################
+      while ( match(t,/^(\t*)( *)((\t*)(.*))$/,A) ) {
+            if ( A[1,"length"]>=l )							return substr(t,l+1)
+            if ( A[2] ) {
+                  if ( (l1=int(A[2,"length"]/ts))>=(l2=l-A[1,"length"]) ) 	return substr(A[2],l2*ts+1) A[3]
+                  if ( !A[4] )		return A[5]
+                  t=A[1] _getchrln("\t",l1) A[3] }
+            else	return t } }
+#_______________________________________________________________________
+func	_qstr(t, c,A,B) { ################################################
+      c=""; for ( t=split(t,A,/[\x00-\x1F\\"]/,B); t>=0; t-- ) {
+            c=_QSTR[B[t]] A[t+1] c }
+      return c }
+#_________________________________________________________________
+func	_qstrq(t) { ################################################
+      gsub(/\\/,"\\\\",t); gsub(/"/,"\\\"",t); return t }
+#_______________________________________________________________________
+func	_Zexparr(S,s, t,i) { ##############################################
+      t=""; if ( isarray(S) ) {
+            for ( i in S ) {
+                  t=t (isarray(S[i]) ?				(_Zexparr_i1(i) "\x10" _Zexparr_i0(S[i]) "\x11\x11\x10"		) :				(_Zexparr_i2(_Zexparr_i3(i) "\x11" _Zexparr_i3(S[i])) "\x10"	) ) } }
+      if ( s!="" ) {
+            gsub(/\x1B/,"\x1B\x3B",s)
+            gsub(/\x10/,"\x1B\x30",s)
+            t=t "\x11\x11\x10" s }
+      gsub(/\x0A/,"\x1B\x3A",t); return t }
+#_________________________________________________________________
+func	_Zexparr_i0(S, t,i) {
+      for ( i in S ) {
+            t=t (isarray(S[i]) ?			(_Zexparr_i1(i) "\x10" _Zexparr_i0(S[i]) "\x11\x11\x10"			) :			(_Zexparr_i2(_Zexparr_i3(i) "\x11" _Zexparr_i3(S[i])) "\x10"		) ) }
+      return t }
+#_________________________________________________________________
+func	_Zexparr_i1(t) {
+      gsub(/\x1B/,"\x1B\x3B",t); gsub(/\x11/,"\x1B\x31",t); gsub(/\x10/,"\x1B\x30",t)
+      return t }
+#_________________________________________________________________
+func	_Zexparr_i2(t) {
+      gsub(/\x10/,"\x1B\x30",t); return t }
+#_________________________________________________________________
+func	_Zexparr_i3(t) {
+      gsub(/\x1B/,"\x1B\x3B",t); gsub(/\x11/,"\x1B\x31",t)
+      return t }
+#_______________________________________________________________________
+func	_Zimparr(D,t, A,B) { ##############################################
+      if ( isarray(D) ) {
+            split(t,A,/\x10/,B)
+            t=_Zimparr_i0(A,B,_Zimparr_i1(D,A,B,1))
+            gsub(/\x1B\x30/,"\x10",t)
+            gsub(/\x1B\x3B/,"\x1B",t)
+            return t } }
+#_________________________________________________________________
+func	_Zimparr_i0(A,B,i) {
+      return i in A ? (A[i] B[i] _Zimparr_i0(A,B,i+1)) : "" }
+#_________________________________________________________________
+func	_Zimparr_i1(D,A,B,i, t,a,n) {
+      while ( i in B ) {
+            if ( (t=A[i++])=="\x11\x11" )	return i
+            gsub(/\x1B\x30/,"\x10",t)
+            if ( (a=index(t,"\x11"))>0 ) {
+                  if ( isarray(D[n=_Zimparr_i2(substr(t,1,a-1))]) ) {
+                        delete D[n] }
+                  D[n]=_Zimparr_i2(substr(t,a+1)) }
+            else {
+                  if ( !isarray(D[t=_Zimparr_i2(t)]) ) {
+                        delete D[t]; D[t][""]; delete D[t][""] }
+                  i=_Zimparr_i1(D[t],A,B,i) } } }
+#_________________________________________________________________
+func	_Zimparr_i2(t) {
+      gsub(/\x1B\x31/,"\x11",t); gsub(/\x1B\x3B/,"\x1B",t)
+      return t }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+#_______________________________________________________________________
+# _CHR array
+#
+#	_CHR[ASC-code decimal number]=="char"
+#
+#		Contains 256 elements. The index is the decimal number from 0-255.
+#		The value is the single character with ASC-code equivalent to index number:
+#
+#			_CHR[97]		=="a"			- character with ASC-code 97 is `a'
+#
+#		This array is useful if you want to get character using it's ASC-code
+#_________________________________________________________________
+# _ASC array
+#
+#	_ASC[char]==number: ASC-code of char
+#
+#		Contains 256 elements. The index is the any single character with ASC-code \x00-\xFF.
+#		The value is the number equivalent of character's ASC-code:
+#
+#			_ASC["A"]		==65			- ASC-code of character `A' is 65
+#
+#		This array is useful if you want to get ASC-code of the character.
+#_________________________________________________________________
+# _QASC array
+#
+#	_QASC[char]=="string: octal ASC-code of char in 3-digit octal format"
+#
+#		Contains 256 elements. The index is the any single charcter with ASC-code \x00-\xFF.
+#		The value is the octal number equivalent of character's ASC-code in fixed-length - 3-digit - string:
+#
+#			_QASC["!"]		=="041"		- ASC-code of character `!' is 33(decimal) == 41(in octal)
+#			_QASC["\x0D"]	=="015"
+#
+#		This array is useful when some type of string escape conversion is performed. It allows quickly get
+#		replace string for the characters that can be specified only by character code in result string:
+#
+#			"\x0D"	->	"\\015"
+#_______________________________________________________________________
+
+
+
+
+
+
+
+####################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+#	fn	_getchrln(ptt,len)
+#_____________________________________________________________________________
+#	fn	_tabtospc(src,tabstep,xcoord)
+####################################################################################
+
+#_____________________________________________________________________________
+func	_retarr(A,i,p,a, q) { ##################################################
+      if ( isarray(A) ) {
+            i=i=="" ? 0 : i+0; q=A[_ARRLEN]+0
+            if ( i<q )	return p					A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]					A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]					A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]					A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]					A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]					A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]					A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]					A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] _retarr_i0(A,q,i,a)
+                        } }
+
+func	_retarr_i0(A,q,i,a) {
+      if ( i<q )	return	A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]				A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]				A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]				A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]				A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]				A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]				A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]				A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] _retarr_i0(A,q,i,a)
+      while ( q<i ) delete A[++q]
+      return a }
+#_____________________________________________________
+#	_retarr(ARRAY,start,prefixtr,postfixtr)
+#		Return string collected from elements of ARRAY.
+#		The data elements in ARRAY have numeric indexes. By default it starts from element with index 1, but it is possible to locate elements starting from
+#		0,-1,-.... The last data element in the ARRAY have the highest numeric index that is stored in ARRAY[_ARRLEN].
+#		Optimized for very large data size.
+#
+#			IN:		ARRAY			- source data array(is ARRAY is not array then return undefined)
+#					start			- (optional) start index in ARRAY; if missed or have non-numeric value then start array index will be 1.
+#					prefixst		- the string that will be inserted in the begin of generated return string
+#					postfix		- the string that will be added at the end of generated return string
+#			MOD:		-
+#			OUT:		-
+#			RETURN:	undefined		- if ARRAY is not array; if ARRAY is empty; if start is higher than ARRAY last element index
+#					string		- collected string: prefixtr-arraydata-postfixtr
+#_________________________________________________________________
+func	_nretarr(A,i,v, r,q) { #####################################
+      if ( (i=i=="" ? 1 : i+0)<=(q=A[_ARRLEN]) ) {
+            if ( i<=(r=q-16) ) {
+                  _ARRSTR=A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+                  while ( i<r )	_ARRSTR=_ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+                  _ARRSTR=_ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A,q,i)
+                  return }
+            _ARRSTR=A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A,q,i)
+            return }
+      _ARRSTR=v
+      return }
+#___________________________________________________________
+func	_nretarrd(A,i,v, r,q) { ##############################
+      if ( (i=i=="" ? 1 : i+0)<=(q=A[_ARRLEN]) ) {
+            if ( i<=(r=q-16) ) {
+                  _ARRSTR=A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+                  while ( i<r )	_ARRSTR=_ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+                  _ARRSTR=_ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A,q,i) }
+            else	_ARRSTR=A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A,q,i) }
+      else	_ARRSTR=v
+      delete A; A[""]; delete A[""] }
+#_______________________________________________
+BEGIN{	_ARRLEN		="\x1ALEN"
+            _ARRPTR		="\x1APTR"
+            _ARRSTR="" }
+#_______________________________________________________________________
+func	_movarr(D,S) { ###################################################
+      delete D; D[""]; delete D[""]
+      _addarr(D,S) }
+#_________________________________________________________________
+func	_addarr(D,S) { #############################################
+      if ( isarray(S) )	_addarr_i0(D,S) }
+#_____________________________________________________
+func	_addarr_i0(D,S, i) {
+      for ( i in S ) {
+            if ( isarray(S[i]) ) {
+                  delete D[i]; D[i][""]; delete D[i][""]; _addarr_i0(D[i],S[i]) }
+            else {
+                  delete D[i]; D[i]=S[i] } } }
+#_______________________________________________________________________
+func	_addarrmask(D,S,M) { #############################################
+      for ( _addarrmaski0 in M )	{ if ( _addarrmaski0 in S )	{ if ( isarray(S[_addarrmaski0]) )	{ if ( !isarray(D[_addarrmaski0]) )	{ delete D[_addarrmaski0]; D[_addarrmaski0][""]; delete D[_addarrmaski0][""] }
+                                                                                                      if ( isarray(M[_addarrmaski0]) )		{ _addarrmask(D[_addarrmaski0],S[_addarrmaski0],M[_addarrmaski0]) }
+                                                                                                                                    else	{ _extarr_i0(D[_addarrmaski0],S[_addarrmaski0]) } }
+                                                            else	{ if ( isarray(D[_addarrmaski0])	)	delete D[_addarrmaski0]
+                                                                  D[_addarrmaski0]=S[_addarrmaski0] } }
+                                                            else	delete D[_addarrmaski0] } }
+#_______________________________________________________________________
+func	_add(S,sf,D,df) { ################################################
+      if ( sf in S ) {
+            if ( isarray(S[sf]) ) {
+                  if ( df in D ) {
+                        if ( isarray(D[df]) )	return _extarr(D[df],S[sf])
+                        delete D[df] }
+                  D[df][""]; delete D[df][""]
+                  return _extarr(D[df],S[sf]) }
+            else {
+                  if ( isarray(D[df]) )	delete D[df]
+                  D[df]=D[df] S[sf] } } }
+#_______________________________________________________________________
+func	_ins(S,sf,D,df) { ################################################
+      if ( sf in S ) {
+            if ( isarray(S[sf]) ) {
+                  if ( df in D ) {
+                        if ( isarray(D[df]) )	return _extarr(D[df],S[sf])
+                        delete D[df] }
+                  D[df][""]; delete D[df][""]
+                  return _extarr(D[df],S[sf]) }
+            else {
+                  if ( isarray(D[df]) )	delete D[df]
+                  D[df]=S[sf] D[df] } } }
+#_______________________________________________________________________
+func	_cmparr(A0,A1,R, a,i) { ##########################################
+      a=0; delete R
+      for ( i in A0 ) {
+                  if ( !(i in A1) ) {
+                        a++; R[i]=0 }
+            else	if ( A0[i]!=A1[i] ) {
+                        a++; R[i]=2 } }
+      for ( i in A1 ) {
+            if ( !(i in A0) ) {
+                  a++; R[i]=1 } }
+      return a }
+#_______________________________________________________________________
+func	_deletepfx(A,f, B,le,i) { ########################################
+      le=length(f)
+      for ( i in A ) {
+            if ( substr(toupper(i),1,le)==f ) {
+                  B[i]=A[i]; delete A[i] } } }
+#___________________________________________________________________________________
+####################################################################################
+
+
+#_______________________________________________________________________
+func	_addlist(A,v) { ##################################################
+      A[++A[0]]=v }
+
+
+
+
+
+
+
+
+
+
+
+#_________________________________________________________________
+func	_retarrd(A,v, i) { #########################################
+      if ( 1 in A )	return		A[1]		A[2]		A[3]		A[4]		A[5]		A[6]		A[7]		A[8]					A[9]		A[10]		A[11]		A[12]		A[13]		A[14]		A[15]		A[16]					((i=17) in A ? _retarrd_i0(A,i) v : v)
+      delete A; return v }
+#_____________________________________________________
+func	_retarrd_i0(A,i) {
+      if ( i in A )	return		A[i++]	A[i++]	A[i++]	A[i++]	A[i++]	A[i++]	A[i++]	A[i++]					A[i++]	A[i++]	A[i++]	A[i++]	A[i++]	A[i++]	A[i++]	A[i++]					(i in A ? _retarrd_i0(A,i) : "")
+      delete A }
+
+
+
+
+#_________________________________________________________________
+func	_lengthsort(i1, v1, i2, v2) { ##############################
+      return length(i1)<length(i2) ? -1 : length(i1)>length(i2) ? 1 : i1<i2 ? -1 : 1 }
+
+
+#_______________________________________________________________________
+func	_dumparr(A,t,lv, a) { ############################################
+      b=PROCINFO["sorted_in"]; PROCINFO["sorted_in"]="_lengthsort"
+      if ( isarray(A) ) {
+            delete _DUMPARR; _dumparrc=_dumparrd=""
+            _dumparr_i1(A,lv=(lv=="" ? 16 : lv==0 || (lv+0)!=0 ? lv : lv=="-*" ? -3 : lv~/^\+?\*$/ ? 3 : 16)+0,lv<0 ? -1 : 1,0,_tabtospc(t))
+            PROCINFO["sorted_in"]=a
+            return _retarrd(_DUMPARR,_dumparrd, _dumparrd="") } }
+#___________________________________________________________
+func	_dumparr_i1(A,lv,ls,ln,t, t2,i,a,f) {
+      t2=_getchrln(" ",length(t))
+      if ( ln==lv )	{ if ( ls>0 )	for ( i in A )	++a
+                                    else	for ( i in A )	isarray(A[i]) ? ++a : ""
+                        if ( length(_dumparrd=_dumparrd t (a>0 ? " ... (x" a ")" : "") _CHR["EOL"])>262144 )		{ _DUMPARR[++_dumparrc]=_dumparrd; _dumparrd="" }
+                        return }
+      if ( ls>=0 )		for ( i in A )	if ( !isarray(A[i]) )	if ( length(_dumparrd=_dumparrd (f ? t2 : t _nop(f=1)) "[" i "]=" A[i] "'" _CHR["EOL"])>262144 )		{ _DUMPARR[++_dumparrc]=_dumparrd; _dumparrd="" }
+      for ( i in A )	if ( isarray(A[i]) )	_dumparr_i1(A[i],lv,ls,ln+ls,_th0(f ? t2 : t,f=1) "[" i "]")
+      if ( !f )	if ( length(_dumparrd=_dumparrd t _CHR["EOL"])>262144 )	{ _DUMPARR[++_dumparrc]=_dumparrd; _dumparrd="" } }
+#_________________________________________________________________
+func	_printarr(A,t,lv,r, a) { ####################################
+      a=PROCINFO["sorted_in"]; PROCINFO["sorted_in"]="_lengthsort"; _printarrexp=r ? r : ""
+      if ( isarray(A) ) {
+            delete _DUMPARR; _dumparrc=_dumparrd=""
+            _printarr_i1(A,lv=(lv=="" ? 16 : lv==0 || (lv+0)!=0 ? lv : lv=="-*" ? -3 : lv~/^\+?\*$/ ? 3 : 16)+0,lv<0 ? -1 : 1,0,_tabtospc(t))
+            PROCINFO["sorted_in"]=a
+            return _retarrd(_DUMPARR,_dumparrd, _dumparrd="") } }
+#___________________________________________________________
+func	_printarr_i1(A,lv,ls,ln,t, t2,i,a,f) {
+      t2=_getchrln(" ",length(t))
+      if ( ln==lv )	{ if ( ls>0 )	for ( i in A )	++a
+                                    else	for ( i in A )	isarray(A[i]) ? ++a : ""
+                        if ( length(_dumparrd=_dumparrd t (a>0 ? " ... (x" a ")" : "") _CHR["EOL"])>262144 )		{ _conl(_dumparrd); _dumparrd="" }
+                        return }
+      if ( ls>=0 )		for ( i in A )	if ( !_printarrexp || i~_printarrexp )	if ( !isarray(A[i]) )	if ( length(_dumparrd=_dumparrd (f ? t2 : t _nop(f=1)) "[" i "]=" A[i] "'" _CHR["EOL"])>262144 )		{ _conl(_dumparrd); _dumparrd="" }
+      for ( i in A )	if ( isarray(A[i]) )	if ( !_printarrexp || i~_printarrexp )	_printarr_i1(A[i],lv,ls,ln+ls,_th0(f ? t2 : t,f=1) "[" i "]")
+      if ( !f )	if ( length(_dumparrd=_dumparrd t _CHR["EOL"])>262144 )	{ _conl(_dumparrd); _dumparrd="" } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+      
+####################################################################################
+
+#_____________________________________________________________________________
+func	_th0(p,p1,p2,p3) { return p } ##########################################
+#_________________________________________________________________
+func	_th1(p0,p,p2,p3) { return p } ##############################
+#_________________________________________________________________
+func	_th2(p0,p1,r,p3) { return p } ##############################
+#_________________________________________________________________
+func	_th3(p0,p1,p2,r) { return p } ##############################
+#_________________________________________________________________
+func	_th10(p0,p1) { return p1 p0 } ##############################
+#_______________________________________________________________________
+func	_nop(p0,p1,p2,p3) { } ############################################
+#_______________________________________________________________________
+func	_bearray(A) { ####################################################
+      if ( isarray(A) || (A==0 && A=="") )	return 1 }
+#_______________________________________________________________________
+func	_setarrsort(f, a) { ##############################################
+      a=PROCINFO["sorted_in"]
+      if ( !f )	delete 	PROCINFO["sorted_in"]
+            else	PROCINFO["sorted_in"]=f
+      return a }
+#_________________________________________________________________
+func	cmp_str_idx(i1, v1, i2, v2) { ##############################
+      return i1 < i2 ? -1 : 1 }
+#___________________________________________________________
+func	ncmp_str_idx(i1, v1, i2, v2) { #######################
+      return i1 < i2 ? 1 : -1 }
+#_______________________________________________________________________
+func	_exit(c) { #######################################################
+      exit c }
+#_______________________________________________________________________
+func	_fn(f,p0,p1,p2) { ################################################
+      if ( f in FUNCTAB )		return @f(p0,p1,p2) }
+#_______________________________________________________________________
+func	_defn(f,c,v) { ###################################################
+      FUNCTAB[c f]=v }
+#_______________________________________________________________________
+func	_delay(t, a) { ###################################################
+      for ( a=1; a<=t; a++ ) {
+            _delayms() } }
+#_________________________________________________________________
+func	_delayms( a) { #############################################
+      for ( a=1; a<=_delay_perfmsdelay; a++ ) { } }
+#_______________________________________________________________________
+func	_getdate() { #####################################################
+      return strftime("%F") }
+#_________________________________________________________________
+func	_getime() { ################################################
+      return strftime("%H:%M:%S") }
+#_________________________________________________________________
+func	_getsecond() { #############################################
+      return systime() }
+#___________________________________________________________
+func	_getsecondsync( a,c,b,c2) { ##########################
+      a=systime()
+      while ( a==systime() ) { ++c }
+      return a+1 }
+#_______________________________________________________________________
+func	_getperf(o,t, a) { ###############################################
+      o=="" ? ++_getperf_opcurr : _getperf_opcurr=o
+      if ( (a=_getsecond())!=_getperf_last ) {
+            _getperf_opsec=(_getperf_opcurr-_getperf_opstart)/((_getperf_last=a)-_getperf_start)
+            return @_getperf_fn(o,t,a) }
+      return 1 }
+#_____________________________________________________
+BEGIN{
+      _getperf_fn="_nop" }
+#___________________________________________________________
+func	_getperf_noenot(o,t,a)		{ return 1 }
+#___________________________________________________________
+func	_getperf_noe(o,t,a) {
+      if ( _getperf_opsecp!=_getperf_opsec )	{ _constat((_constatstr==_getperf_stat ? _getperf_statstr : (_getperf_statstr=_constatstr)) t " [TIME=" (a-_getperf_start) " sec(" (_getperf_opsecp=_getperf_opsec) " ops/sec)]"); _getperf_stat=_constatstr }
+      return 1 }
+#___________________________________________________________
+func	_getperf_not(o,t,a) {
+      if ( a<_getperf_end )	return 1 }
+#___________________________________________________________
+func	_getperf_(o,t,a) {
+      if ( a>=_getperf_end )	return 0
+      if ( _getperf_opsecp!=_getperf_opsec )	{ _constat((_constatstr==_getperf_stat ? _getperf_statstr : (_getperf_statstr=_constatstr)) t " [TIME=" (a-_getperf_start) " sec(" (_getperf_opsecp=_getperf_opsec) " ops/sec)]"); _getperf_stat=_constatstr }
+      return 1 }
+#_________________________________________________________________
+func	_igetperf(t,s,o) { #########################################	# t-test period in seconds(==0 ? no period; s(=true/false)-output/not output status; o-qnt of ops before test start
+      if ( t==0 && t=="" && s==0 && s=="" && o==0 && o=="" ) {
+            if ( _getperf_fn!~/not$/ && _constatstr==_getperf_stat )	_constat(_getperf_statstr)
+            _getperf_fn="_nop"
+            return "[TIME=" (_getperf_last-_getperf_start) " sec(" _getperf_opsec " ops/sec)]" }
+      _conl("initiate _getperf")
+      _getperf_opstart=_getperf_opcurr=o+0; _getperf_opsec=_getperf_opsecp=_getperf_stat=_getperf_statstr=""
+      _getperf_end=t+(_getperf_start=_getperf_last=_getsecondsync())
+      _getperf_fn=(t+0>0 ? "_getperf_" : "_getperf_noe") (s ? "" : "not")
+      return _getperf_start }
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+#_______________________________________________________________________
+func	_addf(A,f) { #####################################################
+      A["B"][""]=A["F"][A["B"][f]=A["B"][""]]=f }
+#_________________________________________________________________
+func	_insf(A,f) { ###############################################
+      A["F"][""]=A["B"][A["F"][f]=A["F"][""]]=f }
+#_________________________________________________________________
+func	_delf(A,f) { ###############################################
+      A["B"][A["F"][A["B"][f]]=A["F"][f]]=A["B"][f]
+      delete A["F"][f]; delete A["B"][f] }
+#_______________________________________________________________________
+func	_pass(A,f,t,p2, i,a) { ###########################################
+      a=_endpass_v0; _endpass_v0=""; i=1
+      while ( t && i )	{ i=""; while ( (i=A[i]) && (t==(t=@i(f,t,p2))) ) { } }
+      if ( i && _endpass_v0 )	{ A["!"]=1; t=_endpass_v0 }
+                        else	delete A["!"]
+      _endpass_v0=a; return t }
+#_________________________________________________________________
+func	_endpass(t)		{ _endpass_v0=t } ########################
+#_________________________________________________________________
+func	_inspass(A,f)	{ A[f]=A[""]; A[""]=f } ##################
+#_______________________________________________________________________
+func	_fframe(A,t,p) { #################################################
+      return _fframe_i0(A,t,p,A[""]) }
+#___________________________________________________________
+func	_fframe_i0(A,t,p,f) {
+      return f ? (@f(t,p) _fframe_i0(A,t,p,A[f])) : "" }
+#_________________________________________________________________
+func	_bframe(A,t,p) { ###########################################
+      return _bframe_i0(A,t,p,A[""]) }
+#___________________________________________________________
+func	_bframe_i0(A,t,p,f) {
+      return f ? (_bframe_i0(A,t,p,A[f]) @f(t,p)) : "" }
+#_________________________________________________________________
+func	_insframe(A,f) { ###########################################
+      A[f]=A[""]; A[""]=f }
+#_______________________________________________________________________
+########################################################################
+
+
+
+
+
+
+
+
+
+func	_fthru(A,c,p, B) {
+      return _fthru_i0(A,c,p,B,A[""]) }
+#_________________________________________________________________
+func	_fthru_i0(A,c,p,B,f) {
+      return f ? @f(c,_fthru_i0(A,c,p,B,A[f]),B) : "" }
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+########################################################################
+#EXPERIMENTAL
+
+func	_rexpfn(R,t,p) {
+      _REXPFN[""]=""
+      while ( t ) {
+            t=_rxpfn(R,t,p) }
+      return _REXPFN[""] }
+
+func	_rxpfn(R,t,p, i,f,A) {
+      for ( i in R ) {
+            if ( match(t,i,A) ) {
+                  f=R[i]; if ( t!=(t=@f(A,substr(t,RLENGTH+1),p)) ) return t } }
+      return _rexpfnend(t) }
+                        
+func	_rexpfnend(t) {
+      _REXPFN[""]=t }
+
+
+func	_ffaccr(A,t,p,P) {
+      return _faccr_i0(A["F"],t,p,P) }
+
+func	_fbaccr(A,t,p,P) {
+      return _faccr_i0(A["B"],t,p,P) }
+
+func	_faccr_i0(A,t,p,P, f,r) {
+      f=r=""
+      if ( isarray(A) ) {
+            while ( (f=A[f]) )	r=r @f(t,p,P) }
+      return r }
+
+func	_ffaccl(A,t,p,P) {
+      return _faccl_i0(A["F"],t,p,P) }
+
+func	_fbaccl(A,t,p,P) {
+      return _faccl_i0(A["B"],t,p,P) }
+
+func	_faccl_i0(A,t,p,P, f,r) {
+      f=r=""
+      if ( isarray(A) ) {
+            while ( (f=A[f]) )	r=@f(t,p,P) r }
+      return r }
+
+
+func	_Foreach(A,f, p0, i) {
+      for ( i in A ) @f(A,i,p0) }
+#_______________________________________________________________________
+func	_foreach(A,f,r,p0,p1,p2, i,p) { ####################################
+      if ( isarray(A) ) {
+            _TMP0[p=_n()]["."]=1
+            _foreach_i0(A,f,_TMP0[p],p0,p1,p2)
+            return _th0(_retarr(_TMP0[p]),_tdel(p)) }
+      if ( _isptr(A) ) {
+            _TMP0[p=_n()][_ARRLEN]=1
+            _tframe4("_foreach_i1" (r ? "~" r : ""),A,f,_TMP0[p],p0,p1)
+            return _th0(_retarr(_TMP0[p]),_tdel(p)) } }
+      #_____________________________________________________
+      func	_foreach_i0(A,f,D,p0,p1,p2) {
+            for ( i in A ) {
+                  if ( isarray(A[i]) )		_foreach_i0(A[i],f,D,p0,p1,p2)
+                                    else	_gen(D,@f(A[i],p0,p1,p2)) } }
+      #_____________________________________________________
+      func	_foreach_i1(p,f,D,p0,p1,p2) {
+            
+            _gen(D,@f(p,p0,p1,p2)) }
+
+BEGIN{
+      _datablock_length		=262144 }
+
+func	_gen(D,t) {
+      if ( length(D[D[_ARRLEN]]=D[D["."]] t)>_datablock_length ) {
+            D[++D[_ARRLEN]]="" } }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+####################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+#	fn	_th0,_th1,_th2,_th3
+#		USAGE:
+#			_th0(p1,p2,p3,p4)
+#
+#			Each of this functions can have up to 4 parameters.
+#				_th0(p1,p2,p3,p4) return 1st parameter (p1)
+#				_th1(p1,p2,p3,p4) return 2nd parameter (p2)
+#				_th2(p1,p2,p3,p4) return 3rd parameter (p3)
+#				_th3(p1,p2,p3,p4) return 4th parameter (p4)
+#_____________________________________________________________________________
+#	fn	_nop(p1,p2,p3,p4,p5,p6,p7,p8)
+#		USAGE:
+#			_nop()
+#
+#			Does not do any action. No result returned. Up to 8 parameters.
+#_____________________________________________________________________________
+#	fn	_exit(c)
+#		USAGE:
+#			_exit(code)
+#
+#			This function do the same as GAWK-operator `exit code'.
+#_____________________________________________________________________________
+#	fn	_getdate()
+#	fn	_getime()
+#	fn	_getsecond()
+#	fn	_getsecondsync()
+func	_rdreg(D,p)	{ ################################################################
+      _rdregp0="reg query \"" p "\" /S /reg:64 2>NUL"; _rdregfld=_rdregkey=0
+      _rdregq0=split(gensub(/[\x0D?\x0A]{2,}/,_CHR["EOL"],"G",_cmd(_rdregp0)),_RDREGA0,/\x0D?\x0A/)
+      while ( _rdregq0>0 )		_rdreg_i0(D)
+      return _rdregfld+_rdregkey }
+      #___________________________________________________________
+      func	_rdreg_i0(D, A) { while ( _rdregq0>0 ){
+                                    if ( match(_rdregp0=_RDREGA0[_rdregq0--],/    (.*)    REG_((SZ)|(DWORD)|(QWORD)|(BINARY)|(EXPAND_SZ)|(MULTI_SZ))    (.*)$/,A) ) {
+                                          if ( !_rdreg_i0(D) )		{ ++_rdregfld; D[_rdregp0 A[1] "." _RDREGTYPE[A[2]]]=A[9]; return } else	break }
+                                    else	if ( _rdregp0~/^HK/ )		{ ++_rdregkey; return D[_rdregp0=_rdregp0 "\\"] } } return 1 }
+      #_____________________________________________________
+      BEGIN	{ _initrdreg() }
+            func	_initrdreg() {	_RDREGTYPE["SZ"]		="STR"
+                                    _RDREGTYPE["DWORD"]	="W32"
+                                    _RDREGTYPE["QWORD"]	="W64"
+                                    _RDREGTYPE["BINARY"]	="BIN"
+                                    _RDREGTYPE["EXPAND_SZ"]	="XSZ"
+                                    _RDREGTYPE["MULTI_SZ"]	="MSZ"
+                                    _RDrdregfld=_rdregkey=0 }
+
+# _rdregfld		: gvar	- number of readed registry fields by _rdreg()
+# _rdregkey		: gvar	- number of readed registry keys by _rdreg()
+#_____________________________________________________________________________
+func	_regpath0(D,i, s,q,S) { ############################################ 0 #
+      if ( i=_patharr0(S,i) ) {
+            if ( "name" in S )	D["name"]=S["name"]; if ( "ext" in S )	D["ext"]=S["ext"]
+            s=(toupper(s=i in S ? S[i] : "") in _REGPATH0REGDIR ? D[++q]=_REGPATH0REGDIR[toupper(s)] : (D[++q]=_REGPATH0REGDIR[""]) "\\" (D[++q]=s)) "\\"
+            while ( ++i in S )		s=s (D[++q]=S[i]) "\\"
+            if ( s!="" )	D[0]=s; IGNORECASE=1
+            D["hostdir"]="\\\\" (D["host"]="host" in S && ((""==i=S["host"]) || "."==i || "?"==i || "localhost"==i) ? ENVIRON["COMPUTERNAME"] : i) "\\" s; IGNORECASE=0 } }
+      #_____________________________________________________
+      BEGIN	{ _initregpath0() }
+            func	_initregpath0() {	_REGPATH0REGDIR[""]				="HKEY_LOCAL_MACHINE"
+                                    _REGPATH0REGDIR["HKLM"]				="HKEY_LOCAL_MACHINE"
+                                    _REGPATH0REGDIR["HKEY_LOCAL_MACHINE"]	="HKEY_LOCAL_MACHINE"
+                                    _REGPATH0REGDIR["HKCR"]				="HKEY_CLASSES_ROOT"
+                                    _REGPATH0REGDIR["HKEY_CLASSES_ROOT"]	="HKEY_CLASSES_ROOT"
+                                    _REGPATH0REGDIR["HKCU"]				="HKEY_CURRENT_USER"
+                                    _REGPATH0REGDIR["HKEY_CURRENT_USER"]	="HKEY_CURRENT_USER"
+                                    _REGPATH0REGDIR["HKU"]				="HKEY_USERS"
+                                    _REGPATH0REGDIR["HKEY_USERS"]			="HKEY_USERS"
+                                    _REGPATH0REGDIR["HKCC"]				="HKEY_CURRENT_CONFIG"
+                                    _REGPATH0REGDIR["HKEY_CURRENT_CONFIG"]	="HKEY_CURRENT_CONFIG"
+                                    _REGPATH0REGDIR["HKPD"]				="HKEY_PERFORMANCE_DATA"
+                                    _REGPATH0REGDIR["HKEY_PERFORMANCE_DATA"]	="HKEY_PERFORMANCE_DATA" }
+#_________________________________________________________________________________________
+##########################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func	_getreg_i1(D,r,R, a,i,il,ir,rc,B) {
+      a=IGNORECASE; IGNORECASE=1; r="^" _torexp(r); rc=0
+      zs=""
+      for ( i in R )	{ if ( match(i,r,B) )	{ il=B[_torexp_pfxcntr]; ir=gensub(/....$/,"",1,substr(i,1+B[_torexp_pfxcntr,"length"]))
+                                                if ( !gsub(/^\\/,"",ir) && match(il,/[^\\]+$/) )	ir=substr(il,RSTART) ir
+                                                D[ir]=R[i]; rc++ } }
+      IGNORECASE=a; if ( rc>0 )	return rc }
+#_________________________________________________________________________________________
+func	_rrdreg(DD,p, k,t,v,c,i,q,tT,A,B,C,D) { #############################################	old; regedit
+      if ( !_registrytmpfile )		_registryinit()
+      _cmd("regedit /E \"" _registrytmpfile "\" \"" p "\" 2>&1")
+      q=patsplit(gensub(/[\x00\xFF\xFE]+/,"","G",_rdfile(_registrytmpfile)),A,/\x0D?\x0A\[[^\]]+\]\x0D?\x0A/,B)
+      for ( i=1; i<=q; i++ )	{ p=gensub(/(^[ \t\x0D\x0A]*\[)|((\\)\\+)|(\][ \t\x0D\x0A]*$)/,"\\3","G",A[i]); DD[p "\\"]; delete C[split(B[i],C,/[\x0D\x0A]+/)]
+                              for ( c=1; c in C; c++ )	{ tt=tt C[c]; if ( gsub(/\\$/,"",tt) )		continue
+                                                            if ( tt=="" )	continue
+                                                            if ( match(_th0(tt,tt=""),/((^"(([^\\"]|\\.)*)")|(@))=(("(([^\\"]|\\.)*)")|(dword:([[:xdigit:]]{8}))|(hex(\(([27b])\))?:(.*)))$/,D) ) {
+                                                            if ( D[7] )			{ t="STR"; v=_unstr(D[8]) }
+                                                            else	if ( D[10] )		{ t="W32"; v=D[11] }
+                                                            else	{ v=D[15]
+                                                                  if ( D[13] )	{ switch ( D[14] ) {
+                                                                                          case "2":	t="XSZ"; break
+                                                                                          case "7":	t="MSZ"; break
+                                                                                          default:	t="W64" } }
+                                                                              else	t="BIN" }
+                                                      DD[gensub(/(\\)\\+/,"\\1","G",p "\\" _unstr(D[3] (D[5] ? "(Default)" : "")) "." t)]=v }
+                                                else	_fatal("regedit: unknown output format(" c "): `" C[c] "'") } } }
+      #_____________________________________________________
+      func	_registryinit()	{ _registrytmpfile=_getmpfile() }
+#_____________________________________________________________________________
+# _rdreg(ARRAY,reg_path)
+#		Import into ARRAY the content of the whole registree tree with the higher point specified by reg_path.
+#		ARRAY will be filled by the strings with following format:
+#
+# HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GnuWin32\CoreUtils\5.3.0\pck\InstallPath.STR=C:\Program Files (x86)\GnuWin32
+#	where:
+# HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GnuWin32\CoreUtils\5.3.0\pck									<- REG KEY PATH
+#											     InstallPath							<- DATA FIELD
+#													     STR						<- TYPE
+#														   C:\Program Files (x86)\GnuWin32	<- VALUE
+# TYPE:
+#	STR		- REG_SZ		(String Value)
+#	W32		- REG_DWORD		(DWORD (32-bit) Value)
+#	W64		- REG_QWORD		(QWORD (64-bit) Value)
+#	BIN		- REG_BINARY	(Binary Value)
+#	XSZ		- REG_EXPAND_SZ	(Expandable String Value)
+#	MSZ		- REG_MULTI_SZ	(Multi-String Value)
+#_________________________________________________________________________________________
+
+
+
+
+# HKCR		HKEY_CLASSES_ROOT
+# HKCU		HKEY_CURRENT_USER
+# HKLM		HKEY_LOCAL_MACHINE
+# HKU			HKEY_USERS
+# HKCC		HKEY_CURRENT_CONFIG
+# HKPD		HKEY_PERFORMANCE_DATA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+func	_sysinfo(D,h) { ##############################################################
+      h="wmic /NODE: \"" h "\" OS 2>NUL"
+      if ( split(_cmd(h),_SYSINFOA0,/[\x0D\x0A]+/)==3 ) {
+            _sysinfol0=length(h=_SYSINFOA0[2])+1; _sysinfoq0=_sysinfoq1=split(_SYSINFOA0[1],_SYSINFOA0,/ +/,_SYSINFOB0)
+            while ( --_sysinfoq0>0 )			D[_sysinfof0]=gensub(/^ +| +$/,"","G",substr(h,_sysinfol0=_sysinfol0-(_sysinfol1=length(_sysinfof0=_SYSINFOA0[_sysinfoq0])+length(_SYSINFOB0[_sysinfoq0])),_sysinfol1))
+            return _sysinfoq1-1 } }
+#_____________________________________________________________________________
+func	zzer()	{ ################################################################
+      }
+      #_____________________________________________________
+      BEGIN	{ _initsys() }
+            func	_initsys() { }
+#_________________________________________________________________________________________
+##########################################################################################
+
+
+
+
+
+
+
+#BootDevice               BuildNumber  BuildType            Caption                                      CodeSet  CountryCode  CreationClassName      CSCreationClassName   CSDVersion      CSName  CurrentTimeZone  DataExecutionPrevention_32BitApplications  DataExecutionPrevention_Available  DataExecutionPrevention_Drivers  DataExecutionPrevention_SupportPolicy  Debug  Description  Distributed  EncryptionLevel  ForegroundApplicationBoost  FreePhysicalMemory  FreeSpaceInPagingFiles  FreeVirtualMemory  InstallDate                LargeSystemCache  LastBootUpTime             LocalDateTime              Locale  Manufacturer           MaxNumberOfProcesses  MaxProcessMemorySize  MUILanguages  Name                                                                                  NumberOfLicensedUsers  NumberOfProcesses  NumberOfUsers  OperatingSystemSKU  Organization  OSArchitecture  OSLanguage  OSProductSuite  OSType  OtherTypeDescription  PAEEnabled  PlusProductID  PlusVersionNumber  Primary  ProductType  RegisteredUser  SerialNumber             ServicePackMajorVersion  ServicePackMinorVersion  SizeStoredInPagingFiles  Status  SuiteMask  SystemDevice             SystemDirectory      SystemDrive  TotalSwapSpaceSize  TotalVirtualMemorySize  TotalVisibleMemorySize  Version   WindowsDirectory
+#\Device\HarddiskVolume1  7601         Multiprocessor Free  Microsoft Windows Server 2008 R2 Enterprise  1252     1            Win32_OperatingSystem  Win32_ComputerSystem  Service Pack 1  CPU     180              TRUE                                       TRUE                               TRUE                             3                                      FALSE               FALSE        256              0                           6925316             33518716                41134632           20110502192745.000000+180                    20130426120425.497469+180  20130510134606.932000+180  0409    Microsoft Corporation  -1                    8589934464            {"en-US"}     Microsoft Windows Server 2008 R2 Enterprise |C:\Windows|\Device\Harddisk0\Partition2  0                      116                2              10                                64-bit          1033        274             18                                                                          TRUE     3            Windows User    55041-507-2389175-84833  1                        0                        33554432                 OK      274        \Device\HarddiskVolume2  C:\Windows\system32  C:                               50311020                16758448                6.1.7601  C:\Windows
+
+
+
+
+
+
+
+
+
+
+
+
+
+BEGIN { ############################################################################
+
+      a=ENVIRON["EGAWK_CMDLINE"]; gsub(/^[ \t]*/,"",a)
+      a=_lib_CMDLN(a)
+      if ( (a!="") && (!_LIBAPI["F"]["!"]) )	{ _out(_lib_HELP()); _fatal("Bad comandline argument `" a "'") }
+      gsub(/^[ \t]*/,"",a); ENVIRON["EGAWK_CMDLINE"]=a
+      _lib_APPLY(); if ( _basexit_fl )	exit
+            _INIT()
+            _START()
+            _END() }
+#___________________________________________________________________________________
+func	_INITBASE() { ################################################################
+
+      _egawk_utilpath			=ENVIRON["EGAWK_PATH"] "BIN\\UTIL\\" }
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+# make sure that stdout contain only expected characters
+# make sure that stderr contain only expected characters
+# redesign & reformat keys and its outputs
+# try different key combinations
+# add lib-specified to all libs
+      
diff --git a/gawk-5.0.1/test/profile5.ok b/gawk-5.0.1/test/profile5.ok
new file mode 100644
index 00000000000..1b32ceda272
--- /dev/null
+++ b/gawk-5.0.1/test/profile5.ok
@@ -0,0 +1,8178 @@
+BEGIN {
+	_addlib("_BASE")
+}
+
+#___________________________________________________________________________________
+BEGIN {	############################################################################
+	BINMODE = "rw"
+	SUBSEP = "\000"
+	_NULARR[""]
+	delete _NULARR[""]
+	_INITBASE()
+}
+
+BEGIN {
+	_addlib("_sYS")
+}
+
+BEGIN {
+	_addlib("_rEG")
+}
+
+BEGIN {
+	_addlib("_INSTRUC")
+}
+
+#___________________________________________________________________________________
+BEGIN {	#############################################################################
+	_delay_perfmsdelay = 11500
+}
+
+BEGIN {
+	_addlib("_ARR")
+}
+
+#___________________________________________________________________________________
+BEGIN {
+}
+
+###########################################################################
+BEGIN {
+	_addlib("_EXTFN")
+}
+
+#___________________________________________________________________________________
+BEGIN {	#############################################################################
+	delete _XCHR
+	delete _ASC
+	delete _CHR
+	t = ""
+	for (i = 0; i < 256; i++) {
+		_ASC[a = _CHR[i] = sprintf("%c", i)] = i
+		_QASC[a] = sprintf("%.3o", i)
+		_XCHR[_CHR[i]] = sprintf("%c", (i < 128 ? i + 128 : i - 128))
+	}
+	#_____________________________________________________________________________
+	for (i = 0; i < 256; i++) {
+		_QSTRQ[_CHR[i]] = "\\" sprintf("%.3o", i)
+	}
+	#_______________________________________________________________________
+	for (i = 0; i < 32; i++) {
+		_QSTR[_CHR[i]] = _QSTRQ[_CHR[i]]
+	}
+	for (; i < 128; i++) {
+		_QSTR[_CHR[i]] = _CHR[i]
+	}
+	for (; i < 256; i++) {
+		_QSTR[_CHR[i]] = _QSTRQ[_CHR[i]]
+	}
+	_QSTR["\\"] = "\\\\"	#; _QSTR["\""]="\\\""
+	#_____________________________________________________________________________
+	_CHR["CR"] = "\r"
+	_CHR["EOL"] = "\r\n"
+	_CHR["EOF"] = "\032"
+	_QSTR[_CHR["EOL"]] = "\\015\\012"
+	#_______________________________________________________________________
+	_CHR["MONTH"][_CHR["MONTH"]["Jan"] = "01"] = "Jan"
+	_CHR["MONTH"][_CHR["MONTH"]["Feb"] = "02"] = "Feb"
+	_CHR["MONTH"][_CHR["MONTH"]["Mar"] = "03"] = "Mar"
+	_CHR["MONTH"][_CHR["MONTH"]["Apr"] = "04"] = "Apr"
+	_CHR["MONTH"][_CHR["MONTH"]["May"] = "05"] = "May"
+	_CHR["MONTH"][_CHR["MONTH"]["Jun"] = "06"] = "Jun"
+	_CHR["MONTH"][_CHR["MONTH"]["Jul"] = "07"] = "Jul"
+	_CHR["MONTH"][_CHR["MONTH"]["Aug"] = "08"] = "Aug"
+	_CHR["MONTH"][_CHR["MONTH"]["Sep"] = "09"] = "Sep"
+	_CHR["MONTH"][_CHR["MONTH"]["Oct"] = "10"] = "Oct"
+	_CHR["MONTH"][_CHR["MONTH"]["Nov"] = "11"] = "Nov"
+	_CHR["MONTH"][_CHR["MONTH"]["Dec"] = "12"] = "Dec"
+	#_____________________________________________________________________________
+	_TAB_STEP_DEFAULT = 8
+	#_____________________________________________________________________________
+	for (i = 0; i < 32; i++) {
+		_REXPSTR[_CHR[i]] = _QSTRQ[_CHR[i]]
+	}
+	for (; i < 256; i++) {
+		_REXPSTR[_CHR[i]] = _CHR[i]
+	}
+	_gensubfn("\\^$.()|{,}[-]?+*", ".", "_rexpstr_i0")
+}
+
+BEGIN {
+	_addlib("_SYSIO")
+}
+
+#___________________________________________________________________________________
+BEGIN {	#############################################################################
+	_SYS_STDCON = "CON"
+	_CON_WIDTH = match(_cmd("MODE " _SYS_STDCON " 2>NUL"), /Columns:[ \t]*([0-9]+)/, A) ? strtonum(A[1]) : 80
+}
+
+BEGIN {
+	_addlib("_FILEIO")
+}
+
+#___________________________________________________________________________________
+BEGIN {	#############################################################################
+	if (_SYS_STDOUT == "") {
+		_SYS_STDOUT = "/dev/stdout"
+	}
+	if (_SYS_STDERR == "") {
+		_SYS_STDERR = "/dev/stderr"
+	}
+	_CHR["SUBDIR"] = "\\"
+	if (_gawk_scriptlevel < 1) {
+		match(b = _cmd("echo %CD% 2>NUL"), /[^\x00-\x1F]*/)
+		ENVIRON["CD"] = _FILEIO_RD = _filerd(substr(b, RSTART, RLENGTH) _CHR["SUBDIR"])
+		_FILEIO_R = _filer(_FILEIO_RD)
+		_FILEIO_D = _filed(_FILEIO_RD)
+		_setmpath(_filerd(_FILEIO_RD "_tmp" _CHR["SUBDIR"]))
+	}
+}
+
+BEGIN {
+	_addlib("_tOBJ")
+}
+
+#___________________________________________________________________________________
+BEGIN {	#############################################################################
+	_tInBy = "\212._tInBy"
+	_tgenuid_init()
+	_UIDS[""]
+	delete _UIDS[""]
+	_UIDSDEL[""]
+	delete _UIDSDEL[""]
+	_tPREV[""]
+	_tPARENT[""]
+	_tNEXT[""]
+	_tFCHLD[""]
+	_tQCHLD[""]
+	_tLCHLD[""]
+	_tLINK[""]
+	_tCLASS[""]
+	_tSTR[""]
+	_tDLINK[""]
+	_[""]
+	delete _[""]
+	_ptr[""]
+	delete _ptr[""]
+	_TMP0[""]
+	delete _TMP0[""]
+	_TMP1[""]
+	delete _TMP1[""]
+}
+
+BEGIN {
+	_addlib("_ERRLOG")
+}
+
+#___________________________________________________________________________________
+BEGIN {	#############################################################################
+	if (_gawk_scriptlevel < 1) {
+		_ERRLOG_TF = 1
+		_ERRLOG_VF = 1
+		_ERRLOG_IF = 1
+		_ERRLOG_WF = 1
+		_ERRLOG_EF = 1
+		_ERRLOG_FF = 1
+		_wrfile(_errlog_file = _getmpfile("OUTPUT.LOG"), "")
+	}
+}
+
+BEGIN {
+	_addlib("_SHORTCUT")
+}
+
+#___________________________________________________________________________________
+BEGIN {
+	_shortcut_init()
+}
+
+#########################################################
+BEGIN {
+	_addlib("_eXTFN")
+}
+
+#___________________________________________________________________________________
+BEGIN {
+	_extfn_init()
+}
+
+############################################################
+BEGIN {
+	_addlib("_sHARE")
+}
+
+BEGIN {
+	_addlib("_FILEVER")
+}
+
+BEGIN {
+	_addlib("_DS")	###############################################################################
+	_PRODUCT_NAME = "Deployment Solution Control"
+	_PRODUCT_VERSION = "1.0"
+	_PRODUCT_COPYRIGHT = "Copyright (C) 2013 by CosumoGEN"
+	_PRODUCT_FILENAME = "_main.ewk"
+}
+
+# problem configuring uid by array charset: i can' understand what format of the array: possibly - remove array support
+# after removal of array format detection: there is unfinished conflicts: it is possible to totally remove array uid-gen initialization
+
+#_____________________________________________________
+BEGIN {
+	_inituidefault()
+}
+
+#_____________________________________________________
+BEGIN {
+	_initfilever()
+}
+
+#_____________________________________________________
+BEGIN {
+	_initshare()
+}
+
+#_________________________________________________________________
+BEGIN {
+	_inspass(_IMPORT, "_import_data")
+}
+
+#_______________________________________________
+BEGIN {
+	_TEND[_ARRLEN] = 0
+	_TYPEWORD = "_TYPE"
+}
+
+#_______________________________________________
+BEGIN {
+	_ARRLEN = "\032LEN"
+	_ARRPTR = "\032PTR"
+	_ARRSTR = ""
+}
+
+#_____________________________________________________
+BEGIN {
+	_getperf_fn = "_nop"
+}
+
+BEGIN {
+	_datablock_length = 262144
+}
+
+#_____________________________________________________
+BEGIN {
+	_initrdreg()
+}
+
+#_____________________________________________________
+BEGIN {
+	_initregpath0()
+}
+
+#_____________________________________________________
+BEGIN {
+	_initsys()
+}
+
+#_________________________________________________________________________________________
+##########################################################################################
+
+
+
+
+
+
+
+#BootDevice               BuildNumber  BuildType            Caption                                      CodeSet  CountryCode  CreationClassName      CSCreationClassName   CSDVersion      CSName  CurrentTimeZone  DataExecutionPrevention_32BitApplications  DataExecutionPrevention_Available  DataExecutionPrevention_Drivers  DataExecutionPrevention_SupportPolicy  Debug  Description  Distributed  EncryptionLevel  ForegroundApplicationBoost  FreePhysicalMemory  FreeSpaceInPagingFiles  FreeVirtualMemory  InstallDate                LargeSystemCache  LastBootUpTime             LocalDateTime              Locale  Manufacturer           MaxNumberOfProcesses  MaxProcessMemorySize  MUILanguages  Name                                                                                  NumberOfLicensedUsers  NumberOfProcesses  NumberOfUsers  OperatingSystemSKU  Organization  OSArchitecture  OSLanguage  OSProductSuite  OSType  OtherTypeDescription  PAEEnabled  PlusProductID  PlusVersionNumber  Primary  ProductType  RegisteredUser  SerialNumber             ServicePackMajorVersion  ServicePackMinorVersion  SizeStoredInPagingFiles  Status  SuiteMask  SystemDevice             SystemDirectory      SystemDrive  TotalSwapSpaceSize  TotalVirtualMemorySize  TotalVisibleMemorySize  Version   WindowsDirectory
+#\Device\HarddiskVolume1  7601         Multiprocessor Free  Microsoft Windows Server 2008 R2 Enterprise  1252     1            Win32_OperatingSystem  Win32_ComputerSystem  Service Pack 1  CPU     180              TRUE                                       TRUE                               TRUE                             3                                      FALSE               FALSE        256              0                           6925316             33518716                41134632           20110502192745.000000+180                    20130426120425.497469+180  20130510134606.932000+180  0409    Microsoft Corporation  -1                    8589934464            {"en-US"}     Microsoft Windows Server 2008 R2 Enterprise |C:\Windows|\Device\Harddisk0\Partition2  0                      116                2              10                                64-bit          1033        274             18                                                                          TRUE     3            Windows User    55041-507-2389175-84833  1                        0                        33554432                 OK      274        \Device\HarddiskVolume2  C:\Windows\system32  C:                               50311020                16758448                6.1.7601  C:\Windows
+BEGIN {	############################################################################
+	a = ENVIRON["EGAWK_CMDLINE"]
+	gsub(/^[ \t]*/, "", a)
+	a = _lib_CMDLN(a)
+	if ((a != "") && (! _LIBAPI["F"]["!"])) {
+		_out(_lib_HELP())
+		_fatal("Bad comandline argument `" a "'")
+	}
+	gsub(/^[ \t]*/, "", a)
+	ENVIRON["EGAWK_CMDLINE"] = a
+	_lib_APPLY()
+	if (_basexit_fl) {
+		exit
+	}
+	_INIT()
+	_START()
+	_END()
+}
+
+#_____________________________________________________________________________
+END {	########################################################################
+	_EXIT()
+}
+
+#_______________________________________________________________________
+########################################################################
+END {	###############################################################################
+	if (_gawk_scriptlevel < 1) {
+		close(_errlog_file)
+		p = _Zimport(_rdfile(_errlog_file), _N())
+		if ((t = _get_errout(p)) != "") {
+			_expout(t, "/dev/stderr")
+		}
+	}
+}
+
+##########################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+# _rFBRO(ptr)				- Return ptr of first-bro.				[TESTED]
+#						If !ptr then returns "".
+#_____________________________________________________________________________
+# _rLBRO(ptr)				- Return ptr of last-bro.				[TESTED]
+#						If !ptr then returns "".
+#_____________________________________________________________________________
+# _rQBRO(ptr)				- Returns brothers total quantity.			[TESTED]
+#						If !ptr then returns "".
+END {	###############################################################################
+	if (_gawk_scriptlevel < 1) {
+		if (! _fileio_notdeltmpflag) {
+			_FILEIO_TMPATHS[_FILEIO_TMPRD]
+			_Foreach(_FILEIO_TMPATHS, "_uninit_del")
+		}
+	}
+}
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#___________________________________________________________________________________
+# fn	_dirtree(array,pathmask)
+#
+#	Return in `array' file tree from pathmask:
+#		array["file.filerdne"]="size date time"
+#		array["subdir.filerd"]["file.filerdne"]="size date time"
+#		array["subdir.filerd"]["file.filerd"][...]
+#
+#		The array will be cleared before any action. Function return pathmask w/o ltabspc and rtabspc.
+#___________________________________________________________________________________
+
+
+
+
+
+# OK:		change internal function's names to: w\o "_"
+# OK:		FLENGTH: should cover r-spcs
+# OK:		optimize REXP
+# OK:		add new symbols to dir/file names ( ! and + )
+# OK:		create _getfilepath()
+# OK:		del - conflict with WROOTDIR (do not update it)
+# OK:		dir/del - support for filemask ( * and ? )
+# OK:		how to define code injections: header\ender; and HANDLERS
+# OK:		units in header\ender? conline division...
+# OK:		_FILEPATH problem: it will not been defined at the moment when subscript0 starts - at the start TMPRD="_tmp"
+# OK:		del:	if del("dir\\") - then all ok except it NOT deleted "dir\\"	- _del function removed(renamed to __del)
+# OK:		tmpdirs: it delete only autotmp dir and only from script0
+# OK:		MICROTEST:	global testing of filepath (UNC! CORRECT RESULTS! )
+#	question about cache: did new just now generated absolute filepath cached in FILECACHE? its seems like NO
+# check _untmp: CONFLICT: if file or dir from autotmp dir will be untmp then it anyway will be deleted; but file or dir from other point never be deleted anyway - so what is the point of untmp?????
+#ERRLOG:	_setmpath:	warning!!!!!
+
+#___________________________________________________________________________________
+####################################################################################
+# PUBLIC:
+#___________________________________________________________________________________
+#
+#	fn	_rdfile(_filepath)
+#
+#		Read and return data from file specified in _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function read and return data from file. No any changes in data occured.
+#			Function use _filerdne function internally. If some syntax error
+#				found in _filepath then function return "".
+#			If some error occured while reading data from file then fuction return ""
+#				and error-text is in ERRNO(and no close-file action will be occured!).
+#			If reading data completed successfully then function try to close
+#				file and if while closing file some error occured then function
+#				returns "" and error-text is in ERRNO.
+#			Otherwise function returns readed data.
+#_____________________________________________________________________________
+#
+#	fn	_wrfile(_filepath,_data)
+#
+#		Write data into file specified in _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function write _data to file. No any changes in data occured.
+#			Function use _filerdne function internally. If some syntax error
+#				found in _filepath then function return "".
+#			If some error occured while writing data to file then fuction return ""
+#				and error-text is in ERRNO(and no close-file action will be occured!).
+#			If writing data completed successfully then function try to close
+#				file and if while closing file some error occured then function
+#				returns "" and error-text is in ERRNO.
+#			Otherwise function returns _filepath(re-processed).
+#___________________________________________________________________________________
+#
+#	fn	_filepath(_filepath)
+#
+#		Return re-processed root-dir-name-ext of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filerdne(_filepath)
+#
+#		Return re-processed root-dir-filename of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present file-name(name
+#				and/or extension) - otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filerdn(_filepath)
+#
+#		Return re-processed root-dir-name of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present name field -
+#				- otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filerd(_filepath)
+#
+#		Return re-processed root-dir of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filer(_filepath)
+#
+#		Return re-processed root of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filed(_filepath)
+#
+#		Return re-processed dir of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			There is only one case when dir string can be =="" - when in
+#				_filepath specified unmounted drive(MS-format) and from-
+#				current-location address used(like Z:file.ext). In this
+#				case no rootdir-cache-record will be created.
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#	fn	_filene(_filepath)
+#
+#		Return re-processed name-ext of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present file-name(name
+#				and/or extension) - otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_filen(_filepath)
+#
+#		Return re-processed name of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present name field -
+#				- otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#_____________________________________________________________________________
+#
+#	fn	_file(_filepath)
+#
+#		Return re-processed ext of _filepath.
+#			If _filepath=="" then no action occured and return "".
+#			Function return result only if in _filepath present ext field -
+#				- otherwise its return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#___________________________________________________________________________________
+#
+#	fn	_dir(_ARR,_filepathmask)
+#
+#		Get file-/folder-list of root-folder of _filepathmask.
+#			If _filepathmask=="" then no action occured and return "".
+#			_filepathmask can contain symbols like `*' and `?' as like
+#				its used in `dir'-shell command.
+#			Function gets file-/folder-list of specified root-dir-_filepathmask
+#				and return this list in array _ARR - where each element:
+#
+#			index - is the _filepath of file-or-folder name-ext
+#			value - contains 3 fields separated by " ":
+#				1. =="D" if this is folder
+#				   ==/[0-9]+/ if this is file - size of file in bytes
+#				2. ==date-of-creation of file or folder
+#				3. ==time-of-creation of file or folder
+#
+#			Function returns quantity of items in ARR.
+#___________________________________________________________________________________
+#
+#	fn	_filexist(_filepath)
+#
+#		Test if file or path or drive specified in _filepath is exist.
+#				If _filepath=="" then no action occured and return "".
+#				If some syntax error found in _filepath then function return ""
+#			(and NO _filepath-cache-record will be created!).
+#				Function returns _filepath if _filepath is exist. Otherwise
+#			function return 0.
+#_____________________________________________________________________________
+#
+#	fn	_filenotexist(_filepath)
+#
+#		Test if file or path or drive specified in _filepath is not exist.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#			Function returns 1 if _filepath is not exist. Otherwise function
+#				return 0.
+#_____________________________________________________________________________
+#
+#	fn	_newdir(_filepath)
+#
+#		Create path specified in root-dir-_filepath.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#			Function returns root-dir of _filepath.
+#_______________________________________________________________________
+#
+#	fn	_newdir(_filepath)
+#
+#		Create path specified in root-dir-_filepath. If this folder
+#		already exist then it will be completely cleared.
+#			If _filepath=="" then no action occured and return "".
+#			If some syntax error found in _filepath then function return ""
+#				(and NO _filepath-cache-record will be created!).
+#			Function returns root-dir of _filepath.
+#___________________________________________________________________________________
+#
+#	fn	_getmpfile(_filepath,_currfilepath)
+#
+#		Return ....
+#
+#_____________________________________________________________________________
+#
+#	fn	_getmpdir(_filepath,_currfilepath)
+#
+#		Return ...
+#
+#_____________________________________________________________________________
+#
+#	Temporary files folder.
+#
+#		Temporary files folder location is defined by _FILEIO_TMPRD.
+#		If it wasn't been initialized before program run or not been initialized
+#			by ENVIRON["TMPDIR"] then it will defined as the:
+#				`current rootdir(stored in _FILEIO_RD)\programname.TMP'
+#			In this case if its already exist then it will completely cleared when _FILEIO
+#			library initialization processed.
+#			And at the program uninitialization processed it will completely
+#			cleared if _FILEIO_TMPCLRFLAG is true.
+#___________________________________________________________________________________
+#
+#	var	_FILEIO_RD (ENVIRON["CD"])
+#
+#		This var can be set before running program. It can contain path which
+#		will be used as default current dir while program run.
+#		If this var is set before program runs - then it will be refreshed by the
+#			_filerd it will be used as default current dir while program run.
+#		If this var is not set before program runs - then ENVIRON["CD"] can also
+#			set up default current dir while program run. If it set before program
+#			begin then it will be refreshed by the _filerd - and also writed into
+#			_FILEIO_RD.
+#		If both _FILEIO_RD and ENVIRON["CD"] are not set before program begins
+#			then real current root\dir will be writed into both _FILEIO_RD and
+#			ENVIRON["CD"] and it will be used as default current dir while program run.
+#
+#___________________________________________________________________________________
+#
+#	var	_FILEIO_TMPRD (ENVIRON["TMPRD"])
+#
+#		This var can be set before running program. It can contain path which
+#		will be used as default temporary files root-folder while program run.
+#		If this var is set before program runs - then it will be refreshed by the
+#			_filerd - and also writed into ENVIRON["TMPRD"].
+#		If this var is not set before program runs - then ENVIRON["TMPRD"] can also
+#			set up default temporary files root-folder while program run. If it set
+#			before program begin then it will be refreshed by the _filerd - and
+#			also writed into _FILEIO_TMPRD.
+#		If both _FILEIO_TMPRD and ENVIRON["TMPRD"] are not set before program begins
+#			then new folder into path specified by the _FILEIO_RD(after its handling)
+#			will be writed into both _FILEIO_TMPRD and ENVIRON["TMPRD"] and it
+#			will be used as default temporary files root-folder while program run.
+#___________________________________________________________________________________
+#
+#	var	_FILEPATH
+#
+#		This var contain filepath of working script. It should be setting up externally.
+#
+#	var	_gawk_scriptlevel
+#___________________________________________________________________________________
+####################################################################################
+END {	###############################################################################
+	if (_constatstrln > 0) {
+		_constat()
+	}
+}
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+
+
+
+# make sure that stdout contain only expected characters
+# make sure that stderr contain only expected characters
+# redesign & reformat keys and its outputs
+# try different key combinations
+# add lib-specified to all libs
+
+#_______________________________________________________________________
+function W(p, p0, p1)
+{
+	#####################################################
+	if (isarray(p0)) {
+		delete p0[p]
+		if (isarray(p1)) {
+			for (i in p1) {
+				if (isarray(p1[i])) {
+					p0[p][i][""]
+					delete p0[p][i][""]
+					_N_i0(p0[p][i], p1[i])
+				} else {
+					p0[p][i] = p1[i]
+				}
+			}
+			return p
+		}
+		return (p0[p] = p1)
+	}
+	delete _[p][p0]
+	if (isarray(p1)) {
+		for (i in p1) {
+			if (isarray(p1[i])) {
+				_[p][p0][i][""]
+				delete _[p][p0][i][""]
+				_N_i0(_[p][p0][i], p1[i])
+			} else {
+				_[p][p0][i] = p1[i]
+			}
+		}
+		return p
+	}
+	return (_[p][p0] = p1)
+}
+
+##########################################################
+function _ARR(c, t, P)
+{
+	switch (c) {
+	case "_lib_CMDLN":
+		return t
+		#___________________________________________________________
+	case "_lib_APPLY":
+		return
+		#___________________________________________________________
+	case "_lib_HELP":
+		return
+		#___________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_ARR 1.0")
+		#___________________________________________________________
+	case "_lib_BEGIN":
+		return
+		#___________________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+##########################################################
+function _BASE(c, t, P, A)
+{
+	switch (c) {
+	case "_lib_CMDLN":
+		if (match(t, /^((--([Vv])ersion)|(-([Vv])))[ \t]*/, A)) {
+			t = substr(t, RLENGTH + 1)
+			_cmdln_version = A[3] A[5]
+		} else if (match(t, /^((-?\?)|(--help))[ \t]*/)) {
+			t = substr(t, RLENGTH + 1)
+			_cmdln_help = 1
+		} else if (match(t, /^--[ \t]*/)) {
+			return _endpass(substr(t, RLENGTH + 1))
+		}
+		return t
+		#___________________________________________________________
+	case "_lib_APPLY":
+		if (_cmdln_help) {
+			match(_fbaccr(_LIBAPI, "_lib_HELP"), /^([^\x00]*)\x00([^\x01]*)\x01(.*)/, A)
+			_out(A[2] A[1] A[3])
+			return _endpass(_basexit_fl = 1)
+		}
+		if (_cmdln_version) {
+			_out(_ln(_PRODUCT_NAME " v" _PRODUCT_VERSION) _ln(_PRODUCT_COPYRIGHT) _ln() (_cmdln_version == "v" ? "" : _lib_NAMEVER()))
+			return _endpass(_basexit_fl = 1)
+		}
+		return
+		#___________________________________________________________
+	case "_lib_HELP":
+		return ("\000" _ln(_PRODUCT_NAME " v" _PRODUCT_VERSION) _ln(_PRODUCT_COPYRIGHT) _ln() _ln(" Usage:") _ln() _ln("    " _PRODUCT_FILENAME " [/key1 /key2...] [-- cmdline]") _ln() _ln(" keys:") _ln() "\001" _ln("    -v -V --version                    - output product version and (if /V) all modules") _ln("    ? -? --help                        - output this help page") _ln("    --                                 - command line string edge"))
+		#___________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_BASE 3.0")
+		#___________________________________________________________
+	case "_lib_BEGIN":
+		return
+		#___________________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+#____________________________________________________________________________
+function _DS(c, t, P, a, A)
+{
+	######################################################
+	switch (c) {
+	#___________________________________________________________
+	case "_lib_CMDLN":
+		return t
+		#_____________________________________________________
+	case "_lib_APPLY":
+		return
+		#_____________________________________________________
+	case "_lib_HELP":
+		return (_ln() _ln(" Usage: " _PRODUCT_NAME " [/key1 /key2...] sourcefile [cmdline]") _ln())
+		#_____________________________________________________
+	case "_lib_NAMEVER":
+		return
+		#_____________________________________________________
+	case "_lib_BEGIN":
+		return
+		#_____________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+#______________________________________________________________________________________________
+function _END()
+{
+	#################################################################################
+}
+
+########################################################
+function _ERRLOG(c, t, P, a, b, A)
+{
+	switch (c) {
+	case "_lib_CMDLN":
+		if (match(t, /^[ \t]*-L:([TtVvIiWwEeFf]*)[ \t]*/, A)) {
+			t = substr(t, RLENGTH + 1)
+			_errlog_errflkey = _errlog_errflkey A[1]
+		}
+		return t
+		#_______________________________________________________________________
+	case "_lib_APPLY":
+		if (_errlog_errflkey) {
+			split(_errlog_errflkey, A, "")
+			for (a = 1; a in A; a++) {
+				if (A[a] == toupper(A[a])) {
+					b = 1
+				} else {
+					b = ""
+				}
+				switch (toupper(A[a])) {
+				case "T":
+					_ERRLOG_TF = b
+					break
+				case "V":
+					_ERRLOG_VF = b
+					break
+				case "I":
+					_ERRLOG_IF = b
+					break
+				case "W":
+					_ERRLOG_WF = b
+					break
+				case "E":
+					_ERRLOG_EF = b
+					break
+				case "F":
+					_ERRLOG_FF = b
+					break
+				}
+			}
+			if (_ERRLOG_IF) {
+				_info("Log-message types inherited acc/deny: " "TRACE " (_ERRLOG_TF ? "ON" : "OFF") "/" "VERBOSE " (_ERRLOG_VF ? "ON" : "OFF") "/" "INFO " (_ERRLOG_IF ? "ON" : "OFF") "/" "WARNING " (_ERRLOG_WF ? "ON" : "OFF") "/" "ERROR " (_ERRLOG_EF ? "ON" : "OFF") "/" "FATAL " (_ERRLOG_FF ? "ON" : "OFF"))
+			}
+		}
+		return
+		#_______________________________________________________________________
+	case "_lib_HELP":
+		return (_ln("    -L:TtVvIiWwEeFf                    - enable(upcase: TVIWEF) or disable(lowcase: tviwef) allowable type of") _ln("                                         log messages. Trace/Verbose/Informational/Warning/Error/Fatal.") _ln())
+		#_______________________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_ERRLOG 1.0")
+		#_______________________________________________________________________
+	case "_lib_BEGIN":
+		P["_ERRLOG_TF"] = _ERRLOG_TF
+		P["_ERRLOG_VF"] = _ERRLOG_VF
+		P["_ERRLOG_IF"] = _ERRLOG_IF
+		P["_ERRLOG_WF"] = _ERRLOG_WF
+		P["_ERRLOG_EF"] = _ERRLOG_EF
+		P["_ERRLOG_FF"] = _ERRLOG_FF
+		P["_errlog_file"] = "/dev/stderr"
+		return
+	}
+}
+
+#______________________________________________________________________________________________
+function _EXIT()
+{
+	################################################################################
+}
+
+########################################################
+function _EXTFN(c, t, P)
+{
+	switch (c) {
+	case "_lib_CMDLN":
+		return t
+		#___________________________________________________________
+	case "_lib_APPLY":
+		return
+		#___________________________________________________________
+	case "_lib_HELP":
+		return
+		#___________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_EXTFN 1.0")
+		#___________________________________________________________
+	case "_lib_BEGIN":
+		return
+		#___________________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+#######################################################
+function _FILEIO(c, t, P, A)
+{
+	switch (c) {
+	case "_lib_CMDLN":
+		if (match(t, /^[ \t]*-[Tt]([\+-])[ \t]*/, A)) {
+			t = substr(t, RLENGTH + 1)
+			if (A[1] == "+") {
+				_fileio_notdeltmpflag = 1
+			} else {
+				_fileio_notdeltmpflag = ""
+			}
+		}
+		return t
+		#___________________________________________________________
+	case "_lib_APPLY":
+		if (_fileio_notdeltmpflag) {
+			_info("Temporary objects deletion DISABLED (inherited)")
+		}
+		return
+		#___________________________________________________________
+	case "_lib_HELP":
+		return (_ln("    -[Tt][+-]                          - inherited: +enable\\-disable temporary files\\dirs deletion") _ln())
+		#___________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_FILEIO 2.1")
+		#___________________________________________________________
+	case "_lib_BEGIN":
+		P["ENVIRON"]["CD"] = ENVIRON["CD"]
+		P["_FILEIO_RD"] = _FILEIO_RD
+		P["_FILEIO_R"] = _FILEIO_R
+		P["_FILEIO_D"] = _FILEIO_D
+		if (! ("_FILEIO_TMPRD" in P)) {
+			P["_FILEIO_TMPRD"] = _getmpdir(_filen(P["SOURCE"]) "." ++_egawk_subcntr _CHR["SUBDIR"])
+		}
+		return
+		#___________________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+############################################################
+
+#_____________________________________________________________________________
+function _FILEVER(c, t, P, a, A)
+{
+	#################################################
+	switch (c) {
+	#___________________________________________________________
+	case "_lib_CMDLN":
+		return t
+		#_____________________________________________________
+	case "_lib_APPLY":
+		return
+		#_____________________________________________________
+	case "_lib_HELP":
+		return
+		#_____________________________________________________
+	case "_lib_NAMEVER":
+		return
+		#_____________________________________________________
+	case "_lib_BEGIN":
+		return
+		#_____________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+function _Foreach(A, f, p0, i)
+{
+	for (i in A) {
+		@f(A, i, p0)
+	}
+}
+
+function _INIT(f)
+{
+}
+
+#___________________________________________________________________________________
+function _INITBASE()
+{
+	################################################################
+	_egawk_utilpath = ENVIRON["EGAWK_PATH"] "BIN\\UTIL\\"
+}
+
+######################################################
+function _INSTRUC(c, t, P)
+{
+	switch (c) {
+	case "_lib_CMDLN":
+		return t
+		#___________________________________________________________
+	case "_lib_APPLY":
+		return
+		#___________________________________________________________
+	case "_lib_HELP":
+		return
+		#___________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_INSTRUC 1.0")
+		#___________________________________________________________
+	case "_lib_BEGIN":
+		return
+		#___________________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+#___________________________________________________________________________________
+
+
+####################################################################################
+
+
+#_____________________________________________________________________________
+function _N(F, v, p)
+{
+	###########################################################
+	for (p in _UIDS) {
+		delete _UIDS[p]
+		return _nN_i0(p, F, v)
+	}
+	return _nN_i0(_tgenuid(), F, v)
+}
+
+#####################################################
+function _SHORTCUT(c, t, P)
+{
+	switch (c) {
+	case "_lib_CMDLN":
+		return t
+		#___________________________________________________________
+	case "_lib_APPLY":
+		return
+		#___________________________________________________________
+	case "_lib_HELP":
+		return
+		#___________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_shortcut 1.0")
+		#___________________________________________________________
+	case "_lib_BEGIN":
+		return
+		#___________________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+#______________________________________________________________________________________________
+function _START(t, i, A)
+{
+	#########################################################################
+	_torexp_init()
+	test_uid()
+	return
+	_conl(patsplit("a,b,c", A, /[^,]/, B))
+	test_splitstr()
+	return
+	A[""]
+	_CLASSPTR["ptr"]
+	ALTARR["ptra"]
+	_conl(_dumparr(SYMTAB))
+	BB[1] = _NOP
+	zorr(1, 2, 3, 4, 5, 6)
+	zorr(BB, 1)
+	_rtn()
+	_rtn("")
+	_rtn(0)
+	_rtn("0")
+	_rtn(1)
+	_rtn("1")
+	_rtn(-1)
+	_rtn("-1")
+	_rtn("huj")
+	_rtn("ptr")
+	_rtn("ptra", ALTARR)
+	_rtn(ALTARR)
+	_rtn(ALTARR, ALTARR)
+	return
+	_tstini()
+	return
+	_splitpath_test()
+	#	_split_regpath()
+	return
+	hh = "CPU"
+	_conl("go1!")
+	_conl(_var(_sharepath(hh, "gdfsgdsgsd sdgsdighjui teretiewrotrewut 345345345 rtjtireutireu huj")))
+	_conl("go2!")
+	_conl(_var(_sharelist(AAA, hh), _dumparr(AAA)))
+	_conline()
+	A[1] = "h"
+	A[3] = "j"
+	t = "pizda"
+	if (match(t, /^pi(Z)da/, A)) {
+		_conl("match")
+	} else {
+		_conl("not match")
+	}
+	_conl(_dumparr(A))
+	return
+	_pathSMA = "C:\\Program Files\\Altiris\\Altiris Agent\\"
+	DSPlugInPath = _pathSMA "Agents\\Deployment\\Agent\\"
+	DSAutoPath = _pathSMA
+	if (! _sysinfo(_SYS, _hostname)) {
+		_fatal("_sysinfo: unknown error")
+	}
+	_REG[""]
+	delete _REG[""]
+	_servoutput = _CHR["EOL"] _cmd("sc query state= all")
+	_dsbasepath = "\\\\CPU\\CPU\\DEV\\PROJECT\\_DS\\"
+	_rdreg(_REG, "HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris")
+	_wrfile("rego.txt", _dumparr(_REG))
+	_conl("fF")
+	#_______________________________________________________________________
+	c = _getreg_i1(DDD, "HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Altiris Agent\\Plugin Objects\\\204~.*\224Install path", _REG)
+	#_________________________________________________________________________________________
+	pp = _n("NAME", "NS")
+	#pp=_n()
+	#___________________________________________________________________________________
+	p = _defsolution(pp, "DS Plug-in", "HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Altiris Agent\\Plugin Objects\\Agents\\")
+	ClientConfiguration = _defdll(p, "Client Configuration", "ClientConfiguration")
+	ClientImagingPrep = _defdll(p, "Client Inaging Preparation", "ClientImagingPrep")
+	ClientImaging = _defdll(p, "Client Imaging", "ClientImaging")
+	ClientPCT = _defdll(p, "Client PCT", "ClientPCT")
+	ClientRebootTo = _defdll(p, "Client Reboot To", "ClientRebootTo")
+	DeploymentAgent = _defdll(p, "Deployment Agent", "Deployment Agent")
+	DeploymentSolutionBaseAgent = _defdll(p, "Deployment Solution Base Agent", "Deployment Solution Base Agent")
+	ClientBCDEdit = _defile(p, "Client BCD Edit", "ClientBCDEdit.dll")
+	ClientCopyFile = _defile(p, "Client Copy File", "ClientCopyFile.dll")
+	ClientPreImage = _defile(p, "Client Pre Image", "ClientPreImage.dll")
+	ClientRebootTo = _defile(p, "Client Reboot To", "ClientRebootTo.dll")
+	_defile(p, "ConfigService.exe", "ConfigService.exe", "")
+	_defile(p, "config.dll", "config.dll", "")
+	_defsrv(p, "DS Plug-in Service", "Altiris Deployment Solution - System Configuration")
+	_defreg(p, "Deployment Agent Path", "HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Deployment\\AgentInstallPath.STR")
+	_defile(p, "Altiris_DeploymentSolutionAgent_7_1_x86.msi", _SYS["OSArchitecture"] == "64-bit" ? "C:\\Program Files\\Altiris\\Altiris Agent\\Agents\\SoftwareManagement\\Software Delivery\\{9D76E4CA-377A-472D-A82E-EDAD77E7E4ED}\\cache\\Altiris_DeploymentSolutionAgent_7_1_x64.msi" : "C:\\Program Files\\Altiris\\Altiris Agent\\Agents\\SoftwareManagement\\Software Delivery\\{4B747D25-612F-48FC-B6B5-9916D1BB755C}\\cache\\Altiris_DeploymentSolutionAgent_7_1_x86.msi", "")
+	_defdir(p, "Deployment Folder", a = gensub(/[^\\]*$/, "", 1, _rdsafe(_REG, "HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Deployment\\AgentInstallPath.STR", "C:\\Program Files\\Altiris\\Altiris Agent\\Agents\\Deployment\\Agent\\")))
+	#___________________________________________________________________________________
+	p = _defsolution(pp, "DS Auto", "HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Altiris Agent\\Plugin Objects\\Agents\\")
+	_defdir(p, "C:\\Boot\\Altiris\\iso\\boot\\fonts\\", "C:\\Boot\\Altiris\\iso\\boot\\fonts\\")
+	_defdir(p, "C:\\Boot\\Altiris\\iso\\sources\\", "C:\\Boot\\Altiris\\iso\\sources\\")
+	_defile(p, "C:\\Boot\\Altiris\\iso\\autoinst.exe", "C:\\Boot\\Altiris\\iso\\autoinst.exe", "")
+	_defile(p, "C:\\Boot\\Altiris\\iso\\autoinst.ini", "C:\\Boot\\Altiris\\iso\\autoinst.ini", "")
+	_defile(p, "C:\\Boot\\Altiris\\iso\\autoutil.exe", "C:\\Boot\\Altiris\\iso\\autoutil.exe", "")
+	_defile(p, "C:\\Boot\\Altiris\\iso\\autoutil.ini", "C:\\Boot\\Altiris\\iso\\autoutil.ini", "")
+	_defile(p, "C:\\Boot\\Altiris\\iso\\bcdedit.exe", "C:\\Boot\\Altiris\\iso\\bcdedit.exe", "")
+	_defile(p, "C:\\Boot\\Altiris\\iso\\bootmgr", "C:\\Boot\\Altiris\\iso\\bootmgr", "")
+	_defile(p, "C:\\Boot\\Altiris\\iso\\bootsect.exe", "C:\\Boot\\Altiris\\iso\\bootsect.exe", "")
+	_defreg(p, "Deployment Automation reg.File", "HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\AutoUtil\\File.XSZ", "autoutil.exe")
+	_defreg(p, "Deployment Automation reg.Path", "HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\AutoUtil\\Path.XSZ", "%systemdrive%\\boot\\altiris\\iso")
+	#_________________________________________________________________________________________
+	_check(pp)
+	#_________________________________________________________________________________________
+	_conl(_report(pp))
+	_wrfile("report.txt", _report(pp))
+}
+
+#########################################################
+function _SYSIO(c, t, P)
+{
+	switch (c) {
+	case "_lib_CMDLN":
+		return t
+		#___________________________________________________________
+	case "_lib_APPLY":
+		return
+		#___________________________________________________________
+	case "_lib_HELP":
+		return
+		#___________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_SYSIO 1.0")
+		#___________________________________________________________
+	case "_lib_BEGIN":
+		return
+		#___________________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+#_______________________________________________________________________
+########################################################################
+function _W(p, A, v)
+{
+	if (isarray(v)) {
+		if (p) {
+			delete A[p]
+			A[p][""]
+			delete A[p][""]
+			_movarr(A[p], v)
+		}
+		return p
+	}
+	if (p) {
+		delete A[p]
+		return (A[p] = v)
+	}
+	return v
+}
+
+#_______________________________________________________________________
+function _Zexparr(S, s, t, i)
+{
+	##############################################
+	t = ""
+	if (isarray(S)) {
+		for (i in S) {
+			t = t (isarray(S[i]) ? (_Zexparr_i1(i) "\020" _Zexparr_i0(S[i]) "\021\021\020") : (_Zexparr_i2(_Zexparr_i3(i) "\021" _Zexparr_i3(S[i])) "\020"))
+		}
+	}
+	if (s != "") {
+		gsub(/\x1B/, "\033;", s)
+		gsub(/\x10/, "\0330", s)
+		t = t "\021\021\020" s
+	}
+	gsub(/\x0A/, "\033:", t)
+	return t
+}
+
+#_________________________________________________________________
+function _Zexparr_i0(S, t, i)
+{
+	for (i in S) {
+		t = t (isarray(S[i]) ? (_Zexparr_i1(i) "\020" _Zexparr_i0(S[i]) "\021\021\020") : (_Zexparr_i2(_Zexparr_i3(i) "\021" _Zexparr_i3(S[i])) "\020"))
+	}
+	return t
+}
+
+#_________________________________________________________________
+function _Zexparr_i1(t)
+{
+	gsub(/\x1B/, "\033;", t)
+	gsub(/\x11/, "\0331", t)
+	gsub(/\x10/, "\0330", t)
+	return t
+}
+
+#_________________________________________________________________
+function _Zexparr_i2(t)
+{
+	gsub(/\x10/, "\0330", t)
+	return t
+}
+
+#_________________________________________________________________
+function _Zexparr_i3(t)
+{
+	gsub(/\x1B/, "\033;", t)
+	gsub(/\x11/, "\0331", t)
+	return t
+}
+
+#_______________________________________________________________________
+function _Zimparr(D, t, A, B)
+{
+	##############################################
+	if (isarray(D)) {
+		split(t, A, /\x10/, B)
+		t = _Zimparr_i0(A, B, _Zimparr_i1(D, A, B, 1))
+		gsub(/\x1B\x30/, "\020", t)
+		gsub(/\x1B\x3B/, "\033", t)
+		return t
+	}
+}
+
+#_________________________________________________________________
+function _Zimparr_i0(A, B, i)
+{
+	return (i in A ? (A[i] B[i] _Zimparr_i0(A, B, i + 1)) : "")
+}
+
+#_________________________________________________________________
+function _Zimparr_i1(D, A, B, i, t, a, n)
+{
+	while (i in B) {
+		if ((t = A[i++]) == "\021\021") {
+			return i
+		}
+		gsub(/\x1B\x30/, "\020", t)
+		if ((a = index(t, "\021")) > 0) {
+			if (isarray(D[n = _Zimparr_i2(substr(t, 1, a - 1))])) {
+				delete D[n]
+			}
+			D[n] = _Zimparr_i2(substr(t, a + 1))
+		} else {
+			if (! isarray(D[t = _Zimparr_i2(t)])) {
+				delete D[t]
+				D[t][""]
+				delete D[t][""]
+			}
+			i = _Zimparr_i1(D[t], A, B, i)
+		}
+	}
+}
+
+#_________________________________________________________________
+function _Zimparr_i2(t)
+{
+	gsub(/\x1B\x31/, "\021", t)
+	gsub(/\x1B\x3B/, "\033", t)
+	return t
+}
+
+#_____________________________________________________________________________
+function _Zimport(t, p, A, c, i, n, B)
+{
+	##############################################
+	if (p) {
+		c = split(t, B, /\x0A/)
+		for (i = 1; i <= c; i++) {
+			if ((t = B[i]) == "") {
+				continue
+			}
+			gsub(/\x1B\x3A/, "\n", t)
+			if (match(t, /^_ERRLOG: /)) {
+				_tLOG[n = _wLCHLD(p, _N())][""]
+				delete _tLOG[n][""]
+				_Zimparr(_tLOG[n], substr(t, 10))
+			} else if ((t = _pass(_IMPORT, t, p, A)) != "") {
+				gsub(/\x1B\x3B/, "\033", t)
+				_wLCHLD(p, _N(_tSTR, t))
+			}
+		}
+		return p
+	} else {
+		_expout(t)
+	}
+}
+
+function _acc(A, a, t)
+{
+	if (t) {
+		if (_VLDMAXSTRING < length(t) + length(a)) {
+			if (a) {
+				if (_VLDMAXSTRING < length(t)) {
+					A[--A[_ARRPTR]] = a
+					A[--A[_ARRPTR]] = t
+				} else {
+					A[--A[_ARRPTR]] = a t
+				}
+			} else {
+				A[++A[_ARRLEN]] = t
+			}
+			return ""
+		}
+		return (a t)
+	}
+	return a
+}
+
+function _accmpu(A, a, n)
+{
+	if (n) {
+		return (_mpufn0 = n)
+	}
+	if (_mpuacc) {
+		if (_VLDMAXSTRING < length(_mpuacc) + length(a)) {
+			if (a) {
+				if (_VLDMAXSTRING < length(_mpuacc)) {
+					A[--A[_ARRLEN]] = a
+					A[--A[_ARRLEN]] = _mpuacc
+				} else {
+					A[--A[_ARRLEN]] = a _mpuacc
+				}
+			} else {
+				A[--A[_ARRLEN]] = _mpuacc
+			}
+			_mpuacc = ""
+		} else {
+			_mpuacc = a _mpuacc
+		}
+	} else {
+		_mpuacc = a
+	}
+}
+
+#_______________________________________________________________________
+function _add(S, sf, D, df)
+{
+	################################################
+	if (sf in S) {
+		if (isarray(S[sf])) {
+			if (df in D) {
+				if (isarray(D[df])) {
+					return _extarr(D[df], S[sf])
+				}
+				delete D[df]
+			}
+			D[df][""]
+			delete D[df][""]
+			return _extarr(D[df], S[sf])
+		} else {
+			if (isarray(D[df])) {
+				delete D[df]
+			}
+			D[df] = D[df] S[sf]
+		}
+	}
+}
+
+#_________________________________________________________________
+function _addarr(D, S)
+{
+	#############################################
+	if (isarray(S)) {
+		_addarr_i0(D, S)
+	}
+}
+
+#_____________________________________________________
+function _addarr_i0(D, S, i)
+{
+	for (i in S) {
+		if (isarray(S[i])) {
+			delete D[i]
+			D[i][""]
+			delete D[i][""]
+			_addarr_i0(D[i], S[i])
+		} else {
+			delete D[i]
+			D[i] = S[i]
+		}
+	}
+}
+
+#_______________________________________________________________________
+function _addarrmask(D, S, M)
+{
+	#############################################
+	for (_addarrmaski0 in M) {
+		if (_addarrmaski0 in S) {
+			if (isarray(S[_addarrmaski0])) {
+				if (! isarray(D[_addarrmaski0])) {
+					delete D[_addarrmaski0]
+					D[_addarrmaski0][""]
+					delete D[_addarrmaski0][""]
+				}
+				if (isarray(M[_addarrmaski0])) {
+					_addarrmask(D[_addarrmaski0], S[_addarrmaski0], M[_addarrmaski0])
+				} else {
+					_extarr_i0(D[_addarrmaski0], S[_addarrmaski0])
+				}
+			} else {
+				if (isarray(D[_addarrmaski0])) {
+					delete D[_addarrmaski0]
+				}
+				D[_addarrmaski0] = S[_addarrmaski0]
+			}
+		} else {
+			delete D[_addarrmaski0]
+		}
+	}
+}
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+#_______________________________________________________________________
+function _addf(A, f)
+{
+	#####################################################
+	A["B"][""] = A["F"][A["B"][f] = A["B"][""]] = f
+}
+
+#___________________________________________________________
+function _addfile(f, d, a, b)
+{
+	##################################
+	if (((f = _wfilerdnehnd(f)) == "") || (_filene(f) == "")) {
+		ERRNO = "Filename error"
+		return
+	}
+	a = BINMODE
+	BINMODE = "rw"
+	b = ORS
+	ORS = ""
+	ERRNO = ""
+	print(d) >> f
+	if (ERRNO) {
+		return ""
+	}
+	close(f)
+	BINMODE = a
+	ORS = b
+	if (ERRNO) {
+		return ""
+	}
+	return d
+}
+
+#_____________________________________________________________________________
+function _addlib(f)
+{
+	###########################################################
+	_addf(_LIBAPI, f)
+}
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+#_______________________________________________________________________
+function _addlist(A, v)
+{
+	##################################################
+	A[++A[0]] = v
+}
+
+############################################
+
+#_______________________________________________________________________
+function _bearray(A)
+{
+	####################################################
+	if (isarray(A) || (A == 0 && A == "")) {
+		return 1
+	}
+}
+
+#_________________________________________________________________
+function _bframe(A, t, p)
+{
+	###########################################
+	return _bframe_i0(A, t, p, A[""])
+}
+
+#___________________________________________________________
+function _bframe_i0(A, t, p, f)
+{
+	return (f ? (_bframe_i0(A, t, p, A[f]) (@f(t, p))) : "")
+}
+
+# add to _dumparr: checking that if element is undefined
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+function _cfguid(p, optr, pfx, sfx, hstrcnt, lstrchr)
+{
+	#################### 0 #
+	delete _UIDOBL[p]
+	if (_isptr(optr)) {
+		if (optr == p) {
+			delete _UIDOBLV[p]
+			delete _UIDOBLV[_UIDOBLV[_UIDOBL[p] = p][""] = p][""]
+		} else if (optr in _UIDOBL) {
+			_UIDOBL[p] = _UIDOBL[optr]
+		}
+	}
+	_UIDPFX[p] = _istr(pfx) ? pfx : ""
+	_UIDSFX[p] = _istr(sfx) ? sfx : ""
+	if (_isptr(hstrcnt)) {
+		if (hstrcnt != p) {
+			_UIDCHR[p] = _UIDCHR[_UIDCNT[p] = _UIDCNT[hstrcnt]]
+			return p
+		}
+		hstrcnt = _NOP
+	}
+	_UIDCNTL[_UIDCNT[p] = p] = _cfguidchr(p, hstrcnt, lstrchr)
+	return p
+}
+
+#_____________________________________________________
+function _cfguidchr(p, h, l, H, L)
+{
+	if (_isptr(l)) {
+		if (l != p) {
+			return (_UIDCHR[p] = _UIDCHR[l])
+		}
+		_UIDCHR[p] = p
+		l = _NOP
+	}
+	_UIDCHR[p] = p
+	_splitstr(H, h, _UIDCHRH[_classys])
+	_splitstr(L, l, H)
+	delete _UIDCHRH[_UIDCHRH[p][""] = p][""]
+	delete _UIDCHRL[_UIDCHRL[p][""] = p][""]
+	_cfguidh(p, H, L)
+	return _cfguidl(p, L, L)
+}
+
+#_______________________________________________
+function _cfguidh(p, H, L, hi, h, li)
+{
+	for (hi = 1; hi in H; hi++) {
+		h = H[hi]
+		for (li = 1; li in L; li++) {
+			_UIDCHRH[p][h L[li]]
+		}
+	}
+}
+
+function _cfguidl(p, H, L, hi, h, hl, li)
+{
+	for (hi = 1; hi in H; hi++) {
+		h = H[hi]
+		for (li = 1; li in L; li++) {
+			hl = _UIDCHRL[p][hl] = h L[li]
+		}
+	}
+	return hl
+}
+
+#____________________________________________________________________________________________________
+function _check(p)
+{
+	####################################################################################
+	_dll_check(p)
+	_file_check(p)
+	_serv_check(p)
+	_reg_check(p)
+}
+
+#_______________________________________________________________________
+function _chrline(t, ts, w, s)
+{
+	#############################################
+	return (t = " " _tabtospc(t, ts) (t ? t ~ /[ \t]$/ ? "" : " " : "")) _getchrln(s ? s : "_", (w ? w : _CON_WIDTH - 1) - length(t)) _CHR["EOL"]
+}
+
+#_____________________________________________________________________________
+function _cmd(c, i, A)
+{
+	#######################################################
+	_fio_cmda = RS
+	RS = ".{1,}"
+	_fio_cmdb = BINMODE
+	BINMODE = "rw"
+	ERRNO = RT = _NUL
+	c | getline RS
+	BINMODE = _fio_cmdb
+	RS = _fio_cmda
+	if (ERRNO || 0 > (_exitcode = close(c))) {
+		return (RT = _NOP)
+	}
+	return RT
+}
+
+#_______________________________________________________________________
+function _cmparr(A0, A1, R, a, i)
+{
+	##########################################
+	a = 0
+	delete R
+	for (i in A0) {
+		if (! (i in A1)) {
+			a++
+			R[i] = 0
+		} else if (A0[i] != A1[i]) {
+			a++
+			R[i] = 2
+		}
+	}
+	for (i in A1) {
+		if (! (i in A0)) {
+			a++
+			R[i] = 1
+		}
+	}
+	return a
+}
+
+#_____________________________________________________________________________
+function _con(t, ts, a, b, c, d, i, r, A, B)
+{
+	##########################################
+	d = RLENGTH
+	if ((c = split(r = t, A, /\x0D?\x0A/, B)) > 0) {
+		a = BINMODE
+		b = ORS
+		BINMODE = "rw"
+		ORS = ""
+		if (c > 1) {
+			if ((i = length(t = _tabtospc(A[1], ts, _conlastrln))) < _constatstrln) {
+				t = t _getchrln(" ", _constatstrln - i)
+			}
+			print((t B[1])) > _SYS_STDCON
+			for (i = 2; i < c; i++) {
+				print((_tabtospc(A[i], ts) B[i])) > _SYS_STDCON
+			}
+			print((_conlastr = _tabtospc(A[c], ts))) > _SYS_STDCON
+			fflush(_SYS_STDCON)
+		} else {
+			print((t = _tabtospc(t, ts, _conlastrln))) > _SYS_STDCON
+			fflush(_SYS_STDCON)
+			_conlastr = _conlastr t
+		}
+		if ((i = length(_conlastr)) >= _CON_WIDTH) {
+			_conlastr = substr(_conlastr, 1 + (int(i / _CON_WIDTH) * _CON_WIDTH))
+		}
+		_conlastrln = length(_conlastr)
+		if (_constatstr) {
+			print(((t = _constatgtstr(_constatstr, _CON_WIDTH - 1 - _conlastrln)) _CHR["CR"] _conlastr)) > _SYS_STDCON
+			fflush(_SYS_STDCON)
+			_constatstrln = length(t)
+		}
+		BINMODE = a
+		ORS = b
+		RLENGTH = d
+		return r
+	}
+	RLENGTH = d
+}
+
+#_______________________________________________________________________
+function _conin(t, a, b)
+{
+	#################################################
+	_constatpush()
+	_constat()
+	a = BINMODE
+	b = RS
+	BINMODE = "rw"
+	RS = "\n"
+	_con(t)
+	getline t < "CON"
+	close("CON")
+	_conlastrln = 0
+	_conlastr = ""
+	gsub(/[\x0D\x0A]+/, "", t)
+	BINMODE = a
+	RS = b
+	_constatpop()
+	return t
+}
+
+#_______________________________________________________________________
+function _conl(t, ts)
+{
+	####################################################
+	return _con(t (t ~ /\x0A$/ ? "" : _CHR["EOL"]), ts)
+}
+
+#_______________________________________________________________________
+function _conline(t, ts)
+{
+	#################################################
+	return _con(_chrline(t, ts))
+}
+
+#___________________________________________________________________________________
+####################################################################################
+function _conlq(t, ts)
+{
+	return _conl("`" t "'", ts)
+}
+
+#_______________________________________________________________________
+function _constat(t, ts, ln, a)
+{
+	###########################################
+	if (_constatstrln > (ln = length(t = _constatgtstr(_constatstr = _tabtospc(t, ts), _CON_WIDTH - 1 - _conlastrln)))) {
+		t = t _getchrln(" ", _constatstrln - ln)
+	}
+	_constatstrln = ln
+	ln = ORS
+	a = BINMODE
+	BINMODE = "rw"
+	ORS = ""
+	print((t _CHR["CR"] _conlastr)) > _SYS_STDCON
+	fflush(_SYS_STDCON)
+	ORS = ln
+	BINMODE = a
+	return _constatstr
+}
+
+#_________________________________________________________________
+function _constatgtstr(t, ln, a, b)
+{
+	if (ln < 1) {
+		return ""
+	}
+	if ((a = length(t)) <= ln) {
+		return t
+	}
+	if (ln < 11) {
+		return substr(t, a - ln + 1)
+	}
+	if (ln < 19) {
+		return ("..." substr(t, a - ln + 4))
+	}
+	return (substr(t, 1, b = int((ln - 3) / 2)) "..." substr(t, a - ln + b + 4))
+}
+
+#_______________________________________________________________________
+function _constatpop()
+{
+	##################################################
+	if (_CONSTATPUSH[0] > 0) {
+		return _constat(_CONSTATPUSH[_CONSTATPUSH[0]--])
+	}
+	return _constat("")
+}
+
+#_______________________________________________________________________
+function _constatpush(t, ts)
+{
+	#############################################
+	_CONSTATPUSH[++_CONSTATPUSH[0]] = _constatstr
+	if (t) {
+		_constat(t, ts)
+	}
+	return _constatstr
+}
+
+#___________________________________________________________________________________
+function _creport(p, t, f, z)
+{
+	_[p]["REPORT"] = _[p]["REPORT"] _ln(t (f == "" ? "" : ": " f))
+}
+
+#_________________________________________________________________________________________
+function _defdir(pp, n, f, v, p)
+{
+	#############################################################
+	_[p = _wLCHLD(pp, _n("TYPE", "defdir"))]["NAME"] = n
+	_[p]["DIR"] = f
+	return p
+}
+
+#_________________________________________________________________________________________
+function _defdll(pp, n, rn, p)
+{
+	##############################################################
+	_[p = _wLCHLD(pp, _n("TYPE", "defdll"))]["NAME"] = n
+	_[p]["REGPATH"] = _[pp]["REGPATH"] rn
+	_[p]["ERRHOST"] = pp
+	return p
+}
+
+#___________________________________________________________
+function _defescarr(D, r, S, i, c, t)
+{
+	if (isarray(S)) {
+		for (i = 0; i < 256; i++) {
+			if ((c = _CHR[i]) ~ r) {
+				D[c] = "\\" S[c]
+				t = t c
+			} else if (D[c] == "") {
+				D[c] = c
+			}
+		}
+	} else {
+		for (i = 0; i < 256; i++) {
+			if ((c = _CHR[i]) ~ r) {
+				D[c] = S c
+				if (S != "") {
+					t = t c
+				}
+			} else if (D[c] == "") {
+				D[c] = c
+			}
+		}
+	}
+	return t
+}
+
+#_________________________________________________________________________________________
+function _defile(pp, n, f, v, p)
+{
+	#############################################################
+	_[p = _wLCHLD(pp, _n("TYPE", "defile"))]["NAME"] = n
+	_[p]["FILE"] = f
+	if (! (v == 0 && v == "")) {
+		_[p]["RQVERSION"] = v
+	}
+	return p
+}
+
+#_______________________________________________________________________
+function _defn(f, c, v)
+{
+	###################################################
+	FUNCTAB[c f] = v
+}
+
+#_________________________________________________________________________________________
+function _defreg(pp, n, f, v, p)
+{
+	#############################################################
+	_[p = _wLCHLD(pp, _n("TYPE", "defreg"))]["NAME"] = n
+	_[p]["REGPATH"] = f
+	if (! (v == 0 && v == "")) {
+		_[p]["VALUE"] = v
+	}
+}
+
+#_______________________________________________________________________________________________
+function _defsolution(pp, n, rn, p)
+{
+	###############################################################
+	_[p = _wLCHLD(pp, _n("TYPE", "solution"))]["NAME"] = n
+	_[p]["REGPATH"] = rn
+	_[p]["ERRHOST"] = pp
+	return p
+}
+
+#_________________________________________________________________________________________
+function _defsrv(pp, n, f, v, p)
+{
+	#############################################################
+	_[p = _wLCHLD(pp, _n("TYPE", "defsrv"))]["NAME"] = n
+	_[p]["SERVNAME"] = f
+	return p
+}
+
+#_______________________________________________________________________
+function _del(f, c, a, A)
+{
+	#################################################
+	if (match(f, /\\[ \t]*$/)) {
+		if ((c = toupper(_filerd(f))) && (length(f) == FLENGTH)) {
+			_cmd("rd " c " /S /Q 2>NUL")
+			_deletepfx(_WFILEROOTDIR, c)
+			_deletepfx(_FILEIO_RDTMP, c)
+			_deletepfx(_FILEIO_RDNETMP, c)
+		} else {
+			_conl("HUJ TEBE!")
+			return ""
+		}
+	} else {
+		a = _dir(A, f)
+		_cmd("del " f " /Q 2>NUL")
+		for (c in A) {
+			if (c ~ /\\$/) {
+				_cmd("rd " c " /S /Q 2>NUL")
+				_deletepfx(_WFILEROOTDIR, c)
+				_deletepfx(_FILEIO_RDTMP, c)
+			}
+			_deletepfx(_FILEIO_RDNETMP, c)
+		}
+	}
+	return a
+}
+
+#_______________________________________________________________________
+function _delay(t, a)
+{
+	###################################################
+	for (a = 1; a <= t; a++) {
+		_delayms()
+	}
+}
+
+#_________________________________________________________________
+function _delayms(a)
+{
+	#############################################
+	for (a = 1; a <= _delay_perfmsdelay; a++) {
+	}
+}
+
+#_______________________________________________________________________
+function _deletepfx(A, f, B, le, i)
+{
+	########################################
+	le = length(f)
+	for (i in A) {
+		if (substr(toupper(i), 1, le) == f) {
+			B[i] = A[i]
+			delete A[i]
+		}
+	}
+}
+
+#_________________________________________________________________
+function _delf(A, f)
+{
+	###############################################
+	A["B"][A["F"][A["B"][f]] = A["F"][f]] = A["B"][f]
+	delete A["F"][f]
+	delete A["B"][f]
+}
+
+#_______________________________________________________________________
+function _deluid(p)
+{
+	################################################# 1 #
+	if (p in _CLASSPTR) {
+		_deluida0 = _CLASSPTR[p]
+		if (_deluida0 in _UIDOBL) {
+			_UIDOBLV[_UIDOBL[_deluida0]][p]
+		}
+	}
+	delete _CLASSPTR[p]
+	return _deluida0
+}
+
+#_______________________________________________________________________
+function _dir(A, rd, i, r, f, ds, pf, B, C)
+{
+	####################################
+	delete A
+	gsub(/(^[ \t]*)|([ \t]*$)/, "", rd)
+	if (rd == "") {
+		return ""
+	}
+	i = split(_cmd("dir \"" rd "\" 2>NUL"), B, /\x0D?\x0A/) - 3
+	pf = (match(B[4], /Directory of ([^\x00-\x1F]+)/, C) ? (C[1] (C[1] ~ /\\$/ ? "" : "\\")) : "")
+	for (r = 0; i > 5; i--) {
+		if (match(B[i], /^([^ \t]*)[ \t]+([^ \t]*)[ \t]+((<DIR>)|([0-9\,]+))[ \t]+([^\x00-\x1F]+)$/, C)) {
+			if (C[6] !~ /^\.\.?$/) {
+				if (C[4]) {
+					ds = "D "
+				} else {
+					ds = C[5] " "
+					gsub(/\,/, "", ds)
+				}
+				if ((f = _filepath(pf C[6] (C[4] ? "\\" : ""))) != "") {
+					A[f] = ds C[1] " " C[2]
+					r++
+				}
+			}
+		}
+	}
+	return r
+}
+
+#_________________________________________________________________
+function _dirtree(A, f, B)
+{
+	#########################################
+	gsub(/(^[ \t]*)|([ \t]*$)/, "", f)
+	delete A
+	A[""]
+	delete A[""]
+	_dirtree_i0(B, 8, split(_cmd("dir \"" f "\" /-C /S 2>NUL"), B, /\x0D?\x0A/), A, f = _filerd(f))
+	return f
+}
+
+#___________________________________________________________
+function _dirtree_i0(B, i, c, A, f, lf, a, C)
+{
+	delete A[f]
+	A[f][0]
+	delete A[f][0]
+	lf = length(f)
+	for (; i <= c; ) {
+		if (match(B[i], /^[ \t]*Directory of (.+)/, C)) {
+			if (substr(a = _filerd(C[1] "\\"), 1, lf) == f) {
+				i = _dirtree_i0(B, i + 4, c, A[f], a)
+			} else {
+				return i
+			}
+		} else if (match(B[i++], /^([^ \t\-]+)\-([^ \t\-]+)\-([^ \t]+)[ \t]+([^ \t]+)[ \t]+([0-9]+)[ \t]+(.+)$/, C)) {
+			A[f][f C[6]] = C[5] " " C[1] "/" _CHR["MONTH"][C[2]] "/" C[3] " " C[4]
+		}
+	}
+	return i
+}
+
+#_______________________________________________________________________
+function _dll_check(pp)
+{
+	_dllchktv = ""
+	_missfl = 1
+	_tframe("_dll_check_i0", pp, _REG, pp)	#also check that all dll have same version; also check that all dlls have success and then report that DS plug-in version n - installed
+	if (1 || "AGENT" in _[pp]) {
+		if (_dllchktv != _[pp][".Product Version"]) {
+			_dllerr(_[pp]["AGENT"], "agent version (" _[pp][".Product Version"] ") do not match all lib versions: " _dllchktv "'")
+		}
+	} else if (! _missfl) {
+		_creport(pp, "agent not detected in registry")
+	} else {
+		_dllerr(pp, "agent not detected in registry but some registry entries exist:")
+		_tframe("_dll_check_i1", pp, pp)
+	}
+}
+
+#_______________________________________________
+function _dll_check_i0(p, R, pp, p2, i, i2, r, f, v, rs, d, tv, tf)
+{
+	if (_[p]["TYPE"] == "defdll") {
+		r = toupper(_[p]["REGPATH"])
+		rs = 0
+		tf = 0
+		tv = ""
+		for (i in R) {
+			if (toupper(substr(i, 1, length(r))) == r) {
+				if ((_chka0 = substr(i, 1 + length(r), 1)) == "" || _chka0 == "\\") {
+					rs = 1
+					_missfl = 1
+					_[p]["." substr(gensub(/\....$/, "", 1, i), i2 = 2 + length(r), length(i) - i2 + 1)] = R[i]
+					if (chka0 != "") {
+						rs = 1
+					}
+				}
+			}
+		}	#{ rs=_missfl=1; _[p]["." gensub(/^([^\\]+\\)+(.*)\..../,"\\2","G",i)]=R[i] } }
+		if (rs) {
+			if ((i = ".Install Path") in _[p] && (i = ".Product Version") in _[p]) {
+				_[p]["STATUS"] = "PRESENT"
+				f = _[p][".Install Path"]
+				v = _[p][".Product Version"]
+				if (! (".Module" in _[p])) {
+					_[pp][".Product Version"] = v
+					_VAR["HKEY_LOCAL_MACHINE\\SOFTWARE\\Altiris\\Deployment\\AgentInstallPath.STR"] = f
+					_[pp]["AGENT"] = p
+					_creport("OK:  DLL DETECTED(" v "): " substr(_[p]["NAME"], 1, 112))
+				} else {
+					if (_dllchktv == "") {
+						_dllchktv = v
+					} else if (v != _dllchktv) {
+						return _dllerr(p, "different versions detected: " _dllchktv "!=" v "'")
+					}
+					ERRNO = ""
+					if (_th1(_[p]["DATA"] = _rdfile(f), ERRNO)) {
+						delete _[p]["DATA"]
+						return _dllerr(p, "read lib: " ERRNO, f)
+					}
+					if (v != (_[p]["VERSION"] = _getfilever(f))) {
+						return _dllerr(p, "library file version mismatch: ==`" _[p]["VERSION"] "'; !=`" v "'", f)
+					}
+					_creport(p, "OK:    LIBRARY DETECTED(" v "): " substr(f, 1, 100))
+				}
+			} else {
+				tf = 1
+				_dllerr(p, "registry corrupt: `" i "' not present")
+			}
+		} else {
+			_[p]["STATUS"] = "MISSED"
+		}
+	}
+}
+
+#_______________________________________________
+function _dll_check_i1(p, pp, p1, p2, p3, i)
+{
+	if (_[p]["TYPE"] == "defdll") {
+		for (i in _[p]) {
+			if (i ~ /^\./) {
+				_dllerr(pp, "          " _[p]["REGPATH"] "\\" substr(i, 2))
+			}
+		}
+	}
+}
+
+#___________________________________________________________________________________
+function _dllerr(p, t, f)
+{
+	if (t !~ /\x00/) {
+		t = "ERROR: \000" t
+	}
+	_errfl = 1
+	_[p]["ERROR"] = _[p]["ERROR"] _ln(t (f == "" ? "" : ": " f))
+}
+
+function _drawuid(p, cn, ch, o)
+{
+	_conl("uid: " p)
+	_conl("\toblptr: " (p in _UIDOBL ? _UIDOBL[p] "'" : "-"))
+	if (p in _UIDOBL) {
+		if (! _isptr(o = _UIDOBL[p])) {
+			_conl(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> oblptr not pointer")
+		}
+		if (! isarray(_UIDOBLV[o])) {
+			_conl(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> no OBLV array at ptr")
+		}
+	}
+	_conl("\tprefix:   " (p in _UIDPFX ? _UIDPFX[p] "'" : "-"))
+	_conl("\tsuffix:   " (p in _UIDSFX ? _UIDSFX[p] "'" : "-"))
+	_conl("\tcounters: " (cn = p in _UIDCNT ? _UIDCNT[p] "'" : "-"))
+	if (cn != "-") {
+		_conl("\t\tcntrL:   " _UIDCNTL[_UIDCNT[p]] "'")
+		_conl("\t\tcntrH:   " _UIDCNTH[_UIDCNT[p]] "'")
+	}
+	_conl("\tcharset:  " (ch = p in _UIDCHR ? _UIDCHR[p] "'" : "-"))
+	if (ch != "-") {
+		_conl("chrH:    ")
+		_conl(_dumparr(_UIDCHRH[_UIDCHR[p]]))
+		_conl()
+		_conl("chrL:    ")
+		_conl(_dumparr(_UIDCHRL[_UIDCHR[p]]))
+		_conl()
+	}
+}
+
+#_______________________________________________________________________
+function _dumparr(A, t, lv, a)
+{
+	############################################
+	b = PROCINFO["sorted_in"]
+	PROCINFO["sorted_in"] = "_lengthsort"
+	if (isarray(A)) {
+		delete _DUMPARR
+		_dumparrc = _dumparrd = ""
+		_dumparr_i1(A, lv = (lv == "" ? 16 : lv == 0 || (lv + 0) != 0 ? lv : lv == "-*" ? -3 : lv ~ /^\+?\*$/ ? 3 : 16) + 0, lv < 0 ? -1 : 1, 0, _tabtospc(t))
+		PROCINFO["sorted_in"] = a
+		return _retarrd(_DUMPARR, _dumparrd, _dumparrd = "")
+	}
+}
+
+#___________________________________________________________
+function _dumparr_i1(A, lv, ls, ln, t, t2, i, a, f)
+{
+	t2 = _getchrln(" ", length(t))
+	if (ln == lv) {
+		if (ls > 0) {
+			for (i in A) {
+				++a
+			}
+		} else {
+			for (i in A) {
+				isarray(A[i]) ? ++a : ""
+			}
+		}
+		if (length(_dumparrd = _dumparrd t (a > 0 ? " ... (x" a ")" : "") _CHR["EOL"]) > 262144) {
+			_DUMPARR[++_dumparrc] = _dumparrd
+			_dumparrd = ""
+		}
+		return
+	}
+	if (ls >= 0) {
+		for (i in A) {
+			if (! isarray(A[i])) {
+				if (length(_dumparrd = _dumparrd (f ? t2 : t _nop(f = 1)) "[" i "]=" A[i] "'" _CHR["EOL"]) > 262144) {
+					_DUMPARR[++_dumparrc] = _dumparrd
+					_dumparrd = ""
+				}
+			}
+		}
+	}
+	for (i in A) {
+		if (isarray(A[i])) {
+			_dumparr_i1(A[i], lv, ls, ln + ls, _th0(f ? t2 : t, f = 1) "[" i "]")
+		}
+	}
+	if (! f) {
+		if (length(_dumparrd = _dumparrd t _CHR["EOL"]) > 262144) {
+			_DUMPARR[++_dumparrc] = _dumparrd
+			_dumparrd = ""
+		}
+	}
+}
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+#___________________________________________________________________________________
+# OTHER tFUNCTIONs #################################################################
+
+#_____________________________________________________________________________
+function _dumpobj(p, f, t, s)
+{
+	###################################################
+	s = _dumpobj_i0(p, f, t = t "." p "{")
+	if ((p = _rFCHLD(p))) {
+		return (s = s _dumpobjm(p, f, s ? _getchrln(" ", length(t) - 1) : t " "))
+	}
+	return s
+}
+
+#___________________________________________________________
+function _dumpobj_i0(p, f, t)
+{
+	if (f == "") {
+		return _dumpobj_i2(p, t)
+	}
+	if (f == 0) {
+		return _dumpobj_i1(p, t " ")
+	}
+	return (_dumpobj_i1(p, t " ") _dumpobj_i2(p, _getchrln(" ", length(t))))
+}
+
+#___________________________________________________________
+function _dumpobj_i1(p, t)
+{
+	return _ln(t substr(((p in _tPREV) ? "\253" _tPREV[p] : "") "       ", 1, 7) " " substr(((p in _tPARENT) ? "\210" _tPARENT[p] : "") "       ", 1, 7) " " substr(((p in _tFCHLD) ? _tFCHLD[p] : "") "\205" ((p in _tQCHLD) ? " (" _tQCHLD[p] ") " : "\205") "\205" ((p in _tLCHLD) ? _tLCHLD[p] : "") "                      ", 1, 22) substr(((p in _tNEXT) ? "\273" _tNEXT[p] : "") "        ", 1, 8))
+}
+
+#___________________________________________________________
+function _dumpobj_i2(p, t)
+{
+	return (_dumpobj_i3(_[p], t " ") _dumpobj_i3(_ptr[p], _getchrln(" ", length(t)) "`", "`"))
+}
+
+#___________________________________________________________
+function _dumpobj_i3(A, t, p, e, s, i, t2)
+{
+	if (isarray(A)) {
+		for (i in A) {
+			t2 = _getchrln(" ", length(t))
+			for (i in A) {
+				if (isarray(A[i])) {
+					s = s _dumpobj_i3(A[i], t "[" _dumpobj_i4(i) "]", p, _ln())
+				} else {
+					s = s _ln(t "[" _dumpobj_i4(i) "]=" p _dumpobj_i4(A[i]) "'")
+				}
+				t = t2
+			}
+			return s
+		}
+		return (e == "" ? "" : t e)
+	}
+	if (A == 0 && A == "") {
+		return
+	}
+	return _ln(t "=" _dumpobj_i4(p A) "'")
+}
+
+#___________________________________________________________
+function _dumpobj_i4(t)
+{
+	if (length(t) > 64) {
+		return (substr(t, 1, 28) " ... " substr(t, length(t) - 28))
+	}
+	return t
+}
+
+#_________________________________________________________________
+function _dumpobj_nc(p, f, t)
+{
+	#######################################
+	return _dumpobj_i0(p, f, t "." p "{ ")
+}
+
+#_________________________________________________________________
+function _dumpobjm(p, f, t, s, t2)
+{
+	###################################
+	t2 = _getchrln(" ", length(t))
+	do {
+		s = s _dumpobj(p, f, t)
+		t = t2
+	} while ((p = _rNEXT(p)))
+	return s
+}
+
+#_________________________________________________________________
+function _dumpobjm_nc(p, f, t, s, t2)
+{
+	################################
+	t2 = _getchrln(" ", length(t))
+	do {
+		s = s _dumpobj_nc(p, f, t)
+		t = t2
+	} while ((p = _rNEXT(p)))
+	return s
+}
+
+function _dumpuidgen(p, pd, pc, ps)
+{
+	_conline("#" (++cntdm) ": " p "'")
+	_conl()
+	if (p in _tuidel) {
+		_conl("DEL:   " _var(pd = _tuidel[p]))
+		_conl(_dumparr(_tUIDEL[pd]) _ln())
+	}
+	_conl("PFX: " _tUIDPFX[p] "'")
+	_conl("SFX: " _tUIDSFX[p] "'")
+	_conl("COUNT: " (p in _tuidcnt ? (pc = _tuidcnt[p]) "'" : _th0("-", pc = -2)))
+	_con("CHARS: ")
+	if (p in _tuidchr) {
+		_conl((ps = _tuidchr[p]) "'")
+		_conl("HCHR: " (pc == -2 ? "-" : _tUIDCNTH[pc] "'"))
+		_conl(_dumparr(_tUIDCHRH[ps]) _ln())
+		_conl("LCHR: " (pc == -2 ? "-" : _tUIDCNTL[pc] "'"))
+		_conl(_dumparr(_tUIDCHRL[ps]) _ln())
+	} else {
+		_conl("-")
+	}
+}
+
+#_____________________________________________________________________________
+function _dumpval(v, n)
+{
+	_dumpstr = _dumpstr (v = _ln((n == 0 && n == "" ? "RET" : n) ": " (v == 0 && v == "" ? "-" : v "'")))
+	return v
+}
+
+########################################################
+function _eXTFN(c, t, P)
+{
+	switch (c) {
+	case "_lib_CMDLN":
+		return t
+		#___________________________________________________________
+	case "_lib_APPLY":
+		return
+		#___________________________________________________________
+	case "_lib_HELP":
+		return
+		#___________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_extfn 1.0")
+		#___________________________________________________________
+	case "_lib_BEGIN":
+		return
+		#___________________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+#_________________________________________________________________
+function _endpass(t)
+{
+	_endpass_v0 = t
+}
+
+#_______________________________________________________________________
+function _err(t, a, b)
+{
+	###################################################
+	a = BINMODE
+	b = ORS
+	BINMODE = "rw"
+	ORS = ""
+	print(t) > _SYS_STDERR
+	fflush(_SYS_STDERR)
+	BINMODE = a
+	ORS = b
+	return t
+}
+
+#_________________________________________________________________
+function _errnl(t)
+{
+	################################################
+	return _err(t (t ~ /\x0A$/ ? "" : _CHR["EOL"]))
+}
+
+#_______________________________________________________________________
+function _error(t, d, A)
+{
+	#################################################
+	if (_ERRLOG_EF) {
+		A["TYPE"] = "ERROR"
+		A["TEXT"] = t
+		_log(A, d)
+	}
+}
+
+#_______________________________________________________________________
+function _exit(c)
+{
+	#######################################################
+	exit c
+}
+
+#_____________________________________________________________________________
+function _export_data(t, i, A)
+{
+	#################################################
+	A["DATA"] = t
+	A["ID"] = i
+	_expout("_DATA: " _Zexparr(A) "\n")
+}
+
+#___________________________________________________________________________________
+####################################################################################
+
+#_____________________________________________________________________________
+function _expout(t, d, a, b)
+{
+	####################################################
+	a = BINMODE
+	b = ORS
+	BINMODE = "rw"
+	ORS = ""
+	print(t) > (d ? d : (d = _errlog_file))
+	fflush(d)
+	BINMODE = a
+	ORS = b
+}
+
+#_________________________________________________________________________________________
+##########################################################################################
+function _extfn_init()
+{
+	##############################################################
+	_formatstrs_init()
+	_formatstrd_init()
+	_formatrexp_init()
+	_unformatstr_init()
+	_mac_init()
+}
+
+function _faccl_i0(A, t, p, P, f, r)
+{
+	f = r = ""
+	if (isarray(A)) {
+		while ((f = A[f])) {
+			r = (@f(t, p, P)) r
+		}
+	}
+	return r
+}
+
+function _faccr_i0(A, t, p, P, f, r)
+{
+	f = r = ""
+	if (isarray(A)) {
+		while ((f = A[f])) {
+			r = r @f(t, p, P)
+		}
+	}
+	return r
+}
+
+#_______________________________________________________________________
+function _fatal(t, d, A)
+{
+	#################################################
+	if (_ERRLOG_FF) {
+		A["TYPE"] = "FATAL"
+		A["TEXT"] = t
+		_log(A, d)
+	}
+	if (! d) {
+		exit
+	}
+}
+
+function _fbaccl(A, t, p, P)
+{
+	return _faccl_i0(A["B"], t, p, P)
+}
+
+function _fbaccr(A, t, p, P)
+{
+	return _faccr_i0(A["B"], t, p, P)
+}
+
+function _ffaccl(A, t, p, P)
+{
+	return _faccl_i0(A["F"], t, p, P)
+}
+
+function _ffaccr(A, t, p, P)
+{
+	return _faccr_i0(A["F"], t, p, P)
+}
+
+##################
+
+#_______________________________________________________________________
+function _fframe(A, t, p)
+{
+	#################################################
+	return _fframe_i0(A, t, p, A[""])
+}
+
+#___________________________________________________________
+function _fframe_i0(A, t, p, f)
+{
+	return (f ? ((@f(t, p)) _fframe_i0(A, t, p, A[f])) : "")
+}
+
+#_________________________________________________________________
+function _file(f)
+{
+	#################################################
+	if ((f = _filerdnehnd(f)) == "") {
+		return ""
+	}
+	return (f in _FILEXT ? _FILEXT[f] : "")
+}
+
+#_______________________________________________________________________
+function _file_check(p)
+{
+	if (1 || "AGENT" in _[p]) {
+		_tframe("_file_check_i0", p, p)
+	}
+}
+
+#_______________________________________________
+function _file_check_i0(p, pp, p1, p2, f, v)
+{
+	if (_[p]["TYPE"] == "defile") {
+		f = _[p]["FILE"]
+		f = (match(f, /^.:/) ? "" : _[_[pp]["AGENT"]][".Install Path"] "\\") _[p]["FILE"]
+		if ("RQVERSION" in _[p]) {
+			v = _[p]["RQVERSION"]
+		} else {
+			v = _[pp][".Product Version"]
+		}
+		ERRNO = ""
+		if (_th1(_[p]["DATA"] = _rdfile(f), ERRNO)) {
+			delete _[p]["DATA"]
+			return _dllerr(p, "read file: " ERRNO, f)
+		}
+		if (v != "" && v != (_[p]["VERSION"] = _getfilever(f))) {
+			return _dllerr(p, " file version mismatch: ==`" _[p]["VERSION"] "'; !=`" v "'", f)
+		}
+		_creport(p, substr("OK:    FILE DETECTED" (v == "" ? "" : "(" v ")") ": " f, 1, 122))
+	} else if (_[p]["TYPE"] == "defdir") {
+		if (_filexist(f = _[p]["DIR"])) {
+			_creport(p, substr("OK:    DIR DETECTED: " f, 1, 112))
+		} else {
+			_dllerr(p, "directory " f " is not detected")
+		}
+	}
+}
+
+#_________________________________________________________________
+function _filed(f, dd, d)
+{
+	##########################################
+	if ((f = _filerdnehnd(f)) == "") {
+		return ""
+	}
+	if (f in _FILEDIRFL) {
+		return _FILEDIR[f]
+	}
+	if (f in _FILEROOT) {
+		if ((d = filegetdrvdir(_FILEROOT[f]))) {
+			_FILEDIRFL[f]
+		}
+		return (_FILEDIR[f] = d _FILEDIR[f])
+	}
+	if (((dd = dd ? dd : _FILEIO_RD), f) in _FILEDIR) {
+		return _FILEDIR[dd, f]
+	}
+	if ((d = filedi(dd) _FILEDIR[f]) ~ /^\\/) {
+		return (_FILEDIR[dd, f] = d)
+	}
+	return d
+}
+
+#_________________________________________________________________
+function _filen(f)
+{
+	################################################
+	if ((f = _filerdnehnd(f)) == "") {
+		return ""
+	}
+	return (f in _FILENAM ? _FILENAM[f] : "")
+}
+
+#_________________________________________________________________
+function _filene(f)
+{
+	###############################################
+	if ((f = _filerdnehnd(f)) == "") {
+		return ""
+	}
+	return (f in _FILENAM ? _FILENAM[f] : "") (f in _FILEXT ? _FILEXT[f] : "")
+}
+
+#_________________________________________________________________
+function _filenotexist(f, a)
+{
+	######################################
+	if (f == "") {
+		return ""
+	}
+	if ((a = _filepath(f)) == "") {
+		ERRNO = "Filepath error `" f "'"
+		return ""
+	}
+	_cmd("if exist \"" a "\" exit 1 2>NUL")
+	if (_exitcode == 1) {
+		return (ERRNO = _NOP)
+	}
+	return a
+}
+
+#_______________________________________________________________________
+function _filepath(f, dd)
+{
+	################################################
+	if ((f = _filerdnehnd(f)) == "") {
+		return ""
+	}
+	return (filegetrootdir(f, dd) (f in _FILENAM ? _FILENAM[f] : "") (f in _FILEXT ? _FILEXT[f] : ""))
+}
+
+#_________________________________________________________________
+function _filer(f, dd)
+{
+	#############################################
+	if ((f = _filerdnehnd(f)) == "") {
+		return ""
+	}
+	if (f in _FILEROOT) {
+		return _FILEROOT[f]
+	}
+	if (((dd = dd ? dd : _FILEIO_RD), f) in _FILEROOT) {
+		return _FILEROOT[dd, f]
+	}
+	return (_FILEROOT[dd, f] = fileri(dd))
+}
+
+#_________________________________________________________________
+function _filerd(f, dd)
+{
+	############################################
+	if ((f = _filerdnehnd(f)) == "") {
+		return ""
+	}
+	return filegetrootdir(f, dd)
+}
+
+#_________________________________________________________________
+function _filerdn(f, dd)
+{
+	###########################################
+	if ((f = _filerdnehnd(f)) == "") {
+		return ""
+	}
+	return (f in _FILENAM ? (filegetrootdir(f, dd) _FILENAM[f]) : "")
+}
+
+#_________________________________________________________________
+function _filerdne(f, dd)
+{
+	##########################################
+	if ((f = _filerdnehnd(f)) == "") {
+		return ""
+	}
+	if ((f in _FILENAM)) {
+		return (filegetrootdir(f, dd) _FILENAM[f] (f in _FILEXT ? _FILEXT[f] : ""))
+	}
+	if (f in _FILEXT) {
+		return (filegetrootdir(f, dd) _FILEXT[f])
+	}
+	return ""
+}
+
+#___________________________________________________________
+function _filerdnehnd(st, c, r, d, n, A)
+{
+	if (st) {
+		if ((c = toupper(st)) in _FILECACHE) {
+			FLENGTH = length(st)
+			return _FILECACHE[c]
+		}
+		if (match(st, /^[ \t]*\\[ \t]*\\/)) {
+			if (match(substr(st, (FLENGTH = RLENGTH) + 1), /^[ \t]*([0-9A-Za-z\-]+)[ \t]*(\\[ \t]*([A-Za-z])[ \t]*\$[ \t]*)?(\\[ \t]*([0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)+[ \t]*)?(([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/, A)) {
+				FLENGTH = FLENGTH + RLENGTH
+				d = (A[3] ? ("\\" A[3] "$") : "") A[4]
+				gsub(/[ \t]*\\[ \t]*/, "\\", d)
+				if ((st = toupper((r = "\\\\" A[1]) d (n = A[8]))) in _FILECACHE) {
+					return (_FILECACHE[substr(c, 1, FLENGTH)] = _FILECACHE[st])
+				}
+				_FILEDIR[c = _FILECACHE[substr(c, 1, FLENGTH)] = _FILECACHE[st] = ++_file_rootcntr] = d
+				_FILEDIRFL[c]
+				_FILEROOT[c] = r
+			} else {
+				FLENGTH = 0
+				_filepath_err = "UNC"
+				return ""
+			}
+		} else {
+			match(st, /^(([ \t]*\.[ \t]*\\[ \t]*)|(([ \t]*([A-Za-z])[ \t]*(\:)[ \t]*)?([ \t]*(\\)[ \t]*)?))([ \t]*(([ \t]*[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)+)[ \t]*)?([ \t]*([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/, A)
+			if (! (FLENGTH = RLENGTH)) {
+				return ""
+			}
+			d = A[8] A[10]
+			gsub(/[ \t]*\\[ \t]*/, "\\", d)
+			if ((st = toupper((r = A[5] A[6]) d (n = A[14]))) in _FILECACHE) {
+				return (_FILECACHE[substr(c, 1, FLENGTH)] = _FILECACHE[st])
+			}
+			_FILEDIR[c = _FILECACHE[substr(c, 1, FLENGTH)] = _FILECACHE[st] = ++_file_rootcntr] = d
+			if (A[8]) {
+				_FILEDIRFL[c]
+			}
+			if (r) {
+				_FILEROOT[c] = r
+			}
+		}
+		if (n) {
+			if (match(n, /\.[^\.]*$/)) {
+				_FILEXT[c] = substr(n, RSTART)
+				_FILENAM[c] = substr(n, 1, RSTART - 1)
+			} else {
+				_FILENAM[c] = n
+			}
+		}
+		return c
+	}
+	return ""
+}
+
+#_______________________________________________________________________
+function _filexist(f, a)
+{
+	################################################
+	if (f == "") {
+		return ""
+	}
+	if ((a = _filepath(f)) == "") {
+		ERRNO = "Filepath error `" f "'"
+		return ""
+	}
+	_cmd("if exist \"" a "\" exit 1 2>NUL")
+	if (_exitcode == 1) {
+		return a
+	}
+	ERRNO = "File not found `" f "'"
+	return _NOP
+}
+
+#_______________________________________________________________________
+function _fn(f, p0, p1, p2)
+{
+	################################################
+	if (f in FUNCTAB) {
+		return @f(p0, p1, p2)
+	}
+}
+
+#_______________________________________________________________________
+function _foreach(A, f, r, p0, p1, p2, i, p)
+{
+	####################################
+	if (isarray(A)) {
+		_TMP0[p = _n()]["."] = 1
+		_foreach_i0(A, f, _TMP0[p], p0, p1, p2)
+		return _th0(_retarr(_TMP0[p]), _tdel(p))
+	}
+	if (_isptr(A)) {
+		_TMP0[p = _n()][_ARRLEN] = 1
+		_tframe4("_foreach_i1" (r ? "~" r : ""), A, f, _TMP0[p], p0, p1)
+		return _th0(_retarr(_TMP0[p]), _tdel(p))
+	}
+}
+
+#_____________________________________________________
+function _foreach_i0(A, f, D, p0, p1, p2)
+{
+	for (i in A) {
+		if (isarray(A[i])) {
+			_foreach_i0(A[i], f, D, p0, p1, p2)
+		} else {
+			_gen(D, @f(A[i], p0, p1, p2))
+		}
+	}
+}
+
+#_____________________________________________________
+function _foreach_i1(p, f, D, p0, p1, p2)
+{
+	_gen(D, @f(p, p0, p1, p2))
+}
+
+#_____________________________________________________________________________
+function _formatrexp(t)
+{
+	_formatstrq0 = split(t, _FORMATSTRA, /[\/\x00-\x1F\x80-\xFF]/, _FORMATSTRB)
+	_formatstrs0 = ""
+	for (t = 1; t < _formatstrq0; t++) {
+		_formatstrs0 = _formatstrs0 _FORMATSTRA[t] _FORMATREXPESC[_FORMATSTRB[t]]
+	}
+	return (_formatstrs0 _FORMATSTRA[t])
+}
+
+#___________________________________________________________
+function _formatrexp_init()
+{
+	_defescarr(_FORMATREXPESC, "[\\x00-\\x1F\\x80-\\xFF]", _QASC)
+	_defescarr(_FORMATREXPESC, "\\/", "\\")
+	_FORMATREXPESC["\t"] = "\\t"
+}
+
+#_____________________________________________________________________________
+function _formatstrd(t)
+{
+	_formatstrq0 = split(t, _FORMATSTRA, /["\x00-\x1F\x80-\xFF]/, _FORMATSTRB)
+	_formatstrs0 = ""
+	for (t = 1; t < _formatstrq0; t++) {
+		_formatstrs0 = _formatstrs0 _FORMATSTRA[t] _FORMATSTRDESC[_FORMATSTRB[t]]
+	}
+	return (_formatstrs0 _FORMATSTRA[t])
+}
+
+#___________________________________________________________
+function _formatstrd_init()
+{
+	_defescarr(_FORMATSTRDESC, "[\\x00-\\x1F\\x80-\\xFF]", _QASC)
+	_defescarr(_FORMATSTRDESC, "[\\\\\"]", "\\")
+	_FORMATSTRDESC["\t"] = "\\t"
+}
+
+#__________________________________________________________________________________
+
+####################################################################################
+
+
+
+
+#___________________________________________________________________________________
+function _formatstrs(t)
+{
+	_formatstrq0 = split(t, _FORMATSTRA, /['\x00-\x1F\x80-\xFF]/, _FORMATSTRB)
+	_formatstrs0 = ""
+	for (t = 1; t < _formatstrq0; t++) {
+		_formatstrs0 = _formatstrs0 _FORMATSTRA[t] _FORMATSTRSESC[_FORMATSTRB[t]]
+	}
+	return (_formatstrs0 _FORMATSTRA[t])
+}
+
+#___________________________________________________________
+function _formatstrs_init()
+{
+	_defescarr(_FORMATSTRSESC, "[\\x00-\\x1F\\x80-\\xFF]", _QASC)
+	_defescarr(_FORMATSTRSESC, "[\\\\']", "\\")
+	_FORMATSTRSESC["\t"] = "\\t"
+}
+
+function _fpp(q, D, S)
+{
+	_conl()
+	_conline(q)
+	_conl()
+	q = _patharr0(S, q)
+	#_arregpath(D,S)
+	#_conl(_dumparr(D))
+	_conl(_dumparr(S))
+	_conl()
+	return q
+}
+
+#_______________________________________________________________________
+########################################################################
+function _fthru(A, c, p, B)
+{
+	return _fthru_i0(A, c, p, B, A[""])
+}
+
+#_________________________________________________________________
+function _fthru_i0(A, c, p, B, f)
+{
+	return (f ? @f(c, _fthru_i0(A, c, p, B, A[f]), B) : "")
+}
+
+function _gen(D, t)
+{
+	if (length(D[D[_ARRLEN]] = D[D["."]] t) > _datablock_length) {
+		D[++D[_ARRLEN]] = ""
+	}
+}
+
+#_____________________________________________________________________________
+function _gensubfn(t, r, f, p0, A)
+{
+	###############################################
+	if (match(t, r, A)) {
+		return (substr(t, 1, RSTART - 1) (@f(_th0(substr(t, RSTART, RLENGTH), t = substr(t, RSTART + RLENGTH)), A, p0)) _gensubfn(t, r, f, p0))
+	}
+	return t
+}
+
+#_____________________________________________________________________________
+function _get_errout(p)
+{
+	#######################################################
+	return _tframe("_get_errout_i0", p)
+}
+
+#_______________________________________________________________________
+function _get_errout_i0(p, t, n, a)
+{
+	return (p in _tLOG ? (_get_errout_i1(p) _get_errout_i3(p)) : "")
+}
+
+#_________________________________________________________________
+function _get_errout_i1(p, t, n, a)
+{
+	if (p in _tLOG) {
+		n = ""
+		if (_tLOG[p]["TYPE"]) {
+			n = _tLOG[p]["TYPE"] ": " _get_errout_i2(p)
+			if (match(_tLOG[p]["TEXT"], /\x1F/)) {
+				t = n
+				gsub(/[^\t]/, " ", t)
+				return (_ln(n substr(_tLOG[p]["TEXT"], 1, RSTART - 1)) _ln(t substr(_tLOG[p]["TEXT"], RSTART + 1)))
+			}
+		}
+		return _ln(n _tLOG[p]["TEXT"])
+	}
+}
+
+#_______________________________________________________________________
+function _get_errout_i2(p)
+{
+	return ("FILE" in _tLOG[p] ? (_tLOG[p]["FILE"] ("LINE" in _tLOG[p] ? ("(" _tLOG[p]["LINE"] ")") : "") ": ") : "")
+}
+
+#_______________________________________________________________________
+function _get_errout_i3(p, t, ts, cl, cp, cr, a, b)
+{
+	if ("LSTR" in _tLOG[p]) {
+		t = _tLOG[p]["FULLSTR"]
+		ts = _tLOG[p]["TS"]
+		cp = "^"
+		if ("CSTR" in _tLOG[p]) {
+			cr = _tLOG[p]["CSTR"]
+			cl = _tLOG[p]["CLSTR"]
+			if ("CPSTR" in _tLOG[p]) {
+				cp = _tLOG[p]["CPSTR"]
+			}
+		}
+		cr = substr(cr, length(cl) + length(cp) + 1)
+		return (_ln(_tabtospc(t, ts)) _ln(_getchrln(" ", a = length(_tabtospc(_tLOG[p]["LSTR"], ts))) _getchrln("-", b = length(_tabtospc(cl, ts, a))) _getchrln("^", b = length(_tabtospc(cp, ts, a = a + b))) _getchrln("-", length(_tabtospc(cr, ts, a + b)))))
+	}
+}
+
+#_____________________________________________________________________________
+function _get_logout(p)
+{
+	#######################################################
+	return _tframe("_get_logout_i0", p)
+}
+
+#_______________________________________________________________________
+function _get_logout_i0(p, t, n, a)
+{
+	if (p in _tLOG) {
+		n = ("DATE" in _tLOG[p] ? (_tLOG[p]["DATE"] " ") : "") ("TIME" in _tLOG[p] ? (_tLOG[p]["TIME"] " ") : "")
+		if (_tLOG[p]["TYPE"]) {
+			n = n _tLOG[p]["TYPE"] ": " ("FILE" in _tLOG[p] ? (_tLOG[p]["FILE"] ("LINE" in _tLOG[p] ? ("(" _tLOG[p]["LINE"] ")") : "") ": ") : "")
+			if (match(_tLOG[p]["TEXT"], /\x1F/)) {
+				t = n
+				gsub(/[^\t]/, " ", t)
+				return (_ln(n substr(_tLOG[p]["TEXT"], 1, RSTART - 1)) _ln(t substr(_tLOG[p]["TEXT"], RSTART + 1)))
+			}
+		}
+		return _ln(n _tLOG[p]["TEXT"])
+	}
+}
+
+#_______________________________________________________________________
+function _getchrln(s, w)
+{
+	#################################################
+	if (s == "") {
+		return
+		#if ( w!=w+0 || w<0 )	w=_CON_WIDTH
+	}
+	if (length(s) < w) {
+		if (s in _GETCHRLN) {
+			if (length(_getchrlnt0 = _GETCHRLN[s]) >= w) {
+				return substr(_getchrlnt0, 1, w)
+			}
+		} else {
+			_getchrlnt0 = s s
+		}
+		while (length(_getchrlnt0) < w) {
+			_getchrlnt0 = _getchrlnt0 _getchrlnt0
+		}
+		_GETCHRLN[s] = _getchrlnt0
+		return substr(_getchrlnt0, 1, w)
+	} else {
+		return substr(s, 1, w)
+	}
+}
+
+#_______________________________________________________________________
+function _getdate()
+{
+	#####################################################
+	return strftime("%F")
+}
+
+#_____________________________________________________________________________
+function _getfilepath(t, f, al, b, A)
+{
+	############################################
+	ERRNO = ""
+	if (match(t, /^[ \t]*(("([^"]*)"[ \t]*)|([`']([^']*)'[ \t]*)|(([^ \t]+)[ \t]*))/, A)) {
+		al = RLENGTH
+		f = A[3] A[5] A[7]
+		_conl("_getfilepath(" f ")        (" al ")")
+		if ((b = _filepath(f))) {
+			if (length(f) <= FLENGTH) {
+				FLENGTH = al
+				return b
+			}
+			ERRNO = "Filepath `" f "' error"
+		}
+	}
+	FLENGTH = 0
+}
+
+function _getfilever(f)
+{
+	#############################################################
+	split(_cmd(_fileverpath " \"" f "\""), _GETFILEVERA0, /[ \t]+/)
+	if (_GETFILEVERA0[5]) {
+		return _GETFILEVERA0[5]
+	}
+}
+
+#_________________________________________________________________
+function _getime()
+{
+	################################################
+	return strftime("%H:%M:%S")
+}
+
+#_________________________________________________________________
+function _getmpdir(f, dd)
+{
+	##########################################
+	if ((! dd) || (! (dd = _filerd(dd)))) {
+		dd = _FILEIO_TMPRD
+	}
+	if ((f = f ? _filerd(f, dd) : _filerd("_" ++_FILEIO_TMPCNTR "\\", dd))) {
+		_FILEIO_RDTMP[toupper(f)]
+	}
+	return f
+}
+
+#_________________________________________________________________
+function _getmpfile(f, dd)
+{
+	#########################################
+	if ((! dd) || (! (dd = _filerd(dd)))) {
+		dd = _FILEIO_TMPRD
+	}
+	if ((f = _filerdne(_filene(f) ? f : (f "_" ++_FILEIO_TMPCNTR), dd))) {
+		_FILEIO_RDNETMP[toupper(f)]
+	}
+	return f
+}
+
+#_______________________________________________________________________
+function _getperf(o, t, a)
+{
+	###############################################
+	o == "" ? ++_getperf_opcurr : _getperf_opcurr = o
+	if ((a = _getsecond()) != _getperf_last) {
+		_getperf_opsec = (_getperf_opcurr - _getperf_opstart) / ((_getperf_last = a) - _getperf_start)
+		return @_getperf_fn(o, t, a)
+	}
+	return 1
+}
+
+#___________________________________________________________
+function _getperf_(o, t, a)
+{
+	if (a >= _getperf_end) {
+		return 0
+	}
+	if (_getperf_opsecp != _getperf_opsec) {
+		_constat((_constatstr == _getperf_stat ? _getperf_statstr : (_getperf_statstr = _constatstr)) t " [TIME=" (a - _getperf_start) " sec(" (_getperf_opsecp = _getperf_opsec) " ops/sec)]")
+		_getperf_stat = _constatstr
+	}
+	return 1
+}
+
+#___________________________________________________________
+function _getperf_noe(o, t, a)
+{
+	if (_getperf_opsecp != _getperf_opsec) {
+		_constat((_constatstr == _getperf_stat ? _getperf_statstr : (_getperf_statstr = _constatstr)) t " [TIME=" (a - _getperf_start) " sec(" (_getperf_opsecp = _getperf_opsec) " ops/sec)]")
+		_getperf_stat = _constatstr
+	}
+	return 1
+}
+
+#___________________________________________________________
+function _getperf_noenot(o, t, a)
+{
+	return 1
+}
+
+#___________________________________________________________
+function _getperf_not(o, t, a)
+{
+	if (a < _getperf_end) {
+		return 1
+	}
+}
+
+#_________________________________________________________________________________________
+##########################################################################################
+function _getreg_i1(D, r, R, a, i, il, ir, rc, B)
+{
+	a = IGNORECASE
+	IGNORECASE = 1
+	r = "^" _torexp(r)
+	rc = 0
+	zs = ""
+	for (i in R) {
+		if (match(i, r, B)) {
+			il = B[_torexp_pfxcntr]
+			ir = gensub(/....$/, "", 1, substr(i, 1 + B[_torexp_pfxcntr, "length"]))
+			if (! gsub(/^\\/, "", ir) && match(il, /[^\\]+$/)) {
+				ir = substr(il, RSTART) ir
+			}
+			D[ir] = R[i]
+			rc++
+		}
+	}
+	IGNORECASE = a
+	if (rc > 0) {
+		return rc
+	}
+}
+
+#_________________________________________________________________
+function _getsecond()
+{
+	#############################################
+	return systime()
+}
+
+#___________________________________________________________
+function _getsecondsync(a, c, b, c2)
+{
+	##########################
+	a = systime()
+	while (a == systime()) {
+		++c
+	}
+	return (a + 1)
+}
+
+#_______________________________________________________________________
+function _getuid(p)
+{
+	################################################# 1 #
+	if (p in _UIDOBL) {
+		for (_tptr in _UIDOBLV[_getuida0 = _UIDOBL[p]]) {
+			delete _UIDOBLV[_getuida0][_tptr]
+			_CLASSPTR[_tptr] = p
+			return _tptr
+		}
+	}
+	_CLASSPTR[_tptr = _UIDPFX[p] _getuid_i0(_UIDCNT[p], _UIDCHRL[_tptr = _UIDCHR[p]], _UIDCHRH[_tptr]) _UIDSFX[p]] = p
+	return _tptr
+}
+
+#_____________________________________________________
+function _getuid_i0(p, UL, UH)
+{
+	if ("" == (_tptr = UL[_UIDCNTL[p]])) {
+		for (_tptr in UH) {
+			delete UH[_tptr]
+			return (_UIDCNTH[p] = _tptr) (_UIDCNTL[p] = UL[""])
+		}
+		_fatal("out of UID")
+	}
+	return (_UIDCNTH[p] (_UIDCNTL[p] = _tptr))
+}
+
+function _handle8494(t)
+{
+	return gensub(/(.)/, ".\\1", "G", t)
+}
+
+#_____________________________________________________________________________
+function _hexnum(n, l)
+{
+	#########################################################
+	if (l + 0 < 1) {
+		l = 2
+	}
+	return sprintf("%." (l + 0 < 1 ? 2 : l) "X", n)
+}
+
+#_________________________________________________________________
+function _igetperf(t, s, o)
+{
+	#########################################	# t-test period in seconds(==0 ? no period; s(=true/false)-output/not output status; o-qnt of ops before test start
+	if (t == 0 && t == "" && s == 0 && s == "" && o == 0 && o == "") {
+		if (_getperf_fn !~ /not$/ && _constatstr == _getperf_stat) {
+			_constat(_getperf_statstr)
+		}
+		_getperf_fn = "_nop"
+		return ("[TIME=" (_getperf_last - _getperf_start) " sec(" _getperf_opsec " ops/sec)]")
+	}
+	_conl("initiate _getperf")
+	_getperf_opstart = _getperf_opcurr = o + 0
+	_getperf_opsec = _getperf_opsecp = _getperf_stat = _getperf_statstr = ""
+	_getperf_end = t + (_getperf_start = _getperf_last = _getsecondsync())
+	_getperf_fn = (t + 0 > 0 ? "_getperf_" : "_getperf_noe") (s ? "" : "not")
+	return _getperf_start
+}
+
+function _import_data(t, p, p2, a)
+{
+	if (match(t, /^_DATA: /)) {
+		_tDATA[a = _wLCHLD(p, _N())][""]
+		delete _tDATA[a][""]
+		_Zimparr(_tDATA[a], substr(t, 8))
+		_conl("DATA: `" _tDATA[a]["ID"] "':`" _tDATA[a]["DATA"] "'")
+		return ""
+	}
+	return t
+}
+
+#_______________________________________________________________________
+function _info(t, d, A)
+{
+	##################################################
+	if (_ERRLOG_IF) {
+		A["TYPE"] = "INFO"
+		A["TEXT"] = t
+		_log(A, d)
+	}
+}
+
+# test with the different path types
+#	_conl(_ln("SRC:") _dumparr(S)); _conl();
+function _ini(p, cs, dptr, pfx, sfx, hstr, lstr)
+{
+	return _inituid(p, cs, dptr, pfx, sfx, hstr, lstr, A)
+}
+
+function _initfilever()
+{
+	_fileverpath = "\\\\CPU\\eGAWK\\LIB\\_filever\\_filever.exe"
+}
+
+function _initrdreg()
+{
+	_RDREGTYPE["SZ"] = "STR"
+	_RDREGTYPE["DWORD"] = "W32"
+	_RDREGTYPE["QWORD"] = "W64"
+	_RDREGTYPE["BINARY"] = "BIN"
+	_RDREGTYPE["EXPAND_SZ"] = "XSZ"
+	_RDREGTYPE["MULTI_SZ"] = "MSZ"
+	_RDrdregfld = _rdregkey = 0
+}
+
+function _initregpath0()
+{
+	_REGPATH0REGDIR[""] = "HKEY_LOCAL_MACHINE"
+	_REGPATH0REGDIR["HKLM"] = "HKEY_LOCAL_MACHINE"
+	_REGPATH0REGDIR["HKEY_LOCAL_MACHINE"] = "HKEY_LOCAL_MACHINE"
+	_REGPATH0REGDIR["HKCR"] = "HKEY_CLASSES_ROOT"
+	_REGPATH0REGDIR["HKEY_CLASSES_ROOT"] = "HKEY_CLASSES_ROOT"
+	_REGPATH0REGDIR["HKCU"] = "HKEY_CURRENT_USER"
+	_REGPATH0REGDIR["HKEY_CURRENT_USER"] = "HKEY_CURRENT_USER"
+	_REGPATH0REGDIR["HKU"] = "HKEY_USERS"
+	_REGPATH0REGDIR["HKEY_USERS"] = "HKEY_USERS"
+	_REGPATH0REGDIR["HKCC"] = "HKEY_CURRENT_CONFIG"
+	_REGPATH0REGDIR["HKEY_CURRENT_CONFIG"] = "HKEY_CURRENT_CONFIG"
+	_REGPATH0REGDIR["HKPD"] = "HKEY_PERFORMANCE_DATA"
+	_REGPATH0REGDIR["HKEY_PERFORMANCE_DATA"] = "HKEY_PERFORMANCE_DATA"
+}
+
+function _initshare()
+{
+	_sharextool = "\\\\CPU\\eGAWK\\LIB\\_share\\_share.exe"
+}
+
+#_________________________________________
+function _initspecialuid()
+{
+	_NOINDEX = _getuid()
+	_LEN = _getuid()
+	_PTR = _getuid()
+	_NAME = _getuid()
+	_TYPE = _getuid()
+	_FORMAT = _getuid()
+}
+
+function _initsys()
+{
+}
+
+#_______________________________________________________________________
+function _inituid(p, cs, dptr, pfx, sfx, hstr, lstr, A)
+{
+	################### 1 #
+	if (cs == 0 && cs == "") {
+		cs = p
+		p = _getuid()
+	}
+	_conl()
+	_conl()
+	_conl(cs)
+	if (match(cs, /^(([^:]*):)?(([^'\xB4]*\xB4.)*[^'\xB4]*)[']/, A)) {
+		pfx = A[3]
+		dptr = A[2]
+	}
+	if (match(cs = substr(cs, 1 + RLENGTH), /'(([^'\xB4]*\xB4.)*[^'\xB4]*)$/, A)) {
+		sfx = A[1]
+		cs = substr(cs, 1, RSTART - 1)
+	}
+	if (match(cs, /^(([`\^])(.*))/, A)) {
+		if (A[2] == "`") {
+			hstr = A[3] "~"
+			lstr = ""
+		} else {
+			lstr = A[3] "+"
+			hstr = ""
+		}
+	} else if (match(cs, /^(([^'\xB4\|]*\xB4.)*[^'\xB4\|]*)(\|(.*))?/, A)) {
+		hstr = A[1]
+		lstr = A[4]
+	} else {
+		ERRNO = "_inituid(): bad parameters"
+		return
+	}
+	_conl(dptr ":" pfx "'" hstr "|" lstr "'" sfx)
+	return _cfguid(p, dptr, pfx, sfx, hstr, lstr)
+}
+
+function _inituidefault(h, l, H, L)
+{
+	_classys = ""
+	delete _UIDOBLV[_UIDOBLV[_UIDOBL[_classys] = _classys][""] = _classys][""]
+	_UIDPFX[_classys]
+	_UIDSFX[_classys]
+	_UIDCNT[_classys] = _UIDCHR[_classys] = _CLASSPTR[_classys] = _classys
+	h = "AB"
+	l = h "01"
+	_splitstr(H, h)
+	_splitstr(L, l)
+	delete _UIDCHRH[_UIDCHRH[_classys][""] = _classys][""]
+	delete _UIDCHRL[_UIDCHRL[_classys][""] = _classys][""]
+	_UIDCNTH[_classys]
+	_cfguidh(_classys, H, L)
+	_UIDCNTL[_classys] = _cfguidl(_classys, L, L)
+	_CLASSFN[_classys]["del"] = "_tobjDEL"
+	_CLASSFN[_classys]["new"] = "_tobjNEW"
+	_drawuid(_classys)
+	_initspecialuid()
+}
+
+#_______________________________________________________________________
+function _ins(S, sf, D, df)
+{
+	################################################
+	if (sf in S) {
+		if (isarray(S[sf])) {
+			if (df in D) {
+				if (isarray(D[df])) {
+					return _extarr(D[df], S[sf])
+				}
+				delete D[df]
+			}
+			D[df][""]
+			delete D[df][""]
+			return _extarr(D[df], S[sf])
+		} else {
+			if (isarray(D[df])) {
+				delete D[df]
+			}
+			D[df] = S[sf] D[df]
+		}
+	}
+}
+
+#_________________________________________________________________
+function _insf(A, f)
+{
+	###############################################
+	A["F"][""] = A["B"][A["F"][f] = A["F"][""]] = f
+}
+
+#_________________________________________________________________
+function _insframe(A, f)
+{
+	###########################################
+	A[f] = A[""]
+	A[""] = f
+}
+
+########################
+
+#_________________________________________________________________
+function _inspass(A, f)
+{
+	A[f] = A[""]
+	A[""] = f
+}
+
+# there is problem with string's format: i can;t easilly merge 2 charsets: comma-divided and every-char-divided strings
+
+#_______________________________________________________________________
+function _isptr(p)
+{
+	################################################## 1 #
+	if (isarray(p)) {
+		is = _NOP
+		it = "A"
+		return 0
+	}
+	is = p
+	if (p == 0 && p == "") {
+		it = "-"
+		return 0
+	}
+	if (p in _CLASSPTR) {
+		return (it = "P")
+	}
+	it = "S"
+	return 0
+}
+
+#_______________________________________________________________________
+function _istr(p)
+{
+	################################################### 1 #
+	if (isarray(p)) {
+		is = _NOP
+		it = "A"
+		return 0
+	}
+	is = p
+	if (p == 0 && p == "") {
+		it = "-"
+		return 0
+	}
+	return (it = p == "" ? "s" : "S")
+}
+
+#_________________________________________________________________
+function _lengthsort(i1, v1, i2, v2)
+{
+	##############################
+	return (length(i1) < length(i2) ? -1 : length(i1) > length(i2) ? 1 : i1 < i2 ? -1 : 1)
+}
+
+#_________________________________________________________________
+function _lib_APPLY()
+{
+	return _ffaccr(_LIBAPI, "_lib_APPLY")
+}
+
+#_________________________________________________________________
+function _lib_BEGIN(A)
+{
+	return _ffaccr(_LIBAPI, "_lib_BEGIN", "", A)
+}
+
+#_______________________________________________________________________
+function _lib_CMDLN(t)
+{
+	return _pass(_LIBAPI["F"], "_lib_CMDLN", t)
+}
+
+#_________________________________________________________________
+function _lib_END(A)
+{
+	return _ffaccr(_LIBAPI, "_lib_END", "", A)
+}
+
+#_________________________________________________________________
+function _lib_HELP()
+{
+	return _fbaccr(_LIBAPI, "_lib_HELP")
+}
+
+#_________________________________________________________________
+function _lib_NAMEVER()
+{
+	return _fbaccr(_LIBAPI, "_lib_NAMEVER")
+}
+
+#_____________________________________________________________________________
+function _ln(t)
+{
+	###############################################################
+	return (t ~ /\x0A$/ ? t : (t _CHR["EOL"]))
+}
+
+#_________________________________________________________________
+function _log(A, p, a, B)
+{
+	###########################################
+	if (isarray(A)) {
+		A["TIME"] = _getime()
+		A["DATE"] = _getdate()
+		if (p) {
+			_tLOG[p = _wLCHLD(p, _N())][""]
+			delete _tLOG[p][""]
+			_movarr(_tLOG[p], A)
+			return p
+		}
+		_expout("_ERRLOG: " _Zexparr(A) "\n")
+	} else {
+		B["TEXT"] = A
+		B["TYPE"] = ""
+		return _log(B, p)
+	}
+}
+
+#_________________________________________________________________
+function _lspctab(t, ts, l, l1, l2, A)
+{
+	################################
+	while (match(t, /^(\t*)( *)((\t*)(.*))$/, A)) {
+		if (A[1, "length"] >= l) {
+			return substr(t, l + 1)
+		}
+		if (A[2]) {
+			if ((l1 = int(A[2, "length"] / ts)) >= (l2 = l - A[1, "length"])) {
+				return (substr(A[2], l2 * ts + 1) A[3])
+			}
+			if (! A[4]) {
+				return A[5]
+			}
+			t = A[1] _getchrln("\t", l1) A[3]
+		} else {
+			return t
+		}
+	}
+}
+
+function _mac_init()
+{
+	_MACPFX["\204"] = "_macpfx84"
+	_MACPFX[""] = "_mpupfxsubret"
+	_MACPFX84SFX["\204"] = "_macpfx84"
+	_MACPFX84SFX["\224"] = "_macsfx94"
+	_MACPFX84SFX[""] = "_mpusfxsubret"
+	_VLDMAXSTRING = 1000000
+}
+
+function _macpfx84(F, D, C, p1, p2, p3)
+{
+	return _mpusub(_MACPFX84SFX, D, C, D[_mpuptr++], p1, p2, p3)
+}
+
+function _macsfx94(F, D, C, p1, p2, p3)
+{
+	return _mpuretsub(D, _handle8494(_mpuacc))
+}
+
+#_______________________________________________________________________
+function _movarr(D, S)
+{
+	###################################################
+	delete D
+	D[""]
+	delete D[""]
+	_addarr(D, S)
+}
+
+function _mpu(t, F, p1, p2, p3, D, C)
+{
+	if (patsplit(t, C, /[\x84\x93\x94]/, D) > 0) {
+		_conline("CODE")
+		_conl()
+		_conl(_dumparr(C))
+		_conline("DATA")
+		_conl()
+		_conl(_dumparr(D))
+		_mpuptr = 0
+		_mpucc0 = ""
+		_mpusub(F, D, C, D[_mpuptr++], p1, p2, p3)
+		return _mpuacc
+	}
+	return t
+}
+
+#
+#	/rexpstr/	->	datastr
+#	(\x00\t\+)*	->	28 00 09 5B 2B 29
+#
+# unesc all non-rexp characters: replace unesc of rexp-characters but do not remove it: \* -> \*, \x2A -> \*, \052 -> \*, \\ -> \#
+function _mpudefaulthnd(F, D, C, p1, p2, p3)
+{
+	_mpuretsub(D, _mpucc0)
+}
+
+function _mpupfxsubret(F, D, C, p1, p2, p3)
+{
+	return 1
+}
+
+function _mpuretsub(D, t)
+{
+	_mpuacc = D[_mpuptr++]
+	_accmpu(D, t)
+	return 1
+}
+
+function _mpusfxsubret(F, D, C, p1, p2, p3)
+{
+	return -1
+}
+
+function _mpusub(F, D, C, d, p1, p2, p3, q)
+{
+	q = D[_ARRLEN]
+	if (_VLDMAXSTRING < length(d)) {
+		D[--D[_ARRLEN]] = d
+		_mpuacc = ""
+	} else {
+		_mpuacc = d
+	}
+	d = _mpucc0
+	_conl("_mpusub enter: in `" _mpuacc "' / _mpuptr=" _mpuptr "'")
+	do {
+		if ((_mpucc0 = C[_mpuptr]) in F) {
+			if (isarray(F[_mpucc0])) {
+				_mpufn0 = F[_mpucc0]
+			}
+			_conl("FN: `" _mpucc0 "' > CALL: `" (_mpufn0) "' : _mpuacc=" _mpuacc "'")
+		} else {
+			_mpufn0 = "_mpudefaulthnd"
+		}
+	} while (! _accmpu(D, _mpuacc, @_mpufn0(F, D, C, p1, p2, p3)))
+	if (_mpufn0 == -1) {
+		_conl("WARNING: unclosed expression: `" d _mpuacc "'")
+		_mpuacc = d _mpuacc
+	}
+	_retarrm(D, q, "", _mpufn0 == -1 ? _th0(d, _mpusubwrng("WARNING: unclosed expression", d _mpuacc)) : "")
+	# collect: _mpuacc=_retarr(D) _mpuacc
+	_conl("mpusub exit: _mpuacc: `" _mpuacc "'")
+}
+
+#_______________________________________________________________________
+function _n(F, v, p)
+{
+	#####################################################
+	for (p in _UIDSDEL) {
+		delete _UIDSDEL[p]
+		delete _ptr[p]
+		delete _tPREV[p]
+		delete _tPARENT[p]
+		delete _tNEXT[p]
+		delete _tFCHLD[p]
+		delete _tQCHLD[p]
+		delete _tLCHLD[p]
+		delete _TMP0[p]
+		delete _TMP1[p]
+		delete _tLINK[p]
+		delete _tCLASS[p]
+		return _nN_i0(p, F, v)
+	}
+	for (p in _UIDS) {
+		delete _UIDS[p]
+		return _nN_i0(p, F, v)
+	}
+	return _nN_i0(_tgenuid(), F, v)
+}
+
+#_____________________________________________________
+function _nN_i0(p, F, v)
+{
+	_[p][""]
+	delete _[p][""]
+	_ptr[p][""]
+	delete _ptr[p][""]
+	_TMP0[p][_ARRLEN] = _TMP1[p][_ARRLEN] = 0
+	if (isarray(F)) {
+		delete F[p]
+		if (isarray(v)) {
+			F[p][""]
+			delete F[p][""]
+			_copyarr(F[p], v)
+		} else if (! (v == 0 && v == "")) {
+			F[p] = v
+		}
+	} else if (! (F == 0 && F == "")) {
+		if (isarray(v)) {
+			_[p][F][""]
+			delete _[p][F][""]
+			_copyarr(_[p][F], v)
+		} else if (v == 0 && v == "") {
+			_mpu(F, p)
+		} else {
+			_[p][F] = v
+		}
+	}
+	return p
+}
+
+#_________________________________________________________________
+function _newclrdir(f)
+{
+	############################################
+	if ((f = _filerd(f)) == "") {
+		return
+	}
+	_cmd("rd " f " /S /Q 2>NUL")
+	_cmd("md " f " 2>NUL")
+	_WFILEROOTDIR[f]
+	return f
+}
+
+#_______________________________________________________________________
+function _newdir(f)
+{
+	#####################################################
+	if ((f = _filerd(f)) == "") {
+		return
+	}
+	if (! (f in _WFILEROOTDIR)) {
+		_cmd("md " f " 2>NUL")
+		_WFILEROOTDIR[f]
+	}
+	return f
+}
+
+##############################
+
+#_______________________________________________________________________
+function _nop(p0, p1, p2, p3)
+{
+}
+
+#_____________________________________________________
+#	_retarr(ARRAY,start,prefixtr,postfixtr)
+#		Return string collected from elements of ARRAY.
+#		The data elements in ARRAY have numeric indexes. By default it starts from element with index 1, but it is possible to locate elements starting from
+#		0,-1,-.... The last data element in the ARRAY have the highest numeric index that is stored in ARRAY[_ARRLEN].
+#		Optimized for very large data size.
+#
+#			IN:		ARRAY			- source data array(is ARRAY is not array then return undefined)
+#					start			- (optional) start index in ARRAY; if missed or have non-numeric value then start array index will be 1.
+#					prefixst		- the string that will be inserted in the begin of generated return string
+#					postfix		- the string that will be added at the end of generated return string
+#			MOD:		-
+#			OUT:		-
+#			RETURN:	undefined		- if ARRAY is not array; if ARRAY is empty; if start is higher than ARRAY last element index
+#					string		- collected string: prefixtr-arraydata-postfixtr
+#_________________________________________________________________
+function _nretarr(A, i, v, r, q)
+{
+	#####################################
+	if ((i = i == "" ? 1 : i + 0) <= (q = A[_ARRLEN])) {
+		if (i <= (r = q - 16)) {
+			_ARRSTR = A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+			while (i < r) {
+				_ARRSTR = _ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+			}
+			_ARRSTR = _ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A, q, i)
+			return
+		}
+		_ARRSTR = A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A, q, i)
+		return
+	}
+	_ARRSTR = v
+	return
+}
+
+#___________________________________________________________
+function _nretarrd(A, i, v, r, q)
+{
+	##############################
+	if ((i = i == "" ? 1 : i + 0) <= (q = A[_ARRLEN])) {
+		if (i <= (r = q - 16)) {
+			_ARRSTR = A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+			while (i < r) {
+				_ARRSTR = _ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i]
+			}
+			_ARRSTR = _ARRSTR A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A, q, i)
+		} else {
+			_ARRSTR = A[i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] v _retarr_i0(A, q, i)
+		}
+	} else {
+		_ARRSTR = v
+	}
+	delete A
+	A[""]
+	delete A[""]
+}
+
+#___________________________________________________________________________________
+####################################################################################
+
+#___________________________________________________________________________________
+function _out(t, a, b)
+{
+	###############################################################
+	a = BINMODE
+	b = ORS
+	BINMODE = "rw"
+	ORS = ""
+	print(t) > _SYS_STDOUT
+	fflush(_SYS_STDOUT)
+	BINMODE = a
+	ORS = b
+	return t
+}
+
+#_________________________________________________________________
+function _outnl(t)
+{
+	################################################
+	return _out(t (t ~ /\x0A$/ ? "" : _CHR["EOL"]))
+}
+
+function _p1(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	_qparamf0 = "_p" _QMAP[_qparamc1--]
+	return @_qparamf0(s1, s2, s3, s4, s5, s6, s7, s8, s1, p1, p2, p3, p4, p5, p6, p7)
+}
+
+function _p2(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	_qparamf0 = "_p" _QMAP[_qparamc1--]
+	return @_qparamf0(s1, s2, s3, s4, s5, s6, s7, s8, s2, p1, p2, p3, p4, p5, p6, p7)
+}
+
+function _p3(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	_qparamf0 = "_p" _QMAP[_qparamc1--]
+	return @_qparamf0(s1, s2, s3, s4, s5, s6, s7, s8, s3, p1, p2, p3, p4, p5, p6, p7)
+}
+
+function _p4(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	_qparamf0 = "_p" _QMAP[_qparamc1--]
+	return @_qparamf0(s1, s2, s3, s4, s5, s6, s7, s8, s4, p1, p2, p3, p4, p5, p6, p7)
+}
+
+function _p5(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	_qparamf0 = "_p" _QMAP[_qparamc1--]
+	return @_qparamf0(s1, s2, s3, s4, s5, s6, s7, s8, s5, p1, p2, p3, p4, p5, p6, p7)
+}
+
+function _p6(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	_qparamf0 = "_p" _QMAP[_qparamc1--]
+	return @_qparamf0(s1, s2, s3, s4, s5, s6, s7, s8, s6, p1, p2, p3, p4, p5, p6, p7)
+}
+
+function _p7(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	_qparamf0 = "_p" _QMAP[_qparamc1--]
+	return @_qparamf0(s1, s2, s3, s4, s5, s6, s7, s8, s7, p1, p2, p3, p4, p5, p6, p7)
+}
+
+function _p8(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	_qparamf0 = "_p" _QMAP[_qparamc1--]
+	return @_qparamf0(s1, s2, s3, s4, s5, s6, s7, s8, s8, p1, p2, p3, p4, p5, p6, p7)
+}
+
+#_______________________________________________________________________
+function _pass(A, f, t, p2, i, a)
+{
+	###########################################
+	a = _endpass_v0
+	_endpass_v0 = ""
+	i = 1
+	while (t && i) {
+		i = ""
+		while ((i = A[i]) && (t == (t = @i(f, t, p2)))) {
+		}
+	}
+	if (i && _endpass_v0) {
+		A["!"] = 1
+		t = _endpass_v0
+	} else {
+		delete A["!"]
+	}
+	_endpass_v0 = a
+	return t
+}
+
+# this is somnitelno: that   / / . / / com 56 / / - is the DEV...; what is DEV ??? this already PROBLEM
+#_____________________________________________________________________________
+function _patharr0(D, q, i, h, A, B)
+{
+	##############################################
+	delete D
+	if (0 < (q = split(gensub(/\\/, "/", "G", gensub(/ *([:$\\\/]) */, "\\1", "G", gensub(/(^[ \t]+)|([ \t]+$)/, "", "G", q))), A, /\/+/, B))) {
+		if (2 > (h = length(B[1]))) {
+			D["type"] = "FILE"
+			A[1] = _patharr0_i0(A[1], D, "drive")
+			return _patharr0_i1(D, A, 1, q)
+		}
+		i = gensub(/ *([\.\?]) */, "\\1", "G", A[2])
+		IGNORECASE = 1
+		match(A[1], /^((https?)|(ftp)):$/)
+		IGNORECASE = 0
+		if (RLENGTH > 0) {
+			D["type"] = toupper(substr(A[1], 1, RLENGTH - 1))
+			_patharr0_i0(i, D, "site", "port")
+		} else if (A[1] == "") {
+			D["type"] = "UNC"
+			if (h > 2) {
+				D["host"]
+				A[2] = _patharr0_i0(A[2], D, "drive", "", "FILE")
+				return _patharr0_i1(D, A, 2, q)
+			}
+			if (i == "") {
+				return 1
+			}
+			D["host"] = i
+			A[3] = _patharr0_i0(A[3], D, "drive", "", "FILE")
+		} else {
+			D["type"] = "FILE"
+			A[1] = _patharr0_i0(A[1], D, "drive")
+			return _patharr0_i1(D, A, 1, q)
+		}
+		return _patharr0_i1(D, A, 3, q)
+	}
+}
+
+#_____________________________________________________
+function _patharr0_i0(t, D, l, r, d, i)
+{
+	if (i = index(t, ":")) {
+		if (d) {
+			D["type"] = d
+		}
+		if (i > 1) {
+			D[l] = substr(t, 1, i - 1)
+		}
+		if ((t = substr(t, i + 1)) && r) {
+			D[r] = t
+		}
+		return t
+	} else if (t && r) {
+		D[l] = t
+	}
+	return t
+}
+
+#_____________________________________________________
+function _patharr0_i1(D, A, i, q, t, c)
+{
+	if (D["type"] == "UNC") {
+		if (t = A[i++]) {
+			D[0] = (D["share"] = D[++c] = t) "/"
+		} else {
+			return 1
+		}
+	}
+	while (i < q) {
+		D[0] = D[0] (D[++c] = A[i++]) "/"
+	}
+	if (i == q) {
+		if (match(t = A[i], /\.[^\.]*$/)) {
+			if (RSTART > 1) {
+				D["name"] = substr(t, 1, RSTART - 1)
+			}
+			D["ext"] = substr(t, RSTART, RLENGTH)
+		} else if (t != "") {
+			D["name"] = t
+		}
+	}
+	return 1
+}
+
+#############################################################################
+function _pmap(m, s1, s2, s3, s4, s5, s6, s7, s8)
+{
+	if (match(m, /^([^\(]+)\(([^\)]*)\)$/, _QMAP)) {
+		_qparamf1 = _QMAP[1]
+		_QMAP[0] = "r" (_qparamc1 = split(_QMAP[2], _QMAP, ""))
+		_qparamf0 = "_p" _QMAP[_qparamc1--]
+		return @_qparamf0(s1, s2, s3, s4, s5, s6, s7, s8)
+	}
+}
+
+function _pr0(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	return @_qparamf1()
+}
+
+function _pr1(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	return @_qparamf1(p1)
+}
+
+function _pr2(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	return @_qparamf1(p1, p2)
+}
+
+function _pr3(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	return @_qparamf1(p1, p2, p3)
+}
+
+function _pr4(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	return @_qparamf1(p1, p2, p3, p4)
+}
+
+function _pr5(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	return @_qparamf1(p1, p2, p3, p4, p5)
+}
+
+function _pr6(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	return @_qparamf1(p1, p2, p3, p4, p5, p6)
+}
+
+function _pr7(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	return @_qparamf1(p1, p2, p3, p4, p5, p6, p7)
+}
+
+function _pr8(s1, s2, s3, s4, s5, s6, s7, s8, p1, p2, p3, p4, p5, p6, p7, p8)
+{
+	return @_qparamf1(p1, p2, p3, p4, p5, p6, p7, p8)
+}
+
+#_________________________________________________________________
+function _printarr(A, t, lv, r, a)
+{
+	####################################
+	a = PROCINFO["sorted_in"]
+	PROCINFO["sorted_in"] = "_lengthsort"
+	_printarrexp = r ? r : ""
+	if (isarray(A)) {
+		delete _DUMPARR
+		_dumparrc = _dumparrd = ""
+		_printarr_i1(A, lv = (lv == "" ? 16 : lv == 0 || (lv + 0) != 0 ? lv : lv == "-*" ? -3 : lv ~ /^\+?\*$/ ? 3 : 16) + 0, lv < 0 ? -1 : 1, 0, _tabtospc(t))
+		PROCINFO["sorted_in"] = a
+		return _retarrd(_DUMPARR, _dumparrd, _dumparrd = "")
+	}
+}
+
+#___________________________________________________________
+function _printarr_i1(A, lv, ls, ln, t, t2, i, a, f)
+{
+	t2 = _getchrln(" ", length(t))
+	if (ln == lv) {
+		if (ls > 0) {
+			for (i in A) {
+				++a
+			}
+		} else {
+			for (i in A) {
+				isarray(A[i]) ? ++a : ""
+			}
+		}
+		if (length(_dumparrd = _dumparrd t (a > 0 ? " ... (x" a ")" : "") _CHR["EOL"]) > 262144) {
+			_conl(_dumparrd)
+			_dumparrd = ""
+		}
+		return
+	}
+	if (ls >= 0) {
+		for (i in A) {
+			if (! _printarrexp || i ~ _printarrexp) {
+				if (! isarray(A[i])) {
+					if (length(_dumparrd = _dumparrd (f ? t2 : t _nop(f = 1)) "[" i "]=" A[i] "'" _CHR["EOL"]) > 262144) {
+						_conl(_dumparrd)
+						_dumparrd = ""
+					}
+				}
+			}
+		}
+	}
+	for (i in A) {
+		if (isarray(A[i])) {
+			if (! _printarrexp || i ~ _printarrexp) {
+				_printarr_i1(A[i], lv, ls, ln + ls, _th0(f ? t2 : t, f = 1) "[" i "]")
+			}
+		}
+	}
+	if (! f) {
+		if (length(_dumparrd = _dumparrd t _CHR["EOL"]) > 262144) {
+			_conl(_dumparrd)
+			_dumparrd = ""
+		}
+	}
+}
+
+function _qparam(qm, p0, p1, p2, p3, p4, p5, p6, p7)
+{
+	if (qm == qm + 0 && qm > 0) {
+		_qparamim = substr("        ", 1, qm)
+	} else if (qm != "") {
+		_qparamim = qm
+	} else {
+		_qparamim = "        "
+	}
+	_qparamask = ""
+	return _qparam_i0(p0, p1, p2, p3, p4, p5, p6, p7)
+}
+
+function _qparam_i0(p0, p1, p2, p3, p4, p5, p6, p7)
+{
+	_qparama0 = substr(_qparamim, 1, 1)
+	_qparamim = substr(_qparamim, 2)
+	switch (_qparama0) {
+	case "":
+		gsub(/ +$/, "", _qparamask)
+		return length(_qparamask)
+	default:
+		if (isarray(p0)) {
+			_qparama0 = "A"
+		} else if (p0 == "" && p0 == 0) {
+			_qparama0 = " "
+		} else if (_isptr(p0)) {
+			_qparama0 = "P"
+		} else {
+			_qparama0 = "S"
+		}
+	case ".":
+		_qparamask = _qparamask _qparama0
+		return _qparam_i0(p1, p2, p3, p4, p5, p6, p7)
+	}
+}
+
+#_______________________________________________________________________
+function _qstr(t, c, A, B)
+{
+	################################################
+	c = ""
+	for (t = split(t, A, /[\x00-\x1F\\"]/, B); t >= 0; t--) {
+		c = _QSTR[B[t]] A[t + 1] c
+	}
+	return c
+}
+
+#_________________________________________________________________
+function _qstrq(t)
+{
+	################################################
+	gsub(/\\/, "\\\\", t)
+	gsub(/"/, "\\\"", t)
+	return t
+}
+
+################################################################
+
+#_____________________________________________________________________________
+function _rEG(c, t, P, a, A)
+{
+	#####################################################
+	switch (c) {
+	#___________________________________________________________
+	case "_lib_CMDLN":
+		return t
+		#_____________________________________________________
+	case "_lib_APPLY":
+		return
+		#_____________________________________________________
+	case "_lib_HELP":
+		return
+		#_____________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_reg 0.001")
+		#_____________________________________________________
+	case "_lib_BEGIN":
+		return
+		#_____________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+#_______________________________________________________________________
+function _rFBRO(p)
+{
+	######################################################
+	if (p) {
+		if (p in _tPARENT) {
+			return _tFCHLD[_tPARENT[p]]
+		}
+		while (p in _tPREV) {
+			p = _tPREV[p]
+		}
+		return p
+	}
+	return p
+}
+
+#_______________________________________________________________________
+function _rFCHLD(p)
+{
+	#####################################################
+	if ((p) && (p in _tFCHLD)) {
+		return _tFCHLD[p]
+	}
+	return ""
+}
+
+######################## p="", !v
+
+#_______________________________________________________________________
+function _rLBRO(p)
+{
+	######################################################
+	if (p) {
+		if (p in _tPARENT) {
+			return _tLCHLD[_tPARENT[p]]
+		}
+		while (p in _tNEXT) {
+			p = _tNEXT[p]
+		}
+		return p
+	}
+	return p
+}
+
+######################## p=""
+
+#_______________________________________________________________________
+function _rLCHLD(p)
+{
+	#####################################################
+	if ((p) && (p in _tLCHLD)) {
+		return _tLCHLD[p]
+	}
+	return ""
+}
+
+#_______________________________________________________________________
+function _rLINK(p)
+{
+	######################################################
+	return (p in _tLINK ? _tLINK[p] : "")
+}
+
+######################## p=""
+
+#_______________________________________________________________________
+function _rNEXT(p)
+{
+	######################################################
+	if ((p) && (p in _tNEXT)) {
+		return _tNEXT[p]
+	}
+	return ""
+}
+
+######################## p=""
+
+#_______________________________________________________________________
+function _rPARENT(p)
+{
+	####################################################
+	if ((p) && (p in _tPARENT)) {
+		return _tPARENT[p]
+	}
+	return ""
+}
+
+######################## p=""
+
+#_______________________________________________________________________
+function _rPREV(p)
+{
+	######################################################
+	if ((p) && (p in _tPREV)) {
+		return _tPREV[p]
+	}
+	return ""
+}
+
+######################## p=""
+
+#_______________________________________________________________________
+function _rQBRO(p, c, p1)
+{
+	################################################
+	if (p) {
+		if (p in _tPARENT) {
+			return _tQCHLD[_tPARENT[p]]
+		}
+		c = 1
+		p1 = p
+		while (p1 in _tPREV) {
+			c++
+			p1 = _tPREV[p1]
+		}
+		while (p in _tNEXT) {
+			c++
+			p = _tNEXT[p]
+		}
+		return c
+	}
+	return p
+}
+
+######################## p=""
+
+#_______________________________________________________________________
+function _rQCHLD(p)
+{
+	#####################################################
+	if ((p) && (p in _tQCHLD)) {
+		return _tQCHLD[p]
+	}
+	return ""
+}
+
+#___________________________________________________________________________________
+# EMMULATED FUNCTIONAL FIELDS ######################################################
+
+#_____________________________________________________________________________
+function _rSQFIRST(g, p, A)
+{
+	#####################################################
+	if (isarray(A)) {
+		return _rSQFIRSTA(g, p, A)
+	}
+	_SQTOPTR[g] = p
+	_SQSTACK[g][0] = 0
+	return _rsqgetptr(g, p)
+}
+
+#_________________________________________________________________
+function _rSQFIRSTA(g, p, A)
+{
+	########################################
+	_SQTOPTR[g] = p
+	_SQSTACK[g][0] = 0
+	if ((p = _rsqgetptr(g, p)) in A) {
+		return p
+	}
+	return _rSQNEXTA(g, p, A)
+}
+
+#_______________________________________________________________________
+function _rSQNEXT(g, p, A)
+{
+	################################################
+	if (isarray(A)) {
+		return _rSQNEXTA(g, p, A)
+	}
+	return _rsqnext_i0(g, p)
+}
+
+#_________________________________________________________________
+function _rSQNEXTA(g, p, A)
+{
+	#########################################
+	if (p == _SQTOPTR[g]) {
+		if (_SQSTACK[g][0] > 0) {
+			_SQTOPTR[g] = _SQSTACK[g][_SQSTACK[g][0]--]
+			return _rSQNEXTA(g, _SQSTACK[g][_SQSTACK[g][0]--], A)
+		}
+		return
+	}
+	while (p in _tNEXT) {
+		if ((p = _rsqgetptr(g, _tNEXT[p])) in A) {
+			return p
+		}
+	}
+	return (p in _tPARENT ? _rSQNEXTA(g, _tPARENT[p], A) : "")
+}
+
+function _rconl(t)
+{
+	_rprt = _rprt _ln(t)
+}
+
+function _rconline(t)
+{
+	_rprt = _rprt _ln((t = " " t " ") _getchrln("_", _CON_WIDTH - length(t) - 1))
+}
+
+#___________________________________________________________
+function _rd_shortcut(D, f)
+{
+	if ((_shrtcutf0 = _filepath(f)) && _shortcut_nerr(_shrtcuta0 = _cmd(_shortcut_fpath " /A:Q /F:\"" _shrtcutf0 "\" 2>&1"), _shrtcutf0)) {
+		ERRNO = ""
+		split(_shrtcuta0, _SHRTCUTA0, /\x0D?\x0A/)
+		for (_shrtcuta0 in _SHRTCUTA0) {
+			for (f in _SHORTCUTRSTRUC) {
+				if (match(_SHRTCUTA0[_shrtcuta0], "^" f)) {
+					D[_SHORTCUTRSTRUC[f]] = substr(_SHRTCUTA0[_shrtcuta0], 1 + RLENGTH)
+				}
+			}
+		}
+	}
+	return (ERRNO ? ERRNO = "read shortcut: " ERRNO : _NOP)
+}
+
+#_______________________________________________________________________
+function _rdfile(f, i, A)
+{
+	################################################
+	if (((f = _filerdne(f)) == "") || (_filene(f) == "")) {
+		ERRNO = "Filename error"
+		return
+	}
+	_fio_cmda = RS
+	RS = ".{1,}"
+	_fio_cmdb = BINMODE
+	BINMODE = "rw"
+	ERRNO = RT = _NUL
+	getline RS < f
+	BINMODE = _fio_cmdb
+	RS = _fio_cmda
+	if (ERRNO == "") {
+		close(f)
+	}
+	if (ERRNO == "") {
+		return RT
+	}
+	return (RT = _NOP)
+}
+
+####################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+#	fn	_th0,_th1,_th2,_th3
+#		USAGE:
+#			_th0(p1,p2,p3,p4)
+#
+#			Each of this functions can have up to 4 parameters.
+#				_th0(p1,p2,p3,p4) return 1st parameter (p1)
+#				_th1(p1,p2,p3,p4) return 2nd parameter (p2)
+#				_th2(p1,p2,p3,p4) return 3rd parameter (p3)
+#				_th3(p1,p2,p3,p4) return 4th parameter (p4)
+#_____________________________________________________________________________
+#	fn	_nop(p1,p2,p3,p4,p5,p6,p7,p8)
+#		USAGE:
+#			_nop()
+#
+#			Does not do any action. No result returned. Up to 8 parameters.
+#_____________________________________________________________________________
+#	fn	_exit(c)
+#		USAGE:
+#			_exit(code)
+#
+#			This function do the same as GAWK-operator `exit code'.
+#_____________________________________________________________________________
+#	fn	_getdate()
+#	fn	_getime()
+#	fn	_getsecond()
+#	fn	_getsecondsync()
+function _rdreg(D, p)
+{
+	################################################################
+	_rdregp0 = "reg query \"" p "\" /S /reg:64 2>NUL"
+	_rdregfld = _rdregkey = 0
+	_rdregq0 = split(gensub(/[\x0D?\x0A]{2,}/, _CHR["EOL"], "G", _cmd(_rdregp0)), _RDREGA0, /\x0D?\x0A/)
+	while (_rdregq0 > 0) {
+		_rdreg_i0(D)
+	}
+	return (_rdregfld + _rdregkey)
+}
+
+#___________________________________________________________
+function _rdreg_i0(D, A)
+{
+	while (_rdregq0 > 0) {
+		if (match(_rdregp0 = _RDREGA0[_rdregq0--], /    (.*)    REG_((SZ)|(DWORD)|(QWORD)|(BINARY)|(EXPAND_SZ)|(MULTI_SZ))    (.*)$/, A)) {
+			if (! _rdreg_i0(D)) {
+				++_rdregfld
+				D[_rdregp0 A[1] "." _RDREGTYPE[A[2]]] = A[9]
+				return
+			} else {
+				break
+			}
+		} else if (_rdregp0 ~ /^HK/) {
+			++_rdregkey
+			return D[_rdregp0 = _rdregp0 "\\"]
+		}
+	}
+	return 1
+}
+
+#_____________________________________________________________________________________________________
+######################################################################################################
+function _rdsafe(A, i, d)
+{
+	if (i in A) {
+		return A[i]
+	}
+	return d
+}
+
+#_______________________________________________________________________
+function _reg_check(p)
+{
+	_tframe("_reg_check_i0", p, p)
+}
+
+#_______________________________________________
+function _reg_check_i0(p, pp, p1, p2)
+{
+	if (_[p]["TYPE"] == "defreg") {
+		if (_[p]["REGPATH"] in _REG) {
+			if ("VALUE" in _[p]) {
+				if (_[p]["VALUE"] == _REG[_[p]["REGPATH"]]) {
+					_creport(p, substr("OK:    REGENTRY MATCH(==" _[p]["VALUE"] "): " _[p]["REGPATH"], 1, 126))
+				} else {
+					_dllerr(p, substr("REGENTRY NOT MATCH(!=" _[p]["VALUE"] "): " _[p]["REGPATH"], 1, 126))
+				}
+			} else if (_VAR[_[p]["REGPATH"]] == _REG[_[p]["REGPATH"]]) {
+				_creport(p, substr("OK:    REGPATH MATCH(==" _VAR[_[p]["REGPATH"]] "): " _[p]["REGPATH"], 1, 126))
+			} else {
+				_dllerr(p, substr("REGPATH NOT MATCH(!=" _VAR[_[p]["REGPATH"]] "): " _[p]["REGPATH"], 1, 126))
+			}
+		} else {
+			_dllerr(p, substr("REGPATH NOT FOUND: " _[p]["REGPATH"], 1, 126))
+		}
+	}
+}
+
+#_____________________________________________________
+function _registryinit()
+{
+	_registrytmpfile = _getmpfile()
+}
+
+# _rdregfld		: gvar	- number of readed registry fields by _rdreg()
+# _rdregkey		: gvar	- number of readed registry keys by _rdreg()
+#_____________________________________________________________________________
+function _regpath0(D, i, s, q, S)
+{
+	############################################ 0 #
+	if (i = _patharr0(S, i)) {
+		if ("name" in S) {
+			D["name"] = S["name"]
+		}
+		if ("ext" in S) {
+			D["ext"] = S["ext"]
+		}
+		s = (toupper(s = i in S ? S[i] : "") in _REGPATH0REGDIR ? D[++q] = _REGPATH0REGDIR[toupper(s)] : (D[++q] = _REGPATH0REGDIR[""]) "\\" (D[++q] = s)) "\\"
+		while (++i in S) {
+			s = s (D[++q] = S[i]) "\\"
+		}
+		if (s != "") {
+			D[0] = s
+		}
+		IGNORECASE = 1
+		D["hostdir"] = "\\\\" (D["host"] = "host" in S && (("" == (i = S["host"])) || "." == i || "?" == i || "localhost" == i) ? ENVIRON["COMPUTERNAME"] : i) "\\" s
+		IGNORECASE = 0
+	}
+}
+
+#_________________________________________________________________________________________
+function _report(p)
+{
+	#######################################################################
+	_report_t0 = _reportparnt = ""
+	_report_i0(p)
+	_tframe("_report_i0", p)
+	return _report_t0
+}
+
+function _report_i0(p, p0, p1, p2)
+{
+	if (p in _tPARENT) {
+		if (_reportparnt != (_reportparnt = _tPARENT[p])) {
+			_report_t0 = _report_t0 _ln() _ln((z = "_ " _[_tPARENT[p]]["NAME"] " ") _getchrln("_", _CON_WIDTH - length(z) - 2)) _ln(_getchrln("#", _CON_WIDTH - 2)) _ln()
+		}
+	}
+	if ("ERROR" in _[p]) {
+		_report_t0 = _report_t0 _reporterr(p, _[p]["ERROR"])
+	}
+	if ("REPORT" in _[p]) {
+		_report_t0 = _report_t0 _ln(_[p]["REPORT"])
+	}
+}
+
+#___________________________________________________________________________________
+function _reporterr(p, t3, pp, t, t2)
+{
+	t = ""
+	pp = p
+	do {
+		"NAME" in _[pp] ? t = _[pp]["NAME"] ": " t : ""
+	} while (pp = _rPARENT(pp))
+	if (match(t3, /\x00/)) {
+		return (substr(t3, 1, RSTART - 1) t substr(t3, RSTART + 1))
+	}
+	return (t t3)
+}
+
+#___________________________________________________________________________________
+####################################################################################
+
+
+
+
+#_______________________________________________________________________
+# _CHR array
+#
+#	_CHR[ASC-code decimal number]=="char"
+#
+#		Contains 256 elements. The index is the decimal number from 0-255.
+#		The value is the single character with ASC-code equivalent to index number:
+#
+#			_CHR[97]		=="a"			- character with ASC-code 97 is `a'
+#
+#		This array is useful if you want to get character using it's ASC-code
+#_________________________________________________________________
+# _ASC array
+#
+#	_ASC[char]==number: ASC-code of char
+#
+#		Contains 256 elements. The index is the any single character with ASC-code \x00-\xFF.
+#		The value is the number equivalent of character's ASC-code:
+#
+#			_ASC["A"]		==65			- ASC-code of character `A' is 65
+#
+#		This array is useful if you want to get ASC-code of the character.
+#_________________________________________________________________
+# _QASC array
+#
+#	_QASC[char]=="string: octal ASC-code of char in 3-digit octal format"
+#
+#		Contains 256 elements. The index is the any single charcter with ASC-code \x00-\xFF.
+#		The value is the octal number equivalent of character's ASC-code in fixed-length - 3-digit - string:
+#
+#			_QASC["!"]		=="041"		- ASC-code of character `!' is 33(decimal) == 41(in octal)
+#			_QASC["\x0D"]	=="015"
+#
+#		This array is useful when some type of string escape conversion is performed. It allows quickly get
+#		replace string for the characters that can be specified only by character code in result string:
+#
+#			"\x0D"	->	"\\015"
+#_______________________________________________________________________
+
+
+
+
+
+
+
+####################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+#	fn	_getchrln(ptt,len)
+#_____________________________________________________________________________
+#	fn	_tabtospc(src,tabstep,xcoord)
+####################################################################################
+
+#_____________________________________________________________________________
+function _retarr(A, i, p, a, q)
+{
+	##################################################
+	if (isarray(A)) {
+		i = i == "" ? 0 : i + 0
+		q = A[_ARRLEN] + 0
+		if (i < q) {
+			return (p A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] _retarr_i0(A, q, i, a))
+		}
+	}
+}
+
+function _retarr_i0(A, q, i, a)
+{
+	if (i < q) {
+		return (A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] A[++i] _retarr_i0(A, q, i, a))
+	}
+	while (q < i) {
+		delete A[++q]
+	}
+	return a
+}
+
+#_________________________________________________________________
+function _retarrd(A, v, i)
+{
+	#########################################
+	if (1 in A) {
+		return (A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] A[10] A[11] A[12] A[13] A[14] A[15] A[16] ((i = 17) in A ? _retarrd_i0(A, i) v : v))
+	}
+	delete A
+	return v
+}
+
+#_____________________________________________________
+function _retarrd_i0(A, i)
+{
+	if (i in A) {
+		return (A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] A[i++] (i in A ? _retarrd_i0(A, i) : ""))
+	}
+	delete A
+}
+
+#_______________________________________________________________________
+########################################################################
+#EXPERIMENTAL
+function _rexpfn(R, t, p)
+{
+	_REXPFN[""] = ""
+	while (t) {
+		t = _rxpfn(R, t, p)
+	}
+	return _REXPFN[""]
+}
+
+function _rexpfnend(t)
+{
+	_REXPFN[""] = t
+}
+
+#_____________________________________________________________________________
+function _rexpstr(r, i, c, A)
+{
+	###################################################
+	c = split(r, A, "")
+	r = ""
+	for (i = 1; i <= c; i++) {
+		r = r _REXPSTR[A[i]]
+	}
+	return r
+}
+
+#_____________________________________________________________________________
+function _rexpstr_i0(t, A, p0)
+{
+	return (_REXPSTR[t] = "\\" t)
+}
+
+#___________________________________________________________
+function _rmtsharerr(h, t)
+{
+	gsub(/[\x0D\x0A]+/, "", t)
+	if (t ~ /^The command failed: 53/) {
+		ERRNO = "host not found: \\\\" h
+	} else {
+		ERRNO = t ": \\\\" h
+	}
+}
+
+function _rpp(q, D, S)
+{
+	_conl()
+	_conline(q)
+	_conl()
+	_regpath0(D, q)
+	#_conl(_dumparr(D))
+	_conl(_ln("DEST:") _dumparr(D))
+	_conl()
+	return q
+}
+
+#_________________________________________________________________________________________
+function _rrdreg(DD, p, k, t, v, c, i, q, tT, A, B, C, D)
+{
+	#############################################	old; regedit
+	if (! _registrytmpfile) {
+		_registryinit()
+	}
+	_cmd("regedit /E \"" _registrytmpfile "\" \"" p "\" 2>&1")
+	q = patsplit(gensub(/[\x00\xFF\xFE]+/, "", "G", _rdfile(_registrytmpfile)), A, /\x0D?\x0A\[[^\]]+\]\x0D?\x0A/, B)
+	for (i = 1; i <= q; i++) {
+		p = gensub(/(^[ \t\x0D\x0A]*\[)|((\\)\\+)|(\][ \t\x0D\x0A]*$)/, "\\3", "G", A[i])
+		DD[p "\\"]
+		delete C[split(B[i], C, /[\x0D\x0A]+/)]
+		for (c = 1; c in C; c++) {
+			tt = tt C[c]
+			if (gsub(/\\$/, "", tt)) {
+				continue
+			}
+			if (tt == "") {
+				continue
+			}
+			if (match(_th0(tt, tt = ""), /((^"(([^\\"]|\\.)*)")|(@))=(("(([^\\"]|\\.)*)")|(dword:([[:xdigit:]]{8}))|(hex(\(([27b])\))?:(.*)))$/, D)) {
+				if (D[7]) {
+					t = "STR"
+					v = _unstr(D[8])
+				} else if (D[10]) {
+					t = "W32"
+					v = D[11]
+				} else {
+					v = D[15]
+					if (D[13]) {
+						switch (D[14]) {
+						case "2":
+							t = "XSZ"
+							break
+						case "7":
+							t = "MSZ"
+							break
+						default:
+							t = "W64"
+						}
+					} else {
+						t = "BIN"
+					}
+				}
+				DD[gensub(/(\\)\\+/, "\\1", "G", p "\\" _unstr(D[3] (D[5] ? "(Default)" : "")) "." t)] = v
+			} else {
+				_fatal("regedit: unknown output format(" c "): `" C[c] "'")
+			}
+		}
+	}
+}
+
+#_________________________________________________________________
+function _rsqgetptr(g, p, A)
+{
+	if (p in _tLINK) {
+		_SQSTACK[g][++_SQSTACK[g][0]] = p
+		_SQSTACK[g][++_SQSTACK[g][0]] = _SQTOPTR[g]
+		while ((p = _tLINK[p]) in _tLINK) {
+			_con(".")
+		}
+		_SQTOPTR[g] = p
+	}
+	if (p in _tFCHLD) {
+		return _rsqgetptr(g, _tFCHLD[p])
+	}
+	return p
+}
+
+#___________________________________________________________
+function _rsqnext_i0(g, p)
+{
+	if (p == _SQTOPTR[g]) {
+		if (_SQSTACK[g][0] > 0) {
+			_SQTOPTR[g] = _SQSTACK[g][_SQSTACK[g][0]--]
+			return _rsqnext_i0(g, _SQSTACK[g][_SQSTACK[g][0]--])
+		}
+		return
+	}
+	if (p in _tNEXT) {
+		return _rsqgetptr(g, _tNEXT[p])
+	}
+	return _rsqnext_i0(g, _tPARENT[p])
+}
+
+function _rtn(v, A)
+{
+	_conl()
+	_conline(_val(v) " : " _val(A))
+	_conl()
+	_rtn2(v, A)
+	_conl()
+}
+
+function _rtn2(v, A, r, t)
+{
+	r = isarray(A) ? _typa(v, A) : _typ(v)
+	if ("`" > _t0 && _t0) {
+		_conl("ggggg")
+	}
+	t = (r ? "TRUE" : "FALSE") " / " (r > 0 ? r ">0" : r "!>0") " / " (r + 0 > 0 ? r "+0>0" : r "+0!>0") " / " (r + 0 != r ? r "+0!=" r : r "+0==" r) " / " (r && "`" > r ? "'`'>" r " && " r : "!('`'>" r " && " r ")")
+	_conl("`" r "' : " t)
+	return r
+}
+
+function _rxpfn(R, t, p, i, f, A)
+{
+	for (i in R) {
+		if (match(t, i, A)) {
+			f = R[i]
+			if (t != (t = @f(A, substr(t, RLENGTH + 1), p))) {
+				return t
+			}
+		}
+	}
+	return _rexpfnend(t)
+}
+
+##############################################################
+
+#_____________________________________________________________________________
+function _sHARE(c, t, P, a, A)
+{
+	###################################################
+	switch (c) {
+	#___________________________________________________________
+	case "_lib_CMDLN":
+		return t
+		#_____________________________________________________
+	case "_lib_APPLY":
+		return
+		#_____________________________________________________
+	case "_lib_HELP":
+		return
+		#_____________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_share 1.000")
+		#_____________________________________________________
+	case "_lib_BEGIN":
+		return
+		#_____________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+################################################################
+
+#_____________________________________________________________________________
+function _sYS(c, t, P, a, A)
+{
+	#####################################################
+	switch (c) {
+	#___________________________________________________________
+	case "_lib_CMDLN":
+		return t
+		#_____________________________________________________
+	case "_lib_APPLY":
+		return
+		#_____________________________________________________
+	case "_lib_HELP":
+		return
+		#_____________________________________________________
+	case "_lib_NAMEVER":
+		return
+		#_____________________________________________________
+	case "_lib_BEGIN":
+		return
+		#_____________________________________________________
+	case "_lib_END":
+		return
+	}
+}
+
+#_______________________________________________________________________
+function _serv_check(p)
+{
+	_tframe("_serv_check_i0", p, p)
+}
+
+#_______________________________________________
+function _serv_check_i0(p, p0, p1, p2, p3, i, q, c)
+{
+	if (_[p]["TYPE"] == "defsrv") {
+		i = IGNORECASE
+		IGNORECASE = 1
+		if (match(_servoutput, roi = "\\012DISPLAY_NAME: " _torexp(_[p]["SERVNAME"]))) {
+			_creport(p, "OK:    SERVICE DETECTED: " substr(_[p]["SERVNAME"], 1, 112))
+		} else {
+			_dllerr(p, "service " _[p]["SERVNAME"] " not detected")
+		}
+	}
+	IGNORECASE = i
+}
+
+#_______________________________________________________________________
+function _setarrsort(f, a)
+{
+	##############################################
+	a = PROCINFO["sorted_in"]
+	if (! f) {
+		delete PROCINFO["sorted_in"]
+	} else {
+		PROCINFO["sorted_in"] = f
+	}
+	return a
+}
+
+#_______________________________________________________________________
+function _setmpath(p, a)
+{
+	################################################
+	ERRNO = ""
+	if ((p) && (a = _filerd(p))) {
+		if (_FILEIO_TMPRD) {
+			_FILEIO_TMPATHS[_FILEIO_TMPRD]
+			#if ( _filexist(a) ) _del(a)
+			#_cmd("rd " a " /S /Q 2>NUL"); _cmd("del " a " /Q 2>NUL")
+		}
+		return (_FILEIO_TMPRD = a)
+	} else {
+		return _warning("`" p "': cannot set temporary folder" (ERRNO ? (": " ERRNO) : ""))
+	}
+}
+
+#_________________________________________________________________________________________
+##########################################################################################
+function _sharelist(D, h, q, c, l, A, B)
+{
+	#################################################
+	delete D
+	c = _sharextool " \\\\" (h == "" ? h = ENVIRON["COMPUTERNAME"] : h) " 2>&1"
+	if (match(c = _cmd(c), /\x0AShare[^\x0A]*Remark/)) {
+		gsub(/(^[^-]*\x0D?\x0A-+\x0D?\x0A[ \t]*)|(\x0D?\x0AThe command completed successfully.*$)/, "", c)
+		l = RLENGTH - 7
+		split(c, A, /([ \t]*\x0D?\x0A)+[ \t]*/)
+		for (c in A) {
+			if (match(A[c], /((([^ \t:]+[ \t]+)*[^ \t:]+)[ \t]+)([A-Za-z])[ \t]*:/, B) && ++q) {
+				D[B[2]] = A[c] ~ /\.\.\.$/ ? _sharepath(h, B[2]) : gensub(/[ \t\\\/]*$/, "\\\\", 1, substr(A[c], 1 + B[1, "length"], l - B[1, "length"]))
+			}
+		}
+		return q
+	}
+	return _rmtsharerr(h, c)
+}
+
+#_____________________________________________________________________________
+function _sharepath(h, s, A)
+{
+	###################################################
+	s = _sharextool " \\\\" (h == "" ? h = ENVIRON["COMPUTERNAME"] : h) "\\\"" s "\" 2>&1"
+	if (match(s = _cmd(s), /\x0APath[ \t]+([^\x0D\x0A]+)/, _SHAREPATHA0)) {
+		return gensub(/[ \t\\\/]*$/, "\\\\", 1, _SHAREPATHA0[1])
+	}
+	return _rmtsharerr(h, s)
+}
+
+function _shortcut(D, S)
+{
+	#############################################################
+	if (isarray(D)) {
+		if (isarray(S)) {
+			_addarrmask(D, S, _SHORTCUTWSTRUC)
+		} else if (S == 0 && S == "") {
+			_addarrmask(D, _SHORTCUTDEFAULT, _SHORTCUTWSTRUC)	# array,array2*		- copy from array2 to array shorcut-specific elements
+		} else if (_isnotfileptr(S)) {
+			_addarrmask(D, _[S], _SHORTCUTWSTRUC)	# array*			- define shortcut-specific elements in array by default values
+		} else if (_rd_shortcut(D, S)) {
+			return
+		}		# array,ptr*		- copy from array _[ptr] to array shorcut-specific elements
+	} else if (D == 0 && D == "") {
+		return _NOP	# -*				- no action(return -)
+	} else if (_isnotfileptr(D)) {
+		if (isarray(S)) {
+			_addarrmask(_[D], S, _SHORTCUTWSTRUC)	# array,filepath*		- define in array shortcut-specific elements by reading its from shortcut file filepath(load shortcut)
+		} else if (S == 0 && S == "") {
+			_addarrmask(_[D], _SHORTCUTDEFAULT, _SHORTCUTWSTRUC)	# ptr,array*		- copy from array to array _[ptr] shorcut-specific elements
+		} else if (_isnotfileptr(S)) {
+			_addarrmask(_[D], _[S], _SHORTCUTWSTRUC)	# ptr*			- define shortcut-specifc elements in array _[ptr] by default values
+		} else if (_rd_shortcut(_[D], S)) {
+			return
+		}		# ptr,ptr2*			- copy from array _[ptr2] to array _[ptr] shorcut-specific elements
+	} else {
+		if (isarray(S) && _wr_shortcut(D, S)) {
+			return	# filepath,array*		- [over]write shorcut file filepath; shortcut parameters will be defined by shortcut-specific elements in array(save shortcut)
+		} else if (S == 0 && S == "" && _wr_shortcut(D, _SHORTCUTDEFAULT)) {
+			return	# filepath*			- [over]write shorcut file filepath; shortcut parameters will be defined by default values
+		} else if (_isnotfileptr(S) && _wr_shortcut(D, _[S])) {
+			return	# filepath,ptr*		- [over]write shorcut file filepath; shortcut parameters will be defined by shortcut-specific elements in array _[ptr](save shortcut)
+		} else if (_rd_shortcut(_SHRTCUTA1, S) || _wr_shortcut(D, _SHRTCUTA1)) {
+			return
+		}		# ptr,filepath*		- define in array _[ptr] shortcut-specific elements by reading its from shortcut file filepath(load shortcut)
+	}	# filepath,filepath2*	- [over]write shorcut file filepath; shortcut parameters will be defined from shortcut file filepath2(copy shortcut)
+	return 1
+}
+
+#________________________________________________
+function _shortcut_init(A, B, q)
+{
+	_SHORTCUTERR[2] = "file not found"
+	_SHORTCUTERR[3] = "no such filepath"
+	_SHORTCUTERR["The system cannot find the file specified."] = "no such filepath"
+	_SHORTCUTERR[5] = "file is folder"
+	_SHORTCUTERR["Access is denied."] = "file is folder"
+	_SHORTCUTERR[123] = "filepath syntax error"
+	_SHORTCUTERR["The filename, directory name, or volume label syntax is incorrect."] = "filepath syntax error"
+	q = "target\t\t\t/T:\t\t\t\tTargetPath=\t\t\t\t\ttarget?\t\t\t;\t\t\t_target\t\t\t\t\t\t\tTargetPathExpanded=\t\t\t\t\t\t\t;\t\t\tparameters\t\t\t/P:\t\t\t\tArguments=\t\t\t\t\tparaneters?\t\t\t;\t\t\t_parameters\t\t\t\t\t\t\tArgumentsExpanded=\t\t\t\t\t\t\t;\t\t\tstartdir\t\t\t/W:\t\t\t\tWorkingDirectory=\t\t\t\tstartdir?\t\t\t;\t\t\t_startdir\t\t\t\t\t\t\tWorkingDirectoryExpanded=\t\t\t\t\t\t;\t\t\trunstyle\t\t\t/R:\t\t\t\tRunStyle=\t\t\t\t\t1\t\t\t\t;\t\t\ticon,index\t\t\t/I:\t\t\t\tIconLocation=\t\t\t\ticon,index?\t\t\t;\t\t\txicon,index\t\t\t\t\t\t\tIconLocationExpanded=\t\t\t\t\t\t\t;\t\t\tshortcut key\t\t/H:\t\t\t\tHotKey=\t\t\t\t\t0\t\t\t\t;\t\t\tdescription\t\t\t/D:\t\t\t\tDescription=\t\t\t\t_env4: default shortcut\t"
+	split(q, _SHRTCUTA0, /[ \t]*;[ \t]*/)
+	for (q in _SHRTCUTA0) {
+		if (match(_SHRTCUTA0[q], /^([^\t]+)\t+([^\t]+)(\t+([^\t]+)(\t+([^\t]+))?)?/, B)) {
+			if (B[3] == "") {
+				_SHORTCUTRSTRUC[B[2]] = B[1]
+			} else if (B[5] == "") {
+				_SHORTCUTWSTRUC[_SHORTCUTRSTRUC[B[4]] = B[1]] = B[2]
+				delete _SHORTCUTDEFAULT[B[1]]
+			} else {
+				_SHORTCUTWSTRUC[_SHORTCUTRSTRUC[B[4]] = B[1]] = B[2]
+				_SHORTCUTDEFAULT[B[1]] = B[6]
+			}
+		} else {
+			_fatal("_shortcut.init: _shortcut_struc: syntax error: `" _SHRTCUTA0[q] "'")
+		}
+	}
+	_SHRTCUTA1[""]
+	delete _SHRTCUTA1[""]
+	_shortcut_fpath = "\\\\localhost\\eGAWK\\LIB\\_shortcut\\_shortcut.exe"
+}
+
+#_____________________________________________________
+function _shortcut_nerr(t, s, A)
+{
+	if (match(t, /\x0ASystem error (-?[0-9]+)[^\x0D\x0A]*[\x0D\x0A]+([^\x0D\x0A]+)/, A)) {
+		ERRNO = (A[1] in _SHORTCUTERR ? _SHORTCUTERR[A[1]] : A[2] in _SHORTCUTERR ? _SHORTCUTERR[A[2]] : tolower(gensub(/^(The )?(((.*)\.$)|(.*[^\.]$))/, "\\4\\5", "G", A[2])) "(" A[1] ")") (s ? ": `" s "'" : "")
+	} else {
+		return 1
+	}
+}
+
+function _split_regpath()
+{
+	_rpp(" / /  / /   ")
+	_rpp(" / /  / / huj  ")
+	_rpp(" / /  / / huj /  ")
+	_rpp(" / /  / / huj / pizda.TSR  ")
+	_rpp(" / /  / / hklm  ")
+	_rpp(" / /  / / hklm /  ")
+	_rpp(" / /  / / hklm / huj ")
+	_rpp(" / /  / / hklm / huj / ")
+	_rpp(" / /  / / hklm / huj / \tpizda.TSR  ")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_rpp(" / /  / / hklm / software / altiris /  fi le . ex t ")
+	_rpp(" / / . / / hkcr / software / altiris /  fi le . ex t ")
+	_rpp(" / / ? / / hKcU / software / altiris /  fi le . ex t ")
+	_rpp(" / / lOcAlHoSt / / hKu / software / altiris /  fi le . ex t ")
+	_rpp(" / / ho st / / hKcc / software / altiris /  fi le . ex t ")
+	_rpp(" / / ho st / / hKPd / software / altiris /  fi le . ex t ")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+}
+
+function _splitpath_test()
+{
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_fpp("  ")
+	_fpp(" fi le . ex t ")
+	_fpp(" di r0 / / ")
+	_fpp(" di r0 / / fi le . ex t ")
+	_fpp(" / ")
+	_fpp(" / fi le . ex t ")
+	_fpp(" / di r0 / /  ")
+	_fpp(" / di r0 / / fi le . ex t ")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_fpp(" c : ")
+	_fpp(" c : fi le . ex t ")
+	_fpp(" c : di r0 / / ")
+	_fpp(" c : di r0 / / fi le . ex t ")
+	_fpp(" c : / / ")
+	_fpp(" c : / / fi le . ex t ")
+	_fpp(" c : / / di r0 / /  ")
+	_fpp(" c : / / di r0 / / fi le . ex t ")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_fpp(" / /  ")
+	_fpp(" / / ho st . hs t ")
+	_fpp(" / / ho st / /  ")
+	_fpp(" / / ho st / / fi le . ex t ")
+	_fpp(" / / ho st / / di r0 / / ")
+	_fpp(" / / ho st / / di r0 / / fi le . ex t ")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_fpp(" / / ho st / / c : ")
+	_fpp(" / / ho st / / c : fi le . ex t ")
+	_fpp(" / / ho st / / c : di r0 / / ")
+	_fpp(" / / ho st / / c : di r0 / / fi le . ex t ")
+	_fpp(" / / ho st / / c : / / ")
+	_fpp(" / / ho st / / c : / / fi le . ex t ")
+	_fpp(" / / ho st / / c : / / di r0 / / ")
+	_fpp(" / / ho st / / c : / / di r0 / / fi le . ex t ")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_fpp(" http : / / / ")
+	_fpp(" http : / / / si te . ex t ")
+	_fpp(" http : / / / si te / /  ")
+	_fpp(" http : / / / si te / / fi le . ex t ")
+	_fpp(" http : / / / si te / / di r0 / / ")
+	_fpp(" http : / / / si te / / di r0 / / fi le . ex t ")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_fpp(" ftp : / / / : po rt ")
+	_fpp(" ftp : / / / si te . ex t : po rt ")
+	_fpp(" ftp : / / / si te : po rt / /  ")
+	_fpp(" ftp : / / / si te : po rt / / fi le . ex t ")
+	_fpp(" ftp : / / / si te : po rt / / di r0 / / ")
+	_fpp(" ftp : / / / si te : po rt / / di r0 / / fi le . ex t ")
+	_conl()
+	_conl("##  //.  ######################################################################################")
+	_conl()
+	_fpp(" / / . ")
+	_fpp(" / / . / / ")
+	_fpp(" / / . / / com 56 ")
+	_fpp(" / / . / / com 56 / / ")
+	_fpp(" / / . / / c : ")
+	_fpp(" / / . / / c : / / ")
+	_fpp(" / / . / / c :  com 56 ")
+	_fpp(" / / . / / c :  com 56 / / ")
+	_fpp(" / / . / / c : / / com 56 ")
+	_fpp(" / / . / / c : / / com 56 / / ")
+	_conl()
+	_conl("##  //?  ######################################################################################")
+	_conl()
+	_fpp(" / / ? ")
+	_fpp(" / / ? / / ")
+	_fpp(" / / ? / / com 56 ")
+	_fpp(" / / ? / / com 56 / / ")
+	_fpp(" / / ? / / c : ")
+	_fpp(" / / ? / / c : / / ")
+	_fpp(" / / ? / / c :  com 56 ")
+	_fpp(" / / ? / / c :  com 56 / / ")
+	_fpp(" / / ? / / c : / / com 56 ")
+	_fpp(" / / ? / / c : / / com 56 / / ")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_fpp(" / /  /  ")
+	_fpp(" / /  / . hs t ")
+	_fpp(" / /  / / fi le . ex t ")
+	_fpp(" / /  / / di r0 / / ")
+	_fpp(" / /  / / di r0 / / di r1 / fi le . ex t ")
+	_fpp(" / /  / / c : ")
+	_fpp(" / /  / / c : fi le . ex t ")
+	_fpp(" / /  / / c : di r0 / / ")
+	_fpp(" / /  / / c : di r0 / / fi le . ex t ")
+	_fpp(" / /  / / c : / / ")
+	_fpp(" / /  / / c : / / fi le . ex t ")
+	_fpp(" / /  / / c : / / di r0 / / ")
+	_fpp(" / /  / / c : / / di r0 / / fi le . ex t ")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	return
+}
+
+#_______________________________________________________________________
+function _splitstr(A, t, r)
+{
+	########################################### 1 #
+	if (_istr(t)) {
+		if (_splitstr_i0(A, t) > 0) {
+			return _splitstrp0
+		}
+		if (_istr(r)) {
+			return _splitstr_i0(A, r)
+		}
+	} else {
+		if (it == "A") {
+			if (length(t) > 0) {
+				_movarr(A, t)
+				return (0 - length(A))
+			}
+		}
+		_istr(r)
+	}
+	if (it == "A") {
+		if (length(r) > 0) {
+			_movarr(A, r)
+			return (0 - length(A))
+		}
+	}
+}
+
+#_____________________________________________________
+function _splitstr_i0(A, t, C)
+{
+	if (2 > (_splitstrq0 = patsplit(t, _SPLITSTRA0, /([^,\xB4]*\xB4.)*[^,\xB4]*/))) {
+		_splitstrq0 = split(gensub(/\xB4(.)/, "\\1", "G", t), _SPLITSTRA0, "")
+	}
+	delete A
+	_splitstri0 = _splitstrp0 = 0
+	while (_splitstri0++ < _splitstrq0) {
+		if ((t = gensub(/\xB4(.)/, "\\1", "G", _SPLITSTRA0[_splitstri0])) in C || t == "") {
+			continue
+		}
+		C[A[++_splitstrp0] = t]
+	}
+	return _splitstrp0
+}
+
+#_______________________________________________
+function _strtorexp(t)
+{
+	gsub(/[\\\.\?\*\+\-\(\)\{\}\[\]\^\$\/\|]/, "\\\\&", t)
+	t = split(t, _TOREXP_STRA, /[\x00-\x1F]/, _TOREXP_STRB)
+	_torexp_strt0 = ""
+	for (_torexp_stri0 = 1; _torexp_stri0 < t; _torexp_stri0++) {
+		_torexp_strt0 = _torexp_strt0 _TOREXP_STRA[_torexp_stri0] "\\" _QASC[_TOREXP_STRB[_torexp_stri0]]
+	}
+	return (_torexp_strt0 _TOREXP_STRA[_torexp_stri0])
+}
+
+function _subseqoff(r, B)
+{
+	patsplit(r, B, /\x84[^\x94]*\x94/)
+	return gensub(/\x84[^\x94]*\x94/, "\204", "G", r)
+}
+
+function _subseqon(B, r, F, f, s, e, q, i, A)
+{
+	q = split(r, A, /\x84/)
+	r = ""
+	f = F[""]
+	for (i = 1; i < q; i++) {
+		s = substr(e = B[i], 2, 1)
+		#_conl("curr r==`" r "': A[" i "]=`" A[i] "'")
+		#s=s in F ? _th0(F[s],_conl("handler `" F[s] "' for `" s "' ost=`" substr(e,3,length(e)-3) "'")) : _th0(F[""],_conl("default handler for `" s "'"))
+		s = s in F ? F[s] : F[""]
+		#_conl("`" f "'")
+		r = r (@f(A[i])) (@s(substr(e, 3, length(e) - 3)))
+	}
+	return (r (@f(A[i])))
+}
+
+#_____________________________________________________________________________
+# _rdreg(ARRAY,reg_path)
+#		Import into ARRAY the content of the whole registree tree with the higher point specified by reg_path.
+#		ARRAY will be filled by the strings with following format:
+#
+# HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GnuWin32\CoreUtils\5.3.0\pck\InstallPath.STR=C:\Program Files (x86)\GnuWin32
+#	where:
+# HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\GnuWin32\CoreUtils\5.3.0\pck									<- REG KEY PATH
+#											     InstallPath							<- DATA FIELD
+#													     STR						<- TYPE
+#														   C:\Program Files (x86)\GnuWin32	<- VALUE
+# TYPE:
+#	STR		- REG_SZ		(String Value)
+#	W32		- REG_DWORD		(DWORD (32-bit) Value)
+#	W64		- REG_QWORD		(QWORD (64-bit) Value)
+#	BIN		- REG_BINARY	(Binary Value)
+#	XSZ		- REG_EXPAND_SZ	(Expandable String Value)
+#	MSZ		- REG_MULTI_SZ	(Multi-String Value)
+#_________________________________________________________________________________________
+
+
+
+
+# HKCR		HKEY_CLASSES_ROOT
+# HKCU		HKEY_CURRENT_USER
+# HKLM		HKEY_LOCAL_MACHINE
+# HKU			HKEY_USERS
+# HKCC		HKEY_CURRENT_CONFIG
+# HKPD		HKEY_PERFORMANCE_DATA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#___________________________________________________________________________________
+####################################################################################
+function _sysinfo(D, h)
+{
+	##############################################################
+	h = "wmic /NODE: \"" h "\" OS 2>NUL"
+	if (split(_cmd(h), _SYSINFOA0, /[\x0D\x0A]+/) == 3) {
+		_sysinfol0 = length(h = _SYSINFOA0[2]) + 1
+		_sysinfoq0 = _sysinfoq1 = split(_SYSINFOA0[1], _SYSINFOA0, / +/, _SYSINFOB0)
+		while (--_sysinfoq0 > 0) {
+			D[_sysinfof0] = gensub(/^ +| +$/, "", "G", substr(h, _sysinfol0 = _sysinfol0 - (_sysinfol1 = length(_sysinfof0 = _SYSINFOA0[_sysinfoq0]) + length(_SYSINFOB0[_sysinfoq0])), _sysinfol1))
+		}
+		return (_sysinfoq1 - 1)
+	}
+}
+
+#########################################################
+function _tOBJ(c, t, P)
+{
+	switch (c) {
+	#___________________________________________________________
+	case "_lib_CMDLN":
+		return t
+		#___________________________________________________________
+	case "_lib_APPLY":
+		return
+		#___________________________________________________________
+	case "_lib_HELP":
+		return
+		#___________________________________________________________
+	case "_lib_NAMEVER":
+		return _ln("_tOBJ 3.0")
+		#___________________________________________________________
+	case "_lib_BEGIN":
+		return
+		#___________________________________________________________
+	case "_lib_END":
+		return
+		#___________________________________________________________
+	case "_lib_CLEANUP":
+		return _tOBJ_CLEANUP()
+	}
+}
+
+#_______________________________________________________________________
+function _tOBJ_CLEANUP(p)
+{
+	##############################################
+	for (p in UIDSDEL) {
+		delete _ptr[p]
+		delete _tPREV[p]
+		delete _tPARENT[p]
+		delete _tNEXT[p]
+		delete _tFCHLD[p]
+		delete _tQCHLD[p]
+		delete _tLCHLD[p]
+		delete _TMP0[p]
+		delete _TMP1[p]
+		delete _tLINK[p]
+		delete _tCLASS[p]
+	}
+}
+
+#_______________________________________________________________________
+function _tabtospc(t, ts, xc, a, c, n, A, B)
+{
+	##################################
+	if (! ts) {
+		ts = _TAB_STEP_DEFAULT
+	}
+	c = split("." t, A, /\t+/, B)
+	A[1] = substr(A[1], 2)
+	t = ""
+	for (n = 1; n <= c; n++) {
+		t = t A[n] _getchrln(" ", (xc = length(B[n]) * ts + int((a = xc + length(A[n])) / ts) * ts) - a)
+	}
+	return t
+}
+
+#___________________________________________________________________________________
+####################################################################################
+function _tapi(p, f, p0, p1, p2, p3, c)
+{
+	c = p
+	do {
+		if (f in _[c]["API"]) {
+			f = _[c]["API"][f]
+			return @f(p, p0, p1, p2, p3)
+		}
+		c = _[c]["CLASS"]
+	} while ("CLASS" in _[c])
+}
+
+#_____________________________________________________________________________
+function _tbframe(f, p, p0, p1)
+{
+	##################################################
+	delete _t_ENDF[++_t_ENDF[0]]
+	f = p ? _tbframe_i0(f, p, p0, p1) : ""
+	--_t_ENDF[0]
+	return f
+}
+
+#___________________________________________________________
+function _tbframe_i0(f, p, p0, p1, a)
+{
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	return (p in _tLCHLD ? _tmbframe(f, _tLCHLD[p], p0, p1) : @f(p, p0, p1))
+}
+
+#_______________________________________________________________________
+function _tbframex(f, p, p0, p1)
+{
+	###########################################
+	delete _t_ENDF[++_t_ENDF[0]]
+	f = p ? _tbframex_i0(f, p, p0, p1) : ""
+	--_t_ENDF[0]
+	return f
+}
+
+#___________________________________________________________
+function _tbframex_i0(f, p, p0, p1)
+{
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	return (p in _tLCHLD ? _tmbframex(f, _tLCHLD[p], p0, p1) : @f(p, p0, p1))
+}
+
+#_____________________________________________________________________________
+function _tbpass(f, p, p0, p1)
+{
+	###################################################
+	delete _t_ENDF[++_t_ENDF[0]]
+	f = p ? _tbpass_i0(f, p, p0, p1) : ""
+	--_t_ENDF[0]
+	return f
+}
+
+#___________________________________________________________
+function _tbpass_i0(f, p, p0, p1, a)
+{
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	return (p in _tLCHLD ? _tmbpass(f, _tLCHLD[p], p0, p1) : @f(p, p0, p1))
+}
+
+#_____________________________________________________________________________
+function _tbpassx(f, p, p0, p1)
+{
+	##################################################
+	delete _t_ENDF[++_t_ENDF[0]]
+	f = p ? _tbpassx_i0(f, p, p0, p1) : ""
+	--_t_ENDF[0]
+	return f
+}
+
+#___________________________________________________________
+function _tbpassx_i0(f, p, p0, p1)
+{
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	return (p in _tLCHLD ? _tmbpassx(f, _tLCHLD[p], p0, p1) : @f(p, p0, p1))
+}
+
+#_____________________________________________________________________________
+function _tbrochld(p, f, pp)
+{
+	###################################################				# TEST!!!
+	if (p) {
+		if (p in _tFCHLD) {
+			f = _tFCHLD[p]
+			delete _tFCHLD[p]
+			delete _tLCHLD[p]
+			if (p in _tPARENT) {
+				pp = _tPARENT[p]
+				delete _tPARENT[p]
+				if (p in _tPREV) {
+					_tNEXT[_tPREV[f] = _tPREV[p]] = f
+					delete _tPREV[p]
+				} else {
+					_tFCHLD[pp] = f
+				}
+				for (; f in _tNEXT; f = _tNEXT[f]) {
+					_tPARENT[f] = pp
+				}
+				_tPARENT[f] = pp
+				if (p in _tNEXT) {
+					_tPREV[_tNEXT[f] = _tNEXT[p]] = f
+					delete _tNEXT[p]
+				} else {
+					_tLCHLD[pp] = f
+				}
+				_tQCHLD[pp] = _tQCHLD[pp] + _tQCHLD[p] - 1
+				delete _tQCHLD[p]
+				return f
+			} else {
+				delete _tQCHLD[p]
+				if (p in _tPREV) {
+					_tNEXT[_tPREV[f] = _tPREV[p]] = f
+					delete _tPREV[p]
+				}
+				for (; f in _tNEXT; f = _tNEXT[f]) {
+					delete _tPARENT[f]
+				}
+				delete _tPARENT[f]
+				if (p in _tNEXT) {
+					_tPREV[_tNEXT[f] = _tNEXT[p]] = f
+					delete _tNEXT[p]
+				}
+				return f
+			}
+		} else if (p in _tPARENT) {
+			pp = _tPARENT[p]
+			delete _tPARENT[p]
+			if (p in _tPREV) {
+				if (p in _tNEXT) {
+					_tNEXT[_tPREV[f] = _tPREV[p]] = f = _tNEXT[p]
+					delete _tNEXT[p]
+				} else {
+					delete _tNEXT[_tLCHLD[pp] = _tPREV[p]]
+				}
+				delete _tPREV[p]
+				_tQCHLD[pp]--
+			} else if (p in _tNEXT) {
+				delete _tPREV[_tFCHLD[pp] = _tNEXT[p]]
+				delete _tNEXT[p]
+				_tQCHLD[pp]--
+			} else {
+				delete _tFCHLD[pp]
+				delete _tLCHLD[pp]
+				delete _tQCHLD[pp]
+			}
+		} else if (p in _tPREV) {
+			if (p in _tNEXT) {
+				_tNEXT[_tPREV[f] = _tPREV[p]] = f = _tNEXT[p]
+				delete _tNEXT[p]
+			} else {
+				delete _tNEXT[_tPREV[p]]
+			}
+			delete _tPREV[p]
+		} else if (p in _tNEXT) {
+			delete _tPREV[_tNEXT[p]]
+			delete _tNEXT[p]
+		}
+	}
+	return p
+}
+
+#_________________________________________________________________
+function _tbrunframe(f, p, p0, p1)
+{
+	###################################
+	return _tbframe(f ? f : "_trunframe_i0", p, p0, p1)
+}
+
+#_________________________________________________________________
+function _tbrunframex(f, p, p0, p1)
+{
+	##################################
+	return _tbframex(f ? f : "_trunframe_i0", p, p0, p1)
+}
+
+#_________________________________________________________________
+function _tbrunpass(f, p, p0, p1)
+{
+	####################################
+	return _tbpass(f ? f : "_trunframe_i0", p, p0, p1)
+}
+
+#_________________________________________________________________
+function _tbrunpassx(f, p, p0, p1)
+{
+	###################################
+	return _tbpassx(f ? f : "_trunframe_i0", p, p0, p1)
+}
+
+#_____________________________________________________________________________
+function _tdel(p, i)
+{
+	##########################################################
+	if (p in _) {
+		_texclude(p)
+		for (i in _ptr[p]) {
+			if (isarray(_ptr[p][i])) {
+				_tdel_i1(_ptr[p][i])
+			} else if ((i = _ptr[p][i])) {
+				_tdel(i)
+			}
+		}
+		if (p in _tFCHLD) {
+			i = _tFCHLD[p]
+			do {
+				i = (i in _tNEXT ? _tNEXT[i] : "") _tdel_i0(i)
+			} while (i)
+		}
+		delete _[p]
+		_UIDSDEL[p]
+	}
+}
+
+#_____________________________________________________
+function _tdel_i0(p, i)
+{
+	for (i in _ptr[p]) {
+		if (isarray(_ptr[p][i])) {
+			_tdel_i1(_ptr[p][i])
+		} else if ((i = _ptr[p][i])) {
+			_tdel(i)
+		}
+	}
+	if (p in _tFCHLD) {
+		i = _tFCHLD[p]
+		do {
+			i = (i in _tNEXT ? _tNEXT[i] : "") _tdel_i0(i)
+		} while (i)
+	}
+	delete _[p]
+	_UIDSDEL[p]
+}
+
+#_____________________________________________________
+function _tdel_i1(A, i)
+{
+	for (i in A) {
+		if (isarray(A[i])) {
+			_tdel_i1(A[i])
+		} else if ((i = A[i])) {
+			_tdel(i)
+		}
+	}
+}
+
+#_____________________________________________________________________________
+function _tdelete(p, v)
+{
+	#######################################################				# REMAKE EXCLUDE
+	if (p) {
+		_wLCHLD(_tDELPTR, p)
+	}
+	return v
+}
+
+#_________________________________________________________________
+function _tdelitem(p)
+{
+	#############################################
+	if (p) {
+		if ("HOST" in _PTR[p] && "ITEMNAME" in _[p]) {
+			return _wLCHLD(_PTR[_PTR[p]["HOST"]]["ITEM"][_[p]["ITEMNAME"]], p)
+		}
+		_tdelete(p)
+		return p
+	}
+}
+
+#_______________________________________________________________________
+function _tend(a, b)
+{
+	#####################################################
+	if (b == "") {
+		return (_t_ENDF[_t_ENDF[0]] = a)
+	} else {
+		return (_t_ENDF[_t_ENDF[0] + a] = b)
+	}
+}
+
+#_____________________________________________________________________________
+function _texclude(p, v, pp)
+{
+	###################################################				# TEST!!!
+	if (p in _) {
+		if (p in _tPARENT) {
+			pp = _tPARENT[p]
+			delete _tPARENT[p]
+			if (p in _tPREV) {
+				if (p in _tNEXT) {
+					_tPREV[_tNEXT[v] = _tNEXT[p]] = v = _tPREV[p]
+					delete _tNEXT[p]
+				} else {
+					delete _tNEXT[_tLCHLD[pp] = _tPREV[p]]
+				}
+				delete _tPREV[p]
+			} else if (p in _tNEXT) {
+				delete _tPREV[_tFCHLD[pp] = _tNEXT[p]]
+				delete _tNEXT[p]
+			} else {
+				delete _tFCHLD[pp]
+				delete _tLCHLD[pp]
+				delete _tQCHLD[pp]
+				return p
+			}
+			--_tQCHLD[pp]
+		} else if (p in _tPREV) {
+			if (p in _tNEXT) {
+				_tPREV[_tNEXT[v] = _tNEXT[p]] = v = _tPREV[p]
+				delete _tNEXT[p]
+			} else {
+				delete _tNEXT[_tPREV[p]]
+			}
+			delete _tPREV[p]
+		} else if (p in _tNEXT) {
+			delete _tPREV[_tNEXT[p]]
+			delete _tNEXT[p]
+		}
+		return p
+	}
+}
+
+# _tDLINK progressive development: concrete _tDLINK function\processing algo; all frame's families support
+#_____________________________________________________________________________
+function _tframe(fF, p, p0, p1, p2)
+{
+	###############################################
+	delete _t_ENDF[++_t_ENDF[0]]
+	p = _isptr(p) ? isarray(fF) ? _tframe_i1(fF, p, p0, p1, p2) : _tframe_i0(fF, p, p0, p1, p2) : ""
+	--_t_ENDF[0]
+	return p
+}
+
+#_____________________________________________________________________________
+function _tframe0(f, p, p0, p1, p2, p3, A)
+{
+	#########################################
+	if (_isptr(p)) {
+		if (isarray(f)) {
+			return _tframe0_i0(f, p)
+		}
+		_tframex_p0(A, f, 0)
+		return _th0(_tframe0_i0(A, p), --_TEND[_ARRLEN])
+	}
+}
+
+#_______________________________________________
+function _tframe0_i0(A, p, f)
+{
+	if (p in _tLINK) {
+		_tframe_link = p
+		if ("`" in A) {
+			f = A["`"]
+			while (p in _tLINK) {
+				@f(p = _tLINK[p])
+			}
+		} else {
+			while (p in _tLINK) {
+				p = _tLINK[p]
+			}
+		}
+	} else {
+		_tframe_link = ""
+	}
+	if (p in _tFCHLD) {
+		return (_tframe0_i2(A, "^", p) _tframe0_i1(A, _tFCHLD[p]))
+	}
+	return _tframe0_i2(A, ".", p)
+}
+
+#_______________________________________________
+function _tframe0_i1(A, p)
+{
+	if (_TEND[_ARRLEN] in _TEND) {
+		return
+	}
+	if (p in _tNEXT) {
+		return (_tframe0_i0(A, p) _tframe0_i1(A, _tNEXT[p]))
+	}
+	return _tframe0_i0(A, p)
+}
+
+#_______________________________________________
+function _tframe0_i2(A, m, p)
+{
+	_tframe_dlink = p
+	while (p in _tDLINK) {
+		p = _tDLINK[p]
+	}
+	if (m in A) {
+		if ((m "~") in A) {
+			if (! (_TYPEWORD in _[p]) || A[m "~"] !~ _[p][_TYPEWORD]) {
+				return
+			}
+		}
+		m = A[m]
+		return @m(p)
+	}
+}
+
+#_________________________________________________________________
+function _tframe1(f, p, p0, p1, p2, p3, A)
+{
+	#############################
+	if (_isptr(p)) {
+		if (isarray(f)) {
+			return _tframe1_i0(f, p, p0)
+		}
+		_tframex_p0(A, f, 1)
+		return _th0(_tframe1_i0(A, p, p0), --_TEND[_ARRLEN])
+	}
+}
+
+#_______________________________________________
+function _tframe1_i0(A, p, p0)
+{
+	_tframe_link = p
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	if (p in _tFCHLD) {
+		return (_tframe1_i2(A, "^", p, p0) _tframe1_i1(A, _tFCHLD[p], p0))
+	}
+	return _tframe1_i2(A, ".", p, p0)
+}
+
+#_______________________________________________
+function _tframe1_i1(A, p, p0)
+{
+	if (_TEND[_ARRLEN] in _TEND) {
+		return
+	}
+	if (p in _tNEXT) {
+		return (_tframe1_i0(A, p, p0) _tframe1_i1(A, _tNEXT[p], p0))
+	}
+	return _tframe1_i0(A, p, p0)
+}
+
+#_______________________________________________
+function _tframe1_i2(A, m, p, p0)
+{
+	_tframe_dlink = p
+	while (p in _tDLINK) {
+		p = _tDLINK[p]
+	}
+	if (m in A) {
+		if ((m "~") in A) {
+			if (! (_TYPEWORD in _[p]) || A[m "~"] !~ _[p][_TYPEWORD]) {
+				return
+			}
+		}
+		m = A[m]
+		return @m(p, p0)
+	}
+}
+
+#_________________________________________________________________
+function _tframe2(f, p, p0, p1, p2, p3, A)
+{
+	#############################
+	if (_isptr(p)) {
+		if (isarray(f)) {
+			return _tframe2_i0(f, p, p0, p1)
+		}
+		_tframex_p0(A, f, 2)
+		return _th0(_tframe2_i0(A, p, p0, p1), --_TEND[_ARRLEN])
+	}
+}
+
+#_______________________________________________
+function _tframe2_i0(A, p, p0, p1)
+{
+	_tframe_link = p
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	if (p in _tFCHLD) {
+		return (_tframe2_i2(A, "^", p, p0, p1) _tframe2_i1(A, _tFCHLD[p], p0, p1))
+	}
+	return _tframe2_i2(A, ".", p, p0, p1)
+}
+
+#_______________________________________________
+function _tframe2_i1(A, p, p0, p1)
+{
+	if (_TEND[_ARRLEN] in _TEND) {
+		return
+	}
+	if (p in _tNEXT) {
+		return (_tframe2_i0(A, p, p0, p1) _tframe2_i1(A, _tNEXT[p], p0, p1))
+	}
+	return _tframe2_i0(A, p, p0, p1)
+}
+
+#_______________________________________________
+function _tframe2_i2(A, m, p, p0, p1)
+{
+	_tframe_dlink = p
+	while (p in _tDLINK) {
+		p = _tDLINK[p]
+	}
+	if (m in A) {
+		if ((m "~") in A) {
+			if (! (_TYPEWORD in _[p]) || A[m "~"] !~ _[p][_TYPEWORD]) {
+				return
+			}
+		}
+		m = A[m]
+		return @m(p, p0, p1)
+	}
+}
+
+#_________________________________________________________________
+function _tframe3(f, p, p0, p1, p2, p3, A)
+{
+	#############################
+	if (_isptr(p)) {
+		if (isarray(f)) {
+			return _tframe3_i0(f, p, p0, p1, p2)
+		}
+		_tframex_p0(A, f, 3)
+		return _th0(_tframe3_i0(A, p, p0, p1, p2), --_TEND[_ARRLEN])
+	}
+}
+
+#_______________________________________________
+function _tframe3_i0(A, p, p0, p1, p2)
+{
+	_tframe_link = p
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	if (p in _tFCHLD) {
+		return (_tframe3_i2(A, "^", p, p0, p1, p2) _tframe3_i1(A, _tFCHLD[p], p0, p1, p2))
+	}
+	return _tframe3_i2(A, ".", p, p0, p1, p2)
+}
+
+#_______________________________________________
+function _tframe3_i1(A, p, p0, p1, p2)
+{
+	if (_TEND[_ARRLEN] in _TEND) {
+		return
+	}
+	if (p in _tNEXT) {
+		return (_tframe3_i0(A, p, p0, p1, p2) _tframe3_i1(A, _tNEXT[p], p0, p1, p2))
+	}
+	return _tframe3_i0(A, p, p0, p1, p2)
+}
+
+#_______________________________________________
+function _tframe3_i2(A, m, p, p0, p1, p2)
+{
+	_tframe_dlink = p
+	while (p in _tDLINK) {
+		p = _tDLINK[p]
+	}
+	if (m in A) {
+		if ((m "~") in A) {
+			if (! (_TYPEWORD in _[p]) || A[m "~"] !~ _[p][_TYPEWORD]) {
+				return
+			}
+		}
+		m = A[m]
+		return @m(p, p0, p1, p2)
+	}
+}
+
+#_________________________________________________________________
+function _tframe4(f, p, p0, p1, p2, p3, A)
+{
+	#############################
+	if (_isptr(p)) {
+		if (isarray(f)) {
+			return _tframe4_i0(f, p, p0, p1, p2, p3)
+		}
+		_tframex_p0(A, f, 4)
+		return _th0(_tframe4_i0(A, p, p0, p1, p2, p3), --_TEND[_ARRLEN])
+	}
+}
+
+#_______________________________________________
+function _tframe4_i0(A, p, p0, p1, p2, p3)
+{
+	_tframe_link = p
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	if (p in _tFCHLD) {
+		return (_tframe4_i2(A, "^", p, p0, p1, p2, p3) _tframe4_i1(A, _tFCHLD[p], p0, p1, p2, p3))
+	}
+	return _tframe4_i2(A, ".", p, p0, p1, p2, p3)
+}
+
+#_______________________________________________
+function _tframe4_i1(A, p, p0, p1, p2, p3)
+{
+	if (_TEND[_ARRLEN] in _TEND) {
+		return
+	}
+	if (p in _tNEXT) {
+		return (_tframe4_i0(A, p, p0, p1, p2, p3) _tframe4_i1(A, _tNEXT[p], p0, p1, p2, p3))
+	}
+	return _tframe4_i0(A, p, p0, p1, p2, p3)
+}
+
+#_______________________________________________
+function _tframe4_i2(A, m, p, p0, p1, p2, p3)
+{
+	_tframe_dlink = p
+	while (p in _tDLINK) {
+		p = _tDLINK[p]
+	}
+	if (m in A) {
+		if ((m "~") in A) {
+			if (! (_TYPEWORD in _[p]) || A[m "~"] !~ _[p][_TYPEWORD]) {
+				return
+			}
+		}
+		m = A[m]
+		return @m(p, p0, p1, p2, p3)
+	}
+}
+
+#___________________________________________________________
+function _tframe_i0(f, p, p0, p1, p2, a)
+{
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	return (p in _tFCHLD ? _tmframe_i0(f, _tFCHLD[p], p0, p1, p2) : (p in _tDLINK ? @f(_tDLINK[p], p0, p1, p2) : @f(p, p0, p1, p2)))
+}
+
+#___________________________________________________________
+function _tframe_i1(F, p, p0, p1, p2, a)
+{
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	return (p in _tFCHLD ? ("." in F ? _th1(a = F["."], @a(p, p0, p1, p2)) : "") _tmframe_i1(F, _tFCHLD[p], p0, p1, p2) : (">" in F ? _th1(a = F[">"], p in _tDLINK ? @a(_tDLINK[p], p0, p1, p2) : @a(p, p0, p1, p2)) : ""))
+}
+
+#_______________________________________________________________________
+function _tframex(f, p, p0, p1)
+{
+	############################################
+	delete _t_ENDF[++_t_ENDF[0]]
+	f = p ? _tframex_i0(f, p, p0, p1) : ""
+	--_t_ENDF[0]
+	return f
+}
+
+#___________________________________________________________
+function _tframex_i0(f, p, p0, p1)
+{
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	return (p in _tFCHLD ? _tmframex(f, _tFCHLD[p], p0, p1) : @f(p, p0, p1))
+}
+
+#_____________________________________________________
+function _tframex_p0(A, f, q, i, B, C)
+{
+	_tframe_qparam = q
+	delete _TEND[++_TEND[_ARRLEN]]
+	if (match(f, /\~(.*)$/, B)) {
+		A["^~"] = A[".~"] = B[1]
+		f = substr(f, 1, RSTART - 1)
+	}
+	A["."] = A["^"] = f
+	return
+	q = split(f, B, /;/)
+	i = 0
+	while (i < q) {
+		_tframex_p1(A, C[i])
+		while (++i <= q) {
+			_tframex_p1(A, C[i], B[i])
+		}
+	}
+}
+
+#_______________________________________________
+function _tframex_p1(A, v, i, r, B)
+{
+	gsub(/[ \t]+/, "", v)
+	while (match(v, /^([^~]*)~\/(([^\/\\]*\\.)*[^\/\\]*)\//, B)) {
+		v = B[1] substr(v, RSTART + RLENGTH)
+		r = B[2]
+	}
+	if (i == "") {
+		if (v != "") {
+			A["."] = v
+			delete A["`"]
+			delete A["^"]
+		}
+		if (r != "") {
+			A[".~"] = A["`~"] = A["^~"] = r
+		}
+	} else if (match(v, /!/)) {
+		delete A[i]
+	} else {
+		A[i] = v
+		if (r != "") {
+			A[i "~"] = r
+		}
+	}
+}
+
+#_____________________________________________________
+#	F	v	action
+#-----------------------------------------------------
+#	-	*	no additional action
+#	A	B	delete A[p] and define A[p] as array; copy array B to array A[p]
+#	A	-	delete A[p]
+#	A	"*"	delete A[p]; A[p]="*"
+#	"*"	B	define _[p]["*"] as array; copy array B to array _[p]["*"]
+#	"*"	-	run _mpu program "*" for `p
+#	"*0"	"*1"	_[p]["*0"]="*1"
+#___________________________________________________________
+function _tgenuid(c)
+{
+	for (_uidcntr in _UIDARR1) {
+		delete _UIDARR1[_uidcntr]
+		for (c in _UIDARR0) {
+			_UIDS[_uidcntr c]
+		}
+		delete _UIDS[_uidcntr c]
+		return (_uidcntr c)
+	}
+	return _fatal("_tUID: Out of UID range")
+}
+
+#_____________________________________________________
+function _tgenuid_init(a, b, A)
+{
+	_ptrlength = 4
+	a = "\222\223\224\225\226\227\230\231\232" "\240\241\242\243\244\245\246\247" "\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277" "\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317" "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"
+	split(a, A, "")
+	for (a in A) {
+		for (b in A) {
+			_UIDARR0[A[a] A[b]] _UIDARR1[A[a] A[b]]
+		}
+	}
+	_uidcntr = A[a] A[b]
+}
+
+#	if ( F in _TCLASS )				{ _[p]["CLASS"]=_TCLASS[F]; _tapi(p); return p }
+#		# ???		_mpu(F,p)		???
+#		return p }
+#	_[p][F]=v; return p }
+
+#_______________________________________________________________________
+function _tgetitem(p, n, a, b)
+{
+	############################################
+	if (p) {
+		if (isarray(_PTR[p]["ITEM"]) && (n in _PTR[p]["ITEM"])) {
+			a = _PTR[p]["ITEM"][n]
+		} else {
+			a = _PTR[p]["ITEM"][n] = _N()
+		}
+		if (! (b = _rFCHLD(a))) {
+			b = _wLCHLD(a, _N())
+			_PTR[b]["HOST"] = p
+			_[b]["ITEMNAME"] = n
+		}
+		return b
+	}
+}
+
+#_________________________________________________________________
+function _tgetsp(p)
+{
+	###############################################
+	return _tSTACK[p][0]
+}
+
+####################################################################################
+
+#_____________________________________________________________________________
+function _th0(p, p1, p2, p3)
+{
+	return p
+}
+
+##########################################
+
+#_________________________________________________________________
+function _th1(p0, p, p2, p3)
+{
+	return p
+}
+
+##############################
+
+#_________________________________________________________________
+function _th10(p0, p1)
+{
+	return (p1 p0)
+}
+
+##############################
+
+#_________________________________________________________________
+function _th2(p0, p1, r, p3)
+{
+	return p
+}
+
+##############################
+
+#_________________________________________________________________
+function _th3(p0, p1, p2, r)
+{
+	return p
+}
+
+#_________________________________________________________________
+function _tifend(l)
+{
+	###############################################
+	return (_t_ENDF[0] + l) in _t_ENDF ? (_t_ENDF[_t_ENDF[0] + l] ? _t_ENDF[_t_ENDF[0] + l] : 1) : ""
+}
+
+# 	test _tbrochld fn; develope tOBJ r\w func specification for brochld func
+
+#_________________________________________________________________
+function _tinit_i0(D, S, i)
+{
+	for (i in S) {
+		if (isarray(S[i])) {
+			if (! isarray(D[i][""])) {
+				delete D[i]
+				D[i][""]
+				delete D[i][""]
+			}
+			_N_i0(D[i], S[i])
+		} else {
+			if (isarray(D[i])) {
+				delete D[i]
+			}
+			D[i] = S[i]
+		}
+	}
+}
+
+#_______________________________________________________________________
+########################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#_______________________________________________________________________
+#	_N(arr\str\mpuptr,val) \ _n(arr\str\mpuptr,val)
+#		This functions create new object and return ptr.
+#		_n() - creates object from list of deleted objects or if it's empty create new one, while _N() always create new one
+#		It is strongly recommended to use _N() for the objects that have some data outside of standart object arrays. Or - make routines
+#		that will clear outsided object data in case if object deleting.
+#
+#			IN:		arr\str\mpu,val	- (both missed) just create obj and return ptr
+#					arr,val		- create object and write arr[ptr]=val
+#					str,val		- create object and write _[ptr][str]=val
+#					mpuptr		- NOT ALLOWED (val missed) create object and run MPU-code specified by mpuptr with created object ptr as primary parameter
+#			MOD:		-
+#			OUT:		-
+#			RETURN:	ptr			- pointer to newly created object
+#_________________________________________________________________
+#	_tdel(ptr)
+#		This function exclude object from it's current structure and delete it. ptr can be later used by function: _n() for creating new object
+#		Also same story will occured with all chields and subchields of object specified by ptr.
+#		??? What happened with linked py _ptr[ptr] objects ???
+#
+#			IN:		ptr			- pointer to object that will deleted
+#			MOD:		-
+#			OUT:		-
+#			RETURN:	undefined
+#_________________________________________________________________
+#	_isptr(ptr)
+#		This function checks: is ptr is the object pointer that is currently exist?
+#		Unescaped remained data will be in data of src_dst_ptr.
+#
+#			IN:		ptr			- string that will be tested
+#			MOD:		-
+#			OUT:		-
+#			RETURN:	undefined		- if ptr is not pointer to exist object
+#					ptr			- if ptr is the pointer to exist object
+#_________________________________________________________________
+
+
+
+#_________________________________________________________________
+#
+# TO DESIGN:
+#
+# create basic objectapi interface support
+# modify everywhere checking ptr not by `if ( ptr )...', but by `if ( ptr in _ )...'
+# _TMP0, _TMP1 name change to something like _DATA name ???
+# think about redesigning routines for not depending if ptr is exist in tsysarrs: reason: performance\light code
+function _tlist(L, p, f)
+{
+	_tlisti1 = _tlisti0 = L[_ARRLEN] + 0
+	if (f == 0 && f == "") {
+		_tlist_i0(L, p)
+	} else {
+		_tlistf0 = f in _TAPI ? _TAPI[f] : f
+		_tlist_i1(L, p)
+	}
+	return (_tlisti0 - _tlisti1)
+}
+
+function _tlist_i0(L, p, q, i)
+{
+	if (isarray(p)) {
+		q = p[_ARRLEN]
+		i = 0
+		while (i++ < q) {
+			_tlist_i0(L, p[i])
+		}
+		return
+	}
+	if (p in _) {
+		while (p in _tLINK) {
+			p = _tLINK[p]
+		}
+		L[++_tlisti0] = p
+		if (p in _tFCHLD) {
+			for (p = _tFCHLD[p]; p; p = p in _tNEXT ? _tNEXT[p] : "") {
+				_tlist_i0(L, p)
+			}
+		}
+	}
+}
+
+function _tlist_i1(L, p)
+{
+	if (isarray(p)) {
+		q = p[_ARRLEN]
+		i = 0
+		while (i++ < q) {
+			_tlist_i1(L, p[i])
+		}
+		return
+	}
+	if (p in _) {
+		while (p in _tLINK) {
+			p = _tLINK[p]
+		}
+		if (_tlistf0 in _[p]) {
+			L[++_tlisti0] = p
+		}
+		if (p in _tFCHLD) {
+			for (p = _tFCHLD[p]; p; p = p in _tNEXT ? _tNEXT[p] : "") {
+				_tlist_i1(L, p)
+			}
+		}
+	}
+}
+
+#_________________________________________________________________
+function _tmbframe(f, p, p0, p1, t)
+{
+	##################################
+	while ((p) && (! (_t_ENDF[0] in _t_ENDF))) {
+		t = t _tbframe_i0(f, p, p0, p1, p = p in _tPREV ? _tPREV[p] : "")
+	}
+	return t
+}
+
+#_________________________________________________________________
+function _tmbframex(f, p, p0, p1, t)
+{
+	#################################
+	while ((p) && (! (_t_ENDF[0] in _t_ENDF))) {
+		t = t _tbframex_i0(f, p, p0, p1)
+		p = p in _tPREV ? _tPREV[p] : ""
+	}
+	return t
+}
+
+#_________________________________________________________________
+function _tmbpass(f, p, p0, p1)
+{
+	######################################
+	while ((p) && (! (_t_ENDF[0] in _t_ENDF))) {
+		p0 = _tbpass_i0(f, p, p0, p1, p = p in _tPREV ? _tPREV[p] : "")
+	}
+	return p0
+}
+
+#_________________________________________________________________
+function _tmbpassx(f, p, p0, p1)
+{
+	#####################################
+	while ((p) && (! (_t_ENDF[0] in _t_ENDF))) {
+		p0 = _tbpassx_i0(f, p, p0, p1)
+		p = p in _tPREV ? _tPREV[p] : ""
+	}
+	return p0
+}
+
+#_________________________________________________________________
+function _tmframe(f, p, p0, p1, p2)
+{
+	###################################
+	delete _t_ENDF[++_t_ENDF[0]]
+	f = p ? _tmframe_i0(f, p, p0, p1, p2) : ""
+	--_t_ENDF[0]
+	return f
+}
+
+#___________________________________________________________
+function _tmframe_i0(f, p, p0, p1, p2, t)
+{
+	while ((p) && (! (_t_ENDF[0] in _t_ENDF))) {
+		t = t _tframe_i0(f, p, p0, p1, p2, p = p in _tNEXT ? _tNEXT[p] : "")
+	}
+	return t
+}
+
+#___________________________________________________________
+function _tmframe_i1(F, p, p0, p1, p2, t)
+{
+	while ((p) && (! (_t_ENDF[0] in _t_ENDF))) {
+		t = t _tframe_i1(F, p, p0, p1, p2, p = p in _tNEXT ? _tNEXT[p] : "")
+	}
+	return t
+}
+
+#_________________________________________________________________
+function _tmframex(f, p, p0, p1, t)
+{
+	##################################
+	while ((p) && (! (_t_ENDF[0] in _t_ENDF))) {
+		t = t _tframex_i0(f, p, p0, p1)
+		p = p in _tNEXT ? _tNEXT[p] : ""
+	}
+	return t
+}
+
+#_________________________________________________________________
+function _tmpass(f, p, p0, p1)
+{
+	#######################################
+	while ((p) && (! (_t_ENDF[0] in _t_ENDF))) {
+		p0 = _tbpass_i0(f, p, p0, p1, p = p in _tNEXT ? _tNEXT[p] : "")
+	}
+	return p0
+}
+
+#_________________________________________________________________
+function _tmpassx(f, p, p0, p1)
+{
+	######################################
+	while ((p) && (! (_t_ENDF[0] in _t_ENDF))) {
+		p0 = _tbpassx_i0(f, p, p0, p1)
+		p = p in _tNEXT ? _tNEXT[p] : ""
+	}
+	return p0
+}
+
+function _torexp(r)
+{
+	return _subseqon(_TOREXPB0, gensub(/(^[ \t]+)|(([ \t]*(\\)+)+[ \t]*)|([ \t]+$)/, "\\4", "G", _subseqoff(r, _TOREXPB0)), _TOREXPFN)
+}
+
+function _torexp_cmdstr(t)
+{
+	return _strtorexp(gensub(/\^(.)/, "\\1", "G", t))
+}
+
+function _torexp_fmask(t)
+{
+	return gensub(/\\\*/, ".*", "G", gensub(/\\\?/, ".?", "G", _strtorexp(t)))
+}
+
+#_______________________________________________
+function _torexp_init()
+{
+	_TOREXPFN[""] = "_strtorexp"
+	_TOREXPFN["~"] = "_torexp_rexp"
+	_TOREXPFN["="] = "_strtorexp"
+	_TOREXPFN[">"] = "_torexp_cmdstr"
+	_TOREXPFN["#"] = "_torexp_fmask"
+	_TOREXPFN["\""] = "_torexp_dqstr"
+	_TOREXPFN["'"] = "_torexp_sqstr"
+}
+
+#_______________________________________________
+function _torexp_rexp(t)
+{
+	return t
+}
+
+#_____________________________________________________________________________
+function _tpass(f, p, p0, p1)
+{
+	####################################################
+	delete _t_ENDF[++_t_ENDF[0]]
+	f = p ? _tpass_i0(f, p, p0, p1) : ""
+	--_t_ENDF[0]
+	return f
+}
+
+#___________________________________________________________
+function _tpass_i0(f, p, p0, p1, a)
+{
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	return (p in _tFCHLD ? _tmpass(f, _tFCHLD[p], p0, p1) : @f(p, p0, p1))
+}
+
+#_____________________________________________________________________________
+function _tpassx(f, p, p0, p1)
+{
+	###################################################
+	delete _t_ENDF[++_t_ENDF[0]]
+	f = p ? _tpassx_i0(f, p, p0, p1) : ""
+	--_t_ENDF[0]
+	return f
+}
+
+#___________________________________________________________
+function _tpassx_i0(f, p, p0, p1)
+{
+	while (p in _tLINK) {
+		p = _tLINK[p]
+	}
+	return (p in _tFCHLD ? _tmpassx(f, _tFCHLD[p], p0, p1) : @f(p, p0, p1))
+}
+
+#_________________________________________________________________
+function _tpop(p, aA, a)
+{
+	###########################################
+	if ((a = _tSTACK[p][0]) > 0) {
+		_tSTACK[p][0]--
+		if (isarray(_tSTACK[p][a])) {
+			delete aA
+			_movarr(aA, _tSTACK[p][a])
+			return
+		}
+		return _tSTACK[p][a]
+	}
+	_fatal("^" p ": Out of tSTACK")
+}
+
+#_____________________________________________________________________________
+function _tpush(p, aA, a)
+{
+	######################################################
+	if (isarray(aA)) {
+		delete _tSTACK[p][a = ++_tSTACK[p][0]]
+		_tSTACK[p][a][""]
+		delete _tSTACK[p][a][""]
+		_movarr(_tSTACK[p][a], aA)
+		return
+	}
+	delete _tSTACK[p][a = ++_tSTACK[p][0]]
+	return (_tSTACK[p][a] = aA)
+}
+
+# prefix	-
+# prichr	- aware character `{', `^',`]'
+# sechr	- aware character `.' as the first char of sechr, and character `}'
+# suffix	- aware character `]'
+# cntptr	- aware character `]'
+function _tr(n, cs, H)
+{
+	#_tuidinitcs[p]=cs
+	#2 uidel, 5 pfx, 7 hichr,11(10) lochr,14 suffix
+	_rconline(n ": " cs)
+	_rconl()
+	if (match(cs, /^((([^\xB4:\[\|\]]*\xB4.)*[^\xB4:\[\|\]]*):)?((([^\xB4\[\|\]]*\xB4.)*[^\xB4\[\|\]]*)\[)?(([^\xB4\|\]]*\xB4.)*[^\xB4\|\]]*)?(\|(\.)?(([^\xB4\]]*\xB4.)*[^\xB4\]]*))?(\](.*))?$/, H)) {
+		_rconl("delptr: " _une(H[2]) "'")
+		_rconl("pfxstr: " _une(H[5]) "'")
+		_rconl("hichr:  " _une(H[7]) "'")
+		_rconl("lochr:  " _une(H[10] ? H[7] "' and " H[11] "'" : H[11] "'"))
+		_rconl("sfxstr: " _une(H[14]) "'")
+	} else {
+		_rconl("NOT MATCH!")
+	}
+	_rconl()
+}
+
+#_______________________________________________________________________
+function _trace(t, d, A)
+{
+	#################################################
+	if (_ERRLOG_TF) {
+		A["TYPE"] = "TRACE"
+		A["TEXT"] = t
+		_log(A, d)
+	}
+}
+
+#_________________________________________________________________
+function _trunframe(f, p, p0, p1, p2)
+{
+	#################################
+	return _tframe(f ? f : "_trunframe_i0", p, p0, p1, p2)
+}
+
+#_________________________________________________________________
+function _trunframe_i0(p, p0, p1, p2, f)
+{
+	if (p in _tFN) {
+		f = _tFN[p]
+		return @f(p, p0, p1, p2)
+	}
+}
+
+#_________________________________________________________________
+function _trunframex(f, p, p0, p1)
+{
+	###################################
+	return _tframex(f ? f : "_trunframe_i0", p, p0, p1)
+}
+
+#_________________________________________________________________
+function _trunpass(f, p, p0, p1)
+{
+	#####################################
+	return _tpass(f ? f : "_trunframe_i0", p, p0, p1)
+}
+
+#_________________________________________________________________
+function _trunpassx(f, p, p0, p1)
+{
+	####################################
+	return _tpassx(f ? f : "_trunframe_i0", p, p0, p1)
+}
+
+#_________________________________________________________________
+function _tsetsp(p, v)
+{
+	#############################################
+	return (_tSTACK[p][0] = v)
+}
+
+#			dptr			- morg ptr; in case if object deleted then _CLASSPTR[ptr] will be deleted(object is death), but
+#							_tUIDEL[_CLASSPTR[ptr]] will be created that object can be resurrected from morg
+#							dptr can be any string containing any characters except `:'. It's not verified
+#			pfx,sfx		- uid prefix str, and uid suffix str; this strings specifies string that can be inserted before/after
+#							uid generated by uid generator:
+#
+#								class uid:			pfx uidgen sfx
+#
+#							Both can be any string(including ""), and can contains any character with B4-escaping feature.
+#							Note: that this strings cannot contains "'" character: it's should be escaped by B4-escaper.
+#			hstr,lstr		- this values configure uid-generator itself. ther is a 3 combinations regarding its:
+#
+#								hstr			lstr			function
+#
+#								`ptr			*			- specify pointer to external uid-generator
+#														All uids and chars will be generated by external uid-generator
+#								*			^ptr			- class will have it's own uid generator using external character set
+#								str			str			- class will have it's own uid generator with it's own character set
+#														character set inmplemented in hstr(high-charset) and in lstr(low-charset) in 2 ways:
+#							1)	"AB"			"AB01"			- this mean that high-charset contain chars: `A' and `B'
+#																low-charset contains chars: `A', `B', `0', `1'
+#
+#							2)	"Az,By"		"Ax,Bw,0v,1u"		- this mean that high-charset contain chars: `Az' and `By'
+#																low-charset contains chars:  `Ax', `Bw', `0v', `1u'
+#															Note: both: hstr and lstr cannot contain char `,' directly, but it's can uses
+#																	B4-escaper to escape any char including `,'
+
+
+
+# !!!! in case of using `,' in hstr/lstr - the escaped `,' will leads to interpretate hstr and lstr as divided by `,'
+# if parameters error then i should be more specific about what error in parameters detected
+# document _inituid(): parameters; document cs: uid initialization string format
+# test with escape char
+# adv hstr and lstr splitting?
+# chk if hstr len==0 ?
+# return _tclass & report error?
+# _tapi thru function
+
+# additional syntax checking ???
+# implement syntax and uid srv in docs
+# add _dumpuid() ????
+# make performance measurement
+# protection against badchar list
+# additional feature to specify _getuid() to not resurrect uid; and informative that uid was ressurected or not
+# build _defclass fn
+
+# _tuidinitcs ????
+# _tuidchrh[p]
+# _tuidchrl[p]
+# _tuidchr[p]
+# _tuidcnt[p]
+# _tUIDPFX[p]
+# _tUIDSFX[p]
+# _tUIDEL
+# _tUIDCNTH
+# _tUIDCNTL
+# _tUIDCHRL
+# _tUIDCHRH
+
+# create default class basic `new' and `del' functions
+function _tstini()
+{
+	_ini("uidel:pfx'hstr|lstr'sfx")
+	_ini("uidel:pfx'hstr|lstr'")
+	_ini("uidel:'hstr|lstr'sfx")
+	_ini("uidel:'hstr|lstr'")
+	_ini("uidel:pfx'hstr'sfx")
+	_ini("uidel:pfx'hstr'")
+	_ini("uidel:'hstr'sfx")
+	_ini("uidel:'hstr'")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_ini("pfx'hstr|lstr'sfx")
+	_ini("pfx'hstr|lstr'")
+	_ini("'hstr|lstr'sfx")
+	_ini("'hstr|lstr'")
+	_ini("pfx'hstr'sfx")
+	_ini("pfx'hstr'")
+	_ini("'hstr'sfx")
+	_ini("'hstr'")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_ini("uidel:pfx'`cntptr'sfx")
+	_ini("uidel:pfx'`cntptr'")
+	_ini("uidel:'`cntptr'sfx")
+	_ini("uidel:'`cntptr'")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_ini("pfx'`cntptr'sfx")
+	_ini("pfx'`cntptr'")
+	_ini("'`cntptr'sfx")
+	_ini("'`cntptr'")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_ini("uidel:pfx'^chrptr'sfx")
+	_ini("uidel:pfx'^chrptr'")
+	_ini("uidel:'^chrptr'sfx")
+	_ini("uidel:'^chrptr'")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+	_ini("pfx'^chrptr'sfx")
+	_ini("pfx'^chrptr'")
+	_ini("'^chrptr'sfx")
+	_ini("'^chrptr'")
+	_conl()
+	_conl("########################################################################################")
+	_conl()
+}
+
+function _tstv(p, A, r, f)
+{
+	if (f == "") {
+		f = "tst_splitstr"
+	}
+	@f(_NOP, A, p)
+	@f(AA0, A, p)
+	@f(AB0, A, p)
+	@f(AC0, A, p)
+	@f("", A, p)
+	@f("a", A, p)
+	@f("\264a", A, p)
+	@f("\264", A, p)
+	@f("a\264\264\264,ba\264\264\264,", A, p)
+	@f("\264,", A, p)
+	@f(",", A, p)
+	@f("\264a,", A, p)
+	@f("ab,", A, p)
+	@f("ab,\264", A, p)
+	@f("\264a\264,,ba", A, p)
+	@f(",a,,b\264,c,,\264a,,\264,,,", A, p)
+}
+
+function _typ(p)
+{
+	return (_t0 = isarray(p) ? "#" : p == 0 ? p == "" ? 0 : p in _CLASSPTR ? "`" : p ? 3 : 4 : p in _CLASSPTR ? "`" : p + 0 == p ? 5 : p ? 3 : 2)
+}
+
+function _typa(p, A)
+{
+	return (_t0 = isarray(p) ? "#" : p == 0 ? p == "" ? 0 : p in A ? "`" : p ? 3 : 4 : p in A ? "`" : p + 0 == p ? 5 : p ? 3 : 2)
+}
+
+#_____________________________________________________
+#	_tframe0(hndstr,ptr)
+#
+#
+#			IN:
+#			MOD:
+#			OUT:
+#			RETURN:
+#
+#	handler string:
+#		Handler-string divides to words. Word splitter is char ";"
+#
+#	Note that handler-string processed left to right. This mean that next word(more rightly) will overwrite fields implemented before(leftmost).
+#	Note that if word-string contains more than one rexp-field then only last rexp-field(most rightly) will be applied.
+#_______________________________________________
+# TO DESIGN:
+#
+# 0-4: complete design of tlink handler call
+# 1-4: add new tlink handler call
+# 1-4: add new run fn (changed rexp to different for each type: see _tframe0)
+#
+# hndstr:
+#	may be add rexp for each type of handler and also total rexp for all ??? ADDED (test)
+#	may be add separator char ";" ???		ADDED (test)
+#_______________________________________________________________________
+function _tzend(a, b)
+{
+	#####################################################
+	if (b == 0 && b == "") {
+		return (_TEND[_TEND[_ARRLEN]] = a)
+	} else {
+		return (_TEND[_TEND[_ARRLEN] + a] = b)
+	}
+}
+
+function _uidcyc(p, i)
+{
+	_dumpuidgen(p)
+	for (i = 1; i < (64 * 8 * 6 - 1); i++) {
+		_conl(i ":" _var(_getuid(p)))
+	}
+	_dumpuidgen(p)
+}
+
+function _une(t)
+{
+	return gensub(/\xB4(.)/, "\\1", "G", t)
+}
+
+#___________________________________________________________________________________
+function _unformatrexp(t)
+{
+	_formatstrq0 = split(t, _FORMATSTRA, /(\\[0-9]{1,3})|(\\x[[:xdigit:]]+)|(\\.)/, _FORMATSTRB)
+	_formatstrs0 = ""
+	for (t = 1; t < _formatstrq0; t++) {
+		_formatstrs0 = _formatstrs0 _FORMATSTRA[t] (_FORMATSTRB[t] in _QESCHR ? _QESCREXP[_FORMATSTRB[t]] : _QESCREXP[toupper(substr(_FORMATSTRB[t], length(_FORMATSTRB[t]) - 1))])
+	}
+	return (_formatstrs0 _FORMATSTRA[t])
+}
+
+#___________________________________________________________
+function _unformatrexp_init(i, a)
+{
+	_formatstrs0 = "\\^$.[]|()*+?{}-sSwW<>yB`'"
+	delete _FORMATSTRB
+	for (i = 0; i < 256; i++) {
+		_QESCREXP["\\" _CHR[i]] = index(_formatstrs0, _CHR[i]) ? "\\" _CHR[i] : _CHR[i]
+	}
+	for (i = 0; i < 256; i++) {
+		a = index(_formatstrs0, _CHR[i]) ? "\\" : ""
+		_QESCREXP[sprintf("%.2X", i)] = a _CHR[i]
+		_QESCREXP["\\" sprintf("%.3o", i)] = a _CHR[i]
+		if (i < 8) {
+			_QESCREXP["\\" sprintf("%.1o", i)] = a _CHR[i]
+		}
+		if (i < 64) {
+			_QESCREXP["\\" sprintf("%.2o", i)] = a _CHR[i]
+		}
+		if (i < 16) {
+			_QESCREXP["\\x" sprintf("%.1X", i)] = _QESCREXP["\\x" sprintf("%.1x", i)] = a _CHR[i]
+		}
+	}
+	patsplit("a" 7 "b" 8 "f" 12 "n" 10 "r" 13 "t" 9 "v" 11, _FORMATSTRA, /[^0-9]/, _FORMATSTRB)
+	for (i in _FORMATSTRA) {
+		_QESCREXP["\\" _FORMATSTRA[i]] = _CHR[_FORMATSTRB[i] + 0]
+	}
+}
+
+#___________________________________________________________________________________
+function _unformatstr(t)
+{
+	_formatstrq0 = split(t, _FORMATSTRA, /(\\[0-9]{1,3})|(\\x[[:xdigit:]]+)|(\\.)/, _FORMATSTRB)
+	_formatstrs0 = ""
+	for (t = 1; t < _formatstrq0; t++) {
+		_formatstrs0 = _formatstrs0 _FORMATSTRA[t] (_FORMATSTRB[t] in _QESCHR ? _QESCHR[_FORMATSTRB[t]] : _QESCHR[toupper(substr(_FORMATSTRB[t], length(_FORMATSTRB[t]) - 1))])
+	}
+	return (_formatstrs0 _FORMATSTRA[t])
+}
+
+#___________________________________________________________
+function _unformatstr_init(i)
+{
+	for (i = 0; i < 256; i++) {
+		_QESCHR["\\" _CHR[i]] = _CHR[i]
+	}
+	for (i = 0; i < 256; i++) {
+		_QESCHR[sprintf("%.2X", i)] = _CHR[i]
+		_QESCHR["\\" sprintf("%.3o", i)] = _CHR[i]
+		if (i < 8) {
+			_QESCHR["\\" sprintf("%.1o", i)] = _CHR[i]
+		}
+		if (i < 64) {
+			_QESCHR["\\" sprintf("%.2o", i)] = _CHR[i]
+		}
+		if (i < 16) {
+			_QESCHR["\\x" sprintf("%.1X", i)] = _QESCHR["\\x" sprintf("%.1x", i)] = _CHR[i]
+		}
+	}
+	i = "a" 7 "b" 8 "f" 12 "n" 10 "r" 13 "t" 9 "v" 11
+	patsplit(i, _FORMATSTRA, /[^0-9]/, _FORMATSTRB)
+	for (i in _FORMATSTRA) {
+		_QESCHR["\\" _FORMATSTRA[i]] = _CHR[_FORMATSTRB[i] + 0]
+	}
+}
+
+#_____________________________________________________________________________
+function _uninit_del(A, i, p0)
+{
+	_del(i)
+}
+
+####################################################################################
+# PUBLIC:
+#_____________________________________________________________________________
+#	var	_SYS_STDOUT			- (by default = "/dev/stdout") standart output pipe filename
+#	var	_SYS_STDERR			- (by default = "/dev/stderr") standart error output pipe filename
+#	var	_SYS_STDCON			- (by default = "CON") standart console output device
+#_____________________________________________________________________________
+#	var	_CHR["CR"]			- return cursor to the position 0 without newline(normally ="\x0D")
+#	var	_CHR["EOL"]			- return cursor to the position 0 & newline (MS:="\x0D\x0A" / UX:="\x0D")
+#	var	_CON_WIDTH 			- console width(columns number)
+#_____________________________________________________________________________
+#	fn	_cmd(c)			- execute shell command c and return output
+#	fn	_err				- output string w\o any addition into _SYS_STDERR device
+#	fn	_errnl			- output string with addition _CHR["EOL"] at the end of the string into _SYS_STDERR device
+#	fn	_out				- output string w\o any addition into _SYS_STDOUT device
+#	fn	_outnl			- output string with addition _CHR["EOL"] at the end of the string into _SYS_STDOUT device
+#_____________________________________________________________________________
+#	fn	_con(text[,tabspace])
+#	fn	_conl(text[,tabspace])
+#	fn	_conline(text[,tabspace])
+#	fn	_constat(status[,tabspace])
+#	fn	_constatpush([status[,tabspace]])
+#	fn	_constatpop()
+#_______________________________________________________________________
+#	var	_constatstr
+####################################################################################
+function _unstr(t)
+{
+	return gensub(/\\(.)/, "\\1", "G", t)
+}
+
+#_________________________________________________________________
+function _untmp(f, a)
+{
+	#############################################
+	if ((f = filepath(f))) {
+		if (match(f, /\\$/)) {
+			_deletepfx(_FILEIO_RDTMP, a = toupper(f))
+			_deletepfx(_FILEIO_RDNETMP, a)
+		} else {
+			delete _FILEIO_RDNETMP[toupper(f)]
+		}
+		return f
+	}
+	return ""
+}
+
+#_____________________________________________________________________________
+function _val(v, t)
+{
+	if (isarray(v)) {
+		return (_dumparr(v) _ln(t))
+	}
+	if (v == 0 && v == "") {
+		return (_ln("- (ERRNO=" ERRNO ")") _ln(t))
+	}
+	return (_ln(v "'") _ln(t))
+}
+
+#_____________________________________________________________________________
+function _val0(v)
+{
+	if (isarray(v)) {
+		return _dumparr(v)
+	}
+	if (v == 0 && v == "") {
+		return "-"
+	}
+	return ("\"" v "\"")
+}
+
+#_____________________________________________________________________________
+function _var(v, t)
+{
+	if (isarray(v)) {
+		return (_dumparr(v) _ln(t))
+	}
+	if (v == 0 && v == "") {
+		return (_ln("- (ERRNO=" ERRNO ")") _ln(t))
+	}
+	return (_ln(v "'") _ln(t))
+}
+
+#_______________________________________________________________________
+function _verb(t, d, A)
+{
+	##################################################
+	if (_ERRLOG_VF) {
+		A["TYPE"] = "VERB"
+		A["TEXT"] = t
+		_log(A, d)
+	}
+}
+
+#_________________________________________________________________
+function _wFBRO(p, v, a)
+{
+	###########################################
+	if (p) {
+		if (v) {
+			for (a = p; a in _tPARENT; ) {
+				if ((a = _tPARENT[a]) == v) {
+					return v
+				}
+			}	######################## v is parentesis of p
+			if (p in _tPARENT) {
+				p = _tPARENT[p]
+				if (v in _tNEXT) {
+					if (v in _tPREV) {
+						_tPREV[_tNEXT[a] = _tNEXT[v]] = a = _tPREV[v]
+						delete _tPREV[v]
+						if (v in _tPARENT) {
+							if (p == (a = _tPARENT[v])) {
+								return (_tFCHLD[p] = _tPREV[_tNEXT[v] = _tFCHLD[p]] = v)
+							}
+							--_tQCHLD[a]
+						}
+					} else if (v in _tPARENT) {
+						if (p == (a = _tPARENT[v])) {
+							return v
+						}
+						delete _tPREV[_tFCHLD[a] = _tNEXT[v]]
+						--_tQCHLD[a]
+					} else {
+						delete _tPREV[_tNEXT[v]]
+					}
+					++_tQCHLD[p]
+					return (_tFCHLD[p] = _tPREV[_tNEXT[v] = _tFCHLD[_tPARENT[v] = p]] = v)
+				} else {
+					if (v in _tPREV) {
+						if (v in _tPARENT) {
+							delete _tNEXT[_tLCHLD[a = _tPARENT[v]] = _tPREV[v]]
+							if (p == a) {
+								delete _tPREV[v]
+								return (_tFCHLD[p] = _tPREV[_tNEXT[v] = _tFCHLD[p]] = v)
+							}
+							--_tQCHLD[a]
+						} else {
+							delete _tNEXT[_tPREV[v]]
+						}
+						delete _tPREV[v]
+					} else if (v in _tPARENT) {
+						if (p == (a = _tPARENT[v])) {
+							return v
+						}
+						delete _tFCHLD[a]
+						delete _tLCHLD[a]
+						delete _tQCHLD[a]
+					}
+					++_tQCHLD[p]
+					return (_tFCHLD[p] = _tPREV[_tNEXT[v] = _tFCHLD[_tPARENT[v] = p]] = v)
+				}
+			} else {
+				while (p in _tPREV) {
+					p = _tPREV[p]
+				}
+				if (v in _tPREV) {
+					if (v in _tPARENT) {
+						--_tQCHLD[a = _tPARENT[v]]
+						delete _tPARENT[v]
+						if (v in _tNEXT) {
+							_tNEXT[_tPREV[a] = _tPREV[v]] = a = _tNEXT[v]
+						} else {
+							delete _tNEXT[_tLCHLD[a] = _tPREV[v]]
+						}
+					} else if (v in _tNEXT) {
+						_tNEXT[_tPREV[a] = _tPREV[v]] = a = _tNEXT[v]
+					} else {
+						delete _tNEXT[_tPREV[v]]
+					}
+					delete _tPREV[v]
+				} else {
+					if (p == v) {
+						return v
+					}
+					if (v in _tPARENT) {
+						if (v in _tNEXT) {
+							delete _tPREV[_tFCHLD[a = _tPARENT[v]] = _tNEXT[v]]
+							--_tQCHLD[a]
+						} else {
+							delete _tLCHLD[a = _tPARENT[v]]
+							delete _tFCHLD[a]
+							delete _tQCHLD[a]
+						}
+						delete _tPARENT[v]
+					} else if (v in _tNEXT) {
+						delete _tPREV[_tNEXT[v]]
+					}
+				}
+				return (_tPREV[_tNEXT[v] = p] = v)
+			}
+		} else {
+			if (v == 0) {
+				return v
+			}			######################## p=ptr, v=0
+			return v
+		}
+	} else {
+		if (p == 0) {
+			return v	######################## p=0
+		}		######################## p=ptr, v=""
+		if (v) {
+			return _texclude(v)	######################## p="", v=ptr	- exclude v
+		}
+		return v
+	}
+}
+
+#_________________________________________________________________
+function _wFCHLD(p, v, a)
+{
+	##########################################
+	if (p) {
+		if (v) {
+			if (p == v) {
+				return v
+			}			######################## p=v=ptr
+			for (a = p; a in _tPARENT; ) {
+				if ((a = _tPARENT[a]) == v) {
+					return v
+				}
+			}	######################## v is parentesis of p
+			if (v in _tNEXT) {
+				if (v in _tPREV) {
+					_tPREV[_tNEXT[a] = _tNEXT[v]] = a = _tPREV[v]
+					delete _tPREV[v]
+					if (v in _tPARENT) {
+						if (p == (a = _tPARENT[v])) {
+							return (_tFCHLD[p] = _tPREV[_tNEXT[v] = _tFCHLD[p]] = v)
+						}
+						--_tQCHLD[a]
+					}
+				} else if (v in _tPARENT) {
+					if (p == (a = _tPARENT[v])) {
+						return v
+					}
+					delete _tPREV[_tFCHLD[a] = _tNEXT[v]]
+					--_tQCHLD[a]
+				} else {
+					delete _tPREV[_tNEXT[v]]
+				}
+				if (p in _tFCHLD) {
+					++_tQCHLD[p]
+					return (_tFCHLD[p] = _tPREV[_tNEXT[v] = _tFCHLD[_tPARENT[v] = p]] = v)
+				}
+				delete _tNEXT[v]
+			} else {
+				if (v in _tPREV) {
+					if (v in _tPARENT) {
+						delete _tNEXT[_tLCHLD[a = _tPARENT[v]] = _tPREV[v]]
+						if (p == a) {
+							delete _tPREV[v]
+							return (_tFCHLD[p] = _tPREV[_tNEXT[v] = _tFCHLD[p]] = v)
+						}
+						--_tQCHLD[a]
+					} else {
+						delete _tNEXT[_tPREV[v]]
+					}
+					delete _tPREV[v]
+				} else if (v in _tPARENT) {
+					if (p == (a = _tPARENT[v])) {
+						return v
+					}
+					delete _tFCHLD[a]
+					delete _tLCHLD[a]
+					delete _tQCHLD[a]
+				}
+				if (p in _tFCHLD) {
+					++_tQCHLD[p]
+					return (_tFCHLD[p] = _tPREV[_tNEXT[v] = _tFCHLD[_tPARENT[v] = p]] = v)
+				}
+			}
+			_tQCHLD[p] = 1
+			return (_tFCHLD[_tPARENT[v] = p] = _tLCHLD[p] = v)
+		} else {
+			if (v == 0) {
+				if (p in _tFCHLD) {	######################## p=ptr, v=0 > delete all chld
+					v = _tFCHLD[p]
+					delete _tFCHLD[p]
+					delete _tLCHLD[p]
+					delete _tQCHLD[p]
+					do {
+						delete _tPARENT[v]
+					} while ((v in _tNEXT) && (v = _tNEXT[v]))
+				}
+			}
+			return v
+		}
+	} else {
+		if (p == 0) {
+			return v	######################## p=0
+		}		######################## p=ptr, v="" > ignore action
+		return v
+	}
+}
+
+#_________________________________________________________________
+function _wLBRO(p, v, a)
+{
+	###########################################
+	if (p) {
+		if (v) {
+			for (a = p; a in _tPARENT; ) {
+				if ((a = _tPARENT[a]) == v) {
+					return v
+				}
+			}	######################## v is parentesis of p
+			if (p in _tPARENT) {
+				p = _tPARENT[p]
+				if (v in _tPREV) {
+					if (v in _tNEXT) {
+						_tNEXT[_tPREV[a] = _tPREV[v]] = a = _tNEXT[v]
+						delete _tNEXT[v]
+						if (v in _tPARENT) {
+							if (p == (a = _tPARENT[v])) {
+								return (_tLCHLD[p] = _tNEXT[_tPREV[v] = _tLCHLD[p]] = v)
+							}
+							--_tQCHLD[a]
+						}
+					} else if (v in _tPARENT) {
+						if (p == (a = _tPARENT[v])) {
+							return v
+						}
+						delete _tNEXT[_tLCHLD[a] = _tPREV[v]]
+						--_tQCHLD[a]
+					} else {
+						delete _tNEXT[_tPREV[v]]
+					}
+					++_tQCHLD[p]
+					return (_tLCHLD[p] = _tNEXT[_tPREV[v] = _tLCHLD[_tPARENT[v] = p]] = v)
+				} else {
+					if (v in _tNEXT) {
+						if (v in _tPARENT) {
+							delete _tPREV[_tFCHLD[a = _tPARENT[v]] = _tNEXT[v]]
+							if (p == a) {
+								delete _tNEXT[v]
+								return (_tLCHLD[p] = _tNEXT[_tPREV[v] = _tLCHLD[p]] = v)
+							}
+							--_tQCHLD[a]
+						} else {
+							delete _tPREV[_tNEXT[v]]
+						}
+						delete _tNEXT[v]
+					} else if (v in _tPARENT) {
+						if (p == (a = _tPARENT[v])) {
+							return v
+						}
+						delete _tLCHLD[a]
+						delete _tFCHLD[a]
+						delete _tQCHLD[a]
+					}
+					++_tQCHLD[p]
+					return (_tLCHLD[p] = _tNEXT[_tPREV[v] = _tLCHLD[_tPARENT[v] = p]] = v)
+				}
+			} else {
+				while (p in _tNEXT) {
+					p = _tNEXT[p]
+				}
+				if (v in _tNEXT) {
+					if (v in _tPARENT) {
+						--_tQCHLD[a = _tPARENT[v]]
+						delete _tPARENT[v]
+						if (v in _tPREV) {
+							_tPREV[_tNEXT[a] = _tNEXT[v]] = a = _tPREV[v]
+						} else {
+							delete _tPREV[_tFCHLD[a] = _tNEXT[v]]
+						}
+					} else if (v in _tPREV) {
+						_tPREV[_tNEXT[a] = _tNEXT[v]] = a = _tPREV[v]
+					} else {
+						delete _tPREV[_tNEXT[v]]
+					}
+					delete _tNEXT[v]
+				} else {
+					if (p == v) {
+						return v
+					}
+					if (v in _tPARENT) {
+						if (v in _tPREV) {
+							delete _tNEXT[_tLCHLD[a = _tPARENT[v]] = _tPREV[v]]
+							--_tQCHLD[a]
+						} else {
+							delete _tFCHLD[a = _tPARENT[v]]
+							delete _tLCHLD[a]
+							delete _tQCHLD[a]
+						}
+						delete _tPARENT[v]
+					} else if (v in _tPREV) {
+						delete _tNEXT[_tPREV[v]]
+					}
+				}
+				return (_tNEXT[_tPREV[v] = p] = v)
+			}
+		} else {
+			if (v == 0) {
+				return v
+			}			######################## p=ptr, v=0
+			return v
+		}
+	} else {
+		if (p == 0) {
+			return v	######################## p=0
+		}		######################## p=ptr, v=""
+		if (v) {
+			return _texclude(v)	######################## p="", v=ptr	- exclude v
+		}
+		return v
+	}
+}
+
+#_________________________________________________________________
+function _wLCHLD(p, v, a)
+{
+	##########################################
+	if (p) {
+		if (v) {
+			if (p == v) {
+				return v
+			}			######################## p=v=ptr
+			for (a = p; a in _tPARENT; ) {
+				if ((a = _tPARENT[a]) == v) {
+					return v
+				}
+			}	######################## v is parentesis of p
+			if (v in _tPREV) {
+				if (v in _tNEXT) {
+					_tNEXT[_tPREV[a] = _tPREV[v]] = a = _tNEXT[v]
+					delete _tNEXT[v]
+					if (v in _tPARENT) {
+						if (p == (a = _tPARENT[v])) {
+							return (_tLCHLD[p] = _tNEXT[_tPREV[v] = _tLCHLD[p]] = v)
+						}
+						--_tQCHLD[a]
+					}
+				} else if (v in _tPARENT) {
+					if (p == (a = _tPARENT[v])) {
+						return v
+					}
+					delete _tNEXT[_tLCHLD[a] = _tPREV[v]]
+					--_tQCHLD[a]
+				} else {
+					delete _tNEXT[_tPREV[v]]
+				}
+				if (p in _tLCHLD) {
+					++_tQCHLD[p]
+					return (_tLCHLD[p] = _tNEXT[_tPREV[v] = _tLCHLD[_tPARENT[v] = p]] = v)
+				}
+				delete _tPREV[v]
+			} else {
+				if (v in _tNEXT) {
+					if (v in _tPARENT) {
+						delete _tPREV[_tFCHLD[a = _tPARENT[v]] = _tNEXT[v]]
+						if (p == a) {
+							delete _tNEXT[v]
+							return (_tLCHLD[p] = _tNEXT[_tPREV[v] = _tLCHLD[p]] = v)
+						}
+						--_tQCHLD[a]
+					} else {
+						delete _tPREV[_tNEXT[v]]
+					}
+					delete _tNEXT[v]
+				} else if (v in _tPARENT) {
+					if (p == (a = _tPARENT[v])) {
+						return v
+					}
+					delete _tLCHLD[a]
+					delete _tFCHLD[a]
+					delete _tQCHLD[a]
+				}
+				if (p in _tLCHLD) {
+					++_tQCHLD[p]
+					return (_tLCHLD[p] = _tNEXT[_tPREV[v] = _tLCHLD[_tPARENT[v] = p]] = v)
+				}
+			}
+			_tQCHLD[p] = 1
+			return (_tLCHLD[_tPARENT[v] = p] = _tFCHLD[p] = v)
+		} else {
+			if (v == 0) {
+				if (p in _tFCHLD) {	######################## p=ptr, v=0 > delete all chld
+					v = _tFCHLD[p]
+					delete _tFCHLD[p]
+					delete _tLCHLD[p]
+					delete _tQCHLD[p]
+					do {
+						delete _tPARENT[v]
+					} while ((v in _tNEXT) && (v = _tNEXT[v]))
+				}
+			}
+			return v
+		}
+	} else {
+		if (p == 0) {
+			return v	######################## p=0
+		}		######################## p=ptr, v="" > ignore action
+		return v
+	}
+}
+
+#_________________________________________________________________
+function _wLINK(p, v)
+{
+	##############################################
+	return (_tLINK[p] = v)
+}
+
+#_________________________________________________________________
+function _wNEXT(p, v, a, b)
+{
+	#########################################
+	if (p) {
+		if (v) {
+			if (p == v) {
+				return v
+			}			######################## p=v=ptr
+			for (a = p; a in _tPARENT; ) {
+				if ((a = _tPARENT[a]) == v) {
+					return v
+				}
+			}	######################## v is parentesis of p
+			if (v in _tPREV) {
+				if (p == (a = _tPREV[v])) {
+					return v
+				}
+				if (v in _tNEXT) {
+					_tPREV[_tNEXT[a] = _tNEXT[v]] = a
+					if (v in _tPARENT) {
+						--_tQCHLD[_tPARENT[v]]
+					}
+				} else {
+					delete _tNEXT[a]
+					if (v in _tPARENT) {
+						_tLCHLD[b = _tPARENT[v]] = a
+						--_tQCHLD[b]
+					}
+				}
+			} else if (v in _tNEXT) {
+				if (v in _tPARENT) {
+					delete _tPREV[_tFCHLD[a = _tPARENT[v]] = _tNEXT[v]]
+					--_tQCHLD[a]
+				} else {
+					delete _tPREV[_tNEXT[v]]
+				}
+			} else if (v in _tPARENT) {
+				delete _tFCHLD[a = _tPARENT[v]]
+				delete _tLCHLD[a]
+				delete _tQCHLD[a]
+			}
+			if (p in _tNEXT) {
+				_tPREV[_tNEXT[v] = _tNEXT[p]] = v
+				if (p in _tPARENT) {
+					++_tQCHLD[_tPARENT[v] = _tPARENT[p]]
+				} else {
+					delete _tPARENT[v]
+				}
+			} else {
+				delete _tNEXT[v]
+				if (p in _tPARENT) {
+					++_tQCHLD[_tPARENT[_tLCHLD[a] = v] = a = _tPARENT[p]]
+				} else {
+					delete _tPARENT[v]
+				}
+			}
+			return (_tNEXT[_tPREV[v] = p] = v)
+		} else {
+			if (v == 0) {
+				return v
+			}			######################## p=ptr, v=0
+			return v
+		}
+	} else {
+		if (p == 0) {
+			return v	######################## p=0
+		}		######################## p=ptr, v=""
+		if (v) {
+			return _texclude(v)	######################## p="", v=ptr	- exclude v
+		}
+		return v
+	}
+}
+
+#_________________________________________________________________
+function _wPARENT(p, v)
+{
+	############################################
+	return v
+}
+
+#_________________________________________________________________
+function _wPREV(p, v, a, b)
+{
+	#########################################
+	if (p) {
+		if (v) {
+			if (p == v) {
+				return v
+			}			######################## p=v=ptr
+			for (a = p; a in _tPARENT; ) {
+				if ((a = _tPARENT[a]) == v) {
+					return v
+				}
+			}	######################## v is parentesis of p
+			if (v in _tNEXT) {
+				if (p == (a = _tNEXT[v])) {
+					return v
+				}
+				if (v in _tPREV) {
+					_tNEXT[_tPREV[a] = _tPREV[v]] = a
+					if (v in _tPARENT) {
+						--_tQCHLD[_tPARENT[v]]
+					}
+				} else {
+					delete _tPREV[a]
+					if (v in _tPARENT) {
+						_tFCHLD[b = _tPARENT[v]] = a
+						--_tQCHLD[b]
+					}
+				}
+			} else if (v in _tPREV) {
+				if (v in _tPARENT) {
+					delete _tNEXT[_tLCHLD[a = _tPARENT[v]] = _tPREV[v]]
+					--_tQCHLD[a]
+				} else {
+					delete _tNEXT[_tPREV[v]]
+				}
+			} else if (v in _tPARENT) {
+				delete _tLCHLD[a = _tPARENT[v]]
+				delete _tFCHLD[a]
+				delete _tQCHLD[a]
+			}
+			if (p in _tPREV) {
+				_tNEXT[_tPREV[v] = _tPREV[p]] = v
+				if (p in _tPARENT) {
+					++_tQCHLD[_tPARENT[v] = _tPARENT[p]]
+				} else {
+					delete _tPARENT[v]
+				}
+			} else {
+				delete _tPREV[v]
+				if (p in _tPARENT) {
+					++_tQCHLD[_tPARENT[_tFCHLD[a] = v] = a = _tPARENT[p]]
+				} else {
+					delete _tPARENT[v]
+				}
+			}
+			return (_tPREV[_tNEXT[v] = p] = v)
+		} else {
+			if (v == 0) {
+				return v
+			}			######################## p=ptr, v=0
+			return v
+		}
+	} else {
+		if (p == 0) {
+			return v	######################## p=0
+		}		######################## p=ptr, v=""
+		if (v) {
+			return _texclude(v)	######################## p="", v=ptr	- exclude v
+		}
+		return v
+	}
+}
+
+#_________________________________________________________________
+function _wQBRO(p, v)
+{
+	##############################################
+	return v
+}
+
+#_________________________________________________________________
+function _wQCHLD(p, v)
+{
+	#############################################
+	if (p) {
+		if (v) {
+		} else {
+			if (v == 0) {
+				if (p in _tFCHLD) {	######################## p=ptr, v=0 > delete all chld
+					v = _tFCHLD[p]	######################## p=ptr, v=ptr
+					delete _tFCHLD[p]
+					delete _tLCHLD[p]
+					delete _tQCHLD[p]
+					do {
+						delete _tPARENT[v]
+					} while ((v in _tNEXT) && (v = _tNEXT[v]))
+				}
+			}
+			return v
+		}
+	} else {
+		if (p == 0) {
+			return v	######################## p=ptr, v="" > ignore action
+		}		######################## p=0
+		return v
+	}
+}
+
+#_______________________________________________________________________
+function _warning(t, d, A)
+{
+	###############################################
+	if (_ERRLOG_WF) {
+		A["TYPE"] = "WARNING"
+		A["TEXT"] = t
+		_log(A, d)
+	}
+}
+
+#___________________________________________________________
+function _wfilerdnehnd(f, t)
+{
+	if ((f = _filerdne(f)) == "") {
+		return ""
+	}
+	if (! ((t = _filerd(f)) in _WFILEROOTDIR)) {
+		_cmd("md \"" t "\" 2>NUL")
+		_WFILEROOTDIR[t]
+	}
+	return f
+}
+
+function _wonl(t)
+{
+	wonl = wonl _ln(t)
+}
+
+function _wonline(t)
+{
+	wonl = wonl _ln(substr(" _ " t " _____________________________________________________________________________________________________________________________________", 1, 126))
+}
+
+#___________________________________________________________
+function _wr_shortcut(f, S)
+{
+	if ((_shrtcutf0 = _filepath(f))) {
+		ERRNO = ""
+		_shrtcuta0 = _shortcut_fpath " /A:C /F:\"" _shrtcutf0 "\" 2>&1"
+		for (f in _SHORTCUTWSTRUC) {
+			if (f in S) {
+				_shrtcuta0 = _shrtcuta0 " " _SHORTCUTWSTRUC[f] "\"" (gensub(/(\\?)$/, "\\1\\1", 1, S[f])) "\""
+			}
+		}
+		if (_shortcut_nerr(_cmd(_shrtcuta0), _shrtcutf0)) {
+			return
+		}
+	}
+	return (ERRNO ? ERRNO = "write shortcut: " ERRNO : _NOP)
+}
+
+#_________________________________________________________________
+function _wrfile(f, d, a, b)
+{
+	#########################################
+	if (((f = _wfilerdnehnd(f)) == "") || (_filene(f) == "")) {
+		ERRNO = "Filename error"
+		return
+	}
+	a = BINMODE
+	BINMODE = "rw"
+	b = ORS
+	ORS = ""
+	ERRNO = ""
+	print(d) > f
+	if (ERRNO) {
+		return ""
+	}
+	close(f)
+	BINMODE = a
+	ORS = b
+	if (ERRNO) {
+		return ""
+	}
+	return f
+}
+
+#___________________________________________________________
+function _wrfile1(f, d, a, b)
+{
+	##################################
+	if (((f = _wfilerdnehnd(f)) == "") || (_filene(f) == "")) {
+		ERRNO = "Filename error"
+		return
+	}
+	a = BINMODE
+	BINMODE = "rw"
+	b = ORS
+	ORS = ""
+	ERRNO = ""
+	print(d) > f
+	if (ERRNO) {
+		return ""
+	}
+	close(f)
+	BINMODE = a
+	ORS = b
+	if (ERRNO) {
+		return ""
+	}
+	return d
+}
+
+#_______________________________________________________________________
+function _yexport(p)
+{
+	#####################################################
+	return _tframe("_yexport_i0", p)
+}
+
+#_______________________________________________________________________
+function _yexport_i0(p, p0, p1, p2)
+{
+	if (p in _tLOG) {
+		return ("_ERRLOG: " _Zexparr(_tLOG[p]) "\n")
+	}
+	if (p in _tSTR) {
+		p = _tSTR[p]
+		gsub(/\x1B/, "\033;", p)
+		gsub(/\x0A/, "\033:", p)
+		return (p "\n")
+	}
+}
+
+#_________________________________________________________________
+function cmp_str_idx(i1, v1, i2, v2)
+{
+	##############################
+	return (i1 < i2 ? -1 : 1)
+}
+
+#___________________________________________________________
+function filedi(f, d)
+{
+	if ((f = filerdnehndi(f)) == "") {
+		return _FILEIO_D
+	}
+	if (f in _FILEDIRFL) {
+		return _FILEDIR[f]
+	}
+	if (f in _FILEROOT) {
+		if ((d = filegetdrvdir(_FILEROOT[f]))) {
+			_FILEDIRFL[f]
+		}
+		return (_FILEDIR[f] = d _FILEDIR[f])
+	}
+	if ((_FILEIO_RD, f) in _FILEDIR) {
+		return _FILEDIR[_FILEIO_RD, f]
+	}
+	return (_FILEDIR[_FILEIO_RD, f] = _FILEIO_D _FILEDIR[f])
+}
+
+#___________________________________________________________
+function filegetdrvdir(t, r)
+{
+	if (t in _FILEDRV) {
+		return _FILEDRV[t]
+	}
+	if (match(r = _cmd("cd " t " 2>NUL"), /[^\x00-\x1F]+/)) {
+		r = gensub(/[ \t]*([\\\$\:])[ \t]*/, "\\1", "G", substr(r, RSTART, RLENGTH))
+		gsub(/(^[ \t]*)|([ \t]*$)/, "", r)
+		if (match(r, /\:(.*)/)) {
+			return (_FILEDRV[tolower(t)] = _FILEDRV[toupper(t)] = substr(r, RSTART + 1) (r ~ /\\$/ ? "" : "\\"))
+		}
+	}
+	return ""
+}
+
+#___________________________________________________________
+function filegetrootdir(f, dd, d)
+{
+	if (f in _FILEDIRFL) {
+		if (f in _FILEROOT) {
+			return (_FILEROOT[f] _FILEDIR[f])
+		}
+		if (((dd = dd ? dd : _FILEIO_RD), f) in _FILEROOT) {
+			return (_FILEROOT[dd, f] _FILEDIR[f])
+		}
+		return (_FILEROOT[dd, f] = fileri(dd)) _FILEDIR[f]
+	}
+	if (f in _FILEROOT) {
+		if ((d = filegetdrvdir(_FILEROOT[f]))) {
+			_FILEDIRFL[f]
+			return (_FILEROOT[f] (_FILEDIR[f] = d _FILEDIR[f]))
+		} else {
+			return (_FILEROOT[f] _FILEDIR[f])
+		}
+	}
+	if (((dd = dd ? dd : _FILEIO_RD), f) in _FILEROOT) {
+		if ((dd, f) in _FILEDIR) {
+			return (_FILEROOT[dd, f] _FILEDIR[dd, f])
+		}
+		if ((d = filedi(dd) _FILEDIR[f]) ~ /^\\/) {
+			return (_FILEROOT[dd, f] (_FILEDIR[dd, f] = d))
+		}
+		return (_FILEROOT[dd, f] d)
+	}
+	if ((dd, f) in _FILEDIR) {
+		return (_FILEROOT[dd, f] = fileri(dd)) _FILEDIR[dd, f]
+	}
+	if ((d = filedi(dd) _FILEDIR[f]) ~ /^\\/) {
+		return (_FILEROOT[dd, f] = fileri(dd)) (_FILEDIR[dd, f] = d)
+	}
+	return (_FILEROOT[dd, f] = fileri(dd)) d
+}
+
+#___________________________________________________________
+function filerdnehndi(st, a, c, r, d, n, A)
+{
+	if (st) {
+		if ((c = toupper(st)) in _FILECACHE) {
+			return _FILECACHE[c]
+		}
+		if (match(st, /^[ \t]*\\[ \t]*\\/)) {
+			if (match(substr(st, a = RLENGTH + 1), /^[ \t]*([0-9A-Za-z\-]+)[ \t]*(\\[ \t]*([A-Za-z])[ \t]*\$[ \t]*)?(\\[ \t]*([0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)*[ \t]*)?(([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/, A)) {
+				a = a + RLENGTH
+				d = (A[3] ? ("\\" A[3] "$") : "") "\\" A[5]
+				gsub(/[ \t]*\\[ \t]*/, "\\", d)
+				if ((st = toupper((r = "\\\\" A[1]) d (n = A[8]))) in _FILECACHE) {
+					return (_FILECACHE[substr(c, 1, a)] = _FILECACHE[st])
+				}
+				_FILEDIR[c = _FILECACHE[substr(c, 1, a)] = _FILECACHE[st] = ++_file_rootcntr] = d
+				_FILEDIRFL[c]
+				_FILEROOT[c] = r
+			} else {
+				_filepath_err = "UNC"
+				return ""
+			}
+		} else {
+			match(st, /^(([ \t]*\.[ \t]*\\[ \t]*)|(([ \t]*([A-Za-z])[ \t]*(\:)[ \t]*)?([ \t]*(\\)[ \t]*)?))([ \t]*(([ \t]*[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+( +[0-9A-Za-z_\!\+\-\[\]\(\)\{\}\~\.]+)*[ \t]*\\)+)[ \t]*)?([ \t]*([0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+( +[0-9A-Za-z_\!\+\.\~\-\[\]\{\}\(\)]+)*)[ \t]*)?/, A)
+			if (! RLENGTH) {
+				return ""
+			}
+			d = A[8] A[10]
+			gsub(/[ \t]*\\[ \t]*/, "\\", d)
+			if ((st = toupper((r = A[5] A[6]) d (n = A[14]))) in _FILECACHE) {
+				return (_FILECACHE[substr(c, 1, RLENGTH)] = _FILECACHE[st])
+			}
+			_FILEDIR[c = _FILECACHE[substr(c, 1, RLENGTH)] = _FILECACHE[st] = ++_file_rootcntr] = d
+			if (A[8]) {
+				_FILEDIRFL[c]
+			}
+			if (r) {
+				_FILEROOT[c] = r
+			}
+		}
+		if (n) {
+			if (match(n, /\.[^\.]*$/)) {
+				_FILEXT[c] = substr(n, RSTART)
+				_FILENAM[c] = substr(n, 1, RSTART - 1)
+			} else {
+				_FILENAM[c] = n
+			}
+		}
+		return c
+	}
+	return ""
+}
+
+#_____________________________________________________
+function fileri(f)
+{
+	if ((f = filerdnehndi(f)) == "") {
+		return _FILEIO_R
+	}
+	if (f in _FILEROOT) {
+		return _FILEROOT[f]
+	}
+	if ((_FILEIO_RD, f) in _FILEROOT) {
+		return _FILEROOT[_FILEIO_RD, f]
+	}
+	return (_FILEROOT[_FILEIO_RD, f] = _FILEIO_R)
+}
+
+function hujf(a, b, c)
+{
+	_conl("hujf(" a "," b "," c ")")
+}
+
+#___________________________________________________________
+function ncmp_str_idx(i1, v1, i2, v2)
+{
+	#######################
+	return (i1 < i2 ? 1 : -1)
+}
+
+function test_cfg(p, z, AA0, a)
+{
+	AA0[1]
+	_fclass = _cfguid(p = _getuid(_classys), _NOP, _NOP, _NOP, _NOP, _classys)
+	_conl()
+	_conline()
+	_conl()
+	_drawuid(p)
+	_fclass = _cfguid(p = _getuid(_classys), AA0, AA0, AA0, AA0, _classys)
+	_conl()
+	_conline()
+	_conl()
+	_drawuid(p)
+	a = _getuid(z = _fclass = _cfguid(p = _getuid(_classys), p, "<", ">", "ab", "cd"))
+	_conl("### " a "########")
+	_conline()
+	_conl()
+	_drawuid(p)
+	a = _getuid(_fclass = _cfguid(p = _getuid(_classys), z, 0, 0, _NOP, z))
+	_conl("### " a "########")
+	_conline()
+	_conl()
+	_drawuid(p)
+	a = _getuid(_fclass = _cfguid(p = _getuid(_classys), z, "^", "$", z, _classys))
+	_conl("### " a "########")
+	_conline()
+	_conl()
+	_drawuid(p)
+	_fclass = _cfguid(p = _getuid(_classys), "oblptr", "pfx", "sfx", "abcd")
+	_conl()
+	_conline()
+	_conl()
+	_drawuid(p)
+	_conl("```````````````````" z "'''''''''" (_isptr(z) ? " ptr" : " not ptr"))
+	_drawuid(z)
+}
+
+function test_splitstr(A)
+{
+	AA0[-1] = "huj"
+	AA0["A"] = "pizda"
+	AA0[1] = "zhopa"
+	delete AB0[AB0[""] = ""]
+	AC0[-1] = "HUJ"
+	AC0["A"] = "PIZDA"
+	AC0[1] = "ZHOPA"
+	_SPLITSTRB0["1"]
+	wonl = ""
+	_tstv(0, A, 0, "_tstv")
+	_conl(wonl)
+	_wrfile("wonl.out", wonl)
+}
+
+function test_uid(p, i)
+{
+	#test_cfg()
+	#return
+	_fclass = _cfguid(p = _getuid(_classys), p, "pfx", "sfx", "abc")
+	#_fclass=_cfguid(p=_getuid(_classys),_NOP,_NOP,_NOP,"",_classys)
+	_conl("_fclass uid: " _getuid(_fclass))
+	_drawuid(_fclass)
+	_conl("_classys uid: " _getuid(_classys)) _drawuid(_classys)
+	for (i = 1; i < 81; i++) {
+		_conl(i ": " _getuid(_fclass))
+	}
+	_drawuid(_fclass)
+}
+
+function tst_splitstr(t, A, R, r)
+{
+	delete A
+	A["not cleared"]
+	_wonl()
+	_wonline("_splitstr(" (isarray(t) ? "ARR" (length(t) > 0 ? "#" (t[1] != "zhopa" ? "U" : "l") : "") : _val0(t)) ",A" (isarray(R) ? ",        ARR" (length(R) > 0 ? "#" (R[1] != "zhopa" ? "U" : "l") : "") : ",        " _val0(R)) "):")
+	_wonl(_val0(r = _splitstr(t, A, R)))
+	_wonl("arrary A:")
+	_wonl(_dumparr(A))
+	return r
+}
+
+function tts(p, uidel, psfx, cnt, chr, p5, p6, p7, im)
+{
+	im = "     "
+	im = ".. .."
+	_conl("ret:   " _qparam(im, p, uidel, psfx, cnt, chr, p5, p6, p7) "'")
+	_conl("mask: `" _qparamask "'")
+}
+
+#			#		- p is array
+#			`		- p is ptr detected in array _CLASSPTR(for _typ); or p is ptr detected in array A(for _typa)
+#			0		- p is undefined
+
+#			2		- p is string==""
+#			3		- p is string!=""
+#			4		- p is number 0
+#			5		- p is any number except 0(positive and negative)
+
+# str:			_typ(p)+0		!_typ(p)+0
+# str/ptr			_typ(p)>0		_typ(p)<1
+# str/arr			"`">_typ(p0) && _t0
+# str/ptr/arr		_typ(p)		!_typ(p)
+# ptr				_typ(p)=="`"	_typ(p)<"`"  ?
+# ptr/arr			_typ(p)+0!=_t0
+# arr				_typ(p)=="#"	_typ(p)>"#"  ?
+function zorr(A, i, r)
+{
+	if (i in A) {
+		_conl("`" i "' in A")
+	} else {
+		_conl("`" i "' not in A")
+	}
+	r = A[i] == "" && A[i] == 0
+	_conl("A[" i "] status is " r)
+	return
+	a = a + -a
+	_conl("``````````````" a "''''''''''''''''")
+}
+
+#_____________________________________________________________________________
+function zzer()
+{
+	################################################################
+}
diff --git a/gawk-5.0.1/test/profile6.awk b/gawk-5.0.1/test/profile6.awk
new file mode 100644
index 00000000000..754f8ae67cc
--- /dev/null
+++ b/gawk-5.0.1/test/profile6.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	x = 3
+	print -(-x)
+	Q = "|"
+	print -3 Q (-4)
+	print -3 Q (-4) (-5)
+}
diff --git a/gawk-5.0.1/test/profile6.ok b/gawk-5.0.1/test/profile6.ok
new file mode 100644
index 00000000000..0c9486c773e
--- /dev/null
+++ b/gawk-5.0.1/test/profile6.ok
@@ -0,0 +1,10 @@
+	# BEGIN rule(s)
+
+	BEGIN {
+     1  	x = 3
+     1  	print -(-x)
+     1  	Q = "|"
+     1  	print -3 Q (-4)
+     1  	print -3 Q (-4) (-5)
+	}
+
diff --git a/gawk-5.0.1/test/profile7.awk b/gawk-5.0.1/test/profile7.awk
new file mode 100644
index 00000000000..815aebb8aba
--- /dev/null
+++ b/gawk-5.0.1/test/profile7.awk
@@ -0,0 +1,14 @@
+BEGIN {
+	print 1 / 10 * 10
+	print 1 / (10 * 10)
+	print 1 % 10 * 10
+	print 1 % (10 * 10)
+	print (10 * 5) / 2
+	print 10 * (5 / 2)
+	print 10 - (1 + 3 * 3)
+	print 10 - (3 * 2 + 1)
+	a = 5
+	b = 3
+	print a - 1 - b
+	print a + 1 - b
+}
diff --git a/gawk-5.0.1/test/profile7.ok b/gawk-5.0.1/test/profile7.ok
new file mode 100644
index 00000000000..10da2eb4910
--- /dev/null
+++ b/gawk-5.0.1/test/profile7.ok
@@ -0,0 +1,17 @@
+	# BEGIN rule(s)
+
+	BEGIN {
+     1  	print 1 / 10 * 10
+     1  	print 1 / (10 * 10)
+     1  	print 1 % 10 * 10
+     1  	print 1 % (10 * 10)
+     1  	print (10 * 5) / 2
+     1  	print 10 * (5 / 2)
+     1  	print 10 - (1 + 3 * 3)
+     1  	print 10 - (3 * 2 + 1)
+     1  	a = 5
+     1  	b = 3
+     1  	print a - 1 - b
+     1  	print a + 1 - b
+	}
+
diff --git a/gawk-5.0.1/test/profile8.awk b/gawk-5.0.1/test/profile8.awk
new file mode 100644
index 00000000000..68d0622e425
--- /dev/null
+++ b/gawk-5.0.1/test/profile8.awk
@@ -0,0 +1,4 @@
+{if(0){}else{}}
+{while(0){}}
+{do{}while(0)}
+{for(;;){}}
diff --git a/gawk-5.0.1/test/profile8.ok b/gawk-5.0.1/test/profile8.ok
new file mode 100644
index 00000000000..2b9c156f4be
--- /dev/null
+++ b/gawk-5.0.1/test/profile8.ok
@@ -0,0 +1,21 @@
+{
+	if (0) {
+	} else {
+	}
+}
+
+{
+	while (0) {
+	}
+}
+
+{
+	do {
+	} while (0)
+}
+
+{
+	for (;;) {
+	}
+}
+
diff --git a/gawk-5.0.1/test/profile9.awk b/gawk-5.0.1/test/profile9.awk
new file mode 100644
index 00000000000..16252ceae59
--- /dev/null
+++ b/gawk-5.0.1/test/profile9.awk
@@ -0,0 +1,9 @@
+# Some
+# header
+# comments
+
+# Add up
+{ sum += $1 }
+
+# Print sum
+END { print sum }
diff --git a/gawk-5.0.1/test/profile9.ok b/gawk-5.0.1/test/profile9.ok
new file mode 100644
index 00000000000..34f7a96b4af
--- /dev/null
+++ b/gawk-5.0.1/test/profile9.ok
@@ -0,0 +1,14 @@
+# Some
+# header
+# comments
+
+# Add up
+{
+	sum += $1
+}
+
+# Print sum
+END {
+	print sum
+}
+
diff --git a/gawk-5.0.1/test/prt1eval.awk b/gawk-5.0.1/test/prt1eval.awk
new file mode 100644
index 00000000000..4ecd3680bc8
--- /dev/null
+++ b/gawk-5.0.1/test/prt1eval.awk
@@ -0,0 +1,6 @@
+function tst () {
+	sum += 1
+	return sum
+}
+
+BEGIN { OFMT = "%.0f" ; print tst() }
diff --git a/gawk-5.0.1/test/prt1eval.ok b/gawk-5.0.1/test/prt1eval.ok
new file mode 100644
index 00000000000..d00491fd7e5
--- /dev/null
+++ b/gawk-5.0.1/test/prt1eval.ok
@@ -0,0 +1 @@
+1
diff --git a/gawk-5.0.1/test/prtoeval.awk b/gawk-5.0.1/test/prtoeval.awk
new file mode 100644
index 00000000000..77880d87146
--- /dev/null
+++ b/gawk-5.0.1/test/prtoeval.awk
@@ -0,0 +1,4 @@
+function returns_a_str() { print "<in function>" ; return "'A STRING'" }
+BEGIN {
+	print "partial line:", returns_a_str()
+}
diff --git a/gawk-5.0.1/test/prtoeval.ok b/gawk-5.0.1/test/prtoeval.ok
new file mode 100644
index 00000000000..13e122b8d11
--- /dev/null
+++ b/gawk-5.0.1/test/prtoeval.ok
@@ -0,0 +1,2 @@
+<in function>
+partial line: 'A STRING'
diff --git a/gawk-5.0.1/test/pty1.awk b/gawk-5.0.1/test/pty1.awk
new file mode 100644
index 00000000000..77178d61c51
--- /dev/null
+++ b/gawk-5.0.1/test/pty1.awk
@@ -0,0 +1,54 @@
+# Message-ID: <1312419482.36133.YahooMailNeo@web110416.mail.gq1.yahoo.com>
+# Date: Wed, 3 Aug 2011 17:58:02 -0700 (PDT)
+# From: "T. X. G." <leopardie333@yahoo.com>
+# To: "bug-gawk@gnu.org" <bug-gawk@gnu.org>
+# Subject: [bug-gawk] two bugs in gawk 4.0.0 with FPAT and pty
+# 
+# $ gawk --version
+# GNU Awk 4.0.0
+# Copyright (C) 1989, 1991-2011 Free Software Foundation.
+# 
+# # bug due to trying to make field splitting more efficient by not parse all fields 
+# $ echo a,b,,c |gawk '{for(i=1;i<=4;++i)print i, $i}' FPAT='[^,]*'
+# 1 a
+# 2 
+# 3 b
+# 4 
+# 
+# # work around
+# $ echo a,b,,c |gawk '{NF;for(i=1;i<=4;++i)print i, $i}' FPAT='[^,]*'
+# 1 a
+# 2 b
+# 3 
+# 4 c
+# 
+# This bug, as you commented in function fpat_parse_field, is subtle. The null matches of previous call should be remembered across calls. You could make the auto variable non_empty static, but then any calls to patsplit between references of fields will cause it to be wrong. I guess you can either forgo the field splitting optimization by always parse all field in the case of FPAT or make a separate function for splitting $0 only (or pass an extra arg to it?) I am sure you will find the best fix.
+# 
+# 
+# The next bug is with pty:
+# 
+# $ gawk 'BEGIN{
+# c = "echo 123 > /dev/tty; read x < /dev/tty; echo \"x is $x\""
+# PROCINFO[c, "pty"] = 1
+# c |& getline;print
+# print "abc" |& c
+# c |& getline;print
+# }'
+# 123
+# ^C
+# 
+# Adding a call to setsid() in the function two_way_open right after fork in the child process seems to fix it.
+# 
+# One request for feature:
+# Currently the format for mktime is not configurable. Could you please make it configurable just like strftime through PROCINFO["mktime"]? In fact I have already done it myself. But I don't think you would like my style. It should be pretty simple for you to implement.
+# 
+# Thank you, Arnold. Again as I have said before, I enjoy your writings and appreciate your contributions to the FSF. 
+# W. G.
+# 
+BEGIN	{
+	c = "echo 123 > /dev/tty; read x < /dev/tty; echo \"x is $x\""
+	PROCINFO[c, "pty"] = 1
+	c |& getline; print
+	print "abc" |& c
+	c |& getline; print
+}
diff --git a/gawk-5.0.1/test/pty1.ok b/gawk-5.0.1/test/pty1.ok
new file mode 100644
index 00000000000..f06833f5644
--- /dev/null
+++ b/gawk-5.0.1/test/pty1.ok
@@ -0,0 +1,2 @@
+123
+x is abc
diff --git a/gawk-5.0.1/test/pty2.awk b/gawk-5.0.1/test/pty2.awk
new file mode 100644
index 00000000000..c2eedbd0b53
--- /dev/null
+++ b/gawk-5.0.1/test/pty2.awk
@@ -0,0 +1,9 @@
+BEGIN {
+   cmd = "tr '[A-Z]' '[a-z]' 2> /dev/null"
+   PROCINFO[cmd, "pty"] = 1
+   input = "ABCD"
+   print input |& cmd
+   cmd |& getline x
+   print x
+#   close(cmd)
+}
diff --git a/gawk-5.0.1/test/pty2.ok b/gawk-5.0.1/test/pty2.ok
new file mode 100644
index 00000000000..0c8afd98b83
--- /dev/null
+++ b/gawk-5.0.1/test/pty2.ok
@@ -0,0 +1,2 @@
+0000000 a b c d \n
+0000005
diff --git a/gawk-5.0.1/test/rand-mpfr.ok b/gawk-5.0.1/test/rand-mpfr.ok
new file mode 100644
index 00000000000..448f4032071
--- /dev/null
+++ b/gawk-5.0.1/test/rand-mpfr.ok
@@ -0,0 +1 @@
+ 25  42  47  49  80   5   4  92  59  96   8  63  92  28  41  37  80  51  48 
diff --git a/gawk-5.0.1/test/rand.awk b/gawk-5.0.1/test/rand.awk
new file mode 100644
index 00000000000..6378f3d3773
--- /dev/null
+++ b/gawk-5.0.1/test/rand.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	srand(2)
+	for (i = 0; i < 19; i++) 
+		printf "%3d ", (1 + int(100 * rand()))
+	print ""
+}
diff --git a/gawk-5.0.1/test/rand.ok b/gawk-5.0.1/test/rand.ok
new file mode 100644
index 00000000000..4ec90dd6d34
--- /dev/null
+++ b/gawk-5.0.1/test/rand.ok
@@ -0,0 +1 @@
+ 90  23   5  64  38  61  72   5  82  80  33  71  33  34  55  60  90  88   7 
diff --git a/gawk-5.0.1/test/randtest.ok b/gawk-5.0.1/test/randtest.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/randtest.sh b/gawk-5.0.1/test/randtest.sh
new file mode 100755
index 00000000000..597376a877a
--- /dev/null
+++ b/gawk-5.0.1/test/randtest.sh
@@ -0,0 +1,113 @@
+# THIS PURPOSELY DOES NOT HAVE A !# LINE !!!!
+#
+# Date: Mon, 9 Sep 2013 14:49:43 -0700
+# From: Bob Jewett <jewett@bill.scs.agilent.com>
+# Message-Id: <201309092149.r89Lnh94010909@bill.scs.agilent.com>
+# To: arnold@skeeve.com
+# Subject: Re: [bug-gawk] Bug in random() in builtin.c
+# 
+# Hi Arnold,
+# 
+# Attached below is a script that tests gawk for this particular
+# rand() problem.  The pair-wise combinations show a strong
+# autocorrelation for a delay of 31 pairs of rand() samples. 
+# 
+# The script prints out the measured autocorrelation for a record
+# of NSAMPLES pairs.  It also prints a fail message at the end if
+# it fails. 
+# 
+# If you want to see the autocorrelation values, there is a print
+# statement that if uncommented will save them to a file.
+# 
+# Please let me know if the mailer screws up the transfer or
+# if you have any questions about the test.
+# 
+# Best regards,
+# Bob
+# 
+# -------------- test_pair_power_autocorrelation -----------------------
+# 
+#!/bin/ksh
+
+#AWK=/bin/gawk
+
+# ADR: Get AWK from the environment.
+# Additional note: This wants ksh/bash for the use of $RANDOM below to
+# seed the generator. However, shells that don't provide it won't be
+# a problem since gawk will then seed the generator with the time of day,
+# as srand() will be called without an argument.
+
+# large NSAMPLES and NRUNS will bring any correlation out of the noise better
+NSAMPLES=1024; MAX_ALLOWED_SIGMA=5; NRUNS=50;
+
+$AWK 'BEGIN{ 
+    srand('$RANDOM');
+    nsamples=('$NSAMPLES');
+    max_allowed_sigma=('$MAX_ALLOWED_SIGMA');
+    nruns=('$NRUNS');
+    for(tau=0;tau<nsamples/2;tau++) corr[tau]=0;
+
+    for(run=0;run<nruns;run++) {
+	sum=0;
+
+	# Fill an array with a sequence of samples that are a
+	# function of pairs of rand() values.
+
+	for(i=0;i<nsamples;i++) {
+	   samp[i]=((rand()-0.5)*(rand()-0.5))^2;
+	   sum=sum+samp[i];
+	   }
+
+	# Subtract off the mean of the sequence:
+
+	mean=sum/nsamples;
+	for(i=0;i<nsamples;i++) samp[i]=samp[i]-mean;
+
+	# Calculate an autocorrelation function on the sequence.
+	# Because the values of rand() should be independent, there
+	# should be no peaks in the autocorrelation.
+
+	for(tau=0;tau<nsamples/2;tau++) {
+	    sum=0;
+	    for(i=0;i<nsamples/2;i++) sum=sum+samp[i]*samp[i+tau];
+	    corr[tau]=corr[tau]+sum;
+	    }
+
+	}
+    # Normalize the autocorrelation to the tau=0 value.
+
+    max_corr=corr[0];
+    for(tau=0;tau<nsamples/2;tau++) corr[tau]=corr[tau]/max_corr;
+
+    # OPTIONALLY Print out the autocorrelation values:
+
+    # for(tau=0;tau<nsamples/2;tau++) print tau, corr[tau] > "pairpower_corr.data";
+
+    # Calculate the sigma for the non-zero tau values: 
+
+    power_sum=0;
+
+    for(tau=1;tau<nsamples/2;tau++) power_sum=power_sum+(corr[tau])^2;
+
+    sigma=sqrt(power_sum/(nsamples/2-1));
+
+    # See if any of the correlations exceed a reasonable number of sigma:
+
+    passed=1;
+    for(tau=1;tau<nsamples/2;tau++) {
+	if ( abs(corr[tau])/sigma > max_allowed_sigma ) {
+	    print "Tau=", tau ", Autocorr=", corr[tau]/sigma, "sigma";
+	    passed=0;
+	    }
+        }
+    if(!passed) {
+	print "Test failed."
+	exit(1);
+        }
+    else exit (0);
+    }
+
+function abs(abs_input) { return(sqrt(abs_input^2)) ; }
+'
+
+exit 0
diff --git a/gawk-5.0.1/test/range1.awk b/gawk-5.0.1/test/range1.awk
new file mode 100644
index 00000000000..aca5db50cc9
--- /dev/null
+++ b/gawk-5.0.1/test/range1.awk
@@ -0,0 +1 @@
+/foo/,/bar/ { print }
diff --git a/gawk-5.0.1/test/range1.in b/gawk-5.0.1/test/range1.in
new file mode 100644
index 00000000000..c4960197b4b
--- /dev/null
+++ b/gawk-5.0.1/test/range1.in
@@ -0,0 +1,2 @@
+foobar
+junk
diff --git a/gawk-5.0.1/test/range1.ok b/gawk-5.0.1/test/range1.ok
new file mode 100644
index 00000000000..323fae03f46
--- /dev/null
+++ b/gawk-5.0.1/test/range1.ok
@@ -0,0 +1 @@
+foobar
diff --git a/gawk-5.0.1/test/range2.awk b/gawk-5.0.1/test/range2.awk
new file mode 100644
index 00000000000..c4f11eaaa46
--- /dev/null
+++ b/gawk-5.0.1/test/range2.awk
@@ -0,0 +1 @@
+BEGIN { print("a" ~ /^[\300-\337]/) }
diff --git a/gawk-5.0.1/test/range2.ok b/gawk-5.0.1/test/range2.ok
new file mode 100644
index 00000000000..573541ac970
--- /dev/null
+++ b/gawk-5.0.1/test/range2.ok
@@ -0,0 +1 @@
+0
diff --git a/gawk-5.0.1/test/readbuf.awk b/gawk-5.0.1/test/readbuf.awk
new file mode 100644
index 00000000000..b7512db4b8f
--- /dev/null
+++ b/gawk-5.0.1/test/readbuf.awk
@@ -0,0 +1,2 @@
+
+{
diff --git a/gawk-5.0.1/test/readbuf.ok b/gawk-5.0.1/test/readbuf.ok
new file mode 100644
index 00000000000..110a26bcbf9
--- /dev/null
+++ b/gawk-5.0.1/test/readbuf.ok
@@ -0,0 +1,3 @@
+gawk: readbuf.awk:2: {
+gawk: readbuf.awk:2: ^ unexpected newline or end of string
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/readdir.awk b/gawk-5.0.1/test/readdir.awk
new file mode 100644
index 00000000000..d407bbcef41
--- /dev/null
+++ b/gawk-5.0.1/test/readdir.awk
@@ -0,0 +1,3 @@
+@load "readdir"
+
+{ print }
diff --git a/gawk-5.0.1/test/readdir0.awk b/gawk-5.0.1/test/readdir0.awk
new file mode 100644
index 00000000000..012826ed0a5
--- /dev/null
+++ b/gawk-5.0.1/test/readdir0.awk
@@ -0,0 +1,46 @@
+# NOTE: This program is not a generalized parser for the output of 'ls'.
+# It's job is to read the output of ls from the gawk source code directory,
+# where we know there are no files with spaces in their file names, etc.
+BEGIN {
+	# analyze results from readdir extension
+	while ((getline x < extout) > 0) {
+		numrec++
+		if ((split(x, f, "/") == 3) && (f[3] == "u"))
+			num_unknown++
+	}
+	close(extout)
+	if ((numrec > 0) && (num_unknown == numrec)) {
+		print "Notice: this filesystem does not appear to support file type information" > "/dev/stderr"
+		ftype_unknown = 1
+	}
+}
+
+BEGIN {
+	for (i = 1; (getline < dirlist) > 0; i++) {
+		# inode number is $1, filename is read of record
+		inode = $1
+		$1 = ""
+		$0 = $0
+		sub(/^ */, "")
+		names[i] = $0
+		ino[names[i]] = inode
+	}
+	close(dirlist)
+
+	for (j = 1; (getline < longlist) > 0; j++) {
+		type_let = substr($0, 1, 1)
+		if (type_let == "-")
+			type_let = "f"
+		if (type_let == "l")
+			type[$(NF-2)] = type_let
+		else
+			type[$NF] = type_let
+	}
+	close(longlist)
+
+	if (i != j)
+		printf("mismatch: %d from `ls -afi' and %d from `ls -lna'\n", i, j) > "/dev/stderr"
+	
+	for (i = 1; i in names; i++)
+		printf("%s/%s/%s\n", ino[names[i]], names[i], (ftype_unknown ? "u" : type[names[i]]))
+}
diff --git a/gawk-5.0.1/test/readdir_retest.awk b/gawk-5.0.1/test/readdir_retest.awk
new file mode 100644
index 00000000000..079a9930169
--- /dev/null
+++ b/gawk-5.0.1/test/readdir_retest.awk
@@ -0,0 +1,7 @@
+# Test field values after reparsing
+FNR == 1 { record1 = $0 }
+{
+	printf "[%s] [%s] [%s] [%s]\n", $1, $2, $3, $4
+	$0 = record1
+	printf "[%s] [%s] [%s] [%s]\n", $1, $2, $3, $4
+}
diff --git a/gawk-5.0.1/test/readfile2.awk b/gawk-5.0.1/test/readfile2.awk
new file mode 100644
index 00000000000..c21483fcf43
--- /dev/null
+++ b/gawk-5.0.1/test/readfile2.awk
@@ -0,0 +1,12 @@
+@load "readfile"
+BEGIN { PROCINFO["readfile"] = 1 }
+BEGINFILE { print "Start of", basename(FILENAME) }
+{ printf ("%d: <%s>\n", FNR, $0 ) }
+ENDFILE { print "End of", basename(FILENAME) }
+
+function basename(file,		result)
+{
+	result = file
+	gsub(".*/", "", result)
+	return result
+}
diff --git a/gawk-5.0.1/test/readfile2.ok b/gawk-5.0.1/test/readfile2.ok
new file mode 100644
index 00000000000..be1ded6ca9a
--- /dev/null
+++ b/gawk-5.0.1/test/readfile2.ok
@@ -0,0 +1,21 @@
+Start of readfile2.awk
+1: <@load "readfile"
+BEGIN { PROCINFO["readfile"] = 1 }
+BEGINFILE { print "Start of", basename(FILENAME) }
+{ printf ("%d: <%s>\n", FNR, $0 ) }
+ENDFILE { print "End of", basename(FILENAME) }
+
+function basename(file,		result)
+{
+	result = file
+	gsub(".*/", "", result)
+	return result
+}
+>
+End of readfile2.awk
+Start of readdir.awk
+1: <@load "readdir"
+
+{ print }
+>
+End of readdir.awk
diff --git a/gawk-5.0.1/test/rebrackloc.awk b/gawk-5.0.1/test/rebrackloc.awk
new file mode 100644
index 00000000000..c5987fcbe06
--- /dev/null
+++ b/gawk-5.0.1/test/rebrackloc.awk
@@ -0,0 +1,31 @@
+match($0, /([Nn]ew) Value +[\([]? *([[:upper:]]+)/, f) {
+	print "re1", NR, f[1], f[2]
+}
+
+match($0, /([][])/, f) {
+	print "re2", NR, f[1]
+}
+
+/[]]/ {
+	print "re3", NR, $0
+}
+
+/[\[]/ {
+	print "re4", NR, $0
+}
+
+/[[]/ {
+	print "re5", NR, $0
+}
+
+/[][]/ {
+	print "re6", NR, $0
+}
+
+/[\([][[:upper:]]*/ {
+	print "re7", NR, $0
+}
+
+/[\([]/ {
+	print "re8", NR, $0
+}
diff --git a/gawk-5.0.1/test/rebrackloc.in b/gawk-5.0.1/test/rebrackloc.in
new file mode 100644
index 00000000000..d82369b6e01
--- /dev/null
+++ b/gawk-5.0.1/test/rebrackloc.in
@@ -0,0 +1,3 @@
+New Value [XYZ]
+[
+]
diff --git a/gawk-5.0.1/test/rebrackloc.ok b/gawk-5.0.1/test/rebrackloc.ok
new file mode 100644
index 00000000000..ec98bf58297
--- /dev/null
+++ b/gawk-5.0.1/test/rebrackloc.ok
@@ -0,0 +1,17 @@
+re1 1 New XYZ
+re2 1 [
+re3 1 New Value [XYZ]
+re4 1 New Value [XYZ]
+re5 1 New Value [XYZ]
+re6 1 New Value [XYZ]
+re7 1 New Value [XYZ]
+re8 1 New Value [XYZ]
+re2 2 [
+re4 2 [
+re5 2 [
+re6 2 [
+re7 2 [
+re8 2 [
+re2 3 ]
+re3 3 ]
+re6 3 ]
diff --git a/gawk-5.0.1/test/rebt8b1.awk b/gawk-5.0.1/test/rebt8b1.awk
new file mode 100644
index 00000000000..8fa43fba9a8
--- /dev/null
+++ b/gawk-5.0.1/test/rebt8b1.awk
@@ -0,0 +1,138 @@
+# From hankedr@dms.auburn.edu  Sun Jan 28 12:25:43 2001
+# Received: from mail.actcom.co.il [192.114.47.13]
+# 	by localhost with POP3 (fetchmail-5.5.0)
+# 	for arnold@localhost (single-drop); Sun, 28 Jan 2001 12:25:43 +0200 (IST)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Sun Jan 28 12:27:08 2001)
+# X-From_: hankedr@dms.auburn.edu Sat Jan 27 15:15:57 2001
+# Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+# 	(8.9.1a/actcom-0.2) id PAA23801 for <arobbins@actcom.co.il>;
+# 	Sat, 27 Jan 2001 15:15:55 +0200 (EET)  
+# 	(rfc931-sender: lmail.actcom.co.il [192.114.47.13])
+# Received: from billohost.com (www.billohost.com [209.196.35.10])
+# 	by lmail.actcom.co.il (8.9.3/8.9.1) with ESMTP id PAA15998
+# 	for <arobbins@actcom.co.il>; Sat, 27 Jan 2001 15:16:27 +0200
+# Received: from yak.dms.auburn.edu (yak.dms.auburn.edu [131.204.53.2])
+# 	by billohost.com (8.9.3/8.9.3) with ESMTP id IAA00467
+# 	for <arnold@skeeve.com>; Sat, 27 Jan 2001 08:15:52 -0500
+# Received: (from hankedr@localhost)
+# 	by yak.dms.auburn.edu (8.9.3/8.9.3/Debian/GNU) id HAA24441;
+# 	Sat, 27 Jan 2001 07:15:44 -0600
+# Date: Sat, 27 Jan 2001 07:15:44 -0600
+# Message-Id: <200101271315.HAA24441@yak.dms.auburn.edu>
+# From: Darrel Hankerson <hankedr@dms.auburn.edu>
+# To: arnold@skeeve.com
+# Subject: [stolfi@ic.unicamp.br: Bug in [...]* matching with acute-u]
+# Mime-Version: 1.0 (generated by tm-edit 7.106)
+# Content-Type: message/rfc822
+# Status: R
+# 
+# From: Jorge Stolfi <stolfi@ic.unicamp.br>
+# To: bug-gnu-utils@gnu.org
+# Subject: Bug in [...]* matching with acute-u
+# MIME-Version: 1.0
+# Reply-To: stolfi@ic.unicamp.br
+# X-MIME-Autoconverted: from 8bit to quoted-printable by grande.dcc.unicamp.br id GAA10716
+# Sender: bug-gnu-utils-admin@gnu.org
+# Errors-To: bug-gnu-utils-admin@gnu.org
+# X-BeenThere: bug-gnu-utils@gnu.org
+# X-Mailman-Version: 2.0
+# Precedence: bulk
+# List-Help: <mailto:bug-gnu-utils-request@gnu.org?subject=help>
+# List-Post: <mailto:bug-gnu-utils@gnu.org>
+# List-Subscribe: <http://mail.gnu.org/mailman/listinfo/bug-gnu-utils>,
+# 	<mailto:bug-gnu-utils-request@gnu.org?subject=subscribe>
+# List-Id: Bug reports for the GNU utilities <bug-gnu-utils.gnu.org>
+# List-Unsubscribe: <http://mail.gnu.org/mailman/listinfo/bug-gnu-utils>,
+# 	<mailto:bug-gnu-utils-request@gnu.org?subject=unsubscribe>
+# List-Archive: <http://mail.gnu.org/pipermail/bug-gnu-utils/>
+# Date: Sat, 27 Jan 2001 06:46:11 -0200 (EDT)
+# Content-Transfer-Encoding: 8bit
+# X-MIME-Autoconverted: from quoted-printable to 8bit by manatee.dms.auburn.edu id CAA14936
+# Content-Type: text/plain; charset=iso-8859-1
+# 	<mailto:bug-gnu-utils-request@gnu.org?subject=subscribe>
+# 	<mailto:bug-gnu-utils-request@gnu.org?subject=uns
+# Content-Length: 3137
+# 
+# 
+# 
+# Hi,
+# 
+# I think I have run into a bug in gawk's handling of REs of the
+# form [...]* when the bracketed list includes certain 8-bit characters,
+# specifically u-acute (octal \372).
+# 
+# The problem occurs in GNU Awk 3.0.4, both under 
+# Linux 2.2.14-5.0 (intel i686) and SunOS 5.5 (Sun sparc).
+# 
+# Here is a program that illustrates the bug, and its output.
+# The first two lines of the output should be equal, shouldn't they?
+# 
+# ----------------------------------------------------------------------
+#! /usr/bin/gawk -f
+
+BEGIN {
+  s = "bananas and ananases in canaan";
+  t = s; gsub(/[an]*n/, "AN", t);   printf "%-8s  %s\n", "[an]*n", t;
+  t = s; gsub(/[an�]*n/, "AN", t);  printf "%-8s  %s\n", "[an�]*n", t;
+  print "";
+  t = s; gsub(/[a�]*n/, "AN", t);   printf "%-8s  %s\n", "[a�]*n", t;
+  print "";
+  t = s; gsub(/[an]n/, "AN", t);    printf "%-8s  %s\n", "[an]n", t;
+  t = s; gsub(/[a�]n/, "AN", t);    printf "%-8s  %s\n", "[a�]n", t;
+  t = s; gsub(/[an�]n/, "AN", t);   printf "%-8s  %s\n", "[an�]n", t;
+  print "";
+  t = s; gsub(/[an]?n/, "AN", t);   printf "%-8s  %s\n", "[an]?n", t;
+  t = s; gsub(/[a�]?n/, "AN", t);   printf "%-8s  %s\n", "[a�]?n", t;
+  t = s; gsub(/[an�]?n/, "AN", t);  printf "%-8s  %s\n", "[an�]?n", t;
+  print "";
+  t = s; gsub(/[an]+n/, "AN", t);   printf "%-8s  %s\n", "[an]+n", t;
+  t = s; gsub(/[a�]+n/,  "AN", t);  printf "%-8s  %s\n", "[a�]+n", t;
+  t = s; gsub(/[an�]+n/, "AN", t);  printf "%-8s  %s\n", "[an�]+n", t;
+}
+# ----------------------------------------------------------------------
+# [an]*n    bANas ANd ANases iAN cAN
+# [an�]*n   bananas and ananases in canaan
+# 
+# [a�]*n    bANANas ANd ANANases iAN cANAN
+# 
+# [an]n     bANANas ANd ANANases in cANaAN
+# [a�]n     bANANas ANd ANANases in cANaAN
+# [an�]n    bANANas ANd ANANases in cANaAN
+# 
+# [an]?n    bANANas ANd ANANases iAN cANaAN
+# [a�]?n    bANANas ANd ANANases iAN cANaAN
+# [an�]?n   bANANas ANd ANANases iAN cANaAN
+# 
+# [an]+n    bANas ANd ANases in cAN
+# [a�]+n    bANANas ANd ANANases in cANAN
+# [an�]+n   bananas and ananases in canaan
+# ----------------------------------------------------------------------
+# 
+# Apparently the problem is specific to u-acute; I've tried several
+# other 8-bit characters and they seem to behave as expected.
+# 
+# By comparing the second and third output lines, it would seem that the
+# problem involves backtracking out of a partial match of [...]* in
+# order to match the next sub-expression, when the latter begins with
+# one of the given characters.
+# 
+# 
+# All the best,
+# 
+# --stolfi
+# 
+# ------------------------------------------------------------------------
+# Jorge Stolfi | http://www.dcc.unicamp.br/~stolfi | stolfi@dcc.unicamp.br 
+# Institute of Computing (formerly DCC-IMECC)      | Wrk +55 (19)3788-5858
+# Universidade Estadual de Campinas (UNICAMP)      |     +55 (19)3788-5840
+# Av. Albert Einstein 1251 - Caixa Postal 6176     | Fax +55 (19)3788-5847
+# 13083-970 Campinas, SP -- Brazil                 | Hom +55 (19)3287-4069                 
+# ------------------------------------------------------------------------
+# 
+# _______________________________________________
+# Bug-gnu-utils mailing list
+# Bug-gnu-utils@gnu.org
+# http://mail.gnu.org/mailman/listinfo/bug-gnu-utils
+# 
+# 
diff --git a/gawk-5.0.1/test/rebt8b1.ok b/gawk-5.0.1/test/rebt8b1.ok
new file mode 100644
index 00000000000..5b8a00907e7
--- /dev/null
+++ b/gawk-5.0.1/test/rebt8b1.ok
@@ -0,0 +1,16 @@
+[an]*n    bANas ANd ANases iAN cAN
+[an�]*n   bANas ANd ANases iAN cAN
+
+[a�]*n    bANANas ANd ANANases iAN cANAN
+
+[an]n     bANANas ANd ANANases in cANaAN
+[a�]n     bANANas ANd ANANases in cANaAN
+[an�]n    bANANas ANd ANANases in cANaAN
+
+[an]?n    bANANas ANd ANANases iAN cANaAN
+[a�]?n    bANANas ANd ANANases iAN cANaAN
+[an�]?n   bANANas ANd ANANases iAN cANaAN
+
+[an]+n    bANas ANd ANases in cAN
+[a�]+n    bANANas ANd ANANases in cANAN
+[an�]+n   bANas ANd ANases in cAN
diff --git a/gawk-5.0.1/test/rebt8b2.awk b/gawk-5.0.1/test/rebt8b2.awk
new file mode 100644
index 00000000000..4cb8373cd3e
--- /dev/null
+++ b/gawk-5.0.1/test/rebt8b2.awk
@@ -0,0 +1,88 @@
+#From stolfi@ic.unicamp.br  Sun Jan 28 19:02:09 2001
+#Received: from mail.actcom.co.il [192.114.47.13]
+#	by localhost with POP3 (fetchmail-5.5.0)
+#	for arnold@localhost (single-drop); Sun, 28 Jan 2001 19:02:09 +0200 (IST)
+#Received: by actcom.co.il (mbox arobbins)
+# (with Cubic Circle's cucipop (v1.31 1998/05/13) Sun Jan 28 19:03:34 2001)
+#X-From_: stolfi@ic.unicamp.br Sun Jan 28 18:46:02 2001
+#Received: from lmail.actcom.co.il by actcom.co.il  with ESMTP
+#	(8.9.1a/actcom-0.2) id SAA22932 for <arobbins@actcom.co.il>;
+#	Sun, 28 Jan 2001 18:46:00 +0200 (EET)  
+#	(rfc931-sender: lmail.actcom.co.il [192.114.47.13])
+#Received: from billohost.com (www.billohost.com [209.196.35.10])
+#	by lmail.actcom.co.il (8.9.3/8.9.1) with ESMTP id SAA18523
+#	for <arobbins@actcom.co.il>; Sun, 28 Jan 2001 18:46:35 +0200
+#Received: from grande.dcc.unicamp.br (grande.dcc.unicamp.br [143.106.7.8])
+#	by billohost.com (8.9.3/8.9.3) with ESMTP id LAA20063
+#	for <arnold@skeeve.com>; Sun, 28 Jan 2001 11:45:54 -0500
+#Received: from amazonas.dcc.unicamp.br (amazonas.dcc.unicamp.br [143.106.7.11])
+#	by grande.dcc.unicamp.br (8.9.3/8.9.3) with ESMTP id OAA29726;
+#	Sun, 28 Jan 2001 14:45:47 -0200 (EDT)
+#Received: from coruja.dcc.unicamp.br (coruja.dcc.unicamp.br [143.106.24.80])
+#	by amazonas.dcc.unicamp.br (8.8.5/8.8.5) with ESMTP id OAA06542;
+#	Sun, 28 Jan 2001 14:45:45 -0200 (EDT)
+#Received: (from stolfi@localhost)
+#	by coruja.dcc.unicamp.br (8.11.0/8.11.0) id f0SGjib16703;
+#	Sun, 28 Jan 2001 14:45:44 -0200 (EDT)
+#Date: Sun, 28 Jan 2001 14:45:44 -0200 (EDT)
+#Message-Id: <200101281645.f0SGjib16703@coruja.dcc.unicamp.br>
+#From: Jorge Stolfi <stolfi@ic.unicamp.br>
+#To: Michal Jaegermann <michal@ellpspace.math.ualberta.ca>
+#Cc: Aharon Robbins <arnold@skeeve.com>, oliva@ic.unicamp.br,
+#        celio@ic.unicamp.br, ducatte@ic.unicamp.br, machado@ic.unicamp.br
+#Subject: Re: a regex.c problem
+#MIME-Version: 1.0
+#Content-Transfer-Encoding: 8bit
+#Content-Type: text/plain; charset=iso-8859-1
+#In-Reply-To: <20010128090314.A5820@ellpspace.math.ualberta.ca>
+#References: <200101281207.f0SC7Un08435@skeeve.com>
+#	<20010128090314.A5820@ellpspace.math.ualberta.ca>
+#Reply-To: stolfi@ic.unicamp.br
+#Status: RO
+#
+#
+#    > [Michal] Are there any other examples of "certain characters"
+#    > which would throw this regex engine off?
+#
+#I now tested [anX]*n for X ranging trough all characters from \000 and
+#\377, and got that unexpected result only for the following ones:
+#
+#  \370 | =F8 | � | Small o, slash
+#  \371 | =F9 | � | Small u, grave accent
+#  \372 | =FA | � | Small u, acute accent
+#  \373 | =FB | � | Small u, circumflex accent
+#  \374 | =FC | � | Small u, dieresis or umlaut mark
+#  \375 | =FD | � | Small y, acute accent
+#  \376 | =FE | � | Small thorn, Icelandic
+#  \377 | =FF | � | Small y, dieresis or umlaut mark 
+#
+#I have also tried those offending REs from inside emacs (20.7.1), with
+#query-replace-regexp, and it seems to be working fine. So presumably
+#the bug lies in gawk itself, or in the RE parsing code, rather than in
+#the matching engine?
+#
+#Could it be an underdimensioned table somewhere?
+#
+#Thanks for the help, and all the best
+#
+#--stolfi
+#
+#  ----------------------------------------------------------------------
+  #! /usr/bin/gawk -f
+
+  BEGIN {
+    for (c = 0; c < 256; c++) 
+      { do_test(c); }
+  }
+
+  function do_test(char,   pat,s,t)
+  {
+    if (char == 92) { printf "(error for \\%03o)\n", char; return; }
+    pat = sprintf("[an\\%03o]*n", char);
+    s = "bananas and ananases in canaan";
+    t = s; gsub(pat, "AN", t);        printf "%-8s  %s\n", pat, t;
+# ADR: Added:
+    if (s ~ pat) printf "\tmatch\n" ; else printf "\tno-match\n"
+  }
+
+#  ----------------------------------------------------------------------
diff --git a/gawk-5.0.1/test/rebt8b2.ok b/gawk-5.0.1/test/rebt8b2.ok
new file mode 100644
index 00000000000..661109c0f86
--- /dev/null
+++ b/gawk-5.0.1/test/rebt8b2.ok
@@ -0,0 +1,511 @@
+[an\000]*n  bANas ANd ANases iAN cAN
+	match
+[an\001]*n  bANas ANd ANases iAN cAN
+	match
+[an\002]*n  bANas ANd ANases iAN cAN
+	match
+[an\003]*n  bANas ANd ANases iAN cAN
+	match
+[an\004]*n  bANas ANd ANases iAN cAN
+	match
+[an\005]*n  bANas ANd ANases iAN cAN
+	match
+[an\006]*n  bANas ANd ANases iAN cAN
+	match
+[an\007]*n  bANas ANd ANases iAN cAN
+	match
+[an\010]*n  bANas ANd ANases iAN cAN
+	match
+[an\011]*n  bANas ANd ANases iAN cAN
+	match
+[an\012]*n  bANas ANd ANases iAN cAN
+	match
+[an\013]*n  bANas ANd ANases iAN cAN
+	match
+[an\014]*n  bANas ANd ANases iAN cAN
+	match
+[an\015]*n  bANas ANd ANases iAN cAN
+	match
+[an\016]*n  bANas ANd ANases iAN cAN
+	match
+[an\017]*n  bANas ANd ANases iAN cAN
+	match
+[an\020]*n  bANas ANd ANases iAN cAN
+	match
+[an\021]*n  bANas ANd ANases iAN cAN
+	match
+[an\022]*n  bANas ANd ANases iAN cAN
+	match
+[an\023]*n  bANas ANd ANases iAN cAN
+	match
+[an\024]*n  bANas ANd ANases iAN cAN
+	match
+[an\025]*n  bANas ANd ANases iAN cAN
+	match
+[an\026]*n  bANas ANd ANases iAN cAN
+	match
+[an\027]*n  bANas ANd ANases iAN cAN
+	match
+[an\030]*n  bANas ANd ANases iAN cAN
+	match
+[an\031]*n  bANas ANd ANases iAN cAN
+	match
+[an\032]*n  bANas ANd ANases iAN cAN
+	match
+[an\033]*n  bANas ANd ANases iAN cAN
+	match
+[an\034]*n  bANas ANd ANases iAN cAN
+	match
+[an\035]*n  bANas ANd ANases iAN cAN
+	match
+[an\036]*n  bANas ANd ANases iAN cAN
+	match
+[an\037]*n  bANas ANd ANases iAN cAN
+	match
+[an\040]*n  bANasANdANases iAN cAN
+	match
+[an\041]*n  bANas ANd ANases iAN cAN
+	match
+[an\042]*n  bANas ANd ANases iAN cAN
+	match
+[an\043]*n  bANas ANd ANases iAN cAN
+	match
+[an\044]*n  bANas ANd ANases iAN cAN
+	match
+[an\045]*n  bANas ANd ANases iAN cAN
+	match
+[an\046]*n  bANas ANd ANases iAN cAN
+	match
+[an\047]*n  bANas ANd ANases iAN cAN
+	match
+[an\050]*n  bANas ANd ANases iAN cAN
+	match
+[an\051]*n  bANas ANd ANases iAN cAN
+	match
+[an\052]*n  bANas ANd ANases iAN cAN
+	match
+[an\053]*n  bANas ANd ANases iAN cAN
+	match
+[an\054]*n  bANas ANd ANases iAN cAN
+	match
+[an\055]*n  bANas ANd ANases iAN cAN
+	match
+[an\056]*n  bANas ANd ANases iAN cAN
+	match
+[an\057]*n  bANas ANd ANases iAN cAN
+	match
+[an\060]*n  bANas ANd ANases iAN cAN
+	match
+[an\061]*n  bANas ANd ANases iAN cAN
+	match
+[an\062]*n  bANas ANd ANases iAN cAN
+	match
+[an\063]*n  bANas ANd ANases iAN cAN
+	match
+[an\064]*n  bANas ANd ANases iAN cAN
+	match
+[an\065]*n  bANas ANd ANases iAN cAN
+	match
+[an\066]*n  bANas ANd ANases iAN cAN
+	match
+[an\067]*n  bANas ANd ANases iAN cAN
+	match
+[an\070]*n  bANas ANd ANases iAN cAN
+	match
+[an\071]*n  bANas ANd ANases iAN cAN
+	match
+[an\072]*n  bANas ANd ANases iAN cAN
+	match
+[an\073]*n  bANas ANd ANases iAN cAN
+	match
+[an\074]*n  bANas ANd ANases iAN cAN
+	match
+[an\075]*n  bANas ANd ANases iAN cAN
+	match
+[an\076]*n  bANas ANd ANases iAN cAN
+	match
+[an\077]*n  bANas ANd ANases iAN cAN
+	match
+[an\100]*n  bANas ANd ANases iAN cAN
+	match
+[an\101]*n  bANas ANd ANases iAN cAN
+	match
+[an\102]*n  bANas ANd ANases iAN cAN
+	match
+[an\103]*n  bANas ANd ANases iAN cAN
+	match
+[an\104]*n  bANas ANd ANases iAN cAN
+	match
+[an\105]*n  bANas ANd ANases iAN cAN
+	match
+[an\106]*n  bANas ANd ANases iAN cAN
+	match
+[an\107]*n  bANas ANd ANases iAN cAN
+	match
+[an\110]*n  bANas ANd ANases iAN cAN
+	match
+[an\111]*n  bANas ANd ANases iAN cAN
+	match
+[an\112]*n  bANas ANd ANases iAN cAN
+	match
+[an\113]*n  bANas ANd ANases iAN cAN
+	match
+[an\114]*n  bANas ANd ANases iAN cAN
+	match
+[an\115]*n  bANas ANd ANases iAN cAN
+	match
+[an\116]*n  bANas ANd ANases iAN cAN
+	match
+[an\117]*n  bANas ANd ANases iAN cAN
+	match
+[an\120]*n  bANas ANd ANases iAN cAN
+	match
+[an\121]*n  bANas ANd ANases iAN cAN
+	match
+[an\122]*n  bANas ANd ANases iAN cAN
+	match
+[an\123]*n  bANas ANd ANases iAN cAN
+	match
+[an\124]*n  bANas ANd ANases iAN cAN
+	match
+[an\125]*n  bANas ANd ANases iAN cAN
+	match
+[an\126]*n  bANas ANd ANases iAN cAN
+	match
+[an\127]*n  bANas ANd ANases iAN cAN
+	match
+[an\130]*n  bANas ANd ANases iAN cAN
+	match
+[an\131]*n  bANas ANd ANases iAN cAN
+	match
+[an\132]*n  bANas ANd ANases iAN cAN
+	match
+[an\133]*n  bANas ANd ANases iAN cAN
+	match
+(error for \134)
+[an\135]*n  bANANas ANd ANANases in cANaAN
+	match
+[an\136]*n  bANas ANd ANases iAN cAN
+	match
+[an\137]*n  bANas ANd ANases iAN cAN
+	match
+[an\140]*n  bANas ANd ANases iAN cAN
+	match
+[an\141]*n  bANas ANd ANases iAN cAN
+	match
+[an\142]*n  ANas ANd ANases iAN cAN
+	match
+[an\143]*n  bANas ANd ANases iAN AN
+	match
+[an\144]*n  bANas ANd ANases iAN cAN
+	match
+[an\145]*n  bANas ANd ANases iAN cAN
+	match
+[an\146]*n  bANas ANd ANases iAN cAN
+	match
+[an\147]*n  bANas ANd ANases iAN cAN
+	match
+[an\150]*n  bANas ANd ANases iAN cAN
+	match
+[an\151]*n  bANas ANd ANases AN cAN
+	match
+[an\152]*n  bANas ANd ANases iAN cAN
+	match
+[an\153]*n  bANas ANd ANases iAN cAN
+	match
+[an\154]*n  bANas ANd ANases iAN cAN
+	match
+[an\155]*n  bANas ANd ANases iAN cAN
+	match
+[an\156]*n  bANas ANd ANases iAN cAN
+	match
+[an\157]*n  bANas ANd ANases iAN cAN
+	match
+[an\160]*n  bANas ANd ANases iAN cAN
+	match
+[an\161]*n  bANas ANd ANases iAN cAN
+	match
+[an\162]*n  bANas ANd ANases iAN cAN
+	match
+[an\163]*n  bANas ANd ANases iAN cAN
+	match
+[an\164]*n  bANas ANd ANases iAN cAN
+	match
+[an\165]*n  bANas ANd ANases iAN cAN
+	match
+[an\166]*n  bANas ANd ANases iAN cAN
+	match
+[an\167]*n  bANas ANd ANases iAN cAN
+	match
+[an\170]*n  bANas ANd ANases iAN cAN
+	match
+[an\171]*n  bANas ANd ANases iAN cAN
+	match
+[an\172]*n  bANas ANd ANases iAN cAN
+	match
+[an\173]*n  bANas ANd ANases iAN cAN
+	match
+[an\174]*n  bANas ANd ANases iAN cAN
+	match
+[an\175]*n  bANas ANd ANases iAN cAN
+	match
+[an\176]*n  bANas ANd ANases iAN cAN
+	match
+[an\177]*n  bANas ANd ANases iAN cAN
+	match
+[an\200]*n  bANas ANd ANases iAN cAN
+	match
+[an\201]*n  bANas ANd ANases iAN cAN
+	match
+[an\202]*n  bANas ANd ANases iAN cAN
+	match
+[an\203]*n  bANas ANd ANases iAN cAN
+	match
+[an\204]*n  bANas ANd ANases iAN cAN
+	match
+[an\205]*n  bANas ANd ANases iAN cAN
+	match
+[an\206]*n  bANas ANd ANases iAN cAN
+	match
+[an\207]*n  bANas ANd ANases iAN cAN
+	match
+[an\210]*n  bANas ANd ANases iAN cAN
+	match
+[an\211]*n  bANas ANd ANases iAN cAN
+	match
+[an\212]*n  bANas ANd ANases iAN cAN
+	match
+[an\213]*n  bANas ANd ANases iAN cAN
+	match
+[an\214]*n  bANas ANd ANases iAN cAN
+	match
+[an\215]*n  bANas ANd ANases iAN cAN
+	match
+[an\216]*n  bANas ANd ANases iAN cAN
+	match
+[an\217]*n  bANas ANd ANases iAN cAN
+	match
+[an\220]*n  bANas ANd ANases iAN cAN
+	match
+[an\221]*n  bANas ANd ANases iAN cAN
+	match
+[an\222]*n  bANas ANd ANases iAN cAN
+	match
+[an\223]*n  bANas ANd ANases iAN cAN
+	match
+[an\224]*n  bANas ANd ANases iAN cAN
+	match
+[an\225]*n  bANas ANd ANases iAN cAN
+	match
+[an\226]*n  bANas ANd ANases iAN cAN
+	match
+[an\227]*n  bANas ANd ANases iAN cAN
+	match
+[an\230]*n  bANas ANd ANases iAN cAN
+	match
+[an\231]*n  bANas ANd ANases iAN cAN
+	match
+[an\232]*n  bANas ANd ANases iAN cAN
+	match
+[an\233]*n  bANas ANd ANases iAN cAN
+	match
+[an\234]*n  bANas ANd ANases iAN cAN
+	match
+[an\235]*n  bANas ANd ANases iAN cAN
+	match
+[an\236]*n  bANas ANd ANases iAN cAN
+	match
+[an\237]*n  bANas ANd ANases iAN cAN
+	match
+[an\240]*n  bANas ANd ANases iAN cAN
+	match
+[an\241]*n  bANas ANd ANases iAN cAN
+	match
+[an\242]*n  bANas ANd ANases iAN cAN
+	match
+[an\243]*n  bANas ANd ANases iAN cAN
+	match
+[an\244]*n  bANas ANd ANases iAN cAN
+	match
+[an\245]*n  bANas ANd ANases iAN cAN
+	match
+[an\246]*n  bANas ANd ANases iAN cAN
+	match
+[an\247]*n  bANas ANd ANases iAN cAN
+	match
+[an\250]*n  bANas ANd ANases iAN cAN
+	match
+[an\251]*n  bANas ANd ANases iAN cAN
+	match
+[an\252]*n  bANas ANd ANases iAN cAN
+	match
+[an\253]*n  bANas ANd ANases iAN cAN
+	match
+[an\254]*n  bANas ANd ANases iAN cAN
+	match
+[an\255]*n  bANas ANd ANases iAN cAN
+	match
+[an\256]*n  bANas ANd ANases iAN cAN
+	match
+[an\257]*n  bANas ANd ANases iAN cAN
+	match
+[an\260]*n  bANas ANd ANases iAN cAN
+	match
+[an\261]*n  bANas ANd ANases iAN cAN
+	match
+[an\262]*n  bANas ANd ANases iAN cAN
+	match
+[an\263]*n  bANas ANd ANases iAN cAN
+	match
+[an\264]*n  bANas ANd ANases iAN cAN
+	match
+[an\265]*n  bANas ANd ANases iAN cAN
+	match
+[an\266]*n  bANas ANd ANases iAN cAN
+	match
+[an\267]*n  bANas ANd ANases iAN cAN
+	match
+[an\270]*n  bANas ANd ANases iAN cAN
+	match
+[an\271]*n  bANas ANd ANases iAN cAN
+	match
+[an\272]*n  bANas ANd ANases iAN cAN
+	match
+[an\273]*n  bANas ANd ANases iAN cAN
+	match
+[an\274]*n  bANas ANd ANases iAN cAN
+	match
+[an\275]*n  bANas ANd ANases iAN cAN
+	match
+[an\276]*n  bANas ANd ANases iAN cAN
+	match
+[an\277]*n  bANas ANd ANases iAN cAN
+	match
+[an\300]*n  bANas ANd ANases iAN cAN
+	match
+[an\301]*n  bANas ANd ANases iAN cAN
+	match
+[an\302]*n  bANas ANd ANases iAN cAN
+	match
+[an\303]*n  bANas ANd ANases iAN cAN
+	match
+[an\304]*n  bANas ANd ANases iAN cAN
+	match
+[an\305]*n  bANas ANd ANases iAN cAN
+	match
+[an\306]*n  bANas ANd ANases iAN cAN
+	match
+[an\307]*n  bANas ANd ANases iAN cAN
+	match
+[an\310]*n  bANas ANd ANases iAN cAN
+	match
+[an\311]*n  bANas ANd ANases iAN cAN
+	match
+[an\312]*n  bANas ANd ANases iAN cAN
+	match
+[an\313]*n  bANas ANd ANases iAN cAN
+	match
+[an\314]*n  bANas ANd ANases iAN cAN
+	match
+[an\315]*n  bANas ANd ANases iAN cAN
+	match
+[an\316]*n  bANas ANd ANases iAN cAN
+	match
+[an\317]*n  bANas ANd ANases iAN cAN
+	match
+[an\320]*n  bANas ANd ANases iAN cAN
+	match
+[an\321]*n  bANas ANd ANases iAN cAN
+	match
+[an\322]*n  bANas ANd ANases iAN cAN
+	match
+[an\323]*n  bANas ANd ANases iAN cAN
+	match
+[an\324]*n  bANas ANd ANases iAN cAN
+	match
+[an\325]*n  bANas ANd ANases iAN cAN
+	match
+[an\326]*n  bANas ANd ANases iAN cAN
+	match
+[an\327]*n  bANas ANd ANases iAN cAN
+	match
+[an\330]*n  bANas ANd ANases iAN cAN
+	match
+[an\331]*n  bANas ANd ANases iAN cAN
+	match
+[an\332]*n  bANas ANd ANases iAN cAN
+	match
+[an\333]*n  bANas ANd ANases iAN cAN
+	match
+[an\334]*n  bANas ANd ANases iAN cAN
+	match
+[an\335]*n  bANas ANd ANases iAN cAN
+	match
+[an\336]*n  bANas ANd ANases iAN cAN
+	match
+[an\337]*n  bANas ANd ANases iAN cAN
+	match
+[an\340]*n  bANas ANd ANases iAN cAN
+	match
+[an\341]*n  bANas ANd ANases iAN cAN
+	match
+[an\342]*n  bANas ANd ANases iAN cAN
+	match
+[an\343]*n  bANas ANd ANases iAN cAN
+	match
+[an\344]*n  bANas ANd ANases iAN cAN
+	match
+[an\345]*n  bANas ANd ANases iAN cAN
+	match
+[an\346]*n  bANas ANd ANases iAN cAN
+	match
+[an\347]*n  bANas ANd ANases iAN cAN
+	match
+[an\350]*n  bANas ANd ANases iAN cAN
+	match
+[an\351]*n  bANas ANd ANases iAN cAN
+	match
+[an\352]*n  bANas ANd ANases iAN cAN
+	match
+[an\353]*n  bANas ANd ANases iAN cAN
+	match
+[an\354]*n  bANas ANd ANases iAN cAN
+	match
+[an\355]*n  bANas ANd ANases iAN cAN
+	match
+[an\356]*n  bANas ANd ANases iAN cAN
+	match
+[an\357]*n  bANas ANd ANases iAN cAN
+	match
+[an\360]*n  bANas ANd ANases iAN cAN
+	match
+[an\361]*n  bANas ANd ANases iAN cAN
+	match
+[an\362]*n  bANas ANd ANases iAN cAN
+	match
+[an\363]*n  bANas ANd ANases iAN cAN
+	match
+[an\364]*n  bANas ANd ANases iAN cAN
+	match
+[an\365]*n  bANas ANd ANases iAN cAN
+	match
+[an\366]*n  bANas ANd ANases iAN cAN
+	match
+[an\367]*n  bANas ANd ANases iAN cAN
+	match
+[an\370]*n  bANas ANd ANases iAN cAN
+	match
+[an\371]*n  bANas ANd ANases iAN cAN
+	match
+[an\372]*n  bANas ANd ANases iAN cAN
+	match
+[an\373]*n  bANas ANd ANases iAN cAN
+	match
+[an\374]*n  bANas ANd ANases iAN cAN
+	match
+[an\375]*n  bANas ANd ANases iAN cAN
+	match
+[an\376]*n  bANas ANd ANases iAN cAN
+	match
+[an\377]*n  bANas ANd ANases iAN cAN
+	match
diff --git a/gawk-5.0.1/test/rebuf.awk b/gawk-5.0.1/test/rebuf.awk
new file mode 100644
index 00000000000..69b5f05770a
--- /dev/null
+++ b/gawk-5.0.1/test/rebuf.awk
@@ -0,0 +1,73 @@
+# From lole@epost.de Wed Sep  4 09:54:19 IDT 2002
+# Article: 14288 of comp.lang.awk
+# Path: iad-read.news.verio.net!dfw-artgen!iad-peer.news.verio.net!news.verio.net!news.maxwell.syr.edu!fu-berlin.de!uni-berlin.de!213.70.124.113!not-for-mail
+# From: LorenzAtWork <familie.lenhardt@epost.de>
+# Newsgroups: comp.lang.awk
+# Subject: bug in gawk 3.1.1?
+# Date: Wed, 28 Aug 2002 10:34:50 +0200
+# Lines: 45
+# Message-ID: <7g1pmukv07c56ep3qav3uebnipdaohqh2l@4ax.com>
+# Reply-To: lole@epost.de
+# NNTP-Posting-Host: 213.70.124.113
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# Content-Transfer-Encoding: 7bit
+# X-Trace: fu-berlin.de 1030523788 53278293 213.70.124.113 (16 [68559])
+# X-Newsreader: Forte Agent 1.91/32.564
+# Xref: dfw-artgen comp.lang.awk:14288
+# 
+# hello all,
+# 
+# I'm using the following script
+# 
+BEGIN {
+	RS="ti1\n(dwv,)?"
+	s = 0
+	i = 0
+}
+{
+	if ($1 != "")
+		s = $1
+	print ++i, s
+}
+# 
+# to extract values from a file of the form
+# 
+# ti1
+# dwv,98.22
+# ti1
+# dwv,103.08
+# ti1
+# ti1
+# dwv,196.25
+# ti1
+# dwv,210.62
+# ti1
+# dwv,223.53
+# 
+# The desired result for this example looks like
+# 
+# 1 0
+# 2 98.22
+# 3 103.08
+# 4 103.08
+# 5 196.25
+# 6 210.62
+# 7 223.53
+# 
+# The script work fine the most time, but when run on the attached file
+# (sorry for the size, but the error would not appear with less data) I
+# get some (three with the attached file) lines that look like
+# 
+# 1262 dwv,212.97
+# 1277 dwv,174.33
+# 1279 dwv,151.79
+# 
+# I can't think of a other reason for this than a bug in gawk!
+# 
+# I'm running gawk 3.1.1 on winnt 4.0
+# 
+# best regards
+#      Lorenz
+# 
+# 
diff --git a/gawk-5.0.1/test/rebuf.in b/gawk-5.0.1/test/rebuf.in
new file mode 100644
index 00000000000..46d22107769
--- /dev/null
+++ b/gawk-5.0.1/test/rebuf.in
@@ -0,0 +1,2350 @@
+ti1
+dwv,214.59
+ti1
+dwv,230.31
+ti1
+dwv,242.64
+ti1
+dwv,253.94
+ti1
+dwv,264.33
+ti1
+dwv,270.94
+ti1
+dwv,273.52
+ti1
+dwv,270.08
+ti1
+dwv,263.19
+ti1
+dwv,254.45
+ti1
+dwv,244.91
+ti1
+dwv,234.55
+ti1
+dwv,222.49
+ti1
+dwv,209.94
+ti1
+dwv,197.17
+ti1
+dwv,182.89
+ti1
+dwv,169.76
+ti1
+dwv,158.59
+ti1
+dwv,145.37
+ti1
+dwv,135.46
+ti1
+dwv,124.77
+ti1
+dwv,115.98
+ti1
+dwv,108.77
+ti1
+dwv,101.12
+ti1
+dwv,94.45
+ti1
+dwv,89.08
+ti1
+dwv,84.63
+ti1
+dwv,81.05
+ti1
+dwv,78.93
+ti1
+dwv,76.65
+ti1
+dwv,75.59
+ti1
+ti1
+ti1
+dwv,77.47
+ti1
+dwv,80.17
+ti1
+dwv,83.90
+ti1
+dwv,88.56
+ti1
+dwv,95.69
+ti1
+dwv,97.48
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,203.08
+ti1
+dwv,218.22
+ti1
+dwv,229.37
+ti1
+dwv,238.49
+ti1
+dwv,247.43
+ti1
+dwv,255.22
+ti1
+dwv,261.31
+ti1
+dwv,262.36
+ti1
+dwv,260.66
+ti1
+dwv,256.33
+ti1
+dwv,249.34
+ti1
+dwv,240.03
+ti1
+dwv,228.55
+ti1
+dwv,215.42
+ti1
+dwv,203.37
+ti1
+dwv,190.01
+ti1
+dwv,177.81
+ti1
+dwv,165.44
+ti1
+dwv,152.92
+ti1
+dwv,142.03
+ti1
+dwv,132.91
+ti1
+dwv,124.48
+ti1
+dwv,116.45
+ti1
+dwv,109.06
+ti1
+dwv,103.27
+ti1
+dwv,98.87
+ti1
+dwv,94.95
+ti1
+dwv,92.56
+ti1
+dwv,90.47
+ti1
+dwv,89.48
+ti1
+ti1
+dwv,90.53
+ti1
+dwv,93.07
+ti1
+dwv,97.12
+ti1
+dwv,101.82
+ti1
+dwv,108.18
+ti1
+dwv,109.73
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,202.97
+ti1
+dwv,217.38
+ti1
+dwv,231.73
+ti1
+dwv,243.11
+ti1
+dwv,255.37
+ti1
+dwv,264.12
+ti1
+dwv,269.64
+ti1
+dwv,270.98
+ti1
+dwv,269.65
+ti1
+dwv,264.55
+ti1
+dwv,257.16
+ti1
+dwv,246.01
+ti1
+dwv,232.88
+ti1
+dwv,219.85
+ti1
+dwv,208.79
+ti1
+dwv,197.00
+ti1
+dwv,183.93
+ti1
+dwv,172.00
+ti1
+dwv,160.55
+ti1
+dwv,150.59
+ti1
+dwv,141.47
+ti1
+dwv,133.02
+ti1
+dwv,126.21
+ti1
+dwv,120.64
+ti1
+dwv,115.79
+ti1
+dwv,111.62
+ti1
+dwv,108.41
+ti1
+dwv,106.41
+ti1
+ti1
+ti1
+dwv,109.08
+ti1
+dwv,113.23
+ti1
+dwv,118.57
+ti1
+dwv,122.57
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,208.07
+ti1
+dwv,224.14
+ti1
+dwv,236.28
+ti1
+dwv,248.12
+ti1
+dwv,258.97
+ti1
+dwv,267.74
+ti1
+dwv,272.47
+ti1
+dwv,271.52
+ti1
+dwv,266.80
+ti1
+dwv,258.61
+ti1
+dwv,249.30
+ti1
+dwv,239.19
+ti1
+dwv,228.28
+ti1
+dwv,215.79
+ti1
+dwv,203.86
+ti1
+dwv,190.08
+ti1
+dwv,177.40
+ti1
+dwv,163.81
+ti1
+dwv,152.60
+ti1
+dwv,141.33
+ti1
+dwv,130.98
+ti1
+dwv,121.98
+ti1
+dwv,114.08
+ti1
+dwv,106.61
+ti1
+dwv,99.75
+ti1
+dwv,93.10
+ti1
+dwv,86.57
+ti1
+dwv,80.62
+ti1
+dwv,76.05
+ti1
+dwv,71.52
+ti1
+dwv,68.85
+ti1
+dwv,67.46
+ti1
+dwv,66.86
+ti1
+dwv,67.51
+ti1
+dwv,69.75
+ti1
+dwv,72.85
+ti1
+dwv,76.23
+ti1
+dwv,82.85
+ti1
+dwv,89.33
+ti1
+dwv,93.39
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,188.37
+ti1
+dwv,204.42
+ti1
+dwv,217.16
+ti1
+dwv,228.89
+ti1
+dwv,238.83
+ti1
+dwv,247.70
+ti1
+dwv,253.59
+ti1
+dwv,257.17
+ti1
+ti1
+dwv,254.00
+ti1
+dwv,248.24
+ti1
+dwv,240.14
+ti1
+dwv,229.42
+ti1
+dwv,218.97
+ti1
+dwv,205.09
+ti1
+dwv,192.61
+ti1
+dwv,179.74
+ti1
+dwv,166.76
+ti1
+dwv,155.36
+ti1
+dwv,143.58
+ti1
+dwv,131.40
+ti1
+dwv,121.84
+ti1
+dwv,112.46
+ti1
+dwv,105.41
+ti1
+dwv,97.15
+ti1
+dwv,90.09
+ti1
+dwv,84.79
+ti1
+dwv,80.52
+ti1
+dwv,75.58
+ti1
+dwv,72.59
+ti1
+dwv,69.39
+ti1
+dwv,67.51
+ti1
+dwv,66.42
+ti1
+ti1
+ti1
+dwv,67.82
+ti1
+dwv,69.76
+ti1
+dwv,73.19
+ti1
+dwv,77.35
+ti1
+dwv,82.36
+ti1
+dwv,87.82
+ti1
+dwv,93.30
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,190.58
+ti1
+dwv,203.43
+ti1
+dwv,216.48
+ti1
+dwv,228.89
+ti1
+dwv,241.91
+ti1
+dwv,251.60
+ti1
+dwv,257.78
+ti1
+dwv,262.18
+ti1
+dwv,263.13
+ti1
+dwv,260.91
+ti1
+dwv,255.34
+ti1
+dwv,247.17
+ti1
+dwv,236.85
+ti1
+dwv,225.24
+ti1
+dwv,213.39
+ti1
+dwv,201.46
+ti1
+dwv,187.77
+ti1
+dwv,175.31
+ti1
+dwv,162.95
+ti1
+dwv,152.55
+ti1
+dwv,142.56
+ti1
+dwv,132.94
+ti1
+dwv,125.00
+ti1
+dwv,117.69
+ti1
+dwv,110.96
+ti1
+dwv,105.02
+ti1
+dwv,101.78
+ti1
+dwv,98.48
+ti1
+dwv,97.06
+ti1
+dwv,96.50
+ti1
+ti1
+dwv,98.48
+ti1
+dwv,101.18
+ti1
+dwv,104.56
+ti1
+dwv,109.67
+ti1
+dwv,115.86
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,200.02
+ti1
+dwv,217.51
+ti1
+dwv,233.21
+ti1
+dwv,245.72
+ti1
+dwv,258.21
+ti1
+dwv,267.24
+ti1
+dwv,273.79
+ti1
+dwv,273.20
+ti1
+dwv,270.38
+ti1
+dwv,260.76
+ti1
+dwv,250.05
+ti1
+dwv,241.32
+ti1
+dwv,231.14
+ti1
+dwv,219.83
+ti1
+dwv,206.13
+ti1
+dwv,193.24
+ti1
+dwv,180.73
+ti1
+dwv,167.82
+ti1
+dwv,156.94
+ti1
+dwv,144.13
+ti1
+dwv,134.40
+ti1
+dwv,125.23
+ti1
+dwv,116.13
+ti1
+dwv,107.34
+ti1
+dwv,99.71
+ti1
+dwv,94.11
+ti1
+dwv,88.91
+ti1
+dwv,84.51
+ti1
+dwv,81.50
+ti1
+dwv,78.66
+ti1
+dwv,76.57
+ti1
+dwv,75.82
+ti1
+ti1
+dwv,76.88
+ti1
+dwv,79.03
+ti1
+dwv,82.12
+ti1
+dwv,85.73
+ti1
+dwv,91.05
+ti1
+dwv,96.31
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,184.18
+ti1
+dwv,201.10
+ti1
+dwv,214.21
+ti1
+dwv,226.18
+ti1
+dwv,237.72
+ti1
+dwv,247.57
+ti1
+dwv,254.36
+ti1
+dwv,258.34
+ti1
+dwv,259.80
+ti1
+dwv,257.76
+ti1
+dwv,253.17
+ti1
+dwv,246.51
+ti1
+dwv,237.92
+ti1
+dwv,227.09
+ti1
+dwv,214.13
+ti1
+dwv,202.20
+ti1
+dwv,189.21
+ti1
+dwv,177.65
+ti1
+dwv,166.18
+ti1
+dwv,154.03
+ti1
+dwv,142.21
+ti1
+dwv,131.51
+ti1
+dwv,121.28
+ti1
+dwv,111.80
+ti1
+dwv,104.47
+ti1
+dwv,98.80
+ti1
+dwv,94.76
+ti1
+dwv,91.81
+ti1
+dwv,89.17
+ti1
+dwv,88.00
+ti1
+ti1
+ti1
+dwv,89.20
+ti1
+dwv,91.17
+ti1
+dwv,94.35
+ti1
+dwv,99.00
+ti1
+dwv,105.43
+ti1
+dwv,109.34
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,194.84
+ti1
+dwv,212.05
+ti1
+dwv,226.30
+ti1
+dwv,239.03
+ti1
+dwv,250.94
+ti1
+dwv,259.73
+ti1
+dwv,266.64
+ti1
+dwv,269.67
+ti1
+dwv,269.03
+ti1
+dwv,265.03
+ti1
+dwv,258.23
+ti1
+dwv,249.32
+ti1
+dwv,238.03
+ti1
+dwv,226.20
+ti1
+dwv,213.46
+ti1
+dwv,200.53
+ti1
+dwv,187.65
+ti1
+dwv,174.89
+ti1
+dwv,163.22
+ti1
+dwv,152.47
+ti1
+dwv,142.65
+ti1
+dwv,133.97
+ti1
+dwv,126.59
+ti1
+dwv,120.52
+ti1
+dwv,115.57
+ti1
+dwv,111.49
+ti1
+dwv,108.03
+ti1
+dwv,106.01
+ti1
+dwv,105.28
+ti1
+ti1
+dwv,106.91
+ti1
+dwv,109.73
+ti1
+dwv,114.91
+ti1
+dwv,120.66
+ti1
+dwv,123.74
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,211.57
+ti1
+dwv,227.06
+ti1
+dwv,240.57
+ti1
+dwv,252.26
+ti1
+dwv,262.67
+ti1
+dwv,270.66
+ti1
+dwv,273.40
+ti1
+dwv,270.25
+ti1
+dwv,263.76
+ti1
+dwv,256.03
+ti1
+dwv,246.87
+ti1
+dwv,237.10
+ti1
+dwv,225.11
+ti1
+dwv,211.53
+ti1
+dwv,197.77
+ti1
+dwv,185.75
+ti1
+dwv,173.00
+ti1
+dwv,159.31
+ti1
+dwv,147.18
+ti1
+dwv,134.84
+ti1
+dwv,125.07
+ti1
+dwv,115.82
+ti1
+dwv,107.33
+ti1
+dwv,100.07
+ti1
+dwv,93.55
+ti1
+dwv,87.60
+ti1
+dwv,81.75
+ti1
+dwv,77.03
+ti1
+dwv,73.39
+ti1
+dwv,70.97
+ti1
+dwv,67.94
+ti1
+dwv,66.64
+ti1
+dwv,65.80
+ti1
+ti1
+dwv,66.85
+ti1
+dwv,68.78
+ti1
+dwv,71.47
+ti1
+dwv,74.20
+ti1
+dwv,78.68
+ti1
+dwv,85.08
+ti1
+dwv,87.47
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,185.81
+ti1
+dwv,201.66
+ti1
+dwv,215.07
+ti1
+dwv,227.26
+ti1
+dwv,238.00
+ti1
+dwv,247.64
+ti1
+dwv,255.03
+ti1
+dwv,257.12
+ti1
+dwv,256.17
+ti1
+dwv,253.47
+ti1
+dwv,248.93
+ti1
+dwv,241.39
+ti1
+dwv,231.45
+ti1
+dwv,220.49
+ti1
+dwv,208.48
+ti1
+dwv,196.04
+ti1
+dwv,182.73
+ti1
+dwv,169.40
+ti1
+dwv,157.24
+ti1
+dwv,145.56
+ti1
+dwv,133.54
+ti1
+dwv,124.01
+ti1
+dwv,114.55
+ti1
+dwv,105.75
+ti1
+dwv,98.32
+ti1
+dwv,91.91
+ti1
+dwv,86.08
+ti1
+dwv,81.35
+ti1
+dwv,77.78
+ti1
+dwv,73.85
+ti1
+dwv,71.12
+ti1
+dwv,68.53
+ti1
+dwv,67.09
+ti1
+dwv,66.34
+ti1
+ti1
+ti1
+dwv,67.92
+ti1
+dwv,70.08
+ti1
+dwv,73.78
+ti1
+dwv,78.68
+ti1
+dwv,84.33
+ti1
+dwv,90.25
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,183.19
+ti1
+dwv,198.96
+ti1
+dwv,213.55
+ti1
+dwv,225.91
+ti1
+dwv,237.33
+ti1
+dwv,246.66
+ti1
+dwv,254.98
+ti1
+dwv,259.46
+ti1
+dwv,261.02
+ti1
+dwv,260.02
+ti1
+dwv,255.96
+ti1
+dwv,249.08
+ti1
+dwv,240.15
+ti1
+dwv,229.51
+ti1
+dwv,217.21
+ti1
+dwv,205.06
+ti1
+dwv,192.62
+ti1
+dwv,177.43
+ti1
+dwv,165.06
+ti1
+dwv,152.36
+ti1
+dwv,142.35
+ti1
+dwv,134.58
+ti1
+dwv,126.20
+ti1
+dwv,119.86
+ti1
+dwv,113.67
+ti1
+dwv,108.20
+ti1
+dwv,104.71
+ti1
+dwv,100.83
+ti1
+dwv,98.96
+ti1
+dwv,98.38
+ti1
+ti1
+dwv,100.29
+ti1
+dwv,103.47
+ti1
+dwv,107.73
+ti1
+dwv,113.04
+ti1
+dwv,118.90
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,200.70
+ti1
+dwv,217.77
+ti1
+dwv,232.45
+ti1
+dwv,244.28
+ti1
+dwv,256.61
+ti1
+dwv,265.93
+ti1
+dwv,272.01
+ti1
+ti1
+dwv,268.67
+ti1
+dwv,260.53
+ti1
+dwv,252.09
+ti1
+dwv,243.72
+ti1
+dwv,232.68
+ti1
+dwv,220.49
+ti1
+dwv,206.88
+ti1
+dwv,193.98
+ti1
+dwv,181.33
+ti1
+dwv,168.61
+ti1
+dwv,156.50
+ti1
+dwv,145.54
+ti1
+dwv,136.43
+ti1
+dwv,125.95
+ti1
+dwv,117.26
+ti1
+dwv,109.81
+ti1
+dwv,103.36
+ti1
+dwv,97.15
+ti1
+dwv,92.86
+ti1
+dwv,89.02
+ti1
+dwv,86.39
+ti1
+dwv,84.44
+ti1
+dwv,83.72
+ti1
+ti1
+dwv,85.89
+ti1
+dwv,88.39
+ti1
+dwv,92.31
+ti1
+dwv,96.00
+ti1
+dwv,100.24
+ti1
+dwv,102.55
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,197.15
+ti1
+dwv,212.33
+ti1
+dwv,225.48
+ti1
+dwv,236.75
+ti1
+dwv,247.52
+ti1
+dwv,255.21
+ti1
+dwv,260.74
+ti1
+dwv,262.81
+ti1
+dwv,262.09
+ti1
+dwv,258.08
+ti1
+dwv,250.83
+ti1
+dwv,242.39
+ti1
+dwv,230.86
+ti1
+dwv,219.62
+ti1
+dwv,206.80
+ti1
+dwv,193.41
+ti1
+dwv,180.60
+ti1
+dwv,168.20
+ti1
+dwv,157.77
+ti1
+dwv,145.25
+ti1
+dwv,136.23
+ti1
+dwv,126.28
+ti1
+dwv,118.10
+ti1
+dwv,110.74
+ti1
+dwv,105.29
+ti1
+dwv,99.75
+ti1
+dwv,95.61
+ti1
+dwv,92.16
+ti1
+dwv,89.93
+ti1
+dwv,88.45
+ti1
+ti1
+dwv,89.11
+ti1
+dwv,90.87
+ti1
+dwv,94.21
+ti1
+dwv,98.16
+ti1
+dwv,104.24
+ti1
+dwv,108.98
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,195.81
+ti1
+dwv,211.95
+ti1
+dwv,226.36
+ti1
+dwv,240.61
+ti1
+dwv,251.93
+ti1
+dwv,259.13
+ti1
+dwv,265.36
+ti1
+dwv,269.71
+ti1
+dwv,270.27
+ti1
+dwv,266.44
+ti1
+dwv,260.44
+ti1
+dwv,251.94
+ti1
+dwv,240.79
+ti1
+dwv,228.95
+ti1
+dwv,215.90
+ti1
+dwv,203.25
+ti1
+dwv,190.01
+ti1
+dwv,177.92
+ti1
+dwv,165.60
+ti1
+dwv,155.49
+ti1
+dwv,144.32
+ti1
+dwv,136.07
+ti1
+dwv,127.64
+ti1
+dwv,120.28
+ti1
+dwv,114.57
+ti1
+dwv,109.99
+ti1
+dwv,106.36
+ti1
+dwv,104.49
+ti1
+dwv,103.84
+ti1
+ti1
+dwv,105.77
+ti1
+dwv,107.83
+ti1
+dwv,112.41
+ti1
+dwv,117.71
+ti1
+dwv,120.66
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,210.13
+ti1
+dwv,225.03
+ti1
+dwv,238.76
+ti1
+dwv,250.50
+ti1
+dwv,261.18
+ti1
+dwv,269.22
+ti1
+dwv,274.18
+ti1
+dwv,272.28
+ti1
+dwv,266.66
+ti1
+dwv,258.68
+ti1
+dwv,249.88
+ti1
+dwv,239.94
+ti1
+dwv,227.14
+ti1
+dwv,213.22
+ti1
+dwv,197.58
+ti1
+dwv,184.86
+ti1
+dwv,172.52
+ti1
+dwv,160.19
+ti1
+dwv,149.20
+ti1
+dwv,137.49
+ti1
+dwv,127.86
+ti1
+dwv,118.91
+ti1
+dwv,110.49
+ti1
+dwv,102.73
+ti1
+dwv,96.33
+ti1
+dwv,90.95
+ti1
+dwv,86.38
+ti1
+dwv,82.72
+ti1
+dwv,79.65
+ti1
+dwv,77.61
+ti1
+dwv,75.70
+ti1
+dwv,74.49
+ti1
+ti1
+ti1
+dwv,76.48
+ti1
+dwv,79.14
+ti1
+dwv,82.84
+ti1
+dwv,87.86
+ti1
+dwv,92.69
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,181.33
+ti1
+dwv,196.86
+ti1
+dwv,210.98
+ti1
+dwv,223.13
+ti1
+dwv,233.90
+ti1
+dwv,243.19
+ti1
+dwv,250.57
+ti1
+dwv,255.00
+ti1
+dwv,256.36
+ti1
+dwv,255.16
+ti1
+dwv,250.15
+ti1
+dwv,242.80
+ti1
+dwv,233.82
+ti1
+dwv,223.41
+ti1
+dwv,210.81
+ti1
+dwv,199.04
+ti1
+dwv,187.39
+ti1
+dwv,174.14
+ti1
+dwv,162.62
+ti1
+dwv,151.39
+ti1
+dwv,139.59
+ti1
+dwv,128.71
+ti1
+dwv,119.17
+ti1
+dwv,111.02
+ti1
+dwv,103.91
+ti1
+dwv,96.78
+ti1
+dwv,91.56
+ti1
+dwv,87.13
+ti1
+dwv,83.22
+ti1
+dwv,80.50
+ti1
+dwv,76.83
+ti1
+dwv,74.24
+ti1
+dwv,70.80
+ti1
+dwv,69.04
+ti1
+dwv,67.12
+ti1
+dwv,66.51
+ti1
+ti1
+dwv,68.77
+ti1
+dwv,72.19
+ti1
+dwv,77.34
+ti1
+dwv,84.04
+ti1
+dwv,88.55
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,190.51
+ti1
+dwv,207.14
+ti1
+dwv,220.57
+ti1
+dwv,232.51
+ti1
+dwv,243.35
+ti1
+dwv,252.41
+ti1
+dwv,258.62
+ti1
+dwv,262.18
+ti1
+ti1
+dwv,259.10
+ti1
+dwv,253.54
+ti1
+dwv,245.44
+ti1
+dwv,235.55
+ti1
+dwv,223.43
+ti1
+dwv,209.91
+ti1
+dwv,197.52
+ti1
+dwv,185.90
+ti1
+dwv,172.13
+ti1
+dwv,161.09
+ti1
+dwv,150.58
+ti1
+dwv,140.37
+ti1
+dwv,130.27
+ti1
+dwv,122.13
+ti1
+dwv,114.99
+ti1
+dwv,108.76
+ti1
+dwv,104.67
+ti1
+dwv,100.36
+ti1
+dwv,97.61
+ti1
+dwv,95.48
+ti1
+dwv,94.83
+ti1
+dwv,95.45
+ti1
+dwv,97.15
+ti1
+dwv,100.73
+ti1
+dwv,105.10
+ti1
+dwv,111.46
+ti1
+dwv,118.27
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,202.92
+ti1
+dwv,220.25
+ti1
+dwv,233.35
+ti1
+dwv,243.48
+ti1
+dwv,254.85
+ti1
+dwv,265.75
+ti1
+dwv,272.62
+ti1
+ti1
+dwv,269.36
+ti1
+dwv,261.82
+ti1
+dwv,252.85
+ti1
+dwv,244.08
+ti1
+dwv,232.96
+ti1
+dwv,219.59
+ti1
+dwv,207.32
+ti1
+dwv,193.87
+ti1
+dwv,181.77
+ti1
+dwv,168.60
+ti1
+dwv,155.76
+ti1
+dwv,144.03
+ti1
+dwv,134.07
+ti1
+dwv,123.46
+ti1
+dwv,114.47
+ti1
+dwv,107.64
+ti1
+dwv,100.46
+ti1
+dwv,94.53
+ti1
+dwv,89.28
+ti1
+dwv,84.59
+ti1
+dwv,80.96
+ti1
+dwv,78.54
+ti1
+dwv,76.28
+ti1
+dwv,75.51
+ti1
+ti1
+dwv,76.55
+ti1
+dwv,78.55
+ti1
+dwv,81.57
+ti1
+dwv,85.18
+ti1
+dwv,90.61
+ti1
+dwv,96.01
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,184.51
+ti1
+dwv,201.57
+ti1
+dwv,216.33
+ti1
+dwv,228.69
+ti1
+dwv,239.90
+ti1
+dwv,250.41
+ti1
+dwv,257.91
+ti1
+dwv,262.29
+ti1
+dwv,263.41
+ti1
+dwv,261.70
+ti1
+dwv,256.75
+ti1
+dwv,246.82
+ti1
+dwv,236.35
+ti1
+dwv,225.17
+ti1
+dwv,212.90
+ti1
+dwv,201.61
+ti1
+dwv,188.42
+ti1
+dwv,175.92
+ti1
+dwv,163.70
+ti1
+dwv,153.18
+ti1
+dwv,142.89
+ti1
+dwv,132.95
+ti1
+dwv,125.18
+ti1
+dwv,117.61
+ti1
+dwv,110.36
+ti1
+dwv,104.56
+ti1
+dwv,100.13
+ti1
+dwv,96.64
+ti1
+dwv,93.52
+ti1
+dwv,91.91
+ti1
+ti1
+ti1
+dwv,93.84
+ti1
+dwv,97.13
+ti1
+dwv,101.08
+ti1
+dwv,107.19
+ti1
+dwv,111.89
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,195.89
+ti1
+dwv,212.65
+ti1
+dwv,226.60
+ti1
+dwv,239.28
+ti1
+dwv,251.28
+ti1
+dwv,259.92
+ti1
+dwv,266.03
+ti1
+dwv,269.76
+ti1
+ti1
+dwv,265.55
+ti1
+dwv,258.92
+ti1
+dwv,250.42
+ti1
+dwv,240.04
+ti1
+dwv,229.03
+ti1
+dwv,216.69
+ti1
+dwv,204.21
+ti1
+dwv,191.25
+ti1
+dwv,178.40
+ti1
+dwv,168.31
+ti1
+dwv,157.47
+ti1
+dwv,148.62
+ti1
+dwv,139.12
+ti1
+dwv,129.54
+ti1
+dwv,121.65
+ti1
+dwv,114.59
+ti1
+dwv,109.30
+ti1
+dwv,106.39
+ti1
+dwv,104.71
+ti1
+ti1
+dwv,106.41
+ti1
+dwv,109.22
+ti1
+dwv,113.62
+ti1
+dwv,118.31
+ti1
+dwv,124.34
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,205.67
+ti1
+dwv,221.25
+ti1
+dwv,235.02
+ti1
+dwv,247.47
+ti1
+dwv,258.37
+ti1
+dwv,267.42
+ti1
+dwv,272.60
+ti1
+dwv,272.00
+ti1
+dwv,267.91
+ti1
+dwv,260.38
+ti1
+dwv,251.10
+ti1
+dwv,241.32
+ti1
+dwv,230.96
+ti1
+dwv,217.34
+ti1
+dwv,204.99
+ti1
+dwv,191.24
+ti1
+dwv,178.58
+ti1
+dwv,164.79
+ti1
+dwv,153.07
+ti1
+dwv,141.06
+ti1
+dwv,129.86
+ti1
+dwv,119.79
+ti1
+dwv,111.13
+ti1
+dwv,103.53
+ti1
+dwv,96.95
+ti1
+dwv,89.42
+ti1
+dwv,85.22
+ti1
+dwv,80.54
+ti1
+dwv,76.85
+ti1
+dwv,74.41
+ti1
+dwv,72.12
+ti1
+dwv,71.21
+ti1
+ti1
+ti1
+dwv,72.13
+ti1
+dwv,74.22
+ti1
+dwv,76.95
+ti1
+dwv,80.65
+ti1
+dwv,85.36
+ti1
+dwv,90.60
+ti1
+dwv,92.36
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,191.27
+ti1
+dwv,205.03
+ti1
+dwv,218.89
+ti1
+dwv,230.87
+ti1
+dwv,241.63
+ti1
+dwv,249.83
+ti1
+dwv,255.42
+ti1
+dwv,257.98
+ti1
+dwv,257.33
+ti1
+dwv,252.87
+ti1
+dwv,245.90
+ti1
+dwv,237.78
+ti1
+dwv,227.14
+ti1
+dwv,214.67
+ti1
+dwv,202.31
+ti1
+dwv,188.68
+ti1
+dwv,175.96
+ti1
+dwv,163.25
+ti1
+dwv,151.43
+ti1
+dwv,139.79
+ti1
+dwv,130.40
+ti1
+dwv,118.92
+ti1
+dwv,110.88
+ti1
+dwv,101.92
+ti1
+dwv,94.45
+ti1
+dwv,88.13
+ti1
+dwv,83.19
+ti1
+dwv,79.11
+ti1
+dwv,74.60
+ti1
+dwv,71.86
+ti1
+dwv,68.77
+ti1
+dwv,66.57
+ti1
+dwv,65.24
+ti1
+dwv,64.41
+ti1
+ti1
+dwv,64.92
+ti1
+dwv,66.62
+ti1
+dwv,68.93
+ti1
+dwv,72.77
+ti1
+dwv,77.76
+ti1
+dwv,83.41
+ti1
+dwv,89.19
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,182.68
+ti1
+dwv,199.88
+ti1
+dwv,214.62
+ti1
+dwv,227.29
+ti1
+dwv,238.62
+ti1
+dwv,249.01
+ti1
+dwv,256.68
+ti1
+dwv,262.71
+ti1
+dwv,263.44
+ti1
+dwv,259.87
+ti1
+dwv,254.66
+ti1
+dwv,248.11
+ti1
+dwv,240.01
+ti1
+dwv,229.30
+ti1
+dwv,216.52
+ti1
+dwv,205.15
+ti1
+dwv,192.49
+ti1
+dwv,179.70
+ti1
+dwv,167.51
+ti1
+dwv,156.31
+ti1
+dwv,145.97
+ti1
+dwv,135.93
+ti1
+dwv,128.06
+ti1
+dwv,119.45
+ti1
+dwv,113.01
+ti1
+dwv,108.31
+ti1
+dwv,103.79
+ti1
+dwv,100.92
+ti1
+dwv,98.90
+ti1
+dwv,98.28
+ti1
+ti1
+dwv,100.12
+ti1
+dwv,102.38
+ti1
+dwv,106.07
+ti1
+dwv,111.06
+ti1
+dwv,117.00
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,202.42
+ti1
+dwv,217.46
+ti1
+dwv,232.83
+ti1
+dwv,245.05
+ti1
+dwv,256.39
+ti1
+dwv,265.28
+ti1
+dwv,271.80
+ti1
+ti1
+dwv,268.63
+ti1
+dwv,261.21
+ti1
+dwv,253.57
+ti1
+dwv,244.41
+ti1
+dwv,233.79
+ti1
+dwv,220.80
+ti1
+dwv,209.24
+ti1
+dwv,196.54
+ti1
+dwv,183.38
+ti1
+dwv,170.14
+ti1
+dwv,157.79
+ti1
+dwv,144.31
+ti1
+dwv,131.53
+ti1
+dwv,122.20
+ti1
+dwv,113.46
+ti1
+dwv,106.57
+ti1
+dwv,100.93
+ti1
+dwv,96.80
+ti1
+dwv,92.10
+ti1
+dwv,88.77
+ti1
+dwv,86.07
+ti1
+dwv,83.75
+ti1
+dwv,82.40
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,84.82
+ti1
+dwv,88.34
+ti1
+dwv,92.06
+ti1
+dwv,98.22
+ti1
+dwv,103.08
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,196.25
+ti1
+dwv,210.62
+ti1
+dwv,223.53
+ti1
+dwv,235.01
+ti1
+dwv,245.30
+ti1
+dwv,253.56
+ti1
+dwv,259.86
+ti1
+dwv,261.87
+ti1
+ti1
+dwv,257.71
+ti1
+dwv,251.10
+ti1
+dwv,242.25
+ti1
+dwv,232.00
+ti1
+dwv,219.62
+ti1
+dwv,207.54
+ti1
+dwv,194.54
+ti1
+dwv,182.85
+ti1
+dwv,170.49
+ti1
+dwv,158.24
+ti1
+dwv,147.54
+ti1
+dwv,137.40
+ti1
+dwv,129.81
+ti1
+dwv,121.07
+ti1
+dwv,114.39
+ti1
+dwv,109.32
+ti1
+dwv,103.67
+ti1
+dwv,99.51
+ti1
+dwv,96.53
+ti1
+dwv,94.67
+ti1
+dwv,93.79
+ti1
+ti1
+dwv,95.31
+ti1
+dwv,98.43
+ti1
+dwv,102.95
+ti1
+dwv,109.01
+ti1
+dwv,115.86
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,209.63
+ti1
+dwv,224.03
+ti1
+dwv,236.93
+ti1
+dwv,249.17
+ti1
+dwv,259.34
+ti1
+dwv,267.41
+ti1
+dwv,271.07
+ti1
+dwv,270.51
+ti1
+dwv,263.93
+ti1
+dwv,255.80
+ti1
+dwv,246.03
+ti1
+dwv,235.96
+ti1
+dwv,223.79
+ti1
+dwv,209.68
+ti1
+dwv,196.98
+ti1
+dwv,184.70
+ti1
+dwv,171.16
+ti1
+dwv,157.06
+ti1
+dwv,145.05
+ti1
+dwv,133.80
+ti1
+dwv,123.45
+ti1
+dwv,114.06
+ti1
+dwv,106.78
+ti1
+dwv,98.12
+ti1
+dwv,91.19
+ti1
+dwv,84.78
+ti1
+dwv,80.10
+ti1
+dwv,74.95
+ti1
+dwv,71.88
+ti1
+dwv,68.51
+ti1
+dwv,66.13
+ti1
+dwv,64.64
+ti1
+dwv,63.65
+ti1
+dwv,63.06
+ti1
+ti1
+dwv,64.29
+ti1
+dwv,66.41
+ti1
+dwv,68.95
+ti1
+dwv,73.12
+ti1
+dwv,78.00
+ti1
+dwv,83.67
+ti1
+dwv,85.55
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,187.86
+ti1
+dwv,202.65
+ti1
+dwv,216.23
+ti1
+dwv,228.24
+ti1
+dwv,239.81
+ti1
+dwv,248.77
+ti1
+dwv,252.97
+ti1
+dwv,254.72
+ti1
+ti1
+dwv,253.22
+ti1
+dwv,247.80
+ti1
+dwv,239.99
+ti1
+dwv,229.87
+ti1
+dwv,218.26
+ti1
+dwv,205.99
+ti1
+dwv,193.09
+ti1
+dwv,180.59
+ti1
+dwv,167.42
+ti1
+dwv,154.33
+ti1
+dwv,142.32
+ti1
+dwv,131.88
+ti1
+dwv,122.32
+ti1
+dwv,112.84
+ti1
+dwv,104.07
+ti1
+dwv,96.62
+ti1
+dwv,90.02
+ti1
+dwv,84.43
+ti1
+dwv,79.90
+ti1
+dwv,74.59
+ti1
+dwv,71.27
+ti1
+dwv,67.37
+ti1
+dwv,64.97
+ti1
+dwv,62.82
+ti1
+dwv,61.60
+ti1
+ti1
+ti1
+dwv,62.99
+ti1
+dwv,64.80
+ti1
+dwv,68.51
+ti1
+dwv,72.70
+ti1
+dwv,77.97
+ti1
+dwv,84.10
+ti1
+dwv,88.07
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+ti1
+dwv,184.25
+ti1
+dwv,199.56
+ti1
+dwv,212.97
+ti1
+dwv,226.37
+ti1
+dwv,237.23
+ti1
+dwv,247.66
+ti1
+dwv,254.97
+ti1
+dwv,259.77
+ti1
+dwv,261.89
+ti1
+dwv,260.39
+ti1
+dwv,255.67
+ti1
+dwv,248.49
+ti1
+dwv,238.75
+ti1
+dwv,228.34
+ti1
+dwv,215.95
+ti1
+dwv,201.71
+ti1
+dwv,187.12
+ti1
+dwv,174.33
+ti1
+dwv,162.05
+ti1
+dwv,151.79
+ti1
+dwv,142.67
+ti1
+dwv,134.03
+ti1
+dwv,126.03
+ti1
+dwv,118.64
+ti1
+dwv,112.00
+ti1
+dwv,107.16
+ti1
+dwv,103.71
+ti1
+dwv,100.06
+ti1
+dwv,98.59
+ti1
+dwv,97.68
+ti1
+ti1
diff --git a/gawk-5.0.1/test/rebuf.ok b/gawk-5.0.1/test/rebuf.ok
new file mode 100644
index 00000000000..f452f55360a
--- /dev/null
+++ b/gawk-5.0.1/test/rebuf.ok
@@ -0,0 +1,1290 @@
+1 0
+2 214.59
+3 230.31
+4 242.64
+5 253.94
+6 264.33
+7 270.94
+8 273.52
+9 270.08
+10 263.19
+11 254.45
+12 244.91
+13 234.55
+14 222.49
+15 209.94
+16 197.17
+17 182.89
+18 169.76
+19 158.59
+20 145.37
+21 135.46
+22 124.77
+23 115.98
+24 108.77
+25 101.12
+26 94.45
+27 89.08
+28 84.63
+29 81.05
+30 78.93
+31 76.65
+32 75.59
+33 75.59
+34 75.59
+35 77.47
+36 80.17
+37 83.90
+38 88.56
+39 95.69
+40 97.48
+41 97.48
+42 97.48
+43 97.48
+44 97.48
+45 97.48
+46 97.48
+47 97.48
+48 203.08
+49 218.22
+50 229.37
+51 238.49
+52 247.43
+53 255.22
+54 261.31
+55 262.36
+56 260.66
+57 256.33
+58 249.34
+59 240.03
+60 228.55
+61 215.42
+62 203.37
+63 190.01
+64 177.81
+65 165.44
+66 152.92
+67 142.03
+68 132.91
+69 124.48
+70 116.45
+71 109.06
+72 103.27
+73 98.87
+74 94.95
+75 92.56
+76 90.47
+77 89.48
+78 89.48
+79 90.53
+80 93.07
+81 97.12
+82 101.82
+83 108.18
+84 109.73
+85 109.73
+86 109.73
+87 109.73
+88 109.73
+89 109.73
+90 109.73
+91 202.97
+92 217.38
+93 231.73
+94 243.11
+95 255.37
+96 264.12
+97 269.64
+98 270.98
+99 269.65
+100 264.55
+101 257.16
+102 246.01
+103 232.88
+104 219.85
+105 208.79
+106 197.00
+107 183.93
+108 172.00
+109 160.55
+110 150.59
+111 141.47
+112 133.02
+113 126.21
+114 120.64
+115 115.79
+116 111.62
+117 108.41
+118 106.41
+119 106.41
+120 106.41
+121 109.08
+122 113.23
+123 118.57
+124 122.57
+125 122.57
+126 122.57
+127 122.57
+128 122.57
+129 122.57
+130 122.57
+131 208.07
+132 224.14
+133 236.28
+134 248.12
+135 258.97
+136 267.74
+137 272.47
+138 271.52
+139 266.80
+140 258.61
+141 249.30
+142 239.19
+143 228.28
+144 215.79
+145 203.86
+146 190.08
+147 177.40
+148 163.81
+149 152.60
+150 141.33
+151 130.98
+152 121.98
+153 114.08
+154 106.61
+155 99.75
+156 93.10
+157 86.57
+158 80.62
+159 76.05
+160 71.52
+161 68.85
+162 67.46
+163 66.86
+164 67.51
+165 69.75
+166 72.85
+167 76.23
+168 82.85
+169 89.33
+170 93.39
+171 93.39
+172 93.39
+173 93.39
+174 93.39
+175 93.39
+176 93.39
+177 93.39
+178 188.37
+179 204.42
+180 217.16
+181 228.89
+182 238.83
+183 247.70
+184 253.59
+185 257.17
+186 257.17
+187 254.00
+188 248.24
+189 240.14
+190 229.42
+191 218.97
+192 205.09
+193 192.61
+194 179.74
+195 166.76
+196 155.36
+197 143.58
+198 131.40
+199 121.84
+200 112.46
+201 105.41
+202 97.15
+203 90.09
+204 84.79
+205 80.52
+206 75.58
+207 72.59
+208 69.39
+209 67.51
+210 66.42
+211 66.42
+212 66.42
+213 67.82
+214 69.76
+215 73.19
+216 77.35
+217 82.36
+218 87.82
+219 93.30
+220 93.30
+221 93.30
+222 93.30
+223 93.30
+224 93.30
+225 93.30
+226 93.30
+227 190.58
+228 203.43
+229 216.48
+230 228.89
+231 241.91
+232 251.60
+233 257.78
+234 262.18
+235 263.13
+236 260.91
+237 255.34
+238 247.17
+239 236.85
+240 225.24
+241 213.39
+242 201.46
+243 187.77
+244 175.31
+245 162.95
+246 152.55
+247 142.56
+248 132.94
+249 125.00
+250 117.69
+251 110.96
+252 105.02
+253 101.78
+254 98.48
+255 97.06
+256 96.50
+257 96.50
+258 98.48
+259 101.18
+260 104.56
+261 109.67
+262 115.86
+263 115.86
+264 115.86
+265 115.86
+266 115.86
+267 115.86
+268 115.86
+269 200.02
+270 217.51
+271 233.21
+272 245.72
+273 258.21
+274 267.24
+275 273.79
+276 273.20
+277 270.38
+278 260.76
+279 250.05
+280 241.32
+281 231.14
+282 219.83
+283 206.13
+284 193.24
+285 180.73
+286 167.82
+287 156.94
+288 144.13
+289 134.40
+290 125.23
+291 116.13
+292 107.34
+293 99.71
+294 94.11
+295 88.91
+296 84.51
+297 81.50
+298 78.66
+299 76.57
+300 75.82
+301 75.82
+302 76.88
+303 79.03
+304 82.12
+305 85.73
+306 91.05
+307 96.31
+308 96.31
+309 96.31
+310 96.31
+311 96.31
+312 96.31
+313 96.31
+314 96.31
+315 184.18
+316 201.10
+317 214.21
+318 226.18
+319 237.72
+320 247.57
+321 254.36
+322 258.34
+323 259.80
+324 257.76
+325 253.17
+326 246.51
+327 237.92
+328 227.09
+329 214.13
+330 202.20
+331 189.21
+332 177.65
+333 166.18
+334 154.03
+335 142.21
+336 131.51
+337 121.28
+338 111.80
+339 104.47
+340 98.80
+341 94.76
+342 91.81
+343 89.17
+344 88.00
+345 88.00
+346 88.00
+347 89.20
+348 91.17
+349 94.35
+350 99.00
+351 105.43
+352 109.34
+353 109.34
+354 109.34
+355 109.34
+356 109.34
+357 109.34
+358 109.34
+359 194.84
+360 212.05
+361 226.30
+362 239.03
+363 250.94
+364 259.73
+365 266.64
+366 269.67
+367 269.03
+368 265.03
+369 258.23
+370 249.32
+371 238.03
+372 226.20
+373 213.46
+374 200.53
+375 187.65
+376 174.89
+377 163.22
+378 152.47
+379 142.65
+380 133.97
+381 126.59
+382 120.52
+383 115.57
+384 111.49
+385 108.03
+386 106.01
+387 105.28
+388 105.28
+389 106.91
+390 109.73
+391 114.91
+392 120.66
+393 123.74
+394 123.74
+395 123.74
+396 123.74
+397 123.74
+398 123.74
+399 123.74
+400 211.57
+401 227.06
+402 240.57
+403 252.26
+404 262.67
+405 270.66
+406 273.40
+407 270.25
+408 263.76
+409 256.03
+410 246.87
+411 237.10
+412 225.11
+413 211.53
+414 197.77
+415 185.75
+416 173.00
+417 159.31
+418 147.18
+419 134.84
+420 125.07
+421 115.82
+422 107.33
+423 100.07
+424 93.55
+425 87.60
+426 81.75
+427 77.03
+428 73.39
+429 70.97
+430 67.94
+431 66.64
+432 65.80
+433 65.80
+434 66.85
+435 68.78
+436 71.47
+437 74.20
+438 78.68
+439 85.08
+440 87.47
+441 87.47
+442 87.47
+443 87.47
+444 87.47
+445 87.47
+446 87.47
+447 87.47
+448 185.81
+449 201.66
+450 215.07
+451 227.26
+452 238.00
+453 247.64
+454 255.03
+455 257.12
+456 256.17
+457 253.47
+458 248.93
+459 241.39
+460 231.45
+461 220.49
+462 208.48
+463 196.04
+464 182.73
+465 169.40
+466 157.24
+467 145.56
+468 133.54
+469 124.01
+470 114.55
+471 105.75
+472 98.32
+473 91.91
+474 86.08
+475 81.35
+476 77.78
+477 73.85
+478 71.12
+479 68.53
+480 67.09
+481 66.34
+482 66.34
+483 66.34
+484 67.92
+485 70.08
+486 73.78
+487 78.68
+488 84.33
+489 90.25
+490 90.25
+491 90.25
+492 90.25
+493 90.25
+494 90.25
+495 90.25
+496 90.25
+497 183.19
+498 198.96
+499 213.55
+500 225.91
+501 237.33
+502 246.66
+503 254.98
+504 259.46
+505 261.02
+506 260.02
+507 255.96
+508 249.08
+509 240.15
+510 229.51
+511 217.21
+512 205.06
+513 192.62
+514 177.43
+515 165.06
+516 152.36
+517 142.35
+518 134.58
+519 126.20
+520 119.86
+521 113.67
+522 108.20
+523 104.71
+524 100.83
+525 98.96
+526 98.38
+527 98.38
+528 100.29
+529 103.47
+530 107.73
+531 113.04
+532 118.90
+533 118.90
+534 118.90
+535 118.90
+536 118.90
+537 118.90
+538 118.90
+539 200.70
+540 217.77
+541 232.45
+542 244.28
+543 256.61
+544 265.93
+545 272.01
+546 272.01
+547 268.67
+548 260.53
+549 252.09
+550 243.72
+551 232.68
+552 220.49
+553 206.88
+554 193.98
+555 181.33
+556 168.61
+557 156.50
+558 145.54
+559 136.43
+560 125.95
+561 117.26
+562 109.81
+563 103.36
+564 97.15
+565 92.86
+566 89.02
+567 86.39
+568 84.44
+569 83.72
+570 83.72
+571 85.89
+572 88.39
+573 92.31
+574 96.00
+575 100.24
+576 102.55
+577 102.55
+578 102.55
+579 102.55
+580 102.55
+581 102.55
+582 102.55
+583 102.55
+584 197.15
+585 212.33
+586 225.48
+587 236.75
+588 247.52
+589 255.21
+590 260.74
+591 262.81
+592 262.09
+593 258.08
+594 250.83
+595 242.39
+596 230.86
+597 219.62
+598 206.80
+599 193.41
+600 180.60
+601 168.20
+602 157.77
+603 145.25
+604 136.23
+605 126.28
+606 118.10
+607 110.74
+608 105.29
+609 99.75
+610 95.61
+611 92.16
+612 89.93
+613 88.45
+614 88.45
+615 89.11
+616 90.87
+617 94.21
+618 98.16
+619 104.24
+620 108.98
+621 108.98
+622 108.98
+623 108.98
+624 108.98
+625 108.98
+626 108.98
+627 195.81
+628 211.95
+629 226.36
+630 240.61
+631 251.93
+632 259.13
+633 265.36
+634 269.71
+635 270.27
+636 266.44
+637 260.44
+638 251.94
+639 240.79
+640 228.95
+641 215.90
+642 203.25
+643 190.01
+644 177.92
+645 165.60
+646 155.49
+647 144.32
+648 136.07
+649 127.64
+650 120.28
+651 114.57
+652 109.99
+653 106.36
+654 104.49
+655 103.84
+656 103.84
+657 105.77
+658 107.83
+659 112.41
+660 117.71
+661 120.66
+662 120.66
+663 120.66
+664 120.66
+665 120.66
+666 120.66
+667 120.66
+668 210.13
+669 225.03
+670 238.76
+671 250.50
+672 261.18
+673 269.22
+674 274.18
+675 272.28
+676 266.66
+677 258.68
+678 249.88
+679 239.94
+680 227.14
+681 213.22
+682 197.58
+683 184.86
+684 172.52
+685 160.19
+686 149.20
+687 137.49
+688 127.86
+689 118.91
+690 110.49
+691 102.73
+692 96.33
+693 90.95
+694 86.38
+695 82.72
+696 79.65
+697 77.61
+698 75.70
+699 74.49
+700 74.49
+701 74.49
+702 76.48
+703 79.14
+704 82.84
+705 87.86
+706 92.69
+707 92.69
+708 92.69
+709 92.69
+710 92.69
+711 92.69
+712 92.69
+713 92.69
+714 181.33
+715 196.86
+716 210.98
+717 223.13
+718 233.90
+719 243.19
+720 250.57
+721 255.00
+722 256.36
+723 255.16
+724 250.15
+725 242.80
+726 233.82
+727 223.41
+728 210.81
+729 199.04
+730 187.39
+731 174.14
+732 162.62
+733 151.39
+734 139.59
+735 128.71
+736 119.17
+737 111.02
+738 103.91
+739 96.78
+740 91.56
+741 87.13
+742 83.22
+743 80.50
+744 76.83
+745 74.24
+746 70.80
+747 69.04
+748 67.12
+749 66.51
+750 66.51
+751 68.77
+752 72.19
+753 77.34
+754 84.04
+755 88.55
+756 88.55
+757 88.55
+758 88.55
+759 88.55
+760 88.55
+761 88.55
+762 88.55
+763 190.51
+764 207.14
+765 220.57
+766 232.51
+767 243.35
+768 252.41
+769 258.62
+770 262.18
+771 262.18
+772 259.10
+773 253.54
+774 245.44
+775 235.55
+776 223.43
+777 209.91
+778 197.52
+779 185.90
+780 172.13
+781 161.09
+782 150.58
+783 140.37
+784 130.27
+785 122.13
+786 114.99
+787 108.76
+788 104.67
+789 100.36
+790 97.61
+791 95.48
+792 94.83
+793 95.45
+794 97.15
+795 100.73
+796 105.10
+797 111.46
+798 118.27
+799 118.27
+800 118.27
+801 118.27
+802 118.27
+803 118.27
+804 118.27
+805 202.92
+806 220.25
+807 233.35
+808 243.48
+809 254.85
+810 265.75
+811 272.62
+812 272.62
+813 269.36
+814 261.82
+815 252.85
+816 244.08
+817 232.96
+818 219.59
+819 207.32
+820 193.87
+821 181.77
+822 168.60
+823 155.76
+824 144.03
+825 134.07
+826 123.46
+827 114.47
+828 107.64
+829 100.46
+830 94.53
+831 89.28
+832 84.59
+833 80.96
+834 78.54
+835 76.28
+836 75.51
+837 75.51
+838 76.55
+839 78.55
+840 81.57
+841 85.18
+842 90.61
+843 96.01
+844 96.01
+845 96.01
+846 96.01
+847 96.01
+848 96.01
+849 96.01
+850 96.01
+851 184.51
+852 201.57
+853 216.33
+854 228.69
+855 239.90
+856 250.41
+857 257.91
+858 262.29
+859 263.41
+860 261.70
+861 256.75
+862 246.82
+863 236.35
+864 225.17
+865 212.90
+866 201.61
+867 188.42
+868 175.92
+869 163.70
+870 153.18
+871 142.89
+872 132.95
+873 125.18
+874 117.61
+875 110.36
+876 104.56
+877 100.13
+878 96.64
+879 93.52
+880 91.91
+881 91.91
+882 91.91
+883 93.84
+884 97.13
+885 101.08
+886 107.19
+887 111.89
+888 111.89
+889 111.89
+890 111.89
+891 111.89
+892 111.89
+893 111.89
+894 195.89
+895 212.65
+896 226.60
+897 239.28
+898 251.28
+899 259.92
+900 266.03
+901 269.76
+902 269.76
+903 265.55
+904 258.92
+905 250.42
+906 240.04
+907 229.03
+908 216.69
+909 204.21
+910 191.25
+911 178.40
+912 168.31
+913 157.47
+914 148.62
+915 139.12
+916 129.54
+917 121.65
+918 114.59
+919 109.30
+920 106.39
+921 104.71
+922 104.71
+923 106.41
+924 109.22
+925 113.62
+926 118.31
+927 124.34
+928 124.34
+929 124.34
+930 124.34
+931 124.34
+932 124.34
+933 124.34
+934 205.67
+935 221.25
+936 235.02
+937 247.47
+938 258.37
+939 267.42
+940 272.60
+941 272.00
+942 267.91
+943 260.38
+944 251.10
+945 241.32
+946 230.96
+947 217.34
+948 204.99
+949 191.24
+950 178.58
+951 164.79
+952 153.07
+953 141.06
+954 129.86
+955 119.79
+956 111.13
+957 103.53
+958 96.95
+959 89.42
+960 85.22
+961 80.54
+962 76.85
+963 74.41
+964 72.12
+965 71.21
+966 71.21
+967 71.21
+968 72.13
+969 74.22
+970 76.95
+971 80.65
+972 85.36
+973 90.60
+974 92.36
+975 92.36
+976 92.36
+977 92.36
+978 92.36
+979 92.36
+980 92.36
+981 92.36
+982 191.27
+983 205.03
+984 218.89
+985 230.87
+986 241.63
+987 249.83
+988 255.42
+989 257.98
+990 257.33
+991 252.87
+992 245.90
+993 237.78
+994 227.14
+995 214.67
+996 202.31
+997 188.68
+998 175.96
+999 163.25
+1000 151.43
+1001 139.79
+1002 130.40
+1003 118.92
+1004 110.88
+1005 101.92
+1006 94.45
+1007 88.13
+1008 83.19
+1009 79.11
+1010 74.60
+1011 71.86
+1012 68.77
+1013 66.57
+1014 65.24
+1015 64.41
+1016 64.41
+1017 64.92
+1018 66.62
+1019 68.93
+1020 72.77
+1021 77.76
+1022 83.41
+1023 89.19
+1024 89.19
+1025 89.19
+1026 89.19
+1027 89.19
+1028 89.19
+1029 89.19
+1030 89.19
+1031 182.68
+1032 199.88
+1033 214.62
+1034 227.29
+1035 238.62
+1036 249.01
+1037 256.68
+1038 262.71
+1039 263.44
+1040 259.87
+1041 254.66
+1042 248.11
+1043 240.01
+1044 229.30
+1045 216.52
+1046 205.15
+1047 192.49
+1048 179.70
+1049 167.51
+1050 156.31
+1051 145.97
+1052 135.93
+1053 128.06
+1054 119.45
+1055 113.01
+1056 108.31
+1057 103.79
+1058 100.92
+1059 98.90
+1060 98.28
+1061 98.28
+1062 100.12
+1063 102.38
+1064 106.07
+1065 111.06
+1066 117.00
+1067 117.00
+1068 117.00
+1069 117.00
+1070 117.00
+1071 117.00
+1072 117.00
+1073 202.42
+1074 217.46
+1075 232.83
+1076 245.05
+1077 256.39
+1078 265.28
+1079 271.80
+1080 271.80
+1081 268.63
+1082 261.21
+1083 253.57
+1084 244.41
+1085 233.79
+1086 220.80
+1087 209.24
+1088 196.54
+1089 183.38
+1090 170.14
+1091 157.79
+1092 144.31
+1093 131.53
+1094 122.20
+1095 113.46
+1096 106.57
+1097 100.93
+1098 96.80
+1099 92.10
+1100 88.77
+1101 86.07
+1102 83.75
+1103 82.40
+1104 82.40
+1105 82.40
+1106 82.40
+1107 82.40
+1108 84.82
+1109 88.34
+1110 92.06
+1111 98.22
+1112 103.08
+1113 103.08
+1114 103.08
+1115 103.08
+1116 103.08
+1117 103.08
+1118 196.25
+1119 210.62
+1120 223.53
+1121 235.01
+1122 245.30
+1123 253.56
+1124 259.86
+1125 261.87
+1126 261.87
+1127 257.71
+1128 251.10
+1129 242.25
+1130 232.00
+1131 219.62
+1132 207.54
+1133 194.54
+1134 182.85
+1135 170.49
+1136 158.24
+1137 147.54
+1138 137.40
+1139 129.81
+1140 121.07
+1141 114.39
+1142 109.32
+1143 103.67
+1144 99.51
+1145 96.53
+1146 94.67
+1147 93.79
+1148 93.79
+1149 95.31
+1150 98.43
+1151 102.95
+1152 109.01
+1153 115.86
+1154 115.86
+1155 115.86
+1156 115.86
+1157 115.86
+1158 115.86
+1159 115.86
+1160 115.86
+1161 209.63
+1162 224.03
+1163 236.93
+1164 249.17
+1165 259.34
+1166 267.41
+1167 271.07
+1168 270.51
+1169 263.93
+1170 255.80
+1171 246.03
+1172 235.96
+1173 223.79
+1174 209.68
+1175 196.98
+1176 184.70
+1177 171.16
+1178 157.06
+1179 145.05
+1180 133.80
+1181 123.45
+1182 114.06
+1183 106.78
+1184 98.12
+1185 91.19
+1186 84.78
+1187 80.10
+1188 74.95
+1189 71.88
+1190 68.51
+1191 66.13
+1192 64.64
+1193 63.65
+1194 63.06
+1195 63.06
+1196 64.29
+1197 66.41
+1198 68.95
+1199 73.12
+1200 78.00
+1201 83.67
+1202 85.55
+1203 85.55
+1204 85.55
+1205 85.55
+1206 85.55
+1207 85.55
+1208 85.55
+1209 85.55
+1210 187.86
+1211 202.65
+1212 216.23
+1213 228.24
+1214 239.81
+1215 248.77
+1216 252.97
+1217 254.72
+1218 254.72
+1219 253.22
+1220 247.80
+1221 239.99
+1222 229.87
+1223 218.26
+1224 205.99
+1225 193.09
+1226 180.59
+1227 167.42
+1228 154.33
+1229 142.32
+1230 131.88
+1231 122.32
+1232 112.84
+1233 104.07
+1234 96.62
+1235 90.02
+1236 84.43
+1237 79.90
+1238 74.59
+1239 71.27
+1240 67.37
+1241 64.97
+1242 62.82
+1243 61.60
+1244 61.60
+1245 61.60
+1246 62.99
+1247 64.80
+1248 68.51
+1249 72.70
+1250 77.97
+1251 84.10
+1252 88.07
+1253 88.07
+1254 88.07
+1255 88.07
+1256 88.07
+1257 88.07
+1258 88.07
+1259 88.07
+1260 184.25
+1261 199.56
+1262 212.97
+1263 226.37
+1264 237.23
+1265 247.66
+1266 254.97
+1267 259.77
+1268 261.89
+1269 260.39
+1270 255.67
+1271 248.49
+1272 238.75
+1273 228.34
+1274 215.95
+1275 201.71
+1276 187.12
+1277 174.33
+1278 162.05
+1279 151.79
+1280 142.67
+1281 134.03
+1282 126.03
+1283 118.64
+1284 112.00
+1285 107.16
+1286 103.71
+1287 100.06
+1288 98.59
+1289 97.68
+1290 97.68
diff --git a/gawk-5.0.1/test/rebuild.awk b/gawk-5.0.1/test/rebuild.awk
new file mode 100644
index 00000000000..7320f1920a9
--- /dev/null
+++ b/gawk-5.0.1/test/rebuild.awk
@@ -0,0 +1,5 @@
+{
+	$1 = "test"
+	print $0
+	print typeof($2)
+}
diff --git a/gawk-5.0.1/test/rebuild.in b/gawk-5.0.1/test/rebuild.in
new file mode 100644
index 00000000000..2f16a825c24
--- /dev/null
+++ b/gawk-5.0.1/test/rebuild.in
@@ -0,0 +1 @@
+a 6.3
diff --git a/gawk-5.0.1/test/rebuild.ok b/gawk-5.0.1/test/rebuild.ok
new file mode 100644
index 00000000000..0fe72e233b7
--- /dev/null
+++ b/gawk-5.0.1/test/rebuild.ok
@@ -0,0 +1,2 @@
+test 6.3
+strnum
diff --git a/gawk-5.0.1/test/redfilnm.awk b/gawk-5.0.1/test/redfilnm.awk
new file mode 100644
index 00000000000..83cb6aa900d
--- /dev/null
+++ b/gawk-5.0.1/test/redfilnm.awk
@@ -0,0 +1,98 @@
+#Date: Tue, 18 May 1999 12:48:07 -0500 (CDT)
+#From: Darrel Hankerson <hankedr@dms.auburn.edu>
+#To: arnold@gnu.org
+#Subject: [christopher.procter@bt.com: RE: Getline bug in Gawk 3.0.3]
+#
+#Here's a reply that came directly to me.  --darrel
+#
+#
+#From: christopher.procter@bt.com
+#To: hankedr@dms.auburn.edu
+#Subject: RE: Getline bug in Gawk 3.0.3
+#Date: Tue, 18 May 1999 18:42:28 +0100
+#
+#Sorry that was me getting carried away and cut and pasting the wrong thing
+#into my email
+#
+#The real problem seems to be that :
+#BEGIN {
+#for (i=1;i<10;i++){
+#	while((getline < "hello.txt")>0){
+# 		print $0
+#		}
+# 	close("hello.txt")
+#	}
+#}
+#works (printing the contents of hello.txt 9 times), where as:-
+#
+#END{
+#for (i=1;i<10;i++){
+#	while((getline < "hello.txt")>0){
+# 		print $0
+#		}
+# 	close("hello.txt")
+#	}
+#}
+#
+#doesn't, (it prints out hello.txt once followed by the iteration numbers
+#from 1 to 9).
+#The only difference is that one is in the BEGIN block and one in the END
+#block.
+#
+#Sorry about the first post, I'm not a bad awk programmer, just a tired one
+#:)
+#
+#chris
+#
+#> -----Original Message-----
+#> From:	Darrel Hankerson [SMTP:hankedr@dms.auburn.edu]
+#> Sent:	18 May 1999 18:28
+#> To:	christopher.procter@bt.com
+#> Subject:	Re: Getline bug in Gawk 3.0.3
+#> 
+#> Could you clarify?  Your first script uses an apparently undefined
+#> variable f.
+#> 
+#> 
+#> christopher.procter@bt.com writes:
+#> 
+#>    BEGIN {
+#>    for (i=1;i<10;i++){
+#>    while((getline < "hello.txt")>0){
+#>      print $0
+#>    }
+#>      close(f)
+#>    }
+#>    }
+#> 
+#>    refuses to close the file and so prints the contents of hello.txt just
+#> once.
+#>    However:-
+#> 
+#>    BEGIN {
+#>    f="hello.txt"
+#>    for (i=1;i<10;i++){
+#>    while((getline < f)>0){
+#>      print $0
+#>    }
+#>      close(f)
+#>    }
+#>    }
+#> 
+#>    works as advertised (printing the contents of hello.txt 9 times)
+#>    It seems like a bug in the close statement.
+#> 
+#> -- 
+#> --Darrel Hankerson hankedr@mail.auburn.edu
+#
+
+# srcdir is assigned on command line --- ADR
+END {
+	f = srcdir "/redfilnm.in"
+	for (i = 1; i < 10; i++){
+		while((getline < f) > 0){
+ 			print $0
+		}
+ 		close(f)
+	}
+}
diff --git a/gawk-5.0.1/test/redfilnm.in b/gawk-5.0.1/test/redfilnm.in
new file mode 100644
index 00000000000..4b5fa63702d
--- /dev/null
+++ b/gawk-5.0.1/test/redfilnm.in
@@ -0,0 +1 @@
+hello, world
diff --git a/gawk-5.0.1/test/redfilnm.ok b/gawk-5.0.1/test/redfilnm.ok
new file mode 100644
index 00000000000..f9e095a7deb
--- /dev/null
+++ b/gawk-5.0.1/test/redfilnm.ok
@@ -0,0 +1,9 @@
+hello, world
+hello, world
+hello, world
+hello, world
+hello, world
+hello, world
+hello, world
+hello, world
+hello, world
diff --git a/gawk-5.0.1/test/reg/Obsolete/exp.awk b/gawk-5.0.1/test/reg/Obsolete/exp.awk
new file mode 100644
index 00000000000..4e707f891a7
--- /dev/null
+++ b/gawk-5.0.1/test/reg/Obsolete/exp.awk
@@ -0,0 +1 @@
+BEGIN { print exp(0), exp(1000000), exp(0.5) }
diff --git a/gawk-5.0.1/test/reg/Obsolete/exp.good b/gawk-5.0.1/test/reg/Obsolete/exp.good
new file mode 100644
index 00000000000..07b88537dd8
--- /dev/null
+++ b/gawk-5.0.1/test/reg/Obsolete/exp.good
@@ -0,0 +1,2 @@
+1 gawk: reg/exp.awk:1: warning: exp argument 1e+06 is out of range
+Inf 1.64872
diff --git a/gawk-5.0.1/test/reg/Obsolete/exp.in b/gawk-5.0.1/test/reg/Obsolete/exp.in
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/reg/Obsolete/log.awk b/gawk-5.0.1/test/reg/Obsolete/log.awk
new file mode 100644
index 00000000000..bcae90b8132
--- /dev/null
+++ b/gawk-5.0.1/test/reg/Obsolete/log.awk
@@ -0,0 +1 @@
+BEGIN { print log(0), log(-1), log(100) }
diff --git a/gawk-5.0.1/test/reg/Obsolete/log.good b/gawk-5.0.1/test/reg/Obsolete/log.good
new file mode 100644
index 00000000000..857ab770365
--- /dev/null
+++ b/gawk-5.0.1/test/reg/Obsolete/log.good
@@ -0,0 +1,4 @@
+log: SING error
+-Inf gawk: reg/log.awk:1: warning: log called with negative argument -1
+log: DOMAIN error
+NaN 4.60517
diff --git a/gawk-5.0.1/test/reg/Obsolete/log.in b/gawk-5.0.1/test/reg/Obsolete/log.in
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/reg/exp-eq.awk b/gawk-5.0.1/test/reg/exp-eq.awk
new file mode 100644
index 00000000000..fed6a69421b
--- /dev/null
+++ b/gawk-5.0.1/test/reg/exp-eq.awk
@@ -0,0 +1 @@
+{ $0 ^= 3 ; print $1}
diff --git a/gawk-5.0.1/test/reg/exp-eq.good b/gawk-5.0.1/test/reg/exp-eq.good
new file mode 100644
index 00000000000..d8d59aa0856
--- /dev/null
+++ b/gawk-5.0.1/test/reg/exp-eq.good
@@ -0,0 +1,3 @@
+1
+8
+27
diff --git a/gawk-5.0.1/test/reg/exp-eq.in b/gawk-5.0.1/test/reg/exp-eq.in
new file mode 100644
index 00000000000..01e79c32a8c
--- /dev/null
+++ b/gawk-5.0.1/test/reg/exp-eq.in
@@ -0,0 +1,3 @@
+1
+2
+3
diff --git a/gawk-5.0.1/test/reg/func.awk b/gawk-5.0.1/test/reg/func.awk
new file mode 100644
index 00000000000..e32cd4e607f
--- /dev/null
+++ b/gawk-5.0.1/test/reg/func.awk
@@ -0,0 +1 @@
+BEGIN { print dummy(1) }
diff --git a/gawk-5.0.1/test/reg/func.good b/gawk-5.0.1/test/reg/func.good
new file mode 100644
index 00000000000..d3c7c715317
--- /dev/null
+++ b/gawk-5.0.1/test/reg/func.good
@@ -0,0 +1 @@
+gawk: reg/func.awk:1: fatal: function `dummy' not defined
diff --git a/gawk-5.0.1/test/reg/func.in b/gawk-5.0.1/test/reg/func.in
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/reg/func2.awk b/gawk-5.0.1/test/reg/func2.awk
new file mode 100644
index 00000000000..2abf2c10f02
--- /dev/null
+++ b/gawk-5.0.1/test/reg/func2.awk
@@ -0,0 +1,2 @@
+function dummy() { ; }
+BEGIN { print dummy (1) }
diff --git a/gawk-5.0.1/test/reg/func2.good b/gawk-5.0.1/test/reg/func2.good
new file mode 100644
index 00000000000..55ea9acd0c7
--- /dev/null
+++ b/gawk-5.0.1/test/reg/func2.good
@@ -0,0 +1,2 @@
+gawk: reg/func2.awk:2: error: function `dummy' called with space between name and `(',
+or used as a variable or an array
diff --git a/gawk-5.0.1/test/reg/func2.in b/gawk-5.0.1/test/reg/func2.in
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/regeq.awk b/gawk-5.0.1/test/regeq.awk
new file mode 100644
index 00000000000..0208eb24cfe
--- /dev/null
+++ b/gawk-5.0.1/test/regeq.awk
@@ -0,0 +1,29 @@
+#Date: Sat, 8 May 1999 17:42:20 +0200
+#From: Iva Cabric <ivac@fly.srk.fer.hr>
+#To: bug-gnu-utils@gnu.org
+#Cc: arnold@gnu.org
+#Subject: Problem in gawk with match
+#
+#Hello,
+#
+#gawk reports fatal error in match when first character in regexp is "=" :
+#
+#$ gawk '{ where = match($0, /=a/); print where}' 
+#gawk: cmd. line:1: { where = match($0, /=a/); print where}
+#gawk: cmd. line:1:                     ^ parse error
+#gawk: cmd. line:1: fatal: match() cannot have 0 arguments
+#
+#Using "\=" instead "=" works without problems :
+#
+#$ gawk '{ where = match($0, /\=a/); print where}'
+#sdgfa
+#0
+#asdfds=a
+#7
+#
+#Other versions of awk have no problems with "/=/" (except oawk on SunOS).
+#
+#-- 
+#     	 		 	 @
+#
+{ where = match($0, /=a/); print where}
diff --git a/gawk-5.0.1/test/regeq.in b/gawk-5.0.1/test/regeq.in
new file mode 100644
index 00000000000..2428df3aa73
--- /dev/null
+++ b/gawk-5.0.1/test/regeq.in
@@ -0,0 +1,2 @@
+sdgfa
+asdfds=a
diff --git a/gawk-5.0.1/test/regeq.ok b/gawk-5.0.1/test/regeq.ok
new file mode 100644
index 00000000000..4596f886c35
--- /dev/null
+++ b/gawk-5.0.1/test/regeq.ok
@@ -0,0 +1,2 @@
+0
+7
diff --git a/gawk-5.0.1/test/regexpbrack.awk b/gawk-5.0.1/test/regexpbrack.awk
new file mode 100644
index 00000000000..136cd194324
--- /dev/null
+++ b/gawk-5.0.1/test/regexpbrack.awk
@@ -0,0 +1,2 @@
+/[]+()0-9.,$%/'"-]*$/
+/^[]+()0-9.,$%/'"-]*$/
diff --git a/gawk-5.0.1/test/regexpbrack.in b/gawk-5.0.1/test/regexpbrack.in
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/regexpbrack.ok b/gawk-5.0.1/test/regexpbrack.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/regexpbrack2.awk b/gawk-5.0.1/test/regexpbrack2.awk
new file mode 100644
index 00000000000..814248443a4
--- /dev/null
+++ b/gawk-5.0.1/test/regexpbrack2.awk
@@ -0,0 +1,2 @@
+NR == 1 { gsub(/\\\\[;?!,()<>|+@%\]\[]/, " ") ; print "\"" $0 "\"" }
+NR == 2 { gsub(/\\\\[;?!,()<>|+@%\]\[^]/, " ") ; print "\"" $0 "\"" }
diff --git a/gawk-5.0.1/test/regexpbrack2.in b/gawk-5.0.1/test/regexpbrack2.in
new file mode 100644
index 00000000000..42888dd071c
--- /dev/null
+++ b/gawk-5.0.1/test/regexpbrack2.in
@@ -0,0 +1,2 @@
+test: \\; \\? \\!
+test: \\; \\? \\!
diff --git a/gawk-5.0.1/test/regexpbrack2.ok b/gawk-5.0.1/test/regexpbrack2.ok
new file mode 100644
index 00000000000..9c2a29227bd
--- /dev/null
+++ b/gawk-5.0.1/test/regexpbrack2.ok
@@ -0,0 +1,2 @@
+"test:      "
+"test:      "
diff --git a/gawk-5.0.1/test/regexprange.awk b/gawk-5.0.1/test/regexprange.awk
new file mode 100644
index 00000000000..861e5ee573f
--- /dev/null
+++ b/gawk-5.0.1/test/regexprange.awk
@@ -0,0 +1,14 @@
+BEGIN {
+	range = "[a-dx-z]"
+
+	split("ABCDEFGHIJKLMNOPQRSTUVWXYZ", upper, "")
+	split("abcdefghijklmnopqrstuvwxyz", lower, "")
+
+	for (i = 1; i in upper; i++)
+		printf("%s ~ %s ---> %s\n",
+			upper[i], range, (upper[i] ~ range) ? "true" : "false")
+
+	for (i = 1; i in lower; i++)
+		printf("%s ~ %s ---> %s\n",
+			lower[i], range, (lower[i] ~ range) ? "true" : "false")
+}
diff --git a/gawk-5.0.1/test/regexprange.ok b/gawk-5.0.1/test/regexprange.ok
new file mode 100644
index 00000000000..dbf5d35ae11
--- /dev/null
+++ b/gawk-5.0.1/test/regexprange.ok
@@ -0,0 +1,52 @@
+A ~ [a-dx-z] ---> false
+B ~ [a-dx-z] ---> false
+C ~ [a-dx-z] ---> false
+D ~ [a-dx-z] ---> false
+E ~ [a-dx-z] ---> false
+F ~ [a-dx-z] ---> false
+G ~ [a-dx-z] ---> false
+H ~ [a-dx-z] ---> false
+I ~ [a-dx-z] ---> false
+J ~ [a-dx-z] ---> false
+K ~ [a-dx-z] ---> false
+L ~ [a-dx-z] ---> false
+M ~ [a-dx-z] ---> false
+N ~ [a-dx-z] ---> false
+O ~ [a-dx-z] ---> false
+P ~ [a-dx-z] ---> false
+Q ~ [a-dx-z] ---> false
+R ~ [a-dx-z] ---> false
+S ~ [a-dx-z] ---> false
+T ~ [a-dx-z] ---> false
+U ~ [a-dx-z] ---> false
+V ~ [a-dx-z] ---> false
+W ~ [a-dx-z] ---> false
+X ~ [a-dx-z] ---> false
+Y ~ [a-dx-z] ---> false
+Z ~ [a-dx-z] ---> false
+a ~ [a-dx-z] ---> true
+b ~ [a-dx-z] ---> true
+c ~ [a-dx-z] ---> true
+d ~ [a-dx-z] ---> true
+e ~ [a-dx-z] ---> false
+f ~ [a-dx-z] ---> false
+g ~ [a-dx-z] ---> false
+h ~ [a-dx-z] ---> false
+i ~ [a-dx-z] ---> false
+j ~ [a-dx-z] ---> false
+k ~ [a-dx-z] ---> false
+l ~ [a-dx-z] ---> false
+m ~ [a-dx-z] ---> false
+n ~ [a-dx-z] ---> false
+o ~ [a-dx-z] ---> false
+p ~ [a-dx-z] ---> false
+q ~ [a-dx-z] ---> false
+r ~ [a-dx-z] ---> false
+s ~ [a-dx-z] ---> false
+t ~ [a-dx-z] ---> false
+u ~ [a-dx-z] ---> false
+v ~ [a-dx-z] ---> false
+w ~ [a-dx-z] ---> false
+x ~ [a-dx-z] ---> true
+y ~ [a-dx-z] ---> true
+z ~ [a-dx-z] ---> true
diff --git a/gawk-5.0.1/test/reginttrad.awk b/gawk-5.0.1/test/reginttrad.awk
new file mode 100644
index 00000000000..9d1156571db
--- /dev/null
+++ b/gawk-5.0.1/test/reginttrad.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	str1 = "aabbbc"
+	str2 = "aaabcc"
+	if (str1 ~ /b{2,}/) printf("\"%s\" matches /b{2,}/\n", str1)
+	if (str2 ~ /b{2,}/) printf("\"%s\" matches /b{2,}/\n", str2)
+}
diff --git a/gawk-5.0.1/test/reginttrad.ok b/gawk-5.0.1/test/reginttrad.ok
new file mode 100644
index 00000000000..eaa278a6613
--- /dev/null
+++ b/gawk-5.0.1/test/reginttrad.ok
@@ -0,0 +1 @@
+"aabbbc" matches /b{2,}/
diff --git a/gawk-5.0.1/test/regnul1.awk b/gawk-5.0.1/test/regnul1.awk
new file mode 100644
index 00000000000..2a35d1767ba
--- /dev/null
+++ b/gawk-5.0.1/test/regnul1.awk
@@ -0,0 +1,84 @@
+# From denis@gissoft.eu Thu May 29 09:07:56 IDT 2014
+# Article: 8400 of comp.lang.awk
+# X-Received: by 10.236.81.99 with SMTP id l63mr3912466yhe.3.1401224812642;
+#         Tue, 27 May 2014 14:06:52 -0700 (PDT)
+# X-Received: by 10.140.37.148 with SMTP id r20mr578874qgr.0.1401224812310; Tue,
+#  27 May 2014 14:06:52 -0700 (PDT)
+# Path: eternal-september.org!news.eternal-september.org!feeder.eternal-september.org!v102.xanadu-bbs.net!xanadu-bbs.net!news.glorb.com!hl10no6493021igb.0!news-out.google.com!gi6ni15574igc.0!nntp.google.com!hl10no6493018igb.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
+# Newsgroups: comp.lang.awk
+# Date: Tue, 27 May 2014 14:06:52 -0700 (PDT)
+# Complaints-To: groups-abuse@google.com
+# Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=85.253.50.165;
+#  posting-account=zNhVLgoAAACsg-WfVe_or2VV7loUhx8H
+# NNTP-Posting-Host: 85.253.50.165
+# User-Agent: G2/1.0
+# MIME-Version: 1.0
+# Message-ID: <3112e356-d2e1-45cd-ba55-2f939ee50105@googlegroups.com>
+# Subject: \0 character can't be implement inside regexp in some cases?
+# From: denis@gissoft.eu
+# Injection-Date: Tue, 27 May 2014 21:06:52 +0000
+# Content-Type: text/plain; charset=ISO-8859-1
+# Xref: news.eternal-september.org comp.lang.awk:8400
+# 
+# Hello,
+# 
+# while doing some experiments with the gawk(4.1.1) i was found problem in implementing character \x00 inside regexp for two cases:
+# 
+# str~/\0/
+# 
+# and
+# 
+# switch ( str ) { case /\0/: ... }
+# 
+# the following code try to match given string(=="\x00") with the regexp /^\0$/ using different ways provided by gawk:
+# 
+func	_chm(t) {
+	_ch("match()",match(t,/^\0$/))
+	_ch("split()",split(t,A,/^\0$/)>1)
+	_ch("patsplit()",patsplit(t,A,/^\0$/))
+	_ch("gsub()",gsub(/^\0$/,"&",t))
+	_ch("sub()",sub(/^\0$/,"&",t))
+	_ch("gensub()",!gensub(/^\0$/,"","G",t))
+	_ch("str~/rexp/",t~/^\0$/)
+	a=0; switch ( t ) { case /^\0$/: a=1 }; _ch("switch-case //",a) }
+
+func	_ch(fn,bool) {
+	print substr(fn ":                ",1,16) (bool ? "+" : "-") }
+
+BEGIN{ _chm("\000") }
+# 
+# output:
+# 
+# > gawk -f _null.gwk
+# match():        +
+# split():        +
+# patsplit():     +
+# gsub():         +
+# sub():          +
+# gensub():       +
+# str~/rexp/:     -
+# switch-case //: -
+# 
+# can someone explain me:
+# 
+# why in case using match(), split(), patsplit(), gsub(), sub() and gensub() the given string "\x00" matches with the /^\0$/
+# 
+# but in cases:
+# 
+# "\x00"~/^\0$/
+# 
+# and
+# 
+# switch ( "\x00" ) { case /^\0$/: doesn't match? }
+# 
+# 
+# thank You
+# 
+# 
+# GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.0-p8, GNU MP 5.0.2)
+# Copyright (C) 1989, 1991-2014 Free Software Foundation.
+# downloaded from ezwinports
+# 
+# windows 7x64; cmd
+# 
+# 
diff --git a/gawk-5.0.1/test/regnul1.ok b/gawk-5.0.1/test/regnul1.ok
new file mode 100644
index 00000000000..2ba0e1da971
--- /dev/null
+++ b/gawk-5.0.1/test/regnul1.ok
@@ -0,0 +1,8 @@
+match():        +
+split():        +
+patsplit():     +
+gsub():         +
+sub():          +
+gensub():       +
+str~/rexp/:     +
+switch-case //: +
diff --git a/gawk-5.0.1/test/regnul2.awk b/gawk-5.0.1/test/regnul2.awk
new file mode 100644
index 00000000000..3d93df41022
--- /dev/null
+++ b/gawk-5.0.1/test/regnul2.awk
@@ -0,0 +1,112 @@
+# From denis@gissoft.eu Thu May 29 09:10:18 IDT 2014
+# Article: 8408 of comp.lang.awk
+# X-Received: by 10.182.128.166 with SMTP id np6mr93689obb.16.1401289466734;
+#         Wed, 28 May 2014 08:04:26 -0700 (PDT)
+# X-Received: by 10.140.36.6 with SMTP id o6mr4939qgo.26.1401289466607; Wed, 28
+#  May 2014 08:04:26 -0700 (PDT)
+# Path: eternal-september.org!news.eternal-september.org!feeder.eternal-september.org!news.glorb.com!c1no19185457igq.0!news-out.google.com!qf4ni13600igc.0!nntp.google.com!c1no19185454igq.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
+# Newsgroups: comp.lang.awk
+# Date: Wed, 28 May 2014 08:04:26 -0700 (PDT)
+# In-Reply-To: <lm4rra$4u9$1@dont-email.me>
+# Complaints-To: groups-abuse@google.com
+# Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=82.131.35.51; posting-account=zNhVLgoAAACsg-WfVe_or2VV7loUhx8H
+# NNTP-Posting-Host: 82.131.35.51
+# References: <3112e356-d2e1-45cd-ba55-2f939ee50105@googlegroups.com>
+#  <lm34d7$tb4$1@news.m-online.net> <f666871f-a94c-4505-9677-8711d656433c@googlegroups.com>
+#  <lm4rra$4u9$1@dont-email.me>
+# User-Agent: G2/1.0
+# MIME-Version: 1.0
+# Message-ID: <79828a24-d265-4e88-8de1-e61ecbaa6701@googlegroups.com>
+# Subject: Re: \0 character can't be implement inside regexp in some cases?
+# From: Denis Shirokov <denis@gissoft.eu>
+# Injection-Date: Wed, 28 May 2014 15:04:26 +0000
+# Content-Type: text/plain; charset=ISO-8859-1
+# Xref: news.eternal-september.org comp.lang.awk:8408
+# 
+# 
+#  All of the other use-cases just cluttered up your posting. 
+# 
+# oh, really?
+# 
+# 1. where in the Janis code the case with the `switch-case'?
+# 2. how do you know about that there is only two cases? may be you know it because my code contains the other test cases?
+# 3. fine. do you know what situation with the dynamic regexps? no?
+# 4. do you know what situation with RS,FS and /.../ in the middle-area? how you can say that there is only two cases if you absolutely do not know it?
+# 
+# i'm asking: WHO will perform testing other cases? You? gawk-team? the God?
+# what is that point of view: that it will be enough to say:
+# Oh! my match(t,/^\0$/) is matching "\x00" but t~/^\0$/ is not. why oh why?
+# 
+# where is the test cover? or you think that other peoples will doing its instead of You? instead of Me?
+# 
+# and the second point: guys you are screaming about two levels of stack. really,  you kidding? =)
+# 
+# however, i'm attaching some additional information about dynrexp:
+# 
+func	_chmd(t,r) {
+	_ch("match()",match(t,r))
+	_ch("split()",split(t,A,r)>1)
+	_ch("patsplit()",patsplit(t,A,r))
+	_ch("gsub()",gsub(r,"&",t))
+	t2=t; _ch("sub()",sub(r,"&",t2))
+	_ch("gensub()",!gensub(r,"","G",t))
+	_ch("str~/rexp/",t~r)
+	# switch-case is not applicable with dynrxp
+	_conline() }
+
+func	_ch(fn,bool) {
+	print substr(fn ":                ",1,16) (bool ? "+" : "-") }
+
+func	_conline() {
+	print "__________________________"; print }
+
+BEGIN{ _chmd("\x01","^\1$")     #testing that all doings right; all match
+	_chmd("\x00","^\1$")      #testing that all doings right; all not match
+	_chmd("\x00","^\0$")      #tesing dynrexp
+}
+# 
+# output:
+# 
+# match():        +
+# split():        +
+# patsplit():     +
+# gsub():         +
+# sub():          +
+# gensub():       +
+# str~/rexp/:     +
+# __________________________
+# 
+# match():        -
+# split():        -
+# patsplit():     -
+# gsub():         -
+# sub():          -
+# gensub():       -
+# str~/rexp/:     -
+# __________________________
+# 
+# match():        +
+# split():        +
+# patsplit():     +
+# gsub():         +
+# sub():          +
+# gensub():       +
+# str~/rexp/:     -
+# 
+# it's looks like with the dynamic regexp the same story.
+# 
+# i found another one moment that is possible near with the reason of this issue:
+# 
+# i was testing what characters can be present in doublestring and regexp "directly" (just as the character) and what characters must be present as escape sequence (\qqq)
+# 
+# so, i found the following:
+# 
+# t="abc"
+# if ( match(t,/^abc[NUL]def/) ) ... - where [NUL] is the character \x00 
+# 
+# it's seems that in that case the regular expression is processed until [NUL]character and the other part is ignored because the example above gives TRUE
+# 
+# friendship
+# Denis Shirokov
+# 
+# 
diff --git a/gawk-5.0.1/test/regnul2.ok b/gawk-5.0.1/test/regnul2.ok
new file mode 100644
index 00000000000..6b3cecab1fa
--- /dev/null
+++ b/gawk-5.0.1/test/regnul2.ok
@@ -0,0 +1,27 @@
+match():        +
+split():        +
+patsplit():     +
+gsub():         +
+sub():          +
+gensub():       +
+str~/rexp/:     +
+__________________________
+
+match():        -
+split():        -
+patsplit():     -
+gsub():         -
+sub():          -
+gensub():       -
+str~/rexp/:     -
+__________________________
+
+match():        +
+split():        +
+patsplit():     +
+gsub():         +
+sub():          +
+gensub():       +
+str~/rexp/:     +
+__________________________
+
diff --git a/gawk-5.0.1/test/regrange.awk b/gawk-5.0.1/test/regrange.awk
new file mode 100644
index 00000000000..71879316651
--- /dev/null
+++ b/gawk-5.0.1/test/regrange.awk
@@ -0,0 +1,30 @@
+# Tests due to John Haque, May 2011
+#
+# The following should be fatal; can't catch them inside awk, though
+# $> echo 'a' | ./gawk '/[z-a]/ { print }'
+# $> echo 'A' | ./gawk '/[+-[:digit:]]/'
+
+BEGIN {
+	char[1] = "."
+	pat[1] = "[--\\/]"
+
+	char[2] = "a"
+	pat[2] = "[]-c]"
+
+	char[3] = "c"
+	pat[3] = "[[a-d]"
+
+	char[4] = "\\"
+	pat[4] = "[\\[-\\]]"
+
+	char[5] = "[.c.]"
+	pat[5] = "[a-[.e.]]"
+
+	char[6] = "[.d.]"
+	pat[6] = "[[.c.]-[.z.]]"
+
+	for (i = 1; i in char; i++) {
+		printf("\"%s\" ~ /%s/ --> %d\n", char[i], pat[i],
+			char[i] ~ pat[i])
+	}
+}
diff --git a/gawk-5.0.1/test/regrange.ok b/gawk-5.0.1/test/regrange.ok
new file mode 100644
index 00000000000..ae8c649954d
--- /dev/null
+++ b/gawk-5.0.1/test/regrange.ok
@@ -0,0 +1,6 @@
+"." ~ /[--\/]/ --> 1
+"a" ~ /[]-c]/ --> 1
+"c" ~ /[[a-d]/ --> 1
+"\" ~ /[\[-\]]/ --> 1
+"[.c.]" ~ /[a-[.e.]]/ --> 1
+"[.d.]" ~ /[[.c.]-[.z.]]/ --> 1
diff --git a/gawk-5.0.1/test/regtest.sh b/gawk-5.0.1/test/regtest.sh
new file mode 100755
index 00000000000..37472b1c711
--- /dev/null
+++ b/gawk-5.0.1/test/regtest.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+case "$AWK" in
+"")	AWK=../gawk ;;
+esac
+#AWK=${AWK:-../gawk}
+
+for i in reg/*.awk
+do
+	it=`basename $i .awk`
+	$AWK -f $i <reg/$it.in >reg/$it.out 2>&1
+	if diff reg/$it.out reg/$it.good
+	then
+		rm -f reg/$it.out
+	else
+		echo "regtest: $it fails"
+	fi
+done
diff --git a/gawk-5.0.1/test/regx8bit.awk b/gawk-5.0.1/test/regx8bit.awk
new file mode 100644
index 00000000000..5ecd7eb285d
--- /dev/null
+++ b/gawk-5.0.1/test/regx8bit.awk
@@ -0,0 +1,26 @@
+# The full test will only work in a Swedish localte
+# Try things that should work across the board
+# BEGIN {
+# 	s = "s� �r det"
+# 	print match(s,/\ys�\y/), s ~ /\ys�\y/, "�" ~ /\w/
+# }
+BEGIN {
+	printf "\"�\" = %c\n", "�"
+	printf "\"�\" = %c\n", "�"
+	s = "s� �r det"
+	printf "s = \"%s\"\n", s
+	printf "match(s,/\\ys�/) = %d\n", match(s, /\ys�/)
+# 	printf "match(s,/s�\\y/) = %d\n", match(s, /s�\y/)
+# 	printf "match(s,/\\ys�\\y/) = %d\n", match(s, /\ys�\y/)
+	printf "s ~ /�/ = %d\n", s ~ /�/
+	printf "s ~ /s�/ = %d\n", s ~ /s�/
+	printf "s ~ /\\ys�/ = %d\n", s ~ /\ys�/
+# 	printf "s ~ /s�\\y/ = %d\n", s ~ /s�\y/
+# 	printf "s ~ /\\ys�\\y/ = %d\n", s ~ /\ys�\y/
+# 	printf "\"�\" ~ /\\w/ = %d\n", "�" ~ /\w/
+# 	printf "\"�\" ~ /\\w/ = %d\n", "�" ~ /\w/
+# 	printf "\"�\" ~ /\\y�\\y/ = %d\n", "�" ~ /\y�\y/
+# 	printf "\"�\" ~ /\\y�\\y/ = %d\n", "�" ~ /\y�\y/
+# 	printf "\"�\" ~ /[[:alpha:]]/ = %d\n", "�" ~ /[[:alpha:]]/
+# 	printf "\"�\" ~ /[[:alpha:]]/ = %d\n", "�" ~ /[[:alpha:]]/
+}
diff --git a/gawk-5.0.1/test/regx8bit.ok b/gawk-5.0.1/test/regx8bit.ok
new file mode 100644
index 00000000000..76e1c0b1d8e
--- /dev/null
+++ b/gawk-5.0.1/test/regx8bit.ok
@@ -0,0 +1,7 @@
+"�" = �
+"�" = �
+s = "s� �r det"
+match(s,/\ys�/) = 1
+s ~ /�/ = 1
+s ~ /s�/ = 1
+s ~ /\ys�/ = 1
diff --git a/gawk-5.0.1/test/reindops.awk b/gawk-5.0.1/test/reindops.awk
new file mode 100644
index 00000000000..13ae6576657
--- /dev/null
+++ b/gawk-5.0.1/test/reindops.awk
@@ -0,0 +1,6 @@
+{ 
+	if ($1 !~ /^+[2-9]/)
+		print "gawk is broken"
+	else
+		print "gawk is ok"
+}
diff --git a/gawk-5.0.1/test/reindops.in b/gawk-5.0.1/test/reindops.in
new file mode 100644
index 00000000000..b1e543536e3
--- /dev/null
+++ b/gawk-5.0.1/test/reindops.in
@@ -0,0 +1 @@
++44 123 456
diff --git a/gawk-5.0.1/test/reindops.ok b/gawk-5.0.1/test/reindops.ok
new file mode 100644
index 00000000000..f9605fd36a1
--- /dev/null
+++ b/gawk-5.0.1/test/reindops.ok
@@ -0,0 +1 @@
+gawk is ok
diff --git a/gawk-5.0.1/test/reint.awk b/gawk-5.0.1/test/reint.awk
new file mode 100644
index 00000000000..add0f2ac07f
--- /dev/null
+++ b/gawk-5.0.1/test/reint.awk
@@ -0,0 +1 @@
+{ print match($0, /a{3}/) }
diff --git a/gawk-5.0.1/test/reint.in b/gawk-5.0.1/test/reint.in
new file mode 100644
index 00000000000..43caa2a71ec
--- /dev/null
+++ b/gawk-5.0.1/test/reint.in
@@ -0,0 +1 @@
+match this: aaa
diff --git a/gawk-5.0.1/test/reint.ok b/gawk-5.0.1/test/reint.ok
new file mode 100644
index 00000000000..b1bd38b62a0
--- /dev/null
+++ b/gawk-5.0.1/test/reint.ok
@@ -0,0 +1 @@
+13
diff --git a/gawk-5.0.1/test/reint2.awk b/gawk-5.0.1/test/reint2.awk
new file mode 100644
index 00000000000..f9269dd8454
--- /dev/null
+++ b/gawk-5.0.1/test/reint2.awk
@@ -0,0 +1 @@
+/^([[:digit:]]+[[:space:]]+){2}/
diff --git a/gawk-5.0.1/test/reint2.in b/gawk-5.0.1/test/reint2.in
new file mode 100644
index 00000000000..b85905ec0b9
--- /dev/null
+++ b/gawk-5.0.1/test/reint2.in
@@ -0,0 +1 @@
+1 2 3
diff --git a/gawk-5.0.1/test/reint2.ok b/gawk-5.0.1/test/reint2.ok
new file mode 100644
index 00000000000..b85905ec0b9
--- /dev/null
+++ b/gawk-5.0.1/test/reint2.ok
@@ -0,0 +1 @@
+1 2 3
diff --git a/gawk-5.0.1/test/reparse.awk b/gawk-5.0.1/test/reparse.awk
new file mode 100644
index 00000000000..433ecbb2d69
--- /dev/null
+++ b/gawk-5.0.1/test/reparse.awk
@@ -0,0 +1,7 @@
+{
+	gsub(/x/, " ")
+	$0 = $0
+	print $1
+	print $0
+	print $1, $2, $3
+}
diff --git a/gawk-5.0.1/test/reparse.in b/gawk-5.0.1/test/reparse.in
new file mode 100644
index 00000000000..6f31cde8444
--- /dev/null
+++ b/gawk-5.0.1/test/reparse.in
@@ -0,0 +1 @@
+1 axbxc 2
diff --git a/gawk-5.0.1/test/reparse.ok b/gawk-5.0.1/test/reparse.ok
new file mode 100644
index 00000000000..6bdfacfa910
--- /dev/null
+++ b/gawk-5.0.1/test/reparse.ok
@@ -0,0 +1,3 @@
+1
+1 a b c 2
+1 a b
diff --git a/gawk-5.0.1/test/resplit.awk b/gawk-5.0.1/test/resplit.awk
new file mode 100644
index 00000000000..f75fe3970d2
--- /dev/null
+++ b/gawk-5.0.1/test/resplit.awk
@@ -0,0 +1 @@
+{ FS = ":"; $0 = $0; print $2 }
diff --git a/gawk-5.0.1/test/resplit.in b/gawk-5.0.1/test/resplit.in
new file mode 100644
index 00000000000..5f06f10bf43
--- /dev/null
+++ b/gawk-5.0.1/test/resplit.in
@@ -0,0 +1 @@
+a:b:c d:e:f
diff --git a/gawk-5.0.1/test/resplit.ok b/gawk-5.0.1/test/resplit.ok
new file mode 100644
index 00000000000..61780798228
--- /dev/null
+++ b/gawk-5.0.1/test/resplit.ok
@@ -0,0 +1 @@
+b
diff --git a/gawk-5.0.1/test/revout.awk b/gawk-5.0.1/test/revout.awk
new file mode 100644
index 00000000000..25f62fc7f7b
--- /dev/null
+++ b/gawk-5.0.1/test/revout.awk
@@ -0,0 +1,6 @@
+@load "revoutput"
+
+BEGIN {
+	REVOUT = 1
+	print "hello, world" > "/dev/stdout"
+}
diff --git a/gawk-5.0.1/test/revout.ok b/gawk-5.0.1/test/revout.ok
new file mode 100644
index 00000000000..8101cb93082
--- /dev/null
+++ b/gawk-5.0.1/test/revout.ok
@@ -0,0 +1 @@
+dlrow ,olleh
diff --git a/gawk-5.0.1/test/revtwoway.awk b/gawk-5.0.1/test/revtwoway.awk
new file mode 100644
index 00000000000..05bded5a1d1
--- /dev/null
+++ b/gawk-5.0.1/test/revtwoway.awk
@@ -0,0 +1,11 @@
+@load "revtwoway"
+
+BEGIN {
+	cmd = "/magic/mirror"
+
+	print "hello, world" |& cmd
+	cmd |& getline line
+
+	printf("got back: <%s>, RT = <%s>\n", line, RT)
+	close(cmd)
+}
diff --git a/gawk-5.0.1/test/revtwoway.ok b/gawk-5.0.1/test/revtwoway.ok
new file mode 100644
index 00000000000..b8a5ff31a80
--- /dev/null
+++ b/gawk-5.0.1/test/revtwoway.ok
@@ -0,0 +1,2 @@
+got back: <dlrow ,olleh>, RT = <
+>
diff --git a/gawk-5.0.1/test/rri1.awk b/gawk-5.0.1/test/rri1.awk
new file mode 100644
index 00000000000..889dbdcb4e8
--- /dev/null
+++ b/gawk-5.0.1/test/rri1.awk
@@ -0,0 +1 @@
+/[d-f]/
diff --git a/gawk-5.0.1/test/rri1.in b/gawk-5.0.1/test/rri1.in
new file mode 100644
index 00000000000..28b6b408d1f
--- /dev/null
+++ b/gawk-5.0.1/test/rri1.in
@@ -0,0 +1 @@
+no match: �
diff --git a/gawk-5.0.1/test/rri1.ok b/gawk-5.0.1/test/rri1.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/rs.awk b/gawk-5.0.1/test/rs.awk
new file mode 100644
index 00000000000..d3a3cf0421f
--- /dev/null
+++ b/gawk-5.0.1/test/rs.awk
@@ -0,0 +1,2 @@
+BEGIN { RS = "" }
+{ print $1, $2 }
diff --git a/gawk-5.0.1/test/rs.in b/gawk-5.0.1/test/rs.in
new file mode 100644
index 00000000000..edef835e030
--- /dev/null
+++ b/gawk-5.0.1/test/rs.in
@@ -0,0 +1,15 @@
+
+
+a
+b
+
+
+c d
+
+
+
+e
+
+
+
+
diff --git a/gawk-5.0.1/test/rs.ok b/gawk-5.0.1/test/rs.ok
new file mode 100644
index 00000000000..9dd6bd39282
--- /dev/null
+++ b/gawk-5.0.1/test/rs.ok
@@ -0,0 +1,3 @@
+a b
+c d
+e 
diff --git a/gawk-5.0.1/test/rscompat.awk b/gawk-5.0.1/test/rscompat.awk
new file mode 100644
index 00000000000..9415c704ac7
--- /dev/null
+++ b/gawk-5.0.1/test/rscompat.awk
@@ -0,0 +1,2 @@
+BEGIN { RS = "bar" }
+{ print $1, $2 }
diff --git a/gawk-5.0.1/test/rscompat.in b/gawk-5.0.1/test/rscompat.in
new file mode 100644
index 00000000000..eb337e58978
--- /dev/null
+++ b/gawk-5.0.1/test/rscompat.in
@@ -0,0 +1,2 @@
+0foobar0faz
+1foobar1faz
diff --git a/gawk-5.0.1/test/rscompat.ok b/gawk-5.0.1/test/rscompat.ok
new file mode 100644
index 00000000000..19cd9fbe43c
--- /dev/null
+++ b/gawk-5.0.1/test/rscompat.ok
@@ -0,0 +1,3 @@
+0foo 
+ar0faz 1foo
+ar1faz 
diff --git a/gawk-5.0.1/test/rsgetline.awk b/gawk-5.0.1/test/rsgetline.awk
new file mode 100644
index 00000000000..fa327fcf677
--- /dev/null
+++ b/gawk-5.0.1/test/rsgetline.awk
@@ -0,0 +1,23 @@
+# Date: Sun, 4 May 2014 18:09:01 +0200
+# From: Davide Brini <dave_br@gmx.com>
+# To: bug-gawk@gnu.org
+# Subject: Re: [bug-gawk] Computed regex and getline bug / issue
+# 
+# I have been able to reduce the behavior to these simple test cases, which
+# (unless I'm missing something obvious) should behave identically but don't:
+# 
+# $ printf '1,2,' | gawk 'BEGIN{RS="[,]+"}{print; a = getline; print "-"a"-"; print}'
+# 1
+# -0-
+# 1
+
+BEGIN {
+	RS = "[,]+"
+}
+
+{
+	printf "[%s] [%s]\n", $0, RT
+	a = getline
+	print "-"a"-"
+	printf "[%s] [%s]\n", $0, RT
+}
diff --git a/gawk-5.0.1/test/rsgetline.in b/gawk-5.0.1/test/rsgetline.in
new file mode 100644
index 00000000000..f17823464ca
--- /dev/null
+++ b/gawk-5.0.1/test/rsgetline.in
@@ -0,0 +1 @@
+1,2,
\ No newline at end of file
diff --git a/gawk-5.0.1/test/rsgetline.ok b/gawk-5.0.1/test/rsgetline.ok
new file mode 100644
index 00000000000..1388369aa11
--- /dev/null
+++ b/gawk-5.0.1/test/rsgetline.ok
@@ -0,0 +1,3 @@
+[1] [,]
+-1-
+[2] [,]
diff --git a/gawk-5.0.1/test/rsglstdin.ok b/gawk-5.0.1/test/rsglstdin.ok
new file mode 100644
index 00000000000..1388369aa11
--- /dev/null
+++ b/gawk-5.0.1/test/rsglstdin.ok
@@ -0,0 +1,3 @@
+[1] [,]
+-1-
+[2] [,]
diff --git a/gawk-5.0.1/test/rsnul1nl.awk b/gawk-5.0.1/test/rsnul1nl.awk
new file mode 100644
index 00000000000..d8da7a64bab
--- /dev/null
+++ b/gawk-5.0.1/test/rsnul1nl.awk
@@ -0,0 +1,2 @@
+BEGIN { RS = "" }
+{ print }
diff --git a/gawk-5.0.1/test/rsnul1nl.in b/gawk-5.0.1/test/rsnul1nl.in
new file mode 100644
index 00000000000..76de96fcf36
--- /dev/null
+++ b/gawk-5.0.1/test/rsnul1nl.in
@@ -0,0 +1,3 @@
+
+This is...
+the first record.
diff --git a/gawk-5.0.1/test/rsnul1nl.ok b/gawk-5.0.1/test/rsnul1nl.ok
new file mode 100644
index 00000000000..7ce0957b3cd
--- /dev/null
+++ b/gawk-5.0.1/test/rsnul1nl.ok
@@ -0,0 +1,2 @@
+This is...
+the first record.
diff --git a/gawk-5.0.1/test/rsnulbig.ok b/gawk-5.0.1/test/rsnulbig.ok
new file mode 100644
index 00000000000..10a52093dde
--- /dev/null
+++ b/gawk-5.0.1/test/rsnulbig.ok
@@ -0,0 +1 @@
+16386
diff --git a/gawk-5.0.1/test/rsnulbig2.ok b/gawk-5.0.1/test/rsnulbig2.ok
new file mode 100644
index 00000000000..0cfbf08886f
--- /dev/null
+++ b/gawk-5.0.1/test/rsnulbig2.ok
@@ -0,0 +1 @@
+2
diff --git a/gawk-5.0.1/test/rsstart1.awk b/gawk-5.0.1/test/rsstart1.awk
new file mode 100644
index 00000000000..53e5b425195
--- /dev/null
+++ b/gawk-5.0.1/test/rsstart1.awk
@@ -0,0 +1,32 @@
+# From arnold@f7.net  Wed Dec 15 11:32:46 2004
+# Date: Tue, 14 Dec 2004 14:48:58 +0100
+# From: Stepan Kasal <kasal@ucw.cz>
+# Subject: gawk bug with RS="^..."
+# To: bug-gawk@gnu.org
+# Message-id: <20041214134858.GA15490@matsrv.math.cas.cz>
+# 
+# Hello,
+#   I've noticed a problem with "^" in RS in gawk.  In most cases, it seems
+# to match only the beginning of the file.  But in fact it matches the
+# beginning of gawk's internal buffer.
+# 
+# Observe the following example:
+# 
+# $ gawk 'BEGIN{for(i=1;i<=100;i++) print "Axxxxxx"}' >file
+# $ gawk 'BEGIN{RS="^A"} END{print NR}' file
+# 2
+# $ gawk 'BEGIN{RS="^Ax*\n"} END{print NR}' file
+# 100
+# $ head file | gawk 'BEGIN{RS="^Ax*\n"} END{print NR}'
+# 10
+# $
+# 
+# I think this calls for some clarification/fix.  But I don't have any
+# fixed opinion how the solution should look like.
+# 
+# Have a nice day,
+#         Stepan Kasal
+# 
+# PS: See also the discussion of the issue in the comp.lang.awk newsgroup.
+BEGIN { RS = "^A" }
+END { print NR }
diff --git a/gawk-5.0.1/test/rsstart1.in b/gawk-5.0.1/test/rsstart1.in
new file mode 100644
index 00000000000..aabdf028f1b
--- /dev/null
+++ b/gawk-5.0.1/test/rsstart1.in
@@ -0,0 +1,10000 @@
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
diff --git a/gawk-5.0.1/test/rsstart1.ok b/gawk-5.0.1/test/rsstart1.ok
new file mode 100644
index 00000000000..0cfbf08886f
--- /dev/null
+++ b/gawk-5.0.1/test/rsstart1.ok
@@ -0,0 +1 @@
+2
diff --git a/gawk-5.0.1/test/rsstart2.awk b/gawk-5.0.1/test/rsstart2.awk
new file mode 100644
index 00000000000..14c141534ce
--- /dev/null
+++ b/gawk-5.0.1/test/rsstart2.awk
@@ -0,0 +1,2 @@
+BEGIN { RS = "^Ax*\n" }
+END { print NR }
diff --git a/gawk-5.0.1/test/rsstart2.in b/gawk-5.0.1/test/rsstart2.in
new file mode 100644
index 00000000000..aabdf028f1b
--- /dev/null
+++ b/gawk-5.0.1/test/rsstart2.in
@@ -0,0 +1,10000 @@
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
+Axxxxxx
diff --git a/gawk-5.0.1/test/rsstart2.ok b/gawk-5.0.1/test/rsstart2.ok
new file mode 100644
index 00000000000..0cfbf08886f
--- /dev/null
+++ b/gawk-5.0.1/test/rsstart2.ok
@@ -0,0 +1 @@
+2
diff --git a/gawk-5.0.1/test/rsstart3.ok b/gawk-5.0.1/test/rsstart3.ok
new file mode 100644
index 00000000000..0cfbf08886f
--- /dev/null
+++ b/gawk-5.0.1/test/rsstart3.ok
@@ -0,0 +1 @@
+2
diff --git a/gawk-5.0.1/test/rstest1.awk b/gawk-5.0.1/test/rstest1.awk
new file mode 100644
index 00000000000..3eb88366cd6
--- /dev/null
+++ b/gawk-5.0.1/test/rstest1.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	RS = ""
+	FS = ":"
+	s = "a:b\nc:d"
+	print split(s,a)
+	print length(a[2])
+}
diff --git a/gawk-5.0.1/test/rstest1.ok b/gawk-5.0.1/test/rstest1.ok
new file mode 100644
index 00000000000..a5c8806279f
--- /dev/null
+++ b/gawk-5.0.1/test/rstest1.ok
@@ -0,0 +1,2 @@
+3
+3
diff --git a/gawk-5.0.1/test/rstest2.awk b/gawk-5.0.1/test/rstest2.awk
new file mode 100644
index 00000000000..5ed4701d6b6
--- /dev/null
+++ b/gawk-5.0.1/test/rstest2.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	RS = ""
+	FS = "\\"
+	$0 = "a\\b"
+	print $1
+}
diff --git a/gawk-5.0.1/test/rstest2.ok b/gawk-5.0.1/test/rstest2.ok
new file mode 100644
index 00000000000..78981922613
--- /dev/null
+++ b/gawk-5.0.1/test/rstest2.ok
@@ -0,0 +1 @@
+a
diff --git a/gawk-5.0.1/test/rstest3.awk b/gawk-5.0.1/test/rstest3.awk
new file mode 100644
index 00000000000..3238ffa2671
--- /dev/null
+++ b/gawk-5.0.1/test/rstest3.awk
@@ -0,0 +1,73 @@
+# From spcecdt@armory.com  Tue Apr 15 17:35:01 2003
+# Return-Path: <spcecdt@armory.com>
+# Received: from localhost (aahz [127.0.0.1])
+# 	by skeeve.com (8.12.5/8.12.5) with ESMTP id h3FEYA6o001541
+# 	for <arnold@localhost>; Tue, 15 Apr 2003 17:35:01 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Tue, 15 Apr 2003 17:35:01 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Tue Apr 15 17:38:46 2003)
+# X-From_: spcecdt@armory.com Tue Apr 15 11:09:12 2003
+# Received: from smtp1.actcom.net.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id h3F88uC19825 for <arobbins@actcom.co.il>;
+# 	Tue, 15 Apr 2003 11:09:04 +0300 (EET DST)  
+# 	(rfc931-sender: smtp.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by smtp1.actcom.net.il (8.12.8/8.12.8) with ESMTP id h3F8CgQ7019081
+# 	for <arobbins@actcom.co.il>; Tue, 15 Apr 2003 11:12:47 +0300
+# Received: from fencepost.gnu.org (fencepost.gnu.org [199.232.76.164])
+# 	by f7.net (8.11.7/8.11.6) with ESMTP id h3F88oW23381
+# 	for <arnold@skeeve.com>; Tue, 15 Apr 2003 04:08:50 -0400
+# Received: from monty-python.gnu.org ([199.232.76.173])
+# 	by fencepost.gnu.org with esmtp (Exim 4.10)
+# 	id 195LUo-0001cv-00
+# 	for bug-gawk@gnu.org; Tue, 15 Apr 2003 04:08:50 -0400
+# Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.10.13)
+# 	id 195LUh-0006n0-00
+# 	for bug-gawk@gnu.org; Tue, 15 Apr 2003 04:08:44 -0400
+# Received: from deepthought.armory.com ([192.122.209.42] helo=armory.com)
+# 	by monty-python.gnu.org with smtp (Exim 4.10.13)
+# 	id 195LUC-0006JM-00
+# 	for bug-gawk@gnu.org; Tue, 15 Apr 2003 04:08:13 -0400
+# Date: Tue, 15 Apr 2003 01:08:11 -0700
+# From: "John H. DuBois III" <spcecdt@armory.com>
+# To: bug-gawk@gnu.org
+# Subject: gawk 3.1.2 fatal bug
+# Message-ID: <20030415080811.GA14963@armory.com>
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# Content-Disposition: inline
+# User-Agent: Mutt/1.3.28i
+# X-Www: http://www.armory.com./~spcecdt/
+# Sender: spcecdt@armory.com
+# X-Spam-Status: No, hits=-7.9 required=5.0
+# 	tests=SIGNATURE_SHORT_DENSE,SPAM_PHRASE_01_02,USER_AGENT,
+# 	      USER_AGENT_MUTT
+# 	version=2.41
+# X-Spam-Level: 
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: RO
+# 
+# This program:
+# 
+#     BEGIN { RS = ""; "/bin/echo -n x" | getline }
+# 
+# fails in exactly the same way under SCO OpenServer 5.0.6a using gawk 3.1.2
+# built with gcc 2.95.3 and linux using gawk 3.1.2 built with gcc 3.2.2:
+# 
+# gawk: gawktest:1: fatal error: internal error
+# Abort
+# 
+# The same program does not fail with gawk 3.1.1.
+# 
+# 	John
+# -- 
+# John DuBois  spcecdt@armory.com  KC6QKZ/AE  http://www.armory.com/~spcecdt/
+# 
+# 
+BEGIN {
+	RS = ""
+	"echo x | tr -d '\\12'" | getline
+}
diff --git a/gawk-5.0.1/test/rstest3.ok b/gawk-5.0.1/test/rstest3.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/rstest4.awk b/gawk-5.0.1/test/rstest4.awk
new file mode 100644
index 00000000000..ddf06917a85
--- /dev/null
+++ b/gawk-5.0.1/test/rstest4.awk
@@ -0,0 +1,67 @@
+# From spcecdt@armory.com  Mon May  5 14:37:09 2003
+# Return-Path: <spcecdt@armory.com>
+# Received: from localhost (skeeve [127.0.0.1])
+# 	by skeeve.com (8.12.5/8.12.5) with ESMTP id h45B1GvT031993
+# 	for <arnold@localhost>; Mon, 5 May 2003 14:37:09 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Mon, 05 May 2003 14:37:09 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Mon May  5 14:35:11 2003)
+# X-From_: spcecdt@armory.com Mon May  5 12:20:20 2003
+# Received: from smtp1.actcom.net.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id h459KC529186 for <arobbins@actcom.co.il>;
+# 	Mon, 5 May 2003 12:20:15 +0300 (EET DST)  
+# 	(rfc931-sender: smtp.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by smtp1.actcom.net.il (8.12.8/8.12.8) with ESMTP id h459LMfl025854
+# 	for <arobbins@actcom.co.il>; Mon, 5 May 2003 12:21:24 +0300
+# Received: from armory.com (deepthought.armory.com [192.122.209.42])
+# 	by f7.net (8.11.7/8.11.6) with SMTP id h459K9I26841
+# 	for <arnold@skeeve.com>; Mon, 5 May 2003 05:20:09 -0400
+# Date: Mon, 5 May 2003 02:20:08 -0700
+# From: "John H. DuBois III" <spcecdt@armory.com>
+# To: Aharon Robbins <arnold@skeeve.com>
+# Subject: Re: gawk 3.1.2b now available
+# Message-ID: <20030505092008.GA15970@armory.com>
+# References: <200305041149.h44BnLcm005484@localhost.localdomain>
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# Content-Disposition: inline
+# In-Reply-To: <200305041149.h44BnLcm005484@localhost.localdomain>
+# User-Agent: Mutt/1.3.28i
+# X-Www: http://www.armory.com./~spcecdt/
+# Sender: spcecdt@armory.com
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: RO
+# 
+# This is a curious one:
+# 
+# gawk-3.1.2b 'BEGIN {
+#     while (("echo" | getline) == 1)
+# 	;
+#     RS = ""
+#     "echo \"a\n\nb\"" | getline y
+#     print x
+# }' | hd
+# 
+# The output is:
+# 
+# 0000    00 13 0a                                           ...
+# 0003
+# 
+# (the uninitialized variable 'x' is somehow getting the value <null><control-S>)
+# 
+# 	John
+# -- 
+# John DuBois  spcecdt@armory.com  KC6QKZ/AE  http://www.armory.com/~spcecdt/
+# 
+BEGIN {
+    while (("echo" | getline) == 1)
+	;
+    RS = ""
+    "echo \"a\n\nb\"" | getline y
+    printf "y = <%s>\n", y	# ADR
+    printf "x = <%s>\n", x	# ADR
+}
diff --git a/gawk-5.0.1/test/rstest4.ok b/gawk-5.0.1/test/rstest4.ok
new file mode 100644
index 00000000000..430442fb548
--- /dev/null
+++ b/gawk-5.0.1/test/rstest4.ok
@@ -0,0 +1,2 @@
+y = <a>
+x = <>
diff --git a/gawk-5.0.1/test/rstest5.awk b/gawk-5.0.1/test/rstest5.awk
new file mode 100644
index 00000000000..09abb4a09c3
--- /dev/null
+++ b/gawk-5.0.1/test/rstest5.awk
@@ -0,0 +1,60 @@
+# From spcecdt@armory.com  Tue May  6 13:42:34 2003
+# Return-Path: <spcecdt@armory.com>
+# Received: from localhost (aahz [127.0.0.1])
+# 	by skeeve.com (8.12.5/8.12.5) with ESMTP id h46AgG53003519
+# 	for <arnold@localhost>; Tue, 6 May 2003 13:42:34 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Tue, 06 May 2003 13:42:34 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Tue May  6 13:48:46 2003)
+# X-From_: spcecdt@armory.com Tue May  6 13:26:09 2003
+# Received: from smtp1.actcom.net.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id h46AQ6520133 for <arobbins@actcom.co.il>;
+# 	Tue, 6 May 2003 13:26:07 +0300 (EET DST)  
+# 	(rfc931-sender: lmail.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by smtp1.actcom.net.il (8.12.8/8.12.8) with ESMTP id h46ARSfl010998
+# 	for <arobbins@actcom.co.il>; Tue, 6 May 2003 13:27:31 +0300
+# Received: from armory.com (deepthought.armory.com [192.122.209.42])
+# 	by f7.net (8.11.7/8.11.6) with SMTP id h46AQ1I18183
+# 	for <arnold@skeeve.com>; Tue, 6 May 2003 06:26:01 -0400
+# Date: Tue, 6 May 2003 03:25:59 -0700
+# From: "John H. DuBois III" <spcecdt@armory.com>
+# To: Aharon Robbins <arnold@skeeve.com>
+# Subject: Re: gawk 3.1.2b now available
+# Message-ID: <20030506102559.GA16105@armory.com>
+# References: <200305051157.h45Bv4XO003106@localhost.localdomain>
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# Content-Disposition: inline
+# In-Reply-To: <200305051157.h45Bv4XO003106@localhost.localdomain>
+# User-Agent: Mutt/1.3.28i
+# X-Www: http://www.armory.com./~spcecdt/
+# Sender: spcecdt@armory.com
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: RO
+# 
+# The patch fixed the previous case, but here's another one - this prints
+# <null><control-S>:
+# 
+# BEGIN {
+#     RS = ""
+#     "echo 'foo\n\nbaz'" | getline
+#     "echo 'foo\n\nbaz'" | getline
+#     "echo 'bar\n\nbaz'" | getline
+#     print x
+# }
+# 
+# 	John
+# -- 
+# John DuBois  spcecdt@armory.com  KC6QKZ/AE  http://www.armory.com/~spcecdt/
+# 
+BEGIN {
+    RS = ""
+    "echo 'foo\n\nbaz'" | getline ; print
+    "echo 'foo\n\nbaz'" | getline ; print
+    "echo 'bar\n\nbaz'" | getline ; print
+    printf "x = <%s>\n", x
+}
diff --git a/gawk-5.0.1/test/rstest5.ok b/gawk-5.0.1/test/rstest5.ok
new file mode 100644
index 00000000000..bf4515111c1
--- /dev/null
+++ b/gawk-5.0.1/test/rstest5.ok
@@ -0,0 +1,4 @@
+foo
+baz
+bar
+x = <>
diff --git a/gawk-5.0.1/test/rstest6.awk b/gawk-5.0.1/test/rstest6.awk
new file mode 100644
index 00000000000..3481c0a3fa1
--- /dev/null
+++ b/gawk-5.0.1/test/rstest6.awk
@@ -0,0 +1,6 @@
+# Wed Jul 14 16:02:45 IDT 2004
+# Test case from John Haque mary1john8@earthlink.net
+
+BEGIN { RS = "XYZ" }
+
+{ print }
diff --git a/gawk-5.0.1/test/rstest6.in b/gawk-5.0.1/test/rstest6.in
new file mode 100644
index 00000000000..a6bddc4a144
--- /dev/null
+++ b/gawk-5.0.1/test/rstest6.in
@@ -0,0 +1 @@
+ABCD
\ No newline at end of file
diff --git a/gawk-5.0.1/test/rstest6.ok b/gawk-5.0.1/test/rstest6.ok
new file mode 100644
index 00000000000..9ed461429cd
--- /dev/null
+++ b/gawk-5.0.1/test/rstest6.ok
@@ -0,0 +1 @@
+ABCD
diff --git a/gawk-5.0.1/test/rswhite.awk b/gawk-5.0.1/test/rswhite.awk
new file mode 100644
index 00000000000..004876567c5
--- /dev/null
+++ b/gawk-5.0.1/test/rswhite.awk
@@ -0,0 +1,2 @@
+BEGIN { RS = "" }
+{ printf("<%s>\n", $0) }
diff --git a/gawk-5.0.1/test/rswhite.in b/gawk-5.0.1/test/rswhite.in
new file mode 100644
index 00000000000..39f77564a3c
--- /dev/null
+++ b/gawk-5.0.1/test/rswhite.in
@@ -0,0 +1,2 @@
+    a b
+c d
diff --git a/gawk-5.0.1/test/rswhite.ok b/gawk-5.0.1/test/rswhite.ok
new file mode 100644
index 00000000000..a029e47fd74
--- /dev/null
+++ b/gawk-5.0.1/test/rswhite.ok
@@ -0,0 +1,2 @@
+<    a b
+c d>
diff --git a/gawk-5.0.1/test/rtlen.ok b/gawk-5.0.1/test/rtlen.ok
new file mode 100644
index 00000000000..b8a484dff28
--- /dev/null
+++ b/gawk-5.0.1/test/rtlen.ok
@@ -0,0 +1,3 @@
+3
+5
+2
diff --git a/gawk-5.0.1/test/rtlen.sh b/gawk-5.0.1/test/rtlen.sh
new file mode 100755
index 00000000000..4a7404519d8
--- /dev/null
+++ b/gawk-5.0.1/test/rtlen.sh
@@ -0,0 +1,5 @@
+#! /bin/sh
+
+AWK=${AWK:-../gawk}
+
+$AWK 'BEGIN {printf "0\n\n\n1\n\n\n\n\n2\n\n"; exit}' | $AWK 'BEGIN {RS=""}; {print length(RT)}'
diff --git a/gawk-5.0.1/test/rtlen01.ok b/gawk-5.0.1/test/rtlen01.ok
new file mode 100644
index 00000000000..4539bbf2d22
--- /dev/null
+++ b/gawk-5.0.1/test/rtlen01.ok
@@ -0,0 +1,3 @@
+0
+1
+2
diff --git a/gawk-5.0.1/test/rtlen01.sh b/gawk-5.0.1/test/rtlen01.sh
new file mode 100755
index 00000000000..72156d9bc0d
--- /dev/null
+++ b/gawk-5.0.1/test/rtlen01.sh
@@ -0,0 +1,8 @@
+#! /bin/sh
+
+AWK=${AWK:-../gawk}
+
+$AWK 'BEGIN {printf "0"; exit}' | $AWK 'BEGIN {RS=""}; {print length(RT)}'
+$AWK 'BEGIN {printf "0\n"; exit}' | $AWK 'BEGIN {RS=""}; {print length(RT)}'
+$AWK 'BEGIN {printf "0\n\n"; exit}' | $AWK 'BEGIN {RS=""}; {print length(RT)}'
+
diff --git a/gawk-5.0.1/test/rtlenmb.ok b/gawk-5.0.1/test/rtlenmb.ok
new file mode 100644
index 00000000000..b8a484dff28
--- /dev/null
+++ b/gawk-5.0.1/test/rtlenmb.ok
@@ -0,0 +1,3 @@
+3
+5
+2
diff --git a/gawk-5.0.1/test/rwarray.awk b/gawk-5.0.1/test/rwarray.awk
new file mode 100644
index 00000000000..86a4b5899f1
--- /dev/null
+++ b/gawk-5.0.1/test/rwarray.awk
@@ -0,0 +1,54 @@
+@load "rwarray"
+
+BEGIN {
+	while ((getline word) > 0)
+		dict[word] = word word
+
+	re_sub = "/typed-regex/"
+	dict[re_sub] = @/search me/
+
+	strnum_sub = "strnum-sub"
+	split("-2.4", f)
+	dict[strnum_sub] = f[1]
+
+	n = asorti(dict, dictindices)
+	for (i = 1; i <= n; i++)
+		printf("dict[%s] = %s\n", dictindices[i], dict[dictindices[i]]) > "orig.out"
+	close("orig.out");
+
+	ret = writea("orig.bin", dict)
+	printf "writea() returned %d, expecting 1\n", ret
+
+	ret = reada("orig.bin", dict)
+	printf "reada() returned %d, expecting 1\n", ret
+
+	n = asorti(dict, dictindices)
+	for (i = 1; i <= n; i++)
+		printf("dict[%s] = %s\n", dictindices[i], dict[dictindices[i]]) > "new.out"
+	close("new.out");
+
+	os = ""
+	if (ENVIRON["AWKLIBPATH"] == "sys$disk:[-]") {
+		os = "VMS"
+		# return status from system() on VMS can not be used here
+	}
+	if (os != "VMS") {
+		ret = system("cmp orig.out new.out")
+
+		if (ret == 0)
+			print "old and new are equal - GOOD"
+		else
+			print "old and new are not equal - BAD"
+
+		if (ret == 0 && !("KEEPIT" in ENVIRON))
+			system("rm -f orig.bin orig.out new.out")
+	}
+
+	if (typeof(dict[re_sub]) != "regexp")
+		printf("dict[\"%s\"] should be regexp, is %s\n",
+			re_sub, typeof(dict[re_sub]));
+
+	if (typeof(dict[strnum_sub]) != "strnum")
+		printf("dict[\"%s\"] should be strnum, is %s\n",
+			strnum_sub, typeof(dict[strnum_sub]));
+}
diff --git a/gawk-5.0.1/test/rwarray.in b/gawk-5.0.1/test/rwarray.in
new file mode 100644
index 00000000000..aff88306085
--- /dev/null
+++ b/gawk-5.0.1/test/rwarray.in
@@ -0,0 +1,780 @@
+a
+aardvark
+aardvark's
+aardvarks
+abaci
+aback
+abacus
+abacus's
+abacuses
+abaft
+abalone
+abalone's
+abalones
+abandon
+abandoned
+abandoning
+abandonment
+abandonment's
+abandons
+abase
+abased
+abasement
+abases
+abash
+abashed
+abashes
+abashing
+abasing
+abate
+abated
+b
+baa
+baaed
+baaing
+baas
+babble
+babbled
+babbler
+babbler's
+babblers
+babbles
+babbling
+babe
+babe's
+babel
+babels
+babes
+babied
+babier
+babies
+babiest
+baboon
+baboon's
+baboons
+babushka
+babushka's
+babushkas
+baby
+baby's
+babyhood
+c
+cab
+cab's
+cabal
+cabal's
+cabals
+cabana
+cabana's
+cabanas
+cabaret
+cabaret's
+cabarets
+cabbage
+cabbage's
+cabbages
+cabbed
+cabbie
+cabbies
+cabbing
+cabby
+cabby's
+cabin
+cabin's
+cabinet
+cabinet's
+cabinetmaker
+cabinetmaker's
+cabinetmakers
+cabinets
+cabins
+d
+d'arezzo
+d'estaing
+dab
+dabbed
+dabbing
+dabble
+dabbled
+dabbler
+dabbler's
+dabblers
+dabbles
+dabbling
+dabs
+dacha
+dacha's
+dachas
+dachshund
+dachshund's
+dachshunds
+dactyl
+dactyl's
+dactylic
+dactylics
+dactyls
+dad
+dad's
+daddies
+db
+db's
+e
+e'er
+each
+eager
+eager's
+eagerer
+eagerest
+eagerly
+eagerness
+eagerness's
+eagle
+eagle's
+eagles
+eaglet
+eaglet's
+eaglets
+ear
+ear's
+earache
+earache's
+earaches
+eardrum
+eardrum's
+eardrums
+earful
+earful's
+earfuls
+earl
+ebay
+ebay's
+f
+fa
+fa's
+fable
+fable's
+fabled
+fables
+fabric
+fabric's
+fabricate
+fabricated
+fabricates
+fabricating
+fabrication
+fabrication's
+fabrications
+fabrics
+fabulous
+fabulously
+facade
+facade's
+facades
+face
+face's
+faced
+faceless
+facelift
+facelifts
+faces
+facet
+g
+gab
+gabardine
+gabardine's
+gabardines
+gabbed
+gabbier
+gabbiest
+gabbing
+gabble
+gabbled
+gabbles
+gabbling
+gabby
+gaberdine
+gaberdine's
+gaberdines
+gable
+gable's
+gabled
+gables
+gabling
+gabs
+gad
+gadabout
+gadabout's
+gadabouts
+gadded
+gadding
+gadflies
+h
+h'm
+ha
+haberdasher
+haberdasher's
+haberdasheries
+haberdashers
+haberdashery
+haberdashery's
+habit
+habit's
+habitability
+habitability's
+habitable
+habitat
+habitat's
+habitation
+habitation's
+habitations
+habitats
+habits
+habitual
+habitually
+habituals
+habituate
+habituated
+habituates
+habituating
+habituation
+habituation's
+i
+iamb
+iamb's
+iambic
+iambics
+iambs
+ibex
+ibex's
+ibexes
+ibices
+ibis
+ibis's
+ibises
+ibuprofen
+ice
+ice's
+iceberg
+iceberg's
+icebergs
+icebound
+icebox
+icebox's
+iceboxes
+icebreaker
+icebreaker's
+icebreakers
+icecap
+icecap's
+icecaps
+iced
+j
+jab
+jabbed
+jabber
+jabbered
+jabberer
+jabberer's
+jabberers
+jabbering
+jabbers
+jabbing
+jabot
+jabot's
+jabots
+jabs
+jack
+jack's
+jackal
+jackal's
+jackals
+jackass
+jackass's
+jackasses
+jackboot
+jackboot's
+jackboots
+jackdaw
+jackdaw's
+jackdaws
+jacked
+k
+kabob
+kabob's
+kabobs
+kaboom
+kale
+kale's
+kaleidoscope
+kaleidoscope's
+kaleidoscopes
+kaleidoscopic
+kamikaze
+kamikaze's
+kamikazes
+kangaroo
+kangaroo's
+kangarooed
+kangarooing
+kangaroos
+kaolin
+kaolin's
+kapok
+kapok's
+kaput
+kaput's
+karakul
+karakul's
+khz
+khz's
+kw
+l
+la
+la's
+lab
+lab's
+label
+label's
+labeled
+labeling
+labelled
+labelling
+labels
+labia
+labia's
+labial
+labials
+labium
+labor
+labor's
+laboratories
+laboratory
+laboratory's
+labored
+laborer
+laborer's
+laborers
+laboring
+laborious
+laboriously
+labors
+m
+ma
+ma'am
+ma's
+macabre
+macadam
+macadam's
+macaroni
+macaroni's
+macaroon
+macaroon's
+macaroons
+macaw
+macaw's
+macaws
+mace
+mace's
+maced
+macerate
+macerated
+macerates
+macerating
+maceration
+maceration's
+maces
+machete
+machete's
+machetes
+machination
+machination's
+n
+nab
+nabbed
+nabbing
+nabob
+nabob's
+nabobs
+nabs
+nacho
+nachos
+nacre
+nacre's
+nadir
+nadir's
+nadirs
+nag
+nagged
+nagging
+nags
+naiad
+naiad's
+naiades
+naiads
+nail
+nail's
+nailbrush
+nailbrush's
+nailbrushes
+nailed
+nailing
+o
+o'clock
+o'er
+oaf
+oaf's
+oafish
+oafs
+oak
+oak's
+oaken
+oaks
+oakum
+oakum's
+oar
+oar's
+oared
+oaring
+oarlock
+oarlock's
+oarlocks
+oars
+oarsman
+oarsman's
+oarsmen
+oases
+oasis
+oasis's
+oat
+oat's
+oaten
+p
+pa
+pa's
+pace
+pace's
+paced
+pacemaker
+pacemaker's
+pacemakers
+paces
+pacesetter
+pacesetter's
+pacesetters
+pachyderm
+pachyderm's
+pachyderms
+pacific
+pacifically
+pacification
+pacification's
+pacified
+pacifier
+pacifier's
+pacifiers
+pacifies
+pacifism
+pacifism's
+pacifist
+ph
+ph's
+q
+qua
+quack
+quacked
+quackery
+quackery's
+quacking
+quacks
+quad
+quad's
+quadrangle
+quadrangle's
+quadrangles
+quadrangular
+quadrangular's
+quadrant
+quadrant's
+quadrants
+quadraphonic
+quadraphonics
+quadratic
+quadratic's
+quadrature
+quadrature's
+quadrennial
+quadriceps
+quadriceps's
+quadricepses
+quadrilateral
+quadrilaterals
+r
+rabbi
+rabbi's
+rabbies
+rabbinate
+rabbinate's
+rabbinical
+rabbis
+rabbit
+rabbit's
+rabbited
+rabbiting
+rabbits
+rabble
+rabble's
+rabbles
+rabid
+rabies
+raccoon
+raccoon's
+raccoons
+race
+race's
+racecourse
+racecourse's
+racecourses
+raced
+racehorse
+racehorse's
+racehorses
+s
+sabbatical
+sabbaticals
+saber
+saber's
+sabers
+sable
+sable's
+sabled
+sables
+sabling
+sabotage
+sabotage's
+sabotaged
+sabotages
+sabotaging
+saboteur
+saboteur's
+saboteurs
+sabre
+sabres
+sac
+sac's
+saccharin
+saccharin's
+saccharine
+sacerdotal
+sachem
+sachem's
+sachems
+t
+tab
+tab's
+tabbed
+tabbies
+tabbing
+tabby
+tabernacle
+tabernacle's
+tabernacles
+table
+table's
+tableau
+tableau's
+tableaus
+tableaux
+tablecloth
+tablecloth's
+tablecloths
+tabled
+tableland
+tableland's
+tablelands
+tables
+tablespoon
+tablespoon's
+tablespoonful
+tablespoonful's
+tablespoonfuls
+tablespoons
+u
+ubiquitous
+ubiquitously
+ubiquity
+udder
+udder's
+udders
+ugh
+uglied
+uglier
+uglies
+ugliest
+ugliness
+ugliness's
+ugly
+uglying
+uh
+ukulele
+ukulele's
+ukuleles
+ulcer
+ulcer's
+ulcerate
+ulcerated
+ulcerates
+ulcerating
+ulceration
+ulceration's
+ulcered
+ulcering
+v
+vacancies
+vacancy
+vacancy's
+vacant
+vacantly
+vacate
+vacated
+vacates
+vacating
+vacation
+vacation's
+vacationed
+vacationer
+vacationers
+vacationing
+vacations
+vaccinate
+vaccinated
+vaccinates
+vaccinating
+vaccination
+vaccination's
+vaccinations
+vaccine
+vaccine's
+vaccines
+vacillate
+vacillated
+vacillates
+w
+wackes
+wackier
+wackiest
+wackiness
+wackiness's
+wacko
+wackos
+wacky
+wad
+wad's
+wadded
+wadding
+wadding's
+waddle
+waddled
+waddles
+waddling
+wade
+waded
+wader
+wader's
+waders
+wades
+wadi
+wadi's
+wadies
+wading
+wadis
+wads
+x
+xenon
+xenon's
+xenophobia
+xenophobia's
+xenophobic
+xenophon's
+xerographic
+xerography
+xerography's
+xerox
+xerox's
+xeroxed
+xeroxes
+xeroxing
+xerxes
+xerxes's
+xhosa
+xhosa's
+xi'an
+xiaoping
+xiaoping's
+xingu
+xylem
+xylem's
+xylophone
+xylophone's
+xylophones
+xylophonist
+xylophonists
+y
+y'all
+ya
+yacht
+yacht's
+yachted
+yachting
+yachting's
+yachts
+yachtsman
+yachtsmen
+yahoo
+yahoo's
+yahoos
+yak
+yak's
+yakked
+yakking
+yaks
+yam
+yam's
+yammer
+yammered
+yammering
+yammers
+yams
+yank
+yanked
+yanking
+yanks
+z
+zanied
+zanier
+zanies
+zaniest
+zaniness
+zaniness's
+zany
+zanying
+zap
+zapped
+zapping
+zaps
+zeal
+zeal's
+zealot
+zealot's
+zealots
+zealous
+zealously
+zealousness
+zealousness's
+zebra
+zebra's
+zebras
+zebu
+zebu's
+zebus
+zed
+zed's
diff --git a/gawk-5.0.1/test/rwarray.ok b/gawk-5.0.1/test/rwarray.ok
new file mode 100644
index 00000000000..8392135e318
--- /dev/null
+++ b/gawk-5.0.1/test/rwarray.ok
@@ -0,0 +1,3 @@
+writea() returned 1, expecting 1
+reada() returned 1, expecting 1
+old and new are equal - GOOD
diff --git a/gawk-5.0.1/test/sandbox1.awk b/gawk-5.0.1/test/sandbox1.awk
new file mode 100644
index 00000000000..e84894d70eb
--- /dev/null
+++ b/gawk-5.0.1/test/sandbox1.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	ARGV[ARGC++] = ARGV[1]	# should be ok
+	ARGV[ARGC++] = ""	# empty string, should be ok
+	ARGV[ARGC++] = "foo=bar"	# assignment, should be ok
+	ARGV[ARGC++] = "junk::foo=bar"	# assignment, should be ok
+	ARGV[ARGC++] = "/dev/null"	# should fatal here
+}
diff --git a/gawk-5.0.1/test/sandbox1.ok b/gawk-5.0.1/test/sandbox1.ok
new file mode 100644
index 00000000000..210b7261385
--- /dev/null
+++ b/gawk-5.0.1/test/sandbox1.ok
@@ -0,0 +1,2 @@
+gawk: sandbox1.awk:6: fatal: cannot add a new file (/dev/null) to ARGV in sandbox mode
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/scalar.awk b/gawk-5.0.1/test/scalar.awk
new file mode 100644
index 00000000000..9027389bae5
--- /dev/null
+++ b/gawk-5.0.1/test/scalar.awk
@@ -0,0 +1,4 @@
+BEGIN{
+	sub(/x/,"",a)
+	a[1]
+}
diff --git a/gawk-5.0.1/test/scalar.ok b/gawk-5.0.1/test/scalar.ok
new file mode 100644
index 00000000000..99e1fc8c7dc
--- /dev/null
+++ b/gawk-5.0.1/test/scalar.ok
@@ -0,0 +1,2 @@
+gawk: scalar.awk:3: fatal: attempt to use scalar `a' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/sclforin.awk b/gawk-5.0.1/test/sclforin.awk
new file mode 100644
index 00000000000..335e85402ad
--- /dev/null
+++ b/gawk-5.0.1/test/sclforin.awk
@@ -0,0 +1 @@
+BEGIN { j = 4; for (i in j) print j[i] }
diff --git a/gawk-5.0.1/test/sclforin.ok b/gawk-5.0.1/test/sclforin.ok
new file mode 100644
index 00000000000..cbb52be4450
--- /dev/null
+++ b/gawk-5.0.1/test/sclforin.ok
@@ -0,0 +1,2 @@
+gawk: sclforin.awk:1: fatal: attempt to use scalar `j' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/sclifin.awk b/gawk-5.0.1/test/sclifin.awk
new file mode 100644
index 00000000000..64f5d0d3ac0
--- /dev/null
+++ b/gawk-5.0.1/test/sclifin.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	j = 4
+	if ("foo" in j)
+		print "ouch"
+	else
+		print "ok"
+}
diff --git a/gawk-5.0.1/test/sclifin.ok b/gawk-5.0.1/test/sclifin.ok
new file mode 100644
index 00000000000..ab03eeb883d
--- /dev/null
+++ b/gawk-5.0.1/test/sclifin.ok
@@ -0,0 +1,2 @@
+gawk: sclifin.awk:3: fatal: attempt to use scalar `j' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/setrec0.awk b/gawk-5.0.1/test/setrec0.awk
new file mode 100644
index 00000000000..8d978aa75af
--- /dev/null
+++ b/gawk-5.0.1/test/setrec0.awk
@@ -0,0 +1,8 @@
+function reassign(x, y) {
+   $0 = x
+   print y
+}
+
+{
+   reassign("larry", $1)
+}
diff --git a/gawk-5.0.1/test/setrec0.in b/gawk-5.0.1/test/setrec0.in
new file mode 100644
index 00000000000..ce013625030
--- /dev/null
+++ b/gawk-5.0.1/test/setrec0.in
@@ -0,0 +1 @@
+hello
diff --git a/gawk-5.0.1/test/setrec0.ok b/gawk-5.0.1/test/setrec0.ok
new file mode 100644
index 00000000000..ce013625030
--- /dev/null
+++ b/gawk-5.0.1/test/setrec0.ok
@@ -0,0 +1 @@
+hello
diff --git a/gawk-5.0.1/test/setrec1.awk b/gawk-5.0.1/test/setrec1.awk
new file mode 100644
index 00000000000..3da1aa1073d
--- /dev/null
+++ b/gawk-5.0.1/test/setrec1.awk
@@ -0,0 +1,9 @@
+function reassign(x, y) {
+   $0 = x
+   print y
+}
+
+BEGIN {
+   $0 = substr("geronimo", 5, 3)
+   reassign(" 52", $1)
+}
diff --git a/gawk-5.0.1/test/setrec1.ok b/gawk-5.0.1/test/setrec1.ok
new file mode 100644
index 00000000000..6bb3f8697a6
--- /dev/null
+++ b/gawk-5.0.1/test/setrec1.ok
@@ -0,0 +1 @@
+nim
diff --git a/gawk-5.0.1/test/shadow.awk b/gawk-5.0.1/test/shadow.awk
new file mode 100644
index 00000000000..9a58720354b
--- /dev/null
+++ b/gawk-5.0.1/test/shadow.awk
@@ -0,0 +1,21 @@
+function foo()
+{
+	print "foo"
+}
+
+function bar(A, Z, q)
+{
+	print "bar"
+}
+
+function baz(C, D)
+{
+	print "baz"
+}
+
+BEGIN {
+	A = C = D = Z = y = 1
+	foo()
+	bar()
+	baz()
+}
diff --git a/gawk-5.0.1/test/shadow.ok b/gawk-5.0.1/test/shadow.ok
new file mode 100644
index 00000000000..552c63e6ade
--- /dev/null
+++ b/gawk-5.0.1/test/shadow.ok
@@ -0,0 +1,7 @@
+gawk: shadow.awk:6: warning: function `bar': parameter `A' shadows global variable
+gawk: shadow.awk:6: warning: function `bar': parameter `Z' shadows global variable
+gawk: shadow.awk:11: warning: function `baz': parameter `C' shadows global variable
+gawk: shadow.awk:11: warning: function `baz': parameter `D' shadows global variable
+foo
+bar
+baz
diff --git a/gawk-5.0.1/test/shadowbuiltin.awk b/gawk-5.0.1/test/shadowbuiltin.awk
new file mode 100644
index 00000000000..3ae21725241
--- /dev/null
+++ b/gawk-5.0.1/test/shadowbuiltin.awk
@@ -0,0 +1,10 @@
+function foo(gensub)
+{
+	print gensub
+	print lshift(1, 1)
+}
+
+BEGIN {
+	x = 5
+	foo(x)
+}
diff --git a/gawk-5.0.1/test/shadowbuiltin.ok b/gawk-5.0.1/test/shadowbuiltin.ok
new file mode 100644
index 00000000000..47586a86a32
--- /dev/null
+++ b/gawk-5.0.1/test/shadowbuiltin.ok
@@ -0,0 +1,2 @@
+5
+2
diff --git a/gawk-5.0.1/test/sigpipe1.awk b/gawk-5.0.1/test/sigpipe1.awk
new file mode 100644
index 00000000000..9b23f39036c
--- /dev/null
+++ b/gawk-5.0.1/test/sigpipe1.awk
@@ -0,0 +1,13 @@
+BEGIN {
+	print "system"
+	command = "yes | true"
+	system(command)
+
+	print "pipe to command"
+	print "hi" | command
+	close(command)
+
+	print "pipe from command"
+	command | getline x
+	close(command)
+}
diff --git a/gawk-5.0.1/test/sigpipe1.ok b/gawk-5.0.1/test/sigpipe1.ok
new file mode 100644
index 00000000000..6596f076e49
--- /dev/null
+++ b/gawk-5.0.1/test/sigpipe1.ok
@@ -0,0 +1,3 @@
+system
+pipe to command
+pipe from command
diff --git a/gawk-5.0.1/test/sort1.awk b/gawk-5.0.1/test/sort1.awk
new file mode 100644
index 00000000000..ef28e9cdd6d
--- /dev/null
+++ b/gawk-5.0.1/test/sort1.awk
@@ -0,0 +1,127 @@
+BEGIN{
+  for (IGNORECASE=0; IGNORECASE <= 1; IGNORECASE++) {
+	SORT_STR = -1
+
+ 	makea(a)
+ 	asort1(a, "")
+	printf("---end asort(a), IGNORECASE = %d---\n", IGNORECASE)
+
+	makea(a)
+	asort2(a, "")
+	printf("---end asort(a, b), IGNORECASE = %d---\n", IGNORECASE)
+
+	makea(a)
+	SORT_STR = ""
+	asort1(a)
+	printf("---end asort(a, a), IGNORECASE = %d---\n", IGNORECASE)
+
+	makea(a)
+	SORT_STR = "@ind_num_asc"
+	asort2(a, "")
+	printf("---end asort(a, b, \"%s\"), IGNORECASE = %d---\n",
+		SORT_STR, IGNORECASE)
+
+	makea(a)
+	SORT_STR = "@ind_str_desc"
+	asort1(a, "")
+	printf("---end asort(a, a, \"%s\"), IGNORECASE = %d---\n",
+		SORT_STR, IGNORECASE)
+
+	makea(a)
+	SORT_STR = "@val_str_asc"
+	proc_sort(a, "")
+	printf("---end PROCINFO[\"sorted_in\"] = \"%s\", IGNORECASE = %d---\n",
+		SORT_STR, IGNORECASE)
+
+	makea(a)
+	SORT_STR = "@val_num_asc"
+	proc_sort(a, "")
+	printf("---end PROCINFO[\"sorted_in\"] = \"%s\", IGNORECASE = %d---\n",
+		SORT_STR, IGNORECASE)
+
+	makea(a)
+	SORT_STR = "@val_str_desc"
+	proc_sort(a, "")
+	printf("---end PROCINFO[\"sorted_in\"] = \"%s\", IGNORECASE = %d---\n",
+		SORT_STR, IGNORECASE)
+
+	makea(a)
+	SORT_STR = "@val_num_desc"
+	proc_sort(a, "")
+	printf("---end PROCINFO[\"sorted_in\"] = \"%s\", IGNORECASE = %d---\n",
+		SORT_STR, IGNORECASE)
+
+	makea(a)
+	SORT_STR = "@val_type_asc"
+	proc_sort(a, "")
+	printf("---end PROCINFO[\"sorted_in\"] = \"%s\", IGNORECASE = %d---\n",
+		SORT_STR, IGNORECASE)
+
+	makea(a)
+	SORT_STR = "@val_type_desc"
+	proc_sort(a, "")
+	printf("---end PROCINFO[\"sorted_in\"] = \"%s\", IGNORECASE = %d---\n",
+		SORT_STR, IGNORECASE)
+  }
+}
+
+function makea(aa)
+{
+  delete aa
+  aa[1] = "barz";
+  aa[2] = "blattt";
+  aa[3] = "Zebra";
+  aa[4] = 1234;
+  aa[5] = 234;
+  aa[6][1] = 4321;
+#  aa[6][2] = 432;
+  aa[6][3] = "tttalb";
+  aa[6][2] = "arbeZ";
+  aa[6][4] = "zrab";
+}
+
+
+# source array != destination array 
+function asort2(c, s,	d, k, m) 
+{
+  if (SORT_STR < 0)
+	m = asort(c, d);
+  else
+	m = asort(c, d, SORT_STR);
+  for(k=1; k <= m; k++) {
+	if (isarray(d[k]))
+		asort2(d[k], s"["k"]")
+	else
+	    	printf("%10s:%10s%10s\n", s"["k"]", c[k], d[k])
+  }
+}
+
+# source array == destination array
+function asort1(c, s,	k, m) 
+{
+  if (SORT_STR < 0)
+	m = asort(c)
+  else if (SORT_STR != "")
+	m = asort(c, c, SORT_STR)
+  else
+	m = asort(c, c);
+
+  for(k=1; k <= m; k++) {
+	if (isarray(c[k]))
+		asort1(c[k], s"["k"]")
+	else
+	    	printf("%10s:%10s\n", s"["k"]", c[k])
+  }
+}
+
+
+function proc_sort(c, s,	k) 
+{
+  PROCINFO["sorted_in"] = SORT_STR
+  for(k in c) {
+	if (isarray(c[k]))
+		proc_sort(c[k], s"["k"]")
+	else
+	    	printf("%10s:%10s\n", s"["k"]", c[k])
+  }
+}
diff --git a/gawk-5.0.1/test/sort1.ok b/gawk-5.0.1/test/sort1.ok
new file mode 100644
index 00000000000..00ed661a557
--- /dev/null
+++ b/gawk-5.0.1/test/sort1.ok
@@ -0,0 +1,220 @@
+       [1]:       234
+       [2]:      1234
+       [3]:     Zebra
+       [4]:      barz
+       [5]:    blattt
+    [6][1]:      4321
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+---end asort(a), IGNORECASE = 0---
+       [1]:      barz       234
+       [2]:    blattt      1234
+       [3]:     Zebra     Zebra
+       [4]:      1234      barz
+       [5]:       234    blattt
+    [6][1]:      4321      4321
+    [6][2]:     arbeZ     arbeZ
+    [6][3]:    tttalb    tttalb
+    [6][4]:      zrab      zrab
+---end asort(a, b), IGNORECASE = 0---
+       [1]:       234
+       [2]:      1234
+       [3]:     Zebra
+       [4]:      barz
+       [5]:    blattt
+    [6][1]:      4321
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+---end asort(a, a), IGNORECASE = 0---
+       [1]:      barz      barz
+       [2]:    blattt    blattt
+       [3]:     Zebra     Zebra
+       [4]:      1234      1234
+       [5]:       234       234
+    [6][1]:      4321      4321
+    [6][2]:     arbeZ     arbeZ
+    [6][3]:    tttalb    tttalb
+    [6][4]:      zrab      zrab
+---end asort(a, b, "@ind_num_asc"), IGNORECASE = 0---
+    [1][1]:      zrab
+    [1][2]:    tttalb
+    [1][3]:     arbeZ
+    [1][4]:      4321
+       [2]:       234
+       [3]:      1234
+       [4]:     Zebra
+       [5]:    blattt
+       [6]:      barz
+---end asort(a, a, "@ind_str_desc"), IGNORECASE = 0---
+       [4]:      1234
+       [5]:       234
+       [3]:     Zebra
+       [1]:      barz
+       [2]:    blattt
+    [6][1]:      4321
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+---end PROCINFO["sorted_in"] = "@val_str_asc", IGNORECASE = 0---
+       [3]:     Zebra
+       [1]:      barz
+       [2]:    blattt
+       [5]:       234
+       [4]:      1234
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+    [6][1]:      4321
+---end PROCINFO["sorted_in"] = "@val_num_asc", IGNORECASE = 0---
+    [6][4]:      zrab
+    [6][3]:    tttalb
+    [6][2]:     arbeZ
+    [6][1]:      4321
+       [2]:    blattt
+       [1]:      barz
+       [3]:     Zebra
+       [5]:       234
+       [4]:      1234
+---end PROCINFO["sorted_in"] = "@val_str_desc", IGNORECASE = 0---
+    [6][1]:      4321
+    [6][4]:      zrab
+    [6][3]:    tttalb
+    [6][2]:     arbeZ
+       [4]:      1234
+       [5]:       234
+       [2]:    blattt
+       [1]:      barz
+       [3]:     Zebra
+---end PROCINFO["sorted_in"] = "@val_num_desc", IGNORECASE = 0---
+       [5]:       234
+       [4]:      1234
+       [3]:     Zebra
+       [1]:      barz
+       [2]:    blattt
+    [6][1]:      4321
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+---end PROCINFO["sorted_in"] = "@val_type_asc", IGNORECASE = 0---
+    [6][4]:      zrab
+    [6][3]:    tttalb
+    [6][2]:     arbeZ
+    [6][1]:      4321
+       [2]:    blattt
+       [1]:      barz
+       [3]:     Zebra
+       [4]:      1234
+       [5]:       234
+---end PROCINFO["sorted_in"] = "@val_type_desc", IGNORECASE = 0---
+       [1]:       234
+       [2]:      1234
+       [3]:      barz
+       [4]:    blattt
+       [5]:     Zebra
+    [6][1]:      4321
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+---end asort(a), IGNORECASE = 1---
+       [1]:      barz       234
+       [2]:    blattt      1234
+       [3]:     Zebra      barz
+       [4]:      1234    blattt
+       [5]:       234     Zebra
+    [6][1]:      4321      4321
+    [6][2]:     arbeZ     arbeZ
+    [6][3]:    tttalb    tttalb
+    [6][4]:      zrab      zrab
+---end asort(a, b), IGNORECASE = 1---
+       [1]:       234
+       [2]:      1234
+       [3]:      barz
+       [4]:    blattt
+       [5]:     Zebra
+    [6][1]:      4321
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+---end asort(a, a), IGNORECASE = 1---
+       [1]:      barz      barz
+       [2]:    blattt    blattt
+       [3]:     Zebra     Zebra
+       [4]:      1234      1234
+       [5]:       234       234
+    [6][1]:      4321      4321
+    [6][2]:     arbeZ     arbeZ
+    [6][3]:    tttalb    tttalb
+    [6][4]:      zrab      zrab
+---end asort(a, b, "@ind_num_asc"), IGNORECASE = 1---
+    [1][1]:      zrab
+    [1][2]:    tttalb
+    [1][3]:     arbeZ
+    [1][4]:      4321
+       [2]:       234
+       [3]:      1234
+       [4]:     Zebra
+       [5]:    blattt
+       [6]:      barz
+---end asort(a, a, "@ind_str_desc"), IGNORECASE = 1---
+       [4]:      1234
+       [5]:       234
+       [1]:      barz
+       [2]:    blattt
+       [3]:     Zebra
+    [6][1]:      4321
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+---end PROCINFO["sorted_in"] = "@val_str_asc", IGNORECASE = 1---
+       [1]:      barz
+       [2]:    blattt
+       [3]:     Zebra
+       [5]:       234
+       [4]:      1234
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+    [6][1]:      4321
+---end PROCINFO["sorted_in"] = "@val_num_asc", IGNORECASE = 1---
+    [6][4]:      zrab
+    [6][3]:    tttalb
+    [6][2]:     arbeZ
+    [6][1]:      4321
+       [3]:     Zebra
+       [2]:    blattt
+       [1]:      barz
+       [5]:       234
+       [4]:      1234
+---end PROCINFO["sorted_in"] = "@val_str_desc", IGNORECASE = 1---
+    [6][1]:      4321
+    [6][4]:      zrab
+    [6][3]:    tttalb
+    [6][2]:     arbeZ
+       [4]:      1234
+       [5]:       234
+       [3]:     Zebra
+       [2]:    blattt
+       [1]:      barz
+---end PROCINFO["sorted_in"] = "@val_num_desc", IGNORECASE = 1---
+       [5]:       234
+       [4]:      1234
+       [1]:      barz
+       [2]:    blattt
+       [3]:     Zebra
+    [6][1]:      4321
+    [6][2]:     arbeZ
+    [6][3]:    tttalb
+    [6][4]:      zrab
+---end PROCINFO["sorted_in"] = "@val_type_asc", IGNORECASE = 1---
+    [6][4]:      zrab
+    [6][3]:    tttalb
+    [6][2]:     arbeZ
+    [6][1]:      4321
+       [3]:     Zebra
+       [2]:    blattt
+       [1]:      barz
+       [4]:      1234
+       [5]:       234
+---end PROCINFO["sorted_in"] = "@val_type_desc", IGNORECASE = 1---
diff --git a/gawk-5.0.1/test/sortempty.awk b/gawk-5.0.1/test/sortempty.awk
new file mode 100644
index 00000000000..6848d953761
--- /dev/null
+++ b/gawk-5.0.1/test/sortempty.awk
@@ -0,0 +1 @@
+BEGIN { print asort(a) }
diff --git a/gawk-5.0.1/test/sortempty.ok b/gawk-5.0.1/test/sortempty.ok
new file mode 100644
index 00000000000..573541ac970
--- /dev/null
+++ b/gawk-5.0.1/test/sortempty.ok
@@ -0,0 +1 @@
+0
diff --git a/gawk-5.0.1/test/sortfor.awk b/gawk-5.0.1/test/sortfor.awk
new file mode 100644
index 00000000000..922b5e8558a
--- /dev/null
+++ b/gawk-5.0.1/test/sortfor.awk
@@ -0,0 +1,9 @@
+{ a[$0]++ }
+END {
+	PROCINFO["sorted_in"] = "@ind_str_asc"
+	for (i in a)
+		print i
+	PROCINFO["sorted_in"] = "@ind_str_desc"
+	for (i in a)
+		print i
+}
diff --git a/gawk-5.0.1/test/sortfor.in b/gawk-5.0.1/test/sortfor.in
new file mode 100644
index 00000000000..f0e4d510de5
--- /dev/null
+++ b/gawk-5.0.1/test/sortfor.in
@@ -0,0 +1,289 @@
+fsspcoln
+ofmtfidl
+strtonum
+strftime
+uninitialized
+manyfiles
+delarpm2
+wideidx
+parseme
+paramres
+fldchgnf
+subslash
+intprec
+asorti
+mbprintf1
+mbprintf2
+synerr1
+mbprintf3
+synerr2
+arynasty
+swaplns
+asort
+patsplit
+delarprm
+gensub
+litoct
+opasnidx
+clsflnam
+fnarydel
+uparrfs
+argarray
+numindex
+devfd1
+devfd2
+delfunc
+localenl
+noeffect
+fstabplus
+hsprint
+fsfwfs
+tradanch
+fldchg
+printfbad1
+unterm
+printfbad2
+fmttest
+minusstr
+posix
+arrymem1
+concat1
+reint2
+gnuops2
+concat2
+fsrs
+gnuops3
+resplit
+concat3
+fnparydl
+concat4
+uninit2
+rs
+fnarray
+uninit3
+paramdup
+mmap8k
+fieldwdth
+devfd
+uninit4
+poundbang
+uninit5
+nondec2
+switch2
+numsubstr
+profile1
+regx8bit
+profile2
+getline
+membug1
+lint
+zeroflag
+fnasgnm
+widesub2
+widesub3
+reindops
+exitval1
+binmode1
+widesub4
+exitval2
+intest
+back89
+substr
+arynocls
+opasnslf
+ofmtbig
+mbfw1
+zeroe0
+arrayparm
+nasty
+aasort
+sclifin
+nofmtch
+leadnl
+getlnhd
+nofile
+fflush
+printf0
+reparse
+printf1
+prtoeval
+funsmnam
+tweakfld
+sclforin
+wjposer1
+clobber
+iobug1
+fnamedat
+leaddig
+double1
+double2
+strcat1
+prdupval
+messages
+space
+nlfldsep
+posix2008sub
+wideidx2
+nfldstr
+zero2
+rebt8b1
+onlynl
+rebt8b2
+fwtest
+anchgsub
+beginfile1
+fnmisc
+getlndir
+rand
+fwtest2
+nested
+childin
+mtchi18n
+gsubtest
+manglprm
+intformat
+longwrds
+splitarr
+arysubnm
+rsstart1
+procinfs
+argtest
+regeq
+rsstart2
+rsstart3
+sort1
+fmtspcl
+reint
+rsnulbig
+closebad
+strftlng
+parse1
+ofmt
+ignrcas2
+splitarg4
+range1
+noloop1
+longsub
+igncdym
+widesub
+noloop2
+aadelete1
+subi18n
+gsubtst2
+aadelete2
+gsubtst3
+gsubtst4
+convfmt
+gsubtst5
+nors
+arrayref
+gsubtst6
+parsefld
+indirectcall
+asgext
+shadow
+octsub
+nfneg
+backgsub
+math
+getlnbuf
+addcomma
+mbstr1
+subsepnm
+nulrsend
+rsnulbig2
+sprintfc
+redfilnm
+igncfs
+splitwht
+fcall_exit
+fordel
+subamp
+paramtyp
+nlinstr
+eofsplit
+fsbs
+dumpvars
+nlstrina
+datanonl
+fcall_exit2
+icasers
+badargs
+nfset
+gsubasgn
+lc_num1
+aasorti
+pipeio1
+pipeio2
+sortempty
+inputred
+backw
+rswhite
+awkpath
+forsimp
+match1
+match2
+splitvar
+match3
+aryprm1
+aryprm2
+aryprm3
+getline2
+aarray1
+aryprm4
+fnarray2
+getline3
+ignrcase
+aryprm5
+pcntplus
+aryprm6
+aryprm7
+ofmts
+aryprm8
+dynlj
+prec
+prmreuse
+gensub2
+splitdef
+prt1eval
+lintold
+scalar
+fnaryscl
+nondec
+compare2
+icasefs
+rstest1
+getnr2tb
+rstest2
+arryref2
+rstest3
+arryref3
+gnureops
+rstest4
+arryref4
+funstack
+splitargv
+rstest5
+arryref5
+rstest6
+clos1way
+pid
+rsnul1nl
+nasty2
+noparms
+defref
+rebuf
+strtod
+prmarscl
+arrayprm2
+arrayprm3
+getnr2tm
+forref
+funsemnl
+hex
+fpat1
+strnum1
+negexp
+compare
+funlen
+nonl
diff --git a/gawk-5.0.1/test/sortfor.ok b/gawk-5.0.1/test/sortfor.ok
new file mode 100644
index 00000000000..8fc84d0625d
--- /dev/null
+++ b/gawk-5.0.1/test/sortfor.ok
@@ -0,0 +1,578 @@
+aadelete1
+aadelete2
+aarray1
+aasort
+aasorti
+addcomma
+anchgsub
+argarray
+argtest
+arrayparm
+arrayprm2
+arrayprm3
+arrayref
+arrymem1
+arryref2
+arryref3
+arryref4
+arryref5
+arynasty
+arynocls
+aryprm1
+aryprm2
+aryprm3
+aryprm4
+aryprm5
+aryprm6
+aryprm7
+aryprm8
+arysubnm
+asgext
+asort
+asorti
+awkpath
+back89
+backgsub
+backw
+badargs
+beginfile1
+binmode1
+childin
+clobber
+clos1way
+closebad
+clsflnam
+compare
+compare2
+concat1
+concat2
+concat3
+concat4
+convfmt
+datanonl
+defref
+delarpm2
+delarprm
+delfunc
+devfd
+devfd1
+devfd2
+double1
+double2
+dumpvars
+dynlj
+eofsplit
+exitval1
+exitval2
+fcall_exit
+fcall_exit2
+fflush
+fieldwdth
+fldchg
+fldchgnf
+fmtspcl
+fmttest
+fnamedat
+fnarray
+fnarray2
+fnarydel
+fnaryscl
+fnasgnm
+fnmisc
+fnparydl
+fordel
+forref
+forsimp
+fpat1
+fsbs
+fsfwfs
+fsrs
+fsspcoln
+fstabplus
+funlen
+funsemnl
+funsmnam
+funstack
+fwtest
+fwtest2
+gensub
+gensub2
+getline
+getline2
+getline3
+getlnbuf
+getlndir
+getlnhd
+getnr2tb
+getnr2tm
+gnuops2
+gnuops3
+gnureops
+gsubasgn
+gsubtest
+gsubtst2
+gsubtst3
+gsubtst4
+gsubtst5
+gsubtst6
+hex
+hsprint
+icasefs
+icasers
+igncdym
+igncfs
+ignrcas2
+ignrcase
+indirectcall
+inputred
+intest
+intformat
+intprec
+iobug1
+lc_num1
+leaddig
+leadnl
+lint
+lintold
+litoct
+localenl
+longsub
+longwrds
+manglprm
+manyfiles
+match1
+match2
+match3
+math
+mbfw1
+mbprintf1
+mbprintf2
+mbprintf3
+mbstr1
+membug1
+messages
+minusstr
+mmap8k
+mtchi18n
+nasty
+nasty2
+negexp
+nested
+nfldstr
+nfneg
+nfset
+nlfldsep
+nlinstr
+nlstrina
+noeffect
+nofile
+nofmtch
+noloop1
+noloop2
+nondec
+nondec2
+nonl
+noparms
+nors
+nulrsend
+numindex
+numsubstr
+octsub
+ofmt
+ofmtbig
+ofmtfidl
+ofmts
+onlynl
+opasnidx
+opasnslf
+paramdup
+paramres
+paramtyp
+parse1
+parsefld
+parseme
+patsplit
+pcntplus
+pid
+pipeio1
+pipeio2
+posix
+posix2008sub
+poundbang
+prdupval
+prec
+printf0
+printf1
+printfbad1
+printfbad2
+prmarscl
+prmreuse
+procinfs
+profile1
+profile2
+prt1eval
+prtoeval
+rand
+range1
+rebt8b1
+rebt8b2
+rebuf
+redfilnm
+regeq
+regx8bit
+reindops
+reint
+reint2
+reparse
+resplit
+rs
+rsnul1nl
+rsnulbig
+rsnulbig2
+rsstart1
+rsstart2
+rsstart3
+rstest1
+rstest2
+rstest3
+rstest4
+rstest5
+rstest6
+rswhite
+scalar
+sclforin
+sclifin
+shadow
+sort1
+sortempty
+space
+splitarg4
+splitargv
+splitarr
+splitdef
+splitvar
+splitwht
+sprintfc
+strcat1
+strftime
+strftlng
+strnum1
+strtod
+strtonum
+subamp
+subi18n
+subsepnm
+subslash
+substr
+swaplns
+switch2
+synerr1
+synerr2
+tradanch
+tweakfld
+uninit2
+uninit3
+uninit4
+uninit5
+uninitialized
+unterm
+uparrfs
+wideidx
+wideidx2
+widesub
+widesub2
+widesub3
+widesub4
+wjposer1
+zero2
+zeroe0
+zeroflag
+zeroflag
+zeroe0
+zero2
+wjposer1
+widesub4
+widesub3
+widesub2
+widesub
+wideidx2
+wideidx
+uparrfs
+unterm
+uninitialized
+uninit5
+uninit4
+uninit3
+uninit2
+tweakfld
+tradanch
+synerr2
+synerr1
+switch2
+swaplns
+substr
+subslash
+subsepnm
+subi18n
+subamp
+strtonum
+strtod
+strnum1
+strftlng
+strftime
+strcat1
+sprintfc
+splitwht
+splitvar
+splitdef
+splitarr
+splitargv
+splitarg4
+space
+sortempty
+sort1
+shadow
+sclifin
+sclforin
+scalar
+rswhite
+rstest6
+rstest5
+rstest4
+rstest3
+rstest2
+rstest1
+rsstart3
+rsstart2
+rsstart1
+rsnulbig2
+rsnulbig
+rsnul1nl
+rs
+resplit
+reparse
+reint2
+reint
+reindops
+regx8bit
+regeq
+redfilnm
+rebuf
+rebt8b2
+rebt8b1
+range1
+rand
+prtoeval
+prt1eval
+profile2
+profile1
+procinfs
+prmreuse
+prmarscl
+printfbad2
+printfbad1
+printf1
+printf0
+prec
+prdupval
+poundbang
+posix2008sub
+posix
+pipeio2
+pipeio1
+pid
+pcntplus
+patsplit
+parseme
+parsefld
+parse1
+paramtyp
+paramres
+paramdup
+opasnslf
+opasnidx
+onlynl
+ofmts
+ofmtfidl
+ofmtbig
+ofmt
+octsub
+numsubstr
+numindex
+nulrsend
+nors
+noparms
+nonl
+nondec2
+nondec
+noloop2
+noloop1
+nofmtch
+nofile
+noeffect
+nlstrina
+nlinstr
+nlfldsep
+nfset
+nfneg
+nfldstr
+nested
+negexp
+nasty2
+nasty
+mtchi18n
+mmap8k
+minusstr
+messages
+membug1
+mbstr1
+mbprintf3
+mbprintf2
+mbprintf1
+mbfw1
+math
+match3
+match2
+match1
+manyfiles
+manglprm
+longwrds
+longsub
+localenl
+litoct
+lintold
+lint
+leadnl
+leaddig
+lc_num1
+iobug1
+intprec
+intformat
+intest
+inputred
+indirectcall
+ignrcase
+ignrcas2
+igncfs
+igncdym
+icasers
+icasefs
+hsprint
+hex
+gsubtst6
+gsubtst5
+gsubtst4
+gsubtst3
+gsubtst2
+gsubtest
+gsubasgn
+gnureops
+gnuops3
+gnuops2
+getnr2tm
+getnr2tb
+getlnhd
+getlndir
+getlnbuf
+getline3
+getline2
+getline
+gensub2
+gensub
+fwtest2
+fwtest
+funstack
+funsmnam
+funsemnl
+funlen
+fstabplus
+fsspcoln
+fsrs
+fsfwfs
+fsbs
+fpat1
+forsimp
+forref
+fordel
+fnparydl
+fnmisc
+fnasgnm
+fnaryscl
+fnarydel
+fnarray2
+fnarray
+fnamedat
+fmttest
+fmtspcl
+fldchgnf
+fldchg
+fieldwdth
+fflush
+fcall_exit2
+fcall_exit
+exitval2
+exitval1
+eofsplit
+dynlj
+dumpvars
+double2
+double1
+devfd2
+devfd1
+devfd
+delfunc
+delarprm
+delarpm2
+defref
+datanonl
+convfmt
+concat4
+concat3
+concat2
+concat1
+compare2
+compare
+clsflnam
+closebad
+clos1way
+clobber
+childin
+binmode1
+beginfile1
+badargs
+backw
+backgsub
+back89
+awkpath
+asorti
+asort
+asgext
+arysubnm
+aryprm8
+aryprm7
+aryprm6
+aryprm5
+aryprm4
+aryprm3
+aryprm2
+aryprm1
+arynocls
+arynasty
+arryref5
+arryref4
+arryref3
+arryref2
+arrymem1
+arrayref
+arrayprm3
+arrayprm2
+arrayparm
+argtest
+argarray
+anchgsub
+addcomma
+aasorti
+aasort
+aarray1
+aadelete2
+aadelete1
diff --git a/gawk-5.0.1/test/sortfor2.awk b/gawk-5.0.1/test/sortfor2.awk
new file mode 100644
index 00000000000..1dfca04f0df
--- /dev/null
+++ b/gawk-5.0.1/test/sortfor2.awk
@@ -0,0 +1,11 @@
+BEGIN {
+    PROCINFO["sorted_in"] = "@ind_num_asc"
+  }
+  {
+    A[$1] = 0
+  }
+  END {
+    for (I in A) B[I] = A[I]
+    for (I in B) SCRATCH = A[I]
+    for (I in A) print I
+  }
diff --git a/gawk-5.0.1/test/sortfor2.in b/gawk-5.0.1/test/sortfor2.in
new file mode 100644
index 00000000000..e75357a1bc2
--- /dev/null
+++ b/gawk-5.0.1/test/sortfor2.in
@@ -0,0 +1,2 @@
+1.0
+2.0
diff --git a/gawk-5.0.1/test/sortfor2.ok b/gawk-5.0.1/test/sortfor2.ok
new file mode 100644
index 00000000000..e75357a1bc2
--- /dev/null
+++ b/gawk-5.0.1/test/sortfor2.ok
@@ -0,0 +1,2 @@
+1.0
+2.0
diff --git a/gawk-5.0.1/test/sortglos.awk b/gawk-5.0.1/test/sortglos.awk
new file mode 100644
index 00000000000..e4f910d7218
--- /dev/null
+++ b/gawk-5.0.1/test/sortglos.awk
@@ -0,0 +1,51 @@
+BEGIN {
+	pr="y";
+	npre=0;
+	po="n";
+	npos=0;
+	}
+
+pr=="y"      { npre++; pre[npre]=$0; }
+$1=="@table" && $2=="@asis" { pr="n";nite++; next; }
+
+po=="y"      { npos++; pos[npos]=$0; }
+$1=="@end" && $2=="table"   {
+	po="y";
+	npos++;
+	pos[npos]=$0;
+	# last item...
+	vec[nite]=nlin;
+}
+
+	{ nite++; }
+
+END {
+	for ( i=1; i<=npre; i++ ) { print pre[i]; }
+	if ( srt=="y" ) {
+		n=asorti(entr,ital);
+		##print "n=",n;
+		for ( i=1; i<=n; i++ ) {
+			#printf("=========> %3.3d %s\n",i,ital[i]);
+			# ital[i] is the sorted key;
+			j=entr[ital[i]];
+			# j is the original item number
+			for ( k=1; k<=vec[j]; k++ ) {
+				print dat[j,k];
+			}
+		}
+	}
+	if ( srt=="n" ) {
+		for ( i=1; i<=nite; i++ ) {
+			printf("=========> %3.3d %2.2d %s\n",i,vec[i],titl[i]);
+			for ( j=1; j<=vec[i]; j++ ) {
+				print dat[i,j];
+			}
+		}
+		print "========================= END";
+	}
+	for ( i=1; i<=npos; i++ ) { print pos[i]; }
+	print "@c npre=" npre;
+	print "@c nite=" nite;
+	print "@c npos=" npos;
+}
+
diff --git a/gawk-5.0.1/test/sortglos.in b/gawk-5.0.1/test/sortglos.in
new file mode 100644
index 00000000000..b24373ded86
--- /dev/null
+++ b/gawk-5.0.1/test/sortglos.in
@@ -0,0 +1,22 @@
+@node Glossario
+@unnumbered Glossario
+
+@table @asis
+@item Azione
+Una serie di istruzioni @command{awk} associate a una regola.  Se
+l'espressione di ricerca della regola individua un record in input,
+@command{awk} esegue su quel record l'azione relativa.  Le azioni sono
+sempre racchiuse fra parentesi graffe.
+(@xref{Panoramica sulle azioni}).
+
+@item Spazio bianco
+Una sequenza di spazi, TAB, o caratteri di "a capo" presenti in un record in
+input o in una stringa.
+@end table
+
+@end ifclear
+
+@c The GNU General Public License.
+
+@c aggiornato alla versione: settembre 2014
+@c ultimo aggiornamento: 14 novembre 2014
diff --git a/gawk-5.0.1/test/sortglos.ok b/gawk-5.0.1/test/sortglos.ok
new file mode 100644
index 00000000000..69ddbe67a9d
--- /dev/null
+++ b/gawk-5.0.1/test/sortglos.ok
@@ -0,0 +1,15 @@
+@node Glossario
+@unnumbered Glossario
+
+@table @asis
+@end table
+
+@end ifclear
+
+@c The GNU General Public License.
+
+@c aggiornato alla versione: settembre 2014
+@c ultimo aggiornamento: 14 novembre 2014
+@c npre=4
+@c nite=22
+@c npos=8
diff --git a/gawk-5.0.1/test/sortu.awk b/gawk-5.0.1/test/sortu.awk
new file mode 100644
index 00000000000..508dc07f3c3
--- /dev/null
+++ b/gawk-5.0.1/test/sortu.awk
@@ -0,0 +1,118 @@
+# numeric before string, ascending by index
+function comp_num_str(s1, v1, s2, v2,		n1, n2) {
+	n1 = s1 + 0
+	n2 = s2 + 0
+	if (n1 == s1)
+		return (n2 == s2) ? (n1 - n2) : -1
+	else if (n2 == s2)
+		return 1
+	return (s1 < s2) ? -1 : (s1 != s2)
+}
+
+# ascending index number
+function comp_idx_num(s1, v1, s2, v2)
+{
+	return (s1 - s2)
+}
+
+# ascending value number
+function comp_val_num(s1, v1, s2, v2,	num)
+{
+	num = "^[-+]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][-+]?[0-9]+)?$"
+	# force stable sort, compare as strings if not numeric
+	if ((v1 - v2) == 0 && (v1 !~ num || v2 !~ num))
+		return comp_val_str(s1, v1, s2, v2)
+	return (v1 - v2)
+}
+
+# ascending value string
+function comp_val_str(s1, v1, s2, v2)
+{
+	v1 = v1 ""
+	v2 = v2 ""
+	return (v1 < v2) ? -1 : (v1 != v2)
+}
+
+# deterministic, by value (and index), descending numeric
+function comp_val_idx(s1, v1, s2, v2)
+{
+	return (v1 != v2) ? (v2 - v1) : (s2 - s1)
+}
+
+BEGIN {
+	a[1] = 10; a[100] = 1; a[2] = 200
+	a["cat"] = "tac"; a["rat"] = "tar";a["bat"] = "tab"
+
+	print "--- number before string, ascending by index ---"
+	PROCINFO["sorted_in"] = "comp_num_str"
+	for (i in a)
+		printf("%-10s%-s\n", i, a[i])
+
+	delete a
+	a[11] = 10; a[100] = 5; a[2] = 200
+	a[4] = 1; a[20] = 10; a[14] = 10
+	print "--- deterministic, by value (index), descending numeric ---"
+	PROCINFO["sorted_in"] = "comp_val_idx"
+	for (i in a)
+		printf("%-10s%-s\n", i, a[i])
+
+	for (IGNORECASE=0; IGNORECASE <= 1; IGNORECASE++) {
+		makea(a)
+		SORT_STR =  "comp_val_num"
+		printf("--- asort(a, b, \"%s\"), IGNORECASE = %d---\n", SORT_STR, IGNORECASE)
+		asort2(a, "")
+
+		makea(a)
+		SORT_STR =  "comp_val_str"
+		printf("--- asort(a, b, \"%s\"), IGNORECASE = %d---\n", SORT_STR, IGNORECASE)
+		asort2(a, "")
+
+		makea(a)
+		SORT_STR = "comp_val_str"
+		printf("--- asort(a, a, \"%s\"), IGNORECASE = %d---\n", SORT_STR, IGNORECASE)
+		asort1(a, "")
+  }
+}
+
+function makea(aa)
+{
+	delete aa
+	aa[1] = "barz";
+	aa[2] = "blattt";
+	aa[3] = "Zebra";
+	aa[4] = 1234;
+	aa[5] = 234;
+}
+
+# source array != destination array 
+function asort2(c, s,	d, k, m) 
+{
+	if (SORT_STR < 0)
+		m = asort(c, d);
+	else
+		m = asort(c, d, SORT_STR);
+	for (k=1; k <= m; k++) {
+		if (isarray(d[k]))
+			asort2(d[k], s"["k"]")
+		else
+			printf("%-10s:%-10s%-10s\n", s"["k"]", c[k], d[k])
+	}
+}
+
+# source array == destination array
+function asort1(c, s,   k, m) 
+{
+	if (SORT_STR < 0)
+		m = asort(c)
+	else if (SORT_STR != "")
+		m = asort(c, c, SORT_STR)
+	else
+		m = asort(c, c);
+
+	for (k=1; k <= m; k++) {
+		if (isarray(c[k]))
+			asort1(c[k], s"["k"]")
+		else
+			printf("%-10s:%-10s\n", s"["k"]", c[k])
+	}
+}
diff --git a/gawk-5.0.1/test/sortu.ok b/gawk-5.0.1/test/sortu.ok
new file mode 100644
index 00000000000..06dcd94d793
--- /dev/null
+++ b/gawk-5.0.1/test/sortu.ok
@@ -0,0 +1,50 @@
+--- number before string, ascending by index ---
+1         10
+2         200
+100       1
+bat       tab
+cat       tac
+rat       tar
+--- deterministic, by value (index), descending numeric ---
+2         200
+20        10
+14        10
+11        10
+100       5
+4         1
+--- asort(a, b, "comp_val_num"), IGNORECASE = 0---
+[1]       :barz      Zebra     
+[2]       :blattt    barz      
+[3]       :Zebra     blattt    
+[4]       :1234      234       
+[5]       :234       1234      
+--- asort(a, b, "comp_val_str"), IGNORECASE = 0---
+[1]       :barz      1234      
+[2]       :blattt    234       
+[3]       :Zebra     Zebra     
+[4]       :1234      barz      
+[5]       :234       blattt    
+--- asort(a, a, "comp_val_str"), IGNORECASE = 0---
+[1]       :1234      
+[2]       :234       
+[3]       :Zebra     
+[4]       :barz      
+[5]       :blattt    
+--- asort(a, b, "comp_val_num"), IGNORECASE = 1---
+[1]       :barz      barz      
+[2]       :blattt    blattt    
+[3]       :Zebra     Zebra     
+[4]       :1234      234       
+[5]       :234       1234      
+--- asort(a, b, "comp_val_str"), IGNORECASE = 1---
+[1]       :barz      1234      
+[2]       :blattt    234       
+[3]       :Zebra     barz      
+[4]       :1234      blattt    
+[5]       :234       Zebra     
+--- asort(a, a, "comp_val_str"), IGNORECASE = 1---
+[1]       :1234      
+[2]       :234       
+[3]       :barz      
+[4]       :blattt    
+[5]       :Zebra     
diff --git a/gawk-5.0.1/test/sourcesplit.ok b/gawk-5.0.1/test/sourcesplit.ok
new file mode 100644
index 00000000000..c883f51ca06
--- /dev/null
+++ b/gawk-5.0.1/test/sourcesplit.ok
@@ -0,0 +1,3 @@
+gawk: cmd. line:1: BEGIN { a = 5;
+gawk: cmd. line:1:               ^ unexpected newline or end of string
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/space.ok b/gawk-5.0.1/test/space.ok
new file mode 100644
index 00000000000..0f7695644fb
--- /dev/null
+++ b/gawk-5.0.1/test/space.ok
@@ -0,0 +1,2 @@
+gawk: fatal: can't open source file ` ' for reading (No such file or directory)
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/spacere.awk b/gawk-5.0.1/test/spacere.awk
new file mode 100644
index 00000000000..ba959309f17
--- /dev/null
+++ b/gawk-5.0.1/test/spacere.awk
@@ -0,0 +1,22 @@
+BEGIN {
+	c[" "] = "\" \""
+	c["\a"] = "\\a"
+	c["\b"] = "\\b"
+	c["\f"] = "\\f"
+	c["\n"] = "\\n"
+	c["\r"] = "\\r"
+	c["\t"] = "\\t"
+	c["\v"] = "\\v"
+
+	sort = "sort"
+
+	for (i in c)
+		printf("%s %s [[:space:]]\n", c[i],
+			i ~ /[[:space:]]/ ? "~" : "!~") | sort
+
+	for (i in c)
+		printf("%s %s [[:blank:]]\n", c[i],
+			i ~ /[[:blank:]]/ ? "~" : "!~") | sort
+
+	close(sort)
+}
diff --git a/gawk-5.0.1/test/spacere.ok b/gawk-5.0.1/test/spacere.ok
new file mode 100644
index 00000000000..4278c5c9df3
--- /dev/null
+++ b/gawk-5.0.1/test/spacere.ok
@@ -0,0 +1,16 @@
+" " ~ [[:blank:]]
+" " ~ [[:space:]]
+\a !~ [[:blank:]]
+\a !~ [[:space:]]
+\b !~ [[:blank:]]
+\b !~ [[:space:]]
+\f !~ [[:blank:]]
+\f ~ [[:space:]]
+\n !~ [[:blank:]]
+\n ~ [[:space:]]
+\r !~ [[:blank:]]
+\r ~ [[:space:]]
+\t ~ [[:blank:]]
+\t ~ [[:space:]]
+\v !~ [[:blank:]]
+\v ~ [[:space:]]
diff --git a/gawk-5.0.1/test/split_after_fpat.awk b/gawk-5.0.1/test/split_after_fpat.awk
new file mode 100644
index 00000000000..7e7cfd99326
--- /dev/null
+++ b/gawk-5.0.1/test/split_after_fpat.awk
@@ -0,0 +1,11 @@
+BEGIN { FPAT = "\"[^\"]*\"" }
+
+{ print $1 }
+
+END { f("hi there") }
+
+function f (p,   a, n, i)
+{
+        n = split(p,a)
+        print n ; for (i=1; i<=n; i++) print a[i]
+}
diff --git a/gawk-5.0.1/test/split_after_fpat.in b/gawk-5.0.1/test/split_after_fpat.in
new file mode 100644
index 00000000000..1aeefd597f7
--- /dev/null
+++ b/gawk-5.0.1/test/split_after_fpat.in
@@ -0,0 +1 @@
+a"stuff"b
diff --git a/gawk-5.0.1/test/split_after_fpat.ok b/gawk-5.0.1/test/split_after_fpat.ok
new file mode 100644
index 00000000000..5c284490179
--- /dev/null
+++ b/gawk-5.0.1/test/split_after_fpat.ok
@@ -0,0 +1,4 @@
+"stuff"
+2
+hi
+there
diff --git a/gawk-5.0.1/test/splitarg4.awk b/gawk-5.0.1/test/splitarg4.awk
new file mode 100644
index 00000000000..4187460be23
--- /dev/null
+++ b/gawk-5.0.1/test/splitarg4.awk
@@ -0,0 +1,138 @@
+BEGIN { 
+  split("c: ::ab+", fs_arr, ":") 
+}
+{
+  for (i = 1; i in fs_arr; ++i) {
+    split($0, a, fs_arr[i], seps)
+    print zipcat(a, seps)
+    dump_array(seps)
+  }
+}
+END { 
+  seps[1] = "123"; seps[5] = 10
+  for (i = 1; i in fs_arr; ++i) {
+    split("", a, fs_arr[i], seps)
+    dump_array(seps)
+  }
+}
+function dump_array(a,   i, mini, maxi)
+{
+  mini = minidx(a) + 0
+  maxi = maxidx(a) + 0
+  printf "{"
+  for (i = mini; i <= maxi; ++i)
+    if (i in a) {
+      if (i > mini)
+        printf ", "
+      printf "%d => \"%s\"", i, a[i]
+    }
+  printf "}\n"
+}
+function zipcat(a, b,   c)
+{
+  zip(a, b, c)
+  return cat(c)
+}
+
+function cat(a,   mini, maxi, i, s)
+{
+  mini = minidx(a) + 0
+  maxi = maxidx(a) + 0
+  for (i = mini; i <= maxi; ++i)
+    if (i in a)
+      s = s a[i]
+  return s
+}
+
+function zip(a, b, c,   mini, maxi, i)
+{
+  del(c)
+  mini = minidx2(a, b) + 0
+  maxi = maxidx2(a, b) + 0
+  for (i = mini; i <= maxi; ++i) {
+    if (i in a)
+      c[i] = a[i]
+    if (i in b)
+      c[i] = c[i] b[i]
+  }
+}
+
+function maxidx2(a, b)
+{
+  if (emptyarr(a))
+    return maxidx(b)
+  else if (emptyarr(b))
+    return maxidx(a)
+  else
+    return max(maxidx(a), maxidx(b))
+}
+
+function minidx2(a, b)
+{
+  if (emptyarr(a))
+    return minidx(b)
+  else if (emptyarr(b))
+    return minidx(a)
+  else
+    return min(minidx(a), minidx(b))
+}
+
+function maxidx(a,   i, m)
+{
+  if (emptyarr(a))
+    m = ""
+  else {
+    m = choose(a) + 0
+    for (i in a) {
+      i += 0
+      if (i > m)
+        m = i
+    }
+  }
+  return m
+}
+
+function minidx(a,   i, m)
+{
+  if (emptyarr(a))
+    m = ""
+  else {
+    m = choose(a) + 0
+    for (i in a) {
+      i += 0
+      if (i < m)
+        m = i
+    }
+  }
+  return m
+}
+
+function choose(a,   m)
+{
+  for (m in a)
+    return m
+  return ""
+}
+
+function emptyarr(a,  k)
+{
+  for (k in a)
+    return 0
+  return 1
+}
+
+# portable delete
+function del(a)
+{
+  split("", a)
+}
+
+function max(x, y)
+{
+  return x > y ? x : y
+}
+
+function min(x, y)
+{
+  return x < y ? x : y
+} 
diff --git a/gawk-5.0.1/test/splitarg4.in b/gawk-5.0.1/test/splitarg4.in
new file mode 100644
index 00000000000..3033acd7358
--- /dev/null
+++ b/gawk-5.0.1/test/splitarg4.in
@@ -0,0 +1,11 @@
+caccbdc
+acbcd
+
+ a  b def 
+a b dwf
+ a b dwf
+a b dwf
+abc
+a
+aabaabbabbbaabbb
+ab
diff --git a/gawk-5.0.1/test/splitarg4.ok b/gawk-5.0.1/test/splitarg4.ok
new file mode 100644
index 00000000000..761f284e4f0
--- /dev/null
+++ b/gawk-5.0.1/test/splitarg4.ok
@@ -0,0 +1,92 @@
+caccbdc
+{1 => "c", 2 => "c", 3 => "c", 4 => "c"}
+caccbdc
+{}
+caccbdc
+{1 => "", 2 => "", 3 => "", 4 => "", 5 => "", 6 => ""}
+caccbdc
+{}
+acbcd
+{1 => "c", 2 => "c"}
+acbcd
+{}
+acbcd
+{1 => "", 2 => "", 3 => "", 4 => ""}
+acbcd
+{}
+
+{}
+
+{}
+
+{}
+
+{}
+ a  b def 
+{}
+ a  b def 
+{0 => " ", 1 => "  ", 2 => " ", 3 => " "}
+ a  b def 
+{1 => "", 2 => "", 3 => "", 4 => "", 5 => "", 6 => "", 7 => "", 8 => "", 9 => ""}
+ a  b def 
+{}
+a b dwf
+{}
+a b dwf
+{1 => " ", 2 => " "}
+a b dwf
+{1 => "", 2 => "", 3 => "", 4 => "", 5 => "", 6 => ""}
+a b dwf
+{}
+ a b dwf
+{}
+ a b dwf
+{0 => " ", 1 => " ", 2 => " "}
+ a b dwf
+{1 => "", 2 => "", 3 => "", 4 => "", 5 => "", 6 => "", 7 => ""}
+ a b dwf
+{}
+a b dwf
+{}
+a b dwf
+{1 => " ", 2 => " "}
+a b dwf
+{1 => "", 2 => "", 3 => "", 4 => "", 5 => "", 6 => ""}
+a b dwf
+{}
+abc
+{1 => "c"}
+abc
+{}
+abc
+{1 => "", 2 => ""}
+abc
+{1 => "ab"}
+a
+{}
+a
+{}
+a
+{}
+a
+{}
+aabaabbabbbaabbb
+{}
+aabaabbabbbaabbb
+{}
+aabaabbabbbaabbb
+{1 => "", 2 => "", 3 => "", 4 => "", 5 => "", 6 => "", 7 => "", 8 => "", 9 => "", 10 => "", 11 => "", 12 => "", 13 => "", 14 => "", 15 => ""}
+aabaabbabbbaabbb
+{1 => "ab", 2 => "abb", 3 => "abbb", 4 => "abbb"}
+ab
+{}
+ab
+{}
+ab
+{1 => ""}
+ab
+{1 => "ab"}
+{}
+{}
+{}
+{}
diff --git a/gawk-5.0.1/test/splitargv.awk b/gawk-5.0.1/test/splitargv.awk
new file mode 100644
index 00000000000..10886ef26d0
--- /dev/null
+++ b/gawk-5.0.1/test/splitargv.awk
@@ -0,0 +1,7 @@
+BEGIN   {
+          for (idx = 1; idx < ARGC; idx++)
+            split(ARGV[idx], temp, ".");
+        }
+        {
+          print $0;
+        }
diff --git a/gawk-5.0.1/test/splitargv.in b/gawk-5.0.1/test/splitargv.in
new file mode 100644
index 00000000000..10886ef26d0
--- /dev/null
+++ b/gawk-5.0.1/test/splitargv.in
@@ -0,0 +1,7 @@
+BEGIN   {
+          for (idx = 1; idx < ARGC; idx++)
+            split(ARGV[idx], temp, ".");
+        }
+        {
+          print $0;
+        }
diff --git a/gawk-5.0.1/test/splitargv.ok b/gawk-5.0.1/test/splitargv.ok
new file mode 100644
index 00000000000..10886ef26d0
--- /dev/null
+++ b/gawk-5.0.1/test/splitargv.ok
@@ -0,0 +1,7 @@
+BEGIN   {
+          for (idx = 1; idx < ARGC; idx++)
+            split(ARGV[idx], temp, ".");
+        }
+        {
+          print $0;
+        }
diff --git a/gawk-5.0.1/test/splitarr.awk b/gawk-5.0.1/test/splitarr.awk
new file mode 100644
index 00000000000..c1185a4d805
--- /dev/null
+++ b/gawk-5.0.1/test/splitarr.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	a[1] = "elephantie"
+	a[2] = "e"
+	print split(a[1],a,a[2]), a[2], a[3], split(a[2],a,a[2])
+}
diff --git a/gawk-5.0.1/test/splitarr.ok b/gawk-5.0.1/test/splitarr.ok
new file mode 100644
index 00000000000..9402b94f4fa
--- /dev/null
+++ b/gawk-5.0.1/test/splitarr.ok
@@ -0,0 +1 @@
+4 l phanti 2
diff --git a/gawk-5.0.1/test/splitdef.awk b/gawk-5.0.1/test/splitdef.awk
new file mode 100644
index 00000000000..694db80a6c3
--- /dev/null
+++ b/gawk-5.0.1/test/splitdef.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	data = "abc:easy:as:one:two:three"
+	FS = ":"
+	FIELDWIDTHS = "3 1 4 1 2 1 3 1 3 1 5"
+	n = split(data, a)
+	printf "n = %d, a[3] = %s\n", n, a[3]
+}
diff --git a/gawk-5.0.1/test/splitdef.ok b/gawk-5.0.1/test/splitdef.ok
new file mode 100644
index 00000000000..5f13505f7f2
--- /dev/null
+++ b/gawk-5.0.1/test/splitdef.ok
@@ -0,0 +1 @@
+n = 6, a[3] = as
diff --git a/gawk-5.0.1/test/splitvar.awk b/gawk-5.0.1/test/splitvar.awk
new file mode 100644
index 00000000000..9e1ac790590
--- /dev/null
+++ b/gawk-5.0.1/test/splitvar.awk
@@ -0,0 +1,5 @@
+{
+	sep = "=+"
+	n = split($0, a, sep)
+	print n
+}
diff --git a/gawk-5.0.1/test/splitvar.in b/gawk-5.0.1/test/splitvar.in
new file mode 100644
index 00000000000..85be8ee5a36
--- /dev/null
+++ b/gawk-5.0.1/test/splitvar.in
@@ -0,0 +1 @@
+Here===Is=Some=====Data
diff --git a/gawk-5.0.1/test/splitvar.ok b/gawk-5.0.1/test/splitvar.ok
new file mode 100644
index 00000000000..b8626c4cff2
--- /dev/null
+++ b/gawk-5.0.1/test/splitvar.ok
@@ -0,0 +1 @@
+4
diff --git a/gawk-5.0.1/test/splitwht.awk b/gawk-5.0.1/test/splitwht.awk
new file mode 100644
index 00000000000..6163d72e210
--- /dev/null
+++ b/gawk-5.0.1/test/splitwht.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	str = "a   b\t\tc d"
+	n = split(str, a, " ")
+	print n
+	m = split(str, b, / /)
+	print m
+}
diff --git a/gawk-5.0.1/test/splitwht.ok b/gawk-5.0.1/test/splitwht.ok
new file mode 100644
index 00000000000..61c83cba41c
--- /dev/null
+++ b/gawk-5.0.1/test/splitwht.ok
@@ -0,0 +1,2 @@
+4
+5
diff --git a/gawk-5.0.1/test/sprintfc.awk b/gawk-5.0.1/test/sprintfc.awk
new file mode 100644
index 00000000000..ee1e5a7c5c5
--- /dev/null
+++ b/gawk-5.0.1/test/sprintfc.awk
@@ -0,0 +1 @@
+{ print sprintf("%c", $1), $1 }
diff --git a/gawk-5.0.1/test/sprintfc.in b/gawk-5.0.1/test/sprintfc.in
new file mode 100644
index 00000000000..4602d28dda5
--- /dev/null
+++ b/gawk-5.0.1/test/sprintfc.in
@@ -0,0 +1,3 @@
+65
+66
+foo
diff --git a/gawk-5.0.1/test/sprintfc.ok b/gawk-5.0.1/test/sprintfc.ok
new file mode 100644
index 00000000000..33769a82a39
--- /dev/null
+++ b/gawk-5.0.1/test/sprintfc.ok
@@ -0,0 +1,3 @@
+A 65
+B 66
+f foo
diff --git a/gawk-5.0.1/test/status-close.awk b/gawk-5.0.1/test/status-close.awk
new file mode 100644
index 00000000000..345bea49721
--- /dev/null
+++ b/gawk-5.0.1/test/status-close.awk
@@ -0,0 +1,14 @@
+BEGIN {
+    cat  = "cat ; exit 3"
+    print system("echo xxx | (cat ; exit 4)")
+
+    print "YYY" | cat
+
+    print close(cat)
+
+    echo = "echo boo ; exit 5"
+    echo | getline boo
+    print "got", boo
+
+    print close(echo)
+}
diff --git a/gawk-5.0.1/test/status-close.ok b/gawk-5.0.1/test/status-close.ok
new file mode 100644
index 00000000000..ad3c0ce1879
--- /dev/null
+++ b/gawk-5.0.1/test/status-close.ok
@@ -0,0 +1,6 @@
+xxx
+4
+YYY
+3
+got boo
+5
diff --git a/gawk-5.0.1/test/strcat1.awk b/gawk-5.0.1/test/strcat1.awk
new file mode 100644
index 00000000000..0d28017cb9e
--- /dev/null
+++ b/gawk-5.0.1/test/strcat1.awk
@@ -0,0 +1,6 @@
+
+function f1(b) { b = b "c"; print f(b); }
+
+function f(a) { a = a "b"; return a; }
+
+BEGIN { A = "a"; f1(A); }
diff --git a/gawk-5.0.1/test/strcat1.ok b/gawk-5.0.1/test/strcat1.ok
new file mode 100644
index 00000000000..66a2f4b494c
--- /dev/null
+++ b/gawk-5.0.1/test/strcat1.ok
@@ -0,0 +1 @@
+acb
diff --git a/gawk-5.0.1/test/strftfld.awk b/gawk-5.0.1/test/strftfld.awk
new file mode 100644
index 00000000000..26f75a5af56
--- /dev/null
+++ b/gawk-5.0.1/test/strftfld.awk
@@ -0,0 +1,3 @@
+{
+	print split(strftime($1), f)
+}
diff --git a/gawk-5.0.1/test/strftfld.in b/gawk-5.0.1/test/strftfld.in
new file mode 100644
index 00000000000..c11751432bc
--- /dev/null
+++ b/gawk-5.0.1/test/strftfld.in
@@ -0,0 +1 @@
+%F %T
diff --git a/gawk-5.0.1/test/strftfld.ok b/gawk-5.0.1/test/strftfld.ok
new file mode 100644
index 00000000000..d00491fd7e5
--- /dev/null
+++ b/gawk-5.0.1/test/strftfld.ok
@@ -0,0 +1 @@
+1
diff --git a/gawk-5.0.1/test/strftime.awk b/gawk-5.0.1/test/strftime.awk
new file mode 100644
index 00000000000..f1276c15eb0
--- /dev/null
+++ b/gawk-5.0.1/test/strftime.awk
@@ -0,0 +1,35 @@
+# strftime.awk ; test the strftime code
+#
+# input is the output of `date', see Makefile.in
+
+BEGIN {
+	maxtries = 10
+	# On DOS/Windows, DATECMD is set by the Makefile to point to
+	# Unix-like 'date' command.
+	datecmd = DATECMD
+	if (datecmd == "")
+	    datecmd = "date"
+	fmt = "%a %b %e %H:%M:%S %Z %Y"
+
+	# loop until before equals after, thereby protecting
+	# against a race condition where the seconds field might have
+	# incremented between running date and strftime
+	i = 0
+	while (1) {
+		if (++i > maxtries) {
+			printf "Warning: this system is so slow that after %d attempts, we could never get two sequential invocations of strftime to give the same result!\n", maxtries > "/dev/stderr"
+			break
+		}
+		before = strftime(fmt)
+		datecmd | getline sd
+		after = strftime(fmt)
+		close(datecmd)
+		if (before == after) {
+			if (i > 1)
+				printf "Notice: it took %d loops to get the before and after strftime values to match\n", i > "/dev/stderr"
+			break
+		}
+	}
+	print sd > "strftime.ok"
+	print after > OUTPUT
+}
diff --git a/gawk-5.0.1/test/strftlng.awk b/gawk-5.0.1/test/strftlng.awk
new file mode 100644
index 00000000000..0ef819509ed
--- /dev/null
+++ b/gawk-5.0.1/test/strftlng.awk
@@ -0,0 +1,11 @@
+# test file from Paul Eggert, eggert@twinsun.com
+# modified for portability (%c doesn't cut it)
+
+BEGIN {
+	BUFSIZ = 1024
+	simpleformat = format = "%m/%d/%y %H:%M:%S\n"
+	clen = length(strftime(format, 0))
+	for (i = 1; i < BUFSIZ / clen + 1; i++)
+		format = format simpleformat
+	printf "%s", strftime(format, 0)
+}
diff --git a/gawk-5.0.1/test/strftlng.ok b/gawk-5.0.1/test/strftlng.ok
new file mode 100644
index 00000000000..3008aa2edab
--- /dev/null
+++ b/gawk-5.0.1/test/strftlng.ok
@@ -0,0 +1,58 @@
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
+01/01/70 00:00:00
diff --git a/gawk-5.0.1/test/strnum1.awk b/gawk-5.0.1/test/strnum1.awk
new file mode 100644
index 00000000000..e9cbdaf6226
--- /dev/null
+++ b/gawk-5.0.1/test/strnum1.awk
@@ -0,0 +1,35 @@
+# Date: Tue, 04 Jul 2006 21:06:14 +0200 (MEST)
+# From: Heiner Marxen <Heiner.Marxen@DrB.Insel.DE>
+# Subject: conversion error
+# To: bug-gawk@gnu.org
+# Message-id: <200607041906.k64J6Eqa019360@drb9.drb.insel.de>
+# 
+# Hello,
+# 
+# The following awk script fails for gawk 3.1.4 and 3.1.5.
+# Older versions did not do this, but I cannot say, how old they were.
+# 
+BEGIN {
+    if( 0 ) {		#ok
+	t = "8"
+    }else {		#fails
+	t = ""
+	t = t "8"
+    }
+    printf("8  = %d\n", 0+t)	# ok without this line
+    t = t "8"			# does not invalidate numeric interpretation
+    printf("88 = %s\n", 0+t)
+    ## The above prints "88 = 8" with gawk 3.1.4 and 3.1.5
+}
+# 
+# 
+# The following one-liner already exhibits the bug:
+# 
+# gawk 'BEGIN{t=""; t=t "8";printf("8=%d\n", 0+t);t=t "8";printf("88=%s\n", 0+t)}'
+# 
+# 
+# Preliminary observation: under somewhat strange conditions a variable
+# does retain its numeric interpretation although something is appended to it.
+# -- 
+# Heiner Marxen				http://www.drb.insel.de/~heiner/
+# 
diff --git a/gawk-5.0.1/test/strnum1.ok b/gawk-5.0.1/test/strnum1.ok
new file mode 100644
index 00000000000..804bcfdea93
--- /dev/null
+++ b/gawk-5.0.1/test/strnum1.ok
@@ -0,0 +1,2 @@
+8  = 8
+88 = 88
diff --git a/gawk-5.0.1/test/strnum2.awk b/gawk-5.0.1/test/strnum2.awk
new file mode 100644
index 00000000000..44931d5f0ad
--- /dev/null
+++ b/gawk-5.0.1/test/strnum2.awk
@@ -0,0 +1,18 @@
+BEGIN {
+	split(" 1.234 ", f, "|")	# create a numeric string (strnum) value
+	OFMT = "%.1f"
+	CONVFMT = "%.2f"
+
+	# Check whether a strnum is displayed the same way before and
+	# after force_number is called. Also, should numeric strings
+	# be formatted with OFMT and CONVFMT or show the original string value?
+
+	print f[1]	# OFMT
+	print (f[1] "")	# CONVFMT
+
+	# force conversion to NUMBER if it has not happened already
+	x = f[1]+0
+
+	print f[1]	# OFMT
+	print (f[1] "")	# CONVFMT
+}
diff --git a/gawk-5.0.1/test/strnum2.ok b/gawk-5.0.1/test/strnum2.ok
new file mode 100644
index 00000000000..63898bd4bf7
--- /dev/null
+++ b/gawk-5.0.1/test/strnum2.ok
@@ -0,0 +1,4 @@
+ 1.234 
+ 1.234 
+ 1.234 
+ 1.234 
diff --git a/gawk-5.0.1/test/strtod.awk b/gawk-5.0.1/test/strtod.awk
new file mode 100644
index 00000000000..3326478e768
--- /dev/null
+++ b/gawk-5.0.1/test/strtod.awk
@@ -0,0 +1,5 @@
+{
+	x = "0x" $1 ; print x, x + 0
+	for (i=1; i<=NF; i++)
+		if ($i) print $i, "is not zero"
+}
diff --git a/gawk-5.0.1/test/strtod.in b/gawk-5.0.1/test/strtod.in
new file mode 100644
index 00000000000..d7f71aa936a
--- /dev/null
+++ b/gawk-5.0.1/test/strtod.in
@@ -0,0 +1 @@
+345 0 00 0e0 0E1 00E0 000e-5 .0e+0
diff --git a/gawk-5.0.1/test/strtod.ok b/gawk-5.0.1/test/strtod.ok
new file mode 100644
index 00000000000..a47a9b172c6
--- /dev/null
+++ b/gawk-5.0.1/test/strtod.ok
@@ -0,0 +1,2 @@
+0x345 0
+345 is not zero
diff --git a/gawk-5.0.1/test/strtonum.awk b/gawk-5.0.1/test/strtonum.awk
new file mode 100644
index 00000000000..22ad41e2953
--- /dev/null
+++ b/gawk-5.0.1/test/strtonum.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	print strtonum("0x13")
+	print strtonum("013")
+	print strtonum("13")
+	print strtonum(13)
+}
diff --git a/gawk-5.0.1/test/strtonum.ok b/gawk-5.0.1/test/strtonum.ok
new file mode 100644
index 00000000000..9d1e557baf9
--- /dev/null
+++ b/gawk-5.0.1/test/strtonum.ok
@@ -0,0 +1,4 @@
+19
+11
+13
+13
diff --git a/gawk-5.0.1/test/strtonum1.awk b/gawk-5.0.1/test/strtonum1.awk
new file mode 100644
index 00000000000..79d6ad13a60
--- /dev/null
+++ b/gawk-5.0.1/test/strtonum1.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	x = "011"
+	print x+0	# trigger NUMCUR
+	print strtonum(x)
+}
diff --git a/gawk-5.0.1/test/strtonum1.ok b/gawk-5.0.1/test/strtonum1.ok
new file mode 100644
index 00000000000..48a9ed43adf
--- /dev/null
+++ b/gawk-5.0.1/test/strtonum1.ok
@@ -0,0 +1,2 @@
+11
+9
diff --git a/gawk-5.0.1/test/subamp.awk b/gawk-5.0.1/test/subamp.awk
new file mode 100644
index 00000000000..731726cfc2c
--- /dev/null
+++ b/gawk-5.0.1/test/subamp.awk
@@ -0,0 +1 @@
+{ sub(/[[:lower:]]/, "&") ; print }
diff --git a/gawk-5.0.1/test/subamp.in b/gawk-5.0.1/test/subamp.in
new file mode 100644
index 00000000000..72943a16fb2
--- /dev/null
+++ b/gawk-5.0.1/test/subamp.in
@@ -0,0 +1 @@
+aaa
diff --git a/gawk-5.0.1/test/subamp.ok b/gawk-5.0.1/test/subamp.ok
new file mode 100644
index 00000000000..72943a16fb2
--- /dev/null
+++ b/gawk-5.0.1/test/subamp.ok
@@ -0,0 +1 @@
+aaa
diff --git a/gawk-5.0.1/test/subback.awk b/gawk-5.0.1/test/subback.awk
new file mode 100644
index 00000000000..d91513c14d9
--- /dev/null
+++ b/gawk-5.0.1/test/subback.awk
@@ -0,0 +1,16 @@
+BEGIN {
+    A[0] = "&"
+    for(i=1;i<=11;i++) {
+	A[i] = "\\" A[i-1]
+    }
+## A[] holds  & \& \\& \\\& \\\\& ...
+}
+
+{
+    for(i=0; i <= 11 ; i++) {
+        x = $0 
+        sub(/B/, A[i], x)
+	y = gensub(/B/, A[i], "1", $0)
+	print i, x, y
+    }
+}
diff --git a/gawk-5.0.1/test/subback.in b/gawk-5.0.1/test/subback.in
new file mode 100644
index 00000000000..223b7836fb1
--- /dev/null
+++ b/gawk-5.0.1/test/subback.in
@@ -0,0 +1 @@
+B
diff --git a/gawk-5.0.1/test/subback.ok b/gawk-5.0.1/test/subback.ok
new file mode 100644
index 00000000000..9792c82ba22
--- /dev/null
+++ b/gawk-5.0.1/test/subback.ok
@@ -0,0 +1,12 @@
+0 B B
+1 & &
+2 \B \B
+3 \& \&
+4 \\B \\B
+5 \\& \\&
+6 \\\B \\\B
+7 \\\& \\\&
+8 \\\\B \\\\B
+9 \\\\& \\\\&
+10 \\\\\B \\\\\B
+11 \\\\\& \\\\\&
diff --git a/gawk-5.0.1/test/subi18n.awk b/gawk-5.0.1/test/subi18n.awk
new file mode 100644
index 00000000000..69bfca2b0ca
--- /dev/null
+++ b/gawk-5.0.1/test/subi18n.awk
@@ -0,0 +1,68 @@
+# Date: Mon, 27 Feb 2006 12:35:30 +0900
+# From: KIMURA Koichi <kimura.koichi@canon.co.jp>
+# Subject: gawk: sub_common has multi-byte aware bug
+# To: bug-gawk@gnu.org
+# Message-id: <20060227121045.2198.KIMURA.KOICHI@canon.co.jp>
+# 
+# Hi,
+# 
+# A certain user faced bug of sub builtin function and report to me.
+# Then I investigated the bug.
+# 
+# reproduce script is here.
+
+BEGIN {
+	str = "type=\"directory\" version=\"1.0\""
+	#print "BEGIN:", str
+
+	while (str) {
+		sub(/^[^=]*/, "", str);
+		s = substr(str, 2)
+		print s
+		sub(/^="[^"]*"/, "", str)
+		sub(/^[ \t]*/, "", str)
+	}
+}
+
+# and sample result is here (on GNU/Linux Fedora core 3)
+# 
+# [kbk@skuld gawk-3.1.5]$ LC_ALL=C ./gawk -f subbug.awk
+# "directory" version="1.0"
+# "1.0"
+# [kbk@skuld gawk-3.1.5]$ LC_ALL=en_US.UTF-8 ./gawk -f subbug.awk
+# "directory" version="1.0"
+# "dire
+# [kbk@skuld gawk-3.1.5]$
+# 
+# In my investigation, this bug is cause by don't release wide-string when
+# sub is executed.
+# 
+# patch is here.
+# 
+# --- builtin.c.orig	2005-07-27 03:07:43.000000000 +0900
+# +++ builtin.c	2006-02-26 02:07:52.000000000 +0900
+# @@ -2463,6 +2468,15 @@ sub_common(NODE *tree, long how_many, in
+#  	t->stptr = buf;
+#  	t->stlen = textlen;
+# 
+# +#ifdef MBS_SUPPORT
+# +    if (t->flags & WSTRCUR) {
+# +        if (t->wstptr != NULL)
+# +            free(t->wstptr);
+# +        t->wstptr = NULL;
+# +        t->wstlen = 0;
+# +        t->flags &= ~WSTRCUR;
+# +    }
+# +#endif
+#  	free_temp(s);
+#  	if (matches > 0 && lhs) {
+#  		if (priv) {
+# 
+# 
+# -- 
+# KIMURA Koichi
+# 
+# 
+# #####################################################################################
+# This Mail Was Scanned by 012.net AntiVirus Service1- Powered by TrendMicro Interscan
+# 
diff --git a/gawk-5.0.1/test/subi18n.ok b/gawk-5.0.1/test/subi18n.ok
new file mode 100644
index 00000000000..54842cda0f9
--- /dev/null
+++ b/gawk-5.0.1/test/subi18n.ok
@@ -0,0 +1,2 @@
+"directory" version="1.0"
+"1.0"
diff --git a/gawk-5.0.1/test/subsepnm.awk b/gawk-5.0.1/test/subsepnm.awk
new file mode 100644
index 00000000000..976eef96e1e
--- /dev/null
+++ b/gawk-5.0.1/test/subsepnm.awk
@@ -0,0 +1 @@
+BEGIN { SUBSEP = 10; a[1, 1] = 100 ; print a[1 SUBSEP 1] }
diff --git a/gawk-5.0.1/test/subsepnm.ok b/gawk-5.0.1/test/subsepnm.ok
new file mode 100644
index 00000000000..29d6383b52c
--- /dev/null
+++ b/gawk-5.0.1/test/subsepnm.ok
@@ -0,0 +1 @@
+100
diff --git a/gawk-5.0.1/test/subslash.awk b/gawk-5.0.1/test/subslash.awk
new file mode 100644
index 00000000000..87ab02991a9
--- /dev/null
+++ b/gawk-5.0.1/test/subslash.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	i = 2
+	a[i] = 5
+	a[i] /= 2
+	printf "a[%s] = %f\n", i, a[i]
+}
diff --git a/gawk-5.0.1/test/subslash.ok b/gawk-5.0.1/test/subslash.ok
new file mode 100644
index 00000000000..4f3beffb42c
--- /dev/null
+++ b/gawk-5.0.1/test/subslash.ok
@@ -0,0 +1 @@
+a[2] = 2.500000
diff --git a/gawk-5.0.1/test/substr.awk b/gawk-5.0.1/test/substr.awk
new file mode 100644
index 00000000000..60163696d2c
--- /dev/null
+++ b/gawk-5.0.1/test/substr.awk
@@ -0,0 +1,14 @@
+BEGIN {
+	x = "A"
+	printf("%-39s\n", substr(x,1,39))
+	print substr("abcdef", 0, 2)
+	print substr("abcdef", 2.3, 2)
+	print substr("abcdef", -1, 2)
+	print substr("abcdef", 1, 0)
+	print substr("abcdef", 1, -3)
+	print substr("abcdef", 1, 2.3)
+	print substr("", 1, 2)
+	print substr("abcdef", 5, 5)
+	print substr("abcdef", 7, 2)
+	exit (0)
+}
diff --git a/gawk-5.0.1/test/substr.ok b/gawk-5.0.1/test/substr.ok
new file mode 100644
index 00000000000..be6889d1d12
--- /dev/null
+++ b/gawk-5.0.1/test/substr.ok
@@ -0,0 +1,10 @@
+A                                      
+ab
+bc
+ab
+
+
+ab
+
+ef
+
diff --git a/gawk-5.0.1/test/swaplns.awk b/gawk-5.0.1/test/swaplns.awk
new file mode 100644
index 00000000000..6bf2240a9da
--- /dev/null
+++ b/gawk-5.0.1/test/swaplns.awk
@@ -0,0 +1,7 @@
+{
+	if ((getline tmp) > 0) {
+		print tmp
+		print
+	} else
+		print
+}
diff --git a/gawk-5.0.1/test/swaplns.in b/gawk-5.0.1/test/swaplns.in
new file mode 100644
index 00000000000..71fb1627d40
--- /dev/null
+++ b/gawk-5.0.1/test/swaplns.in
@@ -0,0 +1,9 @@
+This directory contains some examples/test-cases for different
+features of gawk - mostly not present in an old awk.  Some are from
+"The GAWK Manual", some are original, and some are mixture of the two.
+Read header comments before attempting to use.  Have fun and remember
+that program which consists only of BEGIN block does not need an input
+file.
+
+   --mj
+
diff --git a/gawk-5.0.1/test/swaplns.ok b/gawk-5.0.1/test/swaplns.ok
new file mode 100644
index 00000000000..d38b7caad15
--- /dev/null
+++ b/gawk-5.0.1/test/swaplns.ok
@@ -0,0 +1,9 @@
+features of gawk - mostly not present in an old awk.  Some are from
+This directory contains some examples/test-cases for different
+Read header comments before attempting to use.  Have fun and remember
+"The GAWK Manual", some are original, and some are mixture of the two.
+file.
+that program which consists only of BEGIN block does not need an input
+   --mj
+
+
diff --git a/gawk-5.0.1/test/switch2.awk b/gawk-5.0.1/test/switch2.awk
new file mode 100644
index 00000000000..f788edbd172
--- /dev/null
+++ b/gawk-5.0.1/test/switch2.awk
@@ -0,0 +1,59 @@
+# From spcecdt@armory.com  Tue Jun  3 11:41:49 2003
+# Return-Path: <spcecdt@armory.com>
+# Received: from localhost (skeeve [127.0.0.1])
+# 	by skeeve.com (8.12.5/8.12.5) with ESMTP id h538fVuW018115
+# 	for <arnold@localhost>; Tue, 3 Jun 2003 11:41:49 +0300
+# Received: from actcom.co.il [192.114.47.1]
+# 	by localhost with POP3 (fetchmail-5.9.0)
+# 	for arnold@localhost (single-drop); Tue, 03 Jun 2003 11:41:49 +0300 (IDT)
+# Received: by actcom.co.il (mbox arobbins)
+#  (with Cubic Circle's cucipop (v1.31 1998/05/13) Tue Jun  3 11:41:37 2003)
+# X-From_: spcecdt@armory.com Mon Jun  2 20:17:30 2003
+# Received: from smtp1.actcom.net.il by actcom.co.il  with ESMTP
+# 	(8.11.6/actcom-0.2) id h52HHNY23516 for <arobbins@actcom.co.il>;
+# 	Mon, 2 Jun 2003 20:17:24 +0300 (EET DST)  
+# 	(rfc931-sender: mail.actcom.co.il [192.114.47.13])
+# Received: from f7.net (consort.superb.net [209.61.216.22])
+# 	by smtp1.actcom.net.il (8.12.8/8.12.8) with ESMTP id h52HIHqv028728
+# 	for <arobbins@actcom.co.il>; Mon, 2 Jun 2003 20:18:18 +0300
+# Received: from armory.com (deepthought.armory.com [192.122.209.42])
+# 	by f7.net (8.11.7/8.11.6) with SMTP id h52HHKl31637
+# 	for <arnold@skeeve.com>; Mon, 2 Jun 2003 13:17:20 -0400
+# Date: Mon, 2 Jun 2003 10:17:11 -0700
+# From: "John H. DuBois III" <spcecdt@armory.com>
+# To: arnold@skeeve.com
+# Subject: gawk 3.1.2c coredump
+# Message-ID: <20030602171711.GA3958@armory.com>
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=us-ascii
+# Content-Disposition: inline
+# User-Agent: Mutt/1.3.28i
+# X-Www: http://www.armory.com./~spcecdt/
+# Sender: spcecdt@armory.com
+# X-SpamBouncer: 1.4 (10/07/01)
+# X-SBClass: OK
+# Status: R
+# 
+#!/usr/local/bin/gawk -f
+BEGIN {
+    switch (substr("x",1,1)) {
+    case /ask.com/:
+	break
+    case "google":
+	break
+    }
+}
+# 
+# The stack says:
+# 
+# #0  0x0806fac2 in r_tree_eval (tree=0x8092000, iscond=0) at eval.c:813
+# #1  0x08070413 in r_tree_eval (tree=0x0, iscond=0) at eval.c:1071
+# #2  0x08070413 in r_tree_eval (tree=0x8092000, iscond=0) at eval.c:1071
+# #3  0x08070413 in r_tree_eval (tree=0x8092000, iscond=0) at eval.c:1071
+# [ this continues on indefinitely - I suppose it ran out of stack eventually ]
+# 
+# 	John
+# -- 
+# John DuBois  spcecdt@armory.com  KC6QKZ/AE  http://www.armory.com/~spcecdt/
+# 
+# 
diff --git a/gawk-5.0.1/test/switch2.ok b/gawk-5.0.1/test/switch2.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/symtab1.awk b/gawk-5.0.1/test/symtab1.awk
new file mode 100644
index 00000000000..eeb014375cf
--- /dev/null
+++ b/gawk-5.0.1/test/symtab1.awk
@@ -0,0 +1,21 @@
+function dumparray(name, array,		i)
+{
+	if (name == "ENVIRON" || name == "PROCINFO")
+		return
+
+	for (i in array)
+		if (isarray(array[i]))
+			dumparray(name "[" i "]", array[i])
+		else
+			printf("%s[%s] = %s\n", name, i, array[i])
+}
+
+BEGIN {
+	a[1] = 1
+	a[2][1] = 21
+	for (i in SYMTAB)
+		if (isarray(SYMTAB[i]))
+			dumparray(i, SYMTAB[i])
+		else
+			printf("SYMTAB[\"%s\"] = \"%s\"\n", i, SYMTAB[i])
+}
diff --git a/gawk-5.0.1/test/symtab1.ok b/gawk-5.0.1/test/symtab1.ok
new file mode 100644
index 00000000000..04709e099d9
--- /dev/null
+++ b/gawk-5.0.1/test/symtab1.ok
@@ -0,0 +1,31 @@
+ARGV[0] = gawk
+SYMTAB["i"] = "i"
+SYMTAB["ROUNDMODE"] = "N"
+SYMTAB["ORS"] = "
+"
+SYMTAB["OFS"] = " "
+SYMTAB["LINT"] = "0"
+SYMTAB["FNR"] = "0"
+SYMTAB["ERRNO"] = ""
+SYMTAB["NR"] = "0"
+SYMTAB["IGNORECASE"] = "0"
+SYMTAB["TEXTDOMAIN"] = "messages"
+SYMTAB["NF"] = "0"
+SYMTAB["ARGIND"] = "0"
+a[1] = 1
+a[2][1] = 21
+SYMTAB["ARGC"] = "1"
+SYMTAB["FIELDWIDTHS"] = ""
+SYMTAB["CONVFMT"] = "%.6g"
+SYMTAB["SUBSEP"] = ""
+SYMTAB["PREC"] = "53"
+SYMTAB["RS"] = "
+"
+SYMTAB["FPAT"] = "[^[:space:]]+"
+SYMTAB["RT"] = ""
+SYMTAB["RLENGTH"] = "0"
+SYMTAB["OFMT"] = "%.6g"
+SYMTAB["FS"] = " "
+SYMTAB["RSTART"] = "0"
+SYMTAB["FILENAME"] = ""
+SYMTAB["BINMODE"] = "0"
diff --git a/gawk-5.0.1/test/symtab10.awk b/gawk-5.0.1/test/symtab10.awk
new file mode 100644
index 00000000000..6fbd39946c5
--- /dev/null
+++ b/gawk-5.0.1/test/symtab10.awk
@@ -0,0 +1 @@
+BEGIN { SYMTAB["x"] ; y=1 ; y++ }
diff --git a/gawk-5.0.1/test/symtab10.in b/gawk-5.0.1/test/symtab10.in
new file mode 100644
index 00000000000..d9afcd666ac
--- /dev/null
+++ b/gawk-5.0.1/test/symtab10.in
@@ -0,0 +1,4 @@
+watch y
+run
+watch x
+continue
diff --git a/gawk-5.0.1/test/symtab10.ok b/gawk-5.0.1/test/symtab10.ok
new file mode 100644
index 00000000000..b0cabd7cb19
--- /dev/null
+++ b/gawk-5.0.1/test/symtab10.ok
@@ -0,0 +1,11 @@
+Watchpoint 1: y
+Starting program: 
+Stopping in BEGIN ...
+Watchpoint 1: y
+  Old value: untyped variable
+  New value: 1
+main() at `symtab10.awk':1
+1       BEGIN { SYMTAB["x"] ; y=1 ; y++ }
+no symbol `x' in current context
+Program exited normally with exit value: 0
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/symtab2.awk b/gawk-5.0.1/test/symtab2.awk
new file mode 100644
index 00000000000..bb26f75d039
--- /dev/null
+++ b/gawk-5.0.1/test/symtab2.awk
@@ -0,0 +1,6 @@
+BEGIN {
+	a = 5
+	printf "a = %d, SYMTAB[\"a\"] = %d\n", a, SYMTAB["a"]
+	SYMTAB["a"] = 4
+	printf "a = %d, SYMTAB[\"a\"] = %d\n", a, SYMTAB["a"]
+}
diff --git a/gawk-5.0.1/test/symtab2.ok b/gawk-5.0.1/test/symtab2.ok
new file mode 100644
index 00000000000..23d2bf697a1
--- /dev/null
+++ b/gawk-5.0.1/test/symtab2.ok
@@ -0,0 +1,2 @@
+a = 5, SYMTAB["a"] = 5
+a = 4, SYMTAB["a"] = 4
diff --git a/gawk-5.0.1/test/symtab3.awk b/gawk-5.0.1/test/symtab3.awk
new file mode 100644
index 00000000000..4c2026dcdef
--- /dev/null
+++ b/gawk-5.0.1/test/symtab3.awk
@@ -0,0 +1 @@
+BEGIN { a = 5 ; delete SYMTAB["a"] }
diff --git a/gawk-5.0.1/test/symtab3.ok b/gawk-5.0.1/test/symtab3.ok
new file mode 100644
index 00000000000..5b2835839ad
--- /dev/null
+++ b/gawk-5.0.1/test/symtab3.ok
@@ -0,0 +1,2 @@
+gawk: symtab3.awk:1: fatal: `delete' is not allowed with SYMTAB
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/symtab4.awk b/gawk-5.0.1/test/symtab4.awk
new file mode 100644
index 00000000000..4eed7e99df9
--- /dev/null
+++ b/gawk-5.0.1/test/symtab4.awk
@@ -0,0 +1 @@
+{SYMTAB["POS"]=1 ; print $POS }
diff --git a/gawk-5.0.1/test/symtab4.in b/gawk-5.0.1/test/symtab4.in
new file mode 100644
index 00000000000..d35e1920b66
--- /dev/null
+++ b/gawk-5.0.1/test/symtab4.in
@@ -0,0 +1,2 @@
+1 a
+2 b
diff --git a/gawk-5.0.1/test/symtab4.ok b/gawk-5.0.1/test/symtab4.ok
new file mode 100644
index 00000000000..1191247b6d9
--- /dev/null
+++ b/gawk-5.0.1/test/symtab4.ok
@@ -0,0 +1,2 @@
+1
+2
diff --git a/gawk-5.0.1/test/symtab5.awk b/gawk-5.0.1/test/symtab5.awk
new file mode 100644
index 00000000000..e4fbc85fef7
--- /dev/null
+++ b/gawk-5.0.1/test/symtab5.awk
@@ -0,0 +1 @@
+BEGIN {SYMTAB["POS"]=1} {print $POS}
diff --git a/gawk-5.0.1/test/symtab5.in b/gawk-5.0.1/test/symtab5.in
new file mode 100644
index 00000000000..d35e1920b66
--- /dev/null
+++ b/gawk-5.0.1/test/symtab5.in
@@ -0,0 +1,2 @@
+1 a
+2 b
diff --git a/gawk-5.0.1/test/symtab5.ok b/gawk-5.0.1/test/symtab5.ok
new file mode 100644
index 00000000000..1191247b6d9
--- /dev/null
+++ b/gawk-5.0.1/test/symtab5.ok
@@ -0,0 +1,2 @@
+1
+2
diff --git a/gawk-5.0.1/test/symtab6.awk b/gawk-5.0.1/test/symtab6.awk
new file mode 100644
index 00000000000..d8f4cb1da9b
--- /dev/null
+++ b/gawk-5.0.1/test/symtab6.awk
@@ -0,0 +1 @@
+BEGIN {SYMTAB["POS"]=1}
diff --git a/gawk-5.0.1/test/symtab6.ok b/gawk-5.0.1/test/symtab6.ok
new file mode 100644
index 00000000000..5a9cbfa03b6
--- /dev/null
+++ b/gawk-5.0.1/test/symtab6.ok
@@ -0,0 +1,2 @@
+gawk: symtab6.awk:1: fatal: cannot assign to arbitrary elements of SYMTAB
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/symtab7.awk b/gawk-5.0.1/test/symtab7.awk
new file mode 100644
index 00000000000..eb051145f13
--- /dev/null
+++ b/gawk-5.0.1/test/symtab7.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	getline
+	for (i = 1; i <= NF;++i)
+		SYMTAB[$i] = i
+}
+
+{ print $Age }
diff --git a/gawk-5.0.1/test/symtab7.in b/gawk-5.0.1/test/symtab7.in
new file mode 100644
index 00000000000..d2b5645d502
--- /dev/null
+++ b/gawk-5.0.1/test/symtab7.in
@@ -0,0 +1,3 @@
+Name Age
+John 30
+Jane 40
diff --git a/gawk-5.0.1/test/symtab7.ok b/gawk-5.0.1/test/symtab7.ok
new file mode 100644
index 00000000000..37de1a49adf
--- /dev/null
+++ b/gawk-5.0.1/test/symtab7.ok
@@ -0,0 +1,2 @@
+gawk: symtab7.awk:4: (FILENAME=- FNR=1) fatal: cannot assign to arbitrary elements of SYMTAB
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/symtab8.awk b/gawk-5.0.1/test/symtab8.awk
new file mode 100644
index 00000000000..2c8083185f1
--- /dev/null
+++ b/gawk-5.0.1/test/symtab8.awk
@@ -0,0 +1,5 @@
+{
+	SYMTAB[$1] = 1
+}
+
+END { print $test }
diff --git a/gawk-5.0.1/test/symtab8.in b/gawk-5.0.1/test/symtab8.in
new file mode 100644
index 00000000000..9daeafb9864
--- /dev/null
+++ b/gawk-5.0.1/test/symtab8.in
@@ -0,0 +1 @@
+test
diff --git a/gawk-5.0.1/test/symtab8.ok b/gawk-5.0.1/test/symtab8.ok
new file mode 100644
index 00000000000..da29b585577
--- /dev/null
+++ b/gawk-5.0.1/test/symtab8.ok
@@ -0,0 +1,29 @@
+test
+ARGC: 2
+ARGIND: 1
+ARGV: array, 2 elements
+BINMODE: 0
+CONVFMT: "%.6g"
+ERRNO: ""
+FIELDWIDTHS: ""
+FNR: 1
+FPAT: "[^[:space:]]+"
+FS: " "
+FUNCTAB: array, 41 elements
+IGNORECASE: 0
+LINT: 0
+NF: 1
+NR: 1
+OFMT: "%.6g"
+OFS: " "
+ORS: "\n"
+PREC: 53
+RLENGTH: 0
+ROUNDMODE: "N"
+RS: "\n"
+RSTART: 0
+RT: "\n"
+SUBSEP: "\034"
+SYMTAB: array, 29 elements
+TEXTDOMAIN: "messages"
+test: 1
diff --git a/gawk-5.0.1/test/symtab9.awk b/gawk-5.0.1/test/symtab9.awk
new file mode 100644
index 00000000000..6b520147616
--- /dev/null
+++ b/gawk-5.0.1/test/symtab9.awk
@@ -0,0 +1,19 @@
+BEGIN {
+	file = "testit.txt"
+	for (i = 1; i <= 3; i++)
+		print("line", i) > file
+	close(file)
+
+	ARGV[1] = file
+	ARGC = 2
+
+	for (i = 1; i <= 3; i++)
+		getline
+
+	printf "NR should be 3, is %d\n", SYMTAB["NR"]
+
+	# Can't do this here. Windows doesn't let you remove a file that
+	# is still open. Moving it to END won't help either, since the file
+	# (correctly) remain open until after the END finishes.
+	# system("rm testit.txt")
+}
diff --git a/gawk-5.0.1/test/symtab9.ok b/gawk-5.0.1/test/symtab9.ok
new file mode 100644
index 00000000000..759a427dc20
--- /dev/null
+++ b/gawk-5.0.1/test/symtab9.ok
@@ -0,0 +1 @@
+NR should be 3, is 3
diff --git a/gawk-5.0.1/test/synerr1.awk b/gawk-5.0.1/test/synerr1.awk
new file mode 100644
index 00000000000..131708d2574
--- /dev/null
+++ b/gawk-5.0.1/test/synerr1.awk
@@ -0,0 +1,4 @@
+# program to make sure we don't infinite
+# syntax errors
+
+print "hi"
diff --git a/gawk-5.0.1/test/synerr1.ok b/gawk-5.0.1/test/synerr1.ok
new file mode 100644
index 00000000000..e180f132323
--- /dev/null
+++ b/gawk-5.0.1/test/synerr1.ok
@@ -0,0 +1,3 @@
+gawk: synerr1.awk:4: print "hi"
+gawk: synerr1.awk:4: ^ syntax error
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/synerr2.awk b/gawk-5.0.1/test/synerr2.awk
new file mode 100644
index 00000000000..9860f248836
--- /dev/null
+++ b/gawk-5.0.1/test/synerr2.awk
@@ -0,0 +1,47 @@
+# From: =?ISO-8859-1?Q?J=FCrgen_Kahrs?= <Juergen.KahrsDELETETHIS@vr-web.de>
+# Newsgroups: gnu.utils.bug
+# Subject: Re: gawk-3.1.5: syntax error, core dump
+# Date: Fri, 23 Jun 2006 18:12:07 +0200
+# Lines: 12
+# Approved: bug-gnu-utils@gnu.org
+# Message-ID: <mailman.3258.1151079135.9609.bug-gnu-utils@gnu.org>
+# References: <mailman.3236.1151045898.9609.bug-gnu-utils@gnu.org>
+# Reply-To: Juergen.KahrsDELETETHIS@vr-web.de
+# NNTP-Posting-Host: lists.gnu.org
+# Mime-Version: 1.0
+# Content-Type: text/plain; charset=ISO-8859-1
+# Content-Transfer-Encoding: 7bit
+# X-Trace: news.Stanford.EDU 1151079136 27033 199.232.76.165 (23 Jun 2006 16:12:16 GMT)
+# X-Complaints-To: news@news.stanford.edu
+# To: gnu-utils-bug@moderators.isc.org
+# Envelope-to: bug-gnu-utils@gnu.org
+# X-Orig-X-Trace: individual.net
+# 	vYX9N7nUUtqHxPyspweN0gZ4Blkl17z/xU01EwbykxB178O8M=
+# User-Agent: Thunderbird 1.5 (X11/20060317)
+# In-Reply-To: <mailman.3236.1151045898.9609.bug-gnu-utils@gnu.org>
+# X-BeenThere: bug-gnu-utils@gnu.org
+# X-Mailman-Version: 2.1.5
+# Precedence: list
+# List-Id: Bug reports for the GNU utilities <bug-gnu-utils.gnu.org>
+# List-Unsubscribe: <http://lists.gnu.org/mailman/listinfo/bug-gnu-utils>,
+# 	<mailto:bug-gnu-utils-request@gnu.org?subject=unsubscribe>
+# List-Archive: <http://lists.gnu.org/pipermail/bug-gnu-utils>
+# List-Post: <mailto:bug-gnu-utils@gnu.org>
+# List-Help: <mailto:bug-gnu-utils-request@gnu.org?subject=help>
+# List-Subscribe: <http://lists.gnu.org/mailman/listinfo/bug-gnu-utils>,
+# 	<mailto:bug-gnu-utils-request@gnu.org?subject=subscribe>
+# Path: news.012.net.il!seanews2.seabone.net!newsfeed.albacom.net!news.mailgate.org!newsfeed.stueberl.de!newsfeed.news2me.com!headwall.stanford.edu!newsfeed.stanford.edu!shelby.stanford.edu!individual.net!not-for-mail
+# Xref: news.012.net.il gnu.utils.bug:813
+# 
+# Karel Zak wrote:
+# 
+# >  it seems that gawk has problem with "syntax error" reporting:
+# > 
+# >  ./gawk '/^include / { system(sprintf("cd /etc; cat %s", [$]2)); skip
+# >  = 1; } { if (!skip) print $0; skipQuit; }' < /etc/ld.so.conf 
+# 
+# This test case can be boiled down to
+# 
+#   gawk 'BEGIN {sprintf("%s", $)}'
+# 
+BEGIN { sprintf("%s", $) }
diff --git a/gawk-5.0.1/test/synerr2.ok b/gawk-5.0.1/test/synerr2.ok
new file mode 100644
index 00000000000..cd30a8438a0
--- /dev/null
+++ b/gawk-5.0.1/test/synerr2.ok
@@ -0,0 +1,3 @@
+gawk: synerr2.awk:47: BEGIN { sprintf("%s", $) }
+gawk: synerr2.awk:47:                        ^ syntax error
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/synerr3.awk b/gawk-5.0.1/test/synerr3.awk
new file mode 100644
index 00000000000..49b9e30a0dd
--- /dev/null
+++ b/gawk-5.0.1/test/synerr3.awk
@@ -0,0 +1 @@
+for (i = ) in foo bar baz
diff --git a/gawk-5.0.1/test/synerr3.ok b/gawk-5.0.1/test/synerr3.ok
new file mode 100644
index 00000000000..b8b9dd89a58
--- /dev/null
+++ b/gawk-5.0.1/test/synerr3.ok
@@ -0,0 +1,5 @@
+gawk: synerr3.awk:1: for (i = ) in foo bar baz
+gawk: synerr3.awk:1: ^ syntax error
+gawk: synerr3.awk:1: for (i = ) in foo bar baz
+gawk: synerr3.awk:1:          ^ syntax error
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/tailrecurse.awk b/gawk-5.0.1/test/tailrecurse.awk
new file mode 100644
index 00000000000..b287d168512
--- /dev/null
+++ b/gawk-5.0.1/test/tailrecurse.awk
@@ -0,0 +1,15 @@
+BEGIN {
+	abc(2)
+}
+
+
+function abc(c, A, B)
+{
+	print "abc(" c ", " length(A) ")"
+	if (! c--) {
+		return 
+	}
+	B[""]
+	print length(B)
+	return abc(c, B)
+}
diff --git a/gawk-5.0.1/test/tailrecurse.ok b/gawk-5.0.1/test/tailrecurse.ok
new file mode 100644
index 00000000000..73ce1edec12
--- /dev/null
+++ b/gawk-5.0.1/test/tailrecurse.ok
@@ -0,0 +1,5 @@
+abc(2, 0)
+1
+abc(1, 1)
+1
+abc(0, 1)
diff --git a/gawk-5.0.1/test/testext.ok b/gawk-5.0.1/test/testext.ok
new file mode 100644
index 00000000000..fbc3c26340f
--- /dev/null
+++ b/gawk-5.0.1/test/testext.ok
@@ -0,0 +1,94 @@
+pets has 5 elements
+dump_array_and_delete: sym_lookup of pets passed
+dump_array_and_delete: incoming size is 5
+	pets["1"] = "blacky"
+	pets["2"] = "rusty"
+	pets["3"] = "sophie"
+dump_array_and_delete: marking element "3" for deletion
+	pets["4"] = "raincloud"
+	pets["5"] = "lucky"
+dump_array_and_delete(pets) returned 1
+dump_array_and_delete() did remove index "3"!
+
+try_modify_environ: sym_lookup of ENVIRON passed
+try_modify_environ: set_array_element of ENVIRON failed
+try_modify_environ: marking element "testext" for deletion
+try_del_environ() could not delete element - pass
+try_del_environ() could not add an element - pass
+var_test: sym_lookup of PROCINFO passed - got a value!
+var_test: sym_lookup of ARGC passed - got a value!
+var_test: sym_update of ARGC failed - correctly
+var_test: sym_update("testvar") succeeded
+var_test() returned 1, test_var = 42
+
+test_errno() returned 1, ERRNO = No child processes
+
+fubar = 9
+rumpus = -5
+uid matches 1
+api_major matches 1
+test_deferred returns 1
+
+length of test_array is 10, should be 10
+test_array_size: incoming size is 10
+test_array_size() returned 1, length is now 0
+
+test_array_elem: a["3"] = "three"
+test_array_elem() returned 1, test_array2[3] = 42
+test_array_elem() did remove element "5"
+test_array_elem() added element "7" --> seven
+test_array2["subarray"]["hello"] = world
+test_array2["subarray"]["answer"] = 42
+
+test_array_param() returned 1
+isarray(a_new_array) = 1
+a_new_array["hello"] = world
+a_new_array["answer"] = 42
+test_array_param: argument is not undefined (1)
+test_array_param() returned 0
+isarray(a_scalar) = 0
+
+Initial value of LINT is 0
+print_do_lint: lint = 0
+print_do_lint() returned 1
+Changed value of LINT is 1
+print_do_lint: lint = 1
+print_do_lint() returned 1
+
+test_scalar(1) returned 1, the_scalar is 1
+test_scalar(3) returned 1, the_scalar is 3
+test_scalar(5) returned 1, the_scalar is 5
+test_scalar(7) returned 1, the_scalar is 7
+test_scalar(9) returned 1, the_scalar is 9
+test_scalar(11) returned 1, the_scalar is 11
+test_scalar(the) returned 1, the_scalar is the
+test_scalar(quick) returned 1, the_scalar is quick
+test_scalar(brown) returned 1, the_scalar is brown
+test_scalar(fox) returned 1, the_scalar is fox
+test_scalar(jumps) returned 1, the_scalar is jumps
+test_scalar(over) returned 1, the_scalar is over
+test_scalar(the) returned 1, the_scalar is the
+test_scalar(lazy) returned 1, the_scalar is lazy
+test_scalar(dog) returned 1, the_scalar is dog
+test_scalar_reserved: sym_lookup of ARGC passed - got a value!
+test_scalar_reserved: could not update new_value2 for ARGC - pass
+test_indirect_var: sym_lookup of NR passed
+test_indirect_var: value of NR is 3
+test_indirect_var() return 1
+
+test_get_file returned 0
+File [.test.alias] nr [1]: line 1
+File [.test.alias] nr [2]: line 2
+File [.test.alias] nr [3]: line 3
+
+answer_num = 42
+message_string = hello, world
+new_array["hello"] = "world"
+new_array["answer"] = "42"
+
+test::testval = in namespace test
+test::test_function() called.
+
+at_exit2 called (should be first): data = NULL, exit_status = 0
+at_exit1 called (should be second): (data is & data_for_1), data value = 0xdeadbeef, exit_status = 0
+at_exit0 called (should be third): data = NULL, exit_status = 0
diff --git a/gawk-5.0.1/test/time.awk b/gawk-5.0.1/test/time.awk
new file mode 100644
index 00000000000..517377e26a5
--- /dev/null
+++ b/gawk-5.0.1/test/time.awk
@@ -0,0 +1,22 @@
+@load "time"
+
+# make sure gettimeofday() is consistent with systime().  We must call
+# gettimeofday() before systime() to make sure the subtraction gives 0
+# without risk of rolling over to the next second.
+function timecheck(st,res) {
+   res = gettimeofday()
+   st = systime()
+   printf "gettimeofday - systime = %d\n", res-st
+   return res
+}
+
+BEGIN {
+   delta = 1.3
+   t0 = timecheck()
+   printf "sleep(%s) = %s\n",delta,sleep(delta)
+   t1 = timecheck()
+   slept = t1-t0
+   if ((slept < 0.9*delta) || (slept > 1.3*delta))
+      printf "Warning: tried to sleep %.2f secs, but slept for %.2f secs\n",
+	     delta,slept
+}
diff --git a/gawk-5.0.1/test/time.ok b/gawk-5.0.1/test/time.ok
new file mode 100644
index 00000000000..46606bfe919
--- /dev/null
+++ b/gawk-5.0.1/test/time.ok
@@ -0,0 +1,3 @@
+gettimeofday - systime = 0
+sleep(1.3) = 0
+gettimeofday - systime = 0
diff --git a/gawk-5.0.1/test/timeout.awk b/gawk-5.0.1/test/timeout.awk
new file mode 100644
index 00000000000..ba6d87b2a72
--- /dev/null
+++ b/gawk-5.0.1/test/timeout.awk
@@ -0,0 +1,26 @@
+BEGIN {
+	cmd = "echo hello; sleep 1; echo goodbye"
+
+	print "With timeouts"
+	PROCINFO[cmd, "READ_TIMEOUT"] = 400
+	while ((rc = (cmd | getline x)) > 0)
+		print x
+	if (rc < 0)
+		print rc, (PROCINFO["errno"] != 0), (ERRNO != "")
+	print (close(cmd) != 0)
+
+	PROCINFO[cmd, "RETRY"]
+	print ""
+	print "With timeouts and retries"
+	while (((rc = (cmd | getline x)) > 0) || (rc == -2)) {
+		if (rc > 0) {
+			print x
+			n = 0
+		}
+		else
+			print ++n, "timed out; trying again"
+	}
+	if (rc < 0)
+		print rc, (PROCINFO["errno"] != 0), (ERRNO != "")
+	print (close(cmd) != 0)
+}
diff --git a/gawk-5.0.1/test/timeout.ok b/gawk-5.0.1/test/timeout.ok
new file mode 100644
index 00000000000..f1d791b1f26
--- /dev/null
+++ b/gawk-5.0.1/test/timeout.ok
@@ -0,0 +1,11 @@
+With timeouts
+hello
+-1 1 1
+1
+
+With timeouts and retries
+hello
+1 timed out; trying again
+2 timed out; trying again
+goodbye
+0
diff --git a/gawk-5.0.1/test/tradanch.awk b/gawk-5.0.1/test/tradanch.awk
new file mode 100644
index 00000000000..0cd45d17a41
--- /dev/null
+++ b/gawk-5.0.1/test/tradanch.awk
@@ -0,0 +1,2 @@
+/foo^bar/
+/foo$bar/
diff --git a/gawk-5.0.1/test/tradanch.in b/gawk-5.0.1/test/tradanch.in
new file mode 100644
index 00000000000..e5c8a094caa
--- /dev/null
+++ b/gawk-5.0.1/test/tradanch.in
@@ -0,0 +1,2 @@
+foo^bar
+foo$bar
diff --git a/gawk-5.0.1/test/tradanch.ok b/gawk-5.0.1/test/tradanch.ok
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/gawk-5.0.1/test/trailbs.awk b/gawk-5.0.1/test/trailbs.awk
new file mode 100644
index 00000000000..9b8c6d637d1
--- /dev/null
+++ b/gawk-5.0.1/test/trailbs.awk
@@ -0,0 +1 @@
+0~$0
\ No newline at end of file
diff --git a/gawk-5.0.1/test/trailbs.in b/gawk-5.0.1/test/trailbs.in
new file mode 100644
index 00000000000..4434fe2b6b5
--- /dev/null
+++ b/gawk-5.0.1/test/trailbs.in
@@ -0,0 +1 @@
+00000�a000000000000000\
\ No newline at end of file
diff --git a/gawk-5.0.1/test/trailbs.ok b/gawk-5.0.1/test/trailbs.ok
new file mode 100644
index 00000000000..b0bb8d3ac5a
--- /dev/null
+++ b/gawk-5.0.1/test/trailbs.ok
@@ -0,0 +1,2 @@
+gawk: trailbs.awk:1: (FILENAME=- FNR=1) fatal: invalid regexp: Trailing backslash: /00000�a000000000000000\/
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/tweakfld.awk b/gawk-5.0.1/test/tweakfld.awk
new file mode 100644
index 00000000000..e7b538f64de
--- /dev/null
+++ b/gawk-5.0.1/test/tweakfld.awk
@@ -0,0 +1,296 @@
+# To: bug-gnu-utils@prep.ai.mit.edu
+# Cc: arnold@gnu.ai.mit.edu
+# Date: Mon, 20 Nov 1995 11:39:29 -0500
+# From: "R. Hank Donnelly" <emory!head-cfa.harvard.edu!donnelly>
+# 
+# Operating system: Linux1.2.13 (Slackware distrib)
+# GAWK version: 2.15 (?)
+# compiler: GCC (?)
+# 
+# The following enclosed script does not want to fully process the input data
+# file. It correctly executes the operations on the first record, and then dies
+# on the second one. My true data file is much longer but this is
+# representative and it does fail on a file even as short as this one.
+# The failure appears to occur in the declared function add2output. Between the
+# steps of incrementing NF by one and setting $NF to the passed variable
+# the passed variable appears to vanish (i.e. NF does go from 68 to 69
+# and before incrementing it "variable" equals what it should but after
+# "variable" has no value at all.)
+# 
+# The scripts have been developed using nawk on a Sun (where they run fine)
+# I have tried gawk there but get a different crash which I have not yet traced
+# down. Ideally I would like to keep the script the same so that it would run
+# on either gawk or nawk (that way I can step back and forth between laptop and
+# workstation.
+# 
+# Any ideas why the laptop installation is having problems?
+# Hank 
+# 
+# 
+# #!/usr/bin/gawk -f
+
+BEGIN {
+	# set a few values
+	FS = "\t"
+	OFS = "\t"
+	pi = atan2(0, -1)
+# distance from HRMA to focal plane in mm
+	fullradius = 10260.54
+
+	# set locations of parameters on input line
+	nf_nrg = 1
+	nf_order = 3
+	nf_item = 4
+	nf_suite = 5
+	nf_grating = 8
+	nf_shutter = 9
+	nf_type = 13
+	nf_src = 14
+	nf_target = 15
+	nf_voltage = 16
+	nf_flux = 17
+	nf_filt1 = 20
+	nf_filt1_th = 21
+	nf_filt2 = 22
+	nf_filt2_th = 23
+	nf_bnd = 24
+	nf_hrma_polar = 27
+	nf_hrma_az = 28
+	nf_detector = 30
+	nf_acis_read = 32
+	nf_acis_proc = 33
+	nf_acis_frame = 34
+	nf_hxda_aplist = 36
+	nf_hxda_y_range = 37
+	nf_hxda_z_range = 38
+	nf_hxda_y_step = 39
+	nf_hxda_z_step = 40
+	nf_sim_z = 41
+	nf_fam_polar = 43
+	nf_fam_az = 44
+	nf_fam_dither_type = 45
+	nf_mono_init = 51
+	nf_mono_range = 52
+	nf_mono_step = 53
+	nf_defocus = 54
+	nf_acis_temp = 55
+	nf_tight = 59
+	nf_offset_y = 64
+	nf_offset_z = 65
+
+	while( getline < "xrcf_mnemonics.dat" > 0 ) {
+		mnemonic[$1] = $2
+	}
+
+#	"date" | getline date_line
+# ADR: use a fixed date so that testing will work
+	date_line = "Sun Mar 10 23:00:27 EST 1996"
+        split(date_line, in_date, " ")
+        out_date = in_date[2] " " in_date[3] ", " in_date[6]
+}
+
+function add2output( variable ) {
+#print("hi1") >> "debug"
+	NF++
+#print("hi2") >> "debug"
+ 	$NF = variable
+#print("hi3") >> "debug"
+}
+
+function error( ekey, message ) {
+	print "Error at input line " NR ", anode " ekey >> "errors.cleanup"
+	print "   " message "." >> "errors.cleanup"
+}
+
+function hxda_na() {
+	$nf_hxda_aplist = $nf_hxda_y_range = $nf_hxda_z_range = "N/A"
+	$nf_hxda_y_step = $nf_hxda_z_step = "N/A"
+}
+
+function acis_na() {
+	$nf_acis_read = $nf_acis_proc = $nf_acis_frame = $nf_acis_temp = "N/A"
+}
+
+function hrc_na() {
+#        print ("hi") >> "debug"
+}
+
+function fpsi_na() {
+	acis_na()
+	hrc_na()
+	$nf_sim_z = $nf_fam_polar = $nf_fam_az = $nf_fam_dither_type = "N/A"
+}
+
+function mono_na() {
+	$nf_mono_init = $nf_mono_range = $nf_mono_step = "N/A"
+}
+
+# this gives the pitch and yaw of the HRMA and FAM
+# positive pitch is facing the source "looking down"
+# positive yaw is looking left
+# 0 az is north 90 is up
+# this also adds in the FAM X,Y,Z positions 
+
+function polaz2yawpitch(polar, az) {
+	theta = az * pi / 180
+	phi = polar * pi / 180 / 60
+
+
+	if( polar == 0 ) {
+		add2output( 0 )
+		add2output( 0 )
+	} else {
+		if(az == 0 || az == 180)
+			add2output( 0 )
+		else 
+			add2output( - polar * sin(theta) )
+
+
+#			x = cos (phi)
+#			y = sin (phi) * cos (theta)
+#			add2output( atan2(y,x)*180 / pi * 60 )
+		
+		if(az == 90 || az ==270 )
+			add2output( 0 )
+		else 
+			add2output( - polar * cos(theta) )
+
+	}
+#			x = cos (phi)
+#			z= sin (phi) * sin (theta)
+#			add2output( atan2(z,x)*180 / pi * 60 )
+
+	if(config !~ /HXDA/) {
+# negative values of defocus move us farther from the source thus
+# increasing radius
+		radius = fullradius - defocus
+
+# FAM_x; FAM_y;  FAM_z
+	   	if((offset_y == 0) && (offset_z == 0)){
+			add2output( fullradius - radius * cos (phi) )
+	
+			if (az == 90 || az ==270) 
+				add2output( 0 )
+			else
+				add2output(  radius * sin (phi) * cos (theta) )
+			
+			if (az == 0 || az == 180)
+				add2output( 0 )
+			else		
+				add2output( - radius * sin (phi) * sin (theta) )
+	   	} else {
+# ******* THIS SEGMENT OF CODE IS NOT MATHEMATICALLY CORRECT FOR ****
+# OFF AXIS ANGLES AND IS SUPPLIED AS A WORKAROUND SINCE IT WILL
+# PROBABLY ONLY BE USED ON AXIS.
+			add2output( defocus )
+			add2output( offset_y )
+			add2output( offset_z )
+		}
+
+	} else {
+		add2output( "N/A" )
+		add2output( "N/A" )
+		add2output( "N/A" )
+	}
+}
+
+# set TIGHT/LOOSE to N/A if it is not one of the two allowed values
+function tight_na() {
+	if( $nf_tight !~ /TIGHT|LOOSE/ ) {
+		$nf_tight == "N/A"
+	}
+}
+
+# this entry is used to give certain entries names
+{
+	type = $nf_type
+	item = $nf_item
+	suite = $nf_suite
+	order = $nf_order
+	detector = $nf_detector
+	grating = $nf_grating
+	offset_y= $nf_offset_y
+	offset_z= $nf_offset_z
+	bnd = $nf_bnd
+	defocus = $nf_defocus
+}
+
+{
+	# make configuration parameter
+	# as well as setting configuration-dependent N/A values
+
+	if( $nf_bnd ~ "SCAN" ) {
+		# BND is scanning beam
+		config = "BND"
+		hxda_na()
+		fpsi_na()
+	} else {
+		if( grating == "NONE" ) {
+			config = "HRMA"
+		} else {
+			if( grating == "HETG" ) {
+				if( order != "Both" ) {
+				    $nf_shutter = order substr($nf_shutter, \
+					index($nf_shutter, ",") )
+				}
+			} else {
+				order = "N/A"
+			}
+			config = "HRMA/" grating
+		}
+	
+		if( detector ~ /ACIS|HRC/ ) {
+			detsys = detector
+			nsub = sub("-", ",", detsys)
+			config = config "/" detsys
+			hxda_na()
+		} else {
+			config = config "/HXDA"
+			fpsi_na()
+			if( detector == "HSI" ) {
+				hxda_na()
+			}
+		}
+	}
+
+	add2output( config )
+
+	if( $nf_src ~ /EIPS|Penning/ ) mono_na()
+
+	if( $nf_src == "Penning" ) $nf_voltage = "N/A"
+
+	itm = sprintf("%03d", item)
+
+	if(config in mnemonic) {
+		if( type in mnemonic ) {
+		    ID = mnemonic[config] "-" mnemonic[type] "-" suite "." itm
+		    add2output( ID )
+		} else {
+			error(type, "measurement type not in list")
+		}
+	} else {
+		error(config, "measurement configuration not in list")
+	}
+
+	# add date to output line
+	add2output( out_date )
+
+	# Convert HRMA polar and azimuthal angles to yaw and pitch
+	polaz2yawpitch($nf_hrma_polar, $nf_hrma_az)
+
+	# set TIGHT/LOOSE to N/A if it is not one of the two allowed values
+	tight_na()
+
+	# compute number of HXDA apertures
+	if( config ~ /HXDA/ && $nf_hxda_aplist != "N/A") 
+		add2output( split( $nf_hxda_aplist, dummy, "," ) )
+	else
+		add2output( "N/A" )
+
+	# make sure the BND value is properly set
+	if($nf_bnd == "FIXED" && detector ~ /ACIS/)
+		$nf_bnd =bnd"-SYNC"
+	else
+		$nf_bnd = bnd"-FREE"
+	print
+}
diff --git a/gawk-5.0.1/test/tweakfld.in b/gawk-5.0.1/test/tweakfld.in
new file mode 100644
index 00000000000..e27a9dde806
--- /dev/null
+++ b/gawk-5.0.1/test/tweakfld.in
@@ -0,0 +1,3 @@
+0.277	N/A	N/A	1	1	ASC/Hank Donnelly	N/A	NONE	ALL,ALL	N/A	N/A	N/A	Count Rate Linearity	EIPS	C-Ka	1.108	0.13484	N/A	N/A	C8H8	10.32	C8H8	20.64	FIXED	1000	NO	0	0	0	HRC,I	1000	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	0	N/A	APT	APT	LISSAJOUS	44.7175	44.7175	1	N/A	N/A	N/A	N/A	N/A	0	N/A	HRCCTRTLIN	0	N/A	N/A	N/A	10	N/A	180	0	0	N/A	N/A	FPSI rate
+1.486 	N/A	N/A	2	1	ASC/Hank Donnelly	N/A	NONE	ALL,ALL	N/A	N/A	N/A	Count Rate Linearity	EIPS	Al-Ka	4.458	0.642119	N/A	N/A	Al	18.38	Al	36.76	FIXED	1000	NO	0	0	0	HRC,I	1000	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	0	N/A	APT	APT	LISSAJOUS	5.55556	5.55556	1	N/A	N/A	N/A	N/A	N/A	0	N/A	HRCCTRTLIN	0	N/A	N/A	N/A	10	N/A	180	0	0	N/A	N/A	FPSI rate
+4.51  	N/A	N/A	3	1	ASC/Hank Donnelly	N/A	NONE	ALL,ALL	N/A	N/A	N/A	Count Rate Linearity	EIPS	Ti-Ka	22.55	3.02894	N/A	N/A	Ti	40.6	N/A	N/A	FIXED	1000	NO	0	0	0	HRC,I	1000	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	0	N/A	APT	APT	LISSAJOUS	5.55556	5.55556	1	N/A	N/A	N/A	N/A	N/A	0	N/A	HRCCTRTLIN	0	N/A	N/A	N/A	10	N/A	180	0	0	N/A	N/A	FPSI rate
diff --git a/gawk-5.0.1/test/tweakfld.ok b/gawk-5.0.1/test/tweakfld.ok
new file mode 100644
index 00000000000..3c4d89476b2
--- /dev/null
+++ b/gawk-5.0.1/test/tweakfld.ok
@@ -0,0 +1,3 @@
+0.277	N/A	N/A	1	1	ASC/Hank Donnelly	N/A	NONE	ALL,ALL	N/A	N/A	N/A	Count Rate Linearity	EIPS	C-Ka	1.108	0.13484	N/A	N/A	C8H8	10.32	C8H8	20.64	FIXED-FREE	1000	NO	0	0	0	HRC,I	1000	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	0	N/A	APT	APT	LISSAJOUS	44.7175	44.7175	1	N/A	N/A	N/A	N/A	N/A	0	N/A	HRCCTRTLIN	0	N/A	N/A	N/A	10	N/A	180	0	0	N/A	N/A	FPSI rate	HRMA/HRC,I	Mar 10, 1996	0	0	0	0	0	N/A
+1.486 	N/A	N/A	2	1	ASC/Hank Donnelly	N/A	NONE	ALL,ALL	N/A	N/A	N/A	Count Rate Linearity	EIPS	Al-Ka	4.458	0.642119	N/A	N/A	Al	18.38	Al	36.76	FIXED-FREE	1000	NO	0	0	0	HRC,I	1000	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	0	N/A	APT	APT	LISSAJOUS	5.55556	5.55556	1	N/A	N/A	N/A	N/A	N/A	0	N/A	HRCCTRTLIN	0	N/A	N/A	N/A	10	N/A	180	0	0	N/A	N/A	FPSI rate	HRMA/HRC,I	Mar 10, 1996	0	0	0	0	0	N/A
+4.51  	N/A	N/A	3	1	ASC/Hank Donnelly	N/A	NONE	ALL,ALL	N/A	N/A	N/A	Count Rate Linearity	EIPS	Ti-Ka	22.55	3.02894	N/A	N/A	Ti	40.6	N/A	N/A	FIXED-FREE	1000	NO	0	0	0	HRC,I	1000	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	N/A	0	N/A	APT	APT	LISSAJOUS	5.55556	5.55556	1	N/A	N/A	N/A	N/A	N/A	0	N/A	HRCCTRTLIN	0	N/A	N/A	N/A	10	N/A	180	0	0	N/A	N/A	FPSI rate	HRMA/HRC,I	Mar 10, 1996	0	0	0	0	0	N/A
diff --git a/gawk-5.0.1/test/typedregex1.awk b/gawk-5.0.1/test/typedregex1.awk
new file mode 100644
index 00000000000..f308a335f9f
--- /dev/null
+++ b/gawk-5.0.1/test/typedregex1.awk
@@ -0,0 +1,296 @@
+# This file describes the semantics for hard regex constants
+# As much as possible it's executable code so that it can be used
+# (or split into) test cases for development and regression testing.
+
+function simple_tests(	fbre, numresult, strresult)
+{
+	# usable as case value
+	switch ("foobaaar") {
+	case @/fo+ba+r/:
+		print "switch-case: ok"
+		break
+	default:
+		print "switch-case: fail"
+		break
+	}
+
+	# usable with ~ and !~
+	if ("foobaaar" ~ @/fo+ba+r/)
+		print "match ~: ok"
+	else
+		print "match ~: fail"
+
+	if ("quasimoto" !~ @/fo+ba+r/)
+		print "match !~: ok"
+	else
+		print "match !~: fail"
+
+	# assign to variable, use in match
+	fbre = @/fo+ba+r/
+	if ("foobaaar" ~ fbre)
+		print "variable match ~: ok"
+	else
+		print "variable match ~: fail"
+
+	if ("quasimoto" !~ fbre)
+		print "variable match !~: ok"
+	else
+		print "variable match !~: fail"
+
+	# Use as numeric value, should be zero
+	numresult = fbre + 42
+	if (numresult == 42)
+		print "variable as numeric value: ok"
+	else
+		print "variable as numeric value: fail"
+
+	# Use as string value, should be string value of regexp text
+	strresult = "<" fbre ">"
+	if (strresult == "<fo+ba+r>")
+		print "variable as string value: ok"
+	else
+		print "variable as string value: fail", strresult
+
+	# typeof should work
+	if (typeof(@/fo+ba+r/) == "regexp")
+		print "typeof constant: ok"
+	else
+		print "typeof constant: fail"
+
+	if (typeof(fbre) == "regexp")
+		print "typeof variable: ok"
+	else
+		print "typeof variable: fail"
+
+	# conversion to number, works. should it be fatal?
+	fbre++
+	if (fbre == 1)
+		print "conversion to number: ok"
+	else
+		print "conversion to number: fail"
+
+	if (typeof(fbre) == "number")
+		print "typeof variable after conversion: ok"
+	else
+		print "typeof variable after conversion: fail"
+}
+
+function match_tests(	fbre, fun)
+{
+	if (match("foobaaar", @/fo+ba+r/))
+		print "match(constant): ok"
+	else
+		print "match(constant): fail"
+
+	fbre = @/fo+ba+r/
+	if (match("foobaaar", fbre))
+		print "match(variable): ok"
+	else
+		print "match(variable): fail"
+
+	fun = "match"
+	if (@fun("foobaaar", @/fo+ba+r/))
+		print "match(constant) indirect: ok"
+	else
+		print "match(constant) indirect: fail"
+
+	if (@fun("foobaaar", fbre))
+		print "match(variable) indirect: ok"
+	else
+		print "match(variable) indirect: fail"
+}
+
+function sub_tests(	fbre, count, target, fun)
+{
+	target = "abc foobaar def foobar ghi"
+	count = sub(@/fo+ba+r/, "XX", target)
+	if (count == 1 && target == "abc XX def foobar ghi")
+		print "sub(constant): ok"
+	else
+		print "sub(constant): fail"
+
+	fbre = @/fo+ba+r/
+	target = "abc foobaar def foobar ghi"
+	count = sub(fbre, "XX", target)
+	if (count == 1 && target == "abc XX def foobar ghi")
+		print "sub(variable): ok"
+	else
+		print "sub(variable): fail"
+
+	fun = "sub"
+	$0 = "abc foobaar def foobar ghi"
+	count = @fun(@/fo+ba+r/, "XX")
+	if (count == 1 && $0 == "abc XX def foobar ghi")
+		print "sub(constant) indirect: ok"
+	else
+		print "sub(constant) indirect: fail"
+
+	$0 = "abc foobaar def foobar ghi"
+	count = @fun(fbre, "XX")
+	if (count == 1 && $0 == "abc XX def foobar ghi")
+		print "sub(variable) indirect: ok"
+	else
+		print "sub(variable) indirect: fail"
+}
+
+function gsub_tests(	fbre, count, target, fun)
+{
+	target = "abc foobaar def foobar ghi"
+	count = gsub(@/fo+ba+r/, "XX", target)
+	if (count == 2 && target == "abc XX def XX ghi")
+		print "gsub(constant): ok"
+	else
+		print "gsub(constant): fail"
+
+	fbre = @/fo+ba+r/
+	target = "abc foobaar def foobar ghi"
+	count = gsub(fbre, "XX", target)
+	if (count == 2 && target == "abc XX def XX ghi")
+		print "gsub(variable): ok"
+	else
+		print "gsub(variable): fail"
+
+	fun = "gsub"
+	$0 = "abc foobaar def foobar ghi"
+	count = @fun(@/fo+ba+r/, "XX")
+	if (count == 2 && $0 == "abc XX def XX ghi")
+		print "gsub(constant) indirect: ok"
+	else
+		print "gsub(constant) indirect: fail"
+
+	$0 = "abc foobaar def foobar ghi"
+	count = @fun(fbre, "XX")
+	if (count == 2 && $0 == "abc XX def XX ghi")
+		print "gsub(variable) indirect: ok"
+	else
+		print "gsub(variable) indirect: fail"
+}
+
+function gensub_tests(	fbre, result, target, fun)
+{
+	target = "abc foobaar def foobar ghi"
+	result = gensub(@/fo+ba+r/, "XX", "g", target)
+	if (result == "abc XX def XX ghi")
+		print "gensub(constant): ok"
+	else
+		print "gensub(constant): fail"
+
+	fbre = @/fo+ba+r/
+	target = "abc foobaar def foobar ghi"
+	result = gensub(fbre, "XX", "g", target)
+	if (result == "abc XX def XX ghi")
+		print "gensub(variable): ok"
+	else
+		print "gensub(variable): fail"
+
+	fun = "gensub"
+	$0 = "abc foobaar def foobar ghi"
+	result = @fun(@/fo+ba+r/, "XX", "g")
+	if (result == "abc XX def XX ghi")
+		print "gensub(constant) indirect: ok"
+	else
+		print "gensub(constant) indirect: fail"
+
+	$0 = "abc foobaar def foobar ghi"
+	result = @fun(fbre, "XX", "g")
+	if (result == "abc XX def XX ghi")
+		print "gensub(variable) indirect: ok"
+	else
+		print "gensub(variable) indirect: fail"
+
+	result = @fun(@/fo+ba+r/, "XX", "g", target)
+	if (result == "abc XX def XX ghi")
+		print "gensub(constant) indirect 2: ok"
+	else
+		print "gensub(constant) indirect 2: fail"
+
+	result = @fun(fbre, "XX", "g", target)
+	if (result == "abc XX def XX ghi")
+		print "gensub(variable) indirect 2: ok"
+	else
+		print "gensub(variable) indirect 2: fail"
+}
+
+function split_tests(	fbre, data, seps, fun, b1)
+{
+	delete data
+	delete seps
+	b1 = split("a:b:c:d", data, @/:/, seps)
+	if (b1 == 4 && data[1] == "a" && seps[1] == ":")
+		print "split(constant): ok"
+	else
+		print "split(constant): fail"
+
+	delete data
+	delete seps
+	fbre = @/:/
+	b1 = split("a:b:c:d", data, fbre, seps)
+	if (b1 == 4 && data[1] == "a" && seps[1] == ":")
+		print "split(variable): ok"
+	else
+		print "split(variable): fail"
+
+	fun = "split"
+	delete data
+	delete seps
+	b1 = @fun("a:b:c:d", data, @/:/, seps)
+	if (b1 == 4 && data[1] == "a" && seps[1] == ":")
+		print "split(constant) indirect: ok"
+	else
+		print "split(constant) indirect: fail"
+
+	delete data
+	delete seps
+	b1 = @fun("a:b:c:d", data, fbre, seps)
+	if (b1 == 4 && data[1] == "a" && seps[1] == ":")
+		print "split(variable) indirect: ok"
+	else
+		print "split(variable) indirect: fail"
+}
+
+function patsplit_tests(	fbre, data, seps, fun, b1)
+{
+	delete data
+	delete seps
+	b1 = patsplit("a:b:c:d", data, @/[a-z]+/, seps)
+	if (b1 == 4 && data[1] == "a" && seps[1] == ":")
+		print "patsplit(constant): ok"
+	else
+		print "patsplit(constant): fail"
+
+	delete data
+	delete seps
+	fbre = @/[a-z]+/
+	b1 = patsplit("a:b:c:d", data, fbre, seps)
+	if (b1 == 4 && data[1] == "a" && seps[1] == ":")
+		print "patsplit(variable): ok"
+	else
+		print "patsplit(variable): fail"
+
+	fun = "patsplit"
+	delete data
+	delete seps
+	b1 = @fun("a:b:c:d", data, @/[a-z]+/, seps)
+	if (b1 == 4 && data[1] == "a" && seps[1] == ":")
+		print "patsplit(constant) indirect: ok"
+	else
+		print "patsplit(constant) indirect: fail"
+
+	delete data
+	delete seps
+	b1 = @fun("a:b:c:d", data, fbre, seps)
+	if (b1 == 4 && data[1] == "a" && seps[1] == ":")
+		print "patsplit(variable) indirect: ok"
+	else
+		print "patsplit(variable) indirect: fail"
+}
+
+BEGIN {
+	simple_tests()
+	match_tests()
+	sub_tests()
+	gsub_tests()
+	gensub_tests()
+	split_tests()
+	patsplit_tests()
+}
diff --git a/gawk-5.0.1/test/typedregex1.ok b/gawk-5.0.1/test/typedregex1.ok
new file mode 100644
index 00000000000..03ef7cfa99d
--- /dev/null
+++ b/gawk-5.0.1/test/typedregex1.ok
@@ -0,0 +1,37 @@
+switch-case: ok
+match ~: ok
+match !~: ok
+variable match ~: ok
+variable match !~: ok
+variable as numeric value: ok
+variable as string value: ok
+typeof constant: ok
+typeof variable: ok
+conversion to number: ok
+typeof variable after conversion: ok
+match(constant): ok
+match(variable): ok
+match(constant) indirect: ok
+match(variable) indirect: ok
+sub(constant): ok
+sub(variable): ok
+sub(constant) indirect: ok
+sub(variable) indirect: ok
+gsub(constant): ok
+gsub(variable): ok
+gsub(constant) indirect: ok
+gsub(variable) indirect: ok
+gensub(constant): ok
+gensub(variable): ok
+gensub(constant) indirect: ok
+gensub(variable) indirect: ok
+gensub(constant) indirect 2: ok
+gensub(variable) indirect 2: ok
+split(constant): ok
+split(variable): ok
+split(constant) indirect: ok
+split(variable) indirect: ok
+patsplit(constant): ok
+patsplit(variable): ok
+patsplit(constant) indirect: ok
+patsplit(variable) indirect: ok
diff --git a/gawk-5.0.1/test/typedregex2.awk b/gawk-5.0.1/test/typedregex2.awk
new file mode 100644
index 00000000000..e17df4be84b
--- /dev/null
+++ b/gawk-5.0.1/test/typedregex2.awk
@@ -0,0 +1,11 @@
+BEGIN {
+        x = @/xxx/
+        y = @/yyy/
+        print typeof(x), typeof(y)
+        print x, y
+
+        x++
+        y = y ""
+        print typeof(x), typeof(y)
+        print x, y
+}
diff --git a/gawk-5.0.1/test/typedregex2.ok b/gawk-5.0.1/test/typedregex2.ok
new file mode 100644
index 00000000000..832ef551922
--- /dev/null
+++ b/gawk-5.0.1/test/typedregex2.ok
@@ -0,0 +1,4 @@
+regexp regexp
+xxx yyy
+number string
+1 yyy
diff --git a/gawk-5.0.1/test/typedregex3.awk b/gawk-5.0.1/test/typedregex3.awk
new file mode 100644
index 00000000000..ee6bcb69575
--- /dev/null
+++ b/gawk-5.0.1/test/typedregex3.awk
@@ -0,0 +1,11 @@
+BEGIN {
+	a[1] = @/abc/
+	b[1][2][3] = @/xyz/
+	print typeof(a[1]), typeof(b[1][2][3])
+	print a[1], b[1][2][3]
+
+	a[1]++
+	b[1][2][3] ""
+	print typeof(a[1]), typeof(b[1][2][3])
+	print a[1], b[1][2][3]
+}
diff --git a/gawk-5.0.1/test/typedregex3.ok b/gawk-5.0.1/test/typedregex3.ok
new file mode 100644
index 00000000000..9f8b881ae3e
--- /dev/null
+++ b/gawk-5.0.1/test/typedregex3.ok
@@ -0,0 +1,4 @@
+regexp regexp
+abc xyz
+number regexp
+1 xyz
diff --git a/gawk-5.0.1/test/typedregex4.awk b/gawk-5.0.1/test/typedregex4.awk
new file mode 100644
index 00000000000..8e866c34fd3
--- /dev/null
+++ b/gawk-5.0.1/test/typedregex4.awk
@@ -0,0 +1,7 @@
+BEGIN {
+	print "typeof(x) =", typeof(x)
+}
+
+END {
+	print "typeof(y) =", typeof(y)
+}
diff --git a/gawk-5.0.1/test/typedregex4.ok b/gawk-5.0.1/test/typedregex4.ok
new file mode 100644
index 00000000000..6656b61fc35
--- /dev/null
+++ b/gawk-5.0.1/test/typedregex4.ok
@@ -0,0 +1,2 @@
+typeof(x) = regexp
+typeof(y) = regexp
diff --git a/gawk-5.0.1/test/typeof1.awk b/gawk-5.0.1/test/typeof1.awk
new file mode 100644
index 00000000000..c301030e5f0
--- /dev/null
+++ b/gawk-5.0.1/test/typeof1.awk
@@ -0,0 +1,9 @@
+BEGIN {
+	a = 5 ; print typeof(a)
+	print typeof(b)
+	print typeof(@/foo/)
+	c = "foo" ; print typeof(c)
+	d[1] = 1 ; print typeof(d), typeof(d[1])
+	e = @/foo/ ; print typeof(e)
+	print typeof(@/bar/)
+}
diff --git a/gawk-5.0.1/test/typeof1.ok b/gawk-5.0.1/test/typeof1.ok
new file mode 100644
index 00000000000..132cc24e4c0
--- /dev/null
+++ b/gawk-5.0.1/test/typeof1.ok
@@ -0,0 +1,7 @@
+number
+untyped
+regexp
+string
+array number
+regexp
+regexp
diff --git a/gawk-5.0.1/test/typeof2.awk b/gawk-5.0.1/test/typeof2.awk
new file mode 100644
index 00000000000..25da02e4dbf
--- /dev/null
+++ b/gawk-5.0.1/test/typeof2.awk
@@ -0,0 +1,20 @@
+BEGIN {
+	print typeof(x)
+	x[1] = 3
+	print typeof(x)
+}
+
+function test1() {
+}
+
+function test2(p) {
+	p[1] = 1
+}
+
+BEGIN {
+	print typeof(a)
+	test1(a)
+	print typeof(a)
+	test2(a)
+	print typeof(a)
+}
diff --git a/gawk-5.0.1/test/typeof2.ok b/gawk-5.0.1/test/typeof2.ok
new file mode 100644
index 00000000000..cc032a83b8b
--- /dev/null
+++ b/gawk-5.0.1/test/typeof2.ok
@@ -0,0 +1,6 @@
+untyped
+array
+untyped
+gawk: typeof2.awk:16: warning: function `test1' called with more arguments than declared
+untyped
+array
diff --git a/gawk-5.0.1/test/typeof3.awk b/gawk-5.0.1/test/typeof3.awk
new file mode 100644
index 00000000000..d148f373d50
--- /dev/null
+++ b/gawk-5.0.1/test/typeof3.awk
@@ -0,0 +1,19 @@
+BEGIN {
+	x = @/xx/
+	print typeof(x)
+	print x
+}
+
+# this set may not really be needed for the test
+BEGIN {
+	x = 4
+	print typeof(@/xxx/)
+	print typeof(3)
+	print x
+}
+
+BEGIN {
+	print typeof(x)
+	print typeof(a[1])
+	a[1][2]	# fatals on this
+}
diff --git a/gawk-5.0.1/test/typeof3.ok b/gawk-5.0.1/test/typeof3.ok
new file mode 100644
index 00000000000..a6cd6c4a298
--- /dev/null
+++ b/gawk-5.0.1/test/typeof3.ok
@@ -0,0 +1,9 @@
+regexp
+xx
+regexp
+number
+4
+number
+unassigned
+gawk: typeof3.awk:18: fatal: attempt to use scalar `a["1"]' as an array
+EXIT CODE: 2
diff --git a/gawk-5.0.1/test/typeof4.awk b/gawk-5.0.1/test/typeof4.awk
new file mode 100644
index 00000000000..62c2905c25f
--- /dev/null
+++ b/gawk-5.0.1/test/typeof4.awk
@@ -0,0 +1,13 @@
+BEGIN{ a["x"]["y"]["z"]="scalar" ; walk_array(a, "a")}
+function walk_array(arr, name, i,	r)
+{
+	for (i in arr) {
+		r = typeof(arr[i])
+#		printf("typeof(%s[%s]) = %s\n", name, i, r) > "/dev/stderr"
+		if (r == "array") {
+			walk_array(arr[i], name "[" i "]")
+		} else {
+			printf "%s[%s] = %s\n", name, i, arr[i]
+		}
+	}
+}
diff --git a/gawk-5.0.1/test/typeof4.ok b/gawk-5.0.1/test/typeof4.ok
new file mode 100644
index 00000000000..fca0263dc96
--- /dev/null
+++ b/gawk-5.0.1/test/typeof4.ok
@@ -0,0 +1 @@
+a[x][y][z] = scalar
diff --git a/gawk-5.0.1/test/typeof5.awk b/gawk-5.0.1/test/typeof5.awk
new file mode 100644
index 00000000000..30cd6aca517
--- /dev/null
+++ b/gawk-5.0.1/test/typeof5.awk
@@ -0,0 +1,10 @@
+BEGIN {
+	print typeof($0)
+	print typeof($1)
+}
+
+{
+	$3 = $1
+	print typeof($2)
+	print typeof($3)
+}
diff --git a/gawk-5.0.1/test/typeof5.in b/gawk-5.0.1/test/typeof5.in
new file mode 100644
index 00000000000..9daeafb9864
--- /dev/null
+++ b/gawk-5.0.1/test/typeof5.in
@@ -0,0 +1 @@
+test
diff --git a/gawk-5.0.1/test/typeof5.ok b/gawk-5.0.1/test/typeof5.ok
new file mode 100644
index 00000000000..80f8cf51474
--- /dev/null
+++ b/gawk-5.0.1/test/typeof5.ok
@@ -0,0 +1,4 @@
+unassigned
+unassigned
+unassigned
+string
diff --git a/gawk-5.0.1/test/uninit2.awk b/gawk-5.0.1/test/uninit2.awk
new file mode 100644
index 00000000000..9ded5575a07
--- /dev/null
+++ b/gawk-5.0.1/test/uninit2.awk
@@ -0,0 +1,2 @@
+BEGIN { a = a + 1; x = a; print a}
+BEGIN { ++b; x = b; print b}
diff --git a/gawk-5.0.1/test/uninit2.ok b/gawk-5.0.1/test/uninit2.ok
new file mode 100644
index 00000000000..2001a39b4db
--- /dev/null
+++ b/gawk-5.0.1/test/uninit2.ok
@@ -0,0 +1,4 @@
+gawk: uninit2.awk:1: warning: reference to uninitialized variable `a'
+1
+gawk: uninit2.awk:2: warning: reference to uninitialized variable `b'
+1
diff --git a/gawk-5.0.1/test/uninit3.awk b/gawk-5.0.1/test/uninit3.awk
new file mode 100644
index 00000000000..d0140d54950
--- /dev/null
+++ b/gawk-5.0.1/test/uninit3.awk
@@ -0,0 +1,7 @@
+function f(x){
+	print x
+}
+
+BEGIN {
+	f(x)
+}
diff --git a/gawk-5.0.1/test/uninit3.ok b/gawk-5.0.1/test/uninit3.ok
new file mode 100644
index 00000000000..9787672389d
--- /dev/null
+++ b/gawk-5.0.1/test/uninit3.ok
@@ -0,0 +1,3 @@
+gawk: uninit3.awk:1: warning: function `f': parameter `x' shadows global variable
+gawk: uninit3.awk:2: warning: reference to uninitialized argument `x'
+
diff --git a/gawk-5.0.1/test/uninit4.awk b/gawk-5.0.1/test/uninit4.awk
new file mode 100644
index 00000000000..89de732270f
--- /dev/null
+++ b/gawk-5.0.1/test/uninit4.awk
@@ -0,0 +1,13 @@
+# test whether --lint catches uninitialized fields:
+function pr()
+{
+	print
+}
+
+BEGIN {
+	pr()
+	print $0
+	print $(1-1)
+	print $1
+	NF=3; print $2
+}
diff --git a/gawk-5.0.1/test/uninit4.ok b/gawk-5.0.1/test/uninit4.ok
new file mode 100644
index 00000000000..3ea4da309cd
--- /dev/null
+++ b/gawk-5.0.1/test/uninit4.ok
@@ -0,0 +1,10 @@
+gawk: uninit4.awk:4: warning: reference to uninitialized field `$0'
+
+gawk: uninit4.awk:9: warning: reference to uninitialized field `$0'
+
+gawk: uninit4.awk:10: warning: reference to uninitialized field `$0'
+
+gawk: uninit4.awk:11: warning: reference to uninitialized field `$1'
+
+gawk: uninit4.awk:12: warning: reference to uninitialized field `$2'
+
diff --git a/gawk-5.0.1/test/uninit5.awk b/gawk-5.0.1/test/uninit5.awk
new file mode 100644
index 00000000000..e63abe118d4
--- /dev/null
+++ b/gawk-5.0.1/test/uninit5.awk
@@ -0,0 +1,111 @@
+#From gregfjohnson@yahoo.com  Sun Aug 30 08:36:36 2009
+#Return-Path: <gregfjohnson@yahoo.com>
+#Received: from aahz (localhost [127.0.0.1])
+#	by skeeve.com (8.14.1/8.14.1) with ESMTP id n7U5WoJ2003836
+#	for <arnold@localhost>; Sun, 30 Aug 2009 08:36:36 +0300
+#X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on server1.f7.net
+#X-Spam-Level: 
+#X-Spam-Status: No, score=-6.6 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED
+#	autolearn=ham version=3.2.4
+#X-Envelope-From: gregfjohnson@yahoo.com
+#X-Envelope-To: <arnold@skeeve.com>
+#Received: from server1.f7.net [64.34.169.74]
+#	by aahz with IMAP (fetchmail-6.3.7)
+#	for <arnold@localhost> (single-drop); Sun, 30 Aug 2009 08:36:36 +0300 (IDT)
+#Received: from fencepost.gnu.org (fencepost.gnu.org [140.186.70.10])
+#	by f7.net (8.11.7-20030920/8.11.7) with ESMTP id n7U33m709453
+#	for <arnold@skeeve.com>; Sat, 29 Aug 2009 22:03:48 -0500
+#Received: from mail.gnu.org ([199.232.76.166]:42095 helo=mx10.gnu.org)
+#	by fencepost.gnu.org with esmtp (Exim 4.67)
+#	(envelope-from <gregfjohnson@yahoo.com>)
+#	id 1Mhai6-0004Qt-3R
+#	for bug-gawk@gnu.org; Sat, 29 Aug 2009 23:04:06 -0400
+#Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60)
+#	(envelope-from <gregfjohnson@yahoo.com>)
+#	id 1Mhai5-00062I-EM
+#	for bug-gawk@gnu.org; Sat, 29 Aug 2009 23:04:05 -0400
+#Received: from web33507.mail.mud.yahoo.com ([68.142.206.156]:28597)
+#	by monty-python.gnu.org with smtp (Exim 4.60)
+#	(envelope-from <gregfjohnson@yahoo.com>)
+#	id 1Mhai5-00061w-2n
+#	for bug-gawk@gnu.org; Sat, 29 Aug 2009 23:04:05 -0400
+#Received: (qmail 68722 invoked by uid 60001); 30 Aug 2009 03:04:03 -0000
+#DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024; t=1251601443; bh=9h2ZOOgxUh+s8Ow5/ZMWUxcviy2L4rpiaNamPAXxhEk=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type; b=tWxCQq/aTOT5lhtdPc5hxtXzOjDFmLU6Ao0BSlwbeeBsd9Wl6DU3JCR4gTkoL0aVUOTdjMjgRY7I72yCht+YruDiqZrvtSKvUoAvZAKcPG26RE4jzxUlxQklEHZG9mq9h2gpTIiLYehYDiC0975wukwi/e7ePADfkFwg8eTnT44=
+#DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
+#  s=s1024; d=yahoo.com;
+#  h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Subject:To:MIME-Version:Content-Type;
+#  b=LWfhVgxojFG1eYoRrxtrS3YOfH3MTUVTYZle/4utMQEPZQfsmrn6GBwBfThryGqJyZfg38/7JfK9cz/Q3Yt+mf8+xl9/m+Srckc+Xvi42CE0OmoN439vCyhAD8A74XOJsmfKDjJ/+LtioShStUohj1iYDDmRTN4RnnP9X4xnt3c=;
+#Message-ID: <410222.68490.qm@web33507.mail.mud.yahoo.com>
+#X-YMail-OSG: mfjax.MVM1lI2q5gcl6bChbn6zHgNgj1fByHWJSzB8ZZUmI2QCH6pNwV_IaHxcqecu.VqjKUR6HQhXbziUnX.v5E2nOE61ass9AzqfdVOtKTEAzTPQJ8Z7QB7fq7BMtjn8yohDR6mwOyVTqv3RZh0m1Us7sLit6UmcgeSvJo2rROAmeceq.FBwk2XnEp2_QsljjPHak_WXyvtAK81klDv5qQORWQWqR9q79x7yxORL6fLWwb_x6mZZMSOUaA0p8.ucT453eqT1L8NGkthF.fXmOM3_EYd03zUgr9Sb.zvMvbDC3MCMnVr0JT1uroLmFtVIdTojrFJYFQEDFSB9zT3Ua80ZpGXrjQGx3rZw--
+#Received: from [71.165.246.171] by web33507.mail.mud.yahoo.com via HTTP; Sat, 29 Aug 2009 20:04:03 PDT
+#X-Mailer: YahooMailClassic/6.1.2 YahooMailWebService/0.7.338.2
+#Date: Sat, 29 Aug 2009 20:04:03 -0700 (PDT)
+#From: Greg Johnson <gregfjohnson@yahoo.com>
+#Subject: bugs in passing uninitialized array to a function
+#To: bug-gawk@gnu.org
+#MIME-Version: 1.0
+#Content-Type: multipart/mixed; boundary="0-1690489838-1251601443=:68490"
+#X-detected-operating-system: by monty-python.gnu.org: FreeBSD 6.x (1)
+#Status: RO
+#
+#--0-1690489838-1251601443=:68490
+#Content-Type: text/plain; charset=us-ascii
+#
+#I am using gawk version 3.1.7.
+#
+#The attached programs illustrate what look to me like two bugs
+#in the handling of uninitialized variables to functions that treat
+#them as arrays.
+#
+#Greg Johnson
+#
+#
+#      
+#--0-1690489838-1251601443=:68490
+#Content-Type: application/octet-stream; name=b1
+#Content-Transfer-Encoding: base64
+#Content-Disposition: attachment; filename="b1"
+
+# bug?  on uninitialized array, length(a) prints as 3, then the loop
+# behaves differently, iterating once.  so, length() behaves differently
+# on two calls to the same variable, which was not changed.
+
+function prt1(a, len)
+{
+    print "length:  " length(a)
+
+    for (i = 1; i <= length(a); i++)
+        printf "<" i "," a[i] "> "
+
+    print "\n"
+}
+
+BEGIN {
+    prt1(zzz)
+}
+
+#--0-1690489838-1251601443=:68490
+#Content-Type: application/octet-stream; name=b2
+#Content-Transfer-Encoding: base64
+#Content-Disposition: attachment; filename="b2"
+
+# shouldn't an uninitialized array have length zero?
+# length is printed as 1, and the loop iterates once.
+
+function prt(a, len)
+{
+    len = length(a)
+    print "length:  " len
+
+    for (i = 1; i <= len; i++)
+        printf "<" i "," a[i] "> "
+
+    print "\n"
+}
+
+BEGIN {
+    prt(zzz)
+}
+
+#--0-1690489838-1251601443=:68490--
+
diff --git a/gawk-5.0.1/test/uninit5.ok b/gawk-5.0.1/test/uninit5.ok
new file mode 100644
index 00000000000..1d2a583c4e9
--- /dev/null
+++ b/gawk-5.0.1/test/uninit5.ok
@@ -0,0 +1,9 @@
+gawk: uninit5.awk:75: warning: reference to uninitialized argument `a'
+length:  0
+gawk: uninit5.awk:77: warning: reference to uninitialized argument `a'
+
+
+gawk: uninit5.awk:97: warning: reference to uninitialized argument `a'
+length:  0
+
+
diff --git a/gawk-5.0.1/test/uninitialized.awk b/gawk-5.0.1/test/uninitialized.awk
new file mode 100644
index 00000000000..09bb643b362
--- /dev/null
+++ b/gawk-5.0.1/test/uninitialized.awk
@@ -0,0 +1,3 @@
+BEGIN {
+	a += 2
+}
diff --git a/gawk-5.0.1/test/uninitialized.ok b/gawk-5.0.1/test/uninitialized.ok
new file mode 100644
index 00000000000..86ab474c7a7
--- /dev/null
+++ b/gawk-5.0.1/test/uninitialized.ok
@@ -0,0 +1 @@
+gawk: uninitialized.awk:2: warning: reference to uninitialized variable `a'
diff --git a/gawk-5.0.1/test/unterm.awk b/gawk-5.0.1/test/unterm.awk
new file mode 100644
index 00000000000..c420c47b301
--- /dev/null
+++ b/gawk-5.0.1/test/unterm.awk
@@ -0,0 +1 @@
+BEGIN{x=".........................................................................................................................................................................................................................................................}
\ No newline at end of file
diff --git a/gawk-5.0.1/test/unterm.ok b/gawk-5.0.1/test/unterm.ok
new file mode 100644
index 00000000000..399f626a6ea
--- /dev/null
+++ b/gawk-5.0.1/test/unterm.ok
@@ -0,0 +1,5 @@
+gawk: unterm.awk:1: BEGIN{x=".........................................................................................................................................................................................................................................................}
+gawk: unterm.awk:1:         ^ unterminated string
+gawk: unterm.awk:1: (END OF FILE)
+gawk: unterm.awk:1:         ^ source files / command-line arguments must contain complete functions or rules
+EXIT CODE: 1
diff --git a/gawk-5.0.1/test/uparrfs.awk b/gawk-5.0.1/test/uparrfs.awk
new file mode 100644
index 00000000000..85905240208
--- /dev/null
+++ b/gawk-5.0.1/test/uparrfs.awk
@@ -0,0 +1,8 @@
+BEGIN {
+	FS = "(^x+)|( +)"
+}
+	
+{
+	for (i = 1; i <= NF; i++)
+		printf "-->%s<--\n", $i
+}
diff --git a/gawk-5.0.1/test/uparrfs.in b/gawk-5.0.1/test/uparrfs.in
new file mode 100644
index 00000000000..8e6b5c0d5f0
--- /dev/null
+++ b/gawk-5.0.1/test/uparrfs.in
@@ -0,0 +1 @@
+xxAA  xxBxx  C
diff --git a/gawk-5.0.1/test/uparrfs.ok b/gawk-5.0.1/test/uparrfs.ok
new file mode 100644
index 00000000000..944ba9aad52
--- /dev/null
+++ b/gawk-5.0.1/test/uparrfs.ok
@@ -0,0 +1,4 @@
+--><--
+-->AA<--
+-->xxBxx<--
+-->C<--
diff --git a/gawk-5.0.1/test/uplus.awk b/gawk-5.0.1/test/uplus.awk
new file mode 100644
index 00000000000..3220f7fdef9
--- /dev/null
+++ b/gawk-5.0.1/test/uplus.awk
@@ -0,0 +1,5 @@
+BEGIN {
+   print "01" + 0
+   print +"01"
+   print -"01"
+}
diff --git a/gawk-5.0.1/test/uplus.ok b/gawk-5.0.1/test/uplus.ok
new file mode 100644
index 00000000000..9f6e83e2646
--- /dev/null
+++ b/gawk-5.0.1/test/uplus.ok
@@ -0,0 +1,3 @@
+1
+1
+-1
diff --git a/gawk-5.0.1/test/valgrind.awk b/gawk-5.0.1/test/valgrind.awk
new file mode 100644
index 00000000000..95699da1333
--- /dev/null
+++ b/gawk-5.0.1/test/valgrind.awk
@@ -0,0 +1,43 @@
+function show()
+{
+	error_count++
+	if (cmd) {
+		printf "%s: %s\n", FILENAME, cmd
+		cmd = ""
+	}
+	printf "\t%s\n",$0
+}
+
+FNR == 1 {
+	error_count = 0
+}
+
+{ $1 = "" }
+
+$2 == "Command:" {
+	incmd = 1
+	$2 = ""
+	cmd = $0
+	next
+}
+
+incmd {
+	if (/Parent PID:/)
+		incmd = 0
+	else {
+		cmd = (cmd $0)
+		next
+	}
+}
+
+/ERROR SUMMARY:/ && !/: 0 errors from 0 contexts/ && error_count > 0 {
+	show()
+}
+
+/definitely lost:/ && !/: 0 bytes in 0 blocks/		{ show() }
+
+# /possibly lost:/ && !/: 0 bytes in 0 blocks/		{ show() }
+
+# / suppressed:/ && !/: 0 bytes in 0 blocks/		{ show() }
+
+/[Ii]nvalid (read|write)/				{ show() }
diff --git a/gawk-5.0.1/test/watchpoint1.awk b/gawk-5.0.1/test/watchpoint1.awk
new file mode 100644
index 00000000000..5e7e94164fd
--- /dev/null
+++ b/gawk-5.0.1/test/watchpoint1.awk
@@ -0,0 +1,14 @@
+#! /usr/bin/gawk -f
+BEGIN {
+     c = 0
+}
+
+/apple/ {
+     nr = NR
+     c++
+     # printf "[c, NR] = [%s, %s]\n", c, NR
+}
+
+END {
+    print c
+}
diff --git a/gawk-5.0.1/test/watchpoint1.in b/gawk-5.0.1/test/watchpoint1.in
new file mode 100644
index 00000000000..83ac6f438b7
--- /dev/null
+++ b/gawk-5.0.1/test/watchpoint1.in
@@ -0,0 +1,8 @@
+1 1 pear
+2 1 apple 4
+3 2 pear
+4 3 apple 9
+5 8 pear
+6 9 apple
+7 10 pear
+8 12 apple
diff --git a/gawk-5.0.1/test/watchpoint1.ok b/gawk-5.0.1/test/watchpoint1.ok
new file mode 100644
index 00000000000..b1e7e53ca0d
--- /dev/null
+++ b/gawk-5.0.1/test/watchpoint1.ok
@@ -0,0 +1,65 @@
+1       #! /usr/bin/gawk -f
+2       BEGIN {
+3            c = 0
+4       }
+5       
+6       /apple/ {
+7            nr = NR
+8            c++
+9            # printf "[c, NR] = [%s, %s]\n", c, NR
+10      }
+11      
+12      END {
+13          print c
+14      }
+Watchpoint 1: c
+1: c = untyped variable
+2: nr = untyped variable
+3: NR = 0
+Breakpoint 2 set at file `watchpoint1.awk', line 6
+Starting program: 
+Stopping in Rule ...
+Watchpoint 1: c
+  Old value: untyped variable
+  New value: 0
+main() at `watchpoint1.awk':6
+6       /apple/ {
+1: c = 0
+2: nr = untyped variable
+3: NR = 1
+Breakpoint 2, main() at `watchpoint1.awk':6
+6       /apple/ {
+1: c = 0
+2: nr = untyped variable
+3: NR = 1
+Breakpoint 2, main() at `watchpoint1.awk':6
+6       /apple/ {
+1: c = 0
+2: nr = untyped variable
+3: NR = 2
+Watchpoint 1: c
+  Old value: 0
+  New value: 1
+main() at `watchpoint1.awk':6
+6       /apple/ {
+1: c = 1
+2: nr = 2
+3: NR = 3
+Breakpoint 2, main() at `watchpoint1.awk':6
+6       /apple/ {
+1: c = 1
+2: nr = 2
+3: NR = 3
+Breakpoint 2, main() at `watchpoint1.awk':6
+6       /apple/ {
+1: c = 1
+2: nr = 2
+3: NR = 4
+Watchpoint 1: c
+  Old value: 1
+  New value: 2
+main() at `watchpoint1.awk':6
+6       /apple/ {
+1: c = 2
+2: nr = 4
+3: NR = 5
diff --git a/gawk-5.0.1/test/watchpoint1.script b/gawk-5.0.1/test/watchpoint1.script
new file mode 100644
index 00000000000..94897d11978
--- /dev/null
+++ b/gawk-5.0.1/test/watchpoint1.script
@@ -0,0 +1,14 @@
+list
+watch c
+display c
+display nr
+display NR
+break 6
+run
+continue
+continue
+continue
+continue
+continue
+continue
+quit
diff --git a/gawk-5.0.1/test/wideidx.awk b/gawk-5.0.1/test/wideidx.awk
new file mode 100644
index 00000000000..9c8a64ce16a
--- /dev/null
+++ b/gawk-5.0.1/test/wideidx.awk
@@ -0,0 +1,7 @@
+{
+	a=$0
+	print index(a,"b")
+	getline
+	a = a $0
+	print index(a,"b")
+}
diff --git a/gawk-5.0.1/test/wideidx.in b/gawk-5.0.1/test/wideidx.in
new file mode 100644
index 00000000000..3bd1f0e2974
--- /dev/null
+++ b/gawk-5.0.1/test/wideidx.in
@@ -0,0 +1,2 @@
+foo
+bar
diff --git a/gawk-5.0.1/test/wideidx.ok b/gawk-5.0.1/test/wideidx.ok
new file mode 100644
index 00000000000..4f1d7cd3012
--- /dev/null
+++ b/gawk-5.0.1/test/wideidx.ok
@@ -0,0 +1,2 @@
+0
+4
diff --git a/gawk-5.0.1/test/wideidx2.awk b/gawk-5.0.1/test/wideidx2.awk
new file mode 100644
index 00000000000..335c29de30d
--- /dev/null
+++ b/gawk-5.0.1/test/wideidx2.awk
@@ -0,0 +1,89 @@
+# Date: Thu, 27 Apr 2006 20:59:03 +0100
+# From: Lee Haywood <ljhaywood2@googlemail.com>
+# Subject: gawk multi-byte support bugs, assertion bug and fix.
+# To: bug-gawk@gnu.org
+# Message-id: <60962be00604271259na0d8fdayb9d0c69a853216e8@mail.gmail.com>
+# MIME-version: 1.0
+# Content-type: multipart/alternative;
+#  boundary="----=_Part_10136_920879.1146167943492"
+# Status: RO
+# 
+# ------=_Part_10136_920879.1146167943492
+# Content-Type: text/plain; charset=ISO-8859-1
+# Content-Transfer-Encoding: quoted-printable
+# Content-Disposition: inline
+# 
+# 
+# Firstly, I have been getting the following error from version 3.1.5.
+# 
+#     awk: node.c:515: unref: Assertion `(tmp->flags & 4096) !=3D 0' failed.
+# 
+# In mk_number() in node.c the MBS_SUPPORT code is inside the GAWKDEBUG
+# section - moving it outside explicitly clears the string values, which
+# prevents the assertion error from occurring.  The corrected version is
+# shown at the end of this message.
+# 
+# As an aside, I also noticed that n->wstptr is not cleared by
+# set_field() and set_record() in field.c when the flags are set to
+# exclude WSTRCUR.  However, I do not have a test case to show if
+# changing them makes any difference.
+# 
+# A second problem also occurs when gawk 3.1.5 is compiled with
+# multi-byte character support (MBS_SUPPORT).  The following code should
+# change the index of the substring "bc" from 2 to 3, but it gets
+# reported as 2 in both cases - which is obviously disastrous.
+# 
+#     awk 'BEGIN {
+#             Value =3D "abc"
+# 
+#             print "Before <" Value "> ",
+#                   index( Value, "bc" )
+# 
+#             sub( /bc/, "bbc", Value )
+# 
+#             print "After  <" Value ">",
+#                   index( Value, "bc" )
+#         }'
+# 
+# Compiling with MBS_SUPPORT undefined makes these problems go away.
+# 
+# /* mk_number --- allocate a node with defined number */
+# 
+# NODE *
+# mk_number(AWKNUM x, unsigned int flags)
+# {
+#         register NODE *r;
+# 
+#         getnode(r);
+#         r->type =3D Node_val;
+#         r->numbr =3D x;
+#         r->flags =3D flags;
+# #if defined MBS_SUPPORT
+#         r->wstptr =3D NULL;
+#         r->wstlen =3D 0;
+# #endif /* MBS_SUPPORT */
+# #ifdef GAWKDEBUG
+#         r->stref =3D 1;
+#         r->stptr =3D NULL;
+#         r->stlen =3D 0;
+# #if defined MBS_SUPPORT
+#         r->flags &=3D ~WSTRCUR;
+# #endif /* MBS_SUPPORT */
+# #endif /* GAWKDEBUG */
+#         return r;
+# }
+# 
+# Thanks.
+# 
+# --
+# Lee Haywood.
+
+BEGIN {
+	Value = "abc"
+
+	print "Before <" Value "> ", index( Value, "bc" )
+ 
+	sub( /bc/, "bbc", Value )
+
+	print "After  <" Value ">", index( Value, "bc" )
+}
diff --git a/gawk-5.0.1/test/wideidx2.ok b/gawk-5.0.1/test/wideidx2.ok
new file mode 100644
index 00000000000..c0206ec64b5
--- /dev/null
+++ b/gawk-5.0.1/test/wideidx2.ok
@@ -0,0 +1,2 @@
+Before <abc>  2
+After  <abbc> 3
diff --git a/gawk-5.0.1/test/widesub.awk b/gawk-5.0.1/test/widesub.awk
new file mode 100644
index 00000000000..768e715c251
--- /dev/null
+++ b/gawk-5.0.1/test/widesub.awk
@@ -0,0 +1,12 @@
+BEGIN {
+	str = "type=\"directory\" version=\"1.0\""
+	#print "BEGIN:", str
+
+	while (str) {
+		sub(/^[^=]*/, "", str);
+		s = substr(str, 2)
+		print s
+		sub(/^="[^"]*"/, "", str)
+		sub(/^[ \t]*/, "", str)
+	}
+}
diff --git a/gawk-5.0.1/test/widesub.ok b/gawk-5.0.1/test/widesub.ok
new file mode 100644
index 00000000000..54842cda0f9
--- /dev/null
+++ b/gawk-5.0.1/test/widesub.ok
@@ -0,0 +1,2 @@
+"directory" version="1.0"
+"1.0"
diff --git a/gawk-5.0.1/test/widesub2.awk b/gawk-5.0.1/test/widesub2.awk
new file mode 100644
index 00000000000..69383d3453e
--- /dev/null
+++ b/gawk-5.0.1/test/widesub2.awk
@@ -0,0 +1,9 @@
+BEGIN {
+	Value = "abc"
+
+	print "Before <" Value "> ", index( Value, "bc" )
+
+	sub( /bc/, "bbc", Value )
+
+	print "After  <" Value ">", index( Value, "bc" )
+}
diff --git a/gawk-5.0.1/test/widesub2.ok b/gawk-5.0.1/test/widesub2.ok
new file mode 100644
index 00000000000..c0206ec64b5
--- /dev/null
+++ b/gawk-5.0.1/test/widesub2.ok
@@ -0,0 +1,2 @@
+Before <abc>  2
+After  <abbc> 3
diff --git a/gawk-5.0.1/test/widesub3.awk b/gawk-5.0.1/test/widesub3.awk
new file mode 100644
index 00000000000..48c414a9865
--- /dev/null
+++ b/gawk-5.0.1/test/widesub3.awk
@@ -0,0 +1,6 @@
+{
+   if (substr($1,1,1) == substr($0,1,1))
+      print "substr matches"
+   sub(/foo/,"bar")
+   print nr++
+}
diff --git a/gawk-5.0.1/test/widesub3.in b/gawk-5.0.1/test/widesub3.in
new file mode 100644
index 00000000000..6357df99034
--- /dev/null
+++ b/gawk-5.0.1/test/widesub3.in
@@ -0,0 +1,2 @@
+test
+foo
diff --git a/gawk-5.0.1/test/widesub3.ok b/gawk-5.0.1/test/widesub3.ok
new file mode 100644
index 00000000000..7507261cede
--- /dev/null
+++ b/gawk-5.0.1/test/widesub3.ok
@@ -0,0 +1,4 @@
+substr matches
+0
+substr matches
+1
diff --git a/gawk-5.0.1/test/widesub4.awk b/gawk-5.0.1/test/widesub4.awk
new file mode 100644
index 00000000000..c917aacb122
--- /dev/null
+++ b/gawk-5.0.1/test/widesub4.awk
@@ -0,0 +1,54 @@
+# Date: Sun, 28 May 2006 11:20:58 +0200
+# From: Frantisek Hanzlik <franta@hanzlici.cz>
+# Subject: sub() function do'nt alter string length in awk 3.1.5
+# To: bug-gawk@gnu.org
+# Message-id: <44796B7A.3050908@hanzlici.cz>
+# 
+# Hello,
+# I not know when it is my mistake or gawk bug - in simple example below
+# I delete some chars from string variable, and after this string is
+# modified, but its length is unchanged.
+# 
+# awk 'BEGIN{A="1234567890abcdef";
+#   for (i=1;i<6;i++){print length(A),"A=" A ".";sub("....","",A)}
+# }'
+# 16 A=1234567890abcdef.
+# 16 A=567890abcdef.
+# 16 A=90abcdef.
+# 16 A=cdef.
+# 16 A=.
+# 
+# When I use gensub() instead of sub(), result is as I expected:
+# 
+# awk 'BEGIN{A="1234567890abcdef";
+#   for (i=1;i<6;i++){print length(A),"A=" A ".";A=gensub("....","",1,A)}
+# }'
+# 16 A=1234567890abcdef.
+# 12 A=567890abcdef.
+# 8 A=90abcdef.
+# 4 A=cdef.
+# 0 A=.
+# 
+# OS/GAWK versions:
+# - GNU/Linux kernel 2.6.16-1.2122_FC5 #1 i686, Fedora Core 5 distro
+# - glibc-2.4-8
+# - GNU Awk 3.1.5
+# 
+# Yours sincerely
+# Frantisek Hanzlík
+# 
+# == Lucní 502        Linux/Unix, Novell, Internet   Tel: +420-373729699 ==
+# == 33209 Stenovice   e-mail:franta@hanzlici.cz     Fax: +420-373729699 ==
+# == Czech Republic        http://hanzlici.cz/       GSM: +420-604117319 ==
+# 
+# 
+# 
+# #####################################################################################
+# This Mail Was Scanned by 012.net AntiVirus Service3- Powered by TrendMicro Interscan
+# 
+BEGIN{A="1234567890abcdef";
+   for (i=1;i<6;i++){print length(A),"A=" A ".";sub("....","",A)}
+}
+BEGIN{A="1234567890abcdef";
+   for (i=1;i<6;i++){print length(A),"A=" A ".";A=gensub("....","",1,A)}
+}
diff --git a/gawk-5.0.1/test/widesub4.ok b/gawk-5.0.1/test/widesub4.ok
new file mode 100644
index 00000000000..d582543bfca
--- /dev/null
+++ b/gawk-5.0.1/test/widesub4.ok
@@ -0,0 +1,10 @@
+16 A=1234567890abcdef.
+12 A=567890abcdef.
+8 A=90abcdef.
+4 A=cdef.
+0 A=.
+16 A=1234567890abcdef.
+12 A=567890abcdef.
+8 A=90abcdef.
+4 A=cdef.
+0 A=.
diff --git a/gawk-5.0.1/test/wjposer1.awk b/gawk-5.0.1/test/wjposer1.awk
new file mode 100644
index 00000000000..396089b21a4
--- /dev/null
+++ b/gawk-5.0.1/test/wjposer1.awk
@@ -0,0 +1,75 @@
+# From arnold@f7.net  Sun Sep  5 12:30:53 2004
+# Date: Fri, 3 Sep 2004 00:54:32 -0400 (EDT)
+# From: William J Poser <wjposer@ldc.upenn.edu>
+# To: arnold@skeeve.com
+# Subject: gawk bug
+# Message-ID: <20040903004347.W80049@lorax.ldc.upenn.edu>
+# 
+# Here is a revised version of my previous message, modified to describe
+# the accompanying files.
+# 
+# IhSplit.awk should replicate every record with exactly one entry in the
+# IH field, delete records lacking an IH field, and produce as many copies
+# of records with two or more entries in the IH field as there are entries.
+# In the latter case, the original IH field should be relabelled OIH and
+# a new IH field be added at the beginning of the record.
+# 
+# This has worked properly for many years, since at least 1997. It worked properly with gawk 3.0.5
+# and possibly later versions. Unfortunately I didn't keep track of exactly what version it
+# broke on, but it was whatever came with Mandrake Linux 9.0. It continued to fail with version
+# 3.1.2. However, the problem was eliminated with version 3.1.3 and remains
+# eliminated in version 3.1.4.
+# 
+# The problem was that an apparently random subset of records would loose some
+# or all of their fields. Running the script on the same input always produces
+# the same output with the same errors.
+# 
+# The file Input is a subset of a real lexicon that produces errors using
+# gawk 3.1.2. GoodOutput is the expected output. BadOutput is the erroneous
+# output. A diff will show that there are actually two errors. One record
+# has fields stripped as described above. Another is omitted in its entirety.
+# 
+# 
+# Bill Poser, Linguistics, University of Pennsylvania
+# http://www.ling.upenn.edu/~wjposer/ billposer@alum.mit.edu
+# ----------------------------------------------------------------------------
+#For each record that contains multiple items in its inverse headword (IH)
+#field, generate a set of new records each containing exactly one item
+#in the inverse headword field, otherwise copies of the original.
+
+function CleanUp() #Clean up for next input record.
+{
+  for(i in rec) delete rec[i];
+}
+
+BEGIN {
+RS = "";
+FS = "\n?%"
+}
+{
+
+# First, create an associative array with the tags as indices.
+  for(i = 2; i <= NF; i++) { # The leading FS creates an initial empty field
+       split($i, f, ":");
+       rec[f[1]]=substr($i,index($i,":")+1);
+  }
+
+  if(!("IH" in rec)) next;
+
+# Parse out the inverse headwords
+
+     items = split(rec["IH"],ihs,"/");
+
+# Replace the old IH field.
+
+     sub(/%IH:/,"%OIH:",$0);
+
+# Generate a new copy of the record for each inverse headword
+
+       for(i = 1; i <= items; i++){
+	 entries+=1;
+         printf("%%IH:%s\n",ihs[i]);
+         printf("%s\n\n",$0);
+       }
+       CleanUp();
+  }
diff --git a/gawk-5.0.1/test/wjposer1.in b/gawk-5.0.1/test/wjposer1.in
new file mode 100644
index 00000000000..bdcd4a81cd9
--- /dev/null
+++ b/gawk-5.0.1/test/wjposer1.in
@@ -0,0 +1,1527 @@
+%P:nut'i
+%G:exertion
+%IH:exertion
+%C:N
+%SF:abstractions-misc
+%S:JOPA/EDFR/VESE
+%ES:000088
+%UID:002463
+%MD:1999/03/15
+
+%P:ts'iyantsuk t'eooninzun
+%G:information
+%IH:information
+%C:N
+%SF:abstractions-misc
+%S:JOPA/BRBI
+%UID:000986
+%MD:1997/12/17
+
+%P:k'et'uk
+%G:interval
+%IH:interval
+%C:N
+%SF:abstractions-misc
+%S:MAGO
+%ES:001077
+%UID:000873
+%MD:1997/12/11
+
+%P:khunek
+%G:language, word, message
+%IH:language/word/message
+%POSS:ghunek
+%P1p:neghunek
+%C:N
+%SF:abstractions-misc
+%S:MAGO/BRBI/JOPA/EDFR/VESE/JEKO
+%UID:000928
+%MD:2001/02/10
+
+%P:gal
+%G:running
+%IH:running
+%C:N
+%R:Dugal ndesda. He got hurt while running.
+%SF:abstractions-misc
+%S:JOPA
+%ES:000535
+%UID:002462
+%MD:1999/03/15
+
+%P:t'en
+%G:work
+%IH:work
+%C:N
+%SF:abstractions-misc
+%S:VESE/PEJO
+%ES:000672
+%UID:003028
+%POCKET:N
+%MD:2000/10/04
+
+%P:'ut'en
+%G:work
+%IH:work
+%C:N
+%SF:abstractions-misc
+%P1p:neye'ut'en
+%S:JOPA
+%ES:001041
+%UID:004264
+%POCKET:Y
+%MD:2001/03/15
+
+%P:dulkw'ah
+%G:Spotted Frog
+%IH:Spotted Frog/Frog, Spotted
+%SN:Rana pretiosa
+%MN:Lives in water and has red markings on the belly.
+%PICTURE:/home/poser/Research/Dakelh/Pictures/psfiles/SpottedFrog.ps
+%CAPTION:{\qc Tsasdli} --- Spotted Frog
+%PICPERMISSION:N
+%PICCREDIT:Drawing of Spotted Frog from {\it The Amphibians of British Columbia\/}.
+%C:N
+%SF:amphibiansandreptiles
+%S:EDFR
+%UID:004111
+%POCKET:Y
+%MD:2001/03/07
+
+%P:chunlai
+%G:salamander, lizard
+%IH:lizard/salamander
+%MN:The only species of salamander found in the region is the
+    Long-toed Salamander {\it Ambystoma macrodactylum\/}. No lizards
+    are found in the region. However, this term is applied to other
+    varieties of salamander and to lizards, such as the gekkos sold as
+    pets.
+%FGREF:Corkran \& Thoms (1996;39)
+%SN:Ambystoma macrodactylum
+%C:N
+%SF:amphibiansandreptiles
+%S:LITM/JOPA/BRBI
+%UID:000157
+%MD:1998/05/16
+
+%P:tl'ughus
+%G:snake
+%IH:snake
+%C:N
+%MN:The only snake found in the region is the Common Garter Snake
+    {\it Thamnophis sirtalis\/}. However, the term is applied to all snakes.
+%SN:Thamnophis sirtalis
+%SF:amphibiansandreptiles
+%S:LITM/JOPA/BRBI/MAGO
+%UID:000250
+%MD:1998/12/07
+
+%P:tsasdli
+%G:Western Toad
+%SN:Bufo boreas
+%IH:Western Toad/Toad, Western
+%MN:Lives on land.
+%SF:amphibiansandreptiles
+%C:N
+%S:LITM/JOPA/BRBI/MAGO/STJA/EDFR
+%UID:000059
+%MD:2001/03/07
+
+%P:lhits'e
+%G:bitch, female dog
+%IH:bitch/dog, female
+%C:N
+%SF:animals-domestic
+%S:JOPA/EDFR/VESE
+%UID:002446
+%MD:1999/03/15
+
+%P:musdus
+%G:cow
+%IH:cow
+%C:N
+%P2s:nmusdus
+%ETYM:Loan from Cree {\qf mostos} ``buffalo''.
+%LOANSOURCE:Cree
+%SF:animals-domestic
+%S:LITM/JOPA/BRBI/MAGO
+%UID:000036
+%MD:1997/06/12
+
+%P:lhi
+%G:dog
+%IH:dog
+%C:N
+%DUOPLURAL:lhike
+%SF:animals-domestic
+%POSS:lik
+%P1s:slik
+%P1p:nelik
+%DUOPLURAL:lhike
+%S:LITM/JOPA/BRBI/STJA/VESE/EDFR/JEKO
+%UID:000270
+%MD:2001/02/15
+
+%P:budzocho
+%G:donkey, mule
+%IH:donkey/mule
+%SF:animals-domestic
+%ETYM:``big ears''.
+%C:N
+%S:JOPA/BRBI
+%UID:000376
+%MD:1997/11/14
+
+%P:yeztli
+%G:horse
+%IH:horse
+%SF:animals-domestic
+%ETYM:A contraction of {\qc yezihlhi} ``elk dog''.
+%C:N
+%S:LITM/JOPA/BRBI/PEJO
+%UID:000042
+%MD:2000/10/21
+
+%P:lhike
+%G:Irregular plural of {\qc lhi}, q.v.
+%IH:dogs
+%C:N
+%SF:animals-domestic
+%S:LITM/BRBI/JOPA/STJA
+%UID:000293
+%MD:1999/01/26
+
+%P:sbaiyaz
+%G:lamb
+%IH:lamb
+%C:N
+%SF:animals-domestic
+%S:LITM
+%UID:000254
+%MD:1997/06/16
+
+%P:gugoos
+%G:pig
+%IH:pig
+%C:N
+%ETYM:Ultimately borrowed from French {\qf coche}, probably via Cree.
+%LOANSOURCE:Cree
+%SF:animals-domestic
+%S:LITM/JOPA/BRBI
+%UID:000133
+%MD:1997/06/16
+
+%P:'ut'az
+%G:bat
+%IH:bat
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000390
+%MD:1997/11/14
+
+%P:liyabdut'ai
+%G:bat
+%MN:The only kind of bat found in the region is the Little Brown Myotis.
+%IH:bat
+%SF:animals-land
+%SN:Myotis lucifugus
+%ETYM:Literally, ``devil bird'', a compound of {\qc liyab} ``devil'', a loan from
+      French {\qf le diable}, and {\qc dut'ai} ``bird''. 
+%LOANSOURCE:French
+%C:N
+%S:JOPA/BRBI
+%UID:000215
+%MD:1997/06/16
+
+%P:sus
+%G:black bear
+%IH:black bear
+%C:N
+%SF:animals-land
+%SN:Ursus americanus
+%S:LITM/JOPA/BRBI/STJA/EDFR/VESE/JEKO
+%UID:000048
+%MD:1998/12/19
+
+%P:musduscho dughai
+%G:buffalo
+%IH:buffalo
+%SF:animals-land
+%C:N
+%ETYM:``big hairy cow''.
+%S:JOPA/EDFR
+%UID:003478
+%POCKET:Y
+%MD:2000/11/04
+
+%P:tl'ok'umusdus
+%G:buffalo
+%IH:buffalo
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000374
+%MD:2000/11/01
+
+%P:jenyo
+%G:bull moose
+%IH:bull moose/moose, bull
+%SF:animals-land
+%C:N
+%S:MAGO/JOPA/VESE/EDFR/JEKO
+%UID:000474
+%MD:1999/05/11
+
+%P:denyo
+%G:bull moose
+%IH:moose, bull
+%SF:animals-land
+%C:N
+%S:LITM/JOPA
+%UID:000348
+%MD:1997/06/18
+
+%P:tsiyeyaz
+%G:calf moose
+%IH:calf moose/moose, calf
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000380
+%MD:1997/11/14
+
+%P:duniyaz
+%G:calf moose
+%IH:calf moose/moose, calf
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI
+%UID:000245
+%MD:1997/06/16
+
+%P:whudzih
+%G:caribou
+%IH:caribou
+%C:N
+%SF:animals-land
+%SN:Rangifer tarandus
+%S:JOPA/BRBI/MAGO/EDFR/VESE/JEKO
+%UID:000274
+%MD:1999/05/11
+
+%P:boos
+%G:cat
+%IH:cat
+%C:N
+%SN:Felis domesticus
+%ETYM:Loan from English {\qf puss}, possibly via Chinook Jargon.
+%LOANSOURCE:English
+%SF:animals-land
+%S:LITM/JOPA/BRBI
+%UID:000137
+%MD:1997/12/17
+
+%P:ts'uwhuljos
+%G:chipmunk
+%IH:chipmunk
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI
+%UID:000146
+%MD:1997/06/16
+
+%P:booscho
+%G:cougar
+%IH:cougar
+%SF:animals-land
+%SN:Felis concolor
+%C:N
+%ETYM:Literally, ``big cat'', where {\qc boos} ``cat'' is a loan from English
+      {\qf puss}, possibly via Chinook Jargon.
+%S:JOPA/BRBI
+%UID:000050
+%MD:1997/11/14
+
+%P:duni'at
+%G:cow moose
+%IH:cow moose/moose, cow
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000377
+%MD:1997/11/14
+
+%P:tintulhi
+%G:coyote
+%IH:coyote
+%C:N
+%SF:animals-land
+%SN:Canis latrans
+%S:JOPA/BRBI
+%R:LITM has chuntulhi.
+%UID:000155
+%MD:1997/06/16
+
+%P:yests'e
+%G:deer
+%IH:deer
+%SF:animals-land
+%C:N
+%S:LITM/JOPA/BRBI/EDFR
+%UID:000132
+%MD:1998/12/16
+
+%P:dets'it
+%G:dry cow moose
+%IH:dry cow moose/moose, dry cow
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000378
+%MD:1997/11/14
+
+%P:yezih
+%G:elk
+%IH:elk
+%SF:animals-land
+%C:N
+%R:STJA doesn't use this.
+%S:JOPA/BRBI
+%UID:000382
+%MD:1997/11/14
+
+%P:tsa'at
+%G:female beaver
+%IH:beaver, female
+%C:N
+%SF:animals-land
+%S:STJA
+%UID:001295
+%MD:1998/12/08
+
+%P:chunihcho
+%G:fisher
+%IH:fisher
+%ETYM:``big marten''.
+%SF:animals-land
+%SN:Martes pennanti
+%C:N
+%S:JOPA/BRBI/MAGO
+%UID:000385
+%MD:2000/06/18
+
+%P:ts'unalhbuz
+%G:flying squirrel
+%IH:flying squirrel
+%SF:animals-land
+%SN:Glaucomys sabrinus alpinus
+%PICTURE:/home/poser/Research/Dakelh/Pictures/psfiles/FlyingSquirrel.ps
+%CAPTION:{\qc ts'unulhbuz} --- Flying Squirrel
+%PICPERMISSION:N
+%PICCREDIT:Drawing of Flying Squirrel from {\it The Mammals of British Columbia\/}.
+%C:N
+%S:JOPA/BRBI
+%UID:000389
+%MD:1997/11/14
+
+%P:nanguz
+%G:fox
+%IH:fox
+%C:N
+%SF:animals-land
+%S:MAGO
+%UID:000139
+%MD:2001/02/26
+
+%P:shas
+%G:grizzly bear
+%IH:grizzly bear
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI/VESE/EDFR/JEKO
+%UID:000039
+%MD:1997/06/12
+
+%P:shasyaz
+%G:grizzly bear cub
+%IH:grizzly bear cub/cub, grizzly bear
+%C:N
+%SF:animals-land
+%S:STJA
+%UID:002114
+%MD:1999/02/20
+
+%P:shas'at
+%G:grizzly bear sow
+%IH:grizzly bear sow/sow, grizzly bear
+%C:N
+%SF:animals-land
+%ETYM:``grizzly bear's wife''.
+%S:STJA
+%UID:002113
+%MD:1999/02/20
+
+%P:-lik
+%G:irregular possessed stem of {\qc lhi}, q.v.
+%C:N
+%SF:animals-land
+%S:MAGO
+%UID:000564
+%MD:1997/12/11
+
+%P:wasi
+%G:lynx
+%IH:lynx
+%C:N
+%SF:animals-land
+%SN:Felis lynx
+%ETYM:Loan from Gitksan {\qf wish}.
+%LOANSOURCE:Gitksan
+%S:JOPA/BRBI/STJA/EDFR/VESE/JEKO/MAGO
+%UID:000049
+%MD:2001/04/20
+
+%P:k'ani
+%G:woodchuck
+%IH:woodchuck
+%C:N
+%SF:animals-land
+%SN:Marmota monax
+%S:JOPA/BRBI/PEJO
+%R:Clarified with Josie and Peter 2001/05/28.
+%UID:000391
+%POCKET:Y
+%MD:2001/05/28
+
+%P:dutni
+%G:marmot
+%IH:marmot
+%SF:animals-land
+%C:N
+%SN:Marmota caligata
+%R:Josie and Peter are not really familiar with marmots but have heard older
+   people talk about them.
+%S:JOPA/PEJO
+%UID:000143
+%MD:1998/02/10
+
+%P:chunih
+%G:marten
+%IH:marten
+%SF:animals-land
+%SN:Martes americana
+%C:N
+%S:JOPA/BRBI/VESE/EDFR/JEKO/MAGO
+%UID:000016
+%MD:2001/04/20
+
+%P:telhjoos
+%G:mink
+%IH:mink
+%C:N
+%SF:animals-land
+%SN:Mustela vison
+%S:LITM/JOPA/BRBI
+%UID:000167
+%MD:1997/06/16
+
+%P:duni
+%G:moose
+%IH:moose
+%C:N
+%SF:animals-land
+%SN:Alces alces andersoni
+%S:LITM-EDFR/JOPA/BRBI
+%UID:000346
+%MD:1997/06/18
+
+%P:dats'ooz
+%G:mouse
+%IH:mouse
+%SF:animals-land
+%C:N
+%S:LITM/JOPA/MAGO/VESE/JEKO
+%UID:000156
+%MD:2001/01/22
+
+%P:tsek'et
+%G:muskrat
+%IH:muskrat
+%C:N
+%SF:animals-land
+%SN:Ondatra zibethicus
+%S:JOPA/BRBI/STJA/MAGO
+%UID:000335
+%MD:1998/12/08
+
+%P:chanjo
+%G:newly sexually mature cow moose
+%IH:moose, newly sexually mature cow
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000379
+%MD:1997/11/14
+
+%P:looncho
+%G:pack rat
+%IH:pack rat
+%C:N
+%SF:animals-land
+%S:VESE/JEKO/MAGO
+%UID:000149
+%MD:1999/05/10
+
+%P:dlooncho
+%G:packrat
+%IH:packrat
+%C:N
+%SF:animals-land
+%S:JOPA
+%UID:002701
+%MD:1999/05/11
+
+%P:duneza
+%G:porcupine
+%IH:porcupine
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI/MAGO
+%UID:000388
+%MD:2001/03/06
+
+%P:ts'it
+%G:porcupine
+%IH:porcupine
+%SF:animals-land
+%SN:Erethizon dorsatum
+%C:N
+%ETYM:Perhaps derived from the interjection {\qc ts'it} ``don't touch it!''.
+%S:JOPA/BRBI/MAGO/BEMC/STJA
+%UID:000387
+%MD:1998/12/08
+
+%P:lhiyaz
+%G:puppy
+%IH:puppy
+%C:N
+%SF:animals-land
+%DUOPLURAL:lhiyazke
+%DUOPLURAL:lhikeyaz
+%R:Josie prefers {\qc lhikeyaz}.
+%S:LITM/BRBI/JOPA/EDFR/MAGO-JEKO
+%UID:000182
+%MD:2001/05/26
+
+%P:nats'ildelh
+%G:Red Squirrel
+%IH:squirrel/Red Squirrel
+%SN:Tamiasciurus hudsonicus colum.
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI/STJA
+%UID:000034
+%MD:1999/02/17
+
+%P:goh
+%G:rabbit
+%IH:rabbit
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/VESE/EDFR/JEKO
+%UID:000023
+%MD:1999/05/11
+
+%P:ooch'ainischoot
+%G:recently weaned calf moose
+%IH:moose, recently weaned calf
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000381
+%MD:1997/11/14
+
+%P:sbai
+%G:sheep
+%IH:sheep
+%C:N
+%SF:animals-land
+%S:MAGO
+%UID:001131
+%MD:1998/02/10
+
+%P:'usbai
+%G:sheep
+%IH:sheep
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000375
+%MD:1997/11/14
+
+%P:'ulhguk
+%G:shrew
+%IH:shrew
+%SF:animals-land
+%C:N
+%S:MAGO/VESE/JEKO
+%UID:000526
+%MD:2001/01/22
+
+%P:hoonliz
+%G:skunk
+%IH:skunk
+%C:N
+%P2s:unhoonliz
+%SF:animals-land
+%S:LITM/JOPA/BRBI/MAGO/VESE/EDFR/JEKO
+%UID:000052
+%MD:1997/06/12
+
+%P:nohbai
+%G:weasel
+%IH:weasel
+%C:N
+%SF:animals-land
+%S:JOPA/BRBI/MAGO
+%UID:000141
+%MD:1997/06/16
+
+%P:yus
+%G:wolf
+%IH:wolf
+%C:N
+%SF:animals-land
+%SN:Canis lupus
+%S:LITM/JOPA/BRBI
+%UID:000051
+%MD:1997/06/12
+
+%P:noostel
+%G:wolverine
+%IH:wolverine
+%C:N
+%SF:animals-land
+%SN:Gulo gulo
+%S:JOPA/BRBI/MAGO/VESE/EDFR/JEKO
+%UID:000140
+%MD:2001/04/20
+
+%P:tsatsul
+%G:young beaver
+%IH:beaver, young
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI/STJA
+%UID:000384
+%MD:1998/12/08
+
+%P:lht'at
+%G:beaver dam
+%IH:beaver dam/dam, beaver
+%C:N
+%SF:animals-misc
+%S:STJA
+%UID:001287
+%MD:1998/12/08
+
+%P:'ulh
+%G:beaver dam
+%IH:beaver dam/dam, beaver
+%C:N
+%SF:animals-misc
+%S:STJA
+%UID:001288
+%MD:1998/12/08
+
+%P:tsaken
+%G:beaver lodge
+%IH:beaver lodge
+%C:N
+%SF:animals-misc
+%S:JOPA/BRBI/STJA
+%UID:000405
+%MD:1998/12/08
+
+%P:tunyohtsati
+%G:beaver path under the ice
+%IH:beaver path under the ice
+%C:N
+%SF:animals-misc
+%S:JOPA/EDFR
+%UID:003769
+%POCKET:Y
+%MD:2001/02/13
+
+%P:sus'an
+%G:black bear den
+%IH:black bear den
+%C:N
+%SF:animals-misc
+%S:LITM/STJA
+%UID:000131
+%MD:1998/12/08
+
+%P:shask'oh
+%G:grizzly bear tracks
+%IH:tracks, grizzly bear
+%C:N
+%SF:animals-misc
+%S:MAGO
+%UID:001132
+%MD:1998/02/10
+
+%P:hoolht'ukw
+%G:leech
+%IH:leech
+%SF:animals-misc
+%C:N
+%S:JOPA/PEJO/EDFR
+%UID:003410
+%POCKET:Y
+%MD:2000/11/01
+
+%P:hoot'ub
+%G:leech
+%IH:leech
+%SF:bugs
+%C:N
+%S:JOPA/BRBI/MAGO
+%UID:000370
+%MD:2000/11/01
+
+%P:dunik'oh
+%G:moose tracks
+%IH:moose tracks
+%C:N
+%SF:animals-misc
+%S:PEJO/JOPA
+%ES:000491
+%UID:003121
+%POCKET:Y
+%MD:2000/09/28
+
+%P:gohk'oh
+%G:rabbit tracks
+%IH:tracks, rabbit
+%C:N
+%SF:animals-misc
+%S:LITM
+%UID:000073
+%MD:1997/06/12
+
+%P:tsa
+%G:beaver
+%IH:beaver
+%C:N
+%SN:Castor canadensis
+%UID:000044
+%SF:animals-water
+%S:JOPA/BRBI/STJA/EDFR/VESE/JEKO/MAGO
+%MD:2001/04/18
+
+%P:tsayaz
+%G:beaver kit
+%IH:kit, beaver/beaver, baby
+%SF:animals-water
+%C:N
+%S:STJA
+%UID:001294
+%MD:2000/06/18
+
+%P:tsati
+%G:big beaver, old beaver
+%IH:beaver, big/beaver, old
+%C:N
+%SF:animals-water
+%S:LITM/JOPA/BRBI/STJA
+%UID:000206
+%MD:1998/12/08
+
+%P:tsis
+%G:otter
+%IH:otter
+%SF:animals-water
+%SN:Lutra canadensis
+%C:N
+%S:JOPA/BRBI
+%UID:000386
+%MD:1997/11/14
+
+%P:datsan
+%G:American Crow
+%C:N
+%SF:bird-gen
+%SN:Corvus brachyrhynchos
+%IH:crow/American Crow
+%S:LITM/PEJO
+%UID:000158
+%MD:2000/10/21
+
+%P:sewh
+%G:American Robin
+%IH:Robin, American
+%SN:Turdus migratorius
+%C:N
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/PEJO
+%UID:000181
+%MD:2000/10/21
+
+%P:tsebalyan
+%G:Bald Eagle
+%IH:Bald Eagle
+%C:N
+%SF:bird-gen
+%SN:Haliaeetus leucocephalus
+%S:LITM/JOPA/BRBI
+%UID:000150
+%MD:1997/06/16
+
+%P:dut'ai
+%G:bird, duck
+%IH:bird/duck
+%C:N
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/MAGO/STJA/PEJO
+%UID:000081
+%MD:2000/09/28
+
+%P:delh
+%G:crane
+%IH:crane
+%C:N
+%SF:bird-gen
+%S:LITM
+%UID:000255
+%MD:1997/06/16
+
+%P:khoh
+%G:goose
+%IH:goose
+%C:N
+%P1s:skhoh
+%P2s:nkhoh
+%P1p:nekhoh
+%POSS:khoh
+%SF:bird-gen
+%S:JOPA/BRBI/MAGO/VESE/EDFR/JEKO
+%UID:000031
+%MD:2001/02/15
+
+%P:ts'unalhduz
+%G:hummingbird
+%IH:hummingbird
+%C:N
+%SF:bird-gen
+%S:LITM/BRBI/JOPA
+%UID:000242
+%MD:1997/06/16
+
+%P:gagiyaz
+%G:little bird
+%IH:bird, little
+%C:N
+%QCHECK:Any little bird?
+%SF:bird-gen
+%S:PEJO
+%UID:003115
+%POCKET:Y
+%MD:2000/09/28
+
+%P:dut'aiyaz
+%G:little bird
+%IH:bird, little
+%C:N
+%SF:bird-gen
+%S:STJA/JOPA/EDFR/VESE/PEJO
+%UID:001818
+%MD:2000/09/28
+
+%P:dadzi
+%G:loon
+%IH:loon
+%SF:bird-gen
+%SN:Gavia immer
+%C:N
+%S:LITM/JOPA/BRBI
+%UID:000020
+%MD:1997/06/12
+
+%P:t'ugicho
+%G:Mallard Duck
+%IH:Mallard Duck
+%C:N
+%SN:Anas platyrhynchos
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/MAGO/VESE/EDFR/JEKO
+%UID:000041
+%MD:1999/05/11
+
+%P:musdzoon
+%G:owl
+%IH:owl
+%C:N
+%SF:bird-gen
+%S:LITM/BRBI/JOPA/MAGO
+%UID:000135
+%MD:1997/12/11
+
+%P:ts'olh
+%G:Red-necked Grebe
+%MN:A variety of duck locally known as the Helldiver.
+%IH:Red-Necked Grebe/Helldiver/Grebe, Red-Necked
+%SN:Podiceps grisegena
+%SF:bird-gen
+%C:N
+%S:BRBI/JOPA
+%UID:000263
+%MD:2001/03/08
+
+%P:'utsut
+%G:Ruffed grouse
+%IH:Ruffed grouse
+%C:N
+%SF:bird-gen
+%S:LITM
+%UID:000218
+%MD:1997/06/16
+
+%P:nat'oh
+%G:Spruce Grouse, Fool Hen
+%IH:Spruce Grouse/Grouse, Spruce/Fool Hen
+%SF:bird-gen
+%SN:Dendragapus canadensis
+%C:N
+%S:MAGO/LITM
+%UID:000539
+%MD:1997/12/04
+
+%P:tehgwuzeh
+%G:Steller's Jay, commonly known locally as ``bluejay''.
+%IH:Steller's Jay/jay, Steller's/Bluejay (Steller's Jay)
+%SF:bird-gen
+%SN:Cyanocitta stelleri
+%C:N
+%S:JOPA/BRBI
+%UID:000356
+%MD:1997/11/14
+
+%P:wedlew
+%G:sandpiper
+%IH:sandpiper
+%C:N
+%SN:Eremophila alpestris et sim.
+%SF:bird-gen
+%S:LITM
+%UID:000237
+%MD:2002/07/19
+
+%P:besk'i
+%G:seagull
+%IH:seagull
+%C:N
+%SN:Larus species
+%SF:bird-gen
+%S:LITM
+%UID:000136
+%MD:2002/07/19
+
+%P:ts'incho
+%G:swan
+%IH:swan
+%C:N
+%SF:bird-gen
+%S:LITM
+%UID:000222
+%MD:1997/06/16
+
+%P:'uschas
+%G:Tree Swallow
+%IH:Tree Swallow
+%SF:bird-gen
+%SN:Tachycineta bicolor
+%C:N
+%S:MAGO
+%UID:000535
+%MD:1997/11/22
+
+%P:gwuzeh
+%G:Whiskey Jack, Gray Jay, Canadian Jay
+%IH:Whiskey Jack/Jay, Gray/Jay, Canadian
+%C:N
+%SN:Perisoreus canadensis
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/MAGO
+%UID:000148
+%MD:1997/11/22
+
+%P:chundulkw'uz
+%G:woodpecker
+%IH:woodpecker
+%C:N
+%SF:bird-gen
+%S:JOPA/BRBI/STJA
+%UID:000138
+%MD:1999/03/31
+
+%P:-t'o
+%G:nest
+%IH:nest
+%C:N
+%Pind:'ut'o
+%P3s:but'o
+%Pref:dut'o
+%SF:bird-misc/bugs
+%S:STJA/PEJO/JOPA/BRBI/EDFR
+%ES:001353
+%UID:000226
+%MD:2001/03/07
+
+%P:-nak'uz
+%G:a single eye
+%IH:eye, a single
+%C:N
+%SF:body-ext
+%S:JOPA/EDFR
+%ES:000457
+%UID:003770
+%POCKET:Y
+%MD:2001/02/13
+
+%P:-kechunoh
+%G:ankle
+%IH:ankle
+%P1s:skechunoh
+%P2s:nkechunoh
+%C:N
+%S:MAGO/STJA
+%SF:body-ext
+%UID:000865
+%MD:1999/03/03
+
+%P:-de
+%G:antler, horn
+%IH:antler/horn
+%C:N
+%SF:body-ext
+%P3s:bude
+%S:STJA
+%UID:002266
+%MD:1999/03/02
+
+%P:-de_zu_s
+%G:antler velvet
+%IH:velvet, antler
+%C:N
+%SF:body-ext
+%P3s:bude_zu_s
+%S:STJA
+%UID:002267
+%MD:1999/03/02
+
+%P:-tsul
+%G:anus, asshole
+%IH:anus/asshole
+%C:N
+%P1s:stsul
+%SF:body-ext
+%S:STJA
+%UID:002171
+%MD:1999/02/23
+
+%P:-gan
+%G:arm
+%IH:arm
+%P1s:sgan
+%P2s:ngan
+%Pref:dugan
+%C:N
+%S:LITM/MAGO/STJA/JOPA/VESE/EDFR/JEKO
+%SF:body-ext
+%UID:000863
+%MD:1999/02/22
+
+%P:-chak'ests'oh
+%G:armpit
+%IH:armpit
+%P1s:schak'ests'oh
+%C:N
+%S:MAGO
+%UID:000859
+%SF:body-ext
+%MD:1997/12/11
+
+%P:-t'ak
+%G:back (of body)
+%IH:back (of body)
+%P1s:st'ak
+%P3s:but'ak
+%C:N
+%S:MAGO/EDFR/VESE/JEKO
+%SF:body-ext
+%UID:000899
+%MD:1997/12/11
+
+%P:-lat'ak
+%G:back of hand
+%IH:back of hand
+%P1s:slat'ak
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000871
+%MD:1997/12/11
+
+%P:tsake
+%G:beaver paws
+%IH:beaver paws
+%C:N
+%SF:body-ext
+%S:LITM-EDFR
+%UID:000329
+%MD:1997/06/18
+
+%P:tsache
+%G:beaver tail
+%IH:beaver tail
+%C:N
+%SF:body-ext
+%S:LITM
+%UID:000207
+%MD:1997/06/16
+
+%P:-but
+%G:belly
+%IH:belly
+%P1s:sbut
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000937
+%MD:1997/12/11
+
+%P:-ts'oo
+%G:breast
+%IH:breast
+%P1s:sts'oo
+%C:N
+%S:MAGO
+%UID:000855
+%SF:body-ext
+%MD:1997/12/11
+
+%P:-tl'a
+%G:bum, buttocks
+%IH:bum/buttocks
+%P1s:stl'a
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000936
+%MD:1997/12/11
+
+%P:-kechunch'ooz
+%G:calf of leg
+%IH:calf of leg
+%C:N
+%SF:body-ext
+%S:JOPA/EDFR
+%UID:004458
+%POCKET:Y
+%MD:2001/04/20
+
+%P:-nembus
+%G:cheek
+%IH:cheek
+%P1s:snimbus
+%C:N
+%S:MAGO/JOPA/BRBI
+%SF:body-ext
+%UID:000889
+%MD:1997/12/11
+
+%P:-yoh
+%G:chest
+%IH:chest
+%C:N
+%SF:body-ext
+%S:JOPA/EDFR
+%ES:000660
+%UID:003777
+%POCKET:Y
+%MD:2001/02/13
+
+%P:-yeda'
+%G:chin
+%IH:chin
+%P1s:syeda'
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000882
+%MD:1997/12/11
+
+%P:-tsidakwhudutle
+%G:cranial fontanelle, baby's soft spot
+%IH:cranial fontanelle/baby's soft spot
+%C:N
+%P3s:butsidakwhudutle
+%S:MAGO
+%SF:body-ext
+%UID:000898
+%MD:1997/12/11
+
+%P:-dzo
+%G:ear
+%IH:ear
+%MN:This refers to the ear considered as a whole, especially the exterior.
+    When the canal in particular is referred to, one uses {\qc -dzek}, q.v.
+%C:N
+%P1s:sdzo
+%S:MAGO
+%SF:body-ext
+%UID:000879
+%MD:1997/12/11
+
+%P:-dzobal
+%G:earlobe
+%IH:earlobe
+%C:N
+%P1s:sdzobal
+%SF:body-ext
+%S:BRBI/MAGO
+%UID:000641
+%MD:1997/12/17
+
+%P:-nints'uzti
+%G:elbow
+%IH:elbow
+%P1s:snints'uzti
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000916
+%MD:1997/12/11
+
+%P:-na
+%G:eye
+%IH:eye
+%P1s:sna
+%P3s:buna
+%C:N
+%S:MAGO/JOPA/EDFR
+%SF:body-ext
+%UID:000891
+%MD:1998/12/18
+
+%P:-nak'et
+%G:eye socket
+%IH:eye socket
+%P1s:snak'et
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000892
+%MD:1997/12/11
+
+%P:-nach'usdooz
+%G:eyebrow
+%IH:eyebrow
+%P1s:snach'usdooz
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000896
+%MD:1997/12/11
+
+%P:-nalusgha
+%G:eyelash
+%IH:eyelash
+%P1s:snalusgha
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000895
+%MD:1997/12/11
+
+%P:-nalus
+%G:eyelid
+%IH:eyelid
+%P1s:snalus
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000894
+%MD:1997/12/11
+
+%P:-nen
+%G:face
+%IH:face
+%P1s:snen
+%P2s:nyunen
+%P3s:bunen
+%C:N
+%S:MAGO/PEJO/STJA/JOPA/VESE/EDFR
+%SF:body-ext
+%ES:000369
+%UID:000890
+%MD:2001/04/20
+
+%P:ts'uz
+%G:feather, down
+%IH:feather/down
+%C:N
+%SF:body-ext
+%S:LITM/STJA/PEJO
+%UID:000271
+%MD:2000/10/16
+
+%P:dut'aits'uz
+%G:feathers, down
+%IH:feathers/down
+%C:N
+%SF:body-ext
+%S:STJA
+%UID:002647
+%MD:2001/02/27
+
+%P:-lasge
+%G:finger other than thumb or pinkie
+%IH:finger other than thumb or pinkie
+%P1s:slasge
+%C:N
+%S:MAGO/STJA/JOPA/PEJO/EDFR
+%SF:body-ext
+%UID:000869
+%MD:2000/11/01
+
+%P:-lagui
+%G:fingernails, claws of forepaws
+%IH:fingernails/claws of forepaws
+%P1s:slagui
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000875
+%MD:1997/12/11
+
+%P:-ke
+%G:foot
+%IH:foot
+%C:N
+%P1s:ske
+%Pref:duke
+%S:MAGO/STJA/JOPA/VESE/EDFR/JEKO
+%UID:000851
+%SF:body-ext
+%MD:1999/05/11
+
+%P:-gha
+%G:hair
+%MN:This refers to hair in general and where no more specific term exists, as on the
+    arms and chest. It is not used to refer to the hair of the head, for which the
+    more specific term {\qc -tsigha} is always used.
+%IH:hair
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000888
+%MD:1997/12/11
+
+%P:-tsigha
+%G:hair of the head
+%IH:hair of the head
+%P1s:stsigha
+%P2s:ntsigha
+%P3s:butsigha
+%C:N
+%S:MAGO/LITM/PEJO
+%SF:body-ext
+%UID:000887
+%MD:2000/10/20
+
+%P:-la
+%G:hand
+%IH:hand
+%P1s:sla
+%P2s:nla
+%C:N
+%S:MAGO/STJA
+%SF:body-ext
+%POCKET:Y
+%UID:000866
+%MD:1999/02/17
+
+%P:-tsi
+%G:head
+%IH:head
+%Pref:dutsi
+%C:N
+%SF:body-ext
+%S:STJA
+%UID:002965
+%POCKET:Y
+%MD:1999/06/24
+
+%P:-kelatsul
+%G:heel
+%IH:heel
+%P1s:skelatsul
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000917
+%MD:1997/12/11
+
+%P:-k'ui
+%G:hip
+%IH:hip
+%P1s:sk'ui
+%C:N
+%S:MAGO/JOPA
+%SF:body-ext
+%UID:000923
+%MD:2001/03/15
+
+%P:-gwut
+%G:knee
+%IH:knee
+%P1s:sgwut
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000933
+%MD:1997/12/11
+
+%P:-gwutlasi'ai
+%G:kneecap
+%IH:kneecap
+%P1s:sgwutlasi'ai
+%R:has something to do with floating at tip of knee
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000925
+%MD:1997/12/11
+
+%P:-langwut
+%G:knuckles at boundary between hand and fingers
+%IH:knuckles at boundary between hand and fingers
+%P1s:slangwut
+%SF:body-ext
+%C:N
+%S:JOPA/BRBI
+%UID:000967
+%MD:1997/12/17
+
+%P:-kechun
+%G:leg
+%IH:leg
+%P1s:skechun
+%C:N
+%S:MAGO
+%UID:000852
+%SF:body-ext
+%MD:1997/12/11
diff --git a/gawk-5.0.1/test/wjposer1.ok b/gawk-5.0.1/test/wjposer1.ok
new file mode 100644
index 00000000000..16cde6a74b9
--- /dev/null
+++ b/gawk-5.0.1/test/wjposer1.ok
@@ -0,0 +1,2068 @@
+%IH:exertion
+%P:nut'i
+%G:exertion
+%OIH:exertion
+%C:N
+%SF:abstractions-misc
+%S:JOPA/EDFR/VESE
+%ES:000088
+%UID:002463
+%MD:1999/03/15
+
+%IH:information
+%P:ts'iyantsuk t'eooninzun
+%G:information
+%OIH:information
+%C:N
+%SF:abstractions-misc
+%S:JOPA/BRBI
+%UID:000986
+%MD:1997/12/17
+
+%IH:interval
+%P:k'et'uk
+%G:interval
+%OIH:interval
+%C:N
+%SF:abstractions-misc
+%S:MAGO
+%ES:001077
+%UID:000873
+%MD:1997/12/11
+
+%IH:language
+%P:khunek
+%G:language, word, message
+%OIH:language/word/message
+%POSS:ghunek
+%P1p:neghunek
+%C:N
+%SF:abstractions-misc
+%S:MAGO/BRBI/JOPA/EDFR/VESE/JEKO
+%UID:000928
+%MD:2001/02/10
+
+%IH:word
+%P:khunek
+%G:language, word, message
+%OIH:language/word/message
+%POSS:ghunek
+%P1p:neghunek
+%C:N
+%SF:abstractions-misc
+%S:MAGO/BRBI/JOPA/EDFR/VESE/JEKO
+%UID:000928
+%MD:2001/02/10
+
+%IH:message
+%P:khunek
+%G:language, word, message
+%OIH:language/word/message
+%POSS:ghunek
+%P1p:neghunek
+%C:N
+%SF:abstractions-misc
+%S:MAGO/BRBI/JOPA/EDFR/VESE/JEKO
+%UID:000928
+%MD:2001/02/10
+
+%IH:running
+%P:gal
+%G:running
+%OIH:running
+%C:N
+%R:Dugal ndesda. He got hurt while running.
+%SF:abstractions-misc
+%S:JOPA
+%ES:000535
+%UID:002462
+%MD:1999/03/15
+
+%IH:work
+%P:t'en
+%G:work
+%OIH:work
+%C:N
+%SF:abstractions-misc
+%S:VESE/PEJO
+%ES:000672
+%UID:003028
+%POCKET:N
+%MD:2000/10/04
+
+%IH:work
+%P:'ut'en
+%G:work
+%OIH:work
+%C:N
+%SF:abstractions-misc
+%P1p:neye'ut'en
+%S:JOPA
+%ES:001041
+%UID:004264
+%POCKET:Y
+%MD:2001/03/15
+
+%IH:Spotted Frog
+%P:dulkw'ah
+%G:Spotted Frog
+%OIH:Spotted Frog/Frog, Spotted
+%SN:Rana pretiosa
+%MN:Lives in water and has red markings on the belly.
+%PICTURE:/home/poser/Research/Dakelh/Pictures/psfiles/SpottedFrog.ps
+%CAPTION:{\qc Tsasdli} --- Spotted Frog
+%PICPERMISSION:N
+%PICCREDIT:Drawing of Spotted Frog from {\it The Amphibians of British Columbia\/}.
+%C:N
+%SF:amphibiansandreptiles
+%S:EDFR
+%UID:004111
+%POCKET:Y
+%MD:2001/03/07
+
+%IH:Frog, Spotted
+%P:dulkw'ah
+%G:Spotted Frog
+%OIH:Spotted Frog/Frog, Spotted
+%SN:Rana pretiosa
+%MN:Lives in water and has red markings on the belly.
+%PICTURE:/home/poser/Research/Dakelh/Pictures/psfiles/SpottedFrog.ps
+%CAPTION:{\qc Tsasdli} --- Spotted Frog
+%PICPERMISSION:N
+%PICCREDIT:Drawing of Spotted Frog from {\it The Amphibians of British Columbia\/}.
+%C:N
+%SF:amphibiansandreptiles
+%S:EDFR
+%UID:004111
+%POCKET:Y
+%MD:2001/03/07
+
+%IH:lizard
+%P:chunlai
+%G:salamander, lizard
+%OIH:lizard/salamander
+%MN:The only species of salamander found in the region is the
+    Long-toed Salamander {\it Ambystoma macrodactylum\/}. No lizards
+    are found in the region. However, this term is applied to other
+    varieties of salamander and to lizards, such as the gekkos sold as
+    pets.
+%FGREF:Corkran \& Thoms (1996;39)
+%SN:Ambystoma macrodactylum
+%C:N
+%SF:amphibiansandreptiles
+%S:LITM/JOPA/BRBI
+%UID:000157
+%MD:1998/05/16
+
+%IH:salamander
+%P:chunlai
+%G:salamander, lizard
+%OIH:lizard/salamander
+%MN:The only species of salamander found in the region is the
+    Long-toed Salamander {\it Ambystoma macrodactylum\/}. No lizards
+    are found in the region. However, this term is applied to other
+    varieties of salamander and to lizards, such as the gekkos sold as
+    pets.
+%FGREF:Corkran \& Thoms (1996;39)
+%SN:Ambystoma macrodactylum
+%C:N
+%SF:amphibiansandreptiles
+%S:LITM/JOPA/BRBI
+%UID:000157
+%MD:1998/05/16
+
+%IH:snake
+%P:tl'ughus
+%G:snake
+%OIH:snake
+%C:N
+%MN:The only snake found in the region is the Common Garter Snake
+    {\it Thamnophis sirtalis\/}. However, the term is applied to all snakes.
+%SN:Thamnophis sirtalis
+%SF:amphibiansandreptiles
+%S:LITM/JOPA/BRBI/MAGO
+%UID:000250
+%MD:1998/12/07
+
+%IH:Western Toad
+%P:tsasdli
+%G:Western Toad
+%SN:Bufo boreas
+%OIH:Western Toad/Toad, Western
+%MN:Lives on land.
+%SF:amphibiansandreptiles
+%C:N
+%S:LITM/JOPA/BRBI/MAGO/STJA/EDFR
+%UID:000059
+%MD:2001/03/07
+
+%IH:Toad, Western
+%P:tsasdli
+%G:Western Toad
+%SN:Bufo boreas
+%OIH:Western Toad/Toad, Western
+%MN:Lives on land.
+%SF:amphibiansandreptiles
+%C:N
+%S:LITM/JOPA/BRBI/MAGO/STJA/EDFR
+%UID:000059
+%MD:2001/03/07
+
+%IH:bitch
+%P:lhits'e
+%G:bitch, female dog
+%OIH:bitch/dog, female
+%C:N
+%SF:animals-domestic
+%S:JOPA/EDFR/VESE
+%UID:002446
+%MD:1999/03/15
+
+%IH:dog, female
+%P:lhits'e
+%G:bitch, female dog
+%OIH:bitch/dog, female
+%C:N
+%SF:animals-domestic
+%S:JOPA/EDFR/VESE
+%UID:002446
+%MD:1999/03/15
+
+%IH:cow
+%P:musdus
+%G:cow
+%OIH:cow
+%C:N
+%P2s:nmusdus
+%ETYM:Loan from Cree {\qf mostos} ``buffalo''.
+%LOANSOURCE:Cree
+%SF:animals-domestic
+%S:LITM/JOPA/BRBI/MAGO
+%UID:000036
+%MD:1997/06/12
+
+%IH:dog
+%P:lhi
+%G:dog
+%OIH:dog
+%C:N
+%DUOPLURAL:lhike
+%SF:animals-domestic
+%POSS:lik
+%P1s:slik
+%P1p:nelik
+%DUOPLURAL:lhike
+%S:LITM/JOPA/BRBI/STJA/VESE/EDFR/JEKO
+%UID:000270
+%MD:2001/02/15
+
+%IH:donkey
+%P:budzocho
+%G:donkey, mule
+%OIH:donkey/mule
+%SF:animals-domestic
+%ETYM:``big ears''.
+%C:N
+%S:JOPA/BRBI
+%UID:000376
+%MD:1997/11/14
+
+%IH:mule
+%P:budzocho
+%G:donkey, mule
+%OIH:donkey/mule
+%SF:animals-domestic
+%ETYM:``big ears''.
+%C:N
+%S:JOPA/BRBI
+%UID:000376
+%MD:1997/11/14
+
+%IH:horse
+%P:yeztli
+%G:horse
+%OIH:horse
+%SF:animals-domestic
+%ETYM:A contraction of {\qc yezihlhi} ``elk dog''.
+%C:N
+%S:LITM/JOPA/BRBI/PEJO
+%UID:000042
+%MD:2000/10/21
+
+%IH:dogs
+%P:lhike
+%G:Irregular plural of {\qc lhi}, q.v.
+%OIH:dogs
+%C:N
+%SF:animals-domestic
+%S:LITM/BRBI/JOPA/STJA
+%UID:000293
+%MD:1999/01/26
+
+%IH:lamb
+%P:sbaiyaz
+%G:lamb
+%OIH:lamb
+%C:N
+%SF:animals-domestic
+%S:LITM
+%UID:000254
+%MD:1997/06/16
+
+%IH:pig
+%P:gugoos
+%G:pig
+%OIH:pig
+%C:N
+%ETYM:Ultimately borrowed from French {\qf coche}, probably via Cree.
+%LOANSOURCE:Cree
+%SF:animals-domestic
+%S:LITM/JOPA/BRBI
+%UID:000133
+%MD:1997/06/16
+
+%IH:bat
+%P:'ut'az
+%G:bat
+%OIH:bat
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000390
+%MD:1997/11/14
+
+%IH:bat
+%P:liyabdut'ai
+%G:bat
+%MN:The only kind of bat found in the region is the Little Brown Myotis.
+%OIH:bat
+%SF:animals-land
+%SN:Myotis lucifugus
+%ETYM:Literally, ``devil bird'', a compound of {\qc liyab} ``devil'', a loan from
+      French {\qf le diable}, and {\qc dut'ai} ``bird''. 
+%LOANSOURCE:French
+%C:N
+%S:JOPA/BRBI
+%UID:000215
+%MD:1997/06/16
+
+%IH:black bear
+%P:sus
+%G:black bear
+%OIH:black bear
+%C:N
+%SF:animals-land
+%SN:Ursus americanus
+%S:LITM/JOPA/BRBI/STJA/EDFR/VESE/JEKO
+%UID:000048
+%MD:1998/12/19
+
+%IH:buffalo
+%P:musduscho dughai
+%G:buffalo
+%OIH:buffalo
+%SF:animals-land
+%C:N
+%ETYM:``big hairy cow''.
+%S:JOPA/EDFR
+%UID:003478
+%POCKET:Y
+%MD:2000/11/04
+
+%IH:buffalo
+%P:tl'ok'umusdus
+%G:buffalo
+%OIH:buffalo
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000374
+%MD:2000/11/01
+
+%IH:bull moose
+%P:jenyo
+%G:bull moose
+%OIH:bull moose/moose, bull
+%SF:animals-land
+%C:N
+%S:MAGO/JOPA/VESE/EDFR/JEKO
+%UID:000474
+%MD:1999/05/11
+
+%IH:moose, bull
+%P:jenyo
+%G:bull moose
+%OIH:bull moose/moose, bull
+%SF:animals-land
+%C:N
+%S:MAGO/JOPA/VESE/EDFR/JEKO
+%UID:000474
+%MD:1999/05/11
+
+%IH:moose, bull
+%P:denyo
+%G:bull moose
+%OIH:moose, bull
+%SF:animals-land
+%C:N
+%S:LITM/JOPA
+%UID:000348
+%MD:1997/06/18
+
+%IH:calf moose
+%P:tsiyeyaz
+%G:calf moose
+%OIH:calf moose/moose, calf
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000380
+%MD:1997/11/14
+
+%IH:moose, calf
+%P:tsiyeyaz
+%G:calf moose
+%OIH:calf moose/moose, calf
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000380
+%MD:1997/11/14
+
+%IH:calf moose
+%P:duniyaz
+%G:calf moose
+%OIH:calf moose/moose, calf
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI
+%UID:000245
+%MD:1997/06/16
+
+%IH:moose, calf
+%P:duniyaz
+%G:calf moose
+%OIH:calf moose/moose, calf
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI
+%UID:000245
+%MD:1997/06/16
+
+%IH:caribou
+%P:whudzih
+%G:caribou
+%OIH:caribou
+%C:N
+%SF:animals-land
+%SN:Rangifer tarandus
+%S:JOPA/BRBI/MAGO/EDFR/VESE/JEKO
+%UID:000274
+%MD:1999/05/11
+
+%IH:cat
+%P:boos
+%G:cat
+%OIH:cat
+%C:N
+%SN:Felis domesticus
+%ETYM:Loan from English {\qf puss}, possibly via Chinook Jargon.
+%LOANSOURCE:English
+%SF:animals-land
+%S:LITM/JOPA/BRBI
+%UID:000137
+%MD:1997/12/17
+
+%IH:chipmunk
+%P:ts'uwhuljos
+%G:chipmunk
+%OIH:chipmunk
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI
+%UID:000146
+%MD:1997/06/16
+
+%IH:cougar
+%P:booscho
+%G:cougar
+%OIH:cougar
+%SF:animals-land
+%SN:Felis concolor
+%C:N
+%ETYM:Literally, ``big cat'', where {\qc boos} ``cat'' is a loan from English
+      {\qf puss}, possibly via Chinook Jargon.
+%S:JOPA/BRBI
+%UID:000050
+%MD:1997/11/14
+
+%IH:cow moose
+%P:duni'at
+%G:cow moose
+%OIH:cow moose/moose, cow
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000377
+%MD:1997/11/14
+
+%IH:moose, cow
+%P:duni'at
+%G:cow moose
+%OIH:cow moose/moose, cow
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000377
+%MD:1997/11/14
+
+%IH:coyote
+%P:tintulhi
+%G:coyote
+%OIH:coyote
+%C:N
+%SF:animals-land
+%SN:Canis latrans
+%S:JOPA/BRBI
+%R:LITM has chuntulhi.
+%UID:000155
+%MD:1997/06/16
+
+%IH:deer
+%P:yests'e
+%G:deer
+%OIH:deer
+%SF:animals-land
+%C:N
+%S:LITM/JOPA/BRBI/EDFR
+%UID:000132
+%MD:1998/12/16
+
+%IH:dry cow moose
+%P:dets'it
+%G:dry cow moose
+%OIH:dry cow moose/moose, dry cow
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000378
+%MD:1997/11/14
+
+%IH:moose, dry cow
+%P:dets'it
+%G:dry cow moose
+%OIH:dry cow moose/moose, dry cow
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000378
+%MD:1997/11/14
+
+%IH:elk
+%P:yezih
+%G:elk
+%OIH:elk
+%SF:animals-land
+%C:N
+%R:STJA doesn't use this.
+%S:JOPA/BRBI
+%UID:000382
+%MD:1997/11/14
+
+%IH:beaver, female
+%P:tsa'at
+%G:female beaver
+%OIH:beaver, female
+%C:N
+%SF:animals-land
+%S:STJA
+%UID:001295
+%MD:1998/12/08
+
+%IH:fisher
+%P:chunihcho
+%G:fisher
+%OIH:fisher
+%ETYM:``big marten''.
+%SF:animals-land
+%SN:Martes pennanti
+%C:N
+%S:JOPA/BRBI/MAGO
+%UID:000385
+%MD:2000/06/18
+
+%IH:flying squirrel
+%P:ts'unalhbuz
+%G:flying squirrel
+%OIH:flying squirrel
+%SF:animals-land
+%SN:Glaucomys sabrinus alpinus
+%PICTURE:/home/poser/Research/Dakelh/Pictures/psfiles/FlyingSquirrel.ps
+%CAPTION:{\qc ts'unulhbuz} --- Flying Squirrel
+%PICPERMISSION:N
+%PICCREDIT:Drawing of Flying Squirrel from {\it The Mammals of British Columbia\/}.
+%C:N
+%S:JOPA/BRBI
+%UID:000389
+%MD:1997/11/14
+
+%IH:fox
+%P:nanguz
+%G:fox
+%OIH:fox
+%C:N
+%SF:animals-land
+%S:MAGO
+%UID:000139
+%MD:2001/02/26
+
+%IH:grizzly bear
+%P:shas
+%G:grizzly bear
+%OIH:grizzly bear
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI/VESE/EDFR/JEKO
+%UID:000039
+%MD:1997/06/12
+
+%IH:grizzly bear cub
+%P:shasyaz
+%G:grizzly bear cub
+%OIH:grizzly bear cub/cub, grizzly bear
+%C:N
+%SF:animals-land
+%S:STJA
+%UID:002114
+%MD:1999/02/20
+
+%IH:cub, grizzly bear
+%P:shasyaz
+%G:grizzly bear cub
+%OIH:grizzly bear cub/cub, grizzly bear
+%C:N
+%SF:animals-land
+%S:STJA
+%UID:002114
+%MD:1999/02/20
+
+%IH:grizzly bear sow
+%P:shas'at
+%G:grizzly bear sow
+%OIH:grizzly bear sow/sow, grizzly bear
+%C:N
+%SF:animals-land
+%ETYM:``grizzly bear's wife''.
+%S:STJA
+%UID:002113
+%MD:1999/02/20
+
+%IH:sow, grizzly bear
+%P:shas'at
+%G:grizzly bear sow
+%OIH:grizzly bear sow/sow, grizzly bear
+%C:N
+%SF:animals-land
+%ETYM:``grizzly bear's wife''.
+%S:STJA
+%UID:002113
+%MD:1999/02/20
+
+%IH:lynx
+%P:wasi
+%G:lynx
+%OIH:lynx
+%C:N
+%SF:animals-land
+%SN:Felis lynx
+%ETYM:Loan from Gitksan {\qf wish}.
+%LOANSOURCE:Gitksan
+%S:JOPA/BRBI/STJA/EDFR/VESE/JEKO/MAGO
+%UID:000049
+%MD:2001/04/20
+
+%IH:woodchuck
+%P:k'ani
+%G:woodchuck
+%OIH:woodchuck
+%C:N
+%SF:animals-land
+%SN:Marmota monax
+%S:JOPA/BRBI/PEJO
+%R:Clarified with Josie and Peter 2001/05/28.
+%UID:000391
+%POCKET:Y
+%MD:2001/05/28
+
+%IH:marmot
+%P:dutni
+%G:marmot
+%OIH:marmot
+%SF:animals-land
+%C:N
+%SN:Marmota caligata
+%R:Josie and Peter are not really familiar with marmots but have heard older
+   people talk about them.
+%S:JOPA/PEJO
+%UID:000143
+%MD:1998/02/10
+
+%IH:marten
+%P:chunih
+%G:marten
+%OIH:marten
+%SF:animals-land
+%SN:Martes americana
+%C:N
+%S:JOPA/BRBI/VESE/EDFR/JEKO/MAGO
+%UID:000016
+%MD:2001/04/20
+
+%IH:mink
+%P:telhjoos
+%G:mink
+%OIH:mink
+%C:N
+%SF:animals-land
+%SN:Mustela vison
+%S:LITM/JOPA/BRBI
+%UID:000167
+%MD:1997/06/16
+
+%IH:moose
+%P:duni
+%G:moose
+%OIH:moose
+%C:N
+%SF:animals-land
+%SN:Alces alces andersoni
+%S:LITM-EDFR/JOPA/BRBI
+%UID:000346
+%MD:1997/06/18
+
+%IH:mouse
+%P:dats'ooz
+%G:mouse
+%OIH:mouse
+%SF:animals-land
+%C:N
+%S:LITM/JOPA/MAGO/VESE/JEKO
+%UID:000156
+%MD:2001/01/22
+
+%IH:muskrat
+%P:tsek'et
+%G:muskrat
+%OIH:muskrat
+%C:N
+%SF:animals-land
+%SN:Ondatra zibethicus
+%S:JOPA/BRBI/STJA/MAGO
+%UID:000335
+%MD:1998/12/08
+
+%IH:moose, newly sexually mature cow
+%P:chanjo
+%G:newly sexually mature cow moose
+%OIH:moose, newly sexually mature cow
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000379
+%MD:1997/11/14
+
+%IH:pack rat
+%P:looncho
+%G:pack rat
+%OIH:pack rat
+%C:N
+%SF:animals-land
+%S:VESE/JEKO/MAGO
+%UID:000149
+%MD:1999/05/10
+
+%IH:packrat
+%P:dlooncho
+%G:packrat
+%OIH:packrat
+%C:N
+%SF:animals-land
+%S:JOPA
+%UID:002701
+%MD:1999/05/11
+
+%IH:porcupine
+%P:duneza
+%G:porcupine
+%OIH:porcupine
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI/MAGO
+%UID:000388
+%MD:2001/03/06
+
+%IH:porcupine
+%P:ts'it
+%G:porcupine
+%OIH:porcupine
+%SF:animals-land
+%SN:Erethizon dorsatum
+%C:N
+%ETYM:Perhaps derived from the interjection {\qc ts'it} ``don't touch it!''.
+%S:JOPA/BRBI/MAGO/BEMC/STJA
+%UID:000387
+%MD:1998/12/08
+
+%IH:puppy
+%P:lhiyaz
+%G:puppy
+%OIH:puppy
+%C:N
+%SF:animals-land
+%DUOPLURAL:lhiyazke
+%DUOPLURAL:lhikeyaz
+%R:Josie prefers {\qc lhikeyaz}.
+%S:LITM/BRBI/JOPA/EDFR/MAGO-JEKO
+%UID:000182
+%MD:2001/05/26
+
+%IH:squirrel
+%P:nats'ildelh
+%G:Red Squirrel
+%OIH:squirrel/Red Squirrel
+%SN:Tamiasciurus hudsonicus colum.
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI/STJA
+%UID:000034
+%MD:1999/02/17
+
+%IH:Red Squirrel
+%P:nats'ildelh
+%G:Red Squirrel
+%OIH:squirrel/Red Squirrel
+%SN:Tamiasciurus hudsonicus colum.
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/BRBI/STJA
+%UID:000034
+%MD:1999/02/17
+
+%IH:rabbit
+%P:goh
+%G:rabbit
+%OIH:rabbit
+%C:N
+%SF:animals-land
+%S:LITM/JOPA/VESE/EDFR/JEKO
+%UID:000023
+%MD:1999/05/11
+
+%IH:moose, recently weaned calf
+%P:ooch'ainischoot
+%G:recently weaned calf moose
+%OIH:moose, recently weaned calf
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000381
+%MD:1997/11/14
+
+%IH:sheep
+%P:sbai
+%G:sheep
+%OIH:sheep
+%C:N
+%SF:animals-land
+%S:MAGO
+%UID:001131
+%MD:1998/02/10
+
+%IH:sheep
+%P:'usbai
+%G:sheep
+%OIH:sheep
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI
+%UID:000375
+%MD:1997/11/14
+
+%IH:shrew
+%P:'ulhguk
+%G:shrew
+%OIH:shrew
+%SF:animals-land
+%C:N
+%S:MAGO/VESE/JEKO
+%UID:000526
+%MD:2001/01/22
+
+%IH:skunk
+%P:hoonliz
+%G:skunk
+%OIH:skunk
+%C:N
+%P2s:unhoonliz
+%SF:animals-land
+%S:LITM/JOPA/BRBI/MAGO/VESE/EDFR/JEKO
+%UID:000052
+%MD:1997/06/12
+
+%IH:weasel
+%P:nohbai
+%G:weasel
+%OIH:weasel
+%C:N
+%SF:animals-land
+%S:JOPA/BRBI/MAGO
+%UID:000141
+%MD:1997/06/16
+
+%IH:wolf
+%P:yus
+%G:wolf
+%OIH:wolf
+%C:N
+%SF:animals-land
+%SN:Canis lupus
+%S:LITM/JOPA/BRBI
+%UID:000051
+%MD:1997/06/12
+
+%IH:wolverine
+%P:noostel
+%G:wolverine
+%OIH:wolverine
+%C:N
+%SF:animals-land
+%SN:Gulo gulo
+%S:JOPA/BRBI/MAGO/VESE/EDFR/JEKO
+%UID:000140
+%MD:2001/04/20
+
+%IH:beaver, young
+%P:tsatsul
+%G:young beaver
+%OIH:beaver, young
+%SF:animals-land
+%C:N
+%S:JOPA/BRBI/STJA
+%UID:000384
+%MD:1998/12/08
+
+%IH:beaver dam
+%P:lht'at
+%G:beaver dam
+%OIH:beaver dam/dam, beaver
+%C:N
+%SF:animals-misc
+%S:STJA
+%UID:001287
+%MD:1998/12/08
+
+%IH:dam, beaver
+%P:lht'at
+%G:beaver dam
+%OIH:beaver dam/dam, beaver
+%C:N
+%SF:animals-misc
+%S:STJA
+%UID:001287
+%MD:1998/12/08
+
+%IH:beaver dam
+%P:'ulh
+%G:beaver dam
+%OIH:beaver dam/dam, beaver
+%C:N
+%SF:animals-misc
+%S:STJA
+%UID:001288
+%MD:1998/12/08
+
+%IH:dam, beaver
+%P:'ulh
+%G:beaver dam
+%OIH:beaver dam/dam, beaver
+%C:N
+%SF:animals-misc
+%S:STJA
+%UID:001288
+%MD:1998/12/08
+
+%IH:beaver lodge
+%P:tsaken
+%G:beaver lodge
+%OIH:beaver lodge
+%C:N
+%SF:animals-misc
+%S:JOPA/BRBI/STJA
+%UID:000405
+%MD:1998/12/08
+
+%IH:beaver path under the ice
+%P:tunyohtsati
+%G:beaver path under the ice
+%OIH:beaver path under the ice
+%C:N
+%SF:animals-misc
+%S:JOPA/EDFR
+%UID:003769
+%POCKET:Y
+%MD:2001/02/13
+
+%IH:black bear den
+%P:sus'an
+%G:black bear den
+%OIH:black bear den
+%C:N
+%SF:animals-misc
+%S:LITM/STJA
+%UID:000131
+%MD:1998/12/08
+
+%IH:tracks, grizzly bear
+%P:shask'oh
+%G:grizzly bear tracks
+%OIH:tracks, grizzly bear
+%C:N
+%SF:animals-misc
+%S:MAGO
+%UID:001132
+%MD:1998/02/10
+
+%IH:leech
+%P:hoolht'ukw
+%G:leech
+%OIH:leech
+%SF:animals-misc
+%C:N
+%S:JOPA/PEJO/EDFR
+%UID:003410
+%POCKET:Y
+%MD:2000/11/01
+
+%IH:leech
+%P:hoot'ub
+%G:leech
+%OIH:leech
+%SF:bugs
+%C:N
+%S:JOPA/BRBI/MAGO
+%UID:000370
+%MD:2000/11/01
+
+%IH:moose tracks
+%P:dunik'oh
+%G:moose tracks
+%OIH:moose tracks
+%C:N
+%SF:animals-misc
+%S:PEJO/JOPA
+%ES:000491
+%UID:003121
+%POCKET:Y
+%MD:2000/09/28
+
+%IH:tracks, rabbit
+%P:gohk'oh
+%G:rabbit tracks
+%OIH:tracks, rabbit
+%C:N
+%SF:animals-misc
+%S:LITM
+%UID:000073
+%MD:1997/06/12
+
+%IH:beaver
+%P:tsa
+%G:beaver
+%OIH:beaver
+%C:N
+%SN:Castor canadensis
+%UID:000044
+%SF:animals-water
+%S:JOPA/BRBI/STJA/EDFR/VESE/JEKO/MAGO
+%MD:2001/04/18
+
+%IH:kit, beaver
+%P:tsayaz
+%G:beaver kit
+%OIH:kit, beaver/beaver, baby
+%SF:animals-water
+%C:N
+%S:STJA
+%UID:001294
+%MD:2000/06/18
+
+%IH:beaver, baby
+%P:tsayaz
+%G:beaver kit
+%OIH:kit, beaver/beaver, baby
+%SF:animals-water
+%C:N
+%S:STJA
+%UID:001294
+%MD:2000/06/18
+
+%IH:beaver, big
+%P:tsati
+%G:big beaver, old beaver
+%OIH:beaver, big/beaver, old
+%C:N
+%SF:animals-water
+%S:LITM/JOPA/BRBI/STJA
+%UID:000206
+%MD:1998/12/08
+
+%IH:beaver, old
+%P:tsati
+%G:big beaver, old beaver
+%OIH:beaver, big/beaver, old
+%C:N
+%SF:animals-water
+%S:LITM/JOPA/BRBI/STJA
+%UID:000206
+%MD:1998/12/08
+
+%IH:otter
+%P:tsis
+%G:otter
+%OIH:otter
+%SF:animals-water
+%SN:Lutra canadensis
+%C:N
+%S:JOPA/BRBI
+%UID:000386
+%MD:1997/11/14
+
+%IH:crow
+%P:datsan
+%G:American Crow
+%C:N
+%SF:bird-gen
+%SN:Corvus brachyrhynchos
+%OIH:crow/American Crow
+%S:LITM/PEJO
+%UID:000158
+%MD:2000/10/21
+
+%IH:American Crow
+%P:datsan
+%G:American Crow
+%C:N
+%SF:bird-gen
+%SN:Corvus brachyrhynchos
+%OIH:crow/American Crow
+%S:LITM/PEJO
+%UID:000158
+%MD:2000/10/21
+
+%IH:Robin, American
+%P:sewh
+%G:American Robin
+%OIH:Robin, American
+%SN:Turdus migratorius
+%C:N
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/PEJO
+%UID:000181
+%MD:2000/10/21
+
+%IH:Bald Eagle
+%P:tsebalyan
+%G:Bald Eagle
+%OIH:Bald Eagle
+%C:N
+%SF:bird-gen
+%SN:Haliaeetus leucocephalus
+%S:LITM/JOPA/BRBI
+%UID:000150
+%MD:1997/06/16
+
+%IH:bird
+%P:dut'ai
+%G:bird, duck
+%OIH:bird/duck
+%C:N
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/MAGO/STJA/PEJO
+%UID:000081
+%MD:2000/09/28
+
+%IH:duck
+%P:dut'ai
+%G:bird, duck
+%OIH:bird/duck
+%C:N
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/MAGO/STJA/PEJO
+%UID:000081
+%MD:2000/09/28
+
+%IH:crane
+%P:delh
+%G:crane
+%OIH:crane
+%C:N
+%SF:bird-gen
+%S:LITM
+%UID:000255
+%MD:1997/06/16
+
+%IH:goose
+%P:khoh
+%G:goose
+%OIH:goose
+%C:N
+%P1s:skhoh
+%P2s:nkhoh
+%P1p:nekhoh
+%POSS:khoh
+%SF:bird-gen
+%S:JOPA/BRBI/MAGO/VESE/EDFR/JEKO
+%UID:000031
+%MD:2001/02/15
+
+%IH:hummingbird
+%P:ts'unalhduz
+%G:hummingbird
+%OIH:hummingbird
+%C:N
+%SF:bird-gen
+%S:LITM/BRBI/JOPA
+%UID:000242
+%MD:1997/06/16
+
+%IH:bird, little
+%P:gagiyaz
+%G:little bird
+%OIH:bird, little
+%C:N
+%QCHECK:Any little bird?
+%SF:bird-gen
+%S:PEJO
+%UID:003115
+%POCKET:Y
+%MD:2000/09/28
+
+%IH:bird, little
+%P:dut'aiyaz
+%G:little bird
+%OIH:bird, little
+%C:N
+%SF:bird-gen
+%S:STJA/JOPA/EDFR/VESE/PEJO
+%UID:001818
+%MD:2000/09/28
+
+%IH:loon
+%P:dadzi
+%G:loon
+%OIH:loon
+%SF:bird-gen
+%SN:Gavia immer
+%C:N
+%S:LITM/JOPA/BRBI
+%UID:000020
+%MD:1997/06/12
+
+%IH:Mallard Duck
+%P:t'ugicho
+%G:Mallard Duck
+%OIH:Mallard Duck
+%C:N
+%SN:Anas platyrhynchos
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/MAGO/VESE/EDFR/JEKO
+%UID:000041
+%MD:1999/05/11
+
+%IH:owl
+%P:musdzoon
+%G:owl
+%OIH:owl
+%C:N
+%SF:bird-gen
+%S:LITM/BRBI/JOPA/MAGO
+%UID:000135
+%MD:1997/12/11
+
+%IH:Red-Necked Grebe
+%P:ts'olh
+%G:Red-necked Grebe
+%MN:A variety of duck locally known as the Helldiver.
+%OIH:Red-Necked Grebe/Helldiver/Grebe, Red-Necked
+%SN:Podiceps grisegena
+%SF:bird-gen
+%C:N
+%S:BRBI/JOPA
+%UID:000263
+%MD:2001/03/08
+
+%IH:Helldiver
+%P:ts'olh
+%G:Red-necked Grebe
+%MN:A variety of duck locally known as the Helldiver.
+%OIH:Red-Necked Grebe/Helldiver/Grebe, Red-Necked
+%SN:Podiceps grisegena
+%SF:bird-gen
+%C:N
+%S:BRBI/JOPA
+%UID:000263
+%MD:2001/03/08
+
+%IH:Grebe, Red-Necked
+%P:ts'olh
+%G:Red-necked Grebe
+%MN:A variety of duck locally known as the Helldiver.
+%OIH:Red-Necked Grebe/Helldiver/Grebe, Red-Necked
+%SN:Podiceps grisegena
+%SF:bird-gen
+%C:N
+%S:BRBI/JOPA
+%UID:000263
+%MD:2001/03/08
+
+%IH:Ruffed grouse
+%P:'utsut
+%G:Ruffed grouse
+%OIH:Ruffed grouse
+%C:N
+%SF:bird-gen
+%S:LITM
+%UID:000218
+%MD:1997/06/16
+
+%IH:Spruce Grouse
+%P:nat'oh
+%G:Spruce Grouse, Fool Hen
+%OIH:Spruce Grouse/Grouse, Spruce/Fool Hen
+%SF:bird-gen
+%SN:Dendragapus canadensis
+%C:N
+%S:MAGO/LITM
+%UID:000539
+%MD:1997/12/04
+
+%IH:Grouse, Spruce
+%P:nat'oh
+%G:Spruce Grouse, Fool Hen
+%OIH:Spruce Grouse/Grouse, Spruce/Fool Hen
+%SF:bird-gen
+%SN:Dendragapus canadensis
+%C:N
+%S:MAGO/LITM
+%UID:000539
+%MD:1997/12/04
+
+%IH:Fool Hen
+%P:nat'oh
+%G:Spruce Grouse, Fool Hen
+%OIH:Spruce Grouse/Grouse, Spruce/Fool Hen
+%SF:bird-gen
+%SN:Dendragapus canadensis
+%C:N
+%S:MAGO/LITM
+%UID:000539
+%MD:1997/12/04
+
+%IH:Steller's Jay
+%P:tehgwuzeh
+%G:Steller's Jay, commonly known locally as ``bluejay''.
+%OIH:Steller's Jay/jay, Steller's/Bluejay (Steller's Jay)
+%SF:bird-gen
+%SN:Cyanocitta stelleri
+%C:N
+%S:JOPA/BRBI
+%UID:000356
+%MD:1997/11/14
+
+%IH:jay, Steller's
+%P:tehgwuzeh
+%G:Steller's Jay, commonly known locally as ``bluejay''.
+%OIH:Steller's Jay/jay, Steller's/Bluejay (Steller's Jay)
+%SF:bird-gen
+%SN:Cyanocitta stelleri
+%C:N
+%S:JOPA/BRBI
+%UID:000356
+%MD:1997/11/14
+
+%IH:Bluejay (Steller's Jay)
+%P:tehgwuzeh
+%G:Steller's Jay, commonly known locally as ``bluejay''.
+%OIH:Steller's Jay/jay, Steller's/Bluejay (Steller's Jay)
+%SF:bird-gen
+%SN:Cyanocitta stelleri
+%C:N
+%S:JOPA/BRBI
+%UID:000356
+%MD:1997/11/14
+
+%IH:sandpiper
+%P:wedlew
+%G:sandpiper
+%OIH:sandpiper
+%C:N
+%SN:Eremophila alpestris et sim.
+%SF:bird-gen
+%S:LITM
+%UID:000237
+%MD:2002/07/19
+
+%IH:seagull
+%P:besk'i
+%G:seagull
+%OIH:seagull
+%C:N
+%SN:Larus species
+%SF:bird-gen
+%S:LITM
+%UID:000136
+%MD:2002/07/19
+
+%IH:swan
+%P:ts'incho
+%G:swan
+%OIH:swan
+%C:N
+%SF:bird-gen
+%S:LITM
+%UID:000222
+%MD:1997/06/16
+
+%IH:Tree Swallow
+%P:'uschas
+%G:Tree Swallow
+%OIH:Tree Swallow
+%SF:bird-gen
+%SN:Tachycineta bicolor
+%C:N
+%S:MAGO
+%UID:000535
+%MD:1997/11/22
+
+%IH:Whiskey Jack
+%P:gwuzeh
+%G:Whiskey Jack, Gray Jay, Canadian Jay
+%OIH:Whiskey Jack/Jay, Gray/Jay, Canadian
+%C:N
+%SN:Perisoreus canadensis
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/MAGO
+%UID:000148
+%MD:1997/11/22
+
+%IH:Jay, Gray
+%P:gwuzeh
+%G:Whiskey Jack, Gray Jay, Canadian Jay
+%OIH:Whiskey Jack/Jay, Gray/Jay, Canadian
+%C:N
+%SN:Perisoreus canadensis
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/MAGO
+%UID:000148
+%MD:1997/11/22
+
+%IH:Jay, Canadian
+%P:gwuzeh
+%G:Whiskey Jack, Gray Jay, Canadian Jay
+%OIH:Whiskey Jack/Jay, Gray/Jay, Canadian
+%C:N
+%SN:Perisoreus canadensis
+%SF:bird-gen
+%S:LITM/JOPA/BRBI/MAGO
+%UID:000148
+%MD:1997/11/22
+
+%IH:woodpecker
+%P:chundulkw'uz
+%G:woodpecker
+%OIH:woodpecker
+%C:N
+%SF:bird-gen
+%S:JOPA/BRBI/STJA
+%UID:000138
+%MD:1999/03/31
+
+%IH:nest
+%P:-t'o
+%G:nest
+%OIH:nest
+%C:N
+%Pind:'ut'o
+%P3s:but'o
+%Pref:dut'o
+%SF:bird-misc/bugs
+%S:STJA/PEJO/JOPA/BRBI/EDFR
+%ES:001353
+%UID:000226
+%MD:2001/03/07
+
+%IH:eye, a single
+%P:-nak'uz
+%G:a single eye
+%OIH:eye, a single
+%C:N
+%SF:body-ext
+%S:JOPA/EDFR
+%ES:000457
+%UID:003770
+%POCKET:Y
+%MD:2001/02/13
+
+%IH:ankle
+%P:-kechunoh
+%G:ankle
+%OIH:ankle
+%P1s:skechunoh
+%P2s:nkechunoh
+%C:N
+%S:MAGO/STJA
+%SF:body-ext
+%UID:000865
+%MD:1999/03/03
+
+%IH:antler
+%P:-de
+%G:antler, horn
+%OIH:antler/horn
+%C:N
+%SF:body-ext
+%P3s:bude
+%S:STJA
+%UID:002266
+%MD:1999/03/02
+
+%IH:horn
+%P:-de
+%G:antler, horn
+%OIH:antler/horn
+%C:N
+%SF:body-ext
+%P3s:bude
+%S:STJA
+%UID:002266
+%MD:1999/03/02
+
+%IH:velvet, antler
+%P:-de_zu_s
+%G:antler velvet
+%OIH:velvet, antler
+%C:N
+%SF:body-ext
+%P3s:bude_zu_s
+%S:STJA
+%UID:002267
+%MD:1999/03/02
+
+%IH:anus
+%P:-tsul
+%G:anus, asshole
+%OIH:anus/asshole
+%C:N
+%P1s:stsul
+%SF:body-ext
+%S:STJA
+%UID:002171
+%MD:1999/02/23
+
+%IH:asshole
+%P:-tsul
+%G:anus, asshole
+%OIH:anus/asshole
+%C:N
+%P1s:stsul
+%SF:body-ext
+%S:STJA
+%UID:002171
+%MD:1999/02/23
+
+%IH:arm
+%P:-gan
+%G:arm
+%OIH:arm
+%P1s:sgan
+%P2s:ngan
+%Pref:dugan
+%C:N
+%S:LITM/MAGO/STJA/JOPA/VESE/EDFR/JEKO
+%SF:body-ext
+%UID:000863
+%MD:1999/02/22
+
+%IH:armpit
+%P:-chak'ests'oh
+%G:armpit
+%OIH:armpit
+%P1s:schak'ests'oh
+%C:N
+%S:MAGO
+%UID:000859
+%SF:body-ext
+%MD:1997/12/11
+
+%IH:back (of body)
+%P:-t'ak
+%G:back (of body)
+%OIH:back (of body)
+%P1s:st'ak
+%P3s:but'ak
+%C:N
+%S:MAGO/EDFR/VESE/JEKO
+%SF:body-ext
+%UID:000899
+%MD:1997/12/11
+
+%IH:back of hand
+%P:-lat'ak
+%G:back of hand
+%OIH:back of hand
+%P1s:slat'ak
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000871
+%MD:1997/12/11
+
+%IH:beaver paws
+%P:tsake
+%G:beaver paws
+%OIH:beaver paws
+%C:N
+%SF:body-ext
+%S:LITM-EDFR
+%UID:000329
+%MD:1997/06/18
+
+%IH:beaver tail
+%P:tsache
+%G:beaver tail
+%OIH:beaver tail
+%C:N
+%SF:body-ext
+%S:LITM
+%UID:000207
+%MD:1997/06/16
+
+%IH:belly
+%P:-but
+%G:belly
+%OIH:belly
+%P1s:sbut
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000937
+%MD:1997/12/11
+
+%IH:breast
+%P:-ts'oo
+%G:breast
+%OIH:breast
+%P1s:sts'oo
+%C:N
+%S:MAGO
+%UID:000855
+%SF:body-ext
+%MD:1997/12/11
+
+%IH:bum
+%P:-tl'a
+%G:bum, buttocks
+%OIH:bum/buttocks
+%P1s:stl'a
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000936
+%MD:1997/12/11
+
+%IH:buttocks
+%P:-tl'a
+%G:bum, buttocks
+%OIH:bum/buttocks
+%P1s:stl'a
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000936
+%MD:1997/12/11
+
+%IH:calf of leg
+%P:-kechunch'ooz
+%G:calf of leg
+%OIH:calf of leg
+%C:N
+%SF:body-ext
+%S:JOPA/EDFR
+%UID:004458
+%POCKET:Y
+%MD:2001/04/20
+
+%IH:cheek
+%P:-nembus
+%G:cheek
+%OIH:cheek
+%P1s:snimbus
+%C:N
+%S:MAGO/JOPA/BRBI
+%SF:body-ext
+%UID:000889
+%MD:1997/12/11
+
+%IH:chest
+%P:-yoh
+%G:chest
+%OIH:chest
+%C:N
+%SF:body-ext
+%S:JOPA/EDFR
+%ES:000660
+%UID:003777
+%POCKET:Y
+%MD:2001/02/13
+
+%IH:chin
+%P:-yeda'
+%G:chin
+%OIH:chin
+%P1s:syeda'
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000882
+%MD:1997/12/11
+
+%IH:cranial fontanelle
+%P:-tsidakwhudutle
+%G:cranial fontanelle, baby's soft spot
+%OIH:cranial fontanelle/baby's soft spot
+%C:N
+%P3s:butsidakwhudutle
+%S:MAGO
+%SF:body-ext
+%UID:000898
+%MD:1997/12/11
+
+%IH:baby's soft spot
+%P:-tsidakwhudutle
+%G:cranial fontanelle, baby's soft spot
+%OIH:cranial fontanelle/baby's soft spot
+%C:N
+%P3s:butsidakwhudutle
+%S:MAGO
+%SF:body-ext
+%UID:000898
+%MD:1997/12/11
+
+%IH:ear
+%P:-dzo
+%G:ear
+%OIH:ear
+%MN:This refers to the ear considered as a whole, especially the exterior.
+    When the canal in particular is referred to, one uses {\qc -dzek}, q.v.
+%C:N
+%P1s:sdzo
+%S:MAGO
+%SF:body-ext
+%UID:000879
+%MD:1997/12/11
+
+%IH:earlobe
+%P:-dzobal
+%G:earlobe
+%OIH:earlobe
+%C:N
+%P1s:sdzobal
+%SF:body-ext
+%S:BRBI/MAGO
+%UID:000641
+%MD:1997/12/17
+
+%IH:elbow
+%P:-nints'uzti
+%G:elbow
+%OIH:elbow
+%P1s:snints'uzti
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000916
+%MD:1997/12/11
+
+%IH:eye
+%P:-na
+%G:eye
+%OIH:eye
+%P1s:sna
+%P3s:buna
+%C:N
+%S:MAGO/JOPA/EDFR
+%SF:body-ext
+%UID:000891
+%MD:1998/12/18
+
+%IH:eye socket
+%P:-nak'et
+%G:eye socket
+%OIH:eye socket
+%P1s:snak'et
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000892
+%MD:1997/12/11
+
+%IH:eyebrow
+%P:-nach'usdooz
+%G:eyebrow
+%OIH:eyebrow
+%P1s:snach'usdooz
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000896
+%MD:1997/12/11
+
+%IH:eyelash
+%P:-nalusgha
+%G:eyelash
+%OIH:eyelash
+%P1s:snalusgha
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000895
+%MD:1997/12/11
+
+%IH:eyelid
+%P:-nalus
+%G:eyelid
+%OIH:eyelid
+%P1s:snalus
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000894
+%MD:1997/12/11
+
+%IH:face
+%P:-nen
+%G:face
+%OIH:face
+%P1s:snen
+%P2s:nyunen
+%P3s:bunen
+%C:N
+%S:MAGO/PEJO/STJA/JOPA/VESE/EDFR
+%SF:body-ext
+%ES:000369
+%UID:000890
+%MD:2001/04/20
+
+%IH:feather
+%P:ts'uz
+%G:feather, down
+%OIH:feather/down
+%C:N
+%SF:body-ext
+%S:LITM/STJA/PEJO
+%UID:000271
+%MD:2000/10/16
+
+%IH:down
+%P:ts'uz
+%G:feather, down
+%OIH:feather/down
+%C:N
+%SF:body-ext
+%S:LITM/STJA/PEJO
+%UID:000271
+%MD:2000/10/16
+
+%IH:feathers
+%P:dut'aits'uz
+%G:feathers, down
+%OIH:feathers/down
+%C:N
+%SF:body-ext
+%S:STJA
+%UID:002647
+%MD:2001/02/27
+
+%IH:down
+%P:dut'aits'uz
+%G:feathers, down
+%OIH:feathers/down
+%C:N
+%SF:body-ext
+%S:STJA
+%UID:002647
+%MD:2001/02/27
+
+%IH:finger other than thumb or pinkie
+%P:-lasge
+%G:finger other than thumb or pinkie
+%OIH:finger other than thumb or pinkie
+%P1s:slasge
+%C:N
+%S:MAGO/STJA/JOPA/PEJO/EDFR
+%SF:body-ext
+%UID:000869
+%MD:2000/11/01
+
+%IH:fingernails
+%P:-lagui
+%G:fingernails, claws of forepaws
+%OIH:fingernails/claws of forepaws
+%P1s:slagui
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000875
+%MD:1997/12/11
+
+%IH:claws of forepaws
+%P:-lagui
+%G:fingernails, claws of forepaws
+%OIH:fingernails/claws of forepaws
+%P1s:slagui
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000875
+%MD:1997/12/11
+
+%IH:foot
+%P:-ke
+%G:foot
+%OIH:foot
+%C:N
+%P1s:ske
+%Pref:duke
+%S:MAGO/STJA/JOPA/VESE/EDFR/JEKO
+%UID:000851
+%SF:body-ext
+%MD:1999/05/11
+
+%IH:hair
+%P:-gha
+%G:hair
+%MN:This refers to hair in general and where no more specific term exists, as on the
+    arms and chest. It is not used to refer to the hair of the head, for which the
+    more specific term {\qc -tsigha} is always used.
+%OIH:hair
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000888
+%MD:1997/12/11
+
+%IH:hair of the head
+%P:-tsigha
+%G:hair of the head
+%OIH:hair of the head
+%P1s:stsigha
+%P2s:ntsigha
+%P3s:butsigha
+%C:N
+%S:MAGO/LITM/PEJO
+%SF:body-ext
+%UID:000887
+%MD:2000/10/20
+
+%IH:hand
+%P:-la
+%G:hand
+%OIH:hand
+%P1s:sla
+%P2s:nla
+%C:N
+%S:MAGO/STJA
+%SF:body-ext
+%POCKET:Y
+%UID:000866
+%MD:1999/02/17
+
+%IH:head
+%P:-tsi
+%G:head
+%OIH:head
+%Pref:dutsi
+%C:N
+%SF:body-ext
+%S:STJA
+%UID:002965
+%POCKET:Y
+%MD:1999/06/24
+
+%IH:heel
+%P:-kelatsul
+%G:heel
+%OIH:heel
+%P1s:skelatsul
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000917
+%MD:1997/12/11
+
+%IH:hip
+%P:-k'ui
+%G:hip
+%OIH:hip
+%P1s:sk'ui
+%C:N
+%S:MAGO/JOPA
+%SF:body-ext
+%UID:000923
+%MD:2001/03/15
+
+%IH:knee
+%P:-gwut
+%G:knee
+%OIH:knee
+%P1s:sgwut
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000933
+%MD:1997/12/11
+
+%IH:kneecap
+%P:-gwutlasi'ai
+%G:kneecap
+%OIH:kneecap
+%P1s:sgwutlasi'ai
+%R:has something to do with floating at tip of knee
+%C:N
+%S:MAGO
+%SF:body-ext
+%UID:000925
+%MD:1997/12/11
+
+%IH:knuckles at boundary between hand and fingers
+%P:-langwut
+%G:knuckles at boundary between hand and fingers
+%OIH:knuckles at boundary between hand and fingers
+%P1s:slangwut
+%SF:body-ext
+%C:N
+%S:JOPA/BRBI
+%UID:000967
+%MD:1997/12/17
+
+%IH:leg
+%P:-kechun
+%G:leg
+%OIH:leg
+%P1s:skechun
+%C:N
+%S:MAGO
+%UID:000852
+%SF:body-ext
+%MD:1997/12/11
+
diff --git a/gawk-5.0.1/test/xref.awk b/gawk-5.0.1/test/xref.awk
new file mode 100644
index 00000000000..d23a0c8d1d8
--- /dev/null
+++ b/gawk-5.0.1/test/xref.awk
@@ -0,0 +1,139 @@
+        # xref.awk - cross reference an awk program
+
+	# 12/2010: Modified for gawk test suite to use a variable
+	# for the sort command and to use `sort -k1' instead of `sort +1'
+
+        BEGIN {
+		if (sortcmd == "") sortcmd = "sort"		# "sort -k1"
+
+                # create array of keywords to be ignored by lexer
+                asplit("BEGIN:END:atan2:break:close:continue:cos:delete:" \
+                        "do:else:exit:exp:for:getline:gsub:if:in:index:int:"  \
+                        "length:log:match:next:print:printf:rand:return:sin:" \
+                        "split:sprintf:sqrt:srand:sub:substr:system:while",
+                        keywords,":")
+
+                # build the symbol-state table
+                split("00:00:00:00:00:00:00:00:00:00:" \
+                          "20:10:10:12:12:11:07:00:00:00:" \
+                          "08:08:08:08:08:33:08:00:00:00:" \
+                          "08:44:08:36:08:08:08:00:00:00:" \
+                          "08:44:45:42:42:41:08",machine,":")
+
+                # parse the input and store an intermediate representation
+                # of the cross-reference information
+
+                # set up the machine
+                state = 1
+
+                # run the machine
+                for (;;) {
+
+                        # get next symbol
+                        symb = lex()
+                        nextstate = substr(machine[state symb],1,1)
+                        act = substr(machine[state symb],2,1)
+
+                        # perform required action
+                        if ( act == "0" )
+                                ; # do nothing
+                        else if ( act == "1" ) {
+                                if ( ! inarray(tok,names) )
+                                        names[++nnames] = tok
+                                lines[tok,++xnames[tok]] = NR }
+                        else if ( act == "2" ) {
+                                if ( tok in local ) {
+                                        tok = tok "(" funcname ")"
+                                        if ( ! inarray(tok,names) )
+                                                names[++nnames] = tok
+                                        lines[tok,++xnames[tok]] = NR }
+                                else {
+                                        tok = tok "()"
+                                        if ( ! inarray(tok,names) )
+                                                names[++nnames] = tok
+                                        lines[tok,++xnames[tok]] = NR } }
+                        else if ( act == "3" ) {
+                                funcname = tok
+                                flines[tok] = NR }
+                        else if ( act == "4" )
+                                braces++
+                        else if ( act == "5" ) {
+                                braces--
+                                if ( braces == 0 ) {
+                                        for ( temp in local )
+                                                delete local[temp]
+                                        funcname = ""
+                                        nextstate = 1 } }
+                        else if ( act == "6" ) {
+                                local[tok] = 1 }
+                        else if ( act == "7" )
+                                break
+                        else if ( act == "8" ) {
+                                print "error: xref.awk: line " NR ": aborting" \
+                                        > "/dev/con"
+                                exit 1 }
+
+                        # finished with current token
+                        state = nextstate }
+
+                # finished parsing, now ready to print output
+                for ( i = 1; i <= nnames; i++ ) {
+                        printf "%d ", xnames[names[i]] | sortcmd
+                        if ( index(names[i],"(") == 0 )
+                                printf "%s(%d)", names[i], flines[names[i]] | sortcmd
+                        else
+                                printf "%s", names[i] | sortcmd
+                        for ( j = 1; j <= xnames[names[i]]; j++ )
+                                if ( lines[names[i],j] != lines[names[i],j-1] )
+                                        printf " %d", lines[names[i],j] | sortcmd
+                        printf "\n" | sortcmd }
+
+			close(sortcmd)
+                } # END OF PROGRAM
+
+        function asplit(str,arr,fs,  n) { n = split(str,temp_asplit,fs)
+                for ( i = 1; i <= n; i++ ) arr[temp_asplit[i]]++ }
+
+        function inarray(val,arr,  j, tmp) {
+            for ( j in arr )
+                tmp[arr[j]]++
+            return (val in tmp) }
+
+        function lex() {
+
+                for (;;) {
+
+                        if ( tok == "(eof)" ) return 7
+
+                        while ( length(line) == 0 )
+                                if ( getline line == 0 ) {
+                                        tok = "(eof)"; return 7 }
+
+                        sub(/^[ \t]+/,"",line)                                # remove white space,
+                        sub(/^"([^"]|\\")*"/,"",line)             # quoted strings,
+                        sub(/^\/([^\/]|\\\/)+\//,"",line)     # regular expressions,
+                        sub(/^#.*/,"",line)                                   # and comments
+
+                        if ( line ~ /^function/ ) {
+                                tok = "function"; line = substr(line,9); return 1 }
+                        else if ( line ~ /^{/ ) {
+                                tok = "{"; line = substr(line,2); return 2 }
+                        else if ( line ~ /^}/ ) {
+                                tok = "}"; line = substr(line,2); return 3 }
+			# change regexes to use posix character classes
+                        else if ( match(line,/^[[:alpha:]_][[:alnum:]]*\[/) ) {
+                                tok = substr(line,1,RLENGTH-1)
+                                line = substr(line,RLENGTH+1)
+                                return 5 }
+                        else if ( match(line,/^[[:alpha:]_][[:alnum:]]*\(/) ) {
+                                tok = substr(line,1,RLENGTH-1)
+                                line = substr(line,RLENGTH+1)
+                                if ( ! ( tok in keywords ) ) return 6 }
+                        else if ( match(line,/^[[:alpha:]_][[:alnum:]]*/) ) {
+                                tok = substr(line,1,RLENGTH)
+                                line = substr(line,RLENGTH+1)
+                                if ( ! ( tok in keywords ) ) return 4 }
+                        else {
+                                match(line,/^[^[:alpha:]_{}]/)
+                                tok = substr(line,1,RLENGTH)
+                                line = substr(line,RLENGTH+1) } } }
diff --git a/gawk-5.0.1/test/xref.original b/gawk-5.0.1/test/xref.original
new file mode 100644
index 00000000000..a94de211a8b
--- /dev/null
+++ b/gawk-5.0.1/test/xref.original
@@ -0,0 +1,313 @@
+XREF(AWK)                   Philip L. Bewig                   XREF(AWK)
+
+NAME
+
+        xref(awk) - produce a cross reference listing of an awk program
+
+SYNOPSIS
+
+        awk -f xref.awk [ file ... ]
+
+DESCRIPTION
+
+        XREF(AWK) takes as input a valid awk program and produces as out-
+        put a cross-reference listing of all variables and function calls
+        which appear in the program.
+
+        For ordinary variables and array variables, a line of the form
+
+                count var(func) lines ...
+
+        is produced, where "count" is the number of times the variable is
+        used, "var" is the name of the variable, "func" is the function
+        name to which the variable is local (a null "func" indicates that
+        the variable is global), and "lines" is the number of each line
+        where the variable appears.  Appearances of the variable in a
+        function's parameter list are ignored.  The number of lines shown
+        may differ from "count" if the variable appears more than once on
+        the same line.
+
+        For functions, a line of the form
+
+                count func(define) lines ...
+
+        is produced, where "count" is the number of times the function is
+        called, "func" is the name of the function, "define" is the lime
+        number where the function is defined, and "lines" is the number of
+        each line where the function is called.  As for variables, the
+        number of lines shown may differ from "count."
+
+        Output lines for variables and functions are intermixed and are
+        sorted by name.  Though terse, the output is informative, easy to
+        read, and amenable to further processing.
+
+EXAMPLE
+
+        The cross-reference listing produced by running xref.awk against
+        itself is shown below:
+
+                5 NR() 39 45 50 53 68
+                8 RLENGTH() 119 120 123 124 127 128 132 133
+                10 act() 31 34 36 40 51 54 56 63 65 67
+                1 arr(asplit) 90
+                2 arr(inarray) 93 94
+                1 asplit(89) 6
+                3 braces() 55 57 58
+                2 flines() 53 79
+                1 fs(asplit) 89
+                3 funcname() 42 52 61
+                16 i() 76 77 78 79 81 82 83 84 90
+                3 inarray(92) 37 43 48
+                6 j() 82 83 84
+                3 j(inarray) 93 94
+                3 keywords() 10 125 129
+                1 lex(97) 29
+                31 line() 103 104 107 108 109 110 112 113 114 115 116 117 118
+                        119 120 122 123 124 126 127 128 131 132 133
+                6 lines() 39 45 50 83 84
+                4 local() 41 59 60 64
+                3 machine() 17 30 31
+                2 n(asplit) 89 90
+                15 names() 37 38 43 44 48 49 77 78 79 81 82 83 84
+                3 nextstate() 30 62 73
+                4 nnames() 38 44 49 76
+                4 state() 23 30 31 73
+                1 str(asplit) 89
+                3 symb() 29 30 31
+                2 temp() 59 60
+                2 temp_asplit() 89 90
+                31 tok() 37 38 39 41 42 43 44 45 47 48 49 50 52 53 64 101 105
+                        113 115 117 119 123 125 127 129 132
+                1 val(inarray) 94
+                5 xnames() 39 45 50 77 82
+
+        For readability, some lines have been folded.
+
+SOURCE CODE
+
+        # xref.awk - cross reference an awk program
+
+        BEGIN {
+
+                # create array of keywords to be ignored by lexer
+                asplit("BEGIN:END:atan2:break:close:continue:cos:delete:" \
+                        "do:else:exit:exp:for:getline:gsub:if:in:index:int:"  \
+                        "length:log:match:next:print:printf:rand:return:sin:" \
+                        "split:sprintf:sqrt:srand:sub:substr:system:while",
+                        keywords,":")
+
+                # build the symbol-state table
+                split("00:00:00:00:00:00:00:00:00:00:" \
+                          "20:10:10:12:12:11:07:00:00:00:" \
+                          "08:08:08:08:08:33:08:00:00:00:" \
+                          "08:44:08:36:08:08:08:00:00:00:" \
+                          "08:44:45:42:42:41:08",machine,":")
+
+                # parse the input and store an intermediate representation
+                # of the cross-reference information
+
+                # set up the machine
+                state = 1
+
+                # run the machine
+                for (;;) {
+
+                        # get next symbol
+                        symb = lex()
+                        nextstate = substr(machine[state symb],1,1)
+                        act = substr(machine[state symb],2,1)
+
+                        # perform required action
+                        if ( act == "0" )
+                                ; # do nothing
+                        else if ( act == "1" ) {
+                                if ( ! inarray(tok,names) )
+                                        names[++nnames] = tok
+                                lines[tok,++xnames[tok]] = NR }
+                        else if ( act == "2" ) {
+                                if ( tok in local ) {
+                                        tok = tok "(" funcname ")"
+                                        if ( ! inarray(tok,names) )
+                                                names[++nnames] = tok
+                                        lines[tok,++xnames[tok]] = NR }
+                                else {
+                                        tok = tok "()"
+                                        if ( ! inarray(tok,names) )
+                                                names[++nnames] = tok
+                                        lines[tok,++xnames[tok]] = NR } }
+                        else if ( act == "3" ) {
+                                funcname = tok
+                                flines[tok] = NR }
+                        else if ( act == "4" )
+                                braces++
+                        else if ( act == "5" ) {
+                                braces--
+                                if ( braces == 0 ) {
+                                        for ( temp in local )
+                                                delete local[temp]
+                                        funcname = ""
+                                        nextstate = 1 } }
+                        else if ( act == "6" ) {
+                                local[tok] = 1 }
+                        else if ( act == "7" )
+                                break
+                        else if ( act == "8" ) {
+                                print "error: xref.awk: line " NR ": aborting" \
+                                        > "/dev/con"
+                                exit 1 }
+
+                        # finished with current token
+                        state = nextstate }
+
+                # finished parsing, now ready to print output
+                for ( i = 1; i <= nnames; i++ ) {
+                        printf "%d ", xnames[names[i]] |"sort +1"
+                        if ( index(names[i],"(") == 0 )
+                                printf "%s(%d)", names[i], flines[names[i]] |"sort +1"
+                        else
+                                printf "%s", names[i] |"sort +1"
+                        for ( j = 1; j <= xnames[names[i]]; j++ )
+                                if ( lines[names[i],j] != lines[names[i],j-1] )
+                                        printf " %d", lines[names[i],j] |"sort +1"
+                        printf "\n" |"sort +1" }
+
+                } # END OF PROGRAM
+
+        function asplit(str,arr,fs,  n) { n = split(str,temp_asplit,fs)
+                for ( i = 1; i <= n; i++ ) arr[temp_asplit[i]]++ }
+
+        function inarray(val,arr,  j) {
+            for ( j in arr )
+                if ( arr[j] == val ) return j
+            return "" }
+
+        function lex() {
+
+                for (;;) {
+
+                        if ( tok == "(eof)" ) return 7
+
+                        while ( length(line) == 0 )
+                                if ( getline line == 0 ) {
+                                        tok = "(eof)"; return 7 }
+
+                        sub(/^[ \t]+/,"",line)                                # remove white space,
+                        sub(/^"([^"]|\\")*"/,"",line)             # quoted strings,
+                        sub(/^\/([^\/]|\\\/)+\//,"",line)     # regular expressions,
+                        sub(/^#.*/,"",line)                                   # and comments
+
+                        if ( line ~ /^function/ ) {
+                                tok = "function"; line = substr(line,9); return 1 }
+                        else if ( line ~ /^{/ ) {
+                                tok = "{"; line = substr(line,2); return 2 }
+                        else if ( line ~ /^}/ ) {
+                                tok = "}"; line = substr(line,2); return 3 }
+                        else if ( match(line,/^[A-Za-z_][A-Za-z_0-9]*\[/) ) {
+                                tok = substr(line,1,RLENGTH-1)
+                                line = substr(line,RLENGTH+1)
+                                return 5 }
+                        else if ( match(line,/^[A-Za-z_][A-Za-z_0-9]*\(/) ) {
+                                tok = substr(line,1,RLENGTH-1)
+                                line = substr(line,RLENGTH+1)
+                                if ( ! ( tok in keywords ) ) return 6 }
+                        else if ( match(line,/^[A-Za-z_][A-Za-z_0-9]*/) ) {
+                                tok = substr(line,1,RLENGTH)
+                                line = substr(line,RLENGTH+1)
+                                if ( ! ( tok in keywords ) ) return 4 }
+                        else {
+                                match(line,/^[^A-Za-z_{}]/)
+                                tok = substr(line,1,RLENGTH)
+                                line = substr(line,RLENGTH+1) } } }
+
+TECHNICAL DISCUSSION
+
+        Broadly, XREF(AWK) parses an awk program using a symbol-state
+        table, in much the same way as a yacc-generated parser.  The
+        lexical analyzer recognizes seven distinct symbols:  the word
+        "function", the left brace, the right brace, identifiers used
+        as variables, identifiers used as arrays, identifiers used as
+        functions, and end of file.  The type of symbol is returned to
+        the parser as the value of the "lex" function, and the global
+        variable "tok" is set to the text of the current token.
+
+        The symbol-state table is stored in the "machine" array.  The
+        table can be represented as follows:
+
+                       symbol |     1       2  3   4     5     6     7
+                              |
+        state                 | "function"  {  }  var  array  func  eof
+        -- -- -- -- -- -- -- -+- -- -- -- -- -- -- -- -- -- -- -- -- --
+        1 any                 |     20     10  10  12    12    11   07
+        2 "function"          |     08     08  08  08    08    33   08
+        3 "function" name     |     08     44  08  36    08    08   08
+        4 "function" name "{" |     08     44  45  42    42    41   08
+
+        where the first digit is the state to be entered after process-
+        ing the current token and the second digit is an action to be
+        performed.  The actions are listed below:
+
+                1       found a function call
+                2       found a variable or array
+                3       found a function definition
+                4       found a left brace
+                5       found a right brace
+                6       found a local variable declaration
+                7       found end of file
+                8       found an error
+
+        Each of the first six actions causes some information about the
+        target program to be stored for later processing; the structures
+        used will be discussed below.  The seventh action causes the
+        parser to exit.  The eighth action causes errors to be reported
+        to standard error and the program to abort.
+
+        Before describing the intermediate data structures, we will
+        discuss some of the more interesting points in the action calls.
+        The "braces" variable keeps track of whether we are currently
+        within a functions; it is positive within a function and zero
+        without.  When the right brace which causes the value of "braces"
+        to go from one to zero is found, the value of "nextstate" is
+        changed from four (scanning a function) to one (any) and the
+        names of local variables are forgotten.  The "local" array is
+        accumulated from the variables found after the function name but
+        before the opening left brace of the function; action two care-
+        fully checks whether a variable is global or local before writing
+        to the intermediate data structure.  The variable "funcname" is
+        the name of the current function when within a function and null
+        without.
+
+        The following arrays store an intermediate representation of the
+        variable and function identifiers of the target program:
+
+                names[1..nnames] = list of all identifiers, both variable and
+                        function names; for variables, the name has the form
+                        var(func), but for functions, there are no parentheses
+
+                xnames[names[i]] = number of times names[i] is used
+
+                lines[names[i],1..xnames[names[i]]] = list of line numbers
+                        where names[i] is used
+
+                flines[names[i]] = line number where function names[i] is
+                        defined
+
+        These arrays are created as the parser reads the input; when the
+        parser is finished, the arrays are output in user-readable form.
+
+PORTABILITY
+
+        XREF(AWK) will work with any implementation of nawk.  The MKS
+        ToolKit implementation requires the large-model version of awk.
+
+HISTORY
+
+        Written by Phil Bewig on February 10, 1990.  Inspired by
+        Exercise 3-16 of the book "The Awk Programming Language" by
+        Alfred V. Aho, Brian W. Kernighan and Peter J. Weinberger
+        (Addison-Wesley:  1988).
+
+COPYRIGHT
+
+        This program is placed in the public domain.  However, the
+        author requests credit when distributed. 
+
diff --git a/gawk-5.0.1/test/zero2.awk b/gawk-5.0.1/test/zero2.awk
new file mode 100644
index 00000000000..8ecfb2f93b2
--- /dev/null
+++ b/gawk-5.0.1/test/zero2.awk
@@ -0,0 +1,5 @@
+BEGIN {
+	printf "%d\n", -.4
+	printf "%d\n", -0.0
+	printf "%d\n", -.9
+}
diff --git a/gawk-5.0.1/test/zero2.ok b/gawk-5.0.1/test/zero2.ok
new file mode 100644
index 00000000000..bb0b1cf658d
--- /dev/null
+++ b/gawk-5.0.1/test/zero2.ok
@@ -0,0 +1,3 @@
+0
+0
+0
diff --git a/gawk-5.0.1/test/zeroe0.awk b/gawk-5.0.1/test/zeroe0.awk
new file mode 100644
index 00000000000..5dc9c6bc811
--- /dev/null
+++ b/gawk-5.0.1/test/zeroe0.awk
@@ -0,0 +1,40 @@
+# From sbohdjal@matrox.com  Tue Dec 31 11:41:25 2002
+# Return-Path: <sbohdjal@matrox.com>
+# X-From_: sbohdjal@matrox.com Mon Dec 30 17:34:41 2002
+# Message-Id: <4.3.1.1.20021230101824.00fc4bd8@mailbox.matrox.com>
+# Date: Mon, 30 Dec 2002 10:33:10 -0500
+# To: bug-gawk@gnu.org
+# From: Serge Bohdjalian <sbohdjal@matrox.com>
+# Subject: GAWK 3.1.1 bug, DJGPP port
+# 
+# When I run the following AWK file...
+# 
+BEGIN {
+    $0 = "00E0";
+    print $0 ", " ($0 && 1) ", " ($0 != "");
+    $1 = "00E0";
+    print $1 ", " ($1 && 1) ", " ($1 != "");
+}
+# 
+# With the SimTel version of GAWK 3.1.1 for Windows (downloadable from 
+# ftp://ftp.cdrom.com/pub/simtelnet/gnu/djgpp/v2gnu/), I get the following 
+# output...
+# 
+# 00E0, 0, 1
+# 00E0, 1, 1
+# 
+# With the Cygwin version of GAWK 3.1.1 for Windows, I get...
+# 
+# 00E0, 1, 1
+# 00E0, 1, 1
+# 
+# As far as I know, if "$0" isn't blank, the value of "($0 && 1)" should be 
+# "1" (true). I get the same problem if I substitute "00E0" with "00E1" to 
+# "00E9". Other strings don't have have this problem (for example, "00EA"). 
+# The problem occurs whether I use file input or whether I manually assign 
+# "$0" (as above).
+# 
+# The problem is also discussed in a comp.lang.awk posting ("Bug in GAWK 
+# 3.1.1?", Dec. 27, 2002).
+# 
+# -Serge
diff --git a/gawk-5.0.1/test/zeroe0.ok b/gawk-5.0.1/test/zeroe0.ok
new file mode 100644
index 00000000000..cdf28fb6361
--- /dev/null
+++ b/gawk-5.0.1/test/zeroe0.ok
@@ -0,0 +1,2 @@
+00E0, 1, 1
+00E0, 1, 1
diff --git a/gawk-5.0.1/test/zeroflag.awk b/gawk-5.0.1/test/zeroflag.awk
new file mode 100644
index 00000000000..526ed0e89a7
--- /dev/null
+++ b/gawk-5.0.1/test/zeroflag.awk
@@ -0,0 +1 @@
+BEGIN { printf("%2.1d---%02.1d\n", 2, 2) }
diff --git a/gawk-5.0.1/test/zeroflag.ok b/gawk-5.0.1/test/zeroflag.ok
new file mode 100644
index 00000000000..937c0ede098
--- /dev/null
+++ b/gawk-5.0.1/test/zeroflag.ok
@@ -0,0 +1 @@
+ 2--- 2
diff --git a/gawk-5.0.1/version.c b/gawk-5.0.1/version.c
new file mode 100644
index 00000000000..f5cf6ac0c07
--- /dev/null
+++ b/gawk-5.0.1/version.c
@@ -0,0 +1,3 @@
+#include "config.h"
+
+const char *version_string = PACKAGE_STRING;
diff --git a/gawk-5.0.1/vms/ChangeLog b/gawk-5.0.1/vms/ChangeLog
new file mode 100644
index 00000000000..6df93c56d1e
--- /dev/null
+++ b/gawk-5.0.1/vms/ChangeLog
@@ -0,0 +1,9 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.1: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 5.0.0 and on.
+	* 5.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/vms/ChangeLog.0 b/gawk-5.0.1/vms/ChangeLog.0
new file mode 100644
index 00000000000..2f254234b00
--- /dev/null
+++ b/gawk-5.0.1/vms/ChangeLog.0
@@ -0,0 +1,699 @@
+Wed Jun 22 18:04:29 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (msg): Display gawk's version at start of test run.
+
+Mon Jun 20 20:38:35 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* vmstest.com (dfastress): New test.
+
+Mon Jun 20 20:24:34 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* descrip.mms: Remove compilation of hard-locale.c.
+	* vmsbuild.com: Likewise.
+
+Tue May 31 23:10:35 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* vmstest.com (regrange): New test.
+
+Thu May 26 22:14:06 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* vmstest.com (fpat2): New test.
+
+Wed May 25 01:31:50 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* gawk.hlp: Substantial updates, for first time in 8 years!
+
+	* vmstest.com (fpatnull): New test.
+
+Sun May 15 19:24:22 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (delargv): New test.
+
+Fri May 13 18:45:35 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (exit, next): Move from basic to gawk extensions.
+	(exit: do__exit): Define "gawk" in subroutine to make sure PIPE
+	uses the local definition instead of some other global one.
+
+	* vms_gawk.c (vms_gawk): Convert /OPTIMIZE into "-O" rather than
+	to "-W optimize".
+
+	* gawk.cld (gen_pot): Fix typo in name.
+
+Mon May  9 01:43:40 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (arraysort, delsub, exit, next, ofmta, sortu): New
+	tests.
+	(paramdup): Merge with other exit_code 1 tests.
+	{various}: change several instances of "nl:" to "_NL:" so that all
+	tests which reference the null device spell it the same way.
+
+Fri Apr 29 18:10:49 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* gawkmisc.vms (os_isatty): New routine.
+
+Sat Feb 26 18:35:01 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms_gawk.c, gawk.cld: Add support for new command qualifiers:
+	/extra_commands="text"  -e "awk program text"
+	/profile[=file]         --profile [awkprof.out]
+	/dump_variables[=file]  --dump_variables [awkvars.out]
+	/optimize, /traditional, /re_interval, /sandbox, /non_decimal_data
+	New but not documented since not useful for present VMS port:
+	/characters_as_bytes, /use_lc_numeric, /gen_pot
+	Revamp several existing qualifiers:
+	/strict                 was --compat, now synonym for /traditional
+	/lint=(warn,fatal,invalid,old)
+	/lint=warn            --lint (same as /lint without any value)
+	/lint=fatal           --lint fatal
+	/lint=old             --lint-old
+	/lint=(warn,fatal)    --lint fatal (warn ignored)
+	/lint=(warn,old)      --lint --lint-old
+	/lint=(fatal,old)     --lint fatal --lint-old
+	/usage, /version, /copyright    try harder to make awk program and
+	data file be optional since these just give messages and then quit.
+	(vms_usage): Substitute "GAWK", "DGAWK", or "PGAWK" as appropriate
+	for command name when issuing the VMS-specific usage message.
+	* vms.h (CLI$_NEGATED): Define macro (from <cilmsgdef.h>).
+
+	* vms_cli.c: Add copyright notice.  Remove unused P() macro.
+	(dcl$present, dcl$get_value, dcl$parse_command): Use lowercase
+	rather than upper for these system routine names.
+
+Fri Feb 18 19:24:30 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (beginfile1, dumpvars): New tests.
+	(lintwarn): Add exit_code 1.
+
+Wed Feb 16 21:09:50 2011  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* vmstest.com (lintwarn): New test.
+
+Sun Feb 13 18:48:29 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* gawkmisc.vms (files_are_same): Update to handle new arguments.
+
+	* vmstest.com (profile1, profile2, profile3): New tests.
+	(pgawk_tests, profile_tests): New test sets.
+	(iobug1): Clean up spurious extra output file.  Sigh.
+
+	* descrip.mms, vmsbuild.com: Include hard-locale.c in build.
+
+Sun Feb 13 20:23:57 2011  Eli Zaretskii  <eliz@gnu.org>
+
+	* gawkmisc.vms (files_are_same): Change arguments; call `stat' as
+	part of the body.
+
+Sat Feb 12 19:29:41 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* redirect.h (snprintf): Declare regardless of HAVE_SNPRINTF or
+	CRTL_VER_V732.
+
+Mon Feb  7 22:43:37 2011  Arnold Robbins  <arnold@skeeve.com>
+
+	* vmstest.com (negrange): Add new test.
+
+Sun Feb  6 18:54:20 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (psx96sub, whiny): Remove obsolete tests.
+	(aadelete1, aadelete2, aarray1, aasort, assorti, fpat1,
+	indirectcall, patsplit, posix2000sub, range1, sortfor, splitarg4,
+	switch2): Add new tests.
+
+Tue Jan 18 17:51:07 2011  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms_args.c (vms_arg_fixup): If AWK_LIBRARY lacks a value, define
+	it as "SYS$LIBRARY:" so that the default value of AWKPATH ends
+	with a valid directory.  Needed so that gawk -f no-such-file
+	will report "file not found" or "no such file or directory"
+	instead of "file specification syntax error".
+
+	* vms-conf.h: Sync with configh.in; define HAVE_STRCOLL as 1.
+
+	* vmstest.com (fnarray, funsmnam, paramres, parseme): Change these
+	tests to expect EXIT_CODE 1 rather than EXIT_CODE 2.
+
+Sat Nov  6 16:33:01 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* redirect.h, vms.h: Drop use of P() macro in function prototypes.
+	* vms_misc.c, vms_popen.c: Likewise.
+
+Wed Aug 11 17:47:57 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* redirect.h (vsnprintf): Move #define into !HAVE_SNPRINTF block.
+
+Tue Aug 10 12:57:40 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* redirect.h: Declare vsnprintf and define it to use missing_d one.
+	* vms-conf.h: Add #undef template for HAVE_SETENV.
+
+Mon Aug  9 10:58:03 2010  Arnold Robbins  <arnold@skeeve.com>
+
+	* redirect.h: Add decls of setenv, unsetenv, and snprintf to
+	avoid informational warnings from the compiler about undecleared
+	functions.
+
+Thu Aug  5 15:01:55 2010  Arnold Robbins  <arnold@skeeve.com>
+
+	* vms-build.com: Correctly build dgawk.
+	* redirect.h (setenv, unsetenv): Define as macros to get the
+	replacement versions in missing_d/.
+
+Mon Mar  8 15:17:41 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (space): handle alternate error reason.
+	(fmtspcl): suppress this test.
+
+Wed Mar  3 16:29:10 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms-conf.h: sync with configh.in; reformat a couple of comments.
+	(PACKAGE_URL): add #undef as placeholder.
+
+Wed Jan  6 19:05:05 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms_fwrite.c (tty_fwrite): Check which_gawk, and stick to
+	ordinary fwrite() when it's exe_debugging because dgawk uses
+	other stdio calls besides fwrite for terminal output, and that
+	wouldn't interleave sanely with tty_fwrite()'s terminal output.
+
+Wed Jan  6 19:05:05 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* awk.h (exe_mode): Define new enum: exe_gawking for regular gawk,
+	exe_debugging for dgawk, and exe_profiling for pgawk.
+	(which_gawk): Declare new variable.
+	* eval.c (which_gawk): Define it.
+
+Thu May  6 20:55:14 2010  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.8: Release tar file made.
+
+Tue Apr 20 14:54:03 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms-conf.h (HAVE_LIBSIGSEGV): Add placeholder; leave undefined.
+	* vmstest.com (manyfiles): keep going even if gawk fails.
+
+Thu Apr  1 14:04:17 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (uninit5): fix typo in test name.
+
+Mon Mar 29 16:26:39 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms-conf.h (HAVE_USLEEP): define.
+	* vmstest.com (fcall_exit, fcall_exit2, forref, uninit5): new tests.
+	* descrip.mms (builtin.obj): add floatmagic.h dependency.
+
+Mon Mar  8 15:17:41 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (space): handle alternate error reason.
+	(fmtspcl): suppress this test.
+
+Wed Mar  3 16:29:10 2010  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms-conf.h: sync with configh.in; reformat a couple of comments.
+	(PACKAGE_URL): add #undef as placeholder.
+
+Tue Jul 21 22:28:56 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.7: Release tar file made.
+
+Wed Jul  8 18:59:22 2009  Pat Rankin  <rankin@pactechdata.com>
+
+	* vmstest.com (charset_tests): New list; move various tests from
+	basic and gawk_ext lists.
+	(fmtspcl): Move to machine_tests list.
+	(lc_num1, mbfw1, mbprintf1, rsstart3): Skip these failing tests.
+	(double1, double2): Likewise.
+
+Mon Jun 22 00:51:17 2009  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms_misc.c (vms_open): Explicitly specify "rat=cr" to force
+	carriage-return-carraige-control record attribute along with
+	stmlf foramt.  gawk failed on an internal redirection attempt
+	(``print anything > file'') if an earlier version of the output
+	file existed with conflicting attributes and the program was
+	built using DECC$SHR run-time library rather than VAXCRTL.
+
+	* vmstest.com: Add over 70 new tests.  Overhaul how lists of
+	tests are specified and executed.  Make many similar tests run
+	with shared commands instead of maintaining separate code for
+	each one.  Put output for 'test' into "_'test'.tmp" instead of
+	"tmp." so that it's easier to investigate if/when multiple test
+	failures occur in the same run.
+	(vms_io2): New test to check the ``print anything > file'' fix.
+
+Wed Mar 18 18:16:50 2009	Pat Rankin	<rankin@pactechdata.com>
+
+	* vms-conf.h (EXIT_SUCCESS, EXIT_FAILURE): Define #if !HAVE_STDLIB_H.
+	(EXIT_FATAL): Define.
+
+Mon Mar 16 19:09:27 2009	Pat Rankin	<rankin@pactechdata.com>
+
+	* vms-conf.h: Synchronize with configh.in,
+	(HAVE_ATEXIT): Define.
+
+Tue Jan 27 21:49:53 2009  Arnold D. Robbins  <arnold@skeeve.com>
+
+	Per Pat Rankin based on changes to awk.h and change in main code
+	to use EXIT_SUCCESS / EXIT_FAILURE from Toni Schilling
+	<Schilling@equicon.de>.
+
+	* redirect.h (exit): Remove definition.
+	* vms_misc.c (vms_exit): Remove code.
+
+Mon Oct 22 08:49:05 2007  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.6: Release tar file made.
+
+Wed May 16 19:54:00 2007        Pat Rankin      <rankin@pactechdata.com>
+
+	* vms-conf.h: re-sync with configh.in.
+
+Sun Apr 29 18:09:17 2007        Pat Rankin      <rankin@pactechdata.com>
+
+	* redirect.h: declare snprintf() if CRTL_VER_V732 is defined;
+	redefining __CRTL_VER in config.h causes <stdio.h> to suppress it.
+
+	* vmstest.com (fnarray): exit code has changed to 2.
+	(pid): target values now passed by command line rather than file.
+
+Fri Apr 20 16:48:30 2007        Pat Rankin      <rankin@pactechdata.com>
+
+	* vms-conf.h: #define HAVE_SNPRINTF for V7.3-2 and later CRTL.
+	* redirect.h: #define snprintf to gawk_snprintf if we're using
+	missing_d/snprintf.c; avoids diagnostic about its declaration.
+
+Thu Apr 12 18:59:33 2007        Pat Rankin      <rankin@pactechdata.com>
+
+	* vms-conf.h: Leave HAVE_MKSTEMP undefined; we want tmpfile().
+
+Thu Mar 29 19:30:20 2007        Pat Rankin      <rankin@pactechdata.com>
+
+	* vms-conf.h: reconcile with configh.in.
+
+	* descrip.mms: compile floatcomp.c; add pgawk target and build
+	pgawk.exe for `make all'.
+	* vmsbuild.com: compile floatcomp.c; always build pgawk.exe in
+	addition to gawk.exe.
+
+Wed Jul 27 21:31:14 2005        Pat Rankin      <rankin@pactechdata.com>
+
+	* vmstest.com: Format test group feedback differently (append "...")
+	to distinguish it from individual test feedback.
+	(manyfiles): Determine the number of files to use dynamically
+	instead of using hardcoded 300 in case user's open file quota
+	is generous enough to support more than that.
+	(longsub): Add error trap so that failure when gawk is built with
+	VAXCRTL doesn't cause testing to terminate.
+	(vms_io1): Invoke with normal Unix-style command line syntax.
+	(vms_cmd): New test; split off DCL-style command line from vms_io1.
+
+Tue Jul 26 21:46:16 2005  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.5: Release tar file made.
+
+Mon May 23 20:54:31 2005        Pat Rankin      <rankin@pactechdata.com>
+
+	* vms_gawk.c [gawk_cmd, #if __ia64__]: Switch from globalvalue
+	to strict_refdef and then take gawk_cmd's address during use.
+
+	* vmstest.com (concat1, longsub, arrayprm2, arrayprm3, arryref2,
+	arryref3, arryref4, arryref5, aryprm1, aryprm2, aryprm3,
+	aryprm4, aryprm5, aryprm6, aryprm7, aryprm8, concat2, concat3,
+	delarpm2, delfunc, exitval2, fmttest, fnarray2, fnmisc, fordel,
+	getline3, gsubasgn, gsubtest, gsubtst2, gsubtst4, gsubtst5,
+	hex, inputred, iobug1, manglprm, nested, nfneg, noloop1,
+	noloop2, nulrsend, prec, prtoeval, rstest1, rstest2, rstest3,
+	rstest4, rstest5, scalar, sortempty, splitarr, strcat1,
+	subsepnm, synerr1, uninit2, uninit3, uninit4, uninitialized,
+	unterm, wjposer1, zeroe0): New tests.
+
+Wed May 18 21:22:09 2005        Pat Rankin      <rankin@pactechdata.com>
+
+	* vms_gawk.c [#if __ia64__]: Use #pragma extern_model globalvalue
+	for the declaration of gawk_cmd.
+
+Mon May 9 21:17:33 2005         Pat Rankin      <rankin@pactechdata.com>
+
+	* vms-conf.h [#if DECC]: Use #pragma to suppress "new feature in C99"
+	diagnostic for structure field designator style initialization in
+	regexec.c.
+
+Thu May  5 21:17:48 2005   Anders Wallin <anders_s_wallin@yahoo.se>
+
+	* vms_gawk.c [__ia64__]: Change to lower case, then Itanium
+	VMS is happy.
+
+Sun May  1 08:20:00 2005   Pat Rankin    <rankin@pactechdata.com>
+
+	* vms_gawk.c [gawk_cmd]: Declare as ordinary data symbol rather
+	than as a fake routine for Itanium.  (Can't do that for other
+	configurations without getting tangled up in compiler-specific
+	details like `#pragma extern_model' and VAX C's `globalref'.)
+
+Fri Mar  4 20:46:20 2005   Pat Rankin    <rankin@pactechdata.com>
+
+	* vms-conf.h: Define VAXCRTL when appropriate; used in builtin.c.
+
+Sat Feb 19 20:13:28 2005   Pat Rankin    <rankin@pactechdata.com>
+
+	* vms-conf.h [RE_TOKEN_INIT_BUG]: Define for regcomp.c.
+
+Wed Feb 16 20:45:21 2005   Pat Rankin    <rankin@pactechdata.com>
+
+	* vms-conf.h [NO_MBSUPPORT]: Define when compiling with VAX C.
+	[inline]: Define as empty when compiling with VAX C.
+
+Thu Jan 20 19:09:52 2005   Pat Rankin  <rankin@pactechdata.com>
+
+	* vms-conf.h: Synchronize with configh.in.
+
+Mon Aug  2 12:18:15 2004   Arnold D. Robbins    <arnold@skeeve.com>
+
+	* Release 3.1.4: Release tar file made.
+
+Mon Jun 14 18:40:22 2004  Pat Rankin  <rankin@pactechdata.com>
+
+	* descrip.mms (dfa.c, dfa.h): reinstate these.
+	(gettext.h, mbsupport.h): add these.
+	(patchlev.h): remove this.
+
+	* vmstest.com (longwrds): customize it.
+	(getline, getline2): replace getline with getline2.
+
+Mon Jul  7 11:01:43 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.3: Release tar file made.
+
+Mon Jun  9 22:15:40 2003  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms-conf.h: Synchronize with current configh.in.
+	ALLOW_SWITCH: Define this to enable new `switch' feature.
+
+Wed Mar 19 14:10:31 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	This time for sure.
+		-- Bullwinkle
+
+	* Release 3.1.2: Release tar file made.
+
+Thu Feb 27 17:54:33 2003  Pat Rankin  <rankin@pactechdata.com>
+
+	* descrip.mms: Revert regex compilation to single file.
+	vmsbuild.com: Likewise.
+
+Thu Feb 20 18:06:54 2003  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms_gawk.c (vms_gawk): Don't check for `RUNUSED' status because
+	it gets a false match when gawk is invoked via fork+exec.
+
+	* gawk.hlp: Limited updates to the release notes section.
+
+Tue Feb  4 14:28:06 2003  Arnold D. Robbins  <arnold@skeeve.com>
+
+	All relevant files: Copyright year updated to 2003.
+
+Mon Feb 3 20:37:09 2003  Pat Rankin  <rankin@pactechdata.com>
+
+	* vms-conf.h (ssize_t): Define as int.
+	(TIME_T_UNSIGNED): New macro; used in strftime.
+	* vms_cli.c (Cli_Parse_Command): Increase command buffer size
+	from 2.5Kb to 8Kb.
+
+	From Steve Pitcher:
+	* vms_gawk.c (vms_gawk): Don't report "missing required element"
+	for INSFPRM status unless invoked via a native DCL verb.
+
+	From Jouk Jansen:
+	* vms-conf.h (CRTL_VER_V731): New macro.
+	* vms_misc.c (getpgrp): Use it.
+
+Mon Dec 23 16:53:42 2002  Pat Rankin  <rankin@pactechdata.com>
+
+	* descrip.mms (AWKOBJ1, AWKOBJ2): Split AWKOBJS into pieces to
+	avoid line length overflow when creating gawk.opt.
+	(regcomp.obj, regexec.obj, regex_internal.obj): New targets.
+	* vmsbuild.com: Likewise.
+
+Thu Nov 21 19:45:08 2002  Pat Rankin  <rankin@pactechdata.com>
+
+	* descrip.mms: Update to reflect regex changes; eliminate dfa.
+
+	* vmstest.com (exit_code): Hack to add "EXIT CODE n" record to
+	output for tests that trigger gawk failure.
+
+Wed May  1 16:41:32 2002  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.1: Release tar file made.
+
+Wed Apr 17 15:57:30 2002  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vmstest.com (forsimp, concat1, longsub): New Tests.
+	(strftime): Revamp test to avoid use of defunct %v extension.
+
+Sat Dec 22 19:18:31 2001  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* redirect.h (tzset):  Declare.
+
+Sun Jun  3 13:04:44 2001  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.1.0: Release tar file made.  And there was
+	rejoicing.
+
+Thu Apr 12 18:29:50 2001  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vms_misc.c (open): Add handling for /dev/null and /dev/tty.
+	(vms_devopen): Remove handling for /dev/null and /dev/tty.
+
+	* vms_misc.c (VMS_stat, VMS_fstat): New functions to work
+	around old VAXCRTL bugs.
+	* redirect.h (fstat): Define as VMS_fstat for VAX C or GNU C.
+
+	* vms-conf.h (HAVE_UNISTD_H): Avoid <unistd.h> for GNU C.
+
+	* descrip.mms: Synchronize with 3.1.0 sources.
+
+	* vmstest.com: Add many new tests.
+	(fixup_LRL): New subroutine.
+
+Thu Apr  5 20:31:22 2001  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vms-conf.h: synchronize with current configh.in.
+	[NO_ALLOCA]: define instead of C_ALLOCA.
+	* redirect.h (strcoll): substitute strcmp for VAXCRTL config.
+	(struct timeval): define.
+	(gettimeofday): substitute vms_gettimeofday; declare.
+
+	* vms_misc.c (vms_gettimeofday): new function.
+	* vms_fwrite.c [#if NO_ALLOCA]: fix fake alloca's use of free().
+
+	* vmsbuild.com: synchronize with current sources.
+
+Sun Jan 28 15:50:02 2001  Eli Zaretskii  <eliz@is.elta.co.il>
+
+	* gawkmisc.vms (os_restore_mode): New function.
+
+Sun Dec  3 16:53:37 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.vms (os_setbinmode): new function.
+
+Tue Nov  7 14:09:14 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* gawkmisc.vms (os_is_setuid): new function.
+
+Wed Jul 30 19:53:52 1997  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Close-on-exec changes:
+	gawkmisc.vms: (os_close_on_exec, os_isdir): new functions.
+
+Mon Aug  7 15:23:00 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.6: Release tar file made.
+
+Sat Jul 15 20:52:09 2000  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vmstest.com (printf1, fusmnam, fnamedat, numindex,
+	subslash, opasnslf, opasnidx, arynocls, getlnbuf,
+	arysubnm, fnparydl): New basic tests.
+	(igncdym): New gawk.extensions test.
+	(nondec): Old gawk.extensions test commented out.
+
+Sun Jun 25 15:08:19 2000  Arnold D. Robbins  <arnold@skeeve.com>
+
+	* Release 3.0.5: Release tar file made.
+
+Wed Jun 30 16:14:36 1999  Arnold D. Robbins  <arnold@gnu.org>
+
+	* Release 3.0.4: Release tar file made.  This time for sure.
+
+Fri May  7 20:29:04 1999  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vms-conf.h (__CRTL_VER): Add same override as __VMS_VER.
+
+Wed May  5 19:10:15 1999  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vmstest.com (nasty, zeroflag, getnr2tm, getnr2tb): New tests.
+
+Wed Nov 25 17:24:26 1998  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vmstest.com (vms_tests): New general target.
+	(vms_io1): New specific test.
+
+Thu May 15 12:49:08 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.3: Release tar file made.
+
+Mon May 12 18:39:30 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vmstest.com (delarprm, prdupval): new `basic' tests.
+	(nondec): new `gawk.extensions' test (commented out for now).
+	(reint): move from `basic' to `gawk.extensions'.
+
+Mon May  5 21:40:07 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vmstest.com (clobber): new `basic' test.
+	(pid): new test, replacing `specfile'.
+	(pipeio2): new for `unix-tests'; can't execute this one under VMS.
+
+Mon May  5 21:23:52 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vms_args.c (vms_arg_fixup): for the 2>&1 case, don't set the
+	output filename to "sys$error" because that results in an extra
+	empty file being created.
+
+	* vms_misc.c (vms_open):  explicitly specify stream_lf format
+	when creating files rather than letting DECC$SHR make a new file
+	inherit its record format from any earlier version of that file.
+
+	Suggested by Pete Cascio <pete@rmi.net>:
+
+	* vms_misc.c (vms_open): use full record sharing options when
+	reading any record-oriented file, regardless of its organization.
+
+Mon Apr 21 19:22:12 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vmstest.com (funstack): new `basic' test.
+	(reint): add missing entry to `basic'.
+	(pipeio1, specfile, strftlng): move from `basic' to `unix-tests'.
+	(childin): skip due to known failure.
+	(specfile): skip due to potentially confusing feedback.
+
+Thu Apr 24 23:18:04 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* vms_popen.c, vms_misc.c, vms_gawk.c, vms_fwrite.c,
+	vms_args.c: moved to generic GPL statement at top.
+
+Fri Apr 18 07:55:47 1997  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* BETA Release 3.0.34: Release tar file made.
+
+Wed Apr  2 18:17:30 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* descrip.mms, vmsbuild.com (PATCHLVL):  update to 3.
+
+	* vmstest.com (nlfldsep, splitvar, intest, nfldstr, nors,
+	fnarydel, noparms, pipeio1):  new tests.
+
+Wed Jan 15 15:21:01 1997  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* redirect.h (stat, fstat):  do not declare these functions;
+	rely on <stat.h> to do so.  There are too many DEC C version
+	variants to handle otherwise.
+
+	From Martin Zinser <zinser@axp602.gsi.de>:
+
+	* descrip.mms (gawk.dvi):  update to build in [.doc] directory
+	using texindex.c retained from an earlier gawk 2.x distribution.
+	(texindex.exe):  don't assume VAX C.
+
+Wed Dec 25 11:25:22 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.2: Release tar file made.
+
+Mon Dec 23 20:51:27 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vms_misc.c (vms_bcopy):  `bcopy' is defined as this in redirect.h.
+
+Thu Dec 19 17:49:31 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* redirect.h (strcasecmp, strncasecmp, tzset, tzname,
+	daylight, timezone, altzone, bcopy, popen, pclose, unlink):
+	New macros to avoid conflict with VMS V7.x DECC$SHR symbols.
+	(close, dup, dup2, read):  Declare with full prototypes.
+	(fstat, stat):  Ditto, and guard against conflicting DEC C
+	declarations (which might have trailing elipsis).
+	* vms_misc.c (tzset, tzname, daylight, timezone, altzone):
+	Suppress these if compiled with VMS_V7 defined [not supported].
+
+Mon Dec 16 14:32:08 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vms_popen (popen):  Delete unprototyped declaration of strcmp()
+	to avoid conflict with a strcmp macro in DEC C V5.0 header files.
+
+Tue Dec 10 23:09:26 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* Release 3.0.1: Release tar file made.
+
+Fri Dec  6 20:55:57 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* redirect.h, vms-conf.h:  Refine Sep 20th change:  include
+	<stdlib.h> and <string.h> in redirect.h rather than vms-conf.h
+	so that it occurs for VMS POSIX as well as for normal VMS.
+
+Wed Nov 20 15:47:02 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* descrip.mms (LIBOBJS): Rename from GNUOBJS; add random.obj.
+	(LIBSRC): Rename from GNUSRC; add random.c.
+	(AWKSRC): Add random.h.
+	(random.obj, builtin.obj): Depend upon random.h.
+	* vmsbuild.com: compile random.c, link random.obj.
+
+	* vmstest.com (childin): Split message about expected failure
+	in order to avoid consecutive tick marks in the quoted string.
+
+Wed Nov 13 15:32:58 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vmstest.com: New file to execute test suite.
+
+Fri Nov  8 18:29:42 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	Revise makefiles so that no editing should be needed.
+
+	* descrip.mms: Use DEC C as the default compiler, since
+	the same compile and link options for it can be used as-is
+	on both VAX and Alpha.
+	(GNUC, VAXC): New `make' macros for specifying an alternate
+	compiler on the MMS or MMK command line.
+	(PATCHLVL): Update to 1.
+	* vmsbuild.com: Make the equivalent changes.
+
+Mon Oct 28 17:02:39 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vms.h (U_Long, U_Short): Replace u_long and u_short typedefs.
+	* vms_*.c: Use them.
+
+	* vms.h, vms_*.c: Change SYS$ and LIB$ routines to lower case
+	equivalents; fully prototype sys$ and lib$ routines rather than
+	just declare them.
+
+Fri Sep 20 17:33:05 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vms-conf.h: directly include <stdlib.h> and <string.h>.
+	* vms-conf.h (strftime): delete this macro.
+	* redirect.h (strftime): define it here instead.
+
+Fri May 17 09:08:16 1996  Arnold Robbins  <arnold@skeeve.atl.ga.us>
+
+	* gawkmisc.vms (envsep): Now initialized to ',' instead of ':',
+	per email from Pat Rankin.
+
+Thu Jan 11 15:20:14 1996  Pat Rankin  <rankin@eql.caltech.edu>
+
+	* vms-conf.h [#if __DECC]: Changes to support V5.x of DEC C.
+	(_DECC_V4SOURCE, __SOCKET_TYPEDEFS):  Define these to avoid
+	duplicate u_long and u_short typedefs.
+	(__VMS_VER): If value indicates VMS V6.2 or later, redefine it to
+	indicate V6.1 in order to avoid conflicting prototype for getopt.
+
+Wed Jan 10 22:58:55 1996  Arnold D. Robbins  <arnold@skeeve.atl.ga.us>
+
+	* ChangeLog created.
diff --git a/gawk-5.0.1/vms/ChangeLog.1 b/gawk-5.0.1/vms/ChangeLog.1
new file mode 100644
index 00000000000..43e1af9fbfb
--- /dev/null
+++ b/gawk-5.0.1/vms/ChangeLog.1
@@ -0,0 +1,508 @@
+2019-02-13         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: Fix for symtab6 error handlng.
+
+2019-01-09         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* generate_config_h_vms_gawk.com: remove unused
+	definition for __attribute(a)
+
+2018-08-07         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: Fixes for back89, gsubtst5, and fsbs
+
+2018-08-03         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* generate_config_vms_h_gawk.com:
+	Create a stub stdint.h when OpenVMS does not provide one.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2018-01-22         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: New tests: isarrayunset, nlstringtest
+	Fix lintold test not to stop test run on failure.
+
+2018-01-08         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: New tests: numstr1, setrec0, setrec1.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2017-08-25         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: Improve negative tests, and fix some tests.
+	New tests: aryunasgn, concat5, fpat5, fpat6, fwtest5, fwtest6,
+	fwtest7, fwtest8, mbprintf5, memleak, sourcesplit
+
+2017-08-31         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: Fix profile3, profile6, profile7,
+	rsgetline, rstest6 tests.
+
+2017-08-25         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: Fix argarray test.
+
+2016-12-22         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmsbuild.com, descrip.mms:
+	Update for new [.support] directory.
+
+2016-11-24         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawk_verb.com: correct location for gawk executable.
+
+2016-10-24         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* backup_gawk_src.com: Do not backup entire git repository.
+	* pcsi_product_gawk.com: Create a ZIP archive of PCSI kit.
+
+2016-10-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* General: Remove trailing whitespace from all relevant files.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2016-08-08         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: New test (basic) ofmtstrnum
+	               New test (extra) ignrcas3 - skipped.
+	               Updated test (shlib) filefuncs, backsmalls1
+
+2016-06-16         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: New tests (basic) hex2, mixed1, subback
+
+2016-05-30         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: New tests (basic) fsnul1
+	               New tests (ext) fpat4, symtab10
+	* vmstest.com: Outputs test_output.xml in junit format.
+
+2016-05-29         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* stage_gawk_install.com: Fix directory path
+	* vmstest.com: new tests
+	(basic) arrayind1, rscompat, sigpipe1
+	(ext) close1way2, clos1way3, clos1way4, clos1way5
+
+2016-04-10         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* generate_config_vms_h_gawk.com: define __attribute() as macro.
+
+2016-02-02         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* descrip.mms: Add gawk_debug target.
+	* vms_sort.com: Implement sort function for tests.
+	* vmstest.com: updates
+	  Reorganize test lists to make them easier to read and
+	  update.
+	(vms_debug): New command to switch to debug_gawk
+
+	New/fixed tests:
+	(basic): badassign1,dfamb1,exit2,nfloop,badbuild,
+		callparam,exitval2,exitval3,inpref,paramasfunc1,
+		paramasfunc2,regexpbrack,sortglos,rebrackloc
+		aryprm9,nulinsrc,rstest4,rstest5
+	(ext): id,profile4,profile5,crlf,dbugeval,fpat4,genpot,
+		indirectbuiltin,printfbad4,printhuge,profile0,
+		profile6,profile7,regnul1,regnul2,rsgetline,
+		rsglstdin,mbstr2,profile8,watchpoint1,rsstart3
+	(locale): backbigs1,backsmalls1,backsmalls2,mbprintf4
+	(shlib): inplace2,testext,lc_num1,mbprintf1,
+		mbprintf2,mbprintf3,mbprintf4,mbfw1,ordchr2
+	* vms.h, vms_args.c, vms_cli.c, vms_fwrite.c,
+	  vms_misc.c, vms_popen.c:
+	    Use VMS provided descriptor definitions.
+
+2016-01-27         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* generate_config_vms_h_gawk.com: Add missing define
+	  for macro TIME_T_UNSIGNED.  Remove supression of
+	  compiler message.
+
+2016-01-24         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: updates
+	(ofmta): Skip on VAX as VAX floating runtime is different.
+	(beginfile1): Handle NFS ODS-2 case encoded filenames.
+	(dumpvars): Fix test compare.
+	(gensub2): Capture stderr output for compare.
+	(define_gawklocale): set LC_ALL "utf8-20".
+
+2016-01-24         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* generate_config_vms_h_gawk.com: Supress compiler message
+	  about comparing an unsigned value to a negative number
+	  in missing_d/strftime.c.
+	* descrip.mms: Temporary comment out the use of bison or yacc
+	  until current ports are known to be available for VMS.
+	* build_gawk_pcsi_desc.com: Remove extra copy of a file being
+	  installed.
+
+2016-01-21         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* descrip.mms and vmsbuild.com: Remove the unused hand-updated
+	  version numbers.
+
+2016-01-10         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* build_gawk_pcsi_desc.com: Better detection for VMS Software
+	  Inc.'s OpenVMS releases.
+	* compare_gawk_source.com: Skip files that VMS can not diff
+	  with native tools.
+	* gawk_alias_setup: Install aliases in correct simulated
+	  Linux directory.
+	* pcsi_gawk_file_list.txt:  Install binaries and aliass in
+	  correct simulated Linux directory.
+	* remove_old_gawk.com: Look for old gawk images that may
+	  have been installed in the wrong directory.
+
+2015-07-02         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* build_gawk_pcsi_desc.com: Update to support new VMS
+	producer of VSI.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmsbuild.com, descrip.mms: Bump patchlevel.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2015-04-08         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* generate_config_vms_h_gawk.com: Add custom.h include.
+
+2015-04-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmsbuild.com, descrip.mms: Bump patchlevel.
+
+2014-10-17         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* config_h.com: Use sys$disk: instead of prj_root: for
+	  copying the configure file.
+	* gawk_alias_setup.com: Fix removal of out of date aliases.
+	* vmsbuild.com: Fix a typo for symbol CNAME and a case sensitive
+	  test for "VAX" .eq. "vax" that failed.  Also disable verify
+	  while looking up the actual version.
+	* vmstest.com: Make sure that the test directory exists when
+	  using a search list.
+
+2014-04-18         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawk_alias_setup.com: Fix problem with file links on Vax/VMS.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* descrip.mms, vmsbuild.com: Update patchlevel.
+
+2014-02-12         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com: (strftime) requires GNV Coreutils date command to run
+	  (readdir) fix file cleanup to not generate warnings.
+
+2014-01-21         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* generate_config_vms_h_gawk.com: upate copyright and fix exit status.
+
+2014-01-17         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* vmstest.com (split_after_fpat): Added this test.
+
+2014-01-03         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* config_h.com, generate_config_vms_h_gawk.com,
+	  vms_args.c, vms_cli.c, vms_fwrite.c, vms_gawk.c, vms_misc.c,
+	  vms_popen.c: Update copyright to 2014.
+	* descrip.mms: Improve spotless cleanup.
+	* vmstest.com: Improve test cleanup.
+	* backup_gawk_src.com: New file. Create backup savesets for gawk source.
+	* build_gawk_pcsi_desc.com: New file. Create a pcsi$desc manifest
+	  file for building a gawk package.
+	* build_gawk_pcsi_text.com: New file. Create a pcsi$text file for
+	  building a gawk package.
+	* build_gawk_release_notes.com: New file. Create a VMS release notes
+	  file based on the gawk README and COPYING files and the release note
+	  start and build instruction files.
+	* compare_gawk_source.com: New file. Helper file to compare and
+	  optionally update two gawk source directories.  Used to copy
+	  source from an NFS volume to a VMS native volume for backup.
+	* gawk_alias_setup.com: New file. Used at installation time to
+	  create hard links for for some files instead of copies.
+	* gawk_build_steps.txt: New file.  Document how to build a PCSI kit.
+	* gawk_release_note_start.txt: New file.  Start of release notes.
+	* gawk_verb.com: New file. Converts the gawk.cld file into a
+	  gawk_verb.cld file for setting up GAWK as a DCL command.
+	* gnv_gawk_startup.com: New file.  Makes sure that the GNV$GNU logical
+	  name need to easily find the gawk image is defined.
+	* make_pcsi_gawk_kit_name.com: New File. Create the PCSI kit name
+	  based on the GAWK version.
+	* pcsi_gawk_file_list.txt: New File.  Input file for creating the
+	  pcsi$desc manifest file.
+	* pcsi_product_gawk.com: New file.  File to create the PCSI kit.
+	* remove_old_gawk.com: New file.  File to remove obsolete GNV gawk
+	  files replaced by the new PCSI kit.
+	* stage_gawk_install.com: New file.  Stages an install for the
+	  pcsi kit building.
+
+2013-12-29         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawk_plugin.opt: New file. Needed to build plugins on IA64
+	and ALPHA.
+	* generate_config_vms_h_gawk.com: Document which version
+	of VMS the mkstemp issue was seen.
+	* vms_popen: (pclose): Tolerate invalid file pointer.
+	* vmstest.com: Add tests for extensions ported to VMS.
+
+2013-12-23         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawkmisc.vms: Fix program name calculation on VAX.
+	* vms_cli.c: Fix case of public symbol.
+	* vms.hlp: Fix typo, add cautions on rounding and timezones.
+	* vmstest.com: Dcl symbol tz causing conflict with test.
+
+2013-12-20         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* descrip.mms: Set CC exact symbol names, cleanup repository.
+	* generate_config_vms_h_gawk.com: Use correct VMS exit codes.
+	* vmsbuild.com: Set CC exact symbol names.
+	* vmstest.com: Extract correct Unix status for failed tests.
+	* vms.h, vms_args.c, vms_cli.c, vms_fwrite.c, vms_gawk.c,
+	  vms_misc.c, vms_popen.c: Correct case of function names.
+	* vms.hlp: Updated with new information about exit codes.
+
+2013-12-10         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* gawkmisc.vms: Add lots of includes.
+	(sys_trnlnm): New function.
+	(gawk_name): Improved.
+	(os_arg_fixup): Fix up time zone.
+
+2013-12-08         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* descrip.mms: Add IEEE float for non-vax.
+	  Add vms_crtl_init.c.
+	  Remove code to generate version.c
+	* generate_config_vms_h_gawk.com (__attribute__): Removed
+	  definition from here.
+	* version_c.com: removed no longer used.
+	* vmsbuild.com: Add IEEE float for non-vax.
+	  Add vms_crtl_init.c
+	  Remove code to generate version.c
+	  Changes that should have been in the previous commit.
+	* vms_misc.c (vms_open): VMS CRTL for 8.3 Alpha is setting
+	  errno to ENOENT instead of EISDIR for ".".
+
+2013-12-05         John E. Malmberg      <wb8tyw@qsl.net>
+
+	* New config_h.com to generate config.h
+	* New gawk_ident.com generates ident line for link option file.
+	* Add version_c.com to create version.c from version.in.
+	* Remove fcntl.h covering up real fcntl.h.  If an older version
+	  of VMS needs this file, the build procedure should be updated
+	  to generate it from a template.
+	* descrip.mms: Use command files to generate files based
+	  on same input files as a Linux build.
+	* gawkmisc.vms (files_are_same): support _USE_STD_STAT for VMS 8.x.
+	* generate_config_vms_h_gawk.com: Generates a helper file
+	  config_vms.h to cover issues config_h.com can not handle.
+	* vmsbuild.com: Use command files to generate files based
+	  on the same input files as a Linux build.
+	* vms_misc.c (vms_open): VMS CRTL setting errno to ENOENT where
+	  it should be set to EMFILE.
+
+2013-12-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vms-conf.h (__attribute__): Removed definition from here; fixed
+	the issue in the main sources.
+
+2013-12-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vms-conf.h (ALLOW_SWITCH): Removed. No longer used.
+	(__attribute__): Define as empty.
+
+2013-08-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vms-conf.h (RE_TOKEN_INIT_BUG): Remove define (change of
+	Feb 19 2005) since it's no longer needed.
+
+2013-06-03         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.c (init_sockets): New dummy function.
+
+2013-05-27         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vms-conf.h: Remove obsolete HAVE_ST_BLKSIZE.
+
+2013-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.0: Release tar ball made.
+
+2012-05-09         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmsbuild.com (REL, PATCHLVL): Move to 4.1.0.
+	* descrip.mms (REL, PATCHLVL): Move to 4.1.0.
+	* vms-conf.h (VERSION, PACKAGE_VERSION, PACKAGE_STRING): Move to 4.1.0.
+
+2013-04-19         Anders Wallin         <anders_s_wallin@yahoo.se>
+
+	* vmstest.com: Updated to match main test/Makefile.
+
+2012-12-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.2: Release tar ball made.
+
+2012-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmstest.com (paramuninitglobal): New test.
+
+2012-12-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmsbuild.com (REL, PATCHLVL): Move to 4.0.2.
+	* descrip.mms (REL, PATCHLVL): Move to 4.0.2.
+	* vms-conf.h (VERSION, PACKAGE_VERSION, PACKAGE_STRING): Move to 4.0.2.
+
+2012-12-18         John E. Malmberg	<wb8tyw@qsl.net>
+
+	* descrip.mms: Make the build procedure run on a default directory
+	that is on a VMS logical name search list.
+	* vmstest.com: Make the tests run on a default directory that is on
+	a VMS logical name search list.
+
+2012-12-13         Anders Wallin         <anders_s_wallin@yahoo.se>
+
+	* descrip.mms: Update to handle removal of pgawk and dgawk,
+	workaround for MMS bug
+
+2012-12-09         Anders Wallin         <anders_s_wallin@yahoo.se>
+
+	* vmstest.com: Updated to match main test/Makefile.
+
+2012-12-02         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vms_gawk.c (CmdName): Force to just "GAWK".
+
+2012-11-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmstest.com: Fix typo in applying previous patch.
+
+2012-11-22         Anders Wallin         <anders_s_wallin@yahoo.se>
+
+	* vmstest.com: Updated to match main test/Makefile.
+
+2012-11-14         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmsbuild.com: Updated.  Thanks to Anders Wallin.
+	* vms-conf.h: Ditto, ditto.
+
+2012-11-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.vms (os_isreadable): Change first argument type to
+	awk_input_buf_t.
+	* vms-conf.h (HAVE_STDINT_H): Define.
+	(SHLIBEXT, DEFLIBPATH): Add definitions.
+	* vms_fwrite.c (tty_fwrite): Check do_debug instead of no-longer-
+	extant which_gawk variable.
+	* vms_gawk.c (vms_gawk): Check do_debug and do_profiling instead
+	of which_gawk.
+
+	Thanks to Anders Wallin.
+
+2012-08-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.vms (os_isreadable): Take IOBUF_PUBLIC instead of fd and
+	use passed in info.
+
+2012-07-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.vms (os_isreadable): Add isdir pointer parameter to be
+	set to true if fd is for a directory.
+
+2012-07-26         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* gawkmisc.vms (os_isreadable): New function.
+
+2012-03-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* config.h: Add definition for _Noreturn.
+
+2012-03-20         Andrew J. Schorr     <aschorr@telemetry-investments.com>
+
+	* gawkmisc.vms (deflibpath): New global variable.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.0.1: Release tar ball made.
+
+2012-03-28         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vms-conf.h: Update copyright year.
+
+2012-03-21         Anders Wallin         <anders_s_wallin@yahoo.se>
+
+	* vmstest.com: Make printfbad3 test work.
+
+2012-03-20         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmstest.com: Add printfbad3 test.
+
+2012-02-10         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmsbuild.com, descrip.mms, vms-conf.h: Update patch level.
+
+2011-12-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vms_misc.c: [STREQ, STREQN]: Change use of macros to call
+	strcmp, strncmp, directly.
+
+2011-11-02	Pat Rankin	<r.pat.rankin@gmail.com>
+
+	* vms-conf.h (HAVE_SETSID, HAVE_SYS_IOCTL): Add but leave undef'd.
+	(HAVE_ISWCTYPE, HAVE_ISWLOWER, HAVE_ISWUPPER, HAVE_MBRLEN,
+	HAVE_MBRTOWC, HAVE_TOWLOWER, HAVE_TOWUPPER, HAVE_WCHAR_H,
+	HAVE_WCRTOMB, HAVE_WCSCOLL, HAVE_WCTYPE, HAVE_WCTYPE_H,
+	HAVE_WCTYPE_T): Define as 1 since DEC C supports all these.
+
+	* descrip.mms (replace.obj): Add dependencies for missing_d/*.c.
+	* vmstest.com (unix_tests): Fix typo in spelling of rtlen01.
+
+2011-10-30	Pat Rankin	<r.pat.rankin@gmail.com>
+
+	* vmstest.com (fpat3, fwtest3, getline5, gsubtst7, gsubtst8,
+	pty1, rtlen, rtlen01, rtlenmb): New tests.
+	(posix2008sub): Revised test.
+
+2011-10-25         Anders Wallin        <anders_s_wallin@yahoo.se>
+
+	* vmstest.com (posix2008sub): Added as specific test in order to
+	use --posix option.
+
+2011-06-24         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* vmsbuild.com (REL, PATCHLVL): Move to 4.0.0.
+	* descrip.mms (REL, PATCHLVL): Move to 4.0.0.
+	* vms-conf.h (VERSION, PACKAGE_VERSION): Move to 4.0.0.
+	* 4.0.0: Remake the tar ball.
+
+2011-06-23         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* ChangeLog.0: Rotated ChangeLog into this file.
+	* ChangeLog: Created anew for gawk 4.0.0 and on.
+	* 4.0.0: Release tar ball made.
diff --git a/gawk-5.0.1/vms/backup_gawk_src.com b/gawk-5.0.1/vms/backup_gawk_src.com
new file mode 100644
index 00000000000..abee8d71280
--- /dev/null
+++ b/gawk-5.0.1/vms/backup_gawk_src.com
@@ -0,0 +1,113 @@
+$! File: Backup_gawk_src.com
+$!
+$! Procedure to create backup save sets for installing in a PCSI kit.
+$!
+$! To comply with most Open Source licenses, the source used for building
+$! a kit will be packaged with the distribution kit for the binary.
+$!
+$! Backup save sets are the only storage format that I can expect a
+$! VMS system to be able to extract ODS-5 filenames and directories.
+$!
+$! The make_pcsi_kit_name.com needs to be run before this procedure to
+$! properly name the files that will be created.
+$!
+$! This file is created from a template file for the purpose of making it
+$! easier to port Unix code, particularly open source code to VMS.
+$! Therefore permission is freely granted for any use.
+$!
+$! 13-Jun-2009 J. Malmberg
+$!
+$!===========================================================================
+$!
+$! Save default
+$ default_dir = f$environment("DEFAULT")
+$!
+$ arch_type = f$getsyi("ARCH_NAME")
+$ arch_code = f$extract(0, 1, arch_type)
+$!
+$ if arch_code .nes. "V"
+$ then
+$   set proc/parse=extended
+$ endif
+$!
+$ ss_abort = 44
+$ status = ss_abort
+$!
+$ kit_name = f$trnlnm("GNV_PCSI_KITNAME")
+$ if kit_name .eqs. ""
+$ then
+$   write sys$output "@MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$ producer = f$trnlnm("GNV_PCSI_PRODUCER")
+$ if producer .eqs. ""
+$ then
+$   write sys$output "@MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$ filename_base = f$trnlnm("GNV_PCSI_FILENAME_BASE")
+$ if filename_base .eqs. ""
+$ then
+$   write sys$output "@MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$!
+$ node_swvers = f$getsyi("NODE_SWVERS")
+$ node_swvers_type = f$extract(0, 1, node_swvers)
+$ node_swvers_vers = f$extract(1, f$length(node_swvers), node_swvers)
+$ swvers_maj = f$element(0, ".", node_swvers_vers)
+$ node_swvers_min_update = f$element(1, ".", node_swvers_vers)
+$ swvers_min = f$element(0, "-", node_swvers_min_update)
+$ swvers_update = f$element(1, "-", node_swvers_min_update)
+$!
+$ if swvers_update .eqs. "-" then swvers_update = ""
+$!
+$ vms_vers = f$fao("!2ZB!2ZB!AS", 'swvers_maj', 'swvers_min', swvers_update)
+$!
+$!
+$!
+$! If available make an interchange save set
+$!-------------------------------------------
+$ interchange = ""
+$ if arch_code .eqs. "V"
+$ then
+$   interchange = "/interchange/exclude=[.$5ngit...]*.*"
+$ endif
+$ if (swvers_maj .ges. "8") .and. (swvers_min .ges. 4)
+$ then
+$   interchange = "/interchange/noconvert/exclude=[.^.git...]*.*"
+$ endif
+$!
+$!
+$! Put things back on error.
+$ on warning then goto all_exit
+$!
+$ current_default = f$environment("DEFAULT")
+$ my_dir = f$parse(current_default,,,"DIRECTORY") - "[" - "<" - ">" - "]"
+$!
+$ src_root = "src_root:"
+$ if f$trnlnm("src_root1") .nes. "" then src_root = "src_root1:"
+$ backup'interchange' 'src_root'[gawk...]*.*;0 -
+           'filename_base'_original_src.bck/sav
+$ status = $status
+$!
+$! There may be a VMS specific source kit
+$!-----------------------------------------
+$ vms_root = "vms_root:"
+$ if f$trnlnm("vms_root1") .nes. "" then vms_root = "vms_root1:"
+$ files_found = 0
+$ define/user sys$error nl:
+$ define/user sys$output nl:
+$ directory 'vms_root'[...]*.*;*/exc=*.dir
+$ if '$severity' .eq. 1 then files_found = 1
+$!
+$ if files_found .eq. 1
+$ then
+$   backup'interchange' 'vms_root'[gawk...]*.*;0 -
+            'filename_base'_vms_src.bck/sav
+$   status = $status
+$ endif
+$!
+$all_exit:
+$ set def 'default_dir'
+$ exit
diff --git a/gawk-5.0.1/vms/build_gawk_pcsi_desc.com b/gawk-5.0.1/vms/build_gawk_pcsi_desc.com
new file mode 100644
index 00000000000..162da0863a0
--- /dev/null
+++ b/gawk-5.0.1/vms/build_gawk_pcsi_desc.com
@@ -0,0 +1,435 @@
+$! File: Build_GAWK_PCSI_DESC.COM
+$!
+$! Build the *.pcsi$text file in the following sections:
+$!   Required software dependencies.
+$!   install/upgrade/postinstall steps.
+$!      1. Duplicate filenames need an alias procedure.
+$!      2. ODS-5 filenames need an alias procedure.
+$!      3. Special alias links for executables (cp. -> gnv$cp.exe)
+$!         if a lot, then an alias procedure is needed.
+$!      4. Rename the files to lowercase.
+$!   Move Release Notes to destination
+$!   Source kit option
+$!   Create directory lines
+$!   Add file lines for gawk.
+$!   Add Link alias procedure file (used for gawk)
+$!   Add [.SYS$STARTUP]gawk_startup file
+$!   Add Release notes file.
+$!
+$! The file PCSI_GAWK_FILE_LIST.TXT is read in to get the files other
+$! than the release notes file and the source backup file.
+$!
+$! The PCSI system can really only handle ODS-2 format filenames and
+$! assumes that there is only one source directory.  It also assumes that
+$! all destination files with the same name come from the same source file.
+$! Fortunately GAWK does not trip most of these issues, so those steps
+$! above are marked N/A.
+$!
+$! A rename action section is needed to make sure that the files are
+$! created in the GNV$GNU: in the correct case, and to create the alias
+$! link [usr.bin]gawk. for [usr.bin]gawk.exe.
+$!
+$! 02-Jan-2014  J. Malmberg - Gawk version
+$!
+$!===========================================================================
+$!
+$ kit_name = f$trnlnm("GNV_PCSI_KITNAME")
+$ if kit_name .eqs. ""
+$ then
+$   write sys$output "@[.vms]MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$ producer = f$trnlnm("GNV_PCSI_PRODUCER")
+$ if producer .eqs. ""
+$ then
+$   write sys$output "@[.vms]MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$ filename_base = f$trnlnm("GNV_PCSI_FILENAME_BASE")
+$ if filename_base .eqs. ""
+$ then
+$   write sys$output "@[.vms]MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$!
+$!
+$! Parse the kit name into components.
+$!---------------------------------------
+$ producer = f$element(0, "-", kit_name)
+$ base = f$element(1, "-", kit_name)
+$ product = f$element(2, "-", kit_name)
+$ mmversion = f$element(3, "-", kit_name)
+$ majorver = f$extract(0, 3, mmversion)
+$ minorver = f$extract(3, 2, mmversion)
+$ updatepatch = f$element(4, "-", kit_name)
+$ if updatepatch .eqs. "-" then updatepatch = ""
+$!
+$! kit type of "D" means a daily build
+$ kit_type = f$edit(f$extract(0, 1, majorver), "upcase")
+$!
+$!
+$ product_line = "product ''producer' ''base' ''product'"
+$ if updatepatch .eqs. ""
+$ then
+$     product_name = " ''majorver'.''minorver'"
+$ else
+$     product_name = " ''majorver'.''minorver'-''updatepatch'"
+$ endif
+$ product_line = product_line + " ''product_name' full;"
+$!write sys$output product_line
+$!
+$!
+$!
+$! Create the file as a VMS text file.
+$!----------------------------------------
+$ base_file = kit_name
+$ create 'base_file'.pcsi$desc
+$!
+$!
+$! Start building file.
+$!----------------------
+$ open/append pdsc 'base_file'.pcsi$desc
+$!
+$ write pdsc product_line
+$!
+$! Required product dependencies.
+$!----------------------------------
+$ vmsprd = "DEC"
+$ if base .eqs. "I64VMS" then vmsprd = "HP"
+$ vsiprd = "VSI"
+$!
+$ arch_type = f$getsyi("ARCH_NAME")
+$ node_swvers = f$getsyi("node_swvers")
+$ vernum = f$extract(1, f$length(node_swvers), node_swvers)
+$ majver = f$element(0, ".", vernum)
+$ minverdash = f$element(1, ".", vernum)
+$ minver = f$element(0, "-", minverdash)
+$ dashver = f$element(1, "-", minverdash)
+$ if dashver .eqs. "-" then dashver = ""
+$ vmstag = majver + minver + dashver
+$ code = f$extract(0, 1, arch_type)
+$ arch_code = f$extract(0, 1, arch_type)
+$ line_out = -
+ "   if ((<software ''vmsprd' ''base' VMS> and"
+$ write pdsc line_out
+$ line_out = -
+ "        (not <software ''vmsprd' ''base' VMS version minimum" + -
+ " ''node_swvers'>)) or"
+$ write pdsc line_out
+$ line_out = -
+ "       (<software ''vsiprd' ''base' VMS>"
+$ write pdsc line_out
+$ line_out = -
+ "        and (not <software ''vsiprd' ''base' VMS version minimum" + -
+ " ''node_swvers'>))) ;"
+$ write pdsc line_out
+$ write pdsc "      error NEED_VMS''vmstag';"
+$ write pdsc "   end if;"
+$!
+$!
+$!
+$! install/upgrade/postinstall steps.
+$!-----------------------------------
+$!      1. Duplicate filenames need an alias procedure.
+$!      2. ODS-5 filenames need an alias procedure.
+$!      3. Special alias links for executables (gawk. -> gnv$gawk.exe)
+$!         if a lot, then an alias procedure is needed.
+$!      4. Rename the files to lowercase.
+$!
+$!
+$!   Alias links needed.
+$!-------------------------
+$ add_alias_lines = ""
+$ rem_alias_lines = ""
+$ line_out = ""
+$!
+$!   Read through the file list to set up aliases and rename commands.
+$!---------------------------------------------------------------------
+$ open/read flst [.vms]pcsi_gawk_file_list.txt
+$!
+$inst_alias_loop:
+$   read/end=inst_alias_loop_end flst line_in
+$   line_in = f$edit(line_in,"compress,trim,uncomment")
+$   if line_in .eqs. "" then goto inst_alias_loop
+$   pathname = f$element(0, " ", line_in)
+$   linkflag = f$element(1, " ", line_in)
+
+$   if linkflag .nes. "->" then goto inst_alias_write
+$!
+$   linktarget = f$element(2, " ", line_in)
+$   nlink = "pcsi$destination:" + pathname
+$   ntarg = "pcsi$destination:" + linktarget
+$   new_add_alias_line = -
+  """if f$search(""""''nlink'"""") .eqs. """""""" then" + -
+  " set file/enter=''nlink' ''ntarg'"""
+$   if add_alias_lines .nes. ""
+$   then
+$       add_alias_lines = add_alias_lines + "," + new_add_alias_line
+$   else
+$       add_alias_lines = new_add_alias_line
+$   endif
+$!
+$   new_rem_alias_line = -
+  """if f$search(""""''nlink'"""") .nes. """""""" then" + -
+  " set file/remove ''nlink';"""
+$   if rem_alias_lines .nes. ""
+$   then
+$      rem_alias_lines = rem_alias_lines + "," + new_rem_alias_line
+$   else
+$      rem_alias_lines = new_rem_alias_line
+$   endif
+$!
+$   goto inst_alias_loop
+$!
+$inst_alias_write:
+$!
+$!  execute install / remove
+$   write pdsc "   execute install ("
+$! add aliases
+$   i = 0
+$ex_ins_loop:
+$       line = f$element(i, ",", add_alias_lines)
+$       i = i + 1
+$       if line .eqs. "" then goto ex_ins_loop
+$       if line .eqs. "," then goto ex_ins_loop_end
+$       if line_out .nes. "" then write pdsc line_out,","
+$       line_out = line
+$       goto ex_ins_loop
+$ex_ins_loop_end:
+$   if line_out .eqs. "" then line_out = "   ""continue"""
+$   write pdsc line_out
+$   line_out = ""
+$   write pdsc "      )"
+$   write pdsc "   remove ("
+$! remove aliases
+$   line_out = -
+       "  ""@pcsi$destination:[gnv.vms_bin]gawk_alias_setup.com remove"""
+$   i = 0
+$ex_rem_loop:
+$       line = f$element(i, ",", rem_alias_lines)
+$       i = i + 1
+$       if line .eqs. "" then goto ex_rem_loop
+$       if line .eqs. "," then goto ex_rem_loop_end
+$       if line_out .nes. "" then write pdsc line_out,","
+$       line_out = line
+$       goto ex_rem_loop
+$ex_rem_loop_end:
+$   if line_out .eqs. "" then line_out = "   ""continue"""
+$   write pdsc line_out
+$   line_out = ""
+$   write pdsc "      ) ;"
+$!
+$!  execute upgrade
+$   write pdsc "   execute upgrade ("
+$   line_out = -
+       "  ""@pcsi$destination:[gnv.vms_bin]gawk_alias_setup.com remove"""
+$   i = 0
+$ex_upg_loop:
+$       line = f$element(i, ",", rem_alias_lines)
+$       i = i + 1
+$       if line .eqs. "" then goto ex_upg_loop
+$       if line .eqs. "," then goto ex_upg_loop_end
+$       if line_out .nes. "" then write pdsc line_out,","
+$       line_out = line
+$       goto ex_upg_loop
+$ex_upg_loop_end:
+$   if line_out .eqs. "" then line_out = "   ""continue"""
+$   write pdsc line_out
+$   line_out = ""
+$! remove aliases
+$   write pdsc "      ) ;"
+$!
+$!  execute postinstall
+$   write pdsc "   execute postinstall ("
+$   if arch_code .nes. "V"
+$   then
+$       line_out = "   ""set process/parse=extended"","
+$       write pdsc line_out
+$   endif
+$   line_out = "  ""@pcsi$destination:[gnv.vms_bin]remove_old_gawk.com"","
+$   write pdsc line_out
+$   line_out = "  ""@pcsi$destination:[gnv.vms_bin]gawk_alias_setup.com"""
+$   i = 0
+$ex_pins_loop:
+$       line = f$element(i, ",", add_alias_lines)
+$       i = i + 1
+$       if line .eqs. "" then goto ex_pins_loop
+$       if line .eqs. "," then goto ex_pins_loop_end
+$       if line_out .nes. "" then write pdsc line_out,","
+$       line_out = line
+$       goto ex_pins_loop
+$ex_pins_loop_end:
+$   if line_out .eqs. "" then line_out = "   ""continue"""
+$!   write pdsc line_out
+$!   line_out = ""
+$! add aliases and follow with renames.
+$!
+$goto inst_dir
+$!
+$inst_dir_loop:
+$   read/end=inst_alias_loop_end flst line_in
+$   line_in = f$edit(line_in,"compress,trim,uncomment")
+$   if line_in .eqs. "" then goto inst_dir_loop
+$inst_dir:
+$   pathname = f$element(0, " ", line_in)
+$!
+$!  Ignore the directory entries for now.
+$!-----------------------------------------
+$   filedir = f$parse(pathname,,,"DIRECTORY")
+$   if pathname .eqs. filedir then goto inst_dir_loop
+$!
+$!  process .dir extensions for rename
+$!  If this is not a directory then start processing files.
+$!-------------------------
+$   filetype = f$parse(pathname,,,"TYPE")
+$   filetype_u = f$edit(filetype, "upcase")
+$   filename = f$parse(pathname,,,"NAME")
+$   if filetype_u .nes. ".DIR" then goto inst_file
+$!
+$!  process directory lines for rename.
+$!--------------------------------------
+$   if line_out .nes. ""
+$   then
+$       write pdsc line_out,","
+$       line_out = ""
+$   endif
+$   if arch_code .nes. "V"
+$   then
+$       if line_out .nes. "" then write pdsc line_out,","
+$       line_out = "   ""rename pcsi$destination:''pathname' ''filename'.DIR"""
+$   else
+$       if line_out .nes. "" then write pdsc line_out
+$       line_out = ""
+$   endif
+$   goto inst_dir_loop
+$!
+$!
+$!   process file lines for rename
+$!---------------------------------
+$inst_file_loop:
+$   read/end=inst_alias_loop_end flst line_in
+$   line_in = f$edit(line_in,"compress,trim,uncomment")
+$   if line_in .eqs. "" then goto inst_dir_loop
+$   pathname = f$element(0, " ", line_in)
+$!
+$!  Filenames with $ in them are VMS special and do not need to be lowercased.
+$!  --------------------------------------------------------------------------
+$   if f$locate("$", pathname) .lt. f$length(pathname) then goto inst_file_loop
+$!
+$   filetype = f$parse(pathname,,,"TYPE")
+$   filename = f$parse(pathname,,,"NAME") + filetype
+$inst_file:
+$   if arch_code .nes. "V"
+$   then
+$       if line_out .nes. "" then write pdsc line_out,","
+$       filetype = f$parse(pathname,,,"TYPE")
+$       filename = f$parse(pathname,,,"NAME") + filetype
+$       line_out = "   ""rename pcsi$destination:''pathname' ''filename'"""
+$   else
+$       if line_out .nes. "" then write pdsc line_out
+$       line_out = ""
+$   endif
+$   goto inst_file_loop
+$!
+$inst_alias_loop_end:
+$!
+$write pdsc line_out
+$write pdsc "        ) ;"
+$close flst
+$!
+$!   Move Release Notes to destination
+$!-------------------------------------
+$write pdsc "   information RELEASE_NOTES phase after ;"
+$!
+$!   Source kit option
+$!---------------------
+$write pdsc "   option SOURCE default 0;"
+$write pdsc "   directory ""[gnv.common_src]"" PROTECTION PUBLIC ;"
+$write pdsc -
+    "        file ""[gnv.common_src]''filename_base'_original_src.bck"""
+$write pdsc -
+    "          source [common_src]''filename_base'_original_src.bck ;"
+$if f$search("sys$disk:''filename_base'_vms_src.bck") .nes. ""
+$then
+$    write pdsc "   directory ""[gnv.vms_src]"" PROTECTION PUBLIC ;"
+$    write pdsc "        file ""[gnv.vms_src]''filename_base'_vms_src.bck"""
+$    write pdsc "          source [vms_src]''filename_base'_vms_src.bck ;"
+$endif
+$write pdsc "   end option;"
+$!
+$!
+$! Read through the file list again.
+$!----------------------------------
+$open/read flst [.vms]pcsi_gawk_file_list.txt
+$!
+$!
+$!   Create directory lines
+$!-------------------------
+$flst_dir_loop:
+$   read/end=flst_loop_end flst line_in
+$   line_in = f$edit(line_in,"compress,trim,uncomment")
+$   if line_in .eqs. "" then goto flst_dir_loop
+$!
+$   filename = f$element(0, " ", line_in)
+$   linkflag = f$element(1, " ", line_in)
+$   if linkflag .eqs. "->" then goto flst_dir_loop
+$!
+$!  Ignore .dir extensions
+$!-------------------------
+$   filetype = f$edit(f$parse(filename,,,"TYPE"), "upcase")
+$   if filetype .eqs. ".DIR" then goto flst_dir_loop
+$!
+$   destname = filename
+$!
+$!  It should be just a directory then.
+$!-------------------------------------
+$   filedir = f$edit(f$parse(filename,,,"DIRECTORY"), "lowercase")
+$!  If this is not a directory then start processing files.
+$!---------------------------------------------------------
+$   if filename .nes. filedir then goto flst_file
+$!
+$   write pdsc "   directory ""''destname'"" PROTECTION PUBLIC ;"
+$   goto flst_dir_loop
+$!
+$!
+$!   Add file lines for gawk.
+$!---------------------------
+$flst_file_loop:
+$   read/end=flst_loop_end flst line_in
+$   line_in = f$edit(line_in,"compress,trim,uncomment")
+$   if line_in .eqs. "" then goto flst_file_loop
+$   filename = f$element(0, " ", line_in)
+$   destname = filename
+$flst_file:
+$   if arch_code .eqs. "V"
+$   then
+$!      ! These files not available on VAX.
+$       src_dir = f$parse(destname,,,"DIRECTORY")
+$       if src_dir .eqs. "[GNV.USR.LIB.GAWK]" then goto flst_file_loop
+$   endif
+$   srcfile = filename - "gnv."
+$   write pdsc "   file ""''destname'"" "
+$   write pdsc "     source ""''srcfile'"" ;"
+$   goto flst_file_loop
+$!
+$flst_loop_end:
+$ close flst
+$!
+$!   Add [.SYS$STARTUP]gawk_startup file
+$!---------------------------------------
+$ write pdsc "   file ""[sys$startup]gnv$gawk_startup.com"""
+$ write pdsc "     source [vms_bin]gnv$gawk_startup.com ;"
+$!
+$!   Add Release notes file.
+$!------------------------------
+$ write pdsc -
+    "   file ""[SYSHLP]''filename_base'.release_notes"" release notes ;"
+$!
+$! Close the product file
+$!------------------------
+$ write pdsc "end product;"
+$!
+$close pdsc
+$!
+$all_exit:
+$ exit
diff --git a/gawk-5.0.1/vms/build_gawk_pcsi_text.com b/gawk-5.0.1/vms/build_gawk_pcsi_text.com
new file mode 100644
index 00000000000..a1053cf656e
--- /dev/null
+++ b/gawk-5.0.1/vms/build_gawk_pcsi_text.com
@@ -0,0 +1,179 @@
+$! File: build_gawk_pcsi_text.com
+$!
+$! Build the *.pcsi$text file from the four components:
+$!    1. Generated =product header section
+$!    2. readme. file from the Gawk distribution, modified to fit
+$!       a pcsi$text file format.
+$!    3. copying file from the Gawk distribution, modified to fit
+$!       a pcsi$text file format.
+$!    4. Generated Producer section.
+$!
+$! Set the name of the release notes from the GNV_PCSI_FILENAME_BASE
+$!
+$!
+$! 02-Jan-2014  J. Malmberg - Gawk version
+$!
+$!===========================================================================
+$!
+$ kit_name = f$trnlnm("GNV_PCSI_KITNAME")
+$ if kit_name .eqs. ""
+$ then
+$   write sys$output "@MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$ producer = f$trnlnm("GNV_PCSI_PRODUCER")
+$ if producer .eqs. ""
+$ then
+$   write sys$output "@MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$ producer_full_name = f$trnlnm("GNV_PCSI_PRODUCER_FULL_NAME")
+$ if producer_full_name .eqs. ""
+$ then
+$   write sys$output "@MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$!
+$!
+$! Parse the kit name into components.
+$!---------------------------------------
+$ producer = f$element(0, "-", kit_name)
+$ base = f$element(1, "-", kit_name)
+$ product = f$element(2, "-", kit_name)
+$ mmversion = f$element(3, "-", kit_name)
+$ majorver = f$extract(0, 3, mmversion)
+$ minorver = f$extract(3, 2, mmversion)
+$ updatepatch = f$element(4, "-", kit_name)
+$ if updatepatch .eqs. "-" then updatepatch = ""
+$!
+$!
+$ product_line = "=product ''producer' ''base' ''product'"
+$ if updatepatch .eqs. ""
+$ then
+$     product_name = " ''majorver'.''minorver'"
+$ else
+$     product_name = " ''majorver'.''minorver'-''updatepatch'"
+$ endif
+$ product_line = product_line + " ''product_name' full"
+$!
+$!
+$! If this is VAX and the file is on NFS, the names may be mangled.
+$!-----------------------------------------------------------------
+$ readme_file = ""
+$ if f$search("readme.") .nes. ""
+$ then
+$   readme_file = "readme."
+$ else
+$   if f$search("$README.") .nes. ""
+$   then
+$       readme_file = "$README."
+$   else
+$       write sys$output "Can not find readme file."
+$       goto all_exit
+$   endif
+$ endif
+$ copying_file = ""
+$ if f$search("copying.") .nes. ""
+$ then
+$   copying_file = "copying."
+$ else
+$   if f$search("$COPYING.") .nes. ""
+$   then
+$       copying_file = "$COPYING."
+$   else
+$       write sys$output "Can not find copying file."
+$       goto all_exit
+$   endif
+$ endif
+$!
+$! Create the file as a VMS text file.
+$!----------------------------------------
+$ base_file = kit_name
+$ create 'base_file'.pcsi$text
+$!
+$!
+$! Start building file.
+$!----------------------
+$ open/append ptxt 'base_file'.pcsi$text
+$ write ptxt product_line
+$!
+$!
+$! First insert the Readme file.
+$!
+$ open/read rf 'readme_file'
+$!
+$ write ptxt "1 'PRODUCT"
+$ write ptxt "=prompt ''producter' ''product' for OpenVMS"
+$!
+$rf_loop:
+$   read/end=rf_loop_end rf line_in
+$   if line_in .nes. ""
+$   then
+$!    PCSI files use the first character in for their purposes.
+$!--------------------------------------------------------------
+$     first_char = f$extract(0, 1, line_in)
+$     if first_char .nes. " " then line_in = " " + line_in
+$   endif
+$   write ptxt line_in
+$   goto rf_loop
+$rf_loop_end:
+$ close rf
+$!
+$!
+$! Now add in the copying file
+$!--------------------------------
+$ write ptxt ""
+$ write ptxt "1 'NOTICE"
+$ write ptxt ""
+$!
+$ open/read cf 'copying_file'
+$!
+$cf_loop:
+$   read/end=cf_loop_end cf line_in
+$   if line_in .nes. ""
+$   then
+$!    PCSI files use the first character in for their purposes.
+$!--------------------------------------------------------------
+$     first_char = f$extract(0, 1, line_in)
+$     if first_char .nes. " " then line_in = " " + line_in
+$   endif
+$   write ptxt line_in
+$   goto cf_loop
+$cf_loop_end:
+$ close cf
+$!
+$! Now we need the rest of the boiler plate.
+$!--------------------------------------------
+$ write ptxt ""
+$ write ptxt "1 'PRODUCER"
+$ write ptxt "=prompt ''producer_full_name'"
+$ write ptxt -
+ "This software product is provided by ''producer_full_name' with no warranty."
+$!
+$ arch_type = f$getsyi("ARCH_NAME")
+$ node_swvers = f$getsyi("node_swvers")
+$ vernum = f$extract(1, f$length(node_swvers), node_swvers)
+$ majver = f$element(0, ".", vernum)
+$ minverdash = f$element(1, ".", vernum)
+$ minver = f$element(0, "-", minverdash)
+$ dashver = f$element(1, "-", minverdash)
+$ if dashver .eqs. "-" then dashver = ""
+$ vmstag = majver + minver + dashver
+$ code = f$extract(0, 1, arch_type)
+$!
+$ write ptxt "1 NEED_VMS''vmstag'"
+$ write ptxt -
+   "=prompt OpenVMS ''vernum' or later is not installed on your system."
+$ write ptxt "This product requires OpenVMS ''vernum' or later to function."
+$ write ptxt "1 SOURCE"
+$ write ptxt "=prompt Source modules for ''product'"
+$ write ptxt "The Source modules for ''product' will be installed."
+$ write ptxt "1 RELEASE_NOTES"
+$ write ptxt "=prompt Release notes are available in the [SYSHLP] directory."
+$!
+$ close ptxt
+$!
+$!
+$!
+$all_exit:
+$ exit
diff --git a/gawk-5.0.1/vms/build_gawk_release_notes.com b/gawk-5.0.1/vms/build_gawk_release_notes.com
new file mode 100644
index 00000000000..c088ff8cadb
--- /dev/null
+++ b/gawk-5.0.1/vms/build_gawk_release_notes.com
@@ -0,0 +1,67 @@
+$! File: Build_gawk_release_notes.com
+$!
+$! Build the release note file from the three components:
+$!    1. The gawk_release_note_start.txt
+$!    2. readme. file from the Gawk distribution.
+$!    3. The gawk_build_steps.txt.
+$!
+$! Set the name of the release notes from the GNV_PCSI_FILENAME_BASE
+$! logical name.
+$!
+$!
+$! 31-Dec-2013  J. Malmberg
+$!
+$!===========================================================================
+$!
+$ base_file = f$trnlnm("GNV_PCSI_FILENAME_BASE")
+$ if base_file .eqs. ""
+$ then
+$   write sys$output "@MAKE_PCSI_GAWK_KIT_NAME.COM has not been run."
+$   goto all_exit
+$ endif
+$!
+$ gawk_vms_readme = f$search("sys$disk:[.readme_d]readme.vms")
+$ if gawk_vms_readme .eqs. ""
+$ then
+$   gawk_vms_readme = f$search("sys$disk:[.$README_$D]$README.VMS")
+$ endif
+$ if gawk_vms_readme .eqs. ""
+$ then
+$   write sys$output "Can not find gawk README.VMS file."
+$   goto all_exit
+$ endif
+$!
+$ gawk_readme = f$search("sys$disk:[]readme.")
+$ if gawk_readme .eqs. ""
+$ then
+$   gawk_readme = f$search("sys$disk:[]$README.")
+$ endif
+$ if gawk_readme .eqs. ""
+$ then
+$   write sys$output "Can not find gawk readme file."
+$   goto all_exit
+$ endif
+$!
+$ gawk_copying = f$search("sys$disk:[]copying.")
+$ if gawk_copying .eqs. ""
+$ then
+$   gawk_copying = f$search("sys$disk:[]$COPYING.")
+$ endif
+$ if gawk_copying .eqs. ""
+$ then
+$   write sys$output "Can not find gawk copying file."
+$   goto all_exit
+$ endif
+$!
+$ type/noheader sys$disk:[.vms]gawk_release_note_start.txt,-
+        'gawk_readme',-
+        'gawk_vms_readme',-
+        'gawk_copying', -
+        sys$disk:[.vms]gawk_build_steps.txt -
+        /out='base_file'.release_notes
+$!
+$ purge 'base_file'.release_notes
+$ rename 'base_file.release_notes ;1
+$!
+$all_exit:
+$   exit
diff --git a/gawk-5.0.1/vms/compare_gawk_source.com b/gawk-5.0.1/vms/compare_gawk_source.com
new file mode 100644
index 00000000000..065b640a594
--- /dev/null
+++ b/gawk-5.0.1/vms/compare_gawk_source.com
@@ -0,0 +1,369 @@
+$! Compare_gawk_source.com
+$!
+$! This procedure compares the files in two directories and reports the
+$! differences.
+$!
+$! It needs to be customized to the local site directories.
+$!
+$! This is used by me for these purposes:
+$!     1. Compare the original source of a project with an existing
+$!        VMS port.
+$!     2. Compare the checked out repository of a project with the
+$!        the local working copy to make sure they are in sync.
+$!     3. Keep a copy directory up to date.  The third is needed by
+$!        me because VMS Backup can create a saveset of files from a
+$!        NFS mounted volume.
+$!
+$! First the files in the original source directory which is assumed to be
+$! under source codde control are compared with the copy directory.
+$!
+$! Then the files are are only in the copy directory are listed.
+$!
+$! The result will five diagnostics about of files:
+$!    1. Files that are not generation 1.
+$!    2. Files missing in the copy directory.
+$!    3. Files in the copy directory not in the source directory.
+$!    4. Files different from the source directory.
+$!    5. Files that VMS DIFF can not process.
+$!
+$! This needs to be run on an ODS-5 volume.
+$!
+$! If UPDATE is given as a second parameter, files missing or different in the
+$! copy directory will be updated.
+$!
+$! By default:
+$!    The source directory is source_root:[gawk.reference.gawk],
+$!    the logical used on my system for the GNV Mecurial repository checkout.
+$!    If source_root: is not defined, then src_root:[gawk] will be
+$!    translated to something like DISK:[dir.gawk.reference.gawk]
+$!    and then DISK:[dir.gawk.vms_source.gawk] will be used.
+$!
+$!    The copy directory is vms_root:[gawk]
+$!    The UPDATE parameter is ignored.
+$!
+$!    This setting is used to make sure that the working vms directory
+$!    and the VMS specific repository checkout directory have the same
+$!    contents if they are different.
+$!
+$! If P1 is "SRCBCK" then this
+$!     The source directory tree is: src_root:[gawk]
+$!     The copy directory is src_root1:[gawk]
+$!
+$!   src_root1:[gawk] is used by me to work around that VMS backup will
+$!   not use NFS as a source directory so I need to make a copy.
+$!
+$!   This is to make sure that the backup save set for the unmodified
+$!   source is up to date.
+$!
+$!   If your repository checkout is not on an NFS mounted volume, you do not
+$!   need to use this option or have the logical name src_root1 defined.
+$!
+$! If P1 is "VMSBCK" then this changes the two directories:
+$!    The source directory is vms_root:[gawk]
+$!    The copy directory is vms_root1:[gawk]
+$!
+$!   vms_root:
+$!   src_root1:[gawk] is used by me to work around that VMS backup will
+$!   not use NFS as a source directory so I need to make a copy.
+$!
+$!   This is to make sure that the backup save set for the unmodified
+$!   source is up to date.
+$!
+$!   If your repository checkout is not on an NFS mounted volume, you do not
+$!   need to use this option or have the logical name src_root1 defined.
+$!
+$! 02-Jan-2014   J. Malmberg
+$!==========================================================================
+$!
+$! Update missing/changed files.
+$update_file = 0
+$if (p2 .eqs. "UPDATE")
+$then
+$   update_file = 1
+$endif
+$!
+$myproc = f$environment("PROCEDURE")
+$myprocdir = f$parse(myproc,,,"DIRECTORY") - "[" - "]" - "<" - ">"
+$myprocdir = f$edit(myprocdir, "LOWERCASE")
+$mydefault = f$environment("DEFAULT")
+$mydir = f$parse(mydefault,,,"DIRECTORY")
+$mydir = f$edit(mydir, "LOWERCASE")
+$odelim = f$extract(0, 1, mydir)
+$mydir = mydir - "[" - "]" - "<" - ">"
+$mydev = f$parse(mydefault,,,"DEVICE")
+$!
+$ref = ""
+$if P1 .eqs. ""
+$then
+$   ref_base_dir = myprocdir - ".vms"
+$   wrk_base_dir = mydir
+$   update_file = 0
+$   resultd = f$parse("src_root:",,,,"NO_CONCEAL")
+$   resultd = f$edit(resultd, "LOWERCASE")
+$   resultd = resultd - "][" - "><" - ".;" - ".."
+$   resultd_len = f$length(resultd) - 1
+$   delim = f$extract(resultd_len, 1, resultd)
+$   ref_root_base = mydir + delim
+$   if f$locate(".reference.", resultd) .lt. resultd_len
+$   then
+$      resultd = resultd - ref_root_base - "reference." + "vms_source."
+$   else
+$      resultd = resultd - ref_root_base - "gnu." + "gnu_vms."
+$   endif
+$   ref = resultd + ref_base_dir
+$   wrk = "VMS_ROOT:" + odelim + wrk_base_dir
+$   resultd_len = f$length(resultd) - 1
+$   resultd = f$extract(0, resultd_len, resultd) + delim
+$   ref_root_dir = f$parse(resultd,,,"DIRECTORY")
+$   ref_root_dir = f$edit(ref_root_dir, "LOWERCASE")
+$   ref_root_dir = ref_root_dir - "[" - "]"
+$   ref_base_dir = ref_root_dir + "." + ref_base_dir
+$endif
+$!
+$if p1 .eqs. "SRCBCK"
+$then
+$   ref_base_dir = "gawk"
+$   wrk_base_dir = "gawk"
+$   ref = "src_root:[" + ref_base_dir
+$   wrk = "src_root1:[" + wrk_base_dir
+$   if update_file
+$   then
+$       if f$search("src_root1:[000000]gawk.dir") .eqs. ""
+$       then
+$           create/dir/prot=o:rwed src_root1:[gawk]
+$       endif
+$   endif
+$endif
+$!
+$!
+$if p1 .eqs. "VMSBCK"
+$then
+$   ref_base_dir = "gawk"
+$   wrk_base_dir = "gawk"
+$   ref = "vms_root:[" + ref_base_dir
+$   wrk = "vms_root1:[" + wrk_base_dir
+$   if update_file
+$   then
+$       if f$search("vms_root1:[000000]gawk.dir") .eqs. ""
+$       then
+$           create/dir/prot=o:rwed vms_root1:[gawk]
+$       endif
+$   endif
+$endif
+$!
+$!
+$if ref .eqs. ""
+$then
+$   write sys$output "Unknown compare type specified!"
+$   exit 44
+$endif
+$!
+$!
+$!
+$! Future - check the device types involved for the
+$! the syntax to check.
+$ODS2_SYNTAX = 0
+$NFS_MANGLE = 0
+$PWRK_MANGLE = 0
+$!
+$vax = f$getsyi("HW_MODEL") .lt. 1024
+$if vax
+$then
+$   ODS2_SYNTAX = 1
+$endif
+$!
+$report_missing = 1
+$!
+$if .not. ODS2_SYNTAX
+$then
+$   set proc/parse=extended
+$endif
+$!
+$loop:
+$  ref_spec = f$search("''ref'...]*.*;",1)
+$  if ref_spec .eqs. "" then goto loop_end
+$!
+$  ref_dev = f$parse(ref_spec,,,"DEVICE")
+$  ref_dir = f$parse(ref_spec,,,"DIRECTORY")
+$  ref_dir = f$edit(ref_dir, "LOWERCASE")
+$  ref_name = f$parse(ref_spec,,,"NAME")
+$  ref_type = f$parse(ref_spec,,,"TYPE")
+$!
+$!
+$  if f$locate(".CVS]", ref_dir) .lt. f$length(ref_dir) then goto loop
+$  if f$locate(".cvs]", ref_dir) .lt. f$length(ref_dir) then goto loop
+$  if f$locate(".$cvs]", ref_dir) .lt. f$length(ref_dir) then goto loop
+$  if f$locate(".^.git", ref_dir) .lt. f$length(ref_dir) then goto loop
+$  if f$locate(".$5ngit", ref_dir) .lt. f$length(ref_dir) then goto loop
+$!
+$  rel_path = ref_dir - "[" - ref_base_dir
+$!  rel_path_len = f$length(rel_path) - 1
+$!  delim = f$extract(rel_path_len, 1, rel_path)
+$!  rel_path = rel_path - ".]" - ".>" - "]" - ">"
+$!  rel_path = rel_path + delim
+$!
+$  if ODS2_SYNTAX
+$  then
+$  endif
+$!
+$  wrk_path = wrk + rel_path
+$!
+$  ref_name_type = ref_name + ref_type
+$!
+$  if ref_name_type .eqs. "CVS.DIR" then goto loop
+$  if ref_name_type .eqs. "cvs.dir" then goto loop
+$  if ref_name_type .eqs. "$CVS.DIR" then goto loop
+$  if ref_name_type .eqs. "^.git.DIR" then goto loop
+$  if ref_name_type .eqs. "$5ngit.DIR" then goto loop
+$  if ref_name_type .eqs. "$5NGIT.DIR" then goto loop
+$  if ODS2_SYNTAX
+$  then
+$!
+$  endif
+$!
+$  wrk_spec = wrk_path + ref_name_type
+$!
+$!
+$  wrk_chk = f$search(wrk_spec, 0)
+$  if wrk_chk .eqs. ""
+$  then
+$    if report_missing
+$    then
+$      write sys$output "''wrk_spec' is missing"
+$    endif
+$    if update_file
+$    then
+$      copy/log 'ref_spec' 'wrk_spec'
+$    endif
+$    goto loop
+$  endif
+$!
+$  wrk_name = f$parse(wrk_spec,,,"NAME")
+$  wrk_type = f$parse(wrk_spec,,,"TYPE")
+$  wrk_fname = wrk_name + wrk_type"
+$  ref_fname = ref_name + ref_type
+$!
+$  if ref_fname .nes. wrk_fname
+$  then
+$    write sys$output "''wrk_spc' wrong name, should be ""''ref_fname'"""
+$  endif
+$!
+$  ref_type = f$edit(ref_type, "UPCASE")
+$  if ref_type .eqs. ".DIR" then goto loop
+$!
+$  if ODS2_SYNTAX
+$  then
+$       ref_fname = f$edit(ref_fname, "LOWERCASE")
+$  endif
+$!
+$! These files have records to long to diff, and we don't change them anyway.
+$  ref_skip = 0
+$  if ref_type .eqs. ".GMO" then ref_skip = 1
+$  if ref_type .eqs. ".PDF" then ref_skip = 1
+$  if ref_type .eqs. ".PNG" then ref_skip = 1
+$  if ref_type .eqs. ".JPG" then ref_skip = 1
+$  if ref_fname .eqs. "inftest.ok" then ref_skip = 1
+$  if ref_fname .eqs. "longsub.in" then ref_skip = 1
+$  if ref_fname .eqs. "longsub.ok" then ref_skip = 1
+$  if ref_fname .eqs. "nasty2.ok" then ref_skip = 1
+$  if ref_fname .eqs. "profile5.awk" then ref_skip = 1
+$  if ref_fname .eqs. "profile5.ok" then ref_skip = 1
+$  if ref_fname .eqs. "po.m4" then ref_skip = 1
+$  if ref_fname .eqs. "configure." then ref_skip = 1
+$  if ref_fname .eqs. "libtool.m4" then ref_skip = 1
+$!
+$!
+$  if ref_skip .ne. 0
+$  then
+$    if report_missing
+$    then
+$        write sys$output "Skipping diff of ''ref_fname'"
+$    endif
+$    goto loop
+$  endif
+$!
+$!
+$  wrk_ver = f$parse(wrk_chk,,,"VERSION")
+$  if wrk_ver .nes. ";1"
+$  then
+$    write sys$output "Version for ''wrk_spec' is not 1"
+$  endif
+$  set noon
+$  diff/out=nl: 'wrk_spec' 'ref_spec'
+$  if $severity .nes. "1"
+$  then
+$    write sys$output "''wrk_spec' is different from ''ref_spec'"
+$    if update_file
+$    then
+$       delete 'wrk_spec';*
+$       copy/log 'ref_spec' 'wrk_spec'
+$    endif
+$  endif
+$  set on
+$
+$!
+$  goto loop
+$loop_end:
+$!
+$!
+$missing_loop:
+$! For missing loop, check the latest generation.
+$  ref_spec = f$search("''wrk'...]*.*;")
+$  if ref_spec .eqs. "" then goto missing_loop_end
+$!
+$  ref_dev = f$parse(ref_spec,,,"DEVICE")
+$  ref_dir = f$parse(ref_spec,,,"DIRECTORY")
+$  ref_dir = f$edit(ref_dir, "LOWERCASE")
+$  ref_name = f$parse(ref_spec,,,"NAME")
+$  ref_type = f$parse(ref_spec,,,"TYPE")
+$!
+$  rel_path = ref_dir - "[" - wrk_base_dir
+$!
+$!
+$  wrk_path = ref + rel_path
+$  wrk_spec = wrk_path + ref_name + ref_type
+$  wrk_name = f$parse(wrk_spec,,,"NAME")
+$  wrk_type = f$parse(wrk_spec,,,"TYPE")
+$!
+$  wrk_fname = wrk_name + wrk_type"
+$  ref_fname = ref_name + ref_type
+$!
+$  wrk_skip = 0
+$  ref_utype = f$edit(ref_type,"UPCASE")
+$  ref_ufname = f$edit(ref_fname,"UPCASE")
+$!
+$!
+$  if wrk_skip .eq. 0
+$  then
+$     wrk_chk = f$search(wrk_spec, 0)
+$     if wrk_chk .eqs. ""
+$     then
+$         if report_missing
+$         then
+$             write sys$output "''wrk_spec' is missing"
+$         endif
+$         goto missing_loop
+$     endif
+$  else
+$     goto missing_loop
+$  endif
+$!
+$  if ref_fname .nes. wrk_fname
+$  then
+$    write sys$output "''wrk_spc' wrong name, should be ""''ref_fname'"""
+$  endif
+$!
+$  if ref_utype .eqs. ".DIR" then goto missing_loop
+$!
+$  wrk_ver = f$parse(wrk_chk,,,"VERSION")
+$  if wrk_ver .nes. ";1"
+$  then
+$    write sys$output "Version for ''wrk_spec' is not 1"
+$  endif
+$!
+$  goto missing_loop
+$!
+$!
+$missing_loop_end:
+$!
+$exit
diff --git a/gawk-5.0.1/vms/config_h.com b/gawk-5.0.1/vms/config_h.com
new file mode 100644
index 00000000000..0074a65a01a
--- /dev/null
+++ b/gawk-5.0.1/vms/config_h.com
@@ -0,0 +1,1661 @@
+$! File: config_h.com
+$!
+$! $Id: config_h.com,v 1.1.1.1 2012/12/02 19:25:21 wb8tyw Exp $
+$!
+$! This procedure attempts to figure out how to build a config.h file
+$! for the current project.
+$!
+$! The P1 parameter of "NOBUILTINS" inhibits the default #include <builtins.h>
+$! that is normally added.  This include can cause side effects if
+$! special VMS compiler settings are used.
+$!
+$! The CONFIGURE shell script will be examined for hints and a few symbols
+$! but most of the tests will not produce valid results on OpenVMS.  Some
+$! will produce false positives and some will produce false negatives.
+$!
+$! It is easier to just read the config.h_in file and make up tests based
+$! on what is in it!
+$!
+$! This file will create an empty config_vms.h file if one does not exist.
+$! The config_vms.h is intended for manual edits to handle things that
+$! this procedure can not.
+$!
+$! The config_vms.h will be invoked by the resulting config.h file.
+$!
+$! This procedure knows about the DEC C RTL on the system it is on.
+$! Future versions may be handle the GNV, the OpenVMS porting library,
+$! and others.
+$!
+$! This procedure may not guess the options correctly for all architectures,
+$! and is a work in progress.
+$!
+$! Copyright (C) 2014 the Free Software Foundation, Inc.
+$!
+$! This file is part of GAWK, the GNU implementation of the
+$! AWK Progamming Language.
+$!
+$! GAWK is free software; you can redistribute it and/or modify
+$! it under the terms of the GNU General Public License as published by
+$! the Free Software Foundation; either version 3 of the License, or
+$! (at your option) any later version.
+$!
+$! GAWK is distributed in the hope that it will be useful,
+$! but WITHOUT ANY WARRANTY; without even the implied warranty of
+$! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+$! GNU General Public License for more details.
+$!
+$! You should have received a copy of the GNU General Public License
+$! along with this program; if not, write to the Free Software
+$! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+$! USA
+$!
+$! Per assignment agreement with FSF, similar procedures may be present
+$! in other packages under other licensing agreements and copyrights
+$!
+$! 15-Jan-2001	J. Malmberg	Original
+$! 29-Apr-2001	J. Malmberg	Also look for config.*in* in a [.include]
+$!				subdirectory
+$! 30-Apr-2001	J. Malmberg	Update for SAMBA checks
+$! 09-Apr-2005	J. Malmberg	Update for RSYNC and large file.
+$! 29-Sep-2011	J. Malmberg	Update for Bash 4.2
+$! 01-Mar-2012	J. Malmberg	Warn about getcwd(0,0)
+$! 21-Dec-2012	J. Malmberg	Update for gawk
+$!============================================================================
+$!
+$ss_normal = 1
+$ss_abort = 44
+$ss_control_y = 1556
+$status = ss_normal
+$on control_y then goto control_y
+$on warning then goto general_error
+$!
+$! Some information for writing timestamps to created files
+$!----------------------------------------------------------
+$my_proc = f$environment("PROCEDURE")
+$my_proc_file = f$parse(my_proc,,,"NAME") + f$parse(my_proc,,,"TYPE")
+$tab[0,8] = 9
+$datetime = f$element(0,".",f$cvtime(,"ABSOLUTE","DATETIME"))
+$username = f$edit(f$getjpi("","USERNAME"),"TRIM")
+$!
+$pid = f$getjpi("","PID")
+$tfile1 = "SYS$SCRATCH:config_h_temp1_''pid'.TEMP"
+$dchfile = "SYS$SCRATCH:config_h_decc_''pid'.TEMP"
+$configure_script = "SYS$SCRATCH:configure_script_''pid'.TEMP"
+$!
+$!  Get the system type
+$!----------------------
+$arch_type = f$getsyi("arch_type")
+$!
+$! Does config_vms.h exist?
+$!-------------------------
+$update_config_vms = 0
+$file = f$search("sys$disk:[]config_vms.h")
+$if file .nes. ""
+$then
+$   write sys$output "Found existing custom file ''file'."
+$else
+$   update_config_vms = 1
+$   write sys$output "Creating new sys$disk:[]config_vms.h for you."
+$   gosub write_config_vms
+$endif
+$!
+$!
+$! On some platforms, DCL search has problems with searching a file
+$! on a NFS mounted volume.  So copy it to sys$scratch:
+$!
+$if f$search(configure_script) .nes. "" then delete 'configure_script';*
+$copy sys$disk:configure 'configure_script'
+$!
+$!
+$! Write out the header
+$!----------------------
+$gosub write_config_h_header
+$!
+$!
+$!
+$! config.h.in could have at least five different names depending
+$! on how it was transferred to OpenVMS
+$!------------------------------------------------------------------
+$cfile = f$search("sys$disk:[]config.h.in")
+$if cfile .eqs. ""
+$then
+$   cfile = f$search("sys$disk:[]config.h_in")
+$   if cfile .eqs. ""
+$   then
+$	cfile = f$search("sys$disk:[]configh.in")
+$	if cfile .eqs. ""
+$	then
+$	    cfile = f$search("sys$disk:[]config__2eh.in")
+$	    if cfile .eqs. ""
+$	    then
+$		cfile = f$search("sys$disk:[]config.h__2ein")
+$	    endif
+$	endif
+$   endif
+$endif
+$if f$trnlnm("PRJ_INCLUDE") .nes. ""
+$then
+$   cfile = f$search("PRJ_INCLUDE:config.h.in")
+$   if cfile .eqs. ""
+$   then
+$	cfile = f$search("PRJ_INCLUDE:config.h_in")
+$	if cfile .eqs. ""
+$	then
+$	    cfile = f$search("PRJ_INCLUDE:config__2eh.in")
+$	    if cfile .eqs. ""
+$	    then
+$		cfile = f$search("PRJ_INCLUDE:config__2eh.in")
+$		if cfile .eqs. ""
+$		then
+$		    cfile = f$search("PRJ_INCLUDE:config.h__2ein")
+$		endif
+$	    endif
+$	endif
+$    endif
+$endif
+$if cfile .eqs. ""
+$then
+$   write sys$output "Can not find sys$disk:config.h.in"
+$   line_out = "Looked for config.h.in, config.h_in, configh.in, "
+$   line_out = line_out + "config__2eh.in, "config.h__2ein"
+$   write/symbol sys$output line_out
+$   if f$trnlnm("PRJ_INCLUDE") .nes. ""
+$   then
+$	write sys$output "Also looked in PRJ_INCLUDE: for these files."
+$   endif
+$!
+$   write tf ""
+$   write tf -
+	"   /* Could not find sys$disk:config.h.in                           */"
+$   write tf -
+	"  /*  Looked also for config.h_in, configh.in, config__2eh.in,     */"
+$   write tf -
+	" /*   config.h__2ein						   */"
+$   if f$trnlnm("PRJ_INCLUDE") .nes. ""
+$   then
+$	write tf -
+	" /* Also looked in PRJ_INCLUDE: for these files.		  */"
+$   endif
+$   write tf -
+	"/*--------------------------------------------------------------*/
+$   write tf ""
+$   goto write_tail
+$endif
+$!
+$!
+$! Locate the DECC libraries in use
+$!-----------------------------------
+$decc_rtldef = f$parse("decc$rtldef","sys$library:.tlb;0")
+$decc_shr = f$parse("decc$shr","sys$share:.exe;0")
+$!
+$! Dump the DECC header names into a file
+$!----------------------------------------
+$if f$search(dchfile) .nes. "" then delete 'dchfile';*
+$if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$define/user sys$output 'tfile1'
+$library/list 'decc_rtldef'
+$open/read/error=rtldef_loop1_end tf1 'tfile1'
+$open/write/error=rtldef_loop1_end tf2 'dchfile'
+$rtldef_loop1:
+$   read/end=rtldef_loop1_end tf1 line_in
+$   line_in = f$edit(line_in,"TRIM,COMPRESS")
+$   key1 = f$element(0," ",line_in)
+$   key2 = f$element(1," ",line_in)
+$   if key1 .eqs. " " .or. key1 .eqs. "" then goto rtldef_loop1
+$   if key2 .nes. " " .and. key2 .nes. "" then goto rtldef_loop1
+$   write tf2 "|",key1,"|"
+$   goto rtldef_loop1
+$rtldef_loop1_end:
+$if f$trnlnm("tf1","lnm$process",,"SUPERVISOR") .nes. "" then close tf1
+$if f$trnlnm("tf2","lnm$process",,"SUPERVISOR") .nes. "" then close tf2
+$if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$!
+$!
+$! Now calculate what should be in the file from reading
+$! config.h.in and CONFIGURE.
+$!---------------------------------------------------------------
+$open/read inf 'cfile'
+$do_comment = 0
+$if_block = 0
+$cfgh_in_loop1:
+$!set nover
+$   read/end=cfgh_in_loop1_end inf line_in
+$   xline = f$edit(line_in,"TRIM,COMPRESS")
+$!
+$!  Blank line handling
+$!---------------------
+$   if xline .eqs. ""
+$   then
+$	write tf ""
+$	goto cfgh_in_loop1
+$   endif
+$   xlen = f$length(xline)
+$   key = f$extract(0,2,xline)
+$!
+$!  deal with comments by copying exactly
+$!-----------------------------------------
+$   if (do_comment .eq. 1) .or. (key .eqs. "/*")
+$   then
+$	do_comment = 1
+$	write tf line_in
+$	key = f$extract(xlen - 2, 2, xline)
+$	if key .eqs. "*/" then do_comment = 0
+$	goto cfgh_in_loop1
+$   endif
+$!
+$!  Some quick parsing
+$!----------------------
+$   keyif = f$extract(0,3,xline)
+$   key1 = f$element(0," ",xline)
+$   key2 = f$element(1," ",xline)
+$   key2a = f$element(0,"_",key2)
+$   key2b = f$element(1,"_",key2)
+$   key2_len = f$length(key2)
+$   key2_h = f$extract(key2_len - 2, 2, key2)
+$   key2_t = f$extract(key2_len - 5, 5, key2)
+$   if key2_t .eqs. "_TYPE" then key2_h = "_T"
+$   key64 = 0
+$   if f$locate("64", xline) .lt. xlen then key64 = 1
+$!
+$!write sys$output "xline = ''xline'"
+$!
+$!  Comment out this section of the ifblock
+$!-----------------------------------------
+$   if if_block .ge. 3
+$   then
+$	write tf "/* ", xline, " */"
+$	if keyif .eqs. "#en" then if_block = 0
+$	goto cfgh_in_loop1
+$   endif
+$!
+$!  Handle the end of an ifblock
+$!-------------------------------
+$   if keyif .eqs. "#en"
+$   then
+$	write tf xline
+$	if_block = 0
+$	goto cfgh_in_loop1
+$   endif
+$!
+$   if key1 .eqs. "#ifndef"
+$   then
+$!	Manual check for _ALL_SOURCE on AIX error
+$!-----------------------------------------------
+$	if key2 .eqs. "_ALL_SOURCE"
+$	then
+$	   write tf "/* ", xline, " */"
+$!
+$!	   Ignore the rest of the block
+$!--------------------------------------
+$	   if_block = 3
+$	   goto cfgh_in_loop1
+$	endif
+$   endif
+$!
+$!
+$!  Default action for an #if/#else/#endif
+$!------------------------------------------
+$   if keyif .eqs. "#if" .or. keyif .eqs. "#el"
+$   then
+$	if_block = 1
+$	write tf xline
+$	goto cfgh_in_loop1
+$   endif
+$!
+$!
+$!  Process "normal?" stuff
+$!---------------------------
+$   if key1 .eqs. "#undef"
+$   then
+$	key2c = f$element(2, "_", key2)
+$	if (key2c .eqs. "_") .or. (key2c .eqs. "H") then key2c = ""
+$	key2d = f$element(3, "_", key2)
+$	if (key2d .eqs. "_") .or. (key2d .eqs. "H") then key2d = ""
+$	key2e = f$element(4, "_", key2)
+$	if (key2e .eqs. "_") .or. (key2e .eqs. "H") then key2e = ""
+$	if key2d .eqs. "T"
+$	then
+$	    if key2e .eqs. "TYPE"
+$	    then
+$		key2_h = "_T"
+$		key2d = ""
+$	    endif
+$	endif
+$!
+$	double_under = 0
+$!
+$	if key2 .eqs. "bits16_t"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' short"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "u_bits16_t"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' unsigned short"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "bits32_t"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' int"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "u_bits32_t"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' unsigned int"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "intmax_t"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#ifdef __VAX"
+$	    write tf "#define ''key2' long"
+$	    write tf "#else"
+$	    write tf "#define ''key2' long long"
+$	    write tf "#endif"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "uintmax_t"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#ifdef __VAX"
+$	    write tf "#define ''key2' unsigned long"
+$	    write tf "#else"
+$	    write tf "#define ''key2' unsigned long long"
+$	    write tf "#endif"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "socklen_t"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' int"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "GETGROUPS_T"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' gid_t"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_SYS_SIGLIST"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 0"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_SYS_ERRLIST"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_STRUCT_DIRENT_D_INO"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!	! The header files have this information, however
+$!      ! The ioctl() call only works on sockets.
+$!	if key2 .eqs. "FIONREAD_IN_SYS_IOCTL"
+$!	then
+$!	    write tf "#ifndef ''key2'"
+$!	    write tf "#define ''key2' 1"
+$!	    write tf "#endif"
+$!	    goto cfgh_in_loop1
+$!	endif
+$!
+$!	! The header files have this information, however
+$!      ! The ioctl() call only works on sockets.
+$!	if key2 .eqs. "GWINSZ_IN_SYS_IOCTL"
+$!	then
+$!	    write tf "#ifndef ''key2'"
+$!	    write tf "#define ''key2' 1"
+$!	    write tf "#endif"
+$!	    goto cfgh_in_loop1
+$!	endif
+$!
+$!	! The header files have this information, however
+$!      ! The ioctl() call only works on sockets.
+$!	if key2 .eqs. "STRUCT_WINSIZE_IN_SYS_IOCTL"
+$!	then
+$!	    write tf "#ifndef ''key2'"
+$!	    write tf "#define ''key2' 0"
+$!	    write tf "#endif"
+$!	    goto cfgh_in_loop1
+$!	endif
+$!
+$	if key2 .eqs. "HAVE_STRUCT_TM_TM_ZONE"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_TM_ZONE"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_TIMEVAL"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_TZNAME"
+$	then
+$	    write tf "#if __CRTL_VER >= 70000000"
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "WEXITSTATUS_OFFSET"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 2"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_GETPW_DECLS"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_CONFSTR"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_PRINTF"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_SBRK"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_STRSIGNAL"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 0"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2a .eqs. "HAVE_DECL_STRTOLD"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 0"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_STRTOIMAX"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 0"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_STRTOL"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_STRTOLL"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_STRTOUL"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_STRTOULL"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_STRTOUMAX"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 0"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "GETPGRP_VOID"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "NAMED_PIPES_MISSING"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "OPENDIR_NOT_ROBUST"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "PGRP_PIPE"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "CAN_REDEFINE_GETENV"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_PRINTF_A_FORMAT"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "CTYPE_NON_ASCII"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_LANGINFO_CODESET"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_LC_MESSAGES"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!      This wants execve() to do this automagically to pass.
+$!	if key2 .eqs. "HAVE_HASH_BANG_EXEC"
+$!	then
+$!	    write tf "#ifndef ''key2'"
+$!	    write tf "#define ''key2' 1"
+$!	    write tf "#endif"
+$!	    goto cfgh_in_loop1
+$!	endif
+$!
+$	if key2 .eqs. "ICONV_CONST"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2'"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "VOID_SIGHANDLER"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_POSIX_SIGNALS"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "UNUSABLE_RT_SIGNALS"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2a .eqs. "HAVE_DECL_FPURGE"
+$	then
+$	    write tf "#ifndef ''key2a'"
+$	    write tf "#define ''key2a' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_DECL_SETREGID"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_POSIX_SIGSETJMP"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "HAVE_LIBDL"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "STRCOLL_BROKEN"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2 .eqs. "DUP_BROKEN"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!	This is for a test that getcwd(0,0) works.
+$!	It does not on VMS.
+$!--------------------------
+$	if key2 .eqs. "GETCWD_BROKEN"
+$	then
+$	    write sys$output ""
+$	    write sys$output -
+  "%CONFIG_H-I-NONPORT, ''key2' being tested for!"
+$		   write sys$output -
+ "-CONFIG_H-I-GETCWD, GETCWD(0,0) does not work on VMS."
+$		   write sys$output -
+ "-CONFIG_H-I-GETCWD2, Work around hack probably required."
+$		   write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$		    if update_config_vms
+$		    then
+$			open/append tfcv sys$disk:[]config_vms.h
+$			write tfcv ""
+$			write tfcv -
+		"/* Check config.h for use of ''key2' settings */"
+$			write tfcv ""
+$			close tfcv
+$		    endif
+$
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$	if key2a .eqs. "HAVE" .or. key2a .eqs. "STAT"
+$	then
+$!
+$!	    Process extra underscores
+$!------------------------------------
+$	    if f$locate("HAVE___", key2) .lt. key2_len
+$	    then
+$		key2b = "__" + key2d
+$		key2d = ""
+$		double_under = 1
+$	    else
+$		if f$locate("HAVE__", key2) .lt. key2_len
+$		then
+$		    key2b = "_" + key2c
+$		    key2c = ""
+$		    double_under = 1
+$		endif
+$	    endif
+$!
+$	    if key2_h .eqs. "_H"
+$	    then
+$!
+$!		Looking for a header file
+$!---------------------------------------
+$		headf = key2b
+$		if key2c .nes. "" then headf = headf + "_" + key2c
+$		if key2d .nes. "" then headf = headf + "_" + key2d
+$!
+$!		   (key2b .eqs. "READLINE")
+$!
+$!		Some special parsing
+$!------------------------------------------
+$		if (key2b .eqs. "SYS") .or. (key2b .eqs. "ARPA") .or. -
+		   (key2b .eqs. "NET") .or. (key2b .eqs. "NETINET")
+$		then
+$		    if key2c .nes. ""
+$		    then
+$			headf = key2c
+$			if key2d .nes. "" then headf = key2c + "_" + key2d
+$		    endif
+$		endif
+$!
+$!		And of course what's life with out some special cases
+$!--------------------------------------------------------------------
+$		if key2b .eqs. "FILE"
+$		then
+$		   write sys$output ""
+$		   write sys$output -
+  "%CONFIG_H-I-NONPORT, ''key2' being asked for!"
+$		   write sys$output -
+ "-CONFIG_H-I-FILE_OLD, file.h will not be configured as is obsolete!"
+$		   write sys$output -
+ "-CONFIG_H_I-FCNTL_NEW, "Expecting fcntl.h to be configured instead!"
+$		   write sys$output -
+ "-CONFIG_H_I-FCNTL_CHK, "Unable to verify at this time!"
+$		   write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$!
+$		    if update_config_vms
+$		    then
+$			open/append tfcv sys$disk:[]config_vms.h
+$			write tfcv ""
+$			write tfcv -
+		"/* Check config.h for use of fcntl.h instead of file.h */"
+$			write tfcv ""
+$			close tfcv
+$		    endif
+$		endif
+$!
+$!		Now look it up in the DEC C RTL
+$!---------------------------------------------
+$		define/user sys$output nl:
+$		define/user sys$error nl:
+$		search/output=nl: 'dchfile' |'headf'|/exact
+$		if '$severity' .eq. 1
+$		then
+$		    if key64 then write tf "#ifndef __VAX"
+$		    write tf "#ifndef ''key2'"
+$		    write tf "#define ''key2' 1"
+$if p2 .nes. "" then write sys$output "''dchfile' - #define ''key2' 1"
+$		    write tf "#endif"
+$		    if key64 then write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$	    else
+$!
+$!		Looking for a routine or a symbol
+$!------------------------------------------------
+$		if key2c .eqs. "MACRO"
+$		then
+$		    if (key2b .eqs. "FILE") .or. (key2b .eqs. "DATE") -
+			.or. (key2b .eqs. "LINE") .or. (key2b .eqs. "TIME")
+$		    then
+$			write tf "#ifndef HAVE_''key2b'"
+$			write tf "#define HAVE_''key2b' 1"
+$			write tf "#endif"
+$		    endif
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$!		Special false tests
+$!-------------------------------------
+$		if double_under
+$		then
+$		    if key2b .eqs. "_FCNTL" .or. key2b .eqs. "__FCNTL"
+$		    then
+$			write tf "/* #undef HAVE_''key2b' */"
+$			goto cfgh_in_loop1
+$		    endif
+$!
+$		    if key2b .eqs. "_STAT" .or. key2b .eqs. "__STAT"
+$		    then
+$			write tf "/* #undef HAVE_''key2b' */"
+$			goto cfgh_in_loop1
+$		    endif
+$!
+$		    if key2b .eqs. "_READ" .or. key2b .eqs. "__READ"
+$		    then
+$			write tf "/* #undef HAVE_''key2b' */"
+$			goto cfgh_in_loop1
+$		    endif
+$		endif
+$!
+$		keysym = key2b
+$		if key2c .nes. "" then keysym = keysym + "_" + key2c
+$		if key2d .nes. "" then keysym = keysym + "_" + key2d
+$		if key2e .nes. "" then keysym = keysym + "_" + key2e
+$!
+$!
+$!		Stat structure members
+$!-------------------------------------
+$		if key2b .eqs. "STRUCT"
+$		then
+$		    if key2c .eqs. "STAT" .and (key2d .nes. "")
+$		    then
+$			key2b = key2b + "_" + key2c + "_" + key2d
+$			key2c = key2e
+$			key2d = ""
+$			key2e = ""
+$		    endif
+$		endif
+$		if (key2b .eqs. "ST") .or. (key2b .eqs. "STRUCT_STAT_ST")
+$		then
+$		    keysym = "ST" + "_" + key2c
+$		    keysym = f$edit(keysym,"LOWERCASE")
+$		endif
+$		if key2a .eqs. "STAT"
+$		then
+$		    if (f$locate("STATVFS", key2b) .eq. 0) .and. key2c .eqs. ""
+$		    then
+$			keysym = f$edit(key2b, "LOWERCASE")
+$		    endif
+$!$		    if (key2b .eqs. "STATVFS" .or. key2b .eqs. "STATFS2" -
+$!			.or. key2b .eqs. "STATFS3") .and. key2c .nes. ""
+$!
+$		    if (key2b .eqs. "STATVFS") .and. key2c .nes. ""
+$		    then
+$!			Should really verify that the structure
+$!			named by key2b actually exists first.
+$!------------------------------------------------------------
+$!
+$!			Statvfs structure members
+$!-------------------------------------------------
+$			keysym = "f_" + f$edit(key2c,"LOWERCASE")
+$		    endif
+$		endif
+$!
+$!		UTMPX structure members
+$!--------------------------------------
+$		if key2b .eqs. "UT" .and. key2c .eqs. "UT"
+$		then
+$		    keysym = "ut_" + f$edit(key2d,"LOWERCASE")
+$		endif
+$!
+$		if f$locate("MMAP",key2) .lt. key2_len
+$		then
+$		   write sys$output ""
+$		   write sys$output -
+  "%CONFIG_H-I-NONPORT, ''key2' being asked for!"
+$		   write sys$output -
+ "-CONFIG_H-I-MMAP, MMAP operations only work on STREAM and BINARY files!"
+$		   write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$		    if update_config_vms
+$		    then
+$			open/append tfcv sys$disk:[]config_vms.h
+$			write tfcv ""
+$			write tfcv -
+		"/* Check config.h for use of ''key2' settings */"
+$			write tfcv ""
+$			close tfcv
+$		    endif
+$		endif
+$!
+$!
+$		if keysym .eqs. "CRYPT"
+$		then
+$		   write sys$output ""
+$		   write sys$output -
+  "%CONFIG_H-I-NONPORT, ''key2' being asked for!"
+$		   write sys$output -
+ "-CONFIG_H-I-CRYPT, CRYPT operations on the VMS SYSUAF may not work!"
+$		   write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$		    if update_config_vms
+$		    then
+$			open/append tfcv sys$disk:[]config_vms.h
+$			write tfcv ""
+$			write tfcv -
+		"/* Check config.h for use of ''keysym' */"
+$			write tfcv ""
+$			close tfcv
+$		    endif
+$		endif
+$!
+$!
+$		if keysym .eqs. "EXECL"
+$		then
+$		   write sys$output ""
+$		   write sys$output -
+  "%CONFIG_H-I-NONPORT, ''key2' being asked for!"
+$		   write sys$output -
+ "-CONFIG_H-I-EXCEL, EXECL configured, Will probably not work."
+$		   write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$		    if update_config_vms
+$		    then
+$			open/append tfcv sys$disk:[]config_vms.h
+$			write tfcv ""
+$			write tfcv -
+		"/* Check config.h for use of ''keysym' */"
+$			write tfcv ""
+$			close tfcv
+$		    endif
+$		endif
+$!
+$!
+$!		Process if cpp supports ANSI-C stringizing '#' operator
+$!-----------------------------------------------------------------------
+$		if keysym .eqs. "STRINGIZE"
+$		then
+$		    write tf "#ifndef HAVE_STRINGIZE"
+$		    write tf "#define HAVE_STRINGSIZE 1"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$		if keysym .eqs. "VOLATILE"
+$		then
+$		    write tf "#ifndef HAVE_VOLATILE"
+$		    write tf "#define HAVE_VOLATILE 1"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$		if keysym .eqs. "ALLOCA"
+$		then
+$		    write tf "#ifndef HAVE_ALLOCA"
+$		    write tf "#define HAVE_ALLOCA 1"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$		if keysym .eqs. "ERRNO_DECL"
+$		then
+$		    write tf "#ifndef HAVE_ERRNO_DECL"
+$		    write tf "#define HAVE_ERRNO_DECL 1"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$		if keysym .eqs. "LONGLONG"
+$		then
+$		    write tf "#ifndef __VAX"
+$		    write tf "#pragma message disable longlongtype"
+$		    write tf "#ifndef HAVE_LONGLONG"
+$		    write tf "#define HAVE_LONGLONG 1"
+$		    write tf "#endif"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$!		May need to test compiler version
+$!-----------------------------------------------
+$		if (keysym .eqs. "LONG_LONG") .or. -
+                   (keysym .eqs. "LONG_LONG_INT")
+$		then
+$		    write tf "#ifndef __VAX"
+$		    write tf "#pragma message disable longlongtype"
+$		    write tf "#ifndef HAVE_''keysym'"
+$		    write tf "#define HAVE_''keysym' 1"
+$		    write tf "#endif"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$!		May need to test compiler version
+$!-----------------------------------------------
+$		if keysym .eqs. "UNSIGNED_LONG_LONG"
+$		then
+$		    write tf "#ifndef __VAX"
+$		    write tf "#pragma message disable longlongtype"
+$		    write tf "#ifndef HAVE_UNSIGNED_LONG_LONG"
+$		    write tf "#define HAVE_UNSIGNED_LONG_LONG 1"
+$		    write tf "#endif"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$!		May need to test compiler version
+$!-----------------------------------------------
+$		if keysym .eqs. "UNSIGNED_LONG_LONG_INT"
+$		then
+$		    write tf "#ifndef __VAX"
+$		    write tf "#pragma message disable longlongtype"
+$		    write tf "#ifndef HAVE_UNSIGNED_LONG_LONG_INT"
+$		    write tf "#define HAVE_UNSIGNED_LONG_LONG_INT 1"
+$		    write tf "#endif"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$!		May need to test compiler version
+$!-----------------------------------------------
+$		if keysym .eqs. "LONG_DOUBLE"
+$		then
+$		    write tf "#ifndef __VAX"
+$		    write tf "#pragma message disable longlongtype"
+$		    write tf "#ifndef HAVE_LONG_DOUBLE"
+$		    write tf "#define HAVE_LONG_DOUBLE 1"
+$		    write tf "#endif"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$		if keysym .eqs. "FCNTL_LOCK"
+$		then
+$		    write sys$output -
+  "%CONFIG_H-I-NONPORT, ''key2' being asked for!
+$		   write sys$output -
+ "-CONFIG_H-I-REVIEW, Manual Code review required!"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$!
+$!		These libraries are provided by the DEC C RTL
+$!-------------------------------------------------------------
+$		if keysym .eqs. "LIBINET" .or. keysym .eqs. "LIBSOCKET"
+$		then
+$		    write tf "#ifndef HAVE_''keysym'"
+$		    write tf "#define HAVE_''keysym' 1"
+$if p2 .nes. "" then write sys$output "''decc_shr' #define ''keysym' 1"
+$		    write tf "#endif
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$!
+$		if keysym .eqs. "HERRNO" then keysym = "h_errno"
+$		if keysym .eqs. "UTIMBUF" then keysym = "utimbuf"
+$		if key2c .eqs. "STRUCT"
+$		then
+$		    keysym = f$edit(key2d,"LOWERCASE")
+$		else
+$		    if key2_h .eqs. "_T"
+$		    then
+$			if key2_t .eqs. "_TYPE"
+$			then
+$			    keysym = f$extract(0, key2_len - 5, key2) - "HAVE_"
+$			endif
+$			keysym = f$edit(keysym,"LOWERCASE")
+$		    endif
+$		endif
+$!
+$!		Check the DEC C RTL shared image first
+$!------------------------------------------------------
+$		if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$		define/user sys$output nl:
+$		define/user sys$error nl:
+$		search/format=nonull/out='tfile1' 'decc_shr' 'keysym'
+$		if '$severity' .eq. 1
+$		then
+$!
+$!		    Not documented, but from observation
+$!------------------------------------------------------
+$		    define/user sys$output nl:
+$		    define/user sys$error nl:
+$		    if arch_type .eq. 3
+$		    then
+$			keyterm = "''keysym'<SOH>"
+$		    else
+$			if arch_type .eq. 2
+$			then
+$			    keyterm = "''keysym'<BS>"
+$			else
+$			    keyterm = "''keysym'<STX>"
+$			endif
+$		    endif
+$		    search/out=nl: 'tfile1' -
+   "$''keyterm'","$g''keyterm'","$__utc_''keyterm'",-
+   "$__utctz_''keyterm'","$__bsd44_''keyterm'","$bsd_''keyterm'",-
+   "$''keysym'decc$","$G''keysym'decc$","$GX''keyterm'"
+$		    severity = '$severity'
+$!
+$!
+$!		    Of course the 64 bit stuff is different
+$!---------------------------------------------------------
+$		    if severity .ne. 1 .and. key64
+$		    then
+$			define/user sys$output nl:
+$		        define/user sys$error nl:
+$			search/out=nl: 'tfile1' "$_''keyterm'"
+$!			search/out 'tfile1' "$_''keyterm'"
+$			severity = '$severity'
+$		    endif
+$!
+$!		    UNIX compatability routines
+$!---------------------------------------------
+$		    if severity .ne. 1
+$		    then
+$			define/user sys$output nl:
+$			define/user sys$error nl:
+$			search/out=nl: 'tfile1' -
+    "$__unix_''keyterm'","$__vms_''keyterm'","$_posix_''keyterm'"
+$			severity = '$severity'
+$		    endif
+$!
+$!		    VAX special handling routines
+$!---------------------------------------------
+$		    if (severity .ne. 1) .and. (arch_type .eq. 1)
+$		    then
+$			define/user sys$output nl:
+$			define/user sys$error nl:
+$			search/out=nl: 'tfile1' "DECC$''keysym'<SOH>"
+$			severity = '$severity'
+$		    endif
+$!
+$!		    Show the result of the search
+$!------------------------------------------------
+$		    if 'severity' .eq. 1
+$		    then
+$			if key64 then write tf "#ifndef __VAX"
+$			write tf "#ifndef ''key2'"
+$			write tf "#define ''key2' 1"
+$if p2 .nes. "" then write sys$output "''decc_shr' #define ''key2' 1"
+$			write tf "#endif"
+$			if key64 then write tf "#endif"
+$			goto cfgh_in_loop1
+$		    endif
+$		endif
+$		if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$!
+$!		Check the DECC Header files next
+$!----------------------------------------------
+$		define/user sys$output nl:
+$		define/user sys$error nl:
+$		search/out=nl: 'decc_rtldef' -
+		    "''keysym';", "''keysym'[", "struct ''keysym'"/exact
+$		severity = '$severity'
+$		if severity .eq. 1
+$		then
+$		    if key64 then write tf "#ifndef __VAX"
+$		    write tf "#ifndef ''key2'"
+$		    write tf "#define ''key2' 1"
+$if p2 .nes. "" then write sys$output "''decc_rtldef' #define ''key2' 1"
+$		    write tf "#endif"
+$		    if key64 then write tf "#endif"
+$		    goto cfgh_in_loop1
+$		endif
+$!
+$	    endif
+$	    write tf "/* ", xline, " */"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!
+$!	Process SIZEOF directives found in SAMBA
+$!------------------------------------------------
+$	if key2a .eqs. "SIZEOF"
+$	then
+$	    if key2b .eqs. "INO" .and. key2_h .eqs. "_T"
+$	    then
+$		write tf "#ifndef SIZEOF_INO_T"
+$		write tf "#define SIZEOF_INO_T (6)"
+$		write tf "#endif"
+$		goto cfgh_in_loop1
+$	    endif
+$	    if key2b .eqs. "INTMAX" .and. key2_h .eqs. "_T"
+$	    then
+$		write tf "#ifndef SIZEOF_INTMAX_T"
+$		write tf "#ifdef __VAX"
+$		write tf "#define SIZEOF_INTMAX_T (4)"
+$		write tf "#else"
+$		write tf "#define SIZEOF_INTMAX_T (8)"
+$		write tf "#endif"
+$		write tf "#endif"
+$		goto cfgh_in_loop1
+$	    endif
+$	    if key2b .eqs. "OFF" .and. key2_h .eqs. "_T"
+$	    then
+$		write tf "#ifndef SIZEOF_OFF_T"
+$		write tf "#ifdef __VAX"
+$		write tf "#define SIZEOF_OFF_T (4)"
+$		write tf "#else"
+$		write tf "#define SIZEOF_OFF_T (8)"
+$		write tf "#endif"
+$		write tf "#endif"
+$		goto cfgh_in_loop1
+$	    endif
+$	    if key2b .eqs. "CHAR" .and. key2_h .eqs. "_P"
+$	    then
+$		write tf "#ifndef SIZEOF_CHAR_P"
+$		write tf "#define SIZEOF_CHAR_P (4)"
+$		write tf "#endif"
+$		goto cfgh_in_loop1
+$	    endif
+$	    if (key2b .eqs. "INT")
+$	    then
+$		write tf "#ifndef SIZEOF_''key2b'"
+$		write tf "#define SIZEOF_''key2b' (4)"
+$		write tf "#endif"
+$		goto cfgh_in_loop1
+$	    endif
+$	    if key2b .eqs. "UNSIGNED"
+$	    then
+$               if key2c .eqs. "INT" .or. key2c .eqs. "LONG"
+$               then
+$		    write tf "#ifndef SIZEOF_''key2b'_''key2c'"
+$		    write tf "#define SIZEOF_''key2b'_''key2c' (4)"
+$		    write tf "#endif"
+$		    goto cfgh_in_loop1
+$               endif
+$	    endif
+$	    if key2b .eqs. "DOUBLE"
+$	    then
+$		write tf "#ifndef SIZEOF_DOUBLE"
+$		write tf "#define SIZEOF_DOUBLE (8)"
+$		write tf "#endif"
+$		goto cfgh_in_loop1
+$	    endif
+$	    if key2b .eqs. "LONG"
+$	    then
+$		if key2c .eqs. ""
+$		then
+$		    write tf "#ifndef SIZEOF_LONG"
+$		    write tf "#define SIZEOF_LONG (4)"
+$		    write tf "#endif"
+$		else
+$		    write tf "#ifndef SIZEOF_LONG_LONG"
+$		    write tf "#ifndef __VAX"
+$		    write tf "#define SIZEOF_LONG_LONG (8)"
+$		    write tf "#endif"
+$		    write tf "#endif"
+$		endif
+$		goto cfgh_in_loop1
+$	    endif
+$	    if key2b .eqs. "SHORT"
+$	    then
+$		write tf "#ifndef SIZEOF_SHORT"
+$		write tf "#define SIZEOF_SHORT (2)"
+$		write tf "#endif"
+$		goto cfgh_in_loop1
+$	    endif
+$	    write tf "/* ", xline, " */"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!	Process NEED directives
+$!-------------------------------
+$	if key2a .eqs. "NEED"
+$	then
+$	    if key2b .eqs. "STRINGS" .and. key2_h .eqs. "_H"
+$	    then
+$		write tf "#ifndef NEED_STRINGS_H"
+$		write tf "#define NEED_STRINGS_H 1"
+$		write tf "#endif"
+$		goto cfgh_in_loop1
+$	    endif
+$	    write tf "/* ", xline, " */"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!
+$!	Process STATFS directives
+$!-------------------------------
+$!	if key2a .eqs. "STATFS"
+$!	then
+$!	    write tf "/* ", xline, " */"
+$!	    goto cfgh_in_loop1
+$!	endif
+$!
+$!	Process inline directive
+$!------------------------------
+$	if key2 .eqs. "inline"
+$	then
+$	    write tf "#ifndef inline"
+$	    write tf "#define inline __inline"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!	Process restrict directive
+$!--------------------------------
+$	if key2 .eqs. "restrict"
+$	then
+$	    write tf "#ifndef restrict"
+$	    write tf "#define restrict __restrict"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!	Process RETSIGTYPE directive
+$!----------------------------------
+$	if key2 .eqs. "RETSIGTYPE"
+$	then
+$	    write tf "#ifndef RETSIGTYPE"
+$	    write tf "#define RETSIGTYPE void"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!	Process STDC_HEADERS (SAMBA!)
+$!---------------------------
+$	if key2 .eqs. "STDC_HEADERS"
+$	then
+$	    write tf "#ifndef STDC_HEADERS"
+$	    write tf "#define STDC_HEADERS 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!	Process PROTOTYPES directive
+$!-------------------------------------
+$	if key2 .eqs. "PROTOTYPES"
+$	then
+$	    write tf "#ifndef PROTOTYPES"
+$	    write tf "#define PROTOTYPES 1"
+$	    write tf "#endif"
+$	    goto cfgh_in_loop1
+$	endif
+$!
+$!	Special for SEEKDIR_RETURNS_VOID
+$!---------------------------------------
+$	if key2 .eqs. "SEEKDIR_RETURNS_VOID"
+$	then
+$	    write tf "#ifndef SEEKDIR_RETURNS_VOID"
+$	    write tf "#define SEEKDIR_RETURNS_VOID 1"
+$	    write tf "#endif"
+$	endif
+$!
+$!      TIME_WITH_SYS_TIME note:  On VMS time.h and sys/time.h are same module.
+$!
+$!      TIME_T_IN_SYS_TYPES_H
+$!------------------------------
+$	if key2 .eqs. "TIME_T_IN_TYPES_H"
+$	then
+$	    write tf "#ifndef ''key2'"
+$	    write tf "#define ''key2' 1"
+$	    write tf "#endif"
+$	endif
+$!
+$!	Unknown - See if CONFIGURE can give a clue for this
+$!----------------------------------------------------------
+$	pflag = 0
+$	set_flag = 0
+$!	gproj_name = proj_name - "_VMS" - "-VMS"
+$	if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$	define/user sys$output nl:
+$	define/user sys$error nl:
+$!	if f$locate("FILE", key2) .lt. key2_len then pflag = 1
+$!	if f$locate("DIR", key2) .eq. key2_len - 3 then pflag = 1
+$!	if f$locate("PATH", key2) .eq. key2_len - 4 then pflag = 1
+$!
+$	search/out='tfile1' 'configure_script' "''key2'="/exact
+$	search_sev = '$severity'
+$	if 'search_sev' .eq. 1
+$	then
+$	    open/read/err=unknown_cf_rd_error sf 'tfile1'
+$search_file_rd_loop:
+$	    read/end=unknown_cf_rd_err sf line_in
+$	    line_in = f$edit(line_in, "TRIM")
+$	    skey1 = f$element(0,"=",line_in)
+$	    if skey1 .eqs. key2
+$	    then
+$		skey2 = f$element(1,"=",line_in)
+$		skey2a = f$extract(0,2,skey2)
+$!
+$!		Keep these two cases separate to make it easier to add
+$!		more future intelligence to this routine
+$!----------------------------------------------------------------------
+$		if skey2a .eqs. """`"
+$		then
+$!		    if pflag .eq. 1
+$!		    then
+$!			write tf "#ifndef ''key2'"
+$!			write tf "#define ",key2," """,gproj_name,"_",key2,""""
+$!			write tf "#endif"
+$!		    else
+$!			Ignore this for now
+$!------------------------------------------
+$			write tf "/* ", xline, " */"
+$!		    endif
+$		    set_flag = 1
+$		    goto found_in_configure
+$		endif
+$		if skey2a .eqs. """$"
+$		then
+$!		    if pflag .eq. 1
+$!		    then
+$!			write tf "#ifndef ''key2'"
+$!			write tf "#define ",key2," """,gproj_name,"_",key2,""""
+$!			write tf "#endif"
+$!		    else
+$!			Ignore this for now
+$!-------------------------------------------
+$			write tf "/* ", xline, " */"
+$!		    endif
+$		    set_flag = 1
+$		    goto found_in_configure
+$		endif
+$		if f$extract(0, 1, skey2) .eqs. "'"
+$		then
+$		    skey2 = skey2 - "'" - "'"
+$		endif
+$		write tf "#ifndef ''key2'"
+$		write tf "#define ",key2," """,skey2,""""
+$		write tf "#endif"
+$		set_flag = 1
+$	    else
+$		goto search_file_rd_loop
+$!		if pflag .eq. 1
+$!		then
+$!		    write tf "#ifndef ''key2'"
+$!		    write tf "#define ",key2," """,gproj_name,"_",key2,""""
+$!		    write tf "#endif"
+$!		    set_flag = 1
+$!		endif
+$	    endif
+$found_in_configure:
+$unknown_cf_rd_err:
+$	    if f$trnlnm("sf","lnm$process",,"SUPERVISOR") .nes. ""
+$	    then
+$		close sf
+$	    endif
+$	    if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$	    if set_flag .eq. 1 then goto cfgh_in_loop1
+$	endif
+$   endif
+$!
+$!
+$!
+$!  If it falls through everything else, comment it out
+$!-----------------------------------------------------
+$   write tf "/* ", xline, " */"
+$   goto cfgh_in_loop1
+$cfgh_in_loop1_end:
+$close inf
+$!
+$!
+$! Write out the tail
+$!--------------------
+$write_tail:
+$gosub write_config_h_tail
+$!
+$! Exit and clean up
+$!--------------------
+$general_error:
+$status = '$status'
+$all_exit:
+$set noon
+$if f$trnlnm("sf","lnm$process",,"SUPERVISOR") .nes. "" then close sf
+$if f$trnlnm("tf","lnm$process",,"SUPERVISOR") .nes. "" then close tf
+$if f$trnlnm("inf","lnm$process",,"SUPERVISOR") .nes. "" then close inf
+$if f$trnlnm("tf1","lnm$process",,"SUPERVISOR") .nes. "" then close tf1
+$if f$trnlnm("tf2","lnm$process",,"SUPERVISOR") .nes. "" then close tf2
+$if f$trnlnm("tfcv","lnm$process",,"SUPERVISOR") .nes. "" then close tfcv
+$if f$type(tfile1) .eqs. "STRING"
+$then
+$   if f$search(tfile1) .nes. "" then delete 'tfile1';*
+$endif
+$if f$type(dchfile) .eqs. "STRING"
+$then
+$   if f$search(dchfile) .nes. "" then delete 'dchfile';*
+$endif
+$if f$type(configure_script) .eqs. "STRING"
+$then
+$   if f$search(configure_script) .nes. "" then delete 'configure_script';*
+$endif
+$exit 'status'
+$!
+$!
+$control_y:
+$   status = ss_control_y
+$   goto all_exit
+$!
+$!
+$!
+$! Gosub to write a new config_vms.h
+$!-----------------------------------
+$write_config_vms:
+$outfile = "sys$disk:[]config_vms.h"
+$create 'outfile'
+$open/append tf 'outfile'
+$write tf "/* File: config_vms.h"
+$write tf "**"
+$write tf "** This file contains the manual edits needed for porting"
+$!write tf "** the ''proj_name' package to OpenVMS.
+$write tf "**"
+$write tf "** Edit this file as needed.  The procedure that automatically"
+$write tf "** generated this header stub will not overwrite or make any"
+$write tf "** changes to this file."
+$write tf "**"
+$write tf -
+ "** ", datetime, tab, username, tab, "Generated by ''my_proc_file'"
+$write tf "**"
+$write tf -
+ "**========================================================================*/"
+$write tf ""
+$close tf
+$return
+$!
+$! gosub to write out a documentation header for config.h
+$!----------------------------------------------------------------
+$write_config_h_header:
+$outfile = "sys$disk:[]config.h"
+$create 'outfile'
+$open/append tf 'outfile'
+$write tf "#ifndef CONFIG_H"
+$write tf "#define CONFIG_H"
+$write tf "/* File: config.h"
+$write tf "**"
+$write tf -
+  "** This file contains the options needed for porting "
+$write tf "** the project on a VMS system."
+$write tf "**"
+$write tf "** Try not to make any edits to this file, as it is"
+$write tf "** automagically generated."
+$write tf "**"
+$write tf "** Manual edits should be made to the config_vms.h file."
+$write tf "**"
+$write tf -
+ "** ", datetime, tab, username, tab, "Generated by ''my_proc_file'"
+$write tf "**"
+$write tf -
+ "**========================================================================*/"
+$write tf ""
+$write tf "#if (__CRTL_VER >= 70200000) && !defined (__VAX)"
+$write tf "#define _LARGEFILE 1"
+$write tf "#endif"
+$write tf ""
+$write tf "#ifndef __VAX"
+$write tf "#ifdef __CRTL_VER"
+$write tf "#if __CRTL_VER >= 80200000"
+$write tf "#define _USE_STD_STAT 1"
+$write tf "#endif"
+$write tf "#endif"
+$write tf "#endif"
+$write tf ""
+$!
+$if P1 .nes. "NOBUILTINS"
+$then
+$   write tf " /* Allow compiler builtins */"
+$   write tf "/*-------------------------*/"
+$   write tf "#ifdef __DECC_VER"
+$   write tf "#include <non_existant_dir:builtins.h>"
+$   write tf "#endif"
+$endif
+$!
+$write tf ""
+$return
+$!
+$! gosub to write out the tail for config.h and close it
+$!---------------------------------------------------------
+$write_config_h_tail:
+$write tf ""
+$write tf " /* Include the hand customized settings */"
+$write tf "/*--------------------------------------*/"
+$write tf "#include ""sys$disk:config_vms.h"""
+$write tf ""
+$write tf "#endif /* CONFIG_H */"
+$close tf
+$return
+$!
diff --git a/gawk-5.0.1/vms/descrip.mms b/gawk-5.0.1/vms/descrip.mms
new file mode 100644
index 00000000000..59816898885
--- /dev/null
+++ b/gawk-5.0.1/vms/descrip.mms
@@ -0,0 +1,418 @@
+# Descrip.MMS -- Makefile for building GNU awk on VMS.
+#
+# usage:
+#  $ MMS /Description=[.vms]Descrip.MMS gawk
+#	possibly add `/Macro=("GNUC=1")' to compile with GNU C,
+#	or add `/Macro=("GNUC=1","DO_GNUC_SETUP=1")' to compile with GNU C
+#	on a system where GCC is not installed as a defined command,
+#	or add `/Macro=("VAXC=1")' to compile with VAX C,
+#	or add `/Macro=("VAXC=1","CC=cc/VAXC")' to compile with VAX C on
+#	a system which has DEC C installed as the default compiler.
+#
+# gawk.exe :
+#	This is the default target.  DEC C has become the default compiler.
+#
+# awkgram.c :
+#	If you don't have bison but do have VMS POSIX or DEC/Shell,
+#	change the PARSER and PASERINIT macros to use yacc.  If you don't
+#	have either yacc or bison, you'll have to make sure that the
+#	distributed version of "awkgram.c" has its modification date later
+#	than the date of "awkgram.y", so that MMS won't try to build that
+#	target.  If you use bison and it is already defined system-wide,
+#	comment out the PARSERINIT definition.
+#
+# command.c :
+#	Similar to awkgram.c; built from command.y with yacc or bison.
+#
+# install.help :
+#	You can make the target 'install.help' to load the VMS help text
+#	into a help library.  Modify the HELPLIB macro if you don't want
+#	to put entry into the regular VMS library.  (If you use an alternate
+#	help library, it must already exist; this target won't create it.)
+#
+# gawk.dvi :
+#	If you have TeX, you can make the target 'gawk.dvi' to process
+#	_The_GAWK_Manual_ from gawk.texi.  You'll need to use a device
+#	specific post-processor on gawk.dvi in order to get printable data.
+#	The full output is approximately 325 pages.
+#
+
+# location of various source files, relative to the 'main' directory
+SUPPORT = [.support]
+VMSDIR	= [.vms]
+DOCDIR	= [.doc]
+MISSNGD	= [.missing_d]
+MAKEFILE = $(VMSDIR)Descrip.MMS
+
+# debugging &c		!'ccflags' is an escape to allow external compile flags
+#CCFLAGS = /noOpt/Debug
+
+# a comma separated list of macros to define
+# Do not specify _POSIX_EXIT here, other tricks are used for this.
+CDEFS	= "GAWK","HAVE_CONFIG_H"
+
+.ifdef GNUC
+# assumes VAX
+CC	= gcc
+CFLAGS	= /Incl=([],$(VMSDIR))/Obj=[]/Def=($(CDEFS)) $(CCFLAGS)
+LIBS	= gnu_cc:[000000]gcclib.olb/Library,sys$library:vaxcrtl.olb/Library
+.ifdef DO_GNUC_SETUP
+# in case GCC command verb needs to be manually defined
+.first
+	set command gnu_cc:[000000]gcc
+.endif	!DO_GNUC_SETUP
+.else	!!GNUC
+.ifdef VAXC
+# always VAX; versions of VAX C older than V3.2 won't work
+CC	= cc
+CFLAGS	= /Incl=[]/Obj=[]/Opt=noInline/Def=($(CDEFS)) $(CCFLAGS)
+LIBS	= sys$share:vaxcrtl.exe/Shareable
+.else	!!VAXC
+# neither GNUC nor VAXC, assume DECC (same for either VAX or Alpha)
+.ifdef __VAX__
+CFLOAT  =
+.else
+CFLOAT	= /float=ieee/ieee_mode=denorm_results
+.endif
+CNAME	= /NAME=(AS_IS,SHORT)
+CC	= cc/DECC/Prefix=All/NESTED_INCLUDE=NONE$(CFLOAT)
+CINC1   = [],[.VMS],$(SUPPORT)
+CFLAGS	= /Incl=($(CINC1))/Obj=[]/Def=($(CDEFS))$(CNAME) $(CCFLAGS)
+CEFLAGS = /Incl=($(CINC1),[.missing_d],[.extension])$(CNAME) $(CCFLAGS)
+LIBS	=	# DECC$SHR instead of VAXCRTL, no special link option needed
+.endif	!VAXC
+.endif	!GNUC
+
+
+PARSER	= bison
+PARSERINIT = set command gnu_bison:[000000]bison
+#PARSER	= yacc
+#PARSERINIT = yacc := posix/run/path=posix """/bin/yacc"
+#PARSERINIT = yacc := $shell$exe:yacc
+
+# this is used for optional target 'install.help'
+HELPLIB = sys$help:helplib.hlb
+#HELPLIB = sys$help:local.hlb
+
+#
+########  nothing below this line should need to be changed  ########
+#
+
+ECHO = write sys$output
+NOOP = continue
+
+# object files
+GAWKOBJ = eval.obj,profile.obj
+AWKOBJ1 = array.obj,awkgram.obj,builtin.obj,cint_array.obj,\
+	command.obj,debug.obj,dfa.obj,ext.obj,field.obj,\
+	floatcomp.obj,gawkapi.obj,gawkmisc.obj,getopt.obj,getopt1.obj
+
+AWKOBJ2 = int_array.obj,io.obj,localeinfo.obj,main.obj,mpfr.obj,msg.obj,\
+	node.obj,random.obj,re.obj,regex.obj,replace.obj,\
+	str_array.obj,symbol.obj,version.obj
+
+AWKOBJS = $(AWKOBJ1),$(AWKOBJ2)
+
+# VMSOBJS
+#	VMS specific stuff
+VMSCODE = vms_misc.obj,vms_popen.obj,vms_fwrite.obj,vms_args.obj,\
+	vms_gawk.obj,vms_cli.obj,vms_crtl_init.obj
+VMSCMD	= gawk_cmd.obj			# built from .cld file
+VMSOBJS = $(VMSCODE),$(VMSCMD)
+
+DOCS= $(DOCDIR)gawk.1,$(DOCDIR)gawk.texi,$(DOCDIR)texinfo.tex
+
+# generic target
+all : gawk gawk_debug
+      @	$(NOOP)
+
+# dummy target to allow building "gawk" in addition to explicit "gawk.exe"
+gawk : gawk.exe
+      @	$(ECHO) "$< is upto date"
+
+gawk_debug : gawk_debug.exe
+      @	$(ECHO) "$< is upto date"
+
+# rules to build gawk
+gawk.exe : $(GAWKOBJ) $(AWKOBJS) $(VMSOBJS) gawk.opt
+	$(LINK) $(LINKFLAGS)/EXE=$(MMS$TARGET) gawk.opt/options
+
+gawk_debug.exe : $(GAWKOBJ) $(AWKOBJS) $(VMSOBJS) gawk.opt
+	$(LINK) $(LINKFLAGS)/DEBUG/EXE=$(MMS$TARGET) gawk.opt/options
+
+gawk.opt : $(MAKEFILE) config.h         # create linker options file
+      @	open/write opt sys$disk:[]gawk.opt	! ~ 'cat <<close >gawk.opt'
+      @	write opt "! GAWK -- GNU awk"
+      @ write opt "$(GAWKOBJ)"
+      @ write opt "$(AWKOBJ1)"
+      @ write opt "$(AWKOBJ2)"
+      @ write opt "$(VMSOBJS)"
+      @ write opt "psect_attr=environ,noshr	!extern [noshare] char **"
+      @ write opt "stack=48	!preallocate more pages (default is 20)"
+      @ write opt "iosegment=128	!ditto (default is 32)"
+      @	write opt "$(LIBS)"
+      @ close opt
+      $ @$(VMSDIR)gawk_ident.com
+
+$(VMSCODE)	: awk.h config.h $(VMSDIR)redirect.h $(VMSDIR)vms.h
+$(AWKOBJS)	: awk.h gettext.h mbsupport.h $(SUPPORT)regex.h \
+		  $(SUPPORT)dfa.h config.h $(VMSDIR)redirect.h
+$(GAWKOBJ)	: awk.h config.h $(VMSDIR)redirect.h
+
+#-----------------------------------------------------------------------------
+# Older versions of MMS have problems handling lower case file names typically
+# found on ODS-5 disks. Fix this by adding explicit dependencies.
+#_____________________________________________________________________________
+
+array.obj	: array.c
+awkgram.obj	: awkgram.c awk.h
+builtin.obj	: builtin.c floatmagic.h $(SUPPORT)random.h
+cint_array.obj	: cint_array.c
+command.obj	: command.c cmd.h
+debug.obj	: debug.c cmd.h
+dfa.obj		: $(SUPPORT)dfa.c $(SUPPORT)dfa.h
+ext.obj		: ext.c
+eval.obj	: eval.c
+field.obj	: field.c
+floatcomp.obj	: floatcomp.c
+gawkaoi.obj	: gawkapi.c
+gawkmisc.obj	: gawkmisc.c $(VMSDIR)gawkmisc.vms
+getopt.obj	: $(SUPPORT)getopt.c
+getopt1.obj	: $(SUPPORT)getopt1.c
+int_array.obj	: int_array.c
+io.obj		: io.c
+localeinfo.obj  : $(SUPPORT)localeinfo.c
+main.obj	: main.c
+msg.obj		: msg.c
+mpfr.obj	: mpfr.c
+node.obj	: node.c
+profile.obj	: profile.c
+random.obj	: $(SUPPORT)random.c $(SUPPORT)random.h
+re.obj		: re.c
+regex.obj	: $(SUPPORT)regex.c $(SUPPORT)regcomp.c \
+		  $(SUPPORT)regex_internal.c $(SUPPORT)regexec.c \
+		  $(SUPPORT)regex.h $(SUPPORT)regex_internal.h
+str_array.obj	: str_array.c
+symbol.obj	: symbol.c
+version.obj	: version.c
+vms_misc.obj	: $(VMSDIR)vms_misc.c
+vms_popen.obj	: $(VMSDIR)vms_popen.c
+vms_fwrite.obj	: $(VMSDIR)vms_fwrite.c
+vms_args.obj	: $(VMSDIR)vms_args.c
+vms_gawk.obj	: $(VMSDIR)vms_gawk.c
+vms_cli.obj	: $(VMSDIR)vms_cli.c
+vms_crtl_init.obj : $(VMSDIR)vms_crtl_init.c
+replace.obj	: replace.c $(MISSNGD)system.c $(MISSNGD)memcmp.c \
+		  $(MISSNGD)memcpy.c $(MISSNGD)memset.c $(MISSNGD)memmove.c \
+		  $(MISSNGD)strncasecmp.c $(MISSNGD)strerror.c \
+		  $(MISSNGD)strftime.c $(MISSNGD)strchr.c $(MISSNGD)strtod.c \
+		  $(MISSNGD)strtoul.c $(MISSNGD)tzset.c $(MISSNGD)mktime.c \
+		  $(MISSNGD)snprintf.c $(MISSNGD)getaddrinfo.c \
+		  $(MISSNGD)usleep.c \
+		  $(MISSNGD)setenv.c $(MISSNGD)strcoll.c $(MISSNGD)wcmisc.c
+
+# bison or yacc have not been ported to current VMS versions
+# When that changes, this can be restored.
+# bison or yacc required
+# awkgram.c	: awkgram.y	# foo.y :: yacc => y[_]tab.c, bison => foo_tab.c
+#     @- if f$search("ytab.c")	.nes."" then  delete ytab.c;*	 !POSIX yacc
+#     @- if f$search("y_tab.c")	.nes."" then  delete y_tab.c;*	 !DEC/Shell yacc
+#     @- if f$search("awkgram_tab.c").nes."" then  delete awkgram_tab.c;* !bison
+#      - $(PARSERINIT)
+#	$(PARSER) $(YFLAGS) $<
+#     @- if f$search("ytab.c")	.nes."" then  rename/new_vers ytab.c  $@
+#     @- if f$search("y_tab.c")	.nes."" then  rename/new_vers y_tab.c $@
+#     @- if f$search("awkgram_tab.c").nes."" then \
+#            rename/new_vers awkgram_tab.c $@
+
+# command.c	: command.y
+#     @- if f$search("ytab.c")	.nes."" then  delete ytab.c;*
+#     @- if f$search("y_tab.c")	.nes."" then  delete y_tab.c;*
+#     @- if f$search("command_tab.c").nes."" then  delete command_tab.c;*
+#      - $(PARSERINIT)
+#	$(PARSER) $(YFLAGS) $<
+#     @- if f$search("ytab.c")	.nes."" then  rename/new_vers ytab.c  $@
+#     @- if f$search("y_tab.c")	.nes."" then  rename/new_vers y_tab.c $@
+#     @- if f$search("command_tab.c").nes."" then \
+#            rename/new_vers command_tab.c $@
+
+config_vms.h : $(VMSDIR)generate_config_vms_h_gawk.com
+     $ @$(VMSDIR)generate_config_vms_h_gawk.com
+
+config.h	: configh.in config_vms.h $(VMSDIR)config_h.com
+     $ @$(VMSDIR)config_h.com
+
+$(VMSCMD)	: $(VMSDIR)gawk.cld
+	set command $(CLDFLAGS)/object=$@ $<
+
+# special target for loading the help text into a VMS help library
+install.help	: $(VMSDIR)gawk.hlp
+	library/help $(HELPLIB) $< /log
+
+
+# Build dynamic extensions - Alpha/Itanium only.
+.ifdef __VAX__
+# VAX not complete yet.
+plug_opt = [.VMS.VAX]gawk_plugin_xfer.opt
+.else
+plug_opt = [.vms]gawk_plugin.opt
+.endif
+
+ext_gawkdirfd_h = [.extension]gawkdirfd.h config.h nonposix.h
+
+extensions : filefuncs.exe fnmatch.exe inplace.exe ordchr.exe readdir.exe \
+	revoutput.exe revtwoway.exe rwarray.exe testext.exe time.exe
+
+filefuncs.exe : filefuncs.obj stack.obj gawkfts.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), stack.obj, gawkfts.obj, \
+		$(plug_opt)/opt
+
+fnmatch.exe : fnmatch.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), $(plug_opt)/opt
+
+inplace.exe : inplace.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), $(plug_opt)/opt
+
+ordchr.exe : ordchr.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), $(plug_opt)/opt
+
+readdir.exe : readdir.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), $(plug_opt)/opt
+
+revoutput.exe : revoutput.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), $(plug_opt)/opt
+
+revtwoway.exe : revtwoway.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), $(plug_opt)/opt
+
+rwarray.exe : rwarray.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), $(plug_opt)/opt
+
+testext.exe : testext.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), $(plug_opt)/opt
+
+time.exe : time.obj $(plug_opt)
+	link/share=$(MMS$TARGET) $(MMS$SOURCE), $(plug_opt)/opt
+
+stack.obj : [.extension]stack.c config.h gawkapi.h \
+	[.extension]gawkfts.h, [.extension]stack.h
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H)/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+gawkfts.obj : [.extension]gawkfts.c config.h [.extension]gawkfts.h \
+	$(ext_gawkdirfd_h)
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H, ZOS_USS, "fchdir(x)=(-1)") \
+	/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+filefuncs.obj : [.extension]filefuncs.c config.h gawkapi.h \
+	[.extension]gawkfts.h
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H)/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+fnmatch.obj : [.extension]fnmatch.c config.h gawkapi.h \
+	[.missing_d]fnmatch.h [.missing_d]fnmatch.c
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H)/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+inplace.obj : [.extension]inplace.c config.h gawkapi.h
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H)/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+ordchr.obj : [.extension]ordchr.c config.h gawkapi.h
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H)/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+readdir.obj : [.extension]readdir.c config.h gawkapi.h \
+	$(ext_gawkdirfd_h)
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H, HAVE_DIRENT_H) \
+	/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+revoutput.obj : [.extension]revoutput.c config.h gawkapi.h
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H)/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+revtwoway.obj : [.extension]revtwoway.c config.h gawkapi.h
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H, HAVE_GETDTABLESIZE) \
+	/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+rwarray.obj : [.extension]rwarray.c config.h gawkapi.h
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H)/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+testext.obj : [.extension]testext.c config.h gawkapi.h
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H)/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+time.obj : [.extension]time.c config.h gawkapi.h
+    $(CC)$(CEFLAGS)/define=(HAVE_CONFIG_H)/object=$(MMS$TARGET) $(MMS$SOURCE)
+
+
+# miscellaneous other targets
+tidy :
+      - if f$search("*.*;-1").nes."" then  purge
+      - if f$search("[.*]*.*;-1").nes."" then  purge [.*]
+
+clean :
+      - if f$search ("*.obj")    .nes. "" then delete *.obj;*
+      - if f$search ("*.lis")    .nes. "" then delete *.lis;*
+      - if f$search ("gawk.opt") .nes. "" then delete gawk.opt;*
+
+spotless : clean tidy
+      - if f$search("config.h").nes."" then delete config.h;*
+      - if f$search("config_vms.h").nes."" then delete config_vms.h;*
+      - if f$search("gawk.exe").nes."" then  delete gawk.exe;*
+      - if f$search("*.dsf").nes."" then  delete *.dsf;*
+      - if f$search("*.map").nes."" then  delete *.map;*
+      - if f$search("*.pcsi$desc").nes."" then  delete *.pcsi$desc;*
+      - if f$search("*.pcsi$text").nes."" then  delete *.pcsi$text;*
+      - if f$search("gawk*_src.bck").nes."" then  delete gawk*_src.bck;*
+      - if f$search("*.release_notes").nes."" then  delete *.release_notes;*
+      - if f$search("filefuncs.exe").nes."" then  delete filefuncs.exe;*
+      - if f$search("fnmatch.exe").nes."" then  delete fnmatch.exe;*
+      - if f$search("inplace.exe").nes."" then  delete inplace.exe;*
+      - if f$search("ordchr.exe").nes."" then  delete ordchr.exe;*
+      - if f$search("readdir.exe").nes."" then  delete readdir.exe;*
+      - if f$search("revoutput.exe").nes."" then  delete revoutput.exe;*
+      - if f$search("revtwoway.exe").nes."" then  delete revtwoway.exe;*
+      - if f$search("rwarray.exe").nes."" then  delete rwarray.exe;*
+      - if f$search("testext.exe").nes."" then  delete testext.exe;*
+      - if f$search("time.exe").nes."" then  delete time.exe;*
+      - if f$search("gawk_verb.cld").nes."" then  delete gawk_verb.cld;*
+      - if f$search("gawk.dvi").nes."" then  delete gawk.dvi;*
+      - if f$search("[.doc]texindex.exe").nes."" then \
+            delete [.doc]texindex.exe;*
+      - if f$search("[.cxx_repository]*.*;").nes."" then \
+            delete [.cxx_repository]*.*;*
+
+#
+# Note: this only works if you kept a copy of [.support]texindex.c
+# from a gawk 2.x distribution and put it into [.doc]texindex.c.
+# Also, depending on the fonts available with the version of TeX
+# you have, you might need to edit [.doc]texinfo.tex and change
+# the reference to "lcircle10" to be "circle10".
+#
+# build gawk.dvi from within the 'doc' subdirectory
+#
+gawk.dvi : [.doc]texindex.exe [.doc]gawk.texi
+      @ set default [.doc]
+      @ write sys$output " Warnings from TeX are expected during the first pass"
+	TeX gawk.texi
+	mcr []texindex gawk.cp gawk.fn gawk.ky gawk.pg gawk.tp gawk.vr
+      @ write sys$output " Second pass"
+	TeX gawk.texi
+	mcr []texindex gawk.cp gawk.fn gawk.ky gawk.pg gawk.tp gawk.vr
+      @ write sys$output " Third (final) pass"
+	TeX gawk.texi
+     -@ purge
+     -@ delete \
+         gawk.lis;,.aux;,gawk.%%;,.cps;,.fns;,.kys;,.pgs;,.toc;,.tps;,.vrs;
+      @ rename/new_vers gawk.dvi [-]*.*
+      @ set default [-]
+
+# Note: [.doc]texindex.c is not included with the gawk 3.x distribution.
+# Expect lots of "implicitly declared function" diagnostics from DEC C.
+#
+[.doc]texindex.exe : [.doc]texindex.c
+      @ set default [.doc]
+	$(CC) /noOpt/noList/Define=("lines=tlines") texindex.c
+      @ open/Write opt texindex.opt
+      @ write opt "texindex.obj"
+      @ write opt "$(LIBS)"
+      @ close opt
+	$(LINK) /noMap/Exe=texindex.exe texindex.opt/Options
+     -@ delete texindex.obj;*,texindex.opt;*
+      @ set default [-]
+
+#eof
diff --git a/gawk-5.0.1/vms/gawk.cld b/gawk-5.0.1/vms/gawk.cld
new file mode 100644
index 00000000000..2848e7e42e3
--- /dev/null
+++ b/gawk-5.0.1/vms/gawk.cld
@@ -0,0 +1,79 @@
+!   Gawk.Cld -- command defintion for GAWK
+!							Pat Rankin, Nov'89
+!						[ revised for 2.12, May'91 ]
+!						[ revised for 4.0.0, Feb'11 ]
+!
+!	This command definition is compiled into an object module which is
+!	linked into all three programs, GAWK, DGAWK, and PGAWK, and it is
+!	not able to use syntax-switching qualifers to invoke the different
+!	images gawk.exe, dgawk.exe, and pgawk.exe.  To use dgawk or pgawk
+!	when this command definition is installed as a native command, use
+!	$ define gawk location:dgawk.exe
+!   or	$ define gawk location:pgawk.exe
+!
+  module Gawk_Cmd
+define verb GAWK
+    synonym AWK
+! image gawk		!usage $ DEFINE GAWK disk:[directory]GAWK
+    parameter p1,   value(required,list), label=gawk_p1, prompt="data file(s)"
+    qualifier input,	value(required,list,type=$infile), label=progfile
+    qualifier commands, value(required), label=program
+    qualifier extra_commands, value(required), label=moreprog
+    qualifier field_separator, value(required), label=field_sep
+    qualifier variables, value(required,list)
+    qualifier usage
+    qualifier copyright
+    qualifier version
+    qualifier lint, value(list,type=lint_keywords)
+    qualifier posix
+    qualifier strict,	negatable   !synonym for /traditional
+    qualifier traditional,	negatable
+    qualifier re_interval,	negatable !only used with /traditional
+    qualifier sandbox
+    qualifier debug,	negatable   !obsolete; debug via separate DGAWK program
+    qualifier output,	value(type=$outfile,default="SYS$OUTPUT")
+    qualifier optimize,	negatable   !actually on always; negation is ignored
+    qualifier profile,	value(type=$outfile,default="awkprof.out")
+    qualifier dump_variables, value(type=$outfile,default="awkvars.out")
+    qualifier non_decimal_data
+    qualifier characters_as_bytes
+    qualifier use_lc_numeric
+    qualifier gen_pot
+    qualifier reg_expr, value(type=reg_expr_keywords)		!(OBSOLETE)
+    disallow  progfile and program  !or not progfile and not program
+    !disallow lint.warn and (lint.fatal or lint.invalid)
+define type lint_keywords
+    keyword warn,	default
+    keyword fatal	!lint warnings terminate execution
+    keyword invalid	!warn about invalid constructs but not extensions
+    keyword old		!warn about constructs not available in original awk
+define type reg_expr_keywords
+    keyword awk
+    keyword egrep,	default		!synonym for 'posix'
+    keyword posix			!equivalent to 'egrep'
+!
+!  p1	    = data file list (possibly including 'var=value' contructs)
+!note: parameter required; use 'sys$input:' to read data from 'stdin'
+! /input    = program source file ('-f progfile')
+! /commands = program source text ('program')
+!note: either input or commands, but not both; if neither, usage message given
+! /extra_commands = additional program source text; may be combined with /input
+! /field_separator = character(s) delimiting record fields; default is "[ \t]"
+! /reg_expr = obsolete
+! /variables = list of 'var=value' items for assignment prior to BEGIN
+! /posix    = force POSIX compatability mode operation
+! /sandbox  = disable I/O redirection and use of system() to execute commands
+! /strict   = synonym for /traditional
+! /traditional = force compatability mode operation (UN*X SYS V, Release 4)
+! /re_interval = for /traditional, regular expressions allow interval ranges
+! /output   = destination for print,printf (default is sys$output: ie, 'stdout')
+! /lint     = scan the awk program for possible problems and warn about them
+! /optimize = parse-time evaluation of constant [sub-]expressions only
+! /debug    = debugging mode; no-op unless program built using `#define DEBUG'
+! /dump_var = at program termination, write out final values for all variables
+! /profile  = collect all parts of the parsed awk program into awkprof.out
+!note: use separate pgawk program to collect run-time execution profiling
+! /usage    = display 'usage' reminder [describing this VMS command syntax]
+! /version  = show program version and quit; also shows copyright notice
+! /copyright = show abbreviated edition of FSF's copyright notice and quit
+!
diff --git a/gawk-5.0.1/vms/gawk.hlp b/gawk-5.0.1/vms/gawk.hlp
new file mode 100644
index 00000000000..a14ad72b983
--- /dev/null
+++ b/gawk-5.0.1/vms/gawk.hlp
@@ -0,0 +1,1704 @@
+! Gawk.Hlp
+!                                                       Pat Rankin, Jun'90
+!                                                          revised, Jun'91
+!                                                          revised, Jul'92
+!                                                          revised, Jan'95
+!                                                          revised, Apr'97
+!                                                          revised, Jan'03
+!                                                          revised, May'11
+!   Online help for GAWK.
+!
+1 GAWK
+ GAWK is GNU awk, the Free Software Foundation's implementation of
+ the awk programming language.  awk is an interpretive language which
+ can handle many data-reformatting jobs with just a few lines of code.
+ It has powerful string manipulation and pattern matching capabilities
+ built in.  This version is compatible with POSIX 1003.2 awk.
+
+ The VMS version of GAWK supports both the original UN*X-style command
+ interface and a DCL interface.  The only setup requirement for GAWK
+ is to define it as a 'foreign' command:  a DCL symbol with a value
+ which begins with '$'.
+       $ GAWK :== $disk:[directory]GAWK
+2 GNU_syntax
+ GAWK's UN*X-style interface uses the 'dash' convention for specifying
+ options and uses spaces to separate multiple arguments.
+
+ There are two main alternatives, depending on how the awk program is
+ to be passed to GAWK.  Both alternatives share most options.
+
+ Usage: $ gawk [-Wopts] [-F fs] [-v var=val] -f progfile [--] file ...
+    or  $ gawk [-Wopts] [-F fs] [-v var=val] [--] "program" file ...
+
+ The options are case-sensitive.  On VMS, the DCL command interpreter
+ converts unquoted text into uppercase before passing it to the running
+ program.  However, GAWK is written in 'C' and the C Run-Time Library
+ (VAXCRTL or DECC$SHR) converts unquoted text into *lowercase*.
+ Therefore, the -Fval and -W options must be enclosed in quotes.
+3 options
+ -d[file]        dump variable values into file (default is awkvars.out
+                 if not specified) upon program completion
+ -e program_text additional program text, as a quoted string, for use
+                 in combination with -f
+ -f file         use the specified file as the awk program source; if
+                 more than one instance of -f is used, each file will
+                 be read in succession
+ -Fstring        define a value for the FS variable (field separator)
+ -O              optimize; of limited use
+ -p[file]        write program execution profiling into file (default
+                 is awkprof.out if not specified)
+ -v var=val      assign a value of 'val' to the variable 'var'
+ -W'options'     additional gawk-specific options; multiple values may
+                 be separated by commas, or by spaces if they're quoted,
+                 or mulitple occurrences of -W may be used.
+ -Wcopyright     display an abbreviated version of the GNU copyright
+                 information
+ -Whelp          list command line options (supersedes -Wusage)
+ -Wlint          warn about suspect or non-portable awk program code
+ -Wlint=fatal    treat lint warnings as errors
+ -Wlint-old      warn about constructs not available in original awk
+ -Wposix         traditional mode with additional restrictions
+ -Wre-interval   evaluate '{' and '}' as intervals in regular expressions
+ -Wtraditional   use awk compatibility mode to disable GAWK extensions
+                 and get the behavior of UN*X awk.
+ -Wversion       display program version number
+ --              don't check further arguments for leading dash
+3 program_text
+ If the '-f file' option is not used on the command line, then the
+ first "non-dash" argument is assumed to be a string of text containing
+ the awk source program.  Here is a complete sample program:
+       $ gawk -- "BEGIN {print ""\nHello, World!\n""}"
+ This program would print a blank line (based on first "\n"), followed
+ by a line reading "Hello, World!", followed by another blank line
+ (since awk's 'print' statement includes the trailing 'newline').
+
+ On VMS, to include a quote character inside of a quoted string, two
+ successive quotes ("") must be used.
+3 data_files
+ After all dash-options are examined, and after the program text if
+ there were no occurrences of the -f option, remaining (space separated)
+ command line arguments are considered to be data files for the awk
+ program to process.  If any of these actually contains an equals sign
+ (=), then it is interpreted as a variable assignment instead of a data
+ file.  The syntax is 'variable_name=value'.  For example, the command
+       $ gawk -f myprog.awk infile.one flag=2 start=0 infile.two
+ would read file 'infile.one' for the program in 'myprog.awk', then it
+ would set 'flag' to 2 and 'start' to 0, and finally it would read file
+ 'infile.two' for the program.  Note that in a case like this, the two
+ assignments actually occur after the first file has been processed,
+ not at program startup when the command line is first scanned.
+3 IO_redirection
+ The command parsing in the VMS implementation of GAWK does some
+ emulation of a UN*X-style shell, where certain characters on the
+ command line have special meaning.  In particular, the symbols '<',
+ '>', '|', '*', and '?' receive special handling before the main part
+ of the program has a chance to see them.  The symbols '<' and '>'
+ perform some file manipulation from the command line:
+
+ <ifile     open file 'ifile' (readonly) as 'stdin' [SYS$INPUT]
+ >nfile     create 'nfile' as 'stdout' [SYS$OUTPUT], in stream-lf format
+ >>ofile    append to 'ofile' for 'stdout'; create it if necessary
+ >&efile    point 'stderr' [SYS$ERROR] at 'efile', but don't open it yet
+ >$vfile    create 'vfile' as 'stdout', using RMS attributes appropriate
+            for a standard text file (variable length records with
+            implied carriage control)
+ >+bfile    create 'bfile' as 'stdout' using binary mode
+ 2>&1       route error messages into the regular output stream
+ 1>&2       send output data to the error destination
+ <<sentinel error; reading stdin until 'sentinel' not supported
+ <-, >-     error; closure of stdin or stdout from cmd line not supported
+ >>$vfile   incorrect; would be interpreted as file "$vfile" in stream-lf
+            format rather than as file "vfile" in RMS 'text' format
+ |          error; command line pipes not supported
+3 wildcard_expansion
+ The command parsing in the VMS implementation of GAWK does some
+ emulation of a UN*X-style shell, where certain characters on the
+ command line have special meaning.  In particular, the symbols '<',
+ '>', '*', '%', and '?' receive special handling before the main part
+ of the program has a chance to see them.  The symbols '*', '%' and '?'
+ are used as wildcards in filenames.  '*' and '%' have their usual VMS
+ meanings of multiple character and single character wildcards,
+ respectively, and '?' is also treated as a single character wildcard.
+ Wildcard expansion only works for filenames specified in native VMS
+ filename syntax (eg, "[-.sibling]*"), not for ones specified pseudo-
+ Unix syntax (eg, "../sibling/*").
+
+ When a command line argument that should be a filename contains any
+ of the wildcard characters, a directory lookup is attempted for files
+ which match the specified pattern.  If one or more matching files are
+ found, those filenames are put into the command line in place of the
+ original pattern.  If no matching files are found, the original
+ pattern is left in place.
+2 DCL_syntax
+ GAWK's DCL-style interface is more or less a standard DCL command, with
+ one required parameter.  Multiple values--when present--are separated
+ by commas.
+
+ There are two main alternatives, depending on how the awk program is
+ to be passed to GAWK.  Both alternatives share most options.
+
+ Usage:  GAWK  /COMMANDS="awk program text"  data_file[,data_file,...]
+    or   GAWK  /INPUT=awk_file  data_file[,"Var=value",data_file,...]
+ (  or   GAWK  /INPUT=(awk_file1,awk_file2,...)  data_file[,...]       )
+3 Parameter
+ data_file[,datafile,...]       (data_file data_file ...)
+ data_file[,"Var=value",...,data_file,...]      (data_file Var=value &c)
+
+  Data file(s) for the awk program to process.  If any of these
+  actually contains an equals sign (=), then it is interpreted as
+  a variable assignment instead of a data file.  The syntax is
+  "variable_name=value".  Quotes are required for non-file parameters.
+
+  For example, the command
+       $ gawk/input=myprog.awk infile.one,"flag=2","start=0",infile.two
+  would read file 'infile.one' for the program in 'myprog.awk', then it
+  would set 'flag' to 2 and 'start' to 0, and finally it would read file
+  'infile.two' for the program.  Note that in a case like this, the two
+  assignments actually occur after the first file has been processed,
+  not at program startup when the command line is first scanned.
+
+  Wildcard file lookups are attempted on data file specifications.  See
+  subtopic 'GAWK GNU_syntax wildcard_expansion' for details.
+
+  At least one data_file parameter value is required.  An exception is
+  made if /usage, /version, or /copyright is specified *and* if GAWK is
+  defined as a 'foreign' command rather than a 'native' DCL command.
+3 Qualifiers
+/COMMANDS
+ /COMMANDS="awk program text"   (-- "awk program text")
+
+  For short programs, it is possible to include the complete program
+  on the command line.  The quotes are required.  Here is a complete
+  sample program:
+       $ gawk/commands="BEGIN {print ""\nHello, World!\n""}" NL:
+  This program would print a blank line (based on first "\n"), followed
+  by a line reading "Hello, World!", followed by another blank line
+  (since awk's 'print' statement includes the trailing 'newline').
+
+  To include a quote character inside of a quoted string, two
+  successive quotes ("") must be used.
+
+  Either /COMMANDS or /INPUT (but not both) must be supplied.
+/INPUT
+ /INPUT=(awk_file1,awk_file2)   (-f awk_file1 -f awk_file2)
+
+  Used to specify one or more files containing the source code of
+  the awk program.  If more than one file is used, separate them
+  with commas and enclose the list in parentheses.
+
+  Multiple source files are processed in order as if they had been
+  concatenated together.
+
+  Either /INPUT or /COMMANDS (but not both) must be supplied unless
+  one of /VERSION, /COPYRIGHT, and /USAGE is used.
+/EXTRA_COMMANDS
+ /EXTRA_COMMANDS="awk program text"     (-E "awk program text")
+
+  Add more program text, for use in combination with /INPUT.  Unlike
+  Un*x or GNU syntax processing of VMS GAWK where multiple instances of
+  -f file and -e text can be interspersed, DCL command processing of
+  VMS GAWK allows only one /EXTRA_COMMANDS="text" qualifier and handles
+  it before /INPUT=(file,...).
+/FIELD_SEPARATOR
+ /FIELD_SEPARATOR="FS_value"    (-F"FS_value")
+
+  Assign a value to the built in variable FS (field separator).
+/VARIABLES
+ /VARIABLES=("Var1=val1","Var2=val2",...)  (-v Var1=val1 -v Var2=val2)
+
+  Assign value(s) to the specified variable(s).
+/OPTIMIZE
+ /[NO]OPTIMIZE          (-"O" option)
+
+  Perform some relatively minor optimizations on the source code as it
+  is read in; primarily constant folding.  Default is /NOOPTIMIZE but
+  presently optimization is always enabled and explicitly negating it
+  has no effect.  This may change when/if more elaborate optimizations
+  are implemented.
+/PROFILE
+ /PROFILE[=file]        (-p[file])
+
+  Write profiling feedback into the specified file.  If no file name is
+  specified, awkprof.out in the current directory is used.
+/DUMP_VARIABLES
+ /DUMP_VARIABLES[=file] (-d[file])
+
+  Print a sorted list of global variables, their types, and final values
+  to the specified file.  If no file name is specified, awkvars.out in
+  the current directory is used.
+!-/REG_EXPR
+!- /REG_EXPR={AWK | EGREP | POSIX}   (-a vs -e options [obsolete])
+!-
+!-  This qualifier is obsolete and has no effect.
+/POSIX
+ /[NO]POSIX             (-"Wposix" option)
+
+  Use POSIX compatibility mode (/posix) and suppress GAWK extensions.
+  The default is /NOPOSIX.  Slightly more restrictive than /strict.
+/TRADITIONAL
+ /[NO]TRADITIONAL       (-"Wtraditional" option)
+
+  Use strict awk compatibility mode (/traditional) and suppress GAWK
+  extensions.  Supersedes /STRICT.  The default is /NOTRADITIONAL.
+/STRICT
+ /[NO]STRICT            (-"Wtraditional" option)
+
+  Use strict awk compatibility mode (/strict) and suppress GAWK
+  extensions.  Superseded by /TRADITIONAL.  The default is /NOSTRICT.
+/RE_INTERVAL
+ /RE_INTERVAL           (-"Wre-interval" option)
+
+  Allow interval expressions in regexps (regular expressions).  GAWK
+  always accepts intervals in normal mode; /RE_INTERVAL can be used to
+  enable them in strict (/TRADITIONAL) compatability mode.
+/SANDBOX
+ /SANDBOX               (-"Wsandbox" option)
+
+  Disables the system() function, input redirections with getline,
+  output redirections with print and printf, and dynamic extensions.
+/NON_DECIMAL_DATA
+ /NON_DECIMAL_DATA      (-"Wnon-decimal-data" option)
+
+  Enable automatic interpretation of octal and hexadecimal values in
+  input data.  Use with care.
+/LINT
+ /[NO]LINT[=(WARN,OLD,FATAL)]   (-"Wlint" and -"Wlint-old" options)
+
+  Check the awk program cafefully for potential problems that might
+  be encountered if it were to be used with other awk implementations,
+  and print warnings for anything found.  The default in /NOLINT.
+
+  /LINT without a value is equivalent to /LINE=WARN.  /LINT=OLD warns
+  about constructs which wouldn't work with /TRADITIONAL.  /LINT=FATAL
+  turns lint warnings into errors which cause GAWK to terminate.
+!-  /LINT=INVALID is accepted but isn't documented here.
+!three undocumented qualifiers; judged not useful for VMS
+!-  /CHARACTERS_AS_BYTES
+!-   /CHARACTERS_AS_BYTES     (-"Wcharacters-as-bytes" option)
+!-  /USE_LC_NUMERIC
+!-   /USE_LC_NUMERIC          (-"Wuse-lc-numeric" option)
+!-  /GEN_POT
+!-   /GEN_POT                 (-"Wgen-pot" option)
+/VERSION
+ /VERSION               (-"Wversion" option)
+
+  Print GAWK's version number and then terminate.  Includes copyright
+  notice.
+/COPYRIGHT
+ /COPYRIGHT             (-"Wcopyright" option)
+
+  Print a brief version of GAWK's copyright notice and then terminate.
+/USAGE
+ /USAGE                 (comparable to -"Whelp" option)
+
+  Print a compact summary of the command line options.
+
+  After the 'usage' message is printed, GAWK terminates regardless
+  of any other command line options.
+/OUTPUT
+ /OUTPUT=out_file       (>$out_file)
+
+  Write program output into 'out_file'.  The default is SYS$OUTPUT.
+2 awk_language
+ An awk program consists of one or more pattern-action pairs, sometimes
+ referred to as "rules".  For each record of an input (data) file, the
+ rules are checked sequentially.  Any pattern which matches the input
+ record triggers that rule's action.  Actions are instructions which
+ resemble statements in the 'C' programming language.  Patterns come
+ in several varieties, including field comparisons, regular expression
+ matching, and special cases defined by reserved keywords.
+
+ All awk keywords and variables are case-sensitive.  Text matching is
+ also sensitive to character case unless the builtin variable IGNORECASE
+ is set to a non-zero value.
+3 rules
+ The syntax for a pattern-action 'rule' is simply
+       PATTERN { ACTION }
+ where the braces ({}) are required punctuation for the action.
+ Semicolons (;) or 'newlines' (ie, having the text on a separate line)
+ delimit multiple rules and also multiple actions within a given rule.
+ Either the pattern or the action may be omitted; an empty pattern
+ matches every record of the input file; a missing action (not an empty
+ action inside of braces), is an implicit request to print the current
+ record; an empty action (ie, {}) is legal but not very useful.
+3 patterns
+ There are several types of patterns available for awk rules.
+
+  expression  an 'expression' is something to be evaluated (perhaps
+                         a comparison or function call) which will
+                         be considered true if non-zero (for numeric
+                         results) or if non-null (for strings)
+  /regular_expression/ slashes (/) delimit a regular expression
+                         which is used as a pattern
+  pattern1, pattern2   a pair of patterns separated by a comma (,),
+                         which causes a range of records to trigger
+                         the associated action; the records which
+                         match the patterns are included in the range
+  <null>      an omitted pattern (in this text, the  string '<null>'
+                         is displayed, but in an awk program, it
+                         would really be blank) matches every record
+  BEGIN       keyword for specifying a rule to be executed prior to
+                         reading the 1st record of the 1st input file
+  END         keyword for specifying a rule to be executed after
+                         handling the last input record of last file
+  BEGINFILE   gawk-specific keyword for specifying a rule to be
+                         executed when a file from the command line
+                         has just been opened, before attempting to
+                         read its first record
+  ENDFILE     gawk-specific keyword for specifying a rule to be
+                         executed after the last record of a file
+                         from the command has been processed by any
+                         other patterns and actions
+4 BEGINFILE
+ Normally a file open attempt which fails will generate an error
+ and cause GAWK to terminate.  However, if your program has a
+ BEGINFILE rule, failed open attempts will set ERRNO to a non-null
+ value and execute the BEGINFILE rule's actions.  You can check
+ for that condition and use the 'nextfile' statement to skip files
+ which couldn't be opened.  Note that when executing the BEGINFILE
+ rule for a failed open attempt, allowing the actions to finish
+ without using 'nextfile' will result in an error just like for a
+ program which has no BEGINFILE rule.
+4 examples
+ Some example patterns (mostly with the corresponding actions omitted)
+
+ NF > 0     # comparison expression:  matches non-null records
+ $0         # implied comparison:  also matches non-null records
+ $2 > 1000 && sum <= 999999     # slightly more elaborate expression
+ /x/        # regular expression matching any record with an 'x' in it
+ /^ /       # reg-expr matching records beginning with a space
+ $1 == "start", $NF == "stop"   # range pattern for input in which
+                some data lines begin with 'start' and/or end with
+                'stop' in order to collect groups of records
+        { sum += $1 }   # null pattern:  it's action (add field #1 to
+                variable 'sum') would be executed for every record
+ BEGIN  { sum = 0 }     # keyword 'BEGIN':  perform this action before
+                reading the input file (note: initialization to 0 is
+                unnecessary in awk)
+ END    { print "total =", sum }    # keyword 'END':  perform this
+                action after the last input record has been processed
+ # two different ways to handle the start of an input file:
+ FNR == 1 { print FILENAME }  # print name after reading first record
+ BEGINFILE { print FILENAME } # print name before reading first record
+3 actions
+ An 'action' is something to do when a given record has matched the
+ corresponding pattern in a rule.  In general, actions resemble 'C'
+ statements and expressions.  The action in a rule must be enclosed
+ in braces ({}).
+
+ Each action can contain more than one statement or expression to be
+ executed, provided that they're separated by semicolons (;) and/or
+ on separate lines.
+
+ An omitted action is equivalent to
+       { print $0 }
+ which prints the current record.
+3 operators
+ Relational operators
+    ==    compare for equality
+    !=    compare for inequality
+    <, <=, >, >=  numerical or lexical comparison (less than, less or
+                    equal, greater than, greater or equal, respectively)
+    ~     match against a regular expression
+    !~    match against a regular expression, but accept failed matches
+            instead of successful ones
+ Arithmetic operators
+    +     addition
+    -     subtraction
+    *     multiplication
+    /     division
+    %     remainder
+    ^, ** exponentiation ('**' is a synonym for '^', unless POSIX
+            compatibility is specified, in which case it's invalid)
+ Boolean operators (aka Logical operators)
+          a value is considered false if it's 0 or a null string,
+            it is true otherwise; the result of a boolean operation
+            (and also of a comparison operation) will be 0 when false
+            or 1 when true
+    ||    or [expression (a || b) is true if either a is true or b
+            is true or both a and b are true; it is false otherwise;
+            b is not evaluated unless a is false (ie, short-circuit)]
+    &&    and [expression (a && b) is true if both a and b are true;
+            it is false otherwise; b is only evaluated if a is true]
+    !     not [expression (!a) is true if a is false, false otherwise]
+    in    array membership; the keyword 'in' tests whether the value
+            on the left represents a current subscript in the array
+            named on the right
+ Conditional operator
+    ? :   the conditional operator takes three operands; the first is
+            an expression to evaluate, the second is the expression to
+            use if the first was true, the third is the expression to
+            use if it was false [simple example (a < b ? b : a) gives
+            the maximum of a and b]
+ Assignment operators
+    =     store the value on the right into the variable or array slot
+            on the left [expression (a = b) stores the value of b in a]
+    +=, -=, *=, /=, %=, ^=, **=  perform the indicated arithmetic
+           operation using the current value of the variable or array
+            element of the left side and the expression on the right
+            side, then store the result in the left side
+    ++    increment by 1 [expression (++a) gets the current value of
+            a and adds 1 to it, stores that back in a, and returns the
+            new value; expression (a++) gets the current value of a,
+            adds 1 to it, stores that back in a, but returns the
+            original value of a]
+    --    decrement by 1 (analogous to increment)
+ String operators
+          there is no explicit operator for string concatenation;
+            two values and/or variables side-by-side are implicitly
+            concatenated into a string (numeric values are first
+            converted into their string equivalents)
+ Conversion between numeric and string values
+          there is no explicit operator for conversion; adding 0
+            to a string with force it to be converted to a number
+            (the numeric value will be 0 if the string does not
+            represent an integer or floating point number); the
+            reverse, converting a number into a string, is done by
+            concatenating a null string ("") to it [the expression
+            (5.75 "") evaluates to "5.75"]
+ Field 'operator'
+    $     prefixing a number or variable with a dollar sign ($)
+            causes the appropriate record field to be returned [($2)
+            gives the second field of the record, ($NF) gives the
+            last field (since the builtin variable NF is set to the
+            number of fields in the current record)]
+ Array subscript operator
+    ,     multi-dimensional arrays are simulated by using comma (,)
+            separated array indices; the actual index is generated
+            by replacing commas with the value of builtin SUBSEP,
+            then concatenating the expression into a string index
+          [comma is also used to separate arguments in function
+            calls and user-defined function definitions]
+          [comma is *also* used to indicate a range pattern in an
+            awk rule]
+ Escape 'operator'
+    \     In quoted character strings, the backslash (\) character
+            causes the following character to be interpreted in a
+            special manner [string "one\ntwo" has an embedded newline
+            character (linefeed on VMS, but treated as if it were both
+            carriage-return and linefeed); string "\033[" has an ASCII
+            'escape' character (which has octal value 033) followed by
+            a 'right-bracket' character]
+          Backslash is also used in regular expressions
+ Redirection operators
+    <     Read-from -- valid with 'getline'
+    >     Write-to (create new file) -- valid with 'print' and 'printf'
+    >>    Append-to (create file if it doesn't already exist)
+    |     Pipe-from/to -- valid with 'getline', 'print', and 'printf'
+4 precedence
+ Operator precedence, listed from highest to lowest.  Assignment,
+ conditional, and exponentiation operators group from right to left;
+ all others group from left to right.  Parentheses may be used to
+ override the normal order.
+
+     field ($)
+     increment (++), decrement (--)
+     exponentiation (^, **)
+     unary plus (+), unary minus (-), boolean not (!)
+     multiplication (*), division (/), remainder (%)
+     addition (+), subtraction (-)
+     concatenation (no special symbol; implied by context)
+     relational (==, !=, <, >=, etc), and redirection (<, >, >>, |)
+       Relational and redirection operators have the same precedence
+       and use similar symbols; context distinguishes between them
+     matching (~, !~)
+     array membership ('in')
+     boolean and (&&)
+     boolean or (||)
+     conditional (? :)
+     assignment (=, +=, etc)
+4 escaped_characters
+ Inside of a quoted string or constant regular expression, the
+ backslash (\) character gives special meaning to the character(s)
+ after it.  Special character letters are case sensitive.
+    \\    results in one backslash in the string
+    \a    is an 'alert' (<ctrl/G>. the ASCII <bell> character)
+    \b    is a backspace (BS, <ctrl/H>)
+    \f    is a form feed (FF, <ctrl/L>)
+    \n    'newline' (<ctrl/J> [line feed treated as CR+LF]
+    \r    carriage return (CR, <ctrl/M> [re-positions at the
+            beginning of the current line]
+    \t    tab (HT, <ctrl/I>)
+    \v    vertical tab (VT, <ctrl/K>)
+    \###  is an arbitrary character, where '###' represents 1 to 3
+            octal (ie, 0 thru 7) digits
+    \x##  is an alternate arbitrary character, where '##' represents
+            1 or more hexadecimal (ie, 0 thru 9 and/or A through E
+            and/or a through e) digits; if more than two digits
+            follow, the result is undefined; not recognized if POSIX
+            compatibility mode is specified.
+
+ When a regular expression is represented in string form ("regex"
+ as opposed to /regex/), backslashes need to be paired.  The first
+ one quotes the second during string processing, and the second one
+ remains to be used to quote whatever follows in regular expression
+ processing.  For example, to match variable `xxx' against a period
+ character, use (xxx ~ "\\.") or (xxx ~ /\./); if you tried to use
+ (xxx ~ "\."), after string processing it would operate as (xxx ~ /./)
+ and end up matching any single character rather than just a period.
+3 statements
+ A statement refers to a unit of instruction found in the action
+ part of an awk rule, and also found in the definition of a function.
+ The distinction between action, statement, and expression usually
+ won't matter to an awk programmer.
+
+ Compound statements consist of multiple statements separated by
+ semicolons or newlines and enclosed within braces ({}).  They are
+ sometimes referred to as 'blocks'.
+4 expressions
+ An expression such as 'a = 10' or 'n += i++' is a valid statement.
+
+ Function invocations such as 'reformat_field($3)' are also valid
+ statements.
+4 if-then-else
+ A conditional statement in awk uses the same syntax as for the 'C'
+ programming language:  the 'if' keyword, followed by an expression
+ in parentheses, followed by a statement--or block of statements
+ enclosed within braces ({})--which will be executed if the expression
+ is true but skipped if it's false.  This can optionally be followed
+ by the 'else' keyword and another statement--or block of statements--
+ which will be executed if (and only if) the expression was false.
+5 examples
+ Simple example showing a statement used to control how many numbers
+ are printed on a given line.
+       if ( ++i <= 10 )     #check whether this would be the 11th
+              printf(" %5d", k)     #print on current line if not
+       else {
+              printf("\n %5d", k)   #print on next line if so
+              i = 1                 #and reset the counter
+       }
+ Another example ('next' is described under 'action-controls')
+       if ($1 > $2) { print "rejected"; next } else diff = $2 - $1
+4 switch-case
+ A gawk extension provides an alternative for conditional execution
+ to the if-then-else construct.  The switch statement takes a value
+ to use to decide which of one or more case clauses to execute,
+ similar to the same construct in C and C++.  The main difference
+ is that in those languages, the case values must be constant
+ integers, whereas in awk they can by numbers, strings, or regular
+ expressions.  Like in C/C++, an optional 'default' clause can be
+ specified to serve as a catch-all for values which don't match
+ any of the cases.
+
+ The first case which matches the switch value is the one which
+ will be executed.  If it doesn't use one of 'break', 'continue',
+ 'next', 'nextfile', 'return', or 'exit', then execution will
+ continue into the body of the next case.  (Note that 'continue'
+ doesn't operate as an explicit request to do such; rather, it
+ causes execution of an enclosing for, while, or do-while
+ statement to jump to the end of its loop.)
+5 example
+ In this example, the value of variable 'x' is examined.  It
+ contains a mistake that someone coming from a background of
+ programming in Pascal might accidentally make.
+
+ switch (x) {
+ case 1:     print "x is 1"; break;
+ case 2:     print "x is 2"
+ case "two": print "x is \"two\""; break;
+ default:    print "x is neither 1 nor 2"; break
+ }
+
+ Note that if the value is '2', after printing "x is 2" it will
+ continue into the next case and also print "x is \"two\"", which
+ was probably not intended.  The 'break' statement is needed to
+ jump out of the switch statement instead of falling through
+ into the subsequent clause.  For the very last one, 'default'
+ in this example, 'break' is optional; reaching the closing
+ bracket of a switch statement also breaks out of the statement.
+4 loops
+ Three types of loop statements are available in awk.  Each uses
+ the same syntax as 'C'.  The simplest of the three is the 'while'
+ statement.  It consists of the 'while' keyword, followed by an
+ expression enclosed within parentheses, followed by a statement--or
+ block of statements in braces ({})--which will be executed if the
+ expression evaluates to true.  The expression is evaluated before
+ attempting to execute the statement; if it's true, the statement is
+ executed (the entire block of statements if there is a block) and
+ then the expression is re-evaluated.
+
+ The second type of loop is the do-while loop.  It consists of the
+ 'do' keyword, followed by a statement (usually a block of statements
+ enclosed within braces), followed by the 'while' keyword, followed
+ by a test expression enclosed within parentheses.  The statement--or
+ block--is always executed at least once.  Then the test expression
+ is evaluated, and the statement(s) re-executed if the result was
+ true (followed by re-evaluation of the test, and so on).
+
+ The most complex of the three loops is the 'for' statement, and it
+ has a second variant that is not found in 'C'.  The ordinary for-loop
+ consists of the 'for' keyword, followed by three semicolon-separated
+ expressions enclosed within parentheses, followed by a statement or
+ brace-enclosed block of statements.  The first of the three
+ expressions is an initialization clause; it is done before starting
+ the loop.  The second expression is used as a test, just like the
+ expression in a while-loop.  It is checked before attempting to
+ execute the statement block, and then re-checked after each execution
+ (if any) of the block.  The third expression is an 'increment' clause;
+ it is evaluated after an execution of the statement block and before
+ re-evaluation of the test (2nd) expression.  Normally, the increment
+ clause will change a variable used in the test clause, in such a
+ fashion that the test clause will eventually evaluate to false and
+ cause the loop to finish.
+
+ Note to 'C' programmers:  the comma (,) operator commonly used in
+ 'C' for-loop expressions is not valid in awk.
+
+ The awk-specific variant of the for-loop is used for processing
+ arrays.  Its syntax is 'for' keyword, followed by variable_name 'in'
+ array_name (where 'var in array' is enclosed in parentheses),
+ followed by a statement (or block).  Each valid subscript value for
+ the array in question is successively placed--in no particular
+ order--into the specified 'index' variable.  Order can optionally
+ be controlled by assigning a sort mode to PROCINFO["sorted_in"].
+5 while_example
+ # strip fields from the input record until there's nothing left
+ while (NF > 0) {
+     $1 = ""    #this will affect the value of $0
+     $0 = $0    #this causes $0 and NF to be re-evaluated
+     print
+ }
+5 do_while_example
+ # This is a variation of the while_example; it gives a slightly
+ #   different display due to the order of operation.
+ # echo input record until all fields have been stripped
+ do {
+     print      #output $0
+     $1 = ""    #this will affect the value of $0
+     $0 = $0    #this causes $0 and NF to be re-evaluated
+ } while (NF > 0)
+5 for_example
+ # echo command line arguments (won't include option switches)
+ for ( i = 0; i < ARGC; i++ )  print ARGV[i]
+
+ # display contents of builtin environment array
+ for (itm in ENVIRON)
+     print itm, ENVIRON[itm]
+5 for_index_in_array_sorting
+ Normally indices in an array are processed in an arbitrary
+ order when using the 'for (index in array)' statement,
+ but a gawk-extension allows you to control that order.
+ Assign a value to the "sorted_in" element of the PROCINFO[]
+ array to accomplish this.  The value may be a comparison
+ function which accepts four arguments (index and value of one
+ element, then index and value of another), or a special value
+ which specifies one of several built-in comparison functions.
+ These functions are used to compare pairs of array elements
+ and their result controls which of each pair comes before the
+ other.
+6 comparison_function
+ A function assigned to PROCINFO["sorted_in"] should be
+ prepared to accept four arguments and to return a numeric
+ value, negative if the element specified by the first two
+ arguments (its index and its value, respectively) is less
+ than the element specified the second pair of arguments,
+ zero if they compare equal, and positive of the first
+ element is greater than the second.  Here's an example:
+
+ function my_compare(idx1, val1, idx2, val2)
+ {
+   if (val1 < val2) return -1
+   if (val2 > val2) return 1
+   # the two values are equal
+   return (idx1 < idx2) ? -1 : (idx1 > idx2)
+ }
+
+ This compares the two values and returns either negative
+ or positive if they're different.  If they're the same,
+ it compares the two indices as a tie-breaker instead of
+ simply returning zero.
+
+ You can force values to be numeric or to be string, as
+ needed, and use more elaborate ordering criteria.  Just
+ be sure that the results are consistent; returning a
+ positive value when idx1,val1 is compared to idx2,val2
+ and then also returning a positive value if idx2,val2
+ gets compared to idx1,idx2 will likely confuse the sort
+ routine and produce strange results.
+
+ If you plan to sort arrays which contain sub-arrays (array
+ elements which contain their own arrays) and you're sorting
+ by value rather than by index, your compare routine should
+ use the isarray() function to check for them (test second
+ and fourth arguments to see whether they're arrays) and
+ handle them appropriately.  The basic comparison operators
+ like '<' will produce an error if used on arrays.
+6 built-in_comparisons
+ Here is a list of built-in compare routines that can be
+ assigned to PROCINFO["sorted_in"].  They are strings
+ and start with '@' so that these names can't be confused
+ with actual functions.
+
+ "@ind_str_asc"   order by indices compared as strings
+                  (all array indices are strings internally,
+                  even when they were assigned as numbers)
+ "@ind_num_asc"   order by indices compared as numbers
+                  (non-numeric ones end up with value 0)
+ "@val_type_asc"  order by values using assigned type
+                  (if a mixture of strings and numbers is
+                  present, numbers come first, then strings)
+ "@val_str_asc"   order by values compared as strings
+ "@val_num_asc"   order by values compared as numbers
+ "@ind_str_desc"  \
+ "@ind_num_desc"   \
+ "@val_type_desc"   descending versions of the above
+ "@val_str_desc"   /
+ "@val_num_desc"  /
+ "@unsorted"      explicitly specify arbitrary order
+                  (same as deleting the "sorted_in" element
+                  from the PROCINFO[] array, or never having
+                  assigned it a value in the first place)
+
+ All the ascending sorts put sub-arrays--if any--last, and
+ descending ones place them first.  When multiple sub-arrays
+ are present, they tie with each other without regard to
+ their contents; such ties are then disambiguated by
+ comparing their indices.
+6 processing_order
+ Sorting of the array takes place as the 'for (index in array)'
+ statement is about to start executing.  Changing the value of
+ PROCINFO["sorted_in"] during the course of the loop will not
+ affect traversal order, and could be used to control ordering
+ of sub-arrays using different criteria.
+
+ After the loop finishes, any ordering imposed on the indices
+ is forgotten.  A subsequent 'for (index in array)' traversal
+ of the same array will yield whatever order is specified by
+ PROCINFO["sorted_in"] at that time, including reverting to
+ arbitrary if it no longer has a value.
+4 loop-controls
+ There are two special statements--both from 'C'--for changing the
+ behavior of loop execution.  The 'continue' statement is useful in
+ a compound (block) statement; when executed, it effectively skips
+ the rest of the block so that the increment-expression (only for
+ for-loops) and loop-termination expression can be re-evaluated.
+
+ The 'break' statement, when executed, effectively skips the rest
+ of the block and also treats the test expression as if it were
+ false (instead of actually re-evaluating it).  In this case, the
+ increment-expression of a for-loop is also skipped.
+
+ Inside nested loops, both 'break' and 'continue' only apply to the
+ innermost loop.  When in compatibility mode, 'break' or 'continue'
+ may be used outside of a loop; either will be treated like 'next'
+ (see action-controls).
+4 action-controls
+ There are two special statements for controlling statement execution.
+ The 'next' statement, when executed, causes the rest of the current
+ action and all further pattern-action rules to be skipped, so that
+ the next input record will be immediately processed.  This is useful
+ if any early action knows that the current record will fail all the
+ remaining patterns; skipping those rules will reduce processing time.
+
+ A GAWK extension, 'nextfile', is also available.  It causes the
+ remainder of the current file to be skipped, the ENDFILE action, if
+ applicable, to be performed, and then the next input file will be
+ processed.  If there is no next input file, the END action will be
+ performed.  'nextfile' is not available in traditional awk.
+
+ The 'exit' statement causes GAWK execution to terminate.  All open
+ files are closed, and no further processing is done.  The END rule,
+ if any, is executed.  'exit' takes an optional numeric value as a
+ argument which is used as an exit status value, so that some sort
+ of indication of why execution has stopped can be passed on to the
+ user's environment.
+4 other_statements
+ The delete statement is used to remove an element from an array.
+ The syntax is 'delete' keyword followed by array name, followed
+ by index value enclosed in square brackets ([]).  As a gawk
+ extension, 'delete' may also used on an array name without any
+ index specified, to delete all its elements in a single operation.
+ (The array itself will continue to exist as an array, even though
+ it no longer contains any elements.)
+
+ The return statement is used in user-defined functions.  The syntax
+ is the keyword 'return' optionally followed by a string or numeric
+ expression.
+
+ See also subtopic 'functions IO_functions' for a description of
+ 'print', 'printf', and 'getline'.
+3 fields
+ When an input record is read, it is automatically split into fields
+ based on the current values of FS (builtin variable defining field
+ separator expression) and RS (builtin variable defining record
+ separator character).  The default value of FS is an expression
+ which matches one or more spaces and tabs; the default for RS is
+ newline.  If the FIELDWIDTHS variable is set to a space separated
+ list of numbers (as in ``FIELDWIDTHS = "2 3 2"'') then the input
+ is treated as if it had fixed-width fields of the indicated sizes
+ and the FS value will be ignored.
+
+ The field prefix operator ($), is used to reference a particular
+ field.  For example, $3 designates the third field of the current
+ record.  The entire record can be referenced via $0 (and it holds
+ the actual input record, not the values of $1, $2, ... concatenated
+ together, so multiple spaces--when present--remain intact, unless
+ a new value gets assigned).
+
+ The builtin variable NF holds the number of fields in the current
+ record.  $NF is therefore the value of the last field.  Attempts to
+ access fields beyond NF result in null values (if a record contained
+ 3 fields, the value of $5 would be "").
+
+ Assigning a new value to $0 causes all the other field values (and NF)
+ to be re-evaluated.  Changing a specific field will cause $0 to receive
+ a new value once it's re-evaluated, but until then the other existing
+ fields remain unchanged.
+4 field_separation
+ Three built in variables control separating input lines into fields,
+ and the most recently assigned of those three is the one which has
+ effect.  PROCINFO["FS"] can be used to determine which one that is.
+
+ FS is a character, string, or regular expression specifying what
+ separates fields.  It is available in all implementations of awk so
+ is the most widely used.  The default value is an explicit space and
+ behaves as if the value was /[ \t\n]+/ to treat any number of spaces
+ and tabs (and newlines, if RS isn't using them as record separators)
+ as the separator.  (Explicitly using that regular expression
+ actually produces different results if the input happens to have
+ leading and/or trailing whitespace.  The default skips such space;
+ the regexp increases NF by 1 and produces an empty $1 if there is
+ leading whitespace and it increases NF by 1 and produces an empty $NF
+ if there is trailing whitespace.  To actually force the separator to
+ be a single space, use the regular expression / /.)
+
+ FIELDWIDTHS is a string containing a space-separated list of numbers
+ which indicate how wide each field is.  It is a gawk-extension and
+ used to be considered experimental, but it has been in place for many
+ years without significant changes.  There is no default value, nor is
+ there any way to specify a repeat count the way a Fortran FORMAT
+ statment could.
+
+ FPAT is a regular expression which specifies field values rather than
+ the separation between fields.  It is also a gawk-extension and is
+ new with version 4.0.0.
+
+ A gawk-extension makes setting FS to "" force each input character
+ to be a separate field, similar to FIELDWIDTHS="1 1 1 1 1 1"(...) if
+ you were able to supply an unlimited number of 1's.
+3 variables
+ Variables in awk can hold both numeric and string values and do not
+ have to be pre-declared.  In fact, there is no way to explicitly
+ declare them at all.  Variable names consist of a leading letter
+ (either upper or lower case, which are distinct from each other)
+ or underscore (_) character followed by any number of letters,
+ digits, or underscores.
+
+ When a variable that didn't previously exist is referenced, it is
+ created and given a null value.  A null value is treated as 0 when
+ used as a number, and is a string of zero characters in length if
+ used as a string.
+4 builtin_variables
+ GAWK maintains several 'built-in' variables.  All have default values;
+ some are updated automatically.  All the builtins have uppercase-only
+ names.
+
+ These builtin variables control how awk behaves
+   FS  input field separator; default is a single space, which is
+         treated as if it were a regular expression for matching
+         one or more spaces and/or tabs and/or newlines; a value
+         of " " also has a second special-case side-effect of
+         causing leading and/or trailing blanks to be ignored
+         instead of producing a null first and/or last field;
+         initial value can be specified on the command line with
+         the -F option (or /field_separator); the value can be a
+         regular expression; as a gawk extension, if the value is
+         an empty string (""), every character becomes a separate
+         field
+   RS  input record separator; default value is a newline ("\n");
+         the value can be multiple characters or a regular expression
+   OFS output field separator; value to place between variables in
+         a 'print' statement; default is one space; can be arbitrary
+         string
+   ORS output record separator; value to implicitly terminate 'print'
+         statement with; default is newline ("\n"); can be arbitrary
+         string
+   OFMT default output format used for printing numbers; default
+         value is "%.6g"
+   CONVFMT conversion format used for number-to-string conversions;
+         default value is also "%.6g", like OFMT; not used when the
+         number has a value which may be represented internally as
+         an exact integer (typically within -2147483648 to 2147483647)
+   SUBSEP subscript separator for array indices; used when an array
+         subscript is specified as a comma separated list of values:
+         the comma is replaced by SUBSEP and the resulting index
+         is a concatenation of the values and SUBSEP(s); default
+         value is "\034"; value may be arbitrary string
+   IGNORECASE string and regular expression matching flag; if true
+         (non-zero) matching ignores differences between upper and
+         lower case letters; affects the '~' and '!~' operators,
+         the 'index', 'match', 'split', 'sub', and 'gsub' functions,
+         and field splitting based on FS; default value is false (0);
+         has no effect if GAWK is in strict compatibility mode
+   FIELDWIDTHS space or tab separated list of width sizes; takes
+         precedence over FS when set, but is cleared if FS has a
+         value assigned to it; [note: the current implementation
+         of fixed-field input is considered experimental and is
+         expected to evolve over time]
+   FPAT an alternate way to specify fields, with a regexp pattern
+         which defines field values rather than field separator
+         [assigning a value to any of FS, FIELDWIDTHS, or FPAT
+         causes the other two to be deactivated; the value of
+         PROCINFO["FS"] can be used to determine which one is
+         currently in use]
+   BINMODE can be used force input and/or output files to be processed
+         using binary I/O; a value of 1 or "r" forces binary mode when
+         reading input, a value of 2 or "w" forces binary mode when
+         writing output, and a value of 3 or "rw" causes GAWK to use
+         binary mode for both input and output; BINMODE has no effect
+         on reading from stdin or writing to stdout; they'll have
+         already been opened in text mode before you assign a value
+   LINT setting or unsetting this can dynamically toggle the --lint
+         command line option on or off
+
+ These builtin variables provide useful information
+   NF  number of fields in the current record
+   NR  record number (accumulated over all files when more than one
+         input file is processed by the same program)
+   FNR current record number of the current input file; reset to 0
+         each time an input file is completed
+   RT  record terminator, the input text which matched RS; not
+         available when the `-Wtraditional' option is used
+   RSTART starting position of substring matched by last invocation
+         of the 'match' function; set to 0 if a match fails and at
+         the start of each input record
+   RLENGTH length of substring matched by the last invocation of the
+         'match' function; set to -1 if a match fails
+   FILENAME name of the input file currently being processed; the
+         special name "-" is used to represent the standard input
+   ENVIRON array of miscellaneous user environment values; the VMS
+         implementation of GAWK provides values for ["USER"] (the
+         username), ["PATH"] (current default directory), ["HOME"]
+         (the user's login directory), and "[TERM]" (terminal type
+         if available) [all info provided by C RTL's environ]
+   PROCINFO miscellaneous process information and assorted GAWK
+         extensions which don't fit in elsewhere
+   ERRNO information about the cause of failure for 'getline' or
+         'close' or for file open during a BEGINFILE rule; it is
+         only set if an error has occurred, it isn't reset when
+         any subsequent operation succeeds; the only exception is
+         that it is reset prior to attempting to open a file so
+         that BEGINFILE rule actions can distinguish between
+         success and failure
+   ARGC number of elements in the ARGV array, counting [0] which is
+         the program name (ie, "gawk")
+   ARGV array of command-line arguments (in [0] to [ARGC-1]); the
+         program name (ie, "gawk") in held in ARGV[0]; command line
+         parameters (data files and "var=value" expressions, but not
+         program options or the awk program text string if present)
+         are stored in ARGV[1] through ARGV[ARGC-1]; the awk program
+         can change values of ARGC and ARGV[] during execution in
+         order to alter which files are processed or which between-
+         file assignments are made
+   ARGIND current index into ARGV[]
+4 arrays
+ awk supports associative arrays to collect data into tables.  Array
+ elements can be either numeric or string, as can the indices used to
+ access them.  Each array must have a unique name, but a given array
+ can hold both string and numeric elements at the same time.  Arrays
+ are one-dimensional only, but multi-dimensional arrays can be
+ simulated using comma (,) separated indices, whereby a single index
+ value gets created by replacing commas with SUBSEP and concatenating
+ the resulting expression into a single string.
+
+ Referencing an array element is done with the expression
+       Array[Index]
+ where 'Array' represents the array's name and 'Index' represents a
+ value or expression used for a subscript.  If the requested array
+ element did not exist, it will be created and assigned an initial
+ null value.  To check whether an element exists without creating it,
+ use the 'in' boolean operator.
+       Index in Array
+ would check 'Array' for element 'Index' and return 1 if it existed
+ or 0 otherwise.  To remove an element from an array, use the 'delete'
+ statement
+       delete Array[Index]
+ To remove all array elements at once, use
+       delete Array
+ Note:  the latter is a gawk extension; also, there is no way to
+ delete an ordinary variable or an entire array; 'delete' only works
+ on array elements.
+
+ To process all elements of an array (in succession) when their
+ subscripts might be unknown, use the 'in' variant of the for-loop
+       for (Index in Array) { ... }
+ (See the "awk_language statements loops" entry for a way to control
+ the order of traversal with this construct.)
+
+ Starting with version 4.0.0 array values can contain arrays, sometimes
+ referred to as sub-arrays.  They're created by assigning a value using
+ multiple instances of subscripting:  'a[1][2] = 3' would create array
+ a if it didn't already exist, create array element a[1] if it didn't
+ already exist, create sub-array element a[1][2] if it didn't exist,
+ then assign that the value 3.  You can't directly assign an existing
+ array to be a subarray:  'a[1] = 2; a[3] = 4; b["a"] = a' would get
+ rejected.  But you can produce the same effect by traversing the array
+ and assigning it element by element:
+ 'a[1] = 2; a[3] = 4; for (i in a) b["a"][i] = a[i]'.
+3 functions
+ awk supports both built-in and user-defined functions.  A function
+ may be considered a 'black-box' which accepts zero or more input
+ parameters, performs some calculations or other manipulations based
+ on them, and returns a single result.
+
+ The syntax for calling a function consists of the function name
+ immediately followed by an open parenthesis (left parenthesis '('),
+ followed by an argument list, followed by a closing parenthesis
+ (right parenthesis ')').  The argument list is a sequence of values
+ (numbers, strings, variables, array references, or expressions
+ involving the above and/or nested function calls), separated by
+ commas and optional white space.
+
+ The parentheses are required punctuation, except for the 'print' and
+ 'printf' builtin IO functions, where they're optional, and for the
+ builtin IO function 'getline', where they're not allowed.  Some
+ functions support optional [trailing] arguments which can be simply
+ omitted (along with the corresponding comma if applicable).
+4 numeric_functions
+ Builtin numeric functions
+   int(n)      returns the value of 'n' with any fraction truncated
+                 [truncation of negative values is towards 0]
+   sqrt(n)     the square root of n
+   exp(n)      the exponential of n ('e' raised to the 'n'th power)
+   log(n)      natural logarithm of n
+   sin(n)      sine of n (in radians)
+   cos(n)      cosine of n (radians)
+   atan2(m,n)  arctangent of m/n (radians)
+   rand()      random number in the range 0 to 1 (exclusive)
+   srand(s)    sets the random number 'seed' to s, so that a sequence
+                 of 'random' numbers can be repeated; returns the
+                 previous seed value; srand() [argument omitted] sets
+                 the seed to an 'unpredictable' value (based on date
+                 and time, for instance, so should be unrepeatable)
+4 string_functions
+ Builtin string functions
+   index(s,t)  search string s for substring t; result is 1-based
+                 offset of t within s, or 0 if not found
+   length(s)   returns the length of string s; either 'length()'
+                 with its argument omitted or 'length' without any
+                 parenthesized argument list will return length of $0
+   match(s,r)  search string s for regular expression r; the offset
+                 of the longest, left-most substring which matches
+                 is returned, or 0 if no match was found; the builtin
+                 variables RSTART and RLENGTH are also set [RSTART to
+                 the return value and RLENGTH to the size of the
+                 matching substring, or to -1 if no match was found]
+   split(s,a,f,x) break string s into components based on field
+                 separator f and store them in array a (into elements
+                 [1], [2], and so on); the third argument is optional,
+                 if omitted, the value of FS is used; the fourth one
+                 is optional too, and is a gawk extension; when
+                 specified it should be an array which will receive
+                 the separators between the corresponding fields; the
+                 return value is the number of components found
+   patsplit(s,a,p,x) similar to split, but p is a regexp pattern
+                 specifying field contents rather than a separator;
+                 if not specified, the value of FPAT is used; this
+                 function is a gawk extension
+   sprintf(f,e,...) format expression(s) e using format string f and
+                 return the result as a string; formatting is similar
+                 to the printf function
+   sub(r,t,s)  search string target s for regular expression r, and
+                 if a match is found, replace the matching text with
+                 substring t, then store the result back in s; if s
+                 is omitted, use $0 for the string; the result is
+                 either 1 if a match+substitution was made, or 0
+                 otherwise; if substring t contains the character
+                 '&', the text which matched the regular expression
+                 is used instead of '&' [to suppress this feature
+                 of '&', 'quote' it with a backslash (\); since this
+                 will be inside a quoted string which will receive
+                 'backslash' processing before being passed to sub(),
+                 *two* consecutive backslashes will be needed "\\&"]
+   gsub(r,t,s) similar to sub(), but gsub() replaces all nonoverlapping
+                 substrings instead of just the first, and the return
+                 value is the number of substitutions made
+   gensub(r,t,n,s) search string s ($0 if omitted) for regexp r and
+                 replace the n'th occurrence with substring t; the
+                 result is the new string and s (or $0) remains
+                 unchanged; if n begins with letter "g" or "G" then
+                 all matches are replaced instead of just the n'th;
+                 if r has parenthesized subexpressions in it, t may
+                 contain the special sequences \\0, \\1, through \\9
+                 which expand into the value of the corresponding
+                 subexpression; this function is a gawk extension
+   substr(s,p,l) extract a substring l characters long starting at
+                 offset p in string s; l is optional, if omitted then
+                 the remainder of the string (p thru end) is returned
+   tolower(s)  return a copy of string s in which every uppercase
+                 letter has been converted into lowercase
+   toupper(s)  analogous to tolower(); convert lowercase to uppercase
+   strtonum(s) convert string s into the corresponding number; if s
+                 begins with "0x", the rest of the string will be
+                 considered to be hexacimal digits, otherwise if it
+                 begins with "0" (not "o"), the rest will be treated
+                 as octal digits; this function is a gawk extension
+4 array_functions
+   isarray(a)  returns 1 of a is an array, 0 otherwise; most useful
+                 when traversing an array which might contain array
+                 values (sub-arrays)
+   split(s,a[,f[,x]]) break string s into components based on field
+                 separator f and store them in array a (into elements
+                 [1], [2], and so on); the third argument is optional,
+                 if omitted, the value of FS is used; the fourth one
+                 is optional too, and is a gawk extension; when
+                 specified it should be an array which will receive
+                 the separators between the corresponding fields; the
+                 return value is the number of components found
+   patsplit(s,a[,p[,x]]) similar to split, but p is a regexp pattern
+                 specifying field contents rather than a separator;
+                 if not specified, the value of FPAT is used; this
+                 function is a gawk extension
+   asort(s[,d[,m]]) sort the contents of array s, replacing the index
+                 values with an integer sequence of 1 to N; if d is
+                 specified, leave the indices of s intact and put the
+                 values and sequence index into d; if m is specified,
+                 it should be a string containing "ascending" or
+                 "descending" to control order, or "string" or "number"
+                 to control how comparisons are performed, or a
+                 combination of the two; m can also be a comparison
+                 function similar to ones used by PROCINFO["sorted_in"]
+   asorti(s[,d[,m]]) sort the indices of array s, replacing the values
+                 with an integer sequence of 1 to N; if d is specified,
+                 leave the values of s intact and put the indices and
+                 sequence values into d; m is the same as for asort()
+4 time_functions
+ Builtin time functions
+   systime()   return the current time of day as the number of seconds
+                 since some reference point; on VMS the reference point
+                 is January 1, 1970, at 12 AM local time (not UTC)
+   mktime(s)   convert string s into number of seconds since the
+                 reference point; s should contain a value of the form
+                 "yyyy mm dd hh mm ss[ dst]" where yyyy is a four digit
+                 year, mm a month number from 1 to 12, dd day-of-month
+                 number from 1 to 31, hh hour 0 to 23, mm minute 0 to
+                 59, ss second 0 to 60, and [ dst] is an optional flag
+                 to handle daylight savings time: if dst is positive,
+                 then daylight savins time is in effect, if zero, then
+                 it isn't, and if negative or omitted, gawk attempts
+                 to determine whether it was--or will be--at specified
+                 date and time
+   strftime(f,t,u) format time value t using format f; if it is omitted
+                 then PROCINFO["strftime"] is used; if t is omitted,
+                 the default is systime(); if u is present and non-zero
+                 then t is treated as a UTC value, otherwise it is
+                 considered to be local time
+
+5 time_logical_names
+ Gawk needs the SYS$TIMEZONE_RULE or TZ logical names defined or it will
+ output the time in the GMT timezone.
+5 time_formats
+ Formatting directives similar to the 'printf' & 'sprintf' functions
+ (each is introduced in the format string by preceding it with a
+ percent sign (%)); the directive is substituted by the corresponding
+ value
+   a   abbreviated weekday name (Sun,Mon,Tue,Wed,Thu,Fri,Sat)
+   A   full weekday name
+   b   abbreviated month name (Jan,Feb,...)
+   B   full month name
+   c   date and time (Unix-style "aaa bbb dd HH:MM:SS YYYY" format)
+   C   century prefix (19 or 20) [not century number, ie 20th]
+   d   day of month as two digit decimal number (01-31)
+   D   date in mm/dd/yy format
+   e   day of month with leading space instead of leading 0 ( 1-31)
+   E   ignored; following format character used
+   H   hour (24 hour clock) as two digit number (00-23)
+   h   abbreviated month name (Jan,Feb,...) [same as %b]
+   I   hour (12 hour clock) as two digit number (01-12)
+   j   day of year as three digit number (001-366)
+   m   month as two digit number (01-12)
+   M   minute as two digit number (00-59)
+   n   'newline' (ie, treat %n as \n)
+   O   ignored; following format character used
+   p   AM/PM designation for 12 hour clock
+   r   time in AM/PM format ("II:MM:SS p")
+   R   time without seconds ("HH:MM")
+   S   second as two digit number (00-59)
+   t   tab (ie, treat %t as \t)
+   T   time ("HH:MM:SS")
+   U   week of year (00-53) [first Sunday is first day of week 1]
+   V   date (VMS-style "dd-bbb-YYYY" with 'bbb' forced to uppercase)
+   w   weekday as decimal digit (0 [Sunday] through 6 [Saturday])
+   W   week of year (00-53) [first _Monday_ is first day of week 1]
+   x   date ("aaa bbb dd YYYY")
+   X   time ("HH:MM:SS")
+   y   year without century (00-99)
+   Y   year with century (19yy-20yy)
+   Z   time zone name (always "local" for VMS)
+   %   literal percent sign (%)
+4 IO_functions
+ Builtin I/O functions
+   print x,... print the values of one or more expressions; if none
+                 are listed, $0 is used; parentheses are optional;
+                 when multiple values are printed, the current value
+                 of builtin OFS (default is 1 space) is used to
+                 separate them; the print line is implicitly
+                 terminated with the current value of ORS (default
+                 is newline); print does not have a return value
+   printf(f,x,...) print the values of one or more expressions, using
+                 the specified format string; null strings are used
+                 to supply missing values (if any); no between field
+                 or trailing newline characters are printed, they
+                 should be specified within the format string; the
+                 argument-enclosing parentheses are optional;
+                 printf does not have a return value
+   getline v   read a record into variable v; if v is omitted, $0 is
+                 used (and NF, NR, and FNR are updated); if v is
+                 specified, then field-splitting won't be performed;
+                 note:  parentheses around the argument are *not*
+                 allowed; return value is 1 for successful read, 0
+                 if end of file is encountered, or -1 if some sort
+                 of error occurred; [see 'redirection' for several
+                 variants]
+   close(s)    close a file or pipe specified by the string s; the
+                 string used should have the same value as the one
+                 used in a getline or print/printf redirection
+   fflush(s)   flush output stream s; if s is omitted, stdout is
+                 flushed; if it is specified but its value is an
+                 empty string, all output streams are flushed
+   system(s)   pass string s to executed by the operating system;
+                 the command string is executed in a subprocess
+5 redirection
+ Both getline and print/printf support variant forms which use
+ redirection and pipes.
+
+ To read from a file (instead of from the primary input file), use
+     getline var < "file"
+ or  getline < "file"    (read into $0)
+ where the string "file" represents either an actual file name (in
+ quotes) or a variable which contains a file name string value or an
+ expression which evaluates to a string filename.
+
+ To create a pipe executing some command and read the result into
+ a variable (or into $0), use
+     "command" | getline var
+ or  "command" | getline    (read into $0)
+ where "command" is a literal string containing an operating system
+ command or a variable with a string value representing such a
+ command.
+
+ To output into a file other that the primary output, use
+     print x,... > "file"    (or >> "file")
+ or  printf(f,x,...) > "file"    (or >> "file")
+ similar to the 'getline' example above.  '>>' causes output to be
+ appended to an existing file if it exists, or create the file if
+ it doesn't already exist.  '>' always creates a new file.  The
+ alternate redirection method of '>$' (for RMS text file attributes)
+ is *only* available on the command line, not with 'print' or
+ 'printf' in  the current release.
+
+ To output an error message, use 'print' or 'printf' and redirect
+ the output to file "/dev/stderr" (or equivalently to "SYS$ERROR:"
+ on VMS).  'stderr' will normally be the user's terminal, even if
+ ordinary output is being redirected into a file.
+
+ To feed awk output into another command, use
+     print x,... | "command"    (similarly for 'printf')
+ similar to the second 'getline' example.  In this case, output
+ from awk will be passed as input to the specified operating system
+ command.  The command must be capable of reading input from 'stdin'
+ ("SYS$INPUT:" on VMS) in order to receive data in this manner.
+
+ The 'close' function operates on the "file" or "command" argument
+ specified here (either a literal string or a variable or expression
+ resulting in a string value).  It completely closes the file or
+ pipe so that further references to the same file or command string
+ would re-open that file or command at the beginning.  Closing a
+ pipe or redirection also releases some file-oriented resources.
+
+ Note:  the VMS implementation of GAWK uses temporary files to
+ simulate pipes, so a command must finish before 'getline' can get
+ any input from it, and 'close' must be called for an output pipe
+ before any data can be passed to the specified command.
+5 formats
+ Formatting characters used by the 'printf' and 'sprintf' functions
+ (each is introduced in the format string by preceding it with a
+ percent sign (%))
+   %   include a literal percent sign (%) in the result
+   c   format the next argument as a single ASCII character
+         (prints first character of string argument, or corresponding
+         ASCII character if numeric argument, e.g. 65 is 'A')
+   s   format the next argument as a string (numeric arguments are
+         converted into strings on demand)
+   d   decimal number (ie, integer value in base 10)
+   i   integer (equivalent to decimal)
+   o   octal number (integer in base 8)
+   x   hexadecimal number (integer in base 16) [lowercase]
+   X   hexadecimal number [digits 'A' thru 'E' in uppercase]
+   f   floating point number (digits, decimal point, fraction digits)
+   e   exponential (scientific notation) number (digit, decimal
+         point, fraction digits, letter 'e', sign '+' or '-',
+         exponent digits)
+   g   'fractional' number in either 'e' or 'f' format, whichever
+         produces shorter result
+
+ Several optional modifiers can be placed between the initiating
+ percent sign and the format character (doesn't apply to %%).
+   -   left justify (only matters when width specifier is present)
+     (space) for numeric specifiers, prefix nonnegative values with
+         a space and negative values with a minus sign
+   +   for numeric specifiers, prefix nonnegative values with a plus
+         sign and negative values with a minus sign
+   #   alternate form applicable to several of the format characters
+       (o, x, X, e, E, f, g, G)
+   NN  width ['NN' represents 1 or more decimal digits]; actually
+         minimum width to use, longer items will not be truncated; a
+         leading 0 will cause right-justified numbers to be padded on
+         the left with zeroes instead of spaces when they're aligned
+   .MM precision [decimal point followed by 1 or more digits]; used
+         as maximum width for strings (causing truncation if they're
+         actually longer) or as number of fraction digits for 'f' or
+         'e' numeric formats, or number of significant digits for 'g'
+         numeric format
+4 bitwise_functions
+   Bitwise functions operate on bits (binary digits) of integer
+   numeric values.  Non-integer numbers are converted into integers
+   before their bits are accessed.
+
+   and(x,y)    x AND y, where result contains 1 for bits that both x
+         and y have set, 0 for other bits
+   or(x,y)     x OR y, where the result contains 1 for any bits that
+         either x or y or both have set, 0 for other bits
+   xor(x,y)    x XOR y, where the result contains 1 for bits that x
+         has set but y has clear or vice versa, 0 for other bits
+   compl(x)    NOT x, where the result contains 1 for bits that x
+         has clear and 0 for bits that it has set
+   lshift(x,n) x << n, shift the bits of x by n positions left,
+         approximately the same as x * 2^n
+   rshift(x,n) x >> n, shift the bits of x by n positions right,
+         approximately the same as int(x / 2^n)
+
+   The set of bitwise functions is a gawk extension.
+4 user_defined_functions
+ User-defined functions may be created as needed to simplify awk
+ programs or to collect commonly used code into one place.  The
+ general syntax of a user-defined function is the 'function' keyword
+ followed by unique function name, followed by a comma-separated
+ parameter list enclosed in parentheses, followed by statement(s)
+ enclosed within braces ({}).  A 'return' statement is customary
+ but is not required.
+       function FuncName(arg1,arg2) {
+           # arbitrary statements
+           return (arg1 + arg2) / 2
+       }
+ If a function does not use 'return' to specify an output value, the
+ result received by the caller will be unpredictable.
+
+ Functions may be placed in an awk program before, between, or after
+ the pattern-action rules.  The abbreviation 'func' may be used in
+ place of 'function', unless POSIX compatibility mode is in effect.
+4 indirect_function_calls
+ A gawk extension allows you to assign a string containing the name
+ of a function to a variable, then call the function by preceding
+ the variable with @ (at-sign) and following with the parenthesized
+ argument list.  For example
+
+ function my_max(x, y) { return (x > y) ? x : y }
+ function my_min(x, y) { return (x < y) ? x : y }
+ ...
+ max_or_min = some_criterion ? "my_max" : "my_min"
+ ...
+ c = @max_or_min(a, b)
+
+ would call either my_max() or my_min() depending upon the value of
+ some_criterion at the time max_or_min was assigned.
+
+ Indirect function calls only operate on user-defined functions, not
+ on built-in ones.  If you need to use one of the latter, create a
+ user-defined function to call the built-in function; this if often
+ referred to as a "wrapper" function.
+3 regular_expressions
+ A regular expression is a shorthand way of specifying a 'wildcard'
+ type of string comparison.  Regular expression matching is very
+ fundamental to awk's operation.
+
+ Meta symbols
+   ^   matches beginning of line or beginning of string; note that
+         embedded newlines ('\n') create multi-line strings, so
+         beginning of line is not necessarily beginning of string
+   $   matches end of line or end of string
+   .   any single character (except newline)
+   [ ] set of characters; [ABC] matches either 'A' or 'B' or 'C'; a
+         dash (other than first or last of the set) denotes a range
+         of characters: [A-Z] matches any upper case letter; if the
+         first character of the set is '^', then the sense of match
+         is reversed: [^0-9] matches any non-digit; several
+         characters need to be quoted with backslash (\) if they
+         occur in a set:  '\', ']', '-', and '^'; within sets,
+         various special character class designations are recognized,
+         such as [:digit:] and [:punct:], as per POSIX
+   |   alternation (similar to boolean 'or'); match either of two
+         patterns [for example "^start|stop$" matches leading 'start'
+         or trailing 'stop']
+   ( ) grouping, alter normal precedence [for example, "^(start|stop)$"
+         matches lines reading either 'start' or 'stop']
+   *   repeated matching; when placed after a pattern, indicates that
+         the pattern should match any number of times [for example,
+         "[a-z][0-9]*" matches a lower case letter followed by zero or
+         more digits]
+   +   repeated matching; when placed after a pattern, indicates that
+         the pattern should match one or more times ["[0-9]+" matches
+         any non-empty sequence of digits]
+   ?   optional matching; indicates that the pattern can match zero or
+         one times ["[a-z][0-9]?" matches lower case letter alone or
+         followed by a single digit]
+   { } interval specification; {n} to match n times or {m,n} to match
+         at least m but not more than n times; only functional when
+         either the `-Wposix' or `-Wre-interval' options are used
+   \   quote; prevent the character which follows from having special
+         meaning; if the regexp is specified as a string, then the
+         backslash itself will need to be quoted by preceding it with
+         another backslash
+
+ A regular expression which matches a string or line will match against
+ the first (left-most) substring which meets the pattern and include
+ the longest sequence of characters which still meets that pattern.
+3 comments
+ Comments in awk programs are introduced with '#'.  Anything after
+ '#' on a line is ignored by GAWK.  It's a good idea to include an
+ explanation of what an awk program is doing and also who wrote it
+ and when.
+3 further_information
+ For complete documentation on GAWK, see "Effective AWK Programming"
+ by Arnold Robbins.  The second edition (ISBN 1-57831-000-8) is jointly
+ published by SSC and the FSF (http://www.ssc.com).
+
+ Source text for it is present in the file GAWK.TEXI.  A postscript
+ version is available via anonymous FTP from host gnudist.gnu.org in
+ directory /gnu/gawk, file gawk-{version}-doc.tar.gz where {version}
+ would be the current version number, such as 3.0.6.
+
+ Another source of documentation is "The AWK Programming Language"
+ by Aho, Weinberger, and Kernighan (1988), published by Addison-Wesley.
+ ISBN code is 0-201-07981-X.
+
+ Each of these works contains both a reference on the awk language
+ and a tutorial on awk's use, with many sample programs.
+3 authors
+ The awk programming language was originally created by Alfred V. Aho,
+ Peter J. Weinberger, and Brian W. Kernighan in 1977.  The language
+ was revised and enhanced in a new version which was released in 1985.
+
+ GAWK, the GNU implementation of awk, was written in 1986 by Paul Rubin
+ and Jay Fenlason, with advice from Richard Stallman, and with
+ contributions from John Woods.  In 1988 and 1989, David Trueman and
+ Arnold Robbins revised GAWK for compatibility with the newer awk.
+ Arnold Robbins is the current maintainer.
+
+ GAWK version 2.11.1 was ported to VMS by Pat Rankin in November, 1989,
+ with further revisions in the Spring of 1990.  The VMS port was
+ incorporated into the official GNU distribution of version 2.13 in
+ Spring 1991.  (Version 2.12 was never publically released.)
+2 release_notes
+ GAWK 4.0.0 has many changes from 3.1.8, and these release_notes were
+ not updated for any of the 3.1.* releases, so some information is
+ probably missing or out of date.  In particular, the known_problems
+ subtopic hasn't been touched in many years.
+3 AWK_LIBRARY
+ GAWK uses a built in search path when looking for a program file
+ specified by the -f option (or the /input qualifier) when that file
+ name does not include a device and/or directory.  GAWK will first
+ look in the current default directory, then if the file wasn't found
+ it will look in the directory specified by the translation of logical
+ name "AWK_LIBRARY".
+3 known_problems
+ There are several known problems with GAWK running on VMS.  Some can
+ be ignored, others require work-arounds.
+4 file_formats
+ If a file having the RMS attribute "Fortran carriage control" is
+ read as input, it will generate an empty first record if the first
+ actual record begins with a space (leading space becomes a newline).
+ Also, the last record of the file will give a "record not terminated"
+ warning.  Both of these minor problems are due to the way that the
+ C Run-Time Library (VAXCRTL) converts record attributes.
+
+ Another poor feature without a work-around is that there's no way to
+ specify "append if possible, create with RMS text attributes if not"
+ with the current command line I/O redirection.  '>>$' isn't supported.
+ Ditto for binary output; '>>+' isn't supported.
+4 RS_peculiarities
+ Changing the record separator to something other than newline ('\n')
+ will produce anomalous results for ordinary files.  For example,
+ using RS = "\f" and FS = "\n" with the following input
+       |rec 1, line 1
+       |rec 1, line 2
+       |^L    (form feed)
+       |rec 2, line 1
+       |rec 2, line 2
+       |^L    (form feed)
+       |rec 3, line 1
+       |rec 3, line 2
+       |(end of file)
+ will produce two fields for record 1, but three fields each for
+ records 2 and 3.  This is because the form-feed record delimiter is
+ on its own line, so awk sees a newline after it.  Since newline is
+ now a field separator, records 2 and 3 will have null first fields.
+ The following awk code will work-around this problem by inserting
+ a null first field in the first record, so that all records can be
+ handled the same by subsequent processing.
+       # fix up for first record (RS != "\n")
+       FNR == 1  { if ( $0 == "" )     #leading separator
+                     next              #skip its null record
+                   else                #otherwise,
+                     $0 = FS $0        #realign fields
+                 }
+ There is a second problem with this same example.  It will always
+ trigger a "record not terminated" warning when it reaches the end of
+ file.  In the sample shown, there is no final separator; however, if
+ a trailing form-feed were present, it would produce a spurious final
+ record with two null fields.  This occurs because the I/O system
+ sees an implicit newline at the end of the last record, so awk sees
+ a pair of null fields separated by that newline.  The following code
+ fragment will fix that provided there are no null records (in this
+ case, that would be two consecutive lines containing just form-feeds).
+       # fix up for last record (RS != "\n")
+       $0 == FS  { next }      #drop spurious final record
+ Note that the "record not terminated" warning will persist.
+4 cmd_inconsistency
+ The DCL qualifier /OUTPUT is internally equivalent to '>$' output
+ redirection, but the qualifier /INPUT corresponds to the -f option
+ rather than to '<' input redirection.
+4 exit
+ The exit statement can optionally pass a final status value to the
+ operating system.  GAWK expects a UN*X-style value instead of a
+ VMS status value, so 0 indicates success.  A failure is indicated
+ by 1 and VMS will set the ERROR status.  A fatal error is indicated
+ by 2 and VMS will set the FATAL status.  All other values will will have
+ the SUCCESS status.  The exit value is encoded to comply with VMS
+ coding standards and will have the C_FACILITY_NO of 0x350000 with
+ the constant 0xA000 added to the number shifted over by 3 bits to
+ make room for the severity codes.
+
+ To extract the actual gawk exit code from the VMS status use:
+     unix_status = (vms_status .and. &x7f8) / 8
+
+ A C program that uses exec() to call gawk will get the original
+ UN*X-style exit value.
+
+ Older versions of Gawk treated Unix exit code 0 as 1, A failure as
+ 2, and a fatal error as 4, and passed all the other numbers through.
+ This violated the VMS exit status coding requirements.
+
+4 rounding
+ VAX/VMS floating point uses unbiased rounding.  This is different than
+ what portable gawk programs expect.
+
+3 changes
+ Changes between version 4.0.0 and earlier versions
+
+   [This 'changes' section hasn't been updated in many releases.  Some
+   features mentioned here may have become available in versions 3.1.*.]
+
+   General
+     dgawk.exe does interactive debugging of awk programs
+     pgawk.exe does comprehensive execution profiling of awk programs
+     pgawk.exe is not currently supplied for VMS.
+     -d[file] and -p[file] options added
+     -Wcompat and -Wusage options dropped; use -Wtraditional and -Whelp
+     BEGINFILE and ENDFILE built-in rule patterns
+     nextfile statement skips remainder of current input file
+     switch-case statement performs an alternate form of if-then-else
+     indirect function calls: var="user_function"; @var(args)
+
+     FPAT regexp pattern as alternative to FS field splitting
+     patsplit() function, FPAT analog to split()
+     PROCINFO["sorted_in"] can be used to control traversal order for
+       'for (index in array)' statement
+     asort(), asorti() functions, to sort arrays
+     sub-arrays: array element values can be arrays
+     isarray() function, to test whether a value is an array
+
+     PROCINFO["strftime"] can be used to supply default format for
+       date/time formatting by strftime() function
+     mktime() function, to convert list of separate date and time fields
+       into single numeric date/time value
+     and(), or(), xor(), compl(), lshift(), rshift() functions, to
+       perform bit-wise logic operations on numeric values
+     strtonum() function, to convert string of digits into number, with
+       support for radix prefix '0' (octal) and '0x' (hexadecimal)
+
+   VMS-specific
+     The VMS exit codes now correctly encode the gawk exit status and
+     the VMS severity bits are set.
+     Large file support is enabled on the platforms that support it.
+     Extended filename support is enabled on the platforms that support it.
+     New command qualifiers: /EXTRA_COMMANDS, /PROFILE, /DUMP_VARIABLES,
+       /OPTIMIZE, /TRADITIONAL, /SANDBOX, /NON_DECIMAL_DATA
+     Revised qualifier: /LINT, takes optional argument list
+     Deprecated qualifier: /STRICT, superseded by /TRADITIONAL
+3 prior_changes
+ Changes between version 3.1.8 and [...] and 3.0.6
+
+   [Someday someone ought to dig up and document this information....]
+
+ Changes between version 3.0.6 and 2.15.6
+
+   General
+     RS can contain multiple characters or be a regexp
+     Regular expression interval support added
+     gensub() and fflush() functions added
+     memory leak(s) introduced in 3.0.2 or 3.0.1 fixed
+     the user manual has been substantially revised
+
+   VMS-specific
+     Switched to build with DEC C by default
+ Changes between version 2.15.6 and 2.14
+
+   General
+     Many obscure bugs fixed
+     `delete' may operate on an entire array
+     ARGIND and ERRNO builtin variables added
+
+   VMS-specific
+     `>+ file' binary-mode output redirection added
+     /variable=(foo=42) fixed
+     Floating point number formatting improved
+
+ Changes between version 2.14 and 2.13.2:
+
+   General
+     'next file' construct added
+     'continue' outside of any loop is treated as 'next'
+     Assorted bug fixes and efficiency improvements
+     _The_GAWK_Manual_ updated
+     Test suite expanded
+
+   VMS-specific
+     VMS POSIX support added
+     Disk I/O throughput enhanced
+     Pipe emulation improved and incorrect interaction with user-mode
+         redefinition of SYS$OUTPUT eliminated
+
+ Changes between version 2.13 and 2.11.1:  (2.12 was not released)
+
+   General
+     CONVFMT and FIELDWIDTHS builtin control variables added
+     systime() and strftime() date/time functions added
+     'lint' and 'posix' run-time options added
+     '-W' command line option syntax supercedes '-c', '-C', and '-V'
+     '-a' and '-e' regular expression options made obsolete
+     Various bug fixes and efficiency improvements
+     More platforms supported ('officially' including VMS)
+
+   VMS-specific
+     %g printf format fixed
+     Handling of '\' on command line modified; no longer necessary to
+         double it up
+     Problem redirecting stderr (>&efile) at same time as stdin (<ifile)
+         or stdout (>ofile) has been fixed
+     ``2>&1'' and ``1>&2'' redirection constructs added
+     Interaction between command line I/O redirection and gawk pipes
+         fixed; also, name used for pseudo-pipe temporary file expanded
+3 license
+ GAWK is covered by the "GNU General Public License", the gist of which
+ is that if you supply this software to a third party, you are expressly
+ forbidden to prevent them from supplying it to a fourth party, and if
+ you supply binaries you must make the source code available to them
+ at no additional cost.  Any revisions or modified versions are also
+ covered by the same license.  There is no warranty, express or implied,
+ for this software.  It is provided "as is."
+
+ [Disclaimer:  This is just an informal summary with no legal basis;
+ refer to the actual GNU General Public License for specific details.]
+!2 examples
+!
diff --git a/gawk-5.0.1/vms/gawk_alias_setup.com b/gawk-5.0.1/vms/gawk_alias_setup.com
new file mode 100644
index 00000000000..45cbc21983d
--- /dev/null
+++ b/gawk-5.0.1/vms/gawk_alias_setup.com
@@ -0,0 +1,137 @@
+$! File: gawk_alias_setup.com
+$!
+$! The PCSI procedure needs a helper script to set up and remove aliases.
+$!
+$! If p1 starts with "R" then remove instead of install.
+$!
+$!
+$! 02-Jan-2014  J. Malmberg - Gawk Version
+$!
+$!===========================================================================
+$!
+$ mode = "install"
+$ code = f$extract(0, 1, p1)
+$ if code .eqs. "R" .or. code .eqs. "r" then mode = "remove"
+$!
+$ arch_type = f$getsyi("ARCH_NAME")
+$ arch_code = f$extract(0, 1, arch_type)
+$!
+$ if arch_code .nes. "V"
+$ then
+$   set proc/parse=extended
+$ endif
+$!
+$!
+$ call do_alias "gawk" "[usr.bin]"
+$ call do_alias "gawk" "[usr.bin]" "awk"
+$ call do_alias "gawk.1" "[usr.share.man.man1]" "awk.1"
+$!
+$ exit
+$!!
+$!
+$do_alias: subroutine
+$ if mode .eqs. "install"
+$ then
+$   call add_alias "''p1'" "''p2'" "''p3'" "''p4'"
+$ else
+$   call remove_alias "''p1'" "''p2'" "''p3'" "''p4'"
+$ endif
+$ exit
+$ENDSUBROUTINE ! do_alias
+$!
+$!
+$! P1 is the filename, p2 is the directory prefix,
+$! p3 is the alias name if different than p1
+$! p4 is the alias directory if different than p2
+$add_alias: subroutine
+$ if p3 .eqs. "" then p3 = p1
+$ if p4 .eqs. "" then p4 = p2
+$ ftype = f$element(1, ".", p1)
+$ if ftype .eqs. "."
+$ then
+$    file = "gnv$gnu:''p2'gnv$''p1'.EXE"
+$    alias = "gnv$gnu:''p4'''p3'."
+$ else
+$    file = "gnv$gnu:''p2'''p1'"
+$    alias = "gnv$gnu:''p4'''p3'"
+$ endif
+$ if f$search(file) .nes. ""
+$ then
+$   fid = ""
+$   mess = f$environment("message")
+$   if f$search(alias) .nes. ""
+$   then
+$      on warn then goto fix_link
+$      set message/nofac/nosev/noident/notext
+$      fid = f$file_attributes(alias, "FID")
+$   endif
+$   goto fix_link_end
+$fix_link:
+$    set file/remove 'alias';
+$fix_link_end:
+$   set message'mess'
+$   if f$search(alias) .eqs. ""
+$   then
+$       set file/enter='alias' 'file'
+$   endif
+$   alias1 = alias + "exe"
+$   if (ftype .eqs. ".")
+$   then
+$     fid = ""
+$     mess = f$environment("message")
+$     if f$search(alias1) .nes. ""
+$     then
+$       on warn then goto fix_link1
+$       set message/nofac/nosev/noident/notext
+$       fid = f$file_attributes(alias1, "FID")
+$     endif
+$     goto fix_link_end1
+$fix_link1:
+$    set file/remove 'alias1';
+$fix_link_end1:
+$   set message'mess'
+$     if (f$search(alias1) .eqs. "")
+$     then
+$       set file/enter='alias1' 'file'
+$     endif
+$   endif
+$ endif
+$ exit
+$ENDSUBROUTINE ! add_alias
+$!
+$remove_alias: subroutine
+$ if p3 .eqs. "" then p3 = p1
+$ if p4 .eqs. "" then p4 = p2
+$ ftype = f$element(1, ".", p1)
+$ if ftype .eqs. "."
+$ then
+$   file = "gnv$gnu:''p2'gnv$''p1'.EXE"
+$   alias = "gnv$gnu:''p4'''p3'."
+$ else
+$   file = "gnv$gnu:''p2'''p1'"
+$   alias = "gnv$gnu:''p4'''p3'"
+$ endif
+$ file_fid = "No_file_fid"
+$ if f$search(file) .nes. ""
+$ then
+$   fid = f$file_attributes(file, "FID")
+$   if f$search(alias) .nes. ""
+$   then
+$       afid = f$file_attributes(alias, "FID")
+$       if (afid .eqs. fid)
+$       then
+$           set file/remove 'alias';
+$       endif
+$   endif
+$   alias1 = alias + "exe"
+$   if (ftype .eqs. ".") .and. (f$search(alias1) .nes. "")
+$   then
+$       afid = f$file_attributes(alias1, "FID")
+$       if (afid .eqs. fid)
+$       then
+$           set file/remove 'alias1';
+$       endif
+$   endif
+$ endif
+$ exit
+$ENDSUBROUTINE ! remove_alias
diff --git a/gawk-5.0.1/vms/gawk_build_steps.txt b/gawk-5.0.1/vms/gawk_build_steps.txt
new file mode 100644
index 00000000000..b3bb281b876
--- /dev/null
+++ b/gawk-5.0.1/vms/gawk_build_steps.txt
@@ -0,0 +1,220 @@
+From File: gawk_build_steps.txt
+
+Building GAWK on OpenVMS for use with GNV requires a current HP C compiler
+and MMK.
+
+The HP C 7.x compilers were used for building on Alpha and Itanium.
+The Compaq C 6.4 compiler is being used on VAX.
+
+MMK was obtained from https://github.com/endlesssoftware/mmk
+
+Several special things were done in this port of Gawk to VMS to make it
+easier to keep it up to date with the Unix version.
+
+Note the GNV$ prefix is registered for the GNV project to prevent name
+collisions with other products and packages.  This is a VMS convention.
+
+The files are stored with GNV_ instead of GNV$ most open source source
+code maintainers do not want to files with $ in their source repositories.
+
+The build procedure will copy the files to have the GNV$ names as needed.
+
+1. The original GNU Gawk source files are in their own directory tree which
+is never written to by the build process.  This directory is kept up to date
+with the current official patches.  See below about the how this is done
+with logical names.
+
+2. A file vms_eco_level.h is used to set the ECO of the package.  The
+vms_eco_level.h needs to be set back to zero if the version or patch level
+of the GNU Unix source is changed.  This file is currently only used
+by the kit building procedure.
+
+The source kits are provided in backup savesets inside of the PCSI install kit.
+
+Backup save sets are currently the only distribution medium that I can be
+sure is installed on a target VMS system that will correctly unpack files
+with extended character sets in them.  You may need to adjust the ownership
+of the restored files for kits on Alpha/Itanium VMS versions 8.1 and earlier.
+
+On VAX, the filenames will be as seen on the VAX system, typically with non
+ODS-2 characters and case changes prefixed with $ characters.
+
+[gnv.common_src]gawk_*_original_src.bck is the original source of the
+gawk kit as provided by the GNV project.
+[gnv.vms_src]gawk-*_vms_src.bck, if present, has the changed files that
+are used for building that are not yet in the gawk source kits
+distributed by the GNU gawk project.
+
+These backup savesets should be restored to different directory trees on
+an ODS-5 volume(s) which are referenced by concealed rooted logical names,
+unless on VAX, where either an NFS or ODS-2 volume can be used.
+
+SRC_ROOT: is for the source files common to all platforms.  This can be a
+          read only copy of the files from a change control repository.
+
+          In my build environment, the TRUNK_ROOT:[gawk] is the
+          same directory as src_root:[gawk].  TRUNK_ROOT:[gawk] is a
+          checkout of the gawk repository used for the build.
+
+VMS_ROOT: is for the files that were changed from the repository copy of
+          SRC_ROOT:
+
+          Note, you should create the VMS_ROOT: directory tree even if it is
+          initially empty.  This is where you should put edits if you are
+          making changes.
+
+          In my build environment, the source_root:[gnu_vms.gawk] is a
+          directory with the checked out code and vms_root:[gawk] is
+          a copy with any local modifications.
+
+          The command procedure compare_gawk_source.com will report any
+          differences in the source_root:[gnu_vms.gawk] directory and the
+          vms_root:[gawk] directory.  If the source_root: logical is not
+          defined, it will translate the logical name src_root to do the
+          effective of src_root:[gawk.-.-.gnu_vms.gawk] to find the
+          VMS specific code CVS checkout based on where the checkout for
+          the GNU source is expected to be.
+
+LCL_ROOT: is manually created to have the same base and sub-directories as
+          SRC_ROOT: and VMS_ROOT:  This is for the architecture specific
+          binaries and other files created during the build.
+
+The logical name REF_ROOT: is optionally defined to be a logical name that
+is a search list for VMS_ROOT:,SRC_ROOT:
+
+The logical name PRJ_ROOT: is defined to be a logical name that is a search
+list for LCL_ROOT:,REF_ROOT:
+
+The VMS_ROOT and LCL_ROOT directory trees can be created with commands
+similar to:
+
+  $ create/dir lcl_root:[gawk]/prot=w:re
+  $ copy src_root:[gawk...]*.dir -
+    lcl_root:[gawk...]/prot=(o:rwed,w:re)
+  $ create/dir vms_root:[gawk]/prot=w:re
+  $ copy src_root:[gawk...]*.dir -
+    vms_root:[gawk...]/prot=(o:rwed,w:re)
+
+One of the ways with to protect the source from being modified is to have
+the directories under src_root: owned by a user or resource where the build
+username only has read access to it.
+
+Edit the file gawk_release_note_start.txt or other text files to reflect
+any changes.
+
+Edit the file PCSI_GAWK_FILE_LIST.TXT if there are new files added to the
+kit.  These files should all be ODS-2 legal filenames and directories.
+
+Note that if src_root: or vms_root: are NFS mounted disks, the
+step of backing up the source files will probably hang or fail.
+
+You need to copy the source files to VMS mounted disks and create
+logical names SRC_ROOT1 and VMS_ROOT1 to work around this to to
+reference local disks.  Make sure src_root1:[000000] and
+vms_root1:[000000] exist and can be written to.
+
+The command procedure compare_gawk_source can be used to check
+those directories and keep them up to date.
+
+    @[.vms]compare_gawk_source.com SRCBCK UPDATE
+
+    This compares the reference GNU source with the backup
+    staging directory for it and updates with any changes.
+
+    @[.vms]compare_gawk_source.com VMSBCK UPDATE
+
+    This compares the VMS specific source with the backup
+    staging directory for it and updates with any changes.
+
+    Leave off "UPDATE" to just check without doing any changes.
+
+    If you are not using NFS mounted disks and do not want to have a
+    separate directory for staging the sources for backup make sure
+    that src_root1: and vms_root1: do not exist.
+
+The kits will be built in the directory STAGE_ROOT:[KIT], which must be
+writable to the build procedure.
+
+Define the logical name GNV_PCSI_PRODUCER to indicate who is making the
+distribution.
+
+Define the logical name GNV_PCSI_PRODUCER_FULL_NAME to be your full name
+or full name of your company.
+
+These two GNV_PCSI_* logical names need to be manually defined to indicate
+the "branding" to differentiate the source of the kit.
+
+A limitation of the PCSI kitting procedure is that when selecting files, it
+tends to ignore the directory structure and assumes that all files with the
+same name are the same file, so every file placed in the kit must have a
+unique ODS-2 legal name.  Then a procedure needs to be added to the kit to
+create an alias link on install and remove the link on remove.
+
+While newer versions of PCSI can support ODS-5 filenames, not all verions
+of PCSI on systems that have ODS-5 filenames do.  So as a post install step,
+the PCSI kit built by these steps does a rename to the correct case.
+
+With these search lists set up and the logical names described, Gawk can
+be built and kitted by setting your default to PRJ_ROOT:[gawk]
+and then issuing the command:
+
+   $ @[.vms]pcsi_product_gawk.com
+
+First it will build the binaries by using  MMK utility.  The case of the
+parameter may be significant on ODS-5.
+
+   $ mmk/descrip=[.vms]descrip.mms gawk
+
+Then for Alpha and Itanium, it will build the dynamic extensions.
+
+   $ mmk/descrip=[.vms]descrip.mms extensions
+
+To clean up after a build to start over, run mmk with the target spotless.
+
+   $ mmk/descrip=[.vms]descrip.mms spotless
+
+The files are installed into a NEW_GNU directory for staging by running the
+procedure stage_gawk_install.com.  This copies the binaries and creates
+alias links to them.
+
+   $ @[.vms]stage_gawk_install.com remove
+   $ @[.vms]stage_gawk_install.com
+
+On the VAX platform, the staged files are needed for building the PCSI
+kit, as the VAX source was staged on an NFS volume, which encodes the
+filenames that have any upper case or special symbols in them.
+
+To remove the staged files, the procedure is run again with the parameter
+"REMOVE".  This makes sure that the alias links are removed.
+
+The names and contents of the PCSI files requires that the version of
+gawk be encoded in a special format.  This is done by:
+
+   @[.vms]make_pcsi_gawk_kit_name.com
+
+The release notes are built from the release note start, readme files and
+this file:
+
+   @[.release]build_gawk_release_notes.com
+
+Then the backup the source kits.
+
+Building a PCSI kit for an architecture takes the following steps after
+making sure that you have a working build environment.
+
+On VAX, the product command always prompts to the terminal for a confirmation.
+
+If there is another kit for this same version of gawk, but for a different
+base platform or operating system version, the product command will prompt
+to the terminal to select which one to compress.
+
+       The following message is normal:
+          %PCSI-I-CANNOTVAL, cannot validate
+            EAGLE$DQA0:[stage_root.][kit]GNV-AXPVMS-GAWK-V--1.PCSI;1
+          -PCSI-I-NOTSIGNED, product kit is not signed and therefore has
+          no manifest file
+
+This will result in both compressed and uncompressed kits for the target
+platform.
+
+Good Luck.
diff --git a/gawk-5.0.1/vms/gawk_ident.com b/gawk-5.0.1/vms/gawk_ident.com
new file mode 100644
index 00000000000..5b3966f9931
--- /dev/null
+++ b/gawk-5.0.1/vms/gawk_ident.com
@@ -0,0 +1,21 @@
+$! gawk_ident.com - Append ident with version to gawk.
+$!
+$!
+$ open/read cfgh config.h
+$cfgh_loop:
+$ read/end=cfgh_loop_end cfgh line_in
+$ key1 = f$element(0, " ", line_in)
+$ if key1 .nes. "#define" then goto cfgh_loop
+$ key2 = f$element(1, " ", line_in)
+$ if key2 .nes. "VERSION" then goto cfgh_loop
+$ version_string = f$element(2, " ", line_in) - """" - """"
+$ ver_major = f$element(0, ".", version_string)
+$ ver_minor = f$element(1, ".", version_string)
+$ REL = ver_major + "." + ver_minor
+$ PATCHLVL = f$element(2, ".", version_string)
+$cfgh_loop_end:
+$ close cfgh
+$!
+$ open/append Fopt gawk.opt
+$ write Fopt "identification=""V''REL'.''PATCHLVL'"""
+$ close Fopt
diff --git a/gawk-5.0.1/vms/gawk_plugin.opt b/gawk-5.0.1/vms/gawk_plugin.opt
new file mode 100644
index 00000000000..b0523d080f4
--- /dev/null
+++ b/gawk-5.0.1/vms/gawk_plugin.opt
@@ -0,0 +1,5 @@
+CASE_SENSITIVE=YES
+SYMBOL_VECTOR=(plugin_is_GPL_compatible=DATA)
+SYMBOL_VECTOR=(PLUGIN_IS_GPL_COMPATIBLE/plugin_is_GPL_compatible=DATA)
+SYMBOL_VECTOR=(dl_load=PROCEDURE)
+SYMBOL_VECTOR=(DL_LOAD/dl_load=PROCEDURE)
diff --git a/gawk-5.0.1/vms/gawk_release_note_start.txt b/gawk-5.0.1/vms/gawk_release_note_start.txt
new file mode 100644
index 00000000000..cb7dc5f5c59
--- /dev/null
+++ b/gawk-5.0.1/vms/gawk_release_note_start.txt
@@ -0,0 +1,200 @@
+From file: gawk_release_note_start.com
+
+This is GNU gawk packaged for VMS.
+
+The original readme files for GAWK for standalone building on VMS are
+supplied here along with a procedure for building GAWK for the making
+a PCSI kit.
+
+Note: I am a hobbyist and am not providing any support or any commitment
+to supply bug fixes or future releases.  This code is as-is with no
+warrantees.
+
+The testing of this port of Gawk involved running some self tests that
+were provided with the source.
+
+This version of gawk supports dynamically loaded extensions on Alpha and
+Itanium versions of VMS.  The pre-built dynamically loaded extensions
+are in gnv$gnu:[usr.lib.gawk].
+
+The linker option file used to build a dynamically loaded extension is
+located in gnv$gnu:[usr.src.gawk.extension.vms], and the gawkapi.h file
+is in gnv$gnu:[usr.include].
+
+Special installation notes:
+
+*  Please see https://sourceforge.net/p/gnv/wiki/InstallingGNVPackages/
+   for the latest information on installing GNV related PCSI kits.
+
+*  We are updating and replacing GNV one kit at a time and transitioning
+   GNV to be a set of kits that the GNV package will install.  During
+   this transition some extra issues will need to be handled during
+   installs and upgrades.
+
+*  Due to the way that PCSI identifies packages, if you install a package
+   from one producer and then want to upgrade it from another producer,
+   you will probably need to uninstall the previous package first.
+
+   Some of these packages were previously created with different producer
+   prefixes.  We are standardizing on VMSPORTS and GNV as the branding
+   prefixes.  GNV will be for packages that are part of the GNV product
+   suite, and VMSPORTS will be for most other packages.
+
+   This uninstall can cause warning messages about dependencies.  If you
+   are transitioning to an upwardly compatible package, you can ignore
+   those warnings.
+
+*  This package should be installed to the same volume as GNV is installed.
+
+   If you uninstall or upgrade GNV or install a GNV from before the
+   transition is complete, you will need to reinstall all other packages
+   that install to the same GNV directory tree.
+
+   This is because at least some of the existing GNV installation procedures
+   have bugs in them were instead of just deleting the files that were
+   installed, they delete all files in the GNV directory tree.
+
+*  Because this is a transition, this package is replacing files from the
+   old GNV packages.  This is a necessary issue to allow incremental
+   improvement as we can not replace the GNV package until we get all
+   the component packages done.
+
+*  The GNV 2.x through at least the 3.0.1 kits make an unusual change
+   to the disk directory structure where they are installed where
+   they use the [vms$common.gnv] as a mount point and mount the posix
+   root on it.  This is a bug because it causes many problems and does
+   not offer any advantages.  One of the problems is that it causes
+   problems with other PCSI installs and uninstalls to that directory.
+
+   This bug can be manually repaired such as has been done on
+   on encompasserve.org as documented in PORTING_TO_VMS notes conference.
+
+   At this time, we do not have a scripted repair to this bug, and it
+   may not be possible to fully script a repair because this bug can
+   cause the POSIX root and [vms$common.gnv] to have different contents
+   when they should be the same directory, and it will take a manual
+   inspection to select which files go where.
+
+*  Because of the directory change bug, the gnv$startup.com in the GNV
+   kit must be run when the system boots up or the [vms$common.gnv]
+   directory will appear to be empty.
+
+   If a PCSI kit like this one is installed when the GNV startup has not
+   been run, it will create a new directory tree under [vms$common.gnv]
+   that will not be visible to the posix root.  If you uninstall this
+   PCSI kit before running the gnv$startup.com procedure then you can
+   install it after running the gnv$startup.com procedure.  If you have
+   run the gnv$startup.com procedure after the install, then you have
+   a mess, and you will need to use the GNV umnt to un-mount the
+   [vms$common.gnv] directory before the uninstall of this kit will
+   work.
+
+An analyze/disk/repair step on the installation disk should be done after
+installation to collect files left over from incomplete deletions into the
+SYSLOST directory.  This step should be done on a "quiet" system per HP
+recomendations.
+
+Bugs can be logged at the tracker with https://sourceforge.net/projects/gnv/.
+There is no guarantee that bugs will be fixed for a hobbyist build.
+
+VMS specific port information:
+
+The logical name GNV$GNU is used to find the simulated posix root and defines
+the logical name SYS$POSIX_ROOT in the process table in user mode for child
+processes if needed.  This is to comply with VMS logical name conventions.
+The logical name BIN is also set in the process table in user mode to be
+GNV$GNU:[BIN] if it is not already set.
+
+The following DECC$Feature settings are in in effect for Gawk by default:
+
+DECC$ACL_ACCESS_CHECK enabled.
+DECC$ALLOW_REMOVE_OPEN_FILES enabled.
+DECC$ARGV_PARSE_STYLE enabled.
+DECC$EFS_CASE_PRESERVE enabled.
+DECC$EFS_CHARSET enabled.
+DECC$EFS_FILE_TIMESTAMPS enabled.
+DECC$ENABLE_GETENV_CACHE enabled.
+DECC$EXEC_FILEATTR_INHERITANCE set to 2.
+DECC$FILE_PERMISSION_UNIX enabled.
+DECC$FILE_SHARING enabled.
+DECC$FILE_OWNER_UNIX enabled.
+DECC$FILENAME_REPORT_UNIX enabled.
+DECC$FILENAME_UNIX_NO_VERSION enabled.
+DECC$GLOB_UNIX_STYLE enabled.
+DECC$POSIX_SEEK_STREAM_FILE enabled.
+DECC$READDIR_DROPDOTNOTYPE enabled.
+DECC$RENAME_NO_INHERIT enabled.
+DECC$STDIO_CTX_EOL enabled.
+DECC$STRTOL_ERANGE enabled.
+DECC$UNIX_PATH_BEFORE_LOGNAME enabled.
+
+While more strict UNIX compatibility feature settings can be applied by users
+by setting feature logical names, these settings are all the Bash and most
+ported programs need.
+
+This port of Gawk uses the VMS CRTL to handle the Unix format pathnames
+and as such is dependent on them.  It is a known issue that directories with
+a Unix name "file.dir/" and some symbolic links are not handled correctly.
+This is a combination of problems with RMS and CRTL.  The RMS portion is
+fixed with the VMS84?_RMS-V0300 ECO kit.  I am not aware of a CRTL kit that
+fixes the issues.
+
+This kit is designed to be used with the GNV Bash 4.2.45 or later kit.
+
+
+Fixes and enhancements:
+
+ Gawk 4.1.3 ECO 1
+
+* The previous GAWK kits were placing the binaries in /bin instead of
+  /usr/bin, and not cleaning up the older binaries from the /bin directory
+  after an update.
+
+* The older kits could not properly detect the VSI releases of OpenVMS.
+
+ Older kits:
+
+* No logical names required for proper Gawk operations other than GNV$GNU
+  for locating the simulated "/".
+
+* GNV$GNU is used to find the posix root and locally sets SYS$POSIX_ROOT
+  for child processes if needed.  This is to comply with VMS logical
+  name conventions.  The logical name BIN is also set locally to be
+  GNV$GNU:[BIN] if it is not already set.
+
+* config.h now generated at part of the build from a template.
+
+The supplied GNV$GAWK_STARTUP.COM procedure is provided in
+[VMS$COMMON.SYS$STARTUP] can be put in your VMS startup procedure to install
+selected images as known because they need privileges.  It is recommended
+that the GNV$STARTUP.COM procedure be run first, followed by the
+GNV$BASH_STARTUP.COM procedure before the GNV$GAWK_STARTUP.COM is
+executed.
+
+The names of the gawk image have been prefixed with GNV$ to prevent
+possible naming conflicts with other programs that are on the system.  The
+GNV$ prefix has been registered with HP for this purpose.
+
+OpenVMS specific building and kitting instructions are after the standard
+bash readme file below.
+
+The source kits contains files for building Gawk using MMK.
+MMK 4.0 was used for this build on Alpha and Itanium Itanium.
+
+Currently, the focus of the OpenVMS GNV porting team is to address bugs in
+the OpenVMS port of GNV components that pose immediate barriers to running
+configure and make scripts for Open Source Software packages targeting
+OpenVMS environments.
+
+The GNV development team is involved in an ongoing effort to identify and
+document the underlying technical causes for these current limitations and (if
+available) workarounds as well as developing code fixes to eliminate them. The
+VMS-Ports Source Forge project at https://sourceforge.net/p/vms-ports/tickets/
+currently documents OpenVMS CRTL bugs and limitations with respect to porting
+Open Source Software using OpenVMS. The VMS-Ports Source Forge Project also
+contains examples of ported packages provided by volunteer contributors as well
+as documentation with recommendations on how to setup, modify and use the
+OpenVMS GNV environment for the purpose of porting Open Source software
+packages to OpenVMS. Browse to https://sourceforge.net/p/vms-ports/wiki/Home/
+for more information.
+
diff --git a/gawk-5.0.1/vms/gawk_verb.com b/gawk-5.0.1/vms/gawk_verb.com
new file mode 100644
index 00000000000..f18627c70d1
--- /dev/null
+++ b/gawk-5.0.1/vms/gawk_verb.com
@@ -0,0 +1,26 @@
+$! gawk_verb.com - build the gawk_verb.cld from the gawk.cld.
+$!
+$! The CLD file needed to modify a DCL command table is different
+$! from the CLD file needed to build the product by specifying an image.
+$!
+$! So read in the [.vms]gawk.cld and generate a gawk_verb.cld.
+$!
+$! 23-Dec-2012 - J. Malmberg
+$!
+$outfile = "sys$disk:[]gawk_verb.cld"
+$infile = "[.vms]gawk.cld"
+$open/read cld 'infile'
+$create 'outfile'
+$open/append cldv 'outfile'
+$loop:
+$read cld/end=loop_end line_in
+$if f$locate("image gawk", line_in) .lt. f$length(line_in)
+$then
+$    write cldv "    image gnv$gnu:[usr.bin]gnv$gawk"
+$    goto loop
+$endif
+$write cldv line_in
+$goto loop
+$loop_end:
+$close cldv
+$close cld
diff --git a/gawk-5.0.1/vms/gawkmisc.vms b/gawk-5.0.1/vms/gawkmisc.vms
new file mode 100644
index 00000000000..725cf6690f5
--- /dev/null
+++ b/gawk-5.0.1/vms/gawkmisc.vms
@@ -0,0 +1,662 @@
+/*
+ * gawkmisc.vms --- miscellanious gawk routines that are OS specific.
+ */
+
+/* 
+ * Copyright (C) 1986, 1988, 1989, 1991-1996, 2003, 2011, 2014
+ * the Free Software Foundation, Inc.
+ * 
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Progamming Language.
+ * 
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#include <descrip.h>
+#include <dvidef.h>
+#include <efndef.h>
+#include <fscndef.h>
+#include <stsdef.h>
+#include <time.h>
+#include <lnmdef.h>
+
+
+#pragma member_alignment save
+#pragma nomember_alignment longword
+struct item_list_3 {
+	unsigned short len;
+	unsigned short code;
+	void * bufadr;
+	unsigned short * retlen;
+};
+
+struct filescan_itmlst_2 {
+    unsigned short length;
+    unsigned short itmcode;
+    char * component;
+};
+
+#pragma member_alignment
+
+int SYS$GETDVIW(
+        unsigned long efn,
+        unsigned short chan,
+        const struct dsc$descriptor_s * devnam,
+        const struct item_list_3 * itmlst,
+        void * iosb,
+        void (* astadr)(unsigned long),
+        unsigned long astprm,
+        void * nullarg);
+
+int SYS$FILESCAN(
+        const struct dsc$descriptor_s * srcstr,
+        struct filescan_itmlst_2 * valuelist,
+        unsigned long * fldflags,
+        struct dsc$descriptor_s *auxout,
+        unsigned short * retlen);
+
+int   SYS$TRNLNM(
+        const unsigned long * attr,
+        const struct dsc$descriptor_s * table_dsc,
+        struct dsc$descriptor_s * name_dsc,
+        const unsigned char * acmode,
+        const struct item_list_3 * item_list);
+
+char quote = '\'';
+char *defpath = DEFPATH;
+char *deflibpath = DEFLIBPATH;
+char envsep  = ',';
+#define VMS_NAME_LEN 255
+static char vms_name[VMS_NAME_LEN+1];
+
+/* Take all the fun out of simply looking up a logical name */
+static int sys_trnlnm
+   (const char * logname,
+    char * value,
+    int value_len)
+{
+	const $DESCRIPTOR(table_dsc, "LNM$FILE_DEV");
+	const unsigned long attr = LNM$M_CASE_BLIND;
+	struct dsc$descriptor_s name_dsc;
+	int status;
+	unsigned short result;
+	struct item_list_3 itlst[2];
+
+	itlst[0].len = value_len;
+	itlst[0].code = LNM$_STRING;
+	itlst[0].bufadr = value;
+	itlst[0].retlen = &result;
+
+	itlst[1].len = 0;
+	itlst[1].code = 0;
+
+	name_dsc.dsc$w_length = strlen(logname);
+	name_dsc.dsc$a_pointer = (char *)logname;
+	name_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+	name_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+	status = SYS$TRNLNM(&attr, &table_dsc, &name_dsc, 0, itlst);
+
+	if ($VMS_STATUS_SUCCESS(status)) {
+
+		/* Null terminate and return the string */
+		value[result] = '\0';
+	}
+
+	return status;
+}
+
+
+/* gawk_name --- pull out the "gawk" part from how the OS called us */
+
+/* You would not think that this should be a such a problem, but
+ * VMS extended file specifications are tricky to parse, and we have
+ * to tell the difference between a CRTL generated argv[0] and a
+ * passed exec() argv[0] and handle both cases.
+ */
+
+char *
+gawk_name(filespec)
+const char *filespec;
+{
+	int status;
+	int result;
+	char * shell;
+	int lcname = 0;
+
+	/* If the path name starts with a /, then it is an absolute path
+	 * that may have been generated by the CRTL instead of the command
+	 * name.  If it is the device name between the slashes, then this
+	 * was likely from the run command and needs to be fixed up.
+	 * If the DECC$POSIX_COMPLIANT_PATHNAMES is set to 2, then it is
+	 * the DISK$VOLUME that will be present, and it will still need to
+	 * be fixed.
+	 */
+
+	result = 0;
+	if (filespec[0] == '/') {
+		char * nextslash;
+		int length;
+		struct item_list_3 itemlist[3];
+		unsigned short dvi_iosb[4];
+		char alldevnam[64];
+		unsigned short alldevnam_len;
+		struct dsc$descriptor_s devname_dsc;
+		char diskvolnam[256];
+		unsigned short diskvolnam_len;
+
+		 /* Get some information about the disk */
+		/*--------------------------------------*/
+		itemlist[0].len = (sizeof alldevnam) - 1;
+		itemlist[0].code = DVI$_ALLDEVNAM;
+		itemlist[0].bufadr = alldevnam;
+		itemlist[0].retlen = &alldevnam_len;
+		itemlist[1].len = (sizeof diskvolnam) - 1 - 5;
+		itemlist[1].code = DVI$_VOLNAM;
+		itemlist[1].bufadr = &diskvolnam[5];
+		itemlist[1].retlen = &diskvolnam_len;
+		itemlist[2].len = 0;
+		itemlist[2].code = 0;
+
+		/* Add the prefix for the volume name. */
+		/* SYS$GETDVI will append the volume name to this */
+		strcpy(diskvolnam,"DISK$");
+
+		nextslash = strchr(&filespec[1], '/');
+		if (nextslash != NULL) {
+			length = nextslash - filespec - 1;
+
+			/* DECC requires a cast here */
+			devname_dsc.dsc$a_pointer = (char *)&filespec[1];
+			devname_dsc.dsc$w_length = length;
+			devname_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+			devname_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+			status = SYS$GETDVIW(
+				EFN$C_ENF,
+				0,
+				&devname_dsc,
+				itemlist,
+				dvi_iosb,
+				NULL, 0, 0);
+			if (!$VMS_STATUS_SUCCESS(status)) {
+				/* If the sys$getdviw fails, then this path
+				 * was passed by an exec() program and not
+				 * from DCL, so do nothing.
+				 * An example is "/tmp/program" where tmp:
+				 * does not exist
+				 */
+				result = 0;
+			} else if (!$VMS_STATUS_SUCCESS(dvi_iosb[0])) {
+				result = 0;
+			} else {
+				char * devnam;
+				int devnam_len;
+				char argv_dev[64];
+
+				/* Null terminate the returned alldevnam */
+				alldevnam[alldevnam_len] = 0;
+				devnam = alldevnam;
+				devnam_len = alldevnam_len;
+
+				/* Need to skip past any leading underscore */
+				if (devnam[0] == '_') {
+					devnam++;
+					devnam_len--;
+				}
+
+				/* And remove the trailing colon */
+				if (devnam[devnam_len - 1] == ':') {
+					devnam_len--;
+					devnam[devnam_len] = 0;
+				}
+
+				/* Null terminate the returned volnam */
+				diskvolnam_len += 5;
+				diskvolnam[diskvolnam_len] = 0;
+
+				/* Check first for normal CRTL behavior */
+				if (devnam_len == length) {
+					strncpy(vms_name, &filespec[1], length);
+				vms_name[length] = 0;
+				result = (strcasecmp(devnam, vms_name) == 0);
+				}
+
+				/* If we have not got a match check for
+				 * POSIX Compliant behavior.  To be more
+				 * accurate, we could also check to see
+				 * if that feature is active.
+				 */
+				if ((result == 0) &&
+				    (diskvolnam_len == length)) {
+					int cmp;
+					strncpy(vms_name, &filespec[1], length);
+					vms_name[length] = 0;
+					cmp = strcasecmp(diskvolnam, vms_name);
+					result = (cmp == 0);
+				}
+			}
+		}
+	} else {
+		/* The path did not start with a slash, so it could be VMS
+		 * format.  If it is vms format, it has a volume/device in
+		 * it as it must be an absolute path
+		 */
+		struct dsc$descriptor_s path_desc;
+		int status;
+		unsigned long field_flags;
+		struct filescan_itmlst_2 item_list[5];
+		char * volume;
+		char * name;
+		int name_len;
+		char * ext;
+
+		/* DECC requires a cast here */
+		path_desc.dsc$a_pointer = (char *)filespec;
+		path_desc.dsc$w_length = strlen(filespec);
+		path_desc.dsc$b_dtype = DSC$K_DTYPE_T;
+		path_desc.dsc$b_class = DSC$K_CLASS_S;
+
+		/* Don't actually need to initialize anything buf itmcode */
+		/* I just do not like uninitialized input values */
+
+		/* Sanity check, this must be the same length as input */
+		item_list[0].itmcode = FSCN$_FILESPEC;
+		item_list[0].length = 0;
+		item_list[0].component = NULL;
+
+		/* If the device is present, then it if a VMS spec */
+		item_list[1].itmcode = FSCN$_DEVICE;
+		item_list[1].length = 0;
+		item_list[1].component = NULL;
+
+		/* we need the program name and type */
+		item_list[2].itmcode = FSCN$_NAME;
+		item_list[2].length = 0;
+		item_list[2].component = NULL;
+
+		item_list[3].itmcode = FSCN$_TYPE;
+		item_list[3].length = 0;
+		item_list[3].component = NULL;
+
+		/* End the list */
+		item_list[4].itmcode = 0;
+		item_list[4].length = 0;
+		item_list[4].component = NULL;
+
+		status = SYS$FILESCAN(
+		    (const struct dsc$descriptor_s *)&path_desc,
+		     item_list, &field_flags, NULL, NULL);
+
+		if ($VMS_STATUS_SUCCESS(status) &&
+		   (item_list[0].length == path_desc.dsc$w_length) &&
+		   (item_list[1].length != 0)) {
+
+			char * dollar;
+			int keep_ext;
+			int i;
+
+			/* We need the filescan to be successful,
+			 * same length as input, and a volume to be present.
+			 *
+			 * We will assume that we only get to this path on
+			 * a version of VMS that does not support the EFS
+			 * character set.
+			 *
+			 * There may be a xxx$ prefix on the image name.
+			 * Linux  programs do not handle that well, so
+			 * strip the prefix.
+			 */
+			name = item_list[2].component;
+			name_len = item_list[2].length;
+			dollar = strrchr(name, '$');
+			if (dollar != NULL) {
+				dollar++;
+				name_len = name_len - (dollar - name);
+				name = dollar;
+			}
+
+			strncpy(vms_name, name, name_len);
+			vms_name[name_len] = 0;
+			result = 1;
+
+			/* We only keep the extension if it is not ".exe" */
+			keep_ext = 0;
+			ext = item_list[3].component;
+
+			if (item_list[3].length != 1) {
+				if (item_list[3].length != 4) {
+					keep_ext = 1;
+				} else {
+					int x;
+					x = strncmp(ext, ".exe", 4);
+					if (x != 0) {
+						keep_ext = 1;
+					}
+				}
+			}
+
+			if (keep_ext == 1) {
+				strncpy(&vms_name[name_len],
+					ext, item_list[3].length);
+			}
+		}
+	}
+
+	if (result) {
+		char * lastslash;
+		char * dollar;
+		char * dotexe;
+		char * lastdot;
+		char * extension;
+
+		/* This means it is probably the name from a DCL command
+		 * Find the last slash which separates the file from the
+		 * path.
+		 */
+		lastslash = strrchr(filespec, '/');
+
+		if (lastslash != NULL) {
+			int i;
+
+			lastslash++;
+
+			/* There may be a xxx$ prefix on the image name. */
+			/* Linux programs do not handle that well, so    */
+			/* strip the prefix */
+			dollar = strrchr(lastslash, '$');
+
+			if (dollar != NULL) {
+				dollar++;
+				lastslash = dollar;
+			}
+
+			strcpy(vms_name, lastslash);
+
+			/* In UNIX mode + EFS character set, there should
+			 * not be a version present, as it is not possible
+			 * when parsing to tell if it is a version or part
+			 * of the UNIX filename as UNIX programs use numeric
+			 * extensions for many reasons.
+			 */
+
+			lastdot = strrchr(vms_name, '.');
+			if (lastdot != NULL) {
+				int i;
+
+				i = 1;
+				while (isdigit(lastdot[i])) {
+					i++;
+				}
+				if (lastdot[i] == 0) {
+					*lastdot = 0;
+				}
+			}
+
+			/* Find the .exe on the name (case insenstive)
+			 * and toss it
+			 */
+			dotexe = strrchr(vms_name, '.');
+			if (dotexe != NULL) {
+				if ((dotexe[1] == 'e' || dotexe[1] == 'E') &&
+				    (dotexe[2] == 'x' || dotexe[2] == 'X') &&
+				    (dotexe[3] == 'e' || dotexe[3] == 'E') &&
+				    (dotexe[4] == 0)) {
+
+					*dotexe = 0;
+				} else {
+					/* Also need to handle a null
+					 * extension because of a CRTL bug.
+					 */
+					if (dotexe[1] == 0) {
+						*dotexe = 0;
+					}
+				}
+			}
+		}
+	} else {
+		/* No changes needed */
+		strncpy(vms_name, filespec, VMS_NAME_LEN);
+		vms_name[VMS_NAME_LEN] = 0;
+	}
+
+
+	/*
+	 * The above fixes up the name, but for the DCL shell
+	 * may leave it in upper case, which messes up the self tests.
+	 * force it to lower case here.
+	 */
+	shell = getenv("SHELL");
+	if (shell != NULL) {
+		if (strcmp(shell, "DCL") == 0) {
+			lcname = 1;
+		}
+	} else {
+		lcname = 1;
+	}
+	if (lcname == 1) {
+		int i = 0;
+		while (vms_name[i] != 0) {
+			vms_name[i] = tolower(vms_name[i]);
+			i++;
+		}
+	}
+	return vms_name;
+}
+
+/* os_arg_fixup --- fixup the command line */
+
+void
+os_arg_fixup(argcp, argvp)
+int *argcp;
+char ***argvp;
+{
+	char *tz_rule;
+	int status;
+
+	(void) vms_arg_fixup(argcp, argvp);
+
+	/* Fix up the time zone */
+	/* For some reason it gets trashed */
+	tz_rule = malloc(1024);
+	status = sys_trnlnm("TZ", tz_rule, 1024);
+	if ($VMS_STATUS_SUCCESS(status)) {
+		setenv("TZ", tz_rule, 1);
+	} else {
+		status = sys_trnlnm("SYS$TIMEZONE_RULE", tz_rule, 1024);
+		if ($VMS_STATUS_SUCCESS(status)) {
+			setenv("TZ", tz_rule, 1);
+		}
+	}
+	free(tz_rule);
+}
+
+/* os_devopen --- open special per-OS devices */
+
+int
+os_devopen(name, flag)
+const char *name;
+int flag;
+{
+	return vms_devopen(name, flag);
+}
+
+/* optimal_bufsize --- determine optimal buffer size */
+
+size_t
+optimal_bufsize(fd, stb)
+int fd;
+struct stat *stb;
+{
+
+	/* force all members to zero in case OS doesn't use all of them. */
+	memset(stb, '\0', sizeof(struct stat));
+
+	/*
+	 * These values correspond with the RMS multi-block count used by
+	 * vms_open() in vms/vms_misc.c.
+	 */
+	if (isatty(fd) > 0)
+		return BUFSIZ;
+	else if (fstat(fd, stb) < 0)
+		return 8*512;	/* conservative in case of DECnet access */
+	else
+		return 32*512;
+}
+
+/* ispath --- return true if path has directory components */
+
+int
+ispath(file)
+const char *file;
+{
+	for (; *file; file++) {
+		switch (*file) {
+		case ':':
+		case ']':
+		case '>':
+		case '/':
+			return 1;
+		}
+	}
+	return 0;
+}
+
+/* isdirpunct --- return true if char is a directory separator */
+
+int
+isdirpunct(c)
+int c;
+{
+	return (strchr(":]>/", c) != NULL);
+}
+
+/* os_close_on_exec --- set close on exec flag, print warning if fails */
+
+void
+os_close_on_exec(fd, name, what, dir)
+int fd;
+const char *name, *what, *dir;
+{
+	/* no-op */
+}
+
+/* os_isdir --- is this an fd on a directory? */
+
+#if ! defined(S_ISDIR) && defined(S_IFDIR)
+#define	S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
+#endif
+
+int
+os_isdir(fd)
+int fd;
+{
+	struct stat sbuf;
+
+	return (fstat(fd, &sbuf) == 0 && S_ISDIR(sbuf.st_mode));
+}
+
+/* os_isreadable --- fd can be read from */
+
+int
+os_isreadable(const awk_input_buf_t *iobuf, bool *isdir)
+{
+	*isdir = false;
+
+	switch (iobuf->sbuf.st_mode & S_IFMT) {
+	case S_IFREG:
+	case S_IFCHR:	/* ttys, /dev/null, .. */
+#ifdef S_IFSOCK
+	case S_IFSOCK:
+#endif
+#ifdef S_IFIFO
+	case S_IFIFO:
+#endif
+		return true;
+	case S_IFDIR:
+		*isdir = true;
+		/* fall through */
+	default:
+		return false;
+	}
+}
+
+/* os_is_setuid --- true if running setuid root */
+
+int
+os_is_setuid()
+{
+	return 0;
+}
+
+/* os_setbinmode --- set binary mode on file */
+
+int
+os_setbinmode (fd, mode)
+int fd, mode;
+{
+	return 0;
+}
+
+/* os_restore_mode --- restore the original mode of the console device */
+
+void
+os_restore_mode (fd)
+int fd;
+{
+	/* no-op */
+	return;
+}
+
+/* files_are_same --- deal with VMS struct stat */
+
+int
+files_are_same(char *newfile, SRCFILE *oldfile)
+{
+	struct stat st, *f1, *f2;
+
+	f1 = &st;
+	if (stat(newfile, f1) != 0) return 0;
+
+	f2 = &oldfile->sbuf;
+		/* compare device string */
+#ifdef _USE_STD_STAT
+	return (f1->st_dev == f2->st_dev
+		/* and 48-bit file id cookie */
+		&& f1->st_ino == f2->st_ino);
+ #else
+	return (strcmp(f1->st_dev, f2->st_dev) == 0
+		/* and 48-bit file id cookie stored in 3 short ints */
+		&& f1->st_ino[0] == f2->st_ino[0]
+		&& f1->st_ino[1] == f2->st_ino[1]
+		&& f1->st_ino[2] == f2->st_ino[2]);
+#endif
+}
+
+int
+os_isatty(int fd)
+{
+	return (isatty(fd) > 0);
+}
+
+void
+init_sockets(void)
+{
+}
diff --git a/gawk-5.0.1/vms/generate_config_vms_h_gawk.com b/gawk-5.0.1/vms/generate_config_vms_h_gawk.com
new file mode 100644
index 00000000000..b0d1ed1b16d
--- /dev/null
+++ b/gawk-5.0.1/vms/generate_config_vms_h_gawk.com
@@ -0,0 +1,313 @@
+$! File: GENERATE_CONFIG_H_VMS_GAWK.COM
+$!
+$! Gawk like most open source products uses a variant of a config.h file.
+$! Depending on the curl version, this could be config.h or curl_config.h.
+$!
+$! For GNV based builds, the configure script is run and that produces
+$! a [curl_]config.h file.  Configure scripts on VMS generally do not
+$! know how to do everything, so there is also a [-.lib]config-vms.h file
+$! that has VMS specific code that compensates for bugs in some of the
+$! VMS shared images.
+$!
+$! This generates a []config.h file and also a config_vms.h file,
+$! which is used to supplement that file.
+$!
+$!
+$! Copyright (C) 2014, 2016, 2019 the Free Software Foundation, Inc.
+$!
+$! This file is part of GAWK, the GNU implementation of the
+$! AWK Progamming Language.
+$!
+$! GAWK is free software; you can redistribute it and/or modify
+$! it under the terms of the GNU General Public License as published by
+$! the Free Software Foundation; either version 3 of the License, or
+$! (at your option) any later version.
+$!
+$! GAWK is distributed in the hope that it will be useful,
+$! but WITHOUT ANY WARRANTY; without even the implied warranty of
+$! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+$! GNU General Public License for more details.
+$!
+$! You should have received a copy of the GNU General Public License
+$! along with this program; if not, write to the Free Software
+$! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
+$! USA
+$!
+$! Per assignment agreement with FSF, similar procedures may be present
+$! in other packages under other licensing agreements and copyrights
+$!
+$!
+$! 21-Jan-2014	J. Malmberg
+$!
+$!=========================================================================
+$!
+$! Allow arguments to be grouped together with comma or separated by spaces
+$! Do no know if we will need more than 8.
+$ args = "," + p1 + "," + p2 + "," + p3 + "," + p4 + ","
+$ args = args + p5 + "," + p6 + "," + p7 + "," + p8 + ","
+$!
+$! Provide lower case version to simplify parsing.
+$ args_lower = f$edit(args, "LOWERCASE")
+$!
+$ args_len = f$length(args)
+$!
+$ if (f$getsyi("HW_MODEL") .lt. 1024)
+$ then
+$   arch_name = "VAX"
+$ else
+$   arch_name = ""
+$   arch_name = arch_name + f$edit(f$getsyi("ARCH_NAME"), "UPCASE")
+$   if (arch_name .eqs. "") then arch_name = "UNK"
+$ endif
+$!
+$!
+$ pipe lib/list sys$library:decc$rtldef.tlb | search sys$input: stdint
+$ if '$SEVERITY' .ne. 1
+$ then
+$   create sys$disk:[]stdint.h
+$   open/append stdint_h sys$disk:[]stdint.h
+$   write stdint_h "/* Fake stdint.h for gnulib */"
+$   close stdint_h
+$ endif
+$!
+$!
+$! Start the configuration file.
+$! Need to do a create and then an append to make the file have the
+$! typical file attributes of a VMS text file.
+$ create sys$disk:[]config_vms.h
+$ open/append cvh sys$disk:[]config_vms.h
+$!
+$! Write the defines to prevent multiple includes.
+$! These are probably not needed in this case,
+$! but are best practice to put on all header files.
+$ write cvh "#ifndef __CONFIG_VMS_H__"
+$ write cvh "#define __CONFIG_VMS_H__"
+$ write cvh ""
+$!
+$ write cvh "#if __CRTL_VER >= 70000000"
+$ write cvh "#define VMS_V7"
+$ write cvh "#else"
+$ write cvh "#define HAVE_TZNAME 1 /* (faked in vms/vms_misc.c) */
+$ write cvh "#define HAVE_TZSET 1 /* (faked in vms/vms_misc.c) */
+$ write cvh "#endif"
+$ write cvh "#if __CRTL_VER >= 70200000"
+$ write cvh "#define DYNAMIC 1"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh "#define PRINTF_HAS_F_FORMAT 1"
+$ write cvh ""
+$ write cvh "/* The _Noreturn keyword of C11.  */"
+$ write cvh "#ifndef _Noreturn"
+$ write cvh "# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \"
+$ write cvh "      || 0x5110 <= __SUNPRO_C)"
+$ write cvh "#  define _Noreturn __attribute__ ((__noreturn__))"
+$ write cvh "# elif defined _MSC_VER && 1200 <= _MSC_VER"
+$ write cvh "#  define _Noreturn __declspec (noreturn)"
+$ write cvh "# else"
+$ write cvh "#  define _Noreturn"
+$ write cvh "# endif"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * VAXCRTL is pre-ANSI and does some variations of numeric"
+$ write cvh " * formatting differently than gawk expects."
+$ write cvh " */"
+$ write cvh "#if defined(VAX) && !defined(__DECC)"
+$ write cvh -
+ "/* '0' format modifier for %e,%f,%g gives wrong results in many cases */"
+$ write cvh "#define VAXCRTL"
+$ write cvh "/* %g format chooses %e format when should use %f */"
+$ write cvh "#define GFMT_WORKAROUND	1"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * VAX C"
+$ write cvh " *"
+$ write cvh -
+ " * As of V3.2, VAX C is not yet ANSI-compliant.  But it's close enough"
+$ write cvh -
+ " * for GAWK's purposes.  Comment this out for VAX C V2.4 and earlier."
+$ write cvh -
+ " * YYDEBUG definition is needed for combination of VAX C V2.x and Bison."
+$ write cvh " */"
+$ write cvh "#if defined(VAXC) && !defined(__STDC__)"
+$ write cvh "#define __STDC__	0"
+$ write cvh "#define NO_TOKEN_PASTING"
+$ write cvh "#define signed  /*empty*/"
+$ write cvh "#define inline	/*empty*/"
+$ write cvh "#ifndef __DECC	/* DEC C does not support #pragma builtins */"
+$ write cvh "#define VAXC_BUILTINS"
+$ write cvh "#endif"
+$ write cvh "/* #define YYDEBUG 0 */"
+$ write cvh -
+  "#define NO_MBSUPPORT  /* VAX C's preprocessor can't handle mbsupport.h */"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh ""
+$ write cvh "#if __DECC_VER >= 60400000 && !defined(DEBUG)"
+$ write cvh "/* disable ""new feature in C99"" diagnostics (for regex code); "
+$ write cvh "   NEWC99 ought to suffice but doesn't (at least in V6.4) */"
+$ write cvh "#pragma message disable (NEWC99,DESIGNATORUSE)"
+$ write cvh "#ifdef __VAX
+$ write cvh "#endif
+$ write cvh "#pragma message disable (LONGDOUBLENYI)"
+$ write cvh "#endif"
+$!
+$! This stuff seems needed for VMS 7.3 and earlier, but not VMS 8.2+
+$! Need some more data as to which versions these issues are fixed in.
+$ write cvh "#if __VMS_VER <= 80200000"
+$! mkstemp goes into an infinte loop in gawk in VAX/VMS 7.3
+$ write cvh "#ifdef HAVE_MKSTEMP"
+$ write cvh "#undef HAVE_MKSTEMP"
+$ write cvh "#endif"
+$ write cvh "#endif"
+$ write cvh ""
+$!
+$! VMS not legal for ANSI compiler to pre-define
+$ write cvh "#ifndef VMS"
+$ write cvh "#define VMS 1"
+$ write cvh "#endif"
+$ write cvh ""
+$!
+$! Need to temp hide stuff that gawk is replacing or redefining before
+$! including the header.
+$ write cvh "/* Need to hide some stuff */"
+$ write cvh "#define getopt hide_getopt"
+$ write cvh "#define optopt hide_optopt"
+$ write cvh "#define optind hide_optind"
+$ write cvh "#define optarg hide_optarg"
+$ write cvh "#define opterr hide_opterr"
+$ write cvh "#define getpgrp hide_getpgrp"
+$ write cvh "#define unsetenv hide_unsetenv"
+$ write cvh "#define read hide_read"
+$ write cvh "#define delete hide_delete"
+$ write cvh "#define getcwd hide_getcwd"
+$ write cvh "#define getgid hide_getgid"
+$ write cvh "#define getegid hide_getegid"
+$ write cvh "#define setgid hide_setgid"
+$ write cvh "#define exit hide_exit"
+$ write cvh "#define _exit hide__exit"
+$ write cvh "#include <unistd.h>"
+$ write cvh "#include <stdlib.h>"
+$ write cvh "#include <stdio.h>"
+$ write cvh "#include <time.h>"
+$ write cvh "#include <stsdef.h>"
+$ write cvh "#include <string.h>"
+$ write cvh "#undef getopt"
+$ write cvh "#undef optopt"
+$ write cvh "#undef optind"
+$ write cvh "#undef optarg"
+$ write cvh "#undef opterr"
+$ write cvh "#undef getpgrp"
+$ write cvh "#undef getcwd"
+$ write cvh "#undef unsetenv"
+$ write cvh "#undef read"
+$ write cvh "#undef delete"
+$ write cvh "#undef getgid"
+$ write cvh "#undef getegid"
+$ write cvh "#undef setgid"
+$ write cvh "#undef exit"
+$ write cvh "#undef _exit"
+$!
+$write cvh "#ifdef HAVE_STRNCASECMP"
+$write cvh "#undef HAVE_STRNCASECMP"
+$write cvh "#endif"
+$!
+$ write cvh "#define IN_CONFIG_H"
+$ write cvh "#include ""redirect.h"""
+$ write cvh "#undef IN_CONFIG_H"
+$ write cvh "#define getpgrp gawk_vms_getpgrp"
+$ write cvh "#ifdef HAVE_SETENV"
+$ write cvh "#undef HAVE_SETENV"
+$ write cvh "#endif"
+$ write cvh "#ifdef HAVE_UNSETENV"
+$ write cvh "#undef HAVE_UNSETENV"
+$ write cvh "#endif"
+$ write cvh "#ifdef HAVE_STRFTIME"
+$ write cvh "#undef HAVE_STRFTIME"
+$ write cvh "#define USE_INCLUDED_STRFTIME"
+$ write cvh "#endif /* HAVE_STRFTIME */"
+$ write cvh ""
+$ write cvh "#include <bitypes.h>"
+$ write cvh "#define INT32_MAX __INT32_MAX"
+$ write cvh "#define INT32_MIN __INT32_MIN"
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * DEFPATH"
+$ write cvh " *	VMS: ""/AWK_LIBRARY"" => ""AWK_LIBRARY:"""
+$ write cvh " * The default search path for the -f option of gawk.  It is"
+$ write cvh " * used if the AWKPATH environment variable is undefined."
+$ write cvh " *"
+$ write cvh " * Note: OK even if no AWK_LIBRARY logical name has been defined."
+$ write cvh " */"
+$ write cvh ""
+$ write cvh "#define DEFPATH	"".,/AWK_LIBRARY"""
+$ write cvh "#define DEFLIBPATH "".,/AWK_LIBRARY"""
+$ write cvh "#define ENVSEP	','"
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * Extended source file access."
+$ write cvh " */"
+$ write cvh "#define DEFAULT_FILETYPE "".awk"""
+$ write cvh ""
+$ write cvh "/*"
+$ write cvh " * fork/Pipe handling."
+$ write cvh " */"
+$ write cvh "#define PIPES_SIMULATED	1"
+$ write cvh ""
+$ write cvh "/* Extension for shared libraries */"
+$ write cvh "#define SHLIBEXT	""exe"""
+$ write cvh ""
+$! GAWK does not want to use ALLOCA
+$ write cvh "#define NO_ALLOCA"
+$ write cvh "#define STACK_DIRECTION (-1)"
+$ write cvh ""
+$ write cvh "void decc$exit(int status);"
+$ write cvh "#define _exit(foo) vms_exit(foo)"
+$ write cvh "#define exit(foo) vms_exit(foo)"
+$ write cvh ""
+$ write cvh "/* Use POSIX exit codes here */"
+$ write cvh "#ifdef EXIT_FAILURE"
+$ write cvh "#undef EXIT_FAILURE"
+$ write cvh "#endif"
+$ write cvh "#define EXIT_FAILURE (1)"
+$ write cvh ""
+$ write cvh "#define EXIT_FATAL (2)"
+$ write cvh ""
+$ write cvh "#ifndef C_FACILITY_NO"
+$ write cvh "#define C_FACILITY_NO 0x350000"
+$ write cvh "#endif"
+$ write cvh ""
+$ write cvh "/* Build a Posix Exit with VMS severity */
+$ write cvh "static void vms_exit(int status) {"
+$ write cvh "    int vms_status;"
+$ write cvh "    /* Fake the __posix_exit with severity added */"
+$ write cvh "    /* Undocumented correct way to do this. */"
+$ write cvh "    vms_status = 0;"
+$ write cvh "    if (status != 0) {"
+$ write cvh "        vms_status = C_FACILITY_NO | 0xA000 | STS$M_INHIB_MSG;"
+$ write cvh "        vms_status |= (status << 3);"
+$ write cvh "    }"
+$ write cvh "    if (status == EXIT_FAILURE) {"
+$ write cvh "        vms_status |= STS$K_ERROR;"
+$ write cvh "    } else if (status == EXIT_FATAL) {"
+$ write cvh "        vms_status |= STS$K_SEVERE;"
+$ write cvh "    } else {"
+$ write cvh "        vms_status |= STS$K_SUCCESS;"
+$ write cvh "    }"
+$ write cvh "    decc$exit(vms_status);"
+$ write cvh "}"
+$ write cvh ""
+$ write cvh "#define TIME_T_UNSIGNED 1"
+$ write cvh "#include ""custom.h"""
+$ write cvh ""
+$
+$!
+$! Close out the file
+$!
+$ write cvh ""
+$ write cvh "#endif /* __CONFIG_VMS_H__ */"
+$ close cvh
+$!
+$all_exit:
+$ exit
diff --git a/gawk-5.0.1/vms/gnv_gawk_startup.com b/gawk-5.0.1/vms/gnv_gawk_startup.com
new file mode 100644
index 00000000000..e691965e0d4
--- /dev/null
+++ b/gawk-5.0.1/vms/gnv_gawk_startup.com
@@ -0,0 +1,75 @@
+$! File: gnv$gawk_Startup.com / gnv_gawk_startup.com
+$!
+$! Procedure to setup the GAWK images for use by programs from the
+$! VMS SYSTARTUP*.COM procedure.
+$!
+$! 14-Mar-2011 J. Malmberg
+$! 04-May-2011 J. Malmberg      Use GNV_PCSI_DESTINATION to find the
+$!                              value to assing GNV$GNU per suggestion
+$!                              by Martin Vorlander.
+$! 02-Jan-2014 J. Malmberg	Gawk Version
+$!========================================================================
+$!
+$!
+$! GNV$GNU if needed.
+$ if f$trnlnm("GNV$GNU") .eqs. ""
+$ then
+$   x = f$trnlnm("GNU","LNM$SYSTEM_TABLE")
+$   if x .nes. ""
+$   then
+$       write sys$output -
+ "Notice: logical name GNU: was found in the system table instead of GNV$GNU:"
+$       write sys$output -
+ "This is a known bug in the GNV 2.1.3 and earlier kits."
+$       define/system/exec/trans=conc GNV$GNU 'x'
+$   else
+$!
+$!      File name per VMS standards
+$!      ---------------------------
+$       file1 = "sys$startup:gnv$destination_''f$getsyi("ARCH_NAME")'.com"
+$!
+$!      File name in GNV 2.1.3
+$!      ----------------------
+$       file2 = "sys$startup:gnv_destination_''f$getsyi("ARCH_NAME")'.com"
+$!
+$!      File name before GNV 2.1.3
+$!      ---------------------------
+$       file3 = "sys$startup:gnv_destination''f$getsyi("ARCH_NAME")'.com"
+$       arch_file = ""
+$       if f$search(file1) .nes. ""
+$       then
+$           arch_file = file1
+$       else
+$           if f$search(file2) .nes. ""
+$           then
+$               arch_file = file2
+$           else
+$               if f$search("file3") .nes. "" then arch_file = file3
+$           endif
+$       endif
+$       if (arch_file) .nes. "" then @'arch_file'
+$!
+$!      Logical name per VMS standards
+$!      -------------------------------
+$       destination = f$trnlnm("GNV$PCSI_DESTINATION")
+$!
+$!      Logical name in GNV 2.1.3
+$!      --------------------------
+$       if destination .eqs. ""
+$       then
+$           destination = f$trnlnm("GNV_PCSI_DESTINATION")
+$       endif
+$       if destination .eqs. ""
+$       then
+$           !Assume this procedure is on the same volume as the GNV install.
+$           my_proc = f$environment("PROCEDURE")
+$           my_dev = f$parse(my_proc,,,"DEVICE","NO_CONCEAL")
+$           destination = "''my_dev'[vms$common.gnv.]"
+$       endif
+$       define/system/exec/trans=conc gnv$gnu 'destination'
+$   endif
+$ endif
+$!
+$!
+$all_exit:
+$ exit
diff --git a/gawk-5.0.1/vms/make_pcsi_gawk_kit_name.com b/gawk-5.0.1/vms/make_pcsi_gawk_kit_name.com
new file mode 100644
index 00000000000..daaa37a4fdf
--- /dev/null
+++ b/gawk-5.0.1/vms/make_pcsi_gawk_kit_name.com
@@ -0,0 +1,189 @@
+$! File: MAKE_PCSI_GAWK_KIT_NAME.COM
+$!
+$! Calculates the PCSI kit name for use in building an installation kit.
+$! PCSI is HP's PolyCenter Software Installation Utility.
+$!
+$! The results are stored in as logical names so that other procedures
+$! can use them.
+$!
+$! 92-Jan-2014  J. Malmberg	Gawk version
+$!========================================================================
+$!
+$! Save default
+$default_dir = f$environment("DEFAULT")
+$!
+$! Put things back on error.
+$on warning then goto all_exit
+$!
+$! The producer is the name or common abbreviation for the entity that is
+$! making the kit.  It must be set as a logical name before running this
+$! procedure.
+$!
+$! HP documents the producer as the legal owner of the software, but for
+$! open source work, it should document who is creating the package for
+$! distribution.
+$!
+$producer = f$trnlnm("GNV_PCSI_PRODUCER")
+$if producer .eqs. ""
+$then
+$   write sys$output "The logical name GNV_PCSI_PRODUCER needs to be defined."
+$   write sys$output "This should be set to the common abbreviation or name of"
+$   write sys$output "the entity creating this kit.  If you are an individual"
+$   write sys$output "then use your initials as long as they do not match"
+$   write sys$output "a different well known producer prefix."
+$   goto all_exit
+$endif
+$producer_full_name = f$trnlnm("GNV_PCSI_PRODUCER_FULL_NAME")
+$if producer_full_name .eqs. ""
+$then
+$   write sys$output "The logical name GNV_PCSI_PRODUCER_FULL_NAME needs to"
+$   write sys$output "be defined.  This should be set to the full name of"
+$   write sys$output "the entity creating this kit.  If you are an individual"
+$   write sys$output "then use your name."
+$   write sys$output "EX: DEFINE GNV_PCSI_PRODUCER_FULL_NAME ""First M. Last"""
+$   goto all_exit
+$endif
+$!
+$write sys$output "*****"
+$write sys$output "***** Producer = ''producer'"
+$write sys$output "*****"
+$!
+$!
+$! Base is one of 'VMS', 'AXPVMS', 'I64VMS', 'VAXVMS' and indicates what
+$! binaries are in the kit.  A kit with just 'VMS' can be installed on all
+$! architectures.
+$!
+$base = "VMS"
+$arch_type = f$getsyi("ARCH_NAME")
+$code = f$extract(0, 1, arch_type)
+$if (code .eqs. "I") then base = "I64VMS"
+$if (code .eqs. "V") then base = "VAXVMS"
+$if (code .eqs. "A") then base = "AXPVMS"
+$!
+$!
+$product = "gawk"
+$!
+$!
+$! We need to get the version from config.h.  It will have a lines like
+$! #define PACKAGE_VERSION "4.1.0a"
+$!
+$!
+$open/read/error=version_loop_end verf config.h
+$version_loop:
+$   read/end=version_loop_end verf line_in
+$   if line_in .eqs. "" then goto version_loop
+$   if f$locate("#define PACKAGE_VERSION", line_in) .ne. 0
+$   then
+$       goto version_loop
+$   endif
+$   tag = f$element(1, " ", line_in)
+$   value = f$element(2, " ", line_in) - """" - """"
+$   if tag .eqs. "PACKAGE_VERSION"
+$   then
+$       distversion = value
+$       goto version_loop_end
+$   endif
+$   goto version_loop
+$version_loop_end:
+$close verf
+$!
+$!
+$! Optional ECO file.
+$ECO_LEVEL = ""
+$vms_eco_file = "[.vms]vms_eco_level.h"
+$if f$search(vms_eco_file) .nes. ""
+$then
+$   open/read ef 'vms_eco_file'
+$ecolevel_loop:
+$       read/end=ecolevel_loop_end ef line_in
+$       prefix = f$element(0, " ", line_in)
+$       if prefix .nes. "#define" then goto ecolevel_loop
+$       key = f$element(1, " ", line_in)
+$       value = f$element(2, " ", line_in) - """" - """"
+$       if key .eqs. "VMS_ECO_LEVEL"
+$       then
+$           ECO_LEVEL = value
+$           if ECO_LEVEL .eq. 0
+$           then
+$               ECO_LEVEL = ""
+$           else
+$               ECO_LEVEL = "E" + ECO_LEVEL
+$           endif
+$           goto ecolevel_loop_end
+$       endif
+$       goto ecolevel_loop
+$ecolevel_loop_end:
+$    close ef
+$endif
+$!
+$raw_version = distversion
+$!
+$!
+$! This translates to V0114-08 or D0115-01
+$! We can not encode the snapshot date into the version due to the way that
+$! the Polycenter Software Installation Utility evaluates the name.
+$!
+$! version_type = 'V' for a production release, and 'D' for a build from a
+$! daily repository snapshot, and a code for a build from a pre-release branch
+$majorver = f$element(0, ".", raw_version)
+$minorver = f$element(1, ".", raw_version)
+$update = f$element(2,".", raw_version)
+$if update .eqs. "." then update = ""
+$vtype = "V"
+$if update .nes. ""
+$then
+$   update_len = f$length(update)
+$   code = f$extract(update_len - 1, 1, update)
+$   code = f$edit(code, "UPCASE")
+$   if (code .ges. "A") .and. (code .les. "Z")
+$   then
+$       update = f$extract(0, update_len - 1, update)
+$       vtype = code
+$   endif
+$endif
+$if update .eqs. "0" then update = ""
+$!
+$!
+$version_fao = "!2ZB!2ZB"
+$mmversion = f$fao(version_fao, 'majorver', 'minorver')
+$version = vtype + "''mmversion'"
+$if update .nes. "" .or. ECO_LEVEL .nes. ""
+$then
+$!  The presence of an ECO implies an update
+$   if update .eqs. "" .and. ECO_LEVEL .nes. "" then update = "0"
+$   version = version + "-" + update + ECO_LEVEL
+$   fversion = version
+$else
+$   fversion = version
+$   version = version + "-"
+$endif
+$!
+$! Kit type 1 is complete kit, the only type that this procedure will make.
+$Kittype = 1
+$!
+$! Write out a logical name for the resulting base kit name.
+$name = "''producer'-''base'-''product'-''version'-''kittype'"
+$define GNV_PCSI_KITNAME "''name'"
+$fname = "''product'-''fversion'"
+$!
+$! No ECO or Patch level
+$fname_len = f$length(fname)
+$if f$extract(fname_len - 1, 1, fname) .eqs. "-"
+$then
+$    fname = f$extract(0, fname_len - 1, fname)
+$    fname_len = fname_len - 1
+$endif
+$if f$extract(fname_len - 1, 1, fname) .eqs. "-"
+$then
+$    fname = f$extract(0, fname_len - 1, fname)
+$    fname_len = fname_len - 1
+$endif
+$define GNV_PCSI_FILENAME_BASE 'fname'
+$write sys$output "*****"
+$write sys$output "***** GNV_PCSI_KITNAME = ''name'."
+$write sys$output "***** GNV_PCSI_FILENAME_BASE = ''fname'."
+$write sys$output "*****"
+$!
+$all_exit:
+$set def 'default_dir'
+$exit '$status'
diff --git a/gawk-5.0.1/vms/pcsi_gawk_file_list.txt b/gawk-5.0.1/vms/pcsi_gawk_file_list.txt
new file mode 100644
index 00000000000..ed5a26e99b1
--- /dev/null
+++ b/gawk-5.0.1/vms/pcsi_gawk_file_list.txt
@@ -0,0 +1,120 @@
+! File: pcsi_gawk_file_list.txt
+!
+! File list for building a PCSI kit.
+! Very simple format so that the parsing logic can be simple.
+! links first, directory second, and files third.
+!
+! link -> file tells procedure to create/remove a link on install/uninstall
+! If more than one link, consider using an alias file.
+!
+! [xxx.yyy]foo.dir is a directory file for the rename phase.
+! [xxx.yyy.foo] is a directory file for the create phase.
+! Each subdirectory needs to be on its own pair of lines.
+!
+! [xxx.yyy]file.ext is a file for the rename and add phases.
+!
+! 14-Mar-2011  J. Malmberg
+! 08-Dec-2013  J. Malmberg      This list is based on what was found on
+!                               some Linux systems and what can be currently
+!                               built on VMS.
+!
+!============================================================================
+![gnv.bin]awk. -> [gnv.bin]gnv$gawk.exe
+![gnv.bin]awk.exe -> [gnv.bin]gnv$gawk.exe
+![gnv.bin]gawk. -> [gnv.bin]gnv$gawk.exe
+![gnv.bin]gawk.exe -> [gnv.bin]gnv$gawk.exe
+![gnv.usr.bin]awk. -> [gnv.bin]gnv$gawk.exe
+![gnv.usr.bin]awk.exe -> [gnv.bin]gnv$gawk.exe
+![gnv.usr.bin]gawk. -> [gnv.bin]gnv$gawk.exe
+![gnv.usr.bin]gawk.exe -> [gnv.bin]gnv$gawk.exe
+![gnv.usr.share.man.man1]awk.1 -> [gnv.usr.share.man.man1]gawk.1
+[gnv]
+[000000]gnv.dir
+[gnv.bin]
+[gnv]bin.dir
+[gnv.vms_bin]
+[gnv]vms_bin.dir
+[gnv.vms_help]
+[gnv]vms_help.dir
+[gnv.lib]
+[gnv]lib.dir
+[gnv.usr]
+[gnv]usr.dir
+[gnv.usr.bin]
+[gnv.usr]bin.dir
+[gnv.usr.include]
+[gnv.usr]include.dir
+[gnv.usr.lib]
+[gnv.usr]lib.dir
+[gnv.usr.lib.gawk]
+[gnv.usr.lib]gawk.dir
+[gnv.usr.share]
+[gnv.usr]share.dir
+[gnv.usr.share.awk]
+[gnv.usr.share]awk.dir
+[gnv.usr.share.doc]
+[gnv.usr.share]doc.dir
+[gnv.usr.share.doc.gawk]
+[gnv.usr.share.doc]gawk.dir
+[gnv.usr.share.info]
+[gnv.usr.share]info.dir
+[gnv.usr.share.man]
+[gnv.usr.share]man.dir
+[gnv.usr.share.man.man1]
+[gnv.usr.share.man]man1.dir
+![gnv.usr.share.man.man7]
+![gnv.usr.share.man]man7.dir
+[gnv.usr]src.dir
+[gnv.usr.src]
+[gnv.usr.src]gawk.dir
+[gnv.usr.src.gawk]extension.dir
+[gnv.usr.src.gawk.extension]
+[gnv.usr.src.gawk.extension]vms.dir
+[gnv.usr.src.gawk.extension.vms]
+[gnv.usr.bin]gnv$gawk.exe
+[gnv.usr.bin]igawk.
+[gnv.vms_bin]remove_old_gawk.com
+[gnv.vms_bin]gawk_alias_setup.com
+[gnv.vms_bin]gawk_verb.cld
+[gnv.vms_help]gawk.hlp
+[gnv.usr.include]gawkapi.h
+[gnv.usr.lib.gawk]filefuncs.exe
+[gnv.usr.lib.gawk]fnmatch.exe
+[gnv.usr.lib.gawk]inplace.exe
+[gnv.usr.lib.gawk]ordchr.exe
+[gnv.usr.lib.gawk]readdir.exe
+[gnv.usr.lib.gawk]revoutput.exe
+[gnv.usr.lib.gawk]revtwoway.exe
+[gnv.usr.lib.gawk]rwarray.exe
+[gnv.usr.lib.gawk]time.exe
+[gnv.usr.share.awk]assert.awk
+[gnv.usr.share.awk]bits2str.awk
+[gnv.usr.share.awk]cliff_rand.awk
+[gnv.usr.share.awk]ctime.awk
+[gnv.usr.share.awk]ftrans.awk
+[gnv.usr.share.awk]getopt.awk
+[gnv.usr.share.awk]gettime.awk
+[gnv.usr.share.awk]join.awk
+[gnv.usr.share.awk]libintl.awk
+[gnv.usr.share.awk]noassign.awk
+[gnv.usr.share.awk]ord.awk
+[gnv.usr.share.awk]readable.awk
+[gnv.usr.share.awk]readfile.awk
+[gnv.usr.share.awk]rewind.awk
+[gnv.usr.share.awk]round.awk
+[gnv.usr.share.awk]strtonum.awk
+[gnv.usr.share.awk]walkarray.awk
+[gnv.usr.share.awk]zerofile.awk
+[gnv.usr.share.doc.gawk]COPYING.
+[gnv.usr.share.doc.gawk]NEWS.
+[gnv.usr.share.doc.gawk]POSIX.STD
+[gnv.usr.share.doc.gawk]README.
+[gnv.usr.share.doc.gawk]README.vms
+[gnv.usr.share.doc.gawk]README.multibyte
+[gnv.usr.share.doc.gawk]README.tests
+[gnv.usr.share.info]gawk.info
+[gnv.usr.share.info]gawkinet.info
+[gnv.usr.share.man.man1]gawk.1
+[gnv.usr.share.man.man1]igawk.1
+![gnv.usr.share.man.man7]
+[gnv.usr.src.gawk.extension.vms]gawk_plugin.opt
diff --git a/gawk-5.0.1/vms/pcsi_product_gawk.com b/gawk-5.0.1/vms/pcsi_product_gawk.com
new file mode 100644
index 00000000000..b0fc50f8ac5
--- /dev/null
+++ b/gawk-5.0.1/vms/pcsi_product_gawk.com
@@ -0,0 +1,186 @@
+$! File: pcsi_product_gawk.com
+$!
+$! This command file packages up the product GAWK into a sequential
+$! format kit
+$!
+$! 13-Dec-2013  J.Malmberg
+$!
+$!=========================================================================
+$!
+$! Save default
+$ default_dir = f$environment("DEFAULT")
+$!
+$! Put things back on error.
+$ on warning then goto all_exit
+$!
+$ arch_type = f$getsyi("ARCH_NAME")
+$ arch_code = f$extract(0, 1, arch_type)
+$!
+$ can_build = 1
+$ producer = f$trnlnm("GNV_PCSI_PRODUCER")
+$ if producer .eqs. ""
+$ then
+$   write sys$output "GNV_PCSI_PRODUCER logical name has not been set."
+$   can_build = 0
+$ endif
+$ producer_full_name = f$trnlnm("GNV_PCSI_PRODUCER_FULL_NAME")
+$ if producer_full_name .eqs. ""
+$ then
+$   write sys$output -
+        "GNV_PCSI_PRODUCER_FULL_NAME logical name has not been set."
+$   can_build = 0
+$ endif
+$ stage_root_name = f$trnlnm("STAGE_ROOT")
+$ if stage_root_name .eqs. ""
+$ then
+$   write sys$output "STAGE_ROOT logical name has not been set."
+$   can_build = 0
+$ endif
+$!
+$ if (can_build .eq. 0)
+$ then
+$   write sys$output "Not able to build a kit."
+$   goto all_exit
+$ endif
+$!
+$!
+$! Build the gawk image(s)
+$!-------------------------
+$ if f$search("gawk.exe") .eqs. ""
+$ then
+$   mmk/descrip=[.vms]descrip.mms gawk
+$ endif
+$ if arch_code .nes. "V"
+$ then
+$   if f$search("filefuncs.exe") .eqs. ""
+$   then
+$       mmk/descrip=[.vms]descrip.mms extensions
+$   endif
+$ endif
+$!
+$! Build the gawk_verb.cld
+$!-------------------------
+$ if f$search("gawk_verb.cld") .eqs. ""
+$ then
+$   @[.vms]gawk_verb.com
+$ endif
+$!
+$! Stage the images for building the kit
+$!--------------------------------------
+$ @[.vms]stage_gawk_install.com remove
+$ @[.vms]stage_gawk_install.com
+$!
+$!
+$!
+$! Make sure that the kit name is up to date for this build
+$!----------------------------------------------------------
+$ @[.vms]make_pcsi_gawk_kit_name.com
+$!
+$! Make sure that the release note file name is up to date
+$!---------------------------------------------------------
+$ @[.vms]build_gawk_release_notes.com
+$!
+$!
+$! Make sure that the source has been backed up.
+$!----------------------------------------------
+$ @[.vms]backup_gawk_src.com
+$!
+$! Regenerate the PCSI description file.
+$!--------------------------------------
+$ @[.vms]build_gawk_pcsi_desc.com
+$!
+$! Regenerate the PCSI Text file.
+$!---------------------------------
+$ @[.vms]build_gawk_pcsi_text.com
+$!
+$ base = ""
+$ arch_name = f$edit(f$getsyi("arch_name"),"UPCASE")
+$ if arch_name .eqs. "ALPHA" then base = "AXPVMS"
+$ if arch_name .eqs. "IA64" then base = "I64VMS"
+$ if arch_name .eqs. "VAX" then base = "VAXVMS"
+$!
+$!
+$! Parse the kit name into components.
+$!---------------------------------------
+$ kit_name = f$trnlnm("GNV_PCSI_KITNAME")
+$ if kit_name .eqs. ""
+$ then
+$   write sys$output "@[.vms]make_pcsi_gawk_kit_name.com has not been run."
+$   goto all_exit
+$ endif
+$ producer = f$element(0, "-", kit_name)
+$ base = f$element(1, "-", kit_name)
+$ product_name = f$element(2, "-", kit_name)
+$ mmversion = f$element(3, "-", kit_name)
+$ majorver = f$extract(0, 3, mmversion)
+$ minorver = f$extract(3, 2, mmversion)
+$ updatepatch = f$element(4, "-", kit_name)
+$ if updatepatch .eqs. "" then updatepatch = ""
+$!
+$ version_fao = "!AS.!AS"
+$ if arch_name .eqs. "VAX" then version_fao = "!AS$5n!AS"
+$ mmversion = f$fao(version_fao, "''majorver'", "''minorver'")
+$ if updatepatch .nes. ""
+$ then
+$   version = "''mmversion'" + "-" + updatepatch
+$ else
+$   version = "''mmversion'"
+$ endif
+$!
+$ node_swvers = f$getsyi("node_swvers")
+$ vms_vernum = f$extract(1, f$length(node_swvers), node_swvers)
+$ tagver = vms_vernum - "." - "." - "-"
+$ zip_name = producer + "-" + base + "-" + tagver + "-" + product_name
+$ zip_name = zip_name + "-" + mmversion + "-" + updatepatch + "-1"
+$ zip_name = f$edit(zip_name, "lowercase")
+$!
+$!
+$! Move to the base directories
+$ current_default = f$environment("DEFAULT")
+$ my_dir = f$parse(current_default,,,"DIRECTORY") - "[" - "<" - ">" - "]"
+$!
+$!
+$ source = "''default_dir'"
+$ src1 = "new_gnu:[bin],"
+$ src2 = "new_gnu:[usr.bin],"
+$ src3 = "new_gnu:[vms_bin],"
+$ src4 = "new_gnu:[vms_help],"
+$ src5 = "new_gnu:[vms_src],"
+$ src6 = "new_gnu:[common_src],"
+$ src7 = "sys$disk:[''my_dir'],sys$disk:[''my_dir'.vms],"
+$ src8 = "new_gnu:[usr.share.awk],"
+$ src9 = "new_gnu:[usr.share.man.man1],"
+$ src10 = "new_gnu:[usr.share.doc.gawk],"
+$ src11 = "new_gnu:[usr.share.info],"
+$ src12 = "sys$disk:[''m_dir'.pc.awklib]"
+$ gnu_src = src1 + src2 + src3 + src4 + src5 + src6 + src7 + src8 + src9
+$ gnu_src = gnu_src + src10 + src11 + src12
+$!
+$!
+$ if base .eqs. "" then exit 44
+$!
+$ pcsi_option = "/option=noconfirm"
+$ if arch_code .eqs. "V"
+$ then
+$   pcsi_option = ""
+$ endif
+$!
+$!
+$product package 'product_name' -
+ /base='base' -
+ /producer='producer' -
+ /source='source' -
+ /destination=STAGE_ROOT:[KIT] -
+ /material=('gnu_src','source') -
+ /format=sequential 'pcsi_option'
+$!
+$!
+$!
+$if f$type(zip) .eqs. "STRING"
+$then
+$   zip "-9Vj" stage_root:[kit]'zip_name'.zip stage_root:[kit]'kit_name'.pcsi
+$endif
+$!
+$all_exit:
+$ set def 'default_dir'
+$ exit
diff --git a/gawk-5.0.1/vms/posix-cc.sh b/gawk-5.0.1/vms/posix-cc.sh
new file mode 100755
index 00000000000..6ac709901a7
--- /dev/null
+++ b/gawk-5.0.1/vms/posix-cc.sh
@@ -0,0 +1,16 @@
+# The VMS POSIX `c89' command writes any/all diagnostic info to stdout
+# rather than stderr, confusing configure tests which capture error output.
+#
+# Also, the VMS linker issues a warning for any undefined symbol, but that
+# does not inhibit creation of the final executable file, again confusing
+# configure.  As an added complication, there's not enough control of the
+# linker to put the map file with chosen name into the current directory.
+#
+if [ -f ~/_posix-cc.map ] ; then  rm -f ~/_posix-cc.map* ; fi
+c89 -Wc,nowarn -Wl,nodebug -Wl,map=_posix-cc.map $* ; x=$?
+if [ -f ~/_posix-cc.map ] ; then
+  if [ -n "`fgrep LINK-W-USEUNDEF ~/_posix-cc.map`" ] ; then  x=1 ; fi
+  rm -f ~/_posix-cc.map*
+fi
+if [ x -ne 0 ] ; then  echo "c89 reports failure" 1>&2 && exit 1 ; fi
+exit 0
diff --git a/gawk-5.0.1/vms/redirect.h b/gawk-5.0.1/vms/redirect.h
new file mode 100644
index 00000000000..b7388c9693b
--- /dev/null
+++ b/gawk-5.0.1/vms/redirect.h
@@ -0,0 +1,133 @@
+/*
+ * redirect.h --- definitions for functions that are OS specific.
+ */
+
+/* 
+ * Copyright (C) 1986, 1988, 1989, 1991-1993, 1996, 1997, 2007, 2010, 2011
+ * the Free Software Foundation, Inc.
+ * 
+ * This file is part of GAWK, the GNU implementation of the
+ * AWK Programming Language.
+ * 
+ * GAWK is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * GAWK is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+/* This file is included by custom.h for VMS-POSIX, or first
+   by config.h (vms-conf.h) then again by awk.h for normal VMS.  */
+
+#if defined(VMS_POSIX) || defined(IN_CONFIG_H)
+
+#define DEFAULT_FILETYPE ".awk"
+
+/* some macros to redirect some non-VMS-specific code */
+#define getopt		gnu_getopt
+#define opterr		gnu_opterr
+#define optarg		gnu_optarg
+#define optind		gnu_optind
+#define optopt		gnu_optopt
+#define regcomp		gnu_regcomp
+#define regexec		gnu_regexec
+#define regfree		gnu_regfree
+#define regerror	gnu_regerror
+#define setenv		gawk_setenv
+#define unsetenv	gawk_unsetenv
+#ifndef VMS_POSIX
+#define strftime	gnu_strftime	/* always use missing/strftime.c */
+#define strcasecmp	gnu_strcasecmp
+#define strncasecmp	gnu_strncasecmp
+#ifndef VMS_V7
+#define tzset		fake_tzset
+#define tzname		fake_tzname
+#define daylight	fake_daylight
+#define timezone	fake_timezone
+#define altzone		fake_altzone
+#endif
+#if !defined(__DECC) && !defined(VAXC2DECC) && !defined(__alpha)
+#define strcoll(s,t) strcmp((s),(t))	/* VAXCRTL lacks locale support */
+#endif
+#endif
+
+#ifdef STDC_HEADERS
+/* This is for getopt.c and alloca.c (compiled with HAVE_CONFIG_H defined),
+   to prevent diagnostics about various implicitly declared functions.  */
+#include <stdlib.h>
+#include <string.h>
+#endif
+#ifndef VMS_POSIX
+/* This if for random.c. */
+#define gettimeofday	vms_gettimeofday
+#ifndef __TIMEVAL
+#define __TIMEVAL 1
+struct timeval	{ long tv_sec, tv_usec; };
+#endif
+extern int   gettimeofday(struct timeval *,void *);
+#endif
+
+#else	/* awk.h, not POSIX */
+
+/* some macros to redirect to code in vms/vms_misc.c */
+#ifndef bcopy
+#define bcopy		vms_bcopy
+#endif
+#define open		vms_open
+#define popen		vms_popen
+#define pclose		vms_pclose
+#ifndef HAVE_SNPRINTF
+#define snprintf gawk_snprintf	/* avoid %CC-I-INTRINSICDECL diagnostic */
+#define vsnprintf gawk_vsnprintf
+#endif
+/* supply missing or suppressed (due to defines in config.h) declarations */
+extern int snprintf(char *,size_t,const char *,...);
+extern int vsnprintf(char *restrict,size_t,const char *,va_list);
+extern int setenv(const char *,const char *,int);
+extern int unsetenv(const char *);
+#define strerror	vms_strerror
+#define strdup		vms_strdup
+#define unlink		vms_unlink
+#if defined(VAXC) || (defined(__GNUC__) && !defined(__alpha))
+#define fstat(fd,sb)	VMS_fstat(fd,sb)
+#endif
+extern void  exit(int);
+extern int   open(const char *,int,...);
+extern char *strerror(int);
+extern char *strdup(const char *str);
+extern int   vms_devopen(const char *,int);
+# ifndef NO_TTY_FWRITE
+#define fwrite		tty_fwrite
+#define fclose		tty_fclose
+extern size_t fwrite(const void *,size_t,size_t,FILE *);
+extern int    fclose(FILE *);
+# endif
+extern FILE *popen(const char *,const char *);
+extern int   pclose(FILE *);
+extern void vms_arg_fixup(int *,char ***);
+/* some things not in STDC_HEADERS */
+extern size_t gnu_strftime(char *,size_t,const char *,const struct tm *);
+extern int unlink(const char *);
+extern int getopt(int,char **,char *);
+extern int isatty(int);
+#ifndef fileno
+extern int fileno(FILE *);
+#endif
+extern int close(int);
+extern int dup(int);
+extern int dup2(int, int);
+extern int read(int, void *, int);
+extern int getpgrp(void);
+extern void tzset(void);
+
+#endif	/* not VMS_POSIX and not IN_CONFIG_H */
+
+/*vms/redirect.h*/
diff --git a/gawk-5.0.1/vms/remove_old_gawk.com b/gawk-5.0.1/vms/remove_old_gawk.com
new file mode 100644
index 00000000000..ef7bce46c03
--- /dev/null
+++ b/gawk-5.0.1/vms/remove_old_gawk.com
@@ -0,0 +1,116 @@
+$! File: remove_old_gawk.com
+$!
+$! This is a procedure to remove the old gawk images that were installed
+$! by the GNV kits and replace them with links to the new image.
+$!
+$! 02-Jan-2014  J. Malmberg	Gawk version
+$!
+$!==========================================================================
+$!
+$vax = f$getsyi("HW_MODEL") .lt. 1024
+$old_parse = ""
+$if .not. VAX
+$then
+$   old_parse = f$getjpi("", "parse_style_perm")
+$   set process/parse=extended
+$endif
+$!
+$old_cutils = "gawk,awk,"
+$!
+$!
+$ i = 0
+$cutils_loop:
+$   file = f$element(i, ",", old_cutils)
+$   if file .eqs. "" then goto cutils_loop_end
+$   if file .eqs. "," then goto cutils_loop_end
+$   call update_old_image 'file'
+$   call update_old_image 'file' '[usr.bin]'
+$   i = i + 1
+$   goto cutils_loop
+$cutils_loop_end:
+$!
+$!
+$if .not. VAX
+$then
+$   file = "gnv$gnu:[usr.share.man.cat1]awk^.1.gz"
+$   if f$search(file) .nes. "" then delete 'file';*
+$   file = "gnv$gnu:[usr.share.man.cat1]gawk^.1.gz"
+$   if f$search(file) .nes. "" then delete 'file';*
+$   file = "gnv$gnu:[usr.share.man.cat1]iawk^.1.gz"
+$   if f$search(file) .nes. "" then delete 'file';*
+$endif
+$!
+$!
+$if .not. VAX
+$then
+$   set process/parse='old_parse'
+$endif
+$!
+$all_exit:
+$  exit
+$!
+$! Remove old image or update it if needed.
+$!-------------------------------------------
+$update_old_image: subroutine
+$!
+$ file = p1
+$ fdir = p2
+$ if fdir .eqs. "" then fdir = "[bin]"
+$! First get the FID of the new gawk image.
+$! Don't remove anything that matches it.
+$ new_gawk = f$search("GNV$GNU:[user.bin]GNV$''file'.EXE")
+$!
+$ new_gawk_fid = "No_new_gawk_fid"
+$ if new_gawk .nes. ""
+$ then
+$   new_gawk_fid = f$file_attributes(new_gawk, "FID")
+$ endif
+$!
+$!
+$!
+$! Now get check the "''file'." and "''file'.exe"
+$! May be links or copies.
+$! Ok to delete and replace.
+$!
+$!
+$ old_gawk_fid = "No_old_gawk_fid"
+$ old_gawk = f$search("gnv$gnu:''fdir'''file'.")
+$ old_gawk_exe_fid = "No_old_gawk_fid"
+$ old_gawk_exe = f$search("gnv$gnu:''fdir'''file'.exe")
+$ if old_gawk_exe .nes. ""
+$ then
+$   old_gawk_exe_fid = f$file_attributes(old_gawk_exe, "FID")
+$ endif
+$!
+$ if old_gawk .nes. ""
+$ then
+$   fid = f$file_attributes(old_gawk, "FID")
+$   if fid .nes. new_gawk_fid
+$   then
+$       if fid .eqs. old_gawk_exe_fid
+$       then
+$           set file/remove 'old_gawk'
+$       else
+$           delete 'old_gawk'
+$       endif
+$       if new_gawk .nes. ""
+$       then
+$           set file/enter='old_gawk' 'new_gawk'
+$       endif
+$   endif
+$ endif
+$!
+$ if old_gawk_exe .nes. ""
+$ then
+$   if old_gawk_fid .nes. new_gawk_fid
+$   then
+$       delete 'old_gawk_exe'
+$       if new_gawk .nes. ""
+$       then
+$           set file/enter='old_gawk_exe' 'new_gawk'
+$       endif
+$   endif
+$ endif
+$!
+$ exit
+$ENDSUBROUTINE ! Update old image
diff --git a/gawk-5.0.1/vms/stage_gawk_install.com b/gawk-5.0.1/vms/stage_gawk_install.com
new file mode 100644
index 00000000000..c980eacf65a
--- /dev/null
+++ b/gawk-5.0.1/vms/stage_gawk_install.com
@@ -0,0 +1,300 @@
+$! File: stage_gawk_install.com
+$!
+$! Stages the build products to new_gnu:[...] for testing and for building
+$! a kit.
+$!
+$! If p1 starts with "R" then remove instead of install.
+$!
+$! The file PCSI_GAWK_FILE_LIST.TXT is read in to get the files other
+$! than the release notes file and the source backup file.
+$!
+$! The PCSI system can really only handle ODS-2 format filenames and
+$! assumes that there is only one source directory.  It also assumes that
+$! all destination files with the same name come from the same source file.
+$!
+$!
+$! 29-Sep-2013  J. Malmberg
+$!
+$!===========================================================================
+$!
+$ arch_type = f$getsyi("ARCH_NAME")
+$ arch_code = f$extract(0, 1, arch_type)
+$!
+$ mode = "install"
+$ code = f$extract(0, 1, p1)
+$ if code .eqs. "R" .or. code .eqs. "r" then mode = "remove"
+$!
+$!  First create the directories
+$!--------------------------------
+$ if mode .eqs. "install"
+$ then
+$   create/dir new_gnu:[bin]/prot=o:rwed
+$   create/dir new_gnu:[vms_bin]/prot=o:rwed
+$   create/dir new_gnu:[vms_help]/prot=o:rwed
+$   create/dir new_gnu:[lib]/prot=o:rwed
+$   create/dir new_gnu:[usr.bin]/prot=o:rwed
+$   create/dir new_gnu:[usr.include]/prot=o:rwed
+$   create/dir new_gnu:[usr.lib.gawk]/prot=o:rwed
+$   create/dir new_gnu:[usr.share.awk]/prot=o:rwed
+$   create/dir new_gnu:[usr.share.doc.gawk]/prot=o:rwed
+$   create/dir new_gnu:[usr.share.info]/prot=o:rwed
+$   create/dir new_gnu:[usr.src.gawk.extension.vms]/prot=o:rwed
+$   create/dir new_gnu:[usr.share.man.man1]/prot=o:rwed
+$ endif
+$!
+$ if mode .eqs. "install"
+$ then
+$    copy [.vms]gnv_gawk_startup.com -
+         new_gnu:[vms_bin]gnv$gawk_startup.com
+$ else
+$    file = "new_gnu:[vms_bin]gnv$gawk_startup.com"
+$    if f$search(file) .nes. "" then delete 'file';*
+$ endif
+$!
+$!
+$!   Read through the file list to set up aliases and rename commands.
+$!---------------------------------------------------------------------
+$ open/read flst [.vms]pcsi_gawk_file_list.txt
+$!
+$inst_alias_loop:
+$   ! Skip the aliases
+$   read/end=inst_file_loop_end flst line_in
+$   line_in = f$edit(line_in,"compress,trim,uncomment")
+$   if line_in .eqs. "" then goto inst_alias_loop
+$   pathname = f$element(0, " ", line_in)
+$   linkflag = f$element(1, " ", line_in)
+$   if linkflag .nes. "->" then goto inst_alias_done
+$   goto inst_alias_loop
+$!
+$inst_file_loop:
+$!
+$   read/end=inst_file_loop_end flst line_in
+$   line_in = f$edit(line_in,"compress,trim,uncomment")
+$   if line_in .eqs. "" then goto inst_file_loop
+$!
+$inst_alias_done:
+$!
+$!
+$!   Skip the directories as we did them above.
+$!   Just process the files.
+$   tdir = f$parse(line_in,,,"DIRECTORY")
+$   tdir_len = f$length(tdir)
+$   tname = f$parse(line_in,,,"NAME")
+$   lctname = f$edit(tname, "LOWERCASE")
+$   ttype = f$parse(line_in,,,"TYPE")
+$   if arch_code .eqs. "V"
+$   then
+$       tname = lctname
+$       ttype = f$edit(ttype, "LOWERCASE")
+$       tdir = f$edit(tdir, "LOWERCASE")
+$   endif
+$   if tname .eqs. "" then goto inst_file_loop
+$   if ttype .eqs. ".dir" then goto inst_file_loop
+$!
+$!   if p1 starts with "R" then remove instead of install.
+$!
+$!   If gnv$xxx.exe, then:
+$!       Source is []gnv$gawk.exe
+$!       Destination1 is new_gnu:[bin]gnv$gawk.exe
+$!       Destination2 is new_gnu:[bin]xxx.  (alias)
+$!       Destination2 is new_gnu:[bin]xxx.exe  (alias)
+$!       We put all in new_gnu:[bin] instead of some in [usr.bin] because
+$!       older GNV kits incorrectly put some images in [bin] and [bin]
+$!       comes first in the search list.
+$   if f$locate("gnv$", tname) .eq. 0
+$   then
+$       myfile_len = f$length(tname)
+$       myfile = f$extract(4, myfile_len, tname)
+$       source = "[]''myfile'''ttype'"
+$       dest1 = "new_gnu:[bin]''tname'''ttype'"
+$       dest2 = "new_gnu:[bin]''myfile'."
+$       dest3 = "new_gnu:[bin]''myfile'.exe"
+$       if mode .eqs. "install"
+$       then
+$           if f$search(dest1) .eqs. "" then copy 'source' 'dest1'
+$           if f$search(dest2) .eqs. "" then set file/enter='dest2' 'dest1'
+$           if f$search(dest3) .eqs. "" then set file/enter='dest3' 'dest1'
+$       else
+$           if f$search(dest2) .nes. "" then set file/remove 'dest2';*
+$           if f$search(dest3) .nes. "" then set file/remove 'dest3';*
+$           if f$search(dest1) .nes. "" then delete 'dest1';*
+$       endif
+$       goto inst_file_loop
+$   endif
+$!
+$!   If lib.gawk] then
+$!       source is sys$disk:[]
+$!       dest is new_gnu:[usr.lib.gawk]
+$    if f$locate("lib.gawk]", tdir) .lt. tdir_len
+$    then
+$!       ! Not yet available on VAX/VMS
+$        if arch_code .eqs. "V" then goto inst_file_loop
+$!
+$        source = "[]''tname'''ttype'"
+$        dest = "new_gnu:[usr.lib.gawk]''tname'''ttype'"
+$        if mode .eqs. "install"
+$        then
+$            if f$search(dest) .eqs. "" then copy 'source' 'dest'
+$        else
+$            if f$search(dest) .nes. "" then delete 'dest';*
+$        endif
+$        goto inst_file_loop
+$    endif
+$!
+$!   If .vms_bin] then
+$!       source is sys$disk:[]
+$!       dest is [vms_bin]
+$   if (f$locate("vms_bin]", tdir) .lt. tdir_len)
+$   then
+$       if (ttype .eqs. ".cld")
+$       then
+$           source = "sys$disk:[]''tname'''ttype'"
+$       else
+$           source = "sys$disk:[.vms]''tname'''ttype'"
+$       endif
+$       dest = "new_gnu:[vms_bin]''tname'''ttype'"
+$       if mode .eqs. "install"
+$       then
+$           if f$search(dest) .eqs. "" then copy 'source' 'dest'
+$       else
+$           if f$search(dest) .nes. "" then delete 'dest';*
+$       endif
+$       goto inst_file_loop
+$   endif
+$!
+$!   If .vms_hlp] then
+$!       source is sys$disk:[.vms]
+$!       dest is [vms_help]
+$   if (f$locate("vms_help]", tdir) .lt. tdir_len) .and. (ttype .eqs. ".hlp")
+$   then
+$       source = "sys$disk:[.vms]''tname'''ttype'"
+$       dest = "new_gnu:[vms_help]''tname'''ttype'"
+$       if mode .eqs. "install"
+$       then
+$           if f$search(dest) .eqs. "" then copy 'source' 'dest'
+$       else
+$           if f$search(dest) .nes. "" then delete 'dest';*
+$       endif
+$       goto inst_file_loop
+$   endif
+$!
+$!   If doc.gawk] then
+$!       source is sys$disk:[] or [.readme_d]
+$!       dest is [usr.share.doc.gawk]
+$   if f$locate(".doc.gawk]", tdir) .lt. tdir_len
+$   then
+$       if lctname .eqs. "readme" .and. ttype .nes. "."
+$       then
+$           source = "sys$disk:[.README_D]''tname'''ttype'"
+$           if f$search(source) .eqs. ""
+$           then
+$!              ! This may be an NFS mangled name on VAX.
+$               stype = ttype - "."
+$               if stype .nes. "vms" then stype = "$" + stype
+$               source = "sys$disk:[.$README_$D]$README.''stype'"
+$           endif
+$       else
+$           source = "sys$disk:[]''tname'''ttype'"
+$           if f$search(source) .eqs. ""
+$           then
+$               source = "sys$disk:[]$''tname'''ttype'"
+$           endif
+$       endif
+$       dest = "new_gnu:[usr.share.doc.gawk]''tname'''ttype'"
+$       if mode .eqs. "install"
+$       then
+$           if f$search(dest) .eqs. "" then copy 'source' 'dest'
+$       else
+$           if f$search(dest) .nes. "" then delete 'dest';*
+$       endif
+$       goto inst_file_loop
+$   endif
+$!
+$!   If .awk] then
+$!       source is sys$disk:[.awklib.eg.lib]
+$!       dest is new_gnu:[usr.share.awk]
+$    if f$locate(".awk]", tdir) .lt. tdir_len
+$    then
+$        source = "[.awklib.eg.lib]''tname'''ttype'"
+$        dest = "new_gnu:[usr.share.awk]''tname'''ttype'"
+$        if mode .eqs. "install"
+$        then
+$            if f$search(dest) .eqs. "" then copy 'source' 'dest'
+$        else
+$            if f$search(dest) .nes. "" then delete 'dest';*
+$        endif
+$        goto inst_file_loop
+$    endif
+$!
+$!   If *.info then
+$!       source is [.doc]gawk.info
+$!       dest is [.usr.share.info]
+$    if ttype .eqs. ".info"
+$    then
+$        source = "[.doc]''tname'''ttype'"
+$        dest = "new_gnu:[usr.share.info]''tname'''ttype'"
+$        if mode .eqs. "install"
+$        then
+$            if f$search(dest) .eqs. "" then copy 'source' 'dest'
+$        else
+$            if f$search(dest) .nes. "" then delete 'dest';*
+$        endif
+$        goto inst_file_loop
+$    endif
+$!
+$!   If *.h then
+$!       source is []*.h
+$!       dest is [.usr.include]
+$    if ttype .eqs. ".h"
+$    then
+$        source = "[]''tname'''ttype'"
+$        dest = "new_gnu:[usr.include]''tname'''ttype'"
+$        if mode .eqs. "install"
+$        then
+$            if f$search(dest) .eqs. "" then copy 'source' 'dest'
+$        else
+$            if f$search(dest) .nes. "" then delete 'dest';*
+$        endif
+$        goto inst_file_loop
+$    endif
+$!
+$!   If *.opt then
+$!       source is [.vms]gawk_plugin.opt
+$!       dest is [.usr.src.gawk.extension.vms]
+$    if ttype .eqs. ".opt"
+$    then
+$        source = "[.vms]''tname'''ttype'"
+$        dest = "new_gnu:[usr.src.gawk.extension.vms]''tname'''ttype'"
+$        if mode .eqs. "install"
+$        then
+$            if f$search(dest) .eqs. "" then copy 'source' 'dest'
+$        else
+$            if f$search(dest) .nes. "" then delete 'dest';*
+$        endif
+$        goto inst_file_loop
+$    endif
+$!
+$!   If xxx.1 then
+$!       source is [.doc]xxx.1
+$!       dest is [usr.share.man.man1]
+$    if ttype .eqs. ".1"
+$    then
+$        source = "[.doc]''tname'''ttype'"
+$        dest = "new_gnu:[usr.share.man.man1]''tname'''ttype'"
+$        if mode .eqs. "install"
+$        then
+$            if f$search(dest) .eqs. "" then copy 'source' 'dest'
+$        else
+$            if f$search(dest) .nes. "" then delete 'dest';*
+$        endif
+$        goto inst_file_loop
+$    endif
+$!
+$    goto inst_file_loop
+$!
+$inst_file_loop_end:
+$!
+$close flst
+$!
+$all_exit:
+$   exit
diff --git a/gawk-5.0.1/vms/unixlib.h b/gawk-5.0.1/vms/unixlib.h
new file mode 100644
index 00000000000..24fadce1452
--- /dev/null
+++ b/gawk-5.0.1/vms/unixlib.h
@@ -0,0 +1,27 @@
+/* "unixlib.h"	--  limited substitute for VAX C V3.x's <unixlib.h>,
+ * for use with VAX C V2.x and/or GNU C when building gawk.
+ */
+
+
+/* declare the global environ[] array */
+#ifdef VAXC
+extern char noshare **environ;
+#else
+# ifdef __GNUC__
+#  define environ $$PsectAttributes_NOSHR$$environ
+# endif
+extern char **environ;
+#endif
+
+/* miscellaneous Unix emulation routines available in VAXCRTL */
+char *getenv(), *getcwd();
+
+char *ecvt(), *fcvt(), *gcvt();
+
+int getpid(), getppid();
+
+unsigned getuid();
+#ifndef _stdlib_h	/* gcc's stdlib.h has these with conflicting types */
+unsigned getgid(), getegid(), geteuid();
+#endif
+int setgid(), setuid();		/* no-ops */
diff --git a/gawk-5.0.1/vms/varargs.h b/gawk-5.0.1/vms/varargs.h
new file mode 100644
index 00000000000..ce66e7d5ef0
--- /dev/null
+++ b/gawk-5.0.1/vms/varargs.h
@@ -0,0 +1,38 @@
+/* "varargs.h" -- old style variable argument list manipulation (for VAX) */
+#ifndef __GNUC__
+
+ /* Use the system's macros with the system's compiler. */
+#include <varargs.h>
+
+#else	/*__GNUC__*/
+
+# if defined(__VAX__) || defined(__vax__) || defined(VAX) || defined(vax)
+ /* These macros implement traditional (non-ANSI) varargs for GNU C on VAX */
+
+#  if !defined(_VA_LIST) && !defined(_VA_LIST_)
+#   define _VA_LIST
+#   define _VA_LIST_
+typedef char *va_list;
+#  endif
+
+#  define va_alist	_varargs
+#  define va_dcl	int va_alist;
+#  define va_start(AP)	AP = (va_list) &va_alist
+#  define va_end(AP)
+
+#  define _va_rounded_size(TYPE)	\
+	(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
+
+#  define va_arg(AP,TYPE)		\
+	(AP += _va_rounded_size(TYPE),	\
+		*((TYPE *) (AP - _va_rounded_size(TYPE))))
+
+#  if defined(__VMS__) || defined(__vms__) || defined(VMS) || defined(vms)
+ /* VAX C compatability macros */
+#   define va_count(CNT)  vaxc$va_count(&CNT)	/* rtl routine */
+#   define va_start_1(AP,OFFSET)  AP = (va_list) (&va_alist + (OFFSET))
+#  endif /* VMS */
+
+# endif /* VAX */
+
+#endif	/*__GNUC__*/
diff --git a/gawk-5.0.1/vms/vax/ChangeLog b/gawk-5.0.1/vms/vax/ChangeLog
new file mode 100644
index 00000000000..b45d62555f1
--- /dev/null
+++ b/gawk-5.0.1/vms/vax/ChangeLog
@@ -0,0 +1,39 @@
+2019-06-18         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.1: Release tar ball made.
+
+2019-04-12         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 5.0.0: Release tar ball made.
+
+2018-02-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.1: Release tar ball made.
+
+2017-10-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.2.0: Release tar ball made.
+
+2016-08-25         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.4: Release tar ball made.
+
+2015-05-19         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.3: Release tar ball made.
+
+2015-04-29         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.2: Release tar ball made.
+
+2014-04-08         Arnold D. Robbins     <arnold@skeeve.com>
+
+	* 4.1.1: Release tar ball made.
+
+2013-12-29         John Malmberg         <wb8tyw@qsl.net>
+
+	* ChangeLog: New directory.
+	* gawk_plugin_xfer.mar_exact, gawk_plugin_xfer.opt,
+	  macro32_exactcase.com, macro32_exactcase.patch:
+	  These are experimental files for future support of
+	  dynamic extensions on VAX/VMS.
diff --git a/gawk-5.0.1/vms/vax/gawk_plugin_xfer.mar_exact b/gawk-5.0.1/vms/vax/gawk_plugin_xfer.mar_exact
new file mode 100644
index 00000000000..e90babbd552
--- /dev/null
+++ b/gawk-5.0.1/vms/vax/gawk_plugin_xfer.mar_exact
@@ -0,0 +1,13 @@
+	.PSECT GAWK_PLUGIN_XFERVECTORS -
+			PIC,USR,CON,REL,GBL,SHR,EXE,RD,NOWRT,QUAD
+
+;	Exact case transfer vector and universal symbols
+;
+	.ALIGN QUAD
+	.EXTERNAL plugin_is_GPL_compatible
+
+	.TRANSFER dl_load
+	.MASK dl_load
+	JMP L^dl_load+2
+
+	.END
diff --git a/gawk-5.0.1/vms/vax/gawk_plugin_xfer.opt b/gawk-5.0.1/vms/vax/gawk_plugin_xfer.opt
new file mode 100644
index 00000000000..75c134f7562
--- /dev/null
+++ b/gawk-5.0.1/vms/vax/gawk_plugin_xfer.opt
@@ -0,0 +1,5 @@
+CASE_SENSITIVE=YES
+UNIVERSAL=plugin_is_GPL_compatible
+UNIVERSAL=dl_load
+!CLUSTER=GAWK_PLUGIN_XFER
+!COLLECT=GAWK_GLOBAL, GAWK_PLUGIN_XFERVECTORS
diff --git a/gawk-5.0.1/vms/vax/macro32_exactcase.com b/gawk-5.0.1/vms/vax/macro32_exactcase.com
new file mode 100644
index 00000000000..79194e21839
--- /dev/null
+++ b/gawk-5.0.1/vms/vax/macro32_exactcase.com
@@ -0,0 +1,16 @@
+$!
+$! Patch the Macro32 compiler and optional assemble
+$!-----------------------------------------------------
+$ patched_macro = "sys$disk:[]macro32_exactcase.exe"
+$ if f$search(patched_macro) .eqs. ""
+$ then
+$   copy sys$system:macro32.exe 'patched_macro'
+$   patch @[.vms]macro32_exactcase.patch
+$ endif
+$! Usage:
+$ xfer_file_source = p1
+$ if f$search(p1) .nes. ""
+$ then
+$    define/user macro32 'patched_macro'
+$    macro/lis 'p1'
+$ endif
diff --git a/gawk-5.0.1/vms/vms.h b/gawk-5.0.1/vms/vms.h
new file mode 100644
index 00000000000..43ca837d87e
--- /dev/null
+++ b/gawk-5.0.1/vms/vms.h
@@ -0,0 +1,119 @@
+/*
+ * vms.h - miscellaneous definitions for use with VMS system services.
+ *							Pat Rankin, Nov'89
+ */
+
+#if 1
+#include <iodef.h>
+#else
+#define IO$_WRITEVBLK	48	/* write virtual block */
+#define IO$V_CANCTRLO	6	/* cancel <ctrl/O> (ie, resume tty output) */
+#define IO$M_CANCTRLO	(1 << IO$V_CANCTRLO)
+#endif
+
+#if 1
+#include <clidef.h>
+#include <cliverbdef.h>
+#include <fscndef.h>
+#else
+#define CLI$K_GETCMD	1
+#define CLI$K_VERB_MCR	33
+#define CLI$K_VERB_RUN	36
+#define FSCN$_FILESPEC	1
+#endif
+
+#if 1
+#include <climsgdef.h>
+#else
+#define CLI$_INSFPRM	0x00038048	/* insufficient parameters */
+#define CLI$_VALREQ	0x00038150	/* missing required value  */
+#define CLI$_NEGATED	0x000381F8	/* explicitly negated */
+#define CLI$_CONFLICT	0x00038258	/* conflicting qualifiers  */
+#define CLI$_NOOPTPRS	0x00038840	/* no option present	   */
+#endif
+/* Missing in VAX/VMS 7.3 */
+#ifndef CLI$_RUNUSED
+#define CLI$_RUNUSED	0x00030000	/* value returned by $CLI for "RUN" */
+#endif
+/* Missing as of VMS 8.4 */
+#ifndef CLI$_SYNTAX
+#define CLI$_SYNTAX	0x000310FC	/* error signalled by CLI$DCL_PARSE */
+#endif
+
+
+#if 1
+#include <psldef.h>
+#else
+#define PSL$C_USER	3	/* user mode */
+#endif
+
+/* note: `ulong' and `u_long' end up conflicting with various header files */
+typedef unsigned long	U_Long;
+typedef unsigned short	U_Short;
+
+#include <descrip.h>
+#include <stsdef.h>
+
+#pragma member_alignment save
+#pragma nomember_alignment longword
+#pragma message save
+#pragma message disable misalgndmem
+typedef struct _itm { U_Short len, code; void *buffer; U_Short *retlen; } Itm;
+#pragma message restore
+#pragma member_alignment restore
+
+
+#define vmswork(sts) $VMS_STATUS_SUCCESS(sts)
+#define vmsfail(sts) (!$VMS_STATUS_SUCCESS(sts))
+#define CondVal(sts) ((sts)&0x0FFFFFF8)     /* strip severity & msg inhibit */
+#define Descrip(strdsc,strbuf) struct dsc$descriptor_s \
+  strdsc = {sizeof strbuf - 1, DSC$K_DTYPE_T, DSC$K_CLASS_S, (char *)strbuf}
+
+extern int    shell$is_shell(void);
+extern U_Long LIB$FIND_FILE(const struct dsc$descriptor_s *,
+                            struct dsc$descriptor_s *, void *, ...);
+extern U_Long LIB$FIND_FILE_END(void *);
+#ifndef NO_TTY_FWRITE
+extern U_Long LIB$GET_EF(long *);
+extern U_Long SYS$ASSIGN(const struct dsc$descriptor_s *, short *, long,
+                         const struct dsc$descriptor_s *);
+extern U_Long SYS$DASSGN(short);
+extern U_Long SYS$QIO(U_Long, U_Long, U_Long, void *,
+			 void (*)(U_Long), U_Long,
+			 const char *, int, int, U_Long, int, int);
+extern U_Long SYS$SYNCH(long, void *);
+#endif	/*!NO_TTY_FWRITE*/
+extern U_Long LIB$SPAWN(const struct dsc$descriptor_s *,
+                        const struct dsc$descriptor_s *,
+                        const struct dsc$descriptor_s *,
+			const U_Long *,
+                        const struct dsc$descriptor_s *,
+                        U_Long *, U_Long * ,...);
+ /* system services for logical name manipulation */
+extern U_Long SYS$TRNLNM(const U_Long *,
+                         const struct dsc$descriptor_s *,
+                         const struct dsc$descriptor_s *,
+			 const unsigned char *, Itm *);
+extern U_Long SYS$CRELNM(const U_Long *,
+                         const struct dsc$descriptor_s *,
+                         const struct dsc$descriptor_s *,
+			 const unsigned char *, const Itm *);
+extern U_Long SYS$CRELOG(int,
+                         const struct dsc$descriptor_s *,
+                         const struct dsc$descriptor_s *,
+                         unsigned char);
+extern U_Long SYS$DELLNM(const struct dsc$descriptor_s *,
+                         const struct dsc$descriptor_s *,
+                         const unsigned char *);
+
+extern void   v_add_arg(int, const char *);
+extern void   vms_exit(int);
+extern char  *vms_strerror(int);
+extern char  *vms_strdup(const char *);
+extern int    vms_devopen(const char *,int);
+extern int    vms_execute(const char *, const char *, const char *);
+extern int    vms_gawk(void);
+extern U_Long Cli_Present(const char *);
+extern U_Long Cli_Get_Value(const char *, char *, int);
+extern U_Long Cli_Parse_Command(const void *, const char *);
+
diff --git a/gawk-5.0.1/vms/vms_args.c b/gawk-5.0.1/vms/vms_args.c
new file mode 100644
index 00000000000..1a9eb956822
--- /dev/null
+++ b/gawk-5.0.1/vms/vms_args.c
@@ -0,0 +1,442 @@
+/* vms_args.c -- command line parsing, to emulate shell i/o redirection.
+  		[ Escape sequence parsing now suppressed. ]
+
+   Copyright (C) 1991-1996, 1997, 2011, 2014, 2016
+   the Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+/*
+ * [.vms]vms_arg_fixup - emulate shell's command line processing: handle
+ *	    stdio redirection, backslash escape sequences, and file wildcard
+ *	    expansion.	Should be called immediately upon image startup.
+ *
+ *						      Pat Rankin, Nov'89
+ *						    rankin@pactechdata.com
+ *
+ *	<ifile	    - open 'ifile' (readonly) as 'stdin'
+ *	>nfile	    - create 'nfile' as 'stdout' (stream-lf format)
+ *	>>ofile     - append to 'ofile' for 'stdout'; create it if necessary
+ *	>&efile     - point 'stderr' (SYS$ERROR) at 'efile', but don't open
+ *	>$vfile     - create 'vfile' as 'stdout', using rms attributes
+ *		      appropriate for a standard text file (variable length
+ *		      records with implied carriage control)
+ *	>+vfile     - create 'vfile' as 'stdout' in binary mode (using
+ *		      variable length records with implied carriage control)
+ *	2>&1        - special case: direct error messages into output file
+ *	1>&2        - special case: direct output data to error destination
+ *	<<sentinal  - error; reading stdin until 'sentinal' not supported
+ *	<-, >-	    - error: stdin/stdout closure not implemented
+ *	| anything  - error; pipes not implemented
+ *	& <end-of-line> - error; background execution not implemented
+ *
+ *	any\Xany    - convert 'X' as appropriate; \000 will not work as
+ *		      intended since subsequent processing will misinterpret
+ *
+ *	any*any     - perform wildcard directory lookup to find file(s)
+ *	any%any     -	 "       "    ('%' is vms wildcard for '?' [ie, /./])
+ *	any?any     - treat like 'any%any' unless no files match
+ *	*, %, ?     - if no file(s) match, leave original value in arg list
+ *
+ *
+ * Notes:  a redirection operator  can have optional white space between it
+ *	and its filename; the  operator itself *must* be preceded by  white
+ *	space  so that it starts  a  separate  argument.  '<' is  ambiguous
+ *	since "<dir>file" is a valid VMS file specification; leading '<' is
+ *	assumed  to be	stdin--use "\<dir>file" to override.  '>$' is local
+ *	kludge to force  stdout to be created with text file RMS attributes
+ *	instead of  stream  format;  file  sharing is disabled	for  stdout
+ *	regardless.  Multiple  instances of  stdin  or stdout or stderr are
+ *	treated as fatal errors  rather than using the first or last.  If a
+ *	wildcard file specification is detected, it is expanded into a list
+ *	of  filenames  which match; if there  are no  matches, the original
+ *	file-spec is left in the argument list rather than having it expand
+ *	into thin  air.   No  attempt is made to identify  and	make $(var)
+ *	environment substitutions--must draw the line somewhere!
+ *
+ *   Oct'91, gawk 2.13.3
+ *	Open '<' with full sharing allowed, so that we can  read batch logs
+ *	and other open files.  Create record-format output ('>$') with read
+ *	sharing permited,  so that others can read our output file to check
+ *	progess.  For stream  output ('>' or  '>>'), sharing is  disallowed
+ *	(for performance reasons).
+ *
+ *   Sep'94, gawk 2.15.6		[pr]
+ *	Add '>+' to force binary mode output, to enable better control
+ *	for the user when the output destination is a mailbox or socket.
+ *	(ORS = "\r\n" for tcp/ip.)  Contributed by Per Steinar Iversen.
+ *
+ *   Jan'11, gawk 4.0.0		[pr]
+ *	If AWK_LIBRARY is undefined, define it to be SYS$LIBRARY: so
+ *	that the default value of AWKPATH ends with a valid directory.
+ */
+
+#include "awk.h"	/* really "../awk.h" */
+#include "vms.h"
+#include <lnmdef.h>
+
+       void   v_add_arg(int, const char *);
+static char  *skipblanks(const char *);
+static void   vms_expand_wildcards(const char *);
+static U_Long vms_define(const char *, const char *);
+static char  *t_strstr(const char *, const char *);
+#define strstr t_strstr		/* strstr() missing from vaxcrtl for V4.x */
+
+static	int	v_argc,  v_argz = 0;
+static	char  **v_argv;
+
+/* vms_arg_fixup() - scan argv[] for i/o redirection and wildcards and also */
+/*		    rebuild it with those removed or expanded, respectively */
+void
+vms_arg_fixup( int *pargc, char ***pargv )
+{
+    const char *f_in, *f_out, *f_err,
+	*out_mode, *rms_rfm, *rms_shr, *rms_mrs;
+    char **argv = *pargv;
+    int i, argc = *pargc;
+    int err_to_out_redirect = 0, out_to_err_redirect = 0;
+    char * shell;
+    int using_shell;
+
+    /* make sure AWK_LIBRARY has a value */
+    if (!getenv("AWK_LIBRARY"))
+	vms_define("AWK_LIBRARY", "SYS$LIBRARY:");
+
+    /* Check if running under a shell instead of DCL */
+    using_shell = 1;
+    shell = getenv("SHELL");
+    if (shell != NULL) {
+	if (strcmp(shell, "DCL") == 0) {
+	    using_shell = 0;
+	}
+    } else {
+	using_shell = 0;
+    }
+    if (using_shell) {
+	return;
+    }
+#ifdef CHECK_DECSHELL	    /* don't define this if linking with DECC$SHR */
+    if (shell$is_shell())
+	return;		    /* don't do anything if we're running DEC/Shell */
+#endif
+#ifndef NO_DCL_CMD
+    for (i = 1; i < argc ; i++)     /* check for dash or other non-VMS args */
+	if (strchr("->\\|", *argv[i]))	break;	    /* found => (i < argc) */
+    if (i >= argc && (v_argc = vms_gawk()) > 0) {   /* vms_gawk => dcl_parse */
+	/* if we successfully parsed the command, replace original argv[] */
+	argc = v_argc,	argv = v_argv;
+	v_argz = v_argc = 0,  v_argv = NULL;
+    }
+#endif
+    v_add_arg(v_argc = 0, argv[0]);	/* store arg #0 (image name) */
+
+    f_in = f_out = f_err = NULL;	/* stdio setup (no filenames yet) */
+    out_mode = "w";			/* default access for stdout */
+    rms_rfm = "rfm=stmlf";		/* stream_LF format */
+    rms_shr = "shr=nil";		/* no sharing (for '>' output file) */
+    rms_mrs = "mrs=0";			/* no maximum record size */
+
+    for (i = 1; i < argc; i++) {
+	char *p, *fn;
+	int  is_arg;
+
+	is_arg = 0;		/* current arg does not begin with dash */
+	p = argv[i];		/* current arg */
+	switch (*p) {
+	  case '<':		/* stdin */
+	      /*[should try to determine whether this is really a directory
+		 spec using <>; for now, force user to quote them with '\<']*/
+		if ( f_in ) {
+		    fatal("multiple specification of '<' for stdin");
+		} else if (*++p == '<') {   /* '<<' is not supported */
+		    fatal("'<<' not available for stdin");
+		} else {
+		    p = skipblanks(p);
+		    fn = (*p ? p : argv[++i]);	/* use next arg if necessary */
+		    if (i >= argc || *fn == '-')
+			fatal("invalid i/o redirection, null filespec after '<'");
+		    else
+			f_in = fn;	    /* save filename for stdin */
+		}
+		break;
+	  case '>':   {		/* stdout or stderr */
+	      /*[vms-specific kludge '>$' added to force stdout to be created
+		 as record-oriented text file instead of in stream-lf format]*/
+		int is_out = 1;		    /* assume stdout */
+		if (*++p == '>')	/* '>>' => append */
+		    out_mode = "a",  p++;
+		else if (*p == '&')	/* '>&' => stderr */
+		    is_out = 0,  p++;
+		else if (*p == '$')	/* '>$' => kludge for record format */
+		    rms_rfm = "rfm=var",  rms_shr = "shr=get,upi",
+		    rms_mrs = "mrs=32767",  p++;
+		else if (*p == '+')	/* '>+' => kludge for binary output */
+		    out_mode = "wb",  rms_rfm = "rfm=var",
+		    rms_mrs = "mrs=32767",  p++;
+		else			/* '>'	=> create */
+		    {}	    /* use default values initialized prior to loop */
+		p = skipblanks(p);
+		fn = (*p ? p : argv[++i]);	/* use next arg if necessary */
+		if (i >= argc || *fn == '-') {
+		    fatal("invalid i/o redirection, null filespec after '>'");
+		} else if (is_out) {
+		    if (out_to_err_redirect)
+			fatal("conflicting specifications for stdout");
+		    else if (f_out)
+			fatal("multiple specification of '>' for stdout");
+		    else
+			f_out = fn;	    /* save filename for stdout */
+		} else {
+		    if (err_to_out_redirect)
+			fatal("conflicting specifications for stderr");
+		    else if (f_err)
+			fatal("multiple specification of '>&' for stderr");
+		    else
+			f_err = fn;	    /* save filename for stderr */
+		}
+	    }	break;
+	  case '2':		/* check for ``2>&1'' special case'' */
+		if (strcmp(p, "2>&1") != 0)
+		    goto ordinary_arg;
+		else if (f_err || out_to_err_redirect)
+		    fatal("conflicting specifications for stderr");
+		else {
+		    err_to_out_redirect = 1;
+		    f_err = "SYS$OUTPUT:";
+		}  break;
+	  case '1':		/* check for ``1>&2'' special case'' */
+		if (strcmp(p, "1>&2") != 0)
+		    goto ordinary_arg;
+		else if (f_out || err_to_out_redirect)
+		    fatal("conflicting specifications for stdout");
+		else {
+		    out_to_err_redirect = 1;
+		 /* f_out = "SYS$ERROR:"; */
+		}  break;
+	  case '|':		/* pipe */
+	      /* command pipelines are not supported */
+		fatal("command pipes not available ('|' encountered)");
+		break;
+	  case '&':		/* background */
+	      /*[we could probably spawn or fork ourself--maybe someday]*/
+		if (*(p+1) == '\0' && i == argc - 1) {
+		    fatal("background tasks not available ('&' encountered)");
+		    break;
+		} else {	/* fall through */
+		    ;	/*NOBREAK*/
+		}
+	  case '-':		/* argument */
+		is_arg = 1;		/*(=> skip wildcard check)*/
+	  default:		/* other (filespec assumed) */
+ordinary_arg:
+	      /* process escape sequences or expand wildcards */
+		v_add_arg(++v_argc, p);		/* include this arg */
+		p = strchr(p, '\\');		/* look for backslash */
+		if (p != NULL) {    /* does it have escape sequence(s)? */
+#if 0	/* disable escape parsing; it's now done elsewhere within gawk */
+		    register int c;
+		    char *q = v_argv[v_argc] + (p - argv[i]);
+		    do {
+			c = *p++;
+			if (c == '\\')
+			    c = parse_escape(&p);
+			*q++ = (c >= 0 ? (char)c : '\\');
+		    } while (*p != '\0');
+		    *q = '\0';
+#endif	/*0*/
+		} else if (!is_arg && strchr(v_argv[v_argc], '=') == NULL) {
+		    vms_expand_wildcards(v_argv[v_argc]);
+		}
+		break;
+	} /* end switch */
+    } /* loop */
+
+    /*
+     * Now process any/all I/O options encountered above.
+     */
+
+    /* must do stderr first, or vaxcrtl init might not see it */
+    /*[ catch 22:  we'll also redirect errors encountered doing <in or >out ]*/
+    if (f_err) {	/* define logical name but don't open file */
+	int len = strlen(f_err);
+	if (len >= (sizeof "SYS$OUTPUT" - sizeof "")
+	 && strncasecmp(f_err, "SYS$OUTPUT:", len) == 0)
+	    err_to_out_redirect = 1;
+	else
+	    (void) vms_define("SYS$ERROR", f_err);
+    }
+    /* do stdin before stdout, so if we bomb we won't make empty output file */
+    if (f_in) {		/* [re]open file and define logical name */
+	if (freopen(f_in, "r", stdin,
+		    "ctx=rec", "shr=get,put,del,upd",
+		    "mrs=32767", "mbc=32", "mbf=2"))
+	    (void) vms_define("SYS$INPUT", f_in);
+	else
+	    fatal("<%s (%s)", f_in, strerror(errno));
+    }
+    if (f_out) {
+	if (freopen(f_out, out_mode, stdout,
+		    rms_rfm, rms_shr, rms_mrs,
+		    "rat=cr", "mbc=32", "mbf=2"))
+	    (void) vms_define("SYS$OUTPUT", f_out);
+	else
+	    fatal(">%s%s (%s)", (*out_mode == 'a' ? ">" : ""),
+		  f_out, strerror(errno));
+    }
+    if (err_to_out_redirect) {	/* special case for ``2>&1'' construct */
+	(void) dup2(1, 2);	/* make file 2 (stderr) share file 1 (stdout) */
+	(void) vms_define("SYS$ERROR", "SYS$OUTPUT:");
+    } else if (out_to_err_redirect) {	/* ``1>&2'' */
+	(void) dup2(2, 1);	/* make file 1 (stdout) share file 2 (stderr) */
+	(void) vms_define("SYS$OUTPUT", "SYS$ERROR:");
+    }
+
+#ifndef NO_DCL_CMD
+    /* if we replaced argv[] with our own, we can release it now */
+    if (argv != *pargv)
+	free((void *)argv),  argv = NULL;
+#endif
+    *pargc = ++v_argc;		/* increment to account for argv[0] */
+    *pargv = v_argv;
+    return;
+}
+
+/* vms_expand_wildcards() - check a string for wildcard punctuation; */
+/*			   if it has any, attempt a directory lookup */
+/*			   and store resulting name(s) in argv array */
+static void
+vms_expand_wildcards( const char *prospective_filespec )
+{
+    char *p, spec_buf[255+1], res_buf[255+1];
+    struct dsc$descriptor_s spec, result;
+    void *context;
+    register int len = strlen(prospective_filespec);
+
+    if (len >= sizeof spec_buf)
+	return;		/* can't be valid--or at least we can't handle it */
+    strcpy(spec_buf, prospective_filespec);	/* copy the arg */
+    p = strchr(spec_buf, '?');
+    if (p != NULL)	/* change '?' single-char wildcard to '%' */
+	do  *p++ = '%',  p = strchr(p, '?');
+	    while (p != NULL);
+    else if (strchr(spec_buf, '*') == strchr(spec_buf, '%')  /* => both NULL */
+	  && strstr(spec_buf, "...") == NULL)
+	return;		/* no wildcards present; don't attempt file lookup */
+    spec.dsc$w_length = len;
+    spec.dsc$a_pointer = spec_buf;
+    spec.dsc$b_dtype = DSC$K_DTYPE_T;
+    spec.dsc$b_class = DSC$K_CLASS_S;
+    result.dsc$w_length = sizeof res_buf - 1;
+    result.dsc$a_pointer = res_buf;
+    result.dsc$b_dtype = DSC$K_DTYPE_T;
+    result.dsc$b_class = DSC$K_CLASS_S;
+
+    /* The filespec is already in v_argv[v_argc]; if we fail to match anything,
+       we'll just leave it there (unlike most shells, where it would evaporate).
+     */
+    len = -1;			/* overload 'len' with flag value */
+    context = NULL;		/* init */
+    while (vmswork(LIB$FIND_FILE(&spec, &result, &context))) {
+	for (len = sizeof(res_buf)-1; len > 0 && res_buf[len-1] == ' '; len--) ;
+	res_buf[len] = '\0';	/* terminate after discarding trailing blanks */
+	v_add_arg(v_argc++, strdup(res_buf));		/* store result */
+    }
+    (void)LIB$FIND_FILE_END(&context);
+    if (len >= 0)		/* (still -1 => never entered loop) */
+	--v_argc;		/* undo final post-increment */
+    return;
+}
+
+/* v_add_arg() - store string pointer in v_argv[]; expand array if necessary */
+void
+v_add_arg( int idx, const char *val )
+{
+#ifdef DEBUG_VMS
+    fprintf(stderr, "v_add_arg: v_argv[%d] ", idx);
+#endif
+    if (idx + 1 >= v_argz) {	/* 'v_argz' is the current size of v_argv[] */
+	int old_size = v_argz;
+
+	v_argz = idx + 10;	/* increment by arbitrary amount */
+	if (old_size == 0)
+	    v_argv = (char **)malloc((unsigned)(v_argz * sizeof(char **)));
+	else
+	    v_argv = (char **)realloc((char *)v_argv,
+				     (unsigned)(v_argz * sizeof(char **)));
+	if (v_argv == NULL) {	/* error */
+	    fatal("%s: %s: can't allocate memory (%s)", "vms_args",
+		  "v_argv", strerror(errno));
+	} else {
+	    while (old_size < v_argz)  v_argv[old_size++] = NULL;
+	}
+    }
+    v_argv[idx] = (char *)val;
+#ifdef DEBUG_VMS
+    fprintf(stderr, "= \"%s\"\n", val);
+#endif
+}
+
+/* skipblanks() - return a pointer to the first non-blank in the string */
+static char *
+skipblanks( const char *ptr )
+{
+    if (ptr)
+	while (*ptr == ' ' || *ptr == '\t')
+	    ptr++;
+    return (char *)ptr;
+}
+
+/* vms_define() - assign a value to a logical name [define/process/user_mode] */
+static U_Long
+vms_define( const char *log_name, const char *trans_val )
+{
+    struct dsc$descriptor_s log_dsc;
+    static Descrip(lnmtable,"LNM$PROCESS_TABLE");
+    static U_Long attr = LNM$M_CONFINE;
+    static Itm itemlist[] = { {0,LNM$_STRING,0,0}, {0,0} };
+    static unsigned char acmode = PSL$C_USER;
+    unsigned len = strlen(log_name);
+
+    /* avoid "define SYS$OUTPUT sys$output:" for redundant ">sys$output:" */
+    if (strncasecmp(log_name, trans_val, len) == 0
+     && (trans_val[len] == '\0' || trans_val[len] == ':'))
+	return 0;
+
+    log_dsc.dsc$a_pointer = (char *)log_name;
+    log_dsc.dsc$w_length = len;
+    log_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+    log_dsc.dsc$b_class = DSC$K_CLASS_S;
+    itemlist[0].buffer = (char *)trans_val;
+    itemlist[0].len = strlen(trans_val);
+    return SYS$CRELNM(&attr, &lnmtable, &log_dsc, &acmode, itemlist);
+}
+
+/* t_strstr -- strstr() substitute; search 'str' for 'sub' */
+/* [strstr() was not present in VAXCRTL prior to VMS V5.0] */
+static char *t_strstr ( const char *str, const char *sub )
+{
+    register const char *s0, *s1, *s2;
+
+    /* special case: empty substring */
+    if (!*sub)	return (char *)str;
+
+    /* brute force method */
+    for (s0 = s1 = str; *s1; s1 = ++s0) {
+	s2 = sub;
+	while (*s1++ == *s2++)
+	    if (!*s2)  return (char *)s0;	/* full match */
+    }
+    return (char *)0;	/* not found */
+}
diff --git a/gawk-5.0.1/vms/vms_cli.c b/gawk-5.0.1/vms/vms_cli.c
new file mode 100644
index 00000000000..521a0c9f2a3
--- /dev/null
+++ b/gawk-5.0.1/vms/vms_cli.c
@@ -0,0 +1,120 @@
+/* vms_cli.c -- interface to CLI$xxx routines for fetching command line components
+
+   Copyright (C) 1991-1993, 2003, 2011, 2014, 2016
+   the Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+
+/*
+ * vms_cli.c - command line interface routines.
+ *							Pat Rankin, Nov'89
+ *	Routines called from vms_gawk.c for DCL parsing.
+ */
+
+#include "config.h"	/* in case we want to suppress 'const' &c */
+#include "vms.h"
+#ifndef _STRING_H
+#include <string.h>
+#endif
+
+extern U_Long CLI$PRESENT(const struct dsc$descriptor_s *);
+extern U_Long CLI$GET_VALUE(const struct dsc$descriptor_s *,
+                            struct dsc$descriptor_s *, short *);
+extern U_Long CLI$DCL_PARSE(const struct dsc$descriptor_s *, const void *, ...);
+extern U_Long SYS$CLI(void *, ...);
+extern U_Long SYS$FILESCAN(const struct dsc$descriptor_s *, void *, long *);
+extern void  *LIB$ESTABLISH(U_Long (*handler)(void *, void *));
+extern U_Long LIB$SIG_TO_RET(void *, void *);	/* condition handler */
+
+/* Cli_Present() - call CLI$PRESENT to determine whether a parameter or     */
+/*		  qualifier is present on the [already parsed] command line */
+U_Long
+Cli_Present( const char *item )
+{
+    struct dsc$descriptor_s item_dsc;
+    (void)LIB$ESTABLISH(LIB$SIG_TO_RET);
+
+    item_dsc.dsc$w_length = strlen(item_dsc.dsc$a_pointer = (char *)item);
+    item_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+    item_dsc.dsc$b_class = DSC$K_CLASS_S;
+    return CLI$PRESENT(&item_dsc);
+}
+
+/* Cli_Get_Value() - call CLI$GET_VALUE to retreive the value of a */
+/*		    parameter or qualifier from the command line   */
+U_Long
+Cli_Get_Value( const char *item, char *result, int size )
+{
+    struct dsc$descriptor_s item_dsc, res_dsc;
+    U_Long sts;
+    short len = 0;
+    (void)LIB$ESTABLISH(LIB$SIG_TO_RET);
+
+    item_dsc.dsc$w_length = strlen(item_dsc.dsc$a_pointer = (char *)item);
+    item_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+    item_dsc.dsc$b_class = DSC$K_CLASS_S;
+    res_dsc.dsc$w_length = size;
+    res_dsc.dsc$a_pointer = result;
+    res_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+    res_dsc.dsc$b_class = DSC$K_CLASS_S;
+    sts = CLI$GET_VALUE(&item_dsc, &res_dsc, &len);
+    result[len] = '\0';
+    return sts;
+}
+
+/* Cli_Parse_Command() - use the $CLI system service (undocumented) to	 */
+/*			retreive the actual command line (which might be */
+/*			"run prog" or "mcr prog [params]") and then call */
+/*			CLI$DCL_PARSE to parse it using specified tables */
+U_Long
+Cli_Parse_Command( const void *cmd_tables, const char *cmd_verb )
+{
+    struct { short len, code; void *adr; } fscn[2];
+    struct { char rqtype, rqindx, rqflags, rqstat; unsigned :32;
+	     struct dsc$descriptor_s rdesc;
+             unsigned :32; unsigned :32; unsigned :32; } cmd;
+    U_Long sts;
+    int    ltmp;
+    char   longbuf[8200];
+    (void)LIB$ESTABLISH(LIB$SIG_TO_RET);
+
+    memset(&cmd, 0, sizeof cmd);
+    cmd.rqtype = CLI$K_GETCMD;		/* command line minus the verb */
+    sts = SYS$CLI(&cmd, (void *)0, (void *)0);	/* get actual command line */
+
+    if (vmswork(sts)) {		/* ok => cli available & verb wasn't "RUN" */
+	/* invoked via symbol => have command line (which might be empty) */
+	/*    [might also be invoked via mcr or dcl; that's ok]		  */
+	if (cmd.rqstat == CLI$K_VERB_MCR) {
+	    /* need to strip image name from MCR invocation   */
+	    memset(fscn, 0, sizeof fscn);
+	    fscn[0].code = FSCN$_FILESPEC;	/* full file specification */
+	    (void)SYS$FILESCAN(&cmd.rdesc, fscn, (long *)0);
+	    cmd.rdesc.dsc$w_length -= fscn[0].len;	/* shrink size */
+	    cmd.rdesc.dsc$a_pointer += fscn[0].len;	/* advance ptr */
+	}
+	/* prepend verb and then parse the command line */
+	strcat(strcpy(longbuf, cmd_verb), " "),  ltmp = strlen(longbuf);
+	if (cmd.rdesc.dsc$w_length + ltmp > sizeof longbuf)
+	    cmd.rdesc.dsc$w_length = sizeof longbuf - ltmp;
+	strncpy(&longbuf[ltmp],
+                cmd.rdesc.dsc$a_pointer, cmd.rdesc.dsc$w_length);
+	cmd.rdesc.dsc$w_length += ltmp,	cmd.rdesc.dsc$a_pointer = longbuf;
+	sts = CLI$DCL_PARSE(&cmd.rdesc, cmd_tables);
+    }
+
+    return sts;
+}
diff --git a/gawk-5.0.1/vms/vms_crtl_init.c b/gawk-5.0.1/vms/vms_crtl_init.c
new file mode 100644
index 00000000000..081ae2cc877
--- /dev/null
+++ b/gawk-5.0.1/vms/vms_crtl_init.c
@@ -0,0 +1,470 @@
+/* File: VMS_CRTL_INIT.C
+
+ This file is common to a lot of projects.
+
+ $Id: vms_crtl_init.c,v 1.1.1.1 2012/12/02 19:25:22 wb8tyw Exp $
+
+ Module that provides a LIB$INITIALIZE routine for the GNV toolset that
+ will turn on some CRTL features that are not enabled by default.
+
+ The CRTL features can also be turned on via logical names, but that
+ impacts all programs and some aren't ready, willing, or able to handle
+ the settings that GNV needs.
+
+ The original module was found linked with GPL V2 modules, and thus must
+ be able to be distributed under the GPL V2 provisions.
+
+ As this module or similar is needed for virtually all programs built to run
+ under GNV or UNIX, it can be distributed with other licenses.
+
+ Edit History
+
+ 1-001	John Reagan	Initial version using the old style interface
+			but with the new version commented out.
+
+ 1-002	John Reagan	Switch to new API for setting features
+
+ 1-003	Steve Pitcher	Add DECC$RENAME_NO_INHERIT.
+
+ 1-004	Steve Pitcher	Quiet these, if the DECC feature doesn't exist.
+
+ 2-001	J. Malmberg	New GNV requirements:
+			    Three variations of object modules:
+				1. For use with shells, sets the logical
+				   name GNV$UNIX_SHELL.
+
+				2. For utilities, if the logical name
+				   GNV$UNIX_SHELL is set, it means that the
+				   settings should assume that they are
+				   running under a UNIX like shell.
+
+				3. A third setting is for utilities that
+				   always should behave as if they are
+				   running under a UNIX shell.
+
+			    If GNV$GNU is defined, then locally define
+			    SYS$POSIX_ROOT to it.  GNV$GNU can be set in
+			    the SYSTEM table by the GNV setup.
+			    SYS$POSIX_ROOT can not.
+
+			    The logical name BIN also needs to be defined
+			    here, otherwise the CRTL replaces it with
+			    SYS$SYSTEM:
+
+			    Never set the POSIX UID here, it will break
+			    every reference to a GID/UID on systems that
+			    do not have every VMS account mapped to a UID/GID
+			    by TCPIP services.
+
+			    Reformat text to fit 80 columns.
+
+			    Remove all VAX C specific code.
+
+			    Linker is probably using exact case, so public
+			    symbols for LIB$* and SYS$* must be in upper case.
+
+ 2-002	J. Malmberg	Support for VAX builds.  OpenVMS/VAX does not have the
+	17-Jun-2010	DECC$FEATURE routines.  At this time I will not
+			be concerned if a feature setting exists on VAX,
+			as all we are doing is setting a logical name.
+
+ 2-003	J. Malmberg	Add DECC$FILENAME_UNIX_NOVERSION as version numbers
+			will usually mess up ported programs.
+
+*/
+
+#include <stdio.h>
+#include <descrip.h>
+#include <lnmdef.h>
+#include <stsdef.h>
+#include <string.h>
+
+#pragma message disable pragma
+#pragma message disable dollarid
+#pragma message disable valuepres
+
+#pragma member_alignment save
+#pragma nomember_alignment longword
+#pragma message save
+#pragma message disable misalgndmem
+struct itmlst_3 {
+  unsigned short int buflen;
+  unsigned short int itmcode;
+  void *bufadr;
+  unsigned short int *retlen;
+};
+#pragma message restore
+#pragma member_alignment restore
+
+#ifdef __VAX
+#define ENABLE "ENABLE"
+#define DISABLE "DISABLE"
+#else
+
+#define ENABLE TRUE
+#define DISABLE 0
+int   decc$feature_get_index (const char *name);
+int   decc$feature_set_value (int index, int mode, int value);
+
+#endif
+
+int   SYS$TRNLNM(
+	const unsigned long * attr,
+	const struct dsc$descriptor_s * table_dsc,
+	struct dsc$descriptor_s * name_dsc,
+	const unsigned char * acmode,
+	const struct itmlst_3 * item_list);
+int   SYS$CRELNM(
+	const unsigned long * attr,
+	const struct dsc$descriptor_s * table_dsc,
+	const struct dsc$descriptor_s * name_dsc,
+	const unsigned char * acmode,
+	const struct itmlst_3 * item_list);
+int   LIB$SIGNAL(int);
+
+/* Take all the fun out of simply looking up a logical name */
+static int sys_trnlnm
+   (const char * logname,
+    char * value,
+    int value_len)
+{
+    const $DESCRIPTOR(table_dsc, "LNM$FILE_DEV");
+    const unsigned long attr = LNM$M_CASE_BLIND;
+    struct dsc$descriptor_s name_dsc;
+    int status;
+    unsigned short result;
+    struct itmlst_3 itlst[2];
+
+    itlst[0].buflen = value_len;
+    itlst[0].itmcode = LNM$_STRING;
+    itlst[0].bufadr = value;
+    itlst[0].retlen = &result;
+
+    itlst[1].buflen = 0;
+    itlst[1].itmcode = 0;
+
+    name_dsc.dsc$w_length = strlen(logname);
+    name_dsc.dsc$a_pointer = (char *)logname;
+    name_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+    name_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+    status = SYS$TRNLNM(&attr, &table_dsc, &name_dsc, 0, itlst);
+
+    if ($VMS_STATUS_SUCCESS(status)) {
+
+	 /* Null terminate and return the string */
+	/*--------------------------------------*/
+	value[result] = '\0';
+    }
+
+    return status;
+}
+
+/* How to simply create a logical name */
+static int sys_crelnm
+   (const char * logname,
+    const char * value)
+{
+    int ret_val;
+    const char * proc_table = "LNM$PROCESS_TABLE";
+    struct dsc$descriptor_s proc_table_dsc;
+    struct dsc$descriptor_s logname_dsc;
+    struct itmlst_3 item_list[2];
+
+    proc_table_dsc.dsc$a_pointer = (char *) proc_table;
+    proc_table_dsc.dsc$w_length = strlen(proc_table);
+    proc_table_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+    proc_table_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+    logname_dsc.dsc$a_pointer = (char *) logname;
+    logname_dsc.dsc$w_length = strlen(logname);
+    logname_dsc.dsc$b_dtype = DSC$K_DTYPE_T;
+    logname_dsc.dsc$b_class = DSC$K_CLASS_S;
+
+    item_list[0].buflen = strlen(value);
+    item_list[0].itmcode = LNM$_STRING;
+    item_list[0].bufadr = (char *)value;
+    item_list[0].retlen = NULL;
+
+    item_list[1].buflen = 0;
+    item_list[1].itmcode = 0;
+
+    ret_val = SYS$CRELNM(NULL, &proc_table_dsc, &logname_dsc, NULL, item_list);
+
+    return ret_val;
+}
+
+
+ /* Start of DECC RTL Feature handling */
+
+/*
+** Sets default value for a feature
+*/
+#ifdef __VAX
+static void set_feature_default(const char *name, const char *value)
+{
+    sys_crelnm(name, value);
+}
+#else
+static void set_feature_default(const char *name, int value)
+{
+     int index;
+
+     index = decc$feature_get_index(name);
+
+     if (index > 0)
+	decc$feature_set_value (index, 0, value);
+}
+#endif
+
+static void set_coe ( void )
+{
+
+    char gnv_posix_root[4096];
+    char unix_shell_name[255];
+    int use_unix_settings = 0;
+    int status;
+    int gnv_posix_root_found = 0;
+
+    /* If this is compiled for use with a UNIX shell, then the logical
+     * name GNV$UNIX_SHELL will be set to that shell name.
+     *
+     * Else, if the GNV$UNIX_SHELL logical name is set, then this application
+     * is running under some UNIX like shell, so it should modify it's
+     * behavior to be UNIX like.
+     *
+     * If the above logical name is not set, then the application should
+     * expect that it is running under DCL, and should expect VMS filenames
+     * on input, and may need to output filenames in VMS format.
+     *
+     * This can be overriden at compile time with GNV_UNIX_TOOL being
+     * defined.
+     *
+     * So this means that there will be multiple object modules from this
+     * source module.  One for each shell, one for programs that can function
+     * in both DCL and UNIX environments, and one for programs that require
+     * a UNIX environment.
+     */
+
+#ifdef GNV_UNIX_SHELL
+    use_unix_settings = 1;
+
+    status = sys_crelnm("GNV$UNIX_SHELL", GNV_UNIX_SHELL);
+    if (!$VMS_STATUS_SUCCESS(status)) {
+	/* We have a big problem */
+	LIB$SIGNAL(status);
+    }
+#else
+
+#ifdef GNV_UNIX_TOOL
+    use_unix_settings = 1;
+#else
+    status = sys_trnlnm("GNV$UNIX_SHELL",
+			unix_shell_name, sizeof
+			unix_shell_name -1);
+    if (!$VMS_STATUS_SUCCESS(status)) {
+	unix_shell_name[0] = 0;
+	use_unix_settings = 0;
+    }
+#endif /* GNV_UNIX_TOOL */
+
+#endif /* GNV_UNIX_SHELL */
+
+    /* New style interface that works only on very recent
+       (Apr 2001 and beyond) CRTLs */
+
+    /*
+     * Only setting defaults allows logical names to
+     * override these settings.
+     */
+
+    /* Always set */
+
+    /* ACCESS should check ACLs or it is lying. */
+    set_feature_default("DECC$ACL_ACCESS_CHECK"		, ENABLE);
+
+    /* We always want the new parse style */
+    set_feature_default ("DECC$ARGV_PARSE_STYLE"	, ENABLE);
+
+    /* Unless we are in POSIX compliant mode, we want the old POSIX root
+     * enabled.
+     */
+    set_feature_default("DECC$DISABLE_POSIX_ROOT", DISABLE);
+
+    /* EFS charset, means UTF-8 support */
+    /* VTF-7 support is controlled by a feature setting called UTF8 */
+    set_feature_default ("DECC$EFS_CHARSET" 		, ENABLE);
+    set_feature_default ("DECC$EFS_CASE_PRESERVE"	, ENABLE);
+
+
+    /* Support timestamps when available */
+    set_feature_default ("DECC$EFS_FILE_TIMESTAMPS"	, ENABLE);
+
+    /* Cache environment varibles - performance improvements */
+    set_feature_default ("DECC$ENABLE_GETENV_CACHE"	, ENABLE);
+
+    /* Start out with new file attribute inheritance */
+#ifdef __VAX
+    set_feature_default ("DECC$EXEC_FILEATTR_INHERITANCE", "2");
+#else
+    set_feature_default ("DECC$EXEC_FILEATTR_INHERITANCE", 2);
+#endif
+
+    /* Don't display trailing dot after files without type */
+    set_feature_default ("DECC$READDIR_DROPDOTNOTYPE"	, ENABLE);
+
+    /* For standard output channels buffer output until terminator */
+    /* Gets rid of output logs with single character lines in them. */
+    set_feature_default ("DECC$STDIO_CTX_EOL"		, ENABLE);
+
+    /* Fix mv aa.bb aa						*/
+    set_feature_default ("DECC$RENAME_NO_INHERIT"  	, ENABLE);
+
+    if (use_unix_settings) {
+
+	/* POSIX requires that open files be able to be removed */
+	set_feature_default ("DECC$ALLOW_REMOVE_OPEN_FILES", ENABLE);
+
+	set_feature_default ("DECC$FILENAME_UNIX_ONLY"	, ENABLE);
+		/* FILENAME_UNIX_ONLY Implicitly sets
+		  decc$disable_to_vms_logname_translation */
+
+	set_feature_default ("DECC$FILE_PERMISSION_UNIX", ENABLE);
+
+	/* For now this only with UNIX mode, applications can override
+	 * with out using a LIB$INITIALIZE setting.
+	 * This should be an application specific setting only enabled
+	 * if the application requires it.
+	 * Left here for now for backwards compatibility
+         */
+	set_feature_default ("DECC$FILE_SHARING"	, ENABLE);
+
+        set_feature_default ("DECC$FILE_OWNER_UNIX"  	, ENABLE);
+        set_feature_default ("DECC$POSIX_SEEK_STREAM_FILE", ENABLE);
+
+    } else {
+	 set_feature_default("DECC$FILENAME_UNIX_REPORT", ENABLE);
+    }
+
+    /* When reporting UNIX filenames, glob the same way */
+    set_feature_default ("DECC$GLOB_UNIX_STYLE"	, ENABLE);
+
+    /* The VMS version numbers on Unix filenames is incompatible with most */
+    /* ported packages. */
+    set_feature_default("DECC$FILENAME_UNIX_NO_VERSION", ENABLE);
+
+    /* The VMS version numbers on Unix filenames is incompatible with most */
+    /* ported packages. */
+    set_feature_default("DECC$UNIX_PATH_BEFORE_LOGNAME", ENABLE);
+
+    /* Set strtol to proper behavior */
+    set_feature_default("DECC$STRTOL_ERANGE", ENABLE);
+
+    /*  Pipe feature settings are longer needed with virtual memory pipe
+	code.  Programs that use  pipe need to be converted to use the
+	virtual memory pipe code, which effectively removes the hangs and
+	left over temporary files.
+
+        Comment left here to prevent regressions, as the larger pipe size
+        actually hurts memory usage with the new algorithm.
+     */
+    /* do_not_set_default ("DECC$PIPE_BUFFER_SIZE"	, 8192); */
+
+
+    /* Rather than remove this completely, a comment is left here to warn
+     * someone from putting this bug back in.
+     *
+     * POSIX style UIDs require that the system administrator have set the
+     * system up to use POSIX style UIDs and GIDs.  And if they have done
+     * so, then they should set the DECC$POSIX_STYLE_UID as a system wide
+     * logical name.
+     *
+     * Setting them in a program will break all routines that expect GID/UID
+     * stuff to work on systems set up by default with out mappings.
+     *
+     * Most utilities do not reference GID/UID values, so it took a while for
+     * this bug to surface.
+     */
+     /*  do_not_set_default ("DECC$POSIX_STYLE_UID"	, TRUE); */
+
+
+
+    /* GNV depends on SYS$POSIX_ROOT to be properly set.  Since SYS$POSIX_ROOT
+     * globally affects all C applications, SYS$POSIX_ROOT can not be set
+     * anywhere that can be seen by other applications.
+     *
+     * So GNV$GNU is used instead, and SYS$POSIX_ROOT will be set in
+     * in the process table in user mode to that value.
+     *
+     * Restriction: The system manager should not point GNV$GNU at
+     * SYS$POSIX_ROOT, or anything that resolves to SYS$POSIX_ROOT.
+     *
+     */
+
+    status = sys_trnlnm("GNV$GNU",
+			gnv_posix_root,
+			sizeof gnv_posix_root - 1);
+    if ($VMS_STATUS_SUCCESS(status)) {
+	status = sys_crelnm("SYS$POSIX_ROOT", "GNV$GNU:");
+	gnv_posix_root_found = 1;
+    }
+
+    /* GNV depends on BIN being set to GNV$GNU:[bin].  Since BIN
+     * is not prefixed, and it affects everything globally, it needs to
+     * be set here if it is not defined already.
+     * If it is set already, assume that it is correct, rather than
+     * trying to second guess the user.
+     * If GNV$GNU is not defined, then define bin to be SYS$POSIX_ROOT.
+     */
+
+    status = sys_trnlnm("BIN",
+			gnv_posix_root,
+			sizeof gnv_posix_root - 1);
+    if (!$VMS_STATUS_SUCCESS(status)) {
+	if (gnv_posix_root_found) {
+	    status = sys_crelnm("BIN", "GNV$GNU:[BIN]");
+	} else {
+	    status = sys_crelnm("BIN", "SYS$POSIX_ROOT:[BIN]");
+	}
+    }
+
+}
+
+#pragma nostandard
+#pragma extern_model save
+#ifdef __VAX
+#pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long, nopic
+#else
+#pragma extern_model strict_refdef "LIB$INITIALIZE" nowrt, long
+#    if __INITIAL_POINTER_SIZE
+#        pragma __pointer_size __save
+#        pragma __pointer_size 32
+#    else
+#        pragma __required_pointer_size __save
+#        pragma __required_pointer_size 32
+#    endif
+#endif
+/* Set our contribution to the LIB$INITIALIZE array */
+void (* const iniarray[])(void) = {set_coe, } ;
+#ifndef __VAX
+#    if __INITIAL_POINTER_SIZE
+#        pragma __pointer_size __restore
+#    else
+#        pragma __required_pointer_size __restore
+#    endif
+#endif
+
+
+/*
+** Force a reference to LIB$INITIALIZE to ensure it
+** exists in the image.
+*/
+int LIB$INITIALIZE(void);
+#ifdef __DECC
+#pragma extern_model strict_refdef
+#endif
+    int lib_init_ref = (int) LIB$INITIALIZE;
+#ifdef __DECC
+#pragma extern_model restore
+#pragma standard
+#endif
diff --git a/gawk-5.0.1/vms/vms_fwrite.c b/gawk-5.0.1/vms/vms_fwrite.c
new file mode 100644
index 00000000000..644f62d2687
--- /dev/null
+++ b/gawk-5.0.1/vms/vms_fwrite.c
@@ -0,0 +1,219 @@
+/* vms_fwrite.c - augmentation for the fwrite() function.
+
+   Copyright (C) 1991-1996, 2010, 2011, 2014, 2016
+   the Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#include "awk.h"	/* really "../awk.h" */
+
+#ifndef NO_TTY_FWRITE
+#include "vms.h"
+#include <stdio.h>
+#include <errno.h>
+
+#ifdef VAXC_BUILTINS
+#pragma builtins		/* VAXC V3.0 & up */
+# define find_c(s,n,c) ((n) - _LOCC((c),(n),(s)))
+#else	/*VAXC_BUILTINS*/
+static int find_c( const char *s, int n, char c ) {
+    register const char *t = (const char *)memchr(s, c, n);
+    return (t == 0 ? n : t - s);	/* 0..n-1, or n if not found */
+}
+#endif	/*VAXC_BUILTINS*/
+#define is_stdout(file_no) ((file_no) == 1)	/* fileno(stdout) */
+#define is_stderr(file_no) ((file_no) == 2)	/* fileno(stderr) */
+
+#define PREFIX_CR  0x008D0000	/* leading carriage return */
+#define POSTFIX_CR 0x8D000000	/* trailing carriage return (=> lf/cr) */
+
+static short  channel[_NFILE] = {0};
+static FILE  *prev_file = 0;
+static int    prev_file_num;
+
+    /*
+     * VAXCRTL's fwrite() seems to flush after every character when
+     * writing to a terminal.  This routine is a limited functionality
+     * substitute that is *much* faster.  However, calls to fwrite()
+     * should not be mixed with other stdio calls to the same file
+     * unless fflush() is always called first.	Also, this routine
+     * will not detect that a freopen() call has finished with the
+     * original terminal; tty_fclose() should be used to close a file.
+     *
+     * When running gawk's debugging version we stick with normal
+     * fwrite because dgawk also uses other stdio calls for output.
+     */
+#ifdef fwrite
+# undef fwrite
+#endif
+/* tty_fwrite() - performance hack for fwrite() to a terminal */
+size_t
+tty_fwrite( const void *buf, size_t size, size_t number, FILE *file )
+{
+    static long evfn = -1;
+    short chan;
+    int file_num, result;
+
+    if (!size || !number)
+	return 0;
+    else if (!file || !*file)
+	return 0 * (errno = EBADF);	/* kludge alert! */
+    else if (file == prev_file)
+	file_num = prev_file_num;
+    else	/* note: VAXCRTL's fileno() is a function, not just a macro */
+	prev_file_num = file_num = fileno(file),  prev_file = file;
+
+    chan = file_num < _NFILE ? channel[file_num] : -1;
+    if (chan == 0) {	/* if not initialized, need to assign a channel */
+	if (isatty(file_num) > 0	/* isatty: 1=yes, 0=no, -1=problem */
+	    && ! do_debug) {
+	    struct dsc$descriptor_s  device;
+	    char devnam[255+1];
+
+	    fgetname(file, devnam);			/* get 'file's name */
+            /* create descriptor */
+	    device.dsc$w_length = strlen(device.dsc$a_pointer = devnam);
+            device.dsc$b_dtype = DSC$K_DTYPE_T;
+            device.dsc$b_class = DSC$K_CLASS_S;
+	    if (vmswork(SYS$ASSIGN(&device, &chan, 0,
+                                  (struct dsc$descriptor_s *)0))) {
+		/* get an event flag; use #0 if problem */
+		if (evfn == -1 && vmsfail(LIB$GET_EF(&evfn)))  evfn = 0;
+	    } else  chan = 0;	    /* $ASSIGN failed */
+	}
+	/* store channel for later use; -1 => don't repeat failed init attempt */
+	channel[file_num] = (chan > 0 ? chan : -1);
+    }
+
+    /* chan > 0 iff 'file' is a terminal and we're not running as dgawk */
+    if (chan > 0) {
+	struct _iosbw { U_Short status, count; U_Long rt_kludge; } iosb;
+	register U_Long sts = 1;
+	register char  *pt = (char *)buf;
+	register int	offset, pos, count = size * number;
+	U_Long cc_fmt, io_func = IO$_WRITEVBLK;
+	int    extra = 0;
+
+	result = 0;
+	if (is_stderr(file_num))	/* if it's SYS$ERROR (stderr)... */
+	    io_func |= IO$M_CANCTRLO;	/* cancel ^O (resume tty output) */
+	while (count > 0) {
+	    /* special handling for line-feeds to make them be 'newlines' */
+	    offset = 0;
+	    if (*pt == '\n') {	    /* got at least one leading line-feed */
+		cc_fmt = PREFIX_CR,  extra++;	/* precede 1st LF with a CR */
+		do  offset++;
+		    while (offset < count && *(pt + offset) == '\n');
+	    } else
+		cc_fmt = 0;
+	    /* look for another line-feed; if found, break line there */
+	    pos = offset + find_c(pt + offset, count - offset, '\n');
+	    if (pos >= BUFSIZ)	pos = BUFSIZ - 1;   /* throttle quota usage */
+	    else if (pos < count)  pos++,  cc_fmt |= POSTFIX_CR,  extra++;
+	    /* wait for previous write, if any, to complete */
+	    if (pt > (char *)buf) {
+		sts = SYS$SYNCH(evfn, &iosb);
+		if (vmswork(sts))  sts = iosb.status,  result += iosb.count;
+		if (vmsfail(sts))  break;
+	    }
+	    /* queue an asynchronous write */
+	    sts = SYS$QIO(evfn, chan, io_func, &iosb, (void (*)(U_Long))0, 0L,
+			  pt, pos, 0, cc_fmt, 0, 0);
+	    if (vmsfail(sts))  break;	/*(should never happen)*/
+	    pt += pos,	count -= pos;
+	}
+	/* wait for last write to complete */
+	if (pt > (char *)buf && vmswork(sts)) {
+	    sts = SYS$SYNCH(evfn, &iosb);
+	    if (vmswork(sts))  sts = iosb.status,  result += iosb.count;
+	}
+	if (vmsfail(sts))  errno = EVMSERR,  vaxc$errno = sts;
+	else if (iosb.rt_kludge == 0)  result = number + extra;
+	result -= extra;    /* subtract the additional carriage-returns */
+    } else {				/* use stdio */
+	/* Note: we assume that we're writing text, not binary data.
+	   For stream format files, 'size' and 'number' are effectively
+	   interchangable, and fwrite works fine.  However, for record
+	   format files, 'size' governs the maximum record length, so
+		fwrite(string, size(char), strlen(string), file)
+	   will produce a sequence of 1-byte records, which is hardly
+	   what we want in this (assumed) situation.  Line-feeds ('\n')
+	   are converted into newlines (ie, record separators) by the
+	   run-time library, but strings that don't end with a newline
+	   still become separate records.  The simplest work around
+	   is just to use fputs() instead of fwrite(); unfortunately,
+	   we have to provide special treatment for NULs ('\0's).
+	   At present, only stdout might be in record format (via
+	   >$'filename' redirection on the command line).
+	*/
+	if (size > 1) {		/* not used by GAWK */
+	    result = fwrite((void *)buf, size, number, file);
+	} else if (*((char *)buf + number - 1) == '\n' || !is_stdout(file_num)) {
+	    result = fwrite((void *)buf, number, size, file);
+	    result = result * number / size;	/*(same as 'result = number')*/
+	} else {
+#ifdef NO_ALLOCA
+# define alloca(n) ((n) <= abuf_siz ? abuf : \
+		    ((abuf_siz > 0 ? (free(abuf),0) : 0), \
+		     (abuf = malloc(abuf_siz = (n)+20))))
+	    static void *abuf = 0;
+	    static size_t abuf_siz = 0;
+#endif /*NO_ALLOCA*/
+	    register char *pt = (char *)buf;
+	    register int   pos,  count = number;
+
+	    if (pt[count] != '\0') {	/*(out of bounds, but relatively safe)*/
+		pt = (char *)alloca(count + 1);
+		memcpy(pt, buf, count),  pt[count] = '\0';
+		/* if exiting this block undoes the alloca(), we're hosed :-( */
+	    }
+	    result = 0;
+	    while (count > 0) {
+		pos = find_c(pt, count, '\0');
+		if (fputs(pt, file) < 0)  break;
+		if (pos < count) {
+		    if (fputc('\0', file) < 0)	break;
+		    pos++;		/* 0..n-1 -> 1..n */
+		}
+		result += pos,	pt += pos,  count -= pos;
+	    }
+	}
+    }
+    return result;
+}
+#define fwrite(b,s,n,f) tty_fwrite((b),(s),(n),(f))
+
+#ifdef fclose
+# undef fclose
+#endif
+/* tty_fclose() - keep tty_fwrite() up to date when closing a file */
+int
+tty_fclose( FILE *file )
+{
+    if (file && *file) {  /* note: VAXCRTL stdio has extra level of indirection */
+	int   file_num = fileno(file);
+	short chan = file_num < _NFILE ? channel[file_num] : -1;
+
+	if (chan > 0)
+	    (void)SYS$DASSGN(chan); /* deassign the channel (ie, close) */
+	if (file_num < _NFILE)
+	    channel[file_num] = 0;  /* clear stale info */
+    }
+    prev_file = 0;		    /* force tty_fwrite() to reset */
+    return fclose(file);
+}
+#define fclose(f) tty_fclose(f)
+
+#endif	/*!NO_TTY_FWRITE*/
diff --git a/gawk-5.0.1/vms/vms_gawk.c b/gawk-5.0.1/vms/vms_gawk.c
new file mode 100644
index 00000000000..0caab21fabf
--- /dev/null
+++ b/gawk-5.0.1/vms/vms_gawk.c
@@ -0,0 +1,290 @@
+/* vms_gawk.c -- parse GAWK command line using DCL syntax
+
+   Copyright (C) 1991-1993, 1996, 2003, 2005, 2011, 2014
+   the Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+
+/*
+ * vms_gawk.c - routines to parse the command line as a native DCL command
+ *	       rather than as a foreign command string.
+ *							Pat Rankin, Nov'89
+ *						[ revised for 2.12, May'91 ]
+ *						[ revised for 4.0.0, Feb'11 ]
+ */
+
+#include "awk.h"
+#include "vms.h"
+
+#define USAGE_PROG_RQRD 1
+#define USAGE_FILE_RQRD 2
+#define USAGE_BAD_COMBO 3
+#define USAGE_RUN_CMD	4
+#define STS$M_INHIB_MSG 0x10000000
+
+#define Present(arg)		vmswork(Cli_Present(arg))
+#define Get_Value(arg,buf,siz)	vmswork(Cli_Get_Value(arg,buf,siz))
+
+#ifndef __DECC
+extern void   GAWK_CMD();	/* created with $ SET COMMAND/OBJECT */
+#define gawk_cmd ((const void *)GAWK_CMD) */
+#else	/* Use ANSI definitions for DEC C */
+#pragma extern_model save
+#pragma extern_model strict_refdef
+/* (could use globalvalue rather than _refdef if we omit GAWK_CMD's `&') */
+extern void  *GAWK_CMD;
+#pragma extern_model restore
+#define gawk_cmd ((const void *)&GAWK_CMD)
+#endif
+extern void   _exit(int);
+static int    vms_usage(int);
+
+static const char *CmdName = "GAWK";
+
+#define ARG_SIZ 250
+union arg_w_prefix {	/* structure used to simplify prepending of "-" */
+    char     value[2+ARG_SIZ+1];
+    struct {
+	char prefix[2];		/* for "-?" */
+	char buf[ARG_SIZ];
+	char suffix[1];		/* room for '\0' */
+    } arg;
+};
+
+#define chk_option(qualifier,optname)	\
+    if (Present(qualifier))	\
+	strcat(strcat(buf.arg.buf, W_cnt++ ? "," : ""), optname)
+
+
+/* vms_gawk() - parse GAWK command line using DCL and convert it into the */
+/*	       appropriate "-arg" values for compatability with GNU code  */
+int
+vms_gawk()
+{
+    U_Long sts;
+    union arg_w_prefix buf;
+    char misc_args[10], *misc_argp;
+    int  argc, W_cnt;
+    int native_dcl = 1,	/* assume true until we know otherwise */
+	short_circ;	/* some options make P1, /commands, /input superfluous */
+
+    /* check "GAWK_P1"--it's required; its presence will tip us off */
+    sts = Cli_Present("GAWK_P1");
+    if (CondVal(sts) == CondVal(CLI$_SYNTAX)) {
+	native_dcl = 0;		/* not invoked via a native command verb */
+	/* syntax error indicates that we weren't invoked as a native DCL
+	   command, so we'll now attempt to generate a command from the
+	   foreign command string and parse that.
+	*/
+	sts = Cli_Parse_Command(gawk_cmd, "GAWK");	/* (*not* CmdName) */
+	if (vmswork(sts))
+	    sts = Cli_Present("GAWK_P1");
+    }
+    short_circ = Present("USAGE") || Present("VERSION") || Present("COPYRIGHT");
+    if (vmswork(sts))		/* command parsed successfully */
+	v_add_arg(argc = 0, CmdName);	/* save "GAWK" as argv[0] */
+    else if (CondVal(sts) == CondVal(CLI$_INSFPRM))
+	/* vms_usage() will handle /usage, /version, and /copyright */
+	return short_circ ? vms_usage(0)
+		: native_dcl ? vms_usage(USAGE_FILE_RQRD) : 0; /* insufficient parameters */
+    else if (CondVal(sts) == CondVal(CLI$_CONFLICT))
+	return vms_usage(USAGE_BAD_COMBO);  /* conflicting qualifiers (/input+/command) */
+#if 0	/* 3.1.2: removed since this can't distinguish RUN vs fork+exec */
+    else if (CondVal(sts) == CondVal(CLI$_RUNUSED))
+	return vms_usage(USAGE_RUN_CMD);    /* RUN GAWK won't work (no command line) */
+#endif
+    else
+	return 0;	/* forced to rely on original parsing */
+
+    if (short_circ)		/* give usage message & quit or have main() */
+	return vms_usage(0);	/* give --version or --copyleft mesg & quit */
+    else if (! (Present("PROGRAM") || Present("PROGFILE")) )
+	return native_dcl ? vms_usage(USAGE_PROG_RQRD) : 0; /* missing required option */
+
+    misc_argp = misc_args;
+    *misc_argp++ = '-';		/* now points at &misc_args[1] */
+    if (Present("OPTIMIZE"))
+	*misc_argp++ = 'O';
+    W_cnt = 0,	buf.arg.buf[0] = '\0';
+    strncpy(buf.arg.prefix, "-W", 2);
+    if (Present("LINT")) {
+	if (!Present("LINT.FATAL") && !Present("LINT.INVALID"))
+	    chk_option("LINT.WARN", "lint");
+	chk_option("LINT.FATAL", "lint=fatal");
+	chk_option("LINT.INVALID", "lint=invalid");
+	chk_option("LINT.OLD", "lint-old");	/* distinct option */
+    }
+    chk_option("POSIX", "posix");
+    if (CondVal(Cli_Present("TRADITIONAL")) != CondVal(CLI$_NEGATED))
+	chk_option("STRICT", "traditional");  /* /strict is synonym for /traditional */
+    if (CondVal(Cli_Present("STRICT")) != CondVal(CLI$_NEGATED))
+	chk_option("TRADITIONAL", "traditional");
+    chk_option("RE_INTERVAL", "re-interval");  /* only used with /traditional */
+    chk_option("SANDBOX", "sandbox");
+    /* potentially a problem due to leading "NO" */
+    chk_option("NON_DECIMAL_DATA", "non-decimal-data");
+    /* note: locale and translation stuff is not supported by vms gawk */
+    chk_option("CHARACTERS_AS_BYTES", "characters-as-bytes");
+    chk_option("USE_LC_NUMERIC", "use-lc-numeric");
+    chk_option("GEN_POT", "gen-pot");
+# if 0
+    /* /copyright and /version don't reach here anymore (short_circ above) */
+    chk_option("COPYRIGHT", "copyright");	/* --copyleft */
+    chk_option("VERSION", "version");
+# endif
+    if (W_cnt > 0)			/* got something */
+	v_add_arg(++argc, strdup(buf.value));
+
+#ifdef DEBUG /* most debugging functionality moved to separate DGAWK program */
+    if (Present("DEBUG"))
+	    *misc_argp++ = 'Y';		/* --parsedebug */
+#endif
+    *misc_argp = '\0';		/* terminate misc_args[] */
+    if (misc_argp > &misc_args[1])	/* got something */
+	v_add_arg(++argc, misc_args);	/* store it/them */
+
+    if (Present("PROFILE")) {	    /* /profile[=file] */
+	strncpy(buf.arg.prefix, "-p", 2);
+	if (Get_Value("PROFILE", buf.arg.buf, sizeof buf.arg.buf))
+	    v_add_arg(++argc, strdup(buf.value));
+    }
+    if (Present("DUMP_VARIABLES")) { /* /dump_variables[=file] */
+	strncpy(buf.arg.prefix, "-d", 2);
+	if (Get_Value("DUMP_VARIABLES", buf.arg.buf, sizeof buf.arg.buf))
+	    v_add_arg(++argc, strdup(buf.value));
+    }
+    if (Present("FIELD_SEP")) {     /* field separator */
+	strncpy(buf.arg.prefix, "-F", 2);
+	if (Get_Value("FIELD_SEP", buf.arg.buf, sizeof buf.arg.buf))
+	    v_add_arg(++argc, strdup(buf.value));
+    }
+    if (Present("VARIABLES")) {     /* variables to init prior to BEGIN */
+	strncpy(buf.arg.prefix, "-v", 2);
+	while (Get_Value("VARIABLES", buf.arg.buf, sizeof buf.arg.buf))
+	    v_add_arg(++argc, strdup(buf.value));
+    }
+    /* the relative order of -e and -f args matters; unfortunately,
+       we're losing that here... */
+    if (Present("MOREPROG")) {	    /* /extra_input=text -> -e text */
+	strncpy(buf.arg.prefix, "-e", 2);
+	if (Get_Value("MOREPROG", buf.arg.buf, sizeof buf.arg.buf))
+	    v_add_arg(++argc, strdup(buf.value));
+    }
+    if (Present("PROGFILE")) {	    /* program files, /input=file -> -f file */
+	strncpy(buf.arg.prefix, "-f", 2);
+	while (Get_Value("PROGFILE", buf.arg.buf, sizeof buf.arg.buf))
+	    v_add_arg(++argc, strdup(buf.value));
+	v_add_arg(++argc, "--");
+    } else if (Present("PROGRAM")) {	/* program text, /commands -> 'text' */
+	v_add_arg(++argc, "--");
+	if (Get_Value("PROGRAM", buf.value, sizeof buf.value))
+	    v_add_arg(++argc, strdup(buf.value));
+    }
+
+    /* we know that "GAWK_P1" is present [data files and/or 'var=value'] */
+    while (Get_Value("GAWK_P1", buf.value, sizeof buf.value))
+	v_add_arg(++argc, strdup(buf.value));
+
+    if (Present("OUTPUT")) {	/* let other parser treat this as 'stdout' */
+	strncpy(buf.arg.prefix, ">$", 2);
+	if (Get_Value("OUTPUT", buf.arg.buf, sizeof buf.arg.buf))
+	    v_add_arg(++argc, strdup(buf.value));
+    }
+
+    return ++argc;		/*(increment to account for arg[0])*/
+}
+
+/* vms_usage() - display one or more messages and then terminate */
+static int	/* note: usually doesn't return */
+vms_usage( int complaint )
+{
+    static const char
+	*usage_txt = "\n\
+usage: %s /COMMANDS=\"awk program text\"  data_file[,data_file,...] \n\
+   or  %s /INPUT=awk_file  data_file[,\"Var=value\",data_file,...] \n\
+   or  %s /INPUT=(awk_file1,awk_file2,...)  data_file[,...] \n\
+   or  %s /INPUT=awk_file /EXTRA_COMMANDS=\"program text\" data_file \n\
+",
+    *options_txt = "\n\
+options: /FIELD_SEPARATOR=\"FS_value\" \n\
+   and   /VARIABLES=(\"Var1=value1\",\"Var2=value2\",...) \n\
+   and   /OPTIMIZE  /PROFILE[=file]  /DUMP_VARIABLES[=file] \n\
+   and   /POSIX  /[NO]TRADITIONAL  /[NO]STRICT  /RE_INTERVAL \n\
+   and   /SANDBOX  /NON_DECIMAL_DATA \n\
+   and   /LINT[=WARN]  or  /LINT=OLD  or  /LINT=FATAL \n\
+   and   /VERSION  /COPYRIGHT  /USAGE \n\
+   and   /OUTPUT=out_file \n\
+",  /* omitted: /LINT=INVALID /CHARACTERS_AS_BYTES /USE_LC_NUMERIC /GEN_POT */
+	*no_prog = "missing required element: /COMMANDS or /INPUT",
+	*no_file = "missing required element: data_file \n\
+       (use \"SYS$INPUT:\" to read data lines from the terminal)",
+	*bad_combo = "invalid combination of qualifiers \n\
+       (/INPUT=awk_file and /COMMANDS=\"awk program\" are mutually exclusive)",
+	*run_used = "\"RUN\" was used; required command components missing";
+    int status, argc;
+
+    /* presence of /usage, /version, or /copyright for feedback+quit
+       supersedes absence of required program or data file */
+    if (Present("USAGE")) {
+	complaint = 0;			/* clean exit */
+    } else if (Present("VERSION") || Present("COPYRIGHT")) {
+	/* construct a truncated Unix-style command line to control main() */
+	v_add_arg(argc=0, CmdName);	/* save "GAWK" as argv[0] */
+#if 0
+	v_add_arg(++argc, Present("VERSION") ? "-V" : "-C");
+#else
+	v_add_arg(++argc, "-W");
+	v_add_arg(++argc, Present("VERSION") ? "version" : "copyright");
+#endif
+	/* kludge to suppress 'usage' message from main() */
+	v_add_arg(++argc, "--");		/* no more arguments */
+	v_add_arg(++argc, "{}");		/* dummy program text */
+	v_add_arg(++argc, "NL:");		/* dummy input file */
+	return ++argc;			/* count argv[0] too */
+    }
+
+    fflush(stdout);
+    switch (complaint) {
+      case USAGE_PROG_RQRD:
+	fprintf(stderr, "\n%%%s-W-%s, %s \n", CmdName, "PROG_RQRD", no_prog);
+	status = CLI$_VALREQ | STS$M_INHIB_MSG;
+	break;
+      case USAGE_FILE_RQRD:
+	fprintf(stderr, "\n%%%s-W-%s, %s \n", CmdName, "FILE_RQRD", no_file);
+	status = CLI$_INSFPRM | STS$M_INHIB_MSG;
+	break;
+      case USAGE_BAD_COMBO:
+	fprintf(stderr, "\n%%%s-W-%s, %s \n", CmdName, "BAD_COMBO", bad_combo);
+	status = CLI$_CONFLICT | STS$M_INHIB_MSG;
+	break;
+      case USAGE_RUN_CMD:
+	fprintf(stderr, "\n%%%s-W-%s, %s \n", CmdName, "RUN_CMD", run_used);
+	status = CLI$_NOOPTPRS | STS$M_INHIB_MSG;
+	break;
+      default:
+	status = 1;
+	break;
+    }
+    fprintf(stderr, usage_txt, CmdName, CmdName, CmdName, CmdName);
+    fprintf(stderr, options_txt);
+    fflush(stderr);
+
+    errno = EVMSERR;
+    vaxc$errno = status;
+    _exit(status);
+    /* NOTREACHED */
+    return 0;
+}
diff --git a/gawk-5.0.1/vms/vms_misc.c b/gawk-5.0.1/vms/vms_misc.c
new file mode 100644
index 00000000000..e561af59a71
--- /dev/null
+++ b/gawk-5.0.1/vms/vms_misc.c
@@ -0,0 +1,376 @@
+/* vms_misc.c -- sustitute code for missing/different run-time library routines.
+
+   Copyright (C) 1991-1993, 1996-1997, 2001, 2003, 2009, 2010, 2011, 2014
+   the Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#define creat creat_dummy	/* one of gcc-vms's headers has bad prototype */
+#include "awk.h"
+#include "vms.h"
+#undef creat
+#include <fab.h>
+#ifndef O_RDONLY
+#include <fcntl.h>
+#endif
+#include <rmsdef.h>
+#include <ssdef.h>
+#include <stsdef.h>
+
+    /*
+     * In VMS's VAXCRTL, strerror() takes an optional second argument.
+     *  #define strerror(errnum) strerror(errnum,vaxc$errno)
+     * is all that's needed, but VAXC can't handle that (gcc can).
+     * [The 2nd arg is used iff errnum == EVMSERR.]
+     */
+#ifdef strerror
+# undef strerror
+#endif
+extern char *strerror(int,...);
+
+/* vms_strerror() -- convert numeric error code into text string */
+char *
+vms_strerror( int errnum )
+{
+    return ( errnum != EVMSERR ? strerror(errnum)
+			       : strerror(EVMSERR, vaxc$errno) );
+}
+# define strerror(v) vms_strerror(v)
+
+    /*
+     * Miscellaneous utility routine, not part of the run-time library.
+     */
+/* vms_strdup() - allocate some new memory and copy a string into it */
+char *
+vms_strdup( const char *str )
+{
+    char *result;
+    int len = strlen(str);
+
+    emalloc(result, char *, len+1, "strdup");
+    return strcpy(result, str);
+}
+
+    /*
+     * VAXCRTL does not contain unlink().  This replacement has limited
+     * functionality which is sufficient for GAWK's needs.  It works as
+     * desired even when we have the file open.
+     */
+/* unlink(file) -- delete a file (ignore soft links) */
+int
+unlink( const char *file_spec ) {
+    char tmp[255+1];			/*(should use alloca(len+2+1)) */
+    extern int delete(const char *);
+
+    strcpy(tmp, file_spec);		/* copy file name */
+    if (strchr(tmp, ';') == NULL)
+	strcat(tmp, ";0");		/* append version number */
+    return delete(tmp);
+}
+
+    /*
+     * Work-around an open(O_CREAT+O_TRUNC) bug (screwed up modification
+     * and creation dates when new version is created), and also use some
+     * VMS-specific file options.  Note:  optional 'prot' arg is completely
+     * ignored; gawk doesn't need it.
+     */
+#ifdef open
+# undef open
+#endif
+extern int creat(const char *,int,...);
+extern int open(const char *,int,unsigned,...);
+
+/* vms_open() - open a file, possibly creating it */
+int
+vms_open( const char *name, int mode, ... )
+{
+    int result;
+
+    if (strncmp(name, "/dev/", 5) == 0) {
+	/* (this used to be handled in vms_devopen(), but that is only
+	   called when opening files for output; we want it for input too) */
+	if (strcmp(name + 5, "null") == 0)	/* /dev/null -> NL: */
+	    name = "NL:";
+	else if (strcmp(name + 5, "tty") == 0)	/* /dev/tty -> TT: */
+	    name = "TT:";
+    }
+
+    if (mode == (O_WRONLY|O_CREAT|O_TRUNC)) {
+	/* explicitly force stream_lf record format to override DECC$SHR's
+	   defaulting of RFM to earlier file version's when one is present */
+	/* 3.1.7 fix: letting record attibutes default resulted in DECC$SHR's
+	   creat() failing with "invalid record attributes" when trying to
+	   make a new version of an existing file which had rfm=vfc,rat=prn
+	   format, so add explicit "rat=cr" to go with rfm=stmlf to force
+	   the usual "carriage return carriage control" setting */
+	result = creat(name, 0, "rfm=stmlf", "rat=cr", "shr=nil", "mbc=32");
+    } else {
+	struct stat stb;
+        int stat_result;
+	const char *mbc, *shr = "shr=get", *ctx = "ctx=stm";
+
+	stat_result = stat((char *)name, &stb);
+	if ( stat_result < 0) {	/* assume DECnet */
+	    mbc = "mbc=8";
+	} else {    /* ordinary file; allow full sharing iff record format */
+	    mbc = "mbc=32";
+	    if ((stb.st_fab_rfm & 0x0F) < FAB$C_STM) shr = "shr=get,put,upd";
+	}
+	result = open(name, mode, 0, shr, mbc, "mbf=2");
+	if ((stat_result >= 0) && (result < 0) && (errno == ENOENT)) {
+	    /* ENOENT not possible because stat succeeded */
+	    errno = EMFILE;
+	    if (S_ISDIR(stb.st_mode)) {
+		errno = EISDIR; /* Bug seen in VMS 8.3 */
+	    }
+        }
+    }
+
+    /* This is only approximate; the ACP -> RMS -> VAXCRTL interface
+       discards too much potentially useful status information...  */
+    if (result < 0 && errno == EVMSERR
+		   && (vaxc$errno == RMS$_ACC || vaxc$errno == RMS$_CRE))
+	errno = EMFILE;	/* redirect() should close 1 file & try again */
+
+    return result;
+}
+
+    /*
+     * Check for attempt to (re-)open known file.
+     */
+/* vms_devopen() - check for "SYS$INPUT" or "SYS$OUTPUT" or "SYS$ERROR" */
+int
+vms_devopen( const char *name, int mode )
+{
+    FILE *file = NULL;
+
+    if (strncasecmp(name, "SYS$", 4) == 0) {
+	name += 4;		/* skip "SYS$" */
+	if (strncasecmp(name, "INPUT", 5) == 0 && (mode & O_WRONLY) == 0)
+	    file = stdin,  name += 5;
+	else if (strncasecmp(name, "OUTPUT", 6) == 0 && (mode & O_WRONLY) != 0)
+	    file = stdout,  name += 6;
+	else if (strncasecmp(name, "ERROR", 5) == 0 && (mode & O_WRONLY) != 0)
+	    file = stderr,  name += 5;
+	if (*name == ':')  name++;	/* treat trailing colon as optional */
+    }
+    /* note: VAXCRTL stdio has extra level of indirection (*file) */
+    return (file && *file && *name == '\0') ? fileno(file) : -1;
+}
+
+
+#define VMS_UNITS_PER_SECOND 10000000L	/* hundreds of nanoseconds, 1e-7 */
+#define UNIX_EPOCH "01-JAN-1970 00:00:00.00"
+
+extern U_Long SYS$BINTIM(), SYS$GETTIM();
+extern U_Long LIB$SUBX(), LIB$EDIV();
+
+    /*
+     * Get current time in microsecond precision.
+     */
+/* vms_gettimeofday() - get current time in `struct timeval' format */
+int
+vms_gettimeofday(struct timeval *tv, void *timezone__not_used)
+{
+    /*
+	Emulate unix's gettimeofday call; timezone argument is ignored.
+    */
+    static const struct dsc$descriptor_s epoch_dsc =
+       { sizeof UNIX_EPOCH - sizeof "",
+         DSC$K_DTYPE_T, DSC$K_CLASS_S, UNIX_EPOCH };
+    static long epoch[2] = {0L,0L};	/* needs one time initialization */
+    const long  thunk = VMS_UNITS_PER_SECOND;
+    long        now[2], quad[2];
+
+    if (!epoch[0])  SYS$BINTIM(&epoch_dsc, epoch);	/* 1 Jan 0:0:0 1970 */
+    /* get current time, as VMS quadword time */
+    SYS$GETTIM(now);
+    /* convert the quadword time so that it's relative to Unix epoch */
+    LIB$SUBX(now, epoch, quad); /* quad = now - epoch; */
+    /* convert 1e-7 units into seconds and fraction of seconds */
+    LIB$EDIV(&thunk, quad, &tv->tv_sec, &tv->tv_usec);
+    /* convert fraction of seconds into microseconds */
+    tv->tv_usec /= (VMS_UNITS_PER_SECOND / 1000000);
+
+    return 0;           /* success */
+}
+
+
+#ifndef VMS_V7
+    /*
+     * VMS prior to V7.x has no timezone support unless DECnet/OSI is used.
+     */
+/* these are global for use by missing/strftime.c */
+char   *tzname[2] = { "local", "" };
+int     daylight = 0, timezone = 0, altzone = 0;
+
+/* tzset() -- dummy to satisfy linker */
+void tzset(void)
+{
+    return;
+}
+#endif	/*VMS_V7*/
+
+
+#ifndef CRTL_VER_V731
+/* getpgrp() -- there's no such thing as process group under VMS;
+ *		job tree might be close enough to be useful though.
+ */
+int getpgrp(void)
+{
+    return 0;
+}
+#endif
+
+#ifndef __GNUC__
+void vms_bcopy( const char *src, char *dst, int len )
+{
+    (void) memcpy(dst, src, len);
+}
+#endif /*!__GNUC__*/
+
+
+/*----------------------------------------------------------------------*/
+#ifdef NO_VMS_ARGS      /* real code is in "vms/vms_args.c" */
+void vms_arg_fixup( int *argc, char ***argv ) { return; }	/* dummy */
+#endif
+
+#ifdef NO_VMS_PIPES     /* real code is in "vms/vms_popen.c" */
+FILE *popen( const char *command, const char *mode ) {
+    fatal(" Cannot open pipe `%s' (not implemented)", command);
+    return NULL;
+}
+int pclose( FILE *current ) {
+    fatal(" Cannot close pipe #%d (not implemented)", fileno(current));
+    return -1;
+}
+int fork( void ) {
+    fatal(" Cannot fork process (not implemented)");
+    return -1;
+}
+#endif /*NO_VMS_PIPES*/
+/*----------------------------------------------------------------------*/
+
+
+/*
+ *	The following code is taken from the GNU C preprocessor (cccp.c,
+ *	2.8.1 vintage) where it was used #if VMS.  It is only needed for
+ *	VAX C and GNU C on VAX configurations; DEC C's run-time library
+ *	doesn't have the problem described.
+ *
+ *	VMS_fstat() and VMS_stat() were static in cccp.c but need to be
+ *	accessible to the whole program here.  Also, the special handling
+ *	for the null device has been introduced for gawk's benefit, to
+ *	prevent --lint mode from giving spurious warnings about /dev/null
+ *	being empty if it's used as an input file.
+ */
+
+#if defined(VAXC) || (defined(__GNUC__) && !defined(__alpha))
+
+/* more VMS hackery */
+#include <fab.h>
+#include <nam.h>
+
+extern unsigned long SYS$PARSE(), SYS$SEARCH();
+
+/* Work around a VAXCRTL bug.  If a file is located via a searchlist,
+   and if the device it's on is not the same device as the one specified
+   in the first element of that searchlist, then both stat() and fstat()
+   will fail to return info about it.  `errno' will be set to EVMSERR, and
+   `vaxc$errno' will be set to SS$_NORMAL due yet another bug in stat()!
+   We can get around this by fully parsing the filename and then passing
+   that absolute name to stat().
+
+   Without this fix, we can end up failing to find header files, which is
+   bad enough, but then compounding the problem by reporting the reason for
+   failure as "normal successful completion."  */
+
+#undef fstat	/* Get back to the library version.  */
+
+int
+VMS_fstat (fd, statbuf)
+     int fd;
+     struct stat *statbuf;
+{
+  int result = fstat (fd, statbuf);
+
+  if (result < 0)
+    {
+      FILE *fp;
+      char nambuf[NAM$C_MAXRSS+1];
+
+      if ((fp = fdopen (fd, "r")) != 0 && fgetname (fp, nambuf) != 0)
+	result = VMS_stat (nambuf, statbuf);
+      /* No fclose(fp) here; that would close(fd) as well.  */
+    }
+
+  if (result == 0		/* GAWK addition; fixup /dev/null flags */
+      && (statbuf->st_mode & S_IFREG)
+      && strcmp(statbuf->st_dev, "_NLA0:") == 0)
+    {
+      statbuf->st_mode &= ~S_IFREG;
+      statbuf->st_mode |= S_IFCHR;
+    }
+
+  return result;
+}
+
+int
+VMS_stat (name, statbuf)
+     const char *name;
+     struct stat *statbuf;
+{
+  int result = stat (name, statbuf);
+
+  if (result < 0)
+    {
+      struct FAB fab;
+      struct NAM nam;
+      char exp_nam[NAM$C_MAXRSS+1],  /* expanded name buffer for sys$parse */
+	   res_nam[NAM$C_MAXRSS+1];  /* resultant name buffer for sys$search */
+
+      fab = cc$rms_fab;
+      fab.fab$l_fna = (char *) name;
+      fab.fab$b_fns = (unsigned char) strlen (name);
+      fab.fab$l_nam = (void *) &nam;
+      nam = cc$rms_nam;
+      nam.nam$l_esa = exp_nam,  nam.nam$b_ess = sizeof exp_nam - 1;
+      nam.nam$l_rsa = res_nam,  nam.nam$b_rss = sizeof res_nam - 1;
+      nam.nam$b_nop = NAM$M_PWD | NAM$M_NOCONCEAL;
+      if (sys$parse (&fab) & 1)
+	{
+	  if (sys$search (&fab) & 1)
+	    {
+	      res_nam[nam.nam$b_rsl] = '\0';
+	      result = stat (res_nam, statbuf);
+	    }
+	  /* Clean up searchlist context cached by the system.  */
+	  nam.nam$b_nop = NAM$M_SYNCHK;
+	  fab.fab$l_fna = 0,  fab.fab$b_fns = 0;
+	  (void) sys$parse (&fab);
+	}
+    }
+
+  if (result == 0		/* GAWK addition; fixup /dev/null flags */
+      && (statbuf->st_mode & S_IFREG)
+      && strcmp(statbuf->st_dev, "_NLA0:") == 0)
+    {
+      statbuf->st_mode &= ~S_IFREG;
+      statbuf->st_mode |= S_IFCHR;
+    }
+
+  return result;
+}
+#endif	/* VAXC || (__GNUC__ && !__alpha) */
diff --git a/gawk-5.0.1/vms/vms_popen.c b/gawk-5.0.1/vms/vms_popen.c
new file mode 100644
index 00000000000..e6238bfab8d
--- /dev/null
+++ b/gawk-5.0.1/vms/vms_popen.c
@@ -0,0 +1,359 @@
+/* [.vms]vms_popen.c -- substitute routines for missing pipe calls.
+
+   Copyright (C) 1991-1993, 1996, 2010, 2011, 2014
+   the Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+#ifndef NO_VMS_PIPES
+
+#include "awk.h"	/* really "../awk.h" */
+#include <stdio.h>
+
+#ifndef PIPES_SIMULATED
+
+FILE *
+popen( const char *command, const char *mode )
+{
+    fatal(" Cannot open pipe `%s' (not implemented)", command);
+    /* NOT REACHED */
+    return 0;
+}
+
+int
+pclose( FILE *current )
+{
+    fatal(" Internal error ('pclose' not implemented)");
+    /* NOT REACHED */
+    return -1;
+}
+
+int
+fork( void )
+{
+    fatal(" Internal error ('fork' not implemented)");
+    /* NOT REACHED */
+    return -1;
+}
+
+#else	/*PIPES_SIMULATED*/
+	/*
+	 * Simulate pipes using temporary files; hope that the user
+	 * doesn't expect pipe i/o to be interleaved with other i/o ;-}.
+	 *
+	 * This was initially based on the MSDOS version, but cannot
+	 * use a static array to hold pipe info, because there's no
+	 * fixed limit on the range of valid 'fileno's.  Another
+	 * difference is that redirection is handled using LIB$SPAWN
+	 * rather than constructing a command for system() which uses
+	 * '<' or '>'.
+	 */
+#include "vms.h"
+#include <errno.h>
+#include <lnmdef.h>	/* logical name definitions */
+
+#ifndef STDC_HEADERS
+extern int strcmp(const char*, const char *);
+#endif
+extern char *mktemp(char *);
+
+static void push_logicals(void);
+static void pop_logicals(void);
+static Itm *save_translation(const struct dsc$descriptor_s *);
+static void restore_translation(const struct dsc$descriptor_s *, const Itm *);
+
+typedef enum { unopened = 0, reading, writing } pipemode;
+typedef struct pipe_info {
+    char *command;
+    char *name;
+    pipemode pmode;
+} PIPE;
+static PIPE *pipes;
+static int pipes_lim = 0;
+
+#define psize(n) ((n) * sizeof(PIPE))
+#define expand_pipes(k) do {  PIPE *new_p; \
+	int new_p_lim = ((k) / _NFILE + 1) * _NFILE; \
+	emalloc(new_p, PIPE *, psize(new_p_lim), "expand_pipes"); \
+	if (pipes_lim > 0) \
+		memcpy(new_p, pipes, psize(pipes_lim)),  free(pipes); \
+	memset(new_p + psize(pipes_lim), 0, psize(new_p_lim - pipes_lim)); \
+	pipes = new_p,  pipes_lim = new_p_lim;  } while(0)
+
+FILE *
+popen( const char *command, const char *mode )
+{
+    FILE *current;
+    char *name;
+    int   cur;
+    pipemode curmode;
+
+    if (strcmp(mode, "r") == 0)
+	curmode = reading;
+    else if (strcmp(mode, "w") == 0)
+	curmode = writing;
+    else
+	return NULL;
+
+    /* make a name for the temporary file */
+    if ((name = mktemp(strdup("sys$scratch:gawk-pipe_XXXXXX.tmp"))) == 0)
+	return NULL;
+
+    if (curmode == reading) {
+	/* an input pipe reads a temporary file created by the command */
+	vms_execute(command, (char *)0, name);	/* 'command >tempfile' */
+    }
+    if ((current = fopen(name, mode, "mbc=24", "mbf=2")) == NULL) {
+	free(name);
+	return NULL;
+    }
+    cur = fileno(current);
+    if (cur >= pipes_lim)  expand_pipes(cur);
+ /* assert( cur >= 0 && cur < pipes_lim ); */
+    pipes[cur].name = name;
+    pipes[cur].pmode = curmode;
+    pipes[cur].command = strdup(command);
+    return current;
+}
+
+int
+pclose( FILE *current )
+{
+    int rval, cur = fileno(current);
+
+ /* assert( cur >= 0 && cur < pipes_lim ); */
+    if ((cur < 0) || (pipes[cur].pmode == unopened))
+	return -1;	/* should never happen, but does with two-way */
+
+    rval = fclose(current);	/* close temp file; if reading, we're done */
+    if (pipes[cur].pmode == writing) {
+	/* an output pipe feeds the temporary file to the other program */
+	rval = vms_execute(pipes[cur].command, pipes[cur].name, (char *)0);
+    }
+    /* clean up */
+    unlink(pipes[cur].name);	/* get rid of the temporary file */
+    pipes[cur].pmode = unopened;
+    free(pipes[cur].name),  pipes[cur].name = 0;
+    free(pipes[cur].command),  pipes[cur].command = 0;
+    return rval;
+}
+
+    /*
+     * Create a process and execute a command in it.  This is essentially
+     * the same as system() but allows us to specify SYS$INPUT (stdin)
+     * and/or SYS$OUTPUT (stdout) for the process.
+     * [With more work it could truly simulate a pipe using mailboxes.]
+     */
+int
+vms_execute( const char *command, const char *input, const char *output )
+{
+    struct dsc$descriptor_s cmd, in, out, *in_p, *out_p;
+    U_Long sts, cmpltn_sts;
+
+    cmd.dsc$w_length = strlen(cmd.dsc$a_pointer = (char *)command);
+    cmd.dsc$b_dtype = DSC$K_DTYPE_T;
+    cmd.dsc$b_class = DSC$K_CLASS_S;
+    if (input) {
+	in.dsc$w_length = strlen(in.dsc$a_pointer = (char *)input);
+	in_p = &in;
+	in.dsc$b_dtype = DSC$K_DTYPE_T;
+	in.dsc$b_class = DSC$K_CLASS_S;
+    } else
+	in_p = 0;
+    if (output) {
+	out.dsc$w_length = strlen(out.dsc$a_pointer = (char *)output);
+	out_p = &out;
+	out.dsc$b_dtype = DSC$K_DTYPE_T;
+	out.dsc$b_class = DSC$K_CLASS_S;
+    } else
+	out_p = 0;
+
+    push_logicals();	/* guard against user-mode definitions of sys$Xput */
+    sts = LIB$SPAWN(&cmd, in_p, out_p, (U_Long *)0,
+		    (struct dsc$descriptor_s *)0, (U_Long *)0, &cmpltn_sts);
+    pop_logicals();	/* restore environment */
+
+    if (vmswork(sts) && vmsfail(cmpltn_sts))  sts = cmpltn_sts;
+    if (vmsfail(sts)) {
+	errno = EVMSERR,  vaxc$errno = sts;
+	return -1;
+    } else
+	return 0;
+}
+
+/*----*
+	This rigmarole is to guard against interference from the current
+	environment.  User-mode definitions of SYS$INPUT and/or SYS$OUTPUT
+	will interact with spawned subprocesses--including LIB$SPAWN with
+	explicit input and/or output arguments specified--if they were
+	defined without the 'CONFINED' attribute.  The definitions created
+	in vms_args.c as part of command line I/O redirection happened to
+	fall into this category :-(, but even though that's been fixed,
+	there's still the possibility of the user doing something like
+	 |$ define/user sys$output foo.out
+	prior to starting the program.  Without ``/name_attr=confine'',
+	that will really screw up pipe simulation, so we've got to work-
+	around it here.  This is true whether pipes are implemented via
+	mailboxes or temporary files, as long as lib$spawn() is being used.
+
+	push_logicals() calls save_translation() the first time it's
+	invoked; the latter allocates some memory to hold a full logical
+	name translation and uses $trnlnm to fill that in.  Then if either
+	sys$input or sys$output has a user-mode, non-confined translation,
+	push_logicals() will delete the definition(s) using $dellnm.
+	After the spawned command has returned, pop_logicals() is called;
+	it calls restore_translation() for any deleted values; the latter
+	uses $crllnm or $crelog to recreate the original definition.
+
+	SYS$ERROR is currently ignored; perhaps it should receive the same
+	treatment...
+*----*/
+
+ /* logical name table, and names of interest; these are all constant */
+static const Descrip(lnmtable,"LNM$PROCESS_TABLE");
+static const Descrip(sys_input,"SYS$INPUT");
+static const Descrip(sys_output,"SYS$OUTPUT");
+static const unsigned char acmode = PSL$C_USER; /* only care about user-mode */
+
+ /* macros for simplfying the code a bunch */
+#define DelTrans(l)	SYS$DELLNM(&lnmtable, (l), &acmode)
+#define GetTrans(l,i)	SYS$TRNLNM((U_Long *)0, &lnmtable, (l), &acmode, (i))
+#define SetTrans(l,i)	SYS$CRELNM((U_Long *)0, &lnmtable, (l), &acmode, (i))
+ /* itemlist manipulation macros; separate versions for aggregate and scalar */
+#define SetItmA(i,c,p,r) ((i).code = (c), (i).len = sizeof (p),\
+			  (i).buffer = (p), (i).retlen = (U_Short *)(r))
+#define SetItmS(i,c,p)	 ((i).code = (c), (i).len = sizeof *(p),\
+			  (i).buffer = (p), (i).retlen = (U_Short *)0)
+#define EndItm0(i)	 ((i).code = (i).len = 0)
+
+ /* translate things once, then hold the results here for multiple re-use */
+static Itm *input_definition, *output_definition;
+
+static void
+push_logicals( void )		/* deassign sys$input and/or sys$output */
+{
+    static int init_done = 0;
+
+    if (!init_done) {	/* do logical name lookups one-time only */
+	input_definition = save_translation(&sys_input);
+	output_definition = save_translation(&sys_output);
+	init_done = 1;
+    }
+    if (input_definition) DelTrans(&sys_input);		/* kill sys$input */
+    if (output_definition) DelTrans(&sys_output);	/* and sys$output */
+}
+
+static void
+pop_logicals( void )		/* redefine sys$input and/or sys$output */
+{
+    if (input_definition) restore_translation(&sys_input, input_definition);
+    if (output_definition) restore_translation(&sys_output, output_definition);
+}
+
+static Itm *
+save_translation( const struct dsc$descriptor_s *logname )
+{
+    Itm trans[4], *itmlst;
+    long trans_attr, max_trans_indx;	/* 0-based translation index count */
+    unsigned char trans_acmode;		/* translation's access mode */
+    unsigned itmlst_size;
+    register int i, j;
+
+    itmlst = 0;
+    /* Want translation index count for non-confined, user-mode definition;
+	unfortunately, $trnlnm does not provide that much control.  Try to
+	fetch several values of interest, then decide based on the result.
+     */
+    SetItmS(trans[0], LNM$_MAX_INDEX, &max_trans_indx),	 max_trans_indx = -1;
+    SetItmS(trans[1], LNM$_ACMODE, &trans_acmode),	 trans_acmode = 0;
+    SetItmS(trans[2], LNM$_ATTRIBUTES, &trans_attr),	 trans_attr = 0;
+    EndItm0(trans[3]);
+    if (vmswork(GetTrans(logname, trans)) && max_trans_indx >= 0
+      && trans_acmode == PSL$C_USER && !(trans_attr & LNM$M_CONFINE)) {
+	/* Now know that definition of interest exists;
+	    allocate and initialize an item list and associated buffers;
+	    use three entries for each translation.
+	 */
+	itmlst_size = (3 * (max_trans_indx + 1) + 1) * sizeof(Itm);
+	emalloc(itmlst, Itm *, itmlst_size, "save_translation");
+	for (i = 0; i <= max_trans_indx; i++) {
+	    struct def { U_Long indx, attr; U_Short len;
+			 char str[LNM$C_NAMLENGTH], eos; } *wrk;
+	    emalloc(wrk, struct def *, sizeof (struct def), "save_translation");
+	    wrk->indx = (U_Long)i;  /* this one's an input value for $trnlnm */
+	    SetItmS(itmlst[3*i+0], LNM$_INDEX, &wrk->indx);
+	    SetItmS(itmlst[3*i+1], LNM$_ATTRIBUTES, &wrk->attr),  wrk->attr = 0;
+	    SetItmA(itmlst[3*i+2], LNM$_STRING, &wrk->str, &wrk->len),  wrk->len = 0;
+	}
+	EndItm0(itmlst[3*i]);   /* assert( i == max_trans_indx+1 ); */
+	/* Time to perform full logical name translation,
+	    then update item list for subsequent restoration.
+	    If there are any holes [don't know whether that's possible]
+	    collapse them out of the list; don't want them at restore time.
+	 */
+	if (vmswork(GetTrans(logname, itmlst))) {
+	    for (i = 0, j = -1; i <= max_trans_indx; i++) {
+		U_Long *attr_p;
+		attr_p = itmlst[3*i+1].buffer;	/* copy (void *) to true type */
+		if (*attr_p & LNM$M_EXISTS) {
+		    *attr_p &= ~LNM$M_EXISTS;	/* must clear this bit */
+		    if (++j < i)  itmlst[3*j+0] = itmlst[3*i+0],
+				  itmlst[3*j+1] = itmlst[3*i+1],
+				  itmlst[3*j+2] = itmlst[3*i+2];
+		    if (itmlst[3*j+2].retlen) { /* fixup buffer length */
+			itmlst[3*j+2].len = *itmlst[3*j+2].retlen;
+			itmlst[3*j+2].retlen = (U_Short *)0;
+		    }
+		}
+	    }
+	    if (++j < i)  EndItm0(itmlst[3*j]);
+	} else	    /* should never happen; tolerate potential memory leak */
+	    free(itmlst),  itmlst = 0;  /*('wrk' buffer(s) will become lost)*/
+    }
+    return itmlst;
+}
+
+static void
+restore_translation( const struct dsc$descriptor_s *logname,
+                     const Itm *itemlist )
+{
+    struct dsc$descriptor_s trans_val;
+    U_Long *attr_p;
+# define LOG_PROCESS_TABLE 2		/* <obsolete> */
+# define LOG_USERMODE PSL$C_USER
+
+ /* assert( itemlist[1].code == LNM$_ATTRIBUTES ); */
+    attr_p = itemlist[1].buffer;	/* copy (void *) to (U_Long *) */
+    if (*attr_p & LNM$M_CRELOG) {	/* check original creation method */
+	/* $crelog values can have only one translation;
+	    so it'll be the first string entry in the itemlist.
+	 */
+     /* assert( itemlist[2].code == LNM$_STRING ); */
+	trans_val.dsc$a_pointer = itemlist[2].buffer;
+	trans_val.dsc$w_length = itemlist[2].len;
+	trans_val.dsc$b_dtype = DSC$K_DTYPE_T;
+	trans_val.dsc$b_class = DSC$K_CLASS_S;
+	(void) SYS$CRELOG(LOG_PROCESS_TABLE, logname, &trans_val, LOG_USERMODE);
+    } else {
+	/* $crelnm definition; itemlist could specify multiple translations,
+	    but has already been setup properly for use as-is.
+	 */
+	(void) SetTrans(logname, itemlist);
+    }
+}
+
+#endif	/*PIPES_SIMULATED*/
+
+#endif	/*!NO_VMS_PIPES*/
diff --git a/gawk-5.0.1/vms/vms_sort.com b/gawk-5.0.1/vms/vms_sort.com
new file mode 100755
index 00000000000..b8b614fda48
--- /dev/null
+++ b/gawk-5.0.1/vms/vms_sort.com
@@ -0,0 +1,4 @@
+$!'f$verify(0,0)'
+$ sort := sort
+$ define/user sys$input sys$command:
+$ sort sys$input: sys$output:
diff --git a/gawk-5.0.1/vms/vmsbuild.com b/gawk-5.0.1/vms/vmsbuild.com
new file mode 100644
index 00000000000..9582c01ce24
--- /dev/null
+++ b/gawk-5.0.1/vms/vmsbuild.com
@@ -0,0 +1,145 @@
+$! vmsbuild.com -- Commands to build GAWK		Pat Rankin, Dec'89
+$!
+$ if (f$getsyi("HW_MODEL") .lt. 1024)
+$ then
+$   arch_name = "VAX"
+$ else
+$   arch_name = f$edit(f$getsyi("ARCH_NAME"), "UPCASE")
+$ endif
+$!
+$ CCFLAGS = "/noList"	! "/noOpt/Debug"
+$! CCFLAGS = "/list/show=(expan,incl)
+$ CDEFS	  = "GAWK,HAVE_CONFIG_H"
+$! Do not specify _POSIX_EXIT here, we are using other tricks for that.
+$!
+$!
+$ if p1.eqs."" then  p1 = "DECC"	!default compiler
+$ if p1.eqs."GNUC"
+$ then
+$! assumes VAX
+$   CC = "gcc"
+$   if f$type(gcc).eqs."STRING" then  CC = gcc
+$   CFLAGS = "/Incl=([],[.vms],[.SUPPORT])/Obj=[]/Def=(''CDEFS')''CCFLAGS'"
+$   LIBS = "gnu_cc:[000000]gcclib.olb/Library,sys$library:vaxcrtl.olb/Library"
+$   if p2.eqs."DO_GNUC_SETUP" then  set command gnu_cc:[000000]gcc
+$ else	!!GNUC
+$  if p1.eqs."VAXC"
+$  then
+$!  always VAX; version V3.x of VAX C assumed (for V2.x, remove /Opt=noInline)
+$   CC = "cc"
+$   if f$trnlnm("DECC$CC_DEFAULT").nes."" then  CC = "cc/VAXC"
+$   CFLAGS = "/Incl=[]/Obj=[]/Opt=noInline/Def=(''CDEFS')''CCFLAGS'"
+$   LIBS = "sys$share:vaxcrtl.exe/Shareable"
+$  else  !!VAXC
+$!  neither GNUC nor VAXC, assume DECC (same for either VAX or Alpha)
+$ if arch_name .eqs. "VAX"
+$ then
+$   CFLOAT = ""
+$ else
+$   CFLOAT = "/float=ieee/ieee_mode=denorm_results"
+$ endif
+$   CC = "cc/DECC/Prefix=All"
+$   CNAME = "/NAME=(AS_IS,SHORT)
+$   CINC = "/NESTED_INCLUDE=NONE"
+$   CINC1 = "[],[.vms],[.support]"
+$   CFLAGS = "/Incl=(''CINC1')/Obj=[]/Def=(''CDEFS')''CINC'''CCFLAGS'"
+$   CFLAGS = CNAME + CFLOAT + CFLAGS
+$   LIBS = ""	! DECC$SHR instead of VAXCRTL, no special link option needed
+$  endif !VAXC
+$ endif !GNUC
+$!
+$ cc = CC + CFLAGS
+$ show symbol cc
+$!
+$ if f$search("config.h") .nes. ""
+$ then
+$    if f$cvtime(f$file_attr("config.h", "RDT")) .ges. -
+        f$cvtime(f$file_attr("configh.in","RDT")) then  goto config_ok
+$ endif
+$ v = f$verify(0)
+$ @[.vms]generate_config_vms_h_gawk.com
+$ @[.vms]config_h.com NOBUILTINS
+$!
+$config_ok:
+$ if f$search("awkgram.c").nes."" then  goto awkgram_ok
+$	write sys$output " You must process `awkgram.y' with ""yacc"" or ""bison"""
+$	if f$search("awkgram_tab.c").nes."" then -	!bison was run manually
+	  write sys$output " or else rename `awkgram_tab.c' to `awkgram.c'."
+$	if f$search("ytab.c").nes."" .or. f$search("y_tab.c").nes."" then - !yacc
+	  write sys$output " or else rename `ytab.c' or `y_tab.c' to `awkgram.c'."
+$	exit
+$awkgram_ok:
+$ if f$search("command.c").nes."" then  goto command_ok
+$	write sys$output " You must process `command.y' with ""yacc"" or ""bison"""
+$	if f$search("command_tab.c").nes."" then -	!bison was run manually
+	  write sys$output " or else rename `command_tab.c' to `command.c'."
+$	if f$search("ytab.c").nes."" .or. f$search("y_tab.c").nes."" then - !yacc
+	  write sys$output " or else rename `ytab.c' or `y_tab.c' to `command.c'."
+$	exit
+$command_ok:
+$ v1 = f$verify(1)
+$ cc array.c
+$ cc awkgram.c
+$ cc builtin.c
+$ cc [.support]dfa.c
+$ cc ext.c
+$ cc field.c
+$ cc floatcomp.c
+$ cc gawkmisc.c
+$ cc [.support]getopt.c
+$ cc [.support]getopt1.c
+$ cc io.c
+$ cc [.support]localeinfo.c
+$ cc main.c
+$ cc msg.c
+$ cc node.c
+$ cc [.support]random.c
+$ cc re.c
+$ cc [.support]regex.c
+$ cc replace.c
+$ cc version.c
+$ cc eval.c
+$ cc profile.c
+$ cc command.c
+$ cc debug.c
+$ cc int_array.c
+$ cc cint_array.c
+$ cc gawkapi.c
+$ cc mpfr.c
+$ cc str_array.c
+$ cc symbol.c
+$ cc [.vms]vms_misc.c
+$ cc [.vms]vms_popen.c
+$ cc [.vms]vms_fwrite.c
+$ cc [.vms]vms_args.c
+$ cc [.vms]vms_gawk.c
+$ cc [.vms]vms_cli.c
+$ cc [.vms]vms_crtl_init.c
+$ set command/Object=[]gawk_cmd.obj sys$disk:[.vms]gawk.cld
+$! 'f$verify(v)'
+$!
+$ close/noLog Fopt
+$ create gawk.opt
+! GAWK -- GNU awk
+array.obj,awkgram.obj,builtin.obj,dfa.obj,ext.obj,field.obj,floatcomp.obj
+gawkmisc.obj,getopt.obj,getopt1.obj,io.obj,localeinfo.obj
+main.obj,msg.obj,node.obj
+random.obj,re.obj,regex.obj,replace.obj,version.obj,eval.obj,profile.obj
+command.obj,debug.obj,int_array.obj,cint_array.obj,gawkapi.obj,mpfr.obj
+str_array.obj,symbol.obj
+[]vms_misc.obj,vms_popen.obj,vms_fwrite.obj,vms_args.obj
+[]vms_gawk.obj,vms_cli.obj,gawk_cmd.obj,vms_crtl_init.obj
+psect_attr=environ,noshr	!extern [noshare] char **
+stack=48	!preallocate more pages (default is 20)
+iosegment=128	!ditto (default is 32)
+$!
+$ @[.vms]gawk_ident.com
+$ v1 = f$verify(1)
+$ open/append Fopt gawk.opt
+$ write Fopt libs
+$ close Fopt
+$!
+$ v1 = f$verify(1)
+$ link/exe=gawk.exe gawk.opt/options
+$! 'f$verify(v)'
+$ exit
diff --git a/gawk-5.0.1/vms/vmstest.com b/gawk-5.0.1/vms/vmstest.com
new file mode 100644
index 00000000000..292c5f66545
--- /dev/null
+++ b/gawk-5.0.1/vms/vmstest.com
@@ -0,0 +1,4297 @@
+$! vmstest.com -- DCL script to perform test/Makefile actions for VMS
+$!
+$! Usage:
+$!  $ set default [-.test]
+$!  $ @[-.vms]vmstest.com bigtest
+$! This assumes that newly built gawk.exe is in the next directory up.
+$!
+$! Note to other maintainers:
+$! *  when this test script is run via automation through RSH or SSH,
+$!    on non-VAX, for some reason a second empty version of the output
+$!    file is generated.
+$!    For the tests to pass, this must be detected and deleted.
+$!    This issue does not show up when running this script from
+$!    an interactive SSH session.
+$! *  The tests where Gawk could return an error code need to be
+$!    wrapped in a set On / set noOn pair or it will abort this
+$!    script, leaving behind an open "junit" file logical in DCL.
+$!
+$! 3.1.7:  changed to share code among many common tests, and
+$!	   to put results for test foo into _foo.tmp instead of tmp.
+$!
+$! 4.0.71:  New tests:
+$!	functab1,functab2,functab3,id,incdupe,incdupe2,	incdupe3,include2
+$!	symtab1,symtab2,symtab3,symtab4,symtab5,symtab6
+$!
+$! 4.0.75:  New  tests
+$!	basic:	rri1,getline5,incdupe4,incdupe5,incdupe6,incdupe7
+$!	ext:	colonwarn,reginttrad,symtab7,symtab8,symtab9
+$!
+$! 4.1.1: New tests implemented in 4.1.3a
+$!
+$!	basic:	badassign1,dfamb1,exit2,nfloop
+$!	ext:	profile4,profile5
+$!	locale:	backbigs1,backsmalls1,backsmalls2,mbprintf4
+$!              backgigs1 requires a locale not supplied with VMS.
+$!
+$! 4.1.2: New tests implemented in 4.1.3a
+$!	basic:	badbuild,callparam,exitval3,inpref,paramasfunc1,
+$!		paramasfunc2,regexpbrack,sortglos
+$!	ext:	crlf,dbugeval,fpat4,genpot,indirectbuiltin,
+$!		printfbad4,printhuge,profile0,profile6,profile7,
+$!		regnul1,regnul2,rsgetline,rsglstdin
+$!	charset_all: charset_msg_start,charset_tests,charset_msg_end
+$!
+$! 4.1.3: New tests - implemented in 4.1.3a
+$!	basic:	rebrackloc
+$!
+$! 4.1.3a: New tests
+$!	vms_debug: Not a test, switches to a debug gawk for following tests
+$!	basic:	aryprm9,exitval2,nulinsrc,rstest4,rstest5
+$!	ext:	mbstr2,profile8,watchpoint1
+$!      shlib:  inplace2,testext,lc_num1,mbprintf1
+$!		mbprintf2,mbfprintf3,mbfprintf4,mbfw1
+$!
+$! 4.1.3c: New tests
+$!      ext:	clos1way2, clos1way3, clos1way4, clos1way5
+$!
+$! 4.1.3f: New tests
+$!      basic:  arrayind1,rscompat,sigpipe1
+$!
+$! 4.1.3.g: New tests
+$!      basic:  fsnul1, hex2, mixed1, subback
+$!	ext:    fpat4, symtab10
+$!
+$! 4.1.3.i: New tests
+$!	basic:  ofmtstrnum
+$!	extra:  ignrcas3
+$!
+$! 4.2.0: New tests
+$!      basic:   aryunasgn, concat5, memleak
+$!      ext:     fpat5, fpat6, fwtest5, fwtest6, fwtest7, fwtest8,
+$!               sourcesplit
+$!      charset: mbprintf5
+$!
+$! 4.2+: New tests
+$!      basic:   numstr1, setrec0, setrec1
+$!      extra:   isarrayunset, nlstringtest
+$!
+$!
+$	echo	= "write sys$output"
+$	cmp	= "diff/Output=_NL:/Maximum=1"
+$	delsym  = "delete/symbol/local/nolog"
+$	igncascmp = "''cmp'/Ignore=Case"
+$	sumslp  = "edit/Sum"
+$	rm	= "delete/noConfirm/noLog"
+$	mv	= "rename/New_Vers"
+$	sort	= "sort"
+$	gawk = "$sys$disk:[-]gawk"
+$	AWKPATH_srcdir = "define/User AWKPATH sys$disk:[]"
+$	AWKLIBPATH_dir = "define/User AWKLIBPATH sys$disk:[-]"
+$	arch_name = f$edit(f$getsyi("arch_name"),"upcase,trim")
+$
+$!	Make sure that the default directory exists on a search list.
+$	def_dir = f$environment("default")
+$	create/dir 'def_dir'
+$	listdepth = 0
+$	pipeok = 0
+$       prepend_error = 0
+$	floatmode = -1	! 0: D_float, 1: G_float, 2: IEEE T_float
+$
+$	list = p1+" "+p2+" "+p3+" "+p4+" "+p5+" "+p6+" "+p7+" "+p8
+$	list = f$edit(list,"TRIM,LOWERCASE")
+$	if list.eqs."" then  list = "all"	! bigtest
+$	gosub create_junit_test_header
+$	gosub list_of_tests
+$	gosub finish_junit_test
+$	echo "done."
+$	exit
+$!
+$create_junit_test_header:
+$	junit_count = 0
+$	temp_fdl = "sys$disk:[]stream_lf.fdl"
+$	arch_code = f$extract(0, 1, arch_name)
+$!
+$	junit_hdr_file = "sys$disk:[]test_output.xml"
+$	if f$search(junit_hdr_file) .nes. "" then delete 'junit_hdr_file';*
+$	junit_body_file = "sys$disk:[]test_body_tmp.xml"
+$	if f$search(junit_body_file) .nes. "" then delete 'junit_body_file';*
+$!!
+$	if arch_code .nes. "V"
+$	then
+$	    create 'junit_hdr_file'/fdl="RECORD; FORMAT STREAM_LF;"
+$	    create 'junit_body_file'/fdl="RECORD; FORMAT STREAM_LF;"
+$	else
+$	    if f$search(temp_fdl) .nes. "" then delete 'temp_fdl';*
+$	    create 'temp_fdl'
+RECORD
+	FORMAT		stream_lf
+$	    continue
+$	    create 'junit_hdr_file'/fdl='temp_fdl'
+$	    create 'junit_body_file'/fdl='temp_fdl'
+$	endif
+$	open/append junit 'junit_body_file'
+$	return
+$!
+$finish_junit_test:
+$	open/append junit_hdr 'junit_hdr_file'
+$	write junit_hdr "<?xml version=""1.0"" encoding=""UTF-8""?>"
+$	write junit_hdr "<testsuite name=""gawk"""
+$	write junit_hdr " tests=""''junit_count'"">"
+$	close junit_hdr
+$	write junit "</testsuite>"
+$	close junit
+$	append 'junit_body_file' 'junit_hdr_file'
+$       delete 'junit_body_file';*
+$	return
+$!
+$junit_report_skip:
+$	write sys$output "Skipping test ''test' reason ''skip_reason'."
+$	junit_count = junit_count + 1
+$	write junit "  <testcase name=""''test'"""
+$	write junit "   classname=""''test_class'"">"
+$	write junit "     <skipped/>"
+$	write junit "  </testcase>"
+$	return
+$!
+$junit_report_fail_diff:
+$	fail_msg = "failed"
+$	fail_type = "diff"
+$!	fall through to junit_report_fail
+$junit_report_fail:
+$	write sys$output "failing test ''test' reason ''fail_msg'."
+$	junit_count = junit_count + 1
+$	write junit "  <testcase name=""''test'"""
+$	write junit "   classname=""''test_class'"">"
+$	write junit -
+  "     <failure message=""''fail_msg'"" type=""''fail_type'"" >"
+$	write junit "     </failure>"
+$	write junit "  </testcase>"
+$	return
+$!
+$junit_report_pass:
+$	junit_count = junit_count + 1
+$	write junit "  <testcase name=""''test'"""
+$	write junit "   classname=""''test_class'"">"
+$	write junit "  </testcase>"
+$	return
+$
+$vms_debug:	echo "Switching to gawk_debug.exe"
+$		gawk = "$sys$disk:[-]gawk_debug.exe"
+$		return
+$!
+$all:
+$
+$bigtest:	echo "bigtest..."
+$		! omits "printlang" and "extra"
+$		list = "basic unix_tests gawk_ext vms_tests charset_tests" -
+		  + " machine_tests"
+$		gosub list_of_tests
+$		return
+$
+$basic:		echo "basic..."
+$		list = "msg addcomma anchgsub argarray arrayind1" -
+		  + " arrayparm arrayref arrayprm2 arrayprm3 arrymem1" -
+		  + " arryref2 arryref3 arryref4 arryref5 arynasty" -
+		  + " arynocls aryprm1 aryprm2 aryprm3 aryprm4 aryprm5" -
+		  + " aryprm6 aryprm7 aryprm8 aryprm9 arysubnm aryunasgn" -
+                  + " asgext awkpath" -
+		  + " back89 backgsub badassign1 badbuild"
+$		gosub list_of_tests
+$		list = "callparam childin clobber closebad clsflnam" -
+		  + " compare compare2 concat1 concat2 concat3 concat4" -
+		  + " concat5 convfmt " -
+		  + " datanonl defref delargv delarprm delarpm2 delfunc" -
+		  + " dfamb1 dfastress dynlj" -
+		  + " eofsplit exit2 exitval1 exitval2 exitval3"
+$		gosub list_of_tests
+$		list = "fcall_exit fcall_exit2 fldchg fldchgnf" -
+		  + " fnamedat fnarray fnarray2 fnaryscl fnasgnm fnmisc" -
+		  + " fordel forref forsimp fsbs fsnul1 fsspcoln fsrs" -
+		  + " fstabplus funsemnl funsmnam funstack"
+$		gosub list_of_tests
+$		list = "getline getline2 getline3 getline4 getline5 " -
+		  + " getlnbuf getnr2tb getnr2tm gsubasgn gsubtest" -
+		  + " gsubtst2 gsubtst3 gsubtst4 gsubtst5 gsubtst6" -
+		  + " gsubtst7 gsubtst8" -
+		  + " hex hex2 hsprint" -
+		  + " inpref inputred intest intprec iobug1" -
+		  + " leaddig leadnl litoct longsub longwrds"-
+		  + " manglprm math membug1 messages memleak minusstr mixed1" -
+		  + " mmap8k mtchi18n"
+$		gosub list_of_tests
+$		list = "nasty nasty2 negexp negrange nested nfldstr" -
+		  + " nfloop nfneg nfset nlfldsep nlinstr nlstrina" -
+		  + " noeffect nofile nofmtch noloop1 noloop2 nonl" -
+		  + " noparms nors nulinsrc nulrsend numindex numstr1" -
+		  + " numsubstr" -
+		  + " octsub ofmt ofmtbig ofmtfidl" -
+		  + " ofmta ofmts ofs1 onlynl opasnidx opasnslf
+$		gosub list_of_tests
+$		list = "paramasfunc1 paramasfunc2 paramdup" -
+		  + " paramres paramtyp paramuninitglobal" -
+		  + " parse1 parsefld parseme pcntplus posix2008sub" -
+		  + " prdupval prec printf0 printf1 prmarscl prmreuse" -
+		  + " prt1eval prtoeval"
+$		gosub list_of_tests
+$		list = "rand range1 rebrackloc rebt8b1 redfilnm regeq" -
+		  + " regexpbrack regexprange regrange reindops reparse" -
+		  + " resplit rri1 rs rscompat rsnul1nl rsnulbig rsnulbig2" -
+		  + " rstest1 rstest2 rstest3 rstest4 rstest5 rswhite"
+$		gosub list_of_tests
+$		list = "scalar sclforin sclifin setrec0 setrec1 sigpipe1" -
+		  + " sortempty sortglos" -
+		  + " splitargv splitarr splitdef splitvar splitwht" -
+		  + " strcat1 strtod strnum1 subamp subback subi18n subsepnm" -
+		  + " subslash substr swaplns synerr1 synerr2"
+$		gosub list_of_tests
+$		list = "tradanch tweakfld" -
+		  + " uninit2 uninit3 uninit4 uninit5 uninitialized" -
+		  + " unterm uparrfs" -
+		  + " wideidx wideidx2 widesub widesub2 widesub3 widesub4" -
+		  + " wjposer1" -
+		  + " zeroe0 zeroflag zero2"
+$		gosub list_of_tests
+$		return
+$!
+$unix:
+$unix_tests:	echo "unix_tests..."
+$		list = "fflush getlnhd localenl pid pipeio1 pipeio2" -
+		  + " poundbang rtlen rtlen01 space strftlng"
+$		gosub list_of_tests
+$		return
+$
+$gnu:
+$gawk_ext:	echo "gawk_ext... (gawk.extensions)"
+$		list = "aadelete1 aadelete2 aarray1 aasort aasorti" -
+		  + " argtest arraysort" -
+		  + " backw badargs beginfile1 binmode1" -
+		  + " colonwarn clos1way clos1way2 clos1way3 clos1way4" -
+		  + " clos1way5 charasbytes crlf" -
+		  + " dbugeval delsub devfd devfd1 devfd2 dumpvars" -
+		  + " exit" -
+		  + " fieldwdth fpat1 fpat2 fpat3 fpat4 fpat5 fpat6 " -
+		  + " fpatnull funlen functab1 functab2 functab3 fsfwfs " -
+		  + " fwtest fwtest2 fwtest3 fwtest4 fwtest5 fwtest6 " -
+		  + " fwtest7 fwtest8"
+$		gosub list_of_tests
+$		list = "genpot gensub gensub2 getlndir gnuops2 gnuops3" -
+		  + " gnureops" -
+		  + " icasefs id icasers igncdym igncfs ignrcase ignrcas2" -
+		  + " incdupe incdupe2 incdupe3 incdupe4 incdupe5" -
+		  + " incdupe6 incdupe7 include2 indirectbuiltin indirectcall"
+$		gosub list_of_tests
+$		list = "lint lintold lintwarn" -
+		  + " match1 match2 match3 manyfiles mbprintf3 mbstr1 mbstr2" -
+		  + " nastyparm next nondec nondec2" -
+		  + " patsplit posix printfbad1 printfbad2 printfbad3" -
+		  + " printfbad4 printhuge procinfs profile0 profile1" -
+		  + " profile2 profile3 profile4 profile5 profile6" -
+		  + " profile7 profile8 pty1"
+$		gosub list_of_tests
+$		list = "regx8bit rebuf reginttrad regnul1 regnul2" -
+		  + " reint reint2 rsgetline rsglstdin rsstart1 rsstart2" -
+		  + " rsstart3 rstest6" -
+		  + " shadow sortfor sortu sourcesplit split_after_fpat" -
+		  + " splitarg4 strtonum strftime switch2 symtab1 symtab2" -
+		  + " symtab3 symtab4 symtab5 symtab6 symtab7 symtab8" -
+		  + " symtab9 symtab10 watchpoint1"
+$		gosub list_of_tests
+$		return
+$
+$vms:
+$vms_tests:	echo "vms_tests..."
+$		list = "vms_cmd vms_io1 vms_io2"
+$		gosub list_of_tests
+$		return
+$
+$locale_tests:
+$charset_tests:	echo "charset_tests..."
+$		! without i18n kit, VMS only supports the C locale
+$		! and several of these fail
+$		list = "asort asorti" -
+		  + " backbigs1 backsmalls1 backsmalls2" -
+		  + " fmttest fnarydel fnparydl" -
+		  + " lc_num1 mbfw1" -
+		  + " mbprintf1 mbprintf2 mbprintf4 mbprintf5" -
+		  + " rebt8b2 rtlenmb" -
+		  + " sort1 sprintfc"
+$		gosub list_of_tests
+$		return
+$!
+$charset_all:  echo "All charset tests..."
+$		list = "charset_msg_start charset_tests charset_msg_end"
+$		gosub list_of_tests
+$		return
+$
+$hardware:
+$machine_tests:	echo "machine_tests..."
+$		! these depend upon the floating point format in use
+$		list = "double1 double2 fmtspcl intformat"
+$		gosub list_of_tests
+$		return
+$
+$extra:		echo "extra..."
+$		list = "regtest inftest inet ignrcas3 isarrayunset" -
+                  + " nlstringtest"
+$		gosub list_of_tests
+$		return
+$
+$inet:		echo "inet..."
+$		type sys$input:
+ The inet tests only work if gawk has been built with TCP/IP socket
+ support and your system supports the services "discard" at port 9
+ and "daytimed" at port 13.
+$		list = "inetechu inetecht inetdayu inetdayt"
+$		gosub list_of_tests
+$		return
+$!
+$shlib:
+$extension:	echo "extension...."
+$		list = "fnmatch filefuncs fork fork2 fts functab4" -
+		  + " inplace1 inplace2" -
+		  + " ordchr ordchr2" -
+		  + " readdir readfile readfile2 revout revtwoway rwarray" -
+		  + " testext time"
+$		gosub list_of_tests
+$		return
+$!
+$mpfr:
+$		test_class = "mpfr"
+$		skip_reason = "Not yet implmented on VMS"
+$		! mpfr has not yet been ported to VMS.
+$		gosub junit_report_skip
+$		return
+$!
+$! list_of_tests: process 'list', a space-separated list of tests.
+$! Some tests assign their own 'list' and call us recursively,
+$! so we have to emulate a local stack to prevent the current list
+$! from being clobbered by nested execution.  We do this by making
+$! and operating on list1, list2, &c depending upon call depth.
+$! Lower level tests access higher numbered entries; the lower
+$! entries in use by caller or caller's caller are kept intact.
+$list_of_tests:
+$		listdepth = listdepth + 1	! increment calling depth
+$		list'listdepth' = f$edit(list,"COMPRESS,TRIM")
+$next_test:
+$		test = f$element(0," ",list'listdepth')
+$		list'listdepth' = list'listdepth' - test - " "
+$		gosub 'test'
+$		if list'listdepth'.nes.""  then  goto next_test
+$		listdepth = listdepth - 1	! reset
+$		return
+$
+$
+$! common tests, not needing special set up: gawk -f 'test'.awk 'test'.in
+$addcomma:
+$anchgsub:
+$asgext:
+$backgsub:
+$concat1:
+$datanonl:
+$dfamb1:
+$fldchg:
+$fldchgnf:
+$fsnul1:
+$fsrs:
+$funstack:
+$getline4:
+$getnr2tb:
+$getnr2tm:
+$gsubtst7:
+$gsubtst8:
+$hex2:
+$inpref:
+$leadnl:
+$manglprm:
+$membug1:
+$nested:
+$nfset:
+$nlfldsep:
+$nlinstr:
+$noloop1:
+$noloop2:
+$nulrsend:
+$ofmt:
+$ofmtfidl:
+$ofmts:
+$ofs1:
+$onlynl:
+$parse1:
+$parsefld:
+$prdupval:
+$range1:
+$rebrackloc:
+$regeq:
+$regexpbrack:
+$reindops:
+$reparse:
+$rsnul1nl:
+$rswhite:
+$setrec0:
+$sortglos:
+$splitargv:
+$splitvar:
+$strtod:
+$subback:
+$swaplns:
+$uparrfs:
+$wjposer1:
+$	test_class = "basic"
+$       test_in = "''test'.in"
+$	goto common_with_test_in_redir
+$!
+$gsubtst5:
+$	test_class = "basic"
+$       test_in = "''test'.in"
+$       prepend_error = 1
+$	goto common_with_test_in_redir
+$!
+$sprintfc:
+$	test_class = "charset_tests"
+$       test_in = "''test'.in"
+$	goto common_with_test_in_redir
+$!
+$backw:
+$fpat1:
+$fpat3:
+$fpat5:
+$fpat6:
+$fpatnull:
+$fsfwfs:
+$funlen:
+$fwtest:
+$fwtest2:
+$fwtest4:
+$fwtest5:
+$fwtest6:
+$fwtest7:
+$fwtest8:
+$gensub:
+$icasers:
+$igncdym:
+$igncfs:
+$indirectcall:
+$match3:
+$rebuf:
+$rsstart1:
+$sortfor:
+$split_after_fpat:
+$splitarg4:
+$       test_in = "''test'.in"
+$	test_class = "gawk_ext"
+$	goto common_with_test_in_redir
+$!
+$fwtest3:
+$       test_in = "fwtest2.in"
+$	test_class = "gawk_ext"
+$	goto common_with_test_in_redir
+$!
+$common_with_test_in_redir:
+$! common with 'test'.in redirected.
+$!
+$	echo "''test'"
+$	if f$search("sys$disk:[]_''test'.tmp2;*") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp2;*
+$	endif
+$	if f$search("sys$disk:[]_''test'.tmp;*") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;*
+$	endif
+$       if prepend_error .eq. 1
+$       then
+$           tmp_error = "_''test'.tmp"
+$           tmp_output = "_''test'.tmp2"
+$       else
+$           tmp_error = "_''test'.tmp2"
+$           tmp_output = "_''test'.tmp"
+$       endif
+$       prepend_error = 0
+$       set noOn
+$       define/user sys$error 'tmp_error'
+$	gawk -f 'test'.awk < 'test_in' >'tmp_output'
+$	gawk_status = $status
+$	set On
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	if f$search("sys$disk:[]_''test'.tmp2;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp2;2
+$	endif
+$       append _'test'.tmp2 _'test'.tmp
+$	if .not. gawk_status
+$       then
+$	    call exit_code 'gawk_status' _'test'.tmp
+$       endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;*,_'test'.tmp2;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$!
+$! Gawk treats < 'test_in' differently than just 'test_in' on VMS
+$! and some tests care about this.
+$common_with_test_input:
+$! common with 'test'.in
+$!
+$	echo "''test'"
+$	if f$search("sys$disk:[]_''test'.tmp;*") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;*
+$	endif
+$       set noOn
+$	gawk -f 'test'.awk 'test_in' >_'test'.tmp
+$	gawk_status = $status
+$	set On
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	if .not. gawk_status
+$       then
+$	    call exit_code 'gawk_status' _'test'.tmp
+$       endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$!
+$!
+$arrayind1:
+$	echo "''test'"
+$	test_class = "basic"
+$       define/user sys$error _'test'.tmp
+$	gawk -f 'test'.awk 'test'.in >_'test'.tmp2
+$       append _'test'.tmp2 _'test'.tmp
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;,_'test'.tmp2;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$indirectbuiltin: ! 4.1.2
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	! No shell simulation in gawk
+$	temp_file = "sys$disk:[]_'test'.tmp"
+$	if f$search(temp_file) .nes. "" then delete 'temp_file';*
+$	old_rm = rm
+$	rm = "continue ! "
+$	gawk -f 'test'.awk 'test'.in >_'test'.tmp
+$	rm = old_rm
+$	! gawk subprocesses creating new generation of stdout
+$	! instead of appending to open one.
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp;1
+$	if $status
+$	then
+$	    rm _'test'.tmp;*,x1.out;,x2.out;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$!
+$! Sourcesplit test
+$sourcesplit:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$       source1 = "BEGIN { a = 5;"
+$       source2 = "print a }"
+$	if f$search("sys$disk:[]_''test'.tmp2;*") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp2;*
+$	endif
+$       set noOn
+$       define/user sys$error _'test'.tmp
+$	gawk --source="''source1'" --source="''source2'" >_'test'.tmp2
+$	gawk_status = $status
+$	if f$search("sys$disk:[]_''test'.tmp2;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp2;2
+$	endif
+$	if .not. gawk_status then call exit_code 'gawk_status' _'test'.tmp
+$       set On
+$       append _'test'.tmp2 _'test'.tmp
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;,_'test'.tmp2;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$!
+$
+$! more common tests, without a data file: gawk -f 'test'.awk
+$ofmta:
+$  	if arch_name .eqs. "VAX"
+$	then
+$	    test_class = "basic"
+$	    skip_reason = "skipped on VAX"
+$	    gosub junit_report_skip
+$	    return
+$	endif
+$arrayref:
+$arryref2:
+$arrymem1:
+$arynasty:
+$arysubnm:
+$aryunasgn:
+$badassign1:
+$badbuild:
+$callparam:
+$closebad:
+$compare2:
+$concat2:
+$concat3:
+$concat5:
+$convfmt:
+$delargv:
+$delarpm2:
+$delarprm:
+$dynlj:
+$exit2:
+$fordel:
+$forref:
+$forsimp:
+$funsemnl:
+$getline3:
+$hsprint:
+$intest:
+$math:
+$memleak:
+$minusstr:
+$negrange:
+$nulinsrc:
+$numstr1:
+$nlstrina:
+$octsub:
+$ofmtstrnum:
+$paramtyp:
+$paramuninitglobal:
+$pcntplus:
+$printf1:
+$prt1eval:
+$rebt8b1:
+$regexprange:
+$regrange:
+$setrec1:
+$splitdef:
+$splitwht:
+$strnum1:
+$substr:
+$zero2:
+$zeroflag:
+$	test_class = "basic"
+$	goto common_without_test_in
+$isarrayunset:
+$	test_class = "extra"
+$	goto common_without_test_in
+$!
+$aarray1:
+$aasort:
+$aasorti:
+$arraysort:
+$delsub:
+$fpat2:
+$gensub2:
+$gnuops2:
+$gnuops3:
+$gnureops:
+$icasefs:
+$match1:
+$nondec:
+$patsplit:
+$procinfs:
+$regx8bit:
+$sortu:
+$strtonum:
+$switch2:
+$	test_class = "gawk_ext"
+$	goto common_without_test_in
+$!
+$asort:
+$asorti:
+$fnarydel:
+$fnparydl:
+$rebt8b2:
+$sort1:
+$	test_class = "charset_tests"
+$	goto common_without_test_in
+$!
+$common_without_test_in:
+$! common without 'test'.in
+$	echo "''test'"
+$	set noOn
+$	gawk -f 'test'.awk 2>&1 >_'test'.tmp
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$colonwarn:	echo "''test'"
+$	test_class = "gawk_ext"
+$	gawk -f 'test'.awk 1 < 'test'.in > _'test'.tmp
+$	gawk -f 'test'.awk 2 < 'test'.in > _'test'_2.tmp
+$	gawk -f 'test'.awk 3 < 'test'.in > _'test'_3.tmp
+$	if f$search("sys$disk:[]_''test'_%.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'_%.tmp;2
+$	endif
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	append _'test'_2.tmp,_'test'_3.tmp _'test'.tmp
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp;1
+$	if $status
+$	then
+$	    rm _'test'*.tmp;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$dbugeval:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	if f$getdvi("SYS$COMMAND", "TRM")
+$	then
+$	    set noOn
+$	    gawk --debug -f /dev/null < 'test'.in 2>&1 > _'test.tmp'
+$	    if .not. $status then call exit_code '$status' _'test'.tmp
+$	    set On
+$	    cmp 'test'.ok sys$disk:[]_'test'.tmp;1
+$	    if $status
+$	    then
+$		rm _'test'*.tmp;*
+$		gosub junit_report_pass
+$	    else
+$		gosub junit_report_fail_diff
+$	    endif
+$	else
+$	    skip_reason = "Skipping because not a terminal."
+$	    gosub junit_report_skip
+$	endif
+$	return
+$!
+$rsglstdin:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	set noOn
+$	define/user sys$input rsgetline.in
+$	if f$search("sys$disk:[]_''test'.tmp;*") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;*
+$	endif
+$	gawk -f rsgetline.awk 2>&1 > _'test'.tmp
+$       gawk_status = $status
+$	set On
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	if .not. gawk_status then call exit_code 'gawk_status' _'test'.tmp
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$genpot:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	set noOn
+$	gawk -f 'test'.awk --gen-pot 2>&1 >_'test'.tmp
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$paramasfunc1:
+$paramasfunc2:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	set noOn
+$	gawk -f 'test'.awk --posix 2>&1 >_'test'.tmp
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$watchpoint1:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	set noOn
+$	gawk "-D" -f 'test'.awk 'test'.in < 'test'.script 2>&1 >_'test'.tmp
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$!
+$!
+$fork:		! 4.0.2
+$fork2:		! 4.0.2
+$	test_class = "shlib"
+$	skip_reasons = "''test' not implemented on VMS"
+$	gosub junit_report_skip
+$	return
+$!
+$testext:
+$	echo "''test'"
+$	test_class = "shlib"
+$  	if arch_name .eqs. "VAX"
+$	then
+$	    skip_reason = "ODS-5 required"
+$	    gosub junit_report_skip
+$	    return
+$	endif
+$	set process/parse=extended ! ODS-5 only
+$	gawk "/^(@load|BEGIN)/,/^}/" [-.extension]'test'.c > _'test'.awk
+$	set noOn
+$	AWKLIBPATH_dir
+$	gawk -f _'test'.awk >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	gawk "{gsub(""no children"",""No child processes"")}1" -
+	    _'test'.tmp >_'test'.tmp1
+$	rm sys$disk:[]_'test'.tmp;*
+$	mv sys$disk:[]_'test'.tmp1 sys$disk:[]_'test'.tmp
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	set On
+$	return
+$!
+$double1:
+$double2:
+$	echo "''test'"
+$	test_class = "hardware"
+$	skip_reason = "skipped"
+$	gosub junit_report_skip
+$	return
+$
+$getline5:	echo "''test'"
+$	test_class = "basic"
+$	! Use of echo and rm inside the awk script makes it necessary
+$	! for some temporary redefinitions. The VMS gawk.exe also creates
+$	! multiple output files. Only the first contains the data.
+$	old_echo = echo
+$	old_rm = rm
+$	echo = "pipe write sys$output"
+$	rm = "!"
+$	gawk -f 'test'.awk > _'test'.tmp
+$	echo = old_echo
+$	rm   = old_rm
+$	delsym old_echo
+$	delsym old_rm
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp;1
+$	if $status
+$	then
+$	    rm _'test'.tmp;*,f.;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$msg:
+$	! first show gawk's version (without copyright notice)
+$	gawk --version >_msg.tmp
+$	gawk "FNR == 1 {print; exit}" _msg.tmp
+$	rm _msg.tmp;
+$	echo "Any output from ""DIF"" is bad news, although some differences"
+$	echo "in floating point values are probably benign -- in particular,"
+$	echo "some systems may omit a leading zero and the floating point"
+$	echo "precision may lead to slightly different output in a few cases."
+$	echo ""
+$	return
+$!
+$charset_msg_start:
+$ echo "======== Starting tests that can vary based on character set ========"
+$ echo "======== or locale support                                   ========"
+$ echo "*********************************************************************"
+$ echo "* Some or all of these tests may fail if you have inadequate or     *"
+$ echo "* missing locale support. At least en_US.UTF-8, ru_RU.UTF-8 and     *"
+$ echo "* ja_JP.UTF-8 are needed. However, if you see this message, then    *"
+$ echo "* this test script thinks you have what you need ...                *"
+$ echo "*********************************************************************"
+$ echo ""
+$	return
+$!
+$charset_msg_end:
+$ echo "======== Done with tests that can vary based on character set ========"
+$ echo "======== or locale support                                    ========"
+$ echo ""
+$	return
+$!
+$printlang:
+$! the default locale is C, with LC_LANG and LC_ALL left empty;
+$! showing that at the very beginning may cause some confusion about
+$! whether gawk requires those, so we don't run this as the first test
+$	gawk -f printlang.awk
+$	return
+$
+$poundbang:
+$	echo "''test'"
+$	test_class = "unix_tests"
+$	skip_reason = "not supported"
+$	gosub junit_report_skip
+$	return
+$!
+$pty1:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	skip_reason = "not supported"
+$	gosub junit_report_skip
+$	return
+$!
+$rscompat:
+$	echo "''test'"
+$	test_class = "basic"
+$	gawk --traditional -f 'test'.awk 'test'.in >_'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$
+$
+$messages:	echo "''test'"
+$	test_class = "basic"
+$	set noOn
+$	gawk -f 'test'.awk > _out2 >& _out3
+$	cmp out1.ok sys$disk:[]_out1.
+$	if $status then  rm _out1.;
+$	cmp out2.ok sys$disk:[]_out2.
+$	if $status then  rm _out2.;
+$	cmp out3.ok sys$disk:[]_out3.
+$	if $status
+$	then
+$	    rm _out3.;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	set On
+$	return
+$
+$argarray:	echo "argarray"
+$	test_class = "basic"
+$	copy sys$disk:[]argarray.in sys$disk:[]argarray.input
+$       purge sys$disk:[]argarray.input
+$	define/User TEST "test"			!this is useless...
+$	gawk -f argarray.awk ./argarray.input - >_argarray.tmp
+just a test
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp argarray.ok sys$disk:[]_argarray.tmp
+$	if $status
+$	then
+$	    rm _argarray.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$fstabplus:	echo "fstabplus"
+$	test_class = "basic"
+$	gawk -f fstabplus.awk >_fstabplus.tmp
+1		2
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp fstabplus.ok sys$disk:[]_fstabplus.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$longwrds:	echo "longwrds"
+$	test_class = "basic"
+$	gawk -v "SORT=sort sys$input: _longwrds.tmp" -f longwrds.awk longwrds.in >_NL:
+$	cmp longwrds.ok sys$disk:[]_longwrds.tmp
+$	if $status
+$	then
+$	    rm _longwrds.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$fieldwdth:	echo "fieldwdth"
+$	test_class = "gawk_ext"
+$	gawk -v "FIELDWIDTHS=2 3 4" "{ print $2}" >_fieldwdth.tmp
+123456789
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp fieldwdth.ok sys$disk:[]_fieldwdth.tmp
+$	if $status
+$	then
+$	    rm _fieldwdth.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$ignrcase:	echo "ignrcase"
+$	test_class = "gawk_ext"
+$	gawk -v "IGNORECASE=1" "{ sub(/y/, """"); print}" >_ignrcase.tmp
+xYz
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp ignrcase.ok sys$disk:[]_ignrcase.tmp
+$	if $status
+$	then
+$	    rm _ignrcase.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$regtest:
+$  echo "regtest"
+$  test_class = "extra"
+$  if f$search("regtest.com").eqs.""
+$  then
+$	skip_reason = "Not implemented on VMS"
+$	gosub junit_report_skip
+$  else
+$	echo "regtest"
+$	echo "Some of the output from regtest is very system specific, do not"
+$	echo "be distressed if your output differs from that distributed."
+$	echo "Manual inspection is called for."
+$	@regtest.com
+$	skip_reason = "Not implemented on VMS"
+$	gosub junit_report_skip
+$ endif
+$	return
+$
+$posix: echo "posix"
+$	test_class = "gawk_ext"
+$	gawk -f posix.awk >_posix.tmp
+1:2,3 4
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp posix.ok sys$disk:[]_posix.tmp
+$	if $status
+$	then
+$	    rm _posix.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$manyfiles:	echo "manyfiles"
+$	test_class = "gawk_ext"
+$!! this used to use a hard-coded value of 300 simultaneously open
+$!! files, but if our open file quota is generous enough then that
+$!! wouldn't exercise the ability to handle more than the maximum
+$!! number allowed at once
+$	f_cnt = 300
+$	chnlc = f$getsyi("CHANNELCNT")
+$	fillm = f$getjpi("","FILLM")
+$	if fillm.ge.chnlc then  fillm = chnlc - 1
+$	if fillm.ge.f_cnt then  f_cnt = fillm + 10
+$	if f$search("[.junk]*.*").nes."" then  rm [.junk]*.*;*
+$	if f$parse("[.junk]").eqs."" then  create/Dir/Prot=(O:rwed) [.junk]
+$	gawk -- "BEGIN {for (i = 1; i <= ''f_cnt'; i++) print i, i}" >_manyfiles.dat
+$	echo "(processing ''f_cnt' files; this may take quite a while)"
+$	set noOn	! continue even if gawk fails
+$	gawk -f manyfiles.awk _manyfiles.dat _manyfiles.dat
+$	define/User sys$error _NL:
+$	define/User sys$output _manyfiles.tmp
+$	search/Match=Nor/Output=_NL:/Log [.junk]*.* ""
+$!/Log output: "%SEARCH-S-NOMATCH, <filename> - <#> records" plus 1 line summary
+$	gawk -v "F_CNT=''f_cnt'" -f - _manyfiles.tmp
+$deck	!some input begins with "$"
+$4 != 2 {++count}
+END {if (NR != F_CNT+1 || count != 1) {print "\nFailed!"}}
+$eod
+$	set On
+$	skip_reason = "Test detection not implemented yet"
+$	gosub junit_report_skip
+$	rm _manyfiles.tmp;,_manyfiles.dat;,[.junk]*.*;*,[]junk.dir;
+$	return
+$
+$compare:	echo "compare"
+$	test_class = "basic"
+$	gawk -f compare.awk 0 1 compare.in >_compare.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp compare.ok sys$disk:[]_compare.tmp
+$	if $status
+$	then
+$	    rm _compare.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rs:		echo "rs"
+$	test_class = "basic"
+$	gawk -v "RS=" "{ print $1, $2}" rs.in >_rs.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp rs.ok sys$disk:[]_rs.tmp
+$	if $status
+$	then
+$	    rm _rs.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$fsbs:		echo "fsbs"
+$	test_class = "basic"
+$	gawk -f fsbs.awk fsbs.in >_fsbs.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp fsbs.ok sys$disk:[]_fsbs.tmp
+$	if $status
+$	then
+$	    rm _fsbs.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$inftest:	echo "inftest"
+$	test_class = "extra"
+$     !!  echo "This test is very machine specific..."
+$	set noOn
+$	gawk -f inftest.awk >_inftest.tmp
+$     !!  cmp inftest.ok sys$disk:[]_inftest.tmp	!just care that gawk doesn't crash...
+$	if $status
+$	then
+$	    rm _inftest.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	set On
+$	return
+$
+$getline2:	echo "getline2"
+$	test_class = "basic"
+$	gawk -f getline2.awk getline2.awk getline2.awk >_getline2.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp getline2.ok sys$disk:[]_getline2.tmp
+$	if $status
+$	then
+$	    rm _getline2.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rand:		echo "rand"
+$	test_class = "basic"
+$	echo "The following line should just be 19 random numbers between 1 and 100"
+$	echo ""
+$	gawk -f rand.awk
+$	skip_reason = "Test detection not implemented yet"
+$	gosub junit_report_skip
+$	return
+$
+$negexp:	echo "negexp"
+$	test_class = "basic"
+$	gawk "BEGIN { a = -2; print 10^a }" >_negexp.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp negexp.ok sys$disk:[]_negexp.tmp
+$	if $status
+$	then
+$	    rm _negexp.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$awkpath:	echo "awkpath"
+$	test_class = "basic"
+$	define/User AWK_LIBRARY [],[.lib]
+$	gawk -f awkpath.awk >_awkpath.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp awkpath.ok sys$disk:[]_awkpath.tmp
+$	if $status
+$	then
+$	    rm _awkpath.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$argtest:	echo "argtest"
+$	test_class = "gawk_ext"
+$	gawk -f argtest.awk -x -y abc >_argtest.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp argtest.ok sys$disk:[]_argtest.tmp
+$	if $status
+$	then
+$	    rm _argtest.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$badargs:	echo "badargs"
+$	test_class = "gawk_ext"
+$	on error then continue
+$	gawk -f 2>&1 >_badargs.too
+$	if f$search("sys$disk:[]_''test'.too;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.too;2
+$	endif
+$!	search/Match=Nor _badargs.too "patchlevel" /Output=_badargs.tmp
+$	gawk "/patchlevel/{next}; {gsub(""\"""",""'""); print}" <_badargs.too >_badargs.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp badargs.ok sys$disk:[]_badargs.tmp
+$	if $status
+$	then
+$	    rm _badargs.tmp;,_badargs.too;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$nonl:		echo "nonl"
+$	test_class = "basic"
+$	! This one might fail, depending on the tool used to unpack the
+$	! distribution.  Some will add a final newline if the file lacks one.
+$	AWKPATH_srcdir
+$	gawk --lint -f nonl.awk _NL: >_nonl.tmp 2>&1
+$	cmp nonl.ok sys$disk:[]_nonl.tmp
+$	if $status
+$	then
+$	    rm _nonl.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$defref:	echo "defref"
+$	test_class = "basic"
+$	set noOn
+$	AWKPATH_srcdir
+$	gawk --lint -f defref.awk >_defref.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _defref.tmp
+$	set On
+$	cmp defref.ok sys$disk:[]_defref.tmp
+$	if $status
+$	then
+$	    rm _defref.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$nofmtch:	echo "nofmtch"
+$	test_class = "basic"
+$	AWKPATH_srcdir
+$	gawk --lint -f nofmtch.awk >_nofmtch.tmp 2>&1
+$	cmp nofmtch.ok sys$disk:[]_nofmtch.tmp
+$	if $status
+$	then
+$	    rm _nofmtch.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$strftime:	echo "strftime"
+$	test_class = "gawk_ext"
+$	! this test could fail on slow machines or on a second boundary,
+$	! so if it does, double check the actual results
+$	! This test needs SYS$TIMEZONE_NAME and SYS$TIMEZONE_RULE
+$	! to be properly defined.
+$	! This test now needs GNV Corutils to work
+$	date_bin = "gnv$gnu:[bin]gnv$date.exe"
+$	if f$search(date_bin) .eqs. ""
+$	then
+$		skip_reason = "Need GNV Coreutils gnv$date.exe"
+$		gosub junit_report_skip
+$		return
+$	endif
+$	date := $'date_bin'
+$!!	date | gawk -v "OUTPUT"=_strftime.tmp -f strftime.awk
+$	now = f$time()
+$	wkd = f$extract(0,3,f$cvtime(now,,"WEEKDAY"))
+$	mon = f$cvtime(now,"ABSOLUTE","MONTH")
+$	mon = f$extract(0,1,mon) + f$edit(f$extract(1,2,mon),"LOWERCASE")
+$	day = f$cvtime(now,,"DAY")
+$	tim = f$extract(0,8,f$cvtime(now,,"TIME"))
+$!	Can not use tz as it shows up in the C environment.
+$	timezone = f$trnlnm("SYS$TIMEZONE_NAME")
+$	yr  = f$cvtime(now,,"YEAR")
+$	if f$trnlnm("FTMP").nes."" then  close/noLog ftmp
+$	open/Write ftmp strftime.in
+$	write ftmp wkd," ",mon," ",day," ",tim," ",timezone," ",yr
+$	close ftmp
+$	gawk -v "OUTPUT"=_strftime.tmp -f strftime.awk strftime.in
+$	set noOn
+$	cmp strftime.ok sys$disk:[]_strftime.tmp
+$	if $status
+$	then
+$	    rm _strftime.tmp;,strftime.ok;*,strftime.in;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	set On
+$	return
+$
+$litoct:	echo "litoct"
+$	test_class = "basic"
+$	gawk --traditional -f litoct.awk >_litoct.tmp
+ab
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp litoct.ok sys$disk:[]_litoct.tmp
+$	if $status
+$	then
+$	    rm _litoct.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$resplit:	echo "resplit"
+$	test_class = "gawk_ext"
+$	gawk -- "{ FS = "":""; $0 = $0; print $2 }" >_resplit.tmp
+a:b:c d:e:f
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp resplit.ok sys$disk:[]_resplit.tmp
+$	if $status
+$	then
+$	    rm _resplit.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$intprec:	echo "intprec"
+$	test_class = "basic"
+$	gawk -f intprec.awk >_intprec.tmp 2>&1
+$	cmp intprec.ok sys$disk:[]_intprec.tmp
+$	if $status
+$	then
+$	    rm _intprec.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$incdupe:   echo "''test'"
+$   test_class = "gawk_ext"
+$   set noOn
+$   gawk --lint -i inclib -i inclib.awk "BEGIN {print sandwich(""a"", ""b"", ""c"")}" > _'test'.tmp 2>&1
+$   if .not. $status then call exit_code '$status' _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$       rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$incdupe2:   echo "''test'"
+$   test_class = "gawk_ext"
+$   set noOn
+$   gawk --lint -f inclib -f inclib.awk >_'test'.tmp 2>&1
+$   if .not. $status then call exit_code '$status' _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$incdupe3:   echo "''test'"
+$   test_class = "gawk_ext"
+$   gawk --lint -f hello -f hello.awk >_'test'.tmp 2>&1
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   return
+$
+$incdupe4:   echo "''test'"
+$   test_class = "gawk_ext"
+$   set NoOn
+$   gawk --lint -f hello -i hello.awk >_'test'.tmp 2>&1
+$   if .not. $status then call exit_code '$status' _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$incdupe5:   echo "''test'"
+$   test_class = "gawk_ext"
+$   set NoOn
+$   gawk --lint -i hello -f hello.awk >_'test'.tmp 2>&1
+$   if .not. $status then call exit_code '$status' _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$incdupe6:   echo "''test'"
+$   test_class = "gawk_ext"
+$   set NoOn
+$   gawk --lint -i inchello -f hello.awk >_'test'.tmp 2>&1
+$   if .not. $status then call exit_code '$status' _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$incdupe7:   echo "''test'"
+$   test_class = "gawk_ext"
+$   set NoOn
+$   gawk --lint -f hello -i inchello >_'test'.tmp 2>&1
+$   if .not. $status then call exit_code '$status' _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$include2:   echo "''test'"
+$   test_class = "gawk_ext"
+$   gawk -i inclib "BEGIN {print sandwich(""a"", ""b"", ""c"")}" >_'test'.tmp 2>&1
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   return
+$
+$id:
+$symtab1:
+$symtab2:
+$symtab3:   echo "''test'"
+$   test_class = "gawk_ext"
+$   set noOn
+$   old_sort = sort
+$   sort = "@sys$disk:[-.vms]vms_sort.com"
+$   gawk -f 'test'.awk  >_'test'.tmp 2>&1
+$   if .not. $status then call exit_code '$status' _'test'.tmp
+$   sort = old_sort
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$symtab4:
+$symtab5:
+$symtab7:   echo "''test'"
+$   test_class = "gawk_ext"
+$   set noOn
+$   gawk -f 'test'.awk <'test'.in >_'test'.tmp 2>&1
+$   if .not. $status then call exit_code '$status' _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$symtab6:   echo "''test'"
+$   test_class = "gawk_ext"
+$   tmp_error = "sys$disk:[]__''test'.tmp2"
+$   set noOn
+$   if f$search(tmp_error) then delete 'tmp_error';*
+$   define/user sys$error 'tmp_error'
+$   gawk -d__'test'.tmp -f 'test'.awk
+$   gawk_status = $status
+$   if f$search("sys$disk:[]__''test'.tmp") .eqs. ""
+$   then
+$       copy 'tmp_error' sys$disk:[]__'test.tmp'
+$   else
+$       append 'tmp_error' sys$disk:[]__'test.tmp'
+$   endif
+$   if .not. gawk_status then call exit_code 'gawk_status' __'test'.tmp
+$   pipe search __'test'.tmp "ENVIRON","PROCINFO" /match=nor > _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*,__'test'.tmp;*,'tmp_error';*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$symtab8:   echo "''test'"
+$   test_class = "gawk_ext"
+$   set noOn
+$   gawk -d__'test'.tmp -f 'test'.awk 'test'.in > _'test'.tmp
+$   if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$   then
+$	delete sys$disk:[]_'test'.tmp;2
+$   endif
+$   pipe search __'test'.tmp "ENVIRON","PROCINFO","FILENAME" /match=nor > ___'test'.tmp
+$   convert/append ___'test'.tmp _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*,__'test'.tmp;*,___'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$
+$!-----------------------------------------------------------------------------------
+$! This awk script performs some cleanup by doing "system (rm testit.txt)". This is
+$! good for Unix but a pain for VMS as we must specify version number when deleting
+$! a file. The workaround is to define "rm" as a VMS comment and deleting the file
+$! outside of the awk script.
+$! Additionally each awk "system" call results in a new version of the output file.
+$! so we need to compensate for that as well.
+$!-----------------------------------------------------------------------------------
+$symtab9:   echo "''test'"
+$   test_class = "gawk_ext"
+$   old_rm = rm			! Remember old definition of rm
+$   rm = "!"			! Redefine rm to something harmless
+$   gawk -f 'test'.awk  >_'test'.tmp
+$   rm = old_rm			! Restore old value
+$   delsym old_rm
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp;-0	! -0 is the lowest version
+$   if $status
+$   then
+$	rm _'test'.tmp;*,testit.txt;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   return
+$!
+$symtab10:	echo "''test'"
+$   test_class = "gawk_ext"
+$   set noOn
+$   gawk "-D" -f 'test'.awk < 'test'.in > _'test'.tmp 2>&1
+$   if .not. $status then call exit_code '$status' _'test'.tmp
+$   cmp 'test'.ok sys$disk:[]_'test'.tmp
+$   if $status
+$   then
+$	rm _'test'.tmp;*
+$	gosub junit_report_pass
+$   else
+$	gosub junit_report_fail_diff
+$   endif
+$   set On
+$   return
+$!
+$ignrcas3:	echo "''test'"
+$   test_class = "extra"
+$   if f$search("sys$i18n_locale:el_gr_iso8859-7.locale") .nes. ""
+$   then
+$	define/user LC_ALL "el_gr_iso8859-7"
+$	define/user GAWKLOCALE "el_gr_iso8859-7"
+$	AWKPATH_srcdir
+$!	goto common_without_test_in
+$	skip_reason = "VMS EL_GR_ISO8859-7 locale fails test"
+$	gosub junit_report_skip
+$   else
+$	skip_reason = "EL_GR_ISO8859-7 locale not installed"
+$	gosub junit_report_skip
+$   endif
+$   return
+$!
+$nlstringtest:	echo "''test'"
+$   test_class = "extra"
+$   ! This locale does not seem to be available from the HPE I18N kit.
+$   ! So this test has not been run on VMS.
+$   if f$search("sys$i18n_locale:fr_fr_utf-8.locale") .nes. ""
+$   then
+$	define/user LC_ALL "fr_fr_utf-8"
+$	define/user GAWKLOCALE "fr_fr_utf-8"
+$	AWKPATH_srcdir
+$!	goto common_without_test_in
+$	skip_reason = "VMS FR_FR_UTF-8 locale test not validated."
+$	gosub junit_report_skip
+$   else
+$	skip_reason = "FR_FR_UTF-8 locale not installed"
+$	gosub junit_report_skip
+$   endif
+$   return
+$!
+$childin:	echo "''test'"
+$	test_class = "basic"
+$	cat = "type sys$input"
+$	gawk -f 'test'.awk < 'test'.in > _'test'.tmp
+$	delsym cat
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$noeffect:	echo "noeffect"
+$	test_class = "basic"
+$	AWKPATH_srcdir
+$	gawk --lint -f noeffect.awk >_noeffect.tmp 2>&1
+$	cmp noeffect.ok sys$disk:[]_noeffect.tmp
+$	if $status
+$	then
+$	    rm _noeffect.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$numsubstr:	echo "numsubstr"
+$	test_class = "basic"
+$	AWKPATH_srcdir
+$	gawk -f numsubstr.awk numsubstr.in >_numsubstr.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp numsubstr.ok sys$disk:[]_numsubstr.tmp
+$	if $status
+$	then
+$	    rm _numsubstr.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$prmreuse:	echo "prmreuse"
+$	test_class = "basic"
+$	if f$search("prmreuse.ok").eqs."" then  create prmreuse.ok
+$	gawk -f prmreuse.awk >_prmreuse.tmp
+$	cmp prmreuse.ok sys$disk:[]_prmreuse.tmp
+$	if $status
+$	then
+$	    rm _prmreuse.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$fflush:
+$	echo "fflush"
+$	test_class = "unix_tests"
+$	skip_reason = "not supported"
+$	gosub junit_report_skip
+$	return
+$!!fflush:	echo "fflush"
+$	! hopelessly Unix-specific
+$!!	@fflush.sh >_fflush.tmp
+$	cmp fflush.ok sys$disk:[]_fflush.tmp
+$	if $status
+$	then
+$	    rm _fflush.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$getlnhd:
+$	echo "getlnhd"
+$	!Expects a Unix shell
+$	test_class = "unix_tests"
+$	skip_reason = "Expects a Unix shell"
+$	gosub junit_report_skip
+$	return
+$!!getlnhd:	echo "getlnhd"
+$	gawk -f getlnhd.awk >_getlnhd.tmp
+$	cmp getlnhd.ok sys$disk:[]_getlnhd.tmp
+$	if $status
+$	then
+$	    rm _getlnhd.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$tweakfld:	echo "tweakfld"
+$	test_class = "basic"
+$	gawk -f tweakfld.awk tweakfld.in >_tweakfld.tmp
+$	if f$search("errors.cleanup").nes."" then  rm errors.cleanup;*
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp tweakfld.ok sys$disk:[]_tweakfld.tmp
+$	if $status
+$	then
+$	    rm _tweakfld.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$clsflnam:	echo "clsflnam"
+$	test_class = "basic"
+$	if f$search("clsflnam.ok").eqs."" then  create clsflnam.ok
+$	gawk -f clsflnam.awk clsflnam.in >_clsflnam.tmp 2>&1
+$	cmp clsflnam.ok sys$disk:[]_clsflnam.tmp
+$	if $status
+$	then
+$	    rm _clsflnam.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$mmap8k:	echo "mmap8k"
+$	test_class = "basic"
+$	gawk "{ print }" mmap8k.in >_mmap8k.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp mmap8k.in sys$disk:[]_mmap8k.tmp
+$	if $status
+$	then
+$	    rm _mmap8k.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$eofsplit:	echo "eofsplit"
+$	test_class = "basic"
+$	if f$search("eofsplit.ok").eqs."" then  create eofsplit.ok
+$	gawk -f eofsplit.awk >_eofsplit.tmp
+$	cmp eofsplit.ok sys$disk:[]_eofsplit.tmp
+$	if $status
+$	then
+$	    rm _eofsplit.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$back89:		! echo "back89"
+$	test_class = "basic"
+$       test_in = "''test'.in"
+$       prepend_error = 1
+$	goto common_with_test_in_redir
+$
+$tradanch:	echo "tradanch"
+$	test_class = "basic"
+$	if f$search("tradanch.ok").eqs."" then  create tradanch.ok
+$	gawk --traditional -f tradanch.awk tradanch.in >_tradanch.tmp
+$	cmp tradanch.ok sys$disk:[]_tradanch.tmp
+$	if $status
+$	then
+$	    rm _tradanch.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$reginttrad:	echo "''test'"
+$	test_class = "basic"
+$	gawk --traditional -r -f 'test'.awk >_'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$pid:		echo "pid"
+$	test_class = "unix_tests"
+$	pid = f$integer("%x" + f$getjpi("","PID"))
+$	ppid = f$integer("%x" + f$getjpi("","OWNER"))
+$	gawk -v "ok_pid=''pid'" -v "ok_ppid=''ppid'" -f pid.awk >_pid.tmp >& _NL:
+$	cmp pid.ok sys$disk:[]_pid.tmp
+$	if $status
+$	then
+$	    rm _pid.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$strftlng:	echo "strftlng"
+$	test_class = "unix_tests"
+$	define/User TZ "UTC"		!useless
+$	gawk -f strftlng.awk >_strftlng.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp strftlng.ok sys$disk:[]_strftlng.tmp
+$	if $status
+$	then
+$	    rm _strftlng.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$nfldstr:	echo "nfldstr"
+$	test_class = "basic"
+$	if f$search("nfldstr.ok").eqs."" then  create nfldstr.ok
+$	gawk "$1 == 0 { print ""bug"" }" >_nfldstr.tmp
+
+$	cmp nfldstr.ok sys$disk:[]_nfldstr.tmp
+$	if $status
+$	then
+$	    rm _nfldstr.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$nors:		echo "nors"
+$	test_class = "basic"
+$!! there's no straightforward way to supply non-terminated input on the fly
+$!!	@echo A B C D E | tr -d '\12' | $(AWK) '{ print $$NF }' - $(srcdir)/nors.in > _$@
+$!! so just read a line from sys$input instead
+$	gawk "{ print $NF }" - nors.in >_nors.tmp
+A B C D E
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp nors.ok sys$disk:[]_nors.tmp
+$	if $status
+$	then
+$	    rm _nors.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$reint:		echo "reint"
+$	test_class = "gawk_ext"
+$	gawk --re-interval -f reint.awk reint.in >_reint.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp reint.ok sys$disk:[]_reint.tmp
+$	if $status
+$	then
+$	    rm _reint.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$noparms:	echo "noparms"
+$	test_class = "basic"
+$	set noOn
+$	AWKPATH_srcdir
+$	gawk -f noparms.awk >_noparms.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _noparms.tmp
+$	set On
+$	cmp noparms.ok sys$disk:[]_noparms.tmp
+$	if $status
+$	then
+$	    rm _noparms.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$pipeio1:	echo "pipeio1"
+$	test_class = "unix_tests"
+$	cat = "TYPE"	!close enough, as long as we avoid .LIS default suffix
+$	define/User test1 []test1.
+$	define/User test2 []test2.
+$	gawk -f pipeio1.awk >_pipeio1.tmp
+$	rm test1.;,test2.;
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp pipeio1.ok sys$disk:[]_pipeio1.tmp
+$	if $status
+$	then
+$	    rm _pipeio1.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$pipeio2:
+$	test_class = "unix_tests"
+$	echo "pipeio2 skipped"
+$	! Expects the sed utility and Posix shell
+$	return
+$!!pipeio2:	echo "pipeio2"
+$	cat = "gawk -- {print}"
+$	tr  = "??"	!unfortunately, no trivial substitution available...
+$	gawk -v "SRCDIR=." -f pipeio2.awk >_pipeio2.tmp
+$	cmp pipeio2.ok sys$disk:[]_pipeio2.tmp
+$	if $status
+$	then
+$	    rm _pipeio2.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$clobber:	echo "clobber"
+$	test_class = "basic"
+$	gawk -f clobber.awk >_clobber.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp clobber.ok sys$disk:[]seq.
+$	if $status then  rm seq.;*
+$	cmp clobber.ok sys$disk:[]_clobber.tmp
+$	if $status
+$	then
+$	    rm _clobber.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$nasty:	echo "nasty"
+$	test_class = "basic"
+$	set noOn
+$	gawk -f nasty.awk >_nasty.tmp
+$	call fixup_LRL nasty.ok
+$	call fixup_LRL _nasty.tmp "purge"
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp nasty.ok sys$disk:[]_nasty.tmp
+$	if $status
+$	then
+$	    rm _nasty.tmp;
+$	    file = "lcl_root:[]nasty.ok"
+$	    if f$search(file) .nes. "" then rm 'file';*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	set On
+$	return
+$
+$nasty2:	echo "nasty2"
+$	test_class = "basic"
+$	set noOn
+$	gawk -f nasty2.awk >_nasty2.tmp
+$	call fixup_LRL nasty2.ok
+$	call fixup_LRL _nasty2.tmp "purge"
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp nasty2.ok sys$disk:[]_nasty2.tmp
+$	if $status
+$	then
+$	    rm _nasty2.tmp;
+$	    file = "lcl_root:[]nasty2.ok"
+$	    if f$search(file) .nes. "" then rm 'file';*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	set On
+$	return
+$
+$arrayparm:
+$arrayprm2:
+$fnaryscl:
+$opasnslf:
+$opasnidx:
+$printfbad1:
+$prmarscl:
+$subslash:
+$	test_class = "basic"
+$	goto test_error_capture1
+$!
+$functab1:
+$functab2:
+$functab3:
+$aadelete1:
+$aadelete2:
+$nastyparm:
+$	test_class = "gawk_ext"
+$	goto test_error_capture1
+$!
+$test_error_capture1:
+$	echo "''test'"
+$	set noOn
+$	gawk -f 'test'.awk >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$arynocls:	echo "arynocls"
+$	test_class = "basic"
+$	gawk -v "INPUT"=arynocls.in -f arynocls.awk >_arynocls.tmp
+$	cmp arynocls.ok sys$disk:[]_arynocls.tmp
+$	if $status
+$	then
+$	    rm _arynocls.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$getlnbuf:	echo "getlnbuf"
+$	test_class = "basic"
+$	gawk -f getlnbuf.awk getlnbuf.in >_getlnbuf.tmp
+$	gawk -f gtlnbufv.awk getlnbuf.in >_getlnbuf.too
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp getlnbuf.ok sys$disk:[]_getlnbuf.tmp
+$	if $status then  rm _getlnbuf.tmp;
+$	if f$search("sys$disk:[]_''test'.too;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.too;2
+$	endif
+$	cmp getlnbuf.ok sys$disk:[]_getlnbuf.too
+$	if $status
+$	then
+$	    rm _getlnbuf.too;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$lint:	echo "lint"
+$	test_class = "gawk_ext"
+$	AWKPATH_srcdir
+$	gawk -f lint.awk >_lint.tmp 2>&1
+$	cmp lint.ok sys$disk:[]_lint.tmp
+$	if $status
+$	then
+$	    rm _lint.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$lintold:	echo "lintold"
+$	test_class = "gawk_ext"
+$	AWKPATH_srcdir
+$       set noOn
+$	gawk -f lintold.awk --lint-old <lintold.in >_lintold.tmp 2>&1
+$       set on
+$	cmp lintold.ok sys$disk:[]_lintold.tmp
+$	if $status
+$	then
+$	    rm _lintold.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$ofmtbig:	echo "ofmtbig"
+$	test_class = "basic"
+$	set noOn
+$	gawk -f ofmtbig.awk ofmtbig.in >_ofmtbig.tmp 2>&1
+$	set On
+$	cmp ofmtbig.ok sys$disk:[]_ofmtbig.tmp
+$	if $status
+$	then
+$	    rm _ofmtbig.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$inetechu:	echo "inetechu"
+$	test_class = "inet"
+$	echo "this test is for establishing UDP connections"
+$	set noOn
+$	gawk -- "BEGIN {print """" |& ""/inet/udp/0/127.0.0.1/9""}"
+$	! report skip as we do not validate yet.
+$	skip_reason = "Test not validated."
+$	gosub junit_report_skip
+$	set On
+$	return
+$
+$inetecht:	echo "inetecht"
+$	test_class = "inet"
+$	echo "this test is for establishing TCP connections"
+$	set noOn
+$	gawk -- "BEGIN {print """" |& ""/inet/tcp/0/127.0.0.1/9""}"
+$	! report skip as we do not validate yet.
+$	skip_reason = "Test not validated."
+$	gosub junit_report_skip
+$	set On
+$	return
+$
+$inetdayu:	echo "inetdayu"
+$	test_class = "inet"
+$	echo "this test is for bidirectional UDP transmission"
+$	set noOn
+$	gawk -f - _NL:
+BEGIN { print "" |& "/inet/udp/0/127.0.0.1/13";
+	"/inet/udp/0/127.0.0.1/13" |& getline; print $0}
+$	! report skip as we do not validate yet.
+$	skip_reason = "Test not validated."
+$	gosub junit_report_skip
+$	set On
+$	return
+$
+$inetdayt:	echo "inetdayt"
+$	test_class = "inet"
+$	echo "this test is for bidirectional TCP transmission"
+$	set noOn
+$	gawk -f - _NL:
+BEGIN { print "" |& "/inet/tcp/0/127.0.0.1/13";
+	"/inet/tcp/0/127.0.0.1/13" |& getline; print $0}
+$	! report skip as we do not validate yet.
+$	skip_reason = "Test not validated."
+$	gosub junit_report_skip
+$	set On
+$	return
+$
+$redfilnm:	echo "redfilnm"
+$	test_class = "basic"
+$	gawk -f redfilnm.awk srcdir="." redfilnm.in >_redfilnm.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp redfilnm.ok sys$disk:[]_redfilnm.tmp
+$	if $status
+$	then
+$	    rm _redfilnm.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$leaddig:	echo "leaddig"
+$	test_class = "basic"
+$	gawk -v "x=2E"  -f leaddig.awk >_leaddig.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp leaddig.ok sys$disk:[]_leaddig.tmp
+$	if $status
+$	then
+$	    rm _leaddig.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$clos1way:
+$clos1way2:
+$clos1way3:
+$clos1way4:
+$clos1way5:
+$	test_class = "gawk_ext"
+$	echo "''test'"
+$	skip_reason = "Test not supported."
+$	gosub junit_report_skip
+$	return
+$#clos1way:	echo "''test'"
+$	gawk -f clos1way.awk >_clos1way.tmp
+$	cmp clos1way.ok sys$disk:[]_clos1way.tmp
+$	if $status
+$	then
+$	    rm _clos1way.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$shadow:	echo "shadow"
+$	test_class = "gawk_ext"
+$	set noOn
+$	AWKPATH_srcdir
+$	gawk --lint -f shadow.awk >_shadow.tmp 2>&1
+$	set On
+$	cmp shadow.ok sys$disk:[]_shadow.tmp
+$	if $status
+$	then
+$	    rm _shadow.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$lintwarn:	echo "lintwarn"
+$	test_class = "basic"
+$	set noOn
+$	AWKPATH_srcdir
+$	gawk --lint -f lintwarn.awk >_lintwarn.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _lintwarn.tmp
+$	set On
+$	cmp lintwarn.ok sys$disk:[]_lintwarn.tmp
+$	if $status
+$	then
+$	    rm _lintwarn.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$longsub:	echo "longsub"
+$	test_class = "basic"
+$	set noOn
+$	gawk -f longsub.awk longsub.in >_longsub.tmp
+$!! the records here are too long for DIFF to handle
+$!! so assume success as long as gawk doesn't crash
+$!!	call fixup_LRL longsub.ok
+$!!	call fixup_LRL _longsub.tmp "purge"
+$!!	cmp longsub.ok sys$disk:[]_longsub.tmp
+$	if $status
+$	then
+$	    rm _longsub.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	set On
+$	return
+$
+$arrayprm3:	echo "arrayprm3"
+$	test_class = "basic"
+$	gawk -f arrayprm3.awk arrayprm3.in >_arrayprm3.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp arrayprm3.ok sys$disk:[]_arrayprm3.tmp
+$	if $status
+$	then
+$	    rm _arrayprm3.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$arryref3:
+$arryref4:
+$arryref5:
+$aryprm1:
+$aryprm2:
+$aryprm3:
+$aryprm4:
+$aryprm5:
+$aryprm6:
+$aryprm7:
+$aryprm8:
+$aryprm9:
+$dfastress:
+$nfneg:
+$numindex:
+$scalar:
+$sclforin:
+$sclifin:
+$	echo "''test'"
+$	test_class = "basic"
+$	set noOn
+$	gawk -f 'test'.awk 'test'.in >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$sigpipe1:
+$	test_class = "basic"
+$	echo "''test'"
+$	skip_reason = "Test not supported."
+$	gosub junit_report_skip
+$	return
+$
+$   !
+$   ! For tests requiring exit code 2
+$   !
+$	echo "''test'"
+$	set noOn
+$	gawk -f 'test'.awk <'test'.in >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$exitval2:
+$	echo "''test'"
+$	test_class = "basic"
+$	cmdfile = "sys$disk:[]_''test'.com"
+$	if f$search(cmdfile) .nes. "" then delete 'cmdfile';*
+$	open/write xxx 'cmdfile'
+$	write xxx "$!'f$verify(0,0)'
+$	write xxx "$read := read"
+$	write xxx "$define/user sys$input sys$command"
+$	write xxx "$pipe read sys$input x ; write sys$output x ; exit %x003A151"
+$	close xxx
+$	! Unix exit 42 is VMS %x003A151
+$	read := "@''cmdfile' !"
+$	set noOn
+$	gawk -f 'test'.awk >_'test'.tmp
+$	if $status .ne. 1 then call exit_code '$status' _'test'.tmp
+$	delete/symbol/local read
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;*
+$	    if f$search(cmdfile) .nes. "" then rm 'cmdfile';*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$exitval3:
+$	echo "''test'"
+$	test_class = "basic"
+$	set noOn
+$	gawk -f 'test'.awk >_'test'.tmp
+$	! Unix exit 42 is VMS %x003A151
+$	if $status .ne. 1 then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$!
+$lc_num1:
+$fmttest:
+$backsmalls2:
+$	test_class = "charset_tests"
+$       test_in = "''test'.in"
+$       goto common_test_optional_input
+$!
+$fpat4:
+$regnul1:
+$regnul2:
+$crlf:
+$rsgetline:
+$rstest6:
+$	test_class = "gawk_ext"
+$       test_in = "''test'.in"
+$	goto common_with_test_input
+$!
+$delfunc:
+$fcall_exit2:
+$fnamedat:
+$fnarray2:
+$fnasgnm:
+$fnmisc:
+$gsubasgn:
+$gsubtest:
+$gsubtst2:
+$gsubtst4:
+$hex:
+$inputred:
+$nfloop:
+$prec:
+$prtoeval:
+$rstest1:
+$rstest2:
+$rstest3:
+$sortempty:
+$splitarr:
+$strcat1:
+$subsepnm:
+$unterm:
+$zeroe0:
+$	test_class = "basic"
+$common_test_optional_input:
+$	echo "''test'"
+$	set noOn
+$	gawk -f 'test'.awk 'test'.in >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$getline:	echo "getline"
+$	test_class = "basic"
+$	!Expects a Unix shell
+$	skip_reason = "Requires a Unix shell."
+$	gosub junit_report_skip
+$	return
+$!!getline:	echo "getline"
+$	gawk -f getline.awk getline.in >_getline.tmp
+$	cmp getline.ok sys$disk:[]_getline.tmp
+$	if $status
+$	then
+$	    rm _getline.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$gsubtst3:	echo "gsubtst3"
+$	test_class = "basic"
+$	gawk --re-interval -f gsubtst3.awk gsubtst3.in >_gsubtst3.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp gsubtst3.ok sys$disk:[]_gsubtst3.tmp
+$	if $status
+$	then
+$	    rm _gsubtst3.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$! FIXME: gawk generates an extra, empty output file while running this test...
+$iobug1:	echo "iobug1"
+$	test_class = "basic"
+$	cat = "TYPE sys$input:"
+$	true = "exit 1"	!success
+$		oldout = f$search("_iobug1.tmp;")
+$	gawk -f iobug1.awk iobug1.in >_iobug1.tmp
+$		badout = f$search("_iobug1.tmp;-1")
+$		if badout.nes."" .and. badout.nes.oldout then  rm 'badout'
+$	cmp iobug1.ok sys$disk:[]_iobug1.tmp
+$	if $status
+$	then
+$	    rm _iobug1.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rstest4:
+$	echo "rstest4"
+$	test_class = "basic"
+$	old_echo = echo
+$	echo = "write sys$output """
+$	gawk -f rstest4.awk >_rstest4.tmp1
+$	if f$search("sys$disk:[]_''test'.tmp1;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp1;2
+$	endif
+$	echo = old_echo
+$	gawk "{gsub(""< A>"",""<a>"")}1" _'test'.tmp1 >_'test'.tmp
+$	rm sys$disk:[]_'test'.tmp1;*
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp rstest4.ok sys$disk:[]_rstest4.tmp
+$!	if $status then  rm _rstest4.tmp;
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rstest5:
+$	echo "rstest5"
+$	test_class = "basic"
+$	old_echo = echo
+$	echo = "write sys$output """
+$	gawk -f rstest5.awk >_rstest5.tmp1
+$	if f$search("sys$disk:[]_''test'.tmp1;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp1;2
+$	endif
+$	echo = old_echo
+$	gawk "{gsub("" '"","""");gsub(""'"","""")}1" _'test'.tmp1 >_'test'.tmp
+$	rm sys$disk:[]_'test'.tmp1;*
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp rstest5.ok sys$disk:[]_rstest5.tmp
+$	if $status
+$	then
+$	    rm _rstest5.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$fcall_exit:
+$fnarray:
+$funsmnam:
+$paramdup:
+$paramres:
+$parseme:
+$synerr1:
+$synerr2:
+$	test_class = "basic"
+$	goto test_error_capture1
+$match2:
+$	test_class = "gawk_ext"
+$	goto test_error_capture1
+$!
+$uninit2:
+$uninit3:
+$uninit4:
+$uninit5:
+$uninitialized:
+$	echo "''test'"
+$	test_class = "basic"
+$	gawk --lint -f 'test'.awk 'test'.in >_'test'.tmp 2>&1
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$space:		echo "space"
+$	test_class = "unix_tests"
+$	set noOn
+$	gawk -f " " space.awk >_space.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _space.tmp
+$	set On
+$!	we get a different error from what space.ok expects
+$	gawk "{gsub(""file specification syntax error"", ""no such file or directory""); print}" -
+		_space.tmp >_space.too
+$	if f$search("sys$disk:[]_''test'.too;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.too;2
+$	endif
+$	rm _space.tmp;
+$	mv _space.too _space.tmp
+$	igncascmp space.ok sys$disk:[]_space.tmp
+$	if $status
+$	then
+$	    rm _space.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$posix2008sub:
+$printf0:
+$	echo "''test'"
+$	test_class = "basic"
+$	gawk --posix -f 'test'.awk >_'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rsnulbig:	echo "rsnulbig"
+$	test_class = "basic"
+$	if .not.pipeok
+$	then	echo "Without the PIPE command, ''test' can't be run."
+$		On warning then  return
+$		pipe echo "With PIPE, this will probably take quite a while..."
+$		On warning then  $
+$		pipeok = 1
+$	else	echo "This will probably take quite a while too..."
+$	endif
+$	set noOn
+$	pipe -
+	gawk -- "BEGIN {for (i = 1; i <= 128*64+1; i++) print ""abcdefgh123456\n""}" | -
+	gawk -- "BEGIN {RS = """"; ORS = ""\n\n""}; {print}" | -
+	gawk -- "/^[^a]/; END {print NR}" >_rsnulbig.tmp
+$	set On
+$	cmp rsnulbig.ok sys$disk:[]_rsnulbig.tmp
+$	if $status
+$	then
+$	    rm _rsnulbig.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rsnulbig2:	echo "rsnulbig2"
+$	test_class = "basic"
+$	if .not.pipeok
+$	then	echo "Without the PIPE command, ''test' can't be run."
+$		On warning then  return
+$		pipe echo "With PIPE, this will probably take quite a while..."
+$		On warning then  $
+$		pipeok = 1
+$	else	echo "This will probably take quite a while too..."
+$	endif
+$	set noOn
+$	pipe -
+	gawk -- "BEGIN {ORS=""""; n=""\n""; for (i=1; i<=10; i++) n=(n n); for (i=1; i<=128; i++) print n; print ""abc\n""}" | -
+	gawk -- "BEGIN {RS=""""; ORS=""\n\n"" }; {print}" | -
+	gawk -- "/^[^a]/; END {print NR}" >_rsnulbig2.tmp
+$	set On
+$	cmp rsnulbig2.ok sys$disk:[]_rsnulbig2.tmp
+$	if $status
+$	then
+$	    rm _rsnulbig2.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$backbigs1:	! 4.1.1
+$	test_class = "charset_tests"
+$	echo "''test'"
+$	! needs a locale not on VMS currently
+$	skip_reason = "Needs locale not on VMS Currently"
+$	gosub junit_report_skip
+$	return
+$!
+$backsmalls1:
+$	test_class = "charset_tests"
+$	gosub define_gawklocale
+$	if f$trnlnm("LC_ALL") .nes. "utf8-50"
+$	then
+$	    echo "''test'"
+$	    skip_reason = "Needs utf8-50 locale."
+$	    gosub junit_report_skip
+$	    return
+$	else
+$	    echo "''test'"
+$	endif
+$	gawk -f 'test'.awk 'test'.in >_'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$subamp:
+$wideidx:
+$widesub2:
+$widesub3:
+$	echo "''test'"
+$	test_class = "basic"
+$	gosub define_gawklocale
+$	gawk -f 'test'.awk 'test'.in >_'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$ignrcas2:
+$	test_class = "gawk_ext"
+$	goto wide_tests_1
+$wideidx2:
+$widesub:
+$widesub4:
+$	test_class = "basic"
+$	goto wide_tests_1
+$!
+$wide_tests_1:
+$	echo "''test'"
+$	gosub define_gawklocale
+$	gawk -f 'test'.awk >_'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$! This test is somewhat suspect for vms due to exit code manipulation
+$exitval1:	echo "exitval1"
+$	test_class = "basic"
+$	gawk -f exitval1.awk >_exitval1.tmp 2>&1
+$	if $status then  call exit_code '$status' _exitval1.tmp
+$	cmp exitval1.ok sys$disk:[]_exitval1.tmp
+$	if $status
+$	then
+$	    rm _exitval1.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$fsspcoln:	echo "fsspcoln"
+$	test_class = "basic"
+$	gawk -f fsspcoln.awk "FS=[ :]+" fsspcoln.in >_forspcoln.tmp
+$	if f$search("sys$disk:[]_forspcoln.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_forspcoln.tmp;2
+$	endif
+$	cmp fsspcoln.ok sys$disk:[]_forspcoln.tmp
+$	if $status
+$	then
+$	    rm _forspcoln.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$getlndir:	echo "getlndir"
+$	test_class = "gawk_ext"
+$	! assume we're running in the test subdirectory; we don't want to
+$	! perform a messy conversion of [] into its file specification
+$	gawk -v "SRCDIR=[-]test.dir" -f getlndir.awk >_getlndir.tmp
+$!	getlndir.ok expects "Is a directory", we see "is a directory"
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	igncascmp getlndir.ok sys$disk:[]_getlndir.tmp
+$	if $status
+$	then
+$	    rm _getlndir.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rsstart2:	echo "rsstart2"
+$	test_class = "gawk_ext"
+$	gawk -f rsstart2.awk rsstart1.in >_rsstart2.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp rsstart2.ok sys$disk:[]_rsstart2.tmp
+$	if $status
+$	then
+$	    rm _rsstart2.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rsstart3:
+$	echo "rsstart3"
+$	test_class = "gawk_ext"
+$!      rsstart3 with pipe fails,
+$!	presumeably due to PIPE's use of print file format
+$!	if .not.pipeok
+$!	then	echo "Without the PIPE command, ''test' can't be run."
+$!		On warning then  return
+$!		pipe echo "With PIPE, ''test' will finish quickly."
+$!		On warning then  $
+$!		pipeok = 1
+$!	endif
+$	! head rsstart1.in | gawk -f rsstart2.awk >_rsstart3.tmp
+$	! splitting this into two steps would make it the same as rsstart2
+$	set noOn
+$!$	pipe -
+$!	  gawk -- "FNR <= 10" rsstart1.in | -
+$!	  gawk -f rsstart2.awk >_rsstart3.tmp
+$!
+$	! DCL redirection to files is similar to pipes
+$	! But not quite the same.
+$	! DCL pipes are mailboxes, not the same as CRTL pipes,
+$	! So eventually someone should look into why CRTL pipes and
+$	! gawk are not always playing well together.
+$	gawk -- "FNR <= 10" rsstart1.in > _'test'.tmp1
+$	if f$search("sys$disk:[]_''test'.tmp1;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp1;2
+$	endif
+$	define/user sys$input _'test'.tmp1
+$	gawk -f rsstart2.awk >_rsstart3.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	set On
+$	cmp rsstart3.ok sys$disk:[]_rsstart3.tmp
+$	if $status
+$	then
+$	    rm _rsstart3.tmp;, _rsstart3.tmp1;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rtlen:
+$rtlen01:
+$	test_class = "unix_tests"
+$	goto rtlen_tests_1
+$rtlenmb:
+$	test_class = "charset_tests"
+$	goto rtlen_tests_1
+$!
+$rtlen_tests_1:
+$	echo "''test'"
+$	if .not.pipeok
+$	then	echo "Without the PIPE command, ''test' can't be run."
+$		On warning then  return
+$		pipe echo "With PIPE, ''test' will finish quickly."
+$		On warning then  $
+$		pipeok = 1
+$	endif
+$   f = "''test'.ok"
+$   if test.eqs."rtlen" .or. test.eqs."rtlenmb"
+$   then
+$	if test.eqs."rtlenmb" then  GAWKLOCALE = "en_US.UTF-8"
+$	pipe -
+	gawk -- "BEGIN {printf ""0\n\n\n1\n\n\n\n\n2\n\n""; exit}" | -
+	gawk -- "BEGIN {RS=""""}; {print length(RT)}" >_'test'.tmp
+$	if test.eqs."rtlenmb" then  delet_/Symbol/Local GAWKLOCALE
+$	if test.eqs."rtlenmb" then  f = "rtlen.ok"
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$   else
+$	call/Output=_rtlen01.tmp do__rtlen01
+$	! first test yields 1 instead of 0 due to forced newline
+$	gawk -- "FNR==1 {sub(""1"",""0"")}; {print}" _rtlen01.tmp >_rtlen01.too
+$	if f$search("sys$disk:[]_''test'.too;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.too;2
+$	endif
+$	rm _rtlen01.tmp;
+$	mv _rtlen01.too _rtlen01.tmp
+$   endif
+$	cmp 'f' sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$do__rtlen01: subroutine
+$	gawk = gawk !PIPE won't propagate local symbols from outer procedure
+$	pipe -
+	gawk -- "BEGIN {printf ""0""; exit}" | -
+	gawk -- "BEGIN {RS=""""}; {print length(RT)}"
+$	pipe -
+	gawk -- "BEGIN {printf ""0\n""; exit}" | -
+	gawk -- "BEGIN {RS=""""}; {print length(RT)}"
+$	pipe -
+	gawk -- "BEGIN {printf ""0\n\n""; exit}" | -
+	gawk -- "BEGIN {RS=""""}; {print length(RT)}"
+$ endsubroutine !do__rtlen01
+$
+$nondec2:	echo "nondec2"
+$	test_class = "gawk_ext"
+$	gawk --non-decimal-data -v "a=0x1" -f nondec2.awk >_nondec2.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp nondec2.ok sys$disk:[]_nondec2.tmp
+$	if $status
+$	then
+$	    rm _nondec2.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$nofile:	echo "nofile"
+$	test_class = "basic"
+$!	gawk "{}" no/such/file >_nofile.tmp 2>&1
+$!	nofile.ok expects no/such/file, but using that name in the test would
+$!	yield "file specification syntax error" instead of "no such file..."
+$	set noOn
+$	gawk "{}" no-such-file >_nofile.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _nofile.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	set On
+$!	restore altered file name
+$	gawk "{gsub(""no-such-file"", ""no/such/file""); print}" _nofile.tmp >_nofile.too
+$	if f$search("sys$disk:[]_''test'.too;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.too;2
+$	endif
+$	rm _nofile.tmp;
+$	mv _nofile.too _nofile.tmp
+$!	nofile.ok expects "No such file ...", we see "no such file ..."
+$	igncascmp nofile.ok sys$disk:[]_nofile.tmp
+$	if $status
+$	then
+$	    rm _nofile.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$binmode1:	echo "binmode1"
+$	test_class = "gawk_ext"
+$	gawk -v "BINMODE=3" "BEGIN { print BINMODE }" >_binmode1.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp binmode1.ok sys$disk:[]_binmode1.tmp
+$	if $status
+$	then
+$	    rm _binmode1.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$subi18n:	echo "''test'"
+$	test_class = "basic"
+$	define/User GAWKLOCALE "en_US.UTF-8"
+$	gawk -f 'test'.awk > _'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$rri1:
+$concat4:	echo "''test'"
+$	test_class = "basic"
+$	define/User GAWKLOCALE "en_US.UTF-8"
+$	gawk -f 'test'.awk 'test'.in > _'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$devfd:		echo "devfd"
+$	test_class = "gawk_ext"
+$	skip_reason = "Not supported."
+$	gosub junit_report_skip
+$	return
+$!!devfd:	echo "devfd"
+$	gawk 1 /dev/fd/4 /dev/fd/5 4< /devfd.in4 5< devfd.in5 >_devfd.tmp
+$	cmp devfd.ok sys$disk:[]_devfd.tmp
+$	if $status
+$	then
+$	    rm _devfd.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$devfd1:	echo "devfd1"
+$	test_class = "gawk_ext"
+$	skip_reason = "Not supported."
+$	gosub junit_report_skip
+$	return
+$!!devfd1:	echo "devfd1"
+$	gawk -f devfd1.awk 4< devfd.in1 5< devfd.in2 >_devfd1.tmp
+$	cmp devfd1.ok sys$disk:[]_devfd1.tmp
+$	if $status
+$	then
+$	    rm _devfd1.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$devfd2:	echo "devfd2"
+$	test_class = "gawk_ext"
+$	skip_reason = "Not supported."
+$	gosub junit_report_skip
+$	return
+$!!devfd2:	echo "devfd2"
+$! The program text is the '1' which will print each record. How compact can you get?
+$	gawk 1 /dev/fd/4 /dev/fd/5 4< /devfd.in1 5< devfd.in2 >_devfd2.tmp
+$	cmp devfd2.ok sys$disk:[]_devfd2.tmp
+$	if $status
+$	then
+$	    rm _devfd2.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$charasbytes:
+$! This test used "od" on Unix to verify the result. As this is not available
+$! we must try as best as possible using DUMP and SEARCH, instead of comparing
+$! to charasbytes.ok
+$!
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	gawk -b -f 'test'.awk 'test'.in >_'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	pipe dump/byte/block=count:1 _charasbytes.tmp | -
+		search sys$pipe /noout " 00 00 00 00 00 00 00 00 00 00 00 00 0A 5A 5A 5A"
+$	if $severity .eq. 1
+$	then
+$	    rm _'test'.tmp;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$mixed1:	echo "mixed1"
+$	test_class = "basic"
+$	set noOn
+$	gawk -f /dev/null --source "BEGIN {return junk}" >_mixed1.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _mixed1.tmp
+$	set On
+$	cmp mixed1.ok sys$disk:[]_mixed1.tmp
+$	if $status
+$	then
+$	    rm _mixed1.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$mtchi18n:	echo "mtchi18n"
+$	test_class = "basic"
+$	define/User GAWKLOCALE "ru_RU.UTF-8"
+$	gawk -f mtchi18n.awk mtchi18n.in >_mtchi18n.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp mtchi18n.ok sys$disk:[]_mtchi18n.tmp
+$	if $status
+$	then
+$	    rm _mtchi18n.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$reint2:	echo "reint2"
+$	test_class = "gawk_ext"
+$	gosub define_gawklocale
+$	gawk --re-interval -f reint2.awk reint2.in >_reint2.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp reint2.ok sys$disk:[]_reint2.tmp
+$	if $status
+$	then
+$	    rm _reint2.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$localenl:	echo "localenl"
+$	test_class = "unix_tests"
+$	skip_reason = "Not supported."
+$	gosub junit_report_skip
+$	return
+$!!localenl:	echo "localenl"
+$	! localenl.com does not exist.
+$	@localenl.com /Output=_localenl.tmp	! sh ./localenl.sh >tmp.
+$	cmp localenl.ok sys$disk:[]_localenl.tmp
+$	if $status
+$	then
+$	    rm _localenl.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$mbprintf1:	echo "''test'"
+$	test_class = "charset_tests"
+$! Makefile test exports this, but we don't want to impact user's environment
+$!	@GAWKLOCALE=en_US.UTF-8 ; export GAWKLOCALE ; \
+$!	Only always have "utf8-20"
+$	gosub define_gawklocale
+$	gawk -f mbprintf1.awk mbprintf1.in >_mbprintf1.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp mbprintf1.ok sys$disk:[]_mbprintf1.tmp
+$	if $status
+$	then
+$	    rm _mbprintf1.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$mbprintf2:
+$	echo "''test'"
+$	test_class = "charset_tests"
+$! Makefile test exports this, ...
+$!	@GAWKLOCALE=ja_JP.UTF-8 ; export GAWKLOCALE ; \
+$!	Only always have "utf8-20"
+$!      ja_jp_utf-8 is optional
+$	gosub define_gawklocale_ja_jp
+$	gawk -f 'test'.awk >_'test'.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$!
+$mbprintf3:
+$mbprintf4:
+$	echo "''test'"
+$	test_class = "charset_tests"
+$! Makefile test exports this
+$!	@GAWKLOCALE=en_US.UTF-8 ; export GAWKLOCALE ; \
+$!	Only always have "utf8-20"
+$	gosub define_gawklocale
+$       set noOn
+$	gawk -f 'test'.awk 'test'.in 2>&1 >_'test'.tmp
+$       set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$mbprintf5:
+$	echo "''test'"
+$	test_class = "charset_tests"
+$! Makefile test exports this
+$!	@GAWKLOCALE=en_US.UTF-8 ; export GAWKLOCALE ; \
+$!	Only always have "utf8-20"
+$	gosub define_gawklocale
+$       set noOn
+$	gawk -f 'test'.awk 'test'.in 2>&1 >_'test'.tmp
+$       set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    skip_reason = "Test not currently passing on VMS. UTF-8 issue."
+$	    gosub junit_report_skip
+$!	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$!
+$mbfw1:	echo "mbfw1"
+$	test_class = "charset_tests"
+$! Makefile test exports this, ...
+$	!define/User GAWKLOCALE "en_US.UTF-8"
+$	gosub define_gawklocale
+$	gawk -f mbfw1.awk mbfw1.in >_mbfw1.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp mbfw1.ok sys$disk:[]_mbfw1.tmp
+$	if $status
+$	then
+$	    rm _mbfw1.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$gsubtst6:	echo "gsubtst6"
+$	test_class = "basic"
+$	define/User GAWKLOCALE "C"
+$	gawk -f gsubtst6.awk >_gsubtst6.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp gsubtst6.ok sys$disk:[]_gsubtst6.tmp
+$	if $status
+$	then
+$	    rm _gsubtst6.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$mbstr1:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	gosub define_gawklocale
+$	AWKPATH_srcdir
+$	gawk -f 'test'.awk 2>&1 >_'test'.tmp
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$mbstr2:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	gosub define_gawklocale
+$	AWKPATH_srcdir
+$	gawk -f 'test'.awk < 'test'.in 2>&1 >_'test'.tmp
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$printhuge:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	gosub define_gawklocale
+$	AWKPATH_srcdir
+$	gawk -f 'test'.awk 2>&1 >_'test'.tmp
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$printfbad2:
+$printfbad3:
+$printfbad4:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	set noOn
+$	gawk --lint -f 'test'.awk 'test'.in >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$fmtspcl:	echo "fmtspcl"
+$	test_class = "hardware"
+$	skip_reason = "Not supported."
+$	gosub junit_report_skip
+$	return
+$!!fmtspcl:
+$! fmtspcl ought to work if gawk was compiled to use IEEE floating point
+$	if floatmode.lt.0 then  gosub calc_floatmode
+$	if floatmode.lt.2
+$	then
+$	    echo "fmtspcl: not supported"
+$	    ! report skip ...
+$	    return
+$	endif
+$	echo "fmtspcl"
+$	gawk -f fmtspcl.awk >_fmtspcl.tmp 2>&1
+$	cmp fmtspcl.ok sys$disk:[]_fmtspcl.tmp
+$	if $status
+$	then
+$	    rm _fmtspcl.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$intformat:	echo "intformat"
+$	test_class = "hardware"
+$! note: we use the Alpha value for D_float; VAX value is slightly higher
+$!	due to not losing precision by being processed via G_float
+$	huge_0 = "1.70141183460469213e+38"		! D_float
+$	huge_1 = "8.98846567431157854e+307"		! G_float
+$	huge_2 = "1.79769313486231570e+308"		! IEEE T_float
+$	if floatmode.lt.0 then  gosub calc_floatmode
+$	hugeval = huge_'floatmode'
+$	set noOn
+$	gawk -v "HUGEVAL=''hugeval'" -f intformat.awk >_intformat.tmp 2>&1
+$	set On
+$	cmp intformat.ok sys$disk:[]_intformat.tmp
+$	if $status
+$	then
+$	    rm _intformat.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$! ugh... BEGINFILE functionality works fine, but test is heavily Unix-centric
+$beginfile1:	echo "beginfile1"
+$	test_class = "gawk_ext"
+$	! complications:  "." is a filename, not the current directory
+$	!  (even "[]" is actually "[].", that same filename, but we can
+$	!  handle hacking it more easily);
+$	!  "no/such/file" yields syntax error rather than no such file
+$	!  when subdirectories no/ and no/such/ don't exist;
+$	!  vms test suite doesn't generate Makefile;
+$	!  "is a directory" and "no such file" aren't capitalized
+$	! gawk -f beginfile1.awk beginfile1.awk . -
+$	!   ./no/such/file "Makefile" >_beginfile1.tmp 2>&1
+$	! And NFS on ODS2 encodes the case in the filename with
+$	! the $ character switching case.
+$	makefile_in = "Makefile.in"
+$	makefile_in_nfs_ods2 = "$M$akefile.in"
+$	if f$search(makefile_in_nfs_ods2) .nes. ""
+$	then
+$	    makefile_in = makefile_in_nfs_ods2
+$	endif
+$	gawk -f beginfile1.awk beginfile1.awk [] -
+	 ./no-such-file "''makefile_in'" >_beginfile1.tmp 2>&1
+$	    gawk -f - _beginfile1.tmp >_beginfile1.too
+{ if (gsub("\\[\\]",".")) gsub("no such file or directory","is a directory")
+  gsub("no-such-file","file"); gsub("Makefile.in","Makefile");
+  gsub("\\$M\\$akefile.in","Makefile"); print }
+$	if f$search("sys$disk:[]_''test'.too;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.too;2
+$	endif
+$	rm _beginfile1.tmp;
+$	mv _beginfile1.too _beginfile1.tmp
+$	igncascmp beginfile1.ok sys$disk:[]_beginfile1.tmp
+$	if $status
+$	then
+$	    rm _beginfile1.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$dumpvars: echo "dumpvars"
+$	test_class = "gawk_ext"
+$	gawk --dump-variables 1 <dumpvars.in >_NL: 2>&1
+$	mv awkvars.out _dumpvars.tmp
+$	gawk "!/ENVIRON|PROCINFO/" _dumpvars.tmp >_dumpvars.tmp1
+$	if f$search("sys$disk:[]_''test'.tmp1;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp1;2
+$	endif
+$	rm sys$disk:[]_dumpvars.tmp;*
+$	mv sys$disk:[]_dumpvars.tmp1 sys$disk:[]_dumpvars.tmp
+$	cmp dumpvars.ok sys$disk:[]_dumpvars.tmp
+$	if $status
+$	then
+$	    rm _dumpvars.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$!
+$profile0:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$	gawk --profile=_ap-'test'.out -f 'test'.awk 'test'.in > _NL:
+$	! sed <awkprof.out 1,2d >_profile3.tmp
+$	gawk "NR>2" _ap-'test'.out > sys$disk:[]_awkprof.out
+$	if f$search("sys$disk:[]_awkprof.out;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_awkprof.out;2
+$	endif
+$	convert/fdl=nla0: _awkprof.out sys$disk:[]_'test'.tmp
+$	convert/fdl=nla0: 'test'.ok _'test'.ok
+$	cmp _'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;*,_'test'.ok;*,_ap-'test'.out;,_awkprof.out;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$profile1: echo "''test'"
+$	test_class = "gawk_ext"
+$ ! FIXME: for both gawk invocations which pipe output to SORT,
+$ ! two output files get created; the top version has real output
+$ ! but there's also an empty lower version.
+$!	oldout = f$search("_''test'.tmp1")
+$	gawk -f xref.awk dtdgport.awk >  _'test'.out1
+$	gawk --pretty-print=ap-'test'.out -f xref.awk
+$	gawk -f ap-'test'.out dtdgport.awk > _'test'.out2
+$	cmp _'test'.out1 sys$disk:[]_'test'.out2
+$	if $status
+$	then
+$	    rm ap-'test'.out;*, _'test'.out%;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$profile2:  echo "''test'"
+$	test_class = "gawk_ext"
+$	gawk --profile -v "sortcmd=SORT sys$input: sys$output:" -
+			-f xref.awk dtdgport.awk > _NL:
+$	! sed <awkprof.out 1,2d >_profile2.tmp
+$	sumslp awkprof.out /update=sys$input: /output=_'test'.tmp
+-1,2
+/
+$	rm awkprof.out;
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$profile4:
+$profile5:
+$profile8:
+$	echo "''test'"
+$	test_class = "gawk_ext"
+$       if f$search("_''test'.tmp1") .nes. "" then delete _'test'.tmp1;*
+$	define/user GAWK_NO_PP_RUN 1
+$	gawk --pretty-print=_'test'.tmp1 -f 'test'.awk > _NL:
+$	convert/fdl=nla0: _'test'.tmp1 sys$disk:[]_'test'.tmp
+$	convert/fdl=nla0: 'test'.ok _'test'.ok
+$	cmp sys$disk:[]_'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;*,_'test'.ok;*,_'test'.tmp1;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$profile6:
+$profile7:
+$profile3: echo "''test'"
+$	test_class = "gawk_ext"
+$       if f$search("''test'.tmp1") .nes. "" then delete 'test'.tmp1;*
+$	gawk --profile=ap-'test'.out -f 'test'.awk > _NL:
+$	! sed <awkprof.out 1,2d >_profile3.tmp
+$	if f$search("sys$disk:[]_''test'.tmp1;*") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp1;*
+$	endif
+$	gawk "NR>2" ap-'test'.out > sys$disk:[]_'test'.tmp1
+$	if f$search("sys$disk:[]_''test'.tmp1;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp1;2
+$	endif
+$	convert/fdl=nla0: _'test'.tmp1 sys$disk:[]_'test'.tmp
+$	convert/fdl=nla0: 'test'.ok _'test'.ok
+$	cmp _'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;*,_'test'.ok;*,_'test'.tmp1;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$next:	echo "next"
+$	test_class = "gawk_ext"
+$	set noOn
+$	gawk "{next}" _NL:                                   > _next.tmp 2>&1
+$	gawk "function f() {next}; {f()}" _NL:               >>_next.tmp 2>&1
+$	gawk "function f() {next}; BEGIN{f()}" _NL:          >>_next.tmp 2>&1
+$	gawk "function f() {next}; {f()}; END{f()}" _NL:     >>_next.tmp 2>&1
+$	gawk "function f() {next}; BEGINFILE{f()}" _NL:      >>_next.tmp 2>&1
+$	gawk "function f() {next}; {f()}; ENDFILE{f()}" _NL: >>_next.tmp 2>&1
+$	set On
+$	cmp next.ok sys$disk:[]_next.tmp
+$	if $status
+$	then
+$	    rm _next.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$exit:	echo "exit"
+$	test_class = "gawk_ext"
+$	if .not.pipeok
+$	then	echo "Without the PIPE command, ''test' can't be run."
+$		On warning then  return
+$		pipe echo "PIPE command is available; running exit test"
+$		On warning then  $
+$		pipeok = 1
+$	else
+$	    echo "PIPE command is available; running exit test"
+$	endif
+$	set noOn
+$	call/Output=_exit.tmp do__exit
+$	set On
+$	cmp exit.ok sys$disk:[]_exit.tmp
+$	if $status
+$	then
+$	    rm _exit.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$do__exit: subroutine
+$	gawk = gawk !PIPE won't propagate local symbols from outer procedure
+$	x = "BEGIN{print 1; exit; print 2}; NR>1{print}; END{print 3; exit; print 4}"
+$	pipe gawk -- "BEGIN { print ""a\nb"" }" | gawk -- "''x'"
+$	echo "-- 1"
+$	x = "function f(){exit}; END{print NR;f();print NR}"
+$	pipe gawk -- "BEGIN { print ""a\nb"" }" | gawk -- "''x'"
+$	echo "-- 2"
+$	x = "function f(){exit}; NR>1 {f()}; END{print NR; f();print NR}"
+$	pipe gawk -- "BEGIN { print ""a\nb"" }" | gawk -- "''x'"
+$	echo "-- 3"
+$	x = "function f(){exit}; NR>1 {f()}; END{print NR;print NR}"
+$	pipe gawk -- "BEGIN { print ""a\nb"" }" | gawk -- "''x'"
+$	echo "-- 4"
+$	x = "function f(){exit}; BEGINFILE {f()}; NR>1 {f()}; END{print NR}"
+$	pipe gawk -- "BEGIN { print ""a\nb"" }" | gawk -- "''x'"
+$	echo "-- 5"
+$!	Ugh; extra quotes are needed here to end up with """" after "''y'"
+$!	expansion and finally "" when gawk actually sees its command line.
+$	y = "function strip(f) { sub(/.*\//, """""""", f); return f };"
+$	x = "BEGINFILE{if(++i==1) exit;}; END{print i, strip(FILENAME)}"
+$	gawk "''y'''x'" /dev/null exit.sh
+$	echo "-- 6"
+$	x = "BEGINFILE{if(++i==1) exit;}; ENDFILE{print i++}; END{print i, strip(FILENAME)}"
+$	gawk "''y'''x'" /dev/null exit.sh
+$	echo "-- 7"
+$	x = "function f(){exit}; BEGINFILE{i++ && f()}; END{print NR,strip(FILENAME)}"
+$	gawk "''y'''x'" /dev/null exit.sh
+$	echo "-- 8"
+$	x = "function f(){exit}; BEGINFILE{i++ && f()}; ENDFILE{print i}; END{print NR,strip(FILENAME)}"
+$	gawk "''y'''x'" /dev/null exit.sh
+$	echo "-- 9"
+$	x = "function f(){exit}; BEGINFILE{i++}; ENDFILE{f(); print i}; END{print NR,strip(FILENAME)}"
+$	gawk "''y'''x'" /dev/null exit.sh
+$	echo "-- 10"
+$	x = "function f(){exit}; BEGINFILE{i++}; ENDFILE{i>1 && f(); print i, strip(FILENAME)}"
+$	gawk "''y'''x'" /dev/null exit.sh
+$	echo "-- 11"
+$ endsubroutine !do__exit
+$
+$vms_cmd:	echo "vms_cmd"
+$	test_class = "vms_tests"
+$	if f$search("vms_cmd.ok").eqs.""
+$	then create vms_cmd.ok
+World!
+$	endif
+$	gawk /Commands="BEGIN { print ""World!"" }" _NL: /Output=_vms_cmd.tmp
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp vms_cmd.ok sys$disk:[]_vms_cmd.tmp
+$	if $status
+$	then
+$	    rm _vms_cmd.tmp;,vms_cmd.ok;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$vms_io1:	echo "vms_io1"
+$	test_class = "vms_tests"
+$	if f$search("vms_io1.ok").eqs.""
+$	then create vms_io1.ok
+Hello
+$	endif
+$ !	define/User dbg$input sys$command:
+$	gawk -f - >_vms_io1.tmp
+# prior to 3.0.4, gawk crashed doing any redirection after closing stdin
+BEGIN { print "Hello" >"/dev/stdout" }
+$	if f$search("sys$disk:[]_''test'.tmp;2") .nes. ""
+$	then
+$	    delete sys$disk:[]_'test'.tmp;2
+$	endif
+$	cmp vms_io1.ok sys$disk:[]_vms_io1.tmp
+$	if $status
+$	then
+$	    rm _vms_io1.tmp;,vms_io1.ok;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$
+$vms_io2:	echo "vms_io2"
+$	test_class = "vms_tests"
+$	if f$search("vms_io2.ok").eqs.""
+$	then create vms_io2.ok
+xyzzy
+$	endif
+$	! VAXCRTL created all files in stream_LF format unless explicitly
+$	! overridden by the program; with DECC$SHR, a new version of an
+$	! existing file inherits the previous version's record format;
+$	! for gawk versions older than 3.1.7, that resulted in
+$	! "can't redirect to `File' (invalid record attributes)"
+$	! when an awk program used >"File" (internally, not on command line)
+$	! and File already existed as a batch log file or PIPE output file
+$	create /FDL=sys$input: _vms_io2.vfc
+file
+  organization sequential
+record
+  format VFC	! variable with fixed control area (default size 2 bytes)
+  carriage_control print
+$	set noOn
+$ !	define/User dbg$input sys$command:
+$	gawk -- "BEGIN { print ""xyzzy"" >""_vms_io2.vfc"" }" >_vms_io2.tmp 2>&1
+$	set On
+$	cmp _NL: sys$disk:[]_vms_io2.tmp
+$	if $status then  rm _vms_io2.tmp;
+$	cmp vms_io2.ok sys$disk:[]_vms_io2.vfc
+$	if $status
+$	then
+$	    rm _vms_io2.vfc;*,vms_io2.ok;*
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$!
+$inplace1:
+$inplace2:
+$	echo "''test'"
+$  	if arch_name .eqs. "VAX"
+$	then
+$	    skip_reason = "ODS-5 required"
+$	    gosub junit_report_skip
+$	    return
+$	endif
+$	set process/parse=extended ! ODS-5 only
+$	test_class = "shlib"
+$	filefunc_file = "[-]gawkapi.o"
+$	open/write awkfile _'test'.awk
+$	write awkfile "@load ""inplace"""
+$!	write awkfile "BEGIN {print ""before""}"
+$	write awkfile "   {gsub(/foo/, ""bar""); print}"
+$!	write awkfile "END {print ""after""}"
+$	close awkfile
+$	copy inplace^.1.in _'test'.1
+$	copy inplace^.2.in _'test'.2
+$	set noOn
+$	AWKLIBPATH_dir
+$	gawk -f _'test'.awk _'test'.1 <inplace.in >_'test'.1.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.1.tmp
+$	AWKLIBPATH_dir
+$	gawk -f _'test'.awk _'test'.2 <inplace.in >_'test'.2.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.2.tmp
+$	set On
+$	cmp 'test'.1.ok sys$disk:[]_'test'.1.tmp
+$	if $status then rm _'test'.1.tmp;,_'test'.1;
+$	cmp 'test'.2.ok sys$disk:[]_'test'.2.tmp
+$	if $status
+$	then
+$	    rm _'test'.2.tmp;,_'test'.2;,_'test'.awk;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$filefuncs:
+$	echo "''test'"
+$	test_class = "shlib"
+$	filefunc_file = "[-]gawkapi.o"
+$	open/write gapi 'filefunc_file'
+$	close gapi
+$	set noOn
+$	AWKLIBPATH_dir
+$	gawk -v builddir="sys$disk:[-]" -
+	    -f 'test'.awk 'test'.in >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	if f$search(filefunc_file) .nes. "" then rm 'filefunc_file';*
+$	return
+$!
+$fnmatch:
+$functab4:
+$ordchr:
+$revout:
+$revtwoway:
+$time:
+$	echo "''test'"
+$	test_class = "shlib"
+$	filefunc_file = "[-]gawkapi.o"
+$	open/write gapi 'filefunc_file'
+$	close gapi
+$	set noOn
+$	AWKLIBPATH_dir
+$	gawk -f 'test'.awk 'test'.in >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	if f$search(filefunc_file) .nes. "" then rm 'filefunc_file';*
+$	return
+$!
+$ordchr2:
+$	echo "''test'"
+$	test_class = "shlib"
+$	filefunc_file = "[-]gawkapi.o"
+$	open/write gapi 'filefunc_file'
+$	close gapi
+$	set noOn
+$	AWKLIBPATH_dir
+$	gawk --load ordchr "BEGIN {print chr(ord(""z""))}" > _'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	if f$search(filefunc_file) .nes. "" then rm 'filefunc_file';*
+$	return
+$
+$!
+$rwarray:
+$	echo "''test'"
+$	test_class = "shlib"
+$	set noOn
+$	AWKLIBPATH_dir
+$	gawk -f 'test'.awk 'test'.in >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	set On
+$	cmp orig.out new.out
+$	if $status
+$	then
+$	    open/append tout _'test'.tmp
+$	    write tout "old and new are equal - GOOD"
+$	    close tout
+$	endif
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;,orig.bin;,orig.out;,new.out;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	return
+$!
+$readdir:
+$fts:
+$	echo "''test'"
+$	test_class = "shlib"
+$	set noOn
+$	AWKLIBPATH_dir
+$	gawk -f 'test'.awk >_'test'.tmp 2>&1
+$	if .not. $status
+$	then
+$	    call exit_code '$status' _'test'.tmp
+$	    write sys$output _'test'.tmp
+$	    gosub junit_report_fail_diff
+$	else
+$	    gosub junit_report_pass
+$	    if f$search("_''test'.tmp") .nes. "" then rm _'test'.tmp;*
+$	    if f$search("_''test'.") .nes. "" then rm _'test'.;*
+$	endif
+$	set On
+$	return
+$!
+$readfile:
+$	echo "''test'"
+$	test_class = "shlib"
+$	if f$search("sys$disk:[-]readfile.exe") .eqs. ""
+$	then
+$	    echo "Readfile extension not currently building on VMS."
+$	    skip_reason = "Readfile not building on VMS"
+$	    gosub junit_report_skip
+$	    return
+$	else
+$	    echo "Surprise! Found the readfile extension so attempting test."
+$	endif
+$	set noOn
+$	AWKLIBPATH_dir
+$	gawk -l readfile -
+	    "BEGIN {printf-f ""%s"", readfile("Makefile.in")}" >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	cmp Makefile.in sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	    copy Makefile.in 'test'.ok
+$	endif
+$	set On
+$	return
+$!
+$readfile2:
+$	echo "''test'"
+$	test_class = "shlib"
+$	if f$search("sys$disk:[-]readfile.exe") .eqs. ""
+$	then
+$	    echo "Readfile extension not currently building on VMS."
+$	    skip_reason = "Readfile not building on VMS"
+$	    gosub junit_report_skip
+$	    return
+$	else
+$	    echo "Surprise! Found the readfile extension so attempting test."
+$	endif
+$	set noOn
+$	AWKLIBPATH_dir
+$	gawk -f 'test'.awk 'test'.awk >_'test'.tmp 2>&1
+$	if .not. $status then call exit_code '$status' _'test'.tmp
+$	cmp 'test'.ok sys$disk:[]_'test'.tmp
+$	if $status
+$	then
+$	    rm _'test'.tmp;
+$	    gosub junit_report_pass
+$	else
+$	    gosub junit_report_fail_diff
+$	endif
+$	set On
+$	return
+$
+$clean:
+$	if f$search("_*.tmp")	 .nes."" then  rm _*.tmp;*
+$	if f$search("_*.out")	 .nes."" then  rm _*.out;*
+$	if f$search("_*.ok")	 .nes."" then  rm _*.ok;*
+$	if f$search("_*.1")	 .nes."" then  rm _*.1;*
+$	if f$search("_*.2")	 .nes."" then  rm _*.2;*
+$	if f$search("_*.awk")	 .nes."" then  rm _*.awk;*
+$	if f$search("_*.too")	 .nes."" then  rm _*.too;*
+$	if f$search("awkprofile.out") .nes."" then  rm awkprofile.out;*
+$	if f$search("out%.")	 .nes."" then  rm out%.;*
+$	if f$search("strftime.in").nes."" then  rm strftime.in;*
+$	if f$search("strftime.ok").nes."" then  rm strftime.ok;*
+$	if f$search("test%.")	 .nes."" then  rm test%.;*
+$	if f$search("seq.")	 .nes."" then  rm seq.;*
+$	if f$search("_pid.in")	 .nes."" then  rm _pid.in;*
+$	if f$search("[.junk]*.*").nes."" then  rm [.junk]*.*;*
+$	if f$parse("[.junk]")	 .nes."" then  rm []junk.dir;1
+$	if f$search("_vms_io2.vfc")	 .nes."" then  rm _vms_io2.vfc;*
+$	return
+$
+$! try to determine what type of double precision floating point gawk uses
+$calc_floatmode:
+$	! this is fragile; it might break if gawk changes overflow handling
+$	Set noOn
+$	gawk -- "BEGIN {print 10^308}" >_NL: 2>&1
+$	if $status
+$	then	floatmode = 2		! IEEE T_float
+$	else	gawk -- "BEGIN {print 10^307}" >_NL: 2>&1
+$		if $status
+$		then	floatmode = 1	! Alpha/VAX G_float
+$		else	floatmode = 0	! VAX D_float
+$		endif
+$	endif
+$	Set On
+$	return
+$
+$! assign temporary value to logical name GAWKLOCALE unless it already has one
+$! [ -z "$GAWKLOCALE" ] && GAWKLOCALE=en_US.UTF-8
+$define_gawklocale:
+$	if f$search("sys$i18n_locale:utf8-50.locale") .nes. ""
+$	then
+$	    define/user LC_ALL "utf8-50"
+$	else
+$	    define/user LC_ALL "utf8-20"
+$	endif
+$	return
+$!
+$define_gawklocale_ja_jp:
+$!	@GAWKLOCALE=ja_JP.UTF-8 ; export GAWKLOCALE ; \
+$	if f$search("sys$i18n_locale:ja_jp_utf-8.locale") .nes. ""
+$	then
+$	    define/user LC_ALL "ja_JP_utf-8"
+$	else
+$	    write sys$output "Substituting UTF8-20 for ja_JP.UTF-8"
+$	    define/user LC_ALL "utf8-20"
+$	endif
+$	return
+$
+$! make sure that the specified file's longest-record-length field is set;
+$! otherwise DIFF will choke if any record is longer than 512 bytes
+$fixup_LRL: subroutine
+$	lrl = 0	!VMS V5.5-2 didn't support the LRL argument yet
+$	define/user sys$error _NL:
+$	define/user sys$output _NL:
+$	lrl = f$file_attribute(p1,"LRL")
+$	if lrl.eq.0 then  lrl = f$file_attribute(p1,"MRS")
+$	if lrl.eq.0
+$	then	convert/fdl=sys$input: 'p1' *.*
+file
+ organization sequential
+record
+ format stream_lf
+ size 32767
+$		if $status .and. p2.eqs."purge" then  rm 'p1';-1
+$	else	cmp _NL: _NL:	!deassign/user sys${error,output}
+$	endif
+$ endsubroutine !fixup_LRL
+$
+$! add a fake "EXIT CODE" record to the end of the temporary output file
+$! to simulate the ``|| echo EXIT CODE $$? >>_$@'' shell script usage
+$! Unix code = vms_code & (255 * 2^3) >> 3
+$exit_code: subroutine
+$	unix_status = (p1 .and. %x7f8) / 8
+$	if f$trnlnm("FTMP").nes."" then  close/noLog ftmp
+$	open/Append ftmp 'p2'
+$	write ftmp "EXIT CODE: ",'unix_status'
+$	close ftmp
+$ endsubroutine !exit_code
+$
+$!NOTREACHED
+$ exit
diff --git a/gawk-5.0.1/ylwrap b/gawk-5.0.1/ylwrap
new file mode 100755
index 00000000000..7c2d927f7f6
--- /dev/null
+++ b/gawk-5.0.1/ylwrap
@@ -0,0 +1,247 @@
+#! /bin/sh
+# ylwrap - wrapper for lex/yacc invocations.
+
+scriptversion=2013-01-12.17; # UTC
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+#
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+get_dirname ()
+{
+  case $1 in
+    */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
+    # Otherwise,  we want the empty string (not ".").
+  esac
+}
+
+# guard FILE
+# ----------
+# The CPP macro used to guard inclusion of FILE.
+guard ()
+{
+  printf '%s\n' "$1"                                                    \
+    | sed                                                               \
+        -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'   \
+        -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'                        \
+        -e 's/__*/_/g'
+}
+
+# quote_for_sed [STRING]
+# ----------------------
+# Return STRING (or stdin) quoted to be used as a sed pattern.
+quote_for_sed ()
+{
+  case $# in
+    0) cat;;
+    1) printf '%s\n' "$1";;
+  esac \
+    | sed -e 's|[][\\.*]|\\&|g'
+}
+
+case "$1" in
+  '')
+    echo "$0: No files given.  Try '$0 --help' for more information." 1>&2
+    exit 1
+    ;;
+  --basedir)
+    basedir=$2
+    shift 2
+    ;;
+  -h|--h*)
+    cat <<\EOF
+Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]...
+
+Wrapper for lex/yacc invocations, renaming files as desired.
+
+  INPUT is the input file
+  OUTPUT is one file PROG generates
+  DESIRED is the file we actually want instead of OUTPUT
+  PROGRAM is program to run
+  ARGS are passed to PROG
+
+Any number of OUTPUT,DESIRED pairs may be used.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v|--v*)
+    echo "ylwrap $scriptversion"
+    exit $?
+    ;;
+esac
+
+
+# The input.
+input=$1
+shift
+# We'll later need for a correct munging of "#line" directives.
+input_sub_rx=`get_dirname "$input" | quote_for_sed`
+case $input in
+  [\\/]* | ?:[\\/]*)
+    # Absolute path; do nothing.
+    ;;
+  *)
+    # Relative path.  Make it absolute.
+    input=`pwd`/$input
+    ;;
+esac
+input_rx=`get_dirname "$input" | quote_for_sed`
+
+# Since DOS filename conventions don't allow two dots,
+# the DOS version of Bison writes out y_tab.c instead of y.tab.c
+# and y_tab.h instead of y.tab.h. Test to see if this is the case.
+y_tab_nodot=false
+if test -f y_tab.c || test -f y_tab.h; then
+  y_tab_nodot=true
+fi
+
+# The parser itself, the first file, is the destination of the .y.c
+# rule in the Makefile.
+parser=$1
+
+# A sed program to s/FROM/TO/g for all the FROM/TO so that, for
+# instance, we rename #include "y.tab.h" into #include "parse.h"
+# during the conversion from y.tab.c to parse.c.
+sed_fix_filenames=
+
+# Also rename header guards, as Bison 2.7 for instance uses its header
+# guard in its implementation file.
+sed_fix_header_guards=
+
+while test $# -ne 0; do
+  if test x"$1" = x"--"; then
+    shift
+    break
+  fi
+  from=$1
+  # Handle y_tab.c and y_tab.h output by DOS
+  if $y_tab_nodot; then
+    case $from in
+      "y.tab.c") from=y_tab.c;;
+      "y.tab.h") from=y_tab.h;;
+    esac
+  fi
+  shift
+  to=$1
+  shift
+  sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"
+  sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"
+done
+
+# The program to run.
+prog=$1
+shift
+# Make any relative path in $prog absolute.
+case $prog in
+  [\\/]* | ?:[\\/]*) ;;
+  *[\\/]*) prog=`pwd`/$prog ;;
+esac
+
+dirname=ylwrap$$
+do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
+trap "ret=129; $do_exit" 1
+trap "ret=130; $do_exit" 2
+trap "ret=141; $do_exit" 13
+trap "ret=143; $do_exit" 15
+mkdir $dirname || exit 1
+
+cd $dirname
+
+case $# in
+  0) "$prog" "$input" ;;
+  *) "$prog" "$@" "$input" ;;
+esac
+ret=$?
+
+if test $ret -eq 0; then
+  for from in *
+  do
+    to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
+    if test -f "$from"; then
+      # If $2 is an absolute path name, then just use that,
+      # otherwise prepend '../'.
+      case $to in
+        [\\/]* | ?:[\\/]*) target=$to;;
+        *) target=../$to;;
+      esac
+
+      # Do not overwrite unchanged header files to avoid useless
+      # recompilations.  Always update the parser itself: it is the
+      # destination of the .y.c rule in the Makefile.  Divert the
+      # output of all other files to a temporary file so we can
+      # compare them to existing versions.
+      if test $from != $parser; then
+        realtarget=$target
+        target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'`
+      fi
+
+      # Munge "#line" or "#" directives.  Don't let the resulting
+      # debug information point at an absolute srcdir.  Use the real
+      # output file name, not yy.lex.c for instance.  Adjust the
+      # include guards too.
+      sed -e "/^#/!b"                           \
+          -e "s|$input_rx|$input_sub_rx|"       \
+          -e "$sed_fix_filenames"               \
+          -e "$sed_fix_header_guards"           \
+        "$from" >"$target" || ret=$?
+
+      # Check whether files must be updated.
+      if test "$from" != "$parser"; then
+        if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
+          echo "$to is unchanged"
+          rm -f "$target"
+        else
+          echo "updating $to"
+          mv -f "$target" "$realtarget"
+        fi
+      fi
+    else
+      # A missing file is only an error for the parser.  This is a
+      # blatant hack to let us support using "yacc -d".  If -d is not
+      # specified, don't fail when the header file is "missing".
+      if test "$from" = "$parser"; then
+        ret=1
+      fi
+    fi
+  done
+fi
+
+# Remove the directory.
+cd ..
+rm -rf $dirname
+
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
-- 
2.21.0

